From ddf52e2cdd977f14fc04035c88672ac204aec713 Mon Sep 17 00:00:00 2001 From: CYFS <2805686936@qq.com> Date: Fri, 31 Oct 2025 16:32:45 +0800 Subject: [PATCH 01/45] [log]Update V5.2.2 Released Changelog. --- ChangeLog.md | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 161bc1c0da..8504f9fb13 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,184 @@ +# RT-Thread v5.2.2 Released + +Change Log Since v5.2.1 Release. + +## Kernel + +* Fix scheduling exception caused by interrupt preemption in rt_schedule.[(#10715)](https://github.com/RT-Thread/rt-thread/pull/10715) +* Fix the legacy issue related to the length of the object name version.[(#10537)](https://github.com/RT-Thread/rt-thread/pull/10537) +* Fixed buffer overflow vulnerability in object.[(#10523)](https://github.com/RT-Thread/rt-thread/pull/10523) +* Add up scheduler critical switch flag.[(#10581)](https://github.com/RT-Thread/rt-thread/pull/10581) +* Update the default value of RT_NAME_MAX to 12.[(#10839)](https://github.com/RT-Thread/rt-thread/pull/10839) +* Feat the rt_scheduler lock nest uses atomic operations.[(#10621)](https://github.com/RT-Thread/rt-thread/pull/10621) + +## Components + +* **Drivers** + * **Serial:** + * serial_v1 + * Fix correct data loss logic when RX ring buffer is full. + * serial_v2 + * Fix the bug of RX flush under DMA. + * Add serial V2 buffer configuration via Kconfig. + * Feat optimize serial v2. [(#10603)](https://github.com/RT-Thread/rt-thread/pull/10603) + * Feat modify the default configuration of the RT_SERIAL_CONFIG_DEFAULT structure to support parameters in the absence of DMA configuration. + * **RTC:** + * Add the alarm using local time for calculation. + * **CAN:** + * Fixed the issue where the thread calling CAN int TX was suspended when CAN at the bottom layer failed to work. + * Feat: Implement non-blocking send mechanism and enhance CAN driver functionality. + * **SPI:** + * Add SPI device detach function.[(#10733)](https://github.com/RT-Thread/rt-thread/pull/10733) + * Update and fix up the SPI. + * **ADC:** + * Fixed cppcheck error. + * Remove build warnings. + * **ktime:** + * Remove unused rt_ktime_hrtimer_getcnt for hrtimer. + * **wlan:** + * Update SECURITY_UNKNOWN value. +* **LWP** + * Fix potential signal handler infinite loop for riscv. + * Feat: Restore TP register in arch_thread_signal_enter to fix user-mode memory access. +* **Libc** + * Add comments for some pthread functions. + * pthreads: Fix pthread_cond_timedwait lacks timeout wakeup. + * ensure compatibility with newlib <3.4.0 by handling removed __sdidinit. [(#10791)](https://github.com/RT-Thread/rt-thread/pull/10791) +* **DFS** + * **DFS v2**: + * Fix bugs for function _get_parent_path(). [(#10539)](https://github.com/RT-Thread/rt-thread/pull/10539) +* **Net** + * **SAL/Socket:** + * Fixed CI compilation failure in sal/src/sal_socket.c. + * Fix memory leak when sal_socket failed. + * improve the error return of sal. + * **Netdev:** + * Fixed compilation errors when enabling IPv6 and IPv4 dual-stack support. + * Fixed netdev_unregister missing correct return value. [(#10693)](https://github.com/RT-Thread/rt-thread/pull/10693) + * Expose netdev_set_dns and netdev_set_if. [(#10128)](https://github.com/RT-Thread/rt-thread/pull/10128) + * **AT:** + * at_client add deInit port. [(#10598)](https://github.com/RT-Thread/rt-thread/pull/10598) +* **Finsh:** + + * Fixed clear out the useless copy operations. [(#10699)](https://github.com/RT-Thread/rt-thread/pull/10699) + * Feat add support for the Home, Insert, Delete and End keys, and improve input mode processing.[(#10595)](https://github.com/RT-Thread/rt-thread/pull/10595) + * Feat: Add new features (delete by word, switch cursor, etc.). +* **USB:** + * Update (cherryusb): update to v1.5.1. + * Fixed several issues related to cherryusb.[(#10844)](https://github.com/RT-Thread/rt-thread/pull/10844) +* **Ulog:** + * Fix:filter should not be associated with ULOG_USING_COLOR and ULOG_USING_SYSLOG configurations. +* **IPC:** + * Pass rt_tick_t for RT_TIMER_CTRL_SET_TIME and RT_TIMER_CTRL_GET_TIME.[(#10717)](https://github.com/RT-Thread/rt-thread/pull/10717) + +## DM + +* NVME: fix up the QUEUE alloc error no check. +* Thermal: Fix up the C99, 6.8.1 Labeled statements p4; Fix up the PWM-FAN remove handle data ptr. +* PCI: Add SoC PCI Kconfig import; Multiple PCI-related fixes; Fix and optimize interrupt-related issues. +* WDT: Support related to Intel 6300ESB/Synopsys Watchdog, etc. + +## Libcpu + +* **AArch64:** + * Fix up MMU and linker warning. + * Fix rt_aspace_init error when KERNEL_VADDR_START >= 0x80000000. + * Add the configuration of libcpu/aarch64 KERNEL ASPACE START. + * Update Hypercall API. + * Remove unused rt_hw_set_gtimer_frq. +* **Cortex-M33:** + * Fix the M33 assembly syntax errors and fix the compilation error of BSP. + * Added HardFault_Handler to save floating point registers. +* **Cortex-M4:** + * Fixed compilation error. + * Added HardFault_Handler to save floating point registers. + +* **Cortex-M3:** + * The parameter passed to the unified rt_exception_hook is exception_stack. [(#10619)](https://github.com/RT-Thread/rt-thread/pull/10619) +* **RISC-V:** + * Fix type mismatch of `_query`. + * Fix the support for RV32E. RV32E does not support the s2 register. Modify it to the s1 register. + * Use volatile RW for claim and complete. + * Add spaces to fix `Wliteral-suffix`. + * Add comment for the round down of symb_pc. + * Remove `rt_hw_cpu_id` in `cpuport.h` to fix error. + +## Tools + +* Add support for package.json, refactor BuildPackage function to handle new format. +* Add documents for tools script; Add NG for tools. [(#10572)](https://github.com/RT-Thread/rt-thread/pull/10572) +* Add workspace generation for RT-Thread root directory. +* Add vsc_workspace target in scons. +* Add DTC (Devicetree Compiler) tools. +* Add clang-format formatting script for CI. +* Optimize the file opening method. +* Clang format ignore migration. +* Improve[clang-format]: optimize the formatting logic for RT-Thread coding standard. + +## Action + +* Fixed CI: ARDUINO_ADAFRUIT_SENSORLAB compilation failure issue. +* Fixed CI compilation failure in sal/src/sal_socket.c.[(#10854)](https://github.com/RT-Thread/rt-thread/pull/10854) +* Merge same tag with different paths, remove Path display from CI comment. +* Add Copilot review title keywords. +* Add concurrency control to GitHub Actions. [(#10761)](https://github.com/RT-Thread/rt-thread/pull/10761) +* integrate utest run ci. [(#10748)](https://github.com/RT-Thread/rt-thread/pull/10748) +* Improve the comment instructions for the PR format bot.[(#10747)](https://github.com/RT-Thread/rt-thread/pull/10747) + +## Documents + +* **Doxygen:** + * Fix some document issues. + * Update naming rule for utest-case. + * Update doc for env to latest. + * Update some document content. + * Group name all in lowercase. [(#10530)](https://github.com/RT-Thread/rt-thread/pull/10530) + * Grouping and page optimization related to device driver. + * use layout to control the HTML display. + * Add doxygen comments for scheduler. [(#10366)](https://github.com/RT-Thread/rt-thread/pull/10366) and lwp + * update doxygen version to v1.9.8 . + +## Utest + +* Add netdev/lwip/filesystem/memory pool/SAL/system performance API test case. +* Support autocomplete of utest cases for `utest_run`. [(#10701)](https://github.com/RT-Thread/rt-thread/pull/10701) +* Feat:reorganize utest menu. +* Feat:rename files and update naming according to new rule. +* Feat:reorganize utest framework structure (initial version). +* Feat:unify config name. [(#10808)](https://github.com/RT-Thread/rt-thread/pull/10808) +* Feat:integrate test cases into utest framework. [(#10665)](https://github.com/RT-Thread/rt-thread/pull/10665) +* Move driver-related test cases under `drivers`. +* Move and enhance C++ test cases. + +## BSP + +* Some driver issues have been resolved and some driver support has been added. + +* **Added/Updated BSPs:** + + * **xuantie:** + * E901 + + * **Renesas:** + * ek-ra6e2 + * ek-ra4e2 + * ek-ra2a1 + * ek-ra2e2 + * ek-ra4m1 + * **GD32:** + * gd32h759i-eval + * gd32470i-eval + * gd32e230-lckfb + * **NXP:** + * MCX E247 + * FRDM-MCXE247 + * FRDM-MCXA346 + * **HPMicro:** + * hpm6p00evk + * hpm5e00evk + * **Phytium** + * **Raspberry RP2350** + # RT-Thread v5.2.1 Released Change Log Since v5.2.0 Release -- Gitee From 931045879d7930f3741cb482ea94b9117eeec7e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E9=B8=BF=E8=B6=85?= <13010364+shi-hongchao@user.noreply.gitee.com> Date: Wed, 10 Dec 2025 11:16:37 +0800 Subject: [PATCH 02/45] =?UTF-8?q?feat(bsp/gd32):=20=E5=A2=9E=E5=8A=A0GDF0R?= =?UTF-8?q?G=E8=8A=AF=E7=89=87BSP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/gd32/arm/gd32405rg/.config | 1457 ++++++++ bsp/gd32/arm/gd32405rg/.gitignore | 3 + bsp/gd32/arm/gd32405rg/Kconfig | 12 + bsp/gd32/arm/gd32405rg/README.md | 107 + .../arm/gd32405rg/README_assets/image.png | Bin 0 -> 96755 bytes .../gd32405rg/RTE/_rt-thread/RTE_Components.h | 20 + bsp/gd32/arm/gd32405rg/SConscript | 15 + bsp/gd32/arm/gd32405rg/SConstruct | 77 + .../arm/gd32405rg/applications/SConscript | 15 + bsp/gd32/arm/gd32405rg/applications/main.c | 35 + bsp/gd32/arm/gd32405rg/board/Kconfig | 354 ++ bsp/gd32/arm/gd32405rg/board/SConscript | 17 + bsp/gd32/arm/gd32405rg/board/board.c | 173 + bsp/gd32/arm/gd32405rg/board/board.h | 47 + .../arm/gd32405rg/board/gd32f4xx_libopt.h | 45 + .../gd32405rg/board/linker_scripts/link.icf | 40 + .../gd32405rg/board/linker_scripts/link.ld | 143 + .../gd32405rg/board/linker_scripts/link.sct | 18 + bsp/gd32/arm/gd32405rg/figures/board.jpg | Bin 0 -> 98061 bytes bsp/gd32/arm/gd32405rg/project.ewd | 3056 +++++++++++++++++ bsp/gd32/arm/gd32405rg/project.ewp | 2196 ++++++++++++ bsp/gd32/arm/gd32405rg/project.ewt | 3040 ++++++++++++++++ bsp/gd32/arm/gd32405rg/project.eww | 10 + bsp/gd32/arm/gd32405rg/project.uvoptx | 1075 ++++++ bsp/gd32/arm/gd32405rg/project.uvproj | 1270 +++++++ bsp/gd32/arm/gd32405rg/project.uvprojx | 2319 +++++++++++++ bsp/gd32/arm/gd32405rg/rtconfig.h | 430 +++ bsp/gd32/arm/gd32405rg/rtconfig.py | 151 + bsp/gd32/arm/gd32405rg/template.ewp | 1889 ++++++++++ bsp/gd32/arm/gd32405rg/template.uvoptx | 185 + bsp/gd32/arm/gd32405rg/template.uvproj | 628 ++++ bsp/gd32/arm/gd32405rg/template.uvprojx | 414 +++ 32 files changed, 19241 insertions(+) create mode 100644 bsp/gd32/arm/gd32405rg/.config create mode 100644 bsp/gd32/arm/gd32405rg/.gitignore create mode 100644 bsp/gd32/arm/gd32405rg/Kconfig create mode 100644 bsp/gd32/arm/gd32405rg/README.md create mode 100644 bsp/gd32/arm/gd32405rg/README_assets/image.png create mode 100644 bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h create mode 100644 bsp/gd32/arm/gd32405rg/SConscript create mode 100644 bsp/gd32/arm/gd32405rg/SConstruct create mode 100644 bsp/gd32/arm/gd32405rg/applications/SConscript create mode 100644 bsp/gd32/arm/gd32405rg/applications/main.c create mode 100644 bsp/gd32/arm/gd32405rg/board/Kconfig create mode 100644 bsp/gd32/arm/gd32405rg/board/SConscript create mode 100644 bsp/gd32/arm/gd32405rg/board/board.c create mode 100644 bsp/gd32/arm/gd32405rg/board/board.h create mode 100644 bsp/gd32/arm/gd32405rg/board/gd32f4xx_libopt.h create mode 100644 bsp/gd32/arm/gd32405rg/board/linker_scripts/link.icf create mode 100644 bsp/gd32/arm/gd32405rg/board/linker_scripts/link.ld create mode 100644 bsp/gd32/arm/gd32405rg/board/linker_scripts/link.sct create mode 100644 bsp/gd32/arm/gd32405rg/figures/board.jpg create mode 100644 bsp/gd32/arm/gd32405rg/project.ewd create mode 100644 bsp/gd32/arm/gd32405rg/project.ewp create mode 100644 bsp/gd32/arm/gd32405rg/project.ewt create mode 100644 bsp/gd32/arm/gd32405rg/project.eww create mode 100644 bsp/gd32/arm/gd32405rg/project.uvoptx create mode 100644 bsp/gd32/arm/gd32405rg/project.uvproj create mode 100644 bsp/gd32/arm/gd32405rg/project.uvprojx create mode 100644 bsp/gd32/arm/gd32405rg/rtconfig.h create mode 100644 bsp/gd32/arm/gd32405rg/rtconfig.py create mode 100644 bsp/gd32/arm/gd32405rg/template.ewp create mode 100644 bsp/gd32/arm/gd32405rg/template.uvoptx create mode 100644 bsp/gd32/arm/gd32405rg/template.uvproj create mode 100644 bsp/gd32/arm/gd32405rg/template.uvprojx diff --git a/bsp/gd32/arm/gd32405rg/.config b/bsp/gd32/arm/gd32405rg/.config new file mode 100644 index 0000000000..c74192943e --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/.config @@ -0,0 +1,1457 @@ + +# +# RT-Thread Kernel +# + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options +# end of klibc options + +CONFIG_RT_NAME_MAX=12 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_AMP is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_CPUS_NR=1 +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +# CONFIG_RT_USING_HOOKLIST is not set +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set + +# +# kservice options +# +# CONFIG_RT_USING_TINY_FFS is not set +# end of kservice options + +CONFIG_RT_USING_DEBUG=y +CONFIG_RT_DEBUGING_ASSERT=y +CONFIG_RT_DEBUGING_COLOR=y +CONFIG_RT_DEBUGING_CONTEXT=y +# CONFIG_RT_DEBUGING_AUTO_INIT is not set +# CONFIG_RT_USING_CI_ACTION is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set +# CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y +# end of Memory Management + +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +# CONFIG_RT_USING_THREADSAFE_PRINTF is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" +CONFIG_RT_VER_NUM=0x50201 +# CONFIG_RT_USING_STDC_ATOMIC is not set +CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 +# end of RT-Thread Kernel + +CONFIG_RT_USING_HW_ATOMIC=y +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M4=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +# CONFIG_FINSH_USING_WORD_OPERATION is not set +# CONFIG_FINSH_USING_FUNC_EXT is not set +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_FINSH_USING_OPTION_COMPLETION=y + +# +# DFS: device virtual file system +# +# CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +CONFIG_RT_USING_SYSTEM_WORKQUEUE=y +CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 +CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_SERIAL_BYPASS is not set +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_I2C=y +# CONFIG_RT_I2C_DEBUG is not set +CONFIG_RT_USING_I2C_BITOPS=y +# CONFIG_RT_I2C_BITOPS_DEBUG is not set +# CONFIG_RT_USING_SOFT_I2C is not set +# CONFIG_RT_USING_PHY is not set +# CONFIG_RT_USING_PHY_V2 is not set +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set +# CONFIG_RT_USING_VIRTIO is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_KTIME is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers + +# +# C/C++ and POSIX layer +# + +# +# ISO-ANSI C layer +# + +# +# Timezone and Daylight Saving Time +# +# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set +CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y +CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 +CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 +CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + +# CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set +# end of Network + +# +# Memory protection +# +# CONFIG_RT_USING_MEM_PROTECTION is not set +# CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RESOURCE_ID is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + +# CONFIG_RT_USING_VBUS is not set + +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# end of RT-Thread Components + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set +# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set +# CONFIG_PKG_USING_ESP_HOSTED is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + +# CONFIG_PKG_USING_RW007 is not set + +# +# CYW43012 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi + +# +# BL808 WiFi +# +# CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi + +# +# CYW43439 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_BT_CYW43012 is not set +# CONFIG_PKG_USING_CYW43XX is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set +# CONFIG_PKG_USING_ZEPHYR_POLLING is not set +# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set +# CONFIG_PKG_USING_LHC_MODBUS is not set +# CONFIG_PKG_USING_QMODBUS is not set +# CONFIG_PKG_USING_PNET is not set +# CONFIG_PKG_USING_OPENER is not set +# CONFIG_PKG_USING_FREEMQTT is not set +# end of IoT - internet of things + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set +# CONFIG_PKG_USING_RYAN_JSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_PERSIMMON is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_MCOREDUMP is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set +# CONFIG_PKG_USING_RT_TRACE is not set +# CONFIG_PKG_USING_ZDEBUG is not set +# CONFIG_PKG_USING_RVBACKTRACE is not set +# CONFIG_PKG_USING_HPATCHLITE is not set +# CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set +# end of tools packages + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# end of enhanced kernel services + +# CONFIG_PKG_USING_AUNITY is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_CORE is not set +# CONFIG_PKG_USING_CMSIS_NN is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_LITEOS_SDK is not set +# CONFIG_PKG_USING_TZ_DATABASE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FILEX is not set +# CONFIG_PKG_USING_LEVELX is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_RPMSG_LITE is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set +# CONFIG_PKG_USING_MLIBC is not set +# CONFIG_PKG_USING_TASK_MSG_BUS is not set +# CONFIG_PKG_USING_UART_FRAMEWORK is not set +# CONFIG_PKG_USING_SFDB is not set +# CONFIG_PKG_USING_RTP is not set +# CONFIG_PKG_USING_REB is not set +# CONFIG_PKG_USING_RMP is not set +# CONFIG_PKG_USING_R_RHEALSTONE is not set +# CONFIG_PKG_USING_HEARTBEAT is not set +# CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set +# end of system packages + +# +# peripheral libraries and drivers +# + +# +# HAL & SDK Drivers +# + +# +# STM32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_STM32F0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F1_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F1_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F2_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F2_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F3_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F3_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F7_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F7_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32G0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32G0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32G4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32G4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H7_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H7_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H7RS_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H7RS_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32U5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32U5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_STM32WL_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32WL_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set +# end of STM32 HAL & SDK Drivers + +# +# Infineon HAL Packages +# +# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set +# CONFIG_PKG_USING_INFINEON_CMSIS is not set +# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set +# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set +# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set +# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set +# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set +# CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_ESP_IDF is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_MM32 is not set + +# +# WCH HAL & SDK Drivers +# +# CONFIG_PKG_USING_CH32V20x_SDK is not set +# CONFIG_PKG_USING_CH32V307_SDK is not set +# end of WCH HAL & SDK Drivers + +# +# AT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_AT32A403A_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32A403A_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32A423_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32A423_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F45x_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F45x_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F402_405_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F402_405_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F403A_407_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F403A_407_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F413_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F413_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F415_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F415_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F421_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F421_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F423_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F423_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F425_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F425_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F435_437_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F435_437_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32M412_416_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32M412_416_CMSIS_DRIVER is not set +# end of AT32 HAL & SDK Drivers + +# +# HC32 DDL Drivers +# +# CONFIG_PKG_USING_HC32F3_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_HC32F3_SERIES_DRIVER is not set +# CONFIG_PKG_USING_HC32F4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_HC32F4_SERIES_DRIVER is not set +# end of HC32 DDL Drivers + +# +# NXP HAL & SDK Drivers +# +# CONFIG_PKG_USING_NXP_MCX_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_NXP_MCX_SERIES_DRIVER is not set +# CONFIG_PKG_USING_NXP_LPC_DRIVER is not set +# CONFIG_PKG_USING_NXP_LPC55S_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMX6SX_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMX6UL_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMXRT_DRIVER is not set +# end of NXP HAL & SDK Drivers + +# +# NUVOTON Drivers +# +# CONFIG_PKG_USING_NUVOTON_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_NUVOTON_SERIES_DRIVER is not set +# CONFIG_PKG_USING_NUVOTON_ARM926_LIB is not set +# end of NUVOTON Drivers + +# +# GD32 Drivers +# +CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER=y +CONFIG_PKG_GD32_ARM_CMSIS_DRIVER_PATH="/packages/peripherals/hal-sdk/gd32/gd32-arm-cmsis" +CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER_LATEST_VERSION=y +CONFIG_PKG_GD32_ARM_CMSIS_DRIVER_VER="latest" +CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER=y +CONFIG_PKG_GD32_ARM_SERIES_DRIVER_PATH="/packages/peripherals/hal-sdk/gd32/gd32-arm-series" +CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER_LATEST_VERSION=y +CONFIG_PKG_GD32_ARM_SERIES_DRIVER_VER="latest" +# end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK +# end of HAL & SDK Drivers + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_MAX31855 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_MLX90382 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_SHT4X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set +# CONFIG_PKG_USING_P3T1755 is not set +# CONFIG_PKG_USING_QMI8658 is not set +# CONFIG_PKG_USING_ICM20948 is not set +# end of sensors drivers + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_CST816X is not set +# CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_ILI9341 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_AIP650 is not set +# CONFIG_PKG_USING_FINGERPRINT is not set +# CONFIG_PKG_USING_BT_ECB02C is not set +# CONFIG_PKG_USING_UAT is not set +# CONFIG_PKG_USING_ST7789 is not set +# CONFIG_PKG_USING_VS1003 is not set +# CONFIG_PKG_USING_X9555 is not set +# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set +# CONFIG_PKG_USING_BT_MX01 is not set +# CONFIG_PKG_USING_RGPOWER is not set +# CONFIG_PKG_USING_BT_MX02 is not set +# CONFIG_PKG_USING_GC9A01 is not set +# CONFIG_PKG_USING_IK485 is not set +# CONFIG_PKG_USING_SERVO is not set +# CONFIG_PKG_USING_SEAN_WS2812B is not set +# CONFIG_PKG_USING_IC74HC165 is not set +# CONFIG_PKG_USING_IST8310 is not set +# CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set +# CONFIG_PKG_USING_R_TINYMAIX is not set +# CONFIG_PKG_USING_LLMCHAT is not set +# end of AI packages + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_APID is not set +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_QPID is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_KISSFFT is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set +# end of Signal Processing and Control Algorithm Packages + +# +# miscellaneous packages +# + +# +# project laboratory +# +# end of project laboratory + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_RALARAM is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LIBCRC 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 +# CONFIG_PKG_USING_DRMP is not set +# end of miscellaneous packages + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects and Demos +# +# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_RTDUINO_SENSORFUSION_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set +# CONFIG_PKG_USING_ARDUINO_TICKER is not set +# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set +# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set +# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO + +# +# Uncategorized +# +# end of Arduino libraries +# end of RT-Thread online packages + +CONFIG_SOC_FAMILY_GD32=y +CONFIG_SOC_SERIES_GD32F4xx=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_GD32405RG=y + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART0=y +# CONFIG_BSP_UART0_RX_USING_DMA is not set +# CONFIG_BSP_UART0_TX_USING_DMA is not set +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_UART4 is not set +# CONFIG_BSP_USING_UART5 is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_TIM is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_SDIO is not set +# CONFIG_BSP_USING_USBD is not set +# CONFIG_BSP_USING_USBH is not set +CONFIG_BSP_USING_GD_DBG=y +# end of On-chip Peripheral Drivers + +# +# Board extended module Drivers +# +# end of Hardware Drivers Config diff --git a/bsp/gd32/arm/gd32405rg/.gitignore b/bsp/gd32/arm/gd32405rg/.gitignore new file mode 100644 index 0000000000..afea5775a7 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/.gitignore @@ -0,0 +1,3 @@ +compile_commands* +*.uvguix.* +EventRecorderStub.* diff --git a/bsp/gd32/arm/gd32405rg/Kconfig b/bsp/gd32/arm/gd32405rg/Kconfig new file mode 100644 index 0000000000..07edfefc34 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/gd32/arm/gd32405rg/README.md b/bsp/gd32/arm/gd32405rg/README.md new file mode 100644 index 0000000000..c131b286a9 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/README.md @@ -0,0 +1,107 @@ +# GD32405RG BSP说明 + +## 简介 + +GD32405RG是-兆易创新推出的一款GD32F4XX系列的MCU,最高主频高达168M。参考GD32F407V-START开发板BSP + +开发板外观如下图所示(仅芯片,没有开发板图片,下图为GD32407V-START开发板): + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- GD32405RGT6,主频 168MHz,1024KB FLASH ,128KB RAM + 64KB TCMRAM (其他F4 BSP的RAM存在问题,实际的RAM布局应该像我这样) + ![memrey map](README_assets/image.png) + +- 常用接口:USB 接口 + +- 调试接口:DAP-LINK + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **片上外设** | **支持情况** | **备注** | +| :----------- | :----------: | :------------------------------ | +| GPIO | 支持 | PA0, PA1... ---> PIN: 0, 1...81 | +| UART | 支持 | UART0 - UART5 | +| I2C | 支持 | I2C1 | +| SPI | 支持 | SPI0 -  SPI2 | +| SPI FLASH | 支持 | | +| ADC | 支持 | ADC0 - ADC2 | +| **扩展模块** | **支持情况** | **备注** | +| 暂无 | 暂不支持 | 暂不支持 | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + +### 快速上手 + +本 BSP 为开发者提供 MDK5 工程,并且支持 GCC 开发环境,也可使用RT-Thread Studio开发,IAR/MDK4未做修改,如果您使用IAR/MDK4需要做一些简单修改。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,使用USB转TTL模块连接PA2(MCU TX)和PA3(MCU RX),打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 DAP-Link 仿真器下载程序,在通过 DAP-Link 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,LED 闪烁。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.4 build Jan 9 2021 + 2006 - 2021 Copyright by rt-thread team +msh > +``` + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口0的功能,如果需使用高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk5` 命令重新生成工程,或者使用Scons构建 + +## 注意事项 + +1. 该BSP使用的外部高速时钟为8MHz,PLL倍频到200MHz,请根据实际情况进行时钟配置。 + board/SConscript中,请根据实际情况修改HXTAL_VALUE: + ```python + CPPDEFINES = ['GD32F405', 'HXTAL_VALUE=8000000U'] + ``` + board/board.c中,根据实际情况修改`system_clock_8M_200M`实现: + ```c + void rt_hw_board_init() + { + /* config system clock HSE 8M to 200M */ + system_clock_8M_200M(); + + ``` + +## 联系人信息 + +维护人: + +- [ShiHongchao](https://gitee.com/shi-hongchao), 邮箱: 或者 diff --git a/bsp/gd32/arm/gd32405rg/README_assets/image.png b/bsp/gd32/arm/gd32405rg/README_assets/image.png new file mode 100644 index 0000000000000000000000000000000000000000..ecafcce5ee48d6db1864c9dbb1e80614e56a68ad GIT binary patch literal 96755 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

izs*W#q;L`LYJ1Dw6rvirj#x&EUZqlvU=@C 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"#*~7dH zFr`d_XIuEW+S_2uVK}6vU?%3lBuh#N-rJTdyfra#>NSuwVTyL-o`+Dkj4~RzMeGxg z;W-7`W>fLR1~)|cje6tovyiu0b@pw0bF*~zRnl4^jA5lnb$O=Ogib~-vAs7jx2#oQ zsw+!4BR{?aya*Ppj{C+ph0R7sLjpIfgOA>rwcp^I1XMrL{?2rO~b>(Wv5=My?}UY;L8_P zmzqMg>r(pR0I@=5#~r6+_(t9#uAr9Au@XBQ{%0s1O&Aaf;xvg2d^36m#Utz(kqQa) z=#4Uvpmf*fqOydP;1V8%EU>?9{tf^+-AsT#^ov=lCJyEb7L6gz?84%MVFf{F4f16t zZWQ(voX&r~qAv|nqV>G2$CB!H(gP#mh*^*m;R}@Aat}GcVE7tZ7WjgBS?9dznrz1- zCLwfiu^}UVLkI%oy$)&v&VG=VO+j7fsd$yqk{$~w_nUqrCWd4VZVlh1q=`*h`b=lV134|5&QI|f%meyGJ=QeC)y?zc?dHIa){V%PD+xh>{ddx4fmHFuS zxV{URWGykT9`0bh+t(2H>tto)4Q|IgCY?K<5TweawM1!muH%cGT8-O$B$F+9lkh+a zpZDmXrFZ&+WHqHZ$D$TY(v_TEk%gY~;LNiE( zPC~D0Zfjs-!~R&46^l$_=gFY19~-`ZTsg$P>%2Iu(W6JE;$#g3vj|q~imc!nh1i!x Y;|}tL{22;}TZMmio9s2dM|O?;A2nT-%m4rY literal 0 HcmV?d00001 diff --git a/bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h b/bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h new file mode 100644 index 0000000000..29cf3e0e73 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h @@ -0,0 +1,20 @@ +/* + * UVISION generated file: DO NOT EDIT! + * Generated by: uVision version 5.42.0.0 + * + * Project: 'template' + * Target: 'rt-thread' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +/* + * Define the Device Header File: + */ +#define CMSIS_device_header "gd32f4xx.h" + + + +#endif /* RTE_COMPONENTS_H */ diff --git a/bsp/gd32/arm/gd32405rg/SConscript b/bsp/gd32/arm/gd32405rg/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/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/gd32/arm/gd32405rg/SConstruct b/bsp/gd32/arm/gd32405rg/SConstruct new file mode 100644 index 0000000000..72997f103f --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/SConstruct @@ -0,0 +1,77 @@ +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) + +def bsp_pkg_check(): + import subprocess + + check_paths = [ + os.path.join("packages", "gd32-arm-cmsis-latest"), + os.path.join("packages", "gd32-arm-series-latest") + ] + + need_update = not all(os.path.exists(p) for p in check_paths) + + if need_update: + print("\n===============================================================================") + print("Dependency packages missing, please running 'pkgs --update'...") + print("If no packages are fetched, run 'pkgs --upgrade' first, then 'pkgs --update'...") + print("===============================================================================") + exit(1) + +RegisterPreBuildingAction(bsp_pkg_check) + +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 $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map') + +Export('env') +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) + +# include drivers with specific build directory +drivers_objs = SConscript(os.path.join(libraries_path_prefix, 'gd32_drivers', 'SConscript'), + variant_dir='build/libraries/gd32_drivers', + duplicate=0) +objs.extend(drivers_objs) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/gd32/arm/gd32405rg/applications/SConscript b/bsp/gd32/arm/gd32405rg/applications/SConscript new file mode 100644 index 0000000000..9bb9abae89 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/applications/SConscript @@ -0,0 +1,15 @@ +from building import * +import os + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/bsp/gd32/arm/gd32405rg/applications/main.c b/bsp/gd32/arm/gd32405rg/applications/main.c new file mode 100644 index 0000000000..73777282de --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/applications/main.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-20 BruceOu first implementation + */ + +#include +#include +#include +#include + +/* defined the LED2 pin: PB5 */ +#define LED2_PIN GET_PIN(B, 5) + +int main(void) +{ + int count = 1; + + /* set LED2 pin mode to output */ + rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED2_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED2_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/gd32/arm/gd32405rg/board/Kconfig b/bsp/gd32/arm/gd32405rg/board/Kconfig new file mode 100644 index 0000000000..f62e148f3c --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/Kconfig @@ -0,0 +1,354 @@ +menu "Hardware Drivers Config" + +config SOC_SERIES_GD32F4xx + bool + default y + +config SOC_GD32405RG + bool + select SOC_SERIES_GD32F4xx + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "Onboard Peripheral Drivers" + +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_UART0 + bool "Enable UART0" + default n + + config BSP_UART0_RX_USING_DMA + bool "Enable UART0 RX DMA" + depends on BSP_USING_UART0 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART0_TX_USING_DMA + bool "Enable UART0 TX DMA" + depends on BSP_USING_UART0 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART0_RX_BUFSIZE + int "Set UART0 RX buffer size" + range 64 65535 + depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART0_TX_BUFSIZE + int "Set UART0 TX buffer size" + range 0 65535 + depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART0_DMA_PING_BUFSIZE + int "Set UART0 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART0_RX_USING_DMA + default 32 + + config BSP_USING_UART1 + bool "Enable UART1" + default y + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART1_TX_USING_DMA + bool "Enable UART1 TX DMA" + depends on BSP_USING_UART1 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART1_RX_BUFSIZE + int "Set UART1 RX buffer size" + range 64 65535 + depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART1_TX_BUFSIZE + int "Set UART1 TX buffer size" + range 0 65535 + depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART1_DMA_PING_BUFSIZE + int "Set UART1 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA + default 32 + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART2_TX_USING_DMA + bool "Enable UART2 TX DMA" + depends on BSP_USING_UART2 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART2_RX_BUFSIZE + int "Set UART2 RX buffer size" + range 64 65535 + depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART2_TX_BUFSIZE + int "Set UART2 TX buffer size" + range 0 65535 + depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART2_DMA_PING_BUFSIZE + int "Set UART2 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA + default 32 + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART3_TX_USING_DMA + bool "Enable UART3 TX DMA" + depends on BSP_USING_UART3 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART3_RX_BUFSIZE + int "Set UART3 RX buffer size" + range 64 65535 + depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART3_TX_BUFSIZE + int "Set UART3 TX buffer size" + range 0 65535 + depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART3_DMA_PING_BUFSIZE + int "Set UART3 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA + default 32 + + config BSP_USING_UART4 + bool "Enable UART4" + default n + + config BSP_UART4_RX_USING_DMA + bool "Enable UART4 RX DMA" + depends on BSP_USING_UART4 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART4_TX_USING_DMA + bool "Enable UART4 TX DMA" + depends on BSP_USING_UART4 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART4_RX_BUFSIZE + int "Set UART4 RX buffer size" + range 64 65535 + depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART4_TX_BUFSIZE + int "Set UART4 TX buffer size" + range 0 65535 + depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART4_DMA_PING_BUFSIZE + int "Set UART4 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA + default 32 + + config BSP_USING_UART5 + bool "Enable UART5" + default n + + config BSP_UART5_RX_USING_DMA + bool "Enable UART5 RX DMA" + depends on BSP_USING_UART5 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART5_TX_USING_DMA + bool "Enable UART5 TX DMA" + depends on BSP_USING_UART5 + select RT_SERIAL_USING_DMA + default n + + config BSP_UART5_RX_BUFSIZE + int "Set UART5 RX buffer size" + range 64 65535 + depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 + default 64 + + config BSP_UART5_TX_BUFSIZE + int "Set UART5 TX buffer size" + range 0 65535 + depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 + default 0 + + config BSP_UART5_DMA_PING_BUFSIZE + int "Set UART5 RX DMA ping-pong buffer size" + range 32 65535 + depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA + default 32 + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC0 + bool "Enable ADC0" + default n + + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + + config BSP_USING_ADC2 + bool "Enable ADC2" + default n + endif + + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM10 + bool "Enable TIM10" + default n + + config BSP_USING_TIM11 + bool "Enable TIM11" + default n + + config BSP_USING_TIM12 + bool "Enable TIM13" + default n + endif + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + if BSP_USING_ONCHIP_RTC + config BSP_USING_ALARM + bool "Enable RTC alarm" + select RT_USING_ALARM + default n + if BSP_USING_ALARM + choice + prompt "Select rtc alarm device" + default BSP_USING_ALARM0 + + config BSP_USING_ALARM0 + bool "Enable RTC Alarm0" + + config BSP_USING_ALARM1 + bool "Enable RTC Alarm1" + endchoice + endif + endif + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + + config BSP_USING_SDIO + bool "Enable SDIO" + select RT_USING_SDIO + select RT_USING_DFS + default n + + config BSP_USING_USBD + bool "Enable USB Device" + select RT_USING_USB_DEVICE + default n + + menuconfig BSP_USING_USBH + bool "Enable USB Host" + select RT_USING_USB_HOST + default n + if BSP_USING_USBH + menuconfig RT_USBH_MSTORAGE + bool "Enable Udisk Drivers" + default n + if RT_USBH_MSTORAGE + config UDISK_MOUNTPOINT + string "Udisk mount dir" + default "/" + endif + endif + + source "$(BSP_DIR)/../libraries/gd32_drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/gd32/arm/gd32405rg/board/SConscript b/bsp/gd32/arm/gd32405rg/board/SConscript new file mode 100644 index 0000000000..409d6be0ae --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/SConscript @@ -0,0 +1,17 @@ +import os +import rtconfig +from building import * + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +''') + +path = [cwd] + +CPPDEFINES = ['GD32F405', 'HXTAL_VALUE=8000000U'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/gd32/arm/gd32405rg/board/board.c b/bsp/gd32/arm/gd32405rg/board/board.c new file mode 100644 index 0000000000..54923688ab --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/board.c @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-20 BruceOu first implementation + * 2024-03-19 Evlers add serial supports + */ +#include +#include +#include +#include + +#ifdef RT_USING_SERIAL_V2 +#include "drv_usart_v2.h" +#else +#include "drv_usart.h" +#endif + + +/** + * @brief This function is executed in case of error occurrence. + * @param None + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler */ + /* User can add his own implementation to report the HAL error return state */ + while (1) + { + } + /* USER CODE END Error_Handler */ +} + +/** System Clock Configuration +*/ +void SystemClock_Config(void) +{ + SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + NVIC_SetPriority(SysTick_IRQn, 0); +} + +/** + * This is the timer interrupt service routine. + * + */ +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +static void system_clock_8M_200M(void); + +/** + * This function will initial GD32 board. + */ +void rt_hw_board_init() +{ + /* config system clock HSE 8M to 200M */ + system_clock_8M_200M(); + + /* NVIC Configuration */ +#define NVIC_VTOR_MASK 0x3FFFFF80 +#ifdef VECT_TAB_RAM + /* Set the Vector Table base location at 0x10000000 */ + SCB->VTOR = (0x10000000 & NVIC_VTOR_MASK); +#else /* VECT_TAB_FLASH */ + /* Set the Vector Table base location at 0x08000000 */ + SCB->VTOR = (0x08000000 & NVIC_VTOR_MASK); +#endif + + SystemClock_Config(); + +#ifdef RT_USING_SERIAL + rt_hw_usart_init(); +#endif + +#ifdef BSP_USING_SDRAM + rt_system_heap_init((void *)EXT_SDRAM_BEGIN, (void *)EXT_SDRAM_END); +#else + rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); +#endif + +#ifdef RT_USING_CONSOLE + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif + +#ifdef RT_USING_COMPONENTS_INIT + rt_components_board_init(); +#endif +} + +/** + * @brief config system clock HSE 8M PLL to 200M + * @param none + */ +static void system_clock_8M_200M(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* reset RCU */ + rcu_deinit(); + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/2 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV2; + /* APB1 = AHB/4 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV4; + + /* Configure the main PLL, PSC = 8, PLL_N = 400, PLL_P = 2, PLL_Q = 9 */ + RCU_PLL = (8U | (400U << 6U) | (((2U >> 1U) - 1U) << 16U) | + (RCU_PLLSRC_HXTAL) | (9U << 24U)); + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* Enable the high-drive to extend the clock frequency to 200 Mhz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLLP; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLLP)){ + } + + /* Update SystemCoreClock variable */ + SystemCoreClock = 200000000U; // 200MHz +} + +/*@}*/ diff --git a/bsp/gd32/arm/gd32405rg/board/board.h b/bsp/gd32/arm/gd32405rg/board/board.h new file mode 100644 index 0000000000..2e56f9cbf4 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/board.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-20 BruceOu first implementation + * 2024-03-19 Evlers remove the include of drv_usart.h + */ +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include "gd32f4xx.h" +#include "drv_gpio.h" + +#include "gd32f4xx_exti.h" + +#define EXT_SDRAM_BEGIN (0xC0000000U) /* the begining address of external SDRAM */ +#define EXT_SDRAM_END (EXT_SDRAM_BEGIN + (32U * 1024 * 1024)) /* the end address of external SDRAM */ + +// Internal SRAM memory size[Kbytes] <8-64> +// Default: 64 +#ifdef __ICCARM__ +// Use *.icf ram symbal, to avoid hardcode. +extern char __ICFEDIT_region_RAM_end__; +#define GD32_SRAM_END &__ICFEDIT_region_RAM_end__ +#else +#define GD32_SRAM_SIZE 128 +#define GD32_SRAM_END (0x20000000 + GD32_SRAM_SIZE * 1024) +#endif + +#ifdef __ARMCC_VERSION +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="HEAP" +#define HEAP_BEGIN (__segment_end("HEAP")) +#else +extern int __bss_end; +#define HEAP_BEGIN (&__bss_end) +#endif + +#define HEAP_END GD32_SRAM_END + +#endif + diff --git a/bsp/gd32/arm/gd32405rg/board/gd32f4xx_libopt.h b/bsp/gd32/arm/gd32405rg/board/gd32f4xx_libopt.h new file mode 100644 index 0000000000..d26e3d15ec --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/gd32f4xx_libopt.h @@ -0,0 +1,45 @@ +/*! + \file gd32f4xx_libopt.h + \brief library optional for gd32f4xx +*/ + +/* + Copyright (C) 2016 GigaDevice + + 2016-10-19, V1.0.0, firmware for GD32F4xx +*/ + +#ifndef GD32F4XX_LIBOPT_H +#define GD32F4XX_LIBOPT_H +#include "gd32f4xx_rcu.h" +#include "gd32f4xx_adc.h" +#include "gd32f4xx_can.h" +#include "gd32f4xx_crc.h" +#include "gd32f4xx_ctc.h" +#include "gd32f4xx_dac.h" +#include "gd32f4xx_dbg.h" +#include "gd32f4xx_dci.h" +#include "gd32f4xx_dma.h" +//#include "gd32f4xx_enet.h" +#include "gd32f4xx_exmc.h" +#include "gd32f4xx_exti.h" +#include "gd32f4xx_fmc.h" +#include "gd32f4xx_fwdgt.h" +#include "gd32f4xx_gpio.h" +#include "gd32f4xx_syscfg.h" +#include "gd32f4xx_i2c.h" +#include "gd32f4xx_ipa.h" +#include "gd32f4xx_iref.h" +#include "gd32f4xx_pmu.h" +#include "gd32f4xx_rcu.h" +#include "gd32f4xx_rtc.h" +#include "gd32f4xx_sdio.h" +#include "gd32f4xx_spi.h" +#include "gd32f4xx_timer.h" +#include "gd32f4xx_tli.h" +#include "gd32f4xx_trng.h" +#include "gd32f4xx_usart.h" +#include "gd32f4xx_wwdgt.h" +#include "gd32f4xx_misc.h" + +#endif /* GD32F4XX_LIBOPT_H */ diff --git a/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.icf b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.icf new file mode 100644 index 0000000000..c38df1f506 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.icf @@ -0,0 +1,40 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x200; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + +export symbol __ICFEDIT_region_RAM_end__; + +define symbol __region_RAM1_start__ = 0x10000000; +define symbol __region_RAM1_end__ = 0x1000FFFF; + +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 region RAM1_region = mem:[from __region_RAM1_start__ to __region_RAM1_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +keep { section FSymTab }; +keep { section VSymTab }; +keep { section .rti_fn* }; +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; +place in RAM1_region { section .sram }; diff --git a/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.ld b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.ld new file mode 100644 index 0000000000..2505b86d57 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.ld @@ -0,0 +1,143 @@ +/* + * linker script for GD32F4xx with GNU ld + * BruceOu 2021-12-14 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + CODE (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ + DATA (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128KB sram */ + TCMDATA (rw) : ORIGIN = 0x10000000, LENGTH = 64k /* 128KB tcmsram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + . = ALIGN(4); + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + . = ALIGN(4); + + . = ALIGN(4); + _etext = .; + } > CODE = 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 = .; + } > CODE + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >DATA + + .stack : + { + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >DATA + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > DATA + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.sct b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.sct new file mode 100644 index 0000000000..3116818f02 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/linker_scripts/link.sct @@ -0,0 +1,18 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00100000 { ; load region size_region + ER_IROM1 0x08000000 0x00100000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00020000 { ; RW data at SRAM + .ANY (+RW +ZI) + } + RW_IRAM2 0x10000000 0x00010000 { ; RW data at TCMSRAM + .ANY (+RW +ZI) + } +} + diff --git a/bsp/gd32/arm/gd32405rg/figures/board.jpg b/bsp/gd32/arm/gd32405rg/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4dece91b3ff233d6f3144f2237818a7c71dac171 GIT binary patch literal 98061 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 fV2}S + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 3 + 1 + 0 + + + + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/gd32/arm/gd32405rg/project.ewp b/bsp/gd32/arm/gd32405rg/project.ewp new file mode 100644 index 0000000000..38b274bb84 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.ewp @@ -0,0 +1,2196 @@ + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 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\cstdlib.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.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 + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.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\pin\dev_pin.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\IAR\startup_gd32f4xx.s + + + $PROJ_DIR$\..\libraries\gd32_drivers\drv_gpio.c + + + + + $PROJ_DIR$\..\libraries\gd32_drivers\drv_usart.c + + + + Finsh + + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c + + + + Kernel + + $PROJ_DIR$\..\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\..\src\cpu_up.c + + + $PROJ_DIR$\..\..\..\..\src\defunct.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_comm.c + + + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c + + + $PROJ_DIR$\..\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\..\src\timer.c + + + + klibc + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c + + + + libcpu + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + Libraries + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\system_gd32f4xx.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + + POSIX + + + utestcases + + diff --git a/bsp/gd32/arm/gd32405rg/project.ewt b/bsp/gd32/arm/gd32405rg/project.ewt new file mode 100644 index 0000000000..92a8523eb4 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.ewt @@ -0,0 +1,3040 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 515 + + 515 + + 0 + + 1 + 600 + 1 + 6 + 0 + 1 + 100 + Debug\C-STAT + + + 2.3.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 515 + + 515 + + 0 + + 1 + 600 + 1 + 6 + 0 + 1 + 100 + Release\C-STAT + + + 2.3.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Compiler + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\environ.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\stdlib.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 + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\time.c + + + + CPU + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\i2c-bit-ops.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\i2c_core.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\i2c_dev.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\misc\pin.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\serial\serial.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\..\libraries\gd32_drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\gd32_drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\IAR\startup_gd32f4xx.s + + + + Finsh + + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\..\components\finsh\shell.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\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + $PROJ_DIR$\..\libraries\GD32F4xx_Firmware_Library\CMSIS\GD\GD32F4xx\Source\system_gd32f4xx.c + + + + POSIX + + diff --git a/bsp/gd32/arm/gd32405rg/project.eww b/bsp/gd32/arm/gd32405rg/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/gd32/arm/gd32405rg/project.uvoptx b/bsp/gd32/arm/gd32405rg/project.uvoptx new file mode 100644 index 0000000000..39aa7f55fb --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.uvoptx @@ -0,0 +1,1075 @@ + + + + 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\ + + + 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 + 2 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0GD32F4xx_1MB.FLM -FS08000000 -FL0100000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0GD32F4xx_1MB -FL0100000 -FS08000000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.FLM) + + + + + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + System Viewer\RCU + 35905 + + + + + + + Applications + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Compiler + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 25 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\libraries\gd32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\libraries\gd32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 36 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + klibc + 0 + 0 + 0 + 0 + + 7 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 8 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 8 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 8 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 8 + 55 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 8 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 9 + 57 + 2 + 0 + 0 + 0 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + startup_gd32f4xx.s + 0 + 0 + + + 9 + 58 + 1 + 0 + 0 + 0 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\system_gd32f4xx.c + system_gd32f4xx.c + 0 + 0 + + + 9 + 59 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + gd32f4xx_dma.c + 0 + 0 + + + 9 + 60 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + gd32f4xx_exti.c + 0 + 0 + + + 9 + 61 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + gd32f4xx_gpio.c + 0 + 0 + + + 9 + 62 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + gd32f4xx_i2c.c + 0 + 0 + + + 9 + 63 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + gd32f4xx_misc.c + 0 + 0 + + + 9 + 64 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + gd32f4xx_rcu.c + 0 + 0 + + + 9 + 65 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + gd32f4xx_syscfg.c + 0 + 0 + + + 9 + 66 + 1 + 0 + 0 + 0 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + gd32f4xx_usart.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + + diff --git a/bsp/gd32/arm/gd32405rg/project.uvproj b/bsp/gd32/arm/gd32405rg/project.uvproj new file mode 100644 index 0000000000..fe4dbccd22 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.uvproj @@ -0,0 +1,1270 @@ + + + 1.1 +
### uVision Project, (C) Keil Software
+ + + rt-thread + 0x4 + ARM-ADS + 0 + + + GD32F407VK + GigaDevice + IRAM(0x20000000,0x020000) IRAM2(0x10000000,0x010000) IROM(0x08000000,0x300000) CPUTYPE("Cortex-M4") FPU2 CLOCK(25000000) + + "Startup\GD\GD32F4xx\startup_gd32f4xx.s" ("GD32F4xx Startup Code") + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC800 -FN1 -FF0GD32F4xx_3MB -FS08000000 -FL0300000 -FP0($$Device:GD32F407VK$Flash\GD32F4xx_3MB.FLM)) + 0 + gd32f4xx.h + + + + + + + + + + SFD\GD\GD32F4xx\GD32F4xx.SFR + 0 + 0 + + + + GD\GD32F4xx\ + GD\GD32F4xx\ + + 0 + 0 + 0 + 0 + 1 + + .\output\ + rtthread + 1 + 0 + 1 + 1 + 1 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 3 + + + + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + + 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-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 1 + 0 + 8 + 1 + 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 + 0x30000 + + + 1 + 0x8000000 + 0x300000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x300000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x30000 + + + 0 + 0x10000000 + 0x10000 + + + + + + 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, USE_STDPERIPH_DRIVER, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, GD32F407, RT_USING_ARMLIBC, RT_USING_LIBC + + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\libcpu\arm\cortex-m4;packages\gd32-arm-cmsis-latest\GD32F4xx;applications;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\libcpu\arm\common;..\..\..\..\components\drivers\phy;..\..\..\..\components\libc\compilers\common\include;board;..\..\..\..\components\libc\posix\ipc;.;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\poll;..\libraries\gd32_drivers;packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\drivers\smp_call;..\..\..\..\include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + + + syscalls.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + + + + + cctype.c + 1 + ..\..\..\..\components\libc\compilers\common\cctype.c + + + + + cstdlib.c + 1 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + + + + + cstring.c + 1 + ..\..\..\..\components\libc\compilers\common\cstring.c + + + + + ctime.c + 1 + ..\..\..\..\components\libc\compilers\common\ctime.c + + + + + cunistd.c + 1 + ..\..\..\..\components\libc\compilers\common\cunistd.c + + + + + cwchar.c + 1 + ..\..\..\..\components\libc\compilers\common\cwchar.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\..\components\drivers\core\device.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_i2c_bit_ops.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_i2c_core.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_i2c_dev.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + completion_comm.c + 1 + ..\..\..\..\components\drivers\ipc\completion_comm.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + completion_up.c + 1 + ..\..\..\..\components\drivers\ipc\completion_up.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + condvar.c + 1 + ..\..\..\..\components\drivers\ipc\condvar.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dataqueue.c + 1 + ..\..\..\..\components\drivers\ipc\dataqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + pipe.c + 1 + ..\..\..\..\components\drivers\ipc\pipe.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + ringblk_buf.c + 1 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + ringbuffer.c + 1 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + waitqueue.c + 1 + ..\..\..\..\components\drivers\ipc\waitqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + workqueue.c + 1 + ..\..\..\..\components\drivers\ipc\workqueue.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_pin.c + 1 + ..\..\..\..\components\drivers\pin\dev_pin.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + dev_serial.c + 1 + ..\..\..\..\components\drivers\serial\dev_serial.c + + + + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + board.c + 1 + board\board.c + + + + + drv_gpio.c + 1 + ..\libraries\gd32_drivers\drv_gpio.c + + + + + + + drv_usart.c + 1 + ..\libraries\gd32_drivers\drv_usart.c + + + + + Finsh + + + shell.c + 1 + ..\..\..\..\components\finsh\shell.c + + + + + msh_parse.c + 1 + ..\..\..\..\components\finsh\msh_parse.c + + + + + cmd.c + 1 + ..\..\..\..\components\finsh\cmd.c + + + + + msh.c + 1 + ..\..\..\..\components\finsh\msh.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\..\src\clock.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + components.c + 1 + ..\..\..\..\src\components.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + cpu_up.c + 1 + ..\..\..\..\src\cpu_up.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + defunct.c + 1 + ..\..\..\..\src\defunct.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + idle.c + 1 + ..\..\..\..\src\idle.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + ipc.c + 1 + ..\..\..\..\src\ipc.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + irq.c + 1 + ..\..\..\..\src\irq.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + kservice.c + 1 + ..\..\..\..\src\kservice.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + mem.c + 1 + ..\..\..\..\src\mem.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + mempool.c + 1 + ..\..\..\..\src\mempool.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + object.c + 1 + ..\..\..\..\src\object.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + scheduler_comm.c + 1 + ..\..\..\..\src\scheduler_comm.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + scheduler_up.c + 1 + ..\..\..\..\src\scheduler_up.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + thread.c + 1 + ..\..\..\..\src\thread.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + timer.c + 1 + ..\..\..\..\src\timer.c + + + + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + klibc + + + rt_vsscanf.c + 1 + ..\..\..\..\src\klibc\rt_vsscanf.c + + + + + kstring.c + 1 + ..\..\..\..\src\klibc\kstring.c + + + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + + + kstdio.c + 1 + ..\..\..\..\src\klibc\kstdio.c + + + + + kerrno.c + 1 + ..\..\..\..\src\klibc\kerrno.c + + + + + libcpu + + + 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-m4\context_rvds.S + + + + + cpuport.c + 1 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + + Libraries + + + startup_gd32f4xx.s + 2 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + + + + + system_gd32f4xx.c + 1 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\system_gd32f4xx.c + + + + + gd32f4xx_dma.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + + + + + gd32f4xx_exti.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + + + gd32f4xx_gpio.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + + + gd32f4xx_i2c.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + + + + + gd32f4xx_misc.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + + + gd32f4xx_rcu.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + + + gd32f4xx_syscfg.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + + + gd32f4xx_usart.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + + + + +
diff --git a/bsp/gd32/arm/gd32405rg/project.uvprojx b/bsp/gd32/arm/gd32405rg/project.uvprojx new file mode 100644 index 0000000000..5d4e1c6e1d --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/project.uvprojx @@ -0,0 +1,2319 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060528::V5.06 update 5 (build 528)::ARMCC + 0 + + + GD32F405RG + GigaDevice + GigaDevice.GD32F4xx_DFP.3.2.0 + https://gd32mcu.com/data/documents/pack/ + IRAM(0x20000000,0x020000) IRAM2(0x10000000,0x010000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F4xx_1MB -FS08000000 -FL0100000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.FLM)) + 0 + $$Device:GD32F405RG$Device\F4XX\Include\gd32f4xx.h + + + + + + + + + + $$Device:GD32F405RG$SVD\GD32F4xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\ + 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 -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 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-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 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 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x10000000 + 0x10000 + + + + + + 1 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + GD32F405, __CLK_TCK=RT_TICK_PER_SECOND, HXTAL_VALUE=8000000, RT_USING_LIBC, USE_STDPERIPH_DRIVER, __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, __RTTHREAD__ + + applications;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\phy;..\..\..\..\components\libc\compilers\common\extension;.;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\net\utest;..\..\..\..\include;..\..\..\..\components\drivers\include;board;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\drivers\smp_call;packages\gd32-arm-cmsis-latest\GD32F4xx;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\drivers\include;..\libraries\gd32_drivers;..\..\..\..\components\drivers\include;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\libcpu\arm\common;packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;..\..\..\..\components\drivers\include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 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 + + + cstdlib.c + 1 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\..\..\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\..\..\components\libc\compilers\common\ctime.c + + + cunistd.c + 1 + ..\..\..\..\components\libc\compilers\common\cunistd.c + + + cwchar.c + 1 + ..\..\..\..\components\libc\compilers\common\cwchar.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\..\components\drivers\core\device.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_i2c_bit_ops.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_i2c_core.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_i2c_dev.c + 1 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_comm.c + 1 + ..\..\..\..\components\drivers\ipc\completion_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_up.c + 1 + ..\..\..\..\components\drivers\ipc\completion_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + condvar.c + 1 + ..\..\..\..\components\drivers\ipc\condvar.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dataqueue.c + 1 + ..\..\..\..\components\drivers\ipc\dataqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + pipe.c + 1 + ..\..\..\..\components\drivers\ipc\pipe.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringblk_buf.c + 1 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringbuffer.c + 1 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + waitqueue.c + 1 + ..\..\..\..\components\drivers\ipc\waitqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + workqueue.c + 1 + ..\..\..\..\components\drivers\ipc\workqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_pin.c + 1 + ..\..\..\..\components\drivers\pin\dev_pin.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_serial.c + 1 + ..\..\..\..\components\drivers\serial\dev_serial.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + board.c + 1 + board\board.c + + + drv_gpio.c + 1 + ..\libraries\gd32_drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\gd32_drivers\drv_usart.c + + + + + Finsh + + + shell.c + 1 + ..\..\..\..\components\finsh\shell.c + + + msh.c + 1 + ..\..\..\..\components\finsh\msh.c + + + cmd.c + 1 + ..\..\..\..\components\finsh\cmd.c + + + msh_parse.c + 1 + ..\..\..\..\components\finsh\msh_parse.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\..\src\clock.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + components.c + 1 + ..\..\..\..\src\components.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + cpu_up.c + 1 + ..\..\..\..\src\cpu_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + defunct.c + 1 + ..\..\..\..\src\defunct.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + idle.c + 1 + ..\..\..\..\src\idle.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + ipc.c + 1 + ..\..\..\..\src\ipc.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + irq.c + 1 + ..\..\..\..\src\irq.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + kservice.c + 1 + ..\..\..\..\src\kservice.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mem.c + 1 + ..\..\..\..\src\mem.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mempool.c + 1 + ..\..\..\..\src\mempool.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + object.c + 1 + ..\..\..\..\src\object.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_comm.c + 1 + ..\..\..\..\src\scheduler_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_up.c + 1 + ..\..\..\..\src\scheduler_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + thread.c + 1 + ..\..\..\..\src\thread.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + timer.c + 1 + ..\..\..\..\src\timer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + klibc + + + kstdio.c + 1 + ..\..\..\..\src\klibc\kstdio.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + kstring.c + 1 + ..\..\..\..\src\klibc\kstring.c + + + rt_vsscanf.c + 1 + ..\..\..\..\src\klibc\rt_vsscanf.c + + + kerrno.c + 1 + ..\..\..\..\src\klibc\kerrno.c + + + + + libcpu + + + 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-m4\context_rvds.S + + + cpuport.c + 1 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + + Libraries + + + startup_gd32f4xx.s + 2 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + + + system_gd32f4xx.c + 1 + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Source\system_gd32f4xx.c + + + gd32f4xx_dma.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + + + gd32f4xx_exti.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + gd32f4xx_gpio.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + gd32f4xx_i2c.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + + + gd32f4xx_misc.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + gd32f4xx_rcu.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + gd32f4xx_syscfg.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + gd32f4xx_usart.c + 1 + packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + + + ::CMSIS + + + + + + + + + + + + + + + + + + + + + + <Project Info> + 0 + 1 + + + + +
diff --git a/bsp/gd32/arm/gd32405rg/rtconfig.h b/bsp/gd32/arm/gd32405rg/rtconfig.h new file mode 100644 index 0000000000..d143777126 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/rtconfig.h @@ -0,0 +1,430 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* RT-Thread Kernel */ + +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ +#define RT_NAME_MAX 12 +#define RT_CPUS_NR 1 +#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 + +/* kservice options */ + +/* end of kservice options */ +#define RT_USING_DEBUG +#define RT_DEBUGING_ASSERT +#define RT_DEBUGING_COLOR +#define RT_DEBUGING_CONTEXT + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP +/* end of Memory Management */ +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart0" +#define RT_VER_NUM 0x50201 +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ +#define RT_USING_HW_ATOMIC +#define RT_USING_CPU_FFS +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M4 + +/* 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 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + +/* end of DFS: device virtual file system */ + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SYSTEM_WORKQUEUE +#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048 +#define RT_SYSTEM_WORKQUEUE_PRIORITY 23 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V1 +#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_I2C +#define RT_USING_I2C_BITOPS +#define RT_USING_PIN +/* end of Device Drivers */ + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ + +/* Network */ + +/* end of Network */ + +/* Memory protection */ + +/* end of Memory protection */ + +/* Utilities */ + +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ + +/* RT-Thread Utestcases */ + +/* end of RT-Thread Utestcases */ + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + +/* end of Marvell WiFi */ + +/* Wiced WiFi */ + +/* end of Wiced WiFi */ + +/* CYW43012 WiFi */ + +/* end of CYW43012 WiFi */ + +/* BL808 WiFi */ + +/* end of BL808 WiFi */ + +/* CYW43439 WiFi */ + +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ + +/* IoT Cloud */ + +/* end of IoT Cloud */ +/* end of IoT - internet of things */ + +/* security packages */ + +/* end of security packages */ + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* XML: Extensible Markup Language */ + +/* end of XML: Extensible Markup Language */ +/* end of language packages */ + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + +/* end of LVGL: powerful and easy-to-use embedded GUI library */ + +/* u8g2: a monochrome graphic library */ + +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ + +/* tools packages */ + +/* end of tools packages */ + +/* system packages */ + +/* enhanced kernel services */ + +/* end of enhanced kernel services */ + +/* acceleration: Assembly language or algorithmic acceleration packages */ + +/* end of acceleration: Assembly language or algorithmic acceleration packages */ + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* Micrium: Micrium software products porting for RT-Thread */ + +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ + +/* peripheral libraries and drivers */ + +/* HAL & SDK Drivers */ + +/* STM32 HAL & SDK Drivers */ + +/* end of STM32 HAL & SDK Drivers */ + +/* Infineon HAL Packages */ + +/* end of Infineon HAL Packages */ + +/* Kendryte SDK */ + +/* end of Kendryte SDK */ + +/* WCH HAL & SDK Drivers */ + +/* end of WCH HAL & SDK Drivers */ + +/* AT32 HAL & SDK Drivers */ + +/* end of AT32 HAL & SDK Drivers */ + +/* HC32 DDL Drivers */ + +/* end of HC32 DDL Drivers */ + +/* NXP HAL & SDK Drivers */ + +/* end of NXP HAL & SDK Drivers */ + +/* NUVOTON Drivers */ + +/* end of NUVOTON Drivers */ + +/* GD32 Drivers */ + +#define PKG_USING_GD32_ARM_CMSIS_DRIVER +#define PKG_USING_GD32_ARM_CMSIS_DRIVER_LATEST_VERSION +#define PKG_USING_GD32_ARM_SERIES_DRIVER +#define PKG_USING_GD32_ARM_SERIES_DRIVER_LATEST_VERSION +/* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ +/* end of HAL & SDK Drivers */ + +/* sensors drivers */ + +/* end of sensors drivers */ + +/* touch drivers */ + +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ + +/* AI packages */ + +/* end of AI packages */ + +/* Signal Processing and Control Algorithm Packages */ + +/* end of Signal Processing and Control Algorithm Packages */ + +/* miscellaneous packages */ + +/* project laboratory */ + +/* end of project laboratory */ + +/* samples: kernel and components samples */ + +/* end of samples: kernel and components samples */ + +/* entertainment: terminal games and other interesting software packages */ + +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ + +/* Arduino libraries */ + + +/* Projects and Demos */ + +/* end of Projects and Demos */ + +/* Sensors */ + +/* end of Sensors */ + +/* Display */ + +/* end of Display */ + +/* Timing */ + +/* end of Timing */ + +/* Data Processing */ + +/* end of Data Processing */ + +/* Data Storage */ + +/* Communication */ + +/* end of Communication */ + +/* Device Control */ + +/* end of Device Control */ + +/* Other */ + +/* end of Other */ + +/* Signal IO */ + +/* end of Signal IO */ + +/* Uncategorized */ + +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ +#define SOC_FAMILY_GD32 +#define SOC_SERIES_GD32F4xx + +/* Hardware Drivers Config */ + +#define SOC_GD32405RG + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART0 +#define BSP_USING_GD_DBG +/* end of On-chip Peripheral Drivers */ + +/* Board extended module Drivers */ + +/* end of Hardware Drivers Config */ + +#endif diff --git a/bsp/gd32/arm/gd32405rg/rtconfig.py b/bsp/gd32/arm/gd32405rg/rtconfig.py new file mode 100644 index 0000000000..d37afd4c07 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/rtconfig.py @@ -0,0 +1,151 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.ld' + + 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-M4.fp ' + 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 rtthread.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 == 'iccarm': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + #DEVICE = ' -D USE_STDPERIPH_DRIVER' + ' -D GD32F407xK' + + 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-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + 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-M4' + AFLAGS += ' -S' + AFLAGS += ' --fpu VFPv4_sp' + + 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/gd32/arm/gd32405rg/template.ewp b/bsp/gd32/arm/gd32405rg/template.ewp new file mode 100644 index 0000000000..c3cff156ac --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/template.ewp @@ -0,0 +1,1889 @@ + + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + + diff --git a/bsp/gd32/arm/gd32405rg/template.uvoptx b/bsp/gd32/arm/gd32405rg/template.uvoptx new file mode 100644 index 0000000000..1499ed81f2 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/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\ + + + 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 + 2 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0GD32F4xx_1MB.FLM -FS08000000 -FL0100000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0GD32F4xx_1MB -FL0100000 -FS08000000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.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 + + + + + + + + + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/gd32/arm/gd32405rg/template.uvproj b/bsp/gd32/arm/gd32405rg/template.uvproj new file mode 100644 index 0000000000..deb72d33b0 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/template.uvproj @@ -0,0 +1,628 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 0 + + + GD32F407VK + GigaDevice + IRAM(0x20000000,0x020000) IRAM2(0x10000000,0x010000) IROM(0x08000000,0x300000) CPUTYPE("Cortex-M4") FPU2 CLOCK(25000000) + + "Startup\GD\GD32F4xx\startup_gd32f4xx.s" ("GD32F4xx Startup Code") + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC800 -FN1 -FF0GD32F4xx_3MB -FS08000000 -FL0300000 -FP0($$Device:GD32F407VK$Flash\GD32F4xx_3MB.FLM)) + 0 + gd32f4xx.h + + + + + + + + + + SFD\GD\GD32F4xx\GD32F4xx.SFR + 0 + 0 + + + + GD\GD32F4xx\ + GD\GD32F4xx\ + + 0 + 0 + 0 + 0 + 1 + + .\output\ + rtthread + 1 + 0 + 1 + 1 + 1 + .\build\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 3 + + + + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + + 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-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 1 + 0 + 8 + 1 + 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 + 0x30000 + + + 1 + 0x8000000 + 0x300000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x300000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x30000 + + + 0 + 0x10000000 + 0x10000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Include;..\..\..\Library\Firmware\CMSIS\GD\GD32F4xx\Include;..\..\..\Library\Utilities;..\ + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Application + + + main.c + 1 + ..\main.c + + + gd32f4xx_it.c + 1 + ..\gd32f4xx_it.c + + + + + CMSIS + + + system_gd32f4xx.c + 1 + ..\..\..\Library\Firmware\CMSIS\GD\GD32F4xx\Source\system_gd32f4xx.c + + + + + GD32F4xx_Peripherals + + + gd32f4xx_adc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_adc.c + + + gd32f4xx_can.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_can.c + + + gd32f4xx_crc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_crc.c + + + gd32f4xx_ctc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_ctc.c + + + gd32f4xx_dac.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dac.c + + + gd32f4xx_dbg.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dbg.c + + + gd32f4xx_dci.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dci.c + + + gd32f4xx_dma.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_dma.c + + + gd32f4xx_enet.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_enet.c + + + gd32f4xx_exmc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_exmc.c + + + gd32f4xx_exti.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_exti.c + + + gd32f4xx_fmc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_fmc.c + + + gd32f4xx_fwdgt.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_fwdgt.c + + + gd32f4xx_gpio.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_gpio.c + + + gd32f4xx_i2c.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_i2c.c + + + gd32f4xx_ipa.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_ipa.c + + + gd32f4xx_iref.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_iref.c + + + gd32f4xx_misc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_misc.c + + + gd32f4xx_pmu.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_pmu.c + + + gd32f4xx_rcu.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_rcu.c + + + gd32f4xx_rtc.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_rtc.c + + + gd32f4xx_sdio.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_sdio.c + + + gd32f4xx_spi.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_spi.c + + + gd32f4xx_syscfg.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_syscfg.c + + + gd32f4xx_timer.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c + + + gd32f4xx_tli.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_tli.c + + + gd32f4xx_trng.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_trng.c + + + gd32f4xx_usart.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + + gd32f4xx_wwdgt.c + 1 + ..\..\..\Library\Firmware\GD32F4xx_standard_peripheral\Source\gd32f4xx_wwdgt.c + + + + + GD32F4xx_START + + + gd32f407r_start.c + 1 + ..\..\..\Library\Utilities\gd32f407r_start.c + + + + + Startup + + + startup_gd32f4xx.s + 2 + ..\..\..\Library\Firmware\CMSIS\GD\GD32F4xx\Source\ARM\startup_gd32f4xx.s + + + + + Doc + + + readme.txt + 5 + ..\readme.txt + + + + + + + +
diff --git a/bsp/gd32/arm/gd32405rg/template.uvprojx b/bsp/gd32/arm/gd32405rg/template.uvprojx new file mode 100644 index 0000000000..27f58a77c5 --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/template.uvprojx @@ -0,0 +1,414 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + GD32F405RG + GigaDevice + GigaDevice.GD32F4xx_DFP.3.2.0 + https://gd32mcu.com/data/documents/pack/ + IRAM(0x20000000,0x020000) IRAM2(0x10000000,0x010000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F4xx_1MB -FS08000000 -FL0100000 -FP0($$Device:GD32F405RG$Flash\GD32F4xx_1MB.FLM)) + 0 + $$Device:GD32F405RG$Device\F4XX\Include\gd32f4xx.h + + + + + + + + + + $$Device:GD32F405RG$SVD\GD32F4xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rtthread + 1 + 0 + 0 + 1 + 1 + .\build\ + 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 -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 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-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 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 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x10000000 + 0x10000 + + + + + + 1 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\gd32_rom.ld + + + + + + + + + + + ::CMSIS + + + + + + + + + + + + + + + + + + + + + + <Project Info> + 0 + 1 + + + + +
-- Gitee From eb7576d00f1c8d8c16fc97bedc3cbe74ce0fcbfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E9=B8=BF=E8=B6=85?= <13010364+shi-hongchao@user.noreply.gitee.com> Date: Tue, 6 Jan 2026 20:46:19 +0800 Subject: [PATCH 03/45] =?UTF-8?q?feat(bsp/gd32):=20=E6=B7=BB=E5=8A=A0PWM?= =?UTF-8?q?=E5=92=8C=E6=9B=B4=E5=A4=9A=E7=A1=AC=E4=BB=B6=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E5=99=A8=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在Kconfig中添加BSP_USING_PWM和BSP_USING_HWTIMER配置项 - 修正PWM时钟获取逻辑,使其能正确得到APB1/APB2上的定时器时钟源频率,添加在pwm结构体通道引脚资源配置项 - 修改硬件定时器初始化逻辑,修正定时器中断处理函数,适配GD32F4xx系列 - 在main.c中添加hwtimer_test和pwm_test测试函数 - 修复PWM和硬件定时器的依赖关系配置 --- bsp/gd32/arm/gd32405rg/.config | 19 +- bsp/gd32/arm/gd32405rg/applications/main.c | 102 +++ bsp/gd32/arm/gd32405rg/board/Kconfig | 120 +++- bsp/gd32/arm/gd32405rg/project.uvoptx | 214 ++++-- bsp/gd32/arm/gd32405rg/project.uvprojx | 163 ++++- bsp/gd32/arm/gd32405rg/rtconfig.h | 15 + .../arm/libraries/gd32_drivers/drv_hwtimer.c | 174 ++++- bsp/gd32/arm/libraries/gd32_drivers/drv_pwm.c | 652 ++++++++++-------- 8 files changed, 1064 insertions(+), 395 deletions(-) diff --git a/bsp/gd32/arm/gd32405rg/.config b/bsp/gd32/arm/gd32405rg/.config index c74192943e..d9defb3a43 100644 --- a/bsp/gd32/arm/gd32405rg/.config +++ b/bsp/gd32/arm/gd32405rg/.config @@ -254,7 +254,7 @@ CONFIG_RT_USING_I2C_BITOPS=y # 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_PWM=y # CONFIG_RT_USING_PULSE_ENCODER is not set # CONFIG_RT_USING_INPUT_CAPTURE is not set # CONFIG_RT_USING_MTD_NOR is not set @@ -274,7 +274,7 @@ CONFIG_RT_USING_I2C_BITOPS=y # CONFIG_RT_USING_VIRTIO is not set CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_KTIME is not set -# CONFIG_RT_USING_HWTIMER is not set +CONFIG_RT_USING_HWTIMER=y # CONFIG_RT_USING_CHERRYUSB is not set # end of Device Drivers @@ -1442,7 +1442,20 @@ CONFIG_BSP_USING_UART0=y # CONFIG_BSP_USING_UART5 is not set # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_ADC is not set -# CONFIG_BSP_USING_TIM is not set +# CONFIG_BSP_USING_HWTIMER is not set +CONFIG_BSP_USING_PWM=y +CONFIG_BSP_USING_PWM0=y +CONFIG_BSP_USING_PWM1=y +CONFIG_BSP_USING_PWM2=y +CONFIG_BSP_USING_PWM3=y +CONFIG_BSP_USING_PWM4=y +CONFIG_BSP_USING_PWM7=y +CONFIG_BSP_USING_PWM8=y +CONFIG_BSP_USING_PWM9=y +CONFIG_BSP_USING_PWM10=y +CONFIG_BSP_USING_PWM11=y +CONFIG_BSP_USING_PWM12=y +CONFIG_BSP_USING_PWM13=y # CONFIG_BSP_USING_ONCHIP_RTC is not set # CONFIG_BSP_USING_WDT is not set # CONFIG_BSP_USING_SDIO is not set diff --git a/bsp/gd32/arm/gd32405rg/applications/main.c b/bsp/gd32/arm/gd32405rg/applications/main.c index 73777282de..fa263c7cca 100644 --- a/bsp/gd32/arm/gd32405rg/applications/main.c +++ b/bsp/gd32/arm/gd32405rg/applications/main.c @@ -33,3 +33,105 @@ int main(void) return RT_EOK; } + +#ifdef BSP_USING_HWTIMER +/* hwtimer callback function */ +static rt_err_t hwtimer_test_cb(rt_device_t dev, rt_size_t size) +{ + rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("tick is :%d !\n", rt_tick_get()); + + return 0; +} + +#define HWTIMER_DEV_NAME "timer13" + +/* hwtimer test */ +static void hwtimer_test(void) +{ + rt_err_t ret = RT_EOK; + rt_hwtimerval_t timeout_s; /* 定时器超时值 */ + rt_device_t hw_dev = RT_NULL; /* 定时器设备句柄 */ + rt_hwtimer_mode_t mode; /* 定时器模式 */ + rt_uint32_t freq = 10000; /* 计数频率 */ + + /* 查找定时器设备 */ + hw_dev = rt_device_find(HWTIMER_DEV_NAME); + if (hw_dev == RT_NULL) + { + rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + return; + } + + /* 以读写方式打开设备 */ + ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); + if (ret != RT_EOK) + { + rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + return; + } + + /* 设置超时回调函数 */ + rt_device_set_rx_indicate(hw_dev, hwtimer_test_cb); + + /* 设置计数频率(若未设置该项,默认为1Mhz 或 支持的最小计数频率) */ + rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq); + /* 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)*/ + mode = HWTIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + if (ret != RT_EOK) + { + rt_kprintf("set mode failed! ret is :%d\n", ret); + return; + } + + /* 设置定时器超时值为5s并启动定时器 */ + timeout_s.sec = 5; /* 秒 */ + timeout_s.usec = 0; /* 微秒 */ + if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) + { + rt_kprintf("set timeout value failed\n"); + return; + } +} +MSH_CMD_EXPORT(hwtimer_test, hwtimer test); +#endif //BSP_USING_HWTIMER + +#ifdef BSP_USING_PWM + +/* pwm test */ +static void pwm_test(void) +{ + rt_err_t ret = RT_EOK; + struct rt_device_pwm *pwm2 = RT_NULL, *pwm8 = RT_NULL, *pwm1 = RT_NULL, *pwm4 = RT_NULL; + rt_uint32_t period = 1000; /* 周期 */ + rt_uint32_t pulse = 500; /* 占空比 */ + + /* 查找PWM设备 */ + pwm2 = (struct rt_device_pwm *)rt_device_find("pwm2"); + if (pwm2 == RT_NULL) + { + rt_kprintf("pwm sample run failed! can't find %s device!\n", "pwm2"); + return; + } + rt_pwm_set(pwm2, 3, period, pulse); + rt_pwm_enable(pwm2, 3); + rt_pwm_set(pwm2, 4, period, pulse); + rt_pwm_enable(pwm2, 4); + + pwm8 = (struct rt_device_pwm *)rt_device_find("pwm8"); + rt_pwm_set(pwm8, 2, period, pulse); + rt_pwm_enable(pwm8, 2); + + pwm1 = (struct rt_device_pwm *)rt_device_find("pwm1"); + rt_pwm_set(pwm1, 3, period, pulse); + rt_pwm_enable(pwm1, 3); + + pwm4 = (struct rt_device_pwm *)rt_device_find("pwm4"); + rt_pwm_set(pwm4, 1, period, pulse); + rt_pwm_enable(pwm4, 1); + rt_pwm_set(pwm4, 2, period, pulse); + rt_pwm_enable(pwm4, 2); +} +MSH_CMD_EXPORT(pwm_test, pwm test); +#endif // BSP_USING_PWM diff --git a/bsp/gd32/arm/gd32405rg/board/Kconfig b/bsp/gd32/arm/gd32405rg/board/Kconfig index f62e148f3c..ea08346a41 100644 --- a/bsp/gd32/arm/gd32405rg/board/Kconfig +++ b/bsp/gd32/arm/gd32405rg/board/Kconfig @@ -271,24 +271,134 @@ menu "On-chip Peripheral Drivers" default n endif - menuconfig BSP_USING_TIM + menuconfig BSP_USING_HWTIMER bool "Enable timer" default n select RT_USING_HWTIMER - if BSP_USING_TIM - config BSP_USING_TIM10 + if BSP_USING_HWTIMER + config BSP_USING_HWTIMER0 + bool "Enable TIM0" + default n + + config BSP_USING_HWTIMER1 + bool "Enable TIM1" + default n + + config BSP_USING_HWTIMER2 + bool "Enable TIM2" + default n + + config BSP_USING_HWTIMER3 + bool "Enable TIM3" + default n + + config BSP_USING_HWTIMER4 + bool "Enable TIM4" + default n + + config BSP_USING_HWTIMER5 + bool "Enable TIM5" + default n + + config BSP_USING_HWTIMER6 + bool "Enable TIM6" + default y + + config BSP_USING_HWTIMER7 + bool "Enable TIM7" + default n + + config BSP_USING_HWTIMER8 + bool "Enable TIM8" + default n + + config BSP_USING_HWTIMER9 + bool "Enable TIM9" + default n + + config BSP_USING_HWTIMER10 bool "Enable TIM10" default n - config BSP_USING_TIM11 + config BSP_USING_HWTIMER11 bool "Enable TIM11" default n - config BSP_USING_TIM12 + config BSP_USING_HWTIMER12 + bool "Enable TIM12" + default n + + config BSP_USING_HWTIMER13 bool "Enable TIM13" default n endif + menuconfig BSP_USING_PWM + bool "Enable pwm" + select RT_USING_PWM + default n + if BSP_USING_PWM + config BSP_USING_PWM0 + bool "Enable PWM0" + depends on !BSP_USING_HWTIMER0 + default n + + config BSP_USING_PWM1 + bool "Enable PWM1" + depends on !BSP_USING_HWTIMER1 + default n + + config BSP_USING_PWM2 + bool "Enable PWM2" + depends on !BSP_USING_HWTIMER2 + default n + + config BSP_USING_PWM3 + bool "Enable PWM3" + depends on !BSP_USING_HWTIMER3 + default n + + config BSP_USING_PWM4 + bool "Enable PWM4" + depends on !BSP_USING_HWTIMER4 + default n + + config BSP_USING_PWM7 + bool "Enable PWM7" + depends on !BSP_USING_HWTIMER7 + default n + + config BSP_USING_PWM8 + bool "Enable PWM8" + depends on !BSP_USING_HWTIMER8 + default n + + config BSP_USING_PWM9 + bool "Enable PWM9" + depends on !BSP_USING_HWTIMER9 + default n + + config BSP_USING_PWM10 + bool "Enable PWM10" + depends on !BSP_USING_HWTIMER10 + default n + + config BSP_USING_PWM11 + bool "Enable PWM11" + depends on !BSP_USING_HWTIMER11 + default n + + config BSP_USING_PWM12 + bool "Enable PWM12" + depends on !BSP_USING_HWTIMER12 + default n + + config BSP_USING_PWM13 + bool "Enable PWM13" + depends on !BSP_USING_HWTIMER13 + default n + endif + menuconfig BSP_USING_ONCHIP_RTC bool "Enable RTC" select RT_USING_RTC diff --git a/bsp/gd32/arm/gd32405rg/project.uvoptx b/bsp/gd32/arm/gd32405rg/project.uvoptx index 39aa7f55fb..e8e6ea1538 100644 --- a/bsp/gd32/arm/gd32405rg/project.uvoptx +++ b/bsp/gd32/arm/gd32405rg/project.uvoptx @@ -193,9 +193,13 @@ - System Viewer\RCU + System Viewer\TIMER1 35905 + + System Viewer\TIMER2 + 35904 + @@ -349,6 +353,18 @@ 0 0 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c dev_i2c_bit_ops.c 0 @@ -356,7 +372,7 @@ 3 - 12 + 13 1 0 0 @@ -368,7 +384,7 @@ 3 - 13 + 14 1 0 0 @@ -380,7 +396,7 @@ 3 - 14 + 15 1 0 0 @@ -392,7 +408,7 @@ 3 - 15 + 16 1 0 0 @@ -404,7 +420,7 @@ 3 - 16 + 17 1 0 0 @@ -416,7 +432,7 @@ 3 - 17 + 18 1 0 0 @@ -428,7 +444,7 @@ 3 - 18 + 19 1 0 0 @@ -440,7 +456,7 @@ 3 - 19 + 20 1 0 0 @@ -452,7 +468,7 @@ 3 - 20 + 21 1 0 0 @@ -464,7 +480,7 @@ 3 - 21 + 22 1 0 0 @@ -476,7 +492,7 @@ 3 - 22 + 23 1 0 0 @@ -488,7 +504,19 @@ 3 - 23 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\rt_drv_pwm.c + rt_drv_pwm.c + 0 + 0 + + + 3 + 25 1 0 0 @@ -500,7 +528,7 @@ 3 - 24 + 26 1 0 0 @@ -520,7 +548,7 @@ 0 4 - 25 + 27 1 0 0 @@ -532,7 +560,7 @@ 4 - 26 + 28 1 0 0 @@ -544,7 +572,31 @@ 4 - 27 + 29 + 1 + 0 + 0 + 0 + ..\libraries\gd32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 + ..\libraries\gd32_drivers\drv_pwm.c + drv_pwm.c + 0 + 0 + + + 4 + 31 1 0 0 @@ -564,49 +616,49 @@ 0 5 - 28 + 32 1 0 0 0 - ..\..\..\..\components\finsh\shell.c - shell.c + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c 0 0 5 - 29 + 33 1 0 0 0 - ..\..\..\..\components\finsh\msh.c - msh.c + ..\..\..\..\components\finsh\shell.c + shell.c 0 0 5 - 30 + 34 1 0 0 0 - ..\..\..\..\components\finsh\cmd.c - cmd.c + ..\..\..\..\components\finsh\msh.c + msh.c 0 0 5 - 31 + 35 1 0 0 0 - ..\..\..\..\components\finsh\msh_parse.c - msh_parse.c + ..\..\..\..\components\finsh\cmd.c + cmd.c 0 0 @@ -620,7 +672,7 @@ 0 6 - 32 + 36 1 0 0 @@ -632,7 +684,7 @@ 6 - 33 + 37 1 0 0 @@ -644,7 +696,7 @@ 6 - 34 + 38 1 0 0 @@ -656,7 +708,7 @@ 6 - 35 + 39 1 0 0 @@ -668,7 +720,7 @@ 6 - 36 + 40 1 0 0 @@ -680,7 +732,7 @@ 6 - 37 + 41 1 0 0 @@ -692,7 +744,7 @@ 6 - 38 + 42 1 0 0 @@ -704,7 +756,7 @@ 6 - 39 + 43 1 0 0 @@ -716,7 +768,7 @@ 6 - 40 + 44 1 0 0 @@ -728,7 +780,7 @@ 6 - 41 + 45 1 0 0 @@ -740,7 +792,7 @@ 6 - 42 + 46 1 0 0 @@ -752,7 +804,7 @@ 6 - 43 + 47 1 0 0 @@ -764,7 +816,7 @@ 6 - 44 + 48 1 0 0 @@ -776,7 +828,7 @@ 6 - 45 + 49 1 0 0 @@ -788,7 +840,7 @@ 6 - 46 + 50 1 0 0 @@ -808,61 +860,61 @@ 0 7 - 47 + 51 1 0 0 0 - ..\..\..\..\src\klibc\kstdio.c - kstdio.c + ..\..\..\..\src\klibc\kstring.c + kstring.c 0 0 7 - 48 + 52 1 0 0 0 - ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c - rt_vsnprintf_tiny.c + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c 0 0 7 - 49 + 53 1 0 0 0 - ..\..\..\..\src\klibc\kstring.c - kstring.c + ..\..\..\..\src\klibc\kerrno.c + kerrno.c 0 0 7 - 50 + 54 1 0 0 0 - ..\..\..\..\src\klibc\rt_vsscanf.c - rt_vsscanf.c + ..\..\..\..\src\klibc\kstdio.c + kstdio.c 0 0 7 - 51 + 55 1 0 0 0 - ..\..\..\..\src\klibc\kerrno.c - kerrno.c + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c 0 0 @@ -876,7 +928,7 @@ 0 8 - 52 + 56 1 0 0 @@ -888,7 +940,7 @@ 8 - 53 + 57 1 0 0 @@ -900,7 +952,7 @@ 8 - 54 + 58 1 0 0 @@ -912,7 +964,7 @@ 8 - 55 + 59 2 0 0 @@ -924,7 +976,7 @@ 8 - 56 + 60 1 0 0 @@ -938,13 +990,13 @@ Libraries - 0 + 1 0 0 0 9 - 57 + 61 2 0 0 @@ -956,7 +1008,7 @@ 9 - 58 + 62 1 0 0 @@ -968,7 +1020,7 @@ 9 - 59 + 63 1 0 0 @@ -980,7 +1032,7 @@ 9 - 60 + 64 1 0 0 @@ -992,7 +1044,7 @@ 9 - 61 + 65 1 0 0 @@ -1004,7 +1056,7 @@ 9 - 62 + 66 1 0 0 @@ -1016,7 +1068,7 @@ 9 - 63 + 67 1 0 0 @@ -1028,7 +1080,7 @@ 9 - 64 + 68 1 0 0 @@ -1040,7 +1092,7 @@ 9 - 65 + 69 1 0 0 @@ -1052,7 +1104,7 @@ 9 - 66 + 70 1 0 0 @@ -1062,6 +1114,18 @@ 0 0 + + 9 + 71 + 1 + 0 + 0 + 0 + .\packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c + gd32f4xx_timer.c + 0 + 0 + diff --git a/bsp/gd32/arm/gd32405rg/project.uvprojx b/bsp/gd32/arm/gd32405rg/project.uvprojx index 5d4e1c6e1d..9ab03ac12e 100644 --- a/bsp/gd32/arm/gd32405rg/project.uvprojx +++ b/bsp/gd32/arm/gd32405rg/project.uvprojx @@ -338,9 +338,9 @@ 0 - GD32F405, __CLK_TCK=RT_TICK_PER_SECOND, HXTAL_VALUE=8000000, RT_USING_LIBC, USE_STDPERIPH_DRIVER, __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, __RTTHREAD__ + RT_USING_LIBC, HXTAL_VALUE=8000000U, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND, GD32F405, __STDC_LIMIT_MACROS - applications;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\phy;..\..\..\..\components\libc\compilers\common\extension;.;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\net\utest;..\..\..\..\include;..\..\..\..\components\drivers\include;board;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\drivers\smp_call;packages\gd32-arm-cmsis-latest\GD32F4xx;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\drivers\include;..\libraries\gd32_drivers;..\..\..\..\components\drivers\include;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\libcpu\arm\common;packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;..\..\..\..\components\drivers\include + packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;packages\gd32-arm-cmsis-latest\GD32F4xx;.;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\smp_call;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\net\utest;applications;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\drivers\include;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\drivers\phy;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;board;..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\libcpu\arm\common;..\..\..\..\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\libraries\gd32_drivers;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\eventfd @@ -371,7 +371,7 @@ 0x08000000 0x20000000 - .\board\linker_scripts\link.sct + .\gd32_rom.ld @@ -495,6 +495,62 @@ + + hwtimer.c + 1 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + dev_i2c_bit_ops.c 1 @@ -1167,6 +1223,62 @@ + + rt_drv_pwm.c + 1 + ..\..\..\..\components\drivers\misc\rt_drv_pwm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + dev_pin.c 1 @@ -1294,6 +1406,16 @@ 1 ..\libraries\gd32_drivers\drv_gpio.c + + drv_hwtimer.c + 1 + ..\libraries\gd32_drivers\drv_hwtimer.c + + + drv_pwm.c + 1 + ..\libraries\gd32_drivers\drv_pwm.c + drv_usart.c 1 @@ -1304,6 +1426,11 @@ Finsh + + msh_parse.c + 1 + ..\..\..\..\components\finsh\msh_parse.c + shell.c 1 @@ -1319,11 +1446,6 @@ 1 ..\..\..\..\components\finsh\cmd.c - - msh_parse.c - 1 - ..\..\..\..\components\finsh\msh_parse.c - @@ -2174,16 +2296,6 @@ klibc - - kstdio.c - 1 - ..\..\..\..\src\klibc\kstdio.c - - - rt_vsnprintf_tiny.c - 1 - ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c - kstring.c 1 @@ -2199,6 +2311,16 @@ 1 ..\..\..\..\src\klibc\kerrno.c + + kstdio.c + 1 + ..\..\..\..\src\klibc\kstdio.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + @@ -2284,6 +2406,11 @@ 1 packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + gd32f4xx_timer.c + 1 + .\packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c + diff --git a/bsp/gd32/arm/gd32405rg/rtconfig.h b/bsp/gd32/arm/gd32405rg/rtconfig.h index d143777126..598194241a 100644 --- a/bsp/gd32/arm/gd32405rg/rtconfig.h +++ b/bsp/gd32/arm/gd32405rg/rtconfig.h @@ -149,7 +149,9 @@ #define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_I2C #define RT_USING_I2C_BITOPS +#define RT_USING_PWM #define RT_USING_PIN +#define RT_USING_HWTIMER /* end of Device Drivers */ /* C/C++ and POSIX layer */ @@ -420,6 +422,19 @@ #define BSP_USING_GPIO #define BSP_USING_UART #define BSP_USING_UART0 +#define BSP_USING_PWM +#define BSP_USING_PWM0 +#define BSP_USING_PWM1 +#define BSP_USING_PWM2 +#define BSP_USING_PWM3 +#define BSP_USING_PWM4 +#define BSP_USING_PWM7 +#define BSP_USING_PWM8 +#define BSP_USING_PWM9 +#define BSP_USING_PWM10 +#define BSP_USING_PWM11 +#define BSP_USING_PWM12 +#define BSP_USING_PWM13 #define BSP_USING_GD_DBG /* end of On-chip Peripheral Drivers */ diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_hwtimer.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_hwtimer.c index 1c22b10467..bb53cd6b33 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_hwtimer.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_hwtimer.c @@ -6,6 +6,10 @@ * Change Logs: * Date Author Notes * 2021-02-25 iysheng first version + * 2025-12-26 shihongchao Configure GD32F4xx chips interrupt handlers, + * relocate clock and interrupt initialization + * to the _init function, and implement deinit + * functionality */ #include @@ -114,16 +118,30 @@ static void __set_timerx_freq(uint32_t timerx, uint32_t freq) static void gd32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) { uint32_t timer_base = (uint32_t)timer->parent.user_data; + gd32_hwtimer_device *hwtimer = rt_container_of(timer, gd32_hwtimer_device, hwtimer_dev); timer_parameter_struct initpara; if (state) { + rcu_periph_clock_enable(hwtimer->hw_data.rcu); + NVIC_SetPriority(hwtimer->hw_data.irqn, 0); + NVIC_EnableIRQ(hwtimer->hw_data.irqn); + timer_interrupt_enable(timer_base, TIMER_INT_UP); + timer_internal_clock_config(timer_base); timer_struct_para_init(&initpara); initpara.period = timer->info->maxcnt; timer_init(timer_base, &initpara); __set_timerx_freq(timer_base, timer->info->maxfreq); } + else + { + rcu_periph_clock_disable(hwtimer->hw_data.rcu); + NVIC_DisableIRQ(hwtimer->hw_data.irqn); + timer_interrupt_disable(timer_base, TIMER_INT_UP); + + timer_disable(timer_base); + } } static rt_err_t gd32_hwtimer_start(struct rt_hwtimer_device *timer, \ @@ -200,7 +218,11 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { "timer0", { TIMER0, +#ifdef SOC_SERIES_GD32F4xx + TIMER0_UP_TIMER9_IRQn, +#else TIMER0_UP_IRQn, +#endif RCU_TIMER0, }, {0}, @@ -285,7 +307,11 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { "timer5", { TIMER5, +#ifdef SOC_SERIES_GD32F4xx + TIMER5_DAC_IRQn, +#else TIMER5_IRQn, +#endif RCU_TIMER5, }, {0}, @@ -319,7 +345,11 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { "timer7", { TIMER7, +#ifdef SOC_SERIES_GD32F4xx + TIMER7_UP_TIMER12_IRQn, +#else TIMER7_UP_IRQn, +#endif RCU_TIMER7, }, {0}, @@ -336,7 +366,11 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { "timer8", { TIMER8, +#ifdef SOC_SERIES_GD32F4xx + TIMER0_BRK_TIMER8_IRQn, +#else TIMER8_IRQn, +#endif RCU_TIMER8, }, {0}, @@ -353,7 +387,11 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { "timer9", { TIMER9, +#ifdef SOC_SERIES_GD32F4xx + TIMER0_UP_TIMER9_IRQn, +#else TIMER9_IRQn, +#endif RCU_TIMER9, }, {0}, @@ -370,7 +408,11 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { "timer10", { TIMER10, +#ifdef SOC_SERIES_GD32F4xx + TIMER0_TRG_CMT_TIMER10_IRQn, +#else TIMER10_IRQn, +#endif RCU_TIMER10, }, {0}, @@ -387,7 +429,11 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { "timer11", { TIMER11, +#ifdef SOC_SERIES_GD32F4xx + TIMER7_BRK_TIMER11_IRQn, +#else TIMER11_IRQn, +#endif RCU_TIMER11, }, {0}, @@ -404,7 +450,11 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { "timer12", { TIMER12, +#ifdef SOC_SERIES_GD32F4xx + TIMER7_UP_TIMER12_IRQn, +#else TIMER12_IRQn, +#endif RCU_TIMER12, }, {0}, @@ -421,7 +471,11 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { "timer13", { TIMER13, +#ifdef SOC_SERIES_GD32F4xx + TIMER7_TRG_CMT_TIMER13_IRQn, +#else TIMER13_IRQn, +#endif RCU_TIMER13, }, {0}, @@ -436,12 +490,31 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { }; #ifdef BSP_USING_HWTIMER0 +#ifdef SOC_SERIES_GD32F4xx +void TIMER0_UP_TIMER9_IRQHandler(void) +#else void TIMER0_UP_IRQHandler(void) +#endif { rt_interrupt_enter(); - rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM0_INDEX].hwtimer_dev); - timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM0_INDEX].hwtimer_dev.parent.user_data, \ +#ifdef BSP_USING_HWTIMER0 + if(timer_interrupt_flag_get((uint32_t)g_gd32_hwtimer[TIM0_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP)) + { + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM0_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM0_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP); + } +#endif +#ifdef BSP_USING_HWTIMER9 + if(timer_interrupt_flag_get((uint32_t)g_gd32_hwtimer[TIM9_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP)) + { + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM9_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM9_INDEX].hwtimer_dev.parent.user_data, \ TIMER_INT_UP); + } +#endif rt_interrupt_leave(); } #endif @@ -491,7 +564,11 @@ void TIMER4_IRQHandler(void) #endif #ifdef BSP_USING_HWTIMER5 +#ifdef SOC_SERIES_GD32F4xx +void TIMER5_DAC_IRQHandler(void) +#else void TIMER5_IRQHandler(void) +#endif { rt_interrupt_enter(); rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM5_INDEX].hwtimer_dev); @@ -512,7 +589,34 @@ void TIMER6_IRQHandler(void) } #endif +#ifdef SOC_SERIES_GD32F4xx +#if defined(BSP_USING_HWTIMER7) || defined(BSP_USING_HWTIMER12) +void TIMER7_UP_TIMER12_IRQHandler(void) +{ + rt_interrupt_enter(); #ifdef BSP_USING_HWTIMER7 + if(timer_interrupt_flag_get((uint32_t)g_gd32_hwtimer[TIM7_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP)) + { + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM7_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM7_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP); + } +#endif +#ifdef BSP_USING_HWTIMER12 + if(timer_interrupt_flag_get((uint32_t)g_gd32_hwtimer[TIM12_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP)) + { + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM12_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM12_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP); + } +#endif + rt_interrupt_leave(); +} +#endif +#else +#if defined(BSP_USING_HWTIMER7) void TIMER7_UP_IRQHandler(void) { rt_interrupt_enter(); @@ -522,6 +626,68 @@ void TIMER7_UP_IRQHandler(void) rt_interrupt_leave(); } #endif +#endif + + +#ifdef BSP_USING_HWTIMER8 +#ifdef SOC_SERIES_GD32F4xx +void TIMER0_BRK_TIMER8_IRQHandler(void) +#else +void TIMER8_UP_IRQHandler(void) +#endif +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM8_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM8_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP); + rt_interrupt_leave(); +} +#endif + +#ifdef BSP_USING_HWTIMER10 +#ifdef SOC_SERIES_GD32F4xx +void TIMER0_TRG_CMT_TIMER10_IRQHandler(void) +#else +void TIMER10_IRQHandler(void) +#endif +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM10_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM10_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP); + rt_interrupt_leave(); +} +#endif + +#ifdef BSP_USING_HWTIMER11 +#ifdef SOC_SERIES_GD32F4xx +void TIMER7_BRK_TIMER11_IRQHandler(void) +#else +void TIMER10_IRQHandler(void) +#endif +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM11_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM11_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP); + rt_interrupt_leave(); +} +#endif + +#ifdef BSP_USING_HWTIMER13 +#ifdef SOC_SERIES_GD32F4xx +void TIMER7_TRG_CMT_TIMER13_IRQHandler(void) +#else +void TIMER10_IRQHandler(void) +#endif +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM13_INDEX].hwtimer_dev); + timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM13_INDEX].hwtimer_dev.parent.user_data, \ + TIMER_INT_UP); + rt_interrupt_leave(); +} +#endif static int rt_hwtimer_init(void) { @@ -532,10 +698,6 @@ static int rt_hwtimer_init(void) g_gd32_hwtimer[i].hwtimer_dev.ops = &g_gd32_hwtimer_ops; g_gd32_hwtimer[i].hwtimer_dev.info = &g_gd32_hwtimer[i].hwtimer_info; - rcu_periph_clock_enable(g_gd32_hwtimer[i].hw_data.rcu); - NVIC_SetPriority(g_gd32_hwtimer[i].hw_data.irqn, 0); - NVIC_EnableIRQ(g_gd32_hwtimer[i].hw_data.irqn); - timer_interrupt_enable(g_gd32_hwtimer[i].hw_data.reg_base, TIMER_INT_UP); ret = rt_device_hwtimer_register(&g_gd32_hwtimer[i].hwtimer_dev, \ g_gd32_hwtimer[i].dev_name, (void *)g_gd32_hwtimer[i].hw_data.reg_base); if (RT_EOK != ret) diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_pwm.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_pwm.c index a95c5d634a..a0ef9eebd4 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_pwm.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_pwm.c @@ -6,15 +6,21 @@ * Change Logs: * Date Author Notes * 2023-06-05 zengjianwei first version - * 2025-06-23 Yucai Liu Support for non-complementary PWM output with advanced timers + * 2025-06-23 Yucai Liu Support for non-complementary PWM output with + * advanced timers + * 2025-12-26 shihongchao Optimize the timer clock frequency acquisition + * method; optimize the gd32_pwm structure to make + * it easier to configure; optimize the RCU enable + * logic; optimize GPIO configuration to maintain + * floating input mode when channels are disabled, + * reducing power consumption. */ #include -#include #include #include -#ifdef RT_USING_PWM +#ifdef BSP_USING_PWM /* #define DRV_DEBUG */ #define LOG_TAG "drv.pwm" @@ -24,208 +30,186 @@ #define MIN_PERIOD 3 #define MIN_PULSE 2 -typedef struct -{ - rt_int8_t TimerIndex; /* timer index:0~13 */ - rt_uint32_t Port; /* gpio port:GPIOA/GPIOB/GPIOC/... */ - rt_uint32_t pin; /* gpio pin:GPIO_PIN_0~GPIO_PIN_15 */ - /* timer channel: -2 is ch_1n, -1 is ch_0n, 0 is ch0, 1 is ch1 */ - rt_int16_t channel; - char *name; -} TIMER_PORT_CHANNEL_MAP_S; +typedef struct{ + uint32_t gpio_port; + uint32_t gpio_af; + uint16_t gpio_pin; +}channel_type; struct gd32_pwm { - struct rt_device_pwm pwm_device; - TIMER_PORT_CHANNEL_MAP_S tim_handle; + struct rt_device_pwm pwm_device; /* 继承pwm设备 */ + char *name; /* 设备名称 */ + uint32_t timerx; /* PWM依赖的的硬件定时器 */ + rcu_clock_freq_enum apb_of; /* TIMER从属的APB总线 */ + channel_type channels[4]; /* PWM通道 */ + channel_type nchannels[3]; /* PWM反相通道, 只有高级定时器支持 */ }; static struct gd32_pwm gd32_pwm_obj[] = { -#ifdef RT_USING_PWM1 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm1"}}, -#endif - -#ifdef RT_USING_PWM2 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm2"}}, -#endif - -#ifdef RT_USING_PWM3 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm3"}}, +#ifdef BSP_USING_PWM0 + { + .name = "pwm0", + .timerx = TIMER0, + .apb_of = CK_APB2, + .channels = { + {GPIOC, GPIO_AF_1, GPIO_PIN_0}, + {GPIOA, GPIO_AF_1, GPIO_PIN_1}, + {GPIOA, GPIO_AF_1, GPIO_PIN_2}, + {GPIOA, GPIO_AF_1, GPIO_PIN_3}, + }, + .nchannels = { + {GPIOB, GPIO_AF_1, GPIO_PIN_13}, + {GPIOB, GPIO_AF_1, GPIO_PIN_14}, + {GPIOB, GPIO_AF_1, GPIO_PIN_15}, + } + }, #endif -#ifdef RT_USING_PWM4 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm4"}}, +#ifdef BSP_USING_PWM1 + { + .name = "pwm1", + .timerx = TIMER1, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + {GPIOA, GPIO_AF_1, GPIO_PIN_1}, + {GPIOA, GPIO_AF_1, GPIO_PIN_2}, + {GPIOB, GPIO_AF_1, GPIO_PIN_2}, + }, + }, #endif -#ifdef RT_USING_PWM5 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm5"}}, +#ifdef BSP_USING_PWM2 + { + .name = "pwm2", + .timerx = TIMER2, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_6}, + {GPIOA, GPIO_AF_1, GPIO_PIN_7}, + {GPIOB, GPIO_AF_2, GPIO_PIN_0}, + {GPIOB, GPIO_AF_2, GPIO_PIN_1}, + }, + }, #endif -#ifdef RT_USING_PWM6 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm6"}}, +#ifdef BSP_USING_PWM3 + { + .name = "pwm3", + .timerx = TIMER3, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + {GPIOA, GPIO_AF_1, GPIO_PIN_1}, + {GPIOA, GPIO_AF_1, GPIO_PIN_2}, + {GPIOA, GPIO_AF_1, GPIO_PIN_3}, + }, + }, #endif -#ifdef RT_USING_PWM7 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm7"}}, +#ifdef BSP_USING_PWM4 + { + .name = "pwm4", + .timerx = TIMER4, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_2, GPIO_PIN_0}, + {GPIOA, GPIO_AF_2, GPIO_PIN_1}, + {GPIOA, GPIO_AF_1, GPIO_PIN_2}, + {GPIOA, GPIO_AF_1, GPIO_PIN_3}, + }, + }, #endif -#ifdef RT_USING_PWM8 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm8"}}, +#ifdef BSP_USING_PWM7 + { + .name = "pwm7", + .timerx = TIMER7, + .apb_of = CK_APB2, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + {GPIOA, GPIO_AF_1, GPIO_PIN_1}, + {GPIOC, GPIO_AF_1, GPIO_PIN_8}, + {GPIOA, GPIO_AF_1, GPIO_PIN_3}, + }, + .nchannels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_5}, + {GPIOB, GPIO_AF_1, GPIO_PIN_0}, + {GPIOB, GPIO_AF_1, GPIO_PIN_1}, + } + }, #endif -#ifdef RT_USING_PWM9 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm9"}}, +#ifdef BSP_USING_PWM8 + { + .name = "pwm8", + .timerx = TIMER8, + .apb_of = CK_APB2, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_2}, + {GPIOA, GPIO_AF_3, GPIO_PIN_3}, + }, // L1通用定时器为两通道定时器 + }, #endif -#ifdef RT_USING_PWM10 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm10"}}, +#ifdef BSP_USING_PWM9 + { + .name = "pwm9", + .timerx = TIMER9, + .apb_of = CK_APB2, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + }, // L2通用定时器为单通道定时器 + }, #endif -#ifdef RT_USING_PWM11 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm11"}}, +#ifdef BSP_USING_PWM10 + { + .name = "pwm10", + .timerx = TIMER10, + .apb_of = CK_APB2, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + }, // L2通用定时器为单通道定时器 + }, #endif -#ifdef RT_USING_PWM12 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm12"}}, +#ifdef BSP_USING_PWM11 + { + .name = "pwm11", + .timerx = TIMER11, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + {GPIOA, GPIO_AF_1, GPIO_PIN_1}, + }, // L1通用定时器为两通道定时器 + }, #endif -#ifdef RT_USING_PWM13 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm13"}}, +#ifdef BSP_USING_PWM12 + { + .name = "pwm12", + .timerx = TIMER12, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_0}, + }, // L2通用定时器为单通道定时器 + }, #endif -#ifdef RT_USING_PWM14 - {.tim_handle = {3, GPIOB, GPIO_PIN_8, 2, "pwm14"}}, +#ifdef BSP_USING_PWM13 + { + .name = "pwm13", + .timerx = TIMER13, + .apb_of = CK_APB1, + .channels = { + {GPIOA, GPIO_AF_1, GPIO_PIN_7}, + }, // L2通用定时器为单通道定时器 + }, #endif }; -typedef struct -{ - rt_uint32_t Port[7]; - rt_int8_t TimerIndex[14]; -} TIMER_PERIPH_LIST_S; - -static TIMER_PERIPH_LIST_S gd32_timer_periph_list = { - .Port = {0, 0, 0, 0, 0, 0, 0}, - .TimerIndex = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -}; - -/* - * 将所有用到的 gpio port 和 timer 不重复地列举出来,以方便后面不重复地初始化 - */ -static rt_err_t pwm_find_timer_periph(void) -{ - rt_int16_t i, j, k; - - /* find gpio port of defined table */ - for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) - { - /* find -1 of gd32_periph_list's member of Port */ - for (j = 0; j < sizeof(gd32_timer_periph_list.Port) / sizeof(gd32_timer_periph_list.Port[0]); ++j) - { - if (0 == gd32_timer_periph_list.Port[j]) - { - break; - } - } - - if (j >= sizeof(gd32_timer_periph_list.Port) / sizeof(gd32_timer_periph_list.Port[0])) - { - LOG_E("Can not find -1 of gd32_periph_list's member of Port!\n"); - break; - } - - /* find the different of Port */ - for (k = 0; k < j; ++k) - { - if (gd32_pwm_obj[i].tim_handle.Port == gd32_timer_periph_list.Port[k]) - { - break; - } - } - - /* if can not find the same Port */ - if (k == j) - { - gd32_timer_periph_list.Port[j] = gd32_pwm_obj[i].tim_handle.Port; - } - } - - /* find timer periph of defined table */ - for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) - { - /* find -1 of gd32_periph_list's member of TimerIndex */ - for (j = 0; j < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++j) - { - if (-1 == gd32_timer_periph_list.TimerIndex[j]) - { - break; - } - } - - if (j >= sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0])) - { - LOG_E("Can not find -1 of gd32_periph_list's member of TimerIndex!\n"); - break; - } - - /* find the different of TimerIndex */ - for (k = 0; k < j; ++k) - { - if (gd32_pwm_obj[i].tim_handle.TimerIndex == gd32_timer_periph_list.TimerIndex[k]) - { - break; - } - } - - /* if can not find the same TimerIndex */ - if (k == j) - { - gd32_timer_periph_list.TimerIndex[j] = gd32_pwm_obj[i].tim_handle.TimerIndex; - } - } - - return RT_EOK; -} - -static rt_uint32_t index_to_timer(rt_int8_t TimerIndex) -{ - switch (TimerIndex) - { - case 0: - return TIMER0; - case 1: - return TIMER1; - case 2: - return TIMER2; - case 3: - return TIMER3; - case 4: - return TIMER4; - case 5: - return TIMER5; - case 6: - return TIMER6; - case 7: - return TIMER7; - case 8: - return TIMER8; - case 9: - return TIMER9; - case 10: - return TIMER10; - case 11: - return TIMER11; - case 12: - return TIMER12; - case 13: - return TIMER13; - - default: - LOG_E("Unsport timer periph!\n"); - } - return TIMER0; -} - static void gpio_clock_enable(rt_uint32_t Port) { switch (Port) @@ -257,54 +241,52 @@ static void gpio_clock_enable(rt_uint32_t Port) } } -static void timer_clock_enable(rt_int8_t TimerIndex) +static void timer_clock_enable(uint32_t timer) { - switch (TimerIndex) + switch (timer) { - case 0: + case TIMER0: rcu_periph_clock_enable(RCU_TIMER0); break; - case 1: + case TIMER1: rcu_periph_clock_enable(RCU_TIMER1); break; - case 2: + case TIMER2: rcu_periph_clock_enable(RCU_TIMER2); break; - case 3: + case TIMER3: rcu_periph_clock_enable(RCU_TIMER3); break; - case 4: + case TIMER4: rcu_periph_clock_enable(RCU_TIMER4); break; - case 5: + case TIMER5: rcu_periph_clock_enable(RCU_TIMER5); break; - case 6: + case TIMER6: rcu_periph_clock_enable(RCU_TIMER6); break; - case 7: + case TIMER7: rcu_periph_clock_enable(RCU_TIMER7); break; -#ifndef GD32F30X_HD - case 8: + case TIMER8: rcu_periph_clock_enable(RCU_TIMER8); break; - case 9: + case TIMER9: rcu_periph_clock_enable(RCU_TIMER9); break; - case 10: + case TIMER10: rcu_periph_clock_enable(RCU_TIMER10); break; - case 11: + case TIMER11: rcu_periph_clock_enable(RCU_TIMER11); break; - case 12: + case TIMER12: rcu_periph_clock_enable(RCU_TIMER12); break; - case 13: + case TIMER13: rcu_periph_clock_enable(RCU_TIMER13); break; -#endif default: LOG_E("Unsport timer periph!\n"); } @@ -314,96 +296,168 @@ static void rcu_config(void) { rt_int16_t i; - for (i = 0; i < sizeof(gd32_timer_periph_list.Port) / sizeof(gd32_timer_periph_list.Port[0]); ++i) + for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) { - if (0 == gd32_timer_periph_list.Port[i]) + /* enable GPIO clock */ + switch (gd32_pwm_obj[i].timerx) { + /* 高级定时器 */ + case TIMER0: + case TIMER7: + gpio_clock_enable(gd32_pwm_obj[i].nchannels[0].gpio_port); + gpio_clock_enable(gd32_pwm_obj[i].nchannels[1].gpio_port); + gpio_clock_enable(gd32_pwm_obj[i].nchannels[2].gpio_port); + + /* L0 通用定时器 */ + case TIMER1: + case TIMER2: + case TIMER3: + case TIMER4: + gpio_clock_enable(gd32_pwm_obj[i].channels[2].gpio_port); + gpio_clock_enable(gd32_pwm_obj[i].channels[3].gpio_port); + + /* L1 通用定时器 */ + case TIMER8: + case TIMER11: + gpio_clock_enable(gd32_pwm_obj[i].channels[1].gpio_port); + + /* L2 通用定时器 */ + case TIMER9: + case TIMER10: + case TIMER12: + case TIMER13: + gpio_clock_enable(gd32_pwm_obj[i].channels[0].gpio_port); + break; + + default: + LOG_E("Unsport timer periph at rcu_config!\n"); break; } - - /* enable GPIO clock */ - gpio_clock_enable(gd32_timer_periph_list.Port[i]); } - rcu_periph_clock_enable(RCU_AF); - - for (i = 0; i < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++i) + for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) { - if (-1 == gd32_timer_periph_list.TimerIndex[i]) - { - break; - } - /* enable timer clock */ - timer_clock_enable(gd32_timer_periph_list.TimerIndex[i]); - timer_deinit(index_to_timer(gd32_timer_periph_list.TimerIndex[i])); + timer_clock_enable(gd32_pwm_obj[i].timerx); + timer_deinit(gd32_pwm_obj[i].timerx); } } -static void gpio_config(void) +/** + * @brief 配置PWM输出引脚为pwm输出模式 + * @param pwm pwm 对象 + * @param configuration pwm驱动框架传递的配置信息 + */ +static void gpio_config_pwmout(const struct gd32_pwm *pwm, + const struct rt_pwm_configuration *configuration) { - rt_int16_t i; - - /* config the GPIO as analog mode */ - for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) + channel_type channel; + uint8_t channel_num = configuration->channel; + if(configuration->complementary) { - gpio_init(gd32_pwm_obj[i].tim_handle.Port, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, gd32_pwm_obj[i].tim_handle.pin); + if(channel_num > 3) channel_num = 3; + channel = pwm->nchannels[channel_num-1]; } + else + { + if(channel_num > 4) channel_num = 4; + channel = pwm->channels[channel_num-1]; + } + gpio_mode_set(channel.gpio_port, GPIO_MODE_AF, GPIO_PUPD_NONE, channel.gpio_pin); + gpio_output_options_set(channel.gpio_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, channel.gpio_pin); + gpio_af_set(channel.gpio_port, channel.gpio_af, channel.gpio_pin); } -static void timer_init_para(timer_parameter_struct *initpara) +/** + * @brief 配置PWM输出引脚为pwm浮空输入模式 + * @param pwm pwm 对象 + * @param configuration pwm驱动框架传递的配置信息 + */ +static void gpio_config_input(const struct gd32_pwm *pwm, + const struct rt_pwm_configuration *configuration) { - rt_int16_t i; - - for (i = 0; i < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++i) + channel_type channel = {0}; + uint8_t channel_num = configuration->channel; + if(configuration->complementary) { - /* config timer */ - if (-1 != gd32_timer_periph_list.TimerIndex[i]) - { - timer_init(index_to_timer(gd32_timer_periph_list.TimerIndex[i]), initpara); - } + if(channel_num > 3) channel_num = 3; + channel = pwm->nchannels[channel_num-1]; + } + else + { + if(channel_num > 4) channel_num = 4; + channel = pwm->channels[channel_num-1]; } + gpio_mode_set(channel.gpio_port, GPIO_MODE_INPUT, GPIO_PUPD_NONE, channel.gpio_pin); } -static void channel_output_config(timer_oc_parameter_struct *ocpara) +static void channel_output_config(rt_uint32_t timer_periph, timer_oc_parameter_struct *ocpara) { rt_int16_t i; - rt_uint32_t timer_periph; - /* config the channel config */ - for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) + switch (timer_periph) { - if (gd32_pwm_obj[i].tim_handle.channel < 0) - { - ocpara->outputstate = TIMER_CCX_DISABLE; - ocpara->outputnstate = TIMER_CCXN_ENABLE; - gd32_pwm_obj[i].tim_handle.channel = -(gd32_pwm_obj[i].tim_handle.channel + 1); - } - timer_periph = index_to_timer(gd32_pwm_obj[i].tim_handle.TimerIndex); - timer_channel_output_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, ocpara); + /* 高级定时器 */ + case TIMER0: + case TIMER7: + timer_primary_output_config(timer_periph, ENABLE); + + /* L0通用定时器 */ + case TIMER1: + case TIMER2: + case TIMER3: + case TIMER4: + timer_channel_output_config(timer_periph, TIMER_CH_2, ocpara); + timer_channel_output_pulse_value_config(timer_periph, TIMER_CH_2, 7999); + timer_channel_output_mode_config(timer_periph, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(timer_periph, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE); + /* auto-reload preload shadow reg enable */ + /* timer_auto_reload_shadow_enable(timer_periph); */ + timer_channel_output_state_config(timer_periph, TIMER_CH_2, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(timer_periph, TIMER_CH_2, TIMER_CCXN_DISABLE); - timer_channel_output_pulse_value_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, 7999); - timer_channel_output_mode_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, TIMER_OC_MODE_PWM0); - timer_channel_output_shadow_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, TIMER_OC_SHADOW_DISABLE); + timer_channel_output_config(timer_periph, TIMER_CH_3, ocpara); + timer_channel_output_pulse_value_config(timer_periph, TIMER_CH_3, 7999); + timer_channel_output_mode_config(timer_periph, TIMER_CH_3, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(timer_periph, TIMER_CH_3, TIMER_OC_SHADOW_DISABLE); /* auto-reload preload shadow reg enable */ /* timer_auto_reload_shadow_enable(timer_periph); */ - timer_channel_output_state_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, TIMER_CCX_DISABLE); - timer_channel_complementary_output_state_config(timer_periph, gd32_pwm_obj[i].tim_handle.channel, TIMER_CCXN_DISABLE); + timer_channel_output_state_config(timer_periph, TIMER_CH_3, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(timer_periph, TIMER_CH_3, TIMER_CCXN_DISABLE); + + /* L1通用定时器 */ + case TIMER8: + case TIMER11: + timer_channel_output_config(timer_periph, TIMER_CH_1, ocpara); + timer_channel_output_pulse_value_config(timer_periph, TIMER_CH_1, 7999); + timer_channel_output_mode_config(timer_periph, TIMER_CH_1, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(timer_periph, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); + /* auto-reload preload shadow reg enable */ + /* timer_auto_reload_shadow_enable(timer_periph); */ + timer_channel_output_state_config(timer_periph, TIMER_CH_1, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(timer_periph, TIMER_CH_1, TIMER_CCXN_DISABLE); + + /* L2通用定时器 */ + case TIMER9: + case TIMER10: + case TIMER12: + case TIMER13: + timer_channel_output_config(timer_periph, TIMER_CH_0, ocpara); + timer_channel_output_pulse_value_config(timer_periph, TIMER_CH_0, 7999); + timer_channel_output_mode_config(timer_periph, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(timer_periph, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + /* auto-reload preload shadow reg enable */ + /* timer_auto_reload_shadow_enable(timer_periph); */ + timer_channel_output_state_config(timer_periph, TIMER_CH_0, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(timer_periph, TIMER_CH_0, TIMER_CCXN_DISABLE); + break; + + default: + LOG_E("Unsport timer periph at channel_output_config!\n"); + break; } - /* enable timer */ - for (i = 0; i < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++i) - { - if (-1 != gd32_timer_periph_list.TimerIndex[i]) - { - timer_periph = index_to_timer(gd32_timer_periph_list.TimerIndex[i]); - if (timer_periph == TIMER0 || timer_periph == TIMER7) - { - timer_primary_output_config(timer_periph, ENABLE); - } - timer_enable(timer_periph); - } - } + timer_enable(timer_periph); } static void timer_config(void) @@ -412,58 +466,76 @@ static void timer_config(void) timer_parameter_struct timer_initpara; /* TIMER configuration */ - timer_initpara.prescaler = 119; + timer_initpara.prescaler = 199; timer_initpara.alignedmode = TIMER_COUNTER_EDGE; timer_initpara.counterdirection = TIMER_COUNTER_UP; timer_initpara.period = 15999; timer_initpara.clockdivision = TIMER_CKDIV_DIV1; timer_initpara.repetitioncounter = 0; - timer_init_para(&timer_initpara); + for (size_t i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) + { + timer_init(gd32_pwm_obj[i].timerx, &timer_initpara); + } /* CHX configuration in PWM mode */ - timer_ocintpara.outputstate = TIMER_CCX_ENABLE; + timer_ocintpara.outputstate = TIMER_CCX_DISABLE; timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE; timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH; timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; - channel_output_config(&timer_ocintpara); + /* config the channel config */ + for (size_t i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); ++i) + { + channel_output_config(gd32_pwm_obj[i].timerx, &timer_ocintpara); + } } -static rt_err_t drv_pwm_enable(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm_configuration *configuration, +static rt_err_t drv_pwm_enable(struct gd32_pwm *pwm, const struct rt_pwm_configuration *configuration, rt_bool_t enable) { if (!enable) { - timer_channel_output_state_config(index_to_timer(pstTimerMap->TimerIndex), configuration->channel, - TIMER_CCX_DISABLE); + gpio_config_input(pwm, configuration); + if (configuration->complementary == RT_TRUE) + { + timer_channel_complementary_output_state_config(pwm->timerx, configuration->channel-1, + TIMER_CCXN_DISABLE); + } + else + { + timer_channel_output_state_config(pwm->timerx, configuration->channel-1, + TIMER_CCX_DISABLE); + } } else { + gpio_config_pwmout(pwm, configuration); if (configuration->complementary == RT_TRUE) { - timer_channel_output_state_config( - index_to_timer(pstTimerMap->TimerIndex), configuration->channel - 1, TIMER_CCXN_ENABLE); + timer_channel_complementary_output_state_config(pwm->timerx, configuration->channel-1, + TIMER_CCXN_ENABLE); } else { - timer_channel_output_state_config( - index_to_timer(pstTimerMap->TimerIndex), configuration->channel, TIMER_CCX_ENABLE); + timer_channel_output_state_config(pwm->timerx, configuration->channel-1, + TIMER_CCX_ENABLE); } } return RT_EOK; } -static rt_err_t drv_pwm_get(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm_configuration *configuration) +static rt_err_t drv_pwm_get(const struct gd32_pwm *pwm, struct rt_pwm_configuration *configuration) { rt_uint64_t tim_clock; rt_uint16_t psc; rt_uint32_t chxcv; - tim_clock = rcu_clock_freq_get(CK_SYS); + rt_uint8_t coef = (RCU_CFG1&RCU_CFG1_TIMERSEL)?4:2; + tim_clock = rcu_clock_freq_get(pwm->apb_of)*coef; - psc = timer_prescaler_read(index_to_timer(pstTimerMap->TimerIndex)); + psc = timer_prescaler_read(pwm->timerx); if (psc == TIMER_CKDIV_DIV2) { tim_clock = tim_clock / 2; @@ -473,21 +545,22 @@ static rt_err_t drv_pwm_get(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm tim_clock = tim_clock / 4; } - chxcv = timer_channel_capture_value_register_read(index_to_timer(pstTimerMap->TimerIndex), configuration->channel); + chxcv = timer_channel_capture_value_register_read(pwm->timerx, configuration->channel-1); /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ tim_clock /= 1000000UL; - configuration->period = (TIMER_CAR(index_to_timer(pstTimerMap->TimerIndex)) + 1) * (psc + 1) * 1000UL / tim_clock; + configuration->period = (TIMER_CAR(pwm->timerx) + 1) * (psc + 1) * 1000UL / tim_clock; configuration->pulse = (chxcv + 1) * (psc + 1) * 1000UL / tim_clock; return RT_EOK; } -static rt_err_t drv_pwm_set(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm_configuration *configuration) +static rt_err_t drv_pwm_set(struct gd32_pwm *pwm, struct rt_pwm_configuration *configuration) { rt_uint32_t period, pulse; rt_uint64_t tim_clock, psc; - tim_clock = rcu_clock_freq_get(CK_SYS); + rt_uint8_t coef = (RCU_CFG1&RCU_CFG1_TIMERSEL)?4:2; + tim_clock = rcu_clock_freq_get(pwm->apb_of)*coef; /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ tim_clock /= 1000000UL; @@ -495,14 +568,14 @@ static rt_err_t drv_pwm_set(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm psc = period / MAX_PERIOD + 1; period = period / psc; - timer_prescaler_config(index_to_timer(pstTimerMap->TimerIndex), psc - 1, TIMER_PSC_RELOAD_NOW); + timer_prescaler_config(pwm->timerx, psc - 1, TIMER_PSC_RELOAD_NOW); if (period < MIN_PERIOD) { period = MIN_PERIOD; } - timer_autoreload_value_config(index_to_timer(pstTimerMap->TimerIndex), period - 1); + timer_autoreload_value_config(pwm->timerx, period - 1); pulse = (unsigned long long)configuration->pulse * tim_clock / psc / 1000ULL; if (pulse < MIN_PULSE) @@ -514,11 +587,11 @@ static rt_err_t drv_pwm_set(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm pulse = period; } - timer_channel_output_pulse_value_config(index_to_timer(pstTimerMap->TimerIndex), configuration->channel, pulse); - timer_counter_value_config(index_to_timer(pstTimerMap->TimerIndex), 0); + timer_channel_output_pulse_value_config(pwm->timerx, configuration->channel-1, pulse); + timer_counter_value_config(pwm->timerx, 0); /* Update frequency value */ - timer_event_software_generate(index_to_timer(pstTimerMap->TimerIndex), TIMER_EVENT_SRC_UPG); + timer_event_software_generate(pwm->timerx, TIMER_EVENT_SRC_UPG); return RT_EOK; } @@ -526,18 +599,18 @@ static rt_err_t drv_pwm_set(TIMER_PORT_CHANNEL_MAP_S *pstTimerMap, struct rt_pwm static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg) { struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg; - TIMER_PORT_CHANNEL_MAP_S *pstTimerMap = (TIMER_PORT_CHANNEL_MAP_S *)device->parent.user_data; + struct gd32_pwm *pwm = (struct gd32_pwm *)device; switch (cmd) { case PWM_CMD_ENABLE: - return drv_pwm_enable(pstTimerMap, configuration, RT_TRUE); + return drv_pwm_enable(pwm, configuration, RT_TRUE); case PWM_CMD_DISABLE: - return drv_pwm_enable(pstTimerMap, configuration, RT_FALSE); + return drv_pwm_enable(pwm, configuration, RT_FALSE); case PWM_CMD_SET: - return drv_pwm_set(pstTimerMap, configuration); + return drv_pwm_set(pwm, configuration); case PWM_CMD_GET: - return drv_pwm_get(pstTimerMap, configuration); + return drv_pwm_get(pwm, configuration); default: return -RT_EINVAL; } @@ -547,15 +620,18 @@ static struct rt_pwm_ops drv_ops = {drv_pwm_control}; static rt_err_t gd32_hw_pwm_init(void) { - pwm_find_timer_periph(); rcu_config(); - gpio_config(); timer_config(); + /* + * gpio 此处不配置,当pwm通道使能时会配置为pwmout,失能时会配置为浮空输入 + * gpio 默认为浮空输入 + */ + return RT_EOK; } -static int gd32_pwm_init(void) +static int rt_hw_pwm_init(void) { int i = 0; int result = RT_EOK; @@ -573,14 +649,14 @@ static int gd32_pwm_init(void) for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); i++) { /* register pwm device */ - if (rt_device_pwm_register(&gd32_pwm_obj[i].pwm_device, gd32_pwm_obj[i].tim_handle.name, &drv_ops, - &gd32_pwm_obj[i].tim_handle)== RT_EOK ) + if (rt_device_pwm_register(&gd32_pwm_obj[i].pwm_device, gd32_pwm_obj[i].name, &drv_ops, + RT_NULL)== RT_EOK ) { - LOG_D("%s register success", gd32_pwm_obj[i].tim_handle.name); + LOG_D("%s register success", gd32_pwm_obj[i].name); } else { - LOG_E("%s register failed", gd32_pwm_obj[i].tim_handle.name); + LOG_E("%s register failed", gd32_pwm_obj[i].name); result = -RT_ERROR; } } @@ -588,6 +664,6 @@ static int gd32_pwm_init(void) __exit: return result; } -INIT_DEVICE_EXPORT(gd32_pwm_init); +INIT_DEVICE_EXPORT(rt_hw_pwm_init); #endif /* RT_USING_PWM */ -- Gitee From f3a45ba2fd46bb4fc1bd7f6662bfcf3f0e0b626f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E9=B8=BF=E8=B6=85?= <13010364+shi-hongchao@user.noreply.gitee.com> Date: Sun, 11 Jan 2026 19:18:36 +0800 Subject: [PATCH 04/45] =?UTF-8?q?fix(bsp/gd32/arm):=20=E4=BF=AE=E5=A4=8Dgd?= =?UTF-8?q?32=E7=A1=AC=E4=BB=B6i2c=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 硬件i2c主机接收驱动采用方案B,但不支持接收小于3字节,现修复该问题 - 增加方案A。 --- bsp/gd32/arm/gd32405rg/.config | 20 +-- bsp/gd32/arm/gd32405rg/board/Kconfig | 29 +++ bsp/gd32/arm/gd32405rg/project.uvoptx | 166 +++++++----------- bsp/gd32/arm/gd32405rg/project.uvprojx | 38 ++-- bsp/gd32/arm/gd32405rg/rtconfig.h | 16 +- .../arm/libraries/gd32_drivers/drv_hard_i2c.c | 86 +++++++-- 6 files changed, 200 insertions(+), 155 deletions(-) diff --git a/bsp/gd32/arm/gd32405rg/.config b/bsp/gd32/arm/gd32405rg/.config index d9defb3a43..8dcdda7301 100644 --- a/bsp/gd32/arm/gd32405rg/.config +++ b/bsp/gd32/arm/gd32405rg/.config @@ -1440,22 +1440,16 @@ CONFIG_BSP_USING_UART0=y # CONFIG_BSP_USING_UART3 is not set # CONFIG_BSP_USING_UART4 is not set # CONFIG_BSP_USING_UART5 is not set +CONFIG_BSP_USING_HARD_I2C=y +CONFIG_BSP_USING_RECEIVING_A=y +# CONFIG_BSP_USING_RECEIVING_B is not set +CONFIG_BSP_USING_HARD_I2C0=y +# CONFIG_BSP_USING_HARD_I2C1 is not set +# CONFIG_BSP_USING_HARD_I2C2 is not set # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_HWTIMER is not set -CONFIG_BSP_USING_PWM=y -CONFIG_BSP_USING_PWM0=y -CONFIG_BSP_USING_PWM1=y -CONFIG_BSP_USING_PWM2=y -CONFIG_BSP_USING_PWM3=y -CONFIG_BSP_USING_PWM4=y -CONFIG_BSP_USING_PWM7=y -CONFIG_BSP_USING_PWM8=y -CONFIG_BSP_USING_PWM9=y -CONFIG_BSP_USING_PWM10=y -CONFIG_BSP_USING_PWM11=y -CONFIG_BSP_USING_PWM12=y -CONFIG_BSP_USING_PWM13=y +# CONFIG_BSP_USING_PWM is not set # CONFIG_BSP_USING_ONCHIP_RTC is not set # CONFIG_BSP_USING_WDT is not set # CONFIG_BSP_USING_SDIO is not set diff --git a/bsp/gd32/arm/gd32405rg/board/Kconfig b/bsp/gd32/arm/gd32405rg/board/Kconfig index ea08346a41..36805b18fb 100644 --- a/bsp/gd32/arm/gd32405rg/board/Kconfig +++ b/bsp/gd32/arm/gd32405rg/board/Kconfig @@ -232,6 +232,35 @@ menu "On-chip Peripheral Drivers" default 32 endif + menuconfig BSP_USING_HARD_I2C + bool "Enable I2C" + select RT_USING_I2C + default n + if BSP_USING_HARD_I2C + choice + prompt "Select I2C Receiving Scheme" + default BSP_USING_RECEIVING_A + + config BSP_USING_RECEIVING_A + bool "master receiving secheme A --- requires that the software be capable of responding quickly to the 12C event." + + config BSP_USING_RECEIVING_B + bool "master receiving secheme B --- don't requires that the software be capable of responding quickly to the 12C event." + endchoice + + config BSP_USING_HARD_I2C0 + bool "enable hard I2C0" + default n + + config BSP_USING_HARD_I2C1 + bool "enable hard I2C1" + default n + + config BSP_USING_HARD_I2C2 + bool "enable hard I2C2" + default n + endif + menuconfig BSP_USING_SPI bool "Enable SPI BUS" default n diff --git a/bsp/gd32/arm/gd32405rg/project.uvoptx b/bsp/gd32/arm/gd32405rg/project.uvoptx index e8e6ea1538..7fd705460a 100644 --- a/bsp/gd32/arm/gd32405rg/project.uvoptx +++ b/bsp/gd32/arm/gd32405rg/project.uvoptx @@ -117,26 +117,6 @@ BIN\CMSIS_AGDI.dll - - 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 - - - 0 - DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) - - - 0 - ARMDBGFLAGS - - - - 0 - DLGUARM - - 0 CMSIS_AGDI @@ -155,12 +135,12 @@ 0 0 - 1 + 0 0 0 0 0 - 1 + 0 0 0 0 @@ -191,16 +171,6 @@ - - - System Viewer\TIMER1 - 35905 - - - System Viewer\TIMER2 - 35904 - - @@ -577,6 +547,18 @@ 0 0 0 + ..\libraries\gd32_drivers\drv_hard_i2c.c + drv_hard_i2c.c + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 ..\libraries\gd32_drivers\drv_hwtimer.c drv_hwtimer.c 0 @@ -584,7 +566,7 @@ 4 - 30 + 31 1 0 0 @@ -596,7 +578,7 @@ 4 - 31 + 32 1 0 0 @@ -616,49 +598,49 @@ 0 5 - 32 + 33 1 0 0 0 - ..\..\..\..\components\finsh\msh_parse.c - msh_parse.c + ..\..\..\..\components\finsh\msh.c + msh.c 0 0 5 - 33 + 34 1 0 0 0 - ..\..\..\..\components\finsh\shell.c - shell.c + ..\..\..\..\components\finsh\cmd.c + cmd.c 0 0 5 - 34 + 35 1 0 0 0 - ..\..\..\..\components\finsh\msh.c - msh.c + ..\..\..\..\components\finsh\shell.c + shell.c 0 0 5 - 35 + 36 1 0 0 0 - ..\..\..\..\components\finsh\cmd.c - cmd.c + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c 0 0 @@ -672,7 +654,7 @@ 0 6 - 36 + 37 1 0 0 @@ -684,7 +666,7 @@ 6 - 37 + 38 1 0 0 @@ -696,7 +678,7 @@ 6 - 38 + 39 1 0 0 @@ -708,7 +690,7 @@ 6 - 39 + 40 1 0 0 @@ -720,7 +702,7 @@ 6 - 40 + 41 1 0 0 @@ -732,7 +714,7 @@ 6 - 41 + 42 1 0 0 @@ -744,7 +726,7 @@ 6 - 42 + 43 1 0 0 @@ -756,7 +738,7 @@ 6 - 43 + 44 1 0 0 @@ -768,7 +750,7 @@ 6 - 44 + 45 1 0 0 @@ -780,7 +762,7 @@ 6 - 45 + 46 1 0 0 @@ -792,7 +774,7 @@ 6 - 46 + 47 1 0 0 @@ -804,7 +786,7 @@ 6 - 47 + 48 1 0 0 @@ -816,7 +798,7 @@ 6 - 48 + 49 1 0 0 @@ -828,7 +810,7 @@ 6 - 49 + 50 1 0 0 @@ -840,7 +822,7 @@ 6 - 50 + 51 1 0 0 @@ -860,19 +842,19 @@ 0 7 - 51 + 52 1 0 0 0 - ..\..\..\..\src\klibc\kstring.c - kstring.c + ..\..\..\..\src\klibc\kerrno.c + kerrno.c 0 0 7 - 52 + 53 1 0 0 @@ -884,19 +866,19 @@ 7 - 53 + 54 1 0 0 0 - ..\..\..\..\src\klibc\kerrno.c - kerrno.c + ..\..\..\..\src\klibc\kstring.c + kstring.c 0 0 7 - 54 + 55 1 0 0 @@ -908,7 +890,7 @@ 7 - 55 + 56 1 0 0 @@ -928,7 +910,7 @@ 0 8 - 56 + 57 1 0 0 @@ -940,7 +922,7 @@ 8 - 57 + 58 1 0 0 @@ -952,7 +934,7 @@ 8 - 58 + 59 1 0 0 @@ -964,7 +946,7 @@ 8 - 59 + 60 2 0 0 @@ -976,7 +958,7 @@ 8 - 60 + 61 1 0 0 @@ -990,13 +972,13 @@ Libraries - 1 + 0 0 0 0 9 - 61 + 62 2 0 0 @@ -1008,7 +990,7 @@ 9 - 62 + 63 1 0 0 @@ -1020,7 +1002,7 @@ 9 - 63 + 64 1 0 0 @@ -1032,7 +1014,7 @@ 9 - 64 + 65 1 0 0 @@ -1044,7 +1026,7 @@ 9 - 65 + 66 1 0 0 @@ -1056,7 +1038,7 @@ 9 - 66 + 67 1 0 0 @@ -1068,7 +1050,7 @@ 9 - 67 + 68 1 0 0 @@ -1080,7 +1062,7 @@ 9 - 68 + 69 1 0 0 @@ -1092,7 +1074,7 @@ 9 - 69 + 70 1 0 0 @@ -1104,7 +1086,7 @@ 9 - 70 + 71 1 0 0 @@ -1114,18 +1096,6 @@ 0 0 - - 9 - 71 - 1 - 0 - 0 - 0 - .\packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c - gd32f4xx_timer.c - 0 - 0 - diff --git a/bsp/gd32/arm/gd32405rg/project.uvprojx b/bsp/gd32/arm/gd32405rg/project.uvprojx index 9ab03ac12e..69f501cf6d 100644 --- a/bsp/gd32/arm/gd32405rg/project.uvprojx +++ b/bsp/gd32/arm/gd32405rg/project.uvprojx @@ -338,9 +338,9 @@ 0 - RT_USING_LIBC, HXTAL_VALUE=8000000U, RT_USING_ARMLIBC, USE_STDPERIPH_DRIVER, __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND, GD32F405, __STDC_LIMIT_MACROS + RT_USING_LIBC, GD32F405, __RTTHREAD__, USE_STDPERIPH_DRIVER, __CLK_TCK=RT_TICK_PER_SECOND, RT_USING_ARMLIBC, __STDC_LIMIT_MACROS, HXTAL_VALUE=8000000U - packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;packages\gd32-arm-cmsis-latest\GD32F4xx;.;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\smp_call;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\net\utest;applications;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\drivers\include;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\drivers\phy;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;board;..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\libcpu\arm\common;..\..\..\..\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\libraries\gd32_drivers;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\eventfd + applications;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\libc\posix\io\eventfd;board;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\smp_call;..\..\..\..\libcpu\arm\common;..\..\..\..\components\drivers\include;..\..\..\..\libcpu\arm\cortex-m4;packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;..\..\..\..\components\libc\posix\io\epoll;..\libraries\gd32_drivers;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\net\utest;..\..\..\..\components\drivers\phy;..\..\..\..\include;packages\gd32-arm-cmsis-latest\GD32F4xx;.;..\..\..\..\components\drivers\include;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include @@ -1406,6 +1406,11 @@ 1 ..\libraries\gd32_drivers\drv_gpio.c + + drv_hard_i2c.c + 1 + ..\libraries\gd32_drivers\drv_hard_i2c.c + drv_hwtimer.c 1 @@ -1427,24 +1432,24 @@ Finsh - msh_parse.c + msh.c 1 - ..\..\..\..\components\finsh\msh_parse.c + ..\..\..\..\components\finsh\msh.c - shell.c + cmd.c 1 - ..\..\..\..\components\finsh\shell.c + ..\..\..\..\components\finsh\cmd.c - msh.c + shell.c 1 - ..\..\..\..\components\finsh\msh.c + ..\..\..\..\components\finsh\shell.c - cmd.c + msh_parse.c 1 - ..\..\..\..\components\finsh\cmd.c + ..\..\..\..\components\finsh\msh_parse.c @@ -2297,9 +2302,9 @@ klibc - kstring.c + kerrno.c 1 - ..\..\..\..\src\klibc\kstring.c + ..\..\..\..\src\klibc\kerrno.c rt_vsscanf.c @@ -2307,9 +2312,9 @@ ..\..\..\..\src\klibc\rt_vsscanf.c - kerrno.c + kstring.c 1 - ..\..\..\..\src\klibc\kerrno.c + ..\..\..\..\src\klibc\kstring.c kstdio.c @@ -2406,11 +2411,6 @@ 1 packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c - - gd32f4xx_timer.c - 1 - .\packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c - diff --git a/bsp/gd32/arm/gd32405rg/rtconfig.h b/bsp/gd32/arm/gd32405rg/rtconfig.h index 598194241a..ad67872218 100644 --- a/bsp/gd32/arm/gd32405rg/rtconfig.h +++ b/bsp/gd32/arm/gd32405rg/rtconfig.h @@ -422,19 +422,9 @@ #define BSP_USING_GPIO #define BSP_USING_UART #define BSP_USING_UART0 -#define BSP_USING_PWM -#define BSP_USING_PWM0 -#define BSP_USING_PWM1 -#define BSP_USING_PWM2 -#define BSP_USING_PWM3 -#define BSP_USING_PWM4 -#define BSP_USING_PWM7 -#define BSP_USING_PWM8 -#define BSP_USING_PWM9 -#define BSP_USING_PWM10 -#define BSP_USING_PWM11 -#define BSP_USING_PWM12 -#define BSP_USING_PWM13 +#define BSP_USING_HARD_I2C +#define BSP_USING_RECEIVING_A +#define BSP_USING_HARD_I2C0 #define BSP_USING_GD_DBG /* end of On-chip Peripheral Drivers */ diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_hard_i2c.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_hard_i2c.c index 725b306fde..48dd5154e4 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_hard_i2c.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_hard_i2c.c @@ -6,6 +6,8 @@ * Change Logs: * Date Author Notes * 2021-12-20 BruceOu the first version + * 2026-01-11 ShiHongchao Fix the I2C master receive mode B software + * flow and add support for mode A */ #include "drv_hard_i2c.h" @@ -112,8 +114,8 @@ static const struct gd32_i2c_bus gd_i2c_config[] = { RCU_I2C0, RCU_GPIOB, RCU_GPIOB, /* periph clock, scl gpio clock, sda gpio clock */ - GPIOB, GPIO_AF_4, GPIO_PIN_6, /* scl port, scl alternate, scl pin */ - GPIOB, GPIO_AF_4, GPIO_PIN_7, /* sda port, sda alternate, sda pin */ + GPIOB, GPIO_AF_4, GPIO_PIN_8, /* scl port, scl alternate, scl pin */ + GPIOB, GPIO_AF_4, GPIO_PIN_9, /* sda port, sda alternate, sda pin */ &i2c0, "hwi2c0", @@ -229,13 +231,52 @@ static void gd32_i2c_gpio_init(const struct gd32_i2c_bus *i2c) static uint8_t gd32_i2c_read(rt_uint32_t i2c_periph, rt_uint8_t *p_buffer, rt_uint16_t data_byte) { if (data_byte == 0) return 1; - /* while there is data to be read */ +#ifdef BSP_USING_RECEIVING_A + /* + In single-byte reception, disable ACK because the master needs to send + NACK after receiving the first byte,indicating no more data will be + received, then immediately send the stop condition + */ + if(data_byte == 1) + { + /* disable acknowledge */ + i2c_ack_config(i2c_periph, I2C_ACK_DISABLE); + /* send a stop condition to I2C bus */ + i2c_stop_on_bus(i2c_periph); + } +#endif + + /* while there is data to be read */ while(data_byte) { #if defined (SOC_SERIES_GD32F5xx) || defined (SOC_SERIES_GD32F4xx) if(IS_I2C_LEGACY(i2c_periph)) { +#ifdef BSP_USING_RECEIVING_A + /* + After receiving the second-to-last byte, ACK should be disabled + and STOP should be set, to ensure that NACK is sent after receiving + the last byte and the stop condition is transmitted + */ + if(2 == data_byte) + { + /* wait until BTC bit is set */ + while(!i2c_flag_get(i2c_periph, I2C_FLAG_RBNE)); + /* disable acknowledge */ + i2c_ack_config(i2c_periph, I2C_ACK_DISABLE); + /* send a stop condition to I2C bus */ + i2c_stop_on_bus(i2c_periph); + } +#elif defined(BSP_USING_RECEIVING_B) + /* + For 3-byte reception: Wait for byte transfer completion, then + disable ACK so NACK is automatically sent after receiving the + last byte + For 2-byte reception: Wait for byte transfer completion, then + send stop condition to ensure direct stop after receiving the + last byte instead of sending ACK + */ if(3 == data_byte) { /* wait until BTC bit is set */ @@ -243,14 +284,16 @@ static uint8_t gd32_i2c_read(rt_uint32_t i2c_periph, rt_uint8_t *p_buffer, rt_ui /* disable acknowledge */ i2c_ack_config(i2c_periph, I2C_ACK_DISABLE); } - - if(2 == data_byte) + else if(2 == data_byte) { /* wait until BTC bit is set */ while(!i2c_flag_get(i2c_periph, I2C_FLAG_BTC)); /* send a stop condition to I2C bus */ i2c_stop_on_bus(i2c_periph); } +#else +#error "Please select the receiving secheme." +#endif /* wait until RBNE bit is set */ if(i2c_flag_get(i2c_periph, I2C_FLAG_RBNE)) { @@ -379,11 +422,18 @@ static rt_ssize_t gd32_i2c_master_xfer(struct rt_i2c_bus_device *bus, struct rt_ { i2c_stop_on_bus(gd32_i2c->i2c_periph); } - /* enable acknowledge */ + /* enable acknowledge */ i2c_ack_config(gd32_i2c->i2c_periph, I2C_ACK_ENABLE); - /* i2c master sends start signal only when the bus is idle */ + /* i2c master sends start signal only when the bus is idle */ while(i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_I2CBSY)); - /* send the start signal */ +#ifdef BSP_USING_RECEIVING_B + /* */ + if(msg->len == 2) + { + i2c_ackpos_config(gd32_i2c->i2c_periph, I2C_ACKPOS_NEXT); + } +#endif + /* send the start signal */ i2c_start_on_bus(gd32_i2c->i2c_periph); /* i2c master sends START signal successfully */ while(!i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_SBSEND)); @@ -391,14 +441,26 @@ static rt_ssize_t gd32_i2c_master_xfer(struct rt_i2c_bus_device *bus, struct rt_ i2c_master_addressing(gd32_i2c->i2c_periph, msg->addr, I2C_RECEIVER); while(!i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_ADDSEND)); - /* address flag set means i2c slave sends ACK */ +#ifdef BSP_USING_RECEIVING_B + if(msg->len <= 2) + { + i2c_ack_config(gd32_i2c->i2c_periph, I2C_ACK_DISABLE); + } +#endif + /* address flag set means i2c slave sends ACK */ i2c_flag_clear(gd32_i2c->i2c_periph, I2C_FLAG_ADDSEND); +#ifdef BSP_USING_RECEIVING_B + if(msg->len == 1) + { + i2c_stop_on_bus(gd32_i2c->i2c_periph); + } +#endif }else { - /* configure slave address */ + /* configure slave address */ while(i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_I2CBSY)); - //i2c_transfer_byte_number_config(gd32_i2c->i2c_periph, w_total_byte); - /* send a start condition to I2C bus */ + //i2c_transfer_byte_number_config(gd32_i2c->i2c_periph, w_total_byte); + /* send a start condition to I2C bus */ i2c_start_on_bus(gd32_i2c->i2c_periph); while(!i2c_flag_get(gd32_i2c->i2c_periph, I2C_FLAG_SBSEND)); -- Gitee From 9bf3a54191587777269daf39b3f7bd7fc9f0067a Mon Sep 17 00:00:00 2001 From: DaiLingxiang <3070269033@qq.com> Date: Fri, 16 Jan 2026 12:31:35 +0800 Subject: [PATCH 05/45] bsp/stm32f407-micu:add aht20,icm20608,ssd1306 support --- bsp/stm32/stm32f407-micu/board/Kconfig | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/bsp/stm32/stm32f407-micu/board/Kconfig b/bsp/stm32/stm32f407-micu/board/Kconfig index 0ce9e220b6..fc65f2af28 100644 --- a/bsp/stm32/stm32f407-micu/board/Kconfig +++ b/bsp/stm32/stm32f407-micu/board/Kconfig @@ -24,6 +24,23 @@ menu "Onboard Peripheral Drivers" select RT_USING_SFUD default n + config BSP_USING_AHT20 + bool "Enable AHT20(i2c1)" + select BSP_USING_I2C + select BSP_USING_I2C1 + select PKG_USING_SENSORS_DRIVERS + select PKG_USING_AHT10 + default n + + config BSP_USING_ICM20608 + bool "Enable ICM20608(i2c1)" + select BSP_USING_I2C + select BSP_USING_I2C1 + select PKG_USING_SENSORS_DRIVERS + select PKG_USING_ICM20608 + default n + + endmenu menu "On-chip Peripheral Drivers" @@ -226,6 +243,16 @@ endmenu menu "Board extended module Drivers" + config BSP_USING_SSD1306 + bool "Enable SSD1306 OLED" + select BSP_USING_I2C + select BSP_USING_I2C2 + select PKG_USING_SSD1306 + default n + help + Enable SSD1306 OLED display (connected to I2C2 on this board). + + endmenu endmenu \ No newline at end of file -- Gitee From 3ca5cd53f53d036604d663ac988aeb778bc52813 Mon Sep 17 00:00:00 2001 From: milo <1569491816@qq.com> Date: Fri, 16 Jan 2026 22:29:25 +0800 Subject: [PATCH 06/45] [fix] fix normalization issue of mktime and timegm --- components/libc/compilers/common/ctime.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/libc/compilers/common/ctime.c b/components/libc/compilers/common/ctime.c index 159667bbcf..bcd19fc8aa 100644 --- a/components/libc/compilers/common/ctime.c +++ b/components/libc/compilers/common/ctime.c @@ -391,7 +391,6 @@ time_t timegm(struct tm * const t) return (time_t)-1; } - years = (time_t)t->tm_year - 70; if (t->tm_sec > 60) /* seconds after the minute - [0, 60] including leap second */ { t->tm_min += t->tm_sec / 60; @@ -433,6 +432,8 @@ time_t timegm(struct tm * const t) return (time_t) -1; } + years = (time_t)t->tm_year - 70; + /* Days since 1970 is 365 * number of years + number of leap years since 1970 */ day = years * 365 + (years + 1) / 4; -- Gitee From d76eca13840eba4a94cbd22e184076998ad3e973 Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Mon, 19 Jan 2026 09:05:49 +0800 Subject: [PATCH 07/45] fix(Kconfig): Update the default value of FINSH_THREAD_PRIORITY to support different thread priorities --- components/finsh/Kconfig | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/finsh/Kconfig b/components/finsh/Kconfig index 67a50a28d7..4aa83b34d7 100644 --- a/components/finsh/Kconfig +++ b/components/finsh/Kconfig @@ -20,7 +20,9 @@ if RT_USING_MSH config FINSH_THREAD_PRIORITY int "The priority level value of thread" - default 20 + default 5 if RT_THREAD_PRIORITY_8 + default 20 if RT_THREAD_PRIORITY_32 + default 160 if RT_THREAD_PRIORITY_256 config FINSH_THREAD_STACK_SIZE int "The stack size for thread" -- Gitee From b3c71a6f345dcb1f2609e7057480245dc78e985f Mon Sep 17 00:00:00 2001 From: Eric Chan <55314107+LinuxMint-User@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:43:02 +0800 Subject: [PATCH 08/45] Fix: fix xpt2046_touch_readpoint type error Fix & Improve: fix touch event bug with LVGL Fix touch event bug with LVGL. Improve the touch sliding experience of resistive screens. [ci][stm32f407] add lcd attach config CI check Fix: minor modification Fix format issue. Fix Ci attach file. --- .../.ci/attachconfig/onboard-lcd-touch.attach | 32 ++++ .../board/ports/touch/drv_touch_xpt.c | 13 +- .../board/ports/touch/drv_xpt2046_init.c | 153 ++++++++++++++++-- 3 files changed, 179 insertions(+), 19 deletions(-) create mode 100644 bsp/stm32/stm32f407-atk-explorer/.ci/attachconfig/onboard-lcd-touch.attach diff --git a/bsp/stm32/stm32f407-atk-explorer/.ci/attachconfig/onboard-lcd-touch.attach b/bsp/stm32/stm32f407-atk-explorer/.ci/attachconfig/onboard-lcd-touch.attach new file mode 100644 index 0000000000..013e303529 --- /dev/null +++ b/bsp/stm32/stm32f407-atk-explorer/.ci/attachconfig/onboard-lcd-touch.attach @@ -0,0 +1,32 @@ +CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +CONFIG_RT_USING_SPI_BITOPS=y +CONFIG_RT_USING_SOFT_SPI=y +CONFIG_RT_USING_SOFT_SPI0=y +CONFIG_RT_SOFT_SPI0_SCK_PIN=1 +CONFIG_RT_SOFT_SPI0_MISO_PIN=2 +CONFIG_RT_SOFT_SPI0_MOSI_PIN=3 +CONFIG_RT_SOFT_SPI0_BUS_NAME="spi0" +CONFIG_RT_SOFT_SPI0_TIMING_DELAY=1 +CONFIG_RT_USING_SOFT_SPI1=y +CONFIG_RT_SOFT_SPI1_SCK_PIN=4 +CONFIG_RT_SOFT_SPI1_MISO_PIN=5 +CONFIG_RT_SOFT_SPI1_MOSI_PIN=6 +CONFIG_RT_SOFT_SPI1_BUS_NAME="spi1" +CONFIG_RT_SOFT_SPI1_TIMING_DELAY=1 +CONFIG_RT_USING_TOUCH=y +CONFIG_RT_TOUCH_PIN_IRQ=y +CONFIG_BSP_USING_SRAM=y +CONFIG_BSP_USING_ONBOARD_LCD=y +CONFIG_BSP_USING_ONBOARD_LCD_TEST=y +CONFIG_BSP_USING_TOUCH=y +CONFIG_BSP_USING_TOUCH_RES=y +CONFIG_BSP_XPT2046_CS_PIN="PC.13" +CONFIG_BSP_XPT2046_IRQ_PIN="PB.1" +CONFIG_BSP_USING_SOFT_SPI=y +CONFIG_BSP_USING_SOFT_SPI1=y +CONFIG_BSP_S_SPI1_SCK_PIN=16 +CONFIG_BSP_S_SPI1_MISO_PIN=18 +CONFIG_BSP_S_SPI1_MOSI_PIN=91 +CONFIG_BSP_USING_EXT_FMC_IO=y +CONFIG_BSP_USING_FMC=y diff --git a/bsp/stm32/stm32f407-atk-explorer/board/ports/touch/drv_touch_xpt.c b/bsp/stm32/stm32f407-atk-explorer/board/ports/touch/drv_touch_xpt.c index 204f393038..915b8be636 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/ports/touch/drv_touch_xpt.c +++ b/bsp/stm32/stm32f407-atk-explorer/board/ports/touch/drv_touch_xpt.c @@ -1,11 +1,12 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2026, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: - * Date Author Notes - * 2022-6-27 solar first version + * Date Author Notes + * 2022-6-27 solar first version + * 2026-01-12 LinuxMint-User fix xpt2046_touch_readpoint type error */ #include @@ -30,6 +31,7 @@ rt_err_t xpt2046_calibration(const char *lcd_name,const char *touch_name) LOG_E(LOG_TAG " cannot find lcd device named %s", lcd_name); return -RT_ERROR; } + if (rt_device_open(lcd, RT_DEVICE_OFLAG_RDWR) != RT_EOK) { LOG_E(LOG_TAG " cannot open lcd device named %s", lcd_name); @@ -101,6 +103,7 @@ rt_err_t xpt2046_calibration(const char *lcd_name,const char *touch_name) { break; } + switch (raw_idx) { case 1: @@ -151,7 +154,7 @@ rt_err_t xpt2046_calibration(const char *lcd_name,const char *touch_name) return RT_EOK; } -static rt_ssize_t xpt2046_touch_readpoint(struct rt_touch_device *touch, void *buf, rt_size_t touch_num) +static rt_size_t xpt2046_touch_readpoint(struct rt_touch_device *touch, void *buf, rt_size_t touch_num) { if (touch_num != 0) { @@ -185,6 +188,7 @@ static rt_ssize_t xpt2046_touch_readpoint(struct rt_touch_device *touch, void *b y_cum += temp; } } + if (!x_count || !y_count) { result->event = RT_TOUCH_EVENT_NONE; @@ -264,3 +268,4 @@ static int xpt2046_hw_init(void) INIT_DEVICE_EXPORT(xpt2046_hw_init); #endif /* BSP_USING_TOUCH_RES */ + diff --git a/bsp/stm32/stm32f407-atk-explorer/board/ports/touch/drv_xpt2046_init.c b/bsp/stm32/stm32f407-atk-explorer/board/ports/touch/drv_xpt2046_init.c index 40eefad667..09ad6bf898 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/ports/touch/drv_xpt2046_init.c +++ b/bsp/stm32/stm32f407-atk-explorer/board/ports/touch/drv_xpt2046_init.c @@ -1,11 +1,13 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2026, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2022-6-27 solar first version + * 2026-01-12 LinuxMint-User fix touch event bug with LVGL + * 2026-01-13 LinuxMint-User improve the touch sliding experience of resistive screens */ #include @@ -42,6 +44,7 @@ void xpt2046_init_hw(void) rt_kprintf("can't find touch device:%s\n", TOUCH_DEVICE_NAME); return; } + if (rt_device_open(touch, RT_DEVICE_FLAG_INT_RX) != RT_EOK) { rt_kprintf("can't open touch device:%s\n", TOUCH_DEVICE_NAME); @@ -87,38 +90,157 @@ void xpt2046_init_hw(void) void xpt2046_entry(void *parameter) { - /* Find the touch device */ rt_device_t touch = rt_device_find(TOUCH_DEVICE_NAME); if (touch == RT_NULL) { rt_kprintf("can't find touch device:%s\n", TOUCH_DEVICE_NAME); return; } -#ifndef PKG_USING_LVGL + + #ifndef PKG_USING_LVGL rt_device_t lcd = rt_device_find(TFTLCD_DEVICE_NAME); if (lcd == RT_NULL) { - rt_kprintf("can't find display device:%s\n", TFTLCD_DEVICE_NAME); - return; + rt_kprintf("can't find display device:%s\n", TFTLCD_DEVICE_NAME); + return; } -#endif /* PKG_USING_LVGL */ + #endif + + static rt_bool_t is_touching = RT_FALSE; + static int no_touch_count = 0; + static int touch_hold_count = 0; + static int last_x = 0, last_y = 0; + static int stable_x = 0, stable_y = 0; + + /* 5-point moving average filter for coordinate smoothing */ + #define HISTORY_SIZE 5 + static int history_x[HISTORY_SIZE] = {0}; + static int history_y[HISTORY_SIZE] = {0}; + static int history_index = 0; + static int history_count = 0; + + static const int DEBOUNCE_COUNT = 2; + static const int RELEASE_DEBOUNCE_COUNT = 5; + static const int MIN_MOVE_DISTANCE = 3; + static const int SMOOTHING_FACTOR = 2; + + rt_memset(history_x, 0, sizeof(history_x)); + rt_memset(history_y, 0, sizeof(history_y)); + while (1) { - /* Prepare variable to read out the touch data */ struct rt_touch_data read_data; rt_memset(&read_data, 0, sizeof(struct rt_touch_data)); + if (rt_device_read(touch, 0, &read_data, 1) == 1) { -#ifdef PKG_USING_LVGL - lv_port_indev_input(read_data.x_coordinate, read_data.y_coordinate, - ((read_data.event = RT_TOUCH_EVENT_DOWN) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL)); -#else /* PKG_USING_LVGL */ + int current_x = read_data.x_coordinate; + int current_y = read_data.y_coordinate; + + history_x[history_index] = current_x; + history_y[history_index] = current_y; + history_index = (history_index + 1) % HISTORY_SIZE; + if (history_count < HISTORY_SIZE) history_count++; + + int avg_x = 0, avg_y = 0; + if (history_count > 0) + { + for (int i = 0; i < history_count; i++) + { + avg_x += history_x[i]; + avg_y += history_y[i]; + } + avg_x /= history_count; + avg_y /= history_count; + } + else + { + avg_x = current_x; + avg_y = current_y; + } + + no_touch_count = 0; + + #ifdef PKG_USING_LVGL + if (!is_touching) + { + touch_hold_count++; + + if (touch_hold_count >= DEBOUNCE_COUNT) + { + is_touching = true; + stable_x = avg_x; + stable_y = avg_y; + touch_hold_count = 0; + + lv_port_indev_input(stable_x, stable_y, LV_INDEV_STATE_PR); + + last_x = stable_x; + last_y = stable_y; + } + } + else + { + touch_hold_count = 0; + + int dx = avg_x - last_x; + int dy = avg_y - last_y; + int distance = dx * dx + dy * dy; + + if (distance >= MIN_MOVE_DISTANCE * MIN_MOVE_DISTANCE) + { + /* Interpolation smoothing to reduce jitter */ + int smooth_x = last_x + (avg_x - last_x) / SMOOTHING_FACTOR; + int smooth_y = last_y + (avg_y - last_y) / SMOOTHING_FACTOR; + + lv_port_indev_input(smooth_x, smooth_y, LV_INDEV_STATE_PR); + + last_x = smooth_x; + last_y = smooth_y; + stable_x = smooth_x; + stable_y = smooth_y; + } + else + { + lv_port_indev_input(stable_x, stable_y, LV_INDEV_STATE_PR); + } + } + + #else const rt_uint32_t black = 0x0; - rt_graphix_ops(lcd)->set_pixel((const char *)(&black), - read_data.x_coordinate, - read_data.y_coordinate); -#endif /* PKG_USING_LVGL */ + rt_graphix_ops(lcd)->set_pixel((const char *)(&black), avg_x, avg_y); + #endif } + else + { + no_touch_count++; + touch_hold_count = 0; + + if (is_touching) + { + if (no_touch_count >= RELEASE_DEBOUNCE_COUNT) + { + #ifdef PKG_USING_LVGL + lv_port_indev_input(stable_x, stable_y, LV_INDEV_STATE_REL); + #endif + + is_touching = RT_FALSE; + no_touch_count = 0; + + history_count = 0; + history_index = 0; + rt_memset(history_x, 0, sizeof(history_x)); + rt_memset(history_y, 0, sizeof(history_y)); + } + else + { + #ifdef PKG_USING_LVGL + lv_port_indev_input(stable_x, stable_y, LV_INDEV_STATE_PR); + #endif + } + } + } + rt_thread_mdelay(1); } } @@ -134,3 +256,4 @@ static int touch_xpt2046_init(void) INIT_COMPONENT_EXPORT(touch_xpt2046_init); #endif /* BSP_USING_TOUCH_RES */ + -- Gitee From a68cc2e71a1a33c384018c65235b036195784a95 Mon Sep 17 00:00:00 2001 From: ricky <1486344514@qq.com> Date: Mon, 19 Jan 2026 11:31:00 +0800 Subject: [PATCH 09/45] =?UTF-8?q?[tool]=20tools/targets/vsc.py=20:=20impro?= =?UTF-8?q?ve=20compile=5Fcommands=20handling=20and=20w=E2=80=A6=20(#11138?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [tool] tools/targets/vsc.py : improve compile_commands handling and workspace excludes - broaden source file extension detection to include C++ and asm - resolve compile_commands path to absolute and pass its directory to clangd - limit excludes scan to rt-thread/packages and always include board/linker_scripts --- tools/targets/vsc.py | 51 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/tools/targets/vsc.py b/tools/targets/vsc.py index b4de67dcfb..f6ea8e37df 100644 --- a/tools/targets/vsc.py +++ b/tools/targets/vsc.py @@ -88,7 +88,8 @@ def extract_source_dirs(compile_commands): for entry in compile_commands: file_path = os.path.abspath(entry['file']) - if file_path.endswith('.c'): + file_ext = os.path.splitext(file_path)[1].lower() + if file_ext in ('.c', '.cc', '.cpp', '.cxx', '.s', '.asm'): dir_path = os.path.dirname(file_path) source_dirs.add(dir_path) # command or arguments @@ -126,6 +127,26 @@ def is_path_in_tree(path, tree): return False +def should_force_include(path, root_path): + rel_path = os.path.relpath(path, root_path).replace('\\', '/') + return ( + rel_path == 'board/linker_scripts' or + rel_path.startswith('board/linker_scripts/') + ) + +def limit_excludes_to_root_dirs(root_path, names): + allowed = set(os.path.normpath(os.path.join(root_path, name)) for name in names) + return [p for p in allowed if os.path.isdir(p)] + +def is_under_roots(path, root_path, names): + norm = os.path.normpath(path) + for name in names: + root = os.path.normpath(os.path.join(root_path, name)) + if norm == root or norm.startswith(root + os.path.sep): + return True + return False + + def generate_code_workspace_file(source_dirs,command_json_path,root_path): current_working_directory = os.getcwd() current_folder_name = os.path.basename(current_working_directory) @@ -139,7 +160,13 @@ def generate_code_workspace_file(source_dirs,command_json_path,root_path): continue root_rel_path = os.path.relpath(root_path, current_working_directory) - command_json_path = os.path.relpath(current_working_directory, root_path) + os.sep + command_json_abs_path = command_json_path + if not os.path.isabs(command_json_abs_path): + command_json_abs_path = os.path.abspath( + os.path.join(current_working_directory, command_json_abs_path) + ) + command_json_dir = os.path.dirname(command_json_abs_path) + command_json_dir = os.path.relpath(command_json_dir, root_path) workspace_data = { "folders": [ { @@ -148,7 +175,7 @@ def generate_code_workspace_file(source_dirs,command_json_path,root_path): ], "settings": { "clangd.arguments": [ - f"--compile-commands-dir={command_json_path}", + f"--compile-commands-dir={command_json_dir}", "--header-insertion=never" ], "files.exclude": {dir.replace('\\','/'): True for dir in sorted(relative_dirs)} @@ -161,8 +188,11 @@ def generate_code_workspace_file(source_dirs,command_json_path,root_path): print(f'Workspace file {workspace_filename} created.') def command_json_to_workspace(root_path,command_json_path): - - with open('build/compile_commands.json', 'r') as f: + command_json_abs_path = command_json_path + if not os.path.isabs(command_json_abs_path): + command_json_abs_path = os.path.abspath(command_json_abs_path) + + with open(command_json_abs_path, 'r') as f: compile_commands = json.load(f) source_dirs = extract_source_dirs(compile_commands) @@ -182,17 +212,19 @@ def command_json_to_workspace(root_path,command_json_path): # os.chdir(root_path) # 轮询root文件夹下面的每一个文件夹和子文件夹 for root, dirs, files in os.walk(root_path): + if not is_under_roots(root, root_path, ('rt-thread', 'packages')): + continue # 检查当前root是否在filtered_tree中 - if not is_path_in_tree(root, filtered_tree): + if not is_path_in_tree(root, filtered_tree) and not should_force_include(root, root_path): exclude_fold.add(root) dirs[:] = [] # 不往下轮询子文件夹 continue for dir in dirs: dir_path = os.path.join(root, dir) - if not is_path_in_tree(dir_path, filtered_tree): + if not is_path_in_tree(dir_path, filtered_tree) and not should_force_include(dir_path, root_path): exclude_fold.add(dir_path) - generate_code_workspace_file(exclude_fold,command_json_path,root_path) + generate_code_workspace_file(exclude_fold,command_json_abs_path,root_path) def delete_repeatelist(data): temp_dict = set([str(item) for item in data]) @@ -245,8 +277,7 @@ def GenerateCFiles(env): Generate vscode.code-workspace files by build/compile_commands.json """ if os.path.exists('build/compile_commands.json'): - - command_json_to_workspace(env['RTT_ROOT'],'build/compile_commands.json') + command_json_to_workspace(os.getcwd(), 'build/compile_commands.json') return """ Generate vscode.code-workspace files -- Gitee From 306505ea24d22f908e052836918029d82259bc83 Mon Sep 17 00:00:00 2001 From: PeakRacing <1473454180@qq.com> Date: Tue, 20 Jan 2026 10:36:25 +0800 Subject: [PATCH 10/45] =?UTF-8?q?update:=E6=9B=B4=E6=96=B0=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4=E8=80=85=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/airm2m/air32f103/README.md | 2 +- bsp/fm33lc026/libraries/HAL_Drivers/drv_config.h | 2 +- bsp/fm33lc026/libraries/HAL_Drivers/drv_usart.h | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/adc_config.h | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/dma_config.h | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/pwm_config.h | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/qspi_config.h | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/spi_config.h | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/tim_config.h | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/uart_config.h | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/usbd_config.h | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/drv_adc.c | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/drv_config.h | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/drv_crypto.c | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/drv_dma.h | 2 +- .../libraries/HAL_Drivers/drivers/drv_flash/drv_flash_wb.c | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/drv_rtc.c | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/drv_spi.c | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/drv_tim.c | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart.c | 2 +- bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart.h | 2 +- bsp/stm32/libraries/templates/stm32wbxx/applications/main.c | 2 +- bsp/stm32/stm32f407-armfly-v5/README.md | 2 +- bsp/stm32/stm32f407-armfly-v5/applications/main.c | 2 +- bsp/stm32/stm32f407-armfly-v5/board/board.c | 2 +- bsp/stm32/stm32f407-armfly-v5/board/board.h | 2 +- bsp/stm32/stm32f407-armfly-v5/board/ports/fal_cfg.h | 2 +- bsp/stm32/stm32f407-armfly-v5/board/ports/sdcard_port.c | 2 +- bsp/stm32/stm32f407-armfly-v5/board/ports/spi_flash_init.c | 2 +- bsp/stm32/stm32wb55-st-nucleo/README.md | 2 +- bsp/stm32/stm32wb55-st-nucleo/applications/main.c | 2 +- bsp/stm32/stm32wb55-st-nucleo/board/ports/fal_cfg.h | 2 +- 32 files changed, 32 insertions(+), 32 deletions(-) diff --git a/bsp/airm2m/air32f103/README.md b/bsp/airm2m/air32f103/README.md index 852b4b2f4e..d5ed050706 100644 --- a/bsp/airm2m/air32f103/README.md +++ b/bsp/airm2m/air32f103/README.md @@ -106,6 +106,6 @@ msh > 维护人: -- [**Dozingfiretruck (打盹的消防车)**](https://github.com/Dozingfiretruck) +- [**PeakRacing**](https://github.com/PeakRacing) - [**淘宝地址**](https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-24045920841.15.29395bcdUExSHR&id=666216389131) diff --git a/bsp/fm33lc026/libraries/HAL_Drivers/drv_config.h b/bsp/fm33lc026/libraries/HAL_Drivers/drv_config.h index 162ca55656..8a1373f027 100644 --- a/bsp/fm33lc026/libraries/HAL_Drivers/drv_config.h +++ b/bsp/fm33lc026/libraries/HAL_Drivers/drv_config.h @@ -6,7 +6,7 @@ * Change Logs: * Date Author Notes * 2018-10-30 SummerGift first version - * 2020-10-14 Dozingfiretruck Porting for stm32wbxx + * 2020-10-14 PeakRacing Porting for stm32wbxx * 2021-08-27 Jiao first version */ diff --git a/bsp/fm33lc026/libraries/HAL_Drivers/drv_usart.h b/bsp/fm33lc026/libraries/HAL_Drivers/drv_usart.h index 9169da5dd9..757265e110 100644 --- a/bsp/fm33lc026/libraries/HAL_Drivers/drv_usart.h +++ b/bsp/fm33lc026/libraries/HAL_Drivers/drv_usart.h @@ -7,7 +7,7 @@ * Date Author Notes * 2018.10.30 SummerGift first version * 2019.03.05 whj4674672 add stm32h7 - * 2020-10-14 Dozingfiretruck Porting for stm32wbxx + * 2020-10-14 PeakRacing Porting for stm32wbxx */ #ifndef __DRV_USART_H__ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/adc_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/adc_config.h index d62977ed8b..0de7f3beb3 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/adc_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/adc_config.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-10-14 Dozingfiretruck first version + * 2020-10-14 PeakRacing first version */ #ifndef __ADC_CONFIG_H__ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/dma_config.h index 2d34ca76e4..adbab77de2 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/dma_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/dma_config.h @@ -6,7 +6,7 @@ * Change Logs: * Date Author Notes * Date Author Notes - * 2020-10-14 Dozingfiretruck first version + * 2020-10-14 PeakRacing first version */ #ifndef __DMA_CONFIG_H__ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/pwm_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/pwm_config.h index 6f52ca2044..5823ac678d 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/pwm_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/pwm_config.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-10-14 Dozingfiretruck first version + * 2020-10-14 PeakRacing first version * 2023-04-08 Wangyuqiang complete PWM defination */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/qspi_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/qspi_config.h index c02de26ab2..60964576c5 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/qspi_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/qspi_config.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-10-14 Dozingfiretruck first version + * 2020-10-14 PeakRacing first version */ #ifndef __QSPI_CONFIG_H__ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/spi_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/spi_config.h index 8e628aaf88..fa63a162de 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/spi_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/spi_config.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-10-14 Dozingfiretruck first version + * 2020-10-14 PeakRacing first version */ #ifndef __SPI_CONFIG_H__ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/tim_config.h index 1c8c178bd0..1aa956e255 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/tim_config.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-10-14 Dozingfiretruck first version + * 2020-10-14 PeakRacing first version */ #ifndef __TIM_CONFIG_H__ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/uart_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/uart_config.h index 0ab2c29aac..b36e7bd94c 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/uart_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/uart_config.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-10-14 Dozingfiretruck first version + * 2020-10-14 PeakRacing first version */ #ifndef __UART_CONFIG_H__ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/usbd_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/usbd_config.h index dd61e64a8d..6c074ce4cf 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/usbd_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/usbd_config.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-10-14 Dozingfiretruck first version + * 2020-10-14 PeakRacing first version */ #ifndef __USBD_CONFIG_H__ #define __USBD_CONFIG_H__ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_adc.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_adc.c index 3348c7698f..64d8469125 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_adc.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_adc.c @@ -9,7 +9,7 @@ * 2018-12-12 greedyhao Porting for stm32f7xx * 2019-02-01 yuneizhilin fix the stm32_adc_init function initialization issue * 2020-06-17 thread-liu Porting for stm32mp1xx - * 2020-10-14 Dozingfiretruck Porting for stm32wbxx + * 2020-10-14 PeakRacing Porting for stm32wbxx * 2022-05-22 Stanley Lwin Add stm32_adc_get_vref * 2022-12-26 wdfk-prog Change the order of configuration channels and calibration functions */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_config.h index cc53b17029..ddd665ac49 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_config.h @@ -6,7 +6,7 @@ * Change Logs: * Date Author Notes * 2018-10-30 SummerGift first version - * 2020-10-14 Dozingfiretruck Porting for stm32wbxx + * 2020-10-14 PeakRacing Porting for stm32wbxx */ #ifndef __DRV_CONFIG_H__ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_crypto.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_crypto.c index 5ded4f16ee..89d0515c29 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_crypto.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_crypto.c @@ -6,7 +6,7 @@ * Change Logs: * Date Author Notes * 2019-07-10 Ernest 1st version - * 2020-10-14 Dozingfiretruck Porting for stm32wbxx + * 2020-10-14 PeakRacing Porting for stm32wbxx * 2020-11-26 thread-liu add hash * 2020-11-26 thread-liu add cryp * 2020-12-11 WKJay fix build problem diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_dma.h b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_dma.h index 3fe4ff8978..1fc6ffee44 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_dma.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_dma.h @@ -6,7 +6,7 @@ * Change Logs: * Date Author Notes * 2018-11-10 SummerGift first version - * 2020-10-14 Dozingfiretruck Porting for stm32wbxx + * 2020-10-14 PeakRacing Porting for stm32wbxx */ #ifndef __DRV_DMA_H_ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_flash/drv_flash_wb.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_flash/drv_flash_wb.c index e8924f494f..642c9953d7 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_flash/drv_flash_wb.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_flash/drv_flash_wb.c @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-10-14 Dozingfiretruck first version + * 2020-10-14 PeakRacing first version */ #include diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_rtc.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_rtc.c index 83828c7a38..b86c4ba93b 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_rtc.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_rtc.c @@ -6,7 +6,7 @@ * Change Logs: * Date Author Notes * 2018-12-04 balanceTWK first version - * 2020-10-14 Dozingfiretruck Porting for stm32wbxx + * 2020-10-14 PeakRacing Porting for stm32wbxx * 2021-02-05 Meco Man fix the problem of mixing local time and UTC time * 2021-07-05 iysheng implement RTC framework V2.0 * 2025-06-05 RCSN add local time conversion for get timeval and set stamp diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_spi.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_spi.c index 07be86130d..6f3a5a6dd0 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_spi.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_spi.c @@ -10,7 +10,7 @@ * 2019-01-03 zylx modify DMA initialization and spixfer function * 2020-01-15 whj4674672 Porting for stm32h7xx * 2020-06-18 thread-liu Porting for stm32mp1xx - * 2020-10-14 Dozingfiretruck Porting for stm32wbxx + * 2020-10-14 PeakRacing Porting for stm32wbxx */ #include diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_tim.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_tim.c index 5ff7005791..4533df7a64 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_tim.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_tim.c @@ -8,7 +8,7 @@ * 2018-12-10 zylx first version * 2020-06-16 thread-liu Porting for stm32mp1 * 2020-08-25 linyongkang Fix the timer clock frequency doubling problem - * 2020-10-14 Dozingfiretruck Porting for stm32wbxx + * 2020-10-14 PeakRacing Porting for stm32wbxx * 2020-11-18 leizhixiong add STM32H7 series support * 2023-08-21 Donocean fix the MCU crash when using timer6 * 2023-12-24 Meco Man add TIMx existing check diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart.c index 5174fbe769..86be2bc419 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart.c @@ -10,7 +10,7 @@ * 2020-03-20 SummerGift fix bug caused by ORE * 2020-05-02 whj4674672 support stm32h7 uart dma * 2020-09-09 forest-rain support stm32wl uart - * 2020-10-14 Dozingfiretruck Porting for stm32wbxx + * 2020-10-14 PeakRacing Porting for stm32wbxx */ #include "board.h" diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart.h b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart.h index 1d505b7d3a..f8b5e16af9 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart.h @@ -7,7 +7,7 @@ * Date Author Notes * 2018-10-30 SummerGift first version * 2019-03-05 whj4674672 add stm32h7 - * 2020-10-14 Dozingfiretruck Porting for stm32wbxx + * 2020-10-14 PeakRacing Porting for stm32wbxx */ #ifndef __DRV_USART_H__ diff --git a/bsp/stm32/libraries/templates/stm32wbxx/applications/main.c b/bsp/stm32/libraries/templates/stm32wbxx/applications/main.c index ce87056796..d7a3a330c9 100644 --- a/bsp/stm32/libraries/templates/stm32wbxx/applications/main.c +++ b/bsp/stm32/libraries/templates/stm32wbxx/applications/main.c @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-09-29 Dozingfiretruck first version + * 2020-09-29 PeakRacing first version */ #include diff --git a/bsp/stm32/stm32f407-armfly-v5/README.md b/bsp/stm32/stm32f407-armfly-v5/README.md index 0b43676e2a..8bf93f7460 100644 --- a/bsp/stm32/stm32f407-armfly-v5/README.md +++ b/bsp/stm32/stm32f407-armfly-v5/README.md @@ -130,4 +130,4 @@ msh > 维护人: -- [Dozingfiretruck](https://gitee.com/Dozingfiretruck), 邮箱: \ No newline at end of file +- [PeakRacing](https://gitee.com/PeakRacing), 邮箱: \ No newline at end of file diff --git a/bsp/stm32/stm32f407-armfly-v5/applications/main.c b/bsp/stm32/stm32f407-armfly-v5/applications/main.c index d4ffbccdbf..b8f4116435 100644 --- a/bsp/stm32/stm32f407-armfly-v5/applications/main.c +++ b/bsp/stm32/stm32f407-armfly-v5/applications/main.c @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-07-13 Dozingfiretruck first version + * 2020-07-13 PeakRacing first version * 2023-12-03 Meco Man support nano version */ diff --git a/bsp/stm32/stm32f407-armfly-v5/board/board.c b/bsp/stm32/stm32f407-armfly-v5/board/board.c index e80bcb0e7c..739b731834 100644 --- a/bsp/stm32/stm32f407-armfly-v5/board/board.c +++ b/bsp/stm32/stm32f407-armfly-v5/board/board.c @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-07-13 Dozingfiretruck first version + * 2020-07-13 PeakRacing first version */ #include diff --git a/bsp/stm32/stm32f407-armfly-v5/board/board.h b/bsp/stm32/stm32f407-armfly-v5/board/board.h index 4e8feb60fd..0fe7bfbade 100644 --- a/bsp/stm32/stm32f407-armfly-v5/board/board.h +++ b/bsp/stm32/stm32f407-armfly-v5/board/board.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-07-13 Dozingfiretruck first version + * 2020-07-13 PeakRacing first version */ #ifndef __BOARD_H__ diff --git a/bsp/stm32/stm32f407-armfly-v5/board/ports/fal_cfg.h b/bsp/stm32/stm32f407-armfly-v5/board/ports/fal_cfg.h index c512fcef35..8a15f487e7 100644 --- a/bsp/stm32/stm32f407-armfly-v5/board/ports/fal_cfg.h +++ b/bsp/stm32/stm32f407-armfly-v5/board/ports/fal_cfg.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-07-13 Dozingfiretruck first version + * 2020-07-13 PeakRacing first version */ #ifndef _FAL_CFG_H_ diff --git a/bsp/stm32/stm32f407-armfly-v5/board/ports/sdcard_port.c b/bsp/stm32/stm32f407-armfly-v5/board/ports/sdcard_port.c index 2b6e48ba3f..47e4371797 100644 --- a/bsp/stm32/stm32f407-armfly-v5/board/ports/sdcard_port.c +++ b/bsp/stm32/stm32f407-armfly-v5/board/ports/sdcard_port.c @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-07-13 Dozingfiretruck first version + * 2020-07-13 PeakRacing first version */ #include diff --git a/bsp/stm32/stm32f407-armfly-v5/board/ports/spi_flash_init.c b/bsp/stm32/stm32f407-armfly-v5/board/ports/spi_flash_init.c index 1f038b839b..b4e24b94f9 100644 --- a/bsp/stm32/stm32f407-armfly-v5/board/ports/spi_flash_init.c +++ b/bsp/stm32/stm32f407-armfly-v5/board/ports/spi_flash_init.c @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-07-13 Dozingfiretruck first version + * 2020-07-13 PeakRacing first version */ #include diff --git a/bsp/stm32/stm32wb55-st-nucleo/README.md b/bsp/stm32/stm32wb55-st-nucleo/README.md index f782e85456..28e9a93e48 100644 --- a/bsp/stm32/stm32wb55-st-nucleo/README.md +++ b/bsp/stm32/stm32wb55-st-nucleo/README.md @@ -113,4 +113,4 @@ msh > 维护人: -- [Dozingfiretruck](https://gitee.com/Dozingfiretruck), 邮箱:<1473454180@qq.com> \ No newline at end of file +- [PeakRacing](https://gitee.com/PeakRacing), 邮箱:<1473454180@qq.com> \ No newline at end of file diff --git a/bsp/stm32/stm32wb55-st-nucleo/applications/main.c b/bsp/stm32/stm32wb55-st-nucleo/applications/main.c index b4a71ebc08..a3ce887e5c 100644 --- a/bsp/stm32/stm32wb55-st-nucleo/applications/main.c +++ b/bsp/stm32/stm32wb55-st-nucleo/applications/main.c @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-09-29 Dozingfiretruck first version + * 2020-09-29 PeakRacing first version */ #include diff --git a/bsp/stm32/stm32wb55-st-nucleo/board/ports/fal_cfg.h b/bsp/stm32/stm32wb55-st-nucleo/board/ports/fal_cfg.h index e3c93996e7..09763f126e 100644 --- a/bsp/stm32/stm32wb55-st-nucleo/board/ports/fal_cfg.h +++ b/bsp/stm32/stm32wb55-st-nucleo/board/ports/fal_cfg.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-09-29 Dozingfiretruck first version + * 2020-09-29 PeakRacing first version */ #ifndef _FAL_CFG_H_ -- Gitee From 7641ef68855601bc73252546bf41a96d6078444e Mon Sep 17 00:00:00 2001 From: lhxj <2743257167@qq.com> Date: Thu, 25 Dec 2025 17:56:52 +0800 Subject: [PATCH 11/45] [drivers] Fix OFW bus conflict and prevent duplicate device creation Problem: When enumerating device tree nodes, platform bus and native buses (I2C/SPI) may create duplicate devices for the same OFW node, causing cross-bus conflicts. This triggers assertion failure '(dev->bus != new_bus)' in rt_bus_reload_driver_device() during boot on minimal DM-enabled systems. Root Cause: 1. Platform bus tries to reload devices that already belong to other buses by calling rt_bus_reload_driver_device(dev->bus, dev), which violates the API contract (requires dev->bus != new_bus). 2. Native buses (I2C/SPI) do not mark OFW nodes as occupied, so platform bus creates duplicate platform devices for I2C/SPI client nodes. Solution: 1. components/drivers/core/platform_ofw.c: Return RT_EOK when np->dev exists, letting the native bus handle device lifecycle instead of cross-bus reload. 2. components/drivers/i2c/dev_i2c_bus.c: Mark i2c_client_np->dev during scan to prevent platform bus from duplicating I2C client devices. 3. components/drivers/spi/dev_spi_bus.c: Mark spi_dev_np->dev during scan to prevent platform bus from duplicating SPI devices. Tested on Spacemit K1 RISC-V platform with minimal DM configuration. Signed-off-by: lhxj <2743257167@qq.com> --- components/drivers/core/platform_ofw.c | 19 +++++++++---------- components/drivers/i2c/dev_i2c_bus.c | 4 ++++ components/drivers/spi/dev_spi_bus.c | 6 +++++- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/components/drivers/core/platform_ofw.c b/components/drivers/core/platform_ofw.c index 38065dd3eb..d617f112fa 100644 --- a/components/drivers/core/platform_ofw.c +++ b/components/drivers/core/platform_ofw.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2023-06-04 GuEe-GUI the first version + * 2025-12-25 lhxj fix OFW bus conflict and prevent duplicate device creation */ #include @@ -223,16 +224,14 @@ rt_err_t rt_platform_ofw_request(struct rt_ofw_node *np) if (dev) { - /* Was create */ - if (dev->drv) - { - /* Was probe OK */ - err = RT_EOK; - } - else - { - err = rt_bus_reload_driver_device(dev->bus, dev); - } + /* + * Device was already created (np->dev != NULL). + * - If it's already probed (dev->drv != NULL), nothing to do. + * - If not yet probed (dev->drv == NULL), it belongs to its native bus + * (e.g. I2C/SPI) which will handle probing; platform bus should not reload + * or transfer it, to avoid cross-bus conflicts. + */ + err = RT_EOK; } else { diff --git a/components/drivers/i2c/dev_i2c_bus.c b/components/drivers/i2c/dev_i2c_bus.c index 9e202dbd9a..6cad46951c 100644 --- a/components/drivers/i2c/dev_i2c_bus.c +++ b/components/drivers/i2c/dev_i2c_bus.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2022-12-06 GuEe-GUI first version + * 2025-12-25 lhxj mark OFW node as taken to prevent platform bus duplication */ #include @@ -63,6 +64,9 @@ void i2c_bus_scan_clients(struct rt_i2c_bus_device *bus) rt_dm_dev_set_name(&client->parent, "%s", client->name); + /* Mark this OFW node as taken to prevent platform bus from creating duplicate device */ + i2c_client_np->dev = &client->parent; + rt_i2c_device_register(client); if (i2c_client_np != child_np) diff --git a/components/drivers/spi/dev_spi_bus.c b/components/drivers/spi/dev_spi_bus.c index ed1f29eac8..32829b3d85 100644 --- a/components/drivers/spi/dev_spi_bus.c +++ b/components/drivers/spi/dev_spi_bus.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2022-12-06 GuEe-GUI first version + * 2025-12-25 lhxj mark OFW node as taken to prevent platform bus duplication; fix cppcheck warning */ #include "dev_spi_dm.h" @@ -69,6 +70,9 @@ void spi_bus_scan_devices(struct rt_spi_bus *bus) continue; } + /* Mark this OFW node as taken to prevent platform bus from creating duplicate device */ + spi_dev_np->dev = &spi_dev->parent; + rt_spi_device_register(spi_dev); } } @@ -163,7 +167,7 @@ static rt_err_t spi_probe(rt_device_t dev) rt_spidev_device_init(device, rt_dm_dev_get_name(&device->parent)); } - return err; + return RT_EOK; } static rt_err_t spi_remove(rt_device_t dev) -- Gitee From f556099146dd50f770c609711d48e17a201952bc Mon Sep 17 00:00:00 2001 From: dongly Date: Fri, 19 Dec 2025 11:18:43 +0800 Subject: [PATCH 12/45] [bsp] fix rtconfig.py SyntaxWarning --- bsp/Infineon/libraries/templates/PSOC62/rtconfig.py | 2 +- bsp/Infineon/libraries/templates/XMC7200D/rtconfig.py | 2 +- bsp/Infineon/psoc6-cy8ckit-062-BLE/rtconfig.py | 2 +- bsp/Infineon/psoc6-cy8ckit-062-WIFI-BT/rtconfig.py | 2 +- bsp/Infineon/psoc6-cy8ckit-062S2-43012/rtconfig.py | 2 +- bsp/Infineon/psoc6-cy8ckit-062s4/rtconfig.py | 2 +- bsp/Infineon/psoc6-cy8cproto-062S3-4343W/rtconfig.py | 2 +- bsp/Infineon/psoc6-evaluationkit-062S2/rtconfig.py | 2 +- bsp/Infineon/xmc7100d-f144k4160aa/rtconfig.py | 2 +- bsp/Infineon/xmc7200-kit_xmc7200_evk/rtconfig.py | 2 +- bsp/airm2m/air105/rtconfig.py | 2 +- bsp/airm2m/air32f103/rtconfig.py | 2 +- bsp/apm32/apm32e103ze-evalboard/rtconfig.py | 2 +- bsp/apm32/apm32e103ze-tinyboard/rtconfig.py | 2 +- bsp/apm32/apm32f030r8-miniboard/rtconfig.py | 2 +- bsp/apm32/apm32f051r8-evalboard/rtconfig.py | 2 +- bsp/apm32/apm32f072vb-miniboard/rtconfig.py | 2 +- bsp/apm32/apm32f091vc-miniboard/rtconfig.py | 2 +- bsp/apm32/apm32f103vb-miniboard/rtconfig.py | 2 +- bsp/apm32/apm32f103xe-minibroard/rtconfig.py | 2 +- bsp/apm32/apm32f107vc-evalboard/rtconfig.py | 2 +- bsp/apm32/apm32f407ig-minibroard/rtconfig.py | 2 +- bsp/apm32/apm32f407zg-evalboard/rtconfig.py | 2 +- bsp/apm32/apm32s103vb-miniboard/rtconfig.py | 2 +- bsp/at32/at32a403a-start/rtconfig.py | 2 +- bsp/at32/at32a423-start/rtconfig.py | 2 +- bsp/at32/at32f402-start/rtconfig.py | 2 +- bsp/at32/at32f403a-start/rtconfig.py | 2 +- bsp/at32/at32f405-start/rtconfig.py | 2 +- bsp/at32/at32f407-start/rtconfig.py | 2 +- bsp/at32/at32f413-start/rtconfig.py | 2 +- bsp/at32/at32f415-start/rtconfig.py | 2 +- bsp/at32/at32f421-start/rtconfig.py | 2 +- bsp/at32/at32f423-start/rtconfig.py | 2 +- bsp/at32/at32f425-start/rtconfig.py | 2 +- bsp/at32/at32f435-start/rtconfig.py | 2 +- bsp/at32/at32f437-start/rtconfig.py | 2 +- bsp/at32/at32f455-start/rtconfig.py | 2 +- bsp/at32/at32f456-start/rtconfig.py | 2 +- bsp/at32/at32f457-start/rtconfig.py | 2 +- bsp/at32/at32m412-start/rtconfig.py | 2 +- bsp/at32/at32m416-start/rtconfig.py | 2 +- bsp/fm33lc026/rtconfig.py | 2 +- bsp/ft32/ft32f072xb-starter/rtconfig.py | 2 +- bsp/gd32/arm/gd32103c-eval/rtconfig.py | 2 +- bsp/gd32/arm/gd32105c-eval/rtconfig.py | 2 +- bsp/gd32/arm/gd32105r-start/rtconfig.py | 2 +- bsp/gd32/arm/gd32107c-eval/rtconfig.py | 2 +- bsp/gd32/arm/gd32205r-start/rtconfig.py | 2 +- bsp/gd32/arm/gd32207i-eval/rtconfig.py | 2 +- bsp/gd32/arm/gd32303c-start/rtconfig.py | 2 +- bsp/gd32/arm/gd32303e-eval/rtconfig.py | 2 +- bsp/gd32/arm/gd32305r-start/rtconfig.py | 2 +- bsp/gd32/arm/gd32307e-start/rtconfig.py | 2 +- bsp/gd32/arm/gd32407v-lckfb/rtconfig.py | 2 +- bsp/gd32/arm/gd32407v-start/rtconfig.py | 2 +- bsp/gd32/arm/gd32450z-eval/rtconfig.py | 2 +- bsp/gd32/arm/gd32470i-eval/rtconfig.py | 2 +- bsp/gd32/arm/gd32470z-lckfb/rtconfig.py | 2 +- bsp/gd32/arm/gd32527I-eval/rtconfig.py | 2 +- bsp/gd32/arm/gd32e503v-eval/rtconfig.py | 2 +- bsp/gd32/arm/gd32h759i-eval/rtconfig.py | 2 +- bsp/gd32/arm/gd32h759i-start/rtconfig.py | 2 +- bsp/hc32/ev_hc32f334_lqfp64/rtconfig.py | 2 +- bsp/hc32/ev_hc32f448_lqfp80/rtconfig.py | 2 +- bsp/hc32/ev_hc32f460_lqfp100_v2/rtconfig.py | 2 +- bsp/hc32/ev_hc32f472_lqfp100/rtconfig.py | 2 +- bsp/hc32/ev_hc32f4a0_lqfp176/rtconfig.py | 2 +- bsp/hc32/ev_hc32f4a8_lqfp176/rtconfig.py | 2 +- bsp/hc32/lckfb-hc32f4a0-lqfp100/rtconfig.py | 2 +- bsp/hc32l196/rtconfig.py | 2 +- bsp/hk32/hk32f030c8-mini/rtconfig.py | 2 +- bsp/ht32/ht32f12366/rtconfig.py | 2 +- bsp/ht32/ht32f52352/rtconfig.py | 2 +- bsp/ht32/ht32f53252/rtconfig.py | 2 +- bsp/mm32/mm32f3270-100ask-pitaya/rtconfig.py | 2 +- bsp/msp432e401y-LaunchPad/rtconfig.py | 2 +- bsp/n32/n32g43xcl-stb/rtconfig.py | 2 +- bsp/n32/n32g457qel-stb/rtconfig.py | 2 +- bsp/n32/n32g45xcl-stb/rtconfig.py | 2 +- bsp/n32/n32g45xml-stb/rtconfig.py | 2 +- bsp/n32/n32g45xrl-stb/rtconfig.py | 2 +- bsp/n32/n32g45xvl-stb/rtconfig.py | 2 +- bsp/n32/n32g4frml-stb/rtconfig.py | 2 +- bsp/n32/n32l40xcl-stb/rtconfig.py | 2 +- bsp/n32/n32l436-evb/rtconfig.py | 2 +- bsp/n32/n32l43xml-stb/rtconfig.py | 2 +- bsp/n32/n32l43xrl-stb/rtconfig.py | 2 +- bsp/n32/n32wb45xl-evb/rtconfig.py | 2 +- bsp/n32g452xx/n32g452xx-mini-system/rtconfig.py | 2 +- bsp/stm32/libraries/templates/stm32f0xx/rtconfig.py | 2 +- bsp/stm32/libraries/templates/stm32f10x/rtconfig.py | 2 +- bsp/stm32/libraries/templates/stm32f2xx/rtconfig.py | 2 +- bsp/stm32/libraries/templates/stm32f3xx/rtconfig.py | 2 +- bsp/stm32/libraries/templates/stm32f4xx/rtconfig.py | 2 +- bsp/stm32/libraries/templates/stm32f7xx/rtconfig.py | 2 +- bsp/stm32/libraries/templates/stm32h7xx/rtconfig.py | 2 +- bsp/stm32/libraries/templates/stm32l1xx/rtconfig.py | 2 +- bsp/stm32/libraries/templates/stm32mp1xx/rtconfig.py | 2 +- bsp/stm32/stm32f072-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32f091-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32f103-100ask-mini/rtconfig.py | 2 +- bsp/stm32/stm32f103-100ask-pro/rtconfig.py | 2 +- bsp/stm32/stm32f103-atk-nano/rtconfig.py | 2 +- bsp/stm32/stm32f103-atk-warshipv3/rtconfig.py | 2 +- bsp/stm32/stm32f103-blue-pill/rtconfig.py | 2 +- bsp/stm32/stm32f103-dofly-M3S/rtconfig.py | 2 +- bsp/stm32/stm32f103-dofly-lyc8/rtconfig.py | 2 +- bsp/stm32/stm32f103-fire-arbitrary/rtconfig.py | 2 +- bsp/stm32/stm32f103-gizwits-gokitv21/rtconfig.py | 2 +- bsp/stm32/stm32f103-hw100k-ibox/rtconfig.py | 2 +- bsp/stm32/stm32f103-keysking-learning/rtconfig.py | 2 +- bsp/stm32/stm32f103-onenet-nbiot/rtconfig.py | 2 +- bsp/stm32/stm32f103-yf-ufun/rtconfig.py | 2 +- bsp/stm32/stm32f103-ys-f1pro/rtconfig.py | 2 +- bsp/stm32/stm32f107-uc-eval/rtconfig.py | 2 +- bsp/stm32/stm32f207-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32f302-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32f334-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32f401-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32f401-weact-blackpill/rtconfig.py | 2 +- bsp/stm32/stm32f405-smdz-breadfruit/rtconfig.py | 2 +- bsp/stm32/stm32f405zg-mini-template/rtconfig.py | 2 +- bsp/stm32/stm32f407-armfly-v5/rtconfig.py | 2 +- bsp/stm32/stm32f407-atk-explorer/rtconfig.py | 2 +- bsp/stm32/stm32f407-fk407m2-zgt6/rtconfig.py | 2 +- bsp/stm32/stm32f407-lckfb-skystar/rtconfig.py | 2 +- bsp/stm32/stm32f407-micu/rtconfig.py | 2 +- bsp/stm32/stm32f407-robomaster-c/rtconfig.py | 2 +- bsp/stm32/stm32f407-rt-spark/rtconfig.py | 2 +- bsp/stm32/stm32f407-st-discovery/rtconfig.py | 2 +- bsp/stm32/stm32f410-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32f411-atk-nano/rtconfig.py | 2 +- bsp/stm32/stm32f411-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32f411-weact-blackpill/rtconfig.py | 2 +- bsp/stm32/stm32f413-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32f427-robomaster-a/rtconfig.py | 2 +- bsp/stm32/stm32f429-armfly-v6/rtconfig.py | 2 +- bsp/stm32/stm32f429-atk-apollo/rtconfig.py | 2 +- bsp/stm32/stm32f429-fire-challenger/rtconfig.py | 2 +- bsp/stm32/stm32f429-st-disco/rtconfig.py | 2 +- bsp/stm32/stm32f446-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32f469-st-disco/rtconfig.py | 2 +- bsp/stm32/stm32f767-atk-apollo/rtconfig.py | 2 +- bsp/stm32/stm32f767-fire-challenger-v1/rtconfig.py | 2 +- bsp/stm32/stm32f769-st-disco/rtconfig.py | 2 +- bsp/stm32/stm32g030-tiny-board/rtconfig.py | 2 +- bsp/stm32/stm32g070-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32g071-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32g431-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32g474-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32g491-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32h723-lxb-disco/rtconfig.py | 2 +- bsp/stm32/stm32h723-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32h730-esphosted-evb/rtconfig.py | 2 +- bsp/stm32/stm32h743-armfly-v7/rtconfig.py | 2 +- bsp/stm32/stm32h743-atk-apollo/rtconfig.py | 2 +- bsp/stm32/stm32h743-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32h747-st-discovery/rtconfig.py | 2 +- bsp/stm32/stm32h750-armfly-h7-tool/rtconfig.py | 2 +- bsp/stm32/stm32h750-artpi/rtconfig.py | 2 +- bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.py | 2 +- bsp/stm32/stm32h750-weact-ministm32h7xx/rtconfig.py | 2 +- bsp/stm32/stm32h7r7-artpi2/rtconfig.py | 2 +- bsp/stm32/stm32h7s7-st-disco/rtconfig.py | 2 +- bsp/stm32/stm32l010-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32l053-st-nucleo/rtconfig.py | 2 +- bsp/stm32/stm32mp157a-st-discovery/rtconfig.py | 2 +- bsp/stm32/stm32mp157a-st-ev1/rtconfig.py | 2 +- bsp/tm4c123bsp/rtconfig.py | 2 +- 170 files changed, 170 insertions(+), 170 deletions(-) diff --git a/bsp/Infineon/libraries/templates/PSOC62/rtconfig.py b/bsp/Infineon/libraries/templates/PSOC62/rtconfig.py index 4f41f6d9c2..894f6c293b 100644 --- a/bsp/Infineon/libraries/templates/PSOC62/rtconfig.py +++ b/bsp/Infineon/libraries/templates/PSOC62/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/Infineon/libraries/templates/XMC7200D/rtconfig.py b/bsp/Infineon/libraries/templates/XMC7200D/rtconfig.py index 283ed8e6ca..0dcdaa5c40 100644 --- a/bsp/Infineon/libraries/templates/XMC7200D/rtconfig.py +++ b/bsp/Infineon/libraries/templates/XMC7200D/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/Infineon/psoc6-cy8ckit-062-BLE/rtconfig.py b/bsp/Infineon/psoc6-cy8ckit-062-BLE/rtconfig.py index 4f41f6d9c2..894f6c293b 100644 --- a/bsp/Infineon/psoc6-cy8ckit-062-BLE/rtconfig.py +++ b/bsp/Infineon/psoc6-cy8ckit-062-BLE/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/Infineon/psoc6-cy8ckit-062-WIFI-BT/rtconfig.py b/bsp/Infineon/psoc6-cy8ckit-062-WIFI-BT/rtconfig.py index 25e6679827..4b4885055e 100644 --- a/bsp/Infineon/psoc6-cy8ckit-062-WIFI-BT/rtconfig.py +++ b/bsp/Infineon/psoc6-cy8ckit-062-WIFI-BT/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/Infineon/psoc6-cy8ckit-062S2-43012/rtconfig.py b/bsp/Infineon/psoc6-cy8ckit-062S2-43012/rtconfig.py index 25e6679827..4b4885055e 100644 --- a/bsp/Infineon/psoc6-cy8ckit-062S2-43012/rtconfig.py +++ b/bsp/Infineon/psoc6-cy8ckit-062S2-43012/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/Infineon/psoc6-cy8ckit-062s4/rtconfig.py b/bsp/Infineon/psoc6-cy8ckit-062s4/rtconfig.py index 4f41f6d9c2..894f6c293b 100644 --- a/bsp/Infineon/psoc6-cy8ckit-062s4/rtconfig.py +++ b/bsp/Infineon/psoc6-cy8ckit-062s4/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/Infineon/psoc6-cy8cproto-062S3-4343W/rtconfig.py b/bsp/Infineon/psoc6-cy8cproto-062S3-4343W/rtconfig.py index 25e6679827..4b4885055e 100644 --- a/bsp/Infineon/psoc6-cy8cproto-062S3-4343W/rtconfig.py +++ b/bsp/Infineon/psoc6-cy8cproto-062S3-4343W/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/Infineon/psoc6-evaluationkit-062S2/rtconfig.py b/bsp/Infineon/psoc6-evaluationkit-062S2/rtconfig.py index 25e6679827..4b4885055e 100644 --- a/bsp/Infineon/psoc6-evaluationkit-062S2/rtconfig.py +++ b/bsp/Infineon/psoc6-evaluationkit-062S2/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/Infineon/xmc7100d-f144k4160aa/rtconfig.py b/bsp/Infineon/xmc7100d-f144k4160aa/rtconfig.py index b7c20229f5..a08b29958a 100644 --- a/bsp/Infineon/xmc7100d-f144k4160aa/rtconfig.py +++ b/bsp/Infineon/xmc7100d-f144k4160aa/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/Infineon/xmc7200-kit_xmc7200_evk/rtconfig.py b/bsp/Infineon/xmc7200-kit_xmc7200_evk/rtconfig.py index 283ed8e6ca..0dcdaa5c40 100644 --- a/bsp/Infineon/xmc7200-kit_xmc7200_evk/rtconfig.py +++ b/bsp/Infineon/xmc7200-kit_xmc7200_evk/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/airm2m/air105/rtconfig.py b/bsp/airm2m/air105/rtconfig.py index 2b44ba2996..4b7a12385d 100644 --- a/bsp/airm2m/air105/rtconfig.py +++ b/bsp/airm2m/air105/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/airm2m/air32f103/rtconfig.py b/bsp/airm2m/air32f103/rtconfig.py index f0ab55a0e4..d04a49f7ef 100644 --- a/bsp/airm2m/air32f103/rtconfig.py +++ b/bsp/airm2m/air32f103/rtconfig.py @@ -75,7 +75,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32e103ze-evalboard/rtconfig.py b/bsp/apm32/apm32e103ze-evalboard/rtconfig.py index 7b1531669a..37a1bf71ae 100644 --- a/bsp/apm32/apm32e103ze-evalboard/rtconfig.py +++ b/bsp/apm32/apm32e103ze-evalboard/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32e103ze-tinyboard/rtconfig.py b/bsp/apm32/apm32e103ze-tinyboard/rtconfig.py index 7b1531669a..37a1bf71ae 100644 --- a/bsp/apm32/apm32e103ze-tinyboard/rtconfig.py +++ b/bsp/apm32/apm32e103ze-tinyboard/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32f030r8-miniboard/rtconfig.py b/bsp/apm32/apm32f030r8-miniboard/rtconfig.py index eca7e715d3..035956988b 100644 --- a/bsp/apm32/apm32f030r8-miniboard/rtconfig.py +++ b/bsp/apm32/apm32f030r8-miniboard/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32f051r8-evalboard/rtconfig.py b/bsp/apm32/apm32f051r8-evalboard/rtconfig.py index eca7e715d3..035956988b 100644 --- a/bsp/apm32/apm32f051r8-evalboard/rtconfig.py +++ b/bsp/apm32/apm32f051r8-evalboard/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32f072vb-miniboard/rtconfig.py b/bsp/apm32/apm32f072vb-miniboard/rtconfig.py index 2fd6753c9b..b35806edda 100644 --- a/bsp/apm32/apm32f072vb-miniboard/rtconfig.py +++ b/bsp/apm32/apm32f072vb-miniboard/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32f091vc-miniboard/rtconfig.py b/bsp/apm32/apm32f091vc-miniboard/rtconfig.py index 2fd6753c9b..b35806edda 100644 --- a/bsp/apm32/apm32f091vc-miniboard/rtconfig.py +++ b/bsp/apm32/apm32f091vc-miniboard/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32f103vb-miniboard/rtconfig.py b/bsp/apm32/apm32f103vb-miniboard/rtconfig.py index 483a7656f8..0a94eb8b22 100644 --- a/bsp/apm32/apm32f103vb-miniboard/rtconfig.py +++ b/bsp/apm32/apm32f103vb-miniboard/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32f103xe-minibroard/rtconfig.py b/bsp/apm32/apm32f103xe-minibroard/rtconfig.py index 7b1531669a..37a1bf71ae 100644 --- a/bsp/apm32/apm32f103xe-minibroard/rtconfig.py +++ b/bsp/apm32/apm32f103xe-minibroard/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32f107vc-evalboard/rtconfig.py b/bsp/apm32/apm32f107vc-evalboard/rtconfig.py index 7b1531669a..37a1bf71ae 100644 --- a/bsp/apm32/apm32f107vc-evalboard/rtconfig.py +++ b/bsp/apm32/apm32f107vc-evalboard/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32f407ig-minibroard/rtconfig.py b/bsp/apm32/apm32f407ig-minibroard/rtconfig.py index 45c2f0bc96..83e0233b20 100644 --- a/bsp/apm32/apm32f407ig-minibroard/rtconfig.py +++ b/bsp/apm32/apm32f407ig-minibroard/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32f407zg-evalboard/rtconfig.py b/bsp/apm32/apm32f407zg-evalboard/rtconfig.py index 8153d85923..6bb1bd7030 100644 --- a/bsp/apm32/apm32f407zg-evalboard/rtconfig.py +++ b/bsp/apm32/apm32f407zg-evalboard/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/apm32/apm32s103vb-miniboard/rtconfig.py b/bsp/apm32/apm32s103vb-miniboard/rtconfig.py index 7b1531669a..37a1bf71ae 100644 --- a/bsp/apm32/apm32s103vb-miniboard/rtconfig.py +++ b/bsp/apm32/apm32s103vb-miniboard/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32a403a-start/rtconfig.py b/bsp/at32/at32a403a-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32a403a-start/rtconfig.py +++ b/bsp/at32/at32a403a-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32a423-start/rtconfig.py b/bsp/at32/at32a423-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32a423-start/rtconfig.py +++ b/bsp/at32/at32a423-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f402-start/rtconfig.py b/bsp/at32/at32f402-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32f402-start/rtconfig.py +++ b/bsp/at32/at32f402-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f403a-start/rtconfig.py b/bsp/at32/at32f403a-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32f403a-start/rtconfig.py +++ b/bsp/at32/at32f403a-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f405-start/rtconfig.py b/bsp/at32/at32f405-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32f405-start/rtconfig.py +++ b/bsp/at32/at32f405-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f407-start/rtconfig.py b/bsp/at32/at32f407-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32f407-start/rtconfig.py +++ b/bsp/at32/at32f407-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f413-start/rtconfig.py b/bsp/at32/at32f413-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32f413-start/rtconfig.py +++ b/bsp/at32/at32f413-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f415-start/rtconfig.py b/bsp/at32/at32f415-start/rtconfig.py index 84a45272f9..438cfb028d 100644 --- a/bsp/at32/at32f415-start/rtconfig.py +++ b/bsp/at32/at32f415-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f421-start/rtconfig.py b/bsp/at32/at32f421-start/rtconfig.py index 84a45272f9..438cfb028d 100644 --- a/bsp/at32/at32f421-start/rtconfig.py +++ b/bsp/at32/at32f421-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f423-start/rtconfig.py b/bsp/at32/at32f423-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32f423-start/rtconfig.py +++ b/bsp/at32/at32f423-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f425-start/rtconfig.py b/bsp/at32/at32f425-start/rtconfig.py index 84a45272f9..438cfb028d 100644 --- a/bsp/at32/at32f425-start/rtconfig.py +++ b/bsp/at32/at32f425-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f435-start/rtconfig.py b/bsp/at32/at32f435-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32f435-start/rtconfig.py +++ b/bsp/at32/at32f435-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f437-start/rtconfig.py b/bsp/at32/at32f437-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32f437-start/rtconfig.py +++ b/bsp/at32/at32f437-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f455-start/rtconfig.py b/bsp/at32/at32f455-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32f455-start/rtconfig.py +++ b/bsp/at32/at32f455-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f456-start/rtconfig.py b/bsp/at32/at32f456-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32f456-start/rtconfig.py +++ b/bsp/at32/at32f456-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32f457-start/rtconfig.py b/bsp/at32/at32f457-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32f457-start/rtconfig.py +++ b/bsp/at32/at32f457-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32m412-start/rtconfig.py b/bsp/at32/at32m412-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32m412-start/rtconfig.py +++ b/bsp/at32/at32m412-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/at32/at32m416-start/rtconfig.py b/bsp/at32/at32m416-start/rtconfig.py index fa627618e8..03ef518902 100644 --- a/bsp/at32/at32m416-start/rtconfig.py +++ b/bsp/at32/at32m416-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/fm33lc026/rtconfig.py b/bsp/fm33lc026/rtconfig.py index 19cd290404..aa5a02af42 100644 --- a/bsp/fm33lc026/rtconfig.py +++ b/bsp/fm33lc026/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/ft32/ft32f072xb-starter/rtconfig.py b/bsp/ft32/ft32f072xb-starter/rtconfig.py index 9818b62f9d..defc57f149 100644 --- a/bsp/ft32/ft32f072xb-starter/rtconfig.py +++ b/bsp/ft32/ft32f072xb-starter/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/gd32/arm/gd32103c-eval/rtconfig.py b/bsp/gd32/arm/gd32103c-eval/rtconfig.py index a06cb7c4e6..cc2b68f0ea 100644 --- a/bsp/gd32/arm/gd32103c-eval/rtconfig.py +++ b/bsp/gd32/arm/gd32103c-eval/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M3.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32105c-eval/rtconfig.py b/bsp/gd32/arm/gd32105c-eval/rtconfig.py index a06cb7c4e6..cc2b68f0ea 100644 --- a/bsp/gd32/arm/gd32105c-eval/rtconfig.py +++ b/bsp/gd32/arm/gd32105c-eval/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M3.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32105r-start/rtconfig.py b/bsp/gd32/arm/gd32105r-start/rtconfig.py index 6c9b6ea8dc..20c8f2bc3b 100644 --- a/bsp/gd32/arm/gd32105r-start/rtconfig.py +++ b/bsp/gd32/arm/gd32105r-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M3.fp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32107c-eval/rtconfig.py b/bsp/gd32/arm/gd32107c-eval/rtconfig.py index a06cb7c4e6..cc2b68f0ea 100644 --- a/bsp/gd32/arm/gd32107c-eval/rtconfig.py +++ b/bsp/gd32/arm/gd32107c-eval/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M3.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32205r-start/rtconfig.py b/bsp/gd32/arm/gd32205r-start/rtconfig.py index a06cb7c4e6..cc2b68f0ea 100644 --- a/bsp/gd32/arm/gd32205r-start/rtconfig.py +++ b/bsp/gd32/arm/gd32205r-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M3.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32207i-eval/rtconfig.py b/bsp/gd32/arm/gd32207i-eval/rtconfig.py index a06cb7c4e6..cc2b68f0ea 100644 --- a/bsp/gd32/arm/gd32207i-eval/rtconfig.py +++ b/bsp/gd32/arm/gd32207i-eval/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M3.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32303c-start/rtconfig.py b/bsp/gd32/arm/gd32303c-start/rtconfig.py index 93e0bbe48f..555edb6d01 100644 --- a/bsp/gd32/arm/gd32303c-start/rtconfig.py +++ b/bsp/gd32/arm/gd32303c-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32303e-eval/rtconfig.py b/bsp/gd32/arm/gd32303e-eval/rtconfig.py index 93e0bbe48f..555edb6d01 100644 --- a/bsp/gd32/arm/gd32303e-eval/rtconfig.py +++ b/bsp/gd32/arm/gd32303e-eval/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32305r-start/rtconfig.py b/bsp/gd32/arm/gd32305r-start/rtconfig.py index 93e0bbe48f..555edb6d01 100644 --- a/bsp/gd32/arm/gd32305r-start/rtconfig.py +++ b/bsp/gd32/arm/gd32305r-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32307e-start/rtconfig.py b/bsp/gd32/arm/gd32307e-start/rtconfig.py index 93e0bbe48f..555edb6d01 100644 --- a/bsp/gd32/arm/gd32307e-start/rtconfig.py +++ b/bsp/gd32/arm/gd32307e-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32407v-lckfb/rtconfig.py b/bsp/gd32/arm/gd32407v-lckfb/rtconfig.py index d37afd4c07..f6fe699ce4 100644 --- a/bsp/gd32/arm/gd32407v-lckfb/rtconfig.py +++ b/bsp/gd32/arm/gd32407v-lckfb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32407v-start/rtconfig.py b/bsp/gd32/arm/gd32407v-start/rtconfig.py index d37afd4c07..f6fe699ce4 100644 --- a/bsp/gd32/arm/gd32407v-start/rtconfig.py +++ b/bsp/gd32/arm/gd32407v-start/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32450z-eval/rtconfig.py b/bsp/gd32/arm/gd32450z-eval/rtconfig.py index 99336a8ad4..d150e13252 100644 --- a/bsp/gd32/arm/gd32450z-eval/rtconfig.py +++ b/bsp/gd32/arm/gd32450z-eval/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32470i-eval/rtconfig.py b/bsp/gd32/arm/gd32470i-eval/rtconfig.py index b2361d1052..fcb68ff6a0 100644 --- a/bsp/gd32/arm/gd32470i-eval/rtconfig.py +++ b/bsp/gd32/arm/gd32470i-eval/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armclang': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32470z-lckfb/rtconfig.py b/bsp/gd32/arm/gd32470z-lckfb/rtconfig.py index ac947b28c1..1a71c0e964 100644 --- a/bsp/gd32/arm/gd32470z-lckfb/rtconfig.py +++ b/bsp/gd32/arm/gd32470z-lckfb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armclang': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32527I-eval/rtconfig.py b/bsp/gd32/arm/gd32527I-eval/rtconfig.py index af4839de00..38013f507c 100644 --- a/bsp/gd32/arm/gd32527I-eval/rtconfig.py +++ b/bsp/gd32/arm/gd32527I-eval/rtconfig.py @@ -107,7 +107,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M33.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32e503v-eval/rtconfig.py b/bsp/gd32/arm/gd32e503v-eval/rtconfig.py index 93e0bbe48f..555edb6d01 100644 --- a/bsp/gd32/arm/gd32e503v-eval/rtconfig.py +++ b/bsp/gd32/arm/gd32e503v-eval/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32h759i-eval/rtconfig.py b/bsp/gd32/arm/gd32h759i-eval/rtconfig.py index 5df9eca7e6..d0db2c1742 100644 --- a/bsp/gd32/arm/gd32h759i-eval/rtconfig.py +++ b/bsp/gd32/arm/gd32h759i-eval/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/gd32/arm/gd32h759i-start/rtconfig.py b/bsp/gd32/arm/gd32h759i-start/rtconfig.py index 5df9eca7e6..d0db2c1742 100644 --- a/bsp/gd32/arm/gd32h759i-start/rtconfig.py +++ b/bsp/gd32/arm/gd32h759i-start/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/hc32/ev_hc32f334_lqfp64/rtconfig.py b/bsp/hc32/ev_hc32f334_lqfp64/rtconfig.py index 568d50f2a6..0af49fd02b 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/rtconfig.py +++ b/bsp/hc32/ev_hc32f334_lqfp64/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/hc32/ev_hc32f448_lqfp80/rtconfig.py b/bsp/hc32/ev_hc32f448_lqfp80/rtconfig.py index 568d50f2a6..0af49fd02b 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/rtconfig.py +++ b/bsp/hc32/ev_hc32f448_lqfp80/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/rtconfig.py b/bsp/hc32/ev_hc32f460_lqfp100_v2/rtconfig.py index 568d50f2a6..0af49fd02b 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/rtconfig.py +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/hc32/ev_hc32f472_lqfp100/rtconfig.py b/bsp/hc32/ev_hc32f472_lqfp100/rtconfig.py index 568d50f2a6..0af49fd02b 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/rtconfig.py +++ b/bsp/hc32/ev_hc32f472_lqfp100/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/rtconfig.py b/bsp/hc32/ev_hc32f4a0_lqfp176/rtconfig.py index 568d50f2a6..0af49fd02b 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/rtconfig.py +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/rtconfig.py b/bsp/hc32/ev_hc32f4a8_lqfp176/rtconfig.py index 568d50f2a6..0af49fd02b 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/rtconfig.py +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/hc32/lckfb-hc32f4a0-lqfp100/rtconfig.py b/bsp/hc32/lckfb-hc32f4a0-lqfp100/rtconfig.py index 568d50f2a6..0af49fd02b 100644 --- a/bsp/hc32/lckfb-hc32f4a0-lqfp100/rtconfig.py +++ b/bsp/hc32/lckfb-hc32f4a0-lqfp100/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/hc32l196/rtconfig.py b/bsp/hc32l196/rtconfig.py index a63cea240e..ca2b698076 100644 --- a/bsp/hc32l196/rtconfig.py +++ b/bsp/hc32l196/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/hk32/hk32f030c8-mini/rtconfig.py b/bsp/hk32/hk32f030c8-mini/rtconfig.py index 97aa33f0c5..d6e1b750b0 100644 --- a/bsp/hk32/hk32f030c8-mini/rtconfig.py +++ b/bsp/hk32/hk32f030c8-mini/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/ht32/ht32f12366/rtconfig.py b/bsp/ht32/ht32f12366/rtconfig.py index 33ae6cc4fa..159b468889 100644 --- a/bsp/ht32/ht32f12366/rtconfig.py +++ b/bsp/ht32/ht32f12366/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/ht32/ht32f52352/rtconfig.py b/bsp/ht32/ht32f52352/rtconfig.py index 0525f0267a..59ebb20215 100644 --- a/bsp/ht32/ht32f52352/rtconfig.py +++ b/bsp/ht32/ht32f52352/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/ht32/ht32f53252/rtconfig.py b/bsp/ht32/ht32f53252/rtconfig.py index 6f853dccc2..1350ba71bf 100644 --- a/bsp/ht32/ht32f53252/rtconfig.py +++ b/bsp/ht32/ht32f53252/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/mm32/mm32f3270-100ask-pitaya/rtconfig.py b/bsp/mm32/mm32f3270-100ask-pitaya/rtconfig.py index 0c161f9756..2eafb3e54a 100644 --- a/bsp/mm32/mm32f3270-100ask-pitaya/rtconfig.py +++ b/bsp/mm32/mm32f3270-100ask-pitaya/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/msp432e401y-LaunchPad/rtconfig.py b/bsp/msp432e401y-LaunchPad/rtconfig.py index 4b90fc76bf..9d45314715 100644 --- a/bsp/msp432e401y-LaunchPad/rtconfig.py +++ b/bsp/msp432e401y-LaunchPad/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/n32/n32g43xcl-stb/rtconfig.py b/bsp/n32/n32g43xcl-stb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32g43xcl-stb/rtconfig.py +++ b/bsp/n32/n32g43xcl-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32g457qel-stb/rtconfig.py b/bsp/n32/n32g457qel-stb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32g457qel-stb/rtconfig.py +++ b/bsp/n32/n32g457qel-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32g45xcl-stb/rtconfig.py b/bsp/n32/n32g45xcl-stb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32g45xcl-stb/rtconfig.py +++ b/bsp/n32/n32g45xcl-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32g45xml-stb/rtconfig.py b/bsp/n32/n32g45xml-stb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32g45xml-stb/rtconfig.py +++ b/bsp/n32/n32g45xml-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32g45xrl-stb/rtconfig.py b/bsp/n32/n32g45xrl-stb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32g45xrl-stb/rtconfig.py +++ b/bsp/n32/n32g45xrl-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32g45xvl-stb/rtconfig.py b/bsp/n32/n32g45xvl-stb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32g45xvl-stb/rtconfig.py +++ b/bsp/n32/n32g45xvl-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32g4frml-stb/rtconfig.py b/bsp/n32/n32g4frml-stb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32g4frml-stb/rtconfig.py +++ b/bsp/n32/n32g4frml-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32l40xcl-stb/rtconfig.py b/bsp/n32/n32l40xcl-stb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32l40xcl-stb/rtconfig.py +++ b/bsp/n32/n32l40xcl-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32l436-evb/rtconfig.py b/bsp/n32/n32l436-evb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32l436-evb/rtconfig.py +++ b/bsp/n32/n32l436-evb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32l43xml-stb/rtconfig.py b/bsp/n32/n32l43xml-stb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32l43xml-stb/rtconfig.py +++ b/bsp/n32/n32l43xml-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32l43xrl-stb/rtconfig.py b/bsp/n32/n32l43xrl-stb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32l43xrl-stb/rtconfig.py +++ b/bsp/n32/n32l43xrl-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32wb45xl-evb/rtconfig.py b/bsp/n32/n32wb45xl-evb/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/n32/n32wb45xl-evb/rtconfig.py +++ b/bsp/n32/n32wb45xl-evb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32g452xx/n32g452xx-mini-system/rtconfig.py b/bsp/n32g452xx/n32g452xx-mini-system/rtconfig.py index c7cbe3fb64..0c111382af 100755 --- a/bsp/n32g452xx/n32g452xx-mini-system/rtconfig.py +++ b/bsp/n32g452xx/n32g452xx-mini-system/rtconfig.py @@ -79,7 +79,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/libraries/templates/stm32f0xx/rtconfig.py b/bsp/stm32/libraries/templates/stm32f0xx/rtconfig.py index 9b8d8076e0..76f60a8b01 100644 --- a/bsp/stm32/libraries/templates/stm32f0xx/rtconfig.py +++ b/bsp/stm32/libraries/templates/stm32f0xx/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/libraries/templates/stm32f10x/rtconfig.py b/bsp/stm32/libraries/templates/stm32f10x/rtconfig.py index 7ed928ddba..094633253e 100644 --- a/bsp/stm32/libraries/templates/stm32f10x/rtconfig.py +++ b/bsp/stm32/libraries/templates/stm32f10x/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/libraries/templates/stm32f2xx/rtconfig.py b/bsp/stm32/libraries/templates/stm32f2xx/rtconfig.py index 3e047b559c..2b11276521 100644 --- a/bsp/stm32/libraries/templates/stm32f2xx/rtconfig.py +++ b/bsp/stm32/libraries/templates/stm32f2xx/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/libraries/templates/stm32f3xx/rtconfig.py b/bsp/stm32/libraries/templates/stm32f3xx/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/libraries/templates/stm32f3xx/rtconfig.py +++ b/bsp/stm32/libraries/templates/stm32f3xx/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.py b/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.py +++ b/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.py b/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.py index 06215daed3..2417d2eba7 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.py +++ b/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/libraries/templates/stm32h7xx/rtconfig.py b/bsp/stm32/libraries/templates/stm32h7xx/rtconfig.py index 8da8c57718..ad180fbfdf 100644 --- a/bsp/stm32/libraries/templates/stm32h7xx/rtconfig.py +++ b/bsp/stm32/libraries/templates/stm32h7xx/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/libraries/templates/stm32l1xx/rtconfig.py b/bsp/stm32/libraries/templates/stm32l1xx/rtconfig.py index fa54f25493..c89dbafcd4 100644 --- a/bsp/stm32/libraries/templates/stm32l1xx/rtconfig.py +++ b/bsp/stm32/libraries/templates/stm32l1xx/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/libraries/templates/stm32mp1xx/rtconfig.py b/bsp/stm32/libraries/templates/stm32mp1xx/rtconfig.py index d2446f9fde..70a527b6fe 100644 --- a/bsp/stm32/libraries/templates/stm32mp1xx/rtconfig.py +++ b/bsp/stm32/libraries/templates/stm32mp1xx/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32f072-st-nucleo/rtconfig.py b/bsp/stm32/stm32f072-st-nucleo/rtconfig.py index 9818b62f9d..defc57f149 100644 --- a/bsp/stm32/stm32f072-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32f072-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f091-st-nucleo/rtconfig.py b/bsp/stm32/stm32f091-st-nucleo/rtconfig.py index 5f41e855a3..d84dcf07c1 100644 --- a/bsp/stm32/stm32f091-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32f091-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-100ask-mini/rtconfig.py b/bsp/stm32/stm32f103-100ask-mini/rtconfig.py index d1e49f8cb1..1169581b53 100644 --- a/bsp/stm32/stm32f103-100ask-mini/rtconfig.py +++ b/bsp/stm32/stm32f103-100ask-mini/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-100ask-pro/rtconfig.py b/bsp/stm32/stm32f103-100ask-pro/rtconfig.py index d1e49f8cb1..1169581b53 100644 --- a/bsp/stm32/stm32f103-100ask-pro/rtconfig.py +++ b/bsp/stm32/stm32f103-100ask-pro/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-atk-nano/rtconfig.py b/bsp/stm32/stm32f103-atk-nano/rtconfig.py index 4f3ce9e99a..f77904a462 100644 --- a/bsp/stm32/stm32f103-atk-nano/rtconfig.py +++ b/bsp/stm32/stm32f103-atk-nano/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-atk-warshipv3/rtconfig.py b/bsp/stm32/stm32f103-atk-warshipv3/rtconfig.py index 558924a36a..71a9ed0a53 100644 --- a/bsp/stm32/stm32f103-atk-warshipv3/rtconfig.py +++ b/bsp/stm32/stm32f103-atk-warshipv3/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-blue-pill/rtconfig.py b/bsp/stm32/stm32f103-blue-pill/rtconfig.py index 5334a94faa..b8c631c4ef 100644 --- a/bsp/stm32/stm32f103-blue-pill/rtconfig.py +++ b/bsp/stm32/stm32f103-blue-pill/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-dofly-M3S/rtconfig.py b/bsp/stm32/stm32f103-dofly-M3S/rtconfig.py index 61ba95699e..ffb2af80c6 100644 --- a/bsp/stm32/stm32f103-dofly-M3S/rtconfig.py +++ b/bsp/stm32/stm32f103-dofly-M3S/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32f103-dofly-lyc8/rtconfig.py b/bsp/stm32/stm32f103-dofly-lyc8/rtconfig.py index ea0c3aee4a..80adfae3bc 100644 --- a/bsp/stm32/stm32f103-dofly-lyc8/rtconfig.py +++ b/bsp/stm32/stm32f103-dofly-lyc8/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.py b/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.py index b90f7e65a9..aea30bd9f3 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.py +++ b/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-gizwits-gokitv21/rtconfig.py b/bsp/stm32/stm32f103-gizwits-gokitv21/rtconfig.py index 558924a36a..71a9ed0a53 100644 --- a/bsp/stm32/stm32f103-gizwits-gokitv21/rtconfig.py +++ b/bsp/stm32/stm32f103-gizwits-gokitv21/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-hw100k-ibox/rtconfig.py b/bsp/stm32/stm32f103-hw100k-ibox/rtconfig.py index 558924a36a..71a9ed0a53 100644 --- a/bsp/stm32/stm32f103-hw100k-ibox/rtconfig.py +++ b/bsp/stm32/stm32f103-hw100k-ibox/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-keysking-learning/rtconfig.py b/bsp/stm32/stm32f103-keysking-learning/rtconfig.py index 5334a94faa..b8c631c4ef 100644 --- a/bsp/stm32/stm32f103-keysking-learning/rtconfig.py +++ b/bsp/stm32/stm32f103-keysking-learning/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-onenet-nbiot/rtconfig.py b/bsp/stm32/stm32f103-onenet-nbiot/rtconfig.py index 03db7f3826..ca39ddee7c 100644 --- a/bsp/stm32/stm32f103-onenet-nbiot/rtconfig.py +++ b/bsp/stm32/stm32f103-onenet-nbiot/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-yf-ufun/rtconfig.py b/bsp/stm32/stm32f103-yf-ufun/rtconfig.py index 558924a36a..71a9ed0a53 100644 --- a/bsp/stm32/stm32f103-yf-ufun/rtconfig.py +++ b/bsp/stm32/stm32f103-yf-ufun/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f103-ys-f1pro/rtconfig.py b/bsp/stm32/stm32f103-ys-f1pro/rtconfig.py index 558924a36a..71a9ed0a53 100644 --- a/bsp/stm32/stm32f103-ys-f1pro/rtconfig.py +++ b/bsp/stm32/stm32f103-ys-f1pro/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f107-uc-eval/rtconfig.py b/bsp/stm32/stm32f107-uc-eval/rtconfig.py index b90f7e65a9..aea30bd9f3 100644 --- a/bsp/stm32/stm32f107-uc-eval/rtconfig.py +++ b/bsp/stm32/stm32f107-uc-eval/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f207-st-nucleo/rtconfig.py b/bsp/stm32/stm32f207-st-nucleo/rtconfig.py index 3e047b559c..2b11276521 100644 --- a/bsp/stm32/stm32f207-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32f207-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f302-st-nucleo/rtconfig.py b/bsp/stm32/stm32f302-st-nucleo/rtconfig.py index 9d514aa1a8..e564a53fbe 100644 --- a/bsp/stm32/stm32f302-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32f302-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f334-st-nucleo/rtconfig.py b/bsp/stm32/stm32f334-st-nucleo/rtconfig.py index 9d514aa1a8..e564a53fbe 100644 --- a/bsp/stm32/stm32f334-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32f334-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f401-st-nucleo/rtconfig.py b/bsp/stm32/stm32f401-st-nucleo/rtconfig.py index cc91404e87..f843ab6fa3 100644 --- a/bsp/stm32/stm32f401-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32f401-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f401-weact-blackpill/rtconfig.py b/bsp/stm32/stm32f401-weact-blackpill/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32f401-weact-blackpill/rtconfig.py +++ b/bsp/stm32/stm32f401-weact-blackpill/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f405-smdz-breadfruit/rtconfig.py b/bsp/stm32/stm32f405-smdz-breadfruit/rtconfig.py index 1027da3a96..7a11d11066 100644 --- a/bsp/stm32/stm32f405-smdz-breadfruit/rtconfig.py +++ b/bsp/stm32/stm32f405-smdz-breadfruit/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f405zg-mini-template/rtconfig.py b/bsp/stm32/stm32f405zg-mini-template/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32f405zg-mini-template/rtconfig.py +++ b/bsp/stm32/stm32f405zg-mini-template/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f407-armfly-v5/rtconfig.py b/bsp/stm32/stm32f407-armfly-v5/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32f407-armfly-v5/rtconfig.py +++ b/bsp/stm32/stm32f407-armfly-v5/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f407-atk-explorer/rtconfig.py b/bsp/stm32/stm32f407-atk-explorer/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32f407-atk-explorer/rtconfig.py +++ b/bsp/stm32/stm32f407-atk-explorer/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f407-fk407m2-zgt6/rtconfig.py b/bsp/stm32/stm32f407-fk407m2-zgt6/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32f407-fk407m2-zgt6/rtconfig.py +++ b/bsp/stm32/stm32f407-fk407m2-zgt6/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f407-lckfb-skystar/rtconfig.py b/bsp/stm32/stm32f407-lckfb-skystar/rtconfig.py index 8195d720df..771c140e4f 100644 --- a/bsp/stm32/stm32f407-lckfb-skystar/rtconfig.py +++ b/bsp/stm32/stm32f407-lckfb-skystar/rtconfig.py @@ -77,7 +77,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f407-micu/rtconfig.py b/bsp/stm32/stm32f407-micu/rtconfig.py index 3d6cf9996b..20d2c181a2 100644 --- a/bsp/stm32/stm32f407-micu/rtconfig.py +++ b/bsp/stm32/stm32f407-micu/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f407-robomaster-c/rtconfig.py b/bsp/stm32/stm32f407-robomaster-c/rtconfig.py index fa38f4e52b..492309124c 100644 --- a/bsp/stm32/stm32f407-robomaster-c/rtconfig.py +++ b/bsp/stm32/stm32f407-robomaster-c/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f407-rt-spark/rtconfig.py b/bsp/stm32/stm32f407-rt-spark/rtconfig.py index 41c4b00ffb..83aea1098e 100644 --- a/bsp/stm32/stm32f407-rt-spark/rtconfig.py +++ b/bsp/stm32/stm32f407-rt-spark/rtconfig.py @@ -78,7 +78,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f407-st-discovery/rtconfig.py b/bsp/stm32/stm32f407-st-discovery/rtconfig.py index d2446f9fde..70a527b6fe 100644 --- a/bsp/stm32/stm32f407-st-discovery/rtconfig.py +++ b/bsp/stm32/stm32f407-st-discovery/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32f410-st-nucleo/rtconfig.py b/bsp/stm32/stm32f410-st-nucleo/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/stm32/stm32f410-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32f410-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32f411-atk-nano/rtconfig.py b/bsp/stm32/stm32f411-atk-nano/rtconfig.py index f92cd4c85f..7352b3dbb8 100644 --- a/bsp/stm32/stm32f411-atk-nano/rtconfig.py +++ b/bsp/stm32/stm32f411-atk-nano/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f411-st-nucleo/rtconfig.py b/bsp/stm32/stm32f411-st-nucleo/rtconfig.py index 72a60ae53f..4d1781fd68 100644 --- a/bsp/stm32/stm32f411-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32f411-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32f411-weact-blackpill/rtconfig.py b/bsp/stm32/stm32f411-weact-blackpill/rtconfig.py index c3765e6f08..2a0371110c 100644 --- a/bsp/stm32/stm32f411-weact-blackpill/rtconfig.py +++ b/bsp/stm32/stm32f411-weact-blackpill/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32f413-st-nucleo/rtconfig.py b/bsp/stm32/stm32f413-st-nucleo/rtconfig.py index f92cd4c85f..7352b3dbb8 100644 --- a/bsp/stm32/stm32f413-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32f413-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f427-robomaster-a/rtconfig.py b/bsp/stm32/stm32f427-robomaster-a/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32f427-robomaster-a/rtconfig.py +++ b/bsp/stm32/stm32f427-robomaster-a/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f429-armfly-v6/rtconfig.py b/bsp/stm32/stm32f429-armfly-v6/rtconfig.py index df5ad74299..605ef8bfcc 100644 --- a/bsp/stm32/stm32f429-armfly-v6/rtconfig.py +++ b/bsp/stm32/stm32f429-armfly-v6/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f429-atk-apollo/rtconfig.py b/bsp/stm32/stm32f429-atk-apollo/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32f429-atk-apollo/rtconfig.py +++ b/bsp/stm32/stm32f429-atk-apollo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f429-fire-challenger/rtconfig.py b/bsp/stm32/stm32f429-fire-challenger/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32f429-fire-challenger/rtconfig.py +++ b/bsp/stm32/stm32f429-fire-challenger/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f429-st-disco/rtconfig.py b/bsp/stm32/stm32f429-st-disco/rtconfig.py index d2446f9fde..70a527b6fe 100644 --- a/bsp/stm32/stm32f429-st-disco/rtconfig.py +++ b/bsp/stm32/stm32f429-st-disco/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32f446-st-nucleo/rtconfig.py b/bsp/stm32/stm32f446-st-nucleo/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32f446-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32f446-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f469-st-disco/rtconfig.py b/bsp/stm32/stm32f469-st-disco/rtconfig.py index d2446f9fde..70a527b6fe 100644 --- a/bsp/stm32/stm32f469-st-disco/rtconfig.py +++ b/bsp/stm32/stm32f469-st-disco/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32f767-atk-apollo/rtconfig.py b/bsp/stm32/stm32f767-atk-apollo/rtconfig.py index 663c053f39..266b5df1a3 100644 --- a/bsp/stm32/stm32f767-atk-apollo/rtconfig.py +++ b/bsp/stm32/stm32f767-atk-apollo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f767-fire-challenger-v1/rtconfig.py b/bsp/stm32/stm32f767-fire-challenger-v1/rtconfig.py index ea1f99f4cb..1b0f9fa211 100644 --- a/bsp/stm32/stm32f767-fire-challenger-v1/rtconfig.py +++ b/bsp/stm32/stm32f767-fire-challenger-v1/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32f769-st-disco/rtconfig.py b/bsp/stm32/stm32f769-st-disco/rtconfig.py index 65a3b8e2a5..28fd66d3b7 100644 --- a/bsp/stm32/stm32f769-st-disco/rtconfig.py +++ b/bsp/stm32/stm32f769-st-disco/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32g030-tiny-board/rtconfig.py b/bsp/stm32/stm32g030-tiny-board/rtconfig.py index 9b8d8076e0..76f60a8b01 100644 --- a/bsp/stm32/stm32g030-tiny-board/rtconfig.py +++ b/bsp/stm32/stm32g030-tiny-board/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32g070-st-nucleo/rtconfig.py b/bsp/stm32/stm32g070-st-nucleo/rtconfig.py index afd5f66e4a..68329427c5 100644 --- a/bsp/stm32/stm32g070-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32g070-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32g071-st-nucleo/rtconfig.py b/bsp/stm32/stm32g071-st-nucleo/rtconfig.py index afd5f66e4a..68329427c5 100644 --- a/bsp/stm32/stm32g071-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32g071-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32g431-st-nucleo/rtconfig.py b/bsp/stm32/stm32g431-st-nucleo/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32g431-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32g431-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32g474-st-nucleo/rtconfig.py b/bsp/stm32/stm32g474-st-nucleo/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32g474-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32g474-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32g491-st-nucleo/rtconfig.py b/bsp/stm32/stm32g491-st-nucleo/rtconfig.py index 5e5bc02064..fce7a2e43a 100644 --- a/bsp/stm32/stm32g491-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32g491-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32h723-lxb-disco/rtconfig.py b/bsp/stm32/stm32h723-lxb-disco/rtconfig.py index 4df33fb29f..0faa569ce1 100644 --- a/bsp/stm32/stm32h723-lxb-disco/rtconfig.py +++ b/bsp/stm32/stm32h723-lxb-disco/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h723-st-nucleo/rtconfig.py b/bsp/stm32/stm32h723-st-nucleo/rtconfig.py index 15ddd3158a..35537f6859 100644 --- a/bsp/stm32/stm32h723-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32h723-st-nucleo/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h730-esphosted-evb/rtconfig.py b/bsp/stm32/stm32h730-esphosted-evb/rtconfig.py index a2488720bf..4b252fcd5e 100644 --- a/bsp/stm32/stm32h730-esphosted-evb/rtconfig.py +++ b/bsp/stm32/stm32h730-esphosted-evb/rtconfig.py @@ -80,7 +80,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h743-armfly-v7/rtconfig.py b/bsp/stm32/stm32h743-armfly-v7/rtconfig.py index 15ddd3158a..35537f6859 100644 --- a/bsp/stm32/stm32h743-armfly-v7/rtconfig.py +++ b/bsp/stm32/stm32h743-armfly-v7/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h743-atk-apollo/rtconfig.py b/bsp/stm32/stm32h743-atk-apollo/rtconfig.py index 15ddd3158a..35537f6859 100644 --- a/bsp/stm32/stm32h743-atk-apollo/rtconfig.py +++ b/bsp/stm32/stm32h743-atk-apollo/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h743-st-nucleo/rtconfig.py b/bsp/stm32/stm32h743-st-nucleo/rtconfig.py index 15ddd3158a..35537f6859 100644 --- a/bsp/stm32/stm32h743-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32h743-st-nucleo/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h747-st-discovery/rtconfig.py b/bsp/stm32/stm32h747-st-discovery/rtconfig.py index 15ddd3158a..35537f6859 100644 --- a/bsp/stm32/stm32h747-st-discovery/rtconfig.py +++ b/bsp/stm32/stm32h747-st-discovery/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h750-armfly-h7-tool/rtconfig.py b/bsp/stm32/stm32h750-armfly-h7-tool/rtconfig.py index 15ddd3158a..35537f6859 100644 --- a/bsp/stm32/stm32h750-armfly-h7-tool/rtconfig.py +++ b/bsp/stm32/stm32h750-armfly-h7-tool/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h750-artpi/rtconfig.py b/bsp/stm32/stm32h750-artpi/rtconfig.py index 8db22e414c..10461925ab 100644 --- a/bsp/stm32/stm32h750-artpi/rtconfig.py +++ b/bsp/stm32/stm32h750-artpi/rtconfig.py @@ -75,7 +75,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.py b/bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.py index c826e54dab..30278c93d7 100644 --- a/bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.py +++ b/bsp/stm32/stm32h750-fk750m1-vbt6/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h750-weact-ministm32h7xx/rtconfig.py b/bsp/stm32/stm32h750-weact-ministm32h7xx/rtconfig.py index c826e54dab..30278c93d7 100644 --- a/bsp/stm32/stm32h750-weact-ministm32h7xx/rtconfig.py +++ b/bsp/stm32/stm32h750-weact-ministm32h7xx/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h7r7-artpi2/rtconfig.py b/bsp/stm32/stm32h7r7-artpi2/rtconfig.py index 00713f92b1..a3372112b1 100644 --- a/bsp/stm32/stm32h7r7-artpi2/rtconfig.py +++ b/bsp/stm32/stm32h7r7-artpi2/rtconfig.py @@ -71,7 +71,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32h7s7-st-disco/rtconfig.py b/bsp/stm32/stm32h7s7-st-disco/rtconfig.py index fa67b76941..f759087e0e 100644 --- a/bsp/stm32/stm32h7s7-st-disco/rtconfig.py +++ b/bsp/stm32/stm32h7s7-st-disco/rtconfig.py @@ -74,7 +74,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M7.fp.sp' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32l010-st-nucleo/rtconfig.py b/bsp/stm32/stm32l010-st-nucleo/rtconfig.py index b38196abb7..ceaa712702 100644 --- a/bsp/stm32/stm32l010-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32l010-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32l053-st-nucleo/rtconfig.py b/bsp/stm32/stm32l053-st-nucleo/rtconfig.py index b38196abb7..ceaa712702 100644 --- a/bsp/stm32/stm32l053-st-nucleo/rtconfig.py +++ b/bsp/stm32/stm32l053-st-nucleo/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M0 ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + LFLAGS = DEVICE + r' --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' diff --git a/bsp/stm32/stm32mp157a-st-discovery/rtconfig.py b/bsp/stm32/stm32mp157a-st-discovery/rtconfig.py index d2446f9fde..70a527b6fe 100644 --- a/bsp/stm32/stm32mp157a-st-discovery/rtconfig.py +++ b/bsp/stm32/stm32mp157a-st-discovery/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/stm32/stm32mp157a-st-ev1/rtconfig.py b/bsp/stm32/stm32mp157a-st-ev1/rtconfig.py index d2446f9fde..70a527b6fe 100644 --- a/bsp/stm32/stm32mp157a-st-ev1/rtconfig.py +++ b/bsp/stm32/stm32mp157a-st-ev1/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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 rtthread.map --strict' + LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/tm4c123bsp/rtconfig.py b/bsp/tm4c123bsp/rtconfig.py index a5be259c78..d9033972af 100644 --- a/bsp/tm4c123bsp/rtconfig.py +++ b/bsp/tm4c123bsp/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' 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' + LFLAGS = DEVICE + r' --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' -- Gitee From 5d1f199e9e44b14e93b6de7e68f73567ee3f371a Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Mon, 26 Jan 2026 13:36:01 +0800 Subject: [PATCH 13/45] feat(fal): add Kconfig options for device name length and block count --- components/fal/Kconfig | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/components/fal/Kconfig b/components/fal/Kconfig index 559014d694..b680afdb62 100644 --- a/components/fal/Kconfig +++ b/components/fal/Kconfig @@ -47,5 +47,26 @@ if RT_USING_FAL default "norflash0" endif + config FAL_DEV_NAME_MAX + int "FAL device/partition name max length" + default 24 + range 8 128 + help + Configure the maximum length of flash/partition device name used by FAL. + This value corresponds to macro FAL_DEV_NAME_MAX. + Increase it if your flash device name or partition name is longer. + Note: Larger value may increase memory usage in some implementations. + + config FAL_DEV_BLK_MAX + int "FAL max flash device blocks" + default 6 + range 1 32 + help + Configure the maximum number of flash device blocks managed by FAL. + This value corresponds to macro FAL_DEV_BLK_MAX. + If you have multiple flash devices (onchip/spi-nor/spi-nand, etc.) + or multiple underlying blocks, increase this value accordingly. + Note: Larger value may increase RAM/ROM usage. + endif -- Gitee From 97e1f014a174069adc741c4e565d4d3ec343bf51 Mon Sep 17 00:00:00 2001 From: vm22 <565000561@qq.com> Date: Sun, 25 Jan 2026 13:02:41 +0800 Subject: [PATCH 14/45] cmake: make CPPDEFINES handling robust for SCons-generated values [tools][cmake] fix type handling when generating CMake targets [Root Cause] Unexpected macro definition types during `scons --target=cmake` could trigger a TypeError and abort CMakeLists.txt generation. [Solution] Add support for handling different macro definition types. [Affect Area] cmake.py [Test Suggestion] Run `scons --target=cmake` and verify CMakeLists.txt is generated successfully with different macro definition formats. --- tools/targets/cmake.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tools/targets/cmake.py b/tools/targets/cmake.py index e6c733217d..e1840e68bd 100644 --- a/tools/targets/cmake.py +++ b/tools/targets/cmake.py @@ -18,6 +18,7 @@ * 2024-11-18 kaidegit fix processing groups with similar name * 2025-02-22 kaidegit fix missing some flags added in Sconscript * 2025-02-24 kaidegit remove some code that is unnecessary but takes time, get them from env + * 2026-01-22 xym-ee Fix handling of tuple-based CPPDEFINES from SCons in CMake project generation. """ import os @@ -187,7 +188,24 @@ def GenerateCFiles(env, project, project_name): cm_file.write("ADD_DEFINITIONS(\n") for i in env['CPPDEFINES']: - cm_file.write("\t-D" + i + "\n") + # Handle CPPDEFINES from SCons (str / tuple) + if isinstance(i, tuple): + # e.g. ('STM32F407xx',) + if len(i) == 1: + cm_file.write("\t-D" + str(i[0]) + "\n") + # e.g. ('FOO', None) + elif len(i) == 2: + if i[1] is None: + cm_file.write("\t-D" + str(i[0]) + "\n") + # e.g. ('FOO', 1) + else: + cm_file.write("\t-D{}={}\n".format(i[0], i[1])) + else: + # unexpected form, fallback to name only + cm_file.write("\t-D" + str(i[0]) + "\n") + else: + # generic macro (commonly a string), ensure robust string conversion + cm_file.write("\t-D" + str(i) + "\n") cm_file.write(")\n\n") libgroups = [] -- Gitee From cdc50db5709b9b9b868c9ba19738957af17c6fa6 Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Mon, 26 Jan 2026 10:59:39 +0800 Subject: [PATCH 15/45] update(cherryusb): update to v1.6.0 Signed-off-by: sakumisu <1203593632@qq.com> --- components/drivers/usb/Kconfig | 2 +- components/drivers/usb/cherryusb/.gitignore | 1 + components/drivers/usb/cherryusb/Kconfig | 388 ++++---- components/drivers/usb/cherryusb/Kconfig.rtt | 462 --------- .../drivers/usb/cherryusb/Kconfig.rttpkg | 500 ---------- components/drivers/usb/cherryusb/README.md | 53 +- components/drivers/usb/cherryusb/README_zh.md | 11 +- components/drivers/usb/cherryusb/SConscript | 44 +- components/drivers/usb/cherryusb/VERSION | 4 +- .../drivers/usb/cherryusb/cherryusb.cmake | 37 +- .../usb/cherryusb/cherryusb_config_template.h | 10 +- .../usb/cherryusb/class/aoa/usbh_aoa.c | 4 - .../usb/cherryusb/class/audio/usb_audio.h | 104 +- .../drivers/usb/cherryusb/class/cdc/usb_cdc.h | 38 +- .../usb/cherryusb/class/cdc/usbh_cdc_acm.c | 285 ------ .../usb/cherryusb/class/cdc/usbh_cdc_acm.h | 50 - .../usb/cherryusb/class/cdc/usbh_cdc_ecm.c | 10 - .../usb/cherryusb/class/cdc/usbh_cdc_ncm.c | 10 - .../usb/cherryusb/class/dfu/usbd_dfu.c | 3 +- .../usb/cherryusb/class/gamepad/usb_gamepad.h | 224 +++++ .../cherryusb/class/gamepad/usbd_gamepad.c | 209 ++++ .../cherryusb/class/gamepad/usbd_gamepad.h | 22 + .../drivers/usb/cherryusb/class/hid/usb_hid.h | 229 ++--- .../usb/cherryusb/class/hid/usbh_hid.c | 455 ++++++++- .../usb/cherryusb/class/hid/usbh_hid.h | 81 ++ .../usb/cherryusb/class/hub/usbh_hub.c | 57 +- .../usb/cherryusb/class/midi/usb_midi.h | 15 + .../usb/cherryusb/class/serial/usbh_cdc_acm.c | 266 +++++ .../usb/cherryusb/class/serial/usbh_cdc_acm.h | 19 + .../class/{vendor => }/serial/usbh_ch34x.c | 408 ++++---- .../class/{vendor => }/serial/usbh_ch34x.h | 32 +- .../usb/cherryusb/class/serial/usbh_cp210x.c | 507 ++++++++++ .../usb/cherryusb/class/serial/usbh_cp210x.h | 187 ++++ .../class/{vendor => }/serial/usbh_ftdi.c | 457 ++++----- .../usb/cherryusb/class/serial/usbh_ftdi.h | 341 +++++++ .../usb/cherryusb/class/serial/usbh_gsm.c | 131 +++ .../usb/cherryusb/class/serial/usbh_pl2303.c | 726 ++++++++++++++ .../usb/cherryusb/class/serial/usbh_pl2303.h | 43 + .../usb/cherryusb/class/serial/usbh_serial.c | 743 ++++++++++++++ .../usb/cherryusb/class/serial/usbh_serial.h | 182 ++++ .../cherryusb/class/vendor/net/usbh_asix.c | 10 - .../cherryusb/class/vendor/net/usbh_rtl8152.c | 20 +- .../class/vendor/serial/usbh_cp210x.c | 328 ------- .../class/vendor/serial/usbh_cp210x.h | 73 -- .../cherryusb/class/vendor/serial/usbh_ftdi.h | 96 -- .../class/vendor/serial/usbh_pl2303.c | 449 --------- .../class/vendor/serial/usbh_pl2303.h | 62 -- .../usb/cherryusb/class/vendor/wifi/.gitkeep | 0 .../usb/cherryusb/class/vendor/wifi/README.md | 6 - .../cherryusb/class/vendor/wifi/usbh_bl616.c | 513 ---------- .../cherryusb/class/vendor/wifi/usbh_bl616.h | 220 ----- .../usb/cherryusb/class/video/usbh_video.c | 138 +-- .../usb/cherryusb/class/video/usbh_video.h | 5 +- .../usb/cherryusb/class/wireless/usbh_rndis.c | 19 +- .../drivers/usb/cherryusb/common/usb_def.h | 206 +++- .../drivers/usb/cherryusb/common/usb_otg.h | 39 + .../drivers/usb/cherryusb/common/usb_util.h | 21 +- .../usb/cherryusb/common/usb_version.h | 4 +- .../drivers/usb/cherryusb/core/usbd_core.c | 238 +---- .../drivers/usb/cherryusb/core/usbd_core.h | 11 +- .../drivers/usb/cherryusb/core/usbh_core.c | 594 ++++++++---- .../drivers/usb/cherryusb/core/usbh_core.h | 42 +- .../drivers/usb/cherryusb/core/usbotg_core.c | 155 +++ .../drivers/usb/cherryusb/core/usbotg_core.h | 27 + .../cherryusb/demo/adb/usbd_adb_template.c | 88 +- .../demo/audio_v1_mic_multichan_template.c | 118 +-- .../audio_v1_mic_speaker_multichan_template.c | 250 ++--- .../demo/audio_v2_mic_multichan_template.c | 146 +-- .../audio_v2_mic_speaker_multichan_template.c | 211 ++-- .../audio_v2_speaker_multichan_template.c | 138 +-- .../demo/bootuf2/msc_bootuf2_template.c | 86 +- .../cherryusb/demo/cdc_acm_hid_msc_template.c | 149 +-- .../cherryusb/demo/cdc_acm_mavlink_template.c | 87 +- .../usb/cherryusb/demo/cdc_acm_msc_template.c | 87 +- .../cherryusb/demo/cdc_acm_multi_template.c | 89 +- .../demo/cdc_acm_rttchardev_template.c | 112 +-- .../usb/cherryusb/demo/cdc_acm_template.c | 86 +- .../usb/cherryusb/demo/cdc_ecm_template.c | 119 +-- .../usb/cherryusb/demo/cdc_rndis_template.c | 88 +- .../demo/dfu_with_st_tool_template.c | 134 +-- .../usb/cherryusb/demo/gamepad_template.c | 250 +++++ .../demo/hid_custom_inout_template.c | 243 +---- .../cherryusb/demo/hid_keyboard_template.c | 155 +-- .../usb/cherryusb/demo/hid_mouse_template.c | 156 +-- .../demo/hid_remote_wakeup_template.c | 156 +-- .../usb/cherryusb/demo/midi_template.c | 189 +--- .../usb/cherryusb/demo/msc_ram_template.c | 85 +- .../drivers/usb/cherryusb/demo/usb_host.c | 216 +++-- .../usb/cherryusb/demo/usbh_bl616_wifi_cli.c | 182 ++++ .../demo/video_audiov1_hid_template.c | 183 +--- .../demo/video_static_h264_template.c | 94 +- .../demo/video_static_mjpeg_template.c | 94 +- .../demo/video_static_yuyv_template.c | 95 +- .../usb/cherryusb/demo/webusb_hid_template.c | 309 +----- .../usb/cherryusb/demo/winusb1.0_template.c | 375 ++----- .../cherryusb/demo/winusb2.0_cdc_template.c | 252 +---- .../cherryusb/demo/winusb2.0_hid_template.c | 550 ----------- .../usb/cherryusb/demo/winusb2.0_template.c | 263 +++++ .../drivers/usb/cherryusb/idf_component.yml | 2 +- .../usb/cherryusb/platform/daplink/dap_main.c | 496 +++++++--- .../usb/cherryusb/platform/daplink/dap_main.h | 116 +-- .../cherryusb/platform/rtthread/usb_check.c | 9 +- .../usb/cherryusb/platform/rtthread/usb_msh.c | 8 +- .../cherryusb/platform/rtthread/usbd_serial.c | 12 +- .../cherryusb/platform/rtthread/usbh_dfs.c | 15 +- .../cherryusb/platform/rtthread/usbh_lwip.c | 12 +- .../cherryusb/platform/rtthread/usbh_serial.c | 914 ------------------ .../cherryusb/port/chipidea/usb_dc_chipidea.c | 13 +- .../drivers/usb/cherryusb/port/dwc2/README.md | 6 +- .../usb/cherryusb/port/dwc2/usb_dc_dwc2.c | 202 ++-- .../usb/cherryusb/port/dwc2/usb_dwc2_reg.h | 2 + .../usb/cherryusb/port/dwc2/usb_glue_at.c | 11 +- .../usb/cherryusb/port/dwc2/usb_glue_esp.c | 7 +- .../usb/cherryusb/port/dwc2/usb_glue_hc.c | 298 +++++- .../cherryusb/port/dwc2/usb_glue_infineon.c | 154 +++ .../cherryusb/port/dwc2/usb_glue_kendryte.c | 9 +- .../usb/cherryusb/port/dwc2/usb_glue_st.c | 33 +- .../usb/cherryusb/port/dwc2/usb_hc_dwc2.c | 133 +-- .../usb/cherryusb/port/ehci/usb_glue_aic.c | 62 +- .../usb/cherryusb/port/ehci/usb_glue_t113.c | 128 ++- .../usb/cherryusb/port/ehci/usb_hc_ehci.c | 4 + .../usb/cherryusb/port/hpmicro/usb_dc_hpm.c | 17 +- .../usb/cherryusb/port/hpmicro/usb_glue_hpm.c | 82 +- .../usb/cherryusb/port/hpmicro/usb_hc_hpm.c | 14 +- .../usb/cherryusb/port/kinetis/usb_glue_mcx.c | 4 +- .../usb/cherryusb/port/musb/usb_glue_sifli.c | 2 +- .../usb/cherryusb/port/musb/usb_glue_ti.c | 163 ++++ .../usb/cherryusb/port/musb/usb_hc_musb.c | 60 +- .../drivers/usb/cherryusb/tools/audacity/url | 1 + .../cherryusb/tools/chryusb_configurator/url | 1 + .../usb/cherryusb/tools/packet capture/url | 3 + .../usb/cherryusb/tools/stm32_dfuse/url | 1 + .../tools/test_srcipts/test_cdc_speed.py | 49 + .../tools/test_srcipts/test_hid_inout.py | 68 ++ .../usb/cherryusb/tools/uf2/uf2conv.py | 361 +++++++ 135 files changed, 9348 insertions(+), 10585 deletions(-) delete mode 100644 components/drivers/usb/cherryusb/Kconfig.rtt delete mode 100644 components/drivers/usb/cherryusb/Kconfig.rttpkg delete mode 100644 components/drivers/usb/cherryusb/class/cdc/usbh_cdc_acm.c delete mode 100644 components/drivers/usb/cherryusb/class/cdc/usbh_cdc_acm.h create mode 100644 components/drivers/usb/cherryusb/class/gamepad/usb_gamepad.h create mode 100644 components/drivers/usb/cherryusb/class/gamepad/usbd_gamepad.c create mode 100644 components/drivers/usb/cherryusb/class/gamepad/usbd_gamepad.h create mode 100644 components/drivers/usb/cherryusb/class/serial/usbh_cdc_acm.c create mode 100644 components/drivers/usb/cherryusb/class/serial/usbh_cdc_acm.h rename components/drivers/usb/cherryusb/class/{vendor => }/serial/usbh_ch34x.c (36%) rename components/drivers/usb/cherryusb/class/{vendor => }/serial/usbh_ch34x.h (48%) create mode 100644 components/drivers/usb/cherryusb/class/serial/usbh_cp210x.c create mode 100644 components/drivers/usb/cherryusb/class/serial/usbh_cp210x.h rename components/drivers/usb/cherryusb/class/{vendor => }/serial/usbh_ftdi.c (38%) create mode 100644 components/drivers/usb/cherryusb/class/serial/usbh_ftdi.h create mode 100644 components/drivers/usb/cherryusb/class/serial/usbh_gsm.c create mode 100644 components/drivers/usb/cherryusb/class/serial/usbh_pl2303.c create mode 100644 components/drivers/usb/cherryusb/class/serial/usbh_pl2303.h create mode 100644 components/drivers/usb/cherryusb/class/serial/usbh_serial.c create mode 100644 components/drivers/usb/cherryusb/class/serial/usbh_serial.h delete mode 100644 components/drivers/usb/cherryusb/class/vendor/serial/usbh_cp210x.c delete mode 100644 components/drivers/usb/cherryusb/class/vendor/serial/usbh_cp210x.h delete mode 100644 components/drivers/usb/cherryusb/class/vendor/serial/usbh_ftdi.h delete mode 100644 components/drivers/usb/cherryusb/class/vendor/serial/usbh_pl2303.c delete mode 100644 components/drivers/usb/cherryusb/class/vendor/serial/usbh_pl2303.h create mode 100644 components/drivers/usb/cherryusb/class/vendor/wifi/.gitkeep delete mode 100644 components/drivers/usb/cherryusb/class/vendor/wifi/README.md delete mode 100644 components/drivers/usb/cherryusb/class/vendor/wifi/usbh_bl616.c delete mode 100644 components/drivers/usb/cherryusb/class/vendor/wifi/usbh_bl616.h create mode 100644 components/drivers/usb/cherryusb/common/usb_otg.h create mode 100644 components/drivers/usb/cherryusb/core/usbotg_core.c create mode 100644 components/drivers/usb/cherryusb/core/usbotg_core.h create mode 100644 components/drivers/usb/cherryusb/demo/gamepad_template.c create mode 100644 components/drivers/usb/cherryusb/demo/usbh_bl616_wifi_cli.c delete mode 100644 components/drivers/usb/cherryusb/demo/winusb2.0_hid_template.c create mode 100644 components/drivers/usb/cherryusb/demo/winusb2.0_template.c delete mode 100644 components/drivers/usb/cherryusb/platform/rtthread/usbh_serial.c create mode 100644 components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c create mode 100644 components/drivers/usb/cherryusb/port/musb/usb_glue_ti.c create mode 100644 components/drivers/usb/cherryusb/tools/audacity/url create mode 100644 components/drivers/usb/cherryusb/tools/chryusb_configurator/url create mode 100644 components/drivers/usb/cherryusb/tools/packet capture/url create mode 100644 components/drivers/usb/cherryusb/tools/stm32_dfuse/url create mode 100644 components/drivers/usb/cherryusb/tools/test_srcipts/test_cdc_speed.py create mode 100644 components/drivers/usb/cherryusb/tools/test_srcipts/test_hid_inout.py create mode 100644 components/drivers/usb/cherryusb/tools/uf2/uf2conv.py diff --git a/components/drivers/usb/Kconfig b/components/drivers/usb/Kconfig index 3af62ab03e..cd8e4ebf86 100644 --- a/components/drivers/usb/Kconfig +++ b/components/drivers/usb/Kconfig @@ -1 +1 @@ -rsource "cherryusb/Kconfig.rtt" +rsource "cherryusb/Kconfig" diff --git a/components/drivers/usb/cherryusb/.gitignore b/components/drivers/usb/cherryusb/.gitignore index 22b1a7fa27..9ebda7a011 100644 --- a/components/drivers/usb/cherryusb/.gitignore +++ b/components/drivers/usb/cherryusb/.gitignore @@ -1,4 +1,5 @@ .vscode +build **/Drivers/** **/MDK-ARM/DebugConfig/** **/MDK-ARM/RTE/** diff --git a/components/drivers/usb/cherryusb/Kconfig b/components/drivers/usb/cherryusb/Kconfig index 4c3c655ceb..35a8e15f28 100644 --- a/components/drivers/usb/cherryusb/Kconfig +++ b/components/drivers/usb/cherryusb/Kconfig @@ -1,146 +1,155 @@ -# Kconfig file for CherryUSB -menuconfig CHERRYUSB - bool "CherryUSB Configuration" +# Kconfig file for package CherryUSB +menuconfig RT_USING_CHERRYUSB + bool "Using USB with CherryUSB" default n -if CHERRYUSB +if RT_USING_CHERRYUSB - menuconfig CHERRYUSB_DEVICE + menuconfig RT_CHERRYUSB_DEVICE bool "Enable usb device mode" default n - if CHERRYUSB_DEVICE + if RT_CHERRYUSB_DEVICE choice CHERRYUSB_DEVICE_SPEED prompt "Select usb device speed" - default CHERRYUSB_DEVICE_SPEED_FS - config CHERRYUSB_DEVICE_SPEED_FS + default RT_CHERRYUSB_DEVICE_SPEED_FS + config RT_CHERRYUSB_DEVICE_SPEED_FS bool "FS" - config CHERRYUSB_DEVICE_SPEED_HS + config RT_CHERRYUSB_DEVICE_SPEED_HS bool "HS" - config CHERRYUSB_DEVICE_SPEED_AUTO + config RT_CHERRYUSB_DEVICE_SPEED_AUTO bool "AUTO" endchoice choice CHERRYUSB_DEVICE_IP prompt "Select usb device ip, and some ip need config in usb_config.h, please check" - default CHERRYUSB_DEVICE_CUSTOM - config CHERRYUSB_DEVICE_CUSTOM + default RT_CHERRYUSB_DEVICE_CUSTOM + config RT_CHERRYUSB_DEVICE_CUSTOM bool "CUSTOM (Implement it yourself)" - config CHERRYUSB_DEVICE_FSDEV_ST + config RT_CHERRYUSB_DEVICE_FSDEV_ST bool "fsdev_st" - config CHERRYUSB_DEVICE_FSDEV_CUSTOM + config RT_CHERRYUSB_DEVICE_FSDEV_CUSTOM bool "fsdev_custom" - config CHERRYUSB_DEVICE_DWC2_ST + config RT_CHERRYUSB_DEVICE_DWC2_ST bool "dwc2_st" - config CHERRYUSB_DEVICE_DWC2_ESP + config RT_CHERRYUSB_DEVICE_DWC2_ESP bool "dwc2_esp" - config CHERRYUSB_DEVICE_DWC2_KENDRYTE + config RT_CHERRYUSB_DEVICE_DWC2_KENDRYTE bool "dwc2_kendryte" - config CHERRYUSB_DEVICE_DWC2_AT + config RT_CHERRYUSB_DEVICE_DWC2_INFINEON + bool "dwc2_infineon" + config RT_CHERRYUSB_DEVICE_DWC2_AT bool "dwc2_at" - config CHERRYUSB_DEVICE_DWC2_HC + config RT_CHERRYUSB_DEVICE_DWC2_HC bool "dwc2_hc" - config CHERRYUSB_DEVICE_DWC2_NATION + config RT_CHERRYUSB_DEVICE_DWC2_NATION bool "dwc2_nation" - config CHERRYUSB_DEVICE_DWC2_GD + config RT_CHERRYUSB_DEVICE_DWC2_GD bool "dwc2_gd" - config CHERRYUSB_DEVICE_DWC2_CUSTOM + config RT_CHERRYUSB_DEVICE_DWC2_CUSTOM bool "dwc2_custom" - config CHERRYUSB_DEVICE_MUSB_ES + config RT_CHERRYUSB_DEVICE_MUSB_ES bool "musb_es" - config CHERRYUSB_DEVICE_MUSB_SUNXI + config RT_CHERRYUSB_DEVICE_MUSB_SUNXI bool "musb_sunxi" - config CHERRYUSB_DEVICE_MUSB_BK + config RT_CHERRYUSB_DEVICE_MUSB_BK bool "musb_bk" - config CHERRYUSB_DEVICE_MUSB_SIFLI + config RT_CHERRYUSB_DEVICE_MUSB_SIFLI bool "musb_sifli" - config CHERRYUSB_DEVICE_MUSB_CUSTOM + config RT_CHERRYUSB_DEVICE_MUSB_CUSTOM bool "musb_custom" - config CHERRYUSB_DEVICE_CHIPIDEA_MCX + config RT_CHERRYUSB_DEVICE_CHIPIDEA_MCX bool "chipidea_mcx" - config CHERRYUSB_DEVICE_CHIPIDEA_CUSTOM + config RT_CHERRYUSB_DEVICE_CHIPIDEA_CUSTOM bool "chipidea_custom" - config CHERRYUSB_DEVICE_KINETIS_MCX + config RT_CHERRYUSB_DEVICE_KINETIS_MCX bool "kinetis_mcx" - config CHERRYUSB_DEVICE_KINETIS_MM32 + config RT_CHERRYUSB_DEVICE_KINETIS_MM32 bool "kinetis_mm32" - config CHERRYUSB_DEVICE_KINETIS_CUSTOM + config RT_CHERRYUSB_DEVICE_KINETIS_CUSTOM bool "kinetis_custom" - config CHERRYUSB_DEVICE_BL + config RT_CHERRYUSB_DEVICE_BL bool "bouffalo" - config CHERRYUSB_DEVICE_HPM + config RT_CHERRYUSB_DEVICE_HPM bool "hpm" - config CHERRYUSB_DEVICE_AIC + config RT_CHERRYUSB_DEVICE_AIC bool "aic" - config CHERRYUSB_DEVICE_RP2040 + config RT_CHERRYUSB_DEVICE_RP2040 bool "rp2040" - config CHERRYUSB_DEVICE_CH32 + config RT_CHERRYUSB_DEVICE_CH32 bool "ch32" - config CHERRYUSB_DEVICE_PUSB2 + config RT_CHERRYUSB_DEVICE_PUSB2 bool "pusb2" + config RT_CHERRYUSB_DEVICE_NRF5X + bool "nrf5x" endchoice - config CHERRYUSB_DEVICE_CDC_ACM + config RT_CHERRYUSB_DEVICE_CDC_ACM bool prompt "Enable usb cdc acm device" default n - config CHERRYUSB_DEVICE_HID + config RT_CHERRYUSB_DEVICE_HID bool prompt "Enable usb hid device" default n - config CHERRYUSB_DEVICE_MSC + config RT_CHERRYUSB_DEVICE_MSC bool prompt "Enable usb msc device" default n - config CHERRYUSB_DEVICE_AUDIO + config RT_CHERRYUSB_DEVICE_AUDIO bool prompt "Enable usb audio device" default n - config CHERRYUSB_DEVICE_VIDEO + config RT_CHERRYUSB_DEVICE_VIDEO bool prompt "Enable usb video device" default n - config CHERRYUSB_DEVICE_CDC_RNDIS + config RT_CHERRYUSB_DEVICE_CDC_RNDIS bool prompt "Enable usb cdc rndis device" default n - config CHERRYUSB_DEVICE_CDC_ECM + config RT_CHERRYUSB_DEVICE_CDC_ECM bool prompt "Enable usb cdc ecm device" default n - config CHERRYUSB_DEVICE_CDC_NCM + config RT_CHERRYUSB_DEVICE_CDC_NCM bool prompt "Enable usb cdc ncm device" default n - config CHERRYUSB_DEVICE_MTP + config RT_CHERRYUSB_DEVICE_MTP bool prompt "Enable usb mtp device, it is commercial charge" default n - config CHERRYUSB_DEVICE_ADB + config RT_CHERRYUSB_DEVICE_ADB bool prompt "Enable usb adb device" default n - config CHERRYUSB_DEVICE_DFU + config RT_CHERRYUSB_DEVICE_DFU bool prompt "Enable usb dfu device" default n - config USBDEV_REQUEST_BUFFER_LEN + config RT_CHERRYUSB_DEVICE_CDC_ACM_CHARDEV + bool + prompt "Enable chardev for cdc acm device" + default n + + config CONFIG_USBDEV_REQUEST_BUFFER_LEN int prompt "Set device control transfer max buffer size" default 512 - config USBDEV_MSC_MAX_BUFSIZE + config CONFIG_USBDEV_MSC_MAX_BUFSIZE int prompt "Set usb msc device max buffer size" default 512 @@ -148,286 +157,339 @@ if CHERRYUSB Set the maximum buffer size for usb msc device, it is used to transfer data. you can change it to a larger value if you need larger speed but must be a power of blocksize. - config USBDEV_RNDIS_USING_LWIP + config CONFIG_USBDEV_RNDIS_USING_LWIP bool prompt "Enable usb rndis device with lwip for lan" default n - config USBDEV_CDC_ECM_USING_LWIP + config CONFIG_USBDEV_CDC_ECM_USING_LWIP bool prompt "Enable usb cdc ecm device with lwip for lan" default n choice CHERRYUSB_DEVICE_TEMPLATE prompt "Select usb device template, please select class driver first" - default CHERRYUSB_DEVICE_TEMPLATE_NONE - config CHERRYUSB_DEVICE_TEMPLATE_NONE + default RT_CHERRYUSB_DEVICE_TEMPLATE_NONE + config RT_CHERRYUSB_DEVICE_TEMPLATE_NONE bool prompt "none (Implement it yourself)" - config CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM bool prompt "cdc_acm" - depends on CHERRYUSB_DEVICE_CDC_ACM - config CHERRYUSB_DEVICE_TEMPLATE_MSC + depends on RT_CHERRYUSB_DEVICE_CDC_ACM + config RT_CHERRYUSB_DEVICE_TEMPLATE_MSC bool prompt "msc_ram" - depends on CHERRYUSB_DEVICE_MSC - config CHERRYUSB_DEVICE_TEMPLATE_HID_KEYBOARD + depends on RT_CHERRYUSB_DEVICE_MSC + config RT_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV + bool + prompt "msc_blkdev" + depends on RT_CHERRYUSB_DEVICE_MSC + config RT_CHERRYUSB_DEVICE_TEMPLATE_HID_KEYBOARD bool prompt "hid_keyboard" - depends on CHERRYUSB_DEVICE_HID - config CHERRYUSB_DEVICE_TEMPLATE_HID_MOUSE + depends on RT_CHERRYUSB_DEVICE_HID + config RT_CHERRYUSB_DEVICE_TEMPLATE_HID_MOUSE bool prompt "hid_mouse" - depends on CHERRYUSB_DEVICE_HID - config CHERRYUSB_DEVICE_TEMPLATE_HID_CUSTOM + depends on RT_CHERRYUSB_DEVICE_HID + config RT_CHERRYUSB_DEVICE_TEMPLATE_HID_CUSTOM bool prompt "hid_custom" - depends on CHERRYUSB_DEVICE_HID - config CHERRYUSB_DEVICE_TEMPLATE_VIDEO + depends on RT_CHERRYUSB_DEVICE_HID + config RT_CHERRYUSB_DEVICE_TEMPLATE_VIDEO bool prompt "video" - depends on CHERRYUSB_DEVICE_VIDEO - config CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V1_MIC_SPEAKER + depends on RT_CHERRYUSB_DEVICE_VIDEO + config RT_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V1_MIC_SPEAKER bool prompt "audio_v1_mic_speaker_multichan" - depends on CHERRYUSB_DEVICE_AUDIO - config CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V2_MIC_SPEAKER + depends on RT_CHERRYUSB_DEVICE_AUDIO + config RT_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V2_MIC_SPEAKER bool prompt "audio_v2_mic_speaker_multichan" - depends on CHERRYUSB_DEVICE_AUDIO - config CHERRYUSB_DEVICE_TEMPLATE_CDC_RNDIS + depends on RT_CHERRYUSB_DEVICE_AUDIO + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_RNDIS bool prompt "cdc_rndis" - depends on CHERRYUSB_DEVICE_CDC_RNDIS - config CHERRYUSB_DEVICE_TEMPLATE_CDC_ECM + depends on RT_CHERRYUSB_DEVICE_CDC_RNDIS + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ECM bool prompt "cdc_ecm" - depends on CHERRYUSB_DEVICE_CDC_ECM - config CHERRYUSB_DEVICE_TEMPLATE_CDC_NCM + depends on RT_CHERRYUSB_DEVICE_CDC_ECM + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_NCM bool prompt "cdc_ncm" - depends on CHERRYUSB_DEVICE_CDC_NCM - config CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC + depends on RT_CHERRYUSB_DEVICE_CDC_NCM + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC bool prompt "cdc_acm_msc" - depends on CHERRYUSB_DEVICE_CDC_ACM && CHERRYUSB_DEVICE_MSC - config CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC_HID + depends on RT_CHERRYUSB_DEVICE_CDC_ACM && RT_CHERRYUSB_DEVICE_MSC + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC_HID bool prompt "cdc_acm_msc_hid" - depends on CHERRYUSB_DEVICE_CDC_ACM && CHERRYUSB_DEVICE_MSC && CHERRYUSB_DEVICE_HID - config CHERRYUSB_DEVICE_TEMPLATE_WINUSBV1 + depends on RT_CHERRYUSB_DEVICE_CDC_ACM && RT_CHERRYUSB_DEVICE_MSC && RT_CHERRYUSB_DEVICE_HID + config RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV1 bool prompt "winusbv1" - config CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_CDC + config RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2 + bool + prompt "winusbv2" + config RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_CDC bool prompt "winusbv2_cdc" - depends on CHERRYUSB_DEVICE_CDC_ACM - config CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_HID + depends on RT_CHERRYUSB_DEVICE_CDC_ACM + config RT_CHERRYUSB_DEVICE_TEMPLATE_WEBUSB_HID + bool + prompt "webusb_hid" + depends on RT_CHERRYUSB_DEVICE_HID + config RT_CHERRYUSB_DEVICE_TEMPLATE_ADB + bool + prompt "adb" + depends on RT_CHERRYUSB_DEVICE_ADB + config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_CHARDEV bool - prompt "winusbv2_hid" - depends on CHERRYUSB_DEVICE_HID + prompt "cdc_acm_chardev" + depends on RT_CHERRYUSB_DEVICE_CDC_ACM_CHARDEV endchoice + + config CONFIG_USBDEV_MSC_BLOCK_DEV_NAME + string "usb device msc block device name" + depends on RT_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV + default "sd0" + endif - menuconfig CHERRYUSB_HOST + menuconfig RT_CHERRYUSB_HOST bool "Enable usb host mode" default n - if CHERRYUSB_HOST + if RT_CHERRYUSB_HOST choice CHERRYUSB_HOST_IP prompt "Select usb host ip, and some ip need config in usb_config.h, please check" - default CHERRYUSB_HOST_CUSTOM - config CHERRYUSB_HOST_CUSTOM + default RT_CHERRYUSB_HOST_CUSTOM + config RT_CHERRYUSB_HOST_CUSTOM bool "CUSTOM (Implement it yourself)" - config CHERRYUSB_HOST_EHCI_BL + config RT_CHERRYUSB_HOST_EHCI_BL bool "ehci_bouffalo" - config CHERRYUSB_HOST_EHCI_HPM + config RT_CHERRYUSB_HOST_EHCI_HPM bool "ehci_hpm" - config CHERRYUSB_HOST_EHCI_AIC + config RT_CHERRYUSB_HOST_EHCI_AIC bool "ehci_aic" - config CHERRYUSB_HOST_EHCI_MCX + config RT_CHERRYUSB_HOST_EHCI_MCX bool "ehci_mcx" - config CHERRYUSB_HOST_EHCI_NUC980 + config RT_CHERRYUSB_HOST_EHCI_NUC980 bool "ehci_nuc980" - config CHERRYUSB_HOST_EHCI_MA35D0 + config RT_CHERRYUSB_HOST_EHCI_MA35D0 bool "ehci_ma35d0" - config CHERRYUSB_HOST_EHCI_CUSTOM + config RT_CHERRYUSB_HOST_EHCI_CUSTOM bool "ehci_custom" - config CHERRYUSB_HOST_DWC2_ST + config RT_CHERRYUSB_HOST_DWC2_ST bool "dwc2_st" - config CHERRYUSB_HOST_DWC2_ESP + config RT_CHERRYUSB_HOST_DWC2_ESP bool "dwc2_esp" - config CHERRYUSB_HOST_DWC2_KENDRYTE + config RT_CHERRYUSB_HOST_DWC2_KENDRYTE bool "dwc2_kendryte" - config CHERRYUSB_HOST_DWC2_HC + config RT_CHERRYUSB_HOST_DWC2_INFINEON + bool "dwc2_infineon" + config RT_CHERRYUSB_HOST_DWC2_AT + bool "dwc2_at, f405 only" + config RT_CHERRYUSB_HOST_DWC2_HC bool "dwc2_hc" - config CHERRYUSB_HOST_DWC2_NATION + config RT_CHERRYUSB_HOST_DWC2_NATION bool "dwc2_nation" - config CHERRYUSB_HOST_DWC2_CUSTOM + config RT_CHERRYUSB_HOST_DWC2_CUSTOM bool "dwc2_custom" - config CHERRYUSB_HOST_MUSB_ES + config RT_CHERRYUSB_HOST_MUSB_ES bool "musb_es" - config CHERRYUSB_HOST_MUSB_SUNXI + config RT_CHERRYUSB_HOST_MUSB_SUNXI bool "musb_sunxi" - config CHERRYUSB_HOST_MUSB_BK + config RT_CHERRYUSB_HOST_MUSB_BK bool "musb_bk" - config CHERRYUSB_HOST_MUSB_SIFLI + config RT_CHERRYUSB_HOST_MUSB_SIFLI bool "musb_sifli" - config CHERRYUSB_HOST_MUSB_CUSTOM + config RT_CHERRYUSB_HOST_MUSB_CUSTOM bool "musb_custom" - config CHERRYUSB_HOST_PUSB2 + config RT_CHERRYUSB_HOST_PUSB2 bool "pusb2" - config CHERRYUSB_HOST_XHCI_PHYTIUM - bool "xhci_phytium" - config CHERRYUSB_HOST_XHCI_CUSTOM + config RT_CHERRYUSB_HOST_XHCI bool "xhci" - config CHERRYUSB_HOST_KINETIS_MCX - bool "kinetis_mcx" - config CHERRYUSB_HOST_KINETIS_MM32 - bool "kinetis_mm32" - config CHERRYUSB_HOST_KINETIS_CUSTOM - bool "kinetis_custom" - config CHERRYUSB_HOST_RP2040 + config RT_CHERRYUSB_HOST_RP2040 bool "rp2040" endchoice - config CHERRYUSB_HOST_CDC_ACM + config RT_CHERRYUSB_HOST_CDC_ACM bool prompt "Enable usb cdc acm driver" + select CONFIG_USBHOST_SERIAL default n - config CHERRYUSB_HOST_HID + config RT_CHERRYUSB_HOST_HID bool prompt "Enable usb hid driver" default n - config CHERRYUSB_HOST_MSC + config RT_CHERRYUSB_HOST_MSC bool prompt "Enable usb msc driver" default n + select RT_USING_DFS + select RT_USING_DFS_ELMFAT - config CHERRYUSB_HOST_CDC_ECM + config RT_CHERRYUSB_HOST_CDC_ECM bool prompt "Enable usb cdc ecm driver" - select USBHOST_PLATFORM_CDC_ECM + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_CDC_ECM default n - config CHERRYUSB_HOST_CDC_RNDIS + config RT_CHERRYUSB_HOST_CDC_RNDIS bool prompt "Enable usb rndis driver" - select USBHOST_PLATFORM_CDC_RNDIS + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_CDC_RNDIS default n - config CHERRYUSB_HOST_CDC_NCM + config RT_CHERRYUSB_HOST_CDC_NCM bool prompt "Enable usb cdc ncm driver" - select USBHOST_PLATFORM_CDC_NCM + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_CDC_NCM default n - config CHERRYUSB_HOST_VIDEO + config RT_CHERRYUSB_HOST_VIDEO bool prompt "Enable usb video driver, it is commercial charge" default n - config CHERRYUSB_HOST_AUDIO + config RT_CHERRYUSB_HOST_AUDIO bool prompt "Enable usb audio driver, it is commercial charge" default n - config CHERRYUSB_HOST_BLUETOOTH + config RT_CHERRYUSB_HOST_BLUETOOTH bool prompt "Enable usb bluetooth driver" default n - config CHERRYUSB_HOST_ASIX + config RT_CHERRYUSB_HOST_ASIX bool prompt "Enable usb asix driver" - select USBHOST_PLATFORM_ASIX + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_ASIX default n - config CHERRYUSB_HOST_RTL8152 + config RT_CHERRYUSB_HOST_RTL8152 bool prompt "Enable usb rtl8152 driver" - select USBHOST_PLATFORM_RTL8152 + select RT_USING_LWIP + select CONFIG_USBHOST_PLATFORM_RTL8152 default n - config CHERRYUSB_HOST_FTDI + config RT_CHERRYUSB_HOST_FTDI bool prompt "Enable usb ftdi driver" + select CONFIG_USBHOST_SERIAL default n - config CHERRYUSB_HOST_CH34X + config RT_CHERRYUSB_HOST_CH34X bool prompt "Enable usb ch34x driver" + select CONFIG_USBHOST_SERIAL default n - config CHERRYUSB_HOST_CP210X + config RT_CHERRYUSB_HOST_CP210X bool prompt "Enable usb cp210x driver" + select CONFIG_USBHOST_SERIAL default n - config CHERRYUSB_HOST_PL2303 + config RT_CHERRYUSB_HOST_PL2303 bool prompt "Enable usb pl2303 driver" + select CONFIG_USBHOST_SERIAL default n - config CHERRYUSB_HOST_AOA + config RT_CHERRYUSB_HOST_GSM bool - prompt "Enable usb aoa driver" + prompt "Enable usb gsm driver for 4g module" + select CONFIG_USBHOST_SERIAL default n - config USBHOST_PLATFORM_CDC_ECM + config CONFIG_USBHOST_SERIAL bool - config USBHOST_PLATFORM_CDC_RNDIS + config CONFIG_USBHOST_PLATFORM_CDC_ECM bool - config USBHOST_PLATFORM_CDC_NCM + config CONFIG_USBHOST_PLATFORM_CDC_RNDIS bool - config USBHOST_PLATFORM_ASIX + config CONFIG_USBHOST_PLATFORM_CDC_NCM bool - config USBHOST_PLATFORM_RTL8152 + config CONFIG_USBHOST_PLATFORM_ASIX bool - config USBHOST_PSC_PRIO + config CONFIG_USBHOST_PLATFORM_RTL8152 + bool + + config CONFIG_USBHOST_PSC_PRIO int prompt "Set hubport change thread priority, 0 is the max priority" default 0 - config USBHOST_PSC_STACKSIZE + config CONFIG_USBHOST_PSC_STACKSIZE int prompt "Set hubport change thread stacksize" default 4096 - config USBHOST_REQUEST_BUFFER_LEN + config CONFIG_USBHOST_REQUEST_BUFFER_LEN int prompt "Set host control transfer max buffer size" default 512 - config USBHOST_CONTROL_TRANSFER_TIMEOUT + config CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT int prompt "Set host control transfer timeout, unit is ms" default 500 + config CONFIG_USBHOST_SERIAL_RX_SIZE + int + prompt "Set host serial rx max buffer size" + default 2048 + + config RT_LWIP_PBUF_POOL_BUFSIZE + int "The size of each pbuf in the pbuf pool" + range 1500 2000 + default 1600 + + config CONFIG_USB_DFS_MOUNT_POINT + string "usb host dfs mount point" + depends on RT_CHERRYUSB_HOST_MSC + default "/" + menu "Select USB host template, please select class driver first" - config TEST_USBH_CDC_ACM - int - prompt "demo for test cdc acm" - default 0 - depends on CHERRYUSB_HOST_CDC_ACM - config TEST_USBH_HID + config CONFIG_TEST_USBH_SERIAL + bool + prompt "demo for test seial, cannot enable this demo, you can use rt-thread device api to test" + default n + depends on CONFIG_USBHOST_SERIAL + config CONFIG_TEST_USBH_HID int prompt "demo for test hid" default 0 - depends on CHERRYUSB_HOST_HID - config TEST_USBH_MSC - int - prompt "demo for test msc" - default 0 - depends on CHERRYUSB_HOST_MSC + depends on RT_CHERRYUSB_HOST_HID + config CONFIG_TEST_USBH_MSC + bool + prompt "demo for test msc, cannot enable this demo, you can use rt-thread dfs api to test" + default n + depends on RT_CHERRYUSB_HOST_MSC + config CONFIG_TEST_USBH_NET + bool + prompt "demo for test net, cannot enable this demo, you can use lwip api to test" + default n + depends on RT_CHERRYUSB_HOST_CDC_ECM || RT_CHERRYUSB_HOST_CDC_RNDIS || RT_CHERRYUSB_HOST_CDC_NCM || RT_CHERRYUSB_HOST_ASIX || RT_CHERRYUSB_HOST_RTL8152 endmenu endif endif diff --git a/components/drivers/usb/cherryusb/Kconfig.rtt b/components/drivers/usb/cherryusb/Kconfig.rtt deleted file mode 100644 index 9e1d7a500c..0000000000 --- a/components/drivers/usb/cherryusb/Kconfig.rtt +++ /dev/null @@ -1,462 +0,0 @@ -# Kconfig file for package CherryUSB -menuconfig RT_USING_CHERRYUSB - bool "Using USB with CherryUSB" - default n - -if RT_USING_CHERRYUSB - - menuconfig RT_CHERRYUSB_DEVICE - bool "Enable usb device mode" - default n - - if RT_CHERRYUSB_DEVICE - choice - prompt "Select usb device speed" - default RT_CHERRYUSB_DEVICE_SPEED_FS - config RT_CHERRYUSB_DEVICE_SPEED_FS - bool "FS" - config RT_CHERRYUSB_DEVICE_SPEED_HS - bool "HS" - config RT_CHERRYUSB_DEVICE_SPEED_AUTO - bool "AUTO" - endchoice - - choice - prompt "Select usb device ip, and some ip need config in usb_config.h, please check" - default RT_CHERRYUSB_DEVICE_CUSTOM - config RT_CHERRYUSB_DEVICE_CUSTOM - bool "CUSTOM (Implement it yourself)" - config RT_CHERRYUSB_DEVICE_FSDEV_ST - bool "fsdev_st" - config RT_CHERRYUSB_DEVICE_FSDEV_CUSTOM - bool "fsdev_custom" - config RT_CHERRYUSB_DEVICE_DWC2_ST - bool "dwc2_st" - config RT_CHERRYUSB_DEVICE_DWC2_ESP - bool "dwc2_esp" - config RT_CHERRYUSB_DEVICE_DWC2_KENDRYTE - bool "dwc2_kendryte" - config RT_CHERRYUSB_DEVICE_DWC2_AT - bool "dwc2_at" - config RT_CHERRYUSB_DEVICE_DWC2_HC - bool "dwc2_hc" - config RT_CHERRYUSB_DEVICE_DWC2_NATION - bool "dwc2_nation" - config RT_CHERRYUSB_DEVICE_DWC2_GD - bool "dwc2_gd" - config RT_CHERRYUSB_DEVICE_DWC2_CUSTOM - bool "dwc2_custom" - config RT_CHERRYUSB_DEVICE_MUSB_ES - bool "musb_es" - config RT_CHERRYUSB_DEVICE_MUSB_SUNXI - bool "musb_sunxi" - config RT_CHERRYUSB_DEVICE_MUSB_BK - bool "musb_bk" - config RT_CHERRYUSB_DEVICE_MUSB_SIFLI - bool "musb_sifli" - config RT_CHERRYUSB_DEVICE_MUSB_CUSTOM - bool "musb_custom" - config RT_CHERRYUSB_DEVICE_CHIPIDEA_MCX - bool "chipidea_mcx" - config RT_CHERRYUSB_DEVICE_CHIPIDEA_CUSTOM - bool "chipidea_custom" - config RT_CHERRYUSB_DEVICE_KINETIS_MCX - bool "kinetis_mcx" - config RT_CHERRYUSB_DEVICE_KINETIS_MM32 - bool "kinetis_mm32" - config RT_CHERRYUSB_DEVICE_KINETIS_CUSTOM - bool "kinetis_custom" - config RT_CHERRYUSB_DEVICE_BL - bool "bouffalo" - config RT_CHERRYUSB_DEVICE_HPM - bool "hpm" - config RT_CHERRYUSB_DEVICE_AIC - bool "aic" - config RT_CHERRYUSB_DEVICE_RP2040 - bool "rp2040" - config RT_CHERRYUSB_DEVICE_CH32 - bool "ch32" - config RT_CHERRYUSB_DEVICE_PUSB2 - bool "pusb2" - config RT_CHERRYUSB_DEVICE_NRF5X - bool "nrf5x" - endchoice - - config RT_CHERRYUSB_DEVICE_CDC_ACM - bool - prompt "Enable usb cdc acm device" - default n - - config RT_CHERRYUSB_DEVICE_HID - bool - prompt "Enable usb hid device" - default n - - config RT_CHERRYUSB_DEVICE_MSC - bool - prompt "Enable usb msc device" - default n - - config RT_CHERRYUSB_DEVICE_AUDIO - bool - prompt "Enable usb audio device" - default n - - config RT_CHERRYUSB_DEVICE_VIDEO - bool - prompt "Enable usb video device" - default n - - config RT_CHERRYUSB_DEVICE_CDC_RNDIS - bool - prompt "Enable usb cdc rndis device" - default n - - config RT_CHERRYUSB_DEVICE_CDC_ECM - bool - prompt "Enable usb cdc ecm device" - default n - - config RT_CHERRYUSB_DEVICE_CDC_NCM - bool - prompt "Enable usb cdc ncm device" - default n - - config RT_CHERRYUSB_DEVICE_MTP - bool - prompt "Enable usb mtp device, it is commercial charge" - default n - - config RT_CHERRYUSB_DEVICE_ADB - bool - prompt "Enable usb adb device" - default n - - config RT_CHERRYUSB_DEVICE_DFU - bool - prompt "Enable usb dfu device" - default n - - config RT_CHERRYUSB_DEVICE_CDC_ACM_CHARDEV - bool - prompt "Enable chardev for cdc acm device" - default n - - config CONFIG_USBDEV_REQUEST_BUFFER_LEN - int - prompt "Set device control transfer max buffer size" - default 512 - - config CONFIG_USBDEV_MSC_MAX_BUFSIZE - int - prompt "Set usb msc device max buffer size" - default 512 - help - Set the maximum buffer size for usb msc device, it is used to transfer data. - you can change it to a larger value if you need larger speed but must be a power of blocksize. - - config CONFIG_USBDEV_RNDIS_USING_LWIP - bool - prompt "Enable usb rndis device with lwip for lan" - default n - - config CONFIG_USBDEV_CDC_ECM_USING_LWIP - bool - prompt "Enable usb cdc ecm device with lwip for lan" - default n - - choice - prompt "Select usb device template, please select class driver first" - default RT_CHERRYUSB_DEVICE_TEMPLATE_NONE - config RT_CHERRYUSB_DEVICE_TEMPLATE_NONE - bool - prompt "none (Implement it yourself)" - config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM - bool - prompt "cdc_acm" - depends on RT_CHERRYUSB_DEVICE_CDC_ACM - config RT_CHERRYUSB_DEVICE_TEMPLATE_MSC - bool - prompt "msc_ram" - depends on RT_CHERRYUSB_DEVICE_MSC - config RT_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV - bool - prompt "msc_blkdev" - depends on RT_CHERRYUSB_DEVICE_MSC - config RT_CHERRYUSB_DEVICE_TEMPLATE_HID_KEYBOARD - bool - prompt "hid_keyboard" - depends on RT_CHERRYUSB_DEVICE_HID - config RT_CHERRYUSB_DEVICE_TEMPLATE_HID_MOUSE - bool - prompt "hid_mouse" - depends on RT_CHERRYUSB_DEVICE_HID - config RT_CHERRYUSB_DEVICE_TEMPLATE_HID_CUSTOM - bool - prompt "hid_custom" - depends on RT_CHERRYUSB_DEVICE_HID - config RT_CHERRYUSB_DEVICE_TEMPLATE_VIDEO - bool - prompt "video" - depends on RT_CHERRYUSB_DEVICE_VIDEO - config RT_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V1_MIC_SPEAKER - bool - prompt "audio_v1_mic_speaker_multichan" - depends on RT_CHERRYUSB_DEVICE_AUDIO - config RT_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V2_MIC_SPEAKER - bool - prompt "audio_v2_mic_speaker_multichan" - depends on RT_CHERRYUSB_DEVICE_AUDIO - config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_RNDIS - bool - prompt "cdc_rndis" - depends on RT_CHERRYUSB_DEVICE_CDC_RNDIS - config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ECM - bool - prompt "cdc_ecm" - depends on RT_CHERRYUSB_DEVICE_CDC_ECM - config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_NCM - bool - prompt "cdc_ncm" - depends on RT_CHERRYUSB_DEVICE_CDC_NCM - config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC - bool - prompt "cdc_acm_msc" - depends on RT_CHERRYUSB_DEVICE_CDC_ACM && RT_CHERRYUSB_DEVICE_MSC - config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC_HID - bool - prompt "cdc_acm_msc_hid" - depends on RT_CHERRYUSB_DEVICE_CDC_ACM && RT_CHERRYUSB_DEVICE_MSC && RT_CHERRYUSB_DEVICE_HID - config RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV1 - bool - prompt "winusbv1" - config RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_CDC - bool - prompt "winusbv2_cdc" - depends on RT_CHERRYUSB_DEVICE_CDC_ACM - config RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_HID - bool - prompt "winusbv2_hid" - depends on RT_CHERRYUSB_DEVICE_HID - config RT_CHERRYUSB_DEVICE_TEMPLATE_ADB - bool - prompt "adb" - depends on RT_CHERRYUSB_DEVICE_ADB - config RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_CHARDEV - bool - prompt "cdc_acm_chardev" - depends on RT_CHERRYUSB_DEVICE_CDC_ACM_CHARDEV - endchoice - - config CONFIG_USBDEV_MSC_BLOCK_DEV_NAME - string "usb device msc block device name" - depends on RT_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV - default "sd0" - - endif - - menuconfig RT_CHERRYUSB_HOST - bool "Enable usb host mode" - default n - - if RT_CHERRYUSB_HOST - choice - prompt "Select usb host ip, and some ip need config in usb_config.h, please check" - default RT_CHERRYUSB_HOST_CUSTOM - config RT_CHERRYUSB_HOST_CUSTOM - bool "CUSTOM (Implement it yourself)" - config RT_CHERRYUSB_HOST_EHCI_BL - bool "ehci_bouffalo" - config RT_CHERRYUSB_HOST_EHCI_HPM - bool "ehci_hpm" - config RT_CHERRYUSB_HOST_EHCI_AIC - bool "ehci_aic" - config RT_CHERRYUSB_HOST_EHCI_MCX - bool "ehci_mcx" - config RT_CHERRYUSB_HOST_EHCI_NUC980 - bool "ehci_nuc980" - config RT_CHERRYUSB_HOST_EHCI_MA35D0 - bool "ehci_ma35d0" - config RT_CHERRYUSB_HOST_EHCI_CUSTOM - bool "ehci_custom" - config RT_CHERRYUSB_HOST_DWC2_ST - bool "dwc2_st" - config RT_CHERRYUSB_HOST_DWC2_ESP - bool "dwc2_esp" - config RT_CHERRYUSB_HOST_DWC2_KENDRYTE - bool "dwc2_kendryte" - config RT_CHERRYUSB_HOST_DWC2_HC - bool "dwc2_hc" - config RT_CHERRYUSB_HOST_DWC2_NATION - bool "dwc2_nation" - config RT_CHERRYUSB_HOST_DWC2_CUSTOM - bool "dwc2_custom" - config RT_CHERRYUSB_HOST_MUSB_ES - bool "musb_es" - config RT_CHERRYUSB_HOST_MUSB_SUNXI - bool "musb_sunxi" - config RT_CHERRYUSB_HOST_MUSB_BK - bool "musb_bk" - config RT_CHERRYUSB_HOST_MUSB_SIFLI - bool "musb_sifli" - config RT_CHERRYUSB_HOST_MUSB_CUSTOM - bool "musb_custom" - config RT_CHERRYUSB_HOST_PUSB2 - bool "pusb2" - config RT_CHERRYUSB_HOST_XHCI - bool "xhci" - config RT_CHERRYUSB_HOST_RP2040 - bool "rp2040" - endchoice - - config RT_CHERRYUSB_HOST_CDC_ACM - bool - prompt "Enable usb cdc acm driver" - default n - - config RT_CHERRYUSB_HOST_HID - bool - prompt "Enable usb hid driver" - default n - - config RT_CHERRYUSB_HOST_MSC - bool - prompt "Enable usb msc driver" - default n - select RT_USING_DFS - select RT_USING_DFS_ELMFAT - - config RT_CHERRYUSB_HOST_CDC_ECM - bool - prompt "Enable usb cdc ecm driver" - select RT_USING_LWIP - select CONFIG_USBHOST_PLATFORM_CDC_ECM - default n - - config RT_CHERRYUSB_HOST_CDC_RNDIS - bool - prompt "Enable usb rndis driver" - select RT_USING_LWIP - select CONFIG_USBHOST_PLATFORM_CDC_RNDIS - default n - - config RT_CHERRYUSB_HOST_CDC_NCM - bool - prompt "Enable usb cdc ncm driver" - select RT_USING_LWIP - select CONFIG_USBHOST_PLATFORM_CDC_NCM - default n - - config RT_CHERRYUSB_HOST_VIDEO - bool - prompt "Enable usb video driver, it is commercial charge" - default n - - config RT_CHERRYUSB_HOST_AUDIO - bool - prompt "Enable usb audio driver, it is commercial charge" - default n - - config RT_CHERRYUSB_HOST_BLUETOOTH - bool - prompt "Enable usb bluetooth driver" - default n - - config RT_CHERRYUSB_HOST_ASIX - bool - prompt "Enable usb asix driver" - select RT_USING_LWIP - select CONFIG_USBHOST_PLATFORM_ASIX - default n - - config RT_CHERRYUSB_HOST_RTL8152 - bool - prompt "Enable usb rtl8152 driver" - select RT_USING_LWIP - select CONFIG_USBHOST_PLATFORM_RTL8152 - default n - - config RT_CHERRYUSB_HOST_FTDI - bool - prompt "Enable usb ftdi driver" - default n - - config RT_CHERRYUSB_HOST_CH34X - bool - prompt "Enable usb ch34x driver" - default n - - config RT_CHERRYUSB_HOST_CP210X - bool - prompt "Enable usb cp210x driver" - default n - - config RT_CHERRYUSB_HOST_PL2303 - bool - prompt "Enable usb pl2303 driver" - default n - - config CONFIG_USBHOST_PLATFORM_CDC_ECM - bool - - config CONFIG_USBHOST_PLATFORM_CDC_RNDIS - bool - - config CONFIG_USBHOST_PLATFORM_CDC_NCM - bool - - config CONFIG_USBHOST_PLATFORM_ASIX - bool - - config CONFIG_USBHOST_PLATFORM_RTL8152 - bool - - config CONFIG_USBHOST_PSC_PRIO - int - prompt "Set hubport change thread priority, 0 is the max priority" - default 0 - - config CONFIG_USBHOST_PSC_STACKSIZE - int - prompt "Set hubport change thread stacksize" - default 4096 - - config CONFIG_USBHOST_REQUEST_BUFFER_LEN - int - prompt "Set host control transfer max buffer size" - default 512 - - config CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT - int - prompt "Set host control transfer timeout, unit is ms" - default 500 - - config RT_LWIP_PBUF_POOL_BUFSIZE - int "The size of each pbuf in the pbuf pool" - range 1500 2000 - default 1600 - - config CONFIG_USB_DFS_MOUNT_POINT - string "usb host dfs mount point" - depends on RT_CHERRYUSB_HOST_MSC - default "/" - - menu "Select USB host template, please select class driver first" - config CONFIG_TEST_USBH_CDC_ACM - int - prompt "demo for test cdc acm, cannot enable this demo, we have used serial framework instead" - default 0 - depends on RT_CHERRYUSB_HOST_CDC_ACM - config CONFIG_TEST_USBH_HID - int - prompt "demo for test hid" - default 0 - depends on RT_CHERRYUSB_HOST_HID - config CONFIG_TEST_USBH_MSC - int - prompt "demo for test msc, cannot enable this demo, we have used dfs instead" - default 0 - depends on RT_CHERRYUSB_HOST_MSC - endmenu - endif -endif diff --git a/components/drivers/usb/cherryusb/Kconfig.rttpkg b/components/drivers/usb/cherryusb/Kconfig.rttpkg deleted file mode 100644 index e5a0e430a5..0000000000 --- a/components/drivers/usb/cherryusb/Kconfig.rttpkg +++ /dev/null @@ -1,500 +0,0 @@ -# Kconfig file for package CherryUSB -menuconfig PKG_USING_CHERRYUSB - depends on RT_VER_NUM < 0x50200 - bool "CherryUSB: tiny and portable USB host/device stack for embedded system with USB IP" - default n - -if PKG_USING_CHERRYUSB - - menuconfig PKG_CHERRYUSB_DEVICE - bool "Enable usb device mode" - default n - - if PKG_CHERRYUSB_DEVICE - choice - prompt "Select usb device speed" - default PKG_CHERRYUSB_DEVICE_SPEED_FS - config PKG_CHERRYUSB_DEVICE_SPEED_FS - bool "FS" - config PKG_CHERRYUSB_DEVICE_SPEED_HS - bool "HS" - config PKG_CHERRYUSB_DEVICE_SPEED_AUTO - bool "AUTO" - endchoice - - choice - prompt "Select usb device ip, and some ip need config in usb_config.h, please check" - default PKG_CHERRYUSB_DEVICE_CUSTOM - config PKG_CHERRYUSB_DEVICE_CUSTOM - bool "CUSTOM (Implement it yourself)" - config PKG_CHERRYUSB_DEVICE_FSDEV_ST - bool "fsdev_st" - config PKG_CHERRYUSB_DEVICE_FSDEV_CUSTOM - bool "fsdev_custom" - config PKG_CHERRYUSB_DEVICE_DWC2_ST - bool "dwc2_st" - config PKG_CHERRYUSB_DEVICE_DWC2_ESP - bool "dwc2_esp" - config PKG_CHERRYUSB_DEVICE_DWC2_KENDRYTE - bool "dwc2_kendryte" - config PKG_CHERRYUSB_DEVICE_DWC2_AT - bool "dwc2_at" - config PKG_CHERRYUSB_DEVICE_DWC2_HC - bool "dwc2_hc" - config PKG_CHERRYUSB_DEVICE_DWC2_NATION - bool "dwc2_nation" - config PKG_CHERRYUSB_DEVICE_DWC2_GD - bool "dwc2_gd" - config PKG_CHERRYUSB_DEVICE_DWC2_CUSTOM - bool "dwc2_custom" - config PKG_CHERRYUSB_DEVICE_MUSB_ES - bool "musb_es" - config PKG_CHERRYUSB_DEVICE_MUSB_SUNXI - bool "musb_sunxi" - config PKG_CHERRYUSB_DEVICE_MUSB_BK - bool "musb_bk" - config PKG_CHERRYUSB_DEVICE_MUSB_SIFLI - bool "musb_sifli" - config PKG_CHERRYUSB_DEVICE_MUSB_CUSTOM - bool "musb_custom" - config PKG_CHERRYUSB_DEVICE_CHIPIDEA_MCX - bool "chipidea_mcx" - config PKG_CHERRYUSB_DEVICE_CHIPIDEA_CUSTOM - bool "chipidea_custom" - config PKG_CHERRYUSB_DEVICE_KINETIS_MCX - bool "kinetis_mcx" - config PKG_CHERRYUSB_DEVICE_KINETIS_MM32 - bool "kinetis_mm32" - config PKG_CHERRYUSB_DEVICE_KINETIS_CUSTOM - bool "kinetis_custom" - config PKG_CHERRYUSB_DEVICE_BL - bool "bouffalo" - config PKG_CHERRYUSB_DEVICE_HPM - bool "hpm" - config PKG_CHERRYUSB_DEVICE_AIC - bool "aic" - config PKG_CHERRYUSB_DEVICE_RP2040 - bool "rp2040" - config PKG_CHERRYUSB_DEVICE_CH32 - bool "ch32" - config PKG_CHERRYUSB_DEVICE_PUSB2 - bool "pusb2" - endchoice - - config PKG_CHERRYUSB_DEVICE_CDC_ACM - bool - prompt "Enable usb cdc acm device" - default n - - config PKG_CHERRYUSB_DEVICE_HID - bool - prompt "Enable usb hid device" - default n - - config PKG_CHERRYUSB_DEVICE_MSC - bool - prompt "Enable usb msc device" - default n - - config PKG_CHERRYUSB_DEVICE_AUDIO - bool - prompt "Enable usb audio device" - default n - - config PKG_CHERRYUSB_DEVICE_VIDEO - bool - prompt "Enable usb video device" - default n - - config PKG_CHERRYUSB_DEVICE_CDC_RNDIS - bool - prompt "Enable usb cdc rndis device" - default n - - config PKG_CHERRYUSB_DEVICE_CDC_ECM - bool - prompt "Enable usb cdc ecm device" - default n - - config PKG_CHERRYUSB_DEVICE_CDC_NCM - bool - prompt "Enable usb cdc ncm device" - default n - - config PKG_CHERRYUSB_DEVICE_MTP - bool - prompt "Enable usb mtp device, it is commercial charge" - default n - - config PKG_CHERRYUSB_DEVICE_ADB - bool - prompt "Enable usb adb device" - default n - - config PKG_CHERRYUSB_DEVICE_DFU - bool - prompt "Enable usb dfu device" - default n - - config PKG_CHERRYUSB_DEVICE_CDC_ACM_CHARDEV - bool - prompt "Enable chardev for cdc acm device" - default n - - config CONFIG_USBDEV_REQUEST_BUFFER_LEN - int - prompt "Set device control transfer max buffer size" - default 512 - - config CONFIG_USBDEV_MSC_MAX_BUFSIZE - int - prompt "Set usb msc device max buffer size" - default 512 - help - Set the maximum buffer size for usb msc device, it is used to transfer data. - you can change it to a larger value if you need larger speed but must be a power of blocksize. - - config CONFIG_USBDEV_RNDIS_USING_LWIP - bool - prompt "Enable usb rndis device with lwip for lan" - default n - - config CONFIG_USBDEV_CDC_ECM_USING_LWIP - bool - prompt "Enable usb cdc ecm device with lwip for lan" - default n - - choice - prompt "Select usb device template, please select class driver first" - default PKG_CHERRYUSB_DEVICE_TEMPLATE_NONE - config PKG_CHERRYUSB_DEVICE_TEMPLATE_NONE - bool - prompt "none (Implement it yourself)" - config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM - bool - prompt "cdc_acm" - depends on PKG_CHERRYUSB_DEVICE_CDC_ACM - config PKG_CHERRYUSB_DEVICE_TEMPLATE_MSC - bool - prompt "msc_ram" - depends on PKG_CHERRYUSB_DEVICE_MSC - config PKG_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV - bool - prompt "msc_blkdev" - depends on PKG_CHERRYUSB_DEVICE_MSC - config PKG_CHERRYUSB_DEVICE_TEMPLATE_HID_KEYBOARD - bool - prompt "hid_keyboard" - depends on PKG_CHERRYUSB_DEVICE_HID - config PKG_CHERRYUSB_DEVICE_TEMPLATE_HID_MOUSE - bool - prompt "hid_mouse" - depends on PKG_CHERRYUSB_DEVICE_HID - config PKG_CHERRYUSB_DEVICE_TEMPLATE_HID_CUSTOM - bool - prompt "hid_custom" - depends on PKG_CHERRYUSB_DEVICE_HID - config PKG_CHERRYUSB_DEVICE_TEMPLATE_VIDEO - bool - prompt "video" - depends on PKG_CHERRYUSB_DEVICE_VIDEO - config PKG_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V1_MIC_SPEAKER - bool - prompt "audio_v1_mic_speaker_multichan" - depends on PKG_CHERRYUSB_DEVICE_AUDIO - config PKG_CHERRYUSB_DEVICE_TEMPLATE_AUDIO_V2_MIC_SPEAKER - bool - prompt "audio_v2_mic_speaker_multichan" - depends on PKG_CHERRYUSB_DEVICE_AUDIO - config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_RNDIS - bool - prompt "cdc_rndis" - depends on PKG_CHERRYUSB_DEVICE_CDC_RNDIS - config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ECM - bool - prompt "cdc_ecm" - depends on PKG_CHERRYUSB_DEVICE_CDC_ECM - config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_NCM - bool - prompt "cdc_ncm" - depends on PKG_CHERRYUSB_DEVICE_CDC_NCM - config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC - bool - prompt "cdc_acm_msc" - depends on PKG_CHERRYUSB_DEVICE_CDC_ACM && PKG_CHERRYUSB_DEVICE_MSC - config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_MSC_HID - bool - prompt "cdc_acm_msc_hid" - depends on PKG_CHERRYUSB_DEVICE_CDC_ACM && PKG_CHERRYUSB_DEVICE_MSC && PKG_CHERRYUSB_DEVICE_HID - config PKG_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV1 - bool - prompt "winusbv1" - config PKG_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_CDC - bool - prompt "winusbv2_cdc" - depends on PKG_CHERRYUSB_DEVICE_CDC_ACM - config PKG_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_HID - bool - prompt "winusbv2_hid" - depends on PKG_CHERRYUSB_DEVICE_HID - config PKG_CHERRYUSB_DEVICE_TEMPLATE_ADB - bool - prompt "adb" - depends on PKG_CHERRYUSB_DEVICE_ADB - config PKG_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_CHARDEV - bool - prompt "cdc_acm_chardev" - depends on PKG_CHERRYUSB_DEVICE_CDC_ACM_CHARDEV - endchoice - - config CONFIG_USBDEV_MSC_BLOCK_DEV_NAME - string "usb device msc block device name" - depends on PKG_CHERRYUSB_DEVICE_TEMPLATE_MSC_BLKDEV - default "sd0" - - endif - - menuconfig PKG_CHERRYUSB_HOST - bool "Enable usb host mode" - default n - - if PKG_CHERRYUSB_HOST - choice - prompt "Select usb host ip, and some ip need config in usb_config.h, please check" - default PKG_CHERRYUSB_HOST_CUSTOM - config PKG_CHERRYUSB_HOST_CUSTOM - bool "CUSTOM (Implement it yourself)" - config PKG_CHERRYUSB_HOST_EHCI_BL - bool "ehci_bouffalo" - config PKG_CHERRYUSB_HOST_EHCI_HPM - bool "ehci_hpm" - config PKG_CHERRYUSB_HOST_EHCI_AIC - bool "ehci_aic" - config PKG_CHERRYUSB_HOST_EHCI_MCX - bool "ehci_mcx" - config PKG_CHERRYUSB_HOST_EHCI_NUC980 - bool "ehci_nuc980" - config PKG_CHERRYUSB_HOST_EHCI_MA35D0 - bool "ehci_ma35d0" - config PKG_CHERRYUSB_HOST_EHCI_CUSTOM - bool "ehci_custom" - config PKG_CHERRYUSB_HOST_DWC2_ST - bool "dwc2_st" - config PKG_CHERRYUSB_HOST_DWC2_ESP - bool "dwc2_esp" - config PKG_CHERRYUSB_HOST_DWC2_KENDRYTE - bool "dwc2_kendryte" - config PKG_CHERRYUSB_HOST_DWC2_HC - bool "dwc2_hc" - config PKG_CHERRYUSB_HOST_DWC2_NATION - bool "dwc2_nation" - config PKG_CHERRYUSB_HOST_DWC2_CUSTOM - bool "dwc2_custom" - config PKG_CHERRYUSB_HOST_MUSB_ES - bool "musb_es" - config PKG_CHERRYUSB_HOST_MUSB_SUNXI - bool "musb_sunxi" - config PKG_CHERRYUSB_HOST_MUSB_BK - bool "musb_bk" - config PKG_CHERRYUSB_HOST_MUSB_SIFLI - bool "musb_sifli" - config PKG_CHERRYUSB_HOST_MUSB_CUSTOM - bool "musb_custom" - config PKG_CHERRYUSB_HOST_PUSB2 - bool "pusb2" - config PKG_CHERRYUSB_HOST_XHCI - bool "xhci" - config PKG_CHERRYUSB_HOST_RP2040 - bool "rp2040" - endchoice - - config PKG_CHERRYUSB_HOST_CDC_ACM - bool - prompt "Enable usb cdc acm driver" - default n - - config PKG_CHERRYUSB_HOST_HID - bool - prompt "Enable usb hid driver" - default n - - config PKG_CHERRYUSB_HOST_MSC - bool - prompt "Enable usb msc driver" - default n - select RT_USING_DFS - select RT_USING_DFS_ELMFAT - - config PKG_CHERRYUSB_HOST_CDC_ECM - bool - prompt "Enable usb cdc ecm driver" - select RT_USING_LWIP - select CONFIG_USBHOST_PLATFORM_CDC_ECM - default n - - config PKG_CHERRYUSB_HOST_CDC_RNDIS - bool - prompt "Enable usb rndis driver" - select RT_USING_LWIP - select CONFIG_USBHOST_PLATFORM_CDC_RNDIS - default n - - config PKG_CHERRYUSB_HOST_CDC_NCM - bool - prompt "Enable usb cdc ncm driver" - select RT_USING_LWIP - select CONFIG_USBHOST_PLATFORM_CDC_NCM - default n - - config PKG_CHERRYUSB_HOST_VIDEO - bool - prompt "Enable usb video driver, it is commercial charge" - default n - - config PKG_CHERRYUSB_HOST_AUDIO - bool - prompt "Enable usb audio driver, it is commercial charge" - default n - - config PKG_CHERRYUSB_HOST_BLUETOOTH - bool - prompt "Enable usb bluetooth driver" - default n - - config PKG_CHERRYUSB_HOST_ASIX - bool - prompt "Enable usb asix driver" - select RT_USING_LWIP - select CONFIG_USBHOST_PLATFORM_ASIX - default n - - config PKG_CHERRYUSB_HOST_RTL8152 - bool - prompt "Enable usb rtl8152 driver" - select RT_USING_LWIP - select CONFIG_USBHOST_PLATFORM_RTL8152 - default n - - config PKG_CHERRYUSB_HOST_FTDI - bool - prompt "Enable usb ftdi driver" - default n - - config PKG_CHERRYUSB_HOST_CH34X - bool - prompt "Enable usb ch34x driver" - default n - - config PKG_CHERRYUSB_HOST_CP210X - bool - prompt "Enable usb cp210x driver" - default n - - config PKG_CHERRYUSB_HOST_PL2303 - bool - prompt "Enable usb pl2303 driver" - default n - - config CONFIG_USBHOST_PLATFORM_CDC_ECM - bool - - config CONFIG_USBHOST_PLATFORM_CDC_RNDIS - bool - - config CONFIG_USBHOST_PLATFORM_CDC_NCM - bool - - config CONFIG_USBHOST_PLATFORM_ASIX - bool - - config CONFIG_USBHOST_PLATFORM_RTL8152 - bool - - config CONFIG_USBHOST_PSC_PRIO - int - prompt "Set hubport change thread priority, 0 is the max priority" - default 0 - - config CONFIG_USBHOST_PSC_STACKSIZE - int - prompt "Set hubport change thread stacksize" - default 4096 - - config CONFIG_USBHOST_REQUEST_BUFFER_LEN - int - prompt "Set host control transfer max buffer size" - default 512 - - config CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT - int - prompt "Set host control transfer timeout, unit is ms" - default 500 - - config RT_LWIP_PBUF_POOL_BUFSIZE - int "The size of each pbuf in the pbuf pool" - range 1500 2000 - default 1600 - - config CONFIG_USB_DFS_MOUNT_POINT - string "usb host dfs mount point" - depends on RT_CHERRYUSB_HOST_MSC - default "/" - - menu "Select USB host template, please select class driver first" - config CONFIG_TEST_USBH_CDC_ACM - int - prompt "demo for test cdc acm, cannot enable this demo, we have used serial framework instead" - default 0 - depends on PKG_CHERRYUSB_HOST_CDC_ACM - config CONFIG_TEST_USBH_HID - int - prompt "demo for test hid" - default 0 - depends on PKG_CHERRYUSB_HOST_HID - config CONFIG_TEST_USBH_MSC - int - prompt "demo for test msc, cannot enable this demo, we have used dfs instead" - default 0 - depends on PKG_CHERRYUSB_HOST_MSC - endmenu - endif - - config PKG_CHERRYUSB_PATH - string - default "/packages/system/CherryUSB" - - choice - prompt "Version" - default PKG_USING_CHERRYUSB_V010502 - help - Select the package version - - config PKG_USING_CHERRYUSB_LATEST_VERSION - bool "latest" - config PKG_USING_CHERRYUSB_V010502 - bool "v1.5.2" - config PKG_USING_CHERRYUSB_V010501 - bool "v1.5.1" - config PKG_USING_CHERRYUSB_V010500 - bool "v1.5.0" - config PKG_USING_CHERRYUSB_V010403 - bool "v1.4.3" - config PKG_USING_CHERRYUSB_V010301 - bool "v1.3.1" - config PKG_USING_CHERRYUSB_V010200 - bool "v1.2.0" - config PKG_USING_CHERRYUSB_V001002 - bool "v0.10.2" - endchoice - - config PKG_CHERRYUSB_VER - string - default "latest" if PKG_USING_CHERRYUSB_LATEST_VERSION - default "v1.5.2" if PKG_USING_CHERRYUSB_V010502 - default "v1.5.1" if PKG_USING_CHERRYUSB_V010501 - default "v1.5.0" if PKG_USING_CHERRYUSB_V010500 - default "v1.4.3" if PKG_USING_CHERRYUSB_V010403 - default "v1.3.1" if PKG_USING_CHERRYUSB_V010301 - default "v1.2.0" if PKG_USING_CHERRYUSB_V010200 - default "v0.10.2" if PKG_USING_CHERRYUSB_V001002 -endif diff --git a/components/drivers/usb/cherryusb/README.md b/components/drivers/usb/cherryusb/README.md index fcb6f13c96..d514f1fb08 100644 --- a/components/drivers/usb/cherryusb/README.md +++ b/components/drivers/usb/cherryusb/README.md @@ -40,6 +40,8 @@ Taking into account USB performance issues and trying to achieve the theoretical - Unlimited length make it easier to interface with hardware DMA and take advantage of DMA - Packetization is handled in interrupt +Performance show:https://cherryusb.cherry-embedded.org/show/ + ## Directory Structure | Directory | Description | @@ -103,14 +105,15 @@ CherryUSB Host Stack has the following functions: - Support blocking transfers and asynchronous transfers - Support Composite Device - Multi-level HUB support, expandable up to 7 levels(Testing hub with 10 ports works well,only support dwc2/ehci/xhci/rp2040) -- Support Communication Device Class (CDC_ACM, CDC_ECM) +- Support Communication Device Class (CDC_ACM, CDC_ECM, CDC_NCM) - Support Human Interface Device (HID) - Support Mass Storage Class (MSC) - Support USB Video CLASS (UVC1.0, UVC1.5) - Support USB Audio CLASS (UAC1.0) - Support Remote NDIS (RNDIS) - Support USB Bluetooth class (support nimble and zephyr bluetooth stack, support **CLASS:0xE0** or vendor class like cdc acm) -- Support Vendor class (serial, net, wifi) +- Support Vendor Serial Class(CH34X、CP210X、PL2303、FTDI、GSM) +- Support Vendor network Class(RTL8152、AX88772) - Support USB modeswitch - Support Android Open Accessory - Support multi host with the same USB IP @@ -141,14 +144,14 @@ Among them, `sizeof(struct usbh_hub)` and `sizeof(struct usbh_hubport)` are affe #define CONFIG_USBHOST_MAX_EXTHUBS 1 #define CONFIG_USBHOST_MAX_EHPORTS 4 #define CONFIG_USBHOST_MAX_INTERFACES 8 -#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 2 #define CONFIG_USBHOST_MAX_ENDPOINTS 4 ``` x is affected by the following macros: ``` -#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_SERIAL_CLASS 4 #define CONFIG_USBHOST_MAX_HID_CLASS 4 #define CONFIG_USBHOST_MAX_MSC_CLASS 2 #define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 @@ -179,32 +182,33 @@ Quickly start, USB basic concepts, API manual, Class basic concepts and examples ## Video Tutorial -CherryUSB Cheese (based V1.4.3): https://www.bilibili.com/cheese/play/ss707687201 . +CherryUSB Cheese (>= V1.4.3): https://www.bilibili.com/cheese/play/ss707687201 . ## Descriptor Generator Tool -TODO +Cherry Descriptor: https://desc.cherry-embedded.org/en ## Demo Repo -| Manufacturer | CHIP or Series | USB IP| Repo Url | Support version | Support status | +| Manufacturer | CHIP or Series | USB IP| Repo Url | Support version | Note | |:--------------------:|:------------------:|:-----:|:--------:|:------------------:|:-------------:| -|Bouffalolab | BL702/BL616/BL808 | bouffalolab/ehci|[bouffalo_sdk](https://github.com/CherryUSB/bouffalo_sdk)|<= latest | Long-term | -|ST | STM32F1x/STM32F4/STM32H7 | fsdev/dwc2 |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Long-term | -|HPMicro | HPM6000/HPM5000 | hpm/ehci |[hpm_sdk](https://github.com/CherryUSB/hpm_sdk)|<= latest | Long-term | -|Essemi | ES32F36xx | musb |[es32f369_repo](https://github.com/CherryUSB/cherryusb_es32)|<= latest | Long-term | -|Phytium | e2000 | pusb2/xhci |[phytium_repo](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk)|>=1.4.0 | Long-term | -|Artinchip | d12x/d13x/d21x | aic/ehci/ohci |[luban-lite](https://gitee.com/artinchip/luban-lite)|<= latest | Long-term | -|Espressif | esp32s2/esp32s3/esp32p4 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)|<= latest | Long-term | -|NXP | mcx | kinetis/chipidea/ehci |[nxp_mcx_repo](https://github.com/CherryUSB/cherryusb_mcx)|<= latest | Long-term | -|Kendryte | k230 | dwc2 |[k230_repo](https://github.com/CherryUSB/k230_sdk)|v1.2.0 | Long-term | -|Actionstech | ATS30xx | dwc2 |[action_zephyr_repo](https://github.com/CherryUSB/lv_port_actions_technology/tree/master/action_technology_sdk)|>=1.4.0 | Long-term | -|Nationstech | n32h4x | dwc2 |[nation_repo](https://github.com/CherryUSB/cherryusb_nation)|>=1.5.0 | Long-term | -|Raspberry pi | rp2040/rp2350 | rp2040 |[pico-examples](https://github.com/CherryUSB/pico-examples)|<= latest | Long-term | -|AllwinnerTech | F1C100S/F1C200S | musb |[cherryusb_rtt_f1c100s](https://github.com/CherryUSB/cherryusb_rtt_f1c100s)|<= latest | the same with musb | -|Bekencorp | bk7256/bk7258 | musb |[bk_idk](https://github.com/CherryUSB/bk_idk)| v0.7.0 | the same with musb | -|Sophgo | cv18xx | dwc2 |[cvi_alios_open](https://github.com/CherryUSB/cvi_alios_open)| v0.7.0 | TBD | -|WCH | CH32V307/ch58x | ch32_usbfs/ch32_usbhs/ch58x |[wch_repo](https://github.com/CherryUSB/cherryusb_wch)|<= v0.10.2/>=v1.5.0 | TBD | +|Bouffalolab | BL702/BL616/BL808 | bouffalolab/ehci|[bouffalo_sdk](https://github.com/CherryUSB/bouffalo_sdk)|<= latest | Official | +|ST | STM32F1x/STM32F4/STM32H7 | fsdev/dwc2 |[stm32_repo](https://github.com/CherryUSB/cherryusb_stm32)|<= latest | Community | +|HPMicro | HPM6000/HPM5000 | hpm/ehci |[hpm_sdk](https://github.com/CherryUSB/hpm_sdk)|<= latest | Official | +|Essemi | ES32F36xx | musb |[es32f369_repo](https://github.com/CherryUSB/cherryusb_es32)|<= latest | Official | +|Phytium | e2000 | pusb2/xhci |[phytium_repo](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk)|>=1.4.0 | Official | +|Artinchip | d12x/d13x/d21x | aic/ehci/ohci |[luban-lite](https://gitee.com/artinchip/luban-lite)|<= latest | Official | +|Espressif | esp32s2/esp32s3/esp32p4 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)/[espressif](https://github.com/espressif/esp-idf/tree/master/examples/peripherals/usb)|<= latest | Official | +|Kendryte | k230 | dwc2 |[k230_repo](https://github.com/CherryUSB/k230_sdk)|v1.2.0 | Official | +|Actionstech | ATS30xx | dwc2 |[action_zephyr_repo](https://github.com/CherryUSB/lv_port_actions_technology/tree/master/action_technology_sdk)|>=1.4.0 | Official | +|SiFli | SF32LB5x | musb |[SiFli_sdk](https://github.com/OpenSiFli/SiFli-SDK)|>=1.5.0 | Official | +|NXP | mcx | kinetis/chipidea/ehci |[nxp_mcx_repo](https://github.com/CherryUSB/cherryusb_mcx)|<= latest | Community | +|Nationstech | n32h4x | dwc2 |[nation_repo](https://github.com/CherryUSB/cherryusb_nation)|>=1.5.0 | Official ongoing | +|Raspberry pi | rp2040/rp2350 | rp2040 |[pico-sdk](https://github.com/CherryUSB/pico-sdk)|<= latest | Official ongoing | +|AllwinnerTech | F1C100S/F1C200S | musb |[cherryusb_rtt_f1c100s](https://github.com/CherryUSB/cherryusb_rtt_f1c100s)|<= latest | no more update | +|Bekencorp | bk7256/bk7258 | musb |[bk_idk](https://github.com/CherryUSB/bk_idk)| v0.7.0 | Official | +|Sophgo | cv18xx | dwc2 |[cvi_alios_open](https://github.com/CherryUSB/cvi_alios_open)| v0.7.0 | Official | +|WCH | CH32V307/ch58x | ch32_usbfs/ch32_usbhs/ch58x |[wch_repo](https://github.com/CherryUSB/cherryusb_wch)|<= v0.10.2/>=v1.5.0 | no more update | ## Package Support @@ -226,5 +230,4 @@ CherryUSB discord: https://discord.com/invite/wFfvrSAey8. Thanks to the following companies for their support (in no particular order): - - + diff --git a/components/drivers/usb/cherryusb/README_zh.md b/components/drivers/usb/cherryusb/README_zh.md index 64287a558b..cf76f3ea28 100644 --- a/components/drivers/usb/cherryusb/README_zh.md +++ b/components/drivers/usb/cherryusb/README_zh.md @@ -112,7 +112,8 @@ CherryUSB Host 协议栈当前实现以下功能: - Support USB Audio CLASS (UAC1.0) - 支持 Remote NDIS (RNDIS) - 支持 USB Bluetooth (支持 nimble and zephyr bluetooth 协议栈,支持 **CLASS: 0xE0** 或者厂家自定义类,类似于 cdc acm 功能) -- 支持 Vendor 类 class (serial, net, wifi) +- 支持 Vendor Serial 类(CH34X、CP210X、PL2303、FTDI、GSM) +- 支持 Vendor network 类(RTL8152、AX88772) - 支持 USB modeswitch - 支持 Android Open Accessory - 支持相同 USB IP 的多主机 @@ -150,7 +151,7 @@ CherryUSB Host 协议栈资源占用说明(GCC 10.2 with -O2,关闭 log) x 受以下宏影响: ``` -#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_SERIAL_CLASS 4 #define CONFIG_USBHOST_MAX_HID_CLASS 4 #define CONFIG_USBHOST_MAX_MSC_CLASS 2 #define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 @@ -181,11 +182,11 @@ CherryUSB 快速入门、USB 基本概念、API 手册、Class 基本概念和 ## 视频教程 -CherryUSB 课程(基于 V1.4.3):https://www.bilibili.com/cheese/play/ss707687201 。 +CherryUSB 课程(>= V1.4.3):https://www.bilibili.com/cheese/play/ss707687201 。 ## 描述符生成工具 -TODO +Cherry Descriptor: https://desc.cherry-embedded.org/zh ## 示例仓库 @@ -197,7 +198,7 @@ TODO |Essemi | ES32F36xx | musb |[es32f369_repo](https://github.com/CherryUSB/cherryusb_es32)|<= latest | Official | |Phytium | e2000 | pusb2/xhci |[phytium_repo](https://gitee.com/phytium_embedded/phytium-free-rtos-sdk)|>=1.4.0 | Official | |Artinchip | d12x/d13x/d21x | aic/ehci/ohci |[luban-lite](https://gitee.com/artinchip/luban-lite)|<= latest | Official | -|Espressif | esp32s2/esp32s3/esp32p4 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)|<= latest | Official ongoing | +|Espressif | esp32s2/esp32s3/esp32p4 | dwc2 |[esp32_repo](https://github.com/CherryUSB/cherryusb_esp32)/[espressif](https://github.com/espressif/esp-idf/tree/master/examples/peripherals/usb)|<= latest | Official | |Kendryte | k230 | dwc2 |[k230_repo](https://github.com/CherryUSB/k230_sdk)|v1.2.0 | Official | |Actionstech | ATS30xx | dwc2 |[action_zephyr_repo](https://github.com/CherryUSB/lv_port_actions_technology/tree/master/action_technology_sdk)|>=1.4.0 | Official | |SiFli | SF32LB5x | musb |[SiFli_sdk](https://github.com/OpenSiFli/SiFli-SDK)|>=1.5.0 | Official | diff --git a/components/drivers/usb/cherryusb/SConscript b/components/drivers/usb/cherryusb/SConscript index a2a80fdc37..b134dec2ad 100644 --- a/components/drivers/usb/cherryusb/SConscript +++ b/components/drivers/usb/cherryusb/SConscript @@ -14,9 +14,8 @@ path += [cwd + '/class/wireless'] path += [cwd + '/class/midi'] path += [cwd + '/class/adb'] path += [cwd + '/class/dfu'] -path += [cwd + '/class/midi'] +path += [cwd + '/class/serial'] path += [cwd + '/class/vendor/net'] -path += [cwd + '/class/vendor/serial'] path += [cwd + '/class/vendor/wifi'] src = [] @@ -47,6 +46,9 @@ if GetDepend(['RT_CHERRYUSB_DEVICE']): if GetDepend(['RT_CHERRYUSB_DEVICE_DWC2_KENDRYTE']): src += Glob('port/dwc2/usb_dc_dwc2.c') src += Glob('port/dwc2/usb_glue_kendryte.c') + if GetDepend(['RT_CHERRYUSB_DEVICE_DWC2_INFINEON']): + src += Glob('port/dwc2/usb_dc_dwc2.c') + src += Glob('port/dwc2/usb_glue_infineon.c') if GetDepend(['RT_CHERRYUSB_DEVICE_DWC2_AT']): src += Glob('port/dwc2/usb_dc_dwc2.c') src += Glob('port/dwc2/usb_glue_at.c') @@ -112,6 +114,9 @@ if GetDepend(['RT_CHERRYUSB_DEVICE']): LIBS = ['libpusb2_dc_a32_softfp_neon.a'] if GetDepend(['RT_CHERRYUSB_DEVICE_NRF5X']): src += Glob('port/nrf5x/usb_dc_nrf5x.c') + if GetDepend(['RT_CHERRYUSB_DEVICE_RP2040']): + path += [cwd + '/port/rp2040'] + src += Glob('port/rp2040/usb_dc_rp2040.c') if GetDepend(['RT_CHERRYUSB_DEVICE_CDC_ACM']): src += Glob('class/cdc/usbd_cdc_acm.c') @@ -166,10 +171,12 @@ if GetDepend(['RT_CHERRYUSB_DEVICE']): src += Glob('demo/cdc_acm_hid_msc_template.c') if GetDepend(['RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV1']): src += Glob('demo/winusb1.0_template.c') + if GetDepend(['RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2']): + src += Glob('demo/winusb2.0_template.c') if GetDepend(['RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_CDC']): src += Glob('demo/winusb2.0_cdc_template.c') - if GetDepend(['RT_CHERRYUSB_DEVICE_TEMPLATE_WINUSBV2_HID']): - src += Glob('demo/winusb2.0_hid_template.c') + if GetDepend(['RT_CHERRYUSB_DEVICE_TEMPLATE_WEBUSB_HID']): + src += Glob('demo/webusb_hid_template.c') if GetDepend(['RT_CHERRYUSB_DEVICE_TEMPLATE_ADB']): src += Glob('demo/adb/usbd_adb_template.c') if GetDepend(['RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM_CHARDEV']): @@ -216,6 +223,12 @@ if GetDepend(['RT_CHERRYUSB_HOST']): if GetDepend(['RT_CHERRYUSB_HOST_DWC2_KENDRYTE']): src += Glob('port/dwc2/usb_hc_dwc2.c') src += Glob('port/dwc2/usb_glue_kendryte.c') + if GetDepend(['RT_CHERRYUSB_HOST_DWC2_INFINEON']): + src += Glob('port/dwc2/usb_hc_dwc2.c') + src += Glob('port/dwc2/usb_glue_infineon.c') + if GetDepend(['RT_CHERRYUSB_HOST_DWC2_AT']): + src += Glob('port/dwc2/usb_hc_dwc2.c') + src += Glob('port/dwc2/usb_glue_at.c') if GetDepend(['RT_CHERRYUSB_HOST_DWC2_HC']): src += Glob('port/dwc2/usb_hc_dwc2.c') src += Glob('port/dwc2/usb_glue_hc.c') @@ -266,8 +279,12 @@ if GetDepend(['RT_CHERRYUSB_HOST']): LIBPATH = [cwd + '/port/xhci/phytium'] LIBS = ['libxhci_a32_softfp_neon.a'] + if GetDepend(['RT_CHERRYUSB_HOST_RP2040']): + path += [cwd + '/port/rp2040'] + src += Glob('port/rp2040/usb_hc_rp2040.c') + if GetDepend(['RT_CHERRYUSB_HOST_CDC_ACM']): - src += Glob('class/cdc/usbh_cdc_acm.c') + src += Glob('class/serial/usbh_cdc_acm.c') if GetDepend(['RT_CHERRYUSB_HOST_HID']): src += Glob('class/hid/usbh_hid.c') if GetDepend(['RT_CHERRYUSB_HOST_MSC']): @@ -289,23 +306,26 @@ if GetDepend(['RT_CHERRYUSB_HOST']): if GetDepend(['RT_CHERRYUSB_HOST_RTL8152']): src += Glob('class/vendor/net/usbh_rtl8152.c') if GetDepend(['RT_CHERRYUSB_HOST_FTDI']): - src += Glob('class/vendor/serial/usbh_ftdi.c') + src += Glob('class/serial/usbh_ftdi.c') if GetDepend(['RT_CHERRYUSB_HOST_CH34X']): - src += Glob('class/vendor/serial/usbh_ch34x.c') + src += Glob('class/serial/usbh_ch34x.c') if GetDepend(['RT_CHERRYUSB_HOST_CP210X']): - src += Glob('class/vendor/serial/usbh_cp210x.c') + src += Glob('class/serial/usbh_cp210x.c') if GetDepend(['RT_CHERRYUSB_HOST_PL2303']): - src += Glob('class/vendor/serial/usbh_pl2303.c') + src += Glob('class/serial/usbh_pl2303.c') - if GetDepend(['CONFIG_TEST_USBH_HID']): + if GetDepend(['RT_TEST_USBH_HID']): + CPPDEFINES+=['CONFIG_TEST_USBH_HID'] src += Glob('demo/usb_host.c') if GetDepend(['RT_CHERRYUSB_HOST_CDC_ACM']) \ or GetDepend(['RT_CHERRYUSB_HOST_FTDI']) \ or GetDepend(['RT_CHERRYUSB_HOST_CH34X']) \ or GetDepend(['RT_CHERRYUSB_HOST_CP210X']) \ - or GetDepend(['RT_CHERRYUSB_HOST_PL2303']): - src += Glob('platform/rtthread/usbh_serial.c') + or GetDepend(['RT_CHERRYUSB_HOST_PL2303']) \ + or GetDepend(['RT_CHERRYUSB_HOST_GSM']): + src += Glob('class/serial/usbh_serial.c') + src += Glob('platform/rtthread/usbh_rtserial.c') if GetDepend('RT_USING_DFS') and GetDepend(['RT_CHERRYUSB_HOST_MSC']): src += Glob('platform/rtthread/usbh_dfs.c') diff --git a/components/drivers/usb/cherryusb/VERSION b/components/drivers/usb/cherryusb/VERSION index 7aa5f8b8df..bf6627b8a1 100644 --- a/components/drivers/usb/cherryusb/VERSION +++ b/components/drivers/usb/cherryusb/VERSION @@ -1,5 +1,5 @@ VERSION_MAJOR = 1 -VERSION_MINOR = 5 -PATCHLEVEL = 2 +VERSION_MINOR = 6 +PATCHLEVEL = 0 VERSION_TWEAK = 0 EXTRAVERSION = 0 diff --git a/components/drivers/usb/cherryusb/cherryusb.cmake b/components/drivers/usb/cherryusb/cherryusb.cmake index 3d7c28b3d9..6957324936 100644 --- a/components/drivers/usb/cherryusb/cherryusb.cmake +++ b/components/drivers/usb/cherryusb/cherryusb.cmake @@ -47,10 +47,11 @@ list( ${CMAKE_CURRENT_LIST_DIR}/class/midi ${CMAKE_CURRENT_LIST_DIR}/class/adb ${CMAKE_CURRENT_LIST_DIR}/class/dfu + ${CMAKE_CURRENT_LIST_DIR}/class/serial ${CMAKE_CURRENT_LIST_DIR}/class/vendor/net - ${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial ${CMAKE_CURRENT_LIST_DIR}/class/vendor/wifi ${CMAKE_CURRENT_LIST_DIR}/class/aoa + ${CMAKE_CURRENT_LIST_DIR}/class/gamepad ) if(CONFIG_CHERRYUSB_DEVICE) @@ -85,6 +86,9 @@ if(CONFIG_CHERRYUSB_DEVICE) if(CONFIG_CHERRYUSB_DEVICE_ADB) list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/adb/usbd_adb.c) endif() + if(CONFIG_CHERRYUSB_DEVICE_GAMEPAD) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/gamepad/usbd_gamepad.c) + endif() if(CONFIG_CHERRYUSB_DEVICE_FSDEV_ST) list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/fsdev/usb_dc_fsdev.c) @@ -156,7 +160,7 @@ if(CONFIG_CHERRYUSB_HOST) ) if(CONFIG_CHERRYUSB_HOST_CDC_ACM) - list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/cdc/usbh_cdc_acm.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/serial/usbh_cdc_acm.c) endif() if(CONFIG_CHERRYUSB_HOST_CDC_ECM) list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/cdc/usbh_cdc_ecm.c) @@ -235,30 +239,39 @@ if(CONFIG_CHERRYUSB_HOST) list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/net/usbh_rtl8152.c) endif() if(CONFIG_CHERRYUSB_HOST_CH34X) - list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial/usbh_ch34x.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/serial/usbh_ch34x.c) endif() if(CONFIG_CHERRYUSB_HOST_CP210X) - list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial/usbh_cp210x.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/serial/usbh_cp210x.c) endif() if(CONFIG_CHERRYUSB_HOST_FTDI) - list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial/usbh_ftdi.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/serial/usbh_ftdi.c) endif() if(CONFIG_CHERRYUSB_HOST_PL2303) - list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/serial/usbh_pl2303.c) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/serial/usbh_pl2303.c) endif() - if(CONFIG_CHERRYUSB_HOST_BL616) - list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/vendor/wifi/usbh_bl616.c) + if(CONFIG_CHERRYUSB_HOST_GSM) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/serial/usbh_gsm.c) endif() if(CONFIG_CHERRYUSB_HOST_AOA) list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/aoa/usbh_aoa.c) endif() + if(CONFIG_CHERRYUSB_HOST_CDC_ACM + OR CONFIG_CHERRYUSB_HOST_CH34X + OR CONFIG_CHERRYUSB_HOST_CP210X + OR CONFIG_CHERRYUSB_HOST_FTDI + OR CONFIG_CHERRYUSB_HOST_PL2303 + OR CONFIG_CHERRYUSB_HOST_GSM + ) + list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/class/serial/usbh_serial.c) + endif() + if(CONFIG_CHERRYUSB_HOST_CDC_ECM OR CONFIG_CHERRYUSB_HOST_CDC_RNDIS OR CONFIG_CHERRYUSB_HOST_CDC_NCM OR CONFIG_CHERRYUSB_HOST_ASIX OR CONFIG_CHERRYUSB_HOST_RTL8152 - OR CONFIG_CHERRYUSB_HOST_BL616 ) if("${CONFIG_CHERRYUSB_OSAL}" STREQUAL "idf") list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/platform/idf/usbh_net.c) @@ -335,11 +348,15 @@ if(CONFIG_CHERRYUSB_HOST) list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/port/rp2040/usb_hc_rp2040.c) endif() - if(CONFIG_TEST_USBH_CDC_ACM OR CONFIG_TEST_USBH_HID OR CONFIG_TEST_USBH_MSC) + if(CONFIG_TEST_USBH_SERIAL OR CONFIG_TEST_USBH_HID OR CONFIG_TEST_USBH_MSC) list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/demo/usb_host.c) endif() endif() +if(CONFIG_CHERRYUSB_DEVICE AND CONFIG_CHERRYUSB_HOST) +list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/core/usbotg_core.c) +endif() + if(DEFINED CONFIG_CHERRYUSB_OSAL) if("${CONFIG_CHERRYUSB_OSAL}" STREQUAL "freertos") list(APPEND cherryusb_srcs ${CMAKE_CURRENT_LIST_DIR}/osal/usb_osal_freertos.c) diff --git a/components/drivers/usb/cherryusb/cherryusb_config_template.h b/components/drivers/usb/cherryusb/cherryusb_config_template.h index 1e8aab740c..9f06900528 100644 --- a/components/drivers/usb/cherryusb/cherryusb_config_template.h +++ b/components/drivers/usb/cherryusb/cherryusb_config_template.h @@ -157,7 +157,7 @@ #define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 2 #define CONFIG_USBHOST_MAX_ENDPOINTS 4 -#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_SERIAL_CLASS 4 #define CONFIG_USBHOST_MAX_HID_CLASS 4 #define CONFIG_USBHOST_MAX_MSC_CLASS 2 #define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 @@ -188,6 +188,10 @@ #define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 #endif +#ifndef CONFIG_USBHOST_SERIAL_RX_SIZE +#define CONFIG_USBHOST_SERIAL_RX_SIZE 2048 +#endif + #ifndef CONFIG_USBHOST_MSC_TIMEOUT #define CONFIG_USBHOST_MSC_TIMEOUT 5000 #endif @@ -301,6 +305,7 @@ /* ---------------- MUSB Configuration ---------------- */ #define CONFIG_USB_MUSB_PIPE_NUM 8 // #define CONFIG_USB_MUSB_SUNXI +// #define CONFIG_USB_MUSB_WITHOUT_MULTIPOINT /* When your chip hardware supports high-speed and wants to initialize it in high-speed mode, * the relevant IP will configure the internal or external high-speed PHY according to CONFIG_USB_HS. @@ -317,4 +322,7 @@ #define usb_ramaddr2phyaddr(addr) (addr) #endif +/* Enable OTG support, only support hpmicro now */ +// #define CONFIG_USB_OTG_ENABLE + #endif diff --git a/components/drivers/usb/cherryusb/class/aoa/usbh_aoa.c b/components/drivers/usb/cherryusb/class/aoa/usbh_aoa.c index ddae957148..02d9fab553 100644 --- a/components/drivers/usb/cherryusb/class/aoa/usbh_aoa.c +++ b/components/drivers/usb/cherryusb/class/aoa/usbh_aoa.c @@ -176,9 +176,6 @@ int usbh_aoa_register_hid(struct usbh_aoa *aoa_class, uint16_t id, uint8_t *repo int usbh_aoa_send_hid_event(struct usbh_aoa *aoa_class, uint16_t id, uint8_t *event, uint32_t event_len) { struct usb_setup_packet *setup; - int ret; - uint8_t len; - uint32_t offset; if (!aoa_class || !aoa_class->hport) { return -USB_ERR_INVAL; @@ -198,7 +195,6 @@ int usbh_aoa_send_hid_event(struct usbh_aoa *aoa_class, uint16_t id, uint8_t *ev static int usbh_aoa_connect(struct usbh_hubport *hport, uint8_t intf) { struct usb_endpoint_descriptor *ep_desc; - int ret = 0; struct usbh_aoa *aoa_class = &g_aoa_class; diff --git a/components/drivers/usb/cherryusb/class/audio/usb_audio.h b/components/drivers/usb/cherryusb/class/audio/usb_audio.h index eb518b7bcb..6c25c3de21 100644 --- a/components/drivers/usb/cherryusb/class/audio/usb_audio.h +++ b/components/drivers/usb/cherryusb/class/audio/usb_audio.h @@ -88,18 +88,6 @@ #define AUDIO_ENDPOINT_UNDEFINED 0x00U #define AUDIO_ENDPOINT_GENERAL 0x01U -/* Feature Unit Control Bits */ -#define AUDIO_CONTROL_MUTE 0x0001 -#define AUDIO_CONTROL_VOLUME 0x0002 -#define AUDIO_CONTROL_BASS 0x0004 -#define AUDIO_CONTROL_MID 0x0008 -#define AUDIO_CONTROL_TREBLE 0x0010 -#define AUDIO_CONTROL_GRAPHIC_EQUALIZER 0x0020 -#define AUDIO_CONTROL_AUTOMATIC_GAIN 0x0040 -#define AUDIO_CONTROL_DEALY 0x0080 -#define AUDIO_CONTROL_BASS_BOOST 0x0100 -#define AUDIO_CONTROL_LOUDNESS 0x0200 - /* Encoder Type Codes */ #define AUDIO_ENCODER_UNDEF 0x00 #define AUDIO_ENCODER_OTHER 0x01 @@ -245,22 +233,34 @@ #define AUDIO_FU_CONTROL_OVERFLOW 0x0f #define AUDIO_FU_CONTROL_LATENCY 0x10 -#define AUDIO_V2_FU_CONTROL_UNDEF 0x00 -#define AUDIO_V2_FU_CONTROL_MUTE (0x03 << 0) -#define AUDIO_V2_FU_CONTROL_VOLUME (0x03 << 2) -#define AUDIO_V2_FU_CONTROL_BASS (0x03 << 4) -#define AUDIO_V2_FU_CONTROL_MID (0x03 << 6) -#define AUDIO_V2_FU_CONTROL_TREBLE (0x03 << 8) -#define AUDIO_V2_FU_CONTROL_EQUALIZER (0x03 << 10) -#define AUDIO_V2_FU_CONTROL_AGC (0x03 << 12) -#define AUDIO_V2_FU_CONTROL_DELAY (0x03 << 14) -#define AUDIO_V2_FU_CONTROL_BASS_BOOST (0x03 << 16) -#define AUDIO_V2_FU_CONTROL_LOUDNESS (0x03 << 18) -#define AUDIO_V2_FU_CONTROL_INP_GAIN (0x03 << 20) -#define AUDIO_V2_FU_CONTROL_INP_GAIN_PAD (0x03 << 22) -#define AUDIO_V2_FU_CONTROL_PHASE_INVERT (0x03 << 24) -#define AUDIO_V2_FU_CONTROL_UNDERFLOW (0x03 << 26) -#define AUDIO_V2_FU_CONTROL_OVERFLOW (0x03 << 28) +/* Feature Unit Control Bits */ +#define AUDIO_CONTROL_MUTE 0x0001 +#define AUDIO_CONTROL_VOLUME 0x0002 +#define AUDIO_CONTROL_BASS 0x0004 +#define AUDIO_CONTROL_MID 0x0008 +#define AUDIO_CONTROL_TREBLE 0x0010 +#define AUDIO_CONTROL_GRAPHIC_EQUALIZER 0x0020 +#define AUDIO_CONTROL_AUTOMATIC_GAIN 0x0040 +#define AUDIO_CONTROL_DEALY 0x0080 +#define AUDIO_CONTROL_BASS_BOOST 0x0100 +#define AUDIO_CONTROL_LOUDNESS 0x0200 + +#define AUDIO_V2_CONTROL_UNDEF 0x00 +#define AUDIO_V2_CONTROL_MUTE (0x03 << 0) +#define AUDIO_V2_CONTROL_VOLUME (0x03 << 2) +#define AUDIO_V2_CONTROL_BASS (0x03 << 4) +#define AUDIO_V2_CONTROL_MID (0x03 << 6) +#define AUDIO_V2_CONTROL_TREBLE (0x03 << 8) +#define AUDIO_V2_CONTROL_EQUALIZER (0x03 << 10) +#define AUDIO_V2_CONTROL_AGC (0x03 << 12) +#define AUDIO_V2_CONTROL_DELAY (0x03 << 14) +#define AUDIO_V2_CONTROL_BASS_BOOST (0x03 << 16) +#define AUDIO_V2_CONTROL_LOUDNESS (0x03 << 18) +#define AUDIO_V2_CONTROL_INP_GAIN (0x03 << 20) +#define AUDIO_V2_CONTROL_INP_GAIN_PAD (0x03 << 22) +#define AUDIO_V2_CONTROL_PHASE_INVERT (0x03 << 24) +#define AUDIO_V2_CONTROL_UNDERFLOW (0x03 << 26) +#define AUDIO_V2_CONTROL_OVERFLOW (0x03 << 28) /* Parametric Equalizer Section Effect Unit Control Selectors */ #define AUDIO_PE_CONTROL_UNDEF 0x00 @@ -605,7 +605,7 @@ struct audio_cs_if_ac_header_descriptor { uint8_t baInterfaceNr[]; } __PACKED; -#define AUDIO_SIZEOF_AC_HEADER_DESC(n) (8 + n) +#define AUDIO_SIZEOF_AC_HEADER_DESC(bInCollection) (8 + (bInCollection)) struct audio_cs_if_ac_input_terminal_descriptor { uint8_t bLength; @@ -646,7 +646,7 @@ struct audio_cs_if_ac_feature_unit_descriptor { uint8_t iFeature; } __PACKED; -#define AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(ch, n) (7 + (ch + 1) * n) +#define AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(bNrChannels, bControlSize) (7 + ((bNrChannels) + 1) * (bControlSize)) struct audio_cs_if_ac_selector_unit_descriptor { uint8_t bLength; @@ -658,7 +658,7 @@ struct audio_cs_if_ac_selector_unit_descriptor { uint8_t iSelector; } __PACKED; -#define AUDIO_SIZEOF_AC_SELECTOR_UNIT_DESC(n) (6 + n) +#define AUDIO_SIZEOF_AC_SELECTOR_UNIT_DESC(bNrInPins) (6 + (bNrInPins)) struct audio_cs_if_as_general_descriptor { uint8_t bLength; @@ -683,7 +683,7 @@ struct audio_cs_if_as_format_type_descriptor { uint8_t tSamFreq[3]; } __PACKED; -#define AUDIO_SIZEOF_FORMAT_TYPE_DESC(n) (8 + 3 * n) +#define AUDIO_SIZEOF_FORMAT_TYPE_DESC(bSamFreqType) (8 + 3 * (bSamFreqType)) struct audio_ep_descriptor { uint8_t bLength; @@ -738,7 +738,7 @@ struct audio_cs_ep_ep_general_descriptor { PP_NARG(__VA_ARGS__), /* bInCollection */ \ __VA_ARGS__ /* baInterfaceNr */ -#define AUDIO_AC_DESCRIPTOR_INIT_LEN(n) (0x08 + 0x09 + 0x08 + n) +#define AUDIO_AC_DESCRIPTOR_LEN(bInCollection) (0x08 + 0x09 + 0x08 + bInCollection) #define AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bNrChannels, wChannelConfig) \ 0x0C, /* bLength */ \ @@ -880,8 +880,8 @@ struct audio_cs_ep_ep_general_descriptor { 0x03, /* bRefresh, 8ms */ \ 0x00 /* bSynchAddress */ -#define AUDIO_AS_DESCRIPTOR_INIT_LEN(n) (0x09 + 0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07) -#define AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT_LEN(n) (0x09 + 0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07 + 0x09) +#define AUDIO_AS_DESCRIPTOR_LEN(bSamFreqType) (0x09 + 0x09 + 0x07 + 0x08 + 3 * (bSamFreqType) + 0x09 + 0x07) +#define AUDIO_AS_FEEDBACK_DESCRIPTOR_LEN(bSamFreqType) (0x09 + 0x09 + 0x07 + 0x08 + 3 * (bSamFreqType) + 0x09 + 0x07 + 0x09) #define AUDIO_AS_ALTSETTING_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval, ...) \ 0x09, /* bLength */ \ @@ -924,9 +924,9 @@ struct audio_cs_ep_ep_general_descriptor { 0x00, /* wLockDelay */ \ 0x00 -#define AUDIO_AS_ALTSETTING_DESCRIPTOR_INIT_LEN(n) (0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07) +#define AUDIO_AS_ALTSETTING_DESCRIPTOR_LEN(bSamFreqType) (0x09 + 0x07 + 0x08 + 3 * (bSamFreqType) + 0x09 + 0x07) -#define AUDIO_AS_ALTSETTING0_DESCRIPTOR_INIT(bInterfaceNumber) \ +#define AUDIO_AS_ALTSETTING0_DESCRIPTOR_INIT(bInterfaceNumber) \ 0x09, /* bLength */ \ USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ bInterfaceNumber, /* bInterfaceNumber */ \ @@ -937,19 +937,6 @@ struct audio_cs_ep_ep_general_descriptor { AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ 0x00 /* iInterface */ -#define AUDIO_MS_STANDARD_DESCRIPTOR_INIT(bInterfaceNumber, bNumEndpoints) \ - 0x09, /* bLength */ \ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ - bInterfaceNumber, /* bInterfaceNumber */ \ - 0x00, /* bAlternateSetting */ \ - bNumEndpoints, /* bNumEndpoints */ \ - USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ - AUDIO_SUBCLASS_MIDISTREAMING, /* bInterfaceSubClass */ \ - AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ - 0x00 /* iInterface */ - -#define AUDIO_MS_STANDARD_DESCRIPTOR_INIT_LEN 0x09 - struct audio_v2_channel_cluster_descriptor { uint8_t bNrChannels; uint32_t bmChannelConfig; @@ -993,7 +980,7 @@ struct audio_v2_cs_if_ac_clock_selector_descriptor { uint8_t iClockSelector; } __PACKED; -#define AUDIO_SIZEOF_AC_CLOCK_SELECTOR_DESC(n) (7 + n) +#define AUDIO_SIZEOF_AC_CLOCK_SELECTOR_DESC(bNrInPins) (7 + (bNrInPins)) struct audio_v2_cs_if_ac_clock_multiplier_descriptor { uint8_t bLength; @@ -1005,7 +992,7 @@ struct audio_v2_cs_if_ac_clock_multiplier_descriptor { uint8_t iClockMultiplier; } __PACKED; -#define AUDIO_SIZEOF_AC_CLOCK_MULTIPLIER_DESC() (7) +#define AUDIO_SIZEOF_AC_CLOCK_MULTIPLIER_DESC (7) struct audio_v2_cs_if_ac_input_terminal_descriptor { uint8_t bLength; @@ -1049,7 +1036,7 @@ struct audio_v2_cs_if_ac_feature_unit_descriptor { uint8_t iFeature; } __PACKED; -#define AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(ch) (6 + (ch + 1) * 4) +#define AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(bNrChannels) (6 + ((bNrChannels) + 1) * 4) struct audio_v2_cs_if_as_general_descriptor { uint8_t bLength; @@ -1124,7 +1111,7 @@ struct audio_v2_control_range3_param_block { WBVAL(wTotalLength), /* wTotalLength */ \ bmControls /* bmControls */ \ -#define AUDIO_V2_AC_DESCRIPTOR_INIT_LEN (0x08 + 0x09 + 0x09) +#define AUDIO_V2_AC_DESCRIPTOR_LEN (0x08 + 0x09 + 0x09) #define AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(bClockID, bmAttributes, bmControls) \ 0x08, /* bLength */ \ @@ -1262,7 +1249,7 @@ struct audio_v2_control_range3_param_block { 0x00, /* wLockDelay */ \ 0x00 -#define AUDIO_V2_AS_ALTSETTING0_DESCRIPTOR_INIT(bInterfaceNumber) \ +#define AUDIO_V2_AS_ALTSETTING0_DESCRIPTOR_INIT(bInterfaceNumber) \ 0x09, /* bLength */ \ USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ bInterfaceNumber, /* bInterfaceNumber */ \ @@ -1331,9 +1318,10 @@ struct audio_v2_control_range3_param_block { // clang-format on -#define AUDIO_V2_AS_DESCRIPTOR_INIT_LEN (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08) -#define AUDIO_V2_AS_ALTSETTING_DESCRIPTOR_INIT_LEN (0x09 + 0x10 + 0x06 + 0x07 + 0x08) -#define AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT_LEN (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08 + 0x07) +#define AUDIO_V2_AS_DESCRIPTOR_LEN (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08) +#define AUDIO_V2_AS_ALTSETTING0_DESCRIPTOR_LEN (0x09) +#define AUDIO_V2_AS_ALTSETTING_DESCRIPTOR_LEN (0x09 + 0x10 + 0x06 + 0x07 + 0x08) +#define AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_LEN (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08 + 0x07) #define AUDIO_SAMPLE_FREQ_NUM(num) (uint8_t)(num), (uint8_t)((num >> 8)) #define AUDIO_SAMPLE_FREQ_3B(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16)) diff --git a/components/drivers/usb/cherryusb/class/cdc/usb_cdc.h b/components/drivers/usb/cherryusb/class/cdc/usb_cdc.h index d1546eec57..6a8e807d3c 100644 --- a/components/drivers/usb/cherryusb/class/cdc/usb_cdc.h +++ b/components/drivers/usb/cherryusb/class/cdc/usb_cdc.h @@ -217,12 +217,12 @@ #define CDC_SERIAL_STATE_BREAK (1 << 2) /* state of break detection */ #define CDC_SERIAL_STATE_BREAK_Pos (2) #define CDC_SERIAL_STATE_BREAK_Msk (1 << CDC_SERIAL_STATE_BREAK_Pos) -#define CDC_SERIAL_STATE_TX_CARRIER (1 << 1) /* state of transmission carrier */ -#define CDC_SERIAL_STATE_TX_CARRIER_Pos (1) -#define CDC_SERIAL_STATE_TX_CARRIER_Msk (1 << CDC_SERIAL_STATE_TX_CARRIER_Pos) -#define CDC_SERIAL_STATE_RX_CARRIER (1 << 0) /* state of receiver carrier */ -#define CDC_SERIAL_STATE_RX_CARRIER_Pos (0) -#define CDC_SERIAL_STATE_RX_CARRIER_Msk (1 << CDC_SERIAL_STATE_RX_CARRIER_Pos) +#define CDC_SERIAL_STATE_DSR (1 << 1) /* state of transmission carrier */ +#define CDC_SERIAL_STATE_DSR_Pos (1) +#define CDC_SERIAL_STATE_DSR_Msk (1 << CDC_SERIAL_STATE_DSR_Pos) +#define CDC_SERIAL_STATE_DCD (1 << 0) /* state of receiver carrier */ +#define CDC_SERIAL_STATE_DCD_Pos (0) +#define CDC_SERIAL_STATE_DCD_Msk (1 << CDC_SERIAL_STATE_DCD_Pos) #define CDC_ECM_XMIT_OK (1 << 0) #define CDC_ECM_RVC_OK (1 << 1) @@ -551,10 +551,9 @@ struct cdc_ncm_ndp16 { #define DBVAL_BE(x) ((x >> 24) & 0xFF), ((x >> 16) & 0xFF), ((x >> 8) & 0xFF), (x & 0xFF) /*Length of template descriptor: 71 bytes*/ -#define CDC_ECM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 13 + 7 + 9 + 7 + 7) +#define CDC_ECM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 13 + 7 + 9 + 7 + 7) // clang-format off -#define CDC_ECM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, \ -eth_statistics, wMaxSegmentSize, wNumberMCFilters, bNumberPowerFilters, str_idx) \ +#define CDC_ECM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, str_idx) \ /* Interface Associate */ \ 0x08, /* bLength */ \ USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ @@ -587,10 +586,10 @@ eth_statistics, wMaxSegmentSize, wNumberMCFilters, bNumberPowerFilters, str_idx) CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */\ CDC_FUNC_DESC_ETHERNET_NETWORKING, /* Ethernet Networking functional descriptor subtype */\ str_idx, /* Device's MAC string index */\ - DBVAL_BE(eth_statistics), /* Ethernet statistics (bitmap) */\ - WBVAL(wMaxSegmentSize),/* wMaxSegmentSize: Ethernet Maximum Segment size, typically 1514 bytes */\ - WBVAL(wNumberMCFilters), /* wNumberMCFilters: the number of multicast filters */\ - bNumberPowerFilters, /* bNumberPowerFilters: the number of wakeup power filters */\ + DBVAL_BE(0x00000000), /* Ethernet statistics (bitmap) */\ + WBVAL(1514), /* wMaxSegmentSize: Ethernet Maximum Segment size, typically 1514 bytes */\ + WBVAL(0), /* wNumberMCFilters: the number of multicast filters */ \ + 0, /* bNumberPowerFilters: the number of wakeup power filters */ \ 0x07, /* bLength */ \ USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */ \ int_ep, /* bEndpointAddress */ \ @@ -621,10 +620,9 @@ eth_statistics, wMaxSegmentSize, wNumberMCFilters, bNumberPowerFilters, str_idx) // clang-format on /*Length of template descriptor: 77 bytes*/ -#define CDC_NCM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 13 + 6 + 7 + 9 + 7 + 7) +#define CDC_NCM_DESCRIPTOR_LEN (8 + 9 + 5 + 5 + 13 + 6 + 7 + 9 + 7 + 7) // clang-format off -#define CDC_NCM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, \ -eth_statistics, wMaxSegmentSize, wNumberMCFilters, bNumberPowerFilters, str_idx) \ +#define CDC_NCM_DESCRIPTOR_INIT(bFirstInterface, int_ep, out_ep, in_ep, wMaxPacketSize, str_idx) \ /* Interface Associate */ \ 0x08, /* bLength */ \ USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ @@ -657,10 +655,10 @@ eth_statistics, wMaxSegmentSize, wNumberMCFilters, bNumberPowerFilters, str_idx) CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */\ CDC_FUNC_DESC_ETHERNET_NETWORKING, /* Ethernet Networking functional descriptor subtype */\ str_idx, /* Device's MAC string index */\ - DBVAL_BE(eth_statistics), /* Ethernet statistics (bitmap) */\ - WBVAL(wMaxPacketSize),/* wMaxSegmentSize: Ethernet Maximum Segment size, typically 1514 bytes */\ - WBVAL(wNumberMCFilters), /* wNumberMCFilters: the number of multicast filters */\ - bNumberPowerFilters, /* bNumberPowerFilters: the number of wakeup power filters */\ + DBVAL_BE(0x00000000), /* Ethernet statistics (bitmap) */\ + WBVAL(1514), /* wMaxSegmentSize: Ethernet Maximum Segment size, typically 1514 bytes */\ + WBVAL(0), /* wNumberMCFilters: the number of multicast filters */ \ + 0, /* bNumberPowerFilters: the number of wakeup power filters */ \ 0x06, \ CDC_CS_INTERFACE, \ CDC_FUNC_DESC_NCM, \ diff --git a/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_acm.c b/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_acm.c deleted file mode 100644 index 2fc54eed6b..0000000000 --- a/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_acm.c +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright (c) 2022, sakumisu - * - * SPDX-License-Identifier: Apache-2.0 - */ -#include "usbh_core.h" -#include "usbh_cdc_acm.h" - -#undef USB_DBG_TAG -#define USB_DBG_TAG "usbh_cdc_acm" -#include "usb_log.h" - -#define DEV_FORMAT "/dev/ttyACM%d" - -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_acm_buf[CONFIG_USBHOST_MAX_CDC_ACM_CLASS][USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; - -static struct usbh_cdc_acm g_cdc_acm_class[CONFIG_USBHOST_MAX_CDC_ACM_CLASS]; -static uint32_t g_devinuse = 0; - -static struct usbh_cdc_acm *usbh_cdc_acm_class_alloc(void) -{ - uint8_t devno; - - for (devno = 0; devno < CONFIG_USBHOST_MAX_CDC_ACM_CLASS; devno++) { - if ((g_devinuse & (1U << devno)) == 0) { - g_devinuse |= (1U << devno); - memset(&g_cdc_acm_class[devno], 0, sizeof(struct usbh_cdc_acm)); - g_cdc_acm_class[devno].minor = devno; - return &g_cdc_acm_class[devno]; - } - } - return NULL; -} - -static void usbh_cdc_acm_class_free(struct usbh_cdc_acm *cdc_acm_class) -{ - uint8_t devno = cdc_acm_class->minor; - - if (devno < 32) { - g_devinuse &= ~(1U << devno); - } - memset(cdc_acm_class, 0, sizeof(struct usbh_cdc_acm)); -} - -int usbh_cdc_acm_set_line_coding(struct usbh_cdc_acm *cdc_acm_class, struct cdc_line_coding *line_coding) -{ - struct usb_setup_packet *setup; - - if (!cdc_acm_class || !cdc_acm_class->hport) { - return -USB_ERR_INVAL; - } - setup = cdc_acm_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CDC_REQUEST_SET_LINE_CODING; - setup->wValue = 0; - setup->wIndex = cdc_acm_class->intf; - setup->wLength = 7; - - memcpy(g_cdc_acm_buf[cdc_acm_class->minor], line_coding, sizeof(struct cdc_line_coding)); - - return usbh_control_transfer(cdc_acm_class->hport, setup, g_cdc_acm_buf[cdc_acm_class->minor]); -} - -int usbh_cdc_acm_get_line_coding(struct usbh_cdc_acm *cdc_acm_class, struct cdc_line_coding *line_coding) -{ - struct usb_setup_packet *setup; - int ret; - - if (!cdc_acm_class || !cdc_acm_class->hport) { - return -USB_ERR_INVAL; - } - setup = cdc_acm_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CDC_REQUEST_GET_LINE_CODING; - setup->wValue = 0; - setup->wIndex = cdc_acm_class->intf; - setup->wLength = 7; - - ret = usbh_control_transfer(cdc_acm_class->hport, setup, g_cdc_acm_buf[cdc_acm_class->minor]); - if (ret < 0) { - return ret; - } - memcpy(line_coding, g_cdc_acm_buf[cdc_acm_class->minor], sizeof(struct cdc_line_coding)); - return ret; -} - -int usbh_cdc_acm_set_line_state(struct usbh_cdc_acm *cdc_acm_class, bool dtr, bool rts) -{ - struct usb_setup_packet *setup; - - if (!cdc_acm_class || !cdc_acm_class->hport) { - return -USB_ERR_INVAL; - } - setup = cdc_acm_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CDC_REQUEST_SET_CONTROL_LINE_STATE; - setup->wValue = (dtr << 0) | (rts << 1); - setup->wIndex = cdc_acm_class->intf; - setup->wLength = 0; - - return usbh_control_transfer(cdc_acm_class->hport, setup, NULL); -} - -static int usbh_cdc_acm_connect(struct usbh_hubport *hport, uint8_t intf) -{ - struct usb_endpoint_descriptor *ep_desc; - int ret = 0; - - struct usbh_cdc_acm *cdc_acm_class = usbh_cdc_acm_class_alloc(); - if (cdc_acm_class == NULL) { - USB_LOG_ERR("Fail to alloc cdc_acm_class\r\n"); - return -USB_ERR_NOMEM; - } - - cdc_acm_class->hport = hport; - cdc_acm_class->intf = intf; - - hport->config.intf[intf].priv = cdc_acm_class; - hport->config.intf[intf + 1].priv = NULL; - -#ifdef CONFIG_USBHOST_CDC_ACM_NOTIFY - ep_desc = &hport->config.intf[intf].altsetting[0].ep[0].ep_desc; - USBH_EP_INIT(cdc_acm_class->intin, ep_desc); -#endif - for (uint8_t i = 0; i < hport->config.intf[intf + 1].altsetting[0].intf_desc.bNumEndpoints; i++) { - ep_desc = &hport->config.intf[intf + 1].altsetting[0].ep[i].ep_desc; - - if (ep_desc->bEndpointAddress & 0x80) { - USBH_EP_INIT(cdc_acm_class->bulkin, ep_desc); - } else { - USBH_EP_INIT(cdc_acm_class->bulkout, ep_desc); - } - } - - snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, cdc_acm_class->minor); - - USB_LOG_INFO("Register CDC ACM Class:%s\r\n", hport->config.intf[intf].devname); - -#if 0 - USB_LOG_INFO("Test cdc acm rx and tx and rx for 5 times, baudrate is 115200\r\n"); - - struct cdc_line_coding linecoding; - uint8_t count = 5; - - linecoding.dwDTERate = 115200; - linecoding.bDataBits = 8; - linecoding.bParityType = 0; - linecoding.bCharFormat = 0; - usbh_cdc_acm_set_line_coding(cdc_acm_class, &linecoding); - usbh_cdc_acm_set_line_state(cdc_acm_class, true, false); - - memset(g_cdc_acm_buf, 'a', sizeof(g_cdc_acm_buf)); - ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, g_cdc_acm_buf, sizeof(g_cdc_acm_buf), 0xfffffff); - USB_LOG_RAW("out ret:%d\r\n", ret); - while (count--) { - ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, g_cdc_acm_buf, sizeof(g_cdc_acm_buf), 0xfffffff); - USB_LOG_RAW("in ret:%d\r\n", ret); - if (ret > 0) { - for (uint32_t i = 0; i < ret; i++) { - USB_LOG_RAW("%02x ", g_cdc_acm_buf[i]); - } - } - USB_LOG_RAW("\r\n"); - } -#endif - - usbh_cdc_acm_run(cdc_acm_class); - return ret; -} - -static int usbh_cdc_acm_disconnect(struct usbh_hubport *hport, uint8_t intf) -{ - int ret = 0; - - struct usbh_cdc_acm *cdc_acm_class = (struct usbh_cdc_acm *)hport->config.intf[intf].priv; - - if (cdc_acm_class) { - if (cdc_acm_class->bulkin) { - usbh_kill_urb(&cdc_acm_class->bulkin_urb); - } - - if (cdc_acm_class->bulkout) { - usbh_kill_urb(&cdc_acm_class->bulkout_urb); - } - -#ifdef CONFIG_USBHOST_CDC_ACM_NOTIFY - if (cdc_acm_class->intin) { - usbh_kill_urb(&cdc_acm_class->intin_urb); - } -#endif - - if (hport->config.intf[intf].devname[0] != '\0') { - usb_osal_thread_schedule_other(); - USB_LOG_INFO("Unregister CDC ACM Class:%s\r\n", hport->config.intf[intf].devname); - usbh_cdc_acm_stop(cdc_acm_class); - } - - usbh_cdc_acm_class_free(cdc_acm_class); - } - - return ret; -} - -int usbh_cdc_acm_bulk_in_transfer(struct usbh_cdc_acm *cdc_acm_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) -{ - int ret; - struct usbh_urb *urb = &cdc_acm_class->bulkin_urb; - - usbh_bulk_urb_fill(urb, cdc_acm_class->hport, cdc_acm_class->bulkin, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; - } - return ret; -} - -int usbh_cdc_acm_bulk_out_transfer(struct usbh_cdc_acm *cdc_acm_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) -{ - int ret; - struct usbh_urb *urb = &cdc_acm_class->bulkout_urb; - - usbh_bulk_urb_fill(urb, cdc_acm_class->hport, cdc_acm_class->bulkout, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; - } - return ret; -} - -static int usbh_cdc_data_connect(struct usbh_hubport *hport, uint8_t intf) -{ - (void)hport; - (void)intf; - return 0; -} - -static int usbh_cdc_data_disconnect(struct usbh_hubport *hport, uint8_t intf) -{ - (void)hport; - (void)intf; - return 0; -} - -__WEAK void usbh_cdc_acm_run(struct usbh_cdc_acm *cdc_acm_class) -{ - (void)cdc_acm_class; -} - -__WEAK void usbh_cdc_acm_stop(struct usbh_cdc_acm *cdc_acm_class) -{ - (void)cdc_acm_class; -} - -const struct usbh_class_driver cdc_acm_class_driver = { - .driver_name = "cdc_acm", - .connect = usbh_cdc_acm_connect, - .disconnect = usbh_cdc_acm_disconnect -}; - -const struct usbh_class_driver cdc_data_class_driver = { - .driver_name = "cdc_data", - .connect = usbh_cdc_data_connect, - .disconnect = usbh_cdc_data_disconnect -}; - -CLASS_INFO_DEFINE const struct usbh_class_info cdc_acm_class_info = { - .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS, - .bInterfaceClass = USB_DEVICE_CLASS_CDC, - .bInterfaceSubClass = CDC_ABSTRACT_CONTROL_MODEL, - .bInterfaceProtocol = 0x00, - .id_table = NULL, - .class_driver = &cdc_acm_class_driver -}; - -CLASS_INFO_DEFINE const struct usbh_class_info cdc_data_class_info = { - .match_flags = USB_CLASS_MATCH_INTF_CLASS, - .bInterfaceClass = USB_DEVICE_CLASS_CDC_DATA, - .bInterfaceSubClass = 0x00, - .bInterfaceProtocol = 0x00, - .id_table = NULL, - .class_driver = &cdc_data_class_driver -}; diff --git a/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_acm.h b/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_acm.h deleted file mode 100644 index 80800bf9f2..0000000000 --- a/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_acm.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2022, sakumisu - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef USBH_CDC_ACM_H -#define USBH_CDC_ACM_H - -#include "usb_cdc.h" - -struct usbh_cdc_acm { - struct usbh_hubport *hport; - struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ - struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ -#ifdef CONFIG_USBHOST_CDC_ACM_NOTIFY - struct usb_endpoint_descriptor *intin; /* INTR IN endpoint (optional) */ -#endif - struct usbh_urb bulkout_urb; - struct usbh_urb bulkin_urb; -#ifdef CONFIG_USBHOST_CDC_ACM_NOTIFY - struct usbh_urb intin_urb; -#endif - - struct cdc_line_coding linecoding; - - uint8_t intf; - uint8_t minor; - - void *user_data; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -int usbh_cdc_acm_set_line_coding(struct usbh_cdc_acm *cdc_acm_class, struct cdc_line_coding *line_coding); -int usbh_cdc_acm_get_line_coding(struct usbh_cdc_acm *cdc_acm_class, struct cdc_line_coding *line_coding); -int usbh_cdc_acm_set_line_state(struct usbh_cdc_acm *cdc_acm_class, bool dtr, bool rts); - -int usbh_cdc_acm_bulk_in_transfer(struct usbh_cdc_acm *cdc_acm_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); -int usbh_cdc_acm_bulk_out_transfer(struct usbh_cdc_acm *cdc_acm_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); - -void usbh_cdc_acm_run(struct usbh_cdc_acm *cdc_acm_class); -void usbh_cdc_acm_stop(struct usbh_cdc_acm *cdc_acm_class); - -#ifdef __cplusplus -} -#endif - -#endif /* USBH_CDC_ACM_H */ diff --git a/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ecm.c b/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ecm.c index 73eaa430e9..0c64ff11bd 100644 --- a/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ecm.c +++ b/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ecm.c @@ -306,16 +306,6 @@ int usbh_cdc_ecm_eth_output(uint32_t buflen) return usbh_submit_urb(&g_cdc_ecm_class.bulkout_urb); } -__WEAK void usbh_cdc_ecm_run(struct usbh_cdc_ecm *cdc_ecm_class) -{ - (void)cdc_ecm_class; -} - -__WEAK void usbh_cdc_ecm_stop(struct usbh_cdc_ecm *cdc_ecm_class) -{ - (void)cdc_ecm_class; -} - const struct usbh_class_driver cdc_ecm_class_driver = { .driver_name = "cdc_ecm", .connect = usbh_cdc_ecm_connect, diff --git a/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ncm.c b/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ncm.c index 2ee6e4cece..fa2ccc0cc8 100644 --- a/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ncm.c +++ b/components/drivers/usb/cherryusb/class/cdc/usbh_cdc_ncm.c @@ -386,16 +386,6 @@ int usbh_cdc_ncm_eth_output(uint32_t buflen) return usbh_submit_urb(&g_cdc_ncm_class.bulkout_urb); } -__WEAK void usbh_cdc_ncm_run(struct usbh_cdc_ncm *cdc_ncm_class) -{ - (void)cdc_ncm_class; -} - -__WEAK void usbh_cdc_ncm_stop(struct usbh_cdc_ncm *cdc_ncm_class) -{ - (void)cdc_ncm_class; -} - const struct usbh_class_driver cdc_ncm_class_driver = { .driver_name = "cdc_ncm", .connect = usbh_cdc_ncm_connect, diff --git a/components/drivers/usb/cherryusb/class/dfu/usbd_dfu.c b/components/drivers/usb/cherryusb/class/dfu/usbd_dfu.c index a870aee3a9..2da382884b 100644 --- a/components/drivers/usb/cherryusb/class/dfu/usbd_dfu.c +++ b/components/drivers/usb/cherryusb/class/dfu/usbd_dfu.c @@ -106,7 +106,6 @@ static void dfu_request_upload(struct usb_setup_packet *setup, uint8_t **data, u { struct usb_setup_packet *req = setup; uint32_t addr; - uint8_t *phaddr; /* Data setup request */ if (req->wLength > 0U) { if ((g_usbd_dfu.dev_state == DFU_STATE_DFU_IDLE) || (g_usbd_dfu.dev_state == DFU_STATE_DFU_UPLOAD_IDLE)) { @@ -143,7 +142,7 @@ static void dfu_request_upload(struct usb_setup_packet *setup, uint8_t **data, u addr = ((g_usbd_dfu.wblock_num - 2U) * USBD_DFU_XFER_SIZE) + g_usbd_dfu.data_ptr; /* Return the physical address where data are stored */ - phaddr = dfu_read_flash((uint8_t *)addr, g_usbd_dfu.buffer.d8, g_usbd_dfu.wlength); + dfu_read_flash((uint8_t *)addr, g_usbd_dfu.buffer.d8, g_usbd_dfu.wlength); /* Send the status data over EP0 */ memcpy(*data, g_usbd_dfu.buffer.d8, g_usbd_dfu.wlength); diff --git a/components/drivers/usb/cherryusb/class/gamepad/usb_gamepad.h b/components/drivers/usb/cherryusb/class/gamepad/usb_gamepad.h new file mode 100644 index 0000000000..28e2e6465d --- /dev/null +++ b/components/drivers/usb/cherryusb/class/gamepad/usb_gamepad.h @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2026, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_GAMEPAD_H +#define USB_GAMEPAD_H + +#include "usb_hid.h" + +/* + * GAMEPAD BUTTON LAYOUT + * + * ____________________________ __ + * / [__L2__] [__R2__] \ | + * / [__ L1 __] [__ R1 __] \ | Triggers + * __/________________________________\__ __| + * / _ \ | + * / /\ __ (B4) \ | + * / || __ |A1| __ _ _ \ | Main Pad + * | <===DP===> |S1| |S2| (B3) -|- (B2)| | + * \ || ¯¯ ¯¯ _ / | + * /\ \/ / \ / \ (B1) /\ __| + * / \________ | LS | ____ | RS | _______/ \ | + * | / \ \___/ / \ \___/ / \ | | Sticks + * | / \_____/ \_____/ \ | __| + * | / L3 R3 \ | + * \_____/ \_____/ + * + * |________|______| |______|___________| + * D-Pad Left Right Face + * Stick Stick Buttons + * + * Extended: A2=Touchpad/Capture A3=Mute L4/R4=Paddles + */ + +// W3C Gamepad API standard button order +// Bit position = W3C button index (trivial conversion: 1 << index) +// +// Gamepad XInput Switch PS3/4/5 DInput +// ------ ------ ------ ------- ------ + +// Face buttons (right cluster) +#define USB_GAMEPAD_BUTTON_B1 (1 << 0) // A B Cross 2 +#define USB_GAMEPAD_BUTTON_B2 (1 << 1) // B A Circle 3 +#define USB_GAMEPAD_BUTTON_B3 (1 << 2) // X Y Square 1 +#define USB_GAMEPAD_BUTTON_B4 (1 << 3) // Y X Triangle 4 + +// Shoulder buttons +#define USB_GAMEPAD_BUTTON_L1 (1 << 4) // LB L L1 5 +#define USB_GAMEPAD_BUTTON_R1 (1 << 5) // RB R R1 6 +#define USB_GAMEPAD_BUTTON_L2 (1 << 6) // LT ZL L2 7 +#define USB_GAMEPAD_BUTTON_R2 (1 << 7) // RT ZR R2 8 + +// Center cluster +#define USB_GAMEPAD_BUTTON_S1 (1 << 8) // Back - Select 9 +#define USB_GAMEPAD_BUTTON_S2 (1 << 9) // Start + Start 10 + +// Stick clicks +#define USB_GAMEPAD_BUTTON_L3 (1 << 10) // LS LS L3 11 +#define USB_GAMEPAD_BUTTON_R3 (1 << 11) // RS RS R3 12 + +// D-pad +#define USB_GAMEPAD_BUTTON_DU (1 << 12) // D-Up D-Up D-Up Hat +#define USB_GAMEPAD_BUTTON_DD (1 << 13) // D-Down D-Down D-Down Hat +#define USB_GAMEPAD_BUTTON_DL (1 << 14) // D-Left D-Left D-Left Hat +#define USB_GAMEPAD_BUTTON_DR (1 << 15) // D-Right D-Right D-Right Hat + +// Auxiliary +#define USB_GAMEPAD_BUTTON_A1 (1 << 16) // Guide Home PS 13 +#define USB_GAMEPAD_BUTTON_A2 (1 << 17) // - Capture Touchpad 14 +#define USB_GAMEPAD_BUTTON_A3 (1 << 18) // - - Mute - +#define USB_GAMEPAD_BUTTON_A4 (1 << 19) // - - - - + +// Paddles (extended) +#define USB_GAMEPAD_BUTTON_L4 (1 << 20) // P1 - - - +#define USB_GAMEPAD_BUTTON_R4 (1 << 21) // P2 - - - + +#define XINPUT_VID 0x045E // Microsoft +#define XINPUT_PID 0x028E // Xbox 360 Controller +#define XINPUT_BCD_DEVICE 0x0114 // v1.14 + +/* XInput (Xbox 360) USB */ + +// XInput Interface Class/Subclass/Protocol +#define XINPUT_INTERFACE_CLASS 0xFF +#define XINPUT_INTERFACE_SUBCLASS 0x5D +#define XINPUT_INTERFACE_PROTOCOL 0x01 + +#define XINPUT_BUTTON_MASK_UP (1U << 0) +#define XINPUT_BUTTON_MASK_DOWN (1U << 1) +#define XINPUT_BUTTON_MASK_LEFT (1U << 2) +#define XINPUT_BUTTON_MASK_RIGHT (1U << 3) +#define XINPUT_BUTTON_MASK_START (1U << 4) +#define XINPUT_BUTTON_MASK_BACK (1U << 5) +#define XINPUT_BUTTON_MASK_L3 (1U << 6) +#define XINPUT_BUTTON_MASK_R3 (1U << 7) +#define XINPUT_BUTTON_MASK_LB (1U << 8) +#define XINPUT_BUTTON_MASK_RB (1U << 9) +#define XINPUT_BUTTON_MASK_GUIDE (1U << 10) +//#define XINPUT_BUTTON_MASK_UNUSED (1U << 11) +#define XINPUT_BUTTON_MASK_A (1U << 12) +#define XINPUT_BUTTON_MASK_B (1U << 13) +#define XINPUT_BUTTON_MASK_X (1U << 14) +#define XINPUT_BUTTON_MASK_Y (1U << 15) + +// LED patterns for report_id 0x01 +#define XINPUT_LED_OFF 0x00 +#define XINPUT_LED_BLINK 0x01 +#define XINPUT_LED_FLASH_1 0x02 +#define XINPUT_LED_FLASH_2 0x03 +#define XINPUT_LED_FLASH_3 0x04 +#define XINPUT_LED_FLASH_4 0x05 +#define XINPUT_LED_ON_1 0x06 +#define XINPUT_LED_ON_2 0x07 +#define XINPUT_LED_ON_3 0x08 +#define XINPUT_LED_ON_4 0x09 +#define XINPUT_LED_ROTATE 0x0A +#define XINPUT_LED_BLINK_SLOW 0x0B +#define XINPUT_LED_BLINK_SLOW_1 0x0C +#define XINPUT_LED_BLINK_SLOW_2 0x0D + +struct xinput_in_report { + uint8_t report_id; /* Always 0x00 */ + uint8_t report_size; /* Always 0x14 (20) */ + uint16_t buttons; /* DPAD, Start, Back, L3, R3, LB, RB, Guide, A, B, X, Y */ + uint8_t lt; /* Left trigger (0-255) */ + uint8_t rt; /* Right trigger (0-255) */ + int16_t lx; /* Left stick X (-32768 to 32767) */ + int16_t ly; /* Left stick Y (-32768 to 32767) */ + int16_t rx; /* Right stick X (-32768 to 32767) */ + int16_t ry; /* Right stick Y (-32768 to 32767) */ + uint8_t reserved[6]; /* Reserved/padding */ +} __PACKED; + +struct xinput_out_report { + uint8_t report_id; // 0x00 = rumble, 0x01 = LED + uint8_t report_size; // 0x08 + uint8_t led; // LED pattern (0x00 for rumble) + uint8_t rumble_l; // Left motor (large, 0-255) + uint8_t rumble_r; // Right motor (small, 0-255) + uint8_t reserved[3]; // Padding +} __PACKED; + +// clang-format off +#define XINPUT_DESCRIPTOR_LEN (9 + 16 + 7 + 7) + +#define XINPUT_DESCRIPTOR_INIT(bInterfaceNumber, out_ep, in_ep) \ + USB_INTERFACE_DESCRIPTOR_INIT(bInterfaceNumber, 0x00, 0x02, 0xff, 0x5d, 0x01, 0x00), /* XInput proprietary descriptor (0x21) */ \ + 16, 0x21, 0x00, 0x01, 0x01, 0x24, in_ep, 0x14, 0x03, 0x00, 0x03, 0x13, out_ep, 0x00, 0x03, 0x00, \ + USB_ENDPOINT_DESCRIPTOR_INIT(in_ep, 0x03, 32, 0x01), \ + USB_ENDPOINT_DESCRIPTOR_INIT(out_ep, 0x03, 32, 0x08) +// clang-format on + +#define SWITCH_VID 0x0F0D // 0x057E Nintendo Pro Controller +#define SWITCH_PID 0x0092 // 0x2009 +#define SWITCH_BCD_DEVICE 0x0100 // v1.00 + +// Button masks (16-bit) +#define SWITCH_MASK_Y (1U << 0) +#define SWITCH_MASK_B (1U << 1) +#define SWITCH_MASK_A (1U << 2) +#define SWITCH_MASK_X (1U << 3) +#define SWITCH_MASK_L (1U << 4) +#define SWITCH_MASK_R (1U << 5) +#define SWITCH_MASK_ZL (1U << 6) +#define SWITCH_MASK_ZR (1U << 7) +#define SWITCH_MASK_MINUS (1U << 8) +#define SWITCH_MASK_PLUS (1U << 9) +#define SWITCH_MASK_L3 (1U << 10) +#define SWITCH_MASK_R3 (1U << 11) +#define SWITCH_MASK_HOME (1U << 12) +#define SWITCH_MASK_CAPTURE (1U << 13) + +// D-pad / Hat switch values +#define SWITCH_HAT_UP 0x00 +#define SWITCH_HAT_UP_RIGHT 0x01 +#define SWITCH_HAT_RIGHT 0x02 +#define SWITCH_HAT_DOWN_RIGHT 0x03 +#define SWITCH_HAT_DOWN 0x04 +#define SWITCH_HAT_DOWN_LEFT 0x05 +#define SWITCH_HAT_LEFT 0x06 +#define SWITCH_HAT_UP_LEFT 0x07 +#define SWITCH_HAT_CENTER 0x08 + +// Analog stick range +#define SWITCH_JOYSTICK_MIN 0x00 +#define SWITCH_JOYSTICK_MID 0x80 +#define SWITCH_JOYSTICK_MAX 0xFF + +struct switch_in_report { + uint16_t buttons; // 16 button bits + uint8_t hat; // D-pad (hat switch, 0-8) + uint8_t lx; // Left stick X (0-255, 128 = center) + uint8_t ly; // Left stick Y (0-255, 128 = center) + uint8_t rx; // Right stick X (0-255, 128 = center) + uint8_t ry; // Right stick Y (0-255, 128 = center) + uint8_t vendor; // Vendor-specific byte +} __PACKED; + +struct switch_out_report { + uint8_t data[8]; // Vendor-specific rumble data +} __PACKED; + +#define HID_SWITCH_REPORT_DESC_SIZE 86 + +// clang-format off +#define SWITCH_DESCRIPTOR_LEN HID_CUSTOM_INOUT_DESCRIPTOR_LEN + +#define SWITCH_DESCRIPTOR_INIT(bInterfaceNumber, out_ep, in_ep) \ + HID_CUSTOM_INOUT_DESCRIPTOR_INIT(bInterfaceNumber, 0x00, HID_SWITCH_REPORT_DESC_SIZE, out_ep, in_ep, 64, 0x01) +// clang-format on + +struct usb_gamepad_report { + uint32_t buttons; + uint8_t lt; + uint8_t rt; + uint8_t lx; + uint8_t ly; + uint8_t rx; + uint8_t ry; +}; + +#endif /* USB_GAMEPAD_H */ \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/class/gamepad/usbd_gamepad.c b/components/drivers/usb/cherryusb/class/gamepad/usbd_gamepad.c new file mode 100644 index 0000000000..8ffbfda8a3 --- /dev/null +++ b/components/drivers/usb/cherryusb/class/gamepad/usbd_gamepad.c @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2026, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_hid.h" +#include "usbd_gamepad.h" + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t gamepad_report_buffer[64]; + +static int xinput_vendor_class_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) +{ + struct xinput_in_report xinput_report; + + memset(&xinput_report, 0, sizeof(xinput_report)); + xinput_report.report_size = 20; + + memcpy(*data, &xinput_report, sizeof(xinput_report)); + *len = sizeof(xinput_report); + return 0; +} + +int usbd_gamepad_xinput_send_report(uint8_t ep, struct usb_gamepad_report *report) +{ + struct xinput_in_report *xinput_report; + + xinput_report = (struct xinput_in_report *)gamepad_report_buffer; + memset(xinput_report, 0, sizeof(xinput_report)); + xinput_report->report_size = 20; + + if (report->buttons & USB_GAMEPAD_BUTTON_DU) + xinput_report->buttons |= XINPUT_BUTTON_MASK_UP; + if (report->buttons & USB_GAMEPAD_BUTTON_DD) + xinput_report->buttons |= XINPUT_BUTTON_MASK_DOWN; + if (report->buttons & USB_GAMEPAD_BUTTON_DL) + xinput_report->buttons |= XINPUT_BUTTON_MASK_LEFT; + if (report->buttons & USB_GAMEPAD_BUTTON_DR) + xinput_report->buttons |= XINPUT_BUTTON_MASK_RIGHT; + if (report->buttons & USB_GAMEPAD_BUTTON_S2) + xinput_report->buttons |= XINPUT_BUTTON_MASK_START; + if (report->buttons & USB_GAMEPAD_BUTTON_S1) + xinput_report->buttons |= XINPUT_BUTTON_MASK_BACK; + if (report->buttons & USB_GAMEPAD_BUTTON_L3) + xinput_report->buttons |= XINPUT_BUTTON_MASK_L3; + if (report->buttons & USB_GAMEPAD_BUTTON_R3) + xinput_report->buttons |= XINPUT_BUTTON_MASK_R3; + if (report->buttons & USB_GAMEPAD_BUTTON_L1) + xinput_report->buttons |= XINPUT_BUTTON_MASK_LB; + if (report->buttons & USB_GAMEPAD_BUTTON_R1) + xinput_report->buttons |= XINPUT_BUTTON_MASK_RB; + if (report->buttons & USB_GAMEPAD_BUTTON_A1) + xinput_report->buttons |= XINPUT_BUTTON_MASK_GUIDE; + if (report->buttons & USB_GAMEPAD_BUTTON_B1) + xinput_report->buttons |= XINPUT_BUTTON_MASK_A; + if (report->buttons & USB_GAMEPAD_BUTTON_B2) + xinput_report->buttons |= XINPUT_BUTTON_MASK_B; + if (report->buttons & USB_GAMEPAD_BUTTON_B3) + xinput_report->buttons |= XINPUT_BUTTON_MASK_X; + if (report->buttons & USB_GAMEPAD_BUTTON_B4) + xinput_report->buttons |= XINPUT_BUTTON_MASK_Y; + + // Analog triggers (0-255), fall back to digital if analog is 0 but button pressed + xinput_report->lt = report->lt; + xinput_report->rt = report->rt; + if (xinput_report->lt == 0 && (report->buttons & USB_GAMEPAD_BUTTON_L2)) + xinput_report->lt = 0xFF; + if (xinput_report->rt == 0 && (report->buttons & USB_GAMEPAD_BUTTON_R2)) + xinput_report->rt = 0xFF; + + return usbd_ep_start_write(0, ep, gamepad_report_buffer, sizeof(struct xinput_in_report)); +} + +// Convert gamepad dpad mask to switch hat value +static uint8_t convert_dpad_to_switch_hat(uint32_t buttons) +{ + // Joypad uses active-high (1 = pressed) + uint8_t up = (buttons & USB_GAMEPAD_BUTTON_DU) ? 1 : 0; + uint8_t down = (buttons & USB_GAMEPAD_BUTTON_DD) ? 1 : 0; + uint8_t left = (buttons & USB_GAMEPAD_BUTTON_DL) ? 1 : 0; + uint8_t right = (buttons & USB_GAMEPAD_BUTTON_DR) ? 1 : 0; + + if (up && right) + return SWITCH_HAT_UP_RIGHT; + if (up && left) + return SWITCH_HAT_UP_LEFT; + if (down && right) + return SWITCH_HAT_DOWN_RIGHT; + if (down && left) + return SWITCH_HAT_DOWN_LEFT; + if (up) + return SWITCH_HAT_UP; + if (down) + return SWITCH_HAT_DOWN; + if (left) + return SWITCH_HAT_LEFT; + if (right) + return SWITCH_HAT_RIGHT; + + return SWITCH_HAT_CENTER; +} + +int usbd_gamepad_switch_send_report(uint8_t ep, struct usb_gamepad_report *report) +{ + struct switch_in_report *switch_report; + + switch_report = (struct switch_in_report *)gamepad_report_buffer; + memset(switch_report, 0, sizeof(switch_report)); + + if (report->buttons & USB_GAMEPAD_BUTTON_S1) + switch_report->buttons |= SWITCH_MASK_MINUS; + if (report->buttons & USB_GAMEPAD_BUTTON_S2) + switch_report->buttons |= SWITCH_MASK_PLUS; + if (report->buttons & USB_GAMEPAD_BUTTON_L1) + switch_report->buttons |= SWITCH_MASK_L; + if (report->buttons & USB_GAMEPAD_BUTTON_R1) + switch_report->buttons |= SWITCH_MASK_R; + if (report->buttons & USB_GAMEPAD_BUTTON_L2) + switch_report->buttons |= SWITCH_MASK_ZL; + if (report->buttons & USB_GAMEPAD_BUTTON_R2) + switch_report->buttons |= SWITCH_MASK_ZR; + if (report->buttons & USB_GAMEPAD_BUTTON_L3) + switch_report->buttons |= SWITCH_MASK_L3; + if (report->buttons & USB_GAMEPAD_BUTTON_R3) + switch_report->buttons |= SWITCH_MASK_R3; + if (report->buttons & USB_GAMEPAD_BUTTON_A1) + switch_report->buttons |= SWITCH_MASK_HOME; + if (report->buttons & USB_GAMEPAD_BUTTON_A2) + switch_report->buttons |= SWITCH_MASK_CAPTURE; + if (report->buttons & USB_GAMEPAD_BUTTON_B1) + switch_report->buttons |= SWITCH_MASK_B; + if (report->buttons & USB_GAMEPAD_BUTTON_B2) + switch_report->buttons |= SWITCH_MASK_A; + if (report->buttons & USB_GAMEPAD_BUTTON_B3) + switch_report->buttons |= SWITCH_MASK_Y; + if (report->buttons & USB_GAMEPAD_BUTTON_B4) + switch_report->buttons |= SWITCH_MASK_X; + + switch_report->hat = convert_dpad_to_switch_hat(report->buttons); + + // Analog sticks (HID convention: 0=up, 255=down - no inversion needed) + switch_report->lx = report->lx; + switch_report->ly = report->ly; + switch_report->rx = report->rx; + switch_report->ry = report->ry; + + switch_report->vendor = 0; + + return usbd_ep_start_write(0, ep, gamepad_report_buffer, sizeof(struct switch_in_report)); +} + +struct usbd_interface *usbd_gamepad_xinput_init_intf(struct usbd_interface *intf) +{ + intf->class_interface_handler = NULL; + intf->class_endpoint_handler = NULL; + intf->vendor_handler = xinput_vendor_class_request_handler; + intf->notify_handler = NULL; + + return intf; +} + +static const uint8_t hid_switch_report_desc[HID_SWITCH_REPORT_DESC_SIZE] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x05, // Usage (Game Pad) + 0xA1, 0x01, // Collection (Application) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x01, // Physical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x10, // Report Count (16) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (Button 1) + 0x29, 0x10, // Usage Maximum (Button 16) + 0x81, 0x02, // Input (Data,Var,Abs) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x25, 0x07, // Logical Maximum (7) + 0x46, 0x3B, 0x01, // Physical Maximum (315) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x65, 0x14, // Unit (Eng Rot:Angular Pos) + 0x09, 0x39, // Usage (Hat switch) + 0x81, 0x42, // Input (Data,Var,Abs,Null) + 0x65, 0x00, // Unit (None) + 0x95, 0x01, // Report Count (1) + 0x81, 0x01, // Input (Const) - 4-bit padding + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x46, 0xFF, 0x00, // Physical Maximum (255) + 0x09, 0x30, // Usage (X) - Left Stick X + 0x09, 0x31, // Usage (Y) - Left Stick Y + 0x09, 0x32, // Usage (Z) - Right Stick X + 0x09, 0x35, // Usage (Rz) - Right Stick Y + 0x75, 0x08, // Report Size (8) + 0x95, 0x04, // Report Count (4) + 0x81, 0x02, // Input (Data,Var,Abs) + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined) + 0x09, 0x20, // Usage (0x20) + 0x95, 0x01, // Report Count (1) + 0x81, 0x02, // Input (Data,Var,Abs) - Vendor byte + 0x0A, 0x21, 0x26, // Usage (0x2621) + 0x95, 0x08, // Report Count (8) + 0x91, 0x02, // Output (Data,Var,Abs) - Rumble + 0xC0, // End Collection +}; + +struct usbd_interface *usbd_gamepad_switch_init_intf(struct usbd_interface *intf) +{ + return usbd_hid_init_intf(0, intf, hid_switch_report_desc, HID_SWITCH_REPORT_DESC_SIZE); +} \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/class/gamepad/usbd_gamepad.h b/components/drivers/usb/cherryusb/class/gamepad/usbd_gamepad.h new file mode 100644 index 0000000000..8f4f20a833 --- /dev/null +++ b/components/drivers/usb/cherryusb/class/gamepad/usbd_gamepad.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2026, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBD_GAMEPAD_H +#define USBD_GAMEPAD_H + +#include "usb_gamepad.h" + +#define USBD_GAMEPAD_MODE_XINPUT 0 +#define USBD_GAMEPAD_MODE_SWITCH 1 +#define USBD_GAMEPAD_MODE_XBOXONE 2 +#define USBD_GAMEPAD_MODE_PS4 3 + +struct usbd_interface *usbd_gamepad_xinput_init_intf(struct usbd_interface *intf); +struct usbd_interface *usbd_gamepad_switch_init_intf(struct usbd_interface *intf); + +int usbd_gamepad_xinput_send_report(uint8_t ep, struct usb_gamepad_report *report); +int usbd_gamepad_switch_send_report(uint8_t ep, struct usb_gamepad_report *report); + +#endif /* USBD_GAMEPAD_H */ \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/class/hid/usb_hid.h b/components/drivers/usb/cherryusb/class/hid/usb_hid.h index ea6c0f2556..b2bd571330 100644 --- a/components/drivers/usb/cherryusb/class/hid/usb_hid.h +++ b/components/drivers/usb/cherryusb/class/hid/usb_hid.h @@ -35,7 +35,7 @@ #define HID_REPORT_OUTPUT 0x02 #define HID_REPORT_FEATURE 0x03 -/* HID Descriptor ***********************************************************/ +/* HID Descriptor */ #define HID_COUNTRY_NONE 0x00 /* Not Supported */ #define HID_COUNTRY_ARABIC 0x01 /* Arabic */ @@ -74,99 +74,114 @@ #define HID_COUNTRY_YUGOSLAVIA 0x34 /* Yugoslavia */ #define HID_COUNTRY_TURKISHF 0x35 /* Turkish-F */ -/* HID report items */ -#define HID_REPORT_ITEM_SIZE_MASK 0x03 -#define HID_REPORT_ITEM_SIZE_0 0x00 /* No data follows */ -#define HID_REPORT_ITEM_SIZE_1 0x01 /* 1 byte of data follows */ -#define HID_REPORT_ITEM_SIZE_2 0x02 /* 2 bytes of data follow */ -#define HID_REPORT_ITEM_SIZE_4 0x03 /* 4 bytes of data follow */ -#define HID_REPORT_ITEM_TYPE_MASK 0x0c -#define HID_REPORT_ITEM_TYPE_MAIN 0x00 -#define HID_REPORT_ITEM_TYPE_GLOBAL 0x04 -#define HID_REPORT_ITEM_TYPE_LOCAL 0x08 -#define HID_REPORT_ITEM_TAG_MASK 0xf0 +/* HID report See specification at + * https://www.usb.org/sites/default/files/hid1_11.pdf + * https://www.usb.org/sites/default/files/hut1_22.pdf + */ + +#define HID_SIZE_MASK (0x3 << 0) +#define HID_TYPE_MASK (0x3 << 2) +#define HID_TAG_MASK (0xF << 4) + +#define HID_ITEMTYPE_MAIN (0x0 << 2) +#define HID_ITEMTYPE_GLOBAL (0x1 << 2) +#define HID_ITEMTYPE_LOCAL (0x2 << 2) +#define HID_ITEMTYPE_LONG (0x3 << 2) /* Main Items (HID 6.2.2.4) */ -#define HID_MAIN_ITEM_CONSTANT (1 << 0) /* Constant(1) vs Data(0) */ -#define HID_MAIN_ITEM_VARIABLE (1 << 1) /* Variable(1) vs Array(0) */ -#define HID_MAIN_ITEM_RELATIVE (1 << 2) /* Relative(1) vs Absolute(0) */ -#define HID_MAIN_ITEM_WRAP (1 << 3) /* Wrap(1) vs No Wrap(0) */ -#define HID_MAIN_ITEM_NONLINEAR (1 << 4) /* Non Linear(1) vs Linear(0) */ -#define HID_MAIN_ITEM_NOPREFERRED (1 << 5) /* No Preferred (1) vs Preferred State(0) */ -#define HID_MAIN_ITEM_NULLSTATE (1 << 6) /* Null state(1) vs No Null position(0) */ -#define HID_MAIN_ITEM_VOLATILE (1 << 7) /* Volatile(1) vs Non volatile(0) */ -#define HID_MAIN_ITEM_BUFFEREDBYTES (1 << 8) /* Buffered Bytes(1) vs Bit Field(0) */ - -#define HID_MAIN_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK) -#define HID_MAIN_ITEM_INPUT_PREFIX 0x80 -#define HID_MAIN_ITEM_INPUT_CONSTANT HID_MAIN_ITEM_CONSTANT -#define HID_MAIN_ITEM_INPUT_VARIABLE HID_MAIN_ITEM_VARIABLE -#define HID_MAIN_ITEM_INPUT_RELATIVE HID_MAIN_ITEM_RELATIVE -#define HID_MAIN_ITEM_INPUT_WRAP HID_MAIN_ITEM_WRAP -#define HID_MAIN_ITEM_INPUT_NONLINEAR HID_MAIN_ITEM_NONLINEAR -#define HID_MAIN_ITEM_INPUT_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED -#define HID_MAIN_ITEM_INPUT_NULLSTATE HID_MAIN_ITEM_NULLSTATE -#define HID_MAIN_ITEM_INPUT_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES - -#define HID_MAIN_ITEM_OUTPUT_PREFIX 0x90 -#define HID_MAIN_ITEM_OUTPUT_CONSTANT HID_MAIN_ITEM_CONSTANT -#define HID_MAIN_ITEM_OUTPUT_VARIABLE HID_MAIN_ITEM_VARIABLE -#define HID_MAIN_ITEM_OUTPUT_RELATIVE HID_MAIN_ITEM_RELATIVE -#define HID_MAIN_ITEM_OUTPUT_WRAP HID_MAIN_ITEM_WRAP -#define HID_MAIN_ITEM_OUTPUT_NONLINEAR HID_MAIN_ITEM_NONLINEAR -#define HID_MAIN_ITEM_OUTPUT_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED -#define HID_MAIN_ITEM_OUTPUT_NULLSTATE HID_MAIN_ITEM_NULLSTATE -#define HID_MAIN_ITEM_OUTPUT_VOLATILE HID_MAIN_ITEM_VOLATILE -#define HID_MAIN_ITEM_OUTPUT_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES - -#define HID_MAIN_ITEM_FEATURE_PREFIX 0xb0 -#define HID_MAIN_ITEM_FEATURE_CONSTANT HID_MAIN_ITEM_CONSTANT -#define HID_MAIN_ITEM_FEATURE_VARIABLE HID_MAIN_ITEM_VARIABLE -#define HID_MAIN_ITEM_FEATURE_RELATIVE HID_MAIN_ITEM_RELATIVE -#define HID_MAIN_ITEM_FEATURE_WRAP HID_MAIN_ITEM_WRAP -#define HID_MAIN_ITEM_FEATURE_NONLINEAR HID_MAIN_ITEM_NONLINEAR -#define HID_MAIN_ITEM_FEATURE_NOPREFERRED HID_MAIN_ITEM_NOPREFERRED -#define HID_MAIN_ITEM_FEATURE_NULLSTATE HID_MAIN_ITEM_NULLSTATE -#define HID_MAIN_ITEM_FEATURE_VOLATILE HID_MAIN_ITEM_VOLATILE -#define HID_MAIN_ITEM_FEATURE_BUFFEREDBYTES HID_MAIN_ITEM_BUFFEREDBYTES - -#define HID_MAIN_ITEM_COLLECTION_PREFIX 0xa0 -#define HID_MAIN_ITEM_COLLECTION_PHYSICAL 0x00 /* Physical (group of axes) */ -#define HID_MAIN_ITEM_COLLECTION_APPL 0x01 /* Application (mouse, keyboard) */ -#define HID_MAIN_ITEM_COLLECTION_LOGICAL 0x02 /* Logical (interrelated data) */ -#define HID_MAIN_ITEM_COLLECTION_REPORT 0x03 /* Report */ -#define HID_MAIN_ITEM_COLLECTION_ARRAY 0x04 /* Named Array */ -#define HID_MAIN_ITEM_COLLECTION_SWITCH 0x05 /* Usage Switch */ -#define HID_MAIN_ITEM_COLLECTION_MODIFIER 0x06 /* Usage Modifier */ -#define HID_MAIN_ITEM_ENDCOLLECTION_PREFIX 0xc0 +#define HID_MAINITEM_TAG_INPUT (0x08 << 4) +#define HID_MAINITEM_TAG_OUTPUT (0x09 << 4) +#define HID_MAINITEM_TAG_COLLECTION (0x0a << 4) +#define HID_MAINITEM_TAG_FEATURE (0x0b << 4) +#define HID_MAINITEM_TAG_ENDCOLLECTION (0x0c << 4) + +#define HID_MAINITEM_CONSTANT (1 << 0) /* Constant(1) vs Data(0) */ +#define HID_MAINITEM_VARIABLE (1 << 1) /* Variable(1) vs Array(0) */ +#define HID_MAINITEM_RELATIVE (1 << 2) /* Relative(1) vs Absolute(0) */ +#define HID_MAINITEM_WRAP (1 << 3) /* Wrap(1) vs No Wrap(0) */ +#define HID_MAINITEM_NONLINEAR (1 << 4) /* Non Linear(1) vs Linear(0) */ +#define HID_MAINITEM_NOPREFERRED (1 << 5) /* No Preferred (1) vs Preferred State(0) */ +#define HID_MAINITEM_NULLSTATE (1 << 6) /* Null state(1) vs No Null position(0) */ +#define HID_MAINITEM_VOLATILE (1 << 7) /* Volatile(1) vs Non volatile(0) */ +#define HID_MAINITEM_BUFFEREDBYTES (1 << 8) /* Buffered Bytes(1) vs Bit Field(0) */ + +#define HID_MAINITEM_COLLECTION_PHYSICAL 0x00 /* Physical (group of axes) */ +#define HID_MAINITEM_COLLECTION_APPL 0x01 /* Application (mouse, keyboard) */ +#define HID_MAINITEM_COLLECTION_LOGICAL 0x02 /* Logical (interrelated data) */ +#define HID_MAINITEM_COLLECTION_REPORT 0x03 /* Report */ +#define HID_MAINITEM_COLLECTION_ARRAY 0x04 /* Named Array */ +#define HID_MAINITEM_COLLECTION_SWITCH 0x05 /* Usage Switch */ +#define HID_MAINITEM_COLLECTION_MODIFIER 0x06 /* Usage Modifier */ /* Global Items (HID 6.2.2.7) */ -#define HID_GLOBAL_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK) -#define HID_GLOBAL_ITEM_USAGEPAGE_PREFIX 0x04 /* Usage Page */ -#define HID_GLOBAL_ITEM_LOGICALMIN_PREFIX 0x14 /* Logical Minimum */ -#define HID_GLOBAL_ITEM_LOGICALMAX_PREFIX 0x24 /* Logical Maximum */ -#define HID_GLOBAL_ITEM_PHYSICALMIN_PREFIX 0x34 /* Physical Minimum */ -#define HID_GLOBAL_ITEM_PHYSMICALAX_PREFIX 0x44 /* Physical Maximum */ -#define HID_GLOBAL_ITEM_UNITEXP_PREFIX 0x54 /* Unit Exponent */ -#define HID_GLOBAL_ITEM_UNIT_PREFIX 0x64 /* Unit */ -#define HID_GLOBAL_ITEM_REPORTSIZE_PREFIX 0x74 /* Report Size */ -#define HID_GLOBAL_ITEM_REPORTID_PREFIX 0x84 /* Report ID */ -#define HID_GLOBAL_ITEM_REPORTCOUNT_PREFIX 0x94 /* Report Count */ -#define HID_GLOBAL_ITEM_PUSH_PREFIX 0xa4 /* Push */ -#define HID_GLOBAL_ITEM_POP_PREFIX 0xb4 /* Pop */ +#define HID_GLOBALITEM_TAG_USAGE_PAGE (0x00 << 4) +#define HID_GLOBALITEM_TAG_LOGICAL_MIN (0x01 << 4) +#define HID_GLOBALITEM_TAG_LOGICAL_MAX (0x02 << 4) +#define HID_GLOBALITEM_TAG_PHYSICAL_MIN (0x03 << 4) +#define HID_GLOBALITEM_TAG_PHYSICAL_MAX (0x04 << 4) +#define HID_GLOBALITEM_TAG_UNIT_EXP (0x05 << 4) +#define HID_GLOBALITEM_TAG_UNIT (0x06 << 4) +#define HID_GLOBALITEM_TAG_REPORT_SIZE (0x07 << 4) +#define HID_GLOBALITEM_TAG_REPORT_ID (0x08 << 4) +#define HID_GLOBALITEM_TAG_REPORT_COUNT (0x09 << 4) +#define HID_GLOBALITEM_TAG_PUSH (0x0a << 4) +#define HID_GLOBALITEM_TAG_POP (0x0b << 4) /* Local Items (HID 6.2.2.8) */ -#define HID_LOCAL_ITEM_SIZE(pfx) ((pfx)&HID_REPORT_ITEM_SIZE_MASK) -#define HID_LOCAL_ITEM_USAGE_PREFIX 0x08 /* Usage */ -#define HID_LOCAL_ITEM_USAGEMIN_PREFIX 0x18 /* Usage Minimum */ -#define HID_LOCAL_ITEM_USAGEMAX_PREFIX 0x28 /* Usage Maximum */ -#define HID_LOCAL_ITEM_DESIGNATORIDX_PREFIX 0x38 /* Designator Index */ -#define HID_LOCAL_ITEM_DESIGNATORMIN_PREFIX 0x48 /* Designator Minimum */ -#define HID_LOCAL_ITEM_DESIGNATORMAX_PREFIX 0x58 /* Designator Maximum */ -#define HID_LOCAL_ITEM_STRINGIDX_PREFIX 0x78 /* String Index */ -#define HID_LOCAL_ITEM_STRINGMIN_PREFIX 0x88 /* String Minimum */ -#define HID_LOCAL_ITEM_STRINGMAX_PREFIX 0x98 /* xx */ -#define HID_LOCAL_ITEM_DELIMITER_PREFIX 0xa8 /* Delimiter */ +#define HID_LOCALITEM_TAG_USAGE (0x00 << 4) +#define HID_LOCALITEM_TAG_USAGE_MIN (0x01 << 4) +#define HID_LOCALITEM_TAG_USAGE_MAX (0x02 << 4) +#define HID_LOCALITEM_TAG_DESIG_INDEX (0x03 << 4) +#define HID_LOCALITEM_TAG_DESIG_MIN (0x04 << 4) +#define HID_LOCALITEM_TAG_DESIG_MAX (0x05 << 4) +/* No 6 in spec */ +#define HID_LOCALITEM_TAG_STRING_INDEX (0x07 << 4) +#define HID_LOCALITEM_TAG_STRING_MIN (0x08 << 4) +#define HID_LOCALITEM_TAG_STRING_MAX (0x09 << 4) +#define HID_LOCALITEM_TAG_DELIMITER (0x0a << 4) /* Also listed as reserved in spec! */ + +/* Usage pages (HuT 3) */ +#define HID_USAGE_PAGE_UNDEFINED 0x00 /* Undefined */ +#define HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS 0x01 /* Generic Desktop Controls */ +#define HID_USAGE_PAGE_SIMULATION_CONTROLS 0x02 /* Simulation Controls */ +#define HID_USAGE_PAGE_VR_CONTROLS 0x03 /* VR Controls */ +#define HID_USAGE_PAGE_SPORT_CONTROLS 0x04 /* Sport Controls */ +#define HID_USAGE_PAGE_GAME_CONTROLS 0x05 /* Game Controls */ +#define HID_USAGE_PAGE_GENERIC_DEVICE_CONTROLS 0x06 /* Generic Device Controls */ +#define HID_USAGE_PAGE_KEYBOARD_KEYPAD 0x07 /* Keyboard/Keypad */ +#define HID_USAGE_PAGE_LED 0x08 /* LEDs */ +#define HID_USAGE_PAGE_BUTTON 0x09 /* Button */ +#define HID_USAGE_PAGE_ORDINAL 0x0a /* Ordinal */ +#define HID_USAGE_PAGE_TELEPHONY 0x0b /* Telephony */ +#define HID_USAGE_PAGE_CONSUMER 0x0c /* Consumer */ +#define HID_USAGE_PAGE_DIGITIZER 0x0d /* Digitizer */ +#define HID_USAGE_PAGE_HAPTICS /* 0x0e Reserved */ +#define HID_USAGE_PAGE_PID 0x0f /* PID Page Physical Interface Device */ +#define HID_USAGE_PAGE_UNICODE 0x10 /* Unicode */ +#define HID_USAGE_PAGE_SOC 0x11 /* Sensor Orientation Category */ +#define HID_USAGE_PAGE_EYE_AND_HEAD_TRACKER 0x12 /* Eye and Head Tracker */ + /* 0x13 Reserved */ +#define HID_USAGE_PAGE_ALPHA_DISPLAY 0x14 /* Alphanumeric Display */ + /* 0x15-3f Reserved */ +#define HID_USAGE_PAGE_MEDICAL 0x40 /* Medical Instruments */ +#define HID_USAGE_PAGE_BRAILLE_DISPLAY 0x41 /* Braille Display */ + /* 0x42-0x58 Reserved */ +#define HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION 0x59 /* Lighting and Illumination */ + /* 0x5a-0x7f Reserved */ +#define HID_USAGE_PAGE_USB_MONITOR 0x80 /* USB Monitor */ +#define HID_USAGE_PAGE_USB_ENUMERATED_VALUES 0x81 /* USB Enumerated Values */ +#define HID_USAGE_PAGE_VESA_VIRTUAL_CONTROLS 0x82 /* VESA Virtual Controls */ +#define HID_USAGE_PAGE_POWER_DEVICE 0x84 /* Power Device */ +#define HID_USAGE_PAGE_BATTERY_SYSTEM 0x85 /* Battery System */ +#define HID_USAGE_PAGE_BARCODE_SCANNER 0x8c /* Bar Code Scanner page */ +#define HID_USAGE_PAGE_SCALE 0x8d /* Scale page */ +#define HID_USAGE_PAGE_MSR 0x8e /* Magnetic Stripe Reading (MSR) Devices */ +#define HID_USAGE_PAGE_POS 0x8f /* Point of Sale devices */ +#define HID_USAGE_PAGE_CAMERA_CONTROL 0x90 /* Camera Control Page */ +#define HID_USAGE_PAGE_ARCADE 0x91 +#define HID_USAGE_PAGE_GAMING_DEVICE 0x92 +#define HID_USAGE_PAGE_FIDO_ALLIANCE 0xF1D0 +#define HID_USAGE_PAGE_VENDOR_PAGE_HBYTE 0xFF00 /* Modifier Keys (HID 8.3) */ #define HID_MODIFIER_LCTRL (1 << 0) /* Left Ctrl */ @@ -205,38 +220,6 @@ #define HID_JS_INPUT_REPORT_BUTTON3 (1 << 6) #define HID_JS_INPUT_REPORT_BUTTON4 (1 << 7) -/* Usage pages (HuT 3) */ -#define HID_USAGE_PAGE_UNDEFINED 0x00 /* Undefined */ -#define HID_USAGE_PAGE_GENERIC_DCTRL 0x01 /* Generic Desktop Controls */ -#define HID_USAGE_PAGE_SIMCTRL 0x02 /* Simulation Controls */ -#define HID_USAGE_PAGE_VRCTRL 0x03 /* VR Controls */ -#define HID_USAGE_PAGE_SPORTCTRL 0x04 /* Sport Controls */ -#define HID_USAGE_PAGE_GAMECTRL 0x05 /* Game Controls */ -#define HID_USAGE_PAGE_GENERIC_DEVCTRL 0x06 /* Generic Device Controls */ -#define HID_USAGE_PAGE_KBD 0x07 /* Keyboard/Keypad */ -#define HID_USAGE_PAGE_LEDS 0x08 /* LEDs */ -#define HID_USAGE_PAGE_BUTTON 0x09 /* Button */ -#define HID_USAGE_PAGE_ORDINAL 0x0a /* Ordinal */ -#define HID_USAGE_PAGE_TELEPHONY 0x0b /* Telephony */ -#define HID_USAGE_PAGE_CONSUMER 0x0c /* Consumer */ -#define HID_USAGE_PAGE_DIGITIZER 0x0d /* Digitizer */ - /* 0x0e Reserved */ -#define HID_USAGE_PAGE_PIDPAGE 0x0f /* PID Page Physical Interface Device */ -#define HID_USAGE_PAGE_UNICODE 0x10 /* Unicode */ - /* 0x11-13 Reserved */ -#define HID_USAGE_PAGE_ALPHA_DISPLAY 0x14 /* Alphanumeric Display */ - /* 0x15-3f Reserved */ -#define HID_USAGE_PAGE_MEDICAL 0x40 /* Medical Instruments */ - /* 0x41-7f Reserved */ - /* 0x80-83 Monitor Devices */ - /* 0x84-87 Power Devices */ - /* 0x88-8b Reserved */ -#define HID_USAGE_PAGE_BARCODE_SCANNER 0x8c /* Bar Code Scanner page */ -#define HID_USAGE_PAGE_SCALE 0x8d /* Scale page */ -#define HID_USAGE_PAGE_MSR 0x8e /* Magnetic Stripe Reading (MSR) Devices */ -#define HID_USAGE_PAGE_POS 0x8f /* Point of Sale devices */ -#define HID_USAGE_PAGE_CAMERA_CTRL 0x90 /* Camera Control Page */ - /* Generic Desktop Page Usage IDs (HuT 4) */ #define HID_DESKTOP_USAGE_UNDEFINED 0x00 /* Undefined */ #define HID_DESKTOP_USAGE_POINTER 0x01 /* Pointer */ @@ -634,7 +617,7 @@ struct usb_hid_js_report { #define HID_CUSTOM_INOUT_DESCRIPTOR_LEN (9 + 9 + 7 + 7) -#define HID_CUSTOM_INOUT_DESCRIPTOR_INIT(bInterfaceNumber, bInterfaceSubClass, wItemLength, in_ep, out_ep,wMaxPacketSize, bInterval) \ +#define HID_CUSTOM_INOUT_DESCRIPTOR_INIT(bInterfaceNumber, bInterfaceSubClass, wItemLength, out_ep, in_ep, wMaxPacketSize, bInterval) \ 0x09, /* bLength: Interface Descriptor size */ \ USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ \ bInterfaceNumber, /* bInterfaceNumber: Number of Interface */ \ @@ -654,13 +637,13 @@ struct usb_hid_js_report { WBVAL(wItemLength), /* wItemLength: Total length of Report descriptor */ \ 0x07, /* bLength: Endpoint Descriptor size */ \ USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ \ - in_ep, /* bEndpointAddress: Endpoint Address (IN) */ \ + out_ep, /* bEndpointAddress: Endpoint Address (OUT) */ \ 0x03, /* bmAttributes: Interrupt endpoint */ \ WBVAL(wMaxPacketSize), /* wMaxPacketSize: x Byte max */ \ bInterval, /* bInterval: Polling Interval */ \ 0x07, /* bLength: Endpoint Descriptor size */ \ USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ \ - out_ep, /* bEndpointAddress: Endpoint Address (IN) */ \ + in_ep, /* bEndpointAddress: Endpoint Address (IN) */ \ 0x03, /* bmAttributes: Interrupt endpoint */ \ WBVAL(wMaxPacketSize), /* wMaxPacketSize: x Byte max */ \ bInterval /* bInterval: Polling Interval */ diff --git a/components/drivers/usb/cherryusb/class/hid/usbh_hid.c b/components/drivers/usb/cherryusb/class/hid/usbh_hid.c index 5c400c7b17..4fd1a91a01 100644 --- a/components/drivers/usb/cherryusb/class/hid/usbh_hid.c +++ b/components/drivers/usb/cherryusb/class/hid/usbh_hid.c @@ -20,7 +20,7 @@ #define INTF_DESC_bInterfaceNumber 2 /** Interface number offset */ #define INTF_DESC_bAlternateSetting 3 /** Alternate setting offset */ -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_hid_buf[CONFIG_USBHOST_MAX_HID_CLASS][USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_hid_buf[CONFIG_USBHOST_MAX_HID_CLASS][USB_ALIGN_UP(32, CONFIG_USB_ALIGN_SIZE)]; static struct usbh_hid g_hid_class[CONFIG_USBHOST_MAX_HID_CLASS]; static uint32_t g_devinuse = 0; @@ -106,7 +106,7 @@ int usbh_hid_get_idle(struct usbh_hid *hid_class, uint8_t *buffer) if (ret < 8) { return ret; } - memcpy(buffer, g_hid_buf[hid_class->minor], MIN(ret - 8, 1)); + memcpy(buffer, g_hid_buf[hid_class->minor], MIN((uint32_t)ret - 8, 1)); return ret; } @@ -148,7 +148,7 @@ int usbh_hid_get_protocol(struct usbh_hid *hid_class, uint8_t *protocol) if (ret < 8) { return ret; } - memcpy(protocol, g_hid_buf[hid_class->minor], MIN(ret - 8, 1)); + memcpy(protocol, g_hid_buf[hid_class->minor], MIN((uint32_t)ret - 8, 1)); return ret; } @@ -173,7 +173,6 @@ int usbh_hid_set_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t int usbh_hid_get_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen) { struct usb_setup_packet *setup; - int ret; if (!hid_class || !hid_class->hport) { return -USB_ERR_INVAL; @@ -186,18 +185,12 @@ int usbh_hid_get_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t setup->wIndex = 0; setup->wLength = buflen; - ret = usbh_control_transfer(hid_class->hport, setup, g_hid_buf[hid_class->minor]); - if (ret < 8) { - return ret; - } - memcpy(buffer, g_hid_buf[hid_class->minor], MIN(ret - 8, buflen)); - return ret; + return usbh_control_transfer(hid_class->hport, setup, buffer); } int usbh_hid_connect(struct usbh_hubport *hport, uint8_t intf) { struct usb_endpoint_descriptor *ep_desc; - int ret; uint8_t cur_iface = 0xff; uint8_t *p; bool found = false; @@ -249,23 +242,6 @@ int usbh_hid_connect(struct usbh_hubport *hport, uint8_t intf) return -USB_ERR_INVAL; } found: - // /* 0x0 = boot protocol, 0x1 = report protocol */ - // ret = usbh_hid_set_protocol(hid_class, 0x1); - // if (ret < 0) { - // return ret; - // } - - ret = usbh_hid_set_idle(hid_class, 0, 0); - if (ret < 0) { - USB_LOG_WRN("Do not support set idle\r\n"); - } - - /* We read report desc but do nothing (because of too much memory usage for parsing report desc, parsed by users) */ - ret = usbh_hid_get_report_descriptor(hid_class, g_hid_buf[hid_class->minor], MIN(sizeof(g_hid_buf[hid_class->minor]), hid_class->report_size)); - if (ret < 0) { - return ret; - } - for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; if (ep_desc->bEndpointAddress & 0x80) { @@ -280,7 +256,7 @@ found: USB_LOG_INFO("Register HID Class:%s\r\n", hport->config.intf[intf].devname); usbh_hid_run(hid_class); - return ret; + return 0; } int usbh_hid_disconnect(struct usbh_hubport *hport, uint8_t intf) @@ -310,6 +286,427 @@ int usbh_hid_disconnect(struct usbh_hubport *hport, uint8_t intf) return ret; } +static uint32_t hid_get_itemval(const uint8_t *data, unsigned int idx, unsigned int size) +{ + uint32_t value = 0; + + for (unsigned int i = 1; i <= size; i++) + value |= data[idx + i] << (8 * (i - 1)); + + return value; +} + +struct hid_report *usbh_hid_report_parse(const uint8_t *data, uint32_t report_len, uint32_t max_usages) +{ + uint32_t i = 0; + uint32_t itemtag, itemtype, itemsize; + uint32_t itemval; + struct hid_report_field field; + uint32_t usage_page = 0, usage = 0, usage_min = 0, usage_max = 0, flags = 0; + uint32_t *usages; + struct hid_report *hid_report; + + hid_report = usb_osal_malloc(sizeof(struct hid_report)); + if (!hid_report) { + USB_LOG_ERR("hid report malloc failed\r\n"); + return NULL; + } + + usages = usb_osal_malloc(sizeof(uint32_t) * max_usages); + if (!usages) { + USB_LOG_ERR("hid usages malloc failed\r\n"); + goto err; + } + + memset(hid_report, 0, sizeof(struct hid_report)); + memset(&field, 0, sizeof(struct hid_report_field)); + + while (i < report_len) { + itemtag = data[i] & HID_TAG_MASK; + itemtype = data[i] & HID_TYPE_MASK; + itemsize = data[i] & HID_SIZE_MASK; + + if (itemsize == 3) /* HID spec: 6.2.2.2 - Short Items */ + itemsize = 4; + + itemval = hid_get_itemval(data, i, itemsize); + + USB_LOG_DBG("itemtype 0x%02x, itemtag 0x%02x, itemsize %d, itemval 0x%08x\r\n", + itemtype, itemtag, itemsize, itemval); + + switch (itemtype) { + case HID_ITEMTYPE_MAIN: + switch (itemtag) { + case HID_MAINITEM_TAG_INPUT: + if ((flags & HID_REPORT_FLAG_REQUIRED_MASK) != HID_REPORT_FLAG_REQUIRED_MASK) + goto err; + + if (hid_report->input_count >= CONFIG_USBHOST_HID_MAX_INPUT) { + USB_LOG_ERR("hid input fields exceed max limit\r\n"); + goto err; + } + + field.flags = flags; + field.properties = itemval; + field.usage_page = usage_page; + memcpy(&hid_report->input_fields[hid_report->input_count], &field, sizeof(struct hid_report_field)); + if (field.usage_count > 0) { + hid_report->input_fields[hid_report->input_count].usages = usb_osal_malloc(sizeof(uint32_t) * field.usage_count); + if (!hid_report->input_fields[hid_report->input_count].usages) { + USB_LOG_ERR("hid input usages malloc failed\r\n"); + goto err; + } + memcpy(hid_report->input_fields[hid_report->input_count].usages, usages, sizeof(uint32_t) * field.usage_count); + } + + hid_report->input_count++; + + /* only keep the global items */ + flags &= HID_REPORT_FLAG_GLOBAL_MASK; + memset(&field, 0, sizeof(struct hid_report_field)); + break; + case HID_MAINITEM_TAG_OUTPUT: + if ((flags & HID_REPORT_FLAG_REQUIRED_MASK) != HID_REPORT_FLAG_REQUIRED_MASK) + goto err; + + if (hid_report->output_count >= CONFIG_USBHOST_HID_MAX_OUTPUT) { + USB_LOG_ERR("hid output fields exceed max limit\r\n"); + goto err; + } + + field.flags = flags; + field.properties = itemval; + field.usage_page = usage_page; + memcpy(&hid_report->output_fields[hid_report->output_count], &field, sizeof(struct hid_report_field)); + if (field.usage_count > 0) { + hid_report->output_fields[hid_report->output_count].usages = usb_osal_malloc(sizeof(uint32_t) * field.usage_count); + if (!hid_report->output_fields[hid_report->output_count].usages) { + USB_LOG_ERR("hid output usages malloc failed\r\n"); + goto err; + } + memcpy(hid_report->output_fields[hid_report->output_count].usages, usages, sizeof(uint32_t) * field.usage_count); + } + + hid_report->output_count++; + + /* only keep the global items */ + flags &= HID_REPORT_FLAG_GLOBAL_MASK; + memset(&field, 0, sizeof(struct hid_report_field)); + break; + case HID_MAINITEM_TAG_COLLECTION: + memset(&field, 0, sizeof(struct hid_report_field)); + break; + case HID_MAINITEM_TAG_FEATURE: + + if (hid_report->feature_count >= CONFIG_USBHOST_HID_MAX_FEATURE) { + USB_LOG_ERR("hid feature fields exceed max limit\r\n"); + goto err; + } + + field.flags = flags; + field.properties = itemval; + field.usage_page = usage_page; + memcpy(&hid_report->feature_fields[hid_report->feature_count], &field, sizeof(struct hid_report_field)); + if (field.usage_count > 0) { + hid_report->feature_fields[hid_report->feature_count].usages = usb_osal_malloc(sizeof(uint32_t) * field.usage_count); + if (!hid_report->feature_fields[hid_report->feature_count].usages) { + USB_LOG_ERR("hid feature usages malloc failed\r\n"); + goto err; + } + memcpy(hid_report->feature_fields[hid_report->feature_count].usages, usages, sizeof(uint32_t) * field.usage_count); + } + + hid_report->feature_count++; + + memset(&field, 0, sizeof(struct hid_report_field)); + + break; + case HID_MAINITEM_TAG_ENDCOLLECTION: + break; + default: + goto err; + } + break; + case HID_ITEMTYPE_GLOBAL: + switch (itemtag) { + case HID_GLOBALITEM_TAG_USAGE_PAGE: + usage_page = itemval; + + if (usage_page > UINT16_MAX) + goto err; + + flags |= HID_REPORT_FLAG_USAGE_PAGE; + break; + case HID_GLOBALITEM_TAG_LOGICAL_MIN: + field.logical_min = (int32_t)itemval; + flags |= HID_REPORT_FLAG_LOGICAL_MIN; + break; + case HID_GLOBALITEM_TAG_LOGICAL_MAX: + field.logical_max = (int32_t)itemval; + flags |= HID_REPORT_FLAG_LOGICAL_MAX; + break; + case HID_GLOBALITEM_TAG_REPORT_SIZE: + field.report_size = itemval; + flags |= HID_REPORT_FLAG_REPORT_SIZE; + break; + case HID_GLOBALITEM_TAG_REPORT_COUNT: + field.report_count = itemval; + flags |= HID_REPORT_FLAG_REPORT_COUNT; + break; + case HID_GLOBALITEM_TAG_REPORT_ID: + hid_report->uses_report_id = true; + field.report_id = itemval; + flags |= HID_REPORT_FLAG_REPORT_ID; + break; + default: + goto err; + } + break; + case HID_ITEMTYPE_LOCAL: + switch (itemtag) { + case HID_LOCALITEM_TAG_USAGE: + usage = itemval; + /* Extended usage (size 4) combines both usage page and id */ + if (itemsize != 4) { + if (!(flags & HID_REPORT_FLAG_USAGE_PAGE)) + goto err; + usage |= usage_page << 16; + } + + usages[field.usage_count++] = usage; + + break; + case HID_LOCALITEM_TAG_USAGE_MIN: + usage_min = itemval; + if (itemsize == 4) { + /* Usage max must be extended as well */ + flags |= HID_REPORT_FLAG_EXTENDED_USAGE; + } else { + if (!(flags & HID_REPORT_FLAG_USAGE_PAGE)) + goto err; + usage_min |= usage_page << 16; + } + field.usage_min = usage_min; + flags |= HID_REPORT_FLAG_USAGE_MIN; + break; + case HID_LOCALITEM_TAG_USAGE_MAX: + if (!(flags & HID_REPORT_FLAG_USAGE_MIN)) + goto err; + + usage_max = itemval; + if (flags & HID_REPORT_FLAG_EXTENDED_USAGE) { + /* Fail if max is not extended usage (HID spec 6.2.2.8) */ + if (itemsize != 4) + goto err; + } else if (itemsize == 4) { + /* Fail because min wasn't extended, but max is */ + goto err; + } else { + if (!(flags & HID_REPORT_FLAG_USAGE_PAGE)) + goto err; + usage_max |= usage_page << 16; + } + + /* Usage min and max must be on the same page */ + if (USAGE_PAGE(usage_min) != USAGE_PAGE(usage_max)) { + goto err; + } + + if (usage_min > usage_max) { + goto err; + } + + for (uint32_t j = usage_min; j <= usage_max; j++) { + usages[field.usage_count++] = j; + } + + field.usage_max = usage_max; + flags |= HID_REPORT_FLAG_USAGE_MAX; + flags &= ~(HID_REPORT_FLAG_USAGE_MIN | HID_REPORT_FLAG_EXTENDED_USAGE); + break; + default: + goto err; + } + break; + default: + goto err; + } + + i += (1 + itemsize); + } + usb_osal_free(usages); + return hid_report; +err: + if (hid_report) { + usb_osal_free(hid_report); + + for (uint32_t j = 0; j < hid_report->input_count; j++) + usb_osal_free(hid_report->input_fields[j].usages); + + for (uint32_t j = 0; j < hid_report->output_count; j++) + usb_osal_free(hid_report->output_fields[j].usages); + + for (uint32_t j = 0; j < hid_report->feature_count; j++) + usb_osal_free(hid_report->feature_fields[j].usages); + } + + if (usages) + usb_osal_free(usages); + return NULL; +} + +void usbh_hid_report_free(struct hid_report *hid_report) +{ + if (hid_report) { + for (uint32_t j = 0; j < hid_report->input_count; j++) + usb_osal_free(hid_report->input_fields[j].usages); + + for (uint32_t j = 0; j < hid_report->output_count; j++) + usb_osal_free(hid_report->output_fields[j].usages); + + for (uint32_t j = 0; j < hid_report->feature_count; j++) + usb_osal_free(hid_report->feature_fields[j].usages); + + usb_osal_free(hid_report); + } +} + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_hid_report_buf[2048]; + +static const char *hid_property_string(uint32_t value) +{ + uint32_t off = 0; + static char buffer[160]; + + memset(buffer, 0, sizeof(buffer)); + + if (value & HID_MAINITEM_CONSTANT) + off += snprintf(buffer + off, sizeof(buffer) - off, "Constant, "); + else + off += snprintf(buffer + off, sizeof(buffer) - off, "Data, "); + + if (value & HID_MAINITEM_VARIABLE) + off += snprintf(buffer + off, sizeof(buffer) - off, "Variable, "); + else + off += snprintf(buffer + off, sizeof(buffer) - off, "Array, "); + + if (value & HID_MAINITEM_RELATIVE) + off += snprintf(buffer + off, sizeof(buffer) - off, "Relative, "); + else + off += snprintf(buffer + off, sizeof(buffer) - off, "Absolute, "); + + if (value & HID_MAINITEM_WRAP) + off += snprintf(buffer + off, sizeof(buffer) - off, "Wrap, "); + else + off += snprintf(buffer + off, sizeof(buffer) - off, "NoWrap, "); + + if (value & HID_MAINITEM_NONLINEAR) + off += snprintf(buffer + off, sizeof(buffer) - off, "NonLinear, "); + else + off += snprintf(buffer + off, sizeof(buffer) - off, "Linear, "); + + if (value & HID_MAINITEM_NOPREFERRED) + off += snprintf(buffer + off, sizeof(buffer) - off, "NoPreferred, "); + else + off += snprintf(buffer + off, sizeof(buffer) - off, "Preferred, "); + + if (value & HID_MAINITEM_NULLSTATE) + off += snprintf(buffer + off, sizeof(buffer) - off, "NullState, "); + else + off += snprintf(buffer + off, sizeof(buffer) - off, "NoNullState, "); + + if (value & HID_MAINITEM_VOLATILE) + off += snprintf(buffer + off, sizeof(buffer) - off, "Volatile, "); + else + off += snprintf(buffer + off, sizeof(buffer) - off, "NonVolatile, "); + + if (value & HID_MAINITEM_BUFFEREDBYTES) + off += snprintf(buffer + off, sizeof(buffer) - off, "BufferedBytes"); + else + off += snprintf(buffer + off, sizeof(buffer) - off, "BitField"); + + return buffer; + +} + +static void usbh_hid_field_info_print(uint32_t idx, struct hid_report_field *field) +{ + USB_LOG_RAW(" Field %u:\r\n", idx); + USB_LOG_RAW(" Usage Page: 0x%04x\r\n", (unsigned int)field->usage_page); + USB_LOG_RAW(" Report ID: %u\r\n", (unsigned int)field->report_id); + USB_LOG_RAW(" Report Size: %ubit\r\n", (unsigned int)field->report_size); + USB_LOG_RAW(" Report Count: %u\r\n", (unsigned int)field->report_count); + USB_LOG_RAW(" Logical Min: %d\r\n", field->logical_min); + USB_LOG_RAW(" Logical Max: %d\r\n", field->logical_max); + USB_LOG_RAW(" Usage Count: %u\r\n", (unsigned int)field->usage_count); + if (field->usage_count > 0) { + if (field->usage_count == 1) { + USB_LOG_RAW(" Usage: 0x%04x\r\n", USAGE_ID(field->usages[0])); + } else { + USB_LOG_RAW(" Usages(0x%04x ~ 0x%04x)\r\n", USAGE_ID(field->usage_min), USAGE_ID(field->usage_max)); + } + } + USB_LOG_RAW(" Flags: 0x%04x\r\n", (unsigned int)field->flags); + USB_LOG_RAW(" Properties: 0x%04x(%s)\r\n", (unsigned int)field->properties, hid_property_string(field->properties)); +} + +int lshid(int argc, char **argv) +{ + struct usbh_hid *hid_class; + struct hid_report *hid_report; + int ret; + + if (argc < 2) { + USB_LOG_ERR("please input correct command: lshid path\r\n"); + return -1; + } + + hid_class = usbh_find_class_instance(argv[1]); + if (!hid_class) { + USB_LOG_ERR("cannot find hid device\r\n"); + return -1; + } + + if (hid_class->report_size > sizeof(g_hid_report_buf)) { + USB_LOG_ERR("hid report buffer is too small\r\n"); + return -1; + } + + ret = usbh_hid_get_report_descriptor(hid_class, g_hid_report_buf, hid_class->report_size); + if (ret < 0) { + USB_LOG_ERR("get hid report descriptor failed, errcode: %d\r\n", ret); + return -1; + } + + hid_report = usbh_hid_report_parse(g_hid_report_buf, hid_class->report_size, 1024); + if (hid_report) { + USB_LOG_RAW("HID report parsed successfully\r\n"); + + USB_LOG_RAW("Input fields: %u\r\n", (unsigned int)hid_report->input_count); + for (uint32_t i = 0; i < hid_report->input_count; i++) { + struct hid_report_field *field = &hid_report->input_fields[i]; + usbh_hid_field_info_print(i, field); + } + + USB_LOG_RAW("Output fields: %u\r\n", (unsigned int)hid_report->output_count); + for (uint32_t i = 0; i < hid_report->output_count; i++) { + struct hid_report_field *field = &hid_report->output_fields[i]; + usbh_hid_field_info_print(i, field); + } + + USB_LOG_RAW("Feature fields: %u\r\n", (unsigned int)hid_report->feature_count); + for (uint32_t i = 0; i < hid_report->feature_count; i++) { + struct hid_report_field *field = &hid_report->feature_fields[i]; + usbh_hid_field_info_print(i, field); + } + + usbh_hid_report_free(hid_report); + } else { + USB_LOG_ERR("HID report parsed failed\r\n"); + } + return 0; +} + __WEAK void usbh_hid_run(struct usbh_hid *hid_class) { (void)hid_class; diff --git a/components/drivers/usb/cherryusb/class/hid/usbh_hid.h b/components/drivers/usb/cherryusb/class/hid/usbh_hid.h index 8b87e0c0b5..fa5c7663af 100644 --- a/components/drivers/usb/cherryusb/class/hid/usbh_hid.h +++ b/components/drivers/usb/cherryusb/class/hid/usbh_hid.h @@ -8,6 +8,82 @@ #include "usb_hid.h" +/* local items */ +#define HID_REPORT_FLAG_USAGE_MIN (1 << 0) +#define HID_REPORT_FLAG_USAGE_MAX (1 << 1) + +/* global items */ +#define HID_REPORT_FLAG_REPORT_ID (1 << 2) +#define HID_REPORT_FLAG_REPORT_COUNT (1 << 3) +#define HID_REPORT_FLAG_REPORT_SIZE (1 << 4) +#define HID_REPORT_FLAG_LOGICAL_MIN (1 << 5) +#define HID_REPORT_FLAG_LOGICAL_MAX (1 << 6) +#define HID_REPORT_FLAG_USAGE_PAGE (1 << 7) + +/* main items */ +#define HID_REPORT_FLAG_INPUT (1 << 8) +#define HID_REPORT_FLAG_OUTPUT (1 << 9) +#define HID_REPORT_FLAG_FEATURE (1 << 10) + +#define HID_REPORT_FLAG_EXTENDED_USAGE (1 << 11) + +/* masks */ + +#define HID_REPORT_FLAG_GLOBAL_MASK (HID_REPORT_FLAG_REPORT_ID | \ + HID_REPORT_FLAG_REPORT_COUNT | \ + HID_REPORT_FLAG_REPORT_SIZE | \ + HID_REPORT_FLAG_LOGICAL_MIN | \ + HID_REPORT_FLAG_LOGICAL_MAX | \ + HID_REPORT_FLAG_USAGE_PAGE) + +#define HID_REPORT_FLAG_REQUIRED_MASK (HID_REPORT_FLAG_REPORT_COUNT | \ + HID_REPORT_FLAG_REPORT_SIZE | \ + HID_REPORT_FLAG_LOGICAL_MIN | \ + HID_REPORT_FLAG_LOGICAL_MAX) + +#define USAGE_ID(usage) (usage & 0x0000FFFF) +#define USAGE_PAGE(usage) ((usage & 0xFFFF0000) >> 16) + +#ifndef CONFIG_USBHOST_HID_MAX_INPUT +#define CONFIG_USBHOST_HID_MAX_INPUT 16 +#endif + +#ifndef CONFIG_USBHOST_HID_MAX_OUTPUT +#define CONFIG_USBHOST_HID_MAX_OUTPUT 16 +#endif + +#ifndef CONFIG_USBHOST_HID_MAX_FEATURE +#define CONFIG_USBHOST_HID_MAX_FEATURE 16 +#endif + +struct hid_report_field { + uint32_t *usages; /* usage page + usage */ + uint32_t usage_count; + uint32_t usage_page; + + uint32_t report_id; /* optional */ + uint32_t report_count; + uint32_t report_size; + int32_t logical_min; + int32_t logical_max; + uint32_t properties; + + uint32_t usage_min; + uint32_t usage_max; + + uint32_t flags; +}; + +struct hid_report { + bool uses_report_id; + uint32_t input_count; + struct hid_report_field input_fields[CONFIG_USBHOST_HID_MAX_INPUT]; + uint32_t output_count; + struct hid_report_field output_fields[CONFIG_USBHOST_HID_MAX_OUTPUT]; + uint32_t feature_count; + struct hid_report_field feature_fields[CONFIG_USBHOST_HID_MAX_FEATURE]; +}; + struct usbh_hid { struct usbh_hubport *hport; struct usb_endpoint_descriptor *intin; /* INTR IN endpoint */ @@ -36,9 +112,14 @@ int usbh_hid_get_protocol(struct usbh_hid *hid_class, uint8_t *protocol); int usbh_hid_set_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen); int usbh_hid_get_report(struct usbh_hid *hid_class, uint8_t report_type, uint8_t report_id, uint8_t *buffer, uint32_t buflen); +struct hid_report *usbh_hid_report_parse(const uint8_t *data, uint32_t report_len, uint32_t max_usages); +void usbh_hid_report_free(struct hid_report *hid_report); + void usbh_hid_run(struct usbh_hid *hid_class); void usbh_hid_stop(struct usbh_hid *hid_class); +int lshid(int argc, char **argv); + #ifdef __cplusplus } #endif diff --git a/components/drivers/usb/cherryusb/class/hub/usbh_hub.c b/components/drivers/usb/cherryusb/class/hub/usbh_hub.c index 008c600cee..910aa0c2cd 100644 --- a/components/drivers/usb/cherryusb/class/hub/usbh_hub.c +++ b/components/drivers/usb/cherryusb/class/hub/usbh_hub.c @@ -238,6 +238,7 @@ int usbh_hub_set_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature) { struct usb_setup_packet roothub_setup; struct usb_setup_packet *setup; + int ret; if (hub->is_roothub) { setup = &roothub_setup; @@ -246,9 +247,22 @@ int usbh_hub_set_feature(struct usbh_hub *hub, uint8_t port, uint8_t feature) setup->wValue = feature; setup->wIndex = port; setup->wLength = 0; - return usbh_roothub_control(hub->bus, setup, NULL); + + ret = usbh_roothub_control(hub->bus, setup, NULL); + + if ((feature == HUB_PORT_FEATURE_RESET) && (ret >= 0)) { + hub->bus->event_handler(hub->bus->busid, hub->index, port, USB_INTERFACE_ANY, USBH_EVENT_DEVICE_RESET); + } + + return ret; } else { - return _usbh_hub_set_feature(hub, port, feature); + ret = _usbh_hub_set_feature(hub, port, feature); + + if ((feature == HUB_PORT_FEATURE_RESET) && (ret >= 0)) { + hub->bus->event_handler(hub->bus->busid, hub->index, port, USB_INTERFACE_ANY, USBH_EVENT_DEVICE_RESET); + } + + return ret; } } @@ -337,11 +351,11 @@ static int usbh_hub_connect(struct usbh_hubport *hport, uint8_t intf) } /* - * Super-Speed hubs need to know their depth to be able to - * parse the bits of the route-string that correspond to - * their downstream port number. - * - */ + * Super-Speed hubs need to know their depth to be able to + * parse the bits of the route-string that correspond to + * their downstream port number. + * + */ if ((hport->depth != 0) && (hport->speed == USB_SPEED_SUPER)) { ret = usbh_hub_set_depth(hub, hport->depth - 1); if (ret < 0) { @@ -373,6 +387,11 @@ static int usbh_hub_connect(struct usbh_hubport *hport, uint8_t intf) hub->tt_think = ((hub->hub_desc.wHubCharacteristics & HUB_CHAR_TTTT_MASK) >> 5); } + if (hub->nports > CONFIG_USBHOST_MAX_EHPORTS) { + USB_LOG_ERR("Hub nports %u overflow\r\n", hub->nports); + return -USB_ERR_NOMEM; + } + for (uint8_t port = 0; port < hub->nports; port++) { hub->child[port].port = port + 1; hub->child[port].parent = hub; @@ -470,6 +489,8 @@ static void usbh_hub_events(struct usbh_hub *hub) int ret; size_t flags; + (void)speed_table; + if (!hub->connected) { return; } @@ -560,6 +581,8 @@ static void usbh_hub_events(struct usbh_hub *hub) /* Last, check connect status */ if (portstatus & HUB_PORT_STATUS_CONNECTION) { + hub->bus->event_handler(hub->bus->busid, hub->index, port + 1, USB_INTERFACE_ANY, USBH_EVENT_DEVICE_CONNECTED); + ret = usbh_hub_set_feature(hub, port + 1, HUB_PORT_FEATURE_RESET); if (ret < 0) { USB_LOG_ERR("Failed to reset port %u, errorcode: %d\r\n", port + 1, ret); @@ -641,7 +664,6 @@ static void usbh_hub_events(struct usbh_hub *hub) child = &hub->child[port]; /** release child sources */ usbh_hubport_release(child); - USB_LOG_INFO("Device on Bus %u, Hub %u, Port %u disconnected\r\n", hub->bus->busid, hub->index, port + 1); } } } @@ -660,12 +682,15 @@ static void usbh_hub_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) struct usbh_bus *bus = (struct usbh_bus *)CONFIG_USB_OSAL_THREAD_GET_ARGV; usb_hc_init(bus); + bus->event_handler(bus->busid, USB_HUB_INDEX_ANY, USB_HUB_PORT_ANY, USB_INTERFACE_ANY, USBH_EVENT_INIT); while (1) { ret = usb_osal_mq_recv(bus->hub_mq, (uintptr_t *)&hub, USB_OSAL_WAITING_FOREVER); if (ret < 0) { continue; } + usb_osal_mutex_take(bus->mutex); usbh_hub_events(hub); + usb_osal_mutex_give(bus->mutex); } } @@ -695,6 +720,12 @@ int usbh_hub_initialize(struct usbh_bus *bus) return -1; } + bus->mutex = usb_osal_mutex_create(); + if (bus->mutex == NULL) { + USB_LOG_ERR("Failed to create bus mutex\r\n"); + return -1; + } + snprintf(thread_name, 32, "usbh_hub%u", bus->busid); bus->hub_thread = usb_osal_thread_create(thread_name, CONFIG_USBHOST_PSC_STACKSIZE, CONFIG_USBHOST_PSC_PRIO, usbh_hub_thread, bus); if (bus->hub_thread == NULL) { @@ -708,8 +739,8 @@ int usbh_hub_deinitialize(struct usbh_bus *bus) { struct usbh_hubport *hport; struct usbh_hub *hub; - size_t flags; + usb_osal_mutex_take(bus->mutex); hub = &bus->hcd.roothub; for (uint8_t port = 0; port < hub->nports; port++) { hport = &hub->child[port]; @@ -717,15 +748,13 @@ int usbh_hub_deinitialize(struct usbh_bus *bus) usbh_hubport_release(hport); } - flags = usb_osal_enter_critical_section(); - usb_hc_deinit(bus); - usb_osal_leave_critical_section(flags); - - usb_osal_mq_delete(bus->hub_mq); usb_osal_thread_delete(bus->hub_thread); + usb_osal_mq_delete(bus->hub_mq); + usb_osal_mutex_give(bus->mutex); + usb_osal_mutex_delete(bus->mutex); return 0; } diff --git a/components/drivers/usb/cherryusb/class/midi/usb_midi.h b/components/drivers/usb/cherryusb/class/midi/usb_midi.h index 3e7a846f4e..e68675a77d 100644 --- a/components/drivers/usb/cherryusb/class/midi/usb_midi.h +++ b/components/drivers/usb/cherryusb/class/midi/usb_midi.h @@ -6,6 +6,8 @@ #ifndef USB_MIDI_H #define USB_MIDI_H +#include "usb_audio.h" + /* bDescriptorSubType */ #define MIDI_VC_HEADER_DESCRIPTOR_SUBTYPE 0x01U #define MIDI_MS_HEADER_DESCRIPTOR_SUBTYPE 0x01U @@ -201,6 +203,19 @@ struct midi_cs_ep_ms_general_descriptor { #define MIDI_SIZEOF_MS_GENERAL_DESC(n) (4 + n) // clang-format off +#define MIDI_STANDARD_DESCRIPTOR_INIT(bInterfaceNumber, bNumEndpoints) \ + 0x09, /* bLength */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ + bInterfaceNumber, /* bInterfaceNumber */ \ + 0x00, /* bAlternateSetting */ \ + bNumEndpoints, /* bNumEndpoints */ \ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ \ + AUDIO_SUBCLASS_MIDISTREAMING, /* bInterfaceSubClass */ \ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ \ + 0x00 /* iInterface */ + +#define MIDI_STANDARD_DESCRIPTOR_LEN 0x09 + #define MIDI_CS_HEADER_DESCRIPTOR_INIT(wTotalLength) \ 0x07, /* bLength */ \ USB_CS_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \ diff --git a/components/drivers/usb/cherryusb/class/serial/usbh_cdc_acm.c b/components/drivers/usb/cherryusb/class/serial/usbh_cdc_acm.c new file mode 100644 index 0000000000..cf5363efa5 --- /dev/null +++ b/components/drivers/usb/cherryusb/class/serial/usbh_cdc_acm.c @@ -0,0 +1,266 @@ +/* + * Copyright (c) 2022 ~ 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_serial.h" +#include "usbh_cdc_acm.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_cdc_acm" +#include "usb_log.h" + +struct usbh_cdc_acm { + struct usb_endpoint_descriptor *intin; + struct usbh_urb intin_urb; + struct usb_osal_timer *modem_timer; + uint16_t modem_status; +}; + +static int usbh_cdc_acm_attach(struct usbh_serial *serial) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret; + + struct usbh_cdc_acm *cdc_acm_class = usb_osal_malloc(sizeof(struct usbh_cdc_acm)); + if (!cdc_acm_class) { + USB_LOG_ERR("No memory for cdc_acm_class\r\n"); + return -USB_ERR_NOMEM; + } + memset(cdc_acm_class, 0, sizeof(struct usbh_cdc_acm)); + serial->priv = cdc_acm_class; + + for (uint8_t i = 0; i < serial->hport->config.intf[serial->intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &serial->hport->config.intf[serial->intf].altsetting[0].ep[i].ep_desc; + + if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(cdc_acm_class->intin, ep_desc); + break; + } else { + } + } + } + + if (!cdc_acm_class->intin) { + USB_LOG_ERR("Failed to find interrupt endpoint\r\n"); + ret = -USB_ERR_NODEV; + goto errout; + } + return 0; +errout: + serial->priv = NULL; + usb_osal_free(cdc_acm_class); + return ret; +} + +static void usbh_cdc_acm_detach(struct usbh_serial *serial) +{ + struct usbh_cdc_acm *cdc_acm_class; + + if (!serial || !serial->priv) { + return; + } + + cdc_acm_class = (struct usbh_cdc_acm *)serial->priv; + if (cdc_acm_class->intin) { + usbh_kill_urb(&cdc_acm_class->intin_urb); + } + serial->priv = NULL; + usb_osal_free(cdc_acm_class); +} + +static int usbh_cdc_acm_set_line_coding(struct usbh_serial *serial, struct cdc_line_coding *line_coding) +{ + struct usb_setup_packet *setup; + + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SET_LINE_CODING; + setup->wValue = 0; + setup->wIndex = serial->intf; + setup->wLength = 7; + + memcpy(serial->iobuffer, line_coding, sizeof(struct cdc_line_coding)); + + return usbh_control_transfer(serial->hport, setup, serial->iobuffer); +} + +static int usbh_cdc_acm_get_line_coding(struct usbh_serial *serial, struct cdc_line_coding *line_coding) +{ + struct usb_setup_packet *setup; + int ret; + + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_GET_LINE_CODING; + setup->wValue = 0; + setup->wIndex = serial->intf; + setup->wLength = 7; + + ret = usbh_control_transfer(serial->hport, setup, serial->iobuffer); + if (ret < 0) { + return ret; + } + memcpy(line_coding, serial->iobuffer, sizeof(struct cdc_line_coding)); + return ret; +} + +static int usbh_cdc_acm_set_line_state(struct usbh_serial *serial, bool dtr, bool rts) +{ + struct usb_setup_packet *setup; + + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SET_CONTROL_LINE_STATE; + setup->wValue = (dtr << 0) | (rts << 1); + setup->wIndex = serial->intf; + setup->wLength = 0; + + return usbh_control_transfer(serial->hport, setup, NULL); +} + +static int usbh_cdc_acm_get_modem_status(struct usbh_serial *serial) +{ + struct usbh_cdc_acm *cdc_acm_class; + uintptr_t flags; + uint16_t status; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + + flags = usb_osal_enter_critical_section(); + + cdc_acm_class = (struct usbh_cdc_acm *)serial->priv; + + status = (cdc_acm_class->modem_status & CDC_SERIAL_STATE_DSR ? USBH_SERIAL_TIOCM_DSR : 0) | + (cdc_acm_class->modem_status & CDC_SERIAL_STATE_RING ? USBH_SERIAL_TIOCM_RI : 0) | + (cdc_acm_class->modem_status & CDC_SERIAL_STATE_DCD ? USBH_SERIAL_TIOCM_CD : 0) | + (serial->line_state & USBH_SERIAL_TIOCM_DTR ? USBH_SERIAL_TIOCM_DTR : 0) | + (serial->line_state & USBH_SERIAL_TIOCM_RTS ? USBH_SERIAL_TIOCM_RTS : 0); + + usb_osal_leave_critical_section(flags); + + return status; +} + +#ifdef CONFIG_USBH_SERIAL_GET_MODEM_STATUS +static int __usbh_cdc_acm_get_modem_status(struct usbh_serial *serial) +{ + struct usbh_cdc_acm *cdc_acm_class; + struct cdc_acm_notification *notification; + uint16_t difference; + uintptr_t flags; + int ret; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + cdc_acm_class = (struct usbh_cdc_acm *)serial->priv; + + usbh_int_urb_fill(&cdc_acm_class->intin_urb, serial->hport, cdc_acm_class->intin, &serial->iobuffer[USBH_SERIAL_INT_NOCACHE_OFFSET], cdc_acm_class->intin->wMaxPacketSize, 0xffffffff, NULL, NULL); + ret = usbh_submit_urb(&cdc_acm_class->intin_urb); + if (ret < 0) { + return ret; + } + + if (cdc_acm_class->intin_urb.actual_length < sizeof(struct cdc_acm_notification)) { + return -USB_ERR_INVAL; + } + + notification = (struct cdc_acm_notification *)&serial->iobuffer[USBH_SERIAL_INT_NOCACHE_OFFSET]; + if (notification->bNotificationType != CDC_NOTIFICATION_SERIAL_STATE) { + return -USB_ERR_INVAL; + } + + flags = usb_osal_enter_critical_section(); + + difference = cdc_acm_class->modem_status ^ notification->data; + cdc_acm_class->modem_status = notification->data; + + if (difference & CDC_SERIAL_STATE_DSR) + serial->iocount.dsr++; + if (difference & CDC_SERIAL_STATE_DCD) + serial->iocount.dcd++; + if (notification->data & CDC_SERIAL_STATE_BREAK) + serial->iocount.brk++; + if (notification->data & CDC_SERIAL_STATE_FRAMING) + serial->iocount.frame++; + if (notification->data & CDC_SERIAL_STATE_PARITY) + serial->iocount.parity++; + if (notification->data & CDC_SERIAL_STATE_OVERRUN) + serial->iocount.overrun++; + + usb_osal_leave_critical_section(flags); + + return ret; +} +#endif + +static const struct usbh_serial_driver cdc_acm_driver = { + .driver_name = "cdc_acm", + + .ignore_rx_header = 0, + .ignore_tx_header = 0, + + .attach = usbh_cdc_acm_attach, + .detach = usbh_cdc_acm_detach, + .set_flow_control = NULL, + .set_line_coding = usbh_cdc_acm_set_line_coding, + .get_line_coding = usbh_cdc_acm_get_line_coding, + .set_line_state = usbh_cdc_acm_set_line_state, + .get_modem_status = usbh_cdc_acm_get_modem_status, +}; + +static int usbh_cdc_acm_connect(struct usbh_hubport *hport, uint8_t intf) +{ + return usbh_serial_probe(hport, intf, &cdc_acm_driver) ? 0 : -USB_ERR_NOMEM; +} + +static int usbh_cdc_acm_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usbh_serial *serial = (struct usbh_serial *)hport->config.intf[intf].priv; + + if (serial) { + usbh_serial_remove(serial); + } + return 0; +} + +const struct usbh_class_driver cdc_acm_class_driver = { + .driver_name = "cdc_acm", + .connect = usbh_cdc_acm_connect, + .disconnect = usbh_cdc_acm_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info cdc_acm_none_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_CDC, + .bInterfaceSubClass = CDC_ABSTRACT_CONTROL_MODEL, + .bInterfaceProtocol = CDC_COMMON_PROTOCOL_NONE, + .id_table = NULL, + .class_driver = &cdc_acm_class_driver +}; + +CLASS_INFO_DEFINE const struct usbh_class_info cdc_acm_at_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_CDC, + .bInterfaceSubClass = CDC_ABSTRACT_CONTROL_MODEL, + .bInterfaceProtocol = CDC_COMMON_PROTOCOL_AT_COMMANDS, + .id_table = NULL, + .class_driver = &cdc_acm_class_driver +}; diff --git a/components/drivers/usb/cherryusb/class/serial/usbh_cdc_acm.h b/components/drivers/usb/cherryusb/class/serial/usbh_cdc_acm.h new file mode 100644 index 0000000000..2940cd9c1a --- /dev/null +++ b/components/drivers/usb/cherryusb/class/serial/usbh_cdc_acm.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2022 ~ 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_CDC_ACM_H +#define USBH_CDC_ACM_H + +#include "usb_cdc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_CDC_ACM_H */ diff --git a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_ch34x.c b/components/drivers/usb/cherryusb/class/serial/usbh_ch34x.c similarity index 36% rename from components/drivers/usb/cherryusb/class/vendor/serial/usbh_ch34x.c rename to components/drivers/usb/cherryusb/class/serial/usbh_ch34x.c index 3941d47dcb..4e31a1afa3 100644 --- a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_ch34x.c +++ b/components/drivers/usb/cherryusb/class/serial/usbh_ch34x.c @@ -1,44 +1,24 @@ /* - * Copyright (c) 2024, sakumisu + * Copyright (c) 2024 ~ 2025, sakumisu * * SPDX-License-Identifier: Apache-2.0 */ #include "usbh_core.h" +#include "usbh_serial.h" #include "usbh_ch34x.h" -#define DEV_FORMAT "/dev/ttyUSB%d" +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_ch43x" +#include "usb_log.h" -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_ch34x_buf[USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; - -#define CONFIG_USBHOST_MAX_CP210X_CLASS 1 - -static struct usbh_ch34x g_ch34x_class[CONFIG_USBHOST_MAX_CP210X_CLASS]; -static uint32_t g_devinuse = 0; - -static struct usbh_ch34x *usbh_ch34x_class_alloc(void) -{ - uint8_t devno; - - for (devno = 0; devno < CONFIG_USBHOST_MAX_CP210X_CLASS; devno++) { - if ((g_devinuse & (1U << devno)) == 0) { - g_devinuse |= (1U << devno); - memset(&g_ch34x_class[devno], 0, sizeof(struct usbh_ch34x)); - g_ch34x_class[devno].minor = devno; - return &g_ch34x_class[devno]; - } - } - return NULL; -} +struct usbh_ch34x { + struct usb_endpoint_descriptor *intin; + struct usbh_urb intin_urb; + struct usb_osal_timer *modem_timer; + uint16_t modem_status; +}; -static void usbh_ch34x_class_free(struct usbh_ch34x *ch34x_class) -{ - uint8_t devno = ch34x_class->minor; - - if (devno < 32) { - g_devinuse &= ~(1U << devno); - } - memset(ch34x_class, 0, sizeof(struct usbh_ch34x)); -} +/* refer to https://github.com/WCHSoftGroup/ch341ser_linux/blob/main/driver/ch341.c */ static int usbh_ch34x_get_baudrate_div(uint32_t baudrate, uint8_t *factor, uint8_t *divisor) { @@ -88,65 +68,137 @@ static int usbh_ch34x_get_baudrate_div(uint32_t baudrate, uint8_t *factor, uint8 return 0; } -static int usbh_ch34x_get_version(struct usbh_ch34x *ch34x_class) +static int usbh_ch34x_control_out(struct usbh_serial *serial, uint8_t bRequest, uint16_t wValue, uint16_t wIndex) +{ + struct usb_setup_packet *setup; + + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = bRequest; + setup->wValue = wValue; + setup->wIndex = wIndex; + setup->wLength = 0; + + return usbh_control_transfer(serial->hport, setup, NULL); +} + +static int usbh_ch34x_control_in(struct usbh_serial *serial, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t size) { struct usb_setup_packet *setup; int ret; - if (!ch34x_class || !ch34x_class->hport) { + if (!serial || !serial->hport) { return -USB_ERR_INVAL; } - setup = ch34x_class->hport->setup; + setup = serial->hport->setup; setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = CH34X_READ_VERSION; - setup->wValue = 0; - setup->wIndex = 0; - setup->wLength = 2; + setup->bRequest = bRequest; + setup->wValue = wValue; + setup->wIndex = wIndex; + setup->wLength = size; - ret = usbh_control_transfer(ch34x_class->hport, setup, g_ch34x_buf); + ret = usbh_control_transfer(serial->hport, setup, serial->iobuffer); if (ret < 0) { return ret; } + memcpy(data, serial->iobuffer, size); - USB_LOG_INFO("Ch34x chip version %02x:%02x\r\n", g_ch34x_buf[0], g_ch34x_buf[1]); return ret; } -static int usbh_ch34x_flow_ctrl(struct usbh_ch34x *ch34x_class) +static int usbh_ch34x_get_version(struct usbh_serial *serial) { - struct usb_setup_packet *setup; + int ret; + uint8_t buf[2]; - if (!ch34x_class || !ch34x_class->hport) { - return -USB_ERR_INVAL; + ret = usbh_ch34x_control_in(serial, CH34X_READ_VERSION, 0, 0, buf, 2); + if (ret < 0) { + return ret; } - setup = ch34x_class->hport->setup; - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = CH34X_WRITE_REG; - setup->wValue = 0x2727; - setup->wIndex = 0; - setup->wLength = 0; + USB_LOG_INFO("chip version: 0x%02x\r\n", buf[0]); + return ret; +} + +static int usbh_ch34x_attach(struct usbh_serial *serial) +{ + struct usb_endpoint_descriptor *ep_desc; + int ret; - return usbh_control_transfer(ch34x_class->hport, setup, NULL); + struct usbh_ch34x *ch34x_class = usb_osal_malloc(sizeof(struct usbh_ch34x)); + if (!ch34x_class) { + USB_LOG_ERR("No memory for ch34x_class\r\n"); + return -USB_ERR_NOMEM; + } + memset(ch34x_class, 0, sizeof(struct usbh_ch34x)); + serial->priv = ch34x_class; + + for (uint8_t i = 0; i < serial->hport->config.intf[serial->intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &serial->hport->config.intf[serial->intf].altsetting[0].ep[i].ep_desc; + + if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(ch34x_class->intin, ep_desc); + break; + } else { + } + } + } + + if (!ch34x_class->intin) { + USB_LOG_ERR("Failed to find interrupt endpoint\r\n"); + ret = -USB_ERR_NODEV; + goto errout; + } + + ret = usbh_ch34x_get_version(serial); + ret |= usbh_ch34x_control_out(serial, CH34X_SERIAL_INIT, 0, 0); + ret |= usbh_ch34x_control_out(serial, CH34X_WRITE_REG, 0x1312, 0xd982); + ret |= usbh_ch34x_control_out(serial, CH34X_WRITE_REG, 0x0f2c, 0x0007); + if (ret < 0) { + goto errout; + } + + return 0; +errout: + serial->priv = NULL; + usb_osal_free(ch34x_class); + return ret; } -int usbh_ch34x_set_line_coding(struct usbh_ch34x *ch34x_class, struct cdc_line_coding *line_coding) +static void usbh_ch34x_detach(struct usbh_serial *serial) { - struct usb_setup_packet *setup; - uint16_t reg_value = 0; - uint16_t value = 0; - uint8_t factor = 0; - uint8_t divisor = 0; + struct usbh_ch34x *ch34x_class; - if (!ch34x_class || !ch34x_class->hport) { - return -USB_ERR_INVAL; + if (!serial || !serial->priv) { + return; + } + + ch34x_class = (struct usbh_ch34x *)serial->priv; + if (ch34x_class->intin) { + usbh_kill_urb(&ch34x_class->intin_urb); } - setup = ch34x_class->hport->setup; + serial->priv = NULL; + usb_osal_free(ch34x_class); +} - memcpy((uint8_t *)&ch34x_class->line_coding, line_coding, sizeof(struct cdc_line_coding)); +static int usbh_ch34x_set_flow_ctrl(struct usbh_serial *serial, bool hardctrl) +{ + return usbh_ch34x_control_out(serial, CH34X_WRITE_REG, 0x2727, hardctrl ? 0x0101 : 0x0000); +} - /* refer to https://github.com/WCHSoftGroup/ch341ser_linux/blob/main/driver/ch341.c */ +static int usbh_ch34x_set_line_coding(struct usbh_serial *serial, struct cdc_line_coding *line_coding) +{ + uint16_t reg_value = 0; + uint16_t value = 0; + uint16_t index = 0; + uint8_t factor = 0; + uint8_t divisor = 0; switch (line_coding->bParityType) { case 0: @@ -188,178 +240,156 @@ int usbh_ch34x_set_line_coding(struct usbh_ch34x *ch34x_class, struct cdc_line_c reg_value |= CH341_L_SB; } - reg_value |= 0xC0; + usbh_ch34x_get_baudrate_div(line_coding->dwDTERate, &factor, &divisor); + reg_value |= 0xC0; value |= 0x9c; value |= reg_value << 8; + index |= 0x80 | divisor; + index |= (uint16_t)factor << 8; - usbh_ch34x_get_baudrate_div(line_coding->dwDTERate, &factor, &divisor); - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = CH34X_SERIAL_INIT; - setup->wValue = value; - setup->wIndex = (factor << 8) | 0x80 | divisor; - setup->wLength = 0; - - return usbh_control_transfer(ch34x_class->hport, setup, NULL); + return usbh_ch34x_control_out(serial, CH34X_SERIAL_INIT, value, index); } -int usbh_ch34x_get_line_coding(struct usbh_ch34x *ch34x_class, struct cdc_line_coding *line_coding) +static int usbh_ch34x_set_line_state(struct usbh_serial *serial, bool dtr, bool rts) { - memcpy(line_coding, (uint8_t *)&ch34x_class->line_coding, sizeof(struct cdc_line_coding)); - return 0; + uint16_t value = 0; + uint8_t control = 0; + + control = (dtr << 5) | (rts << 6); + value = (uint8_t)~control; + + return usbh_ch34x_control_out(serial, CH34X_MODEM_CTRL, value, 0x0000); } -int usbh_ch34x_set_line_state(struct usbh_ch34x *ch34x_class, bool dtr, bool rts) +static int usbh_ch34x_get_modem_status(struct usbh_serial *serial) { - struct usb_setup_packet *setup; + struct usbh_ch34x *ch34x_class; + uintptr_t flags; + uint16_t status; - if (!ch34x_class || !ch34x_class->hport) { + if (!serial || !serial->hport || !serial->priv) { return -USB_ERR_INVAL; } - setup = ch34x_class->hport->setup; - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = CH34X_MODEM_CTRL; - setup->wValue = 0x0f | (dtr << 5) | (rts << 6); - setup->wIndex = 0; - setup->wLength = 0; + flags = usb_osal_enter_critical_section(); - return usbh_control_transfer(ch34x_class->hport, setup, NULL); -} + ch34x_class = (struct usbh_ch34x *)serial->priv; -static int usbh_ch34x_connect(struct usbh_hubport *hport, uint8_t intf) -{ - struct usb_endpoint_descriptor *ep_desc; - int ret = 0; + status = (ch34x_class->modem_status & CH341_CTI_DS ? USBH_SERIAL_TIOCM_DSR : 0) | + (ch34x_class->modem_status & CH341_CTI_C ? USBH_SERIAL_TIOCM_CTS : 0) | + (ch34x_class->modem_status & CH341_CTRL_RI ? USBH_SERIAL_TIOCM_RI : 0) | + (ch34x_class->modem_status & CH341_CTI_DC ? USBH_SERIAL_TIOCM_CD : 0) | + (serial->line_state & USBH_SERIAL_TIOCM_DTR ? USBH_SERIAL_TIOCM_DTR : 0) | + (serial->line_state & USBH_SERIAL_TIOCM_RTS ? USBH_SERIAL_TIOCM_RTS : 0); - struct usbh_ch34x *ch34x_class = usbh_ch34x_class_alloc(); - if (ch34x_class == NULL) { - USB_LOG_ERR("Fail to alloc ch34x_class\r\n"); - return -USB_ERR_NOMEM; - } - - ch34x_class->hport = hport; - ch34x_class->intf = intf; + usb_osal_leave_critical_section(flags); - hport->config.intf[intf].priv = ch34x_class; + return status; +} - usbh_ch34x_get_version(ch34x_class); - usbh_ch34x_flow_ctrl(ch34x_class); +#ifdef CONFIG_USBH_SERIAL_GET_MODEM_STATUS +static int __usbh_ch34x_get_modem_status(struct usbh_serial *serial, uint16_t *status) +{ + struct usbh_ch34x *ch34x_class; + uint8_t type = 0; + uint8_t data = 0; + uint16_t difference; + uintptr_t flags; + int ret; - for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { - ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; - if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { - continue; - } else { - if (ep_desc->bEndpointAddress & 0x80) { - USBH_EP_INIT(ch34x_class->bulkin, ep_desc); - } else { - USBH_EP_INIT(ch34x_class->bulkout, ep_desc); - } - } + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; } + ch34x_class = (struct usbh_ch34x *)serial->priv; - snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, ch34x_class->minor); - - USB_LOG_INFO("Register CH34X Class:%s\r\n", hport->config.intf[intf].devname); + usbh_int_urb_fill(&ch34x_class->intin_urb, serial->hport, ch34x_class->intin, &serial->iobuffer[USBH_SERIAL_INT_NOCACHE_OFFSET], ch34x_class->intin->wMaxPacketSize, 0xffffffff, NULL, NULL); + ret = usbh_submit_urb(&ch34x_class->intin_urb); + if (ret < 0) { + return ret; + } -#if 0 - USB_LOG_INFO("Test ch34x rx and tx and rx for 5 times, baudrate is 115200\r\n"); + if (ret < 4) { + return -USB_ERR_INVAL; + } - struct cdc_line_coding linecoding; - uint8_t count = 5; + flags = usb_osal_enter_critical_section(); - linecoding.dwDTERate = 115200; - linecoding.bDataBits = 8; - linecoding.bParityType = 0; - linecoding.bCharFormat = 0; - usbh_ch34x_set_line_coding(ch34x_class, &linecoding); - usbh_ch34x_set_line_state(ch34x_class, true, false); + type = serial->iobuffer[USBH_SERIAL_INT_NOCACHE_OFFSET]; + if (type & CH341_CTT_M) { + data = ~serial->iobuffer[USBH_SERIAL_INT_NOCACHE_OFFSET + 2] & CH341_CTI_ST; + difference = data ^ (ch34x_class->modem_status & CH341_CTI_ST); + ch34x_class->modem_status = data; - memset(g_ch34x_buf, 'a', sizeof(g_ch34x_buf)); - ret = usbh_ch34x_bulk_out_transfer(ch34x_class, g_ch34x_buf, sizeof(g_ch34x_buf), 0xfffffff); - USB_LOG_RAW("out ret:%d\r\n", ret); - while (count--) { - ret = usbh_ch34x_bulk_in_transfer(ch34x_class, g_ch34x_buf, sizeof(g_ch34x_buf), 0xfffffff); - USB_LOG_RAW("in ret:%d\r\n", ret); - if (ret > 0) { - for (uint32_t i = 0; i < ret; i++) { - USB_LOG_RAW("%02x ", g_ch34x_buf[i]); + if (difference) { + if (difference & CH341_CTI_C) { + serial->iocount.cts++; + } + if (difference & CH341_CTI_DS) { + serial->iocount.dsr++; + } + if (difference & CH341_CTRL_RI) { + serial->iocount.rng++; + } + if (difference & CH341_CTI_DC) { + serial->iocount.dcd++; } - USB_LOG_RAW("\r\n"); } } -#endif - usbh_ch34x_run(ch34x_class); - return ret; -} -static int usbh_ch34x_disconnect(struct usbh_hubport *hport, uint8_t intf) -{ - int ret = 0; - - struct usbh_ch34x *ch34x_class = (struct usbh_ch34x *)hport->config.intf[intf].priv; + if (type & CH341_CTT_O) { + serial->iocount.overrun++; + } + if ((type & CH341_CTT_F) == CH341_CTT_F) { + serial->iocount.frame++; + } + if (type & CH341_CTT_P) { + serial->iocount.parity++; + } - if (ch34x_class) { - if (ch34x_class->bulkin) { - usbh_kill_urb(&ch34x_class->bulkin_urb); - } + usb_osal_leave_critical_section(flags); - if (ch34x_class->bulkout) { - usbh_kill_urb(&ch34x_class->bulkout_urb); - } + return ret; +} +#endif - if (hport->config.intf[intf].devname[0] != '\0') { - usb_osal_thread_schedule_other(); - USB_LOG_INFO("Unregister CH34X Class:%s\r\n", hport->config.intf[intf].devname); - usbh_ch34x_stop(ch34x_class); - } +static const struct usbh_serial_driver ch34x_driver = { + .driver_name = "ch34x", - usbh_ch34x_class_free(ch34x_class); - } + .ignore_rx_header = 0, + .ignore_tx_header = 0, - return ret; -} + .attach = usbh_ch34x_attach, + .detach = usbh_ch34x_detach, + .set_flow_control = usbh_ch34x_set_flow_ctrl, + .set_line_coding = usbh_ch34x_set_line_coding, + .get_line_coding = NULL, + .set_line_state = usbh_ch34x_set_line_state, + .get_modem_status = usbh_ch34x_get_modem_status, +}; -int usbh_ch34x_bulk_in_transfer(struct usbh_ch34x *ch34x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +static int usbh_ch34x_connect(struct usbh_hubport *hport, uint8_t intf) { - int ret; - struct usbh_urb *urb = &ch34x_class->bulkin_urb; - - usbh_bulk_urb_fill(urb, ch34x_class->hport, ch34x_class->bulkin, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; - } - return ret; + return usbh_serial_probe(hport, intf, &ch34x_driver) ? 0 : -USB_ERR_NOMEM; } -int usbh_ch34x_bulk_out_transfer(struct usbh_ch34x *ch34x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +static int usbh_ch34x_disconnect(struct usbh_hubport *hport, uint8_t intf) { - int ret; - struct usbh_urb *urb = &ch34x_class->bulkout_urb; + struct usbh_serial *serial = (struct usbh_serial *)hport->config.intf[intf].priv; - usbh_bulk_urb_fill(urb, ch34x_class->hport, ch34x_class->bulkout, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; + if (serial) { + usbh_serial_remove(serial); } - return ret; -} -__WEAK void usbh_ch34x_run(struct usbh_ch34x *ch34x_class) -{ - (void)ch34x_class; -} - -__WEAK void usbh_ch34x_stop(struct usbh_ch34x *ch34x_class) -{ - (void)ch34x_class; + return 0; } static const uint16_t ch34x_id_table[][2] = { - { 0x1A86, 0x7523 }, + { 0x1A86, 0x7523 }, /* ch340 chip */ + { 0x1A86, 0x7522 }, /* ch340k chip */ + { 0x1A86, 0x5523 }, /* ch341 chip */ + { 0x1A86, 0xe523 }, /* ch330 chip */ + { 0x4348, 0x5523 }, /* ch340 custom chip */ { 0, 0 }, }; diff --git a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_ch34x.h b/components/drivers/usb/cherryusb/class/serial/usbh_ch34x.h similarity index 48% rename from components/drivers/usb/cherryusb/class/vendor/serial/usbh_ch34x.h rename to components/drivers/usb/cherryusb/class/serial/usbh_ch34x.h index c90bf9bda6..21e481012c 100644 --- a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_ch34x.h +++ b/components/drivers/usb/cherryusb/class/serial/usbh_ch34x.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, sakumisu + * Copyright (c) 2024 ~ 2025, sakumisu * * SPDX-License-Identifier: Apache-2.0 */ @@ -28,6 +28,11 @@ #define CH341_CTI_DC 0x08 #define CH341_CTI_ST 0x0f +#define CH341_CTT_M BIT(3) +#define CH341_CTT_F (BIT(2) | BIT(6)) +#define CH341_CTT_P BIT(2) +#define CH341_CTT_O BIT(1) + #define CH341_L_ER 0x80 #define CH341_L_ET 0x40 #define CH341_L_PS 0x38 @@ -40,35 +45,10 @@ #define CH341_L_D6 0x01 #define CH341_L_D5 0x00 -struct usbh_ch34x { - struct usbh_hubport *hport; - struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ - struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ - struct usbh_urb bulkout_urb; - struct usbh_urb bulkin_urb; - - struct cdc_line_coding line_coding; - - uint8_t intf; - uint8_t minor; - - void *user_data; -}; - #ifdef __cplusplus extern "C" { #endif -int usbh_ch34x_set_line_coding(struct usbh_ch34x *ch34x_class, struct cdc_line_coding *line_coding); -int usbh_ch34x_get_line_coding(struct usbh_ch34x *ch34x_class, struct cdc_line_coding *line_coding); -int usbh_ch34x_set_line_state(struct usbh_ch34x *ch34x_class, bool dtr, bool rts); - -int usbh_ch34x_bulk_in_transfer(struct usbh_ch34x *ch34x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); -int usbh_ch34x_bulk_out_transfer(struct usbh_ch34x *ch34x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); - -void usbh_ch34x_run(struct usbh_ch34x *ch34x_class); -void usbh_ch34x_stop(struct usbh_ch34x *ch34x_class); - #ifdef __cplusplus } #endif diff --git a/components/drivers/usb/cherryusb/class/serial/usbh_cp210x.c b/components/drivers/usb/cherryusb/class/serial/usbh_cp210x.c new file mode 100644 index 0000000000..7b240e2c33 --- /dev/null +++ b/components/drivers/usb/cherryusb/class/serial/usbh_cp210x.c @@ -0,0 +1,507 @@ +/* + * Copyright (c) 2024 ~ 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_serial.h" +#include "usbh_cp210x.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_cp210x" +#include "usb_log.h" + +struct usbh_cp210x { + uint8_t partnum; + uint32_t fw_version; + uint32_t min_speed; + uint32_t max_speed; + bool use_actual_rate; + bool no_flow_control; + bool no_event_mode; +}; + +struct cp210x_rate { + uint32_t rate; + uint32_t high; +}; + +static const struct cp210x_rate cp210x_an205_table1[] = { + { 300, 300 }, + { 600, 600 }, + { 1200, 1200 }, + { 1800, 1800 }, + { 2400, 2400 }, + { 4000, 4000 }, + { 4800, 4803 }, + { 7200, 7207 }, + { 9600, 9612 }, + { 14400, 14428 }, + { 16000, 16062 }, + { 19200, 19250 }, + { 28800, 28912 }, + { 38400, 38601 }, + { 51200, 51558 }, + { 56000, 56280 }, + { 57600, 58053 }, + { 64000, 64111 }, + { 76800, 77608 }, + { 115200, 117028 }, + { 128000, 129347 }, + { 153600, 156868 }, + { 230400, 237832 }, + { 250000, 254234 }, + { 256000, 273066 }, + { 460800, 491520 }, + { 500000, 567138 }, + { 576000, 670254 }, + { 921600, 0xffffffff } +}; + +/* + * Quantises the baud rate as per AN205 Table 1 + */ +static uint32_t cp210x_get_an205_rate(uint32_t baud) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(cp210x_an205_table1); ++i) { + if (baud <= cp210x_an205_table1[i].high) + break; + } + + return cp210x_an205_table1[i].rate; +} + +static uint32_t cp210x_get_actual_rate(uint32_t baud) +{ + unsigned int prescale = 1; + unsigned int div; + + if (baud <= 365) + prescale = 4; + + div = DIV_ROUND_CLOSEST(48000000, 2 * prescale * baud); + baud = 48000000 / (2 * prescale * div); + + return baud; +} + +static void usbh_cp210x_init_max_speed(struct usbh_serial *serial) +{ + struct usbh_cp210x *cp210x_class; + + if (!serial || !serial->hport || !serial->priv) { + return; + } + + cp210x_class = (struct usbh_cp210x *)serial->priv; + + bool use_actual_rate = false; + uint32_t min = 300; + uint32_t max; + + switch (cp210x_class->partnum) { + case CP210X_PARTNUM_CP2101: + max = 921600; + break; + case CP210X_PARTNUM_CP2102: + case CP210X_PARTNUM_CP2103: + max = 1000000; + break; + case CP210X_PARTNUM_CP2104: + use_actual_rate = true; + max = 2000000; + break; + case CP210X_PARTNUM_CP2108: + max = 2000000; + break; + case CP210X_PARTNUM_CP2105: + if (serial->intf == 0) { + use_actual_rate = true; + max = 2000000; /* ECI */ + } else { + min = 2400; + max = 921600; /* SCI */ + } + break; + case CP210X_PARTNUM_CP2102N_QFN28: + case CP210X_PARTNUM_CP2102N_QFN24: + case CP210X_PARTNUM_CP2102N_QFN20: + use_actual_rate = true; + max = 3000000; + break; + default: + max = 2000000; + break; + } + + cp210x_class->min_speed = min; + cp210x_class->max_speed = max; + cp210x_class->use_actual_rate = use_actual_rate; +} + +static int usbh_cp210x_control_out(struct usbh_serial *serial, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t size) +{ + struct usb_setup_packet *setup; + + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = bRequest; + setup->wValue = wValue; + setup->wIndex = wIndex; + setup->wLength = size; + + if (data && size) { + memcpy(serial->iobuffer, data, size); + return usbh_control_transfer(serial->hport, setup, serial->iobuffer); + } else { + return usbh_control_transfer(serial->hport, setup, NULL); + } +} + +static int usbh_cp210x_control_in(struct usbh_serial *serial, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t size) +{ + struct usb_setup_packet *setup; + int ret; + + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = bRequest; + setup->wValue = wValue; + setup->wIndex = wIndex; + setup->wLength = size; + + ret = usbh_control_transfer(serial->hport, setup, serial->iobuffer); + if (ret < 0) { + return ret; + } + memcpy(data, serial->iobuffer, size); + + return ret; +} + +static int usbh_cp210x_get_partnum(struct usbh_serial *serial) +{ + uint8_t version[3]; + struct usbh_cp210x *cp210x_class; + int ret; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + + cp210x_class = (struct usbh_cp210x *)serial->priv; + + ret = usbh_cp210x_control_in(serial, CP210X_VENDOR_SPECIFIC, CP210X_GET_PARTNUM, serial->intf, (uint8_t *)&cp210x_class->partnum, 1); + if (ret < 0) { + return ret; + } + + USB_LOG_INFO("chip partnum: 0x%02x\r\n", cp210x_class->partnum); + + switch (cp210x_class->partnum) { + case CP210X_PARTNUM_CP2102: + break; + case CP210X_PARTNUM_CP2105: + case CP210X_PARTNUM_CP2108: + ret = usbh_cp210x_control_in(serial, CP210X_VENDOR_SPECIFIC, CP210X_GET_FW_VER_2N, serial->intf, version, 3); + if (ret < 0) { + return ret; + } + cp210x_class->fw_version = version[0] << 16 | version[1] << 8 | version[2]; + break; + case CP210X_PARTNUM_CP2102N_QFN28: + case CP210X_PARTNUM_CP2102N_QFN24: + case CP210X_PARTNUM_CP2102N_QFN20: + ret = usbh_cp210x_control_in(serial, CP210X_VENDOR_SPECIFIC, CP210X_GET_FW_VER_2N, serial->intf, version, 3); + if (ret < 0) { + return ret; + } + cp210x_class->fw_version = version[0] << 16 | version[1] << 8 | version[2]; + if (cp210x_class->fw_version <= 0x10004) + cp210x_class->no_flow_control = true; + break; + default: + break; + } + return ret; +} + +static int usbh_cp210x_enable(struct usbh_serial *serial) +{ + return usbh_cp210x_control_out(serial, CP210X_IFC_ENABLE, 1, serial->intf, NULL, 0); +} + +static int usbh_cp210x_set_chars(struct usbh_serial *serial) +{ + struct cp210x_special_chars chars = { 0 }; + + return usbh_cp210x_control_out(serial, CP210X_SET_CHARS, 0, serial->intf, (uint8_t *)&chars, sizeof(struct cp210x_special_chars)); +} + +// static int usbh_cp210x_get_common_status(struct usbh_serial *serial, struct cp210x_comm_status *status) +// { +// return usbh_cp210x_control_in(serial, CP210X_GET_COMM_STATUS, 0, serial->intf, (uint8_t *)status, sizeof(struct cp210x_comm_status)); +// } + +static int usbh_cp210x_set_baudrate(struct usbh_serial *serial, uint32_t baudrate) +{ + struct usb_setup_packet *setup; + struct usbh_cp210x *cp210x_class; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + cp210x_class = (struct usbh_cp210x *)serial->priv; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CP210X_SET_BAUDRATE; + setup->wValue = 0; + setup->wIndex = serial->intf; + setup->wLength = 4; + + if (cp210x_class->use_actual_rate) + baudrate = cp210x_get_actual_rate(baudrate); + else if (baudrate < 1000000) + baudrate = cp210x_get_an205_rate(baudrate); + + memcpy(serial->iobuffer, (uint8_t *)&baudrate, 4); + return usbh_control_transfer(serial->hport, setup, serial->iobuffer); +} + +static int usbh_cp210x_set_data_format(struct usbh_serial *serial, uint8_t databits, uint8_t parity, uint8_t stopbits) +{ + struct usb_setup_packet *setup; + uint16_t value; + + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + + value = ((databits & 0x0F) << 8) | ((parity & 0x0f) << 4) | ((stopbits & 0x03) << 0); + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CP210X_SET_LINE_CTL; + setup->wValue = value; + setup->wIndex = serial->intf; + setup->wLength = 0; + + return usbh_control_transfer(serial->hport, setup, NULL); +} + +static int usbh_cp210x_attach(struct usbh_serial *serial) +{ + int ret; + + struct usbh_cp210x *cp210x_class = usb_osal_malloc(sizeof(struct usbh_cp210x)); + if (!cp210x_class) { + return -USB_ERR_NOMEM; + } + memset(cp210x_class, 0, sizeof(struct usbh_cp210x)); + serial->priv = cp210x_class; + + ret = usbh_cp210x_get_partnum(serial); + usbh_cp210x_init_max_speed(serial); + ret |= usbh_cp210x_enable(serial); + ret |= usbh_cp210x_set_chars(serial); + if (ret < 0) { + goto errout; + } + return 0; +errout: + serial->priv = NULL; + usb_osal_free(cp210x_class); + return ret; +} + +static void usbh_cp210x_detach(struct usbh_serial *serial) +{ + if (serial && serial->priv) { + serial->priv = NULL; + usb_osal_free(serial->priv); + } +} + +int usbh_cp210x_set_flow_ctrl(struct usbh_serial *serial, bool enable) +{ + struct cp210x_flow_ctl flow_ctl = { 0 }; + uint32_t flow_repl; + uint32_t ctl_hs; + int ret; + + ret = usbh_cp210x_control_in(serial, CP210X_GET_FLOW, 0, serial->intf, (uint8_t *)&flow_ctl, sizeof(struct cp210x_flow_ctl)); + if (ret < 0) { + return ret; + } + + ctl_hs = flow_ctl.lControlHandshake; + flow_repl = flow_ctl.lFlowReplace; + + ctl_hs &= ~CP210X_SERIAL_DSR_HANDSHAKE; + ctl_hs &= ~CP210X_SERIAL_DCD_HANDSHAKE; + ctl_hs &= ~CP210X_SERIAL_DSR_SENSITIVITY; + ctl_hs &= ~CP210X_SERIAL_DTR_MASK; + ctl_hs |= CP210X_SERIAL_DTR_INACTIVE; + + flow_repl &= ~CP210X_SERIAL_RTS_MASK; + flow_repl &= ~CP210X_SERIAL_AUTO_RECEIVE; + flow_repl &= ~CP210X_SERIAL_AUTO_TRANSMIT; + flow_repl |= CP210X_SERIAL_RTS_INACTIVE; + + flow_repl &= ~CP210X_SERIAL_RTS_MASK; + if (enable) { + ctl_hs |= CP210X_SERIAL_CTS_HANDSHAKE; + } else { + ctl_hs &= ~CP210X_SERIAL_CTS_HANDSHAKE; + } + flow_ctl.lControlHandshake = ctl_hs; + flow_ctl.lFlowReplace = flow_repl; + + return usbh_cp210x_control_out(serial, CP210X_SET_FLOW, 0, serial->intf, (uint8_t *)&flow_ctl, sizeof(struct cp210x_flow_ctl)); +} + +int usbh_cp210x_set_line_coding(struct usbh_serial *serial, struct cdc_line_coding *line_coding) +{ + int ret; + + ret = usbh_cp210x_set_baudrate(serial, line_coding->dwDTERate); + if (ret < 0) { + return ret; + } + return usbh_cp210x_set_data_format(serial, line_coding->bDataBits, line_coding->bParityType, line_coding->bCharFormat); +} + +int usbh_cp210x_set_line_state(struct usbh_serial *serial, bool dtr, bool rts) +{ + struct cp210x_flow_ctl flow_ctl = { 0 }; + uint32_t flow_repl; + uint32_t ctl_hs; + uint16_t control = 0; + int ret; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + + if (serial->rtscts) { + ret = usbh_cp210x_control_in(serial, CP210X_GET_FLOW, 0, serial->intf, (uint8_t *)&flow_ctl, sizeof(struct cp210x_flow_ctl)); + if (ret < 0) { + return ret; + } + ctl_hs = flow_ctl.lControlHandshake; + flow_repl = flow_ctl.lFlowReplace; + + ctl_hs &= ~CP210X_SERIAL_DTR_MASK; + if (dtr) + ctl_hs |= CP210X_SERIAL_DTR_ACTIVE; + else + ctl_hs |= CP210X_SERIAL_DTR_INACTIVE; + + flow_repl &= ~CP210X_SERIAL_RTS_MASK; + if (rts) + flow_repl |= CP210X_SERIAL_RTS_FLOW_CTL; + else + flow_repl |= CP210X_SERIAL_RTS_INACTIVE; + + flow_ctl.lControlHandshake = ctl_hs; + flow_ctl.lFlowReplace = flow_repl; + + return usbh_cp210x_control_out(serial, CP210X_SET_FLOW, 0, serial->intf, (uint8_t *)&flow_ctl, sizeof(struct cp210x_flow_ctl)); + } else { + if (dtr) { + control |= CP210X_CONTROL_DTR; + } + if (rts) { + control |= CP210X_CONTROL_RTS; + } + control |= CP210X_CONTROL_WRITE_DTR; + control |= CP210X_CONTROL_WRITE_RTS; + return usbh_cp210x_control_out(serial, CP210X_SET_MHS, control, serial->intf, NULL, 0); + } +} + +static int usbh_cp210x_get_modem_status(struct usbh_serial *serial) +{ + int ret; + uint8_t control; + uint16_t status; + + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + + ret = usbh_cp210x_control_in(serial, CP210X_GET_MDMSTS, 0, serial->intf, (uint8_t *)&control, 1); + if (ret < 0) { + return ret; + } + + status = ((control & CP210X_CONTROL_DTR) ? USBH_SERIAL_TIOCM_DTR : 0) | + ((control & CP210X_CONTROL_RTS) ? USBH_SERIAL_TIOCM_RTS : 0) | + ((control & CP210X_CONTROL_CTS) ? USBH_SERIAL_TIOCM_CTS : 0) | + ((control & CP210X_CONTROL_DSR) ? USBH_SERIAL_TIOCM_DSR : 0) | + ((control & CP210X_CONTROL_RING) ? USBH_SERIAL_TIOCM_RI : 0) | + ((control & CP210X_CONTROL_DCD) ? USBH_SERIAL_TIOCM_CD : 0); + + return status; +} + +static const struct usbh_serial_driver cp210x_driver = { + .driver_name = "cp210x", + + .ignore_rx_header = 0, + .ignore_tx_header = 0, + + .attach = usbh_cp210x_attach, + .detach = usbh_cp210x_detach, + .set_flow_control = usbh_cp210x_set_flow_ctrl, + .set_line_coding = usbh_cp210x_set_line_coding, + .get_line_coding = NULL, + .set_line_state = usbh_cp210x_set_line_state, + .get_modem_status = usbh_cp210x_get_modem_status, +}; + +static int usbh_cp210x_connect(struct usbh_hubport *hport, uint8_t intf) +{ + return usbh_serial_probe(hport, intf, &cp210x_driver) ? 0 : -USB_ERR_NOMEM; +} + +static int usbh_cp210x_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usbh_serial *serial = (struct usbh_serial *)hport->config.intf[intf].priv; + + if (serial) { + usbh_serial_remove(serial); + } + return 0; +} + +static const uint16_t cp210x_id_table[][2] = { + { 0x10C4, 0xEA60 }, + { 0, 0 }, +}; + +const struct usbh_class_driver cp210x_class_driver = { + .driver_name = "cp210x", + .connect = usbh_cp210x_connect, + .disconnect = usbh_cp210x_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info cp210x_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = 0xff, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = cp210x_id_table, + .class_driver = &cp210x_class_driver +}; \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/class/serial/usbh_cp210x.h b/components/drivers/usb/cherryusb/class/serial/usbh_cp210x.h new file mode 100644 index 0000000000..6bd0206772 --- /dev/null +++ b/components/drivers/usb/cherryusb/class/serial/usbh_cp210x.h @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2024 ~ 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_CP210X_H +#define USBH_CP210X_H + +#include "usb_cdc.h" + +/* Requests */ +#define CP210X_IFC_ENABLE 0x00 +#define CP210X_SET_BAUDDIV 0x01 +#define CP210X_GET_BAUDDIV 0x02 +#define CP210X_SET_LINE_CTL 0x03 // Set parity, data bits, stop bits +#define CP210X_GET_LINE_CTL 0x04 +#define CP210X_SET_BREAK 0x05 +#define CP210X_IMM_CHAR 0x06 +#define CP210X_SET_MHS 0x07 // Set DTR, RTS +#define CP210X_GET_MDMSTS 0x08 +#define CP210X_SET_XON 0x09 +#define CP210X_SET_XOFF 0x0A +#define CP210X_SET_EVENTMASK 0x0B +#define CP210X_GET_EVENTMASK 0x0C +#define CP210X_SET_CHAR 0x0D +#define CP210X_GET_CHARS 0x0E +#define CP210X_GET_PROPS 0x0F +#define CP210X_GET_COMM_STATUS 0x10 +#define CP210X_RESET 0x11 +#define CP210X_PURGE 0x12 +#define CP210X_SET_FLOW 0x13 +#define CP210X_GET_FLOW 0x14 +#define CP210X_EMBED_EVENTS 0x15 +#define CP210X_GET_EVENTSTATE 0x16 +#define CP210X_SET_CHARS 0x19 +#define CP210X_GET_BAUDRATE 0x1D +#define CP210X_SET_BAUDRATE 0x1E // Set baudrate +#define CP210X_VENDOR_SPECIFIC 0xFF + +/* CP210X_VENDOR_SPECIFIC values */ +#define CP210X_GET_FW_VER 0x000E +#define CP210X_READ_2NCONFIG 0x000E +#define CP210X_GET_FW_VER_2N 0x0010 +#define CP210X_READ_LATCH 0x00C2 +#define CP210X_GET_PARTNUM 0x370B +#define CP210X_GET_PORTCONFIG 0x370C +#define CP210X_GET_DEVICEMODE 0x3711 +#define CP210X_WRITE_LATCH 0x37E1 + +/* CP210X_IFC_ENABLE */ +#define CP210X_UART_ENABLE 0x0001 +#define CP210X_UART_DISABLE 0x0000 + +/* CP210X_(SET|GET)_BAUDDIV */ +#define CP210X_BAUD_RATE_GEN_FREQ 0x384000 + +/* CP210X_(SET|GET)_LINE_CTL */ +#define CP210X_BITS_DATA_MASK 0X0f00 +#define CP210X_BITS_DATA_5 0X0500 +#define CP210X_BITS_DATA_6 0X0600 +#define CP210X_BITS_DATA_7 0X0700 +#define CP210X_BITS_DATA_8 0X0800 +#define CP210X_BITS_DATA_9 0X0900 + +#define CP210X_BITS_PARITY_MASK 0x00f0 +#define CP210X_BITS_PARITY_NONE 0x0000 +#define CP210X_BITS_PARITY_ODD 0x0010 +#define CP210X_BITS_PARITY_EVEN 0x0020 +#define CP210X_BITS_PARITY_MARK 0x0030 +#define CP210X_BITS_PARITY_SPACE 0x0040 + +#define CP210X_BITS_STOP_MASK 0x000f +#define CP210X_BITS_STOP_1 0x0000 +#define CP210X_BITS_STOP_1_5 0x0001 +#define CP210X_BITS_STOP_2 0x0002 + +/* CP210X_SET_BREAK */ +#define CP210X_BREAK_ON 0x0001 +#define CP210X_BREAK_OFF 0x0000 + +/* CP210X_(SET_MHS|GET_MDMSTS) */ +#define CP210X_CONTROL_DTR 0x0001 +#define CP210X_CONTROL_RTS 0x0002 +#define CP210X_CONTROL_CTS 0x0010 +#define CP210X_CONTROL_DSR 0x0020 +#define CP210X_CONTROL_RING 0x0040 +#define CP210X_CONTROL_DCD 0x0080 +#define CP210X_CONTROL_WRITE_DTR 0x0100 +#define CP210X_CONTROL_WRITE_RTS 0x0200 + +/* CP210X_(GET|SET)_CHARS */ +struct cp210x_special_chars { + uint8_t bEofChar; + uint8_t bErrorChar; + uint8_t bBreakChar; + uint8_t bEventChar; + uint8_t bXonChar; + uint8_t bXoffChar; +}; + +/* CP210X_GET_COMM_STATUS returns these 0x13 bytes */ +struct cp210x_comm_status { + uint32_t ulErrors; + uint32_t ulHoldReasons; + uint32_t ulAmountInInQueue; + uint32_t ulAmountInOutQueue; + uint8_t bEofReceived; + uint8_t bWaitForImmediate; + uint8_t bReserved; +} __PACKED; + +/* + * CP210X_PURGE - 16 bits passed in wValue of USB request. + * SiLabs app note AN571 gives a strange description of the 4 bits: + * bit 0 or bit 2 clears the transmit queue and 1 or 3 receive. + * writing 1 to all, however, purges cp2108 well enough to avoid the hang. + */ +#define PURGE_ALL 0x000f + +/* CP210X_EMBED_EVENTS */ +#define CP210X_ESCCHAR 0xec + +#define CP210X_LSR_OVERRUN BIT(1) +#define CP210X_LSR_PARITY BIT(2) +#define CP210X_LSR_FRAME BIT(3) +#define CP210X_LSR_BREAK BIT(4) + +/* CP210X_GET_FLOW/CP210X_SET_FLOW read/write these 0x10 bytes */ +struct cp210x_flow_ctl { + uint32_t lControlHandshake; + uint32_t lFlowReplace; + uint32_t lXonLimit; + uint32_t lXoffLimit; +}; + +/* cp210x_flow_ctl::ulControlHandshake */ +#define CP210X_SERIAL_DTR_MASK (0x03 << 0) +#define CP210X_SERIAL_DTR_INACTIVE (0 << 0) +#define CP210X_SERIAL_DTR_ACTIVE (1 << 0) +#define CP210X_SERIAL_DTR_FLOW_CTL (2 << 0) +#define CP210X_SERIAL_CTS_HANDSHAKE BIT(3) +#define CP210X_SERIAL_DSR_HANDSHAKE BIT(4) +#define CP210X_SERIAL_DCD_HANDSHAKE BIT(5) +#define CP210X_SERIAL_DSR_SENSITIVITY BIT(6) + +/* cp210x_flow_ctl::ulFlowReplace */ +#define CP210X_SERIAL_AUTO_TRANSMIT BIT(0) +#define CP210X_SERIAL_AUTO_RECEIVE BIT(1) +#define CP210X_SERIAL_ERROR_CHAR BIT(2) +#define CP210X_SERIAL_NULL_STRIPPING BIT(3) +#define CP210X_SERIAL_BREAK_CHAR BIT(4) +#define CP210X_SERIAL_RTS_MASK (0x03 << 6) +#define CP210X_SERIAL_RTS_INACTIVE (0 << 6) +#define CP210X_SERIAL_RTS_ACTIVE (1 << 6) +#define CP210X_SERIAL_RTS_FLOW_CTL (2 << 6) +#define CP210X_SERIAL_XOFF_CONTINUE BIT(31) + +/* CP210X_VENDOR_SPECIFIC, CP210X_GET_DEVICEMODE call reads these 0x2 bytes. */ +struct cp210x_pin_mode { + uint8_t eci; + uint8_t sci; +}; + +#define CP210X_PIN_MODE_MODEM 0 +#define CP210X_PIN_MODE_GPIO BIT(0) + +/* Part number definitions */ +#define CP210X_PARTNUM_CP2101 0x01 +#define CP210X_PARTNUM_CP2102 0x02 +#define CP210X_PARTNUM_CP2103 0x03 +#define CP210X_PARTNUM_CP2104 0x04 +#define CP210X_PARTNUM_CP2105 0x05 +#define CP210X_PARTNUM_CP2108 0x08 +#define CP210X_PARTNUM_CP2102N_QFN28 0x20 +#define CP210X_PARTNUM_CP2102N_QFN24 0x21 +#define CP210X_PARTNUM_CP2102N_QFN20 0x22 +#define CP210X_PARTNUM_UNKNOWN 0xFF + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_CP210X_H */ diff --git a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_ftdi.c b/components/drivers/usb/cherryusb/class/serial/usbh_ftdi.c similarity index 38% rename from components/drivers/usb/cherryusb/class/vendor/serial/usbh_ftdi.c rename to components/drivers/usb/cherryusb/class/serial/usbh_ftdi.c index 4bc7f81b01..16debf37f1 100644 --- a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_ftdi.c +++ b/components/drivers/usb/cherryusb/class/serial/usbh_ftdi.c @@ -1,19 +1,34 @@ /* - * Copyright (c) 2024, sakumisu + * Copyright (c) 2024 ~ 2025, sakumisu * * SPDX-License-Identifier: Apache-2.0 */ #include "usbh_core.h" +#include "usbh_serial.h" #include "usbh_ftdi.h" -#define DEV_FORMAT "/dev/ttyUSB%d" - -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_ftdi_buf[USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; - -#define CONFIG_USBHOST_MAX_FTDI_CLASS 1 - -static struct usbh_ftdi g_ftdi_class[CONFIG_USBHOST_MAX_FTDI_CLASS]; -static uint32_t g_devinuse = 0; +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_ftdi" +#include "usb_log.h" + +enum ftdi_chip_type { + SIO, + FT232A, + FT232B, + FT2232C, + FT232R, + FT232H, + FT2232H, + FT4232H, + FT4232HA, + FT232HP, + FT233HP, + FT2232HP, + FT2233HP, + FT4232HP, + FT4233HP, + FTX, +}; static const char *ftdi_chip_name[] = { [SIO] = "SIO", /* the serial part of FT8U100AX */ @@ -34,47 +49,9 @@ static const char *ftdi_chip_name[] = { [FTX] = "FT-X", }; -static struct usbh_ftdi *usbh_ftdi_class_alloc(void) -{ - uint8_t devno; - - for (devno = 0; devno < CONFIG_USBHOST_MAX_FTDI_CLASS; devno++) { - if ((g_devinuse & (1U << devno)) == 0) { - g_devinuse |= (1U << devno); - memset(&g_ftdi_class[devno], 0, sizeof(struct usbh_ftdi)); - g_ftdi_class[devno].minor = devno; - return &g_ftdi_class[devno]; - } - } - return NULL; -} - -static void usbh_ftdi_class_free(struct usbh_ftdi *ftdi_class) -{ - uint8_t devno = ftdi_class->minor; - - if (devno < 32) { - g_devinuse &= ~(1U << devno); - } - memset(ftdi_class, 0, sizeof(struct usbh_ftdi)); -} - -/* - * Divide positive or negative dividend by positive or negative divisor - * and round to closest integer. Result is undefined for negative - * divisors if the dividend variable type is unsigned and for negative - * dividends if the divisor variable type is unsigned. - */ -#define DIV_ROUND_CLOSEST(x, divisor) ( \ - { \ - typeof(x) __x = x; \ - typeof(divisor) __d = divisor; \ - (((typeof(x))-1) > 0 || \ - ((typeof(divisor))-1) > 0 || \ - (((__x) > 0) == ((__d) > 0))) ? \ - (((__x) + ((__d) / 2)) / (__d)) : \ - (((__x) - ((__d) / 2)) / (__d)); \ - }) +struct usbh_ftdi { + enum ftdi_chip_type chip_type; +}; static uint32_t ftdi_232bm_baud_base_to_divisor(uint32_t baud, int base) { @@ -114,10 +91,10 @@ static uint32_t ftdi_2232h_baud_base_to_divisor(uint32_t baud, int base) else if (divisor == 0x4001) /* 1.5 */ divisor = 1; /* - * Set this bit to turn off a divide by 2.5 on baud rate generator - * This enables baud rates up to 12Mbaud but cannot reach below 1200 - * baud with this bit set - */ + * Set this bit to turn off a divide by 2.5 on baud rate generator + * This enables baud rates up to 12Mbaud but cannot reach below 1200 + * baud with this bit set + */ divisor |= 0x00020000; return divisor; } @@ -127,53 +104,37 @@ static uint32_t ftdi_2232h_baud_to_divisor(uint32_t baud) return ftdi_2232h_baud_base_to_divisor(baud, 120000000); } -int usbh_ftdi_reset(struct usbh_ftdi *ftdi_class) +int usbh_ftdi_reset(struct usbh_serial *serial) { struct usb_setup_packet *setup; - if (!ftdi_class || !ftdi_class->hport) { + if (!serial || !serial->hport) { return -USB_ERR_INVAL; } - setup = ftdi_class->hport->setup; + setup = serial->hport->setup; setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = SIO_RESET_REQUEST; + setup->bRequest = FTDI_SIO_RESET; setup->wValue = 0; - setup->wIndex = ftdi_class->intf; + setup->wIndex = serial->intf; setup->wLength = 0; - return usbh_control_transfer(ftdi_class->hport, setup, NULL); + return usbh_control_transfer(serial->hport, setup, NULL); } -static int usbh_ftdi_set_modem(struct usbh_ftdi *ftdi_class, uint16_t value) -{ - struct usb_setup_packet *setup; - - if (!ftdi_class || !ftdi_class->hport) { - return -USB_ERR_INVAL; - } - setup = ftdi_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = SIO_SET_MODEM_CTRL_REQUEST; - setup->wValue = value; - setup->wIndex = ftdi_class->intf; - setup->wLength = 0; - - return usbh_control_transfer(ftdi_class->hport, setup, NULL); -} - -static int usbh_ftdi_set_baudrate(struct usbh_ftdi *ftdi_class, uint32_t baudrate) +static int usbh_ftdi_set_baudrate(struct usbh_serial *serial, uint32_t baudrate) { struct usb_setup_packet *setup; + struct usbh_ftdi *ftdi_class; uint32_t div_value; uint16_t value; uint8_t baudrate_high; - if (!ftdi_class || !ftdi_class->hport) { + if (!serial || !serial->hport || !serial->priv) { return -USB_ERR_INVAL; } - setup = ftdi_class->hport->setup; + setup = serial->hport->setup; + ftdi_class = (struct usbh_ftdi *)serial->priv; switch (ftdi_class->chip_type) { case FT232B: @@ -187,6 +148,8 @@ static int usbh_ftdi_set_baudrate(struct usbh_ftdi *ftdi_class, uint32_t baudrat default: if ((baudrate <= 12000000) && (baudrate >= 1200)) { div_value = ftdi_2232h_baud_to_divisor(baudrate); + } else if (baudrate < 1200) { + div_value = ftdi_232bm_baud_to_divisor(baudrate); } else { return -USB_ERR_INVAL; } @@ -197,15 +160,15 @@ static int usbh_ftdi_set_baudrate(struct usbh_ftdi *ftdi_class, uint32_t baudrat baudrate_high = (div_value >> 16) & 0xff; setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = SIO_SET_BAUDRATE_REQUEST; + setup->bRequest = FTDI_SIO_SET_BAUDRATE; setup->wValue = value; - setup->wIndex = (baudrate_high << 8) | ftdi_class->intf; + setup->wIndex = (baudrate_high << 8) | serial->intf; setup->wLength = 0; - return usbh_control_transfer(ftdi_class->hport, setup, NULL); + return usbh_control_transfer(serial->hport, setup, NULL); } -static int usbh_ftdi_set_data_format(struct usbh_ftdi *ftdi_class, uint8_t databits, uint8_t parity, uint8_t stopbits, uint8_t isbreak) +static int usbh_ftdi_set_data_format(struct usbh_serial *serial, uint8_t databits, uint8_t parity, uint8_t stopbits, uint8_t isbreak) { /** * D0-D7 databits BITS_7=7, BITS_8=8 @@ -216,281 +179,215 @@ static int usbh_ftdi_set_data_format(struct usbh_ftdi *ftdi_class, uint8_t datab struct usb_setup_packet *setup; uint16_t value; - if (!ftdi_class || !ftdi_class->hport) { + if (!serial || !serial->hport) { return -USB_ERR_INVAL; } - setup = ftdi_class->hport->setup; + setup = serial->hport->setup; value = ((isbreak & 0x01) << 14) | ((stopbits & 0x03) << 11) | ((parity & 0x0f) << 8) | (databits & 0x0f); setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = SIO_SET_DATA_REQUEST; + setup->bRequest = FTDI_SIO_SET_DATA; setup->wValue = value; - setup->wIndex = ftdi_class->intf; + setup->wIndex = serial->intf; setup->wLength = 0; - return usbh_control_transfer(ftdi_class->hport, setup, NULL); + return usbh_control_transfer(serial->hport, setup, NULL); } -static int usbh_ftdi_set_latency_timer(struct usbh_ftdi *ftdi_class, uint16_t value) +static int usbh_ftdi_set_latency_timer(struct usbh_serial *serial, uint16_t value) { struct usb_setup_packet *setup; - if (!ftdi_class || !ftdi_class->hport) { + if (!serial || !serial->hport) { return -USB_ERR_INVAL; } - setup = ftdi_class->hport->setup; + setup = serial->hport->setup; setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = SIO_SET_LATENCY_TIMER_REQUEST; + setup->bRequest = FTDI_SIO_SET_LATENCY_TIMER; setup->wValue = value; - setup->wIndex = ftdi_class->intf; + setup->wIndex = serial->intf; setup->wLength = 0; - return usbh_control_transfer(ftdi_class->hport, setup, NULL); + return usbh_control_transfer(serial->hport, setup, NULL); } -static int usbh_ftdi_set_flow_ctrl(struct usbh_ftdi *ftdi_class, uint16_t value) +static int usbh_ftdi_attach(struct usbh_serial *serial) { - struct usb_setup_packet *setup; - - if (!ftdi_class || !ftdi_class->hport) { - return -USB_ERR_INVAL; - } - setup = ftdi_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = SIO_SET_FLOW_CTRL_REQUEST; - setup->wValue = value; - setup->wIndex = ftdi_class->intf; - setup->wLength = 0; - - return usbh_control_transfer(ftdi_class->hport, setup, NULL); -} - -static int usbh_ftdi_read_modem_status(struct usbh_ftdi *ftdi_class) -{ - struct usb_setup_packet *setup; - int ret; - - if (!ftdi_class || !ftdi_class->hport) { - return -USB_ERR_INVAL; - } - setup = ftdi_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; - setup->bRequest = SIO_POLL_MODEM_STATUS_REQUEST; - setup->wValue = 0x0000; - setup->wIndex = ftdi_class->intf; - setup->wLength = 2; - - ret = usbh_control_transfer(ftdi_class->hport, setup, g_ftdi_buf); - if (ret < 0) { - return ret; - } - memcpy(ftdi_class->modem_status, g_ftdi_buf, 2); - return ret; -} - -int usbh_ftdi_set_line_coding(struct usbh_ftdi *ftdi_class, struct cdc_line_coding *line_coding) -{ - memcpy((uint8_t *)&ftdi_class->line_coding, line_coding, sizeof(struct cdc_line_coding)); - - int ret = usbh_ftdi_set_baudrate(ftdi_class, line_coding->dwDTERate); - if (ret < 0) { - return ret; - } - return usbh_ftdi_set_data_format(ftdi_class, line_coding->bDataBits, line_coding->bParityType, line_coding->bCharFormat, 0); -} - -int usbh_ftdi_get_line_coding(struct usbh_ftdi *ftdi_class, struct cdc_line_coding *line_coding) -{ - memcpy(line_coding, (uint8_t *)&ftdi_class->line_coding, sizeof(struct cdc_line_coding)); - return 0; -} - -int usbh_ftdi_set_line_state(struct usbh_ftdi *ftdi_class, bool dtr, bool rts) -{ - int ret; - - if (dtr) { - usbh_ftdi_set_modem(ftdi_class, SIO_SET_DTR_HIGH); - } else { - usbh_ftdi_set_modem(ftdi_class, SIO_SET_DTR_LOW); - } - - if (rts) { - ret = usbh_ftdi_set_modem(ftdi_class, SIO_SET_RTS_HIGH); - } else { - ret = usbh_ftdi_set_modem(ftdi_class, SIO_SET_RTS_LOW); - } - - return ret; -} - -static int usbh_ftdi_connect(struct usbh_hubport *hport, uint8_t intf) -{ - struct usb_endpoint_descriptor *ep_desc; - int ret = 0; uint16_t version; + uint8_t chip_type; + int ret; - struct usbh_ftdi *ftdi_class = usbh_ftdi_class_alloc(); - if (ftdi_class == NULL) { - USB_LOG_ERR("Fail to alloc ftdi_class\r\n"); - return -USB_ERR_NOMEM; - } - - ftdi_class->hport = hport; - ftdi_class->intf = intf; - - hport->config.intf[intf].priv = ftdi_class; - - version = hport->device_desc.bcdDevice; + version = serial->hport->device_desc.bcdDevice; switch (version) { case 0x400: - ftdi_class->chip_type = FT232B; + chip_type = FT232B; break; case 0x500: - ftdi_class->chip_type = FT2232C; + chip_type = FT2232C; break; case 0x600: - ftdi_class->chip_type = FT232R; + chip_type = FT232R; break; case 0x700: - ftdi_class->chip_type = FT2232H; - break; - case 0x800: - ftdi_class->chip_type = FT4232H; + chip_type = FT2232H; break; case 0x900: - ftdi_class->chip_type = FT232H; + chip_type = FT232H; break; default: - USB_LOG_ERR("Unknown FTDI chip version:%04x\r\n", version); + USB_LOG_ERR("Unsupported FTDI chip version: 0x%04x\r\n", version); return -USB_ERR_NOTSUPP; } - USB_LOG_INFO("FTDI chip name:%s\r\n", ftdi_chip_name[ftdi_class->chip_type]); + USB_LOG_INFO("chip name: %s\r\n", ftdi_chip_name[chip_type]); - usbh_ftdi_reset(ftdi_class); - usbh_ftdi_set_flow_ctrl(ftdi_class, SIO_DISABLE_FLOW_CTRL); - usbh_ftdi_set_latency_timer(ftdi_class, 0x10); - usbh_ftdi_read_modem_status(ftdi_class); - USB_LOG_INFO("modem status:%02x:%02x\r\n", ftdi_class->modem_status[0], ftdi_class->modem_status[1]); - - for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { - ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + struct usbh_ftdi *ftdi_class = usb_osal_malloc(sizeof(struct usbh_ftdi)); + if (!ftdi_class) { + USB_LOG_ERR("No memory for ftdi_class\r\n"); + return -USB_ERR_NOMEM; + } + memset(ftdi_class, 0, sizeof(struct usbh_ftdi)); + serial->priv = ftdi_class; - if (ep_desc->bEndpointAddress & 0x80) { - USBH_EP_INIT(ftdi_class->bulkin, ep_desc); - } else { - USBH_EP_INIT(ftdi_class->bulkout, ep_desc); - } + ftdi_class->chip_type = chip_type; + ret = usbh_ftdi_set_latency_timer(serial, 0x10); + if (ret < 0) { + goto errout; } + return 0; +errout: + serial->priv = NULL; + usb_osal_free(ftdi_class); + return ret; +} - snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, ftdi_class->minor); +static void usbh_ftdi_detach(struct usbh_serial *serial) +{ + if (serial && serial->priv) { + serial->priv = NULL; + usb_osal_free(serial->priv); + } +} - USB_LOG_INFO("Register FTDI Class:%s\r\n", hport->config.intf[intf].devname); +static int usbh_ftdi_set_flow_ctrl(struct usbh_serial *serial, bool hardctrl) +{ + struct usb_setup_packet *setup; -#if 0 - USB_LOG_INFO("Test ftdi rx and tx and rx for 5 times, baudrate is 115200\r\n"); + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; - struct cdc_line_coding linecoding; - uint8_t count = 5; + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = FTDI_SIO_SET_FLOW_CTRL; + setup->wValue = hardctrl ? FTDI_SIO_RTS_CTS_HS : FTDI_SIO_DISABLE_FLOW_CTRL; + setup->wIndex = serial->intf; + setup->wLength = 0; - linecoding.dwDTERate = 115200; - linecoding.bDataBits = 8; - linecoding.bParityType = 0; - linecoding.bCharFormat = 0; - usbh_ftdi_set_line_coding(ftdi_class, &linecoding); - usbh_ftdi_set_line_state(ftdi_class, true, false); + return usbh_control_transfer(serial->hport, setup, NULL); +} - memset(g_ftdi_buf, 'a', sizeof(g_ftdi_buf)); - ret = usbh_ftdi_bulk_out_transfer(ftdi_class, g_ftdi_buf, sizeof(g_ftdi_buf), 0xfffffff); - USB_LOG_RAW("out ret:%d\r\n", ret); - while (count--) { - ret = usbh_ftdi_bulk_in_transfer(ftdi_class, g_ftdi_buf, sizeof(g_ftdi_buf), 0xfffffff); - USB_LOG_RAW("in ret:%d\r\n", ret); - if (ret > 0) { - for (uint32_t i = 0; i < ret; i++) { - USB_LOG_RAW("%02x ", g_ftdi_buf[i]); - } - } - USB_LOG_RAW("\r\n"); +static int usbh_ftdi_set_line_coding(struct usbh_serial *serial, struct cdc_line_coding *line_coding) +{ + int ret = usbh_ftdi_set_baudrate(serial, line_coding->dwDTERate); + if (ret < 0) { + return ret; } -#endif - usbh_ftdi_run(ftdi_class); - return ret; + return usbh_ftdi_set_data_format(serial, line_coding->bDataBits, line_coding->bParityType, line_coding->bCharFormat, 0); } -static int usbh_ftdi_disconnect(struct usbh_hubport *hport, uint8_t intf) +static int usbh_ftdi_set_line_state(struct usbh_serial *serial, bool dtr, bool rts) { - int ret = 0; - - struct usbh_ftdi *ftdi_class = (struct usbh_ftdi *)hport->config.intf[intf].priv; - - if (ftdi_class) { - if (ftdi_class->bulkin) { - usbh_kill_urb(&ftdi_class->bulkin_urb); - } + struct usb_setup_packet *setup; + uint16_t value = 0; - if (ftdi_class->bulkout) { - usbh_kill_urb(&ftdi_class->bulkout_urb); - } + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; - if (hport->config.intf[intf].devname[0] != '\0') { - usb_osal_thread_schedule_other(); - USB_LOG_INFO("Unregister FTDI Class:%s\r\n", hport->config.intf[intf].devname); - usbh_ftdi_stop(ftdi_class); - } + value = ((dtr ? FTDI_SIO_SET_DTR_HIGH : FTDI_SIO_SET_DTR_LOW) | (rts ? FTDI_SIO_SET_RTS_HIGH : FTDI_SIO_SET_RTS_LOW)); - usbh_ftdi_class_free(ftdi_class); - } + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = FTDI_SIO_SET_MODEM_CTRL; + setup->wValue = value; + setup->wIndex = serial->intf; + setup->wLength = 0; - return ret; + return usbh_control_transfer(serial->hport, setup, NULL); } -int usbh_ftdi_bulk_in_transfer(struct usbh_ftdi *ftdi_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) +static int usbh_ftdi_get_modem_status(struct usbh_serial *serial) { + struct usb_setup_packet *setup; + uint16_t status = 0; int ret; - struct usbh_urb *urb = &ftdi_class->bulkin_urb; - usbh_bulk_urb_fill(urb, ftdi_class->hport, ftdi_class->bulkin, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; } - return ret; -} -int usbh_ftdi_bulk_out_transfer(struct usbh_ftdi *ftdi_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) -{ - int ret; - struct usbh_urb *urb = &ftdi_class->bulkout_urb; + setup = serial->hport->setup; - usbh_bulk_urb_fill(urb, ftdi_class->hport, ftdi_class->bulkout, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = FTDI_SIO_GET_MODEM_STATUS; + setup->wValue = 0x0000; + setup->wIndex = serial->intf; + setup->wLength = 2; + + ret = usbh_control_transfer(serial->hport, setup, serial->iobuffer); + if (ret < 0) { + return 0; } - return ret; + + status = (serial->iobuffer[0] & FTDI_SIO_DSR_MASK ? USBH_SERIAL_TIOCM_DSR : 0) | + (serial->iobuffer[0] & FTDI_SIO_CTS_MASK ? USBH_SERIAL_TIOCM_CTS : 0) | + (serial->iobuffer[0] & FTDI_SIO_RI_MASK ? USBH_SERIAL_TIOCM_RI : 0) | + (serial->iobuffer[0] & FTDI_SIO_RLSD_MASK ? USBH_SERIAL_TIOCM_CD : 0) | + (serial->line_state & USBH_SERIAL_TIOCM_DTR ? USBH_SERIAL_TIOCM_DTR : 0) | + (serial->line_state & USBH_SERIAL_TIOCM_RTS ? USBH_SERIAL_TIOCM_RTS : 0); + + return status; } -__WEAK void usbh_ftdi_run(struct usbh_ftdi *ftdi_class) +static const struct usbh_serial_driver ftdi_driver = { + .driver_name = "ftdi", + + .ignore_rx_header = 2, + .ignore_tx_header = 0, + + .attach = usbh_ftdi_attach, + .detach = usbh_ftdi_detach, + .set_flow_control = usbh_ftdi_set_flow_ctrl, + .set_line_coding = usbh_ftdi_set_line_coding, + .get_line_coding = NULL, + .set_line_state = usbh_ftdi_set_line_state, + .get_modem_status = usbh_ftdi_get_modem_status, +}; + +static int usbh_ftdi_connect(struct usbh_hubport *hport, uint8_t intf) { - (void)ftdi_class; + return usbh_serial_probe(hport, intf, &ftdi_driver) ? 0 : -USB_ERR_NOMEM; } -__WEAK void usbh_ftdi_stop(struct usbh_ftdi *ftdi_class) +static int usbh_ftdi_disconnect(struct usbh_hubport *hport, uint8_t intf) { - (void)ftdi_class; + struct usbh_serial *serial = (struct usbh_serial *)hport->config.intf[intf].priv; + + if (serial) { + usbh_serial_remove(serial); + } + return 0; } static const uint16_t ftdi_id_table[][2] = { { 0x0403, 0x6001 }, { 0x0403, 0x6010 }, + { 0x0403, 0x6014 }, { 0, 0 }, }; diff --git a/components/drivers/usb/cherryusb/class/serial/usbh_ftdi.h b/components/drivers/usb/cherryusb/class/serial/usbh_ftdi.h new file mode 100644 index 0000000000..0d176299ee --- /dev/null +++ b/components/drivers/usb/cherryusb/class/serial/usbh_ftdi.h @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2024 ~ 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_FTDI_H +#define USBH_FTDI_H + +#include "usb_cdc.h" + +#define FTDI_VID 0x0403 /* Vendor Id */ + +/* FTDI device PIDs */ +#define FTDI_8U232AM_PID 0x6001 /* Similar device to SIO above */ +#define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */ +#define FTDI_8U2232C_PID 0x6010 /* Dual channel device */ +#define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */ +#define FTDI_232H_PID 0x6014 /* Single channel hi-speed device */ +#define FTDI_FTX_PID 0x6015 /* FT-X series (FT201X, FT230X, FT231X, etc) */ +#define FTDI_FT2233HP_PID 0x6040 /* Dual channel hi-speed device with PD */ +#define FTDI_FT4233HP_PID 0x6041 /* Quad channel hi-speed device with PD */ +#define FTDI_FT2232HP_PID 0x6042 /* Dual channel hi-speed device with PD */ +#define FTDI_FT4232HP_PID 0x6043 /* Quad channel hi-speed device with PD */ +#define FTDI_FT233HP_PID 0x6044 /* Dual channel hi-speed device with PD */ +#define FTDI_FT232HP_PID 0x6045 /* Dual channel hi-speed device with PD */ +#define FTDI_FT4232HA_PID 0x6048 /* Quad channel automotive grade hi-speed device */ +#define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */ +#define FTDI_232RL_PID 0xFBFA /* Product ID for FT232RL */ + +/* Requests */ +#define FTDI_SIO_RESET 0x00 /* Reset the port */ +#define FTDI_SIO_SET_MODEM_CTRL 0x01 /* Set the modem control register */ +#define FTDI_SIO_SET_FLOW_CTRL 0x02 /* Set flow control register */ +#define FTDI_SIO_SET_BAUDRATE 0x03 /* Set baud rate */ +#define FTDI_SIO_SET_DATA 0x04 /* Set the data characteristics of the port */ +#define FTDI_SIO_GET_MODEM_STATUS 0x05 +#define FTDI_SIO_SET_EVENT_CHAR 0x06 +#define FTDI_SIO_SET_ERROR_CHAR 0x07 +#define FTDI_SIO_SET_LATENCY_TIMER 0x09 +#define FTDI_SIO_GET_LATENCY_TIMER 0x0A +#define FTDI_SIO_SET_BITMODE 0x0B +#define FTDI_SIO_READ_PINS 0x0C +#define FTDI_SIO_READ_EEPROM 0x90 +#define FTDI_SIO_WRITE_EEPROM 0x91 +#define FTDI_SIO_ERASE_EEPROM 0x92 + +/* Channel indices for FT2232, FT2232H and FT4232H devices */ +#define FTDI_SIO_CHANNEL_A 1 +#define FTDI_SIO_CHANNEL_B 2 +#define FTDI_SIO_CHANNEL_C 3 +#define FTDI_SIO_CHANNEL_D 4 + +/* + * BmRequestType: 0100 0000B + * bRequest: FTDI_SIO_RESET + * wValue: Control Value + * 0 = Reset SIO + * 1 = Purge RX buffer + * 2 = Purge TX buffer + * wIndex: Port + * wLength: 0 + * Data: None + * + * The Reset SIO command has this effect: + * + * Sets flow control set to 'none' + * Event char = $0D + * Event trigger = disabled + * Purge RX buffer + * Purge TX buffer + * Clear DTR + * Clear RTS + * baud and data format not reset + * + * The Purge RX and TX buffer commands affect nothing except the buffers + * + */ + +#define FTDI_SIO_RESET_SIO 0 +#define FTDI_SIO_RESET_PURGE_RX 1 +#define FTDI_SIO_RESET_PURGE_TX 2 + +/* + * BmRequestType: 0100 0000B + * bRequest: FTDI_SIO_SET_BAUDRATE + * wValue: BaudDivisor value - see below + * wIndex: Port + * wLength: 0 + * Data: None + * The BaudDivisor values are calculated as follows: + * - BaseClock is either 12000000 or 48000000 depending on the device. + * FIXME: I wish I knew how to detect old chips to select proper base clock! + * - BaudDivisor is a fixed point number encoded in a funny way. + * (--WRONG WAY OF THINKING--) + * BaudDivisor is a fixed point number encoded with following bit weighs: + * (-2)(-1)(13..0). It is a radical with a denominator of 4, so values + * end with 0.0 (00...), 0.25 (10...), 0.5 (01...), and 0.75 (11...). + * (--THE REALITY--) + * The both-bits-set has quite different meaning from 0.75 - the chip + * designers have decided it to mean 0.125 instead of 0.75. + * This info looked up in FTDI application note "FT8U232 DEVICES \ Data Rates + * and Flow Control Consideration for USB to RS232". + * - BaudDivisor = (BaseClock / 16) / BaudRate, where the (=) operation should + * automagically re-encode the resulting value to take fractions into + * consideration. + * As all values are integers, some bit twiddling is in order: + * BaudDivisor = (BaseClock / 16 / BaudRate) | + * (((BaseClock / 2 / BaudRate) & 4) ? 0x4000 // 0.5 + * : ((BaseClock / 2 / BaudRate) & 2) ? 0x8000 // 0.25 + * : ((BaseClock / 2 / BaudRate) & 1) ? 0xc000 // 0.125 + * : 0) + * + * For the FT232BM, a 17th divisor bit was introduced to encode the multiples + * of 0.125 missing from the FT8U232AM. Bits 16 to 14 are coded as follows + * (the first four codes are the same as for the FT8U232AM, where bit 16 is + * always 0): + * 000 - add .000 to divisor + * 001 - add .500 to divisor + * 010 - add .250 to divisor + * 011 - add .125 to divisor + * 100 - add .375 to divisor + * 101 - add .625 to divisor + * 110 - add .750 to divisor + * 111 - add .875 to divisor + * Bits 15 to 0 of the 17-bit divisor are placed in the urb value. Bit 16 is + * placed in bit 0 of the urb index. + * + * Note that there are a couple of special cases to support the highest baud + * rates. If the calculated divisor value is 1, this needs to be replaced with + * 0. Additionally for the FT232BM, if the calculated divisor value is 0x4001 + * (1.5), this needs to be replaced with 0x0001 (1) (but this divisor value is + * not supported by the FT8U232AM). + */ + +enum ftdi_sio_baudrate { + ftdi_sio_b300 = 0, + ftdi_sio_b600 = 1, + ftdi_sio_b1200 = 2, + ftdi_sio_b2400 = 3, + ftdi_sio_b4800 = 4, + ftdi_sio_b9600 = 5, + ftdi_sio_b19200 = 6, + ftdi_sio_b38400 = 7, + ftdi_sio_b57600 = 8, + ftdi_sio_b115200 = 9 +}; + +/* + * BmRequestType: 0100 0000B + * bRequest: FTDI_SIO_SET_DATA + * wValue: Data characteristics (see below) + * wIndex: Port + * wLength: 0 + * Data: No + * + * Data characteristics + * + * B0..7 Number of data bits + * B8..10 Parity + * 0 = None + * 1 = Odd + * 2 = Even + * 3 = Mark + * 4 = Space + * B11..13 Stop Bits + * 0 = 1 + * 1 = 1.5 + * 2 = 2 + * B14 + * 1 = TX ON (break) + * 0 = TX OFF (normal state) + * B15 Reserved + * + */ + +#define FTDI_SIO_SET_DATA_PARITY_NONE (0x0 << 8) +#define FTDI_SIO_SET_DATA_PARITY_ODD (0x1 << 8) +#define FTDI_SIO_SET_DATA_PARITY_EVEN (0x2 << 8) +#define FTDI_SIO_SET_DATA_PARITY_MARK (0x3 << 8) +#define FTDI_SIO_SET_DATA_PARITY_SPACE (0x4 << 8) +#define FTDI_SIO_SET_DATA_STOP_BITS_1 (0x0 << 11) +#define FTDI_SIO_SET_DATA_STOP_BITS_15 (0x1 << 11) +#define FTDI_SIO_SET_DATA_STOP_BITS_2 (0x2 << 11) +#define FTDI_SIO_SET_BREAK (0x1 << 14) + +/* + * BmRequestType: 0100 0000B + * bRequest: FTDI_SIO_MODEM_CTRL + * wValue: ControlValue (see below) + * wIndex: Port + * wLength: 0 + * Data: None + * + * NOTE: If the device is in RTS/CTS flow control, the RTS set by this + * command will be IGNORED without an error being returned + * Also - you can not set DTR and RTS with one control message + * + * ControlValue + * B0 DTR state + * 0 = reset + * 1 = set + * B1 RTS state + * 0 = reset + * 1 = set + * B2..7 Reserved + * B8 DTR state enable + * 0 = ignore + * 1 = use DTR state + * B9 RTS state enable + * 0 = ignore + * 1 = use RTS state + * B10..15 Reserved + * + */ + +#define FTDI_SIO_SET_DTR_MASK 0x1 +#define FTDI_SIO_SET_DTR_HIGH ((FTDI_SIO_SET_DTR_MASK << 8) | 1) +#define FTDI_SIO_SET_DTR_LOW ((FTDI_SIO_SET_DTR_MASK << 8) | 0) +#define FTDI_SIO_SET_RTS_MASK 0x2 +#define FTDI_SIO_SET_RTS_HIGH ((FTDI_SIO_SET_RTS_MASK << 8) | 2) +#define FTDI_SIO_SET_RTS_LOW ((FTDI_SIO_SET_RTS_MASK << 8) | 0) + +/* + * BmRequestType: 0100 0000b + * bRequest: FTDI_SIO_SET_FLOW_CTRL + * wValue: Xoff/Xon + * wIndex: Protocol/Port - hIndex is protocol / lIndex is port + * wLength: 0 + * Data: None + * + * hIndex protocol is: + * B0 Output handshaking using RTS/CTS + * 0 = disabled + * 1 = enabled + * B1 Output handshaking using DTR/DSR + * 0 = disabled + * 1 = enabled + * B2 Xon/Xoff handshaking + * 0 = disabled + * 1 = enabled + * + * A value of zero in the hIndex field disables handshaking + * + * If Xon/Xoff handshaking is specified, the hValue field should contain the + * XOFF character and the lValue field contains the XON character. + */ + +#define FTDI_SIO_DISABLE_FLOW_CTRL 0x0 +#define FTDI_SIO_RTS_CTS_HS (0x1 << 8) +#define FTDI_SIO_DTR_DSR_HS (0x2 << 8) +#define FTDI_SIO_XON_XOFF_HS (0x4 << 8) + +/* + * BmRequestType: 1100 0000b + * bRequest: FTDI_SIO_GET_MODEM_STATUS + * wValue: zero + * wIndex: Port + * wLength: 1 + * Data: Status + * + * One byte of data is returned + * B0..3 0 + * B4 CTS + * 0 = inactive + * 1 = active + * B5 DSR + * 0 = inactive + * 1 = active + * B6 Ring Indicator (RI) + * 0 = inactive + * 1 = active + * B7 Receive Line Signal Detect (RLSD) + * 0 = inactive + * 1 = active + */ + +#define FTDI_SIO_CTS_MASK 0x10 +#define FTDI_SIO_DSR_MASK 0x20 +#define FTDI_SIO_RI_MASK 0x40 +#define FTDI_SIO_RLSD_MASK 0x80 + +/* Possible bitmodes for FTDI_SIO_SET_BITMODE_REQUEST */ +#define FTDI_SIO_BITMODE_RESET 0x00 +#define FTDI_SIO_BITMODE_CBUS 0x20 + +/* + * IN Endpoint + * + * The device reserves the first two bytes of data on this endpoint to contain + * the current values of the modem and line status registers. In the absence of + * data, the device generates a message consisting of these two status bytes + * every 40 ms + * + * Byte 0: Modem Status + * + * Offset Description + * B0 Reserved - must be 1 + * B1 Reserved - must be 0 + * B2 Reserved - must be 0 + * B3 Reserved - must be 0 + * B4 Clear to Send (CTS) + * B5 Data Set Ready (DSR) + * B6 Ring Indicator (RI) + * B7 Receive Line Signal Detect (RLSD) + * + * Byte 1: Line Status + * + * Offset Description + * B0 Data Ready (DR) + * B1 Overrun Error (OE) + * B2 Parity Error (PE) + * B3 Framing Error (FE) + * B4 Break Interrupt (BI) + * B5 Transmitter Holding Register (THRE) + * B6 Transmitter Empty (TEMT) + * B7 Error in RCVR FIFO + * + */ +#define FTDI_RS0_CTS (1 << 4) +#define FTDI_RS0_DSR (1 << 5) +#define FTDI_RS0_RI (1 << 6) +#define FTDI_RS0_RLSD (1 << 7) + +#define FTDI_RS_DR 1 +#define FTDI_RS_OE (1 << 1) +#define FTDI_RS_PE (1 << 2) +#define FTDI_RS_FE (1 << 3) +#define FTDI_RS_BI (1 << 4) +#define FTDI_RS_THRE (1 << 5) +#define FTDI_RS_TEMT (1 << 6) +#define FTDI_RS_FIFO (1 << 7) + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_FTDI_H */ diff --git a/components/drivers/usb/cherryusb/class/serial/usbh_gsm.c b/components/drivers/usb/cherryusb/class/serial/usbh_gsm.c new file mode 100644 index 0000000000..6341873660 --- /dev/null +++ b/components/drivers/usb/cherryusb/class/serial/usbh_gsm.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_serial.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_gsm" +#include "usb_log.h" + +struct usbh_gsm { + struct usb_endpoint_descriptor *intin; + struct usbh_urb intin_urb; + struct usb_osal_timer *modem_timer; + uint16_t modem_status; +}; + +static int usbh_gsm_attach(struct usbh_serial *serial) +{ + struct usb_endpoint_descriptor *ep_desc; + + struct usbh_gsm *gsm_class = usb_osal_malloc(sizeof(struct usbh_gsm)); + if (!gsm_class) { + USB_LOG_ERR("No memory for gsm_class\r\n"); + return -USB_ERR_NOMEM; + } + memset(gsm_class, 0, sizeof(struct usbh_gsm)); + serial->priv = gsm_class; + + for (uint8_t i = 0; i < serial->hport->config.intf[serial->intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &serial->hport->config.intf[serial->intf].altsetting[0].ep[i].ep_desc; + + if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(gsm_class->intin, ep_desc); + break; + } else { + } + } + } + + if (!gsm_class->intin) { + USB_LOG_WRN("Do not find interrupt endpoint, so disable modem status monitor\r\n"); + } + return 0; +} + +static void usbh_gsm_detach(struct usbh_serial *serial) +{ + struct usbh_gsm *gsm_class; + + if (!serial || !serial->priv) { + return; + } + + gsm_class = (struct usbh_gsm *)serial->priv; + if (gsm_class->intin) { + usbh_kill_urb(&gsm_class->intin_urb); + } + serial->priv = NULL; + usb_osal_free(gsm_class); +} + +static int usbh_gsm_set_line_coding(struct usbh_serial *serial, struct cdc_line_coding *line_coding) +{ + return 0; +} + +static int usbh_gsm_set_line_state(struct usbh_serial *serial, bool dtr, bool rts) +{ + return 0; +} + +static const struct usbh_serial_driver gsm_driver = { + .driver_name = "gsm", + + .ignore_rx_header = 0, + .ignore_tx_header = 0, + + .attach = usbh_gsm_attach, + .detach = usbh_gsm_detach, + .set_flow_control = NULL, + .set_line_coding = usbh_gsm_set_line_coding, + .get_line_coding = NULL, + .set_line_state = usbh_gsm_set_line_state, + .get_modem_status = NULL, +}; + +static int usbh_gsm_connect(struct usbh_hubport *hport, uint8_t intf) +{ + return usbh_serial_probe(hport, intf, &gsm_driver) ? 0 : -USB_ERR_NOMEM; +} + +static int usbh_gsm_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usbh_serial *serial = (struct usbh_serial *)hport->config.intf[intf].priv; + + if (serial) { + usbh_serial_remove(serial); + } + return 0; +} + +const struct usbh_class_driver gsm_class_driver = { + .driver_name = "gsm", + .connect = usbh_gsm_connect, + .disconnect = usbh_gsm_disconnect +}; + +static const uint16_t gsm_id_table[][2] = { + { 0x2C7C, 0x0120 }, /* Quectel EC20 */ + { 0x2C7C, 0x0121 }, /* Quectel EC21 */ + { 0x2C7C, 0x0125 }, /* Quectel EC25 */ + { 0x2C7C, 0x0191 }, /* Quectel EG91 */ + { 0x2C7C, 0x0195 }, /* Quectel EG95 */ + { 0x2C7C, 0x6002 }, /* Quectel EC200/EC600/EC800/EG91x */ + { 0x1E0E, 0x9001 }, /* SIMCOM SIM7600 */ + { 0x2ECC, 0x3012 }, /* Chinamobile ML307R */ + { 0, 0 }, +}; + +CLASS_INFO_DEFINE const struct usbh_class_info gsm_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = 0xff, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = gsm_id_table, + .class_driver = &gsm_class_driver +}; diff --git a/components/drivers/usb/cherryusb/class/serial/usbh_pl2303.c b/components/drivers/usb/cherryusb/class/serial/usbh_pl2303.c new file mode 100644 index 0000000000..062f8128fd --- /dev/null +++ b/components/drivers/usb/cherryusb/class/serial/usbh_pl2303.c @@ -0,0 +1,726 @@ +/* + * Copyright (c) 2024 ~ 2025, sakumisu + * Copyright (c) 2024, Derek Konigsberg + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_serial.h" +#include "usbh_pl2303.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_pl2303" +#include "usb_log.h" + +#define UART_STATE_INDEX 8 +#define UART_STATE_MSR_MASK 0x8b +#define UART_STATE_TRANSIENT_MASK 0x74 +#define UART_DCD 0x01 +#define UART_DSR 0x02 +#define UART_BREAK_ERROR 0x04 +#define UART_RING 0x08 +#define UART_FRAME_ERROR 0x10 +#define UART_PARITY_ERROR 0x20 +#define UART_OVERRUN_ERROR 0x40 +#define UART_CTS 0x80 + +struct pl2303_type_data { + const char *name; + uint32_t max_baud_rate; + unsigned long quirks; + unsigned int no_autoxonxoff : 1; + unsigned int no_divisors : 1; + unsigned int alt_divisors : 1; +}; + +enum pl2303_type { + TYPE_H, + TYPE_HX, + TYPE_TA, + TYPE_TB, + TYPE_HXD, + TYPE_HXN, + TYPE_COUNT +}; + +struct usbh_pl2303 { + enum pl2303_type chip_type; + uint32_t quirks; + struct usb_endpoint_descriptor *intin; + struct usbh_urb intin_urb; + struct usb_osal_timer *modem_timer; + uint16_t modem_status; +}; + +static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = { + [TYPE_H] = { + .name = "PL2303H", + .max_baud_rate = 1228800, + .quirks = PL2303_QUIRK_LEGACY, + .no_autoxonxoff = true, + }, + [TYPE_HX] = { + .name = "PL2303HX", + .max_baud_rate = 6000000, + }, + [TYPE_TA] = { + .name = "PL2303TA", + .max_baud_rate = 6000000, + .alt_divisors = true, + }, + [TYPE_TB] = { + .name = "PL2303TB", + .max_baud_rate = 12000000, + .alt_divisors = true, + }, + [TYPE_HXD] = { + .name = "PL2303HXD", + .max_baud_rate = 12000000, + }, + [TYPE_HXN] = { + .name = "PL2303G", + .max_baud_rate = 12000000, + .no_divisors = true, + }, +}; + +/* + * Returns the nearest supported baud rate that can be set directly without + * using divisors. + */ +static uint32_t pl2303_get_supported_baud_rate(uint32_t baud) +{ + static const uint32_t baud_sup[] = { + 75, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, + 14400, 19200, 28800, 38400, 57600, 115200, 230400, 460800, + 614400, 921600, 1228800, 2457600, 3000000, 6000000 + }; + + unsigned i; + + for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) { + if (baud_sup[i] > baud) + break; + } + + if (i == ARRAY_SIZE(baud_sup)) + baud = baud_sup[i - 1]; + else if (i > 0 && (baud_sup[i] - baud) > (baud - baud_sup[i - 1])) + baud = baud_sup[i - 1]; + else + baud = baud_sup[i]; + + return baud; +} + +/* + * NOTE: If unsupported baud rates are set directly, the PL2303 seems to + * use 9600 baud. + */ +static uint32_t pl2303_encode_baud_rate_direct(unsigned char buf[4], + uint32_t baud) +{ + memcpy(buf, &baud, 4); + + return baud; +} + +static uint32_t pl2303_encode_baud_rate_divisor_alt(unsigned char buf[4], + uint32_t baud) +{ + unsigned int baseline, mantissa, exponent; + + /* + * Apparently, for the TA version the formula is: + * baudrate = 12M * 32 / (mantissa * 2^exponent) + * where + * mantissa = buf[10:0] + * exponent = buf[15:13 16] + */ + baseline = 12000000 * 32; + mantissa = baseline / baud; + if (mantissa == 0) + mantissa = 1; /* Avoid dividing by zero if baud > 32*12M. */ + exponent = 0; + while (mantissa >= 2048) { + if (exponent < 15) { + mantissa >>= 1; /* divide by 2 */ + exponent++; + } else { + /* Exponent is maxed. Trim mantissa and leave. */ + mantissa = 2047; + break; + } + } + + buf[3] = 0x80; + buf[2] = exponent & 0x01; + buf[1] = (exponent & ~0x01) << 4 | mantissa >> 8; + buf[0] = mantissa & 0xff; + + /* Calculate and return the exact baud rate. */ + baud = (baseline / mantissa) >> exponent; + + return baud; +} + +static uint32_t pl2303_encode_baud_rate_divisor(unsigned char buf[4], + uint32_t baud) +{ + unsigned int baseline, mantissa, exponent; + + /* + * Apparently the formula is: + * baudrate = 12M * 32 / (mantissa * 4^exponent) + * where + * mantissa = buf[8:0] + * exponent = buf[11:9] + */ + baseline = 12000000 * 32; + mantissa = baseline / baud; + if (mantissa == 0) + mantissa = 1; /* Avoid dividing by zero if baud > 32*12M. */ + exponent = 0; + while (mantissa >= 512) { + if (exponent < 7) { + mantissa >>= 2; /* divide by 4 */ + exponent++; + } else { + /* Exponent is maxed. Trim mantissa and leave. */ + mantissa = 511; + break; + } + } + + buf[3] = 0x80; + buf[2] = 0; + buf[1] = exponent << 1 | mantissa >> 8; + buf[0] = mantissa & 0xff; + + /* Calculate and return the exact baud rate. */ + baud = (baseline / mantissa) >> (exponent << 1); + + return baud; +} + +static int pl2303_vendor_write(struct usbh_serial *serial, uint16_t wValue, uint16_t wIndex) +{ + struct usb_setup_packet *setup; + struct usbh_pl2303 *pl2303_class; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + pl2303_class = (struct usbh_pl2303 *)serial->priv; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = pl2303_class->chip_type == TYPE_HXN ? PL2303_VENDOR_WRITE_NREQUEST : PL2303_VENDOR_WRITE_REQUEST; + setup->wValue = wValue; + setup->wIndex = wIndex; + setup->wLength = 0; + + return usbh_control_transfer(serial->hport, setup, NULL); +} + +static int pl2303_vendor_read(struct usbh_serial *serial, uint16_t wValue, uint8_t *data) +{ + struct usb_setup_packet *setup; + struct usbh_pl2303 *pl2303_class; + int ret; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + pl2303_class = (struct usbh_pl2303 *)serial->priv; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = pl2303_class->chip_type == TYPE_HXN ? PL2303_VENDOR_READ_NREQUEST : PL2303_VENDOR_READ_REQUEST; + setup->wValue = wValue; + setup->wIndex = 0; + setup->wLength = 1; + + ret = usbh_control_transfer(serial->hport, setup, serial->iobuffer); + if (ret < 0) { + return ret; + } + memcpy(data, serial->iobuffer, 1); + + return ret; +} + +static bool pl2303_supports_hx_status(struct usbh_serial *serial) +{ + int ret; + uint8_t buf; + + ret = pl2303_vendor_read(serial, PL2303_READ_TYPE_HX_STATUS, &buf); + if (ret < 0) { + return false; + } + + return true; +} + +static bool pl2303_is_hxd_clone(struct usbh_serial *serial) +{ + struct usb_setup_packet *setup; + int ret; + + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_DEVICE; + setup->bRequest = CDC_REQUEST_GET_LINE_CODING; + setup->wValue = 0; + setup->wIndex = 0; + setup->wLength = 7; + + ret = usbh_control_transfer(serial->hport, setup, serial->iobuffer); + if (ret < 0) { + return false; + } + return true; +} + +static int pl2303_update_reg(struct usbh_serial *serial, uint8_t reg, uint8_t mask, uint8_t val) +{ + int ret; + uint8_t buf[1]; + struct usbh_pl2303 *pl2303_class; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + + pl2303_class = (struct usbh_pl2303 *)serial->priv; + + if (pl2303_class->chip_type == TYPE_HXN) + ret = pl2303_vendor_read(serial, reg, buf); + else + ret = pl2303_vendor_read(serial, reg | 0x80, buf); + + if (ret < 0) { + return ret; + } + + *buf &= ~mask; + *buf |= val & mask; + + return pl2303_vendor_write(serial, reg, *buf); +} + +static int usbh_pl2303_get_chiptype(struct usbh_serial *serial) +{ + if (serial->hport->device_desc.bDeviceClass == 0x02) { + return TYPE_H; /* variant 0 */ + } + + if (serial->hport->device_desc.bMaxPacketSize0 != 0x40) { + if (serial->hport->device_desc.bDeviceClass == 0x00 || serial->hport->device_desc.bDeviceClass == 0xff) + return TYPE_H; /* variant 1 */ + + return TYPE_H; /* variant 0 */ + } + + switch (serial->hport->device_desc.bcdUSB) { + case 0x101: + /* USB 1.0.1? Let's assume they meant 1.1... */ + case 0x110: + switch (serial->hport->device_desc.bcdDevice) { + case 0x300: + return TYPE_HX; + case 0x400: + return TYPE_HXD; + default: + return TYPE_HX; + } + break; + case 0x200: + switch (serial->hport->device_desc.bcdDevice) { + case 0x100: /* GC */ + case 0x105: + return TYPE_HXN; + case 0x300: /* GT / TA */ + if (pl2303_supports_hx_status(serial)) + return TYPE_TA; + __attribute__((fallthrough)); + case 0x305: + case 0x400: /* GL */ + case 0x405: + return TYPE_HXN; + case 0x500: /* GE / TB */ + if (pl2303_supports_hx_status(serial)) + return TYPE_TB; + __attribute__((fallthrough)); + case 0x505: + case 0x600: /* GS */ + case 0x605: + case 0x700: /* GR */ + case 0x705: + case 0x905: /* GT-2AB */ + case 0x1005: /* GC-Q20 */ + return TYPE_HXN; + } + break; + } + + USB_LOG_ERR("Unsupported PL2303 Device\r\n"); + return -USB_ERR_NOTSUPP; +} + +static int usbh_pl2303_attach(struct usbh_serial *serial) +{ + struct usbh_pl2303 *pl2303_class; + struct usb_endpoint_descriptor *ep_desc; + uint8_t type; + int ret; + + ret = usbh_pl2303_get_chiptype(serial); + if (ret < 0) { + return ret; + } + + pl2303_class = usb_osal_malloc(sizeof(struct usbh_pl2303)); + if (pl2303_class == NULL) { + USB_LOG_ERR("Fail to alloc pl2303_class\r\n"); + return -USB_ERR_NOMEM; + } + memset(pl2303_class, 0, sizeof(struct usbh_pl2303)); + serial->priv = pl2303_class; + + for (uint8_t i = 0; i < serial->hport->config.intf[serial->intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &serial->hport->config.intf[serial->intf].altsetting[0].ep[i].ep_desc; + + if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(pl2303_class->intin, ep_desc); + break; + } else { + } + } + } + + if (!pl2303_class->intin) { + USB_LOG_ERR("Failed to find interrupt endpoint\r\n"); + ret = -USB_ERR_NODEV; + goto errout; + } + + type = (uint8_t)ret; + pl2303_class->chip_type = type; + pl2303_class->quirks = pl2303_type_data[pl2303_class->chip_type].quirks; + + USB_LOG_INFO("chip type: %s\r\n", pl2303_type_data[pl2303_class->chip_type].name); + + if (type == TYPE_HXD && pl2303_is_hxd_clone(serial)) { + pl2303_class->quirks |= PL2303_QUIRK_NO_BREAK_GETLINE; + } + + if (type != TYPE_HXN) { + uint8_t buf[1]; + ret = pl2303_vendor_read(serial, 0x8484, buf); + ret |= pl2303_vendor_write(serial, 0x0404, 0); + ret |= pl2303_vendor_read(serial, 0x8484, buf); + ret |= pl2303_vendor_read(serial, 0x8383, buf); + ret |= pl2303_vendor_read(serial, 0x8484, buf); + ret |= pl2303_vendor_write(serial, 0x0404, 1); + ret |= pl2303_vendor_read(serial, 0x8484, buf); + ret |= pl2303_vendor_read(serial, 0x8383, buf); + ret |= pl2303_vendor_write(serial, 0, 1); + ret |= pl2303_vendor_write(serial, 1, 0); + if (pl2303_class->quirks & PL2303_QUIRK_LEGACY) + ret |= pl2303_vendor_write(serial, 2, 0x24); + else + ret |= pl2303_vendor_write(serial, 2, 0x44); + } else { + ret = 0; + } + + if (ret < 0) { + USB_LOG_ERR("pl2303 init failed\r\n"); + goto errout; + } + + return 0; +errout: + serial->priv = NULL; + usb_osal_free(pl2303_class); + return ret; +} + +static void usbh_pl2303_detach(struct usbh_serial *serial) +{ + struct usbh_pl2303 *pl2303_class; + + if (!serial || !serial->priv) { + return; + } + + pl2303_class = (struct usbh_pl2303 *)serial->priv; + if (pl2303_class->intin) { + usbh_kill_urb(&pl2303_class->intin_urb); + } + serial->priv = NULL; + usb_osal_free(pl2303_class); +} + +static int usbh_pl2303_set_flow_ctrl(struct usbh_serial *serial, bool hardctrl) +{ + struct usbh_pl2303 *pl2303_class; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + + pl2303_class = (struct usbh_pl2303 *)serial->priv; + + if (hardctrl) { + if (pl2303_class->quirks & PL2303_QUIRK_LEGACY) { + return pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0x40); + } else if (pl2303_class->chip_type == TYPE_HXN) { + return pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG, + PL2303_HXN_FLOWCTRL_MASK, + PL2303_HXN_FLOWCTRL_RTS_CTS); + } else { + return pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0x60); + } + } else { + if (pl2303_class->chip_type == TYPE_HXN) { + return pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG, + PL2303_HXN_FLOWCTRL_MASK, + PL2303_HXN_FLOWCTRL_NONE); + } else { + return pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0); + } + } +} + +static int usbh_pl2303_set_line_coding(struct usbh_serial *serial, struct cdc_line_coding *line_coding) +{ + struct usb_setup_packet *setup; + struct usbh_pl2303 *pl2303_class; + uint32_t baud; + uint32_t baud_sup; + uint8_t buf[7]; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + + setup = serial->hport->setup; + pl2303_class = (struct usbh_pl2303 *)serial->priv; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SET_LINE_CODING; + setup->wValue = 0; + setup->wIndex = serial->intf; + setup->wLength = 7; + + baud = line_coding->dwDTERate; + if (pl2303_type_data[pl2303_class->chip_type].max_baud_rate) { + baud = MIN(baud, pl2303_type_data[pl2303_class->chip_type].max_baud_rate); + } + /* + * Use direct method for supported baud rates, otherwise use divisors. + * Newer chip types do not support divisor encoding. + */ + if (pl2303_type_data[pl2303_class->chip_type].no_divisors) + baud_sup = baud; + else + baud_sup = pl2303_get_supported_baud_rate(baud); + + if (baud == baud_sup) + baud = pl2303_encode_baud_rate_direct(buf, baud); + else if (pl2303_type_data[pl2303_class->chip_type].alt_divisors) + baud = pl2303_encode_baud_rate_divisor_alt(buf, baud); + else + baud = pl2303_encode_baud_rate_divisor(buf, baud); + + buf[4] = line_coding->bCharFormat; + buf[5] = line_coding->bParityType; + buf[6] = line_coding->bDataBits; + + memcpy(serial->iobuffer, buf, sizeof(struct cdc_line_coding)); + + return usbh_control_transfer(serial->hport, setup, serial->iobuffer); +} + +static int usbh_pl2303_get_line_coding(struct usbh_serial *serial, struct cdc_line_coding *line_coding) +{ + struct usb_setup_packet *setup; + int ret; + + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_GET_LINE_CODING; + setup->wValue = 0; + setup->wIndex = serial->intf; + setup->wLength = 7; + + ret = usbh_control_transfer(serial->hport, setup, serial->iobuffer); + if (ret < 0) { + return ret; + } + memcpy(line_coding, serial->iobuffer, sizeof(struct cdc_line_coding)); + return ret; +} + +static int usbh_pl2303_set_line_state(struct usbh_serial *serial, bool dtr, bool rts) +{ + struct usb_setup_packet *setup; + + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + setup = serial->hport->setup; + + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = CDC_REQUEST_SET_CONTROL_LINE_STATE; + setup->wValue = (dtr << 0) | (rts << 1); + setup->wIndex = serial->intf; + setup->wLength = 0; + + return usbh_control_transfer(serial->hport, setup, NULL); +} + +static int usbh_pl2303_get_modem_status(struct usbh_serial *serial) +{ + struct usbh_pl2303 *pl2303_class; + uintptr_t flags; + uint16_t status; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + + flags = usb_osal_enter_critical_section(); + pl2303_class = (struct usbh_pl2303 *)serial->priv; + + status = (pl2303_class->modem_status & UART_DSR ? USBH_SERIAL_TIOCM_DSR : 0) | + (pl2303_class->modem_status & UART_CTS ? USBH_SERIAL_TIOCM_CTS : 0) | + (pl2303_class->modem_status & UART_RING ? USBH_SERIAL_TIOCM_RI : 0) | + (pl2303_class->modem_status & UART_DCD ? USBH_SERIAL_TIOCM_CD : 0) | + (serial->line_state & USBH_SERIAL_TIOCM_DTR ? USBH_SERIAL_TIOCM_DTR : 0) | + (serial->line_state & USBH_SERIAL_TIOCM_RTS ? USBH_SERIAL_TIOCM_RTS : 0); + + usb_osal_leave_critical_section(flags); + + return status; +} + +#ifdef CONFIG_USBH_SERIAL_GET_MODEM_STATUS +static int __usbh_pl2303_get_modem_status(struct usbh_serial *serial) +{ + struct usbh_pl2303 *pl2303_class; + uint8_t status = 0; + uint16_t difference; + uintptr_t flags; + int ret; + + if (!serial || !serial->hport || !serial->priv) { + return -USB_ERR_INVAL; + } + pl2303_class = (struct usbh_pl2303 *)serial->priv; + + usbh_int_urb_fill(&pl2303_class->intin_urb, serial->hport, pl2303_class->intin, &serial->iobuffer[USBH_SERIAL_INT_NOCACHE_OFFSET], pl2303_class->intin->wMaxPacketSize, 0xffffffff, NULL, NULL); + ret = usbh_submit_urb(&pl2303_class->intin_urb); + if (ret < 0) { + return ret; + } + + if (ret < 1) { + return -USB_ERR_INVAL; + } + + flags = usb_osal_enter_critical_section(); + + status = serial->iobuffer[USBH_SERIAL_INT_NOCACHE_OFFSET]; + difference = pl2303_class->modem_status ^ status; + pl2303_class->modem_status = status; + + if (status & UART_BREAK_ERROR) + serial->iocount.brk++; + + if (difference & UART_STATE_MSR_MASK) { + if (difference & UART_CTS) + serial->iocount.cts++; + if (difference & UART_DSR) + serial->iocount.dsr++; + if (difference & UART_RING) + serial->iocount.rng++; + if (difference & UART_DCD) { + serial->iocount.dcd++; + } + } + + usb_osal_leave_critical_section(flags); + + return ret; +} +#endif + +static const struct usbh_serial_driver pl2303_driver = { + .driver_name = "pl2303", + + .ignore_rx_header = 0, + .ignore_tx_header = 0, + + .attach = usbh_pl2303_attach, + .detach = usbh_pl2303_detach, + .set_flow_control = usbh_pl2303_set_flow_ctrl, + .set_line_coding = usbh_pl2303_set_line_coding, + .get_line_coding = usbh_pl2303_get_line_coding, + .set_line_state = usbh_pl2303_set_line_state, + .get_modem_status = usbh_pl2303_get_modem_status, +}; + +static int usbh_pl2303_connect(struct usbh_hubport *hport, uint8_t intf) +{ + return usbh_serial_probe(hport, intf, &pl2303_driver) ? 0 : -USB_ERR_NOMEM; +} + +static int usbh_pl2303_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + struct usbh_serial *serial = (struct usbh_serial *)hport->config.intf[intf].priv; + + if (serial) { + usbh_serial_remove(serial); + } + + return 0; +} + +static const uint16_t pl2303_id_table[][2] = { + { 0x067B, 0x2303 }, // PL2303 Serial (ATEN/IOGEAR UC232A) + { 0x067B, 0x2304 }, // PL2303HXN Serial, type TB + { 0x067B, 0x23A3 }, // PL2303HXN Serial, type GC + { 0x067B, 0x23B3 }, // PL2303HXN Serial, type GB + { 0x067B, 0x23C3 }, // PL2303HXN Serial, type GT + { 0x067B, 0x23D3 }, // PL2303HXN Serial, type GL + { 0x067B, 0x23E3 }, // PL2303HXN Serial, type GE + { 0x067B, 0x23F3 }, // PL2303HXN Serial, type GS + { 0, 0 }, +}; + +const struct usbh_class_driver pl2303_class_driver = { + .driver_name = "pl2303", + .connect = usbh_pl2303_connect, + .disconnect = usbh_pl2303_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info pl2303_class_info = { + .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = 0xff, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = pl2303_id_table, + .class_driver = &pl2303_class_driver +}; \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/class/serial/usbh_pl2303.h b/components/drivers/usb/cherryusb/class/serial/usbh_pl2303.h new file mode 100644 index 0000000000..83391c1649 --- /dev/null +++ b/components/drivers/usb/cherryusb/class/serial/usbh_pl2303.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2024 ~ 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_PL2303_H +#define USBH_PL2303_H + +#include "usb_cdc.h" + +#define PL2303_VENDOR_WRITE_REQUEST 0x01 +#define PL2303_VENDOR_WRITE_NREQUEST 0x80 +#define PL2303_VENDOR_READ_REQUEST 0x01 +#define PL2303_VENDOR_READ_NREQUEST 0x81 + +#define PL2303_FLOWCTRL_MASK 0xf0 + +#define PL2303_READ_TYPE_HX_STATUS 0x8080 + +#define PL2303_HXN_RESET_REG 0x07 +#define PL2303_HXN_RESET_UPSTREAM_PIPE 0x02 +#define PL2303_HXN_RESET_DOWNSTREAM_PIPE 0x01 + +#define PL2303_HXN_FLOWCTRL_REG 0x0a +#define PL2303_HXN_FLOWCTRL_MASK 0x1c +#define PL2303_HXN_FLOWCTRL_NONE 0x1c +#define PL2303_HXN_FLOWCTRL_RTS_CTS 0x18 +#define PL2303_HXN_FLOWCTRL_XON_XOFF 0x0c + +#define PL2303_QUIRK_UART_STATE_IDX0 BIT(0) +#define PL2303_QUIRK_LEGACY BIT(1) +#define PL2303_QUIRK_ENDPOINT_HACK BIT(2) +#define PL2303_QUIRK_NO_BREAK_GETLINE BIT(3) + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_PL2303_H */ diff --git a/components/drivers/usb/cherryusb/class/serial/usbh_serial.c b/components/drivers/usb/cherryusb/class/serial/usbh_serial.c new file mode 100644 index 0000000000..d6361b211a --- /dev/null +++ b/components/drivers/usb/cherryusb/class/serial/usbh_serial.c @@ -0,0 +1,743 @@ +/* + * Copyright (c) 2025, sakumisu + * Copyright (c) 2025, MDLZCOOL + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbh_core.h" +#include "usbh_serial.h" + +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbh_serial" +#include "usb_log.h" + +#define DEV_FORMAT_VENDOR "/dev/ttyUSB%d" +#define DEV_FORMAT_CDC_ACM "/dev/ttyACM%d" + +#define CONFIG_USBHOST_MAX_SERIAL_CLASS 4 + +static struct usbh_serial g_serial_class[CONFIG_USBHOST_MAX_SERIAL_CLASS]; + +static uint32_t g_devinuse = 0; +static uint32_t g_cdcacm_devinuse = 0; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_serial_iobuffer[CONFIG_USBHOST_MAX_SERIAL_CLASS][USB_ALIGN_UP((USBH_SERIAL_RX2_NOCACHE_OFFSET + USBH_SERIAL_RX2_NOCACHE_SIZE), CONFIG_USB_ALIGN_SIZE)]; + +/* refer to cherryrb */ +static int usbh_serial_ringbuffer_init(usbh_serial_ringbuf_t *rb, void *pool, uint32_t size) +{ + if (NULL == rb) { + return -1; + } + + if (NULL == pool) { + return -1; + } + + if ((size < 2) || (size & (size - 1))) { + return -1; + } + + rb->in = 0; + rb->out = 0; + rb->mask = size - 1; + rb->pool = pool; + + return 0; +} + +static void usbh_serial_ringbuffer_reset(usbh_serial_ringbuf_t *rb) +{ + rb->in = 0; + rb->out = 0; +} + +static uint32_t usbh_serial_ringbuffer_get_used(usbh_serial_ringbuf_t *rb) +{ + return rb->in - rb->out; +} + +static uint32_t usbh_serial_ringbuffer_write(usbh_serial_ringbuf_t *rb, void *data, uint32_t size) +{ + uint32_t unused; + uint32_t offset; + uint32_t remain; + + unused = (rb->mask + 1) - (rb->in - rb->out); + + if (size > unused) { + size = unused; + } + + offset = rb->in & rb->mask; + + remain = rb->mask + 1 - offset; + remain = remain > size ? size : remain; + + memcpy(((uint8_t *)(rb->pool)) + offset, data, remain); + memcpy(rb->pool, (uint8_t *)data + remain, size - remain); + + rb->in += size; + + return size; +} + +static uint32_t usbh_serial_ringbuffer_peek(usbh_serial_ringbuf_t *rb, void *data, uint32_t size) +{ + uint32_t used; + uint32_t offset; + uint32_t remain; + + used = rb->in - rb->out; + if (size > used) { + size = used; + } + + offset = rb->out & rb->mask; + + remain = rb->mask + 1 - offset; + remain = remain > size ? size : remain; + + memcpy(data, ((uint8_t *)(rb->pool)) + offset, remain); + memcpy((uint8_t *)data + remain, rb->pool, size - remain); + + return size; +} + +static uint32_t usbh_serial_ringbuffer_read(usbh_serial_ringbuf_t *rb, void *data, uint32_t size) +{ + size = usbh_serial_ringbuffer_peek(rb, data, size); + rb->out += size; + return size; +} + +static struct usbh_serial *usbh_serial_alloc(bool is_cdcacm) +{ + uint8_t devno; + uint8_t devno2; + + for (devno = 0; devno < CONFIG_USBHOST_MAX_SERIAL_CLASS; devno++) { + if ((g_devinuse & (1U << devno)) == 0) { + g_devinuse |= (1U << devno); + memset(&g_serial_class[devno], 0, sizeof(struct usbh_serial)); + g_serial_class[devno].minor = devno; + g_serial_class[devno].cdc_minor = -1; + g_serial_class[devno].iobuffer = g_serial_iobuffer[devno]; + g_serial_class[devno].rx_complete_sem = usb_osal_sem_create(0); + + if (is_cdcacm) { + for (devno2 = 0; devno2 < CONFIG_USBHOST_MAX_SERIAL_CLASS; devno2++) { + if ((g_cdcacm_devinuse & (1U << devno2)) == 0) { + g_cdcacm_devinuse |= (1U << devno2); + g_serial_class[devno].cdc_minor = devno2; + return &g_serial_class[devno]; + } + } + + g_devinuse &= ~(1U << devno); + return NULL; + } else { + return &g_serial_class[devno]; + } + } + } + return NULL; +} + +static void usbh_serial_free(struct usbh_serial *serial) +{ + uint8_t devno = serial->minor; + if (devno < 32) { + g_devinuse &= ~(1U << devno); + } + + if (serial->cdc_minor >= 0) { + g_cdcacm_devinuse &= ~(1U << serial->cdc_minor); + } + + if (g_serial_class[devno].rx_complete_sem) { + usb_osal_sem_delete(g_serial_class[devno].rx_complete_sem); + } +} + +static void usbh_serial_callback(void *arg, int nbytes) +{ + struct usbh_serial *serial = (struct usbh_serial *)arg; + int ret; + + if (nbytes < 0) { + if (nbytes != -USB_ERR_SHUTDOWN) { + USB_LOG_ERR("serial transfer error: %d\n", nbytes); + } + serial->rx_errorcode = nbytes; + usb_osal_sem_give(serial->rx_complete_sem); + return; + } + + if (nbytes < serial->driver->ignore_rx_header) { + USB_LOG_ERR("serial rx short packet: %d\n", nbytes); + serial->rx_errorcode = -USB_ERR_IO; + usb_osal_sem_give(serial->rx_complete_sem); + return; + } + + if (nbytes >= serial->driver->ignore_rx_header) { + /* resubmit the read urb */ + usbh_bulk_urb_fill(&serial->bulkin_urb, serial->hport, serial->bulkin, &serial->iobuffer[serial->rx_buf_index ? USBH_SERIAL_RX_NOCACHE_OFFSET : USBH_SERIAL_RX2_NOCACHE_OFFSET], serial->bulkin->wMaxPacketSize, + 0, usbh_serial_callback, serial); + ret = usbh_submit_urb(&serial->bulkin_urb); + if (ret < 0) { + USB_LOG_ERR("serial submit failed: %d\n", ret); + serial->rx_errorcode = ret; + usb_osal_sem_give(serial->rx_complete_sem); + return; + } + + usbh_serial_ringbuffer_write(&serial->rx_rb, + &serial->iobuffer[(serial->rx_buf_index ? USBH_SERIAL_RX2_NOCACHE_OFFSET : USBH_SERIAL_RX_NOCACHE_OFFSET) + serial->driver->ignore_rx_header], + (nbytes - serial->driver->ignore_rx_header)); + + if (serial->rx_complete_callback) { + serial->rx_complete_callback(serial, nbytes - serial->driver->ignore_rx_header); + } + serial->rx_buf_index ^= 1; + serial->rx_errorcode = 0; + usb_osal_sem_give(serial->rx_complete_sem); + } +} + +struct usbh_serial *usbh_serial_probe(struct usbh_hubport *hport, uint8_t intf, + const struct usbh_serial_driver *driver) +{ + struct usb_endpoint_descriptor *ep_desc; + struct usbh_serial *serial; + bool is_cdcacm = false; + int ret; + + if (strcmp(driver->driver_name, "cdc_acm") == 0) { + is_cdcacm = true; + } + + serial = usbh_serial_alloc(is_cdcacm); + if (serial == NULL) { + USB_LOG_ERR("Fail to alloc serial class\r\n"); + return NULL; + } + + serial->hport = hport; + serial->intf = intf; + serial->driver = driver; + + if (driver->attach) { + ret = driver->attach(serial); + if (ret < 0) { + USB_LOG_ERR("Serial attach failed: %d\r\n", ret); + usbh_serial_free(serial); + return NULL; + } + } + + if (is_cdcacm) { + intf = intf + 1; /* data interface */ + } + + for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { + ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; + + if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_BULK) { + if (ep_desc->bEndpointAddress & 0x80) { + USBH_EP_INIT(serial->bulkin, ep_desc); + } else { + USBH_EP_INIT(serial->bulkout, ep_desc); + } + } + } + + if (is_cdcacm) { + intf = intf - 1; /* data interface */ + } + + if (!serial->bulkin || !serial->bulkout) { + USB_LOG_ERR("Serial bulk in/out endpoint not found\r\n"); + usbh_serial_free(serial); + return NULL; + } + + if (is_cdcacm) { + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT_CDC_ACM, serial->cdc_minor); + } else { + snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT_VENDOR, serial->minor); + } + + hport->config.intf[intf].priv = serial; + USB_LOG_INFO("Register Serial Class: %s (%s)\r\n", hport->config.intf[intf].devname, driver->driver_name); + + usbh_serial_run(serial); + + return serial; +} + +void usbh_serial_remove(struct usbh_serial *serial) +{ + if (!serial || !serial->hport) + return; + + usbh_serial_close(serial); + + if (serial->driver && serial->driver->detach) { + serial->driver->detach(serial); + } + + if (serial->hport->config.intf[serial->intf].priv) { + usb_osal_thread_schedule_other(); + USB_LOG_INFO("Unregister Serial Class: %s (%s)\r\n", serial->hport->config.intf[serial->intf].devname, serial->driver->driver_name); + usbh_serial_stop(serial); + } + + usbh_serial_free(serial); +} + +struct usbh_serial *usbh_serial_open(const char *devname, uint32_t open_flags) +{ + struct usbh_serial *serial; + int ret; + + serial = usbh_find_class_instance(devname); + if (!serial) { + return NULL; + } + + if (serial->ref_count != 0) { + USB_LOG_ERR("Device busy: %s\r\n", devname); + return NULL; + } + + if (serial && serial->driver && serial->driver->open) { + ret = serial->driver->open(serial); + if (ret < 0) { + return NULL; + } + } + + usbh_serial_ringbuffer_init(&serial->rx_rb, serial->rx_rb_pool, CONFIG_USBHOST_SERIAL_RX_SIZE); + + serial->ref_count++; + serial->open_flags = open_flags; + + return serial; +} + +int usbh_serial_close(struct usbh_serial *serial) +{ + if (!serial || !serial->hport) { + return -USB_ERR_INVAL; + } + + if (serial->ref_count == 0) { + return 0; + } + + if (serial->bulkin) { + usbh_kill_urb(&serial->bulkin_urb); + } + if (serial->bulkout) { + usbh_kill_urb(&serial->bulkout_urb); + } + + if (serial && serial->driver && serial->driver->set_flow_control && serial->rtscts) { + serial->driver->set_flow_control(serial, false); + } + + if (serial && serial->driver && serial->driver->close) { + serial->driver->close(serial); + } + + serial->ref_count--; + serial->rtscts = false; + + return 0; +} + +static int usbh_serial_tiocmset(struct usbh_serial *serial, uint32_t set, uint32_t clear) +{ + int ret; + uint16_t line_state; + bool dtr; + bool rts; + + if (!serial || !serial->hport || !serial->hport->connected) { + return -USB_ERR_INVAL; + } + + if (serial->ref_count == 0) { + return -USB_ERR_NODEV; + } + + line_state = serial->line_state; + clear &= ~set; /* 'set' takes precedence over 'clear' */ + + if (set & USBH_SERIAL_TIOCM_DTR) { + line_state |= USBH_SERIAL_TIOCM_DTR; + } + if (set & USBH_SERIAL_TIOCM_RTS) { + line_state |= USBH_SERIAL_TIOCM_RTS; + } + if (clear & USBH_SERIAL_TIOCM_DTR) { + line_state &= ~USBH_SERIAL_TIOCM_DTR; + } + if (clear & USBH_SERIAL_TIOCM_RTS) { + line_state &= ~USBH_SERIAL_TIOCM_RTS; + } + + dtr = (line_state & USBH_SERIAL_TIOCM_DTR) ? true : false; + rts = (line_state & USBH_SERIAL_TIOCM_RTS) ? true : false; + + if (serial && serial->driver && serial->driver->set_line_state) { + ret = serial->driver->set_line_state(serial, dtr, rts); + } else { + return -USB_ERR_NOTSUPP; + } + serial->line_state = line_state; + + return ret; +} + +int usbh_serial_control(struct usbh_serial *serial, int cmd, void *arg) +{ + int ret; + + if (!serial || !serial->hport || !serial->hport->connected) { + return -USB_ERR_INVAL; + } + + if (serial->ref_count == 0) { + return -USB_ERR_NODEV; + } + + switch (cmd) { + case USBH_SERIAL_CMD_SET_ATTR: { + struct usbh_serial_termios *termios = (struct usbh_serial_termios *)arg; + struct cdc_line_coding line_coding; + + line_coding.dwDTERate = termios->baudrate; + line_coding.bCharFormat = termios->stopbits; + line_coding.bParityType = termios->parity; + line_coding.bDataBits = termios->databits; + + if (serial->bulkin) { + usbh_kill_urb(&serial->bulkin_urb); + } + if (serial->bulkout) { + usbh_kill_urb(&serial->bulkout_urb); + } + + if (serial && serial->driver && serial->driver->set_line_coding) { + ret = serial->driver->set_line_coding(serial, &line_coding); + if (ret < 0) { + return ret; + } + } else { + return -USB_ERR_NOTSUPP; + } + + memcpy(&serial->line_coding, &line_coding, sizeof(struct cdc_line_coding)); + + if (serial && serial->driver && serial->driver->set_flow_control) { + ret = serial->driver->set_flow_control(serial, termios->rtscts); + } + + serial->rtscts = termios->rtscts; + serial->rx_timeout_ms = termios->rx_timeout; + + ret = usbh_serial_tiocmset(serial, USBH_SERIAL_TIOCM_DTR | USBH_SERIAL_TIOCM_RTS, 0); + if (ret < 0) { + return ret; + } + + usbh_serial_ringbuffer_reset(&serial->rx_rb); + usb_osal_sem_reset(serial->rx_complete_sem); + serial->rx_buf_index = 0; + usbh_bulk_urb_fill(&serial->bulkin_urb, serial->hport, serial->bulkin, &serial->iobuffer[serial->rx_buf_index ? USBH_SERIAL_RX2_NOCACHE_OFFSET : USBH_SERIAL_RX_NOCACHE_OFFSET], serial->bulkin->wMaxPacketSize, + 0, usbh_serial_callback, serial); + ret = usbh_submit_urb(&serial->bulkin_urb); + + return ret; + } break; + case USBH_SERIAL_CMD_GET_ATTR: { + struct usbh_serial_termios *termios = (struct usbh_serial_termios *)arg; + struct cdc_line_coding line_coding; + + if (serial && serial->driver && serial->driver->get_line_coding) { + return serial->driver->get_line_coding(serial, &line_coding); + } else { + memcpy(&line_coding, &serial->line_coding, sizeof(struct cdc_line_coding)); + } + + termios->baudrate = line_coding.dwDTERate; + termios->stopbits = line_coding.bCharFormat; + termios->parity = line_coding.bParityType; + termios->databits = line_coding.bDataBits; + termios->rtscts = serial->rtscts; + termios->rx_timeout = serial->rx_timeout_ms; + return 0; + } break; + case USBH_SERIAL_CMD_IOCMBIS: { + uint32_t flags = *(uint32_t *)arg; + + return usbh_serial_tiocmset(serial, flags, 0); + } break; + case USBH_SERIAL_CMD_IOCMBIC: { + uint32_t flags = *(uint32_t *)arg; + + return usbh_serial_tiocmset(serial, 0, flags); + } break; + case USBH_SERIAL_CMD_TIOCMSET: { + uint32_t flags = *(uint32_t *)arg; + + uint32_t set = 0; + uint32_t clear = 0; + + set |= (flags & USBH_SERIAL_TIOCM_DTR) ? USBH_SERIAL_TIOCM_DTR : 0; + set |= (flags & USBH_SERIAL_TIOCM_RTS) ? USBH_SERIAL_TIOCM_RTS : 0; + clear |= !(flags & USBH_SERIAL_TIOCM_DTR) ? USBH_SERIAL_TIOCM_DTR : 0; + clear |= !(flags & USBH_SERIAL_TIOCM_RTS) ? USBH_SERIAL_TIOCM_RTS : 0; + + return usbh_serial_tiocmset(serial, set, clear); + } break; + case USBH_SERIAL_CMD_TIOCMGET: { + uint32_t *flags = (uint32_t *)arg; + int status; + + if (serial && serial->driver && serial->driver->get_modem_status) { + status = serial->driver->get_modem_status(serial); + if (status < 0) { + return status; + } + } else { + return -USB_ERR_NOTSUPP; + } + *flags = status; + } break; + default: + break; + } + + return -USB_ERR_NOTSUPP; +} + +int usbh_serial_write(struct usbh_serial *serial, const void *buffer, uint32_t buflen) +{ + int ret; + struct usbh_urb *urb; + + if (!serial || !serial->hport || !serial->hport->connected || !serial->bulkout) { + return -USB_ERR_INVAL; + } + + if (serial->ref_count == 0) { + return -USB_ERR_NODEV; + } + + urb = &serial->bulkout_urb; + + usbh_bulk_urb_fill(urb, serial->hport, serial->bulkout, (uint8_t *)buffer, buflen, 0xffffffff, NULL, NULL); + ret = usbh_submit_urb(urb); + if (ret == 0) { + ret = urb->actual_length; + } + return ret; +} + +int usbh_serial_read(struct usbh_serial *serial, void *buffer, uint32_t buflen) +{ + int ret; + + if (!serial || !serial->hport || !serial->hport->connected || !serial->bulkin || !serial->line_coding.dwDTERate) { + return -USB_ERR_INVAL; + } + + if (serial->ref_count == 0) { + return -USB_ERR_NODEV; + } + + if (serial->open_flags & USBH_SERIAL_O_NONBLOCK) { + return usbh_serial_ringbuffer_read(&serial->rx_rb, buffer, buflen); + } else { + if (usbh_serial_ringbuffer_get_used(&serial->rx_rb) == 0) { + ret = usb_osal_sem_take(serial->rx_complete_sem, serial->rx_timeout_ms == 0 ? USB_OSAL_WAITING_FOREVER : serial->rx_timeout_ms); + if (ret < 0) { + return ret; + } + if (serial->rx_errorcode < 0) { + return serial->rx_errorcode; + } + } + return usbh_serial_ringbuffer_read(&serial->rx_rb, buffer, buflen); + } +} + +int usbh_serial_cdc_write_async(struct usbh_serial *serial, uint8_t *buffer, uint32_t buflen, usbh_complete_callback_t complete, void *arg) +{ + struct usbh_urb *urb; + + if (!serial || !serial->hport || !serial->hport->connected || !serial->bulkout || !complete || serial->line_coding.dwDTERate) { + return -USB_ERR_INVAL; + } + + if (serial->ref_count == 0) { + return -USB_ERR_NODEV; + } + + urb = &serial->bulkout_urb; + + usbh_bulk_urb_fill(urb, serial->hport, serial->bulkout, buffer, buflen, + 0, complete, serial); + return usbh_submit_urb(urb); +} + +int usbh_serial_cdc_read_async(struct usbh_serial *serial, uint8_t *buffer, uint32_t buflen, usbh_complete_callback_t complete, void *arg) +{ + struct usbh_urb *urb; + + if (!serial || !serial->hport || !serial->hport->connected || !serial->bulkin || !complete || serial->line_coding.dwDTERate) { + return -USB_ERR_INVAL; + } + + if (serial->ref_count == 0) { + return -USB_ERR_NODEV; + } + + if (buflen % serial->bulkin->wMaxPacketSize) { + return -USB_ERR_INVAL; + } + + urb = &serial->bulkin_urb; + + usbh_bulk_urb_fill(urb, serial->hport, serial->bulkin, buffer, MIN(buflen, serial->bulkin->wMaxPacketSize), + 0, complete, serial); + return usbh_submit_urb(urb); +} + +void usbh_serial_help(void) +{ + USB_LOG_RAW("USB host serial test\r\n" + "Usage: usbh_serial [options]...\r\n" + "\r\n" + "-b set serial baudrate\r\n" + "-t set rts and dtr\r\n" + "-w string write string\r\n" + "-r read data and dump\r\n" + "-x close serial device\r\n" + "\r\n"); +} + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_serial_testbuffer[512]; + +int usbh_serial(int argc, char **argv) +{ + static struct usbh_serial *serial; + int ret; + + if (argc < 3) { + usbh_serial_help(); + return 0; + } + + if (serial) { + if (!serial->hport || !serial->hport->connected) { + serial = NULL; + } + } + + if (!serial) { + serial = usbh_serial_open(argv[1], USBH_SERIAL_O_RDWR | USBH_SERIAL_O_NONBLOCK); + if (!serial) { + USB_LOG_ERR("Fail to open serial device: %s\r\n", argv[1]); + return -USB_ERR_INVAL; + } + } + + if (strncmp(argv[2], "-b", 2) == 0 && argc >= 4) { + struct usbh_serial_termios termios; + + memset(&termios, 0, sizeof(termios)); + termios.baudrate = atoi(argv[3]); + termios.stopbits = 0; + termios.parity = 0; + termios.databits = 8; + termios.rtscts = false; + termios.rx_timeout = 0; + usbh_serial_control(serial, USBH_SERIAL_CMD_SET_ATTR, &termios); + } else if (strncmp(argv[2], "-t", 2) == 0 && argc >= 5) { + uint32_t flags; + + flags = atoi(argv[3]) ? USBH_SERIAL_TIOCM_DTR : 0; + flags |= atoi(argv[4]) ? USBH_SERIAL_TIOCM_RTS : 0; + + usbh_serial_control(serial, USBH_SERIAL_CMD_TIOCMSET, &flags); + USB_LOG_INFO("Set DTR: %d, RTS: %d\r\n", atoi(argv[3]), atoi(argv[4])); + } else if (strncmp(argv[2], "-w", 2) == 0 && argc >= 4) { + memcpy(g_serial_testbuffer, argv[3], MIN(strlen(argv[3]), sizeof(g_serial_testbuffer))); + uint32_t len = snprintf((char *)g_serial_testbuffer, sizeof(g_serial_testbuffer), "%s\r\n", argv[3]); + ret = usbh_serial_write(serial, g_serial_testbuffer, len); + if (ret >= 0) { + USB_LOG_INFO("Write %d bytes\r\n", ret); + } else { + USB_LOG_ERR("Write failed: %d\r\n", ret); + } + } else if (strncmp(argv[2], "-r", 2) == 0) { + ret = usbh_serial_read(serial, g_serial_testbuffer, sizeof(g_serial_testbuffer)); + if (ret >= 0) { + usb_hexdump(g_serial_testbuffer, ret); + USB_LOG_INFO("Read %d bytes\r\n", ret); + } else { + USB_LOG_ERR("Read failed: %d\r\n", ret); + } + } else if (strncmp(argv[2], "-x", 2) == 0) { + usbh_serial_close(serial); + serial = NULL; + } else { + usbh_serial_help(); + } + + return 0; +} + +__WEAK void usbh_serial_run(struct usbh_serial *serial) +{ + (void)serial; +} + +__WEAK void usbh_serial_stop(struct usbh_serial *serial) +{ + (void)serial; +} + +static int usbh_cdc_data_connect(struct usbh_hubport *hport, uint8_t intf) +{ + (void)hport; + (void)intf; + return 0; +} + +static int usbh_cdc_data_disconnect(struct usbh_hubport *hport, uint8_t intf) +{ + (void)hport; + (void)intf; + return 0; +} + +const struct usbh_class_driver cdc_data_class_driver = { + .driver_name = "cdc_data", + .connect = usbh_cdc_data_connect, + .disconnect = usbh_cdc_data_disconnect +}; + +CLASS_INFO_DEFINE const struct usbh_class_info cdc_data_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS, + .bInterfaceClass = USB_DEVICE_CLASS_CDC_DATA, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .id_table = NULL, + .class_driver = &cdc_data_class_driver +}; \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/class/serial/usbh_serial.h b/components/drivers/usb/cherryusb/class/serial/usbh_serial.h new file mode 100644 index 0000000000..033ab705ed --- /dev/null +++ b/components/drivers/usb/cherryusb/class/serial/usbh_serial.h @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2025, sakumisu + * Copyright (c) 2025, MDLZCOOL + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBH_SERIAL_H +#define USBH_SERIAL_H + +#include "usb_cdc.h" + +#define USBH_SERIAL_CTRL_NOCACHE_OFFSET 0 +#define USBH_SERIAL_CTRL_NOCACHE_SIZE 32 +#define USBH_SERIAL_INT_NOCACHE_OFFSET USB_ALIGN_UP(USBH_SERIAL_CTRL_NOCACHE_SIZE, CONFIG_USB_ALIGN_SIZE) +#define USBH_SERIAL_INT_NOCACHE_SIZE 32 +#define USBH_SERIAL_RX_NOCACHE_OFFSET USB_ALIGN_UP((USBH_SERIAL_INT_NOCACHE_OFFSET + USBH_SERIAL_INT_NOCACHE_SIZE), CONFIG_USB_ALIGN_SIZE) +#define USBH_SERIAL_RX_NOCACHE_SIZE 512 +#define USBH_SERIAL_RX2_NOCACHE_OFFSET USB_ALIGN_UP((USBH_SERIAL_RX_NOCACHE_OFFSET + USBH_SERIAL_RX_NOCACHE_SIZE), CONFIG_USB_ALIGN_SIZE) +#define USBH_SERIAL_RX2_NOCACHE_SIZE 512 + +#define USBH_SERIAL_DATABITS_5 5 +#define USBH_SERIAL_DATABITS_6 6 +#define USBH_SERIAL_DATABITS_7 7 +#define USBH_SERIAL_DATABITS_8 8 + +#define USBH_SERIAL_PARITY_NONE 0 +#define USBH_SERIAL_PARITY_ODD 1 +#define USBH_SERIAL_PARITY_EVEN 2 +#define USBH_SERIAL_PARITY_MARK 3 +#define USBH_SERIAL_PARITY_SPACE 4 + +#define USBH_SERIAL_STOPBITS_1 0 +#define USBH_SERIAL_STOPBITS_1_5 1 +#define USBH_SERIAL_STOPBITS_2 2 + +/* modem lines */ +#define USBH_SERIAL_TIOCM_LE 0x001 /* line enable */ +#define USBH_SERIAL_TIOCM_DTR 0x002 /* data terminal ready */ +#define USBH_SERIAL_TIOCM_RTS 0x004 /* request to send */ +#define USBH_SERIAL_TIOCM_ST 0x010 /* secondary transmit */ +#define USBH_SERIAL_TIOCM_SR 0x020 /* secondary receive */ +#define USBH_SERIAL_TIOCM_CTS 0x040 /* clear to send */ +#define USBH_SERIAL_TIOCM_CAR 0x100 /* carrier detect */ +#define USBH_SERIAL_TIOCM_CD USBH_SERIAL_TIOCM_CAR +#define USBH_SERIAL_TIOCM_RNG 0x200 /* ring */ +#define USBH_SERIAL_TIOCM_RI USBH_SERIAL_TIOCM_RNG +#define USBH_SERIAL_TIOCM_DSR 0x400 /* data set ready */ +#define USBH_SERIAL_TIOCM_OUT1 0x2000 +#define USBH_SERIAL_TIOCM_OUT2 0x4000 +#define USBH_SERIAL_TIOCM_LOOP 0x8000 + +#define USBH_SERIAL_O_RDONLY 0x0000 /* open for reading only */ +#define USBH_SERIAL_O_WRONLY 0x0001 /* open for writing only */ +#define USBH_SERIAL_O_RDWR 0x0002 /* open for reading and writing */ + +#define USBH_SERIAL_O_ACCMODE 0x0003 /* mask for above modes, from 4.4BSD https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/include/sys/fcntl.h */ +#define USBH_SERIAL_O_NONBLOCK 0x0004 /* non-blocking I/O, from BSD apple https://opensource.apple.com/source/xnu/xnu-1228.0.2/bsd/sys/fcntl.h */ + +#define USBH_SERIAL_CMD_SET_ATTR 0 +#define USBH_SERIAL_CMD_GET_ATTR 1 +#define USBH_SERIAL_CMD_IOCMBIS 2 +#define USBH_SERIAL_CMD_IOCMBIC 3 +#define USBH_SERIAL_CMD_TIOCMSET 4 +#define USBH_SERIAL_CMD_TIOCMGET 5 + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + uint32_t in; /*!< Define the write pointer. */ + uint32_t out; /*!< Define the read pointer. */ + uint32_t mask; /*!< Define the write and read pointer mask. */ + void *pool; /*!< Define the memory pointer. */ +} usbh_serial_ringbuf_t; + +/* + * Counters of the input lines (CTS, DSR, RI, CD) interrupts + */ + +struct usbh_serial_async_icount { + uint32_t cts, dsr, rng, dcd, tx, rx; + uint32_t frame, parity, overrun, brk; + uint32_t buf_overrun; +}; + +struct usbh_serial_termios { + uint32_t baudrate; + uint8_t databits; + uint8_t parity; + uint8_t stopbits; + bool rtscts; /* hardware flow control */ + uint32_t rx_timeout; +}; + +struct usbh_serial; + +typedef void (*usbh_serial_rx_complete_callback_t)(struct usbh_serial *serial, int nbytes); + +/** + * @brief Serial Driver Operations + */ +struct usbh_serial_driver { + const char *driver_name; + + uint8_t ignore_tx_header; + uint8_t ignore_rx_header; + + int (*attach)(struct usbh_serial *serial); + void (*detach)(struct usbh_serial *serial); + + int (*open)(struct usbh_serial *serial); + void (*close)(struct usbh_serial *serial); + int (*set_flow_control)(struct usbh_serial *serial, bool enable); + int (*set_line_coding)(struct usbh_serial *serial, struct cdc_line_coding *line_coding); + int (*get_line_coding)(struct usbh_serial *serial, struct cdc_line_coding *line_coding); + int (*set_line_state)(struct usbh_serial *serial, bool dtr, bool rts); + int (*get_modem_status)(struct usbh_serial *serial); +}; + +/** + * @brief Serial Instance + */ +struct usbh_serial { + struct usbh_hubport *hport; + uint8_t intf; /* Interface Number */ + int minor; /* Serial Port Number (/dev/ttyUSBx or /dev/ttyACMx) */ + int cdc_minor; /* Serial Port Number (/dev/ttyACMx) */ + uint8_t *iobuffer; /* I/O buffer for serial transfers */ + uint8_t ref_count; /* Reference Count */ + uint32_t open_flags; + uint32_t rx_timeout_ms; + + struct cdc_line_coding line_coding; + uint16_t line_state; + bool rtscts; /* hardware flow control */ + struct usbh_serial_async_icount iocount; + + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ + struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ + struct usbh_urb bulkout_urb; + struct usbh_urb bulkin_urb; + + const struct usbh_serial_driver *driver; + + usbh_serial_ringbuf_t rx_rb; + uint8_t rx_rb_pool[CONFIG_USBHOST_SERIAL_RX_SIZE]; + usb_osal_sem_t rx_complete_sem; + uint8_t rx_buf_index; + int rx_errorcode; + usbh_serial_rx_complete_callback_t rx_complete_callback; + + void *priv; /* Private Data */ + void *user_data; /* User Data */ +}; + +/* internal api */ +struct usbh_serial *usbh_serial_probe(struct usbh_hubport *hport, uint8_t intf, const struct usbh_serial_driver *driver); +void usbh_serial_remove(struct usbh_serial *serial); + +/* public api */ +struct usbh_serial *usbh_serial_open(const char *devname, uint32_t open_flags); +int usbh_serial_close(struct usbh_serial *serial); +int usbh_serial_control(struct usbh_serial *serial, int cmd, void *arg); +int usbh_serial_write(struct usbh_serial *serial, const void *buffer, uint32_t buflen); +int usbh_serial_read(struct usbh_serial *serial, void *buffer, uint32_t buflen); + +/* cdc only api */ +int usbh_serial_cdc_write_async(struct usbh_serial *serial, uint8_t *buffer, uint32_t buflen, usbh_complete_callback_t complete, void *arg); +int usbh_serial_cdc_read_async(struct usbh_serial *serial, uint8_t *buffer, uint32_t buflen, usbh_complete_callback_t complete, void *arg); + +/* public weak api */ +void usbh_serial_run(struct usbh_serial *serial); +void usbh_serial_stop(struct usbh_serial *serial); + +int usbh_serial(int argc, char **argv); + +#ifdef __cplusplus +} +#endif + +#endif /* USBH_SERIAL_H */ \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/class/vendor/net/usbh_asix.c b/components/drivers/usb/cherryusb/class/vendor/net/usbh_asix.c index 981c506799..ffa1ed500b 100644 --- a/components/drivers/usb/cherryusb/class/vendor/net/usbh_asix.c +++ b/components/drivers/usb/cherryusb/class/vendor/net/usbh_asix.c @@ -795,16 +795,6 @@ int usbh_asix_eth_output(uint32_t buflen) return usbh_submit_urb(&g_asix_class.bulkout_urb); } -__WEAK void usbh_asix_run(struct usbh_asix *asix_class) -{ - (void)asix_class; -} - -__WEAK void usbh_asix_stop(struct usbh_asix *asix_class) -{ - (void)asix_class; -} - static const uint16_t asix_id_table[][2] = { { 0x0B95, 0x772B }, { 0x0B95, 0x7720 }, diff --git a/components/drivers/usb/cherryusb/class/vendor/net/usbh_rtl8152.c b/components/drivers/usb/cherryusb/class/vendor/net/usbh_rtl8152.c index 39b597662a..50269f26d3 100644 --- a/components/drivers/usb/cherryusb/class/vendor/net/usbh_rtl8152.c +++ b/components/drivers/usb/cherryusb/class/vendor/net/usbh_rtl8152.c @@ -1034,17 +1034,17 @@ static int generic_ocp_read(struct usbh_rtl8152 *tp, uint16_t index, uint16_t si static int generic_ocp_write(struct usbh_rtl8152 *tp, uint16_t index, uint16_t byteen, uint16_t size, void *data, uint16_t type) { - int ret; + int ret = -USB_ERR_INVAL; uint16_t byteen_start, byteen_end, byen; uint16_t limit = 512; uint8_t *buf = data; /* both size and indix must be 4 bytes align */ if ((size & 3) || !size || (index & 3) || !buf) - return -USB_ERR_INVAL; + return ret; if ((uint32_t)index + (uint32_t)size > 0xffff) - return -USB_ERR_INVAL; + return ret; byteen_start = byteen & BYTE_EN_START_MASK; byteen_end = byteen & BYTE_EN_END_MASK; @@ -1596,8 +1596,8 @@ static void r8153_teredo_off(struct usbh_rtl8152 *tp) case RTL_VER_15: default: /* The bit 0 ~ 7 are relative with teredo settings. They are - * W1C (write 1 to clear), so set all 1 to disable it. - */ + * W1C (write 1 to clear), so set all 1 to disable it. + */ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG, 0xff); break; } @@ -2251,16 +2251,6 @@ int usbh_rtl8152_eth_output(uint32_t buflen) return usbh_submit_urb(&g_rtl8152_class.bulkout_urb); } -__WEAK void usbh_rtl8152_run(struct usbh_rtl8152 *rtl8152_class) -{ - (void)rtl8152_class; -} - -__WEAK void usbh_rtl8152_stop(struct usbh_rtl8152 *rtl8152_class) -{ - (void)rtl8152_class; -} - static const uint16_t rtl_id_table[][2] = { { 0x0BDA, 0x8152 }, { 0, 0 }, diff --git a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_cp210x.c b/components/drivers/usb/cherryusb/class/vendor/serial/usbh_cp210x.c deleted file mode 100644 index f58350e6f8..0000000000 --- a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_cp210x.c +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Copyright (c) 2024, sakumisu - * - * SPDX-License-Identifier: Apache-2.0 - */ -#include "usbh_core.h" -#include "usbh_cp210x.h" - -#define DEV_FORMAT "/dev/ttyUSB%d" - -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cp210x_buf[USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; - -#define CONFIG_USBHOST_MAX_CP210X_CLASS 1 - -static struct usbh_cp210x g_cp210x_class[CONFIG_USBHOST_MAX_CP210X_CLASS]; -static uint32_t g_devinuse = 0; - -static struct usbh_cp210x *usbh_cp210x_class_alloc(void) -{ - uint8_t devno; - - for (devno = 0; devno < CONFIG_USBHOST_MAX_CP210X_CLASS; devno++) { - if ((g_devinuse & (1U << devno)) == 0) { - g_devinuse |= (1U << devno); - memset(&g_cp210x_class[devno], 0, sizeof(struct usbh_cp210x)); - g_cp210x_class[devno].minor = devno; - return &g_cp210x_class[devno]; - } - } - return NULL; -} - -static void usbh_cp210x_class_free(struct usbh_cp210x *cp210x_class) -{ - uint8_t devno = cp210x_class->minor; - - if (devno < 32) { - g_devinuse &= ~(1U << devno); - } - memset(cp210x_class, 0, sizeof(struct usbh_cp210x)); -} - -static int usbh_cp210x_enable(struct usbh_cp210x *cp210x_class) -{ - struct usb_setup_packet *setup; - - if (!cp210x_class || !cp210x_class->hport) { - return -USB_ERR_INVAL; - } - setup = cp210x_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CP210X_IFC_ENABLE; - setup->wValue = 1; - setup->wIndex = cp210x_class->intf; - setup->wLength = 0; - - return usbh_control_transfer(cp210x_class->hport, setup, NULL); -} - -static int usbh_cp210x_set_flow(struct usbh_cp210x *cp210x_class) -{ - struct usb_setup_packet *setup; - - if (!cp210x_class || !cp210x_class->hport) { - return -USB_ERR_INVAL; - } - setup = cp210x_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CP210X_SET_FLOW; - setup->wValue = 0; - setup->wIndex = cp210x_class->intf; - setup->wLength = 16; - - memset(g_cp210x_buf, 0, 16); - g_cp210x_buf[13] = 0x20; - return usbh_control_transfer(cp210x_class->hport, setup, g_cp210x_buf); -} - -static int usbh_cp210x_set_chars(struct usbh_cp210x *cp210x_class) -{ - struct usb_setup_packet *setup; - - if (!cp210x_class || !cp210x_class->hport) { - return -USB_ERR_INVAL; - } - setup = cp210x_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CP210X_SET_CHARS; - setup->wValue = 0; - setup->wIndex = cp210x_class->intf; - setup->wLength = 6; - - memset(g_cp210x_buf, 0, 6); - g_cp210x_buf[0] = 0x80; - g_cp210x_buf[4] = 0x88; - g_cp210x_buf[5] = 0x28; - return usbh_control_transfer(cp210x_class->hport, setup, g_cp210x_buf); -} - -static int usbh_cp210x_set_baudrate(struct usbh_cp210x *cp210x_class, uint32_t baudrate) -{ - struct usb_setup_packet *setup; - - if (!cp210x_class || !cp210x_class->hport) { - return -USB_ERR_INVAL; - } - setup = cp210x_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CP210X_SET_BAUDRATE; - setup->wValue = 0; - setup->wIndex = cp210x_class->intf; - setup->wLength = 4; - - memcpy(g_cp210x_buf, (uint8_t *)&baudrate, 4); - return usbh_control_transfer(cp210x_class->hport, setup, g_cp210x_buf); -} - -static int usbh_cp210x_set_data_format(struct usbh_cp210x *cp210x_class, uint8_t databits, uint8_t parity, uint8_t stopbits) -{ - struct usb_setup_packet *setup; - uint16_t value; - - if (!cp210x_class || !cp210x_class->hport) { - return -USB_ERR_INVAL; - } - setup = cp210x_class->hport->setup; - - value = ((databits & 0x0F) << 8) | ((parity & 0x0f) << 4) | ((stopbits & 0x03) << 0); - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CP210X_SET_LINE_CTL; - setup->wValue = value; - setup->wIndex = cp210x_class->intf; - setup->wLength = 0; - - return usbh_control_transfer(cp210x_class->hport, setup, NULL); -} - -static int usbh_cp210x_set_mhs(struct usbh_cp210x *cp210x_class, uint8_t dtr, uint8_t rts, uint8_t dtr_mask, uint8_t rts_mask) -{ - struct usb_setup_packet *setup; - uint16_t value; - - if (!cp210x_class || !cp210x_class->hport) { - return -USB_ERR_INVAL; - } - setup = cp210x_class->hport->setup; - - value = ((dtr & 0x01) << 0) | ((rts & 0x01) << 1) | ((dtr_mask & 0x01) << 8) | ((rts_mask & 0x01) << 9); - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CP210X_SET_MHS; - setup->wValue = value; - setup->wIndex = cp210x_class->intf; - setup->wLength = 0; - - return usbh_control_transfer(cp210x_class->hport, setup, NULL); -} - -int usbh_cp210x_set_line_coding(struct usbh_cp210x *cp210x_class, struct cdc_line_coding *line_coding) -{ - memcpy((uint8_t *)&cp210x_class->line_coding, line_coding, sizeof(struct cdc_line_coding)); - usbh_cp210x_set_baudrate(cp210x_class, line_coding->dwDTERate); - return usbh_cp210x_set_data_format(cp210x_class, line_coding->bDataBits, line_coding->bParityType, line_coding->bCharFormat); -} - -int usbh_cp210x_get_line_coding(struct usbh_cp210x *cp210x_class, struct cdc_line_coding *line_coding) -{ - memcpy(line_coding, (uint8_t *)&cp210x_class->line_coding, sizeof(struct cdc_line_coding)); - return 0; -} - -int usbh_cp210x_set_line_state(struct usbh_cp210x *cp210x_class, bool dtr, bool rts) -{ - return usbh_cp210x_set_mhs(cp210x_class, dtr, rts, 1, 1); -} - -static int usbh_cp210x_connect(struct usbh_hubport *hport, uint8_t intf) -{ - struct usb_endpoint_descriptor *ep_desc; - int ret = 0; - - struct usbh_cp210x *cp210x_class = usbh_cp210x_class_alloc(); - if (cp210x_class == NULL) { - USB_LOG_ERR("Fail to alloc cp210x_class\r\n"); - return -USB_ERR_NOMEM; - } - - cp210x_class->hport = hport; - cp210x_class->intf = intf; - - hport->config.intf[intf].priv = cp210x_class; - - usbh_cp210x_enable(cp210x_class); - usbh_cp210x_set_flow(cp210x_class); - usbh_cp210x_set_chars(cp210x_class); - - for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { - ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; - - if (ep_desc->bEndpointAddress & 0x80) { - USBH_EP_INIT(cp210x_class->bulkin, ep_desc); - } else { - USBH_EP_INIT(cp210x_class->bulkout, ep_desc); - } - } - - snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, cp210x_class->minor); - - USB_LOG_INFO("Register CP210X Class:%s\r\n", hport->config.intf[intf].devname); - -#if 0 - USB_LOG_INFO("Test cp2102 rx and tx and rx for 5 times, baudrate is 115200\r\n"); - - struct cdc_line_coding linecoding; - uint8_t count = 5; - - linecoding.dwDTERate = 115200; - linecoding.bDataBits = 8; - linecoding.bParityType = 0; - linecoding.bCharFormat = 0; - usbh_cp210x_set_line_coding(cp210x_class, &linecoding); - usbh_cp210x_set_line_state(cp210x_class, true, false); - - memset(g_cp210x_buf, 'a', sizeof(g_cp210x_buf)); - ret = usbh_cp210x_bulk_out_transfer(cp210x_class, g_cp210x_buf, sizeof(g_cp210x_buf), 0xfffffff); - USB_LOG_RAW("out ret:%d\r\n", ret); - while (count--) { - ret = usbh_cp210x_bulk_in_transfer(cp210x_class, g_cp210x_buf, sizeof(g_cp210x_buf), 0xfffffff); - USB_LOG_RAW("in ret:%d\r\n", ret); - if (ret > 0) { - for (uint32_t i = 0; i < ret; i++) { - USB_LOG_RAW("%02x ", g_cp210x_buf[i]); - } - USB_LOG_RAW("\r\n"); - } - } -#endif - usbh_cp210x_run(cp210x_class); - return ret; -} - -static int usbh_cp210x_disconnect(struct usbh_hubport *hport, uint8_t intf) -{ - int ret = 0; - - struct usbh_cp210x *cp210x_class = (struct usbh_cp210x *)hport->config.intf[intf].priv; - - if (cp210x_class) { - if (cp210x_class->bulkin) { - usbh_kill_urb(&cp210x_class->bulkin_urb); - } - - if (cp210x_class->bulkout) { - usbh_kill_urb(&cp210x_class->bulkout_urb); - } - - if (hport->config.intf[intf].devname[0] != '\0') { - usb_osal_thread_schedule_other(); - USB_LOG_INFO("Unregister CP210X Class:%s\r\n", hport->config.intf[intf].devname); - usbh_cp210x_stop(cp210x_class); - } - - usbh_cp210x_class_free(cp210x_class); - } - - return ret; -} - -int usbh_cp210x_bulk_in_transfer(struct usbh_cp210x *cp210x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) -{ - int ret; - struct usbh_urb *urb = &cp210x_class->bulkin_urb; - - usbh_bulk_urb_fill(urb, cp210x_class->hport, cp210x_class->bulkin, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; - } - return ret; -} - -int usbh_cp210x_bulk_out_transfer(struct usbh_cp210x *cp210x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) -{ - int ret; - struct usbh_urb *urb = &cp210x_class->bulkout_urb; - - usbh_bulk_urb_fill(urb, cp210x_class->hport, cp210x_class->bulkout, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; - } - return ret; -} - -__WEAK void usbh_cp210x_run(struct usbh_cp210x *cp210x_class) -{ - (void)cp210x_class; -} - -__WEAK void usbh_cp210x_stop(struct usbh_cp210x *cp210x_class) -{ - (void)cp210x_class; -} - -static const uint16_t cp210x_id_table[][2] = { - { 0x10C4, 0xEA60 }, - { 0, 0 }, -}; - -const struct usbh_class_driver cp210x_class_driver = { - .driver_name = "cp210x", - .connect = usbh_cp210x_connect, - .disconnect = usbh_cp210x_disconnect -}; - -CLASS_INFO_DEFINE const struct usbh_class_info cp210x_class_info = { - .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, - .bInterfaceClass = 0xff, - .bInterfaceSubClass = 0x00, - .bInterfaceProtocol = 0x00, - .id_table = cp210x_id_table, - .class_driver = &cp210x_class_driver -}; \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_cp210x.h b/components/drivers/usb/cherryusb/class/vendor/serial/usbh_cp210x.h deleted file mode 100644 index d380c36c58..0000000000 --- a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_cp210x.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2024, sakumisu - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef USBH_CP210X_H -#define USBH_CP210X_H - -#include "usb_cdc.h" - -/* Requests */ -#define CP210X_IFC_ENABLE 0x00 -#define CP210X_SET_BAUDDIV 0x01 -#define CP210X_GET_BAUDDIV 0x02 -#define CP210X_SET_LINE_CTL 0x03 // Set parity, data bits, stop bits -#define CP210X_GET_LINE_CTL 0x04 -#define CP210X_SET_BREAK 0x05 -#define CP210X_IMM_CHAR 0x06 -#define CP210X_SET_MHS 0x07 // Set DTR, RTS -#define CP210X_GET_MDMSTS 0x08 -#define CP210X_SET_XON 0x09 -#define CP210X_SET_XOFF 0x0A -#define CP210X_SET_EVENTMASK 0x0B -#define CP210X_GET_EVENTMASK 0x0C -#define CP210X_SET_CHAR 0x0D -#define CP210X_GET_CHARS 0x0E -#define CP210X_GET_PROPS 0x0F -#define CP210X_GET_COMM_STATUS 0x10 -#define CP210X_RESET 0x11 -#define CP210X_PURGE 0x12 -#define CP210X_SET_FLOW 0x13 -#define CP210X_GET_FLOW 0x14 -#define CP210X_EMBED_EVENTS 0x15 -#define CP210X_GET_EVENTSTATE 0x16 -#define CP210X_SET_CHARS 0x19 -#define CP210X_GET_BAUDRATE 0x1D -#define CP210X_SET_BAUDRATE 0x1E // Set baudrate -#define CP210X_VENDOR_SPECIFIC 0xFF - -struct usbh_cp210x { - struct usbh_hubport *hport; - struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ - struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ - struct usbh_urb bulkout_urb; - struct usbh_urb bulkin_urb; - - struct cdc_line_coding line_coding; - - uint8_t intf; - uint8_t minor; - - void *user_data; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -int usbh_cp210x_set_line_coding(struct usbh_cp210x *ftdi_class, struct cdc_line_coding *line_coding); -int usbh_cp210x_get_line_coding(struct usbh_cp210x *ftdi_class, struct cdc_line_coding *line_coding); -int usbh_cp210x_set_line_state(struct usbh_cp210x *ftdi_class, bool dtr, bool rts); - -int usbh_cp210x_bulk_in_transfer(struct usbh_cp210x *cp210x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); -int usbh_cp210x_bulk_out_transfer(struct usbh_cp210x *cp210x_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); - -void usbh_cp210x_run(struct usbh_cp210x *cp210x_class); -void usbh_cp210x_stop(struct usbh_cp210x *cp210x_class); - -#ifdef __cplusplus -} -#endif - -#endif /* USBH_CP210X_H */ diff --git a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_ftdi.h b/components/drivers/usb/cherryusb/class/vendor/serial/usbh_ftdi.h deleted file mode 100644 index 855db8d6c6..0000000000 --- a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_ftdi.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2024, sakumisu - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef USBH_FTDI_H -#define USBH_FTDI_H - -#include "usb_cdc.h" - -/* Requests */ -#define SIO_RESET_REQUEST 0x00 /* Reset the port */ -#define SIO_SET_MODEM_CTRL_REQUEST 0x01 /* Set the modem control register */ -#define SIO_SET_FLOW_CTRL_REQUEST 0x02 /* Set flow control register */ -#define SIO_SET_BAUDRATE_REQUEST 0x03 /* Set baud rate */ -#define SIO_SET_DATA_REQUEST 0x04 /* Set the data characteristics of the port */ -#define SIO_POLL_MODEM_STATUS_REQUEST 0x05 -#define SIO_SET_EVENT_CHAR_REQUEST 0x06 -#define SIO_SET_ERROR_CHAR_REQUEST 0x07 -#define SIO_SET_LATENCY_TIMER_REQUEST 0x09 -#define SIO_GET_LATENCY_TIMER_REQUEST 0x0A -#define SIO_SET_BITMODE_REQUEST 0x0B -#define SIO_READ_PINS_REQUEST 0x0C -#define SIO_READ_EEPROM_REQUEST 0x90 -#define SIO_WRITE_EEPROM_REQUEST 0x91 -#define SIO_ERASE_EEPROM_REQUEST 0x92 - -#define SIO_DISABLE_FLOW_CTRL 0x0 -#define SIO_RTS_CTS_HS (0x1 << 8) -#define SIO_DTR_DSR_HS (0x2 << 8) -#define SIO_XON_XOFF_HS (0x4 << 8) - -#define SIO_SET_DTR_MASK 0x1 -#define SIO_SET_DTR_HIGH (1 | (SIO_SET_DTR_MASK << 8)) -#define SIO_SET_DTR_LOW (0 | (SIO_SET_DTR_MASK << 8)) -#define SIO_SET_RTS_MASK 0x2 -#define SIO_SET_RTS_HIGH (2 | (SIO_SET_RTS_MASK << 8)) -#define SIO_SET_RTS_LOW (0 | (SIO_SET_RTS_MASK << 8)) - -#define SIO_RTS_CTS_HS (0x1 << 8) - -enum ftdi_chip_type { - SIO, - FT232A, - FT232B, - FT2232C, - FT232R, - FT232H, - FT2232H, - FT4232H, - FT4232HA, - FT232HP, - FT233HP, - FT2232HP, - FT2233HP, - FT4232HP, - FT4233HP, - FTX, -}; - -struct usbh_ftdi { - struct usbh_hubport *hport; - struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ - struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ - struct usbh_urb bulkout_urb; - struct usbh_urb bulkin_urb; - - struct cdc_line_coding line_coding; - - uint8_t intf; - uint8_t minor; - uint8_t modem_status[2]; - enum ftdi_chip_type chip_type; - - void *user_data; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -int usbh_ftdi_set_line_coding(struct usbh_ftdi *ftdi_class, struct cdc_line_coding *line_coding); -int usbh_ftdi_get_line_coding(struct usbh_ftdi *ftdi_class, struct cdc_line_coding *line_coding); -int usbh_ftdi_set_line_state(struct usbh_ftdi *ftdi_class, bool dtr, bool rts); - -int usbh_ftdi_bulk_in_transfer(struct usbh_ftdi *ftdi_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); -int usbh_ftdi_bulk_out_transfer(struct usbh_ftdi *ftdi_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); - -void usbh_ftdi_run(struct usbh_ftdi *ftdi_class); -void usbh_ftdi_stop(struct usbh_ftdi *ftdi_class); - -#ifdef __cplusplus -} -#endif - -#endif /* USBH_FTDI_H */ diff --git a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_pl2303.c b/components/drivers/usb/cherryusb/class/vendor/serial/usbh_pl2303.c deleted file mode 100644 index ece3253881..0000000000 --- a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_pl2303.c +++ /dev/null @@ -1,449 +0,0 @@ -/* - * Copyright (c) 2024, sakumisu - * Copyright (c) 2024, Derek Konigsberg - * - * SPDX-License-Identifier: Apache-2.0 - */ -#include "usbh_core.h" -#include "usbh_pl2303.h" - -#undef USB_DBG_TAG -#define USB_DBG_TAG "usbh_pl2303" -#include "usb_log.h" - -#define DEV_FORMAT "/dev/ttyUSB%d" - -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_pl2303_buf[USB_ALIGN_UP(64, CONFIG_USB_ALIGN_SIZE)]; - -#define CONFIG_USBHOST_MAX_PL2303_CLASS 1 - -#define UT_WRITE_VENDOR_DEVICE (USB_REQUEST_DIR_OUT | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE) -#define UT_READ_VENDOR_DEVICE (USB_REQUEST_DIR_IN | USB_REQUEST_VENDOR | USB_REQUEST_RECIPIENT_DEVICE) - -static struct usbh_pl2303 g_pl2303_class[CONFIG_USBHOST_MAX_PL2303_CLASS]; -static uint32_t g_devinuse = 0; - -static struct usbh_pl2303 *usbh_pl2303_class_alloc(void) -{ - uint8_t devno; - - for (devno = 0; devno < CONFIG_USBHOST_MAX_PL2303_CLASS; devno++) { - if ((g_devinuse & (1U << devno)) == 0) { - g_devinuse |= (1U << devno); - memset(&g_pl2303_class[devno], 0, sizeof(struct usbh_pl2303)); - g_pl2303_class[devno].minor = devno; - return &g_pl2303_class[devno]; - } - } - return NULL; -} - -static void usbh_pl2303_class_free(struct usbh_pl2303 *pl2303_class) -{ - uint8_t devno = pl2303_class->minor; - - if (devno < 32) { - g_devinuse &= ~(1U << devno); - } - memset(pl2303_class, 0, sizeof(struct usbh_pl2303)); -} - -static int usbh_pl2303_get_chiptype(struct usbh_pl2303 *pl2303_class) -{ - int ret = 0; - - switch (pl2303_class->hport->device_desc.bcdDevice) { - case 0x0300: - pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303HX; - /* or TA, that is HX with external crystal */ - break; - case 0x0400: - pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303HXD; - /* or EA, that is HXD with ESD protection */ - /* or RA, that has internal voltage level converter that works only up to 1Mbaud (!) */ - break; - case 0x0500: - pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303HXD; - /* in fact it's TB, that is HXD with external crystal */ - break; - default: - /* NOTE: I have no info about the bcdDevice for the base PL2303 (up to 1.2Mbaud, - only fixed rates) and for PL2303SA (8-pin chip, up to 115200 baud */ - /* Determine the chip type. This algorithm is taken from Linux. */ - if (pl2303_class->hport->device_desc.bDeviceClass == 0x02) { - pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303; - } else if (pl2303_class->hport->device_desc.bMaxPacketSize0 == 0x40) { - pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303HX; - } else { - pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303; - } - break; - } - - /* - * The new chip revision PL2303HXN is only compatible with the new - * PLCOM_SET_REQUEST_PL2303HXN command. Issuing the old command - * PLCOM_SET_REQUEST to the new chip raises an error. Thus, PL2303HX - * and PL2303HXN can be distinguished by issuing an old-style request - * (on a status register) to the new chip and checking the error. - */ - if (pl2303_class->chiptype == USBH_PL2303_TYPE_PL2303HX) { - struct usb_setup_packet *setup = pl2303_class->hport->setup; - - setup->bmRequestType = UT_READ_VENDOR_DEVICE; - setup->bRequest = PL2303_SET_REQUEST; - setup->wValue = PL2303_STATUS_REG_PL2303HX; - setup->wIndex = 0; - setup->wLength = 1; - - ret = usbh_control_transfer(pl2303_class->hport, setup, g_pl2303_buf); - if (ret == -USB_ERR_STALL) { - pl2303_class->chiptype = USBH_PL2303_TYPE_PL2303HXN; - ret = 0; - } else if (ret < 0) { - USB_LOG_WRN("Error checking chip type: %d\r\n", ret); - return ret; - } - } - - switch (pl2303_class->chiptype) { - case USBH_PL2303_TYPE_PL2303: - USB_LOG_INFO("chiptype = 2303\r\n"); - break; - case USBH_PL2303_TYPE_PL2303HX: - USB_LOG_INFO("chiptype = 2303HX/TA\r\n"); - break; - case USBH_PL2303_TYPE_PL2303HXN: - USB_LOG_INFO("chiptype = 2303HXN\r\n"); - break; - case USBH_PL2303_TYPE_PL2303HXD: - USB_LOG_INFO("chiptype = 2303HXD/TB/RA/EA\r\n"); - break; - default: - USB_LOG_INFO("chiptype = [%d]\r\n", pl2303_class->chiptype); - break; - } - - return ret; -} - -static int usbh_pl2303_do(struct usbh_pl2303 *pl2303_class, - uint8_t req_type, uint8_t request, uint16_t value, uint16_t index, - uint16_t length) -{ - struct usb_setup_packet *setup; - - if (!pl2303_class || !pl2303_class->hport) { - return -USB_ERR_INVAL; - } - setup = pl2303_class->hport->setup; - - setup->bmRequestType = req_type; - setup->bRequest = request; - setup->wValue = value; - setup->wIndex = index; - setup->wLength = length; - - return usbh_control_transfer(pl2303_class->hport, setup, g_pl2303_buf); -} - -int usbh_pl2303_set_line_coding(struct usbh_pl2303 *pl2303_class, struct cdc_line_coding *line_coding) -{ - struct usb_setup_packet *setup; - - if (!pl2303_class || !pl2303_class->hport) { - return -USB_ERR_INVAL; - } - setup = pl2303_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CDC_REQUEST_SET_LINE_CODING; - setup->wValue = 0; - setup->wIndex = pl2303_class->intf; - setup->wLength = 7; - - memcpy(g_pl2303_buf, line_coding, sizeof(struct cdc_line_coding)); - - return usbh_control_transfer(pl2303_class->hport, setup, g_pl2303_buf); -} - -int usbh_pl2303_get_line_coding(struct usbh_pl2303 *pl2303_class, struct cdc_line_coding *line_coding) -{ - struct usb_setup_packet *setup; - int ret; - - if (!pl2303_class || !pl2303_class->hport) { - return -USB_ERR_INVAL; - } - setup = pl2303_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CDC_REQUEST_GET_LINE_CODING; - setup->wValue = 0; - setup->wIndex = pl2303_class->intf; - setup->wLength = 7; - - ret = usbh_control_transfer(pl2303_class->hport, setup, g_pl2303_buf); - if (ret < 0) { - return ret; - } - memcpy(line_coding, g_pl2303_buf, sizeof(struct cdc_line_coding)); - return ret; -} - -int usbh_pl2303_set_line_state(struct usbh_pl2303 *pl2303_class, bool dtr, bool rts) -{ - struct usb_setup_packet *setup; - - if (!pl2303_class || !pl2303_class->hport) { - return -USB_ERR_INVAL; - } - setup = pl2303_class->hport->setup; - - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = CDC_REQUEST_SET_CONTROL_LINE_STATE; - setup->wValue = (dtr << 0) | (rts << 1); - setup->wIndex = pl2303_class->intf; - setup->wLength = 0; - - return usbh_control_transfer(pl2303_class->hport, setup, NULL); -} - -static int usbh_pl2303_connect(struct usbh_hubport *hport, uint8_t intf) -{ - struct usb_endpoint_descriptor *ep_desc; - int ret = 0; - - struct usbh_pl2303 *pl2303_class = usbh_pl2303_class_alloc(); - if (pl2303_class == NULL) { - USB_LOG_ERR("Fail to alloc pl2303_class\r\n"); - return -USB_ERR_NOMEM; - } - - pl2303_class->hport = hport; - pl2303_class->intf = intf; - - hport->config.intf[intf].priv = pl2303_class; - - do { - ret = usbh_pl2303_get_chiptype(pl2303_class); - if (ret < 0) { - break; - } - - /* Startup reset sequence, if necessary for the chip type */ - if (pl2303_class->chiptype != USBH_PL2303_TYPE_PL2303HXN) { - struct usb_setup_packet *setup = pl2303_class->hport->setup; - - setup->bmRequestType = UT_WRITE_VENDOR_DEVICE; - setup->bRequest = PL2303_SET_REQUEST; - setup->wValue = 0; - setup->wIndex = pl2303_class->intf; - setup->wLength = 0; - - ret = usbh_control_transfer(pl2303_class->hport, setup, g_pl2303_buf); - if (ret < 0) { - USB_LOG_WRN("Initialization reset failed: %d\r\n", ret); - break; - } - } - - if (pl2303_class->chiptype == USBH_PL2303_TYPE_PL2303) { - /* HX variants seem to lock up after a clear stall request. */ - /* - * The FreeBSD code sets the stall flags on the in and out pipes - * here. Have no idea exactly how to do this, or if it is necessary. - * May just leave this code unwritten until test hardware is available. - */ - } else if (pl2303_class->chiptype == USBH_PL2303_TYPE_PL2303HX || pl2303_class->chiptype == USBH_PL2303_TYPE_PL2303HXD) { - /* Reset upstream data pipes */ - ret = usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 8, 0, 0); - if (ret < 0) { - USB_LOG_WRN("Could not reset upstream data pipes (8,0): %d\r\n", ret); - break; - } - ret = usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 9, 0, 0); - if (ret < 0) { - USB_LOG_WRN("Could not reset upstream data pipes (9,0): %d\r\n", ret); - break; - } - } else if (pl2303_class->chiptype == USBH_PL2303_TYPE_PL2303HXN) { - /* Reset upstream data pipes */ - ret = usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST_PL2303HXN, 0x07, 0x03, 0); - if (ret < 0) { - USB_LOG_WRN("Could not reset upstream data pipes (7,3): %d\r\n", ret); - break; - } - } - - /* Final device initialization, if necessary for the chip type */ - if (pl2303_class->chiptype != USBH_PL2303_TYPE_PL2303HXN) { - if (usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8484, 0, 1) < 0 || - usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x0404, 0, 0) < 0 || - usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8484, 0, 1) < 0 || - usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8383, 0, 1) < 0 || - usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8484, 0, 1) < 0 || - usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x0404, 1, 0) < 0 || - usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8484, 0, 1) < 0 || - usbh_pl2303_do(pl2303_class, UT_READ_VENDOR_DEVICE, PL2303_SET_REQUEST, 0x8383, 0, 1) < 0 || - usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 0, 1, 0) < 0 || - usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 1, 0, 0) < 0) { - USB_LOG_WRN("Could not complete init sequence\r\n"); - ret = -USB_ERR_INVAL; - break; - } - - if (pl2303_class->chiptype != USBH_PL2303_TYPE_PL2303) { - ret = usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 2, 0x44, 0); - } else { - ret = usbh_pl2303_do(pl2303_class, UT_WRITE_VENDOR_DEVICE, PL2303_SET_REQUEST, 2, 0x24, 0); - } - if (ret < 0) { - USB_LOG_WRN("Could not complete final init request: %d\r\n", ret); - break; - } - } - } while (0); - - if (ret < 0) { - USB_LOG_ERR("Failed to initialize PL2303 device: %d\r\n", ret); - return ret; - } - - for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { - ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; - if (USB_GET_ENDPOINT_TYPE(ep_desc->bmAttributes) == USB_ENDPOINT_TYPE_INTERRUPT) { - continue; - } else { - if (ep_desc->bEndpointAddress & 0x80) { - USBH_EP_INIT(pl2303_class->bulkin, ep_desc); - } else { - USBH_EP_INIT(pl2303_class->bulkout, ep_desc); - } - } - } - - snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, pl2303_class->minor); - - USB_LOG_INFO("Register PL2303 Class:%s\r\n", hport->config.intf[intf].devname); - -#if 0 - USB_LOG_INFO("Test pl2303 rx and tx and rx for 5 times, baudrate is 115200\r\n"); - - struct cdc_line_coding linecoding; - uint8_t count = 5; - - linecoding.dwDTERate = 115200; - linecoding.bDataBits = 8; - linecoding.bParityType = 0; - linecoding.bCharFormat = 0; - usbh_pl2303_set_line_coding(pl2303_class, &linecoding); - usbh_pl2303_set_line_state(pl2303_class, true, false); - - memset(g_pl2303_buf, 'a', sizeof(g_pl2303_buf)); - ret = usbh_pl2303_bulk_out_transfer(pl2303_class, g_pl2303_buf, sizeof(g_pl2303_buf), 0xfffffff); - USB_LOG_RAW("out ret:%d\r\n", ret); - while (count--) { - ret = usbh_pl2303_bulk_in_transfer(pl2303_class, g_pl2303_buf, sizeof(g_pl2303_buf), 0xfffffff); - USB_LOG_RAW("in ret:%d\r\n", ret); - if (ret > 0) { - for (uint32_t i = 0; i < ret; i++) { - USB_LOG_RAW("%02x ", g_pl2303_buf[i]); - } - } - USB_LOG_RAW("\r\n"); - } -#endif - - usbh_pl2303_run(pl2303_class); - return ret; -} - -static int usbh_pl2303_disconnect(struct usbh_hubport *hport, uint8_t intf) -{ - int ret = 0; - - struct usbh_pl2303 *pl2303_class = (struct usbh_pl2303 *)hport->config.intf[intf].priv; - - if (pl2303_class) { - if (pl2303_class->bulkin) { - usbh_kill_urb(&pl2303_class->bulkin_urb); - } - - if (pl2303_class->bulkout) { - usbh_kill_urb(&pl2303_class->bulkout_urb); - } - - if (hport->config.intf[intf].devname[0] != '\0') { - usb_osal_thread_schedule_other(); - USB_LOG_INFO("Unregister PL2303 Class:%s\r\n", hport->config.intf[intf].devname); - usbh_pl2303_stop(pl2303_class); - } - - usbh_pl2303_class_free(pl2303_class); - } - - return ret; -} - -int usbh_pl2303_bulk_in_transfer(struct usbh_pl2303 *pl2303_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) -{ - int ret; - struct usbh_urb *urb = &pl2303_class->bulkin_urb; - - usbh_bulk_urb_fill(urb, pl2303_class->hport, pl2303_class->bulkin, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; - } - return ret; -} - -int usbh_pl2303_bulk_out_transfer(struct usbh_pl2303 *pl2303_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) -{ - int ret; - struct usbh_urb *urb = &pl2303_class->bulkout_urb; - - usbh_bulk_urb_fill(urb, pl2303_class->hport, pl2303_class->bulkout, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; - } - return ret; -} - -__WEAK void usbh_pl2303_run(struct usbh_pl2303 *pl2303_class) -{ - (void)pl2303_class; -} - -__WEAK void usbh_pl2303_stop(struct usbh_pl2303 *pl2303_class) -{ - (void)pl2303_class; -} - -static const uint16_t pl2303_id_table[][2] = { - { 0x067B, 0x2303 }, // PL2303 Serial (ATEN/IOGEAR UC232A) - { 0x067B, 0x23A3 }, // PL2303HXN Serial, type GC - { 0x067B, 0x23B3 }, // PL2303HXN Serial, type GB - { 0x067B, 0x23C3 }, // PL2303HXN Serial, type GT - { 0x067B, 0x23D3 }, // PL2303HXN Serial, type GL - { 0x067B, 0x23E3 }, // PL2303HXN Serial, type GE - { 0x067B, 0x23F3 }, // PL2303HXN Serial, type GS - { 0, 0 }, -}; - -const struct usbh_class_driver pl2303_class_driver = { - .driver_name = "pl2303", - .connect = usbh_pl2303_connect, - .disconnect = usbh_pl2303_disconnect -}; - -CLASS_INFO_DEFINE const struct usbh_class_info pl2303_class_info = { - .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, - .bInterfaceClass = 0xff, - .bInterfaceSubClass = 0x00, - .bInterfaceProtocol = 0x00, - .id_table = pl2303_id_table, - .class_driver = &pl2303_class_driver -}; \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_pl2303.h b/components/drivers/usb/cherryusb/class/vendor/serial/usbh_pl2303.h deleted file mode 100644 index 2b3d05f9e2..0000000000 --- a/components/drivers/usb/cherryusb/class/vendor/serial/usbh_pl2303.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2024, sakumisu - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef USBH_PL2303_H -#define USBH_PL2303_H - -#include "usb_cdc.h" - -#define PL2303_SET_REQUEST 0x01 -#define PL2303_SET_REQUEST_PL2303HXN 0x80 -#define PL2303_SET_CRTSCTS 0x41 -#define PL2303_SET_CRTSCTS_PL2303X 0x61 -#define PL2303_SET_CRTSCTS_PL2303HXN 0xFA -#define PL2303_CLEAR_CRTSCTS_PL2303HXN 0xFF -#define PL2303_CRTSCTS_REG_PL2303HXN 0x0A -#define PL2303_STATUS_REG_PL2303HX 0x8080 - -/* Different PL2303 IC types */ -#define USBH_PL2303_TYPE_UNKNOWN 0 -#define USBH_PL2303_TYPE_PL2303 1 -#define USBH_PL2303_TYPE_PL2303HX 2 -#define USBH_PL2303_TYPE_PL2303HXD 3 -#define USBH_PL2303_TYPE_PL2303HXN 4 - -struct usbh_pl2303 { - struct usbh_hubport *hport; - struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ - struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ - - struct usbh_urb bulkout_urb; - struct usbh_urb bulkin_urb; - - struct cdc_line_coding linecoding; - - uint8_t intf; - uint8_t minor; - uint8_t chiptype; - - void *user_data; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -int usbh_pl2303_set_line_coding(struct usbh_pl2303 *pl2303_class, struct cdc_line_coding *line_coding); -int usbh_pl2303_get_line_coding(struct usbh_pl2303 *pl2303_class, struct cdc_line_coding *line_coding); -int usbh_pl2303_set_line_state(struct usbh_pl2303 *pl2303_class, bool dtr, bool rts); - -int usbh_pl2303_bulk_in_transfer(struct usbh_pl2303 *pl2303_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); -int usbh_pl2303_bulk_out_transfer(struct usbh_pl2303 *pl2303_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout); - -void usbh_pl2303_run(struct usbh_pl2303 *pl2303_class); -void usbh_pl2303_stop(struct usbh_pl2303 *pl2303_class); - -#ifdef __cplusplus -} -#endif - -#endif /* USBH_PL2303_H */ diff --git a/components/drivers/usb/cherryusb/class/vendor/wifi/.gitkeep b/components/drivers/usb/cherryusb/class/vendor/wifi/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/components/drivers/usb/cherryusb/class/vendor/wifi/README.md b/components/drivers/usb/cherryusb/class/vendor/wifi/README.md deleted file mode 100644 index 18384f65d5..0000000000 --- a/components/drivers/usb/cherryusb/class/vendor/wifi/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# BL616 USB WIFI - -Usbwifi firmware please contact bouffalolab. You can purchase a module in the following ways: - -- https://iot.mi.com/moduleBrowser.html -- https://docs.ai-thinker.com/ai_m61 \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/class/vendor/wifi/usbh_bl616.c b/components/drivers/usb/cherryusb/class/vendor/wifi/usbh_bl616.c deleted file mode 100644 index e44df5bd77..0000000000 --- a/components/drivers/usb/cherryusb/class/vendor/wifi/usbh_bl616.c +++ /dev/null @@ -1,513 +0,0 @@ -/* - * Copyright (c) 2024, sakumisu - * - * SPDX-License-Identifier: Apache-2.0 - */ -#include "usbh_core.h" -#include "usbh_bl616.h" - -#undef USB_DBG_TAG -#define USB_DBG_TAG "usbh_bl616" -#include "usb_log.h" - -#define DEV_FORMAT "/dev/wifi/bl616" - -#define MAC_FMT "%02X:%02X:%02X:%02X:%02X:%02X" -#define ARR_ELE_6(e) (e)[0], (e)[1], (e)[2], (e)[3], (e)[4], (e)[5] - -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_bl616_tx_buffer[2048 + 512]; -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_bl616_rx_buffer[2048 + 512]; - -static struct usbh_bl616 g_bl616_class; - -static const char *auth_to_str(uint8_t auth) -{ - const char *table[RNM_WIFI_AUTH_MAX] = { - [RNM_WIFI_AUTH_UNKNOWN] = "UNKNOWN", - [RNM_WIFI_AUTH_OPEN] = "OPEN", - [RNM_WIFI_AUTH_WEP] = "WEP", - [RNM_WIFI_AUTH_WPA_PSK] = "WPA-PSK", - [RNM_WIFI_AUTH_WPA2_PSK] = "WPA2-PSK", - [RNM_WIFI_AUTH_WPA_WPA2_PSK] = "WPA2-PSK/WPA-PSK", - [RNM_WIFI_AUTH_WPA_ENTERPRISE] = "WPA-ENT", - [RNM_WIFI_AUTH_WPA3_SAE] = "WPA3-SAE", - [RNM_WIFI_AUTH_WPA2_PSK_WPA3_SAE] = "WPA2-PSK/WPA3-SAE", - }; - if (auth < RNM_WIFI_AUTH_MAX) - return table[auth]; - else - return table[RNM_WIFI_AUTH_UNKNOWN]; -} - -static const char *cipher_to_str(uint8_t cipher) -{ - const char *table[RNM_WIFI_CIPHER_MAX] = { - [RNM_WIFI_CIPHER_UNKNOWN] = "UNKNOWN", - [RNM_WIFI_CIPHER_NONE] = "NONE", - [RNM_WIFI_CIPHER_WEP] = "WEP", - [RNM_WIFI_CIPHER_AES] = "AES", - [RNM_WIFI_CIPHER_TKIP] = "TKIP", - [RNM_WIFI_CIPHER_TKIP_AES] = "TKIP/AES", - }; - if (cipher < RNM_WIFI_CIPHER_MAX) - return table[cipher]; - else - return table[RNM_WIFI_CIPHER_UNKNOWN]; -} - -static int parse_get_mac_rsp_msg(struct usbh_bl616 *bl616_class, void *buf, int buf_len) -{ - usb_data_t *usb_hdr = buf; - rnm_mac_addr_ind_msg_t *rsp = buf + sizeof(usb_data_t); - - if (buf_len != sizeof(usb_data_t) + sizeof(rnm_mac_addr_ind_msg_t)) { - return -1; - } - if (usb_hdr->type != USBWIFI_DATA_TYPE_CMD || usb_hdr->length != sizeof(rnm_mac_addr_ind_msg_t)) { - return -1; - } - if (rsp->hdr.cmd != BFLB_CMD_GET_MAC_ADDR || !(rsp->hdr.flags & RNM_MSG_FLAG_ACK)) { - return -1; - } - memcpy(bl616_class->sta_mac, rsp->sta_mac, 6); - memcpy(bl616_class->ap_mac, rsp->ap_mac, 6); - - return 0; -} - -static int usbh_bl616_bulk_in_transfer(struct usbh_bl616 *bl616_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) -{ - int ret; - struct usbh_urb *urb = &bl616_class->bulkin_urb; - - usbh_bulk_urb_fill(urb, bl616_class->hport, bl616_class->bulkin, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; - } - return ret; -} - -static int usbh_bl616_bulk_out_transfer(struct usbh_bl616 *bl616_class, uint8_t *buffer, uint32_t buflen, uint32_t timeout) -{ - int ret; - struct usbh_urb *urb = &bl616_class->bulkout_urb; - - usbh_bulk_urb_fill(urb, bl616_class->hport, bl616_class->bulkout, buffer, buflen, timeout, NULL, NULL); - ret = usbh_submit_urb(urb); - if (ret == 0) { - ret = urb->actual_length; - } - return ret; -} - -static int usbh_bl616_get_wifi_mac(struct usbh_bl616 *bl616_class) -{ - int ret; - uint32_t msg_len; - usb_data_t *usb_hdr = (usb_data_t *)g_bl616_tx_buffer; - rnm_base_msg_t *rnm_msg = (rnm_base_msg_t *)(g_bl616_tx_buffer + sizeof(usb_data_t)); - - memset(usb_hdr, 0, sizeof(usb_data_t)); - memset(rnm_msg, 0, sizeof(rnm_base_msg_t)); - - usb_hdr->type = USBWIFI_DATA_TYPE_CMD; - usb_hdr->length = sizeof(rnm_base_msg_t); - usb_hdr->payload_offset = sizeof(usb_data_t); - - rnm_msg->cmd = BFLB_CMD_GET_MAC_ADDR; - - msg_len = sizeof(usb_data_t) + sizeof(rnm_base_msg_t); - - ret = usbh_bl616_bulk_out_transfer(bl616_class, g_bl616_tx_buffer, msg_len, 500); - if (ret < 0) { - return ret; - } - ret = usbh_bl616_bulk_in_transfer(bl616_class, g_bl616_rx_buffer, sizeof(g_bl616_rx_buffer), 500); - if (ret < 0) { - return ret; - } - - ret = parse_get_mac_rsp_msg(bl616_class, g_bl616_rx_buffer, ret); - return ret; -} - -static int usbh_bl616_wifi_open(struct usbh_bl616 *bl616_class) -{ - uint32_t msg_len; - usb_data_t *usb_hdr = (usb_data_t *)g_bl616_tx_buffer; - rnm_base_msg_t *msg = (rnm_base_msg_t *)(g_bl616_tx_buffer + sizeof(usb_data_t)); - - memset(usb_hdr, 0, sizeof(usb_data_t)); - memset(msg, 0, sizeof(rnm_base_msg_t)); - - usb_hdr->type = USBWIFI_DATA_TYPE_CMD; - usb_hdr->length = sizeof(rnm_base_msg_t); - usb_hdr->payload_offset = sizeof(usb_data_t); - - msg->cmd = BFLB_CMD_HELLO; - - msg_len = sizeof(usb_data_t) + sizeof(rnm_base_msg_t); - - return usbh_bl616_bulk_out_transfer(bl616_class, g_bl616_tx_buffer, msg_len, 500); -} - -static int usbh_bl616_wifi_close(struct usbh_bl616 *bl616_class) -{ - uint32_t msg_len; - usb_data_t *usb_hdr = (usb_data_t *)g_bl616_tx_buffer; - rnm_base_msg_t *msg = (rnm_base_msg_t *)(g_bl616_tx_buffer + sizeof(usb_data_t)); - - memset(usb_hdr, 0, sizeof(usb_data_t)); - memset(msg, 0, sizeof(rnm_base_msg_t)); - - usb_hdr->type = USBWIFI_DATA_TYPE_CMD; - usb_hdr->length = sizeof(rnm_base_msg_t); - usb_hdr->payload_offset = sizeof(usb_data_t); - - msg->cmd = BFLB_CMD_UNLOAD_DRV; - - msg_len = sizeof(usb_data_t) + sizeof(rnm_base_msg_t); - - return usbh_bl616_bulk_out_transfer(bl616_class, g_bl616_tx_buffer, msg_len, 500); -} - -int usbh_bl616_wifi_sta_connect(const char *ssid, - const int ssid_len, - const char *password, - const int pwd_len) -{ - uint32_t msg_len; - usb_data_t *usb_hdr = (usb_data_t *)g_bl616_tx_buffer; - rnm_sta_connect_msg_t *msg = (rnm_sta_connect_msg_t *)(g_bl616_tx_buffer + sizeof(usb_data_t)); - - memset(usb_hdr, 0, sizeof(usb_data_t)); - memset(msg, 0, sizeof(rnm_sta_connect_msg_t)); - - usb_hdr->type = USBWIFI_DATA_TYPE_CMD; - usb_hdr->length = sizeof(rnm_sta_connect_msg_t); - usb_hdr->payload_offset = sizeof(usb_data_t); - - msg->hdr.cmd = BFLB_CMD_STA_CONNECT; - msg->hdr.msg_id = 0x0001; - msg->hdr.session_id = 0x0002; - msg->ssid_len = ssid_len; - memcpy(msg->ssid, ssid, ssid_len); - if (password) { - memcpy(msg->password, password, pwd_len); - } - - msg_len = sizeof(usb_data_t) + sizeof(rnm_sta_connect_msg_t); - - return usbh_bl616_bulk_out_transfer(&g_bl616_class, g_bl616_tx_buffer, msg_len, 500); -} - -int usbh_bl616_wifi_sta_disconnect(void) -{ - uint32_t msg_len; - usb_data_t *usb_hdr = (usb_data_t *)g_bl616_tx_buffer; - rnm_base_msg_t *msg = (rnm_base_msg_t *)(g_bl616_tx_buffer + sizeof(usb_data_t)); - - memset(usb_hdr, 0, sizeof(usb_data_t)); - memset(msg, 0, sizeof(rnm_base_msg_t)); - - usb_hdr->type = USBWIFI_DATA_TYPE_CMD; - usb_hdr->length = sizeof(rnm_base_msg_t); - usb_hdr->payload_offset = sizeof(usb_data_t); - - msg->cmd = BFLB_CMD_STA_DISCONNECT; - - msg_len = sizeof(usb_data_t) + sizeof(rnm_base_msg_t); - - return usbh_bl616_bulk_out_transfer(&g_bl616_class, g_bl616_tx_buffer, msg_len, 500); -} - -int usbh_bl616_get_wifi_scan_result(void) -{ - uint32_t msg_len; - usb_data_t *usb_hdr = (usb_data_t *)g_bl616_tx_buffer; - rnm_base_msg_t *msg = (rnm_base_msg_t *)(g_bl616_tx_buffer + sizeof(usb_data_t)); - - memset(usb_hdr, 0, sizeof(usb_data_t)); - memset(msg, 0, sizeof(rnm_base_msg_t)); - - usb_hdr->type = USBWIFI_DATA_TYPE_CMD; - usb_hdr->length = sizeof(rnm_base_msg_t); - usb_hdr->payload_offset = sizeof(usb_data_t); - - msg->cmd = BFLB_CMD_SCAN_RESULTS; - - msg_len = sizeof(usb_data_t) + sizeof(rnm_base_msg_t); - - return usbh_bl616_bulk_out_transfer(&g_bl616_class, g_bl616_tx_buffer, msg_len, 500); -} - -int usbh_bl616_wifi_scan(void) -{ - int ret; - uint32_t msg_len; - usb_data_t *usb_hdr = (usb_data_t *)g_bl616_tx_buffer; - rnm_base_msg_t *msg = (rnm_base_msg_t *)(g_bl616_tx_buffer + sizeof(usb_data_t)); - - memset(usb_hdr, 0, sizeof(usb_data_t)); - memset(msg, 0, sizeof(rnm_base_msg_t)); - - usb_hdr->type = USBWIFI_DATA_TYPE_CMD; - usb_hdr->length = sizeof(rnm_base_msg_t); - usb_hdr->payload_offset = sizeof(usb_data_t); - - msg->cmd = BFLB_CMD_SCAN; - - msg_len = sizeof(usb_data_t) + sizeof(rnm_base_msg_t); - - ret = usbh_bl616_bulk_out_transfer(&g_bl616_class, g_bl616_tx_buffer, msg_len, 500); - if (ret < 0) { - return ret; - } - - usb_osal_msleep(500); - return usbh_bl616_get_wifi_scan_result(); -} - -static int usbh_bl616_connect(struct usbh_hubport *hport, uint8_t intf) -{ - struct usb_endpoint_descriptor *ep_desc; - int ret = 0; - - struct usbh_bl616 *bl616_class = &g_bl616_class; - - memset(bl616_class, 0, sizeof(struct usbh_bl616)); - - bl616_class->hport = hport; - bl616_class->intf = intf; - - hport->config.intf[intf].priv = bl616_class; - - for (uint8_t i = 0; i < hport->config.intf[intf].altsetting[0].intf_desc.bNumEndpoints; i++) { - ep_desc = &hport->config.intf[intf].altsetting[0].ep[i].ep_desc; - - if (ep_desc->bEndpointAddress & 0x80) { - USBH_EP_INIT(bl616_class->bulkin, ep_desc); - } else { - USBH_EP_INIT(bl616_class->bulkout, ep_desc); - } - } - - usbh_bl616_get_wifi_mac(bl616_class); - usbh_bl616_wifi_close(bl616_class); - usbh_bl616_wifi_open(bl616_class); - - USB_LOG_INFO("BL616 WIFI STA MAC address %02x:%02x:%02x:%02x:%02x:%02x\r\n", - bl616_class->sta_mac[0], - bl616_class->sta_mac[1], - bl616_class->sta_mac[2], - bl616_class->sta_mac[3], - bl616_class->sta_mac[4], - bl616_class->sta_mac[5]); - - USB_LOG_INFO("BL616 WIFI AP MAC address %02x:%02x:%02x:%02x:%02x:%02x\r\n", - bl616_class->ap_mac[0], - bl616_class->ap_mac[1], - bl616_class->ap_mac[2], - bl616_class->ap_mac[3], - bl616_class->ap_mac[4], - bl616_class->ap_mac[5]); - - strncpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN); - - USB_LOG_INFO("Register BL616 WIFI Class:%s\r\n", hport->config.intf[intf].devname); - - usbh_bl616_run(bl616_class); - return ret; -} - -static int usbh_bl616_disconnect(struct usbh_hubport *hport, uint8_t intf) -{ - int ret = 0; - - struct usbh_bl616 *bl616_class = (struct usbh_bl616 *)hport->config.intf[intf].priv; - - if (bl616_class) { - if (bl616_class->bulkin) { - usbh_kill_urb(&bl616_class->bulkin_urb); - } - - if (bl616_class->bulkout) { - usbh_kill_urb(&bl616_class->bulkout_urb); - } - - if (hport->config.intf[intf].devname[0] != '\0') { - usb_osal_thread_schedule_other(); - USB_LOG_INFO("Unregister BL616 WIFI Class:%s\r\n", hport->config.intf[intf].devname); - usbh_bl616_stop(bl616_class); - } - - memset(bl616_class, 0, sizeof(struct usbh_bl616)); - } - - return ret; -} - -void usbh_bl616_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) -{ - int ret; - usb_data_t *usb_hdr; - rnm_base_msg_t *msg; - rnm_sta_ip_update_ind_msg_t *ipmsg; - rnm_scan_ind_msg_t *scanmsg; - uint8_t *data; - - (void)CONFIG_USB_OSAL_THREAD_GET_ARGV; - USB_LOG_INFO("Create bl616 wifi rx thread\r\n"); - - while (1) { - ret = usbh_bl616_bulk_in_transfer(&g_bl616_class, g_bl616_rx_buffer, sizeof(g_bl616_rx_buffer), USB_OSAL_WAITING_FOREVER); - if (ret < 0) { - break; - } - - usb_hdr = (usb_data_t *)g_bl616_rx_buffer; - - if (usb_hdr->type == USBWIFI_DATA_TYPE_CMD) { - msg = (rnm_base_msg_t *)(g_bl616_rx_buffer + usb_hdr->payload_offset); - - switch (msg->cmd) { - case BFLB_CMD_STA_CONNECTED_IND: - USB_LOG_INFO("AP connected\n"); - g_bl616_class.connect_status = true; - usbh_bl616_sta_connect_callback(); - - break; - case BFLB_CMD_STA_DISCONNECTED_IND: - if (g_bl616_class.connect_status == true) { - g_bl616_class.connect_status = false; - USB_LOG_INFO("AP disconnected\n"); - usbh_bl616_sta_disconnect_callback(); - } - break; - case BFLB_CMD_STA_IP_UPDATE_IND: - ipmsg = (rnm_sta_ip_update_ind_msg_t *)(g_bl616_rx_buffer + usb_hdr->payload_offset); - - USB_LOG_INFO("WIFI IP update\r\n"); - USB_LOG_INFO("WIFI IPv4 Address : %d:%d:%d:%d\r\n", - ipmsg->ip4_addr[0], - ipmsg->ip4_addr[1], - ipmsg->ip4_addr[2], - ipmsg->ip4_addr[3]); - USB_LOG_INFO("WIFI IPv4 Mask : %d:%d:%d:%d\r\n", - ipmsg->ip4_mask[0], - ipmsg->ip4_mask[1], - ipmsg->ip4_mask[2], - ipmsg->ip4_mask[3]); - USB_LOG_INFO("WIFI IPv4 Gateway : %d:%d:%d:%d\r\n\r\n", - ipmsg->ip4_gw[0], - ipmsg->ip4_gw[1], - ipmsg->ip4_gw[2], - ipmsg->ip4_gw[3]); - - g_bl616_class.mode = BL_MODE_STA; - usbh_bl616_sta_update_ip(ipmsg->ip4_addr, ipmsg->ip4_mask, ipmsg->ip4_gw); - break; - case BFLB_CMD_SCAN_RESULTS: - scanmsg = (rnm_scan_ind_msg_t *)(g_bl616_rx_buffer + usb_hdr->payload_offset); - USB_LOG_INFO("WIFI scan result:\r\n"); - for (uint32_t i = 0; i < scanmsg->num; ++i) { - struct bf1b_wifi_scan_record *r = &scanmsg->records[i]; - USB_LOG_INFO("BSSID " MAC_FMT ", channel %u, rssi %d, auth %s, cipher %s, SSID %s\r\n", - ARR_ELE_6(r->bssid), r->channel, r->rssi, - auth_to_str(r->auth_mode), cipher_to_str(r->cipher), r->ssid); - } - break; - default: - break; - } - } else if (usb_hdr->type == USBWIFI_DATA_TYPE_PKT) { - data = (uint8_t *)(g_bl616_rx_buffer + usb_hdr->payload_offset); - usbh_bl616_eth_input(data, usb_hdr->length); - } else { - } - } - - USB_LOG_INFO("Delete bl616 wifi rx thread\r\n"); - usb_osal_thread_delete(NULL); -} - -uint8_t *usbh_bl616_get_eth_txbuf(void) -{ - return (g_bl616_tx_buffer + sizeof(usb_data_t)); -} - -int usbh_bl616_eth_output(uint32_t buflen) -{ - usb_data_t *usb_hdr; - uint32_t txlen; - - if (g_bl616_class.connect_status == false) { - return -USB_ERR_NOTCONN; - } - - usb_hdr = (usb_data_t *)g_bl616_tx_buffer; - memset(usb_hdr, 0, sizeof(usb_data_t)); - - usb_hdr->type = USBWIFI_DATA_TYPE_PKT; - usb_hdr->length = buflen; - usb_hdr->payload_offset = sizeof(usb_data_t); - - txlen = buflen + sizeof(usb_data_t); - if (!(txlen % USB_GET_MAXPACKETSIZE(g_bl616_class.bulkout->wMaxPacketSize))) { - txlen += 1; - } - USB_LOG_DBG("txlen:%d\r\n", txlen); - - usbh_bulk_urb_fill(&g_bl616_class.bulkout_urb, g_bl616_class.hport, g_bl616_class.bulkout, g_bl616_tx_buffer, txlen, USB_OSAL_WAITING_FOREVER, NULL, NULL); - return usbh_submit_urb(&g_bl616_class.bulkout_urb); -} - -int wifi_sta_connect(int argc, char **argv) -{ - if (argc < 3) { - USB_LOG_ERR("Usage: %s \r\n", argv[0]); - return -1; - } - usbh_bl616_wifi_sta_connect(argv[1], strlen(argv[1]), argv[2], strlen(argv[2])); - return 0; -} - -int wifi_scan(int argc, char **argv) -{ - (void)argc; - (void)argv; - - usbh_bl616_wifi_scan(); - return 0; -} - -__WEAK void usbh_bl616_run(struct usbh_bl616 *bl616_class) -{ - (void)bl616_class; -} - -__WEAK void usbh_bl616_stop(struct usbh_bl616 *bl616_class) -{ - (void)bl616_class; -} - -static const uint16_t bl616_id_table[][2] = { - { 0x349b, 0x616f }, - { 0, 0 }, -}; - -static const struct usbh_class_driver bl616_class_driver = { - .driver_name = "bl616_wifi", - .connect = usbh_bl616_connect, - .disconnect = usbh_bl616_disconnect -}; - -CLASS_INFO_DEFINE const struct usbh_class_info bl616_class_info = { - .match_flags = USB_CLASS_MATCH_VID_PID | USB_CLASS_MATCH_INTF_CLASS, - .bInterfaceClass = 0xff, - .bInterfaceSubClass = 0x00, - .bInterfaceProtocol = 0x00, - .id_table = bl616_id_table, - .class_driver = &bl616_class_driver -}; diff --git a/components/drivers/usb/cherryusb/class/vendor/wifi/usbh_bl616.h b/components/drivers/usb/cherryusb/class/vendor/wifi/usbh_bl616.h deleted file mode 100644 index 2d247ae2ea..0000000000 --- a/components/drivers/usb/cherryusb/class/vendor/wifi/usbh_bl616.h +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (c) 2024, sakumisu - * - * SPDX-License-Identifier: Apache-2.0 - */ -#ifndef USBH_BL616_H -#define USBH_BL616_H - -#define USBWIFI_DATA_TYPE_CMD 0xA55A -#define USBWIFI_DATA_TYPE_PKT 0x6996 - -#define USB_DATA_FLAG_AP_PKT (1u << 0) - -typedef enum { - BFLB_CMD_REBOOT = 0, - BFLB_CMD_RESET, - BFLB_CMD_HELLO, - BFLB_CMD_PING, - - BFLB_CMD_GET_MAC_ADDR, - - // Scan - BFLB_CMD_SCAN, - BFLB_CMD_SCAN_RESULTS, - - // STA - BFLB_CMD_STA_CONNECT, - BFLB_CMD_STA_DISCONNECT, - BFLB_CMD_STA_CONNECTED_IND, - BFLB_CMD_STA_DISCONNECTED_IND, - BFLB_CMD_STA_IP_UPDATE_IND, - BFLB_CMD_STA_SET_AUTO_RECONNECT, - BFLB_CMD_STA_GET_LINK_STATUS, - - // AP - BFLB_CMD_AP_START, - BFLB_CMD_AP_STOP, - BFLB_CMD_AP_STARTED_IND, - BFLB_CMD_AP_STOPPED_IND, - BFLB_CMD_AP_GET_STA_LIST, - - // Monitor - BFLB_CMD_MONITOR_START, - BFLB_CMD_MONITOR_STOP, - BFLB_CMD_MONITOR_SET_CHANNEL, - BFLB_CMD_MONITOR_GET_CHANNEL, - - BFLB_CMD_SET_LPM_MODE, - - // OTA - BFLB_CMD_GET_DEV_VERSION, - BFLB_CMD_OTA, - - BFLB_CMD_EXT, - - BFLB_CMD_USER_EXT, - BFLB_CMD_UNLOAD_DRV, - - BFLB_CMD_MAX, -} bflb_cmd_t; - -typedef enum { - STATUS_OK, - STATUS_NOMEM = 128, - STATUS_INVALID_INPUT, - STATUS_INVALID_MODE, - STATUS_ERR_UNSPECIFIED, - STATUS_NOT_IMPLEMENTED, -} cmd_status_t; - -typedef enum { - RNM_WIFI_AUTH_UNKNOWN = 0, - RNM_WIFI_AUTH_OPEN, - RNM_WIFI_AUTH_WEP, - RNM_WIFI_AUTH_WPA_PSK, - RNM_WIFI_AUTH_WPA2_PSK, - RNM_WIFI_AUTH_WPA_WPA2_PSK, - RNM_WIFI_AUTH_WPA_ENTERPRISE, - RNM_WIFI_AUTH_WPA3_SAE, - RNM_WIFI_AUTH_WPA2_PSK_WPA3_SAE, - RNM_WIFI_AUTH_MAX, -} rnm_wifi_auth_mode_t; - -typedef enum { - RNM_WIFI_CIPHER_UNKNOWN = 0, - RNM_WIFI_CIPHER_NONE, - RNM_WIFI_CIPHER_WEP, - RNM_WIFI_CIPHER_AES, - RNM_WIFI_CIPHER_TKIP, - RNM_WIFI_CIPHER_TKIP_AES, - RNM_WIFI_CIPHER_MAX, -} rnm_wifi_cipher_t; - -/* common header */ -typedef struct { - uint16_t cmd; - // flag ACK is used by server to indicate a response to client -#define RNM_MSG_FLAG_ACK (1 << 0) - // flag TRANSPARENT is never transfered to peer but used locally -#define RNM_MSG_FLAG_TRANSPARENT (1 << 1) - // flag ASYNC is used by server to notify client events such as STA_CONNECTED -#define RNM_MSG_FLAG_ASYNC (1 << 2) - uint16_t flags; - uint16_t status; - uint16_t msg_id; - uint16_t session_id; - uint16_t msg_id_replying; -} rnm_base_msg_t; - -typedef struct { - rnm_base_msg_t hdr; -} rnm_ack_msg_t; - -typedef struct { - rnm_base_msg_t hdr; - uint8_t sta_mac[6]; - uint8_t ap_mac[6]; -} rnm_mac_addr_ind_msg_t; - -typedef struct { - rnm_base_msg_t hdr; - uint16_t ssid_len; - uint8_t ssid[32]; - uint8_t password[64]; -} rnm_sta_connect_msg_t; - -typedef struct { - rnm_base_msg_t hdr; - uint8_t ip4_addr[4]; - uint8_t ip4_mask[4]; - uint8_t ip4_gw[4]; - uint8_t ip4_dns1[4]; - uint8_t ip4_dns2[4]; - uint8_t gw_mac[6]; -} rnm_sta_ip_update_ind_msg_t; - -struct bf1b_wifi_scan_record { - uint8_t bssid[6]; - // TODO use compressed SSID encoding to save room - uint8_t ssid[32 + 1]; - uint16_t channel; - int8_t rssi; - uint8_t auth_mode; - uint8_t cipher; -} __PACKED; - -typedef struct { - rnm_base_msg_t hdr; - uint16_t num; - struct bf1b_wifi_scan_record records[]; -} rnm_scan_ind_msg_t; - -typedef enum { - BL_MODE_NONE, - BL_MODE_STA, // card is STA - BL_MODE_AP, // card is AP - BL_MODE_STA_AP, // card is STA&AP - BL_MODE_SNIFFER, // card is sniffer - BL_MODE_MAX, -} bl_wifi_mode_t; - -typedef struct { - uint16_t type; - uint16_t length; - uint16_t flags; - uint16_t payload_offset; - uint32_t rsvd[8]; - uint8_t payload[]; -} __attribute__((aligned(4))) usb_data_t; - -struct usbh_bl616 { - struct usbh_hubport *hport; - struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ - struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */ - - struct usbh_urb bulkout_urb; - struct usbh_urb bulkin_urb; - - uint8_t intf; - - uint8_t sta_mac[6]; - uint8_t ap_mac[6]; - uint8_t mode; - bool connect_status; - - void *user_data; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -int usbh_bl616_wifi_sta_connect(const char *ssid, - const int ssid_len, - const char *password, - const int pwd_len); - -int usbh_bl616_wifi_sta_disconnect(void); -int usbh_bl616_wifi_scan(void); - -void usbh_bl616_sta_connect_callback(void); -void usbh_bl616_sta_disconnect_callback(void); -void usbh_bl616_sta_update_ip(uint8_t ip4_addr[4], uint8_t ip4_mask[4], uint8_t ip4_gw[4]); - -uint8_t *usbh_bl616_get_eth_txbuf(void); -int usbh_bl616_eth_output(uint32_t buflen); -void usbh_bl616_eth_input(uint8_t *buf, uint32_t buflen); -void usbh_bl616_rx_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV); - -void usbh_bl616_run(struct usbh_bl616 *bl616_class); -void usbh_bl616_stop(struct usbh_bl616 *bl616_class); - -int wifi_sta_connect(int argc, char **argv); -int wifi_scan(int argc, char **argv); - -#ifdef __cplusplus -} -#endif - -#endif /* USBH_BL616_H */ diff --git a/components/drivers/usb/cherryusb/class/video/usbh_video.c b/components/drivers/usb/cherryusb/class/video/usbh_video.c index 077b6bb915..18acbda37a 100644 --- a/components/drivers/usb/cherryusb/class/video/usbh_video.c +++ b/components/drivers/usb/cherryusb/class/video/usbh_video.c @@ -122,12 +122,12 @@ int usbh_videostreaming_get_cur_probe(struct usbh_video *video_class) return usbh_video_get(video_class, VIDEO_REQUEST_GET_CUR, video_class->data_intf, 0x00, VIDEO_VS_PROBE_CONTROL, (uint8_t *)&video_class->probe, 26); } -int usbh_videostreaming_set_cur_probe(struct usbh_video *video_class, uint8_t formatindex, uint8_t frameindex) +int usbh_videostreaming_set_cur_probe(struct usbh_video *video_class, uint8_t formatindex, uint8_t frameindex, uint32_t dwFrameInterval) { video_class->probe.bFormatIndex = formatindex; video_class->probe.bFrameIndex = frameindex; video_class->probe.dwMaxPayloadTransferSize = 0; - video_class->probe.dwFrameInterval = 333333; + video_class->probe.dwFrameInterval = dwFrameInterval; return usbh_video_set(video_class, VIDEO_REQUEST_SET_CUR, video_class->data_intf, 0x00, VIDEO_VS_PROBE_CONTROL, (uint8_t *)&video_class->probe, 26); } @@ -136,7 +136,6 @@ int usbh_videostreaming_set_cur_commit(struct usbh_video *video_class, uint8_t f memcpy(&video_class->commit, &video_class->probe, sizeof(struct video_probe_and_commit_controls)); video_class->commit.bFormatIndex = formatindex; video_class->commit.bFrameIndex = frameindex; - video_class->commit.dwFrameInterval = 333333; return usbh_video_set(video_class, VIDEO_REQUEST_SET_CUR, video_class->data_intf, 0x00, VIDEO_VS_COMMIT_CONTROL, (uint8_t *)&video_class->commit, 26); } @@ -154,6 +153,7 @@ int usbh_video_open(struct usbh_video *video_class, bool found = false; uint8_t formatidx = 0; uint8_t frameidx = 0; + uint32_t dwDefaultFrameInterval = 0; uint8_t step; if (!video_class || !video_class->hport) { @@ -172,6 +172,7 @@ int usbh_video_open(struct usbh_video *video_class, if ((wWidth == video_class->format[i].frame[j].wWidth) && (wHeight == video_class->format[i].frame[j].wHeight)) { frameidx = j + 1; + dwDefaultFrameInterval = video_class->format[i].frame[j].dwDefaultFrameInterval; found = true; break; } @@ -204,7 +205,7 @@ int usbh_video_open(struct usbh_video *video_class, } step = 1; - ret = usbh_videostreaming_set_cur_probe(video_class, formatidx, frameidx); + ret = usbh_videostreaming_set_cur_probe(video_class, formatidx, frameidx, dwDefaultFrameInterval); if (ret < 0) { goto errout; } @@ -228,7 +229,7 @@ int usbh_video_open(struct usbh_video *video_class, } step = 5; - ret = usbh_videostreaming_set_cur_probe(video_class, formatidx, frameidx); + ret = usbh_videostreaming_set_cur_probe(video_class, formatidx, frameidx, dwDefaultFrameInterval); if (ret < 0) { goto errout; } @@ -246,26 +247,30 @@ int usbh_video_open(struct usbh_video *video_class, } step = 8; - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = USB_REQUEST_SET_INTERFACE; - setup->wValue = altsetting; - setup->wIndex = video_class->data_intf; - setup->wLength = 0; - - ret = usbh_control_transfer(video_class->hport, setup, NULL); - if (ret < 0) { - goto errout; - } + if (!video_class->is_bulk) { + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = USB_REQUEST_SET_INTERFACE; + setup->wValue = altsetting; + setup->wIndex = video_class->data_intf; + setup->wLength = 0; + + ret = usbh_control_transfer(video_class->hport, setup, NULL); + if (ret < 0) { + goto errout; + } - ep_desc = &video_class->hport->config.intf[video_class->data_intf].altsetting[altsetting].ep[0].ep_desc; - mult = (ep_desc->wMaxPacketSize & USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_MASK) >> USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT; - mps = ep_desc->wMaxPacketSize & USB_MAXPACKETSIZE_MASK; - if (ep_desc->bEndpointAddress & 0x80) { - video_class->isoin_mps = mps * (mult + 1); - USBH_EP_INIT(video_class->isoin, ep_desc); + ep_desc = &video_class->hport->config.intf[video_class->data_intf].altsetting[altsetting].ep[0].ep_desc; + mult = (ep_desc->wMaxPacketSize & USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_MASK) >> USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT; + mps = ep_desc->wMaxPacketSize & USB_MAXPACKETSIZE_MASK; + if (ep_desc->bEndpointAddress & 0x80) { + video_class->isoin_mps = mps * (mult + 1); + USBH_EP_INIT(video_class->isoin, ep_desc); + } else { + return -USB_ERR_NODEV; + } } else { - video_class->isoout_mps = mps * (mult + 1); - USBH_EP_INIT(video_class->isoout, ep_desc); + ep_desc = &video_class->hport->config.intf[video_class->data_intf].altsetting[0].ep[0].ep_desc; + USBH_EP_INIT(video_class->bulkin, ep_desc); } USB_LOG_INFO("Open video and select formatidx:%u, frameidx:%u, altsetting:%u\r\n", formatidx, frameidx, altsetting); @@ -292,54 +297,62 @@ int usbh_video_close(struct usbh_video *video_class) video_class->is_opened = false; - if (video_class->isoin) { - video_class->isoin = NULL; - } - - if (video_class->isoout) { - video_class->isoout = NULL; + if (video_class->is_bulk) { + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_ENDPOINT; + setup->bRequest = USB_REQUEST_CLEAR_FEATURE; + setup->wValue = USB_FEATURE_ENDPOINT_HALT; + setup->wIndex = video_class->bulkin->bEndpointAddress; + setup->wLength = 0; + } else { + setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE; + setup->bRequest = USB_REQUEST_SET_INTERFACE; + setup->wValue = 0; + setup->wIndex = video_class->data_intf; + setup->wLength = 0; } - setup->bmRequestType = USB_REQUEST_DIR_OUT | USB_REQUEST_STANDARD | USB_REQUEST_RECIPIENT_INTERFACE; - setup->bRequest = USB_REQUEST_SET_INTERFACE; - setup->wValue = 0; - setup->wIndex = video_class->data_intf; - setup->wLength = 0; - ret = usbh_control_transfer(video_class->hport, setup, NULL); if (ret < 0) { return ret; } + return ret; } void usbh_video_list_info(struct usbh_video *video_class) { struct usb_endpoint_descriptor *ep_desc; - uint8_t mult; - uint16_t mps; USB_LOG_INFO("============= Video device information ===================\r\n"); USB_LOG_RAW("bcdVDC:%04x\r\n", video_class->bcdVDC); - USB_LOG_RAW("Num of altsettings:%u\r\n", video_class->num_of_intf_altsettings); - - for (uint8_t i = 0; i < video_class->num_of_intf_altsettings; i++) { - if (i == 0) { - USB_LOG_RAW("Ingore altsetting 0\r\n"); - continue; + USB_LOG_RAW("Num of altsettings:%u (%s mode)\r\n", video_class->num_of_intf_altsettings, video_class->num_of_intf_altsettings == 1 ? "bulk" : "iso"); + + video_class->is_bulk = video_class->num_of_intf_altsettings == 1 ? true : false; + + if (video_class->is_bulk) { + ep_desc = &video_class->hport->config.intf[video_class->data_intf].altsetting[0].ep[0].ep_desc; + USB_LOG_RAW("Ep=%02x Attr=%02u Mps=%d Interval=%02u Mult=%02u\r\n", + ep_desc->bEndpointAddress, + ep_desc->bmAttributes, + USB_GET_MAXPACKETSIZE(ep_desc->wMaxPacketSize), + ep_desc->bInterval, + USB_GET_MULT(ep_desc->wMaxPacketSize)); + } else { + for (uint8_t i = 0; i < video_class->num_of_intf_altsettings; i++) { + if (i == 0) { + USB_LOG_RAW("Ingore altsetting 0\r\n"); + continue; + } + ep_desc = &video_class->hport->config.intf[video_class->data_intf].altsetting[i].ep[0].ep_desc; + + USB_LOG_RAW("Altsetting:%u, Ep=%02x Attr=%02u Mps=%d Interval=%02u Mult=%02u\r\n", + i, + ep_desc->bEndpointAddress, + ep_desc->bmAttributes, + USB_GET_MAXPACKETSIZE(ep_desc->wMaxPacketSize), + ep_desc->bInterval, + USB_GET_MULT(ep_desc->wMaxPacketSize)); } - ep_desc = &video_class->hport->config.intf[video_class->data_intf].altsetting[i].ep[0].ep_desc; - - mult = (ep_desc->wMaxPacketSize & USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_MASK) >> USB_MAXPACKETSIZE_ADDITIONAL_TRANSCATION_SHIFT; - mps = ep_desc->wMaxPacketSize & USB_MAXPACKETSIZE_MASK; - - USB_LOG_RAW("Altsetting:%u, Ep=%02x Attr=%02u Mps=%d Interval=%02u Mult=%02u\r\n", - i, - ep_desc->bEndpointAddress, - ep_desc->bmAttributes, - mps, - ep_desc->bInterval, - mult); } USB_LOG_RAW("bNumFormats:%u\r\n", video_class->num_of_formats); @@ -350,9 +363,10 @@ void usbh_video_list_info(struct usbh_video *video_class) USB_LOG_RAW(" Resolution:\r\n"); for (uint8_t j = 0; j < video_class->format[i].num_of_frames; j++) { USB_LOG_RAW(" FrameIndex:%u\r\n", j + 1); - USB_LOG_RAW(" wWidth: %d, wHeight: %d\r\n", - video_class->format[i].frame[j].wWidth, - video_class->format[i].frame[j].wHeight); + USB_LOG_RAW(" wWidth: %d, wHeight: %d, fps: %d\r\n", + video_class->format[i].frame[j].wWidth, + video_class->format[i].frame[j].wHeight, + (1000 / (video_class->format[i].frame[j].dwDefaultFrameInterval / 10000))); } } @@ -438,12 +452,14 @@ static int usbh_video_ctrl_connect(struct usbh_hubport *hport, uint8_t intf) video_class->format[format_index - 1].frame[frame_index - 1].wWidth = ((struct video_cs_if_vs_frame_uncompressed_descriptor *)p)->wWidth; video_class->format[format_index - 1].frame[frame_index - 1].wHeight = ((struct video_cs_if_vs_frame_uncompressed_descriptor *)p)->wHeight; + video_class->format[format_index - 1].frame[frame_index - 1].dwDefaultFrameInterval = ((struct video_cs_if_vs_frame_uncompressed_descriptor *)p)->dwDefaultFrameInterval; break; case VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_SUBTYPE: frame_index = p[DESC_bFrameIndex]; video_class->format[format_index - 1].frame[frame_index - 1].wWidth = ((struct video_cs_if_vs_frame_mjpeg_descriptor *)p)->wWidth; video_class->format[format_index - 1].frame[frame_index - 1].wHeight = ((struct video_cs_if_vs_frame_mjpeg_descriptor *)p)->wHeight; + video_class->format[format_index - 1].frame[frame_index - 1].dwDefaultFrameInterval = ((struct video_cs_if_vs_frame_mjpeg_descriptor *)p)->dwDefaultFrameInterval; break; default: break; @@ -476,12 +492,6 @@ static int usbh_video_ctrl_disconnect(struct usbh_hubport *hport, uint8_t intf) struct usbh_video *video_class = (struct usbh_video *)hport->config.intf[intf].priv; if (video_class) { - if (video_class->isoin) { - } - - if (video_class->isoout) { - } - if (hport->config.intf[intf].devname[0] != '\0') { usb_osal_thread_schedule_other(); USB_LOG_INFO("Unregister Video Class:%s\r\n", hport->config.intf[intf].devname); diff --git a/components/drivers/usb/cherryusb/class/video/usbh_video.h b/components/drivers/usb/cherryusb/class/video/usbh_video.h index dac5792c14..9edce49b93 100644 --- a/components/drivers/usb/cherryusb/class/video/usbh_video.h +++ b/components/drivers/usb/cherryusb/class/video/usbh_video.h @@ -14,6 +14,7 @@ struct usbh_video_resolution { uint16_t wWidth; uint16_t wHeight; + uint32_t dwDefaultFrameInterval; }; struct usbh_video_format { @@ -40,7 +41,7 @@ struct usbh_videostreaming { struct usbh_video { struct usbh_hubport *hport; struct usb_endpoint_descriptor *isoin; /* ISO IN endpoint */ - struct usb_endpoint_descriptor *isoout; /* ISO OUT endpoint */ + struct usb_endpoint_descriptor *bulkin; /* Bulk IN endpoint */ uint8_t ctrl_intf; /* interface number */ uint8_t data_intf; /* interface number */ @@ -48,9 +49,9 @@ struct usbh_video { struct video_probe_and_commit_controls probe; struct video_probe_and_commit_controls commit; uint16_t isoin_mps; - uint16_t isoout_mps; bool is_opened; uint8_t current_format; + bool is_bulk; uint16_t bcdVDC; uint8_t num_of_intf_altsettings; uint8_t num_of_formats; diff --git a/components/drivers/usb/cherryusb/class/wireless/usbh_rndis.c b/components/drivers/usb/cherryusb/class/wireless/usbh_rndis.c index cb00651faa..709630cbe3 100644 --- a/components/drivers/usb/cherryusb/class/wireless/usbh_rndis.c +++ b/components/drivers/usb/cherryusb/class/wireless/usbh_rndis.c @@ -578,16 +578,6 @@ int usbh_rndis_eth_output(uint32_t buflen) return usbh_submit_urb(&g_rndis_class.bulkout_urb); } -__WEAK void usbh_rndis_run(struct usbh_rndis *rndis_class) -{ - (void)rndis_class; -} - -__WEAK void usbh_rndis_stop(struct usbh_rndis *rndis_class) -{ - (void)rndis_class; -} - static const struct usbh_class_driver rndis_class_driver = { .driver_name = "rndis", .connect = usbh_rndis_connect, @@ -602,3 +592,12 @@ CLASS_INFO_DEFINE const struct usbh_class_info rndis_class_info = { .id_table = NULL, .class_driver = &rndis_class_driver }; + +CLASS_INFO_DEFINE const struct usbh_class_info rndis_cdcacm_class_info = { + .match_flags = USB_CLASS_MATCH_INTF_CLASS | USB_CLASS_MATCH_INTF_SUBCLASS | USB_CLASS_MATCH_INTF_PROTOCOL, + .bInterfaceClass = USB_DEVICE_CLASS_CDC, + .bInterfaceSubClass = CDC_ABSTRACT_CONTROL_MODEL, + .bInterfaceProtocol = 0xff, + .id_table = NULL, + .class_driver = &rndis_class_driver +}; diff --git a/components/drivers/usb/cherryusb/common/usb_def.h b/components/drivers/usb/cherryusb/common/usb_def.h index 27b4d82155..be5ab06103 100644 --- a/components/drivers/usb/cherryusb/common/usb_def.h +++ b/components/drivers/usb/cherryusb/common/usb_def.h @@ -318,24 +318,24 @@ /* Setup packet definition used to read raw data from USB line */ struct usb_setup_packet { /** Request type. Bits 0:4 determine recipient, see - * \ref usb_request_recipient. Bits 5:6 determine type, see - * \ref usb_request_type. Bit 7 determines data transfer direction, see - * \ref usb_endpoint_direction. - */ + * \ref usb_request_recipient. Bits 5:6 determine type, see + * \ref usb_request_type. Bit 7 determines data transfer direction, see + * \ref usb_endpoint_direction. + */ uint8_t bmRequestType; /** Request. If the type bits of bmRequestType are equal to - * \ref usb_request_type::LIBUSB_REQUEST_TYPE_STANDARD - * "USB_REQUEST_TYPE_STANDARD" then this field refers to - * \ref usb_standard_request. For other cases, use of this field is - * application-specific. */ + * \ref usb_request_type::LIBUSB_REQUEST_TYPE_STANDARD + * "USB_REQUEST_TYPE_STANDARD" then this field refers to + * \ref usb_standard_request. For other cases, use of this field is + * application-specific. */ uint8_t bRequest; /** Value. Varies according to request */ uint16_t wValue; /** Index. Varies according to request, typically used to pass an index - * or offset */ + * or offset */ uint16_t wIndex; /** Number of bytes to transfer */ @@ -556,7 +556,7 @@ struct usb_bos_header_descriptor { } __PACKED; /* BOS Capability platform Descriptor */ -struct usb_bos_capability_platform_descriptor { +struct usb_bos_capability_platform_common_descriptor { uint8_t bLength; uint8_t bDescriptorType; uint8_t bDevCapabilityType; @@ -564,16 +564,26 @@ struct usb_bos_capability_platform_descriptor { uint8_t PlatformCapabilityUUID[16]; } __PACKED; -/* BOS Capability MS OS Descriptors version 2 */ -struct usb_bos_capability_msosv2_descriptor { +/* Microsoft OS 2.0 Platform Capability Descriptor +* See https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/ +* microsoft-defined-usb-descriptors +* Adapted from the source: +* https://github.com/sowbug/weblight/blob/master/firmware/webusb.c +* (BSD-2) Thanks http://janaxelson.com/files/ms_os_20_descriptors.c +*/ +struct usb_bos_capability_platform_winusb_descriptor { + struct usb_bos_capability_platform_common_descriptor common; uint32_t dwWindowsVersion; uint16_t wMSOSDescriptorSetTotalLength; uint8_t bVendorCode; uint8_t bAltEnumCode; } __PACKED; -/* BOS Capability webusb */ -struct usb_bos_capability_webusb_descriptor { +/* WebUSB Platform Capability Descriptor: +* https://wicg.github.io/webusb/#webusb-platform-capability-descriptor +*/ +struct usb_bos_capability_platform_webusb_descriptor { + struct usb_bos_capability_platform_common_descriptor common; uint16_t bcdVersion; uint8_t bVendorCode; uint8_t iLandingPage; @@ -587,26 +597,6 @@ struct usb_bos_capability_extension_descriptor { uint32_t bmAttributes; } __PACKED; -/* Microsoft OS 2.0 Platform Capability Descriptor -* See https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/ -* microsoft-defined-usb-descriptors -* Adapted from the source: -* https://github.com/sowbug/weblight/blob/master/firmware/webusb.c -* (BSD-2) Thanks http://janaxelson.com/files/ms_os_20_descriptors.c -*/ -struct usb_bos_capability_platform_msosv2_descriptor { - struct usb_bos_capability_platform_descriptor platform_msos; - struct usb_bos_capability_msosv2_descriptor data_msosv2; -} __PACKED; - -/* WebUSB Platform Capability Descriptor: -* https://wicg.github.io/webusb/#webusb-platform-capability-descriptor -*/ -struct usb_bos_capability_platform_webusb_descriptor { - struct usb_bos_capability_platform_descriptor platform_webusb; - struct usb_bos_capability_webusb_descriptor data_webusb; -} __PACKED; - struct usb_webusb_url_descriptor { uint8_t bLength; uint8_t bDescriptorType; @@ -625,18 +615,12 @@ struct usb_bos_descriptor { uint32_t string_len; }; -/* USB Device Capability Descriptor */ -struct usb_device_capability_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDevCapabilityType; -} __PACKED; - /** USB descriptor header */ struct usb_desc_header { uint8_t bLength; /**< descriptor length */ uint8_t bDescriptorType; /**< descriptor type */ }; + // clang-format off #define USB_DEVICE_DESCRIPTOR_INIT(bcdUSB, bDeviceClass, bDeviceSubClass, bDeviceProtocol, idVendor, idProduct, bcdDevice, bNumConfigurations) \ 0x12, /* bLength */ \ @@ -705,7 +689,7 @@ struct usb_desc_header { WBVAL(wMaxPacketSize), /* wMaxPacketSize */ \ bInterval /* bInterval */ -#define USB_IAD_INIT(bFirstInterface, bInterfaceCount, bFunctionClass, bFunctionSubClass, bFunctionProtocol) \ +#define USB_IAD_DESCRIPTOR_INIT(bFirstInterface, bInterfaceCount, bFunctionClass, bFunctionSubClass, bFunctionProtocol) \ 0x08, /* bLength */ \ USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION, /* bDescriptorType */ \ bFirstInterface, /* bFirstInterface */ \ @@ -716,9 +700,145 @@ struct usb_desc_header { 0x00 /* iFunction */ #define USB_LANGID_INIT(id) \ - 0x04, /* bLength */ \ + 0x04, /* bLength */ \ USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ \ WBVAL(id) /* wLangID0 */ + +#define USB_BOS_HEADER_DESCRIPTOR_INIT(wTotalLength, bNumDeviceCaps) \ + 0x05, /* bLength */ \ + USB_DESCRIPTOR_TYPE_BINARY_OBJECT_STORE, /* bDescriptorType */\ + WBVAL(wTotalLength), /* wTotalLength */ \ + bNumDeviceCaps /* bNumDeviceCaps */ + +#define USB_BOS_CAP_PLATFORM_WEBUSB_DESCRIPTOR_INIT(bVendorCode, iLandingPage) \ + 0x18, /* bLength */ \ + USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY, /* bDescriptorType */ \ + USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ \ + 0x00, /* bReserved */ \ + 0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, /* PlatformCapabilityUUID */ \ + 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65, \ + WBVAL(0x0100), /* bcdVersion */ \ + bVendorCode, /* bVendorCode */ \ + iLandingPage /* iLandingPage */ + +#define USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_INIT(bVendorCode, wMSOSDescriptorSetTotalLength) \ + 0x1C, /* bLength */ \ + USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY, /* bDescriptorType */ \ + USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ \ + 0x00, /* bReserved */ \ + 0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, /* PlatformCapabilityUUID */ \ + 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F, \ + DBVAL(0x06030000), /* dwWindowsVersion */ \ + WBVAL(wMSOSDescriptorSetTotalLength), /* wMSOSDescriptorSetTotalLength */ \ + bVendorCode, /* bVendorCode */ \ + 0x00 /* bAltEnumCode */ + +#define USB_BOS_CAP_PLATFORM_WEBUSB_DESCRIPTOR_LEN 24 +#define USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_LEN 28 + +#define USB_MSOSV1_STRING_DESCRIPTOR_INIT(vendor_code) \ + 0x12, /* bLength */ \ + USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ \ + 'M', 0, /* bString[0] */ \ + 'S', 0, /* bString[1] */ \ + 'F', 0, /* bString[2] */ \ + 'T', 0, /* bString[3] */ \ + '1', 0, /* bString[4] */ \ + '0', 0, /* bString[5] */ \ + '0', 0, /* bString[6] */ \ + vendor_code, /* bMS_VendorCode */ \ + 0x00 /* bPad */ + +#define USB_MSOSV1_COMP_ID_HEADER_DESCRIPTOR_INIT(bCount) \ + DBVAL((sizeof(struct usb_msosv1_compat_id_header_descriptor) + sizeof(struct usb_msosv1_comp_id_function_descriptor) * bCount)), /* dwLength */ \ + WBVAL(0x0100), /* bcdVersion */ \ + WBVAL(0x0004), /* wIndex */ \ + bCount, /* bCount */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* reserved[7] */ + +#define USB_MSOSV1_COMP_ID_FUNCTION_WINUSB_DESCRIPTOR_INIT(bFirstInterfaceNumber) \ + bFirstInterfaceNumber, /* bFirstInterfaceNumber */\ + 0x01, /* reserved1 */ \ + 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00, /* compatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* subCompatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* reserved2[6] */ + +#define USB_MSOSV1_COMP_ID_FUNCTION_MTP_DESCRIPTOR_INIT(bFirstInterfaceNumber)\ + bFirstInterfaceNumber, /* bFirstInterfaceNumber */\ + 0x01, /* reserved1 */ \ + 'M', 'T', 'P', 'U', 'S', 'B', 0x00, 0x00, /* compatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* subCompatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* reserved2[6] */ + +#define USB_MSOSV1_COMP_ID_FUNCTION_ADB_DESCRIPTOR_INIT(bFirstInterfaceNumber)\ + bFirstInterfaceNumber, * bFirstInterfaceNumber */\ + 0x01, /* reserved1 */ \ + 'A', 'D', 'B', 0x00, 0x00, 0x00, 0x00, 0x00, /* compatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* subCompatibleID[8] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* reserved2[6] */ + +#define USB_MSOSV1_COMP_ID_DESCRIPTOR_LEN(bCount) \ + (sizeof(struct usb_msosv1_compat_id_header_descriptor) + sizeof(struct usb_msosv1_comp_id_function_descriptor) * (bCount)) + +#define USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(wDescriptorSetTotalLength) \ + WBVAL(WINUSB_DESCRIPTOR_SET_HEADER_SIZE), /* wLength */ \ + WBVAL(WINUSB_SET_HEADER_DESCRIPTOR_TYPE), /* wDescriptorType */ \ + DBVAL(0x06030000), /* dwWindowsVersion */ \ + WBVAL(wDescriptorSetTotalLength) /* wDescriptorSetTotalLength */ + +#define USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_INIT() \ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), /* wLength */ \ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), /* wDescriptorType */ \ + 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, /* CompatibleId*/ \ + 0, 0, 0, 0, 0, 0, 0, 0, /* SubCompatibleId*/ \ + WBVAL(132), /* wLength */ \ + WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), /* wDescriptorType */ \ + WBVAL(WINUSB_PROP_DATA_TYPE_REG_SZ), /* wPropertyDataType */ \ + WBVAL(42), /* wPropertyNameLength bPropertyName: "DeviceInterfaceGUID" */ \ + 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, \ + 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, \ + 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, \ + WBVAL(80), /* wPropertyDataLength */ \ + '{', 0, \ + 'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0, \ + '2', 0, '9', 0, '3', 0, 'B', 0, '-', 0, \ + '4', 0, '6', 0, '6', 0, '3', 0, '-', 0, \ + 'A', 0, 'A', 0, '3', 0, '6', 0, '-', \ + 0, '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0, '6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0, \ + '}', 0, 0, 0, 0, 0 + +#define USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_LEN \ + (WINUSB_FEATURE_COMPATIBLE_ID_SIZE + 132) + +#define USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(bFirstInterfaceNumber) \ + WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), /* wLength */ \ + WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), /* wDescriptorType */ \ + bFirstInterfaceNumber, /* bFirstInterface*/ \ + 0, /* bReserved */ \ + WBVAL((WINUSB_FUNCTION_SUBSET_HEADER_SIZE + WINUSB_FEATURE_COMPATIBLE_ID_SIZE + 132)), /* wSubsetLength */\ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), /* wLength */ \ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), /* wDescriptorType */ \ + 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, /* CompatibleId*/ \ + 0, 0, 0, 0, 0, 0, 0, 0, /* SubCompatibleId*/ \ + WBVAL(132), /* wLength */ \ + WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), /* wDescriptorType */ \ + WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), /* wPropertyDataType */ \ + WBVAL(42), /* wPropertyNameLength bPropertyName: "DeviceInterfaceGUID" */ \ + 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, \ + 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, \ + 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, \ + WBVAL(80), /* wPropertyDataLength */ \ + '{', 0, \ + 'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0, \ + '2', 0, '9', 0, '3', 0, 'B', 0, '-', 0, \ + '4', 0, '6', 0, '6', 0, '3', 0, '-', 0, \ + 'A', 0, 'A', 0, '3', 0, '6', 0, '-', \ + 0, '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0, '6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0, \ + '}', 0, 0, 0, 0, 0 + +#define USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_LEN \ + (WINUSB_FUNCTION_SUBSET_HEADER_SIZE + WINUSB_FEATURE_COMPATIBLE_ID_SIZE + 132) + // clang-format on #endif /* USB_DEF_H */ diff --git a/components/drivers/usb/cherryusb/common/usb_otg.h b/components/drivers/usb/cherryusb/common/usb_otg.h new file mode 100644 index 0000000000..032d2e9f74 --- /dev/null +++ b/components/drivers/usb/cherryusb/common/usb_otg.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USB_OTG_H +#define USB_OTG_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define USBOTG_MODE_HOST 0 +#define USBOTG_MODE_DEVICE 1 +#define USBOTG_MODE_OTG 2 + +/** + * @brief usb otg controller hardware or gpio id simulator init. + * + * @return On success will return 0, and others indicate fail. + */ +int usb_otg_init(uint8_t busid); +/** + * @brief usb otg controller hardware or gpio id simulator deinit. + * + * @return On success will return 0, and others indicate fail. + */ +int usb_otg_deinit(uint8_t busid); + +/* called by user */ +void USBOTG_IRQHandler(uint8_t busid); + +#ifdef __cplusplus +} +#endif + +#endif /* USB_OTG_H */ \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/common/usb_util.h b/components/drivers/usb/cherryusb/common/usb_util.h index 96a14d374c..521bf27f56 100644 --- a/components/drivers/usb/cherryusb/common/usb_util.h +++ b/components/drivers/usb/cherryusb/common/usb_util.h @@ -185,8 +185,8 @@ (field)[3] = (uint8_t)((value) >> 0); \ } while (0) -#define WBVAL(x) (x & 0xFF), ((x >> 8) & 0xFF) -#define DBVAL(x) (x & 0xFF), ((x >> 8) & 0xFF), ((x >> 16) & 0xFF), ((x >> 24) & 0xFF) +#define WBVAL(x) ((x) & 0xFF), (((x) >> 8) & 0xFF) +#define DBVAL(x) ((x) & 0xFF), (((x) >> 8) & 0xFF), (((x) >> 16) & 0xFF), (((x) >> 24) & 0xFF) #define PP_NARG(...) \ PP_NARG_(__VA_ARGS__, PP_RSEQ_N()) @@ -209,6 +209,23 @@ 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 +/* + * Divide positive or negative dividend by positive or negative divisor + * and round to closest integer. Result is undefined for negative + * divisors if the dividend variable type is unsigned and for negative + * dividends if the divisor variable type is unsigned. + */ +#define DIV_ROUND_CLOSEST(x, divisor) ( \ + { \ + typeof(x) __x = x; \ + typeof(divisor) __d = divisor; \ + (((typeof(x))-1) > 0 || \ + ((typeof(divisor))-1) > 0 || \ + (((__x) > 0) == ((__d) > 0))) ? \ + (((__x) + ((__d) / 2)) / (__d)) : \ + (((__x) - ((__d) / 2)) / (__d)); \ + }) + #define USB_MEM_ALIGNX __attribute__((aligned(CONFIG_USB_ALIGN_SIZE))) #define USB_ALIGN_UP(size, align) (((size) + (align)-1) & ~((align)-1)) diff --git a/components/drivers/usb/cherryusb/common/usb_version.h b/components/drivers/usb/cherryusb/common/usb_version.h index 2d70bb4c5a..3e4c2aa395 100644 --- a/components/drivers/usb/cherryusb/common/usb_version.h +++ b/components/drivers/usb/cherryusb/common/usb_version.h @@ -15,7 +15,7 @@ #undef CHERRYUSB_VERSION_STR #endif -#define CHERRYUSB_VERSION 0x010502 -#define CHERRYUSB_VERSION_STR "v1.5.2" +#define CHERRYUSB_VERSION 0x010600 +#define CHERRYUSB_VERSION_STR "v1.6.0" #endif \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/core/usbd_core.c b/components/drivers/usb/cherryusb/core/usbd_core.c index 66ec4dc60c..bdbcfd07f7 100644 --- a/components/drivers/usb/cherryusb/core/usbd_core.c +++ b/components/drivers/usb/cherryusb/core/usbd_core.c @@ -48,16 +48,10 @@ USB_NOCACHE_RAM_SECTION struct usbd_core_priv { uint32_t ep0_data_buf_len; /** Zero length packet flag of control transfer */ bool zlp_flag; + /** Pointer to registered descriptors */ -#ifdef CONFIG_USBDEV_ADVANCE_DESC const struct usb_descriptor *descriptors; -#else - const uint8_t *descriptors; - struct usb_msosv1_descriptor *msosv1_desc; - struct usb_msosv2_descriptor *msosv2_desc; - struct usb_bos_descriptor *bos_desc; - struct usb_webusb_descriptor *webusb_url_desc; -#endif + /* Buffer used for storing standard, class and vendor request data */ USB_MEM_ALIGNX uint8_t req_data[USB_ALIGN_UP(CONFIG_USBDEV_REQUEST_BUFFER_LEN, CONFIG_USB_ALIGN_SIZE)]; @@ -69,9 +63,7 @@ USB_NOCACHE_RAM_SECTION struct usbd_core_priv { bool remote_wakeup_support; bool remote_wakeup_enabled; bool is_suspend; -#ifdef CONFIG_USBDEV_ADVANCE_DESC uint8_t speed; -#endif #ifdef CONFIG_USBDEV_TEST_MODE bool test_req; #endif @@ -180,7 +172,6 @@ static bool usbd_reset_endpoint(uint8_t busid, const struct usb_endpoint_descrip * * @return true if the descriptor was found, false otherwise */ -#ifdef CONFIG_USBDEV_ADVANCE_DESC static bool usbd_get_descriptor(uint8_t busid, uint16_t type_index, uint8_t **data, uint32_t *len) { uint8_t type = 0U; @@ -326,93 +317,6 @@ static bool usbd_get_descriptor(uint8_t busid, uint16_t type_index, uint8_t **da } return found; } -#else -static bool usbd_get_descriptor(uint8_t busid, uint16_t type_index, uint8_t **data, uint32_t *len) -{ - uint8_t type = 0U; - uint8_t index = 0U; - uint8_t *p = NULL; - uint32_t cur_index = 0U; - bool found = false; - - type = HI_BYTE(type_index); - index = LO_BYTE(type_index); - - if ((type == USB_DESCRIPTOR_TYPE_STRING) && (index == USB_OSDESC_STRING_DESC_INDEX)) { - if (!g_usbd_core[busid].msosv1_desc) { - return false; - } - - *data = (uint8_t *)g_usbd_core[busid].msosv1_desc->string; - //memcpy(*data, (uint8_t *)g_usbd_core[busid].msosv1_desc->string, g_usbd_core[busid].msosv1_desc->string[0]); - *len = g_usbd_core[busid].msosv1_desc->string[0]; - - return true; - } else if (type == USB_DESCRIPTOR_TYPE_BINARY_OBJECT_STORE) { - if (!g_usbd_core[busid].bos_desc) { - return false; - } - - *data = (uint8_t *)g_usbd_core[busid].bos_desc->string; - //memcpy(*data, (uint8_t *)g_usbd_core[busid].bos_desc->string, g_usbd_core[busid].bos_desc->string_len); - *len = g_usbd_core[busid].bos_desc->string_len; - return true; - } - /* - * Invalid types of descriptors, - * see USB Spec. Revision 2.0, 9.4.3 Get Descriptor - */ - else if ((type == USB_DESCRIPTOR_TYPE_INTERFACE) || (type == USB_DESCRIPTOR_TYPE_ENDPOINT) || -#ifndef CONFIG_USB_HS - (type > USB_DESCRIPTOR_TYPE_ENDPOINT)) { -#else - (type > USB_DESCRIPTOR_TYPE_OTHER_SPEED)) { -#endif - return false; - } - - p = (uint8_t *)g_usbd_core[busid].descriptors; - - cur_index = 0U; - - while (p[DESC_bLength] != 0U) { - if (p[DESC_bDescriptorType] == type) { - if (cur_index == index) { - found = true; - break; - } - - cur_index++; - } - - /* skip to next descriptor */ - p += p[DESC_bLength]; - } - - if (found) { - if ((type == USB_DESCRIPTOR_TYPE_CONFIGURATION) || ((type == USB_DESCRIPTOR_TYPE_OTHER_SPEED))) { - /* configuration or other speed descriptor is an - * exception, length is at offset 2 and 3 - */ - *len = (p[CONF_DESC_wTotalLength]) | - (p[CONF_DESC_wTotalLength + 1] << 8); - - g_usbd_core[busid].self_powered = (p[7] & USB_CONFIG_POWERED_MASK) ? true : false; - g_usbd_core[busid].remote_wakeup_support = (p[7] & USB_CONFIG_REMOTE_WAKEUP) ? true : false; - } else { - /* normally length is at offset 0 */ - *len = p[DESC_bLength]; - } - *data = p; - //memcpy(*data, p, *len); - } else { - /* nothing found */ - USB_LOG_ERR("descriptor not found!\r\n", type, index); - } - - return found; -} -#endif /** * @brief set USB configuration @@ -436,11 +340,8 @@ static bool usbd_set_configuration(uint8_t busid, uint8_t config_index, uint8_t uint32_t desc_len = 0; uint32_t current_desc_len = 0; -#ifdef CONFIG_USBDEV_ADVANCE_DESC p = g_usbd_core[busid].descriptors->config_descriptor_callback(g_usbd_core[busid].speed); -#else - p = (uint8_t *)g_usbd_core[busid].descriptors; -#endif + /* configure endpoints for this configuration/altsetting */ while (p[DESC_bLength] != 0U) { switch (p[DESC_bDescriptorType]) { @@ -508,11 +409,8 @@ static bool usbd_set_interface(uint8_t busid, uint8_t iface, uint8_t alt_setting uint32_t desc_len = 0; uint32_t current_desc_len = 0; -#ifdef CONFIG_USBDEV_ADVANCE_DESC p = g_usbd_core[busid].descriptors->config_descriptor_callback(g_usbd_core[busid].speed); -#else - p = (uint8_t *)g_usbd_core[busid].descriptors; -#endif + USB_LOG_DBG("iface %u alt_setting %u\r\n", iface, alt_setting); while (p[DESC_bLength] != 0U) { @@ -683,11 +581,7 @@ static bool usbd_std_interface_req_handler(uint8_t busid, struct usb_setup_packe uint32_t current_desc_len = 0; uint8_t cur_iface = 0xFF; -#ifdef CONFIG_USBDEV_ADVANCE_DESC p = g_usbd_core[busid].descriptors->config_descriptor_callback(g_usbd_core[busid].speed); -#else - p = (uint8_t *)g_usbd_core[busid].descriptors; -#endif /* Only when device is configured, then interface requests can be valid. */ if (!is_device_configured(busid)) { @@ -925,7 +819,7 @@ static int usbd_class_request_handler(uint8_t busid, struct usb_setup_packet *se static int usbd_vendor_request_handler(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) { uint32_t desclen; -#ifdef CONFIG_USBDEV_ADVANCE_DESC + if (g_usbd_core[busid].descriptors->msosv1_descriptor) { if (setup->bRequest == g_usbd_core[busid].descriptors->msosv1_descriptor->vendor_code) { switch (setup->wIndex) { @@ -982,61 +876,7 @@ static int usbd_vendor_request_handler(uint8_t busid, struct usb_setup_packet *s } } } -#else - if (g_usbd_core[busid].msosv1_desc) { - if (setup->bRequest == g_usbd_core[busid].msosv1_desc->vendor_code) { - switch (setup->wIndex) { - case 0x04: - *data = (uint8_t *)g_usbd_core[busid].msosv1_desc->compat_id; - desclen = g_usbd_core[busid].msosv1_desc->compat_id[0] + - (g_usbd_core[busid].msosv1_desc->compat_id[1] << 8) + - (g_usbd_core[busid].msosv1_desc->compat_id[2] << 16) + - (g_usbd_core[busid].msosv1_desc->compat_id[3] << 24); - //memcpy(*data, g_usbd_core[busid].msosv1_desc->compat_id, desclen); - *len = desclen; - return 0; - case 0x05: - *data = (uint8_t *)g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue]; - desclen = g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue][0] + - (g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue][1] << 8) + - (g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue][2] << 16) + - (g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue][3] << 24); - //memcpy(*data, g_usbd_core[busid].msosv1_desc->comp_id_property[setup->wValue], desclen); - *len = desclen; - return 0; - default: - return -1; - } - } - } else if (g_usbd_core[busid].msosv2_desc) { - if (setup->bRequest == g_usbd_core[busid].msosv2_desc->vendor_code) { - switch (setup->wIndex) { - case WINUSB_REQUEST_GET_DESCRIPTOR_SET: - *data = (uint8_t *)g_usbd_core[busid].msosv2_desc->compat_id; - //memcpy(*data, g_usbd_core[busid].msosv2_desc->compat_id, g_usbd_core[busid].msosv2_desc->compat_id_len); - *len = g_usbd_core[busid].msosv2_desc->compat_id_len; - return 0; - default: - return -1; - } - } - } - if (g_usbd_core[busid].webusb_url_desc) { - if (setup->bRequest == g_usbd_core[busid].webusb_url_desc->vendor_code) { - switch (setup->wIndex) { - case WEBUSB_REQUEST_GET_URL: - desclen = g_usbd_core[busid].webusb_url_desc->string_len; - *data = (uint8_t *)g_usbd_core[busid].webusb_url_desc->string; - //memcpy(*data, g_usbd_core[busid].webusb_url_desc->string, desclen); - *len = desclen; - return 0; - default: - return -1; - } - } - } -#endif for (uint8_t i = 0; i < g_usbd_core[busid].intf_offset; i++) { struct usbd_interface *intf = g_usbd_core[busid].intf[i]; @@ -1145,18 +985,22 @@ void usbd_event_suspend_handler(uint8_t busid) void usbd_event_reset_handler(uint8_t busid) { + struct usb_endpoint_descriptor ep0; + usbd_set_address(busid, 0); g_usbd_core[busid].device_address = 0; g_usbd_core[busid].configuration = 0; g_usbd_core[busid].ep0_next_state = USBD_EP0_STATE_SETUP; -#ifdef CONFIG_USBDEV_ADVANCE_DESC g_usbd_core[busid].speed = USB_SPEED_UNKNOWN; -#endif - struct usb_endpoint_descriptor ep0; + + USB_ASSERT_MSG(g_usbd_core[busid].descriptors->device_descriptor_callback != NULL, + "device_descriptor_callback is NULL\r\n"); + + struct usb_device_descriptor *device_desc = (struct usb_device_descriptor *)g_usbd_core[busid].descriptors->device_descriptor_callback(g_usbd_core[busid].speed); + ep0.wMaxPacketSize = device_desc->bMaxPacketSize0; ep0.bLength = 7; ep0.bDescriptorType = USB_DESCRIPTOR_TYPE_ENDPOINT; - ep0.wMaxPacketSize = USB_CTRL_EP_MPS; ep0.bmAttributes = USB_ENDPOINT_TYPE_CONTROL; ep0.bEndpointAddress = USB_CONTROL_IN_EP0; ep0.bInterval = 0; @@ -1369,7 +1213,6 @@ void usbd_event_ep_out_complete_handler(uint8_t busid, uint8_t ep, uint32_t nbyt } } -#ifdef CONFIG_USBDEV_ADVANCE_DESC void usbd_desc_register(uint8_t busid, const struct usb_descriptor *desc) { memset(&g_usbd_core[busid], 0, sizeof(struct usbd_core_priv)); @@ -1382,42 +1225,6 @@ void usbd_desc_register(uint8_t busid, const struct usb_descriptor *desc) g_usbd_core[busid].rx_msg[0].ep = 0x00; g_usbd_core[busid].rx_msg[0].cb = usbd_event_ep0_out_complete_handler; } -#else -void usbd_desc_register(uint8_t busid, const uint8_t *desc) -{ - memset(&g_usbd_core[busid], 0, sizeof(struct usbd_core_priv)); - - g_usbd_core[busid].descriptors = desc; - g_usbd_core[busid].intf_offset = 0; - - g_usbd_core[busid].tx_msg[0].ep = 0x80; - g_usbd_core[busid].tx_msg[0].cb = usbd_event_ep0_in_complete_handler; - g_usbd_core[busid].rx_msg[0].ep = 0x00; - g_usbd_core[busid].rx_msg[0].cb = usbd_event_ep0_out_complete_handler; -} - -/* Register MS OS Descriptors version 1 */ -void usbd_msosv1_desc_register(uint8_t busid, struct usb_msosv1_descriptor *desc) -{ - g_usbd_core[busid].msosv1_desc = desc; -} - -/* Register MS OS Descriptors version 2 */ -void usbd_msosv2_desc_register(uint8_t busid, struct usb_msosv2_descriptor *desc) -{ - g_usbd_core[busid].msosv2_desc = desc; -} - -void usbd_bos_desc_register(uint8_t busid, struct usb_bos_descriptor *desc) -{ - g_usbd_core[busid].bos_desc = desc; -} - -void usbd_webusb_desc_register(uint8_t busid, struct usb_webusb_descriptor *desc) -{ - g_usbd_core[busid].webusb_url_desc = desc; -} -#endif void usbd_add_interface(uint8_t busid, struct usbd_interface *intf) { @@ -1536,11 +1343,7 @@ int usbd_initialize(uint8_t busid, uintptr_t reg_base, void (*event_handler)(uin int ret; struct usbd_bus *bus; - if (busid >= CONFIG_USBDEV_MAX_BUS) { - USB_LOG_ERR("bus overflow\r\n"); - while (1) { - } - } + USB_ASSERT_MSG(busid < CONFIG_USBDEV_MAX_BUS, "bus overflow\r\n"); bus = &g_usbdev_bus[busid]; bus->reg_base = reg_base; @@ -1569,23 +1372,18 @@ int usbd_initialize(uint8_t busid, uintptr_t reg_base, void (*event_handler)(uin int usbd_deinitialize(uint8_t busid) { - if (busid >= CONFIG_USBDEV_MAX_BUS) { - USB_LOG_ERR("bus overflow\r\n"); - while (1) { - } - } + USB_ASSERT_MSG(busid < CONFIG_USBDEV_MAX_BUS, "bus overflow\r\n"); g_usbd_core[busid].event_handler(busid, USBD_EVENT_DEINIT); usbd_class_event_notify_handler(busid, USBD_EVENT_DEINIT, NULL); usb_dc_deinit(busid); - g_usbd_core[busid].intf_offset = 0; #ifdef CONFIG_USBDEV_EP0_THREAD - if (g_usbd_core[busid].usbd_ep0_mq) { - usb_osal_mq_delete(g_usbd_core[busid].usbd_ep0_mq); - } if (g_usbd_core[busid].usbd_ep0_thread) { usb_osal_thread_delete(g_usbd_core[busid].usbd_ep0_thread); } + if (g_usbd_core[busid].usbd_ep0_mq) { + usb_osal_mq_delete(g_usbd_core[busid].usbd_ep0_mq); + } #endif return 0; diff --git a/components/drivers/usb/cherryusb/core/usbd_core.h b/components/drivers/usb/cherryusb/core/usbd_core.h index 585668267c..314ccbec71 100644 --- a/components/drivers/usb/cherryusb/core/usbd_core.h +++ b/components/drivers/usb/cherryusb/core/usbd_core.h @@ -56,6 +56,7 @@ enum usbd_event_type { typedef int (*usbd_request_handler)(uint8_t busid, struct usb_setup_packet *setup, uint8_t **data, uint32_t *len); typedef void (*usbd_endpoint_callback)(uint8_t busid, uint8_t ep, uint32_t nbytes); typedef void (*usbd_notify_handler)(uint8_t busid, uint8_t event, void *arg); +typedef void (*usbd_event_handler_t)(uint8_t busid, uint8_t event); struct usbd_endpoint { uint8_t ep_addr; @@ -95,15 +96,7 @@ extern struct usbd_bus g_usbdev_bus[]; #error USBD_IRQHandler is obsolete, please call USBD_IRQHandler(xxx) in your irq #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC void usbd_desc_register(uint8_t busid, const struct usb_descriptor *desc); -#else -void usbd_desc_register(uint8_t busid, const uint8_t *desc); -void usbd_msosv1_desc_register(uint8_t busid, struct usb_msosv1_descriptor *desc); -void usbd_msosv2_desc_register(uint8_t busid, struct usb_msosv2_descriptor *desc); -void usbd_bos_desc_register(uint8_t busid, struct usb_bos_descriptor *desc); -void usbd_webusb_desc_register(uint8_t busid, struct usb_webusb_descriptor *desc); -#endif void usbd_add_interface(uint8_t busid, struct usbd_interface *intf); void usbd_add_endpoint(uint8_t busid, struct usbd_endpoint *ep); @@ -115,7 +108,7 @@ bool usb_device_is_suspend(uint8_t busid); int usbd_send_remote_wakeup(uint8_t busid); uint8_t usbd_get_ep0_next_state(uint8_t busid); -int usbd_initialize(uint8_t busid, uintptr_t reg_base, void (*event_handler)(uint8_t busid, uint8_t event)); +int usbd_initialize(uint8_t busid, uintptr_t reg_base, usbd_event_handler_t event_handler); int usbd_deinitialize(uint8_t busid); #ifdef __cplusplus diff --git a/components/drivers/usb/cherryusb/core/usbh_core.c b/components/drivers/usb/cherryusb/core/usbh_core.c index dc292e1375..43bba3e888 100644 --- a/components/drivers/usb/cherryusb/core/usbh_core.c +++ b/components/drivers/usb/cherryusb/core/usbh_core.c @@ -31,31 +31,38 @@ struct usbh_bus g_usbhost_bus[CONFIG_USBHOST_MAX_BUS]; #define USB_DEV_ADDR_MARK_OFFSET 5 #define USB_DEV_ADDR_MARK_MASK 0x1f +static void dummy_event_handler(uint8_t busid, uint8_t hub_index, uint8_t hub_port, uint8_t intf, uint8_t event) +{ + (void)busid; + (void)hub_index; + (void)hub_port; + (void)intf; + (void)event; +} + static int usbh_allocate_devaddr(struct usbh_devaddr_map *devgen) { - uint8_t startaddr = devgen->next; - uint8_t devaddr; + uint8_t lastaddr = devgen->last; + uint8_t devaddr = lastaddr; int index; int bitno; for (;;) { - devaddr = devgen->next; - if (devgen->next >= 0x7f) { - devgen->next = 2; - } else { - devgen->next++; + devaddr++; + if (devaddr > 0x7f) { + devaddr = 2; + } + if (devaddr == lastaddr) { + return -USB_ERR_NOMEM; } index = devaddr >> 5; bitno = devaddr & 0x1f; - if ((devgen->alloctab[index] & (1 << bitno)) == 0) { - devgen->alloctab[index] |= (1 << bitno); + if ((devgen->alloctab[index] & (1ul << bitno)) == 0) { + devgen->alloctab[index] |= (1ul << bitno); + devgen->last = devaddr; return (int)devaddr; } - - if (startaddr == devaddr) { - return -USB_ERR_NOMEM; - } } } @@ -69,15 +76,11 @@ static int __usbh_free_devaddr(struct usbh_devaddr_map *devgen, uint8_t devaddr) bitno = devaddr & USB_DEV_ADDR_MARK_MASK; /* Free the address */ - if ((devgen->alloctab[index] |= (1 << bitno)) != 0) { - devgen->alloctab[index] &= ~(1 << bitno); + if ((devgen->alloctab[index] & (1ul << bitno)) != 0) { + devgen->alloctab[index] &= ~(1ul << bitno); } else { return -1; } - - if (devaddr < devgen->next) { - devgen->next = devaddr; - } } return 0; @@ -91,7 +94,7 @@ static int usbh_free_devaddr(struct usbh_hubport *hport) return 0; } -static const struct usbh_class_driver *usbh_find_class_driver(uint8_t class, uint8_t subclass, uint8_t protocol, +static const struct usbh_class_driver *usbh_find_class_driver(uint8_t class, uint8_t subclass, uint8_t protocol, uint8_t intf, uint16_t vid, uint16_t pid) { struct usbh_class_info *index = NULL; @@ -106,6 +109,9 @@ static const struct usbh_class_driver *usbh_find_class_driver(uint8_t class, uin if ((index->match_flags & USB_CLASS_MATCH_INTF_PROTOCOL) && !(index->bInterfaceProtocol == protocol)) { continue; } + if ((index->match_flags & USB_CLASS_MATCH_INTF_NUM) && !(index->bInterfaceNumber == intf)) { + continue; + } if (index->match_flags & USB_CLASS_MATCH_VID_PID && index->id_table) { /* scan id table */ uint32_t i; @@ -275,60 +281,6 @@ static int parse_config_descriptor(struct usbh_hubport *hport, struct usb_config return 0; } -static void usbh_print_hubport_info(struct usbh_hubport *hport) -{ - USB_LOG_RAW("Device Descriptor:\r\n"); - USB_LOG_RAW("bLength: 0x%02x \r\n", hport->device_desc.bLength); - USB_LOG_RAW("bDescriptorType: 0x%02x \r\n", hport->device_desc.bDescriptorType); - USB_LOG_RAW("bcdUSB: 0x%04x \r\n", hport->device_desc.bcdUSB); - USB_LOG_RAW("bDeviceClass: 0x%02x \r\n", hport->device_desc.bDeviceClass); - USB_LOG_RAW("bDeviceSubClass: 0x%02x \r\n", hport->device_desc.bDeviceSubClass); - USB_LOG_RAW("bDeviceProtocol: 0x%02x \r\n", hport->device_desc.bDeviceProtocol); - USB_LOG_RAW("bMaxPacketSize0: 0x%02x \r\n", hport->device_desc.bMaxPacketSize0); - USB_LOG_RAW("idVendor: 0x%04x \r\n", hport->device_desc.idVendor); - USB_LOG_RAW("idProduct: 0x%04x \r\n", hport->device_desc.idProduct); - USB_LOG_RAW("bcdDevice: 0x%04x \r\n", hport->device_desc.bcdDevice); - USB_LOG_RAW("iManufacturer: 0x%02x \r\n", hport->device_desc.iManufacturer); - USB_LOG_RAW("iProduct: 0x%02x \r\n", hport->device_desc.iProduct); - USB_LOG_RAW("iSerialNumber: 0x%02x \r\n", hport->device_desc.iSerialNumber); - USB_LOG_RAW("bNumConfigurations: 0x%02x\r\n", hport->device_desc.bNumConfigurations); - - USB_LOG_RAW("Config Descriptor:\r\n"); - USB_LOG_RAW("bLength: 0x%02x \r\n", hport->config.config_desc.bLength); - USB_LOG_RAW("bDescriptorType: 0x%02x \r\n", hport->config.config_desc.bDescriptorType); - USB_LOG_RAW("wTotalLength: 0x%04x \r\n", hport->config.config_desc.wTotalLength); - USB_LOG_RAW("bNumInterfaces: 0x%02x \r\n", hport->config.config_desc.bNumInterfaces); - USB_LOG_RAW("bConfigurationValue: 0x%02x \r\n", hport->config.config_desc.bConfigurationValue); - USB_LOG_RAW("iConfiguration: 0x%02x \r\n", hport->config.config_desc.iConfiguration); - USB_LOG_RAW("bmAttributes: 0x%02x \r\n", hport->config.config_desc.bmAttributes); - USB_LOG_RAW("bMaxPower: 0x%02x \r\n", hport->config.config_desc.bMaxPower); - - for (uint8_t i = 0; i < hport->config.config_desc.bNumInterfaces; i++) { - for (uint8_t j = 0; j < hport->config.intf[i].altsetting_num; j++) { - USB_LOG_RAW("\tInterface Descriptor:\r\n"); - USB_LOG_RAW("\tbLength: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bLength); - USB_LOG_RAW("\tbDescriptorType: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bDescriptorType); - USB_LOG_RAW("\tbInterfaceNumber: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceNumber); - USB_LOG_RAW("\tbAlternateSetting: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bAlternateSetting); - USB_LOG_RAW("\tbNumEndpoints: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bNumEndpoints); - USB_LOG_RAW("\tbInterfaceClass: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceClass); - USB_LOG_RAW("\tbInterfaceSubClass: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceSubClass); - USB_LOG_RAW("\tbInterfaceProtocol: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceProtocol); - USB_LOG_RAW("\tiInterface: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.iInterface); - - for (uint8_t k = 0; k < hport->config.intf[i].altsetting[j].intf_desc.bNumEndpoints; k++) { - USB_LOG_RAW("\t\tEndpoint Descriptor:\r\n"); - USB_LOG_RAW("\t\tbLength: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bLength); - USB_LOG_RAW("\t\tbDescriptorType: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bDescriptorType); - USB_LOG_RAW("\t\tbEndpointAddress: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bEndpointAddress); - USB_LOG_RAW("\t\tbmAttributes: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bmAttributes); - USB_LOG_RAW("\t\twMaxPacketSize: 0x%04x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.wMaxPacketSize); - USB_LOG_RAW("\t\tbInterval: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bInterval); - } - } - } -} - static void usbh_print_setup(struct usb_setup_packet *setup) { (void)setup; @@ -466,7 +418,7 @@ int usbh_enumerate(struct usbh_hubport *hport) USB_LOG_INFO("The device has %d bNumConfigurations\r\n", ((struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid])->bNumConfigurations); - config_index = 0; + config_index = usbh_get_hport_active_config_index(hport); USB_LOG_DBG("The device selects config %d\r\n", config_index); /* Read the first 9 bytes of the config descriptor */ @@ -599,23 +551,35 @@ int usbh_enumerate(struct usbh_hubport *hport) } #endif USB_LOG_INFO("Enumeration success, start loading class driver\r\n"); + hport->bus->event_handler(hport->bus->busid, hport->parent->index, hport->port, USB_INTERFACE_ANY, USBH_EVENT_DEVICE_CONFIGURED); /*search supported class driver*/ for (uint8_t i = 0; i < hport->config.config_desc.bNumInterfaces; i++) { intf_desc = &hport->config.intf[i].altsetting[0].intf_desc; - struct usbh_class_driver *class_driver = (struct usbh_class_driver *)usbh_find_class_driver(intf_desc->bInterfaceClass, intf_desc->bInterfaceSubClass, intf_desc->bInterfaceProtocol, hport->device_desc.idVendor, hport->device_desc.idProduct); + USB_ASSERT_MSG(intf_desc->bInterfaceNumber == i, "Interface number mismatch, do not support non-standard device\r\n"); + + struct usbh_class_driver *class_driver = (struct usbh_class_driver *)usbh_find_class_driver(intf_desc->bInterfaceClass, + intf_desc->bInterfaceSubClass, + intf_desc->bInterfaceProtocol, + intf_desc->bInterfaceNumber, + hport->device_desc.idVendor, + hport->device_desc.idProduct); if (class_driver == NULL) { - USB_LOG_ERR("do not support Class:0x%02x,Subclass:0x%02x,Protocl:0x%02x\r\n", + USB_LOG_ERR("Do not support Class:0x%02x, Subclass:0x%02x, Protocl:0x%02x on interface %u\r\n", intf_desc->bInterfaceClass, intf_desc->bInterfaceSubClass, - intf_desc->bInterfaceProtocol); - + intf_desc->bInterfaceProtocol, + i); + hport->bus->event_handler(hport->bus->busid, hport->parent->index, hport->port, i, USBH_EVENT_INTERFACE_UNSUPPORTED); continue; } hport->config.intf[i].class_driver = class_driver; - USB_LOG_INFO("Loading %s class driver\r\n", class_driver->driver_name); + USB_LOG_INFO("Loading %s class driver on interface %u\r\n", class_driver->driver_name, i); ret = CLASS_CONNECT(hport, i); + if (ret >= 0) { + hport->bus->event_handler(hport->bus->busid, hport->parent->index, hport->port, i, USBH_EVENT_INTERFACE_START); + } } errout: @@ -630,17 +594,20 @@ void usbh_hubport_release(struct usbh_hubport *hport) { if (hport->connected) { hport->connected = false; + usbh_kill_urb(&hport->ep0_urb); usbh_free_devaddr(hport); for (uint8_t i = 0; i < hport->config.config_desc.bNumInterfaces; i++) { if (hport->config.intf[i].class_driver && hport->config.intf[i].class_driver->disconnect) { CLASS_DISCONNECT(hport, i); } + hport->bus->event_handler(hport->bus->busid, hport->parent->index, hport->port, i, USBH_EVENT_INTERFACE_STOP); } hport->config.config_desc.bNumInterfaces = 0; - usbh_kill_urb(&hport->ep0_urb); if (hport->mutex) { usb_osal_mutex_delete(hport->mutex); } + USB_LOG_INFO("Device on Bus %u, Hub %u, Port %u disconnected\r\n", hport->bus->busid, hport->parent->index, hport->port); + hport->bus->event_handler(hport->bus->busid, hport->parent->index, hport->port, USB_INTERFACE_ANY, USBH_EVENT_DEVICE_DISCONNECTED); } } @@ -652,25 +619,27 @@ static void usbh_bus_init(struct usbh_bus *bus, uint8_t busid, uintptr_t reg_bas bus->hcd.reg_base = reg_base; /* devaddr 1 is for roothub */ - bus->devgen.next = 2; + bus->devgen.last = 0x7f; usb_slist_add_tail(&g_bus_head, &bus->list); } -int usbh_initialize(uint8_t busid, uintptr_t reg_base) +int usbh_initialize(uint8_t busid, uintptr_t reg_base, usbh_event_handler_t event_handler) { struct usbh_bus *bus; - if (busid >= CONFIG_USBHOST_MAX_BUS) { - USB_LOG_ERR("bus overflow\r\n"); - while (1) { - } - } + USB_ASSERT_MSG(busid < CONFIG_USBHOST_MAX_BUS, "bus overflow\r\n"); bus = &g_usbhost_bus[busid]; usbh_bus_init(bus, busid, reg_base); + if (event_handler) { + bus->event_handler = event_handler; + } else { + bus->event_handler = dummy_event_handler; + } + #ifdef __ARMCC_VERSION /* ARM C Compiler */ extern const int usbh_class_info$$Base; extern const int usbh_class_info$$Limit; @@ -693,14 +662,12 @@ int usbh_deinitialize(uint8_t busid) { struct usbh_bus *bus; - if (busid >= CONFIG_USBHOST_MAX_BUS) { - USB_LOG_ERR("bus overflow\r\n"); - while (1) { - } - } + USB_ASSERT_MSG(busid < CONFIG_USBHOST_MAX_BUS, "bus overflow\r\n"); bus = &g_usbhost_bus[busid]; + bus->event_handler(bus->busid, USB_HUB_INDEX_ANY, USB_HUB_PORT_ANY, USB_INTERFACE_ANY, USBH_EVENT_DEINIT); + usbh_hub_deinitialize(bus); usb_slist_remove(&g_bus_head, &bus->list); @@ -711,6 +678,7 @@ int usbh_deinitialize(uint8_t busid) int usbh_control_transfer(struct usbh_hubport *hport, struct usb_setup_packet *setup, uint8_t *buffer) { struct usbh_urb *urb; + volatile uint8_t retry = 3; int ret; if (!hport || !setup) { @@ -723,12 +691,21 @@ int usbh_control_transfer(struct usbh_hubport *hport, struct usb_setup_packet *s usbh_print_setup(setup); +resubmit: usbh_control_urb_fill(urb, hport, setup, buffer, setup->wLength, CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT, NULL, NULL); ret = usbh_submit_urb(urb); if (ret == 0) { ret = urb->actual_length; } + if (ret < 0 && (ret != -USB_ERR_TIMEOUT)) { + retry--; + if (retry > 0) { + USB_LOG_WRN("Control transfer failed, errorcode %d, retrying...\r\n", ret); + goto resubmit; + } + } + usb_osal_mutex_give(hport->mutex); return ret; } @@ -816,73 +793,6 @@ static void *usbh_list_all_interface_name(struct usbh_hub *hub, const char *devn return NULL; } -static void usbh_list_all_interface_driver(struct usbh_hub *hub) -{ - struct usbh_hubport *hport; - struct usbh_hub *hub_next; - const char *speed_table[] = { "error-speed", "low-speed", "full-speed", "high-speed", "wireless-speed", "super-speed", "superplus-speed" }; - - for (uint8_t port = 0; port < hub->nports; port++) { - hport = &hub->child[port]; - if (hport->connected) { - for (uint8_t itf = 0; itf < hport->config.config_desc.bNumInterfaces; itf++) { - if (hport->config.intf[itf].class_driver && hport->config.intf[itf].class_driver->driver_name) { - for (uint8_t j = 0; j < hub->index; j++) { - USB_LOG_RAW("\t"); - } - - USB_LOG_RAW("|__Port %u, dev addr:0x%02x, If %u, ClassDriver=%s, %s\r\n", - hport->port, - hport->dev_addr, - itf, - hport->config.intf[itf].class_driver->driver_name, - speed_table[hport->speed]); - - if (strcmp(hport->config.intf[itf].class_driver->driver_name, "hub") == 0) { - hub_next = hport->config.intf[itf].priv; - - if (hub_next && hub_next->connected) { - usbh_list_all_interface_driver(hub_next); - } - } - } - } - } - } -} - -static void usbh_list_all_interface_desc(struct usbh_bus *bus, struct usbh_hub *hub) -{ - struct usbh_hubport *hport; - struct usbh_hub *hub_next; - - for (uint8_t port = 0; port < hub->nports; port++) { - hport = &hub->child[port]; - if (hport->connected) { - USB_LOG_RAW("\r\nBus %u, Hub %u, Port %u, dev addr:0x%02x, VID:PID 0x%04x:0x%04x\r\n", - bus->busid, - hub->index, - hport->port, - hport->dev_addr, - hport->device_desc.idVendor, - hport->device_desc.idProduct); - usbh_print_hubport_info(hport); - - for (uint8_t itf = 0; itf < hport->config.config_desc.bNumInterfaces; itf++) { - if (hport->config.intf[itf].class_driver && hport->config.intf[itf].class_driver->driver_name) { - if (strcmp(hport->config.intf[itf].class_driver->driver_name, "hub") == 0) { - hub_next = hport->config.intf[itf].priv; - - if (hub_next && hub_next->connected) { - usbh_list_all_interface_desc(bus, hub_next); - } - } - } - } - } - } -} - static struct usbh_hubport *usbh_list_all_hubport(struct usbh_hub *hub, uint8_t hub_index, uint8_t hub_port) { struct usbh_hubport *hport; @@ -960,64 +870,348 @@ struct usbh_hubport *usbh_find_hubport(uint8_t busid, uint8_t hub_index, uint8_t return hport; } +static void usbh_print_hubport_info(struct usbh_hubport *hport) +{ + USB_LOG_RAW("Device Descriptor:\r\n"); + USB_LOG_RAW(" bLength: 0x%02x \r\n", hport->device_desc.bLength); + USB_LOG_RAW(" bDescriptorType: 0x%02x \r\n", hport->device_desc.bDescriptorType); + USB_LOG_RAW(" bcdUSB: 0x%04x \r\n", hport->device_desc.bcdUSB); + USB_LOG_RAW(" bDeviceClass: 0x%02x \r\n", hport->device_desc.bDeviceClass); + USB_LOG_RAW(" bDeviceSubClass: 0x%02x \r\n", hport->device_desc.bDeviceSubClass); + USB_LOG_RAW(" bDeviceProtocol: 0x%02x \r\n", hport->device_desc.bDeviceProtocol); + USB_LOG_RAW(" bMaxPacketSize0: 0x%02x \r\n", hport->device_desc.bMaxPacketSize0); + USB_LOG_RAW(" idVendor: 0x%04x \r\n", hport->device_desc.idVendor); + USB_LOG_RAW(" idProduct: 0x%04x \r\n", hport->device_desc.idProduct); + USB_LOG_RAW(" bcdDevice: 0x%04x \r\n", hport->device_desc.bcdDevice); + USB_LOG_RAW(" iManufacturer: 0x%02x \r\n", hport->device_desc.iManufacturer); + USB_LOG_RAW(" iProduct: 0x%02x \r\n", hport->device_desc.iProduct); + USB_LOG_RAW(" iSerialNumber: 0x%02x \r\n", hport->device_desc.iSerialNumber); + USB_LOG_RAW(" bNumConfigurations: 0x%02x\r\n", hport->device_desc.bNumConfigurations); + + USB_LOG_RAW(" Config Descriptor:\r\n"); + USB_LOG_RAW(" bLength: 0x%02x \r\n", hport->config.config_desc.bLength); + USB_LOG_RAW(" bDescriptorType: 0x%02x \r\n", hport->config.config_desc.bDescriptorType); + USB_LOG_RAW(" wTotalLength: 0x%04x \r\n", hport->config.config_desc.wTotalLength); + USB_LOG_RAW(" bNumInterfaces: 0x%02x \r\n", hport->config.config_desc.bNumInterfaces); + USB_LOG_RAW(" bConfigurationValue: 0x%02x \r\n", hport->config.config_desc.bConfigurationValue); + USB_LOG_RAW(" iConfiguration: 0x%02x \r\n", hport->config.config_desc.iConfiguration); + USB_LOG_RAW(" bmAttributes: 0x%02x \r\n", hport->config.config_desc.bmAttributes); + USB_LOG_RAW(" bMaxPower: 0x%02x \r\n", hport->config.config_desc.bMaxPower); + + for (uint8_t i = 0; i < hport->config.config_desc.bNumInterfaces; i++) { + for (uint8_t j = 0; j < hport->config.intf[i].altsetting_num; j++) { + USB_LOG_RAW(" Interface Descriptor:\r\n"); + USB_LOG_RAW(" bLength: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bLength); + USB_LOG_RAW(" bDescriptorType: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bDescriptorType); + USB_LOG_RAW(" bInterfaceNumber: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceNumber); + USB_LOG_RAW(" bAlternateSetting: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bAlternateSetting); + USB_LOG_RAW(" bNumEndpoints: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bNumEndpoints); + USB_LOG_RAW(" bInterfaceClass: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceClass); + USB_LOG_RAW(" bInterfaceSubClass: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceSubClass); + USB_LOG_RAW(" bInterfaceProtocol: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.bInterfaceProtocol); + USB_LOG_RAW(" iInterface: 0x%02x \r\n", hport->config.intf[i].altsetting[j].intf_desc.iInterface); + + for (uint8_t k = 0; k < hport->config.intf[i].altsetting[j].intf_desc.bNumEndpoints; k++) { + USB_LOG_RAW(" Endpoint Descriptor:\r\n"); + USB_LOG_RAW(" bLength: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bLength); + USB_LOG_RAW(" bDescriptorType: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bDescriptorType); + USB_LOG_RAW(" bEndpointAddress: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bEndpointAddress); + USB_LOG_RAW(" bmAttributes: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bmAttributes); + USB_LOG_RAW(" wMaxPacketSize: 0x%04x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.wMaxPacketSize); + USB_LOG_RAW(" bInterval: 0x%02x \r\n", hport->config.intf[i].altsetting[j].ep[k].ep_desc.bInterval); + } + } + } +} + +static void usbh_list_device(struct usbh_hub *hub, bool astree, bool verbose, int dev_addr, int vid, int pid) +{ + static const char *speed_table[] = { + "UNKNOWN", + "low-speed", + "full-speed", + "high-speed", + "wireless", + "super-speed", + "super-speed-plus", + }; + + static const char *root_speed_table[] = { + "UNKNOWN", + "1.1", + "1.1", + "2.0", + "2.5", + "3.0", + "3.0", + }; + + static const uint16_t speed_baud[] = { + 0, + 12, + 12, + 480, + 480, + 5000, + 10000, + }; + + struct usbh_bus *bus; + struct usbh_hubport *hport; + struct usbh_hub *hub_next; + + uint8_t imbuf[64]; + uint8_t ipbuf[64]; + + const char *pimstr; + const char *pipstr; + + bool imvalid = false; + bool ipvalid = false; + + int ret; + + bus = hub->bus; + + (void)speed_table; + + if (hub->is_roothub) { + if (astree) { + USB_LOG_RAW("/: Bus %02u.Port 1: Dev %u, Class=root_hub, Driver=hcd, %uM\r\n", + bus->busid, hub->hub_addr, speed_baud[hub->speed]); + + } else { + if ((dev_addr < 0) || (hub->hub_addr == dev_addr)) { + if (((vid < 0) || (vid == 0xffff)) && ((pid < 0) || (pid == 0xffff))) { + USB_LOG_RAW("Bus %03u Device %03u: ID %04x:%04x %s %s root hub\r\n", + bus->busid, hub->hub_addr, 0xffff, 0xffff, + "Cherry-Embedded", root_speed_table[hub->speed]); + } + } + } + } + + for (uint8_t port = 0; port < hub->nports; port++) { + hport = &hub->child[port]; + if (hport->connected) { + ret = 0; + if (hport->device_desc.iManufacturer) { + memset(imbuf, 0, sizeof(imbuf)); + ret = usbh_get_string_desc(hport, hport->device_desc.iManufacturer, imbuf, sizeof(imbuf)); + if (ret == 0) { + imvalid = true; + } + } + + if (hport->device_desc.iProduct) { + memset(ipbuf, 0, sizeof(ipbuf)); + ret = usbh_get_string_desc(hport, hport->device_desc.iProduct, ipbuf, sizeof(ipbuf)); + if (ret == 0) { + ipvalid = true; + } + } + + if (imvalid) { + pimstr = (const char *)imbuf; + } else { + pimstr = "Not specified Manufacturer"; + } + + if (ipvalid) { + pipstr = (const char *)ipbuf; + } else { + pipstr = "Not specified Product"; + } + + if (!astree) { + if ((dev_addr < 0) || (hport->dev_addr == dev_addr)) { + if (((vid < 0) || (vid == hport->device_desc.idVendor)) && ((pid < 0) || (pid == hport->device_desc.idProduct))) { + USB_LOG_RAW("Bus %03u Device %03u: ID %04x:%04x %s %s\r\n", + bus->busid, hport->dev_addr, hport->device_desc.idVendor, hport->device_desc.idProduct, + pimstr, pipstr); + + if (verbose) { + usbh_print_hubport_info(hport); + } + } + } + } + + for (uint8_t intf = 0; intf < hport->config.config_desc.bNumInterfaces; intf++) { + if (hport->config.intf[intf].class_driver && hport->config.intf[intf].class_driver->driver_name) { + if (astree) { + for (uint8_t j = 0; j < hub->index; j++) { + USB_LOG_RAW(" "); + } + + USB_LOG_RAW("|__ Port %u: Dev %u, If %u, ClassDriver=%s, %uM\r\n", + hport->port, hport->dev_addr, intf, hport->config.intf[intf].class_driver->driver_name, speed_baud[hport->speed]); + } + + if (!strcmp(hport->config.intf[intf].class_driver->driver_name, "hub")) { + hub_next = hport->config.intf[intf].priv; + + if (hub_next && hub_next->connected) { + usbh_list_device(hub_next, astree, verbose, dev_addr, vid, pid); + } + } + } else if (astree) { + for (uint8_t j = 0; j < hub->index; j++) { + USB_LOG_RAW(" "); + } + + USB_LOG_RAW("|__ Port %u: Dev %u, If 0 ClassDriver=none, %uM\r\n", + hport->port, hport->dev_addr, speed_baud[hport->speed]); + } + } + } + } +} + +void lsusb_help(void) +{ + USB_LOG_RAW("List USB Devices\r\n" + "Usage: lsusb [options]...\r\n" + "\r\n" + "-v, --verbose\r\n" + " - increase verbosity (show descriptors)\r\n" + "-s [[bus]:][dev_addr]\r\n" + " - show only devices with specified device and/or\r\n" + " bus numbers (in decimal)\r\n" + "-d vendor:[product]\r\n" + " - show only devices with the specified vendor and\r\n" + " product ID numbers (in hexadecimal)\r\n" + "-t, --tree\r\n" + " - dump the physical USB device hierarchy as a tree\r\n" + "-V, --version\r\n" + " - show version of the cherryusb\r\n" + "-h, --help\r\n" + " - show usage and help information\r\n"); +} + int lsusb(int argc, char **argv) { usb_slist_t *bus_list; - struct usbh_hub *hub; struct usbh_bus *bus; - size_t flags; + + int busid = -1; + int dev_addr = -1; + int vid = -1; + int pid = -1; + bool astree = false; + bool verbose = false; if (argc < 2) { - USB_LOG_RAW("Usage: lsusb [options]...\r\n"); - USB_LOG_RAW("List USB devices\r\n"); - USB_LOG_RAW(" -v, --verbose\r\n"); - USB_LOG_RAW(" Increase verbosity (show descriptors)\r\n"); - // USB_LOG_RAW(" -s [[bus]:[devnum]]\r\n"); - // USB_LOG_RAW(" Show only devices with specified device and/or bus numbers (in decimal)\r\n"); - // USB_LOG_RAW(" -d vendor:[product]\r\n"); - // USB_LOG_RAW(" Show only devices with the specified vendor and product ID numbers (in hexadecimal)\r\n"); - USB_LOG_RAW(" -t, --tree\r\n"); - USB_LOG_RAW(" Dump the physical USB device hierachy as a tree\r\n"); - USB_LOG_RAW(" -V, --version\r\n"); - USB_LOG_RAW(" Show version of program\r\n"); - USB_LOG_RAW(" -h, --help\r\n"); - USB_LOG_RAW(" Show usage and help\r\n"); - return 0; - } - if (argc > 3) { + lsusb_help(); return 0; } - flags = usb_osal_enter_critical_section(); + while (argc > 1) { + argc--; + argv++; - if (strcmp(argv[1], "-V") == 0) { - USB_LOG_RAW("CherryUSB Version %s\r\n", CHERRYUSB_VERSION_STR); - } + if (!strcmp(*argv, "-V") || !strcmp(*argv, "--version")) { + USB_LOG_RAW("CherryUSB version %s\r\n", CHERRYUSB_VERSION_STR); + return 0; + } else if (!strcmp(*argv, "-h") || !strcmp(*argv, "--help")) { + lsusb_help(); + return 0; + } else if (!strcmp(*argv, "-v") || !strcmp(*argv, "--verbose")) { + verbose = true; + } else if (!strcmp(*argv, "-t") || !strcmp(*argv, "--tree")) { + astree = true; + } else if (!strcmp(*argv, "-s")) { + if (argc > 1) { + argc--; + argv++; + + if (*argv[0] == '-') { + continue; + } - if (strcmp(argv[1], "-t") == 0) { - usb_slist_for_each(bus_list, &g_bus_head) - { - bus = usb_slist_entry(bus_list, struct usbh_bus, list); - hub = &bus->hcd.roothub; + char *endptr; + const char *colon = strchr(*argv, ':'); + (void)endptr; - USB_LOG_RAW("/: Bus %u, Hub %u, ports=%u, is roothub\r\n", - bus->busid, - hub->index, - hub->nports); - usbh_list_all_interface_driver(hub); + if (colon != NULL) { + const char *str; + if (colon > *argv) { + busid = strtol(*argv, &endptr, 10); + } + str = colon + 1; + if (*str != '\0') { + dev_addr = strtol(str, &endptr, 10); + if (dev_addr <= 0 || dev_addr >= 128) { + dev_addr = -1; + } + } + } else { + dev_addr = strtol(*argv, &endptr, 10); + if (dev_addr <= 0 || dev_addr >= 128) { + dev_addr = -1; + } + } + } + } else if (!strcmp(*argv, "-d")) { + if (argc > 1) { + argc--; + argv++; + + if (*argv[0] == '-') { + continue; + } + + char *endptr; + const char *colon = strchr(*argv, ':'); + (void)endptr; + + if (colon == NULL) { + continue; + } + const char *str; + + vid = strtol(*argv, &endptr, 16); + if (vid < 0 || vid > 0xffff) { + vid = -1; + continue; + } + str = colon + 1; + if (*str != '\0') { + pid = strtol(str, &endptr, 16); + if (pid < 0 || pid > 0xffff) { + pid = -1; + } + } + } } } - if (strcmp(argv[1], "-v") == 0) { - usb_slist_for_each(bus_list, &g_bus_head) - { - bus = usb_slist_entry(bus_list, struct usbh_bus, list); - hub = &bus->hcd.roothub; + if (astree) { + busid = -1; + dev_addr = -1; + vid = -1; + pid = -1; + verbose = false; + } - usbh_list_all_interface_desc(bus, hub); + usb_slist_for_each(bus_list, &g_bus_head) + { + bus = usb_slist_entry(bus_list, struct usbh_bus, list); + if (busid >= 0) { + if (bus->busid != busid) { + continue; + } } + + usbh_list_device(&bus->hcd.roothub, astree, verbose, dev_addr, vid, pid); } - usb_osal_leave_critical_section(flags); return 0; } + +__WEAK uint8_t usbh_get_hport_active_config_index(struct usbh_hubport *hport) +{ + ARG_UNUSED(hport); + + return 0; // Default to configuration index 0 +} \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/core/usbh_core.h b/components/drivers/usb/cherryusb/core/usbh_core.h index 060c402ef6..903ce14fdb 100644 --- a/components/drivers/usb/cherryusb/core/usbh_core.h +++ b/components/drivers/usb/cherryusb/core/usbh_core.h @@ -28,11 +28,41 @@ extern "C" { #endif +enum usbh_event_type { + /* USB HCD IRQ */ + USBH_EVENT_ERROR, + USBH_EVENT_SOF, + + /* USB DEVICE STATUS */ + USBH_EVENT_DEVICE_RESET, + USBH_EVENT_DEVICE_CONNECTED, + USBH_EVENT_DEVICE_DISCONNECTED, + USBH_EVENT_DEVICE_CONFIGURED, + USBH_EVENT_DEVICE_WAKEUP, + USBH_EVENT_DEVICE_SUSPEND, + USBH_EVENT_DEVICE_RESUME, + + /* USB DEVICE INTERFACE STATUS */ + USBH_EVENT_INTERFACE_UNSUPPORTED, + USBH_EVENT_INTERFACE_START, + USBH_EVENT_INTERFACE_STOP, + + /* USB FRAMEWORK STATUS */ + USBH_EVENT_INIT, + USBH_EVENT_DEINIT, + USBH_EVENT_UNKNOWN, +}; + +#define USB_HUB_PORT_ANY 0 +#define USB_HUB_INDEX_ANY 0 +#define USB_INTERFACE_ANY 0xff + #define USB_CLASS_MATCH_VENDOR 0x0001 #define USB_CLASS_MATCH_PRODUCT 0x0002 #define USB_CLASS_MATCH_INTF_CLASS 0x0004 #define USB_CLASS_MATCH_INTF_SUBCLASS 0x0008 #define USB_CLASS_MATCH_INTF_PROTOCOL 0x0010 +#define USB_CLASS_MATCH_INTF_NUM 0x0020 #define USB_CLASS_MATCH_VID_PID (USB_CLASS_MATCH_VENDOR | USB_CLASS_MATCH_PRODUCT) #define CLASS_CONNECT(hport, i) ((hport)->config.intf[i].class_driver->connect(hport, i)) @@ -60,11 +90,14 @@ extern "C" { USB_GET_MULT(ep_desc->wMaxPacketSize)); \ } while (0) +typedef void (*usbh_event_handler_t)(uint8_t busid, uint8_t hub_index, uint8_t hub_port, uint8_t intf, uint8_t event); + struct usbh_class_info { uint8_t match_flags; /* Used for product specific matches; range is inclusive */ uint8_t bInterfaceClass; /* Base device class code */ uint8_t bInterfaceSubClass; /* Sub-class, depends on base class. Eg. */ uint8_t bInterfaceProtocol; /* Protocol, depends on base class. Eg. */ + uint8_t bInterfaceNumber; /* Interface number */ const uint16_t (*id_table)[2]; /* List of Vendor/Product ID pairs */ const struct usbh_class_driver *class_driver; }; @@ -131,7 +164,7 @@ struct usbh_hub { uint8_t powerdelay; uint8_t tt_think; bool ismtt; - struct usb_hub_descriptor hub_desc; /* USB 2.0 only */ + struct usb_hub_descriptor hub_desc; /* USB 2.0 only */ struct usb_hub_ss_descriptor hub_ss_desc; /* USB 3.0 only */ struct usbh_hubport child[CONFIG_USBHOST_MAX_EHPORTS]; struct usbh_hubport *parent; @@ -150,7 +183,7 @@ struct usbh_devaddr_map { * alloctab[3]:addr from 96~127 * */ - uint8_t next; /* Next device address */ + uint8_t last; /* Last device address */ uint32_t alloctab[4]; /* Bit allocation table */ }; @@ -168,6 +201,8 @@ struct usbh_bus { struct usbh_devaddr_map devgen; usb_osal_thread_t hub_thread; usb_osal_mq_t hub_mq; + usb_osal_mutex_t mutex; + usbh_event_handler_t event_handler; }; static inline void usbh_control_urb_fill(struct usbh_urb *urb, @@ -274,10 +309,11 @@ int usbh_get_string_desc(struct usbh_hubport *hport, uint8_t index, uint8_t *out */ int usbh_set_interface(struct usbh_hubport *hport, uint8_t intf, uint8_t altsetting); -int usbh_initialize(uint8_t busid, uintptr_t reg_base); +int usbh_initialize(uint8_t busid, uintptr_t reg_base, usbh_event_handler_t event_handler); int usbh_deinitialize(uint8_t busid); void *usbh_find_class_instance(const char *devname); struct usbh_hubport *usbh_find_hubport(uint8_t busid, uint8_t hub_index, uint8_t hub_port); +uint8_t usbh_get_hport_active_config_index(struct usbh_hubport *hport); int lsusb(int argc, char **argv); diff --git a/components/drivers/usb/cherryusb/core/usbotg_core.c b/components/drivers/usb/cherryusb/core/usbotg_core.c new file mode 100644 index 0000000000..99b0cc8a6b --- /dev/null +++ b/components/drivers/usb/cherryusb/core/usbotg_core.c @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbotg_core.h" + +#ifdef CONFIG_USB_OTG_ENABLE +#undef USB_DBG_TAG +#define USB_DBG_TAG "usbotg_core" +#include "usb_log.h" + +#define CONFIG_USB_OTG_MAX_BUS CONFIG_USBHOST_MAX_BUS + +struct usbotg_core_priv { + uint8_t busid; + uint32_t reg_base; + bool usbh_initialized; + bool usbd_initialized; + usbd_event_handler_t device_event_callback; + usbh_event_handler_t host_event_callback; + uint8_t request_mode; + usb_osal_sem_t change_sem; + usb_osal_thread_t change_thread; +} g_usbotg_core[CONFIG_USB_OTG_MAX_BUS]; + +static void usbotg_host_initialize(uint8_t busid) +{ + if (g_usbotg_core[busid].usbh_initialized) { + return; + } + + if (g_usbotg_core[busid].usbd_initialized) { + usbd_deinitialize(busid); + g_usbotg_core[busid].usbd_initialized = false; + } + + USB_LOG_INFO("Switch to HOST mode\r\n"); + + g_usbotg_core[busid].usbh_initialized = true; + usbh_initialize(busid, g_usbotg_core[busid].reg_base); +} + +static void usbotg_device_initialize(uint8_t busid) +{ + if (g_usbotg_core[busid].usbd_initialized) { + return; + } + + if (g_usbotg_core[busid].usbh_initialized) { + usbh_deinitialize(busid); + g_usbotg_core[busid].usbh_initialized = false; + } + + USB_LOG_INFO("Switch to DEVICE mode\r\n"); + + g_usbotg_core[busid].usbd_initialized = true; + usbd_initialize(g_usbotg_core[busid].busid, g_usbotg_core[busid].reg_base, g_usbotg_core[busid].device_event_callback); +} + +static void usbotg_rolechange_thread(void *argument) +{ + uint8_t busid = (uint8_t)(uintptr_t)argument; + + usb_otg_init(busid); + + while (1) { + if (usb_osal_sem_take(g_usbotg_core[busid].change_sem, USB_OSAL_WAITING_FOREVER) == 0) { + if (g_usbotg_core[busid].request_mode == USBOTG_MODE_HOST) { + usbotg_host_initialize(busid); + } else if (g_usbotg_core[busid].request_mode == USBOTG_MODE_DEVICE) { + usbotg_device_initialize(busid); + } + } + } +} + +int usbotg_initialize(uint8_t busid, uint32_t reg_base, usbd_event_handler_t device_event_callback, usbh_event_handler_t host_event_callback, uint8_t default_role) +{ + char thread_name[32] = { 0 }; + + USB_ASSERT_MSG(busid < CONFIG_USB_OTG_MAX_BUS, "bus overflow\r\n"); + + g_usbotg_core[busid].busid = busid; + g_usbotg_core[busid].reg_base = reg_base; + g_usbotg_core[busid].device_event_callback = device_event_callback; + g_usbotg_core[busid].host_event_callback = host_event_callback; + + g_usbotg_core[busid].change_sem = usb_osal_sem_create(0); + if (g_usbotg_core[busid].change_sem == NULL) { + USB_LOG_ERR("Failed to create change_sem\r\n"); + while (1) { + } + } + + snprintf(thread_name, 32, "usbotg%u", busid); + g_usbotg_core[busid].change_thread = usb_osal_thread_create(thread_name, 2048, 10, usbotg_rolechange_thread, (void *)(uintptr_t)busid); + if (g_usbotg_core[busid].change_thread == NULL) { + USB_LOG_ERR("Failed to create usbotg thread\r\n"); + while (1) { + } + } + + usbotg_trigger_role_change(busid, default_role); + return 0; +} + +int usbotg_deinitialize(uint8_t busid) +{ + USB_ASSERT_MSG(busid < CONFIG_USB_OTG_MAX_BUS, "bus overflow\r\n"); + + if (g_usbotg_core[busid].usbd_initialized) { + usbd_deinitialize(busid); + g_usbotg_core[busid].usbd_initialized = false; + } + + if (g_usbotg_core[busid].usbh_initialized) { + usbh_deinitialize(busid); + g_usbotg_core[busid].usbh_initialized = false; + } + + if (g_usbotg_core[busid].change_thread) { + usb_osal_thread_delete(g_usbotg_core[busid].change_thread); + } + + if (g_usbotg_core[busid].change_sem) { + usb_otg_deinit(busid); + usb_osal_sem_delete(g_usbotg_core[busid].change_sem); + } + + return 0; +} + +void usbotg_trigger_role_change(uint8_t busid, uint8_t mode) +{ + USB_ASSERT_MSG(busid < CONFIG_USB_OTG_MAX_BUS, "bus overflow\r\n"); + + g_usbotg_core[busid].request_mode = mode; + + if (g_usbotg_core[busid].change_sem) { + usb_osal_sem_give(g_usbotg_core[busid].change_sem); + } +} + +void USBOTG_IRQHandler(uint8_t busid) +{ + USB_ASSERT_MSG(busid < CONFIG_USB_OTG_MAX_BUS, "bus overflow\r\n"); + + if (g_usbotg_core[busid].usbh_initialized) { + USBH_IRQHandler(busid); + } else if (g_usbotg_core[busid].usbd_initialized) { + USBD_IRQHandler(busid); + } +} +#endif /* CONFIG_USB_OTG_ENABLE */ \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/core/usbotg_core.h b/components/drivers/usb/cherryusb/core/usbotg_core.h new file mode 100644 index 0000000000..7eadb878ca --- /dev/null +++ b/components/drivers/usb/cherryusb/core/usbotg_core.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#ifndef USBOTG_CORE_H +#define USBOTG_CORE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_otg.h" + +int usbotg_initialize(uint8_t busid, uint32_t reg_base, usbd_event_handler_t device_event_callback, usbh_event_handler_t host_event_callback, uint8_t default_role); +int usbotg_deinitialize(uint8_t busid); + +/* called by user */ +void usbotg_trigger_role_change(uint8_t busid, uint8_t mode); + +#ifdef __cplusplus +} +#endif + +#endif /* USBOTG_CORE_H */ \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/demo/adb/usbd_adb_template.c b/components/drivers/usb/cherryusb/demo/adb/usbd_adb_template.c index 24f6d7acb5..9f77e73d04 100644 --- a/components/drivers/usb/cherryusb/demo/adb/usbd_adb_template.c +++ b/components/drivers/usb/cherryusb/demo/adb/usbd_adb_template.c @@ -108,7 +108,6 @@ struct usb_msosv1_descriptor msosv1_desc = { .comp_id_property = WINUSB_IFx_WCIDProperties, }; -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0100, 0x01) }; @@ -171,80 +170,6 @@ const struct usb_descriptor adb_descriptor = { .string_descriptor_callback = string_descriptor_callback, .msosv1_descriptor = &msosv1_desc }; -#else -/*!< global descriptor */ -static const uint8_t adb_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0100, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - ADB_DESCRIPTOR_INIT(ADB_INTF_NUM, WINUSB_IN_EP, WINUSB_OUT_EP, WINUSB_MAX_MPS), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'A', 0x00, /* wcChar6 */ - 'D', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x1C, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'A', 0x00, /* wcChar6 */ - 'D', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - '2', 0x00, /* wcChar9 */ - '0', 0x00, /* wcChar10 */ - '2', 0x00, /* wcChar11 */ - '4', 0x00, /* wcChar12 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif static void usbd_event_handler(uint8_t busid, uint8_t event) { @@ -288,20 +213,15 @@ void cherryadb_init(uint8_t busid, uint32_t reg_base) /* shell_init() must be called in-task */ if (0 != shell_init(false)) { /* shell failed to be initialized */ - printf("Failed to initialize shell\r\n"); + USB_LOG_RAW("Failed to initialize shell\r\n"); for (;;) { ; } } #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &adb_descriptor); -#else - usbd_desc_register(busid, adb_descriptor); -#endif -#ifndef CONFIG_USBDEV_ADVANCE_DESC - usbd_msosv1_desc_register(busid, &msosv1_desc); -#endif + usbd_add_interface(busid, usbd_adb_init_intf(busid, &intf0, WINUSB_IN_EP, WINUSB_OUT_EP)); usbd_initialize(busid, reg_base, usbd_event_handler); -} +} \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/demo/audio_v1_mic_multichan_template.c b/components/drivers/usb/cherryusb/demo/audio_v1_mic_multichan_template.c index 94ca950c96..aad917abbf 100644 --- a/components/drivers/usb/cherryusb/demo/audio_v1_mic_multichan_template.c +++ b/components/drivers/usb/cherryusb/demo/audio_v1_mic_multichan_template.c @@ -21,14 +21,15 @@ #define AUDIO_IN_FU_ID 0x02 -/* AUDIO Class Config */ -#define AUDIO_FREQ 16000U +#define AUDIO_MIC_FREQ 16000U +#define AUDIO_MIC_FRAME_SIZE_BYTE 2u +#define AUDIO_MIC_RESOLUTION_BIT 16u -#define IN_CHANNEL_NUM 1 +#define IN_CHANNEL_NUM 2 #if IN_CHANNEL_NUM == 1 #define INPUT_CTRL 0x03, 0x03 -#define INPUT_CH_ENABLE 0x0000 +#define INPUT_CH_ENABLE 0x0001 #elif IN_CHANNEL_NUM == 2 #define INPUT_CTRL 0x03, 0x03, 0x03 #define INPUT_CH_ENABLE 0x0003 @@ -54,32 +55,31 @@ /* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 1) */ /* 16bit(2 Bytes) 单声道(Mono:1) */ -#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_FREQ * 2 * IN_CHANNEL_NUM) / 1000)) +#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_MIC_FREQ * 2 * IN_CHANNEL_NUM) / 1000)) -#define USB_AUDIO_CONFIG_DESC_SIZ (unsigned long)(9 + \ - AUDIO_AC_DESCRIPTOR_INIT_LEN(1) + \ - AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ - AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_AS_DESCRIPTOR_INIT_LEN(1)) +#define USB_CONFIG_SIZE (unsigned long)(9 + \ + AUDIO_AC_DESCRIPTOR_LEN(1) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_AS_DESCRIPTOR_LEN(1)) #define AUDIO_AC_SIZ (AUDIO_SIZEOF_AC_HEADER_DESC(1) + \ AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC) -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) }; static const uint8_t config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, 0x00, 0x01), AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, IN_CHANNEL_NUM, INPUT_CH_ENABLE), AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x01, 0x01, INPUT_CTRL), AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID), - AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x03, IN_CHANNEL_NUM, 2, 16, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_FREQ)) + AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x03, IN_CHANNEL_NUM, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_MIC_FREQ)) }; static const uint8_t device_quality_descriptor[] = { @@ -134,89 +134,6 @@ const struct usb_descriptor audio_v1_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t audio_v1_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, 0x00, 0x01), - AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, IN_CHANNEL_NUM, INPUT_CH_ENABLE), - AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x01, 0x01, INPUT_CTRL), - AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID), - AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x03, IN_CHANNEL_NUM, 2, 16, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_FREQ)), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'U', 0x00, /* wcChar10 */ - 'A', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '0' + IN_CHANNEL_NUM, 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif volatile bool tx_flag = 0; volatile bool ep_tx_busy_flag = false; @@ -301,13 +218,12 @@ struct audio_entity_info audio_entity_table[] = { .ep = AUDIO_IN_EP }, }; +// In windows, audio driver cannot remove auto, so when you modify any descriptor information, please modify string descriptors too. + void audio_v1_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &audio_v1_descriptor); -#else - usbd_desc_register(busid, audio_v1_descriptor); -#endif + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0100, audio_entity_table, 1)); usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0100, audio_entity_table, 1)); usbd_add_endpoint(busid, &audio_in_ep); diff --git a/components/drivers/usb/cherryusb/demo/audio_v1_mic_speaker_multichan_template.c b/components/drivers/usb/cherryusb/demo/audio_v1_mic_speaker_multichan_template.c index c764ee9323..872a6cde70 100644 --- a/components/drivers/usb/cherryusb/demo/audio_v1_mic_speaker_multichan_template.c +++ b/components/drivers/usb/cherryusb/demo/audio_v1_mic_speaker_multichan_template.c @@ -21,13 +21,69 @@ #define FEEDBACK_ENDP_PACKET_SIZE 0x03 #endif -#define AUDIO_IN_EP 0x81 -#define AUDIO_OUT_EP 0x02 +#define AUDIO_IN_EP 0x81 +#define AUDIO_OUT_EP 0x02 #define AUDIO_OUT_FEEDBACK_EP 0x83 #define AUDIO_IN_FU_ID 0x02 #define AUDIO_OUT_FU_ID 0x05 +#define IN_CHANNEL_NUM 2 + +#if IN_CHANNEL_NUM == 1 +#define INPUT_CTRL 0x03, 0x03 +#define INPUT_CH_ENABLE 0x0001 +#elif IN_CHANNEL_NUM == 2 +#define INPUT_CTRL 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x0003 +#elif IN_CHANNEL_NUM == 3 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x0007 +#elif IN_CHANNEL_NUM == 4 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x000f +#elif IN_CHANNEL_NUM == 5 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x001f +#elif IN_CHANNEL_NUM == 6 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x003F +#elif IN_CHANNEL_NUM == 7 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x007f +#elif IN_CHANNEL_NUM == 8 +#define INPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define INPUT_CH_ENABLE 0x00ff +#endif + +#define OUT_CHANNEL_NUM 2 + +#if OUT_CHANNEL_NUM == 1 +#define OUTPUT_CTRL 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x0001 +#elif OUT_CHANNEL_NUM == 2 +#define OUTPUT_CTRL 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x0003 +#elif OUT_CHANNEL_NUM == 3 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x0007 +#elif OUT_CHANNEL_NUM == 4 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x000f +#elif OUT_CHANNEL_NUM == 5 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x001f +#elif OUT_CHANNEL_NUM == 6 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x003F +#elif OUT_CHANNEL_NUM == 7 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x007f +#elif OUT_CHANNEL_NUM == 8 +#define OUTPUT_CTRL 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 +#define OUTPUT_CH_ENABLE 0x00ff +#endif + /* AUDIO Class Config */ #define AUDIO_SPEAKER_FREQ 16000U #define AUDIO_SPEAKER_FRAME_SIZE_BYTE 2u @@ -44,60 +100,59 @@ #define AUDIO_IN_PACKET ((uint32_t)((AUDIO_MIC_FREQ * AUDIO_MIC_FRAME_SIZE_BYTE * 2) / 1000)) #if USING_FEEDBACK == 0 -#define USB_AUDIO_CONFIG_DESC_SIZ (unsigned long)(9 + \ - AUDIO_AC_DESCRIPTOR_INIT_LEN(2) + \ - AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ - AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ - AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_AS_DESCRIPTOR_INIT_LEN(1) + \ - AUDIO_AS_DESCRIPTOR_INIT_LEN(1)) +#define USB_CONFIG_SIZE (unsigned long)(9 + \ + AUDIO_AC_DESCRIPTOR_LEN(2) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_AS_DESCRIPTOR_LEN(1) + \ + AUDIO_AS_DESCRIPTOR_LEN(1)) #else -#define USB_AUDIO_CONFIG_DESC_SIZ (unsigned long)(9 + \ - AUDIO_AC_DESCRIPTOR_INIT_LEN(2) + \ - AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ - AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ - AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_AS_DESCRIPTOR_INIT_LEN(1) + \ - AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT_LEN(1)) +#define USB_CONFIG_SIZE (unsigned long)(9 + \ + AUDIO_AC_DESCRIPTOR_LEN(2) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_AS_DESCRIPTOR_LEN(1) + \ + AUDIO_AS_FEEDBACK_DESCRIPTOR_LEN(1)) #endif -#define AUDIO_AC_SIZ (AUDIO_SIZEOF_AC_HEADER_DESC(2) + \ - AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ - AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ +#define AUDIO_AC_SIZ (AUDIO_SIZEOF_AC_HEADER_DESC(2) + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM, 1) + \ + AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM, 1) + \ AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC) -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) }; static const uint8_t config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x03, AUDIO_AC_SIZ, 0x00, 0x01, 0x02), - AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, 0x02, 0x0003), - AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x02, 0x01, 0x01, 0x03, 0x00, 0x00), - AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, 0x02), - AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, 0x02, 0x0003), - AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x05, 0x04, 0x01, 0x03, 0x00, 0x00), - AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_OUTTERM_SPEAKER, 0x05), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, IN_CHANNEL_NUM, INPUT_CH_ENABLE), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x01, 0x01, INPUT_CTRL), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID), + AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE), + AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_OUT_FU_ID, 0x04, 0x01, OUTPUT_CTRL), + AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_OUTTERM_SPEAKER, AUDIO_OUT_FU_ID), + AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x03, IN_CHANNEL_NUM, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, + EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_MIC_FREQ)), #if USING_FEEDBACK == 0 - AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x04, 0x02, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, + AUDIO_AS_DESCRIPTOR_INIT(0x02, 0x04, OUT_CHANNEL_NUM, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), #else - AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT(0x01, 0x04, 0x02, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, AUDIO_OUT_PACKET, - EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), + AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT(0x02, 0x04, OUT_CHANNEL_NUM, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, AUDIO_OUT_PACKET, + EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), #endif - AUDIO_AS_DESCRIPTOR_INIT(0x02, 0x03, 0x02, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, - EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_MIC_FREQ)) }; static const uint8_t device_quality_descriptor[] = { @@ -152,104 +207,6 @@ const struct usb_descriptor audio_v1_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t audio_v1_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x03, AUDIO_AC_SIZ, 0x00, 0x01, 0x02), - AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, 0x02, 0x0003), - AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x02, 0x01, 0x01, 0x03, 0x00, 0x00), - AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, 0x02), - AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, 0x02, 0x0003), - AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x05, 0x04, 0x01, 0x03, 0x00, 0x00), - AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_OUTTERM_SPEAKER, 0x05), -#if USING_FEEDBACK == 0 - AUDIO_AS_DESCRIPTOR_INIT(0x01, 0x04, 0x02, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, - EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), -#else - AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT(0x01, 0x04, 0x02, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, AUDIO_OUT_PACKET, - EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), -#endif - AUDIO_AS_DESCRIPTOR_INIT(0x02, 0x03, 0x02, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, - EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_MIC_FREQ)), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'U', 0x00, /* wcChar10 */ - 'A', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ -#if USING_FEEDBACK == 0 - '1', 0x00, /* wcChar9 */ -#else - '2', 0x00, /* wcChar9 */ -#endif -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[AUDIO_OUT_PACKET]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[AUDIO_IN_PACKET]; @@ -297,11 +254,11 @@ void usbd_audio_open(uint8_t busid, uint8_t intf) AUDIO_FEEDBACK_TO_BUF_FS(s_speaker_feedback_buffer, feedback_value); /* uac1 can only use 10.14 */ usbd_ep_start_write(busid, AUDIO_OUT_FEEDBACK_EP, s_speaker_feedback_buffer, FEEDBACK_ENDP_PACKET_SIZE); #endif - printf("OPEN1\r\n"); + USB_LOG_INFO("OPEN1\r\n"); } else { tx_flag = 1; ep_tx_busy_flag = false; - printf("OPEN2\r\n"); + USB_LOG_INFO("OPEN2\r\n"); } } @@ -309,11 +266,11 @@ void usbd_audio_close(uint8_t busid, uint8_t intf) { if (intf == 1) { rx_flag = 0; - printf("CLOSE1\r\n"); + USB_LOG_INFO("CLOSE1\r\n"); } else { tx_flag = 0; ep_tx_busy_flag = false; - printf("CLOSE2\r\n"); + USB_LOG_INFO("CLOSE2\r\n"); } } @@ -393,13 +350,12 @@ struct audio_entity_info audio_entity_table[] = { .ep = AUDIO_OUT_EP }, }; +// In windows, audio driver cannot remove auto, so when you modify any descriptor information, please modify string descriptors too. + void audio_v1_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &audio_v1_descriptor); -#else - usbd_desc_register(busid, audio_v1_descriptor); -#endif + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0100, audio_entity_table, 2)); usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0100, audio_entity_table, 2)); usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf2, 0x0100, audio_entity_table, 2)); diff --git a/components/drivers/usb/cherryusb/demo/audio_v2_mic_multichan_template.c b/components/drivers/usb/cherryusb/demo/audio_v2_mic_multichan_template.c index cd6e9b151a..c904455049 100644 --- a/components/drivers/usb/cherryusb/demo/audio_v2_mic_multichan_template.c +++ b/components/drivers/usb/cherryusb/demo/audio_v2_mic_multichan_template.c @@ -22,17 +22,17 @@ #define AUDIO_IN_CLOCK_ID 0x01 #define AUDIO_IN_FU_ID 0x03 -#define AUDIO_IN_MAX_FREQ 16000 -#define HALF_WORD_BYTES 2 //2 half word (one channel) -#define SAMPLE_BITS 16 //16 bit per channel +#define AUDIO_IN_MAX_FREQ 96000 +#define AUDIO_MIC_FRAME_SIZE_BYTE 2u +#define AUDIO_MIC_RESOLUTION_BIT 16u -#define BMCONTROL (AUDIO_V2_FU_CONTROL_MUTE | AUDIO_V2_FU_CONTROL_VOLUME) +#define BMCONTROL (AUDIO_V2_CONTROL_MUTE | AUDIO_V2_CONTROL_VOLUME) #define IN_CHANNEL_NUM 2 #if IN_CHANNEL_NUM == 1 #define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) -#define INPUT_CH_ENABLE 0x00000000 +#define INPUT_CH_ENABLE 0x00000001 #elif IN_CHANNEL_NUM == 2 #define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x00000003 @@ -56,15 +56,15 @@ #define INPUT_CH_ENABLE 0x000000ff #endif -#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_IN_MAX_FREQ * HALF_WORD_BYTES * IN_CHANNEL_NUM) / 1000)) +#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_IN_MAX_FREQ * AUDIO_MIC_FRAME_SIZE_BYTE * IN_CHANNEL_NUM) / 1000)) -#define USB_AUDIO_CONFIG_DESC_SIZ (9 + \ - AUDIO_V2_AC_DESCRIPTOR_INIT_LEN + \ - AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ - AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ - AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_V2_AS_DESCRIPTOR_INIT_LEN) +#define USB_CONFIG_SIZE (9 + \ + AUDIO_V2_AC_DESCRIPTOR_LEN + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_AS_DESCRIPTOR_LEN) #define AUDIO_AC_SIZ (AUDIO_V2_SIZEOF_AC_HEADER_DESC + \ AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ @@ -72,19 +72,18 @@ AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC) -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01) }; static const uint8_t config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, AUDIO_CATEGORY_MICROPHONE, 0x00, 0x00), - AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(0x01, 0x03, 0x03), - AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_INTERM_MIC, 0x01, IN_CHANNEL_NUM, INPUT_CH_ENABLE, 0x0000), - AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x03, 0x02, INPUT_CTRL), - AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, 0x03, 0x01, 0x0000), - AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x04, IN_CHANNEL_NUM, INPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_IN_EP, 0x05, (AUDIO_IN_PACKET + 4), EP_INTERVAL) + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_IN_CLOCK_ID, 0x03, 0x03), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_INTERM_MIC, AUDIO_IN_CLOCK_ID, IN_CHANNEL_NUM, INPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x02, INPUT_CTRL), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID, AUDIO_IN_CLOCK_ID, 0x0000), + AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x04, IN_CHANNEL_NUM, INPUT_CH_ENABLE, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, (AUDIO_IN_PACKET + 4), EP_INTERVAL) }; static const uint8_t device_quality_descriptor[] = { @@ -139,96 +138,24 @@ const struct usb_descriptor audio_v2_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t audio_v2_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, AUDIO_CATEGORY_MICROPHONE, 0x00, 0x00), - AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(0x01, 0x03, 0x03), - AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_INTERM_MIC, 0x01, IN_CHANNEL_NUM, INPUT_CH_ENABLE, 0x0000), - AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x03, 0x02, INPUT_CTRL), - AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, 0x03, 0x01, 0x0000), - AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x04, IN_CHANNEL_NUM, INPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_IN_EP, 0x05, (AUDIO_IN_PACKET + 4), EP_INTERVAL), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'U', 0x00, /* wcChar10 */ - 'A', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '1', 0x00, /* wcChar3 */ - '0', 0x00, /* wcChar4 */ - '3', 0x00, /* wcChar5 */ - '1', 0x00, /* wcChar6 */ - '0', 0x00, /* wcChar7 */ - '0', 0x00, /* wcChar8 */ - '4', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif static const uint8_t mic_default_sampling_freq_table[] = { - AUDIO_SAMPLE_FREQ_NUM(1), + AUDIO_SAMPLE_FREQ_NUM(5), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(0x00), AUDIO_SAMPLE_FREQ_4B(16000), AUDIO_SAMPLE_FREQ_4B(16000), - AUDIO_SAMPLE_FREQ_4B(0x00) + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(0x00), }; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[AUDIO_IN_PACKET]; @@ -323,13 +250,12 @@ struct audio_entity_info audio_entity_table[] = { .ep = AUDIO_IN_EP }, }; +// In windows, audio driver cannot remove auto, so when you modify any descriptor information, please modify string descriptors too. + void audio_v2_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &audio_v2_descriptor); -#else - usbd_desc_register(busid, audio_v2_descriptor); -#endif + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0200, audio_entity_table, 2)); usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0200, audio_entity_table, 2)); usbd_add_endpoint(busid, &audio_in_ep); diff --git a/components/drivers/usb/cherryusb/demo/audio_v2_mic_speaker_multichan_template.c b/components/drivers/usb/cherryusb/demo/audio_v2_mic_speaker_multichan_template.c index ce77c30268..38c1dbbe01 100644 --- a/components/drivers/usb/cherryusb/demo/audio_v2_mic_speaker_multichan_template.c +++ b/components/drivers/usb/cherryusb/demo/audio_v2_mic_speaker_multichan_template.c @@ -30,19 +30,21 @@ #define AUDIO_IN_CLOCK_ID 0x05 #define AUDIO_IN_FU_ID 0x07 -#define AUDIO_OUT_MAX_FREQ 96000 -#define AUDIO_IN_MAX_FREQ 16000 +#define AUDIO_OUT_MAX_FREQ 96000 +#define AUDIO_SPEAKER_FRAME_SIZE_BYTE 2u +#define AUDIO_SPEAKER_RESOLUTION_BIT 16u -#define HALF_WORD_BYTES 2 //2 half word (one channel) -#define SAMPLE_BITS 16 //16 bit per channel +#define AUDIO_IN_MAX_FREQ 96000 +#define AUDIO_MIC_FRAME_SIZE_BYTE 2u +#define AUDIO_MIC_RESOLUTION_BIT 16u -#define BMCONTROL (AUDIO_V2_FU_CONTROL_MUTE | AUDIO_V2_FU_CONTROL_VOLUME) +#define BMCONTROL (AUDIO_V2_CONTROL_MUTE | AUDIO_V2_CONTROL_VOLUME) #define IN_CHANNEL_NUM 2 #if IN_CHANNEL_NUM == 1 #define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) -#define INPUT_CH_ENABLE 0x00000000 +#define INPUT_CH_ENABLE 0x00000001 #elif IN_CHANNEL_NUM == 2 #define INPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define INPUT_CH_ENABLE 0x00000003 @@ -70,7 +72,7 @@ #if OUT_CHANNEL_NUM == 1 #define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) -#define OUTPUT_CH_ENABLE 0x00000000 +#define OUTPUT_CH_ENABLE 0x00000001 #elif OUT_CHANNEL_NUM == 2 #define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x00000003 @@ -95,35 +97,35 @@ #endif /* AudioFreq * DataSize (2 bytes) * NumChannels */ -#define AUDIO_OUT_PACKET ((uint32_t)((AUDIO_OUT_MAX_FREQ * HALF_WORD_BYTES * OUT_CHANNEL_NUM) / 1000)) -#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_IN_MAX_FREQ * HALF_WORD_BYTES * IN_CHANNEL_NUM) / 1000)) +#define AUDIO_OUT_PACKET ((uint32_t)((AUDIO_OUT_MAX_FREQ * AUDIO_SPEAKER_FRAME_SIZE_BYTE * OUT_CHANNEL_NUM) / 1000)) +#define AUDIO_IN_PACKET ((uint32_t)((AUDIO_IN_MAX_FREQ * AUDIO_MIC_FRAME_SIZE_BYTE * IN_CHANNEL_NUM) / 1000)) #if USING_FEEDBACK == 0 -#define USB_AUDIO_CONFIG_DESC_SIZ (9 + \ - AUDIO_V2_AC_DESCRIPTOR_INIT_LEN + \ - AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ - AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ - AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ - AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ - AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_V2_AS_DESCRIPTOR_INIT_LEN + \ - AUDIO_V2_AS_DESCRIPTOR_INIT_LEN) +#define USB_CONFIG_SIZE (9 + \ + AUDIO_V2_AC_DESCRIPTOR_LEN + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_AS_DESCRIPTOR_LEN + \ + AUDIO_V2_AS_DESCRIPTOR_LEN) #else -#define USB_AUDIO_CONFIG_DESC_SIZ (9 + \ - AUDIO_V2_AC_DESCRIPTOR_INIT_LEN + \ - AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ - AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ - AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ - AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ - AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT_LEN + \ - AUDIO_V2_AS_DESCRIPTOR_INIT_LEN) +#define USB_CONFIG_SIZE (9 + \ + AUDIO_V2_AC_DESCRIPTOR_LEN + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_LEN + \ + AUDIO_V2_AS_DESCRIPTOR_LEN) #endif #define AUDIO_AC_SIZ (AUDIO_V2_SIZEOF_AC_HEADER_DESC + \ @@ -136,28 +138,27 @@ AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(IN_CHANNEL_NUM) + \ AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC) -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01) }; static const uint8_t config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x03, AUDIO_AC_SIZ, AUDIO_CATEGORY_UNDEF, 0x00, 0x00), - AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(0x01, 0x03, 0x03), - AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_TERMINAL_STREAMING, 0x01, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, 0x0000), - AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x03, 0x02, OUTPUT_CTRL), - AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_OUTTERM_SPEAKER, 0x03, 0x01, 0x0000), - AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(0x05, 0x03, 0x03), - AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_INTERM_MIC, 0x05, IN_CHANNEL_NUM, INPUT_CH_ENABLE, 0x0000), - AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x07, 0x06, INPUT_CTRL), - AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x08, AUDIO_TERMINAL_STREAMING, 0x07, 0x05, 0x0000), + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_OUT_CLOCK_ID, 0x03, 0x03), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_TERMINAL_STREAMING, AUDIO_OUT_CLOCK_ID, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_OUT_FU_ID, 0x02, OUTPUT_CTRL), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_OUTTERM_SPEAKER, AUDIO_OUT_FU_ID, AUDIO_OUT_CLOCK_ID, 0x0000), + AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_IN_CLOCK_ID, 0x03, 0x03), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_INTERM_MIC, AUDIO_IN_CLOCK_ID, IN_CHANNEL_NUM, INPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_IN_FU_ID, 0x06, INPUT_CTRL), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x08, AUDIO_TERMINAL_STREAMING, AUDIO_IN_FU_ID, AUDIO_IN_CLOCK_ID, 0x0000), #if USING_FEEDBACK == 0 - AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL), + AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL), #else - AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP), + AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP), #endif - AUDIO_V2_AS_DESCRIPTOR_INIT(0x02, 0x08, IN_CHANNEL_NUM, INPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_IN_EP, 0x05, (AUDIO_IN_PACKET + 4), EP_INTERVAL) + AUDIO_V2_AS_DESCRIPTOR_INIT(0x02, 0x08, IN_CHANNEL_NUM, INPUT_CH_ENABLE, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, (AUDIO_IN_PACKET + 4), EP_INTERVAL) }; static const uint8_t device_quality_descriptor[] = { @@ -212,103 +213,6 @@ const struct usb_descriptor audio_v2_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -uint8_t audio_v2_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x03, AUDIO_AC_SIZ, AUDIO_CATEGORY_UNDEF, 0x00, 0x00), - AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(0x01, 0x03, 0x03), - AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_TERMINAL_STREAMING, 0x01, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, 0x0000), - AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x03, 0x02, OUTPUT_CTRL), - AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_OUTTERM_SPEAKER, 0x03, 0x01, 0x0000), - AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(0x05, 0x03, 0x03), - AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_INTERM_MIC, 0x05, IN_CHANNEL_NUM, INPUT_CH_ENABLE, 0x0000), - AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x07, 0x06, INPUT_CTRL), - AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x08, AUDIO_TERMINAL_STREAMING, 0x07, 0x05, 0x0000), -#if USING_FEEDBACK == 0 - AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL), -#else - AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP), -#endif - AUDIO_V2_AS_DESCRIPTOR_INIT(0x02, 0x08, IN_CHANNEL_NUM, INPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_IN_EP, 0x05, (AUDIO_IN_PACKET + 4), EP_INTERVAL), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'U', 0x00, /* wcChar10 */ - 'A', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '1', 0x00, /* wcChar3 */ - '0', 0x00, /* wcChar4 */ - '3', 0x00, /* wcChar5 */ - '1', 0x00, /* wcChar6 */ - '0', 0x00, /* wcChar7 */ - '0', 0x00, /* wcChar8 */ -#if USING_FEEDBACK == 0 - '3', 0x00, /* wcChar9 */ -#else - '4', 0x00, /* wcChar9 */ -#endif -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif static const uint8_t speaker_default_sampling_freq_table[] = { AUDIO_SAMPLE_FREQ_NUM(5), @@ -330,9 +234,21 @@ static const uint8_t speaker_default_sampling_freq_table[] = { }; static const uint8_t mic_default_sampling_freq_table[] = { - AUDIO_SAMPLE_FREQ_NUM(1), + AUDIO_SAMPLE_FREQ_NUM(5), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(8000), + AUDIO_SAMPLE_FREQ_4B(0x00), AUDIO_SAMPLE_FREQ_4B(16000), AUDIO_SAMPLE_FREQ_4B(16000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(32000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(48000), + AUDIO_SAMPLE_FREQ_4B(0x00), + AUDIO_SAMPLE_FREQ_4B(96000), + AUDIO_SAMPLE_FREQ_4B(96000), AUDIO_SAMPLE_FREQ_4B(0x00) }; @@ -501,13 +417,12 @@ struct audio_entity_info audio_entity_table[] = { .ep = AUDIO_IN_EP }, }; +// In windows, audio driver cannot remove auto, so when you modify any descriptor information, please modify string descriptors too. + void audio_v2_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &audio_v2_descriptor); -#else - usbd_desc_register(busid, audio_v2_descriptor); -#endif + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0200, audio_entity_table, 4)); usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0200, audio_entity_table, 4)); usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf2, 0x0200, audio_entity_table, 4)); diff --git a/components/drivers/usb/cherryusb/demo/audio_v2_speaker_multichan_template.c b/components/drivers/usb/cherryusb/demo/audio_v2_speaker_multichan_template.c index e89c880810..5420619275 100644 --- a/components/drivers/usb/cherryusb/demo/audio_v2_speaker_multichan_template.c +++ b/components/drivers/usb/cherryusb/demo/audio_v2_speaker_multichan_template.c @@ -31,13 +31,13 @@ #define HALF_WORD_BYTES 2 //2 half word (one channel) #define SAMPLE_BITS 16 //16 bit per channel -#define BMCONTROL (AUDIO_V2_FU_CONTROL_MUTE | AUDIO_V2_FU_CONTROL_VOLUME) +#define BMCONTROL (AUDIO_V2_CONTROL_MUTE | AUDIO_V2_CONTROL_VOLUME) #define OUT_CHANNEL_NUM 2 #if OUT_CHANNEL_NUM == 1 #define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL) -#define OUTPUT_CH_ENABLE 0x00000000 +#define OUTPUT_CH_ENABLE 0x00000001 #elif OUT_CHANNEL_NUM == 2 #define OUTPUT_CTRL DBVAL(BMCONTROL), DBVAL(BMCONTROL), DBVAL(BMCONTROL) #define OUTPUT_CH_ENABLE 0x00000003 @@ -64,21 +64,21 @@ #define AUDIO_OUT_PACKET ((uint32_t)((AUDIO_OUT_MAX_FREQ * HALF_WORD_BYTES * OUT_CHANNEL_NUM) / 1000)) #if USING_FEEDBACK == 0 -#define USB_AUDIO_CONFIG_DESC_SIZ (9 + \ - AUDIO_V2_AC_DESCRIPTOR_INIT_LEN + \ - AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ - AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ - AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_V2_AS_DESCRIPTOR_INIT_LEN) +#define USB_CONFIG_SIZE (9 + \ + AUDIO_V2_AC_DESCRIPTOR_LEN + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_AS_DESCRIPTOR_LEN) #else -#define USB_AUDIO_CONFIG_DESC_SIZ (9 + \ - AUDIO_V2_AC_DESCRIPTOR_INIT_LEN + \ - AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ - AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ - AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ - AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT_LEN) +#define USB_CONFIG_SIZE (9 + \ + AUDIO_V2_AC_DESCRIPTOR_LEN + \ + AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC + \ + AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC + \ + AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ + AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ + AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_LEN) #endif #define AUDIO_AC_SIZ (AUDIO_V2_SIZEOF_AC_HEADER_DESC + \ @@ -87,18 +87,17 @@ AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(OUT_CHANNEL_NUM) + \ AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC) -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01) }; static const uint8_t config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, AUDIO_CATEGORY_SPEAKER, 0x00, 0x00), AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_OUT_CLOCK_ID, 0x03, 0x03), - AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_TERMINAL_STREAMING, 0x01, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, 0x0000), + AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_TERMINAL_STREAMING, AUDIO_OUT_CLOCK_ID, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, 0x0000), AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_OUT_FU_ID, 0x02, OUTPUT_CTRL), - AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_OUTTERM_SPEAKER, 0x03, 0x01, 0x0000), + AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_OUTTERM_SPEAKER, AUDIO_OUT_FU_ID, AUDIO_OUT_CLOCK_ID, 0x0000), #if USING_FEEDBACK == 0 AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL), #else @@ -158,98 +157,6 @@ const struct usb_descriptor audio_v2_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t audio_v2_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_AUDIO_CONFIG_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - AUDIO_V2_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, AUDIO_CATEGORY_SPEAKER, 0x00, 0x00), - AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(AUDIO_OUT_CLOCK_ID, 0x03, 0x03), - AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x02, AUDIO_TERMINAL_STREAMING, 0x01, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, 0x0000), - AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(AUDIO_OUT_FU_ID, 0x02, OUTPUT_CTRL), - AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_OUTTERM_SPEAKER, 0x03, 0x01, 0x0000), -#if USING_FEEDBACK == 0 - AUDIO_V2_AS_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, EP_INTERVAL), -#else - AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(0x01, 0x02, OUT_CHANNEL_NUM, OUTPUT_CH_ENABLE, HALF_WORD_BYTES, SAMPLE_BITS, AUDIO_OUT_EP, AUDIO_OUT_PACKET, EP_INTERVAL, AUDIO_OUT_FEEDBACK_EP), -#endif - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'U', 0x00, /* wcChar10 */ - 'A', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '1', 0x00, /* wcChar3 */ - '0', 0x00, /* wcChar4 */ - '3', 0x00, /* wcChar5 */ - '1', 0x00, /* wcChar6 */ - '0', 0x00, /* wcChar7 */ - '0', 0x00, /* wcChar8 */ -#if USING_FEEDBACK == 0 - '3', 0x00, /* wcChar9 */ -#else - '4', 0x00, /* wcChar9 */ -#endif -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif static const uint8_t default_sampling_freq_table[] = { AUDIO_SAMPLE_FREQ_NUM(5), @@ -397,13 +304,12 @@ struct audio_entity_info audio_entity_table[] = { .ep = AUDIO_OUT_EP }, }; +// In windows, audio driver cannot remove auto, so when you modify any descriptor information, please modify string descriptors too. + void audio_v2_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &audio_v2_descriptor); -#else - usbd_desc_register(busid, audio_v2_descriptor); -#endif + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0200, audio_entity_table, 2)); usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0200, audio_entity_table, 2)); usbd_add_endpoint(busid, &audio_out_ep); diff --git a/components/drivers/usb/cherryusb/demo/bootuf2/msc_bootuf2_template.c b/components/drivers/usb/cherryusb/demo/bootuf2/msc_bootuf2_template.c index 158866057e..2584d3ae76 100644 --- a/components/drivers/usb/cherryusb/demo/bootuf2/msc_bootuf2_template.c +++ b/components/drivers/usb/cherryusb/demo/bootuf2/msc_bootuf2_template.c @@ -23,7 +23,6 @@ #define MSC_MAX_MPS 64 #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01) }; @@ -85,85 +84,6 @@ const struct usb_descriptor msc_bootuf2_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t msc_bootuf2_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - MSC_DESCRIPTOR_INIT(0x00, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x02), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'U', 0x00, /* wcChar10 */ - 'F', 0x00, /* wcChar11 */ - '2', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif static void usbd_event_handler(uint8_t busid, uint8_t event) { @@ -215,11 +135,9 @@ static struct usbd_interface intf0; void msc_bootuf2_init(uint8_t busid, uintptr_t reg_base) { boot2uf2_flash_init(); -#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &msc_bootuf2_descriptor); -#else - usbd_desc_register(busid, msc_bootuf2_descriptor); -#endif + usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf0, MSC_OUT_EP, MSC_IN_EP)); usbd_initialize(busid, reg_base, usbd_event_handler); diff --git a/components/drivers/usb/cherryusb/demo/cdc_acm_hid_msc_template.c b/components/drivers/usb/cherryusb/demo/cdc_acm_hid_msc_template.c index 0851cf89d2..016e9808e3 100644 --- a/components/drivers/usb/cherryusb/demo/cdc_acm_hid_msc_template.c +++ b/components/drivers/usb/cherryusb/demo/cdc_acm_hid_msc_template.c @@ -43,7 +43,6 @@ #define MSC_MAX_MPS 64 #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01) }; @@ -52,37 +51,7 @@ static const uint8_t config_descriptor[] = { USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x04, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), MSC_DESCRIPTOR_INIT(0x02, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x02), - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x03, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ + HID_MOUSE_DESCRIPTOR_INIT(0x03, 0x01, HID_MOUSE_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), }; static const uint8_t device_quality_descriptor[] = { @@ -137,117 +106,6 @@ const struct usb_descriptor cdc_acm_hid_msc_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t cdc_acm_hid_msc_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x04, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), - MSC_DESCRIPTOR_INIT(0x02, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x02), - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x03, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'C', 0x00, /* wcChar10 */ - 'M', 0x00, /* wcChar11 */ - 'H', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif /*!< hid mouse report descriptor */ static const uint8_t hid_mouse_report_desc[HID_MOUSE_REPORT_DESC_SIZE] = { @@ -399,11 +257,8 @@ struct usbd_interface intf3; void cdc_acm_hid_msc_descriptor_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &cdc_acm_hid_msc_descriptor); -#else - usbd_desc_register(busid, cdc_acm_hid_msc_descriptor); -#endif + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); usbd_add_endpoint(busid, &cdc_out_ep); diff --git a/components/drivers/usb/cherryusb/demo/cdc_acm_mavlink_template.c b/components/drivers/usb/cherryusb/demo/cdc_acm_mavlink_template.c index 0a8bc3b66c..c941b35074 100644 --- a/components/drivers/usb/cherryusb/demo/cdc_acm_mavlink_template.c +++ b/components/drivers/usb/cherryusb/demo/cdc_acm_mavlink_template.c @@ -27,7 +27,6 @@ #define CDC_MAX_MPS 64 #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) }; @@ -89,86 +88,6 @@ const struct usb_descriptor cdc_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -/*!< global descriptor */ -static const uint8_t cdc_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'C', 0x00, /* wcChar10 */ - 'D', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif chry_ringbuffer_t usb_rx_rb; uint8_t usb_rx_buffer[2048]; @@ -243,11 +162,9 @@ static struct usbd_interface intf1; void cdc_acm_mavlink_init(uint8_t busid, uintptr_t reg_base) { chry_ringbuffer_init(&usb_rx_rb, usb_rx_buffer, sizeof(usb_rx_buffer)); -#ifdef CONFIG_USBDEV_ADVANCE_DESC + usbd_desc_register(busid, &cdc_descriptor); -#else - usbd_desc_register(busid, cdc_descriptor); -#endif + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); usbd_add_endpoint(busid, &cdc_out_ep); diff --git a/components/drivers/usb/cherryusb/demo/cdc_acm_msc_template.c b/components/drivers/usb/cherryusb/demo/cdc_acm_msc_template.c index e889cbc8c8..4c805835ee 100644 --- a/components/drivers/usb/cherryusb/demo/cdc_acm_msc_template.c +++ b/components/drivers/usb/cherryusb/demo/cdc_acm_msc_template.c @@ -35,7 +35,6 @@ #define MSC_MAX_MPS 64 #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) }; @@ -98,87 +97,6 @@ const struct usb_descriptor cdc_msc_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -/*!< global descriptor */ -static const uint8_t cdc_msc_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), - MSC_DESCRIPTOR_INIT(0x02, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x00), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'C', 0x00, /* wcChar10 */ - '-', 0x00, /* wcChar11 */ - 'M', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; /* 2048 is only for test speed , please use CDC_MAX_MPS for common*/ USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; @@ -249,11 +167,8 @@ struct usbd_interface intf2; void cdc_acm_msc_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &cdc_msc_descriptor); -#else - usbd_desc_register(busid, cdc_msc_descriptor); -#endif + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); usbd_add_endpoint(busid, &cdc_out_ep); diff --git a/components/drivers/usb/cherryusb/demo/cdc_acm_multi_template.c b/components/drivers/usb/cherryusb/demo/cdc_acm_multi_template.c index 80b40b0206..753e81729b 100644 --- a/components/drivers/usb/cherryusb/demo/cdc_acm_multi_template.c +++ b/components/drivers/usb/cherryusb/demo/cdc_acm_multi_template.c @@ -37,7 +37,6 @@ #define CDC_MAX_MPS 64 #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) }; @@ -102,89 +101,6 @@ const struct usb_descriptor cdc_multi_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -/*!< global descriptor */ -static const uint8_t cdc_multi_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x08, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), - CDC_ACM_DESCRIPTOR_INIT(0x02, CDC_INT_EP2, CDC_OUT_EP2, CDC_IN_EP2, CDC_MAX_MPS, 0x02), - CDC_ACM_DESCRIPTOR_INIT(0x04, CDC_INT_EP3, CDC_OUT_EP3, CDC_IN_EP3, CDC_MAX_MPS, 0x02), - CDC_ACM_DESCRIPTOR_INIT(0x06, CDC_INT_EP4, CDC_OUT_EP4, CDC_IN_EP4, CDC_MAX_MPS, 0x02), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'C', 0x00, /* wcChar10 */ - 'D', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[4][2048]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[4][2048]; @@ -292,11 +208,8 @@ struct usbd_interface intf7; void cdc_acm_multi_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &cdc_multi_descriptor); -#else - usbd_desc_register(busid, cdc_multi_descriptor); -#endif + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); usbd_add_endpoint(busid, &cdc_out_ep1); diff --git a/components/drivers/usb/cherryusb/demo/cdc_acm_rttchardev_template.c b/components/drivers/usb/cherryusb/demo/cdc_acm_rttchardev_template.c index f5fec3f0ea..2fed1cfc50 100644 --- a/components/drivers/usb/cherryusb/demo/cdc_acm_rttchardev_template.c +++ b/components/drivers/usb/cherryusb/demo/cdc_acm_rttchardev_template.c @@ -25,7 +25,6 @@ #define CDC_MAX_MPS 64 #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) }; @@ -87,86 +86,6 @@ const struct usb_descriptor cdc_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -/*!< global descriptor */ -static const uint8_t cdc_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'C', 0x00, /* wcChar10 */ - 'D', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif static void usbd_event_handler(uint8_t busid, uint8_t event) { @@ -198,11 +117,32 @@ extern void usbd_cdc_acm_serial_init(uint8_t busid, uint8_t in_ep, uint8_t out_e void cdc_acm_chardev_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &cdc_descriptor); -#else - usbd_desc_register(busid, cdc_descriptor); -#endif + usbd_cdc_acm_serial_init(busid, CDC_IN_EP, CDC_OUT_EP); usbd_initialize(busid, reg_base, usbd_event_handler); -} \ No newline at end of file +} + +static int cdc_acm_enter(int argc, char **argv) +{ + (void)argc; + (void)argv; + + finsh_set_device("usb-acm0"); + rt_console_set_device("usb-acm0"); + + return 0; +} +MSH_CMD_EXPORT(cdc_acm_enter, cdc_acm_enter); + +static int cdc_acm_exit(int argc, char **argv) +{ + (void)argc; + (void)argv; + + finsh_set_device(RT_CONSOLE_DEVICE_NAME); + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); + + return 0; +} +MSH_CMD_EXPORT(cdc_acm_exit, cdc_acm_exit); \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/demo/cdc_acm_template.c b/components/drivers/usb/cherryusb/demo/cdc_acm_template.c index 3ff8ae2ab6..e98287c94c 100644 --- a/components/drivers/usb/cherryusb/demo/cdc_acm_template.c +++ b/components/drivers/usb/cherryusb/demo/cdc_acm_template.c @@ -25,7 +25,6 @@ #define CDC_MAX_MPS 64 #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) }; @@ -87,86 +86,6 @@ const struct usb_descriptor cdc_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -/*!< global descriptor */ -static const uint8_t cdc_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'C', 0x00, /* wcChar10 */ - 'D', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; /* 2048 is only for test speed , please use CDC_MAX_MPS for common*/ USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; @@ -245,11 +164,8 @@ void cdc_acm_init(uint8_t busid, uintptr_t reg_base) memcpy(&write_buffer[0], data, 10); memset(&write_buffer[10], 'a', 2038); -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &cdc_descriptor); -#else - usbd_desc_register(busid, cdc_descriptor); -#endif + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); usbd_add_endpoint(busid, &cdc_out_ep); diff --git a/components/drivers/usb/cherryusb/demo/cdc_ecm_template.c b/components/drivers/usb/cherryusb/demo/cdc_ecm_template.c index b259e75319..528ed9f63e 100644 --- a/components/drivers/usb/cherryusb/demo/cdc_ecm_template.c +++ b/components/drivers/usb/cherryusb/demo/cdc_ecm_template.c @@ -29,22 +29,16 @@ #define CDC_MAX_MPS 64 #endif -#define CDC_ECM_ETH_STATISTICS_BITMAP 0x00000000 - /* str idx = 4 is for mac address: aa:bb:cc:dd:ee:ff*/ #define CDC_ECM_MAC_STRING_INDEX 4 -/* Ethernet Maximum Segment size, typically 1514 bytes */ -#define CONFIG_CDC_ECM_ETH_MAX_SEGSZE 1514U - -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) }; static const uint8_t config_descriptor[] = { USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - CDC_ECM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, CDC_ECM_ETH_STATISTICS_BITMAP, CONFIG_CDC_ECM_ETH_MAX_SEGSZE, 0, 0, CDC_ECM_MAC_STRING_INDEX) + CDC_ECM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, CDC_ECM_MAC_STRING_INDEX) }; static const uint8_t device_quality_descriptor[] = { @@ -68,6 +62,7 @@ static const char *string_descriptors[] = { "CherryUSB", /* Manufacturer */ "CherryUSB CDC ECM DEMO", /* Product */ "2022123456", /* Serial Number */ + "aabbccddeeff", /* ecm mac address */ }; static const uint8_t *device_descriptor_callback(uint8_t speed) @@ -87,7 +82,7 @@ static const uint8_t *device_quality_descriptor_callback(uint8_t speed) static const char *string_descriptor_callback(uint8_t speed, uint8_t index) { - if (index > 3) { + if (index > 4) { return NULL; } return string_descriptors[index]; @@ -99,107 +94,6 @@ const struct usb_descriptor cdc_ecm_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -/*!< global descriptor */ -static const uint8_t cdc_ecm_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - CDC_ECM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, CDC_ECM_ETH_STATISTICS_BITMAP, CONFIG_CDC_ECM_ETH_MAX_SEGSZE, 0, 0, CDC_ECM_MAC_STRING_INDEX), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x2E, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'C', 0x00, /* wcChar10 */ - 'D', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'E', 0x00, /* wcChar14 */ - 'C', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - ' ', 0x00, /* wcChar17 */ - 'D', 0x00, /* wcChar18 */ - 'E', 0x00, /* wcChar19 */ - 'M', 0x00, /* wcChar20 */ - 'O', 0x00, /* wcChar21 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ - /////////////////////////////////////// - /// string4 descriptor - /////////////////////////////////////// - 0x1A, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'a', 0x00, /* wcChar0 */ - 'a', 0x00, /* wcChar1 */ - 'b', 0x00, /* wcChar2 */ - 'b', 0x00, /* wcChar3 */ - 'c', 0x00, /* wcChar4 */ - 'c', 0x00, /* wcChar5 */ - 'd', 0x00, /* wcChar6 */ - 'd', 0x00, /* wcChar7 */ - 'e', 0x00, /* wcChar8 */ - 'e', 0x00, /* wcChar9 */ - 'f', 0x00, /* wcChar10 */ - 'f', 0x00, /* wcChar11 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif const uint8_t mac[6] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; @@ -463,12 +357,9 @@ void cdc_ecm_init(uint8_t busid, uintptr_t reg_base) { cdc_ecm_lwip_init(); -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &cdc_ecm_descriptor); -#else - usbd_desc_register(busid, cdc_ecm_descriptor); -#endif + usbd_add_interface(busid, usbd_cdc_ecm_init_intf(&intf0, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP)); usbd_add_interface(busid, usbd_cdc_ecm_init_intf(&intf1, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP)); usbd_initialize(busid, reg_base, usbd_event_handler); -} +} \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/demo/cdc_rndis_template.c b/components/drivers/usb/cherryusb/demo/cdc_rndis_template.c index c7bda9316b..1b5874934d 100644 --- a/components/drivers/usb/cherryusb/demo/cdc_rndis_template.c +++ b/components/drivers/usb/cherryusb/demo/cdc_rndis_template.c @@ -29,7 +29,6 @@ #define CDC_MAX_MPS 64 #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) }; @@ -91,88 +90,6 @@ const struct usb_descriptor cdc_rndis_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -/*!< global descriptor */ -static const uint8_t cdc_rndis_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - CDC_RNDIS_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, CDC_MAX_MPS, 0x02), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x2A, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'R', 0x00, /* wcChar10 */ - 'N', 0x00, /* wcChar11 */ - 'D', 0x00, /* wcChar12 */ - 'I', 0x00, /* wcChar13 */ - 'S', 0x00, /* wcChar14 */ - ' ', 0x00, /* wcChar15 */ - 'D', 0x00, /* wcChar16 */ - 'E', 0x00, /* wcChar17 */ - 'M', 0x00, /* wcChar18 */ - 'O', 0x00, /* wcChar19 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif const uint8_t mac[6] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; @@ -438,11 +355,8 @@ void cdc_rndis_init(uint8_t busid, uintptr_t reg_base) { rndis_lwip_init(); -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &cdc_rndis_descriptor); -#else - usbd_desc_register(busid, cdc_rndis_descriptor); -#endif + usbd_add_interface(busid, usbd_rndis_init_intf(&intf0, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, (uint8_t *)mac)); usbd_add_interface(busid, usbd_rndis_init_intf(&intf1, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, (uint8_t *)mac)); usbd_initialize(busid, reg_base, usbd_event_handler); diff --git a/components/drivers/usb/cherryusb/demo/dfu_with_st_tool_template.c b/components/drivers/usb/cherryusb/demo/dfu_with_st_tool_template.c index 9c36433a08..0127c58ae8 100644 --- a/components/drivers/usb/cherryusb/demo/dfu_with_st_tool_template.c +++ b/components/drivers/usb/cherryusb/demo/dfu_with_st_tool_template.c @@ -15,7 +15,6 @@ #define USB_CONFIG_SIZE (9 + 9 + 9) -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01) }; @@ -77,134 +76,6 @@ const struct usb_descriptor dfu_flash_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t dfu_flash_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - DFU_DESCRIPTOR_INIT(), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x1e, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'D', 0x00, /* wcChar0 */ - 'F', 0x00, /* wcChar1 */ - 'U', 0x00, /* wcChar2 */ - 'W', 0x00, /* wcChar3 */ - 'i', 0x00, /* wcChar4 */ - 't', 0x00, /* wcChar5 */ - 'h', 0x00, /* wcChar6 */ - 's', 0x00, /* wcChar7 */ - 't', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 't', 0x00, /* wcChar10 */ - 'o', 0x00, /* wcChar11 */ - 'o', 0x00, /* wcChar12 */ - 'l', 0x00, /* wcChar13 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ - /////////////////////////////////////// - /// string4 descriptor - /////////////////////////////////////// - 0x60, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '@', 0x00, /* wcChar0 */ - 'I', 0x00, /* wcChar1 */ - 'n', 0x00, /* wcChar2 */ - 't', 0x00, /* wcChar3 */ - 'e', 0x00, /* wcChar4 */ - 'r', 0x00, /* wcChar5 */ - 'n', 0x00, /* wcChar6 */ - 'a', 0x00, /* wcChar7 */ - 'l', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'F', 0x00, /* wcChar10 */ - 'l', 0x00, /* wcChar11*/ - 'a', 0x00, /* wcChar12 */ - 's', 0x00, /* wcChar13 */ - 'h', 0x00, /* wcChar14 */ - ' ', 0x00, /* wcChar15 */ - ' ', 0x00, /* wcChar16 */ - ' ', 0x00, /* wcChar17 */ - '/', 0x00, /* wcChar18 */ - '0', 0x00, /* wcChar19 */ - 'x', 0x00, /* wcChar20 */ - '0', 0x00, /* wcChar21*/ - '8', 0x00, /* wcChar22 */ - '0', 0x00, /* wcChar23 */ - '0', 0x00, /* wcChar24 */ - '0', 0x00, /* wcChar25 */ - '0', 0x00, /* wcChar26 */ - '0', 0x00, /* wcChar27 */ - '0', 0x00, /* wcChar28 */ - '/', 0x00, /* wcChar29 */ - '1', 0x00, /* wcChar30 */ - '6', 0x00, /* wcChar31*/ - '*', 0x00, /* wcChar32 */ - '0', 0x00, /* wcChar33 */ - '0', 0x00, /* wcChar34 */ - '1', 0x00, /* wcChar35 */ - 'K', 0x00, /* wcChar36 */ - 'a', 0x00, /* wcChar37 */ - ',', 0x00, /* wcChar38 */ - '1', 0x00, /* wcChar39 */ - '1', 0x00, /* wcChar40 */ - '2', 0x00, /* wcChar41*/ - '*', 0x00, /* wcChar42 */ - '0', 0x00, /* wcChar43 */ - '1', 0x00, /* wcChar44 */ - 'K', 0x00, /* wcChar45 */ - 'g', 0x00, /* wcChar46 */ - -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif static void usbd_event_handler(uint8_t busid, uint8_t event) { @@ -235,11 +106,8 @@ struct usbd_interface intf0; void dfu_flash_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &dfu_flash_descriptor); -#else - usbd_desc_register(busid, dfu_flash_descriptor); -#endif + usbd_add_interface(busid, usbd_dfu_init_intf(&intf0)); usbd_initialize(busid, reg_base, usbd_event_handler); } diff --git a/components/drivers/usb/cherryusb/demo/gamepad_template.c b/components/drivers/usb/cherryusb/demo/gamepad_template.c new file mode 100644 index 0000000000..2decbc7c08 --- /dev/null +++ b/components/drivers/usb/cherryusb/demo/gamepad_template.c @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2026, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbd_gamepad.h" + +#define GAMEPAD_IN_EP 0x81 +#define GAMEPAD_OUT_EP 0x02 + +#define USBD_MAX_POWER 500 + +static const uint8_t xinput_device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, XINPUT_VID, XINPUT_PID, XINPUT_BCD_DEVICE, 0x01) +}; + +static const uint8_t switch_device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, SWITCH_VID, SWITCH_PID, SWITCH_BCD_DEVICE, 0x01) +}; + +static const uint8_t xinput_config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT((9 + XINPUT_DESCRIPTOR_LEN), 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + XINPUT_DESCRIPTOR_INIT(0x00, GAMEPAD_OUT_EP, GAMEPAD_IN_EP) +}; + +static const uint8_t switch_config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT((9 + SWITCH_DESCRIPTOR_LEN), 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + SWITCH_DESCRIPTOR_INIT(0x00, GAMEPAD_OUT_EP, GAMEPAD_IN_EP) +}; + +static const char *xinput_string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "Microsoft", /* Manufacturer */ + "XInput STANDARD GAMEPAD", /* Product */ + "1.0", /* Serial Number */ +}; + +static const char *switch_string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "HORI", /* Manufacturer */ + "Switch Pro Controller", /* Product */ + "1.0", /* Serial Number */ +}; + +uint8_t gamepad_mode = USBD_GAMEPAD_MODE_XINPUT; +bool gamepad_init_flag = false; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + switch (gamepad_mode) { + case USBD_GAMEPAD_MODE_XINPUT: + return xinput_device_descriptor; + case USBD_GAMEPAD_MODE_SWITCH: + return switch_device_descriptor; + case USBD_GAMEPAD_MODE_XBOXONE: + break; + case USBD_GAMEPAD_MODE_PS4: + break; + + default: + break; + } + return NULL; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + switch (gamepad_mode) { + case USBD_GAMEPAD_MODE_XINPUT: + return xinput_config_descriptor; + case USBD_GAMEPAD_MODE_SWITCH: + return switch_config_descriptor; + case USBD_GAMEPAD_MODE_XBOXONE: + break; + case USBD_GAMEPAD_MODE_PS4: + break; + + default: + break; + } + return NULL; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return NULL; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 3) { + return NULL; + } + + switch (gamepad_mode) { + case USBD_GAMEPAD_MODE_XINPUT: + return xinput_string_descriptors[index]; + case USBD_GAMEPAD_MODE_SWITCH: + return switch_string_descriptors[index]; + case USBD_GAMEPAD_MODE_XBOXONE: + break; + case USBD_GAMEPAD_MODE_PS4: + break; + + default: + break; + } + return NULL; +} + +const struct usb_descriptor gamepad_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t gamepad_read_buffer[64]; +struct usb_gamepad_report gamepad_report; + +#define GAMEPAD_STATE_IDLE 0 +#define GAMEPAD_STATE_BUSY 1 + +volatile uint8_t gamepad_state = GAMEPAD_STATE_IDLE; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + usbd_ep_start_read(busid, GAMEPAD_OUT_EP, gamepad_read_buffer, usbd_get_ep_mps(busid, GAMEPAD_OUT_EP)); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +static void usbd_gamepad_int_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + gamepad_state = GAMEPAD_STATE_IDLE; +} + +void usbd_gamepad_int_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + usbd_ep_start_read(busid, GAMEPAD_OUT_EP, gamepad_read_buffer, usbd_get_ep_mps(busid, GAMEPAD_OUT_EP)); +} + +/*!< endpoint call back */ +static struct usbd_endpoint gamepad_in_ep = { + .ep_cb = usbd_gamepad_int_in_callback, + .ep_addr = GAMEPAD_IN_EP +}; + +static struct usbd_endpoint gamepad_out_ep = { + .ep_cb = usbd_gamepad_int_out_callback, + .ep_addr = GAMEPAD_OUT_EP +}; + +static struct usbd_interface intf0; + +void gamepad_init(uint8_t busid, uintptr_t reg_base) +{ + if (gamepad_init_flag) { + return; + } + + gamepad_init_flag = true; + + usbd_desc_register(busid, &gamepad_descriptor); + + switch (gamepad_mode) { + case USBD_GAMEPAD_MODE_XINPUT: + usbd_add_interface(busid, usbd_gamepad_xinput_init_intf(&intf0)); + break; + case USBD_GAMEPAD_MODE_SWITCH: + usbd_add_interface(busid, usbd_gamepad_switch_init_intf(&intf0)); + break; + case USBD_GAMEPAD_MODE_XBOXONE: + break; + case USBD_GAMEPAD_MODE_PS4: + break; + + default: + break; + } + + usbd_add_endpoint(busid, &gamepad_in_ep); + usbd_add_endpoint(busid, &gamepad_out_ep); + usbd_initialize(busid, reg_base, usbd_event_handler); +} + +void gamepad_change_mode(uint8_t mode, uintptr_t reg_base) +{ + gamepad_mode = mode; + + if (gamepad_init_flag) { + usbd_deinitialize(0); + } + gamepad_init_flag = false; + gamepad_init(0, reg_base); +} + +void gamepad_test(uint8_t busid) +{ + static uint32_t test_counter = 0; + + if (usb_device_is_configured(busid) == false) { + return; + } + + gamepad_state = GAMEPAD_STATE_BUSY; + memset(&gamepad_report, 0, sizeof(gamepad_report)); + + gamepad_report.buttons = (1 << (test_counter % 18)); + + switch (gamepad_mode) { + case USBD_GAMEPAD_MODE_XINPUT: + usbd_gamepad_xinput_send_report(GAMEPAD_IN_EP, &gamepad_report); + break; + case USBD_GAMEPAD_MODE_SWITCH: + usbd_gamepad_switch_send_report(GAMEPAD_IN_EP, &gamepad_report); + break; + case USBD_GAMEPAD_MODE_XBOXONE: + break; + case USBD_GAMEPAD_MODE_PS4: + break; + + default: + break; + } + + test_counter++; + while (gamepad_state == GAMEPAD_STATE_BUSY) { + } +} \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/demo/hid_custom_inout_template.c b/components/drivers/usb/cherryusb/demo/hid_custom_inout_template.c index 419fee2dc8..8a43d0a5fb 100644 --- a/components/drivers/usb/cherryusb/demo/hid_custom_inout_template.c +++ b/components/drivers/usb/cherryusb/demo/hid_custom_inout_template.c @@ -8,25 +8,8 @@ #include "usbd_core.h" #include "usbd_hid.h" - -/*!< hidraw in endpoint */ -#define HIDRAW_IN_EP 0x81 -#ifdef CONFIG_USB_HS -#define HIDRAW_IN_EP_SIZE 1024 -#define HIDRAW_IN_INTERVAL 4 -#else -#define HIDRAW_IN_EP_SIZE 64 -#define HIDRAW_IN_INTERVAL 10 -#endif -/*!< hidraw out endpoint */ -#define HIDRAW_OUT_EP 0x02 -#ifdef CONFIG_USB_HS -#define HIDRAW_OUT_EP_SIZE 1024 -#define HIDRAW_OUT_EP_INTERVAL 4 -#else -#define HIDRAW_OUT_EP_SIZE 64 -#define HIDRAW_OUT_EP_INTERVAL 10 -#endif +#define HIDRAW_IN_EP 0x81 +#define HIDRAW_OUT_EP 0x02 #define USBD_VID 0xffff #define USBD_PID 0xffff @@ -34,53 +17,26 @@ #define USBD_LANGID_STRING 1033 /*!< config descriptor size */ -#define USB_HID_CONFIG_DESC_SIZ (9 + 9 + 9 + 7 + 7) +#define USB_CONFIG_SIZE (9 + 9 + 9 + 7 + 7) /*!< custom hid report descriptor size */ #define HID_CUSTOM_REPORT_DESC_SIZE 38 -#ifdef CONFIG_USBDEV_ADVANCE_DESC +#ifdef CONFIG_USB_HS +#define HID_MAX_MPS 1024 +#define HIDRAW_IN_INTERVAL 1 +#else +#define HID_MAX_MPS 64 +#define HIDRAW_IN_INTERVAL 1 +#endif + static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01) }; static const uint8_t config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - /************** Descriptor of Custom interface *****************/ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Custom HID ********************/ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_CUSTOM_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Custom in endpoint ********************/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HIDRAW_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - WBVAL(HIDRAW_IN_EP_SIZE), /* wMaxPacketSize: 4 Byte max */ - HIDRAW_IN_INTERVAL, /* bInterval: Polling Interval */ - /******************** Descriptor of Custom out endpoint ********************/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HIDRAW_OUT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - WBVAL(HIDRAW_OUT_EP_SIZE), /* wMaxPacketSize: 4 Byte max */ - HIDRAW_OUT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 73 */ + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_CUSTOM_INOUT_DESCRIPTOR_INIT(0x00, 0x01, HID_CUSTOM_REPORT_DESC_SIZE, HIDRAW_OUT_EP, HIDRAW_IN_EP, HID_MAX_MPS, HIDRAW_IN_INTERVAL), }; static const uint8_t device_quality_descriptor[] = { @@ -135,120 +91,6 @@ const struct usb_descriptor hid_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -/*!< global descriptor */ -static const uint8_t hid_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - /************** Descriptor of Custom interface *****************/ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Custom HID ********************/ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_CUSTOM_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Custom in endpoint ********************/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HIDRAW_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - WBVAL(HIDRAW_IN_EP_SIZE), /* wMaxPacketSize: 4 Byte max */ - HIDRAW_IN_INTERVAL, /* bInterval: Polling Interval */ - /******************** Descriptor of Custom out endpoint ********************/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HIDRAW_OUT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - WBVAL(HIDRAW_OUT_EP_SIZE), /* wMaxPacketSize: 4 Byte max */ - HIDRAW_OUT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 73 */ - /* - * string0 descriptor - */ - USB_LANGID_INIT(USBD_LANGID_STRING), - /* - * string1 descriptor - */ - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /* - * string2 descriptor - */ - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'H', 0x00, /* wcChar10 */ - 'I', 0x00, /* wcChar11 */ - 'D', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /* - * string3 descriptor - */ - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /* - * device qualifier descriptor - */ - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif /*!< custom hid report descriptor */ static const uint8_t hid_custom_report_desc[HID_CUSTOM_REPORT_DESC_SIZE] = { @@ -261,16 +103,16 @@ static const uint8_t hid_custom_report_desc[HID_CUSTOM_REPORT_DESC_SIZE] = { 0x09, 0x02, /* USAGE (Vendor Usage 1) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x25, 0xff, /*LOGICAL_MAXIMUM (255) */ - 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ 0x96, 0xff, 0x03, /* REPORT_COUNT (63) */ 0x81, 0x02, /* INPUT (Data,Var,Abs) */ /* <___________________________________________________> */ 0x85, 0x01, /* REPORT ID (0x01) */ 0x09, 0x03, /* USAGE (Vendor Usage 1) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ - 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ + 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ 0x75, 0x08, /* REPORT_SIZE (8) */ - 0x96, 0xff, 0x03, /* REPORT_COUNT (63) */ + 0x96, 0xff, 0x03, /* REPORT_COUNT (63) */ 0x91, 0x02, /* OUTPUT (Data,Var,Abs) */ /* USER CODE END 0 */ 0xC0 /* END_COLLECTION */ @@ -299,8 +141,8 @@ static const uint8_t hid_custom_report_desc[HID_CUSTOM_REPORT_DESC_SIZE] = { #endif }; -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[HIDRAW_OUT_EP_SIZE]; -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t send_buffer[HIDRAW_IN_EP_SIZE]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[HID_MAX_MPS]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t send_buffer[HID_MAX_MPS]; #define HID_STATE_IDLE 0 #define HID_STATE_BUSY 1 @@ -311,27 +153,27 @@ static volatile uint8_t custom_state; static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { - case USBD_EVENT_RESET: - break; - case USBD_EVENT_CONNECTED: - break; - case USBD_EVENT_DISCONNECTED: - break; - case USBD_EVENT_RESUME: - break; - case USBD_EVENT_SUSPEND: - break; - case USBD_EVENT_CONFIGURED: - /* setup first out ep read transfer */ - usbd_ep_start_read(busid, HIDRAW_OUT_EP, read_buffer, HIDRAW_OUT_EP_SIZE); - break; - case USBD_EVENT_SET_REMOTE_WAKEUP: - break; - case USBD_EVENT_CLR_REMOTE_WAKEUP: - break; - - default: - break; + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, HIDRAW_OUT_EP, read_buffer, HID_MAX_MPS); + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; } } @@ -346,7 +188,7 @@ static void usbd_hid_custom_in_callback(uint8_t busid, uint8_t ep, uint32_t nbyt static void usbd_hid_custom_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) { USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); - usbd_ep_start_read(busid, ep, read_buffer, HIDRAW_IN_EP_SIZE); + usbd_ep_start_read(busid, ep, read_buffer, HID_MAX_MPS); read_buffer[0] = 0x02; /* IN: report id */ usbd_ep_start_write(busid, HIDRAW_IN_EP, read_buffer, nbytes); } @@ -372,11 +214,8 @@ struct usbd_interface intf0; void hid_custom_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &hid_descriptor); -#else - usbd_desc_register(busid, hid_descriptor); -#endif + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE)); usbd_add_endpoint(busid, &custom_in_ep); usbd_add_endpoint(busid, &custom_out_ep); diff --git a/components/drivers/usb/cherryusb/demo/hid_keyboard_template.c b/components/drivers/usb/cherryusb/demo/hid_keyboard_template.c index 9fabba60dd..843a726729 100644 --- a/components/drivers/usb/cherryusb/demo/hid_keyboard_template.c +++ b/components/drivers/usb/cherryusb/demo/hid_keyboard_template.c @@ -15,49 +15,16 @@ #define HID_INT_EP_SIZE 8 #define HID_INT_EP_INTERVAL 10 -#define USB_HID_CONFIG_DESC_SIZ 34 +#define USB_CONFIG_SIZE 34 #define HID_KEYBOARD_REPORT_DESC_SIZE 63 -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01) }; static const uint8_t config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_KEYBOARD_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 34 */ + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_KEYBOARD_DESCRIPTOR_INIT(0x00, 0x01, HID_KEYBOARD_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), }; static const uint8_t device_quality_descriptor[] = { @@ -112,117 +79,6 @@ const struct usb_descriptor hid_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -static const uint8_t hid_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_KEYBOARD_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 34 */ - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'H', 0x00, /* wcChar10 */ - 'I', 0x00, /* wcChar11 */ - 'D', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif /* USB HID device Configuration Descriptor */ static uint8_t hid_desc[9] __ALIGN_END = { @@ -319,11 +175,8 @@ struct usbd_interface intf0; void hid_keyboard_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &hid_descriptor); -#else - usbd_desc_register(busid, hid_descriptor); -#endif + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_keyboard_report_desc, HID_KEYBOARD_REPORT_DESC_SIZE)); usbd_add_endpoint(busid, &hid_in_ep); diff --git a/components/drivers/usb/cherryusb/demo/hid_mouse_template.c b/components/drivers/usb/cherryusb/demo/hid_mouse_template.c index bcd03e1d17..24d32f90df 100644 --- a/components/drivers/usb/cherryusb/demo/hid_mouse_template.c +++ b/components/drivers/usb/cherryusb/demo/hid_mouse_template.c @@ -17,50 +17,17 @@ #define USBD_LANGID_STRING 1033 /*!< config descriptor size */ -#define USB_HID_CONFIG_DESC_SIZ 34 +#define USB_CONFIG_SIZE 34 /*!< report descriptor size */ #define HID_MOUSE_REPORT_DESC_SIZE 74 -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01) }; static const uint8_t config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 34 */ + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_MOUSE_DESCRIPTOR_INIT(0x00, 0x01, HID_MOUSE_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), }; static const uint8_t device_quality_descriptor[] = { @@ -115,118 +82,6 @@ const struct usb_descriptor hid_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -/*!< global descriptor */ -const uint8_t hid_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 34 */ - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'H', 0x00, /* wcChar10 */ - 'I', 0x00, /* wcChar11 */ - 'D', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif /*!< hid mouse report descriptor */ static const uint8_t hid_mouse_report_desc[HID_MOUSE_REPORT_DESC_SIZE] = { @@ -337,11 +192,8 @@ struct usbd_interface intf0; void hid_mouse_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &hid_descriptor); -#else - usbd_desc_register(busid, hid_descriptor); -#endif + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); usbd_add_endpoint(busid, &hid_in_ep); diff --git a/components/drivers/usb/cherryusb/demo/hid_remote_wakeup_template.c b/components/drivers/usb/cherryusb/demo/hid_remote_wakeup_template.c index fa4381191d..c2c61305e6 100644 --- a/components/drivers/usb/cherryusb/demo/hid_remote_wakeup_template.c +++ b/components/drivers/usb/cherryusb/demo/hid_remote_wakeup_template.c @@ -17,50 +17,17 @@ #define USBD_LANGID_STRING 1033 /*!< config descriptor size */ -#define USB_HID_CONFIG_DESC_SIZ 34 +#define USB_CONFIG_SIZE 34 /*!< report descriptor size */ #define HID_MOUSE_REPORT_DESC_SIZE 74 -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01) }; static const uint8_t config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x01, 0x01, USB_CONFIG_REMOTE_WAKEUP | USB_CONFIG_SELF_POWERED, USBD_MAX_POWER), - - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 34 */ + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_REMOTE_WAKEUP | USB_CONFIG_SELF_POWERED, USBD_MAX_POWER), + HID_MOUSE_DESCRIPTOR_INIT(0x00, 0x01, HID_MOUSE_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), }; static const uint8_t device_quality_descriptor[] = { @@ -115,118 +82,6 @@ const struct usb_descriptor hid_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -/*!< global descriptor */ -const uint8_t hid_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x01, 0x01, USB_CONFIG_REMOTE_WAKEUP | USB_CONFIG_SELF_POWERED, USBD_MAX_POWER), - - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 34 */ - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'H', 0x00, /* wcChar10 */ - 'I', 0x00, /* wcChar11 */ - 'D', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif /*!< hid mouse report descriptor */ static const uint8_t hid_mouse_report_desc[HID_MOUSE_REPORT_DESC_SIZE] = { @@ -337,11 +192,8 @@ static struct usbd_interface intf0; void hid_mouse_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &hid_descriptor); -#else - usbd_desc_register(busid, hid_descriptor); -#endif + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); usbd_add_endpoint(busid, &hid_in_ep); diff --git a/components/drivers/usb/cherryusb/demo/midi_template.c b/components/drivers/usb/cherryusb/demo/midi_template.c index 0203c74445..f0e66c4be9 100644 --- a/components/drivers/usb/cherryusb/demo/midi_template.c +++ b/components/drivers/usb/cherryusb/demo/midi_template.c @@ -14,7 +14,13 @@ #define USBD_MAX_POWER 100 #define USBD_LANGID_STRING 1033 -#define USB_CONFIG_SIZE (9 + 9 + 9 + 9 + 7 + MIDI_SIZEOF_JACK_DESC + 9 + 5 + 9 + 5) +#define AUDIO_AC_SIZ AUDIO_SIZEOF_AC_HEADER_DESC(1) +#define AUDIO_MS_SIZ (7 + MIDI_SIZEOF_JACK_DESC + 9 + 5 + 9 + 5) + +#define USB_CONFIG_SIZE (unsigned long)(9 + \ + AUDIO_AC_DESCRIPTOR_LEN(1) + \ + MIDI_STANDARD_DESCRIPTOR_LEN + \ + AUDIO_MS_SIZ) #ifdef CONFIG_USB_HS #define MIDI_EP_MPS 512 @@ -22,55 +28,15 @@ #define MIDI_EP_MPS 64 #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0100, 0x01) }; static const uint8_t config_descriptor[] = { USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - // Standard AC Interface Descriptor - 0x09, - 0x04, - 0x00, - 0x00, - 0x00, - 0x01, - 0x01, - 0x00, - 0x00, - // Class-specific AC Interface Descriptor - 0x09, - 0x24, - 0x01, - 0x00, - 0x01, - 0x09, - 0x00, - 0x01, - 0x01, - // MIDIStreaming Interface Descriptors - 0x09, - 0x04, - 0x01, - 0x00, - 0x02, - 0x01, - 0x03, - 0x00, - 0x00, - // Class-Specific MS Interface Header Descriptor - 0x07, - 0x24, - 0x01, - 0x00, - 0x01, - WBVAL(65), - - // MIDI_IN_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EMBEDDED, 0x01), - // MIDI_IN_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EXTERNAL, 0x02), - // MIDI_OUT_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EMBEDDED, 0x03, 0x02), - // MIDI_OUT_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EXTERNAL, 0x04, 0x01), + AUDIO_AC_DESCRIPTOR_INIT(0x00, 0x02, AUDIO_AC_SIZ, 0x00, 0x01), + MIDI_STANDARD_DESCRIPTOR_INIT(0x01, 0x02), + MIDI_CS_HEADER_DESCRIPTOR_INIT(AUDIO_MS_SIZ), MIDI_JACK_DESCRIPTOR_INIT(0x01), // OUT endpoint descriptor 0x09, 0x05, MIDI_OUT_EP, 0x02, WBVAL(MIDI_EP_MPS), 0x00, 0x00, 0x00, @@ -133,136 +99,6 @@ const struct usb_descriptor midi_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t midi_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0100, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - // Standard AC Interface Descriptor - 0x09, - 0x04, - 0x00, - 0x00, - 0x00, - 0x01, - 0x01, - 0x00, - 0x00, - // Class-specific AC Interface Descriptor - 0x09, - 0x24, - 0x01, - 0x00, - 0x01, - 0x09, - 0x00, - 0x01, - 0x01, - // MIDIStreaming Interface Descriptors - 0x09, - 0x04, - 0x01, - 0x00, - 0x02, - 0x01, - 0x03, - 0x00, - 0x00, - // Class-Specific MS Interface Header Descriptor - 0x07, - 0x24, - 0x01, - 0x00, - 0x01, - WBVAL(65), - - // MIDI_IN_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EMBEDDED, 0x01), - // MIDI_IN_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EXTERNAL, 0x02), - // MIDI_OUT_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EMBEDDED, 0x03, 0x02), - // MIDI_OUT_JACK_DESCRIPTOR_INIT(MIDI_JACK_TYPE_EXTERNAL, 0x04, 0x01), - MIDI_JACK_DESCRIPTOR_INIT(0x01), - // OUT endpoint descriptor - 0x09, 0x05, MIDI_OUT_EP, 0x02, WBVAL(MIDI_EP_MPS), 0x00, 0x00, 0x00, - 0x05, 0x25, 0x01, 0x01, 0x01, - - // IN endpoint descriptor - 0x09, 0x05, MIDI_IN_EP, 0x02, WBVAL(MIDI_EP_MPS), 0x00, 0x00, 0x00, - 0x05, 0x25, 0x01, 0x01, 0x03, - - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x28, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'M', 0x00, /* wcChar10 */ - 'I', 0x00, /* wcChar11 */ - 'D', 0x00, /* wcChar12 */ - 'I', 0x00, /* wcChar13 */ - ' ', 0x00, /* wcChar14 */ - 'D', 0x00, /* wcChar15 */ - 'E', 0x00, /* wcChar16 */ - 'M', 0x00, /* wcChar17 */ - 'O', 0x00, /* wcChar18 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '1', 0x00, /* wcChar3 */ - '0', 0x00, /* wcChar4 */ - '3', 0x00, /* wcChar5 */ - '1', 0x00, /* wcChar6 */ - '0', 0x00, /* wcChar7 */ - '0', 0x00, /* wcChar8 */ - '0', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[MIDI_EP_MPS]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[MIDI_EP_MPS]; @@ -317,11 +153,8 @@ struct usbd_endpoint midi_in_ep = { void midi_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &midi_descriptor); -#else - usbd_desc_register(busid, midi_descriptor); -#endif + usbd_add_interface(busid, &intf0); usbd_add_interface(busid, &intf1); usbd_add_endpoint(busid, &midi_out_ep); diff --git a/components/drivers/usb/cherryusb/demo/msc_ram_template.c b/components/drivers/usb/cherryusb/demo/msc_ram_template.c index ac7d9dbd08..cd8f646463 100644 --- a/components/drivers/usb/cherryusb/demo/msc_ram_template.c +++ b/components/drivers/usb/cherryusb/demo/msc_ram_template.c @@ -22,7 +22,6 @@ #define MSC_MAX_MPS 64 #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01) }; @@ -84,85 +83,6 @@ const struct usb_descriptor msc_ram_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t msc_ram_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0200, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - MSC_DESCRIPTOR_INIT(0x00, MSC_OUT_EP, MSC_IN_EP, MSC_MAX_MPS, 0x02), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'M', 0x00, /* wcChar10 */ - 'S', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif static void usbd_event_handler(uint8_t busid, uint8_t event) { @@ -267,11 +187,8 @@ void msc_ram_init(uint8_t busid, uintptr_t reg_base) res = rt_device_open(blk_dev, RT_DEVICE_OFLAG_RDWR); RT_ASSERT(res == RT_EOK); #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &msc_ram_descriptor); -#else - usbd_desc_register(busid, msc_ram_descriptor); -#endif + usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf0, MSC_OUT_EP, MSC_IN_EP)); usbd_initialize(busid, reg_base, usbd_event_handler); diff --git a/components/drivers/usb/cherryusb/demo/usb_host.c b/components/drivers/usb/cherryusb/demo/usb_host.c index 0863970eda..5f6e6e9267 100644 --- a/components/drivers/usb/cherryusb/demo/usb_host.c +++ b/components/drivers/usb/cherryusb/demo/usb_host.c @@ -4,79 +4,73 @@ * SPDX-License-Identifier: Apache-2.0 */ #include "usbh_core.h" -#include "usbh_cdc_acm.h" +#include "usbh_serial.h" #include "usbh_hid.h" #include "usbh_msc.h" -#include "usbh_video.h" -#include "usbh_audio.h" -#ifndef CONFIG_TEST_USBH_CDC_ACM -#define CONFIG_TEST_USBH_CDC_ACM 1 -#endif -#ifndef TEST_USBH_CDC_SPEED -#define TEST_USBH_CDC_SPEED 0 -#endif -#ifndef CONFIG_TEST_USBH_HID -#define CONFIG_TEST_USBH_HID 1 -#endif -#ifndef CONFIG_TEST_USBH_MSC -#define CONFIG_TEST_USBH_MSC 1 -#endif -#ifndef TEST_USBH_MSC_FATFS -#define TEST_USBH_MSC_FATFS 0 -#endif -#ifndef TEST_USBH_MSC_FATFS_SPEED -#define TEST_USBH_MSC_FATFS_SPEED 0 -#endif -#ifndef CONFIG_TEST_USBH_AUDIO -#define CONFIG_TEST_USBH_AUDIO 0 -#endif -#ifndef CONFIG_TEST_USBH_VIDEO -#define CONFIG_TEST_USBH_VIDEO 0 -#endif +// net class demos use socket api -#if defined(TEST_USBH_CDC_ECM) || defined(TEST_USBH_CDC_RNDIS) || defined(TEST_USBH_ASIX) || defined(TEST_USBH_RTL8152) -#error we have move those class implements into platform/none/usbh_lwip.c, and you should call tcpip_init(NULL, NULL) in your app +#ifdef CONFIG_TEST_USBH_SERIAL +#define SERIAL_TEST_LEN (1 * 1024) + +#if SERIAL_TEST_LEN >= CONFIG_USBHOST_SERIAL_RX_SIZE +#error SERIAL_TEST_LEN is larger than CONFIG_USBHOST_SERIAL_RX_SIZE, please reduce SERIAL_TEST_LEN or increase CONFIG_USBHOST_SERIAL_RX_SIZE #endif -#if CONFIG_TEST_USBH_CDC_ACM -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t cdc_buffer[4096]; +volatile uint32_t serial_tx_bytes = 0; +volatile uint32_t serial_rx_bytes = 0; +volatile bool serial_is_opened = false; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t serial_tx_buffer[SERIAL_TEST_LEN]; +uint8_t serial_rx_data[SERIAL_TEST_LEN]; -#if TEST_USBH_CDC_SPEED +#ifdef CONFIG_TEST_USBH_CDC_SPEED #define TEST_LEN (16 * 1024) #define TEST_COUNT (10240) -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t cdc_speed_buffer[TEST_LEN]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t serial_speed_buffer[TEST_LEN]; #endif -void usbh_cdc_acm_callback(void *arg, int nbytes) +static void usbh_serial_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) { - //struct usbh_cdc_acm *cdc_acm_class = (struct usbh_cdc_acm *)arg; - - if (nbytes > 0) { - for (size_t i = 0; i < nbytes; i++) { - USB_LOG_RAW("0x%02x ", cdc_buffer[i]); + int ret; + struct usbh_serial *serial; + bool serial_test_success = false; + + serial = usbh_serial_open("/dev/ttyACM0", USBH_SERIAL_O_RDWR | USBH_SERIAL_O_NONBLOCK); + if (serial == NULL) { + serial = usbh_serial_open("/dev/ttyUSB0", USBH_SERIAL_O_RDWR | USBH_SERIAL_O_NONBLOCK); + if (serial == NULL) { + USB_LOG_RAW("no serial device found\r\n"); + goto delete; } - USB_LOG_RAW("nbytes:%d\r\n", (unsigned int)nbytes); } -} -static void usbh_cdc_acm_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) -{ - int ret; - struct usbh_cdc_acm *cdc_acm_class = (struct usbh_cdc_acm *)CONFIG_USB_OSAL_THREAD_GET_ARGV; + struct usbh_serial_termios termios; + + memset(&termios, 0, sizeof(termios)); + termios.baudrate = 115200; + termios.stopbits = 0; + termios.parity = 0; + termios.databits = 8; + termios.rtscts = false; + termios.rx_timeout = 0; + ret = usbh_serial_control(serial, USBH_SERIAL_CMD_SET_ATTR, &termios); + if (ret < 0) { + USB_LOG_RAW("set serial attr error, ret:%d\r\n", ret); + goto delete_with_close; + } /* test with only one buffer, if you have more cdc acm class, modify by yourself */ -#if TEST_USBH_CDC_SPEED +#ifdef CONFIG_TEST_USBH_CDC_SPEED const uint32_t test_len[] = { 512, 1 * 1024, 2 * 1024, 4 * 1024, 8 * 1024, 16 * 1024 }; - memset(cdc_speed_buffer, 0xAA, TEST_LEN); + memset(serial_speed_buffer, 0xAA, TEST_LEN); for (uint8_t j = 0; j < 6; j++) { uint32_t start_time = (uint32_t)xTaskGetTickCount(); for (uint32_t i = 0; i < TEST_COUNT; i++) { - usbh_bulk_urb_fill(&cdc_acm_class->bulkout_urb, cdc_acm_class->hport, cdc_acm_class->bulkout, cdc_speed_buffer, test_len[j], 0XFFFFFFF, NULL, NULL); - ret = usbh_submit_urb(&cdc_acm_class->bulkout_urb); + usbh_serial_write(serial, serial_speed_buffer, test_len[j]); if (ret < 0) { USB_LOG_RAW("bulk out error,ret:%d\r\n", ret); while (1) { @@ -87,35 +81,75 @@ static void usbh_cdc_acm_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) uint32_t time_ms = xTaskGetTickCount() - start_time; USB_LOG_RAW("per packet len:%d, out speed:%f MB/S\r\n", (unsigned int)test_len[j], (test_len[j] * TEST_COUNT / 1024 / 1024) * 1000 / ((float)time_ms)); } + usbh_serial_close(serial); + goto delete; #endif - memset(cdc_buffer, 0x55, 4096); + memset(serial_tx_buffer, 0xA5, sizeof(serial_tx_buffer)); + USB_LOG_RAW("start serial loopback test, len: %d\r\n", SERIAL_TEST_LEN); + + serial_tx_bytes = 0; + while (1) { + ret = usbh_serial_write(serial, serial_tx_buffer, sizeof(serial_tx_buffer)); + if (ret < 0) { + USB_LOG_RAW("serial write error, ret:%d\r\n", ret); + goto delete_with_close; + } else { + serial_tx_bytes += ret; - /* for common, we use timeout with 0xffffffff, this is just a test */ - usbh_bulk_urb_fill(&cdc_acm_class->bulkout_urb, cdc_acm_class->hport, cdc_acm_class->bulkout, cdc_buffer, sizeof(cdc_buffer), 3000, NULL, NULL); - ret = usbh_submit_urb(&cdc_acm_class->bulkout_urb); - if (ret < 0) { - USB_LOG_RAW("bulk out error,ret:%d\r\n", ret); - goto delete; - } else { - USB_LOG_RAW("send over:%d\r\n", (unsigned int)cdc_acm_class->bulkout_urb.actual_length); + if (serial_tx_bytes == SERIAL_TEST_LEN) { + USB_LOG_RAW("send over\r\n"); + break; + } + } } - /* we can change cdc_acm_class->bulkin->wMaxPacketSize with 4096 for testing zlp, default is ep mps */ - usbh_bulk_urb_fill(&cdc_acm_class->bulkin_urb, cdc_acm_class->hport, cdc_acm_class->bulkin, cdc_buffer, cdc_acm_class->bulkin->wMaxPacketSize, 0xffffffff, usbh_cdc_acm_callback, cdc_acm_class); - ret = usbh_submit_urb(&cdc_acm_class->bulkin_urb); - if (ret < 0) { - USB_LOG_RAW("bulk in error,ret:%d\r\n", ret); - goto delete; - } else { + volatile uint32_t wait_timeout = 0; + serial_rx_bytes = 0; + while (1) { + ret = usbh_serial_read(serial, &serial_rx_data[serial_rx_bytes], SERIAL_TEST_LEN - serial_rx_bytes); + if (ret < 0) { + USB_LOG_RAW("serial read error, ret:%d\r\n", ret); + goto delete_with_close; + } else { + serial_rx_bytes += ret; + + if (serial_rx_bytes == SERIAL_TEST_LEN) { + USB_LOG_RAW("receive over\r\n"); + for (uint32_t i = 0; i < SERIAL_TEST_LEN; i++) { + if (serial_rx_data[i] != 0xa5) { + USB_LOG_RAW("serial loopback data error at index %d, data: 0x%02x\r\n", (unsigned int)i, serial_rx_data[i]); + goto delete_with_close; + } + } + serial_test_success = true; + break; + } + } + wait_timeout++; + + if (wait_timeout > 500) { // 5s + USB_LOG_RAW("serial read timeout\r\n"); + goto delete_with_close; + } + + usb_osal_msleep(10); } + // clang-format off +delete_with_close: + if (serial_test_success) { + USB_LOG_RAW("serial loopback test success\r\n"); + } else { + USB_LOG_RAW("serial loopback test failed\r\n"); + } + usbh_serial_close(serial); delete: usb_osal_thread_delete(NULL); // clang-format on } #endif -#if CONFIG_TEST_USBH_HID +#ifdef CONFIG_TEST_USBH_HID USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t hid_buffer[128]; void usbh_hid_callback(void *arg, int nbytes) @@ -140,7 +174,6 @@ static void usbh_hid_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) { int ret; struct usbh_hid *hid_class = (struct usbh_hid *)CONFIG_USB_OSAL_THREAD_GET_ARGV; - ; /* test with only one buffer, if you have more hid class, modify by yourself */ @@ -157,15 +190,15 @@ delete: } #endif -#if CONFIG_TEST_USBH_MSC +#ifdef CONFIG_TEST_USBH_MSC -#if TEST_USBH_MSC_FATFS +#ifdef CONFIG_TEST_USBH_MSC_FATFS #include "ff.h" -#if TEST_USBH_MSC_FATFS_SPEED +#ifdef CONFIG_TEST_USBH_MSC_FATFS_SPEED #define WRITE_SIZE_MB (128UL) -#define WRITE_SIZE (1024UL * 1024UL * WRITE_SIZE_MB) -#define BUF_SIZE (1024UL * 128UL) +#define WRITE_SIZE (1024UL * 1024UL * WRITE_SIZE_MB) +#define BUF_SIZE (1024UL * 128UL) USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_write_buffer[BUF_SIZE]; #else USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_write_buffer[25 * 100]; @@ -223,7 +256,7 @@ int usb_msc_fatfs_test() goto unmount; } -#if TEST_USBH_MSC_FATFS_SPEED +#ifdef CONFIG_TEST_USBH_MSC_FATFS_SPEED for (uint32_t i = 0; i < BUF_SIZE; i++) { read_write_buffer[i] = i % 256; } @@ -234,9 +267,9 @@ int usb_msc_fatfs_test() uint32_t write_size = WRITE_SIZE; uint32_t start_time = (uint32_t)xTaskGetTickCount(); while (write_size > 0) { - res_sd = f_write(&fnew, read_write_buffer, BUF_SIZE, (UINT*)&fnum); + res_sd = f_write(&fnew, read_write_buffer, BUF_SIZE, (UINT *)&fnum); if (res_sd != FR_OK) { - printf("Write file failed, cause: %s\n", res_sd); + USB_LOG_RAW("Write file failed, cause: %s\n", res_sd); goto unmount; } write_size -= BUF_SIZE; @@ -260,9 +293,9 @@ int usb_msc_fatfs_test() uint32_t write_size = WRITE_SIZE; uint32_t start_time = (uint32_t)xTaskGetTickCount(); while (write_size > 0) { - res_sd = f_read(&fnew, read_write_buffer, BUF_SIZE, (UINT*)&fnum); + res_sd = f_read(&fnew, read_write_buffer, BUF_SIZE, (UINT *)&fnum); if (res_sd != FR_OK) { - printf("Read file failed, cause: %s\n", res_sd); + USB_LOG_RAW("Read file failed, cause: %s\n", res_sd); goto unmount; } write_size -= BUF_SIZE; @@ -295,8 +328,10 @@ static void usbh_msc_thread(CONFIG_USB_OSAL_THREAD_SET_ARGV) int ret; struct usbh_msc *msc_class = (struct usbh_msc *)CONFIG_USB_OSAL_THREAD_GET_ARGV; + (void)msc_class; + /* test with only one buffer, if you have more msc class, modify by yourself */ -#if TEST_USBH_MSC_FATFS == 0 +#ifndef TEST_USBH_MSC_FATFS ret = usbh_msc_scsi_init(msc_class); if (ret < 0) { USB_LOG_RAW("scsi_init error,ret:%d\r\n", ret); @@ -326,18 +361,23 @@ delete: } #endif -#if CONFIG_TEST_USBH_CDC_ACM -void usbh_cdc_acm_run(struct usbh_cdc_acm *cdc_acm_class) +#ifdef CONFIG_TEST_USBH_SERIAL +void usbh_serial_run(struct usbh_serial *serial) { - usb_osal_thread_create("usbh_cdc", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_cdc_acm_thread, cdc_acm_class); + if (serial_is_opened) { + return; + } + serial_is_opened = true; + usb_osal_thread_create("usbh_serial", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_serial_thread, serial); } -void usbh_cdc_acm_stop(struct usbh_cdc_acm *cdc_acm_class) +void usbh_serial_stop(struct usbh_serial *serial) { + serial_is_opened = false; } #endif -#if CONFIG_TEST_USBH_HID +#ifdef CONFIG_TEST_USBH_HID void usbh_hid_run(struct usbh_hid *hid_class) { usb_osal_thread_create("usbh_hid", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_hid_thread, hid_class); @@ -348,7 +388,7 @@ void usbh_hid_stop(struct usbh_hid *hid_class) } #endif -#if CONFIG_TEST_USBH_MSC +#ifdef CONFIG_TEST_USBH_MSC void usbh_msc_run(struct usbh_msc *msc_class) { usb_osal_thread_create("usbh_msc", 2048, CONFIG_USBHOST_PSC_PRIO + 1, usbh_msc_thread, msc_class); @@ -359,14 +399,6 @@ void usbh_msc_stop(struct usbh_msc *msc_class) } #endif -#if CONFIG_TEST_USBH_AUDIO -#error "commercial charge" -#endif - -#if CONFIG_TEST_USBH_VIDEO -#error "commercial charge" -#endif - #if 0 #include "usbh_aoa.h" diff --git a/components/drivers/usb/cherryusb/demo/usbh_bl616_wifi_cli.c b/components/drivers/usb/cherryusb/demo/usbh_bl616_wifi_cli.c new file mode 100644 index 0000000000..125a26394d --- /dev/null +++ b/components/drivers/usb/cherryusb/demo/usbh_bl616_wifi_cli.c @@ -0,0 +1,182 @@ +#include "usbh_core.h" +#include "usbh_cdc_acm.h" +#include "shell.h" + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t cdc_buffer[8 * 1024]; + +int wifi_scan(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "ap_scan\r\n"); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi scan failed1, ret:%d\r\n", ret); + return -1; + } + + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi scan failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_scan, wifi_scan); + +int wifi_scan_result(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "ap_scan_result {\"offset\":0, \"count\":0}\r\n"); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi scan failed1, ret:%d\r\n", ret); + return -1; + } + + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi scan failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_scan_result, wifi_scan_result); + +int wifi_connect(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + if (argc < 3) { + printf("please input correct command: wifi_connect ssid password\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "ap_connect {\"ssid\":\"%s\", \"password\":\"%s\"}\r\n", argv[1], argv[2]); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi connect failed1, ret:%d\r\n", ret); + return -1; + } + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi connect failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_connect, wifi_connect); + +int wifi_disconnect(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "ap_disconnect\r\n"); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi disconnect failed1, ret:%d\r\n", ret); + return -1; + } + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi disconnect failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_disconnect, wifi_disconnect); + +int wifi_status(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "ap_status\r\n"); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi status failed1, ret:%d\r\n", ret); + return -1; + } + + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi status failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_status, wifi_status); + +int wifi_version(int argc, char **argv) +{ + struct usbh_cdc_acm *cdc_acm_class = usbh_find_class_instance("/dev/ttyACM0"); + uint32_t len; + int ret; + + if (cdc_acm_class == NULL) { + printf("cdc acm class not found\r\n"); + return -1; + } + + len = snprintf((char *)cdc_buffer, sizeof(cdc_buffer), "sys_version\r\n"); + ret = usbh_cdc_acm_bulk_out_transfer(cdc_acm_class, cdc_buffer, len, 3000); + if (ret < 0) { + printf("wifi status failed1, ret:%d\r\n", ret); + return -1; + } + + ret = usbh_cdc_acm_bulk_in_transfer(cdc_acm_class, cdc_buffer, sizeof(cdc_buffer), 3000); + if (ret < 0) { + printf("wifi status failed2, ret:%d\r\n", ret); + return -1; + } + cdc_buffer[ret] = '\0'; + printf("%s\r\n", cdc_buffer); + return 0; +} +CSH_CMD_EXPORT(wifi_version, wifi_version); \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/demo/video_audiov1_hid_template.c b/components/drivers/usb/cherryusb/demo/video_audiov1_hid_template.c index 99df89b995..fab4044fe1 100644 --- a/components/drivers/usb/cherryusb/demo/video_audiov1_hid_template.c +++ b/components/drivers/usb/cherryusb/demo/video_audiov1_hid_template.c @@ -46,15 +46,15 @@ VS_HEADER_SIZ + \ 9 + \ 7 + \ - AUDIO_AC_DESCRIPTOR_INIT_LEN(2) + \ + AUDIO_AC_DESCRIPTOR_LEN(2) + \ AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC + \ AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(2, 1) + \ AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC + \ - AUDIO_AS_DESCRIPTOR_INIT_LEN(1) + \ - AUDIO_AS_DESCRIPTOR_INIT_LEN(1) + \ + AUDIO_AS_DESCRIPTOR_LEN(1) + \ + AUDIO_AS_DESCRIPTOR_LEN(1) + \ 25) #define USBD_VID 0xffff @@ -103,7 +103,6 @@ #define HID_KEYBOARD_REPORT_DESC_SIZE 63 -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) }; @@ -130,38 +129,7 @@ static const uint8_t config_descriptor[] = { EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), AUDIO_AS_DESCRIPTOR_INIT(0x04, 0x03, 0x02, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_MIC_FREQ)), - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x05, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_KEYBOARD_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 34 */ + HID_KEYBOARD_DESCRIPTOR_INIT(0x05, 0x01, HID_KEYBOARD_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), }; static const uint8_t device_quality_descriptor[] = { @@ -216,136 +184,6 @@ const struct usb_descriptor video_audio_hid_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t video_audio_hid_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x06, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), - VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), - VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), - VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), - VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_INIT(0x01, 0x01), - VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, MAX_FRAME_SIZE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), - VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), - /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ - USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01), - AUDIO_AC_DESCRIPTOR_INIT(0x02, 0x03, AUDIO_AC_SIZ, 0x00, 0x03, 0x04), - AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x01, AUDIO_INTERM_MIC, 0x02, 0x0003), - AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x02, 0x01, 0x01, 0x03, 0x00, 0x00), - AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x03, AUDIO_TERMINAL_STREAMING, 0x02), - AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(0x04, AUDIO_TERMINAL_STREAMING, 0x02, 0x0003), - AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(0x05, 0x04, 0x01, 0x03, 0x00, 0x00), - AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(0x06, AUDIO_OUTTERM_SPEAKER, 0x05), - AUDIO_AS_DESCRIPTOR_INIT(0x03, 0x04, 0x02, AUDIO_SPEAKER_FRAME_SIZE_BYTE, AUDIO_SPEAKER_RESOLUTION_BIT, AUDIO_OUT_EP, 0x09, AUDIO_OUT_PACKET, - EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_SPEAKER_FREQ)), - AUDIO_AS_DESCRIPTOR_INIT(0x04, 0x03, 0x02, AUDIO_MIC_FRAME_SIZE_BYTE, AUDIO_MIC_RESOLUTION_BIT, AUDIO_IN_EP, 0x05, AUDIO_IN_PACKET, - EP_INTERVAL, AUDIO_SAMPLE_FREQ_3B(AUDIO_MIC_FREQ)), - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x05, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_KEYBOARD_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 34 */ - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'U', 0x00, /* wcChar10 */ - 'A', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '4', 0x00, /* wcChar3 */ - '0', 0x00, /* wcChar4 */ - '3', 0x00, /* wcChar5 */ - '1', 0x00, /* wcChar6 */ - '0', 0x00, /* wcChar7 */ - '0', 0x00, /* wcChar8 */ - '0', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif static const uint8_t hid_keyboard_report_desc[HID_KEYBOARD_REPORT_DESC_SIZE] = { 0x05, 0x01, // USAGE_PAGE (Generic Desktop) @@ -469,11 +307,11 @@ void usbd_audio_open(uint8_t busid, uint8_t intf) audio_rx_flag = 1; /* setup first out ep read transfer */ usbd_ep_start_read(busid, AUDIO_OUT_EP, audio_read_buffer, AUDIO_OUT_PACKET); - printf("OPEN1\r\n"); + USB_LOG_RAW("OPEN1\r\n"); } else if (intf == 4) { audio_tx_flag = 1; audio_iso_tx_busy = false; - printf("OPEN2\r\n"); + USB_LOG_RAW("OPEN2\r\n"); } } @@ -481,11 +319,11 @@ void usbd_audio_close(uint8_t busid, uint8_t intf) { if (intf == 3) { audio_rx_flag = 0; - printf("CLOSE1\r\n"); + USB_LOG_RAW("CLOSE1\r\n"); } else if (intf == 4) { audio_tx_flag = 0; audio_iso_tx_busy = false; - printf("CLOSE2\r\n"); + USB_LOG_RAW("CLOSE2\r\n"); } } @@ -541,11 +379,8 @@ struct audio_entity_info audio_entity_table[] = { void composite_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &video_audio_hid_descriptor); -#else - usbd_desc_register(busid, video_audio_hid_descriptor); -#endif + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); usbd_add_interface(busid, usbd_video_init_intf(busid, &intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); usbd_add_endpoint(busid, &video_in_ep); diff --git a/components/drivers/usb/cherryusb/demo/video_static_h264_template.c b/components/drivers/usb/cherryusb/demo/video_static_h264_template.c index 7337f5f7ed..a45566f6c4 100644 --- a/components/drivers/usb/cherryusb/demo/video_static_h264_template.c +++ b/components/drivers/usb/cherryusb/demo/video_static_h264_template.c @@ -48,7 +48,6 @@ #define USBD_MAX_POWER 100 #define USBD_LANGID_STRING 1033 -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) }; @@ -118,94 +117,6 @@ const struct usb_descriptor video_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t video_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), - VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), - VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), - VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), - VIDEO_VS_FORMAT_H264_DESCRIPTOR_INIT(0x01, 0x01), - VIDEO_VS_FRAME_H264_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), - VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), - /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ - USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01), - - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'U', 0x00, /* wcChar10 */ - 'V', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '1', 0x00, /* wcChar3 */ - '0', 0x00, /* wcChar4 */ - '3', 0x00, /* wcChar5 */ - '1', 0x00, /* wcChar6 */ - '0', 0x00, /* wcChar7 */ - '0', 0x00, /* wcChar8 */ - '0', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif volatile bool tx_flag = 0; volatile bool iso_tx_busy = false; @@ -272,11 +183,8 @@ struct usbd_interface intf1; void video_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &video_descriptor); -#else - usbd_desc_register(busid, video_descriptor); -#endif + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); usbd_add_interface(busid, usbd_video_init_intf(busid, &intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); usbd_add_endpoint(busid, &video_in_ep); diff --git a/components/drivers/usb/cherryusb/demo/video_static_mjpeg_template.c b/components/drivers/usb/cherryusb/demo/video_static_mjpeg_template.c index 3fc923f8d8..0f1bcef6ef 100644 --- a/components/drivers/usb/cherryusb/demo/video_static_mjpeg_template.c +++ b/components/drivers/usb/cherryusb/demo/video_static_mjpeg_template.c @@ -48,7 +48,6 @@ #define USBD_MAX_POWER 100 #define USBD_LANGID_STRING 1033 -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) }; @@ -118,94 +117,6 @@ const struct usb_descriptor video_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t video_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), - VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), - VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), - VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), - VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_INIT(0x01, 0x01), - VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, MAX_FRAME_SIZE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), - VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), - /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ - USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01), - - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'U', 0x00, /* wcChar10 */ - 'V', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '1', 0x00, /* wcChar3 */ - '0', 0x00, /* wcChar4 */ - '3', 0x00, /* wcChar5 */ - '1', 0x00, /* wcChar6 */ - '0', 0x00, /* wcChar7 */ - '0', 0x00, /* wcChar8 */ - '0', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif volatile bool tx_flag = 0; volatile bool iso_tx_busy = false; @@ -272,11 +183,8 @@ struct usbd_interface intf1; void video_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &video_descriptor); -#else - usbd_desc_register(busid, video_descriptor); -#endif + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); usbd_add_interface(busid, usbd_video_init_intf(busid, &intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); usbd_add_endpoint(busid, &video_in_ep); diff --git a/components/drivers/usb/cherryusb/demo/video_static_yuyv_template.c b/components/drivers/usb/cherryusb/demo/video_static_yuyv_template.c index 7c7d178992..1d51d8dbbc 100644 --- a/components/drivers/usb/cherryusb/demo/video_static_yuyv_template.c +++ b/components/drivers/usb/cherryusb/demo/video_static_yuyv_template.c @@ -49,7 +49,6 @@ #define USBD_MAX_POWER 100 #define USBD_LANGID_STRING 1033 -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01) }; @@ -121,95 +120,6 @@ const struct usb_descriptor video_descriptor = { .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback }; -#else -const uint8_t video_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xef, 0x02, 0x01, USBD_VID, USBD_PID, 0x0001, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_VIDEO_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - //VIDEO_VC_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), - VIDEO_VC_NOEP_DESCRIPTOR_INIT(0x00, VIDEO_INT_EP, 0x0100, VIDEO_VC_TERMINAL_LEN, 48000000, 0x02), - VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x00, 0x00), - VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(0x01, VS_HEADER_SIZ, VIDEO_IN_EP, 0x00), - VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_INIT(0x01, 0x01, VIDEO_GUID_YUY2), - VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_INIT(0x01, WIDTH, HEIGHT, MIN_BIT_RATE, MAX_BIT_RATE, MAX_FRAME_SIZE, DBVAL(INTERVAL), 0x01, DBVAL(INTERVAL)), - VIDEO_VS_COLOR_MATCHING_DESCRIPTOR_INIT(), - VIDEO_VS_DESCRIPTOR_INIT(0x01, 0x01, 0x01), - /* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */ - USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01), - - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'U', 0x00, /* wcChar10 */ - 'V', 0x00, /* wcChar11 */ - 'C', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '1', 0x00, /* wcChar3 */ - '0', 0x00, /* wcChar4 */ - '3', 0x00, /* wcChar5 */ - '1', 0x00, /* wcChar6 */ - '0', 0x00, /* wcChar7 */ - '0', 0x00, /* wcChar8 */ - '0', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif volatile bool tx_flag = 0; volatile bool iso_tx_busy = false; @@ -276,11 +186,8 @@ struct usbd_interface intf1; void video_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &video_descriptor); -#else - usbd_desc_register(busid, video_descriptor); -#endif + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); usbd_add_interface(busid, usbd_video_init_intf(busid, &intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); usbd_add_endpoint(busid, &video_in_ep); diff --git a/components/drivers/usb/cherryusb/demo/webusb_hid_template.c b/components/drivers/usb/cherryusb/demo/webusb_hid_template.c index 1019e0541c..ffb2498b81 100644 --- a/components/drivers/usb/cherryusb/demo/webusb_hid_template.c +++ b/components/drivers/usb/cherryusb/demo/webusb_hid_template.c @@ -6,76 +6,17 @@ #include "usbd_core.h" #include "usbd_hid.h" -#define USBD_VID 0xffff -#define USBD_PID 0xffff -#define USBD_MAX_POWER 100 -#define USBD_LANGID_STRING 1033 - -#define HID_INT_EP 0x81 -#define HID_INT_EP_SIZE 8 -#define HID_INT_EP_INTERVAL 10 - -#define USB_HID_CONFIG_DESC_SIZ (34 + 9) -#define HID_KEYBOARD_REPORT_DESC_SIZE 63 - -#define USBD_WEBUSB_VENDOR_CODE (0x22) -#define USBD_WINUSB_VENDOR_CODE (0x21) +#define WEBUSB_VENDOR_CODE (0x22) +#define WINUSB_VENDOR_CODE (0x21) -#define USBD_WINUSB_DESC_SET_LEN (0xB2) #define URL_DESCRIPTOR_LENGTH (3 + 36) -#define USBD_WEBUSB_INTF_NUM 0x01 +#define WEBUSB_INTF_NUM 0x01 #define WEBUSB_URL_STRINGS \ 'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '/', \ 'c', 'h', 'e', 'r', 'r', 'y', '-', 'e', 'm', 'b', 'e', 'd', 'd', 'e', 'd', '/', 'C', 'h', 'e', 'r', 'r', 'y', 'U', 'S', 'B', -const uint8_t USBD_WinUSBDescriptorSetDescriptor[USBD_WINUSB_DESC_SET_LEN] = { - // Microsoft OS 2.0 描述符集标头 - 0x0A, 0x00, // Descriptor size (10 bytes) - 0x00, 0x00, // MS OS 2.0 descriptor set header - 0x00, 0x00, 0x03, 0x06, // Windows version (8.1) (0x06030000) - USBD_WINUSB_DESC_SET_LEN, 0x00, // Size, MS OS 2.0 descriptor set - - // Microsoft OS 2.0 配置子集标头 - 0x08, 0x00, // wLength - 0x01, 0x00, // wDescriptorType - 0x00, // 适用于配置 1 - 0x00, // bReserved - 0XA8, 0X00, // Size, MS OS 2.0 configuration subset - - // Microsoft OS 2.0 功能子集头 - 0x08, 0x00, // Descriptor size (8 bytes) - 0x02, 0x00, // MS OS 2.0 function subset header - USBD_WEBUSB_INTF_NUM, // bFirstInterface - 0x00, // 必须设置为 0 - 0xA0, 0x00, - - // Microsoft OS 2.0 兼容 ID 描述符 - // 兼容 ID 描述符告诉 Windows 此设备与 WinUSB 驱动程序兼容 - 0x14, 0x00, // wLength 20 - 0x03, 0x00, // MS_OS_20_FEATURE_COMPATIBLE_ID - 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - // Microsoft OS 2.0 注册表属性描述符 - // 注册表属性分配设备接口 GUID - 0x84, 0x00, //wLength: 132 - 0x04, 0x00, // wDescriptorType: MS_OS_20_FEATURE_REG_PROPERTY: 0x04 (Table 9) - 0x07, 0x00, //wPropertyDataType: REG_MULTI_SZ (Table 15) - 0x2a, 0x00, //wPropertyNameLength: - //bPropertyName: “DeviceInterfaceGUID” - 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, 't', 0x00, 'e', 0x00, - 'r', 0x00, 'f', 0x00, 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, 'U', 0x00, 'I', 0x00, 'D', 0x00, 's', 0x00, - 0x00, 0x00, - 0x50, 0x00, // wPropertyDataLength - //bPropertyData: “{975F44D9-0D08-43FD-8B3E-127CA8AFFF9D}”. - '{', 0x00, '9', 0x00, 'd', 0x00, '7', 0x00, 'd', 0x00, 'e', 0x00, 'b', 0x00, 'b', 0x00, 'c', 0x00, '-', 0x00, - 'c', 0x00, '8', 0x00, '5', 0x00, 'd', 0x00, '-', 0x00, '1', 0x00, '1', 0x00, 'd', 0x00, '1', 0x00, '-', 0x00, - '9', 0x00, 'e', 0x00, 'b', 0x00, '4', 0x00, '-', 0x00, '0', 0x00, '0', 0x00, '6', 0x00, '0', 0x00, '0', 0x00, - '8', 0x00, 'c', 0x00, '3', 0x00, 'a', 0x00, '1', 0x00, '9', 0x00, 'a', 0x00, '}', 0x00, 0x00, 0x00, 0x00, 0x00 -}; - const uint8_t USBD_WebUSBURLDescriptor[URL_DESCRIPTOR_LENGTH] = { URL_DESCRIPTOR_LENGTH, WEBUSB_URL_TYPE, @@ -83,113 +24,54 @@ const uint8_t USBD_WebUSBURLDescriptor[URL_DESCRIPTOR_LENGTH] = { WEBUSB_URL_STRINGS }; -#define USBD_BOS_WTOTALLENGTH 0x39 - -#define LANDING_PAGE 0x01 -uint8_t USBD_BinaryObjectStoreDescriptor[USBD_BOS_WTOTALLENGTH] = { - // BOS描述符 - 0x05, // bLength 固长为5 - 0x0F, // bDescriptorType 固定为15 - USBD_BOS_WTOTALLENGTH, 0x00, // wTotalLength BOS描述符的总大小 - 0x02, // bNumDeviceCaps BOS描述符中独立设备功能特性描述符的数量 - - // WebUSB 平台功能描述符 - 0x18, // Descriptor size (24 bytes) - 0x10, // Descriptor type (Device Capability) 设备功能描述符 - 0x05, // Capability type (Platform) 平台描述符 - 0x00, // Reserved - - // WebUSB Platform Capability ID (3408b638-09a9-47a0-8bfd-a0768815b665) - // 平台功能 UUID 将此标识为WebUSB 平台功能描述符,它提供有关设备的基本信息 - 0x38, 0xB6, 0x08, 0x34, - 0xA9, 0x09, - 0xA0, 0x47, - 0x8B, 0xFD, - 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65, - - 0x00, 0x01, // WebUSB version 1.0 - USBD_WEBUSB_VENDOR_CODE, // Vendor-assigned WebUSB request code - LANDING_PAGE, // Landing page - - // Microsoft 平台功能描述符 - // 标头 - 0x1C, // Descriptor size (28 bytes) - 0x10, // Descriptor type (Device Capability) - 0x05, // Capability type (Platform) - 0x00, // Reserved - - 0xDF, 0x60, 0xDD, 0xD8, /* PlatformCapabilityUUID */ - 0x89, 0x45, 0xC7, 0x4C, - 0x9C, 0xD2, 0x65, 0x9D, - 0x9E, 0x64, 0x8A, 0x9F, - - // 描述符集信息结构 - 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 * dwWindowsVersion 最低兼容 Windows 版本 */ - - USBD_WINUSB_DESC_SET_LEN, 0X00, /* wDescriptorSetTotalLength */ - - USBD_WINUSB_VENDOR_CODE, /* bVendorCode */ - 0X00 /* bAltEnumCode */ +const uint8_t WINUSB_WCIDDescriptor[] = { + USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_LEN), + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(WEBUSB_INTF_NUM), +}; + +__ALIGN_BEGIN const uint8_t USBD_BinaryObjectStoreDescriptor[] = { + USB_BOS_HEADER_DESCRIPTOR_INIT(5 + USB_BOS_CAP_PLATFORM_WEBUSB_DESCRIPTOR_LEN + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_LEN, 2), + USB_BOS_CAP_PLATFORM_WEBUSB_DESCRIPTOR_INIT(WEBUSB_VENDOR_CODE, 0x01), + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_INIT(WINUSB_VENDOR_CODE, sizeof(WINUSB_WCIDDescriptor)), }; struct usb_webusb_descriptor webusb_url_desc = { - .vendor_code = USBD_WEBUSB_VENDOR_CODE, + .vendor_code = WEBUSB_VENDOR_CODE, .string = USBD_WebUSBURLDescriptor, .string_len = URL_DESCRIPTOR_LENGTH }; struct usb_msosv2_descriptor msosv2_desc = { - .vendor_code = USBD_WINUSB_VENDOR_CODE, - .compat_id = USBD_WinUSBDescriptorSetDescriptor, - .compat_id_len = USBD_WINUSB_DESC_SET_LEN, + .vendor_code = WINUSB_VENDOR_CODE, + .compat_id = WINUSB_WCIDDescriptor, + .compat_id_len = sizeof(WINUSB_WCIDDescriptor), }; struct usb_bos_descriptor bos_desc = { .string = USBD_BinaryObjectStoreDescriptor, - .string_len = USBD_BOS_WTOTALLENGTH + .string_len = sizeof(USBD_BinaryObjectStoreDescriptor) }; -#ifdef CONFIG_USBDEV_ADVANCE_DESC +#define USBD_VID 0xffff +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#define HID_INT_EP 0x81 +#define HID_INT_EP_SIZE 8 +#define HID_INT_EP_INTERVAL 10 + +#define USB_CONFIG_SIZE (34 + 9) +#define HID_KEYBOARD_REPORT_DESC_SIZE 63 + static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01) }; static const uint8_t config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_KEYBOARD_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 34 */ - USB_INTERFACE_DESCRIPTOR_INIT(USBD_WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00) + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + HID_KEYBOARD_DESCRIPTOR_INIT(0x00, 0x01, HID_KEYBOARD_REPORT_DESC_SIZE, HID_INT_EP, HID_INT_EP_SIZE, HID_INT_EP_INTERVAL), + USB_INTERFACE_DESCRIPTOR_INIT(WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00) }; static const uint8_t device_quality_descriptor[] = { @@ -247,121 +129,6 @@ const struct usb_descriptor webusb_hid_descriptor = { .webusb_url_descriptor = &webusb_url_desc, .bos_descriptor = &bos_desc }; -#else -static const uint8_t webusb_hid_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0002, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_HID_CONFIG_DESC_SIZ, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_KEYBOARD_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* 34 */ - USB_INTERFACE_DESCRIPTOR_INIT(USBD_WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x2C, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'W', 0x00, /* wcChar10 */ - 'E', 0x00, /* wcChar11 */ - 'B', 0x00, /* wcChar12 */ - 'U', 0x00, /* wcChar13 */ - 'S', 0x00, /* wcChar14 */ - 'B', 0x00, /* wcChar15 */ - ' ', 0x00, /* wcChar16 */ - 'D', 0x00, /* wcChar17 */ - 'E', 0x00, /* wcChar18 */ - 'M', 0x00, /* wcChar19 */ - 'O', 0x00, /* wcChar20 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif /* USB HID device Configuration Descriptor */ static uint8_t hid_desc[9] __ALIGN_END = { @@ -458,16 +225,8 @@ static struct usbd_interface intf0; void webusb_hid_keyboard_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC usbd_desc_register(busid, &webusb_hid_descriptor); -#else - usbd_desc_register(busid, webusb_hid_descriptor); -#endif -#ifndef CONFIG_USBDEV_ADVANCE_DESC - usbd_bos_desc_register(busid, &bos_desc); - usbd_msosv2_desc_register(busid, &msosv2_desc); - usbd_webusb_desc_register(busid, &webusb_url_desc); -#endif + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_keyboard_report_desc, HID_KEYBOARD_REPORT_DESC_SIZE)); usbd_add_endpoint(busid, &hid_in_ep); @@ -480,7 +239,7 @@ void hid_keyboard_test(uint8_t busid) { const uint8_t sendbuffer[8] = { 0x00, 0x00, HID_KBD_USAGE_A, 0x00, 0x00, 0x00, 0x00, 0x00 }; - if(usb_device_is_configured(busid) == false) { + if (usb_device_is_configured(busid) == false) { return; } diff --git a/components/drivers/usb/cherryusb/demo/winusb1.0_template.c b/components/drivers/usb/cherryusb/demo/winusb1.0_template.c index c8fd406a25..f203f2109e 100644 --- a/components/drivers/usb/cherryusb/demo/winusb1.0_template.c +++ b/components/drivers/usb/cherryusb/demo/winusb1.0_template.c @@ -4,161 +4,106 @@ * SPDX-License-Identifier: Apache-2.0 */ #include "usbd_core.h" -#include "usbd_cdc_acm.h" -#define WCID_VENDOR_CODE 0x17 +#define WINUSB_VENDOR_CODE 0x17 -#define DOUBLE_WINUSB 0 +#define WINUSB_NUM 1 -__ALIGN_BEGIN const uint8_t WCID_StringDescriptor_MSOS[18] __ALIGN_END = { - /////////////////////////////////////// - /// MS OS string descriptor - /////////////////////////////////////// - 0x12, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - /* MSFT100 */ - 'M', 0x00, 'S', 0x00, 'F', 0x00, 'T', 0x00, /* wcChar_7 */ - '1', 0x00, '0', 0x00, '0', 0x00, /* wcChar_7 */ - WCID_VENDOR_CODE, /* bVendorCode */ - 0x00, /* bReserved */ +const uint8_t WCID_StringDescriptor_MSOS[18] = { + USB_MSOSV1_STRING_DESCRIPTOR_INIT(WINUSB_VENDOR_CODE) }; -#if DOUBLE_WINUSB == 0 -__ALIGN_BEGIN const uint8_t WINUSB_WCIDDescriptor[40] __ALIGN_END = { +const uint8_t WINUSB_WCIDDescriptor[] = { + USB_MSOSV1_COMP_ID_HEADER_DESCRIPTOR_INIT(WINUSB_NUM), + USB_MSOSV1_COMP_ID_FUNCTION_WINUSB_DESCRIPTOR_INIT(0), +#if WINUSB_NUM == 2 + USB_MSOSV1_COMP_ID_FUNCTION_WINUSB_DESCRIPTOR_INIT(1), +#endif +}; + +const uint8_t WINUSB_IF0_WCIDProperties[142] = { /////////////////////////////////////// - /// WCID descriptor + /// WCID property descriptor /////////////////////////////////////// - 0x28, 0x00, 0x00, 0x00, /* dwLength */ - 0x00, 0x01, /* bcdVersion */ - 0x04, 0x00, /* wIndex */ - 0x01, /* bCount */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_7 */ + 0x8e, 0x00, 0x00, 0x00, /* dwLength */ + 0x00, 0x01, /* bcdVersion */ + 0x05, 0x00, /* wIndex */ + 0x01, 0x00, /* wCount */ /////////////////////////////////////// - /// WCID function descriptor + /// registry propter descriptor /////////////////////////////////////// - 0x00, /* bFirstInterfaceNumber */ - 0x01, /* bReserved */ - /* WINUSB */ - 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00, /* cCID_8 */ - /* */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* cSubCID_8 */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_6 */ + 0x84, 0x00, 0x00, 0x00, /* dwSize */ + 0x01, 0x00, 0x00, 0x00, /* dwPropertyDataType */ + 0x28, 0x00, /* wPropertyNameLength */ + /* DeviceInterfaceGUID */ + 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, /* wcName_20 */ + 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, /* wcName_20 */ + 't', 0x00, 'e', 0x00, 'r', 0x00, 'f', 0x00, /* wcName_20 */ + 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, /* wcName_20 */ + 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00, /* wcName_20 */ + 0x4e, 0x00, 0x00, 0x00, /* dwPropertyDataLength */ + /* {1D4B2365-4749-48EA-B38A-7C6FDDDD7E26} */ + '{', 0x00, '1', 0x00, 'D', 0x00, '4', 0x00, /* wcData_39 */ + 'B', 0x00, '2', 0x00, '3', 0x00, '6', 0x00, /* wcData_39 */ + '5', 0x00, '-', 0x00, '4', 0x00, '7', 0x00, /* wcData_39 */ + '4', 0x00, '9', 0x00, '-', 0x00, '4', 0x00, /* wcData_39 */ + '8', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00, /* wcData_39 */ + 'B', 0x00, '3', 0x00, '8', 0x00, 'A', 0x00, /* wcData_39 */ + '-', 0x00, '7', 0x00, 'C', 0x00, '6', 0x00, /* wcData_39 */ + 'F', 0x00, 'D', 0x00, 'D', 0x00, 'D', 0x00, /* wcData_39 */ + 'D', 0x00, '7', 0x00, 'E', 0x00, '2', 0x00, /* wcData_39 */ + '6', 0x00, '}', 0x00, 0x00, 0x00, /* wcData_39 */ }; -#else -__ALIGN_BEGIN const uint8_t WINUSB_WCIDDescriptor[64] __ALIGN_END = { - /////////////////////////////////////// - /// WCID descriptor - /////////////////////////////////////// - 0x40, 0x00, 0x00, 0x00, /* dwLength */ - 0x00, 0x01, /* bcdVersion */ - 0x04, 0x00, /* wIndex */ - 0x02, /* bCount */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_7 */ +#if WINUSB_NUM == 2 +#define WINUSB_IF1_WCID_PROPERTIES_SIZE (142) +const uint8_t WINUSB_IF1_WCIDProperties[142] = { /////////////////////////////////////// - /// WCID function descriptor + /// WCID property descriptor /////////////////////////////////////// - 0x00, /* bFirstInterfaceNumber */ - 0x01, /* bReserved */ - /* WINUSB */ - 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00, /* cCID_8 */ - /* */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* cSubCID_8 */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_6 */ + 0x8e, 0x00, 0x00, 0x00, /* dwLength */ + 0x00, 0x01, /* bcdVersion */ + 0x05, 0x00, /* wIndex */ + 0x01, 0x00, /* wCount */ /////////////////////////////////////// - /// WCID function descriptor + /// registry propter descriptor /////////////////////////////////////// - 0x01, /* bFirstInterfaceNumber */ - 0x01, /* bReserved */ - /* WINUSB */ - 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00, /* cCID_8 */ - /* */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* cSubCID_8 */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_6 */ + 0x84, 0x00, 0x00, 0x00, /* dwSize */ + 0x01, 0x00, 0x00, 0x00, /* dwPropertyDataType */ + 0x28, 0x00, /* wPropertyNameLength */ + /* DeviceInterfaceGUID */ + 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, /* wcName_20 */ + 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, /* wcName_20 */ + 't', 0x00, 'e', 0x00, 'r', 0x00, 'f', 0x00, /* wcName_20 */ + 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, /* wcName_20 */ + 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00, /* wcName_20 */ + 0x4e, 0x00, 0x00, 0x00, /* dwPropertyDataLength */ + /* {1D4B2365-4749-48EA-B38A-7C6FDDDD7E26} */ + '{', 0x00, '1', 0x00, 'D', 0x00, '4', 0x00, /* wcData_39 */ + 'B', 0x00, '2', 0x00, '3', 0x00, '6', 0x00, /* wcData_39 */ + '5', 0x00, '-', 0x00, '4', 0x00, '7', 0x00, /* wcData_39 */ + '4', 0x00, '9', 0x00, '-', 0x00, '4', 0x00, /* wcData_39 */ + '8', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00, /* wcData_39 */ + 'B', 0x00, '3', 0x00, '8', 0x00, 'A', 0x00, /* wcData_39 */ + '-', 0x00, '7', 0x00, 'C', 0x00, '6', 0x00, /* wcData_39 */ + 'F', 0x00, 'D', 0x00, 'D', 0x00, 'D', 0x00, /* wcData_39 */ + 'D', 0x00, '7', 0x00, 'E', 0x00, '2', 0x00, /* wcData_39 */ + '6', 0x00, '}', 0x00, 0x00, 0x00, /* wcData_39 */ }; #endif -__ALIGN_BEGIN const uint8_t WINUSB_IF0_WCIDProperties [142] __ALIGN_END = { - /////////////////////////////////////// - /// WCID property descriptor - /////////////////////////////////////// - 0x8e, 0x00, 0x00, 0x00, /* dwLength */ - 0x00, 0x01, /* bcdVersion */ - 0x05, 0x00, /* wIndex */ - 0x01, 0x00, /* wCount */ - - /////////////////////////////////////// - /// registry propter descriptor - /////////////////////////////////////// - 0x84, 0x00, 0x00, 0x00, /* dwSize */ - 0x01, 0x00, 0x00, 0x00, /* dwPropertyDataType */ - 0x28, 0x00, /* wPropertyNameLength */ - /* DeviceInterfaceGUID */ - 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, /* wcName_20 */ - 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, /* wcName_20 */ - 't', 0x00, 'e', 0x00, 'r', 0x00, 'f', 0x00, /* wcName_20 */ - 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, /* wcName_20 */ - 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00, /* wcName_20 */ - 0x4e, 0x00, 0x00, 0x00, /* dwPropertyDataLength */ - /* {1D4B2365-4749-48EA-B38A-7C6FDDDD7E26} */ - '{', 0x00, '1', 0x00, 'D', 0x00, '4', 0x00, /* wcData_39 */ - 'B', 0x00, '2', 0x00, '3', 0x00, '6', 0x00, /* wcData_39 */ - '5', 0x00, '-', 0x00, '4', 0x00, '7', 0x00, /* wcData_39 */ - '4', 0x00, '9', 0x00, '-', 0x00, '4', 0x00, /* wcData_39 */ - '8', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00, /* wcData_39 */ - 'B', 0x00, '3', 0x00, '8', 0x00, 'A', 0x00, /* wcData_39 */ - '-', 0x00, '7', 0x00, 'C', 0x00, '6', 0x00, /* wcData_39 */ - 'F', 0x00, 'D', 0x00, 'D', 0x00, 'D', 0x00, /* wcData_39 */ - 'D', 0x00, '7', 0x00, 'E', 0x00, '2', 0x00, /* wcData_39 */ - '6', 0x00, '}', 0x00, 0x00, 0x00, /* wcData_39 */ -}; -#define WINUSB_IF1_WCID_PROPERTIES_SIZE (142) -__ALIGN_BEGIN const uint8_t WINUSB_IF1_WCIDProperties [142] __ALIGN_END = { - /////////////////////////////////////// - /// WCID property descriptor - /////////////////////////////////////// - 0x8e, 0x00, 0x00, 0x00, /* dwLength */ - 0x00, 0x01, /* bcdVersion */ - 0x05, 0x00, /* wIndex */ - 0x01, 0x00, /* wCount */ - - /////////////////////////////////////// - /// registry propter descriptor - /////////////////////////////////////// - 0x84, 0x00, 0x00, 0x00, /* dwSize */ - 0x01, 0x00, 0x00, 0x00, /* dwPropertyDataType */ - 0x28, 0x00, /* wPropertyNameLength */ - /* DeviceInterfaceGUID */ - 'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, /* wcName_20 */ - 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, /* wcName_20 */ - 't', 0x00, 'e', 0x00, 'r', 0x00, 'f', 0x00, /* wcName_20 */ - 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, /* wcName_20 */ - 'U', 0x00, 'I', 0x00, 'D', 0x00, 0x00, 0x00, /* wcName_20 */ - 0x4e, 0x00, 0x00, 0x00, /* dwPropertyDataLength */ - /* {1D4B2365-4749-48EA-B38A-7C6FDDDD7E26} */ - '{', 0x00, '1', 0x00, 'D', 0x00, '4', 0x00, /* wcData_39 */ - 'B', 0x00, '2', 0x00, '3', 0x00, '6', 0x00, /* wcData_39 */ - '5', 0x00, '-', 0x00, '4', 0x00, '7', 0x00, /* wcData_39 */ - '4', 0x00, '9', 0x00, '-', 0x00, '4', 0x00, /* wcData_39 */ - '8', 0x00, 'E', 0x00, 'A', 0x00, '-', 0x00, /* wcData_39 */ - 'B', 0x00, '3', 0x00, '8', 0x00, 'A', 0x00, /* wcData_39 */ - '-', 0x00, '7', 0x00, 'C', 0x00, '6', 0x00, /* wcData_39 */ - 'F', 0x00, 'D', 0x00, 'D', 0x00, 'D', 0x00, /* wcData_39 */ - 'D', 0x00, '7', 0x00, 'E', 0x00, '2', 0x00, /* wcData_39 */ - '6', 0x00, '}', 0x00, 0x00, 0x00, /* wcData_39 */ -}; const uint8_t *WINUSB_IFx_WCIDProperties[] = { WINUSB_IF0_WCIDProperties, -#if DOUBLE_WINUSB == 1 +#if WINUSB_NUM == 2 WINUSB_IF1_WCIDProperties, #endif }; struct usb_msosv1_descriptor msosv1_desc = { .string = WCID_StringDescriptor_MSOS, - .vendor_code = WCID_VENDOR_CODE, + .vendor_code = WINUSB_VENDOR_CODE, .compat_id = WINUSB_WCIDDescriptor, .comp_id_property = WINUSB_IFx_WCIDProperties, }; @@ -166,20 +111,20 @@ struct usb_msosv1_descriptor msosv1_desc = { #define WINUSB_IN_EP 0x81 #define WINUSB_OUT_EP 0x02 -#define USBD_VID 0xefff +#define USBD_VID 0xFFFE #define USBD_PID 0xffff #define USBD_MAX_POWER 100 #define USBD_LANGID_STRING 1033 -#if DOUBLE_WINUSB == 0 +#if WINUSB_NUM == 1 #define USB_CONFIG_SIZE (9 + 9 + 7 + 7) -#define INTF_NUM 1 +#define INTF_NUM 1 #else #define WINUSB_IN_EP2 0x83 #define WINUSB_OUT_EP2 0x04 #define USB_CONFIG_SIZE (9 + 9 + 7 + 7 + 9 + 7 + 7) -#define INTF_NUM 2 +#define INTF_NUM 2 #endif #ifdef CONFIG_USB_HS @@ -188,7 +133,6 @@ struct usb_msosv1_descriptor msosv1_desc = { #define WINUSB_EP_MPS 64 #endif -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01) }; @@ -198,7 +142,7 @@ static const uint8_t config_descriptor[] = { USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x04), USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, 0x02, WINUSB_EP_MPS, 0x00), USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, 0x02, WINUSB_EP_MPS, 0x00), -#if DOUBLE_WINUSB == 1 +#if WINUSB_NUM == 2 USB_INTERFACE_DESCRIPTOR_INIT(0x01, 0x00, 0x02, 0xff, 0xff, 0x00, 0x05), USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP2, 0x02, WINUSB_EP_MPS, 0x00), USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP2, 0x02, WINUSB_EP_MPS, 0x00), @@ -253,158 +197,13 @@ static const char *string_descriptor_callback(uint8_t speed, uint8_t index) return string_descriptors[index]; } -const struct usb_descriptor winusb_descriptor = { +const struct usb_descriptor winusbv1_descriptor = { .device_descriptor_callback = device_descriptor_callback, .config_descriptor_callback = config_descriptor_callback, .device_quality_descriptor_callback = device_quality_descriptor_callback, .string_descriptor_callback = string_descriptor_callback, .msosv1_descriptor = &msosv1_desc }; -#else -const uint8_t winusb_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x04), - USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, 0x02, WINUSB_EP_MPS, 0x00), - USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, 0x02, WINUSB_EP_MPS, 0x00), -#if DOUBLE_WINUSB == 1 - USB_INTERFACE_DESCRIPTOR_INIT(0x01, 0x00, 0x02, 0xff, 0xff, 0x00, 0x05), - USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP2, 0x02, WINUSB_EP_MPS, 0x00), - USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP2, 0x02, WINUSB_EP_MPS, 0x00), -#endif - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x2C, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'W', 0x00, /* wcChar10 */ - 'I', 0x00, /* wcChar11 */ - 'N', 0x00, /* wcChar12 */ - 'U', 0x00, /* wcChar13 */ - 'S', 0x00, /* wcChar14 */ - 'B', 0x00, /* wcChar15 */ - ' ', 0x00, /* wcChar16 */ - 'D', 0x00, /* wcChar17 */ - 'E', 0x00, /* wcChar18 */ - 'M', 0x00, /* wcChar19 */ - 'O', 0x00, /* wcChar20 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '1', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ - /////////////////////////////////////// - /// string4 descriptor - /////////////////////////////////////// - 0x30, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'W', 0x00, /* wcChar10 */ - 'I', 0x00, /* wcChar11 */ - 'N', 0x00, /* wcChar12 */ - 'U', 0x00, /* wcChar13 */ - 'S', 0x00, /* wcChar14 */ - 'B', 0x00, /* wcChar15 */ - ' ', 0x00, /* wcChar16 */ - 'D', 0x00, /* wcChar17 */ - 'E', 0x00, /* wcChar18 */ - 'M', 0x00, /* wcChar19 */ - 'O', 0x00, /* wcChar20 */ - ' ', 0x00, /* wcChar16 */ - '1', 0x00, /* wcChar21 */ - /////////////////////////////////////// - /// string5 descriptor - /////////////////////////////////////// - 0x30, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'W', 0x00, /* wcChar10 */ - 'I', 0x00, /* wcChar11 */ - 'N', 0x00, /* wcChar12 */ - 'U', 0x00, /* wcChar13 */ - 'S', 0x00, /* wcChar14 */ - 'B', 0x00, /* wcChar15 */ - ' ', 0x00, /* wcChar16 */ - 'D', 0x00, /* wcChar17 */ - 'E', 0x00, /* wcChar18 */ - 'M', 0x00, /* wcChar19 */ - 'O', 0x00, /* wcChar20 */ - ' ', 0x00, /* wcChar16 */ - '2', 0x00, /* wcChar21 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - 0x00 -}; -#endif USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; @@ -428,7 +227,7 @@ static void usbd_event_handler(uint8_t busid, uint8_t event) ep_tx_busy_flag = false; /* setup first out ep read transfer */ usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); -#if DOUBLE_WINUSB == 1 +#if WINUSB_NUM == 2 usbd_ep_start_read(busid, WINUSB_OUT_EP2, read_buffer, 2048); #endif break; @@ -478,7 +277,7 @@ struct usbd_endpoint winusb_in_ep1 = { struct usbd_interface intf0; -#if DOUBLE_WINUSB == 1 +#if WINUSB_NUM == 2 void usbd_winusb_out2(uint8_t busid, uint8_t ep, uint32_t nbytes) { @@ -518,20 +317,14 @@ struct usbd_interface intf1; #endif -void winusb_init(uint8_t busid, uintptr_t reg_base) +void winusbv1_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC - usbd_desc_register(busid, &winusb_descriptor); -#else - usbd_desc_register(busid, winusb_descriptor); -#endif -#ifndef CONFIG_USBDEV_ADVANCE_DESC - usbd_msosv1_desc_register(busid, &msosv1_desc); -#endif + usbd_desc_register(busid, &winusbv1_descriptor); + usbd_add_interface(busid, &intf0); usbd_add_endpoint(busid, &winusb_out_ep1); usbd_add_endpoint(busid, &winusb_in_ep1); -#if DOUBLE_WINUSB == 1 +#if WINUSB_NUM == 2 usbd_add_interface(busid, &intf1); usbd_add_endpoint(busid, &winusb_out_ep2); usbd_add_endpoint(busid, &winusb_in_ep2); diff --git a/components/drivers/usb/cherryusb/demo/winusb2.0_cdc_template.c b/components/drivers/usb/cherryusb/demo/winusb2.0_cdc_template.c index 3ccafe324d..13d6eb07da 100644 --- a/components/drivers/usb/cherryusb/demo/winusb2.0_cdc_template.c +++ b/components/drivers/usb/cherryusb/demo/winusb2.0_cdc_template.c @@ -6,6 +6,29 @@ #include "usbd_core.h" #include "usbd_cdc_acm.h" +#define WINUSB_VENDOR_CODE 0x17 + +const uint8_t WINUSB_WCIDDescriptor[] = { + USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_LEN), + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(0x00), +}; + +__ALIGN_BEGIN const uint8_t USBD_BinaryObjectStoreDescriptor[] = { + USB_BOS_HEADER_DESCRIPTOR_INIT(5 + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_LEN, 1), + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_INIT(WINUSB_VENDOR_CODE, sizeof(WINUSB_WCIDDescriptor)), +}; + +const struct usb_msosv2_descriptor msosv2_desc = { + .vendor_code = WINUSB_VENDOR_CODE, + .compat_id = WINUSB_WCIDDescriptor, + .compat_id_len = sizeof(WINUSB_WCIDDescriptor), +}; + +const struct usb_bos_descriptor bos_desc = { + .string = USBD_BinaryObjectStoreDescriptor, + .string_len = sizeof(USBD_BinaryObjectStoreDescriptor), +}; + #define WINUSB_IN_EP 0x81 #define WINUSB_OUT_EP 0x02 @@ -27,136 +50,6 @@ #define WINUSB_EP_MPS 64 #endif -#define USBD_WINUSB_VENDOR_CODE 0x20 - -#define USBD_WEBUSB_ENABLE 0 -#define USBD_BULK_ENABLE 1 -#define USBD_WINUSB_ENABLE 1 - -/* WinUSB Microsoft OS 2.0 descriptor sizes */ -#define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10 -#define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8 -#define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20 - -#define FUNCTION_SUBSET_LEN 160 -#define DEVICE_INTERFACE_GUIDS_FEATURE_LEN 132 - -#define USBD_WINUSB_DESC_SET_LEN (WINUSB_DESCRIPTOR_SET_HEADER_SIZE + USBD_WEBUSB_ENABLE * FUNCTION_SUBSET_LEN + USBD_BULK_ENABLE * FUNCTION_SUBSET_LEN) - -__ALIGN_BEGIN const uint8_t USBD_WinUSBDescriptorSetDescriptor[] = { - WBVAL(WINUSB_DESCRIPTOR_SET_HEADER_SIZE), /* wLength */ - WBVAL(WINUSB_SET_HEADER_DESCRIPTOR_TYPE), /* wDescriptorType */ - 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/ - WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ -#if (USBD_WEBUSB_ENABLE) - WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), // wLength - WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), // wDescriptorType - 0, // bFirstInterface USBD_WINUSB_IF_NUM - 0, // bReserved - WBVAL(FUNCTION_SUBSET_LEN), // wSubsetLength - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), // wLength - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), // wDescriptorType - 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, // CompatibleId - 0, 0, 0, 0, 0, 0, 0, 0, // SubCompatibleId - WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), // wLength - WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), // wDescriptorType - WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), // wPropertyDataType - WBVAL(42), // wPropertyNameLength - 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, - 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, - 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, - WBVAL(80), // wPropertyDataLength - '{', 0, - '9', 0, '2', 0, 'C', 0, 'E', 0, '6', 0, '4', 0, '6', 0, '2', 0, '-', 0, - '9', 0, 'C', 0, '7', 0, '7', 0, '-', 0, - '4', 0, '6', 0, 'F', 0, 'E', 0, '-', 0, - '9', 0, '3', 0, '3', 0, 'B', 0, '-', - 0, '3', 0, '1', 0, 'C', 0, 'B', 0, '9', 0, 'C', 0, '5', 0, 'A', 0, 'A', 0, '3', 0, 'B', 0, '9', 0, - '}', 0, 0, 0, 0, 0 -#endif -#if USBD_BULK_ENABLE - WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), /* wLength */ - WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), /* wDescriptorType */ - 0, /* bFirstInterface USBD_BULK_IF_NUM*/ - 0, /* bReserved */ - WBVAL(FUNCTION_SUBSET_LEN), /* wSubsetLength */ - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), /* wLength */ - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), /* wDescriptorType */ - 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, /* CompatibleId*/ - 0, 0, 0, 0, 0, 0, 0, 0, /* SubCompatibleId*/ - WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), /* wLength */ - WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), /* wDescriptorType */ - WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), /* wPropertyDataType */ - WBVAL(42), /* wPropertyNameLength */ - 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, - 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, - 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, - WBVAL(80), /* wPropertyDataLength */ - '{', 0, - 'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0, - '2', 0, '9', 0, '3', 0, 'B', 0, '-', 0, - '4', 0, '6', 0, '6', 0, '3', 0, '-', 0, - 'A', 0, 'A', 0, '3', 0, '6', 0, '-', - 0, '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0, '6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0, - '}', 0, 0, 0, 0, 0 -#endif -}; - -#define USBD_NUM_DEV_CAPABILITIES (USBD_WEBUSB_ENABLE + USBD_WINUSB_ENABLE) - -#define USBD_WEBUSB_DESC_LEN 24 -#define USBD_WINUSB_DESC_LEN 28 - -#define USBD_BOS_WTOTALLENGTH (0x05 + \ - USBD_WEBUSB_DESC_LEN * USBD_WEBUSB_ENABLE + \ - USBD_WINUSB_DESC_LEN * USBD_WINUSB_ENABLE) - -__ALIGN_BEGIN const uint8_t USBD_BinaryObjectStoreDescriptor[] = { - 0x05, /* bLength */ - 0x0f, /* bDescriptorType */ - WBVAL(USBD_BOS_WTOTALLENGTH), /* wTotalLength */ - USBD_NUM_DEV_CAPABILITIES, /* bNumDeviceCaps */ -#if (USBD_WEBUSB_ENABLE) - USBD_WEBUSB_DESC_LEN, /* bLength */ - 0x10, /* bDescriptorType */ - USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ - 0x00, /* bReserved */ - 0x38, 0xB6, 0x08, 0x34, /* PlatformCapabilityUUID */ - 0xA9, 0x09, 0xA0, 0x47, - 0x8B, 0xFD, 0xA0, 0x76, - 0x88, 0x15, 0xB6, 0x65, - WBVAL(0x0100), /* 1.00 */ /* bcdVersion */ - USBD_WINUSB_VENDOR_CODE, /* bVendorCode */ - 0, /* iLandingPage */ -#endif -#if (USBD_WINUSB_ENABLE) - USBD_WINUSB_DESC_LEN, /* bLength */ - 0x10, /* bDescriptorType */ - USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ - 0x00, /* bReserved */ - 0xDF, 0x60, 0xDD, 0xD8, /* PlatformCapabilityUUID */ - 0x89, 0x45, 0xC7, 0x4C, - 0x9C, 0xD2, 0x65, 0x9D, - 0x9E, 0x64, 0x8A, 0x9F, - 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/ - WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ - USBD_WINUSB_VENDOR_CODE, /* bVendorCode */ - 0, /* bAltEnumCode */ -#endif -}; - -struct usb_msosv2_descriptor msosv2_desc = { - .vendor_code = USBD_WINUSB_VENDOR_CODE, - .compat_id = USBD_WinUSBDescriptorSetDescriptor, - .compat_id_len = USBD_WINUSB_DESC_SET_LEN, -}; - -struct usb_bos_descriptor bos_desc = { - .string = USBD_BinaryObjectStoreDescriptor, - .string_len = USBD_BOS_WTOTALLENGTH -}; - -#ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) }; @@ -219,7 +112,7 @@ static const char *string_descriptor_callback(uint8_t speed, uint8_t index) return string_descriptors[index]; } -const struct usb_descriptor winusbv2_descriptor = { +const struct usb_descriptor winusbv2_cdc_descriptor = { .device_descriptor_callback = device_descriptor_callback, .config_descriptor_callback = config_descriptor_callback, .device_quality_descriptor_callback = device_quality_descriptor_callback, @@ -227,90 +120,6 @@ const struct usb_descriptor winusbv2_descriptor = { .msosv2_descriptor = &msosv2_desc, .bos_descriptor = &bos_desc }; -#else -const uint8_t winusbv2_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), - /* Configuration 0 */ - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - /* Interface 0 */ - USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), - /* Endpoint OUT 2 */ - USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), - /* Endpoint IN 1 */ - USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), - CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, WINUSB_EP_MPS, 0x00), - /* String 0 (LANGID) */ - USB_LANGID_INIT(USBD_LANGID_STRING), - /* String 1 (Manufacturer) */ - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x2C, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'W', 0x00, /* wcChar10 */ - 'I', 0x00, /* wcChar11 */ - 'N', 0x00, /* wcChar12 */ - 'U', 0x00, /* wcChar13 */ - 'S', 0x00, /* wcChar14 */ - 'B', 0x00, /* wcChar15 */ - ' ', 0x00, /* wcChar16 */ - 'D', 0x00, /* wcChar17 */ - 'E', 0x00, /* wcChar18 */ - 'M', 0x00, /* wcChar19 */ - 'O', 0x00, /* wcChar20 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /* Device Qualifier */ - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x10, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - /* End */ - 0x00 -}; -#endif USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; @@ -418,17 +227,10 @@ struct usbd_interface winusb_intf; struct usbd_interface intf1; struct usbd_interface intf2; -void winusbv2_init(uint8_t busid, uintptr_t reg_base) +void winusbv2_cdc_init(uint8_t busid, uintptr_t reg_base) { -#ifdef CONFIG_USBDEV_ADVANCE_DESC - usbd_desc_register(busid, &winusbv2_descriptor); -#else - usbd_desc_register(busid, winusbv2_descriptor); -#endif -#ifndef CONFIG_USBDEV_ADVANCE_DESC - usbd_bos_desc_register(busid, &bos_desc); - usbd_msosv2_desc_register(busid, &msosv2_desc); -#endif + usbd_desc_register(busid, &winusbv2_cdc_descriptor); + /*!< winusb */ usbd_add_interface(busid, &winusb_intf); usbd_add_endpoint(busid, &winusb_out_ep1); diff --git a/components/drivers/usb/cherryusb/demo/winusb2.0_hid_template.c b/components/drivers/usb/cherryusb/demo/winusb2.0_hid_template.c deleted file mode 100644 index d0c1774afa..0000000000 --- a/components/drivers/usb/cherryusb/demo/winusb2.0_hid_template.c +++ /dev/null @@ -1,550 +0,0 @@ -/* - * Copyright (c) 2024, sakumisu - * - * SPDX-License-Identifier: Apache-2.0 - */ -#include "usbd_core.h" -#include "usbd_hid.h" - -#define WINUSB_IN_EP 0x81 -#define WINUSB_OUT_EP 0x02 - -/*!< endpoint address */ -#define HID_INT_EP 0x83 -#define HID_INT_EP_SIZE 4 -#define HID_INT_EP_INTERVAL 10 - -#define USBD_VID 0xFFFE -#define USBD_PID 0xFFFF -#define USBD_MAX_POWER 500 -#define USBD_LANGID_STRING 1033 - -#define USB_CONFIG_SIZE (9 + 9 + 7 + 7 + 9 + 9 + 7) -#define INTF_NUM 2 - -/*!< config descriptor size */ -#define USB_HID_CONFIG_DESC_SIZ 34 -/*!< report descriptor size */ -#define HID_MOUSE_REPORT_DESC_SIZE 74 - -#ifdef CONFIG_USB_HS -#define WINUSB_EP_MPS 512 -#else -#define WINUSB_EP_MPS 64 -#endif - -#define USBD_WINUSB_VENDOR_CODE 0x20 - -#define USBD_WEBUSB_ENABLE 0 -#define USBD_BULK_ENABLE 1 -#define USBD_WINUSB_ENABLE 1 - -/* WinUSB Microsoft OS 2.0 descriptor sizes */ -#define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10 -#define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8 -#define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20 - -#define FUNCTION_SUBSET_LEN 160 -#define DEVICE_INTERFACE_GUIDS_FEATURE_LEN 132 - -#define USBD_WINUSB_DESC_SET_LEN (WINUSB_DESCRIPTOR_SET_HEADER_SIZE + USBD_WEBUSB_ENABLE * FUNCTION_SUBSET_LEN + USBD_BULK_ENABLE * FUNCTION_SUBSET_LEN) - -__ALIGN_BEGIN const uint8_t USBD_WinUSBDescriptorSetDescriptor[] = { - WBVAL(WINUSB_DESCRIPTOR_SET_HEADER_SIZE), /* wLength */ - WBVAL(WINUSB_SET_HEADER_DESCRIPTOR_TYPE), /* wDescriptorType */ - 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/ - WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ -#if (USBD_WEBUSB_ENABLE) - WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), // wLength - WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), // wDescriptorType - 0, // bFirstInterface USBD_WINUSB_IF_NUM - 0, // bReserved - WBVAL(FUNCTION_SUBSET_LEN), // wSubsetLength - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), // wLength - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), // wDescriptorType - 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, // CompatibleId - 0, 0, 0, 0, 0, 0, 0, 0, // SubCompatibleId - WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), // wLength - WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), // wDescriptorType - WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), // wPropertyDataType - WBVAL(42), // wPropertyNameLength - 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, - 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, - 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, - WBVAL(80), // wPropertyDataLength - '{', 0, - '9', 0, '2', 0, 'C', 0, 'E', 0, '6', 0, '4', 0, '6', 0, '2', 0, '-', 0, - '9', 0, 'C', 0, '7', 0, '7', 0, '-', 0, - '4', 0, '6', 0, 'F', 0, 'E', 0, '-', 0, - '9', 0, '3', 0, '3', 0, 'B', 0, '-', - 0, '3', 0, '1', 0, 'C', 0, 'B', 0, '9', 0, 'C', 0, '5', 0, 'A', 0, 'A', 0, '3', 0, 'B', 0, '9', 0, - '}', 0, 0, 0, 0, 0 -#endif -#if USBD_BULK_ENABLE - WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), /* wLength */ - WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), /* wDescriptorType */ - 0, /* bFirstInterface USBD_BULK_IF_NUM*/ - 0, /* bReserved */ - WBVAL(FUNCTION_SUBSET_LEN), /* wSubsetLength */ - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), /* wLength */ - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), /* wDescriptorType */ - 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, /* CompatibleId*/ - 0, 0, 0, 0, 0, 0, 0, 0, /* SubCompatibleId*/ - WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), /* wLength */ - WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), /* wDescriptorType */ - WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), /* wPropertyDataType */ - WBVAL(42), /* wPropertyNameLength */ - 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, - 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, - 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, - WBVAL(80), /* wPropertyDataLength */ - '{', 0, - 'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0, - '2', 0, '9', 0, '3', 0, 'B', 0, '-', 0, - '4', 0, '6', 0, '6', 0, '3', 0, '-', 0, - 'A', 0, 'A', 0, '3', 0, '6', 0, '-', - 0, '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0, '6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0, - '}', 0, 0, 0, 0, 0 -#endif -}; - -#define USBD_NUM_DEV_CAPABILITIES (USBD_WEBUSB_ENABLE + USBD_WINUSB_ENABLE) - -#define USBD_WEBUSB_DESC_LEN 24 -#define USBD_WINUSB_DESC_LEN 28 - -#define USBD_BOS_WTOTALLENGTH (0x05 + \ - USBD_WEBUSB_DESC_LEN * USBD_WEBUSB_ENABLE + \ - USBD_WINUSB_DESC_LEN * USBD_WINUSB_ENABLE) - -__ALIGN_BEGIN const uint8_t USBD_BinaryObjectStoreDescriptor[] = { - 0x05, /* bLength */ - 0x0f, /* bDescriptorType */ - WBVAL(USBD_BOS_WTOTALLENGTH), /* wTotalLength */ - USBD_NUM_DEV_CAPABILITIES, /* bNumDeviceCaps */ -#if (USBD_WEBUSB_ENABLE) - USBD_WEBUSB_DESC_LEN, /* bLength */ - 0x10, /* bDescriptorType */ - USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ - 0x00, /* bReserved */ - 0x38, 0xB6, 0x08, 0x34, /* PlatformCapabilityUUID */ - 0xA9, 0x09, 0xA0, 0x47, - 0x8B, 0xFD, 0xA0, 0x76, - 0x88, 0x15, 0xB6, 0x65, - WBVAL(0x0100), /* 1.00 */ /* bcdVersion */ - USBD_WINUSB_VENDOR_CODE, /* bVendorCode */ - 0, /* iLandingPage */ -#endif -#if (USBD_WINUSB_ENABLE) - USBD_WINUSB_DESC_LEN, /* bLength */ - 0x10, /* bDescriptorType */ - USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ - 0x00, /* bReserved */ - 0xDF, 0x60, 0xDD, 0xD8, /* PlatformCapabilityUUID */ - 0x89, 0x45, 0xC7, 0x4C, - 0x9C, 0xD2, 0x65, 0x9D, - 0x9E, 0x64, 0x8A, 0x9F, - 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/ - WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ - USBD_WINUSB_VENDOR_CODE, /* bVendorCode */ - 0, /* bAltEnumCode */ -#endif -}; - -struct usb_msosv2_descriptor msosv2_desc = { - .vendor_code = USBD_WINUSB_VENDOR_CODE, - .compat_id = USBD_WinUSBDescriptorSetDescriptor, - .compat_id_len = USBD_WINUSB_DESC_SET_LEN, -}; - -struct usb_bos_descriptor bos_desc = { - .string = USBD_BinaryObjectStoreDescriptor, - .string_len = USBD_BOS_WTOTALLENGTH -}; - -#ifdef CONFIG_USBDEV_ADVANCE_DESC -static const uint8_t device_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01) -}; - -static const uint8_t config_descriptor[] = { - /* Configuration 0 */ - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - /* Interface 0 */ - USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), - /* Endpoint OUT 2 */ - USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), - /* Endpoint IN 1 */ - USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x01, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ -}; - -static const uint8_t device_quality_descriptor[] = { - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x10, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -}; - -static const char *string_descriptors[] = { - (const char[]){ 0x09, 0x04 }, /* Langid */ - "CherryUSB", /* Manufacturer */ - "CherryUSB WINUSB DEMO", /* Product */ - "2022123456", /* Serial Number */ -}; - -static const uint8_t *device_descriptor_callback(uint8_t speed) -{ - return device_descriptor; -} - -static const uint8_t *config_descriptor_callback(uint8_t speed) -{ - return config_descriptor; -} - -static const uint8_t *device_quality_descriptor_callback(uint8_t speed) -{ - return device_quality_descriptor; -} - -static const char *string_descriptor_callback(uint8_t speed, uint8_t index) -{ - if (index > 3) { - return NULL; - } - return string_descriptors[index]; -} - -const struct usb_descriptor winusbv2_descriptor = { - .device_descriptor_callback = device_descriptor_callback, - .config_descriptor_callback = config_descriptor_callback, - .device_quality_descriptor_callback = device_quality_descriptor_callback, - .string_descriptor_callback = string_descriptor_callback, - .msosv2_descriptor = &msosv2_desc, - .bos_descriptor = &bos_desc -}; -#else -const uint8_t winusbv2_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), - /* Configuration 0 */ - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - /* Interface 0 */ - USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), - /* Endpoint OUT 2 */ - USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), - /* Endpoint IN 1 */ - USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, USB_ENDPOINT_TYPE_BULK, WINUSB_EP_MPS, 0x00), - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x01, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ - HID_INT_EP, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_INT_EP_SIZE, /* wMaxPacketSize: 4 Byte max */ - 0x00, - HID_INT_EP_INTERVAL, /* bInterval: Polling Interval */ - /* String 0 (LANGID) */ - USB_LANGID_INIT(USBD_LANGID_STRING), - /* String 1 (Manufacturer) */ - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x2C, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'W', 0x00, /* wcChar10 */ - 'I', 0x00, /* wcChar11 */ - 'N', 0x00, /* wcChar12 */ - 'U', 0x00, /* wcChar13 */ - 'S', 0x00, /* wcChar14 */ - 'B', 0x00, /* wcChar15 */ - ' ', 0x00, /* wcChar16 */ - 'D', 0x00, /* wcChar17 */ - 'E', 0x00, /* wcChar18 */ - 'M', 0x00, /* wcChar19 */ - 'O', 0x00, /* wcChar20 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /* Device Qualifier */ - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x10, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, -#endif - /* End */ - 0x00 -}; -#endif - -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; - -volatile bool ep_tx_busy_flag = false; - -static void usbd_event_handler(uint8_t busid, uint8_t event) -{ - switch (event) { - case USBD_EVENT_RESET: - break; - case USBD_EVENT_CONNECTED: - break; - case USBD_EVENT_DISCONNECTED: - break; - case USBD_EVENT_RESUME: - break; - case USBD_EVENT_SUSPEND: - break; - case USBD_EVENT_CONFIGURED: - ep_tx_busy_flag = false; - /* setup first out ep read transfer */ - usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); - break; - case USBD_EVENT_SET_REMOTE_WAKEUP: - break; - case USBD_EVENT_CLR_REMOTE_WAKEUP: - break; - - default: - break; - } -} - -void usbd_winusb_out(uint8_t busid, uint8_t ep, uint32_t nbytes) -{ - USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); - // for (int i = 0; i < 100; i++) { - // printf("%02x ", read_buffer[i]); - // } - // printf("\r\n"); - usbd_ep_start_write(busid, WINUSB_IN_EP, read_buffer, nbytes); - /* setup next out ep read transfer */ - usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); -} - -void usbd_winusb_in(uint8_t busid, uint8_t ep, uint32_t nbytes) -{ - USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); - - if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { - /* send zlp */ - usbd_ep_start_write(busid, WINUSB_IN_EP, NULL, 0); - } else { - ep_tx_busy_flag = false; - } -} - -struct usbd_endpoint winusb_out_ep1 = { - .ep_addr = WINUSB_OUT_EP, - .ep_cb = usbd_winusb_out -}; - -struct usbd_endpoint winusb_in_ep1 = { - .ep_addr = WINUSB_IN_EP, - .ep_cb = usbd_winusb_in -}; - -/*!< hid mouse report descriptor */ -static const uint8_t hid_mouse_report_desc[HID_MOUSE_REPORT_DESC_SIZE] = { - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x09, 0x02, // USAGE (Mouse) - 0xA1, 0x01, // COLLECTION (Application) - 0x09, 0x01, // USAGE (Pointer) - - 0xA1, 0x00, // COLLECTION (Physical) - 0x05, 0x09, // USAGE_PAGE (Button) - 0x19, 0x01, // USAGE_MINIMUM (Button 1) - 0x29, 0x03, // USAGE_MAXIMUM (Button 3) - - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0x01, // LOGICAL_MAXIMUM (1) - 0x95, 0x03, // REPORT_COUNT (3) - 0x75, 0x01, // REPORT_SIZE (1) - - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x95, 0x01, // REPORT_COUNT (1) - 0x75, 0x05, // REPORT_SIZE (5) - 0x81, 0x01, // INPUT (Cnst,Var,Abs) - - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x09, 0x30, // USAGE (X) - 0x09, 0x31, // USAGE (Y) - 0x09, 0x38, - - 0x15, 0x81, // LOGICAL_MINIMUM (-127) - 0x25, 0x7F, // LOGICAL_MAXIMUM (127) - 0x75, 0x08, // REPORT_SIZE (8) - 0x95, 0x03, // REPORT_COUNT (2) - - 0x81, 0x06, // INPUT (Data,Var,Rel) - 0xC0, 0x09, - 0x3c, 0x05, - 0xff, 0x09, - - 0x01, 0x15, - 0x00, 0x25, - 0x01, 0x75, - 0x01, 0x95, - - 0x02, 0xb1, - 0x22, 0x75, - 0x06, 0x95, - 0x01, 0xb1, - - 0x01, 0xc0 // END_COLLECTION -}; - -/*!< mouse report struct */ -struct hid_mouse { - uint8_t buttons; - int8_t x; - int8_t y; - int8_t wheel; -}; - -/*!< mouse report */ -static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX struct hid_mouse mouse_cfg; - -#define HID_STATE_IDLE 0 -#define HID_STATE_BUSY 1 - -/*!< hid state ! Data can be sent only when state is idle */ -static volatile uint8_t hid_state = HID_STATE_IDLE; - -/* function ------------------------------------------------------------------*/ -static void usbd_hid_int_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) -{ - hid_state = HID_STATE_IDLE; -} - -/*!< endpoint call back */ -static struct usbd_endpoint hid_in_ep = { - .ep_cb = usbd_hid_int_callback, - .ep_addr = HID_INT_EP -}; - -struct usbd_interface winusb_intf; -struct usbd_interface intf1; - -void winusbv2_init(uint8_t busid, uintptr_t reg_base) -{ -#ifdef CONFIG_USBDEV_ADVANCE_DESC - usbd_desc_register(busid, &winusbv2_descriptor); -#else - usbd_desc_register(busid, winusbv2_descriptor); -#endif -#ifndef CONFIG_USBDEV_ADVANCE_DESC - usbd_bos_desc_register(busid, &bos_desc); - usbd_msosv2_desc_register(busid, &msosv2_desc); -#endif - /*!< winusb */ - usbd_add_interface(busid, &winusb_intf); - usbd_add_endpoint(busid, &winusb_out_ep1); - usbd_add_endpoint(busid, &winusb_in_ep1); - - usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf1, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); - usbd_add_endpoint(busid, &hid_in_ep); - - usbd_initialize(busid, reg_base, usbd_event_handler); -} \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/demo/winusb2.0_template.c b/components/drivers/usb/cherryusb/demo/winusb2.0_template.c new file mode 100644 index 0000000000..0530d0d1ec --- /dev/null +++ b/components/drivers/usb/cherryusb/demo/winusb2.0_template.c @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2024, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" + +#define WINUSB_VENDOR_CODE 0x17 + +#define WINUSB_NUM 1 + +// note that if device is composite device, you should use USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT +const uint8_t WINUSB_WCIDDescriptor[] = { +#if WINUSB_NUM == 1 + USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_LEN), + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_SINGLE_DESCRIPTOR_INIT(), +#else + USB_MSOSV2_COMP_ID_SET_HEADER_DESCRIPTOR_INIT(10 + WINUSB_NUM * USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_LEN), + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(0x00), + USB_MSOSV2_COMP_ID_FUNCTION_WINUSB_MULTI_DESCRIPTOR_INIT(0x01), +#endif +}; + +const uint8_t USBD_BinaryObjectStoreDescriptor[] = { + USB_BOS_HEADER_DESCRIPTOR_INIT(5 + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_LEN, 1), + USB_BOS_CAP_PLATFORM_WINUSB_DESCRIPTOR_INIT(WINUSB_VENDOR_CODE, sizeof(WINUSB_WCIDDescriptor)), +}; + +const struct usb_msosv2_descriptor msosv2_desc = { + .vendor_code = WINUSB_VENDOR_CODE, + .compat_id = WINUSB_WCIDDescriptor, + .compat_id_len = sizeof(WINUSB_WCIDDescriptor), +}; + +const struct usb_bos_descriptor bos_desc = { + .string = USBD_BinaryObjectStoreDescriptor, + .string_len = sizeof(USBD_BinaryObjectStoreDescriptor), +}; + +#define WINUSB_IN_EP 0x81 +#define WINUSB_OUT_EP 0x02 + +#define USBD_VID 0xFFFE +#define USBD_PID 0xffff +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 1033 + +#if WINUSB_NUM == 1 +#define USB_CONFIG_SIZE (9 + 9 + 7 + 7) +#define INTF_NUM 1 +#else +#define WINUSB_IN_EP2 0x83 +#define WINUSB_OUT_EP2 0x04 + +#define USB_CONFIG_SIZE (9 + 9 + 7 + 7 + 9 + 7 + 7) +#define INTF_NUM 2 +#endif + +#ifdef CONFIG_USB_HS +#define WINUSB_EP_MPS 512 +#else +#define WINUSB_EP_MPS 64 +#endif + +static const uint8_t device_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0001, 0x01) +}; + +static const uint8_t config_descriptor[] = { + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x04), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP, 0x02, WINUSB_EP_MPS, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP, 0x02, WINUSB_EP_MPS, 0x00), +#if WINUSB_NUM == 2 + USB_INTERFACE_DESCRIPTOR_INIT(0x01, 0x00, 0x02, 0xff, 0xff, 0x00, 0x05), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_IN_EP2, 0x02, WINUSB_EP_MPS, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(WINUSB_OUT_EP2, 0x02, WINUSB_EP_MPS, 0x00), +#endif +}; + +static const uint8_t device_quality_descriptor[] = { + /////////////////////////////////////// + /// device qualifier descriptor + /////////////////////////////////////// + 0x0a, + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x00, +}; + +static const char *string_descriptors[] = { + (const char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB WINUSB DEMO", /* Product */ + "2022123456", /* Serial Number */ + "CherryUSB WINUSB DEMO 1", /* STRING4 */ + "CherryUSB WINUSB DEMO 2", /* STRING5 */ +}; + +static const uint8_t *device_descriptor_callback(uint8_t speed) +{ + return device_descriptor; +} + +static const uint8_t *config_descriptor_callback(uint8_t speed) +{ + return config_descriptor; +} + +static const uint8_t *device_quality_descriptor_callback(uint8_t speed) +{ + return device_quality_descriptor; +} + +static const char *string_descriptor_callback(uint8_t speed, uint8_t index) +{ + if (index > 5) { + return NULL; + } + return string_descriptors[index]; +} + +const struct usb_descriptor winusbv2_descriptor = { + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .msosv2_descriptor = &msosv2_desc, + .bos_descriptor = &bos_desc, +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; + +volatile bool ep_tx_busy_flag = false; + +static void usbd_event_handler(uint8_t busid, uint8_t event) +{ + switch (event) { + case USBD_EVENT_RESET: + break; + case USBD_EVENT_CONNECTED: + break; + case USBD_EVENT_DISCONNECTED: + break; + case USBD_EVENT_RESUME: + break; + case USBD_EVENT_SUSPEND: + break; + case USBD_EVENT_CONFIGURED: + ep_tx_busy_flag = false; + /* setup first out ep read transfer */ + usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); +#if WINUSB_NUM == 2 + usbd_ep_start_read(busid, WINUSB_OUT_EP2, read_buffer, 2048); +#endif + break; + case USBD_EVENT_SET_REMOTE_WAKEUP: + break; + case USBD_EVENT_CLR_REMOTE_WAKEUP: + break; + + default: + break; + } +} + +void usbd_winusb_out(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + usbd_ep_start_write(busid, WINUSB_IN_EP, read_buffer, nbytes); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); +} + +void usbd_winusb_in(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % WINUSB_EP_MPS) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, WINUSB_IN_EP, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +struct usbd_endpoint winusb_out_ep1 = { + .ep_addr = WINUSB_OUT_EP, + .ep_cb = usbd_winusb_out +}; + +struct usbd_endpoint winusb_in_ep1 = { + .ep_addr = WINUSB_IN_EP, + .ep_cb = usbd_winusb_in +}; + +struct usbd_interface intf0; + +#if WINUSB_NUM == 2 + +void usbd_winusb_out2(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", (unsigned int)nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + usbd_ep_start_write(busid, WINUSB_IN_EP2, read_buffer, nbytes); + /* setup next out ep read transfer */ + usbd_ep_start_read(busid, WINUSB_OUT_EP2, read_buffer, 2048); +} + +void usbd_winusb_in2(uint8_t busid, uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", (unsigned int)nbytes); + + if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(busid, WINUSB_IN_EP2, NULL, 0); + } else { + ep_tx_busy_flag = false; + } +} + +struct usbd_endpoint winusb_out_ep2 = { + .ep_addr = WINUSB_OUT_EP2, + .ep_cb = usbd_winusb_out2 +}; + +struct usbd_endpoint winusb_in_ep2 = { + .ep_addr = WINUSB_IN_EP2, + .ep_cb = usbd_winusb_in2 +}; + +struct usbd_interface intf1; + +#endif + +void winusbv2_init(uint8_t busid, uintptr_t reg_base) +{ + usbd_desc_register(busid, &winusbv2_descriptor); + + usbd_add_interface(busid, &intf0); + usbd_add_endpoint(busid, &winusb_out_ep1); + usbd_add_endpoint(busid, &winusb_in_ep1); +#if WINUSB_NUM == 2 + usbd_add_interface(busid, &intf1); + usbd_add_endpoint(busid, &winusb_out_ep2); + usbd_add_endpoint(busid, &winusb_in_ep2); +#endif + usbd_initialize(busid, reg_base, usbd_event_handler); +} \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/idf_component.yml b/components/drivers/usb/cherryusb/idf_component.yml index 9cfebea729..bcae2d659f 100644 --- a/components/drivers/usb/cherryusb/idf_component.yml +++ b/components/drivers/usb/cherryusb/idf_component.yml @@ -1,4 +1,4 @@ -version: "1.5.2" +version: "1.6.0" description: CherryUSB is a tiny and portable USB Stack (device & host) for embedded system with USB IP tags: - usb diff --git a/components/drivers/usb/cherryusb/platform/daplink/dap_main.c b/components/drivers/usb/cherryusb/platform/daplink/dap_main.c index f977cffd3d..27e0355b16 100644 --- a/components/drivers/usb/cherryusb/platform/daplink/dap_main.c +++ b/components/drivers/usb/cherryusb/platform/daplink/dap_main.c @@ -5,175 +5,313 @@ * SPDX-License-Identifier: Apache-2.0 */ #include "dap_main.h" -#include "DAP_config.h" -#include "DAP.h" -#define USB_CONFIG_SIZE (9 + CMSIS_DAP_INTERFACE_SIZE + CDC_ACM_DESCRIPTOR_LEN + CONFIG_MSC_DESCRIPTOR_LEN) -#define INTF_NUM (2 + 1 + CONFIG_MSC_INTF_NUM) +#define CMSIS_DAP_INTERFACE_SIZE (9 + 7 + 7) +#define CUSTOM_HID_LEN (9 + 9 + 7 + 7) + +#define HIDRAW_INTERVAL 4 + +#define HID_CUSTOM_REPORT_DESC_SIZE 53 + +#define USBD_WINUSB_VENDOR_CODE 0x20 +#define USBD_WEBUSB_VENDOR_CODE 0x21 + +#define USBD_WEBUSB_ENABLE 1 +#define USBD_BULK_ENABLE 1 +#define USBD_WINUSB_ENABLE 1 + +/* WinUSB Microsoft OS 2.0 descriptor sizes */ +#define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10 +#define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8 +#define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20 + +#define FUNCTION_SUBSET_LEN 160 +#define DEVICE_INTERFACE_GUIDS_FEATURE_LEN 132 + +#define USBD_WINUSB_DESC_SET_LEN (WINUSB_DESCRIPTOR_SET_HEADER_SIZE + USBD_WEBUSB_ENABLE * FUNCTION_SUBSET_LEN + USBD_BULK_ENABLE * FUNCTION_SUBSET_LEN) + +#define USBD_NUM_DEV_CAPABILITIES (USBD_WEBUSB_ENABLE + USBD_WINUSB_ENABLE) + +#define USBD_WEBUSB_DESC_LEN 24 +#define USBD_WINUSB_DESC_LEN 28 + +#define USBD_BOS_WTOTALLENGTH (0x05 + \ + USBD_WEBUSB_DESC_LEN * USBD_WEBUSB_ENABLE + \ + USBD_WINUSB_DESC_LEN * USBD_WINUSB_ENABLE) + +#define USB_CONFIG_SIZE (9 + CMSIS_DAP_INTERFACE_SIZE + CDC_ACM_DESCRIPTOR_LEN + \ + CONFIG_CHERRYDAP_USE_CUSTOM_HID * CUSTOM_HID_LEN + \ + CONFIG_CHERRYDAP_USE_MSC * MSC_DESCRIPTOR_LEN + USBD_WEBUSB_ENABLE * 9) + +#define INTF_NUM (1 + 2 + CONFIG_CHERRYDAP_USE_CUSTOM_HID + CONFIG_CHERRYDAP_USE_MSC + USBD_WEBUSB_ENABLE) + +#define MSC_INTF_NUM (3 + CONFIG_CHERRYDAP_USE_CUSTOM_HID) + +#define WEBUSB_INTF_NUM (3 + CONFIG_CHERRYDAP_USE_CUSTOM_HID + CONFIG_CHERRYDAP_USE_MSC) + +#define WEBUSB_URL_STRINGS \ + 'c', 'h', 'e', 'r', 'r', 'y', 'd', 'a', 'p', '.', 'c', 'h', 'e', 'r', 'r', 'y', '-', 'e', 'm', 'b', 'e', 'd', 'd', 'e', 'd', '.', 'o', 'r', 'g', __ALIGN_BEGIN const uint8_t USBD_WinUSBDescriptorSetDescriptor[] = { - WBVAL(WINUSB_DESCRIPTOR_SET_HEADER_SIZE), /* wLength */ - WBVAL(WINUSB_SET_HEADER_DESCRIPTOR_TYPE), /* wDescriptorType */ - 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/ - WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ + WBVAL(WINUSB_DESCRIPTOR_SET_HEADER_SIZE), /* wLength */ + WBVAL(WINUSB_SET_HEADER_DESCRIPTOR_TYPE), /* wDescriptorType */ + 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/ + WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ #if (USBD_WEBUSB_ENABLE) - WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), // wLength - WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), // wDescriptorType - 0, // bFirstInterface USBD_WINUSB_IF_NUM - 0, // bReserved - WBVAL(FUNCTION_SUBSET_LEN), // wSubsetLength - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), // wLength - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), // wDescriptorType - 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, // CompatibleId - 0, 0, 0, 0, 0, 0, 0, 0, // SubCompatibleId - WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), // wLength - WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), // wDescriptorType - WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), // wPropertyDataType - WBVAL(42), // wPropertyNameLength - 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, - 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, - 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, - WBVAL(80), // wPropertyDataLength - '{', 0, - '9', 0, '2', 0, 'C', 0, 'E', 0, '6', 0, '4', 0, '6', 0, '2', 0, '-', 0, - '9', 0, 'C', 0, '7', 0, '7', 0, '-', 0, - '4', 0, '6', 0, 'F', 0, 'E', 0, '-', 0, - '9', 0, '3', 0, '3', 0, 'B', 0, '-', - 0, '3', 0, '1', 0, 'C', 0, 'B', 0, '9', 0, 'C', 0, '5', 0, 'A', 0, 'A', 0, '3', 0, 'B', 0, '9', 0, - '}', 0, 0, 0, 0, 0 + WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), // wLength + WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), // wDescriptorType + WEBUSB_INTF_NUM, // bFirstInterface USBD_WINUSB_IF_NUM + 0, // bReserved + WBVAL(FUNCTION_SUBSET_LEN), // wSubsetLength + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), // wLength + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), // wDescriptorType + 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, // CompatibleId + 0, 0, 0, 0, 0, 0, 0, 0, // SubCompatibleId + WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), // wLength + WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), // wDescriptorType + WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), // wPropertyDataType + WBVAL(42), // wPropertyNameLength + 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, + 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, + 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, + WBVAL(80), // wPropertyDataLength + '{', 0, + '9', 0, '2', 0, 'C', 0, 'E', 0, '6', 0, '4', 0, '6', 0, '2', 0, '-', 0, + '9', 0, 'C', 0, '7', 0, '7', 0, '-', 0, + '4', 0, '6', 0, 'F', 0, 'E', 0, '-', 0, + '9', 0, '3', 0, '3', 0, 'B', 0, '-', + 0, '3', 0, '1', 0, 'C', 0, 'B', 0, '9', 0, 'C', 0, '5', 0, 'A', 0, 'A', 0, '3', 0, 'B', 0, '9', 0, + '}', 0, 0, 0, 0, 0, #endif #if USBD_BULK_ENABLE - WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), /* wLength */ - WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), /* wDescriptorType */ - 0, /* bFirstInterface USBD_BULK_IF_NUM*/ - 0, /* bReserved */ - WBVAL(FUNCTION_SUBSET_LEN), /* wSubsetLength */ - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), /* wLength */ - WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), /* wDescriptorType */ - 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, /* CompatibleId*/ - 0, 0, 0, 0, 0, 0, 0, 0, /* SubCompatibleId*/ - WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), /* wLength */ - WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), /* wDescriptorType */ - WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), /* wPropertyDataType */ - WBVAL(42), /* wPropertyNameLength */ - 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, - 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, - 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, - WBVAL(80), /* wPropertyDataLength */ - '{', 0, - 'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0, - '2', 0, '9', 0, '3', 0, 'B', 0, '-', 0, - '4', 0, '6', 0, '6', 0, '3', 0, '-', 0, - 'A', 0, 'A', 0, '3', 0, '6', 0, '-', - 0, '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0, '6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0, - '}', 0, 0, 0, 0, 0 + WBVAL(WINUSB_FUNCTION_SUBSET_HEADER_SIZE), /* wLength */ + WBVAL(WINUSB_SUBSET_HEADER_FUNCTION_TYPE), /* wDescriptorType */ + 0, /* bFirstInterface USBD_BULK_IF_NUM*/ + 0, /* bReserved */ + WBVAL(FUNCTION_SUBSET_LEN), /* wSubsetLength */ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_SIZE), /* wLength */ + WBVAL(WINUSB_FEATURE_COMPATIBLE_ID_TYPE), /* wDescriptorType */ + 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, /* CompatibleId*/ + 0, 0, 0, 0, 0, 0, 0, 0, /* SubCompatibleId*/ + WBVAL(DEVICE_INTERFACE_GUIDS_FEATURE_LEN), /* wLength */ + WBVAL(WINUSB_FEATURE_REG_PROPERTY_TYPE), /* wDescriptorType */ + WBVAL(WINUSB_PROP_DATA_TYPE_REG_MULTI_SZ), /* wPropertyDataType */ + WBVAL(42), /* wPropertyNameLength */ + 'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0, + 'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0, + 'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, + WBVAL(80), /* wPropertyDataLength */ + '{', 0, + 'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0, + '2', 0, '9', 0, '3', 0, 'B', 0, '-', 0, + '4', 0, '6', 0, '6', 0, '3', 0, '-', 0, + 'A', 0, 'A', 0, '3', 0, '6', 0, '-', + 0, '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0, '6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0, + '}', 0, 0, 0, 0, 0 #endif }; __ALIGN_BEGIN const uint8_t USBD_BinaryObjectStoreDescriptor[] = { - 0x05, /* bLength */ - 0x0f, /* bDescriptorType */ - WBVAL(USBD_BOS_WTOTALLENGTH), /* wTotalLength */ - USBD_NUM_DEV_CAPABILITIES, /* bNumDeviceCaps */ + 0x05, /* bLength */ + 0x0f, /* bDescriptorType */ + WBVAL(USBD_BOS_WTOTALLENGTH), /* wTotalLength */ + USBD_NUM_DEV_CAPABILITIES, /* bNumDeviceCaps */ #if (USBD_WEBUSB_ENABLE) - USBD_WEBUSB_DESC_LEN, /* bLength */ - 0x10, /* bDescriptorType */ - USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ - 0x00, /* bReserved */ - 0x38, 0xB6, 0x08, 0x34, /* PlatformCapabilityUUID */ - 0xA9, 0x09, 0xA0, 0x47, - 0x8B, 0xFD, 0xA0, 0x76, - 0x88, 0x15, 0xB6, 0x65, - WBVAL(0x0100), /* 1.00 */ /* bcdVersion */ - USBD_WINUSB_VENDOR_CODE, /* bVendorCode */ - 0, /* iLandingPage */ + USBD_WEBUSB_DESC_LEN, /* bLength */ + 0x10, /* bDescriptorType */ + USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ + 0x00, /* bReserved */ + 0x38, 0xB6, 0x08, 0x34, /* PlatformCapabilityUUID */ + 0xA9, 0x09, 0xA0, 0x47, + 0x8B, 0xFD, 0xA0, 0x76, + 0x88, 0x15, 0xB6, 0x65, + WBVAL(0x0100), /* 1.00 */ /* bcdVersion */ + USBD_WEBUSB_VENDOR_CODE, /* bVendorCode */ + 1, /* iLandingPage */ #endif #if (USBD_WINUSB_ENABLE) - USBD_WINUSB_DESC_LEN, /* bLength */ - 0x10, /* bDescriptorType */ - USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ - 0x00, /* bReserved */ - 0xDF, 0x60, 0xDD, 0xD8, /* PlatformCapabilityUUID */ - 0x89, 0x45, 0xC7, 0x4C, - 0x9C, 0xD2, 0x65, 0x9D, - 0x9E, 0x64, 0x8A, 0x9F, - 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/ - WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ - USBD_WINUSB_VENDOR_CODE, /* bVendorCode */ - 0, /* bAltEnumCode */ + USBD_WINUSB_DESC_LEN, /* bLength */ + 0x10, /* bDescriptorType */ + USB_DEVICE_CAPABILITY_PLATFORM, /* bDevCapabilityType */ + 0x00, /* bReserved */ + 0xDF, 0x60, 0xDD, 0xD8, /* PlatformCapabilityUUID */ + 0x89, 0x45, 0xC7, 0x4C, + 0x9C, 0xD2, 0x65, 0x9D, + 0x9E, 0x64, 0x8A, 0x9F, + 0x00, 0x00, 0x03, 0x06, /* >= Win 8.1 */ /* dwWindowsVersion*/ + WBVAL(USBD_WINUSB_DESC_SET_LEN), /* wDescriptorSetTotalLength */ + USBD_WINUSB_VENDOR_CODE, /* bVendorCode */ + 0, /* bAltEnumCode */ #endif }; +#define URL_DESCRIPTOR_LENGTH (3 + 29) + +const uint8_t USBD_WebUSBURLDescriptor[URL_DESCRIPTOR_LENGTH] = { + URL_DESCRIPTOR_LENGTH, + WEBUSB_URL_TYPE, + WEBUSB_URL_SCHEME_HTTPS, + WEBUSB_URL_STRINGS +}; + +// clang-format off +#define HID_DESC() \ + /************** Descriptor of Custom interface *****************/ \ + 0x09, /* bLength: Interface Descriptor size */ \ + USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ \ + 0X03, /* bInterfaceNumber: Number of Interface */ \ + 0x00, /* bAlternateSetting: Alternate setting */ \ + 0x02, /* bNumEndpoints */ \ + 0x03, /* bInterfaceClass: HID */ \ + 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ \ + 0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ \ + 0, /* iInterface: Index of string descriptor */ /******************** Descriptor of Custom HID ********************/ \ + 0x09, /* bLength: HID Descriptor size */ \ + HID_DESCRIPTOR_TYPE_HID, /* bDescriptorType: HID */ \ + 0x11, /* bcdHID: HID Class Spec release number */ \ + 0x01, \ + 0x00, /* bCountryCode: Hardware target country */ \ + 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ \ + 0x22, /* bDescriptorType */ \ + HID_CUSTOM_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ \ + 0x00, /******************** Descriptor of Custom in endpoint ********************/ \ + 0x07, /* bLength: Endpoint Descriptor size */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ \ + HID_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */ \ + 0x03, /* bmAttributes: Interrupt endpoint */ \ + WBVAL(HID_PACKET_SIZE), /* wMaxPacketSize: 4 Byte max */ \ + HIDRAW_INTERVAL, /* bInterval: Polling Interval */ /******************** Descriptor of Custom out endpoint ********************/ \ + 0x07, /* bLength: Endpoint Descriptor size */ \ + USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType: */ \ + HID_OUT_EP, /* bEndpointAddress: Endpoint Address (IN) */ \ + 0x03, /* bmAttributes: Interrupt endpoint */ \ + WBVAL(HID_PACKET_SIZE), /* wMaxPacketSize: 4 Byte max */ \ + HIDRAW_INTERVAL /* bInterval: Polling Interval */ +// clang-format on + static const uint8_t device_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), + USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01), }; static const uint8_t config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - /* Interface 0 */ - USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), - /* Endpoint OUT 2 */ - USB_ENDPOINT_DESCRIPTOR_INIT(DAP_OUT_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), - /* Endpoint IN 1 */ - USB_ENDPOINT_DESCRIPTOR_INIT(DAP_IN_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), - CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, DAP_PACKET_SIZE, 0x00), -#ifdef CONFIG_CHERRYDAP_USE_MSC - MSC_DESCRIPTOR_INIT(MSC_INTF_NUM, MSC_OUT_EP, MSC_IN_EP, DAP_PACKET_SIZE, 0x00), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + /* Interface 0 */ + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), + /* Endpoint OUT 2 */ + USB_ENDPOINT_DESCRIPTOR_INIT(DAP_OUT_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), + /* Endpoint IN 1 */ + USB_ENDPOINT_DESCRIPTOR_INIT(DAP_IN_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), + CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, DAP_PACKET_SIZE, 0x00), +#if CONFIG_CHERRYDAP_USE_CUSTOM_HID + HID_DESC(), +#endif +#if CONFIG_CHERRYDAP_USE_MSC + MSC_DESCRIPTOR_INIT(MSC_INTF_NUM, MSC_OUT_EP, MSC_IN_EP, DAP_PACKET_SIZE, 0x00), +#endif +#if USBD_WEBUSB_ENABLE + USB_INTERFACE_DESCRIPTOR_INIT(WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x04), #endif }; static const uint8_t other_speed_config_descriptor[] = { - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - /* Interface 0 */ - USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), - /* Endpoint OUT 2 */ - USB_ENDPOINT_DESCRIPTOR_INIT(DAP_OUT_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), - /* Endpoint IN 1 */ - USB_ENDPOINT_DESCRIPTOR_INIT(DAP_IN_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), - CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, DAP_PACKET_SIZE, 0x00), -#ifdef CONFIG_CHERRYDAP_USE_MSC - MSC_DESCRIPTOR_INIT(MSC_INTF_NUM, MSC_OUT_EP, MSC_IN_EP, DAP_PACKET_SIZE, 0x00), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, INTF_NUM, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), + /* Interface 0 */ + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02), + /* Endpoint OUT 2 */ + USB_ENDPOINT_DESCRIPTOR_INIT(DAP_OUT_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), + /* Endpoint IN 1 */ + USB_ENDPOINT_DESCRIPTOR_INIT(DAP_IN_EP, USB_ENDPOINT_TYPE_BULK, DAP_PACKET_SIZE, 0x00), + CDC_ACM_DESCRIPTOR_INIT(0x01, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, DAP_PACKET_SIZE, 0x00), +#if CONFIG_CHERRYDAP_USE_CUSTOM_HID + HID_DESC(), +#endif +#if CONFIG_CHERRYDAP_USE_MSC + MSC_DESCRIPTOR_INIT(0x04, MSC_OUT_EP, MSC_IN_EP, DAP_PACKET_SIZE, 0x00), +#endif +#if USBD_WEBUSB_ENABLE + USB_INTERFACE_DESCRIPTOR_INIT(WEBUSB_INTF_NUM, 0x00, 0x00, 0xff, 0x00, 0x00, 0x04), #endif }; +/*!< custom hid report descriptor */ +const uint8_t hid_custom_report_desc[HID_CUSTOM_REPORT_DESC_SIZE] = { + /* USER CODE BEGIN 0 */ + 0x06, 0x00, 0xff, /* USAGE_PAGE (Vendor Defined Page 1) */ + 0x09, 0x01, /* USAGE (Vendor Usage 1) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + 0x85, 0x02, /* REPORT ID (0x02) */ + 0x09, 0x02, /* USAGE (Vendor Usage 1) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /*LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0xff, 0x03, /* REPORT_COUNT (1023) */ + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ + /* <___________________________________________________> */ + 0x85, 0x01, /* REPORT ID (0x01) */ + 0x09, 0x03, /* USAGE (Vendor Usage 1) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0xff, 0x03, /* REPORT_COUNT (1023) */ + 0x91, 0x02, /* OUTPUT (Data,Var,Abs) */ + + /* <___________________________________________________> */ + 0x85, 0x03, /* REPORT ID (0x03) */ + 0x09, 0x04, /* USAGE (Vendor Usage 1) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0xff, 0x03, /* REPORT_COUNT (1023) */ + 0xb1, 0x02, /* FEATURE (Data,Var,Abs) */ + /* USER CODE END 0 */ + 0xC0 /* END_COLLECTION */ +}; + +char serial_number_dynamic[36] = "00000000000000000123456789ABCDEF"; // Dynamic serial number + char *string_descriptors[] = { - (char[]) {0x09, 0x04}, /* Langid */ - "CherryUSB", /* Manufacturer */ - "CherryUSB CMSIS-DAP", /* Product */ - "00000000000000000123456789ABCDEF", /* Serial Number */ + (char[]){ 0x09, 0x04 }, /* Langid */ + "CherryUSB", /* Manufacturer */ + "CherryUSB CMSIS-DAP", /* Product */ + "00000000000000000123456789ABCDEF", /* Serial Number */ + "CherryUSB WebUSB", }; static const uint8_t device_quality_descriptor[] = { - USB_DEVICE_QUALIFIER_DESCRIPTOR_INIT(USB_2_1, 0x00, 0x00, 0x00, 0x01), + USB_DEVICE_QUALIFIER_DESCRIPTOR_INIT(USB_2_1, 0x00, 0x00, 0x00, 0x01), }; __WEAK const uint8_t *device_descriptor_callback(uint8_t speed) { - (void) speed; + (void)speed; return device_descriptor; } __WEAK const uint8_t *config_descriptor_callback(uint8_t speed) { - (void) speed; + (void)speed; return config_descriptor; } __WEAK const uint8_t *device_quality_descriptor_callback(uint8_t speed) { - (void) speed; + (void)speed; return device_quality_descriptor; } __WEAK const uint8_t *other_speed_config_descriptor_callback(uint8_t speed) { - (void) speed; + (void)speed; return other_speed_config_descriptor; } __WEAK const char *string_descriptor_callback(uint8_t speed, uint8_t index) { - (void) speed; + (void)speed; + + if (index == 3) { + return serial_number_dynamic; + } if (index >= (sizeof(string_descriptors) / sizeof(char *))) { return NULL; @@ -214,7 +352,7 @@ USB_NOCACHE_RAM_SECTION chry_ringbuffer_t g_usbrx; void usbd_event_handler(uint8_t busid, uint8_t event) { - (void) busid; + (void)busid; switch (event) { case USBD_EVENT_RESET: usbrx_idle_flag = 0; @@ -250,7 +388,7 @@ void usbd_event_handler(uint8_t busid, uint8_t event) void dap_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) { - (void) busid; + (void)busid; if (USB_Request[USB_RequestIndexI][0] == ID_DAP_TransferAbort) { DAP_TransferAbort = 1U; } else { @@ -262,7 +400,7 @@ void dap_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) } // Start reception of next request packet - if ((uint16_t) (USB_RequestCountI - USB_RequestCountO) != DAP_PACKET_COUNT) { + if ((uint16_t)(USB_RequestCountI - USB_RequestCountO) != DAP_PACKET_COUNT) { usbd_ep_start_read(0, DAP_OUT_EP, USB_Request[USB_RequestIndexI], DAP_PACKET_SIZE); } else { USB_RequestIdle = 1U; @@ -271,7 +409,7 @@ void dap_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) void dap_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) { - (void) busid; + (void)busid; if (USB_ResponseCountI != USB_ResponseCountO) { // Load data from response buffer to be sent back usbd_ep_start_write(0, DAP_IN_EP, USB_Response[USB_ResponseIndexO], USB_RespSize[USB_ResponseIndexO]); @@ -287,7 +425,7 @@ void dap_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) { - (void) busid; + (void)busid; chry_ringbuffer_write(&g_usbrx, usb_tmpbuffer, nbytes); if (chry_ringbuffer_get_free(&g_usbrx) >= DAP_PACKET_SIZE) { usbd_ep_start_read(0, CDC_OUT_EP, usb_tmpbuffer, DAP_PACKET_SIZE); @@ -298,7 +436,7 @@ void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) { - (void) busid; + (void)busid; uint32_t size; uint8_t *buffer; @@ -317,52 +455,110 @@ void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) } struct usbd_endpoint dap_out_ep = { - .ep_addr = DAP_OUT_EP, - .ep_cb = dap_out_callback + .ep_addr = DAP_OUT_EP, + .ep_cb = dap_out_callback }; struct usbd_endpoint dap_in_ep = { - .ep_addr = DAP_IN_EP, - .ep_cb = dap_in_callback + .ep_addr = DAP_IN_EP, + .ep_cb = dap_in_callback }; struct usbd_endpoint cdc_out_ep = { - .ep_addr = CDC_OUT_EP, - .ep_cb = usbd_cdc_acm_bulk_out + .ep_addr = CDC_OUT_EP, + .ep_cb = usbd_cdc_acm_bulk_out }; struct usbd_endpoint cdc_in_ep = { - .ep_addr = CDC_IN_EP, - .ep_cb = usbd_cdc_acm_bulk_in + .ep_addr = CDC_IN_EP, + .ep_cb = usbd_cdc_acm_bulk_in +}; + +#if CONFIG_CHERRYDAP_USE_CUSTOM_HID +struct usbd_endpoint hid_custom_in_ep = { + .ep_addr = HID_IN_EP, + .ep_cb = usbd_hid_custom_in_callback, +}; + +struct usbd_endpoint hid_custom_out_ep = { + .ep_addr = HID_OUT_EP, + .ep_cb = usbd_hid_custom_out_callback, }; +#endif struct usbd_interface dap_intf; struct usbd_interface intf1; struct usbd_interface intf2; -struct usbd_interface intf3; +#if CONFIG_CHERRYDAP_USE_CUSTOM_HID struct usbd_interface hid_intf; +#endif + +#if CONFIG_CHERRYDAP_USE_MSC +struct usbd_interface intf3; +#endif struct usb_msosv2_descriptor msosv2_desc = { - .vendor_code = USBD_WINUSB_VENDOR_CODE, - .compat_id = USBD_WinUSBDescriptorSetDescriptor, - .compat_id_len = USBD_WINUSB_DESC_SET_LEN, + .vendor_code = USBD_WINUSB_VENDOR_CODE, + .compat_id = USBD_WinUSBDescriptorSetDescriptor, + .compat_id_len = USBD_WINUSB_DESC_SET_LEN, }; struct usb_bos_descriptor bos_desc = { - .string = USBD_BinaryObjectStoreDescriptor, - .string_len = USBD_BOS_WTOTALLENGTH + .string = USBD_BinaryObjectStoreDescriptor, + .string_len = USBD_BOS_WTOTALLENGTH +}; + +struct usb_webusb_descriptor webusb_url_desc = { + .vendor_code = USBD_WEBUSB_VENDOR_CODE, + .string = USBD_WebUSBURLDescriptor, + .string_len = URL_DESCRIPTOR_LENGTH }; const struct usb_descriptor cmsisdap_descriptor = { - .device_descriptor_callback = device_descriptor_callback, - .config_descriptor_callback = config_descriptor_callback, - .device_quality_descriptor_callback = device_quality_descriptor_callback, - .other_speed_descriptor_callback = other_speed_config_descriptor_callback, - .string_descriptor_callback = string_descriptor_callback, - .bos_descriptor = &bos_desc, - .msosv2_descriptor = &msosv2_desc, + .device_descriptor_callback = device_descriptor_callback, + .config_descriptor_callback = config_descriptor_callback, + .device_quality_descriptor_callback = device_quality_descriptor_callback, + .other_speed_descriptor_callback = other_speed_config_descriptor_callback, + .string_descriptor_callback = string_descriptor_callback, + .bos_descriptor = &bos_desc, + .msosv2_descriptor = &msosv2_desc, + .webusb_url_descriptor = &webusb_url_desc }; +void chry_dap_init(uint8_t busid, uint32_t reg_base) +{ + chry_ringbuffer_init(&g_uartrx, uartrx_ringbuffer, CONFIG_UARTRX_RINGBUF_SIZE); + chry_ringbuffer_init(&g_usbrx, usbrx_ringbuffer, CONFIG_USBRX_RINGBUF_SIZE); + + DAP_Setup(); + + usbd_desc_register(0, &cmsisdap_descriptor); + + /*!< winusb */ + usbd_add_interface(0, &dap_intf); + usbd_add_endpoint(0, &dap_out_ep); + usbd_add_endpoint(0, &dap_in_ep); + + /*!< cdc acm */ + usbd_add_interface(0, usbd_cdc_acm_init_intf(0, &intf1)); + usbd_add_interface(0, usbd_cdc_acm_init_intf(0, &intf2)); + usbd_add_endpoint(0, &cdc_out_ep); + usbd_add_endpoint(0, &cdc_in_ep); + +#if CONFIG_CHERRYDAP_USE_CUSTOM_HID + /*!< hid */ + usbd_add_interface(0, usbd_hid_init_intf(0, &hid_intf, hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE)); + hid_intf.notify_handler = hid_custom_notify_handler; + usbd_add_endpoint(0, &hid_custom_in_ep); + usbd_add_endpoint(0, &hid_custom_out_ep); +#endif + +#if CONFIG_CHERRYDAP_USE_MSC + usbd_add_interface(0, usbd_msc_init_intf(0, &intf3, MSC_OUT_EP, MSC_IN_EP)); +#endif + usbd_initialize(busid, reg_base, usbd_event_handler); +} + void chry_dap_handle(void) { uint32_t n; @@ -387,7 +583,7 @@ void chry_dap_handle(void) // Execute DAP Command (process request and prepare response) USB_RespSize[USB_ResponseIndexI] = - (uint16_t) DAP_ExecuteCommand(USB_Request[USB_RequestIndexO], USB_Response[USB_ResponseIndexI]); + (uint16_t)DAP_ExecuteCommand(USB_Request[USB_RequestIndexO], USB_Response[USB_ResponseIndexI]); // Update Request Index and Count USB_RequestIndexO++; @@ -397,7 +593,7 @@ void chry_dap_handle(void) USB_RequestCountO++; if (USB_RequestIdle) { - if ((uint16_t) (USB_RequestCountI - USB_RequestCountO) != DAP_PACKET_COUNT) { + if ((uint16_t)(USB_RequestCountI - USB_RequestCountO) != DAP_PACKET_COUNT) { USB_RequestIdle = 0U; usbd_ep_start_read(0, DAP_OUT_EP, USB_Request[USB_RequestIndexI], DAP_PACKET_SIZE); } @@ -427,9 +623,9 @@ void chry_dap_handle(void) void usbd_cdc_acm_set_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding) { - (void) busid; - if (memcmp(line_coding, (uint8_t *) &g_cdc_lincoding, sizeof(struct cdc_line_coding)) != 0) { - memcpy((uint8_t *) &g_cdc_lincoding, line_coding, sizeof(struct cdc_line_coding)); + (void)busid; + if (memcmp(line_coding, (uint8_t *)&g_cdc_lincoding, sizeof(struct cdc_line_coding)) != 0) { + memcpy((uint8_t *)&g_cdc_lincoding, line_coding, sizeof(struct cdc_line_coding)); config_uart = 1; config_uart_transfer = 0; } @@ -437,8 +633,8 @@ void usbd_cdc_acm_set_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_c void usbd_cdc_acm_get_line_coding(uint8_t busid, uint8_t intf, struct cdc_line_coding *line_coding) { - (void) busid; - memcpy(line_coding, (uint8_t *) &g_cdc_lincoding, sizeof(struct cdc_line_coding)); + (void)busid; + memcpy(line_coding, (uint8_t *)&g_cdc_lincoding, sizeof(struct cdc_line_coding)); } void chry_dap_usb2uart_handle(void) @@ -450,7 +646,7 @@ void chry_dap_usb2uart_handle(void) /* disable irq here */ config_uart = 0; /* config uart here */ - chry_dap_usb2uart_uart_config_callback((struct cdc_line_coding *) &g_cdc_lincoding); + chry_dap_usb2uart_uart_config_callback((struct cdc_line_coding *)&g_cdc_lincoding); usbtx_idle_flag = 1; uarttx_idle_flag = 1; config_uart_transfer = 1; @@ -521,7 +717,7 @@ __WEAK void chry_dap_usb2uart_uart_send_bydma(uint8_t *data, uint16_t len) { } -#ifdef CONFIG_CHERRYDAP_USE_MSC +#if CONFIG_CHERRYDAP_USE_MSC #define BLOCK_SIZE 512 #define BLOCK_COUNT 10 diff --git a/components/drivers/usb/cherryusb/platform/daplink/dap_main.h b/components/drivers/usb/cherryusb/platform/daplink/dap_main.h index 082cb996e7..596f7a47e1 100644 --- a/components/drivers/usb/cherryusb/platform/daplink/dap_main.h +++ b/components/drivers/usb/cherryusb/platform/daplink/dap_main.h @@ -10,6 +10,7 @@ #include "usbd_core.h" #include "usbd_cdc.h" #include "usbd_msc.h" +#include "usbd_hid.h" #include "chry_ringbuffer.h" #include "DAP_config.h" #include "DAP.h" @@ -24,23 +25,14 @@ #define MSC_IN_EP 0x86 #define MSC_OUT_EP 0x07 +#define HID_IN_EP 0x88 +#define HID_OUT_EP 0x09 + #define USBD_VID 0x0D28 #define USBD_PID 0x0204 #define USBD_MAX_POWER 500 #define USBD_LANGID_STRING 1033 -#define CMSIS_DAP_INTERFACE_SIZE (9 + 7 + 7) - -#ifdef CONFIG_CHERRYDAP_USE_MSC -#define CONFIG_MSC_DESCRIPTOR_LEN CDC_ACM_DESCRIPTOR_LEN -#define CONFIG_MSC_INTF_NUM 1 -#define MSC_INTF_NUM (0x02 + 1) -#else -#define CONFIG_MSC_DESCRIPTOR_LEN 0 -#define CONFIG_MSC_INTF_NUM 0 -#define MSC_INTF_NUM (0x02) -#endif - #ifdef CONFIG_USB_HS #if DAP_PACKET_SIZE != 512 #error "DAP_PACKET_SIZE must be 512 in hs" @@ -51,99 +43,57 @@ #endif #endif -#define USBD_WINUSB_VENDOR_CODE 0x20 - -#define USBD_WEBUSB_ENABLE 0 -#define USBD_BULK_ENABLE 1 -#define USBD_WINUSB_ENABLE 1 - -/* WinUSB Microsoft OS 2.0 descriptor sizes */ -#define WINUSB_DESCRIPTOR_SET_HEADER_SIZE 10 -#define WINUSB_FUNCTION_SUBSET_HEADER_SIZE 8 -#define WINUSB_FEATURE_COMPATIBLE_ID_SIZE 20 - -#define FUNCTION_SUBSET_LEN 160 -#define DEVICE_INTERFACE_GUIDS_FEATURE_LEN 132 - -#define USBD_WINUSB_DESC_SET_LEN (WINUSB_DESCRIPTOR_SET_HEADER_SIZE + USBD_WEBUSB_ENABLE * FUNCTION_SUBSET_LEN + USBD_BULK_ENABLE * FUNCTION_SUBSET_LEN) - -#define USBD_NUM_DEV_CAPABILITIES (USBD_WEBUSB_ENABLE + USBD_WINUSB_ENABLE) - -#define USBD_WEBUSB_DESC_LEN 24 -#define USBD_WINUSB_DESC_LEN 28 - -#define USBD_BOS_WTOTALLENGTH (0x05 + \ - USBD_WEBUSB_DESC_LEN * USBD_WEBUSB_ENABLE + \ - USBD_WINUSB_DESC_LEN * USBD_WINUSB_ENABLE) +#ifdef CONFIG_USB_HS +#define HID_PACKET_SIZE 1024 +#else +#define HID_PACKET_SIZE 64 +#endif #define CONFIG_UARTRX_RINGBUF_SIZE (8 * 1024) #define CONFIG_USBRX_RINGBUF_SIZE (8 * 1024) -#ifdef __cplusplus -extern "C" -{ +#ifndef CONFIG_CHERRYDAP_USE_MSC +#define CONFIG_CHERRYDAP_USE_MSC 0 #endif -extern USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t uartrx_ringbuffer[CONFIG_UARTRX_RINGBUF_SIZE]; -extern USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t usbrx_ringbuffer[CONFIG_USBRX_RINGBUF_SIZE]; -extern USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t usb_tmpbuffer[DAP_PACKET_SIZE]; +#ifndef CONFIG_CHERRYDAP_USE_CUSTOM_HID +#define CONFIG_CHERRYDAP_USE_CUSTOM_HID 0 +#endif -extern const struct usb_descriptor cmsisdap_descriptor; -extern __ALIGN_BEGIN const uint8_t USBD_WinUSBDescriptorSetDescriptor[]; -extern __ALIGN_BEGIN const uint8_t USBD_BinaryObjectStoreDescriptor[]; -extern char *string_descriptors[]; +#ifdef __cplusplus +extern "C" { +#endif -extern struct usbd_interface dap_intf; -extern struct usbd_interface intf1; -extern struct usbd_interface intf2; -extern struct usbd_interface intf3; -extern struct usbd_interface hid_intf; +extern char serial_number_dynamic[36]; -extern struct usbd_endpoint dap_out_ep; -extern struct usbd_endpoint dap_in_ep; -extern struct usbd_endpoint cdc_out_ep; -extern struct usbd_endpoint cdc_in_ep; +extern struct usbd_interface hid_intf; extern chry_ringbuffer_t g_uartrx; extern chry_ringbuffer_t g_usbrx; -__STATIC_INLINE void chry_dap_init(uint8_t busid, uint32_t reg_base) -{ - chry_ringbuffer_init(&g_uartrx, uartrx_ringbuffer, CONFIG_UARTRX_RINGBUF_SIZE); - chry_ringbuffer_init(&g_usbrx, usbrx_ringbuffer, CONFIG_USBRX_RINGBUF_SIZE); - - DAP_Setup(); - - usbd_desc_register(0, &cmsisdap_descriptor); - - /*!< winusb */ - usbd_add_interface(0, &dap_intf); - usbd_add_endpoint(0, &dap_out_ep); - usbd_add_endpoint(0, &dap_in_ep); - - /*!< cdc acm */ - usbd_add_interface(0, usbd_cdc_acm_init_intf(0, &intf1)); - usbd_add_interface(0, usbd_cdc_acm_init_intf(0, &intf2)); - usbd_add_endpoint(0, &cdc_out_ep); - usbd_add_endpoint(0, &cdc_in_ep); - -#ifdef CONFIG_CHERRYDAP_USE_MSC - usbd_add_interface(0, usbd_msc_init_intf(0, &intf3, MSC_OUT_EP, MSC_IN_EP)); -#endif - extern void usbd_event_handler(uint8_t busid, uint8_t event); - usbd_initialize(busid, reg_base, usbd_event_handler); -} +void chry_dap_init(uint8_t busid, uint32_t reg_base); void chry_dap_handle(void); void chry_dap_usb2uart_handle(void); -void chry_dap_usb2uart_uart_config_callback(struct cdc_line_coding *line_coding); +/* implment by user */ +extern void chry_dap_usb2uart_uart_config_callback(struct cdc_line_coding *line_coding); -void chry_dap_usb2uart_uart_send_bydma(uint8_t *data, uint16_t len); +/* implment by user */ +extern void chry_dap_usb2uart_uart_send_bydma(uint8_t *data, uint16_t len); void chry_dap_usb2uart_uart_send_complete(uint32_t size); +/* implment by user */ +extern void hid_custom_notify_handler(uint8_t busid, uint8_t event, void *arg); + +/* implment by user */ +extern void usbd_hid_custom_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes); + +/* implment by user */ +extern void usbd_hid_custom_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes); + #ifdef __cplusplus } #endif diff --git a/components/drivers/usb/cherryusb/platform/rtthread/usb_check.c b/components/drivers/usb/cherryusb/platform/rtthread/usb_check.c index 4a5fb8c329..154d89f0b6 100644 --- a/components/drivers/usb/cherryusb/platform/rtthread/usb_check.c +++ b/components/drivers/usb/cherryusb/platform/rtthread/usb_check.c @@ -17,8 +17,11 @@ #endif #endif -#if defined(ARCH_ARM_CORTEX_M7) || \ - defined(SOC_HPM6000) || defined(SOC_HPM6E00) || defined(SOC_HPM6P00) || \ +#if defined(ARCH_ARM_CORTEX_M7) || \ + defined(ARCH_ARM_CORTEX_A) || \ + defined(ARCH_RISCV64) || \ + defined(SOC_HPM6200) || defined(SOC_HPM6300) || defined(SOC_HPM6700) || defined(SOC_HPM6800) || \ + defined(SOC_HPM6E00) || defined(SOC_HPM6P00) || \ defined(BSP_USING_BL61X) || defined(BSP_USING_BL808) #ifndef RT_USING_CACHE #error RT_USING_CACHE must be enabled in this chip @@ -27,6 +30,6 @@ #ifdef RT_USING_CACHE #ifndef CONFIG_USB_DCACHE_ENABLE -#warning CONFIG_USB_DCACHE_ENABLE must be enabled if you do not config nocache ram +#error CONFIG_USB_DCACHE_ENABLE must be enabled if you do not config nocache ram #endif #endif diff --git a/components/drivers/usb/cherryusb/platform/rtthread/usb_msh.c b/components/drivers/usb/cherryusb/platform/rtthread/usb_msh.c index a153ed053d..8dd6116407 100644 --- a/components/drivers/usb/cherryusb/platform/rtthread/usb_msh.c +++ b/components/drivers/usb/cherryusb/platform/rtthread/usb_msh.c @@ -21,7 +21,7 @@ int usbh_init(int argc, char **argv) busid = atoi(argv[1]); reg_base = strtoll(argv[2], NULL, 16); - usbh_initialize(busid, reg_base); + usbh_initialize(busid, reg_base, NULL); return 0; } @@ -44,4 +44,10 @@ int usbh_deinit(int argc, char **argv) MSH_CMD_EXPORT(usbh_init, init usb host); MSH_CMD_EXPORT(usbh_deinit, deinit usb host); MSH_CMD_EXPORT(lsusb, ls usb devices); + +#ifdef CONFIG_USBHOST_SERIAL +#include "usbh_serial.h" +MSH_CMD_EXPORT(usbh_serial, usbh_serial test); +#endif + #endif diff --git a/components/drivers/usb/cherryusb/platform/rtthread/usbd_serial.c b/components/drivers/usb/cherryusb/platform/rtthread/usbd_serial.c index aeb53a9bf1..2f6d484bca 100644 --- a/components/drivers/usb/cherryusb/platform/rtthread/usbd_serial.c +++ b/components/drivers/usb/cherryusb/platform/rtthread/usbd_serial.c @@ -76,9 +76,8 @@ static rt_err_t usbd_serial_open(struct rt_device *dev, rt_uint16_t oflag) serial = (struct usbd_serial *)dev; - if (!usb_device_is_configured(serial->busid)) { - USB_LOG_ERR("USB device is not configured\n"); - return -RT_EPERM; + while(!usb_device_is_configured(serial->busid)) { + rt_thread_mdelay(10); } usbd_ep_start_read(serial->busid, serial->out_ep, @@ -123,9 +122,8 @@ static rt_ssize_t usbd_serial_write(struct rt_device *dev, } align_buf = (rt_uint8_t *)buffer; -#ifdef CONFIG_USB_DCACHE_ENABLE if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { - align_buf = rt_malloc_align(size, CONFIG_USB_ALIGN_SIZE); + align_buf = rt_malloc_align(USB_ALIGN_UP(size, CONFIG_USB_ALIGN_SIZE), CONFIG_USB_ALIGN_SIZE); if (!align_buf) { USB_LOG_ERR("serial get align buf failed\n"); return 0; @@ -133,7 +131,7 @@ static rt_ssize_t usbd_serial_write(struct rt_device *dev, usb_memcpy(align_buf, buffer, size); } -#endif + usb_osal_sem_reset(serial->tx_done); usbd_ep_start_write(serial->busid, serial->in_ep, align_buf, size); ret = usb_osal_sem_take(serial->tx_done, 3000); @@ -144,11 +142,9 @@ static rt_ssize_t usbd_serial_write(struct rt_device *dev, ret = size; } -#ifdef CONFIG_USB_DCACHE_ENABLE if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { rt_free_align(align_buf); } -#endif return ret; } diff --git a/components/drivers/usb/cherryusb/platform/rtthread/usbh_dfs.c b/components/drivers/usb/cherryusb/platform/rtthread/usbh_dfs.c index 1344f53926..7784666526 100644 --- a/components/drivers/usb/cherryusb/platform/rtthread/usbh_dfs.c +++ b/components/drivers/usb/cherryusb/platform/rtthread/usbh_dfs.c @@ -38,7 +38,7 @@ static rt_ssize_t rt_udisk_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_uint8_t *align_buf; align_buf = (rt_uint8_t *)buffer; -#ifdef CONFIG_USB_DCACHE_ENABLE + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { align_buf = rt_malloc_align(size * msc_class->blocksize, CONFIG_USB_ALIGN_SIZE); if (!align_buf) { @@ -47,18 +47,18 @@ static rt_ssize_t rt_udisk_read(rt_device_t dev, rt_off_t pos, void *buffer, } } else { } -#endif + ret = usbh_msc_scsi_read10(msc_class, pos, (uint8_t *)align_buf, size); if (ret < 0) { rt_kprintf("usb mass_storage read failed\n"); return 0; } -#ifdef CONFIG_USB_DCACHE_ENABLE + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { usb_memcpy(buffer, align_buf, size * msc_class->blocksize); rt_free_align(align_buf); } -#endif + return size; } @@ -70,7 +70,7 @@ static rt_ssize_t rt_udisk_write(rt_device_t dev, rt_off_t pos, const void *buff rt_uint8_t *align_buf; align_buf = (rt_uint8_t *)buffer; -#ifdef CONFIG_USB_DCACHE_ENABLE + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { align_buf = rt_malloc_align(size * msc_class->blocksize, CONFIG_USB_ALIGN_SIZE); if (!align_buf) { @@ -80,17 +80,16 @@ static rt_ssize_t rt_udisk_write(rt_device_t dev, rt_off_t pos, const void *buff usb_memcpy(align_buf, buffer, size * msc_class->blocksize); } -#endif + ret = usbh_msc_scsi_write10(msc_class, pos, (uint8_t *)align_buf, size); if (ret < 0) { rt_kprintf("usb mass_storage write failed\n"); return 0; } -#ifdef CONFIG_USB_DCACHE_ENABLE + if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { rt_free_align(align_buf); } -#endif return size; } diff --git a/components/drivers/usb/cherryusb/platform/rtthread/usbh_lwip.c b/components/drivers/usb/cherryusb/platform/rtthread/usbh_lwip.c index 34dc385075..292e5e3c88 100644 --- a/components/drivers/usb/cherryusb/platform/rtthread/usbh_lwip.c +++ b/components/drivers/usb/cherryusb/platform/rtthread/usbh_lwip.c @@ -25,7 +25,7 @@ #endif #ifndef LWIP_NO_RX_THREAD -#error must enable LWIP_NO_RX_THREAD, we do not use rtthread eth rx thread +#warning suggest you to enable LWIP_NO_RX_THREAD, we do not use rtthread eth rx thread #endif #ifndef LWIP_NO_TX_THREAD @@ -33,7 +33,7 @@ #endif #if LWIP_TCPIP_CORE_LOCKING_INPUT != 1 -#warning suggest you to set LWIP_TCPIP_CORE_LOCKING_INPUT to 1, usb handles eth input with own thread +#warning suggest you to set LWIP_TCPIP_CORE_LOCKING_INPUT to 1 for better performance, usb handles eth input with own thread #endif #if LWIP_TCPIP_CORE_LOCKING != 1 @@ -48,6 +48,14 @@ #error RT_LWIP_TCPTHREAD_STACKSIZE must be >= 2048 #endif +#if !defined(CONFIG_USBHOST_PLATFORM_CDC_ECM) && \ + !defined(CONFIG_USBHOST_PLATFORM_CDC_RNDIS) && \ + !defined(CONFIG_USBHOST_PLATFORM_CDC_NCM) && \ + !defined(CONFIG_USBHOST_PLATFORM_ASIX) && \ + !defined(CONFIG_USBHOST_PLATFORM_RTL8152) +#error "Please enable at least one USB Ethernet platform in usb_config.h or Kconfig" +#endif + // #define CONFIG_USBHOST_PLATFORM_CDC_ECM // #define CONFIG_USBHOST_PLATFORM_CDC_RNDIS // #define CONFIG_USBHOST_PLATFORM_CDC_NCM diff --git a/components/drivers/usb/cherryusb/platform/rtthread/usbh_serial.c b/components/drivers/usb/cherryusb/platform/rtthread/usbh_serial.c deleted file mode 100644 index cbfbc49e4d..0000000000 --- a/components/drivers/usb/cherryusb/platform/rtthread/usbh_serial.c +++ /dev/null @@ -1,914 +0,0 @@ -/* - * Copyright (c) 2025, sakumisu - * - * SPDX-License-Identifier: Apache-2.0 - */ -#include -#include - -#include "usbh_core.h" -#include "usbh_cdc_acm.h" -#include "usbh_ftdi.h" -#include "usbh_cp210x.h" -#include "usbh_ch34x.h" -#include "usbh_pl2303.h" - -#define DEV_FORMAT_VENDOR "ttyUSB%d" -#define DEV_FORMAT_CDC_ACM "ttyACM%d" - -#define USBH_RX_MAX_SIZE 2048 - -#ifndef CONFIG_USBHOST_MAX_VENDOR_SERIAL_CLASS -#define CONFIG_USBHOST_MAX_VENDOR_SERIAL_CLASS (4) -#endif - -#ifndef CONFIG_USBHOST_SERIAL_RX_BUFSIZE -#define CONFIG_USBHOST_SERIAL_RX_BUFSIZE (USBH_RX_MAX_SIZE * 2) -#endif - -enum usbh_serial_type { - USBH_SERIAL_TYPE_CDC_ACM = 0, - USBH_SERIAL_TYPE_FTDI, - USBH_SERIAL_TYPE_CP210X, - USBH_SERIAL_TYPE_CH34X, - USBH_SERIAL_TYPE_PL2303, -}; - -struct usbh_serial { - struct rt_device parent; - enum usbh_serial_type type; - uint8_t minor; - char name[CONFIG_USBHOST_DEV_NAMELEN]; - struct rt_ringbuffer rx_rb; - rt_uint8_t rx_rb_buffer[CONFIG_USBHOST_SERIAL_RX_BUFSIZE]; -}; - -static uint32_t g_devinuse_vendor = 0; -static uint32_t g_devinuse_cdc_acm = 0; - -static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_usbh_serial_vendor_rx_buf[CONFIG_USBHOST_MAX_VENDOR_SERIAL_CLASS][USB_ALIGN_UP(USBH_RX_MAX_SIZE, CONFIG_USB_ALIGN_SIZE)]; -static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_usbh_serial_cdc_acm_rx_buf[CONFIG_USBHOST_MAX_CDC_ACM_CLASS][USB_ALIGN_UP(USBH_RX_MAX_SIZE, CONFIG_USB_ALIGN_SIZE)]; - -static struct usbh_serial *usbh_serial_alloc(uint8_t type) -{ - uint8_t devno; - struct usbh_serial *serial; - - for (devno = 0; devno < CONFIG_USBHOST_MAX_VENDOR_SERIAL_CLASS; devno++) { - if ((g_devinuse_vendor & (1U << devno)) == 0) { - g_devinuse_vendor |= (1U << devno); - - serial = rt_malloc(sizeof(struct usbh_serial)); - memset(serial, 0, sizeof(struct usbh_serial)); - serial->type = type; - serial->minor = devno; - snprintf(serial->name, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT_VENDOR, serial->minor); - return serial; - } - } - return NULL; -} - -static void usbh_serial_free(struct usbh_serial *serial) -{ - uint8_t devno = serial->minor; - - if (devno < 32) { - g_devinuse_vendor &= ~(1U << devno); - } - memset(serial, 0, sizeof(struct usbh_serial)); - rt_free(serial); -} - -static struct usbh_serial *usbh_serial_cdc_acm_alloc(uint8_t type) -{ - uint8_t devno; - struct usbh_serial *serial; - - for (devno = 0; devno < CONFIG_USBHOST_MAX_CDC_ACM_CLASS; devno++) { - if ((g_devinuse_cdc_acm & (1U << devno)) == 0) { - g_devinuse_cdc_acm |= (1U << devno); - - serial = rt_malloc(sizeof(struct usbh_serial)); - memset(serial, 0, sizeof(struct usbh_serial)); - serial->type = type; - serial->minor = devno; - snprintf(serial->name, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT_CDC_ACM, serial->minor); - return serial; - } - } - return NULL; -} - -static void usbh_serial_cdc_acm_free(struct usbh_serial *serial) -{ - uint8_t devno = serial->minor; - - if (devno < 32) { - g_devinuse_cdc_acm &= ~(1U << devno); - } - memset(serial, 0, sizeof(struct usbh_serial)); - rt_free(serial); -} - -static rt_err_t usbh_serial_open(struct rt_device *dev, rt_uint16_t oflag) -{ - struct usbh_serial *serial; - - RT_ASSERT(dev != RT_NULL); - - serial = (struct usbh_serial *)dev; - - switch (serial->type) { - case USBH_SERIAL_TYPE_CDC_ACM: - break; - case USBH_SERIAL_TYPE_FTDI: - break; - case USBH_SERIAL_TYPE_CP210X: - break; - case USBH_SERIAL_TYPE_CH34X: - break; - case USBH_SERIAL_TYPE_PL2303: - break; - - default: - break; - } - - return RT_EOK; -} - -static rt_err_t usbh_serial_close(struct rt_device *dev) -{ - struct usbh_serial *serial; - - RT_ASSERT(dev != RT_NULL); - - serial = (struct usbh_serial *)dev; - - switch (serial->type) { - case USBH_SERIAL_TYPE_CDC_ACM: - break; - case USBH_SERIAL_TYPE_FTDI: - break; - case USBH_SERIAL_TYPE_CP210X: - break; - case USBH_SERIAL_TYPE_CH34X: - break; - case USBH_SERIAL_TYPE_PL2303: - break; - - default: - break; - } - - return RT_EOK; -} - -static rt_ssize_t usbh_serial_read(struct rt_device *dev, - rt_off_t pos, - void *buffer, - rt_size_t size) -{ - struct usbh_serial *serial; - - RT_ASSERT(dev != RT_NULL); - - serial = (struct usbh_serial *)dev; - - return rt_ringbuffer_get(&serial->rx_rb, (rt_uint8_t *)buffer, size); -} - -static rt_ssize_t usbh_serial_write(struct rt_device *dev, - rt_off_t pos, - const void *buffer, - rt_size_t size) -{ - struct usbh_serial *serial; - int ret = 0; - rt_uint8_t *align_buf; - - RT_ASSERT(dev != RT_NULL); - - serial = (struct usbh_serial *)dev; - - align_buf = (rt_uint8_t *)buffer; -#ifdef CONFIG_USB_DCACHE_ENABLE - if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { - align_buf = rt_malloc_align(size, CONFIG_USB_ALIGN_SIZE); - if (!align_buf) { - USB_LOG_ERR("serial get align buf failed\n"); - return 0; - } - - usb_memcpy(align_buf, buffer, size); - } -#endif - - switch (serial->type) { -#if defined(PKG_CHERRYUSB_HOST_CDC_ACM) || defined(RT_CHERRYUSB_HOST_CDC_ACM) - case USBH_SERIAL_TYPE_CDC_ACM: - ret = usbh_cdc_acm_bulk_out_transfer((struct usbh_cdc_acm *)dev->user_data, (uint8_t *)align_buf, size, RT_WAITING_FOREVER); - if (ret < 0) { - USB_LOG_ERR("usbh_cdc_acm_bulk_out_transfer failed: %d\n", ret); -#ifdef CONFIG_USB_DCACHE_ENABLE - rt_free_align(align_buf); -#endif - return 0; - } - break; -#endif -#if defined(PKG_CHERRYUSB_HOST_FTDI) || defined(RT_CHERRYUSB_HOST_FTDI) - case USBH_SERIAL_TYPE_FTDI: - ret = usbh_ftdi_bulk_out_transfer((struct usbh_ftdi *)dev->user_data, (uint8_t *)align_buf, size, RT_WAITING_FOREVER); - if (ret < 0) { - USB_LOG_ERR("usbh_ftdi_bulk_out_transfer failed: %d\n", ret); -#ifdef CONFIG_USB_DCACHE_ENABLE - rt_free_align(align_buf); -#endif - return 0; - } - break; -#endif -#if defined(PKG_CHERRYUSB_HOST_CH34X) || defined(RT_CHERRYUSB_HOST_CH34X) - case USBH_SERIAL_TYPE_CH34X: - ret = usbh_ch34x_bulk_out_transfer((struct usbh_ch34x *)dev->user_data, (uint8_t *)align_buf, size, RT_WAITING_FOREVER); - if (ret < 0) { - USB_LOG_ERR("usbh_ch34x_bulk_out_transfer failed: %d\n", ret); -#ifdef CONFIG_USB_DCACHE_ENABLE - rt_free_align(align_buf); -#endif - return 0; - } - break; -#endif -#if defined(PKG_CHERRYUSB_HOST_PL2303) || defined(RT_CHERRYUSB_HOST_PL2303) - case USBH_SERIAL_TYPE_PL2303: - ret = usbh_pl2303_bulk_out_transfer((struct usbh_pl2303 *)dev->user_data, (uint8_t *)align_buf, size, RT_WAITING_FOREVER); - if (ret < 0) { - USB_LOG_ERR("usbh_pl2303_bulk_out_transfer failed: %d\n", ret); -#ifdef CONFIG_USB_DCACHE_ENABLE - rt_free_align(align_buf); -#endif - return 0; - } - break; -#endif - default: - break; - } - -#ifdef CONFIG_USB_DCACHE_ENABLE - if ((uint32_t)buffer & (CONFIG_USB_ALIGN_SIZE - 1)) { - rt_free_align(align_buf); - } -#endif - - return ret; -} - -static rt_err_t usbh_serial_control(struct rt_device *dev, - int cmd, - void *args) -{ - struct usbh_serial *serial; - struct serial_configure *config; - struct cdc_line_coding line_coding; - int ret = -RT_EINVAL; - - RT_ASSERT(dev != RT_NULL); - - serial = (struct usbh_serial *)dev; - - switch (serial->type) { -#if defined(PKG_CHERRYUSB_HOST_CDC_ACM) || defined(RT_CHERRYUSB_HOST_CDC_ACM) - case USBH_SERIAL_TYPE_CDC_ACM: - if (cmd == RT_DEVICE_CTRL_CONFIG) { - struct usbh_cdc_acm *cdc_acm_class; - cdc_acm_class = (struct usbh_cdc_acm *)dev->user_data; - - config = (struct serial_configure *)args; - - line_coding.dwDTERate = config->baud_rate; - line_coding.bDataBits = config->data_bits; - line_coding.bCharFormat = 0; // STOP_BITS_1 - line_coding.bParityType = config->parity; - - usbh_cdc_acm_set_line_coding(cdc_acm_class, &line_coding); - } - - ret = RT_EOK; - break; -#endif -#if defined(PKG_CHERRYUSB_HOST_FTDI) || defined(RT_CHERRYUSB_HOST_FTDI) - case USBH_SERIAL_TYPE_FTDI: - if (cmd == RT_DEVICE_CTRL_CONFIG) { - struct usbh_ftdi *ftdi_class; - ftdi_class = (struct usbh_ftdi *)dev->user_data; - - config = (struct serial_configure *)args; - - line_coding.dwDTERate = config->baud_rate; - line_coding.bDataBits = config->data_bits; - line_coding.bCharFormat = 0; // STOP_BITS_1 - line_coding.bParityType = config->parity; - - usbh_ftdi_set_line_coding(ftdi_class, &line_coding); - } - - ret = RT_EOK; - break; -#endif -#if defined(PKG_CHERRYUSB_HOST_CP210X) || defined(RT_CHERRYUSB_HOST_CP210X) - case USBH_SERIAL_TYPE_CP210X: - if (cmd == RT_DEVICE_CTRL_CONFIG) { - struct usbh_cp210x *cp210x_class; - cp210x_class = (struct usbh_cp210x *)dev->user_data; - - config = (struct serial_configure *)args; - - line_coding.dwDTERate = config->baud_rate; - line_coding.bDataBits = config->data_bits; - line_coding.bCharFormat = 0; // STOP_BITS_1 - line_coding.bParityType = config->parity; - - usbh_cp210x_set_line_coding(cp210x_class, &line_coding); - } - - ret = RT_EOK; - break; -#endif -#if defined(PKG_CHERRYUSB_HOST_CH34X) || defined(RT_CHERRYUSB_HOST_CH34X) - case USBH_SERIAL_TYPE_CH34X: - if (cmd == RT_DEVICE_CTRL_CONFIG) { - struct usbh_ch34x *ch34x_class; - ch34x_class = (struct usbh_ch34x *)dev->user_data; - - config = (struct serial_configure *)args; - - line_coding.dwDTERate = config->baud_rate; - line_coding.bDataBits = config->data_bits; - line_coding.bCharFormat = 0; // STOP_BITS_1 - line_coding.bParityType = config->parity; - - usbh_ch34x_set_line_coding(ch34x_class, &line_coding); - } - - ret = RT_EOK; - break; -#endif -#if defined(PKG_CHERRYUSB_HOST_PL2303) || defined(RT_CHERRYUSB_HOST_PL2303) - case USBH_SERIAL_TYPE_PL2303: - if (cmd == RT_DEVICE_CTRL_CONFIG) { - struct usbh_pl2303 *pl2303_class; - pl2303_class = (struct usbh_pl2303 *)dev->user_data; - - config = (struct serial_configure *)args; - - line_coding.dwDTERate = config->baud_rate; - line_coding.bDataBits = config->data_bits; - line_coding.bCharFormat = 0; // STOP_BITS_1 - line_coding.bParityType = config->parity; - - usbh_pl2303_set_line_coding(pl2303_class, &line_coding); - } - - ret = RT_EOK; - break; -#endif - default: - break; - } - - return ret; -} - -#ifdef RT_USING_DEVICE_OPS -const static struct rt_device_ops usbh_serial_ops = { - NULL, - usbh_serial_open, - usbh_serial_close, - usbh_serial_read, - usbh_serial_write, - usbh_serial_control -}; -#endif - -#ifdef RT_USING_POSIX_DEVIO -#include -#include -#include -#include -#include - -#ifdef RT_USING_POSIX_TERMIOS -#include -#endif - -static rt_err_t usbh_serial_fops_rx_ind(rt_device_t dev, rt_size_t size) -{ - rt_wqueue_wakeup(&(dev->wait_queue), (void*)POLLIN); - - return RT_EOK; -} - -/* fops for serial */ -static int usbh_serial_fops_open(struct dfs_file *fd) -{ - rt_err_t ret = 0; - rt_uint16_t flags = 0; - rt_device_t device; - - device = (rt_device_t)fd->vnode->data; - RT_ASSERT(device != RT_NULL); - - switch (fd->flags & O_ACCMODE) - { - case O_RDONLY: - USB_LOG_DBG("fops open: O_RDONLY!"); - flags = RT_DEVICE_FLAG_RDONLY; - break; - case O_WRONLY: - USB_LOG_DBG("fops open: O_WRONLY!"); - flags = RT_DEVICE_FLAG_WRONLY; - break; - case O_RDWR: - USB_LOG_DBG("fops open: O_RDWR!"); - flags = RT_DEVICE_FLAG_RDWR; - break; - default: - USB_LOG_ERR("fops open: unknown mode - %d!", fd->flags & O_ACCMODE); - break; - } - - if ((fd->flags & O_ACCMODE) != O_WRONLY) - rt_device_set_rx_indicate(device, usbh_serial_fops_rx_ind); - ret = rt_device_open(device, flags); - if (ret == RT_EOK) return 0; - - return ret; -} - -static int usbh_serial_fops_close(struct dfs_file *fd) -{ - rt_device_t device; - - device = (rt_device_t)fd->vnode->data; - - rt_device_set_rx_indicate(device, RT_NULL); - rt_device_close(device); - - return 0; -} - -static int usbh_serial_fops_ioctl(struct dfs_file *fd, int cmd, void *args) -{ - rt_device_t device; - int flags = (int)(rt_base_t)args; - int mask = O_NONBLOCK | O_APPEND; - - device = (rt_device_t)fd->vnode->data; - switch (cmd) - { - case FIONREAD: - break; - case FIONWRITE: - break; - case F_SETFL: - flags &= mask; - fd->flags &= ~mask; - fd->flags |= flags; - break; - } - - return rt_device_control(device, cmd, args); -} - -static int usbh_serial_fops_read(struct dfs_file *fd, void *buf, size_t count) -{ - int size = 0; - rt_device_t device; - - device = (rt_device_t)fd->vnode->data; - - do - { - size = rt_device_read(device, -1, buf, count); - if (size <= 0) - { - if (fd->flags & O_NONBLOCK) - { - size = -EAGAIN; - break; - } - - rt_wqueue_wait(&(device->wait_queue), 0, RT_WAITING_FOREVER); - } - }while (size <= 0); - - return size; -} - -static int usbh_serial_fops_write(struct dfs_file *fd, const void *buf, size_t count) -{ - rt_device_t device; - - device = (rt_device_t)fd->vnode->data; - return rt_device_write(device, -1, buf, count); -} - -static int usbh_serial_fops_poll(struct dfs_file *fd, struct rt_pollreq *req) -{ - int mask = 0; - int flags = 0; - rt_device_t device; - struct usbh_serial *serial; - - device = (rt_device_t)fd->vnode->data; - RT_ASSERT(device != RT_NULL); - - serial = (struct usbh_serial *)device; - - /* only support POLLIN */ - flags = fd->flags & O_ACCMODE; - if (flags == O_RDONLY || flags == O_RDWR) - { - rt_base_t level; - - rt_poll_add(&(device->wait_queue), req); - - level = rt_hw_interrupt_disable(); - - if (rt_ringbuffer_data_len(&serial->rx_rb)) - mask |= POLLIN; - rt_hw_interrupt_enable(level); - } - // mask|=POLLOUT; - return mask; -} - -const static struct dfs_file_ops usbh_serial_fops = -{ - usbh_serial_fops_open, - usbh_serial_fops_close, - usbh_serial_fops_ioctl, - usbh_serial_fops_read, - usbh_serial_fops_write, - RT_NULL, /* flush */ - RT_NULL, /* lseek */ - RT_NULL, /* getdents */ - usbh_serial_fops_poll, -}; -#endif /* RT_USING_POSIX_DEVIO */ - -rt_err_t usbh_serial_register(struct usbh_serial *serial, - void *data) -{ - rt_err_t ret; - struct rt_device *device; - RT_ASSERT(serial != RT_NULL); - - device = &(serial->parent); - - device->type = RT_Device_Class_Char; - device->rx_indicate = RT_NULL; - device->tx_complete = RT_NULL; - -#ifdef RT_USING_DEVICE_OPS - device->ops = &usbh_serial_ops; -#else - device->init = NULL; - device->open = usbh_serial_open; - device->close = usbh_serial_close; - device->read = usbh_serial_read; - device->write = usbh_serial_write; - device->control = usbh_serial_control; -#endif - device->user_data = data; - - /* register a character device */ - ret = rt_device_register(device, serial->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_REMOVABLE); - -#ifdef RT_USING_POSIX_DEVIO - /* set fops */ - device->fops = &usbh_serial_fops; -#endif - rt_ringbuffer_init(&serial->rx_rb, serial->rx_rb_buffer, sizeof(serial->rx_rb_buffer)); - - return ret; -} - -void usbh_serial_unregister(struct usbh_serial *serial) -{ - RT_ASSERT(serial != NULL); - - rt_device_unregister(&serial->parent); - - if (serial->type == USBH_SERIAL_TYPE_CDC_ACM) { - usbh_serial_cdc_acm_free(serial); - } else { - usbh_serial_free(serial); - } -} - -#if defined(PKG_CHERRYUSB_HOST_CDC_ACM) || defined(RT_CHERRYUSB_HOST_CDC_ACM) -void usbh_cdc_acm_callback(void *arg, int nbytes) -{ - struct usbh_cdc_acm *cdc_acm_class = (struct usbh_cdc_acm *)arg; - struct usbh_serial *serial; - int ret; - struct usbh_urb *urb = &cdc_acm_class->bulkin_urb; - - if (nbytes > 0) { - serial = (struct usbh_serial *)cdc_acm_class->user_data; - rt_ringbuffer_put(&serial->rx_rb, g_usbh_serial_cdc_acm_rx_buf[serial->minor], nbytes); - - if (serial->parent.rx_indicate) { - serial->parent.rx_indicate(&serial->parent, nbytes); - } - - usbh_bulk_urb_fill(urb, cdc_acm_class->hport, cdc_acm_class->bulkin, g_usbh_serial_cdc_acm_rx_buf[serial->minor], sizeof(g_usbh_serial_cdc_acm_rx_buf[serial->minor]), 0, usbh_cdc_acm_callback, cdc_acm_class); - ret = usbh_submit_urb(urb); - if (ret < 0) { - USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); - } - } -} - -void usbh_cdc_acm_run(struct usbh_cdc_acm *cdc_acm_class) -{ - struct usbh_serial *serial; - int ret; - struct usbh_urb *urb = &cdc_acm_class->bulkin_urb; - - serial = usbh_serial_cdc_acm_alloc(USBH_SERIAL_TYPE_CDC_ACM); - cdc_acm_class->user_data = serial; - - usbh_serial_register(serial, cdc_acm_class); - - struct cdc_line_coding linecoding; - linecoding.dwDTERate = 115200; - linecoding.bDataBits = 8; - linecoding.bParityType = 0; - linecoding.bCharFormat = 0; - usbh_cdc_acm_set_line_coding(cdc_acm_class, &linecoding); - - usbh_bulk_urb_fill(urb, cdc_acm_class->hport, cdc_acm_class->bulkin, g_usbh_serial_cdc_acm_rx_buf[serial->minor], sizeof(g_usbh_serial_cdc_acm_rx_buf[serial->minor]), 0, usbh_cdc_acm_callback, cdc_acm_class); - ret = usbh_submit_urb(urb); - if (ret < 0) { - USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); - usbh_serial_unregister(serial); - return; - } -} - -void usbh_cdc_acm_stop(struct usbh_cdc_acm *cdc_acm_class) -{ - struct usbh_serial *serial; - - serial = (struct usbh_serial *)cdc_acm_class->user_data; - usbh_serial_unregister(serial); -} -#endif - -#if defined(PKG_CHERRYUSB_HOST_FTDI) || defined(RT_CHERRYUSB_HOST_FTDI) -void usbh_ftdi_callback(void *arg, int nbytes) -{ - struct usbh_ftdi *ftdi_class = (struct usbh_ftdi *)arg; - struct usbh_serial *serial; - int ret; - struct usbh_urb *urb = &ftdi_class->bulkin_urb; - - if (nbytes >= 2) { - serial = (struct usbh_serial *)ftdi_class->user_data; - - nbytes -= 2; // Skip the first two bytes (header) - rt_ringbuffer_put(&serial->rx_rb, &g_usbh_serial_vendor_rx_buf[serial->minor][2], nbytes); - - if (serial->parent.rx_indicate && nbytes) { - serial->parent.rx_indicate(&serial->parent, nbytes); - } - - usbh_bulk_urb_fill(urb, ftdi_class->hport, ftdi_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_ftdi_callback, ftdi_class); - ret = usbh_submit_urb(urb); - if (ret < 0) { - USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); - } - } -} - -void usbh_ftdi_run(struct usbh_ftdi *ftdi_class) -{ - struct usbh_serial *serial; - int ret; - struct usbh_urb *urb = &ftdi_class->bulkin_urb; - - serial = usbh_serial_alloc(USBH_SERIAL_TYPE_FTDI); - ftdi_class->user_data = serial; - - usbh_serial_register(serial, ftdi_class); - - struct cdc_line_coding linecoding; - linecoding.dwDTERate = 115200; - linecoding.bDataBits = 8; - linecoding.bParityType = 0; - linecoding.bCharFormat = 0; - usbh_ftdi_set_line_coding(ftdi_class, &linecoding); - - usbh_bulk_urb_fill(urb, ftdi_class->hport, ftdi_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_ftdi_callback, ftdi_class); - ret = usbh_submit_urb(urb); - if (ret < 0) { - USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); - usbh_serial_unregister(serial); - return; - } -} - -void usbh_ftdi_stop(struct usbh_ftdi *ftdi_class) -{ - struct usbh_serial *serial; - - serial = (struct usbh_serial *)ftdi_class->user_data; - usbh_serial_unregister(serial); -} -#endif - -#if defined(PKG_CHERRYUSB_HOST_CH34X) || defined(RT_CHERRYUSB_HOST_CH34X) -void usbh_ch34x_callback(void *arg, int nbytes) -{ - struct usbh_ch34x *ch34x_class = (struct usbh_ch34x *)arg; - struct usbh_serial *serial; - int ret; - struct usbh_urb *urb = &ch34x_class->bulkin_urb; - - if (nbytes > 0) { - serial = (struct usbh_serial *)ch34x_class->user_data; - rt_ringbuffer_put(&serial->rx_rb, g_usbh_serial_vendor_rx_buf[serial->minor], nbytes); - - if (serial->parent.rx_indicate) { - serial->parent.rx_indicate(&serial->parent, nbytes); - } - - usbh_bulk_urb_fill(urb, ch34x_class->hport, ch34x_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_ch34x_callback, ch34x_class); - ret = usbh_submit_urb(urb); - if (ret < 0) { - USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); - } - } -} - -void usbh_ch34x_run(struct usbh_ch34x *ch34x_class) -{ - struct usbh_serial *serial; - int ret; - struct usbh_urb *urb = &ch34x_class->bulkin_urb; - - serial = usbh_serial_alloc(USBH_SERIAL_TYPE_CH34X); - ch34x_class->user_data = serial; - - usbh_serial_register(serial, ch34x_class); - - struct cdc_line_coding linecoding; - linecoding.dwDTERate = 115200; - linecoding.bDataBits = 8; - linecoding.bParityType = 0; - linecoding.bCharFormat = 0; - usbh_ch34x_set_line_coding(ch34x_class, &linecoding); - - usbh_bulk_urb_fill(urb, ch34x_class->hport, ch34x_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_ch34x_callback, ch34x_class); - ret = usbh_submit_urb(urb); - if (ret < 0) { - USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); - usbh_serial_unregister(serial); - return; - } -} - -void usbh_ch34x_stop(struct usbh_ch34x *ch34x_class) -{ - struct usbh_serial *serial; - - serial = (struct usbh_serial *)ch34x_class->user_data; - usbh_serial_unregister(serial); -} -#endif - -#if defined(PKG_CHERRYUSB_HOST_CP210X) || defined(RT_CHERRYUSB_HOST_CP210X) -void usbh_cp210x_callback(void *arg, int nbytes) -{ - struct usbh_cp210x *cp210x_class = (struct usbh_cp210x *)arg; - struct usbh_serial *serial; - int ret; - struct usbh_urb *urb = &cp210x_class->bulkin_urb; - - if (nbytes > 0) { - serial = (struct usbh_serial *)cp210x_class->user_data; - rt_ringbuffer_put(&serial->rx_rb, g_usbh_serial_vendor_rx_buf[serial->minor], nbytes); - - if (serial->parent.rx_indicate) { - serial->parent.rx_indicate(&serial->parent, nbytes); - } - - usbh_bulk_urb_fill(urb, cp210x_class->hport, cp210x_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_cp210x_callback, cp210x_class); - ret = usbh_submit_urb(urb); - if (ret < 0) { - USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); - } - } -} - -void usbh_cp210x_run(struct usbh_cp210x *cp210x_class) -{ - struct usbh_serial *serial; - int ret; - struct usbh_urb *urb = &cp210x_class->bulkin_urb; - - serial = usbh_serial_alloc(USBH_SERIAL_TYPE_CP210X); - cp210x_class->user_data = serial; - - usbh_serial_register(serial, cp210x_class); - - struct cdc_line_coding linecoding; - linecoding.dwDTERate = 115200; - linecoding.bDataBits = 8; - linecoding.bParityType = 0; - linecoding.bCharFormat = 0; - usbh_cp210x_set_line_coding(cp210x_class, &linecoding); - - usbh_bulk_urb_fill(urb, cp210x_class->hport, cp210x_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_cp210x_callback, cp210x_class); - ret = usbh_submit_urb(urb); - if (ret < 0) { - USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); - usbh_serial_unregister(serial); - return; - } -} - -void usbh_cp210x_stop(struct usbh_cp210x *cp210x_class) -{ - struct usbh_serial *serial; - - serial = (struct usbh_serial *)cp210x_class->user_data; - usbh_serial_unregister(serial); -} -#endif - -#if defined(PKG_CHERRYUSB_HOST_PL2303) || defined(RT_CHERRYUSB_HOST_PL2303) -void usbh_pl2303_callback(void *arg, int nbytes) -{ - struct usbh_pl2303 *pl2303_class = (struct usbh_pl2303 *)arg; - struct usbh_serial *serial; - int ret; - struct usbh_urb *urb = &pl2303_class->bulkin_urb; - - if (nbytes > 0) { - serial = (struct usbh_serial *)pl2303_class->user_data; - rt_ringbuffer_put(&serial->rx_rb, g_usbh_serial_vendor_rx_buf[serial->minor], nbytes); - - if (serial->parent.rx_indicate) { - serial->parent.rx_indicate(&serial->parent, nbytes); - } - - usbh_bulk_urb_fill(urb, pl2303_class->hport, pl2303_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_pl2303_callback, pl2303_class); - ret = usbh_submit_urb(urb); - if (ret < 0) { - USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); - } - } -} - -void usbh_pl2303_run(struct usbh_pl2303 *pl2303_class) -{ - struct usbh_serial *serial; - int ret; - struct usbh_urb *urb = &pl2303_class->bulkin_urb; - - serial = usbh_serial_alloc(USBH_SERIAL_TYPE_PL2303); - pl2303_class->user_data = serial; - - usbh_serial_register(serial, pl2303_class); - - struct cdc_line_coding linecoding; - linecoding.dwDTERate = 115200; - linecoding.bDataBits = 8; - linecoding.bParityType = 0; - linecoding.bCharFormat = 0; - usbh_pl2303_set_line_coding(pl2303_class, &linecoding); - - usbh_bulk_urb_fill(urb, pl2303_class->hport, pl2303_class->bulkin, g_usbh_serial_vendor_rx_buf[serial->minor], sizeof(g_usbh_serial_vendor_rx_buf[serial->minor]), 0, usbh_pl2303_callback, pl2303_class); - ret = usbh_submit_urb(urb); - if (ret < 0) { - USB_LOG_ERR("usbh_submit_urb failed: %d\n", ret); - usbh_serial_unregister(serial); - return; - } -} - -void usbh_pl2303_stop(struct usbh_pl2303 *pl2303_class) -{ - struct usbh_serial *serial; - - serial = (struct usbh_serial *)pl2303_class->user_data; - usbh_serial_unregister(serial); -} -#endif diff --git a/components/drivers/usb/cherryusb/port/chipidea/usb_dc_chipidea.c b/components/drivers/usb/cherryusb/port/chipidea/usb_dc_chipidea.c index 106f8af535..ddead2b9db 100644 --- a/components/drivers/usb/cherryusb/port/chipidea/usb_dc_chipidea.c +++ b/components/drivers/usb/cherryusb/port/chipidea/usb_dc_chipidea.c @@ -594,10 +594,15 @@ int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, ui return -2; } +#ifdef CONFIG_USB_DCACHE_ENABLE + USB_ASSERT_MSG(!((uintptr_t)data % CONFIG_USB_ALIGN_SIZE), "data is not aligned %d", CONFIG_USB_ALIGN_SIZE); +#endif + g_chipidea_udc[busid].in_ep[ep_idx].xfer_buf = (uint8_t *)data; g_chipidea_udc[busid].in_ep[ep_idx].xfer_len = data_len; g_chipidea_udc[busid].in_ep[ep_idx].actual_xfer_len = 0; + usb_dcache_clean((uintptr_t)data, USB_ALIGN_UP(data_len, CONFIG_USB_ALIGN_SIZE)); chipidea_start_xfer(busid, ep, (uint8_t *)data, data_len); return 0; @@ -614,10 +619,15 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t return -2; } +#ifdef CONFIG_USB_DCACHE_ENABLE + USB_ASSERT_MSG(!((uintptr_t)data % CONFIG_USB_ALIGN_SIZE), "data is not aligned %d", CONFIG_USB_ALIGN_SIZE); +#endif + g_chipidea_udc[busid].out_ep[ep_idx].xfer_buf = (uint8_t *)data; g_chipidea_udc[busid].out_ep[ep_idx].xfer_len = data_len; g_chipidea_udc[busid].out_ep[ep_idx].actual_xfer_len = 0; + usb_dcache_invalidate((uintptr_t)data, USB_ALIGN_UP(data_len, CONFIG_USB_ALIGN_SIZE)); chipidea_start_xfer(busid, ep, data, data_len); return 0; @@ -649,7 +659,7 @@ void USBD_IRQHandler(uint8_t busid) memset(g_chipidea_udc[busid].in_ep, 0, sizeof(struct chipidea_ep_state) * CONFIG_USBDEV_EP_NUM); memset(g_chipidea_udc[busid].out_ep, 0, sizeof(struct chipidea_ep_state) * CONFIG_USBDEV_EP_NUM); usbd_event_reset_handler(busid); - chipidea_bus_reset(busid, 64); + chipidea_bus_reset(busid, g_chipidea_udc[busid].in_ep[0].ep_mps); } if (int_status & intr_suspend) { @@ -712,6 +722,7 @@ void USBD_IRQHandler(uint8_t busid) if (ep_addr & 0x80) { usbd_event_ep_in_complete_handler(busid, ep_addr, transfer_len); } else { + usb_dcache_invalidate((uintptr_t)g_chipidea_udc[busid].out_ep[ep_idx].xfer_buf, USB_ALIGN_UP(transfer_len, CONFIG_USB_ALIGN_SIZE)); usbd_event_ep_out_complete_handler(busid, ep_addr, transfer_len); } } diff --git a/components/drivers/usb/cherryusb/port/dwc2/README.md b/components/drivers/usb/cherryusb/port/dwc2/README.md index 2861cde737..db82c6cfb2 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/README.md +++ b/components/drivers/usb/cherryusb/port/dwc2/README.md @@ -48,4 +48,8 @@ Please note that host must support dma mode. ### Nationstech -- N32H4X \ No newline at end of file +- N32H4X + +### Infineon + +- PSOC Edge E8X \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_dc_dwc2.c b/components/drivers/usb/cherryusb/port/dwc2/usb_dc_dwc2.c index a5de3f29d7..31be0d55db 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/usb_dc_dwc2.c +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_dc_dwc2.c @@ -7,51 +7,6 @@ #include "usb_dwc2_reg.h" #include "usb_dwc2_param.h" -// clang-format off -#if defined ( __CC_ARM ) -#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 -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) -#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 -#elif defined ( __GNUC__ ) -#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 -#endif -// clang-format on - #define USBD_BASE (g_usbdev_bus[busid].reg_base) #define USB_OTG_GLB ((DWC2_GlobalTypeDef *)(USBD_BASE)) @@ -61,8 +16,6 @@ #define USB_OTG_OUTEP(i) ((DWC2_OUTEndpointTypeDef *)(USBD_BASE + USB_OTG_OUT_ENDPOINT_BASE + ((i)*USB_OTG_EP_REG_SIZE))) #define USB_OTG_FIFO(i) *(__IO uint32_t *)(USBD_BASE + USB_OTG_FIFO_BASE + ((i)*USB_OTG_FIFO_SIZE)) -extern uint32_t SystemCoreClock; - /* Endpoint state */ struct dwc2_ep_state { uint16_t ep_mps; /* Endpoint max packet size */ @@ -328,12 +281,11 @@ static uint8_t dwc2_get_devspeed(uint8_t busid) static void dwc2_ep0_start_read_setup(uint8_t busid, uint8_t *psetup) { - USB_OTG_OUTEP(0U)->DOEPTSIZ = 0U; - USB_OTG_OUTEP(0U)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); - USB_OTG_OUTEP(0U)->DOEPTSIZ |= (3U * 8U); - USB_OTG_OUTEP(0U)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_STUPCNT; + USB_OTG_OUTEP(0U)->DOEPTSIZ = (1U * 8U) | (1U << 19) | (1U << 29); if (g_dwc2_udc[busid].user_params.device_dma_enable) { + usb_dcache_invalidate((uintptr_t)&g_dwc2_udc[busid].setup, USB_ALIGN_UP(8, CONFIG_USB_ALIGN_SIZE)); + USB_OTG_OUTEP(0U)->DOEPDMA = (uint32_t)psetup; /* EP enable */ USB_OTG_OUTEP(0U)->DOEPCTL |= USB_OTG_DOEPCTL_EPENA | USB_OTG_DOEPCTL_USBAEP; @@ -342,25 +294,61 @@ static void dwc2_ep0_start_read_setup(uint8_t busid, uint8_t *psetup) void dwc2_ep_write(uint8_t busid, uint8_t ep_idx, uint8_t *src, uint16_t len) { - uint32_t *pSrc = (uint32_t *)src; - uint32_t count32b, i; + uint32_t *p32; + uint8_t *p8; + uint32_t val; + uint8_t remain; + + p32 = (uint32_t *)src; + for (uint32_t i = 0U; i < (len / 4); i++) { + USB_OTG_FIFO((uint32_t)ep_idx) = *p32++; + } - count32b = ((uint32_t)len + 3U) / 4U; - for (i = 0U; i < count32b; i++) { - USB_OTG_FIFO((uint32_t)ep_idx) = __UNALIGNED_UINT32_READ(pSrc); - pSrc++; + remain = len % 4; + + if (remain) { + p8 = (uint8_t *)p32; + val = (uint32_t)(*p8++); + + if (remain > 1) { + val |= (uint32_t)((*p8++) << 8); + } + + if (remain > 2) { + val |= (uint32_t)((*p8++) << 16); + } + + USB_OTG_FIFO((uint32_t)ep_idx) = val; } } void dwc2_ep_read(uint8_t busid, uint8_t *dest, uint16_t len) { - uint32_t *pDest = (uint32_t *)dest; - uint32_t i; - uint32_t count32b = ((uint32_t)len + 3U) / 4U; + uint32_t *p32; + uint8_t *p8; + uint32_t val; + uint8_t remain; + + p32 = (uint32_t *)dest; + for (uint32_t i = 0U; i < (len / 4); i++) { + *p32++ = USB_OTG_FIFO(0U); + } + + remain = len % 4; + + if (remain) { + p8 = (uint8_t *)p32; + val = USB_OTG_FIFO(0U); + + *p8++ = (uint8_t)(val & 0xFFU); - for (i = 0U; i < count32b; i++) { - __UNALIGNED_UINT32_WRITE(pDest, USB_OTG_FIFO(0U)); - pDest++; + if (remain > 1) { + *p8++ = (uint8_t)((val >> 8) & 0xFFU); + } + + if (remain > 2) { + *p8++ = (uint8_t)((val >> 16) & 0xFFU); + } } } @@ -530,6 +518,19 @@ int usb_dc_init(uint8_t busid) /* Force Device Mode*/ dwc2_set_mode(busid, USB_OTG_MODE_DEVICE); + USB_ASSERT_MSG((USB_OTG_GLB->GRXFSIZ & 0xffff) >= g_dwc2_udc[busid].user_params.device_rx_fifo_size, + "device_rx_fifo_size cannot be larger than power_on_value %u", (unsigned int)(USB_OTG_GLB->GRXFSIZ & 0xffff)); + for (uint8_t i = 0; i < (g_dwc2_udc[busid].hw_params.num_dev_ep + 1); i++) { + uint16_t reset_txfifo_size; + if (i == 0) { + reset_txfifo_size = USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ >> 16 & 0xffff; + } else { + reset_txfifo_size = USB_OTG_GLB->DIEPTXF[i - 1] >> 16 & 0xffff; + } + USB_ASSERT_MSG(reset_txfifo_size >= g_dwc2_udc[busid].user_params.device_tx_fifo_size[i], + "device_tx_fifo_size[%u] cannot be larger than power_on_value %u", i, reset_txfifo_size); + } + if (g_dwc2_udc[busid].user_params.b_session_valid_override) { /* B-peripheral session valid override enable */ USB_OTG_GLB->GOTGCTL |= USB_OTG_GOTGCTL_BVALOEN; @@ -675,6 +676,7 @@ uint8_t usbd_get_port_speed(uint8_t busid) int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) { uint8_t ep_idx = USB_EP_GET_IDX(ep->bEndpointAddress); + uint16_t ep_mps; USB_ASSERT_MSG(ep_idx < (g_dwc2_udc[busid].hw_params.num_dev_ep + 1), "Ep addr %02x overflow", ep->bEndpointAddress); @@ -682,14 +684,34 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) g_dwc2_udc[busid].out_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); g_dwc2_udc[busid].out_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); - USB_OTG_DEV->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & (uint32_t)(1UL << (16 + ep_idx)); + ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + if (ep_idx == 0) { + switch (ep_mps) { + case 64: + ep_mps = EP_MPS_64; + break; + case 32: + ep_mps = EP_MPS_32; + break; + case 16: + ep_mps = EP_MPS_16; + break; + case 8: + ep_mps = EP_MPS_8; + break; - if ((USB_OTG_OUTEP(ep_idx)->DOEPCTL & USB_OTG_DOEPCTL_USBAEP) == 0) { - USB_OTG_OUTEP(ep_idx)->DOEPCTL |= (USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize) & USB_OTG_DOEPCTL_MPSIZ) | - ((uint32_t)USB_GET_ENDPOINT_TYPE(ep->bmAttributes) << 18) | - USB_OTG_DIEPCTL_SD0PID_SEVNFRM | - USB_OTG_DOEPCTL_USBAEP; + default: + ep_mps = EP_MPS_64; + break; + } } + + USB_OTG_DEV->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & (uint32_t)(1UL << (16 + ep_idx)); + + USB_OTG_OUTEP(ep_idx)->DOEPCTL |= (ep_mps & USB_OTG_DOEPCTL_MPSIZ) | + ((uint32_t)USB_GET_ENDPOINT_TYPE(ep->bmAttributes) << 18) | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DOEPCTL_USBAEP; } else { uint16_t fifo_size; if (ep_idx == 0) { @@ -703,14 +725,34 @@ int usbd_ep_open(uint8_t busid, const struct usb_endpoint_descriptor *ep) g_dwc2_udc[busid].in_ep[ep_idx].ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); g_dwc2_udc[busid].in_ep[ep_idx].ep_type = USB_GET_ENDPOINT_TYPE(ep->bmAttributes); - USB_OTG_DEV->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << ep_idx); + ep_mps = USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize); + if (ep_idx == 0) { + switch (ep_mps) { + case 64: + ep_mps = EP_MPS_64; + break; + case 32: + ep_mps = EP_MPS_32; + break; + case 16: + ep_mps = EP_MPS_16; + break; + case 8: + ep_mps = EP_MPS_8; + break; - if ((USB_OTG_INEP(ep_idx)->DIEPCTL & USB_OTG_DIEPCTL_USBAEP) == 0) { - USB_OTG_INEP(ep_idx)->DIEPCTL |= (USB_GET_MAXPACKETSIZE(ep->wMaxPacketSize) & USB_OTG_DIEPCTL_MPSIZ) | - ((uint32_t)USB_GET_ENDPOINT_TYPE(ep->bmAttributes) << 18) | (ep_idx << 22) | - USB_OTG_DIEPCTL_SD0PID_SEVNFRM | - USB_OTG_DIEPCTL_USBAEP; + default: + ep_mps = EP_MPS_64; + break; + } } + + USB_OTG_DEV->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << ep_idx); + + USB_OTG_INEP(ep_idx)->DIEPCTL |= (ep_mps & USB_OTG_DIEPCTL_MPSIZ) | + ((uint32_t)USB_GET_ENDPOINT_TYPE(ep->bmAttributes) << 18) | (ep_idx << 22) | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DIEPCTL_USBAEP; dwc2_flush_txfifo(busid, ep_idx); } return 0; @@ -782,7 +824,6 @@ int usbd_ep_set_stall(uint8_t busid, const uint8_t ep) } if ((ep_idx == 0) && g_dwc2_udc[busid].user_params.device_dma_enable) { - usb_dcache_invalidate((uintptr_t)&g_dwc2_udc[busid].setup, USB_ALIGN_UP(8, CONFIG_USB_ALIGN_SIZE)); dwc2_ep0_start_read_setup(busid, (uint8_t *)&g_dwc2_udc[busid].setup); } @@ -1046,7 +1087,7 @@ void USBD_IRQHandler(uint8_t busid) usbd_event_ep_out_complete_handler(busid, ep_idx, g_dwc2_udc[busid].out_ep[ep_idx].actual_xfer_len); } } - // clang-format off + // clang-format off process_setup: // clang-format on if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) { @@ -1132,14 +1173,15 @@ process_setup: memset(g_dwc2_udc[busid].in_ep, 0, sizeof(struct dwc2_ep_state) * 16); memset(g_dwc2_udc[busid].out_ep, 0, sizeof(struct dwc2_ep_state) * 16); usbd_event_reset_handler(busid); - /* Start reading setup */ - dwc2_ep0_start_read_setup(busid, (uint8_t *)&g_dwc2_udc[busid].setup); } if (gint_status & USB_OTG_GINTSTS_ENUMDNE) { USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_ENUMDNE; - dwc2_set_turnaroundtime(busid, SystemCoreClock, dwc2_get_devspeed(busid)); + dwc2_set_turnaroundtime(busid, usbd_dwc2_get_system_clock(), dwc2_get_devspeed(busid)); USB_OTG_DEV->DCTL |= USB_OTG_DCTL_CGINAK; + + /* Start reading setup */ + dwc2_ep0_start_read_setup(busid, (uint8_t *)&g_dwc2_udc[busid].setup); } if (gint_status & USB_OTG_GINTSTS_PXFR_INCOMPISOOUT) { USB_OTG_GLB->GINTSTS = USB_OTG_GINTSTS_PXFR_INCOMPISOOUT; diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_dwc2_reg.h b/components/drivers/usb/cherryusb/port/dwc2/usb_dwc2_reg.h index 599d4ea58f..69b0960032 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/usb_dwc2_reg.h +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_dwc2_reg.h @@ -1733,4 +1733,6 @@ typedef struct void usb_dc_low_level_init(uint8_t busid); void usb_dc_low_level_deinit(uint8_t busid); void usbd_dwc2_delay_ms(uint8_t ms); +uint32_t usbd_dwc2_get_system_clock(void); + #endif diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_at.c b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_at.c index 17dec47f3d..5fcb8151f1 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_at.c +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_at.c @@ -9,8 +9,6 @@ extern unsigned int system_core_clock; -uint32_t SystemCoreClock; - const struct dwc2_user_params param_pa11_pa12 = { .phy_type = DWC2_PHY_TYPE_PARAM_FS, .device_dma_enable = false, @@ -80,8 +78,6 @@ const struct dwc2_user_params param_pb14_pb15 = { #ifndef CONFIG_USB_DWC2_CUSTOM_PARAM void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) { - SystemCoreClock = system_core_clock; - #if __has_include("at32f402_405.h") if (reg_base == OTGHS_BASE) { memcpy(params, ¶m_pb14_pb15, sizeof(struct dwc2_user_params)); @@ -106,8 +102,13 @@ void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) void usbd_dwc2_delay_ms(uint8_t ms) { - uint32_t count = SystemCoreClock / 1000 * ms; + uint32_t count = system_core_clock / 1000 * ms; while (count--) { __asm volatile("nop"); } } + +uint32_t usbd_dwc2_get_system_clock(void) +{ + return system_core_clock; +} diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_esp.c b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_esp.c index 03110fb8ce..6023129289 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_esp.c +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_esp.c @@ -151,7 +151,7 @@ void usb_dc_low_level_init(uint8_t busid) }; phy_config.target = GET_USB_PHY_TARGET(reg_base); phy_config.otg_speed = GET_USB_PHY_SPEED(reg_base); - + ret = usb_new_phy(&phy_config, &s_phy_handle[GET_USB_INDEX(reg_base)]); if (ret != ESP_OK) { USB_LOG_ERR("USB Phy Init Failed!\r\n"); @@ -262,6 +262,11 @@ void usbd_dwc2_delay_ms(uint8_t ms) vTaskDelay(pdMS_TO_TICKS(ms)); } +uint32_t usbd_dwc2_get_system_clock(void) +{ + return SystemCoreClock; +} + #ifdef CONFIG_USB_DCACHE_ENABLE #include "esp_cache.h" diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_hc.c b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_hc.c index 15ba5d69a9..38e065ab13 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_hc.c +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_hc.c @@ -1,30 +1,297 @@ /* - * Copyright (c) 2024, sakumisu + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. * * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-08 CDT first version */ -#include "usb_config.h" -#include "usb_dwc2_reg.h" -/* When using [GPIO_SetFunc(USBF_VBUS_PORT, USBF_VBUS_PIN, USBF_VBUS_FUNC);], there is no need to configure GOTGCTL */ +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_dwc2_param.h" + +#include "board_config.h" + +#if defined(RT_CHERRYUSB_HOST) && defined(RT_CHERRYUSB_DEVICE) + #if defined(HC32F460) || defined(HC32F472) + #error "Only one USB role can be selected!" + #endif +#endif + +const struct dwc2_user_params param_fs_core = +{ + .phy_type = DWC2_PHY_TYPE_PARAM_FS, +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = CONFIG_USB_FS_CORE_DEVICE_RX_FIFO_SIZE, + .device_tx_fifo_size = { + [0] = CONFIG_USB_FS_CORE_DEVICE_TX0_FIFO_SIZE, + [1] = CONFIG_USB_FS_CORE_DEVICE_TX1_FIFO_SIZE, + [2] = CONFIG_USB_FS_CORE_DEVICE_TX2_FIFO_SIZE, + [3] = CONFIG_USB_FS_CORE_DEVICE_TX3_FIFO_SIZE, + [4] = CONFIG_USB_FS_CORE_DEVICE_TX4_FIFO_SIZE, + [5] = CONFIG_USB_FS_CORE_DEVICE_TX5_FIFO_SIZE, +#if defined(HC32F4A0) || defined(HC32F4A8) + [6] = CONFIG_USB_FS_CORE_DEVICE_TX6_FIFO_SIZE, + [7] = CONFIG_USB_FS_CORE_DEVICE_TX7_FIFO_SIZE, + [8] = CONFIG_USB_FS_CORE_DEVICE_TX8_FIFO_SIZE, + [9] = CONFIG_USB_FS_CORE_DEVICE_TX9_FIFO_SIZE, + [10] = CONFIG_USB_FS_CORE_DEVICE_TX10_FIFO_SIZE, + [11] = CONFIG_USB_FS_CORE_DEVICE_TX11_FIFO_SIZE, + [12] = CONFIG_USB_FS_CORE_DEVICE_TX12_FIFO_SIZE, + [13] = CONFIG_USB_FS_CORE_DEVICE_TX13_FIFO_SIZE, + [14] = CONFIG_USB_FS_CORE_DEVICE_TX14_FIFO_SIZE, + [15] = CONFIG_USB_FS_CORE_DEVICE_TX15_FIFO_SIZE +#elif defined(HC32F460) || defined(HC32F472) + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 +#endif + }, + .total_fifo_size = CONFIG_USB_FS_CORE_TOTAL_FIFO_SIZE, -#define USB_OTG_GLB ((DWC2_GlobalTypeDef *)(reg_base)) + .host_dma_desc_enable = false, + .host_rx_fifo_size = CONFIG_USB_FS_CORE_HOST_RX_FIFO_SIZE, + .host_nperio_tx_fifo_size = CONFIG_USB_FS_CORE_HOST_NP_FIFO_SIZE, + .host_perio_tx_fifo_size = CONFIG_USB_FS_CORE_HOST_PE_FIFO_SIZE, + .device_gccfg = 0, + .host_gccfg = 0, +#if defined(HC32F4A0) || defined(HC32F4A8) || defined(HC32F460) + .b_session_valid_override = false, +#elif defined(HC32F472) + .b_session_valid_override = true, +#endif +}; -uint32_t usbd_get_dwc2_gccfg_conf(uint32_t reg_base) +#if defined(HC32F4A0) || defined(HC32F4A8) +const struct dwc2_user_params param_hs_core = { +#ifdef CONFIG_USB_HS + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, +#else + .phy_type = DWC2_PHY_TYPE_PARAM_FS, +#endif +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = CONFIG_USB_HS_CORE_DEVICE_RX_FIFO_SIZE, + .device_tx_fifo_size = { + [0] = CONFIG_USB_HS_CORE_DEVICE_TX0_FIFO_SIZE, + [1] = CONFIG_USB_HS_CORE_DEVICE_TX1_FIFO_SIZE, + [2] = CONFIG_USB_HS_CORE_DEVICE_TX2_FIFO_SIZE, + [3] = CONFIG_USB_HS_CORE_DEVICE_TX3_FIFO_SIZE, + [4] = CONFIG_USB_HS_CORE_DEVICE_TX4_FIFO_SIZE, + [5] = CONFIG_USB_HS_CORE_DEVICE_TX5_FIFO_SIZE, + [6] = CONFIG_USB_HS_CORE_DEVICE_TX6_FIFO_SIZE, + [7] = CONFIG_USB_HS_CORE_DEVICE_TX7_FIFO_SIZE, + [8] = CONFIG_USB_HS_CORE_DEVICE_TX8_FIFO_SIZE, + [9] = CONFIG_USB_HS_CORE_DEVICE_TX9_FIFO_SIZE, + [10] = CONFIG_USB_HS_CORE_DEVICE_TX10_FIFO_SIZE, + [11] = CONFIG_USB_HS_CORE_DEVICE_TX11_FIFO_SIZE, + [12] = CONFIG_USB_HS_CORE_DEVICE_TX12_FIFO_SIZE, + [13] = CONFIG_USB_HS_CORE_DEVICE_TX13_FIFO_SIZE, + [14] = CONFIG_USB_HS_CORE_DEVICE_TX14_FIFO_SIZE, + [15] = CONFIG_USB_HS_CORE_DEVICE_TX15_FIFO_SIZE + }, + .total_fifo_size = CONFIG_USB_HS_CORE_TOTAL_FIFO_SIZE, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = CONFIG_USB_HS_CORE_HOST_RX_FIFO_SIZE, + .host_nperio_tx_fifo_size = CONFIG_USB_HS_CORE_HOST_NP_FIFO_SIZE, + .host_perio_tx_fifo_size = CONFIG_USB_HS_CORE_HOST_PE_FIFO_SIZE, + .device_gccfg = 0, + .host_gccfg = 0, + .b_session_valid_override = false, +}; +#endif - USB_OTG_GLB->GOTGCTL |= USB_OTG_GOTGCTL_BVALOEN; - USB_OTG_GLB->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL; - return 0; +#ifndef CONFIG_USB_DWC2_CUSTOM_PARAM +void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) +{ +#if defined(HC32F4A0) || defined(HC32F4A8) + if (reg_base == CM_USBHS_BASE) + { + memcpy(params, ¶m_hs_core, sizeof(struct dwc2_user_params)); + } + else +#endif + { + memcpy(params, ¶m_fs_core, sizeof(struct dwc2_user_params)); + } +#ifdef CONFIG_USB_DWC2_CUSTOM_FIFO + struct usb_dwc2_user_fifo_config s_dwc2_fifo_config; + + dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config); + + params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size; + for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++) + { + params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i]; + } +#endif } +#endif -uint32_t usbh_get_dwc2_gccfg_conf(uint32_t reg_base) +#define BOARD_INIT_USB_HOST_MODE (0U) +#define BOARD_INIT_USB_DEVICE_MODE (1U) +extern rt_err_t rt_hw_usbfs_board_init(uint8_t devmode); +static uint8_t g_usb_fs_busid = 0U; +#if defined(HC32F4A0) || defined(HC32F4A8) + extern rt_err_t rt_hw_usbhs_board_init(uint8_t devmode); + static uint8_t g_usb_hs_busid = 0U; +#endif + +#if defined(RT_CHERRYUSB_HOST) +static void usbh_fs_irq_handler(void) { - USB_OTG_GLB->GOTGCTL &= ~USB_OTG_GOTGCTL_BVALOEN; - USB_OTG_GLB->GOTGCTL &= ~USB_OTG_GOTGCTL_BVALOVAL; - return 0; + USBH_IRQHandler(g_usb_fs_busid); } +#if defined(HC32F4A0) || defined(HC32F4A8) +static void usbh_hs_irq_handler(void) +{ + USBH_IRQHandler(g_usb_hs_busid); +} +#endif + +#if defined(HC32F472) +void USBFS_Handler(void) +{ + usbh_fs_irq_handler(); +} +#endif + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + struct hc32_irq_config irq_config; + +#if defined(HC32F4A0) || defined(HC32F4A8) + if (bus->hcd.reg_base == CM_USBHS_BASE) + { + g_usb_hs_busid = bus->hcd.hcd_id; + + rt_hw_usbhs_board_init(BOARD_INIT_USB_HOST_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBHS, ENABLE); +#ifndef CONFIG_USB_HS + /* enable the embedded PHY in USBHS mode */ + CM_PERIC->USB_SYCTLREG |= PERIC_USB_SYCTLREG_USBHS_FSPHYE; +#endif + + irq_config.irq_num = BSP_USBHS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBHS_GLB; + irq_config.irq_prio = BSP_USBHS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbh_hs_irq_handler, + RT_TRUE); + } + else +#endif + { + g_usb_fs_busid = bus->hcd.hcd_id; + + rt_hw_usbfs_board_init(BOARD_INIT_USB_HOST_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBFS, ENABLE); + + irq_config.irq_num = BSP_USBFS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBFS_GLB; + irq_config.irq_prio = BSP_USBFS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbh_fs_irq_handler, + RT_TRUE); + } + +} +#endif + +#if defined(RT_CHERRYUSB_DEVICE) +static void usbd_fs_irq_handler(void) +{ + USBD_IRQHandler(g_usb_fs_busid); +} + +#if defined(HC32F4A0) || defined(HC32F4A8) +static void usbd_hs_irq_handler(void) +{ + USBD_IRQHandler(g_usb_hs_busid); +} +#endif + +#if defined(HC32F472) +void USBFS_Handler(void) +{ + usbd_fs_irq_handler(); +} +#endif + +void usb_dc_low_level_init(uint8_t busid) +{ + struct hc32_irq_config irq_config; + +#if defined(HC32F4A0) || defined(HC32F4A8) + if (g_usbdev_bus[busid].reg_base == CM_USBHS_BASE) + { + g_usb_hs_busid = busid; + + rt_hw_usbhs_board_init(BOARD_INIT_USB_DEVICE_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBHS, ENABLE); + +#ifndef CONFIG_USB_HS + /* enable the embedded PHY in USBHS mode */ + CM_PERIC->USB_SYCTLREG |= PERIC_USB_SYCTLREG_USBHS_FSPHYE; +#endif + + irq_config.irq_num = BSP_USBHS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBHS_GLB; + irq_config.irq_prio = BSP_USBHS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbd_hs_irq_handler, + RT_TRUE); + } + else +#endif + { + g_usb_fs_busid = busid; + + rt_hw_usbfs_board_init(BOARD_INIT_USB_DEVICE_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBFS, ENABLE); + + irq_config.irq_num = BSP_USBFS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBFS_GLB; + irq_config.irq_prio = BSP_USBFS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbd_fs_irq_handler, + RT_TRUE); + } +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + (void)busid; + /* reserved */ +} + +#endif + extern uint32_t SystemCoreClock; void usbd_dwc2_delay_ms(uint8_t ms) @@ -34,3 +301,8 @@ void usbd_dwc2_delay_ms(uint8_t ms) __asm volatile("nop"); } } + +uint32_t usbd_dwc2_get_system_clock(void) +{ + return SystemCoreClock; +} diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c new file mode 100644 index 0000000000..19239ec891 --- /dev/null +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2026, sakumisu + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_dwc2_param.h" +#include "rtthread.h" +#include "cybsp.h" + +#if defined (COMPONENT_CM55) + +#if defined(CONFIG_USB_DWC2_DMA_ENABLE) && !defined(CONFIG_USB_DCACHE_ENABLE) +#error "Please enable CONFIG_USB_DCACHE_ENABLE and put USB_NOCACHE_RAM_SECTION to section ".cy_socmem_data" when using DMA" +#endif + +#else +#define CONFIG_USB_DWC2_DMA_ENABLE +#endif + +const struct dwc2_user_params param_common = { + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = 0x21F, + .device_tx_fifo_size = { + [0] = 16, // 64 byte + [1] = 0x300, // 1024 byte, tripple buffer + [2] = 0x300, // 1024 byte, tripple buffer + [3] = 0x300, // 1024 byte, tripple buffer + [4] = 0x300, // 1024 byte, tripple buffer + [5] = 0x300, // 1024 byte, tripple buffer + [6] = 0x300, // 1024 byte, tripple buffer + [7] = 0x300, // 1024 byte, tripple buffer + [8] = 0x300, // 1024 byte, tripple buffer + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 }, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = 0x21F, + .host_nperio_tx_fifo_size = 0x100, // 512 byte, double buffer + .host_perio_tx_fifo_size = 0x400, // 1024 byte, four buffer + + .device_gccfg = 0, + .host_gccfg = 0 +}; + +#ifndef CONFIG_USB_DWC2_CUSTOM_PARAM +void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) +{ + memcpy(params, ¶m_common, sizeof(struct dwc2_user_params)); +#ifdef CONFIG_USB_DWC2_CUSTOM_FIFO + struct usb_dwc2_user_fifo_config s_dwc2_fifo_config; + + dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config); + + params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size; + for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++) { + params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i]; + } +#endif +} +#endif + +void USBHS_DEVICE_IRQHandler(void) +{ + USBD_IRQHandler(0); +} + +void usb_dc_low_level_init(uint8_t busid) +{ + USBHS_SS->SUBSYSTEM_CTL = (1 << USBHS_SS_SUBSYSTEM_CTL_AHB_MASTER_SYNC_Pos) | USBHS_SS_SUBSYSTEM_CTL_SS_ENABLE_Msk; + USBHS_SS->PHY_FUNC_CTL_1 |= (7 << USBHS_SS_PHY_FUNC_CTL_1_PLL_FSEL_Pos); + USBHS_SS->PHY_FUNC_CTL_2 |= (USBHS_SS_PHY_FUNC_CTL_2_RES_TUNING_SEL_Msk | USBHS_SS_PHY_FUNC_CTL_2_EFUSE_SEL_Msk); + + cy_stc_sysint_t usb_int_cfg = { + .intrSrc = usbhs_interrupt_usbhsctrl_IRQn, + .intrPriority = 3 + }; + + /* Install the interrupt service routine */ + Cy_SysInt_Init(&usb_int_cfg, USBHS_DEVICE_IRQHandler); + + NVIC_EnableIRQ(usbhs_interrupt_usbhsctrl_IRQn); +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + NVIC_DisableIRQ(usbhs_interrupt_usbhsctrl_IRQn); +} + +void usbd_dwc2_delay_ms(uint8_t ms) +{ + rt_thread_mdelay(ms); +} + +uint32_t usbd_dwc2_get_system_clock(void) +{ + return SystemCoreClock; +} + +void USBHS_HOST_IRQHandler(void) +{ + USBH_IRQHandler(0); +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + USBHS_SS->SUBSYSTEM_CTL = (1 << USBHS_SS_SUBSYSTEM_CTL_AHB_MASTER_SYNC_Pos) | USBHS_SS_SUBSYSTEM_CTL_USB_MODE_Msk | USBHS_SS_SUBSYSTEM_CTL_SS_ENABLE_Msk; + USBHS_SS->PHY_FUNC_CTL_1 |= (7 << USBHS_SS_PHY_FUNC_CTL_1_PLL_FSEL_Pos); + USBHS_SS->PHY_FUNC_CTL_2 |= (USBHS_SS_PHY_FUNC_CTL_2_RES_TUNING_SEL_Msk | USBHS_SS_PHY_FUNC_CTL_2_EFUSE_SEL_Msk); + + cy_stc_sysint_t usb_int_cfg = { + .intrSrc = usbhs_interrupt_usbhsctrl_IRQn, + .intrPriority = 3 + }; + + /* Install the interrupt service routine */ + Cy_SysInt_Init(&usb_int_cfg, USBHS_HOST_IRQHandler); + + NVIC_EnableIRQ(usbhs_interrupt_usbhsctrl_IRQn); +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + NVIC_DisableIRQ(usbhs_interrupt_usbhsctrl_IRQn); +} + +#ifdef CONFIG_USB_DCACHE_ENABLE +void usb_dcache_clean(uintptr_t addr, size_t size) +{ + SCB_CleanDCache_by_Addr((void *)addr, size); +} + +void usb_dcache_invalidate(uintptr_t addr, size_t size) +{ + SCB_InvalidateDCache_by_Addr((void *)addr, size); +} + +void usb_dcache_flush(uintptr_t addr, size_t size) +{ + SCB_CleanInvalidateDCache_by_Addr((void *)addr, size); +} +#endif diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_kendryte.c b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_kendryte.c index 36c7791eeb..4e111ddb95 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_kendryte.c +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_kendryte.c @@ -50,11 +50,7 @@ const uintptr_t usb_dev_addr[2] = { 0x91500000UL, 0x91540000UL }; const struct dwc2_user_params param_common = { .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, -#ifdef CONFIG_USB_DWC2_DMA_ENABLE .device_dma_enable = true, -#else - .device_dma_enable = false, -#endif .device_dma_desc_enable = false, .device_rx_fifo_size = (3016 - 16 - 256 * 8), .device_tx_fifo_size = { @@ -204,6 +200,11 @@ void usbd_dwc2_delay_ms(uint8_t ms) rt_thread_mdelay(ms); } +uint32_t usbd_dwc2_get_system_clock(void) +{ + return SystemCoreClock; +} + #ifdef CONFIG_USB_DCACHE_ENABLE void usb_dcache_clean(uintptr_t addr, size_t size) { diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_st.c b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_st.c index 5e6391fc2c..b766ca4b5d 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_st.c +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_st.c @@ -16,10 +16,10 @@ const struct dwc2_user_params param_pa11_pa12 = { .phy_type = DWC2_PHY_TYPE_PARAM_FS, .device_dma_enable = false, .device_dma_desc_enable = false, - .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_rx_fifo_size = (320 - 16 - 64 - 16 - 16), .device_tx_fifo_size = { [0] = 16, // 64 byte - [1] = 16, // 64 byte + [1] = 64, // 256 byte [2] = 16, // 64 byte [3] = 16, // 64 byte [4] = 0, @@ -50,10 +50,10 @@ const struct dwc2_user_params param_pa11_pa12 = { .phy_type = DWC2_PHY_TYPE_PARAM_FS, .device_dma_enable = false, .device_dma_desc_enable = false, - .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_rx_fifo_size = (320 - 16 - 64 - 16 - 16), .device_tx_fifo_size = { [0] = 16, // 64 byte - [1] = 16, // 64 byte + [1] = 64, // 256 byte [2] = 16, // 64 byte [3] = 16, // 64 byte [4] = 0, @@ -124,10 +124,10 @@ const struct dwc2_user_params param_pa11_pa12 = { .phy_type = DWC2_PHY_TYPE_PARAM_FS, .device_dma_enable = false, .device_dma_desc_enable = false, - .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_rx_fifo_size = (320 - 16 - 64 - 16 - 16), .device_tx_fifo_size = { [0] = 16, // 64 byte - [1] = 16, // 64 byte + [1] = 64, // 256 byte [2] = 16, // 64 byte [3] = 16, // 64 byte [4] = 0, @@ -212,10 +212,10 @@ const struct dwc2_user_params param_pa11_pa12 = { .phy_type = DWC2_PHY_TYPE_PARAM_FS, .device_dma_enable = false, .device_dma_desc_enable = false, - .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_rx_fifo_size = (320 - 16 - 64 - 16 - 16), .device_tx_fifo_size = { [0] = 16, // 64 byte - [1] = 16, // 64 byte + [1] = 64, // 256 byte [2] = 16, // 64 byte [3] = 16, // 64 byte [4] = 0, @@ -380,10 +380,10 @@ const struct dwc2_user_params param_pa11_pa12 = { .phy_type = DWC2_PHY_TYPE_PARAM_FS, .device_dma_enable = false, .device_dma_desc_enable = false, - .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_rx_fifo_size = (320 - 16 - 64 - 16 - 16), .device_tx_fifo_size = { [0] = 16, // 64 byte - [1] = 16, // 64 byte + [1] = 64, // 256 byte [2] = 16, // 64 byte [3] = 16, // 64 byte [4] = 0, @@ -446,10 +446,10 @@ const struct dwc2_user_params param_pa11_pa12 = { .phy_type = DWC2_PHY_TYPE_PARAM_FS, .device_dma_enable = false, .device_dma_desc_enable = false, - .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_rx_fifo_size = (320 - 16 - 64 - 16 - 16), .device_tx_fifo_size = { [0] = 16, // 64 byte - [1] = 16, // 64 byte + [1] = 64, // 256 byte [2] = 16, // 64 byte [3] = 16, // 64 byte [4] = 0, @@ -481,10 +481,10 @@ const struct dwc2_user_params param_pa11_pa12 = { .phy_type = DWC2_PHY_TYPE_PARAM_FS, .device_dma_enable = false, .device_dma_desc_enable = false, - .device_rx_fifo_size = (320 - 16 - 16 - 16 - 16), + .device_rx_fifo_size = (320 - 16 - 64 - 16 - 16), .device_tx_fifo_size = { [0] = 16, // 64 byte - [1] = 16, // 64 byte + [1] = 64, // 256 byte [2] = 16, // 64 byte [3] = 16, // 64 byte [4] = 0, @@ -722,6 +722,11 @@ void usbd_dwc2_delay_ms(uint8_t ms) } } +uint32_t usbd_dwc2_get_system_clock(void) +{ + return SystemCoreClock; +} + void OTG_FS_IRQHandler(void) { g_usb_dwc2_irq[0](g_usb_dwc2_busid[0]); diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_hc_dwc2.c b/components/drivers/usb/cherryusb/port/dwc2/usb_hc_dwc2.c index df706eda16..bf0adae571 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/usb_hc_dwc2.c +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_hc_dwc2.c @@ -339,22 +339,6 @@ static inline void dwc2_chan_enable_csplit(struct usbh_bus *bus, uint8_t ch_num, } } -static inline void dwc2_chan_reenable(struct usbh_bus *bus, uint8_t ch_num) -{ - __IO uint32_t tmpreg; - uint8_t is_oddframe; - - is_oddframe = (((uint32_t)USB_OTG_HOST->HFNUM & 0x01U) != 0U) ? 0U : 1U; - USB_OTG_HC(ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM; - USB_OTG_HC(ch_num)->HCCHAR |= (uint32_t)is_oddframe << 29; - - /* Set host channel enable */ - tmpreg = USB_OTG_HC(ch_num)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - tmpreg |= USB_OTG_HCCHAR_CHENA; - USB_OTG_HC(ch_num)->HCCHAR = tmpreg; -} - static void dwc2_halt(struct usbh_bus *bus, uint8_t ch_num) { volatile uint32_t ChannelEna = (USB_OTG_HC(ch_num)->HCCHAR & USB_OTG_HCCHAR_CHENA) >> 31; @@ -731,6 +715,13 @@ int usb_hc_init(struct usbh_bus *bus) /* Force Host Mode*/ dwc2_set_mode(bus, USB_OTG_MODE_HOST); + USB_ASSERT_MSG((USB_OTG_GLB->GRXFSIZ & 0xffff) >= g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_rx_fifo_size, + "host_rx_fifo_size cannot be larger than power_on_value %u", (unsigned int)(USB_OTG_GLB->GRXFSIZ & 0xffff)); + USB_ASSERT_MSG((USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ & 0xffff) >= g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_nperio_tx_fifo_size, + "host_nperio_tx_fifo_size cannot be larger than power_on_value %u", (unsigned int)(USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ & 0xffff)); + USB_ASSERT_MSG((USB_OTG_GLB->HPTXFSIZ & 0xffff) >= g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_perio_tx_fifo_size, + "host_perio_tx_fifo_size cannot be larger than power_on_value %u", (unsigned int)(USB_OTG_GLB->HPTXFSIZ & 0xffff)); + /* B-peripheral session valid override enable */ USB_OTG_GLB->GOTGCTL &= ~USB_OTG_GOTGCTL_BVALOEN; USB_OTG_GLB->GOTGCTL &= ~USB_OTG_GOTGCTL_BVALOVAL; @@ -745,13 +736,15 @@ int usb_hc_init(struct usbh_bus *bus) USB_OTG_HOST->HCFG &= ~USB_OTG_HCFG_FSLSPCS; if (g_dwc2_hcd[bus->hcd.hcd_id].user_params.phy_type == DWC2_PHY_TYPE_PARAM_FS) { + bus->hcd.roothub.speed = USB_SPEED_FULL; USB_OTG_HOST->HCFG |= USB_OTG_HCFG_FSLSPCLKSEL_48_MHZ; } else { + bus->hcd.roothub.speed = USB_SPEED_HIGH; USB_OTG_HOST->HCFG |= USB_OTG_HCFG_FSLSPCLKSEL_30_60_MHZ; } if (g_dwc2_hcd[bus->hcd.hcd_id].hw_params.snpsid > 0x4F54292AU) { - USB_OTG_HOST->HCFG |= USB_OTG_HFIR_RELOAD_CTRL; + USB_OTG_HOST->HFIR |= USB_OTG_HFIR_RELOAD_CTRL; } /* Clear all pending HC Interrupts */ @@ -766,7 +759,7 @@ int usb_hc_init(struct usbh_bus *bus) /* Clear any pending interrupts */ USB_OTG_GLB->GINTSTS = 0xFFFFFFFFU; - /* set Rx FIFO size */ + /* set FIFO size */ USB_OTG_GLB->GRXFSIZ = g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_rx_fifo_size; USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_nperio_tx_fifo_size << 16) & USB_OTG_NPTXFD) | g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_rx_fifo_size); @@ -794,36 +787,14 @@ int usb_hc_init(struct usbh_bus *bus) int usb_hc_deinit(struct usbh_bus *bus) { - volatile uint32_t count = 0U; - uint32_t value; - USB_OTG_GLB->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; dwc2_flush_txfifo(bus, 0x10U); dwc2_flush_rxfifo(bus); /* Flush out any leftover queued requests. */ - for (uint32_t i = 0U; i < g_dwc2_hcd[bus->hcd.hcd_id].hw_params.host_channels; i++) { - value = USB_OTG_HC(i)->HCCHAR; - value |= USB_OTG_HCCHAR_CHDIS; - value &= ~USB_OTG_HCCHAR_CHENA; - value &= ~USB_OTG_HCCHAR_EPDIR; - USB_OTG_HC(i)->HCCHAR = value; - } - - /* Halt all channels to put them into a known state. */ - for (uint32_t i = 0U; i < g_dwc2_hcd[bus->hcd.hcd_id].hw_params.host_channels; i++) { - value = USB_OTG_HC(i)->HCCHAR; - value |= USB_OTG_HCCHAR_CHDIS; - value |= USB_OTG_HCCHAR_CHENA; - value &= ~USB_OTG_HCCHAR_EPDIR; - USB_OTG_HC(i)->HCCHAR = value; - - do { - if (++count > 1000U) { - return -USB_ERR_TIMEOUT; - } - } while ((USB_OTG_HC(i)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); + for (uint8_t chidx = 0; chidx < g_dwc2_hcd[bus->hcd.hcd_id].hw_params.host_channels; chidx++) { + dwc2_halt(bus, chidx); } /* Disable all interrupts. */ @@ -1235,12 +1206,15 @@ static void dwc2_inchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num) /* restart ssplit transfer */ switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { case USB_ENDPOINT_TYPE_CONTROL: + chan->do_csplit = 0; + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length); + break; case USB_ENDPOINT_TYPE_BULK: chan->do_csplit = 0; - dwc2_chan_enable_csplit(bus, ch_num, false); - dwc2_chan_reenable(bus, ch_num); + dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length); break; case USB_ENDPOINT_TYPE_INTERRUPT: + chan->do_csplit = 0; dwc2_chan_enable_csplit(bus, ch_num, false); urb->errorcode = -USB_ERR_NAK; dwc2_urb_waitup(urb); @@ -1255,17 +1229,39 @@ static void dwc2_inchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num) } } else if (chan_intstatus & USB_OTG_HCINT_ACK) { if (chan->do_ssplit) { - /* start ssplit transfer */ + /* start csplit transfer */ chan->do_csplit = 1; chan->ssplit_frame = dwc2_get_full_frame_num(bus); - dwc2_chan_enable_csplit(bus, ch_num, true); - dwc2_chan_reenable(bus, ch_num); + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length); + break; + case USB_ENDPOINT_TYPE_BULK: + case USB_ENDPOINT_TYPE_INTERRUPT: + dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length); + break; + + default: + break; + } } } else if (chan_intstatus & USB_OTG_HCINT_NYET) { if (chan->do_ssplit) { /* restart csplit transfer */ - dwc2_chan_enable_csplit(bus, ch_num, true); - dwc2_chan_reenable(bus, ch_num); + chan->do_csplit = 1; + chan->ssplit_frame = dwc2_get_full_frame_num(bus); + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length); + break; + case USB_ENDPOINT_TYPE_BULK: + case USB_ENDPOINT_TYPE_INTERRUPT: + dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length); + break; + + default: + break; + } } else { urb->errorcode = -USB_ERR_NAK; dwc2_urb_waitup(urb); @@ -1372,12 +1368,15 @@ static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num) /* restart ssplit transfer */ switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { case USB_ENDPOINT_TYPE_CONTROL: + chan->do_csplit = 0; + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length); + break; case USB_ENDPOINT_TYPE_BULK: chan->do_csplit = 0; - dwc2_chan_enable_csplit(bus, ch_num, false); - dwc2_chan_reenable(bus, ch_num); + dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length); break; case USB_ENDPOINT_TYPE_INTERRUPT: + chan->do_csplit = 0; dwc2_chan_enable_csplit(bus, ch_num, false); urb->errorcode = -USB_ERR_NAK; dwc2_urb_waitup(urb); @@ -1392,17 +1391,39 @@ static void dwc2_outchan_irq_handler(struct usbh_bus *bus, uint8_t ch_num) } } else if (chan_intstatus & USB_OTG_HCINT_ACK) { if (chan->do_ssplit) { - /* start ssplit transfer */ + /* start csplit transfer */ chan->do_csplit = 1; chan->ssplit_frame = dwc2_get_full_frame_num(bus); - dwc2_chan_enable_csplit(bus, ch_num, true); - dwc2_chan_reenable(bus, ch_num); + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length); + break; + case USB_ENDPOINT_TYPE_BULK: + case USB_ENDPOINT_TYPE_INTERRUPT: + dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length); + break; + + default: + break; + } } } else if (chan_intstatus & USB_OTG_HCINT_NYET) { if (chan->do_ssplit) { /* restart csplit transfer */ - dwc2_chan_enable_csplit(bus, ch_num, true); - dwc2_chan_reenable(bus, ch_num); + chan->do_csplit = 1; + chan->ssplit_frame = dwc2_get_full_frame_num(bus); + switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { + case USB_ENDPOINT_TYPE_CONTROL: + dwc2_control_urb_init(bus, ch_num, urb, urb->setup, urb->transfer_buffer + urb->actual_length - 8, urb->transfer_buffer_length); + break; + case USB_ENDPOINT_TYPE_BULK: + case USB_ENDPOINT_TYPE_INTERRUPT: + dwc2_bulk_intr_urb_init(bus, ch_num, urb, urb->transfer_buffer + urb->actual_length, urb->transfer_buffer_length); + break; + + default: + break; + } } else { urb->errorcode = -USB_ERR_NAK; dwc2_urb_waitup(urb); diff --git a/components/drivers/usb/cherryusb/port/ehci/usb_glue_aic.c b/components/drivers/usb/cherryusb/port/ehci/usb_glue_aic.c index 500bc02a40..2db67bc573 100644 --- a/components/drivers/usb/cherryusb/port/ehci/usb_glue_aic.c +++ b/components/drivers/usb/cherryusb/port/ehci/usb_glue_aic.c @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2022, Artinchip Technology Co., Ltd * * SPDX-License-Identifier: Apache-2.0 @@ -46,37 +46,31 @@ typedef struct aic_ehci_config { uint32_t phy_clk_id; uint32_t phy_rst_id; uint32_t irq_num; -}aic_ehci_config_t; +} aic_ehci_config_t; aic_ehci_config_t config[] = { #ifdef AIC_USING_USB0_HOST - { - USB_HOST0_BASE, - CLK_USBH0, - RESET_USBH0, - CLK_USB_PHY0, - RESET_USBPHY0, - USB_HOST0_EHCI_IRQn - }, + { USB_HOST0_BASE, + CLK_USBH0, + RESET_USBH0, + CLK_USB_PHY0, + RESET_USBPHY0, + USB_HOST0_EHCI_IRQn }, #else - { - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF - }, + { 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF }, #endif #ifdef AIC_USING_USB1_HOST - { - USB_HOST1_BASE, - CLK_USBH1, - RESET_USBH1, - CLK_USB_PHY1, - RESET_USBPHY1, - USB_HOST1_EHCI_IRQn - } + { USB_HOST1_BASE, + CLK_USBH1, + RESET_USBH1, + CLK_USB_PHY1, + RESET_USBPHY1, + USB_HOST1_EHCI_IRQn } #endif }; @@ -85,12 +79,12 @@ void usb_hc_low_level_init(struct usbh_bus *bus) uint32_t val; int i = 0; - for (i=0; ihcd.reg_base == config[i].base_addr) break; } - if (i == sizeof(config)/sizeof(aic_ehci_config_t)) + if (i == sizeof(config) / sizeof(aic_ehci_config_t)) return; /* set usb0 phy switch: Host/Device */ @@ -109,20 +103,20 @@ void usb_hc_low_level_init(struct usbh_bus *bus) aicos_udelay(300); /* set phy type: UTMI/ULPI */ - val = readl((volatile void *)(unsigned long)(config[i].base_addr+0x800)); + val = readl((volatile void *)(unsigned long)(config[i].base_addr + 0x800)); #ifdef FPGA_BOARD_ARTINCHIP /* fpga phy type = ULPI */ - writel((val & ~0x1U), (volatile void *)(unsigned long)(config[i].base_addr+0x800)); + writel((val & ~0x1U), (volatile void *)(unsigned long)(config[i].base_addr + 0x800)); #else /* board phy type = UTMI */ - writel((val | 0x1), (volatile void *)(unsigned long)(config[i].base_addr+0x800)); + writel((val | 0x1), (volatile void *)(unsigned long)(config[i].base_addr + 0x800)); #endif /* Set AHB2STBUS_INSREG01 Set EHCI packet buffer IN/OUT threshold (in DWORDs) Must increase the OUT threshold to avoid underrun. (FIFO size - 4) */ - writel((32 | (127 << 16)), (volatile void *)(unsigned long)(config[i].base_addr+0x94)); + writel((32 | (127 << 16)), (volatile void *)(unsigned long)(config[i].base_addr + 0x94)); /* register interrupt callback */ aicos_request_irq(config[i].irq_num, (irq_handler_t)aic_ehci_isr, @@ -160,12 +154,12 @@ int __usbh_init(void) #endif #ifdef AIC_USING_USB0_HOST - usbh_initialize(bus_id, USB_HOST0_BASE); + usbh_initialize(bus_id, USB_HOST0_BASE, NULL); bus_id++; #endif #ifdef AIC_USING_USB1_HOST - usbh_initialize(bus_id, USB_HOST1_BASE); + usbh_initialize(bus_id, USB_HOST1_BASE, NULL); bus_id++; #endif return 0; diff --git a/components/drivers/usb/cherryusb/port/ehci/usb_glue_t113.c b/components/drivers/usb/cherryusb/port/ehci/usb_glue_t113.c index 0c99897fd5..ec46dea61d 100644 --- a/components/drivers/usb/cherryusb/port/ehci/usb_glue_t113.c +++ b/components/drivers/usb/cherryusb/port/ehci/usb_glue_t113.c @@ -1,18 +1,27 @@ /* - * Copyright (c) 2025, YC113 + * Copyright (c) 2026, HakumenJean * * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-06 HakumenJean first version */ + +#include +#include +#include +#include + #include "usbh_core.h" #include "usb_hc_ehci.h" - #ifdef CONFIG_USB_EHCI_WITH_OHCI #include "usb_hc_ohci.h" #endif +#include "hal_clk.h" +#include "hal_reset.h" #include "interrupt.h" -#include "drv_reg_base.h" -#include "drv_clock.h" #if CONFIG_USBHOST_MAX_BUS != 2 #error "t113 has 2 usb host controller" @@ -34,6 +43,13 @@ #error "t113 usb ehci no iso register" #endif +#define USB0_OTG_BASE_ADDR (0x04100000U) +#define USB0_PHY_BASE_ADDR (0x04100400U) +#define USB0_EHCI_BASE_ADDR (0x04101000U) + +#define USB1_EHCI_BASE_ADDR (0x04200000U) +#define USB1_PHY_BASE_ADDR (0x04200800U) + void usb_select_phyTohci(void) { *(volatile rt_uint32_t *)(USB0_OTG_BASE_ADDR + 0x420) &= ~(1 << 0); @@ -41,55 +57,52 @@ void usb_select_phyTohci(void) void usb_gate_open(rt_uint8_t busid) { - rt_uint32_t addr; - - addr = (rt_uint32_t)&CCU->usb0_clk + busid * 4; - - if(busid == 0) { + if (busid == 0) { /* otg gate open*/ - CCU->usb_bgr |= 1 << 8; + hal_clock_enable(hal_clock_get(HAL_SUNXI_CCU, CLK_BUS_OTG)); /* otg bus reset */ - CCU->usb_bgr &= ~(1 << 24); - sdelay(10); - CCU->usb_bgr |= (1 << 24); - sdelay(10); - } + hal_reset_control_reset(hal_reset_control_get(HAL_SUNXI_RESET, RST_BUS_OTG)); + + /* ehci gate open */ + hal_clock_enable(hal_clock_get(HAL_SUNXI_CCU, CLK_BUS_EHCI0)); + + /* ehci bus reset */ + hal_reset_control_reset(hal_reset_control_get(HAL_SUNXI_RESET, RST_BUS_EHCI0)); + + /* ohci gate open */ + hal_clock_enable(hal_clock_get(HAL_SUNXI_CCU, CLK_BUS_OHCI0)); - /* ehci gate open */ - CCU->usb_bgr |= (1 << 4) << busid; + /* ohci bus reset */ + hal_reset_control_reset(hal_reset_control_get(HAL_SUNXI_RESET, RST_BUS_OHCI0)); - /* ehci bus reset */ - CCU->usb_bgr &= ~((1 << 20) << busid); - sdelay(10); - CCU->usb_bgr |= (1 << 20) << busid; - sdelay(10); + /* clock enable */ + hal_clock_enable(hal_clock_get(HAL_SUNXI_CCU, CLK_USB_OHCI0)); - /* ohci gate open */ - CCU->usb_bgr |= 1 << busid; + /* reset phy */ + hal_reset_control_reset(hal_reset_control_get(HAL_SUNXI_RESET, RST_USB_PHY0)); - /* ohci bus reset */ - CCU->usb_bgr &= ~((1 << 16) << busid); - sdelay(10); - CCU->usb_bgr |= (1 << 16) << busid; - sdelay(10); + /* otg phy select */ + usb_select_phyTohci(); + } else { + /* ehci gate open */ + hal_clock_enable(hal_clock_get(HAL_SUNXI_CCU, CLK_BUS_EHCI1)); - sdelay(10); + /* ehci bus reset */ + hal_reset_control_reset(hal_reset_control_get(HAL_SUNXI_RESET, RST_BUS_EHCI1)); - /* clock enable */ - *(volatile rt_uint32_t *)addr &= ~(3 << 24); - *(volatile rt_uint32_t *)addr |= (1 << 31) | (1 << 24); + /* ohci gate open */ + hal_clock_enable(hal_clock_get(HAL_SUNXI_CCU, CLK_BUS_OHCI1)); - /* reset phy */ - *(volatile rt_uint32_t *)addr &= ~(1 << 30); - sdelay(10); - *(volatile rt_uint32_t *)addr |= 1 << 30; - sdelay(10); + /* ohci bus reset */ + hal_reset_control_reset(hal_reset_control_get(HAL_SUNXI_RESET, RST_BUS_OHCI1)); - /* otg phy select */ - if(busid == 0) usb_select_phyTohci(); + /* clock enable */ + hal_clock_enable(hal_clock_get(HAL_SUNXI_CCU, CLK_USB_OHCI1)); - USB_LOG_DBG("usb%d gate : %X, clock : %X\n", busid, CCU->usb_bgr, *(volatile rt_uint32_t *)addr); + /* reset phy */ + hal_reset_control_reset(hal_reset_control_get(HAL_SUNXI_RESET, RST_USB_PHY1)); + } } void usb_clean_siddp(struct usbh_bus *bus) @@ -109,10 +122,10 @@ void usb_hci_set_passby(struct usbh_bus *bus) void t113_ehci_isr(int vector, void *arg) { - rt_interrupt_enter(); - struct usbh_bus *bus = (struct usbh_bus *)arg; + rt_interrupt_enter(); + USB_LOG_DBG("t113_ehci_isr"); extern void USBH_IRQHandler(uint8_t busid); @@ -125,10 +138,10 @@ void t113_ehci_isr(int vector, void *arg) void t113_ohci_isr(int vector, void *arg) { - rt_interrupt_enter(); - struct usbh_bus *bus = (struct usbh_bus *)arg; + rt_interrupt_enter(); + USB_LOG_DBG("t113_ohci_isr"); extern void OHCI_IRQHandler(uint8_t busid); @@ -149,8 +162,9 @@ void usb_hc_low_level_init(struct usbh_bus *bus) usb_hci_set_passby(bus); /* register EHCI interrupt callback */ - vector = T113_IRQ_USB0_EHCI + (bus->busid > 0 ? 3 : 0); + vector = SUNXI_IRQ_USB0_EHCI + (bus->busid > 0 ? 3 : 0); rt_hw_interrupt_install(vector, t113_ehci_isr, bus, RT_NULL); + rt_hw_interrupt_set_priority(vector, 11 << 4); rt_hw_interrupt_umask(vector); /* register OHCI interrupt callback */ @@ -183,12 +197,12 @@ int __usbh_init(void) { #ifdef T113_USING_USB0_HOST /* USB0 MSC test OK */ - usbh_initialize(0, USB0_BASE_ADDR); + usbh_initialize(0, USB0_EHCI_BASE_ADDR, NULL); #endif #ifdef T113_USING_USB1_HOST /* USB1 MSC test OK */ - usbh_initialize(1, USB1_BASE_ADDR); + usbh_initialize(1, USB1_EHCI_BASE_ADDR, NULL); #endif return 0; } @@ -196,8 +210,26 @@ int __usbh_init(void) #ifdef PKG_CHERRYUSB_HOST #include +#include #include INIT_ENV_EXPORT(__usbh_init); +#ifdef CONFIG_USB_DCACHE_ENABLE +void usb_dcache_clean(uintptr_t addr, size_t size) +{ + rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void *)addr, size); +} + +void usb_dcache_invalidate(uintptr_t addr, size_t size) +{ + rt_hw_cpu_dcache_ops(RT_HW_CACHE_INVALIDATE, (void *)addr, size); +} + +void usb_dcache_flush(uintptr_t addr, size_t size) +{ + rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void *)addr, size); +} +#endif + #endif diff --git a/components/drivers/usb/cherryusb/port/ehci/usb_hc_ehci.c b/components/drivers/usb/cherryusb/port/ehci/usb_hc_ehci.c index 2ebe11347c..fd72907f89 100644 --- a/components/drivers/usb/cherryusb/port/ehci/usb_hc_ehci.c +++ b/components/drivers/usb/cherryusb/port/ehci/usb_hc_ehci.c @@ -774,6 +774,8 @@ int usb_hc_init(struct usbh_bus *bus) volatile uint32_t timeout = 0; uint32_t regval; + bus->hcd.roothub.speed = USB_SPEED_HIGH; + memset(&g_ehci_hcd[bus->hcd.hcd_id], 0, sizeof(struct ehci_hcd)); memset(ehci_qh_pool[bus->hcd.hcd_id], 0, sizeof(struct ehci_qh_hw) * CONFIG_USB_EHCI_QH_NUM); memset(ehci_qtd_pool[bus->hcd.hcd_id], 0, sizeof(struct ehci_qtd_hw) * CONFIG_USB_EHCI_QTD_NUM); @@ -1337,6 +1339,7 @@ int usbh_kill_urb(struct usbh_urb *urb) EHCI_HCOR->usbcmd |= (EHCI_USBCMD_PSEN | EHCI_USBCMD_ASEN); qh = (struct ehci_qh_hw *)urb->hcpriv; + qh->remove_in_iaad = 0; urb->errorcode = -USB_ERR_SHUTDOWN; if (urb->timeout) { @@ -1347,6 +1350,7 @@ int usbh_kill_urb(struct usbh_urb *urb) if (remove_in_iaad) { volatile uint32_t timeout = 0; + EHCI_HCOR->usbsts = EHCI_USBSTS_IAA; EHCI_HCOR->usbcmd |= EHCI_USBCMD_IAAD; while (!(EHCI_HCOR->usbsts & EHCI_USBSTS_IAA)) { timeout++; diff --git a/components/drivers/usb/cherryusb/port/hpmicro/usb_dc_hpm.c b/components/drivers/usb/cherryusb/port/hpmicro/usb_dc_hpm.c index 09896549ab..a3a9fdc10d 100644 --- a/components/drivers/usb/cherryusb/port/hpmicro/usb_dc_hpm.c +++ b/components/drivers/usb/cherryusb/port/hpmicro/usb_dc_hpm.c @@ -102,7 +102,9 @@ int usb_dc_init(uint8_t busid) #endif usb_device_init(g_hpm_udc[busid].handle, int_mask); - +#ifdef CONFIG_USB_OTG_ENABLE + usb_otgsc_enable_id_chg_int(g_hpm_udc[busid].handle->regs); +#endif usb_dc_isr_connect(busid); return 0; @@ -240,10 +242,15 @@ int usbd_ep_start_write(uint8_t busid, const uint8_t ep, const uint8_t *data, ui return -2; } +#ifdef CONFIG_USB_DCACHE_ENABLE + USB_ASSERT_MSG(!((uintptr_t)data % CONFIG_USB_ALIGN_SIZE), "data is not aligned %d", CONFIG_USB_ALIGN_SIZE); +#endif + g_hpm_udc[busid].in_ep[ep_idx].xfer_buf = (uint8_t *)data; g_hpm_udc[busid].in_ep[ep_idx].xfer_len = data_len; g_hpm_udc[busid].in_ep[ep_idx].actual_xfer_len = 0; + usb_dcache_clean((uintptr_t)data, USB_ALIGN_UP(data_len, CONFIG_USB_ALIGN_SIZE)); usb_device_edpt_xfer(handle, ep, (uint8_t *)data, data_len); return 0; @@ -261,10 +268,15 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t return -2; } +#ifdef CONFIG_USB_DCACHE_ENABLE + USB_ASSERT_MSG(!((uintptr_t)data % CONFIG_USB_ALIGN_SIZE), "data is not aligned %d", CONFIG_USB_ALIGN_SIZE); +#endif + g_hpm_udc[busid].out_ep[ep_idx].xfer_buf = (uint8_t *)data; g_hpm_udc[busid].out_ep[ep_idx].xfer_len = data_len; g_hpm_udc[busid].out_ep[ep_idx].actual_xfer_len = 0; + usb_dcache_invalidate((uintptr_t)data, USB_ALIGN_UP(data_len, CONFIG_USB_ALIGN_SIZE)); usb_device_edpt_xfer(handle, ep, data, data_len); return 0; @@ -297,7 +309,7 @@ void USBD_IRQHandler(uint8_t busid) memset(g_hpm_udc[busid].in_ep, 0, sizeof(struct hpm_ep_state) * USB_NUM_BIDIR_ENDPOINTS); memset(g_hpm_udc[busid].out_ep, 0, sizeof(struct hpm_ep_state) * USB_NUM_BIDIR_ENDPOINTS); usbd_event_reset_handler(busid); - usb_device_bus_reset(handle, 64); + usb_device_bus_reset(handle, g_hpm_udc[busid].in_ep[0].ep_mps); } if (int_status & intr_suspend) { @@ -362,6 +374,7 @@ void USBD_IRQHandler(uint8_t busid) if (ep_addr & 0x80) { usbd_event_ep_in_complete_handler(busid, ep_addr, transfer_len); } else { + usb_dcache_invalidate((uintptr_t)g_hpm_udc[busid].out_ep[ep_idx].xfer_buf, USB_ALIGN_UP(transfer_len, CONFIG_USB_ALIGN_SIZE)); usbd_event_ep_out_complete_handler(busid, ep_addr, transfer_len); } } diff --git a/components/drivers/usb/cherryusb/port/hpmicro/usb_glue_hpm.c b/components/drivers/usb/cherryusb/port/hpmicro/usb_glue_hpm.c index 51aa9aa452..aa5f9cec66 100644 --- a/components/drivers/usb/cherryusb/port/hpmicro/usb_glue_hpm.c +++ b/components/drivers/usb/cherryusb/port/hpmicro/usb_glue_hpm.c @@ -7,11 +7,73 @@ #include "hpm_common.h" #include "hpm_soc.h" #include "hpm_l1c_drv.h" +#include "hpm_usb_drv.h" #include "usb_config.h" void (*g_usb_hpm_irq[2])(uint8_t busid); uint8_t g_usb_hpm_busid[2]; +#ifndef CONFIG_CHERRYUSB_CUSTOM_IRQ_HANDLER +SDK_DECLARE_EXT_ISR_M(IRQn_USB0, hpm_isr_usb0) +#ifdef HPM_USB1_BASE +SDK_DECLARE_EXT_ISR_M(IRQn_USB1, hpm_isr_usb1) +#endif +#endif + +#ifdef CONFIG_USB_OTG_ENABLE +#include "usbotg_core.h" +int usb_otg_init(uint8_t busid) +{ + (void)busid; + + return 0; +} + +int usb_otg_deinit(uint8_t busid) +{ + (void)busid; + + return 0; +} + +void hpm_isr_usb0(void) +{ + if (usb_otgsc_get_id_chg_flag(HPM_USB0)) { + usb_otgsc_clear_id_chg_flag(HPM_USB0); + usbotg_trigger_role_change(g_usb_hpm_busid[0], usb_otgsc_get_id_status(HPM_USB0) ? USBOTG_MODE_DEVICE : USBOTG_MODE_HOST); + } + + USBOTG_IRQHandler(g_usb_hpm_busid[0]); +} + +#ifdef HPM_USB1_BASE +void hpm_isr_usb1(void) +{ + if (usb_otgsc_get_id_chg_flag(HPM_USB1)) { + usb_otgsc_clear_id_chg_flag(HPM_USB1); + usbotg_trigger_role_change(g_usb_hpm_busid[1], usb_otgsc_get_id_status(HPM_USB1) ? USBOTG_MODE_DEVICE : USBOTG_MODE_HOST); + } + + USBOTG_IRQHandler(g_usb_hpm_busid[1]); +} +#endif + +#else + +void hpm_isr_usb0(void) +{ + g_usb_hpm_irq[0](g_usb_hpm_busid[0]); +} + +#ifdef HPM_USB1_BASE +void hpm_isr_usb1(void) +{ + g_usb_hpm_irq[1](g_usb_hpm_busid[1]); +} +#endif + +#endif + ATTR_WEAK void hpm_usb_isr_enable(uint32_t base) { if (base == HPM_USB0_BASE) { @@ -34,24 +96,6 @@ ATTR_WEAK void hpm_usb_isr_disable(uint32_t base) } } -#ifndef CONFIG_CHERRYUSB_CUSTOM_IRQ_HANDLER -SDK_DECLARE_EXT_ISR_M(IRQn_USB0, hpm_isr_usb0) -#endif -void hpm_isr_usb0(void) -{ - g_usb_hpm_irq[0](g_usb_hpm_busid[0]); -} - -#ifdef HPM_USB1_BASE -#ifndef CONFIG_CHERRYUSB_CUSTOM_IRQ_HANDLER -SDK_DECLARE_EXT_ISR_M(IRQn_USB1, hpm_isr_usb1) -#endif -void hpm_isr_usb1(void) -{ - g_usb_hpm_irq[1](g_usb_hpm_busid[1]); -} -#endif - #ifdef CONFIG_USB_DCACHE_ENABLE void usb_dcache_clean(uintptr_t addr, size_t size) { @@ -67,4 +111,4 @@ void usb_dcache_flush(uintptr_t addr, size_t size) { l1c_dc_flush(addr, size); } -#endif \ No newline at end of file +#endif diff --git a/components/drivers/usb/cherryusb/port/hpmicro/usb_hc_hpm.c b/components/drivers/usb/cherryusb/port/hpmicro/usb_hc_hpm.c index 9ee515008b..2c340573ca 100644 --- a/components/drivers/usb/cherryusb/port/hpmicro/usb_hc_hpm.c +++ b/components/drivers/usb/cherryusb/port/hpmicro/usb_hc_hpm.c @@ -57,31 +57,29 @@ void usb_hc_low_level2_init(struct usbh_bus *bus) if (bus->hcd.reg_base == HPM_USB0_BASE) { g_usb_hpm_busid[0] = bus->hcd.hcd_id; g_usb_hpm_irq[0] = USBH_IRQHandler; - - hpm_usb_isr_enable(HPM_USB0_BASE); } else { #ifdef HPM_USB1_BASE g_usb_hpm_busid[1] = bus->hcd.hcd_id; g_usb_hpm_irq[1] = USBH_IRQHandler; - - hpm_usb_isr_enable(HPM_USB1_BASE); #endif } + +#ifdef CONFIG_USB_OTG_ENABLE + usb_otgsc_enable_id_chg_int((USB_Type *)(bus->hcd.reg_base)); +#endif + hpm_usb_isr_enable(bus->hcd.reg_base); } void usb_hc_low_level_deinit(struct usbh_bus *bus) { usb_phy_deinit((USB_Type *)(bus->hcd.reg_base)); + hpm_usb_isr_disable(bus->hcd.reg_base); if (bus->hcd.reg_base == HPM_USB0_BASE) { - hpm_usb_isr_disable(HPM_USB0_BASE); - g_usb_hpm_busid[0] = 0; g_usb_hpm_irq[0] = NULL; } else { #ifdef HPM_USB1_BASE - hpm_usb_isr_disable(HPM_USB1_BASE); - g_usb_hpm_busid[1] = 0; g_usb_hpm_irq[1] = NULL; #endif diff --git a/components/drivers/usb/cherryusb/port/kinetis/usb_glue_mcx.c b/components/drivers/usb/cherryusb/port/kinetis/usb_glue_mcx.c index 4ae73f1ca0..b3d767a0a4 100644 --- a/components/drivers/usb/cherryusb/port/kinetis/usb_glue_mcx.c +++ b/components/drivers/usb/cherryusb/port/kinetis/usb_glue_mcx.c @@ -86,8 +86,8 @@ void usbd_kinetis_delay_ms(uint8_t ms) rt_thread_mdelay(ms); #else for (uint32_t i = 0; i < ms; i++) - { - for (volatile uint32_t j = 0; j < 10000; j++); + { + for (volatile uint32_t j = 0; j < 10000; j++); } #endif } \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/port/musb/usb_glue_sifli.c b/components/drivers/usb/cherryusb/port/musb/usb_glue_sifli.c index 106dc3a706..0019482055 100644 --- a/components/drivers/usb/cherryusb/port/musb/usb_glue_sifli.c +++ b/components/drivers/usb/cherryusb/port/musb/usb_glue_sifli.c @@ -17,7 +17,7 @@ #undef USB_POWER_RESUME #ifndef CONFIG_USB_MUSB_SIFLI -#error must define CONFIG_USB_MUSB_SIFLI when use sunxi chips +#error must define CONFIG_USB_MUSB_SIFLI when use sifli chips #endif #include "bf0_hal.h" diff --git a/components/drivers/usb/cherryusb/port/musb/usb_glue_ti.c b/components/drivers/usb/cherryusb/port/musb/usb_glue_ti.c new file mode 100644 index 0000000000..576a517f62 --- /dev/null +++ b/components/drivers/usb/cherryusb/port/musb/usb_glue_ti.c @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2026, sakumisu + * Copyright (c) 2026, MDLZCOOL + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include "usbd_core.h" +#include "usbh_core.h" +#include "usb_musb_reg.h" + +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_ints.h" +#include "inc/hw_gpio.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_usb.h" +#include "driverlib/sysctl.h" +#include "driverlib/gpio.h" +#include "driverlib/interrupt.h" +#include "driverlib/pin_map.h" +#include "driverlib/rom.h" + +#define TM4C_MUSB_RAM_SIZE 4096 + +// clang-format off +static struct musb_fifo_cfg musb_device_table[] = { +{ .ep_num = 0, .style = FIFO_TXRX, .maxpacket = 64, }, +{ .ep_num = 1, .style = FIFO_TXRX, .maxpacket = 1024, }, +{ .ep_num = 2, .style = FIFO_TXRX, .maxpacket = 1024, }, +{ .ep_num = 3, .style = FIFO_TXRX, .maxpacket = 1024, }, +{ .ep_num = 4, .style = FIFO_TXRX, .maxpacket = 512, }, +{ .ep_num = 5, .style = FIFO_TXRX, .maxpacket = 256, }, +{ .ep_num = 6, .style = FIFO_TXRX, .maxpacket = 128, }, +{ .ep_num = 7, .style = FIFO_TXRX, .maxpacket = 64, }, +}; + +static struct musb_fifo_cfg musb_host_table[] = { +{ .ep_num = 0, .style = FIFO_TXRX, .maxpacket = 64, }, +{ .ep_num = 1, .style = FIFO_TXRX, .maxpacket = 1024, }, +{ .ep_num = 2, .style = FIFO_TXRX, .maxpacket = 1024, }, +{ .ep_num = 3, .style = FIFO_TXRX, .maxpacket = 1024, }, +{ .ep_num = 4, .style = FIFO_TXRX, .maxpacket = 512, }, +{ .ep_num = 5, .style = FIFO_TXRX, .maxpacket = 256, }, +{ .ep_num = 6, .style = FIFO_TXRX, .maxpacket = 128, }, +{ .ep_num = 7, .style = FIFO_TXRX, .maxpacket = 64, }, +}; +// clang-format on + +static void (*g_usb_irq_handler)(uint8_t busid) = NULL; + +extern void USBH_IRQHandler(uint8_t busid); +extern void USBD_IRQHandler(uint8_t busid); + +__WEAK void USBD_IRQHandler(uint8_t busid) +{ + (void)busid; +} + +__WEAK void USBH_IRQHandler(uint8_t busid) +{ + (void)busid; +} + +void USB0_Handler(void) +{ + if (g_usb_irq_handler) { + g_usb_irq_handler(0); + } +} + +uint8_t usbd_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg) +{ + *cfg = musb_device_table; + return sizeof(musb_device_table) / sizeof(musb_device_table[0]); +} + +uint8_t usbh_get_musb_fifo_cfg(struct musb_fifo_cfg **cfg) +{ + *cfg = musb_host_table; + return sizeof(musb_host_table) / sizeof(musb_host_table[0]); +} + +uint32_t usb_get_musb_ram_size(void) +{ + return TM4C_MUSB_RAM_SIZE; +} + +void usbd_musb_delay_ms(uint8_t ms) +{ + /* implement later */ +} + +void usb_dc_low_level_init(void) +{ + SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + + while (!SysCtlPeripheralReady(SYSCTL_PERIPH_USB0)) + ; + while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOD)) + ; + while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOB)) + ; + + SysCtlPeripheralReset(SYSCTL_PERIPH_USB0); + for (volatile int i = 0; i < 1000; i++) + ; + + GPIOPinTypeUSBAnalog(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5); + GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + HWREGB(USB0_BASE + USB_O_GPCS) = USB_GPCS_DEVMOD; + SysCtlUSBPLLEnable(); + + g_usb_irq_handler = USBD_IRQHandler; + + IntPrioritySet(INT_USB0, (6 << 5)); + IntEnable(INT_USB0); +} + +void usb_dc_low_level_deinit(void) +{ + IntDisable(INT_USB0); + g_usb_irq_handler = NULL; + SysCtlPeripheralDisable(SYSCTL_PERIPH_USB0); +} + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + + while (!SysCtlPeripheralReady(SYSCTL_PERIPH_USB0)) + ; + while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOD)) + ; + while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOB)) + ; + + SysCtlPeripheralReset(SYSCTL_PERIPH_USB0); + for (volatile int i = 0; i < 1000; i++) + ; + + GPIOPinTypeUSBAnalog(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5); + GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); + + HWREGB(USB0_BASE + USB_O_GPCS) &= ~(USB_GPCS_DEVMOD); + SysCtlUSBPLLEnable(); + + g_usb_irq_handler = USBH_IRQHandler; + + IntPrioritySet(INT_USB0, (6 << 5)); + IntEnable(INT_USB0); +} + +void usb_hc_low_level_deinit(struct usbh_bus *bus) +{ + IntDisable(INT_USB0); + g_usb_irq_handler = NULL; + SysCtlPeripheralDisable(SYSCTL_PERIPH_USB0); +} \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/port/musb/usb_hc_musb.c b/components/drivers/usb/cherryusb/port/musb/usb_hc_musb.c index eea625cc73..26d2ce74ca 100644 --- a/components/drivers/usb/cherryusb/port/musb/usb_hc_musb.c +++ b/components/drivers/usb/cherryusb/port/musb/usb_hc_musb.c @@ -328,10 +328,16 @@ void musb_control_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb speed = USB_TYPE0_SPEED_LOW; } +#ifdef CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + /* Without multipoint, use FADDR for host target addressing and do not access Hub/FuncAddr regs */ + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = (urb->hport->dev_addr & 0x7F); + HWREGB(USB_TXTYPE_BASE(chidx)) = speed; +#else HWREGB(USB_TXADDR_BASE(chidx)) = urb->hport->dev_addr; HWREGB(USB_TXTYPE_BASE(chidx)) = speed; HWREGB(USB_TXHUBADDR_BASE(chidx)) = 0; HWREGB(USB_TXHUBPORT_BASE(chidx)) = 0; +#endif musb_write_packet(bus, chidx, (uint8_t *)setup, 8); HWREGB(USB_TXCSRL_BASE(chidx)) = USB_CSRL0_TXRDY | USB_CSRL0_SETUP; @@ -360,12 +366,19 @@ int musb_bulk_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb return -USB_ERR_RANGE; } +#ifdef CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = (urb->hport->dev_addr & 0x7F); + HWREGB(USB_RXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK; + HWREGH(USB_RXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_RXINTERVAL_BASE(chidx)) = 0; +#else HWREGB(USB_RXADDR_BASE(chidx)) = urb->hport->dev_addr; HWREGB(USB_RXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK; HWREGH(USB_RXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); HWREGB(USB_RXINTERVAL_BASE(chidx)) = 0; HWREGB(USB_RXHUBADDR_BASE(chidx)) = 0; HWREGB(USB_RXHUBPORT_BASE(chidx)) = 0; +#endif HWREGB(USB_TXCSRH_BASE(chidx)) &= ~USB_TXCSRH1_MODE; HWREGB(USB_RXCSRL_BASE(chidx)) = USB_RXCSRL1_REQPKT; @@ -376,12 +389,19 @@ int musb_bulk_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb return -USB_ERR_RANGE; } +#ifdef CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = (urb->hport->dev_addr & 0x7F); + HWREGB(USB_TXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK; + HWREGH(USB_TXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_TXINTERVAL_BASE(chidx)) = 0; +#else HWREGB(USB_TXADDR_BASE(chidx)) = urb->hport->dev_addr; HWREGB(USB_TXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_BULK; HWREGH(USB_TXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); HWREGB(USB_TXINTERVAL_BASE(chidx)) = 0; HWREGB(USB_TXHUBADDR_BASE(chidx)) = 0; HWREGB(USB_TXHUBPORT_BASE(chidx)) = 0; +#endif if (buflen > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { buflen = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); @@ -419,12 +439,19 @@ int musb_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb return -USB_ERR_RANGE; } +#ifdef CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = (urb->hport->dev_addr & 0x7F); + HWREGB(USB_RXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT; + HWREGH(USB_RXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_RXINTERVAL_BASE(chidx)) = urb->ep->bInterval; +#else HWREGB(USB_RXADDR_BASE(chidx)) = urb->hport->dev_addr; HWREGB(USB_RXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT; HWREGH(USB_RXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); HWREGB(USB_RXINTERVAL_BASE(chidx)) = urb->ep->bInterval; HWREGB(USB_RXHUBADDR_BASE(chidx)) = 0; HWREGB(USB_RXHUBPORT_BASE(chidx)) = 0; +#endif HWREGB(USB_TXCSRH_BASE(chidx)) &= ~USB_TXCSRH1_MODE; HWREGB(USB_RXCSRL_BASE(chidx)) = USB_RXCSRL1_REQPKT; @@ -435,12 +462,19 @@ int musb_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb return -USB_ERR_RANGE; } +#ifdef CONFIG_USB_MUSB_WITHOUT_MULTIPOINT + HWREGB(USB_BASE + MUSB_FADDR_OFFSET) = (urb->hport->dev_addr & 0x7F); + HWREGB(USB_TXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT; + HWREGH(USB_TXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); + HWREGB(USB_TXINTERVAL_BASE(chidx)) = urb->ep->bInterval; +#else HWREGB(USB_TXADDR_BASE(chidx)) = urb->hport->dev_addr; HWREGB(USB_TXTYPE_BASE(chidx)) = (urb->ep->bEndpointAddress & 0x0f) | speed | USB_TXTYPE1_PROTO_INT; HWREGH(USB_TXMAP_BASE(chidx)) = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); HWREGB(USB_TXINTERVAL_BASE(chidx)) = urb->ep->bInterval; HWREGB(USB_TXHUBADDR_BASE(chidx)) = 0; HWREGB(USB_TXHUBPORT_BASE(chidx)) = 0; +#endif if (buflen > USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize)) { buflen = USB_GET_MAXPACKETSIZE(urb->ep->wMaxPacketSize); @@ -490,31 +524,36 @@ static uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) return speed; } -#if 0 -static int musb_pipe_alloc(void) +static int musb_pipe_alloc(struct usbh_bus *bus) { int chidx; + uintptr_t flags; + flags = usb_osal_enter_critical_section(); for (chidx = 1; chidx < CONFIG_USB_MUSB_PIPE_NUM; chidx++) { if (!g_musb_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse) { g_musb_hcd[bus->hcd.hcd_id].pipe_pool[chidx].inuse = true; + usb_osal_leave_critical_section(flags); return chidx; } } + usb_osal_leave_critical_section(flags); return -1; } -#endif static void musb_pipe_free(struct musb_pipe *pipe) { + uintptr_t flags; + + flags = usb_osal_enter_critical_section(); if (pipe->urb) { pipe->urb->hcpriv = NULL; pipe->urb = NULL; } -#if 0 + pipe->inuse = false; -#endif + usb_osal_leave_critical_section(flags); } __WEAK void usb_hc_low_level_init(struct usbh_bus *bus) @@ -730,10 +769,9 @@ int usbh_submit_urb(struct usbh_urb *urb) if (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes) == USB_ENDPOINT_TYPE_CONTROL) { chidx = 0; } else { - chidx = (urb->ep->bEndpointAddress & 0x0f); - - if (chidx > (CONFIG_USB_MUSB_PIPE_NUM - 1)) { - return -USB_ERR_RANGE; + chidx = musb_pipe_alloc(bus); + if (chidx == -1) { + return -USB_ERR_NOMEM; } } @@ -839,8 +877,6 @@ static void musb_urb_waitup(struct usbh_urb *urb) struct musb_pipe *pipe; pipe = (struct musb_pipe *)urb->hcpriv; - pipe->urb = NULL; - urb->hcpriv = NULL; if (urb->timeout) { usb_osal_sem_give(pipe->waitsem); @@ -987,9 +1023,11 @@ void USBH_IRQHandler(uint8_t busid) bus = &g_usbhost_bus[busid]; +#if 0 if (!(HWREGB(USB_BASE + MUSB_DEVCTL_OFFSET) & USB_DEVCTL_HOST)) { return; } +#endif is = HWREGB(USB_BASE + MUSB_IS_OFFSET); txis = HWREGH(USB_BASE + MUSB_TXIS_OFFSET); diff --git a/components/drivers/usb/cherryusb/tools/audacity/url b/components/drivers/usb/cherryusb/tools/audacity/url new file mode 100644 index 0000000000..4f690e4064 --- /dev/null +++ b/components/drivers/usb/cherryusb/tools/audacity/url @@ -0,0 +1 @@ +https://audacity.onl/ \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/tools/chryusb_configurator/url b/components/drivers/usb/cherryusb/tools/chryusb_configurator/url new file mode 100644 index 0000000000..ed063b5167 --- /dev/null +++ b/components/drivers/usb/cherryusb/tools/chryusb_configurator/url @@ -0,0 +1 @@ +https://github.com/Egahp/chryusb_configurator/releases/tag/1.0.0 \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/tools/packet capture/url b/components/drivers/usb/cherryusb/tools/packet capture/url new file mode 100644 index 0000000000..a5fba08e60 --- /dev/null +++ b/components/drivers/usb/cherryusb/tools/packet capture/url @@ -0,0 +1,3 @@ +QQ群内获取 + +Get it after joining the qq chat \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/tools/stm32_dfuse/url b/components/drivers/usb/cherryusb/tools/stm32_dfuse/url new file mode 100644 index 0000000000..808c6f7386 --- /dev/null +++ b/components/drivers/usb/cherryusb/tools/stm32_dfuse/url @@ -0,0 +1 @@ +http://www.st.com/en/development-tools/stsw-stm32080.html \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/tools/test_srcipts/test_cdc_speed.py b/components/drivers/usb/cherryusb/tools/test_srcipts/test_cdc_speed.py new file mode 100644 index 0000000000..f11b70a4a2 --- /dev/null +++ b/components/drivers/usb/cherryusb/tools/test_srcipts/test_cdc_speed.py @@ -0,0 +1,49 @@ +import serial +import time +try: + from serial.tools.list_ports import comports +except ImportError: + raise serial.serialutil.SerialException + + +test_comx = 'COM66' +test_baudrate = 2000000 +test_maxsize = 10*1024*1024 + +test_data = '0xAA' * 4096 + +test_serial = serial.Serial(test_comx, test_baudrate, timeout = 1) + +def test_cdc_out(): + send_count = 0 + begin = time.time() + + while True: + if send_count < test_maxsize: + txdatalen = test_serial.write(test_data.encode("utf-8")) + send_count += txdatalen + else: + print("cdc out speed %f MB/s" %(send_count//1024//1024/(time.time() - begin))) + break + +def test_cdc_in(): + read_count = 0 + begin = time.time() + + while True: + if read_count < test_maxsize: + data = test_serial.read(test_maxsize).decode(encoding='utf-8',errors='ignore') + read_count += len(data) + else: + print("cdc in speed %f MB/s" %(read_count//1024//1024/(time.time() - begin))) + break + +if __name__ == '__main__': + print('test cdc out speed') + + test_serial.setDTR(0) + test_cdc_out() + + print('test cdc in speed') + test_serial.setDTR(1) + test_cdc_in() \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/tools/test_srcipts/test_hid_inout.py b/components/drivers/usb/cherryusb/tools/test_srcipts/test_hid_inout.py new file mode 100644 index 0000000000..df512d24ef --- /dev/null +++ b/components/drivers/usb/cherryusb/tools/test_srcipts/test_hid_inout.py @@ -0,0 +1,68 @@ +# Copyright (c) 2021 HPMicro +# SPDX-License-Identifier: BSD-3-Clause + +import pywinusb.hid as hid +import os +import time +import sys +import operator + +# VID and PID customization changes here... + +VID = 0xFFFF +PID = 0xFFFF + +# Send buffer +buffer = [0xff]*64 + +# Const +TIMEOUT = -1 +PASS = 0 +FAIL = 1 + +# Result +result = TIMEOUT + +def search_dev(): + filter = hid.HidDeviceFilter(vendor_id = VID, product_id = PID) + hid_device = filter.get_devices() + return hid_device + +def recv_data(data): + print("<=================== USB HID Read ========================>") + for i in range(0, len(data)): + print("0x{0:02x}" .format(data[i]), end=" ") + print("\n") + + global result + result = (PASS if (operator.eq(data[1:-1], buffer[1:-1]) == True) else FAIL) + + return None + +def send_data(report): + print("<=================== USB HID Write ========================>") + buffer[0] = report[0].report_id + print("0x{0:02x}" .format(buffer[0]), end=" ") + + for i in range(1,64): + buffer[i] = i % 256 + print("0x{0:02x}" .format(buffer[i]), end=" ") + print("\n") + + report[0].set_raw_data(buffer) + report[0].send() + return None + +if __name__ == '__main__': + device = search_dev()[0] + device.open() + device.set_raw_data_handler(recv_data) + send_data(device.find_output_reports()) + time.sleep(1) + + if result == PASS: + print("USB hid echo passed!") + elif result == FAIL: + print("USB HID echo failed!") + else: + print("USB HID echo timed out!") \ No newline at end of file diff --git a/components/drivers/usb/cherryusb/tools/uf2/uf2conv.py b/components/drivers/usb/cherryusb/tools/uf2/uf2conv.py new file mode 100644 index 0000000000..53c5e8bc6d --- /dev/null +++ b/components/drivers/usb/cherryusb/tools/uf2/uf2conv.py @@ -0,0 +1,361 @@ +#!/usr/bin/env python3 +import sys +import struct +import subprocess +import re +import os +import os.path +import argparse +import json +from time import sleep + + +UF2_MAGIC_START0 = 0x0A324655 # "UF2\n" +UF2_MAGIC_START1 = 0x9E5D5157 # Randomly selected +UF2_MAGIC_END = 0x0AB16F30 # Ditto + +INFO_FILE = "/INFO_UF2.TXT" + +appstartaddr = 0x2000 +familyid = 0x0 + + +def is_uf2(buf): + w = struct.unpack(" 476: + assert False, "Invalid UF2 data size at " + ptr + newaddr = hd[3] + if (hd[2] & 0x2000) and (currfamilyid == None): + currfamilyid = hd[7] + if curraddr == None or ((hd[2] & 0x2000) and hd[7] != currfamilyid): + currfamilyid = hd[7] + curraddr = newaddr + if familyid == 0x0 or familyid == hd[7]: + appstartaddr = newaddr + padding = newaddr - curraddr + if padding < 0: + assert False, "Block out of order at " + ptr + if padding > 10*1024*1024: + assert False, "More than 10M of padding needed at " + ptr + if padding % 4 != 0: + assert False, "Non-word padding size at " + ptr + while padding > 0: + padding -= 4 + outp.append(b"\x00\x00\x00\x00") + if familyid == 0x0 or ((hd[2] & 0x2000) and familyid == hd[7]): + outp.append(block[32 : 32 + datalen]) + curraddr = newaddr + datalen + if hd[2] & 0x2000: + if hd[7] in families_found.keys(): + if families_found[hd[7]] > newaddr: + families_found[hd[7]] = newaddr + else: + families_found[hd[7]] = newaddr + if prev_flag == None: + prev_flag = hd[2] + if prev_flag != hd[2]: + all_flags_same = False + if blockno == (numblocks - 1): + print("--- UF2 File Header Info ---") + families = load_families() + for family_hex in families_found.keys(): + family_short_name = "" + for name, value in families.items(): + if value == family_hex: + family_short_name = name + print("Family ID is {:s}, hex value is 0x{:08x}".format(family_short_name,family_hex)) + print("Target Address is 0x{:08x}".format(families_found[family_hex])) + if all_flags_same: + print("All block flag values consistent, 0x{:04x}".format(hd[2])) + else: + print("Flags were not all the same") + print("----------------------------") + if len(families_found) > 1 and familyid == 0x0: + outp = [] + appstartaddr = 0x0 + return b"".join(outp) + +def convert_to_carray(file_content): + outp = "const unsigned long bindata_len = %d;\n" % len(file_content) + outp += "const unsigned char bindata[] __attribute__((aligned(16))) = {" + for i in range(len(file_content)): + if i % 16 == 0: + outp += "\n" + outp += "0x%02x, " % file_content[i] + outp += "\n};\n" + return bytes(outp, "utf-8") + +def convert_to_uf2(file_content): + global familyid + datapadding = b"" + while len(datapadding) < 512 - 256 - 32 - 4: + datapadding += b"\x00\x00\x00\x00" + numblocks = (len(file_content) + 255) // 256 + outp = [] + for blockno in range(numblocks): + ptr = 256 * blockno + chunk = file_content[ptr:ptr + 256] + flags = 0x0 + if familyid: + flags |= 0x2000 + hd = struct.pack(b"= 3 and words[1] == "2" and words[2] == "FAT": + drives.append(words[0]) + else: + searchpaths = ["/media"] + if sys.platform == "darwin": + searchpaths = ["/Volumes"] + elif sys.platform == "linux": + searchpaths += ["/media/" + os.environ["USER"], '/run/media/' + os.environ["USER"]] + + for rootpath in searchpaths: + if os.path.isdir(rootpath): + for d in os.listdir(rootpath): + if os.path.isdir(rootpath): + drives.append(os.path.join(rootpath, d)) + + + def has_info(d): + try: + return os.path.isfile(d + INFO_FILE) + except: + return False + + return list(filter(has_info, drives)) + + +def board_id(path): + with open(path + INFO_FILE, mode='r') as file: + file_content = file.read() + return re.search(r"Board-ID: ([^\r\n]*)", file_content).group(1) + + +def list_drives(): + for d in get_drives(): + print(d, board_id(d)) + + +def write_file(name, buf): + with open(name, "wb") as f: + f.write(buf) + print("Wrote %d bytes to %s" % (len(buf), name)) + + +def load_families(): + # The expectation is that the `uf2families.json` file is in the same + # directory as this script. Make a path that works using `__file__` + # which contains the full path to this script. + filename = "uf2families.json" + pathname = os.path.join(os.path.dirname(os.path.abspath(__file__)), filename) + with open(pathname) as f: + raw_families = json.load(f) + + families = {} + for family in raw_families: + families[family["short_name"]] = int(family["id"], 0) + + return families + + +def main(): + global appstartaddr, familyid + def error(msg): + print(msg, file=sys.stderr) + sys.exit(1) + parser = argparse.ArgumentParser(description='Convert to UF2 or flash directly.') + parser.add_argument('input', metavar='INPUT', type=str, nargs='?', + help='input file (HEX, BIN or UF2)') + parser.add_argument('-b', '--base', dest='base', type=str, + default="0x2000", + help='set base address of application for BIN format (default: 0x2000)') + parser.add_argument('-f', '--family', dest='family', type=str, + default="0x0", + help='specify familyID - number or name (default: 0x0)') + parser.add_argument('-o', '--output', metavar="FILE", dest='output', type=str, + help='write output to named file; defaults to "flash.uf2" or "flash.bin" where sensible') + parser.add_argument('-d', '--device', dest="device_path", + help='select a device path to flash') + parser.add_argument('-l', '--list', action='store_true', + help='list connected devices') + parser.add_argument('-c', '--convert', action='store_true', + help='do not flash, just convert') + parser.add_argument('-D', '--deploy', action='store_true', + help='just flash, do not convert') + parser.add_argument('-w', '--wait', action='store_true', + help='wait for device to flash') + parser.add_argument('-C', '--carray', action='store_true', + help='convert binary file to a C array, not UF2') + parser.add_argument('-i', '--info', action='store_true', + help='display header information from UF2, do not convert') + args = parser.parse_args() + appstartaddr = int(args.base, 0) + + families = load_families() + + if args.family.upper() in families: + familyid = families[args.family.upper()] + else: + try: + familyid = int(args.family, 0) + except ValueError: + error("Family ID needs to be a number or one of: " + ", ".join(families.keys())) + + if args.list: + list_drives() + else: + if not args.input: + error("Need input file") + with open(args.input, mode='rb') as f: + inpbuf = f.read() + from_uf2 = is_uf2(inpbuf) + ext = "uf2" + if args.deploy: + outbuf = inpbuf + elif from_uf2 and not args.info: + outbuf = convert_from_uf2(inpbuf) + ext = "bin" + elif from_uf2 and args.info: + outbuf = "" + convert_from_uf2(inpbuf) + elif is_hex(inpbuf): + outbuf = convert_from_hex_to_uf2(inpbuf.decode("utf-8")) + elif args.carray: + outbuf = convert_to_carray(inpbuf) + ext = "h" + else: + outbuf = convert_to_uf2(inpbuf) + if not args.deploy and not args.info: + print("Converted to %s, output size: %d, start address: 0x%x" % + (ext, len(outbuf), appstartaddr)) + if args.convert or ext != "uf2": + if args.output == None: + args.output = "flash." + ext + if args.output: + write_file(args.output, outbuf) + if ext == "uf2" and not args.convert and not args.info: + drives = get_drives() + if len(drives) == 0: + if args.wait: + print("Waiting for drive to deploy...") + while len(drives) == 0: + sleep(0.1) + drives = get_drives() + elif not args.output: + error("No drive to deploy.") + for d in drives: + print("Flashing %s (%s)" % (d, board_id(d))) + write_file(d + "/NEW.UF2", outbuf) + + +if __name__ == "__main__": + main() \ No newline at end of file -- Gitee From 3e2d924e9dcc12aaeb44c97c5218fb67acc8c5ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=E2=80=86b=E2=80=86b666?= <64397326+Rbb666@users.noreply.github.com> Date: Wed, 28 Jan 2026 10:54:30 +0800 Subject: [PATCH 16/45] [driver/usb]Update dwc2/usb_glue_infineon.c to add the missing header file. (#11158) --- .../drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c index 19239ec891..c0956674c7 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c @@ -8,13 +8,13 @@ #include "usb_dwc2_param.h" #include "rtthread.h" #include "cybsp.h" +#include "cy_device.h" #if defined (COMPONENT_CM55) -#if defined(CONFIG_USB_DWC2_DMA_ENABLE) && !defined(CONFIG_USB_DCACHE_ENABLE) +#if !defined(CONFIG_USB_DCACHE_ENABLE) #error "Please enable CONFIG_USB_DCACHE_ENABLE and put USB_NOCACHE_RAM_SECTION to section ".cy_socmem_data" when using DMA" #endif - #else #define CONFIG_USB_DWC2_DMA_ENABLE #endif @@ -83,6 +83,8 @@ void usb_dc_low_level_init(uint8_t busid) USBHS_SS->PHY_FUNC_CTL_1 |= (7 << USBHS_SS_PHY_FUNC_CTL_1_PLL_FSEL_Pos); USBHS_SS->PHY_FUNC_CTL_2 |= (USBHS_SS_PHY_FUNC_CTL_2_RES_TUNING_SEL_Msk | USBHS_SS_PHY_FUNC_CTL_2_EFUSE_SEL_Msk); + rt_thread_mdelay(200); /* Wait for PHY stable */ + cy_stc_sysint_t usb_int_cfg = { .intrSrc = usbhs_interrupt_usbhsctrl_IRQn, .intrPriority = 3 @@ -120,6 +122,8 @@ void usb_hc_low_level_init(struct usbh_bus *bus) USBHS_SS->PHY_FUNC_CTL_1 |= (7 << USBHS_SS_PHY_FUNC_CTL_1_PLL_FSEL_Pos); USBHS_SS->PHY_FUNC_CTL_2 |= (USBHS_SS_PHY_FUNC_CTL_2_RES_TUNING_SEL_Msk | USBHS_SS_PHY_FUNC_CTL_2_EFUSE_SEL_Msk); + rt_thread_mdelay(200); /* Wait for PHY stable */ + cy_stc_sysint_t usb_int_cfg = { .intrSrc = usbhs_interrupt_usbhsctrl_IRQn, .intrPriority = 3 -- Gitee From c374aa2b19c1c52fdc7e497a3c196551362365c2 Mon Sep 17 00:00:00 2001 From: CYFS <2805686936@qq.com> Date: Tue, 27 Jan 2026 15:15:30 +0800 Subject: [PATCH 17/45] [bsp][nxp]:fix mcxa346 ci err --- .../.ci/attachconfig/ci.attachconfig.yml | 10 +- .../.cl/attachconfig/RTduino.attach | 14 -- bsp/nxp/mcx/mcxa/frdm-mcxa346/board/Kconfig | 159 +++++++++--------- 3 files changed, 84 insertions(+), 99 deletions(-) delete mode 100644 bsp/nxp/mcx/mcxa/frdm-mcxa346/.cl/attachconfig/RTduino.attach diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa346/.ci/attachconfig/ci.attachconfig.yml b/bsp/nxp/mcx/mcxa/frdm-mcxa346/.ci/attachconfig/ci.attachconfig.yml index a37fda0654..cac6fcae98 100644 --- a/bsp/nxp/mcx/mcxa/frdm-mcxa346/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa346/.ci/attachconfig/ci.attachconfig.yml @@ -5,5 +5,11 @@ scons.args: &scons # ------ component CI ------ component.can: kconfig: - - CONFIG_BSP_USING_CAN - - CONFIG_BSP_USING_CAN0 + - CONFIG_BSP_USING_CAN=y + - CONFIG_BSP_USING_CAN0=y + +# ------ Peripheral CI ------ +Peripheral.arduino: + kconfig: + - CONFIG_BSP_USING_ARDUINO=y + diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa346/.cl/attachconfig/RTduino.attach b/bsp/nxp/mcx/mcxa/frdm-mcxa346/.cl/attachconfig/RTduino.attach deleted file mode 100644 index b546b5f2c7..0000000000 --- a/bsp/nxp/mcx/mcxa/frdm-mcxa346/.cl/attachconfig/RTduino.attach +++ /dev/null @@ -1,14 +0,0 @@ -CONFIG_PKG_USING_RTDUINO=y -CONFIG_PKG_RTDUINO_PATH="/packages/arduino/RTduino" -CONFIG_RTDUINO_THREAD_SIZE=2048 -CONFIG_RTDUINO_THREAD_PRIO=30 -CONFIG_RTDUINO_SUPPORT_HIGH_PRECISION_MICROS=y -CONFIG_PKG_USING_RTDUINO_LATEST_VERSION=y -CONFIG_PKG_RTDUINO_VER="latest" -CONFIG_BSP_USING_I2C=y -CONFIG_BSP_USING_I2C3=y -CONFIG_BSP_USING_SPI=y -CONFIG_BSP_USING_SPI1=y -CONFIG_BSP_USING_ADC=y -CONFIG_BSP_USING_PWM=y -CONFIG_BSP_USING_ARDUINO=y \ No newline at end of file diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa346/board/Kconfig b/bsp/nxp/mcx/mcxa/frdm-mcxa346/board/Kconfig index 5e2569c132..0820121fc5 100644 --- a/bsp/nxp/mcx/mcxa/frdm-mcxa346/board/Kconfig +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa346/board/Kconfig @@ -20,55 +20,51 @@ menu "On-chip Peripheral Drivers" default y menuconfig BSP_USING_UART - config BSP_USING_UART - bool "Enable UART" - select RT_USING_UART - default y + bool "Enable UART" + select RT_USING_UART + default y - if BSP_USING_UART - config BSP_USING_UART2 - bool "Enable LPUART2 as defalt UART" - default y + if BSP_USING_UART + config BSP_USING_UART2 + bool "Enable LPUART2 as defalt UART" + default y - endif + endif menuconfig BSP_USING_I2C - config BSP_USING_I2C - bool "Enable I2C" - select RT_USING_I2C - default y + bool "Enable I2C" + select RT_USING_I2C + default y - if BSP_USING_I2C - config BSP_USING_I2C3 - bool "Enable Flexcomm3 I2C" - default y - endif + if BSP_USING_I2C + config BSP_USING_I2C3 + bool "Enable Flexcomm3 I2C" + default y + endif menuconfig BSP_USING_SPI - config BSP_USING_SPI - bool "Enable SPI" - select RT_USING_SPI - default y + bool "Enable SPI" + select RT_USING_SPI + default y - if BSP_USING_SPI - config BSP_USING_SPI1 - bool "Enable LPSPI1" - default n - endif + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable LPSPI1" + default n + endif menuconfig BSP_USING_ADC - config BSP_USING_ADC - bool "Enable ADC Channel" - select RT_USING_ADC - default y + bool "Enable ADC Channel" + select RT_USING_ADC + default y - if BSP_USING_ADC - config BSP_USING_ADC0_CH22 - bool "Enable ADC0 Channel22" - default n + if BSP_USING_ADC + config BSP_USING_ADC0_CH22 + bool "Enable ADC0 Channel22" + default n - endif + endif config BSP_USING_RTC bool "Enable RTC" @@ -81,61 +77,58 @@ menu "On-chip Peripheral Drivers" default n menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER - bool "Enable Timer" - select RT_USING_HWTIMER - default y + bool "Enable Timer" + select RT_USING_HWTIMER + default y - if BSP_USING_HWTIMER - config BSP_USING_CTIMER0 - bool "Enable CIMER0" - default y + if BSP_USING_HWTIMER + config BSP_USING_CTIMER0 + bool "Enable CIMER0" + default y - config BSP_USING_CTIMER1 - bool "Enable CIMER1" - default n + config BSP_USING_CTIMER1 + bool "Enable CIMER1" + default n - config BSP_USING_CTIMER3 - bool "Enable CIMER3" - default n + config BSP_USING_CTIMER3 + bool "Enable CIMER3" + default n - config BSP_USING_CTIMER4 - bool "Enable CIMER4" - default n - endif + config BSP_USING_CTIMER4 + bool "Enable CIMER4" + default n + endif menuconfig BSP_USING_PWM - config BSP_USING_PWM - bool "Enable PWM" - select RT_USING_PWM - default n - - if BSP_USING_PWM - config BSP_USING_PWM0 - bool "Enable eFlex PWM0" - default n - config BSP_USING_PWM1 - bool "Enable eFlex PWM1" - default n - config BSP_USING_PWM2 - bool "Enable eFlex PWM2" - default n - endif + bool "Enable PWM" + select RT_USING_PWM + default n + + if BSP_USING_PWM + config BSP_USING_PWM0 + bool "Enable eFlex PWM0" + default n + config BSP_USING_PWM1 + bool "Enable eFlex PWM1" + default n + config BSP_USING_PWM2 + bool "Enable eFlex PWM2" + default n + endif menuconfig BSP_USING_CAN - config BSP_USING_CAN - bool "Enable CAN" - select RT_USING_CAN - default n - if BSP_USING_CAN - config BSP_USING_CAN0 - bool "Enable CAN0" - default n - - config BSP_USING_CAN1 - bool "Enable CAN1" - default n - endif + bool "Enable CAN" + select RT_USING_CAN + default n + if BSP_USING_CAN + config BSP_USING_CAN0 + bool "Enable CAN0" + default n + + config BSP_USING_CAN1 + bool "Enable CAN1" + default n + endif endmenu -- Gitee From f2a646cff4947bef7554ddbf443765e63d888d96 Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Thu, 29 Jan 2026 14:18:22 +0800 Subject: [PATCH 18/45] fix(cherryusb): fix dwc2 host size check Signed-off-by: sakumisu <1203593632@qq.com> --- .../drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c | 3 ++- components/drivers/usb/cherryusb/port/dwc2/usb_hc_dwc2.c | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c index c0956674c7..485b36c269 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_glue_infineon.c @@ -13,8 +13,9 @@ #if defined (COMPONENT_CM55) #if !defined(CONFIG_USB_DCACHE_ENABLE) -#error "Please enable CONFIG_USB_DCACHE_ENABLE and put USB_NOCACHE_RAM_SECTION to section ".cy_socmem_data" when using DMA" +#error "Please enable CONFIG_USB_DCACHE_ENABLE and put USB_NOCACHE_RAM_SECTION to section ".cy_socmem_data" for CM55" #endif + #else #define CONFIG_USB_DWC2_DMA_ENABLE #endif diff --git a/components/drivers/usb/cherryusb/port/dwc2/usb_hc_dwc2.c b/components/drivers/usb/cherryusb/port/dwc2/usb_hc_dwc2.c index bf0adae571..92a7f3e027 100644 --- a/components/drivers/usb/cherryusb/port/dwc2/usb_hc_dwc2.c +++ b/components/drivers/usb/cherryusb/port/dwc2/usb_hc_dwc2.c @@ -717,10 +717,10 @@ int usb_hc_init(struct usbh_bus *bus) USB_ASSERT_MSG((USB_OTG_GLB->GRXFSIZ & 0xffff) >= g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_rx_fifo_size, "host_rx_fifo_size cannot be larger than power_on_value %u", (unsigned int)(USB_OTG_GLB->GRXFSIZ & 0xffff)); - USB_ASSERT_MSG((USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ & 0xffff) >= g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_nperio_tx_fifo_size, - "host_nperio_tx_fifo_size cannot be larger than power_on_value %u", (unsigned int)(USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ & 0xffff)); - USB_ASSERT_MSG((USB_OTG_GLB->HPTXFSIZ & 0xffff) >= g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_perio_tx_fifo_size, - "host_perio_tx_fifo_size cannot be larger than power_on_value %u", (unsigned int)(USB_OTG_GLB->HPTXFSIZ & 0xffff)); + USB_ASSERT_MSG(((USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ >> 16) & 0xffff) >= g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_nperio_tx_fifo_size, + "host_nperio_tx_fifo_size cannot be larger than power_on_value %u", (unsigned int)((USB_OTG_GLB->DIEPTXF0_HNPTXFSIZ >> 16) & 0xffff)); + USB_ASSERT_MSG(((USB_OTG_GLB->HPTXFSIZ >> 16) & 0xffff) >= g_dwc2_hcd[bus->hcd.hcd_id].user_params.host_perio_tx_fifo_size, + "host_perio_tx_fifo_size cannot be larger than power_on_value %u", (unsigned int)((USB_OTG_GLB->HPTXFSIZ >> 16) & 0xffff)); /* B-peripheral session valid override enable */ USB_OTG_GLB->GOTGCTL &= ~USB_OTG_GOTGCTL_BVALOEN; -- Gitee From 743b614875fc33257be47ab53b6c5e040ec27893 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Sat, 31 Jan 2026 17:44:27 +0800 Subject: [PATCH 19/45] [components][clock_time] Refactor time subsystem around clock_time (#11111) * [components][clock_time] Refactor time subsystem around clock_time Introduce the clock_time core with clock source/event separation, high-resolution scheduling, and boot-time helpers, plus clock_timer adapters for timer peripherals. Remove legacy ktime/cputime/hwtimer implementations and migrate arch and BSP time paths to the new subsystem while keeping POSIX time integration functional. Update drivers, Kconfig/SConscript wiring, documentation, and tests; add clock_time overview docs and align naming to clock_boottime/clock_hrtimer/clock_timer. * [components][clock_time] Use BSP-provided clock timer frequency on riscv64 * [risc-v] Use runtime clock timer frequency for tick and delays * [bsp] Add clock timer frequency hooks for riscv64 boards * [bsp] Update Renesas RA driver doc clock_timer link * [bsp] Sync zynqmp-r5-axu4ev rtconfig after config refresh * [bsp][rk3500] Update rk3500 clock configuration * [bsp][hpmicro] Add rt_hw_us_delay hook and update board delays * [bsp][stm32l496-st-nucleo] enable clock_time for hwtimer sample in ci * [bsp][hpmicro] Fix rtconfig include scope for hpm6750evk Move rtconfig.h include outside the ENET_MULTIPLE_PORT guard for hpm6750evk and hpm6750evk2 so configuration macros are available regardless of ENET settings. * [bsp][raspi3] select clock time for systimer * [bsp][hpm5300evk] Trim trailing blank line * [bsp][hpm5301evklite] Trim trailing blank line * [bsp][hpm5e00evk] Trim trailing blank line * [bsp][hpm6200evk] Trim trailing blank line * [bsp][hpm6300evk] Trim trailing blank line * [bsp][hpm6750evk] Trim trailing blank line * [bsp][hpm6750evk2] Trim trailing blank line * [bsp][hpm6750evkmini] Trim trailing blank line * [bsp][hpm6800evk] Trim trailing blank line * [bsp][hpm6e00evk] Trim trailing blank line * [bsp][nxp] switch lpc178x to gcc and remove mcx timer source * [bsp][stm32] fix the CONFIG_RT_USING_CLOCK_TIME issue. * [docs][clock_time] add clock time documentation * [docs][clock_time] Update clock time subsystem documentation - Update device driver index to use correct page reference - Clarify upper layer responsibilities in architecture overview - Update README to describe POSIX/libc, Soft RTC, and device driver usage - Refine architecture diagram with improved layout and color scheme - Remove obsolete clock_timer.md file * [kernel][utest] Trim trailing space * [clock_time] Fix hrtimer wrap handling * [clock_time] fix the static rt_inline issue * [clock_time] fix the rt_clock_hrtimer_control result issue --- bsp/ESP32_C3/README.md | 2 +- bsp/ESP32_C3/README_ZH.md | 2 +- bsp/ESP32_C3/drivers/Kconfig | 10 +- bsp/ESP32_C3/drivers/SConscript | 4 +- .../drivers/{drv_hwtimer.c => drv_timer.c} | 76 +-- .../drivers/{drv_hwtimer.h => drv_timer.h} | 10 +- bsp/Infineon/libraries/HAL_Drivers/SConscript | 2 +- .../{drv_hwtimer.c => drv_timer.c} | 76 +-- .../{drv_hwtimer.h => drv_timer.h} | 8 +- .../libraries/templates/PSOC62/board/Kconfig | 2 +- .../psoc6-cy8ckit-062-BLE/board/Kconfig | 2 +- .../psoc6-cy8ckit-062-WIFI-BT/board/Kconfig | 2 +- .../psoc6-cy8ckit-062S2-43012/board/Kconfig | 2 +- .../psoc6-cy8ckit-062s4/board/Kconfig | 2 +- .../psoc6-cy8cproto-062S3-4343W/board/Kconfig | 2 +- .../psoc6-evaluationkit-062S2/board/Kconfig | 2 +- bsp/Vango/v85xx/Kconfig | 40 +- bsp/Vango/v85xx/README.md | 2 +- bsp/Vango/v85xx/drivers/SConscript | 4 +- bsp/Vango/v85xx/drivers/drv_comm.h | 2 +- bsp/Vango/v85xxp/Kconfig | 24 +- bsp/Vango/v85xxp/README.md | 2 +- bsp/Vango/v85xxp/drivers/SConscript | 4 +- bsp/Vango/v85xxp/drivers/drv_comm.h | 2 +- bsp/acm32/acm32f0x0-nucleo/drivers/Kconfig | 14 +- .../drivers/{drv_hwtimer.c => drv_timer.c} | 60 +-- .../acm32f0x0-nucleo/drivers/tim_config.h | 2 +- bsp/acm32/acm32f0x0-nucleo/project.ewp | 4 +- bsp/acm32/acm32f0x0-nucleo/project.uvprojx | 8 +- bsp/acm32/acm32f4xx-nucleo/drivers/Kconfig | 20 +- .../air105/libraries/HAL_Driver/Inc/app_inc.h | 2 +- .../{core_hwtimer.h => core_clock_timer.h} | 4 +- .../libraries/HAL_Driver/Inc/resource_map.h | 2 +- .../{core_hwtimer.c => core_clock_timer.c} | 8 +- bsp/airm2m/air32f103/board/Kconfig | 2 +- bsp/airm2m/air32f103/board/board.c | 28 +- bsp/airm2m/air32f103/board/board.h | 2 +- bsp/airm2m/air32f103/libraries/SConscript | 2 +- .../rt_drivers/{drv_hwtimer.c => drv_timer.c} | 178 +++---- .../rt_drivers/{drv_hwtimer.h => drv_timer.h} | 20 +- bsp/allwinner/d1s/board/board.c | 5 + bsp/apm32/apm32e103ze-evalboard/board/Kconfig | 2 +- bsp/apm32/apm32e103ze-evalboard/board/board.h | 2 +- bsp/apm32/apm32e103ze-tinyboard/board/Kconfig | 2 +- bsp/apm32/apm32e103ze-tinyboard/board/board.h | 2 +- bsp/apm32/apm32f030r8-miniboard/board/Kconfig | 2 +- bsp/apm32/apm32f030r8-miniboard/board/board.h | 2 +- bsp/apm32/apm32f051r8-evalboard/board/Kconfig | 2 +- bsp/apm32/apm32f051r8-evalboard/board/board.h | 2 +- bsp/apm32/apm32f072vb-miniboard/board/Kconfig | 2 +- bsp/apm32/apm32f072vb-miniboard/board/board.h | 2 +- bsp/apm32/apm32f091vc-miniboard/board/Kconfig | 2 +- bsp/apm32/apm32f091vc-miniboard/board/board.h | 2 +- bsp/apm32/apm32f103vb-miniboard/board/Kconfig | 2 +- bsp/apm32/apm32f103vb-miniboard/board/board.h | 2 +- .../apm32f103xe-minibroard/board/Kconfig | 2 +- .../apm32f103xe-minibroard/board/board.h | 2 +- bsp/apm32/apm32f107vc-evalboard/board/Kconfig | 2 +- bsp/apm32/apm32f107vc-evalboard/board/board.h | 2 +- .../apm32f407ig-minibroard/board/Kconfig | 2 +- .../apm32f407ig-minibroard/board/board.h | 2 +- bsp/apm32/apm32f407zg-evalboard/board/Kconfig | 2 +- bsp/apm32/apm32f407zg-evalboard/board/board.h | 2 +- bsp/apm32/apm32s103vb-miniboard/board/Kconfig | 2 +- bsp/apm32/apm32s103vb-miniboard/board/board.h | 2 +- .../libraries/APM32E10x_Library/SConscript | 2 +- .../libraries/APM32F0xx_Library/SConscript | 2 +- .../libraries/APM32F10x_Library/SConscript | 2 +- .../libraries/APM32F4xx_Library/SConscript | 2 +- .../libraries/APM32S10x_Library/SConscript | 2 +- bsp/apm32/libraries/Drivers/SConscript | 4 +- .../Drivers/{drv_hwtimer.c => drv_timer.c} | 100 ++-- bsp/at32/at32a403a-start/README.md | 2 +- bsp/at32/at32a403a-start/board/Kconfig | 8 +- bsp/at32/at32a403a-start/board/src/at32_msp.c | 2 +- bsp/at32/at32a423-start/README.md | 2 +- bsp/at32/at32a423-start/board/Kconfig | 8 +- bsp/at32/at32a423-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f402-start/README.md | 2 +- bsp/at32/at32f402-start/board/Kconfig | 8 +- bsp/at32/at32f402-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f403a-start/README.md | 2 +- bsp/at32/at32f403a-start/board/Kconfig | 8 +- bsp/at32/at32f403a-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f405-start/README.md | 2 +- bsp/at32/at32f405-start/board/Kconfig | 8 +- bsp/at32/at32f405-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f407-start/README.md | 2 +- bsp/at32/at32f407-start/board/Kconfig | 8 +- bsp/at32/at32f407-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f413-start/README.md | 2 +- bsp/at32/at32f413-start/board/Kconfig | 8 +- bsp/at32/at32f413-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f415-start/README.md | 2 +- bsp/at32/at32f415-start/board/Kconfig | 8 +- bsp/at32/at32f415-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f421-start/README.md | 2 +- bsp/at32/at32f421-start/board/Kconfig | 8 +- bsp/at32/at32f421-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f423-start/README.md | 2 +- bsp/at32/at32f423-start/board/Kconfig | 8 +- bsp/at32/at32f423-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f425-start/README.md | 2 +- bsp/at32/at32f425-start/board/Kconfig | 8 +- bsp/at32/at32f425-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f435-start/README.md | 2 +- bsp/at32/at32f435-start/board/Kconfig | 8 +- bsp/at32/at32f435-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f437-start/README.md | 2 +- bsp/at32/at32f437-start/board/Kconfig | 8 +- bsp/at32/at32f437-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f455-start/README.md | 2 +- bsp/at32/at32f455-start/board/Kconfig | 8 +- bsp/at32/at32f455-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f456-start/README.md | 2 +- bsp/at32/at32f456-start/board/Kconfig | 8 +- bsp/at32/at32f456-start/board/src/at32_msp.c | 2 +- bsp/at32/at32f457-start/README.md | 2 +- bsp/at32/at32f457-start/board/Kconfig | 8 +- bsp/at32/at32f457-start/board/src/at32_msp.c | 2 +- bsp/at32/at32m412-start/README.md | 2 +- bsp/at32/at32m412-start/board/Kconfig | 8 +- bsp/at32/at32m412-start/board/src/at32_msp.c | 2 +- bsp/at32/at32m416-start/README.md | 2 +- bsp/at32/at32m416-start/board/Kconfig | 8 +- bsp/at32/at32m416-start/board/src/at32_msp.c | 2 +- bsp/at32/libraries/rt_drivers/SConscript | 4 +- .../rt_drivers/{drv_hwtimer.c => drv_timer.c} | 62 +-- .../rt_drivers/{drv_hwtimer.h => drv_timer.h} | 4 +- bsp/at91/at91sam9g45/project.ewp | 16 +- bsp/at91/at91sam9g45/project.uvproj | 16 +- bsp/bluetrum/ab32vg1-ab-prougen/board/Kconfig | 2 +- bsp/bluetrum/libraries/hal_drivers/SConscript | 4 +- .../libraries/hal_drivers/config/tim_config.h | 2 +- .../{drv_hwtimer.c => drv_timer.c} | 88 ++-- bsp/bouffalo_lab/README.md | 2 +- bsp/bouffalo_lab/README_en.md | 2 +- bsp/bouffalo_lab/libraries/Kconfig | 8 +- .../libraries/rt_drivers/SConscript | 6 +- .../rt_drivers/{drv_hwtimer.c => drv_timer.c} | 70 +-- .../rt_drivers/{drv_hwtimer.h => drv_timer.h} | 8 +- ...{hwtimer_sample.c => clock_timer_sample.c} | 36 +- bsp/cvitek/c906_little/board/Kconfig | 2 +- bsp/cvitek/cv18xx_risc-v/board/Kconfig | 2 +- bsp/cvitek/drivers/drv_timer.c | 44 +- bsp/essemi/es32f0654/drivers/ES/Kconfig | 32 +- .../drivers/ES/es_conf_info_clock_timer.h} | 90 ++-- bsp/essemi/es32f0654/drivers/Kconfig | 4 +- bsp/essemi/es32f0654/drivers/SConscript | 22 +- bsp/essemi/es32f0654/drivers/drv_hwtimer.c | 453 ------------------ bsp/essemi/es32f0654/drivers/drv_timer.c | 453 ++++++++++++++++++ .../drivers/drv_timer.h} | 8 +- bsp/essemi/es32f365x/drivers/ES/Kconfig | 62 +-- .../drivers/ES/es_conf_info_clock_timer.h} | 90 ++-- bsp/essemi/es32f365x/drivers/Kconfig | 4 +- bsp/essemi/es32f365x/drivers/SConscript | 16 +- .../drivers/drv_timer.h} | 8 +- bsp/essemi/es32f369x/drivers/ES/Kconfig | 62 +-- .../drivers/ES/es_conf_info_clock_timer.h} | 90 ++-- bsp/essemi/es32f369x/drivers/Kconfig | 4 +- bsp/essemi/es32f369x/drivers/SConscript | 16 +- bsp/essemi/es32f369x/drivers/drv_hwtimer.c | 448 ----------------- bsp/essemi/es32f369x/drivers/drv_timer.c | 448 +++++++++++++++++ .../drivers/drv_timer.h} | 8 +- bsp/essemi/es32vf2264/drivers/ES/Kconfig | 40 +- .../drivers/ES/es_conf_info_clock_timer.h} | 90 ++-- bsp/essemi/es32vf2264/drivers/SConscript | 18 +- bsp/essemi/es32vf2264/drivers/board.h | 2 +- .../drivers/{drv_hwtimer.c => drv_timer.c} | 256 +++++----- .../drivers/drv_timer.h} | 8 +- .../libraries/FM33LC0xx_FL_Driver/SConscript | 2 +- .../libraries/HAL_Drivers/SConscript | 4 +- bsp/ft2004/libraries/SConscript | 2 +- bsp/gd32/arm/gd32103c-eval/board/Kconfig | 2 +- bsp/gd32/arm/gd32105c-eval/board/Kconfig | 2 +- bsp/gd32/arm/gd32105r-start/board/Kconfig | 2 +- bsp/gd32/arm/gd32107c-eval/board/Kconfig | 2 +- bsp/gd32/arm/gd32205r-start/board/Kconfig | 2 +- bsp/gd32/arm/gd32207i-eval/board/Kconfig | 2 +- bsp/gd32/arm/gd32303e-eval/board/Kconfig | 2 +- bsp/gd32/arm/gd32305r-start/board/Kconfig | 2 +- bsp/gd32/arm/gd32307e-start/board/Kconfig | 2 +- bsp/gd32/arm/gd32407v-lckfb/board/Kconfig | 2 +- bsp/gd32/arm/gd32407v-start/board/Kconfig | 2 +- bsp/gd32/arm/gd32450z-eval/board/Kconfig | 2 +- bsp/gd32/arm/gd32470i-eval/board/Kconfig | 2 +- bsp/gd32/arm/gd32470z-lckfb/board/Kconfig | 2 +- bsp/gd32/arm/gd32527I-eval/board/Kconfig | 2 +- bsp/gd32/arm/gd32e230-lckfb/board/Kconfig | 2 +- bsp/gd32/arm/gd32e503v-eval/board/Kconfig | 2 +- .../arm/libraries/gd32_drivers/SConscript | 4 +- .../{drv_hwtimer.c => drv_timer.c} | 178 +++---- .../risc-v/gd32vf103r-start/board/Kconfig | 2 +- bsp/gd32/risc-v/gd32vf103v-eval/board/Kconfig | 2 +- .../GD32VF103_Firmware_Library/SConscript | 2 +- .../risc-v/libraries/gd32_drivers/SConscript | 4 +- bsp/hc32/ev_hc32f334_lqfp64/board/Kconfig | 6 +- .../ev_hc32f334_lqfp64/bsp_compile_ci.bat | 2 +- bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig | 8 +- .../ev_hc32f448_lqfp80/bsp_compile_ci.bat | 2 +- bsp/hc32/ev_hc32f460_lqfp100_v2/board/Kconfig | 6 +- .../ev_hc32f460_lqfp100_v2/bsp_compile_ci.bat | 2 +- bsp/hc32/ev_hc32f472_lqfp100/board/Kconfig | 8 +- .../ev_hc32f472_lqfp100/bsp_compile_ci.bat | 2 +- bsp/hc32/ev_hc32f4a0_lqfp176/board/Kconfig | 6 +- .../ev_hc32f4a0_lqfp176/bsp_compile_ci.bat | 2 +- bsp/hc32/ev_hc32f4a8_lqfp176/board/Kconfig | 6 +- .../ev_hc32f4a8_lqfp176/bsp_compile_ci.bat | 2 +- bsp/hc32/lckfb-hc32f4a0-lqfp100/board/Kconfig | 6 +- bsp/hc32/libraries/hc32_drivers/SConscript | 4 +- .../{drv_hwtimer.c => drv_timer.c} | 140 +++--- bsp/hc32/tests/SConscript | 4 +- .../{test_hwtimer.c => test_clock_timer.c} | 46 +- bsp/hk32/hk32f030c8-mini/README.md | 2 +- bsp/hk32/hk32f030c8-mini/board/Kconfig | 8 +- bsp/hk32/libraries/rt_drivers/SConscript | 4 +- bsp/hpmicro/hpm5300evk/board/Kconfig | 2 +- bsp/hpmicro/hpm5300evk/board/board.c | 11 +- bsp/hpmicro/hpm5301evklite/board/Kconfig | 2 +- bsp/hpmicro/hpm5301evklite/board/board.c | 10 +- bsp/hpmicro/hpm5e00evk/board/Kconfig | 2 +- bsp/hpmicro/hpm5e00evk/board/board.c | 10 +- bsp/hpmicro/hpm6200evk/board/Kconfig | 2 +- bsp/hpmicro/hpm6200evk/board/board.c | 9 +- bsp/hpmicro/hpm6300evk/board/Kconfig | 2 +- bsp/hpmicro/hpm6300evk/board/board.c | 10 +- bsp/hpmicro/hpm6750evk/board/Kconfig | 2 +- bsp/hpmicro/hpm6750evk/board/board.c | 10 +- bsp/hpmicro/hpm6750evk2/board/Kconfig | 2 +- bsp/hpmicro/hpm6750evk2/board/board.c | 10 +- bsp/hpmicro/hpm6750evkmini/board/Kconfig | 2 +- bsp/hpmicro/hpm6750evkmini/board/board.c | 10 +- bsp/hpmicro/hpm6800evk/board/Kconfig | 2 +- bsp/hpmicro/hpm6800evk/board/board.c | 10 +- bsp/hpmicro/hpm6e00evk/board/Kconfig | 2 +- bsp/hpmicro/hpm6e00evk/board/board.c | 10 +- bsp/hpmicro/hpm6p00evk/board/Kconfig | 2 +- bsp/hpmicro/hpm6p00evk/board/board.c | 9 +- bsp/hpmicro/libraries/drivers/SConscript | 3 +- bsp/hpmicro/libraries/drivers/drv_delay.c | 14 + .../drivers/{drv_hwtimer.c => drv_timer.c} | 64 +-- .../drivers/{drv_hwtimer.h => drv_timer.h} | 8 +- bsp/k210/drivers/SConscript | 5 +- bsp/k230/board/Kconfig | 2 +- .../{hwtimer => clock_timer}/SConscript | 0 .../{hwtimer => clock_timer}/drv_timer.c | 62 +-- .../{hwtimer => clock_timer}/drv_timer.h | 4 +- bsp/k230/drivers/utest/test_timer.c | 32 +- bsp/mm32/libraries/MM32F3270_HAL/SConscript | 2 +- .../N32G43x_Firmware_Library/SConscript | 2 +- .../N32G45x_Firmware_Library/SConscript | 2 +- .../N32G4FR_Firmware_Library/SConscript | 2 +- .../N32L40x_Firmware_Library/SConscript | 2 +- .../N32L43x_Firmware_Library/SConscript | 2 +- .../N32WB452_Firmware_Library/SConscript | 2 +- bsp/n32/libraries/n32_drivers/SConscript | 4 +- .../{drv_hwtimer.c => drv_timer.c} | 196 ++++---- .../{drv_hwtimer.h => drv_timer.h} | 16 +- bsp/n32/n32g43xcl-stb/README.md | 2 +- bsp/n32/n32g43xcl-stb/board/Kconfig | 44 +- bsp/n32/n32g43xcl-stb/project.ewp | 4 +- bsp/n32/n32g43xcl-stb/project.uvprojx | 8 +- bsp/n32/n32g457qel-stb/README.md | 2 +- bsp/n32/n32g457qel-stb/board/Kconfig | 40 +- bsp/n32/n32g457qel-stb/project.ewp | 4 +- bsp/n32/n32g457qel-stb/project.uvprojx | 8 +- bsp/n32/n32g45xcl-stb/README.md | 2 +- bsp/n32/n32g45xcl-stb/board/Kconfig | 40 +- bsp/n32/n32g45xcl-stb/project.ewp | 4 +- bsp/n32/n32g45xcl-stb/project.uvprojx | 8 +- bsp/n32/n32g45xml-stb/README.md | 2 +- bsp/n32/n32g45xml-stb/board/Kconfig | 40 +- bsp/n32/n32g45xml-stb/project.ewp | 4 +- bsp/n32/n32g45xml-stb/project.uvprojx | 8 +- bsp/n32/n32g45xrl-stb/README.md | 2 +- bsp/n32/n32g45xrl-stb/board/Kconfig | 40 +- bsp/n32/n32g45xrl-stb/project.ewp | 4 +- bsp/n32/n32g45xrl-stb/project.uvprojx | 8 +- bsp/n32/n32g45xvl-stb/README.md | 2 +- bsp/n32/n32g45xvl-stb/board/Kconfig | 40 +- bsp/n32/n32g45xvl-stb/project.ewp | 4 +- bsp/n32/n32g45xvl-stb/project.uvprojx | 8 +- bsp/n32/n32g4frml-stb/board/Kconfig | 40 +- bsp/n32/n32g4frml-stb/project.ewp | 4 +- bsp/n32/n32g4frml-stb/project.uvprojx | 8 +- bsp/n32/n32l40xcl-stb/README.md | 2 +- bsp/n32/n32l40xcl-stb/board/Kconfig | 44 +- bsp/n32/n32l40xcl-stb/project.ewp | 4 +- bsp/n32/n32l40xcl-stb/project.uvprojx | 8 +- bsp/n32/n32l436-evb/README.md | 2 +- bsp/n32/n32l436-evb/board/Kconfig | 44 +- bsp/n32/n32l436-evb/project.ewp | 4 +- bsp/n32/n32l436-evb/project.uvprojx | 8 +- bsp/n32/n32l43xml-stb/README.md | 2 +- bsp/n32/n32l43xml-stb/board/Kconfig | 44 +- bsp/n32/n32l43xml-stb/project.ewp | 4 +- bsp/n32/n32l43xml-stb/project.uvprojx | 8 +- bsp/n32/n32l43xrl-stb/README.md | 2 +- bsp/n32/n32l43xrl-stb/board/Kconfig | 44 +- bsp/n32/n32l43xrl-stb/project.ewp | 4 +- bsp/n32/n32l43xrl-stb/project.uvprojx | 8 +- bsp/n32/n32wb45xl-evb/README.md | 2 +- bsp/n32/n32wb45xl-evb/board/Kconfig | 40 +- bsp/n32/n32wb45xl-evb/project.ewp | 4 +- bsp/n32/n32wb45xl-evb/project.uvprojx | 8 +- bsp/n32g452xx/Libraries/rt_drivers/SConscript | 4 +- .../rt_drivers/{drv_hwtimer.c => drv_timer.c} | 66 +-- .../rt_drivers/{drv_hwtimer.h => drv_timer.h} | 4 +- bsp/n32g452xx/n32g452xx-mini-system/README.md | 2 +- .../n32g452xx-mini-system/board/Kconfig | 8 +- .../n32g452xx-mini-system/board/msp/n32_msp.c | 26 +- bsp/nrf5x/libraries/drivers/SConscript | 2 +- .../drivers/{drv_hwtimer.c => drv_timer.c} | 54 +-- bsp/nrf5x/nrf52832/board/Kconfig | 2 +- bsp/nrf5x/nrf52840/board/Kconfig | 2 +- bsp/nrf5x/nrf5340/board/Kconfig | 2 +- bsp/nuclei/gd32vf103_rvstar/README.md | 4 +- bsp/nuclei/gd32vf103_rvstar/board/Kconfig | 20 +- bsp/nuclei/gd32vf103_rvstar/board/board.c | 8 +- .../gd32vf103/HAL_Drivers/SConscript | 4 +- .../{drv_hwtimer.c => drv_timer.c} | 156 +++--- .../{drv_hwtimer.h => drv_timer.h} | 12 +- bsp/nuvoton/libraries/m031/rtt_port/Kconfig | 8 +- .../libraries/m031/rtt_port/drv_timer.c | 58 +-- bsp/nuvoton/libraries/m2354/rtt_port/Kconfig | 12 +- .../libraries/m2354/rtt_port/drv_timer.c | 66 +-- bsp/nuvoton/libraries/m460/rtt_port/Kconfig | 8 +- .../libraries/m460/rtt_port/drv_timer.c | 48 +- bsp/nuvoton/libraries/m480/rtt_port/Kconfig | 8 +- .../libraries/m480/rtt_port/drv_timer.c | 58 +-- bsp/nuvoton/libraries/ma35/rtt_port/Kconfig | 24 +- .../libraries/ma35/rtt_port/drv_timer.c | 48 +- bsp/nuvoton/libraries/n9h30/rtt_port/Kconfig | 16 +- .../libraries/n9h30/rtt_port/drv_etimer.c | 48 +- .../libraries/n9h30/rtt_port/drv_timer.c | 48 +- bsp/nuvoton/libraries/nuc980/rtt_port/Kconfig | 10 +- .../libraries/nuc980/rtt_port/drv_etimer.c | 48 +- bsp/nuvoton/nk-980iot/config_lvgl | 5 +- bsp/nuvoton/nk-980iot/project.uvopt | 12 +- bsp/nuvoton/nk-980iot/project.uvoptx | 12 +- bsp/nuvoton/nk-980iot/project.uvproj | 12 +- bsp/nuvoton/nk-980iot/project.uvprojx | 12 +- bsp/nuvoton/nk-980iot/spinor.config | 5 +- bsp/nuvoton/nk-n9h30/project.uvopt | 4 +- bsp/nuvoton/nk-n9h30/project.uvproj | 4 +- bsp/nuvoton/nk-rtu980/project.uvopt | 12 +- bsp/nuvoton/nk-rtu980/project.uvproj | 12 +- bsp/nuvoton/numaker-iot-m467/config_lvgl | 3 +- bsp/nuvoton/numaker-iot-m467/project.ewp | 2 +- bsp/nuvoton/numaker-iot-m467/project.uvoptx | 4 +- bsp/nuvoton/numaker-iot-m467/project.uvprojx | 4 +- bsp/nuvoton/numaker-iot-m487/config_lvgl | 3 +- bsp/nuvoton/numaker-iot-m487/project.ewp | 2 +- bsp/nuvoton/numaker-iot-m487/project.uvoptx | 4 +- bsp/nuvoton/numaker-iot-m487/project.uvproj | 4 +- bsp/nuvoton/numaker-iot-m487/project.uvprojx | 4 +- bsp/nuvoton/numaker-m032ki/config_lvgl | 3 +- bsp/nuvoton/numaker-m032ki/project.ewp | 2 +- bsp/nuvoton/numaker-m032ki/project.uvoptx | 4 +- bsp/nuvoton/numaker-m032ki/project.uvprojx | 4 +- bsp/nuvoton/numaker-m2354/config_lvgl | 5 +- bsp/nuvoton/numaker-m2354/project.ewp | 2 +- bsp/nuvoton/numaker-m2354/project.uvoptx | 4 +- bsp/nuvoton/numaker-m2354/project.uvprojx | 4 +- bsp/nuvoton/numaker-m467hj/config_lvgl | 3 +- bsp/nuvoton/numaker-m467hj/project.ewp | 2 +- bsp/nuvoton/numaker-m467hj/project.uvoptx | 4 +- bsp/nuvoton/numaker-m467hj/project.uvprojx | 4 +- bsp/nuvoton/numaker-pfm-m487/config_lvgl | 3 +- bsp/nuvoton/numaker-pfm-m487/project.ewp | 2 +- bsp/nuvoton/numaker-pfm-m487/project.uvoptx | 4 +- bsp/nuvoton/numaker-pfm-m487/project.uvproj | 4 +- bsp/nuvoton/numaker-pfm-m487/project.uvprojx | 4 +- .../imx/imxrt/imxrt1021-nxp-evk/board/Kconfig | 8 +- .../imxrt/imxrt1052-fire-pro/board/Kconfig | 8 +- .../imx/imxrt/imxrt1052-fire-pro/project.ewt | 2 +- .../imx/imxrt/libraries/drivers/SConscript | 4 +- .../drivers/{drv_hwtimer.c => drv_timer.c} | 122 ++--- .../drivers/{drv_hwtimer.h => drv_timer.h} | 4 +- .../templates/imxrt1050xxx/board/Kconfig | 8 +- .../templates/imxrt1050xxx/project.ewp | 2 +- .../templates/imxrt1050xxx/project.uvoptx | 4 +- .../templates/imxrt1050xxx/project.uvprojx | 4 +- .../templates/imxrt1064xxx/project.ewp | 2 +- .../templates/imxrt1064xxx/project.uvoptx | 4 +- .../templates/imxrt1064xxx/project.uvprojx | 4 +- bsp/nxp/lpc/lpc178x/rtconfig.py | 2 +- bsp/nxp/lpc/lpc408x/drivers/Kconfig | 4 +- bsp/nxp/lpc/lpc408x/drivers/SConscript | 4 +- .../drivers/{drv_hwtimer.c => drv_timer.c} | 36 +- .../drivers/{drv_hwtimer.h => drv_timer.h} | 8 +- bsp/nxp/lpc/lpc408x/project.uvproj | 16 +- bsp/nxp/lpc/lpc408x/project.uvprojx | 16 +- .../lpc/lpc54608-LPCXpresso/project.uvprojx | 16 +- .../lpc/lpc55sxx/Libraries/drivers/SConscript | 4 +- .../drivers/{drv_hwtimer.c => drv_timer.c} | 110 ++--- .../drivers/{drv_hwtimer.h => drv_timer.h} | 8 +- .../template/lpc55s6xxxx/board/Kconfig | 8 +- .../template/lpc55s6xxxx/project.ewp | 4 +- .../template/lpc55s6xxxx/project.uvoptx | 8 +- .../template/lpc55s6xxxx/project.uvprojx | 8 +- .../lpc55sxx/lpc55s06_nxp_evk/board/Kconfig | 8 +- .../lpc55sxx/lpc55s16_nxp_evk/board/Kconfig | 8 +- .../lpc55sxx/lpc55s28_nxp_evk/board/Kconfig | 8 +- .../lpc55sxx/lpc55s36_nxp_evk/board/Kconfig | 8 +- .../lpc55sxx/lpc55s69_nxp_evk/board/Kconfig | 8 +- bsp/nxp/mcx/mcxa/Libraries/drivers/SConscript | 4 +- .../drivers/{drv_hwtimer.c => drv_timer.c} | 108 ++--- bsp/nxp/mcx/mcxa/frdm-mcxa153/board/Kconfig | 8 +- bsp/nxp/mcx/mcxa/frdm-mcxa153/project.uvprojx | 4 +- bsp/nxp/mcx/mcxa/frdm-mcxa156/board/Kconfig | 8 +- bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvoptx | 4 +- bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvprojx | 4 +- bsp/nxp/mcx/mcxa/frdm-mcxa346/board/Kconfig | 6 +- bsp/nxp/mcx/mcxa/frdm-mcxa346/project.uvoptx | 4 +- bsp/nxp/mcx/mcxa/frdm-mcxa346/project.uvprojx | 4 +- bsp/nxp/mcx/mcxc/Libraries/drivers/SConscript | 3 - bsp/nxp/mcx/mcxc/frdm-mcxc444/board/Kconfig | 6 +- bsp/nxp/mcx/mcxc/frdm-mcxc444/project.ewp | 2 +- bsp/nxp/mcx/mcxc/frdm-mcxc444/project.uvprojx | 4 +- bsp/nxp/mcx/mcxe/Libraries/drivers/SConscript | 3 - bsp/nxp/mcx/mcxe/frdm-mcxe247/board/Kconfig | 8 +- bsp/nxp/mcx/mcxe/frdm-mcxe247/project.uvoptx | 4 +- bsp/nxp/mcx/mcxe/frdm-mcxe247/project.uvprojx | 4 +- bsp/nxp/mcx/mcxn/Libraries/drivers/SConscript | 4 +- .../drivers/{drv_hwtimer.c => drv_timer.c} | 80 ++-- .../drivers/{drv_hwtimer.h => drv_timer.h} | 8 +- bsp/nxp/mcx/mcxn/frdm-mcxn236/board/Kconfig | 6 +- bsp/nxp/mcx/mcxn/frdm-mcxn236/project.ewp | 2 +- bsp/nxp/mcx/mcxn/frdm-mcxn236/project.uvoptx | 4 +- bsp/nxp/mcx/mcxn/frdm-mcxn236/project.uvprojx | 4 +- bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig | 6 +- bsp/nxp/mcx/mcxn/frdm-mcxn947/project.ewp | 2 +- bsp/nxp/mcx/mcxn/frdm-mcxn947/project.uvprojx | 4 +- bsp/qemu-virt64-riscv/driver/board.c | 6 +- .../raspi3-32/applications/test_device.c | 26 +- bsp/raspberry-pi/raspi3-32/driver/Kconfig | 2 +- bsp/raspberry-pi/raspi3-32/driver/drv_timer.c | 50 +- bsp/raspberry-pi/raspi3-64/driver/Kconfig | 1 + bsp/raspberry-pi/raspi3-64/driver/drv_timer.c | 50 +- bsp/raspberry-pico/Drivers/SConscript | 4 +- .../Drivers/{drv_hwtimer.c => drv_timer.c} | 76 +-- .../Drivers/{drv_hwtimer.h => drv_timer.h} | 8 +- bsp/raspberry-pico/RP2040/board/Kconfig | 16 +- bsp/raspberry-pico/RP2350/board/Kconfig | 16 +- .../docs/Introduction_to_RA_Series_Drives.md | 2 +- .../libraries/HAL_Drivers/drivers/SConscript | 2 +- .../drivers/config/ra6e2/timer_config.h | 2 +- .../drivers/config/ra6m3/timer_config.h | 2 +- .../drivers/config/ra8/timer_config.h | 2 +- .../drivers/config/rzt/timer_config.h | 2 +- .../drivers/{drv_hwtimer.c => drv_timer.c} | 92 ++-- .../drivers/{drv_hwtimer.h => drv_timer.h} | 6 +- bsp/renesas/ra4m1-ek/board/Kconfig | 2 +- bsp/renesas/ra6m3-ek/board/Kconfig | 2 +- bsp/renesas/ra8p1-titan-board/README.md | 2 +- bsp/renesas/ra8p1-titan-board/README_zh.md | 2 +- bsp/renesas/ra8p1-titan-board/board/Kconfig | 2 +- bsp/renesas/rzn2l_etherkit/board/Kconfig | 2 +- bsp/renesas/rzn2l_rsk/board/Kconfig | 2 +- bsp/renesas/rzt2m_rsk/board/Kconfig | 2 +- bsp/rockchip/dm/hwtimer/Kconfig | 4 +- bsp/rockchip/dm/hwtimer/SConscript | 4 +- ...p_timer.c => clock_timer-rockchip_timer.c} | 155 ++++-- bsp/rockchip/rk3500/.config | 17 +- bsp/rockchip/rk3500/driver/board.c | 16 + bsp/rockchip/rk3500/rtconfig.h | 12 +- .../drivers/config/f0/tim_config.h | 2 +- .../drivers/config/f1/tim_config.h | 2 +- .../drivers/config/f2/tim_config.h | 2 +- .../drivers/config/f3/tim_config.h | 2 +- .../drivers/config/f4/tim_config.h | 2 +- .../drivers/config/f7/tim_config.h | 2 +- .../drivers/config/g0/tim_config.h | 2 +- .../drivers/config/g4/tim_config.h | 2 +- .../drivers/config/h7/lptim_config.h | 2 +- .../drivers/config/h7/tim_config.h | 2 +- .../drivers/config/l1/tim_config.h | 2 +- .../drivers/config/l4/tim_config.h | 2 +- .../drivers/config/l5/tim_config.h | 2 +- .../drivers/config/mp1/tim_config.h | 2 +- .../drivers/config/u5/tim_config.h | 2 +- .../drivers/config/wb/tim_config.h | 2 +- .../drivers/config/wl/tim_config.h | 4 +- .../libraries/HAL_Drivers/drivers/drv_lptim.c | 22 +- .../libraries/HAL_Drivers/drivers/drv_lptim.h | 2 +- .../libraries/HAL_Drivers/drivers/drv_pm.c | 2 +- .../libraries/HAL_Drivers/drivers/drv_tim.c | 104 ++-- bsp/stm32/libraries/STM32L1xx_HAL/SConscript | 2 +- .../templates/stm32f3xx/project.uvoptx | 8 +- .../templates/stm32l1xx/board/Kconfig | 2 +- .../templates/stm32wbxx/board/Kconfig | 2 +- .../libraries/templates/stm32xx_board_Kconfig | 2 +- bsp/stm32/stm32f072-st-nucleo/board/Kconfig | 2 +- bsp/stm32/stm32f091-st-nucleo/board/Kconfig | 2 +- bsp/stm32/stm32f103-100ask-pro/board/Kconfig | 2 +- bsp/stm32/stm32f103-atk-nano/board/Kconfig | 2 +- .../stm32f103-atk-warshipv3/board/Kconfig | 2 +- .../stm32f103-fire-arbitrary/board/Kconfig | 2 +- .../arduino_pinout/pins_arduino.h | 2 +- bsp/stm32/stm32f401-st-nucleo/board/Kconfig | 2 +- .../stm32f405zg-mini-template/board/Kconfig | 2 +- bsp/stm32/stm32f407-armfly-v5/board/Kconfig | 2 +- .../stm32f407-atk-explorer/board/Kconfig | 2 +- .../stm32f407-fk407m2-zgt6/board/Kconfig | 2 +- .../stm32f407-lckfb-skystar/board/Kconfig | 2 +- bsp/stm32/stm32f407-micu/board/Kconfig | 2 +- bsp/stm32/stm32f407-rt-spark/board/Kconfig | 2 +- bsp/stm32/stm32f411-atk-nano/board/Kconfig | 2 +- .../arduino_pinout/pins_arduino.h | 2 +- bsp/stm32/stm32f411-st-nucleo/board/Kconfig | 2 +- .../stm32f411-weact-blackpill/board/Kconfig | 2 +- .../arduino_pinout/pins_arduino.h | 2 +- bsp/stm32/stm32f412-st-nucleo/board/Kconfig | 2 +- bsp/stm32/stm32f413-st-nucleo/board/Kconfig | 2 +- bsp/stm32/stm32f429-armfly-v6/board/Kconfig | 2 +- bsp/stm32/stm32f429-atk-apollo/board/Kconfig | 2 +- .../stm32f429-fire-challenger/board/Kconfig | 2 +- .../arduino_pinout/pins_arduino.h | 2 +- bsp/stm32/stm32f469-st-disco/board/Kconfig | 2 +- bsp/stm32/stm32f723-st-disco/project.ewp | 2 +- bsp/stm32/stm32f723-st-disco/project.uvprojx | 4 +- bsp/stm32/stm32f746-st-disco/board/Kconfig | 2 +- bsp/stm32/stm32f746-st-disco/project.ewp | 2 +- bsp/stm32/stm32f746-st-disco/project.uvprojx | 4 +- bsp/stm32/stm32f746-st-nucleo/board/Kconfig | 2 +- bsp/stm32/stm32f767-atk-apollo/board/Kconfig | 2 +- bsp/stm32/stm32g070-st-nucleo/board/Kconfig | 2 +- bsp/stm32/stm32g071-st-nucleo/board/Kconfig | 2 +- bsp/stm32/stm32g491-st-nucleo/board/Kconfig | 2 +- bsp/stm32/stm32h743-openmv-h7plus/project.ewp | 2 +- .../stm32h743-openmv-h7plus/project.uvprojx | 4 +- bsp/stm32/stm32h750-artpi/board/Kconfig | 2 +- .../stm32l433-ali-startkit/board/Kconfig | 2 +- .../arduino_pinout/pins_arduino.h | 2 +- bsp/stm32/stm32l475-atk-pandora/board/Kconfig | 2 +- .../arduino_pinout/pins_arduino.h | 2 +- bsp/stm32/stm32l476-st-nucleo/board/Kconfig | 2 +- .../stm32l496-ali-developer/board/Kconfig | 2 +- .../.ci/attachconfig/ci.attachconfig.yml | 1 + bsp/stm32/stm32l496-st-nucleo/board/Kconfig | 2 +- bsp/stm32/stm32l4r5-st-nucleo/board/Kconfig | 2 +- .../stm32mp157a-st-discovery/board/Kconfig | 2 +- .../board/ports/timer_sample.c | 32 +- bsp/stm32/stm32mp157a-st-ev1/board/Kconfig | 2 +- .../board/ports/timer_sample.c | 32 +- bsp/stm32/stm32wb55-st-nucleo/board/Kconfig | 2 +- .../libraries/SWM320_drivers/SConscript | 4 +- .../{drv_hwtimer.c => drv_timer.c} | 114 ++--- .../{drv_hwtimer.h => drv_timer.h} | 6 +- .../libraries/SWM341_drivers/SConscript | 4 +- .../{drv_hwtimer.c => drv_timer.c} | 136 +++--- .../{drv_hwtimer.h => drv_timer.h} | 6 +- bsp/synwit/swm320-mini/applications/main.c | 30 +- bsp/synwit/swm320-mini/board/Kconfig | 4 +- bsp/synwit/swm341-mini/applications/main.c | 24 +- bsp/synwit/swm341-mini/board/Kconfig | 4 +- bsp/tae32f5300/Libraries/SConscript | 2 +- bsp/tae32f5300/drivers/Kconfig | 2 +- bsp/tkm32F499/drivers/Kconfig | 2 +- bsp/tm4c123bsp/board/Kconfig | 2 +- bsp/tm4c123bsp/libraries/Drivers/SConscript | 4 +- .../libraries/TivaWare_C_series/SConscript | 2 +- bsp/ultrarisc/ur_dp1000_evb/board/board.c | 7 +- bsp/w60x/drivers/Kconfig | 8 +- bsp/w60x/drivers/SConscript | 2 +- bsp/w60x/drivers/drv_hw_timer.c | 54 +-- bsp/w60x/drivers/drv_hw_timer.h | 4 +- bsp/w60x/project.ewp | 2 +- bsp/w60x/project.uvprojx | 4 +- bsp/wch/arm/Libraries/ch32_drivers/SConscript | 8 +- ...wtimer_ch32f10x.c => drv_timer_ch32f10x.c} | 214 ++++----- ...wtimer_ch32f20x.c => drv_timer_ch32f20x.c} | 370 +++++++------- bsp/wch/arm/ch32f103c8-core/board/Kconfig | 44 +- bsp/wch/arm/ch32f103c8-core/board/board.c | 28 +- bsp/wch/arm/ch32f103c8-core/board/board.h | 4 +- bsp/wch/arm/ch32f10x_port_cn.md | 20 +- bsp/wch/arm/ch32f203r-evt/README.md | 2 +- bsp/wch/arm/ch32f203r-evt/board/Kconfig | 96 ++-- bsp/wch/arm/ch32f203r-evt/board/board.c | 68 +-- bsp/wch/arm/ch32f203r-evt/board/board.h | 4 +- bsp/wch/arm/ch32f203r-evt/project.uvprojx | 8 +- .../risc-v/Libraries/ch32_drivers/SConscript | 4 +- .../risc-v/Libraries/ch32_drivers/drv_pwm.h | 2 +- .../{drv_hwtimer.c => drv_timer.c} | 100 ++-- .../{drv_hwtimer.h => drv_timer.h} | 16 +- .../risc-v/Libraries/ch56x_drivers/SConscript | 2 +- .../Libraries/ch56x_drivers/ch56x_timer.c | 154 +++--- bsp/wch/risc-v/ch32v208w-r0/board/Kconfig | 104 ++-- bsp/wch/risc-v/ch32v307v-r1/board/Kconfig | 98 ++-- bsp/wch/risc-v/ch569w-evt/applications/test.c | 30 +- bsp/wch/risc-v/ch569w-evt/board/Kconfig | 2 +- bsp/wch/risc-v/yd-ch32v307vct6/board/Kconfig | 96 ++-- bsp/xuantie/virt64/c906/board/board.c | 6 +- bsp/zynqmp-r5-axu4ev/rtconfig.h | 6 +- components/drivers/Kconfig | 4 +- components/drivers/clock_time/Kconfig | 18 + components/drivers/clock_time/README.md | 39 ++ components/drivers/clock_time/README_zh.md | 28 ++ components/drivers/clock_time/SConscript | 42 ++ .../clock_time/arch/aarch64/cputimer.c | 59 +++ .../clock_time/arch/risc-v/virt64/cputimer.c | 63 +++ .../clock_boottime.c} | 52 +- .../hrtimer.c => clock_time/clock_hrtimer.c} | 221 ++++++--- .../clock_time_arm_arch.c} | 0 .../drivers/clock_time/clock_time_core.c | 232 +++++++++ .../hwtimer.c => clock_time/clock_timer.c} | 232 ++++++--- components/drivers/cputime/Kconfig | 34 -- components/drivers/cputime/SConscript | 18 - components/drivers/cputime/cputime.c | 116 ----- components/drivers/cputime/cputime_cortexm.c | 69 --- components/drivers/cputime/cputime_riscv.c | 37 -- components/drivers/cputime/cputimer.c | 339 ------------- components/drivers/hwtimer/Kconfig | 14 - components/drivers/hwtimer/SConscript | 18 - .../drivers/include/drivers/clock_time.h | 184 +++++++ .../drivers/include/drivers/core/master_id.h | 2 +- components/drivers/include/drivers/cputime.h | 38 -- components/drivers/include/drivers/cputimer.h | 48 -- components/drivers/include/drivers/hwtimer.h | 89 ---- components/drivers/include/rtdevice.h | 10 +- components/drivers/input/Kconfig | 2 +- components/drivers/input/input_uapi.c | 4 +- components/drivers/ktime/Kconfig | 3 - components/drivers/ktime/README.md | 63 --- components/drivers/ktime/SConscript | 24 - components/drivers/ktime/inc/ktime.h | 169 ------- .../drivers/ktime/src/aarch64/cputimer.c | 34 -- components/drivers/ktime/src/cputimer.c | 31 -- .../ktime/src/risc-v/virt64/cputimer.c | 35 -- components/drivers/pic/Kconfig | 2 +- components/drivers/pic/pic.c | 6 +- components/drivers/rtc/dev_soft_rtc.c | 22 +- components/libc/compilers/common/ctime.c | 76 +-- components/libc/posix/Kconfig | 4 +- .../lwp/arch/aarch64/common/vdso_data.c | 6 +- components/lwp/arch/risc-v/common/vdso_data.c | 6 +- .../6.components/device-driver/INDEX.md | 2 +- .../device-driver/clock_time/README.md | 89 ++++ .../device-driver/clock_time/README_zh.md | 78 +++ .../clock_time/clock_boottime.md | 87 ++++ .../clock_time/clock_boottime_zh.md | 78 +++ .../device-driver/clock_time/clock_hrtimer.md | 223 +++++++++ .../clock_time/clock_hrtimer_zh.md | 208 ++++++++ .../clock_time/clock_time_core.md | 274 +++++++++++ .../clock_time/clock_time_core_zh.md | 256 ++++++++++ .../hwtimer.md => clock_time/clock_timer.md} | 219 +++++++-- .../clock_time/clock_timer_zh.md | 370 ++++++++++++++ .../clock_time/figures/clock_time_arch.svg | 96 ++++ .../{hwtimer_test.c => clock_timer_test.c} | 24 +- libcpu/Kconfig | 2 +- libcpu/aarch64/common/SConscript | 2 +- libcpu/aarch64/common/gtimer.c | 8 +- libcpu/aarch64/common/setup.c | 24 +- libcpu/risc-v/common64/tick.c | 51 +- src/Kconfig | 2 +- src/utest/perf/Kconfig | 6 +- src/utest/perf/irq_latency_tc.c | 11 +- src/utest/perf/perf_tc.c | 20 +- src/utest/perf/perf_tc.h | 2 +- 660 files changed, 8461 insertions(+), 6713 deletions(-) rename bsp/ESP32_C3/drivers/{drv_hwtimer.c => drv_timer.c} (53%) rename bsp/ESP32_C3/drivers/{drv_hwtimer.h => drv_timer.h} (61%) rename bsp/Infineon/libraries/HAL_Drivers/{drv_hwtimer.c => drv_timer.c} (74%) rename bsp/Infineon/libraries/HAL_Drivers/{drv_hwtimer.h => drv_timer.h} (89%) rename bsp/acm32/acm32f0x0-nucleo/drivers/{drv_hwtimer.c => drv_timer.c} (77%) rename bsp/airm2m/air105/libraries/HAL_Driver/Inc/{core_hwtimer.h => core_clock_timer.h} (98%) rename bsp/airm2m/air105/libraries/HAL_Driver/Src/{core_hwtimer.c => core_clock_timer.c} (98%) rename bsp/airm2m/air32f103/libraries/rt_drivers/{drv_hwtimer.c => drv_timer.c} (37%) rename bsp/airm2m/air32f103/libraries/rt_drivers/{drv_hwtimer.h => drv_timer.h} (67%) rename bsp/apm32/libraries/Drivers/{drv_hwtimer.c => drv_timer.c} (84%) rename bsp/at32/libraries/rt_drivers/{drv_hwtimer.c => drv_timer.c} (80%) rename bsp/at32/libraries/rt_drivers/{drv_hwtimer.h => drv_timer.h} (95%) rename bsp/bluetrum/libraries/hal_drivers/{drv_hwtimer.c => drv_timer.c} (60%) rename bsp/bouffalo_lab/libraries/rt_drivers/{drv_hwtimer.c => drv_timer.c} (66%) rename bsp/bouffalo_lab/libraries/rt_drivers/{drv_hwtimer.h => drv_timer.h} (71%) rename bsp/bouffalo_lab/libraries/rt_drivers/sample/{hwtimer_sample.c => clock_timer_sample.c} (65%) rename bsp/essemi/{es32vf2264/drivers/ES/es_conf_info_hwtimer.h => es32f0654/drivers/ES/es_conf_info_clock_timer.h} (30%) delete mode 100644 bsp/essemi/es32f0654/drivers/drv_hwtimer.c create mode 100644 bsp/essemi/es32f0654/drivers/drv_timer.c rename bsp/essemi/{es32f365x/drivers/drv_hwtimer.h => es32f0654/drivers/drv_timer.h} (86%) rename bsp/essemi/{es32f369x/drivers/ES/es_conf_info_hwtimer.h => es32f365x/drivers/ES/es_conf_info_clock_timer.h} (30%) rename bsp/essemi/{es32f369x/drivers/drv_hwtimer.h => es32f365x/drivers/drv_timer.h} (86%) rename bsp/essemi/{es32f365x/drivers/ES/es_conf_info_hwtimer.h => es32f369x/drivers/ES/es_conf_info_clock_timer.h} (30%) delete mode 100644 bsp/essemi/es32f369x/drivers/drv_hwtimer.c create mode 100644 bsp/essemi/es32f369x/drivers/drv_timer.c rename bsp/essemi/{es32vf2264/drivers/drv_hwtimer.h => es32f369x/drivers/drv_timer.h} (86%) rename bsp/essemi/{es32f0654/drivers/ES/es_conf_info_hwtimer.h => es32vf2264/drivers/ES/es_conf_info_clock_timer.h} (30%) rename bsp/essemi/es32vf2264/drivers/{drv_hwtimer.c => drv_timer.c} (32%) rename bsp/essemi/{es32f0654/drivers/drv_hwtimer.h => es32vf2264/drivers/drv_timer.h} (86%) rename bsp/gd32/arm/libraries/gd32_drivers/{drv_hwtimer.c => drv_timer.c} (63%) rename bsp/hc32/libraries/hc32_drivers/{drv_hwtimer.c => drv_timer.c} (58%) rename bsp/hc32/tests/{test_hwtimer.c => test_clock_timer.c} (75%) create mode 100644 bsp/hpmicro/libraries/drivers/drv_delay.c rename bsp/hpmicro/libraries/drivers/{drv_hwtimer.c => drv_timer.c} (79%) rename bsp/hpmicro/libraries/drivers/{drv_hwtimer.h => drv_timer.h} (42%) rename bsp/k230/drivers/interdrv/{hwtimer => clock_timer}/SConscript (100%) rename bsp/k230/drivers/interdrv/{hwtimer => clock_timer}/drv_timer.c (84%) rename bsp/k230/drivers/interdrv/{hwtimer => clock_timer}/drv_timer.h (98%) rename bsp/n32/libraries/n32_drivers/{drv_hwtimer.c => drv_timer.c} (66%) rename bsp/n32/libraries/n32_drivers/{drv_hwtimer.h => drv_timer.h} (64%) rename bsp/n32g452xx/Libraries/rt_drivers/{drv_hwtimer.c => drv_timer.c} (77%) rename bsp/n32g452xx/Libraries/rt_drivers/{drv_hwtimer.h => drv_timer.h} (96%) rename bsp/nrf5x/libraries/drivers/{drv_hwtimer.c => drv_timer.c} (80%) rename bsp/nuclei/libraries/gd32vf103/HAL_Drivers/{drv_hwtimer.c => drv_timer.c} (46%) rename bsp/nuclei/libraries/gd32vf103/HAL_Drivers/{drv_hwtimer.h => drv_timer.h} (68%) rename bsp/nxp/imx/imxrt/libraries/drivers/{drv_hwtimer.c => drv_timer.c} (58%) rename bsp/nxp/imx/imxrt/libraries/drivers/{drv_hwtimer.h => drv_timer.h} (83%) rename bsp/nxp/lpc/lpc408x/drivers/{drv_hwtimer.c => drv_timer.c} (70%) rename bsp/nxp/lpc/lpc408x/drivers/{drv_hwtimer.h => drv_timer.h} (63%) rename bsp/nxp/lpc/lpc55sxx/Libraries/drivers/{drv_hwtimer.c => drv_timer.c} (52%) rename bsp/nxp/lpc/lpc55sxx/Libraries/drivers/{drv_hwtimer.h => drv_timer.h} (91%) rename bsp/nxp/mcx/mcxa/Libraries/drivers/{drv_hwtimer.c => drv_timer.c} (59%) rename bsp/nxp/mcx/mcxn/Libraries/drivers/{drv_hwtimer.c => drv_timer.c} (50%) rename bsp/nxp/mcx/mcxn/Libraries/drivers/{drv_hwtimer.h => drv_timer.h} (66%) rename bsp/raspberry-pico/Drivers/{drv_hwtimer.c => drv_timer.c} (57%) rename bsp/raspberry-pico/Drivers/{drv_hwtimer.h => drv_timer.h} (67%) rename bsp/renesas/libraries/HAL_Drivers/drivers/{drv_hwtimer.c => drv_timer.c} (69%) rename bsp/renesas/libraries/HAL_Drivers/drivers/{drv_hwtimer.h => drv_timer.h} (85%) rename bsp/rockchip/dm/hwtimer/{hwtimer-rockchip_timer.c => clock_timer-rockchip_timer.c} (62%) mode change 100755 => 100644 rename bsp/synwit/libraries/SWM320_drivers/{drv_hwtimer.c => drv_timer.c} (59%) rename bsp/synwit/libraries/SWM320_drivers/{drv_hwtimer.h => drv_timer.h} (75%) rename bsp/synwit/libraries/SWM341_drivers/{drv_hwtimer.c => drv_timer.c} (70%) rename bsp/synwit/libraries/SWM341_drivers/{drv_hwtimer.h => drv_timer.h} (72%) rename bsp/wch/arm/Libraries/ch32_drivers/{drv_hwtimer_ch32f10x.c => drv_timer_ch32f10x.c} (36%) rename bsp/wch/arm/Libraries/ch32_drivers/{drv_hwtimer_ch32f20x.c => drv_timer_ch32f20x.c} (32%) rename bsp/wch/risc-v/Libraries/ch32_drivers/{drv_hwtimer.c => drv_timer.c} (76%) rename bsp/wch/risc-v/Libraries/ch32_drivers/{drv_hwtimer.h => drv_timer.h} (94%) create mode 100644 components/drivers/clock_time/Kconfig create mode 100644 components/drivers/clock_time/README.md create mode 100644 components/drivers/clock_time/README_zh.md create mode 100644 components/drivers/clock_time/SConscript create mode 100644 components/drivers/clock_time/arch/aarch64/cputimer.c create mode 100644 components/drivers/clock_time/arch/risc-v/virt64/cputimer.c rename components/drivers/{ktime/src/boottime.c => clock_time/clock_boottime.c} (33%) rename components/drivers/{ktime/src/hrtimer.c => clock_time/clock_hrtimer.c} (57%) rename components/drivers/{hwtimer/hwtimer-arm_arch.c => clock_time/clock_time_arm_arch.c} (100%) create mode 100644 components/drivers/clock_time/clock_time_core.c rename components/drivers/{hwtimer/hwtimer.c => clock_time/clock_timer.c} (52%) delete mode 100644 components/drivers/cputime/Kconfig delete mode 100644 components/drivers/cputime/SConscript delete mode 100644 components/drivers/cputime/cputime.c delete mode 100644 components/drivers/cputime/cputime_cortexm.c delete mode 100644 components/drivers/cputime/cputime_riscv.c delete mode 100644 components/drivers/cputime/cputimer.c delete mode 100644 components/drivers/hwtimer/Kconfig delete mode 100644 components/drivers/hwtimer/SConscript create mode 100644 components/drivers/include/drivers/clock_time.h delete mode 100644 components/drivers/include/drivers/cputime.h delete mode 100644 components/drivers/include/drivers/cputimer.h delete mode 100644 components/drivers/include/drivers/hwtimer.h delete mode 100644 components/drivers/ktime/Kconfig delete mode 100644 components/drivers/ktime/README.md delete mode 100644 components/drivers/ktime/SConscript delete mode 100644 components/drivers/ktime/inc/ktime.h delete mode 100644 components/drivers/ktime/src/aarch64/cputimer.c delete mode 100644 components/drivers/ktime/src/cputimer.c delete mode 100644 components/drivers/ktime/src/risc-v/virt64/cputimer.c create mode 100644 documentation/6.components/device-driver/clock_time/README.md create mode 100644 documentation/6.components/device-driver/clock_time/README_zh.md create mode 100644 documentation/6.components/device-driver/clock_time/clock_boottime.md create mode 100644 documentation/6.components/device-driver/clock_time/clock_boottime_zh.md create mode 100644 documentation/6.components/device-driver/clock_time/clock_hrtimer.md create mode 100644 documentation/6.components/device-driver/clock_time/clock_hrtimer_zh.md create mode 100644 documentation/6.components/device-driver/clock_time/clock_time_core.md create mode 100644 documentation/6.components/device-driver/clock_time/clock_time_core_zh.md rename documentation/6.components/device-driver/{hwtimer/hwtimer.md => clock_time/clock_timer.md} (64%) create mode 100644 documentation/6.components/device-driver/clock_time/clock_timer_zh.md create mode 100644 documentation/6.components/device-driver/clock_time/figures/clock_time_arch.svg rename examples/test/{hwtimer_test.c => clock_timer_test.c} (80%) diff --git a/bsp/ESP32_C3/README.md b/bsp/ESP32_C3/README.md index 474f5da46b..5f61eff7d4 100644 --- a/bsp/ESP32_C3/README.md +++ b/bsp/ESP32_C3/README.md @@ -47,7 +47,7 @@ Each peripheral supporting condition for this BSP is as follows: | WIFI | Partial support | There are currently some problems, such as `rt_mq_recive` cannot be used in ISR, etc. | | BLE | Partially supported | There are currently some problems, such as `NimBLE` running errors after starting for a while | | GDBStub | Support | You can use the GDB provided by ESP-IDF by turning on the `BSP_ENABLE_GDBSTUB` switch, which will enter GDB mode after a chip error | -| HWTIMER | Support | +| CLOCK_TIMER | Support | Note: 1. WIFI and BLE cannot be enabled at the same time. When using the BLE driver, be sure to turn off the `RT_USING_WIFI` and `LWIP` switches in `menuconfig`. In addition, due to limited capabilities and lack of debugging equipment, there are problems with WIFI and BLE driver operation. If it can be solved, please contact [timwcx@qq.com](mailto:timwcx@qq.com). diff --git a/bsp/ESP32_C3/README_ZH.md b/bsp/ESP32_C3/README_ZH.md index 967d82baa3..c0014ac86f 100644 --- a/bsp/ESP32_C3/README_ZH.md +++ b/bsp/ESP32_C3/README_ZH.md @@ -54,7 +54,7 @@ | WIFI | 部分支持 | 目前存在一些问题,例如不能在ISR中使用`rt_mq_recive`等 | | BLE | 部分支持 | 目前存在一些问题,例如`NimBLE`启动一段时间后运行错误 | | GDBStub | 支持 | 通过开启`BSP_ENABLE_GDBSTUB`开关即可使用ESP-IDF所提供的GDB,其会在芯片出错后进入GDB模式 | -| HWTIMER | 支持 | +| CLOCK_TIMER | 支持 | 注: 1、WIFI和BLE不能同时启用,在使用BLE驱动时注意在`menuconfig`中关闭`RT_USING_WIFI`和`LWIP`开关。另外由于能力有限且缺乏调试设备,WIFI和BLE驱动运行都有问题,如果可以解决联系[timwcx@qq.com](mailto:timwcx@qq.com)。 diff --git a/bsp/ESP32_C3/drivers/Kconfig b/bsp/ESP32_C3/drivers/Kconfig index 2d6c4326e9..b7cb8f1275 100644 --- a/bsp/ESP32_C3/drivers/Kconfig +++ b/bsp/ESP32_C3/drivers/Kconfig @@ -115,13 +115,13 @@ menu "On-chip Peripheral Drivers" bool "Enable BLE" default n - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" - select RT_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" + select RT_USING_CLOCK_TIME default n - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config BSP_USING_TIMER0 - bool "Enable HWTIMER0" + bool "Enable CLOCK_TIMER0" default n endif diff --git a/bsp/ESP32_C3/drivers/SConscript b/bsp/ESP32_C3/drivers/SConscript index 55e9a09d1d..74d91cca65 100644 --- a/bsp/ESP32_C3/drivers/SConscript +++ b/bsp/ESP32_C3/drivers/SConscript @@ -24,8 +24,8 @@ if GetDepend('BSP_USING_SW_I2C'): if GetDepend('BSP_USING_PWM'): src += ['drv_pwm.c'] -if GetDepend('BSP_USING_HWTIMER'): - src += ['drv_hwtimer.c'] +if GetDepend('BSP_USING_CLOCK_TIMER'): + src += ['drv_timer.c'] if GetDepend('BSP_USING_WIFI'): src += ['drv_wifi.c'] diff --git a/bsp/ESP32_C3/drivers/drv_hwtimer.c b/bsp/ESP32_C3/drivers/drv_timer.c similarity index 53% rename from bsp/ESP32_C3/drivers/drv_hwtimer.c rename to bsp/ESP32_C3/drivers/drv_timer.c index 63d33d9a91..7c0766e609 100644 --- a/bsp/ESP32_C3/drivers/drv_hwtimer.c +++ b/bsp/ESP32_C3/drivers/drv_timer.c @@ -8,24 +8,24 @@ * 2023-11-15 BetMul first version */ -#include "drv_hwtimer.h" +#include "drv_timer.h" #include #include #include "driver/gptimer.h" #include "sdkconfig.h" -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME /** - * handle interrupt for hwtimer. + * handle interrupt for clock_timer. */ -static bool mcu_hwtimer_intr_handler(gptimer_handle_t gptimer, const gptimer_alarm_event_data_t *edata, void *user_ctx) +static bool mcu_clock_timer_intr_handler(gptimer_handle_t gptimer, const gptimer_alarm_event_data_t *edata, void *user_ctx) { rt_interrupt_enter(); - rt_hwtimer_t *hwtimer = (rt_hwtimer_t *)user_ctx; - rt_device_hwtimer_isr(hwtimer); + rt_clock_timer_t *clock_timer = (rt_clock_timer_t *)user_ctx; + rt_clock_timer_isr(clock_timer); rt_interrupt_leave(); @@ -33,9 +33,9 @@ static bool mcu_hwtimer_intr_handler(gptimer_handle_t gptimer, const gptimer_ala } /** - * init the hwtimer + * init the clock_timer */ -static void mcu_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void mcu_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { gptimer_handle_t gptimer = (gptimer_handle_t)timer->parent.user_data; @@ -44,15 +44,15 @@ static void mcu_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) } /** - * start the hwtimer, change status into running + * start the clock_timer, change status into running */ -static rt_err_t mcu_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t mcu_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { gptimer_handle_t gptimer = (gptimer_handle_t)timer->parent.user_data; gptimer_alarm_config_t alarm_config = { .alarm_count = cnt, }; - if (mode == HWTIMER_MODE_ONESHOT) + if (mode == CLOCK_TIMER_MODE_ONESHOT) { } @@ -68,9 +68,9 @@ static rt_err_t mcu_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtim } /** - * stop the hwtimer, change the status from running into enable + * stop the clock_timer, change the status from running into enable */ -static void mcu_hwtimer_stop(rt_hwtimer_t *timer) +static void mcu_clock_timer_stop(rt_clock_timer_t *timer) { gptimer_handle_t gptimer = (gptimer_handle_t)timer->parent.user_data; @@ -80,7 +80,7 @@ static void mcu_hwtimer_stop(rt_hwtimer_t *timer) /** * get count */ -static rt_uint32_t mcu_hwtimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t mcu_clock_timer_count_get(rt_clock_timer_t *timer) { gptimer_handle_t gptimer = (gptimer_handle_t)timer->parent.user_data; // get count number @@ -90,53 +90,53 @@ static rt_uint32_t mcu_hwtimer_count_get(rt_hwtimer_t *timer) } /** - * control the hwtimer + * control the clock_timer */ -static rt_err_t mcu_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t mcu_clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t err = RT_EOK; switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: err = -RT_ERROR; break; - case HWTIMER_CTRL_INFO_GET: + case CLOCK_TIMER_CTRL_INFO_GET: err = -RT_ERROR; break; - case HWTIMER_CTRL_MODE_SET: + case CLOCK_TIMER_CTRL_MODE_SET: timer->mode = *(rt_uint32_t *)args; break; - case HWTIMER_CTRL_STOP: - mcu_hwtimer_stop(timer); + case CLOCK_TIMER_CTRL_STOP: + mcu_clock_timer_stop(timer); break; } return err; } -static struct rt_hwtimer_device _hwtimer; -static const struct rt_hwtimer_ops _hwtimer_ops = +static struct rt_clock_timer_device _clock_timer; +static const struct rt_clock_timer_ops _clock_timer_ops = { - .init = mcu_hwtimer_init, - .start = mcu_hwtimer_start, - .stop = mcu_hwtimer_stop, - .count_get = mcu_hwtimer_count_get, - .control = mcu_hwtimer_control}; + .init = mcu_clock_timer_init, + .start = mcu_clock_timer_start, + .stop = mcu_clock_timer_stop, + .count_get = mcu_clock_timer_count_get, + .control = mcu_clock_timer_control}; -static const struct rt_hwtimer_info _hwtimer_info = +static const struct rt_clock_timer_info _clock_timer_info = { // TODO:what is the true max and min? .maxfreq = 1000000UL, .minfreq = 1000000UL, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_MODE_ONESHOT}; + .cntmode = CLOCK_TIMER_MODE_ONESHOT}; -int rt_hw_hwtimer_init(void) +int rt_hw_clock_timer_init(void) { char *name = "timer0"; @@ -149,18 +149,18 @@ int rt_hw_hwtimer_init(void) }; gptimer_event_callbacks_t cbs = { - .on_alarm = mcu_hwtimer_intr_handler, + .on_alarm = mcu_clock_timer_intr_handler, }; ESP_ERROR_CHECK(gptimer_new_timer(&timer_config, &gptimer)); - ESP_ERROR_CHECK(gptimer_register_event_callbacks(gptimer, &cbs, &_hwtimer)); + ESP_ERROR_CHECK(gptimer_register_event_callbacks(gptimer, &cbs, &_clock_timer)); - _hwtimer.info = &_hwtimer_info; - _hwtimer.ops = &_hwtimer_ops; + _clock_timer.info = &_clock_timer_info; + _clock_timer.ops = &_clock_timer_ops; - return rt_device_hwtimer_register(&_hwtimer, name, (void *)gptimer); + return rt_clock_timer_register(&_clock_timer, name, (void *)gptimer); } -INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); -#endif /* RT_USING_HWTIMER */ +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); +#endif /* RT_USING_CLOCK_TIME */ diff --git a/bsp/ESP32_C3/drivers/drv_hwtimer.h b/bsp/ESP32_C3/drivers/drv_timer.h similarity index 61% rename from bsp/ESP32_C3/drivers/drv_hwtimer.h rename to bsp/ESP32_C3/drivers/drv_timer.h index a5a62fe003..87a1ee495c 100644 --- a/bsp/ESP32_C3/drivers/drv_hwtimer.h +++ b/bsp/ESP32_C3/drivers/drv_timer.h @@ -7,14 +7,14 @@ * Date Author Notes * 2023-11-15 BetMul first version */ -#ifndef __DRV_HWTIMER_H__ -#define __DRV_HWTIMER_H__ +#ifndef __DRV_CLOCK_TIMER_H__ +#define __DRV_CLOCK_TIMER_H__ #include -#ifdef RT_USING_HWTIMER -int rt_hw_hwtimer_init(void); +#ifdef RT_USING_CLOCK_TIME +int rt_hw_clock_timer_init(void); #endif -#endif /* __DRV_HWTIMER_H__ */ +#endif /* __DRV_CLOCK_TIMER_H__ */ diff --git a/bsp/Infineon/libraries/HAL_Drivers/SConscript b/bsp/Infineon/libraries/HAL_Drivers/SConscript index 2b7bb6f2e7..017b3cb4d7 100644 --- a/bsp/Infineon/libraries/HAL_Drivers/SConscript +++ b/bsp/Infineon/libraries/HAL_Drivers/SConscript @@ -57,7 +57,7 @@ if GetDepend(['RT_USING_DAC']): src += ['drv_dac.c'] if GetDepend(['BSP_USING_TIM']): - src += ['drv_hwtimer.c'] + src += ['drv_timer.c'] if GetDepend(['BSP_USING_ETH']): src += ['drv_eth.c'] diff --git a/bsp/Infineon/libraries/HAL_Drivers/drv_hwtimer.c b/bsp/Infineon/libraries/HAL_Drivers/drv_timer.c similarity index 74% rename from bsp/Infineon/libraries/HAL_Drivers/drv_hwtimer.c rename to bsp/Infineon/libraries/HAL_Drivers/drv_timer.c index 722c420cc5..946885686f 100644 --- a/bsp/Infineon/libraries/HAL_Drivers/drv_hwtimer.c +++ b/bsp/Infineon/libraries/HAL_Drivers/drv_timer.c @@ -8,18 +8,18 @@ * 2022-07-29 rtthread qiu first version */ #include "drv_common.h" -#include "drv_hwtimer.h" +#include "drv_timer.h" #include #ifdef BSP_USING_TIM /*#define DRV_DEBUG*/ -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include static void isr_timer(void *callback_arg, cyhal_timer_event_t event); -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME enum { #ifdef BSP_USING_TIM1 @@ -30,15 +30,15 @@ enum #endif }; -struct cyp_hwtimer +struct cyp_clock_timer { - rt_hwtimer_t time_device; + rt_clock_timer_t time_device; cyhal_timer_t tim_handle; IRQn_Type tim_irqn; char *name; }; -static struct cyp_hwtimer cyp_hwtimer_obj[] = +static struct cyp_clock_timer cyp_clock_timer_obj[] = { #ifdef BSP_USING_TIM1 TIM1_CONFIG, @@ -48,7 +48,7 @@ static struct cyp_hwtimer cyp_hwtimer_obj[] = #endif }; -static void timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { RT_ASSERT(timer != RT_NULL); @@ -98,7 +98,7 @@ static void timer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +static rt_err_t timer_start(rt_clock_timer_t *timer, rt_uint32_t t, rt_clock_timer_mode_t opmode) { RT_ASSERT(timer != RT_NULL); RT_ASSERT(opmode != RT_NULL); @@ -122,7 +122,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ duration */ cyhal_timer_configure(tim, &init_timer_cfg); - if (opmode == HWTIMER_MODE_ONESHOT) + if (opmode == CLOCK_TIMER_MODE_ONESHOT) { /* set timer to single mode */ cyhal_timer_stop(tim); @@ -148,7 +148,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ return result; } -static void timer_stop(rt_hwtimer_t *timer) +static void timer_stop(rt_clock_timer_t *timer) { RT_ASSERT(timer != RT_NULL); @@ -160,7 +160,7 @@ static void timer_stop(rt_hwtimer_t *timer) cyhal_timer_stop(tim); } -static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t timer_counter_get(rt_clock_timer_t *timer) { cyhal_timer_t *tim = RT_NULL; @@ -175,7 +175,7 @@ static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) return count; } -static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { RT_ASSERT(timer != RT_NULL); RT_ASSERT(arg != RT_NULL); @@ -188,7 +188,7 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t freq; rt_uint16_t val; @@ -213,9 +213,9 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) return result; } -static const struct rt_hwtimer_info _info = TIM_DEV_INFO_CONFIG; +static const struct rt_clock_timer_info _info = TIM_DEV_INFO_CONFIG; -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_ops _ops = { .init = timer_init, .start = timer_start, @@ -232,79 +232,79 @@ static void isr_timer(void *callback_arg, cyhal_timer_event_t event) (void)callback_arg; (void)event; #ifdef BSP_USING_TIM1 - rt_device_hwtimer_isr(&cyp_hwtimer_obj[TIM1_INDEX].time_device); + rt_clock_timer_isr(&cyp_clock_timer_obj[TIM1_INDEX].time_device); #endif #ifdef BSP_USING_TIM2 - rt_device_hwtimer_isr(&cyp_hwtimer_obj[TIM2_INDEX].time_device); + rt_clock_timer_isr(&cyp_clock_timer_obj[TIM2_INDEX].time_device); #endif /* leave interrupt */ rt_interrupt_leave(); } -int cyp_hwtimer_init(void) +int cyp_clock_timer_init(void) { int i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(cyp_hwtimer_obj) / sizeof(cyp_hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(cyp_clock_timer_obj) / sizeof(cyp_clock_timer_obj[0]); i++) { - cyp_hwtimer_obj[i].time_device.info = &_info; - cyp_hwtimer_obj[i].time_device.ops = &_ops; - if (rt_device_hwtimer_register(&cyp_hwtimer_obj[i].time_device, cyp_hwtimer_obj[i].name, &cyp_hwtimer_obj[i].tim_handle) != RT_EOK) + cyp_clock_timer_obj[i].time_device.info = &_info; + cyp_clock_timer_obj[i].time_device.ops = &_ops; + if (rt_clock_timer_register(&cyp_clock_timer_obj[i].time_device, cyp_clock_timer_obj[i].name, &cyp_clock_timer_obj[i].tim_handle) != RT_EOK) { - LOG_E("%s register failed", cyp_hwtimer_obj[i].name); + LOG_E("%s register failed", cyp_clock_timer_obj[i].name); result = -RT_ERROR; } } return result; } -INIT_BOARD_EXPORT(cyp_hwtimer_init); +INIT_BOARD_EXPORT(cyp_clock_timer_init); -#endif /*RT_USING_HWTIMER*/ +#endif /*RT_USING_CLOCK_TIME*/ #endif /*BSP_USING_TIM*/ -/* this is a hwtimer test demo*/ +/* this is a clock_timer test demo*/ #include #include -#define HWTIMER_DEV_NAME "time2" /* device name */ +#define CLOCK_TIMER_DEV_NAME "time2" /* device name */ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { - rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("this is clock_timer timeout callback fucntion!\n"); rt_kprintf("tick is :%d !\n", rt_tick_get()); return 0; } -int hwtimer_sample() +int clock_timer_sample() { rt_err_t ret = RT_EOK; - rt_hwtimerval_t timeout_s; + rt_clock_timerval_t timeout_s; rt_device_t hw_dev = RT_NULL; - rt_hwtimer_mode_t mode; + rt_clock_timer_mode_t mode; rt_uint32_t freq = 10000; - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", CLOCK_TIMER_DEV_NAME); return -RT_ERROR; } ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); if (ret != RT_EOK) { - rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + rt_kprintf("open %s device failed!\n", CLOCK_TIMER_DEV_NAME); return ret; } rt_device_set_rx_indicate(hw_dev, timeout_cb); - rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq); + rt_device_control(hw_dev, CLOCK_TIMER_CTRL_FREQ_SET, &freq); - mode = HWTIMER_MODE_PERIOD; - ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); if (ret != RT_EOK) { rt_kprintf("set mode failed! ret is :%d\n", ret); @@ -329,4 +329,4 @@ int hwtimer_sample() } return ret; } -MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); +MSH_CMD_EXPORT(clock_timer_sample, clock_timer sample); diff --git a/bsp/Infineon/libraries/HAL_Drivers/drv_hwtimer.h b/bsp/Infineon/libraries/HAL_Drivers/drv_timer.h similarity index 89% rename from bsp/Infineon/libraries/HAL_Drivers/drv_hwtimer.h rename to bsp/Infineon/libraries/HAL_Drivers/drv_timer.h index a94447bdc9..68016814e7 100644 --- a/bsp/Infineon/libraries/HAL_Drivers/drv_hwtimer.h +++ b/bsp/Infineon/libraries/HAL_Drivers/drv_timer.h @@ -8,8 +8,8 @@ * 2022-07-29 rtthread qiu first version */ -#ifndef __DRV_HWTIMER_H__ -#define __DRV_HWTIMER_H__ +#ifndef __DRV_CLOCK_TIMER_H__ +#define __DRV_CLOCK_TIMER_H__ #include @@ -24,7 +24,7 @@ .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ @@ -48,4 +48,4 @@ #endif /*TIM2_CONFIG*/ #endif /* BSP_USING_TIM2 */ -#endif /* __DRV_HWTIMER_H__ */ +#endif /* __DRV_CLOCK_TIMER_H__ */ diff --git a/bsp/Infineon/libraries/templates/PSOC62/board/Kconfig b/bsp/Infineon/libraries/templates/PSOC62/board/Kconfig index a8951998f0..07a230d796 100644 --- a/bsp/Infineon/libraries/templates/PSOC62/board/Kconfig +++ b/bsp/Infineon/libraries/templates/PSOC62/board/Kconfig @@ -239,7 +239,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM1 bool "Enable TIM1" diff --git a/bsp/Infineon/psoc6-cy8ckit-062-BLE/board/Kconfig b/bsp/Infineon/psoc6-cy8ckit-062-BLE/board/Kconfig index 90781dde3a..77a4380e4a 100644 --- a/bsp/Infineon/psoc6-cy8ckit-062-BLE/board/Kconfig +++ b/bsp/Infineon/psoc6-cy8ckit-062-BLE/board/Kconfig @@ -239,7 +239,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM1 bool "Enable TIM1" diff --git a/bsp/Infineon/psoc6-cy8ckit-062-WIFI-BT/board/Kconfig b/bsp/Infineon/psoc6-cy8ckit-062-WIFI-BT/board/Kconfig index 21baa70b2c..6b19951456 100644 --- a/bsp/Infineon/psoc6-cy8ckit-062-WIFI-BT/board/Kconfig +++ b/bsp/Infineon/psoc6-cy8ckit-062-WIFI-BT/board/Kconfig @@ -247,7 +247,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM1 bool "Enable TIM1" diff --git a/bsp/Infineon/psoc6-cy8ckit-062S2-43012/board/Kconfig b/bsp/Infineon/psoc6-cy8ckit-062S2-43012/board/Kconfig index 1fa9c5dcc6..0a5cec3667 100644 --- a/bsp/Infineon/psoc6-cy8ckit-062S2-43012/board/Kconfig +++ b/bsp/Infineon/psoc6-cy8ckit-062S2-43012/board/Kconfig @@ -251,7 +251,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM1 bool "Enable TIM1" diff --git a/bsp/Infineon/psoc6-cy8ckit-062s4/board/Kconfig b/bsp/Infineon/psoc6-cy8ckit-062s4/board/Kconfig index baf6aa1bc1..bfe1fd8b86 100644 --- a/bsp/Infineon/psoc6-cy8ckit-062s4/board/Kconfig +++ b/bsp/Infineon/psoc6-cy8ckit-062s4/board/Kconfig @@ -239,7 +239,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM1 bool "Enable TIM1" diff --git a/bsp/Infineon/psoc6-cy8cproto-062S3-4343W/board/Kconfig b/bsp/Infineon/psoc6-cy8cproto-062S3-4343W/board/Kconfig index 34f66f7e84..6006e7e97d 100644 --- a/bsp/Infineon/psoc6-cy8cproto-062S3-4343W/board/Kconfig +++ b/bsp/Infineon/psoc6-cy8cproto-062S3-4343W/board/Kconfig @@ -251,7 +251,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM1 bool "Enable TIM1" diff --git a/bsp/Infineon/psoc6-evaluationkit-062S2/board/Kconfig b/bsp/Infineon/psoc6-evaluationkit-062S2/board/Kconfig index f528ce3769..ef00b67eba 100644 --- a/bsp/Infineon/psoc6-evaluationkit-062S2/board/Kconfig +++ b/bsp/Infineon/psoc6-evaluationkit-062S2/board/Kconfig @@ -295,7 +295,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM1 bool "Enable TIM1" diff --git a/bsp/Vango/v85xx/Kconfig b/bsp/Vango/v85xx/Kconfig index a479feb3d5..2f98c8961e 100644 --- a/bsp/Vango/v85xx/Kconfig +++ b/bsp/Vango/v85xx/Kconfig @@ -57,34 +57,34 @@ menu "On-chip Peripheral Drivers" bool "using adc1" default n endif - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER0 - bool "using hwtimer0" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER0 + bool "using clock_timer0" default n - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n endif config BSP_USING_WDT diff --git a/bsp/Vango/v85xx/README.md b/bsp/Vango/v85xx/README.md index 6790ed6af4..8d2840776c 100644 --- a/bsp/Vango/v85xx/README.md +++ b/bsp/Vango/v85xx/README.md @@ -51,7 +51,7 @@ msh /> | UART | 支持 | UART0~4 | | GPIO | 支持 | GPIOB~F | | ADC | 未支持 | ADC0~7 | -| HWTIMER | 未支持 | TIMER0~3 | +| CLOCK_TIMER | 未支持 | TIMER0~3 | | RTC | 未支持 | RTC | | WDT | 未支持 | Free watchdog timer | | IIC | 未支持 | I2C0 | diff --git a/bsp/Vango/v85xx/drivers/SConscript b/bsp/Vango/v85xx/drivers/SConscript index c6cf664e49..1b26f5d785 100644 --- a/bsp/Vango/v85xx/drivers/SConscript +++ b/bsp/Vango/v85xx/drivers/SConscript @@ -21,8 +21,8 @@ if GetDepend('RT_USING_PIN'): if GetDepend('RT_USING_ADC'): src += ['drv_adc.c'] -if GetDepend('RT_USING_HWTIMER'): - src += ['drv_hwtimer.c'] +if GetDepend('RT_USING_CLOCK_TIME'): + src += ['drv_timer.c'] if GetDepend('RT_USING_RTC'): src += ['drv_rtc.c'] diff --git a/bsp/Vango/v85xx/drivers/drv_comm.h b/bsp/Vango/v85xx/drivers/drv_comm.h index 78724c7e18..ea6bb51f2a 100644 --- a/bsp/Vango/v85xx/drivers/drv_comm.h +++ b/bsp/Vango/v85xx/drivers/drv_comm.h @@ -23,5 +23,5 @@ extern "C" { } #endif -#endif /* __DRV_HWTIMER_H__ */ +#endif /* __DRV_CLOCK_TIMER_H__ */ diff --git a/bsp/Vango/v85xxp/Kconfig b/bsp/Vango/v85xxp/Kconfig index 0c9ea2319a..509ec78063 100644 --- a/bsp/Vango/v85xxp/Kconfig +++ b/bsp/Vango/v85xxp/Kconfig @@ -57,22 +57,22 @@ menu "On-chip Peripheral Drivers" bool "using adc0" default n endif - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER0 - bool "using hwtimer0" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER0 + bool "using clock_timer0" default n - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n endif config BSP_USING_WDT diff --git a/bsp/Vango/v85xxp/README.md b/bsp/Vango/v85xxp/README.md index f22b7e4f42..996b7ac8e2 100644 --- a/bsp/Vango/v85xxp/README.md +++ b/bsp/Vango/v85xxp/README.md @@ -51,7 +51,7 @@ msh /> | UART | 支持 | UART0~5 | | GPIO | 支持 | GPIOA~F | | ADC | 未支持 | ADC0~7 | -| HWTIMER | 未支持 | TIMER0~3 | +| CLOCK_TIMER | 未支持 | TIMER0~3 | | RTC | 未支持 | RTC | | WDT | 未支持 | Free watchdog timer | | IIC | 未支持 | I2C0 | diff --git a/bsp/Vango/v85xxp/drivers/SConscript b/bsp/Vango/v85xxp/drivers/SConscript index 30a1a338d0..4979b8969e 100644 --- a/bsp/Vango/v85xxp/drivers/SConscript +++ b/bsp/Vango/v85xxp/drivers/SConscript @@ -21,8 +21,8 @@ if GetDepend('RT_USING_PIN'): if GetDepend('RT_USING_ADC'): src += ['drv_adc.c'] -if GetDepend('RT_USING_HWTIMER'): - src += ['drv_hwtimer.c'] +if GetDepend('RT_USING_CLOCK_TIME'): + src += ['drv_timer.c'] if GetDepend('RT_USING_RTC'): src += ['drv_rtc.c'] diff --git a/bsp/Vango/v85xxp/drivers/drv_comm.h b/bsp/Vango/v85xxp/drivers/drv_comm.h index 78724c7e18..ea6bb51f2a 100644 --- a/bsp/Vango/v85xxp/drivers/drv_comm.h +++ b/bsp/Vango/v85xxp/drivers/drv_comm.h @@ -23,5 +23,5 @@ extern "C" { } #endif -#endif /* __DRV_HWTIMER_H__ */ +#endif /* __DRV_CLOCK_TIMER_H__ */ diff --git a/bsp/acm32/acm32f0x0-nucleo/drivers/Kconfig b/bsp/acm32/acm32f0x0-nucleo/drivers/Kconfig index 2b263f5e32..e112183e2b 100644 --- a/bsp/acm32/acm32f0x0-nucleo/drivers/Kconfig +++ b/bsp/acm32/acm32f0x0-nucleo/drivers/Kconfig @@ -139,31 +139,31 @@ menu "On-chip Peripheral Drivers" config BSP_USING_TIM1 bool "Enable Timer1" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM3 bool "Enable Timer3" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM6 bool "Enable Timer6" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM14 bool "Enable Timer14" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM15 bool "Enable Timer15" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM16 bool "Enable Timer16" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM17 bool "Enable Timer17" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME endmenu menu "Hardware WDT" diff --git a/bsp/acm32/acm32f0x0-nucleo/drivers/drv_hwtimer.c b/bsp/acm32/acm32f0x0-nucleo/drivers/drv_timer.c similarity index 77% rename from bsp/acm32/acm32f0x0-nucleo/drivers/drv_hwtimer.c rename to bsp/acm32/acm32f0x0-nucleo/drivers/drv_timer.c index 9b34ef869b..0060b5f795 100644 --- a/bsp/acm32/acm32f0x0-nucleo/drivers/drv_hwtimer.c +++ b/bsp/acm32/acm32f0x0-nucleo/drivers/drv_timer.c @@ -12,7 +12,7 @@ #include #include -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME #include "tim_config.h" enum @@ -40,15 +40,15 @@ enum #endif }; -struct acm32_hwtimer +struct acm32_clock_timer { - rt_hwtimer_t time_device; + rt_clock_timer_t time_device; TIM_HandleTypeDef tim_handle; IRQn_Type tim_irqn; char *name; }; -static struct acm32_hwtimer acm32_hwtimer_obj[] = +static struct acm32_clock_timer acm32_clock_timer_obj[] = { #ifdef BSP_USING_TIM1 TIM1_CONFIG, @@ -79,7 +79,7 @@ static struct acm32_hwtimer acm32_hwtimer_obj[] = #endif }; -static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { rt_uint32_t timer_clock = 0; TIM_HandleTypeDef *tim = RT_NULL; @@ -100,7 +100,7 @@ static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) tim->Init.Prescaler = (timer_clock / timer->freq) - 1 ; tim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - if (timer->info->cntmode == HWTIMER_CNTMODE_UP) + if (timer->info->cntmode == CLOCK_TIMER_CNTMODE_UP) { tim->Init.CounterMode = TIM_COUNTERMODE_UP; } @@ -116,7 +116,7 @@ static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) } } -static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +static rt_err_t timer_start(rt_clock_timer_t *timer, rt_uint32_t t, rt_clock_timer_mode_t opmode) { TIM_HandleTypeDef *tim = RT_NULL; @@ -129,7 +129,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ /* set tim arr */ tim->Instance->ARR = t - 1; - if (opmode == HWTIMER_MODE_ONESHOT) + if (opmode == CLOCK_TIMER_MODE_ONESHOT) { /* set timer to single mode */ SET_BIT(tim->Instance->CR1, BIT3); @@ -149,7 +149,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ return RT_EOK; } -static void timer_stop(rt_hwtimer_t *timer) +static void timer_stop(rt_clock_timer_t *timer) { TIM_HandleTypeDef *tim = RT_NULL; @@ -161,7 +161,7 @@ static void timer_stop(rt_hwtimer_t *timer) HAL_TIMER_Base_Stop(tim->Instance); } -static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { TIM_HandleTypeDef *tim = RT_NULL; rt_err_t result = RT_EOK; @@ -173,7 +173,7 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t freq; rt_uint32_t timer_clock; @@ -206,16 +206,16 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) return result; } -static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t timer_counter_get(rt_clock_timer_t *timer) { RT_ASSERT(timer != RT_NULL); return ((TIM_HandleTypeDef *)timer->parent.user_data)->Instance->CNT; } -static const struct rt_hwtimer_info _info = TIM_DEV_INFO_CONFIG; +static const struct rt_clock_timer_info _info = TIM_DEV_INFO_CONFIG; -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_ops _ops = { .init = timer_init, .start = timer_start, @@ -233,7 +233,7 @@ void TIM1_BRK_UP_TRG_COM_IRQHandler(void) /* interrupt service routine */ if (TIM1->SR & TIMER_SR_UIF) { - rt_device_hwtimer_isr(&acm32_hwtimer_obj[TIM1_INDEX].time_device); + rt_clock_timer_isr(&acm32_clock_timer_obj[TIM1_INDEX].time_device); } TIM1->SR = 0; /* write 0 to clear hardware flag */ @@ -251,7 +251,7 @@ void TIM3_IRQHandler(void) if (TIM3->SR & TIMER_SR_UIF) { - rt_device_hwtimer_isr(&acm32_hwtimer_obj[TIM3_INDEX].time_device); + rt_clock_timer_isr(&acm32_clock_timer_obj[TIM3_INDEX].time_device); } TIM3->SR = 0; /* write 0 to clear hardware flag */ @@ -269,7 +269,7 @@ void TIM6_IRQHandler(void) /* interrupt service routine */ if (TIM6->SR & TIMER_SR_UIF) { - rt_device_hwtimer_isr(&acm32_hwtimer_obj[TIM6_INDEX].time_device); + rt_clock_timer_isr(&acm32_clock_timer_obj[TIM6_INDEX].time_device); } TIM6->SR = 0; /* write 0 to clear hardware flag */ @@ -285,7 +285,7 @@ void TIM14_IRQHandler(void) /* interrupt service routine */ if (TIM14->SR & TIMER_SR_UIF) { - rt_device_hwtimer_isr(&acm32_hwtimer_obj[TIM14_INDEX].time_device); + rt_clock_timer_isr(&acm32_clock_timer_obj[TIM14_INDEX].time_device); } TIM14->SR = 0; /* write 0 to clear hardware flag */ /* leave interrupt */ @@ -300,7 +300,7 @@ void TIM15_IRQHandler(void) /* interrupt service routine */ if (TIM15->SR & TIMER_SR_UIF) { - rt_device_hwtimer_isr(&acm32_hwtimer_obj[TIM15_INDEX].time_device); + rt_clock_timer_isr(&acm32_clock_timer_obj[TIM15_INDEX].time_device); } TIM15->SR = 0; /* write 0 to clear hardware flag */ /* leave interrupt */ @@ -314,7 +314,7 @@ void TIM16_IRQHandler(void) rt_interrupt_enter(); if (TIM16->SR & TIMER_SR_UIF) { - rt_device_hwtimer_isr(&acm32_hwtimer_obj[TIM16_INDEX].time_device); + rt_clock_timer_isr(&acm32_clock_timer_obj[TIM16_INDEX].time_device); } TIM16->SR = 0; /* write 0 to clear hardware flag */ /* leave interrupt */ @@ -328,7 +328,7 @@ void TIM17_IRQHandler(void) rt_interrupt_enter(); if (TIM17->SR & TIMER_SR_UIF) { - rt_device_hwtimer_isr(&acm32_hwtimer_obj[TIM17_INDEX].time_device); + rt_clock_timer_isr(&acm32_clock_timer_obj[TIM17_INDEX].time_device); } TIM17->SR = 0; /* write 0 to clear hardware flag */ /* leave interrupt */ @@ -336,18 +336,18 @@ void TIM17_IRQHandler(void) } #endif -static int acm32_hwtimer_init(void) +static int acm32_clock_timer_init(void) { int i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(acm32_hwtimer_obj) / sizeof(acm32_hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(acm32_clock_timer_obj) / sizeof(acm32_clock_timer_obj[0]); i++) { - acm32_hwtimer_obj[i].time_device.info = &_info; - acm32_hwtimer_obj[i].time_device.ops = &_ops; - result = rt_device_hwtimer_register(&acm32_hwtimer_obj[i].time_device, - acm32_hwtimer_obj[i].name, - &acm32_hwtimer_obj[i].tim_handle); + acm32_clock_timer_obj[i].time_device.info = &_info; + acm32_clock_timer_obj[i].time_device.ops = &_ops; + result = rt_clock_timer_register(&acm32_clock_timer_obj[i].time_device, + acm32_clock_timer_obj[i].name, + &acm32_clock_timer_obj[i].tim_handle); if (result != RT_EOK) { result = -RT_ERROR; @@ -357,7 +357,7 @@ static int acm32_hwtimer_init(void) return result; } -INIT_BOARD_EXPORT(acm32_hwtimer_init); +INIT_BOARD_EXPORT(acm32_clock_timer_init); -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ diff --git a/bsp/acm32/acm32f0x0-nucleo/drivers/tim_config.h b/bsp/acm32/acm32f0x0-nucleo/drivers/tim_config.h index c22487df59..14f12fa68b 100644 --- a/bsp/acm32/acm32f0x0-nucleo/drivers/tim_config.h +++ b/bsp/acm32/acm32f0x0-nucleo/drivers/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/acm32/acm32f0x0-nucleo/project.ewp b/bsp/acm32/acm32f0x0-nucleo/project.ewp index 598abdb63c..76200b3b3b 100644 --- a/bsp/acm32/acm32f0x0-nucleo/project.ewp +++ b/bsp/acm32/acm32f0x0-nucleo/project.ewp @@ -2229,7 +2229,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c @@ -2298,7 +2298,7 @@ $PROJ_DIR$\drivers\drv_pm.c - $PROJ_DIR$\drivers\drv_hwtimer.c + $PROJ_DIR$\drivers\drv_timer.c $PROJ_DIR$\drivers\drv_i2c.c diff --git a/bsp/acm32/acm32f0x0-nucleo/project.uvprojx b/bsp/acm32/acm32f0x0-nucleo/project.uvprojx index 516695465c..83290ed87a 100644 --- a/bsp/acm32/acm32f0x0-nucleo/project.uvprojx +++ b/bsp/acm32/acm32f0x0-nucleo/project.uvprojx @@ -570,9 +570,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -853,9 +853,9 @@ - drv_hwtimer.c + drv_timer.c 1 - drivers\drv_hwtimer.c + drivers\drv_timer.c diff --git a/bsp/acm32/acm32f4xx-nucleo/drivers/Kconfig b/bsp/acm32/acm32f4xx-nucleo/drivers/Kconfig index a760743f7b..837134e99f 100644 --- a/bsp/acm32/acm32f4xx-nucleo/drivers/Kconfig +++ b/bsp/acm32/acm32f4xx-nucleo/drivers/Kconfig @@ -219,43 +219,43 @@ menu "On-chip Peripheral Drivers" config BSP_USING_TIM1 bool "Enable Timer1" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM2 bool "Enable Timer2" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM3 bool "Enable Timer3" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM4 bool "Enable Timer4" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM6 bool "Enable Timer6" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM7 bool "Enable Timer7" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM14 bool "Enable Timer14" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM15 bool "Enable Timer15" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM16 bool "Enable Timer16" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME config BSP_USING_TIM17 bool "Enable Timer17" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME endmenu menu "Hardware WDT" diff --git a/bsp/airm2m/air105/libraries/HAL_Driver/Inc/app_inc.h b/bsp/airm2m/air105/libraries/HAL_Driver/Inc/app_inc.h index 6edd151571..b5e4c5d37d 100644 --- a/bsp/airm2m/air105/libraries/HAL_Driver/Inc/app_inc.h +++ b/bsp/airm2m/air105/libraries/HAL_Driver/Inc/app_inc.h @@ -23,7 +23,7 @@ #define __APP_INC_H__ #include "bl_inc.h" -#include "core_hwtimer.h" +#include "core_clock_timer.h" #include "core_spi.h" #include "core_adc.h" #include "core_dac.h" diff --git a/bsp/airm2m/air105/libraries/HAL_Driver/Inc/core_hwtimer.h b/bsp/airm2m/air105/libraries/HAL_Driver/Inc/core_clock_timer.h similarity index 98% rename from bsp/airm2m/air105/libraries/HAL_Driver/Inc/core_hwtimer.h rename to bsp/airm2m/air105/libraries/HAL_Driver/Inc/core_clock_timer.h index 1261da425c..5226965367 100644 --- a/bsp/airm2m/air105/libraries/HAL_Driver/Inc/core_hwtimer.h +++ b/bsp/airm2m/air105/libraries/HAL_Driver/Inc/core_clock_timer.h @@ -19,8 +19,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef __CORE_HWTIMER_H__ -#define __CORE_HWTIMER_H__ +#ifndef __CORE_CLOCK_TIMER_H__ +#define __CORE_CLOCK_TIMER_H__ /** diff --git a/bsp/airm2m/air105/libraries/HAL_Driver/Inc/resource_map.h b/bsp/airm2m/air105/libraries/HAL_Driver/Inc/resource_map.h index 21fc95e68f..18fde16974 100644 --- a/bsp/airm2m/air105/libraries/HAL_Driver/Inc/resource_map.h +++ b/bsp/airm2m/air105/libraries/HAL_Driver/Inc/resource_map.h @@ -28,7 +28,7 @@ #define CORE_TICK_1MS (48000) #define CORE_TICK_1S (48000000) #define CORE_TICK_IRQ_LEVEL 1 -#define HWTIMER_IRQ_LEVEL 0 +#define CLOCK_TIMER_IRQ_LEVEL 0 #define SYS_TIMER_TIM 6 #define SYS_TIMER_IRQ TIM0_6_IRQn diff --git a/bsp/airm2m/air105/libraries/HAL_Driver/Src/core_hwtimer.c b/bsp/airm2m/air105/libraries/HAL_Driver/Src/core_clock_timer.c similarity index 98% rename from bsp/airm2m/air105/libraries/HAL_Driver/Src/core_hwtimer.c rename to bsp/airm2m/air105/libraries/HAL_Driver/Src/core_clock_timer.c index 1383d1cf94..da63318e25 100644 --- a/bsp/airm2m/air105/libraries/HAL_Driver/Src/core_hwtimer.c +++ b/bsp/airm2m/air105/libraries/HAL_Driver/Src/core_clock_timer.c @@ -142,7 +142,7 @@ static void __FUNC_IN_RAM__ prvHWTimer_StartOperationQueue(uint8_t HWTimerID, HW break; case OP_QUEUE_CMD_ONE_TIME_DELAY: HWTimer->ContinueDelay = 0; - goto START_HWTIMER; + goto START_CLOCK_TIMER; break; case OP_QUEUE_CMD_REPEAT_DELAY: HWTimer->CurCount++; @@ -166,7 +166,7 @@ static void __FUNC_IN_RAM__ prvHWTimer_StartOperationQueue(uint8_t HWTimerID, HW break; case OP_QUEUE_CMD_CONTINUE_DELAY: HWTimer->ContinueDelay = 1; - goto START_HWTIMER; + goto START_CLOCK_TIMER; break; case OP_QUEUE_CMD_SET_GPIO_DIR_OUT: @@ -235,7 +235,7 @@ static void __FUNC_IN_RAM__ prvHWTimer_StartOperationQueue(uint8_t HWTimerID, HW } } return ; -START_HWTIMER: +START_CLOCK_TIMER: TIMM0->TIM[HWTimerID].ControlReg = 0; Period = HWTimer->Cmd[HWTimer->CurCount].uArg.Time; Period = Period * SYS_TIMER_1US + HWTimer->Cmd[HWTimer->CurCount].Arg1; @@ -404,7 +404,7 @@ void HWTimer_StartOperationQueue(uint8_t HWTimerID) HWTimer_Stop(HWTimerID); } ISR_SetHandler(prvHWTimer[HWTimerID].IrqLine, prvHWTimer_IrqHandlerOperationQueue, HWTimerID); - ISR_SetPriority(prvHWTimer[HWTimerID].IrqLine, HWTIMER_IRQ_LEVEL); + ISR_SetPriority(prvHWTimer[HWTimerID].IrqLine, CLOCK_TIMER_IRQ_LEVEL); prvHWTimer[HWTimerID].Cmd[prvHWTimer[HWTimerID].CmdQueuePos].Operation = OP_QUEUE_CMD_END; HWTimer_ResetOperationQueue(HWTimerID); diff --git a/bsp/airm2m/air32f103/board/Kconfig b/bsp/airm2m/air32f103/board/Kconfig index dd74fdd571..65f1c9b152 100644 --- a/bsp/airm2m/air32f103/board/Kconfig +++ b/bsp/airm2m/air32f103/board/Kconfig @@ -105,7 +105,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM2 bool "Enable TIM2" diff --git a/bsp/airm2m/air32f103/board/board.c b/bsp/airm2m/air32f103/board/board.c index 38e7c702a3..611082ce42 100644 --- a/bsp/airm2m/air32f103/board/board.c +++ b/bsp/airm2m/air32f103/board/board.c @@ -175,61 +175,61 @@ rt_uint32_t air32_tim_clock_get(TIM_TypeDef *timx) return RCC_Clocks.HCLK_Frequency; } -struct rt_hwtimer_info hwtimer_info1 = +struct rt_clock_timer_info clock_timer_info1 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info2 = +struct rt_clock_timer_info clock_timer_info2 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info3 = +struct rt_clock_timer_info clock_timer_info3 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info4 = +struct rt_clock_timer_info clock_timer_info4 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info *air32_hwtimer_info_config_get(TIM_TypeDef *timx) +struct rt_clock_timer_info *air32_clock_timer_info_config_get(TIM_TypeDef *timx) { - struct rt_hwtimer_info *info = RT_NULL; + struct rt_clock_timer_info *info = RT_NULL; if (timx == TIM1) { - info = &hwtimer_info1; + info = &clock_timer_info1; } else if (timx == TIM2) { - info = &hwtimer_info2; + info = &clock_timer_info2; } else if (timx == TIM3) { - info = &hwtimer_info3; + info = &clock_timer_info3; } else if (timx == TIM4) { - info = &hwtimer_info4; + info = &clock_timer_info4; } return info; diff --git a/bsp/airm2m/air32f103/board/board.h b/bsp/airm2m/air32f103/board/board.h index e21f907aa6..74aa58d0e5 100644 --- a/bsp/airm2m/air32f103/board/board.h +++ b/bsp/airm2m/air32f103/board/board.h @@ -58,7 +58,7 @@ rt_uint32_t air32_tim_clock_get(TIM_TypeDef *timx); #endif #ifdef BSP_USING_TIM -struct rt_hwtimer_info* air32_hwtimer_info_config_get(TIM_TypeDef *timx); +struct rt_clock_timer_info* air32_clock_timer_info_config_get(TIM_TypeDef *timx); #endif #ifdef BSP_USING_PWM diff --git a/bsp/airm2m/air32f103/libraries/SConscript b/bsp/airm2m/air32f103/libraries/SConscript index b0c12a0453..8848f19239 100644 --- a/bsp/airm2m/air32f103/libraries/SConscript +++ b/bsp/airm2m/air32f103/libraries/SConscript @@ -64,7 +64,7 @@ if GetDepend('BSP_USING_PWM'): src += ['rt_drivers/drv_pwm.c'] if GetDepend('BSP_USING_TIM'): - src += ['rt_drivers/drv_hwtimer.c'] + src += ['rt_drivers/drv_timer.c'] if GetDepend('BSP_USING_WDT'): src += ['rt_drivers/drv_wdt.c'] diff --git a/bsp/airm2m/air32f103/libraries/rt_drivers/drv_hwtimer.c b/bsp/airm2m/air32f103/libraries/rt_drivers/drv_timer.c similarity index 37% rename from bsp/airm2m/air32f103/libraries/rt_drivers/drv_hwtimer.c rename to bsp/airm2m/air32f103/libraries/rt_drivers/drv_timer.c index 8f7415fd5a..f1b4e7d655 100644 --- a/bsp/airm2m/air32f103/libraries/rt_drivers/drv_hwtimer.c +++ b/bsp/airm2m/air32f103/libraries/rt_drivers/drv_timer.c @@ -11,17 +11,17 @@ #include #include #include -#include "drv_hwtimer.h" +#include "drv_timer.h" #ifdef BSP_USING_TIM -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include -static void air32_hwtimer_init(struct rt_hwtimer_device *device, rt_uint32_t state) +static void air32_clock_timer_init(struct rt_clock_timer_device *device, rt_uint32_t state) { - struct hwtimer_device *hwtimer_dev; - struct rt_hwtimer_info *hwtimer_info; + struct clock_timer_device *clock_timer_dev; + struct rt_clock_timer_info *clock_timer_info; rt_uint32_t clk = 0; rt_uint16_t prescaler_value = 0; @@ -30,34 +30,34 @@ static void air32_hwtimer_init(struct rt_hwtimer_device *device, rt_uint32_t sta RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; if (state) { - air32_tim_clock_init(hwtimer_dev->periph); + air32_tim_clock_init(clock_timer_dev->periph); - hwtimer_info = air32_hwtimer_info_config_get(hwtimer_dev->periph); + clock_timer_info = air32_clock_timer_info_config_get(clock_timer_dev->periph); - clk = air32_tim_clock_get(hwtimer_dev->periph); + clk = air32_tim_clock_get(clock_timer_dev->periph); - prescaler_value = (rt_uint16_t)(clk / hwtimer_info->minfreq) - 1; + prescaler_value = (rt_uint16_t)(clk / clock_timer_info->minfreq) - 1; /* * (1 / freq) = (cnt + 1) * (1 / (clk/(prescaler_value + 1) ) ) */ - TIM_TimeBaseInitType.TIM_Period = hwtimer_info->maxcnt - 1; + TIM_TimeBaseInitType.TIM_Period = clock_timer_info->maxcnt - 1; TIM_TimeBaseInitType.TIM_Prescaler = prescaler_value; TIM_TimeBaseInitType.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitType.TIM_RepetitionCounter = 0; - if (hwtimer_info == RT_NULL) + if (clock_timer_info == RT_NULL) { TIM_TimeBaseInitType.TIM_CounterMode = TIM_CounterMode_Up; } else { - if (hwtimer_info->cntmode == HWTIMER_CNTMODE_UP) + if (clock_timer_info->cntmode == CLOCK_TIMER_CNTMODE_UP) { TIM_TimeBaseInitType.TIM_CounterMode = TIM_CounterMode_Up; } @@ -67,89 +67,89 @@ static void air32_hwtimer_init(struct rt_hwtimer_device *device, rt_uint32_t sta } } - TIM_TimeBaseInit(hwtimer_dev->periph, &TIM_TimeBaseInitType); + TIM_TimeBaseInit(clock_timer_dev->periph, &TIM_TimeBaseInitType); - NVIC_InitStructure.NVIC_IRQChannel = hwtimer_dev->irqn; + NVIC_InitStructure.NVIC_IRQChannel = clock_timer_dev->irqn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); - TIM_ITConfig(hwtimer_dev->periph, TIM_IT_Update, ENABLE); - TIM_ClearITPendingBit(hwtimer_dev->periph, TIM_IT_Update); + TIM_ITConfig(clock_timer_dev->periph, TIM_IT_Update, ENABLE); + TIM_ClearITPendingBit(clock_timer_dev->periph, TIM_IT_Update); - LOG_D("%s init success", hwtimer_dev->name); + LOG_D("%s init success", clock_timer_dev->name); } } -static rt_err_t air32_hwtimer_start(struct rt_hwtimer_device *device, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t air32_clock_timer_start(struct rt_clock_timer_device *device, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; /* * (1 / freq) = (cnt + 1) * (1 / (clk/(prescaler_value + 1) ) ) */ - TIM_SetCounter(hwtimer_dev->periph, 0); - TIM_SetAutoreload(hwtimer_dev->periph, cnt - 1); + TIM_SetCounter(clock_timer_dev->periph, 0); + TIM_SetAutoreload(clock_timer_dev->periph, cnt - 1); - if (mode == HWTIMER_MODE_ONESHOT) + if (mode == CLOCK_TIMER_MODE_ONESHOT) { - TIM_SelectOnePulseMode(hwtimer_dev->periph, TIM_OPMode_Single); + TIM_SelectOnePulseMode(clock_timer_dev->periph, TIM_OPMode_Single); } else { - TIM_SelectOnePulseMode(hwtimer_dev->periph, TIM_OPMode_Repetitive); + TIM_SelectOnePulseMode(clock_timer_dev->periph, TIM_OPMode_Repetitive); } - TIM_Cmd(hwtimer_dev->periph, ENABLE); + TIM_Cmd(clock_timer_dev->periph, ENABLE); - LOG_D("%s start, cnt = %d", hwtimer_dev->name, cnt); + LOG_D("%s start, cnt = %d", clock_timer_dev->name, cnt); return RT_EOK; } -static void air32_hwtimer_stop(struct rt_hwtimer_device *device) +static void air32_clock_timer_stop(struct rt_clock_timer_device *device) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; - TIM_Cmd(hwtimer_dev->periph, DISABLE); + TIM_Cmd(clock_timer_dev->periph, DISABLE); - TIM_SetCounter(hwtimer_dev->periph, 0); + TIM_SetCounter(clock_timer_dev->periph, 0); } -static rt_uint32_t air32_hwtimer_counter_get(struct rt_hwtimer_device *device) +static rt_uint32_t air32_clock_timer_counter_get(struct rt_clock_timer_device *device) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; - return hwtimer_dev->periph->CNT; + return clock_timer_dev->periph->CNT; } -static rt_err_t air32_hwtimer_control(struct rt_hwtimer_device *device, rt_uint32_t cmd, void *arg) +static rt_err_t air32_clock_timer_control(struct rt_clock_timer_device *device, rt_uint32_t cmd, void *arg) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; rt_err_t result = RT_EOK; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t freq = 0; rt_uint32_t clk = 0; @@ -163,11 +163,11 @@ static rt_err_t air32_hwtimer_control(struct rt_hwtimer_device *device, rt_uint3 freq = *((rt_uint32_t *)arg); - clk = air32_tim_clock_get(hwtimer_dev->periph); + clk = air32_tim_clock_get(clock_timer_dev->periph); prescaler_value = (rt_uint16_t)(clk / freq) - 1; - TIM_PrescalerConfig(hwtimer_dev->periph, prescaler_value, TIM_PSCReloadMode_Immediate); + TIM_PrescalerConfig(clock_timer_dev->periph, prescaler_value, TIM_PSCReloadMode_Immediate); } else { @@ -184,83 +184,83 @@ static rt_err_t air32_hwtimer_control(struct rt_hwtimer_device *device, rt_uint3 return result; } -static const struct rt_hwtimer_ops hwtimer_ops = +static const struct rt_clock_timer_ops clock_timer_ops = { - .init = air32_hwtimer_init, - .start = air32_hwtimer_start, - .stop = air32_hwtimer_stop, - .count_get = air32_hwtimer_counter_get, - .control = air32_hwtimer_control, + .init = air32_clock_timer_init, + .start = air32_clock_timer_start, + .stop = air32_clock_timer_stop, + .count_get = air32_clock_timer_counter_get, + .control = air32_clock_timer_control, }; -static int rt_hw_hwtimer_init(void) +static int rt_hw_clock_timer_init(void) { rt_err_t ret; - struct rt_hwtimer_info *hwtimer_info; + struct rt_clock_timer_info *clock_timer_info; #ifdef BSP_USING_TIM1 - hwtimer_info = air32_hwtimer_info_config_get(hwtimer_device1.periph); - hwtimer_device1.parent.info = hwtimer_info; - hwtimer_device1.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device1.parent, hwtimer_device1.name, RT_NULL); + clock_timer_info = air32_clock_timer_info_config_get(clock_timer_device1.periph); + clock_timer_device1.parent.info = clock_timer_info; + clock_timer_device1.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device1.parent, clock_timer_device1.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device1.name); + LOG_D("clock_timer: %s register success.", clock_timer_device1.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device1.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device1.name); } #endif #ifdef BSP_USING_TIM2 - hwtimer_info = air32_hwtimer_info_config_get(hwtimer_device2.periph); - hwtimer_device2.parent.info = hwtimer_info; - hwtimer_device2.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device2.parent, hwtimer_device2.name, RT_NULL); + clock_timer_info = air32_clock_timer_info_config_get(clock_timer_device2.periph); + clock_timer_device2.parent.info = clock_timer_info; + clock_timer_device2.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device2.parent, clock_timer_device2.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device2.name); + LOG_D("clock_timer: %s register success.", clock_timer_device2.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device2.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device2.name); } #endif #ifdef BSP_USING_TIM3 - hwtimer_info = air32_hwtimer_info_config_get(hwtimer_device3.periph); - hwtimer_device3.parent.info = hwtimer_info; - hwtimer_device3.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device3.parent, hwtimer_device3.name, RT_NULL); + clock_timer_info = air32_clock_timer_info_config_get(clock_timer_device3.periph); + clock_timer_device3.parent.info = clock_timer_info; + clock_timer_device3.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device3.parent, clock_timer_device3.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device3.name); + LOG_D("clock_timer: %s register success.", clock_timer_device3.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device3.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device3.name); } #endif #ifdef BSP_USING_TIM4 - hwtimer_info = air32_hwtimer_info_config_get(hwtimer_device4.periph); - hwtimer_device4.parent.info = hwtimer_info; - hwtimer_device4.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device4.parent, hwtimer_device4.name, RT_NULL); + clock_timer_info = air32_clock_timer_info_config_get(clock_timer_device4.periph); + clock_timer_device4.parent.info = clock_timer_info; + clock_timer_device4.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device4.parent, clock_timer_device4.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device4.name); + LOG_D("clock_timer: %s register success.", clock_timer_device4.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device4.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device4.name); } #endif return RT_EOK; } -INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); #ifdef BSP_USING_TIM1 void TIM1_UP_IRQHandler(void) @@ -268,10 +268,10 @@ void TIM1_UP_IRQHandler(void) /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device1.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device1.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device1.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device1.parent); + TIM_ClearITPendingBit(clock_timer_device1.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device1.parent); } /* leave interrupt */ rt_interrupt_leave(); @@ -284,10 +284,10 @@ void TIM2_IRQHandler(void) /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device2.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device2.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device2.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device2.parent); + TIM_ClearITPendingBit(clock_timer_device2.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device2.parent); } /* leave interrupt */ rt_interrupt_leave(); @@ -300,10 +300,10 @@ void TIM3_IRQHandler(void) /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device3.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device3.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device3.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device3.parent); + TIM_ClearITPendingBit(clock_timer_device3.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device3.parent); } /* leave interrupt */ rt_interrupt_leave(); @@ -316,14 +316,14 @@ void TIM4_IRQHandler(void) /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device4.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device4.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device4.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device4.parent); + TIM_ClearITPendingBit(clock_timer_device4.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device4.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/airm2m/air32f103/libraries/rt_drivers/drv_hwtimer.h b/bsp/airm2m/air32f103/libraries/rt_drivers/drv_timer.h similarity index 67% rename from bsp/airm2m/air32f103/libraries/rt_drivers/drv_hwtimer.h rename to bsp/airm2m/air32f103/libraries/rt_drivers/drv_timer.h index a3457ee3db..d7de7c915e 100644 --- a/bsp/airm2m/air32f103/libraries/rt_drivers/drv_hwtimer.h +++ b/bsp/airm2m/air32f103/libraries/rt_drivers/drv_timer.h @@ -8,24 +8,24 @@ * 2022-02-22 airm2m first version */ -#ifndef __DRV_HWTIMER_H__ -#define __DRV_HWTIMER_H__ +#ifndef __DRV_CLOCK_TIMER_H__ +#define __DRV_CLOCK_TIMER_H__ #include #ifdef BSP_USING_TIM #include -struct hwtimer_device +struct clock_timer_device { - struct rt_hwtimer_device parent; + struct rt_clock_timer_device parent; TIM_TypeDef *periph; IRQn_Type irqn; char *name; }; #ifdef BSP_USING_TIM1 -struct hwtimer_device hwtimer_device1 = +struct clock_timer_device clock_timer_device1 = { .periph = TIM1, .irqn = TIM1_UP_IRQn, @@ -33,7 +33,7 @@ struct hwtimer_device hwtimer_device1 = #endif #ifdef BSP_USING_TIM2 -struct hwtimer_device hwtimer_device2 = +struct clock_timer_device clock_timer_device2 = { .periph = TIM2, .irqn = TIM2_IRQn, @@ -41,7 +41,7 @@ struct hwtimer_device hwtimer_device2 = #endif #ifdef BSP_USING_TIM3 -struct hwtimer_device hwtimer_device3 = +struct clock_timer_device clock_timer_device3 = { .periph = TIM3, .irqn = TIM3_IRQn, @@ -49,12 +49,12 @@ struct hwtimer_device hwtimer_device3 = #endif #ifdef BSP_USING_TIM4 -struct hwtimer_device hwtimer_device4 = +struct clock_timer_device clock_timer_device4 = { .periph = TIM4, .irqn = TIM4_IRQn, .name = "timer4"}; #endif -#endif /* BSP_USING_HWTIMER */ -#endif /* __DRV_HWTIMER_H__ */ +#endif /* BSP_USING_CLOCK_TIMER */ +#endif /* __DRV_CLOCK_TIMER_H__ */ diff --git a/bsp/allwinner/d1s/board/board.c b/bsp/allwinner/d1s/board/board.c index 33470e5cb7..6063739db3 100644 --- a/bsp/allwinner/d1s/board/board.c +++ b/bsp/allwinner/d1s/board/board.c @@ -52,6 +52,11 @@ struct mem_desc platform_mem_desc[] = { #endif /* RT_USING_SMART */ +rt_uint64_t rt_hw_get_clock_timer_freq(void) +{ + return 24000000ULL; +} + // 初始化BSS节区 void init_bss(void) { diff --git a/bsp/apm32/apm32e103ze-evalboard/board/Kconfig b/bsp/apm32/apm32e103ze-evalboard/board/Kconfig index 5be25544e8..c8c59dee47 100644 --- a/bsp/apm32/apm32e103ze-evalboard/board/Kconfig +++ b/bsp/apm32/apm32e103ze-evalboard/board/Kconfig @@ -175,7 +175,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32e103ze-evalboard/board/board.h b/bsp/apm32/apm32e103ze-evalboard/board/board.h index 2274bb453b..7cee8931a7 100644 --- a/bsp/apm32/apm32e103ze-evalboard/board/board.h +++ b/bsp/apm32/apm32e103ze-evalboard/board/board.h @@ -35,7 +35,7 @@ #if defined(RT_USING_SPI) #include "apm32e10x_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32e10x_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/apm32e103ze-tinyboard/board/Kconfig b/bsp/apm32/apm32e103ze-tinyboard/board/Kconfig index a76b738cef..4ff30f548e 100644 --- a/bsp/apm32/apm32e103ze-tinyboard/board/Kconfig +++ b/bsp/apm32/apm32e103ze-tinyboard/board/Kconfig @@ -156,7 +156,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32e103ze-tinyboard/board/board.h b/bsp/apm32/apm32e103ze-tinyboard/board/board.h index 2274bb453b..7cee8931a7 100644 --- a/bsp/apm32/apm32e103ze-tinyboard/board/board.h +++ b/bsp/apm32/apm32e103ze-tinyboard/board/board.h @@ -35,7 +35,7 @@ #if defined(RT_USING_SPI) #include "apm32e10x_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32e10x_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/apm32f030r8-miniboard/board/Kconfig b/bsp/apm32/apm32f030r8-miniboard/board/Kconfig index 7d0f93b3e4..c583254b83 100644 --- a/bsp/apm32/apm32f030r8-miniboard/board/Kconfig +++ b/bsp/apm32/apm32f030r8-miniboard/board/Kconfig @@ -120,7 +120,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32f030r8-miniboard/board/board.h b/bsp/apm32/apm32f030r8-miniboard/board/board.h index 3435a9478b..c431a210bc 100644 --- a/bsp/apm32/apm32f030r8-miniboard/board/board.h +++ b/bsp/apm32/apm32f030r8-miniboard/board/board.h @@ -34,7 +34,7 @@ #if defined(RT_USING_SPI) #include "apm32f0xx_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32f0xx_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/apm32f051r8-evalboard/board/Kconfig b/bsp/apm32/apm32f051r8-evalboard/board/Kconfig index 66b9f17f4e..aef90aa40b 100644 --- a/bsp/apm32/apm32f051r8-evalboard/board/Kconfig +++ b/bsp/apm32/apm32f051r8-evalboard/board/Kconfig @@ -132,7 +132,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32f051r8-evalboard/board/board.h b/bsp/apm32/apm32f051r8-evalboard/board/board.h index 5ec31a3c81..2c43d2079b 100644 --- a/bsp/apm32/apm32f051r8-evalboard/board/board.h +++ b/bsp/apm32/apm32f051r8-evalboard/board/board.h @@ -34,7 +34,7 @@ #if defined(RT_USING_SPI) #include "apm32f0xx_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32f0xx_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/apm32f072vb-miniboard/board/Kconfig b/bsp/apm32/apm32f072vb-miniboard/board/Kconfig index 528e873194..cae05eae10 100644 --- a/bsp/apm32/apm32f072vb-miniboard/board/Kconfig +++ b/bsp/apm32/apm32f072vb-miniboard/board/Kconfig @@ -133,7 +133,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32f072vb-miniboard/board/board.h b/bsp/apm32/apm32f072vb-miniboard/board/board.h index 70aab08c05..200f529e70 100644 --- a/bsp/apm32/apm32f072vb-miniboard/board/board.h +++ b/bsp/apm32/apm32f072vb-miniboard/board/board.h @@ -34,7 +34,7 @@ #if defined(RT_USING_SPI) #include "apm32f0xx_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32f0xx_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/apm32f091vc-miniboard/board/Kconfig b/bsp/apm32/apm32f091vc-miniboard/board/Kconfig index b8a7b84f15..757ecc8b85 100644 --- a/bsp/apm32/apm32f091vc-miniboard/board/Kconfig +++ b/bsp/apm32/apm32f091vc-miniboard/board/Kconfig @@ -133,7 +133,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32f091vc-miniboard/board/board.h b/bsp/apm32/apm32f091vc-miniboard/board/board.h index d741eb2237..90df8c8250 100644 --- a/bsp/apm32/apm32f091vc-miniboard/board/board.h +++ b/bsp/apm32/apm32f091vc-miniboard/board/board.h @@ -34,7 +34,7 @@ #if defined(RT_USING_SPI) #include "apm32f0xx_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32f0xx_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/apm32f103vb-miniboard/board/Kconfig b/bsp/apm32/apm32f103vb-miniboard/board/Kconfig index 5fd8985607..6abbc34415 100644 --- a/bsp/apm32/apm32f103vb-miniboard/board/Kconfig +++ b/bsp/apm32/apm32f103vb-miniboard/board/Kconfig @@ -126,7 +126,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32f103vb-miniboard/board/board.h b/bsp/apm32/apm32f103vb-miniboard/board/board.h index 4e69fcf5f4..54f663e877 100644 --- a/bsp/apm32/apm32f103vb-miniboard/board/board.h +++ b/bsp/apm32/apm32f103vb-miniboard/board/board.h @@ -34,7 +34,7 @@ #if defined(RT_USING_SPI) #include "apm32f10x_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32f10x_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/apm32f103xe-minibroard/board/Kconfig b/bsp/apm32/apm32f103xe-minibroard/board/Kconfig index beace4e596..12182a2c48 100644 --- a/bsp/apm32/apm32f103xe-minibroard/board/Kconfig +++ b/bsp/apm32/apm32f103xe-minibroard/board/Kconfig @@ -119,7 +119,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32f103xe-minibroard/board/board.h b/bsp/apm32/apm32f103xe-minibroard/board/board.h index 8e75b5b643..e2f2029723 100644 --- a/bsp/apm32/apm32f103xe-minibroard/board/board.h +++ b/bsp/apm32/apm32f103xe-minibroard/board/board.h @@ -36,7 +36,7 @@ #if defined(RT_USING_SPI) #include "apm32f10x_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32f10x_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/apm32f107vc-evalboard/board/Kconfig b/bsp/apm32/apm32f107vc-evalboard/board/Kconfig index bc4840e39e..31d7d7113a 100644 --- a/bsp/apm32/apm32f107vc-evalboard/board/Kconfig +++ b/bsp/apm32/apm32f107vc-evalboard/board/Kconfig @@ -156,7 +156,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32f107vc-evalboard/board/board.h b/bsp/apm32/apm32f107vc-evalboard/board/board.h index a57504c15e..88d86b5949 100644 --- a/bsp/apm32/apm32f107vc-evalboard/board/board.h +++ b/bsp/apm32/apm32f107vc-evalboard/board/board.h @@ -34,7 +34,7 @@ #if defined(RT_USING_SPI) #include "apm32f10x_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32f10x_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/apm32f407ig-minibroard/board/Kconfig b/bsp/apm32/apm32f407ig-minibroard/board/Kconfig index b8eac74c77..d14dafe814 100644 --- a/bsp/apm32/apm32f407ig-minibroard/board/Kconfig +++ b/bsp/apm32/apm32f407ig-minibroard/board/Kconfig @@ -108,7 +108,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32f407ig-minibroard/board/board.h b/bsp/apm32/apm32f407ig-minibroard/board/board.h index 15d8abcd5c..242b27bf43 100644 --- a/bsp/apm32/apm32f407ig-minibroard/board/board.h +++ b/bsp/apm32/apm32f407ig-minibroard/board/board.h @@ -35,7 +35,7 @@ #if defined(RT_USING_SPI) #include "apm32f4xx_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32f4xx_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/apm32f407zg-evalboard/board/Kconfig b/bsp/apm32/apm32f407zg-evalboard/board/Kconfig index d7cc13ec8a..3d933499a0 100644 --- a/bsp/apm32/apm32f407zg-evalboard/board/Kconfig +++ b/bsp/apm32/apm32f407zg-evalboard/board/Kconfig @@ -168,7 +168,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32f407zg-evalboard/board/board.h b/bsp/apm32/apm32f407zg-evalboard/board/board.h index c9f49f9c18..5d5e23a34c 100644 --- a/bsp/apm32/apm32f407zg-evalboard/board/board.h +++ b/bsp/apm32/apm32f407zg-evalboard/board/board.h @@ -36,7 +36,7 @@ #if defined(RT_USING_SPI) #include "apm32f4xx_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32f4xx_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/apm32s103vb-miniboard/board/Kconfig b/bsp/apm32/apm32s103vb-miniboard/board/Kconfig index 8f19663d00..af6d754f8d 100644 --- a/bsp/apm32/apm32s103vb-miniboard/board/Kconfig +++ b/bsp/apm32/apm32s103vb-miniboard/board/Kconfig @@ -140,7 +140,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TMR bool "Enable Timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TMR config BSP_USING_TMR1 bool "Enable TMR1" diff --git a/bsp/apm32/apm32s103vb-miniboard/board/board.h b/bsp/apm32/apm32s103vb-miniboard/board/board.h index d1906e7189..e7683ccf98 100644 --- a/bsp/apm32/apm32s103vb-miniboard/board/board.h +++ b/bsp/apm32/apm32s103vb-miniboard/board/board.h @@ -35,7 +35,7 @@ #if defined(RT_USING_SPI) #include "apm32s10x_spi.h" #endif -#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) +#if defined(RT_USING_CLOCK_TIME) || defined(RT_USING_PWM) #include "apm32s10x_tmr.h" #endif #if defined(RT_USING_WDT) diff --git a/bsp/apm32/libraries/APM32E10x_Library/SConscript b/bsp/apm32/libraries/APM32E10x_Library/SConscript index c8c453079e..87eba829cd 100644 --- a/bsp/apm32/libraries/APM32E10x_Library/SConscript +++ b/bsp/apm32/libraries/APM32E10x_Library/SConscript @@ -29,7 +29,7 @@ if GetDepend(['RT_USING_RTC']): if GetDepend(['RT_USING_SPI']): src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_spi.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): +if GetDepend(['RT_USING_CLOCK_TIME']) or GetDepend(['RT_USING_PWM']): src += ['APM32E10x_StdPeriphDriver/src/apm32e10x_tmr.c'] if GetDepend(['RT_USING_WDT']): diff --git a/bsp/apm32/libraries/APM32F0xx_Library/SConscript b/bsp/apm32/libraries/APM32F0xx_Library/SConscript index a1e0d9b76e..994a67d834 100644 --- a/bsp/apm32/libraries/APM32F0xx_Library/SConscript +++ b/bsp/apm32/libraries/APM32F0xx_Library/SConscript @@ -29,7 +29,7 @@ if GetDepend(['RT_USING_RTC']): if GetDepend(['RT_USING_SPI']): src += ['APM32F0xx_StdPeriphDriver/src/apm32f0xx_spi.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): +if GetDepend(['RT_USING_CLOCK_TIME']) or GetDepend(['RT_USING_PWM']): src += ['APM32F0xx_StdPeriphDriver/src/apm32f0xx_tmr.c'] if GetDepend(['RT_USING_WDT']): diff --git a/bsp/apm32/libraries/APM32F10x_Library/SConscript b/bsp/apm32/libraries/APM32F10x_Library/SConscript index 7bfa61779e..060b2c74f8 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/SConscript +++ b/bsp/apm32/libraries/APM32F10x_Library/SConscript @@ -29,7 +29,7 @@ if GetDepend(['RT_USING_RTC']): if GetDepend(['RT_USING_SPI']): src += ['APM32F10x_StdPeriphDriver/src/apm32f10x_spi.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): +if GetDepend(['RT_USING_CLOCK_TIME']) or GetDepend(['RT_USING_PWM']): src += ['APM32F10x_StdPeriphDriver/src/apm32f10x_tmr.c'] if GetDepend(['RT_USING_WDT']): diff --git a/bsp/apm32/libraries/APM32F4xx_Library/SConscript b/bsp/apm32/libraries/APM32F4xx_Library/SConscript index 0e6ef2a487..dfdbb2aa30 100644 --- a/bsp/apm32/libraries/APM32F4xx_Library/SConscript +++ b/bsp/apm32/libraries/APM32F4xx_Library/SConscript @@ -30,7 +30,7 @@ if GetDepend(['RT_USING_RTC']): if GetDepend(['RT_USING_SPI']): src += ['APM32F4xx_StdPeriphDriver/src/apm32f4xx_spi.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): +if GetDepend(['RT_USING_CLOCK_TIME']) or GetDepend(['RT_USING_PWM']): src += ['APM32F4xx_StdPeriphDriver/src/apm32f4xx_tmr.c'] if GetDepend(['RT_USING_WDT']): diff --git a/bsp/apm32/libraries/APM32S10x_Library/SConscript b/bsp/apm32/libraries/APM32S10x_Library/SConscript index edc3a8e280..7ca9ceff32 100644 --- a/bsp/apm32/libraries/APM32S10x_Library/SConscript +++ b/bsp/apm32/libraries/APM32S10x_Library/SConscript @@ -29,7 +29,7 @@ if GetDepend(['RT_USING_RTC']): if GetDepend(['RT_USING_SPI']): src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_spi.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): +if GetDepend(['RT_USING_CLOCK_TIME']) or GetDepend(['RT_USING_PWM']): src += ['APM32S10x_StdPeriphDriver/src/apm32s10x_tmr.c'] if GetDepend(['RT_USING_WDT']): diff --git a/bsp/apm32/libraries/Drivers/SConscript b/bsp/apm32/libraries/Drivers/SConscript index 30015b3240..a5d05ad815 100644 --- a/bsp/apm32/libraries/Drivers/SConscript +++ b/bsp/apm32/libraries/Drivers/SConscript @@ -33,8 +33,8 @@ if GetDepend(['RT_USING_I2C']): if GetDepend(['RT_USING_SPI']): src += ['drv_spi.c'] -if GetDepend(['RT_USING_HWTIMER']): - src += ['drv_hwtimer.c'] +if GetDepend(['RT_USING_CLOCK_TIME']): + src += ['drv_timer.c'] if GetDepend(['RT_USING_PWM']): src += ['drv_pwm.c'] diff --git a/bsp/apm32/libraries/Drivers/drv_hwtimer.c b/bsp/apm32/libraries/Drivers/drv_timer.c similarity index 84% rename from bsp/apm32/libraries/Drivers/drv_hwtimer.c rename to bsp/apm32/libraries/Drivers/drv_timer.c index e9f4561bfd..c13377db83 100644 --- a/bsp/apm32/libraries/Drivers/drv_hwtimer.c +++ b/bsp/apm32/libraries/Drivers/drv_timer.c @@ -13,18 +13,18 @@ #include -#define DBG_TAG "drv.hwtimer" +#define DBG_TAG "drv.clock_timer" #define DBG_LVL DBG_INFO #include -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME -static const struct rt_hwtimer_info apm32_timer_info = +static const struct rt_clock_timer_info apm32_timer_info = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; /* apm32 config class */ @@ -33,7 +33,7 @@ struct apm32_timer char *name; TMR_T *tmr; IRQn_Type irqn; - rt_hwtimer_t device; + rt_clock_timer_t device; }; enum @@ -234,7 +234,7 @@ static struct apm32_timer tmr_config[] = #endif }; -static rt_uint32_t apm32_hwtimer_clock_get(TMR_T *tmr) +static rt_uint32_t apm32_clock_timer_clock_get(TMR_T *tmr) { #if defined(SOC_SERIES_APM32F0) uint32_t pclk1; @@ -265,7 +265,7 @@ static rt_uint32_t apm32_hwtimer_clock_get(TMR_T *tmr) #endif } -static void apm32_hwtimer_enable_clock(void) +static void apm32_clock_timer_enable_clock(void) { #ifdef BSP_USING_TMR1 RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR1); @@ -320,7 +320,7 @@ static void apm32_hwtimer_enable_clock(void) #endif } -static void apm32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void apm32_clock_timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { #if defined(SOC_SERIES_APM32F0) TMR_TimeBase_T base_config; @@ -337,15 +337,15 @@ static void apm32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t stat { timer_config = (struct apm32_timer *)timer->parent.user_data; - apm32_hwtimer_enable_clock(); + apm32_clock_timer_enable_clock(); - prescaler = (uint32_t)(apm32_hwtimer_clock_get(timer_config->tmr) / 10000) - 1; + prescaler = (uint32_t)(apm32_clock_timer_clock_get(timer_config->tmr) / 10000) - 1; base_config.period = 10000 - 1; #if defined(SOC_SERIES_APM32F0) base_config.div = prescaler; base_config.clockDivision = TMR_CKD_DIV1; - if (timer->info->cntmode == HWTIMER_CNTMODE_UP) + if (timer->info->cntmode == CLOCK_TIMER_CNTMODE_UP) { base_config.counterMode = TMR_COUNTER_MODE_UP; } @@ -357,7 +357,7 @@ static void apm32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t stat || defined(SOC_SERIES_APM32F4) base_config.division = prescaler; base_config.clockDivision = TMR_CLOCK_DIV_1; - if (timer->info->cntmode == HWTIMER_CNTMODE_UP) + if (timer->info->cntmode == CLOCK_TIMER_CNTMODE_UP) { base_config.countMode = TMR_COUNTER_MODE_UP; } @@ -391,7 +391,7 @@ static void apm32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t stat } } -static rt_err_t apm32_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +static rt_err_t apm32_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t t, rt_clock_timer_mode_t opmode) { rt_err_t result = RT_EOK; struct apm32_timer *timer_config = RT_NULL; @@ -405,7 +405,7 @@ static rt_err_t apm32_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtim /* set timer_config autoReload */ timer_config->tmr->AUTORLD = t - 1; - if (opmode == HWTIMER_MODE_ONESHOT) + if (opmode == CLOCK_TIMER_MODE_ONESHOT) { /* set timer to single mode */ timer_config->tmr->CTRL1_B.SPMEN = 1; @@ -442,7 +442,7 @@ static rt_err_t apm32_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtim return result; } -static void apm32_hwtimer_stop(rt_hwtimer_t *timer) +static void apm32_clock_timer_stop(rt_clock_timer_t *timer) { struct apm32_timer *timer_config = RT_NULL; RT_ASSERT(timer != RT_NULL); @@ -453,7 +453,7 @@ static void apm32_hwtimer_stop(rt_hwtimer_t *timer) timer_config->tmr->CNT = 0; } -static rt_err_t apm32_hwtimer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t apm32_clock_timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { struct apm32_timer *timer_config = RT_NULL; rt_err_t result = RT_EOK; @@ -467,11 +467,11 @@ static rt_err_t apm32_hwtimer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *a switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: /* set timer frequence */ freq = *((rt_uint32_t *)arg); - val = apm32_hwtimer_clock_get(timer_config->tmr) / freq; + val = apm32_clock_timer_clock_get(timer_config->tmr) / freq; /* Configures the timer prescaler */ timer_config->tmr->PSC_B.PSC = val - 1; @@ -485,7 +485,7 @@ static rt_err_t apm32_hwtimer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *a return result; } -static rt_uint32_t apm32_hwtimer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t apm32_clock_timer_counter_get(rt_clock_timer_t *timer) { struct apm32_timer *timer_config = RT_NULL; RT_ASSERT(timer != RT_NULL); @@ -494,13 +494,13 @@ static rt_uint32_t apm32_hwtimer_counter_get(rt_hwtimer_t *timer) return timer_config->tmr->CNT; } -static const struct rt_hwtimer_ops apm32_hwtimer_ops = +static const struct rt_clock_timer_ops apm32_clock_timer_ops = { - .init = apm32_hwtimer_init, - .start = apm32_hwtimer_start, - .stop = apm32_hwtimer_stop, - .count_get = apm32_hwtimer_counter_get, - .control = apm32_hwtimer_ctrl, + .init = apm32_clock_timer_init, + .start = apm32_clock_timer_start, + .stop = apm32_clock_timer_stop, + .count_get = apm32_clock_timer_counter_get, + .control = apm32_clock_timer_ctrl, }; @@ -509,7 +509,7 @@ static const struct rt_hwtimer_ops apm32_hwtimer_ops = void TMR1_BRK_UP_TRG_COM_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR1_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR1_INDEX].device); TMR_ClearIntFlag(TMR1, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -519,7 +519,7 @@ void TMR1_BRK_UP_TRG_COM_IRQHandler(void) void TMR1_UP_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR1_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR1_INDEX].device); TMR_ClearIntFlag(TMR1, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -531,12 +531,12 @@ void TMR1_UP_TMR10_IRQHandler(void) rt_interrupt_enter(); if (TMR_ReadIntFlag(TMR1, TMR_INT_UPDATE)) { - rt_device_hwtimer_isr(&tmr_config[TMR1_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR1_INDEX].device); TMR_ClearIntFlag(TMR1, TMR_INT_UPDATE); } if (TMR_ReadIntFlag(TMR10, TMR_INT_UPDATE)) { - rt_device_hwtimer_isr(&tmr_config[TMR10_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR10_INDEX].device); TMR_ClearIntFlag(TMR10, TMR_INT_UPDATE); } rt_interrupt_leave(); @@ -548,7 +548,7 @@ void TMR1_UP_TMR10_IRQHandler(void) void TMR2_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR2_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR2_INDEX].device); TMR_ClearIntFlag(TMR2, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -558,7 +558,7 @@ void TMR2_IRQHandler(void) void TMR3_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR3_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR3_INDEX].device); TMR_ClearIntFlag(TMR3, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -568,7 +568,7 @@ void TMR3_IRQHandler(void) void TMR4_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR4_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR4_INDEX].device); TMR_ClearIntFlag(TMR4, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -578,7 +578,7 @@ void TMR4_IRQHandler(void) void TMR5_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR5_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR5_INDEX].device); TMR_ClearIntFlag(TMR5, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -594,7 +594,7 @@ void TMR5_IRQHandler(void) #endif { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR6_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR6_INDEX].device); TMR_ClearIntFlag(TMR6, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -604,7 +604,7 @@ void TMR5_IRQHandler(void) void TMR7_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR7_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR7_INDEX].device); TMR_ClearIntFlag(TMR7, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -615,7 +615,7 @@ void TMR7_IRQHandler(void) void TMR8_UP_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR8_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR8_INDEX].device); TMR_ClearIntFlag(TMR8, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -627,12 +627,12 @@ void TMR8_UP_TMR13_IRQHandler(void) rt_interrupt_enter(); if (TMR_ReadIntFlag(TMR8, TMR_INT_UPDATE)) { - rt_device_hwtimer_isr(&tmr_config[TMR8_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR8_INDEX].device); TMR_ClearIntFlag(TMR8, TMR_INT_UPDATE); } if (TMR_ReadIntFlag(TMR13, TMR_INT_UPDATE)) { - rt_device_hwtimer_isr(&tmr_config[TMR13_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR13_INDEX].device); TMR_ClearIntFlag(TMR13, TMR_INT_UPDATE); } rt_interrupt_leave(); @@ -644,7 +644,7 @@ void TMR8_UP_TMR13_IRQHandler(void) void TMR1_BRK_TMR9_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR9_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR9_INDEX].device); TMR_ClearIntFlag(TMR9, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -654,7 +654,7 @@ void TMR1_BRK_TMR9_IRQHandler(void) void TMR1_TRG_COM_TMR11_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR11_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR11_INDEX].device); TMR_ClearIntFlag(TMR11, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -664,7 +664,7 @@ void TMR1_TRG_COM_TMR11_IRQHandler(void) void TMR8_BRK_TMR12_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR12_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR12_INDEX].device); TMR_ClearIntFlag(TMR12, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -678,7 +678,7 @@ void TMR8_BRK_TMR12_IRQHandler(void) #endif { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR14_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR14_INDEX].device); TMR_ClearIntFlag(TMR14, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -688,7 +688,7 @@ void TMR8_BRK_TMR12_IRQHandler(void) void TMR15_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR15_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR15_INDEX].device); TMR_ClearIntFlag(TMR15, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -698,7 +698,7 @@ void TMR15_IRQHandler(void) void TMR16_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR16_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR16_INDEX].device); TMR_ClearIntFlag(TMR16, TMR_INT_UPDATE); rt_interrupt_leave(); } @@ -708,13 +708,13 @@ void TMR16_IRQHandler(void) void TMR17_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&tmr_config[TMR17_INDEX].device); + rt_clock_timer_isr(&tmr_config[TMR17_INDEX].device); TMR_ClearIntFlag(TMR17, TMR_INT_UPDATE); rt_interrupt_leave(); } #endif -static int rt_hw_hwtimer_init(void) +static int rt_hw_clock_timer_init(void) { int i = 0; int result = RT_EOK; @@ -722,8 +722,8 @@ static int rt_hw_hwtimer_init(void) for (i = 0; i < sizeof(tmr_config) / sizeof(tmr_config[0]); i++) { tmr_config[i].device.info = &apm32_timer_info; - tmr_config[i].device.ops = &apm32_hwtimer_ops; - if (rt_device_hwtimer_register(&tmr_config[i].device, tmr_config[i].name, &tmr_config[i]) == RT_EOK) + tmr_config[i].device.ops = &apm32_clock_timer_ops; + if (rt_clock_timer_register(&tmr_config[i].device, tmr_config[i].name, &tmr_config[i]) == RT_EOK) { LOG_D("%s register success", tmr_config[i].name); } @@ -736,6 +736,6 @@ static int rt_hw_hwtimer_init(void) return result; } -INIT_BOARD_EXPORT(rt_hw_hwtimer_init); +INIT_BOARD_EXPORT(rt_hw_clock_timer_init); -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ diff --git a/bsp/at32/at32a403a-start/README.md b/bsp/at32/at32a403a-start/README.md index 1ada75f085..bfa6a2d013 100644 --- a/bsp/at32/at32a403a-start/README.md +++ b/bsp/at32/at32a403a-start/README.md @@ -46,7 +46,7 @@ AT32A403A-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1/2 | | DAC | 支持 | DAC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4/5 | +| CLOCK_TIMER | 支持 | TMR3/4/5 | | SDIO | 支持 | SDIO1 | | CAN | 支持 | CAN1/2 | | WDT | 支持 | | diff --git a/bsp/at32/at32a403a-start/board/Kconfig b/bsp/at32/at32a403a-start/board/Kconfig index bae96053cc..b7d8486d27 100644 --- a/bsp/at32/at32a403a-start/board/Kconfig +++ b/bsp/at32/at32a403a-start/board/Kconfig @@ -186,11 +186,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32a403a-start/board/src/at32_msp.c b/bsp/at32/at32a403a-start/board/src/at32_msp.c index 7011c578d2..2876eebdba 100644 --- a/bsp/at32/at32a403a-start/board/src/at32_msp.c +++ b/bsp/at32/at32a403a-start/board/src/at32_msp.c @@ -290,7 +290,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32a423-start/README.md b/bsp/at32/at32a423-start/README.md index ba2f349bd4..6f378267a9 100644 --- a/bsp/at32/at32a423-start/README.md +++ b/bsp/at32/at32a423-start/README.md @@ -46,7 +46,7 @@ AT32A423-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1 | | DAC | 支持 | DAC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3 | +| CLOCK_TIMER | 支持 | TMR3 | | CAN | 支持 | CAN1/2 | | WDT | 支持 | | | RTC | 支持 | | diff --git a/bsp/at32/at32a423-start/board/Kconfig b/bsp/at32/at32a423-start/board/Kconfig index 29d5188758..6da7a57f63 100644 --- a/bsp/at32/at32a423-start/board/Kconfig +++ b/bsp/at32/at32a423-start/board/Kconfig @@ -201,11 +201,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32a423-start/board/src/at32_msp.c b/bsp/at32/at32a423-start/board/src/at32_msp.c index 3a81f5585c..8e6ce1ae49 100644 --- a/bsp/at32/at32a423-start/board/src/at32_msp.c +++ b/bsp/at32/at32a423-start/board/src/at32_msp.c @@ -268,7 +268,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f402-start/README.md b/bsp/at32/at32f402-start/README.md index af52939a66..caf42a77f0 100644 --- a/bsp/at32/at32f402-start/README.md +++ b/bsp/at32/at32f402-start/README.md @@ -45,7 +45,7 @@ AT32F402-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | SPI | 支持 | SPI1/2 | | ADC | 支持 | ADC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4 | +| CLOCK_TIMER | 支持 | TMR3/4 | | CAN | 支持 | CAN1 | | QSPI | 支持 | QSPI1/2 | | WDT | 支持 | | diff --git a/bsp/at32/at32f402-start/board/Kconfig b/bsp/at32/at32f402-start/board/Kconfig index ae21e7e68e..58d9aa1a64 100644 --- a/bsp/at32/at32f402-start/board/Kconfig +++ b/bsp/at32/at32f402-start/board/Kconfig @@ -212,11 +212,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f402-start/board/src/at32_msp.c b/bsp/at32/at32f402-start/board/src/at32_msp.c index 9afbb74cfc..9f22f260bf 100644 --- a/bsp/at32/at32f402-start/board/src/at32_msp.c +++ b/bsp/at32/at32f402-start/board/src/at32_msp.c @@ -261,7 +261,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f403a-start/README.md b/bsp/at32/at32f403a-start/README.md index 2b9504a6f5..53d307caa0 100644 --- a/bsp/at32/at32f403a-start/README.md +++ b/bsp/at32/at32f403a-start/README.md @@ -46,7 +46,7 @@ AT32F403A-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1/2 | | DAC | 支持 | DAC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4/5 | +| CLOCK_TIMER | 支持 | TMR3/4/5 | | SDIO | 支持 | SDIO1 | | CAN | 支持 | CAN1/2 | | WDT | 支持 | | diff --git a/bsp/at32/at32f403a-start/board/Kconfig b/bsp/at32/at32f403a-start/board/Kconfig index b905e52b7c..a12ff97a97 100644 --- a/bsp/at32/at32f403a-start/board/Kconfig +++ b/bsp/at32/at32f403a-start/board/Kconfig @@ -186,11 +186,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f403a-start/board/src/at32_msp.c b/bsp/at32/at32f403a-start/board/src/at32_msp.c index 848ff32cdd..e947bcdcab 100644 --- a/bsp/at32/at32f403a-start/board/src/at32_msp.c +++ b/bsp/at32/at32f403a-start/board/src/at32_msp.c @@ -290,7 +290,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f405-start/README.md b/bsp/at32/at32f405-start/README.md index 533158aa2c..45beb431f7 100644 --- a/bsp/at32/at32f405-start/README.md +++ b/bsp/at32/at32f405-start/README.md @@ -45,7 +45,7 @@ AT32F405-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | SPI | 支持 | SPI1/2 | | ADC | 支持 | ADC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4 | +| CLOCK_TIMER | 支持 | TMR3/4 | | CAN | 支持 | CAN1 | | QSPI | 支持 | QSPI1/2 | | WDT | 支持 | | diff --git a/bsp/at32/at32f405-start/board/Kconfig b/bsp/at32/at32f405-start/board/Kconfig index edd92e9320..50f523cd4c 100644 --- a/bsp/at32/at32f405-start/board/Kconfig +++ b/bsp/at32/at32f405-start/board/Kconfig @@ -231,11 +231,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f405-start/board/src/at32_msp.c b/bsp/at32/at32f405-start/board/src/at32_msp.c index da12e07a50..b9ee677888 100644 --- a/bsp/at32/at32f405-start/board/src/at32_msp.c +++ b/bsp/at32/at32f405-start/board/src/at32_msp.c @@ -261,7 +261,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f407-start/README.md b/bsp/at32/at32f407-start/README.md index 9a1eb58965..cf03582eb3 100644 --- a/bsp/at32/at32f407-start/README.md +++ b/bsp/at32/at32f407-start/README.md @@ -46,7 +46,7 @@ AT32F407-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1/2 | | DAC | 支持 | DAC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4/5 | +| CLOCK_TIMER | 支持 | TMR3/4/5 | | SDIO | 支持 | SDIO1 | | CAN | 支持 | CAN1/2 | | WDT | 支持 | | diff --git a/bsp/at32/at32f407-start/board/Kconfig b/bsp/at32/at32f407-start/board/Kconfig index 037d736049..c4c7e65048 100644 --- a/bsp/at32/at32f407-start/board/Kconfig +++ b/bsp/at32/at32f407-start/board/Kconfig @@ -209,11 +209,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f407-start/board/src/at32_msp.c b/bsp/at32/at32f407-start/board/src/at32_msp.c index 63ef0c2dee..58a90aa37d 100644 --- a/bsp/at32/at32f407-start/board/src/at32_msp.c +++ b/bsp/at32/at32f407-start/board/src/at32_msp.c @@ -292,7 +292,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f413-start/README.md b/bsp/at32/at32f413-start/README.md index 4eee25d488..437eb51c73 100644 --- a/bsp/at32/at32f413-start/README.md +++ b/bsp/at32/at32f413-start/README.md @@ -45,7 +45,7 @@ AT32F413-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | SPI | 支持 | SPI1/2 | | ADC | 支持 | ADC1/2 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4/5 | +| CLOCK_TIMER | 支持 | TMR3/4/5 | | SDIO | 支持 | SDIO1 | | CAN | 支持 | CAN1/2 | | WDT | 支持 | | diff --git a/bsp/at32/at32f413-start/board/Kconfig b/bsp/at32/at32f413-start/board/Kconfig index eb784abc99..b809dd5702 100644 --- a/bsp/at32/at32f413-start/board/Kconfig +++ b/bsp/at32/at32f413-start/board/Kconfig @@ -186,11 +186,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f413-start/board/src/at32_msp.c b/bsp/at32/at32f413-start/board/src/at32_msp.c index fc0498c408..fa6276028d 100644 --- a/bsp/at32/at32f413-start/board/src/at32_msp.c +++ b/bsp/at32/at32f413-start/board/src/at32_msp.c @@ -274,7 +274,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f415-start/README.md b/bsp/at32/at32f415-start/README.md index 7863aeba8f..9f42d4637e 100644 --- a/bsp/at32/at32f415-start/README.md +++ b/bsp/at32/at32f415-start/README.md @@ -45,7 +45,7 @@ AT32F415-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | SPI | 支持 | SPI1/2 | | ADC | 支持 | ADC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4/5 | +| CLOCK_TIMER | 支持 | TMR3/4/5 | | SDIO | 支持 | SDIO1 | | CAN | 支持 | CAN1 | | WDT | 支持 | | diff --git a/bsp/at32/at32f415-start/board/Kconfig b/bsp/at32/at32f415-start/board/Kconfig index b6f1375c83..fd29cc332e 100644 --- a/bsp/at32/at32f415-start/board/Kconfig +++ b/bsp/at32/at32f415-start/board/Kconfig @@ -201,11 +201,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f415-start/board/src/at32_msp.c b/bsp/at32/at32f415-start/board/src/at32_msp.c index 64db65da7a..8522820931 100644 --- a/bsp/at32/at32f415-start/board/src/at32_msp.c +++ b/bsp/at32/at32f415-start/board/src/at32_msp.c @@ -260,7 +260,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f421-start/README.md b/bsp/at32/at32f421-start/README.md index e7abaf68b2..7407728e9e 100644 --- a/bsp/at32/at32f421-start/README.md +++ b/bsp/at32/at32f421-start/README.md @@ -45,7 +45,7 @@ AT32F421-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | SPI | 支持 | SPI1/2 | | ADC | 支持 | ADC1 | | PWM | 支持 | TMR1 | -| HWTIMER | 支持 | TMR3 | +| CLOCK_TIMER | 支持 | TMR3 | | WDT | 支持 | | | RTC | 支持 | | | FLASH | 支持 | | diff --git a/bsp/at32/at32f421-start/board/Kconfig b/bsp/at32/at32f421-start/board/Kconfig index 982750fdbd..a3e4f931c2 100644 --- a/bsp/at32/at32f421-start/board/Kconfig +++ b/bsp/at32/at32f421-start/board/Kconfig @@ -135,11 +135,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f421-start/board/src/at32_msp.c b/bsp/at32/at32f421-start/board/src/at32_msp.c index a5221a799d..2b0b1b299d 100644 --- a/bsp/at32/at32f421-start/board/src/at32_msp.c +++ b/bsp/at32/at32f421-start/board/src/at32_msp.c @@ -213,7 +213,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f423-start/README.md b/bsp/at32/at32f423-start/README.md index 281074e5f8..4f9698fd76 100644 --- a/bsp/at32/at32f423-start/README.md +++ b/bsp/at32/at32f423-start/README.md @@ -46,7 +46,7 @@ AT32F423-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1 | | DAC | 支持 | DAC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3 | +| CLOCK_TIMER | 支持 | TMR3 | | CAN | 支持 | CAN1/2 | | WDT | 支持 | | | RTC | 支持 | | diff --git a/bsp/at32/at32f423-start/board/Kconfig b/bsp/at32/at32f423-start/board/Kconfig index a272271c69..51da2462ab 100644 --- a/bsp/at32/at32f423-start/board/Kconfig +++ b/bsp/at32/at32f423-start/board/Kconfig @@ -201,11 +201,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f423-start/board/src/at32_msp.c b/bsp/at32/at32f423-start/board/src/at32_msp.c index 396e8622e8..9216209e3c 100644 --- a/bsp/at32/at32f423-start/board/src/at32_msp.c +++ b/bsp/at32/at32f423-start/board/src/at32_msp.c @@ -269,7 +269,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f425-start/README.md b/bsp/at32/at32f425-start/README.md index 51e063ec2b..aa08bdec06 100644 --- a/bsp/at32/at32f425-start/README.md +++ b/bsp/at32/at32f425-start/README.md @@ -45,7 +45,7 @@ AT32F425-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | SPI | 支持 | SPI1/2 | | ADC | 支持 | ADC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3 | +| CLOCK_TIMER | 支持 | TMR3 | | CAN | 支持 | CAN1 | | WDT | 支持 | | | RTC | 支持 | | diff --git a/bsp/at32/at32f425-start/board/Kconfig b/bsp/at32/at32f425-start/board/Kconfig index 2aa0bd4430..cc47c54329 100644 --- a/bsp/at32/at32f425-start/board/Kconfig +++ b/bsp/at32/at32f425-start/board/Kconfig @@ -201,11 +201,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f425-start/board/src/at32_msp.c b/bsp/at32/at32f425-start/board/src/at32_msp.c index 4f0ba76955..b9ad73631f 100644 --- a/bsp/at32/at32f425-start/board/src/at32_msp.c +++ b/bsp/at32/at32f425-start/board/src/at32_msp.c @@ -250,7 +250,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f435-start/README.md b/bsp/at32/at32f435-start/README.md index c9d2261fef..a9e64eb3e9 100644 --- a/bsp/at32/at32f435-start/README.md +++ b/bsp/at32/at32f435-start/README.md @@ -46,7 +46,7 @@ AT32F437-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1/2 | | DAC | 支持 | DAC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4/5 | +| CLOCK_TIMER | 支持 | TMR3/4/5 | | SDIO | 支持 | SDIO1 | | CAN | 支持 | CAN1/2 | | QSPI | 支持 | QSPI1/2 | diff --git a/bsp/at32/at32f435-start/board/Kconfig b/bsp/at32/at32f435-start/board/Kconfig index 25a75ce530..f00c2718f4 100644 --- a/bsp/at32/at32f435-start/board/Kconfig +++ b/bsp/at32/at32f435-start/board/Kconfig @@ -235,11 +235,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f435-start/board/src/at32_msp.c b/bsp/at32/at32f435-start/board/src/at32_msp.c index dcd558ae8c..acd87d52bb 100644 --- a/bsp/at32/at32f435-start/board/src/at32_msp.c +++ b/bsp/at32/at32f435-start/board/src/at32_msp.c @@ -310,7 +310,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f437-start/README.md b/bsp/at32/at32f437-start/README.md index 9e6b73b89f..c8f7a83a01 100644 --- a/bsp/at32/at32f437-start/README.md +++ b/bsp/at32/at32f437-start/README.md @@ -46,7 +46,7 @@ AT32F437-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1/2 | | DAC | 支持 | DAC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4/5 | +| CLOCK_TIMER | 支持 | TMR3/4/5 | | SDIO | 支持 | SDIO1 | | CAN | 支持 | CAN1/2 | | QSPI | 支持 | QSPI1/2 | diff --git a/bsp/at32/at32f437-start/board/Kconfig b/bsp/at32/at32f437-start/board/Kconfig index 5e215329fc..da90f3c231 100644 --- a/bsp/at32/at32f437-start/board/Kconfig +++ b/bsp/at32/at32f437-start/board/Kconfig @@ -258,11 +258,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f437-start/board/src/at32_msp.c b/bsp/at32/at32f437-start/board/src/at32_msp.c index 1a22f367f1..29a4cc9baf 100644 --- a/bsp/at32/at32f437-start/board/src/at32_msp.c +++ b/bsp/at32/at32f437-start/board/src/at32_msp.c @@ -311,7 +311,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f455-start/README.md b/bsp/at32/at32f455-start/README.md index 0770b763d6..6e02fe3b64 100644 --- a/bsp/at32/at32f455-start/README.md +++ b/bsp/at32/at32f455-start/README.md @@ -46,7 +46,7 @@ AT32F455-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1/2 | | DAC | 支持 | DAC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4/5 | +| CLOCK_TIMER | 支持 | TMR3/4/5 | | SDIO | 支持 | SDIO1 | | CAN | 支持 | CAN1/2 | | QSPI | 支持 | QSPI1 | diff --git a/bsp/at32/at32f455-start/board/Kconfig b/bsp/at32/at32f455-start/board/Kconfig index 83202f14fe..c8f39b0b80 100644 --- a/bsp/at32/at32f455-start/board/Kconfig +++ b/bsp/at32/at32f455-start/board/Kconfig @@ -221,11 +221,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f455-start/board/src/at32_msp.c b/bsp/at32/at32f455-start/board/src/at32_msp.c index fe9d78816f..b61a2c93f3 100644 --- a/bsp/at32/at32f455-start/board/src/at32_msp.c +++ b/bsp/at32/at32f455-start/board/src/at32_msp.c @@ -310,7 +310,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f456-start/README.md b/bsp/at32/at32f456-start/README.md index 6679f455d3..c9c46312a8 100644 --- a/bsp/at32/at32f456-start/README.md +++ b/bsp/at32/at32f456-start/README.md @@ -46,7 +46,7 @@ AT32F456-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1/2 | | DAC | 支持 | DAC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4/5 | +| CLOCK_TIMER | 支持 | TMR3/4/5 | | SDIO | 支持 | SDIO1 | | CAN | 支持 | CAN1/2 | | QSPI | 支持 | QSPI1 | diff --git a/bsp/at32/at32f456-start/board/Kconfig b/bsp/at32/at32f456-start/board/Kconfig index 2bbbca1d38..b474dba771 100644 --- a/bsp/at32/at32f456-start/board/Kconfig +++ b/bsp/at32/at32f456-start/board/Kconfig @@ -221,11 +221,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f456-start/board/src/at32_msp.c b/bsp/at32/at32f456-start/board/src/at32_msp.c index fe9d78816f..b61a2c93f3 100644 --- a/bsp/at32/at32f456-start/board/src/at32_msp.c +++ b/bsp/at32/at32f456-start/board/src/at32_msp.c @@ -310,7 +310,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32f457-start/README.md b/bsp/at32/at32f457-start/README.md index d230bc6127..5e9742b639 100644 --- a/bsp/at32/at32f457-start/README.md +++ b/bsp/at32/at32f457-start/README.md @@ -46,7 +46,7 @@ AT32F457-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1/2 | | DAC | 支持 | DAC1 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3/4/5 | +| CLOCK_TIMER | 支持 | TMR3/4/5 | | SDIO | 支持 | SDIO1 | | CAN | 支持 | CAN1/2 | | QSPI | 支持 | QSPI1 | diff --git a/bsp/at32/at32f457-start/board/Kconfig b/bsp/at32/at32f457-start/board/Kconfig index 73334123df..2fce389a82 100644 --- a/bsp/at32/at32f457-start/board/Kconfig +++ b/bsp/at32/at32f457-start/board/Kconfig @@ -221,11 +221,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32f457-start/board/src/at32_msp.c b/bsp/at32/at32f457-start/board/src/at32_msp.c index f37fac2f43..d665681eda 100644 --- a/bsp/at32/at32f457-start/board/src/at32_msp.c +++ b/bsp/at32/at32f457-start/board/src/at32_msp.c @@ -310,7 +310,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32m412-start/README.md b/bsp/at32/at32m412-start/README.md index 094e639404..9b17cc05e6 100644 --- a/bsp/at32/at32m412-start/README.md +++ b/bsp/at32/at32m412-start/README.md @@ -46,7 +46,7 @@ AT32M412-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1/2 | | DAC | 支持 | DAC1/2 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3 | +| CLOCK_TIMER | 支持 | TMR3 | | CAN | 支持 | CAN1 | | WDT | 支持 | | | RTC | 支持 | | diff --git a/bsp/at32/at32m412-start/board/Kconfig b/bsp/at32/at32m412-start/board/Kconfig index 4bb310d92b..dd541b0145 100644 --- a/bsp/at32/at32m412-start/board/Kconfig +++ b/bsp/at32/at32m412-start/board/Kconfig @@ -135,11 +135,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32m412-start/board/src/at32_msp.c b/bsp/at32/at32m412-start/board/src/at32_msp.c index 30e70be4ac..51d3e07c8c 100644 --- a/bsp/at32/at32m412-start/board/src/at32_msp.c +++ b/bsp/at32/at32m412-start/board/src/at32_msp.c @@ -208,7 +208,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/at32m416-start/README.md b/bsp/at32/at32m416-start/README.md index 9f0243f69c..fd5f19d16f 100644 --- a/bsp/at32/at32m416-start/README.md +++ b/bsp/at32/at32m416-start/README.md @@ -46,7 +46,7 @@ AT32M416-START板级包支持MDK4﹑MDK5﹑IAR开发环境和GCC编译器,以 | ADC | 支持 | ADC1/2 | | DAC | 支持 | DAC1/2 | | PWM | 支持 | TMR1/2 | -| HWTIMER | 支持 | TMR3 | +| CLOCK_TIMER | 支持 | TMR3 | | CAN | 支持 | CAN1 | | WDT | 支持 | | | RTC | 支持 | | diff --git a/bsp/at32/at32m416-start/board/Kconfig b/bsp/at32/at32m416-start/board/Kconfig index 1601313f4a..8414740adf 100644 --- a/bsp/at32/at32m416-start/board/Kconfig +++ b/bsp/at32/at32m416-start/board/Kconfig @@ -135,11 +135,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTMR3 bool "Enable hardware timer3" default n diff --git a/bsp/at32/at32m416-start/board/src/at32_msp.c b/bsp/at32/at32m416-start/board/src/at32_msp.c index 30e70be4ac..51d3e07c8c 100644 --- a/bsp/at32/at32m416-start/board/src/at32_msp.c +++ b/bsp/at32/at32m416-start/board/src/at32_msp.c @@ -208,7 +208,7 @@ void at32_msp_adc_init(void *instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void at32_msp_hwtmr_init(void *instance) { tmr_type *tmr_x = (tmr_type *)instance; diff --git a/bsp/at32/libraries/rt_drivers/SConscript b/bsp/at32/libraries/rt_drivers/SConscript index 1a0d17c1ae..090fde5feb 100644 --- a/bsp/at32/libraries/rt_drivers/SConscript +++ b/bsp/at32/libraries/rt_drivers/SConscript @@ -25,8 +25,8 @@ if GetDepend(['RT_USING_SERIAL']): if GetDepend(['BSP_USING_PWM']): src += ['drv_pwm.c'] -if GetDepend(['BSP_USING_HWTIMER']): - src += ['drv_hwtimer.c'] +if GetDepend(['BSP_USING_CLOCK_TIMER']): + src += ['drv_timer.c'] if GetDepend(['BSP_USING_SPI']): src += ['drv_spi.c'] diff --git a/bsp/at32/libraries/rt_drivers/drv_hwtimer.c b/bsp/at32/libraries/rt_drivers/drv_timer.c similarity index 80% rename from bsp/at32/libraries/rt_drivers/drv_hwtimer.c rename to bsp/at32/libraries/rt_drivers/drv_timer.c index 345638a322..55ff0ed5d0 100644 --- a/bsp/at32/libraries/rt_drivers/drv_hwtimer.c +++ b/bsp/at32/libraries/rt_drivers/drv_timer.c @@ -9,13 +9,13 @@ */ #include "board.h" -#include "drv_hwtimer.h" +#include "drv_timer.h" //#define DRV_DEBUG -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER enum { @@ -80,15 +80,15 @@ enum #endif }; -struct at32_hwtimer +struct at32_clock_timer { - rt_hwtimer_t tmr_device; + rt_clock_timer_t tmr_device; tmr_type* tmr_x; IRQn_Type tmr_irqn; char *name; }; -static struct at32_hwtimer at32_hwtimer_obj[] = +static struct at32_clock_timer at32_clock_timer_obj[] = { #ifdef BSP_USING_HWTMR1 TMR1_CONFIG, @@ -171,19 +171,19 @@ static void tmr_pclk_get(rt_uint32_t *pclk1_doubler, rt_uint32_t *pclk2_doubler) } } -static void at32_timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void at32_timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { crm_clocks_freq_type clocks_struct; rt_uint32_t pclk1_doubler = 0, pclk2_doubler = 0; rt_uint32_t prescaler_value = 0, tmr_clock = 0; tmr_type *tmr_x = RT_NULL; - struct at32_hwtimer *tmr_device = RT_NULL; + struct at32_clock_timer *tmr_device = RT_NULL; RT_ASSERT(timer != RT_NULL); if (state) { tmr_x = (tmr_type *)timer->parent.user_data; - tmr_device = (struct at32_hwtimer *)timer; + tmr_device = (struct at32_clock_timer *)timer; /* timer clock enable */ at32_msp_hwtmr_init(tmr_x); @@ -222,7 +222,7 @@ static void at32_timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) tmr_clock_source_div_set(tmr_x, TMR_CLOCK_DIV1); tmr_repetition_counter_set(tmr_x, 0); - if (timer->info->cntmode == HWTIMER_CNTMODE_UP) + if (timer->info->cntmode == CLOCK_TIMER_CNTMODE_UP) { tmr_cnt_dir_set(tmr_x, TMR_COUNT_UP); } @@ -241,7 +241,7 @@ static void at32_timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) } } -static rt_err_t at32_timer_start(rt_hwtimer_t *timer, rt_uint32_t pr, rt_hwtimer_mode_t opmode) +static rt_err_t at32_timer_start(rt_clock_timer_t *timer, rt_uint32_t pr, rt_clock_timer_mode_t opmode) { rt_err_t result = RT_EOK; tmr_type *tmr_x = RT_NULL; @@ -254,7 +254,7 @@ static rt_err_t at32_timer_start(rt_hwtimer_t *timer, rt_uint32_t pr, rt_hwtimer /* set tmr_x period register */ tmr_period_value_set(tmr_x, pr - 1); - if (opmode == HWTIMER_MODE_ONESHOT) + if (opmode == CLOCK_TIMER_MODE_ONESHOT) { /* set timer to one cycle mode */ tmr_one_cycle_mode_enable(tmr_x, TRUE); @@ -271,7 +271,7 @@ static rt_err_t at32_timer_start(rt_hwtimer_t *timer, rt_uint32_t pr, rt_hwtimer return result; } -static void at32_timer_stop(rt_hwtimer_t *timer) +static void at32_timer_stop(rt_clock_timer_t *timer) { tmr_type *tmr_x = RT_NULL; @@ -285,7 +285,7 @@ static void at32_timer_stop(rt_hwtimer_t *timer) tmr_counter_value_set(tmr_x, 0); } -static rt_uint32_t at32_timer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t at32_timer_counter_get(rt_clock_timer_t *timer) { tmr_type *tmr_x = RT_NULL; @@ -296,7 +296,7 @@ static rt_uint32_t at32_timer_counter_get(rt_hwtimer_t *timer) return tmr_counter_value_get(tmr_x); } -static rt_err_t at32_timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t at32_timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { crm_clocks_freq_type clocks_struct; tmr_type *tmr_x = RT_NULL; @@ -310,7 +310,7 @@ static rt_err_t at32_timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) switch(cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t freq; rt_uint16_t val; @@ -362,8 +362,8 @@ static rt_err_t at32_timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) return result; } -static const struct rt_hwtimer_info _info = TMR_DEV_INFO_CONFIG; -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_info _info = TMR_DEV_INFO_CONFIG; +static const struct rt_clock_timer_ops _ops = { .init = at32_timer_init, .start = at32_timer_start, @@ -380,7 +380,7 @@ void TMR2_GLOBAL_IRQHandler(void) if(tmr_flag_get(TMR2, TMR_OVF_FLAG) == SET) { - rt_device_hwtimer_isr(&at32_hwtimer_obj[TMR2_INDEX].tmr_device); + rt_clock_timer_isr(&at32_clock_timer_obj[TMR2_INDEX].tmr_device); tmr_flag_clear(TMR2, TMR_OVF_FLAG); } /* leave interrupt */ @@ -396,7 +396,7 @@ void TMR3_GLOBAL_IRQHandler(void) if(tmr_flag_get(TMR3, TMR_OVF_FLAG) == SET) { - rt_device_hwtimer_isr(&at32_hwtimer_obj[TMR3_INDEX].tmr_device); + rt_clock_timer_isr(&at32_clock_timer_obj[TMR3_INDEX].tmr_device); tmr_flag_clear(TMR3, TMR_OVF_FLAG); } /* leave interrupt */ @@ -412,7 +412,7 @@ void TMR4_GLOBAL_IRQHandler(void) if(tmr_flag_get(TMR4, TMR_OVF_FLAG) == SET) { - rt_device_hwtimer_isr(&at32_hwtimer_obj[TMR4_INDEX].tmr_device); + rt_clock_timer_isr(&at32_clock_timer_obj[TMR4_INDEX].tmr_device); tmr_flag_clear(TMR4, TMR_OVF_FLAG); } /* leave interrupt */ @@ -428,7 +428,7 @@ void TMR5_GLOBAL_IRQHandler(void) if(tmr_flag_get(TMR5, TMR_OVF_FLAG) == SET) { - rt_device_hwtimer_isr(&at32_hwtimer_obj[TMR5_INDEX].tmr_device); + rt_clock_timer_isr(&at32_clock_timer_obj[TMR5_INDEX].tmr_device); tmr_flag_clear(TMR5, TMR_OVF_FLAG); } /* leave interrupt */ @@ -436,22 +436,22 @@ void TMR5_GLOBAL_IRQHandler(void) } #endif -static int rt_hw_hwtimer_init(void) +static int rt_hw_clock_timer_init(void) { int i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(at32_hwtimer_obj) / sizeof(at32_hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(at32_clock_timer_obj) / sizeof(at32_clock_timer_obj[0]); i++) { - at32_hwtimer_obj[i].tmr_device.info = &_info; - at32_hwtimer_obj[i].tmr_device.ops = &_ops; - if (rt_device_hwtimer_register(&at32_hwtimer_obj[i].tmr_device, at32_hwtimer_obj[i].name, at32_hwtimer_obj[i].tmr_x) == RT_EOK) + at32_clock_timer_obj[i].tmr_device.info = &_info; + at32_clock_timer_obj[i].tmr_device.ops = &_ops; + if (rt_clock_timer_register(&at32_clock_timer_obj[i].tmr_device, at32_clock_timer_obj[i].name, at32_clock_timer_obj[i].tmr_x) == RT_EOK) { - LOG_D("%s register success", at32_hwtimer_obj[i].name); + LOG_D("%s register success", at32_clock_timer_obj[i].name); } else { - LOG_E("%s register failed", at32_hwtimer_obj[i].name); + LOG_E("%s register failed", at32_clock_timer_obj[i].name); result = -RT_ERROR; } } @@ -459,6 +459,6 @@ static int rt_hw_hwtimer_init(void) return result; } -INIT_BOARD_EXPORT(rt_hw_hwtimer_init); +INIT_BOARD_EXPORT(rt_hw_clock_timer_init); -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/at32/libraries/rt_drivers/drv_hwtimer.h b/bsp/at32/libraries/rt_drivers/drv_timer.h similarity index 95% rename from bsp/at32/libraries/rt_drivers/drv_hwtimer.h rename to bsp/at32/libraries/rt_drivers/drv_timer.h index 624437f559..fac966bf24 100644 --- a/bsp/at32/libraries/rt_drivers/drv_hwtimer.h +++ b/bsp/at32/libraries/rt_drivers/drv_timer.h @@ -12,7 +12,7 @@ #define __TMR_CONFIG_H__ #include -#include +#include #ifdef __cplusplus extern "C" { @@ -24,7 +24,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 4000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/at91/at91sam9g45/project.ewp b/bsp/at91/at91sam9g45/project.ewp index a3b12ade7f..6282b32b53 100644 --- a/bsp/at91/at91sam9g45/project.ewp +++ b/bsp/at91/at91sam9g45/project.ewp @@ -329,7 +329,7 @@ $PROJ_DIR$\..\..\..\components\drivers\include $PROJ_DIR$\drivers $PROJ_DIR$\..\..\..\components\libc\compilers\common\extension - $PROJ_DIR$\..\..\..\components\drivers\ktime + $PROJ_DIR$\..\..\..\components\drivers\clock_time $PROJ_DIR$\. $PROJ_DIR$\..\..\..\include $PROJ_DIR$\..\..\..\components\libc\posix\delay @@ -340,7 +340,7 @@ $PROJ_DIR$\..\..\..\components\drivers\phy $PROJ_DIR$\..\..\..\components\dfs\dfs_v1\filesystems\devfs $PROJ_DIR$\..\..\..\components\dfs\dfs_v1\include - $PROJ_DIR$\..\..\..\components\drivers\ktime\inc + $PROJ_DIR$\..\..\..\components\drivers\clock_time\inc - ktime + clock_time - $PROJ_DIR$\..\..\..\components\drivers\ktime\src\cputimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_time_core.c - $PROJ_DIR$\..\..\..\components\drivers\ktime\src\boottime.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_boottime.c - $PROJ_DIR$\..\..\..\components\drivers\ktime\src\hrtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_hrtimer.c diff --git a/bsp/at91/at91sam9g45/project.uvproj b/bsp/at91/at91sam9g45/project.uvproj index 7f2d693077..7368f3098b 100644 --- a/bsp/at91/at91sam9g45/project.uvproj +++ b/bsp/at91/at91sam9g45/project.uvproj @@ -359,7 +359,7 @@ __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND, RT_USING_LIBC, RT_USING_ARMLIBC, __STDC_LIMIT_MACROS - ..\..\..\components\libc\posix\io\poll;..\..\..\include;..\..\..\libcpu\arm\common;..\..\..\components\drivers\ktime\inc;..\..\..\libcpu\arm\arm926;applications;..\..\..\components\libc\posix\tls;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\eventfd;..\..\..\components\dfs\dfs_v1\include;..\..\..\components\drivers\phy;.;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\components\libc\cplusplus;platform;..\..\..\components\libc\posix\pthreads;..\..\..\components\drivers\include;..\..\..\components\finsh;..\..\..\components\libc\posix\io\epoll;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\include;..\..\..\components\dfs\dfs_v1\filesystems\devfs;..\..\..\components\drivers\ktime;..\..\..\components\drivers\smp_call;drivers;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\posix\delay + ..\..\..\components\libc\posix\io\poll;..\..\..\include;..\..\..\libcpu\arm\common;..\..\..\components\drivers\clock_time\inc;..\..\..\libcpu\arm\arm926;applications;..\..\..\components\libc\posix\tls;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\eventfd;..\..\..\components\dfs\dfs_v1\include;..\..\..\components\drivers\phy;.;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\components\libc\cplusplus;platform;..\..\..\components\libc\posix\pthreads;..\..\..\components\drivers\include;..\..\..\components\finsh;..\..\..\components\libc\posix\io\epoll;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\include;..\..\..\components\dfs\dfs_v1\filesystems\devfs;..\..\..\components\drivers\clock_time;..\..\..\components\drivers\smp_call;drivers;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\posix\delay @@ -1222,12 +1222,12 @@ - ktime + clock_time - boottime.c + clock_boottime.c 1 - ..\..\..\components\drivers\ktime\src\boottime.c + ..\..\..\components\drivers\clock_time\clock_boottime.c @@ -1244,9 +1244,9 @@ - cputimer.c + clock_time_core.c 1 - ..\..\..\components\drivers\ktime\src\cputimer.c + ..\..\..\components\drivers\clock_time\clock_time_core.c @@ -1263,9 +1263,9 @@ - hrtimer.c + clock_hrtimer.c 1 - ..\..\..\components\drivers\ktime\src\hrtimer.c + ..\..\..\components\drivers\clock_time\clock_hrtimer.c diff --git a/bsp/bluetrum/ab32vg1-ab-prougen/board/Kconfig b/bsp/bluetrum/ab32vg1-ab-prougen/board/Kconfig index fec93e4e68..670a59980c 100644 --- a/bsp/bluetrum/ab32vg1-ab-prougen/board/Kconfig +++ b/bsp/bluetrum/ab32vg1-ab-prougen/board/Kconfig @@ -178,7 +178,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM1 bool "Enable TIM1" diff --git a/bsp/bluetrum/libraries/hal_drivers/SConscript b/bsp/bluetrum/libraries/hal_drivers/SConscript index b35a6e89cc..0a6dd7e0cd 100644 --- a/bsp/bluetrum/libraries/hal_drivers/SConscript +++ b/bsp/bluetrum/libraries/hal_drivers/SConscript @@ -23,8 +23,8 @@ if GetDepend('RT_USING_I2C'): if GetDepend('RT_USING_WDT'): src += ['drv_wdt.c'] -if GetDepend('RT_USING_HWTIMER'): - src += ['drv_hwtimer.c'] +if GetDepend('RT_USING_CLOCK_TIME'): + src += ['drv_timer.c'] if GetDepend('RT_USING_PWM'): src += ['drv_pwm.c'] diff --git a/bsp/bluetrum/libraries/hal_drivers/config/tim_config.h b/bsp/bluetrum/libraries/hal_drivers/config/tim_config.h index b1c29ae1e8..ae67d24172 100644 --- a/bsp/bluetrum/libraries/hal_drivers/config/tim_config.h +++ b/bsp/bluetrum/libraries/hal_drivers/config/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 3000, \ .maxcnt = 0xFFFFFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/bluetrum/libraries/hal_drivers/drv_hwtimer.c b/bsp/bluetrum/libraries/hal_drivers/drv_timer.c similarity index 60% rename from bsp/bluetrum/libraries/hal_drivers/drv_hwtimer.c rename to bsp/bluetrum/libraries/hal_drivers/drv_timer.c index ef925fa037..b79116a238 100644 --- a/bsp/bluetrum/libraries/hal_drivers/drv_hwtimer.c +++ b/bsp/bluetrum/libraries/hal_drivers/drv_timer.c @@ -13,10 +13,10 @@ #include "tim_config.h" //#define DRV_DEBUG -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME enum { @@ -37,15 +37,15 @@ enum #endif }; -struct ab32_hwtimer +struct ab32_clock_timer { - rt_hwtimer_t time_device; + rt_clock_timer_t time_device; hal_sfr_t tim_handle; char *name; irq_type tim_irqn; }; -static struct ab32_hwtimer ab32_hwtimer_obj[] = +static struct ab32_clock_timer ab32_clock_timer_obj[] = { #ifdef BSP_USING_TIM1 TIM1_CONFIG, @@ -69,7 +69,7 @@ static struct ab32_hwtimer ab32_hwtimer_obj[] = }; rt_section(".irq.timer") -static void _rt_device_hwtimer_isr(rt_hwtimer_t *timer) +static void _rt_clock_timer_isr(rt_clock_timer_t *timer) { RT_ASSERT(timer != RT_NULL); @@ -84,7 +84,7 @@ static void _rt_device_hwtimer_isr(rt_hwtimer_t *timer) { timer->cycles = timer->reload; - if (timer->mode == HWTIMER_MODE_ONESHOT) + if (timer->mode == CLOCK_TIMER_MODE_ONESHOT) { if (timer->ops->stop != RT_NULL) { @@ -94,27 +94,27 @@ static void _rt_device_hwtimer_isr(rt_hwtimer_t *timer) if (timer->parent.rx_indicate != RT_NULL) { - timer->parent.rx_indicate(&timer->parent, sizeof(struct rt_hwtimerval)); + timer->parent.rx_indicate(&timer->parent, sizeof(struct rt_clock_timerval)); } } } -static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { rt_uint32_t prescaler_value = 0; hal_sfr_t tim = RT_NULL; - struct ab32_hwtimer *tim_device = RT_NULL; + struct ab32_clock_timer *tim_device = RT_NULL; RT_ASSERT(timer != RT_NULL); tim = (hal_sfr_t)timer->parent.user_data; if (state) { - tim_device = (struct ab32_hwtimer *)timer; + tim_device = (struct ab32_clock_timer *)timer; - if (timer->info->cntmode != HWTIMER_CNTMODE_UP) + if (timer->info->cntmode != CLOCK_TIMER_CNTMODE_UP) { - LOG_E("Only support HWTIMER_CNTMODE_UP!"); + LOG_E("Only support CLOCK_TIMER_CNTMODE_UP!"); } /* set tim int */ @@ -127,7 +127,7 @@ static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) } } -static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +static rt_err_t timer_start(rt_clock_timer_t *timer, rt_uint32_t t, rt_clock_timer_mode_t opmode) { rt_err_t result = RT_EOK; hal_sfr_t tim = RT_NULL; @@ -140,9 +140,9 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ tim[TMRxCNT] = 0; tim[TMRxPR] = t * (get_sysclk_nhz() / timer->freq) - 1; - if (opmode != HWTIMER_MODE_PERIOD) + if (opmode != CLOCK_TIMER_MODE_PERIOD) { - LOG_E("Opmode only support HWTIMER_MODE_PERIOD!"); + LOG_E("Opmode only support CLOCK_TIMER_MODE_PERIOD!"); return -RT_EINVAL; } @@ -152,7 +152,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ return result; } -static void timer_stop(rt_hwtimer_t *timer) +static void timer_stop(rt_clock_timer_t *timer) { hal_sfr_t tim = RT_NULL; @@ -167,7 +167,7 @@ static void timer_stop(rt_hwtimer_t *timer) tim[TMRxCNT] = 0; } -static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { hal_sfr_t tim = RT_NULL; rt_err_t result = RT_EOK; @@ -179,7 +179,7 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { } break; @@ -193,7 +193,7 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) return result; } -static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t timer_counter_get(rt_clock_timer_t *timer) { hal_sfr_t tim = RT_NULL; @@ -204,9 +204,9 @@ static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) return tim[TMRxCNT] / (get_sysclk_nhz() / timer->freq); } -static const struct rt_hwtimer_info _info = TIM_DEV_INFO_CONFIG; +static const struct rt_clock_timer_info _info = TIM_DEV_INFO_CONFIG; -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_ops _ops = { .init = timer_init, .start = timer_start, @@ -221,21 +221,21 @@ void timer2_4_5_isr(int vector, void *param) { rt_interrupt_enter(); #ifdef BSP_USING_TIM2 - if (ab32_hwtimer_obj[TIM2_INDEX].tim_handle[TMRxCON] != 0) { - ab32_hwtimer_obj[TIM2_INDEX].tim_handle[TMRxCPND] = BIT(9); - _rt_device_hwtimer_isr(&ab32_hwtimer_obj[TIM2_INDEX].time_device); + if (ab32_clock_timer_obj[TIM2_INDEX].tim_handle[TMRxCON] != 0) { + ab32_clock_timer_obj[TIM2_INDEX].tim_handle[TMRxCPND] = BIT(9); + _rt_clock_timer_isr(&ab32_clock_timer_obj[TIM2_INDEX].time_device); } #endif #ifdef BSP_USING_TIM4 - if (ab32_hwtimer_obj[TIM4_INDEX].tim_handle[TMRxCON] != 0) { - ab32_hwtimer_obj[TIM4_INDEX].tim_handle[TMRxCPND] = BIT(9); - _rt_device_hwtimer_isr(&ab32_hwtimer_obj[TIM4_INDEX].time_device); + if (ab32_clock_timer_obj[TIM4_INDEX].tim_handle[TMRxCON] != 0) { + ab32_clock_timer_obj[TIM4_INDEX].tim_handle[TMRxCPND] = BIT(9); + _rt_clock_timer_isr(&ab32_clock_timer_obj[TIM4_INDEX].time_device); } #endif #ifdef BSP_USING_TIM5 - if (ab32_hwtimer_obj[TIM5_INDEX].tim_handle[TMRxCON] != 0) { - ab32_hwtimer_obj[TIM5_INDEX].tim_handle[TMRxCPND] = BIT(9); - _rt_device_hwtimer_isr(&ab32_hwtimer_obj[TIM5_INDEX].time_device); + if (ab32_clock_timer_obj[TIM5_INDEX].tim_handle[TMRxCON] != 0) { + ab32_clock_timer_obj[TIM5_INDEX].tim_handle[TMRxCPND] = BIT(9); + _rt_clock_timer_isr(&ab32_clock_timer_obj[TIM5_INDEX].time_device); } #endif rt_interrupt_leave(); @@ -247,8 +247,8 @@ rt_section(".irq.timer") void timer3_isr(int vector, void *param) { rt_interrupt_enter(); - ab32_hwtimer_obj[TIM3_INDEX].tim_handle[TMRxCPND] = BIT(9); - _rt_device_hwtimer_isr(&ab32_hwtimer_obj[TIM3_INDEX].time_device); + ab32_clock_timer_obj[TIM3_INDEX].tim_handle[TMRxCPND] = BIT(9); + _rt_clock_timer_isr(&ab32_clock_timer_obj[TIM3_INDEX].time_device); rt_interrupt_leave(); } #endif @@ -258,28 +258,28 @@ rt_section(".irq.timer") void timer1_isr(int vector, void *param) { rt_interrupt_enter(); - ab32_hwtimer_obj[TIM1_INDEX].tim_handle[TMRxCPND] = BIT(9); - _rt_device_hwtimer_isr(&ab32_hwtimer_obj[TIM1_INDEX].time_device); + ab32_clock_timer_obj[TIM1_INDEX].tim_handle[TMRxCPND] = BIT(9); + _rt_clock_timer_isr(&ab32_clock_timer_obj[TIM1_INDEX].time_device); rt_interrupt_leave(); } #endif -static int ab32_hwtimer_init(void) +static int ab32_clock_timer_init(void) { int i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(ab32_hwtimer_obj) / sizeof(ab32_hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(ab32_clock_timer_obj) / sizeof(ab32_clock_timer_obj[0]); i++) { - ab32_hwtimer_obj[i].time_device.info = &_info; - ab32_hwtimer_obj[i].time_device.ops = &_ops; - if (rt_device_hwtimer_register(&ab32_hwtimer_obj[i].time_device, ab32_hwtimer_obj[i].name, (void *)ab32_hwtimer_obj[i].tim_handle) == RT_EOK) + ab32_clock_timer_obj[i].time_device.info = &_info; + ab32_clock_timer_obj[i].time_device.ops = &_ops; + if (rt_clock_timer_register(&ab32_clock_timer_obj[i].time_device, ab32_clock_timer_obj[i].name, (void *)ab32_clock_timer_obj[i].tim_handle) == RT_EOK) { - LOG_D("%s register success", ab32_hwtimer_obj[i].name); + LOG_D("%s register success", ab32_clock_timer_obj[i].name); } else { - LOG_E("%s register failed", ab32_hwtimer_obj[i].name); + LOG_E("%s register failed", ab32_clock_timer_obj[i].name); result = -RT_ERROR; } } @@ -296,7 +296,7 @@ static int ab32_hwtimer_init(void) return result; } -INIT_BOARD_EXPORT(ab32_hwtimer_init); +INIT_BOARD_EXPORT(ab32_clock_timer_init); -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ #endif /* BSP_USING_TIM */ diff --git a/bsp/bouffalo_lab/README.md b/bsp/bouffalo_lab/README.md index 2628406a66..c22fa5fabe 100755 --- a/bsp/bouffalo_lab/README.md +++ b/bsp/bouffalo_lab/README.md @@ -198,7 +198,7 @@ Windows下推荐使用[env工具][1],在console下进入bsp/bouffalo_lab/bl61x | ADC | 支持 | | | RTC | 支持 | | | WDT | 支持 | | -| HWTIMER | 支持 | | +| CLOCK_TIMER | 支持 | | | FLASH | 支持 | | | SDCARD | 支持 | | | Wi-Fi | 支持 | 仅 BL808 支持 | diff --git a/bsp/bouffalo_lab/README_en.md b/bsp/bouffalo_lab/README_en.md index bb73ed8bf7..6aa5e9bc6a 100644 --- a/bsp/bouffalo_lab/README_en.md +++ b/bsp/bouffalo_lab/README_en.md @@ -180,7 +180,7 @@ If the compilation and flashing are successful, when you reset the device, you w | ADC | Supported | | | RTC | Supported | | | WDT | Supported | | -| HWTIMER | Supported | | +| CLOCK_TIMER | Supported | | | FLASH | Supported | | | SDCARD | Supported | | diff --git a/bsp/bouffalo_lab/libraries/Kconfig b/bsp/bouffalo_lab/libraries/Kconfig index 62737d7920..c12477ca80 100755 --- a/bsp/bouffalo_lab/libraries/Kconfig +++ b/bsp/bouffalo_lab/libraries/Kconfig @@ -791,11 +791,11 @@ menu "General Drivers Configuration" default n endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_TIMER0 bool "Enable TIMER0" default n diff --git a/bsp/bouffalo_lab/libraries/rt_drivers/SConscript b/bsp/bouffalo_lab/libraries/rt_drivers/SConscript index c3b16c8dea..39396ad7a7 100755 --- a/bsp/bouffalo_lab/libraries/rt_drivers/SConscript +++ b/bsp/bouffalo_lab/libraries/rt_drivers/SConscript @@ -29,9 +29,9 @@ if GetDepend('BSP_USING_WDT'): src += ['drv_wdt.c'] src += ['sample/wdt_sample.c'] -if GetDepend('BSP_USING_HWTIMER'): - src += ['drv_hwtimer.c'] - src += ['sample/hwtimer_sample.c'] +if GetDepend('BSP_USING_CLOCK_TIMER'): + src += ['drv_timer.c'] + src += ['sample/clock_timer_sample.c'] if GetDepend('BSP_USING_SPI'): src += ['drv_spi.c'] diff --git a/bsp/bouffalo_lab/libraries/rt_drivers/drv_hwtimer.c b/bsp/bouffalo_lab/libraries/rt_drivers/drv_timer.c similarity index 66% rename from bsp/bouffalo_lab/libraries/rt_drivers/drv_hwtimer.c rename to bsp/bouffalo_lab/libraries/rt_drivers/drv_timer.c index 8256e226bd..c2ed973f69 100644 --- a/bsp/bouffalo_lab/libraries/rt_drivers/drv_hwtimer.c +++ b/bsp/bouffalo_lab/libraries/rt_drivers/drv_timer.c @@ -8,45 +8,45 @@ * 2023-04-01 wcx1024979076 first version */ -#include "drv_hwtimer.h" +#include "drv_timer.h" #include #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER #define DBG_LEVEL DBG_LOG #include -#define LOG_TAG "DRV.HWTIMER" +#define LOG_TAG "DRV.CLOCK_TIMER" typedef struct _gptimer { const char *name; - rt_hwtimer_t timer; + rt_clock_timer_t timer; struct bflb_device_s *bflb_timer; } _gptimer_t; -static void _hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t _hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode); -static void _hwtimer_stop(rt_hwtimer_t *timer); -static rt_uint32_t _hwtimer_count_get(rt_hwtimer_t *timer); -static rt_err_t _hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void _clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t _clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode); +static void _clock_timer_stop(rt_clock_timer_t *timer); +static rt_uint32_t _clock_timer_count_get(rt_clock_timer_t *timer); +static rt_err_t _clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); static void _hwtmr_isr(_gptimer_t *gptmr); -static const struct rt_hwtimer_ops _hwtimer_ops = { - .init = _hwtimer_init, - .start = _hwtimer_start, - .stop = _hwtimer_stop, - .count_get = _hwtimer_count_get, - .control = _hwtimer_control +static const struct rt_clock_timer_ops _clock_timer_ops = { + .init = _clock_timer_init, + .start = _clock_timer_start, + .stop = _clock_timer_stop, + .count_get = _clock_timer_count_get, + .control = _clock_timer_control }; -static const struct rt_hwtimer_info _hwtimer_info = { +static const struct rt_clock_timer_info _clock_timer_info = { .maxfreq = 1000000UL, .minfreq = 1000000UL, .maxcnt = 0xFFFFFFFFUL, - .cntmode = HWTIMER_MODE_PERIOD + .cntmode = CLOCK_TIMER_MODE_PERIOD }; #ifdef BSP_USING_TIMER0 @@ -84,12 +84,12 @@ static void _hwtmr_isr(_gptimer_t *timer) bool hwtmr_stat = bflb_timer_get_compint_status(timer->bflb_timer, TIMER_COMP_ID_0); if (hwtmr_stat) { - rt_device_hwtimer_isr(&timer->timer); + rt_clock_timer_isr(&timer->timer); bflb_timer_compint_clear(timer->bflb_timer, TIMER_COMP_ID_0); } } -static void _hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void _clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { _gptimer_t *_gptmr = (_gptimer_t*)timer->parent.user_data; @@ -106,12 +106,12 @@ static void _hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) bflb_timer_init(_gptmr->bflb_timer, &cfg); } -static rt_err_t _hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t _clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { _gptimer_t *_gptmr = (_gptimer_t*) timer->parent.user_data; struct bflb_timer_config_s cfg; - if(mode == HWTIMER_MODE_ONESHOT) + if(mode == CLOCK_TIMER_MODE_ONESHOT) cfg.counter_mode = TIMER_COUNTER_MODE_UP; else cfg.counter_mode = TIMER_COUNTER_MODE_PROLOAD; @@ -130,13 +130,13 @@ static rt_err_t _hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_ return RT_EOK; } -static void _hwtimer_stop(rt_hwtimer_t *timer) +static void _clock_timer_stop(rt_clock_timer_t *timer) { _gptimer_t *_gptmr = (_gptimer_t*)timer->parent.user_data; bflb_timer_stop(_gptmr->bflb_timer); } -static rt_uint32_t _hwtimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t _clock_timer_count_get(rt_clock_timer_t *timer) { _gptimer_t *_gptmr = (_gptimer_t*)timer->parent.user_data; @@ -145,22 +145,22 @@ static rt_uint32_t _hwtimer_count_get(rt_hwtimer_t *timer) return current_cnt; } -static rt_err_t _hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t _clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t err = RT_EOK; _gptimer_t *_gptmr = (_gptimer_t*) timer->parent.user_data; switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: err = -RT_ERROR; break; - case HWTIMER_CTRL_INFO_GET: - *(rt_hwtimer_t*)args = _gptmr->timer; + case CLOCK_TIMER_CTRL_INFO_GET: + *(rt_clock_timer_t*)args = _gptmr->timer; break; - case HWTIMER_CTRL_MODE_SET: + case CLOCK_TIMER_CTRL_MODE_SET: _gptmr->timer.mode = *(rt_uint32_t*)args; break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: bflb_timer_stop(_gptmr->bflb_timer); break; } @@ -169,15 +169,15 @@ static rt_err_t _hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg } -int rt_hw_hwtimer_init(void) +int rt_hw_clock_timer_init(void) { int ret = RT_EOK; for (uint32_t i = 0; i < sizeof(s_gptimers) / sizeof(s_gptimers[0]); i++) { - s_gptimers[i]->timer.info = &_hwtimer_info; - s_gptimers[i]->timer.ops = &_hwtimer_ops; + s_gptimers[i]->timer.info = &_clock_timer_info; + s_gptimers[i]->timer.ops = &_clock_timer_ops; s_gptimers[i]->bflb_timer = bflb_device_get_by_name(s_gptimers[i]->name); - ret = rt_device_hwtimer_register(&s_gptimers[i]->timer, s_gptimers[i]->name, s_gptimers[i]); + ret = rt_clock_timer_register(&s_gptimers[i]->timer, s_gptimers[i]->name, s_gptimers[i]); if (ret != RT_EOK) { LOG_E("%s register failed", s_gptimers[i]->name); @@ -195,5 +195,5 @@ int rt_hw_hwtimer_init(void) return ret; } -INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); -#endif /* BSP_USING_HWTIMER */ +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/bouffalo_lab/libraries/rt_drivers/drv_hwtimer.h b/bsp/bouffalo_lab/libraries/rt_drivers/drv_timer.h similarity index 71% rename from bsp/bouffalo_lab/libraries/rt_drivers/drv_hwtimer.h rename to bsp/bouffalo_lab/libraries/rt_drivers/drv_timer.h index 6f3cfbc7ae..05a6ec1812 100644 --- a/bsp/bouffalo_lab/libraries/rt_drivers/drv_hwtimer.h +++ b/bsp/bouffalo_lab/libraries/rt_drivers/drv_timer.h @@ -8,12 +8,12 @@ * 2023-04-01 wcx1024979076 first version */ -#ifndef DRV_HWTIMER_H -#define DRV_HWTIMER_H +#ifndef DRV_CLOCK_TIMER_H +#define DRV_CLOCK_TIMER_H #include "bflb_timer.h" #include "bflb_mtimer.h" #include "board.h" -int rt_hw_hwtimer_init(void); +int rt_hw_clock_timer_init(void); -#endif /* DRV_HWTIMER_H */ +#endif /* DRV_CLOCK_TIMER_H */ diff --git a/bsp/bouffalo_lab/libraries/rt_drivers/sample/hwtimer_sample.c b/bsp/bouffalo_lab/libraries/rt_drivers/sample/clock_timer_sample.c similarity index 65% rename from bsp/bouffalo_lab/libraries/rt_drivers/sample/hwtimer_sample.c rename to bsp/bouffalo_lab/libraries/rt_drivers/sample/clock_timer_sample.c index e2f6e3abb2..3aeaeefbca 100755 --- a/bsp/bouffalo_lab/libraries/rt_drivers/sample/hwtimer_sample.c +++ b/bsp/bouffalo_lab/libraries/rt_drivers/sample/clock_timer_sample.c @@ -8,41 +8,41 @@ * 2023-04-01 wcx1024979076 first version. */ /* - * 程序清单:这是一个 hwtimer 设备使用例程 - * 例程导出了 hwtimer_sample 命令到控制终端 - * 命令调用格式:hwtimer_sample + * 程序清单:这是一个 clock_timer 设备使用例程 + * 例程导出了 clock_timer_sample 命令到控制终端 + * 命令调用格式:clock_timer_sample * 程序功能:硬件定时器超时回调函数周期性的打印当前tick值,2次tick值之差换算为时间等同于定时时间值。 */ #include #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER -#define HWTIMER_DEV_NAME "timer0" /* 定时器名称 */ +#define CLOCK_TIMER_DEV_NAME "timer0" /* 定时器名称 */ /* 定时器超时回调函数 */ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { - rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("this is clock_timer timeout callback fucntion!\n"); rt_kprintf("tick is :%d !\n", rt_tick_get()); return 0; } -static int hwtimer_sample(int argc, char *argv[]) +static int clock_timer_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; - rt_hwtimerval_t timeout_s; /* 定时器超时值 */ + rt_clock_timerval_t timeout_s; /* 定时器超时值 */ rt_device_t hw_dev = RT_NULL; /* 定时器设备句柄 */ - rt_hwtimer_mode_t mode; /* 定时器模式 */ + rt_clock_timer_mode_t mode; /* 定时器模式 */ rt_uint32_t freq = 10000; /* 计数频率 */ /* 查找定时器设备 */ - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", CLOCK_TIMER_DEV_NAME); return -RT_ERROR; } @@ -50,7 +50,7 @@ static int hwtimer_sample(int argc, char *argv[]) ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); if (ret != RT_EOK) { - rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + rt_kprintf("open %s device failed!\n", CLOCK_TIMER_DEV_NAME); return ret; } @@ -58,10 +58,10 @@ static int hwtimer_sample(int argc, char *argv[]) rt_device_set_rx_indicate(hw_dev, timeout_cb); /* 设置计数频率(若未设置该项,默认为1Mhz 或 支持的最小计数频率) */ - rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq); - /* 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)*/ - mode = HWTIMER_MODE_PERIOD; - ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + rt_device_control(hw_dev, CLOCK_TIMER_CTRL_FREQ_SET, &freq); + /* 设置模式为周期性定时器(若未设置,默认是CLOCK_TIMER_MODE_ONESHOT)*/ + mode = CLOCK_TIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); if (ret != RT_EOK) { rt_kprintf("set mode failed! ret is :%d\n", ret); @@ -87,6 +87,6 @@ static int hwtimer_sample(int argc, char *argv[]) return ret; } /* 导出到 msh 命令列表中 */ -MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); +MSH_CMD_EXPORT(clock_timer_sample, clock_timer sample); -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ diff --git a/bsp/cvitek/c906_little/board/Kconfig b/bsp/cvitek/c906_little/board/Kconfig index 49c046748b..104648aa69 100755 --- a/bsp/cvitek/c906_little/board/Kconfig +++ b/bsp/cvitek/c906_little/board/Kconfig @@ -298,7 +298,7 @@ menu "General Drivers Configuration" menuconfig BSP_USING_TIMER bool "Enable TIMER" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIMER config BSP_USING_TIMER4 bool "Enable TIMER4" diff --git a/bsp/cvitek/cv18xx_risc-v/board/Kconfig b/bsp/cvitek/cv18xx_risc-v/board/Kconfig index f971b18e2c..d0cb78020e 100755 --- a/bsp/cvitek/cv18xx_risc-v/board/Kconfig +++ b/bsp/cvitek/cv18xx_risc-v/board/Kconfig @@ -298,7 +298,7 @@ menu "General Drivers Configuration" menuconfig BSP_USING_TIMER bool "Enable TIMER" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIMER config BSP_USING_TIMER0 bool "Enable TIMER0" diff --git a/bsp/cvitek/drivers/drv_timer.c b/bsp/cvitek/drivers/drv_timer.c index 4028b77d17..024282ad85 100644 --- a/bsp/cvitek/drivers/drv_timer.c +++ b/bsp/cvitek/drivers/drv_timer.c @@ -135,16 +135,16 @@ typedef struct _timer char *name; dw_timer_regs_t *base; rt_uint32_t irqno; - rt_hwtimer_t timer; + rt_clock_timer_t timer; }_timer_t; -static void _timer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t _timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode); -static void _timer_stop(rt_hwtimer_t *timer); -static rt_uint32_t _timer_count_get(rt_hwtimer_t *timer); -static rt_err_t _timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void _timer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t _timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode); +static void _timer_stop(rt_clock_timer_t *timer); +static rt_uint32_t _timer_count_get(rt_clock_timer_t *timer); +static rt_err_t _timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); -static const struct rt_hwtimer_ops _timer_ops = { +static const struct rt_clock_timer_ops _timer_ops = { .init = _timer_init, .start = _timer_start, .stop = _timer_stop, @@ -152,11 +152,11 @@ static const struct rt_hwtimer_ops _timer_ops = { .control = _timer_control }; -static const struct rt_hwtimer_info _timer_info = { +static const struct rt_clock_timer_info _timer_info = { .maxfreq = 25000000UL, .minfreq = 25000000UL, .maxcnt = 0xFFFFFFFF, - .cntmode = HWTIMER_MODE_PERIOD + .cntmode = CLOCK_TIMER_MODE_PERIOD }; static _timer_t _timer_obj[] = @@ -333,8 +333,8 @@ static void rt_hw_hwtmr_isr(int irqno, void *param) hal_timer_clear_irq(timer_base); hal_timer_set_disable(timer_base); - rt_device_hwtimer_isr(&_tmr->timer); - if(_tmr->timer.mode == HWTIMER_MODE_PERIOD) + rt_clock_timer_isr(&_tmr->timer); + if(_tmr->timer.mode == CLOCK_TIMER_MODE_PERIOD) { hal_timer_set_enable(timer_base); hal_timer_set_unmask(timer_base); @@ -342,7 +342,7 @@ static void rt_hw_hwtmr_isr(int irqno, void *param) } } -static void _timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void _timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { _timer_t *_tmr = rt_container_of(timer, _timer_t, timer); @@ -353,7 +353,7 @@ static void _timer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t _timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t _timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { _timer_t *_tmr = rt_container_of(timer, _timer_t, timer); uint32_t tmp_load = cnt; @@ -375,7 +375,7 @@ static rt_err_t _timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mo return RT_EOK; } -static void _timer_stop(rt_hwtimer_t *timer) +static void _timer_stop(rt_clock_timer_t *timer) { _timer_t *_tmr = rt_container_of(timer, _timer_t, timer); @@ -383,7 +383,7 @@ static void _timer_stop(rt_hwtimer_t *timer) hal_timer_set_disable(_tmr->base); } -static rt_uint32_t _timer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t _timer_count_get(rt_clock_timer_t *timer) { _timer_t *_tmr = rt_container_of(timer, _timer_t, timer); rt_uint32_t cnt = hal_timer_get_current(_tmr->base); @@ -391,23 +391,23 @@ static rt_uint32_t _timer_count_get(rt_hwtimer_t *timer) return cnt; } -static rt_err_t _timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t _timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t err = RT_EOK; _timer_t *_tmr = rt_container_of(timer, _timer_t, timer); switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: err = -RT_ERROR; break; - case HWTIMER_CTRL_INFO_GET: - *(rt_hwtimer_t*)args = _tmr->timer; + case CLOCK_TIMER_CTRL_INFO_GET: + *(rt_clock_timer_t*)args = _tmr->timer; break; - case HWTIMER_CTRL_MODE_SET: + case CLOCK_TIMER_CTRL_MODE_SET: _tmr->timer.mode = *(rt_uint32_t*)args; break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: _timer_stop(timer); break; default: @@ -428,7 +428,7 @@ int rt_hw_timer_init(void) _timer_obj[i].timer.info = &_timer_info; _timer_obj[i].timer.ops = &_timer_ops; - ret = rt_device_hwtimer_register(&_timer_obj[i].timer, _timer_obj[i].name, &_timer_obj[i]); + ret = rt_clock_timer_register(&_timer_obj[i].timer, _timer_obj[i].name, &_timer_obj[i]); if (ret != RT_EOK) { LOG_E("%s register failed", _timer_obj[i].name); diff --git a/bsp/essemi/es32f0654/drivers/ES/Kconfig b/bsp/essemi/es32f0654/drivers/ES/Kconfig index 6c8b9ba197..7780e9e477 100644 --- a/bsp/essemi/es32f0654/drivers/ES/Kconfig +++ b/bsp/essemi/es32f0654/drivers/ES/Kconfig @@ -89,50 +89,50 @@ menu "PWM Drivers" endmenu menu "HWtimer Drivers" - config BSP_USING_AD16C4T0_HWTIMER + config BSP_USING_AD16C4T0_CLOCK_TIMER bool "Register timer0" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n depends on !BSP_USING_AD16C4T0_PWM - config BSP_USING_GP16C4T0_HWTIMER + config BSP_USING_GP16C4T0_CLOCK_TIMER bool "Register timer1" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n depends on !BSP_USING_GP16C4T0_PWM - config BSP_USING_GP16C2T0_HWTIMER + config BSP_USING_GP16C2T0_CLOCK_TIMER bool "Register timer2" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n depends on !BSP_USING_GP16C2T0_PWM - config BSP_USING_GP16C2T1_HWTIMER + config BSP_USING_GP16C2T1_CLOCK_TIMER bool "Register timer3" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n depends on !BSP_USING_GP16C2T1_PWM - config BSP_USING_BS16T0_HWTIMER + config BSP_USING_BS16T0_CLOCK_TIMER bool "Register timer4" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n - config BSP_USING_BS16T1_HWTIMER + config BSP_USING_BS16T1_CLOCK_TIMER bool "Register timer5" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n depends on !BSP_USING_UART2 - config BSP_USING_BS16T2_HWTIMER + config BSP_USING_BS16T2_CLOCK_TIMER bool "Register timer6" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n depends on !BSP_USING_UART3 - config BSP_USING_BS16T3_HWTIMER + config BSP_USING_BS16T3_CLOCK_TIMER bool "Register timer7" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n endmenu diff --git a/bsp/essemi/es32vf2264/drivers/ES/es_conf_info_hwtimer.h b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_clock_timer.h similarity index 30% rename from bsp/essemi/es32vf2264/drivers/ES/es_conf_info_hwtimer.h rename to bsp/essemi/es32f0654/drivers/ES/es_conf_info_clock_timer.h index f712810bcb..c4ec5a21e4 100644 --- a/bsp/essemi/es32vf2264/drivers/ES/es_conf_info_hwtimer.h +++ b/bsp/essemi/es32f0654/drivers/ES/es_conf_info_clock_timer.h @@ -21,82 +21,82 @@ * */ -#ifndef __ES_CONF_INFO_HWTIMER_H__ -#define __ES_CONF_INFO_HWTIMER_H__ +#ifndef __ES_CONF_INFO_CLOCK_TIMER_H__ +#define __ES_CONF_INFO_CLOCK_TIMER_H__ #include #include -#define ES_C_HWTIMER_MODE_UP HWTIMER_CNTMODE_UP -#define ES_C_HWTIMER_MODE_DOWN HWTIMER_CNTMODE_DW +#define ES_C_CLOCK_TIMER_MODE_UP CLOCK_TIMER_CNTMODE_UP +#define ES_C_CLOCK_TIMER_MODE_DOWN CLOCK_TIMER_CNTMODE_DW -/* HWTIMER 配置 */ +/* CLOCK_TIMER 配置 */ /* codes_main */ -#ifndef ES_AD16C4T0_HWTIMER_MODE -#define ES_AD16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_AD16C4T0_CLOCK_TIMER_MODE +#define ES_AD16C4T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP16C4T0_HWTIMER_MODE -#define ES_GP16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP16C4T0_CLOCK_TIMER_MODE +#define ES_GP16C4T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP16C4T1_HWTIMER_MODE -#define ES_GP16C4T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP16C2T0_CLOCK_TIMER_MODE +#define ES_GP16C2T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP16C4T2_HWTIMER_MODE -#define ES_GP16C4T2_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP1624T1_CLOCK_TIMER_MODE +#define ES_GP16C2T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T0_HWTIMER_MODE -#define ES_BS16T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T0_CLOCK_TIMER_MODE +#define ES_BS16T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T1_HWTIMER_MODE -#define ES_BS16T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T1_CLOCK_TIMER_MODE +#define ES_BS16T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T2_HWTIMER_MODE -#define ES_BS16T2_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T2_CLOCK_TIMER_MODE +#define ES_BS16T2_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T3_HWTIMER_MODE -#define ES_BS16T3_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T3_CLOCK_TIMER_MODE +#define ES_BS16T3_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#define ES_AD16C4T0_HWTIMER_PRES 1 -#define ES_GP16C4T0_HWTIMER_PRES 1 -#define ES_GP16C2T0_HWTIMER_PRES 1 -#define ES_GP16C2T1_HWTIMER_PRES 1 -#define ES_BS16T0_HWTIMER_PRES 1 -#define ES_BS16T1_HWTIMER_PRES 1 -#define ES_BS16T2_HWTIMER_PRES 1 -#define ES_BS16T3_HWTIMER_PRES 1 +#define ES_AD16C4T0_CLOCK_TIMER_PRES 1 +#define ES_GP16C4T0_CLOCK_TIMER_PRES 1 +#define ES_GP16C2T0_CLOCK_TIMER_PRES 1 +#define ES_GP16C2T1_CLOCK_TIMER_PRES 1 +#define ES_BS16T0_CLOCK_TIMER_PRES 1 +#define ES_BS16T1_CLOCK_TIMER_PRES 1 +#define ES_BS16T2_CLOCK_TIMER_PRES 1 +#define ES_BS16T3_CLOCK_TIMER_PRES 1 -#ifndef ES_DEVICE_NAME_AD16C4T0_HWTIMER -#define ES_DEVICE_NAME_AD16C4T0_HWTIMER "timer0" +#ifndef ES_DEVICE_NAME_AD16C4T0_CLOCK_TIMER +#define ES_DEVICE_NAME_AD16C4T0_CLOCK_TIMER "timer0" #endif -#ifndef ES_DEVICE_NAME_GP16C4T0_HWTIMER -#define ES_DEVICE_NAME_GP16C4T0_HWTIMER "timer1" +#ifndef ES_DEVICE_NAME_GP16C4T0_CLOCK_TIMER +#define ES_DEVICE_NAME_GP16C4T0_CLOCK_TIMER "timer1" #endif -#ifndef ES_DEVICE_NAME_GP16C4T1_HWTIMER -#define ES_DEVICE_NAME_GP16C4T1_HWTIMER "timer2" +#ifndef ES_DEVICE_NAME_GP16C2T0_CLOCK_TIMER +#define ES_DEVICE_NAME_GP16C2T0_CLOCK_TIMER "timer2" #endif -#ifndef ES_DEVICE_NAME_GP16C4T2_HWTIMER -#define ES_DEVICE_NAME_GP16C4T2_HWTIMER "timer3" +#ifndef ES_DEVICE_NAME_GP16C2T1_CLOCK_TIMER +#define ES_DEVICE_NAME_GP16C2T1_CLOCK_TIMER "timer3" #endif -#ifndef ES_DEVICE_NAME_BS16T0_HWTIMER -#define ES_DEVICE_NAME_BS16T0_HWTIMER "timer4" +#ifndef ES_DEVICE_NAME_BS16T0_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T0_CLOCK_TIMER "timer4" #endif -#ifndef ES_DEVICE_NAME_BS16T1_HWTIMER -#define ES_DEVICE_NAME_BS16T1_HWTIMER "timer5" +#ifndef ES_DEVICE_NAME_BS16T1_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T1_CLOCK_TIMER "timer5" #endif -#ifndef ES_DEVICE_NAME_BS16T2_HWTIMER -#define ES_DEVICE_NAME_BS16T2_HWTIMER "timer6" +#ifndef ES_DEVICE_NAME_BS16T2_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T2_CLOCK_TIMER "timer6" #endif -#ifndef ES_DEVICE_NAME_BS16T3_HWTIMER -#define ES_DEVICE_NAME_BS16T3_HWTIMER "timer7" +#ifndef ES_DEVICE_NAME_BS16T3_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T3_CLOCK_TIMER "timer7" #endif diff --git a/bsp/essemi/es32f0654/drivers/Kconfig b/bsp/essemi/es32f0654/drivers/Kconfig index 30e2756e40..863ed91bdc 100644 --- a/bsp/essemi/es32f0654/drivers/Kconfig +++ b/bsp/essemi/es32f0654/drivers/Kconfig @@ -43,8 +43,8 @@ endif bool "BSP_USING_EXAMPLE_ADC_VOL" default n - config BSP_USING_EXAMPLE_HWTIMER - bool "BSP_USING_EXAMPLE_HWTIMER" + config BSP_USING_EXAMPLE_CLOCK_TIMER + bool "BSP_USING_EXAMPLE_CLOCK_TIMER" default n config BSP_USING_EXAMPLE_I2C diff --git a/bsp/essemi/es32f0654/drivers/SConscript b/bsp/essemi/es32f0654/drivers/SConscript index 0e34f50b2f..832f91ae8c 100644 --- a/bsp/essemi/es32f0654/drivers/SConscript +++ b/bsp/essemi/es32f0654/drivers/SConscript @@ -45,15 +45,15 @@ if GetDepend(['BSP_USING_RTC']): if GetDepend('BSP_USING_SPI_FLASH'): src += ['drv_spiflash.c'] -# add hwtimer driver code -if GetDepend('BSP_USING_AD16C4T0_HWTIMER') or GetDepend('BSP_USING_AD16C4T1_HWTIMER') or \ - GetDepend('BSP_USING_GP32C4T0_HWTIMER') or GetDepend('BSP_USING_GP32C4T1_HWTIMER') or \ - GetDepend('BSP_USING_GP16C4T0_HWTIMER') or GetDepend('BSP_USING_GP16C4T1_HWTIMER') or \ - GetDepend('BSP_USING_GP16C2T0_HWTIMER') or GetDepend('BSP_USING_GP16C2T1_HWTIMER') or \ - GetDepend('BSP_USING_GP16C4T0_HWTIMER') or GetDepend('BSP_USING_GP16C4T1_HWTIMER') or \ - GetDepend('BSP_USING_BS16T0_HWTIMER') or GetDepend('BSP_USING_BS16T1_HWTIMERIMER') or \ - GetDepend('BSP_USING_BS16T2_HWTIMER') or GetDepend('BSP_USING_BS16T3_HWTIMER'): - src += ['drv_hwtimer.c'] +# add clock_timer driver code +if GetDepend('BSP_USING_AD16C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_AD16C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP32C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP32C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP16C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP16C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP16C2T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP16C2T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP16C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP16C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_BS16T0_CLOCK_TIMER') or GetDepend('BSP_USING_BS16T1_CLOCK_TIMERIMER') or \ + GetDepend('BSP_USING_BS16T2_CLOCK_TIMER') or GetDepend('BSP_USING_BS16T3_CLOCK_TIMER'): + src += ['drv_timer.c'] # add pwm driver code if GetDepend('BSP_USING_AD16C4T0_PWM') or GetDepend('BSP_USING_AD16C4T1_PWM') or \ @@ -77,8 +77,8 @@ include_path = [cwd + '/ES'] if GetDepend('BSP_USING_EXAMPLE_ADC_VOL'): src += ['bsp_driver_example/adc_vol_sample.c'] -if GetDepend('BSP_USING_EXAMPLE_HWTIMER'): - src += ['bsp_driver_example/hwtimer_sample.c'] +if GetDepend('BSP_USING_EXAMPLE_CLOCK_TIMER'): + src += ['bsp_driver_example/clock_timer_sample.c'] if GetDepend('BSP_USING_EXAMPLE_I2C'): src += ['bsp_driver_example/i2c_sample.c'] diff --git a/bsp/essemi/es32f0654/drivers/drv_hwtimer.c b/bsp/essemi/es32f0654/drivers/drv_hwtimer.c deleted file mode 100644 index 498d6c3a46..0000000000 --- a/bsp/essemi/es32f0654/drivers/drv_hwtimer.c +++ /dev/null @@ -1,453 +0,0 @@ -/* - * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. - * - * 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. - * - * Change Logs: - * Date Author Notes - * 2019-3-19 wangyq the first version - * 2019-11-01 wangyq update libraries - * 2021-04-20 liuhy the second version - */ - -#include -#include -#include -#include -#include - - -#ifdef RT_USING_HWTIMER - -struct es32f0_hwtimer_dev -{ - rt_hwtimer_t parent; - timer_handle_t *hwtimer_periph; - IRQn_Type IRQn; -}; - -#ifdef BSP_USING_AD16C4T0_HWTIMER -static struct es32f0_hwtimer_dev ad16c4t0_hwtimer; - -static struct rt_hwtimer_info ad16c4t0_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_AD16C4T0_HWTIMER_MODE -}; - -void AD16C4T0_BRK_UP_TRIG_COM_Handler(void) -{ - ald_timer_clear_flag_status(ad16c4t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&ad16c4t0_hwtimer.parent); -} - -#endif - -#ifdef BSP_USING_GP16C4T0_HWTIMER - -static struct es32f0_hwtimer_dev gp16c4t0_hwtimer; - -static struct rt_hwtimer_info gp16c4t0_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_GP16C4T0_HWTIMER_MODE -}; - -void GP16C4T0_LCD_Handler(void) -{ - ald_timer_clear_flag_status(gp16c4t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&gp16c4t0_hwtimer.parent); -} - -#endif - -#ifdef BSP_USING_GP16C2T0_HWTIMER - -static struct es32f0_hwtimer_dev gp16c2t0_hwtimer; - -static struct rt_hwtimer_info gp16c2t0_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_GP16C2T0_HWTIMER_MODE -}; - -void GP16C2T0_Handler(void) -{ - ald_timer_clear_flag_status(gp16c2t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&gp16c2t0_hwtimer.parent); -} - -#endif - -#ifdef BSP_USING_GP16C2T1_HWTIMER - -static struct es32f0_hwtimer_dev gp16c2t1_hwtimer; - -static struct rt_hwtimer_info gp16c2t1_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_GP16C2T1_HWTIMER_MODE -}; - -void GP16C2T1_Handler(void) -{ - ald_timer_clear_flag_status(gp16c2t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&gp16c2t1_hwtimer.parent); -} - -#endif - -#ifdef BSP_USING_BS16T0_HWTIMER - -static struct es32f0_hwtimer_dev bs16t0_hwtimer; - -static struct rt_hwtimer_info bs16t0_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_BS16T0_HWTIMER_MODE -}; - -void BS16T0_Handler(void) -{ - ald_timer_clear_flag_status(bs16t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&bs16t0_hwtimer.parent); -} - -#endif - -#ifdef BSP_USING_BS16T1_HWTIMER - -static struct es32f0_hwtimer_dev bs16t1_hwtimer; - -static struct rt_hwtimer_info bs16t1_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_BS16T1_HWTIMER_MODE -}; - -void BS16T1_UART2_Handler(void) -{ - ald_timer_clear_flag_status(bs16t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&bs16t1_hwtimer.parent); -} - -#endif - -#ifdef BSP_USING_BS16T2_HWTIMER - -static struct es32f0_hwtimer_dev bs16t2_hwtimer; - -static struct rt_hwtimer_info bs16t2_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_BS16T2_HWTIMER_MODE -}; - -void BS16T2_UART3_Handler(void) -{ - ald_timer_clear_flag_status(bs16t2_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&bs16t2_hwtimer.parent); -} - -#endif - -#ifdef BSP_USING_BS16T3_HWTIMER - -static struct es32f0_hwtimer_dev bs16t3_hwtimer; - -static struct rt_hwtimer_info bs16t3_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_BS16T3_HWTIMER_MODE -}; - -void BS16T3_DAC0_Handler(void) -{ - ald_timer_clear_flag_status(bs16t3_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&bs16t3_hwtimer.parent); -} - -#endif - -static void es32f0_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) -{ - struct es32f0_hwtimer_dev *hwtimer = (struct es32f0_hwtimer_dev *)timer->parent.user_data; - - struct rt_hwtimer_info *hwtimer_info = (struct rt_hwtimer_info *)timer->info; - - - RT_ASSERT(hwtimer != RT_NULL); - - if (1 == state) - { - ald_timer_base_init(hwtimer->hwtimer_periph); - ald_timer_interrupt_config(hwtimer->hwtimer_periph, TIMER_IT_UPDATE, ENABLE); - NVIC_EnableIRQ(hwtimer->IRQn); - } - - hwtimer->parent.freq = ald_cmu_get_pclk1_clock()/((hwtimer->hwtimer_periph->perh->PRES & 0xFFFF)+1); - hwtimer_info->maxfreq = hwtimer->parent.freq; - hwtimer_info->minfreq = (hwtimer->parent.freq)/0xFFFF; -} - -static rt_err_t es32f0_hwtimer_start(rt_hwtimer_t *timer, - rt_uint32_t cnt, - rt_hwtimer_mode_t mode) -{ - struct es32f0_hwtimer_dev *hwtimer = (struct es32f0_hwtimer_dev *)timer->parent.user_data; - - RT_ASSERT(hwtimer != RT_NULL); - - WRITE_REG(hwtimer->hwtimer_periph->perh->AR, cnt); - ald_timer_base_start(hwtimer->hwtimer_periph); - - return RT_EOK; -} - -static void es32f0_hwtimer_stop(rt_hwtimer_t *timer) -{ - struct es32f0_hwtimer_dev *hwtimer = (struct es32f0_hwtimer_dev *)timer->parent.user_data; - - RT_ASSERT(hwtimer != RT_NULL); - - ald_timer_base_stop(hwtimer->hwtimer_periph); -} - -static rt_uint32_t es32f0_hwtimer_count_get(rt_hwtimer_t *timer) -{ - struct es32f0_hwtimer_dev *hwtimer = (struct es32f0_hwtimer_dev *)timer->parent.user_data; - uint32_t hwtimer_count = 0; - - RT_ASSERT(hwtimer != RT_NULL); - - hwtimer_count = READ_REG(hwtimer->hwtimer_periph->perh->COUNT); - - return hwtimer_count; -} - -static rt_err_t es32f0_hwtimer_control(rt_hwtimer_t *timer, - rt_uint32_t cmd, - void *args) -{ - rt_err_t ret = RT_EOK; - rt_uint32_t freq = 0; - struct es32f0_hwtimer_dev *hwtimer = (struct es32f0_hwtimer_dev *)timer->parent.user_data; - - RT_ASSERT(hwtimer != RT_NULL); - - switch (cmd) - { - case HWTIMER_CTRL_FREQ_SET: - freq = *(rt_uint32_t *)args; - - ret = -RT_ERROR; - - if(freq) - { - double temp,target; - temp = (double)ald_cmu_get_pclk1_clock(); - target = temp/freq; - - if(target < 0x10001) /*最大分频 = max(PRES)+1*/ - { - temp = target - (int)(target); - - if((temp > 0.998)&&(target < 0x10000)) - { - hwtimer->hwtimer_periph->perh->PRES = (uint32_t)target; - ret = RT_EOK; - } - if((temp < 0.002)&&(target >= 0x1)) - { - hwtimer->hwtimer_periph->perh->PRES = (uint32_t)target - 1; - ret = RT_EOK; - } - - } - - if(ret == RT_EOK) /*更新信息*/ - hwtimer->parent.freq = ald_cmu_get_pclk1_clock()/((hwtimer->hwtimer_periph->perh->PRES & 0xFFFF)+1); - - } - - break; - - case HWTIMER_CTRL_STOP: - ald_timer_base_stop(hwtimer->hwtimer_periph); - break; - - default: - ret = -RT_EINVAL; - break; - } - - return ret; -} - -static struct rt_hwtimer_ops es32f0_hwtimer_ops = -{ - es32f0_hwtimer_init, - es32f0_hwtimer_start, - es32f0_hwtimer_stop, - es32f0_hwtimer_count_get, - es32f0_hwtimer_control -}; - -int rt_hw_hwtimer_init(void) -{ - rt_err_t ret = RT_EOK; - -#ifdef BSP_USING_AD16C4T0_HWTIMER - static timer_handle_t ad16c4t0_hwtimer_periph; - - ad16c4t0_hwtimer_periph.perh = AD16C4T0; - ad16c4t0_hwtimer.IRQn = AD16C4T0_BRK_UP_TRIG_COM_IRQn; - - ad16c4t0_hwtimer_periph.init.prescaler = ES_AD16C4T0_HWTIMER_PRES - 1; - ad16c4t0_hwtimer_periph.init.mode = ( ES_AD16C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - ad16c4t0_hwtimer.hwtimer_periph = &ad16c4t0_hwtimer_periph; - - ad16c4t0_hwtimer.parent.info = &ad16c4t0_info; - ad16c4t0_hwtimer.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&ad16c4t0_hwtimer.parent, ES_DEVICE_NAME_AD16C4T0_HWTIMER, &ad16c4t0_hwtimer); -#endif - -#ifdef BSP_USING_GP16C4T0_HWTIMER - static timer_handle_t gp16c4t0_hwtimer_periph; - - gp16c4t0_hwtimer_periph.perh = GP16C4T0; - gp16c4t0_hwtimer.IRQn = GP16C4T0_LCD_IRQn; - - gp16c4t0_hwtimer_periph.init.prescaler = ES_GP16C4T0_HWTIMER_PRES - 1; - gp16c4t0_hwtimer_periph.init.mode = ( ES_GP16C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - gp16c4t0_hwtimer.hwtimer_periph = &gp16c4t0_hwtimer_periph; - - gp16c4t0_hwtimer.parent.info = &gp16c4t0_info; - gp16c4t0_hwtimer.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&gp16c4t0_hwtimer.parent, ES_DEVICE_NAME_GP16C4T0_HWTIMER, &gp16c4t0_hwtimer); -#endif - -#ifdef BSP_USING_GP16C2T0_HWTIMER - static timer_handle_t gp16c2t0_hwtimer_periph; - - gp16c2t0_hwtimer_periph.perh = GP16C2T0; - gp16c2t0_hwtimer.IRQn = GP16C2T0_IRQn; - - gp16c2t0_hwtimer_periph.init.prescaler = ES_GP16C2T0_HWTIMER_PRES - 1; - gp16c2t0_hwtimer_periph.init.mode = ( ES_GP16C2T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - gp16c2t0_hwtimer.hwtimer_periph = &gp16c2t0_hwtimer_periph; - - gp16c2t0_hwtimer.parent.info = &gp16c2t0_info; - gp16c2t0_hwtimer.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&gp16c2t0_hwtimer.parent, ES_DEVICE_NAME_GP16C2T0_HWTIMER, &gp16c2t0_hwtimer); -#endif - -#ifdef BSP_USING_GP16C2T1_HWTIMER - static timer_handle_t gp16c2t1_hwtimer_periph; - - gp16c2t1_hwtimer_periph.perh = GP16C2T1; - gp16c2t1_hwtimer.IRQn = GP16C2T1_IRQn; - - gp16c2t1_hwtimer_periph.init.prescaler = ES_GP16C2T1_HWTIMER_PRES - 1; - gp16c2t1_hwtimer_periph.init.mode = ( ES_GP16C2T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - gp16c2t1_hwtimer.hwtimer_periph = &gp16c2t1_hwtimer_periph; - - gp16c2t1_hwtimer.parent.info = &gp16c2t1_info; - gp16c2t1_hwtimer.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&gp16c2t1_hwtimer.parent, ES_DEVICE_NAME_GP16C2T1_HWTIMER, &gp16c2t1_hwtimer); -#endif - -#ifdef BSP_USING_BS16T0_HWTIMER - static timer_handle_t bs16t0_hwtimer_periph; - - bs16t0_hwtimer_periph.perh = BS16T0; - bs16t0_hwtimer.IRQn = BS16T0_IRQn; - - bs16t0_hwtimer_periph.init.prescaler = ES_BS16T0_HWTIMER_PRES - 1; - bs16t0_hwtimer_periph.init.mode = ( ES_BS16T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - bs16t0_hwtimer.hwtimer_periph = &bs16t0_hwtimer_periph; - - bs16t0_hwtimer.parent.info = &bs16t0_info; - bs16t0_hwtimer.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&bs16t0_hwtimer.parent, ES_DEVICE_NAME_BS16T0_HWTIMER, &bs16t0_hwtimer); -#endif - -#ifdef BSP_USING_BS16T1_HWTIMER - static timer_handle_t bs16t1_hwtimer_periph; - - bs16t1_hwtimer_periph.perh = BS16T1; - bs16t1_hwtimer.IRQn = BS16T1_UART2_IRQn; - - bs16t1_hwtimer_periph.init.prescaler = ES_BS16T1_HWTIMER_PRES - 1; - bs16t1_hwtimer_periph.init.mode = ( ES_BS16T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - bs16t1_hwtimer.hwtimer_periph = &bs16t1_hwtimer_periph; - - bs16t1_hwtimer.parent.info = &bs16t1_info; - bs16t1_hwtimer.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&bs16t1_hwtimer.parent, ES_DEVICE_NAME_BS16T1_HWTIMER, &bs16t1_hwtimer); -#endif - -#ifdef BSP_USING_BS16T2_HWTIMER - static timer_handle_t bs16t2_hwtimer_periph; - - bs16t2_hwtimer_periph.perh = BS16T2; - bs16t2_hwtimer.IRQn = BS16T2_UART3_IRQn; - - bs16t2_hwtimer_periph.init.prescaler = ES_BS16T2_HWTIMER_PRES - 1; - bs16t2_hwtimer_periph.init.mode = ( ES_BS16T2_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - bs16t2_hwtimer.hwtimer_periph = &bs16t2_hwtimer_periph; - - bs16t2_hwtimer.parent.info = &bs16t2_info; - bs16t2_hwtimer.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&bs16t2_hwtimer.parent, ES_DEVICE_NAME_BS16T2_HWTIMER, &bs16t2_hwtimer); -#endif - -#ifdef BSP_USING_BS16T3_HWTIMER - static timer_handle_t bs16t3_hwtimer_periph; - - bs16t3_hwtimer_periph.perh = BS16T3; - bs16t3_hwtimer.IRQn = BS16T3_DAC0_IRQn; - - bs16t3_hwtimer_periph.init.prescaler = ES_BS16T3_HWTIMER_PRES - 1; - bs16t3_hwtimer_periph.init.mode = ( ES_BS16T3_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - bs16t3_hwtimer.hwtimer_periph = &bs16t3_hwtimer_periph; - - bs16t3_hwtimer.parent.info = &bs16t3_info; - bs16t3_hwtimer.parent.ops = &es32f0_hwtimer_ops; - ret = rt_device_hwtimer_register(&bs16t3_hwtimer.parent, ES_DEVICE_NAME_BS16T3_HWTIMER, &bs16t3_hwtimer); -#endif - - - return ret; -} -INIT_BOARD_EXPORT(rt_hw_hwtimer_init); - -#endif diff --git a/bsp/essemi/es32f0654/drivers/drv_timer.c b/bsp/essemi/es32f0654/drivers/drv_timer.c new file mode 100644 index 0000000000..4ae26c0c78 --- /dev/null +++ b/bsp/essemi/es32f0654/drivers/drv_timer.c @@ -0,0 +1,453 @@ +/* + * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. + * + * 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. + * + * Change Logs: + * Date Author Notes + * 2019-3-19 wangyq the first version + * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version + */ + +#include +#include +#include +#include +#include + + +#ifdef RT_USING_CLOCK_TIME + +struct es32f0_clock_timer_dev +{ + rt_clock_timer_t parent; + timer_handle_t *clock_timer_periph; + IRQn_Type IRQn; +}; + +#ifdef BSP_USING_AD16C4T0_CLOCK_TIMER +static struct es32f0_clock_timer_dev ad16c4t0_clock_timer; + +static struct rt_clock_timer_info ad16c4t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_AD16C4T0_CLOCK_TIMER_MODE +}; + +void AD16C4T0_BRK_UP_TRIG_COM_Handler(void) +{ + ald_timer_clear_flag_status(ad16c4t0_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&ad16c4t0_clock_timer.parent); +} + +#endif + +#ifdef BSP_USING_GP16C4T0_CLOCK_TIMER + +static struct es32f0_clock_timer_dev gp16c4t0_clock_timer; + +static struct rt_clock_timer_info gp16c4t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_GP16C4T0_CLOCK_TIMER_MODE +}; + +void GP16C4T0_LCD_Handler(void) +{ + ald_timer_clear_flag_status(gp16c4t0_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&gp16c4t0_clock_timer.parent); +} + +#endif + +#ifdef BSP_USING_GP16C2T0_CLOCK_TIMER + +static struct es32f0_clock_timer_dev gp16c2t0_clock_timer; + +static struct rt_clock_timer_info gp16c2t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_GP16C2T0_CLOCK_TIMER_MODE +}; + +void GP16C2T0_Handler(void) +{ + ald_timer_clear_flag_status(gp16c2t0_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&gp16c2t0_clock_timer.parent); +} + +#endif + +#ifdef BSP_USING_GP16C2T1_CLOCK_TIMER + +static struct es32f0_clock_timer_dev gp16c2t1_clock_timer; + +static struct rt_clock_timer_info gp16c2t1_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_GP16C2T1_CLOCK_TIMER_MODE +}; + +void GP16C2T1_Handler(void) +{ + ald_timer_clear_flag_status(gp16c2t1_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&gp16c2t1_clock_timer.parent); +} + +#endif + +#ifdef BSP_USING_BS16T0_CLOCK_TIMER + +static struct es32f0_clock_timer_dev bs16t0_clock_timer; + +static struct rt_clock_timer_info bs16t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T0_CLOCK_TIMER_MODE +}; + +void BS16T0_Handler(void) +{ + ald_timer_clear_flag_status(bs16t0_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&bs16t0_clock_timer.parent); +} + +#endif + +#ifdef BSP_USING_BS16T1_CLOCK_TIMER + +static struct es32f0_clock_timer_dev bs16t1_clock_timer; + +static struct rt_clock_timer_info bs16t1_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T1_CLOCK_TIMER_MODE +}; + +void BS16T1_UART2_Handler(void) +{ + ald_timer_clear_flag_status(bs16t1_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&bs16t1_clock_timer.parent); +} + +#endif + +#ifdef BSP_USING_BS16T2_CLOCK_TIMER + +static struct es32f0_clock_timer_dev bs16t2_clock_timer; + +static struct rt_clock_timer_info bs16t2_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T2_CLOCK_TIMER_MODE +}; + +void BS16T2_UART3_Handler(void) +{ + ald_timer_clear_flag_status(bs16t2_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&bs16t2_clock_timer.parent); +} + +#endif + +#ifdef BSP_USING_BS16T3_CLOCK_TIMER + +static struct es32f0_clock_timer_dev bs16t3_clock_timer; + +static struct rt_clock_timer_info bs16t3_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T3_CLOCK_TIMER_MODE +}; + +void BS16T3_DAC0_Handler(void) +{ + ald_timer_clear_flag_status(bs16t3_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&bs16t3_clock_timer.parent); +} + +#endif + +static void es32f0_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) +{ + struct es32f0_clock_timer_dev *clock_timer = (struct es32f0_clock_timer_dev *)timer->parent.user_data; + + struct rt_clock_timer_info *clock_timer_info = (struct rt_clock_timer_info *)timer->info; + + + RT_ASSERT(clock_timer != RT_NULL); + + if (1 == state) + { + ald_timer_base_init(clock_timer->clock_timer_periph); + ald_timer_interrupt_config(clock_timer->clock_timer_periph, TIMER_IT_UPDATE, ENABLE); + NVIC_EnableIRQ(clock_timer->IRQn); + } + + clock_timer->parent.freq = ald_cmu_get_pclk1_clock()/((clock_timer->clock_timer_periph->perh->PRES & 0xFFFF)+1); + clock_timer_info->maxfreq = clock_timer->parent.freq; + clock_timer_info->minfreq = (clock_timer->parent.freq)/0xFFFF; +} + +static rt_err_t es32f0_clock_timer_start(rt_clock_timer_t *timer, + rt_uint32_t cnt, + rt_clock_timer_mode_t mode) +{ + struct es32f0_clock_timer_dev *clock_timer = (struct es32f0_clock_timer_dev *)timer->parent.user_data; + + RT_ASSERT(clock_timer != RT_NULL); + + WRITE_REG(clock_timer->clock_timer_periph->perh->AR, cnt); + ald_timer_base_start(clock_timer->clock_timer_periph); + + return RT_EOK; +} + +static void es32f0_clock_timer_stop(rt_clock_timer_t *timer) +{ + struct es32f0_clock_timer_dev *clock_timer = (struct es32f0_clock_timer_dev *)timer->parent.user_data; + + RT_ASSERT(clock_timer != RT_NULL); + + ald_timer_base_stop(clock_timer->clock_timer_periph); +} + +static rt_uint32_t es32f0_clock_timer_count_get(rt_clock_timer_t *timer) +{ + struct es32f0_clock_timer_dev *clock_timer = (struct es32f0_clock_timer_dev *)timer->parent.user_data; + uint32_t clock_timer_count = 0; + + RT_ASSERT(clock_timer != RT_NULL); + + clock_timer_count = READ_REG(clock_timer->clock_timer_periph->perh->COUNT); + + return clock_timer_count; +} + +static rt_err_t es32f0_clock_timer_control(rt_clock_timer_t *timer, + rt_uint32_t cmd, + void *args) +{ + rt_err_t ret = RT_EOK; + rt_uint32_t freq = 0; + struct es32f0_clock_timer_dev *clock_timer = (struct es32f0_clock_timer_dev *)timer->parent.user_data; + + RT_ASSERT(clock_timer != RT_NULL); + + switch (cmd) + { + case CLOCK_TIMER_CTRL_FREQ_SET: + freq = *(rt_uint32_t *)args; + + ret = -RT_ERROR; + + if(freq) + { + double temp,target; + temp = (double)ald_cmu_get_pclk1_clock(); + target = temp/freq; + + if(target < 0x10001) /*最大分频 = max(PRES)+1*/ + { + temp = target - (int)(target); + + if((temp > 0.998)&&(target < 0x10000)) + { + clock_timer->clock_timer_periph->perh->PRES = (uint32_t)target; + ret = RT_EOK; + } + if((temp < 0.002)&&(target >= 0x1)) + { + clock_timer->clock_timer_periph->perh->PRES = (uint32_t)target - 1; + ret = RT_EOK; + } + + } + + if(ret == RT_EOK) /*更新信息*/ + clock_timer->parent.freq = ald_cmu_get_pclk1_clock()/((clock_timer->clock_timer_periph->perh->PRES & 0xFFFF)+1); + + } + + break; + + case CLOCK_TIMER_CTRL_STOP: + ald_timer_base_stop(clock_timer->clock_timer_periph); + break; + + default: + ret = -RT_EINVAL; + break; + } + + return ret; +} + +static struct rt_clock_timer_ops es32f0_clock_timer_ops = +{ + es32f0_clock_timer_init, + es32f0_clock_timer_start, + es32f0_clock_timer_stop, + es32f0_clock_timer_count_get, + es32f0_clock_timer_control +}; + +int rt_hw_clock_timer_init(void) +{ + rt_err_t ret = RT_EOK; + +#ifdef BSP_USING_AD16C4T0_CLOCK_TIMER + static timer_handle_t ad16c4t0_clock_timer_periph; + + ad16c4t0_clock_timer_periph.perh = AD16C4T0; + ad16c4t0_clock_timer.IRQn = AD16C4T0_BRK_UP_TRIG_COM_IRQn; + + ad16c4t0_clock_timer_periph.init.prescaler = ES_AD16C4T0_CLOCK_TIMER_PRES - 1; + ad16c4t0_clock_timer_periph.init.mode = ( ES_AD16C4T0_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + ad16c4t0_clock_timer.clock_timer_periph = &ad16c4t0_clock_timer_periph; + + ad16c4t0_clock_timer.parent.info = &ad16c4t0_info; + ad16c4t0_clock_timer.parent.ops = &es32f0_clock_timer_ops; + ret = rt_clock_timer_register(&ad16c4t0_clock_timer.parent, ES_DEVICE_NAME_AD16C4T0_CLOCK_TIMER, &ad16c4t0_clock_timer); +#endif + +#ifdef BSP_USING_GP16C4T0_CLOCK_TIMER + static timer_handle_t gp16c4t0_clock_timer_periph; + + gp16c4t0_clock_timer_periph.perh = GP16C4T0; + gp16c4t0_clock_timer.IRQn = GP16C4T0_LCD_IRQn; + + gp16c4t0_clock_timer_periph.init.prescaler = ES_GP16C4T0_CLOCK_TIMER_PRES - 1; + gp16c4t0_clock_timer_periph.init.mode = ( ES_GP16C4T0_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c4t0_clock_timer.clock_timer_periph = &gp16c4t0_clock_timer_periph; + + gp16c4t0_clock_timer.parent.info = &gp16c4t0_info; + gp16c4t0_clock_timer.parent.ops = &es32f0_clock_timer_ops; + ret = rt_clock_timer_register(&gp16c4t0_clock_timer.parent, ES_DEVICE_NAME_GP16C4T0_CLOCK_TIMER, &gp16c4t0_clock_timer); +#endif + +#ifdef BSP_USING_GP16C2T0_CLOCK_TIMER + static timer_handle_t gp16c2t0_clock_timer_periph; + + gp16c2t0_clock_timer_periph.perh = GP16C2T0; + gp16c2t0_clock_timer.IRQn = GP16C2T0_IRQn; + + gp16c2t0_clock_timer_periph.init.prescaler = ES_GP16C2T0_CLOCK_TIMER_PRES - 1; + gp16c2t0_clock_timer_periph.init.mode = ( ES_GP16C2T0_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c2t0_clock_timer.clock_timer_periph = &gp16c2t0_clock_timer_periph; + + gp16c2t0_clock_timer.parent.info = &gp16c2t0_info; + gp16c2t0_clock_timer.parent.ops = &es32f0_clock_timer_ops; + ret = rt_clock_timer_register(&gp16c2t0_clock_timer.parent, ES_DEVICE_NAME_GP16C2T0_CLOCK_TIMER, &gp16c2t0_clock_timer); +#endif + +#ifdef BSP_USING_GP16C2T1_CLOCK_TIMER + static timer_handle_t gp16c2t1_clock_timer_periph; + + gp16c2t1_clock_timer_periph.perh = GP16C2T1; + gp16c2t1_clock_timer.IRQn = GP16C2T1_IRQn; + + gp16c2t1_clock_timer_periph.init.prescaler = ES_GP16C2T1_CLOCK_TIMER_PRES - 1; + gp16c2t1_clock_timer_periph.init.mode = ( ES_GP16C2T1_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c2t1_clock_timer.clock_timer_periph = &gp16c2t1_clock_timer_periph; + + gp16c2t1_clock_timer.parent.info = &gp16c2t1_info; + gp16c2t1_clock_timer.parent.ops = &es32f0_clock_timer_ops; + ret = rt_clock_timer_register(&gp16c2t1_clock_timer.parent, ES_DEVICE_NAME_GP16C2T1_CLOCK_TIMER, &gp16c2t1_clock_timer); +#endif + +#ifdef BSP_USING_BS16T0_CLOCK_TIMER + static timer_handle_t bs16t0_clock_timer_periph; + + bs16t0_clock_timer_periph.perh = BS16T0; + bs16t0_clock_timer.IRQn = BS16T0_IRQn; + + bs16t0_clock_timer_periph.init.prescaler = ES_BS16T0_CLOCK_TIMER_PRES - 1; + bs16t0_clock_timer_periph.init.mode = ( ES_BS16T0_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t0_clock_timer.clock_timer_periph = &bs16t0_clock_timer_periph; + + bs16t0_clock_timer.parent.info = &bs16t0_info; + bs16t0_clock_timer.parent.ops = &es32f0_clock_timer_ops; + ret = rt_clock_timer_register(&bs16t0_clock_timer.parent, ES_DEVICE_NAME_BS16T0_CLOCK_TIMER, &bs16t0_clock_timer); +#endif + +#ifdef BSP_USING_BS16T1_CLOCK_TIMER + static timer_handle_t bs16t1_clock_timer_periph; + + bs16t1_clock_timer_periph.perh = BS16T1; + bs16t1_clock_timer.IRQn = BS16T1_UART2_IRQn; + + bs16t1_clock_timer_periph.init.prescaler = ES_BS16T1_CLOCK_TIMER_PRES - 1; + bs16t1_clock_timer_periph.init.mode = ( ES_BS16T1_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t1_clock_timer.clock_timer_periph = &bs16t1_clock_timer_periph; + + bs16t1_clock_timer.parent.info = &bs16t1_info; + bs16t1_clock_timer.parent.ops = &es32f0_clock_timer_ops; + ret = rt_clock_timer_register(&bs16t1_clock_timer.parent, ES_DEVICE_NAME_BS16T1_CLOCK_TIMER, &bs16t1_clock_timer); +#endif + +#ifdef BSP_USING_BS16T2_CLOCK_TIMER + static timer_handle_t bs16t2_clock_timer_periph; + + bs16t2_clock_timer_periph.perh = BS16T2; + bs16t2_clock_timer.IRQn = BS16T2_UART3_IRQn; + + bs16t2_clock_timer_periph.init.prescaler = ES_BS16T2_CLOCK_TIMER_PRES - 1; + bs16t2_clock_timer_periph.init.mode = ( ES_BS16T2_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t2_clock_timer.clock_timer_periph = &bs16t2_clock_timer_periph; + + bs16t2_clock_timer.parent.info = &bs16t2_info; + bs16t2_clock_timer.parent.ops = &es32f0_clock_timer_ops; + ret = rt_clock_timer_register(&bs16t2_clock_timer.parent, ES_DEVICE_NAME_BS16T2_CLOCK_TIMER, &bs16t2_clock_timer); +#endif + +#ifdef BSP_USING_BS16T3_CLOCK_TIMER + static timer_handle_t bs16t3_clock_timer_periph; + + bs16t3_clock_timer_periph.perh = BS16T3; + bs16t3_clock_timer.IRQn = BS16T3_DAC0_IRQn; + + bs16t3_clock_timer_periph.init.prescaler = ES_BS16T3_CLOCK_TIMER_PRES - 1; + bs16t3_clock_timer_periph.init.mode = ( ES_BS16T3_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t3_clock_timer.clock_timer_periph = &bs16t3_clock_timer_periph; + + bs16t3_clock_timer.parent.info = &bs16t3_info; + bs16t3_clock_timer.parent.ops = &es32f0_clock_timer_ops; + ret = rt_clock_timer_register(&bs16t3_clock_timer.parent, ES_DEVICE_NAME_BS16T3_CLOCK_TIMER, &bs16t3_clock_timer); +#endif + + + return ret; +} +INIT_BOARD_EXPORT(rt_hw_clock_timer_init); + +#endif diff --git a/bsp/essemi/es32f365x/drivers/drv_hwtimer.h b/bsp/essemi/es32f0654/drivers/drv_timer.h similarity index 86% rename from bsp/essemi/es32f365x/drivers/drv_hwtimer.h rename to bsp/essemi/es32f0654/drivers/drv_timer.h index bbf51a4771..676ebb2358 100644 --- a/bsp/essemi/es32f365x/drivers/drv_hwtimer.h +++ b/bsp/essemi/es32f0654/drivers/drv_timer.h @@ -21,10 +21,10 @@ * 2021-04-20 liuhy the second version */ -#ifndef DRV_HWTIMER_H__ -#define DRV_HWTIMER_H__ +#ifndef DRV_CLOCK_TIMER_H__ +#define DRV_CLOCK_TIMER_H__ -#include "es_conf_info_hwtimer.h" -int rt_hw_hwtimer_init(void); +#include "es_conf_info_clock_timer.h" +int rt_hw_clock_timer_init(void); #endif diff --git a/bsp/essemi/es32f365x/drivers/ES/Kconfig b/bsp/essemi/es32f365x/drivers/ES/Kconfig index cf90fe65c7..21ff44d666 100644 --- a/bsp/essemi/es32f365x/drivers/ES/Kconfig +++ b/bsp/essemi/es32f365x/drivers/ES/Kconfig @@ -166,46 +166,46 @@ menu "RTC Drivers" endmenu -menu "HWTIMER Drivers" +menu "CLOCK_TIMER Drivers" - config BSP_USING_AD16C4T0_HWTIMER - bool "Register HWTIMER0 " - select RT_USING_HWTIMER + config BSP_USING_AD16C4T0_CLOCK_TIMER + bool "Register CLOCK_TIMER0 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_AD16C4T1_HWTIMER - bool "Register HWTIMER1 " - select RT_USING_HWTIMER + config BSP_USING_AD16C4T1_CLOCK_TIMER + bool "Register CLOCK_TIMER1 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_GP32C4T0_HWTIMER - bool "Register HWTIMER2 " - select RT_USING_HWTIMER + config BSP_USING_GP32C4T0_CLOCK_TIMER + bool "Register CLOCK_TIMER2 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_GP32C4T1_HWTIMER - bool "Register HWTIMER3 " - select RT_USING_HWTIMER + config BSP_USING_GP32C4T1_CLOCK_TIMER + bool "Register CLOCK_TIMER3 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_GP16C4T0_HWTIMER - bool "Register HWTIMER4 " - select RT_USING_HWTIMER + config BSP_USING_GP16C4T0_CLOCK_TIMER + bool "Register CLOCK_TIMER4 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_GP16C4T1_HWTIMER - bool "Register HWTIMER5 " - select RT_USING_HWTIMER + config BSP_USING_GP16C4T1_CLOCK_TIMER + bool "Register CLOCK_TIMER5 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_BS16T0_HWTIMER - bool "Register HWTIMER6 " - select RT_USING_HWTIMER + config BSP_USING_BS16T0_CLOCK_TIMER + bool "Register CLOCK_TIMER6 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_BS16T1_HWTIMER - bool "Register HWTIMER7 " - select RT_USING_HWTIMER + config BSP_USING_BS16T1_CLOCK_TIMER + bool "Register CLOCK_TIMER7 " + select RT_USING_CLOCK_TIME default n endmenu @@ -216,37 +216,37 @@ menu "PWM Drivers" bool "Register PWM0 " select RT_USING_PWM default n - depends on !BSP_USING_AD16C4T0_HWTIMER + depends on !BSP_USING_AD16C4T0_CLOCK_TIMER config BSP_USING_AD16C4T1_PWM bool "Register PWM1 " select RT_USING_PWM default n - depends on !BSP_USING_AD16C4T1_HWTIMER + depends on !BSP_USING_AD16C4T1_CLOCK_TIMER config BSP_USING_GP32C4T0_PWM bool "Register PWM2 " select RT_USING_PWM default n - depends on !BSP_USING_GP32C4T0_HWTIMER + depends on !BSP_USING_GP32C4T0_CLOCK_TIMER config BSP_USING_GP32C4T1_PWM bool "Register PWM3 " select RT_USING_PWM default n - depends on !BSP_USING_GP32C4T1_HWTIMER + depends on !BSP_USING_GP32C4T1_CLOCK_TIMER config BSP_USING_GP16C4T0_PWM bool "Register PWM4 " select RT_USING_PWM default n - depends on !BSP_USING_GP16C4T0_HWTIMER + depends on !BSP_USING_GP16C4T0_CLOCK_TIMER config BSP_USING_GP16C4T1_PWM bool "Register PWM5 " select RT_USING_PWM default n - depends on !BSP_USING_GP16C4T1_HWTIMER + depends on !BSP_USING_GP16C4T1_CLOCK_TIMER endmenu diff --git a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_hwtimer.h b/bsp/essemi/es32f365x/drivers/ES/es_conf_info_clock_timer.h similarity index 30% rename from bsp/essemi/es32f369x/drivers/ES/es_conf_info_hwtimer.h rename to bsp/essemi/es32f365x/drivers/ES/es_conf_info_clock_timer.h index 18f2ff8aa0..369875a0d6 100644 --- a/bsp/essemi/es32f369x/drivers/ES/es_conf_info_hwtimer.h +++ b/bsp/essemi/es32f365x/drivers/ES/es_conf_info_clock_timer.h @@ -21,81 +21,81 @@ * */ -#ifndef __ES_CONF_INFO_HWTIMER_H__ -#define __ES_CONF_INFO_HWTIMER_H__ +#ifndef __ES_CONF_INFO_CLOCK_TIMER_H__ +#define __ES_CONF_INFO_CLOCK_TIMER_H__ #include #include -#define ES_C_HWTIMER_MODE_UP HWTIMER_CNTMODE_UP -#define ES_C_HWTIMER_MODE_DOWN HWTIMER_CNTMODE_DW +#define ES_C_CLOCK_TIMER_MODE_UP CLOCK_TIMER_CNTMODE_UP +#define ES_C_CLOCK_TIMER_MODE_DOWN CLOCK_TIMER_CNTMODE_DW -/* HWTIMER 配置 */ +/* CLOCK_TIMER 配置 */ /* codes_main */ -#ifndef ES_AD16C4T0_HWTIMER_MODE -#define ES_AD16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_AD16C4T0_CLOCK_TIMER_MODE +#define ES_AD16C4T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_AD16C4T1_HWTIMER_MODE -#define ES_AD16C4T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_AD16C4T1_CLOCK_TIMER_MODE +#define ES_AD16C4T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP32C4T0_HWTIMER_MODE -#define ES_GP32C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP32C4T0_CLOCK_TIMER_MODE +#define ES_GP32C4T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP32C4T1_HWTIMER_MODE -#define ES_GP32C4T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP32C4T1_CLOCK_TIMER_MODE +#define ES_GP32C4T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP16C4T0_HWTIMER_MODE -#define ES_GP16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP16C4T0_CLOCK_TIMER_MODE +#define ES_GP16C4T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP16C4T1_HWTIMER_MODE -#define ES_GP16C4T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP16C4T1_CLOCK_TIMER_MODE +#define ES_GP16C4T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T0_HWTIMER_MODE -#define ES_BS16T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T0_CLOCK_TIMER_MODE +#define ES_BS16T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T1_HWTIMER_MODE -#define ES_BS16T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T1_CLOCK_TIMER_MODE +#define ES_BS16T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#define ES_AD16C4T0_HWTIMER_PRES 1 -#define ES_AD16C4T1_HWTIMER_PRES 1 -#define ES_GP16C4T0_HWTIMER_PRES 1 -#define ES_GP16C4T1_HWTIMER_PRES 1 -#define ES_GP32C4T0_HWTIMER_PRES 1 -#define ES_GP32C4T1_HWTIMER_PRES 1 -#define ES_BS16T0_HWTIMER_PRES 1 -#define ES_BS16T1_HWTIMER_PRES 1 +#define ES_AD16C4T0_CLOCK_TIMER_PRES 1 +#define ES_AD16C4T1_CLOCK_TIMER_PRES 1 +#define ES_GP16C4T0_CLOCK_TIMER_PRES 1 +#define ES_GP16C4T1_CLOCK_TIMER_PRES 1 +#define ES_GP32C4T0_CLOCK_TIMER_PRES 1 +#define ES_GP32C4T1_CLOCK_TIMER_PRES 1 +#define ES_BS16T0_CLOCK_TIMER_PRES 1 +#define ES_BS16T1_CLOCK_TIMER_PRES 1 -#ifndef ES_DEVICE_NAME_AD16C4T0_HWTIMER -#define ES_DEVICE_NAME_AD16C4T0_HWTIMER "timer0" +#ifndef ES_DEVICE_NAME_AD16C4T0_CLOCK_TIMER +#define ES_DEVICE_NAME_AD16C4T0_CLOCK_TIMER "timer0" #endif -#ifndef ES_DEVICE_NAME_AD16C4T1_HWTIMER -#define ES_DEVICE_NAME_AD16C4T1_HWTIMER "timer1" +#ifndef ES_DEVICE_NAME_AD16C4T1_CLOCK_TIMER +#define ES_DEVICE_NAME_AD16C4T1_CLOCK_TIMER "timer1" #endif -#ifndef ES_DEVICE_NAME_GP32C4T0_HWTIMER -#define ES_DEVICE_NAME_GP32C4T0_HWTIMER "timer2" +#ifndef ES_DEVICE_NAME_GP32C4T0_CLOCK_TIMER +#define ES_DEVICE_NAME_GP32C4T0_CLOCK_TIMER "timer2" #endif -#ifndef ES_DEVICE_NAME_GP32C4T1_HWTIMER -#define ES_DEVICE_NAME_GP32C4T1_HWTIMER "timer3" +#ifndef ES_DEVICE_NAME_GP32C4T1_CLOCK_TIMER +#define ES_DEVICE_NAME_GP32C4T1_CLOCK_TIMER "timer3" #endif -#ifndef ES_DEVICE_NAME_GP16C4T0_HWTIMER -#define ES_DEVICE_NAME_GP16C4T0_HWTIMER "timer4" +#ifndef ES_DEVICE_NAME_GP16C4T0_CLOCK_TIMER +#define ES_DEVICE_NAME_GP16C4T0_CLOCK_TIMER "timer4" #endif -#ifndef ES_DEVICE_NAME_GP16C4T1_HWTIMER -#define ES_DEVICE_NAME_GP16C4T1_HWTIMER "timer5" +#ifndef ES_DEVICE_NAME_GP16C4T1_CLOCK_TIMER +#define ES_DEVICE_NAME_GP16C4T1_CLOCK_TIMER "timer5" #endif -#ifndef ES_DEVICE_NAME_BS16T0_HWTIMER -#define ES_DEVICE_NAME_BS16T0_HWTIMER "timer6" +#ifndef ES_DEVICE_NAME_BS16T0_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T0_CLOCK_TIMER "timer6" #endif -#ifndef ES_DEVICE_NAME_BS16T1_HWTIMER -#define ES_DEVICE_NAME_BS16T1_HWTIMER "timer7" +#ifndef ES_DEVICE_NAME_BS16T1_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T1_CLOCK_TIMER "timer7" #endif diff --git a/bsp/essemi/es32f365x/drivers/Kconfig b/bsp/essemi/es32f365x/drivers/Kconfig index 81ef72b911..ad4ad5968d 100644 --- a/bsp/essemi/es32f365x/drivers/Kconfig +++ b/bsp/essemi/es32f365x/drivers/Kconfig @@ -45,8 +45,8 @@ endif bool "BSP_USING_EXAMPLE_ADC_VOL" default n - config BSP_USING_EXAMPLE_HWTIMER - bool "BSP_USING_EXAMPLE_HWTIMER" + config BSP_USING_EXAMPLE_CLOCK_TIMER + bool "BSP_USING_EXAMPLE_CLOCK_TIMER" default n config BSP_USING_EXAMPLE_I2C diff --git a/bsp/essemi/es32f365x/drivers/SConscript b/bsp/essemi/es32f365x/drivers/SConscript index 9b38fc3661..843e04de67 100644 --- a/bsp/essemi/es32f365x/drivers/SConscript +++ b/bsp/essemi/es32f365x/drivers/SConscript @@ -48,12 +48,12 @@ if GetDepend(['BSP_USING_RTC']): if GetDepend('BSP_USING_SPI_FLASH'): src += [ES32F36XX_DRV_ROOT+'/drv_spiflash.c'] -# add hwtimer driver code -if GetDepend('BSP_USING_AD16C4T0_HWTIMER') or GetDepend('BSP_USING_AD16C4T1_HWTIMER') or \ - GetDepend('BSP_USING_GP32C4T0_HWTIMER') or GetDepend('BSP_USING_GP32C4T1_HWTIMER') or \ - GetDepend('BSP_USING_GP16C4T0_HWTIMER') or GetDepend('BSP_USING_GP16C4T1_HWTIMER') or \ - GetDepend('BSP_USING_BS16T0_HWTIMER') or GetDepend('BSP_USING_BS16T1_HWTIMER'): - src += [ES32F36XX_DRV_ROOT+'/drv_hwtimer.c'] +# add clock_timer driver code +if GetDepend('BSP_USING_AD16C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_AD16C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP32C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP32C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP16C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP16C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_BS16T0_CLOCK_TIMER') or GetDepend('BSP_USING_BS16T1_CLOCK_TIMER'): + src += [ES32F36XX_DRV_ROOT+'/drv_timer.c'] # add pwm driver code if GetDepend('BSP_USING_AD16C4T0_PWM') or GetDepend('BSP_USING_AD16C4T1_PWM') or \ @@ -76,8 +76,8 @@ include_path = [cwd + '/ES'] if GetDepend('BSP_USING_EXAMPLE_ADC_VOL'): src += [ES32F36XX_DRV_ROOT+'/bsp_driver_example/adc_vol_sample.c'] -if GetDepend('BSP_USING_EXAMPLE_HWTIMER'): - src += [ES32F36XX_DRV_ROOT+'/bsp_driver_example/hwtimer_sample.c'] +if GetDepend('BSP_USING_EXAMPLE_CLOCK_TIMER'): + src += [ES32F36XX_DRV_ROOT+'/bsp_driver_example/clock_timer_sample.c'] if GetDepend('BSP_USING_EXAMPLE_I2C'): src += [ES32F36XX_DRV_ROOT+'/bsp_driver_example/i2c_sample.c'] diff --git a/bsp/essemi/es32f369x/drivers/drv_hwtimer.h b/bsp/essemi/es32f365x/drivers/drv_timer.h similarity index 86% rename from bsp/essemi/es32f369x/drivers/drv_hwtimer.h rename to bsp/essemi/es32f365x/drivers/drv_timer.h index bbf51a4771..676ebb2358 100644 --- a/bsp/essemi/es32f369x/drivers/drv_hwtimer.h +++ b/bsp/essemi/es32f365x/drivers/drv_timer.h @@ -21,10 +21,10 @@ * 2021-04-20 liuhy the second version */ -#ifndef DRV_HWTIMER_H__ -#define DRV_HWTIMER_H__ +#ifndef DRV_CLOCK_TIMER_H__ +#define DRV_CLOCK_TIMER_H__ -#include "es_conf_info_hwtimer.h" -int rt_hw_hwtimer_init(void); +#include "es_conf_info_clock_timer.h" +int rt_hw_clock_timer_init(void); #endif diff --git a/bsp/essemi/es32f369x/drivers/ES/Kconfig b/bsp/essemi/es32f369x/drivers/ES/Kconfig index cf90fe65c7..21ff44d666 100644 --- a/bsp/essemi/es32f369x/drivers/ES/Kconfig +++ b/bsp/essemi/es32f369x/drivers/ES/Kconfig @@ -166,46 +166,46 @@ menu "RTC Drivers" endmenu -menu "HWTIMER Drivers" +menu "CLOCK_TIMER Drivers" - config BSP_USING_AD16C4T0_HWTIMER - bool "Register HWTIMER0 " - select RT_USING_HWTIMER + config BSP_USING_AD16C4T0_CLOCK_TIMER + bool "Register CLOCK_TIMER0 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_AD16C4T1_HWTIMER - bool "Register HWTIMER1 " - select RT_USING_HWTIMER + config BSP_USING_AD16C4T1_CLOCK_TIMER + bool "Register CLOCK_TIMER1 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_GP32C4T0_HWTIMER - bool "Register HWTIMER2 " - select RT_USING_HWTIMER + config BSP_USING_GP32C4T0_CLOCK_TIMER + bool "Register CLOCK_TIMER2 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_GP32C4T1_HWTIMER - bool "Register HWTIMER3 " - select RT_USING_HWTIMER + config BSP_USING_GP32C4T1_CLOCK_TIMER + bool "Register CLOCK_TIMER3 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_GP16C4T0_HWTIMER - bool "Register HWTIMER4 " - select RT_USING_HWTIMER + config BSP_USING_GP16C4T0_CLOCK_TIMER + bool "Register CLOCK_TIMER4 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_GP16C4T1_HWTIMER - bool "Register HWTIMER5 " - select RT_USING_HWTIMER + config BSP_USING_GP16C4T1_CLOCK_TIMER + bool "Register CLOCK_TIMER5 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_BS16T0_HWTIMER - bool "Register HWTIMER6 " - select RT_USING_HWTIMER + config BSP_USING_BS16T0_CLOCK_TIMER + bool "Register CLOCK_TIMER6 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_BS16T1_HWTIMER - bool "Register HWTIMER7 " - select RT_USING_HWTIMER + config BSP_USING_BS16T1_CLOCK_TIMER + bool "Register CLOCK_TIMER7 " + select RT_USING_CLOCK_TIME default n endmenu @@ -216,37 +216,37 @@ menu "PWM Drivers" bool "Register PWM0 " select RT_USING_PWM default n - depends on !BSP_USING_AD16C4T0_HWTIMER + depends on !BSP_USING_AD16C4T0_CLOCK_TIMER config BSP_USING_AD16C4T1_PWM bool "Register PWM1 " select RT_USING_PWM default n - depends on !BSP_USING_AD16C4T1_HWTIMER + depends on !BSP_USING_AD16C4T1_CLOCK_TIMER config BSP_USING_GP32C4T0_PWM bool "Register PWM2 " select RT_USING_PWM default n - depends on !BSP_USING_GP32C4T0_HWTIMER + depends on !BSP_USING_GP32C4T0_CLOCK_TIMER config BSP_USING_GP32C4T1_PWM bool "Register PWM3 " select RT_USING_PWM default n - depends on !BSP_USING_GP32C4T1_HWTIMER + depends on !BSP_USING_GP32C4T1_CLOCK_TIMER config BSP_USING_GP16C4T0_PWM bool "Register PWM4 " select RT_USING_PWM default n - depends on !BSP_USING_GP16C4T0_HWTIMER + depends on !BSP_USING_GP16C4T0_CLOCK_TIMER config BSP_USING_GP16C4T1_PWM bool "Register PWM5 " select RT_USING_PWM default n - depends on !BSP_USING_GP16C4T1_HWTIMER + depends on !BSP_USING_GP16C4T1_CLOCK_TIMER endmenu diff --git a/bsp/essemi/es32f365x/drivers/ES/es_conf_info_hwtimer.h b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_clock_timer.h similarity index 30% rename from bsp/essemi/es32f365x/drivers/ES/es_conf_info_hwtimer.h rename to bsp/essemi/es32f369x/drivers/ES/es_conf_info_clock_timer.h index 18f2ff8aa0..369875a0d6 100644 --- a/bsp/essemi/es32f365x/drivers/ES/es_conf_info_hwtimer.h +++ b/bsp/essemi/es32f369x/drivers/ES/es_conf_info_clock_timer.h @@ -21,81 +21,81 @@ * */ -#ifndef __ES_CONF_INFO_HWTIMER_H__ -#define __ES_CONF_INFO_HWTIMER_H__ +#ifndef __ES_CONF_INFO_CLOCK_TIMER_H__ +#define __ES_CONF_INFO_CLOCK_TIMER_H__ #include #include -#define ES_C_HWTIMER_MODE_UP HWTIMER_CNTMODE_UP -#define ES_C_HWTIMER_MODE_DOWN HWTIMER_CNTMODE_DW +#define ES_C_CLOCK_TIMER_MODE_UP CLOCK_TIMER_CNTMODE_UP +#define ES_C_CLOCK_TIMER_MODE_DOWN CLOCK_TIMER_CNTMODE_DW -/* HWTIMER 配置 */ +/* CLOCK_TIMER 配置 */ /* codes_main */ -#ifndef ES_AD16C4T0_HWTIMER_MODE -#define ES_AD16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_AD16C4T0_CLOCK_TIMER_MODE +#define ES_AD16C4T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_AD16C4T1_HWTIMER_MODE -#define ES_AD16C4T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_AD16C4T1_CLOCK_TIMER_MODE +#define ES_AD16C4T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP32C4T0_HWTIMER_MODE -#define ES_GP32C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP32C4T0_CLOCK_TIMER_MODE +#define ES_GP32C4T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP32C4T1_HWTIMER_MODE -#define ES_GP32C4T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP32C4T1_CLOCK_TIMER_MODE +#define ES_GP32C4T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP16C4T0_HWTIMER_MODE -#define ES_GP16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP16C4T0_CLOCK_TIMER_MODE +#define ES_GP16C4T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP16C4T1_HWTIMER_MODE -#define ES_GP16C4T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP16C4T1_CLOCK_TIMER_MODE +#define ES_GP16C4T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T0_HWTIMER_MODE -#define ES_BS16T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T0_CLOCK_TIMER_MODE +#define ES_BS16T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T1_HWTIMER_MODE -#define ES_BS16T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T1_CLOCK_TIMER_MODE +#define ES_BS16T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#define ES_AD16C4T0_HWTIMER_PRES 1 -#define ES_AD16C4T1_HWTIMER_PRES 1 -#define ES_GP16C4T0_HWTIMER_PRES 1 -#define ES_GP16C4T1_HWTIMER_PRES 1 -#define ES_GP32C4T0_HWTIMER_PRES 1 -#define ES_GP32C4T1_HWTIMER_PRES 1 -#define ES_BS16T0_HWTIMER_PRES 1 -#define ES_BS16T1_HWTIMER_PRES 1 +#define ES_AD16C4T0_CLOCK_TIMER_PRES 1 +#define ES_AD16C4T1_CLOCK_TIMER_PRES 1 +#define ES_GP16C4T0_CLOCK_TIMER_PRES 1 +#define ES_GP16C4T1_CLOCK_TIMER_PRES 1 +#define ES_GP32C4T0_CLOCK_TIMER_PRES 1 +#define ES_GP32C4T1_CLOCK_TIMER_PRES 1 +#define ES_BS16T0_CLOCK_TIMER_PRES 1 +#define ES_BS16T1_CLOCK_TIMER_PRES 1 -#ifndef ES_DEVICE_NAME_AD16C4T0_HWTIMER -#define ES_DEVICE_NAME_AD16C4T0_HWTIMER "timer0" +#ifndef ES_DEVICE_NAME_AD16C4T0_CLOCK_TIMER +#define ES_DEVICE_NAME_AD16C4T0_CLOCK_TIMER "timer0" #endif -#ifndef ES_DEVICE_NAME_AD16C4T1_HWTIMER -#define ES_DEVICE_NAME_AD16C4T1_HWTIMER "timer1" +#ifndef ES_DEVICE_NAME_AD16C4T1_CLOCK_TIMER +#define ES_DEVICE_NAME_AD16C4T1_CLOCK_TIMER "timer1" #endif -#ifndef ES_DEVICE_NAME_GP32C4T0_HWTIMER -#define ES_DEVICE_NAME_GP32C4T0_HWTIMER "timer2" +#ifndef ES_DEVICE_NAME_GP32C4T0_CLOCK_TIMER +#define ES_DEVICE_NAME_GP32C4T0_CLOCK_TIMER "timer2" #endif -#ifndef ES_DEVICE_NAME_GP32C4T1_HWTIMER -#define ES_DEVICE_NAME_GP32C4T1_HWTIMER "timer3" +#ifndef ES_DEVICE_NAME_GP32C4T1_CLOCK_TIMER +#define ES_DEVICE_NAME_GP32C4T1_CLOCK_TIMER "timer3" #endif -#ifndef ES_DEVICE_NAME_GP16C4T0_HWTIMER -#define ES_DEVICE_NAME_GP16C4T0_HWTIMER "timer4" +#ifndef ES_DEVICE_NAME_GP16C4T0_CLOCK_TIMER +#define ES_DEVICE_NAME_GP16C4T0_CLOCK_TIMER "timer4" #endif -#ifndef ES_DEVICE_NAME_GP16C4T1_HWTIMER -#define ES_DEVICE_NAME_GP16C4T1_HWTIMER "timer5" +#ifndef ES_DEVICE_NAME_GP16C4T1_CLOCK_TIMER +#define ES_DEVICE_NAME_GP16C4T1_CLOCK_TIMER "timer5" #endif -#ifndef ES_DEVICE_NAME_BS16T0_HWTIMER -#define ES_DEVICE_NAME_BS16T0_HWTIMER "timer6" +#ifndef ES_DEVICE_NAME_BS16T0_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T0_CLOCK_TIMER "timer6" #endif -#ifndef ES_DEVICE_NAME_BS16T1_HWTIMER -#define ES_DEVICE_NAME_BS16T1_HWTIMER "timer7" +#ifndef ES_DEVICE_NAME_BS16T1_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T1_CLOCK_TIMER "timer7" #endif diff --git a/bsp/essemi/es32f369x/drivers/Kconfig b/bsp/essemi/es32f369x/drivers/Kconfig index 8eade9ab28..c25b38fab1 100644 --- a/bsp/essemi/es32f369x/drivers/Kconfig +++ b/bsp/essemi/es32f369x/drivers/Kconfig @@ -57,8 +57,8 @@ endif bool "BSP_USING_EXAMPLE_ADC_VOL" default n - config BSP_USING_EXAMPLE_HWTIMER - bool "BSP_USING_EXAMPLE_HWTIMER" + config BSP_USING_EXAMPLE_CLOCK_TIMER + bool "BSP_USING_EXAMPLE_CLOCK_TIMER" default n config BSP_USING_EXAMPLE_I2C diff --git a/bsp/essemi/es32f369x/drivers/SConscript b/bsp/essemi/es32f369x/drivers/SConscript index 950f8c70e9..369c09ad66 100644 --- a/bsp/essemi/es32f369x/drivers/SConscript +++ b/bsp/essemi/es32f369x/drivers/SConscript @@ -44,12 +44,12 @@ if GetDepend(['BSP_USING_RTC']): if GetDepend('BSP_USING_SPI_FLASH'): src += ['drv_spiflash.c'] -# add hwtimer driver code -if GetDepend('BSP_USING_AD16C4T0_HWTIMER') or GetDepend('BSP_USING_AD16C4T1_HWTIMER') or \ - GetDepend('BSP_USING_GP32C4T0_HWTIMER') or GetDepend('BSP_USING_GP32C4T1_HWTIMER') or \ - GetDepend('BSP_USING_GP16C4T0_HWTIMER') or GetDepend('BSP_USING_GP16C4T1_HWTIMER') or \ - GetDepend('BSP_USING_BS16T0_HWTIMER') or GetDepend('BSP_USING_BS16T1_HWTIMER'): - src += ['drv_hwtimer.c'] +# add clock_timer driver code +if GetDepend('BSP_USING_AD16C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_AD16C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP32C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP32C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP16C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP16C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_BS16T0_CLOCK_TIMER') or GetDepend('BSP_USING_BS16T1_CLOCK_TIMER'): + src += ['drv_timer.c'] # add pwm driver code if GetDepend('BSP_USING_AD16C4T0_PWM') or GetDepend('BSP_USING_AD16C4T1_PWM') or \ @@ -72,8 +72,8 @@ include_path = [cwd + '/ES'] if GetDepend('BSP_USING_EXAMPLE_ADC_VOL'): src += ['bsp_driver_example/adc_vol_sample.c'] -if GetDepend('BSP_USING_EXAMPLE_HWTIMER'): - src += ['bsp_driver_example/hwtimer_sample.c'] +if GetDepend('BSP_USING_EXAMPLE_CLOCK_TIMER'): + src += ['bsp_driver_example/clock_timer_sample.c'] if GetDepend('BSP_USING_EXAMPLE_I2C'): src += ['bsp_driver_example/i2c_sample.c'] diff --git a/bsp/essemi/es32f369x/drivers/drv_hwtimer.c b/bsp/essemi/es32f369x/drivers/drv_hwtimer.c deleted file mode 100644 index 5b26407252..0000000000 --- a/bsp/essemi/es32f369x/drivers/drv_hwtimer.c +++ /dev/null @@ -1,448 +0,0 @@ -/* - * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. - * - * 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. - * - * Change Logs: - * Date Author Notes - * 2019-3-19 wangyq the first version - * 2019-11-01 wangyq update libraries - * 2021-04-20 liuhy the second version - */ - -#include -#include -#include -#include -#include - - -#ifdef RT_USING_HWTIMER - -struct es32f3_hwtimer_dev -{ - rt_hwtimer_t parent; - timer_handle_t *hwtimer_periph; - IRQn_Type IRQn; -}; - -#ifdef BSP_USING_AD16C4T0_HWTIMER -static struct es32f3_hwtimer_dev ad16c4t0_hwtimer; - -static struct rt_hwtimer_info ad16c4t0_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_AD16C4T0_HWTIMER_MODE -}; - -void AD16C4T0_UP_Handler(void) -{ - ald_timer_clear_flag_status(ad16c4t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&ad16c4t0_hwtimer.parent); -} - -#endif - -#ifdef BSP_USING_AD16C4T1_HWTIMER - -static struct es32f3_hwtimer_dev ad16c4t1_hwtimer; - -static struct rt_hwtimer_info ad16c4t1_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_AD16C4T1_HWTIMER_MODE -}; - -void AD16C4T1_UP_Handler(void) -{ - ald_timer_clear_flag_status(ad16c4t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&ad16c4t1_hwtimer.parent); -} - -#endif -#ifdef BSP_USING_GP32C4T0_HWTIMER - -static struct es32f3_hwtimer_dev gp32c4t0_hwtimer; - -static struct rt_hwtimer_info gp32c4t0_info = -{ - - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV , /* maximum count frequency */ - ( ES_SYS_CLK >> ES_CMU_PCLK_1_DIV )/(1U<<16), /* minimum count frequency */ - 0xFFFFFFFF, /* counter maximum value */ - ES_GP32C4T0_HWTIMER_MODE -}; - -void GP32C4T0_Handler(void) -{ - ald_timer_clear_flag_status(gp32c4t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&gp32c4t0_hwtimer.parent); -} - -#endif -#ifdef BSP_USING_GP32C4T1_HWTIMER - -static struct es32f3_hwtimer_dev gp32c4t1_hwtimer; - -static struct rt_hwtimer_info gp32c4t1_info = -{ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV ), /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV )/(1U<<16), /* minimum count frequency */ - 0xFFFFFFFF, /* counter maximum value */ - ES_GP32C4T1_HWTIMER_MODE -}; - -void GP32C4T1_Handler(void) -{ - ald_timer_clear_flag_status(gp32c4t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&gp32c4t1_hwtimer.parent); -} - -#endif -#ifdef BSP_USING_GP16C4T0_HWTIMER - -static struct es32f3_hwtimer_dev gp16c4t0_hwtimer; - -static struct rt_hwtimer_info gp16c4t0_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_GP16C4T0_HWTIMER_MODE -}; - -void GP16C4T0_Handler(void) -{ - ald_timer_clear_flag_status(gp16c4t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&gp16c4t0_hwtimer.parent); -} - -#endif -#ifdef BSP_USING_GP16C4T1_HWTIMER - -static struct es32f3_hwtimer_dev gp16c4t1_hwtimer; - -static struct rt_hwtimer_info gp16c4t1_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_GP16C4T1_HWTIMER_MODE -}; - -void GP16C4T1_Handler(void) -{ - ald_timer_clear_flag_status(gp16c4t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&gp16c4t1_hwtimer.parent); -} - -#endif -#ifdef BSP_USING_BS16T0_HWTIMER - -static struct es32f3_hwtimer_dev bs16t0_hwtimer; - -static struct rt_hwtimer_info bs16t0_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_BS16T0_HWTIMER_MODE -}; - -void BS16T0_Handler(void) -{ - ald_timer_clear_flag_status(bs16t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&bs16t0_hwtimer.parent); -} - -#endif -#ifdef BSP_USING_BS16T1_HWTIMER - -static struct es32f3_hwtimer_dev bs16t1_hwtimer; - -static struct rt_hwtimer_info bs16t1_info = -{ - ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ - (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ - 0xFFFF, /* counter maximum value */ - ES_BS16T1_HWTIMER_MODE -}; - -void BS16T1_Handler(void) -{ - ald_timer_clear_flag_status(bs16t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&bs16t1_hwtimer.parent); -} - -#endif - -static void es32f3_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) -{ - struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; - - struct rt_hwtimer_info *hwtimer_info = (struct rt_hwtimer_info *)timer->info; - - - RT_ASSERT(hwtimer != RT_NULL); - - if (1 == state) - { - ald_timer_base_init(hwtimer->hwtimer_periph); - ald_timer_interrupt_config(hwtimer->hwtimer_periph, TIMER_IT_UPDATE, ENABLE); - NVIC_EnableIRQ(hwtimer->IRQn); - } - - hwtimer->parent.freq = ald_cmu_get_pclk1_clock()/((hwtimer->hwtimer_periph->perh->PRES & 0xFFFF)+1); - hwtimer_info->maxfreq = hwtimer->parent.freq; - hwtimer_info->minfreq = (hwtimer->parent.freq)/0xFFFF; - -} - -static rt_err_t es32f3_hwtimer_start(rt_hwtimer_t *timer, - rt_uint32_t cnt, - rt_hwtimer_mode_t mode) -{ - struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; - - RT_ASSERT(hwtimer != RT_NULL); - - WRITE_REG(hwtimer->hwtimer_periph->perh->AR, cnt); - ald_timer_base_start(hwtimer->hwtimer_periph); - - return RT_EOK; -} - -static void es32f3_hwtimer_stop(rt_hwtimer_t *timer) -{ - struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; - - RT_ASSERT(hwtimer != RT_NULL); - - ald_timer_base_stop(hwtimer->hwtimer_periph); -} - -static rt_uint32_t es32f3_hwtimer_count_get(rt_hwtimer_t *timer) -{ - struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; - uint32_t hwtimer_count = 0; - - RT_ASSERT(hwtimer != RT_NULL); - - hwtimer_count = READ_REG(hwtimer->hwtimer_periph->perh->COUNT); - - return hwtimer_count; -} - -static rt_err_t es32f3_hwtimer_control(rt_hwtimer_t *timer, - rt_uint32_t cmd, - void *args) -{ - rt_err_t ret = RT_EOK; - rt_uint32_t freq = 0; - struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; - - RT_ASSERT(hwtimer != RT_NULL); - - switch (cmd) - { - case HWTIMER_CTRL_FREQ_SET: - freq = *(rt_uint32_t *)args; - - ret = -RT_ERROR; - - if(freq) - { - double temp,target; - temp = (double)ald_cmu_get_pclk1_clock(); - target = temp/freq; - - if(target < 0x10001) /*最大分频 = max(PRES)+1*/ - { - temp = target - (int)(target); - - if((temp > 0.998)&&(target < 0x10000)) - { - hwtimer->hwtimer_periph->perh->PRES = (uint32_t)target; - ret = RT_EOK; - } - if((temp < 0.002)&&(target >= 0x1)) - { - hwtimer->hwtimer_periph->perh->PRES = (uint32_t)target - 1; - ret = RT_EOK; - } - - } - - if(ret == RT_EOK) /*更新信息*/ - hwtimer->parent.freq = ald_cmu_get_pclk1_clock()/((hwtimer->hwtimer_periph->perh->PRES & 0xFFFF)+1); - - } - - break; - - case HWTIMER_CTRL_STOP: - ald_timer_base_stop(hwtimer->hwtimer_periph); - break; - - default: - ret = -RT_EINVAL; - break; - } - - return ret; -} - -static struct rt_hwtimer_ops es32f3_hwtimer_ops = -{ - es32f3_hwtimer_init, - es32f3_hwtimer_start, - es32f3_hwtimer_stop, - es32f3_hwtimer_count_get, - es32f3_hwtimer_control -}; - -int rt_hw_hwtimer_init(void) -{ - rt_err_t ret = RT_EOK; - -#ifdef BSP_USING_AD16C4T0_HWTIMER - static timer_handle_t ad16c4t0_hwtimer_periph; - - ad16c4t0_hwtimer_periph.perh = AD16C4T0; - ad16c4t0_hwtimer.IRQn = AD16C4T0_UP_IRQn; - - ad16c4t0_hwtimer_periph.init.prescaler = ES_AD16C4T0_HWTIMER_PRES - 1; - ad16c4t0_hwtimer_periph.init.mode = ( ES_AD16C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - ad16c4t0_hwtimer.hwtimer_periph = &ad16c4t0_hwtimer_periph; - - ad16c4t0_hwtimer.parent.info = &ad16c4t0_info; - ad16c4t0_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&ad16c4t0_hwtimer.parent, ES_DEVICE_NAME_AD16C4T0_HWTIMER, &ad16c4t0_hwtimer); -#endif - -#ifdef BSP_USING_AD16C4T1_HWTIMER - static timer_handle_t ad16c4t1_hwtimer_periph; - - ad16c4t1_hwtimer_periph.perh = AD16C4T1; - ad16c4t1_hwtimer.IRQn = AD16C4T1_UP_IRQn; - - ad16c4t1_hwtimer_periph.init.prescaler = ES_AD16C4T1_HWTIMER_PRES - 1; - ad16c4t1_hwtimer_periph.init.mode = ( ES_AD16C4T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - ad16c4t1_hwtimer.hwtimer_periph = &ad16c4t1_hwtimer_periph; - - ad16c4t1_hwtimer.parent.info = &ad16c4t1_info; - ad16c4t1_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&ad16c4t1_hwtimer.parent, ES_DEVICE_NAME_AD16C4T1_HWTIMER, &ad16c4t1_hwtimer); -#endif - -#ifdef BSP_USING_GP32C4T0_HWTIMER - static timer_handle_t gp32c4t0_hwtimer_periph; - - gp32c4t0_hwtimer_periph.perh = GP32C4T0; - gp32c4t0_hwtimer.IRQn = GP32C4T0_IRQn; - - gp32c4t0_hwtimer_periph.init.prescaler = ES_GP32C4T0_HWTIMER_PRES - 1; - gp32c4t0_hwtimer_periph.init.mode = ( ES_GP32C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - gp32c4t0_hwtimer.hwtimer_periph = &gp32c4t0_hwtimer_periph; - - gp32c4t0_hwtimer.parent.info = &gp32c4t0_info; - gp32c4t0_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&gp32c4t0_hwtimer.parent, ES_DEVICE_NAME_GP32C4T0_HWTIMER, &gp32c4t0_hwtimer); -#endif - -#ifdef BSP_USING_GP32C4T1_HWTIMER - static timer_handle_t gp32c4t1_hwtimer_periph; - - gp32c4t1_hwtimer_periph.perh = GP32C4T1; - gp32c4t1_hwtimer.IRQn = GP32C4T1_IRQn; - - gp32c4t1_hwtimer_periph.init.prescaler = ES_GP32C4T1_HWTIMER_PRES - 1; - gp32c4t1_hwtimer_periph.init.mode = ( ES_GP32C4T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - gp32c4t1_hwtimer.hwtimer_periph = &gp32c4t1_hwtimer_periph; - - gp32c4t1_hwtimer.parent.info = &gp32c4t1_info; - gp32c4t1_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&gp32c4t1_hwtimer.parent, ES_DEVICE_NAME_GP32C4T1_HWTIMER, &gp32c4t1_hwtimer); -#endif - -#ifdef BSP_USING_GP16C4T0_HWTIMER - static timer_handle_t gp16c4t0_hwtimer_periph; - - gp16c4t0_hwtimer_periph.perh = GP16C4T0; - gp16c4t0_hwtimer.IRQn = GP16C4T0_IRQn; - - gp16c4t0_hwtimer_periph.init.prescaler = ES_GP16C4T0_HWTIMER_PRES - 1; - gp16c4t0_hwtimer_periph.init.mode = ( ES_GP16C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - gp16c4t0_hwtimer.hwtimer_periph = &gp16c4t0_hwtimer_periph; - - gp16c4t0_hwtimer.parent.info = &gp16c4t0_info; - gp16c4t0_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&gp16c4t0_hwtimer.parent, ES_DEVICE_NAME_GP16C4T0_HWTIMER, &gp16c4t0_hwtimer); -#endif - -#ifdef BSP_USING_GP16C4T1_HWTIMER - static timer_handle_t gp16c4t1_hwtimer_periph; - - gp16c4t1_hwtimer_periph.perh = GP16C4T1; - gp16c4t1_hwtimer.IRQn = GP16C4T1_IRQn; - - gp16c4t1_hwtimer_periph.init.prescaler = ES_GP16C4T1_HWTIMER_PRES - 1; - gp16c4t1_hwtimer_periph.init.mode = ( ES_GP16C4T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - gp16c4t1_hwtimer.hwtimer_periph = &gp16c4t1_hwtimer_periph; - - gp16c4t1_hwtimer.parent.info = &gp16c4t1_info; - gp16c4t1_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&gp16c4t1_hwtimer.parent, ES_DEVICE_NAME_GP16C4T1_HWTIMER, &gp16c4t1_hwtimer); -#endif - -#ifdef BSP_USING_BS16T0_HWTIMER - static timer_handle_t bs16t0_hwtimer_periph; - - bs16t0_hwtimer_periph.perh = BS16T0; - bs16t0_hwtimer.IRQn = BS16T0_IRQn; - - bs16t0_hwtimer_periph.init.prescaler = ES_BS16T0_HWTIMER_PRES - 1; - bs16t0_hwtimer_periph.init.mode = ( ES_BS16T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - bs16t0_hwtimer.hwtimer_periph = &bs16t0_hwtimer_periph; - - bs16t0_hwtimer.parent.info = &bs16t0_info; - bs16t0_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&bs16t0_hwtimer.parent, ES_DEVICE_NAME_BS16T0_HWTIMER, &bs16t0_hwtimer); -#endif - -#ifdef BSP_USING_BS16T1_HWTIMER - static timer_handle_t bs16t1_hwtimer_periph; - - bs16t1_hwtimer_periph.perh = BS16T1; - bs16t1_hwtimer.IRQn = BS16T1_IRQn; - - bs16t1_hwtimer_periph.init.prescaler = ES_BS16T1_HWTIMER_PRES - 1; - bs16t1_hwtimer_periph.init.mode = ( ES_BS16T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - bs16t1_hwtimer.hwtimer_periph = &bs16t1_hwtimer_periph; - - bs16t1_hwtimer.parent.info = &bs16t1_info; - bs16t1_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&bs16t1_hwtimer.parent, ES_DEVICE_NAME_BS16T1_HWTIMER, &bs16t1_hwtimer); -#endif - - return ret; -} -INIT_BOARD_EXPORT(rt_hw_hwtimer_init); - -#endif diff --git a/bsp/essemi/es32f369x/drivers/drv_timer.c b/bsp/essemi/es32f369x/drivers/drv_timer.c new file mode 100644 index 0000000000..16adf7ebcd --- /dev/null +++ b/bsp/essemi/es32f369x/drivers/drv_timer.c @@ -0,0 +1,448 @@ +/* + * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. + * + * 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. + * + * Change Logs: + * Date Author Notes + * 2019-3-19 wangyq the first version + * 2019-11-01 wangyq update libraries + * 2021-04-20 liuhy the second version + */ + +#include +#include +#include +#include +#include + + +#ifdef RT_USING_CLOCK_TIME + +struct es32f3_clock_timer_dev +{ + rt_clock_timer_t parent; + timer_handle_t *clock_timer_periph; + IRQn_Type IRQn; +}; + +#ifdef BSP_USING_AD16C4T0_CLOCK_TIMER +static struct es32f3_clock_timer_dev ad16c4t0_clock_timer; + +static struct rt_clock_timer_info ad16c4t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_AD16C4T0_CLOCK_TIMER_MODE +}; + +void AD16C4T0_UP_Handler(void) +{ + ald_timer_clear_flag_status(ad16c4t0_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&ad16c4t0_clock_timer.parent); +} + +#endif + +#ifdef BSP_USING_AD16C4T1_CLOCK_TIMER + +static struct es32f3_clock_timer_dev ad16c4t1_clock_timer; + +static struct rt_clock_timer_info ad16c4t1_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_AD16C4T1_CLOCK_TIMER_MODE +}; + +void AD16C4T1_UP_Handler(void) +{ + ald_timer_clear_flag_status(ad16c4t1_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&ad16c4t1_clock_timer.parent); +} + +#endif +#ifdef BSP_USING_GP32C4T0_CLOCK_TIMER + +static struct es32f3_clock_timer_dev gp32c4t0_clock_timer; + +static struct rt_clock_timer_info gp32c4t0_info = +{ + + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV , /* maximum count frequency */ + ( ES_SYS_CLK >> ES_CMU_PCLK_1_DIV )/(1U<<16), /* minimum count frequency */ + 0xFFFFFFFF, /* counter maximum value */ + ES_GP32C4T0_CLOCK_TIMER_MODE +}; + +void GP32C4T0_Handler(void) +{ + ald_timer_clear_flag_status(gp32c4t0_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&gp32c4t0_clock_timer.parent); +} + +#endif +#ifdef BSP_USING_GP32C4T1_CLOCK_TIMER + +static struct es32f3_clock_timer_dev gp32c4t1_clock_timer; + +static struct rt_clock_timer_info gp32c4t1_info = +{ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV ), /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV )/(1U<<16), /* minimum count frequency */ + 0xFFFFFFFF, /* counter maximum value */ + ES_GP32C4T1_CLOCK_TIMER_MODE +}; + +void GP32C4T1_Handler(void) +{ + ald_timer_clear_flag_status(gp32c4t1_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&gp32c4t1_clock_timer.parent); +} + +#endif +#ifdef BSP_USING_GP16C4T0_CLOCK_TIMER + +static struct es32f3_clock_timer_dev gp16c4t0_clock_timer; + +static struct rt_clock_timer_info gp16c4t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_GP16C4T0_CLOCK_TIMER_MODE +}; + +void GP16C4T0_Handler(void) +{ + ald_timer_clear_flag_status(gp16c4t0_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&gp16c4t0_clock_timer.parent); +} + +#endif +#ifdef BSP_USING_GP16C4T1_CLOCK_TIMER + +static struct es32f3_clock_timer_dev gp16c4t1_clock_timer; + +static struct rt_clock_timer_info gp16c4t1_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_GP16C4T1_CLOCK_TIMER_MODE +}; + +void GP16C4T1_Handler(void) +{ + ald_timer_clear_flag_status(gp16c4t1_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&gp16c4t1_clock_timer.parent); +} + +#endif +#ifdef BSP_USING_BS16T0_CLOCK_TIMER + +static struct es32f3_clock_timer_dev bs16t0_clock_timer; + +static struct rt_clock_timer_info bs16t0_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T0_CLOCK_TIMER_MODE +}; + +void BS16T0_Handler(void) +{ + ald_timer_clear_flag_status(bs16t0_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&bs16t0_clock_timer.parent); +} + +#endif +#ifdef BSP_USING_BS16T1_CLOCK_TIMER + +static struct es32f3_clock_timer_dev bs16t1_clock_timer; + +static struct rt_clock_timer_info bs16t1_info = +{ + ES_SYS_CLK >> ES_CMU_PCLK_1_DIV, /* maximum count frequency */ + (ES_SYS_CLK >> ES_CMU_PCLK_1_DIV)/(1U<<16), /* minimum count frequency */ + 0xFFFF, /* counter maximum value */ + ES_BS16T1_CLOCK_TIMER_MODE +}; + +void BS16T1_Handler(void) +{ + ald_timer_clear_flag_status(bs16t1_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&bs16t1_clock_timer.parent); +} + +#endif + +static void es32f3_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) +{ + struct es32f3_clock_timer_dev *clock_timer = (struct es32f3_clock_timer_dev *)timer->parent.user_data; + + struct rt_clock_timer_info *clock_timer_info = (struct rt_clock_timer_info *)timer->info; + + + RT_ASSERT(clock_timer != RT_NULL); + + if (1 == state) + { + ald_timer_base_init(clock_timer->clock_timer_periph); + ald_timer_interrupt_config(clock_timer->clock_timer_periph, TIMER_IT_UPDATE, ENABLE); + NVIC_EnableIRQ(clock_timer->IRQn); + } + + clock_timer->parent.freq = ald_cmu_get_pclk1_clock()/((clock_timer->clock_timer_periph->perh->PRES & 0xFFFF)+1); + clock_timer_info->maxfreq = clock_timer->parent.freq; + clock_timer_info->minfreq = (clock_timer->parent.freq)/0xFFFF; + +} + +static rt_err_t es32f3_clock_timer_start(rt_clock_timer_t *timer, + rt_uint32_t cnt, + rt_clock_timer_mode_t mode) +{ + struct es32f3_clock_timer_dev *clock_timer = (struct es32f3_clock_timer_dev *)timer->parent.user_data; + + RT_ASSERT(clock_timer != RT_NULL); + + WRITE_REG(clock_timer->clock_timer_periph->perh->AR, cnt); + ald_timer_base_start(clock_timer->clock_timer_periph); + + return RT_EOK; +} + +static void es32f3_clock_timer_stop(rt_clock_timer_t *timer) +{ + struct es32f3_clock_timer_dev *clock_timer = (struct es32f3_clock_timer_dev *)timer->parent.user_data; + + RT_ASSERT(clock_timer != RT_NULL); + + ald_timer_base_stop(clock_timer->clock_timer_periph); +} + +static rt_uint32_t es32f3_clock_timer_count_get(rt_clock_timer_t *timer) +{ + struct es32f3_clock_timer_dev *clock_timer = (struct es32f3_clock_timer_dev *)timer->parent.user_data; + uint32_t clock_timer_count = 0; + + RT_ASSERT(clock_timer != RT_NULL); + + clock_timer_count = READ_REG(clock_timer->clock_timer_periph->perh->COUNT); + + return clock_timer_count; +} + +static rt_err_t es32f3_clock_timer_control(rt_clock_timer_t *timer, + rt_uint32_t cmd, + void *args) +{ + rt_err_t ret = RT_EOK; + rt_uint32_t freq = 0; + struct es32f3_clock_timer_dev *clock_timer = (struct es32f3_clock_timer_dev *)timer->parent.user_data; + + RT_ASSERT(clock_timer != RT_NULL); + + switch (cmd) + { + case CLOCK_TIMER_CTRL_FREQ_SET: + freq = *(rt_uint32_t *)args; + + ret = -RT_ERROR; + + if(freq) + { + double temp,target; + temp = (double)ald_cmu_get_pclk1_clock(); + target = temp/freq; + + if(target < 0x10001) /*最大分频 = max(PRES)+1*/ + { + temp = target - (int)(target); + + if((temp > 0.998)&&(target < 0x10000)) + { + clock_timer->clock_timer_periph->perh->PRES = (uint32_t)target; + ret = RT_EOK; + } + if((temp < 0.002)&&(target >= 0x1)) + { + clock_timer->clock_timer_periph->perh->PRES = (uint32_t)target - 1; + ret = RT_EOK; + } + + } + + if(ret == RT_EOK) /*更新信息*/ + clock_timer->parent.freq = ald_cmu_get_pclk1_clock()/((clock_timer->clock_timer_periph->perh->PRES & 0xFFFF)+1); + + } + + break; + + case CLOCK_TIMER_CTRL_STOP: + ald_timer_base_stop(clock_timer->clock_timer_periph); + break; + + default: + ret = -RT_EINVAL; + break; + } + + return ret; +} + +static struct rt_clock_timer_ops es32f3_clock_timer_ops = +{ + es32f3_clock_timer_init, + es32f3_clock_timer_start, + es32f3_clock_timer_stop, + es32f3_clock_timer_count_get, + es32f3_clock_timer_control +}; + +int rt_hw_clock_timer_init(void) +{ + rt_err_t ret = RT_EOK; + +#ifdef BSP_USING_AD16C4T0_CLOCK_TIMER + static timer_handle_t ad16c4t0_clock_timer_periph; + + ad16c4t0_clock_timer_periph.perh = AD16C4T0; + ad16c4t0_clock_timer.IRQn = AD16C4T0_UP_IRQn; + + ad16c4t0_clock_timer_periph.init.prescaler = ES_AD16C4T0_CLOCK_TIMER_PRES - 1; + ad16c4t0_clock_timer_periph.init.mode = ( ES_AD16C4T0_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + ad16c4t0_clock_timer.clock_timer_periph = &ad16c4t0_clock_timer_periph; + + ad16c4t0_clock_timer.parent.info = &ad16c4t0_info; + ad16c4t0_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&ad16c4t0_clock_timer.parent, ES_DEVICE_NAME_AD16C4T0_CLOCK_TIMER, &ad16c4t0_clock_timer); +#endif + +#ifdef BSP_USING_AD16C4T1_CLOCK_TIMER + static timer_handle_t ad16c4t1_clock_timer_periph; + + ad16c4t1_clock_timer_periph.perh = AD16C4T1; + ad16c4t1_clock_timer.IRQn = AD16C4T1_UP_IRQn; + + ad16c4t1_clock_timer_periph.init.prescaler = ES_AD16C4T1_CLOCK_TIMER_PRES - 1; + ad16c4t1_clock_timer_periph.init.mode = ( ES_AD16C4T1_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + ad16c4t1_clock_timer.clock_timer_periph = &ad16c4t1_clock_timer_periph; + + ad16c4t1_clock_timer.parent.info = &ad16c4t1_info; + ad16c4t1_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&ad16c4t1_clock_timer.parent, ES_DEVICE_NAME_AD16C4T1_CLOCK_TIMER, &ad16c4t1_clock_timer); +#endif + +#ifdef BSP_USING_GP32C4T0_CLOCK_TIMER + static timer_handle_t gp32c4t0_clock_timer_periph; + + gp32c4t0_clock_timer_periph.perh = GP32C4T0; + gp32c4t0_clock_timer.IRQn = GP32C4T0_IRQn; + + gp32c4t0_clock_timer_periph.init.prescaler = ES_GP32C4T0_CLOCK_TIMER_PRES - 1; + gp32c4t0_clock_timer_periph.init.mode = ( ES_GP32C4T0_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp32c4t0_clock_timer.clock_timer_periph = &gp32c4t0_clock_timer_periph; + + gp32c4t0_clock_timer.parent.info = &gp32c4t0_info; + gp32c4t0_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&gp32c4t0_clock_timer.parent, ES_DEVICE_NAME_GP32C4T0_CLOCK_TIMER, &gp32c4t0_clock_timer); +#endif + +#ifdef BSP_USING_GP32C4T1_CLOCK_TIMER + static timer_handle_t gp32c4t1_clock_timer_periph; + + gp32c4t1_clock_timer_periph.perh = GP32C4T1; + gp32c4t1_clock_timer.IRQn = GP32C4T1_IRQn; + + gp32c4t1_clock_timer_periph.init.prescaler = ES_GP32C4T1_CLOCK_TIMER_PRES - 1; + gp32c4t1_clock_timer_periph.init.mode = ( ES_GP32C4T1_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp32c4t1_clock_timer.clock_timer_periph = &gp32c4t1_clock_timer_periph; + + gp32c4t1_clock_timer.parent.info = &gp32c4t1_info; + gp32c4t1_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&gp32c4t1_clock_timer.parent, ES_DEVICE_NAME_GP32C4T1_CLOCK_TIMER, &gp32c4t1_clock_timer); +#endif + +#ifdef BSP_USING_GP16C4T0_CLOCK_TIMER + static timer_handle_t gp16c4t0_clock_timer_periph; + + gp16c4t0_clock_timer_periph.perh = GP16C4T0; + gp16c4t0_clock_timer.IRQn = GP16C4T0_IRQn; + + gp16c4t0_clock_timer_periph.init.prescaler = ES_GP16C4T0_CLOCK_TIMER_PRES - 1; + gp16c4t0_clock_timer_periph.init.mode = ( ES_GP16C4T0_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c4t0_clock_timer.clock_timer_periph = &gp16c4t0_clock_timer_periph; + + gp16c4t0_clock_timer.parent.info = &gp16c4t0_info; + gp16c4t0_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&gp16c4t0_clock_timer.parent, ES_DEVICE_NAME_GP16C4T0_CLOCK_TIMER, &gp16c4t0_clock_timer); +#endif + +#ifdef BSP_USING_GP16C4T1_CLOCK_TIMER + static timer_handle_t gp16c4t1_clock_timer_periph; + + gp16c4t1_clock_timer_periph.perh = GP16C4T1; + gp16c4t1_clock_timer.IRQn = GP16C4T1_IRQn; + + gp16c4t1_clock_timer_periph.init.prescaler = ES_GP16C4T1_CLOCK_TIMER_PRES - 1; + gp16c4t1_clock_timer_periph.init.mode = ( ES_GP16C4T1_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c4t1_clock_timer.clock_timer_periph = &gp16c4t1_clock_timer_periph; + + gp16c4t1_clock_timer.parent.info = &gp16c4t1_info; + gp16c4t1_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&gp16c4t1_clock_timer.parent, ES_DEVICE_NAME_GP16C4T1_CLOCK_TIMER, &gp16c4t1_clock_timer); +#endif + +#ifdef BSP_USING_BS16T0_CLOCK_TIMER + static timer_handle_t bs16t0_clock_timer_periph; + + bs16t0_clock_timer_periph.perh = BS16T0; + bs16t0_clock_timer.IRQn = BS16T0_IRQn; + + bs16t0_clock_timer_periph.init.prescaler = ES_BS16T0_CLOCK_TIMER_PRES - 1; + bs16t0_clock_timer_periph.init.mode = ( ES_BS16T0_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t0_clock_timer.clock_timer_periph = &bs16t0_clock_timer_periph; + + bs16t0_clock_timer.parent.info = &bs16t0_info; + bs16t0_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&bs16t0_clock_timer.parent, ES_DEVICE_NAME_BS16T0_CLOCK_TIMER, &bs16t0_clock_timer); +#endif + +#ifdef BSP_USING_BS16T1_CLOCK_TIMER + static timer_handle_t bs16t1_clock_timer_periph; + + bs16t1_clock_timer_periph.perh = BS16T1; + bs16t1_clock_timer.IRQn = BS16T1_IRQn; + + bs16t1_clock_timer_periph.init.prescaler = ES_BS16T1_CLOCK_TIMER_PRES - 1; + bs16t1_clock_timer_periph.init.mode = ( ES_BS16T1_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t1_clock_timer.clock_timer_periph = &bs16t1_clock_timer_periph; + + bs16t1_clock_timer.parent.info = &bs16t1_info; + bs16t1_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&bs16t1_clock_timer.parent, ES_DEVICE_NAME_BS16T1_CLOCK_TIMER, &bs16t1_clock_timer); +#endif + + return ret; +} +INIT_BOARD_EXPORT(rt_hw_clock_timer_init); + +#endif diff --git a/bsp/essemi/es32vf2264/drivers/drv_hwtimer.h b/bsp/essemi/es32f369x/drivers/drv_timer.h similarity index 86% rename from bsp/essemi/es32vf2264/drivers/drv_hwtimer.h rename to bsp/essemi/es32f369x/drivers/drv_timer.h index bbf51a4771..676ebb2358 100644 --- a/bsp/essemi/es32vf2264/drivers/drv_hwtimer.h +++ b/bsp/essemi/es32f369x/drivers/drv_timer.h @@ -21,10 +21,10 @@ * 2021-04-20 liuhy the second version */ -#ifndef DRV_HWTIMER_H__ -#define DRV_HWTIMER_H__ +#ifndef DRV_CLOCK_TIMER_H__ +#define DRV_CLOCK_TIMER_H__ -#include "es_conf_info_hwtimer.h" -int rt_hw_hwtimer_init(void); +#include "es_conf_info_clock_timer.h" +int rt_hw_clock_timer_init(void); #endif diff --git a/bsp/essemi/es32vf2264/drivers/ES/Kconfig b/bsp/essemi/es32vf2264/drivers/ES/Kconfig index 8c2fffd7b4..bea93ab873 100644 --- a/bsp/essemi/es32vf2264/drivers/ES/Kconfig +++ b/bsp/essemi/es32vf2264/drivers/ES/Kconfig @@ -121,31 +121,31 @@ menu "ADC Drivers" endmenu -menu "HWTIMER Drivers" +menu "CLOCK_TIMER Drivers" - config BSP_USING_AD16C4T0_HWTIMER - bool "Register HWTIMER0 " - select RT_USING_HWTIMER + config BSP_USING_AD16C4T0_CLOCK_TIMER + bool "Register CLOCK_TIMER0 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_GP16C4T0_HWTIMER - bool "Register HWTIMER1 " - select RT_USING_HWTIMER + config BSP_USING_GP16C4T0_CLOCK_TIMER + bool "Register CLOCK_TIMER1 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_GP16C4T1_HWTIMER - bool "Register HWTIMER2 " - select RT_USING_HWTIMER + config BSP_USING_GP16C4T1_CLOCK_TIMER + bool "Register CLOCK_TIMER2 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_GP16C4T2_HWTIMER - bool "Register HWTIMER3 " - select RT_USING_HWTIMER + config BSP_USING_GP16C4T2_CLOCK_TIMER + bool "Register CLOCK_TIMER3 " + select RT_USING_CLOCK_TIME default n - config BSP_USING_BS16T0_HWTIMER - bool "Register HWTIMER4 " - select RT_USING_HWTIMER + config BSP_USING_BS16T0_CLOCK_TIMER + bool "Register CLOCK_TIMER4 " + select RT_USING_CLOCK_TIME default n endmenu @@ -156,25 +156,25 @@ menu "PWM Drivers" bool "Register PWM0 " select RT_USING_PWM default n - depends on !BSP_USING_AD16C4T0_HWTIMER + depends on !BSP_USING_AD16C4T0_CLOCK_TIMER config BSP_USING_GP16C4T0_PWM bool "Register PWM1 " select RT_USING_PWM default n - depends on !BSP_USING_GP16C4T0_HWTIMER + depends on !BSP_USING_GP16C4T0_CLOCK_TIMER config BSP_USING_GP16C4T1_PWM bool "Register PWM2 " select RT_USING_PWM default n - depends on !BSP_USING_GP16C4T1_HWTIMER + depends on !BSP_USING_GP16C4T1_CLOCK_TIMER config BSP_USING_GP16C4T2_PWM bool "Register PWM3 " select RT_USING_PWM default n - depends on !BSP_USING_GP16C4T1_HWTIMER + depends on !BSP_USING_GP16C4T1_CLOCK_TIMER endmenu diff --git a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_hwtimer.h b/bsp/essemi/es32vf2264/drivers/ES/es_conf_info_clock_timer.h similarity index 30% rename from bsp/essemi/es32f0654/drivers/ES/es_conf_info_hwtimer.h rename to bsp/essemi/es32vf2264/drivers/ES/es_conf_info_clock_timer.h index 100b2e626b..8f7f65b43e 100644 --- a/bsp/essemi/es32f0654/drivers/ES/es_conf_info_hwtimer.h +++ b/bsp/essemi/es32vf2264/drivers/ES/es_conf_info_clock_timer.h @@ -21,82 +21,82 @@ * */ -#ifndef __ES_CONF_INFO_HWTIMER_H__ -#define __ES_CONF_INFO_HWTIMER_H__ +#ifndef __ES_CONF_INFO_CLOCK_TIMER_H__ +#define __ES_CONF_INFO_CLOCK_TIMER_H__ #include #include -#define ES_C_HWTIMER_MODE_UP HWTIMER_CNTMODE_UP -#define ES_C_HWTIMER_MODE_DOWN HWTIMER_CNTMODE_DW +#define ES_C_CLOCK_TIMER_MODE_UP CLOCK_TIMER_CNTMODE_UP +#define ES_C_CLOCK_TIMER_MODE_DOWN CLOCK_TIMER_CNTMODE_DW -/* HWTIMER 配置 */ +/* CLOCK_TIMER 配置 */ /* codes_main */ -#ifndef ES_AD16C4T0_HWTIMER_MODE -#define ES_AD16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_AD16C4T0_CLOCK_TIMER_MODE +#define ES_AD16C4T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP16C4T0_HWTIMER_MODE -#define ES_GP16C4T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP16C4T0_CLOCK_TIMER_MODE +#define ES_GP16C4T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP16C2T0_HWTIMER_MODE -#define ES_GP16C2T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP16C4T1_CLOCK_TIMER_MODE +#define ES_GP16C4T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_GP1624T1_HWTIMER_MODE -#define ES_GP16C2T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_GP16C4T2_CLOCK_TIMER_MODE +#define ES_GP16C4T2_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T0_HWTIMER_MODE -#define ES_BS16T0_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T0_CLOCK_TIMER_MODE +#define ES_BS16T0_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T1_HWTIMER_MODE -#define ES_BS16T1_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T1_CLOCK_TIMER_MODE +#define ES_BS16T1_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T2_HWTIMER_MODE -#define ES_BS16T2_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T2_CLOCK_TIMER_MODE +#define ES_BS16T2_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#ifndef ES_BS16T3_HWTIMER_MODE -#define ES_BS16T3_HWTIMER_MODE ES_C_HWTIMER_MODE_UP +#ifndef ES_BS16T3_CLOCK_TIMER_MODE +#define ES_BS16T3_CLOCK_TIMER_MODE ES_C_CLOCK_TIMER_MODE_UP #endif -#define ES_AD16C4T0_HWTIMER_PRES 1 -#define ES_GP16C4T0_HWTIMER_PRES 1 -#define ES_GP16C2T0_HWTIMER_PRES 1 -#define ES_GP16C2T1_HWTIMER_PRES 1 -#define ES_BS16T0_HWTIMER_PRES 1 -#define ES_BS16T1_HWTIMER_PRES 1 -#define ES_BS16T2_HWTIMER_PRES 1 -#define ES_BS16T3_HWTIMER_PRES 1 +#define ES_AD16C4T0_CLOCK_TIMER_PRES 1 +#define ES_GP16C4T0_CLOCK_TIMER_PRES 1 +#define ES_GP16C2T0_CLOCK_TIMER_PRES 1 +#define ES_GP16C2T1_CLOCK_TIMER_PRES 1 +#define ES_BS16T0_CLOCK_TIMER_PRES 1 +#define ES_BS16T1_CLOCK_TIMER_PRES 1 +#define ES_BS16T2_CLOCK_TIMER_PRES 1 +#define ES_BS16T3_CLOCK_TIMER_PRES 1 -#ifndef ES_DEVICE_NAME_AD16C4T0_HWTIMER -#define ES_DEVICE_NAME_AD16C4T0_HWTIMER "timer0" +#ifndef ES_DEVICE_NAME_AD16C4T0_CLOCK_TIMER +#define ES_DEVICE_NAME_AD16C4T0_CLOCK_TIMER "timer0" #endif -#ifndef ES_DEVICE_NAME_GP16C4T0_HWTIMER -#define ES_DEVICE_NAME_GP16C4T0_HWTIMER "timer1" +#ifndef ES_DEVICE_NAME_GP16C4T0_CLOCK_TIMER +#define ES_DEVICE_NAME_GP16C4T0_CLOCK_TIMER "timer1" #endif -#ifndef ES_DEVICE_NAME_GP16C2T0_HWTIMER -#define ES_DEVICE_NAME_GP16C2T0_HWTIMER "timer2" +#ifndef ES_DEVICE_NAME_GP16C4T1_CLOCK_TIMER +#define ES_DEVICE_NAME_GP16C4T1_CLOCK_TIMER "timer2" #endif -#ifndef ES_DEVICE_NAME_GP16C2T1_HWTIMER -#define ES_DEVICE_NAME_GP16C2T1_HWTIMER "timer3" +#ifndef ES_DEVICE_NAME_GP16C4T2_CLOCK_TIMER +#define ES_DEVICE_NAME_GP16C4T2_CLOCK_TIMER "timer3" #endif -#ifndef ES_DEVICE_NAME_BS16T0_HWTIMER -#define ES_DEVICE_NAME_BS16T0_HWTIMER "timer4" +#ifndef ES_DEVICE_NAME_BS16T0_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T0_CLOCK_TIMER "timer4" #endif -#ifndef ES_DEVICE_NAME_BS16T1_HWTIMER -#define ES_DEVICE_NAME_BS16T1_HWTIMER "timer5" +#ifndef ES_DEVICE_NAME_BS16T1_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T1_CLOCK_TIMER "timer5" #endif -#ifndef ES_DEVICE_NAME_BS16T2_HWTIMER -#define ES_DEVICE_NAME_BS16T2_HWTIMER "timer6" +#ifndef ES_DEVICE_NAME_BS16T2_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T2_CLOCK_TIMER "timer6" #endif -#ifndef ES_DEVICE_NAME_BS16T3_HWTIMER -#define ES_DEVICE_NAME_BS16T3_HWTIMER "timer7" +#ifndef ES_DEVICE_NAME_BS16T3_CLOCK_TIMER +#define ES_DEVICE_NAME_BS16T3_CLOCK_TIMER "timer7" #endif diff --git a/bsp/essemi/es32vf2264/drivers/SConscript b/bsp/essemi/es32vf2264/drivers/SConscript index d5a224afc4..24861f45ea 100644 --- a/bsp/essemi/es32vf2264/drivers/SConscript +++ b/bsp/essemi/es32vf2264/drivers/SConscript @@ -46,15 +46,15 @@ if GetDepend(['BSP_USING_RTC']): if GetDepend('BSP_USING_SPI_FLASH'): src += ['drv_spiflash.c'] -# add hwtimer driver code -if GetDepend('BSP_USING_AD16C4T0_HWTIMER') or GetDepend('BSP_USING_AD16C4T1_HWTIMER') or \ - GetDepend('BSP_USING_GP32C4T0_HWTIMER') or GetDepend('BSP_USING_GP32C4T1_HWTIMER') or \ - GetDepend('BSP_USING_GP16C4T0_HWTIMER') or GetDepend('BSP_USING_GP16C4T1_HWTIMER') or GetDepend('BSP_USING_GP16C4T2_HWTIMER') or \ - GetDepend('BSP_USING_GP16C2T0_HWTIMER') or GetDepend('BSP_USING_GP16C2T1_HWTIMER') or \ - GetDepend('BSP_USING_GP16C4T0_HWTIMER') or GetDepend('BSP_USING_GP16C4T1_HWTIMER') or \ - GetDepend('BSP_USING_BS16T0_HWTIMER') or GetDepend('BSP_USING_BS16T1_HWTIMERIMER') or \ - GetDepend('BSP_USING_BS16T2_HWTIMER') or GetDepend('BSP_USING_BS16T3_HWTIMER'): - src += ['drv_hwtimer.c'] +# add clock_timer driver code +if GetDepend('BSP_USING_AD16C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_AD16C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP32C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP32C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP16C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP16C4T1_CLOCK_TIMER') or GetDepend('BSP_USING_GP16C4T2_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP16C2T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP16C2T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_GP16C4T0_CLOCK_TIMER') or GetDepend('BSP_USING_GP16C4T1_CLOCK_TIMER') or \ + GetDepend('BSP_USING_BS16T0_CLOCK_TIMER') or GetDepend('BSP_USING_BS16T1_CLOCK_TIMERIMER') or \ + GetDepend('BSP_USING_BS16T2_CLOCK_TIMER') or GetDepend('BSP_USING_BS16T3_CLOCK_TIMER'): + src += ['drv_timer.c'] # add pwm driver code if GetDepend('BSP_USING_AD16C4T0_PWM') or GetDepend('BSP_USING_AD16C4T1_PWM') or \ diff --git a/bsp/essemi/es32vf2264/drivers/board.h b/bsp/essemi/es32vf2264/drivers/board.h index a230d97a39..3f5cb6a081 100644 --- a/bsp/essemi/es32vf2264/drivers/board.h +++ b/bsp/essemi/es32vf2264/drivers/board.h @@ -36,7 +36,7 @@ #include "es_conf_info_map.h" #include "es_conf_info_gpio.h" #include "es_conf_info_adc.h" -#include "es_conf_info_hwtimer.h" +#include "es_conf_info_clock_timer.h" #include "es_conf_info_pwm.h" #include "es_conf_info_uart.h" #include "es_conf_info_spi.h" diff --git a/bsp/essemi/es32vf2264/drivers/drv_hwtimer.c b/bsp/essemi/es32vf2264/drivers/drv_timer.c similarity index 32% rename from bsp/essemi/es32vf2264/drivers/drv_hwtimer.c rename to bsp/essemi/es32vf2264/drivers/drv_timer.c index e42819af09..b2078975b0 100644 --- a/bsp/essemi/es32vf2264/drivers/drv_hwtimer.c +++ b/bsp/essemi/es32vf2264/drivers/drv_timer.c @@ -25,194 +25,194 @@ #include #include #include -#include +#include #include -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME -struct es32f3_hwtimer_dev +struct es32f3_clock_timer_dev { - rt_hwtimer_t parent; - ald_timer_handle_t *hwtimer_periph; + rt_clock_timer_t parent; + ald_timer_handle_t *clock_timer_periph; IRQn_Type IRQn; }; -#ifdef BSP_USING_AD16C4T0_HWTIMER -static struct es32f3_hwtimer_dev ad16c4t0_hwtimer; +#ifdef BSP_USING_AD16C4T0_CLOCK_TIMER +static struct es32f3_clock_timer_dev ad16c4t0_clock_timer; -static struct rt_hwtimer_info ad16c4t0_info = +static struct rt_clock_timer_info ad16c4t0_info = { ES_SYS_HCLK_CLK >> ES_CMU_PCLK_DIV, /* maximum count frequency */ (ES_SYS_HCLK_CLK >> ES_CMU_PCLK_DIV)/(1U<<16), /* minimum count frequency */ 0xFFFF, /* counter maximum value */ - ES_AD16C4T0_HWTIMER_MODE + ES_AD16C4T0_CLOCK_TIMER_MODE }; void __attribute__((interrupt)) AD16C4T_Handler(void) { rt_interrupt_enter(); - ald_timer_clear_flag_status(ad16c4t0_hwtimer.hwtimer_periph, ALD_TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&ad16c4t0_hwtimer.parent); + ald_timer_clear_flag_status(ad16c4t0_clock_timer.clock_timer_periph, ALD_TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&ad16c4t0_clock_timer.parent); rt_interrupt_leave(); } #endif -#ifdef BSP_USING_GP16C4T0_HWTIMER +#ifdef BSP_USING_GP16C4T0_CLOCK_TIMER -static struct es32f3_hwtimer_dev gp16c4t0_hwtimer; +static struct es32f3_clock_timer_dev gp16c4t0_clock_timer; -static struct rt_hwtimer_info gp16c4t0_info = +static struct rt_clock_timer_info gp16c4t0_info = { ES_SYS_HCLK_CLK >> ES_CMU_PCLK_DIV, /* maximum count frequency */ (ES_SYS_HCLK_CLK >> ES_CMU_PCLK_DIV)/(1U<<16), /* minimum count frequency */ 0xFFFF, /* counter maximum value */ - ES_GP16C4T0_HWTIMER_MODE + ES_GP16C4T0_CLOCK_TIMER_MODE }; void __attribute__((interrupt)) GPTIMB0_Handler(void) { rt_interrupt_enter(); - ald_timer_clear_flag_status(gp16c4t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&gp16c4t0_hwtimer.parent); + ald_timer_clear_flag_status(gp16c4t0_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&gp16c4t0_clock_timer.parent); rt_interrupt_leave(); } #endif -#ifdef BSP_USING_GP16C4T1_HWTIMER +#ifdef BSP_USING_GP16C4T1_CLOCK_TIMER -static struct es32f3_hwtimer_dev gp16c4t1_hwtimer; +static struct es32f3_clock_timer_dev gp16c4t1_clock_timer; -static struct rt_hwtimer_info gp16c4t1_info = +static struct rt_clock_timer_info gp16c4t1_info = { ES_SYS_HCLK_CLK >> ES_CMU_PCLK_DIV, /* maximum count frequency */ (ES_SYS_HCLK_CLK >> ES_CMU_PCLK_DIV)/(1U<<16), /* minimum count frequency */ 0xFFFF, /* counter maximum value */ - ES_GP16C4T1_HWTIMER_MODE + ES_GP16C4T1_CLOCK_TIMER_MODE }; void __attribute__((interrupt)) GPTIMB1_Handler(void) { rt_interrupt_enter(); - ald_timer_clear_flag_status(gp16c4t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&gp16c4t1_hwtimer.parent); + ald_timer_clear_flag_status(gp16c4t1_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&gp16c4t1_clock_timer.parent); rt_interrupt_leave(); } #endif -#ifdef BSP_USING_GP16C4T1_HWTIMER +#ifdef BSP_USING_GP16C4T1_CLOCK_TIMER -static struct es32f3_hwtimer_dev gp16c4t1_hwtimer; +static struct es32f3_clock_timer_dev gp16c4t1_clock_timer; -static struct rt_hwtimer_info gp16c4t1_info = +static struct rt_clock_timer_info gp16c4t1_info = { ES_SYS_HCLK_CLK >> ES_CMU_PCLK_DIV, /* maximum count frequency */ (ES_SYS_HCLK_CLK >> ES_CMU_PCLK_DIV)/(1U<<16), /* minimum count frequency */ 0xFFFF, /* counter maximum value */ - ES_GP16C4T1_HWTIMER_MODE + ES_GP16C4T1_CLOCK_TIMER_MODE }; void __attribute__((interrupt)) GPTIMB2_Handler(void) { rt_interrupt_enter(); - ald_timer_clear_flag_status(gp16c4t1_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&gp16c4t1_hwtimer.parent); + ald_timer_clear_flag_status(gp16c4t1_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&gp16c4t1_clock_timer.parent); rt_interrupt_leave(); } #endif -#ifdef BSP_USING_BS16T0_HWTIMER +#ifdef BSP_USING_BS16T0_CLOCK_TIMER -static struct es32f3_hwtimer_dev bs16t0_hwtimer; +static struct es32f3_clock_timer_dev bs16t0_clock_timer; -static struct rt_hwtimer_info bs16t0_info = +static struct rt_clock_timer_info bs16t0_info = { ES_SYS_HCLK_CLK >> ES_CMU_PCLK_DIV, /* maximum count frequency */ (ES_SYS_HCLK_CLK >> ES_CMU_PCLK_DIV)/(1U<<16), /* minimum count frequency */ 0xFFFF, /* counter maximum value */ - ES_BS16T0_HWTIMER_MODE + ES_BS16T0_CLOCK_TIMER_MODE }; void __attribute__((interrupt)) BSTIM0_Handler(void) { rt_interrupt_enter(); - ald_timer_clear_flag_status(bs16t0_hwtimer.hwtimer_periph, TIMER_FLAG_UPDATE); - rt_device_hwtimer_isr(&bs16t0_hwtimer.parent); + ald_timer_clear_flag_status(bs16t0_clock_timer.clock_timer_periph, TIMER_FLAG_UPDATE); + rt_clock_timer_isr(&bs16t0_clock_timer.parent); rt_interrupt_leave(); } #endif -static void es32f3_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void es32f3_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { - struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; + struct es32f3_clock_timer_dev *clock_timer = (struct es32f3_clock_timer_dev *)timer->parent.user_data; - struct rt_hwtimer_info *hwtimer_info = (struct rt_hwtimer_info *)timer->info; + struct rt_clock_timer_info *clock_timer_info = (struct rt_clock_timer_info *)timer->info; - RT_ASSERT(hwtimer != RT_NULL); + RT_ASSERT(clock_timer != RT_NULL); if (1 == state) { - ald_timer_base_init(hwtimer->hwtimer_periph); - ald_timer_interrupt_config(hwtimer->hwtimer_periph, ALD_TIMER_IT_UPDATE, ENABLE); - csi_vic_enable_sirq(hwtimer->IRQn); + ald_timer_base_init(clock_timer->clock_timer_periph); + ald_timer_interrupt_config(clock_timer->clock_timer_periph, ALD_TIMER_IT_UPDATE, ENABLE); + csi_vic_enable_sirq(clock_timer->IRQn); } - hwtimer->parent.freq = ald_cmu_get_pclk_clock()/((hwtimer->hwtimer_periph->perh->PRES & 0xFFFF)+1); - hwtimer_info->maxfreq = hwtimer->parent.freq; - hwtimer_info->minfreq = (hwtimer->parent.freq)/0xFFFF; + clock_timer->parent.freq = ald_cmu_get_pclk_clock()/((clock_timer->clock_timer_periph->perh->PRES & 0xFFFF)+1); + clock_timer_info->maxfreq = clock_timer->parent.freq; + clock_timer_info->minfreq = (clock_timer->parent.freq)/0xFFFF; } -static rt_err_t es32f3_hwtimer_start(rt_hwtimer_t *timer, +static rt_err_t es32f3_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, - rt_hwtimer_mode_t mode) + rt_clock_timer_mode_t mode) { - struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; + struct es32f3_clock_timer_dev *clock_timer = (struct es32f3_clock_timer_dev *)timer->parent.user_data; - RT_ASSERT(hwtimer != RT_NULL); + RT_ASSERT(clock_timer != RT_NULL); - WRITE_REG(hwtimer->hwtimer_periph->perh->AR, cnt); - ald_timer_base_start(hwtimer->hwtimer_periph); + WRITE_REG(clock_timer->clock_timer_periph->perh->AR, cnt); + ald_timer_base_start(clock_timer->clock_timer_periph); return RT_EOK; } -static void es32f3_hwtimer_stop(rt_hwtimer_t *timer) +static void es32f3_clock_timer_stop(rt_clock_timer_t *timer) { - struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; + struct es32f3_clock_timer_dev *clock_timer = (struct es32f3_clock_timer_dev *)timer->parent.user_data; - RT_ASSERT(hwtimer != RT_NULL); + RT_ASSERT(clock_timer != RT_NULL); - ald_timer_base_stop(hwtimer->hwtimer_periph); + ald_timer_base_stop(clock_timer->clock_timer_periph); } -static rt_uint32_t es32f3_hwtimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t es32f3_clock_timer_count_get(rt_clock_timer_t *timer) { - struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; - uint32_t hwtimer_count = 0; + struct es32f3_clock_timer_dev *clock_timer = (struct es32f3_clock_timer_dev *)timer->parent.user_data; + uint32_t clock_timer_count = 0; - RT_ASSERT(hwtimer != RT_NULL); + RT_ASSERT(clock_timer != RT_NULL); - hwtimer_count = READ_REG(hwtimer->hwtimer_periph->perh->COUNT); + clock_timer_count = READ_REG(clock_timer->clock_timer_periph->perh->COUNT); - return hwtimer_count; + return clock_timer_count; } -static rt_err_t es32f3_hwtimer_control(rt_hwtimer_t *timer, +static rt_err_t es32f3_clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t ret = RT_EOK; rt_uint32_t freq = 0; - struct es32f3_hwtimer_dev *hwtimer = (struct es32f3_hwtimer_dev *)timer->parent.user_data; + struct es32f3_clock_timer_dev *clock_timer = (struct es32f3_clock_timer_dev *)timer->parent.user_data; - RT_ASSERT(hwtimer != RT_NULL); + RT_ASSERT(clock_timer != RT_NULL); switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: freq = *(rt_uint32_t *)args; ret = -RT_ERROR; @@ -229,26 +229,26 @@ static rt_err_t es32f3_hwtimer_control(rt_hwtimer_t *timer, if((temp > 0.998)&&(target < 0x10000)) { - hwtimer->hwtimer_periph->perh->PRES = (uint32_t)target; + clock_timer->clock_timer_periph->perh->PRES = (uint32_t)target; ret = RT_EOK; } if((temp < 0.002)&&(target >= 0x1)) { - hwtimer->hwtimer_periph->perh->PRES = (uint32_t)target - 1; + clock_timer->clock_timer_periph->perh->PRES = (uint32_t)target - 1; ret = RT_EOK; } } if(ret == RT_EOK) /*更新信息*/ - hwtimer->parent.freq = ald_cmu_get_pclk_clock()/((hwtimer->hwtimer_periph->perh->PRES & 0xFFFF)+1); + clock_timer->parent.freq = ald_cmu_get_pclk_clock()/((clock_timer->clock_timer_periph->perh->PRES & 0xFFFF)+1); } break; - case HWTIMER_CTRL_STOP: - ald_timer_base_stop(hwtimer->hwtimer_periph); + case CLOCK_TIMER_CTRL_STOP: + ald_timer_base_stop(clock_timer->clock_timer_periph); break; default: @@ -259,96 +259,96 @@ static rt_err_t es32f3_hwtimer_control(rt_hwtimer_t *timer, return ret; } -static struct rt_hwtimer_ops es32f3_hwtimer_ops = +static struct rt_clock_timer_ops es32f3_clock_timer_ops = { - es32f3_hwtimer_init, - es32f3_hwtimer_start, - es32f3_hwtimer_stop, - es32f3_hwtimer_count_get, - es32f3_hwtimer_control + es32f3_clock_timer_init, + es32f3_clock_timer_start, + es32f3_clock_timer_stop, + es32f3_clock_timer_count_get, + es32f3_clock_timer_control }; -int rt_hw_hwtimer_init(void) +int rt_hw_clock_timer_init(void) { rt_err_t ret = RT_EOK; -#ifdef BSP_USING_AD16C4T0_HWTIMER - static ald_timer_handle_t ad16c4t0_hwtimer_periph; +#ifdef BSP_USING_AD16C4T0_CLOCK_TIMER + static ald_timer_handle_t ad16c4t0_clock_timer_periph; - ad16c4t0_hwtimer_periph.perh = AD16C4T; - ad16c4t0_hwtimer.IRQn = AD16C4T_IRQn; + ad16c4t0_clock_timer_periph.perh = AD16C4T; + ad16c4t0_clock_timer.IRQn = AD16C4T_IRQn; - ad16c4t0_hwtimer_periph.init.prescaler = ES_AD16C4T0_HWTIMER_PRES - 1; - ad16c4t0_hwtimer_periph.init.mode = ( ES_AD16C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? ALD_TIMER_CNT_MODE_UP : ALD_TIMER_CNT_MODE_DOWN; - ad16c4t0_hwtimer.hwtimer_periph = &ad16c4t0_hwtimer_periph; + ad16c4t0_clock_timer_periph.init.prescaler = ES_AD16C4T0_CLOCK_TIMER_PRES - 1; + ad16c4t0_clock_timer_periph.init.mode = ( ES_AD16C4T0_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? ALD_TIMER_CNT_MODE_UP : ALD_TIMER_CNT_MODE_DOWN; + ad16c4t0_clock_timer.clock_timer_periph = &ad16c4t0_clock_timer_periph; - ad16c4t0_hwtimer.parent.info = &ad16c4t0_info; - ad16c4t0_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&ad16c4t0_hwtimer.parent, ES_DEVICE_NAME_AD16C4T0_HWTIMER, &ad16c4t0_hwtimer); + ad16c4t0_clock_timer.parent.info = &ad16c4t0_info; + ad16c4t0_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&ad16c4t0_clock_timer.parent, ES_DEVICE_NAME_AD16C4T0_CLOCK_TIMER, &ad16c4t0_clock_timer); #endif -#ifdef BSP_USING_GP16C4T0_HWTIMER - static timer_handle_t gp16c4t0_hwtimer_periph; +#ifdef BSP_USING_GP16C4T0_CLOCK_TIMER + static timer_handle_t gp16c4t0_clock_timer_periph; - gp16c4t0_hwtimer_periph.perh = GP16C4T0; - gp16c4t0_hwtimer.IRQn = GP16C4T0_IRQn; + gp16c4t0_clock_timer_periph.perh = GP16C4T0; + gp16c4t0_clock_timer.IRQn = GP16C4T0_IRQn; - gp16c4t0_hwtimer_periph.init.prescaler = ES_GP16C4T0_HWTIMER_PRES - 1; - gp16c4t0_hwtimer_periph.init.mode = ( ES_GP16C4T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - gp16c4t0_hwtimer.hwtimer_periph = &gp16c4t0_hwtimer_periph; + gp16c4t0_clock_timer_periph.init.prescaler = ES_GP16C4T0_CLOCK_TIMER_PRES - 1; + gp16c4t0_clock_timer_periph.init.mode = ( ES_GP16C4T0_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c4t0_clock_timer.clock_timer_periph = &gp16c4t0_clock_timer_periph; - gp16c4t0_hwtimer.parent.info = &gp16c4t0_info; - gp16c4t0_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&gp16c4t0_hwtimer.parent, ES_DEVICE_NAME_GP16C4T0_HWTIMER, &gp16c4t0_hwtimer); + gp16c4t0_clock_timer.parent.info = &gp16c4t0_info; + gp16c4t0_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&gp16c4t0_clock_timer.parent, ES_DEVICE_NAME_GP16C4T0_CLOCK_TIMER, &gp16c4t0_clock_timer); #endif -#ifdef BSP_USING_GP16C4T1_HWTIMER - static timer_handle_t gp16c4t1_hwtimer_periph; +#ifdef BSP_USING_GP16C4T1_CLOCK_TIMER + static timer_handle_t gp16c4t1_clock_timer_periph; - gp16c4t1_hwtimer_periph.perh = GP16C4T1; - gp16c4t1_hwtimer.IRQn = GP16C4T1_IRQn; + gp16c4t1_clock_timer_periph.perh = GP16C4T1; + gp16c4t1_clock_timer.IRQn = GP16C4T1_IRQn; - gp16c4t1_hwtimer_periph.init.prescaler = ES_GP16C4T1_HWTIMER_PRES - 1; - gp16c4t1_hwtimer_periph.init.mode = ( ES_GP16C4T1_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - gp16c4t1_hwtimer.hwtimer_periph = &gp16c4t1_hwtimer_periph; + gp16c4t1_clock_timer_periph.init.prescaler = ES_GP16C4T1_CLOCK_TIMER_PRES - 1; + gp16c4t1_clock_timer_periph.init.mode = ( ES_GP16C4T1_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c4t1_clock_timer.clock_timer_periph = &gp16c4t1_clock_timer_periph; - gp16c4t1_hwtimer.parent.info = &gp16c4t1_info; - gp16c4t1_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&gp16c4t1_hwtimer.parent, ES_DEVICE_NAME_GP16C4T1_HWTIMER, &gp16c4t1_hwtimer); + gp16c4t1_clock_timer.parent.info = &gp16c4t1_info; + gp16c4t1_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&gp16c4t1_clock_timer.parent, ES_DEVICE_NAME_GP16C4T1_CLOCK_TIMER, &gp16c4t1_clock_timer); #endif -#ifdef BSP_USING_GP16C4T2_HWTIMER - static timer_handle_t gp16c4t2_hwtimer_periph; +#ifdef BSP_USING_GP16C4T2_CLOCK_TIMER + static timer_handle_t gp16c4t2_clock_timer_periph; - gp16c4t2_hwtimer_periph.perh = GP16C4T2; - gp16c4t2_hwtimer.IRQn = GP16C4T2_IRQn; + gp16c4t2_clock_timer_periph.perh = GP16C4T2; + gp16c4t2_clock_timer.IRQn = GP16C4T2_IRQn; - gp16c4t2_hwtimer_periph.init.prescaler = ES_GP16C4T2_HWTIMER_PRES - 1; - gp16c4t2_hwtimer_periph.init.mode = ( ES_GP16C4T2_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - gp16c4t2_hwtimer.hwtimer_periph = &gp16c4t2_hwtimer_periph; + gp16c4t2_clock_timer_periph.init.prescaler = ES_GP16C4T2_CLOCK_TIMER_PRES - 1; + gp16c4t2_clock_timer_periph.init.mode = ( ES_GP16C4T2_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + gp16c4t2_clock_timer.clock_timer_periph = &gp16c4t2_clock_timer_periph; - gp16c4t2_hwtimer.parent.info = &gp16c4t2_info; - gp16c4t2_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&gp16c4t2_hwtimer.parent, ES_DEVICE_NAME_GP16C4T2_HWTIMER, &gp16c4t2_hwtimer); + gp16c4t2_clock_timer.parent.info = &gp16c4t2_info; + gp16c4t2_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&gp16c4t2_clock_timer.parent, ES_DEVICE_NAME_GP16C4T2_CLOCK_TIMER, &gp16c4t2_clock_timer); #endif -#ifdef BSP_USING_BS16T0_HWTIMER - static timer_handle_t bs16t0_hwtimer_periph; +#ifdef BSP_USING_BS16T0_CLOCK_TIMER + static timer_handle_t bs16t0_clock_timer_periph; - bs16t0_hwtimer_periph.perh = BS16T0; - bs16t0_hwtimer.IRQn = BS16T0_IRQn; + bs16t0_clock_timer_periph.perh = BS16T0; + bs16t0_clock_timer.IRQn = BS16T0_IRQn; - bs16t0_hwtimer_periph.init.prescaler = ES_BS16T0_HWTIMER_PRES - 1; - bs16t0_hwtimer_periph.init.mode = ( ES_BS16T0_HWTIMER_MODE == HWTIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; - bs16t0_hwtimer.hwtimer_periph = &bs16t0_hwtimer_periph; + bs16t0_clock_timer_periph.init.prescaler = ES_BS16T0_CLOCK_TIMER_PRES - 1; + bs16t0_clock_timer_periph.init.mode = ( ES_BS16T0_CLOCK_TIMER_MODE == CLOCK_TIMER_CNTMODE_UP )? TIMER_CNT_MODE_UP : TIMER_CNT_MODE_DOWN; + bs16t0_clock_timer.clock_timer_periph = &bs16t0_clock_timer_periph; - bs16t0_hwtimer.parent.info = &bs16t0_info; - bs16t0_hwtimer.parent.ops = &es32f3_hwtimer_ops; - ret = rt_device_hwtimer_register(&bs16t0_hwtimer.parent, ES_DEVICE_NAME_BS16T0_HWTIMER, &bs16t0_hwtimer); + bs16t0_clock_timer.parent.info = &bs16t0_info; + bs16t0_clock_timer.parent.ops = &es32f3_clock_timer_ops; + ret = rt_clock_timer_register(&bs16t0_clock_timer.parent, ES_DEVICE_NAME_BS16T0_CLOCK_TIMER, &bs16t0_clock_timer); #endif return ret; } -INIT_BOARD_EXPORT(rt_hw_hwtimer_init); +INIT_BOARD_EXPORT(rt_hw_clock_timer_init); #endif diff --git a/bsp/essemi/es32f0654/drivers/drv_hwtimer.h b/bsp/essemi/es32vf2264/drivers/drv_timer.h similarity index 86% rename from bsp/essemi/es32f0654/drivers/drv_hwtimer.h rename to bsp/essemi/es32vf2264/drivers/drv_timer.h index bbf51a4771..676ebb2358 100644 --- a/bsp/essemi/es32f0654/drivers/drv_hwtimer.h +++ b/bsp/essemi/es32vf2264/drivers/drv_timer.h @@ -21,10 +21,10 @@ * 2021-04-20 liuhy the second version */ -#ifndef DRV_HWTIMER_H__ -#define DRV_HWTIMER_H__ +#ifndef DRV_CLOCK_TIMER_H__ +#define DRV_CLOCK_TIMER_H__ -#include "es_conf_info_hwtimer.h" -int rt_hw_hwtimer_init(void); +#include "es_conf_info_clock_timer.h" +int rt_hw_clock_timer_init(void); #endif diff --git a/bsp/fm33lc026/libraries/FM33LC0xx_FL_Driver/SConscript b/bsp/fm33lc026/libraries/FM33LC0xx_FL_Driver/SConscript index 46d626df1e..14fbf4f1ca 100644 --- a/bsp/fm33lc026/libraries/FM33LC0xx_FL_Driver/SConscript +++ b/bsp/fm33lc026/libraries/FM33LC0xx_FL_Driver/SConscript @@ -27,7 +27,7 @@ if GetDepend(['RT_USING_I2C']): if GetDepend(['RT_USING_SPI']): src += ['Src/fm33lc0xx_fl_spi.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): +if GetDepend(['RT_USING_CLOCK_TIME']) or GetDepend(['RT_USING_PWM']): src += ['Src/fm33lc0xx_fl_atim.c'] src += ['Src/fm33lc0xx_fl_bstim32.c'] diff --git a/bsp/fm33lc026/libraries/HAL_Drivers/SConscript b/bsp/fm33lc026/libraries/HAL_Drivers/SConscript index b95ebbf240..704e728356 100644 --- a/bsp/fm33lc026/libraries/HAL_Drivers/SConscript +++ b/bsp/fm33lc026/libraries/HAL_Drivers/SConscript @@ -14,8 +14,8 @@ if GetDepend(['RT_USING_PIN']): if GetDepend(['RT_USING_SERIAL']): src += ['drv_usart.c'] -if GetDepend(['RT_USING_HWTIMER']): - src += ['drv_hwtimer.c'] +if GetDepend(['RT_USING_CLOCK_TIME']): + src += ['drv_timer.c'] if GetDepend(['RT_USING_PWM']): src += ['drv_pwm.c'] diff --git a/bsp/ft2004/libraries/SConscript b/bsp/ft2004/libraries/SConscript index 2f023e6b9f..7447ac3822 100644 --- a/bsp/ft2004/libraries/SConscript +++ b/bsp/ft2004/libraries/SConscript @@ -61,7 +61,7 @@ if GetDepend(['BSP_USE_CAN']): None -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): +if GetDepend(['RT_USING_CLOCK_TIME']) or GetDepend(['RT_USING_PWM']): None if GetDepend(['RT_USING_ADC']): diff --git a/bsp/gd32/arm/gd32103c-eval/board/Kconfig b/bsp/gd32/arm/gd32103c-eval/board/Kconfig index 46de28e360..2a5ef718bb 100644 --- a/bsp/gd32/arm/gd32103c-eval/board/Kconfig +++ b/bsp/gd32/arm/gd32103c-eval/board/Kconfig @@ -262,7 +262,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32105c-eval/board/Kconfig b/bsp/gd32/arm/gd32105c-eval/board/Kconfig index c2c937003e..bbe77fe170 100644 --- a/bsp/gd32/arm/gd32105c-eval/board/Kconfig +++ b/bsp/gd32/arm/gd32105c-eval/board/Kconfig @@ -258,7 +258,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32105r-start/board/Kconfig b/bsp/gd32/arm/gd32105r-start/board/Kconfig index 6147acac5d..a4edaa9cc3 100644 --- a/bsp/gd32/arm/gd32105r-start/board/Kconfig +++ b/bsp/gd32/arm/gd32105r-start/board/Kconfig @@ -266,7 +266,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32107c-eval/board/Kconfig b/bsp/gd32/arm/gd32107c-eval/board/Kconfig index e3538ec93d..deeddd4234 100644 --- a/bsp/gd32/arm/gd32107c-eval/board/Kconfig +++ b/bsp/gd32/arm/gd32107c-eval/board/Kconfig @@ -258,7 +258,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32205r-start/board/Kconfig b/bsp/gd32/arm/gd32205r-start/board/Kconfig index 895e03a723..29bcf9d8e5 100644 --- a/bsp/gd32/arm/gd32205r-start/board/Kconfig +++ b/bsp/gd32/arm/gd32205r-start/board/Kconfig @@ -262,7 +262,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32207i-eval/board/Kconfig b/bsp/gd32/arm/gd32207i-eval/board/Kconfig index a0d39cf53c..0d05371f60 100644 --- a/bsp/gd32/arm/gd32207i-eval/board/Kconfig +++ b/bsp/gd32/arm/gd32207i-eval/board/Kconfig @@ -262,7 +262,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32303e-eval/board/Kconfig b/bsp/gd32/arm/gd32303e-eval/board/Kconfig index f46897be95..940d34687e 100644 --- a/bsp/gd32/arm/gd32303e-eval/board/Kconfig +++ b/bsp/gd32/arm/gd32303e-eval/board/Kconfig @@ -262,7 +262,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32305r-start/board/Kconfig b/bsp/gd32/arm/gd32305r-start/board/Kconfig index ce44b26f8f..e52d1dae40 100644 --- a/bsp/gd32/arm/gd32305r-start/board/Kconfig +++ b/bsp/gd32/arm/gd32305r-start/board/Kconfig @@ -258,7 +258,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32307e-start/board/Kconfig b/bsp/gd32/arm/gd32307e-start/board/Kconfig index d04e13d66b..0e06786c0b 100644 --- a/bsp/gd32/arm/gd32307e-start/board/Kconfig +++ b/bsp/gd32/arm/gd32307e-start/board/Kconfig @@ -258,7 +258,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32407v-lckfb/board/Kconfig b/bsp/gd32/arm/gd32407v-lckfb/board/Kconfig index b9281dffeb..2a54c9aa12 100644 --- a/bsp/gd32/arm/gd32407v-lckfb/board/Kconfig +++ b/bsp/gd32/arm/gd32407v-lckfb/board/Kconfig @@ -282,7 +282,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32407v-start/board/Kconfig b/bsp/gd32/arm/gd32407v-start/board/Kconfig index bf19a90c80..d6cb2c6fd7 100644 --- a/bsp/gd32/arm/gd32407v-start/board/Kconfig +++ b/bsp/gd32/arm/gd32407v-start/board/Kconfig @@ -262,7 +262,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32450z-eval/board/Kconfig b/bsp/gd32/arm/gd32450z-eval/board/Kconfig index c0a86c5def..64bfd3ca4e 100644 --- a/bsp/gd32/arm/gd32450z-eval/board/Kconfig +++ b/bsp/gd32/arm/gd32450z-eval/board/Kconfig @@ -262,7 +262,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32470i-eval/board/Kconfig b/bsp/gd32/arm/gd32470i-eval/board/Kconfig index 5ab121f7dd..3fc8296d76 100644 --- a/bsp/gd32/arm/gd32470i-eval/board/Kconfig +++ b/bsp/gd32/arm/gd32470i-eval/board/Kconfig @@ -255,7 +255,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32470z-lckfb/board/Kconfig b/bsp/gd32/arm/gd32470z-lckfb/board/Kconfig index 806989c9ab..9d73815115 100644 --- a/bsp/gd32/arm/gd32470z-lckfb/board/Kconfig +++ b/bsp/gd32/arm/gd32470z-lckfb/board/Kconfig @@ -332,7 +332,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32527I-eval/board/Kconfig b/bsp/gd32/arm/gd32527I-eval/board/Kconfig index 80604dcb9d..1bdb2c1de2 100644 --- a/bsp/gd32/arm/gd32527I-eval/board/Kconfig +++ b/bsp/gd32/arm/gd32527I-eval/board/Kconfig @@ -272,7 +272,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/gd32e230-lckfb/board/Kconfig b/bsp/gd32/arm/gd32e230-lckfb/board/Kconfig index 81ab374ea0..89f0da097b 100644 --- a/bsp/gd32/arm/gd32e230-lckfb/board/Kconfig +++ b/bsp/gd32/arm/gd32e230-lckfb/board/Kconfig @@ -314,7 +314,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable Hardware Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n if BSP_USING_TIM config BSP_USING_TIM2 diff --git a/bsp/gd32/arm/gd32e503v-eval/board/Kconfig b/bsp/gd32/arm/gd32e503v-eval/board/Kconfig index 57a6518e9a..121af8c225 100644 --- a/bsp/gd32/arm/gd32e503v-eval/board/Kconfig +++ b/bsp/gd32/arm/gd32e503v-eval/board/Kconfig @@ -262,7 +262,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/arm/libraries/gd32_drivers/SConscript b/bsp/gd32/arm/libraries/gd32_drivers/SConscript index 31a8d4458d..d10212978d 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/SConscript +++ b/bsp/gd32/arm/libraries/gd32_drivers/SConscript @@ -41,8 +41,8 @@ if GetDepend('RT_USING_RTC'): src += ['drv_rtc.c'] # add timer drivers. -if GetDepend('RT_USING_HWTIMER'): - src += ['drv_hwtimer.c'] +if GetDepend('RT_USING_CLOCK_TIME'): + src += ['drv_timer.c'] # add adc drivers. if GetDepend('RT_USING_ADC'): diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_hwtimer.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_timer.c similarity index 63% rename from bsp/gd32/arm/libraries/gd32_drivers/drv_hwtimer.c rename to bsp/gd32/arm/libraries/gd32_drivers/drv_timer.c index 1c22b10467..be459ffcf6 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_hwtimer.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_timer.c @@ -10,64 +10,64 @@ #include #include -#include +#include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER typedef struct { uint32_t reg_base; IRQn_Type irqn; rcu_periph_enum rcu; -} gd32_hwtimer_data; +} gd32_clock_timer_data; typedef struct { char dev_name[RT_NAME_MAX]; - const gd32_hwtimer_data hw_data; - rt_hwtimer_t hwtimer_dev; - const struct rt_hwtimer_info hwtimer_info; -} gd32_hwtimer_device; + const gd32_clock_timer_data hw_data; + rt_clock_timer_t clock_timer_dev; + const struct rt_clock_timer_info clock_timer_info; +} gd32_clock_timer_device; enum timer_index_E { -#ifdef BSP_USING_HWTIMER0 +#ifdef BSP_USING_CLOCK_TIMER0 TIM0_INDEX, #endif -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 TIM1_INDEX, #endif -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 TIM2_INDEX, #endif -#ifdef BSP_USING_HWTIMER3 +#ifdef BSP_USING_CLOCK_TIMER3 TIM3_INDEX, #endif -#ifdef BSP_USING_HWTIMER4 +#ifdef BSP_USING_CLOCK_TIMER4 TIM4_INDEX, #endif -#ifdef BSP_USING_HWTIMER5 +#ifdef BSP_USING_CLOCK_TIMER5 TIM5_INDEX, #endif -#ifdef BSP_USING_HWTIMER6 +#ifdef BSP_USING_CLOCK_TIMER6 TIM6_INDEX, #endif -#ifdef BSP_USING_HWTIMER7 +#ifdef BSP_USING_CLOCK_TIMER7 TIM7_INDEX, #endif -#ifdef BSP_USING_HWTIMER8 +#ifdef BSP_USING_CLOCK_TIMER8 TIM8_INDEX, #endif -#ifdef BSP_USING_HWTIMER9 +#ifdef BSP_USING_CLOCK_TIMER9 TIM9_INDEX, #endif -#ifdef BSP_USING_HWTIMER10 +#ifdef BSP_USING_CLOCK_TIMER10 TIM10_INDEX, #endif -#ifdef BSP_USING_HWTIMER11 +#ifdef BSP_USING_CLOCK_TIMER11 TIM11_INDEX, #endif -#ifdef BSP_USING_HWTIMER12 +#ifdef BSP_USING_CLOCK_TIMER12 TIM12_INDEX, #endif -#ifdef BSP_USING_HWTIMER13 +#ifdef BSP_USING_CLOCK_TIMER13 TIM13_INDEX, #endif }; @@ -111,7 +111,7 @@ static void __set_timerx_freq(uint32_t timerx, uint32_t freq) timer_prescaler_config(timerx, prescaler, TIMER_PSC_RELOAD_NOW); } -static void gd32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void gd32_clock_timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { uint32_t timer_base = (uint32_t)timer->parent.user_data; timer_parameter_struct initpara; @@ -126,16 +126,16 @@ static void gd32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t state } } -static rt_err_t gd32_hwtimer_start(struct rt_hwtimer_device *timer, \ - rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t gd32_clock_timer_start(struct rt_clock_timer_device *timer, \ + rt_uint32_t cnt, rt_clock_timer_mode_t mode) { uint32_t timer_base = (uint32_t)timer->parent.user_data; - if (mode == HWTIMER_MODE_ONESHOT) + if (mode == CLOCK_TIMER_MODE_ONESHOT) { timer_single_pulse_mode_config(timer_base, TIMER_SP_MODE_SINGLE); } - else if (mode == HWTIMER_MODE_PERIOD) + else if (mode == CLOCK_TIMER_MODE_PERIOD) { timer_single_pulse_mode_config(timer_base, TIMER_SP_MODE_REPETITIVE); } @@ -147,14 +147,14 @@ static rt_err_t gd32_hwtimer_start(struct rt_hwtimer_device *timer, \ return 0; } -static void gd32_hwtimer_stop(struct rt_hwtimer_device *timer) +static void gd32_clock_timer_stop(struct rt_clock_timer_device *timer) { uint32_t timer_base = (uint32_t)timer->parent.user_data; timer_disable(timer_base); } -static rt_uint32_t gd32_hwtimer_count_get(struct rt_hwtimer_device *timer) +static rt_uint32_t gd32_clock_timer_count_get(struct rt_clock_timer_device *timer) { uint32_t timer_base = (uint32_t)timer->parent.user_data; rt_uint32_t count; @@ -164,16 +164,16 @@ static rt_uint32_t gd32_hwtimer_count_get(struct rt_hwtimer_device *timer) return count; } -static rt_err_t gd32_hwtimer_control(struct rt_hwtimer_device *timer, rt_uint32_t cmd, \ +static rt_err_t gd32_clock_timer_control(struct rt_clock_timer_device *timer, rt_uint32_t cmd, \ void *args) { int ret = RT_EOK; rt_int32_t freq; - rt_hwtimer_mode_t mode; + rt_clock_timer_mode_t mode; switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: freq = *(rt_uint32_t *)args; __set_timerx_freq((uint32_t)timer->parent.user_data, freq); break; @@ -186,16 +186,16 @@ static rt_err_t gd32_hwtimer_control(struct rt_hwtimer_device *timer, rt_uint32_ return ret; } -static const struct rt_hwtimer_ops g_gd32_hwtimer_ops = { - gd32_hwtimer_init, - gd32_hwtimer_start, - gd32_hwtimer_stop, - gd32_hwtimer_count_get, - gd32_hwtimer_control, +static const struct rt_clock_timer_ops g_gd32_clock_timer_ops = { + gd32_clock_timer_init, + gd32_clock_timer_start, + gd32_clock_timer_stop, + gd32_clock_timer_count_get, + gd32_clock_timer_control, }; -static gd32_hwtimer_device g_gd32_hwtimer[] = { -#ifdef BSP_USING_HWTIMER0 +static gd32_clock_timer_device g_gd32_clock_timer[] = { +#ifdef BSP_USING_CLOCK_TIMER0 { "timer0", { @@ -212,7 +212,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 { "timer1", { @@ -229,7 +229,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 { "timer2", { @@ -246,7 +246,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER3 +#ifdef BSP_USING_CLOCK_TIMER3 { "timer3", { @@ -263,7 +263,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER4 +#ifdef BSP_USING_CLOCK_TIMER4 { "timer4", { @@ -280,7 +280,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER5 +#ifdef BSP_USING_CLOCK_TIMER5 { "timer5", { @@ -297,7 +297,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER6 +#ifdef BSP_USING_CLOCK_TIMER6 { "timer6", { @@ -314,7 +314,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER7 +#ifdef BSP_USING_CLOCK_TIMER7 { "timer7", { @@ -331,7 +331,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER8 +#ifdef BSP_USING_CLOCK_TIMER8 { "timer8", { @@ -348,7 +348,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER9 +#ifdef BSP_USING_CLOCK_TIMER9 { "timer9", { @@ -365,7 +365,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER10 +#ifdef BSP_USING_CLOCK_TIMER10 { "timer10", { @@ -382,7 +382,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER11 +#ifdef BSP_USING_CLOCK_TIMER11 { "timer11", { @@ -399,7 +399,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER12 +#ifdef BSP_USING_CLOCK_TIMER12 { "timer12", { @@ -416,7 +416,7 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { } }, #endif -#ifdef BSP_USING_HWTIMER13 +#ifdef BSP_USING_CLOCK_TIMER13 { "timer13", { @@ -435,112 +435,112 @@ static gd32_hwtimer_device g_gd32_hwtimer[] = { #endif }; -#ifdef BSP_USING_HWTIMER0 +#ifdef BSP_USING_CLOCK_TIMER0 void TIMER0_UP_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM0_INDEX].hwtimer_dev); - timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM0_INDEX].hwtimer_dev.parent.user_data, \ + rt_clock_timer_isr(&g_gd32_clock_timer[TIM0_INDEX].clock_timer_dev); + timer_flag_clear((uint32_t)g_gd32_clock_timer[TIM0_INDEX].clock_timer_dev.parent.user_data, \ TIMER_INT_UP); rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 void TIMER1_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM1_INDEX].hwtimer_dev); - timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM1_INDEX].hwtimer_dev.parent.user_data, \ + rt_clock_timer_isr(&g_gd32_clock_timer[TIM1_INDEX].clock_timer_dev); + timer_flag_clear((uint32_t)g_gd32_clock_timer[TIM1_INDEX].clock_timer_dev.parent.user_data, \ TIMER_INT_UP); rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 void TIMER2_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM2_INDEX].hwtimer_dev); - timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM2_INDEX].hwtimer_dev.parent.user_data, \ + rt_clock_timer_isr(&g_gd32_clock_timer[TIM2_INDEX].clock_timer_dev); + timer_flag_clear((uint32_t)g_gd32_clock_timer[TIM2_INDEX].clock_timer_dev.parent.user_data, \ TIMER_INT_UP); rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER3 +#ifdef BSP_USING_CLOCK_TIMER3 void TIMER3_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM3_INDEX].hwtimer_dev); - timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM3_INDEX].hwtimer_dev.parent.user_data, \ + rt_clock_timer_isr(&g_gd32_clock_timer[TIM3_INDEX].clock_timer_dev); + timer_flag_clear((uint32_t)g_gd32_clock_timer[TIM3_INDEX].clock_timer_dev.parent.user_data, \ TIMER_INT_UP); rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER4 +#ifdef BSP_USING_CLOCK_TIMER4 void TIMER4_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM4_INDEX].hwtimer_dev); - timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM4_INDEX].hwtimer_dev.parent.user_data, \ + rt_clock_timer_isr(&g_gd32_clock_timer[TIM4_INDEX].clock_timer_dev); + timer_flag_clear((uint32_t)g_gd32_clock_timer[TIM4_INDEX].clock_timer_dev.parent.user_data, \ TIMER_INT_UP); rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER5 +#ifdef BSP_USING_CLOCK_TIMER5 void TIMER5_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM5_INDEX].hwtimer_dev); - timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM5_INDEX].hwtimer_dev.parent.user_data, \ + rt_clock_timer_isr(&g_gd32_clock_timer[TIM5_INDEX].clock_timer_dev); + timer_flag_clear((uint32_t)g_gd32_clock_timer[TIM5_INDEX].clock_timer_dev.parent.user_data, \ TIMER_INT_UP); rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER6 +#ifdef BSP_USING_CLOCK_TIMER6 void TIMER6_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM6_INDEX].hwtimer_dev); - timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM6_INDEX].hwtimer_dev.parent.user_data, \ + rt_clock_timer_isr(&g_gd32_clock_timer[TIM6_INDEX].clock_timer_dev); + timer_flag_clear((uint32_t)g_gd32_clock_timer[TIM6_INDEX].clock_timer_dev.parent.user_data, \ TIMER_INT_UP); rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER7 +#ifdef BSP_USING_CLOCK_TIMER7 void TIMER7_UP_IRQHandler(void) { rt_interrupt_enter(); - rt_device_hwtimer_isr(&g_gd32_hwtimer[TIM7_INDEX].hwtimer_dev); - timer_flag_clear((uint32_t)g_gd32_hwtimer[TIM7_INDEX].hwtimer_dev.parent.user_data, \ + rt_clock_timer_isr(&g_gd32_clock_timer[TIM7_INDEX].clock_timer_dev); + timer_flag_clear((uint32_t)g_gd32_clock_timer[TIM7_INDEX].clock_timer_dev.parent.user_data, \ TIMER_INT_UP); rt_interrupt_leave(); } #endif -static int rt_hwtimer_init(void) +static int rt_clock_timer_init(void) { int ret = 0, i = 0; - for (; i < sizeof(g_gd32_hwtimer) / sizeof(g_gd32_hwtimer[0]); i++) + for (; i < sizeof(g_gd32_clock_timer) / sizeof(g_gd32_clock_timer[0]); i++) { - g_gd32_hwtimer[i].hwtimer_dev.ops = &g_gd32_hwtimer_ops; - g_gd32_hwtimer[i].hwtimer_dev.info = &g_gd32_hwtimer[i].hwtimer_info; - - rcu_periph_clock_enable(g_gd32_hwtimer[i].hw_data.rcu); - NVIC_SetPriority(g_gd32_hwtimer[i].hw_data.irqn, 0); - NVIC_EnableIRQ(g_gd32_hwtimer[i].hw_data.irqn); - timer_interrupt_enable(g_gd32_hwtimer[i].hw_data.reg_base, TIMER_INT_UP); - ret = rt_device_hwtimer_register(&g_gd32_hwtimer[i].hwtimer_dev, \ - g_gd32_hwtimer[i].dev_name, (void *)g_gd32_hwtimer[i].hw_data.reg_base); + g_gd32_clock_timer[i].clock_timer_dev.ops = &g_gd32_clock_timer_ops; + g_gd32_clock_timer[i].clock_timer_dev.info = &g_gd32_clock_timer[i].clock_timer_info; + + rcu_periph_clock_enable(g_gd32_clock_timer[i].hw_data.rcu); + NVIC_SetPriority(g_gd32_clock_timer[i].hw_data.irqn, 0); + NVIC_EnableIRQ(g_gd32_clock_timer[i].hw_data.irqn); + timer_interrupt_enable(g_gd32_clock_timer[i].hw_data.reg_base, TIMER_INT_UP); + ret = rt_clock_timer_register(&g_gd32_clock_timer[i].clock_timer_dev, \ + g_gd32_clock_timer[i].dev_name, (void *)g_gd32_clock_timer[i].hw_data.reg_base); if (RT_EOK != ret) { - rt_kprintf("failed register %s, err=%d\n", g_gd32_hwtimer[i].dev_name, \ + rt_kprintf("failed register %s, err=%d\n", g_gd32_clock_timer[i].dev_name, \ ret); break; } @@ -548,5 +548,5 @@ static int rt_hwtimer_init(void) return ret; } -INIT_BOARD_EXPORT(rt_hwtimer_init); +INIT_BOARD_EXPORT(rt_clock_timer_init); #endif diff --git a/bsp/gd32/risc-v/gd32vf103r-start/board/Kconfig b/bsp/gd32/risc-v/gd32vf103r-start/board/Kconfig index 57ac5297c3..abd9f94bc6 100644 --- a/bsp/gd32/risc-v/gd32vf103r-start/board/Kconfig +++ b/bsp/gd32/risc-v/gd32vf103r-start/board/Kconfig @@ -134,7 +134,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/risc-v/gd32vf103v-eval/board/Kconfig b/bsp/gd32/risc-v/gd32vf103v-eval/board/Kconfig index 63127807cf..421d2da24f 100644 --- a/bsp/gd32/risc-v/gd32vf103v-eval/board/Kconfig +++ b/bsp/gd32/risc-v/gd32vf103v-eval/board/Kconfig @@ -137,7 +137,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/gd32/risc-v/libraries/GD32VF103_Firmware_Library/SConscript b/bsp/gd32/risc-v/libraries/GD32VF103_Firmware_Library/SConscript index 2c2cb02900..7cc4a1b523 100644 --- a/bsp/gd32/risc-v/libraries/GD32VF103_Firmware_Library/SConscript +++ b/bsp/gd32/risc-v/libraries/GD32VF103_Firmware_Library/SConscript @@ -40,7 +40,7 @@ if GetDepend(['RT_USING_ADC']): if GetDepend(['RT_USING_DAC']): src += ['GD32VF103_standard_peripheral/Source/gd32vf103_dac.c'] -if GetDepend(['RT_USING_HWTIMER']): +if GetDepend(['RT_USING_CLOCK_TIME']): src += ['GD32VF103_standard_peripheral/Source/gd32vf103_timer.c'] if GetDepend(['RT_USING_RTC']): diff --git a/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript b/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript index df963f3b78..9148ed9816 100644 --- a/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript +++ b/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript @@ -38,8 +38,8 @@ if GetDepend('RT_USING_RTC'): src += ['drv_rtc.c'] # add timer drivers. -if GetDepend('RT_USING_HWTIMER'): - src += ['drv_hwtimer.c'] +if GetDepend('RT_USING_CLOCK_TIME'): + src += ['drv_timer.c'] # add adc drivers. if GetDepend('RT_USING_ADC'): diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/Kconfig b/bsp/hc32/ev_hc32f334_lqfp64/board/Kconfig index a2bf2035bf..a036748740 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/Kconfig +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/Kconfig @@ -527,11 +527,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable Hw Timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_TMRA_1 bool "Use Timer_a1 As The Hw Timer" default n diff --git a/bsp/hc32/ev_hc32f334_lqfp64/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f334_lqfp64/bsp_compile_ci.bat index f35553ed5a..d1b6de173a 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/bsp_compile_ci.bat +++ b/bsp/hc32/ev_hc32f334_lqfp64/bsp_compile_ci.bat @@ -18,7 +18,7 @@ scons --attach=devices.gpio scons -j4 scons --attach=default -scons --attach=devices.hwtimer +scons --attach=devices.clock_timer scons -j4 scons --attach=default diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig b/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig index 5859ec06f4..7694080495 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig @@ -640,11 +640,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable Hw Timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_TMRA_1 bool "Use Timer_a1 As The Hw Timer" default n @@ -681,7 +681,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_SENSOR bool "Enable SENSOR" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_SENSOR config BSP_USING_TMR0_2B bool "Use KEYSCAN" diff --git a/bsp/hc32/ev_hc32f448_lqfp80/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f448_lqfp80/bsp_compile_ci.bat index 12d5baf278..801b91cb7f 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/bsp_compile_ci.bat +++ b/bsp/hc32/ev_hc32f448_lqfp80/bsp_compile_ci.bat @@ -18,7 +18,7 @@ scons --attach=devices.gpio scons -j4 scons --attach=default -scons --attach=devices.hwtimer +scons --attach=devices.clock_timer scons -j4 scons --attach=default diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/Kconfig b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/Kconfig index 23155b14f4..b2fab38d89 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/Kconfig +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/Kconfig @@ -636,11 +636,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable Hw Timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_TMRA_1 bool "Use Timer_a1 As The Hw Timer" default n diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f460_lqfp100_v2/bsp_compile_ci.bat index 5ae6c2aa69..f1d04b01aa 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/bsp_compile_ci.bat +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/bsp_compile_ci.bat @@ -18,7 +18,7 @@ scons --attach=devices.gpio scons -j4 scons --attach=default -scons --attach=devices.hwtimer +scons --attach=devices.clock_timer scons -j4 scons --attach=default diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/Kconfig b/bsp/hc32/ev_hc32f472_lqfp100/board/Kconfig index 0867ee6929..0c31a20cd0 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/Kconfig +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/Kconfig @@ -703,11 +703,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable Hw Timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_TMRA_1 bool "Use Timer_a1 As The Hw Timer" default n @@ -731,7 +731,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_SENSOR bool "Enable SENSOR" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_SENSOR config BSP_USING_TMR0_2B bool "Use KEYSCAN" diff --git a/bsp/hc32/ev_hc32f472_lqfp100/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f472_lqfp100/bsp_compile_ci.bat index be8ad07538..997f3ec2e1 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/bsp_compile_ci.bat +++ b/bsp/hc32/ev_hc32f472_lqfp100/bsp_compile_ci.bat @@ -22,7 +22,7 @@ scons --attach=devices.gpio scons -j4 scons --attach=default -scons --attach=devices.hwtimer +scons --attach=devices.clock_timer scons -j4 scons --attach=default diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/Kconfig b/bsp/hc32/ev_hc32f4a0_lqfp176/board/Kconfig index dd6cf3734e..79cb785cbc 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/board/Kconfig +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/Kconfig @@ -963,11 +963,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable Hw Timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_TMRA_1 bool "Use Timer_a1 As The Hw Timer" default n diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f4a0_lqfp176/bsp_compile_ci.bat index 7a3904105d..c0cd921b13 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/bsp_compile_ci.bat +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/bsp_compile_ci.bat @@ -22,7 +22,7 @@ scons --attach=devices.gpio scons -j4 scons --attach=default -scons --attach=devices.hwtimer +scons --attach=devices.clock_timer scons -j4 scons --attach=default diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/board/Kconfig b/bsp/hc32/ev_hc32f4a8_lqfp176/board/Kconfig index cae9576d06..9d0e00a67c 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/board/Kconfig +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/board/Kconfig @@ -961,11 +961,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable Hw Timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_TMRA_1 bool "Use Timer_a1 As The Hw Timer" default n diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f4a8_lqfp176/bsp_compile_ci.bat index b5b3bbe746..fd4ec1d3ac 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/bsp_compile_ci.bat +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/bsp_compile_ci.bat @@ -22,7 +22,7 @@ scons --attach=devices.gpio scons -j4 scons --attach=default -scons --attach=devices.hwtimer +scons --attach=devices.clock_timer scons -j4 scons --attach=default diff --git a/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/Kconfig b/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/Kconfig index d5e9a6bbaa..6c91f7e660 100644 --- a/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/Kconfig +++ b/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/Kconfig @@ -909,11 +909,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable Hw Timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_TMRA_1 bool "Use Timer_a1 As The Hw Timer" default n diff --git a/bsp/hc32/libraries/hc32_drivers/SConscript b/bsp/hc32/libraries/hc32_drivers/SConscript index 449e1356a2..3edb6bc1c8 100644 --- a/bsp/hc32/libraries/hc32_drivers/SConscript +++ b/bsp/hc32/libraries/hc32_drivers/SConscript @@ -50,8 +50,8 @@ if GetDepend(['RT_USING_RTC']): if GetDepend(['RT_USING_WDT']): src += ['drv_wdt.c'] -if GetDepend(['RT_USING_HWTIMER']): - src += ['drv_hwtimer.c'] +if GetDepend(['RT_USING_CLOCK_TIME']): + src += ['drv_timer.c'] if GetDepend(['RT_USING_PULSE_ENCODER']): src += ['drv_pulse_encoder.c'] diff --git a/bsp/hc32/libraries/hc32_drivers/drv_hwtimer.c b/bsp/hc32/libraries/hc32_drivers/drv_timer.c similarity index 58% rename from bsp/hc32/libraries/hc32_drivers/drv_hwtimer.c rename to bsp/hc32/libraries/hc32_drivers/drv_timer.c index 2cac51d01f..2db13325c7 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_hwtimer.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_timer.c @@ -14,10 +14,10 @@ #include "drv_config.h" // #define DRV_DEBUG -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER #include "drv_irq.h" @@ -61,9 +61,9 @@ enum #endif }; -struct hc32_hwtimer +struct hc32_clock_timer { - rt_hwtimer_t time_device; + rt_clock_timer_t time_device; CM_TMRA_TypeDef *tmr_handle; rt_uint32_t clock_source; rt_uint32_t clock; @@ -80,7 +80,7 @@ struct hc32_hwtimer char *name; }; -static struct hc32_hwtimer hc32_hwtimer_obj[] = +static struct hc32_clock_timer hc32_clock_timer_obj[] = { #ifdef BSP_USING_TMRA_1 TMRA_1_CONFIG, @@ -120,11 +120,11 @@ static struct hc32_hwtimer hc32_hwtimer_obj[] = #endif }; -static void _timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void _timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { stc_tmra_init_t stcTmraInit; struct hc32_irq_config irq_config; - struct hc32_hwtimer *tmr_device = (struct hc32_hwtimer *)timer; + struct hc32_clock_timer *tmr_device = (struct hc32_clock_timer *)timer; RT_ASSERT(timer != RT_NULL); @@ -166,14 +166,14 @@ static void _timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) } } -static rt_err_t _timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +static rt_err_t _timer_start(rt_clock_timer_t *timer, rt_uint32_t t, rt_clock_timer_mode_t opmode) { rt_err_t result = RT_EOK; - struct hc32_hwtimer *tmr_device = RT_NULL; + struct hc32_clock_timer *tmr_device = RT_NULL; RT_ASSERT(timer != RT_NULL); - tmr_device = (struct hc32_hwtimer *)timer; + tmr_device = (struct hc32_clock_timer *)timer; /* set timer arr */ TMRA_SetPeriodValue(tmr_device->tmr_handle, t - 1U); @@ -183,13 +183,13 @@ static rt_err_t _timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode return result; } -static void _timer_stop(rt_hwtimer_t *timer) +static void _timer_stop(rt_clock_timer_t *timer) { - struct hc32_hwtimer *tmr_device = RT_NULL; + struct hc32_clock_timer *tmr_device = RT_NULL; RT_ASSERT(timer != RT_NULL); - tmr_device = (struct hc32_hwtimer *)timer; + tmr_device = (struct hc32_clock_timer *)timer; /* stop timer */ TMRA_Stop(tmr_device->tmr_handle); @@ -197,7 +197,7 @@ static void _timer_stop(rt_hwtimer_t *timer) TMRA_SetCountValue(tmr_device->tmr_handle, 0U); } -static rt_err_t _timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t _timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { rt_err_t result = -RT_ERROR; uint32_t freq = *(uint32_t *)arg; @@ -207,7 +207,7 @@ static rt_err_t _timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { if (freq != timer->freq) { @@ -230,14 +230,14 @@ static rt_err_t _timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) return result; } -static rt_uint32_t _timer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t _timer_counter_get(rt_clock_timer_t *timer) { - struct hc32_hwtimer *tmr_device = RT_NULL; + struct hc32_clock_timer *tmr_device = RT_NULL; rt_uint32_t Counter; RT_ASSERT(timer != RT_NULL); - tmr_device = (struct hc32_hwtimer *)timer; + tmr_device = (struct hc32_clock_timer *)timer; Counter = TMRA_GetCountValue(tmr_device->tmr_handle); @@ -247,8 +247,8 @@ static rt_uint32_t _timer_counter_get(rt_hwtimer_t *timer) #ifdef BSP_USING_TMRA_1 static void TMRA_1_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_1_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_1_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_1_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_1_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_1_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_1_INDEX].time_device); } #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) @@ -262,8 +262,8 @@ void TMRA_1_Ovf_Udf_Handler(void) #ifdef BSP_USING_TMRA_2 static void TMRA_2_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_2_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_2_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_2_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_2_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_2_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_2_INDEX].time_device); } #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) @@ -277,8 +277,8 @@ void TMRA_2_Ovf_Udf_Handler(void) #ifdef BSP_USING_TMRA_3 static void TMRA_3_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_3_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_3_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_3_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_3_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_3_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_3_INDEX].time_device); } #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) @@ -292,8 +292,8 @@ void TMRA_3_Ovf_Udf_Handler(void) #ifdef BSP_USING_TMRA_4 static void TMRA_4_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_4_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_4_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_4_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_4_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_4_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_4_INDEX].time_device); } #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) @@ -307,8 +307,8 @@ void TMRA_4_Ovf_Udf_Handler(void) #ifdef BSP_USING_TMRA_5 static void TMRA_5_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_5_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_5_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_5_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_5_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_5_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_5_INDEX].time_device); } #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) @@ -322,8 +322,8 @@ void TMRA_5_Ovf_Udf_Handler(void) #ifdef BSP_USING_TMRA_6 static void TMRA_6_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_6_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_6_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_6_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_6_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_6_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_6_INDEX].time_device); } #if defined (HC32F472) @@ -337,105 +337,105 @@ void TMRA_6_Ovf_Udf_Handler(void) #ifdef BSP_USING_TMRA_7 static void TMRA_7_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_7_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_7_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_7_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_7_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_7_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_7_INDEX].time_device); } #endif /* BSP_USING_TMRA_7 */ #ifdef BSP_USING_TMRA_8 static void TMRA_8_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_8_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_8_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_8_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_8_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_8_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_8_INDEX].time_device); } #endif /* BSP_USING_TMRA_8 */ #ifdef BSP_USING_TMRA_9 static void TMRA_9_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_9_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_9_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_9_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_9_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_9_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_9_INDEX].time_device); } #endif /* BSP_USING_TMRA_9 */ #ifdef BSP_USING_TMRA_10 static void TMRA_10_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_10_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_10_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_10_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_10_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_10_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_10_INDEX].time_device); } #endif /* BSP_USING_TMRA_10 */ #ifdef BSP_USING_TMRA_11 static void TMRA_11_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_11_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_11_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_11_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_11_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_11_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_11_INDEX].time_device); } #endif /* BSP_USING_TMRA_11 */ #ifdef BSP_USING_TMRA_12 static void TMRA_12_callback(void) { - TMRA_ClearStatus(hc32_hwtimer_obj[TMRA_12_INDEX].tmr_handle, hc32_hwtimer_obj[TMRA_12_INDEX].flag); - rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_12_INDEX].time_device); + TMRA_ClearStatus(hc32_clock_timer_obj[TMRA_12_INDEX].tmr_handle, hc32_clock_timer_obj[TMRA_12_INDEX].flag); + rt_clock_timer_isr(&hc32_clock_timer_obj[TMRA_12_INDEX].time_device); } #endif /* BSP_USING_TMRA_12 */ -static struct rt_hwtimer_info _info[sizeof(hc32_hwtimer_obj) / sizeof(hc32_hwtimer_obj[0])]; +static struct rt_clock_timer_info _info[sizeof(hc32_clock_timer_obj) / sizeof(hc32_clock_timer_obj[0])]; void tmra_get_info_callback(void) { /* Div = 32 */ for (rt_uint8_t i = 0; i < sizeof(_info) / sizeof(_info[0]); i++) { - _info[i].maxcnt = CLK_GetBusClockFreq(hc32_hwtimer_obj[i].clock_source) / 32U / 1000U; /* Period = 1ms */ - _info[i].maxfreq = CLK_GetBusClockFreq(hc32_hwtimer_obj[i].clock_source) / 32U; - _info[i].minfreq = CLK_GetBusClockFreq(hc32_hwtimer_obj[i].clock_source) / 32U / _info[i].maxcnt; - _info[i].cntmode = HWTIMER_CNTMODE_UP; + _info[i].maxcnt = CLK_GetBusClockFreq(hc32_clock_timer_obj[i].clock_source) / 32U / 1000U; /* Period = 1ms */ + _info[i].maxfreq = CLK_GetBusClockFreq(hc32_clock_timer_obj[i].clock_source) / 32U; + _info[i].minfreq = CLK_GetBusClockFreq(hc32_clock_timer_obj[i].clock_source) / 32U / _info[i].maxcnt; + _info[i].cntmode = CLOCK_TIMER_CNTMODE_UP; } #if defined (HC32F460) || defined (HC32F4A0) || defined (HC32F4A8) #ifdef BSP_USING_TMRA_1 - hc32_hwtimer_obj[TMRA_1_INDEX].isr.irq_callback = TMRA_1_callback; + hc32_clock_timer_obj[TMRA_1_INDEX].isr.irq_callback = TMRA_1_callback; #endif #ifdef BSP_USING_TMRA_2 - hc32_hwtimer_obj[TMRA_2_INDEX].isr.irq_callback = TMRA_2_callback; + hc32_clock_timer_obj[TMRA_2_INDEX].isr.irq_callback = TMRA_2_callback; #endif #ifdef BSP_USING_TMRA_3 - hc32_hwtimer_obj[TMRA_3_INDEX].isr.irq_callback = TMRA_3_callback; + hc32_clock_timer_obj[TMRA_3_INDEX].isr.irq_callback = TMRA_3_callback; #endif #ifdef BSP_USING_TMRA_4 - hc32_hwtimer_obj[TMRA_4_INDEX].isr.irq_callback = TMRA_4_callback; + hc32_clock_timer_obj[TMRA_4_INDEX].isr.irq_callback = TMRA_4_callback; #endif #ifdef BSP_USING_TMRA_5 - hc32_hwtimer_obj[TMRA_5_INDEX].isr.irq_callback = TMRA_5_callback; + hc32_clock_timer_obj[TMRA_5_INDEX].isr.irq_callback = TMRA_5_callback; #endif #ifdef BSP_USING_TMRA_6 - hc32_hwtimer_obj[TMRA_6_INDEX].isr.irq_callback = TMRA_6_callback; + hc32_clock_timer_obj[TMRA_6_INDEX].isr.irq_callback = TMRA_6_callback; #endif #ifdef BSP_USING_TMRA_7 - hc32_hwtimer_obj[TMRA_7_INDEX].isr.irq_callback = TMRA_7_callback; + hc32_clock_timer_obj[TMRA_7_INDEX].isr.irq_callback = TMRA_7_callback; #endif #ifdef BSP_USING_TMRA_8 - hc32_hwtimer_obj[TMRA_8_INDEX].isr.irq_callback = TMRA_8_callback; + hc32_clock_timer_obj[TMRA_8_INDEX].isr.irq_callback = TMRA_8_callback; #endif #ifdef BSP_USING_TMRA_9 - hc32_hwtimer_obj[TMRA_9_INDEX].isr.irq_callback = TMRA_9_callback; + hc32_clock_timer_obj[TMRA_9_INDEX].isr.irq_callback = TMRA_9_callback; #endif #ifdef BSP_USING_TMRA_10 - hc32_hwtimer_obj[TMRA_10_INDEX].isr.irq_callback = TMRA_10_callback; + hc32_clock_timer_obj[TMRA_10_INDEX].isr.irq_callback = TMRA_10_callback; #endif #ifdef BSP_USING_TMRA_11 - hc32_hwtimer_obj[TMRA_11_INDEX].isr.irq_callback = TMRA_11_callback; + hc32_clock_timer_obj[TMRA_11_INDEX].isr.irq_callback = TMRA_11_callback; #endif #ifdef BSP_USING_TMRA_12 - hc32_hwtimer_obj[TMRA_12_INDEX].isr.irq_callback = TMRA_12_callback; + hc32_clock_timer_obj[TMRA_12_INDEX].isr.irq_callback = TMRA_12_callback; #endif #endif } -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_ops _ops = { .init = _timer_init, .start = _timer_start, @@ -444,30 +444,30 @@ static const struct rt_hwtimer_ops _ops = .control = _timer_ctrl, }; -static int rt_hw_hwtimer_init(void) +static int rt_hw_clock_timer_init(void) { int i; int result = RT_EOK; tmra_get_info_callback(); - for (i = 0; i < sizeof(hc32_hwtimer_obj) / sizeof(hc32_hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(hc32_clock_timer_obj) / sizeof(hc32_clock_timer_obj[0]); i++) { - hc32_hwtimer_obj[i].time_device.info = &_info[i]; - hc32_hwtimer_obj[i].time_device.ops = &_ops; - if (rt_device_hwtimer_register(&hc32_hwtimer_obj[i].time_device, - hc32_hwtimer_obj[i].name, &hc32_hwtimer_obj[i].tmr_handle) == RT_EOK) + hc32_clock_timer_obj[i].time_device.info = &_info[i]; + hc32_clock_timer_obj[i].time_device.ops = &_ops; + if (rt_clock_timer_register(&hc32_clock_timer_obj[i].time_device, + hc32_clock_timer_obj[i].name, &hc32_clock_timer_obj[i].tmr_handle) == RT_EOK) { - LOG_D("%s register success", hc32_hwtimer_obj[i].name); + LOG_D("%s register success", hc32_clock_timer_obj[i].name); } else { - LOG_E("%s register failed", hc32_hwtimer_obj[i].name); + LOG_E("%s register failed", hc32_clock_timer_obj[i].name); result = -RT_ERROR; } } return result; } -INIT_BOARD_EXPORT(rt_hw_hwtimer_init); +INIT_BOARD_EXPORT(rt_hw_clock_timer_init); -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/hc32/tests/SConscript b/bsp/hc32/tests/SConscript index fd00268e78..3733761301 100644 --- a/bsp/hc32/tests/SConscript +++ b/bsp/hc32/tests/SConscript @@ -52,8 +52,8 @@ if GetDepend(['BSP_USING_RTC']): if GetDepend(['BSP_USING_WDT']) or GetDepend(['BSP_USING_SWDT']): src += ['test_wdt.c'] -if GetDepend(['BSP_USING_HWTIMER']): - src += ['test_hwtimer.c'] +if GetDepend(['BSP_USING_CLOCK_TIMER']): + src += ['test_clock_timer.c'] if GetDepend(['BSP_USING_PULSE_ENCODER']): src += ['test_pulse_encoder.c'] diff --git a/bsp/hc32/tests/test_hwtimer.c b/bsp/hc32/tests/test_clock_timer.c similarity index 75% rename from bsp/hc32/tests/test_hwtimer.c rename to bsp/hc32/tests/test_clock_timer.c index 3bb8d7738c..b5536b9bed 100644 --- a/bsp/hc32/tests/test_hwtimer.c +++ b/bsp/hc32/tests/test_clock_timer.c @@ -9,13 +9,13 @@ */ /* - * 程序清单:这是一个 hwtimer 设备使用例程 - * 例程导出了 hwtimer_sample 命令到控制终端 - * 命令调用格式:hwtimer_sample hwtimer_sample [option1] [option2] [option3] + * 程序清单:这是一个 clock_timer 设备使用例程 + * 例程导出了 clock_timer_sample 命令到控制终端 + * 命令调用格式:clock_timer_sample clock_timer_sample [option1] [option2] [option3] * option1: [tmra_1/2/3..] 定时器单元 * option2: [oneshot/period] 定时模式 * option3: 超时时间,单位毫秒 - * eg:hwtimer_sample tmra_1 period 1000 + * eg:clock_timer_sample tmra_1 period 1000 * 程序功能:每隔一秒打印一次定时器运行时间值,在定时器超时回调函数中打印总tick值 * 可以使用逻辑分析进一步查看测试管脚PA0定时时间是否准确 */ @@ -25,7 +25,7 @@ #include #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER /* IO用于定时时间测试 */ #define TIMEOUT_TEST_PIN GET_PIN(A, 0) @@ -33,13 +33,13 @@ static rt_uint32_t tick; static rt_bool_t cb_run = RT_FALSE; -static void _hwtimer_cmd_print_usage(void) +static void _clock_timer_cmd_print_usage(void) { - rt_kprintf("hwtimer_sample [option1] [option2] [option3]\n"); + rt_kprintf("clock_timer_sample [option1] [option2] [option3]\n"); rt_kprintf(" option1: [tmra_1/2/3..] tmra uint\n"); rt_kprintf(" option2: [oneshot/period] timing mode set\n"); rt_kprintf(" option3: timeout unit:ms\n"); - rt_kprintf(" e.g. MSH >hwtimer_sample tmra_1 period 1000\n"); + rt_kprintf(" e.g. MSH >clock_timer_sample tmra_1 period 1000\n"); } /* 定时器超时回调函数 */ @@ -55,22 +55,22 @@ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) return 0; } -static int hwtimer_sample(int argc, char *argv[]) +static int clock_timer_sample(int argc, char *argv[]) { rt_uint8_t i; rt_err_t ret = RT_EOK; - rt_hwtimerval_t timeout_s; /* 定时器超时值 */ - rt_hwtimer_mode_t mode = HWTIMER_MODE_ONESHOT; /* 定时器模式 */ + rt_clock_timerval_t timeout_s; /* 定时器超时值 */ + rt_clock_timer_mode_t mode = CLOCK_TIMER_MODE_ONESHOT; /* 定时器模式 */ rt_device_t hw_dev = RT_NULL; /* 定时器设备句柄 */ - rt_hwtimer_t *hwtimer; + rt_clock_timer_t *clock_timer; float t; rt_uint8_t loop_cnt; /* 循环打印次数 */ - rt_hwtimerval_t overflow_tv; /* 定时器超时值 */ + rt_clock_timerval_t overflow_tv; /* 定时器超时值 */ rt_uint32_t timer_out_s; if ((argc != 4) || (rt_strcmp("oneshot", argv[2]) && rt_strcmp("period", argv[2]))) { - _hwtimer_cmd_print_usage(); + _clock_timer_cmd_print_usage(); return -RT_ERROR; } @@ -78,12 +78,12 @@ static int hwtimer_sample(int argc, char *argv[]) hw_dev = rt_device_find(argv[1]); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", argv[1]); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", argv[1]); return -RT_ERROR; } else { - hwtimer = (rt_hwtimer_t *)hw_dev; + clock_timer = (rt_clock_timer_t *)hw_dev; } /* 以读写方式打开设备 */ @@ -97,15 +97,15 @@ static int hwtimer_sample(int argc, char *argv[]) /* 设置模式 */ if (0 == rt_strcmp(argv[2], "oneshot")) { - mode = HWTIMER_MODE_ONESHOT; + mode = CLOCK_TIMER_MODE_ONESHOT; loop_cnt = 1; } else if (0 == rt_strcmp(argv[2], "period")) { - mode = HWTIMER_MODE_PERIOD; + mode = CLOCK_TIMER_MODE_PERIOD; loop_cnt = 5; } - rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); /* 设置超时回调函数 */ rt_device_set_rx_indicate(hw_dev, timeout_cb); @@ -132,15 +132,15 @@ static int hwtimer_sample(int argc, char *argv[]) rt_thread_mdelay(1000); /* 读取定时器当前值 */ - if (mode == HWTIMER_MODE_PERIOD) + if (mode == CLOCK_TIMER_MODE_PERIOD) { rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); } - else if (mode == HWTIMER_MODE_ONESHOT) + else if (mode == CLOCK_TIMER_MODE_ONESHOT) { rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); - t = hwtimer->overflow * hwtimer->period_sec; + t = clock_timer->overflow * clock_timer->period_sec; overflow_tv.sec = (rt_int32_t)t; overflow_tv.usec = (rt_int32_t)((t - overflow_tv.sec) * 1000000); @@ -160,5 +160,5 @@ static int hwtimer_sample(int argc, char *argv[]) return ret; } /* 导出到 msh 命令列表中 */ -MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample: devname [oneshot | period] timeout); +MSH_CMD_EXPORT(clock_timer_sample, clock_timer sample: devname [oneshot | period] timeout); #endif diff --git a/bsp/hk32/hk32f030c8-mini/README.md b/bsp/hk32/hk32f030c8-mini/README.md index 14fc745b89..22d62e433b 100644 --- a/bsp/hk32/hk32f030c8-mini/README.md +++ b/bsp/hk32/hk32f030c8-mini/README.md @@ -49,7 +49,7 @@ HK32F030C8T6-MINI板级包支持MDK5开发环境和GCC编译器,以下是具 | SPI | 支持 | SPI1 | | ADC | 不支持 | | | PWM | 不支持 | | -| HWTIMER | 不支持 | | +| CLOCK_TIMER | 不支持 | | | WDT | 不支持 | | | RTC | 不支持 | | | FLASH | 不支持 | | diff --git a/bsp/hk32/hk32f030c8-mini/board/Kconfig b/bsp/hk32/hk32f030c8-mini/board/Kconfig index 2479bdc2ec..e3e8e27c2f 100644 --- a/bsp/hk32/hk32f030c8-mini/board/Kconfig +++ b/bsp/hk32/hk32f030c8-mini/board/Kconfig @@ -78,11 +78,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTIM3 bool "Enable hardware timer3" default n diff --git a/bsp/hk32/libraries/rt_drivers/SConscript b/bsp/hk32/libraries/rt_drivers/SConscript index b810f026e9..c816e2c8fb 100644 --- a/bsp/hk32/libraries/rt_drivers/SConscript +++ b/bsp/hk32/libraries/rt_drivers/SConscript @@ -18,8 +18,8 @@ if GetDepend(['RT_USING_SERIAL']): if GetDepend(['BSP_USING_PWM']): src += ['drv_pwm.c'] -if GetDepend(['BSP_USING_HWTIMER']): - src += ['drv_hwtimer.c'] +if GetDepend(['BSP_USING_CLOCK_TIMER']): + src += ['drv_timer.c'] if GetDepend(['BSP_USING_SPI']): src += ['drv_spi.c'] diff --git a/bsp/hpmicro/hpm5300evk/board/Kconfig b/bsp/hpmicro/hpm5300evk/board/Kconfig index b02bba277d..2abc17f7fb 100644 --- a/bsp/hpmicro/hpm5300evk/board/Kconfig +++ b/bsp/hpmicro/hpm5300evk/board/Kconfig @@ -342,7 +342,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_GPTMR bool "Enable GPTMR" default n - select RT_USING_HWTIMER if BSP_USING_GPTMR + select RT_USING_CLOCK_TIME if BSP_USING_GPTMR if BSP_USING_GPTMR config BSP_USING_GPTMR0 bool "Enable GPTMR0" diff --git a/bsp/hpmicro/hpm5300evk/board/board.c b/bsp/hpmicro/hpm5300evk/board/board.c index f967e2deb7..323a3974ba 100644 --- a/bsp/hpmicro/hpm5300evk/board/board.c +++ b/bsp/hpmicro/hpm5300evk/board/board.c @@ -14,8 +14,7 @@ #include "hpm_i2c_drv.h" #include "hpm_pcfg_drv.h" #include - - +#include /** * @brief FLASH configuration option definitions: * option[0]: @@ -231,12 +230,15 @@ void board_init_clock(void) void board_delay_us(uint32_t us) { - clock_cpu_delay_us(us); + rt_hw_us_delay(us); } void board_delay_ms(uint32_t ms) { - clock_cpu_delay_ms(ms); + while (ms--) + { + rt_hw_us_delay(1000); + } } #if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT @@ -624,4 +626,3 @@ uint32_t board_init_gptmr_clock(GPTMR_Type *ptr) } return freq; } - diff --git a/bsp/hpmicro/hpm5301evklite/board/Kconfig b/bsp/hpmicro/hpm5301evklite/board/Kconfig index 63888530c2..41f1d35f17 100644 --- a/bsp/hpmicro/hpm5301evklite/board/Kconfig +++ b/bsp/hpmicro/hpm5301evklite/board/Kconfig @@ -266,7 +266,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_GPTMR bool "Enable GPTMR" default n - select RT_USING_HWTIMER if BSP_USING_GPTMR + select RT_USING_CLOCK_TIME if BSP_USING_GPTMR if BSP_USING_GPTMR config BSP_USING_GPTMR0 bool "Enable GPTMR0" diff --git a/bsp/hpmicro/hpm5301evklite/board/board.c b/bsp/hpmicro/hpm5301evklite/board/board.c index 6d2339c1d4..961b7d9fcb 100644 --- a/bsp/hpmicro/hpm5301evklite/board/board.c +++ b/bsp/hpmicro/hpm5301evklite/board/board.c @@ -14,7 +14,7 @@ #include "hpm_i2c_drv.h" #include "hpm_pcfg_drv.h" #include - +#include /** * @brief FLASH configuration option definitions: * option[0]: @@ -233,12 +233,15 @@ void board_init_clock(void) void board_delay_us(uint32_t us) { - clock_cpu_delay_us(us); + rt_hw_us_delay(us); } void board_delay_ms(uint32_t ms) { - clock_cpu_delay_ms(ms); + while (ms--) + { + rt_hw_us_delay(1000); + } } #if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT @@ -504,4 +507,3 @@ uint32_t board_init_gptmr_clock(GPTMR_Type *ptr) } return freq; } - diff --git a/bsp/hpmicro/hpm5e00evk/board/Kconfig b/bsp/hpmicro/hpm5e00evk/board/Kconfig index 6e8a2b2341..a6813786a2 100644 --- a/bsp/hpmicro/hpm5e00evk/board/Kconfig +++ b/bsp/hpmicro/hpm5e00evk/board/Kconfig @@ -401,7 +401,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_GPTMR bool "Enable GPTMR" default n - select RT_USING_HWTIMER if BSP_USING_GPTMR + select RT_USING_CLOCK_TIME if BSP_USING_GPTMR if BSP_USING_GPTMR config BSP_USING_GPTMR0 bool "Enable GPTMR0" diff --git a/bsp/hpmicro/hpm5e00evk/board/board.c b/bsp/hpmicro/hpm5e00evk/board/board.c index 14b9f61a8c..41137ba6f0 100644 --- a/bsp/hpmicro/hpm5e00evk/board/board.c +++ b/bsp/hpmicro/hpm5e00evk/board/board.c @@ -18,6 +18,8 @@ #include "hpm_enet_drv.h" #include "hpm_usb_drv.h" #include "hpm_pcfg_drv.h" +#include +#include /** * @brief FLASH configuration option definitions: @@ -178,12 +180,15 @@ void board_init(void) void board_delay_us(uint32_t us) { - clock_cpu_delay_us(us); + rt_hw_us_delay(us); } void board_delay_ms(uint32_t ms) { - clock_cpu_delay_ms(ms); + while (ms--) + { + rt_hw_us_delay(1000); + } } #if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT @@ -713,4 +718,3 @@ uint32_t board_init_gptmr_clock(GPTMR_Type *ptr) } return freq; } - diff --git a/bsp/hpmicro/hpm6200evk/board/Kconfig b/bsp/hpmicro/hpm6200evk/board/Kconfig index 43fbd1d4ba..0b5373e534 100644 --- a/bsp/hpmicro/hpm6200evk/board/Kconfig +++ b/bsp/hpmicro/hpm6200evk/board/Kconfig @@ -130,7 +130,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_GPTMR bool "Enable GPTMR" default n - select RT_USING_HWTIMER if BSP_USING_GPTMR + select RT_USING_CLOCK_TIME if BSP_USING_GPTMR if BSP_USING_GPTMR config BSP_USING_GPTMR1 bool "Enable GPTMR1" diff --git a/bsp/hpmicro/hpm6200evk/board/board.c b/bsp/hpmicro/hpm6200evk/board/board.c index 5025badde5..87b28b838b 100644 --- a/bsp/hpmicro/hpm6200evk/board/board.c +++ b/bsp/hpmicro/hpm6200evk/board/board.c @@ -20,6 +20,7 @@ #include "hpm_pllctlv2_drv.h" #include "hpm_pcfg_drv.h" #include +#include /** * @brief FLASH configuration option definitions: * option[0]: @@ -190,12 +191,15 @@ void board_init_core1(void) void board_delay_us(uint32_t us) { - clock_cpu_delay_us(us); + rt_hw_us_delay(us); } void board_delay_ms(uint32_t ms) { - clock_cpu_delay_ms(ms); + while (ms--) + { + rt_hw_us_delay(1000); + } } #if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT @@ -729,4 +733,3 @@ uint32_t board_init_gptmr_clock(GPTMR_Type *ptr) } return freq; } - diff --git a/bsp/hpmicro/hpm6300evk/board/Kconfig b/bsp/hpmicro/hpm6300evk/board/Kconfig index 7a1ea26dbf..accf154bcc 100644 --- a/bsp/hpmicro/hpm6300evk/board/Kconfig +++ b/bsp/hpmicro/hpm6300evk/board/Kconfig @@ -468,7 +468,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_GPTMR bool "Enable GPTMR" default n - select RT_USING_HWTIMER if BSP_USING_GPTMR + select RT_USING_CLOCK_TIME if BSP_USING_GPTMR if BSP_USING_GPTMR config BSP_USING_GPTMR0 bool "Enable GPTMR0" diff --git a/bsp/hpmicro/hpm6300evk/board/board.c b/bsp/hpmicro/hpm6300evk/board/board.c index 8e9a744078..8aef75b62e 100644 --- a/bsp/hpmicro/hpm6300evk/board/board.c +++ b/bsp/hpmicro/hpm6300evk/board/board.c @@ -24,7 +24,7 @@ #include "hpm_debug_console.h" #include - +#include /** * @brief FLASH configuration option definitions: * option[0]: @@ -193,12 +193,15 @@ uint32_t board_init_femc_clock(void) void board_delay_us(uint32_t us) { - clock_cpu_delay_us(us); + rt_hw_us_delay(us); } void board_delay_ms(uint32_t ms) { - clock_cpu_delay_ms(ms); + while (ms--) + { + rt_hw_us_delay(1000); + } } #if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT @@ -820,4 +823,3 @@ uint32_t board_init_gptmr_clock(GPTMR_Type *ptr) } return freq; } - diff --git a/bsp/hpmicro/hpm6750evk/board/Kconfig b/bsp/hpmicro/hpm6750evk/board/Kconfig index 975ec75bc8..386d29bd17 100644 --- a/bsp/hpmicro/hpm6750evk/board/Kconfig +++ b/bsp/hpmicro/hpm6750evk/board/Kconfig @@ -279,7 +279,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_GPTMR bool "Enable GPTMR" default n - select RT_USING_HWTIMER if BSP_USING_GPTMR + select RT_USING_CLOCK_TIME if BSP_USING_GPTMR if BSP_USING_GPTMR config BSP_USING_GPTMR1 bool "Enable GPTMR1" diff --git a/bsp/hpmicro/hpm6750evk/board/board.c b/bsp/hpmicro/hpm6750evk/board/board.c index daa8d8b45f..f9bbc614c2 100644 --- a/bsp/hpmicro/hpm6750evk/board/board.c +++ b/bsp/hpmicro/hpm6750evk/board/board.c @@ -24,8 +24,10 @@ #include "hpm_enet_drv.h" #include "hpm_pcfg_drv.h" #include + #if defined(ENET_MULTIPLE_PORT) && ENET_MULTIPLE_PORT #include "hpm_enet_phy_common.h" +#include #endif /** @@ -311,12 +313,15 @@ void board_panel_para_to_lcdc(lcdc_config_t *config) void board_delay_ms(uint32_t ms) { - clock_cpu_delay_ms(ms); + while (ms--) + { + rt_hw_us_delay(1000); + } } void board_delay_us(uint32_t us) { - clock_cpu_delay_us(us); + rt_hw_us_delay(us); } #if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT @@ -1270,4 +1275,3 @@ uint32_t board_init_gptmr_clock(GPTMR_Type *ptr) } return freq; } - diff --git a/bsp/hpmicro/hpm6750evk2/board/Kconfig b/bsp/hpmicro/hpm6750evk2/board/Kconfig index 9f97bd4a7d..893320d8c8 100644 --- a/bsp/hpmicro/hpm6750evk2/board/Kconfig +++ b/bsp/hpmicro/hpm6750evk2/board/Kconfig @@ -785,7 +785,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_GPTMR bool "Enable GPTMR" default n - select RT_USING_HWTIMER if BSP_USING_GPTMR + select RT_USING_CLOCK_TIME if BSP_USING_GPTMR if BSP_USING_GPTMR config BSP_USING_GPTMR0 bool "Enable GPTMR0" diff --git a/bsp/hpmicro/hpm6750evk2/board/board.c b/bsp/hpmicro/hpm6750evk2/board/board.c index 73fdf9f866..fc162f6475 100644 --- a/bsp/hpmicro/hpm6750evk2/board/board.c +++ b/bsp/hpmicro/hpm6750evk2/board/board.c @@ -24,8 +24,10 @@ #include "hpm_enet_drv.h" #include "hpm_pcfg_drv.h" #include + #if defined(ENET_MULTIPLE_PORT) && ENET_MULTIPLE_PORT #include "hpm_enet_phy_common.h" +#include #endif /** @@ -311,12 +313,15 @@ void board_panel_para_to_lcdc(lcdc_config_t *config) void board_delay_ms(uint32_t ms) { - clock_cpu_delay_ms(ms); + while (ms--) + { + rt_hw_us_delay(1000); + } } void board_delay_us(uint32_t us) { - clock_cpu_delay_us(us); + rt_hw_us_delay(us); } #if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT @@ -1267,4 +1272,3 @@ uint32_t board_init_gptmr_clock(GPTMR_Type *ptr) } return freq; } - diff --git a/bsp/hpmicro/hpm6750evkmini/board/Kconfig b/bsp/hpmicro/hpm6750evkmini/board/Kconfig index 29c636386e..f495435be7 100644 --- a/bsp/hpmicro/hpm6750evkmini/board/Kconfig +++ b/bsp/hpmicro/hpm6750evkmini/board/Kconfig @@ -791,7 +791,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_GPTMR bool "Enable GPTMR" default n - select RT_USING_HWTIMER if BSP_USING_GPTMR + select RT_USING_CLOCK_TIME if BSP_USING_GPTMR if BSP_USING_GPTMR config BSP_USING_GPTMR0 bool "Enable GPTMR0" diff --git a/bsp/hpmicro/hpm6750evkmini/board/board.c b/bsp/hpmicro/hpm6750evkmini/board/board.c index 17a6df6a56..be841cd44f 100644 --- a/bsp/hpmicro/hpm6750evkmini/board/board.c +++ b/bsp/hpmicro/hpm6750evkmini/board/board.c @@ -24,7 +24,7 @@ #include "hpm_pcfg_drv.h" #include "hpm_enet_drv.h" #include - +#include static bool invert_led_level; /** @@ -369,12 +369,15 @@ void board_panel_para_to_lcdc(lcdc_config_t *config) void board_delay_ms(uint32_t ms) { - clock_cpu_delay_ms(ms); + while (ms--) + { + rt_hw_us_delay(1000); + } } void board_delay_us(uint32_t us) { - clock_cpu_delay_us(us); + rt_hw_us_delay(us); } #if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT @@ -1210,4 +1213,3 @@ uint32_t board_init_gptmr_clock(GPTMR_Type *ptr) } return freq; } - diff --git a/bsp/hpmicro/hpm6800evk/board/Kconfig b/bsp/hpmicro/hpm6800evk/board/Kconfig index 9e8d58ad4e..d23696e854 100644 --- a/bsp/hpmicro/hpm6800evk/board/Kconfig +++ b/bsp/hpmicro/hpm6800evk/board/Kconfig @@ -567,7 +567,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_GPTMR bool "Enable GPTMR" default n - select RT_USING_HWTIMER if BSP_USING_GPTMR + select RT_USING_CLOCK_TIME if BSP_USING_GPTMR if BSP_USING_GPTMR config BSP_USING_GPTMR0 bool "Enable GPTMR0" diff --git a/bsp/hpmicro/hpm6800evk/board/board.c b/bsp/hpmicro/hpm6800evk/board/board.c index 52da53c800..8200bb9c8e 100644 --- a/bsp/hpmicro/hpm6800evk/board/board.c +++ b/bsp/hpmicro/hpm6800evk/board/board.c @@ -27,7 +27,7 @@ #include "hpm_mipi_dsi_drv.h" #include "hpm_mipi_dsi_phy_drv.h" #include - +#include /** * @brief FLASH configuration option definitions: * option[0]: @@ -191,12 +191,15 @@ void board_init(void) void board_delay_us(uint32_t us) { - clock_cpu_delay_us(us); + rt_hw_us_delay(us); } void board_delay_ms(uint32_t ms) { - clock_cpu_delay_ms(ms); + while (ms--) + { + rt_hw_us_delay(1000); + } } #if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT @@ -1469,4 +1472,3 @@ uint32_t board_init_gptmr_clock(GPTMR_Type *ptr) } return freq; } - diff --git a/bsp/hpmicro/hpm6e00evk/board/Kconfig b/bsp/hpmicro/hpm6e00evk/board/Kconfig index 795107e16c..6ba06a28d8 100644 --- a/bsp/hpmicro/hpm6e00evk/board/Kconfig +++ b/bsp/hpmicro/hpm6e00evk/board/Kconfig @@ -753,7 +753,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_GPTMR bool "Enable GPTMR" default n - select RT_USING_HWTIMER if BSP_USING_GPTMR + select RT_USING_CLOCK_TIME if BSP_USING_GPTMR if BSP_USING_GPTMR config BSP_USING_GPTMR0 bool "Enable GPTMR0" diff --git a/bsp/hpmicro/hpm6e00evk/board/board.c b/bsp/hpmicro/hpm6e00evk/board/board.c index e786fe8e75..0cbf04d134 100644 --- a/bsp/hpmicro/hpm6e00evk/board/board.c +++ b/bsp/hpmicro/hpm6e00evk/board/board.c @@ -23,7 +23,7 @@ #include "hpm_esc_drv.h" #include "hpm_tsw_drv.h" #include - +#include /** * @brief FLASH configuration option definitions: * option[0]: @@ -219,12 +219,15 @@ uint32_t board_init_femc_clock(void) void board_delay_us(uint32_t us) { - clock_cpu_delay_us(us); + rt_hw_us_delay(us); } void board_delay_ms(uint32_t ms) { - clock_cpu_delay_ms(ms); + while (ms--) + { + rt_hw_us_delay(1000); + } } #if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT @@ -1075,4 +1078,3 @@ uint32_t board_init_gptmr_clock(GPTMR_Type *ptr) } return freq; } - diff --git a/bsp/hpmicro/hpm6p00evk/board/Kconfig b/bsp/hpmicro/hpm6p00evk/board/Kconfig index beaf5b3a9e..ad13b7dab8 100644 --- a/bsp/hpmicro/hpm6p00evk/board/Kconfig +++ b/bsp/hpmicro/hpm6p00evk/board/Kconfig @@ -401,7 +401,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_GPTMR bool "Enable GPTMR" default n - select RT_USING_HWTIMER if BSP_USING_GPTMR + select RT_USING_CLOCK_TIME if BSP_USING_GPTMR if BSP_USING_GPTMR config BSP_USING_GPTMR0 bool "Enable GPTMR0" diff --git a/bsp/hpmicro/hpm6p00evk/board/board.c b/bsp/hpmicro/hpm6p00evk/board/board.c index 1c2f11ea06..eaef898dbf 100644 --- a/bsp/hpmicro/hpm6p00evk/board/board.c +++ b/bsp/hpmicro/hpm6p00evk/board/board.c @@ -20,7 +20,7 @@ #include "hpm_usb_drv.h" #include "hpm_femc_drv.h" #include - +#include /** * @brief FLASH configuration option definitions: * option[0]: @@ -202,12 +202,15 @@ uint32_t board_init_femc_clock(void) void board_delay_us(uint32_t us) { - clock_cpu_delay_us(us); + rt_hw_us_delay(us); } void board_delay_ms(uint32_t ms) { - clock_cpu_delay_ms(ms); + while (ms--) + { + rt_hw_us_delay(1000); + } } #if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT diff --git a/bsp/hpmicro/libraries/drivers/SConscript b/bsp/hpmicro/libraries/drivers/SConscript index d558ae6e9b..4f5fa25d84 100644 --- a/bsp/hpmicro/libraries/drivers/SConscript +++ b/bsp/hpmicro/libraries/drivers/SConscript @@ -3,6 +3,7 @@ from building import * cwd = GetCurrentDir() src = [] +src += ['drv_delay.c'] if GetDepend('BSP_USING_GPIO'): src += ['drv_gpio.c'] @@ -33,7 +34,7 @@ if GetDepend('BSP_USING_PWM') or GetDepend('BSP_USING_PWMV2'): src += ['drv_pwm.c'] if GetDepend('BSP_USING_GPTMR'): - src += ['drv_hwtimer.c'] + src += ['drv_timer.c'] if GetDepend('BSP_USING_CAN'): src += ['drv_can.c'] diff --git a/bsp/hpmicro/libraries/drivers/drv_delay.c b/bsp/hpmicro/libraries/drivers/drv_delay.c new file mode 100644 index 0000000000..f14b45a29e --- /dev/null +++ b/bsp/hpmicro/libraries/drivers/drv_delay.c @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2025 HPMicro + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include +#include "hpm_clock_drv.h" + +void rt_hw_us_delay(rt_uint32_t us) +{ + clock_cpu_delay_us(us); +} diff --git a/bsp/hpmicro/libraries/drivers/drv_hwtimer.c b/bsp/hpmicro/libraries/drivers/drv_timer.c similarity index 79% rename from bsp/hpmicro/libraries/drivers/drv_hwtimer.c rename to bsp/hpmicro/libraries/drivers/drv_timer.c index 7b29c99b51..3c3a37c4f4 100644 --- a/bsp/hpmicro/libraries/drivers/drv_hwtimer.c +++ b/bsp/hpmicro/libraries/drivers/drv_timer.c @@ -8,9 +8,9 @@ #include #include #include -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME -#include "drv_hwtimer.h" +#include "drv_timer.h" #include "board.h" #include "hpm_gptmr_drv.h" @@ -20,34 +20,34 @@ typedef struct _hpm_gptimer { GPTMR_Type *base; const char *name; - rt_hwtimer_t timer; + rt_clock_timer_t timer; uint32_t channel; clock_name_t clock_name; int32_t irq_num; uint8_t irq_priority; } hpm_gptimer_t; -static void hpm_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t hpm_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode); -static void hpm_hwtimer_stop(rt_hwtimer_t *timer); -static rt_uint32_t hpm_hwtimer_count_get(rt_hwtimer_t *timer); -static rt_err_t hpm_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void hpm_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t hpm_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode); +static void hpm_clock_timer_stop(rt_clock_timer_t *timer); +static rt_uint32_t hpm_clock_timer_count_get(rt_clock_timer_t *timer); +static rt_err_t hpm_clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); static void hpm_hwtmr_isr(hpm_gptimer_t *gptmr); -static const struct rt_hwtimer_ops hpm_hwtimer_ops = { - .init = hpm_hwtimer_init, - .start = hpm_hwtimer_start, - .stop = hpm_hwtimer_stop, - .count_get = hpm_hwtimer_count_get, - .control = hpm_hwtimer_control +static const struct rt_clock_timer_ops hpm_clock_timer_ops = { + .init = hpm_clock_timer_init, + .start = hpm_clock_timer_start, + .stop = hpm_clock_timer_stop, + .count_get = hpm_clock_timer_count_get, + .control = hpm_clock_timer_control }; -static const struct rt_hwtimer_info hpm_hwtimer_info = { +static const struct rt_clock_timer_info hpm_clock_timer_info = { .maxfreq = 100000000UL, .minfreq = 93750UL, .maxcnt = 0xFFFFFFFFUL, - .cntmode = HWTIMER_CNTMODE_UP + .cntmode = CLOCK_TIMER_CNTMODE_UP }; @@ -262,12 +262,12 @@ static void hpm_hwtmr_isr(hpm_gptimer_t *timer) uint32_t hwtmr_stat = gptmr_get_status(timer->base); if ((hwtmr_stat & GPTMR_CH_RLD_STAT_MASK(timer->channel)) != 0U) { - rt_device_hwtimer_isr(&timer->timer); + rt_clock_timer_isr(&timer->timer); gptmr_clear_status(timer->base, GPTMR_CH_RLD_STAT_MASK(timer->channel)); } } -static void hpm_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void hpm_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { hpm_gptimer_t *hpm_gptmr = (hpm_gptimer_t*)timer->parent.user_data; GPTMR_Type *base = hpm_gptmr->base; @@ -282,7 +282,7 @@ static void hpm_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t hpm_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t hpm_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { hpm_gptimer_t *hpm_gptmr = (hpm_gptimer_t*) timer->parent.user_data; GPTMR_Type *base = hpm_gptmr->base; @@ -307,7 +307,7 @@ static rt_err_t hpm_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtim return RT_EOK; } -static void hpm_hwtimer_stop(rt_hwtimer_t *timer) +static void hpm_clock_timer_stop(rt_clock_timer_t *timer) { hpm_gptimer_t *hpm_gptmr = (hpm_gptimer_t*)timer->parent.user_data; GPTMR_Type *base = hpm_gptmr->base; @@ -315,7 +315,7 @@ static void hpm_hwtimer_stop(rt_hwtimer_t *timer) gptmr_stop_counter(base, hpm_gptmr->channel); } -static rt_uint32_t hpm_hwtimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t hpm_clock_timer_count_get(rt_clock_timer_t *timer) { hpm_gptimer_t *hpm_gptmr = (hpm_gptimer_t*)timer->parent.user_data; GPTMR_Type *base = hpm_gptmr->base; @@ -325,7 +325,7 @@ static rt_uint32_t hpm_hwtimer_count_get(rt_hwtimer_t *timer) return current_cnt; } -static rt_err_t hpm_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t hpm_clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t err = RT_EOK; hpm_gptimer_t *hpm_gptmr = (hpm_gptimer_t*) timer->parent.user_data; @@ -333,16 +333,16 @@ static rt_err_t hpm_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void * switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: err = -RT_ERROR; break; - case HWTIMER_CTRL_INFO_GET: - *(rt_hwtimer_t*)args = hpm_gptmr->timer; + case CLOCK_TIMER_CTRL_INFO_GET: + *(rt_clock_timer_t*)args = hpm_gptmr->timer; break; - case HWTIMER_CTRL_MODE_SET: + case CLOCK_TIMER_CTRL_MODE_SET: hpm_gptmr->timer.mode = *(rt_uint32_t*)args; break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: gptmr_stop_counter(base, hpm_gptmr->channel); break; } @@ -351,15 +351,15 @@ static rt_err_t hpm_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void * } -int rt_hw_hwtimer_init(void) +int rt_hw_clock_timer_init(void) { int ret = RT_EOK; for (uint32_t i = 0; i < ARRAY_SIZE(s_gptimers); i++) { - s_gptimers[i]->timer.info = &hpm_hwtimer_info; - s_gptimers[i]->timer.ops = &hpm_hwtimer_ops; - ret = rt_device_hwtimer_register(&s_gptimers[i]->timer, s_gptimers[i]->name, s_gptimers[i]); + s_gptimers[i]->timer.info = &hpm_clock_timer_info; + s_gptimers[i]->timer.ops = &hpm_clock_timer_ops; + ret = rt_clock_timer_register(&s_gptimers[i]->timer, s_gptimers[i]->name, s_gptimers[i]); if (ret != RT_EOK) { LOG_E("%s register failed\n", s_gptimers[i]->name); @@ -369,6 +369,6 @@ int rt_hw_hwtimer_init(void) return ret; } -INIT_BOARD_EXPORT(rt_hw_hwtimer_init); +INIT_BOARD_EXPORT(rt_hw_clock_timer_init); #endif /* BSP_USING_GPTMR */ diff --git a/bsp/hpmicro/libraries/drivers/drv_hwtimer.h b/bsp/hpmicro/libraries/drivers/drv_timer.h similarity index 42% rename from bsp/hpmicro/libraries/drivers/drv_hwtimer.h rename to bsp/hpmicro/libraries/drivers/drv_timer.h index 29739f0640..3a6e615c0a 100644 --- a/bsp/hpmicro/libraries/drivers/drv_hwtimer.h +++ b/bsp/hpmicro/libraries/drivers/drv_timer.h @@ -5,10 +5,10 @@ * */ -#ifndef DRV_HWTIMER_H -#define DRV_HWTIMER_H +#ifndef DRV_CLOCK_TIMER_H +#define DRV_CLOCK_TIMER_H -int rt_hw_hwtimer_init(void); +int rt_hw_clock_timer_init(void); -#endif /* DRV_HWTIMER_H */ +#endif /* DRV_CLOCK_TIMER_H */ diff --git a/bsp/k210/drivers/SConscript b/bsp/k210/drivers/SConscript index cc4dc0e26d..71b5179595 100644 --- a/bsp/k210/drivers/SConscript +++ b/bsp/k210/drivers/SConscript @@ -18,12 +18,9 @@ if GetDepend('BSP_USING_LCD'): src += ['drv_mpylcd.c'] src += ['test/lcd_test.c'] -if GetDepend('RT_USING_HWTIMER'): +if GetDepend('RT_USING_CLOCK_TIME') and os.path.exists(os.path.join(cwd, 'drv_hw_timer.c')): src += ['drv_hw_timer.c'] -if GetDepend('RT_USING_CPUTIME'): - src += ['drv_cputime.c'] - if GetDepend('RT_USING_I2C'): src += ['drv_i2c.c'] diff --git a/bsp/k230/board/Kconfig b/bsp/k230/board/Kconfig index 92c7866560..11d7e6aae0 100644 --- a/bsp/k230/board/Kconfig +++ b/bsp/k230/board/Kconfig @@ -165,7 +165,7 @@ menu "Drivers Configuration" menuconfig BSP_USING_TIMERS bool "Enable Hardware Timers" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n if BSP_USING_TIMERS diff --git a/bsp/k230/drivers/interdrv/hwtimer/SConscript b/bsp/k230/drivers/interdrv/clock_timer/SConscript similarity index 100% rename from bsp/k230/drivers/interdrv/hwtimer/SConscript rename to bsp/k230/drivers/interdrv/clock_timer/SConscript diff --git a/bsp/k230/drivers/interdrv/hwtimer/drv_timer.c b/bsp/k230/drivers/interdrv/clock_timer/drv_timer.c similarity index 84% rename from bsp/k230/drivers/interdrv/hwtimer/drv_timer.c rename to bsp/k230/drivers/interdrv/clock_timer/drv_timer.c index 4ec803739c..8bc6c50fc2 100644 --- a/bsp/k230/drivers/interdrv/hwtimer/drv_timer.c +++ b/bsp/k230/drivers/interdrv/clock_timer/drv_timer.c @@ -52,8 +52,8 @@ #include "drv_timer.h" #include -static void k230_timer_stop(rt_hwtimer_t *timer); -static void k230_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void k230_timer_stop(rt_clock_timer_t *timer); +static void k230_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { struct k230_timer *kd_timer = rt_container_of(timer, struct k230_timer, device); @@ -76,7 +76,7 @@ static void k230_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t k230_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t k230_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { struct k230_timer *kd_timer = rt_container_of(timer, struct k230_timer, device); uint8_t id = kd_timer->id; @@ -87,7 +87,7 @@ static rt_err_t k230_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtime return RT_EOK; } -static void k230_timer_stop(rt_hwtimer_t *timer) +static void k230_timer_stop(rt_clock_timer_t *timer) { struct k230_timer *kd_timer = rt_container_of(timer, struct k230_timer, device); uint8_t id = kd_timer->id; @@ -96,7 +96,7 @@ static void k230_timer_stop(rt_hwtimer_t *timer) reg->channel[id].control |= TIMER_CR_INTERRUPT_MASK; } -static rt_uint32_t k230_timer_get(rt_hwtimer_t *timer) +static rt_uint32_t k230_timer_get(rt_clock_timer_t *timer) { struct k230_timer *kd_timer = rt_container_of(timer, struct k230_timer, device); uint8_t id = kd_timer->id; @@ -104,13 +104,13 @@ static rt_uint32_t k230_timer_get(rt_hwtimer_t *timer) return reg->channel[id].current_value; } -static rt_err_t k230_timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t k230_timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { struct k230_timer *kd_timer = rt_container_of(timer, struct k230_timer, device); switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: timer->freq = *((rt_uint32_t*)arg); sysctl_clk_set_leaf_parent(kd_timer->clk, kd_timer->clk_src); if (timer->freq == timer->info->minfreq) @@ -122,32 +122,32 @@ static rt_err_t k230_timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) if (timer->freq == 25*MHz) sysctl_clk_set_leaf_div(kd_timer->clk_src, 1, 4); break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: k230_timer_stop(timer); break; - case HWTIMER_CTRL_INFO_GET: + case CLOCK_TIMER_CTRL_INFO_GET: if (arg == RT_NULL) { - LOG_E("HWTIMER_CTRL_INFO_GET arg is NULL"); + LOG_E("CLOCK_TIMER_CTRL_INFO_GET arg is NULL"); return -RT_ERROR; } - *(struct rt_hwtimer_info *)arg = *(kd_timer->device.info); + *(struct rt_clock_timer_info *)arg = *(kd_timer->device.info); break; - case HWTIMER_CTRL_MODE_SET: + case CLOCK_TIMER_CTRL_MODE_SET: if (arg == RT_NULL) { - LOG_E("HWTIMER_CTRL_MODE_SET arg is NULL"); + LOG_E("CLOCK_TIMER_CTRL_MODE_SET arg is NULL"); return -RT_ERROR; } - timer->mode = *(rt_hwtimer_mode_t *)arg; - if (timer->mode != HWTIMER_MODE_ONESHOT) + timer->mode = *(rt_clock_timer_mode_t *)arg; + if (timer->mode != CLOCK_TIMER_MODE_ONESHOT) { LOG_E("mode is invalid/unsupported, only ONESHOT is supported"); return -RT_ERROR; } break; default: - LOG_E("HWTIMER_CTRL cmd is invalid"); + LOG_E("CLOCK_TIMER_CTRL cmd is invalid"); return -RT_ERROR; } return RT_EOK; @@ -165,15 +165,15 @@ static int k230_timer_fops_close(struct dfs_file* fd) return rt_device_close(device); } -static const struct rt_hwtimer_info k230_timer_info = +static const struct rt_clock_timer_info k230_timer_info = { 100000000, /* the maximum count frequency can be set */ 12500000, /* the minimum count frequency can be set */ 0xFFFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_DW, /* Increment or Decreasing count mode */ + CLOCK_TIMER_CNTMODE_DW, /* Increment or Decreasing count mode */ }; -static const struct rt_hwtimer_ops k230_timer_ops = +static const struct rt_clock_timer_ops k230_timer_ops = { .init = k230_timer_init, .start = k230_timer_start, @@ -187,20 +187,20 @@ static const struct dfs_file_ops k230_timer_fops = { k230_timer_fops_close, }; -void k230_hwtimer_isr(int vector, void *param) +void k230_clock_timer_isr(int vector, void *param) { uint32_t ret; struct k230_timer *kd_timer = (struct k230_timer *)param; - rt_hwtimer_t *hwtimer = (rt_hwtimer_t *)&(kd_timer->device); + rt_clock_timer_t *clock_timer = (rt_clock_timer_t *)&(kd_timer->device); - RT_ASSERT(kd_timer != RT_NULL && hwtimer != RT_NULL); + RT_ASSERT(kd_timer != RT_NULL && clock_timer != RT_NULL); int id = kd_timer->id; k230_timer_regs_t* reg = (k230_timer_regs_t *)kd_timer->base; ret = (reg->channel[id].eoi); - rt_device_hwtimer_isr(hwtimer); + rt_clock_timer_isr(clock_timer); } static struct k230_timer timer_devices[] = @@ -211,7 +211,7 @@ static struct k230_timer timer_devices[] = .device.ops = &k230_timer_ops, .device.parent.fops = &k230_timer_fops, - .name = "hwtimer0", + .name = "clock_timer0", .id = 0, .clk = SYSCTL_CLK_TIMER0, .clk_src = SYSCTL_CLK_TIMER0_SRC, @@ -225,7 +225,7 @@ static struct k230_timer timer_devices[] = .device.ops = &k230_timer_ops, .device.parent.fops = &k230_timer_fops, - .name = "hwtimer1", + .name = "clock_timer1", .id = 1, .clk = SYSCTL_CLK_TIMER1, .clk_src = SYSCTL_CLK_TIMER1_SRC, @@ -239,7 +239,7 @@ static struct k230_timer timer_devices[] = .device.ops = &k230_timer_ops, .device.parent.fops = &k230_timer_fops, - .name = "hwtimer2", + .name = "clock_timer2", .id = 2, .clk = SYSCTL_CLK_TIMER2, .clk_src = SYSCTL_CLK_TIMER2_SRC, @@ -253,7 +253,7 @@ static struct k230_timer timer_devices[] = .device.ops = &k230_timer_ops, .device.parent.fops = &k230_timer_fops, - .name = "hwtimer3", + .name = "clock_timer3", .id = 3, .clk = SYSCTL_CLK_TIMER3, .clk_src = SYSCTL_CLK_TIMER3_SRC, @@ -267,7 +267,7 @@ static struct k230_timer timer_devices[] = .device.ops = &k230_timer_ops, .device.parent.fops = &k230_timer_fops, - .name = "hwtimer4", + .name = "clock_timer4", .id = 4, .clk = SYSCTL_CLK_TIMER4, .clk_src = SYSCTL_CLK_TIMER4_SRC, @@ -281,7 +281,7 @@ static struct k230_timer timer_devices[] = .device.ops = &k230_timer_ops, .device.parent.fops = &k230_timer_fops, - .name = "hwtimer5", + .name = "clock_timer5", .id = 5, .clk = SYSCTL_CLK_TIMER5, .clk_src = SYSCTL_CLK_TIMER5_SRC, @@ -315,7 +315,7 @@ int rt_hw_timer_init(void) { timer_devices[i].base = (rt_ubase_t)base; - if (rt_device_hwtimer_register(&timer_devices[i].device, timer_devices[i].name, RT_NULL) != RT_EOK) + if (rt_clock_timer_register(&timer_devices[i].device, timer_devices[i].name, RT_NULL) != RT_EOK) { LOG_E("%s register failed!", timer_devices[i].name); return -RT_ERROR; @@ -323,7 +323,7 @@ int rt_hw_timer_init(void) LOG_D("%s register OK!", timer_devices[i].name); rt_hw_interrupt_install(timer_devices[i].irq_num, - k230_hwtimer_isr, + k230_clock_timer_isr, &timer_devices[i], timer_devices[i].name); rt_hw_interrupt_umask(timer_devices[i].irq_num); diff --git a/bsp/k230/drivers/interdrv/hwtimer/drv_timer.h b/bsp/k230/drivers/interdrv/clock_timer/drv_timer.h similarity index 98% rename from bsp/k230/drivers/interdrv/hwtimer/drv_timer.h rename to bsp/k230/drivers/interdrv/clock_timer/drv_timer.h index 71392243bc..e0d127bc43 100644 --- a/bsp/k230/drivers/interdrv/hwtimer/drv_timer.h +++ b/bsp/k230/drivers/interdrv/clock_timer/drv_timer.h @@ -32,7 +32,7 @@ #ifndef DRV_TIMER_H__ #define DRV_TIMER_H__ #include -#include +#include #include "sysctl_clk.h" #include "board.h" @@ -85,7 +85,7 @@ typedef struct _k230_timer_regs } __attribute__((packed, aligned(4))) k230_timer_regs_t; struct k230_timer { - struct rt_hwtimer_device device; + struct rt_clock_timer_device device; const char *name; rt_ubase_t base; uint32_t id; diff --git a/bsp/k230/drivers/utest/test_timer.c b/bsp/k230/drivers/utest/test_timer.c index 50a5578a70..ddcffbacbd 100644 --- a/bsp/k230/drivers/utest/test_timer.c +++ b/bsp/k230/drivers/utest/test_timer.c @@ -30,9 +30,9 @@ */ #include -#include +#include -#include "../interdrv/hwtimer/drv_timer.h" +#include "../interdrv/clock_timer/drv_timer.h" #include "utest.h" /* @@ -46,8 +46,8 @@ * 6. Trigger the interrupt callback when the timer times out and print a message. */ -#define DEVICE_NAME0 "hwtimer0" -#define DEVICE_NAME1 "hwtimer1" +#define DEVICE_NAME0 "clock_timer0" +#define DEVICE_NAME1 "clock_timer1" static rt_device_t tmr_dev_0; static rt_device_t tmr_dev_1; @@ -59,24 +59,24 @@ static rt_device_t tmr_dev_1; static rt_err_t tmr_timeout_cb(rt_device_t dev, rt_size_t size) { - struct rt_hwtimer_device *rt_timer = rt_container_of(dev, struct rt_hwtimer_device, parent); + struct rt_clock_timer_device *rt_timer = rt_container_of(dev, struct rt_clock_timer_device, parent); struct k230_timer *kd_timer = rt_container_of(rt_timer, struct k230_timer, device); LOG_I("---> [%s] timeout callback fucntion!\n", kd_timer->name); return RT_EOK; } -static void test_hwtimer(void) +static void test_clock_timer(void) { - rt_hwtimerval_t timerval; - rt_hwtimer_mode_t mode; + rt_clock_timerval_t timerval; + rt_clock_timer_mode_t mode; rt_size_t tsize; rt_uint32_t freq = 25000000; /* Frequency options: 12.5M 25M 50M 100M */ rt_err_t ret; rt_ssize_t size; int loop_count = 0; - LOG_I("test_hwtimer start"); + LOG_I("test_clock_timer start"); tmr_dev_0 = rt_device_find(DEVICE_NAME0); uassert_not_null(tmr_dev_0); @@ -88,7 +88,7 @@ static void test_hwtimer(void) ret = rt_device_open(tmr_dev_1, RT_DEVICE_OFLAG_RDWR); uassert_int_equal(ret, RT_EOK); - ret = rt_device_control(tmr_dev_0, HWTIMER_CTRL_FREQ_SET, &freq); + ret = rt_device_control(tmr_dev_0, CLOCK_TIMER_CTRL_FREQ_SET, &freq); uassert_int_equal(ret, RT_EOK); ret = rt_device_set_rx_indicate(tmr_dev_0, tmr_timeout_cb); @@ -99,8 +99,8 @@ static void test_hwtimer(void) timerval.sec = TIMEOUT_SEC_0; timerval.usec = 0; tsize = sizeof(timerval); - mode = HWTIMER_MODE_ONESHOT; - ret = rt_device_control(tmr_dev_0, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_ONESHOT; + ret = rt_device_control(tmr_dev_0, CLOCK_TIMER_CTRL_MODE_SET, &mode); uassert_int_equal(ret, RT_EOK); size = rt_device_write(tmr_dev_0, 0, &timerval, tsize); uassert_int_equal(size, tsize); @@ -109,8 +109,8 @@ static void test_hwtimer(void) timerval.sec = TIMEOUT_SEC_1; timerval.usec = 0; tsize = sizeof(timerval); - mode = HWTIMER_MODE_ONESHOT; - ret = rt_device_control(tmr_dev_1, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_ONESHOT; + ret = rt_device_control(tmr_dev_1, CLOCK_TIMER_CTRL_MODE_SET, &mode); uassert_int_equal(ret, RT_EOK); size = rt_device_write(tmr_dev_1, 0, &timerval, tsize); uassert_int_equal(size, tsize); @@ -133,12 +133,12 @@ static void test_hwtimer(void) uassert_int_equal(ret, RT_EOK); ret = rt_device_close(tmr_dev_1); uassert_int_equal(ret, RT_EOK); - LOG_I("test_hwtimer end"); + LOG_I("test_clock_timer end"); } static void hw_timer_testcase(void) { - UTEST_UNIT_RUN(test_hwtimer); + UTEST_UNIT_RUN(test_clock_timer); } static rt_err_t utest_tc_init(void) diff --git a/bsp/mm32/libraries/MM32F3270_HAL/SConscript b/bsp/mm32/libraries/MM32F3270_HAL/SConscript index dd7e019ef4..2ca9f25edd 100644 --- a/bsp/mm32/libraries/MM32F3270_HAL/SConscript +++ b/bsp/mm32/libraries/MM32F3270_HAL/SConscript @@ -29,7 +29,7 @@ if GetDepend(['RT_USING_SPI']): if GetDepend(['RT_USING_USB']): src += ['MM32F3270_HAL_Driver/Src/hal_usb.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): +if GetDepend(['RT_USING_CLOCK_TIME']) or GetDepend(['RT_USING_PWM']): src += ['MM32F3270_HAL_Driver/Src/hal_tim_16b.c'] src += ['MM32F3270_HAL_Driver/Src/hal_tim_32b.c'] src += ['MM32F3270_HAL_Driver/Src/hal_tim_adv.c'] diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/SConscript b/bsp/n32/libraries/N32G43x_Firmware_Library/SConscript index 24b530897e..b935a5a6b6 100644 --- a/bsp/n32/libraries/N32G43x_Firmware_Library/SConscript +++ b/bsp/n32/libraries/N32G43x_Firmware_Library/SConscript @@ -33,7 +33,7 @@ if GetDepend(['RT_USING_ADC']): if GetDepend(['RT_USING_DAC']): src += ['n32g43x_std_periph_driver/src/n32g43x_dac.c'] -if GetDepend(['RT_USING_HWTIMER']): +if GetDepend(['RT_USING_CLOCK_TIME']): src += ['n32g43x_std_periph_driver/src/n32g43x_tim.c'] if GetDepend(['RT_USING_RTC']): diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/SConscript b/bsp/n32/libraries/N32G45x_Firmware_Library/SConscript index fc0934459f..3b0502c2c4 100644 --- a/bsp/n32/libraries/N32G45x_Firmware_Library/SConscript +++ b/bsp/n32/libraries/N32G45x_Firmware_Library/SConscript @@ -38,7 +38,7 @@ if GetDepend(['RT_USING_ADC']): if GetDepend(['RT_USING_DAC']): src += ['n32g45x_std_periph_driver/src/n32g45x_dac.c'] -if GetDepend(['RT_USING_HWTIMER']): +if GetDepend(['RT_USING_CLOCK_TIME']): src += ['n32g45x_std_periph_driver/src/n32g45x_tim.c'] if GetDepend(['RT_USING_RTC']): diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/SConscript b/bsp/n32/libraries/N32G4FR_Firmware_Library/SConscript index d10b610de1..7d39f87d20 100644 --- a/bsp/n32/libraries/N32G4FR_Firmware_Library/SConscript +++ b/bsp/n32/libraries/N32G4FR_Firmware_Library/SConscript @@ -32,7 +32,7 @@ if GetDepend(['RT_USING_ADC']): if GetDepend(['RT_USING_DAC']): src += ['n32g4fr_std_periph_driver/src/n32g4fr_dac.c'] -if GetDepend(['RT_USING_HWTIMER']): +if GetDepend(['RT_USING_CLOCK_TIME']): src += ['n32g4fr_std_periph_driver/src/n32g4fr_tim.c'] if GetDepend(['RT_USING_RTC']): diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/SConscript b/bsp/n32/libraries/N32L40x_Firmware_Library/SConscript index 49b8b0a13b..05abfbd596 100644 --- a/bsp/n32/libraries/N32L40x_Firmware_Library/SConscript +++ b/bsp/n32/libraries/N32L40x_Firmware_Library/SConscript @@ -33,7 +33,7 @@ if GetDepend(['RT_USING_ADC']): if GetDepend(['RT_USING_DAC']): src += ['n32l40x_std_periph_driver/src/n32l40x_dac.c'] -if GetDepend(['RT_USING_HWTIMER']): +if GetDepend(['RT_USING_CLOCK_TIME']): src += ['n32l40x_std_periph_driver/src/n32l40x_tim.c'] if GetDepend(['RT_USING_RTC']): diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/SConscript b/bsp/n32/libraries/N32L43x_Firmware_Library/SConscript index f8180cfb79..ad89d20dd6 100644 --- a/bsp/n32/libraries/N32L43x_Firmware_Library/SConscript +++ b/bsp/n32/libraries/N32L43x_Firmware_Library/SConscript @@ -33,7 +33,7 @@ if GetDepend(['RT_USING_ADC']): if GetDepend(['RT_USING_DAC']): src += ['n32l43x_std_periph_driver/src/n32l43x_dac.c'] -if GetDepend(['RT_USING_HWTIMER']): +if GetDepend(['RT_USING_CLOCK_TIME']): src += ['n32l43x_std_periph_driver/src/n32l43x_tim.c'] if GetDepend(['RT_USING_RTC']): diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/SConscript b/bsp/n32/libraries/N32WB452_Firmware_Library/SConscript index ec1ac4502a..a8862b66ef 100644 --- a/bsp/n32/libraries/N32WB452_Firmware_Library/SConscript +++ b/bsp/n32/libraries/N32WB452_Firmware_Library/SConscript @@ -33,7 +33,7 @@ if GetDepend(['RT_USING_ADC']): if GetDepend(['RT_USING_DAC']): src += ['n32wb452_std_periph_driver/src/n32wb452_dac.c'] -if GetDepend(['RT_USING_HWTIMER']): +if GetDepend(['RT_USING_CLOCK_TIME']): src += ['n32wb452_std_periph_driver/src/n32wb452_tim.c'] if GetDepend(['RT_USING_RTC']): diff --git a/bsp/n32/libraries/n32_drivers/SConscript b/bsp/n32/libraries/n32_drivers/SConscript index 107e4d1b33..b97376e388 100644 --- a/bsp/n32/libraries/n32_drivers/SConscript +++ b/bsp/n32/libraries/n32_drivers/SConscript @@ -17,8 +17,8 @@ if GetDepend(['RT_USING_SERIAL']): else: src += ['drv_usart.c'] -if GetDepend(['RT_USING_HWTIMER']): - src += ['drv_hwtimer.c'] +if GetDepend(['RT_USING_CLOCK_TIME']): + src += ['drv_timer.c'] if GetDepend(['RT_USING_PWM']): src += ['drv_pwm.c'] diff --git a/bsp/n32/libraries/n32_drivers/drv_hwtimer.c b/bsp/n32/libraries/n32_drivers/drv_timer.c similarity index 66% rename from bsp/n32/libraries/n32_drivers/drv_hwtimer.c rename to bsp/n32/libraries/n32_drivers/drv_timer.c index 575f994490..890fd9cd78 100644 --- a/bsp/n32/libraries/n32_drivers/drv_hwtimer.c +++ b/bsp/n32/libraries/n32_drivers/drv_timer.c @@ -8,17 +8,17 @@ * 2022-10-19 Nations first version */ -#include "drv_hwtimer.h" +#include "drv_timer.h" -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME -#if defined(BSP_USING_HWTIMER1) || defined(BSP_USING_HWTIMER2) || defined(BSP_USING_HWTIMER3) || \ - defined(BSP_USING_HWTIMER4) || defined(BSP_USING_HWTIMER5) || defined(BSP_USING_HWTIMER6) || \ - defined(BSP_USING_HWTIMER7) || defined(BSP_USING_HWTIMER8) || defined(BSP_USING_HWTIMER9) +#if defined(BSP_USING_CLOCK_TIMER1) || defined(BSP_USING_CLOCK_TIMER2) || defined(BSP_USING_CLOCK_TIMER3) || \ + defined(BSP_USING_CLOCK_TIMER4) || defined(BSP_USING_CLOCK_TIMER5) || defined(BSP_USING_CLOCK_TIMER6) || \ + defined(BSP_USING_CLOCK_TIMER7) || defined(BSP_USING_CLOCK_TIMER8) || defined(BSP_USING_CLOCK_TIMER9) -static struct n32_hwtimer_config hwtimer_config[] = +static struct n32_clock_timer_config clock_timer_config[] = { -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 { "timer1", TIM1, @@ -26,7 +26,7 @@ static struct n32_hwtimer_config hwtimer_config[] = }, #endif -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 { "timer2", TIM2, @@ -34,7 +34,7 @@ static struct n32_hwtimer_config hwtimer_config[] = }, #endif -#ifdef BSP_USING_HWTIMER3 +#ifdef BSP_USING_CLOCK_TIMER3 { "timer3", TIM3, @@ -42,7 +42,7 @@ static struct n32_hwtimer_config hwtimer_config[] = }, #endif -#ifdef BSP_USING_HWTIMER4 +#ifdef BSP_USING_CLOCK_TIMER4 { "timer4", TIM4, @@ -50,7 +50,7 @@ static struct n32_hwtimer_config hwtimer_config[] = }, #endif -#ifdef BSP_USING_HWTIMER5 +#ifdef BSP_USING_CLOCK_TIMER5 { "timer5", TIM5, @@ -58,7 +58,7 @@ static struct n32_hwtimer_config hwtimer_config[] = }, #endif -#ifdef BSP_USING_HWTIMER6 +#ifdef BSP_USING_CLOCK_TIMER6 { "timer6", TIM6, @@ -66,7 +66,7 @@ static struct n32_hwtimer_config hwtimer_config[] = }, #endif -#ifdef BSP_USING_HWTIMER7 +#ifdef BSP_USING_CLOCK_TIMER7 { "timer7", TIM7, @@ -74,7 +74,7 @@ static struct n32_hwtimer_config hwtimer_config[] = }, #endif -#ifdef BSP_USING_HWTIMER8 +#ifdef BSP_USING_CLOCK_TIMER8 { "timer8", TIM8, @@ -82,7 +82,7 @@ static struct n32_hwtimer_config hwtimer_config[] = }, #endif -#ifdef BSP_USING_HWTIMER9 +#ifdef BSP_USING_CLOCK_TIMER9 { "timer9", TIM9, @@ -100,47 +100,47 @@ static void caculate_tim_count() { uint8_t count = 0; -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 tim1_count = count; count++; #endif -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 tim2_count = count; count++; #endif -#ifdef BSP_USING_HWTIMER3 +#ifdef BSP_USING_CLOCK_TIMER3 tim3_count = count; count++; #endif -#ifdef BSP_USING_HWTIMER4 +#ifdef BSP_USING_CLOCK_TIMER4 tim4_count = count; count++; #endif -#ifdef BSP_USING_HWTIMER5 +#ifdef BSP_USING_CLOCK_TIMER5 tim5_count = count; count++; #endif -#ifdef BSP_USING_HWTIMER6 +#ifdef BSP_USING_CLOCK_TIMER6 tim6_count = count; count++; #endif -#ifdef BSP_USING_HWTIMER7 +#ifdef BSP_USING_CLOCK_TIMER7 tim7_count = count; count++; #endif -#ifdef BSP_USING_HWTIMER8 +#ifdef BSP_USING_CLOCK_TIMER8 tim8_count = count; count++; #endif -#ifdef BSP_USING_HWTIMER9 +#ifdef BSP_USING_CLOCK_TIMER9 tim9_count = count; count++; #endif @@ -149,22 +149,22 @@ static void caculate_tim_count() #define BITS(start, end) ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end)))) #define GET_BITS(regval, start, end) (((regval) & BITS((start),(end))) >> (start)) -static struct n32_hwtimer hwtimer_obj[sizeof(hwtimer_config) / sizeof(hwtimer_config[0])] = {0}; +static struct n32_clock_timer clock_timer_obj[sizeof(clock_timer_config) / sizeof(clock_timer_config[0])] = {0}; -static rt_err_t n32_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t n32_clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t err = RT_EOK; - struct n32_hwtimer_config *config; + struct n32_clock_timer_config *config; RCC_ClocksType RCC_ClockFreq; RT_ASSERT(timer != RT_NULL); - config = (struct n32_hwtimer_config *)timer->parent.user_data; + config = (struct n32_clock_timer_config *)timer->parent.user_data; RCC_GetClocksFreqValue(&RCC_ClockFreq); switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint8_t clkpre; @@ -188,7 +188,7 @@ static rt_err_t n32_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void * config->timer_periph->EVTGEN |= TIM_EVTGEN_UDGN; } break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: TIM_Enable(config->timer_periph, DISABLE); break; default: @@ -198,13 +198,13 @@ static rt_err_t n32_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void * return err; } -static rt_uint32_t n32_hwtimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t n32_clock_timer_count_get(rt_clock_timer_t *timer) { rt_uint32_t CurrentTimer_Count; - struct n32_hwtimer_config *config; + struct n32_clock_timer_config *config; RT_ASSERT(timer != RT_NULL); - config = (struct n32_hwtimer_config *)timer->parent.user_data; + config = (struct n32_clock_timer_config *)timer->parent.user_data; CurrentTimer_Count = TIM_GetCnt(config->timer_periph); @@ -232,13 +232,13 @@ void TIM_NVIC_Config(IRQn_Type IRQn, uint8_t PreemptionPriority, uint8_t SubPrio } -static void n32_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void n32_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { - struct n32_hwtimer_config *config; + struct n32_clock_timer_config *config; TIM_TimeBaseInitType TIM_TimeBaseStructure; RCC_ClocksType RCC_ClockFreq; RT_ASSERT(timer != RT_NULL); - config = (struct n32_hwtimer_config *)timer->parent.user_data; + config = (struct n32_clock_timer_config *)timer->parent.user_data; if (state == 1) { @@ -272,7 +272,7 @@ static void n32_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1; TIM_TimeBaseStructure.RepetCnt = 0; - if (timer->info->cntmode == HWTIMER_CNTMODE_UP) + if (timer->info->cntmode == CLOCK_TIMER_CNTMODE_UP) { TIM_TimeBaseStructure.CntMode = TIM_CNT_MODE_UP; } @@ -294,18 +294,18 @@ static void n32_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t n32_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t n32_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { - struct n32_hwtimer_config *config; + struct n32_clock_timer_config *config; RT_ASSERT(timer != RT_NULL); - config = (struct n32_hwtimer_config *)timer->parent.user_data; + config = (struct n32_clock_timer_config *)timer->parent.user_data; /* set tim cnt */ TIM_SetCnt(config->timer_periph, 0); /* set tim arr */ TIM_SetAutoReload(config->timer_periph, cnt - 1); - if (mode == HWTIMER_MODE_ONESHOT) + if (mode == CLOCK_TIMER_MODE_ONESHOT) { TIM_SelectOnePulseMode(config->timer_periph, TIM_OPMODE_SINGLE); } @@ -324,32 +324,32 @@ static rt_err_t n32_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtim return RT_EOK; } -static void n32_hwtimer_stop(rt_hwtimer_t *timer) +static void n32_clock_timer_stop(rt_clock_timer_t *timer) { - struct n32_hwtimer_config *config; + struct n32_clock_timer_config *config; RT_ASSERT(timer != RT_NULL); - config = (struct n32_hwtimer_config *)timer->parent.user_data; + config = (struct n32_clock_timer_config *)timer->parent.user_data; TIM_Enable(config->timer_periph, DISABLE); TIM_NVIC_Config(config->irqn, 3, 0, DISABLE); } -static const struct rt_hwtimer_ops n32_hwtimer_ops = +static const struct rt_clock_timer_ops n32_clock_timer_ops = { - .init = n32_hwtimer_init, - .start = n32_hwtimer_start, - .stop = n32_hwtimer_stop, - .count_get = n32_hwtimer_count_get, - .control = n32_hwtimer_control, + .init = n32_clock_timer_init, + .start = n32_clock_timer_start, + .stop = n32_clock_timer_stop, + .count_get = n32_clock_timer_count_get, + .control = n32_clock_timer_control, }; -static const struct rt_hwtimer_info n32_hwtimer_info = +static const struct rt_clock_timer_info n32_clock_timer_info = { 1000000, /* the maximum count frequency can be set */ 2000, /* the minimum count frequency can be set */ 0xFFFF, - HWTIMER_CNTMODE_UP, + CLOCK_TIMER_CNTMODE_UP, }; /** @@ -425,187 +425,187 @@ void TIM_IRQHandler(TIM_Module* timer_periph) } } -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 void TIM1_UP_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - TIM_ClrIntPendingBit(hwtimer_obj[tim1_count].config->timer_periph, TIM_INT_UPDATE); - rt_device_hwtimer_isr(&hwtimer_obj[tim1_count].time_device); + TIM_ClrIntPendingBit(clock_timer_obj[tim1_count].config->timer_periph, TIM_INT_UPDATE); + rt_clock_timer_isr(&clock_timer_obj[tim1_count].time_device); /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 void TIM2_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - TIM_ClrIntPendingBit(hwtimer_obj[tim2_count].config->timer_periph, TIM_INT_UPDATE); - rt_device_hwtimer_isr(&hwtimer_obj[tim2_count].time_device); + TIM_ClrIntPendingBit(clock_timer_obj[tim2_count].config->timer_periph, TIM_INT_UPDATE); + rt_clock_timer_isr(&clock_timer_obj[tim2_count].time_device); /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER3 +#ifdef BSP_USING_CLOCK_TIMER3 void TIM3_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - TIM_ClrIntPendingBit(hwtimer_obj[tim3_count].config->timer_periph, TIM_INT_UPDATE); - rt_device_hwtimer_isr(&hwtimer_obj[tim3_count].time_device); + TIM_ClrIntPendingBit(clock_timer_obj[tim3_count].config->timer_periph, TIM_INT_UPDATE); + rt_clock_timer_isr(&clock_timer_obj[tim3_count].time_device); /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER4 +#ifdef BSP_USING_CLOCK_TIMER4 void TIM4_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - TIM_ClrIntPendingBit(hwtimer_obj[tim4_count].config->timer_periph, TIM_INT_UPDATE); - rt_device_hwtimer_isr(&hwtimer_obj[tim4_count].time_device); + TIM_ClrIntPendingBit(clock_timer_obj[tim4_count].config->timer_periph, TIM_INT_UPDATE); + rt_clock_timer_isr(&clock_timer_obj[tim4_count].time_device); /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER5 +#ifdef BSP_USING_CLOCK_TIMER5 void TIM5_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - TIM_ClrIntPendingBit(hwtimer_obj[tim5_count].config->timer_periph, TIM_INT_UPDATE); - rt_device_hwtimer_isr(&hwtimer_obj[tim5_count].time_device); + TIM_ClrIntPendingBit(clock_timer_obj[tim5_count].config->timer_periph, TIM_INT_UPDATE); + rt_clock_timer_isr(&clock_timer_obj[tim5_count].time_device); /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER6 +#ifdef BSP_USING_CLOCK_TIMER6 void TIM6_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - TIM_ClrIntPendingBit(hwtimer_obj[tim6_count].config->timer_periph, TIM_INT_UPDATE); - rt_device_hwtimer_isr(&hwtimer_obj[tim6_count].time_device); + TIM_ClrIntPendingBit(clock_timer_obj[tim6_count].config->timer_periph, TIM_INT_UPDATE); + rt_clock_timer_isr(&clock_timer_obj[tim6_count].time_device); /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER7 +#ifdef BSP_USING_CLOCK_TIMER7 void TIM7_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - TIM_ClrIntPendingBit(hwtimer_obj[tim7_count].config->timer_periph, TIM_INT_UPDATE); - rt_device_hwtimer_isr(&hwtimer_obj[tim7_count].time_device); + TIM_ClrIntPendingBit(clock_timer_obj[tim7_count].config->timer_periph, TIM_INT_UPDATE); + rt_clock_timer_isr(&clock_timer_obj[tim7_count].time_device); /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER8 +#ifdef BSP_USING_CLOCK_TIMER8 void TIM8_UP_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - TIM_ClrIntPendingBit(hwtimer_obj[tim8_count].config->timer_periph, TIM_INT_UPDATE); - rt_device_hwtimer_isr(&hwtimer_obj[tim8_count].time_device); + TIM_ClrIntPendingBit(clock_timer_obj[tim8_count].config->timer_periph, TIM_INT_UPDATE); + rt_clock_timer_isr(&clock_timer_obj[tim8_count].time_device); /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_HWTIMER9 +#ifdef BSP_USING_CLOCK_TIMER9 void TIM9_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - TIM_ClrIntPendingBit(hwtimer_obj[tim9_count].config->timer_periph, TIM_INT_UPDATE); - rt_device_hwtimer_isr(&hwtimer_obj[tim9_count].time_device); + TIM_ClrIntPendingBit(clock_timer_obj[tim9_count].config->timer_periph, TIM_INT_UPDATE); + rt_clock_timer_isr(&clock_timer_obj[tim9_count].time_device); /* leave interrupt */ rt_interrupt_leave(); } #endif -int rt_hwtimer_init(void) +int rt_clock_timer_init(void) { int i = 0; int result = RT_EOK; -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_TIM1, ENABLE); #endif -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM2, ENABLE); #endif -#ifdef BSP_USING_HWTIMER3 +#ifdef BSP_USING_CLOCK_TIMER3 RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM3, ENABLE); #endif -#ifdef BSP_USING_HWTIMER4 +#ifdef BSP_USING_CLOCK_TIMER4 RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM4, ENABLE); #endif -#ifdef BSP_USING_HWTIMER5 +#ifdef BSP_USING_CLOCK_TIMER5 RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM5, ENABLE); #endif -#ifdef BSP_USING_HWTIMER6 +#ifdef BSP_USING_CLOCK_TIMER6 RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM6, ENABLE); #endif -#ifdef BSP_USING_HWTIMER7 +#ifdef BSP_USING_CLOCK_TIMER7 RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM7, ENABLE); #endif -#ifdef BSP_USING_HWTIMER8 +#ifdef BSP_USING_CLOCK_TIMER8 RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_TIM8, ENABLE); #endif -#ifdef BSP_USING_HWTIMER9 +#ifdef BSP_USING_CLOCK_TIMER9 RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM9, ENABLE); #endif caculate_tim_count(); - for (i = 0; i < sizeof(hwtimer_obj) / sizeof(hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(clock_timer_obj) / sizeof(clock_timer_obj[0]); i++) { - hwtimer_obj[i].time_device.info = &n32_hwtimer_info; - hwtimer_obj[i].time_device.ops = &n32_hwtimer_ops; - hwtimer_obj[i].config = &hwtimer_config[i]; - rt_device_hwtimer_register(&hwtimer_obj[i].time_device, \ - hwtimer_obj[i].config->name, hwtimer_obj[i].config); + clock_timer_obj[i].time_device.info = &n32_clock_timer_info; + clock_timer_obj[i].time_device.ops = &n32_clock_timer_ops; + clock_timer_obj[i].config = &clock_timer_config[i]; + rt_clock_timer_register(&clock_timer_obj[i].time_device, \ + clock_timer_obj[i].config->name, clock_timer_obj[i].config); } return result; } -INIT_DEVICE_EXPORT(rt_hwtimer_init); +INIT_DEVICE_EXPORT(rt_clock_timer_init); -#endif /* defined(BSP_USING_HWTIMERx) */ -#endif /* RT_USING_HWTIMER */ +#endif /* defined(BSP_USING_CLOCK_TIMERx) */ +#endif /* RT_USING_CLOCK_TIME */ diff --git a/bsp/n32/libraries/n32_drivers/drv_hwtimer.h b/bsp/n32/libraries/n32_drivers/drv_timer.h similarity index 64% rename from bsp/n32/libraries/n32_drivers/drv_hwtimer.h rename to bsp/n32/libraries/n32_drivers/drv_timer.h index ee1368ae36..c0cf897682 100644 --- a/bsp/n32/libraries/n32_drivers/drv_hwtimer.h +++ b/bsp/n32/libraries/n32_drivers/drv_timer.h @@ -8,8 +8,8 @@ * 2022-10-19 Nations first version */ -#ifndef __DRV_HWTIMER__ -#define __DRV_HWTIMER__ +#ifndef __DRV_CLOCK_TIMER__ +#define __DRV_CLOCK_TIMER__ #include #include @@ -21,23 +21,23 @@ extern "C" { #endif /* n32 config class */ -struct n32_hwtimer_config +struct n32_clock_timer_config { const char *name; TIM_Module* timer_periph; IRQn_Type irqn; }; -struct n32_hwtimer +struct n32_clock_timer { - rt_hwtimer_t time_device; - struct n32_hwtimer_config *config; + rt_clock_timer_t time_device; + struct n32_clock_timer_config *config; }; -int rt_hwtimer_init(void); +int rt_clock_timer_init(void); #ifdef __cplusplus } #endif -#endif /* __DRV_HWTIMER__ */ +#endif /* __DRV_CLOCK_TIMER__ */ diff --git a/bsp/n32/n32g43xcl-stb/README.md b/bsp/n32/n32g43xcl-stb/README.md index ba8b0db849..9e389606a2 100644 --- a/bsp/n32/n32g43xcl-stb/README.md +++ b/bsp/n32/n32g43xcl-stb/README.md @@ -45,7 +45,7 @@ N32G43XCL_STB 板级包支持MDK5开发环境和GCC编译器,以下是具体 | ADC | 支持 | ADC | | CAN | 支持 | CAN | | DAC | 支持 | DAC | -| HWTIMER | 支持 | TIMER1/2/3/4/5/6/7/8/9 | +| CLOCK_TIMER | 支持 | TIMER1/2/3/4/5/6/7/8/9 | | WDT | 支持 | IWDG | | RTC | 支持 | 时钟源支持LSE/LSI/HSE | diff --git a/bsp/n32/n32g43xcl-stb/board/Kconfig b/bsp/n32/n32g43xcl-stb/board/Kconfig index a5bfedd61c..cf2a42fedd 100644 --- a/bsp/n32/n32g43xcl-stb/board/Kconfig +++ b/bsp/n32/n32g43xcl-stb/board/Kconfig @@ -107,45 +107,45 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n - config BSP_USING_HWTIMER9 - bool "using hwtimer9" + config BSP_USING_CLOCK_TIMER9 + bool "using clock_timer9" default n endif diff --git a/bsp/n32/n32g43xcl-stb/project.ewp b/bsp/n32/n32g43xcl-stb/project.ewp index 84925d44d1..9a4a86e020 100644 --- a/bsp/n32/n32g43xcl-stb/project.ewp +++ b/bsp/n32/n32g43xcl-stb/project.ewp @@ -2237,7 +2237,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2321,7 +2321,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32g43xcl-stb/project.uvprojx b/bsp/n32/n32g43xcl-stb/project.uvprojx index 8d75374a6f..8c33d032b7 100644 --- a/bsp/n32/n32g43xcl-stb/project.uvprojx +++ b/bsp/n32/n32g43xcl-stb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32/n32g457qel-stb/README.md b/bsp/n32/n32g457qel-stb/README.md index f6e0822793..a64e39d489 100644 --- a/bsp/n32/n32g457qel-stb/README.md +++ b/bsp/n32/n32g457qel-stb/README.md @@ -45,7 +45,7 @@ N32G457QEL-STB 板级包支持MDK5开发环境和GCC编译器,以下是具体 | ADC | 支持 | ADC1/2/3/4 | | CAN | 支持 | CAN1/2 | | DAC | 支持 | DAC2, DAC1由于与音频芯片直连,工作会受到影响 | -| HWTIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | +| CLOCK_TIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | | WDT | 支持 | IWDG | | RTC | 支持 | 时钟源支持LSE/LSI/HSE | diff --git a/bsp/n32/n32g457qel-stb/board/Kconfig b/bsp/n32/n32g457qel-stb/board/Kconfig index 2e186f1a74..ea112b3c23 100644 --- a/bsp/n32/n32g457qel-stb/board/Kconfig +++ b/bsp/n32/n32g457qel-stb/board/Kconfig @@ -114,34 +114,34 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n endif diff --git a/bsp/n32/n32g457qel-stb/project.ewp b/bsp/n32/n32g457qel-stb/project.ewp index bd8690c050..8f1108bf10 100644 --- a/bsp/n32/n32g457qel-stb/project.ewp +++ b/bsp/n32/n32g457qel-stb/project.ewp @@ -2237,7 +2237,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2321,7 +2321,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32g457qel-stb/project.uvprojx b/bsp/n32/n32g457qel-stb/project.uvprojx index b994bc1107..6075cab541 100644 --- a/bsp/n32/n32g457qel-stb/project.uvprojx +++ b/bsp/n32/n32g457qel-stb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32/n32g45xcl-stb/README.md b/bsp/n32/n32g45xcl-stb/README.md index ca50472b84..6138e07cb5 100644 --- a/bsp/n32/n32g45xcl-stb/README.md +++ b/bsp/n32/n32g45xcl-stb/README.md @@ -45,7 +45,7 @@ N32G45XCL-STB 板级包支持MDK5开发环境和GCC编译器,以下是具体 | ADC | 支持 | ADC1/2/3/4 | | CAN | 支持 | CAN1/2 | | DAC | 支持 | DAC1/2 | -| HWTIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | +| CLOCK_TIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | | WDT | 支持 | IWDG | | RTC | 支持 | 时钟源支持LSE/LSI/HSE | diff --git a/bsp/n32/n32g45xcl-stb/board/Kconfig b/bsp/n32/n32g45xcl-stb/board/Kconfig index ac08b2c594..b7034deff0 100644 --- a/bsp/n32/n32g45xcl-stb/board/Kconfig +++ b/bsp/n32/n32g45xcl-stb/board/Kconfig @@ -114,34 +114,34 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n endif diff --git a/bsp/n32/n32g45xcl-stb/project.ewp b/bsp/n32/n32g45xcl-stb/project.ewp index c6ed49af2a..8e9be79e66 100644 --- a/bsp/n32/n32g45xcl-stb/project.ewp +++ b/bsp/n32/n32g45xcl-stb/project.ewp @@ -2237,7 +2237,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2321,7 +2321,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32g45xcl-stb/project.uvprojx b/bsp/n32/n32g45xcl-stb/project.uvprojx index 2f9e8d6359..7d8841a62e 100644 --- a/bsp/n32/n32g45xcl-stb/project.uvprojx +++ b/bsp/n32/n32g45xcl-stb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32/n32g45xml-stb/README.md b/bsp/n32/n32g45xml-stb/README.md index 50409930a8..a05199f0b4 100644 --- a/bsp/n32/n32g45xml-stb/README.md +++ b/bsp/n32/n32g45xml-stb/README.md @@ -45,7 +45,7 @@ N32G45XML-STB 板级包支持MDK5开发环境和GCC编译器,以下是具体 | ADC | 支持 | ADC1/2/3/4 | | CAN | 支持 | CAN1/2 | | DAC | 支持 | DAC1/2 | -| HWTIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | +| CLOCK_TIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | | WDT | 支持 | IWDG | | RTC | 支持 | 时钟源支持LSE/LSI/HSE | diff --git a/bsp/n32/n32g45xml-stb/board/Kconfig b/bsp/n32/n32g45xml-stb/board/Kconfig index 2e186f1a74..ea112b3c23 100644 --- a/bsp/n32/n32g45xml-stb/board/Kconfig +++ b/bsp/n32/n32g45xml-stb/board/Kconfig @@ -114,34 +114,34 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n endif diff --git a/bsp/n32/n32g45xml-stb/project.ewp b/bsp/n32/n32g45xml-stb/project.ewp index e78f902eaa..6f05d12e06 100644 --- a/bsp/n32/n32g45xml-stb/project.ewp +++ b/bsp/n32/n32g45xml-stb/project.ewp @@ -2237,7 +2237,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2321,7 +2321,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32g45xml-stb/project.uvprojx b/bsp/n32/n32g45xml-stb/project.uvprojx index 7db04a3fce..4bbb30d611 100644 --- a/bsp/n32/n32g45xml-stb/project.uvprojx +++ b/bsp/n32/n32g45xml-stb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32/n32g45xrl-stb/README.md b/bsp/n32/n32g45xrl-stb/README.md index 1c1f77eef0..831d609496 100644 --- a/bsp/n32/n32g45xrl-stb/README.md +++ b/bsp/n32/n32g45xrl-stb/README.md @@ -45,7 +45,7 @@ N32G45XRL-STB 板级包支持MDK5开发环境和GCC编译器,以下是具体 | ADC | 支持 | ADC1/2/3/4 | | CAN | 支持 | CAN1/2 | | DAC | 支持 | DAC1/2 | -| HWTIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | +| CLOCK_TIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | | WDT | 支持 | IWDG | | RTC | 支持 | 时钟源支持LSE/LSI/HSE | diff --git a/bsp/n32/n32g45xrl-stb/board/Kconfig b/bsp/n32/n32g45xrl-stb/board/Kconfig index 2e186f1a74..ea112b3c23 100644 --- a/bsp/n32/n32g45xrl-stb/board/Kconfig +++ b/bsp/n32/n32g45xrl-stb/board/Kconfig @@ -114,34 +114,34 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n endif diff --git a/bsp/n32/n32g45xrl-stb/project.ewp b/bsp/n32/n32g45xrl-stb/project.ewp index df8713d347..1a898830f0 100644 --- a/bsp/n32/n32g45xrl-stb/project.ewp +++ b/bsp/n32/n32g45xrl-stb/project.ewp @@ -2237,7 +2237,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2321,7 +2321,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32g45xrl-stb/project.uvprojx b/bsp/n32/n32g45xrl-stb/project.uvprojx index d2d6148d78..33efa7b75e 100644 --- a/bsp/n32/n32g45xrl-stb/project.uvprojx +++ b/bsp/n32/n32g45xrl-stb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32/n32g45xvl-stb/README.md b/bsp/n32/n32g45xvl-stb/README.md index d588ffe423..f481a953cd 100644 --- a/bsp/n32/n32g45xvl-stb/README.md +++ b/bsp/n32/n32g45xvl-stb/README.md @@ -45,7 +45,7 @@ N32G45XVL-STB 板级包支持MDK5开发环境和GCC编译器,以下是具体 | ADC | 支持 | ADC1/2/3/4 | | CAN | 支持 | CAN1/2 | | DAC | 支持 | DAC1/2 | -| HWTIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | +| CLOCK_TIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | | WDT | 支持 | IWDG | ### IO在板级支持包中的映射情况 diff --git a/bsp/n32/n32g45xvl-stb/board/Kconfig b/bsp/n32/n32g45xvl-stb/board/Kconfig index 5df1f9fc3a..51047d9b4b 100644 --- a/bsp/n32/n32g45xvl-stb/board/Kconfig +++ b/bsp/n32/n32g45xvl-stb/board/Kconfig @@ -447,34 +447,34 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n endif diff --git a/bsp/n32/n32g45xvl-stb/project.ewp b/bsp/n32/n32g45xvl-stb/project.ewp index 137f9ff1c6..60d65cbb1e 100644 --- a/bsp/n32/n32g45xvl-stb/project.ewp +++ b/bsp/n32/n32g45xvl-stb/project.ewp @@ -2237,7 +2237,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2321,7 +2321,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32g45xvl-stb/project.uvprojx b/bsp/n32/n32g45xvl-stb/project.uvprojx index b4310ee0ae..3d12e6f4b9 100644 --- a/bsp/n32/n32g45xvl-stb/project.uvprojx +++ b/bsp/n32/n32g45xvl-stb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32/n32g4frml-stb/board/Kconfig b/bsp/n32/n32g4frml-stb/board/Kconfig index 16351ea7e1..f2c09867d6 100644 --- a/bsp/n32/n32g4frml-stb/board/Kconfig +++ b/bsp/n32/n32g4frml-stb/board/Kconfig @@ -114,34 +114,34 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n endif diff --git a/bsp/n32/n32g4frml-stb/project.ewp b/bsp/n32/n32g4frml-stb/project.ewp index 3b515c59cc..96ebc11b67 100644 --- a/bsp/n32/n32g4frml-stb/project.ewp +++ b/bsp/n32/n32g4frml-stb/project.ewp @@ -2213,7 +2213,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2297,7 +2297,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32g4frml-stb/project.uvprojx b/bsp/n32/n32g4frml-stb/project.uvprojx index 6008458b4a..f116d801f8 100644 --- a/bsp/n32/n32g4frml-stb/project.uvprojx +++ b/bsp/n32/n32g4frml-stb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32/n32l40xcl-stb/README.md b/bsp/n32/n32l40xcl-stb/README.md index c25ba9b192..f1155c24e0 100644 --- a/bsp/n32/n32l40xcl-stb/README.md +++ b/bsp/n32/n32l40xcl-stb/README.md @@ -45,7 +45,7 @@ N32L40XCL_STB 板级包支持MDK5开发环境和GCC编译器,以下是具体 | ADC | 支持 | ADC | | CAN | 支持 | CAN | | DAC | 支持 | DAC | -| HWTIMER | 支持 | TIMER1/2/3/4/5/6/7/8/9 | +| CLOCK_TIMER | 支持 | TIMER1/2/3/4/5/6/7/8/9 | | WDT | 支持 | IWDG | | RTC | 支持 | 时钟源支持LSE/LSI/HSE | diff --git a/bsp/n32/n32l40xcl-stb/board/Kconfig b/bsp/n32/n32l40xcl-stb/board/Kconfig index 4303b8e4ad..be6846a115 100644 --- a/bsp/n32/n32l40xcl-stb/board/Kconfig +++ b/bsp/n32/n32l40xcl-stb/board/Kconfig @@ -107,45 +107,45 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n - config BSP_USING_HWTIMER9 - bool "using hwtimer9" + config BSP_USING_CLOCK_TIMER9 + bool "using clock_timer9" default n endif diff --git a/bsp/n32/n32l40xcl-stb/project.ewp b/bsp/n32/n32l40xcl-stb/project.ewp index 8343f097f3..74de3b8931 100644 --- a/bsp/n32/n32l40xcl-stb/project.ewp +++ b/bsp/n32/n32l40xcl-stb/project.ewp @@ -2237,7 +2237,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2321,7 +2321,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32l40xcl-stb/project.uvprojx b/bsp/n32/n32l40xcl-stb/project.uvprojx index 82add6e608..b984ba461b 100644 --- a/bsp/n32/n32l40xcl-stb/project.uvprojx +++ b/bsp/n32/n32l40xcl-stb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32/n32l436-evb/README.md b/bsp/n32/n32l436-evb/README.md index 2b08341298..24e33e568b 100644 --- a/bsp/n32/n32l436-evb/README.md +++ b/bsp/n32/n32l436-evb/README.md @@ -45,7 +45,7 @@ N32L436_EVB 板级包支持MDK5开发环境和GCC编译器,以下是具体版 | ADC | 支持 | ADC | | CAN | 支持 | CAN | | DAC | 支持 | DAC | -| HWTIMER | 支持 | TIMER1/2/3/4/5/6/7/8/9 | +| CLOCK_TIMER | 支持 | TIMER1/2/3/4/5/6/7/8/9 | | WDT | 支持 | IWDG | | RTC | 支持 | 时钟源支持LSE/LSI/HSE | diff --git a/bsp/n32/n32l436-evb/board/Kconfig b/bsp/n32/n32l436-evb/board/Kconfig index 5e3fe2a39e..312cd4e7df 100644 --- a/bsp/n32/n32l436-evb/board/Kconfig +++ b/bsp/n32/n32l436-evb/board/Kconfig @@ -107,45 +107,45 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n - config BSP_USING_HWTIMER9 - bool "using hwtimer9" + config BSP_USING_CLOCK_TIMER9 + bool "using clock_timer9" default n endif diff --git a/bsp/n32/n32l436-evb/project.ewp b/bsp/n32/n32l436-evb/project.ewp index b53987f97e..b364f0ffdc 100644 --- a/bsp/n32/n32l436-evb/project.ewp +++ b/bsp/n32/n32l436-evb/project.ewp @@ -2237,7 +2237,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2321,7 +2321,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32l436-evb/project.uvprojx b/bsp/n32/n32l436-evb/project.uvprojx index 81d22ed3a0..31d96d5ffb 100644 --- a/bsp/n32/n32l436-evb/project.uvprojx +++ b/bsp/n32/n32l436-evb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32/n32l43xml-stb/README.md b/bsp/n32/n32l43xml-stb/README.md index 72a277aca9..66d8571946 100644 --- a/bsp/n32/n32l43xml-stb/README.md +++ b/bsp/n32/n32l43xml-stb/README.md @@ -45,7 +45,7 @@ N32L43XML_STB 板级包支持MDK5开发环境和GCC编译器,以下是具体 | ADC | 支持 | ADC | | CAN | 支持 | CAN | | DAC | 支持 | DAC | -| HWTIMER | 支持 | TIMER1/2/3/4/5/6/7/8/9 | +| CLOCK_TIMER | 支持 | TIMER1/2/3/4/5/6/7/8/9 | | WDT | 支持 | IWDG | | RTC | 支持 | 时钟源支持LSE/LSI/HSE | diff --git a/bsp/n32/n32l43xml-stb/board/Kconfig b/bsp/n32/n32l43xml-stb/board/Kconfig index 5e3fe2a39e..312cd4e7df 100644 --- a/bsp/n32/n32l43xml-stb/board/Kconfig +++ b/bsp/n32/n32l43xml-stb/board/Kconfig @@ -107,45 +107,45 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n - config BSP_USING_HWTIMER9 - bool "using hwtimer9" + config BSP_USING_CLOCK_TIMER9 + bool "using clock_timer9" default n endif diff --git a/bsp/n32/n32l43xml-stb/project.ewp b/bsp/n32/n32l43xml-stb/project.ewp index 7cd39f1f14..6b37926739 100644 --- a/bsp/n32/n32l43xml-stb/project.ewp +++ b/bsp/n32/n32l43xml-stb/project.ewp @@ -2237,7 +2237,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2321,7 +2321,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32l43xml-stb/project.uvprojx b/bsp/n32/n32l43xml-stb/project.uvprojx index d378a75008..cbb0d71431 100644 --- a/bsp/n32/n32l43xml-stb/project.uvprojx +++ b/bsp/n32/n32l43xml-stb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32/n32l43xrl-stb/README.md b/bsp/n32/n32l43xrl-stb/README.md index 798096604f..0faccdd241 100644 --- a/bsp/n32/n32l43xrl-stb/README.md +++ b/bsp/n32/n32l43xrl-stb/README.md @@ -45,7 +45,7 @@ N32L43XRL_STB 板级包支持MDK5开发环境和GCC编译器,以下是具体 | ADC | 支持 | ADC | | CAN | 支持 | CAN | | DAC | 支持 | DAC | -| HWTIMER | 支持 | TIMER1/2/3/4/5/6/7/8/9 | +| CLOCK_TIMER | 支持 | TIMER1/2/3/4/5/6/7/8/9 | | WDT | 支持 | IWDG | | RTC | 支持 | 时钟源支持LSE/LSI/HSE | diff --git a/bsp/n32/n32l43xrl-stb/board/Kconfig b/bsp/n32/n32l43xrl-stb/board/Kconfig index 5e3fe2a39e..312cd4e7df 100644 --- a/bsp/n32/n32l43xrl-stb/board/Kconfig +++ b/bsp/n32/n32l43xrl-stb/board/Kconfig @@ -107,45 +107,45 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n - config BSP_USING_HWTIMER9 - bool "using hwtimer9" + config BSP_USING_CLOCK_TIMER9 + bool "using clock_timer9" default n endif diff --git a/bsp/n32/n32l43xrl-stb/project.ewp b/bsp/n32/n32l43xrl-stb/project.ewp index 7404ec4b8c..c0cb073932 100644 --- a/bsp/n32/n32l43xrl-stb/project.ewp +++ b/bsp/n32/n32l43xrl-stb/project.ewp @@ -2237,7 +2237,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2321,7 +2321,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32l43xrl-stb/project.uvprojx b/bsp/n32/n32l43xrl-stb/project.uvprojx index 2a9cd0823c..3b5c38167a 100644 --- a/bsp/n32/n32l43xrl-stb/project.uvprojx +++ b/bsp/n32/n32l43xrl-stb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32/n32wb45xl-evb/README.md b/bsp/n32/n32wb45xl-evb/README.md index 3f490f08d4..e549e50999 100644 --- a/bsp/n32/n32wb45xl-evb/README.md +++ b/bsp/n32/n32wb45xl-evb/README.md @@ -45,7 +45,7 @@ N32WB45XL_EVB 板级包支持MDK5开发环境和GCC编译器,以下是具体 | ADC | 支持 | ADC1/2 | | CAN | 支持 | CAN1/2 | | DAC | 支持 | DAC1/2 | -| HWTIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | +| CLOCK_TIMER | 支持 | TIMER1/2/3/4/5/6/7/8 | | WDT | 支持 | IWDG | | RTC | 支持 | 时钟源支持LSE/LSI/HSE | diff --git a/bsp/n32/n32wb45xl-evb/board/Kconfig b/bsp/n32/n32wb45xl-evb/board/Kconfig index 0610640dc4..5da0bd4a40 100644 --- a/bsp/n32/n32wb45xl-evb/board/Kconfig +++ b/bsp/n32/n32wb45xl-evb/board/Kconfig @@ -114,34 +114,34 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - bool "Enable hwtimer" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable clock_timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER1 - bool "using hwtimer1" + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER1 + bool "using clock_timer1" default n - config BSP_USING_HWTIMER2 - bool "using hwtimer2" + config BSP_USING_CLOCK_TIMER2 + bool "using clock_timer2" default n - config BSP_USING_HWTIMER3 - bool "using hwtimer3" + config BSP_USING_CLOCK_TIMER3 + bool "using clock_timer3" default n - config BSP_USING_HWTIMER4 - bool "using hwtimer4" + config BSP_USING_CLOCK_TIMER4 + bool "using clock_timer4" default n - config BSP_USING_HWTIMER5 - bool "using hwtimer5" + config BSP_USING_CLOCK_TIMER5 + bool "using clock_timer5" default n - config BSP_USING_HWTIMER6 - bool "using hwtimer6" + config BSP_USING_CLOCK_TIMER6 + bool "using clock_timer6" default n - config BSP_USING_HWTIMER7 - bool "using hwtimer7" + config BSP_USING_CLOCK_TIMER7 + bool "using clock_timer7" default n - config BSP_USING_HWTIMER8 - bool "using hwtimer8" + config BSP_USING_CLOCK_TIMER8 + bool "using clock_timer8" default n endif diff --git a/bsp/n32/n32wb45xl-evb/project.ewp b/bsp/n32/n32wb45xl-evb/project.ewp index da3f4ce8db..cf5e798397 100644 --- a/bsp/n32/n32wb45xl-evb/project.ewp +++ b/bsp/n32/n32wb45xl-evb/project.ewp @@ -2237,7 +2237,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -2321,7 +2321,7 @@ $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - $PROJ_DIR$\..\libraries\n32_drivers\drv_hwtimer.c + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c diff --git a/bsp/n32/n32wb45xl-evb/project.uvprojx b/bsp/n32/n32wb45xl-evb/project.uvprojx index 61d4ee2eb9..e1ba0c9ebf 100644 --- a/bsp/n32/n32wb45xl-evb/project.uvprojx +++ b/bsp/n32/n32wb45xl-evb/project.uvprojx @@ -488,9 +488,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c @@ -932,9 +932,9 @@ - drv_hwtimer.c + drv_timer.c 1 - ..\libraries\n32_drivers\drv_hwtimer.c + ..\libraries\n32_drivers\drv_timer.c diff --git a/bsp/n32g452xx/Libraries/rt_drivers/SConscript b/bsp/n32g452xx/Libraries/rt_drivers/SConscript index b082134ed4..cf9e595798 100755 --- a/bsp/n32g452xx/Libraries/rt_drivers/SConscript +++ b/bsp/n32g452xx/Libraries/rt_drivers/SConscript @@ -24,8 +24,8 @@ if GetDepend(['BSP_USING_UART']): if GetDepend(['BSP_USING_PWM']): src += ['drv_pwm.c'] -if GetDepend(['BSP_USING_HWTIMER']): - src += ['drv_hwtimer.c'] +if GetDepend(['BSP_USING_CLOCK_TIMER']): + src += ['drv_timer.c'] if GetDepend(['BSP_USING_SPI']): src += ['drv_spi.c'] diff --git a/bsp/n32g452xx/Libraries/rt_drivers/drv_hwtimer.c b/bsp/n32g452xx/Libraries/rt_drivers/drv_timer.c similarity index 77% rename from bsp/n32g452xx/Libraries/rt_drivers/drv_hwtimer.c rename to bsp/n32g452xx/Libraries/rt_drivers/drv_timer.c index 65c05ce702..67bc044625 100644 --- a/bsp/n32g452xx/Libraries/rt_drivers/drv_hwtimer.c +++ b/bsp/n32g452xx/Libraries/rt_drivers/drv_timer.c @@ -9,13 +9,13 @@ */ #include -#include "drv_hwtimer.h" +#include "drv_timer.h" #define DRV_DEBUG -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER enum { #ifdef BSP_USING_HWTIM1 @@ -51,15 +51,15 @@ enum #endif }; -struct n32_hwtimer +struct n32_clock_timer { - rt_hwtimer_t time_device; + rt_clock_timer_t time_device; TIM_Module *tim_handle; IRQn_Type tim_irqn; char *name; }; -static struct n32_hwtimer n32_hwtimer_obj[] = +static struct n32_clock_timer n32_clock_timer_obj[] = { #ifdef BSP_USING_HWTIM1 TIM1_CONFIG, @@ -94,7 +94,7 @@ static struct n32_hwtimer n32_hwtimer_obj[] = #endif }; -static void n32_timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void n32_timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { RCC_ClocksType RCC_ClockStruct; TIM_TimeBaseInitType TIM_TimeBaseStructure; @@ -103,13 +103,13 @@ static void n32_timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) uint32_t input_clock; uint32_t prescaler_value = 0; TIM_Module *tim = RT_NULL; - struct n32_hwtimer *tim_device = RT_NULL; + struct n32_clock_timer *tim_device = RT_NULL; RT_ASSERT(timer != RT_NULL); if (state) { tim = (TIM_Module *)timer->parent.user_data; - tim_device = (struct n32_hwtimer *)timer; + tim_device = (struct n32_clock_timer *)timer; RT_ASSERT((tim == TIM2) || (tim == TIM3) || (tim == TIM4) || (tim == TIM5) || (tim == TIM6) || (tim == TIM7)); @@ -130,7 +130,7 @@ static void n32_timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1; TIM_TimeBaseStructure.RepetCnt = 0; - if (timer->info->cntmode == HWTIMER_CNTMODE_UP) + if (timer->info->cntmode == CLOCK_TIMER_CNTMODE_UP) { TIM_TimeBaseStructure.CntMode = TIM_CNT_MODE_UP; } @@ -155,7 +155,7 @@ static void n32_timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) } } -static rt_err_t n32_timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +static rt_err_t n32_timer_start(rt_clock_timer_t *timer, rt_uint32_t t, rt_clock_timer_mode_t opmode) { rt_err_t result = RT_EOK; TIM_Module *tim = RT_NULL; @@ -168,7 +168,7 @@ static rt_err_t n32_timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_m TIM_SetCnt(tim, 0); /* set tim arr */ TIM_SetAutoReload(tim, t - 1); - if (opmode == HWTIMER_MODE_ONESHOT) + if (opmode == CLOCK_TIMER_MODE_ONESHOT) { /* set timer to single mode */ TIM_SelectOnePulseMode(tim, TIM_OPMODE_SINGLE); @@ -184,7 +184,7 @@ static rt_err_t n32_timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_m return result; } -static void n32_timer_stop(rt_hwtimer_t *timer) +static void n32_timer_stop(rt_clock_timer_t *timer) { TIM_Module *tim = RT_NULL; @@ -198,7 +198,7 @@ static void n32_timer_stop(rt_hwtimer_t *timer) TIM_SetCnt(tim, 0); } -static rt_uint32_t n32_timer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t n32_timer_counter_get(rt_clock_timer_t *timer) { TIM_Module *tim = RT_NULL; @@ -209,7 +209,7 @@ static rt_uint32_t n32_timer_counter_get(rt_hwtimer_t *timer) return tim->CNT; } -static rt_err_t n32_timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t n32_timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { RCC_ClocksType RCC_ClockStruct; TIM_Module *tim = RT_NULL; @@ -222,7 +222,7 @@ static rt_err_t n32_timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t input_clock; rt_uint32_t freq; @@ -251,8 +251,8 @@ static rt_err_t n32_timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) return result; } -static const struct rt_hwtimer_info _info = TIM_DEV_INFO_CONFIG; -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_info _info = TIM_DEV_INFO_CONFIG; +static const struct rt_clock_timer_ops _ops = { .init = n32_timer_init, .start = n32_timer_start, @@ -270,7 +270,7 @@ void TIM2_IRQHandler(void) if (TIM_GetIntStatus(TIM2, TIM_INT_UPDATE) == SET) { - rt_device_hwtimer_isr(&n32_hwtimer_obj[TIM2_INDEX].time_device); + rt_clock_timer_isr(&n32_clock_timer_obj[TIM2_INDEX].time_device); TIM_ClrIntPendingBit(TIM2, TIM_INT_UPDATE); } @@ -288,7 +288,7 @@ void TIM3_IRQHandler(void) if (TIM_GetIntStatus(TIM3, TIM_INT_UPDATE) == SET) { - rt_device_hwtimer_isr(&n32_hwtimer_obj[TIM3_INDEX].time_device); + rt_clock_timer_isr(&n32_clock_timer_obj[TIM3_INDEX].time_device); TIM_ClrIntPendingBit(TIM3, TIM_INT_UPDATE); } @@ -306,7 +306,7 @@ void TIM4_IRQHandler(void) if (TIM_GetIntStatus(TIM4, TIM_INT_UPDATE) == SET) { - rt_device_hwtimer_isr(&n32_hwtimer_obj[TIM4_INDEX].time_device); + rt_clock_timer_isr(&n32_clock_timer_obj[TIM4_INDEX].time_device); TIM_ClrIntPendingBit(TIM4, TIM_INT_UPDATE); } @@ -324,7 +324,7 @@ void TIM5_IRQHandler(void) if (TIM_GetIntStatus(TIM5, TIM_INT_UPDATE) == SET) { - rt_device_hwtimer_isr(&n32_hwtimer_obj[TIM5_INDEX].time_device); + rt_clock_timer_isr(&n32_clock_timer_obj[TIM5_INDEX].time_device); TIM_ClrIntPendingBit(TIM5, TIM_INT_UPDATE); } @@ -342,7 +342,7 @@ void TIM6_IRQHandler(void) if (TIM_GetIntStatus(TIM6, TIM_INT_UPDATE) == SET) { - rt_device_hwtimer_isr(&n32_hwtimer_obj[TIM6_INDEX].time_device); + rt_clock_timer_isr(&n32_clock_timer_obj[TIM6_INDEX].time_device); TIM_ClrIntPendingBit(TIM6, TIM_INT_UPDATE); } @@ -360,7 +360,7 @@ void TIM7_IRQHandler(void) if (TIM_GetIntStatus(TIM7, TIM_INT_UPDATE) == SET) { - rt_device_hwtimer_isr(&n32_hwtimer_obj[TIM7_INDEX].time_device); + rt_clock_timer_isr(&n32_clock_timer_obj[TIM7_INDEX].time_device); TIM_ClrIntPendingBit(TIM7, TIM_INT_UPDATE); } @@ -369,31 +369,31 @@ void TIM7_IRQHandler(void) } #endif -static int rt_hw_hwtimer_init(void) +static int rt_hw_clock_timer_init(void) { int i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(n32_hwtimer_obj) / sizeof(n32_hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(n32_clock_timer_obj) / sizeof(n32_clock_timer_obj[0]); i++) { - n32_hwtimer_obj[i].time_device.info = &_info; - n32_hwtimer_obj[i].time_device.ops = &_ops; - if (rt_device_hwtimer_register(&n32_hwtimer_obj[i].time_device, n32_hwtimer_obj[i].name, n32_hwtimer_obj[i].tim_handle) == RT_EOK) + n32_clock_timer_obj[i].time_device.info = &_info; + n32_clock_timer_obj[i].time_device.ops = &_ops; + if (rt_clock_timer_register(&n32_clock_timer_obj[i].time_device, n32_clock_timer_obj[i].name, n32_clock_timer_obj[i].tim_handle) == RT_EOK) { - LOG_D("%s register success", n32_hwtimer_obj[i].name); + LOG_D("%s register success", n32_clock_timer_obj[i].name); } else { - LOG_E("%s register failed", n32_hwtimer_obj[i].name); + LOG_E("%s register failed", n32_clock_timer_obj[i].name); result = -RT_ERROR; } } return result; } -INIT_BOARD_EXPORT(rt_hw_hwtimer_init); +INIT_BOARD_EXPORT(rt_hw_clock_timer_init); -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/n32g452xx/Libraries/rt_drivers/drv_hwtimer.h b/bsp/n32g452xx/Libraries/rt_drivers/drv_timer.h similarity index 96% rename from bsp/n32g452xx/Libraries/rt_drivers/drv_hwtimer.h rename to bsp/n32g452xx/Libraries/rt_drivers/drv_timer.h index 73647845e0..9258eec010 100644 --- a/bsp/n32g452xx/Libraries/rt_drivers/drv_hwtimer.h +++ b/bsp/n32g452xx/Libraries/rt_drivers/drv_timer.h @@ -12,7 +12,7 @@ #define __TIM_CONFIG_H__ #include -#include +#include #ifdef __cplusplus extern "C" { @@ -24,7 +24,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 1000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/n32g452xx/n32g452xx-mini-system/README.md b/bsp/n32g452xx/n32g452xx-mini-system/README.md index 68bd5b3d7e..e1063e1a1b 100644 --- a/bsp/n32g452xx/n32g452xx-mini-system/README.md +++ b/bsp/n32g452xx/n32g452xx-mini-system/README.md @@ -37,7 +37,7 @@ N32G452 MINI-SYSTEM 板级包支持MDK5开发环境和GCC编译器,以下是 | GPIO | 支持(已移植,已测试) | PA0...PF7 | | ADC | 支持(已移植,已测试) | ADC1/2 | | PWM | 支持(已移植,已测试) | TMR1/2 | -| HWTIMER | 支持(已移植,已测试) | TMR6/7 | +| CLOCK_TIMER | 支持(已移植,已测试) | TMR6/7 | ### IO在板级支持包中的映射情况 diff --git a/bsp/n32g452xx/n32g452xx-mini-system/board/Kconfig b/bsp/n32g452xx/n32g452xx-mini-system/board/Kconfig index 0f3cfab5e5..373a7d69e2 100755 --- a/bsp/n32g452xx/n32g452xx-mini-system/board/Kconfig +++ b/bsp/n32g452xx/n32g452xx-mini-system/board/Kconfig @@ -304,11 +304,11 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_HWTIM3 bool "Enable hardware timer3" default n diff --git a/bsp/n32g452xx/n32g452xx-mini-system/board/msp/n32_msp.c b/bsp/n32g452xx/n32g452xx-mini-system/board/msp/n32_msp.c index 35f17b6b41..56fe68cea7 100644 --- a/bsp/n32g452xx/n32g452xx-mini-system/board/msp/n32_msp.c +++ b/bsp/n32g452xx/n32g452xx-mini-system/board/msp/n32_msp.c @@ -670,7 +670,7 @@ void n32_msp_adc_init(void *Instance) } #endif /* BSP_USING_ADC */ -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void n32_msp_hwtim_init(void *Instance) { TIM_Module *TIMx = (TIM_Module *)Instance; @@ -881,25 +881,25 @@ static int adc_vol_sample(int argc, char *argv[]) MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample); #endif -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { - rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("this is clock_timer timeout callback fucntion!\n"); rt_kprintf("timer name is :%s.\n", dev->parent.name); rt_kprintf("tick is :%d !\n", rt_tick_get()); return 0; } -static int hwtimer_init(const char *name) +static int clock_timer_init(const char *name) { rt_err_t ret = RT_EOK; - rt_hwtimerval_t timeout_s; + rt_clock_timerval_t timeout_s; rt_device_t hw_dev = RT_NULL; - rt_hwtimer_mode_t mode; + rt_clock_timer_mode_t mode; hw_dev = rt_device_find(name); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", name); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", name); return -RT_ERROR; } ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); @@ -909,8 +909,8 @@ static int hwtimer_init(const char *name) return ret; } rt_device_set_rx_indicate(hw_dev, timeout_cb); - mode = HWTIMER_MODE_PERIOD; - ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); if (ret != RT_EOK) { rt_kprintf("set mode failed! ret is :%d\n", ret); @@ -932,17 +932,17 @@ static int hwtimer_init(const char *name) return ret; } -static int hwtimer_sample(int argc, char *argv[]) +static int clock_timer_sample(int argc, char *argv[]) { #ifdef BSP_USING_HWTIM6 - hwtimer_init("timer6"); + clock_timer_init("timer6"); #endif #ifdef BSP_USING_HWTIM7 - hwtimer_init("timer7"); + clock_timer_init("timer7"); #endif return RT_EOK; } -MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); +MSH_CMD_EXPORT(clock_timer_sample, clock_timer sample); #endif #endif diff --git a/bsp/nrf5x/libraries/drivers/SConscript b/bsp/nrf5x/libraries/drivers/SConscript index 53987e54c8..f065f4994a 100644 --- a/bsp/nrf5x/libraries/drivers/SConscript +++ b/bsp/nrf5x/libraries/drivers/SConscript @@ -41,7 +41,7 @@ if GetDepend(['BSP_USING_ONCHIP_RTC']): src += ['drv_rtc.c'] if GetDepend(['BSP_USING_TIM']): - src += ['drv_hwtimer.c'] + src += ['drv_timer.c'] path = [cwd] diff --git a/bsp/nrf5x/libraries/drivers/drv_hwtimer.c b/bsp/nrf5x/libraries/drivers/drv_timer.c similarity index 80% rename from bsp/nrf5x/libraries/drivers/drv_hwtimer.c rename to bsp/nrf5x/libraries/drivers/drv_timer.c index 1e8d83f550..358cd4a13a 100644 --- a/bsp/nrf5x/libraries/drivers/drv_hwtimer.c +++ b/bsp/nrf5x/libraries/drivers/drv_timer.c @@ -20,11 +20,11 @@ #ifdef BSP_USING_TIM -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #define DBG_LVL DBG_INFO #include -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME #ifndef TIM_DEV_INFO_CONFIG /* maxfreq and minfreq unit is HZ */ @@ -33,7 +33,7 @@ .maxfreq = 16000000, \ .minfreq = 31250, \ .maxcnt = 0xFFFFFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif @@ -44,14 +44,14 @@ typedef struct nrf_timer_cc_channel_t cc_channel; }nrf5x_timer_info_t; -struct nrf5x_hwtimer +struct nrf5x_clock_timer { - rt_hwtimer_t timer_device; + rt_clock_timer_t timer_device; nrf5x_timer_info_t timer_info; char *name; }; -static struct nrf5x_hwtimer nrf5x_hwtimer_obj[] = +static struct nrf5x_clock_timer nrf5x_clock_timer_obj[] = { #ifdef BSP_USING_TIM0 { @@ -101,15 +101,15 @@ static struct nrf5x_hwtimer nrf5x_hwtimer_obj[] = static void timer_callback(nrf_timer_event_t event_type, void* p_context) { - rt_hwtimer_t *timer_device = (struct rt_hwtimer_device *)p_context; + rt_clock_timer_t *timer_device = (struct rt_clock_timer_device *)p_context; - /* no matter what event_type is(NRF_TIMER_EVENT_COMPARE0 or others), call same function "rt_device_hwtimer_isr" */ + /* no matter what event_type is(NRF_TIMER_EVENT_COMPARE0 or others), call same function "rt_clock_timer_isr" */ LOG_D("timer_callback event_type = %d, inst_id = %d, cc conunt = %d\r\n", event_type, timer_info->timer_inst.instance_id, timer_info->timer_inst.cc_channel_count); - rt_device_hwtimer_isr(timer_device); + rt_clock_timer_isr(timer_device); } -static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { nrf5x_timer_info_t *timer_info = RT_NULL; nrfx_timer_config_t *timer_cfg = RT_NULL; @@ -126,7 +126,7 @@ static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) } } -static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +static rt_err_t timer_start(rt_clock_timer_t *timer, rt_uint32_t t, rt_clock_timer_mode_t opmode) { nrf5x_timer_info_t *timer_info = RT_NULL; nrf_timer_short_mask_t mask = NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK; @@ -135,7 +135,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ timer_info = (nrf5x_timer_info_t *)timer->parent.user_data; - if (opmode == HWTIMER_MODE_ONESHOT) + if (opmode == CLOCK_TIMER_MODE_ONESHOT) { /* means TIMER_SHORTS_COMPARE0_STOP_Msk or TIMER_SHORTS_COMPARE1_STOP_Msk ..., according to cc_channel. */ mask = (nrf_timer_short_mask_t)(1 << (timer_info->cc_channel + 8)); @@ -151,7 +151,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ return RT_EOK; } -static void timer_stop(rt_hwtimer_t *timer) +static void timer_stop(rt_clock_timer_t *timer) { nrf5x_timer_info_t *timer_info = RT_NULL; @@ -233,7 +233,7 @@ static nrf_timer_frequency_t frequency_convert(rt_uint32_t freq) return frequency; } -static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { rt_err_t result = RT_EOK; nrf5x_timer_info_t *timer_info = RT_NULL; @@ -247,7 +247,7 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t freq; /* set timer frequence */ @@ -267,7 +267,7 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) return result; } -static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t timer_counter_get(rt_clock_timer_t *timer) { rt_uint32_t count = 0; nrf5x_timer_info_t *timer_info = RT_NULL; @@ -282,8 +282,8 @@ static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) return count; } -static const struct rt_hwtimer_info _info = TIM_DEV_INFO_CONFIG; -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_info _info = TIM_DEV_INFO_CONFIG; +static const struct rt_clock_timer_ops _ops = { .init = timer_init, .start = timer_start, @@ -292,30 +292,30 @@ static const struct rt_hwtimer_ops _ops = .control = timer_ctrl, }; -static int nrf5x_hwtimer_init(void) +static int nrf5x_clock_timer_init(void) { int i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(nrf5x_hwtimer_obj) / sizeof(nrf5x_hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(nrf5x_clock_timer_obj) / sizeof(nrf5x_clock_timer_obj[0]); i++) { - nrf5x_hwtimer_obj[i].timer_device.info = &_info; - nrf5x_hwtimer_obj[i].timer_device.ops = &_ops; - if (rt_device_hwtimer_register(&nrf5x_hwtimer_obj[i].timer_device, nrf5x_hwtimer_obj[i].name, &nrf5x_hwtimer_obj[i].timer_info) == RT_EOK) + nrf5x_clock_timer_obj[i].timer_device.info = &_info; + nrf5x_clock_timer_obj[i].timer_device.ops = &_ops; + if (rt_clock_timer_register(&nrf5x_clock_timer_obj[i].timer_device, nrf5x_clock_timer_obj[i].name, &nrf5x_clock_timer_obj[i].timer_info) == RT_EOK) { - LOG_D("%s register success", nrf5x_hwtimer_obj[i].name); + LOG_D("%s register success", nrf5x_clock_timer_obj[i].name); } else { - LOG_E("%s register failed", nrf5x_hwtimer_obj[i].name); + LOG_E("%s register failed", nrf5x_clock_timer_obj[i].name); result = -RT_ERROR; } } return result; } -INIT_BOARD_EXPORT(nrf5x_hwtimer_init); +INIT_BOARD_EXPORT(nrf5x_clock_timer_init); -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ #endif /* BSP_USING_TIM */ diff --git a/bsp/nrf5x/nrf52832/board/Kconfig b/bsp/nrf5x/nrf52832/board/Kconfig index 261c5ff997..9b0e1dadfa 100644 --- a/bsp/nrf5x/nrf52832/board/Kconfig +++ b/bsp/nrf5x/nrf52832/board/Kconfig @@ -421,7 +421,7 @@ menu "On-chip Peripheral Drivers" config BSP_USING_TIM bool "Enable TIMER" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n if BSP_USING_TIM config NRFX_TIMER_ENABLED diff --git a/bsp/nrf5x/nrf52840/board/Kconfig b/bsp/nrf5x/nrf52840/board/Kconfig index 924db34a5e..9118680155 100644 --- a/bsp/nrf5x/nrf52840/board/Kconfig +++ b/bsp/nrf5x/nrf52840/board/Kconfig @@ -511,7 +511,7 @@ menu "On-chip Peripheral Drivers" config BSP_USING_TIM bool "Enable TIMER" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n if BSP_USING_TIM config NRFX_TIMER_ENABLED diff --git a/bsp/nrf5x/nrf5340/board/Kconfig b/bsp/nrf5x/nrf5340/board/Kconfig index eaf696c8ea..079395abe4 100644 --- a/bsp/nrf5x/nrf5340/board/Kconfig +++ b/bsp/nrf5x/nrf5340/board/Kconfig @@ -513,7 +513,7 @@ menu "On-chip Peripheral Drivers" config BSP_USING_TIM bool "Enable TIMER" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n if BSP_USING_TIM config NRFX_TIMER_ENABLED diff --git a/bsp/nuclei/gd32vf103_rvstar/README.md b/bsp/nuclei/gd32vf103_rvstar/README.md index 6e265d6729..545fae5c72 100644 --- a/bsp/nuclei/gd32vf103_rvstar/README.md +++ b/bsp/nuclei/gd32vf103_rvstar/README.md @@ -256,7 +256,7 @@ Breakpoint 1, irq_entry () at D:\workspace\Sourcecode\rt-thread\libcpu\risc-v\nu | GPIO | 支持 | 默认使能,支持中断控制 | | SPI | 支持 | 默认关闭 | | I2C | 支持 | 默认关闭 | -| HWTIMER | 支持 | 默认关闭 | +| CLOCK_TIMER | 支持 | 默认关闭 | | PWM | 支持 | 默认关闭 | | WDT | 支持 | 默认关闭 | | RTC | 支持 | 默认关闭 | @@ -300,7 +300,7 @@ gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); - 适配RT-Thread的驱动框架的代码在 [../libraries/gd32vf103/HAL_Drivers](../libraries/gd32vf103/HAL_Drivers)目录下。 - 如果有开发者想适配更多的驱动, 请在对应目录下增加驱动适配支持。 - GD32VF103的驱动适配开关在 `menuconfig -> Hardware Drivers Config -> On-chip Peripheral Drivers` 可以找到。 -- HWTIMER和PWM都是采用的TIMER模块进行功能实现,所以在使用驱动时,请务必注意不要重叠使用相同模块。 +- CLOCK_TIMER和PWM都是采用的TIMER模块进行功能实现,所以在使用驱动时,请务必注意不要重叠使用相同模块。 ## 联系人信息 diff --git a/bsp/nuclei/gd32vf103_rvstar/board/Kconfig b/bsp/nuclei/gd32vf103_rvstar/board/Kconfig index 2e90c8d681..4005486bbd 100644 --- a/bsp/nuclei/gd32vf103_rvstar/board/Kconfig +++ b/bsp/nuclei/gd32vf103_rvstar/board/Kconfig @@ -68,30 +68,30 @@ menu "On-chip Peripheral Drivers" default n endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER0 + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER0 bool "Enable TIMER0" default n - config BSP_USING_HWTIMER1 + config BSP_USING_CLOCK_TIMER1 bool "Enable TIMER1" default n - config BSP_USING_HWTIMER2 + config BSP_USING_CLOCK_TIMER2 bool "Enable TIMER2" default n - config BSP_USING_HWTIMER3 + config BSP_USING_CLOCK_TIMER3 bool "Enable TIMER3" default n - config BSP_USING_HWTIMER4 + config BSP_USING_CLOCK_TIMER4 bool "Enable TIMER4" default n - config BSP_USING_HWTIMER5 + config BSP_USING_CLOCK_TIMER5 bool "Enable TIMER5" default n - config BSP_USING_HWTIMER6 + config BSP_USING_CLOCK_TIMER6 bool "Enable TIMER6" default n endif diff --git a/bsp/nuclei/gd32vf103_rvstar/board/board.c b/bsp/nuclei/gd32vf103_rvstar/board/board.c index 3c0aaad171..054206bffd 100644 --- a/bsp/nuclei/gd32vf103_rvstar/board/board.c +++ b/bsp/nuclei/gd32vf103_rvstar/board/board.c @@ -37,7 +37,7 @@ extern void _init(void); /* * - Check MCU pin assignment here https://doc.nucleisys.com/nuclei_board_labs/hw/hw.html * - If you changed menuconfig to use different peripherals such as SPI, ADC, GPIO, - * HWTIMER, I2C, PWM, UART, WDT, RTC, please add or change related pinmux configuration + * CLOCK_TIMER, I2C, PWM, UART, WDT, RTC, please add or change related pinmux configuration * code in functions(rt_hw_*_drvinit) below */ @@ -62,7 +62,7 @@ void rt_hw_gpio_drvinit(void) rcu_periph_clock_enable(RCU_AF); } -void rt_hw_hwtimer_drvinit(void) +void rt_hw_clock_timer_drvinit(void) { } @@ -116,8 +116,8 @@ void rt_hw_drivers_init(void) #ifdef BSP_USING_RTC rt_hw_rtc_drvinit(); #endif -#ifdef BSP_USING_HWTIMER - rt_hw_hwtimer_drvinit(); +#ifdef BSP_USING_CLOCK_TIMER + rt_hw_clock_timer_drvinit(); #endif #ifdef BSP_USING_PWM rt_hw_pwm_drvinit(); diff --git a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/SConscript b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/SConscript index b9cdd5b795..ee3e2a3ea8 100644 --- a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/SConscript +++ b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/SConscript @@ -20,8 +20,8 @@ if GetDepend(['RT_USING_I2C']): if GetDepend(['RT_USING_SPI']): src += ['drv_spi.c'] -if GetDepend(['RT_USING_HWTIMER']): - src += ['drv_hwtimer.c'] +if GetDepend(['RT_USING_CLOCK_TIME']): + src += ['drv_timer.c'] if GetDepend(['RT_USING_ADC']): src += ['drv_adc.c'] diff --git a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_hwtimer.c b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_timer.c similarity index 46% rename from bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_hwtimer.c rename to bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_timer.c index dd351ee146..1beb899437 100644 --- a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_hwtimer.c +++ b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_timer.c @@ -8,61 +8,61 @@ * 2020-05-12 hqfang first version */ -#include "drv_hwtimer.h" +#include "drv_timer.h" -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER -#if !defined(BSP_USING_HWTIMER0) && !defined(BSP_USING_HWTIMER1) && !defined(BSP_USING_HWTIMER2) \ - && !defined(BSP_USING_HWTIMER3) && !defined(BSP_USING_HWTIMER4) - #error "Please define at least one BSP_USING_HWTIMERx" - /* this driver can be disabled at menuconfig -> Hardware Drivers Config -> On-chip Peripheral Drivers -> Enable HWTIMER */ +#if !defined(BSP_USING_CLOCK_TIMER0) && !defined(BSP_USING_CLOCK_TIMER1) && !defined(BSP_USING_CLOCK_TIMER2) \ + && !defined(BSP_USING_CLOCK_TIMER3) && !defined(BSP_USING_CLOCK_TIMER4) + #error "Please define at least one BSP_USING_CLOCK_TIMERx" + /* this driver can be disabled at menuconfig -> Hardware Drivers Config -> On-chip Peripheral Drivers -> Enable CLOCK_TIMER */ #endif -static struct gd32_hwtimer_config hwtimer_config[] = +static struct gd32_clock_timer_config clock_timer_config[] = { -#ifdef BSP_USING_HWTIMER0 +#ifdef BSP_USING_CLOCK_TIMER0 { "timer0", TIMER0, TIMER0_UP_IRQn, }, #endif -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 { "timer1", TIMER1, TIMER1_IRQn, }, #endif -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 { "timer2", TIMER2, TIMER2_IRQn, }, #endif -#ifdef BSP_USING_HWTIMER3 +#ifdef BSP_USING_CLOCK_TIMER3 { "timer3", TIMER3, TIMER3_IRQn, }, #endif -#ifdef BSP_USING_HWTIMER4 +#ifdef BSP_USING_CLOCK_TIMER4 { "timer4", TIMER4, TIMER4_IRQn, }, #endif -#ifdef BSP_USING_HWTIMER5 +#ifdef BSP_USING_CLOCK_TIMER5 { "timer5", TIMER5, TIMER5_IRQn, }, #endif -#ifdef BSP_USING_HWTIMER6 +#ifdef BSP_USING_CLOCK_TIMER6 { "timer6", TIMER6, @@ -71,19 +71,19 @@ static struct gd32_hwtimer_config hwtimer_config[] = #endif }; -static struct gd32_hwtimer hwtimer_obj[sizeof(hwtimer_config) / sizeof(hwtimer_config[0])] = {0}; +static struct gd32_clock_timer clock_timer_obj[sizeof(clock_timer_config) / sizeof(clock_timer_config[0])] = {0}; -static rt_err_t gd32_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t gd32_clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t err = RT_EOK; - struct gd32_hwtimer_config *config; + struct gd32_clock_timer_config *config; RT_ASSERT(timer != RT_NULL); - config = (struct gd32_hwtimer_config *)timer->parent.user_data; + config = (struct gd32_clock_timer_config *)timer->parent.user_data; switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint8_t clkpre; @@ -106,7 +106,7 @@ static rt_err_t gd32_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void TIMER_PSC(config->timer_periph) = (uint32_t)pre; } break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: timer_disable(config->timer_periph); break; default: @@ -116,25 +116,25 @@ static rt_err_t gd32_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void return err; } -static rt_uint32_t gd32_hwtimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t gd32_clock_timer_count_get(rt_clock_timer_t *timer) { rt_uint32_t CurrentTimer_Count; - struct gd32_hwtimer_config *config; + struct gd32_clock_timer_config *config; RT_ASSERT(timer != RT_NULL); - config = (struct gd32_hwtimer_config *)timer->parent.user_data; + config = (struct gd32_clock_timer_config *)timer->parent.user_data; CurrentTimer_Count = timer_counter_read(config->timer_periph); return CurrentTimer_Count; } -static void gd32_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void gd32_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { - struct gd32_hwtimer_config *config; + struct gd32_clock_timer_config *config; timer_parameter_struct initpara; RT_ASSERT(timer != RT_NULL); - config = (struct gd32_hwtimer_config *)timer->parent.user_data; + config = (struct gd32_clock_timer_config *)timer->parent.user_data; if (state == 1) { @@ -150,13 +150,13 @@ static void gd32_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t gd32_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t gd32_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { - struct gd32_hwtimer_config *config; + struct gd32_clock_timer_config *config; RT_ASSERT(timer != RT_NULL); - config = (struct gd32_hwtimer_config *)timer->parent.user_data; + config = (struct gd32_clock_timer_config *)timer->parent.user_data; - if (mode == HWTIMER_MODE_ONESHOT) + if (mode == CLOCK_TIMER_MODE_ONESHOT) { timer_single_pulse_mode_config(config->timer_periph, TIMER_SP_MODE_SINGLE); } @@ -173,143 +173,143 @@ static rt_err_t gd32_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwti return RT_EOK; } -static void gd32_hwtimer_stop(rt_hwtimer_t *timer) +static void gd32_clock_timer_stop(rt_clock_timer_t *timer) { - struct gd32_hwtimer_config *config; + struct gd32_clock_timer_config *config; RT_ASSERT(timer != RT_NULL); - config = (struct gd32_hwtimer_config *)timer->parent.user_data; + config = (struct gd32_clock_timer_config *)timer->parent.user_data; timer_disable(config->timer_periph); ECLIC_DisableIRQ(config->irqn); } -static const struct rt_hwtimer_ops gd32_hwtimer_ops = +static const struct rt_clock_timer_ops gd32_clock_timer_ops = { - .init = gd32_hwtimer_init, - .start = gd32_hwtimer_start, - .stop = gd32_hwtimer_stop, - .count_get = gd32_hwtimer_count_get, - .control = gd32_hwtimer_control, + .init = gd32_clock_timer_init, + .start = gd32_clock_timer_start, + .stop = gd32_clock_timer_stop, + .count_get = gd32_clock_timer_count_get, + .control = gd32_clock_timer_control, }; -static const struct rt_hwtimer_info gd32_hwtimer_info = +static const struct rt_clock_timer_info gd32_clock_timer_info = { 54000000, /* the maximum count frequency can be set */ 1000, /* the minimum count frequency can be set */ 0xFFFF, - HWTIMER_CNTMODE_UP, + CLOCK_TIMER_CNTMODE_UP, }; -#ifdef BSP_USING_HWTIMER0 +#ifdef BSP_USING_CLOCK_TIMER0 void TIMER0_UP_IRQHandler(void) { - timer_interrupt_flag_clear(hwtimer_obj[0].config->timer_periph, TIMER_INT_FLAG_UP); - rt_device_hwtimer_isr(&hwtimer_obj[0].time_device); + timer_interrupt_flag_clear(clock_timer_obj[0].config->timer_periph, TIMER_INT_FLAG_UP); + rt_clock_timer_isr(&clock_timer_obj[0].time_device); } #endif -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 void TIMER1_IRQHandler(void) { - timer_interrupt_flag_clear(hwtimer_obj[1].config->timer_periph, TIMER_INT_FLAG_UP); - rt_device_hwtimer_isr(&hwtimer_obj[1].time_device); + timer_interrupt_flag_clear(clock_timer_obj[1].config->timer_periph, TIMER_INT_FLAG_UP); + rt_clock_timer_isr(&clock_timer_obj[1].time_device); } #endif -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 void TIMER2_IRQHandler(void) { - timer_interrupt_flag_clear(hwtimer_obj[2].config->timer_periph, TIMER_INT_FLAG_UP); - rt_device_hwtimer_isr(&hwtimer_obj[2].time_device); + timer_interrupt_flag_clear(clock_timer_obj[2].config->timer_periph, TIMER_INT_FLAG_UP); + rt_clock_timer_isr(&clock_timer_obj[2].time_device); } #endif -#ifdef BSP_USING_HWTIMER3 +#ifdef BSP_USING_CLOCK_TIMER3 void TIMER3_IRQHandler(void) { - timer_interrupt_flag_clear(hwtimer_obj[3].config->timer_periph, TIMER_INT_FLAG_UP); - rt_device_hwtimer_isr(&hwtimer_obj[3].time_device); + timer_interrupt_flag_clear(clock_timer_obj[3].config->timer_periph, TIMER_INT_FLAG_UP); + rt_clock_timer_isr(&clock_timer_obj[3].time_device); } #endif -#ifdef BSP_USING_HWTIMER4 +#ifdef BSP_USING_CLOCK_TIMER4 void TIMER4_IRQHandler(void) { - timer_interrupt_flag_clear(hwtimer_obj[4].config->timer_periph, TIMER_INT_FLAG_UP); - rt_device_hwtimer_isr(&hwtimer_obj[4].time_device); + timer_interrupt_flag_clear(clock_timer_obj[4].config->timer_periph, TIMER_INT_FLAG_UP); + rt_clock_timer_isr(&clock_timer_obj[4].time_device); } #endif -#ifdef BSP_USING_HWTIMER5 +#ifdef BSP_USING_CLOCK_TIMER5 void TIMER5_IRQHandler(void) { - timer_interrupt_flag_clear(hwtimer_obj[5].config->timer_periph, TIMER_INT_FLAG_UP); - rt_device_hwtimer_isr(&hwtimer_obj[5].time_device); + timer_interrupt_flag_clear(clock_timer_obj[5].config->timer_periph, TIMER_INT_FLAG_UP); + rt_clock_timer_isr(&clock_timer_obj[5].time_device); } #endif -#ifdef BSP_USING_HWTIMER6 +#ifdef BSP_USING_CLOCK_TIMER6 void TIMER6_IRQHandler(void) { - timer_interrupt_flag_clear(hwtimer_obj[6].config->timer_periph, TIMER_INT_FLAG_UP); - rt_device_hwtimer_isr(&hwtimer_obj[6].time_device); + timer_interrupt_flag_clear(clock_timer_obj[6].config->timer_periph, TIMER_INT_FLAG_UP); + rt_clock_timer_isr(&clock_timer_obj[6].time_device); } #endif -static int rt_hwtimer_init(void) +static int rt_clock_timer_init(void) { int i = 0; int result = RT_EOK; -#ifdef BSP_USING_HWTIMER0 +#ifdef BSP_USING_CLOCK_TIMER0 rcu_periph_clock_enable(RCU_TIMER0); #endif -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 rcu_periph_clock_enable(RCU_TIMER1); #endif -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 rcu_periph_clock_enable(RCU_TIMER2); #endif -#ifdef BSP_USING_HWTIMER3 +#ifdef BSP_USING_CLOCK_TIMER3 rcu_periph_clock_enable(RCU_TIMER3); #endif -#ifdef BSP_USING_HWTIMER4 +#ifdef BSP_USING_CLOCK_TIMER4 rcu_periph_clock_enable(RCU_TIMER4); #endif -#ifdef BSP_USING_HWTIMER5 +#ifdef BSP_USING_CLOCK_TIMER5 rcu_periph_clock_enable(RCU_TIMER5); #endif -#ifdef BSP_USING_HWTIMER6 +#ifdef BSP_USING_CLOCK_TIMER6 rcu_periph_clock_enable(RCU_TIMER6); #endif - for (i = 0; i < sizeof(hwtimer_obj) / sizeof(hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(clock_timer_obj) / sizeof(clock_timer_obj[0]); i++) { - hwtimer_obj[i].time_device.info = &gd32_hwtimer_info; - hwtimer_obj[i].time_device.ops = &gd32_hwtimer_ops; - hwtimer_obj[i].config = &hwtimer_config[i]; - rt_device_hwtimer_register(&hwtimer_obj[i].time_device, \ - hwtimer_obj[i].config->name, hwtimer_obj[i].config); + clock_timer_obj[i].time_device.info = &gd32_clock_timer_info; + clock_timer_obj[i].time_device.ops = &gd32_clock_timer_ops; + clock_timer_obj[i].config = &clock_timer_config[i]; + rt_clock_timer_register(&clock_timer_obj[i].time_device, \ + clock_timer_obj[i].config->name, clock_timer_obj[i].config); } return result; } -INIT_DEVICE_EXPORT(rt_hwtimer_init); +INIT_DEVICE_EXPORT(rt_clock_timer_init); -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ diff --git a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_hwtimer.h b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_timer.h similarity index 68% rename from bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_hwtimer.h rename to bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_timer.h index f4664c9d38..53b2e1e45e 100644 --- a/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_hwtimer.h +++ b/bsp/nuclei/libraries/gd32vf103/HAL_Drivers/drv_timer.h @@ -8,8 +8,8 @@ * 2029-05-06 hqfang first implementation. */ -#ifndef __DRV_HWTIMER__ -#define __DRV_HWTIMER__ +#ifndef __DRV_CLOCK_TIMER__ +#define __DRV_CLOCK_TIMER__ #include #include @@ -17,17 +17,17 @@ #include /* gd32 config class */ -struct gd32_hwtimer_config +struct gd32_clock_timer_config { const char *name; rt_uint32_t timer_periph; IRQn_Type irqn; }; -struct gd32_hwtimer +struct gd32_clock_timer { - rt_hwtimer_t time_device; - struct gd32_hwtimer_config *config; + rt_clock_timer_t time_device; + struct gd32_clock_timer_config *config; }; #endif diff --git a/bsp/nuvoton/libraries/m031/rtt_port/Kconfig b/bsp/nuvoton/libraries/m031/rtt_port/Kconfig index ea590078a7..6a640a1978 100644 --- a/bsp/nuvoton/libraries/m031/rtt_port/Kconfig +++ b/bsp/nuvoton/libraries/m031/rtt_port/Kconfig @@ -92,7 +92,7 @@ config SOC_SERIES_M032 config BSP_USING_TIMER0 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -117,7 +117,7 @@ config SOC_SERIES_M032 config BSP_USING_TIMER1 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -141,7 +141,7 @@ config SOC_SERIES_M032 config BSP_USING_TIMER2 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -165,7 +165,7 @@ config SOC_SERIES_M032 config BSP_USING_TIMER3 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. diff --git a/bsp/nuvoton/libraries/m031/rtt_port/drv_timer.c b/bsp/nuvoton/libraries/m031/rtt_port/drv_timer.c index 02b5a1ea94..403889ec46 100644 --- a/bsp/nuvoton/libraries/m031/rtt_port/drv_timer.c +++ b/bsp/nuvoton/libraries/m031/rtt_port/drv_timer.c @@ -12,7 +12,7 @@ #include -#if (defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER)) +#if (defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME)) #include #include "NuMicro.h" @@ -24,17 +24,17 @@ /* Private typedef --------------------------------------------------------------*/ typedef struct nu_timer { - rt_hwtimer_t parent; + rt_clock_timer_t parent; TIMER_T *timer_periph; IRQn_Type IRQn; } nu_timer_t; /* Private functions ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode); -static void nu_timer_stop(rt_hwtimer_t *timer); -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer); -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode); +static void nu_timer_stop(rt_clock_timer_t *timer); +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer); +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); /* Public functions -------------------------------------------------------------*/ @@ -56,15 +56,15 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg static nu_timer_t nu_timer3; #endif -static struct rt_hwtimer_info nu_timer_info = +static struct rt_clock_timer_info nu_timer_info = { 12000000, /* maximum count frequency */ 46875, /* minimum count frequency */ 0xFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_UP,/* Increment or Decreasing count mode */ + CLOCK_TIMER_CNTMODE_UP,/* Increment or Decreasing count mode */ }; -static struct rt_hwtimer_ops nu_timer_ops = +static struct rt_clock_timer_ops nu_timer_ops = { nu_timer_init, nu_timer_start, @@ -74,7 +74,7 @@ static struct rt_hwtimer_ops nu_timer_ops = }; /* Functions define ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { RT_ASSERT(timer != RT_NULL); @@ -85,7 +85,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) if (1 == state) { uint32_t timer_clk; - struct rt_hwtimer_info *info = &nu_timer_info; + struct rt_clock_timer_info *info = &nu_timer_info; timer_clk = TIMER_GetModuleClock(nu_timer->timer_periph); info->maxfreq = timer_clk; @@ -102,7 +102,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode) { rt_err_t err = RT_EOK; RT_ASSERT(timer != RT_NULL); @@ -121,11 +121,11 @@ static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_ err = -RT_ERROR; } - if (HWTIMER_MODE_PERIOD == opmode) + if (CLOCK_TIMER_MODE_PERIOD == opmode) { TIMER_SET_OPMODE(nu_timer->timer_periph, TIMER_PERIODIC_MODE); } - else if (HWTIMER_MODE_ONESHOT == opmode) + else if (CLOCK_TIMER_MODE_ONESHOT == opmode) { TIMER_SET_OPMODE(nu_timer->timer_periph, TIMER_ONESHOT_MODE); } @@ -140,7 +140,7 @@ static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_ return err; } -static void nu_timer_stop(rt_hwtimer_t *timer) +static void nu_timer_stop(rt_clock_timer_t *timer) { RT_ASSERT(timer != RT_NULL); @@ -151,7 +151,7 @@ static void nu_timer_stop(rt_hwtimer_t *timer) TIMER_Stop(nu_timer->timer_periph); } -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer) { RT_ASSERT(timer != RT_NULL); @@ -162,7 +162,7 @@ static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) return TIMER_GetCounter(nu_timer->timer_periph); } -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t ret = RT_EOK; @@ -174,7 +174,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; @@ -186,7 +186,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg } break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: TIMER_Stop(nu_timer->timer_periph); break; @@ -207,7 +207,7 @@ int rt_hw_timer_init(void) nu_timer0.parent.info = &nu_timer_info; nu_timer0.parent.ops = &nu_timer_ops; nu_timer0.IRQn = TMR0_IRQn; - ret = rt_device_hwtimer_register(&nu_timer0.parent, "timer0", &nu_timer0); + ret = rt_clock_timer_register(&nu_timer0.parent, "timer0", &nu_timer0); if (ret != RT_EOK) { rt_kprintf("timer0 register failed\n"); @@ -221,7 +221,7 @@ int rt_hw_timer_init(void) nu_timer1.parent.info = &nu_timer_info; nu_timer1.parent.ops = &nu_timer_ops; nu_timer1.IRQn = TMR1_IRQn; - ret = rt_device_hwtimer_register(&nu_timer1.parent, "timer1", &nu_timer1); + ret = rt_clock_timer_register(&nu_timer1.parent, "timer1", &nu_timer1); if (ret != RT_EOK) { rt_kprintf("timer1 register failed\n"); @@ -235,7 +235,7 @@ int rt_hw_timer_init(void) nu_timer2.parent.info = &nu_timer_info; nu_timer2.parent.ops = &nu_timer_ops; nu_timer2.IRQn = TMR2_IRQn; - ret = rt_device_hwtimer_register(&nu_timer2.parent, "timer2", &nu_timer2); + ret = rt_clock_timer_register(&nu_timer2.parent, "timer2", &nu_timer2); if (ret != RT_EOK) { rt_kprintf("timer2 register failed\n"); @@ -249,7 +249,7 @@ int rt_hw_timer_init(void) nu_timer3.parent.info = &nu_timer_info; nu_timer3.parent.ops = &nu_timer_ops; nu_timer3.IRQn = TMR3_IRQn; - ret = rt_device_hwtimer_register(&nu_timer3.parent, "timer3", &nu_timer3); + ret = rt_clock_timer_register(&nu_timer3.parent, "timer3", &nu_timer3); if (ret != RT_EOK) { rt_kprintf("timer3 register failed\n"); @@ -271,7 +271,7 @@ void TMR0_IRQHandler(void) if (TIMER_GetIntFlag(TIMER0)) { TIMER_ClearIntFlag(TIMER0); - rt_device_hwtimer_isr(&nu_timer0.parent); + rt_clock_timer_isr(&nu_timer0.parent); } rt_interrupt_leave(); @@ -286,7 +286,7 @@ void TMR1_IRQHandler(void) if (TIMER_GetIntFlag(TIMER1)) { TIMER_ClearIntFlag(TIMER1); - rt_device_hwtimer_isr(&nu_timer1.parent); + rt_clock_timer_isr(&nu_timer1.parent); } rt_interrupt_leave(); @@ -301,7 +301,7 @@ void TMR2_IRQHandler(void) if (TIMER_GetIntFlag(TIMER2)) { TIMER_ClearIntFlag(TIMER2); - rt_device_hwtimer_isr(&nu_timer2.parent); + rt_clock_timer_isr(&nu_timer2.parent); } rt_interrupt_leave(); @@ -316,11 +316,11 @@ void TMR3_IRQHandler(void) if (TIMER_GetIntFlag(TIMER3)) { TIMER_ClearIntFlag(TIMER3); - rt_device_hwtimer_isr(&nu_timer3.parent); + rt_clock_timer_isr(&nu_timer3.parent); } rt_interrupt_leave(); } #endif -#endif //#if (defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER)) +#endif //#if (defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME)) diff --git a/bsp/nuvoton/libraries/m2354/rtt_port/Kconfig b/bsp/nuvoton/libraries/m2354/rtt_port/Kconfig index e37055919f..67632a4754 100644 --- a/bsp/nuvoton/libraries/m2354/rtt_port/Kconfig +++ b/bsp/nuvoton/libraries/m2354/rtt_port/Kconfig @@ -97,7 +97,7 @@ config SOC_SERIES_M2354 config BSP_USING_TIMER0 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -129,7 +129,7 @@ config SOC_SERIES_M2354 config BSP_USING_TIMER1 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -160,7 +160,7 @@ config SOC_SERIES_M2354 config BSP_USING_TIMER2 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -191,7 +191,7 @@ config SOC_SERIES_M2354 config BSP_USING_TIMER3 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -222,7 +222,7 @@ config SOC_SERIES_M2354 config BSP_USING_TIMER4 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -253,7 +253,7 @@ config SOC_SERIES_M2354 config BSP_USING_TIMER5 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. diff --git a/bsp/nuvoton/libraries/m2354/rtt_port/drv_timer.c b/bsp/nuvoton/libraries/m2354/rtt_port/drv_timer.c index 1a27a5dc09..3ca6aab454 100644 --- a/bsp/nuvoton/libraries/m2354/rtt_port/drv_timer.c +++ b/bsp/nuvoton/libraries/m2354/rtt_port/drv_timer.c @@ -12,7 +12,7 @@ #include -#if (defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER)) +#if (defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME)) #include #include "NuMicro.h" @@ -23,17 +23,17 @@ /* Private typedef --------------------------------------------------------------*/ typedef struct nu_timer { - rt_hwtimer_t parent; + rt_clock_timer_t parent; TIMER_T *timer_periph; IRQn_Type IRQn; } nu_timer_t; /* Private functions ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode); -static void nu_timer_stop(rt_hwtimer_t *timer); -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer); -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode); +static void nu_timer_stop(rt_clock_timer_t *timer); +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer); +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); /* Public functions -------------------------------------------------------------*/ @@ -63,15 +63,15 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg static nu_timer_t nu_timer5; #endif -static struct rt_hwtimer_info nu_timer_info = +static struct rt_clock_timer_info nu_timer_info = { 12000000, /* maximum count frequency */ 46875, /* minimum count frequency */ 0xFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_UP,/* Increment or Decreasing count mode */ + CLOCK_TIMER_CNTMODE_UP,/* Increment or Decreasing count mode */ }; -static struct rt_hwtimer_ops nu_timer_ops = +static struct rt_clock_timer_ops nu_timer_ops = { nu_timer_init, nu_timer_start, @@ -81,7 +81,7 @@ static struct rt_hwtimer_ops nu_timer_ops = }; /* Functions define ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { RT_ASSERT(timer != RT_NULL); @@ -92,7 +92,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) if (1 == state) { uint32_t timer_clk; - struct rt_hwtimer_info *info = &nu_timer_info; + struct rt_clock_timer_info *info = &nu_timer_info; timer_clk = TIMER_GetModuleClock(nu_timer->timer_periph); info->maxfreq = timer_clk; @@ -109,7 +109,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode) { rt_err_t err = RT_EOK; RT_ASSERT(timer != RT_NULL); @@ -128,11 +128,11 @@ static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_ err = -RT_ERROR; } - if (HWTIMER_MODE_PERIOD == opmode) + if (CLOCK_TIMER_MODE_PERIOD == opmode) { TIMER_SET_OPMODE(nu_timer->timer_periph, TIMER_PERIODIC_MODE); } - else if (HWTIMER_MODE_ONESHOT == opmode) + else if (CLOCK_TIMER_MODE_ONESHOT == opmode) { TIMER_SET_OPMODE(nu_timer->timer_periph, TIMER_ONESHOT_MODE); } @@ -147,7 +147,7 @@ static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_ return err; } -static void nu_timer_stop(rt_hwtimer_t *timer) +static void nu_timer_stop(rt_clock_timer_t *timer) { RT_ASSERT(timer != RT_NULL); @@ -158,7 +158,7 @@ static void nu_timer_stop(rt_hwtimer_t *timer) TIMER_Stop(nu_timer->timer_periph); } -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer) { RT_ASSERT(timer != RT_NULL); @@ -169,7 +169,7 @@ static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) return TIMER_GetCounter(nu_timer->timer_periph); } -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t ret = RT_EOK; @@ -181,7 +181,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; @@ -193,7 +193,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg } break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: TIMER_Stop(nu_timer->timer_periph); break; @@ -214,7 +214,7 @@ int rt_hw_timer_init(void) nu_timer0.parent.info = &nu_timer_info; nu_timer0.parent.ops = &nu_timer_ops; nu_timer0.IRQn = TMR0_IRQn; - ret = rt_device_hwtimer_register(&nu_timer0.parent, "timer0", &nu_timer0); + ret = rt_clock_timer_register(&nu_timer0.parent, "timer0", &nu_timer0); if (ret != RT_EOK) { rt_kprintf("timer0 register failed\n"); @@ -228,7 +228,7 @@ int rt_hw_timer_init(void) nu_timer1.parent.info = &nu_timer_info; nu_timer1.parent.ops = &nu_timer_ops; nu_timer1.IRQn = TMR1_IRQn; - ret = rt_device_hwtimer_register(&nu_timer1.parent, "timer1", &nu_timer1); + ret = rt_clock_timer_register(&nu_timer1.parent, "timer1", &nu_timer1); if (ret != RT_EOK) { rt_kprintf("timer1 register failed\n"); @@ -242,7 +242,7 @@ int rt_hw_timer_init(void) nu_timer2.parent.info = &nu_timer_info; nu_timer2.parent.ops = &nu_timer_ops; nu_timer2.IRQn = TMR2_IRQn; - ret = rt_device_hwtimer_register(&nu_timer2.parent, "timer2", &nu_timer2); + ret = rt_clock_timer_register(&nu_timer2.parent, "timer2", &nu_timer2); if (ret != RT_EOK) { rt_kprintf("timer2 register failed\n"); @@ -256,7 +256,7 @@ int rt_hw_timer_init(void) nu_timer3.parent.info = &nu_timer_info; nu_timer3.parent.ops = &nu_timer_ops; nu_timer3.IRQn = TMR3_IRQn; - ret = rt_device_hwtimer_register(&nu_timer3.parent, "timer3", &nu_timer3); + ret = rt_clock_timer_register(&nu_timer3.parent, "timer3", &nu_timer3); if (ret != RT_EOK) { rt_kprintf("timer3 register failed\n"); @@ -270,7 +270,7 @@ int rt_hw_timer_init(void) nu_timer4.parent.info = &nu_timer_info; nu_timer4.parent.ops = &nu_timer_ops; nu_timer4.IRQn = TMR4_IRQn; - ret = rt_device_hwtimer_register(&nu_timer4.parent, "timer4", &nu_timer4); + ret = rt_clock_timer_register(&nu_timer4.parent, "timer4", &nu_timer4); if (ret != RT_EOK) { rt_kprintf("timer4 register failed\n"); @@ -284,7 +284,7 @@ int rt_hw_timer_init(void) nu_timer5.parent.info = &nu_timer_info; nu_timer5.parent.ops = &nu_timer_ops; nu_timer5.IRQn = TMR5_IRQn; - ret = rt_device_hwtimer_register(&nu_timer5.parent, "timer5", &nu_timer5); + ret = rt_clock_timer_register(&nu_timer5.parent, "timer5", &nu_timer5); if (ret != RT_EOK) { rt_kprintf("timer5 register failed\n"); @@ -306,7 +306,7 @@ void TMR0_IRQHandler(void) if (TIMER_GetIntFlag(TIMER0)) { TIMER_ClearIntFlag(TIMER0); - rt_device_hwtimer_isr(&nu_timer0.parent); + rt_clock_timer_isr(&nu_timer0.parent); } rt_interrupt_leave(); @@ -321,7 +321,7 @@ void TMR1_IRQHandler(void) if (TIMER_GetIntFlag(TIMER1)) { TIMER_ClearIntFlag(TIMER1); - rt_device_hwtimer_isr(&nu_timer1.parent); + rt_clock_timer_isr(&nu_timer1.parent); } rt_interrupt_leave(); @@ -336,7 +336,7 @@ void TMR2_IRQHandler(void) if (TIMER_GetIntFlag(TIMER2)) { TIMER_ClearIntFlag(TIMER2); - rt_device_hwtimer_isr(&nu_timer2.parent); + rt_clock_timer_isr(&nu_timer2.parent); } rt_interrupt_leave(); @@ -351,7 +351,7 @@ void TMR3_IRQHandler(void) if (TIMER_GetIntFlag(TIMER3)) { TIMER_ClearIntFlag(TIMER3); - rt_device_hwtimer_isr(&nu_timer3.parent); + rt_clock_timer_isr(&nu_timer3.parent); } rt_interrupt_leave(); @@ -366,7 +366,7 @@ void TMR4_IRQHandler(void) if (TIMER_GetIntFlag(TIMER4)) { TIMER_ClearIntFlag(TIMER4); - rt_device_hwtimer_isr(&nu_timer4.parent); + rt_clock_timer_isr(&nu_timer4.parent); } rt_interrupt_leave(); @@ -381,11 +381,11 @@ void TMR5_IRQHandler(void) if (TIMER_GetIntFlag(TIMER5)) { TIMER_ClearIntFlag(TIMER5); - rt_device_hwtimer_isr(&nu_timer5.parent); + rt_clock_timer_isr(&nu_timer5.parent); } rt_interrupt_leave(); } #endif -#endif //#if (defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER)) +#endif //#if (defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME)) diff --git a/bsp/nuvoton/libraries/m460/rtt_port/Kconfig b/bsp/nuvoton/libraries/m460/rtt_port/Kconfig index e13519e10e..e4a2ec8b7d 100644 --- a/bsp/nuvoton/libraries/m460/rtt_port/Kconfig +++ b/bsp/nuvoton/libraries/m460/rtt_port/Kconfig @@ -113,7 +113,7 @@ config SOC_SERIES_M460 config BSP_USING_TIMER0 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -144,7 +144,7 @@ config SOC_SERIES_M460 config BSP_USING_TIMER1 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -174,7 +174,7 @@ config SOC_SERIES_M460 config BSP_USING_TIMER2 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -204,7 +204,7 @@ config SOC_SERIES_M460 config BSP_USING_TIMER3 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. diff --git a/bsp/nuvoton/libraries/m460/rtt_port/drv_timer.c b/bsp/nuvoton/libraries/m460/rtt_port/drv_timer.c index b9f4c7bbea..3d9172c540 100644 --- a/bsp/nuvoton/libraries/m460/rtt_port/drv_timer.c +++ b/bsp/nuvoton/libraries/m460/rtt_port/drv_timer.c @@ -12,7 +12,7 @@ #include -#if defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER) +#if defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME) #include #include "NuMicro.h" @@ -41,7 +41,7 @@ enum /* Private typedef --------------------------------------------------------------*/ struct nu_timer { - rt_hwtimer_t parent; + rt_clock_timer_t parent; char *name; TIMER_T *base; IRQn_Type irqn; @@ -51,11 +51,11 @@ struct nu_timer typedef struct nu_timer *nu_timer_t; /* Private functions ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode); -static void nu_timer_stop(rt_hwtimer_t *timer); -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer); -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode); +static void nu_timer_stop(rt_clock_timer_t *timer); +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer); +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); /* Public functions -------------------------------------------------------------*/ @@ -77,15 +77,15 @@ static struct nu_timer nu_timer_arr [] = #endif }; -static struct rt_hwtimer_info nu_timer_info = +static struct rt_clock_timer_info nu_timer_info = { 12000000, /* maximum count frequency */ 46875, /* minimum count frequency */ 0xFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_UP, /* Increment or Decreasing count mode */ + CLOCK_TIMER_CNTMODE_UP, /* Increment or Decreasing count mode */ }; -static struct rt_hwtimer_ops nu_timer_ops = +static struct rt_clock_timer_ops nu_timer_ops = { nu_timer_init, nu_timer_start, @@ -95,7 +95,7 @@ static struct rt_hwtimer_ops nu_timer_ops = }; /* Functions define ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuTmr != RT_NULL); @@ -103,7 +103,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) if (1 == state) { uint32_t timer_clk; - struct rt_hwtimer_info *info = &nu_timer_info; + struct rt_clock_timer_info *info = &nu_timer_info; timer_clk = TIMER_GetModuleClock(psNuTmr->base); info->maxfreq = timer_clk; @@ -120,7 +120,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode) { rt_err_t ret = -RT_EINVAL; rt_uint32_t u32OpMode; @@ -135,11 +135,11 @@ static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_ switch (opmode) { - case HWTIMER_MODE_PERIOD: + case CLOCK_TIMER_MODE_PERIOD: u32OpMode = TIMER_PERIODIC_MODE; break; - case HWTIMER_MODE_ONESHOT: + case CLOCK_TIMER_MODE_ONESHOT: u32OpMode = TIMER_ONESHOT_MODE; break; @@ -161,7 +161,7 @@ exit_nu_timer_start: return -(ret); } -static void nu_timer_stop(rt_hwtimer_t *timer) +static void nu_timer_stop(rt_clock_timer_t *timer) { nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuTmr != RT_NULL); @@ -172,7 +172,7 @@ static void nu_timer_stop(rt_hwtimer_t *timer) TIMER_ResetCounter(psNuTmr->base); } -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer) { nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuTmr != RT_NULL); @@ -180,7 +180,7 @@ static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) return TIMER_GetCounter(psNuTmr->base); } -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t ret = RT_EOK; nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); @@ -188,7 +188,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; @@ -200,7 +200,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg } break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: TIMER_Stop(psNuTmr->base); break; @@ -222,7 +222,7 @@ static void nu_timer_isr(nu_timer_t psNuTmr) if (TIMER_GetIntFlag(psNuTmr->base)) { TIMER_ClearIntFlag(psNuTmr->base); - rt_device_hwtimer_isr(&psNuTmr->parent); + rt_clock_timer_isr(&psNuTmr->parent); } } @@ -242,8 +242,8 @@ int rt_hw_timer_init(void) /* Register Timer operation. */ nu_timer_arr[i].parent.ops = &nu_timer_ops; - /* Register RT hwtimer device. */ - ret = rt_device_hwtimer_register(&nu_timer_arr[i].parent, nu_timer_arr[i].name, &nu_timer_arr[i]); + /* Register RT clock_timer device. */ + ret = rt_clock_timer_register(&nu_timer_arr[i].parent, nu_timer_arr[i].name, &nu_timer_arr[i]); RT_ASSERT(ret == RT_EOK); } return 0; @@ -295,4 +295,4 @@ void TMR3_IRQHandler(void) } #endif -#endif //#if (defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER)) +#endif //#if (defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME)) diff --git a/bsp/nuvoton/libraries/m480/rtt_port/Kconfig b/bsp/nuvoton/libraries/m480/rtt_port/Kconfig index cc9de1b570..87a82cf98b 100644 --- a/bsp/nuvoton/libraries/m480/rtt_port/Kconfig +++ b/bsp/nuvoton/libraries/m480/rtt_port/Kconfig @@ -115,7 +115,7 @@ config SOC_SERIES_M480 config BSP_USING_TIMER0 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -147,7 +147,7 @@ config SOC_SERIES_M480 config BSP_USING_TIMER1 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -178,7 +178,7 @@ config SOC_SERIES_M480 config BSP_USING_TIMER2 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -209,7 +209,7 @@ config SOC_SERIES_M480 config BSP_USING_TIMER3 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. diff --git a/bsp/nuvoton/libraries/m480/rtt_port/drv_timer.c b/bsp/nuvoton/libraries/m480/rtt_port/drv_timer.c index 59509c3dbc..3052e5e7b6 100644 --- a/bsp/nuvoton/libraries/m480/rtt_port/drv_timer.c +++ b/bsp/nuvoton/libraries/m480/rtt_port/drv_timer.c @@ -12,7 +12,7 @@ #include -#if (defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER)) +#if (defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME)) #include #include "NuMicro.h" @@ -23,17 +23,17 @@ /* Private typedef --------------------------------------------------------------*/ typedef struct nu_timer { - rt_hwtimer_t parent; + rt_clock_timer_t parent; TIMER_T *timer_periph; IRQn_Type IRQn; } nu_timer_t; /* Private functions ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode); -static void nu_timer_stop(rt_hwtimer_t *timer); -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer); -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode); +static void nu_timer_stop(rt_clock_timer_t *timer); +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer); +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); /* Public functions -------------------------------------------------------------*/ @@ -55,15 +55,15 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg static nu_timer_t nu_timer3; #endif -static struct rt_hwtimer_info nu_timer_info = +static struct rt_clock_timer_info nu_timer_info = { 12000000, /* maximum count frequency */ 46875, /* minimum count frequency */ 0xFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_UP,/* Increment or Decreasing count mode */ + CLOCK_TIMER_CNTMODE_UP,/* Increment or Decreasing count mode */ }; -static struct rt_hwtimer_ops nu_timer_ops = +static struct rt_clock_timer_ops nu_timer_ops = { nu_timer_init, nu_timer_start, @@ -73,7 +73,7 @@ static struct rt_hwtimer_ops nu_timer_ops = }; /* Functions define ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { RT_ASSERT(timer != RT_NULL); @@ -84,7 +84,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) if (1 == state) { uint32_t timer_clk; - struct rt_hwtimer_info *info = &nu_timer_info; + struct rt_clock_timer_info *info = &nu_timer_info; timer_clk = TIMER_GetModuleClock(nu_timer->timer_periph); info->maxfreq = timer_clk; @@ -101,7 +101,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode) { rt_err_t err = RT_EOK; RT_ASSERT(timer != RT_NULL); @@ -120,11 +120,11 @@ static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_ err = -RT_ERROR; } - if (HWTIMER_MODE_PERIOD == opmode) + if (CLOCK_TIMER_MODE_PERIOD == opmode) { TIMER_SET_OPMODE(nu_timer->timer_periph, TIMER_PERIODIC_MODE); } - else if (HWTIMER_MODE_ONESHOT == opmode) + else if (CLOCK_TIMER_MODE_ONESHOT == opmode) { TIMER_SET_OPMODE(nu_timer->timer_periph, TIMER_ONESHOT_MODE); } @@ -139,7 +139,7 @@ static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_ return err; } -static void nu_timer_stop(rt_hwtimer_t *timer) +static void nu_timer_stop(rt_clock_timer_t *timer) { RT_ASSERT(timer != RT_NULL); @@ -150,7 +150,7 @@ static void nu_timer_stop(rt_hwtimer_t *timer) TIMER_Stop(nu_timer->timer_periph); } -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer) { RT_ASSERT(timer != RT_NULL); @@ -161,7 +161,7 @@ static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) return TIMER_GetCounter(nu_timer->timer_periph); } -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t ret = RT_EOK; @@ -173,7 +173,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; @@ -185,7 +185,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg } break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: TIMER_Stop(nu_timer->timer_periph); break; @@ -206,7 +206,7 @@ int rt_hw_timer_init(void) nu_timer0.parent.info = &nu_timer_info; nu_timer0.parent.ops = &nu_timer_ops; nu_timer0.IRQn = TMR0_IRQn; - ret = rt_device_hwtimer_register(&nu_timer0.parent, "timer0", &nu_timer0); + ret = rt_clock_timer_register(&nu_timer0.parent, "timer0", &nu_timer0); if (ret != RT_EOK) { rt_kprintf("timer0 register failed\n"); @@ -220,7 +220,7 @@ int rt_hw_timer_init(void) nu_timer1.parent.info = &nu_timer_info; nu_timer1.parent.ops = &nu_timer_ops; nu_timer1.IRQn = TMR1_IRQn; - ret = rt_device_hwtimer_register(&nu_timer1.parent, "timer1", &nu_timer1); + ret = rt_clock_timer_register(&nu_timer1.parent, "timer1", &nu_timer1); if (ret != RT_EOK) { rt_kprintf("timer1 register failed\n"); @@ -234,7 +234,7 @@ int rt_hw_timer_init(void) nu_timer2.parent.info = &nu_timer_info; nu_timer2.parent.ops = &nu_timer_ops; nu_timer2.IRQn = TMR2_IRQn; - ret = rt_device_hwtimer_register(&nu_timer2.parent, "timer2", &nu_timer2); + ret = rt_clock_timer_register(&nu_timer2.parent, "timer2", &nu_timer2); if (ret != RT_EOK) { rt_kprintf("timer2 register failed\n"); @@ -248,7 +248,7 @@ int rt_hw_timer_init(void) nu_timer3.parent.info = &nu_timer_info; nu_timer3.parent.ops = &nu_timer_ops; nu_timer3.IRQn = TMR3_IRQn; - ret = rt_device_hwtimer_register(&nu_timer3.parent, "timer3", &nu_timer3); + ret = rt_clock_timer_register(&nu_timer3.parent, "timer3", &nu_timer3); if (ret != RT_EOK) { rt_kprintf("timer3 register failed\n"); @@ -270,7 +270,7 @@ void TMR0_IRQHandler(void) if (TIMER_GetIntFlag(TIMER0)) { TIMER_ClearIntFlag(TIMER0); - rt_device_hwtimer_isr(&nu_timer0.parent); + rt_clock_timer_isr(&nu_timer0.parent); } rt_interrupt_leave(); @@ -285,7 +285,7 @@ void TMR1_IRQHandler(void) if (TIMER_GetIntFlag(TIMER1)) { TIMER_ClearIntFlag(TIMER1); - rt_device_hwtimer_isr(&nu_timer1.parent); + rt_clock_timer_isr(&nu_timer1.parent); } rt_interrupt_leave(); @@ -300,7 +300,7 @@ void TMR2_IRQHandler(void) if (TIMER_GetIntFlag(TIMER2)) { TIMER_ClearIntFlag(TIMER2); - rt_device_hwtimer_isr(&nu_timer2.parent); + rt_clock_timer_isr(&nu_timer2.parent); } rt_interrupt_leave(); @@ -315,11 +315,11 @@ void TMR3_IRQHandler(void) if (TIMER_GetIntFlag(TIMER3)) { TIMER_ClearIntFlag(TIMER3); - rt_device_hwtimer_isr(&nu_timer3.parent); + rt_clock_timer_isr(&nu_timer3.parent); } rt_interrupt_leave(); } #endif -#endif //#if (defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER)) +#endif //#if (defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME)) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/Kconfig b/bsp/nuvoton/libraries/ma35/rtt_port/Kconfig index fb6ca917ca..ef43e5c16d 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/Kconfig +++ b/bsp/nuvoton/libraries/ma35/rtt_port/Kconfig @@ -173,7 +173,7 @@ config BSP_USING_TIMER0 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. @@ -198,7 +198,7 @@ config BSP_USING_TIMER1 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. @@ -222,7 +222,7 @@ config BSP_USING_TIMER2 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. @@ -246,7 +246,7 @@ config BSP_USING_TIMER3 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. @@ -270,7 +270,7 @@ config BSP_USING_TIMER4 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. @@ -295,7 +295,7 @@ config BSP_USING_TIMER5 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. @@ -320,7 +320,7 @@ config BSP_USING_TIMER6 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. @@ -346,7 +346,7 @@ config BSP_USING_TIMER7 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. @@ -371,7 +371,7 @@ config BSP_USING_TIMER8 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. @@ -396,7 +396,7 @@ config BSP_USING_TIMER9 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. @@ -421,7 +421,7 @@ config BSP_USING_TIMER10 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. @@ -446,7 +446,7 @@ config BSP_USING_TIMER11 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "Timer" help Choose this option if you need TIMER function mode. diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_timer.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_timer.c index fe590fec3b..58b31f8161 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_timer.c +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_timer.c @@ -12,7 +12,7 @@ #include -#if defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER) +#if defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME) #include #include "NuMicro.h" @@ -66,7 +66,7 @@ enum /* Private typedef --------------------------------------------------------------*/ struct nu_timer { - rt_hwtimer_t parent; + rt_clock_timer_t parent; char *name; TIMER_T *base; IRQn_Type irqn; @@ -76,11 +76,11 @@ struct nu_timer typedef struct nu_timer *nu_timer_t; /* Private functions ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode); -static void nu_timer_stop(rt_hwtimer_t *timer); -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer); -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode); +static void nu_timer_stop(rt_clock_timer_t *timer); +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer); +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); /* Public functions -------------------------------------------------------------*/ @@ -126,15 +126,15 @@ static struct nu_timer nu_timer_arr [] = #endif }; -static struct rt_hwtimer_info nu_timer_info = +static struct rt_clock_timer_info nu_timer_info = { __HXT, /* maximum count frequency */ (__HXT / 256), /* minimum count frequency */ 0xFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_UP, /* Increment or Decreasing count mode */ + CLOCK_TIMER_CNTMODE_UP, /* Increment or Decreasing count mode */ }; -static struct rt_hwtimer_ops nu_timer_ops = +static struct rt_clock_timer_ops nu_timer_ops = { nu_timer_init, nu_timer_start, @@ -144,7 +144,7 @@ static struct rt_hwtimer_ops nu_timer_ops = }; /* Functions define ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuTmr != RT_NULL); @@ -152,7 +152,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) if (1 == state) { uint32_t timer_clk; - struct rt_hwtimer_info *info = &nu_timer_info; + struct rt_clock_timer_info *info = &nu_timer_info; timer_clk = TIMER_GetModuleClock(psNuTmr->base); info->maxfreq = timer_clk; @@ -169,7 +169,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode) { rt_err_t ret = -RT_EINVAL; rt_uint32_t u32OpMode; @@ -184,11 +184,11 @@ static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_ switch (opmode) { - case HWTIMER_MODE_PERIOD: + case CLOCK_TIMER_MODE_PERIOD: u32OpMode = TIMER_PERIODIC_MODE; break; - case HWTIMER_MODE_ONESHOT: + case CLOCK_TIMER_MODE_ONESHOT: u32OpMode = TIMER_ONESHOT_MODE; break; @@ -210,7 +210,7 @@ exit_nu_timer_start: return -(ret); } -static void nu_timer_stop(rt_hwtimer_t *timer) +static void nu_timer_stop(rt_clock_timer_t *timer) { nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuTmr != RT_NULL); @@ -221,7 +221,7 @@ static void nu_timer_stop(rt_hwtimer_t *timer) TIMER_ResetCounter(psNuTmr->base); } -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer) { nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuTmr != RT_NULL); @@ -229,7 +229,7 @@ static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) return TIMER_GetCounter(psNuTmr->base); } -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t ret = RT_EOK; nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); @@ -237,7 +237,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; @@ -249,7 +249,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg } break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: TIMER_Stop(psNuTmr->base); break; @@ -272,7 +272,7 @@ static void nu_timer_isr(int vector, void *param) if (TIMER_GetIntFlag(psNuTmr->base)) { TIMER_ClearIntFlag(psNuTmr->base); - rt_device_hwtimer_isr(&psNuTmr->parent); + rt_clock_timer_isr(&psNuTmr->parent); } } @@ -295,8 +295,8 @@ int rt_hw_timer_init(void) /* Register Timer interrupt service routine. */ rt_hw_interrupt_install(nu_timer_arr[i].irqn, nu_timer_isr, &nu_timer_arr[i], nu_timer_arr[i].name); - /* Register RT hwtimer device. */ - ret = rt_device_hwtimer_register(&nu_timer_arr[i].parent, nu_timer_arr[i].name, &nu_timer_arr[i]); + /* Register RT clock_timer device. */ + ret = rt_clock_timer_register(&nu_timer_arr[i].parent, nu_timer_arr[i].name, &nu_timer_arr[i]); RT_ASSERT(ret == RT_EOK); } return 0; @@ -304,4 +304,4 @@ int rt_hw_timer_init(void) INIT_BOARD_EXPORT(rt_hw_timer_init); -#endif //#if defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER) +#endif //#if defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME) diff --git a/bsp/nuvoton/libraries/n9h30/rtt_port/Kconfig b/bsp/nuvoton/libraries/n9h30/rtt_port/Kconfig index aab564422e..a05652a923 100644 --- a/bsp/nuvoton/libraries/n9h30/rtt_port/Kconfig +++ b/bsp/nuvoton/libraries/n9h30/rtt_port/Kconfig @@ -93,7 +93,7 @@ config SOC_SERIES_N9H30 config BSP_USING_ETIMER0 select BSP_USING_ETIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "ETIMER" help Choose this option if you need TIMER function mode. @@ -118,7 +118,7 @@ config SOC_SERIES_N9H30 config BSP_USING_ETIMER1 select BSP_USING_ETIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "ETIMER" help Choose this option if you need TIMER function mode. @@ -142,7 +142,7 @@ config SOC_SERIES_N9H30 config BSP_USING_ETIMER2 select BSP_USING_ETIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "ETIMER" help Choose this option if you need TIMER function mode. @@ -166,7 +166,7 @@ config SOC_SERIES_N9H30 config BSP_USING_ETIMER3 select BSP_USING_ETIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "ETIMER" help Choose this option if you need TIMER function mode. @@ -197,28 +197,28 @@ config SOC_SERIES_N9H30 config BSP_USING_TIMER0 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER0" help Choose this option if you need TIMER function mode. config BSP_USING_TIMER1 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER1" help Choose this option if you need TIMER function mode. config BSP_USING_TIMER2 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER2" help Choose this option if you need TIMER function mode. config BSP_USING_TIMER3 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER3" help Choose this option if you need TIMER function mode. diff --git a/bsp/nuvoton/libraries/n9h30/rtt_port/drv_etimer.c b/bsp/nuvoton/libraries/n9h30/rtt_port/drv_etimer.c index e132600f95..ac75810bfd 100644 --- a/bsp/nuvoton/libraries/n9h30/rtt_port/drv_etimer.c +++ b/bsp/nuvoton/libraries/n9h30/rtt_port/drv_etimer.c @@ -12,7 +12,7 @@ #include -#if defined(BSP_USING_ETIMER) && defined(RT_USING_HWTIMER) +#if defined(BSP_USING_ETIMER) && defined(RT_USING_CLOCK_TIME) #include #include "NuMicro.h" @@ -42,7 +42,7 @@ enum /* Private typedef --------------------------------------------------------------*/ struct nu_etimer { - rt_hwtimer_t parent; + rt_clock_timer_t parent; char *name; uint32_t idx; IRQn_Type irqn; @@ -52,11 +52,11 @@ struct nu_etimer typedef struct nu_etimer *nu_etimer_t; /* Private functions ------------------------------------------------------------*/ -static void nu_etimer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t nu_etimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode); -static void nu_etimer_stop(rt_hwtimer_t *timer); -static rt_uint32_t nu_etimer_count_get(rt_hwtimer_t *timer); -static rt_err_t nu_etimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void nu_etimer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t nu_etimer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode); +static void nu_etimer_stop(rt_clock_timer_t *timer); +static rt_uint32_t nu_etimer_count_get(rt_clock_timer_t *timer); +static rt_err_t nu_etimer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); /* Public functions -------------------------------------------------------------*/ @@ -102,15 +102,15 @@ static struct nu_etimer nu_etimer_arr [] = #endif }; -static struct rt_hwtimer_info nu_etimer_info = +static struct rt_clock_timer_info nu_etimer_info = { 12000000, /* maximum count frequency */ 46875, /* minimum count frequency */ 0xFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_UP, /* Increment or Decreasing count mode */ + CLOCK_TIMER_CNTMODE_UP, /* Increment or Decreasing count mode */ }; -static struct rt_hwtimer_ops nu_etimer_ops = +static struct rt_clock_timer_ops nu_etimer_ops = { nu_etimer_init, nu_etimer_start, @@ -120,7 +120,7 @@ static struct rt_hwtimer_ops nu_etimer_ops = }; /* Functions define ------------------------------------------------------------*/ -static void nu_etimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void nu_etimer_init(rt_clock_timer_t *timer, rt_uint32_t state) { nu_etimer_t psNuETmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuETmr != RT_NULL); @@ -128,7 +128,7 @@ static void nu_etimer_init(rt_hwtimer_t *timer, rt_uint32_t state) if (1 == state) { uint32_t timer_clk; - struct rt_hwtimer_info *info = &nu_etimer_info; + struct rt_clock_timer_info *info = &nu_etimer_info; timer_clk = ETIMER_GetModuleClock(psNuETmr->idx); info->maxfreq = timer_clk; @@ -145,7 +145,7 @@ static void nu_etimer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t nu_etimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +static rt_err_t nu_etimer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode) { rt_err_t ret = -RT_EINVAL; rt_uint32_t u32OpMode; @@ -160,11 +160,11 @@ static rt_err_t nu_etimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer switch (opmode) { - case HWTIMER_MODE_PERIOD: + case CLOCK_TIMER_MODE_PERIOD: u32OpMode = ETIMER_PERIODIC_MODE; break; - case HWTIMER_MODE_ONESHOT: + case CLOCK_TIMER_MODE_ONESHOT: u32OpMode = ETIMER_ONESHOT_MODE; break; @@ -186,7 +186,7 @@ exit_nu_etimer_start: return -(ret); } -static void nu_etimer_stop(rt_hwtimer_t *timer) +static void nu_etimer_stop(rt_clock_timer_t *timer) { nu_etimer_t psNuETmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuETmr != RT_NULL); @@ -197,7 +197,7 @@ static void nu_etimer_stop(rt_hwtimer_t *timer) ETIMER_ClearCounter(psNuETmr->idx); } -static rt_uint32_t nu_etimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t nu_etimer_count_get(rt_clock_timer_t *timer) { nu_etimer_t psNuETmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuETmr != RT_NULL); @@ -205,7 +205,7 @@ static rt_uint32_t nu_etimer_count_get(rt_hwtimer_t *timer) return ETIMER_GetCounter(psNuETmr->idx); } -static rt_err_t nu_etimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t nu_etimer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t ret = RT_EOK; nu_etimer_t psNuETmr = NU_TIMER_DEVICE(timer); @@ -213,7 +213,7 @@ static rt_err_t nu_etimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *ar switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; @@ -225,7 +225,7 @@ static rt_err_t nu_etimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *ar } break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: ETIMER_Stop(psNuETmr->idx); break; @@ -248,7 +248,7 @@ static void nu_etimer_isr(int vector, void *param) if (ETIMER_GetIntFlag(psNuETmr->idx)) { ETIMER_ClearIntFlag(psNuETmr->idx); - rt_device_hwtimer_isr(&psNuETmr->parent); + rt_clock_timer_isr(&psNuETmr->parent); } } @@ -271,8 +271,8 @@ int rt_hw_etimer_init(void) /* Register Etimer interrupt service routine. */ rt_hw_interrupt_install(nu_etimer_arr[i].irqn, nu_etimer_isr, &nu_etimer_arr[i], nu_etimer_arr[i].name); - /* Register RT hwtimer device. */ - ret = rt_device_hwtimer_register(&nu_etimer_arr[i].parent, nu_etimer_arr[i].name, &nu_etimer_arr[i]); + /* Register RT clock_timer device. */ + ret = rt_clock_timer_register(&nu_etimer_arr[i].parent, nu_etimer_arr[i].name, &nu_etimer_arr[i]); RT_ASSERT(ret == RT_EOK); } return 0; @@ -280,4 +280,4 @@ int rt_hw_etimer_init(void) INIT_BOARD_EXPORT(rt_hw_etimer_init); -#endif //#if defined(BSP_USING_ETIMER) && defined(RT_USING_HWTIMER) +#endif //#if defined(BSP_USING_ETIMER) && defined(RT_USING_CLOCK_TIME) diff --git a/bsp/nuvoton/libraries/n9h30/rtt_port/drv_timer.c b/bsp/nuvoton/libraries/n9h30/rtt_port/drv_timer.c index 38ea1b9e49..df3d4a1dd2 100644 --- a/bsp/nuvoton/libraries/n9h30/rtt_port/drv_timer.c +++ b/bsp/nuvoton/libraries/n9h30/rtt_port/drv_timer.c @@ -12,7 +12,7 @@ #include -#if defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER) +#if defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME) #include #include "NuMicro.h" @@ -44,7 +44,7 @@ enum /* Private typedef --------------------------------------------------------------*/ struct nu_timer { - rt_hwtimer_t parent; + rt_clock_timer_t parent; char *name; uint32_t idx; IRQn_Type irqn; @@ -54,11 +54,11 @@ struct nu_timer typedef struct nu_timer *nu_timer_t; /* Private functions ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode); -static void nu_timer_stop(rt_hwtimer_t *timer); -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer); -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode); +static void nu_timer_stop(rt_clock_timer_t *timer); +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer); +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); /* Public functions -------------------------------------------------------------*/ @@ -105,15 +105,15 @@ static struct nu_timer nu_timer_arr [] = /* BSP_USING_TIMER4 is reserved for Systick usage. */ }; -static struct rt_hwtimer_info nu_timer_info = +static struct rt_clock_timer_info nu_timer_info = { 12000000, /* maximum count frequency */ 46875, /* minimum count frequency */ 0xFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_UP, /* Increment or Decreasing count mode */ + CLOCK_TIMER_CNTMODE_UP, /* Increment or Decreasing count mode */ }; -static struct rt_hwtimer_ops nu_timer_ops = +static struct rt_clock_timer_ops nu_timer_ops = { nu_timer_init, nu_timer_start, @@ -123,7 +123,7 @@ static struct rt_hwtimer_ops nu_timer_ops = }; /* Functions define ------------------------------------------------------------*/ -static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void nu_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuTmr != RT_NULL); @@ -131,7 +131,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) if (1 == state) { uint32_t timer_clk; - struct rt_hwtimer_info *info = &nu_timer_info; + struct rt_clock_timer_info *info = &nu_timer_info; timer_clk = TIMER_GetModuleClock(psNuTmr->idx); info->maxfreq = timer_clk; @@ -148,7 +148,7 @@ static void nu_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +static rt_err_t nu_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode) { rt_err_t ret = -RT_EINVAL; rt_uint32_t u32OpMode; @@ -163,11 +163,11 @@ static rt_err_t nu_timer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_ switch (opmode) { - case HWTIMER_MODE_PERIOD: + case CLOCK_TIMER_MODE_PERIOD: u32OpMode = TIMER_PERIODIC_MODE; break; - case HWTIMER_MODE_ONESHOT: + case CLOCK_TIMER_MODE_ONESHOT: u32OpMode = TIMER_ONESHOT_MODE; break; @@ -189,7 +189,7 @@ exit_nu_timer_start: return -(ret); } -static void nu_timer_stop(rt_hwtimer_t *timer) +static void nu_timer_stop(rt_clock_timer_t *timer) { nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuTmr != RT_NULL); @@ -200,7 +200,7 @@ static void nu_timer_stop(rt_hwtimer_t *timer) TIMER_ClearCounter(psNuTmr->idx); } -static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t nu_timer_count_get(rt_clock_timer_t *timer) { nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuTmr != RT_NULL); @@ -208,7 +208,7 @@ static rt_uint32_t nu_timer_count_get(rt_hwtimer_t *timer) return TIMER_GetCounter(psNuTmr->idx); } -static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t nu_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t ret = RT_EOK; nu_timer_t psNuTmr = NU_TIMER_DEVICE(timer); @@ -216,7 +216,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; @@ -228,7 +228,7 @@ static rt_err_t nu_timer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg } break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: TIMER_Stop(psNuTmr->idx); break; @@ -251,7 +251,7 @@ static void nu_timer_isr(int vector, void *param) if (TIMER_GetIntFlag(psNuTmr->idx)) { TIMER_ClearIntFlag(psNuTmr->idx); - rt_device_hwtimer_isr(&psNuTmr->parent); + rt_clock_timer_isr(&psNuTmr->parent); } } @@ -274,12 +274,12 @@ int rt_hw_timer_init(void) /* Register Etimer interrupt service routine. */ rt_hw_interrupt_install(nu_timer_arr[i].irqn, nu_timer_isr, &nu_timer_arr[i], nu_timer_arr[i].name); - /* Register RT hwtimer device. */ - ret = rt_device_hwtimer_register(&nu_timer_arr[i].parent, nu_timer_arr[i].name, &nu_timer_arr[i]); + /* Register RT clock_timer device. */ + ret = rt_clock_timer_register(&nu_timer_arr[i].parent, nu_timer_arr[i].name, &nu_timer_arr[i]); RT_ASSERT(ret == RT_EOK); } return 0; } INIT_BOARD_EXPORT(rt_hw_timer_init); -#endif //#if defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER) +#endif //#if defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME) diff --git a/bsp/nuvoton/libraries/nuc980/rtt_port/Kconfig b/bsp/nuvoton/libraries/nuc980/rtt_port/Kconfig index 379c5e84fc..c494564285 100644 --- a/bsp/nuvoton/libraries/nuc980/rtt_port/Kconfig +++ b/bsp/nuvoton/libraries/nuc980/rtt_port/Kconfig @@ -103,7 +103,7 @@ config SOC_SERIES_NUC980 config BSP_USING_TIMER0 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -128,7 +128,7 @@ config SOC_SERIES_NUC980 config BSP_USING_TIMER1 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -152,7 +152,7 @@ config SOC_SERIES_NUC980 config BSP_USING_TIMER2 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -176,7 +176,7 @@ config SOC_SERIES_NUC980 config BSP_USING_TIMER3 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. @@ -200,7 +200,7 @@ config SOC_SERIES_NUC980 config BSP_USING_TIMER4 select BSP_USING_TIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME bool "TIMER" help Choose this option if you need TIMER function mode. diff --git a/bsp/nuvoton/libraries/nuc980/rtt_port/drv_etimer.c b/bsp/nuvoton/libraries/nuc980/rtt_port/drv_etimer.c index 93942edd54..64fcdc1dd4 100644 --- a/bsp/nuvoton/libraries/nuc980/rtt_port/drv_etimer.c +++ b/bsp/nuvoton/libraries/nuc980/rtt_port/drv_etimer.c @@ -12,7 +12,7 @@ #include -#if defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER) +#if defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME) #include #include "NuMicro.h" @@ -46,7 +46,7 @@ enum /* Private typedef --------------------------------------------------------------*/ struct nu_etimer { - rt_hwtimer_t parent; + rt_clock_timer_t parent; char *name; uint32_t idx; IRQn_Type irqn; @@ -56,11 +56,11 @@ struct nu_etimer typedef struct nu_etimer *nu_etimer_t; /* Private functions ------------------------------------------------------------*/ -static void nu_etimer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t nu_etimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode); -static void nu_etimer_stop(rt_hwtimer_t *timer); -static rt_uint32_t nu_etimer_count_get(rt_hwtimer_t *timer); -static rt_err_t nu_etimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void nu_etimer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t nu_etimer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode); +static void nu_etimer_stop(rt_clock_timer_t *timer); +static rt_uint32_t nu_etimer_count_get(rt_clock_timer_t *timer); +static rt_err_t nu_etimer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); /* Public functions -------------------------------------------------------------*/ @@ -116,15 +116,15 @@ static struct nu_etimer nu_etimer_arr [] = /* BSP_USING_TIMER5 is reserved for Systick usage. */ }; -static struct rt_hwtimer_info nu_etimer_info = +static struct rt_clock_timer_info nu_etimer_info = { 12000000, /* maximum count frequency */ 46875, /* minimum count frequency */ 0xFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_UP, /* Increment or Decreasing count mode */ + CLOCK_TIMER_CNTMODE_UP, /* Increment or Decreasing count mode */ }; -static struct rt_hwtimer_ops nu_etimer_ops = +static struct rt_clock_timer_ops nu_etimer_ops = { nu_etimer_init, nu_etimer_start, @@ -134,7 +134,7 @@ static struct rt_hwtimer_ops nu_etimer_ops = }; /* Functions define ------------------------------------------------------------*/ -static void nu_etimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void nu_etimer_init(rt_clock_timer_t *timer, rt_uint32_t state) { nu_etimer_t psNuETmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuETmr != RT_NULL); @@ -142,7 +142,7 @@ static void nu_etimer_init(rt_hwtimer_t *timer, rt_uint32_t state) if (1 == state) { uint32_t timer_clk; - struct rt_hwtimer_info *info = &nu_etimer_info; + struct rt_clock_timer_info *info = &nu_etimer_info; timer_clk = ETIMER_GetModuleClock(psNuETmr->idx); info->maxfreq = timer_clk; @@ -159,7 +159,7 @@ static void nu_etimer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t nu_etimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +static rt_err_t nu_etimer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t opmode) { rt_err_t ret = -RT_EINVAL; rt_uint32_t u32OpMode; @@ -174,11 +174,11 @@ static rt_err_t nu_etimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer switch (opmode) { - case HWTIMER_MODE_PERIOD: + case CLOCK_TIMER_MODE_PERIOD: u32OpMode = ETIMER_PERIODIC_MODE; break; - case HWTIMER_MODE_ONESHOT: + case CLOCK_TIMER_MODE_ONESHOT: u32OpMode = ETIMER_ONESHOT_MODE; break; @@ -200,7 +200,7 @@ exit_nu_etimer_start: return -(ret); } -static void nu_etimer_stop(rt_hwtimer_t *timer) +static void nu_etimer_stop(rt_clock_timer_t *timer) { nu_etimer_t psNuETmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuETmr != RT_NULL); @@ -211,7 +211,7 @@ static void nu_etimer_stop(rt_hwtimer_t *timer) ETIMER_ClearCounter(psNuETmr->idx); } -static rt_uint32_t nu_etimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t nu_etimer_count_get(rt_clock_timer_t *timer) { nu_etimer_t psNuETmr = NU_TIMER_DEVICE(timer); RT_ASSERT(psNuETmr != RT_NULL); @@ -219,7 +219,7 @@ static rt_uint32_t nu_etimer_count_get(rt_hwtimer_t *timer) return ETIMER_GetCounter(psNuETmr->idx); } -static rt_err_t nu_etimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t nu_etimer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t ret = RT_EOK; nu_etimer_t psNuETmr = NU_TIMER_DEVICE(timer); @@ -227,7 +227,7 @@ static rt_err_t nu_etimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *ar switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; @@ -239,7 +239,7 @@ static rt_err_t nu_etimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *ar } break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: ETIMER_Stop(psNuETmr->idx); break; @@ -262,7 +262,7 @@ static void nu_etimer_isr(int vector, void *param) if (ETIMER_GetIntFlag(psNuETmr->idx)) { ETIMER_ClearIntFlag(psNuETmr->idx); - rt_device_hwtimer_isr(&psNuETmr->parent); + rt_clock_timer_isr(&psNuETmr->parent); } } @@ -285,8 +285,8 @@ int rt_hw_etimer_init(void) /* Register Etimer interrupt service routine. */ rt_hw_interrupt_install(nu_etimer_arr[i].irqn, nu_etimer_isr, &nu_etimer_arr[i], nu_etimer_arr[i].name); - /* Register RT hwtimer device. */ - ret = rt_device_hwtimer_register(&nu_etimer_arr[i].parent, nu_etimer_arr[i].name, &nu_etimer_arr[i]); + /* Register RT clock_timer device. */ + ret = rt_clock_timer_register(&nu_etimer_arr[i].parent, nu_etimer_arr[i].name, &nu_etimer_arr[i]); RT_ASSERT(ret == RT_EOK); } return 0; @@ -294,4 +294,4 @@ int rt_hw_etimer_init(void) INIT_BOARD_EXPORT(rt_hw_etimer_init); -#endif //#if defined(BSP_USING_TIMER) && defined(RT_USING_HWTIMER) +#endif //#if defined(BSP_USING_TIMER) && defined(RT_USING_CLOCK_TIME) diff --git a/bsp/nuvoton/nk-980iot/config_lvgl b/bsp/nuvoton/nk-980iot/config_lvgl index 8c65963bbb..87d581b321 100644 --- a/bsp/nuvoton/nk-980iot/config_lvgl +++ b/bsp/nuvoton/nk-980iot/config_lvgl @@ -170,9 +170,8 @@ CONFIG_RT_SERIAL_RB_BUFSZ=2048 CONFIG_RT_USING_CAN=y CONFIG_RT_CAN_USING_HDR=y # CONFIG_RT_CAN_USING_CANFD is not set -CONFIG_RT_USING_HWTIMER=y -CONFIG_RT_USING_CPUTIME=y -CONFIG_CPUTIME_TIMER_FREQ=0 +CONFIG_RT_USING_CLOCK_TIME=y +CONFIG_CLOCK_TIMER_FREQ=0 CONFIG_RT_USING_I2C=y # CONFIG_RT_I2C_DEBUG is not set CONFIG_RT_USING_I2C_BITOPS=y diff --git a/bsp/nuvoton/nk-980iot/project.uvopt b/bsp/nuvoton/nk-980iot/project.uvopt index 730a5777d3..baed90281b 100644 --- a/bsp/nuvoton/nk-980iot/project.uvopt +++ b/bsp/nuvoton/nk-980iot/project.uvopt @@ -391,8 +391,8 @@ 0 0 0 - ..\..\..\components\drivers\cputime\cputime.c - cputime.c + ..\..\..\components\drivers\clock_time\clock_time_core.c + clock_time_core.c 0 0 @@ -403,8 +403,8 @@ 0 0 0 - ..\..\..\components\drivers\cputime\cputimer.c - cputimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 @@ -463,8 +463,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nuvoton/nk-980iot/project.uvoptx b/bsp/nuvoton/nk-980iot/project.uvoptx index f3c2426a2c..51644e2695 100644 --- a/bsp/nuvoton/nk-980iot/project.uvoptx +++ b/bsp/nuvoton/nk-980iot/project.uvoptx @@ -391,8 +391,8 @@ 0 0 0 - ..\..\..\components\drivers\cputime\cputime.c - cputime.c + ..\..\..\components\drivers\clock_time\clock_time_core.c + clock_time_core.c 0 0 @@ -403,8 +403,8 @@ 0 0 0 - ..\..\..\components\drivers\cputime\cputimer.c - cputimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 @@ -463,8 +463,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nuvoton/nk-980iot/project.uvproj b/bsp/nuvoton/nk-980iot/project.uvproj index 32ca527fec..6be5063e78 100644 --- a/bsp/nuvoton/nk-980iot/project.uvproj +++ b/bsp/nuvoton/nk-980iot/project.uvproj @@ -723,9 +723,9 @@ - cputime.c + clock_time_core.c 1 - ..\..\..\components\drivers\cputime\cputime.c + ..\..\..\components\drivers\clock_time\clock_time_core.c 2 @@ -779,9 +779,9 @@ - cputimer.c + clock_timer.c 1 - ..\..\..\components\drivers\cputime\cputimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 @@ -1059,9 +1059,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nuvoton/nk-980iot/project.uvprojx b/bsp/nuvoton/nk-980iot/project.uvprojx index 9aec038116..048e023127 100644 --- a/bsp/nuvoton/nk-980iot/project.uvprojx +++ b/bsp/nuvoton/nk-980iot/project.uvprojx @@ -682,9 +682,9 @@ - cputime.c + clock_time_core.c 1 - ..\..\..\components\drivers\cputime\cputime.c + ..\..\..\components\drivers\clock_time\clock_time_core.c 2 @@ -738,9 +738,9 @@ - cputimer.c + clock_timer.c 1 - ..\..\..\components\drivers\cputime\cputimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 @@ -1018,9 +1018,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nuvoton/nk-980iot/spinor.config b/bsp/nuvoton/nk-980iot/spinor.config index 73ca797816..6a888d0214 100644 --- a/bsp/nuvoton/nk-980iot/spinor.config +++ b/bsp/nuvoton/nk-980iot/spinor.config @@ -175,9 +175,8 @@ CONFIG_RT_SERIAL_RB_BUFSZ=2048 CONFIG_RT_USING_CAN=y CONFIG_RT_CAN_USING_HDR=y # CONFIG_RT_CAN_USING_CANFD is not set -CONFIG_RT_USING_HWTIMER=y -CONFIG_RT_USING_CPUTIME=y -CONFIG_CPUTIME_TIMER_FREQ=0 +CONFIG_RT_USING_CLOCK_TIME=y +CONFIG_CLOCK_TIMER_FREQ=0 CONFIG_RT_USING_I2C=y # CONFIG_RT_I2C_DEBUG is not set CONFIG_RT_USING_I2C_BITOPS=y diff --git a/bsp/nuvoton/nk-n9h30/project.uvopt b/bsp/nuvoton/nk-n9h30/project.uvopt index 246d751843..81d2f4f59d 100644 --- a/bsp/nuvoton/nk-n9h30/project.uvopt +++ b/bsp/nuvoton/nk-n9h30/project.uvopt @@ -391,8 +391,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nuvoton/nk-n9h30/project.uvproj b/bsp/nuvoton/nk-n9h30/project.uvproj index edf97f9ebd..04314bbd0b 100644 --- a/bsp/nuvoton/nk-n9h30/project.uvproj +++ b/bsp/nuvoton/nk-n9h30/project.uvproj @@ -723,9 +723,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nuvoton/nk-rtu980/project.uvopt b/bsp/nuvoton/nk-rtu980/project.uvopt index 05e93fcc1f..ace3ba3106 100644 --- a/bsp/nuvoton/nk-rtu980/project.uvopt +++ b/bsp/nuvoton/nk-rtu980/project.uvopt @@ -367,8 +367,8 @@ 0 0 0 - ..\..\..\components\drivers\cputime\cputime.c - cputime.c + ..\..\..\components\drivers\clock_time\clock_time_core.c + clock_time_core.c 0 0 @@ -379,8 +379,8 @@ 0 0 0 - ..\..\..\components\drivers\cputime\cputimer.c - cputimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 @@ -439,8 +439,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nuvoton/nk-rtu980/project.uvproj b/bsp/nuvoton/nk-rtu980/project.uvproj index c0b81bb753..0fd0e92b88 100644 --- a/bsp/nuvoton/nk-rtu980/project.uvproj +++ b/bsp/nuvoton/nk-rtu980/project.uvproj @@ -611,9 +611,9 @@ - cputime.c + clock_time_core.c 1 - ..\..\..\components\drivers\cputime\cputime.c + ..\..\..\components\drivers\clock_time\clock_time_core.c 2 @@ -667,9 +667,9 @@ - cputimer.c + clock_timer.c 1 - ..\..\..\components\drivers\cputime\cputimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 @@ -947,9 +947,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nuvoton/numaker-iot-m467/config_lvgl b/bsp/nuvoton/numaker-iot-m467/config_lvgl index 84fce8720a..dbe4cda107 100644 --- a/bsp/nuvoton/numaker-iot-m467/config_lvgl +++ b/bsp/nuvoton/numaker-iot-m467/config_lvgl @@ -165,8 +165,7 @@ CONFIG_RT_SERIAL_RB_BUFSZ=512 CONFIG_RT_USING_CAN=y # CONFIG_RT_CAN_USING_HDR is not set # CONFIG_RT_CAN_USING_CANFD is not set -CONFIG_RT_USING_HWTIMER=y -# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_CLOCK_TIME=y CONFIG_RT_USING_I2C=y # CONFIG_RT_I2C_DEBUG is not set CONFIG_RT_USING_I2C_BITOPS=y diff --git a/bsp/nuvoton/numaker-iot-m467/project.ewp b/bsp/nuvoton/numaker-iot-m467/project.ewp index fc84f282c7..8cc03027b5 100644 --- a/bsp/nuvoton/numaker-iot-m467/project.ewp +++ b/bsp/nuvoton/numaker-iot-m467/project.ewp @@ -1224,7 +1224,7 @@ $PROJ_DIR$\..\..\..\components\drivers\hwcrypto\hwcrypto.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c diff --git a/bsp/nuvoton/numaker-iot-m467/project.uvoptx b/bsp/nuvoton/numaker-iot-m467/project.uvoptx index 687323ec13..ff6de66129 100644 --- a/bsp/nuvoton/numaker-iot-m467/project.uvoptx +++ b/bsp/nuvoton/numaker-iot-m467/project.uvoptx @@ -610,8 +610,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nuvoton/numaker-iot-m467/project.uvprojx b/bsp/nuvoton/numaker-iot-m467/project.uvprojx index 194029c15b..55b50db848 100644 --- a/bsp/nuvoton/numaker-iot-m467/project.uvprojx +++ b/bsp/nuvoton/numaker-iot-m467/project.uvprojx @@ -1336,9 +1336,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nuvoton/numaker-iot-m487/config_lvgl b/bsp/nuvoton/numaker-iot-m487/config_lvgl index bbeb858b34..02d41f8738 100644 --- a/bsp/nuvoton/numaker-iot-m487/config_lvgl +++ b/bsp/nuvoton/numaker-iot-m487/config_lvgl @@ -158,8 +158,7 @@ CONFIG_RT_SERIAL_USING_DMA=y CONFIG_RT_SERIAL_RB_BUFSZ=2048 CONFIG_RT_USING_CAN=y # CONFIG_RT_CAN_USING_HDR is not set -CONFIG_RT_USING_HWTIMER=y -# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_CLOCK_TIME=y CONFIG_RT_USING_I2C=y # CONFIG_RT_I2C_DEBUG is not set CONFIG_RT_USING_I2C_BITOPS=y diff --git a/bsp/nuvoton/numaker-iot-m487/project.ewp b/bsp/nuvoton/numaker-iot-m487/project.ewp index b5966f89f1..4fb48b1255 100644 --- a/bsp/nuvoton/numaker-iot-m487/project.ewp +++ b/bsp/nuvoton/numaker-iot-m487/project.ewp @@ -1222,7 +1222,7 @@ $PROJ_DIR$\..\..\..\components\drivers\hwcrypto\hwcrypto.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c diff --git a/bsp/nuvoton/numaker-iot-m487/project.uvoptx b/bsp/nuvoton/numaker-iot-m487/project.uvoptx index 1512157524..c4768e1d4b 100644 --- a/bsp/nuvoton/numaker-iot-m487/project.uvoptx +++ b/bsp/nuvoton/numaker-iot-m487/project.uvoptx @@ -610,8 +610,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nuvoton/numaker-iot-m487/project.uvproj b/bsp/nuvoton/numaker-iot-m487/project.uvproj index b7a1f75921..c307afedce 100644 --- a/bsp/nuvoton/numaker-iot-m487/project.uvproj +++ b/bsp/nuvoton/numaker-iot-m487/project.uvproj @@ -788,9 +788,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c diff --git a/bsp/nuvoton/numaker-iot-m487/project.uvprojx b/bsp/nuvoton/numaker-iot-m487/project.uvprojx index 6ac30b4f4e..b820f880b2 100644 --- a/bsp/nuvoton/numaker-iot-m487/project.uvprojx +++ b/bsp/nuvoton/numaker-iot-m487/project.uvprojx @@ -1335,9 +1335,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nuvoton/numaker-m032ki/config_lvgl b/bsp/nuvoton/numaker-m032ki/config_lvgl index 122f5aa244..374031f2bb 100644 --- a/bsp/nuvoton/numaker-m032ki/config_lvgl +++ b/bsp/nuvoton/numaker-m032ki/config_lvgl @@ -135,8 +135,7 @@ CONFIG_RT_USING_SERIAL_V1=y CONFIG_RT_SERIAL_USING_DMA=y CONFIG_RT_SERIAL_RB_BUFSZ=64 # CONFIG_RT_USING_CAN is not set -CONFIG_RT_USING_HWTIMER=y -# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_CLOCK_TIME=y # CONFIG_RT_USING_I2C is not set # CONFIG_RT_USING_PHY is not set CONFIG_RT_USING_PIN=y diff --git a/bsp/nuvoton/numaker-m032ki/project.ewp b/bsp/nuvoton/numaker-m032ki/project.ewp index 3b83ff3f26..d46d6fa38c 100644 --- a/bsp/nuvoton/numaker-m032ki/project.ewp +++ b/bsp/nuvoton/numaker-m032ki/project.ewp @@ -1159,7 +1159,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c diff --git a/bsp/nuvoton/numaker-m032ki/project.uvoptx b/bsp/nuvoton/numaker-m032ki/project.uvoptx index 850f005e80..06b22ba7fb 100644 --- a/bsp/nuvoton/numaker-m032ki/project.uvoptx +++ b/bsp/nuvoton/numaker-m032ki/project.uvoptx @@ -374,8 +374,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nuvoton/numaker-m032ki/project.uvprojx b/bsp/nuvoton/numaker-m032ki/project.uvprojx index 24c12cd060..2e4c8e868b 100644 --- a/bsp/nuvoton/numaker-m032ki/project.uvprojx +++ b/bsp/nuvoton/numaker-m032ki/project.uvprojx @@ -522,9 +522,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nuvoton/numaker-m2354/config_lvgl b/bsp/nuvoton/numaker-m2354/config_lvgl index 6db987d376..57e8f347ba 100644 --- a/bsp/nuvoton/numaker-m2354/config_lvgl +++ b/bsp/nuvoton/numaker-m2354/config_lvgl @@ -172,8 +172,7 @@ CONFIG_RT_SERIAL_RB_BUFSZ=2048 CONFIG_RT_USING_CAN=y # CONFIG_RT_CAN_USING_HDR is not set # CONFIG_RT_CAN_USING_CANFD is not set -CONFIG_RT_USING_HWTIMER=y -# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_CLOCK_TIME=y CONFIG_RT_USING_I2C=y # CONFIG_RT_I2C_DEBUG is not set CONFIG_RT_USING_I2C_BITOPS=y @@ -383,7 +382,7 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_RT_USING_ADT is not set # CONFIG_RT_USING_RT_LINK is not set # CONFIG_RT_USING_VBUS is not set -# CONFIG_RT_USING_KTIME is not set +# CONFIG_RT_USING_CLOCK_TIME is not set # # RT-Thread Utestcases diff --git a/bsp/nuvoton/numaker-m2354/project.ewp b/bsp/nuvoton/numaker-m2354/project.ewp index aefdd38f51..1955f42c85 100644 --- a/bsp/nuvoton/numaker-m2354/project.ewp +++ b/bsp/nuvoton/numaker-m2354/project.ewp @@ -2325,7 +2325,7 @@ $PROJ_DIR$\..\..\..\components\drivers\hwcrypto\hwcrypto.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c diff --git a/bsp/nuvoton/numaker-m2354/project.uvoptx b/bsp/nuvoton/numaker-m2354/project.uvoptx index 1780fbee3c..2e633109e0 100644 --- a/bsp/nuvoton/numaker-m2354/project.uvoptx +++ b/bsp/nuvoton/numaker-m2354/project.uvoptx @@ -654,8 +654,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nuvoton/numaker-m2354/project.uvprojx b/bsp/nuvoton/numaker-m2354/project.uvprojx index fc79bd4fbf..5294c23efd 100644 --- a/bsp/nuvoton/numaker-m2354/project.uvprojx +++ b/bsp/nuvoton/numaker-m2354/project.uvprojx @@ -1355,9 +1355,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nuvoton/numaker-m467hj/config_lvgl b/bsp/nuvoton/numaker-m467hj/config_lvgl index e2aae5679c..ff2e60bf01 100644 --- a/bsp/nuvoton/numaker-m467hj/config_lvgl +++ b/bsp/nuvoton/numaker-m467hj/config_lvgl @@ -175,8 +175,7 @@ CONFIG_RT_SERIAL_RB_BUFSZ=128 CONFIG_RT_USING_CAN=y # CONFIG_RT_CAN_USING_HDR is not set # CONFIG_RT_CAN_USING_CANFD is not set -# CONFIG_RT_USING_HWTIMER is not set -# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_CLOCK_TIME is not set CONFIG_RT_USING_I2C=y # CONFIG_RT_I2C_DEBUG is not set CONFIG_RT_USING_I2C_BITOPS=y diff --git a/bsp/nuvoton/numaker-m467hj/project.ewp b/bsp/nuvoton/numaker-m467hj/project.ewp index 596c6a8d77..1d707e5964 100644 --- a/bsp/nuvoton/numaker-m467hj/project.ewp +++ b/bsp/nuvoton/numaker-m467hj/project.ewp @@ -1207,7 +1207,7 @@ $PROJ_DIR$\..\..\..\components\drivers\hwcrypto\hwcrypto.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c diff --git a/bsp/nuvoton/numaker-m467hj/project.uvoptx b/bsp/nuvoton/numaker-m467hj/project.uvoptx index 3cdcc75865..67245e901b 100644 --- a/bsp/nuvoton/numaker-m467hj/project.uvoptx +++ b/bsp/nuvoton/numaker-m467hj/project.uvoptx @@ -498,8 +498,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nuvoton/numaker-m467hj/project.uvprojx b/bsp/nuvoton/numaker-m467hj/project.uvprojx index c02697c63a..68f7852be4 100644 --- a/bsp/nuvoton/numaker-m467hj/project.uvprojx +++ b/bsp/nuvoton/numaker-m467hj/project.uvprojx @@ -1285,9 +1285,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nuvoton/numaker-pfm-m487/config_lvgl b/bsp/nuvoton/numaker-pfm-m487/config_lvgl index 7c6f283972..c6b879ba15 100644 --- a/bsp/nuvoton/numaker-pfm-m487/config_lvgl +++ b/bsp/nuvoton/numaker-pfm-m487/config_lvgl @@ -159,8 +159,7 @@ CONFIG_RT_USING_SERIAL_V1=y CONFIG_RT_SERIAL_USING_DMA=y CONFIG_RT_SERIAL_RB_BUFSZ=128 # CONFIG_RT_USING_CAN is not set -CONFIG_RT_USING_HWTIMER=y -# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_CLOCK_TIME=y CONFIG_RT_USING_I2C=y # CONFIG_RT_I2C_DEBUG is not set CONFIG_RT_USING_I2C_BITOPS=y diff --git a/bsp/nuvoton/numaker-pfm-m487/project.ewp b/bsp/nuvoton/numaker-pfm-m487/project.ewp index ff0c072d8a..fc5f7c43f3 100644 --- a/bsp/nuvoton/numaker-pfm-m487/project.ewp +++ b/bsp/nuvoton/numaker-pfm-m487/project.ewp @@ -1205,7 +1205,7 @@ $PROJ_DIR$\..\..\..\components\drivers\hwcrypto\hwcrypto.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c diff --git a/bsp/nuvoton/numaker-pfm-m487/project.uvoptx b/bsp/nuvoton/numaker-pfm-m487/project.uvoptx index 4b9bd78d2d..a36f1e28b0 100644 --- a/bsp/nuvoton/numaker-pfm-m487/project.uvoptx +++ b/bsp/nuvoton/numaker-pfm-m487/project.uvoptx @@ -498,8 +498,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nuvoton/numaker-pfm-m487/project.uvproj b/bsp/nuvoton/numaker-pfm-m487/project.uvproj index 002e03a2bf..0ccb2abf44 100644 --- a/bsp/nuvoton/numaker-pfm-m487/project.uvproj +++ b/bsp/nuvoton/numaker-pfm-m487/project.uvproj @@ -757,9 +757,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c diff --git a/bsp/nuvoton/numaker-pfm-m487/project.uvprojx b/bsp/nuvoton/numaker-pfm-m487/project.uvprojx index 2f4a6c85a3..d37d5ebbf9 100644 --- a/bsp/nuvoton/numaker-pfm-m487/project.uvprojx +++ b/bsp/nuvoton/numaker-pfm-m487/project.uvprojx @@ -1285,9 +1285,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nxp/imx/imxrt/imxrt1021-nxp-evk/board/Kconfig b/bsp/nxp/imx/imxrt/imxrt1021-nxp-evk/board/Kconfig index 4e7ad9aad1..ae3d9590d2 100644 --- a/bsp/nxp/imx/imxrt/imxrt1021-nxp-evk/board/Kconfig +++ b/bsp/nxp/imx/imxrt/imxrt1021-nxp-evk/board/Kconfig @@ -69,16 +69,16 @@ menu "On-chip Peripheral Drivers" int "Set LPUART1 TX DMA channel (0-32)" default 1 endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable GPT" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM - config BSP_USING_HWTIMER1 + config BSP_USING_CLOCK_TIMER1 bool "Enable GPT1" default n - config BSP_USING_HWTIMER2 + config BSP_USING_CLOCK_TIMER2 bool "Enable GPT2" default n endif diff --git a/bsp/nxp/imx/imxrt/imxrt1052-fire-pro/board/Kconfig b/bsp/nxp/imx/imxrt/imxrt1052-fire-pro/board/Kconfig index 2e071dbb34..bf6b813713 100644 --- a/bsp/nxp/imx/imxrt/imxrt1052-fire-pro/board/Kconfig +++ b/bsp/nxp/imx/imxrt/imxrt1052-fire-pro/board/Kconfig @@ -92,16 +92,16 @@ menu "On-chip Peripheral Drivers" default 3 endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable GPT" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM - config BSP_USING_HWTIMER1 + config BSP_USING_CLOCK_TIMER1 bool "Enable GPT1" default n - config BSP_USING_HWTIMER2 + config BSP_USING_CLOCK_TIMER2 bool "Enable GPT2" default n endif diff --git a/bsp/nxp/imx/imxrt/imxrt1052-fire-pro/project.ewt b/bsp/nxp/imx/imxrt/imxrt1052-fire-pro/project.ewt index f2e841061a..af86848631 100644 --- a/bsp/nxp/imx/imxrt/imxrt1052-fire-pro/project.ewt +++ b/bsp/nxp/imx/imxrt/imxrt1052-fire-pro/project.ewt @@ -1215,7 +1215,7 @@ $PROJ_DIR$\..\..\..\components\drivers\src\completion.c - $PROJ_DIR$\..\..\..\components\drivers\cputime\cputime.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_time_core.c $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c diff --git a/bsp/nxp/imx/imxrt/libraries/drivers/SConscript b/bsp/nxp/imx/imxrt/libraries/drivers/SConscript index 233837fc36..9cc4b48ad6 100644 --- a/bsp/nxp/imx/imxrt/libraries/drivers/SConscript +++ b/bsp/nxp/imx/imxrt/libraries/drivers/SConscript @@ -15,8 +15,8 @@ if GetDepend('BSP_USING_GPIO'): if GetDepend('BSP_USING_LPUART'): src += ['drv_uart.c'] -if GetDepend('BSP_USING_HWTIMER'): - src += ['drv_hwtimer.c'] +if GetDepend('BSP_USING_CLOCK_TIMER'): + src += ['drv_timer.c'] if GetDepend('BSP_USING_RTC'): src += ['drv_rtc.c'] diff --git a/bsp/nxp/imx/imxrt/libraries/drivers/drv_hwtimer.c b/bsp/nxp/imx/imxrt/libraries/drivers/drv_timer.c similarity index 58% rename from bsp/nxp/imx/imxrt/libraries/drivers/drv_hwtimer.c rename to bsp/nxp/imx/imxrt/libraries/drivers/drv_timer.c index aae7fa7a18..860c483e92 100644 --- a/bsp/nxp/imx/imxrt/libraries/drivers/drv_hwtimer.c +++ b/bsp/nxp/imx/imxrt/libraries/drivers/drv_timer.c @@ -11,13 +11,13 @@ */ #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include #include -#include "drv_hwtimer.h" +#include "drv_timer.h" #include "fsl_gpt.h" #if defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL @@ -40,32 +40,32 @@ static void NVIC_Configuration(void) { -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 EnableIRQ(GPT1_IRQn); #endif -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 EnableIRQ(GPT2_IRQn); #endif } -static rt_err_t imxrt_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t imxrt_clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t err = RT_EOK; - GPT_Type *hwtimer_dev; - hwtimer_dev = (GPT_Type *)timer->parent.user_data; + GPT_Type *clock_timer_dev; + clock_timer_dev = (GPT_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; clk = EXAMPLE_GPT_CLK_FREQ; pre = clk / *((uint32_t *)args) - 1; - GPT_SetClockDivider(hwtimer_dev, pre); + GPT_SetClockDivider(clock_timer_dev, pre); } break; default: @@ -75,36 +75,36 @@ static rt_err_t imxrt_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void return err; } -static rt_uint32_t imxrt_hwtimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t imxrt_clock_timer_count_get(rt_clock_timer_t *timer) { rt_uint32_t CurrentTimer_Count; - GPT_Type *hwtimer_dev; - hwtimer_dev = (GPT_Type *)timer->parent.user_data; + GPT_Type *clock_timer_dev; + clock_timer_dev = (GPT_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); - CurrentTimer_Count = GPT_GetCurrentTimerCount(hwtimer_dev); + CurrentTimer_Count = GPT_GetCurrentTimerCount(clock_timer_dev); return CurrentTimer_Count; } -static void imxrt_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void imxrt_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { - GPT_Type *hwtimer_dev; + GPT_Type *clock_timer_dev; gpt_config_t gptConfig; - hwtimer_dev = (GPT_Type *)timer->parent.user_data; + clock_timer_dev = (GPT_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); if (state == 1) { #ifdef SOC_IMXRT1170_SERIES - #ifdef BSP_USING_HWTIMER1 + #ifdef BSP_USING_CLOCK_TIMER1 /*Clock setting for GPT*/ CLOCK_SetRootClockMux(kCLOCK_Root_Gpt1, EXAMPLE_GPT_CLOCK_SOURCE_SELECT); CLOCK_SetRootClockDiv(kCLOCK_Root_Gpt1, EXAMPLE_GPT_CLOCK_DIVIDER_SELECT); #endif - #ifdef BSP_USING_HWTIMER2 + #ifdef BSP_USING_CLOCK_TIMER2 /*Clock setting for GPT*/ CLOCK_SetRootClockMux(kCLOCK_Root_Gpt2, EXAMPLE_GPT_CLOCK_SOURCE_SELECT); CLOCK_SetRootClockDiv(kCLOCK_Root_Gpt2, EXAMPLE_GPT_CLOCK_DIVIDER_SELECT); @@ -117,73 +117,73 @@ static void imxrt_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) /* Initialize GPT module by default config */ GPT_GetDefaultConfig(&gptConfig); - GPT_Init(hwtimer_dev, &gptConfig); + GPT_Init(clock_timer_dev, &gptConfig); } } -static rt_err_t imxrt_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t imxrt_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { - GPT_Type *hwtimer_dev; - hwtimer_dev = (GPT_Type *)timer->parent.user_data; + GPT_Type *clock_timer_dev; + clock_timer_dev = (GPT_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); - hwtimer_dev->CR |= (mode != HWTIMER_MODE_PERIOD) ? GPT_CR_FRR_MASK : 0U; + clock_timer_dev->CR |= (mode != CLOCK_TIMER_MODE_PERIOD) ? GPT_CR_FRR_MASK : 0U; - GPT_SetOutputCompareValue(hwtimer_dev, kGPT_OutputCompare_Channel1, cnt); + GPT_SetOutputCompareValue(clock_timer_dev, kGPT_OutputCompare_Channel1, cnt); - GPT_EnableInterrupts(hwtimer_dev, kGPT_OutputCompare1InterruptEnable); + GPT_EnableInterrupts(clock_timer_dev, kGPT_OutputCompare1InterruptEnable); NVIC_Configuration(); - GPT_StartTimer(hwtimer_dev); + GPT_StartTimer(clock_timer_dev); return RT_EOK; } -static void imxrt_hwtimer_stop(rt_hwtimer_t *timer) +static void imxrt_clock_timer_stop(rt_clock_timer_t *timer) { - GPT_Type *hwtimer_dev; - hwtimer_dev = (GPT_Type *)timer->parent.user_data; + GPT_Type *clock_timer_dev; + clock_timer_dev = (GPT_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); - GPT_StopTimer(hwtimer_dev); + GPT_StopTimer(clock_timer_dev); } -static const struct rt_hwtimer_ops imxrt_hwtimer_ops = +static const struct rt_clock_timer_ops imxrt_clock_timer_ops = { - .init = imxrt_hwtimer_init, - .start = imxrt_hwtimer_start, - .stop = imxrt_hwtimer_stop, - .count_get = imxrt_hwtimer_count_get, - .control = imxrt_hwtimer_control, + .init = imxrt_clock_timer_init, + .start = imxrt_clock_timer_start, + .stop = imxrt_clock_timer_stop, + .count_get = imxrt_clock_timer_count_get, + .control = imxrt_clock_timer_control, }; -static const struct rt_hwtimer_info imxrt_hwtimer_info = +static const struct rt_clock_timer_info imxrt_clock_timer_info = { 25000000, /* the maximum count frequency can be set */ 6103, /* the minimum count frequency can be set */ 0xFFFFFFFF, - HWTIMER_CNTMODE_UP, + CLOCK_TIMER_CNTMODE_UP, }; -#ifdef BSP_USING_HWTIMER1 -static rt_hwtimer_t GPT_timer1; -#endif /*BSP_USING_HWTIMER1*/ +#ifdef BSP_USING_CLOCK_TIMER1 +static rt_clock_timer_t GPT_timer1; +#endif /*BSP_USING_CLOCK_TIMER1*/ -#ifdef BSP_USING_HWTIMER2 -static rt_hwtimer_t GPT_timer2; +#ifdef BSP_USING_CLOCK_TIMER2 +static rt_clock_timer_t GPT_timer2; #endif -int rt_hw_hwtimer_init(void) +int rt_hw_clock_timer_init(void) { int ret = RT_EOK; -#ifdef BSP_USING_HWTIMER1 - GPT_timer1.info = &imxrt_hwtimer_info; - GPT_timer1.ops = &imxrt_hwtimer_ops; - ret = rt_device_hwtimer_register(&GPT_timer1, "gpt1", GPT1); +#ifdef BSP_USING_CLOCK_TIMER1 + GPT_timer1.info = &imxrt_clock_timer_info; + GPT_timer1.ops = &imxrt_clock_timer_ops; + ret = rt_clock_timer_register(&GPT_timer1, "gpt1", GPT1); if (ret != RT_EOK) { @@ -191,10 +191,10 @@ int rt_hw_hwtimer_init(void) } #endif -#ifdef BSP_USING_HWTIMER2 - GPT_timer2.info = &imxrt_hwtimer_info; - GPT_timer2.ops = &imxrt_hwtimer_ops; - ret = rt_device_hwtimer_register(&GPT_timer2, "gpt2", GPT2); +#ifdef BSP_USING_CLOCK_TIMER2 + GPT_timer2.info = &imxrt_clock_timer_info; + GPT_timer2.ops = &imxrt_clock_timer_ops; + ret = rt_clock_timer_register(&GPT_timer2, "gpt2", GPT2); if (ret != RT_EOK) { @@ -205,14 +205,14 @@ int rt_hw_hwtimer_init(void) return ret; } -#ifdef BSP_USING_HWTIMER1 +#ifdef BSP_USING_CLOCK_TIMER1 void GPT1_IRQHandler(void) { if (GPT_GetStatusFlags(GPT1, kGPT_OutputCompare1Flag) != 0) { GPT_ClearStatusFlags(GPT1, kGPT_OutputCompare1Flag); - rt_device_hwtimer_isr(&GPT_timer1); + rt_clock_timer_isr(&GPT_timer1); } /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F, Cortex-M7, Cortex-M7F Store immediate overlapping @@ -222,16 +222,16 @@ void GPT1_IRQHandler(void) #endif } -#endif /*BSP_USING_HWTIMER1*/ +#endif /*BSP_USING_CLOCK_TIMER1*/ -#ifdef BSP_USING_HWTIMER2 +#ifdef BSP_USING_CLOCK_TIMER2 void GPT2_IRQHandler(void) { if (GPT_GetStatusFlags(GPT2, kGPT_OutputCompare1Flag) != 0) { GPT_ClearStatusFlags(GPT2, kGPT_OutputCompare1Flag); - rt_device_hwtimer_isr(&GPT_timer2); + rt_clock_timer_isr(&GPT_timer2); } /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F, Cortex-M7, Cortex-M7F Store immediate overlapping @@ -240,8 +240,8 @@ void GPT2_IRQHandler(void) __DSB(); #endif } -#endif /*BSP_USING_HWTIMER2*/ +#endif /*BSP_USING_CLOCK_TIMER2*/ -INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/nxp/imx/imxrt/libraries/drivers/drv_hwtimer.h b/bsp/nxp/imx/imxrt/libraries/drivers/drv_timer.h similarity index 83% rename from bsp/nxp/imx/imxrt/libraries/drivers/drv_hwtimer.h rename to bsp/nxp/imx/imxrt/libraries/drivers/drv_timer.h index 22dd018347..dc95a020b6 100644 --- a/bsp/nxp/imx/imxrt/libraries/drivers/drv_hwtimer.h +++ b/bsp/nxp/imx/imxrt/libraries/drivers/drv_timer.h @@ -8,8 +8,8 @@ * 2018-04-17 WangBing the first version. */ -#ifndef DRV_HWTIMER_H__ -#define DRV_HWTIMER_H__ +#ifndef DRV_CLOCK_TIMER_H__ +#define DRV_CLOCK_TIMER_H__ #include #include diff --git a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/board/Kconfig b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/board/Kconfig index 33e35d2ac5..02b973dfa9 100644 --- a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/board/Kconfig +++ b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/board/Kconfig @@ -53,16 +53,16 @@ menu "On-chip Peripheral Drivers" default 1 endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable GPT" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM - config BSP_USING_HWTIMER1 + config BSP_USING_CLOCK_TIMER1 bool "Enable GPT1" default n - config BSP_USING_HWTIMER2 + config BSP_USING_CLOCK_TIMER2 bool "Enable GPT2" default n endif diff --git a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.ewp b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.ewp index f5a716af31..3e1756ee27 100644 --- a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.ewp +++ b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.ewp @@ -1151,7 +1151,7 @@ DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\cputime\cputime.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_time_core.c $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c diff --git a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.uvoptx b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.uvoptx index c1f392aa34..38789ef884 100644 --- a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.uvoptx +++ b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.uvoptx @@ -536,8 +536,8 @@ 0 0 0 - ..\..\..\components\drivers\cputime\cputime.c - cputime.c + ..\..\..\components\drivers\clock_time\clock_time_core.c + clock_time_core.c 0 0 diff --git a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.uvprojx b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.uvprojx index e15669351d..e89ac7373d 100644 --- a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.uvprojx +++ b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1050xxx/project.uvprojx @@ -533,9 +533,9 @@ DeviceDrivers - cputime.c + clock_time_core.c 1 - ..\..\..\components\drivers\cputime\cputime.c + ..\..\..\components\drivers\clock_time\clock_time_core.c pin.c diff --git a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.ewp b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.ewp index 2a6b63a8a6..9d417419e3 100644 --- a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.ewp +++ b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.ewp @@ -1167,7 +1167,7 @@ DeviceDrivers - $PROJ_DIR$\..\..\..\..\..\..\NXP\RTT_BSP\imxrt_bsp\components\drivers\cputime\cputime.c + $PROJ_DIR$\..\..\..\..\..\..\NXP\RTT_BSP\imxrt_bsp\components\drivers\clock_time\clock_time_core.c $PROJ_DIR$\..\..\..\..\..\..\NXP\RTT_BSP\imxrt_bsp\components\drivers\misc\pin.c diff --git a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.uvoptx b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.uvoptx index c4218d5d92..d6fee8bb74 100644 --- a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.uvoptx +++ b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.uvoptx @@ -575,8 +575,8 @@ 0 0 0 - ..\..\..\..\..\..\NXP\RTT_BSP\imxrt_bsp\components\drivers\cputime\cputime.c - cputime.c + ..\..\..\..\..\..\NXP\RTT_BSP\imxrt_bsp\components\drivers\clock_time\clock_time_core.c + clock_time_core.c 0 0 diff --git a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.uvprojx b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.uvprojx index 9874343b6b..357075c781 100644 --- a/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.uvprojx +++ b/bsp/nxp/imx/imxrt/libraries/templates/imxrt1064xxx/project.uvprojx @@ -552,9 +552,9 @@ DeviceDrivers - cputime.c + clock_time_core.c 1 - ..\..\..\..\..\..\NXP\RTT_BSP\imxrt_bsp\components\drivers\cputime\cputime.c + ..\..\..\..\..\..\NXP\RTT_BSP\imxrt_bsp\components\drivers\clock_time\clock_time_core.c pin.c diff --git a/bsp/nxp/lpc/lpc178x/rtconfig.py b/bsp/nxp/lpc/lpc178x/rtconfig.py index 3f2d804903..4794f9a35b 100644 --- a/bsp/nxp/lpc/lpc178x/rtconfig.py +++ b/bsp/nxp/lpc/lpc178x/rtconfig.py @@ -3,7 +3,7 @@ import os # toolchains options ARCH='arm' CPU='cortex-m3' -CROSS_TOOL='keil' +CROSS_TOOL='gcc' BOARD_NAME = 'lpc178x' if os.getenv('RTT_CC'): diff --git a/bsp/nxp/lpc/lpc408x/drivers/Kconfig b/bsp/nxp/lpc/lpc408x/drivers/Kconfig index 3e9b19fb81..cc4f6f5212 100644 --- a/bsp/nxp/lpc/lpc408x/drivers/Kconfig +++ b/bsp/nxp/lpc/lpc408x/drivers/Kconfig @@ -7,9 +7,9 @@ menu "Hardware Drivers Config" select RT_USING_LWIP default n - config BSP_USING_HWTIMER0 + config BSP_USING_CLOCK_TIMER0 bool "Using timer0" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n config BSP_USING_ADC diff --git a/bsp/nxp/lpc/lpc408x/drivers/SConscript b/bsp/nxp/lpc/lpc408x/drivers/SConscript index 6557de9c16..70ac821c74 100644 --- a/bsp/nxp/lpc/lpc408x/drivers/SConscript +++ b/bsp/nxp/lpc/lpc408x/drivers/SConscript @@ -11,8 +11,8 @@ board.c if GetDepend(['BSP_USING_EMAC']): src += ['drv_emac.c'] -if GetDepend(['BSP_USING_HWTIMER0']): - src += ['drv_hwtimer.c'] +if GetDepend(['BSP_USING_CLOCK_TIMER0']): + src += ['drv_timer.c'] if GetDepend(['BSP_USING_LED']): src += ['drv_led.c'] diff --git a/bsp/nxp/lpc/lpc408x/drivers/drv_hwtimer.c b/bsp/nxp/lpc/lpc408x/drivers/drv_timer.c similarity index 70% rename from bsp/nxp/lpc/lpc408x/drivers/drv_hwtimer.c rename to bsp/nxp/lpc/lpc408x/drivers/drv_timer.c index 0357c2c1f9..70a64679b8 100644 --- a/bsp/nxp/lpc/lpc408x/drivers/drv_hwtimer.c +++ b/bsp/nxp/lpc/lpc408x/drivers/drv_timer.c @@ -12,16 +12,16 @@ #include #include "lpc_timer.h" #include "lpc_clkpwr.h" -#include "drv_hwtimer.h" +#include "drv_timer.h" -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME static void NVIC_Configuration(void) { NVIC_EnableIRQ(TIMER0_IRQn); } -static void timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { LPC_TIM_TypeDef *tim; TIM_TIMERCFG_Type cfg; @@ -40,7 +40,7 @@ static void timer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +static rt_err_t timer_start(rt_clock_timer_t *timer, rt_uint32_t t, rt_clock_timer_mode_t opmode) { LPC_TIM_TypeDef *tim; TIM_MATCHCFG_Type match; @@ -50,7 +50,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ match.MatchChannel = 0; match.IntOnMatch = ENABLE; match.ResetOnMatch = ENABLE; - match.StopOnMatch = (opmode == HWTIMER_MODE_ONESHOT) ? ENABLE : DISABLE; + match.StopOnMatch = (opmode == CLOCK_TIMER_MODE_ONESHOT) ? ENABLE : DISABLE; match.ExtMatchOutputType = 0; match.MatchValue = t; @@ -60,7 +60,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ return RT_EOK; } -static void timer_stop(rt_hwtimer_t *timer) +static void timer_stop(rt_clock_timer_t *timer) { LPC_TIM_TypeDef *tim; @@ -69,7 +69,7 @@ static void timer_stop(rt_hwtimer_t *timer) TIM_Cmd(tim, DISABLE); } -static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { LPC_TIM_TypeDef *tim; rt_err_t err = RT_EOK; @@ -78,7 +78,7 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; @@ -98,7 +98,7 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) return err; } -static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t timer_counter_get(rt_clock_timer_t *timer) { LPC_TIM_TypeDef *tim; @@ -107,15 +107,15 @@ static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) return tim->TC; } -static const struct rt_hwtimer_info _info = +static const struct rt_clock_timer_info _info = { 1000000, /* the maximum count frequency can be set */ 2000, /* the minimum count frequency can be set */ 0xFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_UP,/* Increment or Decreasing count mode */ + CLOCK_TIMER_CNTMODE_UP,/* Increment or Decreasing count mode */ }; -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_ops _ops = { timer_init, timer_start, @@ -124,14 +124,14 @@ static const struct rt_hwtimer_ops _ops = timer_ctrl, }; -static rt_hwtimer_t _timer0; +static rt_clock_timer_t _timer0; -int rt_hw_hwtimer_init(void) +int rt_hw_clock_timer_init(void) { _timer0.info = &_info; _timer0.ops = &_ops; - rt_device_hwtimer_register(&_timer0, "timer0", LPC_TIM0); + rt_clock_timer_register(&_timer0, "timer0", LPC_TIM0); return 0; } @@ -141,10 +141,10 @@ void TIMER0_IRQHandler(void) if (TIM_GetIntStatus(LPC_TIM0, TIM_MR0_INT) != RESET) { TIM_ClearIntPending(LPC_TIM0, TIM_MR0_INT); - rt_device_hwtimer_isr(&_timer0); + rt_clock_timer_isr(&_timer0); } } -INIT_BOARD_EXPORT(rt_hw_hwtimer_init); +INIT_BOARD_EXPORT(rt_hw_clock_timer_init); -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ diff --git a/bsp/nxp/lpc/lpc408x/drivers/drv_hwtimer.h b/bsp/nxp/lpc/lpc408x/drivers/drv_timer.h similarity index 63% rename from bsp/nxp/lpc/lpc408x/drivers/drv_hwtimer.h rename to bsp/nxp/lpc/lpc408x/drivers/drv_timer.h index ca34816a77..bd63fab1ac 100644 --- a/bsp/nxp/lpc/lpc408x/drivers/drv_hwtimer.h +++ b/bsp/nxp/lpc/lpc408x/drivers/drv_timer.h @@ -8,9 +8,9 @@ * 2015-09-02 heyuanjie87 the first version */ -#ifndef DRV_HWTIMER_H__ -#define DRV_HWTIMER_H__ +#ifndef DRV_CLOCK_TIMER_H__ +#define DRV_CLOCK_TIMER_H__ -int rt_hw_hwtimer_init(void); +int rt_hw_clock_timer_init(void); -#endif /* DRV_HWTIMER_H__ */ +#endif /* DRV_CLOCK_TIMER_H__ */ diff --git a/bsp/nxp/lpc/lpc408x/project.uvproj b/bsp/nxp/lpc/lpc408x/project.uvproj index ab66c409a2..45028c721b 100644 --- a/bsp/nxp/lpc/lpc408x/project.uvproj +++ b/bsp/nxp/lpc/lpc408x/project.uvproj @@ -359,7 +359,7 @@ __STDC_LIMIT_MACROS, CORE_M4, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, RT_USING_ARMLIBC - ..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\drivers\ktime\inc;.;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\drivers\ktime;..\..\..\..\components\dfs\dfs_v1\filesystems\elmfat;..\..\..\..\libcpu\arm\common;..\..\..\..\components\finsh;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\dfs\dfs_v1\filesystems\devfs;drivers;..\..\..\..\components\drivers\include;..\..\..\..\include;..\..\..\..\components\libc\posix\io\eventfd;Libraries\Drivers\include;..\..\..\..\components\libc\posix\ipc;Libraries\CMSIS\Include;applications;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\delay;..\..\..\..\components\drivers\include;..\..\..\..\components\dfs\dfs_v1\include;Libraries\Device\NXP\LPC407x_8x_177x_8x\Include + ..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\drivers\clock_time\inc;.;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\drivers\clock_time;..\..\..\..\components\dfs\dfs_v1\filesystems\elmfat;..\..\..\..\libcpu\arm\common;..\..\..\..\components\finsh;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\dfs\dfs_v1\filesystems\devfs;drivers;..\..\..\..\components\drivers\include;..\..\..\..\include;..\..\..\..\components\libc\posix\io\eventfd;Libraries\Drivers\include;..\..\..\..\components\libc\posix\ipc;Libraries\CMSIS\Include;applications;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\delay;..\..\..\..\components\drivers\include;..\..\..\..\components\dfs\dfs_v1\include;Libraries\Device\NXP\LPC407x_8x_177x_8x\Include @@ -1064,26 +1064,26 @@ - ktime + clock_time - hrtimer.c + clock_hrtimer.c 1 - ..\..\..\..\components\drivers\ktime\src\hrtimer.c + ..\..\..\..\components\drivers\clock_time\clock_hrtimer.c - boottime.c + clock_boottime.c 1 - ..\..\..\..\components\drivers\ktime\src\boottime.c + ..\..\..\..\components\drivers\clock_time\clock_boottime.c - cputimer.c + clock_time_core.c 1 - ..\..\..\..\components\drivers\ktime\src\cputimer.c + ..\..\..\..\components\drivers\clock_time\clock_time_core.c diff --git a/bsp/nxp/lpc/lpc408x/project.uvprojx b/bsp/nxp/lpc/lpc408x/project.uvprojx index f3c2dfa9cf..fa15f6e109 100644 --- a/bsp/nxp/lpc/lpc408x/project.uvprojx +++ b/bsp/nxp/lpc/lpc408x/project.uvprojx @@ -333,7 +333,7 @@ --library_interface=armcc --library_type=standardlib --diag_suppress=66,1296,186 __STDC_LIMIT_MACROS, CORE_M4, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, RT_USING_ARMLIBC - ..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\drivers\ktime\inc;.;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\drivers\ktime;..\..\..\..\components\dfs\dfs_v1\filesystems\elmfat;..\..\..\..\libcpu\arm\common;..\..\..\..\components\finsh;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\dfs\dfs_v1\filesystems\devfs;drivers;..\..\..\..\components\drivers\include;..\..\..\..\include;..\..\..\..\components\libc\posix\io\eventfd;Libraries\Drivers\include;..\..\..\..\components\libc\posix\ipc;Libraries\CMSIS\Include;applications;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\delay;..\..\..\..\components\drivers\include;..\..\..\..\components\dfs\dfs_v1\include;Libraries\Device\NXP\LPC407x_8x_177x_8x\Include + ..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\drivers\clock_time\inc;.;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\drivers\clock_time;..\..\..\..\components\dfs\dfs_v1\filesystems\elmfat;..\..\..\..\libcpu\arm\common;..\..\..\..\components\finsh;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\dfs\dfs_v1\filesystems\devfs;drivers;..\..\..\..\components\drivers\include;..\..\..\..\include;..\..\..\..\components\libc\posix\io\eventfd;Libraries\Drivers\include;..\..\..\..\components\libc\posix\ipc;Libraries\CMSIS\Include;applications;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\delay;..\..\..\..\components\drivers\include;..\..\..\..\components\dfs\dfs_v1\include;Libraries\Device\NXP\LPC407x_8x_177x_8x\Include @@ -1039,26 +1039,26 @@ - ktime + clock_time - cputimer.c + clock_time_core.c 1 - ..\..\..\..\components\drivers\ktime\src\cputimer.c + ..\..\..\..\components\drivers\clock_time\clock_time_core.c - boottime.c + clock_boottime.c 1 - ..\..\..\..\components\drivers\ktime\src\boottime.c + ..\..\..\..\components\drivers\clock_time\clock_boottime.c - hrtimer.c + clock_hrtimer.c 1 - ..\..\..\..\components\drivers\ktime\src\hrtimer.c + ..\..\..\..\components\drivers\clock_time\clock_hrtimer.c diff --git a/bsp/nxp/lpc/lpc54608-LPCXpresso/project.uvprojx b/bsp/nxp/lpc/lpc54608-LPCXpresso/project.uvprojx index e091a4f64f..d0bdb76eaf 100644 --- a/bsp/nxp/lpc/lpc54608-LPCXpresso/project.uvprojx +++ b/bsp/nxp/lpc/lpc54608-LPCXpresso/project.uvprojx @@ -332,7 +332,7 @@ --library_interface=armcc --library_type=standardlib --diag_suppress=66,1296,186 RT_USING_LIBC, CPU_LPC54608, RT_USING_ARMLIBC, SDK_DEBUGCONSOLE=0, __STDC_LIMIT_MACROS, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, CORE_M4, CPU_LPC54608J512ET180=1 - ..\..\..\..\libcpu\arm\cortex-m4;SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\net\lwip\lwip-2.0.3\src\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;drivers;..\..\..\..\components\net\sal\include\socket\sys_socket;..\..\..\..\components\libc\posix\pthreads;..\..\..\..\components\net\lwip\lwip-2.0.3\src\include\ipv4;applications;..\..\..\..\components\dfs\dfs_v1\filesystems\elmfat;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\drivers\ktime;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\libcpu\arm\common;SDK_2.2_LPCXpresso54608\CMSIS\Include;..\..\..\..\components\net\sal\include\dfs_net;SDK_2.2_LPCXpresso54608\sdmmc_2.1.2\inc;..\..\..\..\components\net\sal\include;..\..\..\..\components\net\sal\include\socket;..\..\..\..\components\finsh;.;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\dfs\dfs_v1\filesystems\devfs;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\drivers\include;..\..\..\..\include;..\..\..\..\components\net\netdev\include;..\..\..\..\components\libc\posix\io\eventfd;SDK_2.2_LPCXpresso54608\sdmmc_2.1.2\src;..\..\..\..\components\net\lwip\port;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\drivers\include;SDK_2.2_LPCXpresso54608\devices\LPC54608;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\spi;..\..\..\..\components\libc\cplusplus;..\..\..\..\components\net\sal\impl;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\delay;..\..\..\..\components\drivers\include;..\..\..\..\components\dfs\dfs_v1\include;..\..\..\..\components\net\lwip\lwip-2.0.3\src\include\netif;SDK_2.2_LPCXpresso54608\devices\LPC54608\utilities;..\..\..\..\components\drivers\ktime\inc + ..\..\..\..\libcpu\arm\cortex-m4;SDK_2.2_LPCXpresso54608\devices\LPC54608\drivers;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\net\lwip\lwip-2.0.3\src\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;drivers;..\..\..\..\components\net\sal\include\socket\sys_socket;..\..\..\..\components\libc\posix\pthreads;..\..\..\..\components\net\lwip\lwip-2.0.3\src\include\ipv4;applications;..\..\..\..\components\dfs\dfs_v1\filesystems\elmfat;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\drivers\clock_time;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\libcpu\arm\common;SDK_2.2_LPCXpresso54608\CMSIS\Include;..\..\..\..\components\net\sal\include\dfs_net;SDK_2.2_LPCXpresso54608\sdmmc_2.1.2\inc;..\..\..\..\components\net\sal\include;..\..\..\..\components\net\sal\include\socket;..\..\..\..\components\finsh;.;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\dfs\dfs_v1\filesystems\devfs;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\drivers\include;..\..\..\..\include;..\..\..\..\components\net\netdev\include;..\..\..\..\components\libc\posix\io\eventfd;SDK_2.2_LPCXpresso54608\sdmmc_2.1.2\src;..\..\..\..\components\net\lwip\port;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\drivers\include;SDK_2.2_LPCXpresso54608\devices\LPC54608;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\spi;..\..\..\..\components\libc\cplusplus;..\..\..\..\components\net\sal\impl;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\delay;..\..\..\..\components\drivers\include;..\..\..\..\components\dfs\dfs_v1\include;..\..\..\..\components\net\lwip\lwip-2.0.3\src\include\netif;SDK_2.2_LPCXpresso54608\devices\LPC54608\utilities;..\..\..\..\components\drivers\clock_time\inc @@ -1422,26 +1422,26 @@ - ktime + clock_time - boottime.c + clock_boottime.c 1 - ..\..\..\..\components\drivers\ktime\src\boottime.c + ..\..\..\..\components\drivers\clock_time\clock_boottime.c - cputimer.c + clock_time_core.c 1 - ..\..\..\..\components\drivers\ktime\src\cputimer.c + ..\..\..\..\components\drivers\clock_time\clock_time_core.c - hrtimer.c + clock_hrtimer.c 1 - ..\..\..\..\components\drivers\ktime\src\hrtimer.c + ..\..\..\..\components\drivers\clock_time\clock_hrtimer.c diff --git a/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/SConscript b/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/SConscript index db8bd4d409..772d3452bb 100644 --- a/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/SConscript +++ b/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/SConscript @@ -28,8 +28,8 @@ if GetDepend('BSP_USING_MMA8562I2C'): if GetDepend('BSP_USING_ADC'): src += ['drv_adc.c'] -if GetDepend('BSP_USING_HWTIMER'): - src += ['drv_hwtimer.c'] +if GetDepend('BSP_USING_CLOCK_TIMER'): + src += ['drv_timer.c'] if GetDepend('BSP_USING_WDT'): src += ['drv_wdt.c'] diff --git a/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_hwtimer.c b/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_timer.c similarity index 52% rename from bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_hwtimer.c rename to bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_timer.c index de082d8d15..7c7a75bc57 100644 --- a/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_hwtimer.c +++ b/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_timer.c @@ -12,13 +12,13 @@ */ #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include #include -#include "drv_hwtimer.h" +#include "drv_timer.h" #include "fsl_ctimer.h" enum @@ -34,15 +34,15 @@ enum #endif }; -struct lpc_hwtimer +struct lpc_clock_timer { - rt_hwtimer_t time_device; + rt_clock_timer_t time_device; CTIMER_Type* tim_handle; enum IRQn tim_irqn; char* name; }; -static struct lpc_hwtimer lpc_hwtimer_obj[] = +static struct lpc_clock_timer lpc_clock_timer_obj[] = { #ifdef BSP_USING_CTIMER0 TIM1_CONFIG, @@ -72,27 +72,27 @@ static void NVIC_Configuration(void) #endif } -static rt_err_t lpc_ctimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t lpc_ctimer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t err = RT_EOK; - CTIMER_Type *hwtimer_dev; - hwtimer_dev = (CTIMER_Type *)timer->parent.user_data; + CTIMER_Type *clock_timer_dev; + clock_timer_dev = (CTIMER_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; - if(hwtimer_dev == CTIMER0) clk = CLOCK_GetCTimerClkFreq(0U); - if(hwtimer_dev == CTIMER3) clk = CLOCK_GetCTimerClkFreq(3U); - if(hwtimer_dev == CTIMER4) clk = CLOCK_GetCTimerClkFreq(4U); + if(clock_timer_dev == CTIMER0) clk = CLOCK_GetCTimerClkFreq(0U); + if(clock_timer_dev == CTIMER3) clk = CLOCK_GetCTimerClkFreq(3U); + if(clock_timer_dev == CTIMER4) clk = CLOCK_GetCTimerClkFreq(4U); pre = clk / *((uint32_t *)args) - 1; - hwtimer_dev->PR = pre; + clock_timer_dev->PR = pre; } break; default: @@ -102,46 +102,46 @@ static rt_err_t lpc_ctimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *a return err; } -static rt_uint32_t lpc_ctimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t lpc_ctimer_count_get(rt_clock_timer_t *timer) { rt_uint32_t CurrentTimer_Count; - CTIMER_Type *hwtimer_dev; - hwtimer_dev = (CTIMER_Type *)timer->parent.user_data; + CTIMER_Type *clock_timer_dev; + clock_timer_dev = (CTIMER_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); - CurrentTimer_Count = hwtimer_dev->TC; + CurrentTimer_Count = clock_timer_dev->TC; return CurrentTimer_Count; } -static void lpc_ctimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void lpc_ctimer_init(rt_clock_timer_t *timer, rt_uint32_t state) { - CTIMER_Type *hwtimer_dev; + CTIMER_Type *clock_timer_dev; ctimer_config_t cfg; - hwtimer_dev = (CTIMER_Type *)timer->parent.user_data; + clock_timer_dev = (CTIMER_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); /* Use Main clock for some of the Ctimers */ - if(hwtimer_dev == CTIMER0) CLOCK_AttachClk(kMAIN_CLK_to_CTIMER0); - if(hwtimer_dev == CTIMER3) CLOCK_AttachClk(kMAIN_CLK_to_CTIMER3); - if(hwtimer_dev == CTIMER4) CLOCK_AttachClk(kMAIN_CLK_to_CTIMER4); + if(clock_timer_dev == CTIMER0) CLOCK_AttachClk(kMAIN_CLK_to_CTIMER0); + if(clock_timer_dev == CTIMER3) CLOCK_AttachClk(kMAIN_CLK_to_CTIMER3); + if(clock_timer_dev == CTIMER4) CLOCK_AttachClk(kMAIN_CLK_to_CTIMER4); - CTIMER_Deinit(hwtimer_dev); + CTIMER_Deinit(clock_timer_dev); if (state == 1) { NVIC_Configuration(); CTIMER_GetDefaultConfig(&cfg); - CTIMER_Init(hwtimer_dev, &cfg); + CTIMER_Init(clock_timer_dev, &cfg); } } -static rt_err_t lpc_ctimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t lpc_ctimer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { - CTIMER_Type *hwtimer_dev; - hwtimer_dev = (CTIMER_Type *)timer->parent.user_data; + CTIMER_Type *clock_timer_dev; + clock_timer_dev = (CTIMER_Type *)timer->parent.user_data; /* Match Configuration for Channel 0 */ ctimer_match_config_t matchCfg; @@ -149,32 +149,32 @@ static rt_err_t lpc_ctimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtime /* Configuration*/ matchCfg.enableCounterReset = true; - matchCfg.enableCounterStop = (mode == HWTIMER_MODE_ONESHOT) ? true : false;; + matchCfg.enableCounterStop = (mode == CLOCK_TIMER_MODE_ONESHOT) ? true : false;; matchCfg.matchValue = cnt; matchCfg.outControl = kCTIMER_Output_NoAction; matchCfg.outPinInitState = false; matchCfg.enableInterrupt = true; - CTIMER_SetupMatch(hwtimer_dev, kCTIMER_Match_1, &matchCfg); + CTIMER_SetupMatch(clock_timer_dev, kCTIMER_Match_1, &matchCfg); NVIC_Configuration(); - CTIMER_StartTimer(hwtimer_dev); + CTIMER_StartTimer(clock_timer_dev); return RT_EOK; } -static void lpc_ctimer_stop(rt_hwtimer_t *timer) +static void lpc_ctimer_stop(rt_clock_timer_t *timer) { - CTIMER_Type *hwtimer_dev; - hwtimer_dev = (CTIMER_Type *)timer->parent.user_data; + CTIMER_Type *clock_timer_dev; + clock_timer_dev = (CTIMER_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); - CTIMER_StopTimer(hwtimer_dev); + CTIMER_StopTimer(clock_timer_dev); } -static const struct rt_hwtimer_ops lpc_hwtimer_ops = +static const struct rt_clock_timer_ops lpc_clock_timer_ops = { .init = lpc_ctimer_init, .start = lpc_ctimer_start, @@ -183,31 +183,31 @@ static const struct rt_hwtimer_ops lpc_hwtimer_ops = .control = lpc_ctimer_control, }; -static const struct rt_hwtimer_info lpc_hwtimer_info = +static const struct rt_clock_timer_info lpc_clock_timer_info = { 25000000, /* the maximum count frequency can be set */ 6103, /* the minimum count frequency can be set */ 0xFFFFFFFF, - HWTIMER_CNTMODE_UP, + CLOCK_TIMER_CNTMODE_UP, }; -int rt_hw_hwtimer_init(void) +int rt_hw_clock_timer_init(void) { int i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(lpc_hwtimer_obj) / sizeof(lpc_hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(lpc_clock_timer_obj) / sizeof(lpc_clock_timer_obj[0]); i++) { - lpc_hwtimer_obj[i].time_device.info = &lpc_hwtimer_info; - lpc_hwtimer_obj[i].time_device.ops = &lpc_hwtimer_ops; - if (rt_device_hwtimer_register(&lpc_hwtimer_obj[i].time_device, - lpc_hwtimer_obj[i].name, lpc_hwtimer_obj[i].tim_handle) == RT_EOK) + lpc_clock_timer_obj[i].time_device.info = &lpc_clock_timer_info; + lpc_clock_timer_obj[i].time_device.ops = &lpc_clock_timer_ops; + if (rt_clock_timer_register(&lpc_clock_timer_obj[i].time_device, + lpc_clock_timer_obj[i].name, lpc_clock_timer_obj[i].tim_handle) == RT_EOK) { - LOG_D("%s register success", lpc_hwtimer_obj[i].name); + LOG_D("%s register success", lpc_clock_timer_obj[i].name); } else { - LOG_E("%s register failed", lpc_hwtimer_obj[i].name); + LOG_E("%s register failed", lpc_clock_timer_obj[i].name); result = -RT_ERROR; } } @@ -215,7 +215,7 @@ int rt_hw_hwtimer_init(void) return result; } -INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); #ifdef BSP_USING_CTIMER0 void CTIMER0_IRQHandler(void) @@ -225,10 +225,10 @@ void CTIMER0_IRQHandler(void) int_stat = CTIMER_GetStatusFlags(CTIMER0); /* Clear the status flags that were set */ CTIMER_ClearStatusFlags(CTIMER0, int_stat); - rt_device_hwtimer_isr(&lpc_hwtimer_obj[TIM1_INDEX].time_device); + rt_clock_timer_isr(&lpc_clock_timer_obj[TIM1_INDEX].time_device); } -#endif /* BSP_USING_HWTIMER0 */ +#endif /* BSP_USING_CLOCK_TIMER0 */ #ifdef BSP_USING_CTIMER3 void CTIMER3_IRQHandler(void) @@ -238,10 +238,10 @@ void CTIMER3_IRQHandler(void) int_stat = CTIMER_GetStatusFlags(CTIMER3); /* Clear the status flags that were set */ CTIMER_ClearStatusFlags(CTIMER3, int_stat); - rt_device_hwtimer_isr(&lpc_hwtimer_obj[TIM2_INDEX].time_device); + rt_clock_timer_isr(&lpc_clock_timer_obj[TIM2_INDEX].time_device); } -#endif /* BSP_USING_HWTIMER3 */ +#endif /* BSP_USING_CLOCK_TIMER3 */ #ifdef BSP_USING_CTIMER4 void CTIMER4_IRQHandler(void) @@ -251,10 +251,10 @@ void CTIMER4_IRQHandler(void) int_stat = CTIMER_GetStatusFlags(CTIMER4); /* Clear the status flags that were set */ CTIMER_ClearStatusFlags(CTIMER4, int_stat); - rt_device_hwtimer_isr(&lpc_hwtimer_obj[TIM3_INDEX].time_device); + rt_clock_timer_isr(&lpc_clock_timer_obj[TIM3_INDEX].time_device); } -#endif /* BSP_USING_HWTIMER4 */ +#endif /* BSP_USING_CLOCK_TIMER4 */ -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_hwtimer.h b/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_timer.h similarity index 91% rename from bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_hwtimer.h rename to bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_timer.h index f73aa0ca46..413bd46f77 100644 --- a/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_hwtimer.h +++ b/bsp/nxp/lpc/lpc55sxx/Libraries/drivers/drv_timer.h @@ -8,8 +8,8 @@ * 2018-04-17 WangBing the first version. */ -#ifndef DRV_HWTIMER_H__ -#define DRV_HWTIMER_H__ +#ifndef DRV_CLOCK_TIMER_H__ +#define DRV_CLOCK_TIMER_H__ #include #include @@ -41,7 +41,7 @@ } #endif /* TIM4_CONFIG */ -int rt_hw_hwtimer_init(void); +int rt_hw_clock_timer_init(void); -#endif /* __DRV_HWTIMER_H__ */ +#endif /* __DRV_CLOCK_TIMER_H__ */ diff --git a/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/board/Kconfig b/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/board/Kconfig index 3527467baf..c593e8e0d3 100644 --- a/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/board/Kconfig +++ b/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/board/Kconfig @@ -147,13 +147,13 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default y - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config BSP_USING_CTIMER0 bool "Enable CIMER0" default y diff --git a/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.ewp b/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.ewp index bb13acc40f..5c256fabc3 100644 --- a/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.ewp +++ b/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.ewp @@ -1161,7 +1161,7 @@ $PROJ_DIR$\..\Libraries\drivers\drv_mma8562.c - $PROJ_DIR$\..\Libraries\drivers\drv_hwtimer.c + $PROJ_DIR$\..\Libraries\drivers\drv_timer.c $PROJ_DIR$\..\Libraries\drivers\drv_wdt.c @@ -1221,7 +1221,7 @@ DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\i2c_core.c diff --git a/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.uvoptx b/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.uvoptx index 47b39900a1..4974afa91f 100644 --- a/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.uvoptx +++ b/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.uvoptx @@ -561,8 +561,8 @@ 0 0 0 - ..\Libraries\drivers\drv_hwtimer.c - drv_hwtimer.c + ..\Libraries\drivers\drv_timer.c + drv_timer.c 0 0 @@ -753,8 +753,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.uvprojx b/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.uvprojx index 875610e51f..0f3ff2ad97 100644 --- a/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.uvprojx +++ b/bsp/nxp/lpc/lpc55sxx/Libraries/template/lpc55s6xxxx/project.uvprojx @@ -534,9 +534,9 @@ ..\Libraries\drivers\drv_adc.c - drv_hwtimer.c + drv_timer.c 1 - ..\Libraries\drivers\drv_hwtimer.c + ..\Libraries\drivers\drv_timer.c drv_pwm.c @@ -688,9 +688,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c i2c_core.c diff --git a/bsp/nxp/lpc/lpc55sxx/lpc55s06_nxp_evk/board/Kconfig b/bsp/nxp/lpc/lpc55sxx/lpc55s06_nxp_evk/board/Kconfig index 74bdcb8a94..7c47c538fd 100644 --- a/bsp/nxp/lpc/lpc55sxx/lpc55s06_nxp_evk/board/Kconfig +++ b/bsp/nxp/lpc/lpc55sxx/lpc55s06_nxp_evk/board/Kconfig @@ -149,13 +149,13 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config BSP_USING_CTIMER0 bool "Enable CIMER0" default n diff --git a/bsp/nxp/lpc/lpc55sxx/lpc55s16_nxp_evk/board/Kconfig b/bsp/nxp/lpc/lpc55sxx/lpc55s16_nxp_evk/board/Kconfig index fb85eb0a80..70155de00a 100644 --- a/bsp/nxp/lpc/lpc55sxx/lpc55s16_nxp_evk/board/Kconfig +++ b/bsp/nxp/lpc/lpc55sxx/lpc55s16_nxp_evk/board/Kconfig @@ -149,13 +149,13 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config BSP_USING_CTIMER0 bool "Enable CIMER0" default n diff --git a/bsp/nxp/lpc/lpc55sxx/lpc55s28_nxp_evk/board/Kconfig b/bsp/nxp/lpc/lpc55sxx/lpc55s28_nxp_evk/board/Kconfig index 4e80e5ec15..0a30acb27c 100644 --- a/bsp/nxp/lpc/lpc55sxx/lpc55s28_nxp_evk/board/Kconfig +++ b/bsp/nxp/lpc/lpc55sxx/lpc55s28_nxp_evk/board/Kconfig @@ -149,13 +149,13 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config BSP_USING_CTIMER0 bool "Enable CIMER0" default n diff --git a/bsp/nxp/lpc/lpc55sxx/lpc55s36_nxp_evk/board/Kconfig b/bsp/nxp/lpc/lpc55sxx/lpc55s36_nxp_evk/board/Kconfig index 0215acf530..5862fe3217 100644 --- a/bsp/nxp/lpc/lpc55sxx/lpc55s36_nxp_evk/board/Kconfig +++ b/bsp/nxp/lpc/lpc55sxx/lpc55s36_nxp_evk/board/Kconfig @@ -149,13 +149,13 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config BSP_USING_CTIMER0 bool "Enable CIMER0" default n diff --git a/bsp/nxp/lpc/lpc55sxx/lpc55s69_nxp_evk/board/Kconfig b/bsp/nxp/lpc/lpc55sxx/lpc55s69_nxp_evk/board/Kconfig index 1ca764c295..10269eb496 100644 --- a/bsp/nxp/lpc/lpc55sxx/lpc55s69_nxp_evk/board/Kconfig +++ b/bsp/nxp/lpc/lpc55sxx/lpc55s69_nxp_evk/board/Kconfig @@ -260,13 +260,13 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config BSP_USING_CTIMER0 bool "Enable CIMER0" default n diff --git a/bsp/nxp/mcx/mcxa/Libraries/drivers/SConscript b/bsp/nxp/mcx/mcxa/Libraries/drivers/SConscript index da702a27ef..23c9d21d69 100644 --- a/bsp/nxp/mcx/mcxa/Libraries/drivers/SConscript +++ b/bsp/nxp/mcx/mcxa/Libraries/drivers/SConscript @@ -25,8 +25,8 @@ if GetDepend('BSP_USING_I2C'): if GetDepend('BSP_USING_ADC'): src += ['drv_adc.c'] -if GetDepend('BSP_USING_HWTIMER'): - src += ['drv_hwtimer.c'] +if GetDepend('BSP_USING_CLOCK_TIMER'): + src += ['drv_timer.c'] if GetDepend('BSP_USING_WDT'): src += ['drv_wdt.c'] diff --git a/bsp/nxp/mcx/mcxa/Libraries/drivers/drv_hwtimer.c b/bsp/nxp/mcx/mcxa/Libraries/drivers/drv_timer.c similarity index 59% rename from bsp/nxp/mcx/mcxa/Libraries/drivers/drv_hwtimer.c rename to bsp/nxp/mcx/mcxa/Libraries/drivers/drv_timer.c index 78b1e1e49a..e6d9a70bd4 100644 --- a/bsp/nxp/mcx/mcxa/Libraries/drivers/drv_hwtimer.c +++ b/bsp/nxp/mcx/mcxa/Libraries/drivers/drv_timer.c @@ -10,9 +10,9 @@ */ #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include #include #include "fsl_ctimer.h" @@ -57,15 +57,15 @@ enum } #endif /* TIM2_CONFIG */ -struct mcxa_hwtimer +struct mcxa_clock_timer { - rt_hwtimer_t time_device; + rt_clock_timer_t time_device; CTIMER_Type* tim_handle; enum IRQn tim_irqn; char* name; }; -static struct mcxa_hwtimer mcxa_hwtimer_obj[] = +static struct mcxa_clock_timer mcxa_clock_timer_obj[] = { #ifdef BSP_USING_CTIMER0 TIM0_CONFIG, @@ -95,27 +95,27 @@ static void NVIC_Configuration(void) #endif } -static rt_err_t mcxa_ctimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t mcxa_ctimer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t err = RT_EOK; - CTIMER_Type *hwtimer_dev; - hwtimer_dev = (CTIMER_Type *)timer->parent.user_data; + CTIMER_Type *clock_timer_dev; + clock_timer_dev = (CTIMER_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { uint32_t clk; uint32_t pre; - if(hwtimer_dev == CTIMER0) clk = CLOCK_GetCTimerClkFreq(0U); - if(hwtimer_dev == CTIMER1) clk = CLOCK_GetCTimerClkFreq(1U); - if(hwtimer_dev == CTIMER2) clk = CLOCK_GetCTimerClkFreq(2U); + if(clock_timer_dev == CTIMER0) clk = CLOCK_GetCTimerClkFreq(0U); + if(clock_timer_dev == CTIMER1) clk = CLOCK_GetCTimerClkFreq(1U); + if(clock_timer_dev == CTIMER2) clk = CLOCK_GetCTimerClkFreq(2U); pre = clk / *((uint32_t *)args) - 1; - hwtimer_dev->PR = pre; + clock_timer_dev->PR = pre; } break; default: @@ -125,46 +125,46 @@ static rt_err_t mcxa_ctimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void * return err; } -static rt_uint32_t mcxa_ctimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t mcxa_ctimer_count_get(rt_clock_timer_t *timer) { rt_uint32_t CurrentTimer_Count; - CTIMER_Type *hwtimer_dev; - hwtimer_dev = (CTIMER_Type *)timer->parent.user_data; + CTIMER_Type *clock_timer_dev; + clock_timer_dev = (CTIMER_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); - CurrentTimer_Count = hwtimer_dev->TC; + CurrentTimer_Count = clock_timer_dev->TC; return CurrentTimer_Count; } -static void mcxa_ctimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void mcxa_ctimer_init(rt_clock_timer_t *timer, rt_uint32_t state) { - CTIMER_Type *hwtimer_dev; + CTIMER_Type *clock_timer_dev; ctimer_config_t cfg; - hwtimer_dev = (CTIMER_Type *)timer->parent.user_data; + clock_timer_dev = (CTIMER_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); /* Use Main clock for some of the Ctimers */ - if(hwtimer_dev == CTIMER0) CLOCK_AttachClk(kFRO_HF_to_CTIMER0); - if(hwtimer_dev == CTIMER1) CLOCK_AttachClk(kFRO_HF_to_CTIMER1); - if(hwtimer_dev == CTIMER2) CLOCK_AttachClk(kFRO_HF_to_CTIMER2); + if(clock_timer_dev == CTIMER0) CLOCK_AttachClk(kFRO_HF_to_CTIMER0); + if(clock_timer_dev == CTIMER1) CLOCK_AttachClk(kFRO_HF_to_CTIMER1); + if(clock_timer_dev == CTIMER2) CLOCK_AttachClk(kFRO_HF_to_CTIMER2); - CTIMER_Init(hwtimer_dev, &cfg); + CTIMER_Init(clock_timer_dev, &cfg); if (state == 1) { NVIC_Configuration(); CTIMER_GetDefaultConfig(&cfg); - CTIMER_Init(hwtimer_dev, &cfg); + CTIMER_Init(clock_timer_dev, &cfg); } } -static rt_err_t mcxa_ctimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t mcxa_ctimer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { - CTIMER_Type *hwtimer_dev; - hwtimer_dev = (CTIMER_Type *)timer->parent.user_data; + CTIMER_Type *clock_timer_dev; + clock_timer_dev = (CTIMER_Type *)timer->parent.user_data; /* Match Configuration for Channel 0 */ ctimer_match_config_t matchCfg; @@ -172,32 +172,32 @@ static rt_err_t mcxa_ctimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtim /* Configuration*/ matchCfg.enableCounterReset = true; - matchCfg.enableCounterStop = (mode == HWTIMER_MODE_ONESHOT) ? true : false;; + matchCfg.enableCounterStop = (mode == CLOCK_TIMER_MODE_ONESHOT) ? true : false;; matchCfg.matchValue = cnt; matchCfg.outControl = kCTIMER_Output_NoAction; matchCfg.outPinInitState = false; matchCfg.enableInterrupt = true; - CTIMER_SetupMatch(hwtimer_dev, kCTIMER_Match_1, &matchCfg); + CTIMER_SetupMatch(clock_timer_dev, kCTIMER_Match_1, &matchCfg); NVIC_Configuration(); - CTIMER_StartTimer(hwtimer_dev); + CTIMER_StartTimer(clock_timer_dev); return RT_EOK; } -static void mcxa_ctimer_stop(rt_hwtimer_t *timer) +static void mcxa_ctimer_stop(rt_clock_timer_t *timer) { - CTIMER_Type *hwtimer_dev; - hwtimer_dev = (CTIMER_Type *)timer->parent.user_data; + CTIMER_Type *clock_timer_dev; + clock_timer_dev = (CTIMER_Type *)timer->parent.user_data; RT_ASSERT(timer != RT_NULL); - CTIMER_StopTimer(hwtimer_dev); + CTIMER_StopTimer(clock_timer_dev); } -static const struct rt_hwtimer_ops mcxa_hwtimer_ops = +static const struct rt_clock_timer_ops mcxa_clock_timer_ops = { .init = mcxa_ctimer_init, .start = mcxa_ctimer_start, @@ -206,31 +206,31 @@ static const struct rt_hwtimer_ops mcxa_hwtimer_ops = .control = mcxa_ctimer_control, }; -static const struct rt_hwtimer_info mcxa_hwtimer_info = +static const struct rt_clock_timer_info mcxa_clock_timer_info = { 96000000, /* the maximum count frequency can be set */ 6103, /* the minimum count frequency can be set */ 0xFFFFFFFF, - HWTIMER_CNTMODE_UP, + CLOCK_TIMER_CNTMODE_UP, }; -int rt_hw_hwtimer_init(void) +int rt_hw_clock_timer_init(void) { int i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(mcxa_hwtimer_obj) / sizeof(mcxa_hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(mcxa_clock_timer_obj) / sizeof(mcxa_clock_timer_obj[0]); i++) { - mcxa_hwtimer_obj[i].time_device.info = &mcxa_hwtimer_info; - mcxa_hwtimer_obj[i].time_device.ops = &mcxa_hwtimer_ops; - if (rt_device_hwtimer_register(&mcxa_hwtimer_obj[i].time_device, - mcxa_hwtimer_obj[i].name, mcxa_hwtimer_obj[i].tim_handle) == RT_EOK) + mcxa_clock_timer_obj[i].time_device.info = &mcxa_clock_timer_info; + mcxa_clock_timer_obj[i].time_device.ops = &mcxa_clock_timer_ops; + if (rt_clock_timer_register(&mcxa_clock_timer_obj[i].time_device, + mcxa_clock_timer_obj[i].name, mcxa_clock_timer_obj[i].tim_handle) == RT_EOK) { - LOG_D("%s register success", mcxa_hwtimer_obj[i].name); + LOG_D("%s register success", mcxa_clock_timer_obj[i].name); } else { - LOG_E("%s register failed", mcxa_hwtimer_obj[i].name); + LOG_E("%s register failed", mcxa_clock_timer_obj[i].name); result = -RT_ERROR; } } @@ -238,7 +238,7 @@ int rt_hw_hwtimer_init(void) return result; } -INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); #ifdef BSP_USING_CTIMER0 void CTIMER0_IRQHandler(void) @@ -249,10 +249,10 @@ void CTIMER0_IRQHandler(void) int_stat = CTIMER_GetStatusFlags(CTIMER0); /* Clear the status flags that were set */ CTIMER_ClearStatusFlags(CTIMER0, int_stat); - rt_device_hwtimer_isr(&mcxa_hwtimer_obj[TIM0_INDEX].time_device); + rt_clock_timer_isr(&mcxa_clock_timer_obj[TIM0_INDEX].time_device); rt_interrupt_leave(); } -#endif /* BSP_USING_HWTIMER0 */ +#endif /* BSP_USING_CLOCK_TIMER0 */ #ifdef BSP_USING_CTIMER1 void CTIMER1_IRQHandler(void) @@ -263,10 +263,10 @@ void CTIMER1_IRQHandler(void) int_stat = CTIMER_GetStatusFlags(CTIMER1); /* Clear the status flags that were set */ CTIMER_ClearStatusFlags(CTIMER1, int_stat); - rt_device_hwtimer_isr(&mcxa_hwtimer_obj[TIM1_INDEX].time_device); + rt_clock_timer_isr(&mcxa_clock_timer_obj[TIM1_INDEX].time_device); rt_interrupt_leave(); } -#endif /* BSP_USING_HWTIMER1 */ +#endif /* BSP_USING_CLOCK_TIMER1 */ #ifdef BSP_USING_CTIMER2 void CTIMER2_IRQHandler(void) @@ -277,10 +277,10 @@ void CTIMER2_IRQHandler(void) int_stat = CTIMER_GetStatusFlags(CTIMER2); /* Clear the status flags that were set */ CTIMER_ClearStatusFlags(CTIMER2, int_stat); - rt_device_hwtimer_isr(&mcxa_hwtimer_obj[TIM2_INDEX].time_device); + rt_clock_timer_isr(&mcxa_clock_timer_obj[TIM2_INDEX].time_device); rt_interrupt_leave(); } -#endif /* BSP_USING_HWTIMER2 */ +#endif /* BSP_USING_CLOCK_TIMER2 */ -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa153/board/Kconfig b/bsp/nxp/mcx/mcxa/frdm-mcxa153/board/Kconfig index bfb840f930..0f2b4d1af6 100644 --- a/bsp/nxp/mcx/mcxa/frdm-mcxa153/board/Kconfig +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa153/board/Kconfig @@ -101,13 +101,13 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Hardware Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default y - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config BSP_USING_CTIMER0 bool "Enable CIMER0" default y diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa153/project.uvprojx b/bsp/nxp/mcx/mcxa/frdm-mcxa153/project.uvprojx index a5b1108738..314e0b45f2 100644 --- a/bsp/nxp/mcx/mcxa/frdm-mcxa153/project.uvprojx +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa153/project.uvprojx @@ -470,9 +470,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\..\..\components\drivers\clock_time\clock_timer.c diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/Kconfig b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/Kconfig index bc13fcdb5c..87f3becb62 100644 --- a/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/Kconfig +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/board/Kconfig @@ -108,13 +108,13 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default y - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config BSP_USING_CTIMER0 bool "Enable CIMER0" default y diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvoptx b/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvoptx index 41ae9542dc..f857145a92 100644 --- a/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvoptx +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvoptx @@ -325,8 +325,8 @@ 0 0 0 - ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvprojx b/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvprojx index 4e8d74e129..2f93edb810 100644 --- a/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvprojx +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa156/project.uvprojx @@ -496,9 +496,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa346/board/Kconfig b/bsp/nxp/mcx/mcxa/frdm-mcxa346/board/Kconfig index 0820121fc5..2567117783 100644 --- a/bsp/nxp/mcx/mcxa/frdm-mcxa346/board/Kconfig +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa346/board/Kconfig @@ -76,12 +76,12 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default y - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config BSP_USING_CTIMER0 bool "Enable CIMER0" default y diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa346/project.uvoptx b/bsp/nxp/mcx/mcxa/frdm-mcxa346/project.uvoptx index 56d3a78b4d..181dd9c7ab 100644 --- a/bsp/nxp/mcx/mcxa/frdm-mcxa346/project.uvoptx +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa346/project.uvoptx @@ -342,8 +342,8 @@ 0 0 0 - ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nxp/mcx/mcxa/frdm-mcxa346/project.uvprojx b/bsp/nxp/mcx/mcxa/frdm-mcxa346/project.uvprojx index a4553409c6..4d66d9c031 100644 --- a/bsp/nxp/mcx/mcxa/frdm-mcxa346/project.uvprojx +++ b/bsp/nxp/mcx/mcxa/frdm-mcxa346/project.uvprojx @@ -501,9 +501,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nxp/mcx/mcxc/Libraries/drivers/SConscript b/bsp/nxp/mcx/mcxc/Libraries/drivers/SConscript index aedc385849..56456e2fec 100644 --- a/bsp/nxp/mcx/mcxc/Libraries/drivers/SConscript +++ b/bsp/nxp/mcx/mcxc/Libraries/drivers/SConscript @@ -28,9 +28,6 @@ if GetDepend('BSP_USING_ADC'): if GetDepend('BSP_USING_DAC'): src += ['drv_dac.c'] -if GetDepend('BSP_USING_HWTIMER'): - src += ['drv_hwtimer.c'] - if GetDepend('BSP_USING_WDT'): src += ['drv_wdt.c'] diff --git a/bsp/nxp/mcx/mcxc/frdm-mcxc444/board/Kconfig b/bsp/nxp/mcx/mcxc/frdm-mcxc444/board/Kconfig index 7800112a42..5a3a20c92b 100644 --- a/bsp/nxp/mcx/mcxc/frdm-mcxc444/board/Kconfig +++ b/bsp/nxp/mcx/mcxc/frdm-mcxc444/board/Kconfig @@ -75,10 +75,10 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default y menuconfig BSP_USING_PWM diff --git a/bsp/nxp/mcx/mcxc/frdm-mcxc444/project.ewp b/bsp/nxp/mcx/mcxc/frdm-mcxc444/project.ewp index 3d335daa09..9159d37834 100644 --- a/bsp/nxp/mcx/mcxc/frdm-mcxc444/project.ewp +++ b/bsp/nxp/mcx/mcxc/frdm-mcxc444/project.ewp @@ -2318,7 +2318,7 @@ $PROJ_DIR$\..\..\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c diff --git a/bsp/nxp/mcx/mcxc/frdm-mcxc444/project.uvprojx b/bsp/nxp/mcx/mcxc/frdm-mcxc444/project.uvprojx index ac03bd3d3d..6bde6e67c0 100644 --- a/bsp/nxp/mcx/mcxc/frdm-mcxc444/project.uvprojx +++ b/bsp/nxp/mcx/mcxc/frdm-mcxc444/project.uvprojx @@ -470,9 +470,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\..\..\components\drivers\clock_time\clock_timer.c diff --git a/bsp/nxp/mcx/mcxe/Libraries/drivers/SConscript b/bsp/nxp/mcx/mcxe/Libraries/drivers/SConscript index 9a9f0979d1..a902674e85 100644 --- a/bsp/nxp/mcx/mcxe/Libraries/drivers/SConscript +++ b/bsp/nxp/mcx/mcxe/Libraries/drivers/SConscript @@ -22,9 +22,6 @@ if GetDepend('BSP_USING_I2C'): if GetDepend('BSP_USING_ADC'): src += ['drv_adc.c'] -if GetDepend('BSP_USING_HWTIMER'): - src += ['drv_hwtimer.c'] - if GetDepend('BSP_USING_WDT'): src += ['drv_wdt.c'] diff --git a/bsp/nxp/mcx/mcxe/frdm-mcxe247/board/Kconfig b/bsp/nxp/mcx/mcxe/frdm-mcxe247/board/Kconfig index 2738f1136a..de3a7a083a 100644 --- a/bsp/nxp/mcx/mcxe/frdm-mcxe247/board/Kconfig +++ b/bsp/nxp/mcx/mcxe/frdm-mcxe247/board/Kconfig @@ -97,13 +97,13 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default y - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config BSP_USING_CTIMER0 bool "Enable CIMER0" default y diff --git a/bsp/nxp/mcx/mcxe/frdm-mcxe247/project.uvoptx b/bsp/nxp/mcx/mcxe/frdm-mcxe247/project.uvoptx index d8f793c243..d87e74043c 100644 --- a/bsp/nxp/mcx/mcxe/frdm-mcxe247/project.uvoptx +++ b/bsp/nxp/mcx/mcxe/frdm-mcxe247/project.uvoptx @@ -335,8 +335,8 @@ 0 0 0 - ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nxp/mcx/mcxe/frdm-mcxe247/project.uvprojx b/bsp/nxp/mcx/mcxe/frdm-mcxe247/project.uvprojx index b800d91322..9b1fce77b0 100644 --- a/bsp/nxp/mcx/mcxe/frdm-mcxe247/project.uvprojx +++ b/bsp/nxp/mcx/mcxe/frdm-mcxe247/project.uvprojx @@ -501,9 +501,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nxp/mcx/mcxn/Libraries/drivers/SConscript b/bsp/nxp/mcx/mcxn/Libraries/drivers/SConscript index c193f1f106..1dee3db356 100644 --- a/bsp/nxp/mcx/mcxn/Libraries/drivers/SConscript +++ b/bsp/nxp/mcx/mcxn/Libraries/drivers/SConscript @@ -34,8 +34,8 @@ if GetDepend('BSP_USING_DAC'): if GetDepend('BSP_USING_CAN'): src += ['drv_can.c'] -if GetDepend('BSP_USING_HWTIMER'): - src += ['drv_hwtimer.c'] +if GetDepend('BSP_USING_CLOCK_TIMER'): + src += ['drv_timer.c'] if GetDepend('BSP_USING_WDT'): src += ['drv_wdt.c'] diff --git a/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_hwtimer.c b/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_timer.c similarity index 50% rename from bsp/nxp/mcx/mcxn/Libraries/drivers/drv_hwtimer.c rename to bsp/nxp/mcx/mcxn/Libraries/drivers/drv_timer.c index cd65c534c6..82aa231f4e 100644 --- a/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_hwtimer.c +++ b/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_timer.c @@ -8,29 +8,29 @@ * 2024-02-21 Yilin Sun Initial revision. */ -#include "drv_hwtimer.h" +#include "drv_timer.h" -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER #include "fsl_mrt.h" typedef struct { - rt_hwtimer_t timer_device; + rt_clock_timer_t timer_device; mrt_chnl_t channel; char *name; -} mcx_hwtimer_obj_t; +} mcx_clock_timer_obj_t; -static inline rt_err_t mcx_hwtimer_mode_set(mcx_hwtimer_obj_t *handle, rt_hwtimer_mode_t mode) +static inline rt_err_t mcx_clock_timer_mode_set(mcx_clock_timer_obj_t *handle, rt_clock_timer_mode_t mode) { mrt_timer_mode_t mrt_mode; switch (mode) { - case HWTIMER_MODE_ONESHOT: + case CLOCK_TIMER_MODE_ONESHOT: mrt_mode = kMRT_OneShotMode; break; - case HWTIMER_MODE_PERIOD: + case CLOCK_TIMER_MODE_PERIOD: mrt_mode = kMRT_RepeatMode; break; @@ -43,7 +43,7 @@ static inline rt_err_t mcx_hwtimer_mode_set(mcx_hwtimer_obj_t *handle, rt_hwtime return RT_EOK; } -static void mcx_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void mcx_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { mrt_config_t mrt_config; MRT_GetDefaultConfig(&mrt_config); @@ -51,15 +51,15 @@ static void mcx_hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) MRT_Init(MRT0, &mrt_config); } -static rt_err_t mcx_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t mcx_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { rt_err_t ret = RT_EOK; - mcx_hwtimer_obj_t *handle = timer->parent.user_data; + mcx_clock_timer_obj_t *handle = timer->parent.user_data; MRT_StopTimer(MRT0, handle->channel); - ret = mcx_hwtimer_mode_set(handle, mode); + ret = mcx_clock_timer_mode_set(handle, mode); if (ret != RT_EOK) { return ret; @@ -71,33 +71,33 @@ static rt_err_t mcx_hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtim return ret; } -static void mcx_hwtimer_stop(rt_hwtimer_t *timer) +static void mcx_clock_timer_stop(rt_clock_timer_t *timer) { - mcx_hwtimer_obj_t *handle = timer->parent.user_data; + mcx_clock_timer_obj_t *handle = timer->parent.user_data; MRT_StopTimer(MRT0, handle->channel); MRT_DisableInterrupts(MRT0, handle->channel, kMRT_TimerInterruptEnable); } -static rt_uint32_t mcx_hwtimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t mcx_clock_timer_count_get(rt_clock_timer_t *timer) { - mcx_hwtimer_obj_t *handle = timer->parent.user_data; + mcx_clock_timer_obj_t *handle = timer->parent.user_data; return MRT_GetCurrentTimerCount(MRT0, handle->channel); } -static rt_err_t mcx_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t mcx_clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t ret = RT_EOK; - mcx_hwtimer_obj_t *handle = timer->parent.user_data; + mcx_clock_timer_obj_t *handle = timer->parent.user_data; switch (cmd) { - case HWTIMER_CTRL_STOP: - mcx_hwtimer_stop(timer); + case CLOCK_TIMER_CTRL_STOP: + mcx_clock_timer_stop(timer); break; - case HWTIMER_CTRL_MODE_SET: - ret = mcx_hwtimer_mode_set(handle, *(rt_hwtimer_mode_t *)args); + case CLOCK_TIMER_CTRL_MODE_SET: + ret = mcx_clock_timer_mode_set(handle, *(rt_clock_timer_mode_t *)args); if (ret != RT_EOK) { return ret; @@ -111,7 +111,7 @@ static rt_err_t mcx_hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void * return RT_EOK; } -static mcx_hwtimer_obj_t mcx_hwtimer_list[] = +static mcx_clock_timer_obj_t mcx_clock_timer_list[] = { { .name = "timer0", .channel = kMRT_Channel_0, }, { .name = "timer1", .channel = kMRT_Channel_1, }, @@ -119,37 +119,37 @@ static mcx_hwtimer_obj_t mcx_hwtimer_list[] = { .name = "timer3", .channel = kMRT_Channel_3, }, }; -static struct rt_hwtimer_info mcx_hwtimer_info = +static struct rt_clock_timer_info mcx_clock_timer_info = { - .cntmode = HWTIMER_CNTMODE_DW, + .cntmode = CLOCK_TIMER_CNTMODE_DW, .maxcnt = 0x00FFFFFF, /* 24bit counter */ .minfreq = 150000000, .maxfreq = 150000000, }; -static const struct rt_hwtimer_ops mcx_hwtimer_ops = +static const struct rt_clock_timer_ops mcx_clock_timer_ops = { - .init = mcx_hwtimer_init, - .control = mcx_hwtimer_control, - .start = mcx_hwtimer_start, - .stop = mcx_hwtimer_stop, - .count_get = mcx_hwtimer_count_get, + .init = mcx_clock_timer_init, + .control = mcx_clock_timer_control, + .start = mcx_clock_timer_start, + .stop = mcx_clock_timer_stop, + .count_get = mcx_clock_timer_count_get, }; -int rt_hw_hwtimer_init(void) +int rt_hw_clock_timer_init(void) { /* MRT frequency is fixed to AHB clock */ uint32_t mrt_freq = CLOCK_GetFreq(kCLOCK_BusClk); - mcx_hwtimer_info.minfreq = mrt_freq; - mcx_hwtimer_info.maxfreq = mrt_freq; + mcx_clock_timer_info.minfreq = mrt_freq; + mcx_clock_timer_info.maxfreq = mrt_freq; - for (uint8_t i = 0; i < ARRAY_SIZE(mcx_hwtimer_list); i++) + for (uint8_t i = 0; i < ARRAY_SIZE(mcx_clock_timer_list); i++) { - mcx_hwtimer_list[i].timer_device.info = &mcx_hwtimer_info; - mcx_hwtimer_list[i].timer_device.ops = &mcx_hwtimer_ops; + mcx_clock_timer_list[i].timer_device.info = &mcx_clock_timer_info; + mcx_clock_timer_list[i].timer_device.ops = &mcx_clock_timer_ops; - rt_err_t ret = rt_device_hwtimer_register(&mcx_hwtimer_list[i].timer_device, mcx_hwtimer_list[i].name, &mcx_hwtimer_list[i]); + rt_err_t ret = rt_clock_timer_register(&mcx_clock_timer_list[i].timer_device, mcx_clock_timer_list[i].name, &mcx_clock_timer_list[i]); if (ret != RT_EOK) { return ret; @@ -173,11 +173,11 @@ void MRT0_IRQHandler(void) { if (mrt_flag & (1U << i)) { - rt_device_hwtimer_isr(&mcx_hwtimer_list[i].timer_device); + rt_clock_timer_isr(&mcx_clock_timer_list[i].timer_device); } } } -INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_hwtimer.h b/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_timer.h similarity index 66% rename from bsp/nxp/mcx/mcxn/Libraries/drivers/drv_hwtimer.h rename to bsp/nxp/mcx/mcxn/Libraries/drivers/drv_timer.h index 5a9c5cbeba..ab1dfb444e 100644 --- a/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_hwtimer.h +++ b/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_timer.h @@ -8,13 +8,13 @@ * 2024-02-21 Yilin Sun Initial revision. */ -#ifndef __DRV_HWTIMER_H__ -#define __DRV_HWTIMER_H__ +#ifndef __DRV_CLOCK_TIMER_H__ +#define __DRV_CLOCK_TIMER_H__ #include #include -int rt_hw_hwtimer_init(void); +int rt_hw_clock_timer_init(void); -#endif /* __DRV_HWTIMER_H__ */ +#endif /* __DRV_CLOCK_TIMER_H__ */ diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn236/board/Kconfig b/bsp/nxp/mcx/mcxn/frdm-mcxn236/board/Kconfig index 7a99272d42..95d456e625 100644 --- a/bsp/nxp/mcx/mcxn/frdm-mcxn236/board/Kconfig +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn236/board/Kconfig @@ -187,10 +187,10 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default y menuconfig BSP_USING_PWM diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.ewp b/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.ewp index cebc66c1d8..5b802c5650 100644 --- a/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.ewp +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.ewp @@ -2296,7 +2296,7 @@ $PROJ_DIR$\..\..\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\..\..\components\drivers\ipc\completion_comm.c diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.uvoptx b/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.uvoptx index 7b158725d5..72917fbb7d 100644 --- a/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.uvoptx +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.uvoptx @@ -337,8 +337,8 @@ 0 0 0 - ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.uvprojx b/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.uvprojx index 95bd03e733..96bf0522ad 100644 --- a/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.uvprojx +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn236/project.uvprojx @@ -552,9 +552,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\..\..\components\drivers\clock_time\clock_timer.c 2 diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig index 3457ec51b1..5717cd092f 100644 --- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/Kconfig @@ -166,10 +166,10 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_HWTIMER - config BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER bool "Enable Timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default y menuconfig BSP_USING_PWM diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn947/project.ewp b/bsp/nxp/mcx/mcxn/frdm-mcxn947/project.ewp index 4ae265a7ec..76c5d5b835 100644 --- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/project.ewp +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/project.ewp @@ -2332,7 +2332,7 @@ $PROJ_DIR$\..\..\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\..\..\components\drivers\ipc\completion_comm.c diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn947/project.uvprojx b/bsp/nxp/mcx/mcxn/frdm-mcxn947/project.uvprojx index c06d4f4eac..df92d1e302 100644 --- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/project.uvprojx +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/project.uvprojx @@ -470,9 +470,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\..\..\components\drivers\clock_time\clock_timer.c diff --git a/bsp/qemu-virt64-riscv/driver/board.c b/bsp/qemu-virt64-riscv/driver/board.c index 092244278e..7250159e30 100644 --- a/bsp/qemu-virt64-riscv/driver/board.c +++ b/bsp/qemu-virt64-riscv/driver/board.c @@ -46,6 +46,11 @@ struct mem_desc platform_mem_desc[] = { #endif +rt_uint64_t rt_hw_get_clock_timer_freq(void) +{ + return 10000000ULL; +} + void primary_cpu_entry(void) { /* disable global interrupt */ @@ -115,4 +120,3 @@ void rt_hw_cpu_reset(void) ; } MSH_CMD_EXPORT_ALIAS(rt_hw_cpu_reset, reboot, reset machine); - diff --git a/bsp/raspberry-pi/raspi3-32/applications/test_device.c b/bsp/raspberry-pi/raspi3-32/applications/test_device.c index 69b6e840fa..a071bf8844 100644 --- a/bsp/raspberry-pi/raspi3-32/applications/test_device.c +++ b/bsp/raspberry-pi/raspi3-32/applications/test_device.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include @@ -237,15 +237,15 @@ static rt_err_t timer_timeout_cb(rt_device_t dev, rt_size_t size) return 0; } #endif -rt_err_t test_hwtimer(void) +rt_err_t test_clock_timer(void) { #ifdef BSP_USING_SYSTIMER rt_kprintf("Hello Test HW Timer!\n"); rt_err_t err; - rt_hwtimerval_t val; + rt_clock_timerval_t val; rt_device_t dev = RT_NULL; rt_tick_t tick; - rt_hwtimer_mode_t mode; + rt_clock_timer_mode_t mode; int t = 5; if ((dev = rt_device_find(TIMER)) == RT_NULL) @@ -260,8 +260,8 @@ rt_err_t test_hwtimer(void) return -1; } - mode = HWTIMER_MODE_PERIOD; - err = rt_device_control(dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + err = rt_device_control(dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); tick = rt_tick_get(); rt_kprintf("Start Timer> Tick: %d\n", tick); @@ -277,7 +277,7 @@ rt_err_t test_hwtimer(void) rt_kprintf("Sleep %d sec\n", t); rt_thread_delay(t*RT_TICK_PER_SECOND); - err = rt_device_control(dev, HWTIMER_CTRL_STOP, RT_NULL); + err = rt_device_control(dev, CLOCK_TIMER_CTRL_STOP, RT_NULL); rt_kprintf("Timer Stoped\n"); rt_device_read(dev, 0, &val, sizeof(val)); @@ -285,8 +285,8 @@ rt_err_t test_hwtimer(void) rt_device_set_rx_indicate(dev, timer_timeout_cb); - mode = HWTIMER_MODE_PERIOD; - err = rt_device_control(dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + err = rt_device_control(dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); val.sec = t; val.usec = 0; @@ -436,9 +436,9 @@ void test_device(int argc, char**argv) return; } - if (0 == strcmp(argv[1],"hwtimer")) + if (0 == strcmp(argv[1],"clock_timer")) { - test_hwtimer(); + test_clock_timer(); return; } @@ -458,6 +458,6 @@ void test_device(int argc, char**argv) test_hdmi(); return; } - rt_kprintf("param err, please entry test_device \n"); + rt_kprintf("param err, please entry test_device \n"); } -MSH_CMD_EXPORT(test_device, sample: test_device ); +MSH_CMD_EXPORT(test_device, sample: test_device ); diff --git a/bsp/raspberry-pi/raspi3-32/driver/Kconfig b/bsp/raspberry-pi/raspi3-32/driver/Kconfig index c7e7c85597..098082732e 100644 --- a/bsp/raspberry-pi/raspi3-32/driver/Kconfig +++ b/bsp/raspberry-pi/raspi3-32/driver/Kconfig @@ -22,7 +22,7 @@ menu "Hardware Drivers Config" menuconfig BSP_USING_SYSTIMER bool "Enable SYSTIMER" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n if BSP_USING_SYSTIMER diff --git a/bsp/raspberry-pi/raspi3-32/driver/drv_timer.c b/bsp/raspberry-pi/raspi3-32/driver/drv_timer.c index 117026e91c..edecb51ed5 100644 --- a/bsp/raspberry-pi/raspi3-32/driver/drv_timer.c +++ b/bsp/raspberry-pi/raspi3-32/driver/drv_timer.c @@ -12,19 +12,19 @@ #ifdef BSP_USING_SYSTIMER -static void raspi_systimer_init(rt_hwtimer_t *hwtimer, rt_uint32_t state) +static void raspi_systimer_init(rt_clock_timer_t *clock_timer, rt_uint32_t state) { if (state == 0) - hwtimer->ops->stop(hwtimer); + clock_timer->ops->stop(clock_timer); } -static rt_err_t raspi_systimer_start(rt_hwtimer_t *hwtimer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t raspi_systimer_start(rt_clock_timer_t *clock_timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { rt_err_t result = RT_EOK; - rt_systimer_t *timer = (rt_systimer_t *)hwtimer->parent.user_data; + rt_systimer_t *timer = (rt_systimer_t *)clock_timer->parent.user_data; int timer_id = timer->timer_id; - if (mode == HWTIMER_MODE_PERIOD) + if (mode == CLOCK_TIMER_MODE_PERIOD) timer->cnt = cnt; else timer->cnt = 0; @@ -48,9 +48,9 @@ static rt_err_t raspi_systimer_start(rt_hwtimer_t *hwtimer, rt_uint32_t cnt, rt_ return result; } -static void raspi_systimer_stop(rt_hwtimer_t *hwtimer) +static void raspi_systimer_stop(rt_clock_timer_t *clock_timer) { - rt_systimer_t *timer = (rt_systimer_t *)hwtimer->parent.user_data; + rt_systimer_t *timer = (rt_systimer_t *)clock_timer->parent.user_data; int timer_id = timer->timer_id; if (timer_id == 1) rt_hw_interrupt_mask(IRQ_SYSTEM_TIMER_1); @@ -59,10 +59,10 @@ static void raspi_systimer_stop(rt_hwtimer_t *hwtimer) } -static rt_err_t raspi_systimer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t raspi_systimer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { /* The frequency value is an immutable value. */ - if (cmd == HWTIMER_CTRL_FREQ_SET) + if (cmd == CLOCK_TIMER_CTRL_FREQ_SET) { return RT_EOK; } @@ -76,8 +76,8 @@ static rt_err_t raspi_systimer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void * void rt_device_systimer_isr(int vector, void *param) { - rt_hwtimer_t *hwtimer = (rt_hwtimer_t *) param; - rt_systimer_t *timer = (rt_systimer_t *)hwtimer->parent.user_data; + rt_clock_timer_t *clock_timer = (rt_clock_timer_t *) param; + rt_systimer_t *timer = (rt_systimer_t *)clock_timer->parent.user_data; RT_ASSERT(timer != RT_NULL); int timer_id = timer->timer_id; @@ -95,16 +95,16 @@ void rt_device_systimer_isr(int vector, void *param) } __sync_synchronize(); - rt_device_hwtimer_isr(hwtimer); + rt_clock_timer_isr(clock_timer); } -static struct rt_hwtimer_device _hwtimer1; -static struct rt_hwtimer_device _hwtimer3; +static struct rt_clock_timer_device _clock_timer1; +static struct rt_clock_timer_device _clock_timer3; static rt_systimer_t _systimer1; static rt_systimer_t _systimer3; -const static struct rt_hwtimer_ops systimer_ops = +const static struct rt_clock_timer_ops systimer_ops = { raspi_systimer_init, raspi_systimer_start, @@ -113,12 +113,12 @@ const static struct rt_hwtimer_ops systimer_ops = raspi_systimer_ctrl }; -static const struct rt_hwtimer_info _info = +static const struct rt_clock_timer_info _info = { 1000000, /* the maxinum count frequency can be set */ 1000000, /* the maxinum count frequency can be set */ 0xFFFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_UP /* count mode (inc/dec) */ + CLOCK_TIMER_CNTMODE_UP /* count mode (inc/dec) */ }; #endif @@ -130,19 +130,19 @@ int rt_hw_systimer_init(void) #ifdef RT_USING_SYSTIMER1 _systimer1.timer_id =1; - _hwtimer1.ops = &systimer_ops; - _hwtimer1.info = &_info; - rt_device_hwtimer_register(&_hwtimer1, "timer1",&_systimer1); - rt_hw_interrupt_install(IRQ_SYSTEM_TIMER_1, rt_device_systimer_isr, &_hwtimer1, "systimer1"); + _clock_timer1.ops = &systimer_ops; + _clock_timer1.info = &_info; + rt_clock_timer_register(&_clock_timer1, "timer1",&_systimer1); + rt_hw_interrupt_install(IRQ_SYSTEM_TIMER_1, rt_device_systimer_isr, &_clock_timer1, "systimer1"); rt_hw_interrupt_umask(IRQ_SYSTEM_TIMER_1); #endif #ifdef RT_USING_SYSTIMER3 _systimer3.timer_id =3; - _hwtimer3.ops = &systimer_ops; - _hwtimer3.info = &_info; - rt_device_hwtimer_register(&_hwtimer3, "timer3",&_systimer3); - rt_hw_interrupt_install(IRQ_SYSTEM_TIMER_3, rt_device_systimer_isr, &_hwtimer3, "systimer3"); + _clock_timer3.ops = &systimer_ops; + _clock_timer3.info = &_info; + rt_clock_timer_register(&_clock_timer3, "timer3",&_systimer3); + rt_hw_interrupt_install(IRQ_SYSTEM_TIMER_3, rt_device_systimer_isr, &_clock_timer3, "systimer3"); rt_hw_interrupt_umask(IRQ_SYSTEM_TIMER_3); #endif diff --git a/bsp/raspberry-pi/raspi3-64/driver/Kconfig b/bsp/raspberry-pi/raspi3-64/driver/Kconfig index 6ebead47a2..5632f72462 100644 --- a/bsp/raspberry-pi/raspi3-64/driver/Kconfig +++ b/bsp/raspberry-pi/raspi3-64/driver/Kconfig @@ -27,6 +27,7 @@ menu "Hardware Drivers Config" menuconfig BSP_USING_SYSTIMER bool "Enable SYSTIMER" + select RT_USING_CLOCK_TIME default n if BSP_USING_SYSTIMER diff --git a/bsp/raspberry-pi/raspi3-64/driver/drv_timer.c b/bsp/raspberry-pi/raspi3-64/driver/drv_timer.c index a8cb5149d4..eff6fe5417 100644 --- a/bsp/raspberry-pi/raspi3-64/driver/drv_timer.c +++ b/bsp/raspberry-pi/raspi3-64/driver/drv_timer.c @@ -14,19 +14,19 @@ #ifdef BSP_USING_SYSTIMER -static void raspi_systimer_init(rt_hwtimer_t *hwtimer, rt_uint32_t state) +static void raspi_systimer_init(rt_clock_timer_t *clock_timer, rt_uint32_t state) { if (state == 0) - hwtimer->ops->stop(hwtimer); + clock_timer->ops->stop(clock_timer); } -static rt_err_t raspi_systimer_start(rt_hwtimer_t *hwtimer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t raspi_systimer_start(rt_clock_timer_t *clock_timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { rt_err_t result = RT_EOK; - rt_systimer_t *timer = (rt_systimer_t *)hwtimer->parent.user_data; + rt_systimer_t *timer = (rt_systimer_t *)clock_timer->parent.user_data; int timer_id = timer->timer_id; - if (mode == HWTIMER_MODE_PERIOD) + if (mode == CLOCK_TIMER_MODE_PERIOD) timer->cnt = cnt; else timer->cnt = 0; @@ -50,9 +50,9 @@ static rt_err_t raspi_systimer_start(rt_hwtimer_t *hwtimer, rt_uint32_t cnt, rt_ return result; } -static void raspi_systimer_stop(rt_hwtimer_t *hwtimer) +static void raspi_systimer_stop(rt_clock_timer_t *clock_timer) { - rt_systimer_t *timer = (rt_systimer_t *)hwtimer->parent.user_data; + rt_systimer_t *timer = (rt_systimer_t *)clock_timer->parent.user_data; int timer_id = timer->timer_id; if (timer_id == 1) rt_hw_interrupt_mask(IRQ_SYSTEM_TIMER_1); @@ -61,10 +61,10 @@ static void raspi_systimer_stop(rt_hwtimer_t *hwtimer) } -static rt_err_t raspi_systimer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t raspi_systimer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { /* The frequency value is an immutable value. */ - if (cmd == HWTIMER_CTRL_FREQ_SET) + if (cmd == CLOCK_TIMER_CTRL_FREQ_SET) { return RT_EOK; } @@ -78,8 +78,8 @@ static rt_err_t raspi_systimer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void * void rt_device_systimer_isr(int vector, void *param) { - rt_hwtimer_t *hwtimer = (rt_hwtimer_t *) param; - rt_systimer_t *timer = (rt_systimer_t *)hwtimer->parent.user_data; + rt_clock_timer_t *clock_timer = (rt_clock_timer_t *) param; + rt_systimer_t *timer = (rt_systimer_t *)clock_timer->parent.user_data; RT_ASSERT(timer != RT_NULL); int timer_id = timer->timer_id; @@ -97,20 +97,20 @@ void rt_device_systimer_isr(int vector, void *param) } __sync_synchronize(); - rt_device_hwtimer_isr(hwtimer); + rt_clock_timer_isr(clock_timer); } #ifdef RT_USING_SYSTIMER1 -static struct rt_hwtimer_device _hwtimer1; +static struct rt_clock_timer_device _clock_timer1; static rt_systimer_t _systimer1; #endif #ifdef RT_USING_SYSTIMER3 -static struct rt_hwtimer_device _hwtimer3; +static struct rt_clock_timer_device _clock_timer3; static rt_systimer_t _systimer3; #endif -const static struct rt_hwtimer_ops systimer_ops = +const static struct rt_clock_timer_ops systimer_ops = { raspi_systimer_init, raspi_systimer_start, @@ -119,12 +119,12 @@ const static struct rt_hwtimer_ops systimer_ops = raspi_systimer_ctrl }; -static const struct rt_hwtimer_info _info = +static const struct rt_clock_timer_info _info = { 1000000, /* the maxinum count frequency can be set */ 1000000, /* the maxinum count frequency can be set */ 0xFFFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_UP /* count mode (inc/dec) */ + CLOCK_TIMER_CNTMODE_UP /* count mode (inc/dec) */ }; #endif @@ -136,19 +136,19 @@ int rt_hw_systimer_init(void) #ifdef RT_USING_SYSTIMER1 _systimer1.timer_id =1; - _hwtimer1.ops = &systimer_ops; - _hwtimer1.info = &_info; - rt_device_hwtimer_register(&_hwtimer1, "timer1",&_systimer1); - rt_hw_interrupt_install(IRQ_SYSTEM_TIMER_1, rt_device_systimer_isr, &_hwtimer1, "systimer1"); + _clock_timer1.ops = &systimer_ops; + _clock_timer1.info = &_info; + rt_clock_timer_register(&_clock_timer1, "timer1",&_systimer1); + rt_hw_interrupt_install(IRQ_SYSTEM_TIMER_1, rt_device_systimer_isr, &_clock_timer1, "systimer1"); rt_hw_interrupt_umask(IRQ_SYSTEM_TIMER_1); #endif #ifdef RT_USING_SYSTIMER3 _systimer3.timer_id =3; - _hwtimer3.ops = &systimer_ops; - _hwtimer3.info = &_info; - rt_device_hwtimer_register(&_hwtimer3, "timer3",&_systimer3); - rt_hw_interrupt_install(IRQ_SYSTEM_TIMER_3, rt_device_systimer_isr, &_hwtimer3, "systimer3"); + _clock_timer3.ops = &systimer_ops; + _clock_timer3.info = &_info; + rt_clock_timer_register(&_clock_timer3, "timer3",&_systimer3); + rt_hw_interrupt_install(IRQ_SYSTEM_TIMER_3, rt_device_systimer_isr, &_clock_timer3, "systimer3"); rt_hw_interrupt_umask(IRQ_SYSTEM_TIMER_3); #endif diff --git a/bsp/raspberry-pico/Drivers/SConscript b/bsp/raspberry-pico/Drivers/SConscript index dbd1b4f654..5afbe70b28 100644 --- a/bsp/raspberry-pico/Drivers/SConscript +++ b/bsp/raspberry-pico/Drivers/SConscript @@ -34,8 +34,8 @@ if GetDepend('BSP_USING_ON_CHIP_FLASH'): if GetDepend('BSP_USING_PWM'): src += ['drv_pwm.c'] -if GetDepend('BSP_USING_HWTIMER'): - src += ['drv_hwtimer.c'] +if GetDepend('BSP_USING_CLOCK_TIMER'): + src += ['drv_timer.c'] if GetDepend('BSP_USING_RTC'): src += ['drv_rtc.c'] diff --git a/bsp/raspberry-pico/Drivers/drv_hwtimer.c b/bsp/raspberry-pico/Drivers/drv_timer.c similarity index 57% rename from bsp/raspberry-pico/Drivers/drv_hwtimer.c rename to bsp/raspberry-pico/Drivers/drv_timer.c index cefacd5477..4fd9d73789 100644 --- a/bsp/raspberry-pico/Drivers/drv_hwtimer.c +++ b/bsp/raspberry-pico/Drivers/drv_timer.c @@ -8,43 +8,43 @@ * 2023-10-30 ChuShicheng first version */ -#include "drv_hwtimer.h" +#include "drv_timer.h" #include "board.h" -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER #define DBG_LEVEL DBG_LOG #include -#define LOG_TAG "DRV.HWTIMER" +#define LOG_TAG "DRV.CLOCK_TIMER" typedef struct _timer { char *name; struct repeating_timer repeat_timer; alarm_id_t alarm_id; - rt_hwtimer_t timer; + rt_clock_timer_t timer; }_timer_t; -static void _hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state); -static rt_err_t _hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode); -static void _hwtimer_stop(rt_hwtimer_t *timer); -static rt_uint32_t _hwtimer_count_get(rt_hwtimer_t *timer); -static rt_err_t _hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args); +static void _clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state); +static rt_err_t _clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode); +static void _clock_timer_stop(rt_clock_timer_t *timer); +static rt_uint32_t _clock_timer_count_get(rt_clock_timer_t *timer); +static rt_err_t _clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args); static int64_t _hwtmr_isr(alarm_id_t id, void *user_data); -static const struct rt_hwtimer_ops _hwtimer_ops = { - .init = _hwtimer_init, - .start = _hwtimer_start, - .stop = _hwtimer_stop, - .count_get = _hwtimer_count_get, - .control = _hwtimer_control +static const struct rt_clock_timer_ops _clock_timer_ops = { + .init = _clock_timer_init, + .start = _clock_timer_start, + .stop = _clock_timer_stop, + .count_get = _clock_timer_count_get, + .control = _clock_timer_control }; -static const struct rt_hwtimer_info _hwtimer_info = { +static const struct rt_clock_timer_info _clock_timer_info = { .maxfreq = 1000000UL, .minfreq = 1000000UL, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_MODE_PERIOD + .cntmode = CLOCK_TIMER_MODE_PERIOD }; #ifdef BSP_USING_TIMER0 @@ -78,26 +78,26 @@ static _timer_t *_timer_obj[] = { static int64_t _hwtmr_isr(alarm_id_t id, void *user_data) { _timer_t *_tmr = rt_container_of(id, _timer_t, alarm_id); - rt_device_hwtimer_isr(&_tmr->timer); + rt_clock_timer_isr(&_tmr->timer); return RT_TRUE; } static bool _repeat_timer_isr(struct repeating_timer *t) { _timer_t *_tmr = rt_container_of(t, _timer_t, repeat_timer); - rt_device_hwtimer_isr(&_tmr->timer); + rt_clock_timer_isr(&_tmr->timer); return RT_TRUE; } -static void _hwtimer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void _clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { } -static rt_err_t _hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t _clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { _timer_t *_tmr = rt_container_of(timer, _timer_t, timer); - if(mode == HWTIMER_MODE_ONESHOT) + if(mode == CLOCK_TIMER_MODE_ONESHOT) _tmr->alarm_id = add_alarm_in_us(cnt, _hwtmr_isr, RT_NULL, RT_TRUE); else add_repeating_timer_us(cnt, _repeat_timer_isr, RT_NULL, &_tmr->repeat_timer); @@ -105,55 +105,55 @@ static rt_err_t _hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t cnt, rt_hwtimer_ return RT_EOK; } -static void _hwtimer_stop(rt_hwtimer_t *timer) +static void _clock_timer_stop(rt_clock_timer_t *timer) { _timer_t *_tmr = rt_container_of(timer, _timer_t, timer); - if(timer->mode == HWTIMER_MODE_ONESHOT) + if(timer->mode == CLOCK_TIMER_MODE_ONESHOT) cancel_alarm(_tmr->alarm_id); else cancel_repeating_timer(&_tmr->repeat_timer); } -static rt_uint32_t _hwtimer_count_get(rt_hwtimer_t *timer) +static rt_uint32_t _clock_timer_count_get(rt_clock_timer_t *timer) { _timer_t *_tmr = rt_container_of(timer, _timer_t, timer); return timer_hw->alarm[_tmr->alarm_id]; } -static rt_err_t _hwtimer_control(rt_hwtimer_t *timer, rt_uint32_t cmd, void *args) +static rt_err_t _clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) { rt_err_t err = RT_EOK; _timer_t *_tmr = rt_container_of(timer, _timer_t, timer); switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: err = -RT_ERROR; break; - case HWTIMER_CTRL_INFO_GET: - *(rt_hwtimer_t*)args = _tmr->timer; + case CLOCK_TIMER_CTRL_INFO_GET: + *(rt_clock_timer_t*)args = _tmr->timer; break; - case HWTIMER_CTRL_MODE_SET: + case CLOCK_TIMER_CTRL_MODE_SET: _tmr->timer.mode = *(rt_uint32_t*)args; break; - case HWTIMER_CTRL_STOP: - _hwtimer_stop(timer); + case CLOCK_TIMER_CTRL_STOP: + _clock_timer_stop(timer); break; } return err; } -int rt_hw_hwtimer_init(void) +int rt_hw_clock_timer_init(void) { int ret = RT_EOK; for (uint32_t i = 0; i < sizeof(_timer_obj) / sizeof(_timer_obj[0]); i++) { - _timer_obj[i]->timer.info = &_hwtimer_info; - _timer_obj[i]->timer.ops = &_hwtimer_ops; - ret = rt_device_hwtimer_register(&_timer_obj[i]->timer, _timer_obj[i]->name, _timer_obj[i]); + _timer_obj[i]->timer.info = &_clock_timer_info; + _timer_obj[i]->timer.ops = &_clock_timer_ops; + ret = rt_clock_timer_register(&_timer_obj[i]->timer, _timer_obj[i]->name, _timer_obj[i]); if (ret != RT_EOK) { LOG_E("%s register failed", _timer_obj[i]->name); @@ -163,5 +163,5 @@ int rt_hw_hwtimer_init(void) return ret; } -INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); -#endif /* BSP_USING_HWTIMER */ +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/raspberry-pico/Drivers/drv_hwtimer.h b/bsp/raspberry-pico/Drivers/drv_timer.h similarity index 67% rename from bsp/raspberry-pico/Drivers/drv_hwtimer.h rename to bsp/raspberry-pico/Drivers/drv_timer.h index e84eb568cf..2b6c0c1c75 100644 --- a/bsp/raspberry-pico/Drivers/drv_hwtimer.h +++ b/bsp/raspberry-pico/Drivers/drv_timer.h @@ -7,11 +7,11 @@ * Date Author Notes * 2023-10-30 ChuShicheng first version */ -#ifndef DRV_HWTIMER_H -#define DRV_HWTIMER_H +#ifndef DRV_CLOCK_TIMER_H +#define DRV_CLOCK_TIMER_H #include -int rt_hw_hwtimer_init(void); +int rt_hw_clock_timer_init(void); -#endif /* DRV_HWTIMER_H */ +#endif /* DRV_CLOCK_TIMER_H */ diff --git a/bsp/raspberry-pico/RP2040/board/Kconfig b/bsp/raspberry-pico/RP2040/board/Kconfig index bffb545386..b1b70a9a38 100644 --- a/bsp/raspberry-pico/RP2040/board/Kconfig +++ b/bsp/raspberry-pico/RP2040/board/Kconfig @@ -659,25 +659,25 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_TIMER0 - bool "Enable HWTIMER0" + bool "Enable CLOCK_TIMER0" default n config BSP_USING_TIMER1 - bool "Enable HWTIMER1" + bool "Enable CLOCK_TIMER1" default n config BSP_USING_TIMER2 - bool "Enable HWTIMER2" + bool "Enable CLOCK_TIMER2" default n config BSP_USING_TIMER3 - bool "Enable HWTIMER3" + bool "Enable CLOCK_TIMER3" default n endif diff --git a/bsp/raspberry-pico/RP2350/board/Kconfig b/bsp/raspberry-pico/RP2350/board/Kconfig index bffb545386..b1b70a9a38 100644 --- a/bsp/raspberry-pico/RP2350/board/Kconfig +++ b/bsp/raspberry-pico/RP2350/board/Kconfig @@ -659,25 +659,25 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER config BSP_USING_TIMER0 - bool "Enable HWTIMER0" + bool "Enable CLOCK_TIMER0" default n config BSP_USING_TIMER1 - bool "Enable HWTIMER1" + bool "Enable CLOCK_TIMER1" default n config BSP_USING_TIMER2 - bool "Enable HWTIMER2" + bool "Enable CLOCK_TIMER2" default n config BSP_USING_TIMER3 - bool "Enable HWTIMER3" + bool "Enable CLOCK_TIMER3" default n endif diff --git a/bsp/renesas/docs/Introduction_to_RA_Series_Drives.md b/bsp/renesas/docs/Introduction_to_RA_Series_Drives.md index c35946ddd9..b058af1f08 100644 --- a/bsp/renesas/docs/Introduction_to_RA_Series_Drives.md +++ b/bsp/renesas/docs/Introduction_to_RA_Series_Drives.md @@ -36,7 +36,7 @@ The driver libraries currently provided by RT-Thread already support multiple se | [SPI](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/spi/spi) | Send and receive data over SPI | | [ADC](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/adc/adc) | Measure the analog data on the pin | | SDIO | Read and write data through SDIO | -| [TIMER](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/hwtimer/hwtimer) | Use hardware timers to implement the function of measuring time and timing execution callback functions | +| [TIMER](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/clock_timer/clock_timer) | Use hardware timers to implement the function of measuring time and timing execution callback functions | | [PWM](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm) | Outputs a PWM waveform at a specific pin | | [RTC](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/rtc/rtc) | Set and read times | | [WDT](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/watchdog/watchdog) | Watchdog driver | diff --git a/bsp/renesas/libraries/HAL_Drivers/drivers/SConscript b/bsp/renesas/libraries/HAL_Drivers/drivers/SConscript index 75e41c133a..128ac93982 100644 --- a/bsp/renesas/libraries/HAL_Drivers/drivers/SConscript +++ b/bsp/renesas/libraries/HAL_Drivers/drivers/SConscript @@ -48,7 +48,7 @@ if GetDepend(['BSP_USING_PWM']): src += ['drv_pwm.c'] if GetDepend(['BSP_USING_TIM']): - src += ['drv_hwtimer.c'] + src += ['drv_timer.c'] if GetDepend(['BSP_USING_ETH']): src += ['drv_eth.c'] diff --git a/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra6e2/timer_config.h b/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra6e2/timer_config.h index cf707670d7..2669a521eb 100644 --- a/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra6e2/timer_config.h +++ b/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra6e2/timer_config.h @@ -37,7 +37,7 @@ extern "C" .maxfreq = 120000000, \ .minfreq = 1875000, \ .maxcnt = 0XFFFFFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra6m3/timer_config.h b/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra6m3/timer_config.h index cf707670d7..2669a521eb 100644 --- a/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra6m3/timer_config.h +++ b/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra6m3/timer_config.h @@ -37,7 +37,7 @@ extern "C" .maxfreq = 120000000, \ .minfreq = 1875000, \ .maxcnt = 0XFFFFFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra8/timer_config.h b/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra8/timer_config.h index 9e2d62b51f..aa946162cc 100644 --- a/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra8/timer_config.h +++ b/bsp/renesas/libraries/HAL_Drivers/drivers/config/ra8/timer_config.h @@ -38,7 +38,7 @@ extern "C" .maxfreq = 250000000, \ .minfreq = 1562500, \ .maxcnt = 0XFFFFFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/renesas/libraries/HAL_Drivers/drivers/config/rzt/timer_config.h b/bsp/renesas/libraries/HAL_Drivers/drivers/config/rzt/timer_config.h index 842a3eba59..090aed5170 100644 --- a/bsp/renesas/libraries/HAL_Drivers/drivers/config/rzt/timer_config.h +++ b/bsp/renesas/libraries/HAL_Drivers/drivers/config/rzt/timer_config.h @@ -38,7 +38,7 @@ extern "C" .maxfreq = 400000000, \ .minfreq = 1562500, \ .maxcnt = 0XFFFFFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/renesas/libraries/HAL_Drivers/drivers/drv_hwtimer.c b/bsp/renesas/libraries/HAL_Drivers/drivers/drv_timer.c similarity index 69% rename from bsp/renesas/libraries/HAL_Drivers/drivers/drv_hwtimer.c rename to bsp/renesas/libraries/HAL_Drivers/drivers/drv_timer.c index bf7f2c79a2..8a4e71cd86 100644 --- a/bsp/renesas/libraries/HAL_Drivers/drivers/drv_hwtimer.c +++ b/bsp/renesas/libraries/HAL_Drivers/drivers/drv_timer.c @@ -9,15 +9,15 @@ */ #include "board.h" -#include "drv_hwtimer.h" +#include "drv_timer.h" //#define DRV_DEBUG #define LOG_TAG "drv.timer" #include -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME -static struct ra_hwtimer ra_hwtimer_obj[BSP_TIMERS_NUM] = +static struct ra_clock_timer ra_clock_timer_obj[BSP_TIMERS_NUM] = { #ifdef BSP_USING_TIM0 [BSP_TIMER0_INDEX] = TIMER_DRV_INITIALIZER(0), @@ -60,12 +60,12 @@ const rt_uint32_t PLCKD_FREQ_PRESCALER[PLCKD_PRESCALER_MAX_SELECT] = #endif }; -static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { RT_ASSERT(timer != RT_NULL); - struct ra_hwtimer *tim; - tim = (struct ra_hwtimer *)timer->parent.user_data; + struct ra_clock_timer *tim; + tim = (struct ra_clock_timer *)timer->parent.user_data; if (state) { @@ -80,13 +80,13 @@ static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) } } -static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t pr, rt_hwtimer_mode_t opmode) +static rt_err_t timer_start(rt_clock_timer_t *timer, rt_uint32_t pr, rt_clock_timer_mode_t opmode) { RT_ASSERT(timer != RT_NULL); RT_ASSERT(opmode != RT_NULL); - struct ra_hwtimer *tim; - tim = (struct ra_hwtimer *)timer->parent.user_data; + struct ra_clock_timer *tim; + tim = (struct ra_clock_timer *)timer->parent.user_data; fsp_err_t err = FSP_SUCCESS; /* set timer count */ @@ -105,12 +105,12 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t pr, rt_hwtimer_mode return (err == FSP_SUCCESS) ? RT_EOK : -RT_ERROR; } -static void timer_stop(rt_hwtimer_t *timer) +static void timer_stop(rt_clock_timer_t *timer) { - struct ra_hwtimer *tim = RT_NULL; + struct ra_clock_timer *tim = RT_NULL; RT_ASSERT(timer != RT_NULL); - tim = (struct ra_hwtimer *)timer->parent.user_data; + tim = (struct ra_clock_timer *)timer->parent.user_data; /* stop timer */ R_GPT_Stop(tim->g_ctrl); @@ -119,13 +119,13 @@ static void timer_stop(rt_hwtimer_t *timer) R_GPT_CounterSet(tim->g_ctrl, 0); } -static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t timer_counter_get(rt_clock_timer_t *timer) { - struct ra_hwtimer *tim = RT_NULL; + struct ra_clock_timer *tim = RT_NULL; RT_ASSERT(timer != RT_NULL); - tim = (struct ra_hwtimer *)timer->parent.user_data; + tim = (struct ra_clock_timer *)timer->parent.user_data; #if defined(SOC_SERIES_R7KA8P1) timer_info_t info; @@ -142,19 +142,19 @@ static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) #endif } -static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { rt_err_t result = RT_EOK; - struct ra_hwtimer *tim = RT_NULL; + struct ra_clock_timer *tim = RT_NULL; RT_ASSERT(timer != RT_NULL); RT_ASSERT(arg != RT_NULL); - tim = (struct ra_hwtimer *)timer->parent.user_data; + tim = (struct ra_clock_timer *)timer->parent.user_data; switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint8_t index = 0; rt_uint32_t freq = *((rt_uint32_t *)arg); @@ -209,7 +209,7 @@ void timer0_callback(timer_callback_args_t *p_args) if (TIMER_EVENT_CYCLE_END == p_args->event) { - rt_device_hwtimer_isr(&ra_hwtimer_obj[BSP_TIMER0_INDEX].tmr_device); + rt_clock_timer_isr(&ra_clock_timer_obj[BSP_TIMER0_INDEX].tmr_device); timer_one_shot_check(); } @@ -227,7 +227,7 @@ void timer1_callback(timer_callback_args_t *p_args) if (TIMER_EVENT_CYCLE_END == p_args->event) { - rt_device_hwtimer_isr(&ra_hwtimer_obj[BSP_TIMER1_INDEX].tmr_device); + rt_clock_timer_isr(&ra_clock_timer_obj[BSP_TIMER1_INDEX].tmr_device); timer_one_shot_check(); } @@ -237,7 +237,7 @@ void timer1_callback(timer_callback_args_t *p_args) } #endif -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_ops _ops = { .init = timer_init, .start = timer_start, @@ -246,70 +246,70 @@ static const struct rt_hwtimer_ops _ops = .control = timer_ctrl, }; -static const struct rt_hwtimer_info _info = TMR_DEV_INFO_CONFIG; +static const struct rt_clock_timer_info _info = TMR_DEV_INFO_CONFIG; -static int rt_hw_hwtimer_init(void) +static int rt_hw_clock_timer_init(void) { int result = RT_EOK; - for (int i = 0; i < sizeof(ra_hwtimer_obj) / sizeof(ra_hwtimer_obj[0]); i++) + for (int i = 0; i < sizeof(ra_clock_timer_obj) / sizeof(ra_clock_timer_obj[0]); i++) { - ra_hwtimer_obj[i].tmr_device.info = &_info; - ra_hwtimer_obj[i].tmr_device.ops = &_ops; - if (rt_device_hwtimer_register(&ra_hwtimer_obj[i].tmr_device, ra_hwtimer_obj[i].name, &ra_hwtimer_obj[i]) == RT_EOK) + ra_clock_timer_obj[i].tmr_device.info = &_info; + ra_clock_timer_obj[i].tmr_device.ops = &_ops; + if (rt_clock_timer_register(&ra_clock_timer_obj[i].tmr_device, ra_clock_timer_obj[i].name, &ra_clock_timer_obj[i]) == RT_EOK) { - LOG_D("%s register success", ra_hwtimer_obj[i].name); + LOG_D("%s register success", ra_clock_timer_obj[i].name); } else { - LOG_E("%s register failed", ra_hwtimer_obj[i].name); + LOG_E("%s register failed", ra_clock_timer_obj[i].name); result = -RT_ERROR; } } return result; } -INIT_BOARD_EXPORT(rt_hw_hwtimer_init); +INIT_BOARD_EXPORT(rt_hw_clock_timer_init); -/* This is a hwtimer example */ -#define HWTIMER_DEV_NAME "timer0" /* device name */ +/* This is a clock_timer example */ +#define CLOCK_TIMER_DEV_NAME "timer0" /* device name */ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { - rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("this is clock_timer timeout callback fucntion!\n"); rt_kprintf("tick is :%d !\n", rt_tick_get()); return RT_EOK; } -int hwtimer_sample(void) +int clock_timer_sample(void) { rt_err_t ret = RT_EOK; - rt_hwtimerval_t timeout_s; + rt_clock_timerval_t timeout_s; rt_device_t hw_dev = RT_NULL; - rt_hwtimer_mode_t mode; + rt_clock_timer_mode_t mode; rt_uint32_t freq = 1875000; /* 1Mhz */ - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", CLOCK_TIMER_DEV_NAME); return -RT_ERROR; } ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); if (ret != RT_EOK) { - rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + rt_kprintf("open %s device failed!\n", CLOCK_TIMER_DEV_NAME); return ret; } rt_device_set_rx_indicate(hw_dev, timeout_cb); - rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq); + rt_device_control(hw_dev, CLOCK_TIMER_CTRL_FREQ_SET, &freq); - mode = HWTIMER_MODE_PERIOD; - ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); if (ret != RT_EOK) { rt_kprintf("set mode failed! ret is :%d\n", ret); @@ -325,12 +325,12 @@ int hwtimer_sample(void) return -RT_ERROR; } - /* read hwtimer value */ + /* read clock_timer value */ rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec); return ret; } -MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); +MSH_CMD_EXPORT(clock_timer_sample, clock_timer sample); -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/renesas/libraries/HAL_Drivers/drivers/drv_hwtimer.h b/bsp/renesas/libraries/HAL_Drivers/drivers/drv_timer.h similarity index 85% rename from bsp/renesas/libraries/HAL_Drivers/drivers/drv_hwtimer.h rename to bsp/renesas/libraries/HAL_Drivers/drivers/drv_timer.h index 8ef599f11a..6959cf14a2 100644 --- a/bsp/renesas/libraries/HAL_Drivers/drivers/drv_hwtimer.h +++ b/bsp/renesas/libraries/HAL_Drivers/drivers/drv_timer.h @@ -12,7 +12,7 @@ #define __TMR_CONFIG_H__ #include -#include +#include #include #include @@ -21,9 +21,9 @@ extern "C" { #endif -struct ra_hwtimer +struct ra_clock_timer { - rt_hwtimer_t tmr_device; + rt_clock_timer_t tmr_device; gpt_instance_ctrl_t *g_ctrl; timer_instance_t const *const g_timer; timer_cfg_t const *const g_cfg; diff --git a/bsp/renesas/ra4m1-ek/board/Kconfig b/bsp/renesas/ra4m1-ek/board/Kconfig index ca3cf60f24..5b4af52dca 100644 --- a/bsp/renesas/ra4m1-ek/board/Kconfig +++ b/bsp/renesas/ra4m1-ek/board/Kconfig @@ -102,7 +102,7 @@ menu "Hardware Drivers Config" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM0 bool "Enable TIM0" diff --git a/bsp/renesas/ra6m3-ek/board/Kconfig b/bsp/renesas/ra6m3-ek/board/Kconfig index 8f521ddd57..e9c001c0ba 100644 --- a/bsp/renesas/ra6m3-ek/board/Kconfig +++ b/bsp/renesas/ra6m3-ek/board/Kconfig @@ -108,7 +108,7 @@ menu "Hardware Drivers Config" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM0 bool "Enable TIM0" diff --git a/bsp/renesas/ra8p1-titan-board/README.md b/bsp/renesas/ra8p1-titan-board/README.md index ac88be7d63..57c3f4cc72 100644 --- a/bsp/renesas/ra8p1-titan-board/README.md +++ b/bsp/renesas/ra8p1-titan-board/README.md @@ -33,7 +33,7 @@ The current peripheral support status in this BSP is as follows: | ---------------------- | ------------------ | --------------------------- | ------------------ | | UART | Supported | LWIP | Supported | | GPIO | Supported | TCP/UDP | Supported | -| HWTIMER | Supported | MQTT | Supported | +| CLOCK_TIMER | Supported | MQTT | Supported | | I2C | Supported | TFTP | Supported | | WDT | Supported | Telnet | Supported | | RTC | Supported | **Multicore Communication** | **Support Status** | diff --git a/bsp/renesas/ra8p1-titan-board/README_zh.md b/bsp/renesas/ra8p1-titan-board/README_zh.md index 10640f7a38..6d718343bb 100644 --- a/bsp/renesas/ra8p1-titan-board/README_zh.md +++ b/bsp/renesas/ra8p1-titan-board/README_zh.md @@ -33,7 +33,7 @@ Titan Board 搭载频率 1GHz Arm® Cortex®-M85 与 250MHz Arm® Cortex®-M33 | ------------ | ------------ | -------- | ------------ | | UART | 支持 | LWIP | 支持 | | GPIO | 支持 | TCP/UDP | 支持 | -| HWTIMER | 支持 | MQTT | 支持 | +| CLOCK_TIMER | 支持 | MQTT | 支持 | | IIC | 支持 | TFTP | 支持 | | WDT | 支持 | Telnet | 支持 | | RTC | 支持 | **多核通信** | **支持情况** | diff --git a/bsp/renesas/ra8p1-titan-board/board/Kconfig b/bsp/renesas/ra8p1-titan-board/board/Kconfig index 0deed2ea17..7d1e754f49 100644 --- a/bsp/renesas/ra8p1-titan-board/board/Kconfig +++ b/bsp/renesas/ra8p1-titan-board/board/Kconfig @@ -638,7 +638,7 @@ menu "Hardware Drivers Config" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM0 bool "Enable TIM0" diff --git a/bsp/renesas/rzn2l_etherkit/board/Kconfig b/bsp/renesas/rzn2l_etherkit/board/Kconfig index c003e8fb1f..e4cff33116 100644 --- a/bsp/renesas/rzn2l_etherkit/board/Kconfig +++ b/bsp/renesas/rzn2l_etherkit/board/Kconfig @@ -497,7 +497,7 @@ menu "Hardware Drivers Config" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM0 bool "Enable TIM0" diff --git a/bsp/renesas/rzn2l_rsk/board/Kconfig b/bsp/renesas/rzn2l_rsk/board/Kconfig index 46693461eb..9060c7c18d 100644 --- a/bsp/renesas/rzn2l_rsk/board/Kconfig +++ b/bsp/renesas/rzn2l_rsk/board/Kconfig @@ -136,7 +136,7 @@ menu "Hardware Drivers Config" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM0 bool "Enable TIM0" diff --git a/bsp/renesas/rzt2m_rsk/board/Kconfig b/bsp/renesas/rzt2m_rsk/board/Kconfig index 89f3b5435f..aa374df16f 100644 --- a/bsp/renesas/rzt2m_rsk/board/Kconfig +++ b/bsp/renesas/rzt2m_rsk/board/Kconfig @@ -84,7 +84,7 @@ menu "Hardware Drivers Config" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM0 bool "Enable TIM0" diff --git a/bsp/rockchip/dm/hwtimer/Kconfig b/bsp/rockchip/dm/hwtimer/Kconfig index ee60464d69..7bfac13baf 100755 --- a/bsp/rockchip/dm/hwtimer/Kconfig +++ b/bsp/rockchip/dm/hwtimer/Kconfig @@ -1,3 +1,5 @@ -config RT_HWTIMER_ROCKCHIP +config RT_CLOCK_TIMER_ROCKCHIP bool "RockChip Timer" + depends on RT_USING_DM + depends on RT_USING_CLOCK_TIME default n diff --git a/bsp/rockchip/dm/hwtimer/SConscript b/bsp/rockchip/dm/hwtimer/SConscript index 999034bf7f..3e9799e775 100755 --- a/bsp/rockchip/dm/hwtimer/SConscript +++ b/bsp/rockchip/dm/hwtimer/SConscript @@ -4,8 +4,8 @@ cwd = GetCurrentDir() src = [] CPPPATH = [cwd + '/../include'] -if GetDepend(['RT_HWTIMER_ROCKCHIP']): - src += ['hwtimer-rockchip_timer.c'] +if GetDepend(['RT_CLOCK_TIMER_ROCKCHIP']): + src += ['clock_timer-rockchip_timer.c'] group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) diff --git a/bsp/rockchip/dm/hwtimer/hwtimer-rockchip_timer.c b/bsp/rockchip/dm/hwtimer/clock_timer-rockchip_timer.c old mode 100755 new mode 100644 similarity index 62% rename from bsp/rockchip/dm/hwtimer/hwtimer-rockchip_timer.c rename to bsp/rockchip/dm/hwtimer/clock_timer-rockchip_timer.c index ac77ca1f36..488b48aade --- a/bsp/rockchip/dm/hwtimer/hwtimer-rockchip_timer.c +++ b/bsp/rockchip/dm/hwtimer/clock_timer-rockchip_timer.c @@ -8,17 +8,30 @@ * 2022-12-06 GuEe-GUI first version */ +#define DBG_TAG "drv.rk_timer" +#define DBG_LVL DBG_INFO +#include + #include #include #include -#define TIMER_LOAD_COUNT0 0x00 -#define TIMER_LOAD_COUNT1 0x04 -#define TIMER_CURRENT_VALUE0 0x08 -#define TIMER_CURRENT_VALUE1 0x0c -#define TIMER_CONTROL_REG3288 0x10 -#define TIMER_CONTROL_REG3399 0x1c -#define TIMER_INT_STATUS 0x18 +#ifdef RT_USING_CLOCK_TIME +#include +#endif + +#define HZ 100 +#define KHZ 1000 +#define MHZ 1000000 +#define OSC_HZ (24 * MHZ) + +#define TIMER_LOAD_COUNT0 0x00 +#define TIMER_LOAD_COUNT1 0x04 +#define TIMER_CURRENT_VALUE0 0x08 +#define TIMER_CURRENT_VALUE1 0x0c +#define TIMER_CONTROL_REG3288 0x10 +#define TIMER_CONTROL_REG3399 0x1c +#define TIMER_INT_STATUS 0x18 #define TIMER_DISABLE 0x0 #define TIMER_ENABLE 0x1 @@ -26,11 +39,9 @@ #define TIMER_MODE_USER_DEFINED_COUNT (1 << 1) #define TIMER_INT_UNMASK (1 << 2) -#define HZ 100 - struct rk_timer { - struct rt_hwtimer_device parent; + struct rt_clock_timer_device parent; void *base; void *ctrl; @@ -42,9 +53,21 @@ struct rk_timer rt_uint32_t cycle; rt_bool_t status; - struct rt_hwtimer_info info; + struct rt_clock_timer_info info; }; +#ifdef RT_USING_CLOCK_TIME +struct hrt_timer +{ + struct rk_timer *timer; + uint64_t cnt; + void (*outcb)(void *param); + void *param; +}; +static struct hrt_timer _timer0 = {0}; +static struct rt_spinlock _spinlock; +#endif + #define raw_to_rk_timer(raw) rt_container_of(raw, struct rk_timer, parent) struct rk_timer_data @@ -78,24 +101,24 @@ static void rk_timer_interrupt_clear(struct rk_timer *timer) HWREG32(timer->base + TIMER_INT_STATUS) = 1; } -static void rk_timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void rk_timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { } -static rt_err_t rk_timer_start(struct rt_hwtimer_device *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t rk_timer_start(struct rt_clock_timer_device *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { rt_err_t err = RT_EOK; struct rk_timer *rk_timer = raw_to_rk_timer(timer); switch (mode) { - case HWTIMER_MODE_ONESHOT: + case CLOCK_TIMER_MODE_ONESHOT: rk_timer_disable(rk_timer); rk_timer_update_counter(cnt, rk_timer); rk_timer_enable(rk_timer, TIMER_MODE_USER_DEFINED_COUNT | TIMER_INT_UNMASK); break; - case HWTIMER_MODE_PERIOD: + case CLOCK_TIMER_MODE_PERIOD: rk_timer_disable(rk_timer); rk_timer_update_counter(rk_timer->freq / HZ - 1, rk_timer); rk_timer_enable(rk_timer, TIMER_MODE_FREE_RUNNING | TIMER_INT_UNMASK); @@ -115,7 +138,7 @@ static rt_err_t rk_timer_start(struct rt_hwtimer_device *timer, rt_uint32_t cnt, return err; } -static void rk_timer_stop(struct rt_hwtimer_device *timer) +static void rk_timer_stop(struct rt_clock_timer_device *timer) { struct rk_timer *rk_timer = raw_to_rk_timer(timer); @@ -123,29 +146,29 @@ static void rk_timer_stop(struct rt_hwtimer_device *timer) rk_timer_disable(rk_timer); } -static rt_uint32_t rk_timer_count_get(struct rt_hwtimer_device *timer) +static rt_uint32_t rk_timer_count_get(struct rt_clock_timer_device *timer) { struct rk_timer *rk_timer = raw_to_rk_timer(timer); return rk_timer_current_value(rk_timer); } -static rt_err_t rk_timer_ctrl(struct rt_hwtimer_device *timer, rt_uint32_t cmd, void *args) +static rt_err_t rk_timer_ctrl(struct rt_clock_timer_device *timer, rt_uint32_t cmd, void *args) { rt_err_t err = RT_EOK; struct rk_timer *rk_timer = raw_to_rk_timer(timer); switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: err = -RT_ENOSYS; break; - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: rk_timer_stop(timer); break; - case HWTIMER_CTRL_INFO_GET: + case CLOCK_TIMER_CTRL_INFO_GET: if (args) { rt_memcpy(args, &rk_timer->info, sizeof(rk_timer->info)); @@ -156,8 +179,8 @@ static rt_err_t rk_timer_ctrl(struct rt_hwtimer_device *timer, rt_uint32_t cmd, } break; - case HWTIMER_CTRL_MODE_SET: - err = rk_timer_start(timer, rk_timer->cycle, (rt_hwtimer_mode_t)args); + case CLOCK_TIMER_CTRL_MODE_SET: + err = rk_timer_start(timer, rk_timer->cycle, (rt_clock_timer_mode_t)args); break; default: @@ -168,7 +191,7 @@ static rt_err_t rk_timer_ctrl(struct rt_hwtimer_device *timer, rt_uint32_t cmd, return err; } -const static struct rt_hwtimer_ops rk_timer_ops = +const static struct rt_clock_timer_ops rk_timer_ops = { .init = rk_timer_init, .start = rk_timer_start, @@ -179,13 +202,25 @@ const static struct rt_hwtimer_ops rk_timer_ops = static void rk_timer_isr(int irqno, void *param) { - struct rk_timer *rk_timer = (struct rk_timer *)param; + struct hrt_timer *timer = &_timer0; + struct rk_timer *time = timer->timer; + + rk_timer_interrupt_clear(time); + + rt_clock_hrtimer_process(); +} - rk_timer_interrupt_clear(rk_timer); +void rt_clock_hrtimer_bind(rt_bitmap_t *affinity) +{ + struct rk_timer *timer = _timer0.timer; - if (rk_timer->status) + if (rt_pic_irq_set_affinity(timer->irq, affinity) == -RT_ENOSYS) { - rt_device_hwtimer_isr(&rk_timer->parent); + LOG_E("timer irq affinity init fail\n"); + } + else + { + LOG_D("timer irq(%d) binding done\n", timer->irq); } } @@ -222,6 +257,11 @@ static rt_err_t rk_timer_probe(struct rt_platform_device *pdev) return -RT_ENOMEM; } +#ifdef RT_USING_CLOCK_TIME + _timer0.timer = timer; + rt_spin_lock_init(&_spinlock); +#endif + if (rt_is_err(timer->pclk = rt_clk_get_by_name(dev, "pclk"))) { err = rt_ptr_err(timer->pclk); @@ -263,14 +303,25 @@ static rt_err_t rk_timer_probe(struct rt_platform_device *pdev) timer->info.maxfreq = timer->freq; timer->info.minfreq = timer->freq; timer->info.maxcnt = 0xffffffff; - timer->info.cntmode = HWTIMER_CNTMODE_UP; + timer->info.cntmode = CLOCK_TIMER_CNTMODE_DW; rt_dm_dev_set_name_auto(&timer->parent.parent, "timer"); dev_name = rt_dm_dev_get_name(&timer->parent.parent); - rt_device_hwtimer_register(&timer->parent, dev_name, RT_NULL); - rt_hw_interrupt_install(timer->irq, rk_timer_isr, timer, dev_name); - rt_hw_interrupt_umask(timer->irq); + rt_clock_timer_register(&timer->parent, dev_name, RT_NULL); + + RT_BITMAP_DECLARE(affinity, RT_CPUS_NR) = { 0 }; + rt_bitmap_set_bit(affinity, RT_CPUS_NR - 1); + rt_clock_hrtimer_bind(affinity); + + rt_pic_attach_irq(timer->irq, rk_timer_isr, timer, dev_name, RT_IRQ_F_NONE); + rt_pic_irq_unmask(timer->irq); + +#if KTIMER_BIND_CPU + RT_BITMAP_DECLARE(affinity, RT_CPUS_NR) = {0}; + rt_bitmap_set_bit(affinity, 1); + rt_pic_irq_set_affinity(timer->irq, affinity); +#endif return RT_EOK; @@ -306,6 +357,44 @@ static const struct rk_timer_data rk3399_timer_data = .ctrl_reg = TIMER_CONTROL_REG3399, }; +#ifdef RT_USING_CLOCK_TIME + +uint64_t rt_clock_hrtimer_getfrq(void) +{ + return OSC_HZ; +} + +uint64_t rt_clock_hrtimer_getres(void) +{ + return ((1000UL * 1000 * 1000) * RT_CLOCK_TIME_RESMUL) / OSC_HZ; +} + +/** + * @brief set the timeout function for hrtimer framework + * + * @warning application should not call this API directly + * + * @param cnt the count of timer dealy + * @return rt_err_t 0 forever + */ +rt_err_t rt_clock_hrtimer_settimeout(unsigned long cnt) +{ + struct hrt_timer *timer = &_timer0; + struct rk_timer *time = timer->timer; + + timer->cnt = cnt; + + if (cnt) + { + rk_timer_disable(time); + rk_timer_update_counter(cnt, time); + rk_timer_enable(time, TIMER_MODE_USER_DEFINED_COUNT | TIMER_INT_UNMASK); + } + + return 0; +} +#endif + static const struct rt_ofw_node_id rk_timer_ofw_ids[] = { { .compatible = "rockchip,rk3288-timer", .data = &rk3288_timer_data }, @@ -315,7 +404,7 @@ static const struct rt_ofw_node_id rk_timer_ofw_ids[] = static struct rt_platform_driver rk_timer_driver = { - .name = "hwtimer-rockchip", + .name = "clock_timer-rockchip", .ids = rk_timer_ofw_ids, .probe = rk_timer_probe, diff --git a/bsp/rockchip/rk3500/.config b/bsp/rockchip/rk3500/.config index fed7587c00..fc4a8cde21 100644 --- a/bsp/rockchip/rk3500/.config +++ b/bsp/rockchip/rk3500/.config @@ -392,7 +392,8 @@ CONFIG_RT_PIN_ROCKCHIP=y CONFIG_RT_USING_PINCTRL=y # CONFIG_RT_PINCTRL_SINGLE is not set CONFIG_RT_PINCTRL_ROCKCHIP=y -CONFIG_RT_USING_KTIME=y +CONFIG_RT_USING_CLOCK_TIME=y +CONFIG_RT_CLOCK_TIME_ARM_ARCH=y CONFIG_RT_USING_CLK=y CONFIG_RT_CLK_ROCKCHIP_LINK=y CONFIG_RT_CLK_ROCKCHIP=y @@ -400,9 +401,7 @@ CONFIG_RT_CLK_ROCKCHIP=y CONFIG_RT_CLK_ROCKCHIP_RK3568=y # CONFIG_RT_CLK_ROCKCHIP_RK3576 is not set CONFIG_RT_CLK_ROCKCHIP_RK3588=y -CONFIG_RT_USING_HWTIMER=y -CONFIG_RT_HWTIMER_ARM_ARCH=y -CONFIG_RT_HWTIMER_ROCKCHIP=y +CONFIG_RT_CLOCK_TIMER_ROCKCHIP=y # CONFIG_RT_USING_CHERRYUSB is not set # end of Device Drivers @@ -1000,6 +999,7 @@ CONFIG_RT_UTEST_SMP_CALL_FUNC=y # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set # end of tools packages # @@ -1094,6 +1094,7 @@ CONFIG_RT_UTEST_SMP_CALL_FUNC=y # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -1250,6 +1251,12 @@ CONFIG_RT_UTEST_SMP_CALL_FUNC=y # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK # end of HAL & SDK Drivers # @@ -1298,6 +1305,7 @@ CONFIG_RT_UTEST_SMP_CALL_FUNC=y # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1768,3 +1776,4 @@ CONFIG_PKG_ZLIB_VER="latest" # end of RT-Thread online packages CONFIG_SOC_RK3500=y +CONFIG_SOC_RK3568=y diff --git a/bsp/rockchip/rk3500/driver/board.c b/bsp/rockchip/rk3500/driver/board.c index c469931882..e2e14a6994 100644 --- a/bsp/rockchip/rk3500/driver/board.c +++ b/bsp/rockchip/rk3500/driver/board.c @@ -9,8 +9,24 @@ */ #include +#include +#include +#include + +static void rk3568_machine_shutdown(void) +{ + psci_system_off(); +} void rt_hw_board_init(void) { rt_hw_common_setup(); + rt_dm_machine_shutdown = rk3568_machine_shutdown; + rt_dm_machine_reset = psci_system_reboot; +} + +void reboot(void) +{ + psci_system_reboot(); } +MSH_CMD_EXPORT(reboot, reboot...); diff --git a/bsp/rockchip/rk3500/rtconfig.h b/bsp/rockchip/rk3500/rtconfig.h index 6897ff3729..0518bc0e16 100644 --- a/bsp/rockchip/rk3500/rtconfig.h +++ b/bsp/rockchip/rk3500/rtconfig.h @@ -247,15 +247,14 @@ #define RT_PIN_ROCKCHIP #define RT_USING_PINCTRL #define RT_PINCTRL_ROCKCHIP -#define RT_USING_KTIME +#define RT_USING_CLOCK_TIME #define RT_USING_CLK #define RT_CLK_ROCKCHIP_LINK #define RT_CLK_ROCKCHIP #define RT_CLK_ROCKCHIP_RK3568 #define RT_CLK_ROCKCHIP_RK3588 -#define RT_USING_HWTIMER -#define RT_HWTIMER_ARM_ARCH -#define RT_HWTIMER_ROCKCHIP +#define RT_CLOCK_TIME_ARM_ARCH +#define RT_CLOCK_TIMER_ROCKCHIP /* end of Device Drivers */ /* C/C++ and POSIX layer */ @@ -595,6 +594,10 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ /* end of HAL & SDK Drivers */ /* sensors drivers */ @@ -677,5 +680,6 @@ /* end of Arduino libraries */ /* end of RT-Thread online packages */ #define SOC_RK3500 +#define SOC_RK3568 #endif diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f0/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f0/tim_config.h index 82f0a2375f..55abb16237 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f0/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f0/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f1/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f1/tim_config.h index 735bf7b70d..d3a685ac28 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f1/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f1/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f2/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f2/tim_config.h index 3e2a606f6e..19347c25f3 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f2/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f2/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 3000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f3/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f3/tim_config.h index a80ce58de6..68e0ec2c6a 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f3/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f3/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 3000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f4/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f4/tim_config.h index 08646d9af7..c6e1ee581a 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f4/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f4/tim_config.h @@ -24,7 +24,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 3000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f7/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f7/tim_config.h index 6c397f087b..bf7fd577b8 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/f7/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/f7/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 3000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/g0/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/g0/tim_config.h index 4c3691353b..200255dfb4 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/g0/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/g0/tim_config.h @@ -24,7 +24,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/g4/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/g4/tim_config.h index 856a437d0b..6e450ccde7 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/g4/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/g4/tim_config.h @@ -24,7 +24,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 3000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/h7/lptim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/h7/lptim_config.h index 794289d88a..507bcff446 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/h7/lptim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/h7/lptim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 3000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/h7/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/h7/tim_config.h index 6c397f087b..bf7fd577b8 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/h7/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/h7/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 3000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/l1/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/l1/tim_config.h index 735bf7b70d..d3a685ac28 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/l1/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/l1/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/l4/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/l4/tim_config.h index ed4100a9c7..0024d41823 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/l4/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/l4/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/l5/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/l5/tim_config.h index eca2f6ddde..f049572c2a 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/l5/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/l5/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/mp1/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/mp1/tim_config.h index 2742f70c71..1528817033 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/mp1/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/mp1/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 3000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/u5/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/u5/tim_config.h index eca2f6ddde..f049572c2a 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/u5/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/u5/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/tim_config.h index 1aa956e255..0e8ae50b6a 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wb/tim_config.h @@ -23,7 +23,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wl/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wl/tim_config.h index f85bea7b1c..05118d7ac5 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/config/wl/tim_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/config/wl/tim_config.h @@ -24,7 +24,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFFFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #else #define TIM_DEV_INFO_CONFIG \ @@ -32,7 +32,7 @@ extern "C" { .maxfreq = 1000000, \ .minfreq = 2000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif #endif /* TIM_DEV_INFO_CONFIG */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_lptim.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_lptim.c index 192343f5be..cfcf540531 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_lptim.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_lptim.c @@ -6,7 +6,7 @@ * Change Logs: * Date Author Notes * 2019-05-06 Zero-Free first version - * 2024-07-04 wdfk-prog lptimer is register with hwtimer, only supports pm calls,the timer function is not supported + * 2024-07-04 wdfk-prog lptimer is register with clock_timer, only supports pm calls,the timer function is not supported */ #include @@ -37,7 +37,7 @@ enum struct stm32_hw_lptimer { - rt_hwtimer_t time_device; + rt_clock_timer_t time_device; LPTIM_HandleTypeDef tim_handle; IRQn_Type tim_irqn; char *name; @@ -56,9 +56,9 @@ static struct stm32_hw_lptimer stm32_hw_lptimer_obj[] = #endif }; -static const struct rt_hwtimer_info _info = LPTIM_DEV_INFO_CONFIG; +static const struct rt_clock_timer_info _info = LPTIM_DEV_INFO_CONFIG; -static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { if(timer == RT_NULL) { @@ -118,7 +118,7 @@ static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) } } -static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +static rt_err_t timer_start(rt_clock_timer_t *timer, rt_uint32_t t, rt_clock_timer_mode_t opmode) { if(timer == RT_NULL) { @@ -153,7 +153,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ } } -static void timer_stop(rt_hwtimer_t *timer) +static void timer_stop(rt_clock_timer_t *timer) { if(timer == RT_NULL) { @@ -193,13 +193,13 @@ static rt_uint32_t timer_get_freq(LPTIM_HandleTypeDef *tim) } -static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t timer_counter_get(rt_clock_timer_t *timer) { LPTIM_HandleTypeDef *tim = (LPTIM_HandleTypeDef *)timer->parent.user_data; return HAL_LPTIM_ReadCounter(tim); } -static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { if(timer == RT_NULL) { @@ -236,7 +236,7 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) } case DRV_HW_LPTIMER_CTRL_START: { - timer_start(timer, *(rt_uint32_t *)arg, HWTIMER_MODE_ONESHOT); + timer_start(timer, *(rt_uint32_t *)arg, CLOCK_TIMER_MODE_ONESHOT); break; } case DRV_HW_LPTIMER_CTRL_GET_COUNT: @@ -281,7 +281,7 @@ void LPTIM3_IRQHandler(void) } #endif -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_ops _ops = { .init = timer_init, .start = timer_start, @@ -302,7 +302,7 @@ static int stm32_hw_lptim_init(void) { stm32_hw_lptimer_obj[i].time_device.info = &_info; stm32_hw_lptimer_obj[i].time_device.ops = &_ops; - if (rt_device_hwtimer_register(&stm32_hw_lptimer_obj[i].time_device, stm32_hw_lptimer_obj[i].name, &stm32_hw_lptimer_obj[i].tim_handle) == RT_EOK) + if (rt_clock_timer_register(&stm32_hw_lptimer_obj[i].time_device, stm32_hw_lptimer_obj[i].name, &stm32_hw_lptimer_obj[i].tim_handle) == RT_EOK) { LOG_D("%s register success", stm32_hw_lptimer_obj[i].name); } diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_lptim.h b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_lptim.h index 124242abb5..203edba439 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_lptim.h +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_lptim.h @@ -6,7 +6,7 @@ * Change Logs: * Date Author Notes * 2019-05-06 Zero-Free first version - * 2024-07-04 wdfk-prog lptimer is register with hwtimer, only supports pm calls,the timer function is not supported + * 2024-07-04 wdfk-prog lptimer is register with clock_timer, only supports pm calls,the timer function is not supported */ #ifndef __DRV_PMTIMER_H__ diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_pm.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_pm.c index 2b93c30f94..eaf39d8b14 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_pm.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_pm.c @@ -203,7 +203,7 @@ static void pm_timer_stop(struct rt_pm *pm) RT_ASSERT(pm != RT_NULL); /* Reset pmtimer status */ - rt_device_control(timer, HWTIMER_CTRL_STOP, RT_NULL); + rt_device_control(timer, CLOCK_TIMER_CTRL_STOP, RT_NULL); } /** diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_tim.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_tim.c index 4533df7a64..b236a7ffdd 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_tim.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_tim.c @@ -298,15 +298,15 @@ enum #endif }; -struct stm32_hwtimer +struct stm32_clock_timer { - rt_hwtimer_t time_device; + rt_clock_timer_t time_device; TIM_HandleTypeDef tim_handle; IRQn_Type tim_irqn; char *name; }; -static struct stm32_hwtimer stm32_hwtimer_obj[] = +static struct stm32_clock_timer stm32_clock_timer_obj[] = { #ifdef BSP_USING_TIM1 TIM1_CONFIG, @@ -377,18 +377,18 @@ static struct stm32_hwtimer stm32_hwtimer_obj[] = #endif }; -static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { uint32_t prescaler_value = 0; uint32_t pclk1_doubler, pclk2_doubler; TIM_HandleTypeDef *tim = RT_NULL; - struct stm32_hwtimer *tim_device = RT_NULL; + struct stm32_clock_timer *tim_device = RT_NULL; RT_ASSERT(timer != RT_NULL); if (state) { tim = (TIM_HandleTypeDef *)timer->parent.user_data; - tim_device = (struct stm32_hwtimer *)timer; + tim_device = (struct stm32_clock_timer *)timer; stm32_tim_pclkx_doubler_get(&pclk1_doubler, &pclk2_doubler); @@ -409,7 +409,7 @@ static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) tim->Init.Period = 10000 - 1; tim->Init.Prescaler = prescaler_value; tim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - if (timer->info->cntmode == HWTIMER_CNTMODE_UP) + if (timer->info->cntmode == CLOCK_TIMER_CNTMODE_UP) { tim->Init.CounterMode = TIM_COUNTERMODE_UP; } @@ -436,7 +436,7 @@ static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) } } -static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +static rt_err_t timer_start(rt_clock_timer_t *timer, rt_uint32_t t, rt_clock_timer_mode_t opmode) { rt_err_t result = RT_EOK; TIM_HandleTypeDef *tim = RT_NULL; @@ -450,7 +450,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ /* set tim arr */ __HAL_TIM_SET_AUTORELOAD(tim, t - 1); - if (opmode == HWTIMER_MODE_ONESHOT) + if (opmode == CLOCK_TIMER_MODE_ONESHOT) { /* set timer to single mode */ tim->Instance->CR1 |= TIM_OPMODE_SINGLE; @@ -470,7 +470,7 @@ static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_ return result; } -static void timer_stop(rt_hwtimer_t *timer) +static void timer_stop(rt_clock_timer_t *timer) { TIM_HandleTypeDef *tim = RT_NULL; @@ -485,7 +485,7 @@ static void timer_stop(rt_hwtimer_t *timer) __HAL_TIM_SET_COUNTER(tim, 0); } -static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { TIM_HandleTypeDef *tim = RT_NULL; rt_err_t result = -RT_ERROR; @@ -498,7 +498,7 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t freq; rt_uint16_t val=0; @@ -591,7 +591,7 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) return result; } -static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) +static rt_uint32_t timer_counter_get(rt_clock_timer_t *timer) { TIM_HandleTypeDef *tim = RT_NULL; @@ -602,9 +602,9 @@ static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) return tim->Instance->CNT; } -static const struct rt_hwtimer_info _info = TIM_DEV_INFO_CONFIG; +static const struct rt_clock_timer_info _info = TIM_DEV_INFO_CONFIG; -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_ops _ops = { .init = timer_init, .start = timer_start, @@ -618,7 +618,7 @@ void TIM2_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM2_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM2_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -630,10 +630,10 @@ void TIM3_TIM4_IRQHandler(void) /* enter interrupt */ rt_interrupt_enter(); #ifdef BSP_USING_TIM3 - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM3_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM3_INDEX].tim_handle); #endif #ifdef BSP_USING_TIM4 - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM4_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM4_INDEX].tim_handle); #endif /* leave interrupt */ rt_interrupt_leave(); @@ -645,7 +645,7 @@ void TIM3_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM3_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM3_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -655,7 +655,7 @@ void TIM4_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM4_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM4_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -666,7 +666,7 @@ void TIM5_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM5_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM5_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -676,7 +676,7 @@ void TIM6_DAC_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM6_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM6_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -686,7 +686,7 @@ void TIM7_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM7_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM7_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -696,7 +696,7 @@ void TIM8_UP_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM8_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM8_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -706,7 +706,7 @@ void TIM1_TRG_COM_TIM11_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM11_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM11_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -716,7 +716,7 @@ void TIM8_UP_TIM13_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM13_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM13_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -730,7 +730,7 @@ void TIM8_UP_TIM13_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM14_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM14_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -740,7 +740,7 @@ void TIM1_BRK_TIM15_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM15_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM15_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -754,7 +754,7 @@ void TIM1_BRK_TIM15_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM16_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM16_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -768,7 +768,7 @@ void TIM1_BRK_TIM15_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM17_INDEX].tim_handle); + HAL_TIM_IRQHandler(&stm32_clock_timer_obj[TIM17_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } @@ -779,106 +779,106 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) #ifdef BSP_USING_TIM2 if (htim->Instance == TIM2) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM2_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM2_INDEX].time_device); } #endif #ifdef BSP_USING_TIM3 if (htim->Instance == TIM3) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM3_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM3_INDEX].time_device); } #endif #ifdef BSP_USING_TIM4 if (htim->Instance == TIM4) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM4_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM4_INDEX].time_device); } #endif #ifdef BSP_USING_TIM5 if (htim->Instance == TIM5) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM5_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM5_INDEX].time_device); } #endif #ifdef BSP_USING_TIM6 if (htim->Instance == TIM6) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM6_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM6_INDEX].time_device); } #endif #ifdef BSP_USING_TIM7 if (htim->Instance == TIM7) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM7_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM7_INDEX].time_device); } #endif #ifdef BSP_USING_TIM8 if (htim->Instance == TIM8) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM8_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM8_INDEX].time_device); } #endif #ifdef BSP_USING_TIM11 if (htim->Instance == TIM11) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM11_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM11_INDEX].time_device); } #endif #ifdef BSP_USING_TIM13 if (htim->Instance == TIM13) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM13_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM13_INDEX].time_device); } #endif #ifdef BSP_USING_TIM14 if (htim->Instance == TIM14) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM14_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM14_INDEX].time_device); } #endif #ifdef BSP_USING_TIM15 if (htim->Instance == TIM15) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM15_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM15_INDEX].time_device); } #endif #ifdef BSP_USING_TIM16 if (htim->Instance == TIM16) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM16_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM16_INDEX].time_device); } #endif #ifdef BSP_USING_TIM17 if (htim->Instance == TIM17) { - rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM17_INDEX].time_device); + rt_clock_timer_isr(&stm32_clock_timer_obj[TIM17_INDEX].time_device); } #endif } -static int stm32_hwtimer_init(void) +static int stm32_clock_timer_init(void) { rt_uint32_t i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(stm32_hwtimer_obj) / sizeof(stm32_hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(stm32_clock_timer_obj) / sizeof(stm32_clock_timer_obj[0]); i++) { - stm32_hwtimer_obj[i].time_device.info = &_info; - stm32_hwtimer_obj[i].time_device.ops = &_ops; - if (rt_device_hwtimer_register(&stm32_hwtimer_obj[i].time_device, - stm32_hwtimer_obj[i].name, &stm32_hwtimer_obj[i].tim_handle) == RT_EOK) + stm32_clock_timer_obj[i].time_device.info = &_info; + stm32_clock_timer_obj[i].time_device.ops = &_ops; + if (rt_clock_timer_register(&stm32_clock_timer_obj[i].time_device, + stm32_clock_timer_obj[i].name, &stm32_clock_timer_obj[i].tim_handle) == RT_EOK) { - LOG_D("%s register success", stm32_hwtimer_obj[i].name); + LOG_D("%s register success", stm32_clock_timer_obj[i].name); } else { - LOG_E("%s register failed", stm32_hwtimer_obj[i].name); + LOG_E("%s register failed", stm32_clock_timer_obj[i].name); result = -RT_ERROR; } } return result; } -INIT_BOARD_EXPORT(stm32_hwtimer_init); +INIT_BOARD_EXPORT(stm32_clock_timer_init); #endif /* BSP_USING_TIM */ diff --git a/bsp/stm32/libraries/STM32L1xx_HAL/SConscript b/bsp/stm32/libraries/STM32L1xx_HAL/SConscript index 7859bc2332..7c2b1d785d 100644 --- a/bsp/stm32/libraries/STM32L1xx_HAL/SConscript +++ b/bsp/stm32/libraries/STM32L1xx_HAL/SConscript @@ -43,7 +43,7 @@ if GetDepend(['RT_USING_USB']): if GetDepend(['RT_USING_CAN']): src += ['STM32L1xx_HAL_Driver/Src/stm32L1xx_hal_can.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']) or GetDepend(['RT_USING_PULSE_ENCODER']): +if GetDepend(['RT_USING_CLOCK_TIME']) or GetDepend(['RT_USING_PWM']) or GetDepend(['RT_USING_PULSE_ENCODER']): src += ['STM32L1xx_HAL_Driver/Src/stm32L1xx_hal_tim.c'] src += ['STM32L1xx_HAL_Driver/Src/stm32L1xx_hal_tim_ex.c'] diff --git a/bsp/stm32/libraries/templates/stm32f3xx/project.uvoptx b/bsp/stm32/libraries/templates/stm32f3xx/project.uvoptx index ccbafccdba..3d774f94f1 100644 --- a/bsp/stm32/libraries/templates/stm32f3xx/project.uvoptx +++ b/bsp/stm32/libraries/templates/stm32f3xx/project.uvoptx @@ -282,8 +282,8 @@ 0 0 0 - ..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 @@ -482,8 +482,8 @@ 0 0 0 - ..\libraries\HAL_Drivers\drv_hwtimer.c - drv_hwtimer.c + ..\libraries\HAL_Drivers\drv_timer.c + drv_timer.c 0 0 diff --git a/bsp/stm32/libraries/templates/stm32l1xx/board/Kconfig b/bsp/stm32/libraries/templates/stm32l1xx/board/Kconfig index 0650b2dbc4..d95f206f82 100644 --- a/bsp/stm32/libraries/templates/stm32l1xx/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32l1xx/board/Kconfig @@ -88,7 +88,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM2 bool "Enable TIM2" diff --git a/bsp/stm32/libraries/templates/stm32wbxx/board/Kconfig b/bsp/stm32/libraries/templates/stm32wbxx/board/Kconfig index e20043c172..1287e9a63f 100644 --- a/bsp/stm32/libraries/templates/stm32wbxx/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32wbxx/board/Kconfig @@ -123,7 +123,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM16 diff --git a/bsp/stm32/libraries/templates/stm32xx_board_Kconfig b/bsp/stm32/libraries/templates/stm32xx_board_Kconfig index 0cc7a077ba..62fe69fab0 100644 --- a/bsp/stm32/libraries/templates/stm32xx_board_Kconfig +++ b/bsp/stm32/libraries/templates/stm32xx_board_Kconfig @@ -116,7 +116,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM15 bool "Enable TIM15" diff --git a/bsp/stm32/stm32f072-st-nucleo/board/Kconfig b/bsp/stm32/stm32f072-st-nucleo/board/Kconfig index 4aa69b91f2..69900f4061 100644 --- a/bsp/stm32/stm32f072-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32f072-st-nucleo/board/Kconfig @@ -135,7 +135,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM7 bool "Enable TIM7" diff --git a/bsp/stm32/stm32f091-st-nucleo/board/Kconfig b/bsp/stm32/stm32f091-st-nucleo/board/Kconfig index 0cd4e49603..d5ea59755e 100644 --- a/bsp/stm32/stm32f091-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32f091-st-nucleo/board/Kconfig @@ -137,7 +137,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM14 bool "Enable TIM14" diff --git a/bsp/stm32/stm32f103-100ask-pro/board/Kconfig b/bsp/stm32/stm32f103-100ask-pro/board/Kconfig index 60b4bd11df..65919379fc 100644 --- a/bsp/stm32/stm32f103-100ask-pro/board/Kconfig +++ b/bsp/stm32/stm32f103-100ask-pro/board/Kconfig @@ -237,7 +237,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM2 bool "Enable TIM2" diff --git a/bsp/stm32/stm32f103-atk-nano/board/Kconfig b/bsp/stm32/stm32f103-atk-nano/board/Kconfig index b30a684c21..282086aecd 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/Kconfig +++ b/bsp/stm32/stm32f103-atk-nano/board/Kconfig @@ -149,7 +149,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM2 bool "Enable TIM2" diff --git a/bsp/stm32/stm32f103-atk-warshipv3/board/Kconfig b/bsp/stm32/stm32f103-atk-warshipv3/board/Kconfig index c8d95d40c6..0d7330f082 100644 --- a/bsp/stm32/stm32f103-atk-warshipv3/board/Kconfig +++ b/bsp/stm32/stm32f103-atk-warshipv3/board/Kconfig @@ -162,7 +162,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM2 bool "Enable TIM2" diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig b/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig index 9482489e81..75787559a1 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig @@ -277,7 +277,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM2 bool "Enable TIM2" diff --git a/bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/pins_arduino.h b/bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/pins_arduino.h index 2b80505e24..1a314d4fc4 100644 --- a/bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/pins_arduino.h +++ b/bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/pins_arduino.h @@ -50,6 +50,6 @@ #define SS D10 #define RTDUINO_DEFAULT_SPI_BUS_NAME "spi1" -#define RTDUINO_TONE_HWTIMER_DEVICE_NAME "timer9" +#define RTDUINO_TONE_CLOCK_TIMER_DEVICE_NAME "timer9" #endif /* Pins_Arduino_h */ diff --git a/bsp/stm32/stm32f401-st-nucleo/board/Kconfig b/bsp/stm32/stm32f401-st-nucleo/board/Kconfig index e03d2d2814..a4ddfc0c2c 100644 --- a/bsp/stm32/stm32f401-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32f401-st-nucleo/board/Kconfig @@ -104,7 +104,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM9 diff --git a/bsp/stm32/stm32f405zg-mini-template/board/Kconfig b/bsp/stm32/stm32f405zg-mini-template/board/Kconfig index 8e3876b026..80bb0b0522 100644 --- a/bsp/stm32/stm32f405zg-mini-template/board/Kconfig +++ b/bsp/stm32/stm32f405zg-mini-template/board/Kconfig @@ -107,7 +107,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM6 bool "Enable TIM6" diff --git a/bsp/stm32/stm32f407-armfly-v5/board/Kconfig b/bsp/stm32/stm32f407-armfly-v5/board/Kconfig index 5055463e32..613d1cfb85 100644 --- a/bsp/stm32/stm32f407-armfly-v5/board/Kconfig +++ b/bsp/stm32/stm32f407-armfly-v5/board/Kconfig @@ -164,7 +164,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig index b88d55f8cd..1cd3f3eb67 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig +++ b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig @@ -384,7 +384,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32f407-fk407m2-zgt6/board/Kconfig b/bsp/stm32/stm32f407-fk407m2-zgt6/board/Kconfig index 6669b21f72..97bf737ac2 100644 --- a/bsp/stm32/stm32f407-fk407m2-zgt6/board/Kconfig +++ b/bsp/stm32/stm32f407-fk407m2-zgt6/board/Kconfig @@ -242,7 +242,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32f407-lckfb-skystar/board/Kconfig b/bsp/stm32/stm32f407-lckfb-skystar/board/Kconfig index 9b8c3bbb19..606c772551 100644 --- a/bsp/stm32/stm32f407-lckfb-skystar/board/Kconfig +++ b/bsp/stm32/stm32f407-lckfb-skystar/board/Kconfig @@ -269,7 +269,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32f407-micu/board/Kconfig b/bsp/stm32/stm32f407-micu/board/Kconfig index fc65f2af28..25202dfa2f 100644 --- a/bsp/stm32/stm32f407-micu/board/Kconfig +++ b/bsp/stm32/stm32f407-micu/board/Kconfig @@ -177,7 +177,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32f407-rt-spark/board/Kconfig b/bsp/stm32/stm32f407-rt-spark/board/Kconfig index ca3ab2c321..a003330564 100644 --- a/bsp/stm32/stm32f407-rt-spark/board/Kconfig +++ b/bsp/stm32/stm32f407-rt-spark/board/Kconfig @@ -490,7 +490,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32f411-atk-nano/board/Kconfig b/bsp/stm32/stm32f411-atk-nano/board/Kconfig index ec936d9025..fbb264b09d 100644 --- a/bsp/stm32/stm32f411-atk-nano/board/Kconfig +++ b/bsp/stm32/stm32f411-atk-nano/board/Kconfig @@ -116,7 +116,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM2 bool "Enable TIM2" diff --git a/bsp/stm32/stm32f411-st-nucleo/applications/arduino_pinout/pins_arduino.h b/bsp/stm32/stm32f411-st-nucleo/applications/arduino_pinout/pins_arduino.h index 4281578659..504b746427 100644 --- a/bsp/stm32/stm32f411-st-nucleo/applications/arduino_pinout/pins_arduino.h +++ b/bsp/stm32/stm32f411-st-nucleo/applications/arduino_pinout/pins_arduino.h @@ -50,6 +50,6 @@ #define SS D10 #define RTDUINO_DEFAULT_SPI_BUS_NAME "spi1" -#define RTDUINO_TONE_HWTIMER_DEVICE_NAME "timer9" +#define RTDUINO_TONE_CLOCK_TIMER_DEVICE_NAME "timer9" #endif /* Pins_Arduino_h */ diff --git a/bsp/stm32/stm32f411-st-nucleo/board/Kconfig b/bsp/stm32/stm32f411-st-nucleo/board/Kconfig index ae4f9ac01e..9c4c0c3466 100644 --- a/bsp/stm32/stm32f411-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32f411-st-nucleo/board/Kconfig @@ -210,7 +210,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM9 bool "Enable TIM9" diff --git a/bsp/stm32/stm32f411-weact-blackpill/board/Kconfig b/bsp/stm32/stm32f411-weact-blackpill/board/Kconfig index afdbf51658..691cabbf34 100644 --- a/bsp/stm32/stm32f411-weact-blackpill/board/Kconfig +++ b/bsp/stm32/stm32f411-weact-blackpill/board/Kconfig @@ -211,7 +211,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM10 bool "Enable TIM10" diff --git a/bsp/stm32/stm32f412-st-nucleo/applications/arduino_pinout/pins_arduino.h b/bsp/stm32/stm32f412-st-nucleo/applications/arduino_pinout/pins_arduino.h index 249f0e7e77..9840fd7f99 100644 --- a/bsp/stm32/stm32f412-st-nucleo/applications/arduino_pinout/pins_arduino.h +++ b/bsp/stm32/stm32f412-st-nucleo/applications/arduino_pinout/pins_arduino.h @@ -53,6 +53,6 @@ #define SS D10 #define RTDUINO_DEFAULT_SPI_BUS_NAME "spi1" -#define RTDUINO_TONE_HWTIMER_DEVICE_NAME "timer6" +#define RTDUINO_TONE_CLOCK_TIMER_DEVICE_NAME "timer6" #endif /* Pins_Arduino_h */ diff --git a/bsp/stm32/stm32f412-st-nucleo/board/Kconfig b/bsp/stm32/stm32f412-st-nucleo/board/Kconfig index 38b77b90f9..28d5f0e198 100644 --- a/bsp/stm32/stm32f412-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32f412-st-nucleo/board/Kconfig @@ -183,7 +183,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM6 bool "Enable TIM6" diff --git a/bsp/stm32/stm32f413-st-nucleo/board/Kconfig b/bsp/stm32/stm32f413-st-nucleo/board/Kconfig index c5738e58e5..cd009d2fe2 100644 --- a/bsp/stm32/stm32f413-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32f413-st-nucleo/board/Kconfig @@ -136,7 +136,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32f429-armfly-v6/board/Kconfig b/bsp/stm32/stm32f429-armfly-v6/board/Kconfig index 3373a8fd27..99b09d498d 100644 --- a/bsp/stm32/stm32f429-armfly-v6/board/Kconfig +++ b/bsp/stm32/stm32f429-armfly-v6/board/Kconfig @@ -166,7 +166,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32f429-atk-apollo/board/Kconfig b/bsp/stm32/stm32f429-atk-apollo/board/Kconfig index 0cd7bc4fde..151792707e 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/Kconfig +++ b/bsp/stm32/stm32f429-atk-apollo/board/Kconfig @@ -278,7 +278,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32f429-fire-challenger/board/Kconfig b/bsp/stm32/stm32f429-fire-challenger/board/Kconfig index bfe8cff519..c56a1b6a85 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/Kconfig +++ b/bsp/stm32/stm32f429-fire-challenger/board/Kconfig @@ -186,7 +186,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32f469-st-disco/applications/arduino_pinout/pins_arduino.h b/bsp/stm32/stm32f469-st-disco/applications/arduino_pinout/pins_arduino.h index ad1360cd07..8dd4453fd4 100644 --- a/bsp/stm32/stm32f469-st-disco/applications/arduino_pinout/pins_arduino.h +++ b/bsp/stm32/stm32f469-st-disco/applications/arduino_pinout/pins_arduino.h @@ -54,6 +54,6 @@ #define SS D10 #define RTDUINO_DEFAULT_SPI_BUS_NAME "spi2" -#define RTDUINO_TONE_HWTIMER_DEVICE_NAME "timer6" +#define RTDUINO_TONE_CLOCK_TIMER_DEVICE_NAME "timer6" #endif /* Pins_Arduino_h */ diff --git a/bsp/stm32/stm32f469-st-disco/board/Kconfig b/bsp/stm32/stm32f469-st-disco/board/Kconfig index d1c8dbe962..93b561d474 100644 --- a/bsp/stm32/stm32f469-st-disco/board/Kconfig +++ b/bsp/stm32/stm32f469-st-disco/board/Kconfig @@ -183,7 +183,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM6 bool "Enable TIM6" diff --git a/bsp/stm32/stm32f723-st-disco/project.ewp b/bsp/stm32/stm32f723-st-disco/project.ewp index 174f59043d..6aec292827 100644 --- a/bsp/stm32/stm32f723-st-disco/project.ewp +++ b/bsp/stm32/stm32f723-st-disco/project.ewp @@ -2151,7 +2151,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\ipc\completion.c diff --git a/bsp/stm32/stm32f723-st-disco/project.uvprojx b/bsp/stm32/stm32f723-st-disco/project.uvprojx index 5298f594c0..4b0e3f910f 100644 --- a/bsp/stm32/stm32f723-st-disco/project.uvprojx +++ b/bsp/stm32/stm32f723-st-disco/project.uvprojx @@ -469,9 +469,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c diff --git a/bsp/stm32/stm32f746-st-disco/board/Kconfig b/bsp/stm32/stm32f746-st-disco/board/Kconfig index 120807deb2..dd1f0d0bf6 100644 --- a/bsp/stm32/stm32f746-st-disco/board/Kconfig +++ b/bsp/stm32/stm32f746-st-disco/board/Kconfig @@ -111,7 +111,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32f746-st-disco/project.ewp b/bsp/stm32/stm32f746-st-disco/project.ewp index 1b0a508120..1e709e6cea 100644 --- a/bsp/stm32/stm32f746-st-disco/project.ewp +++ b/bsp/stm32/stm32f746-st-disco/project.ewp @@ -2151,7 +2151,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\ipc\completion.c diff --git a/bsp/stm32/stm32f746-st-disco/project.uvprojx b/bsp/stm32/stm32f746-st-disco/project.uvprojx index 40a682b162..b2bc254a6c 100644 --- a/bsp/stm32/stm32f746-st-disco/project.uvprojx +++ b/bsp/stm32/stm32f746-st-disco/project.uvprojx @@ -468,9 +468,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c diff --git a/bsp/stm32/stm32f746-st-nucleo/board/Kconfig b/bsp/stm32/stm32f746-st-nucleo/board/Kconfig index 2d7eacf753..224cd13c3c 100644 --- a/bsp/stm32/stm32f746-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32f746-st-nucleo/board/Kconfig @@ -183,7 +183,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM2 bool "Enable TIM2" diff --git a/bsp/stm32/stm32f767-atk-apollo/board/Kconfig b/bsp/stm32/stm32f767-atk-apollo/board/Kconfig index b864a41c2c..0bb7894b0c 100644 --- a/bsp/stm32/stm32f767-atk-apollo/board/Kconfig +++ b/bsp/stm32/stm32f767-atk-apollo/board/Kconfig @@ -186,7 +186,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM11 bool "Enable TIM11" diff --git a/bsp/stm32/stm32g070-st-nucleo/board/Kconfig b/bsp/stm32/stm32g070-st-nucleo/board/Kconfig index 8d6190005e..bbf6869bc4 100644 --- a/bsp/stm32/stm32g070-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32g070-st-nucleo/board/Kconfig @@ -129,7 +129,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM1 diff --git a/bsp/stm32/stm32g071-st-nucleo/board/Kconfig b/bsp/stm32/stm32g071-st-nucleo/board/Kconfig index 2f18269e64..899c308fb4 100644 --- a/bsp/stm32/stm32g071-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32g071-st-nucleo/board/Kconfig @@ -121,7 +121,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM2 diff --git a/bsp/stm32/stm32g491-st-nucleo/board/Kconfig b/bsp/stm32/stm32g491-st-nucleo/board/Kconfig index c1c027d8d2..9f0dcc5373 100644 --- a/bsp/stm32/stm32g491-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32g491-st-nucleo/board/Kconfig @@ -235,7 +235,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM7 bool "Enable TIM7" diff --git a/bsp/stm32/stm32h743-openmv-h7plus/project.ewp b/bsp/stm32/stm32h743-openmv-h7plus/project.ewp index 2f62b9c880..74475b8ee5 100644 --- a/bsp/stm32/stm32h743-openmv-h7plus/project.ewp +++ b/bsp/stm32/stm32h743-openmv-h7plus/project.ewp @@ -2165,7 +2165,7 @@ $PROJ_DIR$\..\..\..\components\drivers\core\device.c - $PROJ_DIR$\..\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\..\components\drivers\i2c\i2c-bit-ops.c diff --git a/bsp/stm32/stm32h743-openmv-h7plus/project.uvprojx b/bsp/stm32/stm32h743-openmv-h7plus/project.uvprojx index 7577c5e144..d6b51695b2 100644 --- a/bsp/stm32/stm32h743-openmv-h7plus/project.uvprojx +++ b/bsp/stm32/stm32h743-openmv-h7plus/project.uvprojx @@ -469,9 +469,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\components\drivers\clock_time\clock_timer.c diff --git a/bsp/stm32/stm32h750-artpi/board/Kconfig b/bsp/stm32/stm32h750-artpi/board/Kconfig index 54f1c97c05..68b2ed588d 100644 --- a/bsp/stm32/stm32h750-artpi/board/Kconfig +++ b/bsp/stm32/stm32h750-artpi/board/Kconfig @@ -242,7 +242,7 @@ menu "On-chip Peripheral Drivers" bool "Enable lptimer" default n select RT_USING_LPTIMER - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_LPTIM config BSP_USING_LPTIM1 bool "Enable LPTIM1" diff --git a/bsp/stm32/stm32l433-ali-startkit/board/Kconfig b/bsp/stm32/stm32l433-ali-startkit/board/Kconfig index e435fd49a7..d42f7465c5 100644 --- a/bsp/stm32/stm32l433-ali-startkit/board/Kconfig +++ b/bsp/stm32/stm32l433-ali-startkit/board/Kconfig @@ -203,7 +203,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM15 bool "Enable TIM15" diff --git a/bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/pins_arduino.h b/bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/pins_arduino.h index 69578f337f..79fe8c6ce4 100644 --- a/bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/pins_arduino.h +++ b/bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/pins_arduino.h @@ -70,7 +70,7 @@ /* Serial2 - PA2-TX PA3-RX */ #define RTDUINO_SERIAL2_DEVICE_NAME "uart2" -#define RTDUINO_TONE_HWTIMER_DEVICE_NAME "timer7" +#define RTDUINO_TONE_CLOCK_TIMER_DEVICE_NAME "timer7" /* I2C */ #if defined(BSP_USING_ARDUINO_AHT10) diff --git a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig index bb300ec0e2..de2fc8ce25 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig +++ b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig @@ -478,7 +478,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM7 bool "Enable TIM7" diff --git a/bsp/stm32/stm32l476-st-nucleo/applications/arduino_pinout/pins_arduino.h b/bsp/stm32/stm32l476-st-nucleo/applications/arduino_pinout/pins_arduino.h index e7362a43d0..4c00425203 100644 --- a/bsp/stm32/stm32l476-st-nucleo/applications/arduino_pinout/pins_arduino.h +++ b/bsp/stm32/stm32l476-st-nucleo/applications/arduino_pinout/pins_arduino.h @@ -50,6 +50,6 @@ #define SS D10 #define RTDUINO_DEFAULT_SPI_BUS_NAME "spi1" -#define RTDUINO_TONE_HWTIMER_DEVICE_NAME "timer7" +#define RTDUINO_TONE_CLOCK_TIMER_DEVICE_NAME "timer7" #endif /* Pins_Arduino_h */ diff --git a/bsp/stm32/stm32l476-st-nucleo/board/Kconfig b/bsp/stm32/stm32l476-st-nucleo/board/Kconfig index ebbeebb534..a8e9ee55f3 100644 --- a/bsp/stm32/stm32l476-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32l476-st-nucleo/board/Kconfig @@ -188,7 +188,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM7 bool "Enable TIM7" diff --git a/bsp/stm32/stm32l496-ali-developer/board/Kconfig b/bsp/stm32/stm32l496-ali-developer/board/Kconfig index 7c554b11ae..56643f8cdd 100644 --- a/bsp/stm32/stm32l496-ali-developer/board/Kconfig +++ b/bsp/stm32/stm32l496-ali-developer/board/Kconfig @@ -211,7 +211,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM15 bool "Enable TIM15" diff --git a/bsp/stm32/stm32l496-st-nucleo/.ci/attachconfig/ci.attachconfig.yml b/bsp/stm32/stm32l496-st-nucleo/.ci/attachconfig/ci.attachconfig.yml index 98c22f549d..21dbe5769b 100644 --- a/bsp/stm32/stm32l496-st-nucleo/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/stm32/stm32l496-st-nucleo/.ci/attachconfig/ci.attachconfig.yml @@ -64,6 +64,7 @@ pkg.kernel_en_sample: - CONFIG_KERNEL_SAMPLES_USING_PRODUCER_CONSUMER=y pkg.peripheral.sample: kconfig: + - CONFIG_RT_USING_CLOCK_TIME=y - CONFIG_PKG_USING_PERIPHERAL_SAMPLES=y - CONFIG_PERIPHERAL_SAMPLES_USING_ADC=y - CONFIG_PERIPHERAL_SAMPLES_USING_HWTIMER=y diff --git a/bsp/stm32/stm32l496-st-nucleo/board/Kconfig b/bsp/stm32/stm32l496-st-nucleo/board/Kconfig index 2787a7174b..f0c35b330a 100644 --- a/bsp/stm32/stm32l496-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32l496-st-nucleo/board/Kconfig @@ -207,7 +207,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM7 bool "Enable TIM7" diff --git a/bsp/stm32/stm32l4r5-st-nucleo/board/Kconfig b/bsp/stm32/stm32l4r5-st-nucleo/board/Kconfig index 1858c87a37..24bbfa4351 100644 --- a/bsp/stm32/stm32l4r5-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32l4r5-st-nucleo/board/Kconfig @@ -323,7 +323,7 @@ menu "Hardware Drivers Config" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM1 bool "Enable TIM1" diff --git a/bsp/stm32/stm32mp157a-st-discovery/board/Kconfig b/bsp/stm32/stm32mp157a-st-discovery/board/Kconfig index 8a564292bf..05c61bf8b9 100644 --- a/bsp/stm32/stm32mp157a-st-discovery/board/Kconfig +++ b/bsp/stm32/stm32mp157a-st-discovery/board/Kconfig @@ -183,7 +183,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM14 bool "Enable TIM14" diff --git a/bsp/stm32/stm32mp157a-st-discovery/board/ports/timer_sample.c b/bsp/stm32/stm32mp157a-st-discovery/board/ports/timer_sample.c index 50c87ad0c8..402902db3f 100644 --- a/bsp/stm32/stm32mp157a-st-discovery/board/ports/timer_sample.c +++ b/bsp/stm32/stm32mp157a-st-discovery/board/ports/timer_sample.c @@ -15,7 +15,7 @@ #include #include -#define HWTIMER_DEV_NAME "timer14" +#define CLOCK_TIMER_DEV_NAME "timer14" #define HWADC_DEV_NAME "adc2" #define REFER_VOLTAGE 330 /* voltage reference */ #define CONVERT_BITS (1 << 12) /* Conversion digit */ @@ -37,22 +37,22 @@ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) return 0; } -static int hwtimer_stop(void) +static int clock_timer_stop(void) { rt_err_t ret = RT_EOK; rt_device_t hw_dev = RT_NULL; - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", CLOCK_TIMER_DEV_NAME); return -RT_ERROR; } ret = rt_device_close(hw_dev); if (ret != RT_EOK) { - rt_kprintf("close %s device failed!\n", HWTIMER_DEV_NAME); + rt_kprintf("close %s device failed!\n", CLOCK_TIMER_DEV_NAME); return ret; } @@ -62,18 +62,18 @@ static int hwtimer_stop(void) return ret; } -static int hwtimer_start(void) +static int clock_timer_start(void) { rt_err_t ret = RT_EOK; - rt_hwtimerval_t timeout_s; + rt_clock_timerval_t timeout_s; rt_device_t hw_dev = RT_NULL; - rt_hwtimer_mode_t mode; + rt_clock_timer_mode_t mode; - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", CLOCK_TIMER_DEV_NAME); return -RT_ERROR; } @@ -81,7 +81,7 @@ static int hwtimer_start(void) adc_dev = (rt_adc_device_t)rt_device_find(HWADC_DEV_NAME); if (adc_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWADC_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", HWADC_DEV_NAME); return -RT_ERROR; } @@ -89,7 +89,7 @@ static int hwtimer_start(void) ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); if (ret != RT_EOK) { - rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + rt_kprintf("open %s device failed!\n", CLOCK_TIMER_DEV_NAME); return ret; } @@ -97,8 +97,8 @@ static int hwtimer_start(void) rt_device_set_rx_indicate(hw_dev, timeout_cb); /* Set the mode to periodic timer */ - mode = HWTIMER_MODE_PERIOD; - ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); if (ret != RT_EOK) { rt_kprintf("set mode failed! ret is :%d\n", ret); @@ -132,12 +132,12 @@ static int tim_sample(int argc, char *argv[]) if (!rt_strcmp(argv[1], "start")) { rt_kprintf("tim14 will start\n"); - hwtimer_start(); + clock_timer_start(); return RT_EOK; } else if (!rt_strcmp(argv[1], "stop")) { - hwtimer_stop(); + clock_timer_stop(); rt_kprintf("stop tim14 success!\n"); return RT_EOK; } diff --git a/bsp/stm32/stm32mp157a-st-ev1/board/Kconfig b/bsp/stm32/stm32mp157a-st-ev1/board/Kconfig index 153c1df159..fb4c2cea1e 100644 --- a/bsp/stm32/stm32mp157a-st-ev1/board/Kconfig +++ b/bsp/stm32/stm32mp157a-st-ev1/board/Kconfig @@ -233,7 +233,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM14 bool "Enable TIM14" diff --git a/bsp/stm32/stm32mp157a-st-ev1/board/ports/timer_sample.c b/bsp/stm32/stm32mp157a-st-ev1/board/ports/timer_sample.c index 50c87ad0c8..402902db3f 100644 --- a/bsp/stm32/stm32mp157a-st-ev1/board/ports/timer_sample.c +++ b/bsp/stm32/stm32mp157a-st-ev1/board/ports/timer_sample.c @@ -15,7 +15,7 @@ #include #include -#define HWTIMER_DEV_NAME "timer14" +#define CLOCK_TIMER_DEV_NAME "timer14" #define HWADC_DEV_NAME "adc2" #define REFER_VOLTAGE 330 /* voltage reference */ #define CONVERT_BITS (1 << 12) /* Conversion digit */ @@ -37,22 +37,22 @@ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) return 0; } -static int hwtimer_stop(void) +static int clock_timer_stop(void) { rt_err_t ret = RT_EOK; rt_device_t hw_dev = RT_NULL; - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", CLOCK_TIMER_DEV_NAME); return -RT_ERROR; } ret = rt_device_close(hw_dev); if (ret != RT_EOK) { - rt_kprintf("close %s device failed!\n", HWTIMER_DEV_NAME); + rt_kprintf("close %s device failed!\n", CLOCK_TIMER_DEV_NAME); return ret; } @@ -62,18 +62,18 @@ static int hwtimer_stop(void) return ret; } -static int hwtimer_start(void) +static int clock_timer_start(void) { rt_err_t ret = RT_EOK; - rt_hwtimerval_t timeout_s; + rt_clock_timerval_t timeout_s; rt_device_t hw_dev = RT_NULL; - rt_hwtimer_mode_t mode; + rt_clock_timer_mode_t mode; - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", CLOCK_TIMER_DEV_NAME); return -RT_ERROR; } @@ -81,7 +81,7 @@ static int hwtimer_start(void) adc_dev = (rt_adc_device_t)rt_device_find(HWADC_DEV_NAME); if (adc_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWADC_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", HWADC_DEV_NAME); return -RT_ERROR; } @@ -89,7 +89,7 @@ static int hwtimer_start(void) ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); if (ret != RT_EOK) { - rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + rt_kprintf("open %s device failed!\n", CLOCK_TIMER_DEV_NAME); return ret; } @@ -97,8 +97,8 @@ static int hwtimer_start(void) rt_device_set_rx_indicate(hw_dev, timeout_cb); /* Set the mode to periodic timer */ - mode = HWTIMER_MODE_PERIOD; - ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); if (ret != RT_EOK) { rt_kprintf("set mode failed! ret is :%d\n", ret); @@ -132,12 +132,12 @@ static int tim_sample(int argc, char *argv[]) if (!rt_strcmp(argv[1], "start")) { rt_kprintf("tim14 will start\n"); - hwtimer_start(); + clock_timer_start(); return RT_EOK; } else if (!rt_strcmp(argv[1], "stop")) { - hwtimer_stop(); + clock_timer_stop(); rt_kprintf("stop tim14 success!\n"); return RT_EOK; } diff --git a/bsp/stm32/stm32wb55-st-nucleo/board/Kconfig b/bsp/stm32/stm32wb55-st-nucleo/board/Kconfig index c57500c423..1351db7061 100644 --- a/bsp/stm32/stm32wb55-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32wb55-st-nucleo/board/Kconfig @@ -116,7 +116,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM16 diff --git a/bsp/synwit/libraries/SWM320_drivers/SConscript b/bsp/synwit/libraries/SWM320_drivers/SConscript index 9c20c550a4..c4beaaac5b 100644 --- a/bsp/synwit/libraries/SWM320_drivers/SConscript +++ b/bsp/synwit/libraries/SWM320_drivers/SConscript @@ -12,8 +12,8 @@ if GetDepend(['RT_USING_PIN']): if GetDepend(['RT_USING_ADC']): src += ['drv_adc.c'] -if GetDepend(['RT_USING_HWTIMER']): - src += ['drv_hwtimer.c'] +if GetDepend(['RT_USING_CLOCK_TIME']): + src += ['drv_timer.c'] if GetDepend(['RT_USING_I2C']): src += ['drv_soft_i2c.c'] diff --git a/bsp/synwit/libraries/SWM320_drivers/drv_hwtimer.c b/bsp/synwit/libraries/SWM320_drivers/drv_timer.c similarity index 59% rename from bsp/synwit/libraries/SWM320_drivers/drv_hwtimer.c rename to bsp/synwit/libraries/SWM320_drivers/drv_timer.c index 2970dc5e16..a1ec811ee0 100644 --- a/bsp/synwit/libraries/SWM320_drivers/drv_hwtimer.c +++ b/bsp/synwit/libraries/SWM320_drivers/drv_timer.c @@ -9,13 +9,13 @@ * 2020-07-10 lik format file */ -#include "drv_hwtimer.h" +#include "drv_timer.h" -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME #ifdef BSP_USING_TIM //#define DRV_DEBUG -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include #if !defined(BSP_USING_TIM0) && !defined(BSP_USING_TIM1) && !defined(BSP_USING_TIM2) && !defined(BSP_USING_TIM3) \ @@ -30,7 +30,7 @@ .maxfreq = 120000000, \ .minfreq = 120000000, \ .maxcnt = 0xFFFFFFFF, \ - .cntmode = HWTIMER_CNTMODE_DW, \ + .cntmode = CLOCK_TIMER_CNTMODE_DW, \ } #endif /* TIM_DEV_INFO_CONFIG */ @@ -94,16 +94,16 @@ #endif /* TIM5_CFG */ #endif /* BSP_USING_TIM5 */ -struct swm_hwtimer_cfg +struct swm_clock_timer_cfg { char *name; TIMR_TypeDef *TIMRx; }; -struct swm_hwtimer_device +struct swm_clock_timer_device { - struct swm_hwtimer_cfg *hwtimer_cfg; - rt_hwtimer_t time_device; + struct swm_clock_timer_cfg *clock_timer_cfg; + rt_clock_timer_t time_device; }; enum @@ -128,7 +128,7 @@ enum #endif }; -static struct swm_hwtimer_cfg swm_hwtimer_cfg[] = +static struct swm_clock_timer_cfg swm_clock_timer_cfg[] = { #ifdef BSP_USING_TIM0 TIM0_CFG, @@ -150,79 +150,79 @@ static struct swm_hwtimer_cfg swm_hwtimer_cfg[] = #endif }; -static struct swm_hwtimer_device hwtimer_obj[sizeof(swm_hwtimer_cfg) / sizeof(swm_hwtimer_cfg[0])] = {0}; +static struct swm_clock_timer_device clock_timer_obj[sizeof(swm_clock_timer_cfg) / sizeof(swm_clock_timer_cfg[0])] = {0}; -static void swm_timer_configure(struct rt_hwtimer_device *timer_device, rt_uint32_t state) +static void swm_timer_configure(struct rt_clock_timer_device *timer_device, rt_uint32_t state) { - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; RT_ASSERT(timer_device != RT_NULL); if (state) { - hwtimer_cfg = timer_device->parent.user_data; - TIMR_Init(hwtimer_cfg->TIMRx, TIMR_MODE_TIMER, SystemCoreClock, 1); + clock_timer_cfg = timer_device->parent.user_data; + TIMR_Init(clock_timer_cfg->TIMRx, TIMR_MODE_TIMER, SystemCoreClock, 1); timer_device->freq = SystemCoreClock; } } -static rt_err_t swm_timer_start(rt_hwtimer_t *timer_device, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +static rt_err_t swm_timer_start(rt_clock_timer_t *timer_device, rt_uint32_t cnt, rt_clock_timer_mode_t opmode) { rt_err_t result = RT_EOK; - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; RT_ASSERT(timer_device != RT_NULL); - hwtimer_cfg = timer_device->parent.user_data; + clock_timer_cfg = timer_device->parent.user_data; - if (opmode == HWTIMER_MODE_ONESHOT) + if (opmode == CLOCK_TIMER_MODE_ONESHOT) { /* set timer to single mode */ - timer_device->mode = HWTIMER_MODE_ONESHOT; + timer_device->mode = CLOCK_TIMER_MODE_ONESHOT; } else { - timer_device->mode = HWTIMER_MODE_PERIOD; + timer_device->mode = CLOCK_TIMER_MODE_PERIOD; } - TIMR_SetPeriod(hwtimer_cfg->TIMRx, cnt); - TIMR_Stop(hwtimer_cfg->TIMRx); - TIMR_Start(hwtimer_cfg->TIMRx); + TIMR_SetPeriod(clock_timer_cfg->TIMRx, cnt); + TIMR_Stop(clock_timer_cfg->TIMRx); + TIMR_Start(clock_timer_cfg->TIMRx); return result; } -static void swm_timer_stop(rt_hwtimer_t *timer_device) +static void swm_timer_stop(rt_clock_timer_t *timer_device) { - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; RT_ASSERT(timer_device != RT_NULL); - hwtimer_cfg = timer_device->parent.user_data; + clock_timer_cfg = timer_device->parent.user_data; /* stop timer */ - TIMR_Stop(hwtimer_cfg->TIMRx); + TIMR_Stop(clock_timer_cfg->TIMRx); } -static rt_uint32_t swm_timer_count_get(rt_hwtimer_t *timer_device) +static rt_uint32_t swm_timer_count_get(rt_clock_timer_t *timer_device) { - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; RT_ASSERT(timer_device != RT_NULL); - hwtimer_cfg = timer_device->parent.user_data; + clock_timer_cfg = timer_device->parent.user_data; - return TIMR_GetCurValue(hwtimer_cfg->TIMRx); + return TIMR_GetCurValue(clock_timer_cfg->TIMRx); } -static rt_err_t swm_timer_control(rt_hwtimer_t *timer_device, rt_uint32_t cmd, void *args) +static rt_err_t swm_timer_control(rt_clock_timer_t *timer_device, rt_uint32_t cmd, void *args) { - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; rt_err_t result = RT_EOK; RT_ASSERT(timer_device != RT_NULL); RT_ASSERT(args != RT_NULL); - hwtimer_cfg = timer_device->parent.user_data; + clock_timer_cfg = timer_device->parent.user_data; switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t freq; freq = *(rt_uint32_t *)args; - TIMR_Init(hwtimer_cfg->TIMRx, TIMR_MODE_TIMER, SystemCoreClock / freq, 1); + TIMR_Init(clock_timer_cfg->TIMRx, TIMR_MODE_TIMER, SystemCoreClock / freq, 1); } break; default: @@ -235,9 +235,9 @@ static rt_err_t swm_timer_control(rt_hwtimer_t *timer_device, rt_uint32_t cmd, v return result; } -static const struct rt_hwtimer_info _info = TIM_DEV_INFO_CONFIG; +static const struct rt_clock_timer_info _info = TIM_DEV_INFO_CONFIG; -static const struct rt_hwtimer_ops swm_timer_ops = +static const struct rt_clock_timer_ops swm_timer_ops = { .init = swm_timer_configure, .start = swm_timer_start, @@ -245,14 +245,14 @@ static const struct rt_hwtimer_ops swm_timer_ops = .count_get = swm_timer_count_get, .control = swm_timer_control}; -void swm_timer_isr(rt_hwtimer_t *timer_device) +void swm_timer_isr(rt_clock_timer_t *timer_device) { - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; RT_ASSERT(timer_device != RT_NULL); - hwtimer_cfg = timer_device->parent.user_data; + clock_timer_cfg = timer_device->parent.user_data; - TIMR_INTClr(hwtimer_cfg->TIMRx); - rt_device_hwtimer_isr(timer_device); + TIMR_INTClr(clock_timer_cfg->TIMRx); + rt_clock_timer_isr(timer_device); } #ifdef BSP_USING_TIM0 @@ -260,7 +260,7 @@ void TIMR0_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[TIM0_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[TIM0_INDEX].time_device)); /* leave interrupt */ rt_interrupt_leave(); } @@ -271,7 +271,7 @@ void TIMR1_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[TIM1_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[TIM1_INDEX].time_device)); /* leave interrupt */ rt_interrupt_leave(); } @@ -282,7 +282,7 @@ void TIMR2_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[TIM2_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[TIM2_INDEX].time_device)); /* leave interrupt */ rt_interrupt_leave(); } @@ -293,7 +293,7 @@ void TIMR3_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[TIM3_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[TIM3_INDEX].time_device)); /* leave interrupt */ rt_interrupt_leave(); } @@ -304,7 +304,7 @@ void TIMR4_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[TIM4_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[TIM4_INDEX].time_device)); /* leave interrupt */ rt_interrupt_leave(); } @@ -315,7 +315,7 @@ void TIMR5_Handler(void) { /* enter interrupt */ rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[TIM5_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[TIM5_INDEX].time_device)); /* leave interrupt */ rt_interrupt_leave(); } @@ -326,19 +326,19 @@ static int swm_timer_init(void) int i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(swm_hwtimer_cfg) / sizeof(swm_hwtimer_cfg[0]); i++) + for (i = 0; i < sizeof(swm_clock_timer_cfg) / sizeof(swm_clock_timer_cfg[0]); i++) { - hwtimer_obj[i].hwtimer_cfg = &swm_hwtimer_cfg[i]; - hwtimer_obj[i].time_device.info = &_info; - hwtimer_obj[i].time_device.ops = &swm_timer_ops; - result = rt_device_hwtimer_register(&hwtimer_obj[i].time_device, hwtimer_obj[i].hwtimer_cfg->name, hwtimer_obj[i].hwtimer_cfg); + clock_timer_obj[i].clock_timer_cfg = &swm_clock_timer_cfg[i]; + clock_timer_obj[i].time_device.info = &_info; + clock_timer_obj[i].time_device.ops = &swm_timer_ops; + result = rt_clock_timer_register(&clock_timer_obj[i].time_device, clock_timer_obj[i].clock_timer_cfg->name, clock_timer_obj[i].clock_timer_cfg); if (result != RT_EOK) { - LOG_E("%s register fail.", hwtimer_obj[i].hwtimer_cfg->name); + LOG_E("%s register fail.", clock_timer_obj[i].clock_timer_cfg->name); } else { - LOG_D("%s register success.", hwtimer_obj[i].hwtimer_cfg->name); + LOG_D("%s register success.", clock_timer_obj[i].clock_timer_cfg->name); } } @@ -347,4 +347,4 @@ static int swm_timer_init(void) INIT_BOARD_EXPORT(swm_timer_init); #endif /* BSP_USING_TIM */ -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ diff --git a/bsp/synwit/libraries/SWM320_drivers/drv_hwtimer.h b/bsp/synwit/libraries/SWM320_drivers/drv_timer.h similarity index 75% rename from bsp/synwit/libraries/SWM320_drivers/drv_hwtimer.h rename to bsp/synwit/libraries/SWM320_drivers/drv_timer.h index fa74a2a68f..0d2818ac14 100644 --- a/bsp/synwit/libraries/SWM320_drivers/drv_hwtimer.h +++ b/bsp/synwit/libraries/SWM320_drivers/drv_timer.h @@ -9,11 +9,11 @@ * 2020-07-10 lik rewrite */ -#ifndef __DRV_HWTIMER_H__ -#define __DRV_HWTIMER_H__ +#ifndef __DRV_CLOCK_TIMER_H__ +#define __DRV_CLOCK_TIMER_H__ #include "board.h" int swm_timer_init(void); -#endif /* __DRV_HWTIMER_H__ */ +#endif /* __DRV_CLOCK_TIMER_H__ */ diff --git a/bsp/synwit/libraries/SWM341_drivers/SConscript b/bsp/synwit/libraries/SWM341_drivers/SConscript index 8aacb2087f..26bef4ca2b 100644 --- a/bsp/synwit/libraries/SWM341_drivers/SConscript +++ b/bsp/synwit/libraries/SWM341_drivers/SConscript @@ -18,8 +18,8 @@ if GetDepend(['RT_USING_DAC']): if GetDepend(['RT_USING_CAN']): src += ['drv_can.c'] -if GetDepend(['RT_USING_HWTIMER']): - src += ['drv_hwtimer.c'] +if GetDepend(['RT_USING_CLOCK_TIME']): + src += ['drv_timer.c'] if GetDepend(['RT_USING_I2C']): src += ['drv_soft_i2c.c'] diff --git a/bsp/synwit/libraries/SWM341_drivers/drv_hwtimer.c b/bsp/synwit/libraries/SWM341_drivers/drv_timer.c similarity index 70% rename from bsp/synwit/libraries/SWM341_drivers/drv_hwtimer.c rename to bsp/synwit/libraries/SWM341_drivers/drv_timer.c index c66836b32f..507190caac 100644 --- a/bsp/synwit/libraries/SWM341_drivers/drv_hwtimer.c +++ b/bsp/synwit/libraries/SWM341_drivers/drv_timer.c @@ -8,13 +8,13 @@ * 2021-07-01 lik first version */ -#include "drv_hwtimer.h" +#include "drv_timer.h" -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME #ifdef BSP_USING_TIM //#define DRV_DEBUG -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include #if !defined(BSP_USING_TIM0) && !defined(BSP_USING_TIM1) && !defined(BSP_USING_TIM2) && !defined(BSP_USING_TIM3) \ @@ -32,7 +32,7 @@ .maxfreq = 1000000, \ .minfreq = 1000000, \ .maxcnt = 0xFFFFFFFF, \ - .cntmode = HWTIMER_CNTMODE_DW, \ + .cntmode = CLOCK_TIMER_CNTMODE_DW, \ } #endif /* TIM_DEV_INFO_CONFIG */ @@ -206,16 +206,16 @@ #endif /* BTIM11_CFG */ #endif /* BSP_USING_BTIM11 */ -struct swm_hwtimer_cfg +struct swm_clock_timer_cfg { char *name; TIMR_TypeDef *TIMRx; }; -struct swm_hwtimer_device +struct swm_clock_timer_device { - struct swm_hwtimer_cfg *hwtimer_cfg; - rt_hwtimer_t time_device; + struct swm_clock_timer_cfg *clock_timer_cfg; + rt_clock_timer_t time_device; }; enum @@ -273,7 +273,7 @@ enum #endif }; -static struct swm_hwtimer_cfg swm_hwtimer_cfg[] = +static struct swm_clock_timer_cfg swm_clock_timer_cfg[] = { #ifdef BSP_USING_TIM0 TIM0_CFG, @@ -328,79 +328,79 @@ static struct swm_hwtimer_cfg swm_hwtimer_cfg[] = #endif }; -static struct swm_hwtimer_device hwtimer_obj[sizeof(swm_hwtimer_cfg) / sizeof(swm_hwtimer_cfg[0])] = {0}; +static struct swm_clock_timer_device clock_timer_obj[sizeof(swm_clock_timer_cfg) / sizeof(swm_clock_timer_cfg[0])] = {0}; -static void swm_timer_configure(struct rt_hwtimer_device *timer_device, rt_uint32_t state) +static void swm_timer_configure(struct rt_clock_timer_device *timer_device, rt_uint32_t state) { - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; RT_ASSERT(timer_device != RT_NULL); if (state) { - hwtimer_cfg = timer_device->parent.user_data; - TIMR_Init(hwtimer_cfg->TIMRx, TIMR_MODE_TIMER, CyclesPerUs, 1000000, 1); + clock_timer_cfg = timer_device->parent.user_data; + TIMR_Init(clock_timer_cfg->TIMRx, TIMR_MODE_TIMER, CyclesPerUs, 1000000, 1); timer_device->freq = 1000000; } } -static rt_err_t swm_timer_start(rt_hwtimer_t *timer_device, rt_uint32_t cnt, rt_hwtimer_mode_t opmode) +static rt_err_t swm_timer_start(rt_clock_timer_t *timer_device, rt_uint32_t cnt, rt_clock_timer_mode_t opmode) { rt_err_t result = RT_EOK; - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; RT_ASSERT(timer_device != RT_NULL); - hwtimer_cfg = timer_device->parent.user_data; + clock_timer_cfg = timer_device->parent.user_data; - if (opmode == HWTIMER_MODE_ONESHOT) + if (opmode == CLOCK_TIMER_MODE_ONESHOT) { /* set timer to single mode */ - timer_device->mode = HWTIMER_MODE_ONESHOT; + timer_device->mode = CLOCK_TIMER_MODE_ONESHOT; } else { - timer_device->mode = HWTIMER_MODE_PERIOD; + timer_device->mode = CLOCK_TIMER_MODE_PERIOD; } - hwtimer_cfg->TIMRx->LOAD = cnt - 1; - TIMR_Stop(hwtimer_cfg->TIMRx); - TIMR_Start(hwtimer_cfg->TIMRx); + clock_timer_cfg->TIMRx->LOAD = cnt - 1; + TIMR_Stop(clock_timer_cfg->TIMRx); + TIMR_Start(clock_timer_cfg->TIMRx); return result; } -static void swm_timer_stop(rt_hwtimer_t *timer_device) +static void swm_timer_stop(rt_clock_timer_t *timer_device) { - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; RT_ASSERT(timer_device != RT_NULL); - hwtimer_cfg = timer_device->parent.user_data; + clock_timer_cfg = timer_device->parent.user_data; /* stop timer */ - TIMR_Stop(hwtimer_cfg->TIMRx); + TIMR_Stop(clock_timer_cfg->TIMRx); } -static rt_uint32_t swm_timer_count_get(rt_hwtimer_t *timer_device) +static rt_uint32_t swm_timer_count_get(rt_clock_timer_t *timer_device) { - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; RT_ASSERT(timer_device != RT_NULL); - hwtimer_cfg = timer_device->parent.user_data; + clock_timer_cfg = timer_device->parent.user_data; - return TIMR_GetCurValue(hwtimer_cfg->TIMRx); + return TIMR_GetCurValue(clock_timer_cfg->TIMRx); } -static rt_err_t swm_timer_control(rt_hwtimer_t *timer_device, rt_uint32_t cmd, void *args) +static rt_err_t swm_timer_control(rt_clock_timer_t *timer_device, rt_uint32_t cmd, void *args) { - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; rt_err_t result = RT_EOK; RT_ASSERT(timer_device != RT_NULL); RT_ASSERT(args != RT_NULL); - hwtimer_cfg = timer_device->parent.user_data; + clock_timer_cfg = timer_device->parent.user_data; switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t freq; freq = *(rt_uint32_t *)args; - TIMR_Init(hwtimer_cfg->TIMRx, TIMR_MODE_TIMER, CyclesPerUs, freq, 1); + TIMR_Init(clock_timer_cfg->TIMRx, TIMR_MODE_TIMER, CyclesPerUs, freq, 1); } break; default: @@ -413,9 +413,9 @@ static rt_err_t swm_timer_control(rt_hwtimer_t *timer_device, rt_uint32_t cmd, v return result; } -static const struct rt_hwtimer_info _info = TIM_DEV_INFO_CONFIG; +static const struct rt_clock_timer_info _info = TIM_DEV_INFO_CONFIG; -static const struct rt_hwtimer_ops swm_timer_ops = +static const struct rt_clock_timer_ops swm_timer_ops = { .init = swm_timer_configure, .start = swm_timer_start, @@ -423,21 +423,21 @@ static const struct rt_hwtimer_ops swm_timer_ops = .count_get = swm_timer_count_get, .control = swm_timer_control}; -void swm_timer_isr(rt_hwtimer_t *timer_device) +void swm_timer_isr(rt_clock_timer_t *timer_device) { - struct swm_hwtimer_cfg *hwtimer_cfg = RT_NULL; + struct swm_clock_timer_cfg *clock_timer_cfg = RT_NULL; RT_ASSERT(timer_device != RT_NULL); - hwtimer_cfg = timer_device->parent.user_data; + clock_timer_cfg = timer_device->parent.user_data; - TIMR_INTClr(hwtimer_cfg->TIMRx); - rt_device_hwtimer_isr(timer_device); + TIMR_INTClr(clock_timer_cfg->TIMRx); + rt_clock_timer_isr(timer_device); } #ifdef BSP_USING_TIM0 void TIMR0_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[TIM0_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[TIM0_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_TIM0 @@ -446,7 +446,7 @@ void TIMR0_Handler(void) void TIMR1_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[TIM1_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[TIM1_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_TIM1 @@ -455,7 +455,7 @@ void TIMR1_Handler(void) void TIMR2_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[TIM2_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[TIM2_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_TIM2 @@ -464,7 +464,7 @@ void TIMR2_Handler(void) void TIMR3_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[TIM3_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[TIM3_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_TIM3 @@ -473,7 +473,7 @@ void TIMR3_Handler(void) void TIMR4_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[TIM4_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[TIM4_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_TIM4 @@ -482,7 +482,7 @@ void TIMR4_Handler(void) void BTIMR0_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM0_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM0_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM0 @@ -491,7 +491,7 @@ void BTIMR0_Handler(void) void BTIMR1_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM1_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM1_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM1 @@ -500,7 +500,7 @@ void BTIMR1_Handler(void) void BTIMR2_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM2_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM2_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM2 @@ -509,7 +509,7 @@ void BTIMR2_Handler(void) void BTIMR3_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM3_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM3_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM3 @@ -518,7 +518,7 @@ void BTIMR3_Handler(void) void BTIMR4_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM4_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM4_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM4 @@ -527,7 +527,7 @@ void BTIMR4_Handler(void) void BTIMR5_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM5_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM5_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM5 @@ -536,7 +536,7 @@ void BTIMR5_Handler(void) void BTIMR6_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM6_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM6_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM6 @@ -545,7 +545,7 @@ void BTIMR6_Handler(void) void BTIMR7_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM7_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM7_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM7 @@ -554,7 +554,7 @@ void BTIMR7_Handler(void) void BTIMR8_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM8_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM8_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM8 @@ -563,7 +563,7 @@ void BTIMR8_Handler(void) void BTIMR9_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM9_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM9_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM9 @@ -572,7 +572,7 @@ void BTIMR9_Handler(void) void BTIMR10_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM10_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM10_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM10 @@ -581,7 +581,7 @@ void BTIMR10_Handler(void) void BTIMR11_Handler(void) { rt_interrupt_enter(); - swm_timer_isr(&(hwtimer_obj[BTIM11_INDEX].time_device)); + swm_timer_isr(&(clock_timer_obj[BTIM11_INDEX].time_device)); rt_interrupt_leave(); } #endif // BSP_USING_BTIM11 @@ -591,19 +591,19 @@ int swm_timer_init(void) int i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(swm_hwtimer_cfg) / sizeof(swm_hwtimer_cfg[0]); i++) + for (i = 0; i < sizeof(swm_clock_timer_cfg) / sizeof(swm_clock_timer_cfg[0]); i++) { - hwtimer_obj[i].hwtimer_cfg = &swm_hwtimer_cfg[i]; - hwtimer_obj[i].time_device.info = &_info; - hwtimer_obj[i].time_device.ops = &swm_timer_ops; - result = rt_device_hwtimer_register(&hwtimer_obj[i].time_device, hwtimer_obj[i].hwtimer_cfg->name, hwtimer_obj[i].hwtimer_cfg); + clock_timer_obj[i].clock_timer_cfg = &swm_clock_timer_cfg[i]; + clock_timer_obj[i].time_device.info = &_info; + clock_timer_obj[i].time_device.ops = &swm_timer_ops; + result = rt_clock_timer_register(&clock_timer_obj[i].time_device, clock_timer_obj[i].clock_timer_cfg->name, clock_timer_obj[i].clock_timer_cfg); if (result != RT_EOK) { - LOG_E("%s register fail.", hwtimer_obj[i].hwtimer_cfg->name); + LOG_E("%s register fail.", clock_timer_obj[i].clock_timer_cfg->name); } else { - LOG_D("%s register success.", hwtimer_obj[i].hwtimer_cfg->name); + LOG_D("%s register success.", clock_timer_obj[i].clock_timer_cfg->name); } } @@ -612,4 +612,4 @@ int swm_timer_init(void) INIT_BOARD_EXPORT(swm_timer_init); #endif /* BSP_USING_TIM */ -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ diff --git a/bsp/synwit/libraries/SWM341_drivers/drv_hwtimer.h b/bsp/synwit/libraries/SWM341_drivers/drv_timer.h similarity index 72% rename from bsp/synwit/libraries/SWM341_drivers/drv_hwtimer.h rename to bsp/synwit/libraries/SWM341_drivers/drv_timer.h index 861d447b7b..745b8c74e3 100644 --- a/bsp/synwit/libraries/SWM341_drivers/drv_hwtimer.h +++ b/bsp/synwit/libraries/SWM341_drivers/drv_timer.h @@ -8,11 +8,11 @@ * 2021-07-01 lik first version */ -#ifndef __DRV_HWTIMER_H__ -#define __DRV_HWTIMER_H__ +#ifndef __DRV_CLOCK_TIMER_H__ +#define __DRV_CLOCK_TIMER_H__ #include "board.h" int swm_timer_init(void); -#endif /* __DRV_HWTIMER_H__ */ +#endif /* __DRV_CLOCK_TIMER_H__ */ diff --git a/bsp/synwit/swm320-mini/applications/main.c b/bsp/synwit/swm320-mini/applications/main.c index ee150569ff..4350be85ed 100644 --- a/bsp/synwit/swm320-mini/applications/main.c +++ b/bsp/synwit/swm320-mini/applications/main.c @@ -81,42 +81,42 @@ MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample); #endif #ifdef BSP_USING_TIM -#define HWTIMER_DEV_NAME "timer0" +#define CLOCK_TIMER_DEV_NAME "timer0" static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { - rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("this is clock_timer timeout callback fucntion!\n"); rt_kprintf("tick is :%d !\n", rt_tick_get()); return 0; } -static int hwtimer_sample(int argc, char *argv[]) +static int clock_timer_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; - rt_hwtimerval_t timeout_s; + rt_clock_timerval_t timeout_s; rt_device_t hw_dev = RT_NULL; - rt_hwtimer_mode_t mode; + rt_clock_timer_mode_t mode; - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", CLOCK_TIMER_DEV_NAME); return -RT_ERROR; } ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); if (ret != RT_EOK) { - rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + rt_kprintf("open %s device failed!\n", CLOCK_TIMER_DEV_NAME); return ret; } rt_device_set_rx_indicate(hw_dev, timeout_cb); - mode = HWTIMER_MODE_PERIOD; - //mode = HWTIMER_MODE_ONESHOT; - ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + //mode = CLOCK_TIMER_MODE_ONESHOT; + ret = rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); if (ret != RT_EOK) { rt_kprintf("set mode failed! ret is :%d\n", ret); @@ -139,7 +139,7 @@ static int hwtimer_sample(int argc, char *argv[]) return ret; } -MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); +MSH_CMD_EXPORT(clock_timer_sample, clock_timer sample); #endif #ifdef BSP_USING_PWM @@ -553,9 +553,9 @@ static int norflash_sample(int argc, char *argv[]) rt_kprintf("id = %08x!\n", id); // rt_device_set_rx_indicate(hw_dev, timeout_cb); - // mode = HWTIMER_MODE_PERIOD; - // //mode = HWTIMER_MODE_ONESHOT; - // ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + // mode = CLOCK_TIMER_MODE_PERIOD; + // //mode = CLOCK_TIMER_MODE_ONESHOT; + // ret = rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); // if (ret != RT_EOK) // { // rt_kprintf("set mode failed! ret is :%d\n", ret); diff --git a/bsp/synwit/swm320-mini/board/Kconfig b/bsp/synwit/swm320-mini/board/Kconfig index 6dab8a31ef..8a2c6875e1 100644 --- a/bsp/synwit/swm320-mini/board/Kconfig +++ b/bsp/synwit/swm320-mini/board/Kconfig @@ -99,9 +99,9 @@ menu "On-chip Peripheral Drivers" endif menuconfig BSP_USING_TIM - bool "Enable HWTIMER" + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM0 bool "Enable TIM0" diff --git a/bsp/synwit/swm341-mini/applications/main.c b/bsp/synwit/swm341-mini/applications/main.c index f46e4395cd..4d32b758e2 100644 --- a/bsp/synwit/swm341-mini/applications/main.c +++ b/bsp/synwit/swm341-mini/applications/main.c @@ -247,42 +247,42 @@ int can_sample(int argc, char *argv[]) MSH_CMD_EXPORT(can_sample, can device sample); #endif #ifdef BSP_USING_TIM -#define HWTIMER_DEV_NAME "timer0" +#define CLOCK_TIMER_DEV_NAME "timer0" static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { - rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("this is clock_timer timeout callback fucntion!\n"); rt_kprintf("tick is :%d !\n", rt_tick_get()); return 0; } -static int hwtimer_sample(int argc, char *argv[]) +static int clock_timer_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; - rt_hwtimerval_t timeout_s; + rt_clock_timerval_t timeout_s; rt_device_t hw_dev = RT_NULL; - rt_hwtimer_mode_t mode; + rt_clock_timer_mode_t mode; - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", CLOCK_TIMER_DEV_NAME); return -RT_ERROR; } ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); if (ret != RT_EOK) { - rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + rt_kprintf("open %s device failed!\n", CLOCK_TIMER_DEV_NAME); return ret; } rt_device_set_rx_indicate(hw_dev, timeout_cb); - mode = HWTIMER_MODE_PERIOD; - //mode = HWTIMER_MODE_ONESHOT; - ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + //mode = CLOCK_TIMER_MODE_ONESHOT; + ret = rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); if (ret != RT_EOK) { rt_kprintf("set mode failed! ret is :%d\n", ret); @@ -305,7 +305,7 @@ static int hwtimer_sample(int argc, char *argv[]) return ret; } -MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); +MSH_CMD_EXPORT(clock_timer_sample, clock_timer sample); #endif #ifdef BSP_USING_PWM diff --git a/bsp/synwit/swm341-mini/board/Kconfig b/bsp/synwit/swm341-mini/board/Kconfig index df36c1a65c..6e6564850d 100644 --- a/bsp/synwit/swm341-mini/board/Kconfig +++ b/bsp/synwit/swm341-mini/board/Kconfig @@ -126,9 +126,9 @@ menu "On-chip Peripheral Drivers" endif menuconfig BSP_USING_TIM - bool "Enable HWTIMER" + bool "Enable CLOCK_TIMER" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM0 bool "Enable TIM0" diff --git a/bsp/tae32f5300/Libraries/SConscript b/bsp/tae32f5300/Libraries/SConscript index c084d6df4b..730c641e28 100644 --- a/bsp/tae32f5300/Libraries/SConscript +++ b/bsp/tae32f5300/Libraries/SConscript @@ -35,7 +35,7 @@ if GetDepend(['RT_USING_WDT']): src += ['TAE32F53xx_StdPeriph_Driver/src/tae32f53xx_ll_wwdg.c'] src += ['TAE32F53xx_StdPeriph_Driver/src/tae32f53xx_ll_iwdg.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM'] or GetDepend(['RT_USING_PULSE_ENCODER'])): +if GetDepend(['RT_USING_CLOCK_TIME']) or GetDepend(['RT_USING_PWM'] or GetDepend(['RT_USING_PULSE_ENCODER'])): src += ['TAE32F53xx_StdPeriph_Driver/src/tae32f53xx_ll_tmr.c'] #add for startup script diff --git a/bsp/tae32f5300/drivers/Kconfig b/bsp/tae32f5300/drivers/Kconfig index 6d39184c1a..29451af6c7 100644 --- a/bsp/tae32f5300/drivers/Kconfig +++ b/bsp/tae32f5300/drivers/Kconfig @@ -233,7 +233,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIMER bool "Enable TIMER" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIMER config BSP_USING_TIMER5 bool "Enable TIMER5" diff --git a/bsp/tkm32F499/drivers/Kconfig b/bsp/tkm32F499/drivers/Kconfig index 4e7e9a19d6..d856bc73ff 100644 --- a/bsp/tkm32F499/drivers/Kconfig +++ b/bsp/tkm32F499/drivers/Kconfig @@ -87,7 +87,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM2 bool "Enable TIM2" diff --git a/bsp/tm4c123bsp/board/Kconfig b/bsp/tm4c123bsp/board/Kconfig index b7356b7fad..2387534959 100644 --- a/bsp/tm4c123bsp/board/Kconfig +++ b/bsp/tm4c123bsp/board/Kconfig @@ -262,7 +262,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_TIM bool "Enable timer" default n - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME if BSP_USING_TIM config BSP_USING_TIM2 bool "Enable TIM2" diff --git a/bsp/tm4c123bsp/libraries/Drivers/SConscript b/bsp/tm4c123bsp/libraries/Drivers/SConscript index 94e0d77ba1..99d85cd7f7 100644 --- a/bsp/tm4c123bsp/libraries/Drivers/SConscript +++ b/bsp/tm4c123bsp/libraries/Drivers/SConscript @@ -14,8 +14,8 @@ if GetDepend(['RT_USING_PIN']): if GetDepend(['RT_USING_SERIAL']): src += ['drv_uart.c'] -if GetDepend(['RT_USING_HWTIMER']): - src += ['drv_hwtimer.c'] +if GetDepend(['RT_USING_CLOCK_TIME']): + src += ['drv_timer.c'] if GetDepend(['RT_USING_PWM']): src += ['drv_pwm.c'] diff --git a/bsp/tm4c123bsp/libraries/TivaWare_C_series/SConscript b/bsp/tm4c123bsp/libraries/TivaWare_C_series/SConscript index 6bd89e4889..f638750a74 100644 --- a/bsp/tm4c123bsp/libraries/TivaWare_C_series/SConscript +++ b/bsp/tm4c123bsp/libraries/TivaWare_C_series/SConscript @@ -33,7 +33,7 @@ if GetDepend(['RT_USING_SPI']): #if GetDepend(['RT_USING_CAN']): -#if GetDepend(['RT_USING_HWTIMER']) +#if GetDepend(['RT_USING_CLOCK_TIME']) if GetDepend(['RT_USING_PWM']) or GetDepend(['RT_USING_PULSE_ENCODER']): src += ['tm4c123_driverlib/src/pwm.c'] diff --git a/bsp/ultrarisc/ur_dp1000_evb/board/board.c b/bsp/ultrarisc/ur_dp1000_evb/board/board.c index 0a672df343..5f338c4689 100644 --- a/bsp/ultrarisc/ur_dp1000_evb/board/board.c +++ b/bsp/ultrarisc/ur_dp1000_evb/board/board.c @@ -35,6 +35,11 @@ struct mem_desc platform_mem_desc[] = #endif +rt_uint64_t rt_hw_get_clock_timer_freq(void) +{ + return 10000000ULL; +} + void primary_cpu_entry(void) { /* disable global interrupt */ @@ -123,4 +128,4 @@ void rt_hw_cpu_reset(void) while (1) ; } -MSH_CMD_EXPORT_ALIAS(rt_hw_cpu_reset, reboot, reset machine); \ No newline at end of file +MSH_CMD_EXPORT_ALIAS(rt_hw_cpu_reset, reboot, reset machine); diff --git a/bsp/w60x/drivers/Kconfig b/bsp/w60x/drivers/Kconfig index 2a10fd89dc..5c2b5c6d82 100644 --- a/bsp/w60x/drivers/Kconfig +++ b/bsp/w60x/drivers/Kconfig @@ -108,12 +108,12 @@ menu "On-chip Peripheral Drivers" endif endif - menuconfig BSP_USING_HWTIMER - bool "Enable HWTIMER" - select RT_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER + bool "Enable CLOCK_TIMER" + select RT_USING_CLOCK_TIME default n - if BSP_USING_HWTIMER + if BSP_USING_CLOCK_TIMER config USING_HW_TIMER1 bool "Enable hw timer1" config USING_HW_TIMER2 diff --git a/bsp/w60x/drivers/SConscript b/bsp/w60x/drivers/SConscript index ef076132c3..44dd0267b3 100644 --- a/bsp/w60x/drivers/SConscript +++ b/bsp/w60x/drivers/SConscript @@ -20,7 +20,7 @@ if GetDepend(['BSP_USING_WIFI']): if GetDepend('BSP_USING_PIN'): src += ['drv_pin.c'] -if GetDepend('BSP_USING_HWTIMER'): +if GetDepend('BSP_USING_CLOCK_TIMER'): src += ['drv_hw_timer.c'] if GetDepend('BSP_USING_SOFT_I2C'): diff --git a/bsp/w60x/drivers/drv_hw_timer.c b/bsp/w60x/drivers/drv_hw_timer.c index d52c9c09a6..0ae3b8bfe9 100644 --- a/bsp/w60x/drivers/drv_hw_timer.c +++ b/bsp/w60x/drivers/drv_hw_timer.c @@ -14,7 +14,7 @@ #include "wm_timer.h" #include "drv_hw_timer.h" -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER struct wm_timer_Type { @@ -22,7 +22,7 @@ struct wm_timer_Type enum tls_timer_id id; }; -static void wm_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) +static void wm_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { struct tls_timer_cfg timer_cfg; struct wm_timer_Type *wm_timer = (struct wm_timer_Type *)timer->parent.user_data; @@ -43,35 +43,35 @@ static void wm_timer_init(rt_hwtimer_t *timer, rt_uint32_t state) } } -static rt_err_t wm_timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +static rt_err_t wm_timer_start(rt_clock_timer_t *timer, rt_uint32_t t, rt_clock_timer_mode_t opmode) { struct wm_timer_Type *wm_timer = (struct wm_timer_Type *)timer->parent.user_data; uint8_t m; tls_timer_change(wm_timer->id, t); - m = (opmode == HWTIMER_MODE_ONESHOT) ? 0 : 1; + m = (opmode == CLOCK_TIMER_MODE_ONESHOT) ? 0 : 1; tls_timer_set_mode(wm_timer->id, m); tls_timer_start(wm_timer->id); return RT_EOK; } -static void wm_timer_stop(rt_hwtimer_t *timer) +static void wm_timer_stop(rt_clock_timer_t *timer) { struct wm_timer_Type *wm_timer = (struct wm_timer_Type *)timer->parent.user_data; tls_timer_stop(wm_timer->id); } -static rt_uint32_t wm_timer_get(rt_hwtimer_t *timer) +static rt_uint32_t wm_timer_get(rt_clock_timer_t *timer) { return 0; } -static rt_err_t wm_timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +static rt_err_t wm_timer_ctrl(rt_clock_timer_t *timer, rt_uint32_t cmd, void *arg) { /* The frequency value is an immutable value. */ - if (cmd != HWTIMER_CTRL_FREQ_SET) + if (cmd != CLOCK_TIMER_CTRL_FREQ_SET) { return -RT_ENOSYS; } @@ -85,15 +85,15 @@ static rt_err_t wm_timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) } } -static const struct rt_hwtimer_info _info = +static const struct rt_clock_timer_info _info = { 1000000, /* the maximum count frequency can be set */ 1000000, /* the minimum count frequency can be set */ 0xFFFFFFFF, /* the maximum counter value */ - HWTIMER_CNTMODE_DW, /* Increment or Decreasing count mode */ + CLOCK_TIMER_CNTMODE_DW, /* Increment or Decreasing count mode */ }; -static const struct rt_hwtimer_ops _ops = +static const struct rt_clock_timer_ops _ops = { wm_timer_init, wm_timer_start, @@ -103,23 +103,23 @@ static const struct rt_hwtimer_ops _ops = }; #ifdef USING_HW_TIMER1 -static rt_hwtimer_t _timer1; +static rt_clock_timer_t _timer1; static struct wm_timer_Type wm_timer1; #endif #ifdef USING_HW_TIMER2 -static rt_hwtimer_t _timer2; +static rt_clock_timer_t _timer2; static struct wm_timer_Type wm_timer2; #endif #ifdef USING_HW_TIMER3 -static rt_hwtimer_t _timer3; +static rt_clock_timer_t _timer3; static struct wm_timer_Type wm_timer3; #endif #ifdef USING_HW_TIMER4 -static rt_hwtimer_t _timer4; +static rt_clock_timer_t _timer4; static struct wm_timer_Type wm_timer4; #endif #ifdef USING_HW_TIMER5 -static rt_hwtimer_t _timer5; +static rt_clock_timer_t _timer5; static struct wm_timer_Type wm_timer5; #endif @@ -132,7 +132,7 @@ int wm_hw_timer_init(void) _timer1.info = &_info; _timer1.ops = &_ops; - rt_device_hwtimer_register(&_timer1, "timer1", &wm_timer1); + rt_clock_timer_register(&_timer1, "timer1", &wm_timer1); #endif #ifdef USING_HW_TIMER2 wm_timer2.id = TLS_TIMER_ID_2; @@ -141,7 +141,7 @@ int wm_hw_timer_init(void) _timer2.info = &_info; _timer2.ops = &_ops; - rt_device_hwtimer_register(&_timer2, "timer2", &wm_timer2); + rt_clock_timer_register(&_timer2, "timer2", &wm_timer2); #endif #ifdef USING_HW_TIMER3 wm_timer3.id = TLS_TIMER_ID_3; @@ -150,7 +150,7 @@ int wm_hw_timer_init(void) _timer3.info = &_info; _timer3.ops = &_ops; - rt_device_hwtimer_register(&_timer3, "timer3", &wm_timer3); + rt_clock_timer_register(&_timer3, "timer3", &wm_timer3); #endif #ifdef USING_HW_TIMER4 wm_timer4.id = TLS_TIMER_ID_4; @@ -159,7 +159,7 @@ int wm_hw_timer_init(void) _timer4.info = &_info; _timer4.ops = &_ops; - rt_device_hwtimer_register(&_timer4, "timer4", &wm_timer4); + rt_clock_timer_register(&_timer4, "timer4", &wm_timer4); #endif #ifdef USING_HW_TIMER5 wm_timer5.id = TLS_TIMER_ID_5; @@ -168,7 +168,7 @@ int wm_hw_timer_init(void) _timer5.info = &_info; _timer5.ops = &_ops; - rt_device_hwtimer_register(&_timer5, "timer5", &wm_timer5); + rt_clock_timer_register(&_timer5, "timer5", &wm_timer5); #endif return 0; } @@ -178,35 +178,35 @@ void TIM1_IRQHandler(void) { timer_clear_irq(1); #ifdef USING_HW_TIMER1 - rt_device_hwtimer_isr(&_timer1); + rt_clock_timer_isr(&_timer1); #endif } void TIM2_IRQHandler(void) { timer_clear_irq(2); #ifdef USING_HW_TIMER2 - rt_device_hwtimer_isr(&_timer2); + rt_clock_timer_isr(&_timer2); #endif } void TIM3_IRQHandler(void) { timer_clear_irq(3); #ifdef USING_HW_TIMER3 - rt_device_hwtimer_isr(&_timer3); + rt_clock_timer_isr(&_timer3); #endif } void TIM4_IRQHandler(void) { timer_clear_irq(4); #ifdef USING_HW_TIMER4 - rt_device_hwtimer_isr(&_timer4); + rt_clock_timer_isr(&_timer4); #endif } void TIM5_IRQHandler(void) { timer_clear_irq(5); #ifdef USING_HW_TIMER5 - rt_device_hwtimer_isr(&_timer5); + rt_clock_timer_isr(&_timer5); #endif } -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/w60x/drivers/drv_hw_timer.h b/bsp/w60x/drivers/drv_hw_timer.h index 2856b5f5e4..61caadc2c2 100644 --- a/bsp/w60x/drivers/drv_hw_timer.h +++ b/bsp/w60x/drivers/drv_hw_timer.h @@ -8,8 +8,8 @@ * 2018-11-19 fanwenl 1st version */ -#ifndef __DRV_HWTIMER_H__ -#define __DRV_HWTIMER_H__ +#ifndef __DRV_CLOCK_TIMER_H__ +#define __DRV_CLOCK_TIMER_H__ int wm_hw_timer_init(void); diff --git a/bsp/w60x/project.ewp b/bsp/w60x/project.ewp index 01ab9f59a7..b86d2ce4c2 100644 --- a/bsp/w60x/project.ewp +++ b/bsp/w60x/project.ewp @@ -2194,7 +2194,7 @@ $PROJ_DIR$\..\..\components\drivers\hwcrypto\hwcrypto.c - $PROJ_DIR$\..\..\components\drivers\hwtimer\hwtimer.c + $PROJ_DIR$\..\..\components\drivers\clock_time\clock_timer.c $PROJ_DIR$\..\..\components\drivers\i2c\dev_i2c_bit_ops.c diff --git a/bsp/w60x/project.uvprojx b/bsp/w60x/project.uvprojx index 3bbf457034..4dff2a774b 100644 --- a/bsp/w60x/project.uvprojx +++ b/bsp/w60x/project.uvprojx @@ -582,9 +582,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\components\drivers\hwtimer\hwtimer.c + ..\..\components\drivers\clock_time\clock_timer.c diff --git a/bsp/wch/arm/Libraries/ch32_drivers/SConscript b/bsp/wch/arm/Libraries/ch32_drivers/SConscript index bb4def6cab..fdc304accc 100644 --- a/bsp/wch/arm/Libraries/ch32_drivers/SConscript +++ b/bsp/wch/arm/Libraries/ch32_drivers/SConscript @@ -29,8 +29,8 @@ if GetDepend('SOC_ARM_SERIES_CH32F103'): if GetDepend(['RT_USING_WDT', 'BSP_USING_IWDT']): src += ['drv_iwdt_ch32f10x.c'] - if GetDepend(['RT_USING_HWTIMER', 'BSP_USING_HWTIMER']): - src += ['drv_hwtimer_ch32f10x.c'] + if GetDepend(['RT_USING_CLOCK_TIME', 'BSP_USING_CLOCK_TIMER']): + src += ['drv_timer_ch32f10x.c'] if GetDepend(['RT_USING_PWM', 'BSP_USING_PWM']): src += ['drv_pwm_ch32f10x.c'] @@ -56,8 +56,8 @@ if GetDepend('SOC_ARM_SERIES_CH32F203'): if GetDepend(['RT_USING_WDT', 'BSP_USING_IWDT']): src += ['drv_iwdt_ch32f20x.c'] - if GetDepend(['RT_USING_HWTIMER', 'BSP_USING_HWTIMER']): - src += ['drv_hwtimer_ch32f20x.c'] + if GetDepend(['RT_USING_CLOCK_TIME', 'BSP_USING_CLOCK_TIMER']): + src += ['drv_timer_ch32f20x.c'] if GetDepend(['RT_USING_PWM', 'BSP_USING_PWM']): src += ['drv_pwm_ch32f20x.c'] diff --git a/bsp/wch/arm/Libraries/ch32_drivers/drv_hwtimer_ch32f10x.c b/bsp/wch/arm/Libraries/ch32_drivers/drv_timer_ch32f10x.c similarity index 36% rename from bsp/wch/arm/Libraries/ch32_drivers/drv_hwtimer_ch32f10x.c rename to bsp/wch/arm/Libraries/ch32_drivers/drv_timer_ch32f10x.c index 13ffe679d5..8e88b60fd1 100644 --- a/bsp/wch/arm/Libraries/ch32_drivers/drv_hwtimer_ch32f10x.c +++ b/bsp/wch/arm/Libraries/ch32_drivers/drv_timer_ch32f10x.c @@ -12,55 +12,55 @@ #include #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include -struct hwtimer_device +struct clock_timer_device { - struct rt_hwtimer_device parent; + struct rt_clock_timer_device parent; TIM_TypeDef *periph; IRQn_Type irqn; char *name; }; -#ifdef BSP_USING_TIM1_HWTIMER -struct hwtimer_device hwtimer_device1 = +#ifdef BSP_USING_TIM1_CLOCK_TIMER +struct clock_timer_device clock_timer_device1 = { .periph = TIM1, .irqn = TIM1_UP_IRQn, .name = "timer1"}; #endif -#ifdef BSP_USING_TIM2_HWTIMER -struct hwtimer_device hwtimer_device2 = +#ifdef BSP_USING_TIM2_CLOCK_TIMER +struct clock_timer_device clock_timer_device2 = { .periph = TIM2, .irqn = TIM2_IRQn, .name = "timer2"}; #endif -#ifdef BSP_USING_TIM3_HWTIMER -struct hwtimer_device hwtimer_device3 = +#ifdef BSP_USING_TIM3_CLOCK_TIMER +struct clock_timer_device clock_timer_device3 = { .periph = TIM3, .irqn = TIM3_IRQn, .name = "timer3"}; #endif -#ifdef BSP_USING_TIM4_HWTIMER -struct hwtimer_device hwtimer_device4 = +#ifdef BSP_USING_TIM4_CLOCK_TIMER +struct clock_timer_device clock_timer_device4 = { .periph = TIM4, .irqn = TIM4_IRQn, .name = "timer4"}; #endif -static void ch32f1_hwtimer_init(struct rt_hwtimer_device *device, rt_uint32_t state) +static void ch32f1_clock_timer_init(struct rt_clock_timer_device *device, rt_uint32_t state) { - struct hwtimer_device *hwtimer_dev; - struct rt_hwtimer_info *hwtimer_info; + struct clock_timer_device *clock_timer_dev; + struct rt_clock_timer_info *clock_timer_info; rt_uint32_t clk = 0; rt_uint16_t prescaler_value = 0; @@ -69,34 +69,34 @@ static void ch32f1_hwtimer_init(struct rt_hwtimer_device *device, rt_uint32_t st RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; if (state) { - ch32f1_tim_clock_init(hwtimer_dev->periph); + ch32f1_tim_clock_init(clock_timer_dev->periph); - hwtimer_info = ch32f1_hwtimer_info_config_get(hwtimer_dev->periph); + clock_timer_info = ch32f1_clock_timer_info_config_get(clock_timer_dev->periph); - clk = ch32f1_tim_clock_get(hwtimer_dev->periph); + clk = ch32f1_tim_clock_get(clock_timer_dev->periph); - prescaler_value = (rt_uint16_t)(clk / hwtimer_info->minfreq) - 1; + prescaler_value = (rt_uint16_t)(clk / clock_timer_info->minfreq) - 1; /* * (1 / freq) = (cnt + 1) * (1 / (clk/(prescaler_value + 1) ) ) */ - TIM_TimeBaseInitType.TIM_Period = hwtimer_info->maxcnt - 1; + TIM_TimeBaseInitType.TIM_Period = clock_timer_info->maxcnt - 1; TIM_TimeBaseInitType.TIM_Prescaler = prescaler_value; TIM_TimeBaseInitType.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitType.TIM_RepetitionCounter = 0; - if (hwtimer_info == RT_NULL) + if (clock_timer_info == RT_NULL) { TIM_TimeBaseInitType.TIM_CounterMode = TIM_CounterMode_Up; } else { - if (hwtimer_info->cntmode == HWTIMER_CNTMODE_UP) + if (clock_timer_info->cntmode == CLOCK_TIMER_CNTMODE_UP) { TIM_TimeBaseInitType.TIM_CounterMode = TIM_CounterMode_Up; } @@ -106,89 +106,89 @@ static void ch32f1_hwtimer_init(struct rt_hwtimer_device *device, rt_uint32_t st } } - TIM_TimeBaseInit(hwtimer_dev->periph, &TIM_TimeBaseInitType); + TIM_TimeBaseInit(clock_timer_dev->periph, &TIM_TimeBaseInitType); - NVIC_InitStructure.NVIC_IRQChannel = hwtimer_dev->irqn; + NVIC_InitStructure.NVIC_IRQChannel = clock_timer_dev->irqn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); - TIM_ITConfig(hwtimer_dev->periph, TIM_IT_Update, ENABLE); - TIM_ClearITPendingBit(hwtimer_dev->periph, TIM_IT_Update); + TIM_ITConfig(clock_timer_dev->periph, TIM_IT_Update, ENABLE); + TIM_ClearITPendingBit(clock_timer_dev->periph, TIM_IT_Update); - LOG_D("%s init success", hwtimer_dev->name); + LOG_D("%s init success", clock_timer_dev->name); } } -static rt_err_t ch32f1_hwtimer_start(struct rt_hwtimer_device *device, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t ch32f1_clock_timer_start(struct rt_clock_timer_device *device, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; /* * (1 / freq) = (cnt + 1) * (1 / (clk/(prescaler_value + 1) ) ) */ - TIM_SetCounter(hwtimer_dev->periph, 0); - TIM_SetAutoreload(hwtimer_dev->periph, cnt - 1); + TIM_SetCounter(clock_timer_dev->periph, 0); + TIM_SetAutoreload(clock_timer_dev->periph, cnt - 1); - if (mode == HWTIMER_MODE_ONESHOT) + if (mode == CLOCK_TIMER_MODE_ONESHOT) { - TIM_SelectOnePulseMode(hwtimer_dev->periph, TIM_OPMode_Single); + TIM_SelectOnePulseMode(clock_timer_dev->periph, TIM_OPMode_Single); } else { - TIM_SelectOnePulseMode(hwtimer_dev->periph, TIM_OPMode_Repetitive); + TIM_SelectOnePulseMode(clock_timer_dev->periph, TIM_OPMode_Repetitive); } - TIM_Cmd(hwtimer_dev->periph, ENABLE); + TIM_Cmd(clock_timer_dev->periph, ENABLE); - LOG_D("%s start, cnt = %d", hwtimer_dev->name, cnt); + LOG_D("%s start, cnt = %d", clock_timer_dev->name, cnt); return RT_EOK; } -static void ch32f1_hwtimer_stop(struct rt_hwtimer_device *device) +static void ch32f1_clock_timer_stop(struct rt_clock_timer_device *device) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; - TIM_Cmd(hwtimer_dev->periph, DISABLE); + TIM_Cmd(clock_timer_dev->periph, DISABLE); - TIM_SetCounter(hwtimer_dev->periph, 0); + TIM_SetCounter(clock_timer_dev->periph, 0); } -static rt_uint32_t ch32f1_hwtimer_counter_get(struct rt_hwtimer_device *device) +static rt_uint32_t ch32f1_clock_timer_counter_get(struct rt_clock_timer_device *device) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; - return hwtimer_dev->periph->CNT; + return clock_timer_dev->periph->CNT; } -static rt_err_t ch32f1_hwtimer_control(struct rt_hwtimer_device *device, rt_uint32_t cmd, void *arg) +static rt_err_t ch32f1_clock_timer_control(struct rt_clock_timer_device *device, rt_uint32_t cmd, void *arg) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; rt_err_t result = RT_EOK; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t freq = 0; rt_uint32_t clk = 0; @@ -202,11 +202,11 @@ static rt_err_t ch32f1_hwtimer_control(struct rt_hwtimer_device *device, rt_uint freq = *((rt_uint32_t *)arg); - clk = ch32f1_tim_clock_get(hwtimer_dev->periph); + clk = ch32f1_tim_clock_get(clock_timer_dev->periph); prescaler_value = (rt_uint16_t)(clk / freq) - 1; - TIM_PrescalerConfig(hwtimer_dev->periph, prescaler_value, TIM_PSCReloadMode_Immediate); + TIM_PrescalerConfig(clock_timer_dev->periph, prescaler_value, TIM_PSCReloadMode_Immediate); } else { @@ -223,146 +223,146 @@ static rt_err_t ch32f1_hwtimer_control(struct rt_hwtimer_device *device, rt_uint return result; } -static const struct rt_hwtimer_ops hwtimer_ops = +static const struct rt_clock_timer_ops clock_timer_ops = { - .init = ch32f1_hwtimer_init, - .start = ch32f1_hwtimer_start, - .stop = ch32f1_hwtimer_stop, - .count_get = ch32f1_hwtimer_counter_get, - .control = ch32f1_hwtimer_control, + .init = ch32f1_clock_timer_init, + .start = ch32f1_clock_timer_start, + .stop = ch32f1_clock_timer_stop, + .count_get = ch32f1_clock_timer_counter_get, + .control = ch32f1_clock_timer_control, }; -static int rt_hw_hwtimer_init(void) +static int rt_hw_clock_timer_init(void) { rt_err_t ret; - struct rt_hwtimer_info *hwtimer_info; + struct rt_clock_timer_info *clock_timer_info; -#ifdef BSP_USING_TIM1_HWTIMER - hwtimer_info = ch32f1_hwtimer_info_config_get(hwtimer_device1.periph); - hwtimer_device1.parent.info = hwtimer_info; - hwtimer_device1.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device1.parent, hwtimer_device1.name, RT_NULL); +#ifdef BSP_USING_TIM1_CLOCK_TIMER + clock_timer_info = ch32f1_clock_timer_info_config_get(clock_timer_device1.periph); + clock_timer_device1.parent.info = clock_timer_info; + clock_timer_device1.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device1.parent, clock_timer_device1.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device1.name); + LOG_D("clock_timer: %s register success.", clock_timer_device1.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device1.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device1.name); } #endif -#ifdef BSP_USING_TIM2_HWTIMER - hwtimer_info = ch32f1_hwtimer_info_config_get(hwtimer_device2.periph); - hwtimer_device2.parent.info = hwtimer_info; - hwtimer_device2.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device2.parent, hwtimer_device2.name, RT_NULL); +#ifdef BSP_USING_TIM2_CLOCK_TIMER + clock_timer_info = ch32f1_clock_timer_info_config_get(clock_timer_device2.periph); + clock_timer_device2.parent.info = clock_timer_info; + clock_timer_device2.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device2.parent, clock_timer_device2.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device2.name); + LOG_D("clock_timer: %s register success.", clock_timer_device2.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device2.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device2.name); } #endif -#ifdef BSP_USING_TIM3_HWTIMER - hwtimer_info = ch32f1_hwtimer_info_config_get(hwtimer_device3.periph); - hwtimer_device3.parent.info = hwtimer_info; - hwtimer_device3.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device3.parent, hwtimer_device3.name, RT_NULL); +#ifdef BSP_USING_TIM3_CLOCK_TIMER + clock_timer_info = ch32f1_clock_timer_info_config_get(clock_timer_device3.periph); + clock_timer_device3.parent.info = clock_timer_info; + clock_timer_device3.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device3.parent, clock_timer_device3.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device3.name); + LOG_D("clock_timer: %s register success.", clock_timer_device3.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device3.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device3.name); } #endif -#ifdef BSP_USING_TIM4_HWTIMER - hwtimer_info = ch32f1_hwtimer_info_config_get(hwtimer_device4.periph); - hwtimer_device4.parent.info = hwtimer_info; - hwtimer_device4.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device4.parent, hwtimer_device4.name, RT_NULL); +#ifdef BSP_USING_TIM4_CLOCK_TIMER + clock_timer_info = ch32f1_clock_timer_info_config_get(clock_timer_device4.periph); + clock_timer_device4.parent.info = clock_timer_info; + clock_timer_device4.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device4.parent, clock_timer_device4.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device4.name); + LOG_D("clock_timer: %s register success.", clock_timer_device4.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device4.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device4.name); } #endif return RT_EOK; } -INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); -#ifdef BSP_USING_TIM1_HWTIMER +#ifdef BSP_USING_TIM1_CLOCK_TIMER void TIM1_UP_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device1.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device1.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device1.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device1.parent); + TIM_ClearITPendingBit(clock_timer_device1.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device1.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM2_HWTIMER +#ifdef BSP_USING_TIM2_CLOCK_TIMER void TIM2_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device2.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device2.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device2.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device2.parent); + TIM_ClearITPendingBit(clock_timer_device2.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device2.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM3_HWTIMER +#ifdef BSP_USING_TIM3_CLOCK_TIMER void TIM3_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device3.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device3.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device3.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device3.parent); + TIM_ClearITPendingBit(clock_timer_device3.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device3.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM4_HWTIMER +#ifdef BSP_USING_TIM4_CLOCK_TIMER void TIM4_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device4.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device4.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device4.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device4.parent); + TIM_ClearITPendingBit(clock_timer_device4.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device4.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/wch/arm/Libraries/ch32_drivers/drv_hwtimer_ch32f20x.c b/bsp/wch/arm/Libraries/ch32_drivers/drv_timer_ch32f20x.c similarity index 32% rename from bsp/wch/arm/Libraries/ch32_drivers/drv_hwtimer_ch32f20x.c rename to bsp/wch/arm/Libraries/ch32_drivers/drv_timer_ch32f20x.c index 5bb45e7b36..17c92a80e0 100644 --- a/bsp/wch/arm/Libraries/ch32_drivers/drv_hwtimer_ch32f20x.c +++ b/bsp/wch/arm/Libraries/ch32_drivers/drv_timer_ch32f20x.c @@ -12,103 +12,103 @@ #include #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER -#define LOG_TAG "drv.hwtimer" +#define LOG_TAG "drv.clock_timer" #include -struct hwtimer_device +struct clock_timer_device { - struct rt_hwtimer_device parent; + struct rt_clock_timer_device parent; TIM_TypeDef *periph; IRQn_Type irqn; char *name; }; -#ifdef BSP_USING_TIM1_HWTIMER -struct hwtimer_device hwtimer_device1 = +#ifdef BSP_USING_TIM1_CLOCK_TIMER +struct clock_timer_device clock_timer_device1 = { .periph = TIM1, .irqn = TIM1_UP_IRQn, .name = "timer1"}; #endif -#ifdef BSP_USING_TIM2_HWTIMER -struct hwtimer_device hwtimer_device2 = +#ifdef BSP_USING_TIM2_CLOCK_TIMER +struct clock_timer_device clock_timer_device2 = { .periph = TIM2, .irqn = TIM2_IRQn, .name = "timer2"}; #endif -#ifdef BSP_USING_TIM3_HWTIMER -struct hwtimer_device hwtimer_device3 = +#ifdef BSP_USING_TIM3_CLOCK_TIMER +struct clock_timer_device clock_timer_device3 = { .periph = TIM3, .irqn = TIM3_IRQn, .name = "timer3"}; #endif -#ifdef BSP_USING_TIM4_HWTIMER -struct hwtimer_device hwtimer_device4 = +#ifdef BSP_USING_TIM4_CLOCK_TIMER +struct clock_timer_device clock_timer_device4 = { .periph = TIM4, .irqn = TIM4_IRQn, .name = "timer4"}; #endif -#ifdef BSP_USING_TIM5_HWTIMER -struct hwtimer_device hwtimer_device5 = +#ifdef BSP_USING_TIM5_CLOCK_TIMER +struct clock_timer_device clock_timer_device5 = { .periph = TIM5, .irqn = TIM5_IRQn, .name = "timer5"}; #endif -#ifdef BSP_USING_TIM6_HWTIMER -struct hwtimer_device hwtimer_device6 = +#ifdef BSP_USING_TIM6_CLOCK_TIMER +struct clock_timer_device clock_timer_device6 = { .periph = TIM6, .irqn = TIM6_IRQn, .name = "timer6"}; #endif -#ifdef BSP_USING_TIM7_HWTIMER -struct hwtimer_device hwtimer_device7 = +#ifdef BSP_USING_TIM7_CLOCK_TIMER +struct clock_timer_device clock_timer_device7 = { .periph = TIM7, .irqn = TIM7_IRQn, .name = "timer7"}; #endif -#ifdef BSP_USING_TIM8_HWTIMER -struct hwtimer_device hwtimer_device8 = +#ifdef BSP_USING_TIM8_CLOCK_TIMER +struct clock_timer_device clock_timer_device8 = { .periph = TIM8, .irqn = TIM8_UP_IRQn, .name = "timer8"}; #endif -#ifdef BSP_USING_TIM9_HWTIMER -struct hwtimer_device hwtimer_device9 = +#ifdef BSP_USING_TIM9_CLOCK_TIMER +struct clock_timer_device clock_timer_device9 = { .periph = TIM9, .irqn = TIM9_UP_IRQn, .name = "timer9"}; #endif -#ifdef BSP_USING_TIM10_HWTIMER -struct hwtimer_device hwtimer_device10 = +#ifdef BSP_USING_TIM10_CLOCK_TIMER +struct clock_timer_device clock_timer_device10 = { .periph = TIM10, .irqn = TIM10_UP_IRQn, .name = "timer10"}; #endif -static void ch32f2_hwtimer_init(struct rt_hwtimer_device *device, rt_uint32_t state) +static void ch32f2_clock_timer_init(struct rt_clock_timer_device *device, rt_uint32_t state) { - struct hwtimer_device *hwtimer_dev; - struct rt_hwtimer_info *hwtimer_info; + struct clock_timer_device *clock_timer_dev; + struct rt_clock_timer_info *clock_timer_info; rt_uint32_t clk = 0; rt_uint16_t prescaler_value = 0; @@ -117,34 +117,34 @@ static void ch32f2_hwtimer_init(struct rt_hwtimer_device *device, rt_uint32_t st RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; if (state) { - ch32f2_tim_clock_init(hwtimer_dev->periph); + ch32f2_tim_clock_init(clock_timer_dev->periph); - hwtimer_info = ch32f2_hwtimer_info_config_get(hwtimer_dev->periph); + clock_timer_info = ch32f2_clock_timer_info_config_get(clock_timer_dev->periph); - clk = ch32f2_tim_clock_get(hwtimer_dev->periph); + clk = ch32f2_tim_clock_get(clock_timer_dev->periph); - prescaler_value = (rt_uint16_t)(clk / hwtimer_info->minfreq) - 1; + prescaler_value = (rt_uint16_t)(clk / clock_timer_info->minfreq) - 1; /* * (1 / freq) = (cnt + 1) * (1 / (clk/(prescaler_value + 1) ) ) */ - TIM_TimeBaseInitType.TIM_Period = hwtimer_info->maxcnt - 1; + TIM_TimeBaseInitType.TIM_Period = clock_timer_info->maxcnt - 1; TIM_TimeBaseInitType.TIM_Prescaler = prescaler_value; TIM_TimeBaseInitType.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitType.TIM_RepetitionCounter = 0; - if (hwtimer_info == RT_NULL) + if (clock_timer_info == RT_NULL) { TIM_TimeBaseInitType.TIM_CounterMode = TIM_CounterMode_Up; } else { - if (hwtimer_info->cntmode == HWTIMER_CNTMODE_UP) + if (clock_timer_info->cntmode == CLOCK_TIMER_CNTMODE_UP) { TIM_TimeBaseInitType.TIM_CounterMode = TIM_CounterMode_Up; } @@ -154,89 +154,89 @@ static void ch32f2_hwtimer_init(struct rt_hwtimer_device *device, rt_uint32_t st } } - TIM_TimeBaseInit(hwtimer_dev->periph, &TIM_TimeBaseInitType); + TIM_TimeBaseInit(clock_timer_dev->periph, &TIM_TimeBaseInitType); - NVIC_InitStructure.NVIC_IRQChannel = hwtimer_dev->irqn; + NVIC_InitStructure.NVIC_IRQChannel = clock_timer_dev->irqn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); - TIM_ITConfig(hwtimer_dev->periph, TIM_IT_Update, ENABLE); - TIM_ClearITPendingBit(hwtimer_dev->periph, TIM_IT_Update); + TIM_ITConfig(clock_timer_dev->periph, TIM_IT_Update, ENABLE); + TIM_ClearITPendingBit(clock_timer_dev->periph, TIM_IT_Update); - LOG_D("%s init success", hwtimer_dev->name); + LOG_D("%s init success", clock_timer_dev->name); } } -static rt_err_t ch32f2_hwtimer_start(struct rt_hwtimer_device *device, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t ch32f2_clock_timer_start(struct rt_clock_timer_device *device, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; /* * (1 / freq) = (cnt + 1) * (1 / (clk/(prescaler_value + 1) ) ) */ - TIM_SetCounter(hwtimer_dev->periph, 0); - TIM_SetAutoreload(hwtimer_dev->periph, cnt - 1); + TIM_SetCounter(clock_timer_dev->periph, 0); + TIM_SetAutoreload(clock_timer_dev->periph, cnt - 1); - if (mode == HWTIMER_MODE_ONESHOT) + if (mode == CLOCK_TIMER_MODE_ONESHOT) { - TIM_SelectOnePulseMode(hwtimer_dev->periph, TIM_OPMode_Single); + TIM_SelectOnePulseMode(clock_timer_dev->periph, TIM_OPMode_Single); } else { - TIM_SelectOnePulseMode(hwtimer_dev->periph, TIM_OPMode_Repetitive); + TIM_SelectOnePulseMode(clock_timer_dev->periph, TIM_OPMode_Repetitive); } - TIM_Cmd(hwtimer_dev->periph, ENABLE); + TIM_Cmd(clock_timer_dev->periph, ENABLE); - LOG_D("%s start, cnt = %d", hwtimer_dev->name, cnt); + LOG_D("%s start, cnt = %d", clock_timer_dev->name, cnt); return RT_EOK; } -static void ch32f2_hwtimer_stop(struct rt_hwtimer_device *device) +static void ch32f2_clock_timer_stop(struct rt_clock_timer_device *device) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; - TIM_Cmd(hwtimer_dev->periph, DISABLE); + TIM_Cmd(clock_timer_dev->periph, DISABLE); - TIM_SetCounter(hwtimer_dev->periph, 0); + TIM_SetCounter(clock_timer_dev->periph, 0); } -static rt_uint32_t ch32f2_hwtimer_counter_get(struct rt_hwtimer_device *device) +static rt_uint32_t ch32f2_clock_timer_counter_get(struct rt_clock_timer_device *device) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; - return hwtimer_dev->periph->CNT; + return clock_timer_dev->periph->CNT; } -static rt_err_t ch32f2_hwtimer_control(struct rt_hwtimer_device *device, rt_uint32_t cmd, void *arg) +static rt_err_t ch32f2_clock_timer_control(struct rt_clock_timer_device *device, rt_uint32_t cmd, void *arg) { - struct hwtimer_device *hwtimer_dev; + struct clock_timer_device *clock_timer_dev; rt_err_t result = RT_EOK; RT_ASSERT(device != RT_NULL); - hwtimer_dev = (struct hwtimer_device *)device; + clock_timer_dev = (struct clock_timer_device *)device; switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t freq = 0; rt_uint32_t clk = 0; @@ -250,11 +250,11 @@ static rt_err_t ch32f2_hwtimer_control(struct rt_hwtimer_device *device, rt_uint freq = *((rt_uint32_t *)arg); - clk = ch32f2_tim_clock_get(hwtimer_dev->periph); + clk = ch32f2_tim_clock_get(clock_timer_dev->periph); prescaler_value = (rt_uint16_t)(clk / freq) - 1; - TIM_PrescalerConfig(hwtimer_dev->periph, prescaler_value, TIM_PSCReloadMode_Immediate); + TIM_PrescalerConfig(clock_timer_dev->periph, prescaler_value, TIM_PSCReloadMode_Immediate); } else { @@ -271,332 +271,332 @@ static rt_err_t ch32f2_hwtimer_control(struct rt_hwtimer_device *device, rt_uint return result; } -static const struct rt_hwtimer_ops hwtimer_ops = +static const struct rt_clock_timer_ops clock_timer_ops = { - .init = ch32f2_hwtimer_init, - .start = ch32f2_hwtimer_start, - .stop = ch32f2_hwtimer_stop, - .count_get = ch32f2_hwtimer_counter_get, - .control = ch32f2_hwtimer_control, + .init = ch32f2_clock_timer_init, + .start = ch32f2_clock_timer_start, + .stop = ch32f2_clock_timer_stop, + .count_get = ch32f2_clock_timer_counter_get, + .control = ch32f2_clock_timer_control, }; -static int rt_hw_hwtimer_init(void) +static int rt_hw_clock_timer_init(void) { rt_err_t ret; - struct rt_hwtimer_info *hwtimer_info; + struct rt_clock_timer_info *clock_timer_info; -#ifdef BSP_USING_TIM1_HWTIMER - hwtimer_info = ch32f2_hwtimer_info_config_get(hwtimer_device1.periph); - hwtimer_device1.parent.info = hwtimer_info; - hwtimer_device1.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device1.parent, hwtimer_device1.name, RT_NULL); +#ifdef BSP_USING_TIM1_CLOCK_TIMER + clock_timer_info = ch32f2_clock_timer_info_config_get(clock_timer_device1.periph); + clock_timer_device1.parent.info = clock_timer_info; + clock_timer_device1.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device1.parent, clock_timer_device1.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device1.name); + LOG_D("clock_timer: %s register success.", clock_timer_device1.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device1.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device1.name); } #endif -#ifdef BSP_USING_TIM2_HWTIMER - hwtimer_info = ch32f2_hwtimer_info_config_get(hwtimer_device2.periph); - hwtimer_device2.parent.info = hwtimer_info; - hwtimer_device2.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device2.parent, hwtimer_device2.name, RT_NULL); +#ifdef BSP_USING_TIM2_CLOCK_TIMER + clock_timer_info = ch32f2_clock_timer_info_config_get(clock_timer_device2.periph); + clock_timer_device2.parent.info = clock_timer_info; + clock_timer_device2.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device2.parent, clock_timer_device2.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device2.name); + LOG_D("clock_timer: %s register success.", clock_timer_device2.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device2.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device2.name); } #endif -#ifdef BSP_USING_TIM3_HWTIMER - hwtimer_info = ch32f2_hwtimer_info_config_get(hwtimer_device3.periph); - hwtimer_device3.parent.info = hwtimer_info; - hwtimer_device3.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device3.parent, hwtimer_device3.name, RT_NULL); +#ifdef BSP_USING_TIM3_CLOCK_TIMER + clock_timer_info = ch32f2_clock_timer_info_config_get(clock_timer_device3.periph); + clock_timer_device3.parent.info = clock_timer_info; + clock_timer_device3.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device3.parent, clock_timer_device3.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device3.name); + LOG_D("clock_timer: %s register success.", clock_timer_device3.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device3.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device3.name); } #endif -#ifdef BSP_USING_TIM4_HWTIMER - hwtimer_info = ch32f2_hwtimer_info_config_get(hwtimer_device4.periph); - hwtimer_device4.parent.info = hwtimer_info; - hwtimer_device4.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device4.parent, hwtimer_device4.name, RT_NULL); +#ifdef BSP_USING_TIM4_CLOCK_TIMER + clock_timer_info = ch32f2_clock_timer_info_config_get(clock_timer_device4.periph); + clock_timer_device4.parent.info = clock_timer_info; + clock_timer_device4.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device4.parent, clock_timer_device4.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device4.name); + LOG_D("clock_timer: %s register success.", clock_timer_device4.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device4.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device4.name); } #endif -#ifdef BSP_USING_TIM5_HWTIMER - hwtimer_info = ch32f2_hwtimer_info_config_get(hwtimer_device5.periph); - hwtimer_device5.parent.info = hwtimer_info; - hwtimer_device5.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device5.parent, hwtimer_device5.name, RT_NULL); +#ifdef BSP_USING_TIM5_CLOCK_TIMER + clock_timer_info = ch32f2_clock_timer_info_config_get(clock_timer_device5.periph); + clock_timer_device5.parent.info = clock_timer_info; + clock_timer_device5.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device5.parent, clock_timer_device5.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device5.name); + LOG_D("clock_timer: %s register success.", clock_timer_device5.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device5.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device5.name); } #endif -#ifdef BSP_USING_TIM6_HWTIMER - hwtimer_info = ch32f2_hwtimer_info_config_get(hwtimer_device6.periph); - hwtimer_device6.parent.info = hwtimer_info; - hwtimer_device6.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device6.parent, hwtimer_device6.name, RT_NULL); +#ifdef BSP_USING_TIM6_CLOCK_TIMER + clock_timer_info = ch32f2_clock_timer_info_config_get(clock_timer_device6.periph); + clock_timer_device6.parent.info = clock_timer_info; + clock_timer_device6.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device6.parent, clock_timer_device6.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device6.name); + LOG_D("clock_timer: %s register success.", clock_timer_device6.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device6.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device6.name); } #endif -#ifdef BSP_USING_TIM7_HWTIMER - hwtimer_info = ch32f2_hwtimer_info_config_get(hwtimer_device7.periph); - hwtimer_device7.parent.info = hwtimer_info; - hwtimer_device7.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device7.parent, hwtimer_device7.name, RT_NULL); +#ifdef BSP_USING_TIM7_CLOCK_TIMER + clock_timer_info = ch32f2_clock_timer_info_config_get(clock_timer_device7.periph); + clock_timer_device7.parent.info = clock_timer_info; + clock_timer_device7.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device7.parent, clock_timer_device7.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device7.name); + LOG_D("clock_timer: %s register success.", clock_timer_device7.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device7.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device7.name); } #endif -#ifdef BSP_USING_TIM8_HWTIMER - hwtimer_info = ch32f2_hwtimer_info_config_get(hwtimer_device8.periph); - hwtimer_device8.parent.info = hwtimer_info; - hwtimer_device8.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device8.parent, hwtimer_device8.name, RT_NULL); +#ifdef BSP_USING_TIM8_CLOCK_TIMER + clock_timer_info = ch32f2_clock_timer_info_config_get(clock_timer_device8.periph); + clock_timer_device8.parent.info = clock_timer_info; + clock_timer_device8.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device8.parent, clock_timer_device8.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device8.name); + LOG_D("clock_timer: %s register success.", clock_timer_device8.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device8.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device8.name); } #endif -#ifdef BSP_USING_TIM9_HWTIMER - hwtimer_info = ch32f2_hwtimer_info_config_get(hwtimer_device9.periph); - hwtimer_device9.parent.info = hwtimer_info; - hwtimer_device9.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device9.parent, hwtimer_device9.name, RT_NULL); +#ifdef BSP_USING_TIM9_CLOCK_TIMER + clock_timer_info = ch32f2_clock_timer_info_config_get(clock_timer_device9.periph); + clock_timer_device9.parent.info = clock_timer_info; + clock_timer_device9.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device9.parent, clock_timer_device9.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device9.name); + LOG_D("clock_timer: %s register success.", clock_timer_device9.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device9.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device9.name); } #endif -#ifdef BSP_USING_TIM10_HWTIMER - hwtimer_info = ch32f2_hwtimer_info_config_get(hwtimer_device10.periph); - hwtimer_device10.parent.info = hwtimer_info; - hwtimer_device10.parent.ops = &hwtimer_ops; - ret = rt_device_hwtimer_register(&hwtimer_device10.parent, hwtimer_device10.name, RT_NULL); +#ifdef BSP_USING_TIM10_CLOCK_TIMER + clock_timer_info = ch32f2_clock_timer_info_config_get(clock_timer_device10.periph); + clock_timer_device10.parent.info = clock_timer_info; + clock_timer_device10.parent.ops = &clock_timer_ops; + ret = rt_clock_timer_register(&clock_timer_device10.parent, clock_timer_device10.name, RT_NULL); if (ret == RT_EOK) { - LOG_D("hwtimer: %s register success.", hwtimer_device10.name); + LOG_D("clock_timer: %s register success.", clock_timer_device10.name); } else { - LOG_D("hwtimer: %s register failed.", hwtimer_device10.name); + LOG_D("clock_timer: %s register failed.", clock_timer_device10.name); } #endif return RT_EOK; } -INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); -#ifdef BSP_USING_TIM1_HWTIMER +#ifdef BSP_USING_TIM1_CLOCK_TIMER void TIM1_UP_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device1.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device1.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device1.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device1.parent); + TIM_ClearITPendingBit(clock_timer_device1.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device1.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM2_HWTIMER +#ifdef BSP_USING_TIM2_CLOCK_TIMER void TIM2_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device2.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device2.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device2.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device2.parent); + TIM_ClearITPendingBit(clock_timer_device2.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device2.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM3_HWTIMER +#ifdef BSP_USING_TIM3_CLOCK_TIMER void TIM3_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device3.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device3.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device3.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device3.parent); + TIM_ClearITPendingBit(clock_timer_device3.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device3.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM4_HWTIMER +#ifdef BSP_USING_TIM4_CLOCK_TIMER void TIM4_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device4.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device4.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device4.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device4.parent); + TIM_ClearITPendingBit(clock_timer_device4.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device4.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM5_HWTIMER +#ifdef BSP_USING_TIM5_CLOCK_TIMER void TIM5_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device5.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device5.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device5.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device5.parent); + TIM_ClearITPendingBit(clock_timer_device5.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device5.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM6_HWTIMER +#ifdef BSP_USING_TIM6_CLOCK_TIMER void TIM6_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device6.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device6.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device6.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device6.parent); + TIM_ClearITPendingBit(clock_timer_device6.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device6.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM7_HWTIMER +#ifdef BSP_USING_TIM7_CLOCK_TIMER void TIM7_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device7.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device7.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device7.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device7.parent); + TIM_ClearITPendingBit(clock_timer_device7.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device7.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM8_HWTIMER +#ifdef BSP_USING_TIM8_CLOCK_TIMER void TIM8_UP_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device8.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device8.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device8.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device8.parent); + TIM_ClearITPendingBit(clock_timer_device8.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device8.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM9_HWTIMER +#ifdef BSP_USING_TIM9_CLOCK_TIMER void TIM9_UP_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device9.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device9.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device9.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device9.parent); + TIM_ClearITPendingBit(clock_timer_device9.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device9.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#ifdef BSP_USING_TIM10_HWTIMER +#ifdef BSP_USING_TIM10_CLOCK_TIMER void TIM10_UP_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); - if (TIM_GetITStatus(hwtimer_device10.periph, TIM_IT_Update) == SET) + if (TIM_GetITStatus(clock_timer_device10.periph, TIM_IT_Update) == SET) { - TIM_ClearITPendingBit(hwtimer_device10.periph, TIM_IT_Update); - rt_device_hwtimer_isr(&hwtimer_device10.parent); + TIM_ClearITPendingBit(clock_timer_device10.periph, TIM_IT_Update); + rt_clock_timer_isr(&clock_timer_device10.parent); } /* leave interrupt */ rt_interrupt_leave(); } #endif -#endif /* BSP_USING_HWTIMER */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/wch/arm/ch32f103c8-core/board/Kconfig b/bsp/wch/arm/ch32f103c8-core/board/Kconfig index beac3e7972..1f2345562f 100644 --- a/bsp/wch/arm/ch32f103c8-core/board/Kconfig +++ b/bsp/wch/arm/ch32f103c8-core/board/Kconfig @@ -85,9 +85,9 @@ config BSP_USING_TIM default n if BSP_USING_TIM - config BSP_USING_HWTIMER + config BSP_USING_CLOCK_TIMER bool - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n config BSP_USING_PWM @@ -101,12 +101,12 @@ config BSP_USING_TIM if BSP_USING_TIM1 choice - prompt "using TIM1 as hwtimer or PWM mode" - default BSP_USING_TIM1_HWTIMER + prompt "using TIM1 as clock_timer or PWM mode" + default BSP_USING_TIM1_CLOCK_TIMER - config BSP_USING_TIM1_HWTIMER - bool "using TIM1 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM1_CLOCK_TIMER + bool "using TIM1 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM1_PWM bool "using TIM1 as PWM mode" @@ -139,12 +139,12 @@ config BSP_USING_TIM if BSP_USING_TIM2 choice - prompt "using TIM2 as hwtimer or PWM mode" - default BSP_USING_TIM2_HWTIMER + prompt "using TIM2 as clock_timer or PWM mode" + default BSP_USING_TIM2_CLOCK_TIMER - config BSP_USING_TIM2_HWTIMER - bool "using TIM2 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM2_CLOCK_TIMER + bool "using TIM2 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM2_PWM bool "using TIM2 as PWM mode" @@ -177,12 +177,12 @@ config BSP_USING_TIM if BSP_USING_TIM3 choice - prompt "using TIM3 as hwtimer or PWM mode" - default BSP_USING_TIM3_HWTIMER + prompt "using TIM3 as clock_timer or PWM mode" + default BSP_USING_TIM3_CLOCK_TIMER - config BSP_USING_TIM3_HWTIMER - bool "using TIM3 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM3_CLOCK_TIMER + bool "using TIM3 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM3_PWM bool "using TIM3 as PWM mode" @@ -215,12 +215,12 @@ config BSP_USING_TIM if BSP_USING_TIM4 choice - prompt "using TIM4 as hwtimer or PWM mode" - default BSP_USING_TIM4_HWTIMER + prompt "using TIM4 as clock_timer or PWM mode" + default BSP_USING_TIM4_CLOCK_TIMER - config BSP_USING_TIM4_HWTIMER - bool "using TIM4 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM4_CLOCK_TIMER + bool "using TIM4 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM4_PWM bool "using TIM4 as PWM mode" diff --git a/bsp/wch/arm/ch32f103c8-core/board/board.c b/bsp/wch/arm/ch32f103c8-core/board/board.c index f1d3773fa6..e2a06a3a37 100644 --- a/bsp/wch/arm/ch32f103c8-core/board/board.c +++ b/bsp/wch/arm/ch32f103c8-core/board/board.c @@ -234,61 +234,61 @@ rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx) return RCC_Clocks.HCLK_Frequency; } -struct rt_hwtimer_info hwtimer_info1 = +struct rt_clock_timer_info clock_timer_info1 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info2 = +struct rt_clock_timer_info clock_timer_info2 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info3 = +struct rt_clock_timer_info clock_timer_info3 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info4 = +struct rt_clock_timer_info clock_timer_info4 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info *ch32f1_hwtimer_info_config_get(TIM_TypeDef *timx) +struct rt_clock_timer_info *ch32f1_clock_timer_info_config_get(TIM_TypeDef *timx) { - struct rt_hwtimer_info *info = RT_NULL; + struct rt_clock_timer_info *info = RT_NULL; if (timx == TIM1) { - info = &hwtimer_info1; + info = &clock_timer_info1; } else if (timx == TIM2) { - info = &hwtimer_info2; + info = &clock_timer_info2; } else if (timx == TIM3) { - info = &hwtimer_info3; + info = &clock_timer_info3; } else if (timx == TIM4) { - info = &hwtimer_info4; + info = &clock_timer_info4; } return info; diff --git a/bsp/wch/arm/ch32f103c8-core/board/board.h b/bsp/wch/arm/ch32f103c8-core/board/board.h index f4073203a7..433895224a 100644 --- a/bsp/wch/arm/ch32f103c8-core/board/board.h +++ b/bsp/wch/arm/ch32f103c8-core/board/board.h @@ -64,8 +64,8 @@ void ch32f1_i2c_config(I2C_TypeDef* i2cx); void ch32f1_tim_clock_init(TIM_TypeDef *timx); rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx); -#ifdef BSP_USING_HWTIMER -struct rt_hwtimer_info* ch32f1_hwtimer_info_config_get(TIM_TypeDef *timx); +#ifdef BSP_USING_CLOCK_TIMER +struct rt_clock_timer_info* ch32f1_clock_timer_info_config_get(TIM_TypeDef *timx); #endif #ifdef BSP_USING_PWM diff --git a/bsp/wch/arm/ch32f10x_port_cn.md b/bsp/wch/arm/ch32f10x_port_cn.md index ff0f3d9313..577d59d10e 100644 --- a/bsp/wch/arm/ch32f10x_port_cn.md +++ b/bsp/wch/arm/ch32f10x_port_cn.md @@ -49,19 +49,19 @@ void ch32f1_i2c_config(I2C_TypeDef* i2cx); + BSP_USING_RTC + BSP_USING_RTC_LSI + LSI_VALUE -+ HWTIMER 1/2/3/4 - + RT_USING_HWTIMER - + BSP_USING_HWTIMER - + BSP_USING_TIM1_HWTIMER - + BSP_USING_TIM2_HWTIMER - + BSP_USING_TIM3_HWTIMER - + BSP_USING_TIM4_HWTIMER ++ CLOCK_TIMER 1/2/3/4 + + RT_USING_CLOCK_TIME + + BSP_USING_CLOCK_TIMER + + BSP_USING_TIM1_CLOCK_TIMER + + BSP_USING_TIM2_CLOCK_TIMER + + BSP_USING_TIM3_CLOCK_TIMER + + BSP_USING_TIM4_CLOCK_TIMER ~~~c void ch32f1_tim_clock_init(TIM_TypeDef *timx); rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx); ~~~ ~~~c -struct rt_hwtimer_info* ch32f1_hwtimer_info_config_get(TIM_TypeDef *timx); +struct rt_clock_timer_info* ch32f1_clock_timer_info_config_get(TIM_TypeDef *timx); ~~~ + PWM 4(timer) x 4 (channel) + RT_USING_PWM @@ -189,8 +189,8 @@ void ch32f1_usart_clock_and_io_init(USART_TypeDef* usartx); void ch32f1_tim_clock_init(TIM_TypeDef *timx); rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx); -#ifdef BSP_USING_HWTIMER -struct rt_hwtimer_info* ch32f1_hwtimer_info_config_get(TIM_TypeDef *timx); +#ifdef BSP_USING_CLOCK_TIMER +struct rt_clock_timer_info* ch32f1_clock_timer_info_config_get(TIM_TypeDef *timx); #endif #ifdef BSP_USING_PWM diff --git a/bsp/wch/arm/ch32f203r-evt/README.md b/bsp/wch/arm/ch32f203r-evt/README.md index 7e2cd04716..af53579eb6 100644 --- a/bsp/wch/arm/ch32f203r-evt/README.md +++ b/bsp/wch/arm/ch32f203r-evt/README.md @@ -31,7 +31,7 @@ | SPI | 支持 | SPI 1~3 | | WDT | 支持 | IWDG | | RTC | 支持 | 外部或内部低速晶振 | -| HWTIMER | 支持 |定时器 1~10 | +| CLOCK_TIMER | 支持 |定时器 1~10 | | PWM | 支持 |定时器 1~5, 8~10(每个定时器包括4个通道) | diff --git a/bsp/wch/arm/ch32f203r-evt/board/Kconfig b/bsp/wch/arm/ch32f203r-evt/board/Kconfig index 74ef7c3dcf..d83f9257b8 100644 --- a/bsp/wch/arm/ch32f203r-evt/board/Kconfig +++ b/bsp/wch/arm/ch32f203r-evt/board/Kconfig @@ -109,9 +109,9 @@ config BSP_USING_TIM default n if BSP_USING_TIM - config BSP_USING_HWTIMER + config BSP_USING_CLOCK_TIMER bool - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n config BSP_USING_PWM @@ -125,12 +125,12 @@ config BSP_USING_TIM if BSP_USING_TIM1 choice - prompt "using TIM1 as hwtimer or PWM mode" - default BSP_USING_TIM1_HWTIMER + prompt "using TIM1 as clock_timer or PWM mode" + default BSP_USING_TIM1_CLOCK_TIMER - config BSP_USING_TIM1_HWTIMER - bool "using TIM1 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM1_CLOCK_TIMER + bool "using TIM1 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM1_PWM bool "using TIM1 as PWM mode" @@ -163,12 +163,12 @@ config BSP_USING_TIM if BSP_USING_TIM2 choice - prompt "using TIM2 as hwtimer or PWM mode" - default BSP_USING_TIM2_HWTIMER + prompt "using TIM2 as clock_timer or PWM mode" + default BSP_USING_TIM2_CLOCK_TIMER - config BSP_USING_TIM2_HWTIMER - bool "using TIM2 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM2_CLOCK_TIMER + bool "using TIM2 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM2_PWM bool "using TIM2 as PWM mode" @@ -201,12 +201,12 @@ config BSP_USING_TIM if BSP_USING_TIM3 choice - prompt "using TIM3 as hwtimer or PWM mode" - default BSP_USING_TIM3_HWTIMER + prompt "using TIM3 as clock_timer or PWM mode" + default BSP_USING_TIM3_CLOCK_TIMER - config BSP_USING_TIM3_HWTIMER - bool "using TIM3 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM3_CLOCK_TIMER + bool "using TIM3 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM3_PWM bool "using TIM3 as PWM mode" @@ -239,12 +239,12 @@ config BSP_USING_TIM if BSP_USING_TIM4 choice - prompt "using TIM4 as hwtimer or PWM mode" - default BSP_USING_TIM4_HWTIMER + prompt "using TIM4 as clock_timer or PWM mode" + default BSP_USING_TIM4_CLOCK_TIMER - config BSP_USING_TIM4_HWTIMER - bool "using TIM4 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM4_CLOCK_TIMER + bool "using TIM4 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM4_PWM bool "using TIM4 as PWM mode" @@ -277,12 +277,12 @@ config BSP_USING_TIM if BSP_USING_TIM4 choice - prompt "using TIM5 as hwtimer or PWM mode" - default BSP_USING_TIM5_HWTIMER + prompt "using TIM5 as clock_timer or PWM mode" + default BSP_USING_TIM5_CLOCK_TIMER - config BSP_USING_TIM5_HWTIMER - bool "using TIM5 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM5_CLOCK_TIMER + bool "using TIM5 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM5_PWM bool "using TIM5 as PWM mode" @@ -315,9 +315,9 @@ config BSP_USING_TIM if BSP_USING_TIM6 - config BSP_USING_TIM6_HWTIMER - bool "using TIM6 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM6_CLOCK_TIMER + bool "using TIM6 as clock_timer mode" + select BSP_USING_CLOCK_TIMER endif @@ -327,9 +327,9 @@ config BSP_USING_TIM if BSP_USING_TIM7 - config BSP_USING_TIM7_HWTIMER - bool "using TIM7 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM7_CLOCK_TIMER + bool "using TIM7 as clock_timer mode" + select BSP_USING_CLOCK_TIMER endif @@ -339,12 +339,12 @@ config BSP_USING_TIM if BSP_USING_TIM8 choice - prompt "using TIM8 as hwtimer or PWM mode" - default BSP_USING_TIM8_HWTIMER + prompt "using TIM8 as clock_timer or PWM mode" + default BSP_USING_TIM8_CLOCK_TIMER - config BSP_USING_TIM8_HWTIMER - bool "using TIM8 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM8_CLOCK_TIMER + bool "using TIM8 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM8_PWM bool "using TIM8 as PWM mode" @@ -377,12 +377,12 @@ config BSP_USING_TIM if BSP_USING_TIM9 choice - prompt "using TIM9 as hwtimer or PWM mode" - default BSP_USING_TIM9_HWTIMER + prompt "using TIM9 as clock_timer or PWM mode" + default BSP_USING_TIM9_CLOCK_TIMER - config BSP_USING_TIM9_HWTIMER - bool "using TIM9 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM9_CLOCK_TIMER + bool "using TIM9 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM9_PWM bool "using TIM9 as PWM mode" @@ -415,12 +415,12 @@ config BSP_USING_TIM if BSP_USING_TIM10 choice - prompt "using TIM10 as hwtimer or PWM mode" - default BSP_USING_TIM10_HWTIMER + prompt "using TIM10 as clock_timer or PWM mode" + default BSP_USING_TIM10_CLOCK_TIMER - config BSP_USING_TIM10_HWTIMER - bool "using TIM10 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM10_CLOCK_TIMER + bool "using TIM10 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM10_PWM bool "using TIM10 as PWM mode" diff --git a/bsp/wch/arm/ch32f203r-evt/board/board.c b/bsp/wch/arm/ch32f203r-evt/board/board.c index 50593beaeb..f9bb1ba249 100644 --- a/bsp/wch/arm/ch32f203r-evt/board/board.c +++ b/bsp/wch/arm/ch32f203r-evt/board/board.c @@ -303,7 +303,7 @@ void ch32f2_i2c_config(I2C_TypeDef *i2cx) } } -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER void ch32f2_tim_clock_init(TIM_TypeDef *timx) { if (timx == TIM1) @@ -379,143 +379,143 @@ rt_uint32_t ch32f2_tim_clock_get(TIM_TypeDef *timx) return ppre1 >= 4 ? RCC_Clocks.PCLK1_Frequency * 2 : RCC_Clocks.PCLK1_Frequency; } -struct rt_hwtimer_info hwtimer_info1 = +struct rt_clock_timer_info clock_timer_info1 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info2 = +struct rt_clock_timer_info clock_timer_info2 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info3 = +struct rt_clock_timer_info clock_timer_info3 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info4 = +struct rt_clock_timer_info clock_timer_info4 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info5 = +struct rt_clock_timer_info clock_timer_info5 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info6 = +struct rt_clock_timer_info clock_timer_info6 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info7 = +struct rt_clock_timer_info clock_timer_info7 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info8 = +struct rt_clock_timer_info clock_timer_info8 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info9 = +struct rt_clock_timer_info clock_timer_info9 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info hwtimer_info10 = +struct rt_clock_timer_info clock_timer_info10 = { .maxfreq = 1000000, .minfreq = 2000, .maxcnt = 0xFFFF, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }; -struct rt_hwtimer_info *ch32f2_hwtimer_info_config_get(TIM_TypeDef *timx) +struct rt_clock_timer_info *ch32f2_clock_timer_info_config_get(TIM_TypeDef *timx) { - struct rt_hwtimer_info *info = RT_NULL; + struct rt_clock_timer_info *info = RT_NULL; if (timx == TIM1) { - info = &hwtimer_info1; + info = &clock_timer_info1; } else if (timx == TIM2) { - info = &hwtimer_info2; + info = &clock_timer_info2; } else if (timx == TIM3) { - info = &hwtimer_info3; + info = &clock_timer_info3; } else if (timx == TIM4) { - info = &hwtimer_info4; + info = &clock_timer_info4; } else if (timx == TIM4) { - info = &hwtimer_info4; + info = &clock_timer_info4; } else if (timx == TIM5) { - info = &hwtimer_info5; + info = &clock_timer_info5; } else if (timx == TIM6) { - info = &hwtimer_info6; + info = &clock_timer_info6; } else if (timx == TIM7) { - info = &hwtimer_info7; + info = &clock_timer_info7; } else if (timx == TIM8) { - info = &hwtimer_info8; + info = &clock_timer_info8; } else if (timx == TIM9) { - info = &hwtimer_info9; + info = &clock_timer_info9; } else if (timx == TIM10) { - info = &hwtimer_info10; + info = &clock_timer_info10; } return info; diff --git a/bsp/wch/arm/ch32f203r-evt/board/board.h b/bsp/wch/arm/ch32f203r-evt/board/board.h index 6a3b8eedfb..c4ae16e4b2 100644 --- a/bsp/wch/arm/ch32f203r-evt/board/board.h +++ b/bsp/wch/arm/ch32f203r-evt/board/board.h @@ -64,8 +64,8 @@ void ch32f2_i2c_config(I2C_TypeDef* i2cx); void ch32f2_tim_clock_init(TIM_TypeDef *timx); rt_uint32_t ch32f2_tim_clock_get(TIM_TypeDef *timx); -#ifdef BSP_USING_HWTIMER -struct rt_hwtimer_info* ch32f2_hwtimer_info_config_get(TIM_TypeDef *timx); +#ifdef BSP_USING_CLOCK_TIMER +struct rt_clock_timer_info* ch32f2_clock_timer_info_config_get(TIM_TypeDef *timx); #endif #ifdef BSP_USING_PWM diff --git a/bsp/wch/arm/ch32f203r-evt/project.uvprojx b/bsp/wch/arm/ch32f203r-evt/project.uvprojx index 3c8b1d23a4..52e072f039 100644 --- a/bsp/wch/arm/ch32f203r-evt/project.uvprojx +++ b/bsp/wch/arm/ch32f203r-evt/project.uvprojx @@ -618,9 +618,9 @@ - hwtimer.c + clock_timer.c 1 - ..\..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\..\components\drivers\clock_time\clock_timer.c @@ -1036,9 +1036,9 @@ - drv_hwtimer_ch32f20x.c + drv_timer_ch32f20x.c 1 - ..\Libraries\ch32_drivers\drv_hwtimer_ch32f20x.c + ..\Libraries\ch32_drivers\drv_timer_ch32f20x.c diff --git a/bsp/wch/risc-v/Libraries/ch32_drivers/SConscript b/bsp/wch/risc-v/Libraries/ch32_drivers/SConscript index f87d0b1ea1..537dd03f72 100644 --- a/bsp/wch/risc-v/Libraries/ch32_drivers/SConscript +++ b/bsp/wch/risc-v/Libraries/ch32_drivers/SConscript @@ -51,8 +51,8 @@ if GetDepend('SOC_RISCV_FAMILY_CH32'): if GetDepend('BSP_USING_PWM'): src += ['drv_pwm.c'] - if GetDepend('BSP_USING_HWTIMER'): - src += ['drv_hwtimer.c'] + if GetDepend('BSP_USING_CLOCK_TIMER'): + src += ['drv_timer.c'] if GetDepend(['BSP_USING_ON_CHIP_FLASH']): src += ['drv_flash.c'] diff --git a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_pwm.h b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_pwm.h index ec8db3aec7..9e73e4b8b1 100644 --- a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_pwm.h +++ b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_pwm.h @@ -20,7 +20,7 @@ #include "ch32v20x_tim.h" #endif #include -#include +#include #include #define MAX_COUNTER 65535 diff --git a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_hwtimer.c b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_timer.c similarity index 76% rename from bsp/wch/risc-v/Libraries/ch32_drivers/drv_hwtimer.c rename to bsp/wch/risc-v/Libraries/ch32_drivers/drv_timer.c index c4f227156b..f58196620b 100644 --- a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_hwtimer.c +++ b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_timer.c @@ -11,15 +11,15 @@ #include #include -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER #define DBG_TAG "TIM" #define DBG_LVL DBG_LOG #include -#include "drv_hwtimer.h" +#include "drv_timer.h" #include "board.h" -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME enum { @@ -55,7 +55,7 @@ enum #endif }; -static struct ch32_hwtimer ch32_hwtimer_obj[] = +static struct ch32_clock_timer ch32_clock_timer_obj[] = { #ifdef BSP_USING_TIM1 TIM1_CONFIG, @@ -126,13 +126,13 @@ void ch32_get_pclk_doubler(rt_uint32_t *pclk1_doubler, rt_uint32_t *pclk2_double } } -static void ch32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +static void ch32_clock_timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { RT_ASSERT(timer != RT_NULL); TIM_HandleTypeDef *tim = RT_NULL; RCC_ClocksTypeDef RCC_ClockStruct; NVIC_InitTypeDef NVIC_InitStruct; - struct ch32_hwtimer *tim_device = RT_NULL; + struct ch32_clock_timer *tim_device = RT_NULL; rt_uint32_t prescaler_value = 0; rt_uint32_t pclk1_doubler, pclk2_doubler; @@ -142,7 +142,7 @@ static void ch32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t state if(state) { tim = (TIM_HandleTypeDef *)timer->parent.user_data; - tim_device = (struct ch32_hwtimer *)timer; + tim_device = (struct ch32_clock_timer *)timer; #if defined (SOC_RISCV_SERIES_CH32V2) if(tim->instance == TIM1) @@ -167,7 +167,7 @@ static void ch32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t state tim->init.TIM_Period = 10000 - 1; tim->init.TIM_RepetitionCounter = 0; - if(timer->info->cntmode == HWTIMER_CNTMODE_UP) + if(timer->info->cntmode == CLOCK_TIMER_CNTMODE_UP) { tim->init.TIM_CounterMode = TIM_CounterMode_Up; } @@ -195,7 +195,7 @@ static void ch32_hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t state } } -static rt_err_t ch32_hwtimer_start(struct rt_hwtimer_device *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t ch32_clock_timer_start(struct rt_clock_timer_device *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) { RT_ASSERT(timer != RT_NULL); TIM_HandleTypeDef *tim = RT_NULL; @@ -207,7 +207,7 @@ static rt_err_t ch32_hwtimer_start(struct rt_hwtimer_device *timer, rt_uint32_t tim->instance->ATRLR = cnt - 1; tim->init.TIM_Period = cnt - 1; - if (mode == HWTIMER_MODE_ONESHOT) + if (mode == CLOCK_TIMER_MODE_ONESHOT) { /* set timer to single mode */ tim->instance->CTLR1 &= (rt_uint16_t) ~((rt_uint16_t)TIM_OPM); @@ -225,7 +225,7 @@ static rt_err_t ch32_hwtimer_start(struct rt_hwtimer_device *timer, rt_uint32_t return RT_EOK; } -static void ch32_hwtimer_stop(struct rt_hwtimer_device *timer) +static void ch32_clock_timer_stop(struct rt_clock_timer_device *timer) { RT_ASSERT(timer != RT_NULL); TIM_HandleTypeDef *tim = RT_NULL; @@ -239,7 +239,7 @@ static void ch32_hwtimer_stop(struct rt_hwtimer_device *timer) tim->instance->CNT = 0; } -static rt_uint32_t ch32_hwtimer_count_get(struct rt_hwtimer_device *timer) +static rt_uint32_t ch32_clock_timer_count_get(struct rt_clock_timer_device *timer) { RT_ASSERT(timer != RT_NULL); TIM_HandleTypeDef *tim = RT_NULL; @@ -248,7 +248,7 @@ static rt_uint32_t ch32_hwtimer_count_get(struct rt_hwtimer_device *timer) return tim->instance->CNT; } -static rt_err_t ch32_hwtimer_control(struct rt_hwtimer_device *timer, rt_uint32_t cmd, void *args) +static rt_err_t ch32_clock_timer_control(struct rt_clock_timer_device *timer, rt_uint32_t cmd, void *args) { RT_ASSERT(timer != RT_NULL); RT_ASSERT(args != RT_NULL); @@ -261,7 +261,7 @@ static rt_err_t ch32_hwtimer_control(struct rt_hwtimer_device *timer, rt_uint32_ switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_uint32_t freq; rt_uint16_t val; @@ -297,9 +297,9 @@ static rt_err_t ch32_hwtimer_control(struct rt_hwtimer_device *timer, rt_uint32_ break; } - case HWTIMER_CTRL_MODE_SET: + case CLOCK_TIMER_CTRL_MODE_SET: { - if (*(rt_hwtimer_mode_t *)args == HWTIMER_MODE_ONESHOT) + if (*(rt_clock_timer_mode_t *)args == CLOCK_TIMER_MODE_ONESHOT) { /* set timer to single mode */ tim->instance->CTLR1 &= (rt_uint16_t) ~((rt_uint16_t)TIM_OPM); @@ -313,15 +313,15 @@ static rt_err_t ch32_hwtimer_control(struct rt_hwtimer_device *timer, rt_uint32_ break; } - case HWTIMER_CTRL_INFO_GET: + case CLOCK_TIMER_CTRL_INFO_GET: { - *(rt_hwtimer_mode_t *)args = tim->instance->CNT; + *(rt_clock_timer_mode_t *)args = tim->instance->CNT; break; } - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: { - ch32_hwtimer_stop(timer); + ch32_clock_timer_stop(timer); break; } @@ -335,26 +335,26 @@ static rt_err_t ch32_hwtimer_control(struct rt_hwtimer_device *timer, rt_uint32_ return result; } -static const struct rt_hwtimer_info ch32_hwtimer_info = TIM_DEV_INFO_CONFIG; -static const struct rt_hwtimer_ops ch32_hwtimer_ops = +static const struct rt_clock_timer_info ch32_clock_timer_info = TIM_DEV_INFO_CONFIG; +static const struct rt_clock_timer_ops ch32_clock_timer_ops = { - ch32_hwtimer_init, - ch32_hwtimer_start, - ch32_hwtimer_stop, - ch32_hwtimer_count_get, - ch32_hwtimer_control + ch32_clock_timer_init, + ch32_clock_timer_start, + ch32_clock_timer_stop, + ch32_clock_timer_count_get, + ch32_clock_timer_control }; -static void ch32_hwtimer_isr(struct rt_hwtimer_device *device) +static void ch32_clock_timer_isr(struct rt_clock_timer_device *device) { RT_ASSERT(device != RT_NULL); - struct ch32_hwtimer *hwtimer = RT_NULL; - hwtimer = rt_container_of(device, struct ch32_hwtimer, device); + struct ch32_clock_timer *clock_timer = RT_NULL; + clock_timer = rt_container_of(device, struct ch32_clock_timer, device); - if(TIM_GetITStatus(hwtimer->handle.instance, TIM_IT_Update) != RESET) + if(TIM_GetITStatus(clock_timer->handle.instance, TIM_IT_Update) != RESET) { - rt_device_hwtimer_isr(device); - TIM_ClearITPendingBit(hwtimer->handle.instance, TIM_IT_Update); + rt_clock_timer_isr(device); + TIM_ClearITPendingBit(clock_timer->handle.instance, TIM_IT_Update); } } @@ -364,7 +364,7 @@ void TIM1_UP_IRQHandler(void) { GET_INT_SP(); rt_interrupt_enter(); - ch32_hwtimer_isr(&(ch32_hwtimer_obj[TIM1_INDEX].device)); + ch32_clock_timer_isr(&(ch32_clock_timer_obj[TIM1_INDEX].device)); rt_interrupt_leave(); FREE_INT_SP(); } @@ -376,7 +376,7 @@ void TIM2_IRQHandler(void) { GET_INT_SP(); rt_interrupt_enter(); - ch32_hwtimer_isr(&(ch32_hwtimer_obj[TIM2_INDEX].device)); + ch32_clock_timer_isr(&(ch32_clock_timer_obj[TIM2_INDEX].device)); rt_interrupt_leave(); FREE_INT_SP(); } @@ -388,7 +388,7 @@ void TIM3_IRQHandler(void) { GET_INT_SP(); rt_interrupt_enter(); - ch32_hwtimer_isr(&(ch32_hwtimer_obj[TIM3_INDEX].device)); + ch32_clock_timer_isr(&(ch32_clock_timer_obj[TIM3_INDEX].device)); rt_interrupt_leave(); FREE_INT_SP(); } @@ -400,7 +400,7 @@ void TIM4_IRQHandler(void) { GET_INT_SP(); rt_interrupt_enter(); - ch32_hwtimer_isr(&(ch32_hwtimer_obj[TIM4_INDEX].device)); + ch32_clock_timer_isr(&(ch32_clock_timer_obj[TIM4_INDEX].device)); rt_interrupt_leave(); FREE_INT_SP(); } @@ -412,7 +412,7 @@ void TIM5_IRQHandler(void) { GET_INT_SP(); rt_interrupt_enter(); - ch32_hwtimer_isr(&(ch32_hwtimer_obj[TIM5_INDEX].device)); + ch32_clock_timer_isr(&(ch32_clock_timer_obj[TIM5_INDEX].device)); rt_interrupt_leave(); FREE_INT_SP(); } @@ -424,7 +424,7 @@ void TIM6_IRQHandler(void) { GET_INT_SP(); rt_interrupt_enter(); - ch32_hwtimer_isr(&(ch32_hwtimer_obj[TIM6_INDEX].device)); + ch32_clock_timer_isr(&(ch32_clock_timer_obj[TIM6_INDEX].device)); rt_interrupt_leave(); FREE_INT_SP(); } @@ -436,7 +436,7 @@ void TIM7_IRQHandler(void) { GET_INT_SP(); rt_interrupt_enter(); - ch32_hwtimer_isr(&(ch32_hwtimer_obj[TIM7_INDEX].device)); + ch32_clock_timer_isr(&(ch32_clock_timer_obj[TIM7_INDEX].device)); rt_interrupt_leave(); FREE_INT_SP(); } @@ -448,7 +448,7 @@ void TIM8_UP_IRQHandler(void) { GET_INT_SP(); rt_interrupt_enter(); - ch32_hwtimer_isr(&(ch32_hwtimer_obj[TIM8_INDEX].device)); + ch32_clock_timer_isr(&(ch32_clock_timer_obj[TIM8_INDEX].device)); rt_interrupt_leave(); FREE_INT_SP(); } @@ -460,7 +460,7 @@ void TIM9_UP_IRQHandler(void) { GET_INT_SP(); rt_interrupt_enter(); - ch32_hwtimer_isr(&(ch32_hwtimer_obj[TIM9_INDEX].device)); + ch32_clock_timer_isr(&(ch32_clock_timer_obj[TIM9_INDEX].device)); rt_interrupt_leave(); FREE_INT_SP(); } @@ -472,7 +472,7 @@ void TIM10_UP_IRQHandler(void) { GET_INT_SP(); rt_interrupt_enter(); - ch32_hwtimer_isr(&(ch32_hwtimer_obj[TIM10_INDEX].device)); + ch32_clock_timer_isr(&(ch32_clock_timer_obj[TIM10_INDEX].device)); rt_interrupt_leave(); FREE_INT_SP(); } @@ -483,12 +483,12 @@ static int rt_hw_timer_init(void) int i = 0; int result = RT_EOK; - for (i = 0; i < sizeof(ch32_hwtimer_obj) / sizeof(ch32_hwtimer_obj[0]); i++) + for (i = 0; i < sizeof(ch32_clock_timer_obj) / sizeof(ch32_clock_timer_obj[0]); i++) { - ch32_hwtimer_obj[i].device.info = &ch32_hwtimer_info; - ch32_hwtimer_obj[i].device.ops = &ch32_hwtimer_ops; - result = rt_device_hwtimer_register(&ch32_hwtimer_obj[i].device, - ch32_hwtimer_obj[i].name, (void *)&ch32_hwtimer_obj[i].handle); + ch32_clock_timer_obj[i].device.info = &ch32_clock_timer_info; + ch32_clock_timer_obj[i].device.ops = &ch32_clock_timer_ops; + result = rt_clock_timer_register(&ch32_clock_timer_obj[i].device, + ch32_clock_timer_obj[i].name, (void *)&ch32_clock_timer_obj[i].handle); RT_ASSERT(result == RT_EOK); } @@ -496,5 +496,5 @@ static int rt_hw_timer_init(void) } INIT_BOARD_EXPORT(rt_hw_timer_init); -#endif /* RT_USING_HWTIMER */ -#endif /* BSP_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ +#endif /* BSP_USING_CLOCK_TIMER */ diff --git a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_hwtimer.h b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_timer.h similarity index 94% rename from bsp/wch/risc-v/Libraries/ch32_drivers/drv_hwtimer.h rename to bsp/wch/risc-v/Libraries/ch32_drivers/drv_timer.h index 10ed383746..685b55a87e 100644 --- a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_hwtimer.h +++ b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_timer.h @@ -8,8 +8,8 @@ * 2022-09-10 MXH the first version */ -#ifndef __DRV_HWTIMER_H__ -#define __DRV_HWTIMER_H__ +#ifndef __DRV_CLOCK_TIMER_H__ +#define __DRV_CLOCK_TIMER_H__ #include #if defined(SOC_RISCV_SERIES_CH32V3) @@ -19,7 +19,7 @@ #include "ch32v20x_tim.h" #endif -#ifdef BSP_USING_HWTIMER +#ifdef BSP_USING_CLOCK_TIMER typedef struct { @@ -29,9 +29,9 @@ typedef struct }TIM_HandleTypeDef; -struct ch32_hwtimer +struct ch32_clock_timer { - rt_hwtimer_t device; + rt_clock_timer_t device; TIM_HandleTypeDef handle; IRQn_Type irqn; char *name; @@ -44,7 +44,7 @@ struct ch32_hwtimer .maxfreq = 1000000, \ .minfreq = 3000, \ .maxcnt = 0xFFFF, \ - .cntmode = HWTIMER_CNTMODE_UP, \ + .cntmode = CLOCK_TIMER_CNTMODE_UP, \ } #endif /* TIM_DEV_INFO_CONFIG */ @@ -148,5 +148,5 @@ struct ch32_hwtimer } #endif /* BSP_USING_TIM10 */ -#endif /* BSP_USING_HWTIMER */ -#endif /* __DRV_HWTIMER_H__ */ +#endif /* BSP_USING_CLOCK_TIMER */ +#endif /* __DRV_CLOCK_TIMER_H__ */ diff --git a/bsp/wch/risc-v/Libraries/ch56x_drivers/SConscript b/bsp/wch/risc-v/Libraries/ch56x_drivers/SConscript index b92cfcb3db..8c6988aa60 100644 --- a/bsp/wch/risc-v/Libraries/ch56x_drivers/SConscript +++ b/bsp/wch/risc-v/Libraries/ch56x_drivers/SConscript @@ -18,7 +18,7 @@ if GetDepend('RT_USING_USB_DEVICE'): if GetDepend('RT_USING_PWM'): src += ['ch56x_pwm.c'] -if GetDepend('RT_USING_HWTIMER'): +if GetDepend('RT_USING_CLOCK_TIME'): src += ['ch56x_timer.c'] if GetDepend('RT_USING_SPI'): diff --git a/bsp/wch/risc-v/Libraries/ch56x_drivers/ch56x_timer.c b/bsp/wch/risc-v/Libraries/ch56x_drivers/ch56x_timer.c index 2c8411d6fd..e59cd04f6f 100644 --- a/bsp/wch/risc-v/Libraries/ch56x_drivers/ch56x_timer.c +++ b/bsp/wch/risc-v/Libraries/ch56x_drivers/ch56x_timer.c @@ -8,7 +8,7 @@ * 2022-07-15 Emuzit first version */ #include -#include +#include #include "ch56x_sys.h" #include "ch56x_timer.h" #include "isr_sp.h" @@ -17,142 +17,142 @@ #error "Please define at least one TMRx" #endif -struct hwtimer_device +struct clock_timer_device { - struct rt_hwtimer_device parent; - struct rt_hwtimer_info hwtimer_info; + struct rt_clock_timer_device parent; + struct rt_clock_timer_info clock_timer_info; volatile struct timer_registers *reg_base; - rt_hwtimer_mode_t tmode; + rt_clock_timer_mode_t tmode; irq_number_t irqn; char *name; }; #ifdef BSP_USING_TMR0 -static struct hwtimer_device hwtimer_device_0 = +static struct clock_timer_device clock_timer_device_0 = { - .hwtimer_info = + .clock_timer_info = { .maxfreq = 80000000, .minfreq = 80000000, .maxcnt = 0x3ffffff, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }, .reg_base = (struct timer_registers *)TMR0_REG_BASE, - .tmode = HWTIMER_MODE_PERIOD, + .tmode = CLOCK_TIMER_MODE_PERIOD, .irqn = TMR0_IRQn, .name = "timer0", }; #endif #ifdef BSP_USING_TMR1 -static struct hwtimer_device hwtimer_device_1 = +static struct clock_timer_device clock_timer_device_1 = { - .hwtimer_info = + .clock_timer_info = { .maxfreq = 80000000, .minfreq = 80000000, .maxcnt = 0x3ffffff, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }, .reg_base = (struct timer_registers *)TMR1_REG_BASE, - .tmode = HWTIMER_MODE_PERIOD, + .tmode = CLOCK_TIMER_MODE_PERIOD, .irqn = TMR1_IRQn, .name = "timer1", }; #endif #ifdef BSP_USING_TMR2 -static struct hwtimer_device hwtimer_device_2 = +static struct clock_timer_device clock_timer_device_2 = { - .hwtimer_info = + .clock_timer_info = { .maxfreq = 80000000, .minfreq = 80000000, .maxcnt = 0x3ffffff, - .cntmode = HWTIMER_CNTMODE_UP, + .cntmode = CLOCK_TIMER_CNTMODE_UP, }, .reg_base = (struct timer_registers *)TMR2_REG_BASE, - .tmode = HWTIMER_MODE_PERIOD, + .tmode = CLOCK_TIMER_MODE_PERIOD, .irqn = TMR2_IRQn, .name = "timer2", }; #endif -static void hwtimer_stop(struct rt_hwtimer_device *timer); +static void clock_timer_stop(struct rt_clock_timer_device *timer); -static void hwtimer_init(struct rt_hwtimer_device *timer, uint32_t state) +static void clock_timer_init(struct rt_clock_timer_device *timer, uint32_t state) { - struct hwtimer_device *hwtimer_device = (void *)timer; + struct clock_timer_device *clock_timer_device = (void *)timer; - RT_ASSERT(hwtimer_device != RT_NULL); + RT_ASSERT(clock_timer_device != RT_NULL); /* no resource processing, `state` ignored */ - hwtimer_stop(timer); + clock_timer_stop(timer); - if (hwtimer_device->irqn != TMR0_IRQn) + if (clock_timer_device->irqn != TMR0_IRQn) { - hwtimer_device->reg_base->CTRL_DMA.reg = 0; + clock_timer_device->reg_base->CTRL_DMA.reg = 0; } } -static rt_err_t hwtimer_start(struct rt_hwtimer_device *timer, uint32_t cnt, rt_hwtimer_mode_t mode) +static rt_err_t clock_timer_start(struct rt_clock_timer_device *timer, uint32_t cnt, rt_clock_timer_mode_t mode) { - struct hwtimer_device *hwtimer_device = (void *)timer; + struct clock_timer_device *clock_timer_device = (void *)timer; volatile struct timer_registers *txreg; - RT_ASSERT(hwtimer_device != RT_NULL); + RT_ASSERT(clock_timer_device != RT_NULL); - /* hwtimer_device->tmode may be different from timer->mode. - * For multi-cycle ONESHOT, tmode is set to PERIOD at hwtimer_start. + /* clock_timer_device->tmode may be different from timer->mode. + * For multi-cycle ONESHOT, tmode is set to PERIOD at clock_timer_start. */ - hwtimer_device->tmode = mode; + clock_timer_device->tmode = mode; - sys_clk_off_by_irqn(hwtimer_device->irqn, SYS_SLP_CLK_ON); - txreg = hwtimer_device->reg_base; + sys_clk_off_by_irqn(clock_timer_device->irqn, SYS_SLP_CLK_ON); + txreg = clock_timer_device->reg_base; txreg->CNT_END = cnt; txreg->CTRL_MOD.reg = RB_TMR_ALL_CLEAR; txreg->CTRL_MOD.reg = RB_TMR_COUNT_EN; txreg->INTER_EN.cyc_end = 1; - rt_hw_interrupt_umask(hwtimer_device->irqn); + rt_hw_interrupt_umask(clock_timer_device->irqn); return RT_EOK; } -static void hwtimer_stop(struct rt_hwtimer_device *timer) +static void clock_timer_stop(struct rt_clock_timer_device *timer) { - struct hwtimer_device *hwtimer_device = (void *)timer; + struct clock_timer_device *clock_timer_device = (void *)timer; volatile struct timer_registers *txreg; - RT_ASSERT(hwtimer_device != RT_NULL); + RT_ASSERT(clock_timer_device != RT_NULL); - rt_hw_interrupt_mask(hwtimer_device->irqn); + rt_hw_interrupt_mask(clock_timer_device->irqn); /* note: RB_TMR_COUNT_EN cleared */ - txreg = hwtimer_device->reg_base; + txreg = clock_timer_device->reg_base; txreg->CTRL_MOD.reg = RB_TMR_ALL_CLEAR; txreg->INTER_EN.reg = 0; - sys_clk_off_by_irqn(hwtimer_device->irqn, SYS_SLP_CLK_OFF); + sys_clk_off_by_irqn(clock_timer_device->irqn, SYS_SLP_CLK_OFF); } -static uint32_t hwtimer_count_get(struct rt_hwtimer_device *timer) +static uint32_t clock_timer_count_get(struct rt_clock_timer_device *timer) { - struct hwtimer_device *hwtimer_device = (void *)timer; + struct clock_timer_device *clock_timer_device = (void *)timer; - RT_ASSERT(hwtimer_device != RT_NULL); + RT_ASSERT(clock_timer_device != RT_NULL); - return hwtimer_device->reg_base->COUNT; + return clock_timer_device->reg_base->COUNT; } -static rt_err_t hwtimer_control( - struct rt_hwtimer_device *timer, uint32_t cmd, void *args) +static rt_err_t clock_timer_control( + struct rt_clock_timer_device *timer, uint32_t cmd, void *args) { - struct hwtimer_device *hwtimer_device = (void *)timer; + struct clock_timer_device *clock_timer_device = (void *)timer; rt_err_t result = RT_EOK; - RT_ASSERT(hwtimer_device != RT_NULL); + RT_ASSERT(clock_timer_device != RT_NULL); switch (cmd) { - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: /* clocking for ch56x timers are fixed to Fsys */ if (args == RT_NULL || *(uint32_t *)args != timer->info->minfreq) { @@ -160,9 +160,9 @@ static rt_err_t hwtimer_control( } break; - case HWTIMER_CTRL_STOP: - case HWTIMER_CTRL_INFO_GET: - case HWTIMER_CTRL_MODE_SET: + case CLOCK_TIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_INFO_GET: + case CLOCK_TIMER_CTRL_MODE_SET: default: result = -RT_ENOSYS; } @@ -170,60 +170,60 @@ static rt_err_t hwtimer_control( return result; } -static const struct rt_hwtimer_ops hwtimer_ops = +static const struct rt_clock_timer_ops clock_timer_ops = { - .init = hwtimer_init, - .start = hwtimer_start, - .stop = hwtimer_stop, - .count_get = hwtimer_count_get, - .control = hwtimer_control, + .init = clock_timer_init, + .start = clock_timer_start, + .stop = clock_timer_stop, + .count_get = clock_timer_count_get, + .control = clock_timer_control, }; -static int rt_hw_hwtimer_init(void) +static int rt_hw_clock_timer_init(void) { - struct hwtimer_device *devices[3]; + struct clock_timer_device *devices[3]; uint32_t Fsys = sys_hclk_get(); int n = 0; #ifdef BSP_USING_TMR2 - devices[n++] = &hwtimer_device_2; + devices[n++] = &clock_timer_device_2; #endif #ifdef BSP_USING_TMR1 - devices[n++] = &hwtimer_device_1; + devices[n++] = &clock_timer_device_1; #endif #ifdef BSP_USING_TMR0 - devices[n++] = &hwtimer_device_0; + devices[n++] = &clock_timer_device_0; #endif while (--n >= 0) { - struct hwtimer_device *hwtimer_device = devices[n]; + struct clock_timer_device *clock_timer_device = devices[n]; /* counting frequency is fixed to Fsys */ - hwtimer_device->hwtimer_info.maxfreq = Fsys; - hwtimer_device->hwtimer_info.minfreq = Fsys; - hwtimer_device->parent.info = &hwtimer_device->hwtimer_info; - hwtimer_device->parent.ops = &hwtimer_ops; - rt_device_hwtimer_register( - &hwtimer_device->parent, hwtimer_device->name, RT_NULL); + clock_timer_device->clock_timer_info.maxfreq = Fsys; + clock_timer_device->clock_timer_info.minfreq = Fsys; + clock_timer_device->parent.info = &clock_timer_device->clock_timer_info; + clock_timer_device->parent.ops = &clock_timer_ops; + rt_clock_timer_register( + &clock_timer_device->parent, clock_timer_device->name, RT_NULL); } return RT_EOK; } -INIT_DEVICE_EXPORT(rt_hw_hwtimer_init); +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); -static void _hwtimer_isr_common(struct hwtimer_device *hwtimer_device) +static void _clock_timer_isr_common(struct clock_timer_device *clock_timer_device) { - volatile struct timer_registers *txreg = hwtimer_device->reg_base; + volatile struct timer_registers *txreg = clock_timer_device->reg_base; if (txreg->INT_FLAG.cyc_end) { - if (hwtimer_device->tmode == HWTIMER_MODE_ONESHOT) + if (clock_timer_device->tmode == CLOCK_TIMER_MODE_ONESHOT) { /* disable timer to emulate oneshot */ txreg->CTRL_MOD.reg = 0; } - rt_device_hwtimer_isr(&hwtimer_device->parent); + rt_clock_timer_isr(&clock_timer_device->parent); txreg->INT_FLAG.cyc_end = 1; } } @@ -234,7 +234,7 @@ void tmr0_irq_handler(void) { isr_sp_enter(); rt_interrupt_enter(); - _hwtimer_isr_common(&hwtimer_device_0); + _clock_timer_isr_common(&clock_timer_device_0); rt_interrupt_leave(); isr_sp_leave(); } @@ -246,7 +246,7 @@ void tmr1_irq_handler(void) { isr_sp_enter(); rt_interrupt_enter(); - _hwtimer_isr_common(&hwtimer_device_1); + _clock_timer_isr_common(&clock_timer_device_1); rt_interrupt_leave(); isr_sp_leave(); } @@ -258,7 +258,7 @@ void tmr2_irq_handler(void) { isr_sp_enter(); rt_interrupt_enter(); - _hwtimer_isr_common(&hwtimer_device_2); + _clock_timer_isr_common(&clock_timer_device_2); rt_interrupt_leave(); isr_sp_leave(); } diff --git a/bsp/wch/risc-v/ch32v208w-r0/board/Kconfig b/bsp/wch/risc-v/ch32v208w-r0/board/Kconfig index 5134fbd334..1ef09bd521 100644 --- a/bsp/wch/risc-v/ch32v208w-r0/board/Kconfig +++ b/bsp/wch/risc-v/ch32v208w-r0/board/Kconfig @@ -266,9 +266,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM - config BSP_USING_HWTIMER + config BSP_USING_CLOCK_TIMER bool - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n config BSP_USING_PWM @@ -282,12 +282,12 @@ menu "On-chip Peripheral Drivers" if BSP_USING_TIM1 choice - prompt "Using TIM1 as hwtimer or PWM mode" - default BSP_USING_TIM1_HWTIMER + prompt "Using TIM1 as clock_timer or PWM mode" + default BSP_USING_TIM1_CLOCK_TIMER - config BSP_USING_TIM1_HWTIMER - bool "Using TIM1 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM1_CLOCK_TIMER + bool "Using TIM1 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM1_PWM bool "Using TIM1 as PWM mode" @@ -318,12 +318,12 @@ menu "On-chip Peripheral Drivers" if BSP_USING_TIM2 choice - prompt "Using TIM2 as hwtimer or PWM mode" - default BSP_USING_TIM2_HWTIMER + prompt "Using TIM2 as clock_timer or PWM mode" + default BSP_USING_TIM2_CLOCK_TIMER - config BSP_USING_TIM2_HWTIMER - bool "Using TIM2 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM2_CLOCK_TIMER + bool "Using TIM2 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM2_PWM bool "Using TIM2 as PWM mode" @@ -354,12 +354,12 @@ menu "On-chip Peripheral Drivers" if BSP_USING_TIM3 choice - prompt "Using TIM3 as hwtimer or PWM mode" - default BSP_USING_TIM3_HWTIMER + prompt "Using TIM3 as clock_timer or PWM mode" + default BSP_USING_TIM3_CLOCK_TIMER - config BSP_USING_TIM3_HWTIMER - bool "Using TIM3 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM3_CLOCK_TIMER + bool "Using TIM3 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM3_PWM bool "Using TIM3 as PWM mode" @@ -390,12 +390,12 @@ menu "On-chip Peripheral Drivers" if BSP_USING_TIM4 choice - prompt "Using TIM4 as hwtimer or PWM mode" - default BSP_USING_TIM4_HWTIMER + prompt "Using TIM4 as clock_timer or PWM mode" + default BSP_USING_TIM4_CLOCK_TIMER - config BSP_USING_TIM4_HWTIMER - bool "Using TIM4 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM4_CLOCK_TIMER + bool "Using TIM4 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM4_PWM bool "Using TIM4 as PWM mode" @@ -426,12 +426,12 @@ menu "On-chip Peripheral Drivers" if BSP_USING_TIM5 choice - prompt "Using TIM5 as hwtimer or PWM mode" - default BSP_USING_TIM5_HWTIMER + prompt "Using TIM5 as clock_timer or PWM mode" + default BSP_USING_TIM5_CLOCK_TIMER - config BSP_USING_TIM5_HWTIMER - bool "Using TIM5 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM5_CLOCK_TIMER + bool "Using TIM5 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM5_PWM bool "Using TIM5 as PWM mode" @@ -462,12 +462,12 @@ menu "On-chip Peripheral Drivers" if BSP_USING_TIM6 choice - prompt "Using TIM5 as hwtimer (PWM mode not supported)" - default BSP_USING_TIM6_HWTIMER + prompt "Using TIM5 as clock_timer (PWM mode not supported)" + default BSP_USING_TIM6_CLOCK_TIMER - config BSP_USING_TIM6_HWTIMER - bool "Using TIM6 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM6_CLOCK_TIMER + bool "Using TIM6 as clock_timer mode" + select BSP_USING_CLOCK_TIMER endchoice endif @@ -478,12 +478,12 @@ menu "On-chip Peripheral Drivers" if BSP_USING_TIM7 choice - prompt "Using TIM7 as hwtimer (PWM mode not supported)" - default BSP_USING_TIM7_HWTIMER + prompt "Using TIM7 as clock_timer (PWM mode not supported)" + default BSP_USING_TIM7_CLOCK_TIMER - config BSP_USING_TIM7_HWTIMER - bool "Using TIM7 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM7_CLOCK_TIMER + bool "Using TIM7 as clock_timer mode" + select BSP_USING_CLOCK_TIMER endchoice endif @@ -494,12 +494,12 @@ menu "On-chip Peripheral Drivers" if BSP_USING_TIM8 choice - prompt "Using TIM8 as hwtimer or PWM mode" - default BSP_USING_TIM8_HWTIMER + prompt "Using TIM8 as clock_timer or PWM mode" + default BSP_USING_TIM8_CLOCK_TIMER - config BSP_USING_TIM8_HWTIMER - bool "Using TIM8 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM8_CLOCK_TIMER + bool "Using TIM8 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM8_PWM bool "Using TIM8 as PWM mode" @@ -530,12 +530,12 @@ menu "On-chip Peripheral Drivers" if BSP_USING_TIM9 choice - prompt "Using TIM9 as hwtimer or PWM mode" - default BSP_USING_TIM9_HWTIMER + prompt "Using TIM9 as clock_timer or PWM mode" + default BSP_USING_TIM9_CLOCK_TIMER - config BSP_USING_TIM9_HWTIMER - bool "Using TIM9 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM9_CLOCK_TIMER + bool "Using TIM9 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM9_PWM bool "Using TIM9 as PWM mode" @@ -566,12 +566,12 @@ menu "On-chip Peripheral Drivers" if BSP_USING_TIM10 choice - prompt "Using TIM10 as hwtimer or PWM mode" - default BSP_USING_TIM10_HWTIMER + prompt "Using TIM10 as clock_timer or PWM mode" + default BSP_USING_TIM10_CLOCK_TIMER - config BSP_USING_TIM10_HWTIMER - bool "Using TIM10 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM10_CLOCK_TIMER + bool "Using TIM10 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM10_PWM bool "Using TIM10 as PWM mode" diff --git a/bsp/wch/risc-v/ch32v307v-r1/board/Kconfig b/bsp/wch/risc-v/ch32v307v-r1/board/Kconfig index e0af96f539..ececb91344 100644 --- a/bsp/wch/risc-v/ch32v307v-r1/board/Kconfig +++ b/bsp/wch/risc-v/ch32v307v-r1/board/Kconfig @@ -30,7 +30,7 @@ menu "Onboard Peripheral Drivers" select BSP_USING_TIM4_PWM_CH3 select BSP_USING_TIM4_PWM_CH4 select BSP_USING_TIM6 - select BSP_USING_TIM6_HWTIMER + select BSP_USING_TIM6_CLOCK_TIMER select BSP_USING_SOFT_I2C select BSP_USING_I2C1 select RTDUINO_USING_WIRE @@ -538,9 +538,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM - config BSP_USING_HWTIMER + config BSP_USING_CLOCK_TIMER bool - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n config BSP_USING_PWM @@ -553,9 +553,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM1 - config BSP_USING_TIM1_HWTIMER - bool "Using TIM1 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM1_CLOCK_TIMER + bool "Using TIM1 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM1_PWM bool "Using TIM1 as PWM mode" @@ -577,8 +577,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM1 channel 4" endif - if BSP_USING_TIM1_HWTIMER && BSP_USING_TIM1_PWM - comment "BSP_USING_TIM1_HWTIMER and BSP_USING_TIM1_PWM can only be chosen for one!" + if BSP_USING_TIM1_CLOCK_TIMER && BSP_USING_TIM1_PWM + comment "BSP_USING_TIM1_CLOCK_TIMER and BSP_USING_TIM1_PWM can only be chosen for one!" endif endif @@ -588,9 +588,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM2 - config BSP_USING_TIM2_HWTIMER - bool "Using TIM2 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM2_CLOCK_TIMER + bool "Using TIM2 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM2_PWM bool "Using TIM2 as PWM mode" @@ -612,8 +612,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM2 channel 4" endif - if BSP_USING_TIM2_HWTIMER && BSP_USING_TIM2_PWM - comment "BSP_USING_TIM2_HWTIMER and BSP_USING_TIM2_PWM can only be chosen for one!" + if BSP_USING_TIM2_CLOCK_TIMER && BSP_USING_TIM2_PWM + comment "BSP_USING_TIM2_CLOCK_TIMER and BSP_USING_TIM2_PWM can only be chosen for one!" endif endif @@ -623,9 +623,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM3 - config BSP_USING_TIM3_HWTIMER - bool "Using TIM3 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM3_CLOCK_TIMER + bool "Using TIM3 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM3_PWM bool "Using TIM3 as PWM mode" @@ -647,8 +647,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM3 channel 4" endif - if BSP_USING_TIM3_HWTIMER && BSP_USING_TIM3_PWM - comment "BSP_USING_TIM3_HWTIMER and BSP_USING_TIM3_PWM can only be chosen for one!" + if BSP_USING_TIM3_CLOCK_TIMER && BSP_USING_TIM3_PWM + comment "BSP_USING_TIM3_CLOCK_TIMER and BSP_USING_TIM3_PWM can only be chosen for one!" endif endif @@ -658,9 +658,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM4 - config BSP_USING_TIM4_HWTIMER - bool "Using TIM4 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM4_CLOCK_TIMER + bool "Using TIM4 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM4_PWM bool "Using TIM4 as PWM mode" @@ -682,8 +682,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM4 channel 4" endif - if BSP_USING_TIM4_HWTIMER && BSP_USING_TIM4_PWM - comment "BSP_USING_TIM4_HWTIMER and BSP_USING_TIM4_PWM can only be chosen for one!" + if BSP_USING_TIM4_CLOCK_TIMER && BSP_USING_TIM4_PWM + comment "BSP_USING_TIM4_CLOCK_TIMER and BSP_USING_TIM4_PWM can only be chosen for one!" endif endif @@ -693,9 +693,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM5 - config BSP_USING_TIM5_HWTIMER - bool "Using TIM5 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM5_CLOCK_TIMER + bool "Using TIM5 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM5_PWM bool "Using TIM5 as PWM mode" @@ -717,8 +717,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM5 channel 4" endif - if BSP_USING_TIM5_HWTIMER && BSP_USING_TIM5_PWM - comment "BSP_USING_TIM5_HWTIMER and BSP_USING_TIM5_PWM can only be chosen for one!" + if BSP_USING_TIM5_CLOCK_TIMER && BSP_USING_TIM5_PWM + comment "BSP_USING_TIM5_CLOCK_TIMER and BSP_USING_TIM5_PWM can only be chosen for one!" endif endif @@ -728,9 +728,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM6 - config BSP_USING_TIM6_HWTIMER - bool "Using TIM6 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM6_CLOCK_TIMER + bool "Using TIM6 as clock_timer mode" + select BSP_USING_CLOCK_TIMER endif config BSP_USING_TIM7 @@ -738,9 +738,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM7 - config BSP_USING_TIM7_HWTIMER - bool "Using TIM7 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM7_CLOCK_TIMER + bool "Using TIM7 as clock_timer mode" + select BSP_USING_CLOCK_TIMER endif config BSP_USING_TIM8 @@ -748,9 +748,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM8 - config BSP_USING_TIM8_HWTIMER - bool "Using TIM8 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM8_CLOCK_TIMER + bool "Using TIM8 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM8_PWM bool "Using TIM8 as PWM mode" @@ -772,8 +772,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM8 channel 4" endif - if BSP_USING_TIM8_HWTIMER && BSP_USING_TIM8_PWM - comment "BSP_USING_TIM8_HWTIMER and BSP_USING_TIM8_PWM can only be chosen for one!" + if BSP_USING_TIM8_CLOCK_TIMER && BSP_USING_TIM8_PWM + comment "BSP_USING_TIM8_CLOCK_TIMER and BSP_USING_TIM8_PWM can only be chosen for one!" endif endif @@ -783,9 +783,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM9 - config BSP_USING_TIM9_HWTIMER - bool "Using TIM9 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM9_CLOCK_TIMER + bool "Using TIM9 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM9_PWM bool "Using TIM9 as PWM mode" @@ -807,8 +807,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM9 channel 4" endif - if BSP_USING_TIM9_HWTIMER && BSP_USING_TIM9_PWM - comment "BSP_USING_TIM9_HWTIMER and BSP_USING_TIM9_PWM can only be chosen for one!" + if BSP_USING_TIM9_CLOCK_TIMER && BSP_USING_TIM9_PWM + comment "BSP_USING_TIM9_CLOCK_TIMER and BSP_USING_TIM9_PWM can only be chosen for one!" endif endif @@ -818,9 +818,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM10 - config BSP_USING_TIM10_HWTIMER - bool "Using TIM10 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM10_CLOCK_TIMER + bool "Using TIM10 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM10_PWM bool "Using TIM10 as PWM mode" @@ -842,8 +842,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM10 channel 4" endif - if BSP_USING_TIM10_HWTIMER && BSP_USING_TIM10_PWM - comment "BSP_USING_TIM10_HWTIMER and BSP_USING_TIM10_PWM can only be chosen for one!" + if BSP_USING_TIM10_CLOCK_TIMER && BSP_USING_TIM10_PWM + comment "BSP_USING_TIM10_CLOCK_TIMER and BSP_USING_TIM10_PWM can only be chosen for one!" endif endif diff --git a/bsp/wch/risc-v/ch569w-evt/applications/test.c b/bsp/wch/risc-v/ch569w-evt/applications/test.c index f29811f8ca..848189f301 100644 --- a/bsp/wch/risc-v/ch569w-evt/applications/test.c +++ b/bsp/wch/risc-v/ch569w-evt/applications/test.c @@ -7,14 +7,14 @@ * Date Author Notes * 2022-07-15 Emuzit first version * 2022-07-20 Emuzit add watchdog test - * 2022-07-26 Emuzit add hwtimer test + * 2022-07-26 Emuzit add clock_timer test * 2022-07-30 Emuzit add spi master test * 2022-08-04 Emuzit add pwm test */ #include #include #include "drivers/dev_watchdog.h" -#include +#include #include "drivers/dev_spi.h" #include #include "board.h" @@ -154,7 +154,7 @@ static void test_watchdog(uint32_t seconds) #define test_watchdog(tov) do {} while(0) #endif -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME static struct rt_device *tmr_dev_0; static struct rt_device *tmr_dev_1; @@ -164,15 +164,15 @@ static rt_err_t tmr_timeout_cb(rt_device_t dev, rt_size_t size) int tmr = (dev == tmr_dev_1) ? 1 : 0; - rt_kprintf("hwtimer %d timeout callback fucntion @tick %d\n", tmr, tick); + rt_kprintf("clock_timer %d timeout callback fucntion @tick %d\n", tmr, tick); return RT_EOK; } -static void test_hwtimer(void) +static void test_clock_timer(void) { - rt_hwtimerval_t timerval; - rt_hwtimer_mode_t mode; + rt_clock_timerval_t timerval; + rt_clock_timer_mode_t mode; rt_size_t tsize; /* setup two timers, ONESHOT & PERIOD each @@ -181,12 +181,12 @@ static void test_hwtimer(void) tmr_dev_1 = rt_device_find("timer1"); if (tmr_dev_0 == RT_NULL || tmr_dev_1 == RT_NULL) { - rt_kprintf("hwtimer device(s) not found !\n"); + rt_kprintf("clock_timer device(s) not found !\n"); } else if (rt_device_open(tmr_dev_0, RT_DEVICE_OFLAG_RDWR) != RT_EOK || rt_device_open(tmr_dev_1, RT_DEVICE_OFLAG_RDWR) != RT_EOK) { - rt_kprintf("hwtimer device(s) open failed !\n"); + rt_kprintf("clock_timer device(s) open failed !\n"); } else { @@ -196,8 +196,8 @@ static void test_hwtimer(void) timerval.sec = 3; timerval.usec = 500000; tsize = sizeof(timerval); - mode = HWTIMER_MODE_ONESHOT; - if (rt_device_control(tmr_dev_0, HWTIMER_CTRL_MODE_SET, &mode) != RT_EOK) + mode = CLOCK_TIMER_MODE_ONESHOT; + if (rt_device_control(tmr_dev_0, CLOCK_TIMER_CTRL_MODE_SET, &mode) != RT_EOK) { rt_kprintf("timer0 set mode failed !\n"); } @@ -213,8 +213,8 @@ static void test_hwtimer(void) timerval.sec = 5; timerval.usec = 0; tsize = sizeof(timerval); - mode = HWTIMER_MODE_PERIOD; - if (rt_device_control(tmr_dev_1, HWTIMER_CTRL_MODE_SET, &mode) != RT_EOK) + mode = CLOCK_TIMER_MODE_PERIOD; + if (rt_device_control(tmr_dev_1, CLOCK_TIMER_CTRL_MODE_SET, &mode) != RT_EOK) { rt_kprintf("timer1 set mode failed !\n"); } @@ -229,7 +229,7 @@ static void test_hwtimer(void) } } #else - #define test_hwtimer() do {} while(0) + #define test_clock_timer() do {} while(0) #endif #ifdef RT_USING_SPI @@ -414,7 +414,7 @@ void main(void) test_gpio_int(); test_watchdog(wdog_timeout); - test_hwtimer(); + test_clock_timer(); test_spi_master(); test_pwm(); test_usbd(); diff --git a/bsp/wch/risc-v/ch569w-evt/board/Kconfig b/bsp/wch/risc-v/ch569w-evt/board/Kconfig index 2f23098a3c..4cbfc32981 100644 --- a/bsp/wch/risc-v/ch569w-evt/board/Kconfig +++ b/bsp/wch/risc-v/ch569w-evt/board/Kconfig @@ -40,7 +40,7 @@ config BSP_USING_UART config BSP_USING_TIMER bool "using on-chip timer" - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n if BSP_USING_TIMER diff --git a/bsp/wch/risc-v/yd-ch32v307vct6/board/Kconfig b/bsp/wch/risc-v/yd-ch32v307vct6/board/Kconfig index 2ad8cc1336..dccae0c2bb 100644 --- a/bsp/wch/risc-v/yd-ch32v307vct6/board/Kconfig +++ b/bsp/wch/risc-v/yd-ch32v307vct6/board/Kconfig @@ -256,9 +256,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM - config BSP_USING_HWTIMER + config BSP_USING_CLOCK_TIMER bool - select RT_USING_HWTIMER + select RT_USING_CLOCK_TIME default n config BSP_USING_PWM @@ -271,9 +271,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM1 - config BSP_USING_TIM1_HWTIMER - bool "Using TIM1 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM1_CLOCK_TIMER + bool "Using TIM1 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM1_PWM bool "Using TIM1 as PWM mode" @@ -295,8 +295,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM1 channel 4" endif - if BSP_USING_TIM1_HWTIMER && BSP_USING_TIM1_PWM - comment "BSP_USING_TIM1_HWTIMER and BSP_USING_TIM1_PWM can only be chosen for one!" + if BSP_USING_TIM1_CLOCK_TIMER && BSP_USING_TIM1_PWM + comment "BSP_USING_TIM1_CLOCK_TIMER and BSP_USING_TIM1_PWM can only be chosen for one!" endif endif @@ -306,9 +306,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM2 - config BSP_USING_TIM2_HWTIMER - bool "Using TIM2 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM2_CLOCK_TIMER + bool "Using TIM2 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM2_PWM bool "Using TIM2 as PWM mode" @@ -330,8 +330,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM2 channel 4" endif - if BSP_USING_TIM2_HWTIMER && BSP_USING_TIM2_PWM - comment "BSP_USING_TIM2_HWTIMER and BSP_USING_TIM2_PWM can only be chosen for one!" + if BSP_USING_TIM2_CLOCK_TIMER && BSP_USING_TIM2_PWM + comment "BSP_USING_TIM2_CLOCK_TIMER and BSP_USING_TIM2_PWM can only be chosen for one!" endif endif @@ -341,9 +341,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM3 - config BSP_USING_TIM3_HWTIMER - bool "Using TIM3 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM3_CLOCK_TIMER + bool "Using TIM3 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM3_PWM bool "Using TIM3 as PWM mode" @@ -365,8 +365,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM3 channel 4" endif - if BSP_USING_TIM3_HWTIMER && BSP_USING_TIM3_PWM - comment "BSP_USING_TIM3_HWTIMER and BSP_USING_TIM3_PWM can only be chosen for one!" + if BSP_USING_TIM3_CLOCK_TIMER && BSP_USING_TIM3_PWM + comment "BSP_USING_TIM3_CLOCK_TIMER and BSP_USING_TIM3_PWM can only be chosen for one!" endif endif @@ -376,9 +376,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM4 - config BSP_USING_TIM4_HWTIMER - bool "Using TIM4 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM4_CLOCK_TIMER + bool "Using TIM4 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM4_PWM bool "Using TIM4 as PWM mode" @@ -400,8 +400,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM4 channel 4" endif - if BSP_USING_TIM4_HWTIMER && BSP_USING_TIM4_PWM - comment "BSP_USING_TIM4_HWTIMER and BSP_USING_TIM4_PWM can only be chosen for one!" + if BSP_USING_TIM4_CLOCK_TIMER && BSP_USING_TIM4_PWM + comment "BSP_USING_TIM4_CLOCK_TIMER and BSP_USING_TIM4_PWM can only be chosen for one!" endif endif @@ -411,9 +411,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM5 - config BSP_USING_TIM5_HWTIMER - bool "Using TIM5 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM5_CLOCK_TIMER + bool "Using TIM5 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM5_PWM bool "Using TIM5 as PWM mode" @@ -435,8 +435,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM5 channel 4" endif - if BSP_USING_TIM5_HWTIMER && BSP_USING_TIM5_PWM - comment "BSP_USING_TIM5_HWTIMER and BSP_USING_TIM5_PWM can only be chosen for one!" + if BSP_USING_TIM5_CLOCK_TIMER && BSP_USING_TIM5_PWM + comment "BSP_USING_TIM5_CLOCK_TIMER and BSP_USING_TIM5_PWM can only be chosen for one!" endif endif @@ -446,9 +446,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM6 - config BSP_USING_TIM6_HWTIMER - bool "Using TIM6 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM6_CLOCK_TIMER + bool "Using TIM6 as clock_timer mode" + select BSP_USING_CLOCK_TIMER endif config BSP_USING_TIM7 @@ -456,9 +456,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM7 - config BSP_USING_TIM7_HWTIMER - bool "Using TIM7 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM7_CLOCK_TIMER + bool "Using TIM7 as clock_timer mode" + select BSP_USING_CLOCK_TIMER endif config BSP_USING_TIM8 @@ -466,9 +466,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM8 - config BSP_USING_TIM8_HWTIMER - bool "Using TIM8 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM8_CLOCK_TIMER + bool "Using TIM8 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM8_PWM bool "Using TIM8 as PWM mode" @@ -490,8 +490,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM8 channel 4" endif - if BSP_USING_TIM8_HWTIMER && BSP_USING_TIM8_PWM - comment "BSP_USING_TIM8_HWTIMER and BSP_USING_TIM8_PWM can only be chosen for one!" + if BSP_USING_TIM8_CLOCK_TIMER && BSP_USING_TIM8_PWM + comment "BSP_USING_TIM8_CLOCK_TIMER and BSP_USING_TIM8_PWM can only be chosen for one!" endif endif @@ -501,9 +501,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM9 - config BSP_USING_TIM9_HWTIMER - bool "Using TIM9 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM9_CLOCK_TIMER + bool "Using TIM9 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM9_PWM bool "Using TIM9 as PWM mode" @@ -525,8 +525,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM9 channel 4" endif - if BSP_USING_TIM9_HWTIMER && BSP_USING_TIM9_PWM - comment "BSP_USING_TIM9_HWTIMER and BSP_USING_TIM9_PWM can only be chosen for one!" + if BSP_USING_TIM9_CLOCK_TIMER && BSP_USING_TIM9_PWM + comment "BSP_USING_TIM9_CLOCK_TIMER and BSP_USING_TIM9_PWM can only be chosen for one!" endif endif @@ -536,9 +536,9 @@ menu "On-chip Peripheral Drivers" default n if BSP_USING_TIM10 - config BSP_USING_TIM10_HWTIMER - bool "Using TIM10 as hwtimer mode" - select BSP_USING_HWTIMER + config BSP_USING_TIM10_CLOCK_TIMER + bool "Using TIM10 as clock_timer mode" + select BSP_USING_CLOCK_TIMER config BSP_USING_TIM10_PWM bool "Using TIM10 as PWM mode" @@ -560,8 +560,8 @@ menu "On-chip Peripheral Drivers" bool "Using TIM10 channel 4" endif - if BSP_USING_TIM10_HWTIMER && BSP_USING_TIM10_PWM - comment "BSP_USING_TIM10_HWTIMER and BSP_USING_TIM10_PWM can only be chosen for one!" + if BSP_USING_TIM10_CLOCK_TIMER && BSP_USING_TIM10_PWM + comment "BSP_USING_TIM10_CLOCK_TIMER and BSP_USING_TIM10_PWM can only be chosen for one!" endif endif diff --git a/bsp/xuantie/virt64/c906/board/board.c b/bsp/xuantie/virt64/c906/board/board.c index 3a38dab716..7e30de7a57 100644 --- a/bsp/xuantie/virt64/c906/board/board.c +++ b/bsp/xuantie/virt64/c906/board/board.c @@ -42,6 +42,11 @@ struct mem_desc platform_mem_desc[] = { #endif +rt_uint64_t rt_hw_get_clock_timer_freq(void) +{ + return 10000000ULL; +} + void primary_cpu_entry(void) { /* disable global interrupt */ @@ -106,4 +111,3 @@ void rt_hw_cpu_reset(void) ; } MSH_CMD_EXPORT_ALIAS(rt_hw_cpu_reset, reboot, reset machine); - diff --git a/bsp/zynqmp-r5-axu4ev/rtconfig.h b/bsp/zynqmp-r5-axu4ev/rtconfig.h index 7cb23b1b7c..9b296b2f0d 100644 --- a/bsp/zynqmp-r5-axu4ev/rtconfig.h +++ b/bsp/zynqmp-r5-axu4ev/rtconfig.h @@ -105,7 +105,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define RT_USING_CACHE @@ -404,6 +404,10 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig index f803469d64..01539009a2 100755 --- a/components/drivers/Kconfig +++ b/components/drivers/Kconfig @@ -5,7 +5,7 @@ rsource "ipc/Kconfig" rsource "serial/Kconfig" rsource "can/Kconfig" -rsource "cputime/Kconfig" +rsource "clock_time/Kconfig" rsource "i2c/Kconfig" rsource "phy/Kconfig" rsource "misc/Kconfig" @@ -46,9 +46,7 @@ rsource "pci/Kconfig" rsource "pic/Kconfig" rsource "pin/Kconfig" rsource "pinctrl/Kconfig" -rsource "ktime/Kconfig" rsource "clk/Kconfig" -rsource "hwtimer/Kconfig" rsource "usb/Kconfig" endmenu diff --git a/components/drivers/clock_time/Kconfig b/components/drivers/clock_time/Kconfig new file mode 100644 index 0000000000..7da12ac849 --- /dev/null +++ b/components/drivers/clock_time/Kconfig @@ -0,0 +1,18 @@ +menuconfig RT_USING_CLOCK_TIME + bool "Clock time subsystem" + default n + +if RT_USING_CLOCK_TIME + config CLOCK_TIMER_FREQ + int "Clock time timer freq" + default 0 + depends on ARCH_RISCV64 + help + Base frequency (Hz) for clock time counter on RISC-V. + + config RT_CLOCK_TIME_ARM_ARCH + bool "ARM ARCH Timer" + depends on RT_USING_DM + depends on ARCH_ARM_CORTEX_A || ARCH_ARMV8 + default n +endif diff --git a/components/drivers/clock_time/README.md b/components/drivers/clock_time/README.md new file mode 100644 index 0000000000..45de9f9f4d --- /dev/null +++ b/components/drivers/clock_time/README.md @@ -0,0 +1,39 @@ +# Clock Time Subsystem + +The clock_time subsystem provides a unified time base and event scheduling for +RT-Thread. It separates timekeeping (a monotonic counter) from event delivery +(a programmable timer interrupt) so platforms can combine different hardware +sources while the kernel sees consistent behavior. + +## Design Principles +- Monotonic time: time readings never go backward. +- Separation of roles: a clock source provides a counter, a clock event triggers + deadlines. +- Scaled integer conversion: counters are converted to nanoseconds with a + resolution scale factor, avoiding floating point. +- Graceful fallback: if a hardware event is unavailable, software timers keep + the system functional. + +## Building Blocks +- Clock source: provides a stable counter and its frequency. +- Clock event: can be programmed to fire at the next deadline. +- Clock timer adapter: exposes a general timer peripheral as a clock source or + event device. +- Clock hrtimer: software scheduler that orders high-resolution timeouts and + programs the next event. +- Clock boottime helpers: translate the monotonic counter into common time + formats for use by higher layers. + +## Time Flow +- Read path: counter -> scaled resolution -> nanoseconds. +- Timeout path: hrtimer queue -> next expiry -> program event -> interrupt -> + dispatch callbacks. + +## BSP Integration Guidance +- Provide a stable counter or a programmable timer. One device can serve both + roles. +- Select a default source and event device to enable accurate timekeeping and + efficient scheduling. +- Keep ISRs minimal; the core handles conversion and scheduling. +- POSIX time APIs are layered on top of this subsystem and reuse its monotonic + base. diff --git a/components/drivers/clock_time/README_zh.md b/components/drivers/clock_time/README_zh.md new file mode 100644 index 0000000000..aed720b8dd --- /dev/null +++ b/components/drivers/clock_time/README_zh.md @@ -0,0 +1,28 @@ +# Clock Time 子系统 + +clock_time 子系统为 RT-Thread 提供统一的时间基准与事件调度能力。它将 +“计时”(单调计数器)与“定时事件”(可编程定时器中断)解耦,允许不同硬件 +组合,同时保证内核行为一致。 + +## 设计原则 +- 单调时间: 时间读数不回退。 +- 角色分离: 时钟源负责计数,时钟事件负责触发超时。 +- 缩放整数换算: 通过分辨率缩放因子把计数转换为纳秒,避免浮点计算。 +- 可降级运行: 缺少硬件事件时由软件定时器维持基本功能。 + +## 组成部分 +- 时钟源: 提供稳定计数器与频率信息。 +- 时钟事件: 可编程下一次超时。 +- 时钟定时器适配层: 将通用定时器外设包装为时钟源或事件设备。 +- 高精度定时器: 软件调度层,排序超时并驱动下一次事件。 +- 启动时间辅助: 将单调计数转换为常见时间格式,供上层使用。 + +## 时间流转 +- 读取路径: 计数 -> 缩放分辨率 -> 纳秒。 +- 超时路径: hrtimer 队列 -> 下一到期 -> 设置事件 -> 中断 -> 回调分发。 + +## BSP 集成要点 +- 提供稳定计数器或可编程定时器,一个设备可兼任两种角色。 +- 选择默认的时钟源与事件设备,以获得准确计时与高效调度。 +- 中断服务保持简短,换算与调度交由核心完成。 +- POSIX 时间接口建立在该子系统之上,复用其单调时间基准。 diff --git a/components/drivers/clock_time/SConscript b/components/drivers/clock_time/SConscript new file mode 100644 index 0000000000..111449276a --- /dev/null +++ b/components/drivers/clock_time/SConscript @@ -0,0 +1,42 @@ +import os +from building import * + +Import('rtconfig') + +cwd = GetCurrentDir() + +group = [] +build_clock_time = GetDepend('RT_USING_CLOCK_TIME') + +if not build_clock_time: + Return('group') + +src = [ + 'clock_time_core.c', + 'clock_hrtimer.c', + 'clock_boottime.c', + 'clock_timer.c', +] +if GetDepend('RT_CLOCK_TIME_ARM_ARCH'): + src += ['clock_time_arm_arch.c'] + +arch_dir = os.path.join(cwd, 'arch') +if os.path.isdir(arch_dir): + arch_list = os.listdir(arch_dir) + if rtconfig.ARCH in arch_list: + cpu_dir = os.path.join(arch_dir, rtconfig.ARCH, rtconfig.CPU) + if os.path.exists(cpu_dir): + src += Glob("arch/%s/%s/*.c" % (rtconfig.ARCH, rtconfig.CPU)) + else: + src += Glob("arch/%s/*.c" % rtconfig.ARCH) + +CPPPATH = [cwd, os.path.join(cwd, '..', 'include')] +LOCAL_CCFLAGS = '' +if rtconfig.PLATFORM in ['gcc', 'armclang']: + LOCAL_CCFLAGS += ' -std=gnu99' +elif rtconfig.PLATFORM in ['armcc']: + LOCAL_CCFLAGS += ' --c99 --gnu' + +group = DefineGroup('DeviceDrivers', src, depend=[''], CPPPATH=CPPPATH, LOCAL_CCFLAGS=LOCAL_CCFLAGS) + +Return('group') diff --git a/components/drivers/clock_time/arch/aarch64/cputimer.c b/components/drivers/clock_time/arch/aarch64/cputimer.c new file mode 100644 index 0000000000..58102d226f --- /dev/null +++ b/components/drivers/clock_time/arch/aarch64/cputimer.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-07-10 xqyjlj The first version. + */ + +#include "gtimer.h" +#include + +static volatile unsigned long _init_cnt = 0; +static rt_bool_t _aarch64_clock_registered = RT_FALSE; +static struct rt_clock_time_device _aarch64_clock_dev; + +static rt_uint64_t _aarch64_clock_get_freq(struct rt_clock_time_device *dev) +{ + RT_UNUSED(dev); + return rt_hw_get_gtimer_frq(); +} + +static rt_uint64_t _aarch64_clock_get_counter(struct rt_clock_time_device *dev) +{ + RT_UNUSED(dev); + return (rt_uint64_t)(rt_hw_get_cntpct_val() - _init_cnt); +} + +static rt_err_t _aarch64_clock_set_timeout(struct rt_clock_time_device *dev, rt_uint64_t delta) +{ + RT_UNUSED(dev); + RT_UNUSED(delta); + return -RT_ENOSYS; +} + +static const struct rt_clock_time_ops _aarch64_clock_ops = +{ + _aarch64_clock_get_freq, + _aarch64_clock_get_counter, + _aarch64_clock_set_timeout, +}; + +void rt_clock_time_source_init(void) +{ + _init_cnt = rt_hw_get_cntpct_val(); + + if (!_aarch64_clock_registered) + { + rt_uint8_t caps = RT_CLOCK_TIME_CAP_SOURCE; + + _aarch64_clock_dev.ops = &_aarch64_clock_ops; + _aarch64_clock_dev.res_scale = RT_CLOCK_TIME_RESMUL; + _aarch64_clock_dev.caps = caps; + rt_clock_time_device_register(&_aarch64_clock_dev, "clock_time_gtimer", caps); + rt_clock_time_set_default_source(&_aarch64_clock_dev); + _aarch64_clock_registered = RT_TRUE; + } +} diff --git a/components/drivers/clock_time/arch/risc-v/virt64/cputimer.c b/components/drivers/clock_time/arch/risc-v/virt64/cputimer.c new file mode 100644 index 0000000000..7921716b7f --- /dev/null +++ b/components/drivers/clock_time/arch/risc-v/virt64/cputimer.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-07-10 xqyjlj The first version. + */ + +#include + +static volatile unsigned long _init_cnt = 0; +static rt_bool_t _riscv_clock_registered = RT_FALSE; +static struct rt_clock_time_device _riscv_clock_dev; + +extern rt_uint64_t rt_hw_get_clock_timer_freq(void); + +static rt_uint64_t _riscv_clock_get_freq(struct rt_clock_time_device *dev) +{ + RT_UNUSED(dev); + return rt_hw_get_clock_timer_freq(); +} + +static rt_uint64_t _riscv_clock_get_counter(struct rt_clock_time_device *dev) +{ + unsigned long time_elapsed; + + RT_UNUSED(dev); + __asm__ __volatile__("rdtime %0" : "=r"(time_elapsed)); + return (rt_uint64_t)(time_elapsed - _init_cnt); +} + +static rt_err_t _riscv_clock_set_timeout(struct rt_clock_time_device *dev, rt_uint64_t delta) +{ + RT_UNUSED(dev); + RT_UNUSED(delta); + return -RT_ENOSYS; +} + +static const struct rt_clock_time_ops _riscv_clock_ops = +{ + _riscv_clock_get_freq, + _riscv_clock_get_counter, + _riscv_clock_set_timeout, +}; + +void rt_clock_time_source_init(void) +{ + __asm__ __volatile__("rdtime %0" : "=r"(_init_cnt)); + + if (!_riscv_clock_registered) + { + rt_uint8_t caps = RT_CLOCK_TIME_CAP_SOURCE; + + _riscv_clock_dev.ops = &_riscv_clock_ops; + _riscv_clock_dev.res_scale = RT_CLOCK_TIME_RESMUL; + _riscv_clock_dev.caps = caps; + rt_clock_time_device_register(&_riscv_clock_dev, "clock_time_rdtime", caps); + rt_clock_time_set_default_source(&_riscv_clock_dev); + _riscv_clock_registered = RT_TRUE; + } +} diff --git a/components/drivers/ktime/src/boottime.c b/components/drivers/clock_time/clock_boottime.c similarity index 33% rename from components/drivers/ktime/src/boottime.c rename to components/drivers/clock_time/clock_boottime.c index 8e69141b68..3185a04968 100644 --- a/components/drivers/ktime/src/boottime.c +++ b/components/drivers/clock_time/clock_boottime.c @@ -1,22 +1,31 @@ /* - * Copyright (c) 2006-2023, RT-Thread Development Team + * Copyright (c) 2006-2024, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes - * 2023-07-10 xqyjlj The first version. + * 2025-01-01 RT-Thread Clock time boottime helpers */ -#include "ktime.h" +#include -#define __KTIME_MUL ((1000ULL * 1000 * 1000) / RT_TICK_PER_SECOND) - -rt_weak rt_err_t rt_ktime_boottime_get_us(struct timeval *tv) +rt_err_t rt_clock_boottime_get_us(struct timeval *tv) { + rt_uint64_t cnt; + rt_uint64_t res; + rt_uint64_t ns; + RT_ASSERT(tv != RT_NULL); - rt_uint64_t ns = (rt_ktime_cputimer_getcnt() * rt_ktime_cputimer_getres()) / RT_KTIME_RESMUL; + cnt = rt_clock_time_get_counter(); + res = rt_clock_time_get_res_scaled(); + if (res == 0) + { + return -RT_ERROR; + } + + ns = (cnt * res) / RT_CLOCK_TIME_RESMUL; tv->tv_sec = ns / (1000ULL * 1000 * 1000); tv->tv_usec = (ns % (1000ULL * 1000 * 1000)) / 1000; @@ -24,22 +33,43 @@ rt_weak rt_err_t rt_ktime_boottime_get_us(struct timeval *tv) return RT_EOK; } -rt_weak rt_err_t rt_ktime_boottime_get_s(time_t *t) +rt_err_t rt_clock_boottime_get_s(time_t *t) { + rt_uint64_t cnt; + rt_uint64_t res; + rt_uint64_t ns; + RT_ASSERT(t != RT_NULL); - rt_uint64_t ns = (rt_ktime_cputimer_getcnt() * rt_ktime_cputimer_getres()) / RT_KTIME_RESMUL; + cnt = rt_clock_time_get_counter(); + res = rt_clock_time_get_res_scaled(); + if (res == 0) + { + return -RT_ERROR; + } + ns = (cnt * res) / RT_CLOCK_TIME_RESMUL; *t = ns / (1000ULL * 1000 * 1000); return RT_EOK; } -rt_weak rt_err_t rt_ktime_boottime_get_ns(struct timespec *ts) +rt_err_t rt_clock_boottime_get_ns(struct timespec *ts) { + rt_uint64_t cnt; + rt_uint64_t res; + rt_uint64_t ns; + RT_ASSERT(ts != RT_NULL); - rt_uint64_t ns = (rt_ktime_cputimer_getcnt() * rt_ktime_cputimer_getres()) / RT_KTIME_RESMUL; + cnt = rt_clock_time_get_counter(); + res = rt_clock_time_get_res_scaled(); + if (res == 0) + { + return -RT_ERROR; + } + + ns = (cnt * res) / RT_CLOCK_TIME_RESMUL; ts->tv_sec = ns / (1000ULL * 1000 * 1000); ts->tv_nsec = ns % (1000ULL * 1000 * 1000); diff --git a/components/drivers/ktime/src/hrtimer.c b/components/drivers/clock_time/clock_hrtimer.c similarity index 57% rename from components/drivers/ktime/src/hrtimer.c rename to components/drivers/clock_time/clock_hrtimer.c index ca579a5e98..6fbfcecdea 100644 --- a/components/drivers/ktime/src/hrtimer.c +++ b/components/drivers/clock_time/clock_hrtimer.c @@ -1,23 +1,24 @@ /* - * Copyright (c) 2006-2023, RT-Thread Development Team + * Copyright (c) 2006-2026, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes - * 2023-07-10 xqyjlj The first version. - * 2023-09-15 xqyjlj perf rt_hw_interrupt_disable/enable + * 2025-01-01 RT-Thread Clock time hrtimer */ #include #include #include -#define DBG_SECTION_NAME "drv.ktime" +#include + +#define DBG_SECTION_NAME "drv.clock_time" #define DBG_LEVEL DBG_INFO #include -#include "ktime.h" +#define CLOCK_TIME_NSEC_PER_SEC (1000000000ULL) #ifdef ARCH_CPU_64BIT #define _HRTIMER_MAX_CNT UINT64_MAX @@ -28,36 +29,88 @@ static rt_list_t _timer_list = RT_LIST_OBJECT_INIT(_timer_list); static RT_DEFINE_SPINLOCK(_spinlock); -rt_inline rt_ktime_hrtimer_t _first_hrtimer(void) +rt_inline rt_clock_hrtimer_t _first_hrtimer(void) +{ + return rt_list_isempty(&_timer_list) ? RT_NULL : rt_list_first_entry(&_timer_list, struct rt_clock_hrtimer, node); +} + +rt_inline unsigned long _clock_time_get_cnt(void) +{ + return rt_clock_time_get_counter(); +} + +rt_inline rt_bool_t _cnt_before(unsigned long a, unsigned long b) +{ + return ((rt_base_t)(a - b)) < 0; +} + +rt_inline rt_bool_t _cnt_after(unsigned long a, unsigned long b) { - return rt_list_isempty(&_timer_list) ? RT_NULL : rt_list_first_entry(&_timer_list, struct rt_ktime_hrtimer, node); + return _cnt_before(b, a); } -rt_weak rt_uint64_t rt_ktime_hrtimer_getres(void) +rt_weak rt_uint64_t rt_clock_hrtimer_getres(void) { - return ((1000ULL * 1000 * 1000) * RT_KTIME_RESMUL) / RT_TICK_PER_SECOND; + return rt_clock_time_get_event_res_scaled(); } -rt_weak unsigned long rt_ktime_hrtimer_getfrq(void) +rt_weak unsigned long rt_clock_hrtimer_getfrq(void) { - return RT_TICK_PER_SECOND; + return (unsigned long)rt_clock_time_get_event_freq(); } -rt_weak rt_err_t rt_ktime_hrtimer_settimeout(unsigned long cnt) +static rt_tick_t _hrtimer_cnt_to_tick(unsigned long cnt) +{ + rt_uint64_t res = rt_clock_hrtimer_getres(); + rt_uint64_t ns; + + if (res == 0) + { + return 0; + } + + ns = ((rt_uint64_t)cnt * res) / RT_CLOCK_TIME_RESMUL; + if (ns == 0) + { + return 1; + } + + ns = (ns * RT_TICK_PER_SECOND + CLOCK_TIME_NSEC_PER_SEC - 1) / CLOCK_TIME_NSEC_PER_SEC; + if (ns == 0) + { + return 1; + } + + return (rt_tick_t)ns; +} + +rt_weak rt_err_t rt_clock_hrtimer_settimeout(unsigned long cnt) { static rt_timer_t timer = RT_NULL; static struct rt_timer _sh_rtimer; + rt_tick_t tick; RT_ASSERT(cnt > 0); + if (rt_clock_time_set_timeout(cnt) == RT_EOK) + { + return RT_EOK; + } + + tick = _hrtimer_cnt_to_tick(cnt); + if (tick == 0) + { + return -RT_ERROR; + } + if (timer == RT_NULL) { timer = &_sh_rtimer; - rt_timer_init(timer, "shrtimer", (void (*)(void *))rt_ktime_hrtimer_process, RT_NULL, cnt, RT_TIMER_FLAG_ONE_SHOT); + rt_timer_init(timer, "shrtimer", (void (*)(void *))rt_clock_hrtimer_process, RT_NULL, + tick, RT_TIMER_FLAG_ONE_SHOT); } else { - rt_tick_t tick = cnt; rt_timer_control(timer, RT_TIMER_CTRL_SET_TIME, &tick); rt_timer_control(timer, RT_TIMER_CTRL_SET_PARM, RT_NULL); } @@ -71,36 +124,44 @@ rt_weak rt_err_t rt_ktime_hrtimer_settimeout(unsigned long cnt) return RT_EOK; } -/** - * @brief convert cnt from cputimer cnt to hrtimer cnt - * - * @param cnt - * @return unsigned long - */ static unsigned long _cnt_convert(unsigned long cnt) { - unsigned long rtn = 0; - unsigned long count = cnt - rt_ktime_cputimer_getcnt(); + unsigned long count; + rt_uint64_t src_res; + rt_uint64_t event_res; + rt_uint64_t result; + + count = cnt - _clock_time_get_cnt(); if (count > (_HRTIMER_MAX_CNT / 2)) + { + return 0; + } + + src_res = rt_clock_time_get_res_scaled(); + event_res = rt_clock_hrtimer_getres(); + if (src_res == 0 || event_res == 0) + { return 0; + } + + result = ((rt_uint64_t)count * src_res) / event_res; - rtn = (count * rt_ktime_cputimer_getres()) / rt_ktime_hrtimer_getres(); - return rtn == 0 ? 1 : rtn; /* at least 1 */ + return result == 0 ? 1 : (unsigned long)result; } static void _sleep_timeout(void *parameter) { - struct rt_ktime_hrtimer *timer = parameter; + struct rt_clock_hrtimer *timer = parameter; rt_completion_done(&timer->completion); } -static void _insert_timer_to_list_locked(rt_ktime_hrtimer_t timer) +static void _insert_timer_to_list_locked(rt_clock_hrtimer_t timer) { - rt_ktime_hrtimer_t iter; + rt_clock_hrtimer_t iter; rt_list_for_each_entry(iter, &_timer_list, node) { - if (iter->timeout_cnt > timer->timeout_cnt) + if (_cnt_before(timer->timeout_cnt, iter->timeout_cnt)) { break; } @@ -112,17 +173,22 @@ static void _insert_timer_to_list_locked(rt_ktime_hrtimer_t timer) static void _hrtimer_process_locked(void) { - rt_ktime_hrtimer_t timer; + rt_clock_hrtimer_t timer; - for (timer = _first_hrtimer(); - (timer != RT_NULL) && (timer->timeout_cnt <= rt_ktime_cputimer_getcnt()); - timer = _first_hrtimer()) + while ((timer = _first_hrtimer()) != RT_NULL) { + unsigned long now = _clock_time_get_cnt(); + + if (_cnt_before(now, timer->timeout_cnt)) + { + break; + } + rt_list_remove(&(timer->node)); if (timer->flag & RT_TIMER_FLAG_PERIODIC) { - timer->timeout_cnt = timer->delay_cnt + rt_ktime_cputimer_getcnt(); + timer->timeout_cnt = timer->delay_cnt + now; _insert_timer_to_list_locked(timer); } else @@ -139,8 +205,8 @@ static void _hrtimer_process_locked(void) static void _set_next_timeout_locked(void) { - rt_ktime_hrtimer_t timer; - rt_ubase_t next_timeout_hrtimer_cnt; + rt_clock_hrtimer_t timer; + rt_ubase_t next_timeout_cnt; rt_bool_t find_next; do @@ -148,10 +214,10 @@ static void _set_next_timeout_locked(void) find_next = RT_FALSE; if ((timer = _first_hrtimer()) != RT_NULL) { - next_timeout_hrtimer_cnt = _cnt_convert(timer->timeout_cnt); - if (next_timeout_hrtimer_cnt > 0) + next_timeout_cnt = _cnt_convert(timer->timeout_cnt); + if (next_timeout_cnt > 0) { - rt_ktime_hrtimer_settimeout(next_timeout_hrtimer_cnt); + rt_clock_hrtimer_settimeout(next_timeout_cnt); } else { @@ -163,7 +229,7 @@ static void _set_next_timeout_locked(void) while (find_next); } -void rt_ktime_hrtimer_process(void) +void rt_clock_hrtimer_process(void) { rt_base_t level = rt_spin_lock_irqsave(&_spinlock); @@ -173,17 +239,16 @@ void rt_ktime_hrtimer_process(void) rt_spin_unlock_irqrestore(&_spinlock, level); } -void rt_ktime_hrtimer_init(rt_ktime_hrtimer_t timer, +void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer, const char *name, rt_uint8_t flag, void (*timeout)(void *parameter), void *parameter) { - /* parameter check */ RT_ASSERT(timer != RT_NULL); RT_ASSERT(timeout != RT_NULL); - rt_memset(timer, 0, sizeof(struct rt_ktime_hrtimer)); + rt_memset(timer, 0, sizeof(struct rt_clock_hrtimer)); timer->flag = flag & ~RT_TIMER_FLAG_ACTIVATED; timer->timeout_func = timeout; @@ -193,16 +258,15 @@ void rt_ktime_hrtimer_init(rt_ktime_hrtimer_t timer, rt_completion_init(&timer->completion); } -rt_err_t rt_ktime_hrtimer_start(rt_ktime_hrtimer_t timer, unsigned long delay_cnt) +rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long delay_cnt) { rt_base_t level; - /* parameter check */ RT_ASSERT(timer != RT_NULL); RT_ASSERT(delay_cnt < (_HRTIMER_MAX_CNT / 2)); timer->delay_cnt = delay_cnt; - timer->timeout_cnt = timer->delay_cnt + rt_ktime_cputimer_getcnt(); + timer->timeout_cnt = timer->delay_cnt + _clock_time_get_cnt(); level = rt_spin_lock_irqsave(&_spinlock); @@ -220,11 +284,11 @@ rt_err_t rt_ktime_hrtimer_start(rt_ktime_hrtimer_t timer, unsigned long delay_cn return RT_EOK; } -rt_err_t rt_ktime_hrtimer_stop(rt_ktime_hrtimer_t timer) +rt_err_t rt_clock_hrtimer_stop(rt_clock_hrtimer_t timer) { rt_base_t level; - RT_ASSERT(timer != RT_NULL); /* timer check */ + RT_ASSERT(timer != RT_NULL); level = rt_spin_lock_irqsave(&_spinlock); @@ -243,17 +307,15 @@ rt_err_t rt_ktime_hrtimer_stop(rt_ktime_hrtimer_t timer) return RT_EOK; } -rt_err_t rt_ktime_hrtimer_control(rt_ktime_hrtimer_t timer, int cmd, void *arg) +rt_err_t rt_clock_hrtimer_control(rt_clock_hrtimer_t timer, int cmd, void *arg) { rt_base_t level; - /* parameter check */ RT_ASSERT(timer != RT_NULL); level = rt_spin_lock_irqsave(&_spinlock); switch (cmd) { - case RT_TIMER_CTRL_GET_TIME: *(unsigned long *)arg = timer->delay_cnt; break; @@ -261,7 +323,7 @@ rt_err_t rt_ktime_hrtimer_control(rt_ktime_hrtimer_t timer, int cmd, void *arg) case RT_TIMER_CTRL_SET_TIME: RT_ASSERT((*(unsigned long *)arg) < (_HRTIMER_MAX_CNT / 2)); timer->delay_cnt = *(unsigned long *)arg; - timer->timeout_cnt = *(unsigned long *)arg + rt_ktime_cputimer_getcnt(); + timer->timeout_cnt = *(unsigned long *)arg + _clock_time_get_cnt(); break; case RT_TIMER_CTRL_SET_ONESHOT: @@ -275,12 +337,10 @@ rt_err_t rt_ktime_hrtimer_control(rt_ktime_hrtimer_t timer, int cmd, void *arg) case RT_TIMER_CTRL_GET_STATE: if (timer->flag & RT_TIMER_FLAG_ACTIVATED) { - /*timer is start and run*/ *(rt_uint32_t *)arg = RT_TIMER_FLAG_ACTIVATED; } else { - /*timer is stop*/ *(rt_uint32_t *)arg = RT_TIMER_FLAG_DEACTIVATED; } break; @@ -289,7 +349,10 @@ rt_err_t rt_ktime_hrtimer_control(rt_ktime_hrtimer_t timer, int cmd, void *arg) *(unsigned long *)arg = timer->timeout_cnt; break; case RT_TIMER_CTRL_GET_FUNC: - arg = (void *)timer->timeout_func; + if (arg != RT_NULL) + { + *(void **)arg = (void *)timer->timeout_func; + } break; case RT_TIMER_CTRL_SET_FUNC: @@ -312,21 +375,17 @@ rt_err_t rt_ktime_hrtimer_control(rt_ktime_hrtimer_t timer, int cmd, void *arg) return RT_EOK; } -rt_err_t rt_ktime_hrtimer_detach(rt_ktime_hrtimer_t timer) +rt_err_t rt_clock_hrtimer_detach(rt_clock_hrtimer_t timer) { rt_base_t level; - /* parameter check */ RT_ASSERT(timer != RT_NULL); - /* notify the timer stop event */ rt_completion_wakeup_by_errno(&timer->completion, RT_ERROR); level = rt_spin_lock_irqsave(&_spinlock); - /* stop timer */ timer->flag &= ~RT_TIMER_FLAG_ACTIVATED; - /* when interrupted */ if (timer->error == -RT_EINTR || timer->error == RT_EINTR) { rt_list_remove(&timer->node); @@ -338,49 +397,61 @@ rt_err_t rt_ktime_hrtimer_detach(rt_ktime_hrtimer_t timer) return RT_EOK; } -/************************** delay ***************************/ - -void rt_ktime_hrtimer_delay_init(struct rt_ktime_hrtimer *timer) +void rt_clock_hrtimer_delay_init(struct rt_clock_hrtimer *timer) { - rt_ktime_hrtimer_init(timer, "hrtimer_sleep", RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_HARD_TIMER, + rt_clock_hrtimer_init(timer, "hrtimer_sleep", RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_HARD_TIMER, _sleep_timeout, timer); } -void rt_ktime_hrtimer_delay_detach(struct rt_ktime_hrtimer *timer) +void rt_clock_hrtimer_delay_detach(struct rt_clock_hrtimer *timer) { - rt_ktime_hrtimer_detach(timer); + rt_clock_hrtimer_detach(timer); } -rt_err_t rt_ktime_hrtimer_sleep(struct rt_ktime_hrtimer *timer, unsigned long cnt) +rt_err_t rt_clock_hrtimer_sleep(struct rt_clock_hrtimer *timer, unsigned long cnt) { rt_err_t err; if (cnt == 0) + { return -RT_EINVAL; + } - err = rt_ktime_hrtimer_start(timer, cnt); + err = rt_clock_hrtimer_start(timer, cnt); if (err) + { return err; + } err = rt_completion_wait_flags(&(timer->completion), RT_WAITING_FOREVER, RT_INTERRUPTIBLE); - rt_ktime_hrtimer_keep_errno(timer, err); + rt_clock_hrtimer_keep_errno(timer, err); return err; } -rt_err_t rt_ktime_hrtimer_ndelay(struct rt_ktime_hrtimer *timer, unsigned long ns) +rt_err_t rt_clock_hrtimer_ndelay(struct rt_clock_hrtimer *timer, unsigned long ns) +{ + rt_uint64_t res = rt_clock_time_get_res_scaled(); + if (res == 0) + { + return -RT_ERROR; + } + + return rt_clock_hrtimer_sleep(timer, (ns * RT_CLOCK_TIME_RESMUL) / res); +} + +rt_err_t rt_clock_hrtimer_udelay(struct rt_clock_hrtimer *timer, unsigned long us) { - rt_uint64_t res = rt_ktime_cputimer_getres(); - return rt_ktime_hrtimer_sleep(timer, (ns * RT_KTIME_RESMUL) / res); + return rt_clock_hrtimer_ndelay(timer, us * 1000); } -rt_err_t rt_ktime_hrtimer_udelay(struct rt_ktime_hrtimer *timer, unsigned long us) +rt_err_t rt_clock_hrtimer_mdelay(struct rt_clock_hrtimer *timer, unsigned long ms) { - return rt_ktime_hrtimer_ndelay(timer, us * 1000); + return rt_clock_hrtimer_ndelay(timer, ms * 1000000); } -rt_err_t rt_ktime_hrtimer_mdelay(struct rt_ktime_hrtimer *timer, unsigned long ms) +void rt_clock_time_event_isr(void) { - return rt_ktime_hrtimer_ndelay(timer, ms * 1000000); + rt_clock_hrtimer_process(); } diff --git a/components/drivers/hwtimer/hwtimer-arm_arch.c b/components/drivers/clock_time/clock_time_arm_arch.c similarity index 100% rename from components/drivers/hwtimer/hwtimer-arm_arch.c rename to components/drivers/clock_time/clock_time_arm_arch.c diff --git a/components/drivers/clock_time/clock_time_core.c b/components/drivers/clock_time/clock_time_core.c new file mode 100644 index 0000000000..2682270ba3 --- /dev/null +++ b/components/drivers/clock_time/clock_time_core.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-01 RT-Thread Clock time core + */ + +#include +#include +#include + +#include + +#define CLOCK_TIME_NSEC_PER_SEC (1000000000ULL) + +static rt_uint64_t _clock_time_tick_get_freq(struct rt_clock_time_device *dev) +{ + RT_UNUSED(dev); + return RT_TICK_PER_SECOND; +} + +static rt_uint64_t _clock_time_tick_get_counter(struct rt_clock_time_device *dev) +{ + RT_UNUSED(dev); + return (rt_uint64_t)rt_tick_get(); +} + +static rt_err_t _clock_time_tick_set_timeout(struct rt_clock_time_device *dev, rt_uint64_t delta) +{ + RT_UNUSED(dev); + RT_UNUSED(delta); + return -RT_ENOSYS; +} + +static const struct rt_clock_time_ops _clock_time_tick_ops = +{ + _clock_time_tick_get_freq, + _clock_time_tick_get_counter, + _clock_time_tick_set_timeout, +}; + +static struct rt_clock_time_device _clock_time_tick_dev = +{ + .ops = &_clock_time_tick_ops, + .res_scale = RT_CLOCK_TIME_RESMUL, + .caps = RT_CLOCK_TIME_CAP_SOURCE, +}; + +static struct rt_clock_time_device * _clock_time_default_source = &_clock_time_tick_dev; +static struct rt_clock_time_device * _clock_time_default_event = RT_NULL; + +rt_weak void rt_clock_time_source_init(void) +{ + return; +} + +static rt_uint64_t _clock_time_get_res_scaled(struct rt_clock_time_device *dev) +{ + rt_uint64_t freq; + rt_uint64_t scale; + + if (dev == RT_NULL || dev->ops == RT_NULL || dev->ops->get_freq == RT_NULL) + { + return 0; + } + + freq = dev->ops->get_freq(dev); + if (freq == 0) + { + return 0; + } + + scale = dev->res_scale ? dev->res_scale : RT_CLOCK_TIME_RESMUL; + + return (CLOCK_TIME_NSEC_PER_SEC * scale) / freq; +} + +rt_err_t rt_clock_time_device_register(struct rt_clock_time_device *dev, const char *name, rt_uint8_t caps) +{ + rt_err_t result = RT_EOK; + + RT_ASSERT(dev != RT_NULL); + RT_ASSERT(dev->ops != RT_NULL); + + dev->caps = caps; + if (dev->res_scale == 0) + { + dev->res_scale = RT_CLOCK_TIME_RESMUL; + } + + if (name != RT_NULL) + { + dev->parent.type = RT_Device_Class_Timer; + result = rt_device_register(&dev->parent, name, + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); + } + + if ((caps & RT_CLOCK_TIME_CAP_SOURCE) && _clock_time_default_source == &_clock_time_tick_dev) + { + _clock_time_default_source = dev; + } + + if ((caps & RT_CLOCK_TIME_CAP_EVENT) && _clock_time_default_event == RT_NULL) + { + _clock_time_default_event = dev; + } + + return result; +} + +void rt_clock_time_set_default_source(struct rt_clock_time_device *dev) +{ + if (dev != RT_NULL) + { + _clock_time_default_source = dev; + } +} + +void rt_clock_time_set_default_event(struct rt_clock_time_device *dev) +{ + if (dev != RT_NULL) + { + _clock_time_default_event = dev; + } +} + +struct rt_clock_time_device *rt_clock_time_get_default_source(void) +{ + return _clock_time_default_source ? _clock_time_default_source : &_clock_time_tick_dev; +} + +struct rt_clock_time_device *rt_clock_time_get_default_event(void) +{ + return _clock_time_default_event; +} + +rt_uint64_t rt_clock_time_get_freq(void) +{ + struct rt_clock_time_device *src = rt_clock_time_get_default_source(); + + if (src == RT_NULL || src->ops == RT_NULL || src->ops->get_freq == RT_NULL) + { + return 0; + } + + return src->ops->get_freq(src); +} + +rt_uint64_t rt_clock_time_get_counter(void) +{ + struct rt_clock_time_device *src = rt_clock_time_get_default_source(); + + if (src == RT_NULL || src->ops == RT_NULL || src->ops->get_counter == RT_NULL) + { + return 0; + } + + return src->ops->get_counter(src); +} + +rt_uint64_t rt_clock_time_get_res_scaled(void) +{ + return _clock_time_get_res_scaled(rt_clock_time_get_default_source()); +} + +rt_uint64_t rt_clock_time_get_event_freq(void) +{ + struct rt_clock_time_device *event = rt_clock_time_get_default_event(); + + if (event == RT_NULL) + { + return rt_clock_time_get_freq(); + } + + if (event->ops == RT_NULL || event->ops->get_freq == RT_NULL) + { + return 0; + } + + return event->ops->get_freq(event); +} + +rt_uint64_t rt_clock_time_get_event_res_scaled(void) +{ + struct rt_clock_time_device *event = rt_clock_time_get_default_event(); + + if (event == RT_NULL) + { + return rt_clock_time_get_res_scaled(); + } + + return _clock_time_get_res_scaled(event); +} + +rt_uint64_t rt_clock_time_counter_to_ns(rt_uint64_t cnt) +{ + rt_uint64_t res = rt_clock_time_get_res_scaled(); + + if (res == 0) + { + return 0; + } + + return (cnt * res) / RT_CLOCK_TIME_RESMUL; +} + +rt_uint64_t rt_clock_time_ns_to_counter(rt_uint64_t ns) +{ + rt_uint64_t res = rt_clock_time_get_res_scaled(); + + if (res == 0) + { + return 0; + } + + return (ns * RT_CLOCK_TIME_RESMUL) / res; +} + +rt_err_t rt_clock_time_set_timeout(rt_uint64_t delta) +{ + struct rt_clock_time_device *event = rt_clock_time_get_default_event(); + + if (event == RT_NULL || event->ops == RT_NULL || event->ops->set_timeout == RT_NULL) + { + return -RT_ENOSYS; + } + + return event->ops->set_timeout(event, delta); +} diff --git a/components/drivers/hwtimer/hwtimer.c b/components/drivers/clock_time/clock_timer.c similarity index 52% rename from components/drivers/hwtimer/hwtimer.c rename to components/drivers/clock_time/clock_timer.c index 1b2792558d..94e06ccb11 100644 --- a/components/drivers/hwtimer/hwtimer.c +++ b/components/drivers/clock_time/clock_timer.c @@ -10,19 +10,20 @@ #include #include +#include -#define DBG_TAG "hwtimer" +#define DBG_TAG "clock_timer" #define DBG_LVL DBG_INFO #include #ifdef RT_USING_DM -void (*rt_device_hwtimer_us_delay)(rt_uint32_t us) = RT_NULL; +void (*rt_clock_timer_us_delay)(rt_uint32_t us) = RT_NULL; -void rt_hw_us_delay(rt_uint32_t us) +rt_weak void rt_hw_us_delay(rt_uint32_t us) { - if (rt_device_hwtimer_us_delay) + if (rt_clock_timer_us_delay) { - rt_device_hwtimer_us_delay(us); + rt_clock_timer_us_delay(us); } else { @@ -33,7 +34,75 @@ void rt_hw_us_delay(rt_uint32_t us) } #endif /* RT_USING_DM */ -rt_inline rt_uint32_t timeout_calc(rt_hwtimer_t *timer, rt_hwtimerval_t *tv) +static struct rt_clock_time_device _clock_timer_clock_dev; +static rt_clock_timer_t *_clock_timer_owner = RT_NULL; + +static rt_uint64_t _clock_timer_clock_get_freq(struct rt_clock_time_device *dev) +{ + RT_UNUSED(dev); + if (_clock_timer_owner == RT_NULL) + { + return 0; + } + + return (rt_uint64_t)_clock_timer_owner->freq; +} + +static rt_uint64_t _clock_timer_clock_get_counter(struct rt_clock_time_device *dev) +{ + RT_UNUSED(dev); + if (_clock_timer_owner == RT_NULL || + _clock_timer_owner->ops == RT_NULL || + _clock_timer_owner->ops->count_get == RT_NULL) + { + return 0; + } + + return (rt_uint64_t)_clock_timer_owner->ops->count_get(_clock_timer_owner); +} + +static rt_err_t _clock_timer_clock_set_timeout(struct rt_clock_time_device *dev, rt_uint64_t delta) +{ + RT_UNUSED(dev); + if (_clock_timer_owner == RT_NULL || + _clock_timer_owner->ops == RT_NULL || + _clock_timer_owner->ops->start == RT_NULL) + { + return -RT_ENOSYS; + } + + if (delta == 0) + { + if (_clock_timer_owner->ops->stop) + { + _clock_timer_owner->ops->stop(_clock_timer_owner); + } + return RT_EOK; + } + + if (_clock_timer_owner->ops->stop) + { + _clock_timer_owner->ops->stop(_clock_timer_owner); + } + + _clock_timer_owner->mode = CLOCK_TIMER_MODE_ONESHOT; + + if (delta > (rt_uint64_t)RT_UINT32_MAX) + { + delta = RT_UINT32_MAX; + } + + return _clock_timer_owner->ops->start(_clock_timer_owner, (rt_uint32_t)delta, CLOCK_TIMER_MODE_ONESHOT); +} + +static const struct rt_clock_time_ops _clock_timer_clock_ops = +{ + _clock_timer_clock_get_freq, + _clock_timer_clock_get_counter, + _clock_timer_clock_set_timeout, +}; + +rt_inline rt_uint32_t timeout_calc(rt_clock_timer_t *timer, rt_clock_timerval_t *tv) { float overflow; float timeout; @@ -91,12 +160,12 @@ rt_inline rt_uint32_t timeout_calc(rt_hwtimer_t *timer, rt_hwtimerval_t *tv) return counter; } -static rt_err_t rt_hwtimer_init(struct rt_device *dev) +static rt_err_t rt_clock_timer_init(struct rt_device *dev) { rt_err_t result = RT_EOK; - rt_hwtimer_t *timer; + rt_clock_timer_t *timer; - timer = (rt_hwtimer_t *)dev; + timer = (rt_clock_timer_t *)dev; /* try to change to 1MHz */ if ((1000000 <= timer->info->maxfreq) && (1000000 >= timer->info->minfreq)) { @@ -106,7 +175,7 @@ static rt_err_t rt_hwtimer_init(struct rt_device *dev) { timer->freq = timer->info->minfreq; } - timer->mode = HWTIMER_MODE_ONESHOT; + timer->mode = CLOCK_TIMER_MODE_ONESHOT; timer->cycles = 0; timer->overflow = 0; @@ -122,15 +191,15 @@ static rt_err_t rt_hwtimer_init(struct rt_device *dev) return result; } -static rt_err_t rt_hwtimer_open(struct rt_device *dev, rt_uint16_t oflag) +static rt_err_t rt_clock_timer_open(struct rt_device *dev, rt_uint16_t oflag) { rt_err_t result = RT_EOK; - rt_hwtimer_t *timer; + rt_clock_timer_t *timer; - timer = (rt_hwtimer_t *)dev; + timer = (rt_clock_timer_t *)dev; if (timer->ops->control != RT_NULL) { - timer->ops->control(timer, HWTIMER_CTRL_FREQ_SET, &timer->freq); + timer->ops->control(timer, CLOCK_TIMER_CTRL_FREQ_SET, &timer->freq); } else { @@ -140,12 +209,12 @@ static rt_err_t rt_hwtimer_open(struct rt_device *dev, rt_uint16_t oflag) return result; } -static rt_err_t rt_hwtimer_close(struct rt_device *dev) +static rt_err_t rt_clock_timer_close(struct rt_device *dev) { rt_err_t result = RT_EOK; - rt_hwtimer_t *timer; + rt_clock_timer_t *timer; - timer = (rt_hwtimer_t*)dev; + timer = (rt_clock_timer_t*)dev; if (timer->ops->init != RT_NULL) { timer->ops->init(timer, 0); @@ -161,16 +230,16 @@ static rt_err_t rt_hwtimer_close(struct rt_device *dev) return result; } -static rt_ssize_t rt_hwtimer_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size) +static rt_ssize_t rt_clock_timer_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size) { - rt_hwtimer_t *timer; - rt_hwtimerval_t tv; + rt_clock_timer_t *timer; + rt_clock_timerval_t tv; rt_uint32_t cnt; rt_base_t level; rt_int32_t overflow; float t; - timer = (rt_hwtimer_t *)dev; + timer = (rt_clock_timer_t *)dev; if (timer->ops->count_get == RT_NULL) return 0; @@ -179,11 +248,11 @@ static rt_ssize_t rt_hwtimer_read(struct rt_device *dev, rt_off_t pos, void *buf overflow = timer->overflow; rt_hw_interrupt_enable(level); - if (timer->info->cntmode == HWTIMER_CNTMODE_DW) + if (timer->info->cntmode == CLOCK_TIMER_CNTMODE_DW) { cnt = (rt_uint32_t)(timer->freq * timer->period_sec) - cnt; } - if (timer->mode == HWTIMER_MODE_ONESHOT) + if (timer->mode == CLOCK_TIMER_MODE_ONESHOT) { overflow = 0; } @@ -197,18 +266,18 @@ static rt_ssize_t rt_hwtimer_read(struct rt_device *dev, rt_off_t pos, void *buf return size; } -static rt_ssize_t rt_hwtimer_write(struct rt_device *dev, rt_off_t pos, const void *buffer, rt_size_t size) +static rt_ssize_t rt_clock_timer_write(struct rt_device *dev, rt_off_t pos, const void *buffer, rt_size_t size) { rt_base_t level; rt_uint32_t t; - rt_hwtimer_mode_t opm = HWTIMER_MODE_PERIOD; - rt_hwtimer_t *timer; + rt_clock_timer_mode_t opm = CLOCK_TIMER_MODE_PERIOD; + rt_clock_timer_t *timer; - timer = (rt_hwtimer_t *)dev; + timer = (rt_clock_timer_t *)dev; if ((timer->ops->start == RT_NULL) || (timer->ops->stop == RT_NULL)) return 0; - if (size != sizeof(rt_hwtimerval_t)) + if (size != sizeof(rt_clock_timerval_t)) return 0; timer->ops->stop(timer); @@ -217,10 +286,10 @@ static rt_ssize_t rt_hwtimer_write(struct rt_device *dev, rt_off_t pos, const vo timer->overflow = 0; rt_hw_interrupt_enable(level); - t = timeout_calc(timer, (rt_hwtimerval_t*)buffer); - if ((timer->cycles <= 1) && (timer->mode == HWTIMER_MODE_ONESHOT)) + t = timeout_calc(timer, (rt_clock_timerval_t*)buffer); + if ((timer->cycles <= 1) && (timer->mode == CLOCK_TIMER_MODE_ONESHOT)) { - opm = HWTIMER_MODE_ONESHOT; + opm = CLOCK_TIMER_MODE_ONESHOT; } if (timer->ops->start(timer, t, opm) != RT_EOK) @@ -229,17 +298,17 @@ static rt_ssize_t rt_hwtimer_write(struct rt_device *dev, rt_off_t pos, const vo return size; } -static rt_err_t rt_hwtimer_control(struct rt_device *dev, int cmd, void *args) +static rt_err_t rt_clock_timer_control(struct rt_device *dev, int cmd, void *args) { rt_base_t level; rt_err_t result = RT_EOK; - rt_hwtimer_t *timer; + rt_clock_timer_t *timer; - timer = (rt_hwtimer_t *)dev; + timer = (rt_clock_timer_t *)dev; switch (cmd) { - case HWTIMER_CTRL_STOP: + case CLOCK_TIMER_CTRL_STOP: { if (timer->ops->stop != RT_NULL) { @@ -251,7 +320,7 @@ static rt_err_t rt_hwtimer_control(struct rt_device *dev, int cmd, void *args) } } break; - case HWTIMER_CTRL_FREQ_SET: + case CLOCK_TIMER_CTRL_FREQ_SET: { rt_int32_t *f; @@ -285,7 +354,7 @@ static rt_err_t rt_hwtimer_control(struct rt_device *dev, int cmd, void *args) } } break; - case HWTIMER_CTRL_INFO_GET: + case CLOCK_TIMER_CTRL_INFO_GET: { if (args == RT_NULL) { @@ -293,12 +362,12 @@ static rt_err_t rt_hwtimer_control(struct rt_device *dev, int cmd, void *args) break; } - *((struct rt_hwtimer_info*)args) = *timer->info; + *((struct rt_clock_timer_info*)args) = *timer->info; } break; - case HWTIMER_CTRL_MODE_SET: + case CLOCK_TIMER_CTRL_MODE_SET: { - rt_hwtimer_mode_t *m; + rt_clock_timer_mode_t *m; if (args == RT_NULL) { @@ -306,9 +375,9 @@ static rt_err_t rt_hwtimer_control(struct rt_device *dev, int cmd, void *args) break; } - m = (rt_hwtimer_mode_t*)args; + m = (rt_clock_timer_mode_t*)args; - if ((*m != HWTIMER_MODE_ONESHOT) && (*m != HWTIMER_MODE_PERIOD)) + if ((*m != CLOCK_TIMER_MODE_ONESHOT) && (*m != CLOCK_TIMER_MODE_PERIOD)) { result = -RT_ERROR; break; @@ -335,7 +404,7 @@ static rt_err_t rt_hwtimer_control(struct rt_device *dev, int cmd, void *args) return result; } -void rt_device_hwtimer_isr(rt_hwtimer_t *timer) +void rt_clock_timer_isr(rt_clock_timer_t *timer) { rt_base_t level; @@ -356,7 +425,7 @@ void rt_device_hwtimer_isr(rt_hwtimer_t *timer) rt_hw_interrupt_enable(level); - if (timer->mode == HWTIMER_MODE_ONESHOT) + if (timer->mode == CLOCK_TIMER_MODE_ONESHOT) { if (timer->ops->stop != RT_NULL) { @@ -364,9 +433,14 @@ void rt_device_hwtimer_isr(rt_hwtimer_t *timer) } } + if (timer == _clock_timer_owner) + { + rt_clock_time_event_isr(); + } + if (timer->parent.rx_indicate != RT_NULL) { - timer->parent.rx_indicate(&timer->parent, sizeof(struct rt_hwtimerval)); + timer->parent.rx_indicate(&timer->parent, sizeof(struct rt_clock_timerval)); } } else @@ -376,20 +450,22 @@ void rt_device_hwtimer_isr(rt_hwtimer_t *timer) } #ifdef RT_USING_DEVICE_OPS -const static struct rt_device_ops hwtimer_ops = +const static struct rt_device_ops clock_timer_ops = { - rt_hwtimer_init, - rt_hwtimer_open, - rt_hwtimer_close, - rt_hwtimer_read, - rt_hwtimer_write, - rt_hwtimer_control + rt_clock_timer_init, + rt_clock_timer_open, + rt_clock_timer_close, + rt_clock_timer_read, + rt_clock_timer_write, + rt_clock_timer_control }; #endif -rt_err_t rt_device_hwtimer_register(rt_hwtimer_t *timer, const char *name, void *user_data) +rt_err_t rt_clock_timer_register(rt_clock_timer_t *timer, const char *name, void *user_data) { struct rt_device *device; + rt_err_t result; + rt_uint8_t caps = 0; RT_ASSERT(timer != RT_NULL); RT_ASSERT(timer->ops != RT_NULL); @@ -402,16 +478,50 @@ rt_err_t rt_device_hwtimer_register(rt_hwtimer_t *timer, const char *name, void device->tx_complete = RT_NULL; #ifdef RT_USING_DEVICE_OPS - device->ops = &hwtimer_ops; + device->ops = &clock_timer_ops; #else - device->init = rt_hwtimer_init; - device->open = rt_hwtimer_open; - device->close = rt_hwtimer_close; - device->read = rt_hwtimer_read; - device->write = rt_hwtimer_write; - device->control = rt_hwtimer_control; + device->init = rt_clock_timer_init; + device->open = rt_clock_timer_open; + device->close = rt_clock_timer_close; + device->read = rt_clock_timer_read; + device->write = rt_clock_timer_write; + device->control = rt_clock_timer_control; #endif device->user_data = user_data; - return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); + result = rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); + if (result != RT_EOK) + { + return result; + } + + if (timer->ops->start) + { + caps |= RT_CLOCK_TIME_CAP_EVENT; + } + + if (caps && _clock_timer_owner == RT_NULL) + { + char ct_name[RT_NAME_MAX]; + + _clock_timer_owner = timer; + _clock_timer_clock_dev.ops = &_clock_timer_clock_ops; + _clock_timer_clock_dev.res_scale = RT_CLOCK_TIME_RESMUL; + _clock_timer_clock_dev.caps = caps; + + rt_snprintf(ct_name, sizeof(ct_name), "clock_time_%s", name); + rt_clock_time_device_register(&_clock_timer_clock_dev, ct_name, caps); + + if ((caps & RT_CLOCK_TIME_CAP_EVENT) && rt_clock_time_get_default_event() == RT_NULL) + { + rt_clock_time_set_default_event(&_clock_timer_clock_dev); + if (!(device->flag & RT_DEVICE_FLAG_ACTIVATED)) + { + rt_device_init(device); + rt_device_open(device, RT_DEVICE_OFLAG_RDWR); + } + } + } + + return RT_EOK; } diff --git a/components/drivers/cputime/Kconfig b/components/drivers/cputime/Kconfig deleted file mode 100644 index 97c2c46259..0000000000 --- a/components/drivers/cputime/Kconfig +++ /dev/null @@ -1,34 +0,0 @@ -config RT_USING_CPUTIME - bool "Enable CPU time for high resolution clock counter" - default n - help - When enable this option, the BSP should provide a rt_clock_cputime_ops - for CPU time by: - const static struct rt_clock_cputime_ops _ops = {...}; - clock_cpu_setops(&_ops); - - Then user can use high resolution clock counter with: - - ts1 = clock_cpu_gettime(); - ts2 = clock_cpu_gettime(); - - /* and get the ms of delta tick with API: */ - ms_tick = clock_cpu_millisecond(t2 - t1); - us_tick = clock_cpu_microsecond(t2 - t1); - -if RT_USING_CPUTIME - config RT_USING_CPUTIME_CORTEXM - bool "Support Cortex-M CPU" - default y - depends on ARCH_ARM_CORTEX_M0 || ARCH_ARM_CORTEX_M3 || ARCH_ARM_CORTEX_M4 || ARCH_ARM_CORTEX_M7 - select PKG_USING_PERF_COUNTER - config RT_USING_CPUTIME_RISCV - bool "Use rdtime instructions for CPU time" - default y - depends on ARCH_RISCV64 - help - Some RISCV64 MCU Use rdtime instructions read CPU time. - config CPUTIME_TIMER_FREQ - int "CPUTIME timer freq" - default 0 -endif diff --git a/components/drivers/cputime/SConscript b/components/drivers/cputime/SConscript deleted file mode 100644 index 9fec4641e5..0000000000 --- a/components/drivers/cputime/SConscript +++ /dev/null @@ -1,18 +0,0 @@ -from building import * - -cwd = GetCurrentDir() -CPPPATH = [cwd + '/../include'] -src = Split(''' -cputime.c -cputimer.c -''') - -if GetDepend('RT_USING_CPUTIME_CORTEXM'): - src += ['cputime_cortexm.c'] - -if GetDepend('RT_USING_CPUTIME_RISCV'): - src += ['cputime_riscv.c'] - -group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_CPUTIME'], CPPPATH = CPPPATH) - -Return('group') diff --git a/components/drivers/cputime/cputime.c b/components/drivers/cputime/cputime.c deleted file mode 100644 index 42298ea98c..0000000000 --- a/components/drivers/cputime/cputime.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2017-12-23 Bernard first version - */ - -#include -#include -#include - -static const struct rt_clock_cputime_ops *_cputime_ops = RT_NULL; - -/** - * The clock_cpu_getres() function shall return the resolution of CPU time, the - * number of nanosecond per tick. - * - * @return the number of nanosecond per tick(x (1000UL * 1000)) - */ -uint64_t clock_cpu_getres(void) -{ - if (_cputime_ops) - return _cputime_ops->cputime_getres(); - - rt_set_errno(ENOSYS); - return 0; -} - -/** - * The clock_cpu_gettime() function shall return the current value of cpu time tick. - * - * @return the cpu tick - */ -uint64_t clock_cpu_gettime(void) -{ - if (_cputime_ops) - return _cputime_ops->cputime_gettime(); - - rt_set_errno(ENOSYS); - return 0; -} - -/** - * The clock_cpu_settimeout() fucntion set timeout time and timeout callback function - * The timeout callback function will be called when the timeout time is reached - * - * @param tick the Timeout tick - * @param timeout the Timeout function - * @param parameter the Parameters of timeout function - * - */ -int clock_cpu_settimeout(uint64_t tick, void (*timeout)(void *param), void *param) -{ - if (_cputime_ops) - return _cputime_ops->cputime_settimeout(tick, timeout, param); - - rt_set_errno(ENOSYS); - return 0; -} - -int clock_cpu_issettimeout(void) -{ - if (_cputime_ops) - return _cputime_ops->cputime_settimeout != RT_NULL; - return RT_FALSE; -} - -/** - * The clock_cpu_microsecond() fucntion shall return the microsecond according to - * cpu_tick parameter. - * - * @param cpu_tick the cpu tick - * - * @return the microsecond - */ -uint64_t clock_cpu_microsecond(uint64_t cpu_tick) -{ - uint64_t unit = clock_cpu_getres(); - - return (uint64_t)(((cpu_tick * unit) / (1000UL * 1000)) / 1000); -} - -/** - * The clock_cpu_microsecond() fucntion shall return the millisecond according to - * cpu_tick parameter. - * - * @param cpu_tick the cpu tick - * - * @return the millisecond - */ -uint64_t clock_cpu_millisecond(uint64_t cpu_tick) -{ - uint64_t unit = clock_cpu_getres(); - - return (uint64_t)(((cpu_tick * unit) / (1000UL * 1000)) / (1000UL * 1000)); -} - -/** - * The clock_cpu_seops() function shall set the ops of cpu time. - * - * @return always return 0. - */ -int clock_cpu_setops(const struct rt_clock_cputime_ops *ops) -{ - _cputime_ops = ops; - if (ops) - { - RT_ASSERT(ops->cputime_getres != RT_NULL); - RT_ASSERT(ops->cputime_gettime != RT_NULL); - } - - return 0; -} diff --git a/components/drivers/cputime/cputime_cortexm.c b/components/drivers/cputime/cputime_cortexm.c deleted file mode 100644 index 100910a9f9..0000000000 --- a/components/drivers/cputime/cputime_cortexm.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2017-12-23 Bernard first version - * 2022-06-14 Meco Man suuport pref_counter - */ - -#include -#include -#include - -#include -#ifdef PKG_USING_PERF_COUNTER -#include -#endif - -/* Use Cycle counter of Data Watchpoint and Trace Register for CPU time */ -static uint64_t cortexm_cputime_getres(void) -{ - uint64_t ret = 1000UL * 1000 * 1000; - - ret = (ret * (1000UL * 1000)) / SystemCoreClock; - return ret; -} - -static uint64_t cortexm_cputime_gettime(void) -{ -#ifdef PKG_USING_PERF_COUNTER - return get_system_ticks(); -#else - return DWT->CYCCNT; -#endif -} - -const static struct rt_clock_cputime_ops _cortexm_ops = -{ - cortexm_cputime_getres, - cortexm_cputime_gettime -}; - - -int cortexm_cputime_init(void) -{ -#ifdef PKG_USING_PERF_COUNTER - clock_cpu_setops(&_cortexm_ops); -#else - /* check support bit */ - if ((DWT->CTRL & (1UL << DWT_CTRL_NOCYCCNT_Pos)) == 0) - { - /* enable trace*/ - CoreDebug->DEMCR |= (1UL << CoreDebug_DEMCR_TRCENA_Pos); - - /* whether cycle counter not enabled */ - if ((DWT->CTRL & (1UL << DWT_CTRL_CYCCNTENA_Pos)) == 0) - { - /* enable cycle counter */ - DWT->CTRL |= (1UL << DWT_CTRL_CYCCNTENA_Pos); - } - - clock_cpu_setops(&_cortexm_ops); - } -#endif /* PKG_USING_PERF_COUNTER */ - return 0; -} -INIT_BOARD_EXPORT(cortexm_cputime_init); diff --git a/components/drivers/cputime/cputime_riscv.c b/components/drivers/cputime/cputime_riscv.c deleted file mode 100644 index 597157c226..0000000000 --- a/components/drivers/cputime/cputime_riscv.c +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include - -#include - -/* Use Cycle counter of Data Watchpoint and Trace Register for CPU time */ - -static uint64_t riscv_cputime_getres(void) -{ - uint64_t ret = 1000UL * 1000 * 1000; - - ret = (ret * (1000UL * 1000)) / CPUTIME_TIMER_FREQ; - return ret; -} - -static uint64_t riscv_cputime_gettime(void) -{ - uint64_t time_elapsed; - __asm__ __volatile__( - "rdtime %0" - : "=r"(time_elapsed)); - return time_elapsed; -} - -const static struct rt_clock_cputime_ops _riscv_ops = -{ - riscv_cputime_getres, - riscv_cputime_gettime -}; - -int riscv_cputime_init(void) -{ - clock_cpu_setops(&_riscv_ops); - return 0; -} -INIT_BOARD_EXPORT(riscv_cputime_init); diff --git a/components/drivers/cputime/cputimer.c b/components/drivers/cputime/cputimer.c deleted file mode 100644 index 0431833640..0000000000 --- a/components/drivers/cputime/cputimer.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2023-02-13 zhkag first version - * 2023-04-03 xqyjlj fix cputimer in multithreading - */ - -#include -#include -#include - -static rt_list_t _cputimer_list = RT_LIST_OBJECT_INIT(_cputimer_list); -static struct rt_cputimer *_cputimer_nowtimer = RT_NULL; - -static void _cputime_sleep_timeout(void *parameter) -{ - struct rt_semaphore *sem; - sem = (struct rt_semaphore *)parameter; - rt_sem_release(sem); -} - -static void _cputime_timeout_callback(void *parameter) -{ - struct rt_cputimer *timer; - timer = (struct rt_cputimer *)parameter; - rt_base_t level; - level = rt_hw_interrupt_disable(); - _cputimer_nowtimer = RT_NULL; - rt_list_remove(&(timer->row)); - rt_hw_interrupt_enable(level); - timer->timeout_func(timer->parameter); - - if (&_cputimer_list != _cputimer_list.prev) - { - struct rt_cputimer *t; - t = rt_list_entry(_cputimer_list.next, struct rt_cputimer, row); - clock_cpu_settimeout(t->timeout_tick, _cputime_timeout_callback, t); - } - else - { - clock_cpu_settimeout(RT_NULL, RT_NULL, RT_NULL); - } -} - -static void _set_next_timeout() -{ - struct rt_cputimer *t; - - if (&_cputimer_list != _cputimer_list.prev) - { - t = rt_list_entry((&_cputimer_list)->next, struct rt_cputimer, row); - if (_cputimer_nowtimer != RT_NULL) - { - if (t != _cputimer_nowtimer && t->timeout_tick < _cputimer_nowtimer->timeout_tick) - { - _cputimer_nowtimer = t; - clock_cpu_settimeout(t->timeout_tick, _cputime_timeout_callback, t); - } - } - else - { - _cputimer_nowtimer = t; - clock_cpu_settimeout(t->timeout_tick, _cputime_timeout_callback, t); - } - } - else - { - _cputimer_nowtimer = RT_NULL; - clock_cpu_settimeout(RT_NULL, RT_NULL, RT_NULL); - } -} - -void rt_cputimer_init(rt_cputimer_t timer, - const char *name, - void (*timeout)(void *parameter), - void *parameter, - rt_uint64_t tick, - rt_uint8_t flag) -{ - /* parameter check */ - RT_ASSERT(timer != RT_NULL); - RT_ASSERT(timeout != RT_NULL); - RT_ASSERT(clock_cpu_issettimeout() != RT_FALSE); - - /* set flag */ - timer->parent.flag = flag; - - /* set deactivated */ - timer->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED; - timer->timeout_func = timeout; - timer->parameter = parameter; - timer->timeout_tick = tick + clock_cpu_gettime(); - timer->init_tick = tick; - - rt_list_init(&(timer->row)); - rt_sem_init(&(timer->sem), "cputime", 0, RT_IPC_FLAG_PRIO); -} - -rt_err_t rt_cputimer_delete(rt_cputimer_t timer) -{ - rt_base_t level; - - /* parameter check */ - RT_ASSERT(timer != RT_NULL); - RT_ASSERT(clock_cpu_issettimeout() != RT_FALSE); - - /* disable interrupt */ - level = rt_hw_interrupt_disable(); - - rt_list_remove(&timer->row); - /* stop timer */ - timer->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED; - - /* enable interrupt */ - rt_hw_interrupt_enable(level); - - _set_next_timeout(); - - return RT_EOK; -} - -rt_err_t rt_cputimer_start(rt_cputimer_t timer) -{ - rt_list_t *timer_list; - rt_base_t level; - - /* parameter check */ - RT_ASSERT(timer != RT_NULL); - RT_ASSERT(clock_cpu_issettimeout() != RT_FALSE); - - /* stop timer firstly */ - level = rt_hw_interrupt_disable(); - /* remove timer from list */ - - rt_list_remove(&timer->row); - /* change status of timer */ - timer->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED; - - timer_list = &_cputimer_list; - - for (; timer_list != _cputimer_list.prev; - timer_list = timer_list->next) - { - struct rt_cputimer *t; - rt_list_t *p = timer_list->next; - - t = rt_list_entry(p, struct rt_cputimer, row); - - if ((t->timeout_tick - timer->timeout_tick) == 0) - { - continue; - } - else if ((t->timeout_tick - timer->timeout_tick) < 0x7fffffffffffffff) - { - break; - } - } - - rt_list_insert_after(timer_list, &(timer->row)); - - timer->parent.flag |= RT_TIMER_FLAG_ACTIVATED; - - _set_next_timeout(); - /* enable interrupt */ - rt_hw_interrupt_enable(level); - - return RT_EOK; -} - -rt_err_t rt_cputimer_stop(rt_cputimer_t timer) -{ - rt_base_t level; - - /* disable interrupt */ - level = rt_hw_interrupt_disable(); - - /* timer check */ - RT_ASSERT(timer != RT_NULL); - RT_ASSERT(clock_cpu_issettimeout() != RT_FALSE); - - if (!(timer->parent.flag & RT_TIMER_FLAG_ACTIVATED)) - { - rt_hw_interrupt_enable(level); - return -RT_ERROR; - } - - rt_list_remove(&timer->row); - /* change status */ - timer->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED; - - _set_next_timeout(); - /* enable interrupt */ - rt_hw_interrupt_enable(level); - - return RT_EOK; -} - -rt_err_t rt_cputimer_control(rt_cputimer_t timer, int cmd, void *arg) -{ - rt_base_t level; - - /* parameter check */ - RT_ASSERT(timer != RT_NULL); - RT_ASSERT(clock_cpu_issettimeout() != RT_FALSE); - - level = rt_hw_interrupt_disable(); - switch (cmd) - { - case RT_TIMER_CTRL_GET_TIME: - *(rt_uint64_t *)arg = timer->init_tick; - break; - - case RT_TIMER_CTRL_SET_TIME: - RT_ASSERT((*(rt_uint64_t *)arg) < 0x7fffffffffffffff); - timer->init_tick = *(rt_uint64_t *)arg; - timer->timeout_tick = *(rt_uint64_t *)arg + clock_cpu_gettime(); - break; - - case RT_TIMER_CTRL_SET_ONESHOT: - timer->parent.flag &= ~RT_TIMER_FLAG_PERIODIC; - break; - - case RT_TIMER_CTRL_SET_PERIODIC: - timer->parent.flag |= RT_TIMER_FLAG_PERIODIC; - break; - - case RT_TIMER_CTRL_GET_STATE: - if (timer->parent.flag & RT_TIMER_FLAG_ACTIVATED) - { - /*timer is start and run*/ - *(rt_uint32_t *)arg = RT_TIMER_FLAG_ACTIVATED; - } - else - { - /*timer is stop*/ - *(rt_uint32_t *)arg = RT_TIMER_FLAG_DEACTIVATED; - } - break; - - case RT_TIMER_CTRL_GET_REMAIN_TIME: - *(rt_uint64_t *)arg = timer->timeout_tick; - break; - case RT_TIMER_CTRL_GET_FUNC: - arg = (void *)timer->timeout_func; - break; - - case RT_TIMER_CTRL_SET_FUNC: - timer->timeout_func = (void (*)(void *))arg; - break; - - case RT_TIMER_CTRL_GET_PARM: - *(void **)arg = timer->parameter; - break; - - case RT_TIMER_CTRL_SET_PARM: - timer->parameter = arg; - break; - - default: - break; - } - rt_hw_interrupt_enable(level); - - return RT_EOK; -} - -rt_err_t rt_cputimer_detach(rt_cputimer_t timer) -{ - rt_base_t level; - - /* parameter check */ - RT_ASSERT(timer != RT_NULL); - RT_ASSERT(clock_cpu_issettimeout() != RT_FALSE); - - /* disable interrupt */ - level = rt_hw_interrupt_disable(); - - rt_list_remove(&timer->row); - /* stop timer */ - timer->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED; - - _set_next_timeout(); - /* enable interrupt */ - rt_hw_interrupt_enable(level); - - rt_sem_detach(&(timer->sem)); - - return RT_EOK; -} - -rt_err_t rt_cputime_sleep(rt_uint64_t tick) -{ - rt_base_t level; - struct rt_cputimer cputimer; - - if (!clock_cpu_issettimeout()) - { - rt_int32_t ms = clock_cpu_millisecond(tick); - return rt_thread_delay(rt_tick_from_millisecond(ms)); - } - - if (tick == 0) - { - return -RT_EINVAL; - } - - rt_cputimer_init(&cputimer, "cputime_sleep", _cputime_sleep_timeout, &(cputimer.sem), tick, - RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER); - - /* disable interrupt */ - level = rt_hw_interrupt_disable(); - - rt_cputimer_start(&cputimer); /* reset the timeout of thread timer and start it */ - rt_hw_interrupt_enable(level); - rt_sem_take_interruptible(&(cputimer.sem), RT_WAITING_FOREVER); - - rt_cputimer_detach(&cputimer); - return RT_EOK; -} - -rt_err_t rt_cputime_ndelay(rt_uint64_t ns) -{ - uint64_t unit = clock_cpu_getres(); - return rt_cputime_sleep(ns * (1000UL * 1000) / unit); -} - -rt_err_t rt_cputime_udelay(rt_uint64_t us) -{ - return rt_cputime_ndelay(us * 1000); -} - -rt_err_t rt_cputime_mdelay(rt_uint64_t ms) -{ - return rt_cputime_ndelay(ms * 1000000); -} diff --git a/components/drivers/hwtimer/Kconfig b/components/drivers/hwtimer/Kconfig deleted file mode 100644 index 0fd1974b89..0000000000 --- a/components/drivers/hwtimer/Kconfig +++ /dev/null @@ -1,14 +0,0 @@ -menuconfig RT_USING_HWTIMER - bool "Using Hardware Timer device drivers" - default n - -config RT_HWTIMER_ARM_ARCH - bool "ARM ARCH Timer" - depends on RT_USING_DM - depends on RT_USING_HWTIMER - depends on ARCH_ARM_CORTEX_A || ARCH_ARMV8 - default n - -if RT_USING_DM && RT_USING_HWTIMER - osource "$(SOC_DM_HWTIMER_DIR)/Kconfig" -endif diff --git a/components/drivers/hwtimer/SConscript b/components/drivers/hwtimer/SConscript deleted file mode 100644 index b6ffc580ed..0000000000 --- a/components/drivers/hwtimer/SConscript +++ /dev/null @@ -1,18 +0,0 @@ -from building import * - -group = [] - -if not GetDepend(['RT_USING_HWTIMER']): - Return('group') - -cwd = GetCurrentDir() -CPPPATH = [cwd + '/../include'] - -src = ['hwtimer.c'] - -if GetDepend(['RT_HWTIMER_ARM_ARCH']): - src += ['hwtimer-arm_arch.c'] - -group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) - -Return('group') diff --git a/components/drivers/include/drivers/clock_time.h b/components/drivers/include/drivers/clock_time.h new file mode 100644 index 0000000000..7374b97d00 --- /dev/null +++ b/components/drivers/include/drivers/clock_time.h @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-01-01 RT-Thread Clock time subsystem + */ +#ifndef __CLOCK_TIME_H__ +#define __CLOCK_TIME_H__ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define RT_CLOCK_TIME_RESMUL (1000000ULL) + +#define RT_CLOCK_TIME_CAP_SOURCE (1U << 0) +#define RT_CLOCK_TIME_CAP_EVENT (1U << 1) + +struct rt_clock_time_device; + +struct rt_clock_time_ops +{ + rt_uint64_t (*get_freq)(struct rt_clock_time_device *dev); + rt_uint64_t (*get_counter)(struct rt_clock_time_device *dev); + rt_err_t (*set_timeout)(struct rt_clock_time_device *dev, rt_uint64_t delta); +}; + +struct rt_clock_time_device +{ + struct rt_device parent; + const struct rt_clock_time_ops *ops; + rt_uint64_t res_scale; + rt_uint8_t caps; +}; + +/* Clock time timer device (replacement for legacy hardware timer device) */ +typedef enum +{ + CLOCK_TIMER_CTRL_FREQ_SET = RT_DEVICE_CTRL_BASE(Timer) + 0x01, + CLOCK_TIMER_CTRL_STOP = RT_DEVICE_CTRL_BASE(Timer) + 0x02, + CLOCK_TIMER_CTRL_INFO_GET = RT_DEVICE_CTRL_BASE(Timer) + 0x03, + CLOCK_TIMER_CTRL_MODE_SET = RT_DEVICE_CTRL_BASE(Timer) + 0x04 +} rt_clock_timer_ctrl_t; + +typedef enum +{ + CLOCK_TIMER_MODE_ONESHOT = 0x01, + CLOCK_TIMER_MODE_PERIOD +} rt_clock_timer_mode_t; + +typedef struct rt_clock_timerval +{ + rt_int32_t sec; + rt_int32_t usec; +} rt_clock_timerval_t; + +#define CLOCK_TIMER_CNTMODE_UP 0x01 +#define CLOCK_TIMER_CNTMODE_DW 0x02 + +struct rt_clock_timer_device; + +struct rt_clock_timer_ops +{ + void (*init)(struct rt_clock_timer_device *timer, rt_uint32_t state); + rt_err_t (*start)(struct rt_clock_timer_device *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode); + void (*stop)(struct rt_clock_timer_device *timer); + rt_uint32_t (*count_get)(struct rt_clock_timer_device *timer); + rt_err_t (*control)(struct rt_clock_timer_device *timer, rt_uint32_t cmd, void *args); +}; + +struct rt_clock_timer_info +{ + rt_int32_t maxfreq; + rt_int32_t minfreq; + rt_uint32_t maxcnt; + rt_uint8_t cntmode; +}; + +typedef struct rt_clock_timer_device +{ + struct rt_device parent; + const struct rt_clock_timer_ops *ops; + const struct rt_clock_timer_info *info; + + rt_int32_t freq; + rt_int32_t overflow; + float period_sec; + rt_int32_t cycles; + rt_int32_t reload; + rt_clock_timer_mode_t mode; + +} rt_clock_timer_t; + +rt_err_t rt_clock_timer_register(rt_clock_timer_t *timer, const char *name, void *user_data); +void rt_clock_timer_isr(rt_clock_timer_t *timer); + +#ifdef RT_USING_DM +extern void (*rt_clock_timer_us_delay)(rt_uint32_t us); +#endif + +struct rt_clock_hrtimer +{ + rt_uint8_t flag; /**< compatible to tick timer's flag */ + char name[RT_NAME_MAX]; + rt_list_t node; + void *parameter; + unsigned long delay_cnt; + unsigned long timeout_cnt; + rt_err_t error; + struct rt_completion completion; + void (*timeout_func)(void *parameter); +}; +typedef struct rt_clock_hrtimer *rt_clock_hrtimer_t; + +rt_err_t rt_clock_time_device_register(struct rt_clock_time_device *dev, const char *name, rt_uint8_t caps); + +void rt_clock_time_set_default_source(struct rt_clock_time_device *dev); +void rt_clock_time_set_default_event(struct rt_clock_time_device *dev); +struct rt_clock_time_device *rt_clock_time_get_default_source(void); +struct rt_clock_time_device *rt_clock_time_get_default_event(void); + +void rt_clock_time_source_init(void); + +rt_uint64_t rt_clock_time_get_freq(void); +rt_uint64_t rt_clock_time_get_counter(void); +rt_uint64_t rt_clock_time_get_res_scaled(void); +rt_uint64_t rt_clock_time_get_event_freq(void); +rt_uint64_t rt_clock_time_get_event_res_scaled(void); + +rt_uint64_t rt_clock_time_counter_to_ns(rt_uint64_t cnt); +rt_uint64_t rt_clock_time_ns_to_counter(rt_uint64_t ns); + +rt_err_t rt_clock_time_set_timeout(rt_uint64_t delta); +void rt_clock_time_event_isr(void); + +rt_err_t rt_clock_boottime_get_us(struct timeval *tv); +rt_err_t rt_clock_boottime_get_s(time_t *t); +rt_err_t rt_clock_boottime_get_ns(struct timespec *ts); + +rt_uint64_t rt_clock_hrtimer_getres(void); +unsigned long rt_clock_hrtimer_getfrq(void); +rt_err_t rt_clock_hrtimer_settimeout(unsigned long cnt); +void rt_clock_hrtimer_process(void); + +void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer, + const char *name, + rt_uint8_t flag, + void (*timeout)(void *parameter), + void *parameter); +rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long cnt); +rt_err_t rt_clock_hrtimer_stop(rt_clock_hrtimer_t timer); +rt_err_t rt_clock_hrtimer_control(rt_clock_hrtimer_t timer, int cmd, void *arg); +rt_err_t rt_clock_hrtimer_detach(rt_clock_hrtimer_t timer); + +rt_inline void rt_clock_hrtimer_keep_errno(rt_clock_hrtimer_t timer, rt_err_t err) +{ + RT_ASSERT(timer != RT_NULL); + + timer->error = err; + rt_set_errno(-err); +} + +void rt_clock_hrtimer_delay_init(struct rt_clock_hrtimer *timer); +void rt_clock_hrtimer_delay_detach(struct rt_clock_hrtimer *timer); +void rt_clock_hrtimer_process(void); + +rt_err_t rt_clock_hrtimer_sleep(struct rt_clock_hrtimer *timer, unsigned long cnt); +rt_err_t rt_clock_hrtimer_ndelay(struct rt_clock_hrtimer *timer, unsigned long ns); +rt_err_t rt_clock_hrtimer_udelay(struct rt_clock_hrtimer *timer, unsigned long us); +rt_err_t rt_clock_hrtimer_mdelay(struct rt_clock_hrtimer *timer, unsigned long ms); + +#ifdef __cplusplus +} +#endif + +#endif /* __CLOCK_TIME_H__ */ diff --git a/components/drivers/include/drivers/core/master_id.h b/components/drivers/include/drivers/core/master_id.h index 5bf9e611cb..99b1b09856 100644 --- a/components/drivers/include/drivers/core/master_id.h +++ b/components/drivers/include/drivers/core/master_id.h @@ -26,7 +26,7 @@ #define MASTER_ID_SERIAL 13 /* Clock Timer */ -#define MASTER_ID_HWTIMER 21 +#define MASTER_ID_CLOCK_TIMER 21 #define MASTER_ID_PTP 22 #define MASTER_ID_RTC 23 diff --git a/components/drivers/include/drivers/cputime.h b/components/drivers/include/drivers/cputime.h deleted file mode 100644 index 478ccfd019..0000000000 --- a/components/drivers/include/drivers/cputime.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2017-12-23 Bernard first version - */ - -#ifndef CPUTIME_H__ -#define CPUTIME_H__ - -#include -#include "cputimer.h" - -struct rt_clock_cputime_ops -{ - uint64_t (*cputime_getres)(void); - uint64_t (*cputime_gettime)(void); - int (*cputime_settimeout)(uint64_t tick, void (*timeout)(void *param), void *param); -}; - -uint64_t clock_cpu_getres(void); -uint64_t clock_cpu_gettime(void); -int clock_cpu_settimeout(uint64_t tick, void (*timeout)(void *param), void *param); -int clock_cpu_issettimeout(void); - -uint64_t clock_cpu_microsecond(uint64_t cpu_tick); -uint64_t clock_cpu_millisecond(uint64_t cpu_tick); - -int clock_cpu_setops(const struct rt_clock_cputime_ops *ops); - -#ifdef RT_USING_CPUTIME_RISCV -int riscv_cputime_init(void); -#endif /* RT_USING_CPUTIME_RISCV */ - -#endif diff --git a/components/drivers/include/drivers/cputimer.h b/components/drivers/include/drivers/cputimer.h deleted file mode 100644 index 371992a41e..0000000000 --- a/components/drivers/include/drivers/cputimer.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2023-02-13 zhkag first version - */ - -#ifndef CPUTIMER_H__ -#define CPUTIMER_H__ - -#include - -struct rt_cputimer -{ - struct rt_object parent; /**< inherit from rt_object */ - rt_list_t row; - void (*timeout_func)(void *parameter); - void *parameter; - rt_uint64_t init_tick; - rt_uint64_t timeout_tick; - struct rt_semaphore sem; -}; -typedef struct rt_cputimer *rt_cputimer_t; - -rt_err_t rt_cputimer_detach(rt_cputimer_t timer); - -#ifdef RT_USING_HEAP -void rt_cputimer_init(rt_cputimer_t timer, - const char *name, - void (*timeout)(void *parameter), - void *parameter, - rt_uint64_t tick, - rt_uint8_t flag); -rt_err_t rt_cputimer_delete(rt_cputimer_t timer); -#endif - -rt_err_t rt_cputimer_start(rt_cputimer_t timer); -rt_err_t rt_cputimer_stop(rt_cputimer_t timer); -rt_err_t rt_cputimer_control(rt_cputimer_t timer, int cmd, void *arg); -rt_err_t rt_cputime_sleep(rt_uint64_t tick); -rt_err_t rt_cputime_ndelay(rt_uint64_t ns); -rt_err_t rt_cputime_udelay(rt_uint64_t us); -rt_err_t rt_cputime_mdelay(rt_uint64_t ms); - -#endif diff --git a/components/drivers/include/drivers/hwtimer.h b/components/drivers/include/drivers/hwtimer.h deleted file mode 100644 index 6f11ff2c54..0000000000 --- a/components/drivers/include/drivers/hwtimer.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - */ -#ifndef __HWTIMER_H__ -#define __HWTIMER_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Timer Control Command */ -typedef enum -{ - HWTIMER_CTRL_FREQ_SET = RT_DEVICE_CTRL_BASE(Timer) + 0x01, /* set the count frequency */ - HWTIMER_CTRL_STOP = RT_DEVICE_CTRL_BASE(Timer) + 0x02, /* stop timer */ - HWTIMER_CTRL_INFO_GET = RT_DEVICE_CTRL_BASE(Timer) + 0x03, /* get a timer feature information */ - HWTIMER_CTRL_MODE_SET = RT_DEVICE_CTRL_BASE(Timer) + 0x04 /* Setting the timing mode(oneshot/period) */ -} rt_hwtimer_ctrl_t; - -/* Timing Mode */ -typedef enum -{ - HWTIMER_MODE_ONESHOT = 0x01, - HWTIMER_MODE_PERIOD -} rt_hwtimer_mode_t; - -/* Time Value */ -typedef struct rt_hwtimerval -{ - rt_int32_t sec; /* second */ - rt_int32_t usec; /* microsecond */ -} rt_hwtimerval_t; - -#define HWTIMER_CNTMODE_UP 0x01 /* increment count mode */ -#define HWTIMER_CNTMODE_DW 0x02 /* decreasing count mode */ - -struct rt_hwtimer_device; - -struct rt_hwtimer_ops -{ - void (*init)(struct rt_hwtimer_device *timer, rt_uint32_t state); - rt_err_t (*start)(struct rt_hwtimer_device *timer, rt_uint32_t cnt, rt_hwtimer_mode_t mode); - void (*stop)(struct rt_hwtimer_device *timer); - rt_uint32_t (*count_get)(struct rt_hwtimer_device *timer); - rt_err_t (*control)(struct rt_hwtimer_device *timer, rt_uint32_t cmd, void *args); -}; - -/* Timer Feature Information */ -struct rt_hwtimer_info -{ - rt_int32_t maxfreq; /* the maximum count frequency timer support */ - rt_int32_t minfreq; /* the minimum count frequency timer support */ - rt_uint32_t maxcnt; /* counter maximum value */ - rt_uint8_t cntmode; /* count mode (inc/dec) */ -}; - -typedef struct rt_hwtimer_device -{ - struct rt_device parent; - const struct rt_hwtimer_ops *ops; - const struct rt_hwtimer_info *info; - - rt_int32_t freq; /* counting frequency set by the user */ - rt_int32_t overflow; /* timer overflows */ - float period_sec; - rt_int32_t cycles; /* how many times will generate a timeout event after overflow */ - rt_int32_t reload; /* reload cycles(using in period mode) */ - rt_hwtimer_mode_t mode; /* timing mode(oneshot/period) */ -} rt_hwtimer_t; - -rt_err_t rt_device_hwtimer_register(rt_hwtimer_t *timer, const char *name, void *user_data); -void rt_device_hwtimer_isr(rt_hwtimer_t *timer); - -#ifdef RT_USING_DM -extern void (*rt_device_hwtimer_us_delay)(rt_uint32_t us); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h index 50a97beee5..c3a1277449 100644 --- a/components/drivers/include/rtdevice.h +++ b/components/drivers/include/rtdevice.h @@ -242,18 +242,14 @@ extern "C" { #include "drivers/dev_can.h" #endif /* RT_USING_CAN */ -#ifdef RT_USING_HWTIMER -#include "drivers/hwtimer.h" -#endif /* RT_USING_HWTIMER */ +#ifdef RT_USING_CLOCK_TIME +#include "drivers/clock_time.h" +#endif /* RT_USING_CLOCK_TIME */ #ifdef RT_USING_AUDIO #include "drivers/dev_audio.h" #endif /* RT_USING_AUDIO */ -#ifdef RT_USING_CPUTIME -#include "drivers/cputime.h" -#endif /* RT_USING_CPUTIME */ - #ifdef RT_USING_ADC #include "drivers/adc.h" #endif /* RT_USING_ADC */ diff --git a/components/drivers/input/Kconfig b/components/drivers/input/Kconfig index 707a7500d9..fc70a67790 100644 --- a/components/drivers/input/Kconfig +++ b/components/drivers/input/Kconfig @@ -13,7 +13,7 @@ config RT_INPUT_POWER config RT_INPUT_UAPI bool "Input event Unix API" depends on RT_USING_INPUT - depends on RT_USING_KTIME + depends on RT_USING_CLOCK_TIME depends on RT_USING_POSIX_DEVIO default n default y if RT_USING_SMART diff --git a/components/drivers/input/input_uapi.c b/components/drivers/input/input_uapi.c index c1ce87efb5..21dca947c7 100644 --- a/components/drivers/input/input_uapi.c +++ b/components/drivers/input/input_uapi.c @@ -14,7 +14,7 @@ #include #include -#include +#include #include #define DBG_TAG "input.uapi" @@ -384,7 +384,7 @@ void input_uapi_event(struct rt_input_device *idev, struct rt_input_event *event uapi_event = &uapi->events[w_idx]; - rt_ktime_boottime_get_us(&uapi_event->time); + rt_clock_boottime_get_us(&uapi_event->time); uapi_event->type = event->type; uapi_event->code = event->code; uapi_event->value = event->value; diff --git a/components/drivers/ktime/Kconfig b/components/drivers/ktime/Kconfig deleted file mode 100644 index 170271c222..0000000000 --- a/components/drivers/ktime/Kconfig +++ /dev/null @@ -1,3 +0,0 @@ -menuconfig RT_USING_KTIME - bool "Ktime: kernel time" - default n diff --git a/components/drivers/ktime/README.md b/components/drivers/ktime/README.md deleted file mode 100644 index b878f93d4c..0000000000 --- a/components/drivers/ktime/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# ktime - -## 1、介绍 - -ktime 为 kernel time,为内核时间子系统,实现了内核启动时间以及芯片内核 cputimer 时间管理以及一个 ns 精度的高精度定时器, - -## 2、如何打开 ktime - -使用 ktime 需要在 RT-Thread 的 menuconfig 中选择它,具体路径如下: - -``` -RT-Thread Components - [*] Ktime: kernel time -``` - -## 3、使用 ktime - -> 函数的功能以及参数类型已经写在头文件的注释之中,本文不再赘述 - -### 3.1、boottime - -boottime 为系统启动时间,即为系统从上电开始到现在运行的时间,默认的时间基准为芯片内核的 cputimer 的 cnt 值,已经适配了 aarch64 与 riscv64 平台,例如 stm32 等平台需要在自己的 bsp 里面进行适配(boottime 里面函数都为 weak function),需要注意 tick 从中断到设置中间的时延 - -**此值应当为 Readonly** - -### 3.2、cputimer - -cputimer 为芯片内核的 cputimer,也可以认为是 os tick 来源的那个定时器,cputimer 主要是提供了一个统一的接口去获得其分辨率,频率,cnt 值 - -**此值应当为 Readonly** - -### 3.3、hrtimer - -> TODO: hrtimer 目前还是使用优先级链表的方式进行管理,在遇到任务的大规模并发时还是存在部分性能问题,待内核有一个统一的红黑树组件后,再进行优化 - -hrtimer 为高精度定时器,需要重写其 weak 函数(需要对接到硬件定时器,否则默认走的是软件定时器,分辨率只有 os tick 的值)才能正常使用,其主要使用方法: - -#### 3.3.1、延时 - -hrtimer 的延时并不是 while(1)式死等,它会将一个线程挂起,睡眠多少时间后通过硬件定时器将其唤醒(注:延时 ns 并不是真的能准确的延时这么多,而是在保证性能的情况下尽可能的延时) - -- rt_ktime_hrtimer_sleep:单位为 cputimer 的 tick 值 -- rt_ktime_hrtimer_ndelay:单位为 ns -- rt_ktime_hrtimer_udelay:单位为 us -- rt_ktime_hrtimer_mdelay:单位为 ms - -#### 3.3.1、定时器 - -hrtimer 还提供了一套 rt_timer 风格的 api - -- rt_ktime_hrtimer_init -- rt_ktime_hrtimer_delete -- rt_ktime_hrtimer_start -- rt_ktime_hrtimer_stop -- rt_ktime_hrtimer_control -- rt_ktime_hrtimer_detach - -需要注意,此定时器回调函数依旧处于中断之中,不能做一些耗时的任务 - -## 5、联系方式 - -- 维护:xqyjlj -- 主页:https://github.com/xqyjlj diff --git a/components/drivers/ktime/SConscript b/components/drivers/ktime/SConscript deleted file mode 100644 index 20a0295719..0000000000 --- a/components/drivers/ktime/SConscript +++ /dev/null @@ -1,24 +0,0 @@ -import os -from building import * - -Import('rtconfig') - -cwd = GetCurrentDir() - -src = Glob('src/*.c') -list = os.listdir(cwd + "/src") -if rtconfig.ARCH in list: - if os.path.exists(cwd + "/src/" + rtconfig.ARCH + "/" + rtconfig.CPU): - src += Glob("src/" + rtconfig.ARCH + "/" + rtconfig.CPU + "/*.c") - else: - src += Glob("src/" + rtconfig.ARCH + "/*.c") -CPPPATH = [cwd, cwd + "/inc"] -LOCAL_CCFLAGS = '' -if rtconfig.PLATFORM in ['gcc', 'armclang']: - LOCAL_CCFLAGS += ' -std=gnu99' -elif rtconfig.PLATFORM in ['armcc']: - LOCAL_CCFLAGS += ' --c99 --gnu' - -group = DefineGroup('DeviceDrivers', src, depend=['RT_USING_KTIME'], CPPPATH=CPPPATH, LOCAL_CCFLAGS = LOCAL_CCFLAGS) - -Return('group') diff --git a/components/drivers/ktime/inc/ktime.h b/components/drivers/ktime/inc/ktime.h deleted file mode 100644 index a430f85a17..0000000000 --- a/components/drivers/ktime/inc/ktime.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2023-07-10 xqyjlj The first version. - * 2024-04-26 Shell Improve ipc performance - */ - -#ifndef __KTIME_H__ -#define __KTIME_H__ - -#include -#include -#include - -#include "rtthread.h" - -#define RT_KTIME_RESMUL (1000000ULL) - -struct rt_ktime_hrtimer -{ - rt_uint8_t flag; /**< compatible to tick timer's flag */ - char name[RT_NAME_MAX]; - rt_list_t node; - void *parameter; - unsigned long delay_cnt; - unsigned long timeout_cnt; - rt_err_t error; - struct rt_completion completion; - void (*timeout_func)(void *parameter); -}; -typedef struct rt_ktime_hrtimer *rt_ktime_hrtimer_t; - -/** - * @brief Get boottime with us precision - * - * @param tv: timeval - * @return rt_err_t - */ -rt_err_t rt_ktime_boottime_get_us(struct timeval *tv); - -/** - * @brief Get boottime with s precision - * - * @param t: time_t - * @return rt_err_t - */ -rt_err_t rt_ktime_boottime_get_s(time_t *t); - -/** - * @brief Get boottime with ns precision - * - * @param ts: timespec - * @return rt_err_t - */ -rt_err_t rt_ktime_boottime_get_ns(struct timespec *ts); - -/** - * @brief Get cputimer resolution - * - * @return (resolution * RT_KTIME_RESMUL) - */ -rt_uint64_t rt_ktime_cputimer_getres(void); - -/** - * @brief Get cputimer frequency - * - * @return frequency - */ -unsigned long rt_ktime_cputimer_getfrq(void); - -/** - * @brief Get cputimer the value of the cnt counter - * - * @return cnt - */ -unsigned long rt_ktime_cputimer_getcnt(void); - -/** - * @brief Init cputimer - * - */ -void rt_ktime_cputimer_init(void); - -/** - * @brief Get hrtimer resolution - * - * @return (resolution * RT_KTIME_RESMUL) - */ -rt_uint64_t rt_ktime_hrtimer_getres(void); - -/** - * @brief Get hrtimer frequency - * - * @return frequency - */ -unsigned long rt_ktime_hrtimer_getfrq(void); - -/** - * @brief set hrtimer interrupt timeout count (cnt), you should re-implemented it in hrtimer device driver - * - * @param cnt: hrtimer requires a timing cnt value - * @return rt_err_t - */ -rt_err_t rt_ktime_hrtimer_settimeout(unsigned long cnt); - -/** - * @brief called in hrtimer device driver isr routinue, it will process the timeouts - */ -void rt_ktime_hrtimer_process(void); - -void rt_ktime_hrtimer_init(rt_ktime_hrtimer_t timer, - const char *name, - rt_uint8_t flag, - void (*timeout)(void *parameter), - void *parameter); -rt_err_t rt_ktime_hrtimer_start(rt_ktime_hrtimer_t timer, unsigned long cnt); -rt_err_t rt_ktime_hrtimer_stop(rt_ktime_hrtimer_t timer); -rt_err_t rt_ktime_hrtimer_control(rt_ktime_hrtimer_t timer, int cmd, void *arg); -rt_err_t rt_ktime_hrtimer_detach(rt_ktime_hrtimer_t timer); - -rt_inline void rt_ktime_hrtimer_keep_errno(rt_ktime_hrtimer_t timer, rt_err_t err) -{ - RT_ASSERT(timer != RT_NULL); - - timer->error = err; - rt_set_errno(-err); -} - -void rt_ktime_hrtimer_delay_init(struct rt_ktime_hrtimer *timer); -void rt_ktime_hrtimer_delay_detach(struct rt_ktime_hrtimer *timer); -void rt_ktime_hrtimer_process(void); - -/** - * @brief sleep by the cputimer cnt value - * - * @param cnt: the cputimer cnt value - * @return rt_err_t - */ -rt_err_t rt_ktime_hrtimer_sleep(struct rt_ktime_hrtimer *timer, unsigned long cnt); - -/** - * @brief sleep by ns - * - * @param ns: ns - * @return rt_err_t - */ -rt_err_t rt_ktime_hrtimer_ndelay(struct rt_ktime_hrtimer *timer, unsigned long ns); - -/** - * @brief sleep by us - * - * @param us: us - * @return rt_err_t - */ -rt_err_t rt_ktime_hrtimer_udelay(struct rt_ktime_hrtimer *timer, unsigned long us); - -/** - * @brief sleep by ms - * - * @param ms: ms - * @return rt_err_t - */ -rt_err_t rt_ktime_hrtimer_mdelay(struct rt_ktime_hrtimer *timer, unsigned long ms); - -#endif diff --git a/components/drivers/ktime/src/aarch64/cputimer.c b/components/drivers/ktime/src/aarch64/cputimer.c deleted file mode 100644 index 005848eccd..0000000000 --- a/components/drivers/ktime/src/aarch64/cputimer.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2023-07-10 xqyjlj The first version. - */ - -#include "gtimer.h" -#include "ktime.h" - -static volatile unsigned long _init_cnt = 0; - -rt_uint64_t rt_ktime_cputimer_getres(void) -{ - return ((1000ULL * 1000 * 1000) * RT_KTIME_RESMUL) / rt_hw_get_gtimer_frq(); -} - -unsigned long rt_ktime_cputimer_getfrq(void) -{ - return rt_hw_get_gtimer_frq(); -} - -unsigned long rt_ktime_cputimer_getcnt(void) -{ - return rt_hw_get_cntpct_val() - _init_cnt; -} - -void rt_ktime_cputimer_init(void) -{ - _init_cnt = rt_hw_get_cntpct_val(); -} diff --git a/components/drivers/ktime/src/cputimer.c b/components/drivers/ktime/src/cputimer.c deleted file mode 100644 index ee19b236dc..0000000000 --- a/components/drivers/ktime/src/cputimer.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2023-07-10 xqyjlj The first version. - */ - -#include "ktime.h" - -rt_weak rt_uint64_t rt_ktime_cputimer_getres(void) -{ - return ((1000ULL * 1000 * 1000) * RT_KTIME_RESMUL) / RT_TICK_PER_SECOND; -} - -rt_weak unsigned long rt_ktime_cputimer_getfrq(void) -{ - return RT_TICK_PER_SECOND; -} - -rt_weak unsigned long rt_ktime_cputimer_getcnt(void) -{ - return rt_tick_get(); -} - -rt_weak void rt_ktime_cputimer_init(void) -{ - return; -} diff --git a/components/drivers/ktime/src/risc-v/virt64/cputimer.c b/components/drivers/ktime/src/risc-v/virt64/cputimer.c deleted file mode 100644 index 70c133aa2e..0000000000 --- a/components/drivers/ktime/src/risc-v/virt64/cputimer.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2006-2023, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2023-07-10 xqyjlj The first version. - */ - -#include "ktime.h" - -static volatile unsigned long _init_cnt = 0; - -rt_uint64_t rt_ktime_cputimer_getres(void) -{ - return ((1000ULL * 1000 * 1000) * RT_KTIME_RESMUL) / CPUTIME_TIMER_FREQ; -} - -unsigned long rt_ktime_cputimer_getfrq(void) -{ - return CPUTIME_TIMER_FREQ; -} - -unsigned long rt_ktime_cputimer_getcnt(void) -{ - unsigned long time_elapsed; - __asm__ __volatile__("rdtime %0" : "=r"(time_elapsed)); - return time_elapsed - _init_cnt; -} - -void rt_ktime_cputimer_init(void) -{ - __asm__ __volatile__("rdtime %0" : "=r"(_init_cnt)); -} diff --git a/components/drivers/pic/Kconfig b/components/drivers/pic/Kconfig index 448818fab7..e2c05685a6 100755 --- a/components/drivers/pic/Kconfig +++ b/components/drivers/pic/Kconfig @@ -8,7 +8,7 @@ menuconfig RT_USING_PIC config RT_USING_PIC_STATISTICS bool "Enable ISR execution time statistics" depends on RT_USING_PIC - depends on RT_USING_KTIME + depends on RT_USING_CLOCK_TIME depends on RT_USING_INTERRUPT_INFO default n diff --git a/components/drivers/pic/pic.c b/components/drivers/pic/pic.c index 423846c6e7..f3850ebd48 100644 --- a/components/drivers/pic/pic.c +++ b/components/drivers/pic/pic.c @@ -17,7 +17,7 @@ #include #ifdef RT_USING_PIC_STATISTICS -#include +#include #endif struct irq_traps @@ -553,7 +553,7 @@ rt_err_t rt_pic_handle_isr(struct rt_pic_irq *pirq) RT_ASSERT(pirq->pic != RT_NULL); #ifdef RT_USING_PIC_STATISTICS - rt_ktime_boottime_get_ns(&ts); + rt_clock_boottime_get_ns(&ts); current_irq_begin = ts.tv_sec * (1000UL * 1000 * 1000) + ts.tv_nsec; #endif @@ -614,7 +614,7 @@ rt_err_t rt_pic_handle_isr(struct rt_pic_irq *pirq) } #ifdef RT_USING_PIC_STATISTICS - rt_ktime_boottime_get_ns(&ts); + rt_clock_boottime_get_ns(&ts); irq_time_ns = ts.tv_sec * (1000UL * 1000 * 1000) + ts.tv_nsec - current_irq_begin; pirq->stat.sum_irq_time_ns += irq_time_ns; if (irq_time_ns < pirq->stat.min_irq_time_ns || pirq->stat.min_irq_time_ns == 0) diff --git a/components/drivers/rtc/dev_soft_rtc.c b/components/drivers/rtc/dev_soft_rtc.c index 3f85709e56..5f8489158f 100644 --- a/components/drivers/rtc/dev_soft_rtc.c +++ b/components/drivers/rtc/dev_soft_rtc.c @@ -13,8 +13,8 @@ #include #include -#ifdef RT_USING_KTIME -#include +#ifdef RT_USING_CLOCK_TIME +#include #endif #ifdef RT_USING_SOFT_RTC @@ -46,7 +46,7 @@ static struct rt_device soft_rtc_dev; static RT_DEFINE_SPINLOCK(_spinlock); /* RTC time baseline for calculation */ static struct timespec base_ts = { 0 }; -#ifdef RT_USING_KTIME +#ifdef RT_USING_CLOCK_TIME static struct timespec base_ktime_ts = { 0 }; #else static rt_tick_t base_tick; @@ -111,8 +111,8 @@ static void set_rtc_time(struct timespec *ts) rt_base_t level = rt_spin_lock_irqsave(&_spinlock); base_ts.tv_sec = ts->tv_sec; base_ts.tv_nsec = ts->tv_nsec; -#ifdef RT_USING_KTIME - rt_ktime_boottime_get_ns(&base_ktime_ts); +#ifdef RT_USING_CLOCK_TIME + rt_clock_boottime_get_ns(&base_ktime_ts); #else base_tick = rt_tick_get(); #endif @@ -140,9 +140,9 @@ static void get_rtc_time(struct timespec *ts) return; level = rt_spin_lock_irqsave(&_spinlock); -#ifdef RT_USING_KTIME +#ifdef RT_USING_CLOCK_TIME struct timespec current_ts; - rt_ktime_boottime_get_ns(¤t_ts); + rt_clock_boottime_get_ns(¤t_ts); ts->tv_sec = base_ts.tv_sec + (current_ts.tv_sec - base_ktime_ts.tv_sec); ts->tv_nsec = base_ts.tv_nsec + (current_ts.tv_nsec - base_ktime_ts.tv_nsec); @@ -256,8 +256,8 @@ static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args) ts = (struct timespec *)args; level = rt_spin_lock_irqsave(&_spinlock); ts->tv_sec = 0; -#ifdef RT_USING_KTIME - ts->tv_nsec = (rt_ktime_cputimer_getres() / RT_KTIME_RESMUL); +#ifdef RT_USING_CLOCK_TIME + ts->tv_nsec = (rt_clock_time_get_res_scaled() / RT_CLOCK_TIME_RESMUL); #else ts->tv_nsec = (1000UL * 1000 * 1000) / RT_TICK_PER_SECOND; #endif @@ -314,8 +314,8 @@ static int rt_soft_rtc_init(void) RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT); #endif -#ifdef RT_USING_KTIME - rt_ktime_boottime_get_ns(&base_ktime_ts); +#ifdef RT_USING_CLOCK_TIME + rt_clock_boottime_get_ns(&base_ktime_ts); #else base_tick = rt_tick_get(); #endif diff --git a/components/libc/compilers/common/ctime.c b/components/libc/compilers/common/ctime.c index bcd19fc8aa..5e89097b27 100644 --- a/components/libc/compilers/common/ctime.c +++ b/components/libc/compilers/common/ctime.c @@ -42,8 +42,8 @@ #ifdef RT_USING_POSIX_DELAY #include #endif -#ifdef RT_USING_KTIME -#include +#ifdef RT_USING_CLOCK_TIME +#include #endif #define DBG_TAG "time" @@ -536,14 +536,14 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz) } RTM_EXPORT(settimeofday); -#if defined(RT_USING_POSIX_DELAY) && defined(RT_USING_KTIME) +#if defined(RT_USING_POSIX_DELAY) && defined(RT_USING_CLOCK_TIME) int nanosleep(const struct timespec *rqtp, struct timespec *rmtp) { struct timespec old_ts = {0}; struct timespec new_ts = {0}; - struct rt_ktime_hrtimer timer; + struct rt_clock_hrtimer timer; - rt_ktime_hrtimer_delay_init(&timer); + rt_clock_hrtimer_delay_init(&timer); if (rqtp == RT_NULL) { @@ -557,14 +557,14 @@ int nanosleep(const struct timespec *rqtp, struct timespec *rmtp) return -1; } unsigned long ns = rqtp->tv_sec * NANOSECOND_PER_SECOND + rqtp->tv_nsec; - rt_ktime_boottime_get_ns(&old_ts); - rt_ktime_hrtimer_ndelay(&timer, ns); + rt_clock_boottime_get_ns(&old_ts); + rt_clock_hrtimer_ndelay(&timer, ns); if (rt_get_errno() == RT_EINTR) { if (rmtp) { rt_base_t rsec, rnsec; - rt_ktime_boottime_get_ns(&new_ts); + rt_clock_boottime_get_ns(&new_ts); rsec = old_ts.tv_sec + rqtp->tv_sec - new_ts.tv_sec; rnsec = old_ts.tv_nsec + rqtp->tv_nsec - new_ts.tv_nsec; @@ -580,18 +580,18 @@ int nanosleep(const struct timespec *rqtp, struct timespec *rmtp) } } - rt_ktime_hrtimer_delay_detach(&timer); + rt_clock_hrtimer_delay_detach(&timer); rt_set_errno(EINTR); return -1; } - rt_ktime_hrtimer_delay_detach(&timer); + rt_clock_hrtimer_delay_detach(&timer); return 0; } RTM_EXPORT(nanosleep); -#endif /* RT_USING_POSIX_DELAY && RT_USING_KTIME */ +#endif /* RT_USING_POSIX_DELAY && RT_USING_CLOCK_TIME */ -#if defined(RT_USING_POSIX_CLOCK) && defined(RT_USING_KTIME) +#if defined(RT_USING_POSIX_CLOCK) && defined(RT_USING_CLOCK_TIME) int clock_getres(clockid_t clockid, struct timespec *res) { @@ -609,14 +609,14 @@ int clock_getres(clockid_t clockid, struct timespec *res) return _control_rtc(RT_DEVICE_CTRL_RTC_GET_TIMERES, res); #endif /* RT_USING_RTC */ - case CLOCK_MONOTONIC: // use cputimer + case CLOCK_MONOTONIC: // use clock_time counter case CLOCK_MONOTONIC_COARSE: case CLOCK_MONOTONIC_RAW: case CLOCK_BOOTTIME: case CLOCK_PROCESS_CPUTIME_ID: case CLOCK_THREAD_CPUTIME_ID: res->tv_sec = 0; - res->tv_nsec = (rt_ktime_cputimer_getres() / RT_KTIME_RESMUL); + res->tv_nsec = (rt_clock_time_get_res_scaled() / RT_CLOCK_TIME_RESMUL); return 0; default: @@ -646,11 +646,11 @@ int clock_gettime(clockid_t clockid, struct timespec *tp) case CLOCK_MONOTONIC_COARSE: case CLOCK_MONOTONIC_RAW: case CLOCK_BOOTTIME: - return rt_ktime_boottime_get_ns(tp); + return rt_clock_boottime_get_ns(tp); case CLOCK_PROCESS_CPUTIME_ID: case CLOCK_THREAD_CPUTIME_ID: - return rt_ktime_boottime_get_ns(tp); // TODO not yet implemented + return rt_clock_boottime_get_ns(tp); // TODO not yet implemented default: tp->tv_sec = 0; @@ -690,7 +690,7 @@ int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp, s case CLOCK_MONOTONIC: // use boottime case CLOCK_PROCESS_CPUTIME_ID: if (flags & TIMER_ABSTIME) - err = rt_ktime_boottime_get_ns(&ts); + err = rt_clock_boottime_get_ns(&ts); break; default: @@ -790,9 +790,9 @@ int rt_timespec_to_tick(const struct timespec *time) } RTM_EXPORT(rt_timespec_to_tick); -#endif /* RT_USING_POSIX_CLOCK && RT_USING_KTIME */ +#endif /* RT_USING_POSIX_CLOCK && RT_USING_CLOCK_TIME */ -#if defined(RT_USING_POSIX_TIMER) && defined(RT_USING_KTIME) +#if defined(RT_USING_POSIX_TIMER) && defined(RT_USING_CLOCK_TIME) #include @@ -801,7 +801,7 @@ RTM_EXPORT(rt_timespec_to_tick); struct timer_obj { - struct rt_ktime_hrtimer hrtimer; + struct rt_clock_hrtimer hrtimer; void (*sigev_notify_func)(union sigval val); union sigval val; struct timespec interval; /* Reload value */ @@ -896,11 +896,11 @@ static void rtthread_timer_wrapper(void *timerobj) timer->status = NOT_ACTIVE; } - timer->reload = ((timer->interval.tv_sec * NANOSECOND_PER_SECOND + timer->interval.tv_nsec) * RT_KTIME_RESMUL) / - rt_ktime_cputimer_getres(); + timer->reload = ((timer->interval.tv_sec * NANOSECOND_PER_SECOND + timer->interval.tv_nsec) * RT_CLOCK_TIME_RESMUL) / + rt_clock_time_get_res_scaled(); if (timer->reload) { - rt_ktime_hrtimer_start(&timer->hrtimer, timer->reload); + rt_clock_hrtimer_start(&timer->hrtimer, timer->reload); } #ifdef RT_USING_SMART /* this field is named as tid in musl */ @@ -1021,7 +1021,7 @@ int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid) timer->status = NOT_ACTIVE; timer->clockid = clockid; - rt_ktime_hrtimer_init(&timer->hrtimer, timername, RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_HARD_TIMER, + rt_clock_hrtimer_init(&timer->hrtimer, timername, RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_HARD_TIMER, rtthread_timer_wrapper, timer); _timerid = resource_id_get(&id_timer); @@ -1031,7 +1031,7 @@ int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid) rt_free(param); #endif /* RT_USING_SMART */ - rt_ktime_hrtimer_detach(&timer->hrtimer); + rt_clock_hrtimer_detach(&timer->hrtimer); rt_free(timer); rt_set_errno(ENOMEM); return -1; @@ -1083,9 +1083,9 @@ int timer_delete(timer_t timerid) if (timer->status == ACTIVE) { timer->status = NOT_ACTIVE; - rt_ktime_hrtimer_stop(&timer->hrtimer); + rt_clock_hrtimer_stop(&timer->hrtimer); } - rt_ktime_hrtimer_detach(&timer->hrtimer); + rt_clock_hrtimer_detach(&timer->hrtimer); #ifdef RT_USING_SMART if (timer->pid) @@ -1135,8 +1135,8 @@ int timer_gettime(timer_t timerid, struct itimerspec *its) if (timer->status == ACTIVE) { unsigned long remain_cnt; - rt_ktime_hrtimer_control(&timer->hrtimer, RT_TIMER_CTRL_GET_REMAIN_TIME, &remain_cnt); - nanoseconds = ((remain_cnt - rt_ktime_cputimer_getcnt()) * rt_ktime_cputimer_getres()) / RT_KTIME_RESMUL; + rt_clock_hrtimer_control(&timer->hrtimer, RT_TIMER_CTRL_GET_REMAIN_TIME, &remain_cnt); + nanoseconds = ((remain_cnt - rt_clock_time_get_counter()) * rt_clock_time_get_res_scaled()) / RT_CLOCK_TIME_RESMUL; seconds = nanoseconds / NANOSECOND_PER_SECOND; nanoseconds = nanoseconds % NANOSECOND_PER_SECOND; its->it_value.tv_sec = (rt_int32_t)seconds; @@ -1191,7 +1191,7 @@ int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, { if (timer->status == ACTIVE) { - rt_ktime_hrtimer_stop(&timer->hrtimer); + rt_clock_hrtimer_stop(&timer->hrtimer); } timer->status = NOT_ACTIVE; @@ -1213,7 +1213,7 @@ int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, case CLOCK_PROCESS_CPUTIME_ID: case CLOCK_THREAD_CPUTIME_ID: if (flags & TIMER_ABSTIME) - err = rt_ktime_boottime_get_ns(&ts); + err = rt_clock_boottime_get_ns(&ts); break; default: rt_set_errno(EINVAL); @@ -1228,8 +1228,8 @@ int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, if (ns <= 0) return 0; - unsigned long res = rt_ktime_cputimer_getres(); - timer->reload = (ns * RT_KTIME_RESMUL) / res; + unsigned long res = rt_clock_time_get_res_scaled(); + timer->reload = (ns * RT_CLOCK_TIME_RESMUL) / res; timer->interval.tv_sec = value->it_interval.tv_sec; timer->interval.tv_nsec = value->it_interval.tv_nsec; timer->value.tv_sec = value->it_value.tv_sec; @@ -1237,18 +1237,18 @@ int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, if (timer->status == ACTIVE) { - rt_ktime_hrtimer_stop(&timer->hrtimer); + rt_clock_hrtimer_stop(&timer->hrtimer); } timer->status = ACTIVE; if ((value->it_interval.tv_sec == 0) && (value->it_interval.tv_nsec == 0)) - rt_ktime_hrtimer_control(&timer->hrtimer, RT_TIMER_CTRL_SET_ONESHOT, RT_NULL); + rt_clock_hrtimer_control(&timer->hrtimer, RT_TIMER_CTRL_SET_ONESHOT, RT_NULL); else - rt_ktime_hrtimer_control(&timer->hrtimer, RT_TIMER_CTRL_SET_PERIODIC, RT_NULL); + rt_clock_hrtimer_control(&timer->hrtimer, RT_TIMER_CTRL_SET_PERIODIC, RT_NULL); - rt_ktime_hrtimer_start(&timer->hrtimer, timer->reload); + rt_clock_hrtimer_start(&timer->hrtimer, timer->reload); return 0; } RTM_EXPORT(timer_settime); -#endif /* RT_USING_POSIX_TIMER && RT_USING_KTIME */ +#endif /* RT_USING_POSIX_TIMER && RT_USING_CLOCK_TIME */ diff --git a/components/libc/posix/Kconfig b/components/libc/posix/Kconfig index 8a4a3843cb..16f2eee840 100644 --- a/components/libc/posix/Kconfig +++ b/components/libc/posix/Kconfig @@ -79,7 +79,7 @@ if RT_USING_POSIX_FS endif config RT_USING_POSIX_DELAY - select RT_USING_KTIME + select RT_USING_CLOCK_TIME bool "Enable delay APIs, sleep()/usleep()/msleep() etc" default n @@ -89,7 +89,7 @@ config RT_USING_POSIX_CLOCK default n config RT_USING_POSIX_TIMER - select RT_USING_KTIME + select RT_USING_CLOCK_TIME select RT_USING_RESOURCE_ID bool "Enable timer APIs, timer_create()/timer_gettime() etc" default n diff --git a/components/lwp/arch/aarch64/common/vdso_data.c b/components/lwp/arch/aarch64/common/vdso_data.c index 13c055ec56..b33094db9d 100644 --- a/components/lwp/arch/aarch64/common/vdso_data.c +++ b/components/lwp/arch/aarch64/common/vdso_data.c @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include #include @@ -23,11 +23,11 @@ void rt_vdso_update_glob_time(void) rt_vdso_write_begin(vdata); vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_REALTIME]; - rt_ktime_boottime_get_ns(vdso_ts); + rt_clock_boottime_get_ns(vdso_ts); vdso_ts->tv_sec = initdata + vdso_ts->tv_sec; vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_MONOTONIC]; - rt_ktime_boottime_get_ns(vdso_ts); + rt_clock_boottime_get_ns(vdso_ts); vdata->cycle_last = rt_hw_get_cntpct_val(); rt_vdso_write_end(vdata); diff --git a/components/lwp/arch/risc-v/common/vdso_data.c b/components/lwp/arch/risc-v/common/vdso_data.c index e31305af8f..b457c1f7ee 100644 --- a/components/lwp/arch/risc-v/common/vdso_data.c +++ b/components/lwp/arch/risc-v/common/vdso_data.c @@ -9,7 +9,7 @@ */ #include -#include +#include #include #include #include @@ -23,11 +23,11 @@ void rt_vdso_update_glob_time(void) rt_vdso_write_begin(vdata); vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_REALTIME]; - rt_ktime_boottime_get_ns(vdso_ts); + rt_clock_boottime_get_ns(vdso_ts); vdso_ts->tv_sec = initdata + vdso_ts->tv_sec; vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_MONOTONIC]; - rt_ktime_boottime_get_ns(vdso_ts); + rt_clock_boottime_get_ns(vdso_ts); vdata->cycle_last = rdtime(); rt_vdso_write_end(vdata); diff --git a/documentation/6.components/device-driver/INDEX.md b/documentation/6.components/device-driver/INDEX.md index b8600c9e79..b42844dbc9 100644 --- a/documentation/6.components/device-driver/INDEX.md +++ b/documentation/6.components/device-driver/INDEX.md @@ -8,7 +8,7 @@ - @subpage page_device_spi - @subpage page_device_pwm - @subpage page_device_rtc -- @subpage page_device_hwtimer +- @subpage page_device_clock_time - @subpage page_device_watchdog - @subpage page_device_wlan - @subpage page_device_sensor diff --git a/documentation/6.components/device-driver/clock_time/README.md b/documentation/6.components/device-driver/clock_time/README.md new file mode 100644 index 0000000000..de70570812 --- /dev/null +++ b/documentation/6.components/device-driver/clock_time/README.md @@ -0,0 +1,89 @@ +@page page_device_clock_time Clock Time Subsystem + +# Overview + +The clock_time subsystem provides a unified, high-resolution time base and +programmable event scheduling for RT-Thread. It decouples a monotonic counter +(clock source) from deadline delivery (clock event), so platforms can mix +hardware counters and timers while the kernel and libc see consistent behavior. + +# Architecture + +![Clock time architecture](figures/clock_time_arch.svg) + +## Layering and Responsibilities + +- Upper layers: + - POSIX/libc time APIs (clock_gettime, nanosleep) use boottime and hrtimer APIs. + - Soft RTC uses boottime as its monotonic time base for timekeeping. + - Device drivers (input event timestamps, vDSO, PIC statistics) use boottime + for timestamping. +- clock_time subsystem: core APIs, clock source/event devices, the hrtimer + scheduler, boottime helpers, and the clock_timer adapter. +- Lower layers: BSP drivers provide hardware counters and timers, which are + wrapped as clock_time devices or clock_timer devices. + +## Internal Components + +- Core API (clock_time_core.c) + - Registers clock_time devices, manages default source/event selection, and + provides counter <-> nanosecond conversion with fixed-point scaling. +- Clock source device (rt_clock_time_device + RT_CLOCK_TIME_CAP_SOURCE) + - Supplies a free-running counter and frequency for monotonic time reads. +- Clock event device (rt_clock_time_device + RT_CLOCK_TIME_CAP_EVENT) + - Programs the next deadline and calls rt_clock_time_event_isr() on expiry. +- Clock hrtimer (clock_hrtimer.c) + - Schedules high-resolution timeouts, programs the next event, and dispatches + callbacks. Falls back to software timer when no hardware event is available. +- Boottime helpers (clock_boottime.c) + - Converts the monotonic counter into timeval/timespec/seconds for upper + layers. +- Clock timer adapter (clock_timer.c) + - Exposes a unified hardware timer device (rt_clock_timer) and can register + itself as a clock_time event device. +- Architecture sources (arch/* and clock_time_arm_arch.c) + - Provide fast CPU counters or architectural timers and register them as the + default clock source when available. + +## Data Flow + +- Read path + - Clock source counter -> scaled resolution -> nanoseconds -> boottime or + clock_gettime. +- Timeout path + - HRTimer queue -> next expiry -> set_timeout on event device -> event ISR -> + hrtimer processing -> callbacks. + +# Configuration + +Enable the subsystem in menuconfig: + +``` +RT-Thread Components -> + Device Drivers -> + [*] Clock time subsystem (RT_USING_CLOCK_TIME) +``` + +Optional settings: + +- CLOCK_TIMER_FREQ (RISC-V): base counter frequency used by the clock source. +- RT_CLOCK_TIME_ARM_ARCH: enable ARM architected timer integration (DM/OFW). + +# BSP Integration Checklist + +- Provide a clock source: + - Register a rt_clock_time_device with CAP_SOURCE, or use the provided + architecture source (AArch64/RISC-V) via rt_clock_time_source_init(). +- Provide a clock event: + - Register a rt_clock_time_device with CAP_EVENT and call + rt_clock_time_event_isr() in its interrupt handler. + - Or register a rt_clock_timer device; it can become the default event + device automatically. +- Keep event ISRs short; heavy work should run in thread context if needed. + +# Detailed Documents + +- @subpage page_device_clock_time_core +- @subpage page_device_clock_hrtimer +- @subpage page_device_clock_boottime +- @subpage page_device_clock_timer diff --git a/documentation/6.components/device-driver/clock_time/README_zh.md b/documentation/6.components/device-driver/clock_time/README_zh.md new file mode 100644 index 0000000000..d4433f18c2 --- /dev/null +++ b/documentation/6.components/device-driver/clock_time/README_zh.md @@ -0,0 +1,78 @@ +# Clock Time 子系统概述 + +clock_time 子系统为 RT-Thread 提供统一的高精度时间基准与事件调度能力。 +它将单调计数(时钟源)与超时事件(时钟事件)解耦,使平台可以组合不同的 +硬件计数器与定时器,同时为内核与 libc 提供一致的时间行为。 + +# 软件架构 + +![Clock time architecture](figures/clock_time_arch.svg) + +## 分层关系与职责 + +- 上层: + - POSIX/libc 时间接口(clock_gettime、nanosleep)使用 boottime 和 hrtimer API。 + - 软 RTC 使用 boottime 作为单调时间基准进行计时。 + - 设备驱动(输入事件时间戳、vDSO、中断控制器统计)使用 boottime 获取时间戳。 +- clock_time 子系统:核心 API、时钟源/事件设备、高精度定时器调度器、 + boottime 辅助函数、clock_timer 适配层。 +- 下层:BSP 驱动提供硬件计数器与定时器,并封装为 clock_time 设备或 + clock_timer 设备。 + +## 内部组成 + +- Core API(clock_time_core.c) + - 负责设备注册、默认源/事件选择,以及计数 <-> 纳秒的缩放换算。 +- 时钟源设备(rt_clock_time_device + RT_CLOCK_TIME_CAP_SOURCE) + - 提供自由运行计数器与频率,作为单调时间基准。 +- 时钟事件设备(rt_clock_time_device + RT_CLOCK_TIME_CAP_EVENT) + - 负责下一次超时编程,并在到期时调用 rt_clock_time_event_isr()。 +- 高精度定时器(clock_hrtimer.c) + - 维护超时队列、设置下一次事件并分发回调。没有硬件事件时退化为软件定时器。 +- Boottime 辅助(clock_boottime.c) + - 将单调计数转换为 timeval/timespec/秒,供上层使用。 +- Clock timer 适配层(clock_timer.c) + - 提供统一的硬件定时器设备(rt_clock_timer),并可注册为事件设备。 +- 架构源(arch/* 与 clock_time_arm_arch.c) + - 提供 CPU 计数器或架构定时器,并在可用时设置为默认时钟源。 + +## 数据流 + +- 读取路径 + - 时钟源计数 -> 缩放分辨率 -> 纳秒 -> boottime 或 clock_gettime。 +- 超时路径 + - hrtimer 队列 -> 下一到期 -> 事件设备 set_timeout -> 事件中断 -> + hrtimer 处理 -> 回调分发。 + +# 配置选项 + +在 menuconfig 中启用: + +``` +RT-Thread Components -> + Device Drivers -> + [*] Clock time subsystem (RT_USING_CLOCK_TIME) +``` + +可选配置: + +- CLOCK_TIMER_FREQ(RISC-V):时钟源使用的基础计数频率。 +- RT_CLOCK_TIME_ARM_ARCH:启用 ARM 架构定时器集成(DM/OFW)。 + +# BSP 集成要点 + +- 提供时钟源: + - 注册带 CAP_SOURCE 的 rt_clock_time_device,或使用 + rt_clock_time_source_init() 提供的架构源。 +- 提供时钟事件: + - 注册带 CAP_EVENT 的 rt_clock_time_device,并在中断中调用 + rt_clock_time_event_isr()。 + - 或直接注册 rt_clock_timer 设备,自动成为默认事件设备。 +- 事件中断应保持简短,复杂处理建议转到线程上下文。 + +# 详细文档 + +- clock_time_core.md +- clock_hrtimer.md +- clock_boottime.md +- clock_timer.md diff --git a/documentation/6.components/device-driver/clock_time/clock_boottime.md b/documentation/6.components/device-driver/clock_time/clock_boottime.md new file mode 100644 index 0000000000..205c861311 --- /dev/null +++ b/documentation/6.components/device-driver/clock_time/clock_boottime.md @@ -0,0 +1,87 @@ +@page page_device_clock_boottime Clock Boottime Helpers + +# Overview + +Boottime helpers convert the clock_time monotonic counter into standard time +formats. The resulting values represent time since boot and do not depend on +RTC or wall-clock settings. + +# API + +```c +rt_err_t rt_clock_boottime_get_us(struct timeval *tv); +rt_err_t rt_clock_boottime_get_s(time_t *t); +rt_err_t rt_clock_boottime_get_ns(struct timespec *ts); +``` + +All functions return RT_EOK on success or -RT_ERROR if the clock source is +unavailable. The returned values are monotonic and suitable for measuring +elapsed time. + +## rt_clock_boottime_get_us + +```c +rt_err_t rt_clock_boottime_get_us(struct timeval *tv); +``` + +- Purpose: get time since boot as seconds + microseconds. +- Parameters: `tv` must be a valid pointer to `struct timeval`. +- Return values: + - RT_EOK: data written to `tv`. + - -RT_ERROR: no valid clock_time source or conversion failed. +- Notes: + - `tv_usec` is derived from the clock_time resolution and may not be exact + microseconds if the underlying counter does not align to 1 us. + +## rt_clock_boottime_get_s + +```c +rt_err_t rt_clock_boottime_get_s(time_t *t); +``` + +- Purpose: get time since boot in whole seconds. +- Parameters: `t` must be a valid pointer to `time_t`. +- Return values: + - RT_EOK: `*t` updated. + - -RT_ERROR: no valid clock_time source or conversion failed. +- Notes: + - Sub-second precision is discarded; use `rt_clock_boottime_get_us()` or + `rt_clock_boottime_get_ns()` if needed. + +## rt_clock_boottime_get_ns + +```c +rt_err_t rt_clock_boottime_get_ns(struct timespec *ts); +``` + +- Purpose: get time since boot as seconds + nanoseconds. +- Parameters: `ts` must be a valid pointer to `struct timespec`. +- Return values: + - RT_EOK: data written to `ts`. + - -RT_ERROR: no valid clock_time source or conversion failed. +- Notes: + - `tv_nsec` reflects the clock_time resolution; it may not be 1 ns granularity + if the counter frequency is lower. + +# Example + +```c +#include + +static void demo_boottime(void) +{ + struct timespec ts; + + if (rt_clock_boottime_get_ns(&ts) == RT_EOK) + { + rt_kprintf("boottime: %ld.%09ld\n", (long)ts.tv_sec, ts.tv_nsec); + } +} +``` + +# Notes + +- The boottime helpers are used by the soft RTC implementation to build a + stable base time. +- If no clock_time source is registered, the subsystem falls back to the tick + counter and the resolution matches RT_TICK_PER_SECOND. diff --git a/documentation/6.components/device-driver/clock_time/clock_boottime_zh.md b/documentation/6.components/device-driver/clock_time/clock_boottime_zh.md new file mode 100644 index 0000000000..d0a577bf2c --- /dev/null +++ b/documentation/6.components/device-driver/clock_time/clock_boottime_zh.md @@ -0,0 +1,78 @@ +# Clock Boottime 辅助 + +boottime 辅助函数将 clock_time 的单调计数转换为常见时间格式,返回值表示 +“系统启动以来的时间”,不受 RTC 或墙上时间设置影响。 + +# API + +```c +rt_err_t rt_clock_boottime_get_us(struct timeval *tv); +rt_err_t rt_clock_boottime_get_s(time_t *t); +rt_err_t rt_clock_boottime_get_ns(struct timespec *ts); +``` + +成功返回 RT_EOK;若时钟源不可用则返回 -RT_ERROR。返回值单调递增,适合用于 +测量耗时。 + +## rt_clock_boottime_get_us + +```c +rt_err_t rt_clock_boottime_get_us(struct timeval *tv); +``` + +- 作用:获取启动以来的时间,格式为秒 + 微秒。 +- 参数:`tv` 需为有效的 `struct timeval` 指针。 +- 返回值: + - RT_EOK:成功写入 `tv`。 + - -RT_ERROR:无有效时钟源或换算失败。 +- 说明: + - `tv_usec` 由 clock_time 分辨率换算而来,不一定严格为 1 us 精度。 + +## rt_clock_boottime_get_s + +```c +rt_err_t rt_clock_boottime_get_s(time_t *t); +``` + +- 作用:获取启动以来的整秒数。 +- 参数:`t` 需为有效的 `time_t` 指针。 +- 返回值: + - RT_EOK:成功写入 `*t`。 + - -RT_ERROR:无有效时钟源或换算失败。 +- 说明: + - 该接口仅返回秒,若需亚秒精度请使用其它接口。 + +## rt_clock_boottime_get_ns + +```c +rt_err_t rt_clock_boottime_get_ns(struct timespec *ts); +``` + +- 作用:获取启动以来的时间,格式为秒 + 纳秒。 +- 参数:`ts` 需为有效的 `struct timespec` 指针。 +- 返回值: + - RT_EOK:成功写入 `ts`。 + - -RT_ERROR:无有效时钟源或换算失败。 +- 说明: + - `tv_nsec` 的精度取决于计数频率,不一定达到 1 ns。 + +# 示例 + +```c +#include + +static void demo_boottime(void) +{ + struct timespec ts; + + if (rt_clock_boottime_get_ns(&ts) == RT_EOK) + { + rt_kprintf("boottime: %ld.%09ld\n", (long)ts.tv_sec, ts.tv_nsec); + } +} +``` + +# 注意事项 + +- 软 RTC 会使用 boottime 作为稳定基准。 +- 未注册时钟源时,系统退化为 tick 计数,分辨率由 RT_TICK_PER_SECOND 决定。 diff --git a/documentation/6.components/device-driver/clock_time/clock_hrtimer.md b/documentation/6.components/device-driver/clock_time/clock_hrtimer.md new file mode 100644 index 0000000000..ff64ab56d4 --- /dev/null +++ b/documentation/6.components/device-driver/clock_time/clock_hrtimer.md @@ -0,0 +1,223 @@ +@page page_device_clock_hrtimer Clock HRTimer + +# Overview + +The clock hrtimer layer provides high-resolution timeout scheduling on top of +clock_time. It keeps a sorted timeout list, programs the next deadline, and +runs callbacks when the deadline expires. + +# Key Concepts + +- Time base: delay counts are expressed in the clock source counter units. +- Event programming: the next expiry is converted to event units and sent to + the clock event device. +- Fallback: if no hardware event exists, a software timer triggers processing. + +# API + +```c +void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer, + const char *name, + rt_uint8_t flag, + void (*timeout)(void *parameter), + void *parameter); +rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long cnt); +rt_err_t rt_clock_hrtimer_stop(rt_clock_hrtimer_t timer); +rt_err_t rt_clock_hrtimer_control(rt_clock_hrtimer_t timer, int cmd, void *arg); +rt_err_t rt_clock_hrtimer_detach(rt_clock_hrtimer_t timer); + +void rt_clock_hrtimer_delay_init(struct rt_clock_hrtimer *timer); +void rt_clock_hrtimer_delay_detach(struct rt_clock_hrtimer *timer); +rt_err_t rt_clock_hrtimer_sleep(struct rt_clock_hrtimer *timer, unsigned long cnt); +rt_err_t rt_clock_hrtimer_ndelay(struct rt_clock_hrtimer *timer, unsigned long ns); +rt_err_t rt_clock_hrtimer_udelay(struct rt_clock_hrtimer *timer, unsigned long us); +rt_err_t rt_clock_hrtimer_mdelay(struct rt_clock_hrtimer *timer, unsigned long ms); +``` + +Flags reuse RT_TIMER_FLAG_* definitions (one-shot/periodic/hard timer). `cnt` +is a counter delta based on the default clock source. + +## rt_clock_hrtimer_init + +```c +void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer, + const char *name, + rt_uint8_t flag, + void (*timeout)(void *parameter), + void *parameter); +``` + +- Purpose: initialize a high-resolution timer object. +- Parameters: + - `timer`: the hrtimer object to initialize. + - `name`: timer name (truncated to RT_NAME_MAX-1). + - `flag`: RT_TIMER_FLAG_* (one-shot/periodic/hard timer). + - `timeout`: callback function on expiry. + - `parameter`: user parameter passed to the callback. +- Behavior: + - Clears internal state, initializes list node and completion. + - Does not start the timer; call `rt_clock_hrtimer_start()` to arm it. +- Context: thread context. + +## rt_clock_hrtimer_start + +```c +rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long cnt); +``` + +- Purpose: arm a timer to expire after `cnt` counter ticks. +- Parameters: + - `cnt`: relative delay in clock source counter units. +- Return values: + - RT_EOK: timer armed. + - -RT_ERROR: timer already active or invalid `cnt`. +- Notes: + - `cnt` must be less than half of the maximum counter range to avoid wrap + ambiguity. + - Starting a timer programs the next clock event if this timer becomes the + earliest deadline. + +## rt_clock_hrtimer_stop + +```c +rt_err_t rt_clock_hrtimer_stop(rt_clock_hrtimer_t timer); +``` + +- Purpose: cancel an active timer. +- Return values: + - RT_EOK: timer stopped. + - -RT_ERROR: timer was not active. +- Notes: stopping a timer may reprogram the next event. + +## rt_clock_hrtimer_control + +```c +rt_err_t rt_clock_hrtimer_control(rt_clock_hrtimer_t timer, int cmd, void *arg); +``` + +- Purpose: query or modify a timer after initialization. +- Common commands (same as RT-Thread timers): + - RT_TIMER_CTRL_GET_TIME: get `delay_cnt` into `*(unsigned long *)arg`. + - RT_TIMER_CTRL_SET_TIME: set `delay_cnt` from `*(unsigned long *)arg`. + - RT_TIMER_CTRL_SET_ONESHOT / RT_TIMER_CTRL_SET_PERIODIC: set mode. + - RT_TIMER_CTRL_GET_STATE: return activated/deactivated state. + - RT_TIMER_CTRL_GET_REMAIN_TIME: get absolute timeout counter. + - RT_TIMER_CTRL_GET_FUNC / RT_TIMER_CTRL_SET_FUNC: get/set callback. + - RT_TIMER_CTRL_GET_PARM / RT_TIMER_CTRL_SET_PARM: get/set parameter. +- Notes: + - Changing time or mode while active updates internal deadline but does not + implicitly restart a stopped timer. + +## rt_clock_hrtimer_detach + +```c +rt_err_t rt_clock_hrtimer_detach(rt_clock_hrtimer_t timer); +``` + +- Purpose: detach a timer and wake any waiters. +- Behavior: + - Marks the timer inactive and wakes `rt_clock_hrtimer_sleep()` waiters with + an error code. + - Removes the timer from the list if needed. +- Use case: cleanup when a timer is no longer valid. + +## rt_clock_hrtimer_delay_init + +```c +void rt_clock_hrtimer_delay_init(struct rt_clock_hrtimer *timer); +``` + +- Purpose: initialize a one-shot hrtimer for blocking delays. +- Behavior: sets a built-in timeout callback that signals a completion. + +## rt_clock_hrtimer_delay_detach + +```c +void rt_clock_hrtimer_delay_detach(struct rt_clock_hrtimer *timer); +``` + +- Purpose: detach a delay timer created by `rt_clock_hrtimer_delay_init()`. +- Notes: safe to call even if the timer has already expired. + +## rt_clock_hrtimer_sleep + +```c +rt_err_t rt_clock_hrtimer_sleep(struct rt_clock_hrtimer *timer, unsigned long cnt); +``` + +- Purpose: block the current thread until the delay expires. +- Parameters: `timer` must be initialized (typically by delay_init). +- Return values: + - RT_EOK: timeout expired normally. + - -RT_EINTR: interrupted by signal or detach. + - -RT_EINVAL: `cnt` is zero. +- Context: thread context only. + +## rt_clock_hrtimer_ndelay / udelay / mdelay + +```c +rt_err_t rt_clock_hrtimer_ndelay(struct rt_clock_hrtimer *timer, unsigned long ns); +rt_err_t rt_clock_hrtimer_udelay(struct rt_clock_hrtimer *timer, unsigned long us); +rt_err_t rt_clock_hrtimer_mdelay(struct rt_clock_hrtimer *timer, unsigned long ms); +``` + +- Purpose: sleep for a duration expressed in nanoseconds, microseconds, or + milliseconds. +- Behavior: + - Converts the time into counter units using the current clock_time + resolution and calls `rt_clock_hrtimer_sleep()`. +- Notes: + - The actual delay is limited by the clock source resolution and event + programming granularity. + +# Typical Flow + +1. Initialize a hrtimer with a callback. +2. Convert a time interval to counter units, or use the ndelay/udelay/mdelay + helpers. +3. Start the timer; the subsystem will program the next event. +4. When the event ISR fires, rt_clock_time_event_isr() runs hrtimer processing + and dispatches callbacks. + +# Example: One-shot Timeout + +```c +#include + +static struct rt_clock_hrtimer demo_timer; + +static void demo_timeout(void *parameter) +{ + RT_UNUSED(parameter); + rt_kprintf("hrtimer timeout\n"); +} + +static void demo_hrtimer_start(void) +{ + rt_uint64_t ns = 5ULL * 1000 * 1000; /* 5 ms */ + unsigned long cnt = (unsigned long)rt_clock_time_ns_to_counter(ns); + + rt_clock_hrtimer_init(&demo_timer, "demo", RT_TIMER_FLAG_ONE_SHOT, + demo_timeout, RT_NULL); + rt_clock_hrtimer_start(&demo_timer, cnt); +} +``` + +# Example: Sleep Helper + +```c +static void demo_hrtimer_sleep(void) +{ + struct rt_clock_hrtimer timer; + + rt_clock_hrtimer_delay_init(&timer); + rt_clock_hrtimer_mdelay(&timer, 10); + rt_clock_hrtimer_delay_detach(&timer); +} +``` + +# Notes + +- Callbacks may run in interrupt context when using a hardware event device. +- rt_clock_hrtimer_sleep() waits on a completion and may return -RT_EINTR if + interrupted. diff --git a/documentation/6.components/device-driver/clock_time/clock_hrtimer_zh.md b/documentation/6.components/device-driver/clock_time/clock_hrtimer_zh.md new file mode 100644 index 0000000000..50462072d1 --- /dev/null +++ b/documentation/6.components/device-driver/clock_time/clock_hrtimer_zh.md @@ -0,0 +1,208 @@ +# Clock HRTimer + +clock hrtimer 在 clock_time 之上提供高精度超时调度。它维护按到期时间排序的 +队列,编程下一次事件,并在到期时执行回调。 + +# 关键点 + +- 时间基准:延时 cnt 基于默认时钟源的计数单位。 +- 事件编程:将下一次到期换算为事件单位后调用事件设备。 +- 退化机制:缺少硬件事件时自动使用软件定时器触发处理。 + +# API + +```c +void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer, + const char *name, + rt_uint8_t flag, + void (*timeout)(void *parameter), + void *parameter); +rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long cnt); +rt_err_t rt_clock_hrtimer_stop(rt_clock_hrtimer_t timer); +rt_err_t rt_clock_hrtimer_control(rt_clock_hrtimer_t timer, int cmd, void *arg); +rt_err_t rt_clock_hrtimer_detach(rt_clock_hrtimer_t timer); + +void rt_clock_hrtimer_delay_init(struct rt_clock_hrtimer *timer); +void rt_clock_hrtimer_delay_detach(struct rt_clock_hrtimer *timer); +rt_err_t rt_clock_hrtimer_sleep(struct rt_clock_hrtimer *timer, unsigned long cnt); +rt_err_t rt_clock_hrtimer_ndelay(struct rt_clock_hrtimer *timer, unsigned long ns); +rt_err_t rt_clock_hrtimer_udelay(struct rt_clock_hrtimer *timer, unsigned long us); +rt_err_t rt_clock_hrtimer_mdelay(struct rt_clock_hrtimer *timer, unsigned long ms); +``` + +flag 复用 RT_TIMER_FLAG_* 定义(单次/周期/硬定时器)。cnt 为默认时钟源计数 +单位。 + +## rt_clock_hrtimer_init + +```c +void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer, + const char *name, + rt_uint8_t flag, + void (*timeout)(void *parameter), + void *parameter); +``` + +- 作用:初始化一个高精度定时器对象。 +- 参数: + - `timer`:待初始化的 hrtimer 对象。 + - `name`:定时器名称(超过 RT_NAME_MAX-1 会截断)。 + - `flag`:RT_TIMER_FLAG_* 标志(单次/周期/硬定时器)。 + - `timeout`:超时回调函数。 + - `parameter`:回调参数。 +- 行为: + - 清理内部状态,初始化链表节点与 completion。 + - 仅初始化,不会启动,需要调用 `rt_clock_hrtimer_start()`。 +- 上下文:线程上下文。 + +## rt_clock_hrtimer_start + +```c +rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long cnt); +``` + +- 作用:启动定时器,在 `cnt` 个计数后到期。 +- 参数: + - `cnt`:相对延时,单位为默认时钟源计数。 +- 返回值: + - RT_EOK:启动成功。 + - -RT_ERROR:定时器已激活或 `cnt` 非法。 +- 说明: + - `cnt` 需小于计数器最大值的一半,以避免回绕歧义。 + - 启动后可能重新编程下一次事件。 + +## rt_clock_hrtimer_stop + +```c +rt_err_t rt_clock_hrtimer_stop(rt_clock_hrtimer_t timer); +``` + +- 作用:停止一个正在运行的定时器。 +- 返回值: + - RT_EOK:停止成功。 + - -RT_ERROR:定时器未激活。 +- 说明:停止定时器可能触发重新编程下一次事件。 + +## rt_clock_hrtimer_control + +```c +rt_err_t rt_clock_hrtimer_control(rt_clock_hrtimer_t timer, int cmd, void *arg); +``` + +- 作用:查询或修改定时器属性。 +- 常用命令(与 RT-Thread 定时器一致): + - RT_TIMER_CTRL_GET_TIME:读取 `delay_cnt` 到 `*(unsigned long *)arg`。 + - RT_TIMER_CTRL_SET_TIME:用 `*(unsigned long *)arg` 设置 `delay_cnt`。 + - RT_TIMER_CTRL_SET_ONESHOT / RT_TIMER_CTRL_SET_PERIODIC:设置模式。 + - RT_TIMER_CTRL_GET_STATE:查询激活状态。 + - RT_TIMER_CTRL_GET_REMAIN_TIME:获取绝对到期计数值。 + - RT_TIMER_CTRL_GET_FUNC / RT_TIMER_CTRL_SET_FUNC:获取/设置回调。 + - RT_TIMER_CTRL_GET_PARM / RT_TIMER_CTRL_SET_PARM:获取/设置参数。 +- 说明: + - 修改时间或模式不会自动启动已停止的定时器。 + +## rt_clock_hrtimer_detach + +```c +rt_err_t rt_clock_hrtimer_detach(rt_clock_hrtimer_t timer); +``` + +- 作用:分离定时器,并唤醒等待者。 +- 行为: + - 标记定时器为未激活。 + - 唤醒 `rt_clock_hrtimer_sleep()` 的等待线程并返回错误。 +- 适用场景:定时器资源释放或任务退出。 + +## rt_clock_hrtimer_delay_init + +```c +void rt_clock_hrtimer_delay_init(struct rt_clock_hrtimer *timer); +``` + +- 作用:初始化用于阻塞延时的 one-shot hrtimer。 +- 行为:设置内部回调为 completion 触发函数。 + +## rt_clock_hrtimer_delay_detach + +```c +void rt_clock_hrtimer_delay_detach(struct rt_clock_hrtimer *timer); +``` + +- 作用:释放 delay_init 初始化的定时器。 +- 说明:即使已超时也可安全调用。 + +## rt_clock_hrtimer_sleep + +```c +rt_err_t rt_clock_hrtimer_sleep(struct rt_clock_hrtimer *timer, unsigned long cnt); +``` + +- 作用:阻塞当前线程,直到超时。 +- 参数:`timer` 需已初始化(通常通过 delay_init)。 +- 返回值: + - RT_EOK:正常到期。 + - -RT_EINTR:被信号打断或 detach。 + - -RT_EINVAL:`cnt` 为 0。 +- 上下文:仅线程上下文可用。 + +## rt_clock_hrtimer_ndelay / udelay / mdelay + +```c +rt_err_t rt_clock_hrtimer_ndelay(struct rt_clock_hrtimer *timer, unsigned long ns); +rt_err_t rt_clock_hrtimer_udelay(struct rt_clock_hrtimer *timer, unsigned long us); +rt_err_t rt_clock_hrtimer_mdelay(struct rt_clock_hrtimer *timer, unsigned long ms); +``` + +- 作用:按纳秒/微秒/毫秒为单位进行阻塞延时。 +- 行为:根据 clock_time 分辨率换算为计数后调用 `rt_clock_hrtimer_sleep()`。 +- 说明: + - 实际延时受计数频率与事件编程粒度限制。 + +# 典型流程 + +1. 初始化 hrtimer 并设置回调。 +2. 将时间转换为计数值,或使用 ndelay/udelay/mdelay 辅助函数。 +3. 启动定时器,系统会自动编程下一次事件。 +4. 事件中断调用 rt_clock_time_event_isr(),触发 hrtimer 处理与回调分发。 + +# 示例:单次超时 + +```c +#include + +static struct rt_clock_hrtimer demo_timer; + +static void demo_timeout(void *parameter) +{ + RT_UNUSED(parameter); + rt_kprintf("hrtimer timeout\n"); +} + +static void demo_hrtimer_start(void) +{ + rt_uint64_t ns = 5ULL * 1000 * 1000; /* 5 ms */ + unsigned long cnt = (unsigned long)rt_clock_time_ns_to_counter(ns); + + rt_clock_hrtimer_init(&demo_timer, "demo", RT_TIMER_FLAG_ONE_SHOT, + demo_timeout, RT_NULL); + rt_clock_hrtimer_start(&demo_timer, cnt); +} +``` + +# 示例:延时辅助 + +```c +static void demo_hrtimer_sleep(void) +{ + struct rt_clock_hrtimer timer; + + rt_clock_hrtimer_delay_init(&timer); + rt_clock_hrtimer_mdelay(&timer, 10); + rt_clock_hrtimer_delay_detach(&timer); +} +``` + +# 注意事项 + +- 使用硬件事件时,回调可能在中断上下文执行。 +- rt_clock_hrtimer_sleep() 会等待 completion,可能返回 -RT_EINTR。 diff --git a/documentation/6.components/device-driver/clock_time/clock_time_core.md b/documentation/6.components/device-driver/clock_time/clock_time_core.md new file mode 100644 index 0000000000..e7d099eb9d --- /dev/null +++ b/documentation/6.components/device-driver/clock_time/clock_time_core.md @@ -0,0 +1,274 @@ +@page page_device_clock_time_core Clock Time Core + +# Overview + +The clock_time core defines the device model and conversion helpers used by the +subsystem. It manages the default clock source and clock event devices and +provides fixed-point conversion between counters and nanoseconds. + +# Device Model + +## Clock Time Operations + +```c +struct rt_clock_time_ops +{ + rt_uint64_t (*get_freq)(struct rt_clock_time_device *dev); + rt_uint64_t (*get_counter)(struct rt_clock_time_device *dev); + rt_err_t (*set_timeout)(struct rt_clock_time_device *dev, rt_uint64_t delta); +}; +``` + +### get_freq + +- Purpose: return the counter frequency in Hz. +- Requirements: + - Must be stable and match the source used by get_counter. + - Should be non-zero; zero indicates the device is not ready. + +### get_counter + +- Purpose: return a monotonically increasing counter value. +- Requirements: + - Must not go backwards. + - Wrap behavior is allowed but should be consistent with the width of the + counter used by the device. + +### set_timeout + +- Purpose: program the next timeout relative to the current counter value. +- Parameters: `delta` is in the same counter units returned by get_counter. +- Behavior: + - If `delta` is 0 and the hardware supports it, the event can be canceled. + - Return -RT_ENOSYS when the device does not support event programming. + +## Clock Time Device + +```c +struct rt_clock_time_device +{ + struct rt_device parent; + const struct rt_clock_time_ops *ops; + rt_uint64_t res_scale; + rt_uint8_t caps; /* RT_CLOCK_TIME_CAP_SOURCE / RT_CLOCK_TIME_CAP_EVENT */ +}; +``` + +- res_scale provides extra precision in the conversion pipeline. If set to 0, + RT_CLOCK_TIME_RESMUL is used by default. +- caps advertises whether the device can be used as a clock source, a clock + event, or both. + +## Register and Select Devices + +```c +rt_err_t rt_clock_time_device_register(struct rt_clock_time_device *dev, + const char *name, + rt_uint8_t caps); +void rt_clock_time_set_default_source(struct rt_clock_time_device *dev); +void rt_clock_time_set_default_event(struct rt_clock_time_device *dev); +struct rt_clock_time_device *rt_clock_time_get_default_source(void); +struct rt_clock_time_device *rt_clock_time_get_default_event(void); +``` + +### rt_clock_time_device_register + +- Purpose: register a clock_time device and its capabilities. +- Parameters: + - `dev`: device object with ops and res_scale initialized. + - `name`: device name; if NULL, only capability registration is performed. + - `caps`: RT_CLOCK_TIME_CAP_SOURCE and/or RT_CLOCK_TIME_CAP_EVENT. +- Behavior: + - Registers the device under RT_Device_Class_Timer when `name` is provided. + - If this is the first source, it becomes the default source. + - If this is the first event, it becomes the default event. +- Return values: + - RT_EOK on success. + - Negative error code if device registration fails. + +### rt_clock_time_set_default_source / rt_clock_time_set_default_event + +- Purpose: explicitly select the default source or event device. +- Behavior: overrides the auto-selected default. + +### rt_clock_time_get_default_source / rt_clock_time_get_default_event + +- Purpose: query the current default devices. +- Behavior: + - Source defaults to the internal tick-based device if none was registered. + - Event returns NULL if no event device is available. + +### rt_clock_time_source_init + +- Purpose: BSP hook to register an architecture counter or board source. +- Notes: this function is weak and may be overridden by BSP code. + +# Clock Time Query APIs + +```c +rt_uint64_t rt_clock_time_get_freq(void); +rt_uint64_t rt_clock_time_get_counter(void); +rt_uint64_t rt_clock_time_get_event_freq(void); +rt_uint64_t rt_clock_time_get_event_res_scaled(void); +``` + +## rt_clock_time_get_freq + +- Purpose: return the frequency of the default source in Hz. +- Return values: + - Non-zero frequency on success. + - 0 if no valid source is available. + +## rt_clock_time_get_counter + +- Purpose: return the current counter from the default source. +- Return values: + - Monotonic counter value on success. + - 0 if no valid source is available. + +## rt_clock_time_get_event_freq + +- Purpose: return the event device frequency in Hz. +- Behavior: if no event device exists, falls back to the default source. + +## rt_clock_time_get_event_res_scaled + +- Purpose: return the scaled resolution for the event device. +- Behavior: if no event device exists, falls back to the default source. + +# Conversion Helpers + +```c +rt_uint64_t rt_clock_time_get_res_scaled(void); +rt_uint64_t rt_clock_time_counter_to_ns(rt_uint64_t cnt); +rt_uint64_t rt_clock_time_ns_to_counter(rt_uint64_t ns); +``` + +## rt_clock_time_get_res_scaled + +- Purpose: return the scaled resolution for the default source. +- Return values: + - Non-zero scaled resolution when the source is ready. + - 0 when the source is missing or frequency is invalid. + +## rt_clock_time_counter_to_ns + +- Purpose: convert a counter value to nanoseconds based on the default source. +- Notes: returns 0 when resolution is unavailable. + +## rt_clock_time_ns_to_counter + +- Purpose: convert nanoseconds to counter units for the default source. +- Notes: returns 0 when resolution is unavailable. + +Internally, the core computes a scaled resolution: + +``` +res_scaled = (1e9 * res_scale) / freq +``` + +Nanoseconds are then derived using the scale factor RT_CLOCK_TIME_RESMUL to +avoid floating-point math. This keeps precision stable even when freq is not a +power of ten. + +# Event API + +```c +rt_err_t rt_clock_time_set_timeout(rt_uint64_t delta); +void rt_clock_time_event_isr(void); +``` + +## rt_clock_time_set_timeout + +- Purpose: program the next event using the default event device. +- Parameters: `delta` in event counter units (same as event get_counter). +- Return values: + - RT_EOK on success. + - -RT_ENOSYS if no event device exists or set_timeout is unsupported. + +## rt_clock_time_event_isr + +- Purpose: drive the hrtimer scheduler when an event expires. +- Usage: + - Call from the hardware timer ISR after acknowledging the interrupt. + - This function processes expired hrtimers and programs the next event. + +# BSP Integration Example + +## Register a Clock Source + +```c +static rt_uint64_t demo_get_freq(struct rt_clock_time_device *dev) +{ + RT_UNUSED(dev); + return 10000000ULL; /* 10 MHz */ +} + +static rt_uint64_t demo_get_counter(struct rt_clock_time_device *dev) +{ + RT_UNUSED(dev); + return demo_hw_counter_read(); +} + +static const struct rt_clock_time_ops demo_src_ops = +{ + demo_get_freq, + demo_get_counter, + RT_NULL, +}; + +static struct rt_clock_time_device demo_src_dev = +{ + .ops = &demo_src_ops, + .res_scale = RT_CLOCK_TIME_RESMUL, +}; + +void rt_clock_time_source_init(void) +{ + rt_clock_time_device_register(&demo_src_dev, "clock_time_demo_src", + RT_CLOCK_TIME_CAP_SOURCE); + rt_clock_time_set_default_source(&demo_src_dev); +} +``` + +## Register a Clock Event + +```c +static rt_err_t demo_set_timeout(struct rt_clock_time_device *dev, rt_uint64_t delta) +{ + RT_UNUSED(dev); + return demo_hw_timer_program(delta); +} + +static const struct rt_clock_time_ops demo_evt_ops = +{ + demo_get_freq, + demo_get_counter, + demo_set_timeout, +}; + +static struct rt_clock_time_device demo_evt_dev = +{ + .ops = &demo_evt_ops, + .res_scale = RT_CLOCK_TIME_RESMUL, +}; + +static void demo_timer_isr(void) +{ + demo_hw_timer_ack(); + rt_clock_time_event_isr(); +} + +void demo_register_event(void) +{ + rt_clock_time_device_register(&demo_evt_dev, "clock_time_demo_evt", + RT_CLOCK_TIME_CAP_EVENT); + rt_clock_time_set_default_event(&demo_evt_dev); +} +``` + +# Notes + +- Event callbacks may run in interrupt context when backed by a hardware event. +- If no event device is available, the hrtimer subsystem falls back to a + software timer. diff --git a/documentation/6.components/device-driver/clock_time/clock_time_core_zh.md b/documentation/6.components/device-driver/clock_time/clock_time_core_zh.md new file mode 100644 index 0000000000..9e81180f32 --- /dev/null +++ b/documentation/6.components/device-driver/clock_time/clock_time_core_zh.md @@ -0,0 +1,256 @@ +# Clock Time Core + +clock_time core 定义了子系统的设备模型与换算接口,负责默认时钟源/事件 +选择,并提供计数值与纳秒之间的定点换算。 + +# 设备模型 + +## 时钟操作接口 + +```c +struct rt_clock_time_ops +{ + rt_uint64_t (*get_freq)(struct rt_clock_time_device *dev); + rt_uint64_t (*get_counter)(struct rt_clock_time_device *dev); + rt_err_t (*set_timeout)(struct rt_clock_time_device *dev, rt_uint64_t delta); +}; +``` + +### get_freq + +- 作用:返回计数频率(Hz)。 +- 要求: + - 频率应稳定并与 get_counter 使用的计数源一致。 + - 返回 0 表示设备尚不可用。 + +### get_counter + +- 作用:返回单调递增计数值。 +- 要求: + - 不能回退。 + - 允许回绕,但需与硬件计数位宽一致。 + +### set_timeout + +- 作用:设置相对当前计数的超时事件。 +- 参数:`delta` 为计数单位,与 get_counter 一致。 +- 行为: + - 若 `delta` 为 0 且硬件支持,可取消事件。 + - 不支持时应返回 -RT_ENOSYS。 + +## 时钟设备对象 + +```c +struct rt_clock_time_device +{ + struct rt_device parent; + const struct rt_clock_time_ops *ops; + rt_uint64_t res_scale; + rt_uint8_t caps; /* RT_CLOCK_TIME_CAP_SOURCE / RT_CLOCK_TIME_CAP_EVENT */ +}; +``` + +- res_scale 用于提高换算精度,0 表示使用 RT_CLOCK_TIME_RESMUL 默认值。 +- caps 用于标识设备能力:时钟源或时钟事件。 + +## 注册与默认选择 + +```c +rt_err_t rt_clock_time_device_register(struct rt_clock_time_device *dev, + const char *name, + rt_uint8_t caps); +void rt_clock_time_set_default_source(struct rt_clock_time_device *dev); +void rt_clock_time_set_default_event(struct rt_clock_time_device *dev); +struct rt_clock_time_device *rt_clock_time_get_default_source(void); +struct rt_clock_time_device *rt_clock_time_get_default_event(void); +``` + +### rt_clock_time_device_register + +- 作用:注册 clock_time 设备及其能力。 +- 参数: + - `dev`:设备对象,需初始化 ops 与 res_scale。 + - `name`:设备名;为 NULL 时仅注册能力,不进入设备框架。 + - `caps`:RT_CLOCK_TIME_CAP_SOURCE / RT_CLOCK_TIME_CAP_EVENT。 +- 行为: + - 当 `name` 非空时,以 RT_Device_Class_Timer 注册到设备框架。 + - 首个时钟源/事件默认成为系统默认。 +- 返回值:成功返回 RT_EOK,失败返回负错误码。 + +### rt_clock_time_set_default_source / rt_clock_time_set_default_event + +- 作用:显式设置默认时钟源/事件设备。 +- 说明:会覆盖自动选择结果。 + +### rt_clock_time_get_default_source / rt_clock_time_get_default_event + +- 作用:获取当前默认设备。 +- 行为: + - 若无时钟源,返回内部 tick 源。 + - 若无事件设备,返回 NULL。 + +### rt_clock_time_source_init + +- 作用:BSP 提供时钟源的弱符号入口。 +- 说明:可在 BSP 中重写该函数完成设备注册。 + +# 时钟查询接口 + +```c +rt_uint64_t rt_clock_time_get_freq(void); +rt_uint64_t rt_clock_time_get_counter(void); +rt_uint64_t rt_clock_time_get_event_freq(void); +rt_uint64_t rt_clock_time_get_event_res_scaled(void); +``` + +## rt_clock_time_get_freq + +- 作用:获取默认时钟源频率(Hz)。 +- 返回值:成功返回非 0 频率;无有效时钟源则返回 0。 + +## rt_clock_time_get_counter + +- 作用:获取默认时钟源计数值。 +- 返回值:成功返回计数值;无有效时钟源则返回 0。 + +## rt_clock_time_get_event_freq + +- 作用:获取事件设备频率(Hz)。 +- 行为:若无事件设备则回退使用默认时钟源。 + +## rt_clock_time_get_event_res_scaled + +- 作用:获取事件设备的缩放分辨率。 +- 行为:若无事件设备则回退使用默认时钟源。 + +# 换算接口 + +```c +rt_uint64_t rt_clock_time_get_res_scaled(void); +rt_uint64_t rt_clock_time_counter_to_ns(rt_uint64_t cnt); +rt_uint64_t rt_clock_time_ns_to_counter(rt_uint64_t ns); +``` + +## rt_clock_time_get_res_scaled + +- 作用:获取默认时钟源的缩放分辨率。 +- 返回值:无有效时钟源时返回 0。 + +## rt_clock_time_counter_to_ns + +- 作用:将计数值换算为纳秒。 +- 说明:当分辨率不可用时返回 0。 + +## rt_clock_time_ns_to_counter + +- 作用:将纳秒换算为计数值。 +- 说明:当分辨率不可用时返回 0。 + +核心使用定点缩放换算: + +``` +res_scaled = (1e9 * res_scale) / freq +``` + +然后用 RT_CLOCK_TIME_RESMUL 进行定点缩放,以避免浮点运算带来的精度损失。 + +# 事件接口 + +```c +rt_err_t rt_clock_time_set_timeout(rt_uint64_t delta); +void rt_clock_time_event_isr(void); +``` + +## rt_clock_time_set_timeout + +- 作用:通过默认事件设备设置下一次超时。 +- 参数:`delta` 为事件设备计数单位。 +- 返回值: + - RT_EOK:成功。 + - -RT_ENOSYS:无事件设备或不支持 set_timeout。 + +## rt_clock_time_event_isr + +- 作用:事件到期时驱动 hrtimer 处理。 +- 使用方式: + - 在硬件中断中确认中断后调用该函数。 + - 该函数处理已到期的 hrtimer 并编程下一次事件。 + +# BSP 集成示例 + +## 注册时钟源 + +```c +static rt_uint64_t demo_get_freq(struct rt_clock_time_device *dev) +{ + RT_UNUSED(dev); + return 10000000ULL; /* 10 MHz */ +} + +static rt_uint64_t demo_get_counter(struct rt_clock_time_device *dev) +{ + RT_UNUSED(dev); + return demo_hw_counter_read(); +} + +static const struct rt_clock_time_ops demo_src_ops = +{ + demo_get_freq, + demo_get_counter, + RT_NULL, +}; + +static struct rt_clock_time_device demo_src_dev = +{ + .ops = &demo_src_ops, + .res_scale = RT_CLOCK_TIME_RESMUL, +}; + +void rt_clock_time_source_init(void) +{ + rt_clock_time_device_register(&demo_src_dev, "clock_time_demo_src", + RT_CLOCK_TIME_CAP_SOURCE); + rt_clock_time_set_default_source(&demo_src_dev); +} +``` + +## 注册时钟事件 + +```c +static rt_err_t demo_set_timeout(struct rt_clock_time_device *dev, rt_uint64_t delta) +{ + RT_UNUSED(dev); + return demo_hw_timer_program(delta); +} + +static const struct rt_clock_time_ops demo_evt_ops = +{ + demo_get_freq, + demo_get_counter, + demo_set_timeout, +}; + +static struct rt_clock_time_device demo_evt_dev = +{ + .ops = &demo_evt_ops, + .res_scale = RT_CLOCK_TIME_RESMUL, +}; + +static void demo_timer_isr(void) +{ + demo_hw_timer_ack(); + rt_clock_time_event_isr(); +} + +void demo_register_event(void) +{ + rt_clock_time_device_register(&demo_evt_dev, "clock_time_demo_evt", + RT_CLOCK_TIME_CAP_EVENT); + rt_clock_time_set_default_event(&demo_evt_dev); +} +``` + +# 注意事项 + +- 使用硬件事件时,回调可能运行于中断上下文。 +- 未提供事件设备时,hrtimer 会退化到软件定时器实现。 diff --git a/documentation/6.components/device-driver/hwtimer/hwtimer.md b/documentation/6.components/device-driver/clock_time/clock_timer.md similarity index 64% rename from documentation/6.components/device-driver/hwtimer/hwtimer.md rename to documentation/6.components/device-driver/clock_time/clock_timer.md index 0e2e9767f7..d6c0721bc8 100644 --- a/documentation/6.components/device-driver/hwtimer/hwtimer.md +++ b/documentation/6.components/device-driver/clock_time/clock_timer.md @@ -1,4 +1,6 @@ -@page page_device_hwtimer HWTIMER Device +@page page_device_clock_timer CLOCK_TIMER Device + +> Note: CLOCK_TIMER is the unified hardware timer device in the `clock_time` subsystem. # Introduction to the Timer @@ -10,6 +12,14 @@ Hardware timers generally have two modes of operation, timer mode and counter mo **Counting frequency**:Since the input frequency is usually fixed, the time it takes for the counter to reach its desired count number can be calculated from just the given frequency - `time = count value / count frequency`. For example, if the counting frequency is 1 MHz, the counter counts once every 1 / 1000000 seconds. That is, every 1 microsecond, the counter is incremented by one (or subtracted by one), at this time, the maximum timing capability of the 16-bit counter is 65535 microseconds, or 65.535 milliseconds. +# Relationship to clock_time + +CLOCK_TIMER devices can be used directly by applications through the RT-Thread +device API, and can also act as a clock_time event device. When a clock_timer +is registered with `rt_clock_timer_register()` and selected as the default +event, its ISR calls `rt_clock_time_event_isr()` internally, which drives the +high-resolution timer scheduler. + # Access Hardware Timer Device The application accesses the hardware timer device through the I/O device management interface provided by RT-Thread. The related interfaces are as follows: @@ -42,12 +52,16 @@ rt_device_t rt_device_find(const char* name); In general, the hardware timer device name registered to the system is timer0, timer1, etc. The usage examples are as follows: ```c -#define HWTIMER_DEV_NAME "timer0" /* timer name */ +#define CLOCK_TIMER_DEV_NAME "timer0" /* timer name */ rt_device_t hw_dev; /* timer device handle */ /* find timer device */ -hw_dev = rt_device_find(HWTIMER_DEV_NAME); +hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); ``` +Details: +- The device name is assigned by the BSP when calling `rt_clock_timer_register()`. +- If multiple timers are registered, each is exposed as a separate device. + ## Open Timer Device With the device handle, the application can open the device. When the device is open, it will detect whether the device has been initialized. If it is not initialized, it will call the initialization interface to initialize the device by default. Open the device with the following function: @@ -67,14 +81,20 @@ rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags); An example of use is as follows: ```c -#define HWTIMER_DEV_NAME "timer0" /* timer name */ +#define CLOCK_TIMER_DEV_NAME "timer0" /* timer name */ rt_device_t hw_dev; /* timer device handle */ /* find timer device */ -hw_dev = rt_device_find(HWTIMER_DEV_NAME); +hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); /* to open the timer device in read-write mode */ rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); ``` +Details: +- Opening the device ensures the driver is initialized and the working + frequency is applied. +- Call open before using control/read/write APIs; otherwise behavior depends on + the BSP driver and may fail with -RT_ENOSYS or other errors. + ## Set the Timeout Callback Function Set the timer timeout callback function with the following function - this is the function that will be called when the timer reaches its set count value: @@ -93,22 +113,22 @@ rt_err_t rt_device_set_rx_indicate(rt_device_t dev, rt_err_t (*rx_ind)(rt_device An example of use is as follows: ```c -#define HWTIMER_DEV_NAME "timer0" /* timer name */ +#define CLOCK_TIMER_DEV_NAME "timer0" /* timer name */ rt_device_t hw_dev; /* timer device handle */ /* timer timeout callback function */ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { - rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("this is clock_timer timeout callback function!\n"); rt_kprintf("tick is :%d !\n", rt_tick_get()); return 0; } -static int hwtimer_sample(int argc, char *argv[]) +static int clock_timer_sample(int argc, char *argv[]) { /* find timer device */ - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); /* open the device in read and write mode */ rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); /* set the timeout callback function */ @@ -116,6 +136,12 @@ static int hwtimer_sample(int argc, char *argv[]) } ``` +Details: +- The callback runs in the timer interrupt context, so it must be fast and + non-blocking. +- `size` is the size of the timeout data (sizeof(rt_clock_timerval_t)) passed + by the driver; most users can ignore it. + ## Control the Timer Device By sending control words, the application can configure the hardware timer device with the following function: @@ -138,56 +164,70 @@ The command control words available for the hardware timer device are as follows | **Control word** | Description | | ---------------------- | ------------------------ | -| HWTIMER_CTRL_FREQ_SET | set the counting frequency | -| HWTIMER_CTRL_STOP | stop the timer | -| HWTIMER_CTRL_INFO_GET | get timer feature information | -| HWTIMER_CTRL_MODE_SET | set timer mode | +| CLOCK_TIMER_CTRL_FREQ_SET | set the counting frequency | +| CLOCK_TIMER_CTRL_STOP | stop the timer | +| CLOCK_TIMER_CTRL_INFO_GET | get timer feature information | +| CLOCK_TIMER_CTRL_MODE_SET | set timer mode | -Get the timer parameter argument, which is a pointer to the structure struct rt_hwtimer_info, to save the obtained information. +Get the timer parameter argument, which is a pointer to the structure struct rt_clock_timer_info, to save the obtained information. >Setting frequency is valid only when the timer hardware and included driver set the counting frequency. Generally, the default frequency of the driving setting can be used. When setting the timer mode, the parameter argument can take the following values: ```c -HWTIMER_MODE_ONESHOT /* Single timing */ -HWTIMER_MODE_PERIOD /* Periodic timing */ +CLOCK_TIMER_MODE_ONESHOT /* Single timing */ +CLOCK_TIMER_MODE_PERIOD /* Periodic timing */ ``` An example of using the timer count frequency and timing mode is as follows: ```c -#define HWTIMER_DEV_NAME "timer0" /* timer name */ +#define CLOCK_TIMER_DEV_NAME "timer0" /* timer name */ rt_device_t hw_dev; /* timer device handle */ -rt_hwtimer_mode_t mode; /* timer mode */ -rt_uint32_t freq = 10000; /* couting frequency */ +rt_clock_timer_mode_t mode; /* timer mode */ +rt_uint32_t freq = 10000; /* counting frequency */ /* Timer timeout callback function */ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { - rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("this is clock_timer timeout callback function!\n"); rt_kprintf("tick is :%d !\n", rt_tick_get()); return 0; } -static int hwtimer_sample(int argc, char *argv[]) +static int clock_timer_sample(int argc, char *argv[]) { /* find timer device */ - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); /* open the device in read and write mode */ rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); /* Set the timeout callback function */ rt_device_set_rx_indicate(hw_dev, timeout_cb); /* Set the counting frequency (1Mhz or the supported minimum counting frequency by default) */ - rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq); + rt_device_control(hw_dev, CLOCK_TIMER_CTRL_FREQ_SET, &freq); /* Set the mode to periodic timer */ - mode = HWTIMER_MODE_PERIOD; - rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); } ``` +Details: +- CLOCK_TIMER_CTRL_FREQ_SET: + - `arg` points to an integer frequency in Hz. + - The driver checks against `minfreq` and `maxfreq` from rt_clock_timer_info. + - On success, the new frequency is used for subsequent timeouts. +- CLOCK_TIMER_CTRL_STOP: + - Stops the current timer cycle. It does not close the device. +- CLOCK_TIMER_CTRL_INFO_GET: + - `arg` points to `struct rt_clock_timer_info`. + - Returns hardware limits (min/max frequency, max count, count direction). +- CLOCK_TIMER_CTRL_MODE_SET: + - `arg` points to `rt_clock_timer_mode_t`. + - ONESHOT fires once, PERIOD repeats using the calculated reload. + ## Set the Timer Timeout Value The timer timeout value can be set by the following function: @@ -209,41 +249,41 @@ rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_ The prototype of the timeout structure is shown below : ```c -typedef struct rt_hwtimerval +typedef struct rt_clock_timerval { rt_int32_t sec; /* second */ rt_int32_t usec; /* microsecond */ -} rt_hwtimerval_t; +} rt_clock_timerval_t; ``` An example of using the timer timeout value is as follows: ```c -#define HWTIMER_DEV_NAME "timer0" /* timer name */ +#define CLOCK_TIMER_DEV_NAME "timer0" /* timer name */ rt_device_t hw_dev; /* timer device handle */ -rt_hwtimer_mode_t mode; /* timer mode */ -rt_hwtimerval_t timeout_s; /* Timer timeout value */ +rt_clock_timer_mode_t mode; /* timer mode */ +rt_clock_timerval_t timeout_s; /* Timer timeout value */ /* Timer timeout callback function */ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { - rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("this is clock_timer timeout callback function!\n"); rt_kprintf("tick is :%d !\n", rt_tick_get()); return 0; } -static int hwtimer_sample(int argc, char *argv[]) +static int clock_timer_sample(int argc, char *argv[]) { /* find timer device */ - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); /* open the device in read-write mode */ rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); /* set the timeout callback function */ rt_device_set_rx_indicate(hw_dev, timeout_cb); /* set the mode as periodic timer */ - mode = HWTIMER_MODE_PERIOD; - rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); /* Set the timer timeout value to 5s and start the timer */ timeout_s.sec = 5; /* second */ @@ -252,6 +292,13 @@ static int hwtimer_sample(int argc, char *argv[]) } ``` +Details: +- `size` must match `sizeof(rt_clock_timerval_t)`; otherwise the write fails. +- In periodic mode, the driver may split a long timeout into multiple cycles + based on the hardware `maxcnt` and current frequency. +- For one-shot mode, if the timeout fits in a single cycle, the timer stops + automatically after expiry. + ## Obtain the Current Value of the Timer The current value of the timer can be obtained by the following function: @@ -273,11 +320,17 @@ rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t An example of use is shown below: ```c -rt_hwtimerval_t timeout_s; /* Used to save the time the timer has elapsed */ +rt_clock_timerval_t timeout_s; /* Used to save the time the timer has elapsed */ /* Read the elapsed time of the timer */ rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); ``` +Details: +- The returned value represents elapsed time since the timer started. +- In periodic mode, the driver accounts for completed cycles plus the current + counter value. +- In one-shot mode, the elapsed time is limited to the active cycle. + ## Close the Timer Device The timer device can be closed with the following function: @@ -299,16 +352,78 @@ When a timer device has been used and is not necessary anymore, it should be clo An example of use is shown below: ```c -#define HWTIMER_DEV_NAME "timer0" /* timer name */ +#define CLOCK_TIMER_DEV_NAME "timer0" /* timer name */ rt_device_t hw_dev; /* timer device handle */ /* find timer device */ -hw_dev = rt_device_find(HWTIMER_DEV_NAME); +hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); ... ... rt_device_close(hw_dev); ``` +Details: +- Closing the device may stop the timer and deinitialize hardware resources. +- Reopen the device before using it again. + >Timing errors may occur. Assume that the counter has a maximum value of 0xFFFF, a counting frequency of 1Mhz, and a timing time of 1 second and 1 microsecond. Since the timer can only count up to 65535us at a time, the timing requirement for 1000001us can be completed 20 times at 50000us, and the calculation error will be 1us. +# Driver Integration (BSP/Driver Authors) + +To provide a hardware timer as a clock_timer device, implement +`rt_clock_timer_ops`, fill `rt_clock_timer_info`, and register it with +`rt_clock_timer_register()`. The ISR should call `rt_clock_timer_isr()` to +handle overflow, callback dispatch, and (if selected) clock_time event +notification. + +```c +static const struct rt_clock_timer_ops timer_ops = +{ + .init = drv_timer_init, + .start = drv_timer_start, + .stop = drv_timer_stop, + .count_get = drv_timer_count_get, + .control = drv_timer_control, +}; + +static const struct rt_clock_timer_info timer_info = +{ + .maxfreq = 1000000, + .minfreq = 1000, + .maxcnt = 0xFFFFFFFF, + .cntmode = CLOCK_TIMER_CNTMODE_UP, +}; + +static rt_clock_timer_t hw_timer = +{ + .ops = &timer_ops, + .info = &timer_info, +}; + +void drv_timer_register(void) +{ + rt_clock_timer_register(&hw_timer, "timer0", RT_NULL); +} + +void drv_timer_isr(void) +{ + rt_clock_timer_isr(&hw_timer); +} +``` + +If the timer supports one-shot start, it can also serve as the default +clock_time event device (used by hrtimer). + +Details: +- rt_clock_timer_register(): + - Registers the device into the RT-Thread device framework as a timer class. + - If this is the first registered timer with a valid start op, it becomes + the clock_time event device automatically. + - The default event is opened and initialized if not already active. +- rt_clock_timer_isr(): + - Maintains internal overflow/cycle accounting. + - Triggers the user callback via `rx_indicate`. + - If the timer is the clock_time event owner, it calls + `rt_clock_time_event_isr()` to drive hrtimer. + # Hardware Timer Device Usage Example The specific use of the hardware timer device can refer to the following sample code. The main steps of the sample code are as follows: @@ -321,38 +436,38 @@ The specific use of the hardware timer device can refer to the following sample ```c /* - * Program listing: This is an hwtimer device usage routine -  * The routine exports the hwtimer_sample command to the control terminal -  * Command call format: hwtimer_sample + * Program listing: This is a clock_timer device usage routine +  * The routine exports the clock_timer_sample command to the control terminal +  * Command call format: clock_timer_sample   * Program function: The hardware timer timeout callback function periodically prints the current tick value, and the difference between the two tick values is converted to the time equivalent to the timing time value. */ #include #include -#define HWTIMER_DEV_NAME "timer0" /* timer name */ +#define CLOCK_TIMER_DEV_NAME "timer0" /* timer name */ /* Timer timeout callback function */ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { - rt_kprintf("this is hwtimer timeout callback fucntion!\n"); + rt_kprintf("this is clock_timer timeout callback function!\n"); rt_kprintf("tick is :%d !\n", rt_tick_get()); return 0; } -static int hwtimer_sample(int argc, char *argv[]) +static int clock_timer_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; - rt_hwtimerval_t timeout_s; /* timer timeout value */ + rt_clock_timerval_t timeout_s; /* timer timeout value */ rt_device_t hw_dev = RT_NULL; /* timer device value */ - rt_hwtimer_mode_t mode; /* timer mode */ + rt_clock_timer_mode_t mode; /* timer mode */ /* find timer device */ - hw_dev = rt_device_find(HWTIMER_DEV_NAME); + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { - rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", CLOCK_TIMER_DEV_NAME); return -RT_ERROR; } @@ -360,7 +475,7 @@ static int hwtimer_sample(int argc, char *argv[]) ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); if (ret != RT_EOK) { - rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); + rt_kprintf("open %s device failed!\n", CLOCK_TIMER_DEV_NAME); return ret; } @@ -368,8 +483,8 @@ static int hwtimer_sample(int argc, char *argv[]) rt_device_set_rx_indicate(hw_dev, timeout_cb); /* Setting mode is periodic timer */ - mode = HWTIMER_MODE_PERIOD; - ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); if (ret != RT_EOK) { rt_kprintf("set mode failed! ret is :%d\n", ret); @@ -396,5 +511,5 @@ static int hwtimer_sample(int argc, char *argv[]) return ret; } /* Export to the msh command list */ -MSH_CMD_EXPORT(hwtimer_sample, hwtimer sample); +MSH_CMD_EXPORT(clock_timer_sample, clock_timer sample); ``` diff --git a/documentation/6.components/device-driver/clock_time/clock_timer_zh.md b/documentation/6.components/device-driver/clock_time/clock_timer_zh.md new file mode 100644 index 0000000000..880f604da6 --- /dev/null +++ b/documentation/6.components/device-driver/clock_time/clock_timer_zh.md @@ -0,0 +1,370 @@ +# CLOCK_TIMER 设备 + +> 说明:CLOCK_TIMER 是 `clock_time` 子系统中的统一硬件定时器设备。 + +# 定时器简介 + +硬件定时器通常有两种工作模式:定时模式与计数模式。无论哪种模式,本质都 +是对输入脉冲计数。以下为常用概念: + +**定时模式**:计数内部脉冲信号,常用于定时检测、响应与控制。 + +**计数模式**:计数器可加/减计数。16 位计数器最大计数值为 65535,32 位 +计数器最大值为 4,294,967,295。 + +**计数频率**:在输入频率固定时,可由 `time = count / freq` 计算时间。 +例如频率 1 MHz,计数器每 1 微秒加 1;16 位计数器最大定时能力约为 +65.535 ms。 + +# 与 clock_time 的关系 + +CLOCK_TIMER 设备可直接通过 RT-Thread 设备框架被应用使用,也可以作为 +clock_time 的事件设备。当通过 `rt_clock_timer_register()` 注册并成为默认 +事件设备时,其中断会触发 `rt_clock_time_event_isr()`,驱动高精度定时器 +调度。 + +# 访问硬件定时器设备 + +应用通过 RT-Thread I/O 设备管理接口访问硬件定时器,常用接口如下: + +| **函数** | **描述** | +| -------------------- | ---------------------------------- | +| rt_device_find() | 查找定时器设备 | +| rt_device_open() | 以读写方式打开定时器设备 | +| rt_device_set_rx_indicate() | 设置超时回调函数 | +| rt_device_control() | 控制定时器(模式、频率、停止等) | +| rt_device_write() | 设置超时时间并启动 | +| rt_device_read() | 读取当前计数值 | +| rt_device_close() | 关闭设备 | + +## 查找定时器设备 + +```c +rt_device_t rt_device_find(const char* name); +``` + +| 参数 | 描述 | +| -------- | ---------------------------------- | +| name | 定时器设备名称 | +| **返回** | —— | +| 设备句柄 | 查找成功返回句柄 | +| RT_NULL | 未找到设备 | + +通常设备名为 timer0、timer1 等。 + +```c +#define CLOCK_TIMER_DEV_NAME "timer0" /* timer name */ +rt_device_t hw_dev; /* timer device handle */ + +hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); +``` + +补充说明: +- 设备名由 BSP 在 `rt_clock_timer_register()` 中指定。 +- 系统内注册的每个定时器都会对应一个设备节点。 + +## 打开定时器设备 + +```c +rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags); +``` + +| 参数 | 描述 | +| ---------- | ------------------------------- | +| dev | 定时器设备句柄 | +| oflags | 打开模式,通常为 RT_DEVICE_OFLAG_RDWR | +| **返回** | —— | +| RT_EOK | 打开成功 | +| 其他错误码 | 打开失败 | + +```c +hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); +rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); +``` + +补充说明: +- 打开设备会确保驱动初始化并应用当前工作频率。 +- 调用 control/read/write 之前应先 open,否则可能返回 -RT_ENOSYS 或失败。 + +## 设置超时回调函数 + +```c +rt_err_t rt_device_set_rx_indicate(rt_device_t dev, + rt_err_t (*rx_ind)(rt_device_t dev, rt_size_t size)) +``` + +| 参数 | 描述 | +| ---------- | ------------------------------- | +| dev | 设备句柄 | +| rx_ind | 超时回调函数 | +| **返回** | —— | +| RT_EOK | 成功 | + +```c +static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) +{ + rt_kprintf("this is clock_timer timeout callback function!\n"); + rt_kprintf("tick is :%d !\n", rt_tick_get()); + + return 0; +} + +static int clock_timer_sample(int argc, char *argv[]) +{ + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); + rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); + rt_device_set_rx_indicate(hw_dev, timeout_cb); +} +``` + +补充说明: +- 回调在中断上下文执行,应尽量短小且避免阻塞。 +- `size` 通常为 sizeof(rt_clock_timerval_t),多数场景可忽略。 + +## 控制定时器设备 + +```c +rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg); +``` + +| 参数 | 描述 | +| ---------------- | ------------------------------ | +| dev | 设备句柄 | +| cmd | 控制命令 | +| arg | 参数 | +| **返回** | —— | +| RT_EOK | 成功 | +| -RT_ENOSYS | 失败,设备为空 | +| 其他错误码 | 失败 | + +控制命令: + +| **控制命令** | 描述 | +| ---------------------- | ------------------------ | +| CLOCK_TIMER_CTRL_FREQ_SET | 设置计数频率 | +| CLOCK_TIMER_CTRL_STOP | 停止定时器 | +| CLOCK_TIMER_CTRL_INFO_GET | 获取特性信息 | +| CLOCK_TIMER_CTRL_MODE_SET | 设置模式 | + +模式可选: + +```c +CLOCK_TIMER_MODE_ONESHOT /* 单次定时 */ +CLOCK_TIMER_MODE_PERIOD /* 周期定时 */ +``` + +示例: + +```c +rt_clock_timer_mode_t mode; +rt_uint32_t freq = 10000; /* counting frequency */ + +rt_device_control(hw_dev, CLOCK_TIMER_CTRL_FREQ_SET, &freq); +mode = CLOCK_TIMER_MODE_PERIOD; +rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); +``` + +补充说明: +- CLOCK_TIMER_CTRL_FREQ_SET: + - `arg` 指向频率值(Hz)。 + - 驱动会与 `rt_clock_timer_info` 中的 minfreq/maxfreq 做范围校验。 + - 设置成功后影响后续超时换算。 +- CLOCK_TIMER_CTRL_STOP: + - 仅停止当前定时流程,不会关闭设备。 +- CLOCK_TIMER_CTRL_INFO_GET: + - `arg` 指向 `struct rt_clock_timer_info`,返回硬件能力信息。 +- CLOCK_TIMER_CTRL_MODE_SET: + - `arg` 指向 `rt_clock_timer_mode_t`。 + - ONESHOT 单次触发;PERIOD 周期触发。 + +## 设置超时值 + +```c +rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos, + const void* buffer, rt_size_t size); +``` + +| 参数 | 描述 | +| ---------- | ------------------------------------------ | +| dev | 设备句柄 | +| pos | 偏移,未使用,置 0 | +| buffer | 超时结构体指针 | +| size | 结构体大小 | +| **返回** | —— | +| 实际写入长度 | 成功 | +| 0 | 失败 | + +超时结构体: + +```c +typedef struct rt_clock_timerval +{ + rt_int32_t sec; + rt_int32_t usec; +} rt_clock_timerval_t; +``` + +```c +rt_clock_timerval_t timeout_s; + +timeout_s.sec = 5; +timeout_s.usec = 0; +rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)); +``` + +补充说明: +- `size` 必须等于 `sizeof(rt_clock_timerval_t)`,否则写入失败。 +- 周期模式下,长超时可能被拆分为多个计数周期执行。 +- 单次模式且超时可在一个周期内完成时,到期后自动停止。 + +## 读取当前计数值 + +```c +rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size); +``` + +```c +rt_clock_timerval_t timeout_s; +rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); +``` + +补充说明: +- 返回值表示自定时启动以来的累计耗时。 +- 周期模式会包含已完成周期的时间。 +- 单次模式下只反映当前周期内的计数进度。 + +## 关闭设备 + +```c +rt_err_t rt_device_close(rt_device_t dev); +``` + +```c +rt_device_close(hw_dev); +``` + +补充说明: +- 关闭设备可能会停止定时器并释放硬件资源。 +- 再次使用前需要重新打开设备。 + +> 定时误差示例:若计数器最大 0xFFFF、频率 1 MHz,定时 1.000001 s 时需拆分 +> 为多次计数,误差约 1 us。 + +# 驱动对接(BSP/驱动作者) + +实现 `rt_clock_timer_ops` 并注册设备;在中断中调用 `rt_clock_timer_isr()`。 + +```c +static const struct rt_clock_timer_ops timer_ops = +{ + .init = drv_timer_init, + .start = drv_timer_start, + .stop = drv_timer_stop, + .count_get = drv_timer_count_get, + .control = drv_timer_control, +}; + +static const struct rt_clock_timer_info timer_info = +{ + .maxfreq = 1000000, + .minfreq = 1000, + .maxcnt = 0xFFFFFFFF, + .cntmode = CLOCK_TIMER_CNTMODE_UP, +}; + +static rt_clock_timer_t hw_timer = +{ + .ops = &timer_ops, + .info = &timer_info, +}; + +void drv_timer_register(void) +{ + rt_clock_timer_register(&hw_timer, "timer0", RT_NULL); +} + +void drv_timer_isr(void) +{ + rt_clock_timer_isr(&hw_timer); +} +``` + +若支持单次启动,clock_timer 设备也可作为 clock_time 默认事件设备。 + +补充说明: +- rt_clock_timer_register(): + - 将设备注册到 RT-Thread 设备框架,类型为 Timer。 + - 首个具备 start 操作的设备会被自动设置为 clock_time 事件设备。 + - 若默认事件尚未激活,注册后会自动初始化并打开。 +- rt_clock_timer_isr(): + - 维护溢出与周期计数。 + - 通过 rx_indicate 回调上层。 + - 若为 clock_time 事件设备,会调用 `rt_clock_time_event_isr()`。 + +# 使用示例 + +以下示例演示完整流程:查找设备、打开、设置回调、周期定时、读取计数等。 + +```c +#include +#include + +#define CLOCK_TIMER_DEV_NAME "timer0" /* timer name */ + +static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) +{ + rt_kprintf("this is clock_timer timeout callback function!\n"); + rt_kprintf("tick is :%d !\n", rt_tick_get()); + + return 0; +} + +static int clock_timer_sample(int argc, char *argv[]) +{ + rt_err_t ret = RT_EOK; + rt_clock_timerval_t timeout_s; /* timer timeout value */ + rt_device_t hw_dev = RT_NULL; /* timer device handle */ + rt_clock_timer_mode_t mode; /* timer mode */ + + hw_dev = rt_device_find(CLOCK_TIMER_DEV_NAME); + if (hw_dev == RT_NULL) + { + rt_kprintf("clock_timer sample run failed! can't find %s device!\n", CLOCK_TIMER_DEV_NAME); + return -RT_ERROR; + } + + ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); + if (ret != RT_EOK) + { + rt_kprintf("open %s device failed!\n", CLOCK_TIMER_DEV_NAME); + return ret; + } + + rt_device_set_rx_indicate(hw_dev, timeout_cb); + + mode = CLOCK_TIMER_MODE_PERIOD; + ret = rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); + if (ret != RT_EOK) + { + rt_kprintf("set mode failed! ret is :%d\n", ret); + return ret; + } + + timeout_s.sec = 5; + timeout_s.usec = 0; + + if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) + { + rt_kprintf("set timeout value failed\n"); + return -RT_ERROR; + } + + rt_thread_mdelay(3500); + + rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); + rt_kprintf("Read: Sec = %d, Usec = %d\n", timeout_s.sec, timeout_s.usec); + + return ret; +} +MSH_CMD_EXPORT(clock_timer_sample, clock_timer sample); +``` diff --git a/documentation/6.components/device-driver/clock_time/figures/clock_time_arch.svg b/documentation/6.components/device-driver/clock_time/figures/clock_time_arch.svg new file mode 100644 index 0000000000..ae0d42192c --- /dev/null +++ b/documentation/6.components/device-driver/clock_time/figures/clock_time_arch.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + POSIX / libc + clock_gettime, nanosleep + + + Soft RTC + timekeeping baseline + + + Device Drivers + input timestamp, vDSO, PIC + + + + Clock Time Subsystem + + + + Core API + register, default source/event + counter ↔ ns conversion + + + Clock Source Device + get_freq / get_counter + monotonic time base + + + Clock Event Device + set_timeout / event ISR + timeout programming + + + + Clock HRTimer + priority queue of timeouts + callback dispatch + + + Boottime Helpers + get_us / get_ns / get_s + timeval / timespec + + + Clock Timer Adapter + rt_clock_timer device API + unified timer interface + + + + BSP Drivers + arch counters, clock_timer drivers, DM/OFW integration + + + + Hardware Counter / Timer + CPU timer, SoC timer peripherals + + + + + + + + + + + + + + + diff --git a/examples/test/hwtimer_test.c b/examples/test/clock_timer_test.c similarity index 80% rename from examples/test/hwtimer_test.c rename to examples/test/clock_timer_test.c index 08b0c5acaf..f231682ffb 100644 --- a/examples/test/hwtimer_test.c +++ b/examples/test/clock_timer_test.c @@ -11,7 +11,7 @@ #include #include -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME #define TIMER "timer0" @@ -22,13 +22,13 @@ static rt_err_t timer_timeout_cb(rt_device_t dev, rt_size_t size) return 0; } -int hwtimer(void) +int clock_timer(void) { rt_err_t err; - rt_hwtimerval_t val; + rt_clock_timerval_t val; rt_device_t dev = RT_NULL; rt_tick_t tick; - rt_hwtimer_mode_t mode; + rt_clock_timer_mode_t mode; int freq = 10000; int t = 5; @@ -46,7 +46,7 @@ int hwtimer(void) /* 时间测量 */ /* 计数时钟设置(默认1Mhz或支持的最小计数频率) */ - err = rt_device_control(dev, HWTIMER_CTRL_FREQ_SET, &freq); + err = rt_device_control(dev, CLOCK_TIMER_CTRL_FREQ_SET, &freq); if (err != RT_EOK) { rt_kprintf("Set Freq=%dhz Fail\n", freq); @@ -54,8 +54,8 @@ int hwtimer(void) } /* 周期模式 */ - mode = HWTIMER_MODE_PERIOD; - err = rt_device_control(dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + err = rt_device_control(dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); tick = rt_tick_get(); rt_kprintf("Start Timer> Tick: %d\n", tick); @@ -72,7 +72,7 @@ int hwtimer(void) rt_thread_delay(t*RT_TICK_PER_SECOND); /* 停止定时器 */ - err = rt_device_control(dev, HWTIMER_CTRL_STOP, RT_NULL); + err = rt_device_control(dev, CLOCK_TIMER_CTRL_STOP, RT_NULL); rt_kprintf("Timer Stoped\n"); /* 读取计数 */ rt_device_read(dev, 0, &val, sizeof(val)); @@ -83,8 +83,8 @@ int hwtimer(void) rt_device_set_rx_indicate(dev, timer_timeout_cb); /* 单次模式 */ - mode = HWTIMER_MODE_PERIOD; - err = rt_device_control(dev, HWTIMER_CTRL_MODE_SET, &mode); + mode = CLOCK_TIMER_MODE_PERIOD; + err = rt_device_control(dev, CLOCK_TIMER_CTRL_MODE_SET, &mode); /* 设置定时器超时值并启动定时器 */ val.sec = t; @@ -106,6 +106,6 @@ EXIT: return err; } #ifdef RT_USING_FINSH -MSH_CMD_EXPORT(hwtimer, "Test hardware timer"); +MSH_CMD_EXPORT(clock_timer, "Test clock time timer"); #endif -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ diff --git a/libcpu/Kconfig b/libcpu/Kconfig index b089b61725..22381a42fe 100644 --- a/libcpu/Kconfig +++ b/libcpu/Kconfig @@ -264,7 +264,7 @@ if ARCH_RISCV64 config ARCH_USING_RISCV_COMMON64 bool depends on ARCH_RISCV64 - select RT_USING_CPUTIME + select RT_USING_CLOCK_TIME select ARCH_USING_NEW_CTX_SWITCH help Using the common64 implementation under ./libcpu/risc-v diff --git a/libcpu/aarch64/common/SConscript b/libcpu/aarch64/common/SConscript index 13e5f2fdb0..99645683b8 100644 --- a/libcpu/aarch64/common/SConscript +++ b/libcpu/aarch64/common/SConscript @@ -21,7 +21,7 @@ if GetDepend('RT_USING_OFW') == False: if GetDepend('RT_USING_PIC') == True: SrcRemove(src, ['gicv3.c', 'gic.c', 'gtimer.c', 'interrupt.c']) -if GetDepend('RT_HWTIMER_ARM_ARCH') == True: +if GetDepend('RT_CLOCK_TIME_ARM_ARCH') == True: SrcRemove(src, ['gtimer.c']) group = DefineGroup('CPU', src, depend = [''], CPPPATH = CPPPATH) diff --git a/libcpu/aarch64/common/gtimer.c b/libcpu/aarch64/common/gtimer.c index 514ec4e043..46ce287aeb 100644 --- a/libcpu/aarch64/common/gtimer.c +++ b/libcpu/aarch64/common/gtimer.c @@ -13,8 +13,8 @@ #include #include -#ifdef RT_USING_KTIME -#include +#ifdef RT_USING_CLOCK_TIME +#include #endif #define EL1_PHY_TIMER_IRQ_NUM 30 @@ -42,8 +42,8 @@ void rt_hw_gtimer_local_enable(void) rt_hw_gtimer_disable(); rt_hw_set_gtimer_val(timer_step); rt_hw_interrupt_umask(EL1_PHY_TIMER_IRQ_NUM); -#ifdef RT_USING_KTIME - rt_ktime_cputimer_init(); +#ifdef RT_USING_CLOCK_TIME + rt_clock_time_source_init(); #endif rt_hw_gtimer_enable(); } diff --git a/libcpu/aarch64/common/setup.c b/libcpu/aarch64/common/setup.c index 2109179134..79df36ec5b 100644 --- a/libcpu/aarch64/common/setup.c +++ b/libcpu/aarch64/common/setup.c @@ -72,7 +72,7 @@ void rt_hw_fdt_install_early(void *fdt) #endif } -#ifdef RT_USING_HWTIMER +#ifdef RT_USING_CLOCK_TIME static rt_ubase_t loops_per_tick[RT_CPUS_NR]; static rt_ubase_t cpu_get_cycles(void) @@ -132,7 +132,7 @@ static void cpu_us_delay(rt_uint32_t us) rt_hw_cpu_relax(); } } -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME */ rt_weak void rt_hw_idle_wfi(void) { @@ -188,14 +188,14 @@ rt_inline void cpu_info_init(void) rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, rt_cpu_mpidr_table, sizeof(rt_cpu_mpidr_table)); -#ifdef RT_USING_HWTIMER +#if defined(RT_USING_CLOCK_TIME) && defined(RT_USING_DM) cpu_loops_per_tick_init(); - if (!rt_device_hwtimer_us_delay) + if (!rt_clock_timer_us_delay) { - rt_device_hwtimer_us_delay = &cpu_us_delay; + rt_clock_timer_us_delay = &cpu_us_delay; } -#endif /* RT_USING_HWTIMER */ +#endif /* RT_USING_CLOCK_TIME && RT_USING_DM */ } rt_inline rt_size_t string_to_size(const char *string, const char *who) @@ -382,10 +382,10 @@ void rt_hw_common_setup(void) rt_hw_uart_init(); #endif -#ifndef RT_HWTIMER_ARM_ARCH +#ifndef RT_CLOCK_TIME_ARM_ARCH /* initialize timer for os tick */ rt_hw_gtimer_init(); -#endif /* !RT_HWTIMER_ARM_ARCH */ +#endif /* !RT_CLOCK_TIME_ARM_ARCH */ #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); @@ -478,10 +478,10 @@ rt_weak void rt_hw_secondary_cpu_bsp_start(void) #endif /* BSP_USING_GICV3 */ #endif -#ifndef RT_HWTIMER_ARM_ARCH +#ifndef RT_CLOCK_TIME_ARM_ARCH /* initialize timer for os tick */ rt_hw_gtimer_local_enable(); -#endif /* !RT_HWTIMER_ARM_ARCH */ +#endif /* !RT_CLOCK_TIME_ARM_ARCH */ rt_dm_secondary_cpu_init(); @@ -491,8 +491,8 @@ rt_weak void rt_hw_secondary_cpu_bsp_start(void) LOG_I("Call cpu %d on %s", cpu_id, "success"); -#ifdef RT_USING_HWTIMER - if (rt_device_hwtimer_us_delay == &cpu_us_delay) +#if defined(RT_USING_CLOCK_TIME) && defined(RT_USING_DM) + if (rt_clock_timer_us_delay == &cpu_us_delay) { cpu_loops_per_tick_init(); } diff --git a/libcpu/risc-v/common64/tick.c b/libcpu/risc-v/common64/tick.c index 8e8ff86a74..06ede73a54 100644 --- a/libcpu/risc-v/common64/tick.c +++ b/libcpu/risc-v/common64/tick.c @@ -6,49 +6,61 @@ * Change Logs: * Date Author Notes * 2018/10/28 Bernard The unify RISC-V porting code. - * 2024/07/08 Shell Using CPUTIME as tick + * 2024/07/08 Shell Using clock_time as tick */ #include #include -#include #include #include "sbi.h" -#ifdef RT_USING_KTIME -#include +#ifdef RT_USING_CLOCK_TIME +#include #endif static volatile unsigned long tick_cycles = 0; +static rt_uint64_t _clock_timer_freq = 0; + +rt_weak rt_uint64_t rt_hw_get_clock_timer_freq(void) +{ + return CLOCK_TIMER_FREQ; +} + +static rt_uint64_t _riscv_read_time(void) +{ + unsigned long time_elapsed; + + __asm__ __volatile__("rdtime %0" : "=r"(time_elapsed)); + return (rt_uint64_t)time_elapsed; +} int tick_isr(void) { rt_tick_increase(); - sbi_set_timer(clock_cpu_gettime() + tick_cycles); + sbi_set_timer(_riscv_read_time() + tick_cycles); return 0; } -/* BSP should config clockbase frequency */ -RT_STATIC_ASSERT(defined_clockbase_freq, CPUTIME_TIMER_FREQ != 0); - /* Sets and enable the timer interrupt */ int rt_hw_tick_init(void) { + rt_uint64_t freq = rt_hw_get_clock_timer_freq(); + RT_ASSERT(freq != 0); + + _clock_timer_freq = freq; + /* calculate the tick cycles */ - tick_cycles = CPUTIME_TIMER_FREQ / RT_TICK_PER_SECOND; + tick_cycles = freq / RT_TICK_PER_SECOND; /* Clear the Supervisor-Timer bit in SIE */ clear_csr(sie, SIP_STIP); - /* Init riscv timer */ - riscv_cputime_init(); - /* Set timer */ - sbi_set_timer(clock_cpu_gettime() + tick_cycles); + sbi_set_timer(_riscv_read_time() + tick_cycles); -#ifdef RT_USING_KTIME - rt_ktime_cputimer_init(); +#ifdef RT_USING_CLOCK_TIME + rt_clock_time_source_init(); #endif /* Enable the Supervisor-Timer bit in SIE */ set_csr(sie, SIP_STIP); @@ -66,11 +78,14 @@ void rt_hw_us_delay(rt_uint32_t us) unsigned long start_time; unsigned long end_time; unsigned long run_time; + rt_uint64_t freq; - start_time = clock_cpu_gettime(); - end_time = start_time + us * (CPUTIME_TIMER_FREQ / 1000000); + start_time = _riscv_read_time(); + freq = _clock_timer_freq ? _clock_timer_freq : rt_hw_get_clock_timer_freq(); + RT_ASSERT(freq != 0); + end_time = start_time + (rt_uint64_t)us * freq / 1000000ULL; do { - run_time = clock_cpu_gettime(); + run_time = _riscv_read_time(); } while(run_time < end_time); } diff --git a/src/Kconfig b/src/Kconfig index efb21f2752..f57b305ca2 100644 --- a/src/Kconfig +++ b/src/Kconfig @@ -41,7 +41,7 @@ config RT_USING_SMART select RT_USING_POSIX_CLOCK select RT_USING_POSIX_FS select RT_USING_POSIX_TERMIOS - select RT_USING_KTIME + select RT_USING_CLOCK_TIME select RT_USING_STDC_ATOMIC select RT_USING_SYSTEM_WORKQUEUE select RT_USING_CPU_USAGE_TRACER diff --git a/src/utest/perf/Kconfig b/src/utest/perf/Kconfig index fe6ee640ce..9425c7b456 100644 --- a/src/utest/perf/Kconfig +++ b/src/utest/perf/Kconfig @@ -7,9 +7,9 @@ config RT_UTEST_SYS_PERF_TC_COUNT default 1000 depends on RT_UTEST_SYS_PERF -config RT_UTEST_HWTIMER_DEV_NAME - string "PerfTest: Hardware timer device name" +config RT_UTEST_CLOCK_TIMER_DEV_NAME + string "PerfTest: Clock time timer device name" default "timer0" - depends on RT_USING_HWTIMER && RT_UTEST_SYS_PERF + depends on RT_USING_CLOCK_TIME && RT_UTEST_SYS_PERF help Specify the hardware timer device name used for context switch testing (e.g., timer0). diff --git a/src/utest/perf/irq_latency_tc.c b/src/utest/perf/irq_latency_tc.c index 51eccd3df9..a6b61b1c5f 100644 --- a/src/utest/perf/irq_latency_tc.c +++ b/src/utest/perf/irq_latency_tc.c @@ -50,7 +50,7 @@ static rt_device_t hw_dev = RT_NULL; static rt_sem_t complete_sem = RT_NULL; -static rt_hwtimerval_t timeout = {0}; +static rt_clock_timerval_t timeout = {0}; static rt_perf_t *perf_local = RT_NULL; static void modify_time(rt_perf_t *perf) @@ -79,14 +79,14 @@ rt_err_t rt_perf_irq_latency(rt_perf_t *perf) rt_strcpy(perf->name,"rt_perf_irq_latency"); #endif int ret = RT_EOK; - rt_hwtimer_mode_t mode = HWTIMER_MODE_PERIOD; + rt_clock_timer_mode_t mode = CLOCK_TIMER_MODE_PERIOD; perf_local = perf; - hw_dev = rt_device_find(RT_UTEST_HWTIMER_DEV_NAME); + hw_dev = rt_device_find(RT_UTEST_CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { ret = RT_ERROR; - LOG_E("hwtimer sample run failed! can't find %s device!", RT_UTEST_HWTIMER_DEV_NAME); + LOG_E("clock_timer sample run failed! can't find %s device!", RT_UTEST_CLOCK_TIMER_DEV_NAME); return ret; } @@ -100,7 +100,7 @@ rt_err_t rt_perf_irq_latency(rt_perf_t *perf) rt_mutex_release(perf->lock); rt_device_set_rx_indicate(hw_dev, timer_callback); - rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, (void *)&mode); + rt_device_control(hw_dev, CLOCK_TIMER_CTRL_MODE_SET, (void *)&mode); rt_perf_start_impl(perf_local, &timeout); @@ -111,4 +111,3 @@ rt_err_t rt_perf_irq_latency(rt_perf_t *perf) return RT_EOK; } - diff --git a/src/utest/perf/perf_tc.c b/src/utest/perf/perf_tc.c index 99f36733b6..65e0fa4673 100644 --- a/src/utest/perf/perf_tc.c +++ b/src/utest/perf/perf_tc.c @@ -47,7 +47,6 @@ * - Test runs via: `utest_run core.perf_test` in msh */ - #include #include #include @@ -62,7 +61,7 @@ #define GET_DECIMALS(num) split_double(num, RET_DECIMALS) static rt_device_t hw_dev = RT_NULL; -static rt_hwtimerval_t timeout_s = { 0 }; +static rt_clock_timerval_t timeout_s = { 0 }; typedef rt_err_t (*testcase_function)(rt_perf_t *perf); testcase_function test_func_ptrs[] = { @@ -77,21 +76,21 @@ testcase_function test_func_ptrs[] = { static rt_uint32_t rt_perf_get_timer_us(void) { - rt_hwtimerval_t timer_val = { 0 }; - if (hw_dev && rt_device_read(hw_dev, 0, &timer_val, sizeof(rt_hwtimerval_t))) + rt_clock_timerval_t timer_val = { 0 }; + if (hw_dev && rt_device_read(hw_dev, 0, &timer_val, sizeof(rt_clock_timerval_t))) { return (rt_uint32_t)(timer_val.sec * 1000000u + timer_val.usec); /* return us */ } return 0; } -void rt_perf_start_impl(rt_perf_t *perf, rt_hwtimerval_t *timeout) +void rt_perf_start_impl(rt_perf_t *perf, rt_clock_timerval_t *timeout) { if (hw_dev) { if (timeout == RT_NULL) timeout = &timeout_s; - rt_device_write(hw_dev, 0, timeout, sizeof(rt_hwtimerval_t)); + rt_device_write(hw_dev, 0, timeout, sizeof(rt_clock_timerval_t)); } perf->begin_time = rt_perf_get_timer_us(); } @@ -116,7 +115,7 @@ void rt_perf_stop(rt_perf_t *perf) perf->tot_time += perf->real_time; if (hw_dev) - rt_device_control(hw_dev, HWTIMER_CTRL_STOP, NULL); + rt_device_control(hw_dev, CLOCK_TIMER_CTRL_STOP, NULL); } static rt_int32_t split_double(double num, rt_uint32_t type) @@ -206,17 +205,17 @@ static rt_err_t utest_tc_init(void) { int ret = RT_EOK; - hw_dev = rt_device_find(RT_UTEST_HWTIMER_DEV_NAME); + hw_dev = rt_device_find(RT_UTEST_CLOCK_TIMER_DEV_NAME); if (hw_dev == RT_NULL) { ret = RT_ERROR; - LOG_E("hwtimer sample run failed! can't find %s device!", RT_UTEST_HWTIMER_DEV_NAME); + LOG_E("clock_timer sample run failed! can't find %s device!", RT_UTEST_CLOCK_TIMER_DEV_NAME); return ret; } ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); if (ret != RT_EOK) { - LOG_E("open %s device failed!", RT_UTEST_HWTIMER_DEV_NAME); + LOG_E("open %s device failed!", RT_UTEST_CLOCK_TIMER_DEV_NAME); return ret; } @@ -239,4 +238,3 @@ static void testcase(void) } UTEST_TC_EXPORT(testcase, "core.perf_test", utest_tc_init, utest_tc_cleanup, 10); - diff --git a/src/utest/perf/perf_tc.h b/src/utest/perf/perf_tc.h index 06aeb5214e..0dc20e0d30 100644 --- a/src/utest/perf/perf_tc.h +++ b/src/utest/perf/perf_tc.h @@ -35,7 +35,7 @@ typedef struct rt_perf rt_bool_t dump_head; } rt_perf_t; -void rt_perf_start_impl(rt_perf_t *perf, rt_hwtimerval_t *timeout); +void rt_perf_start_impl(rt_perf_t *perf, rt_clock_timerval_t *timeout); void rt_perf_stop(rt_perf_t *perf); void rt_perf_dump( rt_perf_t *perf); -- Gitee From 88c1e6c88a99a74ad85eb08652d4e31e960c1f19 Mon Sep 17 00:00:00 2001 From: Damon <99158101+Start-xl-wq@users.noreply.github.com> Date: Sun, 1 Feb 2026 14:02:10 +0800 Subject: [PATCH 20/45] sdio: fix missing card status polling after CMD6 in eMMC DDR mode switch --- .../drivers/include/drivers/dev_mmcsd_core.h | 2 + components/drivers/sdio/dev_mmc.c | 70 ++++++++++++++++++- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/components/drivers/include/drivers/dev_mmcsd_core.h b/components/drivers/include/drivers/dev_mmcsd_core.h index a541bc2e2d..0e170a6695 100644 --- a/components/drivers/include/drivers/dev_mmcsd_core.h +++ b/components/drivers/include/drivers/dev_mmcsd_core.h @@ -142,6 +142,8 @@ struct rt_mmcsd_req #define R1_READY_FOR_DATA (1 << 8) /* sx, a */ #define R1_APP_CMD (1 << 5) /* sr, c */ +/*the programing is state*/ +#define R1_STATE_PRG 0x07 #define R1_SPI_IDLE (1 << 0) #define R1_SPI_ERASE_RESET (1 << 1) diff --git a/components/drivers/sdio/dev_mmc.c b/components/drivers/sdio/dev_mmc.c index 2012d9e529..8a09aa937d 100644 --- a/components/drivers/sdio/dev_mmc.c +++ b/components/drivers/sdio/dev_mmc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2024, RT-Thread Development Team + * Copyright (c) 2006-2026, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -270,6 +270,64 @@ static int mmc_parse_ext_csd(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd) return 0; } +/* + * Send Status. + */ +static int mmc_send_status(struct rt_mmcsd_card *card, rt_uint32_t *status, unsigned retries) +{ + int err; + struct rt_mmcsd_cmd cmd = (struct rt_mmcsd_cmd){ 0 }; + + cmd.busy_timeout = 0; + cmd.cmd_code = SEND_STATUS; + cmd.arg = card->rca << 16; + cmd.flags = RESP_R1 | CMD_AC; + err = mmcsd_send_cmd(card->host, &cmd, retries); + if (err) + return err; + + if (status) + *status = cmd.resp[0]; + + return 0; +} + +/* + * Poll Busy. + */ +static int mmc_poll_for_busy(struct rt_mmcsd_card *card, rt_uint32_t timeout_ms, unsigned retries) +{ + int timeout = rt_tick_from_millisecond(timeout_ms); + int err = 0; + rt_uint32_t status; + rt_tick_t start; + + start = rt_tick_get(); + do + { + rt_bool_t out = (int)(rt_tick_get() - start) >= timeout; + + if (out) + { + LOG_E("wait card busy timeout"); + return -RT_ETIMEOUT; + } + + rt_thread_mdelay(1); + + err = mmc_send_status(card, &status, retries); + if (R1_STATUS(err)) + { + LOG_E("error %d requesting status", err); + return err; + } + } + while (!(status & R1_READY_FOR_DATA) || + (R1_CURRENT_STATE(status) == R1_STATE_PRG)); + + return err; +} + /** * mmc_switch - modify EXT_CSD register * @card: the MMC card associated with the data transfer @@ -295,6 +353,13 @@ static int mmc_switch(struct rt_mmcsd_card *card, rt_uint8_t set, if (err) return err; + /* + * Poll the card status using CMD13 with a timeout of 500ms and a polling interval of 1ms. + */ + err = mmc_poll_for_busy(card, 500, 3); + if (err) + return err; + return 0; } @@ -490,7 +555,7 @@ rt_err_t mmc_send_op_cond(struct rt_mmcsd_host *host, err = -RT_ETIMEOUT; - rt_thread_mdelay(10); //delay 10ms + rt_thread_mdelay(10); /* delay 10ms */ } if (rocr && !controller_is_spi(host)) @@ -815,3 +880,4 @@ err: return err; } + -- Gitee From 2b95c3409c24afd18a061eb03ec96af019798d88 Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Mon, 5 Jan 2026 10:34:16 +0800 Subject: [PATCH 21/45] fix[dfs_v1]: prevent vnode ref underflow and double release on close/fd release --- components/dfs/dfs_v1/src/dfs.c | 7 +++++-- components/dfs/dfs_v1/src/dfs_file.c | 7 ++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/components/dfs/dfs_v1/src/dfs.c b/components/dfs/dfs_v1/src/dfs.c index 3783179315..9a7c98cc33 100644 --- a/components/dfs/dfs_v1/src/dfs.c +++ b/components/dfs/dfs_v1/src/dfs.c @@ -414,13 +414,16 @@ void fdt_fd_release(struct dfs_fdtable* fdt, int fd) if (fd_slot->ref_count == 0) { struct dfs_vnode *vnode = fd_slot->vnode; + fd_slot->vnode = RT_NULL; if (vnode) { - vnode->ref_count--; + if (vnode->ref_count > 0) + { + vnode->ref_count--; + } if(vnode->ref_count == 0) { rt_free(vnode); - fd_slot->vnode = RT_NULL; } } rt_free(fd_slot); diff --git a/components/dfs/dfs_v1/src/dfs_file.c b/components/dfs/dfs_v1/src/dfs_file.c index 75bbd219bc..f1c4e7ee4d 100644 --- a/components/dfs/dfs_v1/src/dfs_file.c +++ b/components/dfs/dfs_v1/src/dfs_file.c @@ -337,7 +337,7 @@ int dfs_file_close(struct dfs_file *fd) dfs_fm_lock(); vnode = fd->vnode; - if (vnode->ref_count <= 0) + if (vnode == NULL || vnode->ref_count <= 0) { dfs_fm_unlock(); return -ENXIO; @@ -348,11 +348,12 @@ int dfs_file_close(struct dfs_file *fd) result = vnode->fops->close(fd); } - if (vnode->ref_count == 1) + vnode->ref_count--; + fd->vnode = NULL; + if (vnode->ref_count == 0) { /* remove from hash */ rt_list_remove(&vnode->list); - fd->vnode = NULL; if (vnode->path != vnode->fullpath) { -- Gitee From 1eaa85c581a4bf5d0378084fc418105685273a0e Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Mon, 2 Feb 2026 15:31:45 +0800 Subject: [PATCH 22/45] feat[STM32][CAN]: drain RX FIFO frames in ISR with a bounded limit to reduce overruns - Add CAN_ISR_DRAIN_LIMIT (default 3) to cap ISR work - Drain multiple frames per RX0/RX1 interrupt to reduce FIFO FULL/OVERRUN --- .../libraries/HAL_Drivers/drivers/drv_can.c | 41 ++++++++++++++++--- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c index 72d89316b2..97c06dadf6 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c @@ -15,6 +15,7 @@ * 2021-8-25 SVCHAO The baud rate is configured according to the different APB1 frequencies. f4-series only. * 2025-09-20 wdfk_prog Implemented sendmsg_nonblocking op to support framework's async TX. + * 2026-02-02 wdfk_prog Drain multiple RX frames per ISR with a bounded limit. */ #include "drv_can.h" @@ -24,6 +25,14 @@ #define LOG_TAG "drv_can" #include +#ifndef CAN_ISR_DRAIN_LIMIT +/* + * bxCAN FIFO depth is 3 (FMP[1:0]=0..3). Draining up to 3 frames can clear the FIFO in one ISR, + * reducing FULL/OVERRUN without letting ISR time grow unbounded. + */ +#define CAN_ISR_DRAIN_LIMIT 3 +#endif + /* attention !!! baud calculation example: Tclk / ((ss + bs1 + bs2) * brp) = 36 / ((1 + 8 + 3) * 3) = 1MHz*/ #if defined (SOC_SERIES_STM32F1)/* APB1 36MHz(max) */ static const struct stm32_baud_rate_tab can_baud_rate_tab[] = @@ -745,10 +754,20 @@ static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo) switch (fifo) { case CAN_RX_FIFO0: - /* save to user list */ - if (HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO0) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO0_MSG_PENDING)) + /* save to user list: drain multiple frames per ISR to reduce FULL/OVERRUN */ + if (__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO0_MSG_PENDING)) { - rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8); + for (rt_uint32_t i = 0; i < CAN_ISR_DRAIN_LIMIT; i++) + { + if (HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO0) == 0) + { + break; + } + else + { + rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8); + } + } } /* Check FULL flag for FIFO0 */ if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FF0) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO0_FULL)) @@ -766,10 +785,20 @@ static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo) } break; case CAN_RX_FIFO1: - /* save to user list */ - if (HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO1) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO1_MSG_PENDING)) + /* save to user list: drain multiple frames per ISR to reduce FULL/OVERRUN */ + if (__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO1_MSG_PENDING)) { - rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8); + for (rt_uint32_t i = 0; i < CAN_ISR_DRAIN_LIMIT; i++) + { + if (HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO1) == 0) + { + break; + } + else + { + rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | fifo << 8); + } + } } /* Check FULL flag for FIFO1 */ if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FF1) && __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_RX_FIFO1_FULL)) -- Gitee From 06e829b1b3d8bfd39c9e602baf23fe34a669a291 Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Mon, 2 Feb 2026 15:32:10 +0800 Subject: [PATCH 23/45] docs(can): improve dev_can.h docs for batched RX example --- components/drivers/include/drivers/dev_can.h | 38 +++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/components/drivers/include/drivers/dev_can.h b/components/drivers/include/drivers/dev_can.h index 9bf0c162cb..4ec5103e7b 100644 --- a/components/drivers/include/drivers/dev_can.h +++ b/components/drivers/include/drivers/dev_can.h @@ -132,22 +132,42 @@ enum CANBAUD * res = rt_device_control(can_dev, RT_CAN_CMD_START, &cmd_arg); * RT_ASSERT(res == RT_EOK); * + * #define CAN_RX_BATCH_SIZE 8 + * * while (1) * { * // Block and wait for the semaphore, which is released by the receive callback. * rt_sem_take(&rx_sem, RT_WAITING_FOREVER); * - * // Read one frame of data from the CAN device's general message queue. - * rx_msg.hdr_index = -1; - * rt_device_read(can_dev, 0, &rx_msg, sizeof(rx_msg)); - * - * // Print the received message's ID and data. - * rt_kprintf("Received a message. ID: 0x%x, Data: ", rx_msg.id); - * for (int i = 0; i < rx_msg.len; i++) + * // Drain all pending frames in batches. + * struct rt_can_msg rx_buf[CAN_RX_BATCH_SIZE]; + * rt_ssize_t read_size; + * rt_size_t count; + * do * { - * rt_kprintf("%02x ", rx_msg.data[i]); + * for (rt_size_t i = 0; i < CAN_RX_BATCH_SIZE; i++) + * { + * rx_buf[i].hdr_index = -1; + * } + * + * read_size = rt_device_read(can_dev, 0, rx_buf, sizeof(rx_buf)); + * if (read_size <= 0) + * { + * break; + * } + * count = (rt_size_t)(read_size / sizeof(rx_buf[0])); + * for (rt_size_t i = 0; i < count; i++) + * { + * // Print the received message's ID and data. + * rt_kprintf("Received a message. ID: 0x%x, Data: ", rx_buf[i].id); + * for (int j = 0; j < rx_buf[i].len; j++) + * { + * rt_kprintf("%02x ", rx_buf[i].data[j]); + * } + * rt_kprintf("\n"); + * } * } - * rt_kprintf("\n"); + * while(count == CAN_RX_BATCH_SIZE); * } * } * -- Gitee From f9de2909915079449aae444eeefd361b66e239f0 Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Tue, 3 Feb 2026 14:43:02 +0800 Subject: [PATCH 24/45] fix[STM32][RTC]: Compute tv_usec from SecondFraction/SubSeconds and skip during shift pending Use the generic SecondFraction/SubSeconds formula when SSR/PRER are available. If SHPF is present and a shift is pending, keep tv_usec at 0. Platforms without SSR/PRER (e.g. F1) default to 0. --- .../libraries/HAL_Drivers/drivers/drv_rtc.c | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_rtc.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_rtc.c index b86c4ba93b..fcf3494458 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_rtc.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_rtc.c @@ -10,6 +10,7 @@ * 2021-02-05 Meco Man fix the problem of mixing local time and UTC time * 2021-07-05 iysheng implement RTC framework V2.0 * 2025-06-05 RCSN add local time conversion for get timeval and set stamp + * 0206-02-03 wdfk_prog compute tv_usec from SecondFraction/SubSeconds */ #include "board.h" @@ -85,10 +86,30 @@ static rt_err_t stm32_rtc_get_timeval(struct timeval *tv) #else tv->tv_sec = timegm(&tm_new); #endif -#if defined(SOC_SERIES_STM32H7) - tv->tv_usec = (255.0 - RTC_TimeStruct.SubSeconds * 1.0) / 256.0 * 1000.0 * 1000.0; -#endif - + tv->tv_usec = 0U; +/* F1 RTC does not have SSR/PRER */ +#if defined(RTC_SSR_SS) && defined(RTC_PRER_PREDIV_S) + /* + * You can use SubSeconds and SecondFraction (sTime structure fields + * returned) to convert SubSeconds value in second fraction ratio with + * time unit following generic formula: + * Second fraction ratio * time_unit = + * [(SecondFraction - SubSeconds) / (SecondFraction + 1)] * time_unit + * This conversion can be performed only if no shift operation is pending + * (ie. SHFP=0) when PREDIV_S >= SS + */ +#if defined(RTC_ISR_SHPF) + if (READ_BIT(RTC->ISR, RTC_ISR_SHPF) == 0U) +#endif /* RTC_ISR_SHPF */ + { + uint32_t sf = RTC_TimeStruct.SecondFraction; + uint32_t ss = RTC_TimeStruct.SubSeconds; + if ((sf != 0U) && (ss <= sf)) + { + tv->tv_usec = (uint32_t)(((sf - ss) * 1000000ULL) / (sf + 1U)); + } + } +#endif /* defined(RTC_SSR_SS) && defined(RTC_PRER_PREDIV_S) */ return RT_EOK; } -- Gitee From 1c0926f223e830b28696542b5e92589b39104b83 Mon Sep 17 00:00:00 2001 From: CYFS <2805686936@qq.com> Date: Tue, 27 Jan 2026 14:43:03 +0800 Subject: [PATCH 25/45] [bsp][gd32]:add gd32vw533xx pwm support --- .../.ci/attachconfig/ci.attachconfig.yml | 9 + bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig | 24 + .../risc-v/libraries/gd32_drivers/SConscript | 4 + .../risc-v/libraries/gd32_drivers/drv_pwm.c | 591 ++++++++++++++++++ 4 files changed, 628 insertions(+) create mode 100644 bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml create mode 100644 bsp/gd32/risc-v/libraries/gd32_drivers/drv_pwm.c diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml b/bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml new file mode 100644 index 0000000000..24dc154586 --- /dev/null +++ b/bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml @@ -0,0 +1,9 @@ +scons.args: &scons + scons_arg: + - '--strict' + +# ------ component CI ------ +component.pwm: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM0=y \ No newline at end of file diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig b/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig index 6bb5df4137..8d0f34949a 100644 --- a/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig +++ b/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig @@ -78,6 +78,30 @@ menu "On-chip Peripheral Drivers" default n endif + menuconfig BSP_USING_PWM + bool "Enable PWM" + default n + select RT_USING_PWM + if BSP_USING_PWM + config BSP_USING_PWM0 + bool "Enable PWM0" + default y + config BSP_USING_PWM1 + bool "Enable PWM1" + default n + config BSP_USING_PWM2 + bool "Enable PWM2" + default n + config BSP_USING_PWM15 + bool "Enable PWM15" + default n + config BSP_USING_PWM16 + bool "Enable PWM16" + default n + endif + + + source "$(BSP_DIR)/../libraries/gd32_drivers/Kconfig" endmenu diff --git a/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript b/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript index 9148ed9816..4dedb95150 100644 --- a/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript +++ b/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript @@ -45,6 +45,10 @@ if GetDepend('RT_USING_CLOCK_TIME'): if GetDepend('RT_USING_ADC'): src += ['drv_adc.c'] +# add pwm drivers. +if GetDepend(['RT_USING_PWM', 'SOC_GD32VW553H']): + src += ['drv_pwm.c'] + path = [cwd] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path) diff --git a/bsp/gd32/risc-v/libraries/gd32_drivers/drv_pwm.c b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_pwm.c new file mode 100644 index 0000000000..ac941cdefb --- /dev/null +++ b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_pwm.c @@ -0,0 +1,591 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-27 CYFS first version + */ + +#include +#include +#include + +#ifdef RT_USING_PWM + +#define DBG_TAG "drv.pwm" +#define DBG_LVL DBG_LOG + +#include + +#define MAX_PERIOD 65535 +#define MIN_PERIOD 3 +#define MIN_PULSE 2 + + +typedef struct gd32_pwm_pin +{ + rt_uint32_t Port; + rt_uint32_t pin; + rt_uint32_t alt_func_num; + rt_int16_t channel; + rt_int8_t TimerIndex; + +} gd32_pwm_pin_t; + +static gd32_pwm_pin_t gd32_pwm_pin_obj[] = { +#ifdef BSP_USING_PWM0 + { + .Port = GPIOA, + .pin = GPIO_PIN_9, + .alt_func_num = GPIO_AF_1, + .channel = TIMER_CH_1, + .TimerIndex = 0, + }, + { + .Port = GPIOA, + .pin = GPIO_PIN_10, + .alt_func_num = GPIO_AF_1, + .channel = TIMER_CH_2, + .TimerIndex = 0, + }, + { + .Port = GPIOA, + .pin = GPIO_PIN_11, + .alt_func_num = GPIO_AF_1, + .channel = TIMER_CH_3, + .TimerIndex = 0, + }, +#endif + +#ifdef BSP_USING_PWM1 +{ + .Port = GPIOA, + .pin = GPIO_PIN_0, + .alt_func_num = GPIO_AF_1, + .channel = TIMER_CH_0, + .TimerIndex = 1, + }, + { + .Port = GPIOA, + .pin = GPIO_PIN_1, + .alt_func_num = GPIO_AF_1, + .channel = TIMER_CH_1, + .TimerIndex = 1, + }, + { + .Port = GPIOA, + .pin = GPIO_PIN_2, + .alt_func_num = GPIO_AF_1, + .channel = TIMER_CH_2, + .TimerIndex = 1, + }, + { + .Port = GPIOA, + .pin = GPIO_PIN_3, + .alt_func_num = GPIO_AF_1, + .channel = TIMER_CH_3, + .TimerIndex = 1, + }, +#endif + +#ifdef BSP_USING_PWM2 + { + .Port = GPIOA, + .pin = GPIO_PIN_6, + .alt_func_num = GPIO_AF_2, + .channel = TIMER_CH_0, + .TimerIndex = 2, + }, + { + .Port = GPIOA, + .pin = GPIO_PIN_7, + .alt_func_num = GPIO_AF_2, + .channel = TIMER_CH_1, + .TimerIndex = 2, + }, + +#endif + +#ifdef BSP_USING_PWM15 + { + .Port = GPIOB, + .pin = GPIO_PIN_13, + .alt_func_num = GPIO_AF_8, + .channel = TIMER_CH_0, + .TimerIndex = 15, + }, +#endif + +#ifdef BSP_USING_PWM16 + { + .Port = GPIOB, + .pin = GPIO_PIN_0, + .alt_func_num = GPIO_AF_9, + .channel = TIMER_CH_0, + .TimerIndex = 16, + }, +#endif + +}; + +typedef struct gd32_pwm_device +{ + struct rt_device_pwm pwm_device; + rt_int8_t TimerIndex; + char *name; +} gd32_pwm_device_t; + + +static gd32_pwm_device_t gd32_pwm_obj[] = { +#ifdef BSP_USING_PWM0 + { + .name = "pwm0", + .TimerIndex = 0, + }, +#endif +#ifdef BSP_USING_PWM1 + { + .name = "pwm1", + .TimerIndex = 1, + }, +#endif +#ifdef BSP_USING_PWM2 + { + .name = "pwm2", + .TimerIndex = 2, + }, +#endif +#ifdef BSP_USING_PWM15 + { + .name = "pwm15", + .TimerIndex = 15, + }, +#endif +#ifdef BSP_USING_PWM16 + { + .name = "pwm16", + .TimerIndex = 16, + }, +#endif +}; + +typedef struct +{ + rt_uint32_t Port[3]; + rt_int8_t TimerIndex[5]; +} TIMER_PERIPH_LIST_S; + +static TIMER_PERIPH_LIST_S gd32_timer_periph_list = { + .Port = {0, 0, 0}, + .TimerIndex = {-1, -1, -1, -1, -1}, +}; + +/* + * List all used GPIO ports and timers without duplication to avoid repeated initialization later. + */ +static rt_err_t pwm_find_timer_periph(void) +{ + rt_int16_t i, j, k; + + /* find gpio port of defined table */ + for (i = 0; i < sizeof(gd32_pwm_pin_obj) / sizeof(gd32_pwm_pin_obj[0]); ++i) + { + /* find -1 of gd32_periph_list's member of Port */ + for (j = 0; j < sizeof(gd32_timer_periph_list.Port) / sizeof(gd32_timer_periph_list.Port[0]); ++j) + { + if (0 == gd32_timer_periph_list.Port[j]) + { + break; + } + } + + if (j >= sizeof(gd32_timer_periph_list.Port) / sizeof(gd32_timer_periph_list.Port[0])) + { + LOG_E("Can not find -1 of gd32_periph_list's member of Port!\n"); + break; + } + + /* find the different of Port */ + for (k = 0; k < j; ++k) + { + if (gd32_pwm_pin_obj[i].Port == gd32_timer_periph_list.Port[k]) + { + break; + } + } + + /* if can not find the same Port */ + if (k == j) + { + gd32_timer_periph_list.Port[j] = gd32_pwm_pin_obj[i].Port; + } + } + + /* find timer periph of defined table */ + for (i = 0; i < sizeof(gd32_pwm_pin_obj) / sizeof(gd32_pwm_pin_obj[0]); ++i) + { + /* find -1 of gd32_periph_list's member of TimerIndex */ + for (j = 0; j < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++j) + { + if (-1 == gd32_timer_periph_list.TimerIndex[j]) + { + break; + } + } + + if (j >= sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0])) + { + LOG_E("Can not find -1 of gd32_periph_list's member of TimerIndex!\n"); + break; + } + + /* find the different of TimerIndex */ + for (k = 0; k < j; ++k) + { + if (gd32_pwm_pin_obj[i].TimerIndex == gd32_timer_periph_list.TimerIndex[k]) + { + break; + } + } + + /* if can not find the same TimerIndex */ + if (k == j) + { + gd32_timer_periph_list.TimerIndex[j] = gd32_pwm_pin_obj[i].TimerIndex; + } + } + + return RT_EOK; +} +static rt_uint32_t index_to_timer(rt_int8_t TimerIndex) +{ + switch (TimerIndex) + { + case 0: + return TIMER0; + case 1: + return TIMER1; + case 2: + return TIMER2; + case 15: + return TIMER15; + case 16: + return TIMER16; + default: + LOG_E("Unsupported timer periph!\n"); + } + return TIMER0; +} + +static void gpio_clock_enable(rt_uint32_t Port) +{ + switch (Port) + { + case GPIOA: + rcu_periph_clock_enable(RCU_GPIOA); + break; + case GPIOB: + rcu_periph_clock_enable(RCU_GPIOB); + break; + case GPIOC: + rcu_periph_clock_enable(RCU_GPIOC); + break; + default: + LOG_E("Unsupported gpio port!\n"); + } +} + +static void timer_clock_enable(rt_int8_t TimerIndex) +{ + switch (TimerIndex) + { + case 0: + rcu_periph_clock_enable(RCU_TIMER0); + break; + case 1: + rcu_periph_clock_enable(RCU_TIMER1); + break; + case 2: + rcu_periph_clock_enable(RCU_TIMER2); + break; + case 15: + rcu_periph_clock_enable(RCU_TIMER15); + break; + case 16: + rcu_periph_clock_enable(RCU_TIMER16); + break; + default: + LOG_E("Unsport timer periph!\n"); + } +} +static void gpio_config(void) +{ + rt_int16_t i; + /* configure GPIO pins in alternate-function mode for TIMER PWM output */ + for (i = 0; i < sizeof(gd32_pwm_pin_obj) / sizeof(gd32_pwm_pin_obj[0]); ++i) + { + /* configure pin as alternate function for the corresponding TIMER channel */ + gpio_mode_set(gd32_pwm_pin_obj[i].Port, GPIO_MODE_AF, GPIO_PUPD_NONE, gd32_pwm_pin_obj[i].pin); + gpio_output_options_set(gd32_pwm_pin_obj[i].Port, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, gd32_pwm_pin_obj[i].pin); + gpio_af_set(gd32_pwm_pin_obj[i].Port, gd32_pwm_pin_obj[i].alt_func_num, gd32_pwm_pin_obj[i].pin); + } +} + +static void rcu_config(void) +{ + rt_int16_t i; + rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4); + for (i = 0; i < sizeof(gd32_timer_periph_list.Port) / sizeof(gd32_timer_periph_list.Port[0]); ++i) + { + if (0 == gd32_timer_periph_list.Port[i]) + { + break; + } + + /* enable GPIO clock */ + gpio_clock_enable(gd32_timer_periph_list.Port[i]); + } + + for (i = 0; i < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++i) + { + if (-1 == gd32_timer_periph_list.TimerIndex[i]) + { + break; + } + + /* enable timer clock */ + timer_clock_enable(gd32_timer_periph_list.TimerIndex[i]); + timer_deinit(index_to_timer(gd32_timer_periph_list.TimerIndex[i])); + } +} + +static void timer_init_para(timer_parameter_struct *initpara) +{ + rt_int16_t i; + + for (i = 0; i < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++i) + { + /* config timer */ + if (-1 != gd32_timer_periph_list.TimerIndex[i]) + { + timer_init(index_to_timer(gd32_timer_periph_list.TimerIndex[i]), initpara); + } + } +} + +static void channel_output_config(timer_oc_parameter_struct *ocpara) +{ + rt_int16_t i; + rt_uint32_t timer_periph; + + /* config the channel config */ + for (i = 0; i < sizeof(gd32_pwm_pin_obj) / sizeof(gd32_pwm_pin_obj[0]); ++i) + { + + timer_periph = index_to_timer(gd32_pwm_pin_obj[i].TimerIndex); + timer_channel_output_config(timer_periph, gd32_pwm_pin_obj[i].channel, ocpara); + + timer_channel_output_pulse_value_config(timer_periph, gd32_pwm_pin_obj[i].channel, 7999); + timer_channel_output_mode_config(timer_periph, gd32_pwm_pin_obj[i].channel, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(timer_periph, gd32_pwm_pin_obj[i].channel, TIMER_OC_SHADOW_DISABLE); + /* auto-reload preload shadow reg enable */ + /* timer_auto_reload_shadow_enable(timer_periph); */ + timer_channel_output_state_config(timer_periph, gd32_pwm_pin_obj[i].channel, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(timer_periph, gd32_pwm_pin_obj[i].channel, TIMER_CCXN_DISABLE); + } + + /* enable timer */ + for (i = 0; i < sizeof(gd32_timer_periph_list.TimerIndex) / sizeof(gd32_timer_periph_list.TimerIndex[0]); ++i) + { + if (-1 != gd32_timer_periph_list.TimerIndex[i]) + { + timer_periph = index_to_timer(gd32_timer_periph_list.TimerIndex[i]); + if (timer_periph == TIMER0) + { + timer_primary_output_config(timer_periph, ENABLE); + } + timer_enable(timer_periph); + } + } +} + +static void timer_config(void) +{ + timer_oc_parameter_struct timer_ocintpara; + timer_parameter_struct timer_initpara; + + /* TIMER configuration */ + timer_initpara.prescaler = 119; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 15999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init_para(&timer_initpara); + + /* CHX configuration in PWM mode */ + timer_ocintpara.outputstate = TIMER_CCX_ENABLE; + timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + channel_output_config(&timer_ocintpara); +} + +static rt_err_t gd32_hw_pwm_init(void) +{ + pwm_find_timer_periph(); + rcu_config(); + gpio_config(); + timer_config(); + return RT_EOK; +} + +static rt_err_t drv_pwm_enable(gd32_pwm_device_t *pstTimerMap, + struct rt_pwm_configuration *configuration, + rt_bool_t enable) +{ + uint32_t timer_periph = index_to_timer(pstTimerMap->TimerIndex); + uint32_t channel = configuration->channel; + + if ((channel != TIMER_CH_0) && + (channel != TIMER_CH_1) && + (channel != TIMER_CH_2) && + (channel != TIMER_CH_3)) + { + return -RT_EINVAL; + } + + if (enable) + { + timer_channel_output_state_config(timer_periph, channel, TIMER_CCX_ENABLE); + } + else + { + timer_channel_output_state_config(timer_periph, channel, TIMER_CCX_DISABLE); + } + + return RT_EOK; +} + +static rt_err_t drv_pwm_set(gd32_pwm_device_t *pstTimerMap, struct rt_pwm_configuration *configuration) +{ + rt_uint32_t period, pulse; + rt_uint64_t tim_clock, psc; + tim_clock = rcu_clock_freq_get(CK_SYS); + + /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ + tim_clock /= 1000000UL; + period = (unsigned long long)configuration->period * tim_clock / 1000ULL; + psc = period / MAX_PERIOD + 1; + period = period / psc; + + timer_prescaler_config(index_to_timer(pstTimerMap->TimerIndex), psc - 1, TIMER_PSC_RELOAD_NOW); + + if (period < MIN_PERIOD) + { + period = MIN_PERIOD; + } + + timer_autoreload_value_config(index_to_timer(pstTimerMap->TimerIndex), period - 1); + + pulse = (unsigned long long)configuration->pulse * tim_clock / psc / 1000ULL; + if (pulse < MIN_PULSE) + { + pulse = MIN_PULSE; + } + else if (pulse > period) + { + pulse = period; + } + + timer_channel_output_pulse_value_config(index_to_timer(pstTimerMap->TimerIndex), configuration->channel, pulse); + timer_counter_value_config(index_to_timer(pstTimerMap->TimerIndex), 0); + + /* Update frequency value */ + timer_event_software_generate(index_to_timer(pstTimerMap->TimerIndex), TIMER_EVENT_SRC_UPG); + + return RT_EOK; +} + + +static rt_err_t drv_pwm_get(gd32_pwm_device_t *pstTimerMap, struct rt_pwm_configuration *configuration) +{ + rt_uint64_t tim_clock; + rt_uint16_t psc; + rt_uint32_t chxcv; + + tim_clock = rcu_clock_freq_get(CK_SYS); + + psc = timer_prescaler_read(index_to_timer(pstTimerMap->TimerIndex)); + if (psc == TIMER_CKDIV_DIV2) + { + tim_clock = tim_clock / 2; + } + else if (psc == TIMER_CKDIV_DIV4) + { + tim_clock = tim_clock / 4; + } + + chxcv = timer_channel_capture_value_register_read(index_to_timer(pstTimerMap->TimerIndex), configuration->channel); + /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ + tim_clock /= 1000000UL; + configuration->period = (TIMER_CAR(index_to_timer(pstTimerMap->TimerIndex)) + 1) * (psc + 1) * 1000UL / tim_clock; + configuration->pulse = (chxcv + 1) * (psc + 1) * 1000UL / tim_clock; + + return RT_EOK; +} + + +static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg) +{ + struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg; + gd32_pwm_device_t *pstTimerMap = (gd32_pwm_device_t *)device->parent.user_data; + + switch (cmd) + { + case PWM_CMD_ENABLE: + return drv_pwm_enable(pstTimerMap, configuration, RT_TRUE); + case PWM_CMD_DISABLE: + return drv_pwm_enable(pstTimerMap, configuration, RT_FALSE); + case PWM_CMD_SET: + return drv_pwm_set(pstTimerMap, configuration); + case PWM_CMD_GET: + return drv_pwm_get(pstTimerMap, configuration); + default: + return -RT_EINVAL; +} +} + +static struct rt_pwm_ops drv_ops = {drv_pwm_control}; + +static int gd32_pwm_init(void) +{ + int i = 0; + int result = RT_EOK; + + /* pwm init */ + gd32_hw_pwm_init(); + LOG_D("PWM init success"); + + for (i = 0; i < sizeof(gd32_pwm_obj) / sizeof(gd32_pwm_obj[0]); i++) + { + if (rt_device_pwm_register(&gd32_pwm_obj[i].pwm_device, gd32_pwm_obj[i].name, &drv_ops, &gd32_pwm_obj[i]) == RT_EOK) + { + LOG_D("%s register success", gd32_pwm_obj[i].name); + } + else + { + LOG_E("%s register failed", gd32_pwm_obj[i].name); + result = -RT_ERROR; + } + } + return result; +} + +INIT_DEVICE_EXPORT(gd32_pwm_init); + +#endif /* RT_USING_PWM */ \ No newline at end of file -- Gitee From 4d063acc297165c5125163f4a36a2465357781f5 Mon Sep 17 00:00:00 2001 From: Onlyou_tzZ <97173915+OnlyoutzZ@users.noreply.github.com> Date: Tue, 3 Feb 2026 18:56:53 +0800 Subject: [PATCH 26/45] Update Nsing's BSP architecture and add N32H7xx series BSPs. (#11159) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 更新国民技术BSP架构,添加N32H7xx系列BSP * 修改clang_format-ignore文件,根据反馈修改n32h7xxx/libraries/N32_Drivers/nano/*下的文件格式,修改n32h7xxx/n32/n32hxxx/n32h760zil7-stb/applications/main.c文件,区别处理Nano下头文件包含 * 将N32 BSP的.clang-format-ignore文件放入libraries同级目录 * 忽略库文件格式检查 * 解决N32 BSP project.ewp和project.uvprojx冲突 * 更新RTT最新同步 --- .github/ALL_BSP_COMPILE.json | 25 +- bsp/n32/n32g45xcl-stb/project.uvoptx | 185 - bsp/n32/n32g45xml-stb/project.uvoptx | 185 - bsp/n32/n32g45xrl-stb/Kconfig | 12 - bsp/n32/n32g45xrl-stb/project.uvoptx | 185 - bsp/n32/n32g45xrl-stb/rtconfig.py | 184 - bsp/n32/n32g45xvl-stb/Kconfig | 12 - bsp/n32/n32g45xvl-stb/project.uvoptx | 185 - bsp/n32/n32g45xvl-stb/rtconfig.py | 184 - bsp/n32/n32g4frml-stb/Kconfig | 12 - bsp/n32/n32g4frml-stb/project.ewp | 2474 -- bsp/n32/n32g4frml-stb/rtconfig.py | 184 - bsp/n32/{ => n32gxx_lxx}/.clang-format-ignore | 7 +- bsp/n32/{ => n32gxx_lxx}/libraries/Kconfig | 0 .../CMSIS/core/arm_common_tables.h | 0 .../CMSIS/core/arm_const_structs.h | 0 .../CMSIS/core/arm_math.h | 0 .../CMSIS/core/cmsis_armcc.h | 0 .../CMSIS/core/cmsis_armclang.h | 0 .../CMSIS/core/cmsis_compiler.h | 0 .../CMSIS/core/cmsis_gcc.h | 0 .../CMSIS/core/cmsis_iccarm.h | 0 .../CMSIS/core/cmsis_version.h | 0 .../CMSIS/core/core_cm4.h | 0 .../CMSIS/core/mpu_armv7.h | 0 .../CMSIS/device/n32g43x.h | 0 .../CMSIS/device/n32g43x_conf.h | 0 .../CMSIS/device/n32g43x_flash.ld | 0 .../CMSIS/device/startup/startup_n32g43x.s | 0 .../device/startup/startup_n32g43x_EWARM.s | 0 .../device/startup/startup_n32g43x_gcc.s | 0 .../CMSIS/device/system_n32g43x.c | 0 .../CMSIS/device/system_n32g43x.h | 0 .../N32G43x_Firmware_Library/SConscript | 0 .../n32g43x_algo_lib/inc/n32g43x_aes.h | 0 .../inc/n32g43x_algo_common.h | 0 .../n32g43x_algo_lib/inc/n32g43x_des.h | 0 .../n32g43x_algo_lib/inc/n32g43x_hash.h | 0 .../n32g43x_algo_lib/inc/n32g43x_rng.h | 0 .../n32g43x_std_periph_driver/inc/misc.h | 0 .../inc/n32g43x_adc.h | 0 .../inc/n32g43x_can.h | 0 .../inc/n32g43x_comp.h | 0 .../inc/n32g43x_crc.h | 0 .../inc/n32g43x_dac.h | 0 .../inc/n32g43x_dbg.h | 0 .../inc/n32g43x_dma.h | 0 .../inc/n32g43x_exti.h | 0 .../inc/n32g43x_flash.h | 0 .../inc/n32g43x_gpio.h | 0 .../inc/n32g43x_i2c.h | 0 .../inc/n32g43x_iwdg.h | 0 .../inc/n32g43x_lptim.h | 0 .../inc/n32g43x_lpuart.h | 0 .../inc/n32g43x_opamp.h | 0 .../inc/n32g43x_pwr.h | 0 .../inc/n32g43x_rcc.h | 0 .../inc/n32g43x_rtc.h | 0 .../inc/n32g43x_spi.h | 0 .../inc/n32g43x_tim.h | 0 .../inc/n32g43x_tsc.h | 0 .../inc/n32g43x_usart.h | 0 .../inc/n32g43x_wwdg.h | 0 .../n32g43x_std_periph_driver/src/misc.c | 0 .../src/n32g43x_adc.c | 0 .../src/n32g43x_can.c | 0 .../src/n32g43x_comp.c | 0 .../src/n32g43x_crc.c | 0 .../src/n32g43x_dac.c | 0 .../src/n32g43x_dbg.c | 0 .../src/n32g43x_dma.c | 0 .../src/n32g43x_exti.c | 0 .../src/n32g43x_flash.c | 0 .../src/n32g43x_gpio.c | 0 .../src/n32g43x_i2c.c | 0 .../src/n32g43x_iwdg.c | 0 .../src/n32g43x_lptim.c | 0 .../src/n32g43x_lpuart.c | 0 .../src/n32g43x_opamp.c | 0 .../src/n32g43x_pwr.c | 0 .../src/n32g43x_rcc.c | 0 .../src/n32g43x_rtc.c | 0 .../src/n32g43x_spi.c | 0 .../src/n32g43x_tim.c | 0 .../src/n32g43x_tsc.c | 0 .../src/n32g43x_usart.c | 0 .../src/n32g43x_wwdg.c | 0 .../n32g43x_usbfs_driver/inc/usb_core.h | 0 .../n32g43x_usbfs_driver/inc/usb_def.h | 0 .../n32g43x_usbfs_driver/inc/usb_init.h | 0 .../n32g43x_usbfs_driver/inc/usb_int.h | 0 .../n32g43x_usbfs_driver/inc/usb_lib.h | 0 .../n32g43x_usbfs_driver/inc/usb_mem.h | 0 .../n32g43x_usbfs_driver/inc/usb_regs.h | 0 .../n32g43x_usbfs_driver/inc/usb_sil.h | 0 .../n32g43x_usbfs_driver/inc/usb_type.h | 0 .../n32g43x_usbfs_driver/src/usb_core.c | 0 .../n32g43x_usbfs_driver/src/usb_init.c | 0 .../n32g43x_usbfs_driver/src/usb_int.c | 0 .../n32g43x_usbfs_driver/src/usb_mem.c | 0 .../n32g43x_usbfs_driver/src/usb_regs.c | 0 .../n32g43x_usbfs_driver/src/usb_sil.c | 0 .../CMSIS/core/arm_common_tables.h | 0 .../CMSIS/core/arm_const_structs.h | 0 .../CMSIS/core/arm_math.h | 0 .../CMSIS/core/cmsis_armcc.h | 0 .../CMSIS/core/cmsis_armclang.h | 0 .../CMSIS/core/cmsis_compiler.h | 0 .../CMSIS/core/cmsis_gcc.h | 0 .../CMSIS/core/cmsis_iccarm.h | 0 .../CMSIS/core/cmsis_version.h | 0 .../CMSIS/core/core_cm4.h | 0 .../CMSIS/core/mpu_armv7.h | 0 .../CMSIS/device/n32g45x.h | 0 .../CMSIS/device/n32g45x_conf.h | 0 .../CMSIS/device/n32g45x_flash.ld | 0 .../CMSIS/device/startup/startup_n32g45x.s | 0 .../device/startup/startup_n32g45x_EWARM.s | 0 .../device/startup/startup_n32g45x_gcc.s | 0 .../CMSIS/device/system_n32g45x.c | 0 .../CMSIS/device/system_n32g45x.h | 0 .../N32G45x_Firmware_Library/SConscript | 0 .../n32g45x_algo_lib/inc/n32g45x_aes.h | 0 .../inc/n32g45x_algo_common.h | 0 .../n32g45x_algo_lib/inc/n32g45x_des.h | 0 .../n32g45x_algo_lib/inc/n32g45x_hash.h | 0 .../n32g45x_algo_lib/inc/n32g45x_rng.h | 0 .../n32g45x_std_periph_driver/inc/misc.h | 0 .../inc/n32g45x_adc.h | 0 .../inc/n32g45x_bkp.h | 0 .../inc/n32g45x_can.h | 0 .../inc/n32g45x_comp.h | 0 .../inc/n32g45x_crc.h | 0 .../inc/n32g45x_dac.h | 0 .../inc/n32g45x_dbg.h | 0 .../inc/n32g45x_dma.h | 0 .../inc/n32g45x_dvp.h | 0 .../inc/n32g45x_eth.h | 0 .../inc/n32g45x_exti.h | 0 .../inc/n32g45x_flash.h | 0 .../inc/n32g45x_gpio.h | 0 .../inc/n32g45x_i2c.h | 0 .../inc/n32g45x_iwdg.h | 0 .../inc/n32g45x_opamp.h | 0 .../inc/n32g45x_pwr.h | 0 .../inc/n32g45x_qspi.h | 0 .../inc/n32g45x_rcc.h | 0 .../inc/n32g45x_rtc.h | 0 .../inc/n32g45x_sdio.h | 0 .../inc/n32g45x_spi.h | 0 .../inc/n32g45x_tim.h | 0 .../inc/n32g45x_tsc.h | 0 .../inc/n32g45x_usart.h | 0 .../inc/n32g45x_wwdg.h | 0 .../inc/n32xx_tsc_alg_api.h | 0 .../n32g45x_std_periph_driver/src/misc.c | 0 .../src/n32g45x_adc.c | 0 .../src/n32g45x_bkp.c | 0 .../src/n32g45x_can.c | 0 .../src/n32g45x_comp.c | 0 .../src/n32g45x_crc.c | 0 .../src/n32g45x_dac.c | 0 .../src/n32g45x_dbg.c | 0 .../src/n32g45x_dma.c | 0 .../src/n32g45x_dvp.c | 0 .../src/n32g45x_eth.c | 0 .../src/n32g45x_exti.c | 0 .../src/n32g45x_flash.c | 0 .../src/n32g45x_gpio.c | 0 .../src/n32g45x_i2c.c | 0 .../src/n32g45x_iwdg.c | 0 .../src/n32g45x_opamp.c | 0 .../src/n32g45x_pwr.c | 0 .../src/n32g45x_qspi.c | 0 .../src/n32g45x_rcc.c | 0 .../src/n32g45x_rtc.c | 0 .../src/n32g45x_sdio.c | 0 .../src/n32g45x_spi.c | 0 .../src/n32g45x_tim.c | 0 .../src/n32g45x_tsc.c | 0 .../src/n32g45x_usart.c | 0 .../src/n32g45x_wwdg.c | 0 .../n32g45x_usbfs_driver/inc/usb_core.h | 0 .../n32g45x_usbfs_driver/inc/usb_def.h | 0 .../n32g45x_usbfs_driver/inc/usb_init.h | 0 .../n32g45x_usbfs_driver/inc/usb_int.h | 0 .../n32g45x_usbfs_driver/inc/usb_lib.h | 0 .../n32g45x_usbfs_driver/inc/usb_mem.h | 0 .../n32g45x_usbfs_driver/inc/usb_regs.h | 0 .../n32g45x_usbfs_driver/inc/usb_sil.h | 0 .../n32g45x_usbfs_driver/inc/usb_type.h | 0 .../n32g45x_usbfs_driver/src/usb_core.c | 0 .../n32g45x_usbfs_driver/src/usb_init.c | 0 .../n32g45x_usbfs_driver/src/usb_int.c | 0 .../n32g45x_usbfs_driver/src/usb_mem.c | 0 .../n32g45x_usbfs_driver/src/usb_regs.c | 0 .../n32g45x_usbfs_driver/src/usb_sil.c | 0 .../CMSIS/core/arm_common_tables.h | 0 .../CMSIS/core/arm_const_structs.h | 0 .../CMSIS/core/arm_math.h | 0 .../CMSIS/core/cmsis_armcc.h | 0 .../CMSIS/core/cmsis_armclang.h | 0 .../CMSIS/core/cmsis_compiler.h | 0 .../CMSIS/core/cmsis_gcc.h | 0 .../CMSIS/core/cmsis_iccarm.h | 0 .../CMSIS/core/cmsis_version.h | 0 .../CMSIS/core/core_cm4.h | 0 .../CMSIS/core/mpu_armv7.h | 0 .../CMSIS/device/n32g4fr.h | 0 .../CMSIS/device/n32g4fr_conf.h | 0 .../CMSIS/device/n32g4fr_flash.ld | 0 .../CMSIS/device/startup/startup_n32g4fr.s | 0 .../device/startup/startup_n32g4fr_EWARM.s | 0 .../device/startup/startup_n32g4fr_gcc.s | 0 .../CMSIS/device/system_n32g4fr.c | 0 .../CMSIS/device/system_n32g4fr.h | 0 .../N32G4FR_Firmware_Library/SConscript | 0 .../n32g4fr_algo_lib/inc/n32g4fr_aes.h | 0 .../inc/n32g4fr_algo_common.h | 0 .../n32g4fr_algo_lib/inc/n32g4fr_des.h | 0 .../n32g4fr_algo_lib/inc/n32g4fr_hash.h | 0 .../n32g4fr_algo_lib/inc/n32g4fr_rng.h | 0 .../n32g4fr_std_periph_driver/inc/misc.h | 0 .../inc/n32g4fr_adc.h | 0 .../inc/n32g4fr_bkp.h | 0 .../inc/n32g4fr_can.h | 0 .../inc/n32g4fr_crc.h | 0 .../inc/n32g4fr_dac.h | 0 .../inc/n32g4fr_dbg.h | 0 .../inc/n32g4fr_dma.h | 0 .../inc/n32g4fr_dvp.h | 0 .../inc/n32g4fr_exti.h | 0 .../inc/n32g4fr_flash.h | 0 .../inc/n32g4fr_gpio.h | 0 .../inc/n32g4fr_i2c.h | 0 .../inc/n32g4fr_iwdg.h | 0 .../inc/n32g4fr_pwr.h | 0 .../inc/n32g4fr_qspi.h | 0 .../inc/n32g4fr_rcc.h | 0 .../inc/n32g4fr_rtc.h | 0 .../inc/n32g4fr_sdio.h | 0 .../inc/n32g4fr_spi.h | 0 .../inc/n32g4fr_tim.h | 0 .../inc/n32g4fr_tsc.h | 0 .../inc/n32g4fr_usart.h | 0 .../inc/n32g4fr_wwdg.h | 0 .../inc/n32xx_tsc_alg_api.h | 0 .../n32g4fr_std_periph_driver/src/misc.c | 0 .../src/n32g4fr_adc.c | 0 .../src/n32g4fr_bkp.c | 0 .../src/n32g4fr_can.c | 0 .../src/n32g4fr_crc.c | 0 .../src/n32g4fr_dac.c | 0 .../src/n32g4fr_dbg.c | 0 .../src/n32g4fr_dma.c | 0 .../src/n32g4fr_dvp.c | 0 .../src/n32g4fr_exti.c | 0 .../src/n32g4fr_flash.c | 0 .../src/n32g4fr_gpio.c | 0 .../src/n32g4fr_i2c.c | 0 .../src/n32g4fr_iwdg.c | 0 .../src/n32g4fr_pwr.c | 0 .../src/n32g4fr_qspi.c | 0 .../src/n32g4fr_rcc.c | 0 .../src/n32g4fr_rtc.c | 0 .../src/n32g4fr_sdio.c | 0 .../src/n32g4fr_spi.c | 0 .../src/n32g4fr_tim.c | 0 .../src/n32g4fr_tsc.c | 0 .../src/n32g4fr_usart.c | 0 .../src/n32g4fr_wwdg.c | 0 .../n32g4fr_usbfs_driver/inc/usb_core.h | 0 .../n32g4fr_usbfs_driver/inc/usb_def.h | 0 .../n32g4fr_usbfs_driver/inc/usb_init.h | 0 .../n32g4fr_usbfs_driver/inc/usb_int.h | 0 .../n32g4fr_usbfs_driver/inc/usb_lib.h | 0 .../n32g4fr_usbfs_driver/inc/usb_mem.h | 0 .../n32g4fr_usbfs_driver/inc/usb_regs.h | 0 .../n32g4fr_usbfs_driver/inc/usb_sil.h | 0 .../n32g4fr_usbfs_driver/inc/usb_type.h | 0 .../n32g4fr_usbfs_driver/src/usb_core.c | 0 .../n32g4fr_usbfs_driver/src/usb_init.c | 0 .../n32g4fr_usbfs_driver/src/usb_int.c | 0 .../n32g4fr_usbfs_driver/src/usb_mem.c | 0 .../n32g4fr_usbfs_driver/src/usb_regs.c | 0 .../n32g4fr_usbfs_driver/src/usb_sil.c | 0 .../CMSIS/core/arm_common_tables.h | 0 .../CMSIS/core/arm_const_structs.h | 0 .../CMSIS/core/arm_math.h | 0 .../CMSIS/core/cmsis_armcc.h | 0 .../CMSIS/core/cmsis_armclang.h | 0 .../CMSIS/core/cmsis_compiler.h | 0 .../CMSIS/core/cmsis_gcc.h | 0 .../CMSIS/core/cmsis_iccarm.h | 0 .../CMSIS/core/cmsis_version.h | 0 .../CMSIS/core/core_cm4.h | 0 .../CMSIS/core/mpu_armv7.h | 0 .../CMSIS/device/n32l40x.h | 0 .../CMSIS/device/n32l40x_conf.h | 0 .../CMSIS/device/n32l40x_flash.ld | 0 .../CMSIS/device/startup/startup_n32l40x.s | 0 .../device/startup/startup_n32l40x_EWARM.s | 0 .../device/startup/startup_n32l40x_gcc.s | 0 .../CMSIS/device/system_n32l40x.c | 0 .../CMSIS/device/system_n32l40x.h | 0 .../N32L40x_Firmware_Library/SConscript | 0 .../n32l40x_algo_lib/inc/n32l40x_aes.h | 0 .../inc/n32l40x_algo_common.h | 0 .../n32l40x_algo_lib/inc/n32l40x_des.h | 0 .../n32l40x_algo_lib/inc/n32l40x_hash.h | 0 .../n32l40x_algo_lib/inc/n32l40x_rng.h | 0 .../n32l40x_std_periph_driver/inc/misc.h | 0 .../inc/n32l40x_adc.h | 0 .../inc/n32l40x_can.h | 0 .../inc/n32l40x_comp.h | 0 .../inc/n32l40x_crc.h | 0 .../inc/n32l40x_dac.h | 0 .../inc/n32l40x_dbg.h | 0 .../inc/n32l40x_dma.h | 0 .../inc/n32l40x_exti.h | 0 .../inc/n32l40x_flash.h | 0 .../inc/n32l40x_gpio.h | 0 .../inc/n32l40x_i2c.h | 0 .../inc/n32l40x_iwdg.h | 0 .../inc/n32l40x_lcd.h | 0 .../inc/n32l40x_lptim.h | 0 .../inc/n32l40x_lpuart.h | 0 .../inc/n32l40x_opamp.h | 0 .../inc/n32l40x_pwr.h | 0 .../inc/n32l40x_rcc.h | 0 .../inc/n32l40x_rtc.h | 0 .../inc/n32l40x_spi.h | 0 .../inc/n32l40x_tim.h | 0 .../inc/n32l40x_tsc.h | 0 .../inc/n32l40x_usart.h | 0 .../inc/n32l40x_wwdg.h | 0 .../n32l40x_std_periph_driver/src/misc.c | 0 .../src/n32l40x_adc.c | 0 .../src/n32l40x_can.c | 0 .../src/n32l40x_comp.c | 0 .../src/n32l40x_crc.c | 0 .../src/n32l40x_dac.c | 0 .../src/n32l40x_dbg.c | 0 .../src/n32l40x_dma.c | 0 .../src/n32l40x_exti.c | 0 .../src/n32l40x_flash.c | 0 .../src/n32l40x_gpio.c | 0 .../src/n32l40x_i2c.c | 0 .../src/n32l40x_iwdg.c | 0 .../src/n32l40x_lcd.c | 0 .../src/n32l40x_lptim.c | 0 .../src/n32l40x_lpuart.c | 0 .../src/n32l40x_opamp.c | 0 .../src/n32l40x_pwr.c | 0 .../src/n32l40x_rcc.c | 0 .../src/n32l40x_rtc.c | 0 .../src/n32l40x_spi.c | 0 .../src/n32l40x_tim.c | 0 .../src/n32l40x_tsc.c | 0 .../src/n32l40x_usart.c | 0 .../src/n32l40x_wwdg.c | 0 .../n32l40x_usbfs_driver/inc/usb_core.h | 0 .../n32l40x_usbfs_driver/inc/usb_def.h | 0 .../n32l40x_usbfs_driver/inc/usb_init.h | 0 .../n32l40x_usbfs_driver/inc/usb_int.h | 0 .../n32l40x_usbfs_driver/inc/usb_lib.h | 0 .../n32l40x_usbfs_driver/inc/usb_mem.h | 0 .../n32l40x_usbfs_driver/inc/usb_regs.h | 0 .../n32l40x_usbfs_driver/inc/usb_sil.h | 0 .../n32l40x_usbfs_driver/inc/usb_type.h | 0 .../n32l40x_usbfs_driver/src/usb_core.c | 0 .../n32l40x_usbfs_driver/src/usb_init.c | 0 .../n32l40x_usbfs_driver/src/usb_int.c | 0 .../n32l40x_usbfs_driver/src/usb_mem.c | 0 .../n32l40x_usbfs_driver/src/usb_regs.c | 0 .../n32l40x_usbfs_driver/src/usb_sil.c | 0 .../CMSIS/core/arm_common_tables.h | 0 .../CMSIS/core/arm_const_structs.h | 0 .../CMSIS/core/arm_math.h | 0 .../CMSIS/core/cmsis_armcc.h | 0 .../CMSIS/core/cmsis_armclang.h | 0 .../CMSIS/core/cmsis_compiler.h | 0 .../CMSIS/core/cmsis_gcc.h | 0 .../CMSIS/core/cmsis_iccarm.h | 0 .../CMSIS/core/cmsis_version.h | 0 .../CMSIS/core/core_cm4.h | 0 .../CMSIS/core/mpu_armv7.h | 0 .../CMSIS/device/n32l43x.h | 0 .../CMSIS/device/n32l43x_conf.h | 0 .../CMSIS/device/n32l43x_flash.ld | 0 .../CMSIS/device/startup/startup_n32l43x.s | 0 .../device/startup/startup_n32l43x_EWARM.s | 0 .../device/startup/startup_n32l43x_gcc.s | 0 .../CMSIS/device/system_n32l43x.c | 0 .../CMSIS/device/system_n32l43x.h | 0 .../N32L43x_Firmware_Library/SConscript | 0 .../n32l43x_algo_lib/inc/n32l43x_aes.h | 0 .../inc/n32l43x_algo_common.h | 0 .../n32l43x_algo_lib/inc/n32l43x_des.h | 0 .../n32l43x_algo_lib/inc/n32l43x_hash.h | 0 .../n32l43x_algo_lib/inc/n32l43x_rng.h | 0 .../n32l43x_std_periph_driver/inc/misc.h | 0 .../inc/n32l43x_adc.h | 0 .../inc/n32l43x_can.h | 0 .../inc/n32l43x_comp.h | 0 .../inc/n32l43x_crc.h | 0 .../inc/n32l43x_dac.h | 0 .../inc/n32l43x_dbg.h | 0 .../inc/n32l43x_dma.h | 0 .../inc/n32l43x_exti.h | 0 .../inc/n32l43x_flash.h | 0 .../inc/n32l43x_gpio.h | 0 .../inc/n32l43x_i2c.h | 0 .../inc/n32l43x_iwdg.h | 0 .../inc/n32l43x_lcd.h | 0 .../inc/n32l43x_lprcnt.h | 0 .../inc/n32l43x_lptim.h | 0 .../inc/n32l43x_lpuart.h | 0 .../inc/n32l43x_opamp.h | 0 .../inc/n32l43x_pwr.h | 0 .../inc/n32l43x_rcc.h | 0 .../inc/n32l43x_rtc.h | 0 .../inc/n32l43x_spi.h | 0 .../inc/n32l43x_tim.h | 0 .../inc/n32l43x_tsc.h | 0 .../inc/n32l43x_usart.h | 0 .../inc/n32l43x_wwdg.h | 0 .../n32l43x_std_periph_driver/src/misc.c | 0 .../src/n32l43x_adc.c | 0 .../src/n32l43x_can.c | 0 .../src/n32l43x_comp.c | 0 .../src/n32l43x_crc.c | 0 .../src/n32l43x_dac.c | 0 .../src/n32l43x_dbg.c | 0 .../src/n32l43x_dma.c | 0 .../src/n32l43x_exti.c | 0 .../src/n32l43x_flash.c | 0 .../src/n32l43x_gpio.c | 0 .../src/n32l43x_i2c.c | 0 .../src/n32l43x_iwdg.c | 0 .../src/n32l43x_lcd.c | 0 .../src/n32l43x_lprcnt.c | 0 .../src/n32l43x_lptim.c | 0 .../src/n32l43x_lpuart.c | 0 .../src/n32l43x_opamp.c | 0 .../src/n32l43x_pwr.c | 0 .../src/n32l43x_rcc.c | 0 .../src/n32l43x_rtc.c | 0 .../src/n32l43x_spi.c | 0 .../src/n32l43x_tim.c | 0 .../src/n32l43x_tsc.c | 0 .../src/n32l43x_usart.c | 0 .../src/n32l43x_wwdg.c | 0 .../n32l43x_usbfs_driver/inc/usb_core.h | 0 .../n32l43x_usbfs_driver/inc/usb_def.h | 0 .../n32l43x_usbfs_driver/inc/usb_init.h | 0 .../n32l43x_usbfs_driver/inc/usb_int.h | 0 .../n32l43x_usbfs_driver/inc/usb_lib.h | 0 .../n32l43x_usbfs_driver/inc/usb_mem.h | 0 .../n32l43x_usbfs_driver/inc/usb_regs.h | 0 .../n32l43x_usbfs_driver/inc/usb_sil.h | 0 .../n32l43x_usbfs_driver/inc/usb_type.h | 0 .../n32l43x_usbfs_driver/src/usb_core.c | 0 .../n32l43x_usbfs_driver/src/usb_init.c | 0 .../n32l43x_usbfs_driver/src/usb_int.c | 0 .../n32l43x_usbfs_driver/src/usb_mem.c | 0 .../n32l43x_usbfs_driver/src/usb_regs.c | 0 .../n32l43x_usbfs_driver/src/usb_sil.c | 0 .../CMSIS/core/arm_common_tables.h | 0 .../CMSIS/core/arm_const_structs.h | 0 .../CMSIS/core/arm_math.h | 0 .../CMSIS/core/cmsis_armcc.h | 0 .../CMSIS/core/cmsis_armclang.h | 0 .../CMSIS/core/cmsis_compiler.h | 0 .../CMSIS/core/cmsis_gcc.h | 0 .../CMSIS/core/cmsis_iccarm.h | 0 .../CMSIS/core/cmsis_version.h | 0 .../CMSIS/core/core_cm4.h | 0 .../CMSIS/core/mpu_armv7.h | 0 .../CMSIS/device/n32wb452.h | 0 .../CMSIS/device/n32wb452_conf.h | 0 .../CMSIS/device/n32wb452_flash.ld | 0 .../CMSIS/device/startup/startup_n32wb452.s | 0 .../device/startup/startup_n32wb452_EWARM.s | 0 .../device/startup/startup_n32wb452_gcc.s | 0 .../CMSIS/device/system_n32wb452.c | 0 .../CMSIS/device/system_n32wb452.h | 0 .../N32WB452_Firmware_Library/SConscript | 0 .../n32wb452_algo_lib/inc/n32wb452_aes.h | 0 .../inc/n32wb452_algo_common.h | 0 .../n32wb452_algo_lib/inc/n32wb452_des.h | 0 .../n32wb452_algo_lib/inc/n32wb452_hash.h | 0 .../n32wb452_algo_lib/inc/n32wb452_rng.h | 0 .../n32wb452_ble_driver/inc/att.h | 0 .../n32wb452_ble_driver/inc/attc.h | 0 .../n32wb452_ble_driver/inc/attm.h | 0 .../n32wb452_ble_driver/inc/attm_db.h | 0 .../n32wb452_ble_driver/inc/atts.h | 0 .../n32wb452_ble_driver/inc/ble_arch.h | 0 .../n32wb452_ble_driver/inc/co_bt.h | 0 .../n32wb452_ble_driver/inc/co_bt_defines.h | 0 .../n32wb452_ble_driver/inc/co_endian.h | 0 .../n32wb452_ble_driver/inc/co_error.h | 0 .../n32wb452_ble_driver/inc/co_hci.h | 0 .../n32wb452_ble_driver/inc/co_list.h | 0 .../n32wb452_ble_driver/inc/co_llcp.h | 0 .../n32wb452_ble_driver/inc/co_lmp.h | 0 .../n32wb452_ble_driver/inc/co_math.h | 0 .../n32wb452_ble_driver/inc/co_utils.h | 0 .../n32wb452_ble_driver/inc/co_version.h | 0 .../n32wb452_ble_driver/inc/gap.h | 0 .../n32wb452_ble_driver/inc/gapc.h | 0 .../n32wb452_ble_driver/inc/gapc_int.h | 0 .../n32wb452_ble_driver/inc/gapc_sig.h | 0 .../n32wb452_ble_driver/inc/gapc_task.h | 0 .../n32wb452_ble_driver/inc/gapm.h | 0 .../n32wb452_ble_driver/inc/gapm_int.h | 0 .../n32wb452_ble_driver/inc/gapm_task.h | 0 .../n32wb452_ble_driver/inc/gapm_util.h | 0 .../n32wb452_ble_driver/inc/gatt.h | 0 .../n32wb452_ble_driver/inc/gattc.h | 0 .../n32wb452_ble_driver/inc/gattc_int.h | 0 .../n32wb452_ble_driver/inc/gattc_task.h | 0 .../n32wb452_ble_driver/inc/gattm.h | 0 .../n32wb452_ble_driver/inc/gattm_int.h | 0 .../n32wb452_ble_driver/inc/gattm_task.h | 0 .../n32wb452_ble_driver/inc/h4tl.h | 0 .../n32wb452_ble_driver/inc/hci.h | 0 .../n32wb452_ble_driver/inc/hci_int.h | 0 .../n32wb452_ble_driver/inc/ke.h | 0 .../n32wb452_ble_driver/inc/ke_config.h | 0 .../n32wb452_ble_driver/inc/ke_env.h | 0 .../n32wb452_ble_driver/inc/ke_event.h | 0 .../n32wb452_ble_driver/inc/ke_mem.h | 0 .../n32wb452_ble_driver/inc/ke_msg.h | 0 .../n32wb452_ble_driver/inc/ke_queue.h | 0 .../n32wb452_ble_driver/inc/ke_task.h | 0 .../n32wb452_ble_driver/inc/ke_timer.h | 0 .../n32wb452_ble_driver/inc/l2cc.h | 0 .../n32wb452_ble_driver/inc/l2cc_int.h | 0 .../n32wb452_ble_driver/inc/l2cc_lecb.h | 0 .../n32wb452_ble_driver/inc/l2cc_pdu.h | 0 .../n32wb452_ble_driver/inc/l2cc_pdu_int.h | 0 .../n32wb452_ble_driver/inc/l2cc_sig.h | 0 .../n32wb452_ble_driver/inc/l2cc_task.h | 0 .../n32wb452_ble_driver/inc/l2cm.h | 0 .../n32wb452_ble_driver/inc/l2cm_int.h | 0 .../n32wb452_ble_driver/inc/nvds.h | 0 .../n32wb452_ble_driver/inc/prf.h | 0 .../n32wb452_ble_driver/inc/prf_types.h | 0 .../n32wb452_ble_driver/inc/prf_utils.h | 0 .../n32wb452_ble_driver/inc/rwapp_config.h | 0 .../n32wb452_ble_driver/inc/rwble_config.h | 0 .../n32wb452_ble_driver/inc/rwble_hl.h | 0 .../n32wb452_ble_driver/inc/rwble_hl_config.h | 0 .../n32wb452_ble_driver/inc/rwble_hl_error.h | 0 .../n32wb452_ble_driver/inc/rwip.h | 0 .../n32wb452_ble_driver/inc/rwip_config.h | 0 .../n32wb452_ble_driver/inc/rwip_task.h | 0 .../n32wb452_ble_driver/inc/rwprf_config.h | 0 .../n32wb452_ble_driver/inc/smp_common.h | 0 .../n32wb452_ble_driver/inc/smpc.h | 0 .../n32wb452_ble_driver/inc/smpc_api.h | 0 .../n32wb452_ble_driver/inc/smpc_crypto.h | 0 .../n32wb452_ble_driver/inc/smpc_int.h | 0 .../n32wb452_ble_driver/inc/smpc_util.h | 0 .../n32wb452_ble_driver/inc/smpm_api.h | 0 .../n32wb452_ble_driver/n32wb452_ble_api.c | 0 .../n32wb452_ble_driver/n32wb452_ble_api.h | 0 .../n32wb452_ble_driver/platform/Eif_debug.c | 0 .../n32wb452_ble_driver/platform/Eif_flash.c | 0 .../n32wb452_ble_driver/platform/Eif_timer.c | 0 .../n32wb452_ble_driver/platform/Interface.c | 0 .../platform/inc/Eif_debug.h | 0 .../platform/inc/Eif_flash.h | 0 .../platform/inc/Eif_iom.h | 0 .../platform/inc/Eif_spi.h | 0 .../platform/inc/Eif_timer.h | 0 .../platform/inc/Eif_uart.h | 0 .../platform/inc/Interface.h | 0 .../platform/inc/Ramcode.h | 0 .../platform/inc/ble_monitor.h | 0 .../n32wb452_ble_driver/profile/app.c | 0 .../n32wb452_ble_driver/profile/app_batt.c | 0 .../n32wb452_ble_driver/profile/app_sec.c | 0 .../n32wb452_ble_driver/profile/app_task.c | 0 .../n32wb452_ble_driver/profile/app_user.c | 0 .../n32wb452_ble_driver/profile/bass.c | 0 .../n32wb452_ble_driver/profile/bass_task.c | 0 .../n32wb452_ble_driver/profile/inc/app.h | 0 .../profile/inc/app_batt.h | 0 .../n32wb452_ble_driver/profile/inc/app_sec.h | 0 .../profile/inc/app_task.h | 0 .../profile/inc/app_user.h | 0 .../n32wb452_ble_driver/profile/inc/bass.h | 0 .../profile/inc/bass_task.h | 0 .../profile/inc/rwapp_config.h | 0 .../n32wb452_ble_driver/profile/inc/user.h | 0 .../profile/inc/user_task.h | 0 .../n32wb452_ble_driver/profile/prf.c | 0 .../n32wb452_ble_driver/profile/prf_utils.c | 0 .../n32wb452_ble_driver/profile/user.c | 0 .../n32wb452_ble_driver/profile/user_task.c | 0 .../n32wb452_std_periph_driver/inc/misc.h | 0 .../inc/n32wb452_adc.h | 0 .../inc/n32wb452_bkp.h | 0 .../inc/n32wb452_can.h | 0 .../inc/n32wb452_crc.h | 0 .../inc/n32wb452_dac.h | 0 .../inc/n32wb452_dbg.h | 0 .../inc/n32wb452_dma.h | 0 .../inc/n32wb452_dvp.h | 0 .../inc/n32wb452_exti.h | 0 .../inc/n32wb452_flash.h | 0 .../inc/n32wb452_gpio.h | 0 .../inc/n32wb452_i2c.h | 0 .../inc/n32wb452_iwdg.h | 0 .../inc/n32wb452_pwr.h | 0 .../inc/n32wb452_rcc.h | 0 .../inc/n32wb452_rtc.h | 0 .../inc/n32wb452_sdio.h | 0 .../inc/n32wb452_spi.h | 0 .../inc/n32wb452_tim.h | 0 .../inc/n32wb452_tsc.h | 0 .../inc/n32wb452_usart.h | 0 .../inc/n32wb452_wwdg.h | 0 .../inc/n32xx_tsc_alg_api.h | 0 .../n32wb452_std_periph_driver/src/misc.c | 0 .../src/n32wb452_adc.c | 0 .../src/n32wb452_bkp.c | 0 .../src/n32wb452_can.c | 0 .../src/n32wb452_crc.c | 0 .../src/n32wb452_dac.c | 0 .../src/n32wb452_dbg.c | 0 .../src/n32wb452_dma.c | 0 .../src/n32wb452_dvp.c | 0 .../src/n32wb452_exti.c | 0 .../src/n32wb452_flash.c | 0 .../src/n32wb452_gpio.c | 0 .../src/n32wb452_i2c.c | 0 .../src/n32wb452_iwdg.c | 0 .../src/n32wb452_pwr.c | 0 .../src/n32wb452_rcc.c | 0 .../src/n32wb452_rtc.c | 0 .../src/n32wb452_sdio.c | 0 .../src/n32wb452_spi.c | 0 .../src/n32wb452_tim.c | 0 .../src/n32wb452_tsc.c | 0 .../src/n32wb452_usart.c | 0 .../src/n32wb452_wwdg.c | 0 .../n32wb452_usbfs_driver/inc/usb_core.h | 0 .../n32wb452_usbfs_driver/inc/usb_def.h | 0 .../n32wb452_usbfs_driver/inc/usb_init.h | 0 .../n32wb452_usbfs_driver/inc/usb_int.h | 0 .../n32wb452_usbfs_driver/inc/usb_lib.h | 0 .../n32wb452_usbfs_driver/inc/usb_mem.h | 0 .../n32wb452_usbfs_driver/inc/usb_regs.h | 0 .../n32wb452_usbfs_driver/inc/usb_sil.h | 0 .../n32wb452_usbfs_driver/inc/usb_type.h | 0 .../n32wb452_usbfs_driver/src/usb_core.c | 0 .../n32wb452_usbfs_driver/src/usb_init.c | 0 .../n32wb452_usbfs_driver/src/usb_int.c | 0 .../n32wb452_usbfs_driver/src/usb_mem.c | 0 .../n32wb452_usbfs_driver/src/usb_regs.c | 0 .../n32wb452_usbfs_driver/src/usb_sil.c | 0 .../libraries/n32_drivers/Kconfig | 0 .../libraries/n32_drivers/SConscript | 0 .../libraries/n32_drivers/drv_adc.c | 0 .../libraries/n32_drivers/drv_adc.h | 0 .../libraries/n32_drivers/drv_can.c | 0 .../libraries/n32_drivers/drv_can.h | 0 .../libraries/n32_drivers/drv_dac.c | 0 .../libraries/n32_drivers/drv_dac.h | 0 .../libraries/n32_drivers/drv_gpio.c | 0 .../libraries/n32_drivers/drv_gpio.h | 0 .../libraries/n32_drivers/drv_i2c.c | 0 .../libraries/n32_drivers/drv_i2c.h | 0 .../libraries/n32_drivers/drv_rtc.c | 0 .../libraries/n32_drivers/drv_spi.c | 0 .../libraries/n32_drivers/drv_spi.h | 0 .../libraries/n32_drivers/drv_timer.c | 0 .../libraries/n32_drivers/drv_timer.h | 0 .../libraries/n32_drivers/drv_usart.c | 0 .../libraries/n32_drivers/drv_usart.h | 0 .../libraries/n32_drivers/drv_usart_v2.c | 0 .../libraries/n32_drivers/drv_usart_v2.h | 0 .../libraries/n32_drivers/drv_wdt.c | 0 .../{ => n32gxx_lxx}/n32g43xcl-stb/.config | 35 +- .../n32g43xcl-stb}/Kconfig | 2 +- .../{ => n32gxx_lxx}/n32g43xcl-stb/README.md | 0 .../{ => n32gxx_lxx}/n32g43xcl-stb/SConscript | 0 .../{ => n32gxx_lxx}/n32g43xcl-stb/SConstruct | 2 +- .../n32g43xcl-stb/applications/SConscript | 0 .../n32g43xcl-stb/applications/main.c | 0 .../n32g43xcl-stb/board/Kconfig | 0 .../n32g43xcl-stb/board/SConscript | 0 .../n32g43xcl-stb/board/board.c | 0 .../n32g43xcl-stb/board/board.h | 0 .../board/linker_scripts/link.icf | 0 .../board/linker_scripts/link.lds | 0 .../board/linker_scripts/link.sct | 0 .../n32g43xcl-stb/figures/board.jpg | Bin .../n32g43xcl-stb/project.ewd | 0 .../n32g43xcl-stb/project.ewp | 298 +- .../n32g43xcl-stb/project.eww | 0 .../n32g43xcl-stb/project.uvoptx | 0 .../n32g43xcl-stb/project.uvprojx | 0 .../{ => n32gxx_lxx}/n32g43xcl-stb/rtconfig.h | 11 +- .../n32g43xcl-stb}/rtconfig.py | 2 +- .../n32g43xcl-stb/template.ewp | 0 .../n32g43xcl-stb/template.eww | 0 .../n32g43xcl-stb/template.uvoptx | 0 .../n32g43xcl-stb/template.uvprojx | 0 .../n32g457qel-stb}/.config | 35 +- .../{ => n32gxx_lxx}/n32g457qel-stb/Kconfig | 2 +- .../{ => n32gxx_lxx}/n32g457qel-stb/README.md | 0 .../n32g457qel-stb/SConscript | 0 .../n32g457qel-stb}/SConstruct | 2 +- .../n32g457qel-stb/applications/SConscript | 0 .../n32g457qel-stb/applications/main.c | 0 .../n32g457qel-stb/board/Kconfig | 0 .../n32g457qel-stb/board/SConscript | 0 .../n32g457qel-stb/board/board.c | 0 .../n32g457qel-stb/board/board.h | 0 .../board/linker_scripts/link.icf | 0 .../board/linker_scripts/link.lds | 0 .../board/linker_scripts/link.sct | 0 .../n32g457qel-stb/figures/board.jpg | Bin .../n32g457qel-stb/project.ewd | 0 .../n32g457qel-stb/project.ewp | 298 +- .../n32g457qel-stb/project.eww | 0 .../n32gxx_lxx/n32g457qel-stb/project.uvoptx | 1324 + .../n32g457qel-stb/project.uvprojx | 0 .../n32g457qel-stb}/rtconfig.h | 11 +- .../n32g457qel-stb}/rtconfig.py | 2 +- .../n32g457qel-stb/template.ewp | 0 .../n32g457qel-stb/template.eww | 0 .../n32g457qel-stb/template.uvoptx | 0 .../n32g457qel-stb/template.uvprojx | 0 .../{ => n32gxx_lxx}/n32g45xcl-stb/.config | 35 +- .../n32g45xcl-stb}/Kconfig | 2 +- .../{ => n32gxx_lxx}/n32g45xcl-stb/README.md | 0 .../{ => n32gxx_lxx}/n32g45xcl-stb/SConscript | 0 .../n32g45xcl-stb}/SConstruct | 2 +- .../n32g45xcl-stb/applications/SConscript | 0 .../n32g45xcl-stb/applications/main.c | 0 .../n32g45xcl-stb/board/Kconfig | 0 .../n32g45xcl-stb/board/SConscript | 0 .../n32g45xcl-stb/board/board.c | 0 .../n32g45xcl-stb/board/board.h | 0 .../board/linker_scripts/link.icf | 0 .../board/linker_scripts/link.lds | 0 .../board/linker_scripts/link.sct | 0 .../n32g45xcl-stb/figures/board.png | Bin .../n32g45xcl-stb/project.ewd | 0 .../n32g45xcl-stb/project.ewp | 292 +- .../n32g45xcl-stb/project.eww | 0 .../n32gxx_lxx/n32g45xcl-stb/project.uvoptx | 1329 + .../n32g45xcl-stb/project.uvprojx | 0 .../{ => n32gxx_lxx}/n32g45xcl-stb/rtconfig.h | 11 +- .../n32g45xcl-stb/rtconfig.py | 2 +- .../n32g45xcl-stb/template.ewp | 0 .../n32g45xcl-stb/template.eww | 0 .../n32g45xcl-stb/template.uvoptx | 0 .../n32g45xcl-stb/template.uvprojx | 0 .../n32g45xml-stb}/.config | 35 +- .../n32g45xml-stb}/Kconfig | 2 +- .../{ => n32gxx_lxx}/n32g45xml-stb/README.md | 0 .../{ => n32gxx_lxx}/n32g45xml-stb/SConscript | 0 .../{ => n32gxx_lxx}/n32g45xml-stb/SConstruct | 2 +- .../n32g45xml-stb/applications/SConscript | 0 .../n32g45xml-stb/applications/main.c | 0 .../n32g45xml-stb/board/Kconfig | 0 .../n32g45xml-stb/board/SConscript | 0 .../n32g45xml-stb/board/board.c | 0 .../n32g45xml-stb/board/board.h | 0 .../board/linker_scripts/link.icf | 0 .../board/linker_scripts/link.lds | 0 .../board/linker_scripts/link.sct | 0 .../n32g45xml-stb/figures/board.png | Bin .../n32g45xml-stb/project.ewd | 0 .../n32g45xml-stb/project.ewp | 298 +- .../n32g45xml-stb/project.eww | 0 .../n32gxx_lxx/n32g45xml-stb/project.uvoptx | 1329 + .../n32g45xml-stb/project.uvprojx | 0 .../{ => n32gxx_lxx}/n32g45xml-stb/rtconfig.h | 11 +- .../n32g45xml-stb/rtconfig.py | 2 +- .../n32g45xml-stb/template.ewp | 0 .../n32g45xml-stb/template.eww | 0 .../n32g45xml-stb/template.uvoptx | 0 .../n32g45xml-stb/template.uvprojx | 0 .../n32g45xrl-stb}/.config | 35 +- bsp/n32/n32gxx_lxx/n32g45xrl-stb/Kconfig | 12 + .../{ => n32gxx_lxx}/n32g45xrl-stb/README.md | 0 .../{ => n32gxx_lxx}/n32g45xrl-stb/SConscript | 0 .../{ => n32gxx_lxx}/n32g45xrl-stb/SConstruct | 2 +- .../n32g45xrl-stb/applications/SConscript | 0 .../n32g45xrl-stb/applications/main.c | 0 .../n32g45xrl-stb/board/Kconfig | 0 .../n32g45xrl-stb/board/SConscript | 0 .../n32g45xrl-stb/board/board.c | 0 .../n32g45xrl-stb/board/board.h | 0 .../board/linker_scripts/link.icf | 0 .../board/linker_scripts/link.lds | 0 .../board/linker_scripts/link.sct | 0 .../n32g45xrl-stb/figures/board.jpg | Bin .../n32g45xrl-stb/project.ewd | 0 .../n32g45xrl-stb/project.ewp | 294 +- .../n32g45xrl-stb/project.eww | 0 .../n32gxx_lxx/n32g45xrl-stb/project.uvoptx | 1329 + .../n32g45xrl-stb/project.uvprojx | 0 .../n32g45xrl-stb}/rtconfig.h | 11 +- bsp/n32/n32gxx_lxx/n32g45xrl-stb/rtconfig.py | 184 + .../n32g45xrl-stb/template.ewp | 0 .../n32g45xrl-stb/template.eww | 0 .../n32g45xrl-stb/template.uvoptx | 0 .../n32g45xrl-stb/template.uvprojx | 0 .../.ci/attachconfig/ci.attachconfig.yml | 0 .../{ => n32gxx_lxx}/n32g45xvl-stb/.config | 35 +- bsp/n32/n32gxx_lxx/n32g45xvl-stb/Kconfig | 12 + .../{ => n32gxx_lxx}/n32g45xvl-stb/README.md | 0 .../{ => n32gxx_lxx}/n32g45xvl-stb/SConscript | 0 .../{ => n32gxx_lxx}/n32g45xvl-stb/SConstruct | 2 +- .../n32g45xvl-stb/applications/SConscript | 0 .../n32g45xvl-stb/applications/main.c | 0 .../n32g45xvl-stb/board/Kconfig | 0 .../n32g45xvl-stb/board/SConscript | 0 .../n32g45xvl-stb/board/board.c | 0 .../n32g45xvl-stb/board/board.h | 0 .../board/linker_scripts/link.icf | 0 .../board/linker_scripts/link.lds | 0 .../board/linker_scripts/link.sct | 0 .../n32g45xvl-stb/figures/board.jpg | Bin .../n32g45xvl-stb/project.ewd | 0 .../n32g45xvl-stb/project.ewp | 298 +- .../n32g45xvl-stb/project.eww | 0 .../n32gxx_lxx/n32g45xvl-stb/project.uvoptx | 1329 + .../n32g45xvl-stb/project.uvprojx | 0 .../{ => n32gxx_lxx}/n32g45xvl-stb/rtconfig.h | 11 +- bsp/n32/n32gxx_lxx/n32g45xvl-stb/rtconfig.py | 184 + .../n32g45xvl-stb/template.ewp | 0 .../n32g45xvl-stb/template.eww | 0 .../n32g45xvl-stb/template.uvoptx | 0 .../n32g45xvl-stb/template.uvprojx | 0 .../{ => n32gxx_lxx}/n32g4frml-stb/.config | 35 +- bsp/n32/n32gxx_lxx/n32g4frml-stb/Kconfig | 12 + .../{ => n32gxx_lxx}/n32g4frml-stb/README.md | 0 .../{ => n32gxx_lxx}/n32g4frml-stb/SConscript | 0 .../{ => n32gxx_lxx}/n32g4frml-stb/SConstruct | 2 +- .../n32g4frml-stb/applications/SConscript | 0 .../n32g4frml-stb/applications/main.c | 0 .../n32g4frml-stb/board/Kconfig | 0 .../n32g4frml-stb/board/SConscript | 0 .../n32g4frml-stb/board/board.c | 0 .../n32g4frml-stb/board/board.h | 0 .../board/linker_scripts/link.icf | 0 .../board/linker_scripts/link.lds | 0 .../board/linker_scripts/link.sct | 0 .../n32g4frml-stb/figures/board.png | Bin .../n32g4frml-stb/project.ewd | 0 bsp/n32/n32gxx_lxx/n32g4frml-stb/project.ewp | 2496 ++ .../n32g4frml-stb/project.eww | 0 .../n32gxx_lxx/n32g4frml-stb/project.uvoptx | 1305 + .../n32g4frml-stb/project.uvprojx | 0 .../{ => n32gxx_lxx}/n32g4frml-stb/rtconfig.h | 11 +- bsp/n32/n32gxx_lxx/n32g4frml-stb/rtconfig.py | 184 + .../n32g4frml-stb/template.ewp | 204 +- .../n32g4frml-stb/template.eww | 0 .../n32g4frml-stb/template.uvoptx | 0 .../n32g4frml-stb/template.uvprojx | 7 +- .../{ => n32gxx_lxx}/n32l40xcl-stb/.config | 35 +- bsp/n32/n32gxx_lxx/n32l40xcl-stb/Kconfig | 12 + .../{ => n32gxx_lxx}/n32l40xcl-stb/README.md | 0 .../{ => n32gxx_lxx}/n32l40xcl-stb/SConscript | 0 .../{ => n32gxx_lxx}/n32l40xcl-stb/SConstruct | 2 +- .../n32l40xcl-stb/applications/SConscript | 0 .../n32l40xcl-stb/applications/main.c | 0 .../n32l40xcl-stb/board/Kconfig | 0 .../n32l40xcl-stb/board/SConscript | 0 .../n32l40xcl-stb/board/board.c | 0 .../n32l40xcl-stb/board/board.h | 0 .../board/linker_scripts/link.icf | 0 .../board/linker_scripts/link.lds | 0 .../board/linker_scripts/link.sct | 0 .../n32l40xcl-stb/figures/board.jpg | Bin .../n32l40xcl-stb/project.ewd | 0 .../n32l40xcl-stb/project.ewp | 296 +- .../n32l40xcl-stb/project.eww | 0 .../n32gxx_lxx/n32l40xcl-stb/project.uvoptx | 1317 + .../n32l40xcl-stb/project.uvprojx | 0 .../{ => n32gxx_lxx}/n32l40xcl-stb/rtconfig.h | 11 +- bsp/n32/n32gxx_lxx/n32l40xcl-stb/rtconfig.py | 184 + .../n32l40xcl-stb/template.ewp | 0 .../n32l40xcl-stb/template.eww | 0 .../n32l40xcl-stb/template.uvoptx | 0 .../n32l40xcl-stb/template.uvprojx | 0 bsp/n32/{ => n32gxx_lxx}/n32l436-evb/.config | 35 +- bsp/n32/n32gxx_lxx/n32l436-evb/Kconfig | 12 + .../{ => n32gxx_lxx}/n32l436-evb/README.md | 0 .../{ => n32gxx_lxx}/n32l436-evb/SConscript | 0 .../{ => n32gxx_lxx}/n32l436-evb/SConstruct | 2 +- .../n32l436-evb/applications/SConscript | 0 .../n32l436-evb/applications/main.c | 0 .../n32l436-evb/board/Kconfig | 0 .../n32l436-evb/board/SConscript | 0 .../n32l436-evb/board/board.c | 0 .../n32l436-evb/board/board.h | 0 .../n32l436-evb/board/linker_scripts/link.icf | 0 .../n32l436-evb/board/linker_scripts/link.lds | 0 .../n32l436-evb/board/linker_scripts/link.sct | 0 .../n32l436-evb/figures/board.jpg | Bin .../{ => n32gxx_lxx}/n32l436-evb/project.ewd | 0 .../{ => n32gxx_lxx}/n32l436-evb/project.ewp | 302 +- .../{ => n32gxx_lxx}/n32l436-evb/project.eww | 0 bsp/n32/n32gxx_lxx/n32l436-evb/project.uvoptx | 1317 + .../n32l436-evb/project.uvprojx | 0 .../n32l436-evb}/rtconfig.h | 11 +- bsp/n32/n32gxx_lxx/n32l436-evb/rtconfig.py | 184 + .../{ => n32gxx_lxx}/n32l436-evb/template.ewp | 0 .../{ => n32gxx_lxx}/n32l436-evb/template.eww | 0 .../n32l436-evb/template.uvoptx | 0 .../n32l436-evb/template.uvprojx | 0 .../{ => n32gxx_lxx}/n32l43xml-stb/.config | 35 +- bsp/n32/n32gxx_lxx/n32l43xml-stb/Kconfig | 12 + .../{ => n32gxx_lxx}/n32l43xml-stb/README.md | 0 .../{ => n32gxx_lxx}/n32l43xml-stb/SConscript | 0 .../{ => n32gxx_lxx}/n32l43xml-stb/SConstruct | 2 +- .../n32l43xml-stb/applications/SConscript | 0 .../n32l43xml-stb/applications/main.c | 0 .../n32l43xml-stb/board/Kconfig | 0 .../n32l43xml-stb/board/SConscript | 0 .../n32l43xml-stb/board/board.c | 0 .../n32l43xml-stb/board/board.h | 0 .../board/linker_scripts/link.icf | 0 .../board/linker_scripts/link.lds | 0 .../board/linker_scripts/link.sct | 0 .../n32l43xml-stb/figures/board.jpg | Bin .../n32l43xml-stb/project.ewd | 0 .../n32l43xml-stb/project.ewp | 296 +- .../n32l43xml-stb/project.eww | 0 .../n32gxx_lxx/n32l43xml-stb/project.uvoptx | 1317 + .../n32l43xml-stb/project.uvprojx | 0 .../n32l43xml-stb}/rtconfig.h | 11 +- bsp/n32/n32gxx_lxx/n32l43xml-stb/rtconfig.py | 184 + .../n32l43xml-stb/template.ewp | 0 .../n32l43xml-stb/template.eww | 0 .../n32l43xml-stb/template.uvoptx | 0 .../n32l43xml-stb/template.uvprojx | 0 .../{ => n32gxx_lxx}/n32l43xrl-stb/.config | 35 +- bsp/n32/n32gxx_lxx/n32l43xrl-stb/Kconfig | 12 + .../{ => n32gxx_lxx}/n32l43xrl-stb/README.md | 0 .../{ => n32gxx_lxx}/n32l43xrl-stb/SConscript | 0 .../{ => n32gxx_lxx}/n32l43xrl-stb/SConstruct | 2 +- .../n32l43xrl-stb/applications/SConscript | 0 .../n32l43xrl-stb/applications/main.c | 0 .../n32l43xrl-stb/board/Kconfig | 0 .../n32l43xrl-stb/board/SConscript | 0 .../n32l43xrl-stb/board/board.c | 0 .../n32l43xrl-stb/board/board.h | 0 .../board/linker_scripts/link.icf | 0 .../board/linker_scripts/link.lds | 0 .../board/linker_scripts/link.sct | 0 .../n32l43xrl-stb/figures/board.jpg | Bin .../n32l43xrl-stb/project.ewd | 0 .../n32l43xrl-stb/project.ewp | 292 +- .../n32l43xrl-stb/project.eww | 0 .../n32l43xrl-stb/project.uvoptx | 0 .../n32l43xrl-stb/project.uvprojx | 267 +- .../n32l43xrl-stb}/rtconfig.h | 11 +- bsp/n32/n32gxx_lxx/n32l43xrl-stb/rtconfig.py | 184 + .../n32l43xrl-stb/template.ewp | 0 .../n32l43xrl-stb/template.eww | 0 .../n32l43xrl-stb/template.uvoptx | 0 .../n32l43xrl-stb/template.uvprojx | 0 .../{ => n32gxx_lxx}/n32wb45xl-evb/.config | 35 +- bsp/n32/n32gxx_lxx/n32wb45xl-evb/Kconfig | 12 + .../{ => n32gxx_lxx}/n32wb45xl-evb/README.md | 0 .../{ => n32gxx_lxx}/n32wb45xl-evb/SConscript | 0 .../{ => n32gxx_lxx}/n32wb45xl-evb/SConstruct | 2 +- .../n32wb45xl-evb/applications/SConscript | 0 .../n32wb45xl-evb/applications/main.c | 0 .../n32wb45xl-evb/board/Kconfig | 0 .../n32wb45xl-evb/board/SConscript | 0 .../n32wb45xl-evb/board/board.c | 0 .../n32wb45xl-evb/board/board.h | 0 .../board/linker_scripts/link.icf | 0 .../board/linker_scripts/link.lds | 0 .../board/linker_scripts/link.sct | 0 .../n32wb45xl-evb/figures/board.jpg | Bin .../n32wb45xl-evb/project.ewd | 0 .../n32wb45xl-evb/project.ewp | 294 +- .../n32wb45xl-evb/project.eww | 0 .../n32gxx_lxx/n32wb45xl-evb/project.uvoptx | 1324 + .../n32wb45xl-evb/project.uvprojx | 0 .../{ => n32gxx_lxx}/n32wb45xl-evb/rtconfig.h | 11 +- bsp/n32/n32gxx_lxx/n32wb45xl-evb/rtconfig.py | 184 + .../n32wb45xl-evb/template.ewp | 0 .../n32wb45xl-evb/template.eww | 0 .../n32wb45xl-evb/template.uvoptx | 0 .../n32wb45xl-evb/template.uvprojx | 0 bsp/n32/{ => n32gxx_lxx}/tools/sdk_dist.py | 0 bsp/n32/n32hxxx/.clang-format-ignore | 12 + bsp/n32/n32hxxx/libraries/Kconfig | 9 + .../n32hxxx/libraries/N32_Drivers/SConscript | 18 + .../libraries/N32_Drivers/drivers/Kconfig | 16 + .../libraries/N32_Drivers/drivers/SConscript | 39 + .../drivers/config/h7/adc_config.h | 96 + .../drivers/config/h7/dma_config.h | 710 + .../drivers/config/h7/i2c_hard_config.h | 512 + .../drivers/config/h7/spi_config.h | 310 + .../drivers/config/h7/uart_config.h | 832 + .../libraries/N32_Drivers/drivers/drv_adc.c | 390 + .../N32_Drivers/drivers/drv_config.h | 35 + .../libraries/N32_Drivers/drivers/drv_dma.h | 39 + .../libraries/N32_Drivers/drivers/drv_gpio.c | 628 + .../libraries/N32_Drivers/drivers/drv_gpio.h | 41 + .../N32_Drivers/drivers/drv_hard_i2c.c | 1474 + .../N32_Drivers/drivers/drv_hard_i2c.h | 96 + .../libraries/N32_Drivers/drivers/drv_log.h | 27 + .../libraries/N32_Drivers/drivers/drv_rtc.c | 434 + .../N32_Drivers/drivers/drv_soft_i2c.c | 187 + .../N32_Drivers/drivers/drv_soft_i2c.h | 77 + .../libraries/N32_Drivers/drivers/drv_spi.c | 1926 ++ .../libraries/N32_Drivers/drivers/drv_spi.h | 82 + .../libraries/N32_Drivers/drivers/drv_usart.c | 1699 + .../libraries/N32_Drivers/drivers/drv_usart.h | 79 + .../libraries/N32_Drivers/drv_common.c | 191 + .../libraries/N32_Drivers/drv_common.h | 35 + .../libraries/N32_Drivers/nano/SConscript | 15 + .../libraries/N32_Drivers/nano/drv_console.c | 182 + .../libraries/N32_Drivers/nano/drv_gpio.c | 134 + .../libraries/N32_Drivers/nano/drv_gpio.h | 38 + .../.ci/attachconfig/ci.attachconfig.yml | 10 + bsp/n32/n32hxxx/n32h760zil7-stb/.config | 1452 + bsp/n32/n32hxxx/n32h760zil7-stb/.gitignore | 42 + bsp/n32/n32hxxx/n32h760zil7-stb/Kconfig | 22 + bsp/n32/n32hxxx/n32h760zil7-stb/README_zh.md | 107 + bsp/n32/n32hxxx/n32h760zil7-stb/SConscript | 19 + bsp/n32/n32hxxx/n32h760zil7-stb/SConstruct | 54 + .../n32h760zil7-stb/applications/SConscript | 15 + .../n32h760zil7-stb/applications/main.c | 33 + .../board/Cube_Config/Cube_Config.ntfx | Bin 0 -> 4998 bytes .../Driver/CMSIS/core/cmsis_armcc.h | 894 + .../Driver/CMSIS/core/cmsis_armclang.h | 1444 + .../Driver/CMSIS/core/cmsis_armclang_ltm.h | 1891 ++ .../Driver/CMSIS/core/cmsis_compiler.h | 283 + .../Cube_Config/Driver/CMSIS/core/cmsis_gcc.h | 2168 ++ .../Driver/CMSIS/core/cmsis_iccarm.h | 964 + .../Driver/CMSIS/core/cmsis_version.h | 39 + .../Driver/CMSIS/core/core_armv81mml.h | 2968 ++ .../Driver/CMSIS/core/core_armv8mbl.h | 1921 ++ .../Driver/CMSIS/core/core_armv8mml.h | 2835 ++ .../Cube_Config/Driver/CMSIS/core/core_cm0.h | 952 + .../Driver/CMSIS/core/core_cm0plus.h | 1085 + .../Cube_Config/Driver/CMSIS/core/core_cm1.h | 979 + .../Cube_Config/Driver/CMSIS/core/core_cm23.h | 1996 ++ .../Cube_Config/Driver/CMSIS/core/core_cm3.h | 1937 ++ .../Cube_Config/Driver/CMSIS/core/core_cm33.h | 2910 ++ .../Driver/CMSIS/core/core_cm35p.h | 2910 ++ .../Cube_Config/Driver/CMSIS/core/core_cm4.h | 2124 ++ .../Cube_Config/Driver/CMSIS/core/core_cm7.h | 2725 ++ .../Driver/CMSIS/core/core_sc000.h | 1025 + .../Driver/CMSIS/core/core_sc300.h | 1912 ++ .../Cube_Config/Driver/CMSIS/core/mpu_armv7.h | 272 + .../Cube_Config/Driver/CMSIS/core/mpu_armv8.h | 346 + .../Driver/CMSIS/core/tz_context.h | 70 + .../Driver/CMSIS/device/n32h76x_78x.h | 27708 ++++++++++++++++ .../CMSIS/device/startup/startup_n32h76x.s | 892 + .../device/startup/startup_n32h76x_EWARM.s | 1529 + .../device/startup/startup_n32h78x_cm4.s | 897 + .../startup/startup_n32h78x_cm4_EWARM.s | 1543 + .../device/startup/startup_n32h78x_cm7.s | 892 + .../startup/startup_n32h78x_cm7_EWARM.s | 1535 + .../Driver/CMSIS/device/system_n32h76x_78x.c | 233 + .../Driver/CMSIS/device/system_n32h76x_78x.h | 79 + .../inc/n32h76x_78x_Common.h | 273 + .../inc/n32h76x_78x_DES.h | 131 + .../inc/n32h76x_78x_HASH.h | 216 + .../inc/n32h76x_78x_RNG.h | 112 + .../inc/n32h76x_78x_SAC_Common.h | 122 + .../inc/n32h76x_78x_SM4.h | 108 + .../inc/n32h76x_78x_aes.h | 119 + .../n32h76x_78x_periph_app/inc/mmc_host.h | 266 + .../n32h76x_78x_periph_app/inc/sd_host.h | 180 + .../n32h76x_78x_periph_app/inc/sdmmc_spec.h | 548 + .../n32h76x_78x_periph_app/src/mmc_host.c | 1272 + .../n32h76x_78x_periph_app/src/sd_host.c | 873 + .../n32h76x_78x_std_periph_driver/inc/misc.h | 292 + .../inc/n32h76x_78x_adc.h | 733 + .../inc/n32h76x_78x_comp.h | 330 + .../inc/n32h76x_78x_cordic.h | 236 + .../inc/n32h76x_78x_crc.h | 160 + .../inc/n32h76x_78x_dac.h | 346 + .../inc/n32h76x_78x_dbg.h | 161 + .../inc/n32h76x_78x_dcmu.h | 197 + .../inc/n32h76x_78x_dma.h | 448 + .../inc/n32h76x_78x_dmamux.h | 534 + .../inc/n32h76x_78x_dsi.h | 623 + .../inc/n32h76x_78x_dsmu.h | 446 + .../inc/n32h76x_78x_dvp.h | 433 + .../inc/n32h76x_78x_eccmon.h | 170 + .../inc/n32h76x_78x_eth.h | 1490 + .../inc/n32h76x_78x_exti.h | 200 + .../inc/n32h76x_78x_fdcan.h | 1718 + .../inc/n32h76x_78x_femc.h | 372 + .../inc/n32h76x_78x_fmac.h | 189 + .../inc/n32h76x_78x_gpio.h | 912 + .../inc/n32h76x_78x_i2c.h | 430 + .../inc/n32h76x_78x_i2s.h | 272 + .../inc/n32h76x_78x_iwdg.h | 108 + .../inc/n32h76x_78x_jpeg.h | 383 + .../inc/n32h76x_78x_lcdc.h | 335 + .../inc/n32h76x_78x_lptim.h | 284 + .../inc/n32h76x_78x_lpuart.h | 319 + .../inc/n32h76x_78x_mdma.h | 540 + .../inc/n32h76x_78x_mmu.h | 256 + .../inc/n32h76x_78x_otpc.h | 171 + .../inc/n32h76x_78x_pwr.h | 425 + .../inc/n32h76x_78x_rcc.h | 2542 ++ .../inc/n32h76x_78x_rtc.h | 455 + .../inc/n32h76x_78x_sdmmc.h | 851 + .../inc/n32h76x_78x_sdram.h | 233 + .../inc/n32h76x_78x_shrtim.h | 2292 ++ .../inc/n32h76x_78x_smu.h | 93 + .../inc/n32h76x_78x_spi.h | 359 + .../inc/n32h76x_78x_tim.h | 946 + .../inc/n32h76x_78x_usart.h | 366 + .../inc/n32h76x_78x_vrefbuf.h | 111 + .../inc/n32h76x_78x_wwdg.h | 107 + .../inc/n32h76x_78x_xspi.h | 505 + .../n32h76x_78x_std_periph_driver/src/misc.c | 431 + .../src/n32h76x_78x_adc.c | 2669 ++ .../src/n32h76x_78x_comp.c | 785 + .../src/n32h76x_78x_cordic.c | 392 + .../src/n32h76x_78x_crc.c | 469 + .../src/n32h76x_78x_dac.c | 1340 + .../src/n32h76x_78x_dbg.c | 276 + .../src/n32h76x_78x_dcmu.c | 314 + .../src/n32h76x_78x_dma.c | 1266 + .../src/n32h76x_78x_dmamux.c | 1899 ++ .../src/n32h76x_78x_dsi.c | 1620 + .../src/n32h76x_78x_dsmu.c | 1574 + .../src/n32h76x_78x_dvp.c | 1169 + .../src/n32h76x_78x_eccmon.c | 869 + .../src/n32h76x_78x_eth.c | 4988 +++ .../src/n32h76x_78x_exti.c | 702 + .../src/n32h76x_78x_fdcan.c | 4885 +++ .../src/n32h76x_78x_femc.c | 951 + .../src/n32h76x_78x_fmac.c | 712 + .../src/n32h76x_78x_gpio.c | 2390 ++ .../src/n32h76x_78x_i2c.c | 1733 + .../src/n32h76x_78x_i2s.c | 1159 + .../src/n32h76x_78x_iwdg.c | 193 + .../src/n32h76x_78x_jpeg.c | 1617 + .../src/n32h76x_78x_lcdc.c | 1160 + .../src/n32h76x_78x_lptim.c | 1220 + .../src/n32h76x_78x_lpuart.c | 675 + .../src/n32h76x_78x_mdma.c | 1289 + .../src/n32h76x_78x_mmu.c | 598 + .../src/n32h76x_78x_otpc.c | 555 + .../src/n32h76x_78x_pwr.c | 1580 + .../src/n32h76x_78x_rcc.c | 9078 +++++ .../src/n32h76x_78x_rtc.c | 2412 ++ .../src/n32h76x_78x_sdmmc.c | 2879 ++ .../src/n32h76x_78x_sdram.c | 694 + .../src/n32h76x_78x_shrtim.c | 10593 ++++++ .../src/n32h76x_78x_smu.c | 136 + .../src/n32h76x_78x_spi.c | 962 + .../src/n32h76x_78x_tim.c | 6437 ++++ .../src/n32h76x_78x_usart.c | 1850 ++ .../src/n32h76x_78x_vrefbuf.c | 191 + .../src/n32h76x_78x_wwdg.c | 216 + .../src/n32h76x_78x_xspi.c | 1272 + .../device/class/audio/inc/usbd_audio_core.h | 128 + .../class/audio/inc/usbd_audio_out_if.h | 87 + .../device/class/audio/src/usbd_audio_core.c | 548 + .../class/audio/src/usbd_audio_out_if.c | 247 + .../device/class/cdc/inc/usbd_cdc_core.h | 97 + .../class/cdc/inc/usbd_cdc_core_loopback.h | 80 + .../device/class/cdc/src/usbd_cdc_core.c | 695 + .../class/cdc/src/usbd_cdc_core_loopback.c | 511 + .../class/customhid/inc/usbd_customhid_core.h | 97 + .../class/customhid/src/usbd_customhid_core.c | 584 + .../inc/usbd_hid_cdc_composite.h | 63 + .../src/usbd_hid_cdc_composite.c | 402 + .../hid_keyboard/inc/usbd_keyboard_core.h | 79 + .../hid_keyboard/src/usbd_keyboard_core.c | 351 + .../hid_msc_composite/inc/usbd_msc_hid_core.h | 63 + .../hid_msc_composite/src/usbd_msc_hid_core.c | 338 + .../device/class/mouse/inc/usbd_mouse_core.h | 120 + .../device/class/mouse/src/usbd_mouse_core.c | 355 + .../device/class/msc/inc/usbd_msc_bot.h | 127 + .../device/class/msc/inc/usbd_msc_core.h | 70 + .../device/class/msc/inc/usbd_msc_data.h | 73 + .../device/class/msc/inc/usbd_msc_scsi.h | 157 + .../device/class/msc/src/usbd_msc_bot.c | 311 + .../device/class/msc/src/usbd_msc_core.c | 389 + .../device/class/msc/src/usbd_msc_data.c | 90 + .../device/class/msc/src/usbd_msc_scsi.c | 616 + .../inc/usbd_msc_cdc_composite.h | 63 + .../src/usbd_msc_cdc_composite.c | 385 + .../device/class/printer/inc/usbd_printer.h | 90 + .../device/class/printer/src/usbd_printer.c | 400 + .../device/core/inc/usbd_core.h | 78 + .../device/core/inc/usbd_def.h | 124 + .../device/core/inc/usbd_ioreq.h | 78 + .../device/core/inc/usbd_req.h | 73 + .../device/core/src/usbd_core.c | 441 + .../device/core/src/usbd_ioreq.c | 175 + .../device/core/src/usbd_req.c | 758 + .../driver/inc/usbhs_core.h | 344 + .../driver/inc/usbhs_dcd.h | 100 + .../driver/inc/usbhs_dcd_int.h | 84 + .../driver/inc/usbhs_defines.h | 174 + .../driver/inc/usbhs_hcd.h | 75 + .../driver/inc/usbhs_hcd_int.h | 78 + .../driver/inc/usbhs_regs.h | 107 + .../driver/src/usbhs_core.c | 2063 ++ .../driver/src/usbhs_dcd.c | 434 + .../driver/src/usbhs_dcd_int.c | 1002 + .../driver/src/usbhs_hcd.c | 220 + .../driver/src/usbhs_hcd_int.c | 787 + .../host/class/CDC/inc/usbh_cdc_core.h | 164 + .../host/class/CDC/inc/usbh_cdc_funct.h | 294 + .../host/class/CDC/src/usbh_cdc_core.c | 568 + .../host/class/CDC/src/usbh_cdc_funct.c | 151 + .../host/class/HID/inc/usbh_hid_core.h | 212 + .../host/class/HID/inc/usbh_hid_keyboard.h | 81 + .../host/class/HID/inc/usbh_hid_mouse.h | 129 + .../host/class/HID/src/usbh_hid_core.c | 559 + .../host/class/HID/src/usbh_hid_keyboard.c | 291 + .../host/class/HID/src/usbh_hid_mouse.c | 106 + .../host/class/MSC/inc/usbh_msc_bot.h | 236 + .../host/class/MSC/inc/usbh_msc_core.h | 155 + .../host/class/MSC/inc/usbh_msc_scsi.h | 174 + .../host/class/MSC/src/usbh_msc_bot.c | 618 + .../host/class/MSC/src/usbh_msc_core.c | 458 + .../host/class/MSC/src/usbh_msc_fatfs.c | 235 + .../host/class/MSC/src/usbh_msc_scsi.c | 593 + .../host/core/inc/usbh_core.h | 250 + .../host/core/inc/usbh_def.h | 285 + .../host/core/inc/usbh_hcs.h | 80 + .../host/core/inc/usbh_ioreq.h | 85 + .../host/core/inc/usbh_stdreq.h | 96 + .../host/core/src/usbh_core.c | 825 + .../host/core/src/usbh_hcs.c | 200 + .../host/core/src/usbh_ioreq.c | 377 + .../host/core/src/usbh_stdreq.c | 512 + .../Cube_Config/MDK-ARM/Cube_Config.uvoptx} | 20 +- .../Cube_Config/MDK-ARM/Cube_Config.uvprojx | 482 + .../Cube_Config/MDK-ARM/Cube_Config_CM7.sct | 26 + .../Nationstech.N32H76x_DFP.1.1.0.pack | Bin 0 -> 213082 bytes .../board/Cube_Config/SaveProjects.dat | 1 + .../board/Cube_Config/USER/inc/main.h | 26 + .../Cube_Config/USER/inc/n32h76x_78x_cfg.h | 40 + .../Cube_Config/USER/inc/n32h76x_78x_it.h | 22 + .../board/Cube_Config/USER/src/main.c | 35 + .../Cube_Config/USER/src/n32h76x_78x_cfg.c | 233 + .../Cube_Config/USER/src/n32h76x_78x_it.c | 100 + .../board/Cube_Config/data/Clock.dat | 1 + .../board/Cube_Config/data/ConfigModList.dat | 1 + .../board/Cube_Config/data/DMAStates.dat | 1 + .../Cube_Config/data/LastLoadProject.dat | 1 + .../board/Cube_Config/data/NVIC_M4.dat | 1 + .../board/Cube_Config/data/NVIC_M7.dat | 1 + .../board/Cube_Config/data/PinStates.dat | 1 + .../board/Cube_Config/data/SYS.dat | 1 + .../board/Cube_Config/data/USART1.dat | 1 + .../Cube_Config/startup/startup_n32h73x_76x.s | 892 + .../startup/startup_n32h73x_76x_EWARM.s | 1529 + .../startup/startup_n32h73x_76x_gcc.s | 1099 + .../startup/startup_n32h76x_ITCM_gcc.s | 1126 + .../Cube_Config/startup/startup_n32h78x_cm4.s | 897 + .../startup/startup_n32h78x_cm4_EWARM.s | 1543 + .../startup/startup_n32h78x_cm4_gcc.s | 1117 + .../Cube_Config/startup/startup_n32h78x_cm7.s | 892 + .../startup/startup_n32h78x_cm7_EWARM.s | 1535 + .../startup/startup_n32h78x_cm7_gcc.s | 1108 + ...2\347\232\204\347\202\271\346\210\221.txt" | 4 + bsp/n32/n32hxxx/n32h760zil7-stb/board/Kconfig | 165 + .../n32hxxx/n32h760zil7-stb/board/SConscript | 93 + bsp/n32/n32hxxx/n32h760zil7-stb/board/board.c | 36 + bsp/n32/n32hxxx/n32h760zil7-stb/board/board.h | 55 + .../board/linker_scripts/link.icf | 63 + .../board/linker_scripts/link.lds | 157 + .../board/linker_scripts/link.sct | 25 + .../n32hxxx/n32h760zil7-stb/figures/board.jpg | Bin 0 -> 3188413 bytes .../n32hxxx/n32h760zil7-stb/project.uvoptx | 1064 + .../n32hxxx/n32h760zil7-stb/project.uvprojx | 2150 ++ bsp/n32/n32hxxx/n32h760zil7-stb/rtconfig.h | 424 + bsp/n32/n32hxxx/n32h760zil7-stb/rtconfig.py | 185 + .../n32h760zil7-stb/template.uvoptx} | 21 +- .../n32hxxx/n32h760zil7-stb/template.uvprojx | 391 + bsp/n32/n32hxxx/tools/sdk_dist.py | 23 + bsp/n32/n32l40xcl-stb/Kconfig | 12 - bsp/n32/n32l40xcl-stb/project.uvoptx | 185 - bsp/n32/n32l40xcl-stb/rtconfig.py | 184 - bsp/n32/n32l436-evb/Kconfig | 12 - bsp/n32/n32l436-evb/project.uvoptx | 185 - bsp/n32/n32l436-evb/rtconfig.py | 184 - bsp/n32/n32l43xml-stb/Kconfig | 12 - bsp/n32/n32l43xml-stb/project.uvoptx | 185 - bsp/n32/n32l43xml-stb/rtconfig.py | 184 - bsp/n32/n32l43xrl-stb/Kconfig | 12 - bsp/n32/n32l43xrl-stb/rtconfig.py | 184 - bsp/n32/n32wb45xl-evb/Kconfig | 12 - bsp/n32/n32wb45xl-evb/project.uvoptx | 180 - bsp/n32/n32wb45xl-evb/rtconfig.py | 184 - 1308 files changed, 248658 insertions(+), 7504 deletions(-) delete mode 100644 bsp/n32/n32g45xcl-stb/project.uvoptx delete mode 100644 bsp/n32/n32g45xml-stb/project.uvoptx delete mode 100644 bsp/n32/n32g45xrl-stb/Kconfig delete mode 100644 bsp/n32/n32g45xrl-stb/project.uvoptx delete mode 100644 bsp/n32/n32g45xrl-stb/rtconfig.py delete mode 100644 bsp/n32/n32g45xvl-stb/Kconfig delete mode 100644 bsp/n32/n32g45xvl-stb/project.uvoptx delete mode 100644 bsp/n32/n32g45xvl-stb/rtconfig.py delete mode 100644 bsp/n32/n32g4frml-stb/Kconfig delete mode 100644 bsp/n32/n32g4frml-stb/project.ewp delete mode 100644 bsp/n32/n32g4frml-stb/rtconfig.py rename bsp/n32/{ => n32gxx_lxx}/.clang-format-ignore (55%) rename bsp/n32/{ => n32gxx_lxx}/libraries/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_common_tables.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_const_structs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_math.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_armcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_armclang.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_compiler.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_gcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_iccarm.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_version.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/core/core_cm4.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/core/mpu_armv7.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x_conf.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x_flash.ld (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x_EWARM.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x_gcc.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/device/system_n32g43x.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/CMSIS/device/system_n32g43x.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_aes.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_algo_common.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_des.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_hash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_rng.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/misc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_adc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_can.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_comp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_crc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dac.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dbg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dma.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_exti.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_flash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_gpio.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_i2c.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_iwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_lptim.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_lpuart.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_opamp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_pwr.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_rcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_rtc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_spi.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_tim.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_tsc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_usart.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_wwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/misc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_adc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_can.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_comp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_crc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dac.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dbg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dma.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_exti.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_flash.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_gpio.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_i2c.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_iwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_lptim.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_lpuart.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_opamp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_pwr.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_rcc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_rtc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_spi.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_tim.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_tsc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_usart.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_wwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_core.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_def.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_init.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_lib.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_mem.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_regs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_sil.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_type.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_core.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_init.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_int.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_mem.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_regs.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_sil.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_common_tables.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_const_structs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_math.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_armcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_armclang.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_compiler.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_gcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_iccarm.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_version.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/core/core_cm4.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/core/mpu_armv7.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x_conf.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x_flash.ld (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x_EWARM.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x_gcc.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/device/system_n32g45x.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/CMSIS/device/system_n32g45x.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_aes.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_algo_common.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_des.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_hash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_rng.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/misc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_adc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_bkp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_can.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_comp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_crc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dac.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dbg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dma.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dvp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_eth.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_exti.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_flash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_gpio.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_i2c.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_iwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_opamp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_pwr.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_qspi.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_rcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_rtc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_sdio.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_spi.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_tim.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_tsc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_usart.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_wwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32xx_tsc_alg_api.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/misc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_adc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_bkp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_can.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_comp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_crc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dac.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dbg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dma.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dvp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_eth.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_exti.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_flash.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_gpio.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_i2c.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_iwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_opamp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_pwr.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_qspi.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_rcc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_rtc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_sdio.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_spi.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_tim.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_tsc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_usart.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_wwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_core.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_def.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_init.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_lib.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_mem.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_regs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_sil.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_type.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_core.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_init.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_int.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_mem.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_regs.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_sil.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_common_tables.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_const_structs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_math.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_armcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_armclang.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_compiler.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_gcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_iccarm.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_version.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/core/core_cm4.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/core/mpu_armv7.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr_conf.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr_flash.ld (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr_EWARM.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr_gcc.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/device/system_n32g4fr.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/CMSIS/device/system_n32g4fr.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_aes.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_algo_common.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_des.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_hash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_rng.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/misc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_adc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_bkp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_can.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_crc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dac.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dbg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dma.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dvp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_exti.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_flash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_gpio.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_i2c.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_iwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_pwr.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_qspi.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_rcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_rtc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_sdio.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_spi.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_tim.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_tsc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_usart.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_wwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32xx_tsc_alg_api.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/misc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_adc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_bkp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_can.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_crc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dac.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dbg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dma.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dvp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_exti.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_flash.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_gpio.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_i2c.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_iwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_pwr.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_qspi.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_rcc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_rtc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_sdio.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_spi.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_tim.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_tsc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_usart.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_wwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_core.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_def.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_init.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_lib.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_mem.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_regs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_sil.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_type.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_core.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_init.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_int.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_mem.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_regs.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_sil.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_common_tables.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_const_structs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_math.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_armcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_armclang.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_compiler.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_gcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_iccarm.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_version.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/core/core_cm4.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/core/mpu_armv7.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x_conf.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x_flash.ld (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x_EWARM.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x_gcc.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/device/system_n32l40x.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/CMSIS/device/system_n32l40x.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_aes.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_algo_common.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_des.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_hash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_rng.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/misc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_adc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_can.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_comp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_crc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dac.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dbg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dma.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_exti.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_flash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_gpio.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_i2c.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_iwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lcd.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lptim.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lpuart.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_opamp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_pwr.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_rcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_rtc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_spi.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_tim.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_tsc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_usart.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_wwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/misc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_adc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_can.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_comp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_crc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dac.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dbg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dma.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_exti.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_flash.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_gpio.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_i2c.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_iwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lcd.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lptim.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lpuart.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_opamp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_pwr.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_rcc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_rtc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_spi.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_tim.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_tsc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_usart.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_wwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_core.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_def.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_init.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_lib.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_mem.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_regs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_sil.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_type.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_core.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_init.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_int.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_mem.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_regs.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_sil.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_common_tables.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_const_structs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_math.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_armcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_armclang.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_compiler.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_gcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_iccarm.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_version.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/core/core_cm4.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/core/mpu_armv7.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x_conf.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x_flash.ld (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x_EWARM.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x_gcc.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/device/system_n32l43x.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/CMSIS/device/system_n32l43x.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_aes.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_algo_common.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_des.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_hash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_rng.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/misc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_adc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_can.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_comp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_crc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dac.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dbg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dma.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_exti.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_flash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_gpio.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_i2c.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_iwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lcd.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lprcnt.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lptim.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lpuart.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_opamp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_pwr.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_rcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_rtc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_spi.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_tim.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_tsc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_usart.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_wwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/misc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_adc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_can.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_comp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_crc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dac.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dbg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dma.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_exti.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_flash.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_gpio.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_i2c.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_iwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lcd.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lprcnt.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lptim.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lpuart.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_opamp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_pwr.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_rcc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_rtc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_spi.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_tim.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_tsc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_usart.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_wwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_core.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_def.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_init.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_lib.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_mem.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_regs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_sil.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_type.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_core.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_init.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_int.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_mem.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_regs.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_sil.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_common_tables.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_const_structs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_math.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_armcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_armclang.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_compiler.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_gcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_iccarm.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_version.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/core/core_cm4.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/core/mpu_armv7.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452_conf.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452_flash.ld (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452_EWARM.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452_gcc.s (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/device/system_n32wb452.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/CMSIS/device/system_n32wb452.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_aes.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_algo_common.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_des.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_hash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_rng.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/att.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attm.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attm_db.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/atts.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ble_arch.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_bt.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_bt_defines.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_endian.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_error.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_hci.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_list.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_llcp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_lmp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_math.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_utils.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_version.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gap.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_sig.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_task.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_task.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_util.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gatt.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc_task.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm_task.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/h4tl.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/hci.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/hci_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_config.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_env.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_event.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_mem.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_msg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_queue.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_task.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_timer.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_lecb.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_pdu.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_pdu_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_sig.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_task.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cm.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cm_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/nvds.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf_types.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf_utils.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwapp_config.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_config.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl_config.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl_error.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip_config.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip_task.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwprf_config.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smp_common.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_api.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_crypto.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_util.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpm_api.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/n32wb452_ble_api.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/n32wb452_ble_api.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_debug.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_flash.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_timer.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Interface.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_debug.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_flash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_iom.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_spi.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_timer.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_uart.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Interface.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Ramcode.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/ble_monitor.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_batt.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_sec.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_task.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_user.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/bass.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/bass_task.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_batt.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_sec.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_task.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_user.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/bass.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/bass_task.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/rwapp_config.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/user.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/user_task.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/prf.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/prf_utils.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/user.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/user_task.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/misc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_adc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_bkp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_can.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_crc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dac.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dbg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dma.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dvp.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_exti.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_flash.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_gpio.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_i2c.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_iwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_pwr.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_rcc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_rtc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_sdio.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_spi.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_tim.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_tsc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_usart.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_wwdg.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32xx_tsc_alg_api.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/misc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_adc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_bkp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_can.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_crc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dac.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dbg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dma.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dvp.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_exti.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_flash.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_gpio.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_i2c.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_iwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_pwr.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_rcc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_rtc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_sdio.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_spi.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_tim.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_tsc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_usart.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_wwdg.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_core.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_def.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_init.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_int.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_lib.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_mem.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_regs.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_sil.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_type.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_core.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_init.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_int.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_mem.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_regs.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_sil.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_adc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_adc.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_can.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_can.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_dac.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_dac.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_gpio.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_gpio.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_i2c.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_i2c.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_rtc.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_spi.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_spi.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_timer.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_timer.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_usart.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_usart.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_usart_v2.c (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_usart_v2.h (100%) rename bsp/n32/{ => n32gxx_lxx}/libraries/n32_drivers/drv_wdt.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/.config (97%) rename bsp/n32/{n32g45xml-stb => n32gxx_lxx/n32g43xcl-stb}/Kconfig (88%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/figures/board.jpg (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/project.ewd (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/project.ewp (86%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/project.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/project.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/project.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/rtconfig.h (98%) rename bsp/n32/{n32g457qel-stb => n32gxx_lxx/n32g43xcl-stb}/rtconfig.py (97%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/template.ewp (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g43xcl-stb/template.uvprojx (100%) rename bsp/n32/{n32g45xrl-stb => n32gxx_lxx/n32g457qel-stb}/.config (97%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/Kconfig (88%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/SConscript (100%) rename bsp/n32/{n32g45xcl-stb => n32gxx_lxx/n32g457qel-stb}/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/figures/board.jpg (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/project.ewd (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/project.ewp (86%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/project.eww (100%) create mode 100644 bsp/n32/n32gxx_lxx/n32g457qel-stb/project.uvoptx rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/project.uvprojx (100%) rename bsp/n32/{n32g45xrl-stb => n32gxx_lxx/n32g457qel-stb}/rtconfig.h (98%) rename bsp/n32/{n32g43xcl-stb => n32gxx_lxx/n32g457qel-stb}/rtconfig.py (97%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/template.ewp (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g457qel-stb/template.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/.config (97%) rename bsp/n32/{n32g43xcl-stb => n32gxx_lxx/n32g45xcl-stb}/Kconfig (88%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/SConscript (100%) rename bsp/n32/{n32g457qel-stb => n32gxx_lxx/n32g45xcl-stb}/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/figures/board.png (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/project.ewd (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/project.ewp (86%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/project.eww (100%) create mode 100644 bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.uvoptx rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/project.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/rtconfig.h (98%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/rtconfig.py (97%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/template.ewp (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xcl-stb/template.uvprojx (100%) rename bsp/n32/{n32g457qel-stb => n32gxx_lxx/n32g45xml-stb}/.config (97%) rename bsp/n32/{n32g45xcl-stb => n32gxx_lxx/n32g45xml-stb}/Kconfig (88%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/figures/board.png (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/project.ewd (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/project.ewp (86%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/project.eww (100%) create mode 100644 bsp/n32/n32gxx_lxx/n32g45xml-stb/project.uvoptx rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/project.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/rtconfig.h (98%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/rtconfig.py (97%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/template.ewp (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xml-stb/template.uvprojx (100%) rename bsp/n32/{n32g45xml-stb => n32gxx_lxx/n32g45xrl-stb}/.config (97%) create mode 100644 bsp/n32/n32gxx_lxx/n32g45xrl-stb/Kconfig rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/figures/board.jpg (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/project.ewd (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/project.ewp (86%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/project.eww (100%) create mode 100644 bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.uvoptx rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/project.uvprojx (100%) rename bsp/n32/{n32g457qel-stb => n32gxx_lxx/n32g45xrl-stb}/rtconfig.h (98%) create mode 100644 bsp/n32/n32gxx_lxx/n32g45xrl-stb/rtconfig.py rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/template.ewp (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xrl-stb/template.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/.ci/attachconfig/ci.attachconfig.yml (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/.config (97%) create mode 100644 bsp/n32/n32gxx_lxx/n32g45xvl-stb/Kconfig rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/figures/board.jpg (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/project.ewd (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/project.ewp (86%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/project.eww (100%) create mode 100644 bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.uvoptx rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/project.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/rtconfig.h (98%) create mode 100644 bsp/n32/n32gxx_lxx/n32g45xvl-stb/rtconfig.py rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/template.ewp (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g45xvl-stb/template.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/.config (97%) create mode 100644 bsp/n32/n32gxx_lxx/n32g4frml-stb/Kconfig rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/figures/board.png (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/project.ewd (100%) create mode 100644 bsp/n32/n32gxx_lxx/n32g4frml-stb/project.ewp rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/project.eww (100%) create mode 100644 bsp/n32/n32gxx_lxx/n32g4frml-stb/project.uvoptx rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/project.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/rtconfig.h (98%) create mode 100644 bsp/n32/n32gxx_lxx/n32g4frml-stb/rtconfig.py rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/template.ewp (92%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32g4frml-stb/template.uvprojx (98%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/.config (97%) create mode 100644 bsp/n32/n32gxx_lxx/n32l40xcl-stb/Kconfig rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/figures/board.jpg (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/project.ewd (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/project.ewp (86%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/project.eww (100%) create mode 100644 bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.uvoptx rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/project.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/rtconfig.h (98%) create mode 100644 bsp/n32/n32gxx_lxx/n32l40xcl-stb/rtconfig.py rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/template.ewp (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l40xcl-stb/template.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/.config (97%) create mode 100644 bsp/n32/n32gxx_lxx/n32l436-evb/Kconfig rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/figures/board.jpg (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/project.ewd (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/project.ewp (86%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/project.eww (100%) create mode 100644 bsp/n32/n32gxx_lxx/n32l436-evb/project.uvoptx rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/project.uvprojx (100%) rename bsp/n32/{n32l43xrl-stb => n32gxx_lxx/n32l436-evb}/rtconfig.h (98%) create mode 100644 bsp/n32/n32gxx_lxx/n32l436-evb/rtconfig.py rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/template.ewp (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l436-evb/template.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/.config (97%) create mode 100644 bsp/n32/n32gxx_lxx/n32l43xml-stb/Kconfig rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/figures/board.jpg (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/project.ewd (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/project.ewp (86%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/project.eww (100%) create mode 100644 bsp/n32/n32gxx_lxx/n32l43xml-stb/project.uvoptx rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/project.uvprojx (100%) rename bsp/n32/{n32l436-evb => n32gxx_lxx/n32l43xml-stb}/rtconfig.h (98%) create mode 100644 bsp/n32/n32gxx_lxx/n32l43xml-stb/rtconfig.py rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/template.ewp (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xml-stb/template.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/.config (97%) create mode 100644 bsp/n32/n32gxx_lxx/n32l43xrl-stb/Kconfig rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/figures/board.jpg (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/project.ewd (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/project.ewp (86%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/project.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/project.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/project.uvprojx (89%) rename bsp/n32/{n32l43xml-stb => n32gxx_lxx/n32l43xrl-stb}/rtconfig.h (98%) create mode 100644 bsp/n32/n32gxx_lxx/n32l43xrl-stb/rtconfig.py rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/template.ewp (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32l43xrl-stb/template.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/.config (97%) create mode 100644 bsp/n32/n32gxx_lxx/n32wb45xl-evb/Kconfig rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/README.md (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/SConstruct (96%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/applications/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/applications/main.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/board/Kconfig (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/board/SConscript (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/board/board.c (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/board/board.h (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/board/linker_scripts/link.icf (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/board/linker_scripts/link.lds (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/board/linker_scripts/link.sct (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/figures/board.jpg (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/project.ewd (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/project.ewp (86%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/project.eww (100%) create mode 100644 bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.uvoptx rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/project.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/rtconfig.h (98%) create mode 100644 bsp/n32/n32gxx_lxx/n32wb45xl-evb/rtconfig.py rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/template.ewp (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/template.eww (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/template.uvoptx (100%) rename bsp/n32/{ => n32gxx_lxx}/n32wb45xl-evb/template.uvprojx (100%) rename bsp/n32/{ => n32gxx_lxx}/tools/sdk_dist.py (100%) create mode 100644 bsp/n32/n32hxxx/.clang-format-ignore create mode 100644 bsp/n32/n32hxxx/libraries/Kconfig create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/SConscript create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/Kconfig create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/SConscript create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/adc_config.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/dma_config.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/i2c_hard_config.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/spi_config.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/uart_config.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_adc.c create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_config.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_dma.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_gpio.c create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_gpio.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_hard_i2c.c create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_hard_i2c.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_log.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_rtc.c create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_soft_i2c.c create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_soft_i2c.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_spi.c create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_spi.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_usart.c create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_usart.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drv_common.c create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/drv_common.h create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/nano/SConscript create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_console.c create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_gpio.c create mode 100644 bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_gpio.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/.ci/attachconfig/ci.attachconfig.yml create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/.config create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/.gitignore create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/Kconfig create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/README_zh.md create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/SConscript create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/SConstruct create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/applications/SConscript create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/applications/main.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Cube_Config.ntfx create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_armcc.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_armclang.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_armclang_ltm.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_compiler.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_gcc.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_iccarm.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_version.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv81mml.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv8mbl.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv8mml.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm0.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm0plus.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm1.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm23.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm3.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm33.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm35p.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm4.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm7.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_sc000.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_sc300.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/mpu_armv7.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/mpu_armv8.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/tz_context.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/n32h76x_78x.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h76x.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h76x_EWARM.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm4.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm4_EWARM.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm7.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm7_EWARM.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/system_n32h76x_78x.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/system_n32h76x_78x.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_Common.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_DES.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_HASH.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_RNG.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_SAC_Common.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_SM4.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_aes.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/mmc_host.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/sd_host.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/sdmmc_spec.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/src/mmc_host.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/src/sd_host.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/misc.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_adc.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_comp.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_cordic.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_crc.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dac.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dbg.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dcmu.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dma.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dmamux.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dsi.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dsmu.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dvp.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_eccmon.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_eth.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_exti.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_fdcan.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_femc.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_fmac.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_gpio.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_i2c.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_i2s.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_iwdg.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_jpeg.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lcdc.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lptim.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lpuart.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_mdma.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_mmu.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_otpc.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_pwr.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_rcc.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_rtc.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_sdmmc.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_sdram.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_shrtim.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_smu.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_spi.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_tim.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_usart.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_vrefbuf.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_wwdg.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_xspi.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/misc.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_adc.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_comp.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_cordic.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_crc.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dac.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dbg.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dcmu.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dma.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dmamux.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dsi.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dsmu.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dvp.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_eccmon.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_eth.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_exti.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_fdcan.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_femc.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_fmac.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_gpio.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_i2c.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_i2s.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_iwdg.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_jpeg.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lcdc.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lptim.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lpuart.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_mdma.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_mmu.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_otpc.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_pwr.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_rcc.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_rtc.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_sdmmc.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_sdram.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_shrtim.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_smu.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_spi.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_tim.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_usart.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_vrefbuf.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_wwdg.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_xspi.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/inc/usbd_audio_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/inc/usbd_audio_out_if.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/src/usbd_audio_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/src/usbd_audio_out_if.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/inc/usbd_cdc_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/inc/usbd_cdc_core_loopback.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/src/usbd_cdc_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/src/usbd_cdc_core_loopback.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/customhid/inc/usbd_customhid_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/customhid/src/usbd_customhid_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_cdc_composite/inc/usbd_hid_cdc_composite.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_cdc_composite/src/usbd_hid_cdc_composite.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_keyboard/inc/usbd_keyboard_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_keyboard/src/usbd_keyboard_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_msc_composite/inc/usbd_msc_hid_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_msc_composite/src/usbd_msc_hid_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/mouse/inc/usbd_mouse_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/mouse/src/usbd_mouse_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_bot.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_data.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_scsi.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_bot.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_data.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_scsi.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc_cdc_composite/inc/usbd_msc_cdc_composite.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc_cdc_composite/src/usbd_msc_cdc_composite.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/printer/inc/usbd_printer.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/printer/src/usbd_printer.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_def.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_ioreq.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_req.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_ioreq.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_req.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_dcd.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_dcd_int.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_defines.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_hcd.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_hcd_int.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_regs.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_dcd.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_dcd_int.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_hcd.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_hcd_int.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/inc/usbh_cdc_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/inc/usbh_cdc_funct.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/src/usbh_cdc_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/src/usbh_cdc_funct.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_keyboard.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_mouse.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_keyboard.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_mouse.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_bot.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_scsi.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_bot.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_fatfs.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_scsi.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_core.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_def.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_hcs.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_ioreq.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_stdreq.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_core.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_hcs.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_ioreq.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_stdreq.c rename bsp/n32/{n32g457qel-stb/project.uvoptx => n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config.uvoptx} (91%) create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config.uvprojx create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config_CM7.sct create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Nationstech.N32H76x_DFP.1.1.0.pack create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/SaveProjects.dat create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/main.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/n32h76x_78x_cfg.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/n32h76x_78x_it.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/main.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/n32h76x_78x_cfg.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/n32h76x_78x_it.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/Clock.dat create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/ConfigModList.dat create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/DMAStates.dat create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/LastLoadProject.dat create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/NVIC_M4.dat create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/NVIC_M7.dat create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/PinStates.dat create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/SYS.dat create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/USART1.dat create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x_EWARM.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x_gcc.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h76x_ITCM_gcc.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4_EWARM.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4_gcc.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7_EWARM.s create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7_gcc.s create mode 100644 "bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/\346\226\260\347\211\210keil_pack\345\214\205\350\243\205\344\270\215\344\270\212\347\232\204\347\202\271\346\210\221.txt" create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/Kconfig create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/SConscript create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/board.c create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/board.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.icf create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.lds create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.sct create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/figures/board.jpg create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/project.uvoptx create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/project.uvprojx create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/rtconfig.h create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/rtconfig.py rename bsp/n32/{n32g4frml-stb/project.uvoptx => n32hxxx/n32h760zil7-stb/template.uvoptx} (89%) create mode 100644 bsp/n32/n32hxxx/n32h760zil7-stb/template.uvprojx create mode 100644 bsp/n32/n32hxxx/tools/sdk_dist.py delete mode 100644 bsp/n32/n32l40xcl-stb/Kconfig delete mode 100644 bsp/n32/n32l40xcl-stb/project.uvoptx delete mode 100644 bsp/n32/n32l40xcl-stb/rtconfig.py delete mode 100644 bsp/n32/n32l436-evb/Kconfig delete mode 100644 bsp/n32/n32l436-evb/project.uvoptx delete mode 100644 bsp/n32/n32l436-evb/rtconfig.py delete mode 100644 bsp/n32/n32l43xml-stb/Kconfig delete mode 100644 bsp/n32/n32l43xml-stb/project.uvoptx delete mode 100644 bsp/n32/n32l43xml-stb/rtconfig.py delete mode 100644 bsp/n32/n32l43xrl-stb/Kconfig delete mode 100644 bsp/n32/n32l43xrl-stb/rtconfig.py delete mode 100644 bsp/n32/n32wb45xl-evb/Kconfig delete mode 100644 bsp/n32/n32wb45xl-evb/project.uvoptx delete mode 100644 bsp/n32/n32wb45xl-evb/rtconfig.py diff --git a/.github/ALL_BSP_COMPILE.json b/.github/ALL_BSP_COMPILE.json index 6d503086dd..de94d69ffb 100644 --- a/.github/ALL_BSP_COMPILE.json +++ b/.github/ALL_BSP_COMPILE.json @@ -316,18 +316,19 @@ "gd32/arm/gd32e503v-eval", "gd32/arm/gd32527I-eval", "gd32/arm/gd32e230-lckfb", - "n32/n32g43xcl-stb", - "n32/n32g45xcl-stb", - "n32/n32g45xml-stb", - "n32/n32g45xrl-stb", - "n32/n32g45xvl-stb", - "n32/n32g457qel-stb", - "n32/n32g4frml-stb", - "n32/n32l40xcl-stb", - "n32/n32l43xml-stb", - "n32/n32l43xrl-stb", - "n32/n32l436-evb", - "n32/n32wb45xl-evb", + "n32/n32gxx_lxx/n32g43xcl-stb", + "n32/n32gxx_lxx/n32g45xcl-stb", + "n32/n32gxx_lxx/n32g45xml-stb", + "n32/n32gxx_lxx/n32g45xrl-stb", + "n32/n32gxx_lxx/n32g45xvl-stb", + "n32/n32gxx_lxx/n32g457qel-stb", + "n32/n32gxx_lxx/n32g4frml-stb", + "n32/n32gxx_lxx/n32l40xcl-stb", + "n32/n32gxx_lxx/n32l43xml-stb", + "n32/n32gxx_lxx/n32l43xrl-stb", + "n32/n32gxx_lxx/n32l436-evb", + "n32/n32gxx_lxx/n32wb45xl-evb", + "n32/n32hxxx/n32h760zil7-stb", "apm32/apm32f103xe-minibroard", "apm32/apm32f407ig-minibroard", "apm32/apm32f407zg-evalboard", diff --git a/bsp/n32/n32g45xcl-stb/project.uvoptx b/bsp/n32/n32g45xcl-stb/project.uvoptx deleted file mode 100644 index d3d314c823..0000000000 --- a/bsp/n32/n32g45xcl-stb/project.uvoptx +++ /dev/null @@ -1,185 +0,0 @@ - - - - 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\ - - - 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 - 3 - - - - - - - - - - - BIN\CMSIS_AGDI.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL040000 -FS08000000 -FP0($$Device:N32G455CCL7$Flash\N32G45x.FLM) - - - 0 - CMSIS_AGDI - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL040000 -FS08000000 -FP0($$Device:N32G455CCL7$Flash\N32G45x.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 - - - - - - - - - - - - - ::CMSIS - 0 - 0 - 0 - 1 - - -
diff --git a/bsp/n32/n32g45xml-stb/project.uvoptx b/bsp/n32/n32g45xml-stb/project.uvoptx deleted file mode 100644 index c992fb01f0..0000000000 --- a/bsp/n32/n32g45xml-stb/project.uvoptx +++ /dev/null @@ -1,185 +0,0 @@ - - - - 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\ - - - 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 - 3 - - - - - - - - - - - BIN\CMSIS_AGDI.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457MEL7$Flash\N32G45x.FLM) - - - 0 - CMSIS_AGDI - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457MEL7$Flash\N32G45x.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 - - - - - - - - - - - - - ::CMSIS - 0 - 0 - 0 - 1 - - -
diff --git a/bsp/n32/n32g45xrl-stb/Kconfig b/bsp/n32/n32g45xrl-stb/Kconfig deleted file mode 100644 index 73238d3a13..0000000000 --- a/bsp/n32/n32g45xrl-stb/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -mainmenu "RT-Thread Configuration" - -BSP_DIR := . - -RTT_DIR := ../../.. - -PKGS_DIR := packages - -source "$(RTT_DIR)/Kconfig" -osource "$PKGS_DIR/Kconfig" -rsource "../libraries/Kconfig" -rsource "board/Kconfig" diff --git a/bsp/n32/n32g45xrl-stb/project.uvoptx b/bsp/n32/n32g45xrl-stb/project.uvoptx deleted file mode 100644 index ebb33b1f75..0000000000 --- a/bsp/n32/n32g45xrl-stb/project.uvoptx +++ /dev/null @@ -1,185 +0,0 @@ - - - - 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\ - - - 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 - 3 - - - - - - - - - - - BIN\CMSIS_AGDI.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457REL7$Flash\N32G45x.FLM) - - - 0 - CMSIS_AGDI - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457REL7$Flash\N32G45x.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 - - - - - - - - - - - - - ::CMSIS - 0 - 0 - 0 - 1 - - -
diff --git a/bsp/n32/n32g45xrl-stb/rtconfig.py b/bsp/n32/n32g45xrl-stb/rtconfig.py deleted file mode 100644 index 2a0371110c..0000000000 --- a/bsp/n32/n32g45xrl-stb/rtconfig.py +++ /dev/null @@ -1,184 +0,0 @@ -import os - -# toolchains options -ARCH='arm' -CPU='cortex-m4' -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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' - -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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' - CFLAGS = DEVICE + ' -Dgcc' - AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' - LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' - CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' - AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.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-M4.fp ' - CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' - CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' - CFLAGS += ' -mfloat-abi=hard -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-M4' - CFLAGS += ' -e' - CFLAGS += ' --fpu=VFPv4_sp' - 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-M4' - AFLAGS += ' --fpu VFPv4_sp' - 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/n32/n32g45xvl-stb/Kconfig b/bsp/n32/n32g45xvl-stb/Kconfig deleted file mode 100644 index 73238d3a13..0000000000 --- a/bsp/n32/n32g45xvl-stb/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -mainmenu "RT-Thread Configuration" - -BSP_DIR := . - -RTT_DIR := ../../.. - -PKGS_DIR := packages - -source "$(RTT_DIR)/Kconfig" -osource "$PKGS_DIR/Kconfig" -rsource "../libraries/Kconfig" -rsource "board/Kconfig" diff --git a/bsp/n32/n32g45xvl-stb/project.uvoptx b/bsp/n32/n32g45xvl-stb/project.uvoptx deleted file mode 100644 index 4fae3b2177..0000000000 --- a/bsp/n32/n32g45xvl-stb/project.uvoptx +++ /dev/null @@ -1,185 +0,0 @@ - - - - 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\ - - - 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 - 3 - - - - - - - - - - - BIN\CMSIS_AGDI.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457VEL7$Flash\N32G45x.FLM) - - - 0 - CMSIS_AGDI - -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0N32G45x.FLM -FS08000000 -FL080000 -FP0($$Device:N32G457VEL7$Flash\N32G45x.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 - - - - - - - - - - - - - ::CMSIS - 0 - 0 - 0 - 1 - - -
diff --git a/bsp/n32/n32g45xvl-stb/rtconfig.py b/bsp/n32/n32g45xvl-stb/rtconfig.py deleted file mode 100644 index 2a0371110c..0000000000 --- a/bsp/n32/n32g45xvl-stb/rtconfig.py +++ /dev/null @@ -1,184 +0,0 @@ -import os - -# toolchains options -ARCH='arm' -CPU='cortex-m4' -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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' - -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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' - CFLAGS = DEVICE + ' -Dgcc' - AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' - LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' - CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' - AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.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-M4.fp ' - CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' - CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' - CFLAGS += ' -mfloat-abi=hard -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-M4' - CFLAGS += ' -e' - CFLAGS += ' --fpu=VFPv4_sp' - 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-M4' - AFLAGS += ' --fpu VFPv4_sp' - 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/n32/n32g4frml-stb/Kconfig b/bsp/n32/n32g4frml-stb/Kconfig deleted file mode 100644 index 73238d3a13..0000000000 --- a/bsp/n32/n32g4frml-stb/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -mainmenu "RT-Thread Configuration" - -BSP_DIR := . - -RTT_DIR := ../../.. - -PKGS_DIR := packages - -source "$(RTT_DIR)/Kconfig" -osource "$PKGS_DIR/Kconfig" -rsource "../libraries/Kconfig" -rsource "board/Kconfig" diff --git a/bsp/n32/n32g4frml-stb/project.ewp b/bsp/n32/n32g4frml-stb/project.ewp deleted file mode 100644 index 96ebc11b67..0000000000 --- a/bsp/n32/n32g4frml-stb/project.ewp +++ /dev/null @@ -1,2474 +0,0 @@ - - 3 - - rt-thread - - ARM - - 1 - - General - 3 - - 33 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ICCARM - 2 - - 37 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AARM - 2 - - 11 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OBJCOPY - 0 - - 1 - 1 - 1 - - - - - - - - - CUSTOM - 3 - - - - 0 - inputOutputBased - - - - BUILDACTION - 1 - - - - - - - ILINK - 0 - - 25 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IARCHIVE - 0 - - 0 - 1 - 1 - - - - - - - - Release - - ARM - - 0 - - General - 3 - - 33 - 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 - - 25 - 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\cstdlib.c - - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c - - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c - - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cunistd.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 - - - - DeviceDrivers - - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c - - - $PROJ_DIR$\..\..\..\components\drivers\core\device.c - - - $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - - - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - - - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c - - - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c - - - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c - - - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c - - - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.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\adc.c - - - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c - - - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c - - - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c - - - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c - - - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c - - - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c - - - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c - - - - Drivers - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\CMSIS\device\startup\startup_n32g4fr_EWARM.s - - - $PROJ_DIR$\board\board.c - - - $PROJ_DIR$\..\libraries\n32_drivers\drv_adc.c - - - $PROJ_DIR$\..\libraries\n32_drivers\drv_can.c - - - $PROJ_DIR$\..\libraries\n32_drivers\drv_dac.c - - - $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c - - - $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c - - - $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c - - - $PROJ_DIR$\..\libraries\n32_drivers\drv_spi.c - - - $PROJ_DIR$\..\libraries\n32_drivers\drv_usart.c - - - $PROJ_DIR$\..\libraries\n32_drivers\drv_wdt.c - - - - Finsh - - $PROJ_DIR$\..\..\..\components\finsh\cmd.c - - - $PROJ_DIR$\..\..\..\components\finsh\msh.c - - - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c - - - $PROJ_DIR$\..\..\..\components\finsh\shell.c - - - - Kernel - - $PROJ_DIR$\..\..\..\src\clock.c - - - $PROJ_DIR$\..\..\..\src\components.c - - - $PROJ_DIR$\..\..\..\src\cpu_up.c - - - $PROJ_DIR$\..\..\..\src\defunct.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\memheap.c - - - $PROJ_DIR$\..\..\..\src\mempool.c - - - $PROJ_DIR$\..\..\..\src\object.c - - - $PROJ_DIR$\..\..\..\src\scheduler_comm.c - - - $PROJ_DIR$\..\..\..\src\scheduler_up.c - - - $PROJ_DIR$\..\..\..\src\thread.c - - - $PROJ_DIR$\..\..\..\src\timer.c - - - - klibc - - $PROJ_DIR$\..\..\..\src\klibc\kstring.c - - - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c - - - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c - - - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c - - - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c - - - - libcpu - - $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-m4\context_iar.S - - - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c - - - - libraries - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_usart.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_adc.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_rtc.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_exti.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_spi.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_rcc.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_gpio.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_can.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_i2c.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_dac.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_iwdg.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_tim.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\CMSIS\device\system_n32g4fr.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\misc.c - - - $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_wwdg.c - - - - POSIX - - - utc_UTest - - - utestcases - - diff --git a/bsp/n32/n32g4frml-stb/rtconfig.py b/bsp/n32/n32g4frml-stb/rtconfig.py deleted file mode 100644 index 2a0371110c..0000000000 --- a/bsp/n32/n32g4frml-stb/rtconfig.py +++ /dev/null @@ -1,184 +0,0 @@ -import os - -# toolchains options -ARCH='arm' -CPU='cortex-m4' -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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' - -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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' - CFLAGS = DEVICE + ' -Dgcc' - AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' - LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' - CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' - AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.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-M4.fp ' - CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' - CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' - CFLAGS += ' -mfloat-abi=hard -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-M4' - CFLAGS += ' -e' - CFLAGS += ' --fpu=VFPv4_sp' - 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-M4' - AFLAGS += ' --fpu VFPv4_sp' - 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/n32/.clang-format-ignore b/bsp/n32/n32gxx_lxx/.clang-format-ignore similarity index 55% rename from bsp/n32/.clang-format-ignore rename to bsp/n32/n32gxx_lxx/.clang-format-ignore index bb5dde5216..b828aa10a8 100644 --- a/bsp/n32/.clang-format-ignore +++ b/bsp/n32/n32gxx_lxx/.clang-format-ignore @@ -4,4 +4,9 @@ # If you need to exclude a file, add the path to the file in file_path. # 从 .ignore_format.yml 迁移的规则 -/libraries/N32G45x_Firmware_Library/ \ No newline at end of file +/libraries/N32G43x_Firmware_Library/ +/libraries/N32G4FR_Firmware_Library/ +/libraries/N32G45x_Firmware_Library/ +/libraries/N32L40x_Firmware_Library/ +/libraries/N32L43x_Firmware_Library/ +/libraries/N32WB452_Firmware_Library/ \ No newline at end of file diff --git a/bsp/n32/libraries/Kconfig b/bsp/n32/n32gxx_lxx/libraries/Kconfig similarity index 100% rename from bsp/n32/libraries/Kconfig rename to bsp/n32/n32gxx_lxx/libraries/Kconfig diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_common_tables.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_common_tables.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_common_tables.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_common_tables.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_const_structs.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_const_structs.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_const_structs.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_const_structs.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_math.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_math.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_math.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/arm_math.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_armcc.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_armcc.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_armcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_armcc.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_armclang.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_armclang.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_armclang.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_armclang.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_compiler.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_compiler.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_compiler.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_compiler.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_gcc.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_gcc.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_gcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_gcc.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_iccarm.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_iccarm.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_iccarm.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_iccarm.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_version.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_version.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_version.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/cmsis_version.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/core_cm4.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/core_cm4.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/core_cm4.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/core_cm4.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/mpu_armv7.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/mpu_armv7.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/core/mpu_armv7.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/core/mpu_armv7.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x_conf.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x_conf.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x_conf.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x_conf.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x_flash.ld b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x_flash.ld similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x_flash.ld rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/n32g43x_flash.ld diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x.s b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x.s similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x.s rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x.s diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x_EWARM.s b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x_EWARM.s similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x_EWARM.s rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x_EWARM.s diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x_gcc.s b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x_gcc.s similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x_gcc.s rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/startup/startup_n32g43x_gcc.s diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/system_n32g43x.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/system_n32g43x.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/system_n32g43x.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/system_n32g43x.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/system_n32g43x.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/system_n32g43x.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/CMSIS/device/system_n32g43x.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/CMSIS/device/system_n32g43x.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/SConscript b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/SConscript similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/SConscript rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/SConscript diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_aes.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_aes.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_aes.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_aes.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_algo_common.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_algo_common.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_algo_common.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_algo_common.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_des.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_des.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_des.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_des.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_hash.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_hash.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_hash.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_hash.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_rng.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_rng.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_rng.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_algo_lib/inc/n32g43x_rng.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/misc.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/misc.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/misc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/misc.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_adc.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_adc.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_adc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_adc.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_can.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_can.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_can.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_can.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_comp.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_comp.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_comp.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_comp.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_crc.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_crc.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_crc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_crc.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dac.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dac.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dac.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dac.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dbg.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dbg.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dbg.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dbg.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dma.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dma.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dma.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_dma.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_exti.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_exti.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_exti.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_exti.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_flash.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_flash.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_flash.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_flash.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_gpio.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_gpio.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_gpio.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_gpio.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_i2c.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_i2c.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_i2c.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_i2c.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_iwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_iwdg.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_iwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_iwdg.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_lptim.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_lptim.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_lptim.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_lptim.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_lpuart.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_lpuart.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_lpuart.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_lpuart.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_opamp.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_opamp.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_opamp.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_opamp.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_pwr.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_pwr.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_pwr.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_pwr.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_rcc.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_rcc.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_rcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_rcc.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_rtc.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_rtc.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_rtc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_rtc.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_spi.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_spi.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_spi.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_spi.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_tim.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_tim.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_tim.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_tim.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_tsc.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_tsc.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_tsc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_tsc.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_usart.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_usart.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_usart.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_usart.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_wwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_wwdg.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_wwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/inc/n32g43x_wwdg.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/misc.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/misc.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/misc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/misc.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_adc.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_adc.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_adc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_adc.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_can.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_can.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_can.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_can.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_comp.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_comp.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_comp.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_comp.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_crc.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_crc.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_crc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_crc.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dac.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dac.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dac.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dac.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dbg.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dbg.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dbg.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dbg.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dma.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dma.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dma.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_dma.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_exti.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_exti.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_exti.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_exti.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_flash.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_flash.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_flash.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_flash.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_gpio.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_gpio.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_gpio.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_gpio.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_i2c.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_i2c.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_i2c.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_i2c.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_iwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_iwdg.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_iwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_iwdg.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_lptim.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_lptim.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_lptim.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_lptim.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_lpuart.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_lpuart.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_lpuart.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_lpuart.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_opamp.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_opamp.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_opamp.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_opamp.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_pwr.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_pwr.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_pwr.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_pwr.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_rcc.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_rcc.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_rcc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_rcc.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_rtc.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_rtc.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_rtc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_rtc.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_spi.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_spi.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_spi.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_spi.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_tim.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_tim.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_tim.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_tim.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_tsc.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_tsc.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_tsc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_tsc.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_usart.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_usart.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_usart.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_usart.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_wwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_wwdg.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_wwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_std_periph_driver/src/n32g43x_wwdg.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_core.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_core.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_core.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_core.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_def.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_def.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_def.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_def.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_init.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_init.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_init.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_init.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_int.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_int.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_int.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_lib.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_lib.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_lib.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_lib.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_mem.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_mem.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_mem.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_mem.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_regs.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_regs.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_regs.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_regs.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_sil.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_sil.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_sil.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_sil.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_type.h b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_type.h similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_type.h rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/inc/usb_type.h diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_core.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_core.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_core.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_core.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_init.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_init.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_init.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_init.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_int.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_int.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_int.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_int.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_mem.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_mem.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_mem.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_mem.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_regs.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_regs.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_regs.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_regs.c diff --git a/bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_sil.c b/bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_sil.c similarity index 100% rename from bsp/n32/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_sil.c rename to bsp/n32/n32gxx_lxx/libraries/N32G43x_Firmware_Library/n32g43x_usbfs_driver/src/usb_sil.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_common_tables.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_common_tables.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_common_tables.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_common_tables.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_const_structs.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_const_structs.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_const_structs.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_const_structs.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_math.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_math.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_math.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/arm_math.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_armcc.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_armcc.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_armcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_armcc.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_armclang.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_armclang.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_armclang.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_armclang.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_compiler.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_compiler.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_compiler.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_compiler.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_gcc.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_gcc.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_gcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_gcc.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_iccarm.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_iccarm.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_iccarm.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_iccarm.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_version.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_version.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_version.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/cmsis_version.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/core_cm4.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/core_cm4.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/core_cm4.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/core_cm4.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/mpu_armv7.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/mpu_armv7.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/core/mpu_armv7.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/core/mpu_armv7.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x_conf.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x_conf.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x_conf.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x_conf.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x_flash.ld b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x_flash.ld similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x_flash.ld rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/n32g45x_flash.ld diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x.s b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x.s similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x.s rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x.s diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x_EWARM.s b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x_EWARM.s similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x_EWARM.s rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x_EWARM.s diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x_gcc.s b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x_gcc.s similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x_gcc.s rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/startup/startup_n32g45x_gcc.s diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/system_n32g45x.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/system_n32g45x.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/system_n32g45x.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/system_n32g45x.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/system_n32g45x.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/system_n32g45x.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/CMSIS/device/system_n32g45x.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/CMSIS/device/system_n32g45x.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/SConscript b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/SConscript similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/SConscript rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/SConscript diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_aes.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_aes.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_aes.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_aes.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_algo_common.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_algo_common.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_algo_common.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_algo_common.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_des.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_des.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_des.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_des.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_hash.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_hash.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_hash.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_hash.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_rng.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_rng.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_rng.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_algo_lib/inc/n32g45x_rng.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/misc.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/misc.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/misc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/misc.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_adc.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_adc.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_adc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_adc.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_bkp.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_bkp.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_bkp.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_bkp.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_can.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_can.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_can.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_can.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_comp.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_comp.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_comp.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_comp.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_crc.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_crc.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_crc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_crc.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dac.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dac.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dac.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dac.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dbg.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dbg.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dbg.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dbg.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dma.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dma.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dma.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dma.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dvp.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dvp.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dvp.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_dvp.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_eth.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_eth.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_eth.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_eth.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_exti.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_exti.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_exti.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_exti.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_flash.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_flash.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_flash.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_flash.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_gpio.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_gpio.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_gpio.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_gpio.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_i2c.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_i2c.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_i2c.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_i2c.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_iwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_iwdg.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_iwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_iwdg.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_opamp.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_opamp.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_opamp.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_opamp.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_pwr.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_pwr.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_pwr.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_pwr.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_qspi.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_qspi.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_qspi.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_qspi.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_rcc.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_rcc.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_rcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_rcc.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_rtc.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_rtc.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_rtc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_rtc.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_sdio.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_sdio.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_sdio.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_sdio.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_spi.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_spi.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_spi.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_spi.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_tim.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_tim.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_tim.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_tim.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_tsc.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_tsc.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_tsc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_tsc.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_usart.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_usart.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_usart.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_usart.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_wwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_wwdg.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_wwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32g45x_wwdg.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32xx_tsc_alg_api.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32xx_tsc_alg_api.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32xx_tsc_alg_api.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/inc/n32xx_tsc_alg_api.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/misc.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/misc.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/misc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/misc.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_adc.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_adc.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_adc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_adc.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_bkp.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_bkp.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_bkp.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_bkp.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_can.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_can.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_can.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_can.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_comp.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_comp.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_comp.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_comp.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_crc.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_crc.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_crc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_crc.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dac.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dac.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dac.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dac.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dbg.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dbg.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dbg.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dbg.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dma.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dma.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dma.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dma.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dvp.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dvp.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dvp.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_dvp.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_eth.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_eth.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_eth.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_eth.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_exti.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_exti.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_exti.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_exti.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_flash.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_flash.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_flash.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_flash.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_gpio.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_gpio.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_gpio.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_gpio.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_i2c.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_i2c.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_i2c.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_i2c.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_iwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_iwdg.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_iwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_iwdg.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_opamp.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_opamp.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_opamp.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_opamp.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_pwr.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_pwr.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_pwr.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_pwr.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_qspi.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_qspi.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_qspi.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_qspi.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_rcc.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_rcc.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_rcc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_rcc.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_rtc.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_rtc.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_rtc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_rtc.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_sdio.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_sdio.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_sdio.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_sdio.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_spi.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_spi.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_spi.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_spi.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_tim.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_tim.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_tim.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_tim.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_tsc.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_tsc.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_tsc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_tsc.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_usart.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_usart.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_usart.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_usart.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_wwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_wwdg.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_wwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_std_periph_driver/src/n32g45x_wwdg.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_core.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_core.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_core.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_core.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_def.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_def.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_def.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_def.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_init.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_init.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_init.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_init.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_int.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_int.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_int.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_lib.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_lib.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_lib.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_lib.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_mem.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_mem.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_mem.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_mem.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_regs.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_regs.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_regs.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_regs.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_sil.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_sil.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_sil.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_sil.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_type.h b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_type.h similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_type.h rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/inc/usb_type.h diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_core.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_core.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_core.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_core.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_init.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_init.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_init.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_init.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_int.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_int.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_int.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_int.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_mem.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_mem.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_mem.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_mem.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_regs.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_regs.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_regs.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_regs.c diff --git a/bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_sil.c b/bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_sil.c similarity index 100% rename from bsp/n32/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_sil.c rename to bsp/n32/n32gxx_lxx/libraries/N32G45x_Firmware_Library/n32g45x_usbfs_driver/src/usb_sil.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_common_tables.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_common_tables.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_common_tables.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_common_tables.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_const_structs.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_const_structs.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_const_structs.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_const_structs.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_math.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_math.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_math.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/arm_math.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_armcc.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_armcc.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_armcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_armcc.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_armclang.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_armclang.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_armclang.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_armclang.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_compiler.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_compiler.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_compiler.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_compiler.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_gcc.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_gcc.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_gcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_gcc.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_iccarm.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_iccarm.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_iccarm.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_iccarm.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_version.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_version.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_version.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/cmsis_version.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/core_cm4.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/core_cm4.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/core_cm4.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/core_cm4.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/mpu_armv7.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/mpu_armv7.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/core/mpu_armv7.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/core/mpu_armv7.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr_conf.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr_conf.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr_conf.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr_conf.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr_flash.ld b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr_flash.ld similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr_flash.ld rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/n32g4fr_flash.ld diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr.s b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr.s similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr.s rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr.s diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr_EWARM.s b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr_EWARM.s similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr_EWARM.s rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr_EWARM.s diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr_gcc.s b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr_gcc.s similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr_gcc.s rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/startup/startup_n32g4fr_gcc.s diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/system_n32g4fr.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/system_n32g4fr.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/system_n32g4fr.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/system_n32g4fr.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/system_n32g4fr.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/system_n32g4fr.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/CMSIS/device/system_n32g4fr.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/CMSIS/device/system_n32g4fr.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/SConscript b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/SConscript similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/SConscript rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/SConscript diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_aes.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_aes.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_aes.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_aes.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_algo_common.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_algo_common.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_algo_common.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_algo_common.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_des.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_des.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_des.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_des.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_hash.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_hash.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_hash.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_hash.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_rng.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_rng.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_rng.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_algo_lib/inc/n32g4fr_rng.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/misc.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/misc.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/misc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/misc.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_adc.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_adc.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_adc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_adc.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_bkp.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_bkp.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_bkp.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_bkp.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_can.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_can.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_can.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_can.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_crc.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_crc.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_crc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_crc.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dac.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dac.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dac.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dac.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dbg.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dbg.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dbg.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dbg.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dma.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dma.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dma.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dma.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dvp.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dvp.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dvp.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_dvp.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_exti.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_exti.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_exti.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_exti.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_flash.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_flash.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_flash.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_flash.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_gpio.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_gpio.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_gpio.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_gpio.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_i2c.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_i2c.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_i2c.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_i2c.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_iwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_iwdg.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_iwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_iwdg.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_pwr.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_pwr.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_pwr.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_pwr.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_qspi.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_qspi.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_qspi.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_qspi.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_rcc.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_rcc.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_rcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_rcc.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_rtc.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_rtc.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_rtc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_rtc.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_sdio.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_sdio.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_sdio.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_sdio.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_spi.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_spi.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_spi.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_spi.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_tim.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_tim.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_tim.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_tim.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_tsc.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_tsc.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_tsc.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_tsc.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_usart.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_usart.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_usart.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_usart.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_wwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_wwdg.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_wwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32g4fr_wwdg.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32xx_tsc_alg_api.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32xx_tsc_alg_api.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32xx_tsc_alg_api.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/inc/n32xx_tsc_alg_api.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/misc.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/misc.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/misc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/misc.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_adc.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_adc.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_adc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_adc.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_bkp.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_bkp.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_bkp.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_bkp.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_can.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_can.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_can.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_can.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_crc.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_crc.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_crc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_crc.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dac.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dac.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dac.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dac.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dbg.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dbg.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dbg.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dbg.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dma.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dma.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dma.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dma.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dvp.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dvp.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dvp.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_dvp.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_exti.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_exti.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_exti.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_exti.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_flash.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_flash.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_flash.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_flash.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_gpio.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_gpio.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_gpio.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_gpio.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_i2c.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_i2c.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_i2c.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_i2c.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_iwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_iwdg.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_iwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_iwdg.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_pwr.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_pwr.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_pwr.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_pwr.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_qspi.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_qspi.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_qspi.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_qspi.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_rcc.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_rcc.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_rcc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_rcc.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_rtc.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_rtc.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_rtc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_rtc.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_sdio.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_sdio.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_sdio.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_sdio.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_spi.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_spi.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_spi.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_spi.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_tim.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_tim.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_tim.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_tim.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_tsc.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_tsc.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_tsc.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_tsc.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_usart.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_usart.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_usart.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_usart.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_wwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_wwdg.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_wwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_std_periph_driver/src/n32g4fr_wwdg.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_core.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_core.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_core.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_core.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_def.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_def.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_def.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_def.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_init.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_init.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_init.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_init.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_int.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_int.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_int.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_lib.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_lib.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_lib.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_lib.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_mem.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_mem.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_mem.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_mem.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_regs.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_regs.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_regs.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_regs.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_sil.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_sil.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_sil.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_sil.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_type.h b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_type.h similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_type.h rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/inc/usb_type.h diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_core.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_core.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_core.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_core.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_init.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_init.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_init.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_init.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_int.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_int.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_int.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_int.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_mem.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_mem.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_mem.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_mem.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_regs.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_regs.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_regs.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_regs.c diff --git a/bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_sil.c b/bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_sil.c similarity index 100% rename from bsp/n32/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_sil.c rename to bsp/n32/n32gxx_lxx/libraries/N32G4FR_Firmware_Library/n32g4fr_usbfs_driver/src/usb_sil.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_common_tables.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_common_tables.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_common_tables.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_common_tables.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_const_structs.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_const_structs.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_const_structs.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_const_structs.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_math.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_math.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_math.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/arm_math.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_armcc.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_armcc.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_armcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_armcc.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_armclang.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_armclang.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_armclang.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_armclang.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_compiler.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_compiler.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_compiler.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_compiler.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_gcc.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_gcc.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_gcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_gcc.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_iccarm.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_iccarm.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_iccarm.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_iccarm.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_version.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_version.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_version.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/cmsis_version.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/core_cm4.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/core_cm4.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/core_cm4.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/core_cm4.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/mpu_armv7.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/mpu_armv7.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/core/mpu_armv7.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/core/mpu_armv7.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x_conf.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x_conf.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x_conf.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x_conf.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x_flash.ld b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x_flash.ld similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x_flash.ld rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/n32l40x_flash.ld diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x.s b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x.s similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x.s rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x.s diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x_EWARM.s b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x_EWARM.s similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x_EWARM.s rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x_EWARM.s diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x_gcc.s b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x_gcc.s similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x_gcc.s rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/startup/startup_n32l40x_gcc.s diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/system_n32l40x.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/system_n32l40x.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/system_n32l40x.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/system_n32l40x.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/system_n32l40x.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/system_n32l40x.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/CMSIS/device/system_n32l40x.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/CMSIS/device/system_n32l40x.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/SConscript b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/SConscript similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/SConscript rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/SConscript diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_aes.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_aes.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_aes.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_aes.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_algo_common.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_algo_common.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_algo_common.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_algo_common.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_des.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_des.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_des.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_des.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_hash.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_hash.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_hash.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_hash.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_rng.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_rng.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_rng.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_algo_lib/inc/n32l40x_rng.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/misc.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/misc.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/misc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/misc.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_adc.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_adc.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_adc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_adc.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_can.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_can.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_can.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_can.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_comp.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_comp.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_comp.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_comp.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_crc.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_crc.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_crc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_crc.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dac.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dac.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dac.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dac.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dbg.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dbg.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dbg.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dbg.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dma.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dma.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dma.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_dma.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_exti.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_exti.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_exti.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_exti.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_flash.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_flash.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_flash.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_flash.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_gpio.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_gpio.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_gpio.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_gpio.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_i2c.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_i2c.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_i2c.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_i2c.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_iwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_iwdg.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_iwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_iwdg.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lcd.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lcd.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lcd.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lcd.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lptim.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lptim.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lptim.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lptim.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lpuart.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lpuart.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lpuart.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_lpuart.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_opamp.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_opamp.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_opamp.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_opamp.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_pwr.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_pwr.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_pwr.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_pwr.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_rcc.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_rcc.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_rcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_rcc.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_rtc.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_rtc.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_rtc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_rtc.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_spi.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_spi.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_spi.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_spi.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_tim.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_tim.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_tim.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_tim.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_tsc.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_tsc.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_tsc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_tsc.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_usart.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_usart.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_usart.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_usart.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_wwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_wwdg.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_wwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/inc/n32l40x_wwdg.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/misc.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/misc.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/misc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/misc.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_adc.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_adc.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_adc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_adc.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_can.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_can.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_can.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_can.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_comp.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_comp.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_comp.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_comp.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_crc.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_crc.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_crc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_crc.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dac.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dac.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dac.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dac.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dbg.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dbg.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dbg.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dbg.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dma.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dma.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dma.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_dma.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_exti.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_exti.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_exti.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_exti.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_flash.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_flash.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_flash.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_flash.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_gpio.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_gpio.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_gpio.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_gpio.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_i2c.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_i2c.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_i2c.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_i2c.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_iwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_iwdg.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_iwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_iwdg.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lcd.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lcd.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lcd.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lcd.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lptim.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lptim.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lptim.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lptim.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lpuart.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lpuart.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lpuart.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_lpuart.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_opamp.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_opamp.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_opamp.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_opamp.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_pwr.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_pwr.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_pwr.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_pwr.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_rcc.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_rcc.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_rcc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_rcc.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_rtc.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_rtc.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_rtc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_rtc.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_spi.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_spi.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_spi.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_spi.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_tim.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_tim.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_tim.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_tim.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_tsc.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_tsc.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_tsc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_tsc.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_usart.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_usart.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_usart.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_usart.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_wwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_wwdg.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_wwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_std_periph_driver/src/n32l40x_wwdg.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_core.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_core.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_core.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_core.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_def.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_def.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_def.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_def.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_init.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_init.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_init.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_init.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_int.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_int.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_int.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_lib.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_lib.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_lib.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_lib.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_mem.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_mem.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_mem.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_mem.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_regs.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_regs.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_regs.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_regs.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_sil.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_sil.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_sil.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_sil.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_type.h b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_type.h similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_type.h rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/inc/usb_type.h diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_core.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_core.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_core.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_core.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_init.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_init.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_init.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_init.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_int.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_int.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_int.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_int.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_mem.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_mem.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_mem.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_mem.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_regs.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_regs.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_regs.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_regs.c diff --git a/bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_sil.c b/bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_sil.c similarity index 100% rename from bsp/n32/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_sil.c rename to bsp/n32/n32gxx_lxx/libraries/N32L40x_Firmware_Library/n32l40x_usbfs_driver/src/usb_sil.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_common_tables.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_common_tables.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_common_tables.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_common_tables.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_const_structs.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_const_structs.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_const_structs.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_const_structs.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_math.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_math.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_math.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/arm_math.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_armcc.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_armcc.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_armcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_armcc.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_armclang.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_armclang.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_armclang.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_armclang.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_compiler.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_compiler.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_compiler.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_compiler.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_gcc.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_gcc.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_gcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_gcc.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_iccarm.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_iccarm.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_iccarm.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_iccarm.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_version.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_version.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_version.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/cmsis_version.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/core_cm4.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/core_cm4.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/core_cm4.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/core_cm4.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/mpu_armv7.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/mpu_armv7.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/core/mpu_armv7.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/core/mpu_armv7.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x_conf.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x_conf.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x_conf.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x_conf.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x_flash.ld b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x_flash.ld similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x_flash.ld rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/n32l43x_flash.ld diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x.s b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x.s similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x.s rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x.s diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x_EWARM.s b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x_EWARM.s similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x_EWARM.s rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x_EWARM.s diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x_gcc.s b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x_gcc.s similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x_gcc.s rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/startup/startup_n32l43x_gcc.s diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/system_n32l43x.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/system_n32l43x.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/system_n32l43x.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/system_n32l43x.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/system_n32l43x.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/system_n32l43x.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/CMSIS/device/system_n32l43x.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/CMSIS/device/system_n32l43x.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/SConscript b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/SConscript similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/SConscript rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/SConscript diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_aes.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_aes.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_aes.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_aes.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_algo_common.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_algo_common.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_algo_common.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_algo_common.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_des.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_des.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_des.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_des.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_hash.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_hash.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_hash.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_hash.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_rng.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_rng.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_rng.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_algo_lib/inc/n32l43x_rng.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/misc.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/misc.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/misc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/misc.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_adc.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_adc.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_adc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_adc.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_can.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_can.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_can.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_can.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_comp.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_comp.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_comp.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_comp.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_crc.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_crc.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_crc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_crc.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dac.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dac.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dac.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dac.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dbg.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dbg.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dbg.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dbg.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dma.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dma.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dma.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_dma.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_exti.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_exti.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_exti.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_exti.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_flash.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_flash.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_flash.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_flash.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_gpio.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_gpio.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_gpio.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_gpio.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_i2c.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_i2c.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_i2c.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_i2c.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_iwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_iwdg.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_iwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_iwdg.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lcd.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lcd.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lcd.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lcd.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lprcnt.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lprcnt.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lprcnt.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lprcnt.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lptim.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lptim.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lptim.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lptim.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lpuart.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lpuart.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lpuart.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_lpuart.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_opamp.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_opamp.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_opamp.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_opamp.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_pwr.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_pwr.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_pwr.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_pwr.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_rcc.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_rcc.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_rcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_rcc.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_rtc.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_rtc.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_rtc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_rtc.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_spi.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_spi.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_spi.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_spi.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_tim.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_tim.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_tim.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_tim.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_tsc.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_tsc.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_tsc.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_tsc.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_usart.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_usart.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_usart.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_usart.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_wwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_wwdg.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_wwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/inc/n32l43x_wwdg.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/misc.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/misc.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/misc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/misc.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_adc.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_adc.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_adc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_adc.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_can.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_can.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_can.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_can.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_comp.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_comp.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_comp.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_comp.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_crc.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_crc.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_crc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_crc.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dac.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dac.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dac.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dac.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dbg.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dbg.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dbg.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dbg.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dma.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dma.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dma.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_dma.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_exti.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_exti.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_exti.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_exti.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_flash.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_flash.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_flash.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_flash.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_gpio.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_gpio.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_gpio.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_gpio.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_i2c.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_i2c.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_i2c.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_i2c.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_iwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_iwdg.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_iwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_iwdg.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lcd.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lcd.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lcd.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lcd.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lprcnt.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lprcnt.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lprcnt.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lprcnt.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lptim.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lptim.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lptim.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lptim.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lpuart.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lpuart.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lpuart.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_lpuart.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_opamp.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_opamp.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_opamp.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_opamp.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_pwr.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_pwr.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_pwr.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_pwr.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_rcc.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_rcc.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_rcc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_rcc.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_rtc.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_rtc.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_rtc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_rtc.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_spi.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_spi.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_spi.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_spi.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_tim.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_tim.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_tim.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_tim.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_tsc.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_tsc.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_tsc.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_tsc.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_usart.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_usart.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_usart.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_usart.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_wwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_wwdg.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_wwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_std_periph_driver/src/n32l43x_wwdg.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_core.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_core.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_core.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_core.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_def.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_def.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_def.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_def.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_init.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_init.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_init.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_init.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_int.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_int.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_int.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_lib.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_lib.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_lib.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_lib.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_mem.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_mem.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_mem.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_mem.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_regs.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_regs.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_regs.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_regs.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_sil.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_sil.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_sil.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_sil.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_type.h b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_type.h similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_type.h rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/inc/usb_type.h diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_core.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_core.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_core.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_core.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_init.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_init.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_init.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_init.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_int.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_int.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_int.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_int.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_mem.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_mem.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_mem.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_mem.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_regs.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_regs.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_regs.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_regs.c diff --git a/bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_sil.c b/bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_sil.c similarity index 100% rename from bsp/n32/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_sil.c rename to bsp/n32/n32gxx_lxx/libraries/N32L43x_Firmware_Library/n32l43x_usbfs_driver/src/usb_sil.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_common_tables.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_common_tables.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_common_tables.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_common_tables.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_const_structs.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_const_structs.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_const_structs.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_const_structs.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_math.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_math.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_math.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/arm_math.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_armcc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_armcc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_armcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_armcc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_armclang.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_armclang.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_armclang.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_armclang.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_compiler.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_compiler.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_compiler.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_compiler.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_gcc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_gcc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_gcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_gcc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_iccarm.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_iccarm.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_iccarm.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_iccarm.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_version.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_version.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_version.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/cmsis_version.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/core_cm4.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/core_cm4.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/core_cm4.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/core_cm4.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/mpu_armv7.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/mpu_armv7.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/core/mpu_armv7.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/core/mpu_armv7.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452_conf.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452_conf.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452_conf.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452_conf.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452_flash.ld b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452_flash.ld similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452_flash.ld rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/n32wb452_flash.ld diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452.s b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452.s similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452.s rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452.s diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452_EWARM.s b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452_EWARM.s similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452_EWARM.s rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452_EWARM.s diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452_gcc.s b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452_gcc.s similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452_gcc.s rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/startup/startup_n32wb452_gcc.s diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/system_n32wb452.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/system_n32wb452.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/system_n32wb452.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/system_n32wb452.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/system_n32wb452.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/system_n32wb452.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/CMSIS/device/system_n32wb452.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/CMSIS/device/system_n32wb452.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/SConscript b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/SConscript similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/SConscript rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/SConscript diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_aes.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_aes.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_aes.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_aes.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_algo_common.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_algo_common.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_algo_common.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_algo_common.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_des.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_des.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_des.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_des.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_hash.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_hash.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_hash.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_hash.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_rng.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_rng.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_rng.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_algo_lib/inc/n32wb452_rng.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/att.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/att.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/att.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/att.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attm.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attm.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attm.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attm.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attm_db.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attm_db.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attm_db.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/attm_db.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/atts.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/atts.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/atts.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/atts.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ble_arch.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ble_arch.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ble_arch.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ble_arch.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_bt.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_bt.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_bt.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_bt.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_bt_defines.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_bt_defines.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_bt_defines.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_bt_defines.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_endian.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_endian.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_endian.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_endian.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_error.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_error.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_error.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_error.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_hci.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_hci.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_hci.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_hci.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_list.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_list.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_list.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_list.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_llcp.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_llcp.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_llcp.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_llcp.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_lmp.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_lmp.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_lmp.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_lmp.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_math.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_math.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_math.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_math.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_utils.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_utils.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_utils.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_utils.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_version.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_version.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_version.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/co_version.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gap.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gap.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gap.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gap.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_int.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_int.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_int.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_sig.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_sig.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_sig.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_sig.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_task.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_task.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_task.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapc_task.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_int.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_int.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_int.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_task.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_task.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_task.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_task.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_util.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_util.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_util.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gapm_util.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gatt.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gatt.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gatt.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gatt.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc_int.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc_int.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc_int.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc_task.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc_task.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc_task.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattc_task.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm_int.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm_int.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm_int.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm_task.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm_task.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm_task.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/gattm_task.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/h4tl.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/h4tl.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/h4tl.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/h4tl.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/hci.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/hci.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/hci.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/hci.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/hci_int.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/hci_int.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/hci_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/hci_int.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_config.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_config.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_config.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_config.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_env.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_env.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_env.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_env.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_event.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_event.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_event.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_event.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_mem.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_mem.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_mem.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_mem.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_msg.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_msg.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_msg.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_msg.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_queue.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_queue.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_queue.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_queue.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_task.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_task.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_task.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_task.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_timer.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_timer.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_timer.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/ke_timer.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_int.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_int.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_int.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_lecb.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_lecb.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_lecb.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_lecb.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_pdu.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_pdu.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_pdu.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_pdu.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_pdu_int.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_pdu_int.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_pdu_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_pdu_int.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_sig.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_sig.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_sig.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_sig.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_task.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_task.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_task.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cc_task.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cm.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cm.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cm.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cm.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cm_int.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cm_int.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cm_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/l2cm_int.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/nvds.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/nvds.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/nvds.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/nvds.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf_types.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf_types.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf_types.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf_types.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf_utils.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf_utils.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf_utils.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/prf_utils.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwapp_config.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwapp_config.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwapp_config.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwapp_config.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_config.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_config.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_config.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_config.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl_config.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl_config.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl_config.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl_config.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl_error.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl_error.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl_error.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwble_hl_error.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip_config.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip_config.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip_config.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip_config.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip_task.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip_task.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip_task.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwip_task.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwprf_config.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwprf_config.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwprf_config.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/rwprf_config.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smp_common.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smp_common.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smp_common.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smp_common.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_api.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_api.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_api.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_api.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_crypto.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_crypto.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_crypto.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_crypto.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_int.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_int.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_int.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_util.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_util.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_util.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpc_util.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpm_api.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpm_api.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpm_api.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/inc/smpm_api.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/n32wb452_ble_api.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/n32wb452_ble_api.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/n32wb452_ble_api.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/n32wb452_ble_api.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/n32wb452_ble_api.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/n32wb452_ble_api.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/n32wb452_ble_api.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/n32wb452_ble_api.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_debug.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_debug.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_debug.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_debug.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_flash.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_flash.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_flash.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_flash.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_timer.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_timer.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_timer.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Eif_timer.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Interface.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Interface.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Interface.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/Interface.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_debug.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_debug.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_debug.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_debug.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_flash.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_flash.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_flash.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_flash.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_iom.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_iom.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_iom.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_iom.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_spi.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_spi.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_spi.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_spi.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_timer.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_timer.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_timer.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_timer.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_uart.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_uart.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_uart.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Eif_uart.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Interface.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Interface.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Interface.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Interface.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Ramcode.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Ramcode.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Ramcode.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/Ramcode.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/ble_monitor.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/ble_monitor.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/ble_monitor.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/platform/inc/ble_monitor.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_batt.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_batt.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_batt.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_batt.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_sec.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_sec.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_sec.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_sec.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_task.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_task.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_task.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_task.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_user.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_user.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_user.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/app_user.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/bass.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/bass.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/bass.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/bass.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/bass_task.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/bass_task.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/bass_task.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/bass_task.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_batt.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_batt.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_batt.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_batt.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_sec.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_sec.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_sec.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_sec.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_task.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_task.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_task.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_task.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_user.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_user.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_user.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/app_user.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/bass.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/bass.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/bass.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/bass.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/bass_task.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/bass_task.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/bass_task.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/bass_task.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/rwapp_config.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/rwapp_config.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/rwapp_config.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/rwapp_config.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/user.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/user.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/user.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/user.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/user_task.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/user_task.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/user_task.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/inc/user_task.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/prf.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/prf.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/prf.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/prf.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/prf_utils.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/prf_utils.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/prf_utils.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/prf_utils.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/user.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/user.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/user.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/user.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/user_task.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/user_task.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/user_task.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_ble_driver/profile/user_task.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/misc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/misc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/misc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/misc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_adc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_adc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_adc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_adc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_bkp.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_bkp.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_bkp.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_bkp.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_can.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_can.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_can.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_can.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_crc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_crc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_crc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_crc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dac.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dac.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dac.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dac.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dbg.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dbg.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dbg.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dbg.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dma.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dma.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dma.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dma.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dvp.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dvp.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dvp.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_dvp.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_exti.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_exti.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_exti.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_exti.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_flash.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_flash.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_flash.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_flash.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_gpio.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_gpio.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_gpio.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_gpio.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_i2c.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_i2c.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_i2c.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_i2c.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_iwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_iwdg.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_iwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_iwdg.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_pwr.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_pwr.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_pwr.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_pwr.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_rcc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_rcc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_rcc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_rcc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_rtc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_rtc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_rtc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_rtc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_sdio.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_sdio.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_sdio.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_sdio.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_spi.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_spi.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_spi.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_spi.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_tim.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_tim.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_tim.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_tim.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_tsc.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_tsc.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_tsc.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_tsc.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_usart.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_usart.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_usart.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_usart.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_wwdg.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_wwdg.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_wwdg.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32wb452_wwdg.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32xx_tsc_alg_api.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32xx_tsc_alg_api.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32xx_tsc_alg_api.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/inc/n32xx_tsc_alg_api.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/misc.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/misc.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/misc.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/misc.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_adc.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_adc.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_adc.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_adc.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_bkp.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_bkp.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_bkp.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_bkp.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_can.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_can.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_can.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_can.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_crc.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_crc.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_crc.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_crc.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dac.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dac.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dac.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dac.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dbg.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dbg.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dbg.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dbg.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dma.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dma.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dma.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dma.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dvp.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dvp.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dvp.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_dvp.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_exti.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_exti.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_exti.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_exti.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_flash.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_flash.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_flash.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_flash.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_gpio.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_gpio.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_gpio.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_gpio.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_i2c.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_i2c.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_i2c.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_i2c.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_iwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_iwdg.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_iwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_iwdg.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_pwr.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_pwr.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_pwr.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_pwr.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_rcc.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_rcc.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_rcc.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_rcc.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_rtc.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_rtc.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_rtc.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_rtc.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_sdio.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_sdio.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_sdio.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_sdio.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_spi.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_spi.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_spi.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_spi.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_tim.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_tim.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_tim.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_tim.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_tsc.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_tsc.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_tsc.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_tsc.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_usart.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_usart.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_usart.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_usart.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_wwdg.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_wwdg.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_wwdg.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_std_periph_driver/src/n32wb452_wwdg.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_core.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_core.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_core.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_core.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_def.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_def.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_def.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_def.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_init.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_init.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_init.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_init.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_int.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_int.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_int.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_int.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_lib.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_lib.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_lib.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_lib.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_mem.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_mem.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_mem.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_mem.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_regs.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_regs.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_regs.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_regs.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_sil.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_sil.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_sil.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_sil.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_type.h b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_type.h similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_type.h rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/inc/usb_type.h diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_core.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_core.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_core.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_core.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_init.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_init.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_init.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_init.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_int.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_int.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_int.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_int.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_mem.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_mem.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_mem.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_mem.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_regs.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_regs.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_regs.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_regs.c diff --git a/bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_sil.c b/bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_sil.c similarity index 100% rename from bsp/n32/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_sil.c rename to bsp/n32/n32gxx_lxx/libraries/N32WB452_Firmware_Library/n32wb452_usbfs_driver/src/usb_sil.c diff --git a/bsp/n32/libraries/n32_drivers/Kconfig b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/Kconfig similarity index 100% rename from bsp/n32/libraries/n32_drivers/Kconfig rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/Kconfig diff --git a/bsp/n32/libraries/n32_drivers/SConscript b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/SConscript similarity index 100% rename from bsp/n32/libraries/n32_drivers/SConscript rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/SConscript diff --git a/bsp/n32/libraries/n32_drivers/drv_adc.c b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_adc.c similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_adc.c rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_adc.c diff --git a/bsp/n32/libraries/n32_drivers/drv_adc.h b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_adc.h similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_adc.h rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_adc.h diff --git a/bsp/n32/libraries/n32_drivers/drv_can.c b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_can.c similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_can.c rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_can.c diff --git a/bsp/n32/libraries/n32_drivers/drv_can.h b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_can.h similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_can.h rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_can.h diff --git a/bsp/n32/libraries/n32_drivers/drv_dac.c b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_dac.c similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_dac.c rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_dac.c diff --git a/bsp/n32/libraries/n32_drivers/drv_dac.h b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_dac.h similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_dac.h rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_dac.h diff --git a/bsp/n32/libraries/n32_drivers/drv_gpio.c b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_gpio.c similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_gpio.c rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_gpio.c diff --git a/bsp/n32/libraries/n32_drivers/drv_gpio.h b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_gpio.h similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_gpio.h rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_gpio.h diff --git a/bsp/n32/libraries/n32_drivers/drv_i2c.c b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_i2c.c similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_i2c.c rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_i2c.c diff --git a/bsp/n32/libraries/n32_drivers/drv_i2c.h b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_i2c.h similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_i2c.h rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_i2c.h diff --git a/bsp/n32/libraries/n32_drivers/drv_rtc.c b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_rtc.c similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_rtc.c rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_rtc.c diff --git a/bsp/n32/libraries/n32_drivers/drv_spi.c b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_spi.c similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_spi.c rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_spi.c diff --git a/bsp/n32/libraries/n32_drivers/drv_spi.h b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_spi.h similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_spi.h rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_spi.h diff --git a/bsp/n32/libraries/n32_drivers/drv_timer.c b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_timer.c similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_timer.c rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_timer.c diff --git a/bsp/n32/libraries/n32_drivers/drv_timer.h b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_timer.h similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_timer.h rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_timer.h diff --git a/bsp/n32/libraries/n32_drivers/drv_usart.c b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_usart.c similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_usart.c rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_usart.c diff --git a/bsp/n32/libraries/n32_drivers/drv_usart.h b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_usart.h similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_usart.h rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_usart.h diff --git a/bsp/n32/libraries/n32_drivers/drv_usart_v2.c b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_usart_v2.c similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_usart_v2.c rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_usart_v2.c diff --git a/bsp/n32/libraries/n32_drivers/drv_usart_v2.h b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_usart_v2.h similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_usart_v2.h rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_usart_v2.h diff --git a/bsp/n32/libraries/n32_drivers/drv_wdt.c b/bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_wdt.c similarity index 100% rename from bsp/n32/libraries/n32_drivers/drv_wdt.c rename to bsp/n32/n32gxx_lxx/libraries/n32_drivers/drv_wdt.c diff --git a/bsp/n32/n32g43xcl-stb/.config b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/.config similarity index 97% rename from bsp/n32/n32g43xcl-stb/.config rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/.config index 7f129ba8d9..83e11064d0 100644 --- a/bsp/n32/n32g43xcl-stb/.config +++ b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/.config @@ -179,7 +179,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -267,6 +267,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -361,8 +363,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -371,6 +371,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -572,6 +573,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -596,6 +598,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -644,6 +647,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -738,6 +744,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -893,7 +900,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -939,9 +962,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1066,6 +1091,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32g45xml-stb/Kconfig b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/Kconfig similarity index 88% rename from bsp/n32/n32g45xml-stb/Kconfig rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/Kconfig index 73238d3a13..07edfefc34 100644 --- a/bsp/n32/n32g45xml-stb/Kconfig +++ b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/Kconfig @@ -2,7 +2,7 @@ mainmenu "RT-Thread Configuration" BSP_DIR := . -RTT_DIR := ../../.. +RTT_DIR := ../../../.. PKGS_DIR := packages diff --git a/bsp/n32/n32g43xcl-stb/README.md b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/README.md similarity index 100% rename from bsp/n32/n32g43xcl-stb/README.md rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/README.md diff --git a/bsp/n32/n32g43xcl-stb/SConscript b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/SConscript similarity index 100% rename from bsp/n32/n32g43xcl-stb/SConscript rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/SConscript diff --git a/bsp/n32/n32g43xcl-stb/SConstruct b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/SConstruct similarity index 96% rename from bsp/n32/n32g43xcl-stb/SConstruct rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/SConstruct index a72e9bffee..605ee02867 100644 --- a/bsp/n32/n32g43xcl-stb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32g43xcl-stb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/applications/SConscript similarity index 100% rename from bsp/n32/n32g43xcl-stb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/applications/SConscript diff --git a/bsp/n32/n32g43xcl-stb/applications/main.c b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/applications/main.c similarity index 100% rename from bsp/n32/n32g43xcl-stb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/applications/main.c diff --git a/bsp/n32/n32g43xcl-stb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/Kconfig similarity index 100% rename from bsp/n32/n32g43xcl-stb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/Kconfig diff --git a/bsp/n32/n32g43xcl-stb/board/SConscript b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/SConscript similarity index 100% rename from bsp/n32/n32g43xcl-stb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/SConscript diff --git a/bsp/n32/n32g43xcl-stb/board/board.c b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/board.c similarity index 100% rename from bsp/n32/n32g43xcl-stb/board/board.c rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/board.c diff --git a/bsp/n32/n32g43xcl-stb/board/board.h b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/board.h similarity index 100% rename from bsp/n32/n32g43xcl-stb/board/board.h rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/board.h diff --git a/bsp/n32/n32g43xcl-stb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32g43xcl-stb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32g43xcl-stb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32g43xcl-stb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32g43xcl-stb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32g43xcl-stb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32g43xcl-stb/figures/board.jpg b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/figures/board.jpg similarity index 100% rename from bsp/n32/n32g43xcl-stb/figures/board.jpg rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/figures/board.jpg diff --git a/bsp/n32/n32g43xcl-stb/project.ewd b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/project.ewd similarity index 100% rename from bsp/n32/n32g43xcl-stb/project.ewd rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/project.ewd diff --git a/bsp/n32/n32g43xcl-stb/project.ewp b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/project.ewp similarity index 86% rename from bsp/n32/n32g43xcl-stb/project.ewp rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/project.ewp index 9a4a86e020..4a260e1d3e 100644 --- a/bsp/n32/n32g43xcl-stb/project.ewp +++ b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/project.ewp @@ -358,29 +358,30 @@
- Compiler - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.c - + CPU - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdlib.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cunistd.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 + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c - $PROJ_DIR$\..\..\..\components\drivers\core\device.c + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c - $PROJ_DIR$\..\..\..\components\drivers\misc\adc.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\adc.c - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -2339,142 +2308,169 @@ Finsh - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c - $PROJ_DIR$\..\..\..\components\finsh\cmd.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c - $PROJ_DIR$\..\..\..\components\finsh\msh.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c - $PROJ_DIR$\..\..\..\components\finsh\shell.c + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c Kernel - $PROJ_DIR$\..\..\..\src\clock.c + $PROJ_DIR$\..\..\..\..\src\clock.c - $PROJ_DIR$\..\..\..\src\components.c + $PROJ_DIR$\..\..\..\..\src\components.c - $PROJ_DIR$\..\..\..\src\cpu_up.c + $PROJ_DIR$\..\..\..\..\src\cpu_up.c - $PROJ_DIR$\..\..\..\src\defunct.c + $PROJ_DIR$\..\..\..\..\src\defunct.c - $PROJ_DIR$\..\..\..\src\idle.c + $PROJ_DIR$\..\..\..\..\src\idle.c - $PROJ_DIR$\..\..\..\src\ipc.c + $PROJ_DIR$\..\..\..\..\src\ipc.c - $PROJ_DIR$\..\..\..\src\irq.c + $PROJ_DIR$\..\..\..\..\src\irq.c - $PROJ_DIR$\..\..\..\src\kservice.c + $PROJ_DIR$\..\..\..\..\src\kservice.c - $PROJ_DIR$\..\..\..\src\mem.c + $PROJ_DIR$\..\..\..\..\src\mem.c - $PROJ_DIR$\..\..\..\src\memheap.c + $PROJ_DIR$\..\..\..\..\src\memheap.c - $PROJ_DIR$\..\..\..\src\mempool.c + $PROJ_DIR$\..\..\..\..\src\mempool.c - $PROJ_DIR$\..\..\..\src\object.c + $PROJ_DIR$\..\..\..\..\src\object.c - $PROJ_DIR$\..\..\..\src\scheduler_comm.c + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c - $PROJ_DIR$\..\..\..\src\scheduler_up.c + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c - $PROJ_DIR$\..\..\..\src\thread.c + $PROJ_DIR$\..\..\..\..\src\thread.c - $PROJ_DIR$\..\..\..\src\timer.c + $PROJ_DIR$\..\..\..\..\src\timer.c - klibc + Libc - $PROJ_DIR$\..\..\..\src\klibc\kstring.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.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 - - - libcpu - $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscalls.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c Libraries - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_rcc.c - - - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_dac.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\CMSIS\device\system_n32g43x.c $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_gpio.c - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\CMSIS\device\system_n32g43x.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_rcc.c $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_exti.c - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_usart.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\misc.c - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_flash.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_usart.c - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\misc.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_i2c.c - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_can.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_spi.c - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_tim.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_can.c - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_wwdg.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_adc.c - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_iwdg.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_dac.c - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_i2c.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_tim.c $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_rtc.c @@ -2483,14 +2479,14 @@ $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_pwr.c - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_spi.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_flash.c - $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_adc.c + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_iwdg.c + + + $PROJ_DIR$\..\libraries\N32G43x_Firmware_Library\n32g43x_std_periph_driver\src\n32g43x_wwdg.c - - - POSIX utc_UTest diff --git a/bsp/n32/n32g43xcl-stb/project.eww b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/project.eww similarity index 100% rename from bsp/n32/n32g43xcl-stb/project.eww rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/project.eww diff --git a/bsp/n32/n32g43xcl-stb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/project.uvoptx similarity index 100% rename from bsp/n32/n32g43xcl-stb/project.uvoptx rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/project.uvoptx diff --git a/bsp/n32/n32g43xcl-stb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/project.uvprojx similarity index 100% rename from bsp/n32/n32g43xcl-stb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/project.uvprojx diff --git a/bsp/n32/n32g43xcl-stb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/rtconfig.h similarity index 98% rename from bsp/n32/n32g43xcl-stb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/rtconfig.h index 9c8805bc9f..be4dfb4dc4 100644 --- a/bsp/n32/n32g43xcl-stb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ @@ -155,6 +155,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -327,6 +328,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32g457qel-stb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/rtconfig.py similarity index 97% rename from bsp/n32/n32g457qel-stb/rtconfig.py rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/rtconfig.py index 2a0371110c..c3765e6f08 100644 --- a/bsp/n32/n32g457qel-stb/rtconfig.py +++ b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32g43xcl-stb/template.ewp b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/template.ewp similarity index 100% rename from bsp/n32/n32g43xcl-stb/template.ewp rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/template.ewp diff --git a/bsp/n32/n32g43xcl-stb/template.eww b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/template.eww similarity index 100% rename from bsp/n32/n32g43xcl-stb/template.eww rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/template.eww diff --git a/bsp/n32/n32g43xcl-stb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/template.uvoptx similarity index 100% rename from bsp/n32/n32g43xcl-stb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/template.uvoptx diff --git a/bsp/n32/n32g43xcl-stb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32g43xcl-stb/template.uvprojx similarity index 100% rename from bsp/n32/n32g43xcl-stb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32g43xcl-stb/template.uvprojx diff --git a/bsp/n32/n32g45xrl-stb/.config b/bsp/n32/n32gxx_lxx/n32g457qel-stb/.config similarity index 97% rename from bsp/n32/n32g45xrl-stb/.config rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/.config index b8eb0410ff..25021739e8 100644 --- a/bsp/n32/n32g45xrl-stb/.config +++ b/bsp/n32/n32gxx_lxx/n32g457qel-stb/.config @@ -180,7 +180,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -274,6 +274,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -368,8 +370,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -378,6 +378,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -579,6 +580,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -604,6 +606,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -653,6 +656,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -747,6 +753,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -902,7 +909,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -948,9 +971,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1075,6 +1100,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32g457qel-stb/Kconfig b/bsp/n32/n32gxx_lxx/n32g457qel-stb/Kconfig similarity index 88% rename from bsp/n32/n32g457qel-stb/Kconfig rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/Kconfig index 73238d3a13..07edfefc34 100644 --- a/bsp/n32/n32g457qel-stb/Kconfig +++ b/bsp/n32/n32gxx_lxx/n32g457qel-stb/Kconfig @@ -2,7 +2,7 @@ mainmenu "RT-Thread Configuration" BSP_DIR := . -RTT_DIR := ../../.. +RTT_DIR := ../../../.. PKGS_DIR := packages diff --git a/bsp/n32/n32g457qel-stb/README.md b/bsp/n32/n32gxx_lxx/n32g457qel-stb/README.md similarity index 100% rename from bsp/n32/n32g457qel-stb/README.md rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/README.md diff --git a/bsp/n32/n32g457qel-stb/SConscript b/bsp/n32/n32gxx_lxx/n32g457qel-stb/SConscript similarity index 100% rename from bsp/n32/n32g457qel-stb/SConscript rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/SConscript diff --git a/bsp/n32/n32g45xcl-stb/SConstruct b/bsp/n32/n32gxx_lxx/n32g457qel-stb/SConstruct similarity index 96% rename from bsp/n32/n32g45xcl-stb/SConstruct rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/SConstruct index bc987cd14d..133a133cba 100644 --- a/bsp/n32/n32g45xcl-stb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32g457qel-stb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32g457qel-stb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32g457qel-stb/applications/SConscript similarity index 100% rename from bsp/n32/n32g457qel-stb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/applications/SConscript diff --git a/bsp/n32/n32g457qel-stb/applications/main.c b/bsp/n32/n32gxx_lxx/n32g457qel-stb/applications/main.c similarity index 100% rename from bsp/n32/n32g457qel-stb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/applications/main.c diff --git a/bsp/n32/n32g457qel-stb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32g457qel-stb/board/Kconfig similarity index 100% rename from bsp/n32/n32g457qel-stb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/board/Kconfig diff --git a/bsp/n32/n32g457qel-stb/board/SConscript b/bsp/n32/n32gxx_lxx/n32g457qel-stb/board/SConscript similarity index 100% rename from bsp/n32/n32g457qel-stb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/board/SConscript diff --git a/bsp/n32/n32g457qel-stb/board/board.c b/bsp/n32/n32gxx_lxx/n32g457qel-stb/board/board.c similarity index 100% rename from bsp/n32/n32g457qel-stb/board/board.c rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/board/board.c diff --git a/bsp/n32/n32g457qel-stb/board/board.h b/bsp/n32/n32gxx_lxx/n32g457qel-stb/board/board.h similarity index 100% rename from bsp/n32/n32g457qel-stb/board/board.h rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/board/board.h diff --git a/bsp/n32/n32g457qel-stb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32g457qel-stb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32g457qel-stb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32g457qel-stb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32g457qel-stb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32g457qel-stb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32g457qel-stb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32g457qel-stb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32g457qel-stb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32g457qel-stb/figures/board.jpg b/bsp/n32/n32gxx_lxx/n32g457qel-stb/figures/board.jpg similarity index 100% rename from bsp/n32/n32g457qel-stb/figures/board.jpg rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/figures/board.jpg diff --git a/bsp/n32/n32g457qel-stb/project.ewd b/bsp/n32/n32gxx_lxx/n32g457qel-stb/project.ewd similarity index 100% rename from bsp/n32/n32g457qel-stb/project.ewd rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/project.ewd diff --git a/bsp/n32/n32g457qel-stb/project.ewp b/bsp/n32/n32gxx_lxx/n32g457qel-stb/project.ewp similarity index 86% rename from bsp/n32/n32g457qel-stb/project.ewp rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/project.ewp index 8f1108bf10..51bcc9c6f6 100644 --- a/bsp/n32/n32g457qel-stb/project.ewp +++ b/bsp/n32/n32gxx_lxx/n32g457qel-stb/project.ewp @@ -358,29 +358,30 @@ - Compiler - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.c - - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdlib.c - + CPU - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\atomic_arm.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cunistd.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S - $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 + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c - $PROJ_DIR$\..\..\..\components\drivers\core\device.c + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c - $PROJ_DIR$\..\..\..\components\drivers\misc\adc.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\adc.c - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -2339,162 +2311,186 @@ Finsh - $PROJ_DIR$\..\..\..\components\finsh\shell.c + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c - $PROJ_DIR$\..\..\..\components\finsh\cmd.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c - $PROJ_DIR$\..\..\..\components\finsh\msh.c + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c Kernel - $PROJ_DIR$\..\..\..\src\clock.c + $PROJ_DIR$\..\..\..\..\src\clock.c - $PROJ_DIR$\..\..\..\src\components.c + $PROJ_DIR$\..\..\..\..\src\components.c - $PROJ_DIR$\..\..\..\src\cpu_up.c + $PROJ_DIR$\..\..\..\..\src\cpu_up.c - $PROJ_DIR$\..\..\..\src\defunct.c + $PROJ_DIR$\..\..\..\..\src\defunct.c - $PROJ_DIR$\..\..\..\src\idle.c + $PROJ_DIR$\..\..\..\..\src\idle.c - $PROJ_DIR$\..\..\..\src\ipc.c + $PROJ_DIR$\..\..\..\..\src\ipc.c - $PROJ_DIR$\..\..\..\src\irq.c + $PROJ_DIR$\..\..\..\..\src\irq.c - $PROJ_DIR$\..\..\..\src\kservice.c + $PROJ_DIR$\..\..\..\..\src\kservice.c - $PROJ_DIR$\..\..\..\src\mem.c + $PROJ_DIR$\..\..\..\..\src\mem.c - $PROJ_DIR$\..\..\..\src\memheap.c + $PROJ_DIR$\..\..\..\..\src\memheap.c - $PROJ_DIR$\..\..\..\src\mempool.c + $PROJ_DIR$\..\..\..\..\src\mempool.c - $PROJ_DIR$\..\..\..\src\object.c + $PROJ_DIR$\..\..\..\..\src\object.c - $PROJ_DIR$\..\..\..\src\scheduler_comm.c + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c - $PROJ_DIR$\..\..\..\src\scheduler_up.c + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c - $PROJ_DIR$\..\..\..\src\thread.c + $PROJ_DIR$\..\..\..\..\src\thread.c - $PROJ_DIR$\..\..\..\src\timer.c + $PROJ_DIR$\..\..\..\..\src\timer.c - klibc + Libc - $PROJ_DIR$\..\..\..\src\klibc\kstring.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.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 - - - libcpu - $PROJ_DIR$\..\..\..\libcpu\arm\common\atomic_arm.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_read.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.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 + + + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c Libraries - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c - - POSIX - utc_UTest diff --git a/bsp/n32/n32g457qel-stb/project.eww b/bsp/n32/n32gxx_lxx/n32g457qel-stb/project.eww similarity index 100% rename from bsp/n32/n32g457qel-stb/project.eww rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/project.eww diff --git a/bsp/n32/n32gxx_lxx/n32g457qel-stb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32g457qel-stb/project.uvoptx new file mode 100644 index 0000000000..f188c982c4 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g457qel-stb/project.uvoptx @@ -0,0 +1,1324 @@ + + + + 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\ + + + 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 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457QEL7$Flash\N32G45x.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 + + + + + CPU + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 2 + 5 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\can\dev_can.c + dev_can.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\adc.c + adc.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\dac.c + dac.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\rtc\dev_rtc.c + dev_rtc.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi.c + dev_spi.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi_core.c + dev_spi_core.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\watchdog\dev_watchdog.c + dev_watchdog.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 30 + 2 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\CMSIS\device\startup\startup_n32g45x.s + startup_n32g45x.s + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_adc.c + drv_adc.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_can.c + drv_can.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_dac.c + drv_dac.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_rtc.c + drv_rtc.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 4 + 39 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 4 + 40 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_wdt.c + drv_wdt.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libc + 0 + 0 + 0 + 0 + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 73 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 74 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c + system_n32g45x.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c + n32g45x_gpio.c + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c + n32g45x_rcc.c + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c + n32g45x_exti.c + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + misc.c + 0 + 0 + + + 8 + 79 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + n32g45x_usart.c + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c + n32g45x_dma.c + 0 + 0 + + + 8 + 81 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c + n32g45x_i2c.c + 0 + 0 + + + 8 + 82 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c + n32g45x_spi.c + 0 + 0 + + + 8 + 83 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c + n32g45x_can.c + 0 + 0 + + + 8 + 84 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c + n32g45x_adc.c + 0 + 0 + + + 8 + 85 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c + n32g45x_dac.c + 0 + 0 + + + 8 + 86 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c + n32g45x_tim.c + 0 + 0 + + + 8 + 87 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c + n32g45x_rtc.c + 0 + 0 + + + 8 + 88 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c + n32g45x_pwr.c + 0 + 0 + + + 8 + 89 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c + n32g45x_wwdg.c + 0 + 0 + + + 8 + 90 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c + n32g45x_iwdg.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/n32/n32g457qel-stb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32g457qel-stb/project.uvprojx similarity index 100% rename from bsp/n32/n32g457qel-stb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/project.uvprojx diff --git a/bsp/n32/n32g45xrl-stb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32g457qel-stb/rtconfig.h similarity index 98% rename from bsp/n32/n32g45xrl-stb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/rtconfig.h index e2e0b57871..506672db3f 100644 --- a/bsp/n32/n32g45xrl-stb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32g457qel-stb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define RT_USING_HW_ATOMIC @@ -160,6 +160,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -332,6 +333,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32g43xcl-stb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32g457qel-stb/rtconfig.py similarity index 97% rename from bsp/n32/n32g43xcl-stb/rtconfig.py rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/rtconfig.py index 2a0371110c..c3765e6f08 100644 --- a/bsp/n32/n32g43xcl-stb/rtconfig.py +++ b/bsp/n32/n32gxx_lxx/n32g457qel-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32g457qel-stb/template.ewp b/bsp/n32/n32gxx_lxx/n32g457qel-stb/template.ewp similarity index 100% rename from bsp/n32/n32g457qel-stb/template.ewp rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/template.ewp diff --git a/bsp/n32/n32g457qel-stb/template.eww b/bsp/n32/n32gxx_lxx/n32g457qel-stb/template.eww similarity index 100% rename from bsp/n32/n32g457qel-stb/template.eww rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/template.eww diff --git a/bsp/n32/n32g457qel-stb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32g457qel-stb/template.uvoptx similarity index 100% rename from bsp/n32/n32g457qel-stb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/template.uvoptx diff --git a/bsp/n32/n32g457qel-stb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32g457qel-stb/template.uvprojx similarity index 100% rename from bsp/n32/n32g457qel-stb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32g457qel-stb/template.uvprojx diff --git a/bsp/n32/n32g45xcl-stb/.config b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/.config similarity index 97% rename from bsp/n32/n32g45xcl-stb/.config rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/.config index 38a9ebefa7..ec0f05d433 100644 --- a/bsp/n32/n32g45xcl-stb/.config +++ b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/.config @@ -180,7 +180,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -274,6 +274,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -368,8 +370,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -378,6 +378,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -579,6 +580,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -604,6 +606,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -653,6 +656,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -747,6 +753,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -902,7 +909,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -948,9 +971,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1075,6 +1100,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32g43xcl-stb/Kconfig b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/Kconfig similarity index 88% rename from bsp/n32/n32g43xcl-stb/Kconfig rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/Kconfig index 73238d3a13..07edfefc34 100644 --- a/bsp/n32/n32g43xcl-stb/Kconfig +++ b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/Kconfig @@ -2,7 +2,7 @@ mainmenu "RT-Thread Configuration" BSP_DIR := . -RTT_DIR := ../../.. +RTT_DIR := ../../../.. PKGS_DIR := packages diff --git a/bsp/n32/n32g45xcl-stb/README.md b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/README.md similarity index 100% rename from bsp/n32/n32g45xcl-stb/README.md rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/README.md diff --git a/bsp/n32/n32g45xcl-stb/SConscript b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/SConscript similarity index 100% rename from bsp/n32/n32g45xcl-stb/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/SConscript diff --git a/bsp/n32/n32g457qel-stb/SConstruct b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/SConstruct similarity index 96% rename from bsp/n32/n32g457qel-stb/SConstruct rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/SConstruct index bc987cd14d..133a133cba 100644 --- a/bsp/n32/n32g457qel-stb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32g45xcl-stb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/applications/SConscript similarity index 100% rename from bsp/n32/n32g45xcl-stb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/applications/SConscript diff --git a/bsp/n32/n32g45xcl-stb/applications/main.c b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/applications/main.c similarity index 100% rename from bsp/n32/n32g45xcl-stb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/applications/main.c diff --git a/bsp/n32/n32g45xcl-stb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/Kconfig similarity index 100% rename from bsp/n32/n32g45xcl-stb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/Kconfig diff --git a/bsp/n32/n32g45xcl-stb/board/SConscript b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/SConscript similarity index 100% rename from bsp/n32/n32g45xcl-stb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/SConscript diff --git a/bsp/n32/n32g45xcl-stb/board/board.c b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/board.c similarity index 100% rename from bsp/n32/n32g45xcl-stb/board/board.c rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/board.c diff --git a/bsp/n32/n32g45xcl-stb/board/board.h b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/board.h similarity index 100% rename from bsp/n32/n32g45xcl-stb/board/board.h rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/board.h diff --git a/bsp/n32/n32g45xcl-stb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32g45xcl-stb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32g45xcl-stb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32g45xcl-stb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32g45xcl-stb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32g45xcl-stb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32g45xcl-stb/figures/board.png b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/figures/board.png similarity index 100% rename from bsp/n32/n32g45xcl-stb/figures/board.png rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/figures/board.png diff --git a/bsp/n32/n32g45xcl-stb/project.ewd b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.ewd similarity index 100% rename from bsp/n32/n32g45xcl-stb/project.ewd rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.ewd diff --git a/bsp/n32/n32g45xcl-stb/project.ewp b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.ewp similarity index 86% rename from bsp/n32/n32g45xcl-stb/project.ewp rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.ewp index 8e9be79e66..525c4bad72 100644 --- a/bsp/n32/n32g45xcl-stb/project.ewp +++ b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.ewp @@ -358,29 +358,30 @@
- Compiler - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.c - + CPU - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdlib.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\atomic_arm.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cunistd.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S - $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 + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c - $PROJ_DIR$\..\..\..\components\drivers\core\device.c + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c - $PROJ_DIR$\..\..\..\components\drivers\misc\adc.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\adc.c - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -2339,110 +2311,134 @@ Finsh - $PROJ_DIR$\..\..\..\components\finsh\shell.c + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c - $PROJ_DIR$\..\..\..\components\finsh\cmd.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c - $PROJ_DIR$\..\..\..\components\finsh\msh.c + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c Kernel - $PROJ_DIR$\..\..\..\src\clock.c + $PROJ_DIR$\..\..\..\..\src\clock.c - $PROJ_DIR$\..\..\..\src\components.c + $PROJ_DIR$\..\..\..\..\src\components.c - $PROJ_DIR$\..\..\..\src\cpu_up.c + $PROJ_DIR$\..\..\..\..\src\cpu_up.c - $PROJ_DIR$\..\..\..\src\defunct.c + $PROJ_DIR$\..\..\..\..\src\defunct.c - $PROJ_DIR$\..\..\..\src\idle.c + $PROJ_DIR$\..\..\..\..\src\idle.c - $PROJ_DIR$\..\..\..\src\ipc.c + $PROJ_DIR$\..\..\..\..\src\ipc.c - $PROJ_DIR$\..\..\..\src\irq.c + $PROJ_DIR$\..\..\..\..\src\irq.c - $PROJ_DIR$\..\..\..\src\kservice.c + $PROJ_DIR$\..\..\..\..\src\kservice.c - $PROJ_DIR$\..\..\..\src\mem.c + $PROJ_DIR$\..\..\..\..\src\mem.c - $PROJ_DIR$\..\..\..\src\memheap.c + $PROJ_DIR$\..\..\..\..\src\memheap.c - $PROJ_DIR$\..\..\..\src\mempool.c + $PROJ_DIR$\..\..\..\..\src\mempool.c - $PROJ_DIR$\..\..\..\src\object.c + $PROJ_DIR$\..\..\..\..\src\object.c - $PROJ_DIR$\..\..\..\src\scheduler_comm.c + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c - $PROJ_DIR$\..\..\..\src\scheduler_up.c + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c - $PROJ_DIR$\..\..\..\src\thread.c + $PROJ_DIR$\..\..\..\..\src\thread.c - $PROJ_DIR$\..\..\..\src\timer.c + $PROJ_DIR$\..\..\..\..\src\timer.c - klibc + Libc - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c - $PROJ_DIR$\..\..\..\src\klibc\kstring.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.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 - - - libcpu - $PROJ_DIR$\..\..\..\libcpu\arm\common\atomic_arm.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_write.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscalls.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c Libraries - - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c @@ -2450,50 +2446,50 @@ $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c - - - POSIX utc_UTest diff --git a/bsp/n32/n32g45xcl-stb/project.eww b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.eww similarity index 100% rename from bsp/n32/n32g45xcl-stb/project.eww rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.eww diff --git a/bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.uvoptx new file mode 100644 index 0000000000..dffdf2bc24 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.uvoptx @@ -0,0 +1,1329 @@ + + + + 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\ + + + 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 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL040000 -FS08000000 -FP0($$Device:N32G455CCL7$Flash\N32G45x.FLM) + + + 0 + CMSIS_AGDI + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL040000 -FS08000000 -FP0($$Device:N32G455CCL7$Flash\N32G45x.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 + + + + + CPU + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 2 + 5 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\can\dev_can.c + dev_can.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\adc.c + adc.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\dac.c + dac.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\rtc\dev_rtc.c + dev_rtc.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi.c + dev_spi.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi_core.c + dev_spi_core.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\watchdog\dev_watchdog.c + dev_watchdog.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 30 + 2 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\CMSIS\device\startup\startup_n32g45x.s + startup_n32g45x.s + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_adc.c + drv_adc.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_can.c + drv_can.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_dac.c + drv_dac.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_rtc.c + drv_rtc.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 4 + 39 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 4 + 40 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_wdt.c + drv_wdt.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libc + 0 + 0 + 0 + 0 + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 73 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 74 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c + system_n32g45x.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c + n32g45x_gpio.c + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c + n32g45x_rcc.c + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c + n32g45x_exti.c + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + misc.c + 0 + 0 + + + 8 + 79 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + n32g45x_usart.c + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c + n32g45x_dma.c + 0 + 0 + + + 8 + 81 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c + n32g45x_i2c.c + 0 + 0 + + + 8 + 82 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c + n32g45x_spi.c + 0 + 0 + + + 8 + 83 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c + n32g45x_can.c + 0 + 0 + + + 8 + 84 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c + n32g45x_adc.c + 0 + 0 + + + 8 + 85 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c + n32g45x_dac.c + 0 + 0 + + + 8 + 86 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c + n32g45x_tim.c + 0 + 0 + + + 8 + 87 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c + n32g45x_rtc.c + 0 + 0 + + + 8 + 88 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c + n32g45x_pwr.c + 0 + 0 + + + 8 + 89 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c + n32g45x_wwdg.c + 0 + 0 + + + 8 + 90 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c + n32g45x_iwdg.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/n32/n32g45xcl-stb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.uvprojx similarity index 100% rename from bsp/n32/n32g45xcl-stb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/project.uvprojx diff --git a/bsp/n32/n32g45xcl-stb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/rtconfig.h similarity index 98% rename from bsp/n32/n32g45xcl-stb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/rtconfig.h index e2e0b57871..506672db3f 100644 --- a/bsp/n32/n32g45xcl-stb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define RT_USING_HW_ATOMIC @@ -160,6 +160,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -332,6 +333,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32g45xcl-stb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/rtconfig.py similarity index 97% rename from bsp/n32/n32g45xcl-stb/rtconfig.py rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/rtconfig.py index 2a0371110c..c3765e6f08 100644 --- a/bsp/n32/n32g45xcl-stb/rtconfig.py +++ b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32g45xcl-stb/template.ewp b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/template.ewp similarity index 100% rename from bsp/n32/n32g45xcl-stb/template.ewp rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/template.ewp diff --git a/bsp/n32/n32g45xcl-stb/template.eww b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/template.eww similarity index 100% rename from bsp/n32/n32g45xcl-stb/template.eww rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/template.eww diff --git a/bsp/n32/n32g45xcl-stb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/template.uvoptx similarity index 100% rename from bsp/n32/n32g45xcl-stb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/template.uvoptx diff --git a/bsp/n32/n32g45xcl-stb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32g45xcl-stb/template.uvprojx similarity index 100% rename from bsp/n32/n32g45xcl-stb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32g45xcl-stb/template.uvprojx diff --git a/bsp/n32/n32g457qel-stb/.config b/bsp/n32/n32gxx_lxx/n32g45xml-stb/.config similarity index 97% rename from bsp/n32/n32g457qel-stb/.config rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/.config index b8eb0410ff..25021739e8 100644 --- a/bsp/n32/n32g457qel-stb/.config +++ b/bsp/n32/n32gxx_lxx/n32g45xml-stb/.config @@ -180,7 +180,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -274,6 +274,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -368,8 +370,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -378,6 +378,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -579,6 +580,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -604,6 +606,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -653,6 +656,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -747,6 +753,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -902,7 +909,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -948,9 +971,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1075,6 +1100,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32g45xcl-stb/Kconfig b/bsp/n32/n32gxx_lxx/n32g45xml-stb/Kconfig similarity index 88% rename from bsp/n32/n32g45xcl-stb/Kconfig rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/Kconfig index 73238d3a13..07edfefc34 100644 --- a/bsp/n32/n32g45xcl-stb/Kconfig +++ b/bsp/n32/n32gxx_lxx/n32g45xml-stb/Kconfig @@ -2,7 +2,7 @@ mainmenu "RT-Thread Configuration" BSP_DIR := . -RTT_DIR := ../../.. +RTT_DIR := ../../../.. PKGS_DIR := packages diff --git a/bsp/n32/n32g45xml-stb/README.md b/bsp/n32/n32gxx_lxx/n32g45xml-stb/README.md similarity index 100% rename from bsp/n32/n32g45xml-stb/README.md rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/README.md diff --git a/bsp/n32/n32g45xml-stb/SConscript b/bsp/n32/n32gxx_lxx/n32g45xml-stb/SConscript similarity index 100% rename from bsp/n32/n32g45xml-stb/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/SConscript diff --git a/bsp/n32/n32g45xml-stb/SConstruct b/bsp/n32/n32gxx_lxx/n32g45xml-stb/SConstruct similarity index 96% rename from bsp/n32/n32g45xml-stb/SConstruct rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/SConstruct index d6b0922512..c826a74f7f 100644 --- a/bsp/n32/n32g45xml-stb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32g45xml-stb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32g45xml-stb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32g45xml-stb/applications/SConscript similarity index 100% rename from bsp/n32/n32g45xml-stb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/applications/SConscript diff --git a/bsp/n32/n32g45xml-stb/applications/main.c b/bsp/n32/n32gxx_lxx/n32g45xml-stb/applications/main.c similarity index 100% rename from bsp/n32/n32g45xml-stb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/applications/main.c diff --git a/bsp/n32/n32g45xml-stb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32g45xml-stb/board/Kconfig similarity index 100% rename from bsp/n32/n32g45xml-stb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/board/Kconfig diff --git a/bsp/n32/n32g45xml-stb/board/SConscript b/bsp/n32/n32gxx_lxx/n32g45xml-stb/board/SConscript similarity index 100% rename from bsp/n32/n32g45xml-stb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/board/SConscript diff --git a/bsp/n32/n32g45xml-stb/board/board.c b/bsp/n32/n32gxx_lxx/n32g45xml-stb/board/board.c similarity index 100% rename from bsp/n32/n32g45xml-stb/board/board.c rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/board/board.c diff --git a/bsp/n32/n32g45xml-stb/board/board.h b/bsp/n32/n32gxx_lxx/n32g45xml-stb/board/board.h similarity index 100% rename from bsp/n32/n32g45xml-stb/board/board.h rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/board/board.h diff --git a/bsp/n32/n32g45xml-stb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32g45xml-stb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32g45xml-stb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32g45xml-stb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32g45xml-stb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32g45xml-stb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32g45xml-stb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32g45xml-stb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32g45xml-stb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32g45xml-stb/figures/board.png b/bsp/n32/n32gxx_lxx/n32g45xml-stb/figures/board.png similarity index 100% rename from bsp/n32/n32g45xml-stb/figures/board.png rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/figures/board.png diff --git a/bsp/n32/n32g45xml-stb/project.ewd b/bsp/n32/n32gxx_lxx/n32g45xml-stb/project.ewd similarity index 100% rename from bsp/n32/n32g45xml-stb/project.ewd rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/project.ewd diff --git a/bsp/n32/n32g45xml-stb/project.ewp b/bsp/n32/n32gxx_lxx/n32g45xml-stb/project.ewp similarity index 86% rename from bsp/n32/n32g45xml-stb/project.ewp rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/project.ewp index 6f05d12e06..6e2225de3d 100644 --- a/bsp/n32/n32g45xml-stb/project.ewp +++ b/bsp/n32/n32gxx_lxx/n32g45xml-stb/project.ewp @@ -358,29 +358,30 @@
- Compiler - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.c - - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdlib.c - + CPU - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\atomic_arm.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cunistd.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S - $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 + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c - $PROJ_DIR$\..\..\..\components\drivers\core\device.c + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c - $PROJ_DIR$\..\..\..\components\drivers\misc\adc.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\adc.c - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -2339,128 +2311,152 @@ Finsh - $PROJ_DIR$\..\..\..\components\finsh\shell.c + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c - $PROJ_DIR$\..\..\..\components\finsh\cmd.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c - $PROJ_DIR$\..\..\..\components\finsh\msh.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c Kernel - $PROJ_DIR$\..\..\..\src\clock.c + $PROJ_DIR$\..\..\..\..\src\clock.c - $PROJ_DIR$\..\..\..\src\components.c + $PROJ_DIR$\..\..\..\..\src\components.c - $PROJ_DIR$\..\..\..\src\cpu_up.c + $PROJ_DIR$\..\..\..\..\src\cpu_up.c - $PROJ_DIR$\..\..\..\src\defunct.c + $PROJ_DIR$\..\..\..\..\src\defunct.c - $PROJ_DIR$\..\..\..\src\idle.c + $PROJ_DIR$\..\..\..\..\src\idle.c - $PROJ_DIR$\..\..\..\src\ipc.c + $PROJ_DIR$\..\..\..\..\src\ipc.c - $PROJ_DIR$\..\..\..\src\irq.c + $PROJ_DIR$\..\..\..\..\src\irq.c - $PROJ_DIR$\..\..\..\src\kservice.c + $PROJ_DIR$\..\..\..\..\src\kservice.c - $PROJ_DIR$\..\..\..\src\mem.c + $PROJ_DIR$\..\..\..\..\src\mem.c - $PROJ_DIR$\..\..\..\src\memheap.c + $PROJ_DIR$\..\..\..\..\src\memheap.c - $PROJ_DIR$\..\..\..\src\mempool.c + $PROJ_DIR$\..\..\..\..\src\mempool.c - $PROJ_DIR$\..\..\..\src\object.c + $PROJ_DIR$\..\..\..\..\src\object.c - $PROJ_DIR$\..\..\..\src\scheduler_comm.c + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c - $PROJ_DIR$\..\..\..\src\scheduler_up.c + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c - $PROJ_DIR$\..\..\..\src\thread.c + $PROJ_DIR$\..\..\..\..\src\thread.c - $PROJ_DIR$\..\..\..\src\timer.c + $PROJ_DIR$\..\..\..\..\src\timer.c - klibc + Libc - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c - $PROJ_DIR$\..\..\..\src\klibc\kstring.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.c - - - libcpu - $PROJ_DIR$\..\..\..\libcpu\arm\common\atomic_arm.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cwchar.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\environ.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_close.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c - - - Libraries - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_read.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_remove.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_write.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscalls.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c + + + + Libraries + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c @@ -2468,33 +2464,33 @@ $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c - - POSIX - utc_UTest diff --git a/bsp/n32/n32g45xml-stb/project.eww b/bsp/n32/n32gxx_lxx/n32g45xml-stb/project.eww similarity index 100% rename from bsp/n32/n32g45xml-stb/project.eww rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/project.eww diff --git a/bsp/n32/n32gxx_lxx/n32g45xml-stb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32g45xml-stb/project.uvoptx new file mode 100644 index 0000000000..f6a691da2f --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g45xml-stb/project.uvoptx @@ -0,0 +1,1329 @@ + + + + 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\ + + + 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 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457MEL7$Flash\N32G45x.FLM) + + + 0 + CMSIS_AGDI + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457MEL7$Flash\N32G45x.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 + + + + + CPU + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 2 + 5 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\can\dev_can.c + dev_can.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\adc.c + adc.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\dac.c + dac.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\rtc\dev_rtc.c + dev_rtc.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi.c + dev_spi.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi_core.c + dev_spi_core.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\watchdog\dev_watchdog.c + dev_watchdog.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 30 + 2 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\CMSIS\device\startup\startup_n32g45x.s + startup_n32g45x.s + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_adc.c + drv_adc.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_can.c + drv_can.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_dac.c + drv_dac.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_rtc.c + drv_rtc.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 4 + 39 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 4 + 40 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_wdt.c + drv_wdt.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libc + 0 + 0 + 0 + 0 + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 73 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 74 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c + system_n32g45x.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c + n32g45x_gpio.c + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c + n32g45x_rcc.c + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c + n32g45x_exti.c + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + misc.c + 0 + 0 + + + 8 + 79 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + n32g45x_usart.c + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c + n32g45x_dma.c + 0 + 0 + + + 8 + 81 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c + n32g45x_i2c.c + 0 + 0 + + + 8 + 82 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c + n32g45x_spi.c + 0 + 0 + + + 8 + 83 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c + n32g45x_can.c + 0 + 0 + + + 8 + 84 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c + n32g45x_adc.c + 0 + 0 + + + 8 + 85 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c + n32g45x_dac.c + 0 + 0 + + + 8 + 86 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c + n32g45x_tim.c + 0 + 0 + + + 8 + 87 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c + n32g45x_rtc.c + 0 + 0 + + + 8 + 88 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c + n32g45x_pwr.c + 0 + 0 + + + 8 + 89 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c + n32g45x_wwdg.c + 0 + 0 + + + 8 + 90 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c + n32g45x_iwdg.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/n32/n32g45xml-stb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32g45xml-stb/project.uvprojx similarity index 100% rename from bsp/n32/n32g45xml-stb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/project.uvprojx diff --git a/bsp/n32/n32g45xml-stb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32g45xml-stb/rtconfig.h similarity index 98% rename from bsp/n32/n32g45xml-stb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/rtconfig.h index e2e0b57871..506672db3f 100644 --- a/bsp/n32/n32g45xml-stb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32g45xml-stb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define RT_USING_HW_ATOMIC @@ -160,6 +160,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -332,6 +333,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32g45xml-stb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32g45xml-stb/rtconfig.py similarity index 97% rename from bsp/n32/n32g45xml-stb/rtconfig.py rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/rtconfig.py index 2a0371110c..c3765e6f08 100644 --- a/bsp/n32/n32g45xml-stb/rtconfig.py +++ b/bsp/n32/n32gxx_lxx/n32g45xml-stb/rtconfig.py @@ -73,7 +73,7 @@ elif PLATFORM == 'armcc': DEVICE = ' --cpu Cortex-M4.fp ' CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' diff --git a/bsp/n32/n32g45xml-stb/template.ewp b/bsp/n32/n32gxx_lxx/n32g45xml-stb/template.ewp similarity index 100% rename from bsp/n32/n32g45xml-stb/template.ewp rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/template.ewp diff --git a/bsp/n32/n32g45xml-stb/template.eww b/bsp/n32/n32gxx_lxx/n32g45xml-stb/template.eww similarity index 100% rename from bsp/n32/n32g45xml-stb/template.eww rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/template.eww diff --git a/bsp/n32/n32g45xml-stb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32g45xml-stb/template.uvoptx similarity index 100% rename from bsp/n32/n32g45xml-stb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/template.uvoptx diff --git a/bsp/n32/n32g45xml-stb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32g45xml-stb/template.uvprojx similarity index 100% rename from bsp/n32/n32g45xml-stb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32g45xml-stb/template.uvprojx diff --git a/bsp/n32/n32g45xml-stb/.config b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/.config similarity index 97% rename from bsp/n32/n32g45xml-stb/.config rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/.config index b8eb0410ff..25021739e8 100644 --- a/bsp/n32/n32g45xml-stb/.config +++ b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/.config @@ -180,7 +180,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -274,6 +274,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -368,8 +370,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -378,6 +378,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -579,6 +580,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -604,6 +606,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -653,6 +656,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -747,6 +753,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -902,7 +909,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -948,9 +971,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1075,6 +1100,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32gxx_lxx/n32g45xrl-stb/Kconfig b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/Kconfig new file mode 100644 index 0000000000..07edfefc34 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/n32/n32g45xrl-stb/README.md b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/README.md similarity index 100% rename from bsp/n32/n32g45xrl-stb/README.md rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/README.md diff --git a/bsp/n32/n32g45xrl-stb/SConscript b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/SConscript similarity index 100% rename from bsp/n32/n32g45xrl-stb/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/SConscript diff --git a/bsp/n32/n32g45xrl-stb/SConstruct b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/SConstruct similarity index 96% rename from bsp/n32/n32g45xrl-stb/SConstruct rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/SConstruct index bc987cd14d..133a133cba 100644 --- a/bsp/n32/n32g45xrl-stb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32g45xrl-stb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/applications/SConscript similarity index 100% rename from bsp/n32/n32g45xrl-stb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/applications/SConscript diff --git a/bsp/n32/n32g45xrl-stb/applications/main.c b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/applications/main.c similarity index 100% rename from bsp/n32/n32g45xrl-stb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/applications/main.c diff --git a/bsp/n32/n32g45xrl-stb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/Kconfig similarity index 100% rename from bsp/n32/n32g45xrl-stb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/Kconfig diff --git a/bsp/n32/n32g45xrl-stb/board/SConscript b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/SConscript similarity index 100% rename from bsp/n32/n32g45xrl-stb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/SConscript diff --git a/bsp/n32/n32g45xrl-stb/board/board.c b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/board.c similarity index 100% rename from bsp/n32/n32g45xrl-stb/board/board.c rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/board.c diff --git a/bsp/n32/n32g45xrl-stb/board/board.h b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/board.h similarity index 100% rename from bsp/n32/n32g45xrl-stb/board/board.h rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/board.h diff --git a/bsp/n32/n32g45xrl-stb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32g45xrl-stb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32g45xrl-stb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32g45xrl-stb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32g45xrl-stb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32g45xrl-stb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32g45xrl-stb/figures/board.jpg b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/figures/board.jpg similarity index 100% rename from bsp/n32/n32g45xrl-stb/figures/board.jpg rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/figures/board.jpg diff --git a/bsp/n32/n32g45xrl-stb/project.ewd b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.ewd similarity index 100% rename from bsp/n32/n32g45xrl-stb/project.ewd rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.ewd diff --git a/bsp/n32/n32g45xrl-stb/project.ewp b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.ewp similarity index 86% rename from bsp/n32/n32g45xrl-stb/project.ewp rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.ewp index 1a898830f0..060d36f879 100644 --- a/bsp/n32/n32g45xrl-stb/project.ewp +++ b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.ewp @@ -358,29 +358,30 @@
- Compiler - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.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\cunistd.c - - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c - + CPU - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\environ.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\atomic_arm.c - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_close.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_mem.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S - $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 + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c - $PROJ_DIR$\..\..\..\components\drivers\core\device.c + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c - $PROJ_DIR$\..\..\..\components\drivers\misc\adc.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\adc.c - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -2339,109 +2311,139 @@ Finsh - $PROJ_DIR$\..\..\..\components\finsh\cmd.c + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c - $PROJ_DIR$\..\..\..\components\finsh\msh.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c - $PROJ_DIR$\..\..\..\components\finsh\shell.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c Kernel - $PROJ_DIR$\..\..\..\src\clock.c + $PROJ_DIR$\..\..\..\..\src\clock.c - $PROJ_DIR$\..\..\..\src\components.c + $PROJ_DIR$\..\..\..\..\src\components.c - $PROJ_DIR$\..\..\..\src\cpu_up.c + $PROJ_DIR$\..\..\..\..\src\cpu_up.c - $PROJ_DIR$\..\..\..\src\defunct.c + $PROJ_DIR$\..\..\..\..\src\defunct.c - $PROJ_DIR$\..\..\..\src\idle.c + $PROJ_DIR$\..\..\..\..\src\idle.c - $PROJ_DIR$\..\..\..\src\ipc.c + $PROJ_DIR$\..\..\..\..\src\ipc.c - $PROJ_DIR$\..\..\..\src\irq.c + $PROJ_DIR$\..\..\..\..\src\irq.c - $PROJ_DIR$\..\..\..\src\kservice.c + $PROJ_DIR$\..\..\..\..\src\kservice.c - $PROJ_DIR$\..\..\..\src\mem.c + $PROJ_DIR$\..\..\..\..\src\mem.c - $PROJ_DIR$\..\..\..\src\memheap.c + $PROJ_DIR$\..\..\..\..\src\memheap.c - $PROJ_DIR$\..\..\..\src\mempool.c + $PROJ_DIR$\..\..\..\..\src\mempool.c - $PROJ_DIR$\..\..\..\src\object.c + $PROJ_DIR$\..\..\..\..\src\object.c - $PROJ_DIR$\..\..\..\src\scheduler_comm.c + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c - $PROJ_DIR$\..\..\..\src\scheduler_up.c + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c - $PROJ_DIR$\..\..\..\src\thread.c + $PROJ_DIR$\..\..\..\..\src\thread.c - $PROJ_DIR$\..\..\..\src\timer.c + $PROJ_DIR$\..\..\..\..\src\timer.c - klibc + Libc - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c - $PROJ_DIR$\..\..\..\src\klibc\kstring.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cwchar.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\environ.c - - - libcpu - $PROJ_DIR$\..\..\..\libcpu\arm\common\atomic_arm.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_close.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.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 + + + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c Libraries - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c @@ -2450,37 +2452,37 @@ $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c @@ -2488,12 +2490,6 @@ $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c - - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c - - - - POSIX utc_UTest diff --git a/bsp/n32/n32g45xrl-stb/project.eww b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.eww similarity index 100% rename from bsp/n32/n32g45xrl-stb/project.eww rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.eww diff --git a/bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.uvoptx new file mode 100644 index 0000000000..de16f2dbab --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.uvoptx @@ -0,0 +1,1329 @@ + + + + 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\ + + + 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 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457REL7$Flash\N32G45x.FLM) + + + 0 + CMSIS_AGDI + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457REL7$Flash\N32G45x.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 + + + + + CPU + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 2 + 5 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\can\dev_can.c + dev_can.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\adc.c + adc.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\dac.c + dac.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\rtc\dev_rtc.c + dev_rtc.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi.c + dev_spi.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi_core.c + dev_spi_core.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\watchdog\dev_watchdog.c + dev_watchdog.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 30 + 2 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\CMSIS\device\startup\startup_n32g45x.s + startup_n32g45x.s + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_adc.c + drv_adc.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_can.c + drv_can.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_dac.c + drv_dac.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_rtc.c + drv_rtc.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 4 + 39 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 4 + 40 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_wdt.c + drv_wdt.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libc + 0 + 0 + 0 + 0 + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 73 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 74 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c + system_n32g45x.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c + n32g45x_gpio.c + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c + n32g45x_rcc.c + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c + n32g45x_exti.c + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + misc.c + 0 + 0 + + + 8 + 79 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + n32g45x_usart.c + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c + n32g45x_dma.c + 0 + 0 + + + 8 + 81 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c + n32g45x_i2c.c + 0 + 0 + + + 8 + 82 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c + n32g45x_spi.c + 0 + 0 + + + 8 + 83 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c + n32g45x_can.c + 0 + 0 + + + 8 + 84 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c + n32g45x_adc.c + 0 + 0 + + + 8 + 85 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c + n32g45x_dac.c + 0 + 0 + + + 8 + 86 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c + n32g45x_tim.c + 0 + 0 + + + 8 + 87 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c + n32g45x_rtc.c + 0 + 0 + + + 8 + 88 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c + n32g45x_pwr.c + 0 + 0 + + + 8 + 89 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c + n32g45x_wwdg.c + 0 + 0 + + + 8 + 90 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c + n32g45x_iwdg.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/n32/n32g45xrl-stb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.uvprojx similarity index 100% rename from bsp/n32/n32g45xrl-stb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/project.uvprojx diff --git a/bsp/n32/n32g457qel-stb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/rtconfig.h similarity index 98% rename from bsp/n32/n32g457qel-stb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/rtconfig.h index e2e0b57871..506672db3f 100644 --- a/bsp/n32/n32g457qel-stb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define RT_USING_HW_ATOMIC @@ -160,6 +160,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -332,6 +333,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32gxx_lxx/n32g45xrl-stb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/rtconfig.py new file mode 100644 index 0000000000..c3765e6f08 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' + 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 rtthread.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-M4.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' + CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -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-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + 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-M4' + AFLAGS += ' --fpu VFPv4_sp' + 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/n32/n32g45xrl-stb/template.ewp b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/template.ewp similarity index 100% rename from bsp/n32/n32g45xrl-stb/template.ewp rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/template.ewp diff --git a/bsp/n32/n32g45xrl-stb/template.eww b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/template.eww similarity index 100% rename from bsp/n32/n32g45xrl-stb/template.eww rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/template.eww diff --git a/bsp/n32/n32g45xrl-stb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/template.uvoptx similarity index 100% rename from bsp/n32/n32g45xrl-stb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/template.uvoptx diff --git a/bsp/n32/n32g45xrl-stb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32g45xrl-stb/template.uvprojx similarity index 100% rename from bsp/n32/n32g45xrl-stb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32g45xrl-stb/template.uvprojx diff --git a/bsp/n32/n32g45xvl-stb/.ci/attachconfig/ci.attachconfig.yml b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/.ci/attachconfig/ci.attachconfig.yml similarity index 100% rename from bsp/n32/n32g45xvl-stb/.ci/attachconfig/ci.attachconfig.yml rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/.ci/attachconfig/ci.attachconfig.yml diff --git a/bsp/n32/n32g45xvl-stb/.config b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/.config similarity index 97% rename from bsp/n32/n32g45xvl-stb/.config rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/.config index cb8bfc253e..972176a480 100644 --- a/bsp/n32/n32g45xvl-stb/.config +++ b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/.config @@ -180,7 +180,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -274,6 +274,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -368,8 +370,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -378,6 +378,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -579,6 +580,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -604,6 +606,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -653,6 +656,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -747,6 +753,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -902,7 +909,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -948,9 +971,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1075,6 +1100,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32gxx_lxx/n32g45xvl-stb/Kconfig b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/Kconfig new file mode 100644 index 0000000000..07edfefc34 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/n32/n32g45xvl-stb/README.md b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/README.md similarity index 100% rename from bsp/n32/n32g45xvl-stb/README.md rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/README.md diff --git a/bsp/n32/n32g45xvl-stb/SConscript b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/SConscript similarity index 100% rename from bsp/n32/n32g45xvl-stb/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/SConscript diff --git a/bsp/n32/n32g45xvl-stb/SConstruct b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/SConstruct similarity index 96% rename from bsp/n32/n32g45xvl-stb/SConstruct rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/SConstruct index bc987cd14d..133a133cba 100644 --- a/bsp/n32/n32g45xvl-stb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32g45xvl-stb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/applications/SConscript similarity index 100% rename from bsp/n32/n32g45xvl-stb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/applications/SConscript diff --git a/bsp/n32/n32g45xvl-stb/applications/main.c b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/applications/main.c similarity index 100% rename from bsp/n32/n32g45xvl-stb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/applications/main.c diff --git a/bsp/n32/n32g45xvl-stb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/Kconfig similarity index 100% rename from bsp/n32/n32g45xvl-stb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/Kconfig diff --git a/bsp/n32/n32g45xvl-stb/board/SConscript b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/SConscript similarity index 100% rename from bsp/n32/n32g45xvl-stb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/SConscript diff --git a/bsp/n32/n32g45xvl-stb/board/board.c b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/board.c similarity index 100% rename from bsp/n32/n32g45xvl-stb/board/board.c rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/board.c diff --git a/bsp/n32/n32g45xvl-stb/board/board.h b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/board.h similarity index 100% rename from bsp/n32/n32g45xvl-stb/board/board.h rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/board.h diff --git a/bsp/n32/n32g45xvl-stb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32g45xvl-stb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32g45xvl-stb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32g45xvl-stb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32g45xvl-stb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32g45xvl-stb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32g45xvl-stb/figures/board.jpg b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/figures/board.jpg similarity index 100% rename from bsp/n32/n32g45xvl-stb/figures/board.jpg rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/figures/board.jpg diff --git a/bsp/n32/n32g45xvl-stb/project.ewd b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.ewd similarity index 100% rename from bsp/n32/n32g45xvl-stb/project.ewd rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.ewd diff --git a/bsp/n32/n32g45xvl-stb/project.ewp b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.ewp similarity index 86% rename from bsp/n32/n32g45xvl-stb/project.ewp rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.ewp index 60d65cbb1e..18d89ec013 100644 --- a/bsp/n32/n32g45xvl-stb/project.ewp +++ b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.ewp @@ -358,29 +358,30 @@
- Compiler - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.c - - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdlib.c - + CPU - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\atomic_arm.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cunistd.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S - $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 + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c - $PROJ_DIR$\..\..\..\components\drivers\core\device.c + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c - $PROJ_DIR$\..\..\..\components\drivers\misc\adc.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\adc.c - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -2339,161 +2311,185 @@ Finsh - $PROJ_DIR$\..\..\..\components\finsh\shell.c + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c - $PROJ_DIR$\..\..\..\components\finsh\cmd.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c - $PROJ_DIR$\..\..\..\components\finsh\msh.c + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c Kernel - $PROJ_DIR$\..\..\..\src\clock.c + $PROJ_DIR$\..\..\..\..\src\clock.c - $PROJ_DIR$\..\..\..\src\components.c + $PROJ_DIR$\..\..\..\..\src\components.c - $PROJ_DIR$\..\..\..\src\cpu_up.c + $PROJ_DIR$\..\..\..\..\src\cpu_up.c - $PROJ_DIR$\..\..\..\src\defunct.c + $PROJ_DIR$\..\..\..\..\src\defunct.c - $PROJ_DIR$\..\..\..\src\idle.c + $PROJ_DIR$\..\..\..\..\src\idle.c - $PROJ_DIR$\..\..\..\src\ipc.c + $PROJ_DIR$\..\..\..\..\src\ipc.c - $PROJ_DIR$\..\..\..\src\irq.c + $PROJ_DIR$\..\..\..\..\src\irq.c - $PROJ_DIR$\..\..\..\src\kservice.c + $PROJ_DIR$\..\..\..\..\src\kservice.c - $PROJ_DIR$\..\..\..\src\mem.c + $PROJ_DIR$\..\..\..\..\src\mem.c - $PROJ_DIR$\..\..\..\src\memheap.c + $PROJ_DIR$\..\..\..\..\src\memheap.c - $PROJ_DIR$\..\..\..\src\mempool.c + $PROJ_DIR$\..\..\..\..\src\mempool.c - $PROJ_DIR$\..\..\..\src\object.c + $PROJ_DIR$\..\..\..\..\src\object.c - $PROJ_DIR$\..\..\..\src\scheduler_comm.c + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c - $PROJ_DIR$\..\..\..\src\scheduler_up.c + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c - $PROJ_DIR$\..\..\..\src\thread.c + $PROJ_DIR$\..\..\..\..\src\thread.c - $PROJ_DIR$\..\..\..\src\timer.c + $PROJ_DIR$\..\..\..\..\src\timer.c - klibc + Libc - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c - $PROJ_DIR$\..\..\..\src\klibc\kstring.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.c - - - libcpu - $PROJ_DIR$\..\..\..\libcpu\arm\common\atomic_arm.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cwchar.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\environ.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_close.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c - - - Libraries - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_read.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_remove.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_write.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscalls.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c + + + + Libraries $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c - $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c + + + $PROJ_DIR$\..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c - - - POSIX utc_UTest diff --git a/bsp/n32/n32g45xvl-stb/project.eww b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.eww similarity index 100% rename from bsp/n32/n32g45xvl-stb/project.eww rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.eww diff --git a/bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.uvoptx new file mode 100644 index 0000000000..547c4b34a2 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.uvoptx @@ -0,0 +1,1329 @@ + + + + 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\ + + + 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 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457VEL7$Flash\N32G45x.FLM) + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0N32G45x.FLM -FS08000000 -FL080000 -FP0($$Device:N32G457VEL7$Flash\N32G45x.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 + + + + + CPU + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 2 + 5 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\can\dev_can.c + dev_can.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\adc.c + adc.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\dac.c + dac.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\rtc\dev_rtc.c + dev_rtc.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi.c + dev_spi.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi_core.c + dev_spi_core.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\watchdog\dev_watchdog.c + dev_watchdog.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 30 + 2 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\CMSIS\device\startup\startup_n32g45x.s + startup_n32g45x.s + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_adc.c + drv_adc.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_can.c + drv_can.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_dac.c + drv_dac.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_rtc.c + drv_rtc.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 4 + 39 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 4 + 40 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_wdt.c + drv_wdt.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libc + 0 + 0 + 0 + 0 + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 73 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 74 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\CMSIS\device\system_n32g45x.c + system_n32g45x.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_gpio.c + n32g45x_gpio.c + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rcc.c + n32g45x_rcc.c + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_exti.c + n32g45x_exti.c + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\misc.c + misc.c + 0 + 0 + + + 8 + 79 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_usart.c + n32g45x_usart.c + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dma.c + n32g45x_dma.c + 0 + 0 + + + 8 + 81 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_i2c.c + n32g45x_i2c.c + 0 + 0 + + + 8 + 82 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_spi.c + n32g45x_spi.c + 0 + 0 + + + 8 + 83 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_can.c + n32g45x_can.c + 0 + 0 + + + 8 + 84 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_adc.c + n32g45x_adc.c + 0 + 0 + + + 8 + 85 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_dac.c + n32g45x_dac.c + 0 + 0 + + + 8 + 86 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_tim.c + n32g45x_tim.c + 0 + 0 + + + 8 + 87 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_rtc.c + n32g45x_rtc.c + 0 + 0 + + + 8 + 88 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_pwr.c + n32g45x_pwr.c + 0 + 0 + + + 8 + 89 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_wwdg.c + n32g45x_wwdg.c + 0 + 0 + + + 8 + 90 + 1 + 0 + 0 + 0 + ..\libraries\N32G45x_Firmware_Library\n32g45x_std_periph_driver\src\n32g45x_iwdg.c + n32g45x_iwdg.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/n32/n32g45xvl-stb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.uvprojx similarity index 100% rename from bsp/n32/n32g45xvl-stb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/project.uvprojx diff --git a/bsp/n32/n32g45xvl-stb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/rtconfig.h similarity index 98% rename from bsp/n32/n32g45xvl-stb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/rtconfig.h index d9a019d68c..2175a80b37 100644 --- a/bsp/n32/n32g45xvl-stb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define RT_USING_HW_ATOMIC @@ -160,6 +160,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -332,6 +333,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32gxx_lxx/n32g45xvl-stb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/rtconfig.py new file mode 100644 index 0000000000..c3765e6f08 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' + 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 rtthread.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-M4.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' + CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -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-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + 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-M4' + AFLAGS += ' --fpu VFPv4_sp' + 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/n32/n32g45xvl-stb/template.ewp b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/template.ewp similarity index 100% rename from bsp/n32/n32g45xvl-stb/template.ewp rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/template.ewp diff --git a/bsp/n32/n32g45xvl-stb/template.eww b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/template.eww similarity index 100% rename from bsp/n32/n32g45xvl-stb/template.eww rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/template.eww diff --git a/bsp/n32/n32g45xvl-stb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/template.uvoptx similarity index 100% rename from bsp/n32/n32g45xvl-stb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/template.uvoptx diff --git a/bsp/n32/n32g45xvl-stb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32g45xvl-stb/template.uvprojx similarity index 100% rename from bsp/n32/n32g45xvl-stb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32g45xvl-stb/template.uvprojx diff --git a/bsp/n32/n32g4frml-stb/.config b/bsp/n32/n32gxx_lxx/n32g4frml-stb/.config similarity index 97% rename from bsp/n32/n32g4frml-stb/.config rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/.config index 06c31eee58..fa4247eb2e 100644 --- a/bsp/n32/n32g4frml-stb/.config +++ b/bsp/n32/n32gxx_lxx/n32g4frml-stb/.config @@ -180,7 +180,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -274,6 +274,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -368,8 +370,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -378,6 +378,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -579,6 +580,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -604,6 +606,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -653,6 +656,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -747,6 +753,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -902,7 +909,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -948,9 +971,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1075,6 +1100,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32gxx_lxx/n32g4frml-stb/Kconfig b/bsp/n32/n32gxx_lxx/n32g4frml-stb/Kconfig new file mode 100644 index 0000000000..07edfefc34 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g4frml-stb/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/n32/n32g4frml-stb/README.md b/bsp/n32/n32gxx_lxx/n32g4frml-stb/README.md similarity index 100% rename from bsp/n32/n32g4frml-stb/README.md rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/README.md diff --git a/bsp/n32/n32g4frml-stb/SConscript b/bsp/n32/n32gxx_lxx/n32g4frml-stb/SConscript similarity index 100% rename from bsp/n32/n32g4frml-stb/SConscript rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/SConscript diff --git a/bsp/n32/n32g4frml-stb/SConstruct b/bsp/n32/n32gxx_lxx/n32g4frml-stb/SConstruct similarity index 96% rename from bsp/n32/n32g4frml-stb/SConstruct rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/SConstruct index ef571d5871..9e3b2adbb4 100644 --- a/bsp/n32/n32g4frml-stb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32g4frml-stb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32g4frml-stb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32g4frml-stb/applications/SConscript similarity index 100% rename from bsp/n32/n32g4frml-stb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/applications/SConscript diff --git a/bsp/n32/n32g4frml-stb/applications/main.c b/bsp/n32/n32gxx_lxx/n32g4frml-stb/applications/main.c similarity index 100% rename from bsp/n32/n32g4frml-stb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/applications/main.c diff --git a/bsp/n32/n32g4frml-stb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32g4frml-stb/board/Kconfig similarity index 100% rename from bsp/n32/n32g4frml-stb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/board/Kconfig diff --git a/bsp/n32/n32g4frml-stb/board/SConscript b/bsp/n32/n32gxx_lxx/n32g4frml-stb/board/SConscript similarity index 100% rename from bsp/n32/n32g4frml-stb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/board/SConscript diff --git a/bsp/n32/n32g4frml-stb/board/board.c b/bsp/n32/n32gxx_lxx/n32g4frml-stb/board/board.c similarity index 100% rename from bsp/n32/n32g4frml-stb/board/board.c rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/board/board.c diff --git a/bsp/n32/n32g4frml-stb/board/board.h b/bsp/n32/n32gxx_lxx/n32g4frml-stb/board/board.h similarity index 100% rename from bsp/n32/n32g4frml-stb/board/board.h rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/board/board.h diff --git a/bsp/n32/n32g4frml-stb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32g4frml-stb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32g4frml-stb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32g4frml-stb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32g4frml-stb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32g4frml-stb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32g4frml-stb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32g4frml-stb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32g4frml-stb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32g4frml-stb/figures/board.png b/bsp/n32/n32gxx_lxx/n32g4frml-stb/figures/board.png similarity index 100% rename from bsp/n32/n32g4frml-stb/figures/board.png rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/figures/board.png diff --git a/bsp/n32/n32g4frml-stb/project.ewd b/bsp/n32/n32gxx_lxx/n32g4frml-stb/project.ewd similarity index 100% rename from bsp/n32/n32g4frml-stb/project.ewd rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/project.ewd diff --git a/bsp/n32/n32gxx_lxx/n32g4frml-stb/project.ewp b/bsp/n32/n32gxx_lxx/n32g4frml-stb/project.ewp new file mode 100644 index 0000000000..a0c4b8752b --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g4frml-stb/project.ewp @@ -0,0 +1,2496 @@ + + 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 + + + + 0 + + + + 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 + + + + 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-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c + + + $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.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\adc.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c + + + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c + + + + Drivers + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\CMSIS\device\startup\startup_n32g4fr_EWARM.s + + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\..\libraries\n32_drivers\drv_adc.c + + + $PROJ_DIR$\..\libraries\n32_drivers\drv_can.c + + + $PROJ_DIR$\..\libraries\n32_drivers\drv_dac.c + + + $PROJ_DIR$\..\libraries\n32_drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\n32_drivers\drv_timer.c + + + $PROJ_DIR$\..\libraries\n32_drivers\drv_rtc.c + + + $PROJ_DIR$\..\libraries\n32_drivers\drv_spi.c + + + $PROJ_DIR$\..\libraries\n32_drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\n32_drivers\drv_wdt.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\cpu_up.c + + + $PROJ_DIR$\..\..\..\..\src\defunct.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\memheap.c + + + $PROJ_DIR$\..\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c + + + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c + + + $PROJ_DIR$\..\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\..\src\timer.c + + + + Libc + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.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\cunistd.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 + + + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c + + + + libraries + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\CMSIS\device\system_n32g4fr.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_gpio.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_rcc.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_exti.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\misc.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_usart.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_i2c.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_spi.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_can.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_adc.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_dac.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_tim.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_rtc.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_wwdg.c + + + $PROJ_DIR$\..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_iwdg.c + + + + utc_UTest + + + utestcases + + diff --git a/bsp/n32/n32g4frml-stb/project.eww b/bsp/n32/n32gxx_lxx/n32g4frml-stb/project.eww similarity index 100% rename from bsp/n32/n32g4frml-stb/project.eww rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/project.eww diff --git a/bsp/n32/n32gxx_lxx/n32g4frml-stb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32g4frml-stb/project.uvoptx new file mode 100644 index 0000000000..c03c7a33f0 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g4frml-stb/project.uvoptx @@ -0,0 +1,1305 @@ + + + + 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\ + + + 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 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0N32G4FR.FLM -FS08000000 -FL080000 -FP0($$Device:N32G4FRMEL7$Flash\N32G4FR.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G4FR -FL080000 -FS08000000 -FP0($$Device:N32G4FRMEL7$Flash\N32G4FR.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 + + + + + CPU + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 2 + 5 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\can\dev_can.c + dev_can.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\adc.c + adc.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\dac.c + dac.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\rtc\dev_rtc.c + dev_rtc.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi.c + dev_spi.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi_core.c + dev_spi_core.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\watchdog\dev_watchdog.c + dev_watchdog.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 30 + 2 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\CMSIS\device\startup\startup_n32g4fr.s + startup_n32g4fr.s + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_adc.c + drv_adc.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_can.c + drv_can.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_dac.c + drv_dac.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_rtc.c + drv_rtc.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 4 + 39 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 4 + 40 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_wdt.c + drv_wdt.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libc + 0 + 0 + 0 + 0 + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 73 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + libraries + 0 + 0 + 0 + 0 + + 8 + 74 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\CMSIS\device\system_n32g4fr.c + system_n32g4fr.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_gpio.c + n32g4fr_gpio.c + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_rcc.c + n32g4fr_rcc.c + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_exti.c + n32g4fr_exti.c + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\misc.c + misc.c + 0 + 0 + + + 8 + 79 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_usart.c + n32g4fr_usart.c + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_i2c.c + n32g4fr_i2c.c + 0 + 0 + + + 8 + 81 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_spi.c + n32g4fr_spi.c + 0 + 0 + + + 8 + 82 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_can.c + n32g4fr_can.c + 0 + 0 + + + 8 + 83 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_adc.c + n32g4fr_adc.c + 0 + 0 + + + 8 + 84 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_dac.c + n32g4fr_dac.c + 0 + 0 + + + 8 + 85 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_tim.c + n32g4fr_tim.c + 0 + 0 + + + 8 + 86 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_rtc.c + n32g4fr_rtc.c + 0 + 0 + + + 8 + 87 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_wwdg.c + n32g4fr_wwdg.c + 0 + 0 + + + 8 + 88 + 1 + 0 + 0 + 0 + ..\libraries\N32G4FR_Firmware_Library\n32g4fr_std_periph_driver\src\n32g4fr_iwdg.c + n32g4fr_iwdg.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/n32/n32g4frml-stb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32g4frml-stb/project.uvprojx similarity index 100% rename from bsp/n32/n32g4frml-stb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/project.uvprojx diff --git a/bsp/n32/n32g4frml-stb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32g4frml-stb/rtconfig.h similarity index 98% rename from bsp/n32/n32g4frml-stb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/rtconfig.h index dd1890c4ce..f173033882 100644 --- a/bsp/n32/n32g4frml-stb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32g4frml-stb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define RT_USING_HW_ATOMIC @@ -160,6 +160,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -332,6 +333,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32gxx_lxx/n32g4frml-stb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32g4frml-stb/rtconfig.py new file mode 100644 index 0000000000..c3765e6f08 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32g4frml-stb/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' + 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 rtthread.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-M4.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' + CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -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-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + 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-M4' + AFLAGS += ' --fpu VFPv4_sp' + 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/n32/n32g4frml-stb/template.ewp b/bsp/n32/n32gxx_lxx/n32g4frml-stb/template.ewp similarity index 92% rename from bsp/n32/n32g4frml-stb/template.ewp rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/template.ewp index 8b6420c8a1..b80dc67c93 100644 --- a/bsp/n32/n32g4frml-stb/template.ewp +++ b/bsp/n32/n32gxx_lxx/n32g4frml-stb/template.ewp @@ -11,13 +11,9 @@ General 3 - 33 + 31 1 1 - + + + + + - - ICCARM 2 - 37 + 36 1 1 + + + @@ -652,9 +672,13 @@ 0 - inputOutputBased + + BICOMP + 0 + + BUILDACTION 1 @@ -667,13 +691,17 @@ ILINK 0 - 25 + 23 1 1 + - - - - - @@ -1042,6 +1050,11 @@ + + BILINK + 0 + + Release @@ -1053,13 +1066,9 @@ General 3 - 33 + 31 1 0 - + + + + + - - ICCARM 2 - 37 + 36 1 0 + + + @@ -1694,9 +1727,13 @@ 0 - inputOutputBased + + BICOMP + 0 + + BUILDACTION 1 @@ -1709,13 +1746,17 @@ ILINK 0 - 25 + 23 1 0 + - - - - - @@ -2084,5 +2105,10 @@ + + BILINK + 0 + + diff --git a/bsp/n32/n32g4frml-stb/template.eww b/bsp/n32/n32gxx_lxx/n32g4frml-stb/template.eww similarity index 100% rename from bsp/n32/n32g4frml-stb/template.eww rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/template.eww diff --git a/bsp/n32/n32g4frml-stb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32g4frml-stb/template.uvoptx similarity index 100% rename from bsp/n32/n32g4frml-stb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/template.uvoptx diff --git a/bsp/n32/n32g4frml-stb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32g4frml-stb/template.uvprojx similarity index 98% rename from bsp/n32/n32g4frml-stb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32g4frml-stb/template.uvprojx index 8c3a51f09e..82f674564a 100644 --- a/bsp/n32/n32g4frml-stb/template.uvprojx +++ b/bsp/n32/n32gxx_lxx/n32g4frml-stb/template.uvprojx @@ -16,7 +16,7 @@ N32G4FRMEL7 Nationstech - Nationstech.N32G4FR_DFP.1.0.4 + Nationstech.N32G4FR_DFP.1.1.1 http://www.keil.com/pack/ IRAM(0x20000000,0x24000) IROM(0x08000000,0x80000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE @@ -404,11 +404,6 @@ template - - - - - 0 1 diff --git a/bsp/n32/n32l40xcl-stb/.config b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/.config similarity index 97% rename from bsp/n32/n32l40xcl-stb/.config rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/.config index f9070b0e8e..3aa3f33ae4 100644 --- a/bsp/n32/n32l40xcl-stb/.config +++ b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/.config @@ -179,7 +179,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -267,6 +267,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -361,8 +363,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -371,6 +371,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -572,6 +573,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -596,6 +598,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -644,6 +647,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -738,6 +744,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -893,7 +900,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -939,9 +962,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1066,6 +1091,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32gxx_lxx/n32l40xcl-stb/Kconfig b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/Kconfig new file mode 100644 index 0000000000..07edfefc34 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/n32/n32l40xcl-stb/README.md b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/README.md similarity index 100% rename from bsp/n32/n32l40xcl-stb/README.md rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/README.md diff --git a/bsp/n32/n32l40xcl-stb/SConscript b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/SConscript similarity index 100% rename from bsp/n32/n32l40xcl-stb/SConscript rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/SConscript diff --git a/bsp/n32/n32l40xcl-stb/SConstruct b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/SConstruct similarity index 96% rename from bsp/n32/n32l40xcl-stb/SConstruct rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/SConstruct index 59d77be5c7..cc8121e4a1 100644 --- a/bsp/n32/n32l40xcl-stb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32l40xcl-stb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/applications/SConscript similarity index 100% rename from bsp/n32/n32l40xcl-stb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/applications/SConscript diff --git a/bsp/n32/n32l40xcl-stb/applications/main.c b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/applications/main.c similarity index 100% rename from bsp/n32/n32l40xcl-stb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/applications/main.c diff --git a/bsp/n32/n32l40xcl-stb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/Kconfig similarity index 100% rename from bsp/n32/n32l40xcl-stb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/Kconfig diff --git a/bsp/n32/n32l40xcl-stb/board/SConscript b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/SConscript similarity index 100% rename from bsp/n32/n32l40xcl-stb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/SConscript diff --git a/bsp/n32/n32l40xcl-stb/board/board.c b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/board.c similarity index 100% rename from bsp/n32/n32l40xcl-stb/board/board.c rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/board.c diff --git a/bsp/n32/n32l40xcl-stb/board/board.h b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/board.h similarity index 100% rename from bsp/n32/n32l40xcl-stb/board/board.h rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/board.h diff --git a/bsp/n32/n32l40xcl-stb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32l40xcl-stb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32l40xcl-stb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32l40xcl-stb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32l40xcl-stb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32l40xcl-stb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32l40xcl-stb/figures/board.jpg b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/figures/board.jpg similarity index 100% rename from bsp/n32/n32l40xcl-stb/figures/board.jpg rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/figures/board.jpg diff --git a/bsp/n32/n32l40xcl-stb/project.ewd b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.ewd similarity index 100% rename from bsp/n32/n32l40xcl-stb/project.ewd rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.ewd diff --git a/bsp/n32/n32l40xcl-stb/project.ewp b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.ewp similarity index 86% rename from bsp/n32/n32l40xcl-stb/project.ewp rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.ewp index 74de3b8931..5dd4fe22a6 100644 --- a/bsp/n32/n32l40xcl-stb/project.ewp +++ b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.ewp @@ -358,29 +358,30 @@
- Compiler - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.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 - + CPU - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cunistd.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\environ.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S - $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 + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c - $PROJ_DIR$\..\..\..\components\drivers\core\device.c + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c - $PROJ_DIR$\..\..\..\components\drivers\misc\adc.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\adc.c - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -2339,158 +2308,185 @@ Finsh - $PROJ_DIR$\..\..\..\components\finsh\shell.c + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c - $PROJ_DIR$\..\..\..\components\finsh\msh.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c - $PROJ_DIR$\..\..\..\components\finsh\cmd.c + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c Kernel - $PROJ_DIR$\..\..\..\src\clock.c + $PROJ_DIR$\..\..\..\..\src\clock.c - $PROJ_DIR$\..\..\..\src\components.c + $PROJ_DIR$\..\..\..\..\src\components.c - $PROJ_DIR$\..\..\..\src\cpu_up.c + $PROJ_DIR$\..\..\..\..\src\cpu_up.c - $PROJ_DIR$\..\..\..\src\defunct.c + $PROJ_DIR$\..\..\..\..\src\defunct.c - $PROJ_DIR$\..\..\..\src\idle.c + $PROJ_DIR$\..\..\..\..\src\idle.c - $PROJ_DIR$\..\..\..\src\ipc.c + $PROJ_DIR$\..\..\..\..\src\ipc.c - $PROJ_DIR$\..\..\..\src\irq.c + $PROJ_DIR$\..\..\..\..\src\irq.c - $PROJ_DIR$\..\..\..\src\kservice.c + $PROJ_DIR$\..\..\..\..\src\kservice.c - $PROJ_DIR$\..\..\..\src\mem.c + $PROJ_DIR$\..\..\..\..\src\mem.c - $PROJ_DIR$\..\..\..\src\memheap.c + $PROJ_DIR$\..\..\..\..\src\memheap.c - $PROJ_DIR$\..\..\..\src\mempool.c + $PROJ_DIR$\..\..\..\..\src\mempool.c - $PROJ_DIR$\..\..\..\src\object.c + $PROJ_DIR$\..\..\..\..\src\object.c - $PROJ_DIR$\..\..\..\src\scheduler_comm.c + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c - $PROJ_DIR$\..\..\..\src\scheduler_up.c + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c - $PROJ_DIR$\..\..\..\src\thread.c + $PROJ_DIR$\..\..\..\..\src\thread.c - $PROJ_DIR$\..\..\..\src\timer.c + $PROJ_DIR$\..\..\..\..\src\timer.c - klibc + Libc - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c - $PROJ_DIR$\..\..\..\src\klibc\kstring.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.c - - - libcpu - $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cwchar.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\environ.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_close.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c - - - Libraries - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_rcc.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_exti.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_iwdg.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_read.c - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\CMSIS\device\system_n32l40x.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_remove.c - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_gpio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_write.c - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_i2c.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscalls.c - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_adc.c + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_tim.c + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_pwr.c + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_flash.c + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_wwdg.c + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c + + + Libraries - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_spi.c + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\CMSIS\device\system_n32l40x.c + + + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_gpio.c + + + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_rcc.c + + + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_exti.c + + + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\misc.c $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_usart.c + + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_i2c.c + + + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_spi.c + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_can.c + + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_adc.c + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_dac.c + + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_tim.c + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_rtc.c - $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\misc.c + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_pwr.c + + + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_flash.c + + + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_iwdg.c + + + $PROJ_DIR$\..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_wwdg.c - - - POSIX utc_UTest diff --git a/bsp/n32/n32l40xcl-stb/project.eww b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.eww similarity index 100% rename from bsp/n32/n32l40xcl-stb/project.eww rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.eww diff --git a/bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.uvoptx new file mode 100644 index 0000000000..f0932d6a46 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.uvoptx @@ -0,0 +1,1317 @@ + + + + 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\ + + + 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 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L40x -FL020000 -FS08000000 -FP0($$Device:N32L406CB$Flash\N32L40x.FLM) + + + 0 + CMSIS_AGDI + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L40x -FL020000 -FS08000000 -FP0($$Device:N32L406CB$Flash\N32L40x.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 + + + + + CPU + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 2 + 4 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\can\dev_can.c + dev_can.c + 0 + 0 + + + 3 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\adc.c + adc.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\dac.c + dac.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\rtc\dev_rtc.c + dev_rtc.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi.c + dev_spi.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi_core.c + dev_spi_core.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\watchdog\dev_watchdog.c + dev_watchdog.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 29 + 2 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\CMSIS\device\startup\startup_n32l40x.s + startup_n32l40x.s + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_adc.c + drv_adc.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_can.c + drv_can.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_dac.c + drv_dac.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_rtc.c + drv_rtc.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 4 + 39 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_wdt.c + drv_wdt.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libc + 0 + 0 + 0 + 0 + + 7 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 73 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\CMSIS\device\system_n32l40x.c + system_n32l40x.c + 0 + 0 + + + 8 + 74 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_gpio.c + n32l40x_gpio.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_rcc.c + n32l40x_rcc.c + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_exti.c + n32l40x_exti.c + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\misc.c + misc.c + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_usart.c + n32l40x_usart.c + 0 + 0 + + + 8 + 79 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_i2c.c + n32l40x_i2c.c + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_spi.c + n32l40x_spi.c + 0 + 0 + + + 8 + 81 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_can.c + n32l40x_can.c + 0 + 0 + + + 8 + 82 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_adc.c + n32l40x_adc.c + 0 + 0 + + + 8 + 83 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_dac.c + n32l40x_dac.c + 0 + 0 + + + 8 + 84 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_tim.c + n32l40x_tim.c + 0 + 0 + + + 8 + 85 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_rtc.c + n32l40x_rtc.c + 0 + 0 + + + 8 + 86 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_pwr.c + n32l40x_pwr.c + 0 + 0 + + + 8 + 87 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_flash.c + n32l40x_flash.c + 0 + 0 + + + 8 + 88 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_iwdg.c + n32l40x_iwdg.c + 0 + 0 + + + 8 + 89 + 1 + 0 + 0 + 0 + ..\libraries\N32L40x_Firmware_Library\n32l40x_std_periph_driver\src\n32l40x_wwdg.c + n32l40x_wwdg.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/n32/n32l40xcl-stb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.uvprojx similarity index 100% rename from bsp/n32/n32l40xcl-stb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/project.uvprojx diff --git a/bsp/n32/n32l40xcl-stb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/rtconfig.h similarity index 98% rename from bsp/n32/n32l40xcl-stb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/rtconfig.h index 236a2cdae7..a05bc5d0c3 100644 --- a/bsp/n32/n32l40xcl-stb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ @@ -155,6 +155,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -327,6 +328,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32gxx_lxx/n32l40xcl-stb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/rtconfig.py new file mode 100644 index 0000000000..c3765e6f08 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' + 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 rtthread.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-M4.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' + CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -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-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + 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-M4' + AFLAGS += ' --fpu VFPv4_sp' + 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/n32/n32l40xcl-stb/template.ewp b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/template.ewp similarity index 100% rename from bsp/n32/n32l40xcl-stb/template.ewp rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/template.ewp diff --git a/bsp/n32/n32l40xcl-stb/template.eww b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/template.eww similarity index 100% rename from bsp/n32/n32l40xcl-stb/template.eww rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/template.eww diff --git a/bsp/n32/n32l40xcl-stb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/template.uvoptx similarity index 100% rename from bsp/n32/n32l40xcl-stb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/template.uvoptx diff --git a/bsp/n32/n32l40xcl-stb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32l40xcl-stb/template.uvprojx similarity index 100% rename from bsp/n32/n32l40xcl-stb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32l40xcl-stb/template.uvprojx diff --git a/bsp/n32/n32l436-evb/.config b/bsp/n32/n32gxx_lxx/n32l436-evb/.config similarity index 97% rename from bsp/n32/n32l436-evb/.config rename to bsp/n32/n32gxx_lxx/n32l436-evb/.config index 26c579656c..fef23158b5 100644 --- a/bsp/n32/n32l436-evb/.config +++ b/bsp/n32/n32gxx_lxx/n32l436-evb/.config @@ -179,7 +179,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -267,6 +267,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -361,8 +363,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -371,6 +371,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -572,6 +573,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -596,6 +598,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -644,6 +647,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -738,6 +744,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -893,7 +900,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -939,9 +962,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1066,6 +1091,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32gxx_lxx/n32l436-evb/Kconfig b/bsp/n32/n32gxx_lxx/n32l436-evb/Kconfig new file mode 100644 index 0000000000..07edfefc34 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32l436-evb/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/n32/n32l436-evb/README.md b/bsp/n32/n32gxx_lxx/n32l436-evb/README.md similarity index 100% rename from bsp/n32/n32l436-evb/README.md rename to bsp/n32/n32gxx_lxx/n32l436-evb/README.md diff --git a/bsp/n32/n32l436-evb/SConscript b/bsp/n32/n32gxx_lxx/n32l436-evb/SConscript similarity index 100% rename from bsp/n32/n32l436-evb/SConscript rename to bsp/n32/n32gxx_lxx/n32l436-evb/SConscript diff --git a/bsp/n32/n32l436-evb/SConstruct b/bsp/n32/n32gxx_lxx/n32l436-evb/SConstruct similarity index 96% rename from bsp/n32/n32l436-evb/SConstruct rename to bsp/n32/n32gxx_lxx/n32l436-evb/SConstruct index cfa5f35aba..14aafb0a2f 100644 --- a/bsp/n32/n32l436-evb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32l436-evb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32l436-evb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32l436-evb/applications/SConscript similarity index 100% rename from bsp/n32/n32l436-evb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32l436-evb/applications/SConscript diff --git a/bsp/n32/n32l436-evb/applications/main.c b/bsp/n32/n32gxx_lxx/n32l436-evb/applications/main.c similarity index 100% rename from bsp/n32/n32l436-evb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32l436-evb/applications/main.c diff --git a/bsp/n32/n32l436-evb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32l436-evb/board/Kconfig similarity index 100% rename from bsp/n32/n32l436-evb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32l436-evb/board/Kconfig diff --git a/bsp/n32/n32l436-evb/board/SConscript b/bsp/n32/n32gxx_lxx/n32l436-evb/board/SConscript similarity index 100% rename from bsp/n32/n32l436-evb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32l436-evb/board/SConscript diff --git a/bsp/n32/n32l436-evb/board/board.c b/bsp/n32/n32gxx_lxx/n32l436-evb/board/board.c similarity index 100% rename from bsp/n32/n32l436-evb/board/board.c rename to bsp/n32/n32gxx_lxx/n32l436-evb/board/board.c diff --git a/bsp/n32/n32l436-evb/board/board.h b/bsp/n32/n32gxx_lxx/n32l436-evb/board/board.h similarity index 100% rename from bsp/n32/n32l436-evb/board/board.h rename to bsp/n32/n32gxx_lxx/n32l436-evb/board/board.h diff --git a/bsp/n32/n32l436-evb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32l436-evb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32l436-evb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32l436-evb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32l436-evb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32l436-evb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32l436-evb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32l436-evb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32l436-evb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32l436-evb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32l436-evb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32l436-evb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32l436-evb/figures/board.jpg b/bsp/n32/n32gxx_lxx/n32l436-evb/figures/board.jpg similarity index 100% rename from bsp/n32/n32l436-evb/figures/board.jpg rename to bsp/n32/n32gxx_lxx/n32l436-evb/figures/board.jpg diff --git a/bsp/n32/n32l436-evb/project.ewd b/bsp/n32/n32gxx_lxx/n32l436-evb/project.ewd similarity index 100% rename from bsp/n32/n32l436-evb/project.ewd rename to bsp/n32/n32gxx_lxx/n32l436-evb/project.ewd diff --git a/bsp/n32/n32l436-evb/project.ewp b/bsp/n32/n32gxx_lxx/n32l436-evb/project.ewp similarity index 86% rename from bsp/n32/n32l436-evb/project.ewp rename to bsp/n32/n32gxx_lxx/n32l436-evb/project.ewp index b364f0ffdc..4c5c5570ce 100644 --- a/bsp/n32/n32l436-evb/project.ewp +++ b/bsp/n32/n32gxx_lxx/n32l436-evb/project.ewp @@ -358,29 +358,30 @@
- Compiler - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.c - - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdlib.c - - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c - + CPU - $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cunistd.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S - $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 + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c - $PROJ_DIR$\..\..\..\components\drivers\core\device.c + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c - $PROJ_DIR$\..\..\..\components\drivers\misc\adc.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\adc.c - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -2339,158 +2308,185 @@ Finsh - $PROJ_DIR$\..\..\..\components\finsh\shell.c + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c - $PROJ_DIR$\..\..\..\components\finsh\cmd.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c - $PROJ_DIR$\..\..\..\components\finsh\msh.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c Kernel - $PROJ_DIR$\..\..\..\src\clock.c + $PROJ_DIR$\..\..\..\..\src\clock.c - $PROJ_DIR$\..\..\..\src\components.c + $PROJ_DIR$\..\..\..\..\src\components.c - $PROJ_DIR$\..\..\..\src\cpu_up.c + $PROJ_DIR$\..\..\..\..\src\cpu_up.c - $PROJ_DIR$\..\..\..\src\defunct.c + $PROJ_DIR$\..\..\..\..\src\defunct.c - $PROJ_DIR$\..\..\..\src\idle.c + $PROJ_DIR$\..\..\..\..\src\idle.c - $PROJ_DIR$\..\..\..\src\ipc.c + $PROJ_DIR$\..\..\..\..\src\ipc.c - $PROJ_DIR$\..\..\..\src\irq.c + $PROJ_DIR$\..\..\..\..\src\irq.c - $PROJ_DIR$\..\..\..\src\kservice.c + $PROJ_DIR$\..\..\..\..\src\kservice.c - $PROJ_DIR$\..\..\..\src\mem.c + $PROJ_DIR$\..\..\..\..\src\mem.c - $PROJ_DIR$\..\..\..\src\memheap.c + $PROJ_DIR$\..\..\..\..\src\memheap.c - $PROJ_DIR$\..\..\..\src\mempool.c + $PROJ_DIR$\..\..\..\..\src\mempool.c - $PROJ_DIR$\..\..\..\src\object.c + $PROJ_DIR$\..\..\..\..\src\object.c - $PROJ_DIR$\..\..\..\src\scheduler_comm.c + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c - $PROJ_DIR$\..\..\..\src\scheduler_up.c + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c - $PROJ_DIR$\..\..\..\src\thread.c + $PROJ_DIR$\..\..\..\..\src\thread.c - $PROJ_DIR$\..\..\..\src\timer.c + $PROJ_DIR$\..\..\..\..\src\timer.c - klibc + Libc - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c - $PROJ_DIR$\..\..\..\src\klibc\kstring.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.c - - - libcpu - $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cwchar.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\environ.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_close.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c - - - Libraries - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_spi.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\misc.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_dac.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_read.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_pwr.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_remove.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_usart.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_write.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_can.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscalls.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c + + + + Libraries + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\CMSIS\device\system_n32l43x.c + + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_gpio.c + + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rcc.c $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_exti.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_adc.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\misc.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_flash.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_usart.c $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_i2c.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_iwdg.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_spi.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_wwdg.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_can.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_gpio.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_adc.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rtc.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_dac.c $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_tim.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\CMSIS\device\system_n32l43x.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rtc.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rcc.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_pwr.c + + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_flash.c + + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_iwdg.c + + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_wwdg.c - - - POSIX utc_UTest diff --git a/bsp/n32/n32l436-evb/project.eww b/bsp/n32/n32gxx_lxx/n32l436-evb/project.eww similarity index 100% rename from bsp/n32/n32l436-evb/project.eww rename to bsp/n32/n32gxx_lxx/n32l436-evb/project.eww diff --git a/bsp/n32/n32gxx_lxx/n32l436-evb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32l436-evb/project.uvoptx new file mode 100644 index 0000000000..a8f4dba884 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32l436-evb/project.uvoptx @@ -0,0 +1,1317 @@ + + + + 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\ + + + 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 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L43x -FL020000 -FS08000000 -FP0($$Device:N32L436MB$Flash\N32L43x.FLM) + + + 0 + CMSIS_AGDI + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L43x -FL020000 -FS08000000 -FP0($$Device:N32L436MB$Flash\N32L43x.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 + + + + + CPU + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 2 + 4 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\can\dev_can.c + dev_can.c + 0 + 0 + + + 3 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\adc.c + adc.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\dac.c + dac.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\rtc\dev_rtc.c + dev_rtc.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi.c + dev_spi.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi_core.c + dev_spi_core.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\watchdog\dev_watchdog.c + dev_watchdog.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 29 + 2 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\CMSIS\device\startup\startup_n32l43x.s + startup_n32l43x.s + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_adc.c + drv_adc.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_can.c + drv_can.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_dac.c + drv_dac.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_rtc.c + drv_rtc.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 4 + 39 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_wdt.c + drv_wdt.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libc + 0 + 0 + 0 + 0 + + 7 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 73 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\CMSIS\device\system_n32l43x.c + system_n32l43x.c + 0 + 0 + + + 8 + 74 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_gpio.c + n32l43x_gpio.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rcc.c + n32l43x_rcc.c + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_exti.c + n32l43x_exti.c + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\misc.c + misc.c + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_usart.c + n32l43x_usart.c + 0 + 0 + + + 8 + 79 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_i2c.c + n32l43x_i2c.c + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_spi.c + n32l43x_spi.c + 0 + 0 + + + 8 + 81 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_can.c + n32l43x_can.c + 0 + 0 + + + 8 + 82 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_adc.c + n32l43x_adc.c + 0 + 0 + + + 8 + 83 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_dac.c + n32l43x_dac.c + 0 + 0 + + + 8 + 84 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_tim.c + n32l43x_tim.c + 0 + 0 + + + 8 + 85 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rtc.c + n32l43x_rtc.c + 0 + 0 + + + 8 + 86 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_pwr.c + n32l43x_pwr.c + 0 + 0 + + + 8 + 87 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_flash.c + n32l43x_flash.c + 0 + 0 + + + 8 + 88 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_iwdg.c + n32l43x_iwdg.c + 0 + 0 + + + 8 + 89 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_wwdg.c + n32l43x_wwdg.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/n32/n32l436-evb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32l436-evb/project.uvprojx similarity index 100% rename from bsp/n32/n32l436-evb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32l436-evb/project.uvprojx diff --git a/bsp/n32/n32l43xrl-stb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32l436-evb/rtconfig.h similarity index 98% rename from bsp/n32/n32l43xrl-stb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32l436-evb/rtconfig.h index a454f9f412..57bcc7aab0 100644 --- a/bsp/n32/n32l43xrl-stb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32l436-evb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ @@ -155,6 +155,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -327,6 +328,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32gxx_lxx/n32l436-evb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32l436-evb/rtconfig.py new file mode 100644 index 0000000000..c3765e6f08 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32l436-evb/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' + 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 rtthread.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-M4.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' + CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -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-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + 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-M4' + AFLAGS += ' --fpu VFPv4_sp' + 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/n32/n32l436-evb/template.ewp b/bsp/n32/n32gxx_lxx/n32l436-evb/template.ewp similarity index 100% rename from bsp/n32/n32l436-evb/template.ewp rename to bsp/n32/n32gxx_lxx/n32l436-evb/template.ewp diff --git a/bsp/n32/n32l436-evb/template.eww b/bsp/n32/n32gxx_lxx/n32l436-evb/template.eww similarity index 100% rename from bsp/n32/n32l436-evb/template.eww rename to bsp/n32/n32gxx_lxx/n32l436-evb/template.eww diff --git a/bsp/n32/n32l436-evb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32l436-evb/template.uvoptx similarity index 100% rename from bsp/n32/n32l436-evb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32l436-evb/template.uvoptx diff --git a/bsp/n32/n32l436-evb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32l436-evb/template.uvprojx similarity index 100% rename from bsp/n32/n32l436-evb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32l436-evb/template.uvprojx diff --git a/bsp/n32/n32l43xml-stb/.config b/bsp/n32/n32gxx_lxx/n32l43xml-stb/.config similarity index 97% rename from bsp/n32/n32l43xml-stb/.config rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/.config index 26c579656c..fef23158b5 100644 --- a/bsp/n32/n32l43xml-stb/.config +++ b/bsp/n32/n32gxx_lxx/n32l43xml-stb/.config @@ -179,7 +179,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -267,6 +267,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -361,8 +363,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -371,6 +371,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -572,6 +573,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -596,6 +598,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -644,6 +647,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -738,6 +744,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -893,7 +900,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -939,9 +962,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1066,6 +1091,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32gxx_lxx/n32l43xml-stb/Kconfig b/bsp/n32/n32gxx_lxx/n32l43xml-stb/Kconfig new file mode 100644 index 0000000000..07edfefc34 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32l43xml-stb/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/n32/n32l43xml-stb/README.md b/bsp/n32/n32gxx_lxx/n32l43xml-stb/README.md similarity index 100% rename from bsp/n32/n32l43xml-stb/README.md rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/README.md diff --git a/bsp/n32/n32l43xml-stb/SConscript b/bsp/n32/n32gxx_lxx/n32l43xml-stb/SConscript similarity index 100% rename from bsp/n32/n32l43xml-stb/SConscript rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/SConscript diff --git a/bsp/n32/n32l43xml-stb/SConstruct b/bsp/n32/n32gxx_lxx/n32l43xml-stb/SConstruct similarity index 96% rename from bsp/n32/n32l43xml-stb/SConstruct rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/SConstruct index cfa5f35aba..14aafb0a2f 100644 --- a/bsp/n32/n32l43xml-stb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32l43xml-stb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32l43xml-stb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32l43xml-stb/applications/SConscript similarity index 100% rename from bsp/n32/n32l43xml-stb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/applications/SConscript diff --git a/bsp/n32/n32l43xml-stb/applications/main.c b/bsp/n32/n32gxx_lxx/n32l43xml-stb/applications/main.c similarity index 100% rename from bsp/n32/n32l43xml-stb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/applications/main.c diff --git a/bsp/n32/n32l43xml-stb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32l43xml-stb/board/Kconfig similarity index 100% rename from bsp/n32/n32l43xml-stb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/board/Kconfig diff --git a/bsp/n32/n32l43xml-stb/board/SConscript b/bsp/n32/n32gxx_lxx/n32l43xml-stb/board/SConscript similarity index 100% rename from bsp/n32/n32l43xml-stb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/board/SConscript diff --git a/bsp/n32/n32l43xml-stb/board/board.c b/bsp/n32/n32gxx_lxx/n32l43xml-stb/board/board.c similarity index 100% rename from bsp/n32/n32l43xml-stb/board/board.c rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/board/board.c diff --git a/bsp/n32/n32l43xml-stb/board/board.h b/bsp/n32/n32gxx_lxx/n32l43xml-stb/board/board.h similarity index 100% rename from bsp/n32/n32l43xml-stb/board/board.h rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/board/board.h diff --git a/bsp/n32/n32l43xml-stb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32l43xml-stb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32l43xml-stb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32l43xml-stb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32l43xml-stb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32l43xml-stb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32l43xml-stb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32l43xml-stb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32l43xml-stb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32l43xml-stb/figures/board.jpg b/bsp/n32/n32gxx_lxx/n32l43xml-stb/figures/board.jpg similarity index 100% rename from bsp/n32/n32l43xml-stb/figures/board.jpg rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/figures/board.jpg diff --git a/bsp/n32/n32l43xml-stb/project.ewd b/bsp/n32/n32gxx_lxx/n32l43xml-stb/project.ewd similarity index 100% rename from bsp/n32/n32l43xml-stb/project.ewd rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/project.ewd diff --git a/bsp/n32/n32l43xml-stb/project.ewp b/bsp/n32/n32gxx_lxx/n32l43xml-stb/project.ewp similarity index 86% rename from bsp/n32/n32l43xml-stb/project.ewp rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/project.ewp index 6b37926739..4c5c5570ce 100644 --- a/bsp/n32/n32l43xml-stb/project.ewp +++ b/bsp/n32/n32gxx_lxx/n32l43xml-stb/project.ewp @@ -358,29 +358,30 @@
- Compiler - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.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 - + CPU - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cunistd.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\environ.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S - $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 + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c - $PROJ_DIR$\..\..\..\components\drivers\core\device.c + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c - $PROJ_DIR$\..\..\..\components\drivers\misc\adc.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\adc.c - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -2339,158 +2308,185 @@ Finsh - $PROJ_DIR$\..\..\..\components\finsh\msh.c + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c - $PROJ_DIR$\..\..\..\components\finsh\shell.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c - $PROJ_DIR$\..\..\..\components\finsh\cmd.c + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c Kernel - $PROJ_DIR$\..\..\..\src\clock.c + $PROJ_DIR$\..\..\..\..\src\clock.c - $PROJ_DIR$\..\..\..\src\components.c + $PROJ_DIR$\..\..\..\..\src\components.c - $PROJ_DIR$\..\..\..\src\cpu_up.c + $PROJ_DIR$\..\..\..\..\src\cpu_up.c - $PROJ_DIR$\..\..\..\src\defunct.c + $PROJ_DIR$\..\..\..\..\src\defunct.c - $PROJ_DIR$\..\..\..\src\idle.c + $PROJ_DIR$\..\..\..\..\src\idle.c - $PROJ_DIR$\..\..\..\src\ipc.c + $PROJ_DIR$\..\..\..\..\src\ipc.c - $PROJ_DIR$\..\..\..\src\irq.c + $PROJ_DIR$\..\..\..\..\src\irq.c - $PROJ_DIR$\..\..\..\src\kservice.c + $PROJ_DIR$\..\..\..\..\src\kservice.c - $PROJ_DIR$\..\..\..\src\mem.c + $PROJ_DIR$\..\..\..\..\src\mem.c - $PROJ_DIR$\..\..\..\src\memheap.c + $PROJ_DIR$\..\..\..\..\src\memheap.c - $PROJ_DIR$\..\..\..\src\mempool.c + $PROJ_DIR$\..\..\..\..\src\mempool.c - $PROJ_DIR$\..\..\..\src\object.c + $PROJ_DIR$\..\..\..\..\src\object.c - $PROJ_DIR$\..\..\..\src\scheduler_comm.c + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c - $PROJ_DIR$\..\..\..\src\scheduler_up.c + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c - $PROJ_DIR$\..\..\..\src\thread.c + $PROJ_DIR$\..\..\..\..\src\thread.c - $PROJ_DIR$\..\..\..\src\timer.c + $PROJ_DIR$\..\..\..\..\src\timer.c - klibc + Libc - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c - $PROJ_DIR$\..\..\..\src\klibc\kstring.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.c - - - libcpu - $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cwchar.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\environ.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_close.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c - - - Libraries - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_i2c.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_pwr.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_wwdg.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_read.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_gpio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_remove.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\misc.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_write.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rcc.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscalls.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_flash.c + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c + + + + Libraries + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\CMSIS\device\system_n32l43x.c + + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_gpio.c + + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rcc.c $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_exti.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rtc.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\misc.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_iwdg.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_usart.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_can.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_i2c.c $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_spi.c + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_can.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_adc.c + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_dac.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_tim.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_dac.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rtc.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\CMSIS\device\system_n32l43x.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_pwr.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_usart.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_flash.c + + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_iwdg.c + + + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_wwdg.c - - - POSIX utc_UTest diff --git a/bsp/n32/n32l43xml-stb/project.eww b/bsp/n32/n32gxx_lxx/n32l43xml-stb/project.eww similarity index 100% rename from bsp/n32/n32l43xml-stb/project.eww rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/project.eww diff --git a/bsp/n32/n32gxx_lxx/n32l43xml-stb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32l43xml-stb/project.uvoptx new file mode 100644 index 0000000000..a8f4dba884 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32l43xml-stb/project.uvoptx @@ -0,0 +1,1317 @@ + + + + 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\ + + + 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 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L43x -FL020000 -FS08000000 -FP0($$Device:N32L436MB$Flash\N32L43x.FLM) + + + 0 + CMSIS_AGDI + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L43x -FL020000 -FS08000000 -FP0($$Device:N32L436MB$Flash\N32L43x.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 + + + + + CPU + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 2 + 4 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\can\dev_can.c + dev_can.c + 0 + 0 + + + 3 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\adc.c + adc.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\dac.c + dac.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\rtc\dev_rtc.c + dev_rtc.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi.c + dev_spi.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi_core.c + dev_spi_core.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\watchdog\dev_watchdog.c + dev_watchdog.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 29 + 2 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\CMSIS\device\startup\startup_n32l43x.s + startup_n32l43x.s + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_adc.c + drv_adc.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_can.c + drv_can.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_dac.c + drv_dac.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_rtc.c + drv_rtc.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 4 + 39 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_wdt.c + drv_wdt.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libc + 0 + 0 + 0 + 0 + + 7 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 73 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\CMSIS\device\system_n32l43x.c + system_n32l43x.c + 0 + 0 + + + 8 + 74 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_gpio.c + n32l43x_gpio.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rcc.c + n32l43x_rcc.c + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_exti.c + n32l43x_exti.c + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\misc.c + misc.c + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_usart.c + n32l43x_usart.c + 0 + 0 + + + 8 + 79 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_i2c.c + n32l43x_i2c.c + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_spi.c + n32l43x_spi.c + 0 + 0 + + + 8 + 81 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_can.c + n32l43x_can.c + 0 + 0 + + + 8 + 82 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_adc.c + n32l43x_adc.c + 0 + 0 + + + 8 + 83 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_dac.c + n32l43x_dac.c + 0 + 0 + + + 8 + 84 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_tim.c + n32l43x_tim.c + 0 + 0 + + + 8 + 85 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rtc.c + n32l43x_rtc.c + 0 + 0 + + + 8 + 86 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_pwr.c + n32l43x_pwr.c + 0 + 0 + + + 8 + 87 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_flash.c + n32l43x_flash.c + 0 + 0 + + + 8 + 88 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_iwdg.c + n32l43x_iwdg.c + 0 + 0 + + + 8 + 89 + 1 + 0 + 0 + 0 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_wwdg.c + n32l43x_wwdg.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/n32/n32l43xml-stb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32l43xml-stb/project.uvprojx similarity index 100% rename from bsp/n32/n32l43xml-stb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/project.uvprojx diff --git a/bsp/n32/n32l436-evb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32l43xml-stb/rtconfig.h similarity index 98% rename from bsp/n32/n32l436-evb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/rtconfig.h index a454f9f412..57bcc7aab0 100644 --- a/bsp/n32/n32l436-evb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32l43xml-stb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ @@ -155,6 +155,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -327,6 +328,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32gxx_lxx/n32l43xml-stb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32l43xml-stb/rtconfig.py new file mode 100644 index 0000000000..c3765e6f08 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32l43xml-stb/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' + 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 rtthread.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-M4.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' + CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -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-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + 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-M4' + AFLAGS += ' --fpu VFPv4_sp' + 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/n32/n32l43xml-stb/template.ewp b/bsp/n32/n32gxx_lxx/n32l43xml-stb/template.ewp similarity index 100% rename from bsp/n32/n32l43xml-stb/template.ewp rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/template.ewp diff --git a/bsp/n32/n32l43xml-stb/template.eww b/bsp/n32/n32gxx_lxx/n32l43xml-stb/template.eww similarity index 100% rename from bsp/n32/n32l43xml-stb/template.eww rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/template.eww diff --git a/bsp/n32/n32l43xml-stb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32l43xml-stb/template.uvoptx similarity index 100% rename from bsp/n32/n32l43xml-stb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/template.uvoptx diff --git a/bsp/n32/n32l43xml-stb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32l43xml-stb/template.uvprojx similarity index 100% rename from bsp/n32/n32l43xml-stb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32l43xml-stb/template.uvprojx diff --git a/bsp/n32/n32l43xrl-stb/.config b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/.config similarity index 97% rename from bsp/n32/n32l43xrl-stb/.config rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/.config index 26c579656c..fef23158b5 100644 --- a/bsp/n32/n32l43xrl-stb/.config +++ b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/.config @@ -179,7 +179,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -267,6 +267,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -361,8 +363,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -371,6 +371,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -572,6 +573,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -596,6 +598,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -644,6 +647,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -738,6 +744,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -893,7 +900,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -939,9 +962,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1066,6 +1091,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32gxx_lxx/n32l43xrl-stb/Kconfig b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/Kconfig new file mode 100644 index 0000000000..07edfefc34 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/n32/n32l43xrl-stb/README.md b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/README.md similarity index 100% rename from bsp/n32/n32l43xrl-stb/README.md rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/README.md diff --git a/bsp/n32/n32l43xrl-stb/SConscript b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/SConscript similarity index 100% rename from bsp/n32/n32l43xrl-stb/SConscript rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/SConscript diff --git a/bsp/n32/n32l43xrl-stb/SConstruct b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/SConstruct similarity index 96% rename from bsp/n32/n32l43xrl-stb/SConstruct rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/SConstruct index cfa5f35aba..14aafb0a2f 100644 --- a/bsp/n32/n32l43xrl-stb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32l43xrl-stb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/applications/SConscript similarity index 100% rename from bsp/n32/n32l43xrl-stb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/applications/SConscript diff --git a/bsp/n32/n32l43xrl-stb/applications/main.c b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/applications/main.c similarity index 100% rename from bsp/n32/n32l43xrl-stb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/applications/main.c diff --git a/bsp/n32/n32l43xrl-stb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/Kconfig similarity index 100% rename from bsp/n32/n32l43xrl-stb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/Kconfig diff --git a/bsp/n32/n32l43xrl-stb/board/SConscript b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/SConscript similarity index 100% rename from bsp/n32/n32l43xrl-stb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/SConscript diff --git a/bsp/n32/n32l43xrl-stb/board/board.c b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/board.c similarity index 100% rename from bsp/n32/n32l43xrl-stb/board/board.c rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/board.c diff --git a/bsp/n32/n32l43xrl-stb/board/board.h b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/board.h similarity index 100% rename from bsp/n32/n32l43xrl-stb/board/board.h rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/board.h diff --git a/bsp/n32/n32l43xrl-stb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32l43xrl-stb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32l43xrl-stb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32l43xrl-stb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32l43xrl-stb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32l43xrl-stb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32l43xrl-stb/figures/board.jpg b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/figures/board.jpg similarity index 100% rename from bsp/n32/n32l43xrl-stb/figures/board.jpg rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/figures/board.jpg diff --git a/bsp/n32/n32l43xrl-stb/project.ewd b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.ewd similarity index 100% rename from bsp/n32/n32l43xrl-stb/project.ewd rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.ewd diff --git a/bsp/n32/n32l43xrl-stb/project.ewp b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.ewp similarity index 86% rename from bsp/n32/n32l43xrl-stb/project.ewp rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.ewp index c0cb073932..1c3cb1642b 100644 --- a/bsp/n32/n32l43xrl-stb/project.ewp +++ b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.ewp @@ -358,29 +358,30 @@
- Compiler - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.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\cunistd.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 - + CPU - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_mem.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_open.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S - $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 + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c - $PROJ_DIR$\..\..\..\components\drivers\core\device.c + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c - $PROJ_DIR$\..\..\..\components\drivers\misc\adc.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\adc.c - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -2339,130 +2308,160 @@ Finsh - $PROJ_DIR$\..\..\..\components\finsh\shell.c + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c - $PROJ_DIR$\..\..\..\components\finsh\msh.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c - $PROJ_DIR$\..\..\..\components\finsh\cmd.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c Kernel - $PROJ_DIR$\..\..\..\src\clock.c + $PROJ_DIR$\..\..\..\..\src\clock.c - $PROJ_DIR$\..\..\..\src\components.c + $PROJ_DIR$\..\..\..\..\src\components.c - $PROJ_DIR$\..\..\..\src\cpu_up.c + $PROJ_DIR$\..\..\..\..\src\cpu_up.c - $PROJ_DIR$\..\..\..\src\defunct.c + $PROJ_DIR$\..\..\..\..\src\defunct.c - $PROJ_DIR$\..\..\..\src\idle.c + $PROJ_DIR$\..\..\..\..\src\idle.c - $PROJ_DIR$\..\..\..\src\ipc.c + $PROJ_DIR$\..\..\..\..\src\ipc.c - $PROJ_DIR$\..\..\..\src\irq.c + $PROJ_DIR$\..\..\..\..\src\irq.c - $PROJ_DIR$\..\..\..\src\kservice.c + $PROJ_DIR$\..\..\..\..\src\kservice.c - $PROJ_DIR$\..\..\..\src\mem.c + $PROJ_DIR$\..\..\..\..\src\mem.c - $PROJ_DIR$\..\..\..\src\memheap.c + $PROJ_DIR$\..\..\..\..\src\memheap.c - $PROJ_DIR$\..\..\..\src\mempool.c + $PROJ_DIR$\..\..\..\..\src\mempool.c - $PROJ_DIR$\..\..\..\src\object.c + $PROJ_DIR$\..\..\..\..\src\object.c - $PROJ_DIR$\..\..\..\src\scheduler_comm.c + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c - $PROJ_DIR$\..\..\..\src\scheduler_up.c + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c - $PROJ_DIR$\..\..\..\src\thread.c + $PROJ_DIR$\..\..\..\..\src\thread.c - $PROJ_DIR$\..\..\..\src\timer.c + $PROJ_DIR$\..\..\..\..\src\timer.c - klibc + Libc - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c - $PROJ_DIR$\..\..\..\src\klibc\kstring.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.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 - - - libcpu - $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.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 + + + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c Libraries - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_spi.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\CMSIS\device\system_n32l43x.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_wwdg.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_gpio.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_usart.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rcc.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_tim.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_exti.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_exti.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\misc.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rcc.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_usart.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rtc.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_i2c.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_pwr.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_spi.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_iwdg.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_can.c $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_adc.c @@ -2471,27 +2470,24 @@ $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_dac.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\misc.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_tim.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\CMSIS\device\system_n32l43x.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rtc.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_i2c.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_pwr.c $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_flash.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_gpio.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_iwdg.c - $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_can.c + $PROJ_DIR$\..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_wwdg.c - - POSIX - utc_UTest diff --git a/bsp/n32/n32l43xrl-stb/project.eww b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.eww similarity index 100% rename from bsp/n32/n32l43xrl-stb/project.eww rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.eww diff --git a/bsp/n32/n32l43xrl-stb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.uvoptx similarity index 100% rename from bsp/n32/n32l43xrl-stb/project.uvoptx rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.uvoptx diff --git a/bsp/n32/n32l43xrl-stb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.uvprojx similarity index 89% rename from bsp/n32/n32l43xrl-stb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.uvprojx index 3b5c38167a..8c874cac0a 100644 --- a/bsp/n32/n32l43xrl-stb/project.uvprojx +++ b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/project.uvprojx @@ -334,9 +334,9 @@ 0 - USE_STDPERIPH_DRIVER, __CLK_TCK=RT_TICK_PER_SECOND, RT_USING_LIBC, __STDC_LIMIT_MACROS, __RTTHREAD__, RT_USING_ARMLIBC, N32L43X + USE_STDPERIPH_DRIVER, RT_USING_ARMLIBC, N32L43X, RT_USING_LIBC, __RTTHREAD__, __STDC_LIMIT_MACROS, __CLK_TCK=RT_TICK_PER_SECOND - ..\..\..\libcpu\arm\common;..\..\..\components\drivers\include;..\..\..\components\drivers\include;board;..\..\..\components\drivers\smp_call;..\..\..\components\libc\posix\ipc;..\..\..\components\libc\compilers\common\include;..\..\..\components\drivers\include;..\libraries\n32_drivers;..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\inc;..\..\..\components\drivers\phy;..\libraries\N32L43x_Firmware_Library\CMSIS\device;..\..\..\components\libc\posix\io\poll;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\eventfd;..\..\..\components\libc\posix\io\epoll;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\n32_drivers\config;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\drivers\include;..\..\..\components\drivers\include;applications;..\..\..\components\finsh;.;..\..\..\libcpu\arm\cortex-m4;..\libraries\N32L43x_Firmware_Library\CMSIS\core;..\..\..\components\drivers\spi + ..\..\..\..\components\drivers\include;.;..\libraries\N32L43x_Firmware_Library\CMSIS\core;..\libraries\N32L43x_Firmware_Library\CMSIS\device;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\inc;..\..\..\..\include;..\..\..\..\components\libc\compilers\common\include;..\libraries\n32_drivers\config;..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\smp_call;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\phy;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;board;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;applications;..\..\..\..\components\libc\posix\io\epoll;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\libraries\n32_drivers;..\..\..\..\components\net\utest;..\..\..\..\libcpu\arm\common;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\spi;..\..\..\..\components\drivers\include @@ -388,61 +388,33 @@ - Compiler + CPU - syscall_mem.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - - - - syscalls.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscalls.c - - - - - cctype.c - 1 - ..\..\..\components\libc\compilers\common\cctype.c - - - - - cstdlib.c - 1 - ..\..\..\components\libc\compilers\common\cstdlib.c - - - - - cstring.c + div0.c 1 - ..\..\..\components\libc\compilers\common\cstring.c + ..\..\..\..\libcpu\arm\common\div0.c - ctime.c + showmem.c 1 - ..\..\..\components\libc\compilers\common\ctime.c + ..\..\..\..\libcpu\arm\common\showmem.c - cunistd.c - 1 - ..\..\..\components\libc\compilers\common\cunistd.c + context_rvds.S + 2 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S - cwchar.c + cpuport.c 1 - ..\..\..\components\libc\compilers\common\cwchar.c + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c @@ -452,7 +424,7 @@ dev_can.c 1 - ..\..\..\components\drivers\can\dev_can.c + ..\..\..\..\components\drivers\can\dev_can.c @@ -471,7 +443,7 @@ device.c 1 - ..\..\..\components\drivers\core\device.c + ..\..\..\..\components\drivers\core\device.c @@ -509,7 +481,7 @@ dev_i2c_bit_ops.c 1 - ..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c @@ -528,7 +500,7 @@ dev_i2c_core.c 1 - ..\..\..\components\drivers\i2c\dev_i2c_core.c + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c @@ -547,7 +519,7 @@ dev_i2c_dev.c 1 - ..\..\..\components\drivers\i2c\dev_i2c_dev.c + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c @@ -566,7 +538,7 @@ completion_comm.c 1 - ..\..\..\components\drivers\ipc\completion_comm.c + ..\..\..\..\components\drivers\ipc\completion_comm.c @@ -585,7 +557,7 @@ completion_up.c 1 - ..\..\..\components\drivers\ipc\completion_up.c + ..\..\..\..\components\drivers\ipc\completion_up.c @@ -604,7 +576,7 @@ condvar.c 1 - ..\..\..\components\drivers\ipc\condvar.c + ..\..\..\..\components\drivers\ipc\condvar.c @@ -623,7 +595,7 @@ dataqueue.c 1 - ..\..\..\components\drivers\ipc\dataqueue.c + ..\..\..\..\components\drivers\ipc\dataqueue.c @@ -642,7 +614,7 @@ pipe.c 1 - ..\..\..\components\drivers\ipc\pipe.c + ..\..\..\..\components\drivers\ipc\pipe.c @@ -661,7 +633,7 @@ ringblk_buf.c 1 - ..\..\..\components\drivers\ipc\ringblk_buf.c + ..\..\..\..\components\drivers\ipc\ringblk_buf.c @@ -680,7 +652,7 @@ ringbuffer.c 1 - ..\..\..\components\drivers\ipc\ringbuffer.c + ..\..\..\..\components\drivers\ipc\ringbuffer.c @@ -699,7 +671,7 @@ waitqueue.c 1 - ..\..\..\components\drivers\ipc\waitqueue.c + ..\..\..\..\components\drivers\ipc\waitqueue.c @@ -718,7 +690,7 @@ workqueue.c 1 - ..\..\..\components\drivers\ipc\workqueue.c + ..\..\..\..\components\drivers\ipc\workqueue.c @@ -737,7 +709,7 @@ adc.c 1 - ..\..\..\components\drivers\misc\adc.c + ..\..\..\..\components\drivers\misc\adc.c @@ -756,7 +728,7 @@ dac.c 1 - ..\..\..\components\drivers\misc\dac.c + ..\..\..\..\components\drivers\misc\dac.c @@ -775,7 +747,7 @@ dev_pin.c 1 - ..\..\..\components\drivers\pin\dev_pin.c + ..\..\..\..\components\drivers\pin\dev_pin.c @@ -794,7 +766,7 @@ dev_rtc.c 1 - ..\..\..\components\drivers\rtc\dev_rtc.c + ..\..\..\..\components\drivers\rtc\dev_rtc.c @@ -813,7 +785,7 @@ dev_serial.c 1 - ..\..\..\components\drivers\serial\dev_serial.c + ..\..\..\..\components\drivers\serial\dev_serial.c @@ -832,7 +804,7 @@ dev_spi.c 1 - ..\..\..\components\drivers\spi\dev_spi.c + ..\..\..\..\components\drivers\spi\dev_spi.c @@ -851,7 +823,7 @@ dev_spi_core.c 1 - ..\..\..\components\drivers\spi\dev_spi_core.c + ..\..\..\..\components\drivers\spi\dev_spi_core.c @@ -870,7 +842,7 @@ dev_watchdog.c 1 - ..\..\..\components\drivers\watchdog\dev_watchdog.c + ..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -970,30 +942,30 @@ Finsh - cmd.c + shell.c 1 - ..\..\..\components\finsh\cmd.c + ..\..\..\..\components\finsh\shell.c - shell.c + msh.c 1 - ..\..\..\components\finsh\shell.c + ..\..\..\..\components\finsh\msh.c msh_parse.c 1 - ..\..\..\components\finsh\msh_parse.c + ..\..\..\..\components\finsh\msh_parse.c - msh.c + cmd.c 1 - ..\..\..\components\finsh\msh.c + ..\..\..\..\components\finsh\cmd.c
@@ -1003,7 +975,7 @@ clock.c 1 - ..\..\..\src\clock.c + ..\..\..\..\src\clock.c @@ -1022,7 +994,7 @@ components.c 1 - ..\..\..\src\components.c + ..\..\..\..\src\components.c @@ -1041,7 +1013,7 @@ cpu_up.c 1 - ..\..\..\src\cpu_up.c + ..\..\..\..\src\cpu_up.c @@ -1060,7 +1032,7 @@ defunct.c 1 - ..\..\..\src\defunct.c + ..\..\..\..\src\defunct.c @@ -1079,7 +1051,7 @@ idle.c 1 - ..\..\..\src\idle.c + ..\..\..\..\src\idle.c @@ -1098,7 +1070,7 @@ ipc.c 1 - ..\..\..\src\ipc.c + ..\..\..\..\src\ipc.c @@ -1117,7 +1089,7 @@ irq.c 1 - ..\..\..\src\irq.c + ..\..\..\..\src\irq.c @@ -1136,7 +1108,7 @@ kservice.c 1 - ..\..\..\src\kservice.c + ..\..\..\..\src\kservice.c @@ -1155,7 +1127,7 @@ mem.c 1 - ..\..\..\src\mem.c + ..\..\..\..\src\mem.c @@ -1174,7 +1146,7 @@ memheap.c 1 - ..\..\..\src\memheap.c + ..\..\..\..\src\memheap.c @@ -1193,7 +1165,7 @@ mempool.c 1 - ..\..\..\src\mempool.c + ..\..\..\..\src\mempool.c @@ -1212,7 +1184,7 @@ object.c 1 - ..\..\..\src\object.c + ..\..\..\..\src\object.c @@ -1231,7 +1203,7 @@ scheduler_comm.c 1 - ..\..\..\src\scheduler_comm.c + ..\..\..\..\src\scheduler_comm.c @@ -1250,7 +1222,7 @@ scheduler_up.c 1 - ..\..\..\src\scheduler_up.c + ..\..\..\..\src\scheduler_up.c @@ -1269,7 +1241,7 @@ thread.c 1 - ..\..\..\src\thread.c + ..\..\..\..\src\thread.c @@ -1288,7 +1260,7 @@ timer.c 1 - ..\..\..\src\timer.c + ..\..\..\..\src\timer.c @@ -1305,116 +1277,113 @@
- klibc + Libc - rt_vsnprintf_tiny.c + syscall_mem.c 1 - ..\..\..\src\klibc\rt_vsnprintf_tiny.c + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c - rt_vsscanf.c + syscalls.c 1 - ..\..\..\src\klibc\rt_vsscanf.c + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c - kstring.c + cctype.c 1 - ..\..\..\src\klibc\kstring.c + ..\..\..\..\components\libc\compilers\common\cctype.c - kerrno.c + cstdlib.c 1 - ..\..\..\src\klibc\kerrno.c + ..\..\..\..\components\libc\compilers\common\cstdlib.c - kstdio.c + cstring.c 1 - ..\..\..\src\klibc\kstdio.c + ..\..\..\..\components\libc\compilers\common\cstring.c - - - libcpu - div0.c + ctime.c 1 - ..\..\..\libcpu\arm\common\div0.c + ..\..\..\..\components\libc\compilers\common\ctime.c - showmem.c + cunistd.c 1 - ..\..\..\libcpu\arm\common\showmem.c + ..\..\..\..\components\libc\compilers\common\cunistd.c - context_rvds.S - 2 - ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + cwchar.c + 1 + ..\..\..\..\components\libc\compilers\common\cwchar.c - cpuport.c + kerrno.c 1 - ..\..\..\libcpu\arm\cortex-m4\cpuport.c + ..\..\..\..\src\klibc\kerrno.c - - - Libraries - n32l43x_adc.c + kstdio.c 1 - ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_adc.c + ..\..\..\..\src\klibc\kstdio.c - n32l43x_can.c + kstring.c 1 - ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_can.c + ..\..\..\..\src\klibc\kstring.c - n32l43x_spi.c + rt_vsnprintf_tiny.c 1 - ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_spi.c + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c - n32l43x_rtc.c + rt_vsscanf.c 1 - ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rtc.c + ..\..\..\..\src\klibc\rt_vsscanf.c + + + Libraries - misc.c + system_n32l43x.c 1 - ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\misc.c + ..\libraries\N32L43x_Firmware_Library\CMSIS\device\system_n32l43x.c - n32l43x_usart.c + n32l43x_gpio.c 1 - ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_usart.c + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_gpio.c @@ -1433,37 +1402,51 @@ - n32l43x_dac.c + misc.c 1 - ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_dac.c + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\misc.c - n32l43x_pwr.c + n32l43x_usart.c 1 - ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_pwr.c + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_usart.c - n32l43x_iwdg.c + n32l43x_i2c.c 1 - ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_iwdg.c + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_i2c.c - n32l43x_gpio.c + n32l43x_spi.c 1 - ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_gpio.c + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_spi.c - n32l43x_i2c.c + n32l43x_can.c 1 - ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_i2c.c + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_can.c + + + + + n32l43x_adc.c + 1 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_adc.c + + + + + n32l43x_dac.c + 1 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_dac.c @@ -1475,9 +1458,16 @@ - system_n32l43x.c + n32l43x_rtc.c 1 - ..\libraries\N32L43x_Firmware_Library\CMSIS\device\system_n32l43x.c + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_rtc.c + + + + + n32l43x_pwr.c + 1 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_pwr.c @@ -1487,6 +1477,13 @@ ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_flash.c + + + n32l43x_iwdg.c + 1 + ..\libraries\N32L43x_Firmware_Library\n32l43x_std_periph_driver\src\n32l43x_iwdg.c + + n32l43x_wwdg.c diff --git a/bsp/n32/n32l43xml-stb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/rtconfig.h similarity index 98% rename from bsp/n32/n32l43xml-stb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/rtconfig.h index a454f9f412..57bcc7aab0 100644 --- a/bsp/n32/n32l43xml-stb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ @@ -155,6 +155,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -327,6 +328,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32gxx_lxx/n32l43xrl-stb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/rtconfig.py new file mode 100644 index 0000000000..c3765e6f08 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' + 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 rtthread.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-M4.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' + CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -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-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + 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-M4' + AFLAGS += ' --fpu VFPv4_sp' + 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/n32/n32l43xrl-stb/template.ewp b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/template.ewp similarity index 100% rename from bsp/n32/n32l43xrl-stb/template.ewp rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/template.ewp diff --git a/bsp/n32/n32l43xrl-stb/template.eww b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/template.eww similarity index 100% rename from bsp/n32/n32l43xrl-stb/template.eww rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/template.eww diff --git a/bsp/n32/n32l43xrl-stb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/template.uvoptx similarity index 100% rename from bsp/n32/n32l43xrl-stb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/template.uvoptx diff --git a/bsp/n32/n32l43xrl-stb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32l43xrl-stb/template.uvprojx similarity index 100% rename from bsp/n32/n32l43xrl-stb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32l43xrl-stb/template.uvprojx diff --git a/bsp/n32/n32wb45xl-evb/.config b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/.config similarity index 97% rename from bsp/n32/n32wb45xl-evb/.config rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/.config index 03f1cee04e..0a4df74121 100644 --- a/bsp/n32/n32wb45xl-evb/.config +++ b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/.config @@ -180,7 +180,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="usart1" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -274,6 +274,8 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set # CONFIG_RT_USING_SOFT_SPI is not set # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set @@ -368,8 +370,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -378,6 +378,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -579,6 +580,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_U8G2 is not set # end of u8g2: a monochrome graphic library +# CONFIG_PKG_USING_NES_SIMULATOR is not set # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set @@ -604,6 +606,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # tools packages # +# CONFIG_PKG_USING_VECTOR is not set # CONFIG_PKG_USING_CMBACKTRACE is not set # CONFIG_PKG_USING_MCOREDUMP is not set # CONFIG_PKG_USING_EASYFLASH is not set @@ -653,6 +656,9 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set # end of tools packages # @@ -747,6 +753,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -902,7 +909,23 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set # end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers # end of HAL & SDK Drivers # @@ -948,9 +971,11 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1075,6 +1100,10 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_PKG_USING_IC74HC165 is not set # CONFIG_PKG_USING_IST8310 is not set # CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set # CONFIG_PKG_USING_SPI_TOOLS is not set # end of peripheral libraries and drivers diff --git a/bsp/n32/n32gxx_lxx/n32wb45xl-evb/Kconfig b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/Kconfig new file mode 100644 index 0000000000..07edfefc34 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/Kconfig @@ -0,0 +1,12 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" +rsource "board/Kconfig" diff --git a/bsp/n32/n32wb45xl-evb/README.md b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/README.md similarity index 100% rename from bsp/n32/n32wb45xl-evb/README.md rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/README.md diff --git a/bsp/n32/n32wb45xl-evb/SConscript b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/SConscript similarity index 100% rename from bsp/n32/n32wb45xl-evb/SConscript rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/SConscript diff --git a/bsp/n32/n32wb45xl-evb/SConstruct b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/SConstruct similarity index 96% rename from bsp/n32/n32wb45xl-evb/SConstruct rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/SConstruct index ab72eba93b..c2c9b82dfc 100644 --- a/bsp/n32/n32wb45xl-evb/SConstruct +++ b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/SConstruct @@ -5,7 +5,7 @@ import rtconfig if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: - RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..') sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] try: diff --git a/bsp/n32/n32wb45xl-evb/applications/SConscript b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/applications/SConscript similarity index 100% rename from bsp/n32/n32wb45xl-evb/applications/SConscript rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/applications/SConscript diff --git a/bsp/n32/n32wb45xl-evb/applications/main.c b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/applications/main.c similarity index 100% rename from bsp/n32/n32wb45xl-evb/applications/main.c rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/applications/main.c diff --git a/bsp/n32/n32wb45xl-evb/board/Kconfig b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/Kconfig similarity index 100% rename from bsp/n32/n32wb45xl-evb/board/Kconfig rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/Kconfig diff --git a/bsp/n32/n32wb45xl-evb/board/SConscript b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/SConscript similarity index 100% rename from bsp/n32/n32wb45xl-evb/board/SConscript rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/SConscript diff --git a/bsp/n32/n32wb45xl-evb/board/board.c b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/board.c similarity index 100% rename from bsp/n32/n32wb45xl-evb/board/board.c rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/board.c diff --git a/bsp/n32/n32wb45xl-evb/board/board.h b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/board.h similarity index 100% rename from bsp/n32/n32wb45xl-evb/board/board.h rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/board.h diff --git a/bsp/n32/n32wb45xl-evb/board/linker_scripts/link.icf b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/linker_scripts/link.icf similarity index 100% rename from bsp/n32/n32wb45xl-evb/board/linker_scripts/link.icf rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/linker_scripts/link.icf diff --git a/bsp/n32/n32wb45xl-evb/board/linker_scripts/link.lds b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/linker_scripts/link.lds similarity index 100% rename from bsp/n32/n32wb45xl-evb/board/linker_scripts/link.lds rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/linker_scripts/link.lds diff --git a/bsp/n32/n32wb45xl-evb/board/linker_scripts/link.sct b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/linker_scripts/link.sct similarity index 100% rename from bsp/n32/n32wb45xl-evb/board/linker_scripts/link.sct rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/board/linker_scripts/link.sct diff --git a/bsp/n32/n32wb45xl-evb/figures/board.jpg b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/figures/board.jpg similarity index 100% rename from bsp/n32/n32wb45xl-evb/figures/board.jpg rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/figures/board.jpg diff --git a/bsp/n32/n32wb45xl-evb/project.ewd b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.ewd similarity index 100% rename from bsp/n32/n32wb45xl-evb/project.ewd rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.ewd diff --git a/bsp/n32/n32wb45xl-evb/project.ewp b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.ewp similarity index 86% rename from bsp/n32/n32wb45xl-evb/project.ewp rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.ewp index cf5e798397..5ec12a1a79 100644 --- a/bsp/n32/n32wb45xl-evb/project.ewp +++ b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.ewp @@ -358,29 +358,30 @@ - Compiler - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.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\cunistd.c - - - $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c - + CPU - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\environ.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\atomic_arm.c - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_close.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\div0.c - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\common\showmem.c - $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_mem.c + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\context_iar.S - $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 + $PROJ_DIR$\..\..\..\..\libcpu\arm\cortex-m4\cpuport.c DeviceDrivers - $PROJ_DIR$\..\..\..\components\drivers\can\dev_can.c + $PROJ_DIR$\..\..\..\..\components\drivers\can\dev_can.c - $PROJ_DIR$\..\..\..\components\drivers\core\device.c + $PROJ_DIR$\..\..\..\..\components\drivers\core\device.c $PROJ_DIR$\..\..\..\components\drivers\clock_time\clock_timer.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_core.c - $PROJ_DIR$\..\..\..\components\drivers\i2c\dev_i2c_dev.c + $PROJ_DIR$\..\..\..\..\components\drivers\i2c\dev_i2c_dev.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_comm.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_comm.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\completion_up.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\completion_up.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\condvar.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\condvar.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\dataqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\pipe.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringblk_buf.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\ringbuffer.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\waitqueue.c - $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + $PROJ_DIR$\..\..\..\..\components\drivers\ipc\workqueue.c - $PROJ_DIR$\..\..\..\components\drivers\misc\adc.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\adc.c - $PROJ_DIR$\..\..\..\components\drivers\misc\dac.c + $PROJ_DIR$\..\..\..\..\components\drivers\misc\dac.c - $PROJ_DIR$\..\..\..\components\drivers\pin\dev_pin.c + $PROJ_DIR$\..\..\..\..\components\drivers\pin\dev_pin.c - $PROJ_DIR$\..\..\..\components\drivers\rtc\dev_rtc.c + $PROJ_DIR$\..\..\..\..\components\drivers\rtc\dev_rtc.c - $PROJ_DIR$\..\..\..\components\drivers\serial\dev_serial.c + $PROJ_DIR$\..\..\..\..\components\drivers\serial\dev_serial.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi.c - $PROJ_DIR$\..\..\..\components\drivers\spi\dev_spi_core.c + $PROJ_DIR$\..\..\..\..\components\drivers\spi\dev_spi_core.c - $PROJ_DIR$\..\..\..\components\drivers\watchdog\dev_watchdog.c + $PROJ_DIR$\..\..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -2339,151 +2311,178 @@ Finsh - $PROJ_DIR$\..\..\..\components\finsh\shell.c + $PROJ_DIR$\..\..\..\..\components\finsh\shell.c - $PROJ_DIR$\..\..\..\components\finsh\msh.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh.c - $PROJ_DIR$\..\..\..\components\finsh\cmd.c + $PROJ_DIR$\..\..\..\..\components\finsh\msh_parse.c - $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + $PROJ_DIR$\..\..\..\..\components\finsh\cmd.c Kernel - $PROJ_DIR$\..\..\..\src\clock.c + $PROJ_DIR$\..\..\..\..\src\clock.c - $PROJ_DIR$\..\..\..\src\components.c + $PROJ_DIR$\..\..\..\..\src\components.c - $PROJ_DIR$\..\..\..\src\cpu_up.c + $PROJ_DIR$\..\..\..\..\src\cpu_up.c - $PROJ_DIR$\..\..\..\src\defunct.c + $PROJ_DIR$\..\..\..\..\src\defunct.c - $PROJ_DIR$\..\..\..\src\idle.c + $PROJ_DIR$\..\..\..\..\src\idle.c - $PROJ_DIR$\..\..\..\src\ipc.c + $PROJ_DIR$\..\..\..\..\src\ipc.c - $PROJ_DIR$\..\..\..\src\irq.c + $PROJ_DIR$\..\..\..\..\src\irq.c - $PROJ_DIR$\..\..\..\src\kservice.c + $PROJ_DIR$\..\..\..\..\src\kservice.c - $PROJ_DIR$\..\..\..\src\mem.c + $PROJ_DIR$\..\..\..\..\src\mem.c - $PROJ_DIR$\..\..\..\src\memheap.c + $PROJ_DIR$\..\..\..\..\src\memheap.c - $PROJ_DIR$\..\..\..\src\mempool.c + $PROJ_DIR$\..\..\..\..\src\mempool.c - $PROJ_DIR$\..\..\..\src\object.c + $PROJ_DIR$\..\..\..\..\src\object.c - $PROJ_DIR$\..\..\..\src\scheduler_comm.c + $PROJ_DIR$\..\..\..\..\src\scheduler_comm.c - $PROJ_DIR$\..\..\..\src\scheduler_up.c + $PROJ_DIR$\..\..\..\..\src\scheduler_up.c - $PROJ_DIR$\..\..\..\src\thread.c + $PROJ_DIR$\..\..\..\..\src\thread.c - $PROJ_DIR$\..\..\..\src\timer.c + $PROJ_DIR$\..\..\..\..\src\timer.c - klibc + Libc - $PROJ_DIR$\..\..\..\src\klibc\rt_vsscanf.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cctype.c - $PROJ_DIR$\..\..\..\src\klibc\kstdio.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstdlib.c - $PROJ_DIR$\..\..\..\src\klibc\rt_vsnprintf_tiny.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cstring.c - $PROJ_DIR$\..\..\..\src\klibc\kstring.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\ctime.c - $PROJ_DIR$\..\..\..\src\klibc\kerrno.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cunistd.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\common\cwchar.c + + + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\environ.c - - - libcpu - $PROJ_DIR$\..\..\..\libcpu\arm\common\atomic_arm.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_close.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_lseek.c - $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_mem.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + $PROJ_DIR$\..\..\..\..\components\libc\compilers\dlib\syscall_open.c - $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.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 + + + $PROJ_DIR$\..\..\..\..\src\klibc\kerrno.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstdio.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\kstring.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + $PROJ_DIR$\..\..\..\..\src\klibc\rt_vsscanf.c Libraries - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_rcc.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\CMSIS\device\system_n32wb452.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_i2c.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_gpio.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_bkp.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_rcc.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_tim.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_exti.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_adc.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\misc.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_exti.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_usart.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_can.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_i2c.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_dac.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_spi.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_usart.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_can.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_gpio.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_adc.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_spi.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_dac.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_rtc.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_tim.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\CMSIS\device\system_n32wb452.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_rtc.c $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_pwr.c - $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\misc.c + $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_bkp.c $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_wwdg.c @@ -2492,9 +2491,6 @@ $PROJ_DIR$\..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_iwdg.c - - POSIX - utc_UTest diff --git a/bsp/n32/n32wb45xl-evb/project.eww b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.eww similarity index 100% rename from bsp/n32/n32wb45xl-evb/project.eww rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.eww diff --git a/bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.uvoptx b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.uvoptx new file mode 100644 index 0000000000..b36a24c17f --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.uvoptx @@ -0,0 +1,1324 @@ + + + + 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\ + + + 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 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32WB452 -FL080000 -FS08000000 -FP0($$Device:N32WB452LEQ6$Flash\N32WB452.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 + + + + + CPU + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 2 + 5 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\can\dev_can.c + dev_can.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_bit_ops.c + dev_i2c_bit_ops.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_core.c + dev_i2c_core.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\i2c\dev_i2c_dev.c + dev_i2c_dev.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\adc.c + adc.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\misc\dac.c + dac.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\rtc\dev_rtc.c + dev_rtc.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi.c + dev_spi.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\spi\dev_spi_core.c + dev_spi_core.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\watchdog\dev_watchdog.c + dev_watchdog.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 30 + 2 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\CMSIS\device\startup\startup_n32wb452.s + startup_n32wb452.s + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_adc.c + drv_adc.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_can.c + drv_can.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_dac.c + drv_dac.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_rtc.c + drv_rtc.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 4 + 39 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 4 + 40 + 1 + 0 + 0 + 0 + ..\libraries\n32_drivers\drv_wdt.c + drv_wdt.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\memheap.c + memheap.c + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libc + 0 + 0 + 0 + 0 + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 73 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 74 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\CMSIS\device\system_n32wb452.c + system_n32wb452.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_gpio.c + n32wb452_gpio.c + 0 + 0 + + + 8 + 76 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_rcc.c + n32wb452_rcc.c + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_exti.c + n32wb452_exti.c + 0 + 0 + + + 8 + 78 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\misc.c + misc.c + 0 + 0 + + + 8 + 79 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_usart.c + n32wb452_usart.c + 0 + 0 + + + 8 + 80 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_i2c.c + n32wb452_i2c.c + 0 + 0 + + + 8 + 81 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_spi.c + n32wb452_spi.c + 0 + 0 + + + 8 + 82 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_can.c + n32wb452_can.c + 0 + 0 + + + 8 + 83 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_adc.c + n32wb452_adc.c + 0 + 0 + + + 8 + 84 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_dac.c + n32wb452_dac.c + 0 + 0 + + + 8 + 85 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_tim.c + n32wb452_tim.c + 0 + 0 + + + 8 + 86 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_rtc.c + n32wb452_rtc.c + 0 + 0 + + + 8 + 87 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_pwr.c + n32wb452_pwr.c + 0 + 0 + + + 8 + 88 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_bkp.c + n32wb452_bkp.c + 0 + 0 + + + 8 + 89 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_wwdg.c + n32wb452_wwdg.c + 0 + 0 + + + 8 + 90 + 1 + 0 + 0 + 0 + ..\libraries\N32WB452_Firmware_Library\n32wb452_std_periph_driver\src\n32wb452_iwdg.c + n32wb452_iwdg.c + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/bsp/n32/n32wb45xl-evb/project.uvprojx b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.uvprojx similarity index 100% rename from bsp/n32/n32wb45xl-evb/project.uvprojx rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/project.uvprojx diff --git a/bsp/n32/n32wb45xl-evb/rtconfig.h b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/rtconfig.h similarity index 98% rename from bsp/n32/n32wb45xl-evb/rtconfig.h rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/rtconfig.h index 7d15dff71c..451940bab2 100644 --- a/bsp/n32/n32wb45xl-evb/rtconfig.h +++ b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/rtconfig.h @@ -104,7 +104,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "usart1" -#define RT_VER_NUM 0x50201 +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define RT_USING_HW_ATOMIC @@ -160,6 +160,7 @@ #define RT_USING_DAC #define RT_USING_RTC #define RT_USING_SPI +#define RT_USING_SPI_ISR #define RT_USING_WDT #define RT_USING_PIN #define RT_USING_HWTIMER @@ -332,6 +333,14 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ /* end of HAL & SDK Drivers */ /* sensors drivers */ diff --git a/bsp/n32/n32gxx_lxx/n32wb45xl-evb/rtconfig.py b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/rtconfig.py new file mode 100644 index 0000000000..c3765e6f08 --- /dev/null +++ b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' + 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 rtthread.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-M4.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' + CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -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-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + 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-M4' + AFLAGS += ' --fpu VFPv4_sp' + 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/n32/n32wb45xl-evb/template.ewp b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/template.ewp similarity index 100% rename from bsp/n32/n32wb45xl-evb/template.ewp rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/template.ewp diff --git a/bsp/n32/n32wb45xl-evb/template.eww b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/template.eww similarity index 100% rename from bsp/n32/n32wb45xl-evb/template.eww rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/template.eww diff --git a/bsp/n32/n32wb45xl-evb/template.uvoptx b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/template.uvoptx similarity index 100% rename from bsp/n32/n32wb45xl-evb/template.uvoptx rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/template.uvoptx diff --git a/bsp/n32/n32wb45xl-evb/template.uvprojx b/bsp/n32/n32gxx_lxx/n32wb45xl-evb/template.uvprojx similarity index 100% rename from bsp/n32/n32wb45xl-evb/template.uvprojx rename to bsp/n32/n32gxx_lxx/n32wb45xl-evb/template.uvprojx diff --git a/bsp/n32/tools/sdk_dist.py b/bsp/n32/n32gxx_lxx/tools/sdk_dist.py similarity index 100% rename from bsp/n32/tools/sdk_dist.py rename to bsp/n32/n32gxx_lxx/tools/sdk_dist.py diff --git a/bsp/n32/n32hxxx/.clang-format-ignore b/bsp/n32/n32hxxx/.clang-format-ignore new file mode 100644 index 0000000000..a47789d228 --- /dev/null +++ b/bsp/n32/n32hxxx/.clang-format-ignore @@ -0,0 +1,12 @@ + +# files format check exclude path, please follow the instructions below to modify; +# If you need to exclude an entire folder, add the folder path in dir_path; +# If you need to exclude a file, add the path to the file in file_path. + +# 从 .ignore_format.yml 迁移的规则 +/n32h760zil7-stb/board/Cube_Config/ +/n32h760zil7-stb/board/Cube_Config/data/ +/n32h760zil7-stb/board/Cube_Config/Driver/ +/n32h760zil7-stb/board/Cube_Config/MDK-ARM/ +/n32h760zil7-stb/board/Cube_Config/startup/ +/n32h760zil7-stb/board/Cube_Config/USER/ \ No newline at end of file diff --git a/bsp/n32/n32hxxx/libraries/Kconfig b/bsp/n32/n32hxxx/libraries/Kconfig new file mode 100644 index 0000000000..4f00588009 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/Kconfig @@ -0,0 +1,9 @@ +config SOC_FAMILY_N32 + bool + +config SOC_SERIES_N32H7xx + bool + select ARCH_ARM_CORTEX_M7 + select SOC_FAMILY_N32 + + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/SConscript b/bsp/n32/n32hxxx/libraries/N32_Drivers/SConscript new file mode 100644 index 0000000000..430a293f9a --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/SConscript @@ -0,0 +1,18 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * +import os + +cwd = GetCurrentDir() +group = [] +src = ['drv_common.c'] +path = [cwd] + +if GetDepend(['RT_USING_NANO']): + group = group + SConscript(os.path.join(cwd, 'nano', 'SConscript')) +else: + group = group + SConscript(os.path.join(cwd, 'drivers', 'SConscript')) + +group = group + DefineGroup('Drivers', src, depend = [''], CPPPATH = path) + +Return('group') diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/Kconfig b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/Kconfig new file mode 100644 index 0000000000..ba93a5898c --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/Kconfig @@ -0,0 +1,16 @@ +if BSP_USING_USBD + config BSP_USBD_TYPE_FS + bool + # "USB Full Speed (FS) Core" + config BSP_USBD_TYPE_HS + bool + # "USB High Speed (HS) Core" + + config BSP_USBD_SPEED_HS + bool + # "USB High Speed (HS) Mode" + config BSP_USBD_SPEED_HSINFS + bool + # "USB High Speed (HS) Core in FS mode" +endif + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/SConscript b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/SConscript new file mode 100644 index 0000000000..3dda86ed0c --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/SConscript @@ -0,0 +1,39 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * +import os + +cwd = GetCurrentDir() +group = [] +src = [] +path = [cwd] + +if GetDepend(['RT_USING_PIN']): + src += ['drv_gpio.c'] + +if GetDepend(['RT_USING_SERIAL']): + src += ['drv_usart.c'] + +if GetDepend(['RT_USING_SPI']): + src += ['drv_spi.c'] + +if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']): + if GetDepend('BSP_USING_I2C1') or GetDepend('BSP_USING_I2C2') or GetDepend('BSP_USING_I2C3') or GetDepend('BSP_USING_I2C4'): + src += ['drv_soft_i2c.c'] + +if GetDepend(['RT_USING_I2C']): + if GetDepend('BSP_USING_HARD_I2C1') or GetDepend('BSP_USING_HARD_I2C2') or GetDepend('BSP_USING_HARD_I2C3') or GetDepend('BSP_USING_HARD_I2C4') or GetDepend('BSP_USING_HARD_I2C5') or GetDepend('BSP_USING_HARD_I2C6') or GetDepend('BSP_USING_HARD_I2C7') or GetDepend('BSP_USING_HARD_I2C8') or GetDepend('BSP_USING_HARD_I2C9') or GetDepend('BSP_USING_HARD_I2C10'): + src += ['drv_hard_i2c.c'] + +if GetDepend('BSP_USING_ONCHIP_RTC'): + src += ['drv_rtc.c'] + +if GetDepend(['RT_USING_ADC']): + src += ['drv_adc.c'] + + +path += [os.path.join(cwd, 'config')] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path) + +Return('group') diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/adc_config.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/adc_config.h new file mode 100644 index 0000000000..dca16bf4fe --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/adc_config.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __ADC_CONFIG_H__ +#define __ADC_CONFIG_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef BSP_USING_ADC1 +#ifndef ADC1_CONFIG +#define ADC1_CONFIG \ + { \ + .ADCx = ADC1, \ + .AHB_periph = (RCC_AHB1_PERIPHEN_M7_ADC1SYS | RCC_AHB1_PERIPHEN_M7_ADC1BUS), \ + .EnablePeriphClk = RCC_EnableAHB1PeriphClk1, \ + .ADC_ClkMode = ADC_CTRL3_CKMOD_AHB, \ + .Pll_CLK_source = RCC_ADCPLLCLK_SRC_PLL1B, \ + .RCC_ADCPrescaler = RCC_AHB1DIV2_ADC1SYSDIV_DIV15, \ + .Init.WorkMode = ADC_WORKMODE_INDEPENDENT, \ + .Init.MultiChEn = DISABLE, \ + .Init.ContinueConvEn = DISABLE, \ + .Init.ExtTrigSelect = ADC_EXT_TRIG_REG_CONV_SOFTWARE, \ + .Init.DataTransferMode = ADC_REG_DR_TRANSFER, \ + .Init.DatAlign = ADC_DAT_ALIGN_R, \ + .Init.ChsNumber = 1U, \ + .Init.Resolution = ADC_DATA_RES_12BIT, \ + .Rank = 1U, \ + .ADC_SampleTime = ADC_SAMP_TIME_CYCLES_24, \ + } +#endif /* ADC1_CONFIG */ +#endif /* BSP_USING_ADC1 */ + +#ifdef BSP_USING_ADC2 +#ifndef ADC2_CONFIG +#define ADC2_CONFIG \ + { \ + .ADCx = ADC2, \ + .AHB_periph = (RCC_AHB1_PERIPHEN_M7_ADC2SYS | RCC_AHB1_PERIPHEN_M7_ADC2BUS), \ + .EnablePeriphClk = RCC_EnableAHB1PeriphClk4, \ + .ADC_ClkMode = ADC_CTRL3_CKMOD_AHB, \ + .Pll_CLK_source = RCC_ADCPLLCLK_SRC_PLL1B, \ + .RCC_ADCPrescaler = RCC_AHB1DIV2_ADC1SYSDIV_DIV15, \ + .Init.WorkMode = ADC_WORKMODE_INDEPENDENT, \ + .Init.MultiChEn = DISABLE, \ + .Init.ContinueConvEn = DISABLE, \ + .Init.ExtTrigSelect = ADC_EXT_TRIG_REG_CONV_SOFTWARE, \ + .Init.DataTransferMode = ADC_REG_DR_TRANSFER, \ + .Init.DatAlign = ADC_DAT_ALIGN_R, \ + .Init.ChsNumber = 1U, \ + .Init.Resolution = ADC_DATA_RES_12BIT, \ + .Rank = 1U, \ + .ADC_SampleTime = ADC_SAMP_TIME_CYCLES_24, \ + } +#endif /* ADC2_CONFIG */ +#endif /* BSP_USING_ADC2 */ + +#ifdef BSP_USING_ADC3 +#ifndef ADC3_CONFIG +#define ADC3_CONFIG \ + { \ + .ADCx = ADC3, \ + .AHB_periph = (RCC_AHB1_PERIPHEN_M7_ADC3SYS | RCC_AHB1_PERIPHEN_M7_ADC3BUS), \ + .EnablePeriphClk = RCC_EnableAHB1PeriphClk4, \ + .ADC_ClkMode = ADC_CTRL3_CKMOD_AHB, \ + .Pll_CLK_source = RCC_ADCPLLCLK_SRC_PLL1B, \ + .RCC_ADCPrescaler = RCC_AHB1DIV2_ADC1SYSDIV_DIV15, \ + .Init.WorkMode = ADC_WORKMODE_INDEPENDENT, \ + .Init.MultiChEn = DISABLE, \ + .Init.ContinueConvEn = DISABLE, \ + .Init.ExtTrigSelect = ADC_EXT_TRIG_REG_CONV_SOFTWARE, \ + .Init.DataTransferMode = ADC_REG_DR_TRANSFER, \ + .Init.DatAlign = ADC_DAT_ALIGN_R, \ + .Init.ChsNumber = 1U, \ + .Init.Resolution = ADC_DATA_RES_12BIT, \ + .Rank = 1U, \ + .ADC_SampleTime = ADC_SAMP_TIME_CYCLES_24, \ + } +#endif /* ADC3_CONFIG */ +#endif /* BSP_USING_ADC3 */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ADC_CONFIG_H__ */ diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/dma_config.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/dma_config.h new file mode 100644 index 0000000000..c9003200d6 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/dma_config.h @@ -0,0 +1,710 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __DMA_CONFIG_H__ +#define __DMA_CONFIG_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* DMAMUX1 channel0 / DMA1 channel0 */ +#if defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_INSTANCE) +#define UART1_RX_DMA_INSTANCE DMA1 +#define UART1_RX_DMA_IRQHandler DMA1_Channel0_IRQHandler +#define UART1_RX_DMA_IRQ DMA1_Channel0_IRQn +#define UART1_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_0 +#define UART1_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART1_RX_DMA_DMA_CHANNEL DMA_CHANNEL_0 +#define UART1_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_0 +#define UART1_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART1_RX +#elif defined(BSP_UART8_TX_USING_DMA) && !defined(UART8_TX_DMA_INSTANCE) +#define UART8_TX_DMA_INSTANCE DMA1 +#define UART8_TX_DMA_IRQHandler DMA1_Channel0_IRQHandler +#define UART8_TX_DMA_IRQ DMA1_Channel0_IRQn +#define UART8_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_0 +#define UART8_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART8_TX_DMA_DMA_CHANNEL DMA_CHANNEL_0 +#define UART8_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_0 +#define UART8_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART8_TX +#elif defined(BSP_I2C5_TX_USING_DMA) && !defined(I2C5_TX_DMA_INSTANCE) +#define I2C5_TX_DMA_INSTANCE DMA1 +#define I2C5_TX_DMA_IRQHandler DMA1_Channel0_IRQHandler +#define I2C5_TX_DMA_IRQ DMA1_Channel0_IRQn +#define I2C5_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_0 +#define I2C5_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define I2C5_TX_DMA_DMA_CHANNEL DMA_CHANNEL_0 +#define I2C5_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_0 +#define I2C5_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C5_TX +#endif + +/* DMAMUX1 channel1 / DMA1 channel1 */ +#if defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_INSTANCE) +#define UART2_RX_DMA_INSTANCE DMA1 +#define UART2_RX_DMA_IRQHandler DMA1_Channel1_IRQHandler +#define UART2_RX_DMA_IRQ DMA1_Channel1_IRQn +#define UART2_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_1 +#define UART2_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART2_RX_DMA_DMA_CHANNEL DMA_CHANNEL_1 +#define UART2_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_1 +#define UART2_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART2_RX +#elif defined(BSP_UART9_TX_USING_DMA) && !defined(UART9_TX_DMA_INSTANCE) +#define UART9_TX_DMA_INSTANCE DMA1 +#define UART9_TX_DMA_IRQHandler DMA1_Channel1_IRQHandler +#define UART9_TX_DMA_IRQ DMA1_Channel1_IRQn +#define UART9_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_1 +#define UART9_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART9_TX_DMA_DMA_CHANNEL DMA_CHANNEL_1 +#define UART9_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_1 +#define UART9_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART9_TX +#elif defined(BSP_I2C6_TX_USING_DMA) && !defined(I2C6_TX_DMA_INSTANCE) +#define I2C6_TX_DMA_INSTANCE DMA1 +#define I2C6_TX_DMA_IRQHandler DMA1_Channel1_IRQHandler +#define I2C6_TX_DMA_IRQ DMA1_Channel1_IRQn +#define I2C6_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_1 +#define I2C6_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define I2C6_TX_DMA_DMA_CHANNEL DMA_CHANNEL_1 +#define I2C6_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_1 +#define I2C6_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C6_TX +#endif + +/* DMAMUX1 channel2 / DMA1 channel2 */ +#if defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_INSTANCE) +#define UART3_RX_DMA_INSTANCE DMA1 +#define UART3_RX_DMA_IRQHandler DMA1_Channel2_IRQHandler +#define UART3_RX_DMA_IRQ DMA1_Channel2_IRQn +#define UART3_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_2 +#define UART3_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART3_RX_DMA_DMA_CHANNEL DMA_CHANNEL_2 +#define UART3_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_2 +#define UART3_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART3_RX +#elif defined(BSP_UART10_TX_USING_DMA) && !defined(UART10_TX_DMA_INSTANCE) +#define UART10_TX_DMA_INSTANCE DMA1 +#define UART10_TX_DMA_IRQHandler DMA1_Channel2_IRQHandler +#define UART10_TX_DMA_IRQ DMA1_Channel2_IRQn +#define UART10_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_2 +#define UART10_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART10_TX_DMA_DMA_CHANNEL DMA_CHANNEL_2 +#define UART10_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_2 +#define UART10_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART10_TX +#elif defined(BSP_I2C7_TX_USING_DMA) && !defined(I2C7_TX_DMA_INSTANCE) +#define I2C7_TX_DMA_INSTANCE DMA1 +#define I2C7_TX_DMA_IRQHandler DMA1_Channel2_IRQHandler +#define I2C7_TX_DMA_IRQ DMA1_Channel2_IRQn +#define I2C7_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_2 +#define I2C7_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define I2C7_TX_DMA_DMA_CHANNEL DMA_CHANNEL_2 +#define I2C7_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_2 +#define I2C7_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C7_TX +#endif + +/* DMAMUX1 channel3 / DMA1 channel3 */ +#if defined(BSP_UART4_RX_USING_DMA) && !defined(UART4_RX_DMA_INSTANCE) +#define UART4_RX_DMA_INSTANCE DMA1 +#define UART4_RX_DMA_IRQHandler DMA1_Channel3_IRQHandler +#define UART4_RX_DMA_IRQ DMA1_Channel3_IRQn +#define UART4_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_3 +#define UART4_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART4_RX_DMA_DMA_CHANNEL DMA_CHANNEL_3 +#define UART4_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_3 +#define UART4_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART4_RX +#elif defined(BSP_UART11_TX_USING_DMA) && !defined(UART11_TX_DMA_INSTANCE) +#define UART11_TX_DMA_INSTANCE DMA1 +#define UART11_TX_DMA_IRQHandler DMA1_Channel3_IRQHandler +#define UART11_TX_DMA_IRQ DMA1_Channel3_IRQn +#define UART11_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_3 +#define UART11_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART11_TX_DMA_DMA_CHANNEL DMA_CHANNEL_3 +#define UART11_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_3 +#define UART11_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART11_TX +#elif defined(BSP_I2C8_TX_USING_DMA) && !defined(I2C8_TX_DMA_INSTANCE) +#define I2C8_TX_DMA_INSTANCE DMA1 +#define I2C8_TX_DMA_IRQHandler DMA1_Channel3_IRQHandler +#define I2C8_TX_DMA_IRQ DMA1_Channel3_IRQn +#define I2C8_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_3 +#define I2C8_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define I2C8_TX_DMA_DMA_CHANNEL DMA_CHANNEL_3 +#define I2C8_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_3 +#define I2C8_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C8_TX +#endif + +/* DMAMUX1 channel4 / DMA1 channel4 */ +#if defined(BSP_UART5_RX_USING_DMA) && !defined(UART5_RX_DMA_INSTANCE) +#define UART5_RX_DMA_INSTANCE DMA1 +#define UART5_RX_DMA_IRQHandler DMA1_Channel4_IRQHandler +#define UART5_RX_DMA_IRQ DMA1_Channel4_IRQn +#define UART5_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_4 +#define UART5_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART5_RX_DMA_DMA_CHANNEL DMA_CHANNEL_4 +#define UART5_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_4 +#define UART5_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART5_RX +#elif defined(BSP_UART12_TX_USING_DMA) && !defined(UART12_TX_DMA_INSTANCE) +#define UART12_TX_DMA_INSTANCE DMA1 +#define UART12_TX_DMA_IRQHandler DMA1_Channel4_IRQHandler +#define UART12_TX_DMA_IRQ DMA1_Channel4_IRQn +#define UART12_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_4 +#define UART12_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART12_TX_DMA_DMA_CHANNEL DMA_CHANNEL_4 +#define UART12_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_4 +#define UART12_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART12_TX +#elif defined(BSP_I2C9_TX_USING_DMA) && !defined(I2C9_TX_DMA_INSTANCE) +#define I2C9_TX_DMA_INSTANCE DMA1 +#define I2C9_TX_DMA_IRQHandler DMA1_Channel4_IRQHandler +#define I2C9_TX_DMA_IRQ DMA1_Channel4_IRQn +#define I2C9_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_4 +#define I2C9_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define I2C9_TX_DMA_DMA_CHANNEL DMA_CHANNEL_4 +#define I2C9_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_4 +#define I2C9_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C9_TX +#endif + +/* DMAMUX1 channel5 / DMA1 channel5 */ +#if defined(BSP_UART6_RX_USING_DMA) && !defined(UART6_RX_DMA_INSTANCE) +#define UART6_RX_DMA_INSTANCE DMA1 +#define UART6_RX_DMA_IRQHandler DMA1_Channel5_IRQHandler +#define UART6_RX_DMA_IRQ DMA1_Channel5_IRQn +#define UART6_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_5 +#define UART6_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART6_RX_DMA_DMA_CHANNEL DMA_CHANNEL_5 +#define UART6_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_5 +#define UART6_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART6_RX +#elif defined(BSP_UART13_TX_USING_DMA) && !defined(UART13_TX_DMA_INSTANCE) +#define UART13_TX_DMA_INSTANCE DMA1 +#define UART13_TX_DMA_IRQHandler DMA1_Channel5_IRQHandler +#define UART13_TX_DMA_IRQ DMA1_Channel5_IRQn +#define UART13_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_5 +#define UART13_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART13_TX_DMA_DMA_CHANNEL DMA_CHANNEL_5 +#define UART13_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_5 +#define UART13_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART13_TX +#elif defined(BSP_I2C10_TX_USING_DMA) && !defined(I2C10_TX_DMA_INSTANCE) +#define I2C10_TX_DMA_INSTANCE DMA1 +#define I2C10_TX_DMA_IRQHandler DMA1_Channel5_IRQHandler +#define I2C10_TX_DMA_IRQ DMA1_Channel5_IRQn +#define I2C10_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_5 +#define I2C10_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define I2C10_TX_DMA_DMA_CHANNEL DMA_CHANNEL_5 +#define I2C10_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_5 +#define I2C10_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C10_TX +#endif + +/* DMAMUX1 channel6 / DMA1 channel6 */ +#if defined(BSP_UART7_RX_USING_DMA) && !defined(UART7_RX_DMA_INSTANCE) +#define UART7_RX_DMA_INSTANCE DMA1 +#define UART7_RX_DMA_IRQHandler DMA1_Channel6_IRQHandler +#define UART7_RX_DMA_IRQ DMA1_Channel6_IRQn +#define UART7_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_6 +#define UART7_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART7_RX_DMA_DMA_CHANNEL DMA_CHANNEL_6 +#define UART7_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_6 +#define UART7_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART7_RX +#elif defined(BSP_UART14_TX_USING_DMA) && !defined(UART14_TX_DMA_INSTANCE) +#define UART14_TX_DMA_INSTANCE DMA1 +#define UART14_TX_DMA_IRQHandler DMA1_Channel6_IRQHandler +#define UART14_TX_DMA_IRQ DMA1_Channel6_IRQn +#define UART14_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_6 +#define UART14_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART14_TX_DMA_DMA_CHANNEL DMA_CHANNEL_6 +#define UART14_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_6 +#define UART14_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART14_TX +#elif defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_INSTANCE) +#define SPI1_TX_DMA_INSTANCE DMA1 +#define SPI1_TX_DMA_IRQHandler DMA1_Channel6_IRQHandler +#define SPI1_TX_DMA_IRQ DMA1_Channel6_IRQn +#define SPI1_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_6 +#define SPI1_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define SPI1_TX_DMA_DMA_CHANNEL DMA_CHANNEL_6 +#define SPI1_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_6 +#define SPI1_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI1_TX +#endif + +/* DMAMUX1 channel7 / DMA1 channel7 */ +#if defined(BSP_UART8_RX_USING_DMA) && !defined(UART8_RX_DMA_INSTANCE) +#define UART8_RX_DMA_INSTANCE DMA1 +#define UART8_RX_DMA_IRQHandler DMA1_Channel7_IRQHandler +#define UART8_RX_DMA_IRQ DMA1_Channel7_IRQn +#define UART8_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_7 +#define UART8_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART8_RX_DMA_DMA_CHANNEL DMA_CHANNEL_7 +#define UART8_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_7 +#define UART8_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART8_RX +#elif defined(BSP_UART15_TX_USING_DMA) && !defined(UART15_TX_DMA_INSTANCE) +#define UART15_TX_DMA_INSTANCE DMA1 +#define UART15_TX_DMA_IRQHandler DMA1_Channel7_IRQHandler +#define UART15_TX_DMA_IRQ DMA1_Channel7_IRQn +#define UART15_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_7 +#define UART15_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define UART15_TX_DMA_DMA_CHANNEL DMA_CHANNEL_7 +#define UART15_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_7 +#define UART15_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART15_TX +#elif defined(BSP_SPI2_TX_USING_DMA) && !defined(SPI2_TX_DMA_INSTANCE) +#define SPI2_TX_DMA_INSTANCE DMA1 +#define SPI2_TX_DMA_IRQHandler DMA1_Channel7_IRQHandler +#define SPI2_TX_DMA_IRQ DMA1_Channel7_IRQn +#define SPI2_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_7 +#define SPI2_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA1 +#define SPI2_TX_DMA_DMA_CHANNEL DMA_CHANNEL_7 +#define SPI2_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_7 +#define SPI2_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI2_TX +#endif + +/* DMAMUX1 channel8 / DMA2 channel0 */ +#if defined(BSP_UART9_RX_USING_DMA) && !defined(UART9_RX_DMA_INSTANCE) +#define UART9_RX_DMA_INSTANCE DMA2 +#define UART9_RX_DMA_IRQHandler DMA2_Channel0_IRQHandler +#define UART9_RX_DMA_IRQ DMA2_Channel0_IRQn +#define UART9_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_0 +#define UART9_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define UART9_RX_DMA_DMA_CHANNEL DMA_CHANNEL_0 +#define UART9_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_8 +#define UART9_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART9_RX +#elif defined(BSP_LPUART1_TX_USING_DMA) && !defined(LPUART1_TX_DMA_INSTANCE) +#define LPUART1_TX_DMA_INSTANCE DMA2 +#define LPUART1_TX_DMA_IRQHandler DMA2_Channel0_IRQHandler +#define LPUART1_TX_DMA_IRQ DMA2_Channel0_IRQn +#define LPUART1_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_0 +#define LPUART1_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define LPUART1_TX_DMA_DMA_CHANNEL DMA_CHANNEL_0 +#define LPUART1_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_8 +#define LPUART1_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_LPUART1_TX +#elif defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_INSTANCE) +#define SPI3_TX_DMA_INSTANCE DMA2 +#define SPI3_TX_DMA_IRQHandler DMA2_Channel0_IRQHandler +#define SPI3_TX_DMA_IRQ DMA2_Channel0_IRQn +#define SPI3_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_0 +#define SPI3_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define SPI3_TX_DMA_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_8 +#define SPI3_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI3_TX +#endif + +/* DMAMUX1 channel9 / DMA2 channel1 */ +#if defined(BSP_UART10_RX_USING_DMA) && !defined(UART10_RX_DMA_INSTANCE) +#define UART10_RX_DMA_INSTANCE DMA2 +#define UART10_RX_DMA_IRQHandler DMA2_Channel1_IRQHandler +#define UART10_RX_DMA_IRQ DMA2_Channel1_IRQn +#define UART10_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_1 +#define UART10_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define UART10_RX_DMA_DMA_CHANNEL DMA_CHANNEL_1 +#define UART10_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_9 +#define UART10_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART10_RX +#elif defined(BSP_LPUART2_TX_USING_DMA) && !defined(LPUART2_TX_DMA_INSTANCE) +#define LPUART2_TX_DMA_INSTANCE DMA2 +#define LPUART2_TX_DMA_IRQHandler DMA2_Channel1_IRQHandler +#define LPUART2_TX_DMA_IRQ DMA2_Channel1_IRQn +#define LPUART2_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_1 +#define LPUART2_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define LPUART2_TX_DMA_DMA_CHANNEL DMA_CHANNEL_1 +#define LPUART2_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_9 +#define LPUART2_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_LPUART2_TX +#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_INSTANCE) +#define SPI4_TX_DMA_INSTANCE DMA2 +#define SPI4_TX_DMA_IRQHandler DMA2_Channel1_IRQHandler +#define SPI4_TX_DMA_IRQ DMA2_Channel1_IRQn +#define SPI4_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_1 +#define SPI4_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define SPI4_TX_DMA_DMA_CHANNEL DMA_CHANNEL_1 +#define SPI4_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_9 +#define SPI4_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI4_TX +#endif + +/* DMAMUX1 channel10 / DMA2 channel2 */ +#if defined(BSP_I2C1_RX_USING_DMA) && !defined(I2C1_RX_DMA_INSTANCE) +#define I2C1_RX_DMA_INSTANCE DMA2 +#define I2C1_RX_DMA_IRQHandler DMA2_Channel2_IRQHandler +#define I2C1_RX_DMA_IRQ DMA2_Channel2_IRQn +#define I2C1_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_2 +#define I2C1_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define I2C1_RX_DMA_DMA_CHANNEL DMA_CHANNEL_2 +#define I2C1_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_10 +#define I2C1_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C1_RX +#elif defined(BSP_UART11_RX_USING_DMA) && !defined(UART11_RX_DMA_INSTANCE) +#define UART11_RX_DMA_INSTANCE DMA2 +#define UART11_RX_DMA_IRQHandler DMA2_Channel2_IRQHandler +#define UART11_RX_DMA_IRQ DMA2_Channel2_IRQn +#define UART11_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_2 +#define UART11_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define UART11_RX_DMA_DMA_CHANNEL DMA_CHANNEL_2 +#define UART11_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_10 +#define UART11_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART11_RX +#elif defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_INSTANCE) +#define SPI5_TX_DMA_INSTANCE DMA2 +#define SPI5_TX_DMA_IRQHandler DMA2_Channel2_IRQHandler +#define SPI5_TX_DMA_IRQ DMA2_Channel2_IRQn +#define SPI5_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_2 +#define SPI5_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define SPI5_TX_DMA_DMA_CHANNEL DMA_CHANNEL_2 +#define SPI5_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_10 +#define SPI5_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI5_TX +#endif + +/* DMAMUX1 channel11 / DMA2 channel3 */ +#if defined(BSP_I2C2_RX_USING_DMA) && !defined(I2C2_RX_DMA_INSTANCE) +#define I2C2_RX_DMA_INSTANCE DMA2 +#define I2C2_RX_DMA_IRQHandler DMA2_Channel3_IRQHandler +#define I2C2_RX_DMA_IRQ DMA2_Channel3_IRQn +#define I2C2_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_3 +#define I2C2_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define I2C2_RX_DMA_DMA_CHANNEL DMA_CHANNEL_3 +#define I2C2_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_11 +#define I2C2_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C2_RX +#elif defined(BSP_UART12_RX_USING_DMA) && !defined(UART12_RX_DMA_INSTANCE) +#define UART12_RX_DMA_INSTANCE DMA2 +#define UART12_RX_DMA_IRQHandler DMA2_Channel3_IRQHandler +#define UART12_RX_DMA_IRQ DMA2_Channel3_IRQn +#define UART12_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_3 +#define UART12_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define UART12_RX_DMA_DMA_CHANNEL DMA_CHANNEL_3 +#define UART12_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_11 +#define UART12_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART12_RX +#elif defined(BSP_SPI6_TX_USING_DMA) && !defined(SPI6_TX_DMA_INSTANCE) +#define SPI6_TX_DMA_INSTANCE DMA2 +#define SPI6_TX_DMA_IRQHandler DMA2_Channel3_IRQHandler +#define SPI6_TX_DMA_IRQ DMA2_Channel3_IRQn +#define SPI6_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_3 +#define SPI6_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define SPI6_TX_DMA_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI6_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_11 +#define SPI6_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI6_TX +#endif + +/* DMAMUX1 channel12 / DMA2 channel4 */ +#if defined(BSP_I2C3_RX_USING_DMA) && !defined(I2C3_RX_DMA_INSTANCE) +#define I2C3_RX_DMA_INSTANCE DMA2 +#define I2C3_RX_DMA_IRQHandler DMA2_Channel4_IRQHandler +#define I2C3_RX_DMA_IRQ DMA2_Channel4_IRQn +#define I2C3_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_4 +#define I2C3_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define I2C3_RX_DMA_DMA_CHANNEL DMA_CHANNEL_4 +#define I2C3_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_12 +#define I2C3_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C3_RX +#elif defined(BSP_UART13_RX_USING_DMA) && !defined(UART13_RX_DMA_INSTANCE) +#define UART13_RX_DMA_INSTANCE DMA2 +#define UART13_RX_DMA_IRQHandler DMA2_Channel4_IRQHandler +#define UART13_RX_DMA_IRQ DMA2_Channel4_IRQn +#define UART13_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_4 +#define UART13_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define UART13_RX_DMA_DMA_CHANNEL DMA_CHANNEL_4 +#define UART13_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_12 +#define UART13_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART13_RX +#elif defined(BSP_SPI7_TX_USING_DMA) && !defined(SPI7_TX_DMA_INSTANCE) +#define SPI7_TX_DMA_INSTANCE DMA2 +#define SPI7_TX_DMA_IRQHandler DMA2_Channel4_IRQHandler +#define SPI7_TX_DMA_IRQ DMA2_Channel4_IRQn +#define SPI7_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_4 +#define SPI7_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define SPI7_TX_DMA_DMA_CHANNEL DMA_CHANNEL_4 +#define SPI7_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_12 +#define SPI7_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI7_TX +#endif + +/* DMAMUX1 channel13 / DMA2 channel5 */ +#if defined(BSP_I2C4_RX_USING_DMA) && !defined(I2C4_RX_DMA_INSTANCE) +#define I2C4_RX_DMA_INSTANCE DMA2 +#define I2C4_RX_DMA_IRQHandler DMA2_Channel5_IRQHandler +#define I2C4_RX_DMA_IRQ DMA2_Channel5_IRQn +#define I2C4_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_5 +#define I2C4_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define I2C4_RX_DMA_DMA_CHANNEL DMA_CHANNEL_5 +#define I2C4_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_13 +#define I2C4_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C4_RX +#elif defined(BSP_UART14_RX_USING_DMA) && !defined(UART14_RX_DMA_INSTANCE) +#define UART14_RX_DMA_INSTANCE DMA2 +#define UART14_RX_DMA_IRQHandler DMA2_Channel5_IRQHandler +#define UART14_RX_DMA_IRQ DMA2_Channel5_IRQn +#define UART14_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_5 +#define UART14_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define UART14_RX_DMA_DMA_CHANNEL DMA_CHANNEL_5 +#define UART14_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_13 +#define UART14_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART14_RX +#elif defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_INSTANCE) +#define SPI1_RX_DMA_INSTANCE DMA2 +#define SPI1_RX_DMA_IRQHandler DMA2_Channel5_IRQHandler +#define SPI1_RX_DMA_IRQ DMA2_Channel5_IRQn +#define SPI1_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_5 +#define SPI1_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define SPI1_RX_DMA_DMA_CHANNEL DMA_CHANNEL_5 +#define SPI1_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_13 +#define SPI1_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI1_RX +#endif + +/* DMAMUX1 channel14 / DMA2 channel6 */ +#if defined(BSP_I2C5_RX_USING_DMA) && !defined(I2C5_RX_DMA_INSTANCE) +#define I2C5_RX_DMA_INSTANCE DMA2 +#define I2C5_RX_DMA_IRQHandler DMA2_Channel6_IRQHandler +#define I2C5_RX_DMA_IRQ DMA2_Channel6_IRQn +#define I2C5_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_6 +#define I2C5_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define I2C5_RX_DMA_DMA_CHANNEL DMA_CHANNEL_6 +#define I2C5_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_14 +#define I2C5_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C5_RX +#elif defined(BSP_UART15_RX_USING_DMA) && !defined(UART15_RX_DMA_INSTANCE) +#define UART15_RX_DMA_INSTANCE DMA2 +#define UART15_RX_DMA_IRQHandler DMA2_Channel6_IRQHandler +#define UART15_RX_DMA_IRQ DMA2_Channel6_IRQn +#define UART15_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_6 +#define UART15_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define UART15_RX_DMA_DMA_CHANNEL DMA_CHANNEL_6 +#define UART15_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_14 +#define UART15_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_UART15_RX +#elif defined(BSP_SPI2_RX_USING_DMA) && !defined(SPI2_RX_DMA_INSTANCE) +#define SPI2_RX_DMA_INSTANCE DMA2 +#define SPI2_RX_DMA_IRQHandler DMA2_Channel6_IRQHandler +#define SPI2_RX_DMA_IRQ DMA2_Channel6_IRQn +#define SPI2_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_6 +#define SPI2_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define SPI2_RX_DMA_DMA_CHANNEL DMA_CHANNEL_6 +#define SPI2_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_14 +#define SPI2_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI2_RX +#endif + +/* DMAMUX1 channel15 / DMA2 channel7 */ +#if defined(BSP_I2C6_RX_USING_DMA) && !defined(I2C6_RX_DMA_INSTANCE) +#define I2C6_RX_DMA_INSTANCE DMA2 +#define I2C6_RX_DMA_IRQHandler DMA2_Channel7_IRQHandler +#define I2C6_RX_DMA_IRQ DMA2_Channel7_IRQn +#define I2C6_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_7 +#define I2C6_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define I2C6_RX_DMA_DMA_CHANNEL DMA_CHANNEL_5 +#define I2C6_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_15 +#define I2C6_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C6_RX +#elif defined(BSP_LPUART1_RX_USING_DMA) && !defined(LPUART1_RX_DMA_INSTANCE) +#define LPUART1_RX_DMA_INSTANCE DMA2 +#define LPUART1_RX_DMA_IRQHandler DMA2_Channel7_IRQHandler +#define LPUART1_RX_DMA_IRQ DMA2_Channel7_IRQn +#define LPUART1_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_7 +#define LPUART1_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define LPUART1_RX_DMA_DMA_CHANNEL DMA_CHANNEL_5 +#define LPUART1_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_15 +#define LPUART1_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_LPUART1_RX +#elif defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_INSTANCE) +#define SPI3_RX_DMA_INSTANCE DMA2 +#define SPI3_RX_DMA_IRQHandler DMA2_Channel7_IRQHandler +#define SPI3_RX_DMA_IRQ DMA2_Channel7_IRQn +#define SPI3_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_7 +#define SPI3_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA2 +#define SPI3_RX_DMA_DMA_CHANNEL DMA_CHANNEL_5 +#define SPI3_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_15 +#define SPI3_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI3_RX +#endif + +/* DMAMUX1 channel16 / DMA3 channel0 */ +#if defined(BSP_I2C7_RX_USING_DMA) && !defined(I2C7_RX_DMA_INSTANCE) +#define I2C7_RX_DMA_INSTANCE DMA3 +#define I2C7_RX_DMA_IRQHandler DMA3_Channel0_IRQHandler +#define I2C7_RX_DMA_IRQ DMA3_Channel0_IRQn +#define I2C7_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_0 +#define I2C7_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define I2C7_RX_DMA_DMA_CHANNEL DMA_CHANNEL_0 +#define I2C7_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_16 +#define I2C7_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C7_RX +#elif defined(BSP_LPUART2_RX_USING_DMA) && !defined(LPUART2_RX_DMA_INSTANCE) +#define LPUART2_RX_DMA_INSTANCE DMA3 +#define LPUART2_RX_DMA_IRQHandler DMA3_Channel0_IRQHandler +#define LPUART2_RX_DMA_IRQ DMA3_Channel0_IRQn +#define LPUART2_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_0 +#define LPUART2_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define LPUART2_RX_DMA_DMA_CHANNEL DMA_CHANNEL_0 +#define LPUART2_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_16 +#define LPUART2_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_LPUART2_RX +#elif defined(BSP_SPI4_RX_USING_DMA) && !defined(SPI4_RX_DMA_INSTANCE) +#define SPI4_RX_DMA_INSTANCE DMA3 +#define SPI4_RX_DMA_IRQHandler DMA3_Channel0_IRQHandler +#define SPI4_RX_DMA_IRQ DMA3_Channel0_IRQn +#define SPI4_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_0 +#define SPI4_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define SPI4_RX_DMA_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI4_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_16 +#define SPI4_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI4_RX +#endif + +/* DMAMUX1 channel17 / DMA3 channel1 */ +#if defined(BSP_I2C8_RX_USING_DMA) && !defined(I2C8_RX_DMA_INSTANCE) +#define I2C8_RX_DMA_INSTANCE DMA3 +#define I2C8_RX_DMA_IRQHandler DMA3_Channel1_IRQHandler +#define I2C8_RX_DMA_IRQ DMA3_Channel1_IRQn +#define I2C8_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_1 +#define I2C8_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define I2C8_RX_DMA_DMA_CHANNEL DMA_CHANNEL_1 +#define I2C8_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_17 +#define I2C8_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C8_RX +#elif defined(BSP_UART1_TX_USING_DMA) && !defined(UART1_TX_DMA_INSTANCE) +#define UART1_TX_DMA_INSTANCE DMA3 +#define UART1_TX_DMA_IRQHandler DMA3_Channel1_IRQHandler +#define UART1_TX_DMA_IRQ DMA3_Channel1_IRQn +#define UART1_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_1 +#define UART1_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define UART1_TX_DMA_DMA_CHANNEL DMA_CHANNEL_1 +#define UART1_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_17 +#define UART1_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART1_TX +#elif defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_INSTANCE) +#define SPI5_RX_DMA_INSTANCE DMA3 +#define SPI5_RX_DMA_IRQHandler DMA3_Channel1_IRQHandler +#define SPI5_RX_DMA_IRQ DMA3_Channel1_IRQn +#define SPI5_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_1 +#define SPI5_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define SPI5_RX_DMA_DMA_CHANNEL DMA_CHANNEL_1 +#define SPI5_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_17 +#define SPI5_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI5_RX +#endif + +/* DMAMUX1 channel18 / DMA3 channel2 */ +#if defined(BSP_I2C9_RX_USING_DMA) && !defined(I2C9_RX_DMA_INSTANCE) +#define I2C9_RX_DMA_INSTANCE DMA3 +#define I2C9_RX_DMA_IRQHandler DMA3_Channel2_IRQHandler +#define I2C9_RX_DMA_IRQ DMA3_Channel2_IRQn +#define I2C9_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_2 +#define I2C9_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define I2C9_RX_DMA_DMA_CHANNEL DMA_CHANNEL_2 +#define I2C9_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_18 +#define I2C9_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C9_RX +#elif defined(BSP_UART2_TX_USING_DMA) && !defined(UART2_TX_DMA_INSTANCE) +#define UART2_TX_DMA_INSTANCE DMA3 +#define UART2_TX_DMA_IRQHandler DMA3_Channel2_IRQHandler +#define UART2_TX_DMA_IRQ DMA3_Channel2_IRQn +#define UART2_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_2 +#define UART2_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define UART2_TX_DMA_DMA_CHANNEL DMA_CHANNEL_2 +#define UART2_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_18 +#define UART2_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART2_TX +#elif defined(BSP_SPI6_RX_USING_DMA) && !defined(SPI6_RX_DMA_INSTANCE) +#define SPI6_RX_DMA_INSTANCE DMA3 +#define SPI6_RX_DMA_IRQHandler DMA3_Channel2_IRQHandler +#define SPI6_RX_DMA_IRQ DMA3_Channel2_IRQn +#define SPI6_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_2 +#define SPI6_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define SPI6_RX_DMA_DMA_CHANNEL DMA_CHANNEL_2 +#define SPI6_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_18 +#define SPI6_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI6_RX +#endif + +/* DMAMUX1 channel19 / DMA3 channel3 */ +#if defined(BSP_I2C10_RX_USING_DMA) && !defined(I2C10_RX_DMA_INSTANCE) +#define I2C10_RX_DMA_INSTANCE DMA3 +#define I2C10_RX_DMA_IRQHandler DMA3_Channel3_IRQHandler +#define I2C10_RX_DMA_IRQ DMA3_Channel3_IRQn +#define I2C10_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_3 +#define I2C10_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define I2C10_RX_DMA_DMA_CHANNEL DMA_CHANNEL_3 +#define I2C10_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_19 +#define I2C10_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C10_RX +#elif defined(BSP_UART3_TX_USING_DMA) && !defined(UART3_TX_DMA_INSTANCE) +#define UART3_TX_DMA_INSTANCE DMA3 +#define UART3_TX_DMA_IRQHandler DMA3_Channel3_IRQHandler +#define UART3_TX_DMA_IRQ DMA3_Channel3_IRQn +#define UART3_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_3 +#define UART3_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define UART3_TX_DMA_DMA_CHANNEL DMA_CHANNEL_3 +#define UART3_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_19 +#define UART3_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART3_TX +#elif defined(BSP_SPI7_RX_USING_DMA) && !defined(SPI7_RX_DMA_INSTANCE) +#define SPI7_RX_DMA_INSTANCE DMA3 +#define SPI7_RX_DMA_IRQHandler DMA3_Channel3_IRQHandler +#define SPI7_RX_DMA_IRQ DMA3_Channel3_IRQn +#define SPI7_RX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_3 +#define SPI7_RX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define SPI7_RX_DMA_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI7_RX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_19 +#define SPI7_RX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_SPI7_RX +#endif + +/* DMAMUX1 channel20 / DMA3 channel4 */ +#if defined(BSP_I2C1_TX_USING_DMA) && !defined(I2C1_TX_DMA_INSTANCE) +#define I2C1_TX_DMA_INSTANCE DMA3 +#define I2C1_TX_DMA_IRQHandler DMA3_Channel4_IRQHandler +#define I2C1_TX_DMA_IRQ DMA3_Channel4_IRQn +#define I2C1_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_4 +#define I2C1_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define I2C1_TX_DMA_DMA_CHANNEL DMA_CHANNEL_4 +#define I2C1_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_20 +#define I2C1_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C1_TX +#elif defined(BSP_UART4_TX_USING_DMA) && !defined(UART4_TX_DMA_INSTANCE) +#define UART4_TX_DMA_INSTANCE DMA3 +#define UART4_TX_DMA_IRQHandler DMA3_Channel4_IRQHandler +#define UART4_TX_DMA_IRQ DMA3_Channel4_IRQn +#define UART4_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_4 +#define UART4_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define UART4_TX_DMA_DMA_CHANNEL DMA_CHANNEL_4 +#define UART4_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_20 +#define UART4_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART4_TX +#endif + +/* DMAMUX1 channel21 / DMA3 channel5 */ +#if defined(BSP_I2C2_TX_USING_DMA) && !defined(I2C2_TX_DMA_INSTANCE) +#define I2C2_TX_DMA_INSTANCE DMA3 +#define I2C2_TX_DMA_IRQHandler DMA3_Channel5_IRQHandler +#define I2C2_TX_DMA_IRQ DMA3_Channel5_IRQn +#define I2C2_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_5 +#define I2C2_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define I2C2_TX_DMA_DMA_CHANNEL DMA_CHANNEL_5 +#define I2C2_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_21 +#define I2C2_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C2_TX +#elif defined(BSP_UART5_TX_USING_DMA) && !defined(UART5_TX_DMA_INSTANCE) +#define UART5_TX_DMA_INSTANCE DMA3 +#define UART5_TX_DMA_IRQHandler DMA3_Channel5_IRQHandler +#define UART5_TX_DMA_IRQ DMA3_Channel5_IRQn +#define UART5_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_5 +#define UART5_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define UART5_TX_DMA_DMA_CHANNEL DMA_CHANNEL_5 +#define UART5_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_21 +#define UART5_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART5_TX +#endif + +/* DMAMUX1 channel22 / DMA3 channel6 */ +#if defined(BSP_I2C3_TX_USING_DMA) && !defined(I2C3_TX_DMA_INSTANCE) +#define I2C3_TX_DMA_INSTANCE DMA3 +#define I2C3_TX_DMA_IRQHandler DMA3_Channel6_IRQHandler +#define I2C3_TX_DMA_IRQ DMA3_Channel6_IRQn +#define I2C3_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_6 +#define I2C3_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define I2C3_TX_DMA_DMA_CHANNEL DMA_CHANNEL_6 +#define I2C3_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_22 +#define I2C3_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C3_TX +#elif defined(BSP_UART6_TX_USING_DMA) && !defined(UART6_TX_DMA_INSTANCE) +#define UART6_TX_DMA_INSTANCE DMA3 +#define UART6_TX_DMA_IRQHandler DMA3_Channel6_IRQHandler +#define UART6_TX_DMA_IRQ DMA3_Channel6_IRQn +#define UART6_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_6 +#define UART6_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define UART6_TX_DMA_DMA_CHANNEL DMA_CHANNEL_6 +#define UART6_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_22 +#define UART6_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART6_TX +#endif + +/* DMAMUX1 channel23 / DMA3 channel7 */ +#if defined(BSP_I2C4_TX_USING_DMA) && !defined(I2C4_TX_DMA_INSTANCE) +#define I2C4_TX_DMA_INSTANCE DMA3 +#define I2C4_TX_DMA_IRQHandler DMA3_Channel7_IRQHandler +#define I2C4_TX_DMA_IRQ DMA3_Channel7_IRQn +#define I2C4_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_7 +#define I2C4_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define I2C4_TX_DMA_DMA_CHANNEL DMA_CHANNEL_7 +#define I2C4_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_23 +#define I2C4_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_I2C4_TX +#elif defined(BSP_UART7_TX_USING_DMA) && !defined(UART7_TX_DMA_INSTANCE) +#define UART7_TX_DMA_INSTANCE DMA3 +#define UART7_TX_DMA_IRQHandler DMA3_Channel7_IRQHandler +#define UART7_TX_DMA_IRQ DMA3_Channel7_IRQn +#define UART7_TX_DMA_HANDSHAK DMA_CH_HARDWARE_HANDSHAKING_IF_7 +#define UART7_TX_DMA_DMA_RCC RCC_AHB1_PERIPHEN_M7_DMA3 +#define UART7_TX_DMA_DMA_CHANNEL DMA_CHANNEL_7 +#define UART7_TX_DMA_DMAMUX_CHANNEL DMAMUX_CHANNEL_23 +#define UART7_TX_DMA_DMAMUX_REQUEST DMAMUX1_REQUEST_USART7_TX +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* __DMA_CONFIG_H__ */ + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/i2c_hard_config.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/i2c_hard_config.h new file mode 100644 index 0000000000..085c8f87b8 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/i2c_hard_config.h @@ -0,0 +1,512 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __I2C_HARD_CONFIG_H__ +#define __I2C_HARD_CONFIG_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef BSP_USING_HARD_I2C1 +#ifndef I2C1_BUS_CONFIG +#define I2C1_BUS_CONFIG \ + { \ + .name = "hwi2c1", \ + .Instance = I2C1, \ + .timing = 0x50012526, \ + .timeout = 0x1000, \ + .evirq_type = I2C1_EV_IRQn, \ + .erirq_type = I2C1_ER_IRQn, \ + .scl_af_width = 0, \ + .sda_af_width = 0, \ + .df_width = 0, \ + .periph = RCC_APB1_PERIPHEN_M7_I2C1, \ + .EnablePeriphClk = RCC_EnableAPB1PeriphClk4, \ + .I2CKerClkSource = RCC_ConfigI2C1KerClkSource, \ + } +#endif /* I2C1_BUS_CONFIG */ +#endif /* BSP_USING_HARD_I2C1 */ +#ifdef BSP_I2C1_RX_USING_DMA +#ifndef I2C1_RX_DMA_CONFIG +#define I2C1_RX_DMA_CONFIG \ + { \ + .Instance = I2C1_RX_DMA_INSTANCE, \ + .dma_irq = I2C1_RX_DMA_IRQ, \ + .HsInterface = I2C1_RX_DMA_HANDSHAK, \ + .dma_rcc = I2C1_RX_DMA_DMA_RCC, \ + .dma_channel = I2C1_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C1_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C1_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C1_RX_DMA_CONFIG */ +#endif /* BSP_I2C1_RX_USING_DMA */ +#ifdef BSP_I2C1_TX_USING_DMA +#ifndef I2C1_TX_DMA_CONFIG +#define I2C1_TX_DMA_CONFIG \ + { \ + .Instance = I2C1_TX_DMA_INSTANCE, \ + .dma_irq = I2C1_TX_DMA_IRQ, \ + .HsInterface = I2C1_TX_DMA_HANDSHAK, \ + .dma_rcc = I2C1_TX_DMA_DMA_RCC, \ + .dma_channel = I2C1_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C1_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C1_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C1_TX_DMA_CONFIG */ +#endif /* BSP_I2C1_TX_USING_DMA */ + + +#ifdef BSP_USING_HARD_I2C2 +#ifndef I2C2_BUS_CONFIG +#define I2C2_BUS_CONFIG \ + { \ + .name = "hwi2c2", \ + .Instance = I2C2, \ + .timing = 0x50012526, \ + .timeout = 0x1000, \ + .evirq_type = I2C2_EV_IRQn, \ + .erirq_type = I2C2_ER_IRQn, \ + .scl_af_width = 0, \ + .sda_af_width = 0, \ + .df_width = 0, \ + .periph = RCC_APB1_PERIPHEN_M7_I2C2, \ + .EnablePeriphClk = RCC_EnableAPB1PeriphClk4, \ + .I2CKerClkSource = RCC_ConfigI2C2KerClkSource, \ + } +#endif /* I2C2_BUS_CONFIG */ +#endif /* BSP_USING_HARD_I2C2 */ +#ifdef BSP_I2C2_RX_USING_DMA +#ifndef I2C2_RX_DMA_CONFIG +#define I2C2_RX_DMA_CONFIG \ + { \ + .Instance = I2C2_RX_DMA_INSTANCE, \ + .dma_irq = I2C2_RX_DMA_IRQ, \ + .HsInterface = I2C2_RX_DMA_HANDSHAK, \ + .dma_rcc = I2C2_RX_DMA_DMA_RCC, \ + .dma_channel = I2C2_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C2_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C2_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C2_RX_DMA_CONFIG */ +#endif /* BSP_I2C2_RX_USING_DMA */ +#ifdef BSP_I2C2_TX_USING_DMA +#ifndef I2C2_TX_DMA_CONFIG +#define I2C2_TX_DMA_CONFIG \ + { \ + .Instance = I2C2_TX_DMA_INSTANCE, \ + .dma_irq = I2C2_TX_DMA_IRQ, \ + .HsInterface = I2C2_TX_DMA_HANDSHAK, \ + .dma_rcc = I2C2_TX_DMA_DMA_RCC, \ + .dma_channel = I2C2_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C2_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C2_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C2_TX_DMA_CONFIG */ +#endif /* BSP_I2C2_TX_USING_DMA */ + + +#ifdef BSP_USING_HARD_I2C3 +#ifndef I2C3_BUS_CONFIG +#define I2C3_BUS_CONFIG \ + { \ + .name = "hwi2c3", \ + .Instance = I2C3, \ + .timing = 0x50012526, \ + .timeout = 0x1000, \ + .evirq_type = I2C3_EV_IRQn, \ + .erirq_type = I2C3_ER_IRQn, \ + .scl_af_width = 0, \ + .sda_af_width = 0, \ + .df_width = 0, \ + .periph = RCC_APB1_PERIPHEN_M7_I2C3, \ + .EnablePeriphClk = RCC_EnableAPB1PeriphClk4, \ + .I2CKerClkSource = RCC_ConfigI2C3KerClkSource, \ + } +#endif /* I2C3_BUS_CONFIG */ +#endif /* BSP_USING_HARD_I2C3 */ +#ifdef BSP_I2C3_RX_USING_DMA +#ifndef I2C3_RX_DMA_CONFIG +#define I2C3_RX_DMA_CONFIG \ + { \ + .Instance = I2C3_RX_DMA_INSTANCE, \ + .dma_irq = I2C3_RX_DMA_IRQ, \ + .HsInterface = I2C3_RX_DMA_HANDSHAK, \ + .dma_rcc = I2C3_RX_DMA_DMA_RCC, \ + .dma_channel = I2C3_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C3_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C3_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C3_RX_DMA_CONFIG */ +#endif /* BSP_I2C3_RX_USING_DMA */ +#ifdef BSP_I2C3_TX_USING_DMA +#ifndef I2C3_TX_DMA_CONFIG +#define I2C3_TX_DMA_CONFIG \ + { \ + .Instance = I2C3_TX_DMA_INSTANCE, \ + .dma_irq = I2C3_TX_DMA_IRQ, \ + .HsInterface = I2C3_TX_DMA_HANDSHAK, \ + .dma_rcc = I2C3_TX_DMA_DMA_RCC, \ + .dma_channel = I2C3_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C3_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C3_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C3_TX_DMA_CONFIG */ +#endif /* BSP_I2C3_TX_USING_DMA */ + + +#ifdef BSP_USING_HARD_I2C4 +#ifndef I2C4_BUS_CONFIG +#define I2C4_BUS_CONFIG \ + { \ + .name = "hwi2c4", \ + .Instance = I2C4, \ + .timing = 0x50012526, \ + .timeout = 0x1000, \ + .evirq_type = I2C4_EV_IRQn, \ + .erirq_type = I2C4_ER_IRQn, \ + .scl_af_width = 0, \ + .sda_af_width = 0, \ + .df_width = 0, \ + .periph = RCC_APB2_PERIPHEN_M7_I2C4, \ + .EnablePeriphClk = RCC_EnableAPB2PeriphClk2, \ + .I2CKerClkSource = RCC_ConfigI2C4KerClkSource, \ + } +#endif /* I2C4_BUS_CONFIG */ +#endif /* BSP_USING_HARD_I2C4 */ +#ifdef BSP_I2C4_RX_USING_DMA +#ifndef I2C4_RX_DMA_CONFIG +#define I2C4_RX_DMA_CONFIG \ + { \ + .Instance = I2C4_RX_DMA_INSTANCE, \ + .dma_irq = I2C4_RX_DMA_IRQ, \ + .HsInterface = I2C4_RX_DMA_HANDSHAK, \ + .dma_rcc = I2C4_RX_DMA_DMA_RCC, \ + .dma_channel = I2C4_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C4_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C4_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C4_RX_DMA_CONFIG */ +#endif /* BSP_I2C4_RX_USING_DMA */ +#ifdef BSP_I2C4_TX_USING_DMA +#ifndef I2C4_TX_DMA_CONFIG +#define I2C4_TX_DMA_CONFIG \ + { \ + .Instance = I2C4_TX_DMA_INSTANCE, \ + .dma_irq = I2C4_TX_DMA_IRQ, \ + .HsInterface = I2C4_TX_DMA_HANDSHAK, \ + .dma_rcc = I2C4_TX_DMA_DMA_RCC, \ + .dma_channel = I2C4_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C4_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C4_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C4_TX_DMA_CONFIG */ +#endif /* BSP_I2C4_TX_USING_DMA */ + + +#ifdef BSP_USING_HARD_I2C5 +#ifndef I2C5_BUS_CONFIG +#define I2C5_BUS_CONFIG \ + { \ + .name = "hwi2c5", \ + .Instance = I2C5, \ + .timing = 0x50012526, \ + .timeout = 0x1000, \ + .evirq_type = I2C5_EV_IRQn, \ + .erirq_type = I2C5_ER_IRQn, \ + .scl_af_width = 0, \ + .sda_af_width = 0, \ + .df_width = 0, \ + .periph = RCC_APB2_PERIPHEN_M7_I2C5, \ + .EnablePeriphClk = RCC_EnableAPB2PeriphClk2, \ + .I2CKerClkSource = RCC_ConfigI2C5KerClkSource, \ + } +#endif /* I2C5_BUS_CONFIG */ +#endif /* BSP_USING_HARD_I2C5 */ +#ifdef BSP_I2C5_RX_USING_DMA +#ifndef I2C5_RX_DMA_CONFIG +#define I2C5_RX_DMA_CONFIG \ + { \ + .Instance = I2C5_RX_DMA_INSTANCE, \ + .dma_irq = I2C5_RX_DMA_IRQ, \ + .HsInterface = I2C5_RX_DMA_HANDSHAK, \ + .dma_rcc = I2C5_RX_DMA_DMA_RCC, \ + .dma_channel = I2C5_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C5_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C5_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C5_RX_DMA_CONFIG */ +#endif /* BSP_I2C5_RX_USING_DMA */ +#ifdef BSP_I2C5_TX_USING_DMA +#ifndef I2C5_TX_DMA_CONFIG +#define I2C5_TX_DMA_CONFIG \ + { \ + .Instance = I2C5_TX_DMA_INSTANCE, \ + .dma_irq = I2C5_TX_DMA_IRQ, \ + .HsInterface = I2C5_TX_DMA_HANDSHAK, \ + .dma_rcc = I2C5_TX_DMA_DMA_RCC, \ + .dma_channel = I2C5_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C5_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C5_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C5_TX_DMA_CONFIG */ +#endif /* BSP_I2C5_TX_USING_DMA */ + + +#ifdef BSP_USING_HARD_I2C6 +#ifndef I2C6_BUS_CONFIG +#define I2C6_BUS_CONFIG \ + { \ + .name = "hwi2c6", \ + .Instance = I2C6, \ + .timing = 0x50012526, \ + .timeout = 0x1000, \ + .evirq_type = I2C6_EV_IRQn, \ + .erirq_type = I2C6_ER_IRQn, \ + .scl_af_width = 0, \ + .sda_af_width = 0, \ + .df_width = 0, \ + .periph = RCC_APB2_PERIPHEN_M7_I2C6, \ + .EnablePeriphClk = RCC_EnableAPB2PeriphClk2, \ + .I2CKerClkSource = RCC_ConfigI2C6KerClkSource, \ + } +#endif /* I2C6_BUS_CONFIG */ +#endif /* BSP_USING_HARD_I2C6 */ +#ifdef BSP_I2C6_RX_USING_DMA +#ifndef I2C6_RX_DMA_CONFIG +#define I2C6_RX_DMA_CONFIG \ + { \ + .Instance = I2C6_RX_DMA_INSTANCE, \ + .dma_irq = I2C6_RX_DMA_IRQ, \ + .HsInterface = I2C6_RX_DMA_HANDSHAK, \ + .dma_rcc = I2C6_RX_DMA_DMA_RCC, \ + .dma_channel = I2C6_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C6_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C6_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C6_RX_DMA_CONFIG */ +#endif /* BSP_I2C6_RX_USING_DMA */ +#ifdef BSP_I2C6_TX_USING_DMA +#ifndef I2C6_TX_DMA_CONFIG +#define I2C6_TX_DMA_CONFIG \ + { \ + .Instance = I2C6_TX_DMA_INSTANCE, \ + .dma_irq = I2C6_TX_DMA_IRQ, \ + .HsInterface = I2C6_TX_DMA_HANDSHAK, \ + .dma_rcc = I2C6_TX_DMA_DMA_RCC, \ + .dma_channel = I2C6_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C6_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C6_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C6_TX_DMA_CONFIG */ +#endif /* BSP_I2C6_TX_USING_DMA */ + +#ifdef BSP_USING_HARD_I2C7 +#ifndef I2C7_BUS_CONFIG +#define I2C7_BUS_CONFIG \ + { \ + .name = "hwi2c7", \ + .Instance = I2C7, \ + .timing = 0x50012526, \ + .timeout = 0x1000, \ + .evirq_type = I2C7_EV_IRQn, \ + .erirq_type = I2C7_ER_IRQn, \ + .scl_af_width = 0, \ + .sda_af_width = 0, \ + .df_width = 0, \ + .periph = RCC_APB5_PERIPHEN_M7_I2C7, \ + .EnablePeriphClk = RCC_EnableAPB5PeriphClk2, \ + .I2CKerClkSource = RCC_ConfigI2C7KerClkSource, \ + } +#endif /* I2C7_BUS_CONFIG */ +#endif /* BSP_USING_HARD_I2C7 */ +#ifdef BSP_I2C7_RX_USING_DMA +#ifndef I2C7_RX_DMA_CONFIG +#define I2C7_RX_DMA_CONFIG \ + { \ + .Instance = I2C7_RX_DMA_INSTANCE, \ + .dma_irq = I2C7_RX_DMA_IRQ, \ + .HsInterface = I2C7_RX_DMA_HANDSHAK, \ + .dma_rcc = I2C7_RX_DMA_DMA_RCC, \ + .dma_channel = I2C7_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C7_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C7_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C7_RX_DMA_CONFIG */ +#endif /* BSP_I2C7_RX_USING_DMA */ +#ifdef BSP_I2C7_TX_USING_DMA +#ifndef I2C7_TX_DMA_CONFIG +#define I2C7_TX_DMA_CONFIG \ + { \ + .Instance = I2C7_TX_DMA_INSTANCE, \ + .dma_irq = I2C7_TX_DMA_IRQ, \ + .HsInterface = I2C7_TX_DMA_HANDSHAK, \ + .dma_rcc = I2C7_TX_DMA_DMA_RCC, \ + .dma_channel = I2C7_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C7_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C7_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C7_TX_DMA_CONFIG */ +#endif /* BSP_I2C7_TX_USING_DMA */ + + +#ifdef BSP_USING_HARD_I2C8 +#ifndef I2C8_BUS_CONFIG +#define I2C8_BUS_CONFIG \ + { \ + .name = "hwi2c8", \ + .Instance = I2C8, \ + .timing = 0x50012526, \ + .timeout = 0x1000, \ + .evirq_type = I2C8_EV_IRQn, \ + .erirq_type = I2C8_ER_IRQn, \ + .scl_af_width = 0, \ + .sda_af_width = 0, \ + .df_width = 0, \ + .periph = RCC_APB5_PERIPHEN_M7_I2C8, \ + .EnablePeriphClk = RCC_EnableAPB5PeriphClk2, \ + .I2CKerClkSource = RCC_ConfigI2C8KerClkSource, \ + } +#endif /* I2C8_BUS_CONFIG */ +#endif /* BSP_USING_HARD_I2C8 */ +#ifdef BSP_I2C8_RX_USING_DMA +#ifndef I2C8_RX_DMA_CONFIG +#define I2C8_RX_DMA_CONFIG \ + { \ + .Instance = I2C8_RX_DMA_INSTANCE, \ + .dma_irq = I2C8_RX_DMA_IRQ, \ + .HsInterface = I2C8_RX_DMA_HANDSHAK, \ + .dma_rcc = I2C8_RX_DMA_DMA_RCC, \ + .dma_channel = I2C8_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C8_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C8_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C8_RX_DMA_CONFIG */ +#endif /* BSP_I2C8_RX_USING_DMA */ +#ifdef BSP_I2C8_TX_USING_DMA +#ifndef I2C8_TX_DMA_CONFIG +#define I2C8_TX_DMA_CONFIG \ + { \ + .Instance = I2C8_TX_DMA_INSTANCE, \ + .dma_irq = I2C8_TX_DMA_IRQ, \ + .HsInterface = I2C8_TX_DMA_HANDSHAK, \ + .dma_rcc = I2C8_TX_DMA_DMA_RCC, \ + .dma_channel = I2C8_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C8_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C8_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C8_TX_DMA_CONFIG */ +#endif /* BSP_I2C8_TX_USING_DMA */ + + +#ifdef BSP_USING_HARD_I2C9 +#ifndef I2C9_BUS_CONFIG +#define I2C9_BUS_CONFIG \ + { \ + .name = "hwi2c9", \ + .Instance = I2C9, \ + .timing = 0x50012526, \ + .timeout = 0x1000, \ + .evirq_type = I2C9_EV_IRQn, \ + .erirq_type = I2C9_ER_IRQn, \ + .scl_af_width = 0, \ + .sda_af_width = 0, \ + .df_width = 0, \ + .periph = RCC_APB5_PERIPHEN_M7_I2C9, \ + .EnablePeriphClk = RCC_EnableAPB5PeriphClk2, \ + .I2CKerClkSource = RCC_ConfigI2C9KerClkSource, \ + } +#endif /* I2C9_BUS_CONFIG */ +#endif /* BSP_USING_HARD_I2C9 */ +#ifdef BSP_I2C9_RX_USING_DMA +#ifndef I2C9_RX_DMA_CONFIG +#define I2C9_RX_DMA_CONFIG \ + { \ + .Instance = I2C9_RX_DMA_INSTANCE, \ + .dma_irq = I2C9_RX_DMA_IRQ, \ + .HsInterface = I2C9_RX_DMA_HANDSHAK, \ + .dma_rcc = I2C9_RX_DMA_DMA_RCC, \ + .dma_channel = I2C9_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C9_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C9_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C9_RX_DMA_CONFIG */ +#endif /* BSP_I2C9_RX_USING_DMA */ +#ifdef BSP_I2C9_TX_USING_DMA +#ifndef I2C9_TX_DMA_CONFIG +#define I2C9_TX_DMA_CONFIG \ + { \ + .Instance = I2C9_TX_DMA_INSTANCE, \ + .dma_irq = I2C9_TX_DMA_IRQ, \ + .HsInterface = I2C9_TX_DMA_HANDSHAK, \ + .dma_rcc = I2C9_TX_DMA_DMA_RCC, \ + .dma_channel = I2C9_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C9_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C9_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C9_TX_DMA_CONFIG */ +#endif /* BSP_I2C9_TX_USING_DMA */ + + +#ifdef BSP_USING_HARD_I2C10 +#ifndef I2C10_BUS_CONFIG +#define I2C10_BUS_CONFIG \ + { \ + .name = "hwi2c10", \ + .Instance = I2C10, \ + .timing = 0x50012526, \ + .timeout = 0x1000, \ + .evirq_type = I2C10_EV_IRQn, \ + .erirq_type = I2C10_ER_IRQn, \ + .scl_af_width = 0, \ + .sda_af_width = 0, \ + .df_width = 0, \ + .periph = RCC_APB5_PERIPHEN_M7_I2C10, \ + .EnablePeriphClk = RCC_EnableAPB5PeriphClk2, \ + .I2CKerClkSource = RCC_ConfigI2C10KerClkSource, \ + } +#endif /* I2C10_BUS_CONFIG */ +#endif /* BSP_USING_HARD_I2C10 */ +#ifdef BSP_I2C10_RX_USING_DMA +#ifndef I2C10_RX_DMA_CONFIG +#define I2C10_RX_DMA_CONFIG \ + { \ + .Instance = I2C10_RX_DMA_INSTANCE, \ + .dma_irq = I2C10_RX_DMA_IRQ, \ + .HsInterface = I2C10_RX_DMA_HANDSHAK, \ + .dma_rcc = I2C10_RX_DMA_DMA_RCC, \ + .dma_channel = I2C10_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C10_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C10_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C10_RX_DMA_CONFIG */ +#endif /* BSP_I2C10_RX_USING_DMA */ +#ifdef BSP_I2C10_TX_USING_DMA +#ifndef I2C10_TX_DMA_CONFIG +#define I2C10_TX_DMA_CONFIG \ + { \ + .Instance = I2C10_TX_DMA_INSTANCE, \ + .dma_irq = I2C10_TX_DMA_IRQ, \ + .HsInterface = I2C10_TX_DMA_HANDSHAK, \ + .dma_rcc = I2C10_TX_DMA_DMA_RCC, \ + .dma_channel = I2C10_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = I2C10_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = I2C10_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* I2C10_TX_DMA_CONFIG */ +#endif /* BSP_I2C10_TX_USING_DMA */ + +#ifdef __cplusplus +} +#endif + +#endif /*__I2C_HARD_CONFIG_H__ */ diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/spi_config.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/spi_config.h new file mode 100644 index 0000000000..c583ca5313 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/spi_config.h @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __SPI_CONFIG_H__ +#define __SPI_CONFIG_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef BSP_USING_SPI1 +#ifndef SPI1_BUS_CONFIG +#define SPI1_BUS_CONFIG \ + { \ + .SPIx = SPI1, \ + .bus_name = "spi1", \ + .irq_type = SPI1_IRQn, \ + } +#endif /* SPI1_BUS_CONFIG */ +#endif /* BSP_USING_SPI1 */ +#ifdef BSP_SPI1_TX_USING_DMA +#ifndef SPI1_TX_DMA_CONFIG +#define SPI1_TX_DMA_CONFIG \ + { \ + .Instance = SPI1_TX_DMA_INSTANCE, \ + .dma_irq = SPI1_TX_DMA_IRQ, \ + .HsInterface = SPI1_TX_DMA_HANDSHAK, \ + .dma_rcc = SPI1_TX_DMA_DMA_RCC, \ + .dma_channel = SPI1_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI1_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI1_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI1_TX_DMA_CONFIG */ +#endif /* BSP_SPI1_TX_USING_DMA */ +#ifdef BSP_SPI1_RX_USING_DMA +#ifndef SPI1_RX_DMA_CONFIG +#define SPI1_RX_DMA_CONFIG \ + { \ + .Instance = SPI1_RX_DMA_INSTANCE, \ + .dma_irq = SPI1_RX_DMA_IRQ, \ + .HsInterface = SPI1_RX_DMA_HANDSHAK, \ + .dma_rcc = SPI1_RX_DMA_DMA_RCC, \ + .dma_channel = SPI1_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI1_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI1_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI1_RX_DMA_CONFIG */ +#endif /* BSP_SPI1_RX_USING_DMA */ + + + +#ifdef BSP_USING_SPI2 +#ifndef SPI2_BUS_CONFIG +#define SPI2_BUS_CONFIG \ + { \ + .SPIx = SPI2, \ + .bus_name = "spi2", \ + .irq_type = SPI2_IRQn, \ + } +#endif /* SPI2_BUS_CONFIG */ +#endif /* BSP_USING_SPI2 */ +#ifdef BSP_SPI2_TX_USING_DMA +#ifndef SPI2_TX_DMA_CONFIG +#define SPI2_TX_DMA_CONFIG \ + { \ + .Instance = SPI2_TX_DMA_INSTANCE, \ + .dma_irq = SPI2_TX_DMA_IRQ, \ + .HsInterface = SPI2_TX_DMA_HANDSHAK, \ + .dma_rcc = SPI2_TX_DMA_DMA_RCC, \ + .dma_channel = SPI2_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI2_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI2_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI2_TX_DMA_CONFIG */ +#endif /* BSP_SPI2_TX_USING_DMA */ +#ifdef BSP_SPI2_RX_USING_DMA +#ifndef SPI2_RX_DMA_CONFIG +#define SPI2_RX_DMA_CONFIG \ + { \ + .Instance = SPI2_RX_DMA_INSTANCE, \ + .dma_irq = SPI2_RX_DMA_IRQ, \ + .HsInterface = SPI2_RX_DMA_HANDSHAK, \ + .dma_rcc = SPI2_RX_DMA_DMA_RCC, \ + .dma_channel = SPI2_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI2_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI2_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI2_RX_DMA_CONFIG */ +#endif /* BSP_SPI2_RX_USING_DMA */ + + + + +#ifdef BSP_USING_SPI3 +#ifndef SPI3_BUS_CONFIG +#define SPI3_BUS_CONFIG \ + { \ + .SPIx = SPI3, \ + .bus_name = "spi3", \ + .irq_type = SPI3_IRQn, \ + } +#endif /* SPI3_BUS_CONFIG */ +#endif /* BSP_USING_SPI3 */ +#ifdef BSP_SPI3_TX_USING_DMA +#ifndef SPI3_TX_DMA_CONFIG +#define SPI3_TX_DMA_CONFIG \ + { \ + .Instance = SPI3_TX_DMA_INSTANCE, \ + .dma_irq = SPI3_TX_DMA_IRQ, \ + .HsInterface = SPI3_TX_DMA_HANDSHAK, \ + .dma_rcc = SPI3_TX_DMA_DMA_RCC, \ + .dma_channel = SPI3_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI3_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI3_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI3_TX_DMA_CONFIG */ +#endif /* BSP_SPI3_TX_USING_DMA */ +#ifdef BSP_SPI3_RX_USING_DMA +#ifndef SPI3_RX_DMA_CONFIG +#define SPI3_RX_DMA_CONFIG \ + { \ + .Instance = SPI3_RX_DMA_INSTANCE, \ + .dma_irq = SPI3_RX_DMA_IRQ, \ + .HsInterface = SPI3_RX_DMA_HANDSHAK, \ + .dma_rcc = SPI3_RX_DMA_DMA_RCC, \ + .dma_channel = SPI3_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI3_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI3_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI3_RX_DMA_CONFIG */ +#endif /* BSP_SPI3_RX_USING_DMA */ + + + +#ifdef BSP_USING_SPI4 +#ifndef SPI4_BUS_CONFIG +#define SPI4_BUS_CONFIG \ + { \ + .SPIx = SPI4, \ + .bus_name = "spi4", \ + .irq_type = SPI4_IRQn, \ + } +#endif /* SPI4_BUS_CONFIG */ +#endif /* BSP_USING_SPI4 */ +#ifdef BSP_SPI4_TX_USING_DMA +#ifndef SPI4_TX_DMA_CONFIG +#define SPI4_TX_DMA_CONFIG \ + { \ + .Instance = SPI4_TX_DMA_INSTANCE, \ + .dma_irq = SPI4_TX_DMA_IRQ, \ + .HsInterface = SPI4_TX_DMA_HANDSHAK, \ + .dma_rcc = SPI4_TX_DMA_DMA_RCC, \ + .dma_channel = SPI4_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI4_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI4_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI4_TX_DMA_CONFIG */ +#endif /* BSP_SPI4_TX_USING_DMA */ +#ifdef BSP_SPI4_RX_USING_DMA +#ifndef SPI4_RX_DMA_CONFIG +#define SPI4_RX_DMA_CONFIG \ + { \ + .Instance = SPI4_RX_DMA_INSTANCE, \ + .dma_irq = SPI4_RX_DMA_IRQ, \ + .HsInterface = SPI4_RX_DMA_HANDSHAK, \ + .dma_rcc = SPI4_RX_DMA_DMA_RCC, \ + .dma_channel = SPI4_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI4_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI4_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI4_RX_DMA_CONFIG */ +#endif /* BSP_SPI4_RX_USING_DMA */ + + + +#ifdef BSP_USING_SPI5 +#ifndef SPI5_BUS_CONFIG +#define SPI5_BUS_CONFIG \ + { \ + .SPIx = SPI5, \ + .bus_name = "spi5", \ + .irq_type = SPI5_IRQn, \ + } +#endif /* SPI5_BUS_CONFIG */ +#endif /* BSP_USING_SPI5 */ +#ifdef BSP_SPI5_TX_USING_DMA +#ifndef SPI5_TX_DMA_CONFIG +#define SPI5_TX_DMA_CONFIG \ + { \ + .Instance = SPI5_TX_DMA_INSTANCE, \ + .dma_irq = SPI5_TX_DMA_IRQ, \ + .HsInterface = SPI5_TX_DMA_HANDSHAK, \ + .dma_rcc = SPI5_TX_DMA_DMA_RCC, \ + .dma_channel = SPI5_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI5_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI5_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI5_TX_DMA_CONFIG */ +#endif /* BSP_SPI5_TX_USING_DMA */ +#ifdef BSP_SPI5_RX_USING_DMA +#ifndef SPI5_RX_DMA_CONFIG +#define SPI5_RX_DMA_CONFIG \ + { \ + .Instance = SPI5_RX_DMA_INSTANCE, \ + .dma_irq = SPI5_RX_DMA_IRQ, \ + .HsInterface = SPI5_RX_DMA_HANDSHAK, \ + .dma_rcc = SPI5_RX_DMA_DMA_RCC, \ + .dma_channel = SPI5_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI5_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI5_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI5_RX_DMA_CONFIG */ +#endif /* BSP_SPI5_RX_USING_DMA */ + + + +#ifdef BSP_USING_SPI6 +#ifndef SPI6_BUS_CONFIG +#define SPI6_BUS_CONFIG \ + { \ + .SPIx = SPI6, \ + .bus_name = "spi6", \ + .irq_type = SPI6_IRQn, \ + } +#endif /* SPI6_BUS_CONFIG */ +#endif /* BSP_USING_SPI6 */ +#ifdef BSP_SPI6_TX_USING_DMA +#ifndef SPI6_TX_DMA_CONFIG +#define SPI6_TX_DMA_CONFIG \ + { \ + .Instance = SPI6_TX_DMA_INSTANCE, \ + .dma_irq = SPI6_TX_DMA_IRQ, \ + .HsInterface = SPI6_TX_DMA_HANDSHAK, \ + .dma_rcc = SPI6_TX_DMA_DMA_RCC, \ + .dma_channel = SPI6_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI6_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI6_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI6_TX_DMA_CONFIG */ +#endif /* BSP_SPI6_TX_USING_DMA */ +#ifdef BSP_SPI6_RX_USING_DMA +#ifndef SPI6_RX_DMA_CONFIG +#define SPI6_RX_DMA_CONFIG \ + { \ + .Instance = SPI6_RX_DMA_INSTANCE, \ + .dma_irq = SPI6_RX_DMA_IRQ, \ + .HsInterface = SPI6_RX_DMA_HANDSHAK, \ + .dma_rcc = SPI6_RX_DMA_DMA_RCC, \ + .dma_channel = SPI6_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI6_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI6_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI6_RX_DMA_CONFIG */ +#endif /* BSP_SPI6_RX_USING_DMA */ + + +#ifdef BSP_USING_SPI7 +#ifndef SPI7_BUS_CONFIG +#define SPI7_BUS_CONFIG \ + { \ + .SPIx = SPI7, \ + .bus_name = "spi7", \ + .irq_type = SPI7_IRQn, \ + } +#endif /* SPI7_BUS_CONFIG */ +#endif /* BSP_USING_SPI7 */ +#ifdef BSP_SPI7_TX_USING_DMA +#ifndef SPI7_TX_DMA_CONFIG +#define SPI7_TX_DMA_CONFIG \ + { \ + .Instance = SPI7_TX_DMA_INSTANCE, \ + .dma_irq = SPI7_TX_DMA_IRQ, \ + .HsInterface = SPI7_TX_DMA_HANDSHAK, \ + .dma_rcc = SPI7_TX_DMA_DMA_RCC, \ + .dma_channel = SPI7_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI7_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI7_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI7_TX_DMA_CONFIG */ +#endif /* BSP_SPI7_TX_USING_DMA */ +#ifdef BSP_SPI7_RX_USING_DMA +#ifndef SPI7_RX_DMA_CONFIG +#define SPI7_RX_DMA_CONFIG \ + { \ + .Instance = SPI7_RX_DMA_INSTANCE, \ + .dma_irq = SPI7_RX_DMA_IRQ, \ + .HsInterface = SPI7_RX_DMA_HANDSHAK, \ + .dma_rcc = SPI7_RX_DMA_DMA_RCC, \ + .dma_channel = SPI7_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = SPI7_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = SPI7_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* SPI7_RX_DMA_CONFIG */ +#endif /* BSP_SPI7_RX_USING_DMA */ + +#ifdef __cplusplus +} +#endif + +#endif /*__SPI_CONFIG_H__ */ diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/uart_config.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/uart_config.h new file mode 100644 index 0000000000..71b499535f --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/config/h7/uart_config.h @@ -0,0 +1,832 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __UART_CONFIG_H__ +#define __UART_CONFIG_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#if defined(BSP_USING_UART1) +#ifndef UART1_CONFIG +#define UART1_CONFIG \ + { \ + .name = "uart1", \ + .Instance = USART1, \ + .irq_type = USART1_IRQn, \ + .periph = RCC_APB1_PERIPHEN_M7_USART1, \ + .EnablePeriphClk = RCC_EnableAPB1PeriphClk3, \ + } +#endif /* UART1_CONFIG */ +#endif /* BSP_USING_UART1 */ +#if defined(BSP_UART1_RX_USING_DMA) +#if defined(UART1_RX_DMA_INSTANCE) +#ifndef UART1_DMA_RX_CONFIG +#define UART1_DMA_RX_CONFIG \ + { \ + .Instance = UART1_RX_DMA_INSTANCE, \ + .dma_irq = UART1_RX_DMA_IRQ, \ + .HsInterface = UART1_RX_DMA_HANDSHAK, \ + .dma_rcc = UART1_RX_DMA_DMA_RCC, \ + .dma_channel = UART1_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART1_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART1_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART1_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART1_RX_DMA_INSTANCE */ +#endif /* BSP_UART1_RX_USING_DMA */ +#if defined(BSP_UART1_TX_USING_DMA) +#if defined(UART1_TX_DMA_INSTANCE) +#ifndef UART1_DMA_TX_CONFIG +#define UART1_DMA_TX_CONFIG \ + { \ + .Instance = UART1_TX_DMA_INSTANCE, \ + .dma_irq = UART1_TX_DMA_IRQ, \ + .HsInterface = UART1_TX_DMA_HANDSHAK, \ + .dma_rcc = UART1_TX_DMA_DMA_RCC, \ + .dma_channel = UART1_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART1_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART1_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART1_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART1_TX_DMA_INSTANCE */ +#endif /* BSP_UART1_TX_USING_DMA */ + + +#if defined(BSP_USING_UART2) +#ifndef UART2_CONFIG +#define UART2_CONFIG \ + { \ + .name = "uart2", \ + .Instance = USART2, \ + .irq_type = USART2_IRQn, \ + .periph = RCC_APB1_PERIPHEN_M7_USART2, \ + .EnablePeriphClk = RCC_EnableAPB1PeriphClk3, \ + } +#endif /* UART2_CONFIG */ +#endif /* BSP_USING_UART2 */ +#if defined(BSP_UART2_RX_USING_DMA) +#if defined(UART2_RX_DMA_INSTANCE) +#ifndef UART2_DMA_RX_CONFIG +#define UART2_DMA_RX_CONFIG \ + { \ + .Instance = UART2_RX_DMA_INSTANCE, \ + .dma_irq = UART2_RX_DMA_IRQ, \ + .HsInterface = UART2_RX_DMA_HANDSHAK, \ + .dma_rcc = UART2_RX_DMA_DMA_RCC, \ + .dma_channel = UART2_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART2_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART2_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART2_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART2_RX_DMA_INSTANCE */ +#endif /* BSP_UART2_RX_USING_DMA */ +#if defined(BSP_UART2_TX_USING_DMA) +#if defined(UART2_TX_DMA_INSTANCE) +#ifndef UART2_DMA_TX_CONFIG +#define UART2_DMA_TX_CONFIG \ + { \ + .Instance = UART2_TX_DMA_INSTANCE, \ + .dma_irq = UART2_TX_DMA_IRQ, \ + .HsInterface = UART2_TX_DMA_HANDSHAK, \ + .dma_rcc = UART2_TX_DMA_DMA_RCC, \ + .dma_channel = UART2_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART2_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART2_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART2_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART2_TX_DMA_INSTANCE */ +#endif /* BSP_UART2_TX_USING_DMA */ + + +#if defined(BSP_USING_UART3) +#ifndef UART3_CONFIG +#define UART3_CONFIG \ + { \ + .name = "uart3", \ + .Instance = USART3, \ + .irq_type = USART3_IRQn, \ + .periph = RCC_APB1_PERIPHEN_M7_USART3, \ + .EnablePeriphClk = RCC_EnableAPB1PeriphClk3, \ + } +#endif /* UART3_CONFIG */ +#endif /* BSP_USING_UART3 */ +#if defined(BSP_UART3_RX_USING_DMA) +#if defined(UART3_RX_DMA_INSTANCE) +#ifndef UART3_DMA_RX_CONFIG +#define UART3_DMA_RX_CONFIG \ + { \ + .Instance = UART3_RX_DMA_INSTANCE, \ + .dma_irq = UART3_RX_DMA_IRQ, \ + .HsInterface = UART3_RX_DMA_HANDSHAK, \ + .dma_rcc = UART3_RX_DMA_DMA_RCC, \ + .dma_channel = UART3_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART3_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART3_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART3_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART3_RX_DMA_INSTANCE */ +#endif /* BSP_UART3_RX_USING_DMA */ +#if defined(BSP_UART3_TX_USING_DMA) +#if defined(UART3_TX_DMA_INSTANCE) +#ifndef UART3_DMA_TX_CONFIG +#define UART3_DMA_TX_CONFIG \ + { \ + .Instance = UART3_TX_DMA_INSTANCE, \ + .dma_irq = UART3_TX_DMA_IRQ, \ + .HsInterface = UART3_TX_DMA_HANDSHAK, \ + .dma_rcc = UART3_TX_DMA_DMA_RCC, \ + .dma_channel = UART3_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART3_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART3_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART3_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART3_TX_DMA_INSTANCE */ +#endif /* BSP_UART3_TX_USING_DMA */ + + +#if defined(BSP_USING_UART4) +#ifndef UART4_CONFIG +#define UART4_CONFIG \ + { \ + .name = "uart4", \ + .Instance = USART4, \ + .irq_type = USART4_IRQn, \ + .periph = RCC_APB1_PERIPHEN_M7_USART4, \ + .EnablePeriphClk = RCC_EnableAPB1PeriphClk3, \ + } +#endif /* UART4_CONFIG */ +#endif /* BSP_USING_UART4 */ +#if defined(BSP_UART4_RX_USING_DMA) +#if defined(UART4_RX_DMA_INSTANCE) +#ifndef UART4_DMA_RX_CONFIG +#define UART4_DMA_RX_CONFIG \ + { \ + .Instance = UART4_RX_DMA_INSTANCE, \ + .dma_irq = UART4_RX_DMA_IRQ, \ + .HsInterface = UART4_RX_DMA_HANDSHAK, \ + .dma_rcc = UART4_RX_DMA_DMA_RCC, \ + .dma_channel = UART4_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART4_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART4_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART4_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART4_RX_DMA_INSTANCE */ +#endif /* BSP_UART4_RX_USING_DMA */ +#if defined(BSP_UART4_TX_USING_DMA) +#if defined(UART4_TX_DMA_INSTANCE) +#ifndef UART4_DMA_TX_CONFIG +#define UART4_DMA_TX_CONFIG \ + { \ + .Instance = UART4_TX_DMA_INSTANCE, \ + .dma_irq = UART4_TX_DMA_IRQ, \ + .HsInterface = UART4_TX_DMA_HANDSHAK, \ + .dma_rcc = UART4_TX_DMA_DMA_RCC, \ + .dma_channel = UART4_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART4_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART4_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART4_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART4_TX_DMA_INSTANCE */ +#endif /* BSP_UART4_TX_USING_DMA */ + + +#if defined(BSP_USING_UART5) +#ifndef UART5_CONFIG +#define UART5_CONFIG \ + { \ + .name = "uart5", \ + .Instance = USART5, \ + .irq_type = USART5_IRQn, \ + .periph = RCC_APB2_PERIPHEN_M7_USART5, \ + .EnablePeriphClk = RCC_EnableAPB2PeriphClk3, \ + } +#endif /* UART5_CONFIG */ +#endif /* BSP_USING_UART5 */ +#if defined(BSP_UART5_RX_USING_DMA) +#if defined(UART5_RX_DMA_INSTANCE) +#ifndef UART5_DMA_RX_CONFIG +#define UART5_DMA_RX_CONFIG \ + { \ + .Instance = UART5_RX_DMA_INSTANCE, \ + .dma_irq = UART5_RX_DMA_IRQ, \ + .HsInterface = UART5_RX_DMA_HANDSHAK, \ + .dma_rcc = UART5_RX_DMA_DMA_RCC, \ + .dma_channel = UART5_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART5_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART5_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART5_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART5_RX_DMA_INSTANCE */ +#endif /* BSP_UART5_RX_USING_DMA */ +#if defined(BSP_UART5_TX_USING_DMA) +#if defined(UART5_TX_DMA_INSTANCE) +#ifndef UART5_DMA_TX_CONFIG +#define UART5_DMA_TX_CONFIG \ + { \ + .Instance = UART5_TX_DMA_INSTANCE, \ + .dma_irq = UART5_TX_DMA_IRQ, \ + .HsInterface = UART5_TX_DMA_HANDSHAK, \ + .dma_rcc = UART5_TX_DMA_DMA_RCC, \ + .dma_channel = UART5_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART5_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART5_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART5_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART5_TX_DMA_INSTANCE */ +#endif /* BSP_UART5_TX_USING_DMA */ + + +#if defined(BSP_USING_UART6) +#ifndef UART6_CONFIG +#define UART6_CONFIG \ + { \ + .name = "uart6", \ + .Instance = USART6, \ + .irq_type = USART6_IRQn, \ + .periph = RCC_APB2_PERIPHEN_M7_USART6, \ + .EnablePeriphClk = RCC_EnableAPB2PeriphClk3, \ + } +#endif /* UART6_CONFIG */ +#endif /* BSP_USING_UART6 */ +#if defined(BSP_UART6_RX_USING_DMA) +#if defined(UART6_RX_DMA_INSTANCE) +#ifndef UART6_DMA_RX_CONFIG +#define UART6_DMA_RX_CONFIG \ + { \ + .Instance = UART6_RX_DMA_INSTANCE, \ + .dma_irq = UART6_RX_DMA_IRQ, \ + .HsInterface = UART6_RX_DMA_HANDSHAK, \ + .dma_rcc = UART6_RX_DMA_DMA_RCC, \ + .dma_channel = UART6_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART6_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART6_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART6_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART6_RX_DMA_INSTANCE */ +#endif /* BSP_UART6_RX_USING_DMA */ +#if defined(BSP_UART6_TX_USING_DMA) +#if defined(UART6_TX_DMA_INSTANCE) +#ifndef UART6_DMA_TX_CONFIG +#define UART6_DMA_TX_CONFIG \ + { \ + .Instance = UART6_TX_DMA_INSTANCE, \ + .dma_irq = UART6_TX_DMA_IRQ, \ + .HsInterface = UART6_TX_DMA_HANDSHAK, \ + .dma_rcc = UART6_TX_DMA_DMA_RCC, \ + .dma_channel = UART6_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART6_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART6_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART6_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART6_TX_DMA_INSTANCE */ +#endif /* BSP_UART6_TX_USING_DMA */ + + +#if defined(BSP_USING_UART7) +#ifndef UART7_CONFIG +#define UART7_CONFIG \ + { \ + .name = "uart7", \ + .Instance = USART7, \ + .irq_type = USART7_IRQn, \ + .periph = RCC_APB2_PERIPHEN_M7_USART7, \ + .EnablePeriphClk = RCC_EnableAPB2PeriphClk3, \ + } +#endif /* UART7_CONFIG */ +#endif /* BSP_USING_UART7 */ +#if defined(BSP_UART7_RX_USING_DMA) +#if defined(UART7_RX_DMA_INSTANCE) +#ifndef UART7_DMA_RX_CONFIG +#define UART7_DMA_RX_CONFIG \ + { \ + .Instance = UART7_RX_DMA_INSTANCE, \ + .dma_irq = UART7_RX_DMA_IRQ, \ + .HsInterface = UART7_RX_DMA_HANDSHAK, \ + .dma_rcc = UART7_RX_DMA_DMA_RCC, \ + .dma_channel = UART7_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART7_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART7_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART7_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART7_RX_DMA_INSTANCE */ +#endif /* BSP_UART7_RX_USING_DMA */ +#if defined(BSP_UART7_TX_USING_DMA) +#if defined(UART7_TX_DMA_INSTANCE) +#ifndef UART7_DMA_TX_CONFIG +#define UART7_DMA_TX_CONFIG \ + { \ + .Instance = UART7_TX_DMA_INSTANCE, \ + .dma_irq = UART7_TX_DMA_IRQ, \ + .HsInterface = UART7_TX_DMA_HANDSHAK, \ + .dma_rcc = UART7_TX_DMA_DMA_RCC, \ + .dma_channel = UART7_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART7_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART7_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART7_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART7_TX_DMA_INSTANCE */ +#endif /* BSP_UART7_TX_USING_DMA */ + + +#if defined(BSP_USING_UART8) +#ifndef UART8_CONFIG +#define UART8_CONFIG \ + { \ + .name = "uart8", \ + .Instance = USART8, \ + .irq_type = USART8_IRQn, \ + .periph = RCC_APB2_PERIPHEN_M7_USART8, \ + .EnablePeriphClk = RCC_EnableAPB2PeriphClk3, \ + } +#endif /* UART8_CONFIG */ +#endif /* BSP_USING_UART8 */ +#if defined(BSP_UART8_RX_USING_DMA) +#if defined(UART8_RX_DMA_INSTANCE) +#ifndef UART8_DMA_RX_CONFIG +#define UART8_DMA_RX_CONFIG \ + { \ + .Instance = UART8_RX_DMA_INSTANCE, \ + .dma_irq = UART8_RX_DMA_IRQ, \ + .HsInterface = UART8_RX_DMA_HANDSHAK, \ + .dma_rcc = UART8_RX_DMA_DMA_RCC, \ + .dma_channel = UART8_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART8_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART8_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART8_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART8_RX_DMA_INSTANCE */ +#endif /* BSP_UART8_RX_USING_DMA */ +#if defined(BSP_UART8_TX_USING_DMA) +#if defined(UART8_TX_DMA_INSTANCE) +#ifndef UART8_DMA_TX_CONFIG +#define UART8_DMA_TX_CONFIG \ + { \ + .Instance = UART8_TX_DMA_INSTANCE, \ + .dma_irq = UART8_TX_DMA_IRQ, \ + .HsInterface = UART8_TX_DMA_HANDSHAK, \ + .dma_rcc = UART8_TX_DMA_DMA_RCC, \ + .dma_channel = UART8_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART8_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART8_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART8_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART8_TX_DMA_INSTANCE */ +#endif /* BSP_UART8_TX_USING_DMA */ + + +#if defined(BSP_USING_UART9) +#ifndef UART9_CONFIG +#define UART9_CONFIG \ + { \ + .name = "uart9", \ + .Instance = UART9, \ + .irq_type = UART9_IRQn, \ + .periph = RCC_APB1_PERIPHEN_M7_UART9, \ + .EnablePeriphClk = RCC_EnableAPB1PeriphClk3, \ + } +#endif /* UART9_CONFIG */ +#endif /* BSP_USING_UART9 */ +#if defined(BSP_UART9_RX_USING_DMA) +#if defined(UART9_RX_DMA_INSTANCE) +#ifndef UART9_DMA_RX_CONFIG +#define UART9_DMA_RX_CONFIG \ + { \ + .Instance = UART9_RX_DMA_INSTANCE, \ + .dma_irq = UART9_RX_DMA_IRQ, \ + .HsInterface = UART9_RX_DMA_HANDSHAK, \ + .dma_rcc = UART9_RX_DMA_DMA_RCC, \ + .dma_channel = UART9_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART9_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART9_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART9_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART9_RX_DMA_INSTANCE */ +#endif /* BSP_UART9_RX_USING_DMA */ +#if defined(BSP_UART9_TX_USING_DMA) +#if defined(UART9_TX_DMA_INSTANCE) +#ifndef UART9_DMA_TX_CONFIG +#define UART9_DMA_TX_CONFIG \ + { \ + .Instance = UART9_TX_DMA_INSTANCE, \ + .dma_irq = UART9_TX_DMA_IRQ, \ + .HsInterface = UART9_TX_DMA_HANDSHAK, \ + .dma_rcc = UART9_TX_DMA_DMA_RCC, \ + .dma_channel = UART9_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART9_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART9_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART9_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART9_TX_DMA_INSTANCE */ +#endif /* BSP_UART9_TX_USING_DMA */ + + +#if defined(BSP_USING_UART10) +#ifndef UART10_CONFIG +#define UART10_CONFIG \ + { \ + .name = "uart10", \ + .Instance = UART10, \ + .irq_type = UART10_IRQn, \ + .periph = RCC_APB1_PERIPHEN_M7_UART10, \ + .EnablePeriphClk = RCC_EnableAPB1PeriphClk3, \ + } +#endif /* UART10_CONFIG */ +#endif /* BSP_USING_UART10 */ +#if defined(BSP_UART10_RX_USING_DMA) +#if defined(UART10_RX_DMA_INSTANCE) +#ifndef UART10_DMA_RX_CONFIG +#define UART10_DMA_RX_CONFIG \ + { \ + .Instance = UART10_RX_DMA_INSTANCE, \ + .dma_irq = UART10_RX_DMA_IRQ, \ + .HsInterface = UART10_RX_DMA_HANDSHAK, \ + .dma_rcc = UART10_RX_DMA_DMA_RCC, \ + .dma_channel = UART10_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART10_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART10_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART10_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART10_RX_DMA_INSTANCE */ +#endif /* BSP_UART10_RX_USING_DMA */ +#if defined(BSP_UART10_TX_USING_DMA) +#if defined(UART10_TX_DMA_INSTANCE) +#ifndef UART10_DMA_TX_CONFIG +#define UART10_DMA_TX_CONFIG \ + { \ + .Instance = UART10_TX_DMA_INSTANCE, \ + .dma_irq = UART10_TX_DMA_IRQ, \ + .HsInterface = UART10_TX_DMA_HANDSHAK, \ + .dma_rcc = UART10_TX_DMA_DMA_RCC, \ + .dma_channel = UART10_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART10_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART10_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART10_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART10_TX_DMA_INSTANCE */ +#endif /* BSP_UART10_TX_USING_DMA */ + + +#if defined(BSP_USING_UART11) +#ifndef UART11_CONFIG +#define UART11_CONFIG \ + { \ + .name = "uart11", \ + .Instance = UART11, \ + .irq_type = UART11_IRQn, \ + .periph = RCC_APB1_PERIPHEN_M7_UART11, \ + .EnablePeriphClk = RCC_EnableAPB1PeriphClk3, \ + } +#endif /* UART11_CONFIG */ +#endif /* BSP_USING_UART11 */ +#if defined(BSP_UART11_RX_USING_DMA) +#if defined(UART11_RX_DMA_INSTANCE) +#ifndef UART11_DMA_RX_CONFIG +#define UART11_DMA_RX_CONFIG \ + { \ + .Instance = UART11_RX_DMA_INSTANCE, \ + .dma_irq = UART11_RX_DMA_IRQ, \ + .HsInterface = UART11_RX_DMA_HANDSHAK, \ + .dma_rcc = UART11_RX_DMA_DMA_RCC, \ + .dma_channel = UART11_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART11_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART11_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART11_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART11_RX_DMA_INSTANCE */ +#endif /* BSP_UART11_RX_USING_DMA */ +#if defined(BSP_UART11_TX_USING_DMA) +#if defined(UART11_TX_DMA_INSTANCE) +#ifndef UART11_DMA_TX_CONFIG +#define UART11_DMA_TX_CONFIG \ + { \ + .Instance = UART11_TX_DMA_INSTANCE, \ + .dma_irq = UART11_TX_DMA_IRQ, \ + .HsInterface = UART11_TX_DMA_HANDSHAK, \ + .dma_rcc = UART11_TX_DMA_DMA_RCC, \ + .dma_channel = UART11_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART11_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART11_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART11_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART11_TX_DMA_INSTANCE */ +#endif /* BSP_UART11_TX_USING_DMA */ + + +#if defined(BSP_USING_UART12) +#ifndef UART12_CONFIG +#define UART12_CONFIG \ + { \ + .name = "uart12", \ + .Instance = UART12, \ + .irq_type = UART12_IRQn, \ + .periph = RCC_APB1_PERIPHEN_M7_UART12, \ + .EnablePeriphClk = RCC_EnableAPB1PeriphClk3, \ + } +#endif /* UART12_CONFIG */ +#endif /* BSP_USING_UART12 */ +#if defined(BSP_UART12_RX_USING_DMA) +#if defined(UART12_RX_DMA_INSTANCE) +#ifndef UART12_DMA_RX_CONFIG +#define UART12_DMA_RX_CONFIG \ + { \ + .Instance = UART12_RX_DMA_INSTANCE, \ + .dma_irq = UART12_RX_DMA_IRQ, \ + .HsInterface = UART12_RX_DMA_HANDSHAK, \ + .dma_rcc = UART12_RX_DMA_DMA_RCC, \ + .dma_channel = UART12_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART12_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART12_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART12_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART12_RX_DMA_INSTANCE */ +#endif /* BSP_UART12_RX_USING_DMA */ +#if defined(BSP_UART12_TX_USING_DMA) +#if defined(UART12_TX_DMA_INSTANCE) +#ifndef UART12_DMA_TX_CONFIG +#define UART12_DMA_TX_CONFIG \ + { \ + .Instance = UART12_TX_DMA_INSTANCE, \ + .dma_irq = UART12_TX_DMA_IRQ, \ + .HsInterface = UART12_TX_DMA_HANDSHAK, \ + .dma_rcc = UART12_TX_DMA_DMA_RCC, \ + .dma_channel = UART12_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART12_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART12_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART12_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART12_TX_DMA_INSTANCE */ +#endif /* BSP_UART12_TX_USING_DMA */ + + +#if defined(BSP_USING_UART13) +#ifndef UART13_CONFIG +#define UART13_CONFIG \ + { \ + .name = "uart13", \ + .Instance = UART13, \ + .irq_type = UART13_IRQn, \ + .periph = RCC_APB2_PERIPHEN_M7_UART13, \ + .EnablePeriphClk = RCC_EnableAPB2PeriphClk3, \ + } +#endif /* UART13_CONFIG */ +#endif /* BSP_USING_UART13 */ +#if defined(BSP_UART13_RX_USING_DMA) +#if defined(UART13_RX_DMA_INSTANCE) +#ifndef UART13_DMA_RX_CONFIG +#define UART13_DMA_RX_CONFIG \ + { \ + .Instance = UART13_RX_DMA_INSTANCE, \ + .dma_irq = UART13_RX_DMA_IRQ, \ + .HsInterface = UART13_RX_DMA_HANDSHAK, \ + .dma_rcc = UART13_RX_DMA_DMA_RCC, \ + .dma_channel = UART13_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART13_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART13_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART13_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART13_RX_DMA_INSTANCE */ +#endif /* BSP_UART13_RX_USING_DMA */ +#if defined(BSP_UART13_TX_USING_DMA) +#if defined(UART13_TX_DMA_INSTANCE) +#ifndef UART13_DMA_TX_CONFIG +#define UART13_DMA_TX_CONFIG \ + { \ + .Instance = UART13_TX_DMA_INSTANCE, \ + .dma_irq = UART13_TX_DMA_IRQ, \ + .HsInterface = UART13_TX_DMA_HANDSHAK, \ + .dma_rcc = UART13_TX_DMA_DMA_RCC, \ + .dma_channel = UART13_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART13_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART13_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART13_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART13_TX_DMA_INSTANCE */ +#endif /* BSP_UART13_TX_USING_DMA */ + + +#if defined(BSP_USING_UART14) +#ifndef UART14_CONFIG +#define UART14_CONFIG \ + { \ + .name = "uart14", \ + .Instance = UART14, \ + .irq_type = UART14_IRQn, \ + .periph = RCC_APB2_PERIPHEN_M7_UART14, \ + .EnablePeriphClk = RCC_EnableAPB2PeriphClk3, \ + } +#endif /* UART14_CONFIG */ +#endif /* BSP_USING_UART14 */ +#if defined(BSP_UART14_RX_USING_DMA) +#if defined(UART14_RX_DMA_INSTANCE) +#ifndef UART14_DMA_RX_CONFIG +#define UART14_DMA_RX_CONFIG \ + { \ + .Instance = UART14_RX_DMA_INSTANCE, \ + .dma_irq = UART14_RX_DMA_IRQ, \ + .HsInterface = UART14_RX_DMA_HANDSHAK, \ + .dma_rcc = UART14_RX_DMA_DMA_RCC, \ + .dma_channel = UART14_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART14_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART14_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART14_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART14_RX_DMA_INSTANCE */ +#endif /* BSP_UART14_RX_USING_DMA */ +#if defined(BSP_UART14_TX_USING_DMA) +#if defined(UART14_TX_DMA_INSTANCE) +#ifndef UART14_DMA_TX_CONFIG +#define UART14_DMA_TX_CONFIG \ + { \ + .Instance = UART14_TX_DMA_INSTANCE, \ + .dma_irq = UART14_TX_DMA_IRQ, \ + .HsInterface = UART14_TX_DMA_HANDSHAK, \ + .dma_rcc = UART14_TX_DMA_DMA_RCC, \ + .dma_channel = UART14_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART14_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART14_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART14_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART14_TX_DMA_INSTANCE */ +#endif /* BSP_UART14_TX_USING_DMA */ + + +#if defined(BSP_USING_UART15) +#ifndef UART15_CONFIG +#define UART15_CONFIG \ + { \ + .name = "uart15", \ + .Instance = UART15, \ + .irq_type = UART15_IRQn, \ + .periph = RCC_APB2_PERIPHEN_M7_UART15, \ + .EnablePeriphClk = RCC_EnableAPB2PeriphClk3, \ + } +#endif /* UART15_CONFIG */ +#endif /* BSP_USING_UART15 */ +#if defined(BSP_UART15_RX_USING_DMA) +#if defined(UART15_RX_DMA_INSTANCE) +#ifndef UART15_DMA_RX_CONFIG +#define UART15_DMA_RX_CONFIG \ + { \ + .Instance = UART15_RX_DMA_INSTANCE, \ + .dma_irq = UART15_RX_DMA_IRQ, \ + .HsInterface = UART15_RX_DMA_HANDSHAK, \ + .dma_rcc = UART15_RX_DMA_DMA_RCC, \ + .dma_channel = UART15_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART15_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART15_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART15_DMA_RX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART15_RX_DMA_INSTANCE */ +#endif /* BSP_UART15_RX_USING_DMA */ +#if defined(BSP_UART15_TX_USING_DMA) +#if defined(UART15_TX_DMA_INSTANCE) +#ifndef UART15_DMA_TX_CONFIG +#define UART15_DMA_TX_CONFIG \ + { \ + .Instance = UART15_TX_DMA_INSTANCE, \ + .dma_irq = UART15_TX_DMA_IRQ, \ + .HsInterface = UART15_TX_DMA_HANDSHAK, \ + .dma_rcc = UART15_TX_DMA_DMA_RCC, \ + .dma_channel = UART15_TX_DMA_DMA_CHANNEL, \ + .dmamux_channel = UART15_TX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = UART15_TX_DMA_DMAMUX_REQUEST, \ + } +#endif /* UART15_DMA_TX_CONFIG */ +#else +#error "The DMA resource is not available." +#endif /* UART15_TX_DMA_INSTANCE */ +#endif /* BSP_UART15_TX_USING_DMA */ + + +#if defined(BSP_USING_LPUART1) +#ifndef LPUART1_CONFIG +#define LPUART1_CONFIG \ + { \ + .name = "lpuart1", \ + .Instance = LPUART1, \ + .irq_type = LPUART1_IRQn, \ + .periph = RCC_RD_PERIPHEN_M7_LPUART1, \ + .EnablePeriphClk = RCC_EnableRDPeriphClk1, \ + } +#endif /* LPUART1_CONFIG */ +#endif /* BSP_USING_LPUART1 */ +#if defined(BSP_LPUART1_RX_USING_DMA) +#ifndef LPUART1_DMA_RX_CONFIG +#define LPUART1_DMA_RX_CONFIG \ + { \ + .Instance = LPUART1_RX_DMA_INSTANCE, \ + .dma_irq = LPUART1_RX_DMA_IRQ, \ + .HsInterface = LPUART1_RX_DMA_HANDSHAK, \ + .dma_rcc = LPUART1_RX_DMA_DMA_RCC, \ + .dma_channel = LPUART1_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = LPUART1_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = LPUART1_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* LPUART1_DMA_RX_CONFIG */ +#endif /* BSP_LPUART1_RX_USING_DMA */ + + +#if defined(BSP_USING_LPUART2) +#ifndef LPUART2_CONFIG +#define LPUART2_CONFIG \ + { \ + .name = "lpuart2", \ + .Instance = LPUART2, \ + .irq_type = LPUART2_IRQn, \ + .periph = RCC_RD_PERIPHEN_M7_LPUART2, \ + .EnablePeriphClk = RCC_EnableRDPeriphClk1, \ + } +#endif /* LPUART2_CONFIG */ +#endif /* BSP_USING_LPUART2 */ +#if defined(BSP_LPUART2_RX_USING_DMA) +#ifndef LPUART2_DMA_RX_CONFIG +#define LPUART2_DMA_RX_CONFIG \ + { \ + .Instance = LPUART2_RX_DMA_INSTANCE, \ + .dma_irq = LPUART2_RX_DMA_IRQ, \ + .HsInterface = LPUART2_RX_DMA_HANDSHAK, \ + .dma_rcc = LPUART2_RX_DMA_DMA_RCC, \ + .dma_channel = LPUART2_RX_DMA_DMA_CHANNEL, \ + .dmamux_channel = LPUART2_RX_DMA_DMAMUX_CHANNEL, \ + .dmamux_request = LPUART2_RX_DMA_DMAMUX_REQUEST, \ + } +#endif /* LPUART2_DMA_RX_CONFIG */ +#endif /* BSP_LPUART2_RX_USING_DMA */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __UART_CONFIG_H__ */ + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_adc.c b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_adc.c new file mode 100644 index 0000000000..cd04672c07 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_adc.c @@ -0,0 +1,390 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#include +#include + +#if defined(BSP_USING_ADC1) || defined(BSP_USING_ADC2) || defined(BSP_USING_ADC3) +#include "drv_config.h" + +//#define DRV_DEBUG +#define LOG_TAG "drv.adc" +#include + + +typedef struct +{ + ADC_Module *ADCx; + uint32_t AHB_periph; + void (*EnablePeriphClk)(uint32_t periph, FunctionalState cmd); + + ADC_CTRL3_CKMOD ADC_ClkMode; + uint32_t Pll_CLK_source; + uint32_t RCC_ADCPrescaler; + + uint32_t Rank; + uint32_t ADC_SampleTime; + + ADC_InitType Init; +} ADC_InitInfo_t; + +static ADC_InitInfo_t adc_config[] = +{ +#ifdef BSP_USING_ADC1 + ADC1_CONFIG, +#endif + +#ifdef BSP_USING_ADC2 + ADC2_CONFIG, +#endif + +#ifdef BSP_USING_ADC3 + ADC3_CONFIG, +#endif +}; + + +struct n32_adc +{ + ADC_InitInfo_t ADC_Info; + struct rt_adc_device n32_adc_device; +}; + + +static struct n32_adc n32_adc_obj[sizeof(adc_config) / sizeof(adc_config[0])]; + + +static rt_err_t n32_adc_get_channel(rt_int8_t rt_channel, uint32_t *n32_channel) +{ + switch (rt_channel) + { + case 0: + *n32_channel = ADC_CH_0; + break; + case 1: + *n32_channel = ADC_CH_1; + break; + case 2: + *n32_channel = ADC_CH_2; + break; + case 3: + *n32_channel = ADC_CH_3; + break; + case 4: + *n32_channel = ADC_CH_4; + break; + case 5: + *n32_channel = ADC_CH_5; + break; + case 6: + *n32_channel = ADC_CH_6; + break; + case 7: + *n32_channel = ADC_CH_7; + break; + case 8: + *n32_channel = ADC_CH_8; + break; + case 9: + *n32_channel = ADC_CH_9; + break; + case 10: + *n32_channel = ADC_CH_10; + break; + case 11: + *n32_channel = ADC_CH_11; + break; + case 12: + *n32_channel = ADC_CH_12; + break; + case 13: + *n32_channel = ADC_CH_13; + break; + case 14: + *n32_channel = ADC_CH_14; + break; + case 15: + *n32_channel = ADC_CH_15; + break; + case 16: + *n32_channel = ADC_CH_16; + break; + case 17: + *n32_channel = ADC_CH_17; + break; + case 18: + *n32_channel = ADC_CH_18; + break; + case 19: + *n32_channel = ADC_CH_19; + break; + +#if defined(SOC_SERIES_N32H7xx) +#ifdef ADC3_Channel_19_VREFINT + case RT_ADC_INTERN_CH_VREF: + *n32_channel = ADC3_Channel_19_VREFINT; + break; +#endif /* ADC3_Channel_19_VREFINT */ + +#ifdef ADC3_Channel_17_Battery_DIV4 + case RT_ADC_INTERN_CH_VBAT: + *n32_channel = ADC3_Channel_17_Battery_DIV4; + break; +#endif /* ADC3_Channel_17_Battery_DIV4 */ + +#ifdef ADC3_Channel_18_Temperture_Sensor + case RT_ADC_INTERN_CH_TEMPER: + *n32_channel = ADC3_Channel_18_Temperture_Sensor; + break; +#endif /* ADC3_Channel_18_Temperture_Sensor */ +#endif + + default: + return -RT_EINVAL; + } + + return RT_EOK; +} + + +static rt_err_t n32_adc_enabled(struct rt_adc_device *device, rt_int8_t channel, rt_bool_t enabled) +{ + volatile uint32_t index = 0; + uint32_t ADC_Channel; + ADC_InitInfo_t *n32_adc_info; + + RT_ASSERT(device != RT_NULL); + n32_adc_info = device->parent.user_data; + + if (enabled) + { + if (n32_adc_get_channel(channel, &ADC_Channel) != RT_EOK) + { + LOG_E("ADC channel illegal: %d", channel); + return -RT_EINVAL; + } + +#if defined(SOC_SERIES_N32H7xx) + + /* */ + if ((channel == RT_ADC_INTERN_CH_VREF) || (channel == RT_ADC_INTERN_CH_VBAT) || (channel == RT_ADC_INTERN_CH_TEMPER)) + { + if (n32_adc_info->ADCx != ADC3) + { + LOG_E("%s not supported", device->parent.parent.name); + return -RT_EINVAL; + } + + if (channel == RT_ADC_INTERN_CH_VREF) + { + /* Enable ADC Vrefint channel */ + ADC_EnableVrefint(ENABLE); + } + else if (channel == RT_ADC_INTERN_CH_TEMPER) + { + /* Enable ADC temperature sensor */ + ADC_EnableTempSensor(ENABLE); + } + else + { + /* Enable ADC battery voltage monitor */ + ADC_EnableBatteryVoltageMonitor(ENABLE); + } + } + + /* Enable ADC */ + ADC_Enable(n32_adc_info->ADCx, ENABLE); + /* Check ADC Ready */ + while (ADC_GetFlagStatus(n32_adc_info->ADCx, ADC_FLAG_RDY) == RESET) + { + } + + /* Start ADC calibration */ + ADC_CalibrationOperation(n32_adc_info->ADCx); + /* Check the end of ADCx calibration */ + while (ADC_GetCalibrationStatus(n32_adc_info->ADCx)) + { + } + + /* Configures ADC regular channel */ + ADC_ConfigRegularChannel(n32_adc_info->ADCx, ADC_Channel, n32_adc_info->Rank, n32_adc_info->ADC_SampleTime); + + for (index = 0U; index < 100U; index++) + { + __NOP(); + } + + /* Enable ADC Regular channel conversion */ + ADC_StartRegularConv(n32_adc_info->ADCx); + + while ((n32_adc_info->ADCx->CTRL3 & ADC_CTRL3_RSTART) != ADC_CTRL3_RSTART) + { + } + + /* Start ADC Software Conversion */ + ADC_EnableSoftwareStartConv(n32_adc_info->ADCx, ENABLE); +#endif + } + else + { +#if defined(SOC_SERIES_N32H7xx) + if (channel == RT_ADC_INTERN_CH_VREF) + { + /* Disable ADC Vrefint channel */ + ADC_EnableVrefint(DISABLE); + } + else if (channel == RT_ADC_INTERN_CH_VBAT) + { + /* Disable ADC battery voltage monitor */ + ADC_EnableBatteryVoltageMonitor(DISABLE); + } + else + { + /* Disable ADC temperature sensor */ + ADC_EnableTempSensor(DISABLE); + } + + /* Disable ADC */ + ADC_Enable(n32_adc_info->ADCx, DISABLE); +#endif + } + + return RT_EOK; +} + + +static rt_err_t n32_adc_get_value(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value) +{ + uint16_t Convert_Value; + ADC_InitInfo_t *n32_adc_info; + + RT_ASSERT(device != RT_NULL); + RT_ASSERT(value != RT_NULL); + + n32_adc_info = device->parent.user_data; + +#if defined(SOC_SERIES_N32H7xx) + /* Wait for the ADC to convert */ + while (ADC_GetFlagStatus(n32_adc_info->ADCx, ADC_FLAG_ENDC) != SET) + { + } + + /* Clear ADC Flag */ + ADC_ClearFlag(n32_adc_info->ADCx, ADC_FLAG_ENDC); + ADC_ClearFlag(n32_adc_info->ADCx, ADC_FLAG_STR); + + /* Get ADC value */ + Convert_Value = ADC_GetDat(n32_adc_info->ADCx); + + if (channel == RT_ADC_INTERN_CH_VBAT) + Convert_Value *= 4U; +#endif + + *value = Convert_Value; + + return RT_EOK; +} + + +static rt_uint8_t n32_adc_get_resolution(struct rt_adc_device *device) +{ + rt_uint8_t Resolution = 0; + ADC_InitInfo_t *n32_adc_info = device->parent.user_data; + + RT_ASSERT(device != RT_NULL); + + switch (n32_adc_info->Init.Resolution) + { +#if defined(SOC_SERIES_N32H7xx) + case ADC_DATA_RES_12BIT: + { + Resolution = 12; + break; + } + + case ADC_DATA_RES_10BIT: + { + Resolution = 10; + break; + } +#endif + default: + break; + } + + return Resolution; +} + + +static rt_int16_t n32_adc_get_vref (struct rt_adc_device *device) +{ + return 3300; +} + + +static const struct rt_adc_ops n32_adc_ops = +{ + .enabled = n32_adc_enabled, + .convert = n32_adc_get_value, + .get_resolution = n32_adc_get_resolution, + .get_vref = n32_adc_get_vref, +}; + + +static int n32_adc_init(void) +{ + int result = RT_EOK; + /* save adc name */ + char name_buf[5] = {'a', 'd', 'c', '0', 0}; + int i = 0; + + for (i = 0; i < sizeof(adc_config) / sizeof(adc_config[0]); i++) + { + /* ADC init */ + name_buf[3] = '0'; + n32_adc_obj[i].ADC_Info = adc_config[i]; +#if defined(ADC1) + if (n32_adc_obj[i].ADC_Info.ADCx == ADC1) + { + name_buf[3] = '1'; + } +#endif +#if defined(ADC2) + if (n32_adc_obj[i].ADC_Info.ADCx == ADC2) + { + name_buf[3] = '2'; + } +#endif +#if defined(ADC3) + if (n32_adc_obj[i].ADC_Info.ADCx == ADC3) + { + name_buf[3] = '3'; + } +#endif + + ADC_Init(n32_adc_obj[i].ADC_Info.ADCx, &n32_adc_obj[i].ADC_Info.Init); + + /* register ADC device */ + if (rt_hw_adc_register(&n32_adc_obj[i].n32_adc_device, name_buf, &n32_adc_ops, &n32_adc_obj[i].ADC_Info) == RT_EOK) + { + LOG_D("%s init success", name_buf); + } + else + { + LOG_E("%s register failed", name_buf); + result = -RT_ERROR; + } + } + + return result; +} +INIT_BOARD_EXPORT(n32_adc_init); + +#endif /* BSP_USING_ADC */ diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_config.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_config.h new file mode 100644 index 0000000000..10d904f3f8 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_config.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __DRV_CONFIG_H_ +#define __DRV_CONFIG_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +#if defined(SOC_SERIES_N32H7xx) +#include "h7/dma_config.h" +#include "h7/uart_config.h" +#include "h7/i2c_hard_config.h" +#include "h7/adc_config.h" +#include "h7/spi_config.h" +#endif /* defined(SOC_SERIES_N32H7xx) */ + +#ifdef __cplusplus +} +#endif + +#endif /*__DRV_CONFIG_H_ */ + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_dma.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_dma.h new file mode 100644 index 0000000000..4ede0efca6 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_dma.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __DRV_DMA_H_ +#define __DRV_DMA_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define DMA_BLOCK_SIZE (4095) + +struct dma_config +{ + DMA_Module *Instance; + IRQn_Type dma_irq; + DMA_ChHwHsIfType HsInterface; + rt_uint32_t dma_rcc; + DMA_ChNumType dma_channel; + rt_uint32_t dmamux_channel; + rt_uint32_t dmamux_request; +}; + +#ifdef __cplusplus +} +#endif + +#endif /*__DRV_DMA_H_ */ + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_gpio.c b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_gpio.c new file mode 100644 index 0000000000..ea9fc1aaf0 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_gpio.c @@ -0,0 +1,628 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#include "drv_gpio.h" + +#ifdef BSP_USING_GPIO + +#define PIN_NUM(port, no) (((((port) & 0xFU) << 4U) | ((no) & 0xFU))) +#define PIN_PORT(pin) ((uint8_t)(((pin) >> 4U) & 0xFU)) +#define PIN_NO(pin) ((uint8_t)((pin) & 0xFU)) + +#define PIN_STPORT(pin) ((GPIO_Module *)(GPIOA_BASE + (0x400U * PIN_PORT(pin)))) +#define PIN_STPIN(pin) ((uint16_t)(1U << PIN_NO(pin))) + +#define ITEM_NUM(items) (sizeof(items) / sizeof((items)[0])) + +static uint32_t pin_irq_enable_mask = 0; + +#if defined(GPIOK) + #define __N32_PORT_MAX 8u +#elif defined(GPIOJ) + #define __N32_PORT_MAX 16u +#elif defined(GPIOI) + #define __N32_PORT_MAX 16u +#elif defined(GPIOH) + #define __N32_PORT_MAX 16u +#elif defined(GPIOG) + #define __N32_PORT_MAX 16u +#elif defined(GPIOF) + #define __N32_PORT_MAX 16u +#elif defined(GPIOE) + #define __N32_PORT_MAX 16u +#elif defined(GPIOD) + #define __N32_PORT_MAX 16u +#elif defined(GPIOC) + #define __N32_PORT_MAX 16u +#elif defined(GPIOB) + #define __N32_PORT_MAX 16u +#elif defined(GPIOA) + #define __N32_PORT_MAX 16u +#else + #define __N32_PORT_MAX 0u + #error Unsupported N32 GPIO peripheral. +#endif + +#define PIN_STPORT_MAX __N32_PORT_MAX + +static const struct pin_irq_map pin_irq_map[] = +{ + {GPIO_PIN_0, EXTI_LINE0, EXTI0_IRQn}, + {GPIO_PIN_1, EXTI_LINE1, EXTI1_IRQn}, + {GPIO_PIN_2, EXTI_LINE2, EXTI2_IRQn}, + {GPIO_PIN_3, EXTI_LINE3, EXTI3_IRQn}, + {GPIO_PIN_4, EXTI_LINE4, EXTI4_IRQn}, + {GPIO_PIN_5, EXTI_LINE5, EXTI9_5_IRQn}, + {GPIO_PIN_6, EXTI_LINE6, EXTI9_5_IRQn}, + {GPIO_PIN_7, EXTI_LINE7, EXTI9_5_IRQn}, + {GPIO_PIN_8, EXTI_LINE8, EXTI9_5_IRQn}, + {GPIO_PIN_9, EXTI_LINE9, EXTI9_5_IRQn}, + {GPIO_PIN_10, EXTI_LINE10, EXTI15_10_IRQn}, + {GPIO_PIN_11, EXTI_LINE11, EXTI15_10_IRQn}, + {GPIO_PIN_12, EXTI_LINE12, EXTI15_10_IRQn}, + {GPIO_PIN_13, EXTI_LINE13, EXTI15_10_IRQn}, + {GPIO_PIN_14, EXTI_LINE14, EXTI15_10_IRQn}, + {GPIO_PIN_15, EXTI_LINE15, EXTI15_10_IRQn}, +}; + +static struct rt_pin_irq_hdr pin_irq_hdr_tab[] = +{ + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, +}; + +/* e.g. PA.0 */ +static rt_base_t n32_pin_get(const char *name) +{ + rt_base_t pin = 0; + int hw_port_num, hw_pin_num = 0; + int i, name_len; + + name_len = rt_strlen(name); + + if ((name_len < 4U) || (name_len >= 6U)) + { + goto out; + } + if ((name[0] != 'P') || (name[2] != '.')) + { + goto out; + } + + if ((name[1] >= 'A') && (name[1] <= 'Z')) + { + hw_port_num = (int)(name[1] - 'A'); + } + else + { + goto out; + } + + for (i = 3; i < name_len; i++) + { + hw_pin_num *= 10; + hw_pin_num += name[i] - '0'; + } + + pin = PIN_NUM(hw_port_num, hw_pin_num); + + return pin; + +out: + rt_kprintf("Px.y x:A~Z y:0-15, e.g. PA.0\n"); + return -RT_EINVAL; +} + +static void n32_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value) +{ + GPIO_Module *gpio_port; + uint16_t gpio_pin; + + if (PIN_PORT(pin) < PIN_STPORT_MAX) + { + gpio_port = PIN_STPORT(pin); + gpio_pin = PIN_STPIN(pin); + + if (value != 0) + { + gpio_port->PBSC = gpio_pin; + } + else + { + gpio_port->PBC = gpio_pin; + } + } +} + +static rt_ssize_t n32_pin_read(rt_device_t dev, rt_base_t pin) +{ + GPIO_Module *gpio_port; + uint16_t gpio_pin; + Bit_OperateType state = Bit_RESET; + + if (PIN_PORT(pin) < PIN_STPORT_MAX) + { + gpio_port = PIN_STPORT(pin); + gpio_pin = PIN_STPIN(pin); + + if ((gpio_port->PID & gpio_pin) != Bit_RESET) + { + state = Bit_SET; + } + else + { + state = Bit_RESET; + } + } + else + { + return -RT_EINVAL; + } + + return (state == Bit_RESET) ? PIN_LOW : PIN_HIGH; +} + +static void n32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) +{ + GPIO_InitType GPIO_InitStructure; + + if (PIN_PORT(pin) >= PIN_STPORT_MAX) + { + return; + } + + GPIO_InitStruct(&GPIO_InitStructure); + /* Configure GPIO_InitStructure */ + GPIO_InitStructure.Pin = PIN_STPIN(pin); + + if (mode == PIN_MODE_OUTPUT) + { + /* output setting */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStructure.GPIO_Pull = GPIO_NO_PULL; + } + else if (mode == PIN_MODE_INPUT) + { + /* input setting: not pull. */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT; + GPIO_InitStructure.GPIO_Pull = GPIO_NO_PULL; + } + else if (mode == PIN_MODE_INPUT_PULLUP) + { + /* input setting: pull up. */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT; + GPIO_InitStructure.GPIO_Pull = GPIO_PULL_UP; + } + else if (mode == PIN_MODE_INPUT_PULLDOWN) + { + /* input setting: pull down. */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT; + GPIO_InitStructure.GPIO_Pull = GPIO_PULL_DOWN; + } + else if (mode == PIN_MODE_OUTPUT_OD) + { + /* output setting: od. */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_OD; + GPIO_InitStructure.GPIO_Pull = GPIO_NO_PULL; + } + + GPIO_InitPeripheral(PIN_STPORT(pin), &GPIO_InitStructure); +} + +rt_inline rt_int32_t bit2bitno(rt_uint32_t bit) +{ + rt_int32_t i; + for (i = 0; i < 32; i++) + { + if (((rt_uint32_t)0x01 << i) == bit) + { + return i; + } + } + return -1; +} + +rt_inline const struct pin_irq_map *get_pin_irq_map(uint32_t pinbit) +{ + rt_int32_t mapindex = bit2bitno(pinbit); + if (mapindex < 0 || mapindex >= (rt_int32_t)ITEM_NUM(pin_irq_map)) + { + return RT_NULL; + } + return &pin_irq_map[mapindex]; +}; + + +static rt_err_t n32_pin_attach_irq(struct rt_device *device, rt_base_t pin, + rt_uint8_t mode, void (*hdr)(void *args), void *args) +{ + rt_base_t level; + rt_int32_t irqindex = -1; + + if (PIN_PORT(pin) >= PIN_STPORT_MAX) + { + return -RT_ENOSYS; + } + + irqindex = bit2bitno(PIN_STPIN(pin)); + if (irqindex < 0 || irqindex >= (rt_int32_t)ITEM_NUM(pin_irq_map)) + { + return -RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + + if (pin_irq_hdr_tab[irqindex].pin == pin && + pin_irq_hdr_tab[irqindex].hdr == hdr && + pin_irq_hdr_tab[irqindex].mode == mode && + pin_irq_hdr_tab[irqindex].args == args) + { + rt_hw_interrupt_enable(level); + return RT_EOK; + } + if (pin_irq_hdr_tab[irqindex].pin != -1) + { + rt_hw_interrupt_enable(level); + return -RT_EBUSY; + } + pin_irq_hdr_tab[irqindex].pin = pin; + pin_irq_hdr_tab[irqindex].hdr = hdr; + pin_irq_hdr_tab[irqindex].mode = mode; + pin_irq_hdr_tab[irqindex].args = args; + + rt_hw_interrupt_enable(level); + + return RT_EOK; +} + +static rt_err_t n32_pin_dettach_irq(struct rt_device *device, rt_base_t pin) +{ + rt_base_t level; + rt_int32_t irqindex = -1; + + if (PIN_PORT(pin) >= PIN_STPORT_MAX) + { + return -RT_ENOSYS; + } + + irqindex = bit2bitno(PIN_STPIN(pin)); + if (irqindex < 0 || irqindex >= (rt_int32_t)ITEM_NUM(pin_irq_map)) + { + return -RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + + if (pin_irq_hdr_tab[irqindex].pin == -1) + { + rt_hw_interrupt_enable(level); + return RT_EOK; + } + pin_irq_hdr_tab[irqindex].pin = -1; + pin_irq_hdr_tab[irqindex].hdr = RT_NULL; + pin_irq_hdr_tab[irqindex].mode = 0; + pin_irq_hdr_tab[irqindex].args = RT_NULL; + + rt_hw_interrupt_enable(level); + + return RT_EOK; +} + +static rt_err_t n32_pin_irq_enable(struct rt_device *device, rt_base_t pin, + rt_uint8_t enabled) +{ + const struct pin_irq_map *irqmap; + rt_base_t level; + rt_int32_t irqindex = -1; + GPIO_InitType GPIO_InitStructure; + EXTI_InitType EXTI_InitStructure; + + if (PIN_PORT(pin) >= PIN_STPORT_MAX) + { + return -RT_ENOSYS; + } + + if (enabled == PIN_IRQ_ENABLE) + { + irqindex = bit2bitno(PIN_STPIN(pin)); + if (irqindex < 0 || irqindex >= (rt_int32_t)ITEM_NUM(pin_irq_map)) + { + return -RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + + if (pin_irq_hdr_tab[irqindex].pin == -1) + { + rt_hw_interrupt_enable(level); + return -RT_ENOSYS; + } + + irqmap = &pin_irq_map[irqindex]; + + /* EXTI Line Config */ + GPIO_ConfigEXTILine(irqmap->exti_line, (PIN_NO(pin) * 11 + PIN_PORT(pin))); + + GPIO_InitStruct(&GPIO_InitStructure); + /* Configure GPIO_InitStructure */ + GPIO_InitStructure.Pin = PIN_STPIN(pin); + GPIO_InitStructure.GPIO_Slew_Rate = GPIO_SLEW_RATE_FAST; + + switch (pin_irq_hdr_tab[irqindex].mode) + { + case PIN_IRQ_MODE_RISING: + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT; + GPIO_InitStructure.GPIO_Pull = GPIO_PULL_DOWN; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + break; + case PIN_IRQ_MODE_FALLING: + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT; + GPIO_InitStructure.GPIO_Pull = GPIO_PULL_DOWN; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; + break; + case PIN_IRQ_MODE_RISING_FALLING: + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT; + GPIO_InitStructure.GPIO_Pull = GPIO_NO_PULL; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; + break; + } + GPIO_InitPeripheral(PIN_STPORT(pin), &GPIO_InitStructure); + + EXTI_InitStructure.EXTI_Line = irqmap->exti_line; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_InitPeripheral(&EXTI_InitStructure); + + NVIC_SetPriority(irqmap->irqno, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0)); + NVIC_EnableIRQ(irqmap->irqno); + pin_irq_enable_mask |= irqmap->pinbit; + + rt_hw_interrupt_enable(level); + } + else if (enabled == PIN_IRQ_DISABLE) + { + irqmap = get_pin_irq_map(PIN_STPIN(pin)); + if (irqmap == RT_NULL) + { + return -RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + + pin_irq_enable_mask &= ~irqmap->pinbit; + + 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))) + { + NVIC_DisableIRQ(irqmap->irqno); + } + } + else if ((irqmap->pinbit >= GPIO_PIN_10) && (irqmap->pinbit <= GPIO_PIN_15)) + { + if (!(pin_irq_enable_mask & (GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15))) + { + NVIC_DisableIRQ(irqmap->irqno); + } + } + else + { + NVIC_DisableIRQ(irqmap->irqno); + } + + rt_hw_interrupt_enable(level); + } + else + { + return -RT_ENOSYS; + } + + return RT_EOK; +} + +static const struct rt_pin_ops _n32_pin_ops = +{ + n32_pin_mode, + n32_pin_write, + n32_pin_read, + n32_pin_attach_irq, + n32_pin_dettach_irq, + n32_pin_irq_enable, + n32_pin_get, +}; + +rt_inline void pin_irq_hdr(int irqno) +{ + if (pin_irq_hdr_tab[irqno].hdr) + { + pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args); + } +} + +void N32_GPIO_EXTI_Callback(uint16_t line_num) +{ + if (pin_irq_hdr_tab[line_num].pin != -1 && EXTI_GetITStatus(line_num) != RESET) + { + /* Clear EXTI line pending bit */ + EXTI_ClrITPendBit(line_num); + + pin_irq_hdr(line_num); + } +} + +void EXTI0_IRQHandler(void) +{ + rt_interrupt_enter(); + N32_GPIO_EXTI_Callback(EXTI_LINE0); + rt_interrupt_leave(); +} + +void EXTI1_IRQHandler(void) +{ + rt_interrupt_enter(); + N32_GPIO_EXTI_Callback(EXTI_LINE1); + rt_interrupt_leave(); +} + +void EXTI2_IRQHandler(void) +{ + rt_interrupt_enter(); + N32_GPIO_EXTI_Callback(EXTI_LINE2); + rt_interrupt_leave(); +} + +void EXTI3_IRQHandler(void) +{ + rt_interrupt_enter(); + N32_GPIO_EXTI_Callback(EXTI_LINE3); + rt_interrupt_leave(); +} + +void EXTI4_IRQHandler(void) +{ + rt_interrupt_enter(); + N32_GPIO_EXTI_Callback(EXTI_LINE4); + rt_interrupt_leave(); +} + +void EXTI9_5_IRQHandler(void) +{ + rt_interrupt_enter(); + N32_GPIO_EXTI_Callback(EXTI_LINE5); + N32_GPIO_EXTI_Callback(EXTI_LINE6); + N32_GPIO_EXTI_Callback(EXTI_LINE7); + N32_GPIO_EXTI_Callback(EXTI_LINE8); + N32_GPIO_EXTI_Callback(EXTI_LINE9); + rt_interrupt_leave(); +} + +void EXTI15_10_IRQHandler(void) +{ + rt_interrupt_enter(); + N32_GPIO_EXTI_Callback(EXTI_LINE10); + N32_GPIO_EXTI_Callback(EXTI_LINE11); + N32_GPIO_EXTI_Callback(EXTI_LINE12); + N32_GPIO_EXTI_Callback(EXTI_LINE13); + N32_GPIO_EXTI_Callback(EXTI_LINE14); + N32_GPIO_EXTI_Callback(EXTI_LINE15); + rt_interrupt_leave(); +} + +int rt_hw_pin_init(void) +{ +#if defined(SOC_SERIES_N32H7xx) +#if defined(AFIO) + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M7_AFIO, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M4_AFIO, ENABLE); +#endif /* SOC_N32H78X */ +#endif + +#if defined(EXTI) + RCC_EnableAPB5PeriphClk2(RCC_APB5_PERIPHEN_EXTI, ENABLE); +#endif + +#if defined(GPIOA) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOA, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M4_GPIOA, ENABLE); +#endif /* SOC_N32H78X */ +#endif + +#if defined(GPIOB) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOB, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M4_GPIOB, ENABLE); +#endif /* SOC_N32H78X */ +#endif + +#if defined(GPIOC) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOC, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M4_GPIOC, ENABLE); +#endif /* SOC_N32H78X */ +#endif + +#if defined(GPIOD) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOD, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M4_GPIOD, ENABLE); +#endif /* SOC_N32H78X */ +#endif + +#if defined(GPIOE) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOE, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M4_GPIOE, ENABLE); +#endif /* SOC_N32H78X */ +#endif + +#if defined(GPIOF) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOF, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M4_GPIOF, ENABLE); +#endif /* SOC_N32H78X */ +#endif + +#if defined(GPIOG) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOG, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M4_GPIOG, ENABLE); +#endif /* SOC_N32H78X */ +#endif + +#if defined(GPIOH) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOH, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M4_GPIOH, ENABLE); +#endif /* SOC_N32H78X */ +#endif + +#if defined(GPIOI) + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M7_GPIOI, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M4_GPIOI, ENABLE); +#endif /* SOC_N32H78X */ +#endif + +#if defined(GPIOJ) + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M7_GPIOJ, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M4_GPIOJ, ENABLE); +#endif /* SOC_N32H78X */ +#endif + +#if defined(GPIOK) + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M7_GPIOK, ENABLE); +#if defined(SOC_N32H78X) + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M4_GPIOK, ENABLE); +#endif /* SOC_N32H78X */ +#endif +#endif /* defined(SOC_SERIES_N32H7xx) */ + + return rt_device_pin_register("pin", &_n32_pin_ops, RT_NULL); +} + +#endif /* BSP_USING_GPIO */ + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_gpio.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_gpio.h new file mode 100644 index 0000000000..2b9d4f9abf --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_gpio.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __DRV_GPIO_H__ +#define __DRV_GPIO_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define __N32_PORT(port) GPIO##port##_BASE + + +#define GET_PIN(PORTx,PIN) (rt_base_t)((16 * ( ((rt_base_t)__N32_PORT(PORTx) - (rt_base_t)GPIOA_BASE)/(0x0400UL) )) + PIN) + + +struct pin_irq_map +{ + rt_uint16_t pinbit; + rt_uint16_t exti_line; + IRQn_Type irqno; +}; + +int rt_hw_pin_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __DRV_GPIO_H__ */ + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_hard_i2c.c b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_hard_i2c.c new file mode 100644 index 0000000000..a4d7d71950 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_hard_i2c.c @@ -0,0 +1,1474 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#include +#include +#include +#include "drv_hard_i2c.h" +#include "drv_config.h" +#include + +#if defined(BSP_USING_HARD_I2C1) || defined(BSP_USING_HARD_I2C2) || defined(BSP_USING_HARD_I2C3) || defined(BSP_USING_HARD_I2C4) || defined(BSP_USING_HARD_I2C5) || \ + defined(BSP_USING_HARD_I2C6) || defined(BSP_USING_HARD_I2C7) || defined(BSP_USING_HARD_I2C8) || defined(BSP_USING_HARD_I2C9) || defined(BSP_USING_HARD_I2C10) + + +#define I2C_CTRL2_NBYTES_POS (16U) +#define MAX_NBYTE_SIZE (255U) + +#define I2C_NO_STARTSTOP (0x00000000U) +#define I2C_START_READ (I2C_CTRL2_START | I2C_CTRL2_RWN) +#define I2C_START_WRITE (I2C_CTRL2_START) + +#define I2C_RELOAD_MODE (CTRL2_REFILL_ENABLE) +#define I2C_AUTOEND_MODE (CTRL2_AUTO_STOP) +#define I2C_SOFTEND_MODE (0x00000000U) + +#define I2C_FIRST_FRAME ((uint32_t)I2C_SOFTEND_MODE) +#define I2C_FIRST_AND_NEXT_FRAME ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE)) +#define I2C_NEXT_FRAME ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE)) +#define I2C_FIRST_AND_LAST_FRAME ((uint32_t)I2C_AUTOEND_MODE) +#define I2C_LAST_FRAME ((uint32_t)I2C_AUTOEND_MODE) +#define I2C_LAST_FRAME_NO_STOP ((uint32_t)I2C_SOFTEND_MODE) + +/* Slave address | Transfer direction | START generation | STOP generation | Number of bytes | NBYTES reload mode | Automatic end mode */ +#define I2C_CTRL2_CLEAR (I2C_CTRL2_SADR | I2C_CTRL2_RWN | I2C_CTRL2_START | I2C_CTRL2_STOP | I2C_CTRL2_BYTECNT | I2C_CTRL2_REFILL | I2C_CTRL2_AUTOSTOP) + +//#define DRV_DEBUG +#define LOG_TAG "drv.i2c.hw" +#include + +static rt_bool_t first_valid_rx_isr = RT_FALSE; +static void i2c_master_ev_isr_handler_it(struct n32_i2c *drv_i2c); +static void i2c_master_ev_isr_handler_dma(struct n32_i2c *drv_i2c); + +enum +{ +#ifdef BSP_USING_HARD_I2C1 + I2C1_INDEX, +#endif /* BSP_USING_HARD_I2C1 */ +#ifdef BSP_USING_HARD_I2C2 + I2C2_INDEX, +#endif /* BSP_USING_HARD_I2C2 */ +#ifdef BSP_USING_HARD_I2C3 + I2C3_INDEX, +#endif /* BSP_USING_HARD_I2C3 */ +#ifdef BSP_USING_HARD_I2C4 + I2C4_INDEX, +#endif /* BSP_USING_HARD_I2C4 */ +#ifdef BSP_USING_HARD_I2C5 + I2C5_INDEX, +#endif /* BSP_USING_HARD_I2C5 */ +#ifdef BSP_USING_HARD_I2C6 + I2C6_INDEX, +#endif /* BSP_USING_HARD_I2C6 */ +#ifdef BSP_USING_HARD_I2C7 + I2C7_INDEX, +#endif /* BSP_USING_HARD_I2C7 */ +#ifdef BSP_USING_HARD_I2C8 + I2C8_INDEX, +#endif /* BSP_USING_HARD_I2C8 */ +#ifdef BSP_USING_HARD_I2C9 + I2C9_INDEX, +#endif /* BSP_USING_HARD_I2C9 */ +#ifdef BSP_USING_HARD_I2C10 + I2C10_INDEX, +#endif /* BSP_USING_HARD_I2C10 */ +}; + +static struct n32_i2c_config i2c_config[] = +{ +#ifdef BSP_USING_HARD_I2C1 + I2C1_BUS_CONFIG, +#endif /* BSP_USING_HARD_I2C1 */ +#ifdef BSP_USING_HARD_I2C2 + I2C2_BUS_CONFIG, +#endif /* BSP_USING_HARD_I2C2 */ +#ifdef BSP_USING_HARD_I2C3 + I2C3_BUS_CONFIG, +#endif /* BSP_USING_HARD_I2C3 */ +#ifdef BSP_USING_HARD_I2C4 + I2C4_BUS_CONFIG, +#endif /* BSP_USING_HARD_I2C4 */ +#ifdef BSP_USING_HARD_I2C5 + I2C5_BUS_CONFIG, +#endif /* BSP_USING_HARD_I2C5 */ +#ifdef BSP_USING_HARD_I2C6 + I2C6_BUS_CONFIG, +#endif /* BSP_USING_HARD_I2C6 */ +#ifdef BSP_USING_HARD_I2C7 + I2C7_BUS_CONFIG, +#endif /* BSP_USING_HARD_I2C7 */ +#ifdef BSP_USING_HARD_I2C8 + I2C8_BUS_CONFIG, +#endif /* BSP_USING_HARD_I2C8 */ +#ifdef BSP_USING_HARD_I2C9 + I2C9_BUS_CONFIG, +#endif /* BSP_USING_HARD_I2C9 */ +#ifdef BSP_USING_HARD_I2C10 + I2C10_BUS_CONFIG, +#endif /* BSP_USING_HARD_I2C10 */ +}; + +static struct n32_i2c i2c_objs[sizeof(i2c_config) / sizeof(i2c_config[0])] = {0}; + +static rt_ssize_t n32_iic_transfer_by_dma(struct n32_i2c_config *config, uint8_t *pData, uint16_t Size, rt_bool_t is_rx) +{ + struct dma_config *dma_config; + + RT_ASSERT(config != RT_NULL); + RT_ASSERT(pData != RT_NULL); + + if (is_rx) + { + dma_config = config->dma_rx; + } + else + { + dma_config = config->dma_tx; + } + +#if defined(SOC_SERIES_N32H7xx) + /* Check whether DMA Channel is disable */ + if (DMA_ChannelIsEnabled(dma_config->Instance, dma_config->dma_channel)) + { + /* Disable DMA Channel */ + DMA_ChannelCmd(dma_config->Instance, dma_config->dma_channel, DISABLE); + } + + if (is_rx) + { + /* Sets the destination address of the specified channel */ + DMA_SetChannelDestinationAddress(dma_config->Instance, dma_config->dma_channel, (uint32_t *)pData); + } + else + { + /* Sets the source address of the specified channel */ + DMA_SetChannelSourceAddress(dma_config->Instance, dma_config->dma_channel, (uint32_t *)pData); + } + + /* Sets the block transfer size of the specified channel */ + DMA_SetChannelBlockSize(dma_config->Instance, dma_config->dma_channel, Size); + + /* Clear a DMA channel event status */ + DMA_ClearChannelEventStatus(dma_config->Instance, dma_config->dma_channel, DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE); + + /* Enable transaction complete interrupt event */ + DMA_ChannelEventCmd(dma_config->Instance, dma_config->dma_channel, DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE, ENABLE); + + /* Configure DMAMUX */ + DMAMUX_SetRequestID(DMAMUX1_ID, dma_config->dmamux_channel, dma_config->dmamux_request); + + /* Enable the specified DMA channel */ + DMA_ChannelCmd(dma_config->Instance, dma_config->dma_channel, ENABLE); +#endif + + return Size; +} + + +static rt_err_t n32_i2c_dma_init(struct n32_i2c_config *config, rt_bool_t is_rx) +{ + struct dma_config *dma_config; + DMA_ChInitType DMA_ChInitStr; + + RT_ASSERT(config != RT_NULL); + +#if defined(SOC_SERIES_N32H7xx) + /* Enable DMAMUX clock */ + RCC_EnableAHB1PeriphClk1(RCC_AHB1_PERIPHEN_M7_DMAMUX1, ENABLE); + + /* DMA channel struct configuration */ + DMA_ChannelStructInit(&DMA_ChInitStr); + DMA_ChInitStr.SrcTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + DMA_ChInitStr.DstTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + DMA_ChInitStr.DstBurstLen = DMA_CH_BURST_LENGTH_1; + DMA_ChInitStr.SrcBurstLen = DMA_CH_BURST_LENGTH_1; + DMA_ChInitStr.ChannelPriority = DMA_CH_PRIORITY_7; + DMA_ChInitStr.TfrType = DMA_CH_TRANSFER_TYPE_SINGLE_BLOCK; + + /* Read by DMA */ + if (is_rx) + { + dma_config = config->dma_rx; + + /* DMA clock enable */ + RCC_EnableAHB1PeriphClk3(dma_config->dma_rcc, ENABLE); + + /* DMA channel struct configuration */ + DMA_ChInitStr.SrcAddr = (uint32_t)&config->Instance->RDR; + DMA_ChInitStr.DstAddr = (uint32_t)RT_NULL; + DMA_ChInitStr.DstAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_INCREMENT; + DMA_ChInitStr.SrcAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_NO_CHANGE; + DMA_ChInitStr.TfrTypeFlowCtrl = DMA_CH_TRANSFER_FLOW_P2M_DMA; + DMA_ChInitStr.SrcHandshaking = DMA_CH_SRC_HANDSHAKING_HARDWARE; + DMA_ChInitStr.SrcHsInterface = dma_config->HsInterface; + } + /* Write by DMA */ + else + { + dma_config = config->dma_tx; + + /* DMA clock enable */ + RCC_EnableAHB1PeriphClk3(dma_config->dma_rcc, ENABLE); + + /* DMA channel struct configuration */ + DMA_ChInitStr.SrcAddr = (uint32_t) RT_NULL; + DMA_ChInitStr.DstAddr = (uint32_t)&config->Instance->WDR; + DMA_ChInitStr.DstAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_NO_CHANGE; + DMA_ChInitStr.SrcAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_INCREMENT; + DMA_ChInitStr.TfrTypeFlowCtrl = DMA_CH_TRANSFER_FLOW_M2P_DMA; + DMA_ChInitStr.DstHandshaking = DMA_CH_DST_HANDSHAKING_HARDWARE; + DMA_ChInitStr.DstHsInterface = dma_config->HsInterface; + } + + /* DMA controller must be enabled before initializing the channel */ + DMA_ControllerCmd(dma_config->Instance, ENABLE); + + /* Initialize the specified DMA channel */ + if (DMA_ChannelInit(dma_config->Instance, &DMA_ChInitStr, dma_config->dma_channel) != 0) + { + return -RT_ERROR; + } +#endif + + /* enable dma irq */ + NVIC_SetPriority(dma_config->dma_irq, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)); + NVIC_EnableIRQ(dma_config->dma_irq); + + return RT_EOK; +} + +static rt_err_t n32_i2c_init(struct n32_i2c *i2c_drv) +{ + rt_err_t ret; + uint32_t BusTim_Reg; + I2C_InitType I2C_InitStructure; + RT_ASSERT(i2c_drv != RT_NULL); + + struct n32_i2c_config *cfg = i2c_drv->config; + + /* Enable I2C Clock */ + cfg->EnablePeriphClk(cfg->periph, ENABLE); + +#if defined(SOC_SERIES_N32H7xx) + /* Call I2C_Configuration() from an external file */ + I2C_Configuration(); + /* Disable IIC */ + I2C_Enable(cfg->Instance, DISABLE); + /* Get IIC BUSTIM Register value */ + BusTim_Reg = cfg->Instance->BUSTIM; + + if (BusTim_Reg == 0U) + { + /* IIC Kernal use default kernal clock */ + RCC_ConfigHse(RCC_HSE_ENABLE); + if (RCC_WaitHseStable() != SUCCESS) + { + return -RT_ERROR; + } + RCC_ConfigPll3(RCC_PLL_SRC_HSE, HSE_VALUE, 480000000, ENABLE); + RCC_ConfigPLL3CDivider(RCC_PLLC_DIV10); + /*Choose I2C1 ker clk source*/ + cfg->I2CKerClkSource(RCC_I2CKERCLK_SRC_PLL3C); + } +#endif + + /* Deinitializes the I2Cx peripheral registers to their default reset values */ + I2C_DeInit(cfg->Instance); + + I2C_InitStruct(&I2C_InitStructure); + I2C_InitStructure.Timing = ((BusTim_Reg != 0) ? BusTim_Reg : cfg->timing); + I2C_InitStructure.OwnAddress1 = 0x0; + I2C_InitStructure.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + I2C_InitStructure.DualAddressMode = I2C_DUALADDRESS_DISABLE; + I2C_InitStructure.OwnAddress2 = 0x0; + I2C_InitStructure.OwnAddress2Masks = I2C_ADDRESS2MASK_NONE; + I2C_InitStructure.GeneralCallMode = I2C_GENERALCALL_DISABLE; + I2C_InitStructure.NoStretchMode = I2C_NOSTRCH_DISABLE; + I2C_Init(cfg->Instance, &I2C_InitStructure); + + I2C_Enable(cfg->Instance, ENABLE); + +#if defined(SOC_SERIES_N32H7xx) + /* Configure Analogue filter */ + I2C_EnableAnalogFilter(cfg->Instance, ENABLE); + I2C_EnableSDAAnalogFilter(cfg->Instance, ENABLE); + I2C_EnableSCLAnalogFilter(cfg->Instance, ENABLE); + I2C_SetSCLAnalogFilterWidth(cfg->Instance, cfg->scl_af_width); + I2C_SetSDAAnalogFilterWidth(cfg->Instance, cfg->sda_af_width); + + /* Configure Digital filter */ + I2C_SetDigitalFilterWidth(cfg->Instance, cfg->df_width); +#endif /* defined(SOC_SERIES_N32H7xx) */ + + /* I2C2 DMA Init */ + if (i2c_drv->i2c_dma_flag & I2C_USING_RX_DMA_FLAG) + { + ret = n32_i2c_dma_init(cfg, RT_TRUE); + RT_ASSERT(ret == RT_EOK); + } + + if (i2c_drv->i2c_dma_flag & I2C_USING_TX_DMA_FLAG) + { + ret = n32_i2c_dma_init(cfg, RT_FALSE); + RT_ASSERT(ret == RT_EOK); + } + + /* Enable Event IRQ */ + NVIC_SetPriority(i2c_drv->config->evirq_type, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 0)); + NVIC_EnableIRQ(i2c_drv->config->evirq_type); + + /* Enable Error IRQ */ + NVIC_SetPriority(i2c_drv->config->erirq_type, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 1, 0)); + NVIC_EnableIRQ(i2c_drv->config->erirq_type); + + i2c_drv->transfer.state = I2C_READY; + + return RT_EOK; +} + +static rt_err_t n32_i2c_master_seq_receive_it(struct n32_i2c *i2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + uint32_t setmask; + uint32_t xfermode; + + if (i2c->transfer.state == I2C_READY) + { + first_valid_rx_isr = RT_FALSE; + /* Set transfer parameters */ + i2c->transfer.state = I2C_BUSY_RX; + i2c->transfer.pBuffPtr = pData; + i2c->transfer.XferCount = Size; + i2c->transfer.XferOptions = XferOptions; + i2c->i2c_isr_callback = i2c_master_ev_isr_handler_it; + + /* If i2c->transfer.XferCount > MAX_NBYTE_SIZE, use reload mode */ + if (Size > MAX_NBYTE_SIZE) + { + i2c->transfer.XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; // Use reload mode + } + else + { + i2c->transfer.XferSize = i2c->transfer.XferCount; + xfermode = i2c->transfer.XferOptions; + } + + /* Slave address | Transfer direction | START generation | STOP generation | Number of bytes | NBYTES reload mode | Automatic end mode */ + setmask = ((uint32_t)DevAddress & I2C_CTRL2_SADR) | (uint32_t)I2C_START_READ | (((uint32_t)i2c->transfer.XferSize << I2C_CTRL2_NBYTES_POS) & I2C_CTRL2_BYTECNT) | (uint32_t)xfermode; + + /* Set IIC CTRL2 Register */ + MODIFY_REG(i2c->config->Instance->CTRL2, I2C_CTRL2_CLEAR, (uint32_t)setmask); + + I2C_ConfigInt(i2c->config->Instance, I2C_INT_ERR | I2C_INT_TFC | I2C_INT_STOP | I2C_INT_NACK | I2C_INT_RDR, ENABLE); + + return RT_EOK; + } + else + { + return -RT_EBUSY; + } +} + +static rt_err_t n32_i2c_master_seq_send_it(struct n32_i2c *i2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + uint32_t setmask; + uint32_t xfermode; + + if (i2c->transfer.state == I2C_READY) + { + /* Set transfer parameters */ + i2c->transfer.state = I2C_BUSY_TX; + i2c->transfer.pBuffPtr = pData; + i2c->transfer.XferCount = Size; + i2c->transfer.XferOptions = XferOptions; + i2c->i2c_isr_callback = i2c_master_ev_isr_handler_it; + + /* If i2c->transfer.XferCount > MAX_NBYTE_SIZE, use reload mode */ + if (Size > MAX_NBYTE_SIZE) + { + i2c->transfer.XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; // Use reload mode + } + else + { + i2c->transfer.XferSize = i2c->transfer.XferCount; + xfermode = i2c->transfer.XferOptions; + } + + I2C_ConfigInt(i2c->config->Instance, I2C_INT_ERR | I2C_INT_TFC | I2C_INT_STOP | I2C_INT_NACK | I2C_INT_WDR, ENABLE); + + /* Slave address | Transfer direction | START generation | STOP generation | Number of bytes | NBYTES reload mode | Automatic end mode */ + setmask = ((uint32_t)DevAddress & I2C_CTRL2_SADR) | (uint32_t)I2C_START_WRITE | (((uint32_t)i2c->transfer.XferSize << I2C_CTRL2_NBYTES_POS) & I2C_CTRL2_BYTECNT) | (uint32_t)xfermode; + + /* Wait for bus idele */ + while ((i2c->config->Instance->STSINT & I2C_STSINT_BUSY) == I2C_STSINT_BUSY) + { + } + + /* Set IIC CTRL2 Register */ + MODIFY_REG(i2c->config->Instance->CTRL2, I2C_CTRL2_CLEAR, (uint32_t)setmask); + + return RT_EOK; + } + else + { + return -RT_EBUSY; + } +} + +static rt_err_t n32_i2c_master_seq_receive_dma(struct n32_i2c *i2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + uint32_t setmask; + uint32_t xfermode; + + if (i2c->transfer.state == I2C_READY) + { + first_valid_rx_isr = RT_FALSE; + /* Set transfer parameters */ + i2c->transfer.state = I2C_BUSY_RX; + i2c->transfer.pBuffPtr = pData; + i2c->transfer.XferCount = Size; + i2c->transfer.XferOptions = XferOptions; + i2c->i2c_isr_callback = i2c_master_ev_isr_handler_dma; + + /* If i2c->transfer.XferCount > MAX_NBYTE_SIZE, use reload mode */ + if (Size > MAX_NBYTE_SIZE) + { + i2c->transfer.XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; // Use reload mode + } + else + { + i2c->transfer.XferSize = i2c->transfer.XferCount; + xfermode = i2c->transfer.XferOptions; + } + + if (i2c->transfer.XferSize > 0U) + { + n32_iic_transfer_by_dma(i2c->config, i2c->transfer.pBuffPtr, i2c->transfer.XferSize, RT_TRUE); + + /* Slave address | Transfer direction | START generation | STOP generation | Number of bytes | NBYTES reload mode | Automatic end mode */ + setmask = ((uint32_t)DevAddress & I2C_CTRL2_SADR) | (uint32_t)I2C_START_READ | (((uint32_t)i2c->transfer.XferSize << I2C_CTRL2_NBYTES_POS) & I2C_CTRL2_BYTECNT) | (uint32_t)xfermode; + + /* Set IIC CTRL2 Register */ + MODIFY_REG(i2c->config->Instance->CTRL2, I2C_CTRL2_CLEAR, (uint32_t)setmask); + + /* Update XferCount value */ + i2c->transfer.XferCount -= i2c->transfer.XferSize; + + /* Enable ERR and NACK interrupts */ + i2c->config->Instance->CTRL1 |= (I2C_CTRL1_ERRIE | I2C_CTRL1_NAKIE); + + /* Enable DMA Request */ + i2c->config->Instance->CTRL1 |= I2C_CTRL1_DMARDEN; + } + else + { + i2c->i2c_isr_callback = i2c_master_ev_isr_handler_it; + + /* Slave address | Transfer direction | START generation | STOP generation | Number of bytes | NBYTES reload mode | Automatic end mode */ + setmask = ((uint32_t)DevAddress & I2C_CTRL2_SADR) | (uint32_t)I2C_START_READ | (((uint32_t)i2c->transfer.XferSize << I2C_CTRL2_NBYTES_POS) & I2C_CTRL2_BYTECNT) | (uint32_t)I2C_AUTOEND_MODE; + + /* Set IIC CTRL2 Register */ + MODIFY_REG(i2c->config->Instance->CTRL2, I2C_CTRL2_CLEAR, (uint32_t)setmask); + + i2c->config->Instance->CTRL1 |= (I2C_CTRL1_ERRIE | I2C_CTRL1_TFCIE | I2C_CTRL1_STOPIE | I2C_CTRL1_NAKIE | I2C_CTRL1_WDRIE); + } + + return RT_EOK; + } + else + { + return -RT_EBUSY; + } +} + +static rt_err_t n32_i2c_master_seq_send_dma(struct n32_i2c *i2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions) +{ + uint32_t setmask; + uint32_t xfermode; + + if (i2c->transfer.state == I2C_READY) + { + /* Set transfer parameters */ + i2c->transfer.state = I2C_BUSY_TX; + i2c->transfer.pBuffPtr = pData; + i2c->transfer.XferCount = Size; + i2c->transfer.XferOptions = XferOptions; + i2c->i2c_isr_callback = i2c_master_ev_isr_handler_dma; + + /* If i2c->transfer.XferCount > MAX_NBYTE_SIZE, use reload mode */ + if (Size > MAX_NBYTE_SIZE) + { + i2c->transfer.XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; // Use reload mode + } + else + { + i2c->transfer.XferSize = i2c->transfer.XferCount; + xfermode = i2c->transfer.XferOptions; + } + + if (i2c->transfer.XferSize > 0U) + { + n32_iic_transfer_by_dma(i2c->config, i2c->transfer.pBuffPtr, i2c->transfer.XferSize, RT_FALSE); + + /* Slave address | Transfer direction | START generation | STOP generation | Number of bytes | NBYTES reload mode | Automatic end mode */ + setmask = ((uint32_t)DevAddress & I2C_CTRL2_SADR) | (uint32_t)I2C_START_WRITE | (((uint32_t)i2c->transfer.XferSize << I2C_CTRL2_NBYTES_POS) & I2C_CTRL2_BYTECNT) | (uint32_t)xfermode; + + /* Set IIC CTRL2 Register */ + MODIFY_REG(i2c->config->Instance->CTRL2, I2C_CTRL2_CLEAR, (uint32_t)setmask); + + /* Update XferCount value */ + i2c->transfer.XferCount -= i2c->transfer.XferSize; + + /* Enable ERR and NACK interrupts */ + i2c->config->Instance->CTRL1 |= (I2C_CTRL1_ERRIE | I2C_CTRL1_NAKIE); + + /* Enable DMA Request */ + i2c->config->Instance->CTRL1 |= I2C_CTRL1_DMAWREN; + } + else + { + i2c->i2c_isr_callback = i2c_master_ev_isr_handler_it; + + /* Slave address | Transfer direction | START generation | STOP generation | Number of bytes | NBYTES reload mode | Automatic end mode */ + setmask = ((uint32_t)DevAddress & I2C_CTRL2_SADR) | (uint32_t)I2C_START_WRITE | (((uint32_t)i2c->transfer.XferSize << I2C_CTRL2_NBYTES_POS) & I2C_CTRL2_BYTECNT) | (uint32_t)I2C_AUTOEND_MODE; + + /* Set IIC CTRL2 Register */ + MODIFY_REG(i2c->config->Instance->CTRL2, I2C_CTRL2_CLEAR, (uint32_t)setmask); + + i2c->config->Instance->CTRL1 |= (I2C_CTRL1_ERRIE | I2C_CTRL1_TFCIE | I2C_CTRL1_STOPIE | I2C_CTRL1_NAKIE | I2C_CTRL1_WDRIE); + } + + return RT_EOK; + } + else + { + return -RT_EBUSY; + } +} + +static rt_err_t n32_i2c_configure(struct rt_i2c_bus_device *bus) +{ + RT_ASSERT(RT_NULL != bus); + struct n32_i2c *i2c_drv = rt_container_of(bus, struct n32_i2c, i2c_bus); + + return n32_i2c_init(i2c_drv); +} + +static rt_ssize_t n32_i2c_master_xfer(struct rt_i2c_bus_device *bus, + struct rt_i2c_msg msgs[], + rt_uint32_t num) +{ +#define DMA_TRANS_MIN_LEN 2 /* only buffer length >= DMA_TRANS_MIN_LEN will use DMA mode */ +#define TRANS_TIMEOUT_PERSEC 8 /* per ms will trans nums bytes */ + + rt_int32_t i, ret; + struct rt_i2c_msg *msg = msgs; + struct rt_i2c_msg *next_msg = 0; + struct n32_i2c *i2c_obj; + uint32_t mode = 0; + uint8_t next_flag = 0; + struct rt_completion *completion; + rt_uint32_t timeout; + if (num == 0) + { + return 0; + } + RT_ASSERT((msgs != RT_NULL) && (bus != RT_NULL)); + + i2c_obj = rt_container_of(bus, struct n32_i2c, i2c_bus); + completion = &i2c_obj->completion; + + LOG_D("xfer start %d mags", num); + for (i = 0; i < (num - 1); i++) + { + mode = 0; + msg = &msgs[i]; + LOG_D("xfer msgs[%d] addr=0x%2x buf=0x%x len= 0x%x flags= 0x%x", i, msg->addr, msg->buf, msg->len, msg->flags); + next_msg = &msgs[i + 1]; + next_flag = next_msg->flags; + + timeout = msg->len / TRANS_TIMEOUT_PERSEC + 2; + if (next_flag & RT_I2C_NO_START) + { + if ((next_flag & RT_I2C_RD) == (msg->flags & RT_I2C_RD)) + { + /* The same mode, can use no start */ + mode = I2C_FIRST_AND_NEXT_FRAME; + } + else + { + /* Not allowed to use no start, sending address is required when changing direction, user setting error */ + LOG_W("user set flags error msg[%d] flags RT_I2C_NO_START has canceled", i + 1); + mode = I2C_LAST_FRAME_NO_STOP; + } + } + else + { + mode = I2C_LAST_FRAME_NO_STOP; + } + + if (msg->flags & RT_I2C_RD) + { + LOG_D("xfer rec msgs[%d] i2c mode = %s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP" + : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME" + : "nuknown mode"); + if ((i2c_obj->i2c_dma_flag & I2C_USING_RX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN)) + { + ret = n32_i2c_master_seq_receive_dma(i2c_obj, (msg->addr << 1), msg->buf, msg->len, mode); + } + else + { + ret = n32_i2c_master_seq_receive_it(i2c_obj, (msg->addr << 1), msg->buf, msg->len, mode); + } + if (ret != RT_EOK) + { + LOG_E("[%s:%d]I2C Read error(%d)!\n", __func__, __LINE__, ret); + goto out; + } + if (rt_completion_wait(completion, timeout) != RT_EOK) + { + LOG_D("receive time out"); + goto out; + + } + } + else + { + LOG_D("xfer trans msgs[%d] hal mode = %s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP" + : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME" + : "nuknown mode"); + if ((i2c_obj->i2c_dma_flag & I2C_USING_TX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN)) + { + ret = n32_i2c_master_seq_send_dma(i2c_obj, (msg->addr << 1), msg->buf, msg->len, mode); + } + else + { + ret = n32_i2c_master_seq_send_it(i2c_obj, (msg->addr << 1), msg->buf, msg->len, mode); + } + if (ret != RT_EOK) + { + LOG_D("[%s:%d]I2C Write error(%d)!\n", __func__, __LINE__, ret); + goto out; + } + if (rt_completion_wait(completion, timeout) != RT_EOK) + { + LOG_D("transmit time out"); + goto out; + } + } + LOG_D("xfer next msgs[%d] addr=0x%2x buf= 0x%x len= 0x%x flags = 0x%x\r\n", i + 1, next_msg->addr, next_msg->buf, next_msg->len, next_msg->flags); + } + + /* last msg */ + msg = &msgs[i]; + timeout = msg->len / TRANS_TIMEOUT_PERSEC + 2; + + if (msg->flags & RT_I2C_NO_STOP) + mode = I2C_LAST_FRAME_NO_STOP; + else + mode = I2C_LAST_FRAME; + + LOG_D("xfer last msgs[%d] addr=0x%2x buf= 0x%x len= 0x%x flags = 0x%x", i, msg->addr, msg->buf, msg->len, msg->flags); + if (msg->flags & RT_I2C_RD) + { + LOG_D("xfer rec msgs[%d] hal mode=%s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP" + : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME" + : "nuknown mode"); + if ((i2c_obj->i2c_dma_flag & I2C_USING_RX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN)) + { + ret = n32_i2c_master_seq_receive_dma(i2c_obj, (msg->addr << 1), msg->buf, msg->len, mode); + } + else + { + uint32_t itflags = READ_REG(i2c_obj->config->Instance->STSINT); + ret = n32_i2c_master_seq_receive_it(i2c_obj, (msg->addr << 1), msg->buf, msg->len, mode); + } + if (ret != RT_EOK) + { + LOG_D("[%s:%d]I2C Read error(%d)!\n", __func__, __LINE__, ret); + goto out; + } + if (rt_completion_wait(completion, timeout) != RT_EOK) + { + LOG_D("receive time out"); + goto out; + } + } + else + { + LOG_D("xfer trans msgs[%d] hal mode = %s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME" + : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP" + : "nuknown mode"); + if ((i2c_obj->i2c_dma_flag & I2C_USING_TX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN)) + { + ret = n32_i2c_master_seq_send_dma(i2c_obj, (msg->addr << 1), msg->buf, msg->len, mode); + } + else + { + ret = n32_i2c_master_seq_send_it(i2c_obj, (msg->addr << 1), msg->buf, msg->len, mode); + } + if (ret != RT_EOK) + { + LOG_D("[%s:%d]I2C Write error(%d)!\n", __func__, __LINE__, ret); + goto out; + } + if (rt_completion_wait(completion, timeout) != RT_EOK) + { + LOG_D("transmit time out"); + goto out; + + } + } + LOG_D("xfer end %d mags\r\n", num); + return num; + +out: + return (i - 1); +} + + +static const struct rt_i2c_bus_device_ops n32_i2c_ops = +{ + .master_xfer = n32_i2c_master_xfer, + RT_NULL, + RT_NULL +}; + + +static void n32_get_dma_info(void) +{ +#ifdef BSP_I2C1_RX_USING_DMA + i2c_objs[I2C1_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG; + static struct dma_config I2C1_dma_rx = I2C1_RX_DMA_CONFIG; + i2c_config[I2C1_INDEX].dma_rx = &I2C1_dma_rx; +#endif /* BSP_I2C1_RX_USING_DMA */ +#ifdef BSP_I2C1_TX_USING_DMA + i2c_objs[I2C1_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG; + static struct dma_config I2C1_dma_tx = I2C1_TX_DMA_CONFIG; + i2c_config[I2C1_INDEX].dma_tx = &I2C1_dma_tx; +#endif /* BSP_I2C1_TX_USING_DMA */ + +#ifdef BSP_I2C2_RX_USING_DMA + i2c_objs[I2C2_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG; + static struct dma_config I2C2_dma_rx = I2C2_RX_DMA_CONFIG; + i2c_config[I2C2_INDEX].dma_rx = &I2C2_dma_rx; +#endif /* BSP_I2C2_RX_USING_DMA */ +#ifdef BSP_I2C2_TX_USING_DMA + i2c_objs[I2C2_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG; + static struct dma_config I2C2_dma_tx = I2C2_TX_DMA_CONFIG; + i2c_config[I2C2_INDEX].dma_tx = &I2C2_dma_tx; +#endif /* BSP_I2C2_TX_USING_DMA */ +#ifdef BSP_I2C3_RX_USING_DMA + i2c_objs[I2C3_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG; + static struct dma_config I2C3_dma_rx = I2C3_RX_DMA_CONFIG; + i2c_config[I2C3_INDEX].dma_rx = &I2C3_dma_rx; +#endif /* BSP_I2C3_RX_USING_DMA */ +#ifdef BSP_I2C3_TX_USING_DMA + i2c_objs[I2C3_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG; + static struct dma_config I2C3_dma_tx = I2C3_TX_DMA_CONFIG; + i2c_config[I2C3_INDEX].dma_tx = &I2C3_dma_tx; +#endif /* BSP_I2C3_TX_USING_DMA */ +#ifdef BSP_I2C4_RX_USING_DMA + i2c_objs[I2C4_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG; + static struct dma_config I2C4_dma_rx = I2C4_RX_DMA_CONFIG; + i2c_config[I2C4_INDEX].dma_rx = &I2C4_dma_rx; +#endif /* BSP_I2C4_RX_USING_DMA */ +#ifdef BSP_I2C4_TX_USING_DMA + i2c_objs[I2C4_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG; + static struct dma_config I2C4_dma_tx = I2C4_TX_DMA_CONFIG; + i2c_config[I2C4_INDEX].dma_tx = &I2C4_dma_tx; +#endif /* BSP_I2C4_TX_USING_DMA */ +#ifdef BSP_I2C5_RX_USING_DMA + i2c_objs[I2C5_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG; + static struct dma_config I2C5_dma_rx = I2C5_RX_DMA_CONFIG; + i2c_config[I2C5_INDEX].dma_rx = &I2C5_dma_rx; +#endif /* BSP_I2C5_RX_USING_DMA */ +#ifdef BSP_I2C5_TX_USING_DMA + i2c_objs[I2C5_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG; + static struct dma_config I2C5_dma_tx = I2C5_TX_DMA_CONFIG; + i2c_config[I2C5_INDEX].dma_tx = &I2C5_dma_tx; +#endif /* BSP_I2C5_TX_USING_DMA */ +#ifdef BSP_I2C6_RX_USING_DMA + i2c_objs[I2C6_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG; + static struct dma_config I2C6_dma_rx = I2C6_RX_DMA_CONFIG; + i2c_config[I2C6_INDEX].dma_rx = &I2C6_dma_rx; +#endif /* BSP_I2C6_RX_USING_DMA */ +#ifdef BSP_I2C6_TX_USING_DMA + i2c_objs[I2C6_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG; + static struct dma_config I2C6_dma_tx = I2C6_TX_DMA_CONFIG; + i2c_config[I2C6_INDEX].dma_tx = &I2C6_dma_tx; +#endif /* BSP_I2C6_TX_USING_DMA */ +#ifdef BSP_I2C7_RX_USING_DMA + i2c_objs[I2C7_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG; + static struct dma_config I2C7_dma_rx = I2C7_RX_DMA_CONFIG; + i2c_config[I2C7_INDEX].dma_rx = &I2C7_dma_rx; +#endif /* BSP_I2C7_RX_USING_DMA */ +#ifdef BSP_I2C7_TX_USING_DMA + i2c_objs[I2C7_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG; + static struct dma_config I2C7_dma_tx = I2C7_TX_DMA_CONFIG; + i2c_config[I2C7_INDEX].dma_tx = &I2C7_dma_tx; +#endif /* BSP_I2C7_TX_USING_DMA */ +#ifdef BSP_I2C8_RX_USING_DMA + i2c_objs[I2C8_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG; + static struct dma_config I2C8_dma_rx = I2C8_RX_DMA_CONFIG; + i2c_config[I2C8_INDEX].dma_rx = &I2C8_dma_rx; +#endif /* BSP_I2C8_RX_USING_DMA */ +#ifdef BSP_I2C8_TX_USING_DMA + i2c_objs[I2C8_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG; + static struct dma_config I2C8_dma_tx = I2C8_TX_DMA_CONFIG; + i2c_config[I2C8_INDEX].dma_tx = &I2C8_dma_tx; +#endif /* BSP_I2C8_TX_USING_DMA */ +#ifdef BSP_I2C9_RX_USING_DMA + i2c_objs[I2C9_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG; + static struct dma_config I2C9_dma_rx = I2C9_RX_DMA_CONFIG; + i2c_config[I2C9_INDEX].dma_rx = &I2C9_dma_rx; +#endif /* BSP_I2C9_RX_USING_DMA */ +#ifdef BSP_I2C9_TX_USING_DMA + i2c_objs[I2C9_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG; + static struct dma_config I2C9_dma_tx = I2C9_TX_DMA_CONFIG; + i2c_config[I2C9_INDEX].dma_tx = &I2C9_dma_tx; +#endif /* BSP_I2C9_TX_USING_DMA */ +#ifdef BSP_I2C10_RX_USING_DMA + i2c_objs[I2C10_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG; + static struct dma_config I2C10_dma_rx = I2C10_RX_DMA_CONFIG; + i2c_config[I2C10_INDEX].dma_rx = &I2C10_dma_rx; +#endif /* BSP_I2C10_RX_USING_DMA */ +#ifdef BSP_I2C10_TX_USING_DMA + i2c_objs[I2C10_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG; + static struct dma_config I2C10_dma_tx = I2C10_TX_DMA_CONFIG; + i2c_config[I2C10_INDEX].dma_tx = &I2C10_dma_tx; +#endif /* BSP_I2C10_TX_USING_DMA */ +} + + +static void i2c_flush_wdr(I2C_Module *Instance) +{ + /* If a pending WRAVL flag is set, Write a dummy data in WDR to clear it */ + if ((((Instance->STSINT) & I2C_STSINT_WRAVL) == I2C_STSINT_WRAVL) ? SET : RESET) + { + Instance->WDR = 0x00U; + } + + /* Flush WDR register if not empty */ + if ((((Instance->STSINT) & I2C_STSINT_WRE) == I2C_STSINT_WRE) ? SET : RESET) + { + Instance->STSINT |= I2C_STSINT_WRE; + } +} + +static void i2c_it_error_handler(struct n32_i2c *drv_i2c, uint32_t itflags) +{ + uint32_t setmask; + I2C_StateTypeDef tmpstate = drv_i2c->transfer.state; + + drv_i2c->transfer.pBuffPtr = RT_NULL; + drv_i2c->transfer.XferCount = 0; + + setmask = I2C_CTRL1_TFCIE | I2C_CTRL1_WDRIE | I2C_CTRL1_RDRIE | I2C_CTRL1_STOPIE | I2C_CTRL1_NAKIE | I2C_CTRL1_ERRIE; + + /* Disable all interrupts */ + drv_i2c->config->Instance->CTRL1 &= (~(setmask)); + + drv_i2c->transfer.state = I2C_READY; + drv_i2c->i2c_isr_callback = RT_NULL; + + /* Abort DMA TX transfer */ + if ((tmpstate == I2C_BUSY_TX) && (drv_i2c->i2c_dma_flag & I2C_USING_TX_DMA_FLAG) == I2C_USING_TX_DMA_FLAG) + { + if ((drv_i2c->config->Instance->CTRL1 & I2C_CTRL1_DMAWREN) == I2C_CTRL1_DMAWREN) + { + drv_i2c->config->Instance->CTRL1 &= ~I2C_CTRL1_DMAWREN; + } + + DMA_ChannelCmd(drv_i2c->config->dma_tx->Instance, drv_i2c->config->dma_tx->dma_channel, DISABLE); + + DMA_ChannelEventCmd(drv_i2c->config->dma_tx->Instance, drv_i2c->config->dma_tx->dma_channel, DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE, DISABLE); + + DMA_ClearChannelEventStatus(drv_i2c->config->dma_tx->Instance, drv_i2c->config->dma_tx->dma_channel, DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE); + } + + /* Abort DMA RX transfer */ + if ((tmpstate == I2C_BUSY_RX) && (drv_i2c->i2c_dma_flag & I2C_USING_RX_DMA_FLAG) == I2C_USING_RX_DMA_FLAG) + { + if ((drv_i2c->config->Instance->CTRL1 & I2C_CTRL1_DMARDEN) == I2C_CTRL1_DMARDEN) + { + drv_i2c->config->Instance->CTRL1 &= ~I2C_CTRL1_DMARDEN; + } + + DMA_ChannelCmd(drv_i2c->config->dma_rx->Instance, drv_i2c->config->dma_rx->dma_channel, DISABLE); + + DMA_ChannelEventCmd(drv_i2c->config->dma_rx->Instance, drv_i2c->config->dma_rx->dma_channel, DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE, DISABLE); + + DMA_ClearChannelEventStatus(drv_i2c->config->dma_rx->Instance, drv_i2c->config->dma_rx->dma_channel, DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE); + } + + if (((((itflags & I2C_STSINT_NAKF) == I2C_STSINT_NAKF) ? SET : RESET) != RESET) || + ((((itflags & I2C_STSINT_BSER) == I2C_STSINT_BSER) ? SET : RESET) != RESET)) + { + /* Send stop signal to prevent bus lock-up */ + LOG_D("I2C NACK Error or BUS Error now stoped"); + drv_i2c->config->Instance->CTRL1 |= I2C_CTRL1_STOPIE; + } +} + +static void i2c_it_master_complete(struct n32_i2c *drv_i2c, uint32_t itflags) +{ + uint32_t setmask; + __IO uint32_t tmpreg; + + /* Clear STOP Flag */ + drv_i2c->config->Instance->INTCLR = I2C_INTCLR_STOPCLR; + + /* I2C Write */ + if (drv_i2c->transfer.state == I2C_BUSY_TX) + { + setmask = I2C_CTRL1_TFCIE | I2C_CTRL1_WDRIE | I2C_CTRL1_STOPIE | I2C_CTRL1_NAKIE | I2C_CTRL1_ERRIE; + + /* Disable interrupt */ + drv_i2c->config->Instance->CTRL1 &= (~(setmask)); + } + /* I2C Read */ + if (drv_i2c->transfer.state == I2C_BUSY_RX) + { + setmask = I2C_CTRL1_TFCIE | I2C_CTRL1_RDRIE | I2C_CTRL1_STOPIE | I2C_CTRL1_NAKIE | I2C_CTRL1_ERRIE; + + /* Disable interrupt */ + drv_i2c->config->Instance->CTRL1 &= (~(setmask)); + } + + /* Clear CTRL2 */ + drv_i2c->config->Instance->CTRL2 &= (~(I2C_CTRL2_CLEAR | I2C_CTRL2_HDR10)); + + drv_i2c->i2c_isr_callback = RT_NULL; + + if (((((itflags & I2C_STSINT_NAKF) == I2C_STSINT_NAKF) ? SET : RESET) != RESET)) + { + /* Clear NACK Flag */ + drv_i2c->config->Instance->INTCLR = I2C_INTCLR_NAKCLR; + } + + /* Fetch Last receive data */ + if (((((itflags & I2C_STSINT_RDAVL) == I2C_STSINT_RDAVL) ? SET : RESET) != RESET)) + { + /* Read data from RXDR */ + tmpreg = (uint8_t)drv_i2c->config->Instance->RDR; + RT_UNUSED(tmpreg); + } + + i2c_flush_wdr(drv_i2c->config->Instance); + + drv_i2c->transfer.state = I2C_READY; + rt_completion_done(&drv_i2c->completion); +} + +static void i2c_it_completion_done(struct n32_i2c *drv_i2c) +{ + uint32_t setmask; + + /* I2C Write */ + if (drv_i2c->transfer.state == I2C_BUSY_TX) + { + drv_i2c->transfer.state = I2C_READY; + drv_i2c->i2c_isr_callback = RT_NULL; + + setmask = I2C_CTRL1_TFCIE | I2C_CTRL1_WDRIE | I2C_CTRL1_STOPIE | I2C_CTRL1_NAKIE | I2C_CTRL1_ERRIE; + + /* Disable interrupt */ + drv_i2c->config->Instance->CTRL1 &= (~(setmask)); + + rt_completion_done(&drv_i2c->completion); + } + /* I2C Read */ + if (drv_i2c->transfer.state == I2C_BUSY_RX) + { + drv_i2c->transfer.state = I2C_READY; + drv_i2c->i2c_isr_callback = RT_NULL; + + setmask = I2C_CTRL1_TFCIE | I2C_CTRL1_RDRIE | I2C_CTRL1_STOPIE | I2C_CTRL1_NAKIE | I2C_CTRL1_ERRIE; + + /* Disable interrupt */ + drv_i2c->config->Instance->CTRL1 &= (~(setmask)); + + rt_completion_done(&drv_i2c->completion); + } +} + +static void i2c_master_ev_isr_handler_it(struct n32_i2c *drv_i2c) +{ + uint16_t devaddress; + uint32_t setmask; + /* Get current IT Flags and IT sources value */ + volatile uint32_t itflags = READ_REG(drv_i2c->config->Instance->STSINT); + volatile uint32_t itsources = READ_REG(drv_i2c->config->Instance->CTRL1); + + /* It takes more than 100 microseconds to clear the TC flag after starting, so wait for the TC flag to clear */ + if (drv_i2c->transfer.state == I2C_BUSY_RX && first_valid_rx_isr != RT_TRUE) + { + if ((itflags & I2C_STSINT_TFC) == I2C_STSINT_TFC) + { + return; + } + else + { + first_valid_rx_isr = RT_TRUE; + } + } + + if (((((itflags & I2C_STSINT_NAKF) == I2C_STSINT_NAKF) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_NAKIE) == I2C_CTRL1_NAKIE) ? SET : RESET) != RESET)) + { + /* Clear Not Acknowledge received flag */ + drv_i2c->config->Instance->INTCLR = I2C_INTCLR_NAKCLR; + + /* Flush WDR register */ + i2c_flush_wdr(drv_i2c->config->Instance); + } + else if (((((itflags & I2C_STSINT_RDAVL) == I2C_STSINT_RDAVL) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_RDRIE) == I2C_CTRL1_RDRIE) ? SET : RESET) != RESET)) + { + /* Remove RDAVL flag as read done */ + itflags &= ~I2C_STSINT_RDAVL; + + /* Read data from RDR */ + *drv_i2c->transfer.pBuffPtr = (uint8_t)drv_i2c->config->Instance->RDR; + + /* Increment Buffer pointer */ + drv_i2c->transfer.pBuffPtr++; + + drv_i2c->transfer.XferSize--; + drv_i2c->transfer.XferCount--; + } + else if (((((itflags & I2C_STSINT_WRAVL) == I2C_STSINT_WRAVL) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_WDRIE) == I2C_CTRL1_WDRIE) ? SET : RESET) != RESET)) + { + /* Write data to WDR */ + drv_i2c->config->Instance->WDR = *drv_i2c->transfer.pBuffPtr; + + /* Increment Buffer pointer */ + drv_i2c->transfer.pBuffPtr++; + + drv_i2c->transfer.XferSize--; + drv_i2c->transfer.XferCount--; + } + else if (((((itflags & I2C_STSINT_TFCR) == I2C_STSINT_TFCR) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_TFCIE) == I2C_CTRL1_TFCIE) ? SET : RESET) != RESET)) + { + if ((drv_i2c->transfer.XferCount != 0U) && (drv_i2c->transfer.XferSize == 0U)) + { + devaddress = (uint16_t)(drv_i2c->config->Instance->CTRL2 & I2C_CTRL2_SADR); + + if (drv_i2c->transfer.XferCount > MAX_NBYTE_SIZE) + { + drv_i2c->transfer.XferSize = MAX_NBYTE_SIZE; + + /* Slave address | Transfer direction | START generation | STOP generation | Number of bytes | NBYTES reload mode | Automatic end mode */ + setmask = ((uint32_t)devaddress & I2C_CTRL2_SADR) | (uint32_t)I2C_NO_STARTSTOP | (((uint32_t)drv_i2c->transfer.XferSize << I2C_CTRL2_NBYTES_POS) & I2C_CTRL2_BYTECNT) | (uint32_t)I2C_RELOAD_MODE; + + /* Set IIC CTRL2 Register */ + MODIFY_REG(drv_i2c->config->Instance->CTRL2, I2C_CTRL2_CLEAR, (uint32_t)setmask); + } + else + { + drv_i2c->transfer.XferSize = drv_i2c->transfer.XferCount; + + /* Slave address | Transfer direction | START generation | STOP generation | Number of bytes | NBYTES reload mode | Automatic end mode */ + setmask = ((uint32_t)devaddress & I2C_CTRL2_SADR) | (uint32_t)I2C_NO_STARTSTOP | (((uint32_t)drv_i2c->transfer.XferSize << I2C_CTRL2_NBYTES_POS) & I2C_CTRL2_BYTECNT) | (uint32_t)drv_i2c->transfer.XferOptions; + + /* Set IIC CTRL2 Register */ + MODIFY_REG(drv_i2c->config->Instance->CTRL2, I2C_CTRL2_CLEAR, (uint32_t)setmask); + } + } + else + { + if (((drv_i2c->config->Instance->CTRL2 & I2C_AUTOEND_MODE) != I2C_AUTOEND_MODE)) + { + i2c_it_completion_done(drv_i2c); + } + else + { + i2c_it_error_handler(drv_i2c, itflags); + } + } + } + else if (((((itflags & I2C_STSINT_TFC) == I2C_STSINT_TFC) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_TFCIE) == I2C_CTRL1_TFCIE) ? SET : RESET) != RESET)) + { + if (drv_i2c->transfer.XferCount == 0U) + { + if (((drv_i2c->config->Instance->CTRL2 & I2C_AUTOEND_MODE) != I2C_AUTOEND_MODE)) + { + i2c_it_completion_done(drv_i2c); + } + } + else + { + i2c_it_error_handler(drv_i2c, itflags); + } + } + else + { + /* Nothing to do */ + } + + if (((((itflags & I2C_STSINT_STOPF) == I2C_STSINT_STOPF) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_STOPIE) == I2C_CTRL1_STOPIE) ? SET : RESET) != RESET)) + { + i2c_it_master_complete(drv_i2c, itflags); + } +} + +static void i2c_master_ev_isr_handler_dma(struct n32_i2c *drv_i2c) +{ + uint16_t devaddress; + uint32_t setmask; + uint32_t xfermode; + /* Get current IT Flags and IT sources value */ + volatile uint32_t itflags = READ_REG(drv_i2c->config->Instance->STSINT); + volatile uint32_t itsources = READ_REG(drv_i2c->config->Instance->CTRL1); + + if (((((itflags & I2C_STSINT_NAKF) == I2C_STSINT_NAKF) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_NAKIE) == I2C_CTRL1_NAKIE) ? SET : RESET) != RESET)) + { + /* Clear Not Acknowledge received flag */ + drv_i2c->config->Instance->INTCLR = I2C_INTCLR_NAKCLR; + + setmask = I2C_CTRL1_TFCIE | I2C_CTRL1_STOPIE; + + /* Enable STOP interrupts */ + drv_i2c->config->Instance->CTRL1 |= setmask; + + /* Flush WDR register */ + i2c_flush_wdr(drv_i2c->config->Instance); + } + else if (((((itflags & I2C_STSINT_TFCR) == I2C_STSINT_TFCR) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_TFCIE) == I2C_CTRL1_TFCIE) ? SET : RESET) != RESET)) + { + /* Disable TC interrupt */ + drv_i2c->config->Instance->CTRL1 &= ~I2C_CTRL1_TFCIE; + + if (drv_i2c->transfer.XferCount != 0U) + { + devaddress = (uint16_t)(drv_i2c->config->Instance->CTRL2 & I2C_CTRL2_SADR); + + /* Prepare the new XferSize to transfer */ + if (drv_i2c->transfer.XferCount > MAX_NBYTE_SIZE) + { + drv_i2c->transfer.XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + drv_i2c->transfer.XferSize = drv_i2c->transfer.XferCount; + xfermode = drv_i2c->transfer.XferOptions; + } + + /* Slave address | Transfer direction | START generation | STOP generation | Number of bytes | NBYTES reload mode | Automatic end mode */ + setmask = ((uint32_t)devaddress & I2C_CTRL2_SADR) | (uint32_t)I2C_NO_STARTSTOP | (((uint32_t)drv_i2c->transfer.XferSize << I2C_CTRL2_NBYTES_POS) & I2C_CTRL2_BYTECNT) | (uint32_t)xfermode; + + /* Set IIC CTRL2 Register */ + MODIFY_REG(drv_i2c->config->Instance->CTRL2, I2C_CTRL2_CLEAR, (uint32_t)setmask); + + /* Update XferCount value */ + drv_i2c->transfer.XferCount -= drv_i2c->transfer.XferSize; + + /* Enable DMA Request */ + if (drv_i2c->transfer.state == I2C_BUSY_TX) + { + drv_i2c->config->Instance->CTRL1 |= I2C_CTRL1_DMAWREN; + } + if (drv_i2c->transfer.state == I2C_BUSY_RX) + { + drv_i2c->config->Instance->CTRL1 |= I2C_CTRL1_DMARDEN; + } + } + else + { + if (((drv_i2c->config->Instance->CTRL2 & I2C_AUTOEND_MODE) != I2C_AUTOEND_MODE)) + { + i2c_it_completion_done(drv_i2c); + } + else + { + i2c_it_error_handler(drv_i2c, itflags); + } + } + } + else if (((((itflags & I2C_STSINT_TFC) == I2C_STSINT_TFC) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_TFCIE) == I2C_CTRL1_TFCIE) ? SET : RESET) != RESET)) + { + if (drv_i2c->transfer.XferCount == 0U) + { + if (((drv_i2c->config->Instance->CTRL2 & I2C_AUTOEND_MODE) != I2C_AUTOEND_MODE)) + { + i2c_it_completion_done(drv_i2c); + } + } + else + { + i2c_it_error_handler(drv_i2c, itflags); + } + } + else if (((((itflags & I2C_STSINT_STOPF) == I2C_STSINT_STOPF) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_STOPIE) == I2C_CTRL1_STOPIE) ? SET : RESET) != RESET)) + { + i2c_it_master_complete(drv_i2c, itflags); + } + else + { + /* Nothing to do */ + } +} + +static void i2c_master_er_isr_handler(struct n32_i2c *drv_i2c) +{ + uint32_t tmperror = 0; + volatile uint32_t itflags = READ_REG(drv_i2c->config->Instance->STSINT); + volatile uint32_t itsources = READ_REG(drv_i2c->config->Instance->CTRL1); + + /* I2C Bus error interrupt occurred */ + if (((((itflags & I2C_STSINT_BSER) == I2C_STSINT_BSER) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_ERRIE) == I2C_CTRL1_ERRIE) ? SET : RESET) != RESET)) + { + tmperror |= I2C_STSINT_BSER; + + drv_i2c->config->Instance->INTCLR = I2C_INTCLR_BSERCLR; + } + + /* I2C Over-Run/Under-Run interrupt occurred */ + if (((((itflags & I2C_STSINT_OVF) == I2C_STSINT_OVF) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_ERRIE) == I2C_CTRL1_ERRIE) ? SET : RESET) != RESET)) + { + tmperror |= I2C_STSINT_OVF; + + drv_i2c->config->Instance->INTCLR = I2C_INTCLR_OVFCLR; + } + + /* I2C Arbitration Loss error interrupt occurred */ + if (((((itflags & I2C_STSINT_ABLO) == I2C_STSINT_ABLO) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_ERRIE) == I2C_CTRL1_ERRIE) ? SET : RESET) != RESET)) + { + tmperror |= I2C_STSINT_ABLO; + + drv_i2c->config->Instance->INTCLR = I2C_INTCLR_ABLOCLR; + } + + /* I2C PEC error interrupt occurred */ + if (((((itflags & I2C_STSINT_CRCERR) == I2C_STSINT_CRCERR) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_ERRIE) == I2C_CTRL1_ERRIE) ? SET : RESET) != RESET)) + { + tmperror |= I2C_STSINT_CRCERR; + + drv_i2c->config->Instance->INTCLR = I2C_INTCLR_CRCCLR; + } + + /* I2C PEC error interrupt occurred */ + if (((((itflags & I2C_STSINT_TMOUT) == I2C_STSINT_TMOUT) ? SET : RESET) != RESET) && + ((((itsources & I2C_CTRL1_ERRIE) == I2C_CTRL1_ERRIE) ? SET : RESET) != RESET)) + { + tmperror |= I2C_STSINT_TMOUT; + + drv_i2c->config->Instance->INTCLR = I2C_INTCLR_TMOUTCLR; + } + + if ((tmperror & (I2C_STSINT_BSER | I2C_STSINT_OVF | I2C_STSINT_ABLO | I2C_STSINT_CRCERR | I2C_STSINT_TMOUT)) != 0) + { + i2c_it_error_handler(drv_i2c, itflags); + } +} + +static void i2c_master_ev_isr_handler(struct n32_i2c *drv_i2c) +{ + if (drv_i2c->i2c_isr_callback != RT_NULL) + { + drv_i2c->i2c_isr_callback(drv_i2c); + } +} + + +#if defined(BSP_I2C1_RX_USING_DMA) || defined(BSP_I2C2_RX_USING_DMA) || defined(BSP_I2C3_RX_USING_DMA) || defined(BSP_I2C4_RX_USING_DMA) || defined(BSP_I2C5_RX_USING_DMA) || \ + defined(BSP_I2C6_RX_USING_DMA) || defined(BSP_I2C7_RX_USING_DMA) || defined(BSP_I2C8_RX_USING_DMA) || defined(BSP_I2C9_RX_USING_DMA) || defined(BSP_I2C10_RX_USING_DMA) +static void i2c_master_dma_receive_isr_handler(struct n32_i2c *drv_i2c) +{ +#if defined(SOC_SERIES_N32H7xx) + if (DMA_GetCombinedStatus(drv_i2c->config->dma_rx->Instance)) + { + if (DMA_GetChannelIntBlockStatus(drv_i2c->config->dma_rx->Instance, drv_i2c->config->dma_rx->dma_channel) == SET) + { + /* Disable DMA Request */ + drv_i2c->config->Instance->CTRL1 &= (~I2C_CTRL1_DMARDEN); + + /* If last transfer, enable STOP interrupt */ + if (drv_i2c->transfer.XferCount == 0U) + { + /* Enable interrupt */ + drv_i2c->config->Instance->CTRL1 |= (I2C_CTRL1_TFCIE | I2C_CTRL1_STOPIE); + } + /* else prepare a new DMA transfer and enable TCReload interrupt */ + else + { + /* Update Buffer pointer */ + drv_i2c->transfer.pBuffPtr += drv_i2c->transfer.XferSize; + + /* Set the XferSize to transfer */ + if (drv_i2c->transfer.XferCount > MAX_NBYTE_SIZE) + { + drv_i2c->transfer.XferSize = MAX_NBYTE_SIZE; + } + else + { + drv_i2c->transfer.XferSize = drv_i2c->transfer.XferCount; + } + + n32_iic_transfer_by_dma(drv_i2c->config, drv_i2c->transfer.pBuffPtr, drv_i2c->transfer.XferSize, RT_TRUE); + + /* Enable TC interrupts */ + drv_i2c->config->Instance->CTRL1 |= I2C_CTRL1_TFCIE; + } + + /* Clear interrupt event status */ + DMA_ClearChannelEventStatus(drv_i2c->config->dma_rx->Instance, drv_i2c->config->dma_rx->dma_channel, DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE); + } + } +#endif +} +#endif + +#if defined(BSP_I2C1_TX_USING_DMA) || defined(BSP_I2C2_TX_USING_DMA) || defined(BSP_I2C3_TX_USING_DMA) || defined(BSP_I2C4_TX_USING_DMA) || defined(BSP_I2C5_TX_USING_DMA) || \ + defined(BSP_I2C6_TX_USING_DMA) || defined(BSP_I2C7_TX_USING_DMA) || defined(BSP_I2C8_TX_USING_DMA) || defined(BSP_I2C9_TX_USING_DMA) || defined(BSP_I2C10_TX_USING_DMA) +static void i2c_master_dma_send_isr_handler(struct n32_i2c *drv_i2c) +{ +#if defined(SOC_SERIES_N32H7xx) + if (DMA_GetCombinedStatus(drv_i2c->config->dma_tx->Instance)) + { + if (DMA_GetChannelIntBlockStatus(drv_i2c->config->dma_tx->Instance, drv_i2c->config->dma_tx->dma_channel) == SET) + { + /* Disable DMA Request */ + drv_i2c->config->Instance->CTRL1 &= (~I2C_CTRL1_DMAWREN); + + /* If last transfer, enable STOP interrupt */ + if (drv_i2c->transfer.XferCount == 0U) + { + /* Enable interrupt */ + drv_i2c->config->Instance->CTRL1 |= (I2C_CTRL1_TFCIE | I2C_CTRL1_STOPIE); + } + /* else prepare a new DMA transfer and enable TCReload interrupt */ + else + { + /* Update Buffer pointer */ + drv_i2c->transfer.pBuffPtr += drv_i2c->transfer.XferSize; + + /* Set the XferSize to transfer */ + if (drv_i2c->transfer.XferCount > MAX_NBYTE_SIZE) + { + drv_i2c->transfer.XferSize = MAX_NBYTE_SIZE; + } + else + { + drv_i2c->transfer.XferSize = drv_i2c->transfer.XferCount; + } + + n32_iic_transfer_by_dma(drv_i2c->config, drv_i2c->transfer.pBuffPtr, drv_i2c->transfer.XferSize, RT_TRUE); + + /* Enable TC interrupts */ + drv_i2c->config->Instance->CTRL1 |= I2C_CTRL1_TFCIE; + } + + /* Clear interrupt event status */ + DMA_ClearChannelEventStatus(drv_i2c->config->dma_tx->Instance, drv_i2c->config->dma_tx->dma_channel, DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE); + } + } +#endif +} +#endif + +#ifdef BSP_USING_HARD_I2C1 +/** + * @brief This function handles I2C2 event interrupt. + */ +void I2C1_EV_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + i2c_master_ev_isr_handler(&i2c_objs[I2C1_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +/** + * @brief This function handles I2C2 error interrupt. + */ +void I2C1_ER_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + i2c_master_er_isr_handler(&i2c_objs[I2C1_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(BSP_I2C1_RX_USING_DMA) && defined(I2C1_RX_DMA_IRQHandler) +void I2C1_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + i2c_master_dma_receive_isr_handler(&i2c_objs[I2C1_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_I2C1_RX_USING_DMA) && defined(I2C1_RX_DMA_IRQHandler) */ + +#if defined(BSP_I2C1_TX_USING_DMA) && defined(I2C1_TX_DMA_IRQHandler) +void I2C1_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + i2c_master_dma_send_isr_handler(&i2c_objs[I2C1_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_I2C1_TX_USING_DMA) && defined(I2C1_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_HARD_I2C1 */ + + +int rt_hw_hw_i2c_init(void) +{ + int ret = -RT_ERROR; + rt_size_t obj_num = sizeof(i2c_objs) / sizeof(i2c_objs[0]); + + n32_get_dma_info(); + + for (int i = 0; i < obj_num; i++) + { + i2c_objs[i].i2c_bus.ops = &n32_i2c_ops; + i2c_objs[i].transfer.state = I2C_RESET; + i2c_objs[i].config = &i2c_config[i]; + i2c_objs[i].i2c_bus.timeout = i2c_config[i].timeout; + + rt_completion_init(&i2c_objs[i].completion); + n32_i2c_configure(&i2c_objs[i].i2c_bus); + ret = rt_i2c_bus_device_register(&i2c_objs[i].i2c_bus, i2c_objs[i].config->name); + RT_ASSERT(ret == RT_EOK); + LOG_D("%s bus init done", i2c_config[i].name); + } + return ret; +} +INIT_CORE_EXPORT(rt_hw_hw_i2c_init); + +#endif diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_hard_i2c.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_hard_i2c.h new file mode 100644 index 0000000000..2b4a96f569 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_hard_i2c.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __DRV_HARD_I2C_H__ +#define __DRV_HARD_I2C_H__ + +#include "drv_config.h" +#include +#include "rtdevice.h" +#include +#include +#include "drv_dma.h" +#include + + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define I2C_USING_TX_DMA_FLAG (1U) +#define I2C_USING_RX_DMA_FLAG (1U << 1) + + +typedef enum +{ + I2C_RESET = 0x00U, + I2C_READY = 0x01U, + I2C_BUSY_TX = 0x02U, + I2C_BUSY_RX = 0x03U, +} I2C_StateTypeDef; + +struct n32_i2c_config +{ + const char *name; + I2C_Module *Instance; + rt_uint32_t timing; + rt_uint32_t timeout; + IRQn_Type evirq_type; + IRQn_Type erirq_type; + + rt_uint32_t scl_af_width; /* SCL Analog Filter Width */ + rt_uint32_t sda_af_width; /* SDA Analog Filter Width */ + rt_uint32_t df_width; /* Digital Filter Width */ + + uint32_t periph; + void (*EnablePeriphClk)(uint32_t periph, FunctionalState cmd); + void (*I2CKerClkSource)(uint32_t CLK_source); + + struct dma_config *dma_rx, *dma_tx; +}; + +struct hard_i2c_transfer +{ + uint8_t *pBuffPtr; /* Pointer to I2C transfer buffer */ + uint16_t XferSize; /* I2C transfer size */ + __IO uint16_t XferCount; /* I2C transfer counter */ + __IO uint32_t XferOptions; /* I2C sequantial transfer options */ + __IO I2C_StateTypeDef state; /* I2C communication state */ +}; + + +struct n32_i2c +{ + struct hard_i2c_transfer transfer; + + struct n32_i2c_config *config; + struct rt_i2c_bus_device i2c_bus; + rt_uint8_t i2c_dma_flag; + struct rt_completion completion; + + void (*i2c_isr_callback)(struct n32_i2c *drv_i2c); +}; + + + +#ifdef __cplusplus +} +#endif + + +#if defined(RT_USING_I2C) && defined(BSP_USING_I2C) + + +#endif /* defined(RT_USING_I2C) && defined(BSP_USING_I2C) */ + + +#endif /* __DRV_HARD_I2C_H__ */ + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_log.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_log.h new file mode 100644 index 0000000000..48f874b13f --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_log.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +/* + * NOTE: DO NOT include this file on the header file. + */ + +#ifndef LOG_TAG +#define DBG_TAG "drv" +#else +#define DBG_TAG LOG_TAG +#endif /* LOG_TAG */ + +#ifdef DRV_DEBUG +#define DBG_LVL DBG_LOG +#else +#define DBG_LVL DBG_INFO +#endif /* DRV_DEBUG */ + +#include diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_rtc.c b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_rtc.c new file mode 100644 index 0000000000..0d5b769c61 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_rtc.c @@ -0,0 +1,434 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#include "board.h" +#include +#include +#include + +#ifdef BSP_USING_ONCHIP_RTC + +#ifndef RTC_BKP_REG1 + #define RTC_BKP_REG1 1U +#endif + +//#define DRV_DEBUG +#define LOG_TAG "drv.rtc" +#include + + +#define BKUP_REG_DATA 0xA5A5 + +struct rtc_device_object +{ + rt_rtc_dev_t rtc_dev; +#ifdef RT_USING_ALARM + struct rt_rtc_wkalarm wkalarm; +#endif +}; + +#ifdef RT_USING_ALARM +static rt_err_t rtc_alarm_time_set(struct rtc_device_object* p_dev); +static int rt_rtc_alarm_init(void); +static RTC_AlarmType Alarm_InitStruct = { 0 }; +static EXTI_InitType EXTI_InitStructure = { 0 }; +#endif + +static struct rtc_device_object rtc_device; + + +rt_weak uint32_t RTC_BKUP_Read(uint8_t BackupRegister) +{ + return RTC_BKUPRgRead(BackupRegister); +} + +rt_weak void RTC_BKUP_Write(uint8_t BackupRegister, uint32_t Data) +{ + RTC_BKUPRgWrite(BackupRegister, Data); +} + + +static rt_err_t n32_rtc_get_timeval(struct timeval *tv) +{ + uint32_t SubSeconds; + uint32_t Div_Sync; + RTC_TimeType RTC_TimeStruct = {0}; + RTC_DateType RTC_DateStruct = {0}; + struct tm tm_new = {0}; + + RTC_GetTime(RTC_FORMAT_BIN, &RTC_TimeStruct); + RTC_GetDate(RTC_FORMAT_BIN, &RTC_DateStruct); + + tm_new.tm_sec = RTC_TimeStruct.Seconds; + tm_new.tm_min = RTC_TimeStruct.Minutes; + tm_new.tm_hour = RTC_TimeStruct.Hours; + + tm_new.tm_mday = RTC_DateStruct.Date; + tm_new.tm_mon = RTC_DateStruct.Month - 1; + tm_new.tm_year = RTC_DateStruct.Year + 100; + + tv->tv_sec = timegm(&tm_new); + + SubSeconds = (uint32_t)(RTC->SUBS); + Div_Sync = (uint32_t)((RTC->PRE) & 0x00007FFFU); + tv->tv_usec = ((Div_Sync * 1.0) - (SubSeconds * 1.0)) / ((Div_Sync + 1U) * 1.0) * 1000.0 * 1000.0; + + return RT_EOK; +} + + +static rt_err_t set_rtc_time_stamp(time_t time_stamp) +{ + RTC_TimeType RTC_TimeStruct = {0}; + RTC_DateType RTC_DateStruct = {0}; + struct tm tm = {0}; + + gmtime_r(&time_stamp, &tm); + if (tm.tm_year < 100) + { + return -RT_ERROR; + } + + RTC_TimeStruct.Seconds = tm.tm_sec ; + RTC_TimeStruct.Minutes = tm.tm_min ; + RTC_TimeStruct.Hours = tm.tm_hour; + RTC_DateStruct.Date = tm.tm_mday; + RTC_DateStruct.Month = tm.tm_mon + 1 ; + RTC_DateStruct.Year = tm.tm_year - 100; + RTC_DateStruct.WeekDay = tm.tm_wday + 1; + + if (RTC_ConfigTime(RTC_FORMAT_BIN, &RTC_TimeStruct) == ERROR) + { + return -RT_ERROR; + } + if (RTC_SetDate(RTC_FORMAT_BIN, &RTC_DateStruct) == ERROR) + { + return -RT_ERROR; + } + + LOG_D("set rtc time."); + RTC_BKUP_Write(RTC_BKP_REG1, BKUP_REG_DATA); + + return RT_EOK; +} + + +static rt_err_t rt_rtc_config(void) +{ + uint32_t SynchPrediv, AsynchPrediv; + RTC_InitType RTC_InitStructure = { 0 }; + +#if defined(SOC_SERIES_N32H7xx) + /* Enable the PWR clock */ + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_PWR, ENABLE); + /* Allow access to RTC */ + PWR_BackupAccessEnable(ENABLE); + + /* Disable RTC clock */ + RCC_EnableAPB5PeriphClk2(RCC_APB5_PERIPHEN_M7_RTCPCLK, DISABLE); +#endif + +#if defined(BSP_RTC_USING_LSI) +#if defined(SOC_SERIES_N32H7xx) + /* Enable the LSI OSC */ + RCC_EnableLsi(ENABLE); + if (RCC_WaitLsiStable() == ERROR) + { + return -RT_ERROR; + } + RCC_ConfigRtcClk(RCC_RTCCLK_SRC_LSI, RCC_RTCCLK_HSEDIV63); +#endif + SynchPrediv = 0xF9; + AsynchPrediv = 0x7F; +#elif defined(BSP_RTC_USING_LSE) +#if defined(SOC_SERIES_N32H7xx) + /* Enable the LSI */ + RCC_EnableLsi(ENABLE); + RCC_ConfigLse(RCC_LSE_ENABLE); + + /****Waite LSE Ready *****/ + if (RCC_WaitLseStable() == ERROR) + { + return -RT_ERROR; + } + + RCC_ConfigRtcClk(RCC_RTCCLK_SRC_LSE, RCC_RTCCLK_HSEDIV_MASK); +#endif + SynchPrediv = 0xFF; + AsynchPrediv = 0x7F; +#else +#if defined(SOC_SERIES_N32H7xx) + /* Enable HSE */ + RCC_EnableLsi(ENABLE); + RCC_ConfigHse(RCC_HSE_ENABLE); + if (RCC_WaitHseStable() == ERROR) + { + return -RT_ERROR; + } + RCC_ConfigRtcClk(RCC_RTCCLK_SRC_HSEDIV, RCC_RTCCLK_HSEDIV50); +#endif + SynchPrediv = 0x1387; + AsynchPrediv = 0x63; +#endif + +#if defined(SOC_SERIES_N32H7xx) + /* Enable the RTC Clock */ + RCC_EnableAPB5PeriphClk2(RCC_APB5_PERIPHEN_M7_RTCPCLK, ENABLE); + RCC_EnableAPB5PeriphClk2(RCC_APB5_PERIPHEN_M7_RTCPCLKLP, ENABLE); + RCC_EnableRtcClk(ENABLE); + + if (RTC_WaitForSynchro() == ERROR) + { + return -RT_ERROR; + } +#endif + + if (RTC_BKUP_Read(RTC_BKP_REG1) != BKUP_REG_DATA) + { + LOG_I("RTC hasn't been configured, please use command to config."); + + RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv; + RTC_InitStructure.RTC_SynchPrediv = SynchPrediv; + RTC_InitStructure.RTC_HourFormat = RTC_24HOUR_FORMAT; + + if (RTC_Init(&RTC_InitStructure) == ERROR) + { + return -RT_ERROR; + } + } + + return RT_EOK; +} + + +static rt_err_t n32_rtc_init(void) +{ + if (rt_rtc_config() != RT_EOK) + { + LOG_E("rtc init failed."); + return -RT_ERROR; + } + + return RT_EOK; +} + + +static rt_err_t n32_rtc_get_secs(time_t *sec) +{ + struct timeval tv; + + n32_rtc_get_timeval(&tv); + *(time_t *) sec = tv.tv_sec; + LOG_D("RTC: get rtc_time %d", *sec); + + return RT_EOK; +} + + +static rt_err_t n32_rtc_set_secs(time_t *sec) +{ + rt_err_t result = RT_EOK; + + if (set_rtc_time_stamp(*sec)) + { + result = -RT_ERROR; + } + LOG_D("RTC: set rtc_time %d", *sec); +#ifdef RT_USING_ALARM + rt_alarm_update(&rtc_device.rtc_dev.parent, 1); +#endif + return result; +} + + +static rt_err_t n32_rtc_get_alarm(struct rt_rtc_wkalarm *alarm) +{ +#ifdef RT_USING_ALARM + *alarm = rtc_device.wkalarm; + LOG_D("GET_ALARM %d:%d:%d", rtc_device.wkalarm.tm_hour, + rtc_device.wkalarm.tm_min, + rtc_device.wkalarm.tm_sec); + return RT_EOK; +#else + return -RT_ERROR; +#endif +} + + +static rt_err_t n32_rtc_set_alarm(struct rt_rtc_wkalarm *alarm) +{ +#ifdef RT_USING_ALARM + LOG_D("RT_DEVICE_CTRL_RTC_SET_ALARM"); + if (alarm != RT_NULL) + { + rtc_device.wkalarm.enable = alarm->enable; + rtc_device.wkalarm.tm_hour = alarm->tm_hour; + rtc_device.wkalarm.tm_min = alarm->tm_min; + rtc_device.wkalarm.tm_sec = alarm->tm_sec; + rtc_device.wkalarm.tm_mday = alarm->tm_mday; + rtc_device.wkalarm.tm_mon = alarm->tm_mon; + rtc_device.wkalarm.tm_year = alarm->tm_year; + rtc_alarm_time_set(&rtc_device); + } + else + { + LOG_E("RT_DEVICE_CTRL_RTC_SET_ALARM error!!"); + return -RT_ERROR; + } + LOG_D("SET_ALARM %d:%d:%d", alarm->tm_hour, + alarm->tm_min, + alarm->tm_sec); + return RT_EOK; +#else + return -RT_ERROR; +#endif +} + + +static const struct rt_rtc_ops n32_rtc_ops = +{ + n32_rtc_init, + n32_rtc_get_secs, + n32_rtc_set_secs, + n32_rtc_get_alarm, + n32_rtc_set_alarm, + n32_rtc_get_timeval, + RT_NULL, +}; + + + +#ifdef RT_USING_ALARM +void rt_rtc_alarm_enable(void) +{ +#if defined(SOC_SERIES_N32H7xx) + /* Enable EXTI clocks */ + RCC_EnableAPB5PeriphClk2(RCC_APB5_PERIPHEN_EXTI, ENABLE); +#endif + + /* Configure the RTC Alarm A register */ + RTC_SetAlarm(RTC_FORMAT_BIN, RTC_A_ALARM, &Alarm_InitStruct); + /* Enable the RTC Alarm A Interrupt */ + RTC_ConfigInt(RTC_INT_ALRA, ENABLE); + /* Enable the Alarm A */ + RTC_EnableAlarm(RTC_A_ALARM, ENABLE); + + LOG_D("alarm read:%d:%d:%d", Alarm_InitStruct.AlarmTime.Hours, + Alarm_InitStruct.AlarmTime.Minutes, + Alarm_InitStruct.AlarmTime.Seconds); + + + RTC_ClrIntPendingBit(RTC_INT_ALRA); + EXTI_ClrITPendBit(EXTI_LINE17); + + EXTI_InitStruct(&EXTI_InitStructure); + +#if defined(SOC_SERIES_N32H7xx) + EXTI_InitStructure.EXTI_Line = EXTI_LINE17; +#endif + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_InitPeripheral(&EXTI_InitStructure); + + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); + NVIC_SetPriority(RTC_ALARM_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0x02, 0)); + NVIC_EnableIRQ(RTC_ALARM_IRQn); +} + +void rt_rtc_alarm_disable(void) +{ + /* Disable the AlarmX */ + RTC_EnableAlarm(RTC_A_ALARM, DISABLE); + + EXTI_InitStructure.EXTI_LineCmd = DISABLE; +#if defined(SOC_SERIES_N32H7xx) + EXTI_InitStructure.EXTI_Line = EXTI_LINE17; + EXTI_InitPeripheral(&EXTI_InitStructure); + + EXTI_ClrITPendBit(EXTI_LINE17); +#endif + + NVIC_DisableIRQ(RTC_ALARM_IRQn); +} + +static int rt_rtc_alarm_init(void) +{ + return RT_EOK; +} + +static rt_err_t rtc_alarm_time_set(struct rtc_device_object* p_dev) +{ + if (p_dev->wkalarm.enable) + { + /* Disable the AlarmX */ + RTC_EnableAlarm(RTC_A_ALARM, DISABLE); + + Alarm_InitStruct.AlarmTime.Hours = p_dev->wkalarm.tm_hour; + Alarm_InitStruct.AlarmTime.Minutes = p_dev->wkalarm.tm_min; + Alarm_InitStruct.AlarmTime.Seconds = p_dev->wkalarm.tm_sec; + Alarm_InitStruct.DateWeekValue = p_dev->wkalarm.tm_mday; + + Alarm_InitStruct.AlarmTime.H12 = RTC_AM_H12; + Alarm_InitStruct.DateWeekMode = RTC_ALARM_SEL_WEEKDAY_DATE; + Alarm_InitStruct.AlarmMask = RTC_ALARMMASK_NONE; + + LOG_D("alarm set:%d:%d:%d", Alarm_InitStruct.AlarmTime.Hours, + Alarm_InitStruct.AlarmTime.Minutes, + Alarm_InitStruct.AlarmTime.Seconds); + rt_rtc_alarm_enable(); + } + + return RT_EOK; +} + + +void RTC_ALARM_IRQHandler(void) +{ + rt_interrupt_enter(); + +#if defined(SOC_SERIES_N32H7xx) + EXTI_ClrITPendBit(EXTI_LINE17); +#endif + + if (RTC_GetITStatus(RTC_INT_ALRA) != RESET) + { + RTC_ClrIntPendingBit(RTC_INT_ALRA); + rt_alarm_update(&rtc_device.rtc_dev.parent, 1); + } + + rt_interrupt_leave(); +} +#endif + + +static int rt_hw_rtc_init(void) +{ + rt_err_t result; + + rtc_device.rtc_dev.ops = &n32_rtc_ops; + result = rt_hw_rtc_register(&rtc_device.rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR, RT_NULL); + if (result != RT_EOK) + { + LOG_E("rtc register err code: %d", result); + return result; + } + LOG_D("rtc init success"); + +#ifdef RT_USING_ALARM + rt_rtc_alarm_init(); +#endif + + return RT_EOK; +} +INIT_DEVICE_EXPORT(rt_hw_rtc_init); + + +#endif /* BSP_USING_ONCHIP_RTC */ diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_soft_i2c.c b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_soft_i2c.c new file mode 100644 index 0000000000..5a0a7b911f --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_soft_i2c.c @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#include "drv_soft_i2c.h" +#include "drv_config.h" + +#if defined(BSP_USING_I2C1) || defined(BSP_USING_I2C2) || defined(BSP_USING_I2C3) || defined(BSP_USING_I2C4) || defined(BSP_USING_I2C5) + +//#define DRV_DEBUG +#define LOG_TAG "drv.i2c.sw" +#include + +static const struct n32_soft_i2c_config soft_i2c_config[] = +{ +#ifdef BSP_USING_I2C1 + I2C1_BUS_CONFIG, +#endif +#ifdef BSP_USING_I2C2 + I2C2_BUS_CONFIG, +#endif +#ifdef BSP_USING_I2C3 + I2C3_BUS_CONFIG, +#endif +#ifdef BSP_USING_I2C4 + I2C4_BUS_CONFIG, +#endif +#ifdef BSP_USING_I2C5 + I2C5_BUS_CONFIG, +#endif +}; + +static struct n32_i2c i2c_obj[sizeof(soft_i2c_config) / sizeof(soft_i2c_config[0])]; + +/** + * This function initializes the i2c pin. + * + * @param n32 i2c dirver class. + */ +static void n32_i2c_gpio_init(struct n32_i2c *i2c) +{ + struct n32_soft_i2c_config* cfg = (struct n32_soft_i2c_config*)i2c->ops.data; + + rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD); + rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD); + + rt_pin_write(cfg->scl, PIN_HIGH); + rt_pin_write(cfg->sda, PIN_HIGH); +} + +/** + * This function sets the sda pin. + * + * @param n32 config class. + * @param The sda pin state. + */ +static void n32_set_sda(void *data, rt_int32_t state) +{ + struct n32_soft_i2c_config* cfg = (struct n32_soft_i2c_config*)data; + if (state) + { + rt_pin_write(cfg->sda, PIN_HIGH); + } + else + { + rt_pin_write(cfg->sda, PIN_LOW); + } +} + +/** + * This function sets the scl pin. + * + * @param n32 config class. + * @param The scl pin state. + */ +static void n32_set_scl(void *data, rt_int32_t state) +{ + struct n32_soft_i2c_config* cfg = (struct n32_soft_i2c_config*)data; + if (state) + { + rt_pin_write(cfg->scl, PIN_HIGH); + } + else + { + rt_pin_write(cfg->scl, PIN_LOW); + } +} + +/** + * This function gets the sda pin state. + * + * @param The sda pin state. + */ +static rt_int32_t n32_get_sda(void *data) +{ + struct n32_soft_i2c_config* cfg = (struct n32_soft_i2c_config*)data; + return rt_pin_read(cfg->sda); +} + +/** + * This function gets the scl pin state. + * + * @param The scl pin state. + */ +static rt_int32_t n32_get_scl(void *data) +{ + struct n32_soft_i2c_config* cfg = (struct n32_soft_i2c_config*)data; + return rt_pin_read(cfg->scl); +} + + +static const struct rt_i2c_bit_ops n32_bit_ops_default = +{ + .data = RT_NULL, + .set_sda = n32_set_sda, + .set_scl = n32_set_scl, + .get_sda = n32_get_sda, + .get_scl = n32_get_scl, + .udelay = rt_hw_us_delay, + .delay_us = 1, + .timeout = 100 +}; + +/** + * if i2c is locked, this function will unlock it + * + * @param n32 config class + * + * @return RT_EOK indicates successful unlock. + */ +static rt_err_t n32_i2c_bus_unlock(const struct n32_soft_i2c_config *cfg) +{ + rt_int32_t i = 0; + + if (PIN_LOW == rt_pin_read(cfg->sda)) + { + while (i++ < 9) + { + rt_pin_write(cfg->scl, PIN_HIGH); + rt_hw_us_delay(100); + rt_pin_write(cfg->scl, PIN_LOW); + rt_hw_us_delay(100); + } + } + if (PIN_LOW == rt_pin_read(cfg->sda)) + { + return -RT_ERROR; + } + + return RT_EOK; +} + +/* I2C initialization function */ +int rt_hw_i2c_init(void) +{ + rt_err_t result; + + for (rt_size_t i = 0; i < sizeof(i2c_obj) / sizeof(struct n32_i2c); i++) + { + i2c_obj[i].ops = n32_bit_ops_default; + i2c_obj[i].ops.data = (void*)&soft_i2c_config[i]; + i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops; + + n32_i2c_gpio_init(&i2c_obj[i]); + + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_config[i].bus_name); + RT_ASSERT(result == RT_EOK); + n32_i2c_bus_unlock(&soft_i2c_config[i]); + + LOG_D("software simulation %s init done, pin scl: %d, pin sda %d", + soft_i2c_config[i].bus_name, + soft_i2c_config[i].scl, + soft_i2c_config[i].sda); + } + + return RT_EOK; +} +INIT_BOARD_EXPORT(rt_hw_i2c_init); + +#endif /* defined(BSP_USING_I2C1) || defined(BSP_USING_I2C2) || defined(BSP_USING_I2C3) || defined(BSP_USING_I2C4) || defined(BSP_USING_I2C5) */ + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_soft_i2c.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_soft_i2c.h new file mode 100644 index 0000000000..2695e5896e --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_soft_i2c.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __DRV_SOFT_I2C_H__ +#define __DRV_SOFT_I2C_H__ + +#include +#include +#include + +/* n32 config class */ +struct n32_soft_i2c_config +{ + rt_uint8_t scl; + rt_uint8_t sda; + const char *bus_name; +}; +/* n32 i2c dirver class */ +struct n32_i2c +{ + struct rt_i2c_bit_ops ops; + struct rt_i2c_bus_device i2c_bus; +}; + +#ifdef BSP_USING_I2C1 +#define I2C1_BUS_CONFIG \ + { \ + .scl = BSP_I2C1_SCL_PIN, \ + .sda = BSP_I2C1_SDA_PIN, \ + .bus_name = "i2c1", \ + } +#endif + +#ifdef BSP_USING_I2C2 +#define I2C2_BUS_CONFIG \ + { \ + .scl = BSP_I2C2_SCL_PIN, \ + .sda = BSP_I2C2_SDA_PIN, \ + .bus_name = "i2c2", \ + } +#endif + +#ifdef BSP_USING_I2C3 +#define I2C3_BUS_CONFIG \ + { \ + .scl = BSP_I2C3_SCL_PIN, \ + .sda = BSP_I2C3_SDA_PIN, \ + .bus_name = "i2c3", \ + } +#endif + +#ifdef BSP_USING_I2C4 +#define I2C4_BUS_CONFIG \ + { \ + .scl = BSP_I2C4_SCL_PIN, \ + .sda = BSP_I2C4_SDA_PIN, \ + .bus_name = "i2c4", \ + } +#endif + +#ifdef BSP_USING_I2C5 +#define I2C5_BUS_CONFIG \ + { \ + .scl = BSP_I2C5_SCL_PIN, \ + .sda = BSP_I2C5_SDA_PIN, \ + .bus_name = "i2c5", \ + } +#endif + +#endif /* __DRV_SOFT_I2C_H__ */ diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_spi.c b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_spi.c new file mode 100644 index 0000000000..0c0dd3d99b --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_spi.c @@ -0,0 +1,1926 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#include +#include +#include "board.h" + +#ifdef BSP_USING_SPI + +#if defined(BSP_USING_SPI1) || defined(BSP_USING_SPI2) || defined(BSP_USING_SPI3) || defined(BSP_USING_SPI4) || defined(BSP_USING_SPI5) || defined(BSP_USING_SPI6) || defined(BSP_USING_SPI7) + + +#include "drv_spi.h" +#include "drv_config.h" +#include + +//#define DRV_DEBUG +#define LOG_TAG "drv.spi" +#include + +enum +{ +#ifdef BSP_USING_SPI1 + SPI1_INDEX, +#endif +#ifdef BSP_USING_SPI2 + SPI2_INDEX, +#endif +#ifdef BSP_USING_SPI3 + SPI3_INDEX, +#endif +#ifdef BSP_USING_SPI4 + SPI4_INDEX, +#endif +#ifdef BSP_USING_SPI5 + SPI5_INDEX, +#endif +#ifdef BSP_USING_SPI6 + SPI6_INDEX, +#endif +#ifdef BSP_USING_SPI7 + SPI7_INDEX, +#endif +}; + + +static struct n32_spi_config spi_config[] = +{ +#ifdef BSP_USING_SPI1 + SPI1_BUS_CONFIG, +#endif + +#ifdef BSP_USING_SPI2 + SPI2_BUS_CONFIG, +#endif + +#ifdef BSP_USING_SPI3 + SPI3_BUS_CONFIG, +#endif + +#ifdef BSP_USING_SPI4 + SPI4_BUS_CONFIG, +#endif + +#ifdef BSP_USING_SPI5 + SPI5_BUS_CONFIG, +#endif + +#ifdef BSP_USING_SPI6 + SPI6_BUS_CONFIG, +#endif + +#ifdef BSP_USING_SPI7 + SPI7_BUS_CONFIG, +#endif +}; + +static struct n32_spi spi_bus_obj[sizeof(spi_config) / sizeof(spi_config[0])] = { 0 }; + + +static rt_err_t SPI_DMA_TransmitReceive(struct n32_spi *spi_drv, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) +{ + RT_ASSERT(spi_drv != RT_NULL); + RT_ASSERT((spi_drv->cfg->mode & RT_SPI_3WIRE) != RT_SPI_3WIRE); + + if (spi_drv->dma.DMA_Rx_Init != RT_TRUE || spi_drv->dma.DMA_Tx_Init != RT_TRUE) + { + LOG_E("In full-duplex mode, both TX DMA and RX DMA did not complete initialization."); + return -RT_ERROR; + } + + if (spi_drv->dma.DMA_Rx_Init == RT_TRUE) + { +#if defined(SOC_SERIES_N32H7xx) + /* SPI RX DMA Receive Data */ + DMA_ChannelCmd(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel, DISABLE); + + if (!DMA_ControllerIsEnabled(spi_drv->config->dma_rx->Instance)) + DMA_ControllerCmd(spi_drv->config->dma_rx->Instance, ENABLE); + + spi_drv->dma.RX_DMA_ChInitStr.IntEn = 1U; + spi_drv->dma.RX_DMA_ChInitStr.DstAddr = (uint32_t)pRxData; + spi_drv->dma.RX_DMA_ChInitStr.BlkTfrSize = Size; + + DMA_ControllerCmd(spi_drv->config->dma_rx->Instance, ENABLE); + if (DMA_ChannelInit(spi_drv->config->dma_rx->Instance, &spi_drv->dma.RX_DMA_ChInitStr, spi_drv->config->dma_rx->dma_channel) == 0U) + { + /* Enable transaction complete interrupt event */ + DMA_ChannelEventCmd(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, ENABLE); + + /* Enable the specified DMA channel */ + DMA_ChannelCmd(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel, ENABLE); + + SPI_I2S_EnableDma(spi_drv->config->SPIx, SPI_I2S_DMA_RX, ENABLE); + } +#endif + } + else + { + LOG_E("In full-duplex mode, RX DMA did not complete initialization."); + return -RT_ERROR; + } + + if (spi_drv->dma.DMA_Tx_Init == RT_TRUE) + { +#if defined(SOC_SERIES_N32H7xx) + /* SPI TX DMA Send Data */ + DMA_ChannelCmd(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel, DISABLE); + + if (!DMA_ControllerIsEnabled(spi_drv->config->dma_tx->Instance)) + DMA_ControllerCmd(spi_drv->config->dma_tx->Instance, ENABLE); + + spi_drv->dma.TX_DMA_ChInitStr.IntEn = 1U; + spi_drv->dma.TX_DMA_ChInitStr.SrcAddr = (uint32_t)pTxData; + spi_drv->dma.TX_DMA_ChInitStr.BlkTfrSize = Size; + + DMA_ControllerCmd(spi_drv->config->dma_tx->Instance, ENABLE); + if (DMA_ChannelInit(spi_drv->config->dma_tx->Instance, &spi_drv->dma.TX_DMA_ChInitStr, spi_drv->config->dma_tx->dma_channel) == 0U) + { + /* Enable transaction complete interrupt event */ + DMA_ChannelEventCmd(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, ENABLE); + + /* Enable the specified DMA channel */ + DMA_ChannelCmd(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel, ENABLE); + + SPI_I2S_EnableDma(spi_drv->config->SPIx, SPI_I2S_DMA_TX, ENABLE); + } +#endif + } + else + { + LOG_E("In full-duplex mode, TX DMA did not complete initialization."); + return -RT_ERROR; + } + + /* Clear Over Flag */ + SPI_I2S_ReceiveData(spi_drv->config->SPIx); + SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG); + + /* Enable Error Interrupt */ + SPI_I2S_EnableInt(spi_drv->config->SPIx, SPI_I2S_INT_ERR, ENABLE); + + /* Set SPI Direction */ + spi_drv->Direct = SPI_Tx_Rx; + + /* Check if the SPI is already enabled */ + if ((spi_drv->config->SPIx->CTRL2 & SPI_CTRL2_SPIEN) != SPI_CTRL2_SPIEN) + SPI_Enable(spi_drv->config->SPIx, ENABLE); + + return RT_EOK; +} + +static rt_err_t SPI_DMA_Transmit(struct n32_spi *spi_drv, uint8_t *pData, uint16_t Size) +{ + RT_ASSERT(spi_drv != RT_NULL); + + if (spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_SINGLELINE_RX || + spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_SINGLELINE_TX) + { + /* Disable the sFLASH_SPI */ + SPI_Enable(spi_drv->config->SPIx, DISABLE); + /* DeInitializes the sFLASH_SPI */ + SPI_I2S_DeInit(spi_drv->config->SPIx); + /* Set the sFLASH_SPI SendOnly*/ + spi_drv->SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_TX; + SPI_Init(spi_drv->config->SPIx, &spi_drv->SPI_InitStructure); + } + + if (spi_drv->dma.DMA_Rx_Init == RT_TRUE) + { +#if defined(SOC_SERIES_N32H7xx) + DMA_ChannelCmd(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel, DISABLE); + + if (!DMA_ControllerIsEnabled(spi_drv->config->dma_rx->Instance)) + DMA_ControllerCmd(spi_drv->config->dma_rx->Instance, ENABLE); + + spi_drv->dma.RX_DMA_ChInitStr.IntEn = 0U; + spi_drv->dma.RX_DMA_ChInitStr.DstAddr = NULL; + spi_drv->dma.RX_DMA_ChInitStr.BlkTfrSize = 0U; + + DMA_ControllerCmd(spi_drv->config->dma_rx->Instance, ENABLE); + if (DMA_ChannelInit(spi_drv->config->dma_rx->Instance, &spi_drv->dma.RX_DMA_ChInitStr, spi_drv->config->dma_rx->dma_channel) != 0U) + { + LOG_E("Master DMA Rx channel initialization failed."); + return -RT_ERROR; + } +#endif + } + + if (spi_drv->dma.DMA_Tx_Init == RT_TRUE) + { +#if defined(SOC_SERIES_N32H7xx) + DMA_ChannelCmd(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel, DISABLE); + + if (!DMA_ControllerIsEnabled(spi_drv->config->dma_tx->Instance)) + DMA_ControllerCmd(spi_drv->config->dma_tx->Instance, ENABLE); + + spi_drv->dma.TX_DMA_ChInitStr.IntEn = 1U; + spi_drv->dma.TX_DMA_ChInitStr.SrcAddr = (uint32_t)pData; + spi_drv->dma.TX_DMA_ChInitStr.BlkTfrSize = Size; + + DMA_ControllerCmd(spi_drv->config->dma_tx->Instance, ENABLE); + if (DMA_ChannelInit(spi_drv->config->dma_tx->Instance, &spi_drv->dma.TX_DMA_ChInitStr, spi_drv->config->dma_tx->dma_channel) == 0U) + { + /* Enable transaction complete interrupt event */ + DMA_ChannelEventCmd(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, ENABLE); + + /* Enable the specified DMA channel */ + DMA_ChannelCmd(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel, ENABLE); + + SPI_I2S_EnableDma(spi_drv->config->SPIx, SPI_I2S_DMA_TX, ENABLE); + } +#endif + } + else + { + LOG_E("SPI DMA TX Mode, TX DMA did not complete initialization."); + return -RT_ERROR; + } + + /* Set SPI Direction */ + spi_drv->Direct = SPI_Tx; + + /* Check if the SPI is already enabled */ + if ((spi_drv->config->SPIx->CTRL2 & SPI_CTRL2_SPIEN) != SPI_CTRL2_SPIEN) + SPI_Enable(spi_drv->config->SPIx, ENABLE); + + return RT_EOK; +} + +static rt_err_t SPI_DMA_Receive(struct n32_spi *spi_drv, uint8_t *pData, uint16_t Size) +{ + RT_ASSERT(spi_drv != RT_NULL); + + if (spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_DOUBLELINE_FULLDUPLEX && spi_drv->SPI_InitStructure.SpiMode == SPI_MODE_MASTER) + { + return SPI_DMA_TransmitReceive(spi_drv, pData, pData, Size); + } + + if (spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_SINGLELINE_RX || + spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_SINGLELINE_TX) + { + /* Disable the sFLASH_SPI */ + SPI_Enable(spi_drv->config->SPIx, DISABLE); + /* DeInitializes the sFLASH_SPI */ + SPI_I2S_DeInit(spi_drv->config->SPIx); + /* Set the sFLASH_SPI SendOnly*/ + spi_drv->SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_RX; + SPI_Init(spi_drv->config->SPIx, &spi_drv->SPI_InitStructure); + } + + if (spi_drv->dma.DMA_Rx_Init == RT_TRUE) + { +#if defined(SOC_SERIES_N32H7xx) + DMA_ChannelCmd(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel, DISABLE); + + if (!DMA_ControllerIsEnabled(spi_drv->config->dma_rx->Instance)) + DMA_ControllerCmd(spi_drv->config->dma_rx->Instance, ENABLE); + + spi_drv->dma.RX_DMA_ChInitStr.IntEn = 1U; + spi_drv->dma.RX_DMA_ChInitStr.DstAddr = (uint32_t)pData; + spi_drv->dma.RX_DMA_ChInitStr.BlkTfrSize = Size; + + DMA_ControllerCmd(spi_drv->config->dma_rx->Instance, ENABLE); + if (DMA_ChannelInit(spi_drv->config->dma_rx->Instance, &spi_drv->dma.RX_DMA_ChInitStr, spi_drv->config->dma_rx->dma_channel) == 0U) + { + /* Enable transaction complete interrupt event */ + DMA_ChannelEventCmd(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, ENABLE); + + /* Enable the specified DMA channel */ + DMA_ChannelCmd(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel, ENABLE); + + SPI_I2S_EnableDma(spi_drv->config->SPIx, SPI_I2S_DMA_RX, ENABLE); + } +#endif + } + else + { + LOG_E("SPI DMA RX Mode, RX DMA did not complete initialization."); + return -RT_ERROR; + } + + if (spi_drv->dma.DMA_Tx_Init == RT_TRUE) + { +#if defined(SOC_SERIES_N32H7xx) + DMA_ChannelCmd(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel, DISABLE); + + if (!DMA_ControllerIsEnabled(spi_drv->config->dma_tx->Instance)) + DMA_ControllerCmd(spi_drv->config->dma_tx->Instance, ENABLE); + + spi_drv->dma.TX_DMA_ChInitStr.IntEn = 0U; + spi_drv->dma.TX_DMA_ChInitStr.SrcAddr = NULL; + spi_drv->dma.TX_DMA_ChInitStr.BlkTfrSize = 0U; + + DMA_ControllerCmd(spi_drv->config->dma_tx->Instance, ENABLE); + if (DMA_ChannelInit(spi_drv->config->dma_tx->Instance, &spi_drv->dma.TX_DMA_ChInitStr, spi_drv->config->dma_tx->dma_channel) != 0U) + { + LOG_E("Master DMA Tx channel initialization failed."); + return -RT_ERROR; + } +#endif + } + + /* Clear Over Flag */ + SPI_I2S_ReceiveData(spi_drv->config->SPIx); + SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG); + + /* Enable Error Interrupt */ + SPI_I2S_EnableInt(spi_drv->config->SPIx, SPI_I2S_INT_ERR, ENABLE); + + /* Set SPI Direction */ + spi_drv->Direct = SPI_Rx; + + /* Check if the SPI is already enabled */ + if ((spi_drv->config->SPIx->CTRL2 & SPI_CTRL2_SPIEN) != SPI_CTRL2_SPIEN) + SPI_Enable(spi_drv->config->SPIx, ENABLE); + + return RT_EOK; +} + +static rt_err_t SPI_Transmit_Receive(struct n32_spi *spi_drv, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) +{ + uint16_t Tx_Size_Const = Size; + uint16_t Tx_Size = Size; + uint16_t Rx_Size = Size; + uint32_t tickstart; + + RT_ASSERT(spi_drv != RT_NULL); + + if (!((spi_drv->SPI_InitStructure.SpiMode == SPI_MODE_MASTER) && (spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_DOUBLELINE_FULLDUPLEX))) + { + return -RT_EIO; + } + + if ((spi_drv->config->SPIx->CTRL2 & SPI_CTRL2_SPIEN) != SPI_CTRL2_SPIEN) + SPI_Enable(spi_drv->config->SPIx, ENABLE); + + if (spi_drv->SPI_InitStructure.DataLen == SPI_DATA_SIZE_16BITS) + { + if ((spi_drv->SPI_InitStructure.SpiMode == SPI_MODE_SLAVE) || (Tx_Size_Const == 1U)) + { + spi_drv->config->SPIx->DAT = *((const uint16_t *)pTxData); + pTxData += sizeof(uint16_t); + Tx_Size--; + } + + while ((Tx_Size > 0U) || (Rx_Size > 0U)) + { + if (Tx_Size > 0U) + { + tickstart = rt_tick_get(); + /* Loop while DAT register in not emplty */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_TE_FLAG) == RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("Checking TE flag timeout befor send data in full-duplex mode."); + return -RT_ETIMEOUT; + } + } + + /* Send byte through the SPI1 peripheral */ + SPI_I2S_TransmitData(spi_drv->config->SPIx, *(const uint16_t *)pTxData); + pTxData += sizeof(uint16_t); + + Tx_Size--; + } + + tickstart = rt_tick_get(); + /* Wait for DATA send has complete */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_TE_FLAG) == RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("Checking TE flag timeout after send data in full-duplex mode."); + return -RT_ETIMEOUT; + } + } + + tickstart = rt_tick_get(); + /* Wait for SPI bus idle */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_BUSY_FLAG) != RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("Checking BUSY flag timeout in full-duplex mode."); + return -RT_ETIMEOUT; + } + } + + tickstart = rt_tick_get(); + /* Wait to receive a byte */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_RNE_FLAG) == RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("Checking RNE flag timeout after send data in full-duplex mode."); + return -RT_ETIMEOUT; + } + } + + /* Return the byte read from the SPI bus */ + *((uint16_t *)pRxData) = (uint16_t)SPI_I2S_ReceiveData(spi_drv->config->SPIx); + pRxData += sizeof(uint16_t); + + Rx_Size--; + } + } + else if (spi_drv->SPI_InitStructure.DataLen == SPI_DATA_SIZE_8BITS) + { + if ((spi_drv->SPI_InitStructure.SpiMode == SPI_MODE_SLAVE) || (Tx_Size_Const == 1U)) + { + spi_drv->config->SPIx->DAT = *((const uint8_t *)pTxData); + pTxData += sizeof(uint8_t); + Tx_Size--; + } + + while ((Tx_Size > 0U) || (Rx_Size > 0U)) + { + if (Tx_Size > 0U) + { + tickstart = rt_tick_get(); + /* Loop while DAT register in not emplty */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_TE_FLAG) == RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("Checking TE flag timeout befor send data in full-duplex mode."); + return -RT_ETIMEOUT; + } + } + + /* Send byte through the SPI1 peripheral */ + SPI_I2S_TransmitData(spi_drv->config->SPIx, *(const uint8_t *)pTxData); + pTxData += sizeof(uint8_t); + + Tx_Size--; + } + + tickstart = rt_tick_get(); + /* Wait for DATA send has complete */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_TE_FLAG) == RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("Checking TE flag timeout after send data in full-duplex mode."); + return -RT_ETIMEOUT; + } + } + + tickstart = rt_tick_get(); + /* Wait for SPI bus idle */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_BUSY_FLAG) != RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("Checking BUSY flag timeout in full-duplex mode."); + return -RT_ETIMEOUT; + } + } + + tickstart = rt_tick_get(); + /* Wait to receive a byte */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_RNE_FLAG) == RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("Checking RNE flag timeout after send data in full-duplex mode."); + return -RT_ETIMEOUT; + } + } + + /*!< Return the byte read from the SPI bus */ + *((uint8_t *)pRxData) = (uint8_t)SPI_I2S_ReceiveData(spi_drv->config->SPIx); + pRxData += sizeof(uint8_t); + + Rx_Size--; + } + } + else + { + return -RT_EINVAL; + } + + if (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG) != RESET) + { + volatile uint32_t reg_tmp; + reg_tmp = spi_drv->config->SPIx->DAT; + reg_tmp = spi_drv->config->SPIx->STS; + (void)reg_tmp; + } + + return RT_EOK; +} + +static rt_err_t SPI_Transmit(struct n32_spi *spi_drv, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint16_t Tx_Size_Const = Size; + uint16_t Transfer_Size = Size; + uint32_t tickstart; + + RT_ASSERT(spi_drv != RT_NULL); + + if (spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_SINGLELINE_RX || + spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_SINGLELINE_TX) + { + /* Disable the sFLASH_SPI */ + SPI_Enable(spi_drv->config->SPIx, DISABLE); + /* DeInitializes the sFLASH_SPI */ + SPI_I2S_DeInit(spi_drv->config->SPIx); + /* Set the sFLASH_SPI SendOnly*/ + spi_drv->SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_TX; + SPI_Init(spi_drv->config->SPIx, &spi_drv->SPI_InitStructure); + } + + if ((spi_drv->config->SPIx->CTRL2 & SPI_CTRL2_SPIEN) != SPI_CTRL2_SPIEN) + SPI_Enable(spi_drv->config->SPIx, ENABLE); + + + if (spi_drv->SPI_InitStructure.DataLen == SPI_DATA_SIZE_16BITS) + { + if ((spi_drv->SPI_InitStructure.SpiMode == SPI_MODE_SLAVE) || (Tx_Size_Const == 1U)) + { + spi_drv->config->SPIx->DAT = *((const uint16_t *)pData); + pData += sizeof(uint16_t); + Transfer_Size--; + } + + while ((Transfer_Size > 0U)) + { + tickstart = rt_tick_get(); + /* Loop while DAT register in not emplty */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_TE_FLAG) == RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("Checking TE flag timeout."); + return -RT_ETIMEOUT; + } + } + + + /* Send byte through the SPI1 peripheral */ + SPI_I2S_TransmitData(spi_drv->config->SPIx, *(const uint16_t *)pData); + pData += sizeof(uint16_t); + + Transfer_Size--; + } + } + else if (spi_drv->SPI_InitStructure.DataLen == SPI_DATA_SIZE_8BITS) + { + if ((spi_drv->SPI_InitStructure.SpiMode == SPI_MODE_SLAVE) || (Tx_Size_Const == 1U)) + { + spi_drv->config->SPIx->DAT = *((const uint8_t *)pData); + pData += sizeof(uint8_t); + Transfer_Size--; + } + + while ((Transfer_Size > 0U)) + { + tickstart = rt_tick_get(); + /* Loop while DAT register in not emplty */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_TE_FLAG) == RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("Checking TE flag timeout."); + return -RT_ETIMEOUT; + } + } + + + /* Send byte through the SPI1 peripheral */ + SPI_I2S_TransmitData(spi_drv->config->SPIx, *(const uint8_t *)pData); + pData += sizeof(uint8_t); + + Transfer_Size--; + } + } + else + { + + } + + tickstart = rt_tick_get(); + /* Wait for DATA send has complete */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_TE_FLAG) == RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("After sending the data, check the TE flag for timeout."); + return -RT_ETIMEOUT; + } + } + + tickstart = rt_tick_get(); + /* Wait for SPI bus idle */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_BUSY_FLAG) != RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("After sending the data, check the BUSY flag for timeout."); + return -RT_ETIMEOUT; + } + } + + if (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG) != RESET) + { + volatile uint32_t reg_tmp; + reg_tmp = spi_drv->config->SPIx->DAT; + reg_tmp = spi_drv->config->SPIx->STS; + (void)reg_tmp; + } + + return RT_EOK; +} + + +static rt_err_t SP_Receive(struct n32_spi *spi_drv, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint16_t Transfer_Size = Size; + uint32_t tickstart; + + RT_ASSERT(spi_drv != RT_NULL); + + tickstart = rt_tick_get(); + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_RNE_FLAG) != RESET || SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG) != RESET) + { + volatile uint32_t reg_tmp; + reg_tmp = spi_drv->config->SPIx->DAT; + reg_tmp = spi_drv->config->SPIx->STS; + (void)reg_tmp; + + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("Before receiving data, check the OVER and RNE flags for timeout."); + return -RT_ETIMEOUT; + } + } + + if (spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_DOUBLELINE_FULLDUPLEX && spi_drv->SPI_InitStructure.SpiMode == SPI_MODE_MASTER) + { + return SPI_Transmit_Receive(spi_drv, pData, pData, Size, Timeout); + } + + if (spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_SINGLELINE_RX || + spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_SINGLELINE_TX) + { + /* Disable the sFLASH_SPI */ + SPI_Enable(spi_drv->config->SPIx, DISABLE); + /* DeInitializes the sFLASH_SPI */ + SPI_I2S_DeInit(spi_drv->config->SPIx); + /* Set the sFLASH_SPI SendOnly*/ + spi_drv->SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_RX; + SPI_Init(spi_drv->config->SPIx, &spi_drv->SPI_InitStructure); + } + + if ((spi_drv->config->SPIx->CTRL2 & SPI_CTRL2_SPIEN) != SPI_CTRL2_SPIEN) + SPI_Enable(spi_drv->config->SPIx, ENABLE); + + if (spi_drv->SPI_InitStructure.DataLen == SPI_DATA_SIZE_16BITS) + { + while ((Transfer_Size > 0U)) + { + tickstart = rt_tick_get(); + /* Wait to receive a byte */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_RNE_FLAG) == RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("During receiving data, check the RNE flags for timeout."); + return -RT_ETIMEOUT; + } + } + + /*!< Return the byte read from the SPI bus */ + *((uint16_t *)pData) = (uint16_t)SPI_I2S_ReceiveData(spi_drv->config->SPIx); + pData += sizeof(uint16_t); + + Transfer_Size--; + } + } + else if (spi_drv->SPI_InitStructure.DataLen == SPI_DATA_SIZE_8BITS) + { + while ((Transfer_Size > 0U)) + { + tickstart = rt_tick_get(); + /* Wait to receive a byte */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_RNE_FLAG) == RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("During receiving data, check the RNE flags for timeout."); + return -RT_ETIMEOUT; + } + } + + /*!< Return the byte read from the SPI bus */ + *((uint8_t *)pData) = (uint8_t)SPI_I2S_ReceiveData(spi_drv->config->SPIx); + pData += sizeof(uint8_t); + + Transfer_Size--; + } + } + else + { + + } + + if ((spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_DOUBLELINE_RONLY || + spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_SINGLELINE_RX) && + spi_drv->SPI_InitStructure.SpiMode == SPI_MODE_MASTER) + { + /* Disable the sFLASH_SPI */ + SPI_Enable(spi_drv->config->SPIx, DISABLE); + } + + tickstart = rt_tick_get(); + /* Wait to receive a byte */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_RNE_FLAG) == RESET) + { + spi_drv->config->SPIx->DAT; + + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("After receiving data, check the RNE flags for timeout."); + return -RT_ETIMEOUT; + } + } + + tickstart = rt_tick_get(); + /* Wait for SPI bus idle */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_BUSY_FLAG) != RESET) + { + if ((((rt_tick_get() - tickstart) >= Timeout) && (Timeout != 0xFFFFFFFFU)) || (Timeout == 0U)) + { + LOG_E("After receiving data, check the BUSY flags for timeout."); + return -RT_ETIMEOUT; + } + } + + if (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG) != RESET) + { + volatile uint32_t reg_tmp; + reg_tmp = spi_drv->config->SPIx->DAT; + reg_tmp = spi_drv->config->SPIx->STS; + (void)reg_tmp; + } + + return RT_EOK; +} + + +static rt_err_t n32_spi_init(struct n32_spi *spi_drv, struct rt_spi_configuration *cfg) +{ + RT_ASSERT(spi_drv != RT_NULL); + RT_ASSERT(cfg != RT_NULL); + + SPI_InitStruct(&spi_drv->SPI_InitStructure); + + if (cfg->mode & RT_SPI_SLAVE) + { + spi_drv->SPI_InitStructure.SpiMode = SPI_MODE_SLAVE; + } + else + { + spi_drv->SPI_InitStructure.SpiMode = SPI_MODE_MASTER; + } + + if (cfg->mode & RT_SPI_3WIRE) + { + /* Switch TX/RX direction dynamically according to the application */ + spi_drv->SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_RX; + } + else + { + spi_drv->SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX; + } + + if (cfg->data_width == 8) + { + spi_drv->SPI_InitStructure.DataLen = SPI_DATA_SIZE_8BITS; + } + else if (cfg->data_width == 16) + { + spi_drv->SPI_InitStructure.DataLen = SPI_DATA_SIZE_16BITS; + } + else + { + return -RT_EIO; + } + + if (cfg->mode & RT_SPI_CPHA) + { + spi_drv->SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE; + } + else + { + spi_drv->SPI_InitStructure.CLKPHA = SPI_CLKPHA_FIRST_EDGE; + } + + if (cfg->mode & RT_SPI_CPOL) + { + spi_drv->SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH; + } + else + { + spi_drv->SPI_InitStructure.CLKPOL = SPI_CLKPOL_LOW; + } + + spi_drv->SPI_InitStructure.NSS = SPI_NSS_SOFT; + spi_drv->SPI_InitStructure.CRCPoly = 7; + + uint32_t SPI_CLOCK = 0UL; + +#if defined(SOC_SERIES_N32H7xx) + RCC_ClocksTypeDef RCC_Clocks = { 0 }; + + RCC_GetClocksFreqValue(&RCC_Clocks); + + if ((spi_drv->config->SPIx == SPI1) || (spi_drv->config->SPIx == SPI2)) + { + SPI_CLOCK = RCC_Clocks.APB2ClkFreq; + } + else if (spi_drv->config->SPIx == SPI3) + { + SPI_CLOCK = RCC_Clocks.APB1ClkFreq; + } + else if ((spi_drv->config->SPIx == SPI4) || (spi_drv->config->SPIx == SPI5) || (spi_drv->config->SPIx == SPI6) || (spi_drv->config->SPIx == SPI7)) + { + SPI_CLOCK = RCC_Clocks.APB5ClkFreq; + } + else + { + return -RT_EIO; + } +#endif + + if (cfg->max_hz >= SPI_CLOCK / 2) + { + spi_drv->SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_2; + } + else if (cfg->max_hz >= SPI_CLOCK / 4) + { + spi_drv->SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_4; + } + else if (cfg->max_hz >= SPI_CLOCK / 8) + { + spi_drv->SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_8; + } + else if (cfg->max_hz >= SPI_CLOCK / 16) + { + spi_drv->SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_16; + } + else if (cfg->max_hz >= SPI_CLOCK / 32) + { + spi_drv->SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_32; + } + else if (cfg->max_hz >= SPI_CLOCK / 64) + { + spi_drv->SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_64; + } + else if (cfg->max_hz >= SPI_CLOCK / 128) + { + spi_drv->SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_128; + } + else + { + /* min prescaler 256 */ + spi_drv->SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_256; + } + + if (cfg->mode & RT_SPI_MSB) + { + spi_drv->SPI_InitStructure.FirstBit = SPI_FB_MSB; + } + else + { + spi_drv->SPI_InitStructure.FirstBit = SPI_FB_LSB; + } + + /* Initializes the SPIx peripheral */ + SPI_Init(spi_drv->config->SPIx, &spi_drv->SPI_InitStructure); + + /* DMA configuration */ + if (spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG) + { + if (cfg->data_width == 8) + { +#if defined(SOC_SERIES_N32H7xx) + spi_drv->dma.RX_DMA_ChInitStr.SrcTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + spi_drv->dma.RX_DMA_ChInitStr.DstTfrWidth = DMA_CH_TRANSFER_WIDTH_8; +#endif + } + else if (cfg->data_width == 16) + { +#if defined(SOC_SERIES_N32H7xx) + spi_drv->dma.RX_DMA_ChInitStr.SrcTfrWidth = DMA_CH_TRANSFER_WIDTH_16; + spi_drv->dma.RX_DMA_ChInitStr.DstTfrWidth = DMA_CH_TRANSFER_WIDTH_16; +#endif + } + + /* enable dma irq */ + NVIC_SetPriority(spi_drv->config->dma_rx->dma_irq, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)); + NVIC_EnableIRQ(spi_drv->config->dma_rx->dma_irq); + } + + if (spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) + { + if (cfg->data_width == 8) + { +#if defined(SOC_SERIES_N32H7xx) + spi_drv->dma.TX_DMA_ChInitStr.SrcTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + spi_drv->dma.TX_DMA_ChInitStr.DstTfrWidth = DMA_CH_TRANSFER_WIDTH_8; +#endif + } + else if (cfg->data_width == 16) + { +#if defined(SOC_SERIES_N32H7xx) + spi_drv->dma.TX_DMA_ChInitStr.SrcTfrWidth = DMA_CH_TRANSFER_WIDTH_16; + spi_drv->dma.TX_DMA_ChInitStr.DstTfrWidth = DMA_CH_TRANSFER_WIDTH_16; +#endif + } + + /* enable dma irq */ + NVIC_SetPriority(spi_drv->config->dma_tx->dma_irq, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 1, 0)); + NVIC_EnableIRQ(spi_drv->config->dma_tx->dma_irq); + } + + if (spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG || spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG) + { + /* enable dma irq */ + NVIC_SetPriority(spi_drv->config->irq_type, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 0)); + NVIC_EnableIRQ(spi_drv->config->irq_type); + } + + LOG_D("%s init done", spi_drv->config->bus_name); + return RT_EOK; +} + + +static rt_err_t spi_configure(struct rt_spi_device *device, + struct rt_spi_configuration *configuration) +{ + RT_ASSERT(device != RT_NULL); + RT_ASSERT(configuration != RT_NULL); + + struct n32_spi *spi_drv = rt_container_of(device->bus, struct n32_spi, spi_bus); + spi_drv->cfg = configuration; + + return n32_spi_init(spi_drv, configuration); +} + + +static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *message) +{ +#define DMA_TRANS_MIN_LEN 10 /* only buffer length >= DMA_TRANS_MIN_LEN will use DMA mode */ + + rt_err_t state = RT_EOK; + uint32_t tickstart; + rt_size_t message_length, already_send_length; + rt_uint16_t send_length; + rt_uint8_t *recv_buf; + const rt_uint8_t *send_buf; + + RT_ASSERT(device != RT_NULL); + RT_ASSERT(device->bus != RT_NULL); + RT_ASSERT(message != RT_NULL); + + struct n32_spi *spi_drv = rt_container_of(device->bus, struct n32_spi, spi_bus); + + if (message->cs_take && !(device->config.mode & RT_SPI_NO_CS) && (device->cs_pin != PIN_NONE)) + { + if (device->config.mode & RT_SPI_CS_HIGH) + { + rt_pin_write(device->cs_pin, PIN_HIGH); + } + else + { + rt_pin_write(device->cs_pin, PIN_LOW); + } + } + + LOG_D("%s transfer prepare and start", spi_drv->config->bus_name); + LOG_D("%s sendbuf: %X, recvbuf: %X, length: %d", + spi_drv->config->bus_name, + (uint32_t)message->send_buf, + (uint32_t)message->recv_buf, message->length); + + message_length = message->length; + recv_buf = message->recv_buf; + send_buf = message->send_buf; + + while (message_length) + { +#if defined(SOC_SERIES_N32H7xx) + /* DMA uses a single block, with a maximum of 4095 per block */ + if (message_length > 4095) + { + send_length = 4095; + message_length = message_length - 4095; + } + else + { + send_length = message_length; + message_length = 0; + } +#endif + + /* calculate the start address */ + already_send_length = message->length - send_length - message_length; + /* avoid null pointer problems */ + if (message->send_buf) + { + send_buf = (rt_uint8_t *)message->send_buf + already_send_length; + } + if (message->recv_buf) + { + recv_buf = (rt_uint8_t *)message->recv_buf + already_send_length; + } + + rt_uint32_t *dma_aligned_buffer = RT_NULL; + rt_uint32_t *p_txrx_buffer = RT_NULL; + + if ((spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) && (send_length >= DMA_TRANS_MIN_LEN)) + { +#if defined(SOC_SERIES_N32H7xx) + if (RT_IS_ALIGN((rt_uint32_t)send_buf, 32) && send_buf != RT_NULL) /* aligned with 32 bytes? */ + { + p_txrx_buffer = (rt_uint32_t *)send_buf; /* send_buf aligns with 32 bytes, no more operations */ + } + else + { + /* send_buf doesn't align with 32 bytes, so creat a cache buffer with 32 bytes aligned */ + dma_aligned_buffer = (rt_uint32_t *)rt_malloc_align(send_length, 32); + rt_memcpy(dma_aligned_buffer, send_buf, send_length); + p_txrx_buffer = dma_aligned_buffer; + } + rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, dma_aligned_buffer, send_length); +#else + if (RT_IS_ALIGN((rt_uint32_t)send_buf, 4) && send_buf != RT_NULL) /* aligned with 4 bytes? */ + { + p_txrx_buffer = (rt_uint32_t *)send_buf; /* send_buf aligns with 4 bytes, no more operations */ + } + else + { + /* send_buf doesn't align with 4 bytes, so creat a cache buffer with 4 bytes aligned */ + dma_aligned_buffer = (rt_uint32_t *)rt_malloc(send_length); /* aligned with RT_ALIGN_SIZE (8 bytes by default) */ + rt_memcpy(dma_aligned_buffer, send_buf, send_length); + p_txrx_buffer = dma_aligned_buffer; + } +#endif + } + + tickstart = rt_tick_get(); + /* Check the SPI RNE Flag */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_RNE_FLAG) != RESET) + { + /*clear RX buff*/ + spi_drv->config->SPIx->DAT; + + if ((rt_tick_get() - tickstart) > 1000U) + { + state = -RT_ERROR; + LOG_E("Checking the RNE flag timeout before transmission begins!"); + break; + } + } + + tickstart = rt_tick_get(); + /* Check the SPI OVER Flag */ + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG) != RESET) + { + /*clear RX buff*/ + spi_drv->config->SPIx->DAT; + SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG); + + if ((rt_tick_get() - tickstart) > 1000U) + { + state = -RT_ERROR; + LOG_E("Checking the OVER flag timeout before transmission begins!"); + break; + } + } + + /* start once data exchange in DMA mode */ + if (message->send_buf && message->recv_buf) + { + if ((spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) && (spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG) && (send_length >= DMA_TRANS_MIN_LEN)) + { + state = SPI_DMA_TransmitReceive(spi_drv, (uint8_t *)p_txrx_buffer, (uint8_t *)p_txrx_buffer, send_length); + } + else if ((spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) && (send_length >= DMA_TRANS_MIN_LEN)) + { + state = SPI_DMA_Transmit(spi_drv, (uint8_t *)p_txrx_buffer, send_length); + } + else if ((spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG) && (send_length >= DMA_TRANS_MIN_LEN)) + { + state = -RT_ERROR; + LOG_E("It shoule be enabled both BSP_SPIx_TX_USING_DMA and BSP_SPIx_TX_USING_DMA flag, if wants to use SPI DMA Rx singly."); + break; + } + else + { + state = SPI_Transmit_Receive(spi_drv, (uint8_t *)send_buf, (uint8_t *)recv_buf, send_length, 1000); + } + } + else if (message->send_buf) + { + if ((spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) && (send_length >= DMA_TRANS_MIN_LEN)) + { + state = SPI_DMA_Transmit(spi_drv, (uint8_t *)p_txrx_buffer, send_length); + } + else + { + state = SPI_Transmit(spi_drv, (uint8_t *)send_buf, send_length, 1000); + } + + if (message->cs_release && (device->config.mode & RT_SPI_3WIRE)) + { + /* release the CS by disable SPI when using 3 wires SPI */ + SPI_Enable(spi_drv->config->SPIx, DISABLE); + } + } + else if (message->recv_buf) + { + rt_memset((uint8_t *)recv_buf, 0xff, send_length); + if ((spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG) && (send_length >= DMA_TRANS_MIN_LEN)) + { + state = SPI_DMA_Receive(spi_drv, (uint8_t *)p_txrx_buffer, send_length); + } + else + { + /* clear the old error flag */ + __IO uint32_t tmpreg = 0x00U; + tmpreg = spi_drv->config->SPIx->DAT; + tmpreg = spi_drv->config->SPIx->STS; + (void)tmpreg; + + state = SP_Receive(spi_drv, (uint8_t *)recv_buf, send_length, 1000); + } + } + else + { + state = -RT_ERROR; + LOG_E("message->send_buf and message->recv_buf are both NULL!"); + } + + if (state != RT_EOK) + { + LOG_E("SPI transfer error: %d", state); + message->length = 0; + break; + } + else + { + LOG_D("%s transfer done", spi_drv->config->bus_name); + } + + /* For simplicity reasons, this example is just waiting till the end of the + transfer, but application may perform other tasks while transfer operation + is ongoing. */ + if ((spi_drv->spi_dma_flag & (SPI_USING_TX_DMA_FLAG | SPI_USING_RX_DMA_FLAG)) && (send_length >= DMA_TRANS_MIN_LEN)) + { + /* blocking the thread,and the other tasks can run */ + if (rt_completion_wait(&spi_drv->cpt, 1000) != RT_EOK) + { + state = -RT_ERROR; + LOG_E("wait for DMA interrupt overtime!"); + break; + } + } + + tickstart = rt_tick_get(); + while (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_BUSY_FLAG) != RESET) + { + if ((rt_tick_get() - tickstart) > 1000U) + { + state = -RT_ERROR; + LOG_E("Wait SPI BUSY Flag Timeout!"); + break; + } + } + + if (dma_aligned_buffer != RT_NULL) /* re-aligned, so need to copy the data to recv_buf */ + { + if (recv_buf != RT_NULL) + { +#if defined(SOC_SERIES_N32H7xx) + rt_hw_cpu_dcache_ops(RT_HW_CACHE_INVALIDATE, p_txrx_buffer, send_length); +#endif /* SOC_SERIES_N32H7xx */ + rt_memcpy(recv_buf, p_txrx_buffer, send_length); + } +#if defined(SOC_SERIES_N32H7xx) + rt_free_align(dma_aligned_buffer); +#else + rt_free(dma_aligned_buffer); +#endif /* SOC_SERIES_N32H7xx */ + } + } + + if (message->cs_release && !(device->config.mode & RT_SPI_NO_CS) && (device->cs_pin != PIN_NONE)) + { + if (device->config.mode & RT_SPI_CS_HIGH) + rt_pin_write(device->cs_pin, PIN_LOW); + else + rt_pin_write(device->cs_pin, PIN_HIGH); + } + + if (state != RT_EOK) + { + return -RT_ERROR; + } + return message->length; +} + +static const struct rt_spi_ops n32_spi_ops = +{ + .configure = spi_configure, + .xfer = spixfer, +}; + + + +static int rt_hw_spi_bus_init(void) +{ + rt_err_t result; + + for (rt_size_t i = 0; i < sizeof(spi_config) / sizeof(spi_config[0]); i++) + { + spi_bus_obj[i].config = &spi_config[i]; + spi_bus_obj[i].spi_bus.parent.user_data = &spi_config[i]; + + + if (spi_bus_obj[i].spi_dma_flag & SPI_USING_RX_DMA_FLAG) + { +#if defined(SOC_SERIES_N32H7xx) + /* Configure the SPI RX DMA for Transmission process */ + /* Enable DMA clock */ + RCC_EnableAHB1PeriphClk3(spi_bus_obj[i].config->dma_rx->dma_rcc, ENABLE); + /* Enable DMA MUXclock */ + RCC_EnableAHB1PeriphClk1(RCC_AHB1_PERIPHEN_M7_DMAMUX1, ENABLE); + + /* Receive DMA Config */ + DMA_ChannelStructInit(&spi_bus_obj[i].dma.RX_DMA_ChInitStr); + spi_bus_obj[i].dma.RX_DMA_ChInitStr.IntEn = 0x1U; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.SrcAddr = (uint32_t)&spi_bus_obj[i].config->SPIx->DAT; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.DstAddr = NULL; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.SrcTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.DstTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.DstAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_INCREMENT; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.SrcAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_NO_CHANGE; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.DstBurstLen = DMA_CH_BURST_LENGTH_1; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.SrcBurstLen = DMA_CH_BURST_LENGTH_1; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.SrcGatherEn = 0x0U; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.DstScatterEn = 0x0U; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.TfrTypeFlowCtrl = DMA_CH_TRANSFER_FLOW_P2M_DMA; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.BlkTfrSize = 0U; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.pLinkListItem = NULL; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.SrcGatherInterval = 0x0U; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.SrcGatherCount = 0x0U; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.DstScatterInterval = 0x0U; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.DstScatterCount = 0x0U; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.TfrType = DMA_CH_TRANSFER_TYPE_SINGLE_BLOCK; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.ChannelPriority = DMA_CH_PRIORITY_7; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.SrcHandshaking = DMA_CH_SRC_HANDSHAKING_HARDWARE; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.DstHandshaking = DMA_CH_DST_HANDSHAKING_SOFTWARE; + spi_bus_obj[i].dma.RX_DMA_ChInitStr.SrcHsInterface = spi_bus_obj[i].config->dma_rx->HsInterface; + + /* DMA controller must be enabled before initializing the channel */ + DMA_ControllerCmd(spi_bus_obj[i].config->dma_rx->Instance, ENABLE); + + /* Initialize the specified DMA channel and Whether the specified channel was successfully initialized */ + if (DMA_ChannelInit(spi_bus_obj[i].config->dma_rx->Instance, &spi_bus_obj[i].dma.RX_DMA_ChInitStr, spi_bus_obj[i].config->dma_rx->dma_channel) == 0U) + { + /* Configure DMAMUX */ + DMAMUX_SetRequestID(DMAMUX1_ID, spi_bus_obj[i].config->dma_rx->dmamux_channel, spi_bus_obj[i].config->dma_rx->dmamux_request); + + spi_bus_obj[i].dma.DMA_Rx_Init = RT_TRUE; + } + else + { + LOG_E("SPI RX DMA channel initialization failed!"); + return -RT_ERROR; + } +#endif + } + + if (spi_bus_obj[i].spi_dma_flag & SPI_USING_TX_DMA_FLAG) + { +#if defined(SOC_SERIES_N32H7xx) + /* Configure the SPI TX DMA for Transmission process */ + /* Enable DMA clock */ + RCC_EnableAHB1PeriphClk3(spi_bus_obj[i].config->dma_tx->dma_rcc, ENABLE); + /* Enable DMA MUXclock */ + RCC_EnableAHB1PeriphClk1(RCC_AHB1_PERIPHEN_M7_DMAMUX1, ENABLE); + + /* SPI_MASTER_Tx_DMA_Channel DMA1 Channel1 configuration ---------------------------------------------*/ + DMA_ChannelStructInit(&spi_bus_obj[i].dma.TX_DMA_ChInitStr); + spi_bus_obj[i].dma.TX_DMA_ChInitStr.IntEn = 0x1U; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.DstAddr = (uint32_t)&spi_bus_obj[i].config->SPIx->DAT; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.SrcAddr = NULL; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.SrcTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.DstTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.DstAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_NO_CHANGE; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.SrcAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_INCREMENT; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.DstBurstLen = DMA_CH_BURST_LENGTH_1; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.SrcBurstLen = DMA_CH_BURST_LENGTH_1; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.SrcGatherEn = 0x0U; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.DstScatterEn = 0x0U; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.TfrTypeFlowCtrl = DMA_CH_TRANSFER_FLOW_M2P_DMA; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.BlkTfrSize = 0U; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.pLinkListItem = NULL; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.SrcGatherInterval = 0x0U; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.SrcGatherCount = 0x0U; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.DstScatterInterval = 0x0U; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.DstScatterCount = 0x0U; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.TfrType = DMA_CH_TRANSFER_TYPE_SINGLE_BLOCK; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.ChannelPriority = DMA_CH_PRIORITY_7; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.SrcHandshaking = DMA_CH_SRC_HANDSHAKING_SOFTWARE; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.DstHandshaking = DMA_CH_DST_HANDSHAKING_HARDWARE; + spi_bus_obj[i].dma.TX_DMA_ChInitStr.DstHsInterface = spi_bus_obj[i].config->dma_tx->HsInterface; + + /* DMA controller must be enabled before initializing the channel */ + DMA_ControllerCmd(spi_bus_obj[i].config->dma_tx->Instance, ENABLE); + + /* Initialize the specified DMA channel and Whether the specified channel was successfully initialized */ + if (DMA_ChannelInit(spi_bus_obj[i].config->dma_tx->Instance, &spi_bus_obj[i].dma.TX_DMA_ChInitStr, spi_bus_obj[i].config->dma_tx->dma_channel) == 0U) + { + /* Configure DMAMUX */ + DMAMUX_SetRequestID(DMAMUX1_ID, spi_bus_obj[i].config->dma_tx->dmamux_channel, spi_bus_obj[i].config->dma_tx->dmamux_request); + + spi_bus_obj[i].dma.DMA_Tx_Init = RT_TRUE; + } + else + { + LOG_E("SPI TX DMA channel initialization failed!"); + return -RT_ERROR; + } +#endif + } + + + /* initialize completion object */ + rt_completion_init(&spi_bus_obj[i].cpt); + + result = rt_spi_bus_register(&spi_bus_obj[i].spi_bus, spi_config[i].bus_name, &n32_spi_ops); + RT_ASSERT(result == RT_EOK); + + LOG_D("%s bus init done", spi_config[i].bus_name); + } + + return result; +} + + +/** + * Attach the spi device to SPI bus, this function must be used after initialization. + */ +rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, rt_base_t cs_pin) +{ + RT_ASSERT(bus_name != RT_NULL); + RT_ASSERT(device_name != RT_NULL); + + rt_err_t result; + struct rt_spi_device *spi_device; + + /* attach the device to spi bus*/ + spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device)); + RT_ASSERT(spi_device != RT_NULL); + + result = rt_spi_bus_attach_device_cspin(spi_device, device_name, bus_name, cs_pin, RT_NULL); + if (result != RT_EOK) + { + LOG_E("%s attach to %s faild, %d\n", device_name, bus_name, result); + } + + RT_ASSERT(result == RT_EOK); + + LOG_D("%s attach to %s done", device_name, bus_name); + + return result; +} + + +#if defined(BSP_SPI1_RX_USING_DMA) || defined(BSP_SPI1_TX_USING_DMA) || \ + defined(BSP_SPI2_RX_USING_DMA) || defined(BSP_SPI2_TX_USING_DMA) || \ + defined(BSP_SPI3_RX_USING_DMA) || defined(BSP_SPI3_TX_USING_DMA) || \ + defined(BSP_SPI4_RX_USING_DMA) || defined(BSP_SPI4_TX_USING_DMA) || \ + defined(BSP_SPI5_RX_USING_DMA) || defined(BSP_SPI5_TX_USING_DMA) || \ + defined(BSP_SPI6_RX_USING_DMA) || defined(BSP_SPI6_TX_USING_DMA) || \ + defined(BSP_SPI7_RX_USING_DMA) || defined(BSP_SPI7_TX_USING_DMA) +static void spi_isr(struct n32_spi *spi_drv) +{ + if (SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG) == SET) + { + SPI_I2S_EnableDma(spi_drv->config->SPIx, SPI_I2S_DMA_TX | SPI_I2S_DMA_RX, DISABLE); + + if (spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) + { +#if defined(SOC_SERIES_N32H7xx) + DMA_ChannelEventCmd(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, DISABLE); +#endif + } + + if (spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG) + { +#if defined(SOC_SERIES_N32H7xx) + DMA_ChannelEventCmd(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, DISABLE); +#endif + } + + SPI_I2S_EnableInt(spi_drv->config->SPIx, SPI_I2S_INT_ERR, DISABLE); + + SPI_I2S_ReceiveData(spi_drv->config->SPIx); + SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG); + } +} + +#if defined(BSP_SPI1_RX_USING_DMA) || \ + defined(BSP_SPI2_RX_USING_DMA) || \ + defined(BSP_SPI3_RX_USING_DMA) || \ + defined(BSP_SPI4_RX_USING_DMA) || \ + defined(BSP_SPI5_RX_USING_DMA) || \ + defined(BSP_SPI6_RX_USING_DMA) || \ + defined(BSP_SPI7_RX_USING_DMA) +static void spi_rx_dma_isr(struct n32_spi *spi_drv) +{ +#if defined(SOC_SERIES_N32H7xx) + if (DMA_GetCombinedStatus(spi_drv->config->dma_rx->Instance)) + { + if (DMA_GetChannelIntTfrStatus(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel) == SET) + { +#endif + if (spi_drv->Direct == SPI_Tx_Rx) + { + SPI_I2S_EnableInt(spi_drv->config->SPIx, SPI_I2S_INT_ERR, DISABLE); + +#if defined(SOC_SERIES_N32H7xx) + DMA_ChannelEventCmd(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, DISABLE); + DMA_ChannelEventCmd(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, DISABLE); +#endif + + if (spi_drv->SPI_InitStructure.SpiMode == SPI_MODE_MASTER && spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_DOUBLELINE_FULLDUPLEX) + { + SPI_I2S_EnableDma(spi_drv->config->SPIx, SPI_I2S_DMA_TX | SPI_I2S_DMA_RX, DISABLE); + } + + SPI_I2S_ReceiveData(spi_drv->config->SPIx); + SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG); + + spi_drv->Direct = SPI_Idle; + rt_completion_done(&spi_drv->cpt); + } + else if (spi_drv->Direct == SPI_Rx) + { + if (spi_drv->SPI_InitStructure.SpiMode == SPI_MODE_MASTER && (spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_SINGLELINE_RX || + spi_drv->SPI_InitStructure.DataDirection == SPI_DIR_DOUBLELINE_RONLY)) + { + SPI_Enable(spi_drv->config->SPIx, DISABLE); + } + + SPI_I2S_EnableDma(spi_drv->config->SPIx, SPI_I2S_DMA_RX, DISABLE); + + SPI_I2S_EnableInt(spi_drv->config->SPIx, SPI_I2S_INT_ERR, DISABLE); + +#if defined(SOC_SERIES_N32H7xx) + DMA_ChannelEventCmd(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, DISABLE); +#endif + + SPI_I2S_ReceiveData(spi_drv->config->SPIx); + SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG); + + spi_drv->Direct = SPI_Idle; + rt_completion_done(&spi_drv->cpt); + } + +#if defined(SOC_SERIES_N32H7xx) + /* Clear interrupt event status */ + DMA_ClearChannelEventStatus(spi_drv->config->dma_rx->Instance, spi_drv->config->dma_rx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE); +#endif + } + } +} +#endif + +static void spi_tx_dma_isr(struct n32_spi *spi_drv) +{ +#if defined(SOC_SERIES_N32H7xx) + if (DMA_GetCombinedStatus(spi_drv->config->dma_tx->Instance)) + { + if (DMA_GetChannelIntTfrStatus(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel) == SET) + { +#endif + if (spi_drv->Direct == SPI_Tx) + { + DMA_ChannelEventCmd(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, DISABLE); + + SPI_I2S_EnableDma(spi_drv->config->SPIx, SPI_I2S_DMA_TX, DISABLE); + + SPI_I2S_ReceiveData(spi_drv->config->SPIx); + SPI_I2S_GetStatus(spi_drv->config->SPIx, SPI_I2S_OVER_FLAG); + + spi_drv->Direct = SPI_Idle; + rt_completion_done(&spi_drv->cpt); + } + + /* Clear interrupt event status */ + DMA_ClearChannelEventStatus(spi_drv->config->dma_tx->Instance, spi_drv->config->dma_tx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE); + } + } +} +#endif + +#if defined(BSP_SPI1_TX_USING_DMA) || defined(BSP_SPI1_RX_USING_DMA) +void SPI1_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_isr(&spi_bus_obj[SPI1_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_SPI1_TX_USING_DMA) || defined(BSP_SPI1_RX_USING_DMA) */ +#if defined(BSP_USING_SPI1) && defined(BSP_SPI1_RX_USING_DMA) +void SPI1_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_rx_dma_isr(&spi_bus_obj[SPI1_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI1) && defined(BSP_SPI1_RX_USING_DMA) */ +#if defined(BSP_USING_SPI1) && defined(BSP_SPI1_TX_USING_DMA) +void SPI1_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_tx_dma_isr(&spi_bus_obj[SPI1_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI1) && defined(BSP_SPI1_TX_USING_DMA) */ + + +#if defined(BSP_SPI2_TX_USING_DMA) || defined(BSP_SPI2_RX_USING_DMA) +void SPI2_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_isr(&spi_bus_obj[SPI2_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_SPI2_TX_USING_DMA) || defined(BSP_SPI2_RX_USING_DMA) */ +#if defined(BSP_USING_SPI2) && defined(BSP_SPI2_RX_USING_DMA) +void SPI2_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_rx_dma_isr(&spi_bus_obj[SPI2_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI2) && defined(BSP_SPI2_RX_USING_DMA) */ +#if defined(BSP_USING_SPI2) && defined(BSP_SPI2_TX_USING_DMA) +void SPI2_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_tx_dma_isr(&spi_bus_obj[SPI2_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI2) && defined(BSP_SPI2_TX_USING_DMA) */ + + + +#if defined(BSP_SPI3_TX_USING_DMA) || defined(BSP_SPI3_RX_USING_DMA) +void SPI3_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_isr(&spi_bus_obj[SPI3_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_SPI3_TX_USING_DMA) || defined(BSP_SPI3_RX_USING_DMA) */ +#if defined(BSP_USING_SPI3) && defined(BSP_SPI3_RX_USING_DMA) +void SPI3_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_rx_dma_isr(&spi_bus_obj[SPI3_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI3) && defined(BSP_SPI3_RX_USING_DMA) */ +#if defined(BSP_USING_SPI3) && defined(BSP_SPI3_TX_USING_DMA) +void SPI3_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_tx_dma_isr(&spi_bus_obj[SPI3_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI3) && defined(BSP_SPI3_TX_USING_DMA) */ + + + +#if defined(BSP_SPI4_TX_USING_DMA) || defined(BSP_SPI4_RX_USING_DMA) +void SPI4_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_isr(&spi_bus_obj[SPI4_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_SPI4_TX_USING_DMA) || defined(BSP_SPI4_RX_USING_DMA) */ +#if defined(BSP_USING_SPI4) && defined(BSP_SPI4_RX_USING_DMA) +void SPI4_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_rx_dma_isr(&spi_bus_obj[SPI4_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI4) && defined(BSP_SPI4_RX_USING_DMA) */ +#if defined(BSP_USING_SPI4) && defined(BSP_SPI4_TX_USING_DMA) +void SPI4_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_tx_dma_isr(&spi_bus_obj[SPI4_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI4) && defined(BSP_SPI4_TX_USING_DMA) */ + + + + +#if defined(BSP_SPI5_TX_USING_DMA) || defined(BSP_SPI5_RX_USING_DMA) +void SPI5_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_isr(&spi_bus_obj[SPI5_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_SPI5_TX_USING_DMA) || defined(BSP_SPI5_RX_USING_DMA) */ +#if defined(BSP_USING_SPI5) && defined(BSP_SPI5_RX_USING_DMA) +void SPI5_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_rx_dma_isr(&spi_bus_obj[SPI5_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI5) && defined(BSP_SPI5_RX_USING_DMA) */ +#if defined(BSP_USING_SPI5) && defined(BSP_SPI5_TX_USING_DMA) +void SPI5_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_tx_dma_isr(&spi_bus_obj[SPI5_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI5) && defined(BSP_SPI5_TX_USING_DMA) */ + + + + +#if defined(BSP_SPI6_TX_USING_DMA) || defined(BSP_SPI6_RX_USING_DMA) +void SPI6_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_isr(&spi_bus_obj[SPI6_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_SPI6_TX_USING_DMA) || defined(BSP_SPI6_RX_USING_DMA) */ +#if defined(BSP_USING_SPI6) && defined(BSP_SPI6_RX_USING_DMA) +void SPI6_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_rx_dma_isr(&spi_bus_obj[SPI6_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI6) && defined(BSP_SPI6_RX_USING_DMA) */ +#if defined(BSP_USING_SPI6) && defined(BSP_SPI6_TX_USING_DMA) +void SPI6_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_tx_dma_isr(&spi_bus_obj[SPI6_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI6) && defined(BSP_SPI6_TX_USING_DMA) */ + + + +#if defined(BSP_SPI7_TX_USING_DMA) || defined(BSP_SPI7_RX_USING_DMA) +void SPI7_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_isr(&spi_bus_obj[SPI7_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_SPI7_TX_USING_DMA) || defined(BSP_SPI7_RX_USING_DMA) */ +#if defined(BSP_USING_SPI7) && defined(BSP_SPI7_RX_USING_DMA) +void SPI7_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_rx_dma_isr(&spi_bus_obj[SPI7_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI7) && defined(BSP_SPI7_RX_USING_DMA) */ +#if defined(BSP_USING_SPI7) && defined(BSP_SPI7_TX_USING_DMA) +void SPI7_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + spi_tx_dma_isr(&spi_bus_obj[SPI7_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(BSP_USING_SPI7) && defined(BSP_SPI7_TX_USING_DMA) */ + +static void n32_spi_get_dma_config(void) +{ +#ifdef BSP_USING_SPI1 + spi_bus_obj[SPI1_INDEX].spi_dma_flag = 0; +#ifdef BSP_SPI1_RX_USING_DMA + spi_bus_obj[SPI1_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi1_dma_rx = SPI1_RX_DMA_CONFIG; + spi_config[SPI1_INDEX].dma_rx = &spi1_dma_rx; +#endif /* BSP_SPI1_RX_USING_DMA */ +#ifdef BSP_SPI1_TX_USING_DMA + spi_bus_obj[SPI1_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi1_dma_tx = SPI1_TX_DMA_CONFIG; + spi_config[SPI1_INDEX].dma_tx = &spi1_dma_tx; +#endif /* BSP_SPI1_TX_USING_DMA */ +#endif /* BSP_USING_SPI1 */ + +#ifdef BSP_USING_SPI2 + spi_bus_obj[SPI2_INDEX].spi_dma_flag = 0; +#ifdef BSP_SPI2_RX_USING_DMA + spi_bus_obj[SPI2_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi2_dma_rx = SPI2_RX_DMA_CONFIG; + spi_config[SPI2_INDEX].dma_rx = &spi2_dma_rx; +#endif /* BSP_SPI2_RX_USING_DMA */ +#ifdef BSP_SPI2_TX_USING_DMA + spi_bus_obj[SPI2_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi2_dma_tx = SPI2_TX_DMA_CONFIG; + spi_config[SPI2_INDEX].dma_tx = &spi2_dma_tx; +#endif /* BSP_SPI2_TX_USING_DMA */ +#endif /* BSP_USING_SPI2 */ + +#ifdef BSP_USING_SPI3 + spi_bus_obj[SPI3_INDEX].spi_dma_flag = 0; +#ifdef BSP_SPI3_RX_USING_DMA + spi_bus_obj[SPI3_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi3_dma_rx = SPI3_RX_DMA_CONFIG; + spi_config[SPI3_INDEX].dma_rx = &spi3_dma_rx; +#endif /* BSP_SPI3_RX_USING_DMA */ +#ifdef BSP_SPI3_TX_USING_DMA + spi_bus_obj[SPI3_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi3_dma_tx = SPI3_TX_DMA_CONFIG; + spi_config[SPI3_INDEX].dma_tx = &spi3_dma_tx; +#endif /* BSP_SPI3_TX_USING_DMA */ +#endif /* BSP_USING_SPI3 */ + +#ifdef BSP_USING_SPI4 + spi_bus_obj[SPI4_INDEX].spi_dma_flag = 0; +#ifdef BSP_SPI4_RX_USING_DMA + spi_bus_obj[SPI4_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi4_dma_rx = SPI4_RX_DMA_CONFIG; + spi_config[SPI4_INDEX].dma_rx = &spi4_dma_rx; +#endif /* BSP_SPI4_RX_USING_DMA */ +#ifdef BSP_SPI4_TX_USING_DMA + spi_bus_obj[SPI4_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi4_dma_tx = SPI4_TX_DMA_CONFIG; + spi_config[SPI4_INDEX].dma_tx = &spi4_dma_tx; +#endif /* BSP_SPI4_TX_USING_DMA */ +#endif /* BSP_USING_SPI4 */ + +#ifdef BSP_USING_SPI5 + spi_bus_obj[SPI5_INDEX].spi_dma_flag = 0; +#ifdef BSP_SPI5_RX_USING_DMA + spi_bus_obj[SPI5_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi5_dma_rx = SPI5_RX_DMA_CONFIG; + spi_config[SPI5_INDEX].dma_rx = &spi5_dma_rx; +#endif /* BSP_SPI5_RX_USING_DMA */ +#ifdef BSP_SPI5_TX_USING_DMA + spi_bus_obj[SPI5_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi5_dma_tx = SPI5_TX_DMA_CONFIG; + spi_config[SPI5_INDEX].dma_tx = &spi5_dma_tx; +#endif /* BSP_SPI5_TX_USING_DMA */ +#endif /* BSP_USING_SPI5 */ + +#ifdef BSP_USING_SPI6 + spi_bus_obj[SPI6_INDEX].spi_dma_flag = 0; +#ifdef BSP_SPI6_RX_USING_DMA + spi_bus_obj[SPI6_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi6_dma_rx = SPI6_RX_DMA_CONFIG; + spi_config[SPI6_INDEX].dma_rx = &spi6_dma_rx; +#endif /* BSP_SPI6_RX_USING_DMA */ +#ifdef BSP_SPI6_TX_USING_DMA + spi_bus_obj[SPI6_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi6_dma_tx = SPI6_TX_DMA_CONFIG; + spi_config[SPI6_INDEX].dma_tx = &spi6_dma_tx; +#endif /* BSP_SPI6_TX_USING_DMA */ +#endif /* BSP_USING_SPI6 */ + +#ifdef BSP_USING_SPI7 + spi_bus_obj[SPI7_INDEX].spi_dma_flag = 0; +#ifdef BSP_SPI7_RX_USING_DMA + spi_bus_obj[SPI7_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi7_dma_rx = SPI7_RX_DMA_CONFIG; + spi_config[SPI7_INDEX].dma_rx = &spi7_dma_rx; +#endif /* BSP_SPI7_RX_USING_DMA */ +#ifdef BSP_SPI7_TX_USING_DMA + spi_bus_obj[SPI7_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi7_dma_tx = SPI7_TX_DMA_CONFIG; + spi_config[SPI7_INDEX].dma_tx = &spi7_dma_tx; +#endif /* BSP_SPI7_TX_USING_DMA */ +#endif /* BSP_USING_SPI7 */ +} + + +int rt_hw_spi_init(void) +{ + n32_spi_get_dma_config(); + return rt_hw_spi_bus_init(); +} +INIT_BOARD_EXPORT(rt_hw_spi_init); + + +#endif /* BSP_USING_SPI1 || BSP_USING_SPI2 || BSP_USING_SPI3 || BSP_USING_SPI4 || BSP_USING_SPI5 || BSP_USING_SPI6 || BSP_USING_SPI7 */ +#endif /* BSP_USING_SPI */ + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_spi.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_spi.h new file mode 100644 index 0000000000..d34d610bed --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_spi.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __DRV_SPI_H__ +#define __DRV_SPI_H__ + +#include +#include "rtdevice.h" +#include +#include +#include "drv_dma.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, rt_base_t cs_pin); + +#ifdef __cplusplus +} +#endif + +struct n32_spi_config +{ + SPI_Module *SPIx; + char *bus_name; + IRQn_Type irq_type; + struct dma_config *dma_rx, *dma_tx; +}; + +struct n32_spi_device +{ + rt_uint32_t pin; + char *bus_name; + char *device_name; +}; + + +#define SPI_USING_RX_DMA_FLAG (1<<0) +#define SPI_USING_TX_DMA_FLAG (1<<1) + +typedef enum +{ + SPI_Tx_Rx = 0U, + SPI_Tx, + SPI_Rx, + SPI_Idle, +} SPI_Work_Direct_t; + +/* n32 spi dirver class */ +struct n32_spi +{ + struct n32_spi_config *config; + struct rt_spi_configuration *cfg; + + SPI_InitType SPI_InitStructure; + SPI_Work_Direct_t Direct; + + struct + { + rt_bool_t DMA_Tx_Init; + DMA_ChInitType TX_DMA_ChInitStr; + + rt_bool_t DMA_Rx_Init; + DMA_ChInitType RX_DMA_ChInitStr; + } dma; + + rt_uint8_t spi_dma_flag; + struct rt_spi_bus spi_bus; + + struct rt_completion cpt; +}; + +#endif /*__DRV_SPI_H__ */ diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_usart.c b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_usart.c new file mode 100644 index 0000000000..a32b9ff8ab --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_usart.c @@ -0,0 +1,1699 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + + +#include "board.h" +#include "drv_usart.h" +#include "drv_config.h" + +#ifdef RT_USING_SERIAL + +//#define DRV_DEBUG +#define LOG_TAG "drv.usart" +#include + + +#if !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && !defined(BSP_USING_UART3) && \ + !defined(BSP_USING_UART4) && !defined(BSP_USING_UART5) && !defined(BSP_USING_UART6) && \ + !defined(BSP_USING_UART7) && !defined(BSP_USING_UART8) && !defined(BSP_USING_UART9) && \ + !defined(BSP_USING_UART10) && !defined(BSP_USING_UART11) && !defined(BSP_USING_UART12) && \ + !defined(BSP_USING_UART13) && !defined(BSP_USING_UART14) && !defined(BSP_USING_UART15) && \ + !defined(BSP_USING_LPUART1) && !defined(BSP_USING_LPUART2) + #error "Please define at least one BSP_USING_UARTx" + /* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */ +#endif + +#ifdef RT_SERIAL_USING_DMA + static rt_err_t UART_DMA_Transmit(struct n32_uart *uart); +#endif + +enum +{ +#ifdef BSP_USING_UART1 + UART1_INDEX, +#endif +#ifdef BSP_USING_UART2 + UART2_INDEX, +#endif +#ifdef BSP_USING_UART3 + UART3_INDEX, +#endif +#ifdef BSP_USING_UART4 + UART4_INDEX, +#endif +#ifdef BSP_USING_UART5 + UART5_INDEX, +#endif +#ifdef BSP_USING_UART6 + UART6_INDEX, +#endif +#ifdef BSP_USING_UART7 + UART7_INDEX, +#endif +#ifdef BSP_USING_UART8 + UART8_INDEX, +#endif +#ifdef BSP_USING_UART9 + UART9_INDEX, +#endif +#ifdef BSP_USING_UART10 + UART10_INDEX, +#endif +#ifdef BSP_USING_UART11 + UART11_INDEX, +#endif +#ifdef BSP_USING_UART12 + UART12_INDEX, +#endif +#ifdef BSP_USING_UART13 + UART13_INDEX, +#endif +#ifdef BSP_USING_UART14 + UART14_INDEX, +#endif +#ifdef BSP_USING_UART15 + UART15_INDEX, +#endif +#ifdef BSP_USING_LPUART1 + LPUART1_INDEX, +#endif +#ifdef BSP_USING_LPUART2 + LPUART2_INDEX, +#endif +}; + +static struct n32_uart_config uart_config[] = +{ +#ifdef BSP_USING_UART1 + UART1_CONFIG, +#endif +#ifdef BSP_USING_UART2 + UART2_CONFIG, +#endif +#ifdef BSP_USING_UART3 + UART3_CONFIG, +#endif +#ifdef BSP_USING_UART4 + UART4_CONFIG, +#endif +#ifdef BSP_USING_UART5 + UART5_CONFIG, +#endif +#ifdef BSP_USING_UART6 + UART6_CONFIG, +#endif +#ifdef BSP_USING_UART7 + UART7_CONFIG, +#endif +#ifdef BSP_USING_UART8 + UART8_CONFIG, +#endif +#ifdef BSP_USING_UART9 + UART9_CONFIG, +#endif +#ifdef BSP_USING_UART10 + UART10_CONFIG, +#endif +#ifdef BSP_USING_UART11 + UART11_CONFIG, +#endif +#ifdef BSP_USING_UART12 + UART12_CONFIG, +#endif +#ifdef BSP_USING_UART13 + UART13_CONFIG, +#endif +#ifdef BSP_USING_UART14 + UART14_CONFIG, +#endif +#ifdef BSP_USING_UART15 + UART15_CONFIG, +#endif +#ifdef BSP_USING_LPUART1 + LPUART1_CONFIG, +#endif +#ifdef BSP_USING_LPUART2 + LPUART2_CONFIG, +#endif +}; + +static struct n32_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = { 0 }; + +#ifdef RT_SERIAL_USING_DMA +static void dma_recv_callback(struct rt_serial_device *serial, rt_uint8_t isr_flag) +{ + struct n32_uart *uart; + rt_base_t level; + rt_size_t recv_len, read_len; + + RT_ASSERT(serial != RT_NULL); + uart = rt_container_of(serial, struct n32_uart, serial); + + level = rt_hw_interrupt_disable(); + recv_len = 0; + + read_len = DMA_GetTransferredNumber(uart->config->dma_rx->Instance, uart->config->dma_rx->dma_channel); + + switch (isr_flag) + { + case UART_RX_DMA_IT_IDLE_FLAG: + { + if (uart->dma.rx_dma.block_has_recv_cnt != 0) + { + recv_len = read_len - uart->dma.rx_dma.block_has_recv_cnt; + } + else + { + recv_len = read_len; + } + uart->dma.rx_dma.block_has_recv_cnt = read_len; + + break; + } + case UART_RX_DMA_IT_BLOCK_TC_FLAG: + { + if (uart->dma.rx_dma.block_has_recv_cnt != 0) + { + recv_len = read_len - uart->dma.rx_dma.block_has_recv_cnt; + uart->dma.rx_dma.block_has_recv_cnt = 0; + } + else + { + recv_len = DMA_BLOCK_SIZE; + } + break; + } + + default: + break; + } + + if (recv_len) + { + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); + } + rt_hw_interrupt_enable(level); +} + + +#if defined(BSP_UART1_RX_USING_DMA) || defined(BSP_UART2_RX_USING_DMA) || defined(BSP_UART3_RX_USING_DMA) || \ + defined(BSP_UART4_RX_USING_DMA) || defined(BSP_UART5_RX_USING_DMA) || defined(BSP_UART6_RX_USING_DMA) || \ + defined(BSP_UART7_RX_USING_DMA) || defined(BSP_UART8_RX_USING_DMA) || defined(BSP_UART9_RX_USING_DMA) || \ + defined(BSP_UART10_RX_USING_DMA) || defined(BSP_UART11_RX_USING_DMA) || defined(BSP_UART12_RX_USING_DMA) || \ + defined(BSP_UART13_RX_USING_DMA) || defined(BSP_UART14_RX_USING_DMA) || defined(BSP_UART15_RX_USING_DMA) + +static void uart_rx_dma_isr(struct n32_uart *uart_drv) +{ +#if defined(SOC_SERIES_N32H7xx) + if (DMA_GetCombinedStatus(uart_drv->config->dma_rx->Instance)) + { + if (DMA_GetChannelIntBlockStatus(uart_drv->config->dma_rx->Instance, uart_drv->config->dma_rx->dma_channel) != RESET) + { + dma_recv_callback(&uart_drv->serial, UART_RX_DMA_IT_BLOCK_TC_FLAG); + + /* Clear interrupt event status */ + DMA_ClearChannelEventStatus(uart_drv->config->dma_rx->Instance, uart_drv->config->dma_rx->dma_channel, DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE); + } + } +#endif +} +#endif + +#if defined(BSP_UART1_TX_USING_DMA) || defined(BSP_UART2_TX_USING_DMA) || defined(BSP_UART3_TX_USING_DMA) || \ + defined(BSP_UART4_TX_USING_DMA) || defined(BSP_UART5_TX_USING_DMA) || defined(BSP_UART6_TX_USING_DMA) || \ + defined(BSP_UART7_TX_USING_DMA) || defined(BSP_UART8_TX_USING_DMA) || defined(BSP_UART9_TX_USING_DMA) || \ + defined(BSP_UART10_TX_USING_DMA) || defined(BSP_UART11_TX_USING_DMA) || defined(BSP_UART12_TX_USING_DMA) || \ + defined(BSP_UART13_TX_USING_DMA) || defined(BSP_UART14_TX_USING_DMA) || defined(BSP_UART15_TX_USING_DMA) + +static void uart_tx_dma_isr(struct n32_uart *uart_drv) +{ + rt_base_t level; + + level = rt_hw_interrupt_disable(); + +#if defined(SOC_SERIES_N32H7xx) + if (DMA_GetCombinedStatus(uart_drv->config->dma_tx->Instance)) + { + if (DMA_GetChannelIntTfrStatus(uart_drv->config->dma_tx->Instance, uart_drv->config->dma_tx->dma_channel) == SET) + { + DMA_ChannelEventCmd(uart_drv->config->dma_tx->Instance, uart_drv->config->dma_tx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, DISABLE); + + USART_EnableDMA(uart_drv->config->Instance, USART_DMAREQ_TX, DISABLE); + + DMA_ChannelCmd(uart_drv->config->dma_tx->Instance, uart_drv->config->dma_tx->dma_channel, DISABLE); + + /* Clear interrupt event status */ + DMA_ClearChannelEventStatus(uart_drv->config->dma_tx->Instance, uart_drv->config->dma_tx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE); + + if (uart_drv->dma.tx_dma.already_send_length < uart_drv->dma.tx_dma.record_length) + { + UART_DMA_Transmit(uart_drv); + } + else + { + /* DMA TX Complete + * 1. All data has been completely transmitted. + */ + rt_hw_serial_isr(&uart_drv->serial, RT_SERIAL_EVENT_TX_DMADONE); + } + } + } +#endif + + rt_hw_interrupt_enable(level); +} +#endif /* RT_SERIAL_USING_DMA */ + + +static void N32_UART_DMA_Config(struct rt_serial_device *serial, rt_ubase_t flag) +{ + rt_size_t i = 0; + rt_err_t result = RT_EOK; + struct n32_uart *uart; + struct rt_serial_rx_fifo *rx_fifo = RT_NULL; + + RT_ASSERT(serial != RT_NULL); + RT_ASSERT(flag == RT_DEVICE_FLAG_DMA_TX || flag == RT_DEVICE_FLAG_DMA_RX); + uart = rt_container_of(serial, struct n32_uart, serial); + + /* DMA Initialize */ + if (RT_DEVICE_FLAG_DMA_RX == flag) + { + rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; + + uart->dma.RX_DMA_ChInitStr.DstAddr = (uint32_t)rx_fifo->buffer; + + /* Set LLI control information */ + for (i = 0; i < uart->dma.rx_dma.block_num; i++) + { + uart->dma.rx_dma.Read_LinkList[i].DstAddr = (uint32_t)(((uint8_t *)rx_fifo->buffer) + i * DMA_BLOCK_SIZE); + } + + if (!DMA_ControllerIsEnabled(uart->config->dma_rx->Instance)) + DMA_ControllerCmd(uart->config->dma_rx->Instance, ENABLE); + + /* Initialize the specified DMA channel and Whether the specified channel was successfully initialized */ + if (DMA_ChannelInit(uart->config->dma_rx->Instance, &uart->dma.RX_DMA_ChInitStr, uart->config->dma_rx->dma_channel) == 0U) + { + /* Enable the specified DMA channel interrupt event */ + DMA_ChannelEventCmd(uart->config->dma_rx->Instance, uart->config->dma_rx->dma_channel, DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE, ENABLE); + + /* Configure DMAMUX */ + DMAMUX_SetRequestID(DMAMUX1_ID, uart->config->dma_rx->dmamux_channel, uart->config->dma_rx->dmamux_request); + + uart->dma.DMA_Rx_Init = RT_TRUE; + + /* Enable the specified DMA channel */ + DMA_ChannelCmd(uart->config->dma_rx->Instance, uart->config->dma_rx->dma_channel, ENABLE); + + /* enable dma irq */ + NVIC_SetPriority(uart->config->dma_rx->dma_irq, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)); + NVIC_EnableIRQ(uart->config->dma_rx->dma_irq); + } + else + { + LOG_E("%s RX DMA channel initialization failed!", uart->config->name); + result = -RT_ERROR; + } + + RT_ASSERT(result == RT_EOK) + + /* Enable the USART idle interrupts */ + USART_ConfigInt(uart->config->Instance, USART_INT_IDLEF, ENABLE); + + /* Enables the USART's DMA interface */ + USART_EnableDMA(uart->config->Instance, USART_DMAREQ_RX, ENABLE); + } + + /* enable uart irq */ + NVIC_SetPriority(uart->config->irq_type, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 1, 0)); + NVIC_EnableIRQ(uart->config->irq_type); +} + +static rt_err_t UART_DMA_Transmit(struct n32_uart *uart) +{ + rt_uint16_t send_length; + rt_size_t already_send_length; + const rt_uint8_t *send_buf = RT_NULL; + + RT_ASSERT(uart != RT_NULL); + + if (uart->dma.DMA_Tx_Init == RT_TRUE) + { +#if defined(SOC_SERIES_N32H7xx) + /* DMA uses a single block, with a maximum of 4095 per block */ + if (uart->dma.tx_dma.total_length > 4095U) + { + send_length = 4095U; + uart->dma.tx_dma.total_length = uart->dma.tx_dma.total_length - 4095U; + } + else + { + send_length = uart->dma.tx_dma.total_length; + uart->dma.tx_dma.total_length = 0; + } + + /* Calculate the length sent after this transmission is complete */ + uart->dma.tx_dma.already_send_length += send_length; + /* calculate the start address */ + already_send_length = uart->dma.tx_dma.record_length - send_length - uart->dma.tx_dma.total_length; + send_buf = uart->dma.tx_dma.buf + already_send_length; + + DMA_ChannelCmd(uart->config->dma_tx->Instance, uart->config->dma_tx->dma_channel, DISABLE); + + if (!DMA_ControllerIsEnabled(uart->config->dma_tx->Instance)) + DMA_ControllerCmd(uart->config->dma_tx->Instance, ENABLE); + + uart->dma.TX_DMA_ChInitStr.IntEn = 1U; + uart->dma.TX_DMA_ChInitStr.SrcAddr = (uint32_t)send_buf; + uart->dma.TX_DMA_ChInitStr.BlkTfrSize = send_length; + + DMA_ControllerCmd(uart->config->dma_tx->Instance, ENABLE); + if (DMA_ChannelInit(uart->config->dma_tx->Instance, &uart->dma.TX_DMA_ChInitStr, uart->config->dma_tx->dma_channel) == 0U) + { + /* Enable transaction complete interrupt event */ + DMA_ChannelEventCmd(uart->config->dma_tx->Instance, uart->config->dma_tx->dma_channel, DMA_CH_EVENT_TRANSFER_COMPLETE, ENABLE); + + /* Enable the specified DMA channel */ + DMA_ChannelCmd(uart->config->dma_tx->Instance, uart->config->dma_tx->dma_channel, ENABLE); + + /* Clears the USARTx's USART_FLAG_TXC flags */ + USART_ClrFlag(uart->config->Instance, USART_FLAG_TXC); + + /* Enables the USART's DMA interface */ + USART_EnableDMA(uart->config->Instance, USART_DMAREQ_TX, ENABLE); + + USART_Enable(uart->config->Instance, ENABLE); + } +#endif + } + else + { + LOG_E("UART TX DMA Mode, TX DMA did not complete initialization."); + return -RT_ERROR; + } + + return RT_EOK; +} +#endif /* RT_SERIAL_USING_DMA */ + + +rt_uint32_t n32_uart_get_mask(rt_uint32_t word_length, rt_uint32_t parity) +{ + rt_uint32_t mask = 0x00FFU; + if (word_length == USART_WL_8B) + { + if (parity == USART_PE_NO) + { + mask = 0x00FFU ; + } + else + { + mask = 0x007FU ; + } + } +#ifdef USART_WL_9B + else if (word_length == USART_WL_9B) + { + if (parity == USART_PE_NO) + { + mask = 0x01FFU ; + } + else + { + mask = 0x00FFU ; + } + } +#endif + return mask; +} + +static rt_err_t n32_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +{ + struct n32_uart *uart; + USART_InitType USART_InitStructure; + RT_ASSERT(serial != RT_NULL); + RT_ASSERT(cfg != RT_NULL); + + uart = rt_container_of(serial, struct n32_uart, serial); + + /* Enable UART Clock */ + uart->config->EnablePeriphClk(uart->config->periph, ENABLE); + + USART_StructInit(&USART_InitStructure); + USART_InitStructure.BaudRate = cfg->baud_rate; + USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX; + +#if defined(SOC_SERIES_N32H7) +#ifdef USART_CTRL1_OSPM +#endif + USART_InitStructure.OverSampling = cfg->baud_rate > 5000000 ? USART_8OVER : USART_16OVER; +#else + USART_InitStructure.OverSampling = USART_16OVER; +#endif /* USART_CTRL1_OSPM */ + + switch (cfg->flowcontrol) + { + case RT_SERIAL_FLOWCONTROL_NONE: + USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE; + break; + case RT_SERIAL_FLOWCONTROL_CTSRTS: + USART_InitStructure.HardwareFlowControl = USART_HFCTRL_RTS_CTS; + break; + default: + USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE; + break; + } + + switch (cfg->data_bits) + { + case DATA_BITS_8: + if (cfg->parity == PARITY_ODD || cfg->parity == PARITY_EVEN) + USART_InitStructure.WordLength = USART_WL_9B; + else + USART_InitStructure.WordLength = USART_WL_8B; + break; + case DATA_BITS_9: + USART_InitStructure.WordLength = USART_WL_9B; + break; + default: + USART_InitStructure.WordLength = USART_WL_8B; + break; + } + + switch (cfg->stop_bits) + { + case STOP_BITS_1: + USART_InitStructure.StopBits = USART_STPB_1; + break; + case STOP_BITS_2: + USART_InitStructure.StopBits = USART_STPB_2; + break; + default: + USART_InitStructure.StopBits = USART_STPB_1; + break; + } + + switch (cfg->parity) + { + case PARITY_NONE: + USART_InitStructure.Parity = USART_PE_NO; + break; + case PARITY_ODD: + USART_InitStructure.Parity = USART_PE_ODD; + break; + case PARITY_EVEN: + USART_InitStructure.Parity = USART_PE_EVEN; + break; + default: + USART_InitStructure.Parity = USART_PE_NO; + break; + } + +#ifdef RT_SERIAL_USING_DMA + if (!(serial->parent.open_flag & RT_DEVICE_OFLAG_OPEN)) + { + uart->dma.rx_dma.block_has_recv_cnt = 0; + } +#endif + + USART_Init(uart->config->Instance, &USART_InitStructure); + + USART_Enable(uart->config->Instance, ENABLE); + + uart->DR_mask = n32_uart_get_mask(USART_InitStructure.WordLength, USART_InitStructure.Parity); + + return RT_EOK; +} + + +static rt_err_t n32_control(struct rt_serial_device *serial, int cmd, void *arg) +{ + struct n32_uart *uart; +#ifdef RT_SERIAL_USING_DMA + rt_ubase_t ctrl_arg = (rt_ubase_t)arg; +#endif + + RT_ASSERT(serial != RT_NULL); + uart = rt_container_of(serial, struct n32_uart, serial); + + switch (cmd) + { + /* disable interrupt */ + case RT_DEVICE_CTRL_CLR_INT: + /* disable rx irq */ + NVIC_DisableIRQ(uart->config->irq_type); + /* disable interrupt */ + USART_ConfigInt(uart->config->Instance, USART_INT_RXDNE, DISABLE); + +#ifdef RT_SERIAL_USING_DMA + /* disable DMA */ + if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) + { + NVIC_DisableIRQ(uart->config->dma_rx->dma_irq); + + DMA_ChannelCmd(uart->config->dma_rx->Instance, uart->config->dma_rx->dma_channel, DISABLE); + + USART_EnableDMA(uart->config->Instance, USART_DMAREQ_RX, DISABLE); + + rt_free(uart->dma.rx_dma.Read_LinkList); + uart->dma.rx_dma.Read_LinkList = RT_NULL; + } + else if (ctrl_arg == RT_DEVICE_FLAG_DMA_TX) + { + NVIC_DisableIRQ(uart->config->dma_tx->dma_irq); + + DMA_ChannelCmd(uart->config->dma_rx->Instance, uart->config->dma_rx->dma_channel, DISABLE); + + USART_EnableDMA(uart->config->Instance, USART_DMAREQ_TX, DISABLE); + } +#endif + break; + + /* enable interrupt */ + case RT_DEVICE_CTRL_SET_INT: + /* enable rx irq */ + NVIC_SetPriority(uart->config->irq_type, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 1, 0)); + NVIC_EnableIRQ(uart->config->irq_type); + /* enable interrupt */ + USART_ConfigInt(uart->config->Instance, USART_INT_RXDNE, ENABLE); + break; + +#ifdef RT_SERIAL_USING_DMA + case RT_DEVICE_CTRL_CONFIG: + N32_UART_DMA_Config(serial, ctrl_arg); + break; +#endif + + case RT_DEVICE_CTRL_CLOSE: + USART_DeInit(uart->config->Instance); + /* Enable UART Clock */ + uart->config->EnablePeriphClk(uart->config->periph, DISABLE); + break; + + } + return RT_EOK; +} + +static int n32_putc(struct rt_serial_device *serial, char c) +{ + struct n32_uart *uart; + RT_ASSERT(serial != RT_NULL); + + uart = rt_container_of(serial, struct n32_uart, serial); + + /* Clear transmission complete flag */ + if (USART_GetFlagStatus(uart->config->Instance, USART_FLAG_TXC) != RESET) + USART_ClrFlag(uart->config->Instance, USART_FLAG_TXC); + + /* Send data */ + USART_SendData(uart->config->Instance, c); + + while (USART_GetFlagStatus(uart->config->Instance, USART_FLAG_TXC) == RESET) + { + } + + return 1; +} + +static int n32_getc(struct rt_serial_device *serial) +{ + int ch; + struct n32_uart *uart; + RT_ASSERT(serial != RT_NULL); + uart = rt_container_of(serial, struct n32_uart, serial); + + ch = -1; + if (USART_GetFlagStatus(uart->config->Instance, USART_FLAG_RXDNE) != RESET) + { + ch = USART_ReceiveData(uart->config->Instance); + } + return ch; +} + +static rt_ssize_t n32_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction) +{ + struct n32_uart *uart = RT_NULL; + + RT_ASSERT(serial != RT_NULL); + RT_ASSERT(buf != RT_NULL); + uart = rt_container_of(serial, struct n32_uart, serial); + + RT_ASSERT(uart != RT_NULL); + if (size == 0) + { + return 0; + } + +#ifdef RT_SERIAL_USING_DMA + if (RT_SERIAL_DMA_TX == direction) + { + uart->dma.tx_dma.record_length = size; + uart->dma.tx_dma.total_length = size; + uart->dma.tx_dma.already_send_length = 0U; + uart->dma.tx_dma.buf = buf; + + /* start once data exchange in DMA mode */ + UART_DMA_Transmit(uart); + } +#endif + + return size; +} + +static void uart_isr(struct rt_serial_device *serial) +{ + struct n32_uart *uart; + + RT_ASSERT(serial != RT_NULL); + uart = rt_container_of(serial, struct n32_uart, serial); + + /* UART in mode Receiver */ + if ((USART_GetFlagStatus(uart->config->Instance, USART_FLAG_RXDNE) != RESET) && + (USART_GetIntStatus(uart->config->Instance, USART_INT_RXDNE) != RESET)) + { + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); + } +#ifdef RT_SERIAL_USING_DMA + else if ((uart->uart_dma_flag) && + (USART_GetFlagStatus(uart->config->Instance, USART_FLAG_IDLEF) != RESET) && + (USART_GetIntStatus(uart->config->Instance, USART_INT_IDLEF) != RESET)) + { + dma_recv_callback(serial, UART_RX_DMA_IT_IDLE_FLAG); + USART_GetFlagStatus(uart->config->Instance, USART_FLAG_IDLEF); + USART_ReceiveData(uart->config->Instance); + } + else if ((USART_GetFlagStatus(uart->config->Instance, USART_FLAG_TXC) != RESET) && + (USART_GetIntStatus(uart->config->Instance, USART_INT_TXC) != RESET)) + { + USART_ClrFlag(uart->config->Instance, USART_FLAG_TXC); + } +#endif + else + { + if ((USART_GetFlagStatus(uart->config->Instance, USART_FLAG_OREF) != RESET) || + (USART_GetFlagStatus(uart->config->Instance, USART_FLAG_NEF) != RESET) || + (USART_GetFlagStatus(uart->config->Instance, USART_FLAG_FEF) != RESET) || + (USART_GetFlagStatus(uart->config->Instance, USART_FLAG_PEF) != RESET)) + { + USART_GetFlagStatus(uart->config->Instance, USART_FLAG_OREF | USART_FLAG_NEF | USART_FLAG_FEF | USART_FLAG_PEF); + USART_ReceiveData(uart->config->Instance); + } + if (USART_GetFlagStatus(uart->config->Instance, USART_FLAG_LINBD) != RESET) + { + USART_ClrFlag(uart->config->Instance, USART_FLAG_LINBD); + } + + if (USART_GetFlagStatus(uart->config->Instance, USART_FLAG_CTSF) != RESET) + { + USART_ClrFlag(uart->config->Instance, USART_FLAG_CTSF); + } + + if (USART_GetFlagStatus(uart->config->Instance, USART_FLAG_TXDE) != RESET) + { + USART_ClrFlag(uart->config->Instance, USART_FLAG_CTSF); + } + if (USART_GetFlagStatus(uart->config->Instance, USART_FLAG_RXDNE) != RESET) + { + USART_ClrFlag(uart->config->Instance, USART_FLAG_RXDNE); + } + } +} + +#if defined(BSP_USING_UART1) +void USART1_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART1_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA) && defined(UART1_RX_DMA_IRQHandler) +void UART1_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART1_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA) && defined(UART1_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_TX_USING_DMA) && defined(UART1_TX_DMA_IRQHandler) +void UART1_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART1_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_TX_USING_DMA) && defined(UART1_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART1 */ + +#if defined(BSP_USING_UART2) +void USART2_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART2_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA) && defined(UART2_RX_DMA_IRQHandler) +void UART2_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART2_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA) && defined(UART2_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_TX_USING_DMA) && defined(UART2_TX_DMA_IRQHandler) +void UART2_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART2_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_TX_USING_DMA) && defined(UART2_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART2 */ + +#if defined(BSP_USING_UART3) +void USART3_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART3_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_RX_USING_DMA) && defined(UART3_RX_DMA_IRQHandler) +void UART3_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART3_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_RX_USING_DMA) && defined(UART3_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_TX_USING_DMA) && defined(UART3_TX_DMA_IRQHandler) +void UART3_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART3_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_TX_USING_DMA) && defined(UART3_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART3 */ + +#if defined(BSP_USING_UART4) +void USART4_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART4_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_RX_USING_DMA) && defined(UART4_RX_DMA_IRQHandler) +void UART4_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART4_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_RX_USING_DMA) && defined(UART4_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_TX_USING_DMA) && defined(UART4_TX_DMA_IRQHandler) +void UART4_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART4_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_TX_USING_DMA) && defined(UART4_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART4 */ + +#if defined(BSP_USING_UART5) +void USART5_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART5_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_RX_USING_DMA) && defined(UART5_RX_DMA_IRQHandler) +void UART5_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART5_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_RX_USING_DMA) && defined(UART5_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_TX_USING_DMA) && defined(UART5_TX_DMA_IRQHandler) +void UART5_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART5_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_TX_USING_DMA) && defined(UART5_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART5 */ + +#if defined(BSP_USING_UART6) +void USART6_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART6_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_RX_USING_DMA) && defined(UART6_RX_DMA_IRQHandler) +void UART6_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART6_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_RX_USING_DMA) && defined(UART6_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_TX_USING_DMA) && defined(UART6_TX_DMA_IRQHandler) +void UART6_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART6_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_TX_USING_DMA) && defined(UART6_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART6 */ + +#if defined(BSP_USING_UART7) +void USART7_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART7_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_RX_USING_DMA) && defined(UART7_RX_DMA_IRQHandler) +void UART7_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART7_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_RX_USING_DMA) && defined(UART7_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_TX_USING_DMA) && defined(UART7_TX_DMA_IRQHandler) +void UART7_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART7_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_TX_USING_DMA) && defined(UART7_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART7 */ + +#if defined(BSP_USING_UART8) +void USART8_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART8_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_RX_USING_DMA) && defined(UART8_RX_DMA_IRQHandler) +void UART8_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART8_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_RX_USING_DMA) && defined(UART8_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_TX_USING_DMA) && defined(UART8_TX_DMA_IRQHandler) +void UART8_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART8_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_TX_USING_DMA) && defined(UART8_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART8 */ + +#if defined(BSP_USING_UART9) +void UART9_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART9_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART9_RX_USING_DMA) && defined(UART9_RX_DMA_IRQHandler) +void UART9_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART9_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART9_RX_USING_DMA) && defined(UART9_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART9_TX_USING_DMA) && defined(UART9_TX_DMA_IRQHandler) +void UART9_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART9_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART9_TX_USING_DMA) && defined(UART9_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART9 */ + +#if defined(BSP_USING_UART10) +void UART10_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART10_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART10_RX_USING_DMA) && defined(UART10_RX_DMA_IRQHandler) +void UART10_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART10_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART10_RX_USING_DMA) && defined(UART10_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART10_TX_USING_DMA) && defined(UART10_TX_DMA_IRQHandler) +void UART10_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART10_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART10_TX_USING_DMA) && defined(UART10_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART10 */ + +#if defined(BSP_USING_UART11) +void UART11_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART11_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART11_RX_USING_DMA) && defined(UART11_RX_DMA_IRQHandler) +void UART11_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART11_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART11_RX_USING_DMA) && defined(UART11_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART11_TX_USING_DMA) && defined(UART11_TX_DMA_IRQHandler) +void UART11_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART11_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART11_TX_USING_DMA) && defined(UART11_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART11 */ + +#if defined(BSP_USING_UART12) +void UART12_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART12_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART12_RX_USING_DMA) && defined(UART12_RX_DMA_IRQHandler) +void UART12_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART12_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART12_RX_USING_DMA) && defined(UART12_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART12_TX_USING_DMA) && defined(UART12_TX_DMA_IRQHandler) +void UART12_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART12_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART12_TX_USING_DMA) && defined(UART12_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART12 */ + +#if defined(BSP_USING_UART13) +void UART13_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART13_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART13_RX_USING_DMA) && defined(UART13_RX_DMA_IRQHandler) +void UART13_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART13_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART13_RX_USING_DMA) && defined(UART13_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART13_TX_USING_DMA) && defined(UART13_TX_DMA_IRQHandler) +void UART13_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART13_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART13_TX_USING_DMA) && defined(UART13_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART13 */ + +#if defined(BSP_USING_UART14) +void UART14_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART14_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART14_RX_USING_DMA) && defined(UART14_RX_DMA_IRQHandler) +void UART14_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART14_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART14_RX_USING_DMA) && defined(UART14_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART14_TX_USING_DMA) && defined(UART14_TX_DMA_IRQHandler) +void UART14_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART14_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART14_TX_USING_DMA) && defined(UART14_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART14 */ + +#if defined(BSP_USING_UART15) +void UART15_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[UART15_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART15_RX_USING_DMA) && defined(UART15_RX_DMA_IRQHandler) +void UART15_RX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_rx_dma_isr(&uart_obj[UART15_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART15_RX_USING_DMA) && defined(UART15_RX_DMA_IRQHandler) */ +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART15_TX_USING_DMA) && defined(UART15_TX_DMA_IRQHandler) +void UART15_TX_DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_tx_dma_isr(&uart_obj[UART15_INDEX]); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART15_TX_USING_DMA) && defined(UART15_TX_DMA_IRQHandler) */ +#endif /* BSP_USING_UART15 */ + +static void n32_uart_get_dma_config(void) +{ +#ifdef BSP_USING_UART1 + uart_obj[UART1_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART1_RX_USING_DMA + uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart1_dma_rx = UART1_DMA_RX_CONFIG; + uart_config[UART1_INDEX].dma_rx = &uart1_dma_rx; +#endif +#ifdef BSP_UART1_TX_USING_DMA + uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart1_dma_tx = UART1_DMA_TX_CONFIG; + uart_config[UART1_INDEX].dma_tx = &uart1_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART2 + uart_obj[UART2_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART2_RX_USING_DMA + uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart2_dma_rx = UART2_DMA_RX_CONFIG; + uart_config[UART2_INDEX].dma_rx = &uart2_dma_rx; +#endif +#ifdef BSP_UART2_TX_USING_DMA + uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart2_dma_tx = UART2_DMA_TX_CONFIG; + uart_config[UART2_INDEX].dma_tx = &uart2_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART3 + uart_obj[UART3_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART3_RX_USING_DMA + uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart3_dma_rx = UART3_DMA_RX_CONFIG; + uart_config[UART3_INDEX].dma_rx = &uart3_dma_rx; +#endif +#ifdef BSP_UART3_TX_USING_DMA + uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart3_dma_tx = UART3_DMA_TX_CONFIG; + uart_config[UART3_INDEX].dma_tx = &uart3_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART4 + uart_obj[UART4_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART4_RX_USING_DMA + uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart4_dma_rx = UART4_DMA_RX_CONFIG; + uart_config[UART4_INDEX].dma_rx = &uart4_dma_rx; +#endif +#ifdef BSP_UART4_TX_USING_DMA + uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart4_dma_tx = UART4_DMA_TX_CONFIG; + uart_config[UART4_INDEX].dma_tx = &uart4_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART5 + uart_obj[UART5_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART5_RX_USING_DMA + uart_obj[UART5_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart5_dma_rx = UART5_DMA_RX_CONFIG; + uart_config[UART5_INDEX].dma_rx = &uart5_dma_rx; +#endif +#ifdef BSP_UART5_TX_USING_DMA + uart_obj[UART5_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart5_dma_tx = UART5_DMA_TX_CONFIG; + uart_config[UART5_INDEX].dma_tx = &uart5_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART6 + uart_obj[UART6_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART6_RX_USING_DMA + uart_obj[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart6_dma_rx = UART6_DMA_RX_CONFIG; + uart_config[UART6_INDEX].dma_rx = &uart6_dma_rx; +#endif +#ifdef BSP_UART6_TX_USING_DMA + uart_obj[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart6_dma_tx = UART6_DMA_TX_CONFIG; + uart_config[UART6_INDEX].dma_tx = &uart6_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART7 + uart_obj[UART7_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART7_RX_USING_DMA + uart_obj[UART7_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart7_dma_rx = UART7_DMA_RX_CONFIG; + uart_config[UART7_INDEX].dma_rx = &uart7_dma_rx; +#endif +#ifdef BSP_UART7_TX_USING_DMA + uart_obj[UART7_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart7_dma_tx = UART7_DMA_TX_CONFIG; + uart_config[UART7_INDEX].dma_tx = &uart7_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART8 + uart_obj[UART8_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART8_RX_USING_DMA + uart_obj[UART8_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart8_dma_rx = UART8_DMA_RX_CONFIG; + uart_config[UART8_INDEX].dma_rx = &uart8_dma_rx; +#endif +#ifdef BSP_UART8_TX_USING_DMA + uart_obj[UART8_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart8_dma_tx = UART8_DMA_TX_CONFIG; + uart_config[UART8_INDEX].dma_tx = &uart8_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART9 + uart_obj[UART9_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART9_RX_USING_DMA + uart_obj[UART9_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart9_dma_rx = UART9_DMA_RX_CONFIG; + uart_config[UART9_INDEX].dma_rx = &uart9_dma_rx; +#endif +#ifdef BSP_UART9_TX_USING_DMA + uart_obj[UART9_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart9_dma_tx = UART9_DMA_TX_CONFIG; + uart_config[UART9_INDEX].dma_tx = &uart9_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART10 + uart_obj[UART10_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART10_RX_USING_DMA + uart_obj[UART10_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart10_dma_rx = UART10_DMA_RX_CONFIG; + uart_config[UART10_INDEX].dma_rx = &uart10_dma_rx; +#endif +#ifdef BSP_UART10_TX_USING_DMA + uart_obj[UART10_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart10_dma_tx = UART10_DMA_TX_CONFIG; + uart_config[UART10_INDEX].dma_tx = &uart10_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART11 + uart_obj[UART11_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART11_RX_USING_DMA + uart_obj[UART11_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart11_dma_rx = UART11_DMA_RX_CONFIG; + uart_config[UART11_INDEX].dma_rx = &uart11_dma_rx; +#endif +#ifdef BSP_UART11_TX_USING_DMA + uart_obj[UART11_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart11_dma_tx = UART11_DMA_TX_CONFIG; + uart_config[UART11_INDEX].dma_tx = &uart11_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART12 + uart_obj[UART12_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART12_RX_USING_DMA + uart_obj[UART12_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart12_dma_rx = UART12_DMA_RX_CONFIG; + uart_config[UART12_INDEX].dma_rx = &uart12_dma_rx; +#endif +#ifdef BSP_UART12_TX_USING_DMA + uart_obj[UART12_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart12_dma_tx = UART12_DMA_TX_CONFIG; + uart_config[UART12_INDEX].dma_tx = &uart12_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART13 + uart_obj[UART13_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART13_RX_USING_DMA + uart_obj[UART13_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart13_dma_rx = UART13_DMA_RX_CONFIG; + uart_config[UART13_INDEX].dma_rx = &uart13_dma_rx; +#endif +#ifdef BSP_UART13_TX_USING_DMA + uart_obj[UART13_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart13_dma_tx = UART13_DMA_TX_CONFIG; + uart_config[UART13_INDEX].dma_tx = &uart13_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART14 + uart_obj[UART14_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART14_RX_USING_DMA + uart_obj[UART14_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart14_dma_rx = UART14_DMA_RX_CONFIG; + uart_config[UART14_INDEX].dma_rx = &uart14_dma_rx; +#endif +#ifdef BSP_UART14_TX_USING_DMA + uart_obj[UART14_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart14_dma_tx = UART14_DMA_TX_CONFIG; + uart_config[UART14_INDEX].dma_tx = &uart14_dma_tx; +#endif +#endif + +#ifdef BSP_USING_UART15 + uart_obj[UART15_INDEX].uart_dma_flag = 0; +#ifdef BSP_UART15_RX_USING_DMA + uart_obj[UART15_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + static struct dma_config uart15_dma_rx = UART15_DMA_RX_CONFIG; + uart_config[UART15_INDEX].dma_rx = &uart15_dma_rx; +#endif +#ifdef BSP_UART15_TX_USING_DMA + uart_obj[UART15_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + static struct dma_config uart15_dma_tx = UART15_DMA_TX_CONFIG; + uart_config[UART15_INDEX].dma_tx = &uart15_dma_tx; +#endif +#endif +} + + + +static const struct rt_uart_ops n32_uart_ops = +{ + .configure = n32_configure, + .control = n32_control, + .putc = n32_putc, + .getc = n32_getc, + .dma_transmit = n32_dma_transmit +}; + +int rt_hw_usart_init(void) +{ + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + rt_err_t result = 0; + + n32_uart_get_dma_config(); + + for (rt_size_t i = 0; i < sizeof(uart_obj) / sizeof(struct n32_uart); i++) + { + /* init UART object */ + uart_obj[i].config = &uart_config[i]; + uart_obj[i].serial.ops = &n32_uart_ops; + uart_obj[i].serial.config = config; + +#ifdef RT_SERIAL_USING_DMA + if (uart_obj[i].uart_dma_flag & RT_DEVICE_FLAG_DMA_TX) + { +#if defined(SOC_SERIES_N32H7xx) + /* Configure the UART TX DMA for Transmission process */ + /* Enable DMA clock */ + RCC_EnableAHB1PeriphClk3(uart_obj[i].config->dma_tx->dma_rcc, ENABLE); + /* Enable DMA MUXclock */ + RCC_EnableAHB1PeriphClk1(RCC_AHB1_PERIPHEN_M7_DMAMUX1, ENABLE); + + /* UART TX DMA Channel1 configuration ---------------------------------------------*/ + DMA_ChannelStructInit(&uart_obj[i].dma.TX_DMA_ChInitStr); + uart_obj[i].dma.TX_DMA_ChInitStr.IntEn = 0x1U; + uart_obj[i].dma.TX_DMA_ChInitStr.DstAddr = (uint32_t)&uart_obj[i].config->Instance->DAT; + uart_obj[i].dma.TX_DMA_ChInitStr.SrcAddr = NULL; + uart_obj[i].dma.TX_DMA_ChInitStr.SrcTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + uart_obj[i].dma.TX_DMA_ChInitStr.DstTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + uart_obj[i].dma.TX_DMA_ChInitStr.DstAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_NO_CHANGE; + uart_obj[i].dma.TX_DMA_ChInitStr.SrcAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_INCREMENT; + uart_obj[i].dma.TX_DMA_ChInitStr.DstBurstLen = DMA_CH_BURST_LENGTH_1; + uart_obj[i].dma.TX_DMA_ChInitStr.SrcBurstLen = DMA_CH_BURST_LENGTH_1; + uart_obj[i].dma.TX_DMA_ChInitStr.SrcGatherEn = 0x0U; + uart_obj[i].dma.TX_DMA_ChInitStr.DstScatterEn = 0x0U; + uart_obj[i].dma.TX_DMA_ChInitStr.TfrTypeFlowCtrl = DMA_CH_TRANSFER_FLOW_M2P_DMA; + uart_obj[i].dma.TX_DMA_ChInitStr.BlkTfrSize = 0U; + uart_obj[i].dma.TX_DMA_ChInitStr.pLinkListItem = NULL; + uart_obj[i].dma.TX_DMA_ChInitStr.SrcGatherInterval = 0x0U; + uart_obj[i].dma.TX_DMA_ChInitStr.SrcGatherCount = 0x0U; + uart_obj[i].dma.TX_DMA_ChInitStr.DstScatterInterval = 0x0U; + uart_obj[i].dma.TX_DMA_ChInitStr.DstScatterCount = 0x0U; + uart_obj[i].dma.TX_DMA_ChInitStr.TfrType = DMA_CH_TRANSFER_TYPE_SINGLE_BLOCK; + uart_obj[i].dma.TX_DMA_ChInitStr.ChannelPriority = DMA_CH_PRIORITY_7; + uart_obj[i].dma.TX_DMA_ChInitStr.SrcHandshaking = DMA_CH_SRC_HANDSHAKING_SOFTWARE; + uart_obj[i].dma.TX_DMA_ChInitStr.DstHandshaking = DMA_CH_DST_HANDSHAKING_HARDWARE; + uart_obj[i].dma.TX_DMA_ChInitStr.DstHsInterface = uart_obj[i].config->dma_tx->HsInterface; + + /* DMA controller must be enabled before initializing the channel */ + DMA_ControllerCmd(uart_obj[i].config->dma_tx->Instance, ENABLE); + + /* Initialize the specified DMA channel and Whether the specified channel was successfully initialized */ + if (DMA_ChannelInit(uart_obj[i].config->dma_tx->Instance, &uart_obj[i].dma.TX_DMA_ChInitStr, uart_obj[i].config->dma_tx->dma_channel) == 0U) + { + /* Configure DMAMUX */ + DMAMUX_SetRequestID(DMAMUX1_ID, uart_obj[i].config->dma_tx->dmamux_channel, uart_obj[i].config->dma_tx->dmamux_request); + + uart_obj[i].dma.DMA_Tx_Init = RT_TRUE; + + /* enable dma irq */ + NVIC_SetPriority(uart_obj[i].config->dma_tx->dma_irq, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)); + NVIC_EnableIRQ(uart_obj[i].config->dma_tx->dma_irq); + } + else + { + LOG_E("%s TX DMA channel initialization failed!", uart_obj[i].config->name); + return -RT_ERROR; + } +#endif + } + + if (uart_obj[i].uart_dma_flag & RT_DEVICE_FLAG_DMA_RX) + { +#if defined(SOC_SERIES_N32H7xx) + /* Calculate the number of blocks */ + if ((uart_obj[i].serial.config.bufsz % DMA_BLOCK_SIZE) != 0) + { + uart_obj[i].dma.rx_dma.block_num = uart_obj[i].serial.config.bufsz / DMA_BLOCK_SIZE + 1; + + /* Calculate the remain length */ + uart_obj[i].dma.rx_dma.remain_len = ((uart_obj[i].serial.config.bufsz > DMA_BLOCK_SIZE) ? + (uart_obj[i].serial.config.bufsz - DMA_BLOCK_SIZE * (uart_obj[i].dma.rx_dma.block_num - 1U)) : + uart_obj[i].serial.config.bufsz); + } + else + { + uart_obj[i].dma.rx_dma.block_num = uart_obj[i].serial.config.bufsz / DMA_BLOCK_SIZE; + + /* Calculate the remain length */ + uart_obj[i].dma.rx_dma.remain_len = 0; + } + + /* Request a LinkList address */ + uart_obj[i].dma.rx_dma.Read_LinkList = (DMA_LinkListItemType *)rt_malloc(sizeof(DMA_LinkListItemType) * uart_obj[i].dma.rx_dma.block_num); + if (uart_obj[i].dma.rx_dma.Read_LinkList == RT_NULL) + { + return -RT_ERROR; + } + + /* Configure the UART RX DMA for Transmission process */ + /* Enable DMA clock */ + RCC_EnableAHB1PeriphClk3(uart_obj[i].config->dma_rx->dma_rcc, ENABLE); + /* Enable DMA MUXclock */ + RCC_EnableAHB1PeriphClk1(RCC_AHB1_PERIPHEN_M7_DMAMUX1, ENABLE); + + /* UART RX DMA Channel1 configuration ---------------------------------------------*/ + DMA_ChannelStructInit(&uart_obj[i].dma.RX_DMA_ChInitStr); + uart_obj[i].dma.RX_DMA_ChInitStr.IntEn = 0x1U; + uart_obj[i].dma.RX_DMA_ChInitStr.SrcAddr = (uint32_t)&uart_obj[i].config->Instance->DAT; + uart_obj[i].dma.RX_DMA_ChInitStr.DstAddr = NULL; + uart_obj[i].dma.RX_DMA_ChInitStr.SrcTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + uart_obj[i].dma.RX_DMA_ChInitStr.DstTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + uart_obj[i].dma.RX_DMA_ChInitStr.DstAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_INCREMENT; + uart_obj[i].dma.RX_DMA_ChInitStr.SrcAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_NO_CHANGE; + uart_obj[i].dma.RX_DMA_ChInitStr.DstBurstLen = DMA_CH_BURST_LENGTH_1; + uart_obj[i].dma.RX_DMA_ChInitStr.SrcBurstLen = DMA_CH_BURST_LENGTH_1; + uart_obj[i].dma.RX_DMA_ChInitStr.SrcGatherEn = 0x0U; + uart_obj[i].dma.RX_DMA_ChInitStr.DstScatterEn = 0x0U; + uart_obj[i].dma.RX_DMA_ChInitStr.TfrTypeFlowCtrl = DMA_CH_TRANSFER_FLOW_P2M_DMA; + uart_obj[i].dma.RX_DMA_ChInitStr.BlkTfrSize = DMA_BLOCK_SIZE; + uart_obj[i].dma.RX_DMA_ChInitStr.pLinkListItem = uart_obj[i].dma.rx_dma.Read_LinkList; + uart_obj[i].dma.RX_DMA_ChInitStr.SrcGatherInterval = 0x0U; + uart_obj[i].dma.RX_DMA_ChInitStr.SrcGatherCount = 0x0U; + uart_obj[i].dma.RX_DMA_ChInitStr.DstScatterInterval = 0x0U; + uart_obj[i].dma.RX_DMA_ChInitStr.DstScatterCount = 0x0U; + uart_obj[i].dma.RX_DMA_ChInitStr.TfrType = DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_RELOAD_DSTADR_LINKED; + uart_obj[i].dma.RX_DMA_ChInitStr.ChannelPriority = DMA_CH_PRIORITY_7; + uart_obj[i].dma.RX_DMA_ChInitStr.SrcHandshaking = DMA_CH_SRC_HANDSHAKING_HARDWARE; + uart_obj[i].dma.RX_DMA_ChInitStr.DstHandshaking = DMA_CH_DST_HANDSHAKING_SOFTWARE; + uart_obj[i].dma.RX_DMA_ChInitStr.SrcHsInterface = uart_obj[i].config->dma_rx->HsInterface; + + /* Set LLI control information */ + for (rt_size_t j = 0; j < uart_obj[i].dma.rx_dma.block_num; j++) + { + /* Link List Config */ + uart_obj[i].dma.rx_dma.Read_LinkList[j].IntEn = 0x1U; + uart_obj[i].dma.rx_dma.Read_LinkList[j].SrcAddr = (uint32_t)&uart_obj[i].config->Instance->DAT; + uart_obj[i].dma.rx_dma.Read_LinkList[j].DstAddr = NULL; + uart_obj[i].dma.rx_dma.Read_LinkList[j].SrcTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + uart_obj[i].dma.rx_dma.Read_LinkList[j].DstTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + uart_obj[i].dma.rx_dma.Read_LinkList[j].DstAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_INCREMENT; + uart_obj[i].dma.rx_dma.Read_LinkList[j].SrcAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_NO_CHANGE; + uart_obj[i].dma.rx_dma.Read_LinkList[j].DstBurstLen = DMA_CH_BURST_LENGTH_1; + uart_obj[i].dma.rx_dma.Read_LinkList[j].SrcBurstLen = DMA_CH_BURST_LENGTH_1; + uart_obj[i].dma.rx_dma.Read_LinkList[j].SrcGatherEn = false; + uart_obj[i].dma.rx_dma.Read_LinkList[j].DstScatterEn = false; + uart_obj[i].dma.rx_dma.Read_LinkList[j].TfrTypeFlowCtrl = DMA_CH_TRANSFER_FLOW_P2M_DMA; + uart_obj[i].dma.rx_dma.Read_LinkList[j].BlkTfrSize = DMA_BLOCK_SIZE; + uart_obj[i].dma.rx_dma.Read_LinkList[j].DstLinkedListEn = true; + uart_obj[i].dma.rx_dma.Read_LinkList[j].SrcLinkedListEn = false; + + /* The last block, so need to link to first block */ + if ((j + 1U) == uart_obj[i].dma.rx_dma.block_num) + { + uart_obj[i].dma.rx_dma.Read_LinkList[j].pNext = &uart_obj[i].dma.rx_dma.Read_LinkList[0U]; + } + else + { + uart_obj[i].dma.rx_dma.Read_LinkList[j].pNext = &uart_obj[i].dma.rx_dma.Read_LinkList[j + 1U]; + } + + /* The last block and block size ≠ BLOCK_SIZE */ + if ((j + 1U) == uart_obj[i].dma.rx_dma.block_num && uart_obj[i].dma.rx_dma.remain_len != 0U) + { + uart_obj[i].dma.rx_dma.Read_LinkList[j].BlkTfrSize = uart_obj[i].dma.rx_dma.remain_len; + } + } + + /* DMA controller must be enabled before initializing the channel */ + DMA_ControllerCmd(uart_obj[i].config->dma_rx->Instance, ENABLE); +#endif + } +#endif /* RT_SERIAL_USING_DMA */ + + /* register UART device */ + result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name, + RT_DEVICE_FLAG_RDWR + | RT_DEVICE_FLAG_INT_RX + | RT_DEVICE_FLAG_INT_TX + | uart_obj[i].uart_dma_flag + , NULL); + RT_ASSERT(result == RT_EOK); + } + + return result; +} + +#endif /* RT_USING_SERIAL */ + diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_usart.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_usart.h new file mode 100644 index 0000000000..4b77bf06f2 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drivers/drv_usart.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __DRV_USART_H__ +#define __DRV_USART_H__ + +#include +#include "rtdevice.h" +#include +#include +#include "drv_dma.h" + +int rt_hw_usart_init(void); + +#define UART_RX_DMA_IT_IDLE_FLAG 0x00 +#define UART_RX_DMA_IT_BLOCK_TC_FLAG 0x01 + +/* n32 config class */ +struct n32_uart_config +{ + const char *name; + USART_Module *Instance; + IRQn_Type irq_type; + uint32_t periph; + void (*EnablePeriphClk)(uint32_t periph, FunctionalState cmd); + struct dma_config *dma_rx; + struct dma_config *dma_tx; +}; + +/* n32 uart dirver class */ +struct n32_uart +{ + struct n32_uart_config *config; + rt_uint32_t DR_mask; + +#ifdef RT_SERIAL_USING_DMA + struct + { + rt_bool_t DMA_Tx_Init; + DMA_ChInitType TX_DMA_ChInitStr; + + struct + { + rt_size_t record_length; + rt_size_t total_length; + rt_size_t already_send_length; + + rt_uint8_t *buf; + } tx_dma; + + + rt_bool_t DMA_Rx_Init; + DMA_ChInitType RX_DMA_ChInitStr; + + struct + { + rt_uint16_t block_num; + rt_uint16_t remain_len; + rt_size_t block_has_recv_cnt; + DMA_LinkListItemType *Read_LinkList; + + } rx_dma; + + } dma; + +#endif + rt_uint16_t uart_dma_flag; + struct rt_serial_device serial; +}; + + +#endif /* __DRV_USART_H__ */ diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drv_common.c b/bsp/n32/n32hxxx/libraries/N32_Drivers/drv_common.c new file mode 100644 index 0000000000..df3bef0836 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drv_common.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#include "drv_common.h" +#include + +#ifdef RT_USING_PIN + #include +#endif + +#ifdef RT_USING_SERIAL + #ifdef RT_USING_SERIAL_V2 + #include + #else + #include + #endif /* RT_USING_SERIAL */ +#endif /* RT_USING_SERIAL_V2 */ + +#define DBG_TAG "drv_common" +#define DBG_LVL DBG_INFO +#include + +#ifdef RT_USING_FINSH +#include +static void reboot(uint8_t argc, char **argv) +{ + rt_hw_cpu_reset(); +} +MSH_CMD_EXPORT(reboot, Reboot System); +#endif /* RT_USING_FINSH */ + +static __IO uint32_t uwTick; +static uint32_t _systick_ms = 1; + +/* SysTick configuration */ +void rt_hw_systick_init(void) +{ + RCC_ClocksTypeDef RCC_Clocks = { 0 }; + + /* Get clock frequency */ + RCC_GetClocksFreqValue(&RCC_Clocks); + + /* Set Systick */ + SysTick_Config(RCC_Clocks.M7ClkFreq / RT_TICK_PER_SECOND); + + NVIC_SetPriorityGrouping(SCB_AIRCR_PRIGROUP3); + NVIC_SetPriority(SysTick_IRQn, 0xFF); + + _systick_ms = 1000u / RT_TICK_PER_SECOND; + if (_systick_ms == 0) + _systick_ms = 1; +} + +void System_Tick_Increase(void) +{ + uwTick += _systick_ms; +} + +uint32_t System_Tick_Get(void) +{ + if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) + System_Tick_Increase(); + + return uwTick; +} + +/** + * This is the timer interrupt service routine. + * + */ +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) + System_Tick_Increase(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + + +/** + * @brief This function is executed in case of error occurrence. + * @param None + * @retval None + */ +void _Error_Handler(char *s, int num) +{ + /* USER CODE BEGIN Error_Handler */ + LOG_E("Error_Handler at file:%s num:%d", s, num); + while (1) + { + } + /* USER CODE END Error_Handler */ +} + +/** + * This function will delay for some us. + * + * @param us the delay time of us + */ +void rt_hw_us_delay(rt_uint32_t us) +{ + rt_uint64_t ticks; + rt_uint32_t told, tnow, tcnt = 0; + rt_uint32_t reload = SysTick->LOAD; + + ticks = us * (reload / (1000000 / RT_TICK_PER_SECOND)); + told = SysTick->VAL; + while (1) + { + tnow = SysTick->VAL; + if (tnow != told) + { + if (tnow < told) + { + tcnt += told - tnow; + } + else + { + tcnt += reload - tnow + told; + } + told = tnow; + if (tcnt >= ticks) + { + break; + } + } + } +} + +/** + * This function will initial N32 board. + */ +rt_weak void rt_hw_board_init(void) +{ +#ifdef BSP_SCB_ENABLE_I_CACHE + /* Enable I-Cache---------------------------------------------------------*/ + SCB_EnableICache(); +#endif + +#ifdef BSP_SCB_ENABLE_D_CACHE + /* Enable D-Cache---------------------------------------------------------*/ + SCB_EnableDCache(); +#endif + + /* Initialize system */ + System_Initialize(); + + /* Initialize Systick */ + rt_hw_systick_init(); + +#if defined(RT_USING_HEAP) + /* Heap initialization */ + rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); +#endif + +#ifdef RT_USING_PIN + rt_hw_pin_init(); +#endif + +#ifdef RT_USING_SERIAL + rt_hw_usart_init(); +#endif + +#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) + /* Set the shell console output device */ + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif + +#if defined(RT_USING_CONSOLE) && defined(RT_USING_NANO) + extern void rt_hw_console_init(void); + rt_hw_console_init(); +#endif + +#ifdef RT_USING_COMPONENTS_INIT + /* Board underlying hardware initialization */ + rt_components_board_init(); +#endif +} diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/drv_common.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/drv_common.h new file mode 100644 index 0000000000..9c98335468 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/drv_common.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __DRV_COMMON_H__ +#define __DRV_COMMON_H__ + +#include +#include +#include +#ifdef RT_USING_DEVICE + #include +#endif /* RT_USING_DEVICE */ + +#ifdef __cplusplus +extern "C" { +#endif + +void _Error_Handler(char *s, int num); + +#ifndef Error_Handler +#define Error_Handler() _Error_Handler(__FILE__, __LINE__) +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/SConscript b/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/SConscript new file mode 100644 index 0000000000..99695defbc --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/SConscript @@ -0,0 +1,15 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +cwd = GetCurrentDir() +group = [] +src = ['drv_gpio.c'] +path = [cwd] + +if GetDepend(['RT_USING_CONSOLE']): + src += ['drv_console.c'] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path) + +Return('group') diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_console.c b/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_console.c new file mode 100644 index 0000000000..311b680bab --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_console.c @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#include +#include +#include + + +static USART_Module* USARTx; + +void rt_hw_console_init(void) +{ + USART_InitType USART_InitStructure; + + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M7_AFIO, ENABLE); + +#ifdef USART1 + if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart1") == 0) + { + RCC_EnableAPB1PeriphClk3(RCC_APB1_PERIPHEN_M7_USART1, ENABLE); + USARTx = USART1; + } +#endif /* USART1 */ +#ifdef USART2 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart2") == 0) + { + RCC_EnableAPB1PeriphClk3(RCC_APB1_PERIPHEN_M7_USART2, ENABLE); + USARTx = USART2; + } +#endif /* USART2 */ +#ifdef USART3 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart3") == 0) + { + RCC_EnableAPB1PeriphClk3(RCC_APB1_PERIPHEN_M7_USART3, ENABLE); + USARTx = USART3; + } +#endif /* USART3 */ +#ifdef USART4 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart4") == 0) + { + RCC_EnableAPB1PeriphClk3(RCC_APB1_PERIPHEN_M7_USART4, ENABLE); + USARTx = USART4; + } +#endif /* USART4 */ +#ifdef USART5 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart5") == 0) + { + RCC_EnableAPB2PeriphClk3(RCC_APB2_PERIPHEN_M7_USART5, ENABLE); + USARTx = USART5; + } +#endif /* USART5 */ +#ifdef USART6 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart6") == 0) + { + RCC_EnableAPB2PeriphClk3(RCC_APB2_PERIPHEN_M7_USART6, ENABLE); + USARTx = USART6; + } +#endif /* USART6 */ +#ifdef USART7 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart7") == 0) + { + RCC_EnableAPB2PeriphClk3(RCC_APB2_PERIPHEN_M7_USART7, ENABLE); + USARTx = USART7; + } +#endif /* USART7 */ +#ifdef USART8 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart8") == 0) + { + RCC_EnableAPB2PeriphClk3(RCC_APB2_PERIPHEN_M7_USART8, ENABLE); + USARTx = USART8; + } +#endif /* USART8 */ +#ifdef UART9 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart9") == 0) + { + RCC_EnableAPB1PeriphClk3(RCC_APB1_PERIPHEN_M7_UART9, ENABLE); + USARTx = UART9; + } +#endif /* UART9 */ +#ifdef UART10 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart10") == 0) + { + RCC_EnableAPB1PeriphClk3(RCC_APB1_PERIPHEN_M7_UART10, ENABLE); + USARTx = UART10; + } +#endif /* UART10 */ +#ifdef UART11 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart11") == 0) + { + RCC_EnableAPB1PeriphClk3(RCC_APB1_PERIPHEN_M7_UART11, ENABLE); + USARTx = UART11; + } +#endif /* UART11 */ +#ifdef UART12 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart12") == 0) + { + RCC_EnableAPB1PeriphClk3(RCC_APB1_PERIPHEN_M7_UART12, ENABLE); + USARTx = UART12; + } +#endif /* UART12 */ +#ifdef UART13 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart13") == 0) + { + RCC_EnableAPB2PeriphClk3(RCC_APB2_PERIPHEN_M7_UART13, ENABLE); + USARTx = UART13; + } +#endif /* UART13 */ +#ifdef UART14 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart14") == 0) + { + RCC_EnableAPB2PeriphClk3(RCC_APB2_PERIPHEN_M7_UART14, ENABLE); + USARTx = UART14; + } +#endif /* UART14 */ +#ifdef UART15 + else if (rt_strcmp(RT_CONSOLE_DEVICE_NAME, "uart15") == 0) + { + RCC_EnableAPB2PeriphClk3(RCC_APB2_PERIPHEN_M7_UART15, ENABLE); + USARTx = UART15; + } +#endif /* UART15 */ + else + { + RT_ASSERT(0); + } + + USART_DeInit(USARTx); + + USART_StructInit(&USART_InitStructure); + USART_InitStructure.BaudRate = 115200; + USART_InitStructure.WordLength = USART_WL_8B; + USART_InitStructure.StopBits = USART_STPB_1; + USART_InitStructure.Parity = USART_PE_NO; + USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE; + USART_InitStructure.OverSampling = USART_16OVER; + USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX; + USART_Init(USARTx, &USART_InitStructure); + USART_Enable(USARTx, ENABLE); +} + +void rt_hw_console_output(const char *str) +{ + rt_size_t i = 0, size = 0; + + size = rt_strlen(str); + for (i = 0; i < size; i++) + { + if (*(str + i) == '\n') + { + while (USART_GetFlagStatus(USARTx, USART_FLAG_TXC) == RESET); + + USART_SendData(USARTx, (uint8_t)'\r'); + } + + while (USART_GetFlagStatus(USARTx, USART_FLAG_TXC) == RESET); + + USART_SendData(USARTx, (uint8_t )(*(str + i))); + } +} + +char rt_hw_console_getchar(void) +{ + int ch = -1; + + if (USART_GetFlagStatus(USARTx, USART_FLAG_RXDNE) != SET) + { + ch = -1; + rt_thread_mdelay(10); + } + else + { + ch = USART_ReceiveData(USARTx); + } + return ch; +} diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_gpio.c b/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_gpio.c new file mode 100644 index 0000000000..6fc6b4585e --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_gpio.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#include "drv_gpio.h" +#include +#include + +#define GET_GPIOx(pin) ((GPIO_Module *)(rt_uint32_t)(pin & 0xFFFFFFFFULL)) +#define GET_GPIOPin(pin) ((uint16_t)(pin >> 32U)) + +void rt_pin_mode(rt_uint64_t pin, rt_uint8_t mode) +{ + GPIO_InitType GPIO_InitStructure; + GPIO_Module *GPIOx = GET_GPIOx(pin); + uint16_t GPIO_Pin = GET_GPIOPin(pin); + + RT_ASSERT(mode == PIN_MODE_OUTPUT || mode == PIN_MODE_INPUT || + mode == PIN_MODE_INPUT_PULLUP || mode == PIN_MODE_INPUT_PULLDOWN || + mode == PIN_MODE_OUTPUT_OD); + + switch((rt_ubase_t)GPIOx) + { + case (rt_ubase_t)GPIOA: + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOA, ENABLE); + break; + case (rt_ubase_t)GPIOB: + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOB, ENABLE); + break; + case (rt_ubase_t)GPIOC: + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOC, ENABLE); + break; +#ifdef GPIOD + case (rt_ubase_t)GPIOD: + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOD, ENABLE); + break; +#endif /* GPIOD */ +#ifdef GPIOE + case (rt_ubase_t)GPIOE: + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOE, ENABLE); + break; +#endif /* GPIOE */ +#ifdef GPIOF + case (rt_ubase_t)GPIOF: + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOF, ENABLE); + break; +#endif /* GPIOF */ +#ifdef GPIOG + case (rt_ubase_t)GPIOG: + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOG, ENABLE); + break; +#endif /* GPIOG */ +#ifdef GPIOH + case (rt_ubase_t)GPIOH: + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOH, ENABLE); + break; +#endif /* GPIOH */ +#ifdef GPIOI + case (rt_ubase_t)GPIOI: + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M7_GPIOI, ENABLE); + break; +#endif /* GPIOI */ +#ifdef GPIOj + case (rt_ubase_t)GPIOj: + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M7_GPIOJ, ENABLE); + break; +#endif /* GPIOj */ +#ifdef GPIOk + case (rt_ubase_t)GPIOk: + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M7_GPIOK, ENABLE); + break; +#endif /* GPIOk */ + } + + GPIO_InitStruct(&GPIO_InitStructure); + GPIO_InitStructure.Pin = GPIO_Pin; + + if (mode == PIN_MODE_OUTPUT) + { + /* output setting */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStructure.GPIO_Pull = GPIO_NO_PULL; + } + else if (mode == PIN_MODE_INPUT) + { + /* input setting: not pull. */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT; + GPIO_InitStructure.GPIO_Pull = GPIO_NO_PULL; + } + else if (mode == PIN_MODE_INPUT_PULLUP) + { + /* input setting: pull up. */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT; + GPIO_InitStructure.GPIO_Pull = GPIO_PULL_UP; + } + else if (mode == PIN_MODE_INPUT_PULLDOWN) + { + /* input setting: pull down. */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT; + GPIO_InitStructure.GPIO_Pull = GPIO_PULL_DOWN; + } + else if (mode == PIN_MODE_OUTPUT_OD) + { + /* output setting: od. */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_OD; + GPIO_InitStructure.GPIO_Pull = GPIO_NO_PULL; + } + + GPIO_InitPeripheral(GPIOx, &GPIO_InitStructure); +} + +void rt_pin_write(rt_uint64_t pin, rt_uint8_t value) +{ + GPIO_Module *GPIOx = GET_GPIOx(pin); + uint16_t GPIO_Pin = GET_GPIOPin(pin); + + RT_ASSERT(value == PIN_LOW || value == PIN_HIGH); + + GPIO_WriteBit(GPIOx, GPIO_Pin, ((value == PIN_LOW) ? Bit_RESET : Bit_SET)); +} + +rt_int8_t rt_pin_read(rt_uint64_t pin) +{ + GPIO_Module *GPIOx = GET_GPIOx(pin); + uint16_t GPIO_Pin = GET_GPIOPin(pin); + + return ((GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == Bit_RESET) ? PIN_LOW : PIN_HIGH); +} diff --git a/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_gpio.h b/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_gpio.h new file mode 100644 index 0000000000..7970318d27 --- /dev/null +++ b/bsp/n32/n32hxxx/libraries/N32_Drivers/nano/drv_gpio.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ +#ifndef __DRV_GPIO_H__ +#define __DRV_GPIO_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define PIN_LOW 0x00 +#define PIN_HIGH 0x01 + +#define PIN_MODE_OUTPUT 0x00 +#define PIN_MODE_INPUT 0x01 +#define PIN_MODE_INPUT_PULLUP 0x02 +#define PIN_MODE_INPUT_PULLDOWN 0x03 +#define PIN_MODE_OUTPUT_OD 0x04 + +#define GET_PIN(PORTx,PIN) (rt_uint64_t)((((rt_uint64_t)GPIO_PIN_##PIN) << 32) | (rt_uint64_t)(rt_ubase_t)GPIO##PORTx) + +void rt_pin_mode(rt_uint64_t pin, rt_uint8_t mode); +void rt_pin_write(rt_uint64_t pin, rt_uint8_t value); +rt_int8_t rt_pin_read(rt_uint64_t pin); + +#ifdef __cplusplus +} +#endif + +#endif /* __DRV_GPIO_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/.ci/attachconfig/ci.attachconfig.yml b/bsp/n32/n32hxxx/n32h760zil7-stb/.ci/attachconfig/ci.attachconfig.yml new file mode 100644 index 0000000000..e4646070a9 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/.ci/attachconfig/ci.attachconfig.yml @@ -0,0 +1,10 @@ +scons.args: &scons + scons_arg: + - '--strict' + +# ------ nano ------ +nano: + <<: *scons + kconfig: + - CONFIG_RT_USING_NANO=y + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/.config b/bsp/n32/n32hxxx/n32h760zil7-stb/.config new file mode 100644 index 0000000000..5510c17115 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/.config @@ -0,0 +1,1452 @@ +CONFIG_SOC_N32H760ZIL7=y + +# +# RT-Thread Kernel +# + +# +# klibc options +# + +# +# rt_vsnprintf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set +# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set +# end of rt_vsnprintf options + +# +# rt_vsscanf options +# +# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set +# end of rt_vsscanf options + +# +# rt_memset options +# +# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set +# end of rt_memset options + +# +# rt_memcpy options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set +# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set +# end of rt_memcpy options + +# +# rt_memmove options +# +# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set +# end of rt_memmove options + +# +# rt_memcmp options +# +# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set +# end of rt_memcmp options + +# +# rt_strstr options +# +# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set +# end of rt_strstr options + +# +# rt_strcasecmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set +# end of rt_strcasecmp options + +# +# rt_strncpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set +# end of rt_strncpy options + +# +# rt_strcpy options +# +# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set +# end of rt_strcpy options + +# +# rt_strncmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set +# end of rt_strncmp options + +# +# rt_strcmp options +# +# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set +# end of rt_strcmp options + +# +# rt_strlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set +# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set +# end of rt_strlen options + +# +# rt_strnlen options +# +# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set +# end of rt_strnlen options +# end of klibc options + +CONFIG_RT_NAME_MAX=32 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_AMP is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_CPUS_NR=1 +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +# CONFIG_RT_USING_HOOKLIST is not set +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +# CONFIG_RT_USING_CPU_USAGE_TRACER is not set + +# +# kservice options +# +# CONFIG_RT_USING_TINY_FFS is not set +# end of kservice options + +CONFIG_RT_USING_DEBUG=y +CONFIG_RT_DEBUGING_ASSERT=y +CONFIG_RT_DEBUGING_COLOR=y +CONFIG_RT_DEBUGING_CONTEXT=y +# CONFIG_RT_DEBUGING_AUTO_INIT is not set +# CONFIG_RT_USING_CI_ACTION is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set +# CONFIG_RT_USING_SIGNALS is not set +# end of Inter-Thread communication + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y +# end of Memory Management + +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +# CONFIG_RT_USING_THREADSAFE_PRINTF is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=512 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x50300 +# CONFIG_RT_USING_STDC_ATOMIC is not set +CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 +# end of RT-Thread Kernel + +CONFIG_RT_USING_CACHE=y +CONFIG_RT_USING_HW_ATOMIC=y +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M7=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=4096 +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_WORD_OPERATION is not set +# CONFIG_FINSH_USING_FUNC_EXT is not set +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_FINSH_USING_OPTION_COMPLETION=y + +# +# DFS: device virtual file system +# +# CONFIG_RT_USING_DFS is not set +# end of DFS: device virtual file system + +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_DEV_BUS is not set +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +# CONFIG_RT_SERIAL_USING_DMA is not set +CONFIG_RT_SERIAL_RB_BUFSZ=512 +# CONFIG_RT_USING_SERIAL_BYPASS is not set +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +# CONFIG_RT_USING_PHY is not set +# CONFIG_RT_USING_PHY_V2 is not set +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_BLK is not set +# CONFIG_RT_USING_VIRTIO is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_KTIME is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CHERRYUSB is not set +# end of Device Drivers + +# +# C/C++ and POSIX layer +# + +# +# ISO-ANSI C layer +# + +# +# Timezone and Daylight Saving Time +# +# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set +CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y +CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 +CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 +CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 +# end of Timezone and Daylight Saving Time +# end of ISO-ANSI C layer + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# end of Interprocess Communication (IPC) +# end of POSIX (Portable Operating System Interface) layer + +# CONFIG_RT_USING_CPLUSPLUS is not set +# end of C/C++ and POSIX layer + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set +# end of Network + +# +# Memory protection +# +# CONFIG_RT_USING_MEM_PROTECTION is not set +# CONFIG_RT_USING_HW_STACK_GUARD is not set +# end of Memory protection + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RESOURCE_ID is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# end of Utilities + +# +# Using USB legacy version +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set +# end of Using USB legacy version + +# CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set +# end of RT-Thread Components + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set +# end of RT-Thread Utestcases + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set +# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set +# CONFIG_PKG_USING_ESP_HOSTED is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set +# end of Marvell WiFi + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# end of Wiced WiFi + +# CONFIG_PKG_USING_RW007 is not set + +# +# CYW43012 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43012 is not set +# end of CYW43012 WiFi + +# +# BL808 WiFi +# +# CONFIG_PKG_USING_WLAN_BL808 is not set +# end of BL808 WiFi + +# +# CYW43439 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43439 is not set +# end of CYW43439 WiFi +# end of Wi-Fi + +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# end of IoT Cloud + +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_BT_CYW43012 is not set +# CONFIG_PKG_USING_CYW43XX is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set +# CONFIG_PKG_USING_ZEPHYR_POLLING is not set +# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set +# CONFIG_PKG_USING_LHC_MODBUS is not set +# CONFIG_PKG_USING_QMODBUS is not set +# CONFIG_PKG_USING_PNET is not set +# CONFIG_PKG_USING_OPENER is not set +# CONFIG_PKG_USING_FREEMQTT is not set +# end of IoT - internet of things + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set +# end of security packages + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set +# CONFIG_PKG_USING_RYAN_JSON is not set +# end of JSON: JavaScript Object Notation, a lightweight data-interchange format + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# end of XML: Extensible Markup Language + +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set +# end of language packages + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set +# end of LVGL: powerful and easy-to-use embedded GUI library + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# end of u8g2: a monochrome graphic library + +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_PERSIMMON is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set +# end of multimedia packages + +# +# tools packages +# +# CONFIG_PKG_USING_VECTOR is not set +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_MCOREDUMP is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set +# CONFIG_PKG_USING_RT_TRACE is not set +# CONFIG_PKG_USING_ZDEBUG is not set +# CONFIG_PKG_USING_RVBACKTRACE is not set +# CONFIG_PKG_USING_HPATCHLITE is not set +# CONFIG_PKG_USING_THREAD_METRIC is not set +# CONFIG_PKG_USING_UORB is not set +# CONFIG_PKG_USING_RT_TUNNEL is not set +# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set +# end of tools packages + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# end of enhanced kernel services + +# CONFIG_PKG_USING_AUNITY is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set +# end of acceleration: Assembly language or algorithmic acceleration packages + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_CORE is not set +# CONFIG_PKG_USING_CMSIS_NN is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set +# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# end of Micrium: Micrium software products porting for RT-Thread + +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_LITEOS_SDK is not set +# CONFIG_PKG_USING_TZ_DATABASE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FILEX is not set +# CONFIG_PKG_USING_LEVELX is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_RPMSG_LITE is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set +# CONFIG_PKG_USING_MLIBC is not set +# CONFIG_PKG_USING_TASK_MSG_BUS is not set +# CONFIG_PKG_USING_UART_FRAMEWORK is not set +# CONFIG_PKG_USING_SFDB is not set +# CONFIG_PKG_USING_RTP is not set +# CONFIG_PKG_USING_REB is not set +# CONFIG_PKG_USING_RMP is not set +# CONFIG_PKG_USING_R_RHEALSTONE is not set +# CONFIG_PKG_USING_HEARTBEAT is not set +# CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set +# CONFIG_PKG_USING_CHERRYECAT is not set +# end of system packages + +# +# peripheral libraries and drivers +# + +# +# HAL & SDK Drivers +# + +# +# STM32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_STM32F0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F1_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F1_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F2_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F2_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F3_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F3_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32F7_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32F7_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32G0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32G0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32G4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32G4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H7_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H7_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32H7RS_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32H7RS_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L0_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32L5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32L5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32U5_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32U5_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_STM32WL_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32WL_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32WB_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set +# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set +# end of STM32 HAL & SDK Drivers + +# +# Infineon HAL Packages +# +# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set +# CONFIG_PKG_USING_INFINEON_CMSIS is not set +# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set +# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set +# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set +# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set +# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set +# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set +# CONFIG_PKG_USING_INFINEON_USBDEV is not set +# end of Infineon HAL Packages + +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_ESP_IDF is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# end of Kendryte SDK + +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_MM32 is not set + +# +# WCH HAL & SDK Drivers +# +# CONFIG_PKG_USING_CH32V20x_SDK is not set +# CONFIG_PKG_USING_CH32V307_SDK is not set +# end of WCH HAL & SDK Drivers + +# +# AT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_AT32A403A_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32A403A_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32A423_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32A423_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F45x_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F45x_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F402_405_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F402_405_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F403A_407_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F403A_407_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F413_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F413_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F415_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F415_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F421_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F421_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F423_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F423_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F425_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F425_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32F435_437_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32F435_437_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_AT32M412_416_HAL_DRIVER is not set +# CONFIG_PKG_USING_AT32M412_416_CMSIS_DRIVER is not set +# end of AT32 HAL & SDK Drivers + +# +# HC32 DDL Drivers +# +# CONFIG_PKG_USING_HC32F3_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_HC32F3_SERIES_DRIVER is not set +# CONFIG_PKG_USING_HC32F4_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_HC32F4_SERIES_DRIVER is not set +# end of HC32 DDL Drivers + +# +# NXP HAL & SDK Drivers +# +# CONFIG_PKG_USING_NXP_MCX_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_NXP_MCX_SERIES_DRIVER is not set +# CONFIG_PKG_USING_NXP_LPC_DRIVER is not set +# CONFIG_PKG_USING_NXP_LPC55S_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMX6SX_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMX6UL_DRIVER is not set +# CONFIG_PKG_USING_NXP_IMXRT_DRIVER is not set +# end of NXP HAL & SDK Drivers + +# +# NUVOTON Drivers +# +# CONFIG_PKG_USING_NUVOTON_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_NUVOTON_SERIES_DRIVER is not set +# CONFIG_PKG_USING_NUVOTON_ARM926_LIB is not set +# end of NUVOTON Drivers + +# +# GD32 Drivers +# +# CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set +# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set +# end of GD32 Drivers + +# +# HPMicro SDK +# +# CONFIG_PKG_USING_HPM_SDK is not set +# end of HPMicro SDK + +# +# FT32 HAL & SDK Drivers +# +# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set +# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set +# end of FT32 HAL & SDK Drivers +# end of HAL & SDK Drivers + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_MAX31855 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_MLX90382 is not set +# CONFIG_PKG_USING_MLX90384 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90394 is not set +# CONFIG_PKG_USING_MLX90396 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_SHT4X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set +# CONFIG_PKG_USING_P3T1755 is not set +# CONFIG_PKG_USING_QMI8658 is not set +# CONFIG_PKG_USING_ICM20948 is not set +# end of sensors drivers + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_CST816X is not set +# CONFIG_PKG_USING_CST812T is not set +# end of touch drivers + +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_ILI9341 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_AIP650 is not set +# CONFIG_PKG_USING_FINGERPRINT is not set +# CONFIG_PKG_USING_BT_ECB02C is not set +# CONFIG_PKG_USING_UAT is not set +# CONFIG_PKG_USING_ST7789 is not set +# CONFIG_PKG_USING_VS1003 is not set +# CONFIG_PKG_USING_X9555 is not set +# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set +# CONFIG_PKG_USING_BT_MX01 is not set +# CONFIG_PKG_USING_RGPOWER is not set +# CONFIG_PKG_USING_BT_MX02 is not set +# CONFIG_PKG_USING_GC9A01 is not set +# CONFIG_PKG_USING_IK485 is not set +# CONFIG_PKG_USING_SERVO is not set +# CONFIG_PKG_USING_SEAN_WS2812B is not set +# CONFIG_PKG_USING_IC74HC165 is not set +# CONFIG_PKG_USING_IST8310 is not set +# CONFIG_PKG_USING_ST7789_SPI is not set +# CONFIG_PKG_USING_CAN_UDS is not set +# CONFIG_PKG_USING_ISOTP_C is not set +# CONFIG_PKG_USING_IKUNLED is not set +# CONFIG_PKG_USING_INS5T8025 is not set +# CONFIG_PKG_USING_SPI_TOOLS is not set +# end of peripheral libraries and drivers + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set +# CONFIG_PKG_USING_R_TINYMAIX is not set +# CONFIG_PKG_USING_LLMCHAT is not set +# end of AI packages + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_APID is not set +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_QPID is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_KISSFFT is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set +# end of Signal Processing and Control Algorithm Packages + +# +# miscellaneous packages +# + +# +# project laboratory +# +# end of project laboratory + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# end of samples: kernel and components samples + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_TINYSQUARE is not set +# end of entertainment: terminal games and other interesting software packages + +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_RALARAM is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LIBCRC 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 +# CONFIG_PKG_USING_DRMP is not set +# end of miscellaneous packages + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects and Demos +# +# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_RTDUINO_SENSORFUSION_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set +# end of Projects and Demos + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set +# end of Sensors + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set +# end of Display + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set +# CONFIG_PKG_USING_ARDUINO_TICKER is not set +# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set +# end of Timing + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set +# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set +# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set +# end of Data Processing + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set +# end of Communication + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# end of Device Control + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# end of Other + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set +# end of Signal IO + +# +# Uncategorized +# +# end of Arduino libraries +# end of RT-Thread online packages + +CONFIG_SOC_FAMILY_N32=y +CONFIG_SOC_SERIES_N32H7xx=y + +# +# Hardware Drivers Config +# + +# +# Onboard Peripheral Drivers +# + +# +# 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_UART3 is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_HARD_I2C is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_ADC is not set +# end of On-chip Peripheral Drivers + +# +# Board extended module Drivers +# +# end of Hardware Drivers Config diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/.gitignore b/bsp/n32/n32hxxx/n32h760zil7-stb/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/.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/n32/n32hxxx/n32h760zil7-stb/Kconfig b/bsp/n32/n32hxxx/n32h760zil7-stb/Kconfig new file mode 100644 index 0000000000..5bc307c934 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/Kconfig @@ -0,0 +1,22 @@ +mainmenu "RT-Thread Configuration" + +BSP_DIR := . + +RTT_DIR := ../../../.. + +PKGS_DIR := packages + +config SOC_N32H760ZIL7 + bool + select SOC_SERIES_N32H7xx + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +source "$(RTT_DIR)/Kconfig" +osource "$PKGS_DIR/Kconfig" +rsource "../libraries/Kconfig" + +if !RT_USING_NANO +rsource "board/Kconfig" +endif diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/README_zh.md b/bsp/n32/n32hxxx/n32h760zil7-stb/README_zh.md new file mode 100644 index 0000000000..2de3427aa3 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/README_zh.md @@ -0,0 +1,107 @@ +# N32H760ZIL7-STB 开发板 BSP 说明 + +## 简介 + +本文档为 [OnlyoutzZ](https://github.com/OnlyoutzZ) 为 N32H760ZIL7-STB 开发板提供的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +N32H760ZIL7-STB 是 NSING 推出的一款基于 ARM Cortex-M7 内核的开发板,最高主频为 600Mhz,该开发板具有丰富的板载资源,可以充分发挥 N32H760 的芯片性能。 + +开发板外观如下图所示: + +![board](figures/board.png) + +该开发板常用 **板载资源** 如下: + +- MCU:N32H760,主频 600MHz,1920KB FLASH ,128KB AXI-SRAM +- 常用接口:USB 转串口(J1)、USB 接口(J2/J3)等 +- 调试接口:板载的 CMSIS-DAP SWD 下载(J1) + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------- | :----------: | :---------------- | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | | +| UART | 支持 | UART1/2/3 | +| IIC | 支持 | 硬件I2C1, 软件IIC | +| SPI | 支持 | SPI1 | +| RTC | 支持 | RTC | +| ADC | 支持 | ADC1/2/3 | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + +### 快速上手 + +本 BSP 为开发者提供 MDK5 工程。下面介绍如何在 MDK5 环境下将系统运行起来。 + +#### 硬件连接 + +使用 USB 数据线插入开发板 J1 接口并连接到 PC。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 CMSIS-DAP SWD 下载程序,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,LED 闪烁。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 5.3.0 build Jan 27 2026 16:53:58 + 2006 - 2024 Copyright by RT-Thread team +msh > +``` + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口 1 的功能,如果需使用更多高级功能,需要利用 ENV 工具对 BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk5` 命令重新生成工程。 + +## 注意事项 + +- 调试串口为串口 1 映射说明 + + PA9 ------> USART1_TX + + PA10 ------> USART1_RX + +## 联系人信息 + +维护人: + +- [OnlyoutzZ](https://github.com/OnlyoutzZ) diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/SConscript b/bsp/n32/n32hxxx/n32h760zil7-stb/SConscript new file mode 100644 index 0000000000..4990dfeed8 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/SConscript @@ -0,0 +1,19 @@ +# for module compiling +import os +Import('RTT_ROOT') +Import('env') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +env.Append(CPPDEFINES = ['N32H76x']) + +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/n32/n32hxxx/n32h760zil7-stb/SConstruct b/bsp/n32/n32hxxx/n32h760zil7-stb/SConstruct new file mode 100644 index 0000000000..175c880f66 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/SConstruct @@ -0,0 +1,54 @@ +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('env') +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' + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +rtconfig.BSP_LIBRARY_TYPE = None + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'N32_Drivers', 'SConscript'),variant_dir='build/libraries/N32_Drivers', duplicate=0)) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/applications/SConscript b/bsp/n32/n32hxxx/n32h760zil7-stb/applications/SConscript new file mode 100644 index 0000000000..9bb9abae89 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/applications/SConscript @@ -0,0 +1,15 @@ +from building import * +import os + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/applications/main.c b/bsp/n32/n32hxxx/n32h760zil7-stb/applications/main.c new file mode 100644 index 0000000000..5d26523a64 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#include +#include +#include +#ifndef RT_USING_NANO +#include +#endif /* RT_USING_NANO */ + +/* defined the LED0 pin: PA1 */ +#define LED0_PIN GET_PIN(A, 1) + +int main(void) +{ + /* set LED0 pin mode to output */ + rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); + + while (1) + { + rt_pin_write(LED0_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED0_PIN, PIN_LOW); + rt_thread_mdelay(500); + } +} \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Cube_Config.ntfx b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Cube_Config.ntfx new file mode 100644 index 0000000000000000000000000000000000000000..84d3b05a01940a4012492b8451b9a30232acd874 GIT binary patch literal 4998 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 E2ddtb7ytkO literal 0 HcmV?d00001 diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_armcc.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_armcc.h new file mode 100644 index 0000000000..59f173ac71 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/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/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_armclang.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_armclang.h new file mode 100644 index 0000000000..e917f357a3 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/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/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_armclang_ltm.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_armclang_ltm.h new file mode 100644 index 0000000000..feec324059 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/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/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_compiler.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_compiler.h new file mode 100644 index 0000000000..adbf296f15 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/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/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_gcc.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_gcc.h new file mode 100644 index 0000000000..3ddcc58b69 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_gcc.h @@ -0,0 +1,2168 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC 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. + */ + +#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 + +/* ########################### 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. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + 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"); +} + + +#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) :: "memory"); + 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) :: "memory"); + 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. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + 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 */ + + +/* ########################## 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") + + +/** + \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") + + +/** + \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 volatile ("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 volatile ("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 volatile ("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 volatile ("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 ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __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 ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __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) ); + 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) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); + 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) ); + 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) ); + 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) ); + 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) ); + 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) ); + 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 */ + + +/* ################### 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); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + 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) \ +({ \ + 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; \ + }) +#endif + +#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 */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_iccarm.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_iccarm.h new file mode 100644 index 0000000000..12d68fd9a6 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_iccarm.h @@ -0,0 +1,964 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.1.0 + * @date 08. May 2019 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2019 IAR Systems +// Copyright (c) 2017-2019 Arm Limited. All rights reserved. +// +// 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 __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#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 + #if __ICCARM_V8 + #define __RESTRICT __restrict + #else + /* Needs IAR language extensions */ + #define __RESTRICT restrict + #endif +#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 __PROGRAM_START +#define __PROGRAM_START __iar_program_start +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP CSTACK$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT CSTACK$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __vector_table +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE @".intvec" +#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/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_version.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_version.h new file mode 100644 index 0000000000..f2e2746626 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.3 + * @date 24. June 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 __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 ( 3U) /*!< [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/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv81mml.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv81mml.h new file mode 100644 index 0000000000..8441e57fb1 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv81mml.h @@ -0,0 +1,2968 @@ +/**************************************************************************//** + * @file core_armv81mml.h + * @brief CMSIS Armv8.1-M Mainline Core Peripheral Access Layer Header File + * @version V1.0.0 + * @date 15. March 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. + */ + +#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_ARMV81MML_H_GENERIC +#define __CORE_ARMV81MML_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_ARMV81MML + @{ + */ + +#include "cmsis_version.h" + +#define __ARM_ARCH_8M_MAIN__ 1 // patching for now +/* CMSIS ARMV81MML definitions */ +#define __ARMv81MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv81MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv81MML_CMSIS_VERSION ((__ARMv81MML_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv81MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (81U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV81MML_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV81MML_H_DEPENDANT +#define __CORE_ARMV81MML_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv81MML_REV + #define __ARMv81MML_REV 0x0000U + #warning "__ARMv81MML_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT 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 __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_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 ARMv81MML */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU 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:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..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 */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + 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_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __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 SHPR[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 ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#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 */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS 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_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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 */ + +/* 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN 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 */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#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_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT 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_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT 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_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR 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_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR 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_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF 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 */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM 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 */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} 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 */ + +/*@} 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[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + 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[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __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 Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< 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_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA 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 Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION 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 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} 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_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS 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 Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#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_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH 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 Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes 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 */ + __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 (0x3UL << 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 (0x3UL << 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_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY 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 (0x3UL << 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 (0x3UL << 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_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< 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_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType 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 Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} 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_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ +#define MPU_RLAR_PXN_Msk (0x1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \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 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status 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_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST 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 */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN 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 + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * 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 + + + +/** + \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 << 8U) ); /* Insert write key and priorty 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) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \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); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((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; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \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 vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \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(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state 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 TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->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 << 8U) ); /* Insert write key and priorty group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state 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 TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.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) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## 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 */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#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_ARMV81MML_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv8mbl.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv8mbl.h new file mode 100644 index 0000000000..344dca5148 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv8mbl.h @@ -0,0 +1,1921 @@ +/**************************************************************************//** + * @file core_armv8mbl.h + * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 12. November 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. + */ + +#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_ARMV8MBL_H_GENERIC +#define __CORE_ARMV8MBL_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_ARMv8MBL + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M ( 2U) /*!< 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_ARMV8MBL_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MBL_H_DEPENDANT +#define __CORE_ARMV8MBL_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MBL_REV + #define __ARMv8MBL_REV 0x0000U + #warning "__ARMv8MBL_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT 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 __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #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 + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT 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 ARMv8MBL */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU 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:28; /*!< bit: 0..27 Reserved */ + 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 */ + + +/** + \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:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + 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_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T 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-pointer select */ + 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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} 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 */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __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 */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#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 */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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 */ + +/* 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN 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 */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED 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_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_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \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_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 */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} 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 */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#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_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH 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 Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes 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 */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER 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_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan 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 Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented 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_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth 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 Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* 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_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \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 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status 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_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST 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_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 */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA 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_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 */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN 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 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 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 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 + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick 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 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \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); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \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->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \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->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (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. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \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) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \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 = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state 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 TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.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 */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## 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 */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv8mml.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv8mml.h new file mode 100644 index 0000000000..5ddb8aeda7 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_armv8mml.h @@ -0,0 +1,2835 @@ +/**************************************************************************//** + * @file core_armv8mml.h + * @brief CMSIS Armv8-M Mainline Core Peripheral Access Layer Header File + * @version V5.1.0 + * @date 12. September 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. + */ + +#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_ARMV8MML_H_GENERIC +#define __CORE_ARMV8MML_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_ARMv8MML + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS Armv8MML definitions */ +#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (81U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MML_H_DEPENDANT +#define __CORE_ARMV8MML_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MML_REV + #define __ARMv8MML_REV 0x0000U + #warning "__ARMv8MML_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT 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 __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_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 ARMv8MML */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU 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:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..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 */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + 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_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __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 SHPR[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 ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ +} 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#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 */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS 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_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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 */ + +/* 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN 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 */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#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_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT 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_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT 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_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR 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_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR 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_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF 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 */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set 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 */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} 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 */ + +/*@} 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[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __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 Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< 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_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA 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 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} 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_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS 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 Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#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_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH 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 Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes 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 */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER 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_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan 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 Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented 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_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth 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 Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} 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_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \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 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status 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_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST 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 */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN 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 + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * 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 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \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); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((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; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \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 vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \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(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state 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 TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->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_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state 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 TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.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) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## 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 */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#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_ARMV8MML_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm0.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm0.h new file mode 100644 index 0000000000..cafae5a0a7 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm0.h @@ -0,0 +1,952 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V5.0.6 + * @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_CM0_H_GENERIC +#define __CORE_CM0_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_M0 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ + __CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< 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_CM0_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0_H_DEPENDANT +#define __CORE_CM0_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0_REV + #define __CM0_REV 0x0000U + #warning "__CM0_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #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_M0 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick 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:28; /*!< bit: 0..27 Reserved */ + 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 */ + + +/** + \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:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + 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_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T 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 _reserved0:1; /*!< bit: 0 Reserved */ + 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 */ + +/*@} 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[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} 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 */ + uint32_t RESERVED0; + __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 */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State 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_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* 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_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 */ + +/* 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_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 */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \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_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0 header file. + @{ + */ +/*@} 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 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 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 */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick 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 not available for Cortex-M0 */ + #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 */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \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[0U] = (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[0U] & (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[0U] = (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[0U] & (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[0U] = (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[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \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[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \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[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (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. + Address 0 must be mapped to SRAM. + \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 = 0x0U; + (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; + /* ARM Application Note 321 states that the M0 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 = 0x0U; + 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 = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## 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 */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm0plus.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm0plus.h new file mode 100644 index 0000000000..d104965db5 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm0plus.h @@ -0,0 +1,1085 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V5.0.7 + * @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_CM0PLUS_H_GENERIC +#define __CORE_CM0PLUS_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-M0+ + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0+ definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ + __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< 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_CM0PLUS_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0PLUS_H_DEPENDANT +#define __CORE_CM0PLUS_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0PLUS_REV + #define __CM0PLUS_REV 0x0000U + #warning "__CM0PLUS_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 __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #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-M0+ */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick 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:28; /*!< bit: 0..27 Reserved */ + 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 */ + + +/** + \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:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + 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_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T 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[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RESERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} 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 */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __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 */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State 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_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << 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_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 */ + +/* 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_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 */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \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 */ + +#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 */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* 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 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << 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 Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0+ header file. + @{ + */ +/*@} 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 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 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 */ + +#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 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 not available for Cortex-M0+ */ + #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 */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \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[0U] = (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[0U] & (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[0U] = (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[0U] & (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[0U] = (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[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \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[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \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[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (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. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t vectors = SCB->VTOR; +#else + uint32_t vectors = 0x0U; +#endif + (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; + /* ARM Application Note 321 states that the M0+ 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) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t vectors = SCB->VTOR; +#else + uint32_t vectors = 0x0U; +#endif + 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 = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __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 */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm1.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm1.h new file mode 100644 index 0000000000..76b4569743 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm1.h @@ -0,0 +1,979 @@ +/**************************************************************************//** + * @file core_cm1.h + * @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File + * @version V1.0.1 + * @date 12. November 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. + */ + +#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_CM1_H_GENERIC +#define __CORE_CM1_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_M1 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM1 definitions */ +#define __CM1_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM1_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM1_CMSIS_VERSION ((__CM1_CMSIS_VERSION_MAIN << 16U) | \ + __CM1_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (1U) /*!< 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_CM1_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM1_H_DEPENDANT +#define __CORE_CM1_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM1_REV + #define __CM1_REV 0x0100U + #warning "__CM1_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #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_M1 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick 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:28; /*!< bit: 0..27 Reserved */ + 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 */ + + +/** + \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:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + 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_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T 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 _reserved0:1; /*!< bit: 0 Reserved */ + 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 */ + +/*@} 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[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} 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 */ + uint32_t RESERVED0; + __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 */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State 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_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* 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_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 */ + +/* 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_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 */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED 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[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_ITCMUAEN_Pos 4U /*!< ACTLR: Instruction TCM Upper Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMUAEN_Msk (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos) /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */ + +#define SCnSCB_ACTLR_ITCMLAEN_Pos 3U /*!< ACTLR: Instruction TCM Lower Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMLAEN_Msk (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos) /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */ + +/*@} 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_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M1 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M1 header file. + @{ + */ +/*@} 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 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 */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick 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 not available for Cortex-M1 */ + #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 */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \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[0U] = (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[0U] & (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[0U] = (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[0U] & (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[0U] = (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[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \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[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \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[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (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. + Address 0 must be mapped to SRAM. + \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 *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + /* ARM Application Note 321 states that the M1 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 *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \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 = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## 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 */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm23.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm23.h new file mode 100644 index 0000000000..b79c6af0b1 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm23.h @@ -0,0 +1,1996 @@ +/**************************************************************************//** + * @file core_cm23.h + * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 12. November 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. + */ + +#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_CM23_H_GENERIC +#define __CORE_CM23_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_M23 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ + __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (23U) /*!< 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_CM23_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM23_H_DEPENDANT +#define __CORE_CM23_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM23_REV + #define __CM23_REV 0x0000U + #warning "__CM23_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT 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 __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #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 + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT 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_M23 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU 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:28; /*!< bit: 0..27 Reserved */ + 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 */ + + +/** + \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:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + 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_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T 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-pointer select */ + 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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} 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 */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __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 */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#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 */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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 */ + +/* 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN 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 */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED 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_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_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \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_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 */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} 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 */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#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_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH 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 */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __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/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} 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_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan 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 Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S 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_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< 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 Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* 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_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \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 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status 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_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST 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_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 */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA 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_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 */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN 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 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 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 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 + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick 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 not available for Cortex-M23 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ + #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 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \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); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \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->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \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->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (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. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \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) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \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 = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state 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 TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.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 */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## 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 */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm3.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm3.h new file mode 100644 index 0000000000..8157ca782d --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/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/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm33.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm33.h new file mode 100644 index 0000000000..7fed59a88e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm33.h @@ -0,0 +1,2910 @@ +/**************************************************************************//** + * @file core_cm33.h + * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File + * @version V5.1.0 + * @date 12. November 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. + */ + +#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_CM33_H_GENERIC +#define __CORE_CM33_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_M33 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM33 definitions */ +#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ + __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (33U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_FP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM33_H_DEPENDANT +#define __CORE_CM33_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM33_REV + #define __CM33_REV 0x0000U + #warning "__CM33_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT 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 __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_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_M33 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU 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:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..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 */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + 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_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __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 SHPR[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 ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ +} 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#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 */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS 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_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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 */ + +/* 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN 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 */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#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_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT 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_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT 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_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR 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_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR 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_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF 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 */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set 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 */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} 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 */ + +/*@} 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[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __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 Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* 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_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA 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 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} 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_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS 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 Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#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_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH 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 */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __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/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} 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_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan 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 Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S 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_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< 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 Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} 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_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \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 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status 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_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST 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 */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN 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 + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * 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 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \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); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((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; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \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 vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \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(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state 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 TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->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_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state 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 TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.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) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## 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 */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#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_CM33_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm35p.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm35p.h new file mode 100644 index 0000000000..5579c82306 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm35p.h @@ -0,0 +1,2910 @@ +/**************************************************************************//** + * @file core_cm35p.h + * @brief CMSIS Cortex-M35P Core Peripheral Access Layer Header File + * @version V1.0.0 + * @date 12. November 2018 + ******************************************************************************/ +/* + * Copyright (c) 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. + */ + +#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_CM35P_H_GENERIC +#define __CORE_CM35P_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_M35P + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM35P definitions */ +#define __CM35P_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM35P_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM35P_CMSIS_VERSION ((__CM35P_CMSIS_VERSION_MAIN << 16U) | \ + __CM35P_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (35U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_FP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM35P_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM35P_H_DEPENDANT +#define __CORE_CM35P_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM35P_REV + #define __CM35P_REV 0x0000U + #warning "__CM35P_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT 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 __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_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_M35P */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU 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:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..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 */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + 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_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#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[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __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 SHPR[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 ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ +} 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#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 */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS 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_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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 */ + +/* 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN 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 */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#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_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT 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_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT 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_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR 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_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR 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_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF 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 */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set 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 */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} 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 */ + +/*@} 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[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __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 Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* 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_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA 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 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} 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_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS 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 Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#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_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH 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 */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __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/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} 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_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan 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 Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S 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_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< 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 Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} 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_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \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 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status 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_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST 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 */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN 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 + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * 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 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \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); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((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; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \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 vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \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(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state 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 TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->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_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state 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 TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.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) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## 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 */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, 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 TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#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_CM35P_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm4.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm4.h new file mode 100644 index 0000000000..12c023b801 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm4.h @@ -0,0 +1,2124 @@ +/**************************************************************************//** + * @file core_cm4.h + * @brief CMSIS Cortex-M4 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_CM4_H_GENERIC +#define __CORE_CM4_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_M4 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (4U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM4_H_DEPENDANT +#define __CORE_CM4_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM4_REV + #define __CM4_REV 0x0000U + #warning "__CM4_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT 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_M4 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU 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:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..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 */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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 GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..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_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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 FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#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 */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* 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_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR 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_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR 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 */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} 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 */ +#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 */ + +/*@} 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 /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and FP Feature Register 2 Definitions */ + +#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ +#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \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 + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * 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 */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ + + +/** + \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 M4 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) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + 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_CM4_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm7.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm7.h new file mode 100644 index 0000000000..c4515d8fa3 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_cm7.h @@ -0,0 +1,2725 @@ +/**************************************************************************//** + * @file core_cm7.h + * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File + * @version V5.1.1 + * @date 28. 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_CM7_H_GENERIC +#define __CORE_CM7_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_M7 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM7 definitions */ +#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ + __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (7U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_FP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM7_H_DEPENDANT +#define __CORE_CM7_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM7_REV + #define __CM7_REV 0x0000U + #warning "__CM7_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT 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 __ICACHE_PRESENT + #define __ICACHE_PRESENT 0U + #warning "__ICACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DCACHE_PRESENT + #define __DCACHE_PRESENT 0U + #warning "__DCACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DTCM_PRESENT + #define __DTCM_PRESENT 0U + #warning "__DTCM_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_M7 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU 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:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..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 */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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 GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..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_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE 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 FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#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 SHPR[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 ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED3[93U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status 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 */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* 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_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ + +#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_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR 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_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR 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 */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM 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 */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} 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 */ +#define SCnSCB_ACTLR_DISDYNADD_Pos 26U /*!< ACTLR: DISDYNADD Position */ +#define SCnSCB_ACTLR_DISDYNADD_Msk (1UL << SCnSCB_ACTLR_DISDYNADD_Pos) /*!< ACTLR: DISDYNADD Mask */ + +#define SCnSCB_ACTLR_DISISSCH1_Pos 21U /*!< ACTLR: DISISSCH1 Position */ +#define SCnSCB_ACTLR_DISISSCH1_Msk (0x1FUL << SCnSCB_ACTLR_DISISSCH1_Pos) /*!< ACTLR: DISISSCH1 Mask */ + +#define SCnSCB_ACTLR_DISDI_Pos 16U /*!< ACTLR: DISDI Position */ +#define SCnSCB_ACTLR_DISDI_Msk (0x1FUL << SCnSCB_ACTLR_DISDI_Pos) /*!< ACTLR: DISDI Mask */ + +#define SCnSCB_ACTLR_DISCRITAXIRUR_Pos 15U /*!< ACTLR: DISCRITAXIRUR Position */ +#define SCnSCB_ACTLR_DISCRITAXIRUR_Msk (1UL << SCnSCB_ACTLR_DISCRITAXIRUR_Pos) /*!< ACTLR: DISCRITAXIRUR Mask */ + +#define SCnSCB_ACTLR_DISBTACALLOC_Pos 14U /*!< ACTLR: DISBTACALLOC Position */ +#define SCnSCB_ACTLR_DISBTACALLOC_Msk (1UL << SCnSCB_ACTLR_DISBTACALLOC_Pos) /*!< ACTLR: DISBTACALLOC Mask */ + +#define SCnSCB_ACTLR_DISBTACREAD_Pos 13U /*!< ACTLR: DISBTACREAD Position */ +#define SCnSCB_ACTLR_DISBTACREAD_Msk (1UL << SCnSCB_ACTLR_DISBTACREAD_Pos) /*!< ACTLR: DISBTACREAD Mask */ + +#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ + +#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ +#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ + +#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ +#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS 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_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} 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 */ + uint32_t RESERVED3[981U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ +} 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 /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and FP Feature Register 2 Definitions */ + +#define FPU_MVFR2_VFP_Misc_Pos 4U /*!< MVFR2: VFP Misc bits Position */ +#define FPU_MVFR2_VFP_Misc_Msk (0xFUL << FPU_MVFR2_VFP_Misc_Pos) /*!< MVFR2: VFP Misc bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \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 + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * 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 */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ + + +/** + \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->SHPR[(((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->SHPR[(((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; + __DSB(); +} + + +/** + \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) +{ + uint32_t mvfr0; + + mvfr0 = SCB->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## Cache functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_CacheFunctions Cache Functions + \brief Functions that configure Instruction and Data cache. + @{ + */ + +/* Cache Size ID Register Macros */ +#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) +#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) + +#define __SCB_DCACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ +#define __SCB_ICACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ + +/** + \brief Enable I-Cache + \details Turns on I-Cache + */ +__STATIC_FORCEINLINE void SCB_EnableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + if (SCB->CCR & SCB_CCR_IC_Msk) return; /* return if ICache is already enabled */ + + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable I-Cache + \details Turns off I-Cache + */ +__STATIC_FORCEINLINE void SCB_DisableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate I-Cache + \details Invalidates I-Cache + */ +__STATIC_FORCEINLINE void SCB_InvalidateICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; + __DSB(); + __ISB(); + #endif +} + + +/** + \brief I-Cache Invalidate by address + \details Invalidates I-Cache for the given address. + I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. + I-Cache memory blocks which are part of given address + given size are invalidated. + \param[in] addr address + \param[in] isize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_InvalidateICache_by_Addr (void *addr, int32_t isize) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + if ( isize > 0 ) { + int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_ICACHE_LINE_SIZE; + op_size -= __SCB_ICACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief Enable D-Cache + \details Turns on D-Cache + */ +__STATIC_FORCEINLINE void SCB_EnableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + __DSB(); + + SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable D-Cache + \details Turns off D-Cache + */ +__STATIC_FORCEINLINE void SCB_DisableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate D-Cache + \details Invalidates D-Cache + */ +__STATIC_FORCEINLINE void SCB_InvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean D-Cache + \details Cleans D-Cache + */ +__STATIC_FORCEINLINE void SCB_CleanDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | + ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean & Invalidate D-Cache + \details Cleans and Invalidates D-Cache + */ +__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Invalidate by address + \details Invalidates D-Cache for the given address. + D-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are invalidated. + \param[in] addr address + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_InvalidateDCache_by_Addr (void *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief D-Cache Clean by address + \details Cleans D-Cache for the given address + D-Cache is cleaned starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are cleaned. + \param[in] addr address + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + + +/** + \brief D-Cache Clean and Invalidate by address + \details Cleans and invalidates D_Cache for the given address + D-Cache is cleaned and invalidated starting from a 32 byte aligned address in 32 byte granularity. + D-Cache memory blocks which are part of given address + given size are cleaned and invalidated. + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_FORCEINLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } + #endif +} + +/*@} end of CMSIS_Core_CacheFunctions */ + + + +/* ################################## 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_CM7_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_sc000.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_sc000.h new file mode 100644 index 0000000000..cf92577b63 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_sc000.h @@ -0,0 +1,1025 @@ +/**************************************************************************//** + * @file core_sc000.h + * @brief CMSIS SC000 Core Peripheral Access Layer Header File + * @version V5.0.6 + * @date 12. November 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. + */ + +#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_SC000_H_GENERIC +#define __CORE_SC000_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 SC000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC000 definitions */ +#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ + __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (000U) /*!< Cortex secure 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_SC000_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC000_H_DEPENDANT +#define __CORE_SC000_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC000_REV + #define __SC000_REV 0x0000U + #warning "__SC000_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 2U + #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 SC000 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick 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:28; /*!< bit: 0..27 Reserved */ + 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 */ + + +/** + \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:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + 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_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T 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 _reserved0:1; /*!< bit: 0 Reserved */ + 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 */ + +/*@} 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[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} 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 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + uint32_t RESERVED1[154U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features 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_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* 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_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 */ + +/* 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_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 */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED 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[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} 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 */ + +#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 */ +} MPU_Type; + +/* 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 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << 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 SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the SC000 header file. + @{ + */ +/*@} 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 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 */ + +#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 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 not available for SC000 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ + #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 not available for SC000 */ + #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 */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \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[0U] = (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[0U] & (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[0U] = (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[0U] & (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[0U] = (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[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \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[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \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[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \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; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + /* ARM Application Note 321 states that the M0 and M0+ do not require the architectural barrier - assume SC000 is the same */ +} + + +/** + \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 vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \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 = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## 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 */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_sc300.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_sc300.h new file mode 100644 index 0000000000..40f3af81be --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/core_sc300.h @@ -0,0 +1,1912 @@ +/**************************************************************************//** + * @file core_sc300.h + * @brief CMSIS SC300 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 31. 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. + */ + +#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_SC300_H_GENERIC +#define __CORE_SC300_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 SC3000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC300 definitions */ +#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ + __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (300U) /*!< Cortex secure 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_SC300_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC300_H_DEPENDANT +#define __CORE_SC300_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC300_REV + #define __SC300_REV 0x0000U + #warning "__SC300_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 SC300 */ + + + +/******************************************************************************* + * 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 */ + uint32_t RESERVED1[129U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features 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 */ +#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 */ + +/* 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 */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} 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 */ +#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 */ + +/*@} 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 (0xFUL /*<< 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; + +/* 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 */ + + +/* ########################## 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_SC300_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/mpu_armv7.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/mpu_armv7.h new file mode 100644 index 0000000000..66ef59b4a0 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/mpu_armv7.h @@ -0,0 +1,272 @@ +/****************************************************************************** + * @file mpu_armv7.h + * @brief CMSIS MPU API for Armv7-M MPU + * @version V5.1.0 + * @date 08. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2017-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 ARM_MPU_ARMV7_H +#define ARM_MPU_ARMV7_H + +#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes +#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes +#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes +#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes +#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes +#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte +#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes +#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes +#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes +#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes +#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes +#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes +#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes +#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes +#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes +#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte +#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes +#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes +#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes +#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes +#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes +#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes +#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes +#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes +#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes +#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte +#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes +#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes + +#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access +#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only +#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only +#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access +#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only +#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access + +/** MPU Region Base Address Register Value +* +* \param Region The region to be configured, number 0 to 15. +* \param BaseAddress The base address for the region. +*/ +#define ARM_MPU_RBAR(Region, BaseAddress) \ + (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ + ((Region) & MPU_RBAR_REGION_Msk) | \ + (MPU_RBAR_VALID_Msk)) + +/** +* MPU Memory Access Attributes +* +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +*/ +#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \ + ((((TypeExtField) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ + (((IsShareable) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ + (((IsCacheable) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ + (((IsBufferable) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \ + ((((DisableExec) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ + (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ + (((AccessAttributes) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | \ + (((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \ + (((Size) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \ + (((MPU_RASR_ENABLE_Msk)))) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ + ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) + +/** +* MPU Memory Access Attribute for strongly ordered memory. +* - TEX: 000b +* - Shareable +* - Non-cacheable +* - Non-bufferable +*/ +#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) + +/** +* MPU Memory Access Attribute for device memory. +* - TEX: 000b (if shareable) or 010b (if non-shareable) +* - Shareable or non-shareable +* - Non-cacheable +* - Bufferable (if shareable) or non-bufferable (if non-shareable) +* +* \param IsShareable Configures the device memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) + +/** +* MPU Memory Access Attribute for normal memory. +* - TEX: 1BBb (reflecting outer cacheability rules) +* - Shareable or non-shareable +* - Cacheable or non-cacheable (reflecting inner cacheability rules) +* - Bufferable or non-bufferable (reflecting inner cacheability rules) +* +* \param OuterCp Configures the outer cache policy. +* \param InnerCp Configures the inner cache policy. +* \param IsShareable Configures the memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U)) + +/** +* MPU Memory Access Attribute non-cacheable policy. +*/ +#define ARM_MPU_CACHEP_NOCACHE 0U + +/** +* MPU Memory Access Attribute write-back, write and read allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_WRA 1U + +/** +* MPU Memory Access Attribute write-through, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WT_NWA 2U + +/** +* MPU Memory Access Attribute write-back, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_NWA 3U + + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; //!< The region base address register value (RBAR) + uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + MPU->RNR = rnr; + MPU->RASR = 0U; +} + +/** Configure an MPU region. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) +{ + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) +{ + MPU->RNR = rnr; + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + while (cnt > MPU_TYPE_RALIASES) { + ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); + table += MPU_TYPE_RALIASES; + cnt -= MPU_TYPE_RALIASES; + } + ARM_MPU_OrderedMemcpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); +} + +#endif diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/mpu_armv8.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/mpu_armv8.h new file mode 100644 index 0000000000..0041d4dc6f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/mpu_armv8.h @@ -0,0 +1,346 @@ +/****************************************************************************** + * @file mpu_armv8.h + * @brief CMSIS MPU API for Armv8-M and Armv8.1-M MPU + * @version V5.1.0 + * @date 08. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2017-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 ARM_MPU_ARMV8_H +#define ARM_MPU_ARMV8_H + +/** \brief Attribute for device memory (outer only) */ +#define ARM_MPU_ATTR_DEVICE ( 0U ) + +/** \brief Attribute for non-cacheable, normal memory */ +#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) + +/** \brief Attribute for normal memory (outer and inner) +* \param NT Non-Transient: Set to 1 for non-transient data. +* \param WB Write-Back: Set to 1 to use write-back update policy. +* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. +* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. +*/ +#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ + (((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U)) + +/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) + +/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) + +/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGRE (2U) + +/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_GRE (3U) + +/** \brief Memory Attribute +* \param O Outer memory attributes +* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes +*/ +#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U))) + +/** \brief Normal memory non-shareable */ +#define ARM_MPU_SH_NON (0U) + +/** \brief Normal memory outer shareable */ +#define ARM_MPU_SH_OUTER (2U) + +/** \brief Normal memory inner shareable */ +#define ARM_MPU_SH_INNER (3U) + +/** \brief Memory access permissions +* \param RO Read-Only: Set to 1 for read-only memory. +* \param NP Non-Privileged: Set to 1 for non-privileged memory. +*/ +#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U)) + +/** \brief Region Base Address Register value +* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. +* \param SH Defines the Shareability domain for this memory region. +* \param RO Read-Only: Set to 1 for a read-only memory region. +* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. +* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. +*/ +#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ + ((BASE & MPU_RBAR_BASE_Msk) | \ + ((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ + ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ + ((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) + +/** \brief Region Limit Address Register value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR(LIMIT, IDX) \ + ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ + ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +#if defined(MPU_RLAR_PXN_Pos) + +/** \brief Region Limit Address Register with PXN value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param PXN Privileged execute never. Defines whether code can be executed from this privileged region. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \ + ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ + ((PXN << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \ + ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +#endif + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; /*!< Region Base Address Register value */ + uint32_t RLAR; /*!< Region Limit Address Register value */ +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +#ifdef MPU_NS +/** Enable the Non-secure MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) +{ + MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the Non-secure MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable_NS(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} +#endif + +/** Set the memory attribute encoding to the given MPU. +* \param mpu Pointer to the MPU to be configured. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) +{ + const uint8_t reg = idx / 4U; + const uint32_t pos = ((idx % 4U) * 8U); + const uint32_t mask = 0xFFU << pos; + + if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { + return; // invalid index + } + + mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); +} + +/** Set the memory attribute encoding. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU, idx, attr); +} + +#ifdef MPU_NS +/** Set the memory attribute encoding to the Non-secure MPU. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); +} +#endif + +/** Clear and disable the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) +{ + mpu->RNR = rnr; + mpu->RLAR = 0U; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU, rnr); +} + +#ifdef MPU_NS +/** Clear and disable the given Non-secure MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU_NS, rnr); +} +#endif + +/** Configure the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + mpu->RNR = rnr; + mpu->RBAR = rbar; + mpu->RLAR = rlar; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); +} + +#ifdef MPU_NS +/** Configure the given Non-secure MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); +} +#endif + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table to the given MPU. +* \param mpu Pointer to the MPU registers to be used. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + if (cnt == 1U) { + mpu->RNR = rnr; + ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); + } else { + uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); + uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; + + mpu->RNR = rnrBase; + while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { + uint32_t c = MPU_TYPE_RALIASES - rnrOffset; + ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); + table += c; + cnt -= c; + rnrOffset = 0U; + rnrBase += MPU_TYPE_RALIASES; + mpu->RNR = rnrBase; + } + + ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); + } +} + +/** Load the given number of MPU regions from a table. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU, rnr, table, cnt); +} + +#ifdef MPU_NS +/** Load the given number of MPU regions from a table to the Non-secure MPU. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); +} +#endif + +#endif + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/tz_context.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/tz_context.h new file mode 100644 index 0000000000..0d09749f3a --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/core/tz_context.h @@ -0,0 +1,70 @@ +/****************************************************************************** + * @file tz_context.h + * @brief Context Management for Armv8-M TrustZone + * @version V1.0.1 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-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. + */ + +#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 TZ_CONTEXT_H +#define TZ_CONTEXT_H + +#include + +#ifndef TZ_MODULEID_T +#define TZ_MODULEID_T +/// \details Data type that identifies secure software modules called by a process. +typedef uint32_t TZ_ModuleId_t; +#endif + +/// \details TZ Memory ID identifies an allocated memory slot. +typedef uint32_t TZ_MemoryId_t; + +/// Initialize secure context memory system +/// \return execution status (1: success, 0: error) +uint32_t TZ_InitContextSystem_S (void); + +/// Allocate context memory for calling secure software modules in TrustZone +/// \param[in] module identifies software modules called from non-secure mode +/// \return value != 0 id TrustZone memory slot identifier +/// \return value 0 no memory available or internal error +TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); + +/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); + +/// Load secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); + +/// Store secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); + +#endif // TZ_CONTEXT_H diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/n32h76x_78x.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/n32h76x_78x.h new file mode 100644 index 0000000000..2135d1eda0 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/n32h76x_78x.h @@ -0,0 +1,27708 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_H__ +#define __N32H76X_78X_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** N32H76x_78x_Library_Basic **/ + +#if !defined USE_STDPERIPH_DRIVER +/* + * Comment the line below if you will not use the peripherals drivers. + In this case, these drivers will not be included and the application code will + be based on direct access to peripherals registers + */ +#define USE_STDPERIPH_DRIVER +#endif + +/* + * In the following line adjust the value of External High Speed oscillator (HSE) + used in your application + + Tip: To avoid modifying this file each time you need to use different HSE, you + can define the HSE value in your toolchain compiler preprocessor. + */ +#if !defined HSE_VALUE +#define HSE_VALUE (25000000U) /* Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +/** In the following line adjust the HSE\HSI\LSI\LSE Startup + Timeout value **/ +#define HSE_STARTUP_TIMEOUT ((uint32_t)0xF0000000) /* SYSCLK= 600M Time out for HSE start up */ +#define HSI_STARTUP_TIMEOUT ((uint16_t)0x1800) /* SYSCLK= 600M Time out for HSI start up */ +#define MSI_STARTUP_TIMEOUT ((uint16_t)0x1800) /* SYSCLK= 600M Time out for HSI start up */ +#define LSI_STARTUP_TIMEOUT ((uint16_t)0xF000) /* SYSCLK= 600M Time out for LSI start up */ +#define SECLSI_STARTUP_TIMEOUT ((uint16_t)0xF000) /* SYSCLK= 600M Time out for LSI start up */ +#define LSE_STARTUP_TIMEOUT ((uint32_t)0x18000000) /* SYSCLK= 600M Time out for LSE start up */ + +#define HSI_VALUE (64000000U) /* Value of the Internal oscillator in Hz*/ +#define MSI_VALUE (16000000U) /* Value of the Internal Medium Speed oscillator in Hz*/ +#define LSI_VALUE (32000U) /* Value of the Internal Low Speed oscillator in Hz*/ + +#define __N32H76x_78x_STDPERIPH_VERSION_MAIN (0x00) /* [31:24] main version */ +#define __N32H76x_78x_STDPERIPH_VERSION_SUB1 (0x00) /* [23:16] sub1 version */ +#define __N32H76x_78x_STDPERIPH_VERSION_SUB2 (0x01) /* [15:8] sub2 version */ +#define __N32H76x_78x_STDPERIPH_VERSION_RC (0x00) /* [7:0] release candidate */ + +/** N32H76x_78x Standard Peripheral Library version number */ +#define __N32H76x_78x_STDPERIPH_VERSION \ + ((__N32H76x_78x_STDPERIPH_VERSION_MAIN << 24) | (__N32H76x_78x_STDPERIPH_VERSION_SUB1 << 16) \ + | (__N32H76x_78x_STDPERIPH_VERSION_SUB2 << 8) | (__N32H76x_78x_STDPERIPH_VERSION_RC)) + +/* + * Configuration of the Cortex-M7 Processor and Core Peripherals + */ +#if defined (N32H76x) || defined (N32H78x) +#define __MPU_PRESENT 1 /* MPU present*/ +#define __FPU_PRESENT 1 /* FPU present */ +#else +#define __MPU_PRESENT 1 /*!< CORE CM7 devices provide an MPU */ +#define __FPU_PRESENT 1 /*!< FPU present */ +#endif /* N32H76x_78x */ + +#if defined (N32H78x) +#define DUAL_CORE +#endif +#define __NVIC_PRIO_BITS 4 /* N32H76x_78x uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0 /* Set to 1 if different SysTick Config is used */ + + +/** + * N32H76x_78x Interrupt Number Definition + */ +typedef enum IRQn +{ + /****** Processor Exceptions Numbers ***********************************************************/ + NonMaskableInt_IRQn = -14, /* 2 Non Maskable Interrupt */ + HardFault_IRQn = -13, /* 3 Hard Fault Interrupt */ + MemoryManagement_IRQn = -12, /* 4 Memory Management Interrupt */ + BusFault_IRQn = -11, /* 5 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /* 6 Usage Fault Interrupt */ + SVCall_IRQn = -5, /* 11 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /* 12 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /* 14 Pend SV Interrupt */ + SysTick_IRQn = -1, /* 15 System Tick Interrupt */ +#ifdef CORE_CM4 + WWDG2_IRQn = 0, /* Window2 Watchdog interrupt */ +#endif /* CORE_CM4 */ +#ifdef CORE_CM7 + WWDG1_IRQn = 0, /* Window1 Watchdog interrupt */ +#endif /* CORE_CM7 */ + PVD_IRQn = 1, /* PVD through EXTI Line16 detection interrupt */ + RTC_TAMPER_IRQn = 2, /* RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt */ + RTC_WKUP_IRQn = 3, /* RTC Wakeup timer through EXTI line 19 interrupt */ + RCC_IRQn = 4, /* RCC interrupt */ + EXTI0_IRQn = 5, /* EXTI Line 0 interrupt */ + EXTI1_IRQn = 6, /* EXTI Line 1 interrupt */ + EXTI2_IRQn = 7, /* EXTI Line 2 interrupt */ + EXTI3_IRQn = 8, /* EXTI Line 3 interrupt */ + EXTI4_IRQn = 9, /* EXTI Line 4 interrupt */ + EXTI9_5_IRQn = 10, /* EXTI Line[9:5] interrupt */ + EXTI15_10_IRQn = 11, /* EXTI Line[15:10] interrupt */ + DMA1_Channel0_IRQn = 12, /* DMA1 Channel 0 global interrupt */ + DMA1_Channel1_IRQn = 13, /* DMA1 Channel 1 global interrupt */ + DMA1_Channel2_IRQn = 14, /* DMA1 Channel 2 global interrupt */ + DMA1_Channel3_IRQn = 15, /* DMA1 Channel 3 global interrupt */ + DMA1_Channel4_IRQn = 16, /* DMA1 Channel 4 global interrupt */ + DMA1_Channel5_IRQn = 17, /* DMA1 Channel 5 global interrupt */ + DMA1_Channel6_IRQn = 18, /* DMA1 Channel 6 global interrupt */ + DMA1_Channel7_IRQn = 19, /* DMA1 Channel 7 global interrupt */ + DMA2_Channel0_IRQn = 20, /* DMA2 Channel 0 global interrupt */ + DMA2_Channel1_IRQn = 21, /* DMA2 Channel 1 global interrupt */ + DMA2_Channel2_IRQn = 22, /* DMA2 Channel 2 global interrupt */ + DMA2_Channel3_IRQn = 23, /* DMA2 Channel 3 global interrupt */ + DMA2_Channel4_IRQn = 24, /* DMA2 Channel 4 global interrupt */ + DMA2_Channel5_IRQn = 25, /* DMA2 Channel 5 global interrupt */ + DMA2_Channel6_IRQn = 26, /* DMA2 Channel 6 global interrupt */ + DMA2_Channel7_IRQn = 27, /* DMA2 Channel 7 global interrupt */ + DMA3_Channel0_IRQn = 28, /* DMA3 Channel 0 global interrupt */ + DMA3_Channel1_IRQn = 29, /* DMA3 Channel 1 global interrupt */ + DMA3_Channel2_IRQn = 30, /* DMA3 Channel 2 global interrupt */ + DMA3_Channel3_IRQn = 31, /* DMA3 Channel 3 global interrupt */ + DMA3_Channel4_IRQn = 32, /* DMA3 Channel 4 global interrupt */ + DMA3_Channel5_IRQn = 33, /* DMA3 Channel 5 global interrupt */ + DMA3_Channel6_IRQn = 34, /* DMA3 Channel 6 global interrupt */ + DMA3_Channel7_IRQn = 35, /* DMA3 Channel 7 global interrupt */ + MDMA_Channel0_IRQn = 36, /* MDMA Channel 0 global interrupt */ + MDMA_Channel1_IRQn = 37, /* MDMA Channel 1 global interrupt */ + MDMA_Channel2_IRQn = 38, /* MDMA Channel 2 global interrupt */ + MDMA_Channel3_IRQn = 39, /* MDMA Channel 3 global interrupt */ + MDMA_Channel4_IRQn = 40, /* MDMA Channel 4 global interrupt */ + MDMA_Channel5_IRQn = 41, /* MDMA Channel 5 global interrupt */ + MDMA_Channel6_IRQn = 42, /* MDMA Channel 6 global interrupt */ + MDMA_Channel7_IRQn = 43, /* MDMA Channel 7 global interrupt */ + MDMA_Channel8_IRQn = 44, /* MDMA Channel 8 global interrupt */ + MDMA_Channel9_IRQn = 45, /* MDMA Channel 9 global interrupt */ + MDMA_Channel10_IRQn = 46, /* MDMA Channel 10 global interrupt */ + MDMA_Channel11_IRQn = 47, /* MDMA Channel 11 global interrupt */ + MDMA_Channel12_IRQn = 48, /* MDMA Channel 12 global interrupt */ + MDMA_Channel13_IRQn = 49, /* MDMA Channel 13 global interrupt */ + MDMA_Channel14_IRQn = 50, /* MDMA Channel 14 global interrupt */ + MDMA_Channel15_IRQn = 51, /* MDMA Channel 15 global interrupt */ + SDPU_IRQn = 52, /* SDPU global interruptSDPU global interrupt */ +#ifdef CORE_CM4 + AHB_ICACHE_IRQn = 53, /*!< CM4 AHB iCache interrupt */ + AHB_DCACHE_IRQn = 54, /*!< CM4 AHB dCache interrupt */ + FPU_CPU2_IRQn = 55, /*!< FPU_CM4 global interrupt */ +#endif /* CORE_CM4 */ +#ifdef CORE_CM7 + FPU_CPU1_IRQn = 55, /*!< FPU_CM7 global interrupt */ +#endif /* CORE_CM7 */ + ECCMON_IRQn = 56, /*!< ECCMON global interrupt */ + RTC_ALARM_IRQn = 57, /*!< RTC Alarm via EXTI17 interrupt */ + I2C1_EV_IRQn = 58, /*!< I2C1 event interrupt */ + I2C1_ER_IRQn = 59, /*!< I2C1 error interrupt */ + I2C2_EV_IRQn = 60, /*!< I2C2 event interrupt */ + I2C2_ER_IRQn = 61, /*!< I2C2 error interrupt */ + I2C3_EV_IRQn = 62, /*!< I2C3 event interrupt */ + I2C3_ER_IRQn = 63, /*!< I2C3 error interrupt */ + I2C4_EV_IRQn = 64, /*!< I2C4 event interrupt */ + I2C4_ER_IRQn = 65, /*!< I2C4 error interrupt */ + I2C5_EV_IRQn = 66, /*!< I2C5 event interrupt */ + I2C5_ER_IRQn = 67, /*!< I2C5 error interrupt */ + I2C6_EV_IRQn = 68, /*!< I2C6 event interrupt */ + I2C6_ER_IRQn = 69, /*!< I2C6 error interrupt */ + I2C7_EV_IRQn = 70, /*!< I2C7 event interrupt */ + I2C7_ER_IRQn = 71, /*!< I2C7 error interrupt */ + I2C8_EV_IRQn = 72, /*!< I2C8 event interrupt */ + I2C8_ER_IRQn = 73, /*!< I2C8 error interrupt */ + I2C9_EV_IRQn = 74, /*!< I2C9 event interrupt */ + I2C9_ER_IRQn = 75, /*!< I2C9 error interrupt */ + I2C10_EV_IRQn = 76, /*!< I2C10 event interrupt */ + I2C10_ER_IRQn = 77, /*!< I2C10 error interrupt */ + I2S1_IRQn = 78, /*!< I2S1 global interrupt */ + I2S2_IRQn = 79, /*!< I2S1 global interrupt */ + I2S3_IRQn = 80, /*!< I2S1 global interrupt */ + I2S4_IRQn = 81, /*!< I2S1 global interrupt */ + xSPI1_IRQn = 82, /*!< xSPI1 global interrupt */ + xSPI2_IRQn = 83, /*!< xSPI1 global interrupt */ + SPI1_IRQn = 84, /*!< SPI1 global interrupt */ + SPI2_IRQn = 85, /*!< SPI2 global interrupt */ + SPI3_IRQn = 86, /*!< SPI3 global interrupt */ + SPI4_IRQn = 87, /*!< SPI4 global interrupt */ + SPI5_IRQn = 88, /*!< SPI5 global interrupt */ + SPI6_IRQn = 89, /*!< SPI6 global interrupt */ + SPI7_IRQn = 90, /*!< SPI7 global interrupt */ + LCD_EV_IRQn = 91, /*!< TFT LCD Controller event interrupt */ + LCD_ER_IRQn = 92, /*!< TFT LCD Controller error interrupt */ + DVP1_IRQn = 93, /*!< DVP1 global interrupt */ + DVP2_IRQn = 94, /*!< DVP1 global interrupt */ + DMAMUX2_IRQn = 95, /*!< DMAMUX2 (MDMA MUX) global interrupt */ + USB1_HS_EPx_OUT_IRQn = 96, /*!< USB1_HS endpoint out global interrupt */ + USB1_HS_EPx_IN_IRQn = 97, /*!< USB1_HS endpoint in global interrupt */ + USB1_HS_WKUP_IRQn = 98, /*!< USB1_HS WKUP interrupt through EXTI line 62 */ + USB1_HS_IRQn = 99, /*!< USB1_HS global interrupt */ + USB2_HS_EPx_OUT_IRQn = 100, /*!< USB2_HS endpoint out global interrupt */ + USB2_HS_EPx_IN_IRQn = 101, /*!< USB2_HS endpoint in global interrupt */ + USB2_HS_WKUP_IRQn = 102, /*!< USB2_HS WKUP interrupt through EXTI line 63 */ + USB2_HS_IRQn = 103, /*!< USB2_HS global interrupt */ + ETH1_IRQn = 104, /*!< Ethernet 1 global interrupt */ + ETH1_PMT_LPI_IRQn = 105, /*!< Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 */ + ETH2_IRQn = 106, /*!< Ethernet 2 global interrupt */ + ETH2_PMT_LPI_IRQn = 107, /*!< Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 */ + FDCAN1_INT0_IRQn = 108, /*!< FDCAN1 global interrupt line 0 */ + FDCAN2_INT0_IRQn = 109, /*!< FDCAN2 global interrupt line 0 */ + FDCAN3_INT0_IRQn = 110, /*!< FDCAN3 global interrupt line 0 */ + FDCAN4_INT0_IRQn = 111, /*!< FDCAN4 global interrupt line 0 */ + FDCAN1_INT1_IRQn = 112, /*!< FDCAN1 global interrupt line 1 */ + FDCAN2_INT1_IRQn = 113, /*!< FDCAN2 global interrupt line 1 */ + FDCAN3_INT1_IRQn = 114, /*!< FDCAN3 global interrupt line 1 */ + FDCAN4_INT1_IRQn = 115, /*!< FDCAN4 global interrupt line 1 */ + USART1_IRQn = 116, /*!< USART1 global interrupt */ + USART2_IRQn = 117, /*!< USART2 global interrupt */ + USART3_IRQn = 118, /*!< USART3 global interrupt */ + USART4_IRQn = 119, /*!< USART4 global interrupt */ + USART5_IRQn = 120, /*!< USART5 global interrupt */ + USART6_IRQn = 121, /*!< USART6 global interrupt */ + USART7_IRQn = 122, /*!< USART7 global interrupt */ + USART8_IRQn = 123, /*!< USART8 global interrupt */ + UART9_IRQn = 124, /*!< UART9 global interrupt */ + UART10_IRQn = 125, /*!< UART10 global interrupt */ + UART11_IRQn = 126, /*!< UART11 global interrupt */ + UART12_IRQn = 127, /*!< UART12 global interrupt */ + UART13_IRQn = 128, /*!< UART13 global interrupt */ + UART14_IRQn = 129, /*!< UART14 global interrupt */ + UART15_IRQn = 130, /*!< UART15 global interrupt */ + LPUART1_IRQn = 131, /*!< LPUART1 global interrupt + wakeup through EXTI line 49 */ + LPUART2_IRQn = 132, /*!< LPUART2 global interrupt + wakeup through EXTI line 52 */ + GPU_IRQn = 133, /*!< GPU global interrupt */ + SDMMC1_IRQn = 135, /*!< SDMMC1_IRQ + WKUP through EXTI line 24 */ + SDMMC2_IRQn = 136, /*!< SDMMC2_IRQ + WKUP through EXTI line 25 */ + ADC1_IRQn = 137, /*!< ADC1 global interrupt */ + ADC2_IRQn = 138, /*!< ADC2 global interrupt */ + ADC3_IRQn = 139, /*!< ADC3 global interrupt */ + COMP1_2_IRQn = 140, /*!< COMP1 and COMP2 through EXTI line 20 and 21 */ + COMP3_4_IRQn = 141, /*!< COMP3 and COMP4 through EXTI line 22 and 23 */ + SHRTIM1_INT1_IRQn = 142, /*!< High Resolution timer 1 interrupt 1 */ + SHRTIM1_INT2_IRQn = 143, /*!< High Resolution timer 1 interrupt 2 */ + SHRTIM1_INT3_IRQn = 144, /*!< High Resolution timer 1 interrupt 3 */ + SHRTIM1_INT4_IRQn = 145, /*!< High Resolution timer 1 interrupt 4 */ + SHRTIM1_INT5_IRQn = 146, /*!< High Resolution timer 1 interrupt 5 */ + SHRTIM1_INT6_IRQn = 147, /*!< High Resolution timer 1 interrupt 6 */ + SHRTIM1_INT7_IRQn = 148, /*!< High Resolution timer 1 interrupt 7 */ + SHRTIM1_INT8_IRQn = 149, /*!< High Resolution timer 1 interrupt 8 */ + SHRTIM2_INT1_IRQn = 150, /*!< High Resolution timer 1 interrupt 1 */ + SHRTIM2_INT2_IRQn = 151, /*!< High Resolution timer 1 interrupt 2 */ + SHRTIM2_INT3_IRQn = 152, /*!< High Resolution timer 1 interrupt 3 */ + SHRTIM2_INT4_IRQn = 153, /*!< High Resolution timer 1 interrupt 4 */ + SHRTIM2_INT5_IRQn = 154, /*!< High Resolution timer 1 interrupt 5 */ + SHRTIM2_INT6_IRQn = 155, /*!< High Resolution timer 1 interrupt 6 */ + SHRTIM2_INT7_IRQn = 156, /*!< High Resolution timer 1 interrupt 7 */ + SHRTIM2_INT8_IRQn = 157, /*!< High Resolution timer 1 interrupt 8 */ + FDCAN5_INT0_IRQn = 158, /*!< FDCAN5 global interrupt line 0 */ + FDCAN6_INT0_IRQn = 159, /*!< FDCAN6 global interrupt line 0 */ + FDCAN7_INT0_IRQn = 160, /*!< FDCAN7 global interrupt line 0 */ + FDCAN8_INT0_IRQn = 161, /*!< FDCAN8 global interrupt line 0 */ + FDCAN5_INT1_IRQn = 162, /*!< FDCAN5 global interrupt line 1 */ + FDCAN6_INT1_IRQn = 163, /*!< FDCAN6 global interrupt line 1 */ + FDCAN7_INT1_IRQn = 164, /*!< FDCAN7 global interrupt line 1 */ + FDCAN8_INT1_IRQn = 165, /*!< FDCAN8 global interrupt line 1 */ + DSI_IRQn = 166, /*!< MIPI DSI Interrupt through EXTI line 87 */ +#ifdef CORE_CM4 + AHB_CACHE_PARMON_IRQn = 167, /*!< AHB i/dCACHE parity error intertupt */ +#endif /* CORE_CM4 */ + LPTIM5_WKUP_IRQn = 168, /*!< LPTIM5 wakeup through EXTI 86 */ + JPEG_SGDMA_H2P_IRQn = 169, /*!< JPEG SGDMA Host to Peripheral Interrupt */ + JPEG_SGDMA_P2H_IRQn = 170, /*!< JPEG SGDMA Peripheral to Host Interrupt */ + WAKEUP_IO_IRQn = 171, /*!< 6 WAKEUP IOs through EXTI line 70-75 */ + +#ifdef CORE_CM4 + SEMA4_INT2_IRQn = 173, /*!< SEMA4 interrupt2 */ + WWDG1_RST_IRQn = 174, /*!< WWDG1 reset interrupt through EXTI line 81 */ +#endif /* CORE_CM4 */ +#ifdef CORE_CM7 + SEMA4_INT1_IRQn = 172, /*!< SEMA4 interrupt1 */ + WWDG2_RST_IRQn = 174, /*!< WWDG2 reset interrupt through EXTI line 82 */ +#endif /* CORE_CM7 */ + OTPC_IRQn = 175, /*!< OTPC interrupt */ + FEMC_IRQn = 176, /*!< FEMC interrupt */ +#ifdef CORE_CM4 + DCMUA_IRQn = 177, /*!< DCMUA interrupt */ +#endif /* CORE_CM4 */ +#ifdef CORE_CM7 + DCMUB_IRQn = 177, /*!< DCMUB interrupt */ +#endif /* CORE_CM7 */ + DAC1_IRQn = 178, /*!< DAC1 IRQ */ + DAC2_IRQn = 179, /*!< DAC2 IRQ */ + MDMA_AHBS_ER_IRQn = 180, /*!< MDMA AHBS ERROR through EXTI line 90 */ + CM7_CATCH_READ_ER_IRQn = 181, /*!< CM7 Error on Cache Read through EXTI line 64-65 */ + DAC3_IRQn = 182, /*!< DAC3 interrupt */ + DAC4_IRQn = 183, /*!< DAC4 interrupt */ + EMC_IRQn = 184, /*!< EMC event interrupt through EXTI line 88-89 */ + DAC5_IRQn = 185, /*!< DAC5 interrupt */ + DAC6_IRQn = 186, /*!< DAC6 interrupt */ + ESC_OPB_IRQn = 187, /*!< ETHERCAT OPB Interrupt */ + ESC_SYNC0_IRQn = 188, /*!< ETHERCAT SYNC0 Interrupt */ + ESC_SYNC1_IRQn = 189, /*!< ETHERCAT SYNC1 Interrupt */ + ESC_WRP_IRQn = 190, /*!< ETHERCAT WRAPPER Interrupt */ + ATIM1_BRK_IRQn = 192, /*!< Advanced timer 1 break interrupt */ + ATIM1_TRG_COM_IRQn = 193, /*!< Advanced timer 1 trigger and commutation interrupts */ + ATIM1_CC_IRQn = 194, /*!< Advanced timer 1 capture/compare interrupt */ + ATIM1_UP_IRQn = 195, /*!< Advanced timer 1 update interrupt */ + ATIM2_BRK_IRQn = 196, /*!< Advanced timer 2 break interrupt */ + ATIM2_TRG_COM_IRQn = 197, /*!< advanced timer 2 trigger and commutation interrupts */ + ATIM2_CC_IRQn = 198, /*!< Advanced timer 2 capture/compare interrupt */ + ATIM2_UP_IRQn = 199, /*!< Advanced timer 2 update interrupt */ + ATIM3_BRK_IRQn = 200, /*!< Advanced timer 3 break interrupt */ + ATIM3_TRG_COM_IRQn = 201, /*!< Advanced timer 3 trigger and commutation interrupts */ + ATIM3_CC_IRQn = 202, /*!< Advanced timer 3 capture/compare interrupt */ + ATIM3_UP_IRQn = 203, /*!< Advanced timer 3 update interrupt */ + ATIM4_BRK_IRQn = 204, /*!< Advanced timer 4 break interrupt */ + ATIM4_TRG_COM_IRQn = 205, /*!< Advanced timer 4 trigger and commutation interrupts */ + ATIM4_CC_IRQn = 206, /*!< Advanced timer 4 capture/compare interrupt */ + ATIM4_UP_IRQn = 207, /*!< Advanced timer 4 update interrupt */ + GTIMA1_IRQn = 208, /*!< General timer A 1 global interrupt */ + GTIMA2_IRQn = 209, /*!< General timer A 2 global interrupt */ + GTIMA3_IRQn = 210, /*!< General timer A 3 global interrupt */ + GTIMA4_IRQn = 211, /*!< General timer A 4 global interrupt */ + GTIMA5_IRQn = 212, /*!< General timer A 5 global interrupt */ + GTIMA6_IRQn = 213, /*!< General timer A 6 global interrupt */ + GTIMA7_IRQn = 214, /*!< General timer A 7 global interrupt */ + GTIMB1_IRQn = 215, /*!< General timer B 1 global interrupt */ + GTIMB2_IRQn = 216, /*!< General timer B 2 global interrupt */ + GTIMB3_IRQn = 217, /*!< General timer B 3 global interrupt */ + BTIM1_IRQn = 218, /*!< Base timer 1 global interrupt */ + BTIM2_IRQn = 219, /*!< Base timer 2 global interrupt */ + BTIM3_IRQn = 220, /*!< Base timer 3 global interrupt */ + BTIM4_IRQn = 221, /*!< Base timer 4 global interrupt */ + LPTIM1_WKUP_IRQn = 222, /*!< LPTIM1 wakeup interrupt */ + LPTIM2_WKUP_IRQn = 223, /*!< LPTIM2 wakeup interrupt */ + LPTIM3_WKUP_IRQn = 224, /*!< LPTIM3 wakeup interrupt */ + LPTIM4_WKUP_IRQn = 225, /*!< LPTIM4 wakeup interrupt */ + DSMU_FLT0_IRQn = 226, /*!< DSMU_FLT0 */ + DSMU_FLT1_IRQn = 227, /*!< DSMU_FLT1 */ + DSMU_FLT2_IRQn = 228, /*!< DSMU_FLT2 */ + DSMU_FLT3_IRQn = 229, /*!< DSMU_FLT3 */ + FMAC_IRQn = 230, /*!< FMAC global interrupt */ + CORDIC_IRQn = 231, /*!< CORDIC global interrupt */ + DMAMUX_IRQn = 232, /*!< DMAMUX interrupt */ + MMU_INT_IRQn = 233, /*!< MMU interrupt */ +} IRQn_Type; + +#if defined (CORE_CM4) +#include "core_cm4.h" +#endif +#if defined (CORE_CM7) +#include "core_cm7.h" +#endif + +#include "system_n32h76x_78x.h" +#include +#include +#include + +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +typedef const int32_t sc32; /* Read Only */ +typedef const int16_t sc16; /* Read Only */ +typedef const int8_t sc8; /* Read Only */ + +typedef __IO int32_t vs32; +typedef __IO int16_t vs16; +typedef __IO int8_t vs8; + +typedef __I int32_t vsc32; /* Read Only */ +typedef __I int16_t vsc16; /* Read Only */ +typedef __I int8_t vsc8; /* Read Only */ + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef const uint32_t uc32; /* Read Only */ +typedef const uint16_t uc16; /* Read Only */ +typedef const uint8_t uc8; /* Read Only */ + +typedef __IO uint32_t vu32; +typedef __IO uint16_t vu16; +typedef __IO uint8_t vu8; + +typedef __I uint32_t vuc32; /* Read Only */ +typedef __I uint16_t vuc16; /* Read Only */ +typedef __I uint8_t vuc8; /* Read Only */ +typedef enum +{ + RESET = 0, + SET = !RESET +} FlagStatus,ITStatus, + INTStatus; + +typedef enum +{ + DISABLE = 0, + ENABLE = !DISABLE +} FunctionalState,FunctionalStatus; +#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) + +typedef enum +{ + ERROR = 0, + SUCCESS = !ERROR +} ErrorStatus; + +/* N32H76x_78x Standard Peripheral Library old definitions (maintained for legacy purpose) */ +#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT +#define HSE_Value HSE_VALUE +#define HSI_Value HSI_VALUE + +/*** Analog to Digital Converter ***/ +typedef struct +{ + __IO uint32_t STS; //0x00 + __IO uint32_t CTRL1; //0x04 + __IO uint32_t CTRL2; //0x08 + __IO uint32_t CTRL3; //0x0C + __IO uint32_t SAMPT1; //0x10 + __IO uint32_t SAMPT2; //0x14 + __IO uint32_t SAMPT3; //0x18 + __IO uint32_t DIFSEL; //0x1C + __IO uint32_t AWDCTRL; //0x20 + __IO uint32_t OFFSET1; //0x24 + __IO uint32_t OFFSET2; //0x28 + __IO uint32_t OFFSET3; //0x2C + __IO uint32_t OFFSET4; //0x30 + __IO uint32_t AWD1HIGH; //0x34 + __IO uint32_t AWD1LOW; //0x38 + __IO uint32_t AWD2HIGH; //0x3C + __IO uint32_t AWD2LOW; //0x40 + __IO uint32_t AWD3HIGH; //0x44 + __IO uint32_t AWD3LOW; //0x48 + __IO uint32_t AWD2EN; //0x4C + __IO uint32_t AWD3EN; //0x50 + __IO uint32_t AWD2INTEN; //0x54 + __IO uint32_t AWD3INTEN; //0x58 + __IO uint32_t AWD2STS; //0x5C + __IO uint32_t AWD3STS; //0x60 + __IO uint32_t RSEQ1; //0x64 + __IO uint32_t RSEQ2; //0x68 + __IO uint32_t RSEQ3; //0x6C + __IO uint32_t RSEQ4; //0x70 + __IO uint32_t JSEQ; //0x74 + __IO uint32_t JDAT1; //0x78 + __IO uint32_t JDAT2; //0x7C + __IO uint32_t JDAT3; //0x80 + __IO uint32_t JDAT4; //0x84 + __IO uint32_t DAT; //0x88 + __IO uint32_t FIFOCFG; //0x8C + __IO uint32_t FIFOSTS; //0x90 + __IO uint32_t DLYSMP; //0x94 + __IO uint32_t OSCFG; //0x98 + __IO uint32_t INTLRCFG; //0x9C + __IO uint32_t GCOMP; //0xA0 +}ADC_Module; + + +/*** LCDC Register ***/ +typedef struct +{ + __I uint32_t RESERVED0[2]; /* Reserved, 0x00, 0x04 */ + __IO uint32_t SYNCCTRL; /* LCDC Synchronization Size Conctrl Register, Address offset: 0x08 */ + __IO uint32_t BPCTRL; /* LCDC Back Porch Conctrl Register, Address offset: 0x0C */ + __IO uint32_t AWCTRL; /* LCDC Active Width Conctrl Register, Address offset: 0x10 */ + __IO uint32_t TWCTRL; /* LCDC Total Width Conctrl Register, Address offset: 0x14 */ + __IO uint32_t GCTRL; /* LCDC Global Control Register , Address offset: 0x18 */ + __I uint32_t RESERVED1[2]; /* Reserved, 0x1C, 0x20 */ + __IO uint32_t SRCTRL; /* LCDC Shadow Reload Conctrl Register, Address offset: 0x24 */ + __I uint32_t RESERVED2; /* Reserved, 0x28 */ + __IO uint32_t BGCCTRL; /* LCDC Background Color Conctrl Register, Address offset: 0x2C */ + __I uint32_t RESERVED3; /* Reserved, 0x30 */ + __IO uint32_t INTEN; /* LCDC Interrupt Enable Register, Address offset: 0x34 */ + __IO uint32_t INTSTS; /* LCDC Interrupt Status Register, Address offset: 0x38 */ + __IO uint32_t INTCLR; /* LCDC Interrupt Clear Register, Address offset: 0x3C */ + __IO uint32_t LINTPCTRL; /* LCDC Line Interrupt Position Conctrl Register, Address offset: 0x40 */ + __IO uint32_t CPSTS; /* LCDC Current Position Status Register, Address offset: 0x44 */ + __IO uint32_t CDSTS; /* LCDC Current Display Status Register, Address offset: 0x48 */ + __I uint32_t RESERVED4[5]; /* Reserved, 0x4C ~ 0x5C */ + __IO uint32_t EXTDCTRL; /* LCDC External Display Control Register, Address offset: 0x60 */ +} LCDC_Module; + +typedef struct +{ + __I uint32_t RESERVED0[2]; /* Reserved, 0x00 0x04 */ + __IO uint32_t LSRCTRL; /* LCDC Layerx Reload Control Register Address offset: 0x08 */ + __IO uint32_t LCTRL; /* LCDC Layerx Control Register Address offset: 0x0C */ + __IO uint32_t WHPCTRL; /* LCDC Layerx Window Horizontal Position Configuration Register Address offset: 0x10 */ + __IO uint32_t WVPCTRL; /* LCDC Layerx Window Vertical Position Configuration Register Address offset: 0x14 */ + __IO uint32_t CKCTRL; /* LCDC Layerx Color Keying Configuration Register Address offset: 0x18 */ + __IO uint32_t PFCTRL; /* LCDC Layerx Pixel Format Configuration Register Address offset: 0x1C */ + __IO uint32_t CACTRL; /* LCDC Layerx Constant Alpha Configuration Register Address offset: 0x20 */ + __IO uint32_t DCCTRL; /* LCDC Layerx Default Color Configuration Register Address offset: 0x24 */ + __IO uint32_t BFCTRL; /* LCDC Layerx Blending Factors Configuration Register Address offset: 0x28 */ + __IO uint32_t FBBCTRL; /* LCDC Layerx Frame Buffer Bus Control Register Address offset: 0x2C */ + __IO uint32_t AFBCTRL; /* LCDC Layerx Auxiliary Frame Buffer Control Register Address offset: 0x30 */ + __IO uint32_t CFBADDR; /* LCDC Layerx Color Frame Buffer Address Register Address offset: 0x34 */ + __IO uint32_t CFBLEN; /* LCDC Layerx Color Frame Buffer Length Register Address offset: 0x38 */ + __IO uint32_t CFBLNUM; /* LCDC Layerx Color Frame Buffer Line Number Register Address offset: 0x3C */ + __IO uint32_t AFBADDR0; /* LCDC Layerx Auxiliary 0 Fram Buffer Address Register Address offset: 0x40 */ + __IO uint32_t AFBADDR1; /* LCDC Layerx Auxiliary 1 Fram Buffer Address Register Address offset: 0x44 */ + __IO uint32_t AFBLEN; /* LCDC Layerx Auxiliary Fram Buffer Length(pitch) Register Address offset: 0x48 */ + __IO uint32_t AFBLNUM; /* LCDC Layerx Auxiliary Fram Buffer Lines Register Address offset: 0x4C */ + __IO uint32_t CLUTWR; /* LCDC Layerx CLUT Write Register Address offset: 0x50 */ + __IO uint32_t SINS; /* LCDC Layerx Scaler Input Size Register Address offset: 0x54 */ + __IO uint32_t SOUTS; /* LCDC Layerx Scaler Output Size Register Address offset: 0x58 */ + __IO uint32_t VSF; /* LCDC Layerx Vertical Scaling Factor Register Address offset: 0x5C */ + __IO uint32_t VSP; /* LCDC Layerx Vertical Scaling Phase Register Address offset: 0x60 */ + __IO uint32_t HSF; /* LCDC Layerx Horizontal Scaling Factor Register Address offset: 0x64 */ + __IO uint32_t HSP; /* LCDC Layerx Horizontal Scaling Phase Register Address offset: 0x68 */ + __IO uint32_t YUVS1; /* LCDC Layerx YCbCr Scale 1 Register Address offset: 0x6c */ + __IO uint32_t YUVS2; /* LCDC Layerx YCbCr Scale 2 Register Address offset: 0x70 */ + __IO uint32_t FCF1; /* LCDC Layerx Flexible color format 1 Register Address offset: 0x74 */ + __IO uint32_t FCF2; /* LCDC Layerx Flexible color format 2 Register Address offset: 0x78 */ +} LCDC_Layer_Module; + +/* JPEG Module */ + +typedef struct +{ + __IO uint32_t CTRL; //0x0 +}JPEG_CTRL_Module; + +typedef struct +{ + __IO uint32_t INIT; //0x0 + __IO uint32_t EN; //0x4 + __IO uint32_t BUFBADDR; //0x8 + __IO uint32_t BUFSIZE; //0xc + uint32_t RESERVED1[13]; //0x10 + __IO uint32_t USMODE; //0x44 +}JPEG_BRC_Module; + +typedef struct +{ + __IO uint32_t INIT; //0x0 + __IO uint32_t EN; //0x4 + __IO uint32_t SWITCH; //0x8 + __IO uint32_t FRMW; //0xc + __IO uint32_t FRMH; //0x10 + uint32_t RESERVED0; //0x14 + __IO uint32_t PFORM; //0x18 + __IO uint32_t CNAME; //0x1c + __IO uint32_t C0SADD; //0x20 + __IO uint32_t C0EADD; //0x24 + uint32_t RESERVED1[14]; //0x28 + __IO uint32_t BPS0; //0x60 + __IO uint32_t BPS12; //0x64 + __IO uint32_t ROWS0; //0x68 + __IO uint32_t ROWS12; //0x6c + __IO uint32_t HHALF; //0x70 + __IO uint32_t BLSS0; //0x74 + __IO uint32_t BLSS12; //0x78 + __IO uint32_t BPRS0; //0x7c + __IO uint32_t BPRS12; //0x80 + __IO uint32_t MAXW; //0x84 + __IO uint32_t MAXH; //0x88 + __IO uint32_t MBSIZE; //0x8c +}JPEG_RBC_Module; + +typedef struct +{ + __IO uint32_t CTRL; //0x0 + __IO uint32_t STS; //0x4 + __IO uint32_t IE; //0x8 + __IO uint32_t INTSTS; //0xc + __IO uint32_t AOODT; //0x10 + __IO uint32_t MBSIZE; //0x14 + __IO uint32_t SGLPL; //0x18 + __IO uint32_t SGLPM; //0x1c + __IO uint32_t SGL_SIZE; //0x20 + __IO uint32_t SGL_HEAD; //0x24 + __IO uint32_t SGL_TAIL; //0x28 + __IO uint32_t MRADDL; //0x2c + __IO uint32_t MRADDM; //0x30 + __IO uint32_t MWADDL; //0x34 + __IO uint32_t MWADDM; //0x38 + __IO uint32_t DESCF; //0x3c + __IO uint32_t DESC_MBSIZE; //0x40 + __IO uint32_t DESC_MUS; //0x44 + __IO uint32_t DESC_MBADDL; //0x48 + __IO uint32_t DESC_MBADDH; //0x4c + uint32_t RESERVED0; //0x50 + __IO uint32_t DESC_LINKL; //0x54 + __IO uint32_t DESC_LINKH; //0x58 + __IO uint32_t PARACFG; //0x5c + __IO uint32_t FIFODP; //0x60 +}JPEG_SGDMA_Module; + +typedef struct +{ + __IO uint32_t MODE; //0x0 + __IO uint32_t ERROR; //0x4 + __IO uint32_t UNLOC; //0x8 + __IO uint32_t UELOC; //0xc + __IO uint32_t HESYM; //0x10 + __IO uint32_t HESYMECS; //0x14 + __IO uint32_t HUF_SELOC; //0x18 + __IO uint32_t TAB_ACCREQ; //0x1c + __IO uint32_t HUFTAB0_EOB; //0x20 + __IO uint32_t HUFTAB1_EOB; //0x24 + __IO uint32_t HUFTAB2_EOB; //0x28 + __IO uint32_t HUFTAB3_EOB; //0x2c + uint32_t RESERVED0[20]; //0x30 + __IO uint32_t HUF_ADDR; //0x80 + __IO uint32_t HUF_DATA; //0x84 + __IO uint32_t HUF_REM; //0x88 + uint32_t RESERVED1[221]; //0x8C + __IO uint32_t QT0[64]; //0x400 + __IO uint32_t QT1[64]; //0x500 + __IO uint32_t QT2[64]; //0x600 + __IO uint32_t QT3[64]; //0x700 +}JPEG_DEC_Module; + + +/*** Huffman tables ***/ +typedef struct +{ + __IO uint32_t DCOL[16]; + __IO uint32_t ACOL[240]; + __IO uint32_t DCCODE[16]; + __IO uint32_t ACCODE[16]; + __IO uint32_t EOBS; + __IO uint32_t ZRLS; + __IO uint32_t RESERVED[222]; +} Huffmantables_Type; + +/* JPEG Encoder */ +typedef struct +{ + Huffmantables_Type HT0; //0x00 + Huffmantables_Type HT1; //0x800 + Huffmantables_Type HT2; //0x1000 + Huffmantables_Type HT3; //0x1800 + __IO uint32_t QT0[64]; //0x2000 + __IO uint32_t QT1[64]; //0x2100 + __IO uint32_t QT2[64]; //0x2200 + __IO uint32_t QT3[64]; //0x2300 + uint32_t RESERVED1[1792];//0x2400 + __IO uint32_t HFBUFFER[512]; //0x4000 + __IO uint32_t HEADD; //0x4800 + __IO uint32_t RESERVED2[4]; //0x4804 + __IO uint32_t HUFTAB0E; //0x4814 + __IO uint32_t HUFTAB1E; //0x4818 + __IO uint32_t HUFTAB2E; //0x481c + __IO uint32_t HUFTAB3E; //0x4820 + __IO uint32_t FEADD; //0x4824 + __IO uint32_t RESERVED3[502]; //0x4828 + __IO uint32_t CTRL; //0x5000 + __IO uint32_t DYNRCFG; //0x5004 + __IO uint32_t RESERVED4[13]; //0x5008 + __IO uint32_t HSEL; //0x503c + __IO uint32_t RESERVED5[48]; //0x5040 + __IO uint32_t PIPESTS; //0x5100 + __IO uint32_t RESERVED6[959]; //0x5104 + __IO uint32_t RICTRL; //0x6000 + __IO uint32_t RESERVED7[4096];//0x6004 + __IO uint32_t HFSIZE; //0xa004 + __IO uint32_t IPNUM; //0xa008 + __IO uint32_t RESERVED8[3]; //0xa00c + __IO uint32_t PBSIZE; //0xa018 + __IO uint32_t RESERVED9[2]; //0xa01c + __IO uint32_t OBSIZE; //0xa024 +}JPEG_ENC_Module; + +/*** COMP_Single ***/ +typedef struct +{ + __IO uint32_t CTRL; + __IO uint32_t FILC; + __IO uint32_t FILP; + __IO uint32_t RES; +} COMP_SingleType; + +/*** Comparator ***/ +typedef struct +{ + __IO uint32_t RES[4]; + COMP_SingleType Cmp[4]; //0x10 + __IO uint32_t LPR; //0x50 + __IO uint32_t WINMODE; //0x54 + __IO uint32_t RES1; //0x58 + __IO uint32_t LOCK; //0x5C + __IO uint32_t INTEN; //0x60 + __IO uint32_t INTSTS; //0x64 + __IO uint32_t OTIMEN; //0x68 +}COMP_Module; + + +/*** Digital to Analog Converter ***/ +typedef struct +{ + __IO uint32_t CTRL; //0x00 + __IO uint32_t SOTTR; //0x04 + __IO uint32_t DATO1; //0x08 + __IO uint32_t DATO2; //0x0C + __IO uint32_t DR8CH1; //0x10 + __IO uint32_t DL12CH1; //0x14 + __IO uint32_t DR12CH1; //0x18 + __IO uint32_t DR8CH2; //0x1C + __IO uint32_t DL12CH2; //0x20 + __IO uint32_t DR12CH2; //0x24 + __IO uint32_t DR8DCH; //0x28 + __IO uint32_t DL12DCH; //0x2C + __IO uint32_t DR12DCH; //0x30 + __IO uint32_t RES0; //0x34 + __IO uint32_t SELCTRL; //0x38 + __IO uint32_t STS; //0x3C + __IO uint32_t GCTRL; //0x40 + __IO uint32_t STINC; //0x44 + __IO uint32_t STRST; //0x48 + __IO uint32_t RES1[4]; + __IO uint32_t CALC; //0x5C +} DAC_Module; + + +/*** CRC ***/ +typedef struct +{ + __IO uint32_t DAT; //0x00 + __IO uint32_t IDAT; //0x04 + __IO uint32_t CTRL; //0x08 + __IO uint32_t LRC; //0x0C + __IO uint32_t INIT; //0x10 + __IO uint32_t POL; //0x14 + __IO uint32_t INXORDAT; //0x18 + __IO uint32_t OUTXORDAT; //0x1C +} CRC_Module; + +/** + * @brief TCM Configuration + */ +typedef struct +{ + __IO uint32_t TCM_CR; /*!< (offset 0x000) TCM configuration Register */ +} TCMSRAMC_TypeDef; + + + +/*** DMA Controller on AHB Bus (DMA1,DMA2,DMA3) ***/ +typedef struct +{ + __IO uint32_t SA; /* (offset 0x0000) Source Address Register */ + __I uint32_t RESERVED0; + __IO uint32_t DA; /* (offset 0x0008) Destination Address Register */ + __I uint32_t RESERVED1; + __IO uint32_t LLP; /* (offset 0x0010) Linked List Pointer Register */ + __I uint32_t RESERVED2; + __IO uint64_t CTRL; /* (offset 0x0018) Control Register Low */ + __I uint32_t RESERVED3[8]; + __IO uint64_t CFG; /* (offset 0x0040) Configuration Register Low */ + __IO uint32_t SG; /* (offset 0x0048) Source Gather Register */ + __I uint32_t RESERVED4; + __IO uint32_t DS; /* (offset 0x0050) Destination Scatter Register */ + __I uint32_t RESERVED5; +} DMA_ChannelType; + +typedef struct +{ + /** DMA Channel Registers **/ + __IO DMA_ChannelType CH[8]; /* (offset 0x0000 + x * 0x58 ) Channel x from 0 to 7 */ + + /** DMA Interrupt Registers **/ + __IO uint32_t RAWTCINTSTS; /* (offset 0x02C0) Raw IntTfr Status */ + __I uint32_t RESERVED0; + __IO uint32_t RAWBTCINTSTS; /* (offset 0x02C8) Raw IntBlock Status */ + __I uint32_t RESERVED1; + __IO uint32_t RAWSTCINTSTS; /* (offset 0x02D0) Raw IntSrcTran Status */ + __I uint32_t RESERVED2; + __IO uint32_t RAWDTCINTSTS; /* (offset 0x02D8) Raw IntDstTran Status */ + __I uint32_t RESERVED3; + __IO uint32_t RAWERRINTSTS; /* (offset 0x02E0) Raw IntErr Status */ + __I uint32_t RESERVED4; + __I uint32_t TCINTSTS; /* (offset 0x02E8) IntTfr Status */ + __I uint32_t RESERVED5; + __I uint32_t BTCINTSTS; /* (offset 0x02F0) IntBlock Status */ + __I uint32_t RESERVED6; + __I uint32_t STCINTSTS; /* (offset 0x02F8) IntSrcTran Status */ + __I uint32_t RESERVED7; + __I uint32_t DTCINTSTS; /* (offset 0x0300) IntDstTran Status */ + __I uint32_t RESERVED8; + __I uint32_t ERRINTSTS; /* (offset 0x0308) IntErr Status */ + __I uint32_t RESERVED9; + __IO uint32_t TCINTMSK; /* (offset 0x0310) Mask for Raw IntTfr Status */ + __I uint32_t RESERVED10; + __IO uint32_t BTCINTMSK; /* (offset 0x0318) Mask for Raw IntBlock Status */ + __I uint32_t RESERVED11; + __IO uint32_t STCINTMSK; /* (offset 0x0320) Mask for Raw IntSrcTran Status */ + __I uint32_t RESERVED12; + __IO uint32_t DTCINTMSK; /* (offset 0x0328) Mask for Raw IntDstTran Status */ + __I uint32_t RESERVED13; + __IO uint32_t ERRINTMSK; /* (offset 0x0330) Mask for Raw IntErr Status */ + __I uint32_t RESERVED14; + __O uint32_t TCINTCLR; /* (offset 0x0338) Clear IntTfr Interrupt */ + __I uint32_t RESERVED15; + __O uint32_t BTCINTCLR; /* (offset 0x0340) Clear IntBlock Interrupt */ + __I uint32_t RESERVED16; + __O uint32_t STCINTCLR; /* (offset 0x0348) Clear IntSrcTran Interrupt */ + __I uint32_t RESERVED17; + __O uint32_t DTCINTCLR; /* (offset 0x0350) Clear IntDstTran Interrupt */ + __I uint32_t RESERVED18; + __O uint32_t ERRINTCLR; /* (offset 0x0358) Clear IntErr Interrupt */ + __I uint32_t RESERVED19; + __I uint32_t INTCBESTS; /* (offset 0x0360) Combined Interrupt Status Register */ + + /** DMA Software Handshake Registers **/ + __I uint32_t RESERVED20; + __IO uint32_t SRCSWTREQ; /* (offset 0x0368) Source Software Transaction Request Register */ + __I uint32_t RESERVED21; + __IO uint32_t DSTSWTREQ; /* (offset 0x0370) Destination Software Transaction Request Register */ + __I uint32_t RESERVED22; + __IO uint32_t SRCSGTREQ; /* (offset 0x0378) Single Source Transaction Request Register */ + __I uint32_t RESERVED23; + __IO uint32_t DSTSGTREQ; /* (offset 0x0380) Single Destination Transaction Request Register */ + __I uint32_t RESERVED24; + __IO uint32_t SRCLTREQ; /* (offset 0x0388) Last Source Transaction Request Register */ + __I uint32_t RESERVED25; + __IO uint32_t DSTLTREQ; /* (offset 0x0390) Last Destination Transaction Request Register */ + + /** DMA Miscellaneous Registers **/ + __I uint32_t RESERVED26; + __IO uint32_t CFG; /* (offset 0x0398) DMA Configuration Register */ + __I uint32_t RESERVED27; + __IO uint32_t CHEN; /* (offset 0x03A0) DMA Channel Enable Register */ + __I uint32_t RESERVED28; + __I uint32_t ID; /* (offset 0x03A8) DMA ID Register */ + __I uint32_t RESERVED29[19]; + __I uint32_t TYPE; /* (offset 0x03F8) DMA Component Type */ + __I uint32_t VERSION; /* (offset 0x03FC) DMA Component Version */ +} DMA_Module; + + +/*** DMA AXI Bus Controller (MDMA) ***/ +typedef struct +{ + __IO uint64_t SA; /* (offset 0x0100) Source Address */ + __IO uint64_t DA; /* (offset 0x0108) Destination Address */ + __IO uint32_t BTS; /* (offset 0x0110) Block Transfer Size */ + __I uint32_t RESERVED0; + __IO uint64_t CTRL; /* (offset 0x0118) Control */ + __IO uint64_t CFG; /* (offset 0x0120) Configuration */ + __IO uint64_t LLP; /* (offset 0x0128) Linked List Pointer */ + __I uint64_t STS; /* (offset 0x0130) Status */ + __IO uint32_t SHSRC; /* (offset 0x0138) Software Handshake Source */ + __I uint32_t RESERVED1; + __IO uint32_t SHDST; /* (offset 0x0140) Software Handshake Destination */ + __I uint32_t RESERVED2; + __O uint32_t BTRR; /* (offset 0x0148) Block Transfer Resume Request */ + __I uint32_t RESERVED3[3]; + __I uint32_t AXIQOS; /* (offset 0x0158) AXI QOS */ + __I uint32_t RESERVED4[9]; + __IO uint32_t INTSTSEN; /* (offset 0x0180) Interrupt Status Enable */ + __I uint32_t RESERVED5; + __I uint32_t INTSTS; /* (offset 0x0188) Interrupt Status */ + __I uint32_t RESERVED6; + __IO uint32_t INTSGLEN; /* (offset 0x0190) Interrupt Signal Enable */ + __I uint32_t RESERVED7; + __O uint32_t INTCLR; /* (offset 0x0198) Interrupt Clear */ + __I uint32_t RESERVED8[25]; +} MDMA_ChannelType; + +typedef struct +{ + /** MDMA Common Registers **/ + __I uint32_t ID; /* (offset 0x0000) DMAC ID */ + __I uint32_t RESERVED0; + __I uint32_t VERSION; /* (offset 0x0008) DMAC Component Version */ + __I uint32_t RESERVED1; + __IO uint32_t CFG; /* (offset 0x0010) DMAC Configuration */ + __I uint32_t RESERVED2; + __IO uint32_t CHEN; /* (offset 0x0018) DMAC Channel Enable */ + __I uint32_t RESERVED3; + __IO uint32_t CHSUSP; /* (offset 0x0020) DMAC Channel Suspend */ + __I uint32_t RESERVED4[3]; + __I uint64_t INTSTS; /* (offset 0x0030) DMAC Interrupt Status */ + __O uint32_t CRINTCLR; /* (offset 0x0038) DMAC Interrupt Clear */ + __I uint32_t RESERVED5; + __IO uint32_t CRINTSTSEN; /* (offset 0x0040) DMAC Interrupt Status Enable */ + __I uint32_t RESERVED6; + __IO uint32_t CRINTSGLEN; /* (offset 0x0048) DMAC Interrupt Signal Enable */ + __I uint32_t RESERVED7; + __I uint32_t CRINTSTS; /* (offset 0x0050) DMAC Interrupt Status */ + __I uint32_t RESERVED8; + __IO uint32_t SWRST; /* (offset 0x0058) DMAC Software Reset Register */ + __I uint32_t RESERVED9; + __IO uint64_t LPCFG; /* (offset 0x0060) DMAC Low Power Configuration Register */ + __I uint32_t RESERVED10[38]; + + /** MDMA Channel Registers **/ + MDMA_ChannelType CH[16]; /* (offset 0x0100 + x * 0x100) Channel x from 0 to 15 */ + +} MDMA_Module; + +/*** DMAMUX1 ***/ +typedef struct +{ + __IO uint32_t CHxCTRL[24]; /* DMA Multiplexer Channel x Control Register */ + __IO uint32_t STS; /* DMA Channel Status Register */ + __IO uint32_t CLR; /* DMA Channel Clear Flag Register */ + __IO uint32_t CHxCFG[24]; /* DMA Request Generator x Control Register */ + __IO uint32_t RGSTS; /* DMA Request Generator x Interrupt Status Register */ + __IO uint32_t RGCLR; /* DMA Request Generator x Interrupt Clear Register */ +}DMAMUX1_Module; + +/*** DMAMUX2 ***/ +typedef struct +{ + __IO uint32_t CHxCTRL[15]; /* DMA Multiplexer Channel x Control Register */ + __IO uint32_t STS; /* DMA Channel Status Register */ + __IO uint32_t CLR; /* DMA Channel Clear Flag Register */ + __IO uint32_t CHxCFG[15]; /* DMA Request Generator x Control Register */ + __IO uint32_t RGSTS; /* DMA Request Generator x Interrupt Status Register */ + __IO uint32_t RGCLR; /* DMA Request Generator x Interrupt Clear Register */ +}DMAMUX2_Module; + +typedef struct +{ + __IO uint32_t CHCTRL; /*!< DMA Multiplexer Channel x Control Register */ +}DMAMUX_Channel_TypeDef; + +typedef struct +{ + __IO uint32_t STS; /*!< DMA Channel Status Register */ + __IO uint32_t CLR; /*!< DMA Channel Clear Flag Register */ +}DMAMUX_ChannelStatus_TypeDef; + +typedef struct +{ + __IO uint32_t CHCFG; /*!< DMA Request Generator x Control Register */ +}DMAMUX_RequestGen_TypeDef; + +typedef struct +{ + __IO uint32_t RGSTS; /*!< DMA Request Generator Status Register */ + __IO uint32_t RGCLR; /*!< DMA Request Generator Clear Flag Register */ +}DMAMUX_RequestGenStatus_TypeDef; + + +/*** DCMU ***/ +typedef struct +{ + __O uint32_t TXMSG[4]; /*!< DCMU messaging transmit registers , Address offset: 00h-0Ch */ + __I uint32_t RCVMSG[4]; /*!< DCMU messaging receive registers , Address offset: 10h-1Ch */ + __IO uint32_t STS; /*!< DCMU messaging status register , Address offset: 20h */ + __IO uint32_t CTRL; /*!< DCMU messaging control register , Address offset: 24h */ + +} DCMU_Module; + +/*** SEMA4 ***/ +typedef struct +{ + __IO uint32_t R[32]; /* 2-step write lock and read back registers, Address offset: 00h-7Ch */ + __IO uint32_t RL[32]; /* 1-step read lock registers, Address offset: 80h-FCh */ + __IO uint32_t C1IEN; /* SEMA4 Interrupt 0 enable register , Address offset: 100h */ + __IO uint32_t C1ICLR; /* SEMA4 Interrupt 0 clear register , Address offset: 104h */ + __IO uint32_t C1ISTS; /* SEMA4 Interrupt 0 Status register , Address offset: 108h */ + __IO uint32_t C1MISTS; /* SEMA4 Interrupt 0 Masked Status register , Address offset: 10Ch */ + __IO uint32_t C2IEN; /* SEMA4 Interrupt 1 enable register , Address offset: 110h */ + __IO uint32_t C2ICLR; /* SEMA4 Interrupt 1 clear register , Address offset: 114h */ + __IO uint32_t C2ISTS; /* SEMA4 Interrupt 1 Status register , Address offset: 118h */ + __IO uint32_t C2MISTS; /* SEMA4 Interrupt 1 Masked Status register , Address offset: 11Ch */ + __IO uint32_t C1ILFSTS; /* SEMA4 Interrupt 0 Interrupt Lock Fail Status register Address offset: 0x120 */ + __IO uint32_t C2ILFSTS; /* SEMA4 Interrupt 1 Interrupt Lock Fail Status register Address offset: 0x124 */ + __IO uint32_t Res0[2]; /* Reserved Address offset: 128h-12Fh */ + __IO uint32_t C1ILFEN; /* SEMA4 Interrupt 0 Interrupt Lock Fail Enable register Address offset: 0x130 */ + __IO uint32_t C2ILFEN; /* SEMA4 Interrupt 1 Interrupt Lock Fail Enable register Address offset: 0x134 */ + __IO uint32_t Res1[2]; /* Reserved Address offset: 138h-13Fh */ + __IO uint32_t CLR; /* SEMA4 Semaphore clear register , Address offset: 140h */ + __IO uint32_t KEYCLR; /* SEMA4 Semaphore clear key register , Address offset: 144h */ +} SEMA4_Module; + + + /** + * @brief FLASH Registers + */ + + typedef struct + { + __IO uint32_t ACR; + __IO uint32_t KEYR; + __IO uint32_t OPTKEYR; + __IO uint32_t SR; + __IO uint32_t CR; + __IO uint32_t AR; + __IO uint32_t OBR2; + __IO uint32_t OBR; + __IO uint32_t WRPR; + __IO uint32_t CR2; + __IO uint32_t TIMR; + __IO uint32_t RESERVED1; + __IO uint32_t CAHR; + } FLASH_TypeDef; + + /** + * @brief Option Bytes Registers + */ + + typedef struct + { + __IO uint32_t USER_RDP; + __IO uint32_t Data1_Data0; + __IO uint32_t WRP1_WRP0; + __IO uint32_t WRP3_WRP2; + __IO uint32_t RDP2; + } OB_TypeDef; + + + + +/** + * @brief Digital to Analog Converter + */ + +/** + * @brief USB + */ + +/** Flexible Extended Memory Controller SRAM/NOR Flash **/ +typedef struct +{ + __IO uint32_t FEMC_SNTSTS; + __IO uint32_t FEMC_SNOMSTS; + uint32_t RESERVED[6]; +}FEMC_SN_Bank_Block; + +/** Flexible Extended Memory Controller NAND **/ +typedef struct +{ + __IO uint32_t FEMC_NTSTS; + __IO uint32_t FEMC_NOMSTS; + uint32_t RESERVED[6]; +}FEMC_NAND_Bank; + + +typedef struct +{ + __IO uint32_t FEMC_STS; /* FEMC Status Register Address offset: 0x000 */ + __IO uint32_t FEMC_STS1; /* FEMC Status Register1 Address offset: 0x004 */ + __IO uint32_t FEMC_CFG; /* FEMC Configuration Register Address offset: 0x008 */ + __IO uint32_t FEMC_CCFG; /* FEMC Configuration clear Register Address offset: 0x00C */ + __IO uint32_t FEMC_CTRL; /* FEMC Control Register1 Address offset: 0x010 */ + __IO uint32_t FEMC_TCFG; /* FEMC Timing Configuration Register Address offset: 0x014 */ + __IO uint32_t FEMC_OMCFG; /* FEMC Operate Mode Register Address offset: 0x018 */ + uint32_t RESERVED1C; + __IO uint32_t FEMC_RPE; /* FEMC Refresh Period Register Address offset: 0x020 */ + uint32_t RESERVED24[55]; /* 0x24 ~ 0xFC */ + FEMC_SN_Bank_Block block1; /* 0x100 ~ 0x11C */ + FEMC_SN_Bank_Block block2; /* 0x120 ~ 0x13C */ + FEMC_SN_Bank_Block block3; /* 0x140 ~ 0x15C */ + FEMC_SN_Bank_Block block4; /* 0x160 ~ 0x17C */ + FEMC_NAND_Bank bank1; /* 0x180 ~ 0x18C */ + FEMC_NAND_Bank bank2; /* 0x1A0 ~ 0x1BC */ + uint32_t RESERVED1B0[16]; /* 0x1C0 ~ 0x1FC */ + uint32_t RESERVED125[128];/* 0x200 ~ 0x3FC */ + __IO uint32_t FEMC_ECCSTS; /* FEMC ECC Status Register Address offset: 0x400 */ + __IO uint32_t FEMC_ECCCFG; /* FEMC ECC Configure Register Address offset: 0x404 */ + __IO uint32_t FEMC_ECCMD0; /* FEMC ECC Command0 Register Address offset: 0x408 */ + __IO uint32_t FEMC_ECCMD1; /* FEMC ECC Command1 Register Address offset: 0x40C */ + __IO uint32_t FEMC_ECCADDR0; /* FEMC ECC Address0 Register Address offset: 0x410 */ + __IO uint32_t FEMC_ECCADDR1; /* FEMC ECC Address1 Register Address offset: 0x414 */ + __IO uint32_t FEMC_ECCBLK[4]; /* FEMC ECC Block0 Register Address offset: 0x418 */ + __IO uint32_t FEMC_ECCEBLK; /* FEMC ECC Extra Block Register Address offset: 0x428 */ + uint32_t RESERVED42C[53]; /* 0x42C ~ 0x4FC */ + __IO uint32_t FEMC_SNADD1; /* FEMC SRAM/NOR Set Address1 Register Address offset: 0x500 */ + __IO uint32_t FEMC_SNADD2; /* FEMC SRAM/NOR Set Address2 Register Address offset: 0x504 */ + __IO uint32_t FEMC_SNADD3; /* FEMC SRAM/NOR Set Address3 Register Address offset: 0x508 */ + __IO uint32_t FEMC_SNADD4; /* FEMC SRAM/NOR Set Address4 Register Address offset: 0x50C */ + __IO uint32_t FEMC_NADD1; /* FEMC NAND Set Address1 Register Address offset: 0x510 */ + __IO uint32_t FEMC_NADD2; /* FEMC NAND Set Address2 Register Address offset: 0x514 */ + uint32_t RESERVED518[2]; /* 0x518 ~ 0x51C */ + __IO uint32_t FEMC_SNMOD; /* FEMC SRAM/NOR Mode Register Address offset: 0x520 */ + __IO uint32_t FEMC_NMOD; /* FEMC NAND Mode Register Address offset: 0x524 */ + __IO uint32_t FEMC_REMAP; /* FEMC Remap Register Address offset: 0x528 */ +} FEMC_Module; + + +/*** USB High Speed Global Register ***/ + +typedef struct +{ + __IO uint32_t GCTRLSTS; /* USBHS global Control and Status Register Address offset: 0x000 */ + uint32_t Reserved04; /* Reserved04 Address offset: 0x004 */ + __IO uint32_t GAHBCFG; /* Core AHB Configuration Register Address offset: 0x008 */ + __IO uint32_t GCFG; /* Core USB Configuration Register Address offset: 0x00C */ + __IO uint32_t GRSTCTRL; /* Core Reset Register Address offset: 0x010 */ + __IO uint32_t GINTSTS; /* Core Interrupt Register Address offset: 0x014 */ + __IO uint32_t GINTEN; /* Core Interrupt Mask Register Address offset: 0x018 */ + __IO uint32_t GRXSTS; /* Receive Sts Q Read Register Address offset: 0x01C */ + __IO uint32_t GRXSTSP; /* Receive Sts Q Read & POP Register Address offset: 0x020 */ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register Address offset: 0x024 */ + __IO uint32_t GNPTXFSIZ_DINEP0TXFSIZ; /* Non Periodic/EP0 Tx FIFO Size/ Register Address offset: 0x028 */ + __IO uint32_t GNPTXFSTS; /* Non Periodic Tx FIFO/Queue Sts reg Address offset: 0x02C */ + uint32_t Reserved30[3]; /* Reserved Address offset: 0x030 */ + __IO uint32_t CID; /* User ID Register Address offset: 0x03C */ + __IO uint32_t Reserved40[6]; /* Reserved40 Address offset: 0x040 */ + __IO uint32_t GPD; /* Power Down Register Address offset: 0x058 */ + __IO uint32_t GDFCFG; /* DFIFO Software Config Register Address offset: 0x05C */ + uint32_t Reserved58[40]; /* Reserved Address offset: 0x60-0xFC */ + __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg Address offset: 0x100 */ + __IO uint32_t DINEPPTXFSIZ[16]; /* Device IN EP Periodic Transmit FIFO */ +} USB_Global_Registers; + +/*** USBHS Host Mode Register ***/ +typedef struct +{ + __IO uint32_t HCFG; /* Host Configuration Register Address offset: 0x400 */ + __IO uint32_t HFRI; /* Host Frame Interval Register Address offset: 0x404 */ + __IO uint32_t HFNUM; /* Host Frame number and Frame Remaining Address offset: 0x408 */ + uint32_t Reserved0C; /* Reserved Address offset: 0x40C */ + __IO uint32_t HPTXFQSTS; /* Host Periodic Tx FIFO/Queue Status register Address offset: 0x410 */ + __IO uint32_t HACHINT; /* Host All Channels Interrupt Register Address offset: 0x414 */ + __IO uint32_t HACHINTEN; /* Host All Channels Interrupt Enable Address offset: 0x418 */ + uint32_t Reserved1C[0x0A]; /* Reserved Address offset: 0x41C */ +} USB_Host_Registers; + +/*** USBHS Host Channel Register ***/ + +typedef struct +{ + __IO uint32_t HCHCTRL; /* Host Channel Control Register Address offset: 0x500 */ + __IO uint32_t HCSCTRL; /* Host Channel Split Control Register Address offset: 0x504 */ + __IO uint32_t HCHINTSTS; /* Host Channel Interrupt Register Address offset: 0x508 */ + __IO uint32_t HCHINTEN; /* Host Channel Interrupt Enable Register Address offset: 0x50C */ + __IO uint32_t HCHTXSIZ; /* Host Channel Transfer Size Register Address offset: 0x510 */ + __IO uint32_t HCHDMADD; /* Host Channel DMA Address Register Address offset: 0x514 */ + uint32_t Reserved[2]; /* Reserved */ +} USB_HostCH_Registers; + + +/*** USBHS Device Register ***/ + +typedef struct +{ + __IO uint32_t DCFG; /* dev Configuration Register Address offset: 0x800 */ + __IO uint32_t DCTRL; /* dev Control Register Address offset: 0x804 */ + __IO uint32_t DSTS; /* dev Status Register Address offset: 0x808 */ + uint32_t Reserved0C; /* Reserved Address offset: 0x80C */ + __IO uint32_t DINEPINTEN; /* dev IN Endpoint Interrupt Enable Address offset: 0x810 */ + __IO uint32_t DOUTEPINTEN; /* dev OUT Endpoint Interrupt Enable Address offset: 0x814 */ + __IO uint32_t DAEPINTSTS; /* dev All Endpoints Interrupt Status Address offset: 0x818 */ + __IO uint32_t DAEPINTEN; /* dev All Endpoints Interrupt Enable Address offset: 0x81C */ + uint32_t Reserved20[4]; /* Reserved Address offset: 0x820-0x82C*/ + __IO uint32_t DTHRCTRL; /* dev threshold Contrl register Address offset: 0x830 */ + __IO uint32_t DINEPFEINTEN; /* dev IN EP fifo empty interrupt enable Address offset: 0x834 */ + __IO uint32_t DEEPINTSTS; /* Each EP interrupt Status register Address offset: 0x838 */ + __IO uint32_t DEEPINTEN; /* Each EP interrupt enable Address offset: 0x83C */ + __IO uint32_t DINEPXINTEN[9]; /* dedicated EP mask Address offset: 0x840-0x860 */ + uint32_t Reserved64[7]; /* Reserved Address offset: 0x864-0x87C */ + __IO uint32_t DOUTEPXINTEN[9]; /* dedicated EP msk Address offset: 0x880-0x8A0 */ +} USB_Device_Registers; + +/*** USBHS IN Endpoint Register ***/ + +typedef struct +{ + __IO uint32_t DINEPCTRL; /* dev IN Endpoint Control Register Address offset: 0x900 + (ep_num * 0x20) + 0x00 */ + uint32_t Reserved04; /* Reserved Address offset: 0x900 + (ep_num * 0x20) + 0x04 */ + __IO uint32_t DINEPINTSTS; /* dev IN Endpoint Interrupt Stauts Address offset: 0x900 + (ep_num * 0x20) + 0x08 */ + uint32_t Reserved0C; /* Reserved Address offset: 0x900 + (ep_num * 0x20) + 0x0C */ + __IO uint32_t DINEPTXSIZ; /* dev IN Endpoint Txfer Size Address offset: 0x900 + (ep_num * 0x20) + 0x10 */ + __IO uint32_t DINEPDMADD; /* dev IN Endpoint DMA Address Address offset: 0x900 + (ep_num * 0x20) + 0x14 */ + __IO uint32_t DINEPTXFSTS; /* dev IN Endpoint Tx FIFO Status Address offset: 0x900 + (ep_num * 0x20) + 0x18 */ + uint32_t Reserved1C; /* Reserved Address offset: 0x900 + (ep_num * 0x20) + 0x1C */ +} USB_INEP_Registers; + + +/*** USBHS OUT Endpoint Register ***/ + +typedef struct +{ + __IO uint32_t DOUTEPCTRL; /* dev OUT Endpoint Control Register Address offset: 0xB00 + (ep_num * 0x20) + 00 */ + uint32_t Reserved0; /* Reserved Address offset: 0xB00 + (ep_num * 0x20) + 04 */ + __IO uint32_t DOUTEPINTSTS; /* dev OUT Endpoint Interrupt Stauts Address offset: 0xB00 + (ep_num * 0x20) + 08 */ + uint32_t Reserved1; /* Reserved Address offset: 0xB00 + (ep_num * 0x20) + 0C */ + __IO uint32_t DOUTEPTXSIZ; /* dev OUT Endpoint Txfer Size Address offset: 0xB00 + (ep_num * 0x20) + 10 */ + __IO uint32_t DOUTEPDMADD; /* dev OUT Endpoint DMA Address Address offset: 0xB00 + (ep_num * 0x20) + 14 */ + uint32_t Reserved18[2]; /* Reserved */ +} USB_OUTEP_Registers; + +/*** USBHS PWR Control Register ***/ + +typedef struct +{ + __IO uint32_t PWRCTRL; /* USBHS Power Control Register Address offset: 0xE00 */ + __IO uint32_t PWRCTRL1; /* USBHS Power Control1 Register Address offset: 0xE04 */ +} USB_PWR_Registers; + +/*** USBHS Wrapper Register ***/ + +typedef struct +{ + __IO uint32_t WRPCTRL; /* USBHS Wrapper Control Register Address offset: 0x000 */ + __IO uint32_t WRPCFG; /* USBHS Wrapper Configuration Register Address offset: 0x004 */ +} USB_Wrapper_Registers; + +/*** DSI Wrapper Register ***/ +typedef struct +{ + __IO uint32_t DSI_WRPCTRL; /* DSI Wrapper Control Register Address offset: 0x000 */ + __IO uint32_t DSI_WRPSTS; /* DSI Wrapper Status Register Address offset: 0x004 */ + __IO uint32_t DSIPHY_CTRL1; /* DSI PHY Control Register1 Address offset: 0x008 */ + __IO uint32_t DSIPHY_CTRL2; /* DSI PHY Control Register2 Address offset: 0x00C */ + __IO uint32_t DSIPHY_CTRL3; /* DSI PHY Control Register3 Address offset: 0x010 */ + __IO uint32_t DSIPHY_CTRL4; /* DSI PHY Control Register4 Address offset: 0x014 */ + uint32_t Reserved0[19]; /* Reserved Address offset: 0x018~0x060 */ + __IO uint32_t DSIPHY_PLLCTRL1; /* DSI PHY PLL Control Register1 Address offset: 0x064 */ + __IO uint32_t DSIPHY_PLLCTRL2; /* DSI PHY PLL Control Register2 Address offset: 0x068 */ + __IO uint32_t DSIPHY_PLLCTRL3; /* DSI PHY PLL Control Register3 Address offset: 0x06C */ + __IO uint32_t DSIPHY_PLLCTRL4; /* DSI PHY PLL Control Register4 Address offset: 0x070 */ + __IO uint32_t DSIPHY_PLLCTRL5; /* DSI PHY PLL Control Register5 Address offset: 0x074 */ + __IO uint32_t DSIPHY_PLLSTS; /* DSI PHY PLL Status Register5 Address offset: 0x078 */ +}DSI_Wrapper_Module; + +/*** DSI Register ***/ +typedef struct +{ + __IO uint32_t DSI_NUMLANES; /* DSI Set number of active lanes Register Address offset: 0x000 */ + __IO uint32_t DSI_CONTHSCLK; /* DSI Set Host Continuous MIPI clock mode Address offset: 0x004 */ + __IO uint32_t DSI_TPRE; /* DSI Set wait clock after enabling clock lane Address offset: 0x008 */ + __IO uint32_t DSI_TPOST; /* DSI Set Wait clock before enter LP mode after data lane in Stop State Address offset: 0x00C */ + __IO uint32_t DSI_TXGAP; /* DSI Set Wait clock after clock lane in LP mode before enabling clock Address offset: 0x010 */ + __IO uint32_t DSI_AUTOINSERT_EOTP; /* DSI enable automatically insert an EoTp short packet Address offset: 0x014 */ + __IO uint32_t DSI_DISRXCRCCHK; /* DSI disable check payload CRC from longs packets Address offset: 0x018 */ + __IO uint32_t DSI_HSTXTOCNT; /* DSI Set HS TX timeout count Address offset: 0x01C */ + __IO uint32_t DSI_LRXTOCNT; /* DSI Set low power RX timeout count Address offset: 0x020 */ + __IO uint32_t DSI_BTATOCNT; /* DSI set host bus turn around timeout Address offset: 0x024 */ + __IO uint32_t DSI_TWAKEUP; /* DSI set DPHY Twakeup timing Address offset: 0x028 */ + __IO uint32_t DSI_DISBST; /* DSI Disable host bursting Address offset: 0x02C */ + uint32_t Reserved0[3]; /* Reserved Address offset: 0x030~0x038 */ + __IO uint32_t DSI_STS; /* DSI Status Register Address offset: 0x03C */ + __IO uint32_t DSI_ERRSTS; /* DSI Error Status Register Address offset: 0x040 */ + uint32_t Reserved1[7]; /* Reserved Address offset: 0x044~0x05C */ + __IO uint32_t DSI_CLKLANEN; /* DSI enable clock lane Address offset: 0x060 */ + __IO uint32_t DSI_DATLANEN; /* DSI enable data lane Address offset: 0x064 */ + uint32_t Reserved2[22]; /* DSI Register5 Address offset: 0x068~0x0BC */ + __IO uint32_t DSI_SKEWCALTIMI; /* DSI Register5 Address offset: 0x0C0 */ + __IO uint32_t DSI_SKEWCALTIMP; /* DSI Register5 Address offset: 0x0C4 */ + __IO uint32_t DSI_ALTCALTIM; /* DSI Register5 Address offset: 0x0C8 */ + __IO uint32_t DSI_SKEWCALINE; /* DSI Register5 Address offset: 0x0CC */ + uint32_t Reserved3[76]; /* DSI Register5 Address offset: 0x0D0~0x1FC */ + __IO uint32_t VID_EN; /* DSI Register5 Address offset: 0x200 */ + __IO uint32_t VID_PIXPERPKT; /* DSI Register5 Address offset: 0x204 */ + __IO uint32_t VID_PIXPLDSIZ; /* DSI Register5 Address offset: 0x208 */ + __IO uint32_t VID_PIXALIGN; /* DSI Register5 Address offset: 0x20C */ + __IO uint32_t VID_PIXFMT; /* DSI Register5 Address offset: 0x210 */ + __IO uint32_t VID_VSYNCPOL; /* DSI Register5 Address offset: 0x214 */ + __IO uint32_t VID_HSYNCPOL; /* DSI Register5 Address offset: 0x218 */ + __IO uint32_t VID_VIDEOMOD; /* DSI Register5 Address offset: 0x21C */ + __IO uint32_t VID_OVERIDE; /* DSI Register5 Address offset: 0x220 */ + __IO uint32_t VID_STD; /* DSI Register5 Address offset: 0x224 */ + __IO uint32_t VID_HFP; /* DSI Register5 Address offset: 0x228 */ + __IO uint32_t VID_HBP; /* DSI Register5 Address offset: 0x22C */ + __IO uint32_t VID_HSA; /* DSI Register5 Address offset: 0x230 */ + __IO uint32_t VID_PKTPERLINE; /* DSI Register5 Address offset: 0x234 */ + __IO uint32_t VID_VBP; /* DSI Register5 Address offset: 0x238 */ + __IO uint32_t VID_VFP; /* DSI Register5 Address offset: 0x23C */ + __IO uint32_t VID_BLLPMOD; /* DSI Register5 Address offset: 0x240 */ + __IO uint32_t VID_NULLPKTBLLP; /* DSI Register5 Address offset: 0x244 */ + __IO uint32_t VID_VACT; /* DSI Register5 Address offset: 0x248 */ + __IO uint32_t VID_VC; /* DSI Register5 Address offset: 0x24C */ + __IO uint32_t VID_EXTPKTEN; /* DSI Register5 Address offset: 0x250 */ + __IO uint32_t VID_VSSPLD; /* DSI Register5 Address offset: 0x254 */ + __IO uint32_t VID_PLDPERPKT; /* DSI Register5 Address offset: 0x258 */ + uint32_t Reserved4[9]; /* DSI Register5 Address offset: 0x25C~0x27C */ + __IO uint32_t DSI_TXPLD; /* DSI Register5 Address offset: 0x280 */ + __IO uint32_t DSI_PKTCTRL; /* DSI Register5 Address offset: 0x284 */ + __IO uint32_t DSI_SENDPKT; /* DSI Register5 Address offset: 0x288 */ + __IO uint32_t DSI_PKTSTS; /* DSI Register5 Address offset: 0x28C */ + __IO uint32_t DSI_PKTFWRLVL; /* DSI Register5 Address offset: 0x290 */ + __IO uint32_t DSI_PKTFRDLVL; /* DSI Register5 Address offset: 0x294 */ + __IO uint32_t DSI_PKTRXPLD; /* DSI Register5 Address offset: 0x298 */ + __IO uint32_t DSI_PKTRXHDR; /* DSI Register5 Address offset: 0x29C */ + uint32_t Reserved5[4]; /* DSI Register5 Address offset: 0x2A0~0x2AC */ + __IO uint32_t DSI_IFPRIOSEL; /* DSI Register5 Address offset: 0x2B0 */ +}DSI_Module; + + +typedef struct +{ +__IO uint32_t C1_PWR_CR; //0x00 +__IO uint32_t C1_PWR_CSR; //0x04 +__IO uint32_t C1_PWR_CR2; //0x08 +uint32_t RESERVE0[5]; +__IO uint32_t C2_PWR_CR; //0x20 +__IO uint32_t C2_PWR_CSR; //0x24 +__IO uint32_t C2_PWR_CR2; //0x28 +uint32_t RESERVE1[5]; +__IO uint32_t SYS_PWR_CR; //0x40 +__IO uint32_t SYS_PWR_CSR; //0x44 +__IO uint32_t SYS_PWR_CR2; //0x48 +__IO uint32_t SYS_PWR_CR3; //0x4C +__IO uint32_t SYS_PWR_CR4; //0x50 +__IO uint32_t SYS_PWR_BOR_CR; //0x54 +__IO uint32_t IP_MEMPWR_CR; //0x58 +__IO uint32_t IP_MEMPWR_CSR; //0x5C +__IO uint32_t C1_MEM_LPCR1; //0x60 +__IO uint32_t C1_MEM_LPSR1; //0x64 +__IO uint32_t C1_TCM_PG0; //0x68 +__IO uint32_t C1_TCM_PG1; //0x6C +__IO uint32_t C1_TCM_RET1N0; //0x70 +__IO uint32_t C1_TCM_RET1N1; //0x74 +__IO uint32_t C1_TCM_RET2N0; //0x78 +__IO uint32_t C1_TCM_RET2N1; //0x7C +uint32_t RESERVE2[4]; +__IO uint32_t C2_MEM_LPCR; //0x90 +uint32_t RESERVE3[3]; +__IO uint32_t SYS_MEM_LPCR; //0xA0 +uint32_t RESERVE4[3]; +__IO uint32_t SYS_PWR_SHRT_CR; //0xB0 +__IO uint32_t SYS_PWR_MDMA_CR; //0xB4 +__IO uint32_t SYS_PWR_ETHCAT_CR; //0xB8 +uint32_t RESERVE5[17]; +__IO uint32_t PWR_EMC_CR0; //0x100 +__IO uint32_t PWR_EMC_CR1; //0x104 +__IO uint32_t PWR_EMC_CR2; //0x108 +__IO uint32_t PWR_EMC_CR3; //0x10C +__IO uint32_t PWR_EMC_CR4; //0x110 +__IO uint32_t PWR_EMC_CR5; //0x114 +__IO uint32_t PWR_EMC_CR6; //0x118 +__IO uint32_t PWR_EMC_CR7; //0x11C +__IO uint32_t PWR_BKP_EMC_CR0; //0x120 +__IO uint32_t PWR_BKP_EMC_CR1; //0x124 + } PWR_TypeDef; + + /** Reset and Clock Control **/ + typedef struct + { + __IO uint32_t PLL1CTRL1; //0x00 + __IO uint32_t PLL1CTRL2; //0x04 + uint32_t RESERVED1; //0x08 + uint32_t RESERVED2; //0x0C + __IO uint32_t PLL2CTRL1; //0x10 + __IO uint32_t PLL2CTRL2; //0x14 + uint32_t RESERVED3; //0x18 + uint32_t RESERVED4; //0x1C + __IO uint32_t PLL3CTRL1; //0x20 + __IO uint32_t PLL3CTRL2; //0x24 + uint32_t RESERVED5; //0x28 + uint32_t RESERVED6; //0x2C + __IO uint32_t SRCCTRL1; //0x30 + __IO uint32_t PLL1DIV; //0x34 + __IO uint32_t PLL2DIV; //0x38 + __IO uint32_t PLL3DIV; //0x3C + __IO uint32_t SYSBUSDIV1; //0x40 + __IO uint32_t SYSBUSDIV2; //0x44 + __IO uint32_t BOOTMODE; //0x48 + __IO uint32_t AHB1DIV1; //0x4C + __IO uint32_t AHB1SEL1; //0x50 + __IO uint32_t AHB1EN1; //0x54 + __IO uint32_t AHB1EN2; //0x58 + __IO uint32_t AHB1EN3; //0x5C + __IO uint32_t AHB1EN4; //0x60 + __IO uint32_t AHB1RST1; //0x64 + __IO uint32_t AHB1RST2; //0x68 + __IO uint32_t AHB1RST3; //0x6C + __IO uint32_t AHB1RST4; //0x70 + __IO uint32_t APB1DIV1; //0x74 + __IO uint32_t APB1SEL1; //0x78 + __IO uint32_t APB1SEL2; //0x7C + __IO uint32_t APB1EN1; //0x80 + __IO uint32_t APB1EN2; //0x84 + __IO uint32_t APB1EN3; //0x88 + __IO uint32_t APB1EN4; //0x8C + __IO uint32_t APB1EN5; //0x90 + __IO uint32_t APB1RST1; //0x94 + __IO uint32_t APB1RST2; //0x98 + __IO uint32_t APB1RST3; //0x9C + __IO uint32_t APB1RST4; //0xA0 + __IO uint32_t APB1RST5; //0xA4 + __IO uint32_t AHB2DIV1; //0xA8 + __IO uint32_t AHB2SEL1; //0xAC + __IO uint32_t AHB2EN1; //0xB0 + __IO uint32_t AHB2RST1; //0xB4 + __IO uint32_t APB2DIV1; //0xB8 + __IO uint32_t APB2SEL1; //0xBC + __IO uint32_t APB2SEL2; //0xC0 + __IO uint32_t APB2EN1; //0xC4 + __IO uint32_t APB2EN2; //0xC8 + __IO uint32_t APB2EN3; //0xCC + __IO uint32_t APB2EN4; //0xD0 + __IO uint32_t APB2RST1; //0xD4 + __IO uint32_t APB2RST2; //0xD8 + __IO uint32_t APB2RST3; //0xDC + __IO uint32_t APB2RST4; //0xE0 + __IO uint32_t AHB5EN1; //0xE4 + __IO uint32_t AHB5EN2; //0xE8 + __IO uint32_t AHB5RST1; //0xEC + __IO uint32_t AHB5RST2; //0xF0 + __IO uint32_t APB5DIV1; //0xF4 + __IO uint32_t APB5SEL1; //0xF8 + __IO uint32_t APB5EN1; //0xFC + __IO uint32_t APB5EN2; //0x100 + __IO uint32_t APB5RST1; //0x104 + __IO uint32_t APB5RST2; //0x108 + __IO uint32_t RDDIV1; //0x10C + __IO uint32_t RDSEL1; //0x110 + __IO uint32_t RDEN1; //0x114 + __IO uint32_t RDEN2; //0x118 + __IO uint32_t RDRST1; //0x11C + __IO uint32_t RDRST2; //0x120 + __IO uint32_t BDCTRL; //0x124 + __IO uint32_t CTRLSTS; //0x128 + __IO uint32_t CLKINT1; //0x12C + __IO uint32_t CLKINT2; //0x130 + __IO uint32_t CFG1; //0x134 + __IO uint32_t AXIDIV1; //0x138 + __IO uint32_t AXISEL1; //0x13C + __IO uint32_t AXIEN1; //0x140 + __IO uint32_t AXIEN2; //0x144 + __IO uint32_t AXIEN3; //0x148 + __IO uint32_t AXIEN4; //0x14C + __IO uint32_t AXIRST1; //0x150 + __IO uint32_t AXIRST2; //0x154 + __IO uint32_t AXIRST3; //0x158 + __IO uint32_t AXIRST4; //0x15C + __IO uint32_t CFG2; //0x160 + __IO uint32_t CFG3; //0x164 + __IO uint32_t CFG4; //0x168 + __IO uint32_t SRCCTRL2; //0x16C + __IO uint32_t CFG5; //0x170 + __IO uint32_t M4RSTREL; //0x174 + __IO uint32_t AXIDIV2; //0x178 + __IO uint32_t AXISEL2; //0x17C + uint32_t RESERVED7; //0x180 + uint32_t RESERVED8; //0x184 + uint32_t RESERVED9; //0x188 + __IO uint32_t SHRPLLCTRL1; //0x18C + __IO uint32_t SHRPLLCTRL2; //0x190 + __IO uint32_t AHB1DIV2; //0x194 + __IO uint32_t LSERDDL; //0x198 + __IO uint32_t MSIRDDL; //0x19C + __IO uint32_t HSERDDL; //0x1A0 + __IO uint32_t PLLSFTLK; //0x1A4 + __IO uint32_t RDCTRL1; //0x1A8 + __IO uint32_t RDCTRL2; //0x1AC + __IO uint32_t RDCTRL3; //0x1B0 + __IO uint32_t AHB2EN2; //0x1B4 + __IO uint32_t AHB9DIV1; //0x1B8 + __IO uint32_t AHB9SEL1; //0x1BC + __IO uint32_t AHB9EN1; //0x1C0 + __IO uint32_t AHB9RST1; //0x1C4 + __IO uint32_t HSEOS; //0x1C8 + __IO uint32_t LSEOS; //0x1CC + __IO uint32_t HSECAL; //0x1D0 + __IO uint32_t CLKINT3; //0x1D4 + __IO uint32_t PLLFD; //0x1D8 + __IO uint32_t SRCCTRL3; //0x1DC + __IO uint32_t LSICSSDL; //0x1E0 + } RCC_Module; + + + + + +/*** @brief Debug MCU ***/ + +typedef struct +{ + __IO uint32_t ID; //0x00 + __IO uint32_t CTRL; //0x04 + __IO uint32_t M7APB1FZ; //0x08 + __IO uint32_t M4APB1FZ; //0x0C + __IO uint32_t M7APB2FZ; //0x10 + __IO uint32_t M4APB2FZ; //0x14 + __IO uint32_t M7APB5FZ; //0x18 + __IO uint32_t M4APB5FZ; //0x1C + __IO uint32_t M7APB6FZ; //0x20 + __IO uint32_t M4APB6FZ; //0x24 +}DBG_Module; + +/*** Ethernet MAC ***/ +typedef struct +{ + __IO uint32_t MACCFG; /* Offset: 0x0000 */ + __IO uint32_t MACEXTCFG; /* Offset: 0x0004 */ + __IO uint32_t MACPFLT; /* Offset: 0x0008 */ + __IO uint32_t MACWDGTO; /* Offset: 0x000C */ + __IO uint32_t MACHASHTR0; /* Offset: 0x0010 */ + __IO uint32_t MACHASHTR1; /* Offset: 0x0014 */ + uint32_t RESERVED0[14]; + __IO uint32_t MACVLANTAG; /* Offset: 0x0050 */ + uint32_t RESERVED1; + __IO uint32_t MACVHASHT; /* Offset: 0x0058 */ + uint32_t RESERVED2; + __IO uint32_t MACVLANINC; /* Offset: 0x0060 */ + __IO uint32_t MACIVLANINC; /* Offset: 0x0064 */ + uint32_t RESERVED3[2]; + __IO uint32_t MACTXFLWCTRL; /* Offset: 0x0070 */ + uint32_t RESERVED4[7]; + __IO uint32_t MACRXFLWCTRL; /* Offset: 0x0090 */ + uint32_t RESERVED5[7]; + __IO uint32_t MACINTSTS; /* Offset: 0x00B0 */ + __IO uint32_t MACINTEN; /* Offset: 0x00B4 */ + __IO uint32_t MACRXTXSTS; /* Offset: 0x00B8 */ + uint32_t RESERVED6; + __IO uint32_t MACPMTCTRLSTS; /* Offset: 0x00C0 */ + __IO uint32_t MACRWUPFLT; /* Offset: 0x00C4 */ + uint32_t RESERVED7[2]; + __IO uint32_t MACLPICTRLSTS; /* Offset: 0x00D0 */ + __IO uint32_t MACLPITIMCTRL; /* Offset: 0x00D4 */ + __IO uint32_t MACLPIETYTIM; /* Offset: 0x00D8 */ + __IO uint32_t MAC1USTICCNT; /* Offset: 0x00DC */ + uint32_t RESERVED8[12]; + __IO uint32_t MACVER; /* Offset: 0x0110 */ + __IO uint32_t MACDBG; /* Offset: 0x0114 */ + uint32_t RESERVED9; + __IO uint32_t MACHWF0; /* Offset: 0x011C */ + __IO uint32_t MACHWF1; /* Offset: 0x0120 */ + __IO uint32_t MACHWF2; /* Offset: 0x0124 */ + __IO uint32_t MACHWF3; /* Offset: 0x0128 */ + uint32_t RESERVED10[53]; + __IO uint32_t MACMDIOADDR; /* Offset: 0x0200 */ + __IO uint32_t MACMDIODATA; /* Offset: 0x0204 */ + uint32_t RESERVED11[2]; + __IO uint32_t MACARPADDR; /* Offset: 0x0210 */ + uint32_t RESERVED12[7]; + __IO uint32_t MACCSRSWCTRL; /* Offset: 0x0230 */ + uint32_t RESERVED13[3]; + __IO uint32_t MACPTNS; /* Offset: 0x0240 */ + __IO uint32_t MACPTUPDT; /* Offset: 0x0244 */ + uint32_t RESERVED14[46]; + __IO uint32_t MACADDR0H; /* Offset: 0x0300 */ + __IO uint32_t MACADDR0L; /* Offset: 0x0304 */ + __IO uint32_t MACADDR1H; /* Offset: 0x0308 */ + __IO uint32_t MACADDR1L; /* Offset: 0x030C */ + __IO uint32_t MACADDR2H; /* Offset: 0x0310 */ + __IO uint32_t MACADDR2L; /* Offset: 0x0314 */ + __IO uint32_t MACADDR3H; /* Offset: 0x0318 */ + __IO uint32_t MACADDR3L; /* Offset: 0x031C */ + uint32_t RESERVED15[248]; + __IO uint32_t MMCCTRL; /* Offset: 0x0700 */ + __IO uint32_t MMCRXINT; /* Offset: 0x0704 */ + __IO uint32_t MMCTXINT; /* Offset: 0x0708 */ + __IO uint32_t MMCRXINTMSK; /* Offset: 0x070C */ + __IO uint32_t MMCTXINTMSK; /* Offset: 0x0710 */ + uint32_t RESERVED16[14]; + __IO uint32_t MMCTXSCGP; /* Offset: 0x074C */ + __IO uint32_t MMCTXMCGP; /* Offset: 0x0750 */ + uint32_t RESERVED17[5]; + __IO uint32_t MMCTXPCG; /* Offset: 0x0768 */ + uint32_t RESERVED18[8]; + __IO uint32_t MMCRXBPG; /* Offset: 0x078C */ + __IO uint32_t MMCRXMPG; /* Offset: 0x0790 */ + __IO uint32_t MMCRXCRCEP; /* Offset: 0x0794 */ + __IO uint32_t MMCRXAEP; /* Offset: 0x0798 */ + uint32_t RESERVED19[10]; + __IO uint32_t MMCRXUPG; /* Offset: 0x07C4 */ + uint32_t RESERVED20[9]; + __IO uint32_t MMCTXLPIUS; /* Offset: 0x07EC */ + __IO uint32_t MMCTXLPITRAN; /* Offset: 0x07F0 */ + __IO uint32_t MMCRXLPIUS; /* Offset: 0x07F4 */ + __IO uint32_t MMCRXLPITRAN; /* Offset: 0x07F8 */ + uint32_t RESERVED21; + __IO uint32_t MMCIPCRXINTMSK; /* Offset: 0x0800 */ + uint32_t RESERVED22; + __IO uint32_t MMCIPCRXINT; /* Offset: 0x0808 */ + uint32_t RESERVED23; + __IO uint32_t MMCRXIPV4GP; /* Offset: 0x0810 */ + uint32_t RESERVED24[4]; + __IO uint32_t MMCRXIPV6GP; /* Offset: 0x0824 */ + uint32_t RESERVED25[2]; + __IO uint32_t MMCRXUDPGP; /* Offset: 0x0830 */ + __IO uint32_t MMCRXUDPEP; /* Offset: 0x0834 */ + __IO uint32_t MMCRXTCPGP; /* Offset: 0x0838 */ + __IO uint32_t MMCRXTCPEP; /* Offset: 0x083C */ + __IO uint32_t MMCRXICMPGP; /* Offset: 0x0840 */ + __IO uint32_t MMCRXICMPEP; /* Offset: 0x0844 */ + uint32_t RESERVED26[46]; + __IO uint32_t MACL3L4F0CTRL; /* Offset: 0x0900 */ + __IO uint32_t MACL4F0PORT; /* Offset: 0x0904 */ + uint32_t RESERVED27[2]; + __IO uint32_t MACL3F0ADDR0; /* Offset: 0x0910 */ + __IO uint32_t MACL3F0ADDR1; /* Offset: 0x0914 */ + __IO uint32_t MACL3F0ADDR2; /* Offset: 0x0918 */ + __IO uint32_t MACL3F0ADDR3; /* Offset: 0x091C */ + uint32_t RESERVED28[4]; + __IO uint32_t MACL3L4F1CTRL; /* Offset: 0x0930 */ + __IO uint32_t MACL4F1PORT; /* Offset: 0x0934 */ + uint32_t RESERVED29[2]; + __IO uint32_t MACL3F1ADDR0; /* Offset: 0x0940 */ + __IO uint32_t MACL3F1ADDR1; /* Offset: 0x0944 */ + __IO uint32_t MACL3F1ADDR2; /* Offset: 0x0948 */ + __IO uint32_t MACL3F1ADDR3; /* Offset: 0x094C */ + uint32_t RESERVED30[108]; + __IO uint32_t MACTSCTRL; /* Offset: 0x0B00 */ + __IO uint32_t MACSUBSINC; /* Offset: 0x0B04 */ + __IO uint32_t MACSYSTS; /* Offset: 0x0B08 */ + __IO uint32_t MACSYSTNS; /* Offset: 0x0B0C */ + __IO uint32_t MACSYSTSUP; /* Offset: 0x0B10 */ + __IO uint32_t MACSYSTNSUP; /* Offset: 0x0B14 */ + __IO uint32_t MACTSADD; /* Offset: 0x0B18 */ + __IO uint32_t MACSYSTHWS; /* Offset: 0x0B1C */ + __IO uint32_t MACTSSTS; /* Offset: 0x0B20 */ + uint32_t RESERVED31[3]; + __IO uint32_t MACTXTSSTSNS; /* Offset: 0x0B30 */ + __IO uint32_t MACTXTSSTSS; /* Offset: 0x0B34 */ + uint32_t RESERVED32[2]; + __IO uint32_t MACAUXCTRL; /* Offset: 0x0B40 */ + uint32_t RESERVED33; + __IO uint32_t MACAUXTSNS; /* Offset: 0x0B48 */ + __IO uint32_t MACAUXTSS; /* Offset: 0x0B4C */ + __IO uint32_t MACTSIGASYC; /* Offset: 0x0B50 */ + __IO uint32_t MACTSEGASYC; /* Offset: 0x0B54 */ + __IO uint32_t MACTSIGCNS; /* Offset: 0x0B58 */ + __IO uint32_t MACTSEGCNS; /* Offset: 0x0B5C */ + uint32_t RESERVED34[2]; + __IO uint32_t MACTSIGLAT; /* Offset: 0x0B68 */ + __IO uint32_t MACTSEGLAT; /* Offset: 0x0B6C */ + __IO uint32_t MACPPSCTRL; /* Offset: 0x0B70 */ + uint32_t RESERVED35[3]; + __IO uint32_t MACPPSTTS; /* Offset: 0x0B80 */ + __IO uint32_t MACPPSTTNS; /* Offset: 0x0B84 */ + __IO uint32_t MACPPSINTE; /* Offset: 0x0B88 */ + __IO uint32_t MACPPSWID; /* Offset: 0x0B8C */ + uint32_t RESERVED36[12]; + __IO uint32_t MACPTOCTRL; /* Offset: 0x0BC0 */ + __IO uint32_t MACSRCPID0; /* Offset: 0x0BC4 */ + __IO uint32_t MACSRCPID1; /* Offset: 0x0BC8 */ + __IO uint32_t MACSRCPID2; /* Offset: 0x0BCC */ + __IO uint32_t MACLOGMINTE; /* Offset: 0x0BD0 */ + uint32_t RESERVED37[11]; + + __IO uint32_t MTLOPMOD; /* Offset: 0x0C00 */ + uint32_t RESERVED38[7]; + __IO uint32_t MTLINTSTS; /* Offset: 0x0C20 */ + uint32_t RESERVED39[55]; + __IO uint32_t MTLTXQOPMOD; /* Offset: 0x0D00 */ + __IO uint32_t MTLTXQUDF; /* Offset: 0x0D04 */ + __IO uint32_t MTLTXQDBG; /* Offset: 0x0D08 */ + uint32_t RESERVED40[8]; + __IO uint32_t MTLQINTCTRLSTS; /* Offset: 0x0D2C */ + __IO uint32_t MTLRXQOPMOD; /* Offset: 0x0D30 */ + __IO uint32_t MTLRXQMPOFCNT; /* Offset: 0x0D34 */ + __IO uint32_t MTLRXQDBG; /* Offset: 0x0D38 */ + uint32_t RESERVED41[177]; + + __IO uint32_t DMAMODE; /* Offset: 0x1000 */ + __IO uint32_t DMASBMODE; /* Offset: 0x1004 */ + __IO uint32_t DMAINTSTS; /* Offset: 0x1008 */ + __IO uint32_t DMADBGSTS; /* Offset: 0x100C */ + uint32_t RESERVED42[60]; + __IO uint32_t DMACH0CTRL; /* Offset: 0x1100 */ + __IO uint32_t DMACH0TXCTRL; /* Offset: 0x1104 */ + __IO uint32_t DMACH0RXCTRL; /* Offset: 0x1108 */ + uint32_t RESERVED43[2]; + __IO uint32_t DMACH0TXDLA; /* Offset: 0x1114 */ + uint32_t RESERVED44; + __IO uint32_t DMACH0RXDLA; /* Offset: 0x111C */ + __IO uint32_t DMACH0TXDTP; /* Offset: 0x1120 */ + uint32_t RESERVED45; + __IO uint32_t DMACH0RXDTP; /* Offset: 0x1128 */ + __IO uint32_t DMACH0TXDRLEN; /* Offset: 0x112C */ + __IO uint32_t DMACH0RXCTRL2; /* Offset: 0x1130 */ + __IO uint32_t DMACH0INTEN; /* Offset: 0x1134 */ + __IO uint32_t DMACH0RXINTWT; /* Offset: 0x1138 */ + uint32_t RESERVED46[2]; + __IO uint32_t DMACH0CATXD; /* Offset: 0x1144 */ + uint32_t RESERVED47; + __IO uint32_t DMACH0CARXD; /* Offset: 0x114C */ + uint32_t RESERVED48; + __IO uint32_t DMACH0CATXB; /* Offset: 0x1154 */ + uint32_t RESERVED49; + __IO uint32_t DMACH0CARXB; /* Offset: 0x115C */ + __IO uint32_t DMACH0STS; /* Offset: 0x1160 */ + __IO uint32_t DMACH0DPCNT; /* Offset: 0x1164 */ + uint32_t RESERVED50; + __IO uint32_t DMACH0RXERICNT; /* Offset: 0x116C */ +} ETH_Module; + +/*** EXTI(External Interrupt/Event Controller) Regiters ***/ +typedef struct +{ + __IO uint32_t RT_CFG[2]; //0x00 + __IO uint32_t RESERVED0[6]; + __IO uint32_t FT_CFG[2]; //0x20 + __IO uint32_t RESERVED1[6]; + __IO uint32_t SWIE[2]; //0x40 + __IO uint32_t RESERVED2[6]; + __IO uint32_t M7IMASK[2]; //0x60 + __IO uint32_t RESERVED3[6]; + __IO uint32_t M4IMASK[2]; //0x80 + __IO uint32_t RESERVED4[6]; + __IO uint32_t M7EMASK[2]; //0xA0 + __IO uint32_t RESERVED5[6]; + __IO uint32_t M4EMASK[2]; //0xC0 + __IO uint32_t RESERVED6[6]; + __IO uint32_t M7PEND[2]; //0xE0 + __IO uint32_t RESERVED7[6]; + __IO uint32_t M4PEND[2]; //0x100 + __IO uint32_t RESERVED8[6]; + __IO uint32_t M7IMASK_DRC[2]; //0x120 + __IO uint32_t RESERVED9[6]; + __IO uint32_t M4IMASK_DRC[2]; //0x140 + __IO uint32_t RESERVED10[6]; + __IO uint32_t M7EMASK_DRC[2]; //0x160 + __IO uint32_t RESERVED11[6]; + __IO uint32_t M4EMASK_DRC[2]; //0x180 + __IO uint32_t RESERVED12[14]; + __IO uint32_t TSSEL; //0x1C0 +}EXTI_Module; + +/*** FDCAN(Flexible Datarate Controller Area Network) Registers ***/ +typedef struct +{ + __IO uint32_t CREL; //0x000 + __IO uint32_t ENDN; //0x004 + __IO uint32_t RESERVED1; //0x008 + __IO uint32_t DBTP; //0x00C + __IO uint32_t TEST; //0x010 + __IO uint32_t RWD; //0x014 + __IO uint32_t CCCR; //0x018 + __IO uint32_t NBTP; //0x01C + __IO uint32_t TSCC; //0x020 + __IO uint32_t TSCV; //0x024 + __IO uint32_t TOCC; //0x028 + __IO uint32_t TOCV; //0x02C + __IO uint32_t RESERVED2[4]; //0x030 + __IO uint32_t ECR; //0x040 + __IO uint32_t PSR; //0x044 + __IO uint32_t TDCR; //0x048 + __IO uint32_t RESERVED3; //0x04C + __IO uint32_t IR; //0x050 + __IO uint32_t IE; //0x054 + __IO uint32_t ILS; //0x058 + __IO uint32_t ILE; //0x05C + __IO uint32_t RESERVED4[8]; //0x060 + __IO uint32_t GFC; //0x080 + __IO uint32_t SIDFC; //0x084 + __IO uint32_t XIDFC; //0x088 + __IO uint32_t RESERVED5; //0x08C + __IO uint32_t XIDAM; //0x090 + __IO uint32_t HPMS; //0x094 + __IO uint32_t NDAT1; //0x098 + __IO uint32_t NDAT2; //0x09C + __IO uint32_t RXF0C; //0x0A0 + __IO uint32_t RXF0S; //0x0A4 + __IO uint32_t RXF0A; //0x0A8 + __IO uint32_t RXBC; //0x0AC + __IO uint32_t RXF1C; //0x0B0 + __IO uint32_t RXF1S; //0x0B4 + __IO uint32_t RXF1A; //0x0B8 + __IO uint32_t RXESC; //0x0BC + __IO uint32_t TXBC; //0x0C0 + __IO uint32_t TXFQS; //0x0C4 + __IO uint32_t TXESC; //0x0C8 + __IO uint32_t TXBRP; //0x0CC + __IO uint32_t TXBAR; //0x0D0 + __IO uint32_t TXBCR; //0x0D4 + __IO uint32_t TXBTO; //0x0D8 + __IO uint32_t TXBCF; //0x0DC + __IO uint32_t TXBTIE; //0x0E0 + __IO uint32_t TXBCIE; //0x0E4 + __IO uint32_t RESERVED6[2]; //0x0E8 + __IO uint32_t TXEFC; //0x0F0 + __IO uint32_t TXEFS; //0x0F4 + __IO uint32_t TXEFA; //0x0F8 + __IO uint32_t RESERVED7[1]; //0x0FC + __IO uint32_t TTTMC; //0x100 + __IO uint32_t TTRMC; //0x104 + __IO uint32_t TTOCF; //0x108 + __IO uint32_t TTMLM; //0x10c + __IO uint32_t TURCF; //0x110 + __IO uint32_t TTOCN; //0x114 + __IO uint32_t TTGTP; //0x118 + __IO uint32_t TTTMK; //0x11c + __IO uint32_t TTIR; //0x120 + __IO uint32_t TTIE; //0x124 + __IO uint32_t TTILS; //0x128 + __IO uint32_t TTOST; //0x12c + __IO uint32_t TURNA; //0x130 + __IO uint32_t TTLGT; //0x134 + __IO uint32_t TTCTC; //0x138 + __IO uint32_t TTCPT; //0x13C + __IO uint32_t TTCSM; //0x140 + __IO uint32_t TTSS; //0x144 +} FDCAN_Module; + +/*** FLASH Registers ***/ +typedef struct +{ + __IO uint32_t AC; //0x00 + __IO uint32_t CTRL; //0x04 + __IO uint32_t STS; //0x08 + __IO uint32_t ADD; //0x0C + __IO uint32_t KEY; //0x10 + __IO uint32_t OPTKEY; //0x14 + __IO uint32_t OB; //0x18 + __IO uint32_t WRP; //0x1C + __IO uint32_t ECC; //0x20 + __IO uint32_t RESERVED0[2]; + __IO uint32_t RDN; //0x2C + __IO uint32_t CAHR; //0x30 + __IO uint32_t ROWP; //0x34 + __IO uint32_t CCM_WRP1; //0x38 + __IO uint32_t CCM_KEY; //0x3C + __IO uint32_t CCM_ERASE; //0x40 + __IO uint32_t CCM_WRP2; //0x44 + __IO uint32_t CCM_MODE; //0x48 + __IO uint32_t XSPI_DSTRADD; //0x4C + __IO uint32_t XSPI_DENDADD; //0x50 + __IO uint32_t FEMC_DSTRADD; //0x54 + __IO uint32_t FEMC_DENDADD; //0x58 + __IO uint32_t RTPD_KEY; //0x5C + __IO uint32_t JTAG_SEAL; //0x60 + __IO uint32_t RTPD_KEY_WCNT;//0x64 + __IO uint32_t RESERVED1; + __IO uint32_t XSPI_FEMC_DEN;//0x6C + __IO uint32_t XUID; //0x70 +} FLASH_Module; + +/*** Option Bytes Registers ***/ + +typedef struct +{ + __IO uint32_t USER_RDP; //0x00 + __IO uint32_t Data1_Data0; //0x04 + __IO uint32_t WRP1_WRP0; //0x08 + __IO uint32_t WRP3_WRP2; //0x0C + __IO uint32_t USER2_RDP2; //0x10 + __IO uint32_t USER3; //0x14 + __IO uint32_t CCMSRAM_RST; //0x18 + __IO uint32_t RESERVED; +} OB_Module; + +/*** GPIO(General Purpose I/O) Registers ***/ +typedef struct +{ + __IO uint32_t PMODE; //0x00 + __IO uint32_t POTYPE; //0x04 + __IO uint32_t SR; //0x08 + __IO uint32_t PUPD; //0x0C + __IO uint32_t PID; //0x10 + __IO uint32_t POD; //0x14 + __IO uint32_t PBSC; //0x18 + __IO uint32_t PLOCK; //0x1C + __IO uint32_t AFL; //0x20 + __IO uint32_t AFH; //0x24 + __IO uint32_t PBC; //0x28 + __IO uint32_t DS; //0x2C +} GPIO_Module; + +/*** AFIO(Alternate Function I/O) Registers ***/ +typedef struct +{ + __IO uint32_t RMP_CFG; //0x00 + __IO uint32_t FILTER_CFG; //0x04 + __IO uint32_t XSPI1_NONCE0; //0x08 + __IO uint32_t XSPI1_NONCE1; //0x0C + __IO uint32_t XSPI1_NONCE2; //0x10 + __IO uint32_t ADCRMP_CFG; //0x14 + __IO uint32_t EXTI_CFG[4]; //0x18 + __IO uint32_t TOL5V_CFG1; //0x28 + __IO uint32_t TOL5V_CFG2; //0x2C + __IO uint32_t TOL5V_CFG3; //0x30 + __IO uint32_t SHRT1_FALT_CFG; //0x34 + __IO uint32_t SHRT2_FALT_CFG; //0x38 + __IO uint32_t TOL5V_CFG4; //0x3C + __IO uint32_t RESERVED40; //0x40 + __IO uint32_t TOL5V_CFG5; //0x44 + __IO uint32_t TOL5V_CFG6; //0x48 + __IO uint32_t TOL5V_CFG7; //0x4C + __IO uint32_t RESERVED50; //0x50 + __IO uint32_t EFT_CFG[6]; //0x54 + __IO uint32_t DIGEFT_CFG[6]; //0x6C + __IO uint32_t SHRT1_EXEV_CFG[2]; //0x84 + __IO uint32_t SHRT2_EXEV_CFG[2]; //0x8C + __IO uint32_t SIP_PUPD; //0x94 + __IO uint32_t HSMODE_CFG[5]; //0x98 + __IO uint32_t RESERVEDAC; //0xAC + __IO uint32_t SIPSR; //0xB0 + __IO uint32_t SIPDS; //0xB4 + __IO uint32_t RESERVEDB8[6]; //0xB8~0xCC + __IO uint32_t ADCSW_CFG; //0xD0 + __IO uint32_t RESERVEDD4; //0xD4 + __IO uint32_t SDRAM_VREF_EN[3]; //0xD8 + __IO uint32_t SDRAMDSN_CFG[3]; //0xE4 + __IO uint32_t SDRAMDSP_CFG[3]; //0xF0 +}AFIO_Module; + +/*** Low-Power Timer ***/ +typedef struct +{ + __IO uint32_t INTSTS; /* Offset: 0x0000 */ + __IO uint32_t INTCLR; /* Offset: 0x0004 */ + __IO uint32_t INTEN; /* Offset: 0x0008 */ + __IO uint32_t CFG; /* Offset: 0x000C */ + __IO uint32_t CTRL; /* Offset: 0x0010 */ + __IO uint32_t CMP; /* Offset: 0x0014 */ + __IO uint32_t ARR; /* Offset: 0x0018 */ + __IO uint32_t CNT; /* Offset: 0x001C */ + __IO uint32_t OPT; /* Offset: 0x0020 */ +} LPTIM_Module; + +/*** Inter Integrated Circuit Interface ***/ + +typedef struct +{ + __IO uint32_t CTRL1; //0x00 + __IO uint32_t CTRL2; //0x04 + __IO uint32_t ADR1; //0x08 + __IO uint32_t ADR2; //0x0C + __IO uint32_t BUSTIM; //0x10 + __IO uint32_t TMOUTR; //0x14 + __IO uint32_t STSINT; //0x18 + __IO uint32_t INTCLR; //0x1C + __IO uint32_t CRCR; //0x20 + __IO uint32_t RDR; //0x24 + __IO uint32_t WDR; //0x28 + __IO uint32_t HSBUSTM; //0x2C + __IO uint32_t FIFOCSR; //0x30 + __IO uint32_t QCMD; //0x34 + __IO uint32_t GFLTRCTRL; //0x38 +} I2C_Module; + + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KEY; + __IO uint32_t STS; + __IO uint32_t PREDIV; /* IWDG PREDIV */ + __IO uint32_t RELV; +} IWDG_Module; + +/** Power Control **/ +typedef struct +{ + __IO uint32_t M7CTRL1; //0x00 + __IO uint32_t M7CTRLSTS; //0x04 + __IO uint32_t M7CTRL2; //0x08 + __IO uint32_t RES1[5]; //0x0C + __IO uint32_t M4CTRL1; //0x20 + __IO uint32_t M4CTRLSTS; //0x24 + __IO uint32_t M4CTRL2; //0x28 + __IO uint32_t RES2[5]; //0x2C + __IO uint32_t SYSCTRL1; //0x40 + __IO uint32_t SYSCTRLSTS; //0x44 + __IO uint32_t SYSCTRL2; //0x48 + __IO uint32_t SYSCTRL3; //0x4C + __IO uint32_t SYSCTRL4; //0x50 + __IO uint32_t BORCTRL; //0x54 + __IO uint32_t IPMEMCTRL; //0x58 + __IO uint32_t IPMEMCTRLSTS; //0x5C + __IO uint32_t M7MEMLPCTRL; //0x60 + __IO uint32_t M7MEMLPSTS; //0x64 + __IO uint32_t M7TCMPG0; //0x68 + __IO uint32_t M7TCMPG1; //0x6C + __IO uint32_t M7TCMRET1N0; //0x70 + __IO uint32_t M7TCMRET1N1; //0x74 + __IO uint32_t M7TCMRET2N0; //0x78 + __IO uint32_t M7TCMRET2N1; //0x7C + __IO uint32_t M7TCMPRDY0; //0x80 + __IO uint32_t M7TCMPRDY1; //0x84 + __IO uint32_t RES3[2]; //0x88 + __IO uint32_t M4MEMLPCTRL; //0x90 + __IO uint32_t RES4[3]; //0x94 + __IO uint32_t SYSMEMLPCTRL; //0xA0 + __IO uint32_t RES5[3]; //0xA4 + __IO uint32_t SHRTIMCTRL; //0xB0 + __IO uint32_t MDMACTRL; //0xB4 + __IO uint32_t ESCCTRL; //0xB8 + __IO uint32_t RES6[17]; //0xBC + __IO uint32_t EMCRETCTRL1; //0x100 + __IO uint32_t EMCCTRLSTS1; //0x104 + __IO uint32_t EMCRETCTRL2; //0x108 + __IO uint32_t EMCRETSTS2; //0x10C + __IO uint32_t EMCRETCTRL3; //0x110 + __IO uint32_t EMCRETSTS3; //0x114 + __IO uint32_t EMCRETCTRL4; //0x118 + __IO uint32_t EMCRETSTS4; //0x11C + __IO uint32_t EMCBKPCTRL; //0x120 + __IO uint32_t EMCBKPSTS; //0x124 +}PWR_Module; + +/** Real-Time Clock **/ +typedef struct +{ + __IO uint32_t TSH; /* RTC time register, Address offset: 0x00 */ + __IO uint32_t DATE; /* RTC date register, Address offset: 0x04 */ + __IO uint32_t CTRL; /* RTC control register, Address offset: 0x08 */ + __IO uint32_t INITSTS; /* RTC initialization and status register, Address offset: 0x0C */ + __IO uint32_t PRE; /* RTC prescaler register, Address offset: 0x10 */ + __IO uint32_t WKUPT; /* RTC wakeup timer register, Address offset: 0x14 */ + uint32_t reserved18; /* Reserved */ + __IO uint32_t ALARMA; /* RTC alarm A register, Address offset: 0x1C */ + __IO uint32_t ALARMB; /* RTC alarm B register, Address offset: 0x20 */ + __IO uint32_t WRP; /* RTC write protection register, Address offset: 0x24 */ + __IO uint32_t SUBS; /* RTC sub second register, Address offset: 0x28 */ + __IO uint32_t SCTRL; /* RTC shift control register, Address offset: 0x2C */ + __IO uint32_t TST; /* RTC time stamp time register, Address offset: 0x30 */ + __IO uint32_t TSD; /* RTC time stamp date register, Address offset: 0x34 */ + __IO uint32_t TSSS; /* RTC time-stamp sub second register, Address offset: 0x38 */ + __IO uint32_t CALIB; /* RTC calibration register, Address offset: 0x3C */ + uint32_t reserved40; /* Reserved */ + __IO uint32_t ALRMASS; /* RTC alarm A sub second register, Address offset: 0x44 */ + __IO uint32_t ALRMBSS; /* RTC alarm B sub second register, Address offset: 0x48 */ + __IO uint32_t OPT; /* RTC option register, Address offset: 0x4C */ + __IO uint32_t BKP1; /* RTC backup register 1, Address offset: 0x50 */ + __IO uint32_t BKP2; /* RTC backup register 2, Address offset: 0x54 */ + __IO uint32_t BKP3; /* RTC backup register 3, Address offset: 0x58 */ + __IO uint32_t BKP4; /* RTC backup register 4, Address offset: 0x5C */ + __IO uint32_t BKP5; /* RTC backup register 5, Address offset: 0x60 */ + __IO uint32_t BKP6; /* RTC backup register 6, Address offset: 0x64 */ + __IO uint32_t BKP7; /* RTC backup register 7, Address offset: 0x68 */ + __IO uint32_t BKP8; /* RTC backup register 8, Address offset: 0x6C */ + __IO uint32_t BKP9; /* RTC backup register 9, Address offset: 0x70 */ + __IO uint32_t BKP10; /* RTC backup register 10, Address offset: 0x74 */ + __IO uint32_t BKP11; /* RTC backup register 11, Address offset: 0x78 */ + __IO uint32_t BKP12; /* RTC backup register 12, Address offset: 0x7C */ + __IO uint32_t BKP13; /* RTC backup register 13, Address offset: 0x80 */ + __IO uint32_t BKP14; /* RTC backup register 14, Address offset: 0x84 */ + __IO uint32_t BKP15; /* RTC backup register 15, Address offset: 0x88 */ + __IO uint32_t BKP16; /* RTC backup register 16, Address offset: 0x8C */ + __IO uint32_t BKP17; /* RTC backup register 17, Address offset: 0x90 */ + __IO uint32_t BKP18; /* RTC backup register 18, Address offset: 0x94 */ + __IO uint32_t BKP19; /* RTC backup register 19, Address offset: 0x98 */ + __IO uint32_t BKP20; /* RTC backup register 20, Address offset: 0x9C */ + __IO uint32_t BKP21; /* RTC backup register 21, Address offset: 0xA0 */ + __IO uint32_t BKP22; /* RTC backup register 22, Address offset: 0xA4 */ + __IO uint32_t BKP23; /* RTC backup register 23, Address offset: 0xA8 */ + __IO uint32_t BKP24; /* RTC backup register 24, Address offset: 0xAC */ + __IO uint32_t BKP25; /* RTC backup register 25, Address offset: 0xB0 */ + __IO uint32_t BKP26; /* RTC backup register 26, Address offset: 0xB4 */ + __IO uint32_t BKP27; /* RTC backup register 27, Address offset: 0xB8 */ + __IO uint32_t BKP28; /* RTC backup register 28, Address offset: 0xBC */ + __IO uint32_t BKP29; /* RTC backup register 29, Address offset: 0xC0 */ + __IO uint32_t BKP30; /* RTC backup register 30, Address offset: 0xC4 */ + __IO uint32_t BKP31; /* RTC backup register 31, Address offset: 0xC8 */ + __IO uint32_t BKP32; /* RTC backup register 31, Address offset: 0xCC */ + uint32_t reservedD0; /* Reserved */ + __IO uint32_t TMPCFG; /* RTC tamper configuration register, Address offset: 0xD4 */ + __IO uint32_t TMPCTRL[8]; /* RTC tamper configuration register, Address offset: 0xD8~0xF4 */ + +} RTC_Module; + +/** SDMMC Interface **/ + +typedef struct +{ + __IO uint32_t CFG1; //0x00 + __IO uint32_t CFG2; //0x04 + __IO uint32_t CFG3; //0x08 + __IO uint32_t PV0CTRL; //0x0C + __IO uint32_t PV1CTRL; //0x10 + __IO uint32_t PV2CTRL; //0x14 + __IO uint32_t PV3CTRL; //0x18 + uint32_t RESERVED; //0x1C + __IO uint32_t DLYCTRL; //0x20 +}SDMMC_Module; + +/** SD host Interface **/ +typedef struct +{ + __IO uint32_t DSADD; //0x00 + __IO uint32_t BLKCFG; //0x04 + __IO uint32_t CMDARG1; //0x08 + __IO uint32_t TMODE; //0x0C + __IO uint32_t CMDRSP0; //0x10 + __IO uint32_t CMDRSP1; //0x14 + __IO uint32_t CMDRSP2; //0x18 + __IO uint32_t CMDRSP3; //0x1C + __IO uint32_t BUFDAT; //0x20 + __IO uint32_t PRESTS; //0x24 + __IO uint32_t CTRL1; //0x28 + __IO uint32_t CTRL2; //0x2C + __IO uint32_t INTSTS; //0x30 + __IO uint32_t IE; //0x34 + __IO uint32_t ISE; //0x38 + __IO uint32_t CTRLSTS; //0x3C + __IO uint32_t CAP0STS; //0x40 + __IO uint32_t CAP1STS; //0x44 + uint32_t RESERVED0[2]; //0x48 + __IO uint32_t STSFE; //0x50 + __IO uint32_t ADMAESTS; //0x54 + __IO uint32_t ASADD0; //0x58 + __IO uint32_t ASADD1; //0x5C + __IO uint32_t PV0STS; //0x60 + __IO uint32_t PV1STS; //0x64 + __IO uint32_t PV2STS; //0x68 + __IO uint32_t PV3STS; //0x6C + __IO uint32_t BOOTTCTRL; //0x70 +}SDHOST_Module; + + +/*** TIM ***/ + +typedef struct +{ + __IO uint32_t CTRL1; //0x00 + __IO uint32_t CTRL2; //0x04 + __IO uint32_t STS; //0x08 + __IO uint32_t EVTGEN; //0x0C + __IO uint32_t SMCTRL; //0x10 + __IO uint32_t DINTEN; //0x14 + __IO uint32_t CCMOD1; //0x18 + __IO uint32_t CCMOD2; //0x1C + __IO uint32_t CCMOD3; //0x20 + __IO uint32_t CCEN; //0x24 + __IO uint32_t CCDAT1; //0x28 + __IO uint32_t CCDAT2; //0x2C + __IO uint32_t CCDAT3; //0x30 + __IO uint32_t CCDAT4; //0x34 + __IO uint32_t CCDAT5; //0x38 + __IO uint32_t CCDAT6; //0x3C + __IO uint32_t PSC; //0x40 + __IO uint32_t AR; //0x44 + __IO uint32_t CNT; //0x48 + __IO uint32_t REPCNT; //0x4C + __IO uint32_t BKDT; //0x50 + __IO uint32_t CCDAT7; //0x54 + __IO uint32_t CCDAT8; //0x58 + __IO uint32_t CCDAT9; //0x5C + __IO uint32_t BKFR; //0x60 + __IO uint32_t C1FILT; //0x64 + __IO uint32_t C2FILT; //0x68 + __IO uint32_t C3FILT; //0x6C + __IO uint32_t C4FILT; //0x70 + __IO uint32_t FILTO; //0x74 + __IO uint32_t INSEL; //0x78 + __IO uint32_t AF1; //0x7C + __IO uint32_t AF2; //0x80 + __IO uint32_t BKFR2; //0x84 + __IO uint32_t RESERVED0[3]; + __IO uint32_t DCTRL; //0x94 + __IO uint32_t DADDR; //0x98 +} TIM_Module; + + +/** Universal Synchronous Asynchronous Receiver Transmitter **/ + +typedef struct +{ + __IO uint32_t CTRL1; //0x00 + __IO uint32_t CTRL2; //0x04 + __IO uint32_t CTRL3; //0x08 + __IO uint32_t STS; //0x0C + __IO uint32_t DAT; //0x10 + __IO uint32_t BRCF; //0x14 + __IO uint32_t GTP; //0x18 + __IO uint32_t FIFO; //0x1C + __IO uint32_t IFW; //0x20 + __IO uint32_t RTO; //0x24 +} USART_Module; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CFG; /* WWDG Configuration Register Address offset: 0x00 */ + __IO uint32_t CTRL; /* WWDG Control Register Address offset: 0x04 */ + __IO uint32_t STS; /* WWDG Stauts Register Address offset: 0x08 */ +} WWDG_Module; + +/*** xSPI ***/ + +typedef struct +{ + __IO uint32_t CTRL0; /* xSPI Control Register 0, Address offset: 0x00 */ + __IO uint32_t CTRL1; /* xSPI Control Register 1, Address offset: 0x04 */ + __IO uint32_t SSIENR; /* xSPI Enable Register, Address offset: 0x08 */ + __IO uint32_t MW_CTRL; /* xSPI Microwire Control Register, Address offset: 0x0C */ + __IO uint32_t SLAVE_EN; /* xSPI Slave Enable Register, Address offset: 0x10 */ + __IO uint32_t BAUD; /* xSPI Baud Rate Select Register, Address offset: 0x14 */ + __IO uint32_t TXFT; /* xSPI Transmit FIFO Threshold Level, Address offset: 0x18 */ + __IO uint32_t RXFT; /* xSPI Receive FIFO Threshold Level, Address offset: 0x1C */ + __IO uint32_t TXFN; /* xSPI Transmit FIFO Level Register, Address offset: 0x20 */ + __IO uint32_t RXFN; /* xSPI Receive FIFO Level Register, Address offset: 0x24 */ + __IO uint32_t STS; /* xSPI Status Register, Address offset: 0x28 */ + __IO uint32_t IMASK; /* xSPI Interrupt Mask Register, Address offset: 0x2C */ + __IO uint32_t ISTS; /* xSPI Interrupt Status Register, Address offset: 0x30 */ + __IO uint32_t RISTS; /* xSPI Raw Interrupt Status Register, Address offset: 0x34 */ + __IO uint32_t TXEICR_CLR; /* xSPI Transmit FIFO Error Interrupt Clear Registers, Address offset: 0x38 */ + __IO uint32_t RXFOI_CLR; /* xSPI Receive FIFO Overflow Interrupt Clear Register, Address offset: 0x3C */ + __IO uint32_t RXFUI_CLR; /* xSPI Receive FIFO Underflow Interrupt Clear Register, Address offset: 0x40 */ + __IO uint32_t MMCI_CLR; /* xSPI Multi-Master Interrupt Clear Register, Address offset: 0x44 */ + __IO uint32_t ICLR; /* xSPI Interrupt Clear Register, Address offset: 0x48 */ + __IO uint32_t DMA_CTRL; /* xSPI DMA Control Register, Address offset: 0x4C */ + __IO uint32_t DMATDL_CTRL; /* xSPI DMA Transmit Data Level, Address offset: 0x50 */ + __IO uint32_t DMARDL_CTRL; /* xSPI DMA Receive Data Level, Address offset: 0x54 */ + __IO uint32_t IDR; /* xSPI Identification Register, Address offset: 0x58 */ + __IO uint32_t VERSION_ID; /* xSPI component version, Address offset: 0x5C */ + __IO uint32_t DAT0; /* xSPI Data Register 0, Address offset: 0x60 */ + __IO uint32_t DAT1; /* xSPI Data Register 1, Address offset: 0x64 */ + __IO uint32_t DAT2; /* xSPI Data Register 2, Address offset: 0x68 */ + __IO uint32_t DAT3; /* xSPI Data Register 3, Address offset: 0x6C */ + __IO uint32_t DAT4; /* xSPI Data Register 4, Address offset: 0x70 */ + __IO uint32_t DAT5; /* xSPI Data Register 5, Address offset: 0x74 */ + __IO uint32_t DAT6; /* xSPI Data Register 6, Address offset: 0x78 */ + __IO uint32_t DAT7; /* xSPI Data Register 7, Address offset: 0x7C */ + __IO uint32_t DAT8; /* xSPI Data Register 8, Address offset: 0x80 */ + __IO uint32_t DAT9; /* xSPI Data Register 9, Address offset: 0x84 */ + __IO uint32_t DAT10; /* xSPI Data Register 10, Address offset: 0x88 */ + __IO uint32_t DAT11; /* xSPI Data Register 11, Address offset: 0x8C */ + __IO uint32_t DAT12; /* xSPI Data Register 12, Address offset: 0x90 */ + __IO uint32_t DAT13; /* xSPI Data Register 13, Address offset: 0x94 */ + __IO uint32_t DAT14; /* xSPI Data Register 14, Address offset: 0x98 */ + __IO uint32_t DAT15; /* xSPI Data Register 15, Address offset: 0x9C */ + __IO uint32_t DAT16; /* xSPI Data Register 16, Address offset: 0xA0 */ + __IO uint32_t DAT17; /* xSPI Data Register 17, Address offset: 0xA4 */ + __IO uint32_t DAT18; /* xSPI Data Register 18, Address offset: 0xA8 */ + __IO uint32_t DAT19; /* xSPI Data Register 19, Address offset: 0xAC */ + __IO uint32_t DAT20; /* xSPI Data Register 20, Address offset: 0xB0 */ + __IO uint32_t DAT21; /* xSPI Data Register 21, Address offset: 0xB4 */ + __IO uint32_t DAT22; /* xSPI Data Register 22, Address offset: 0xB8 */ + __IO uint32_t DAT23; /* xSPI Data Register 23, Address offset: 0xBC */ + __IO uint32_t DAT24; /* xSPI Data Register 24, Address offset: 0xC0 */ + __IO uint32_t DAT25; /* xSPI Data Register 25, Address offset: 0xC4 */ + __IO uint32_t DAT26; /* xSPI Data Register 26, Address offset: 0xC8 */ + __IO uint32_t DAT27; /* xSPI Data Register 27, Address offset: 0xCC */ + __IO uint32_t DAT28; /* xSPI Data Register 28, Address offset: 0xD0 */ + __IO uint32_t DAT29; /* xSPI Data Register 29, Address offset: 0xD4 */ + __IO uint32_t DAT30; /* xSPI Data Register 30, Address offset: 0xD8 */ + __IO uint32_t DAT31; /* xSPI Data Register 31, Address offset: 0xDC */ + __IO uint32_t DAT32; /* xSPI Data Register 32, Address offset: 0xE0 */ + __IO uint32_t DAT33; /* xSPI Data Register 33, Address offset: 0xE4 */ + __IO uint32_t DAT34; /* xSPI Data Register 34, Address offset: 0xE8 */ + __IO uint32_t DAT35; /* xSPI Data Register 35, Address offset: 0xEC */ + __IO uint32_t RX_DELAY; /* xSPI RX Sample Delay Register, Address offset: 0xF0 */ + __IO uint32_t ENH_CTRL0; /* xSPI Control Register, Address offset: 0xF4 */ + __IO uint32_t DDR_TXDE; /* xSPI Transmit Drive Edge Register, Address offset: 0xF8 */ + __IO uint32_t XIP_MODE; /* xSPI eXecute in Place - Mode bits, Address offset: 0xFC */ + __IO uint32_t XIP_INCR_TOC; /* xSPI XIP INCR transfer opcode, Address offset: 0x100 */ + __IO uint32_t XIP_WRAP_TOC; /* xSPI XIP WRAP transfer opcode, Address offset: 0x104 */ + __IO uint32_t XIP_CTRL; /* xSPI XIP Control Register, Address offset: 0x108 */ + __IO uint32_t XIP_SLAVE_EN; /* xSPI Slave Enable Register, Address offset: 0x10C */ + __IO uint32_t XIP_RXFOI_CLR; /* xSPI XIP Receive FIFO Overflow Interrupt Clear Register, Address offset: 0x110 */ + __IO uint32_t XIP_TOUT; /* xSPI XIP time out register for continuous transfers, Address offset: 0x114 */ + __IO uint32_t RESERVED0[10]; + __IO uint32_t XIP_WRITE_INCR_INST; /* xSPI XIP Write INCR transfer opcode, Address offset: 0x140 */ + __IO uint32_t XIP_WRITE_WRAP_INST; /* xSPI XIP Write WRAP transfer opcode, Address offset: 0x144 */ + __IO uint32_t XIP_WRITE_CTRL; /* xSPI XIP Write Control Register, Address offset: 0x148 */ + __IO uint32_t RESERVED1[13]; + __IO uint32_t XIP_WRITE_TIMING; /* xSPI XIP Write Timing Register, Address offset: 0x180 */ + __IO uint32_t RXDS_DELAY_CTRL; /* xSPI RXDS Delay line control, Address offset: 0x184 */ +} XSPI_Module; + + + +/*** DVP ***/ +typedef struct +{ + __IO uint32_t CTRL; /* DVP control register */ + __IO uint32_t INTEN; /* DVP interrupt enable register */ + __IO uint32_t INTSTS; /* DVP interrupt flag and status register */ + __IO uint32_t PORTCFG; /* DVP control port configuration register */ + __IO uint32_t FIFOCFG; /* DVP control fifo configuration register */ + __IO uint32_t SMADDR1; /* DVP frame 1 start memory address register */ + __IO uint32_t SMADDR2; /* DVP frame 2 start memory address register */ + __IO uint32_t FBS; /* DVP frame buffer size register */ + __IO uint32_t FPBC1; /* DVP frame 1 PIXEL byte count register */ + __IO uint32_t FPBC2; /* DVP frame 2 PIXEL byte count register */ + __IO uint32_t CSXY; /* DVP crop start XY register */ + __IO uint32_t CEXY; /* DVP crop end XY register */ + __IO uint32_t EMSC; /* DVP embedded sync code marker register */ + __IO uint32_t EMSCM; /* DVP embedded sync code mask register */ +} DVP_Module; + +/** FMAC **/ +typedef struct +{ + __IO uint32_t X1BUFCFG; //0x00 + __IO uint32_t X2BUFCFG; //0x04 + __IO uint32_t YBUFCFG; //0x08 + __IO uint32_t PARAMCFG; //0x0C + __IO uint32_t CTRL; //0x10 + __IO uint32_t STS; //0x14 + __IO uint32_t WDAT; //0x18 + __IO uint32_t RDAT; //0x1C +} FMAC_Module; + + +/** CORDIC **/ +typedef struct +{ + __IO uint32_t CTRLSTS; //0x00 + __IO uint32_t WDAT; //0x04 + __IO uint32_t RDAT; //0x08 +} CORDIC_Module; + +/** DSMU module registers **/ +typedef struct +{ + __IO uint32_t FLTCTRL1; //0x00 + __IO uint32_t FLTCTRL2; //0x04 + __IO uint32_t FLTSTS; //0x08 + __IO uint32_t FLTINTCLR; //0x0C + __IO uint32_t FLTJCHG; //0x10 + __IO uint32_t FLTFCTRL; //0x14 + __IO uint32_t FLTJDATA; //0x18 + __IO uint32_t FLTRDATA; //0x1C + __IO uint32_t FLTAWDHT; //0x20 + __IO uint32_t FLTAWDLT; //0x24 + __IO uint32_t FLTAWDSTS; //0x28 + __IO uint32_t FLTAWDCLR; //0x2C + __IO uint32_t FLTEXDETMAX; //0x30 + __IO uint32_t FLTEXDETMIN; //0x34 + __IO uint32_t FLTCOVTIM; //0x38 +} DSMU_Filter_Submodule; + +/** DSMU channel configuration registers **/ +typedef struct +{ + __IO uint32_t CHCFG1; //0x00 + __IO uint32_t CHCFG2; //0x04 + __IO uint32_t CHAWDSCDET; //0x08 + __IO uint32_t CHAWDDAT; //0x0C + __IO uint32_t CHDATIN; //0x10 +} DSMU_Channel_Submodule; + + +typedef struct +{ + __IO uint32_t MCTRL; /* SHRTIM configuration register for master timer, address offset: 0x00 */ + __IO uint32_t MINTSTS; /* SHRTIM status register for master timer interrupt, address offset: 0x04 */ + __IO uint32_t MINTCLR; /* SHRTIM master timer interrupt clear register, address offset: 0x08 */ + __IO uint32_t MIDEN; /* SHRTIM master timer interrupt and DMA request enable register, address offset: 0x0C */ + __IO uint32_t MCNT; /* SHRTIM master timer counter register, address offset: 0x10 */ + __IO uint32_t MPRD; /* SHRTIM master timer period register, address offset: 0x14 */ + __IO uint32_t MREPT; /* SHRTIM master timer repetition register, address offset: 0x18 */ + __IO uint32_t MCMP1DAT; /* SHRTIM master timer compare 1 register, address offset: 0x1C */ + uint32_t RESERVED0;/* Reserved, address offset: 0x20 */ + __IO uint32_t MCMP2DAT; /* SHRTIM master timer compare 2 register, address offset: 0x24 */ + __IO uint32_t MCMP3DAT; /* SHRTIM master timer compare 3 register, address offset: 0x28 */ + __IO uint32_t MCMP4DAT; /* SHRTIM master timer compare 4 register, address offset: 0x2C */ + __IO uint32_t SYNCOUT; /* SHRTIM SYNCOUT configure register, address offset: 0x30 */ + __IO uint32_t FRZDIS; /* SHRTIM Timer behavior during CPU freeze, address offset: 0x34 */ + uint32_t RESERVED1[18]; /* Reserved, 0x30..0x7C */ +}SHRTIM_Master_Submodule; + +/* SHRTIM Timer A to F registers definition */ +typedef struct +{ + __IO uint32_t TxCTRL; /* SHRTIM timer x control register, address offset: 0x00 */ + __IO uint32_t TxINTSTS; /* SHRTIM timer x interrupt status register, address offset: 0x04 */ + __IO uint32_t TxINTCLR; /* SHRTIM timer x interrupt clear register, address offset: 0x08 */ + __IO uint32_t TxIDEN; /* SHRTIM timer x interrupt DMA enable register, address offset: 0x0C */ + __IO uint32_t TxCNT; /* SHRTIM timer x counter register, address offset: 0x10 */ + __IO uint32_t TxPRD; /* SHRTIM timer x period register, address offset: 0x14 */ + __IO uint32_t TxREPT; /* SHRTIM timer x repetition register, address offset: 0x18 */ + __IO uint32_t TxCMP1DAT; /* SHRTIM timer x compare 1 register, address offset: 0x1C */ + __IO uint32_t TxRCMP1DAT; /* SHRTIM timer x compare 1 repetition alias register, address offset: 0x20 */ + __IO uint32_t TxCMP2DAT; /* SHRTIM timer x compare 2 register, address offset: 0x24 */ + __IO uint32_t TxCMP3DAT; /* SHRTIM timer x compare 3 register, address offset: 0x28 */ + __IO uint32_t TxCMP4DAT; /* SHRTIM timer x compare 4 register, address offset: 0x2C */ + __IO uint32_t TxCPT1; /* SHRTIM timer x compare 1 register, address offset: 0x30 */ + __IO uint32_t TxCPT2; /* SHRTIM timer x compare 2 register, address offset: 0x34 */ + __IO uint32_t TxDT; /* SHRTIM timer x deadtime register, address offset: 0x38 */ + __IO uint32_t TxSET1; /* SHRTIM timer x set register 1, address offset: 0x3C */ + __IO uint32_t TxRST1; /* SHRTIM timer x reset register 1, address offset: 0x40 */ + __IO uint32_t TxSET2; /* SHRTIM timer x set register 2, address offset: 0x44 */ + __IO uint32_t TxRST2; /* SHRTIM timer x reset register 2, address offset: 0x48 */ + __IO uint32_t TxEXEVFLT1; /* SHRTIM timer x external event filtering register 1, address offset: 0x4C */ + __IO uint32_t TxEXEVFLT2; /* SHRTIM timer x external event filtering register 1, address offset: 0x50 */ + __IO uint32_t TxCNTRST; /* SHRTIM timer x reset, address offset: 0x54 */ + __IO uint32_t TxCHOP; /* SHRTIM timer x chopper register, address offset: 0x58 */ + __IO uint32_t TxCPT1CTRL; /* SHRTIM timer x capture 1 control register, address offset: 0x5C */ + __IO uint32_t TxCPT2CTRL; /* SHRTIM timer x capture 2 control register, address offset: 0x60 */ + __IO uint32_t TxOUT; /* SHRTIM timer x output register, address offset: 0x64 */ + __IO uint32_t TxFALT; /* SHRTIM timer x fault register, address offset: 0x68 */ + __IO uint32_t TxCTRL2; /* SHRTIM timer x control register 2, address offset: 0x6C */ + __IO uint32_t TxEXEVFLT3; /* SHRTIM timer x external event filter register 3, address offset: 0x70 */ + __IO uint32_t TxCMP5DAT; /* SHRTIM timer x compare 5 register, address offset: 0x74 */ + uint32_t RESERVED0[2]; /* Reserved, address offset:0x78...0x7c */ +}SHRTIM_Timerx_Submodule; + + +/* SHRTIM common register definition */ +typedef struct +{ + __IO uint32_t CTRL1; /* SHRTIM control register 1, address offset: 0x00 */ + __IO uint32_t CTRL2; /* SHRTIM control register 2, address offset: 0x04 */ + __IO uint32_t INTSTS; /* SHRTIM interrupt status register, address offset: 0x08 */ + __IO uint32_t INTCLR; /* SHRTIM interrupt clear register, address offset: 0x0C */ + __IO uint32_t INTEN; /* SHRTIM interrupt enable register, address offset: 0x10 */ + __IO uint32_t OEN; /* SHRTIM output channel enable register, address offset: 0x14 */ + __IO uint32_t ODIS; /* SHRTIM output channel disable register, address offset: 0x18 */ + __IO uint32_t ODISSTS; /* SHRTIM output channel disable status register, address offset: 0x1C */ + __IO uint32_t BMCTRL; /* SHRTIM burst mode control register, address offset: 0x20 */ + __IO uint32_t BMTG; /* SHRTIM burst mode trigger register, address offset: 0x24 */ + __IO uint32_t BMCMP; /* SHRTIM burst mode compare register, address offset: 0x28 */ + __IO uint32_t BMPRD; /* SHRTIM burst mode period register, address offset: 0x2C */ + __IO uint32_t EXEVCTRL1; /* SHRTIM external event control register 1, address offset: 0x30 */ + __IO uint32_t EXEVCTRL2; /* SHRTIM external event control register 2, address offset: 0x34 */ + __IO uint32_t EXEVCTRL3; /* SHRTIM external event control register 4, address offset: 0x38 */ + __IO uint32_t EXEVCTRL4; /* SHRTIM external event control register 3, address offset: 0x3C */ + __IO uint32_t ADTG1SRC1; /* SHRTIM ADC trigger 1's source group1 register, address offset: 0x40 */ + __IO uint32_t ADTG1SRC2; /* SHRTIM ADC trigger 1's source group2 register, address offset: 0x44 */ + __IO uint32_t ADTG2SRC1; /* SHRTIM ADC trigger 2's source group1 register, address offset: 0x48 */ + __IO uint32_t ADTG2SRC2; /* SHRTIM ADC trigger 2's source group2 register, address offset: 0x4C */ + __IO uint32_t ADTG3SRC1; /* SHRTIM ADC trigger 3's source group1 register, address offset: 0x50 */ + __IO uint32_t ADTG3SRC2; /* SHRTIM ADC trigger 3's source group2 register, address offset: 0x54 */ + __IO uint32_t ADTG4SRC1; /* SHRTIM ADC trigger 4's source group1 register, address offset: 0x58 */ + __IO uint32_t ADTG4SRC2; /* SHRTIM ADC trigger 4's source group2 register, address offset: 0x5C */ + __IO uint32_t FALTIN1; /* SHRTIM fault input register 1, address offset: 0x60 */ + __IO uint32_t FALTIN2; /* SHRTIM fault input register 2, address offset: 0x64 */ + __IO uint32_t FALTIN3; /* SHRTIM fault input register 3, address offset: 0x68 */ + __IO uint32_t FALTIN4; /* SHRTIM fault input register 4, address offset: 0x6C */ + __IO uint32_t BDMTUPD; /* SHRTIM burst DMA master timer update register, address offset: 0x70 */ + __IO uint32_t BDTAUPD; /* SHRTIM burst DMA timer A update register, address offset: 0x74 */ + __IO uint32_t BDTBUPD; /* SHRTIM burst DMA timer B update register, address offset: 0x78 */ + __IO uint32_t BDTCUPD; /* SHRTIM burst DMA timer C update register, address offset: 0x7C */ + __IO uint32_t BDTDUPD; /* SHRTIM burst DMA timer D update register, address offset: 0x80 */ + __IO uint32_t BDTEUPD; /* SHRTIM burst DMA timer E update register, address offset: 0x84 */ + __IO uint32_t BDTFUPD; /* SHRTIM burst DMA timer F update register, address offset: 0x88 */ + __IO uint32_t BDDAT; /* SHRTIM burst DMA data register, address offset: 0x8C */ + __IO uint32_t ADTRGEX1; /* SHRTIM ADC extended trigger register 1, address offset: 0x90 */ + __IO uint32_t ADTRGEX2; /* SHRTIM ADC extended trigger register 2, address offset: 0x94 */ + __IO uint32_t ADTRGUPD; /* SHRTIM ADC trigger update register, address offset: 0x98 */ + __IO uint32_t ADCPSC1; /* SHRTIM ADC post scaler register 1, address offset: 0x9C */ + __IO uint32_t ADCPSC2; /* SHRTIM ADC post scaler register 2, address offset: 0xA0 */ + uint32_t RESERVED0; /* address offset: 0xA4 */ + __IO uint32_t SFTFALT; /* SHRTIM soft fault trigger register, address offset: 0xA8 */ + __IO uint32_t SFTDP; /* SHRTIM soft delayed protection trigger register, address offset: 0xAC */ + __IO uint32_t FALTIN5; /* SHRTIM fault input register 5, address offset: 0xB0 */ + __IO uint32_t EXEVCTRL5; /* SHRTIM external event control register 5, address offset: 0xB4 */ + __IO uint32_t EXTEND; /* SHRTIM extend register: 0xB8 */ +}SHRTIM_Common_Submodule; + +/* SHRTIM register definition */ +typedef struct { + SHRTIM_Master_Submodule sMasterRegs; + SHRTIM_Timerx_Submodule sTimerxRegs[6]; + SHRTIM_Common_Submodule sCommonRegs; +}SHRTIM_Module; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint16_t CTRL1; /* SPI Control Register 1, Address offset: 0x00 */ + uint16_t RESERVED0; + __IO uint16_t CTRL2; /* SPI Control Register 2, Address offset: 0x04 */ + uint16_t RESERVED1; + __IO uint16_t STS; /* SPI Status Register, Address offset: 0x08 */ + uint16_t RESERVED2; + __IO uint16_t DAT; /* SPI Data Register, Address offset: 0x0C */ + uint16_t RESERVED3; + __IO uint16_t CRCTDAT; /* SPI Transmit CRC Register, Address offset: 0x10 */ + uint16_t RESERVED4; + __IO uint16_t CRCRDAT; /* SPI Receive CRC Register, Address offset: 0x14 */ + uint16_t RESERVED5; + __IO uint16_t CRCPOLY; /* SPI CRC Polynomial Register, Address offset: 0x18 */ + uint16_t RESERVED6; + __IO uint16_t SPI_I2S_CFGR; /* SPI_I2S Configuration Register, Address offset: 0x1C */ + uint16_t RESERVED7; + __IO uint16_t I2SPREDIV; /* SPI_I2S Prescaler Register, Address offset: 0x20 */ + uint16_t RESERVED8; + __IO uint16_t RX_FIFO; /* SPI Receive FIFO, Address offset: 0x24 */ + uint16_t RESERVED9; + __IO uint16_t FIFONUM; /* SPI FIFO Configuration register, Address offset: 0x28 */ + uint16_t RESERVED10; + uint16_t RESERVED11; /* SPI FIFO Configuration register, Address offset: 0x2C */ + uint16_t RESERVED12; + __IO uint16_t FIFOCNT; /* SPI FIFO Count Register, Address offset: 0x30 */ + uint16_t RESERVED13; + __IO uint16_t TRANSNUM; /* SPI Transfer Number Configuration Register, Address offset: 0x34 */ + uint16_t RESERVED14; + __IO uint16_t CR3; /* SPI RX Sample Delay Register, Address offset: 0x38 */ +} SPI_Module; + +/** + * @brief I2S + */ +typedef struct +{ + __IO uint16_t CR1; + uint16_t RESERVED0; + __IO uint16_t CR2; + uint16_t RESERVED1; + __IO uint16_t SR; + uint16_t RESERVED2; + __IO uint16_t DR; + uint16_t RESERVED3; + __IO uint16_t TXCRCR; + uint16_t RESERVED4; + __IO uint16_t RXCRCR; + uint16_t RESERVED5; + __IO uint16_t CRCPR; + uint16_t RESERVED6; + __IO uint16_t I2SCFGR; + uint16_t RESERVED7; + __IO uint16_t I2SPR; + uint16_t RESERVED8; + __IO uint16_t RXFIFO; + uint16_t RESERVED9; + __IO uint16_t FIFONUM; + uint16_t RESERVED10; + uint32_t RESERVED11; + __IO uint16_t FIFOCNT; + uint16_t RESERVED12; + __IO uint32_t TRANSNUM; +} I2S_Module; + + +typedef struct +{ + uint32_t RESERVED0; + __IO uint16_t I2S_CTRL2; /* I2S_EXT Control Register, Address offset: 0x04 */ + uint16_t RESERVED1; + __IO uint16_t I2S_STS; /* I2S_EXT Status Register, Address offset: 0x08 */ + uint16_t RESERVED2; + __IO uint16_t I2S_DAT; /* I2S_EXT Data Register, Address offset: 0x0C */ + uint16_t RESERVED3; + uint32_t RESERVED4; + uint32_t RESERVED5; + uint32_t RESERVED6; + __IO uint16_t I2S_CFGR; /* I2S_EXT Configuration Register Address offset: 0x1C */ + uint16_t RESERVED17; + +}I2S_EXT_Module; + + + + +typedef struct +{ + __IO uint32_t STS; //0x00 + __IO uint32_t INTEN; //0x04 + __IO uint32_t CTRL; //0x08 + __IO uint32_t BRCFG1; //0x0C + __IO uint32_t TXDAT; //0x10 + __IO uint32_t BRCFG2; //0x14 + __IO uint32_t WUDAT1; //0x18 + __IO uint32_t WUDAT2; //0x1C + __IO uint32_t RXDAT; //0x20 +}LPUART_Module; + +typedef struct +{ + __IO uint32_t CTRL1; //0x00 + __IO uint32_t CTRL2; //0x04 + __IO uint32_t EINJ; //0x08 + __IO uint32_t INTFS; //0x0C + __IO uint32_t INTF1; //0x10 + __IO uint32_t FEADR1; //0x14 + __IO uint32_t FEDATL1; //0x18 + __IO uint32_t FEDATH1; //0x1C + __IO uint32_t FECOD1; //0x20 + __IO uint32_t INTF2; //0x24 + __IO uint32_t FEADR2; //0x28 + __IO uint32_t FEDATL2; //0x2C + __IO uint32_t FEDATH2; //0x30 + __IO uint32_t FECOD2; //0x34 + __IO uint32_t INTF3; //0x38 + __IO uint32_t FEADR3; //0x3C + __IO uint32_t FEDATL3; //0x40 + __IO uint32_t FEDATH3; //0x44 + __IO uint32_t FECOD3; //0x48 + __IO uint32_t INTF4; //0x4C + __IO uint32_t FEADR4; //0x50 + __IO uint32_t FEDATL4; //0x54 + __IO uint32_t FEDATH4; //0x58 + __IO uint32_t FECOD4; //0x5C + __IO uint32_t INTF5; //0x60 + __IO uint32_t FEADR5; //0x64 + __IO uint32_t FEDATL5; //0x68 + __IO uint32_t FEDATH5; //0x6C + __IO uint32_t FECOD5; //0x70 + __IO uint32_t INTF6; //0x74 + __IO uint32_t FEADR6; //0x78 + __IO uint32_t FEDATL6; //0x7C + __IO uint32_t FEDATH6; //0x80 + __IO uint32_t FECOD6; //0x84 +}ECCMON_TypeDef; + +typedef struct +{ + __IO uint32_t CTRL; //0x00 + __IO uint32_t STS; //0x04 + __IO uint32_t KEY; //0x08 + __IO uint32_t USC; //0x0C + __IO uint32_t ADDR; //0x10 + __IO uint32_t RDATA; //0x14 + __IO uint32_t WDATA; //0x18 + __IO uint32_t RESERVED0; //0x1c + __IO uint32_t SECJVLD; //0x20 + __IO uint32_t RESERVED1; //0x24 + __IO uint32_t SECMDVLD; //0x28 + __IO uint32_t RESERVED2; //0x2c + __IO uint32_t RDP2PVLD; //0x30 + __IO uint32_t RESERVED3; //0x34 + __IO uint32_t BTMVLD; //0x38 + __IO uint32_t BORVLD; //0x3c + __IO uint32_t IWDGVLD; //0x40 + __IO uint32_t TCMSZVLD; //0x44 + __IO uint32_t RESERVED4[2]; //0x48 + __IO uint32_t JTAGKVLD; //0x50 + __IO uint32_t REKU1VLD; //0x54 + __IO uint32_t REKU2VLD; //0x58 + __IO uint32_t REKU3VLD; //0x5c + __IO uint32_t REKU4VLD; //0x60 + __IO uint32_t IDKU1VLD; //0x64 + __IO uint32_t IDKU2VLD; //0x68 + __IO uint32_t IDKU3VLD; //0x6c + __IO uint32_t IDKU4VLD; //0x70 + __IO uint32_t UMUU0; //0x74 + __IO uint32_t UMUU1; //0x78 + __IO uint32_t UMUU2; //0x7c + __IO uint32_t UMUU3; //0x80 + __IO uint32_t UMUU4; //0x84 + __IO uint32_t UMUU5; //0x88 + __IO uint32_t UMUU6; //0x8c + __IO uint32_t UMUU7; //0x90 + __IO uint32_t RESERVED5[9]; //0x94 + __IO uint32_t CRLD1; //0xb8 + __IO uint32_t CRLD2; //0xbc +}OTPC_Module; + +typedef struct +{ + __IO uint32_t CTRL; //0x00 + __IO uint32_t STS; //0x04 + __IO uint32_t RESERVED0[11];//0x08 + __IO uint32_t RTADC1; //0x34 + __IO uint32_t RTADC2; //0x38 + __IO uint32_t RTADC3; //0x3C + __IO uint32_t RTADC4; //0x40 + __IO uint32_t RTK1P0; //0x44 + __IO uint32_t RTK1P1; //0x48 + __IO uint32_t RTK1P2; //0x4C + __IO uint32_t RTK1P3; //0x50 + __IO uint32_t RTK2P0; //0x54 + __IO uint32_t RTK2P1; //0x58 + __IO uint32_t RTK2P2; //0x5c + __IO uint32_t RTK2P3; //0x60 + __IO uint32_t RTK3P0; //0x64 + __IO uint32_t RTK3P1; //0x68 + __IO uint32_t RTK3P2; //0x6c + __IO uint32_t RTK3P3; //0x70 + __IO uint32_t RTK4P0; //0x74 + __IO uint32_t RTK4P1; //0x78 + __IO uint32_t RTK4P2; //0x7c + __IO uint32_t RTK4P3; //0x80 + __IO uint32_t RTR1; //0x84 + __IO uint32_t RTR2; //0x88 + __IO uint32_t RTR3; //0x8c + __IO uint32_t RTR4; //0x90 + __IO uint32_t RESERVED1[9]; //0x94 + __IO uint32_t RTCRC; //0xb8 + __IO uint32_t RESERVED2[28];//0xbc + __IO uint32_t ETH1ME; //0x12c + __IO uint32_t ETH2ME; //0x130 + __IO uint32_t USB1ME; //0x134 + __IO uint32_t USB2ME; //0x138 + __IO uint32_t SD1ME; //0x13c + __IO uint32_t SD2ME; //0x140 + __IO uint32_t DVP1ME; //0x144 + __IO uint32_t DVP2ME; //0x148 + __IO uint32_t DMA1ME; //0x14c + __IO uint32_t DMA2ME; //0x150 + __IO uint32_t DMA3ME; //0x154 + __IO uint32_t MDMAME; //0x158 + __IO uint32_t JPEGME; //0x15c + __IO uint32_t LCDME; //0x160 + __IO uint32_t GPUME; //0x164 + __IO uint32_t SDPUME; //0x168 + __IO uint32_t RESERVED3; //0x16c + __IO uint32_t XRD; //0x170 + __IO uint32_t RESERVED4; //0x174 + __IO uint32_t XRAD; //0x178 + __IO uint32_t X1WD; //0x17c + __IO uint32_t X1RD; //0x180 + __IO uint32_t X1WAD; //0x184 + __IO uint32_t X1RAD; //0x188 + __IO uint32_t X2WD; //0x18c + __IO uint32_t X2RD; //0x190 + __IO uint32_t X2WAD; //0x194 + __IO uint32_t X2RAD; //0x198 + __IO uint32_t X3WD; //0x19c + __IO uint32_t X3RD; //0x1A0 + __IO uint32_t X3WAD; //0x1A4 + __IO uint32_t X3RAD; //0x1A8 + __IO uint32_t RESERVED5[25];//0x1AC + __IO uint32_t H1WD; //0x210 + __IO uint32_t H1RD; //0x214 + __IO uint32_t H1WAD; //0x218 + __IO uint32_t H1RAD; //0x21c + __IO uint32_t H2WD; //0x220 + __IO uint32_t H2RD; //0x224 + __IO uint32_t H2WAD; //0x228 + __IO uint32_t H2RAD; //0x22c + __IO uint32_t H3WD; //0x230 + __IO uint32_t H3RD; //0x234 + __IO uint32_t H3WAD; //0x238 + __IO uint32_t H3RAD; //0x23c + __IO uint32_t H4WD; //0x240 + __IO uint32_t H4RD; //0x244 + __IO uint32_t H4WAD; //0x248 + __IO uint32_t H4RAD; //0x24c + __IO uint32_t H5WD; //0x250 + __IO uint32_t H5RD; //0x254 + __IO uint32_t H5WAD; //0x258 + __IO uint32_t H5RAD; //0x25c + __IO uint32_t BKWD; //0x260 + __IO uint32_t BKRD; //0x264 + __IO uint32_t BKWAD; //0x268 + __IO uint32_t BKRAD; //0x26c + __IO uint32_t ITWD; //0x270 + __IO uint32_t ITRD; //0x274 + __IO uint32_t ITWAD; //0x278 + __IO uint32_t ITRAD; //0x27c +}MMU_Module; + +typedef struct +{ + uint32_t RESERVED0[32]; + __IO uint32_t BADD1; // 0x80 + __IO uint32_t ADDMASK1; // 0x84 + __IO uint32_t BADD2; // 0x88 + __IO uint32_t ADDMASK2; // 0x8C + uint32_t RESERVED1[4]; + __IO uint32_t CFG1; // 0xA0 + __IO uint32_t CFG2; // 0xA4 + uint32_t RESERVED2[2]; + __IO uint32_t RAT; // 0xB0 + __IO uint32_t RCT; // 0xB4 + __IO uint32_t RRDLY; // 0xB8 + __IO uint32_t PT; // 0xBC + __IO uint32_t WRT; // 0xC0 + __IO uint32_t RFCT; // 0xC4 + __IO uint32_t RCDLY; // 0xC8 + __IO uint32_t RI; // 0xCC + uint32_t RESERVED3[4]; + __IO uint32_t CBO; // 0xE0 + __IO uint32_t OR; // 0xE4 + __IO uint32_t OS; // 0xE8 + uint32_t RESERVED4[1]; + __IO uint32_t IINFO; // 0xF0 + uint32_t RESERVED5[3]; + __IO uint32_t WP; // 0x100 +} SDRAM_Module; + +/** +* @brief AFEC +*/ +typedef struct +{ + __IO uint32_t TRIMR0; + __IO uint32_t TRIMR1; + __IO uint32_t TRIMR2; + __IO uint32_t TRIMR3; + __IO uint32_t TRIMR4; + __IO uint32_t TRIMR5; + __IO uint32_t TRIMR6; + __IO uint32_t TRIMR7; + __IO uint32_t TRIMR8; + __IO uint32_t TRIMR9; + __IO uint32_t TRIMR10; + __IO uint32_t TRIMR11; + __IO uint32_t TRIMR12; + __IO uint32_t TESTR0; + __IO uint32_t TESTR1; + __IO uint32_t TESTR2; + __IO uint32_t TESTR3; + __IO uint32_t TESTR4; + __IO uint32_t TESTR5; + __IO uint32_t TESTR6; + __IO uint32_t TESTR7; + __IO uint32_t TESTR8; + __IO uint32_t TESTR9; + __IO uint32_t TESTR10; + __IO uint32_t TESTR11; + __IO uint32_t TESTR12; + __IO uint32_t TESTR13; + __IO uint32_t TESTR14; + __IO uint32_t TESTR15; + __IO uint32_t TESTR16; + __IO uint32_t TESTR17; + __IO uint32_t TESTR18; + __IO uint32_t TESTR19; + __IO uint32_t TESTR20; + __IO uint32_t TESTR21; + __IO uint32_t TESTR22; + __IO uint32_t TESTR23; + __IO uint32_t TESTR24; + __IO uint32_t TESTR25; + __IO uint32_t TESTR26; + __IO uint32_t TESTR27; + __IO uint32_t TESTR28; + __IO uint32_t TESTR29; + __IO uint32_t TESTR30; + __IO uint32_t TESTR31; + __IO uint32_t TESTR32; + __IO uint32_t TESTR33; + __IO uint32_t TESTR34; + __IO uint32_t TESTR35; + __IO uint32_t TESTR36; + __IO uint32_t TESTR37; + __IO uint32_t TESTR38; + __IO uint32_t TESTR39; + __IO uint32_t TESTR40; + __IO uint32_t TESTR41; + __IO uint32_t TESTR42; + __IO uint32_t TESTR43; + __IO uint32_t TESTR44; + __IO uint32_t TRIMR13; + __IO uint32_t TRIMR14; + __IO uint32_t TESTR45; +} AFEC_TypeDef; + +#define FLASH_BASE ((uint32_t)0x15000000UL) /*!< FLASH base address in the alias region */ +#define SRAM_BASE ((uint32_t)0x24000000UL) /*!< AXI SRAM base address in the alias region */ +#define DTCM_BASE ((uint32_t)0x20000000UL) /*!< DTCM base address in the alias region */ +#define ITCM_BASE ((uint32_t)0x00000000UL) /*!< ITCM base address in the alias region */ +#define AHBSRAM_BASE ((uint32_t)0x30000000UL) /*!< AHB SRAM base address in the alias region */ +#define PERIPH_BASE ((uint32_t)0x40000000UL) /*!< Peripheral base address in the alias region */ + +#define SRAM_BB_BASE ((uint32_t)0x22000000) /*!< SRAM base address in the bit-band region */ +#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ + +#define UCID_BASE ((uint32_t)0x1FFFC238U) /* UCID Address : 0x1FFF_F238 */ +#define UCID_LENGTH ((uint32_t)0x10U) /* UCID Length : 16Bytes */ +// #define UID_BASE ((uint32_t)0x1FFFC760U) /* UID Address : 0x1FFF_C760 */ +// #define UID_LENGTH ((uint32_t)0x0CU) /* UID Length : 12Bytes */ +#define DBGMCU_ID_BASE ((uint32_t)0x1FFFF248U) /* DBGMCU_ID Address: 0x1FFF_F248 */ +#define DBGMCU_ID_LENGTH ((uint32_t)0x04U) /* DBGMCU_ID Length : 4 Bytes */ + + /*!< Peripheral memory map */ +#define APB1PERIPH_BASE (PERIPH_BASE) +#define AHB1PERIPH_BASE (PERIPH_BASE + 0x40000) +#define AHB9PERIPH_BASE (PERIPH_BASE + 0xB0000) +#define APB2PERIPH_BASE (PERIPH_BASE + 0xD0000) +#define AHB2PERIPH_BASE (PERIPH_BASE + 0xF0000) +#define APB6PERIPH_BASE (PERIPH_BASE + 0x10000000) +#define AHB6PERIPH_BASE (PERIPH_BASE + 0x11000000) +#define APB5PERIPH_BASE (PERIPH_BASE + 0x18000000) +#define AHB5PERIPH_BASE (PERIPH_BASE + 0x18030000) + + /* APB1 */ +#define BTIM4_BASE (APB1PERIPH_BASE + 0x10C00) +#define BTIM3_BASE (APB1PERIPH_BASE + 0x10800) +#define WWDG2_BASE (APB1PERIPH_BASE + 0x10000) +#define DAC12_BASE (APB1PERIPH_BASE + 0xFC00) +#define I2S4EXT_BASE (APB1PERIPH_BASE + 0xFA00) +#define I2S3EXT_BASE (APB1PERIPH_BASE + 0xF600) +#define I2S4_BASE (APB1PERIPH_BASE + 0xF800) +#define I2S3_BASE (APB1PERIPH_BASE + 0xF400) +#define I2C3_BASE (APB1PERIPH_BASE + 0xF000) +#define I2C2_BASE (APB1PERIPH_BASE + 0xEC00) +#define I2C1_BASE (APB1PERIPH_BASE + 0xE800) +#define SPI3_BASE (APB1PERIPH_BASE + 0xE400) +#define UART12_BASE (APB1PERIPH_BASE + 0xE000) +#define UART11_BASE (APB1PERIPH_BASE + 0xDC00) +#define UART10_BASE (APB1PERIPH_BASE + 0xD800) +#define UART9_BASE (APB1PERIPH_BASE + 0xD400) +#define USART4_BASE (APB1PERIPH_BASE + 0xD000) +#define USART3_BASE (APB1PERIPH_BASE + 0xCC00) +#define USART2_BASE (APB1PERIPH_BASE + 0xC800) +#define USART1_BASE (APB1PERIPH_BASE + 0xC400) +#define GTIMA7_BASE (APB1PERIPH_BASE + 0xC000) +#define GTIMA6_BASE (APB1PERIPH_BASE + 0xBC00) +#define GTIMA5_BASE (APB1PERIPH_BASE + 0xB800) +#define GTIMA4_BASE (APB1PERIPH_BASE + 0xB400) +#define GTIMB1_BASE (APB1PERIPH_BASE + 0xA800) +#define GTIMB2_BASE (APB1PERIPH_BASE + 0xAC00) +#define GTIMB3_BASE (APB1PERIPH_BASE + 0xB000) +#define BTIM2_BASE (APB1PERIPH_BASE + 0xA400) +#define BTIM1_BASE (APB1PERIPH_BASE + 0xA000) +#define AHBdCache_BASE (APB1PERIPH_BASE + 0x9000) +#define AHBiCache_BASE (APB1PERIPH_BASE + 0x8000) +#define FDCAN6_BASE (APB1PERIPH_BASE + 0xC00) +#define FDCAN5_BASE (APB1PERIPH_BASE + 0x800) +#define FDCAN2_BASE (APB1PERIPH_BASE + 0x400) +#define FDCAN1_BASE (APB1PERIPH_BASE) + + + /* APB2 */ +#define UART15_BASE (APB2PERIPH_BASE + 0xF800) +#define UART14_BASE (APB2PERIPH_BASE + 0xF400) +#define UART13_BASE (APB2PERIPH_BASE + 0xF000) +#define USART8_BASE (APB2PERIPH_BASE + 0xEC00) +#define USART7_BASE (APB2PERIPH_BASE + 0xE800) +#define USART6_BASE (APB2PERIPH_BASE + 0xE400) +#define USART5_BASE (APB2PERIPH_BASE + 0xE000) +#define I2C6_BASE (APB2PERIPH_BASE + 0xDC00) +#define I2C5_BASE (APB2PERIPH_BASE + 0xD800) +#define I2C4_BASE (APB2PERIPH_BASE + 0xD400) +#define GTIMA3_BASE (APB2PERIPH_BASE + 0xD000) +#define GTIMA2_BASE (APB2PERIPH_BASE + 0xCC00) +#define GTIMA1_BASE (APB2PERIPH_BASE + 0xC800) +#define SPI2_BASE (APB2PERIPH_BASE + 0xC400) +#define SPI1_BASE (APB2PERIPH_BASE + 0xC000) +#define I2S2_BASE (APB2PERIPH_BASE + 0xBC00) +#define I2S1_BASE (APB2PERIPH_BASE + 0xB800) +#define I2S2EXT_BASE (APB2PERIPH_BASE + 0xBE00) +#define I2S1EXT_BASE (APB2PERIPH_BASE + 0xBA00) + +#define ATIM2_BASE (APB2PERIPH_BASE + 0xB400) +#define ATIM1_BASE (APB2PERIPH_BASE + 0xB000) +#define DSMU_BASE (APB2PERIPH_BASE + 0xA000) +#define DSMU_Channel0_BASE (DSMU_BASE + 0x00UL) +#define DSMU_Channel1_BASE (DSMU_BASE + 0x20UL) +#define DSMU_Channel2_BASE (DSMU_BASE + 0x40UL) +#define DSMU_Channel3_BASE (DSMU_BASE + 0x60UL) +#define DSMU_Channel4_BASE (DSMU_BASE + 0x80UL) +#define DSMU_Channel5_BASE (DSMU_BASE + 0xA0UL) +#define DSMU_Channel6_BASE (DSMU_BASE + 0xC0UL) +#define DSMU_Channel7_BASE (DSMU_BASE + 0xE0UL) +#define DSMU_Filter0_BASE (DSMU_BASE + 0x100UL) +#define DSMU_Filter1_BASE (DSMU_BASE + 0x180UL) +#define DSMU_Filter2_BASE (DSMU_BASE + 0x200UL) +#define DSMU_Filter3_BASE (DSMU_BASE + 0x280UL) + +#define SHRTIM2_BASE (APB2PERIPH_BASE + 0x9000) +#define SHRTIM1_BASE (APB2PERIPH_BASE + 0x8000) +#define FDCAN8_BASE (APB2PERIPH_BASE + 0x0C00) +#define FDCAN7_BASE (APB2PERIPH_BASE + 0x0800) +#define FDCAN4_BASE (APB2PERIPH_BASE + 0x0400) +#define FDCAN3_BASE (APB2PERIPH_BASE) + + /* APB5 */ +#define LPTIM5_BASE (APB5PERIPH_BASE + 0x5800) +#define RTC_BASE (APB5PERIPH_BASE + 0x5400) +#define IWDG2_BASE (APB5PERIPH_BASE + 0x5000) +#define IWDG1_BASE (APB5PERIPH_BASE + 0x4C00) +#define COMP_BASE (APB5PERIPH_BASE + 0x4800) +#define ATIM4_BASE (APB5PERIPH_BASE + 0x4400) +#define ATIM3_BASE (APB5PERIPH_BASE + 0x4000) +#define I2C10_BASE (APB5PERIPH_BASE + 0x3C00) +#define I2C9_BASE (APB5PERIPH_BASE + 0x3800) +#define I2C8_BASE (APB5PERIPH_BASE + 0x3400) +#define I2C7_BASE (APB5PERIPH_BASE + 0x3000) +#define SPI7_BASE (APB5PERIPH_BASE + 0x2C00) +#define SPI6_BASE (APB5PERIPH_BASE + 0x2800) +#define SPI5_BASE (APB5PERIPH_BASE + 0x2400) +#define SPI4_BASE (APB5PERIPH_BASE + 0x2000) +#define LPTIM4_BASE (APB5PERIPH_BASE + 0x1C00) +#define LPTIM3_BASE (APB5PERIPH_BASE + 0x1800) +#define LPTIM2_BASE (APB5PERIPH_BASE + 0x1400) +#define LPTIM1_BASE (APB5PERIPH_BASE + 0x1000) +#define LPUART2_BASE (APB5PERIPH_BASE + 0x0C00) +#define LPUART1_BASE (APB5PERIPH_BASE + 0x0800) +#define AFEC_BASE (APB5PERIPH_BASE + 0x0400) +#define EXTI_BASE (APB5PERIPH_BASE) + + /* APB6 */ +#define JPEG_CTRL_BASE (APB6PERIPH_BASE + 0x90800) +#define JPEG_SGDMA_P2H_BASE (APB6PERIPH_BASE + 0x90400) +#define JPEG_BRC_BASE (APB6PERIPH_BASE + 0x90000) +#define JPEG_DEC_BASE (APB6PERIPH_BASE + 0x80000) +#define JPEG_SGDMA_H2P_BASE (APB6PERIPH_BASE + 0x70400) +#define JPEG_RBC_BASE (APB6PERIPH_BASE + 0x70000) +#define JPEG_ENC_BASE (APB6PERIPH_BASE + 0x60000) +#define FEMC_BASE (APB6PERIPH_BASE + 0x4C000) +#define TCMSRAMC_BASE (APB6PERIPH_BASE + 0x4B000) +#define DSI_HOST_WRAPPER_BASE (APB6PERIPH_BASE + 0x4AC00) +#define WWDG1_BASE (APB6PERIPH_BASE + 0x4A800) +#define LCDC_BASE (APB6PERIPH_BASE + 0x4A000) +#define LCDC_Layer1_BASE (LCDC_BASE + 0x100) +#define LCDC_Layer2_BASE (LCDC_BASE + 0x200) +#define LCDC_Layer3_BASE (LCDC_BASE + 0x300) +#define LCDC_Layer4_BASE (LCDC_BASE + 0x400) +#define DVP2_BASE (APB6PERIPH_BASE + 0x49000) +#define DVP1_BASE (APB6PERIPH_BASE + 0x48000) +#define GPU_BASE (APB6PERIPH_BASE + 0x40000) +#define DSI_HOST_BASE (APB6PERIPH_BASE) + + /* AHB1 */ +#define USB_CTRL2_WRAPPER_BASE (AHB1PERIPH_BASE + 0x60000) +#define USB_CTRL2_BASE (AHB1PERIPH_BASE + 0x20000) +#define SDHOST2_BASE (AHB1PERIPH_BASE + 0x10000) +#define SDMMC2_BASE (AHB1PERIPH_BASE + 0xA000) +#define DMA3_BASE (AHB1PERIPH_BASE + 0x7000) +#define DMA2_BASE (AHB1PERIPH_BASE + 0x6C00) +#define DMA1_BASE (AHB1PERIPH_BASE + 0x6800) +#define DMAMUX1_BASE (AHB1PERIPH_BASE + 0x6400) +#define ECCMON_AHB_CACHE_BASE (AHB1PERIPH_BASE + 0x5000) +#define ADC1_BASE (AHB1PERIPH_BASE + 0x4000) +#define ADC2_BASE (AHB1PERIPH_BASE + 0x4400) +#define ADC3_BASE (AHB1PERIPH_BASE + 0x4800) +#define ETH2_BASE (AHB1PERIPH_BASE + 0x2000) + + /* AHB2 */ +#define USB_CTRL1_WRAPPER_BASE (AHB1PERIPH_BASE + 0x50000) +#define USB_CTRL1_BASE (AHB1PERIPH_BASE + 0x10000) +#define DCMUB_CM4_BASE (AHB2PERIPH_BASE + 0x8000) +#define DCMUA_CM7_BASE (AHB2PERIPH_BASE + 0x7000) +#define SEMA4_BASE (AHB2PERIPH_BASE + 0x6000) +#define ETH1_BASE (AHB2PERIPH_BASE + 0x4000) +#define SDPU_BASE (AHB2PERIPH_BASE + 0x2000) +#define DAC56_BASE (AHB2PERIPH_BASE + 0x1C00) +#define DAC34_BASE (AHB2PERIPH_BASE + 0x1800) +#define FMAC_BASE (AHB2PERIPH_BASE + 0x1400) +#define CORDIC_BASE (AHB2PERIPH_BASE + 0x1000) +#define ECCMON2_BASE (AHB2PERIPH_BASE ) + +/* AHB5 */ +#define ECCMON3_BASE (AHB5PERIPH_BASE + 0x6000) +#define DBGMCU_BASE (AHB5PERIPH_BASE + 0x5400) +#define GPIOK_BASE (AHB5PERIPH_BASE + 0x5000) +#define GPIOJ_BASE (AHB5PERIPH_BASE + 0x4C00) +#define GPIOI_BASE (AHB5PERIPH_BASE + 0x4800) +#define GPIOH_BASE (AHB5PERIPH_BASE + 0x4400) +#define GPIOG_BASE (AHB5PERIPH_BASE + 0x4000) +#define GPIOF_BASE (AHB5PERIPH_BASE + 0x3C00) +#define GPIOE_BASE (AHB5PERIPH_BASE + 0x3800) +#define GPIOD_BASE (AHB5PERIPH_BASE + 0x3400) +#define GPIOC_BASE (AHB5PERIPH_BASE + 0x3000) +#define GPIOB_BASE (AHB5PERIPH_BASE + 0x2C00) +#define GPIOA_BASE (AHB5PERIPH_BASE + 0x2800) +#define AFIO_BASE (AHB5PERIPH_BASE + 0x2400) +#define CRC_BASE (AHB5PERIPH_BASE + 0x2000) +#define PWR_BASE (AHB5PERIPH_BASE + 0x1000) +#define RCC_BASE (AHB5PERIPH_BASE) + +/* AHB6 */ +#define MDMA_WRAPPER_BASE (AHB6PERIPH_BASE + 0x120800) +#define DMAMUX2_MDMA_BASE (AHB6PERIPH_BASE + 0x120000) +#define OTPC_BASE (AHB6PERIPH_BASE + 0x118000) +#define SDHOST1_BASE (AHB6PERIPH_BASE + 0x110000) +#define SDMMC1_BASE (AHB6PERIPH_BASE + 0x107000) +#define SDRAM_BASE (AHB6PERIPH_BASE + 0x106000) +#define MMU_BASE (AHB6PERIPH_BASE + 0x105000) +#define ECCMON1P1_BASE (AHB6PERIPH_BASE + 0x104000) +#define ECCMON1P2_BASE (AHB6PERIPH_BASE + 0x104400) +#define ECCMON1P3_BASE (AHB6PERIPH_BASE + 0x104800) +#define ECCMON1P4_BASE (AHB6PERIPH_BASE + 0x104c00) +#define MDMA_BASE (AHB6PERIPH_BASE + 0x102000) +#define xSPI2_BASE (AHB6PERIPH_BASE + 0x101000) +#define xSPI1_BASE (AHB6PERIPH_BASE + 0x100000) +#define GPV_BASE (AHB6PERIPH_BASE) + +/*AHB9*/ +#define ETHERCAT_WRAPPER_BASE (AHB9PERIPH_BASE + 0x10000) +#define ETHERCAT_BASE (AHB9PERIPH_BASE) + + +#define DMA1_CH0_BASE ( DMA1_BASE +0*0x58) +#define DMA1_CH1_BASE ( DMA1_BASE +1*0x58) +#define DMA1_CH2_BASE ( DMA1_BASE +2*0x58) +#define DMA1_CH3_BASE ( DMA1_BASE +3*0x58) +#define DMA1_CH4_BASE ( DMA1_BASE +4*0x58) +#define DMA1_CH5_BASE ( DMA1_BASE +5*0x58) +#define DMA1_CH6_BASE ( DMA1_BASE +6*0x58) +#define DMA1_CH7_BASE ( DMA1_BASE +7*0x58) + +#define DMA2_CH0_BASE ( DMA2_BASE +0*0x58) +#define DMA2_CH1_BASE ( DMA2_BASE +1*0x58) +#define DMA2_CH2_BASE ( DMA2_BASE +2*0x58) +#define DMA2_CH3_BASE ( DMA2_BASE +3*0x58) +#define DMA2_CH4_BASE ( DMA2_BASE +4*0x58) +#define DMA2_CH5_BASE ( DMA2_BASE +5*0x58) +#define DMA2_CH6_BASE ( DMA2_BASE +6*0x58) +#define DMA2_CH7_BASE ( DMA2_BASE +7*0x58) + +#define DMA3_CH0_BASE ( DMA3_BASE +0*0x58) +#define DMA3_CH1_BASE ( DMA3_BASE +1*0x58) +#define DMA3_CH2_BASE ( DMA3_BASE +2*0x58) +#define DMA3_CH3_BASE ( DMA3_BASE +3*0x58) +#define DMA3_CH4_BASE ( DMA3_BASE +4*0x58) +#define DMA3_CH5_BASE ( DMA3_BASE +5*0x58) +#define DMA3_CH6_BASE ( DMA3_BASE +6*0x58) +#define DMA3_CH7_BASE ( DMA3_BASE +7*0x58) + +/** MDMA channel register base address: 0x0100 + 0x100 * n (n = 0 to 15) **/ +#define MDMA_CH0_BASE ( MDMA_BASE +1*0x100) +#define MDMA_CH1_BASE ( MDMA_BASE +2*0x100) +#define MDMA_CH2_BASE ( MDMA_BASE +3*0x100) +#define MDMA_CH3_BASE ( MDMA_BASE +4*0x100) +#define MDMA_CH4_BASE ( MDMA_BASE +5*0x100) +#define MDMA_CH5_BASE ( MDMA_BASE +6*0x100) +#define MDMA_CH6_BASE ( MDMA_BASE +7*0x100) +#define MDMA_CH7_BASE ( MDMA_BASE +8*0x100) +#define MDMA_CH8_BASE ( MDMA_BASE +9*0x100) +#define MDMA_CH9_BASE ( MDMA_BASE +10*0x100) +#define MDMA_CH10_BASE ( MDMA_BASE +11*0x100) +#define MDMA_CH11_BASE ( MDMA_BASE +12*0x100) +#define MDMA_CH12_BASE ( MDMA_BASE +13*0x100) +#define MDMA_CH13_BASE ( MDMA_BASE +14*0x100) +#define MDMA_CH14_BASE ( MDMA_BASE +15*0x100) +#define MDMA_CH15_BASE ( MDMA_BASE +16*0x100) + + +//somema TBD +#define DMAMUX1_Channel0_BASE (DMAMUX1_BASE + 0x0000UL) +#define DMAMUX1_Channel1_BASE (DMAMUX1_BASE + 0x0004UL) +#define DMAMUX1_Channel2_BASE (DMAMUX1_BASE + 0x0008UL) +#define DMAMUX1_Channel3_BASE (DMAMUX1_BASE + 0x000CUL) +#define DMAMUX1_Channel4_BASE (DMAMUX1_BASE + 0x0010UL) +#define DMAMUX1_Channel5_BASE (DMAMUX1_BASE + 0x0014UL) +#define DMAMUX1_Channel6_BASE (DMAMUX1_BASE + 0x0018UL) +#define DMAMUX1_Channel7_BASE (DMAMUX1_BASE + 0x001CUL) +#define DMAMUX1_Channel8_BASE (DMAMUX1_BASE + 0x0020UL) +#define DMAMUX1_Channel9_BASE (DMAMUX1_BASE + 0x0024UL) +#define DMAMUX1_Channel10_BASE (DMAMUX1_BASE + 0x0028UL) +#define DMAMUX1_Channel11_BASE (DMAMUX1_BASE + 0x002CUL) +#define DMAMUX1_Channel12_BASE (DMAMUX1_BASE + 0x0030UL) +#define DMAMUX1_Channel13_BASE (DMAMUX1_BASE + 0x0034UL) +#define DMAMUX1_Channel14_BASE (DMAMUX1_BASE + 0x0038UL) +#define DMAMUX1_Channel15_BASE (DMAMUX1_BASE + 0x003CUL) +#define DMAMUX1_Channel16_BASE (DMAMUX1_BASE + 0x0040UL) +#define DMAMUX1_Channel17_BASE (DMAMUX1_BASE + 0x0044UL) +#define DMAMUX1_Channel18_BASE (DMAMUX1_BASE + 0x0048UL) +#define DMAMUX1_Channel19_BASE (DMAMUX1_BASE + 0x004CUL) +#define DMAMUX1_Channel20_BASE (DMAMUX1_BASE + 0x0050UL) +#define DMAMUX1_Channel21_BASE (DMAMUX1_BASE + 0x0044UL) +#define DMAMUX1_Channel22_BASE (DMAMUX1_BASE + 0x0058UL) +#define DMAMUX1_Channel23_BASE (DMAMUX1_BASE + 0x005CUL) + +#define DMAMUX1_RequestGenerator0_BASE (DMAMUX1_BASE + 0x0100UL) +#define DMAMUX1_RequestGenerator1_BASE (DMAMUX1_BASE + 0x0104UL) +#define DMAMUX1_RequestGenerator2_BASE (DMAMUX1_BASE + 0x0108UL) +#define DMAMUX1_RequestGenerator3_BASE (DMAMUX1_BASE + 0x010CUL) +#define DMAMUX1_RequestGenerator4_BASE (DMAMUX1_BASE + 0x0110UL) +#define DMAMUX1_RequestGenerator5_BASE (DMAMUX1_BASE + 0x0114UL) +#define DMAMUX1_RequestGenerator6_BASE (DMAMUX1_BASE + 0x0118UL) +#define DMAMUX1_RequestGenerator7_BASE (DMAMUX1_BASE + 0x011CUL) +#define DMAMUX1_RequestGenerator8_BASE (DMAMUX1_BASE + 0x0120UL) +#define DMAMUX1_RequestGenerator9_BASE (DMAMUX1_BASE + 0x0124UL) +#define DMAMUX1_RequestGenerator10_BASE (DMAMUX1_BASE + 0x0128UL) +#define DMAMUX1_RequestGenerator11_BASE (DMAMUX1_BASE + 0x012CUL) +#define DMAMUX1_RequestGenerator12_BASE (DMAMUX1_BASE + 0x0130UL) +#define DMAMUX1_RequestGenerator13_BASE (DMAMUX1_BASE + 0x0134UL) +#define DMAMUX1_RequestGenerator14_BASE (DMAMUX1_BASE + 0x0138UL) +#define DMAMUX1_RequestGenerator15_BASE (DMAMUX1_BASE + 0x013CUL) +#define DMAMUX1_RequestGenerator16_BASE (DMAMUX1_BASE + 0x0140UL) +#define DMAMUX1_RequestGenerator17_BASE (DMAMUX1_BASE + 0x0144UL) +#define DMAMUX1_RequestGenerator18_BASE (DMAMUX1_BASE + 0x0148UL) +#define DMAMUX1_RequestGenerator19_BASE (DMAMUX1_BASE + 0x014CUL) +#define DMAMUX1_RequestGenerator20_BASE (DMAMUX1_BASE + 0x0150UL) +#define DMAMUX1_RequestGenerator21_BASE (DMAMUX1_BASE + 0x0154UL) +#define DMAMUX1_RequestGenerator22_BASE (DMAMUX1_BASE + 0x0158UL) +#define DMAMUX1_RequestGenerator23_BASE (DMAMUX1_BASE + 0x015CUL) + +//somema TBD +#define DMAMUX1_ChannelStatus_BASE (DMAMUX1_BASE + 0x0080UL) +#define DMAMUX1_RequestGenStatus_BASE (DMAMUX1_BASE + 0x0140UL) + +//somema TBD +#define DMAMUX1_RGISR_BASE (DMAMUX1_BASE + 0x0180UL) +#define DMAMUX1_RGICF_BASE (DMAMUX1_BASE + 0x0184UL) + +#define DMAMUX_MDMA_RequestGenerator0_BASE (DMAMUX_MDMA_BASE + 0x0100UL) +#define DMAMUX_MDMA_RequestGenerator1_BASE (DMAMUX_MDMA_BASE + 0x0104UL) +#define DMAMUX_MDMA_RequestGenerator2_BASE (DMAMUX_MDMA_BASE + 0x0108UL) +#define DMAMUX_MDMA_RequestGenerator3_BASE (DMAMUX_MDMA_BASE + 0x010CUL) +#define DMAMUX_MDMA_RequestGenerator4_BASE (DMAMUX_MDMA_BASE + 0x0110UL) +#define DMAMUX_MDMA_RequestGenerator5_BASE (DMAMUX_MDMA_BASE + 0x0114UL) +#define DMAMUX_MDMA_RequestGenerator6_BASE (DMAMUX_MDMA_BASE + 0x0118UL) +#define DMAMUX_MDMA_RequestGenerator7_BASE (DMAMUX_MDMA_BASE + 0x011CUL) +//somema, TBD to confirm that MDMA only support 8 channel request generator +// #define DMAMUX_MDMA_RequestGenerator8_BASE (DMAMUX_MDMA_BASE + 0x0120UL) +// #define DMAMUX_MDMA_RequestGenerator9_BASE (DMAMUX_MDMA_BASE + 0x0124UL) +// #define DMAMUX_MDMA_RequestGenerator10_BASE (DMAMUX_MDMA_BASE + 0x0128UL) +// #define DMAMUX_MDMA_RequestGenerator11_BASE (DMAMUX_MDMA_BASE + 0x012CUL) +// #define DMAMUX_MDMA_RequestGenerator12_BASE (DMAMUX_MDMA_BASE + 0x0130UL) +// #define DMAMUX_MDMA_RequestGenerator13_BASE (DMAMUX_MDMA_BASE + 0x0134UL) +// #define DMAMUX_MDMA_RequestGenerator14_BASE (DMAMUX_MDMA_BASE + 0x0138UL) +// #define DMAMUX_MDMA_RequestGenerator15_BASE (DMAMUX_MDMA_BASE + 0x013CUL) +// #define DMAMUX_MDMA_RequestGenerator16_BASE (DMAMUX_MDMA_BASE + 0x0140UL) +// #define DMAMUX_MDMA_RequestGenerator17_BASE (DMAMUX_MDMA_BASE + 0x0144UL) +// #define DMAMUX_MDMA_RequestGenerator18_BASE (DMAMUX_MDMA_BASE + 0x0148UL) +// #define DMAMUX_MDMA_RequestGenerator19_BASE (DMAMUX_MDMA_BASE + 0x014CUL) +// #define DMAMUX_MDMA_RequestGenerator20_BASE (DMAMUX_MDMA_BASE + 0x0150UL) +// #define DMAMUX_MDMA_RequestGenerator21_BASE (DMAMUX_MDMA_BASE + 0x0154UL) +// #define DMAMUX_MDMA_RequestGenerator22_BASE (DMAMUX_MDMA_BASE + 0x0158UL) +// #define DMAMUX_MDMA_RequestGenerator23_BASE (DMAMUX_MDMA_BASE + 0x015CUL) + +#define DMAMUX_MDMA_RGISR_BASE (DMAMUX_MDMA_BASE + 0x0180UL) +#define DMAMUX_MDMA_RGICF_BASE (DMAMUX_MDMA_BASE + 0x0184UL) + +#if defined(CORE_CM7) +#define DCMU_BASE ((DCMU_Module *) (DCMUA_CM7_BASE)) +#else /* CORE_CM4 */ +#define DCMU_BASE ((DCMU_Module *) (DCMUB_CM4_BASE)) +#endif /* CORE_CM7 */ + + +//#define JPEG IPs here +//#define GPU here + + + + + + +#define BTIM4 ((TIM_Module *) BTIM4_BASE) +#define BTIM3 ((TIM_Module *) BTIM3_BASE) +#define MMU ((MMU_Module *) MMU_BASE) +#define WWDG2 ((WWDG_Module *) WWDG2_BASE) +#define DAC12 ((DAC_Module *) DAC12_BASE) +#define DAC34 ((DAC_Module *) DAC34_BASE) +#define DAC56 ((DAC_Module *) DAC56_BASE) +#define I2S4_EXT ((I2S_EXT_Module *) I2S4EXT_BASE) +#define I2S3_EXT ((I2S_EXT_Module *) I2S3EXT_BASE) +#define I2S4 ((I2S_Module *) I2S4_BASE) +#define I2S3 ((I2S_Module *) I2S3_BASE) +#define I2C3 ((I2C_Module *) I2C3_BASE) +#define I2C2 ((I2C_Module *) I2C2_BASE) +#define I2C1 ((I2C_Module *) I2C1_BASE) +#define SPI3 ((SPI_Module *) SPI3_BASE) +#define UART12 ((USART_Module *) UART12_BASE) +#define UART11 ((USART_Module *) UART11_BASE) +#define UART10 ((USART_Module *) UART10_BASE) +#define UART9 ((USART_Module *) UART9_BASE) +#define USART4 ((USART_Module *) USART4_BASE) +#define USART3 ((USART_Module *) USART3_BASE) +#define USART2 ((USART_Module *) USART2_BASE) +#define USART1 ((USART_Module *) USART1_BASE) +#define GTIMA7 ((TIM_Module *) GTIMA7_BASE) +#define GTIMA6 ((TIM_Module *) GTIMA6_BASE) +#define GTIMA5 ((TIM_Module *) GTIMA5_BASE) +#define GTIMA4 ((TIM_Module *) GTIMA4_BASE) +#define GTIMA3 ((TIM_Module *) GTIMA3_BASE) +#define GTIMA2 ((TIM_Module *) GTIMA2_BASE) +#define GTIMA1 ((TIM_Module *) GTIMA1_BASE) +#define BTIM2 ((TIM_Module *) BTIM2_BASE) +#define BTIM1 ((TIM_Module *) BTIM1_BASE) +#define FDCAN6 ((FDCAN_Module *) FDCAN6_BASE) +#define FDCAN5 ((FDCAN_Module *) FDCAN5_BASE) +#define FDCAN2 ((FDCAN_Module *) FDCAN2_BASE) +#define FDCAN1 ((FDCAN_Module *) FDCAN1_BASE) + +#define UART15 ((USART_Module *) UART15_BASE) +#define UART14 ((USART_Module *) UART14_BASE) +#define UART13 ((USART_Module *) UART13_BASE) +#define USART8 ((USART_Module *) USART8_BASE) +#define USART7 ((USART_Module *) USART7_BASE) +#define USART6 ((USART_Module *) USART6_BASE) +#define USART5 ((USART_Module *) USART5_BASE) +#define I2C6 ((I2C_Module *) I2C6_BASE) +#define I2C5 ((I2C_Module *) I2C5_BASE) +#define I2C4 ((I2C_Module *) I2C4_BASE) +#define GTIMB1 ((TIM_Module *) GTIMB1_BASE) +#define GTIMB2 ((TIM_Module *) GTIMB2_BASE) +#define GTIMB3 ((TIM_Module *) GTIMB3_BASE) +#define SPI2 ((SPI_Module *) SPI2_BASE) +#define SPI1 ((SPI_Module *) SPI1_BASE) +#define I2S2 ((I2S_Module *) I2S2_BASE) +#define I2S1 ((I2S_Module *) I2S1_BASE) +#define I2S2_EXT ((I2S_EXT_Module *) I2S2EXT_BASE) +#define I2S1_EXT ((I2S_EXT_Module *) I2S1EXT_BASE) +#define ATIM4 ((TIM_Module *) ATIM4_BASE) +#define ATIM3 ((TIM_Module *) ATIM3_BASE) +#define ATIM2 ((TIM_Module *) ATIM2_BASE) +#define ATIM1 ((TIM_Module *) ATIM1_BASE) +#define DSMU ((DSMU_TypeDef *) DSMU_BASE) +#define SHRTIM2 ((SHRTIM_Module *) SHRTIM2_BASE) +#define SHRTIM1 ((SHRTIM_Module *) SHRTIM1_BASE) +#define FDCAN8 ((FDCAN_Module *) FDCAN8_BASE) +#define FDCAN7 ((FDCAN_Module *) FDCAN7_BASE) +#define FDCAN4 ((FDCAN_Module *) FDCAN4_BASE) +#define FDCAN3 ((FDCAN_Module *) FDCAN3_BASE) + +#define RTC ((RTC_Module *) RTC_BASE) +#define IWDG2 ((IWDG_Module *) IWDG2_BASE) +#define IWDG1 ((IWDG_Module *) IWDG1_BASE) +#define COMP ((COMP_Module *) COMP_BASE) +#define ATIMER4 ((ATIMER_TypeDef *) ATIMER4_BASE) +#define ATIMER3 ((ATIMER_TypeDef *) ATIMER3_BASE) +#define I2C10 ((I2C_Module *) I2C10_BASE) +#define I2C9 ((I2C_Module *) I2C9_BASE) +#define I2C8 ((I2C_Module *) I2C8_BASE) +#define I2C7 ((I2C_Module *) I2C7_BASE) +#define SPI7 ((SPI_Module *) SPI7_BASE) +#define SPI6 ((SPI_Module *) SPI6_BASE) +#define SPI5 ((SPI_Module *) SPI5_BASE) +#define SPI4 ((SPI_Module *) SPI4_BASE) +#define LPTIM5 ((LPTIM_Module *) LPTIM5_BASE) +#define LPTIM4 ((LPTIM_Module *) LPTIM4_BASE) +#define LPTIM3 ((LPTIM_Module *) LPTIM3_BASE) +#define LPTIM2 ((LPTIM_Module *) LPTIM2_BASE) +#define LPTIM1 ((LPTIM_Module *) LPTIM1_BASE) +#define LPUART2 ((LPUART_Module *) LPUART2_BASE) +#define LPUART1 ((LPUART_Module *) LPUART1_BASE) +#define AFEC ((AFEC_TypeDef *) AFEC_BASE) +#define EXTI ((EXTI_Module *) EXTI_BASE) + +#define JPEG_CTRL ((JPEG_CTRL_Module *) JPEG_CTRL_BASE) +#define JPEG_SGDMA_P2H ((JPEG_SGDMA_Module *) JPEG_SGDMA_P2H_BASE) +#define JPEG_BRC ((JPEG_BRC_Module *) JPEG_BRC_BASE) +#define JPEG_DEC ((JPEG_DEC_Module *) JPEG_DEC_BASE) +#define JPEG_SGDMA_H2P ((JPEG_SGDMA_Module *) JPEG_SGDMA_H2P_BASE) +#define JPEG_RBC ((JPEG_RBC_Module *) JPEG_RBC_BASE) +#define JPEG_ENC ((JPEG_ENC_Module *) JPEG_ENC_BASE) +#define FEMC ((FEMC_Module *) FEMC_BASE) +#define TCMSRAMC ((TCMSRAMC_TypeDef *) TCMSRAMC_BASE) +#define WWDG1 ((WWDG_Module *) WWDG1_BASE) +#define LCDC ((LCDC_Module *) LCDC_BASE) +#define LCDC_Layer1 ((LCDC_Layer_Module *)LCDC_Layer1_BASE) +#define LCDC_Layer2 ((LCDC_Layer_Module *)LCDC_Layer2_BASE) +#define LCDC_Layer3 ((LCDC_Layer_Module *)LCDC_Layer3_BASE) +#define LCDC_Layer4 ((LCDC_Layer_Module *)LCDC_Layer4_BASE) +#define DVP2 ((DVP_Module *) DVP2_BASE) +#define DVP1 ((DVP_Module *) DVP1_BASE) +#define OTPC ((OTPC_Module *) OTPC_BASE) +#define GPU ((GPU_TypeDef *) GPU_BASE) +#define DSI_HOST ((DSI_Module *) DSI_HOST_BASE) +#define DSI_HOST_WRAPPER ((DSI_Wrapper_Module *)DSI_HOST_WRAPPER_BASE) + +#define SDMMC2 ((SDMMC_Module *) SDMMC2_BASE) +#define SDHOST2 ((SDHOST_Module *) SDHOST2_BASE) +#define USB2OTG_HS ((USBOTG_HS_TypeDef *) USB2OTG_HS_BASE) +#define USB1OTG_HS ((USBOTG_HS_TypeDef *) USBOTG_HS_BASE) +#define DMA3 ((DMA_Module *) DMA3_BASE) +#define DMA3_CH0 ((DMA_ChannelType *) DMA3_CH0_BASE) +#define DMA3_CH1 ((DMA_ChannelType *) DMA3_CH1_BASE) +#define DMA3_CH2 ((DMA_ChannelType *) DMA3_CH2_BASE) +#define DMA3_CH3 ((DMA_ChannelType *) DMA3_CH3_BASE) +#define DMA3_CH4 ((DMA_ChannelType *) DMA3_CH4_BASE) +#define DMA3_CH5 ((DMA_ChannelType *) DMA3_CH5_BASE) +#define DMA3_CH6 ((DMA_ChannelType *) DMA3_CH6_BASE) +#define DMA3_CH7 ((DMA_ChannelType *) DMA3_CH7_BASE) + +#define DMA2 ((DMA_Module *) DMA2_BASE) +#define DMA2_CH0 ((DMA_ChannelType *) DMA2_CH0_BASE) +#define DMA2_CH1 ((DMA_ChannelType *) DMA2_CH1_BASE) +#define DMA2_CH2 ((DMA_ChannelType *) DMA2_CH2_BASE) +#define DMA2_CH3 ((DMA_ChannelType *) DMA2_CH3_BASE) +#define DMA2_CH4 ((DMA_ChannelType *) DMA2_CH4_BASE) +#define DMA2_CH5 ((DMA_ChannelType *) DMA2_CH5_BASE) +#define DMA2_CH6 ((DMA_ChannelType *) DMA2_CH6_BASE) +#define DMA2_CH7 ((DMA_ChannelType *) DMA2_CH7_BASE) +#define DMA1 ((DMA_Module *) DMA1_BASE) + +#define DMA1_CH0 ((DMA_ChannelType *) DMA1_CH0_BASE) +#define DMA1_CH1 ((DMA_ChannelType *) DMA1_CH1_BASE) +#define DMA1_CH2 ((DMA_ChannelType *) DMA1_CH2_BASE) +#define DMA1_CH3 ((DMA_ChannelType *) DMA1_CH3_BASE) +#define DMA1_CH4 ((DMA_ChannelType *) DMA1_CH4_BASE) +#define DMA1_CH5 ((DMA_ChannelType *) DMA1_CH5_BASE) +#define DMA1_CH6 ((DMA_ChannelType *) DMA1_CH6_BASE) +#define DMA1_CH7 ((DMA_ChannelType *) DMA1_CH7_BASE) +#define DMAMUX1 ((DMAMUX1_Module *) DMAMUX1_BASE) +#define ADC1 ((ADC_Module *) ADC1_BASE) +#define ADC2 ((ADC_Module *) ADC2_BASE) +#define ADC3 ((ADC_Module *) ADC3_BASE) +#define ETH1 ((ETH_Module *) ETH1_BASE) +#define ETH2 ((ETH_Module *) ETH2_BASE) + + +//#define DCMUB_CM4 ((DCMUB_CM4_TypeDef *) DCMUB_CM4_BASE) +//#define DCMUA_CM7 ((DCMUA_CM7_TypeDef *) DCMUA_CM7_BASE) +#define DCMU ((DCMU_Module *) DCMU_BASE) + +#define SEMA4 ((SEMA4_Module *) SEMA4_BASE) +#define CUSTOM ((CUSTOM_TypeDef *) CUSTOM_BASE) +#define SDPU ((SDPU_TypeDef *) SDPU_BASE) +#define FMAC ((FMAC_Module *) FMAC_BASE) +#define CORDIC ((CORDIC_Module *) CORDIC_BASE) +#define ECCMON2 ((ECCMON_TypeDef *) ECCMON2_BASE) + +#define ECCMON3 ((ECCMON_TypeDef *) ECCMON3_BASE) +#define GPIOK ((GPIO_Module *) GPIOK_BASE) +#define GPIOJ ((GPIO_Module *) GPIOJ_BASE) +#define GPIOI ((GPIO_Module *) GPIOI_BASE) +#define GPIOH ((GPIO_Module *) GPIOH_BASE) +#define GPIOG ((GPIO_Module *) GPIOG_BASE) +#define GPIOF ((GPIO_Module *) GPIOF_BASE) +#define GPIOE ((GPIO_Module *) GPIOE_BASE) +#define GPIOD ((GPIO_Module *) GPIOD_BASE) +#define GPIOC ((GPIO_Module *) GPIOC_BASE) +#define GPIOB ((GPIO_Module *) GPIOB_BASE) +#define GPIOA ((GPIO_Module *) GPIOA_BASE) +#define AFIO ((AFIO_Module *) AFIO_BASE) +#define CRC ((CRC_Module *) CRC_BASE) +#define PWR ((PWR_Module *) PWR_BASE) +#define RCC ((RCC_Module *) RCC_BASE) + +#define SDRAM ((SDRAM_Module*)SDRAM_BASE) +#define DMAMUX_MDMA ((DMAMUX2_Module *) DMAMUX_MDMA_BASE) +#define SDMMC1 ((SDMMC_Module *) SDMMC1_BASE) +#define SDHOST1 ((SDHOST_Module *) SDHOST1_BASE) +#define ECCMON1P1 ((ECCMON_TypeDef *) ECCMON1P1_BASE) +#define ECCMON1P2 ((ECCMON_TypeDef *) ECCMON1P2_BASE) +#define ECCMON1P3 ((ECCMON_TypeDef *) ECCMON1P3_BASE) +#define ECCMON1P4 ((ECCMON_TypeDef *) ECCMON1P4_BASE) +#define MDMA ((MDMA_Module *) MDMA_BASE) +#define xSPI2 ((XSPI_Module *) xSPI2_BASE) +#define xSPI1 ((XSPI_Module *) xSPI1_BASE) +#define GPV ((GPV_TypeDef *) GPV_BASE ) + +#define DBG ((DBG_Module *) DBGMCU_BASE) + +#define DSMU_Channel0 ((DSMU_Channel_Submodule *) DSMU_Channel0_BASE) +#define DSMU_Channel1 ((DSMU_Channel_Submodule *) DSMU_Channel1_BASE) +#define DSMU_Channel2 ((DSMU_Channel_Submodule *) DSMU_Channel2_BASE) +#define DSMU_Channel3 ((DSMU_Channel_Submodule *) DSMU_Channel3_BASE) +#define DSMU_Channel4 ((DSMU_Channel_Submodule *) DSMU_Channel4_BASE) +#define DSMU_Channel5 ((DSMU_Channel_Submodule *) DSMU_Channel5_BASE) +#define DSMU_Channel6 ((DSMU_Channel_Submodule *) DSMU_Channel6_BASE) +#define DSMU_Channel7 ((DSMU_Channel_Submodule *) DSMU_Channel7_BASE) +#define DSMU_Filter0 ((DSMU_Filter_Submodule *) DSMU_Filter0_BASE) +#define DSMU_Filter1 ((DSMU_Filter_Submodule *) DSMU_Filter1_BASE) +#define DSMU_Filter2 ((DSMU_Filter_Submodule *) DSMU_Filter2_BASE) +#define DSMU_Filter3 ((DSMU_Filter_Submodule *) DSMU_Filter3_BASE) + +/*** SystemTick ***/ + +/** Bit definition for SysTick_CTRL register **/ +#define SysTick_CTRL_ENABLE ((uint32_t)0x00000001U) /* Counter enable */ +#define SysTick_CTRL_TICKINT ((uint32_t)0x00000002U) /* Counting down to 0 pends the SysTick handler */ +#define SysTick_CTRL_CLKSOURCE ((uint32_t)0x00000004U) /* Clock source */ +#define SysTick_CTRL_COUNTFLAG ((uint32_t)0x00010000U) /* Count Flag */ + +/** Bit definition for SysTick_LOAD register **/ +#define SysTick_LOAD_RELOAD ((uint32_t)0x00FFFFFFU) /* Value to load into the SysTick Current Value Register when the counter reaches 0 */ +/** Bit definition for SysTick_VAL register **/ +#define SysTick_VAL_CURRENT ((uint32_t)0x00FFFFFFU) /* Current value at the time the register is accessed */ + +/** Bit definition for SysTick_CALIB register **/ +#define SysTick_CALIB_TENMS ((uint32_t)0x00FFFFFFU) /* Reload value to use for 10ms timing */ +#define SysTick_CALIB_SKEW ((uint32_t)0x40000000U) /* Calibration value is not exactly 10 ms */ +#define SysTick_CALIB_NOREF ((uint32_t)0x80000000U) /* The reference clock is not provided */ + +/*** Nested Vectored Interrupt Controller ***/ + +/** Bit definition for NVIC_ISER register **/ +#define NVIC_ISER_SETENA ((uint32_t)0xFFFFFFFFU) /* Interrupt set enable bits */ +#define NVIC_ISER_SETENA_0 ((uint32_t)0x00000001U) /* bit 0 */ +#define NVIC_ISER_SETENA_1 ((uint32_t)0x00000002U) /* bit 1 */ +#define NVIC_ISER_SETENA_2 ((uint32_t)0x00000004U) /* bit 2 */ +#define NVIC_ISER_SETENA_3 ((uint32_t)0x00000008U) /* bit 3 */ +#define NVIC_ISER_SETENA_4 ((uint32_t)0x00000010U) /* bit 4 */ +#define NVIC_ISER_SETENA_5 ((uint32_t)0x00000020U) /* bit 5 */ +#define NVIC_ISER_SETENA_6 ((uint32_t)0x00000040U) /* bit 6 */ +#define NVIC_ISER_SETENA_7 ((uint32_t)0x00000080U) /* bit 7 */ +#define NVIC_ISER_SETENA_8 ((uint32_t)0x00000100U) /* bit 8 */ +#define NVIC_ISER_SETENA_9 ((uint32_t)0x00000200U) /* bit 9 */ +#define NVIC_ISER_SETENA_10 ((uint32_t)0x00000400U) /* bit 10 */ +#define NVIC_ISER_SETENA_11 ((uint32_t)0x00000800U) /* bit 11 */ +#define NVIC_ISER_SETENA_12 ((uint32_t)0x00001000U) /* bit 12 */ +#define NVIC_ISER_SETENA_13 ((uint32_t)0x00002000U) /* bit 13 */ +#define NVIC_ISER_SETENA_14 ((uint32_t)0x00004000U) /* bit 14 */ +#define NVIC_ISER_SETENA_15 ((uint32_t)0x00008000U) /* bit 15 */ +#define NVIC_ISER_SETENA_16 ((uint32_t)0x00010000U) /* bit 16 */ +#define NVIC_ISER_SETENA_17 ((uint32_t)0x00020000U) /* bit 17 */ +#define NVIC_ISER_SETENA_18 ((uint32_t)0x00040000U) /* bit 18 */ +#define NVIC_ISER_SETENA_19 ((uint32_t)0x00080000U) /* bit 19 */ +#define NVIC_ISER_SETENA_20 ((uint32_t)0x00100000U) /* bit 20 */ +#define NVIC_ISER_SETENA_21 ((uint32_t)0x00200000U) /* bit 21 */ +#define NVIC_ISER_SETENA_22 ((uint32_t)0x00400000U) /* bit 22 */ +#define NVIC_ISER_SETENA_23 ((uint32_t)0x00800000U) /* bit 23 */ +#define NVIC_ISER_SETENA_24 ((uint32_t)0x01000000U) /* bit 24 */ +#define NVIC_ISER_SETENA_25 ((uint32_t)0x02000000U) /* bit 25 */ +#define NVIC_ISER_SETENA_26 ((uint32_t)0x04000000U) /* bit 26 */ +#define NVIC_ISER_SETENA_27 ((uint32_t)0x08000000U) /* bit 27 */ +#define NVIC_ISER_SETENA_28 ((uint32_t)0x10000000U) /* bit 28 */ +#define NVIC_ISER_SETENA_29 ((uint32_t)0x20000000U) /* bit 29 */ +#define NVIC_ISER_SETENA_30 ((uint32_t)0x40000000U) /* bit 30 */ +#define NVIC_ISER_SETENA_31 ((uint32_t)0x80000000U) /* bit 31 */ + +/** Bit definition for NVIC_ICER register ***/ +#define NVIC_ICER_CLRENA ((uint32_t)0xFFFFFFFFU) /* Interrupt clear-enable bits */ +#define NVIC_ICER_CLRENA_0 ((uint32_t)0x00000001U) /* bit 0 */ +#define NVIC_ICER_CLRENA_1 ((uint32_t)0x00000002U) /* bit 1 */ +#define NVIC_ICER_CLRENA_2 ((uint32_t)0x00000004U) /* bit 2 */ +#define NVIC_ICER_CLRENA_3 ((uint32_t)0x00000008U) /* bit 3 */ +#define NVIC_ICER_CLRENA_4 ((uint32_t)0x00000010U) /* bit 4 */ +#define NVIC_ICER_CLRENA_5 ((uint32_t)0x00000020U) /* bit 5 */ +#define NVIC_ICER_CLRENA_6 ((uint32_t)0x00000040U) /* bit 6 */ +#define NVIC_ICER_CLRENA_7 ((uint32_t)0x00000080U) /* bit 7 */ +#define NVIC_ICER_CLRENA_8 ((uint32_t)0x00000100U) /* bit 8 */ +#define NVIC_ICER_CLRENA_9 ((uint32_t)0x00000200U) /* bit 9 */ +#define NVIC_ICER_CLRENA_10 ((uint32_t)0x00000400U) /* bit 10 */ +#define NVIC_ICER_CLRENA_11 ((uint32_t)0x00000800U) /* bit 11 */ +#define NVIC_ICER_CLRENA_12 ((uint32_t)0x00001000U) /* bit 12 */ +#define NVIC_ICER_CLRENA_13 ((uint32_t)0x00002000U) /* bit 13 */ +#define NVIC_ICER_CLRENA_14 ((uint32_t)0x00004000U) /* bit 14 */ +#define NVIC_ICER_CLRENA_15 ((uint32_t)0x00008000U) /* bit 15 */ +#define NVIC_ICER_CLRENA_16 ((uint32_t)0x00010000U) /* bit 16 */ +#define NVIC_ICER_CLRENA_17 ((uint32_t)0x00020000U) /* bit 17 */ +#define NVIC_ICER_CLRENA_18 ((uint32_t)0x00040000U) /* bit 18 */ +#define NVIC_ICER_CLRENA_19 ((uint32_t)0x00080000U) /* bit 19 */ +#define NVIC_ICER_CLRENA_20 ((uint32_t)0x00100000U) /* bit 20 */ +#define NVIC_ICER_CLRENA_21 ((uint32_t)0x00200000U) /* bit 21 */ +#define NVIC_ICER_CLRENA_22 ((uint32_t)0x00400000U) /* bit 22 */ +#define NVIC_ICER_CLRENA_23 ((uint32_t)0x00800000U) /* bit 23 */ +#define NVIC_ICER_CLRENA_24 ((uint32_t)0x01000000U) /* bit 24 */ +#define NVIC_ICER_CLRENA_25 ((uint32_t)0x02000000U) /* bit 25 */ +#define NVIC_ICER_CLRENA_26 ((uint32_t)0x04000000U) /* bit 26 */ +#define NVIC_ICER_CLRENA_27 ((uint32_t)0x08000000U) /* bit 27 */ +#define NVIC_ICER_CLRENA_28 ((uint32_t)0x10000000U) /* bit 28 */ +#define NVIC_ICER_CLRENA_29 ((uint32_t)0x20000000U) /* bit 29 */ +#define NVIC_ICER_CLRENA_30 ((uint32_t)0x40000000U) /* bit 30 */ +#define NVIC_ICER_CLRENA_31 ((uint32_t)0x80000000U) /* bit 31 */ + +/** Bit definition for NVIC_ISPR register **/ +#define NVIC_ISPR_SETPEND ((uint32_t)0xFFFFFFFFU) /* Interrupt set-pending bits */ +#define NVIC_ISPR_SETPEND_0 ((uint32_t)0x00000001U) /* bit 0 */ +#define NVIC_ISPR_SETPEND_1 ((uint32_t)0x00000002U) /* bit 1 */ +#define NVIC_ISPR_SETPEND_2 ((uint32_t)0x00000004U) /* bit 2 */ +#define NVIC_ISPR_SETPEND_3 ((uint32_t)0x00000008U) /* bit 3 */ +#define NVIC_ISPR_SETPEND_4 ((uint32_t)0x00000010U) /* bit 4 */ +#define NVIC_ISPR_SETPEND_5 ((uint32_t)0x00000020U) /* bit 5 */ +#define NVIC_ISPR_SETPEND_6 ((uint32_t)0x00000040U) /* bit 6 */ +#define NVIC_ISPR_SETPEND_7 ((uint32_t)0x00000080U) /* bit 7 */ +#define NVIC_ISPR_SETPEND_8 ((uint32_t)0x00000100U) /* bit 8 */ +#define NVIC_ISPR_SETPEND_9 ((uint32_t)0x00000200U) /* bit 9 */ +#define NVIC_ISPR_SETPEND_10 ((uint32_t)0x00000400U) /* bit 10 */ +#define NVIC_ISPR_SETPEND_11 ((uint32_t)0x00000800U) /* bit 11 */ +#define NVIC_ISPR_SETPEND_12 ((uint32_t)0x00001000U) /* bit 12 */ +#define NVIC_ISPR_SETPEND_13 ((uint32_t)0x00002000U) /* bit 13 */ +#define NVIC_ISPR_SETPEND_14 ((uint32_t)0x00004000U) /* bit 14 */ +#define NVIC_ISPR_SETPEND_15 ((uint32_t)0x00008000U) /* bit 15 */ +#define NVIC_ISPR_SETPEND_16 ((uint32_t)0x00010000U) /* bit 16 */ +#define NVIC_ISPR_SETPEND_17 ((uint32_t)0x00020000U) /* bit 17 */ +#define NVIC_ISPR_SETPEND_18 ((uint32_t)0x00040000U) /* bit 18 */ +#define NVIC_ISPR_SETPEND_19 ((uint32_t)0x00080000U) /* bit 19 */ +#define NVIC_ISPR_SETPEND_20 ((uint32_t)0x00100000U) /* bit 20 */ +#define NVIC_ISPR_SETPEND_21 ((uint32_t)0x00200000U) /* bit 21 */ +#define NVIC_ISPR_SETPEND_22 ((uint32_t)0x00400000U) /* bit 22 */ +#define NVIC_ISPR_SETPEND_23 ((uint32_t)0x00800000U) /* bit 23 */ +#define NVIC_ISPR_SETPEND_24 ((uint32_t)0x01000000U) /* bit 24 */ +#define NVIC_ISPR_SETPEND_25 ((uint32_t)0x02000000U) /* bit 25 */ +#define NVIC_ISPR_SETPEND_26 ((uint32_t)0x04000000U) /* bit 26 */ +#define NVIC_ISPR_SETPEND_27 ((uint32_t)0x08000000U) /* bit 27 */ +#define NVIC_ISPR_SETPEND_28 ((uint32_t)0x10000000U) /* bit 28 */ +#define NVIC_ISPR_SETPEND_29 ((uint32_t)0x20000000U) /* bit 29 */ +#define NVIC_ISPR_SETPEND_30 ((uint32_t)0x40000000U) /* bit 30 */ +#define NVIC_ISPR_SETPEND_31 ((uint32_t)0x80000000U) /* bit 31 */ + +/** Bit definition for NVIC_ICPR register **/ +#define NVIC_ICPR_CLRPEND ((uint32_t)0xFFFFFFFFU) /* Interrupt clear-pending bits */ +#define NVIC_ICPR_CLRPEND_0 ((uint32_t)0x00000001U) /* bit 0 */ +#define NVIC_ICPR_CLRPEND_1 ((uint32_t)0x00000002U) /* bit 1 */ +#define NVIC_ICPR_CLRPEND_2 ((uint32_t)0x00000004U) /* bit 2 */ +#define NVIC_ICPR_CLRPEND_3 ((uint32_t)0x00000008U) /* bit 3 */ +#define NVIC_ICPR_CLRPEND_4 ((uint32_t)0x00000010U) /* bit 4 */ +#define NVIC_ICPR_CLRPEND_5 ((uint32_t)0x00000020U) /* bit 5 */ +#define NVIC_ICPR_CLRPEND_6 ((uint32_t)0x00000040U) /* bit 6 */ +#define NVIC_ICPR_CLRPEND_7 ((uint32_t)0x00000080U) /* bit 7 */ +#define NVIC_ICPR_CLRPEND_8 ((uint32_t)0x00000100U) /* bit 8 */ +#define NVIC_ICPR_CLRPEND_9 ((uint32_t)0x00000200U) /* bit 9 */ +#define NVIC_ICPR_CLRPEND_10 ((uint32_t)0x00000400U) /* bit 10 */ +#define NVIC_ICPR_CLRPEND_11 ((uint32_t)0x00000800U) /* bit 11 */ +#define NVIC_ICPR_CLRPEND_12 ((uint32_t)0x00001000U) /* bit 12 */ +#define NVIC_ICPR_CLRPEND_13 ((uint32_t)0x00002000U) /* bit 13 */ +#define NVIC_ICPR_CLRPEND_14 ((uint32_t)0x00004000U) /* bit 14 */ +#define NVIC_ICPR_CLRPEND_15 ((uint32_t)0x00008000U) /* bit 15 */ +#define NVIC_ICPR_CLRPEND_16 ((uint32_t)0x00010000U) /* bit 16 */ +#define NVIC_ICPR_CLRPEND_17 ((uint32_t)0x00020000U) /* bit 17 */ +#define NVIC_ICPR_CLRPEND_18 ((uint32_t)0x00040000U) /* bit 18 */ +#define NVIC_ICPR_CLRPEND_19 ((uint32_t)0x00080000U) /* bit 19 */ +#define NVIC_ICPR_CLRPEND_20 ((uint32_t)0x00100000U) /* bit 20 */ +#define NVIC_ICPR_CLRPEND_21 ((uint32_t)0x00200000U) /* bit 21 */ +#define NVIC_ICPR_CLRPEND_22 ((uint32_t)0x00400000U) /* bit 22 */ +#define NVIC_ICPR_CLRPEND_23 ((uint32_t)0x00800000U) /* bit 23 */ +#define NVIC_ICPR_CLRPEND_24 ((uint32_t)0x01000000U) /* bit 24 */ +#define NVIC_ICPR_CLRPEND_25 ((uint32_t)0x02000000U) /* bit 25 */ +#define NVIC_ICPR_CLRPEND_26 ((uint32_t)0x04000000U) /* bit 26 */ +#define NVIC_ICPR_CLRPEND_27 ((uint32_t)0x08000000U) /* bit 27 */ +#define NVIC_ICPR_CLRPEND_28 ((uint32_t)0x10000000U) /* bit 28 */ +#define NVIC_ICPR_CLRPEND_29 ((uint32_t)0x20000000U) /* bit 29 */ +#define NVIC_ICPR_CLRPEND_30 ((uint32_t)0x40000000U) /* bit 30 */ +#define NVIC_ICPR_CLRPEND_31 ((uint32_t)0x80000000U) /* bit 31 */ + +/** Bit definition for NVIC_IABR register **/ +#define NVIC_IABR_ACTIVE ((uint32_t)0xFFFFFFFFU) /* Interrupt active flags */ +#define NVIC_IABR_ACTIVE_0 ((uint32_t)0x00000001U) /* bit 0 */ +#define NVIC_IABR_ACTIVE_1 ((uint32_t)0x00000002U) /* bit 1 */ +#define NVIC_IABR_ACTIVE_2 ((uint32_t)0x00000004U) /* bit 2 */ +#define NVIC_IABR_ACTIVE_3 ((uint32_t)0x00000008U) /* bit 3 */ +#define NVIC_IABR_ACTIVE_4 ((uint32_t)0x00000010U) /* bit 4 */ +#define NVIC_IABR_ACTIVE_5 ((uint32_t)0x00000020U) /* bit 5 */ +#define NVIC_IABR_ACTIVE_6 ((uint32_t)0x00000040U) /* bit 6 */ +#define NVIC_IABR_ACTIVE_7 ((uint32_t)0x00000080U) /* bit 7 */ +#define NVIC_IABR_ACTIVE_8 ((uint32_t)0x00000100U) /* bit 8 */ +#define NVIC_IABR_ACTIVE_9 ((uint32_t)0x00000200U) /* bit 9 */ +#define NVIC_IABR_ACTIVE_10 ((uint32_t)0x00000400U) /* bit 10 */ +#define NVIC_IABR_ACTIVE_11 ((uint32_t)0x00000800U) /* bit 11 */ +#define NVIC_IABR_ACTIVE_12 ((uint32_t)0x00001000U) /* bit 12 */ +#define NVIC_IABR_ACTIVE_13 ((uint32_t)0x00002000U) /* bit 13 */ +#define NVIC_IABR_ACTIVE_14 ((uint32_t)0x00004000U) /* bit 14 */ +#define NVIC_IABR_ACTIVE_15 ((uint32_t)0x00008000U) /* bit 15 */ +#define NVIC_IABR_ACTIVE_16 ((uint32_t)0x00010000U) /* bit 16 */ +#define NVIC_IABR_ACTIVE_17 ((uint32_t)0x00020000U) /* bit 17 */ +#define NVIC_IABR_ACTIVE_18 ((uint32_t)0x00040000U) /* bit 18 */ +#define NVIC_IABR_ACTIVE_19 ((uint32_t)0x00080000U) /* bit 19 */ +#define NVIC_IABR_ACTIVE_20 ((uint32_t)0x00100000U) /* bit 20 */ +#define NVIC_IABR_ACTIVE_21 ((uint32_t)0x00200000U) /* bit 21 */ +#define NVIC_IABR_ACTIVE_22 ((uint32_t)0x00400000U) /* bit 22 */ +#define NVIC_IABR_ACTIVE_23 ((uint32_t)0x00800000U) /* bit 23 */ +#define NVIC_IABR_ACTIVE_24 ((uint32_t)0x01000000U) /* bit 24 */ +#define NVIC_IABR_ACTIVE_25 ((uint32_t)0x02000000U) /* bit 25 */ +#define NVIC_IABR_ACTIVE_26 ((uint32_t)0x04000000U) /* bit 26 */ +#define NVIC_IABR_ACTIVE_27 ((uint32_t)0x08000000U) /* bit 27 */ +#define NVIC_IABR_ACTIVE_28 ((uint32_t)0x10000000U) /* bit 28 */ +#define NVIC_IABR_ACTIVE_29 ((uint32_t)0x20000000U) /* bit 29 */ +#define NVIC_IABR_ACTIVE_30 ((uint32_t)0x40000000U) /* bit 30 */ +#define NVIC_IABR_ACTIVE_31 ((uint32_t)0x80000000U) /* bit 31 */ + +/** Bit definition for NVIC_PRI0 register **/ +#define NVIC_IPR0_PRI_0 ((uint32_t)0x000000FFU) /* Priority of interrupt 0 */ +#define NVIC_IPR0_PRI_1 ((uint32_t)0x0000FF00U) /* Priority of interrupt 1 */ +#define NVIC_IPR0_PRI_2 ((uint32_t)0x00FF0000U) /* Priority of interrupt 2 */ +#define NVIC_IPR0_PRI_3 ((uint32_t)0xFF000000U) /* Priority of interrupt 3 */ + +/** Bit definition for NVIC_PRI1 register **/ +#define NVIC_IPR1_PRI_4 ((uint32_t)0x000000FFU) /* Priority of interrupt 4 */ +#define NVIC_IPR1_PRI_5 ((uint32_t)0x0000FF00U) /* Priority of interrupt 5 */ +#define NVIC_IPR1_PRI_6 ((uint32_t)0x00FF0000U) /* Priority of interrupt 6 */ +#define NVIC_IPR1_PRI_7 ((uint32_t)0xFF000000U) /* Priority of interrupt 7 */ + +/** Bit definition for NVIC_PRI2 register **/ +#define NVIC_IPR2_PRI_8 ((uint32_t)0x000000FFU) /* Priority of interrupt 8 */ +#define NVIC_IPR2_PRI_9 ((uint32_t)0x0000FF00U) /* Priority of interrupt 9 */ +#define NVIC_IPR2_PRI_10 ((uint32_t)0x00FF0000U) /* Priority of interrupt 10 */ +#define NVIC_IPR2_PRI_11 ((uint32_t)0xFF000000U) /* Priority of interrupt 11 */ + +/** Bit definition for NVIC_PRI3 register **/ +#define NVIC_IPR3_PRI_12 ((uint32_t)0x000000FFU) /* Priority of interrupt 12 */ +#define NVIC_IPR3_PRI_13 ((uint32_t)0x0000FF00U) /* Priority of interrupt 13 */ +#define NVIC_IPR3_PRI_14 ((uint32_t)0x00FF0000U) /* Priority of interrupt 14 */ +#define NVIC_IPR3_PRI_15 ((uint32_t)0xFF000000U) /* Priority of interrupt 15 */ + +/** Bit definition for NVIC_PRI4 register **/ +#define NVIC_IPR4_PRI_16 ((uint32_t)0x000000FFU) /* Priority of interrupt 16 */ +#define NVIC_IPR4_PRI_17 ((uint32_t)0x0000FF00U) /* Priority of interrupt 17 */ +#define NVIC_IPR4_PRI_18 ((uint32_t)0x00FF0000U) /* Priority of interrupt 18 */ +#define NVIC_IPR4_PRI_19 ((uint32_t)0xFF000000U) /* Priority of interrupt 19 */ + +/** Bit definition for NVIC_PRI5 register **/ +#define NVIC_IPR5_PRI_20 ((uint32_t)0x000000FFU) /* Priority of interrupt 20 */ +#define NVIC_IPR5_PRI_21 ((uint32_t)0x0000FF00U) /* Priority of interrupt 21 */ +#define NVIC_IPR5_PRI_22 ((uint32_t)0x00FF0000U) /* Priority of interrupt 22 */ +#define NVIC_IPR5_PRI_23 ((uint32_t)0xFF000000U) /* Priority of interrupt 23 */ + +/** Bit definition for NVIC_PRI6 register **/ +#define NVIC_IPR6_PRI_24 ((uint32_t)0x000000FFU) /* Priority of interrupt 24 */ +#define NVIC_IPR6_PRI_25 ((uint32_t)0x0000FF00U) /* Priority of interrupt 25 */ +#define NVIC_IPR6_PRI_26 ((uint32_t)0x00FF0000U) /* Priority of interrupt 26 */ +#define NVIC_IPR6_PRI_27 ((uint32_t)0xFF000000U) /* Priority of interrupt 27 */ + +/** Bit definition for NVIC_PRI7 register **/ +#define NVIC_IPR7_PRI_28 ((uint32_t)0x000000FFU) /* Priority of interrupt 28 */ +#define NVIC_IPR7_PRI_29 ((uint32_t)0x0000FF00U) /* Priority of interrupt 29 */ +#define NVIC_IPR7_PRI_30 ((uint32_t)0x00FF0000U) /* Priority of interrupt 30 */ +#define NVIC_IPR7_PRI_31 ((uint32_t)0xFF000000U) /* Priority of interrupt 31 */ + +/** Bit definition for SCB_CPUID register **/ +#define SCB_CPUID_REVISION ((uint32_t)0x0000000FU) /* Implementation defined revision number */ +#define SCB_CPUID_PARTNO ((uint32_t)0x0000FFF0U) /* Number of processor within family */ +#define SCB_CPUID_Constant ((uint32_t)0x000F0000U) /* Reads as 0x0F */ +#define SCB_CPUID_VARIANT ((uint32_t)0x00F00000U) /* Implementation defined variant number */ +#define SCB_CPUID_IMPLEMENTER ((uint32_t)0xFF000000U) /* Implementer code. ARM is 0x41 */ + +/** Bit definition for SCB_ICSR register **/ +#define SCB_ICSR_VECTACTIVE ((uint32_t)0x000001FFU) /* Active INTSTS number field */ +#define SCB_ICSR_RETTOBASE ((uint32_t)0x00000800U) /* All active exceptions minus the IPSR_current_exception yields the empty set */ +#define SCB_ICSR_VECTPENDING ((uint32_t)0x003FF000U) /* Pending INTSTS number field */ +#define SCB_ICSR_ISRPENDING ((uint32_t)0x00400000U) /* Interrupt pending flag */ +#define SCB_ICSR_ISRPREEMPT ((uint32_t)0x00800000U) /* It indicates that a pending interrupt becomes active in the next running cycle */ +#define SCB_ICSR_PENDSTCLR ((uint32_t)0x02000000U) /* Clear pending SysTick bit */ +#define SCB_ICSR_PENDSTSET ((uint32_t)0x04000000U) /* Set pending SysTick bit */ +#define SCB_ICSR_PENDSVCLR ((uint32_t)0x08000000U) /* Clear pending pendSV bit */ +#define SCB_ICSR_PENDSVSET ((uint32_t)0x10000000U) /* Set pending pendSV bit */ +#define SCB_ICSR_NMIPENDSET ((uint32_t)0x80000000U) /* Set pending NMI bit */ + +/** Bit definition for SCB_VTOR register **/ +#define SCB_VTOR_TBLOFF ((uint32_t)0x1FFFFF80U) /* Vector table base offset field */ +#define SCB_VTOR_TBLBASE ((uint32_t)0x20000000U) /* Table base in code(0) or RAM(1) */ + +/** Bit definition for SCB_AIRCR register **/ +#define SCB_AIRCR_VECTRESET ((uint32_t)0x00000001U) /* System Reset bit */ +#define SCB_AIRCR_VECTCLRACTIVE ((uint32_t)0x00000002U) /* Clear active vector bit */ +#define SCB_AIRCR_SYSRESETREQ ((uint32_t)0x00000004U) /* Requests chip control logic to generate a reset */ + +#define SCB_AIRCR_PRIGROUP ((uint32_t)0x00000700U) /* PRIGROUP[2:0] bits (Priority group) */ +#define SCB_AIRCR_PRIGROUP_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define SCB_AIRCR_PRIGROUP_1 ((uint32_t)0x00000200U) /* Bit 1 */ +#define SCB_AIRCR_PRIGROUP_2 ((uint32_t)0x00000400U) /* Bit 2 */ + +/** prority group configuration **/ +#define SCB_AIRCR_PRIGROUP0 ((uint32_t)0x00000000U) /* Priority group=0 (7 bits of pre-emption priority, 1 bit of subpriority) */ +#define SCB_AIRCR_PRIGROUP1 ((uint32_t)0x00000100U) /* Priority group=1 (6 bits of pre-emption priority, 2 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP2 ((uint32_t)0x00000200U) /* Priority group=2 (5 bits of pre-emption priority, 3 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP3 ((uint32_t)0x00000300U) /* Priority group=3 (4 bits of pre-emption priority, 4 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP4 ((uint32_t)0x00000400U) /* Priority group=4 (3 bits of pre-emption priority, 5 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP5 ((uint32_t)0x00000500U) /* Priority group=5 (2 bits of pre-emption priority, 6 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP6 ((uint32_t)0x00000600U) /* Priority group=6 (1 bit of pre-emption priority, 7 bits of subpriority) */ +#define SCB_AIRCR_PRIGROUP7 ((uint32_t)0x00000700U) /* Priority group=7 (no pre-emption priority, 8 bits of subpriority) */ + +#define SCB_AIRCR_ENDIANESS ((uint32_t)0x00008000U) /* Data endianness bit */ +#define SCB_AIRCR_VECTKEY ((uint32_t)0xFFFF0000U) /* Register key (VECTKEY) - Reads as 0xFA05 (VECTKEYSTAT) */ + +/** Bit definition for SCB_SCR register **/ +#define SCB_SCR_SLEEPONEXIT ((uint8_t)0x02U) /* Sleep on exit bit */ +#define SCB_SCR_SLEEPDEEP ((uint8_t)0x04U) /* Sleep deep bit */ +#define SCB_SCR_SEVONPEND ((uint8_t)0x10U) /* Wake up from WFE */ + +/** Bit definition for SCB_CCR register **/ +#define SCB_CCR_NONBASETHRDENA ((uint16_t)0x0001U) /* Thread mode can be entered from any level in Handler mode by controlled return value */ +#define SCB_CCR_USERSETMPEND ((uint16_t)0x0002U) /* Enables user code to write the Software Trigger Interrupt register to trigger (pend) a \ + Main exception */ +#define SCB_CCR_UNALIGN_TRP ((uint16_t)0x0008U) /* Trap for unaligned access */ +#define SCB_CCR_DIV_0_TRP ((uint16_t)0x0010U) /* Trap on Divide by 0 */ +#define SCB_CCR_BFHFNMIGN ((uint16_t)0x0100U) /* Handlers running at priority -1 and -2 */ +#define SCB_CCR_STKALIGN ((uint16_t)0x0200U) /* On exception entry, the SP used prior to the exception is adjusted to be 8-byte aligned */ + +/** Bit definition for SCB_SHPR register **/ +#define SCB_SHPR_PRI_N ((uint32_t)0x000000FFU) /* Priority of system handler 4,8, and 12. Mem Manage, reserved and Debug Monitor */ +#define SCB_SHPR_PRI_N1 ((uint32_t)0x0000FF00U) /* Priority of system handler 5,9, and 13. Bus Fault, reserved and reserved */ +#define SCB_SHPR_PRI_N2 ((uint32_t)0x00FF0000U) /* Priority of system handler 6,10, and 14. Usage Fault, reserved and PendSV */ +#define SCB_SHPR_PRI_N3 ((uint32_t)0xFF000000U) /* Priority of system handler 7,11, and 15. Reserved, SVCall and SysTick */ + +/** Bit definition for SCB_SHCSR register **/ +#define SCB_SHCSR_MEMFAULTACT ((uint32_t)0x00000001U) /* MemManage is active */ +#define SCB_SHCSR_BUSFAULTACT ((uint32_t)0x00000002U) /* BusFault is active */ +#define SCB_SHCSR_USGFAULTACT ((uint32_t)0x00000008U) /* UsageFault is active */ +#define SCB_SHCSR_SVCALLACT ((uint32_t)0x00000080U) /* SVCall is active */ +#define SCB_SHCSR_MONITORACT ((uint32_t)0x00000100U) /* Monitor is active */ +#define SCB_SHCSR_PENDSVACT ((uint32_t)0x00000400U) /* PendSV is active */ +#define SCB_SHCSR_SYSTICKACT ((uint32_t)0x00000800U) /* SysTick is active */ +#define SCB_SHCSR_USGFAULTPENDED ((uint32_t)0x00001000U) /* Usage Fault is pended */ +#define SCB_SHCSR_MEMFAULTPENDED ((uint32_t)0x00002000U) /* MemManage is pended */ +#define SCB_SHCSR_BUSFAULTPENDED ((uint32_t)0x00004000U) /* Bus Fault is pended */ +#define SCB_SHCSR_SVCALLPENDED ((uint32_t)0x00008000U) /* SVCall is pended */ +#define SCB_SHCSR_MEMFAULTENA ((uint32_t)0x00010000U) /* MemManage enable */ +#define SCB_SHCSR_BUSFAULTENA ((uint32_t)0x00020000U) /* Bus Fault enable */ +#define SCB_SHCSR_USGFAULTENA ((uint32_t)0x00040000U) /* UsageFault enable */ + +/*** Bit definition for SCB_CFSR register ***/ +/** MFSR **/ +#define SCB_CFSR_IACCVIOL ((uint32_t)0x00000001U) /* Instruction access violation */ +#define SCB_CFSR_DACCVIOL ((uint32_t)0x00000002U) /* Data access violation */ +#define SCB_CFSR_MUNSTKERR ((uint32_t)0x00000008U) /* Unstacking error */ +#define SCB_CFSR_MSTKERR ((uint32_t)0x00000010U) /* Stacking error */ +#define SCB_CFSR_MMARVALID ((uint32_t)0x00000080U) /* Memory Manage Address Register address valid flag */ +/** BFSR **/ +#define SCB_CFSR_IBUSERR ((uint32_t)0x00000100U) /* Instruction bus error flag */ +#define SCB_CFSR_PRECISERR ((uint32_t)0x00000200U) /* Precise data bus error */ +#define SCB_CFSR_IMPRECISERR ((uint32_t)0x00000400U) /* Imprecise data bus error */ +#define SCB_CFSR_UNSTKERR ((uint32_t)0x00000800U) /* Unstacking error */ +#define SCB_CFSR_STKERR ((uint32_t)0x00001000U) /* Stacking error */ +#define SCB_CFSR_BFARVALID ((uint32_t)0x00008000U) /* Bus Fault Address Register address valid flag */ +/** UFSR **/ +#define SCB_CFSR_UNDEFINSTR ((uint32_t)0x00010000U) /* The processor attempt to execute an undefined instruction */ +#define SCB_CFSR_INVSTATE ((uint32_t)0x00020000U) /* Invalid combination of EPSR and instruction */ +#define SCB_CFSR_INVPC ((uint32_t)0x00040000U) /* Attempt to load EXC_RETURN into pc illegally */ +#define SCB_CFSR_NOCP ((uint32_t)0x00080000U) /* Attempt to use a coprocessor instruction */ +#define SCB_CFSR_UNALIGNED ((uint32_t)0x01000000U) /* Fault occurs when there is an attempt to make an unaligned memory access */ +#define SCB_CFSR_DIVBYZERO ((uint32_t)0x02000000U) /* Fault occurs when SDIV or DIV instruction is used with a divisor of 0 */ + +/** Bit definition for SCB_HFSR register **/ +#define SCB_HFSR_VECTTBL ((uint32_t)0x00000002U) /* Fault occurs because of vector table read on exception processing */ +#define SCB_HFSR_FORCED ((uint32_t)0x40000000U) /* Hard Fault activated when a configurable Fault was received and cannot activate */ +#define SCB_HFSR_DEBUGEVT ((uint32_t)0x80000000U) /* Fault related to debug */ + +/** Bit definition for SCB_DFSR register **/ +#define SCB_DFSR_HALTED ((uint8_t)0x01U) /* Halt request flag */ +#define SCB_DFSR_BKPT ((uint8_t)0x02U) /* BKPT flag */ +#define SCB_DFSR_DWTTRAP ((uint8_t)0x04U) /* Data Watchpoint and Trace (DWT) flag */ +#define SCB_DFSR_VCATCH ((uint8_t)0x08U) /* Vector catch flag */ +#define SCB_DFSR_EXTERNAL ((uint8_t)0x10U) /* External debug request flag */ + +/** Bit definition for SCB_MMFAR register **/ +#define SCB_MMFAR_ADDRESS ((uint32_t)0xFFFFFFFFU) /* Mem Manage fault address field */ + +/** Bit definition for SCB_BFAR register **/ +#define SCB_BFAR_ADDRESS ((uint32_t)0xFFFFFFFFU) /* Bus fault address field */ + +/** Bit definition for SCB_afsr register **/ +#define SCB_AFSR_IMPDEF ((uint32_t)0xFFFFFFFFU) /* Implementation defined */ + /******************************************************************************/ + /* */ + /* External Interrupt/Event Controller */ + /* */ + /******************************************************************************/ +/******** Bit definition for EXTI_RT_CFG0 register ********/ +#define EXTI_RT_CFG0_RT_CFG0x ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_RT_CFG0_RT_CFG0x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_RT_CFG0_RT_CFG0x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_RT_CFG0_RT_CFG0x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_RT_CFG0_RT_CFG0x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_RT_CFG0_RT_CFG0x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_RT_CFG0_RT_CFG0x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_RT_CFG0_RT_CFG0x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_RT_CFG0_RT_CFG0x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_RT_CFG0_RT_CFG0x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_RT_CFG0_RT_CFG0x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_RT_CFG0_RT_CFG0x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_RT_CFG0_RT_CFG0x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_RT_CFG0_RT_CFG0x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_RT_CFG0_RT_CFG0x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_RT_CFG0_RT_CFG0x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_RT_CFG0_RT_CFG0x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_RT_CFG0_RT_CFG0x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_RT_CFG0_RT_CFG0x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_RT_CFG0_RT_CFG0x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_RT_CFG0_RT_CFG0x_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_RT_CFG0_RT_CFG0x_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_RT_CFG0_RT_CFG0x_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_RT_CFG0_RT_CFG0x_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_RT_CFG0_RT_CFG0x_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_RT_CFG0_RT_CFG0x_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_RT_CFG0_RT_CFG0x_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_RT_CFG0_RT_CFG0x_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_RT_CFG0_RT_CFG0x_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_RT_CFG0_RT_CFG0x_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_RT_CFG0_RT_CFG0x_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_RT_CFG0_RT_CFG0x_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_RT_CFG0_RT_CFG0x_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_RT_CFG1 register ********/ +#define EXTI_RT_CFG1_RT_CFG1x ((uint32_t)0x000FFFFFU) /* Bit[19:0] */ +#define EXTI_RT_CFG1_RT_CFG1x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_RT_CFG1_RT_CFG1x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_RT_CFG1_RT_CFG1x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_RT_CFG1_RT_CFG1x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_RT_CFG1_RT_CFG1x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_RT_CFG1_RT_CFG1x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_RT_CFG1_RT_CFG1x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_RT_CFG1_RT_CFG1x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_RT_CFG1_RT_CFG1x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_RT_CFG1_RT_CFG1x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_RT_CFG1_RT_CFG1x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_RT_CFG1_RT_CFG1x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_RT_CFG1_RT_CFG1x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_RT_CFG1_RT_CFG1x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_RT_CFG1_RT_CFG1x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_RT_CFG1_RT_CFG1x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_RT_CFG1_RT_CFG1x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_RT_CFG1_RT_CFG1x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_RT_CFG1_RT_CFG1x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_RT_CFG1_RT_CFG1x_19 ((uint32_t)0x00080000U) /* Bit19*/ + +/******** Bit definition for EXTI_FT_CFG0 register ********/ +#define EXTI_FT_CFG0_FT_CFG0x ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_FT_CFG0_FT_CFG0x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_FT_CFG0_FT_CFG0x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_FT_CFG0_FT_CFG0x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_FT_CFG0_FT_CFG0x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_FT_CFG0_FT_CFG0x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_FT_CFG0_FT_CFG0x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_FT_CFG0_FT_CFG0x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_FT_CFG0_FT_CFG0x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_FT_CFG0_FT_CFG0x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_FT_CFG0_FT_CFG0x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_FT_CFG0_FT_CFG0x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_FT_CFG0_FT_CFG0x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_FT_CFG0_FT_CFG0x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_FT_CFG0_FT_CFG0x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_FT_CFG0_FT_CFG0x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_FT_CFG0_FT_CFG0x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_FT_CFG0_FT_CFG0x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_FT_CFG0_FT_CFG0x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_FT_CFG0_FT_CFG0x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_FT_CFG0_FT_CFG0x_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_FT_CFG0_FT_CFG0x_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_FT_CFG0_FT_CFG0x_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_FT_CFG0_FT_CFG0x_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_FT_CFG0_FT_CFG0x_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_FT_CFG0_FT_CFG0x_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_FT_CFG0_FT_CFG0x_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_FT_CFG0_FT_CFG0x_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_FT_CFG0_FT_CFG0x_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_FT_CFG0_FT_CFG0x_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_FT_CFG0_FT_CFG0x_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_FT_CFG0_FT_CFG0x_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_FT_CFG0_FT_CFG0x_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_FT_CFG1 register ********/ +#define EXTI_FT_CFG1_FT_CFG1x ((uint32_t)0x000FFFFFU) /* Bit[19:0] */ +#define EXTI_FT_CFG1_FT_CFG1x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_FT_CFG1_FT_CFG1x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_FT_CFG1_FT_CFG1x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_FT_CFG1_FT_CFG1x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_FT_CFG1_FT_CFG1x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_FT_CFG1_FT_CFG1x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_FT_CFG1_FT_CFG1x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_FT_CFG1_FT_CFG1x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_FT_CFG1_FT_CFG1x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_FT_CFG1_FT_CFG1x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_FT_CFG1_FT_CFG1x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_FT_CFG1_FT_CFG1x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_FT_CFG1_FT_CFG1x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_FT_CFG1_FT_CFG1x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_FT_CFG1_FT_CFG1x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_FT_CFG1_FT_CFG1x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_FT_CFG1_FT_CFG1x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_FT_CFG1_FT_CFG1x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_FT_CFG1_FT_CFG1x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_FT_CFG1_FT_CFG1x_19 ((uint32_t)0x00080000U) /* Bit19*/ + +/******** Bit definition for EXTI_SWIE0 register ********/ +#define EXTI_SWIE0_SWIE0x ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_SWIE0_SWIE0x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_SWIE0_SWIE0x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_SWIE0_SWIE0x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_SWIE0_SWIE0x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_SWIE0_SWIE0x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_SWIE0_SWIE0x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_SWIE0_SWIE0x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_SWIE0_SWIE0x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_SWIE0_SWIE0x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_SWIE0_SWIE0x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_SWIE0_SWIE0x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_SWIE0_SWIE0x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_SWIE0_SWIE0x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_SWIE0_SWIE0x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_SWIE0_SWIE0x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_SWIE0_SWIE0x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_SWIE0_SWIE0x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_SWIE0_SWIE0x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_SWIE0_SWIE0x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_SWIE0_SWIE0x_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_SWIE0_SWIE0x_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_SWIE0_SWIE0x_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_SWIE0_SWIE0x_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_SWIE0_SWIE0x_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_SWIE0_SWIE0x_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_SWIE0_SWIE0x_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_SWIE0_SWIE0x_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_SWIE0_SWIE0x_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_SWIE0_SWIE0x_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_SWIE0_SWIE0x_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_SWIE0_SWIE0x_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_SWIE0_SWIE0x_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_SWIE1 register ********/ +#define EXTI_SWIE1_SWIE1x ((uint32_t)0x000FFFFFU) /* Bit[19:0] */ +#define EXTI_SWIE1_SWIE1x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_SWIE1_SWIE1x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_SWIE1_SWIE1x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_SWIE1_SWIE1x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_SWIE1_SWIE1x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_SWIE1_SWIE1x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_SWIE1_SWIE1x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_SWIE1_SWIE1x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_SWIE1_SWIE1x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_SWIE1_SWIE1x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_SWIE1_SWIE1x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_SWIE1_SWIE1x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_SWIE1_SWIE1x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_SWIE1_SWIE1x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_SWIE1_SWIE1x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_SWIE1_SWIE1x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_SWIE1_SWIE1x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_SWIE1_SWIE1x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_SWIE1_SWIE1x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_SWIE1_SWIE1x_19 ((uint32_t)0x00080000U) /* Bit19*/ + +/******** Bit definition for EXTI_M7IMASK0 register ********/ +#define EXTI_M7IMASK0_M7IMSK0x ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_M7IMASK0_M7IMSK0x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M7IMASK0_M7IMSK0x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M7IMASK0_M7IMSK0x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M7IMASK0_M7IMSK0x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M7IMASK0_M7IMSK0x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M7IMASK0_M7IMSK0x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M7IMASK0_M7IMSK0x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M7IMASK0_M7IMSK0x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M7IMASK0_M7IMSK0x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M7IMASK0_M7IMSK0x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M7IMASK0_M7IMSK0x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M7IMASK0_M7IMSK0x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M7IMASK0_M7IMSK0x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M7IMASK0_M7IMSK0x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M7IMASK0_M7IMSK0x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M7IMASK0_M7IMSK0x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M7IMASK0_M7IMSK0x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M7IMASK0_M7IMSK0x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M7IMASK0_M7IMSK0x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M7IMASK0_M7IMSK0x_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M7IMASK0_M7IMSK0x_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M7IMASK0_M7IMSK0x_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M7IMASK0_M7IMSK0x_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M7IMASK0_M7IMSK0x_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M7IMASK0_M7IMSK0x_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M7IMASK0_M7IMSK0x_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M7IMASK0_M7IMSK0x_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_M7IMASK0_M7IMSK0x_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_M7IMASK0_M7IMSK0x_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_M7IMASK0_M7IMSK0x_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_M7IMASK0_M7IMSK0x_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_M7IMASK0_M7IMSK0x_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_M7IMASK1 register ********/ +#define EXTI_M7IMASK1_M7IMSK1x ((uint32_t)0x000FFFFFU) /* Bit[19:0] */ +#define EXTI_M7IMASK1_M7IMSK1x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M7IMASK1_M7IMSK1x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M7IMASK1_M7IMSK1x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M7IMASK1_M7IMSK1x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M7IMASK1_M7IMSK1x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M7IMASK1_M7IMSK1x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M7IMASK1_M7IMSK1x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M7IMASK1_M7IMSK1x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M7IMASK1_M7IMSK1x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M7IMASK1_M7IMSK1x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M7IMASK1_M7IMSK1x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M7IMASK1_M7IMSK1x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M7IMASK1_M7IMSK1x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M7IMASK1_M7IMSK1x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M7IMASK1_M7IMSK1x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M7IMASK1_M7IMSK1x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M7IMASK1_M7IMSK1x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M7IMASK1_M7IMSK1x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M7IMASK1_M7IMSK1x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M7IMASK1_M7IMSK1x_19 ((uint32_t)0x00080000U) /* Bit19*/ + +/******** Bit definition for EXTI_M4IMASK0 register ********/ +#define EXTI_M4IMASK0_M4IMSK0x ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_M4IMASK0_M4IMSK0x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M4IMASK0_M4IMSK0x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M4IMASK0_M4IMSK0x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M4IMASK0_M4IMSK0x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M4IMASK0_M4IMSK0x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M4IMASK0_M4IMSK0x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M4IMASK0_M4IMSK0x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M4IMASK0_M4IMSK0x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M4IMASK0_M4IMSK0x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M4IMASK0_M4IMSK0x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M4IMASK0_M4IMSK0x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M4IMASK0_M4IMSK0x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M4IMASK0_M4IMSK0x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M4IMASK0_M4IMSK0x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M4IMASK0_M4IMSK0x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M4IMASK0_M4IMSK0x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M4IMASK0_M4IMSK0x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M4IMASK0_M4IMSK0x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M4IMASK0_M4IMSK0x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M4IMASK0_M4IMSK0x_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M4IMASK0_M4IMSK0x_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M4IMASK0_M4IMSK0x_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M4IMASK0_M4IMSK0x_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M4IMASK0_M4IMSK0x_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M4IMASK0_M4IMSK0x_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M4IMASK0_M4IMSK0x_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M4IMASK0_M4IMSK0x_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_M4IMASK0_M4IMSK0x_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_M4IMASK0_M4IMSK0x_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_M4IMASK0_M4IMSK0x_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_M4IMASK0_M4IMSK0x_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_M4IMASK0_M4IMSK0x_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_M4IMASK1 register ********/ +#define EXTI_M4IMASK1_M4IMSK1x ((uint32_t)0x000FFFFFU) /* Bit[19:0] */ +#define EXTI_M4IMASK1_M4IMSK1x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M4IMASK1_M4IMSK1x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M4IMASK1_M4IMSK1x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M4IMASK1_M4IMSK1x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M4IMASK1_M4IMSK1x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M4IMASK1_M4IMSK1x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M4IMASK1_M4IMSK1x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M4IMASK1_M4IMSK1x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M4IMASK1_M4IMSK1x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M4IMASK1_M4IMSK1x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M4IMASK1_M4IMSK1x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M4IMASK1_M4IMSK1x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M4IMASK1_M4IMSK1x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M4IMASK1_M4IMSK1x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M4IMASK1_M4IMSK1x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M4IMASK1_M4IMSK1x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M4IMASK1_M4IMSK1x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M4IMASK1_M4IMSK1x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M4IMASK1_M4IMSK1x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M4IMASK1_M4IMSK1x_19 ((uint32_t)0x00080000U) /* Bit19*/ + +/******** Bit definition for EXTI_M7EMASK0 register ********/ +#define EXTI_M7EMASK0_M7EMASK0x ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_M7EMASK0_M7EMASK0x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M7EMASK0_M7EMASK0x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M7EMASK0_M7EMASK0x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M7EMASK0_M7EMASK0x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M7EMASK0_M7EMASK0x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M7EMASK0_M7EMASK0x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M7EMASK0_M7EMASK0x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M7EMASK0_M7EMASK0x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M7EMASK0_M7EMASK0x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M7EMASK0_M7EMASK0x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M7EMASK0_M7EMASK0x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M7EMASK0_M7EMASK0x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M7EMASK0_M7EMASK0x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M7EMASK0_M7EMASK0x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M7EMASK0_M7EMASK0x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M7EMASK0_M7EMASK0x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M7EMASK0_M7EMASK0x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M7EMASK0_M7EMASK0x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M7EMASK0_M7EMASK0x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M7EMASK0_M7EMASK0x_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M7EMASK0_M7EMASK0x_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M7EMASK0_M7EMASK0x_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M7EMASK0_M7EMASK0x_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M7EMASK0_M7EMASK0x_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M7EMASK0_M7EMASK0x_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M7EMASK0_M7EMASK0x_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M7EMASK0_M7EMASK0x_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_M7EMASK0_M7EMASK0x_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_M7EMASK0_M7EMASK0x_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_M7EMASK0_M7EMASK0x_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_M7EMASK0_M7EMASK0x_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_M7EMASK0_M7EMASK0x_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_M7EMASK1 register ********/ +#define EXTI_M7EMASK1_M7EMASK1x ((uint32_t)0x000FFFFFU) /* Bit[19:0] */ +#define EXTI_M7EMASK1_M7EMASK1x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M7EMASK1_M7EMASK1x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M7EMASK1_M7EMASK1x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M7EMASK1_M7EMASK1x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M7EMASK1_M7EMASK1x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M7EMASK1_M7EMASK1x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M7EMASK1_M7EMASK1x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M7EMASK1_M7EMASK1x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M7EMASK1_M7EMASK1x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M7EMASK1_M7EMASK1x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M7EMASK1_M7EMASK1x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M7EMASK1_M7EMASK1x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M7EMASK1_M7EMASK1x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M7EMASK1_M7EMASK1x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M7EMASK1_M7EMASK1x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M7EMASK1_M7EMASK1x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M7EMASK1_M7EMASK1x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M7EMASK1_M7EMASK1x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M7EMASK1_M7EMASK1x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M7EMASK1_M7EMASK1x_19 ((uint32_t)0x00080000U) /* Bit19*/ + +/******** Bit definition for EXTI_M4EMASK0 register ********/ +#define EXTI_M4EMASK0_M4EMASK0x ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_M4EMASK0_M4EMASK0x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M4EMASK0_M4EMASK0x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M4EMASK0_M4EMASK0x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M4EMASK0_M4EMASK0x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M4EMASK0_M4EMASK0x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M4EMASK0_M4EMASK0x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M4EMASK0_M4EMASK0x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M4EMASK0_M4EMASK0x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M4EMASK0_M4EMASK0x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M4EMASK0_M4EMASK0x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M4EMASK0_M4EMASK0x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M4EMASK0_M4EMASK0x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M4EMASK0_M4EMASK0x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M4EMASK0_M4EMASK0x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M4EMASK0_M4EMASK0x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M4EMASK0_M4EMASK0x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M4EMASK0_M4EMASK0x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M4EMASK0_M4EMASK0x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M4EMASK0_M4EMASK0x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M4EMASK0_M4EMASK0x_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M4EMASK0_M4EMASK0x_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M4EMASK0_M4EMASK0x_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M4EMASK0_M4EMASK0x_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M4EMASK0_M4EMASK0x_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M4EMASK0_M4EMASK0x_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M4EMASK0_M4EMASK0x_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M4EMASK0_M4EMASK0x_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_M4EMASK0_M4EMASK0x_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_M4EMASK0_M4EMASK0x_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_M4EMASK0_M4EMASK0x_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_M4EMASK0_M4EMASK0x_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_M4EMASK0_M4EMASK0x_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_M4EMASK1 register ********/ +#define EXTI_M4EMASK1_M4EMASK1x ((uint32_t)0x000FFFFFU) /* Bit[19:0] */ +#define EXTI_M4EMASK1_M4EMASK1x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M4EMASK1_M4EMASK1x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M4EMASK1_M4EMASK1x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M4EMASK1_M4EMASK1x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M4EMASK1_M4EMASK1x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M4EMASK1_M4EMASK1x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M4EMASK1_M4EMASK1x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M4EMASK1_M4EMASK1x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M4EMASK1_M4EMASK1x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M4EMASK1_M4EMASK1x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M4EMASK1_M4EMASK1x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M4EMASK1_M4EMASK1x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M4EMASK1_M4EMASK1x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M4EMASK1_M4EMASK1x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M4EMASK1_M4EMASK1x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M4EMASK1_M4EMASK1x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M4EMASK1_M4EMASK1x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M4EMASK1_M4EMASK1x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M4EMASK1_M4EMASK1x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M4EMASK1_M4EMASK1x_19 ((uint32_t)0x00080000U) /* Bit19*/ + +/******** Bit definition for EXTI_M7PEND0 register ********/ +#define EXTI_M7PEND0_M7PEND0x ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_M7PEND0_M7PEND0x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M7PEND0_M7PEND0x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M7PEND0_M7PEND0x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M7PEND0_M7PEND0x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M7PEND0_M7PEND0x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M7PEND0_M7PEND0x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M7PEND0_M7PEND0x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M7PEND0_M7PEND0x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M7PEND0_M7PEND0x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M7PEND0_M7PEND0x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M7PEND0_M7PEND0x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M7PEND0_M7PEND0x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M7PEND0_M7PEND0x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M7PEND0_M7PEND0x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M7PEND0_M7PEND0x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M7PEND0_M7PEND0x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M7PEND0_M7PEND0x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M7PEND0_M7PEND0x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M7PEND0_M7PEND0x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M7PEND0_M7PEND0x_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M7PEND0_M7PEND0x_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M7PEND0_M7PEND0x_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M7PEND0_M7PEND0x_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M7PEND0_M7PEND0x_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M7PEND0_M7PEND0x_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M7PEND0_M7PEND0x_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M7PEND0_M7PEND0x_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_M7PEND0_M7PEND0x_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_M7PEND0_M7PEND0x_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_M7PEND0_M7PEND0x_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_M7PEND0_M7PEND0x_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_M7PEND0_M7PEND0x_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_M7PEND1 register ********/ +#define EXTI_M7PEND1_M7PEND1x ((uint32_t)0x000FFFFFU) /* Bit[19:0] */ +#define EXTI_M7PEND1_M7PEND1x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M7PEND1_M7PEND1x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M7PEND1_M7PEND1x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M7PEND1_M7PEND1x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M7PEND1_M7PEND1x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M7PEND1_M7PEND1x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M7PEND1_M7PEND1x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M7PEND1_M7PEND1x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M7PEND1_M7PEND1x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M7PEND1_M7PEND1x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M7PEND1_M7PEND1x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M7PEND1_M7PEND1x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M7PEND1_M7PEND1x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M7PEND1_M7PEND1x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M7PEND1_M7PEND1x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M7PEND1_M7PEND1x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M7PEND1_M7PEND1x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M7PEND1_M7PEND1x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M7PEND1_M7PEND1x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M7PEND1_M7PEND1x_19 ((uint32_t)0x00080000U) /* Bit19*/ + +/******** Bit definition for EXTI_M4PEND0 register ********/ +#define EXTI_M4PEND0_M4PEND0x ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_M4PEND0_M4PEND0x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M4PEND0_M4PEND0x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M4PEND0_M4PEND0x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M4PEND0_M4PEND0x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M4PEND0_M4PEND0x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M4PEND0_M4PEND0x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M4PEND0_M4PEND0x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M4PEND0_M4PEND0x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M4PEND0_M4PEND0x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M4PEND0_M4PEND0x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M4PEND0_M4PEND0x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M4PEND0_M4PEND0x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M4PEND0_M4PEND0x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M4PEND0_M4PEND0x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M4PEND0_M4PEND0x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M4PEND0_M4PEND0x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M4PEND0_M4PEND0x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M4PEND0_M4PEND0x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M4PEND0_M4PEND0x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M4PEND0_M4PEND0x_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M4PEND0_M4PEND0x_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M4PEND0_M4PEND0x_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M4PEND0_M4PEND0x_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M4PEND0_M4PEND0x_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M4PEND0_M4PEND0x_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M4PEND0_M4PEND0x_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M4PEND0_M4PEND0x_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_M4PEND0_M4PEND0x_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_M4PEND0_M4PEND0x_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_M4PEND0_M4PEND0x_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_M4PEND0_M4PEND0x_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_M4PEND0_M4PEND0x_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_M4PEND1 register ********/ +#define EXTI_M4PEND1_M4PEND1x ((uint32_t)0x000FFFFFU) /* Bit[19:0] */ +#define EXTI_M4PEND1_M4PEND1x_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M4PEND1_M4PEND1x_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M4PEND1_M4PEND1x_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M4PEND1_M4PEND1x_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M4PEND1_M4PEND1x_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M4PEND1_M4PEND1x_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M4PEND1_M4PEND1x_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M4PEND1_M4PEND1x_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M4PEND1_M4PEND1x_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M4PEND1_M4PEND1x_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M4PEND1_M4PEND1x_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M4PEND1_M4PEND1x_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M4PEND1_M4PEND1x_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M4PEND1_M4PEND1x_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M4PEND1_M4PEND1x_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M4PEND1_M4PEND1x_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M4PEND1_M4PEND1x_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M4PEND1_M4PEND1x_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M4PEND1_M4PEND1x_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M4PEND1_M4PEND1x_19 ((uint32_t)0x00080000U) /* Bit19*/ + +/******** Bit definition for EXTI_M7IMASK0_DRC register ********/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_M7IMASK0_DRC_M7IMASK0_DRCx_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_M7IMASK1_DRC register ********/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx ((uint32_t)0x07FFFFFFU) /* Bit[26:0] */ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M7IMASK1_DRC_M7IMASK1_DRCx_26 ((uint32_t)0x04000000U) /* Bit26*/ + +/******** Bit definition for EXTI_M4IMASK0_DRC register ********/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_M4IMASK0_DRC_M4IMASK0_DRCx_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_M4IMASK1_DRC register ********/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx ((uint32_t)0x07FFFFFFU) /* Bit[26:0] */ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M4IMASK1_DRC_M4IMASK1_DRCx_26 ((uint32_t)0x04000000U) /* Bit26*/ + +/******** Bit definition for EXTI_M7EMASK0_DRC register ********/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_M7EMASK0_DRC_M7EMASK0_DRCx_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_M7EMASK1_DRC register ********/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx ((uint32_t)0x07FFFFFFU) /* Bit[26:0] */ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M7EMASK1_DRC_M7EMASK1_DRCx_26 ((uint32_t)0x04000000U) /* Bit26*/ + +/******** Bit definition for EXTI_M4EMASK0_DRC register ********/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define EXTI_M4EMASK0_DRC_M4EMASK0_DRCx_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for EXTI_M4EMASK1_DRC register ********/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx ((uint32_t)0x07FFFFFFU) /* Bit[26:0] */ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define EXTI_M4EMASK1_DRC_M4EMASK1_DRCx_26 ((uint32_t)0x04000000U) /* Bit26*/ + +/******** Bit definition for EXTI_TS_SEL register ********/ +#define EXTI_TS_SEL_TSSEL ((uint32_t)0x00000F00U) /* Bit[11:8] */ +#define EXTI_TS_SEL_TSSEL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define EXTI_TS_SEL_TSSEL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define EXTI_TS_SEL_TSSEL_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define EXTI_TS_SEL_TSSEL_3 ((uint32_t)0x00000800U) /* Bit11*/ + +#define EXTI_TS_SEL_EXTI0 ((uint32_t)0x00000000U) /* Select EXTI0 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI1 ((uint32_t)0x00000100U) /* Select EXTI1 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI2 ((uint32_t)0x00000200U) /* Select EXTI2 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI3 ((uint32_t)0x00000300U) /* Select EXTI3 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI4 ((uint32_t)0x00000400U) /* Select EXTI4 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI5 ((uint32_t)0x00000500U) /* Select EXTI5 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI6 ((uint32_t)0x00000600U) /* Select EXTI6 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI7 ((uint32_t)0x00000700U) /* Select EXTI7 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI8 ((uint32_t)0x00000800U) /* Select EXTI8 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI9 ((uint32_t)0x00000900U) /* Select EXTI9 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI10 ((uint32_t)0x00000A00U) /* Select EXTI10 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI11 ((uint32_t)0x00000B00U) /* Select EXTI11 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI12 ((uint32_t)0x00000C00U) /* Select EXTI12 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI13 ((uint32_t)0x00000D00U) /* Select EXTI13 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI14 ((uint32_t)0x00000E00U) /* Select EXTI14 as trigger source of timestamp event */ +#define EXTI_TS_SEL_EXTI15 ((uint32_t)0x00000F00U) /* Select EXTI15 as trigger source of timestamp event */ + +/*** Synchronous Dynamic Random Access Memory(SDRAM) interface ***/ + +/** Bit definition for SDRAM_BADD1 register **/ +#define SDRAM_BADD1_ADDBASE ((uint32_t)0x000FFFFFU) /* ADDBASE[19:0] bits (Base address value for SDRAM1) */ + +/** Bit definition for SDRAM_ADDMASK1 register **/ +#define SDRAM_ADDMASK1_ADDMASK ((uint32_t)0x000FFFFFU) /* ADDMASK[19:0] bits (Address mask value for SDRAM1) */ + +/** Bit definition for SDRAM_BADD2 register **/ +#define SDRAM_BADD2_ADDBASE ((uint32_t)0x000FFFFFU) /* ADDBASE[19:0] bits (Base address value for SDRAM2) */ + +/** Bit definition for SDRAM_ADDMASK2 register **/ +#define SDRAM_ADDMASK2_ADDMASK ((uint32_t)0x000FFFFFU) /* ADDMASK[19:0] bits (Address mask value for SDRAM2) */ + +/** Bit definition for SDRAM_CFG1 and SDRAM_CFG2 register **/ +#define SDRAM_CFG_SDRAMEN ((uint32_t)0x80000000U) /* SDRAM1 or SDRAM2 enable bit */ +#define SDRAM_CFG_REFRESHEN ((uint32_t)0x40000000U) /* Refresh commands enable bit */ +#define SDRAM_CFG_AUTOPCHEN ((uint32_t)0x00800000U) /* Auto precharge enable bit */ +#define SDRAM_CFG_BUSWID ((uint32_t)0x00600000U) /* BUSWID[1:0] bits (bus width) */ +#define SDRAM_CFG_BUSWID_0 ((uint32_t)0x00200000U) /* Bit 0 */ +#define SDRAM_CFG_BUSWID_1 ((uint32_t)0x00400000U) /* Bit 1 */ +#define SDRAM_CFG_BURSTLEN ((uint32_t)0x001C0000U) /* BURSTLEN[2:0] bits (burst length) */ +#define SDRAM_CFG_BURSTLEN_0 ((uint32_t)0x00040000U) /* Bit 0 */ +#define SDRAM_CFG_BURSTLEN_1 ((uint32_t)0x00080000U) /* Bit 1 */ +#define SDRAM_CFG_BURSTLEN_2 ((uint32_t)0x00100000U) /* Bit 2 */ +#define SDRAM_CFG_CASLATENCY ((uint32_t)0x00030000U) /* CASLATENCY[1:0] bits (CAS latency) */ +#define SDRAM_CFG_CASLATENCY_0 ((uint32_t)0x00010000U) /* Bit 0 */ +#define SDRAM_CFG_CASLATENCY_1 ((uint32_t)0x00020000U) /* Bit 1 */ +#define SDRAM_CFG_PREFCHRDEN ((uint32_t)0x00000200U) /* Prefetch read enable bit */ +#define SDRAM_CFG_SOMEN ((uint32_t)0x00000100U) /* Write buffer store on miss(SOM) enable bit */ +#define SDRAM_CFG_BANKINTRLEN ((uint32_t)0x00000010U) /* Bank interleaving enable bit */ +#define SDRAM_CFG_ADDCFG ((uint32_t)0x0000000FU) /* ADDCFG[3:0] bits (Address organization configuration of SDRAM1 or SDRAM2) */ +#define SDRAM_CFG_ADDCFG_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define SDRAM_CFG_ADDCFG_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define SDRAM_CFG_ADDCFG_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define SDRAM_CFG_ADDCFG_3 ((uint32_t)0x00000008U) /* Bit 3 */ + +/** Bit definition for SDRAM_RAT register **/ +#define SDRAM_RAT_TRAS ((uint32_t)0x0000003FU) /* TRAS[5:0] bits (Row active time) */ + +/** Bit definition for SDRAM_RCT register **/ +#define SDRAM_RCT_TRC ((uint32_t)0x0000003FU) /* TRC[5:0] bits (Row cycle time) */ + +/** Bit definition for SDRAM_RRDLY register **/ +#define SDRAM_RRDLY_TRRD ((uint32_t)0x0000003FU) /* TRRD[5:0] bits (Row active to row active delay time) */ + +/** Bit definition for SDRAM_PT register **/ +#define SDRAM_PT_TRP ((uint32_t)0x0000003FU) /* TRP[5:0] bits (Precharge time) */ + +/** Bit definition for SDRAM_WRT register **/ +#define SDRAM_WRT_TWR ((uint32_t)0x0000003FU) /* TWR[5:0] bits (Write recovery time) */ + +/** Bit definition for SDRAM_RFCT register **/ +#define SDRAM_RFCT_TRFC ((uint32_t)0x0000003FU) /* TRFC[5:0] bits (Refresh cycle time) */ + +/** Bit definition for SDRAM_RCDLY register **/ +#define SDRAM_RCDLY_TRCD ((uint32_t)0x0000000FU) /* TRCD[3:0] bits (RAS to CAS delay time) */ + +/** Bit definition for SDRAM_RI register **/ +#define SDRAM_RI_TRI ((uint32_t)0x00FFFFFFU) /* TRI[23:0] bits (Refresh interval time) */ + +/** Bit definition for SDRAM_CBO register **/ +#define SDRAM_CBO_DUMMY ((uint32_t)0xFFFFFFFFU) /* DUMMY[31:0] bits (Dummy data) */ + +/** Bit definition for SDRAM_OR register **/ +#define SDRAM_OR_DUMMY ((uint32_t)0xFFFFFFFFU) /* DUMMY[31:0] bits (Dummy data) */ + +/** Bit definition for SDRAM_OS register **/ +#define SDRAM_OS_CKEN ((uint32_t)0x40000000U) /* Clock enable bit */ +#define SDRAM_OS_OPCODE ((uint32_t)0x30000000U) /* OPCODE[1:0] bits (Operation code) */ +#define SDRAM_OS_OPCODE_0 ((uint32_t)0x10000000U) /* Bit 0 */ +#define SDRAM_OS_OPCODE_1 ((uint32_t)0x20000000U) /* Bit 1 */ +#define SDRAM_OS_CS ((uint32_t)0x03000000U) /* CS[1:0] bits (Chip select) */ +#define SDRAM_OS_CS_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define SDRAM_OS_CS_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define SDRAM_OS_BANKADD ((uint32_t)0x00030000U) /* BANKADD[1:0] bits (Bank address) */ +#define SDRAM_OS_BANKADD_0 ((uint32_t)0x00010000U) /* Bit 0 */ +#define SDRAM_OS_BANKADD_1 ((uint32_t)0x00020000U) /* Bit 1 */ +#define SDRAM_OS_ADD ((uint32_t)0x00003FFFU) /* ADD[3:0] bits (Address) */ + + +/** Bit definition for SDRAM_IINFO register **/ +#define SDRAM_IINFO_SYNCMEMBUFSIZE ((uint32_t)0x00FF0000U) /* SYNCMEMBUFSIZE[7:0] bits (Synchronous memory buffer size) */ + +/** Bit definition for SDRAM_WP register **/ +#define SDRAM_WP_WP1 ((uint32_t)0x00000001U) /* SRAM1 Write protection */ +#define SDRAM_WP_WP2 ((uint32_t)0x00000002U) /* SRAM2 Write protection */ + + +/******** Bit definition for RCC_PLL1CTRL1 register ********/ +#define RCC_PLL1CTRL1_PLL1SRC ((uint32_t)0x30000000U) /* Bit[29:28] */ +#define RCC_PLL1CTRL1_PLL1SRC_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_PLL1CTRL1_PLL1SRC_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_PLL1CTRL1_PLL1PHLK ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_PLL1CTRL1_PLL1LDOEN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_PLL1CTRL1_PLL1EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_PLL1CTRL1_PLL1RST ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_PLL1CTRL1_PLL1PD ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_PLL1CTRL1_PLL1BWAJ ((uint32_t)0x00000FFFU) /* Bit */ +#define RCC_PLL1CTRL1_PLL1BWAJ_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_PLL1CTRL1_PLL1BWAJ_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_PLL1CTRL1_PLL1BWAJ_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_PLL1CTRL1_PLL1BWAJ_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_PLL1CTRL1_PLL1BWAJ_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_PLL1CTRL1_PLL1BWAJ_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_PLL1CTRL1_PLL1BWAJ_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_PLL1CTRL1_PLL1BWAJ_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_PLL1CTRL1_PLL1BWAJ_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_PLL1CTRL1_PLL1BWAJ_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_PLL1CTRL1_PLL1BWAJ_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_PLL1CTRL1_PLL1BWAJ_11 ((uint32_t)0x00000800U) /* Bit11*/ + +/******** Bit definition for RCC_PLL1CTRL2 register ********/ +#define RCC_PLL1CTRL2_PLL1CLKR ((uint32_t)0xFC000000U) /* Bit[31:26] */ +#define RCC_PLL1CTRL2_PLL1CLKR_0 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_PLL1CTRL2_PLL1CLKR_1 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_PLL1CTRL2_PLL1CLKR_2 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_PLL1CTRL2_PLL1CLKR_3 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_PLL1CTRL2_PLL1CLKR_4 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_PLL1CTRL2_PLL1CLKR_5 ((uint32_t)0x80000000U) /* Bit31*/ +#define RCC_PLL1CTRL2_PLL1CLKF ((uint32_t)0x03FFFFFFU) /* Bit */ +#define RCC_PLL1CTRL2_PLL1CLKF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_PLL1CTRL2_PLL1CLKF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_PLL1CTRL2_PLL1CLKF_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_PLL1CTRL2_PLL1CLKF_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_PLL1CTRL2_PLL1CLKF_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_PLL1CTRL2_PLL1CLKF_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_PLL1CTRL2_PLL1CLKF_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_PLL1CTRL2_PLL1CLKF_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_PLL1CTRL2_PLL1CLKF_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_PLL1CTRL2_PLL1CLKF_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_PLL1CTRL2_PLL1CLKF_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_PLL1CTRL2_PLL1CLKF_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_PLL1CTRL2_PLL1CLKF_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_PLL1CTRL2_PLL1CLKF_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_PLL1CTRL2_PLL1CLKF_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_PLL1CTRL2_PLL1CLKF_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define RCC_PLL1CTRL2_PLL1CLKF_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_PLL1CTRL2_PLL1CLKF_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_PLL1CTRL2_PLL1CLKF_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_PLL1CTRL2_PLL1CLKF_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_PLL1CTRL2_PLL1CLKF_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_PLL1CTRL2_PLL1CLKF_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_PLL1CTRL2_PLL1CLKF_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_PLL1CTRL2_PLL1CLKF_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_PLL1CTRL2_PLL1CLKF_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_PLL1CTRL2_PLL1CLKF_25 ((uint32_t)0x02000000U) /* Bit25*/ + +/******** Bit definition for RCC_PLL2CTRL1 register ********/ +#define RCC_PLL2CTRL1_PLL2SRC ((uint32_t)0x30000000U) /* Bit[29:28] */ +#define RCC_PLL2CTRL1_PLL2SRC_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_PLL2CTRL1_PLL2SRC_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_PLL2CTRL1_PLL2PHLK ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_PLL2CTRL1_PLL2LDOEN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_PLL2CTRL1_PLL2EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_PLL2CTRL1_PLL2RST ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_PLL2CTRL1_PLL2PD ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_PLL2CTRL1_PLL2BWAJ ((uint32_t)0x00000FFFU) /* Bit */ +#define RCC_PLL2CTRL1_PLL2BWAJ_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_PLL2CTRL1_PLL2BWAJ_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_PLL2CTRL1_PLL2BWAJ_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_PLL2CTRL1_PLL2BWAJ_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_PLL2CTRL1_PLL2BWAJ_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_PLL2CTRL1_PLL2BWAJ_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_PLL2CTRL1_PLL2BWAJ_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_PLL2CTRL1_PLL2BWAJ_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_PLL2CTRL1_PLL2BWAJ_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_PLL2CTRL1_PLL2BWAJ_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_PLL2CTRL1_PLL2BWAJ_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_PLL2CTRL1_PLL2BWAJ_11 ((uint32_t)0x00000800U) /* Bit11*/ + +/******** Bit definition for RCC_PLL2CTRL2 register ********/ +#define RCC_PLL2CTRL2_PLL2CLKR ((uint32_t)0xFC000000U) /* Bit[31:26] */ +#define RCC_PLL2CTRL2_PLL2CLKR_0 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_PLL2CTRL2_PLL2CLKR_1 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_PLL2CTRL2_PLL2CLKR_2 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_PLL2CTRL2_PLL2CLKR_3 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_PLL2CTRL2_PLL2CLKR_4 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_PLL2CTRL2_PLL2CLKR_5 ((uint32_t)0x80000000U) /* Bit31*/ +#define RCC_PLL2CTRL2_PLL2CLKF ((uint32_t)0x03FFFFFFU) /* Bit */ +#define RCC_PLL2CTRL2_PLL2CLKF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_PLL2CTRL2_PLL2CLKF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_PLL2CTRL2_PLL2CLKF_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_PLL2CTRL2_PLL2CLKF_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_PLL2CTRL2_PLL2CLKF_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_PLL2CTRL2_PLL2CLKF_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_PLL2CTRL2_PLL2CLKF_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_PLL2CTRL2_PLL2CLKF_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_PLL2CTRL2_PLL2CLKF_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_PLL2CTRL2_PLL2CLKF_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_PLL2CTRL2_PLL2CLKF_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_PLL2CTRL2_PLL2CLKF_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_PLL2CTRL2_PLL2CLKF_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_PLL2CTRL2_PLL2CLKF_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_PLL2CTRL2_PLL2CLKF_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_PLL2CTRL2_PLL2CLKF_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define RCC_PLL2CTRL2_PLL2CLKF_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_PLL2CTRL2_PLL2CLKF_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_PLL2CTRL2_PLL2CLKF_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_PLL2CTRL2_PLL2CLKF_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_PLL2CTRL2_PLL2CLKF_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_PLL2CTRL2_PLL2CLKF_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_PLL2CTRL2_PLL2CLKF_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_PLL2CTRL2_PLL2CLKF_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_PLL2CTRL2_PLL2CLKF_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_PLL2CTRL2_PLL2CLKF_25 ((uint32_t)0x02000000U) /* Bit25*/ + + +/******** Bit definition for RCC_PLL3CTRL1 register ********/ +#define RCC_PLL3CTRL1_PLL3SRC ((uint32_t)0x30000000U) /* Bit[29:28] */ +#define RCC_PLL3CTRL1_PLL3SRC_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_PLL3CTRL1_PLL3SRC_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_PLL3CTRL1_PLL3PHLK ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_PLL3CTRL1_PLL3LDOEN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_PLL3CTRL1_PLL3EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_PLL3CTRL1_PLL3RST ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_PLL3CTRL1_PLL3PD ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_PLL3CTRL1_PLL3BWAJ ((uint32_t)0x00000FFFU) /* Bit */ +#define RCC_PLL3CTRL1_PLL3BWAJ_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_PLL3CTRL1_PLL3BWAJ_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_PLL3CTRL1_PLL3BWAJ_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_PLL3CTRL1_PLL3BWAJ_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_PLL3CTRL1_PLL3BWAJ_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_PLL3CTRL1_PLL3BWAJ_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_PLL3CTRL1_PLL3BWAJ_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_PLL3CTRL1_PLL3BWAJ_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_PLL3CTRL1_PLL3BWAJ_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_PLL3CTRL1_PLL3BWAJ_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_PLL3CTRL1_PLL3BWAJ_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_PLL3CTRL1_PLL3BWAJ_11 ((uint32_t)0x00000800U) /* Bit11*/ + +/******** Bit definition for RCC_PLL3CTRL2 register ********/ +#define RCC_PLL3CTRL2_PLL3CLKR ((uint32_t)0xFC000000U) /* Bit[31:26] */ +#define RCC_PLL3CTRL2_PLL3CLKR_0 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_PLL3CTRL2_PLL3CLKR_1 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_PLL3CTRL2_PLL3CLKR_2 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_PLL3CTRL2_PLL3CLKR_3 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_PLL3CTRL2_PLL3CLKR_4 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_PLL3CTRL2_PLL3CLKR_5 ((uint32_t)0x80000000U) /* Bit31*/ +#define RCC_PLL3CTRL2_PLL3CLKF ((uint32_t)0x03FFFFFFU) /* Bit */ +#define RCC_PLL3CTRL2_PLL3CLKF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_PLL3CTRL2_PLL3CLKF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_PLL3CTRL2_PLL3CLKF_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_PLL3CTRL2_PLL3CLKF_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_PLL3CTRL2_PLL3CLKF_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_PLL3CTRL2_PLL3CLKF_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_PLL3CTRL2_PLL3CLKF_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_PLL3CTRL2_PLL3CLKF_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_PLL3CTRL2_PLL3CLKF_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_PLL3CTRL2_PLL3CLKF_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_PLL3CTRL2_PLL3CLKF_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_PLL3CTRL2_PLL3CLKF_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_PLL3CTRL2_PLL3CLKF_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_PLL3CTRL2_PLL3CLKF_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_PLL3CTRL2_PLL3CLKF_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_PLL3CTRL2_PLL3CLKF_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define RCC_PLL3CTRL2_PLL3CLKF_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_PLL3CTRL2_PLL3CLKF_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_PLL3CTRL2_PLL3CLKF_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_PLL3CTRL2_PLL3CLKF_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_PLL3CTRL2_PLL3CLKF_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_PLL3CTRL2_PLL3CLKF_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_PLL3CTRL2_PLL3CLKF_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_PLL3CTRL2_PLL3CLKF_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_PLL3CTRL2_PLL3CLKF_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_PLL3CTRL2_PLL3CLKF_25 ((uint32_t)0x02000000U) /* Bit25*/ + + +/******** Bit definition for RCC_SHRPLLCTRL1 register ********/ +#define RCC_SHRPLLCTRL1_SHRPLLSRC ((uint32_t)0x30000000U) /* Bit[29:28] */ +#define RCC_SHRPLLCTRL1_SHRPLLSRC_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_SHRPLLCTRL1_SHRPLLSRC_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_SHRPLLCTRL1_SHRPLLPHLK ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_SHRPLLCTRL1_SHRPLLLDOEN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_SHRPLLCTRL1_SHRPLLEN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_SHRPLLCTRL1_SHRPLLRST ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_SHRPLLCTRL1_SHRPLLPD ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ ((uint32_t)0x00000FFFU) /* Bit */ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_SHRPLLCTRL1_SHRPLLBWAJ_11 ((uint32_t)0x00000800U) /* Bit11*/ + +/******** Bit definition for RCC_SHRPLLCTRL2 register ********/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKR ((uint32_t)0xFC000000U) /* Bit[31:26] */ +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_0 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_1 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_2 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_3 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_4 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKR_5 ((uint32_t)0x80000000U) /* Bit31*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF ((uint32_t)0x03FFFFFFU) /* Bit */ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_SHRPLLCTRL2_SHRPLLCLKF_25 ((uint32_t)0x02000000U) /* Bit25*/ + +/******** Bit definition for RCC_SRCCTRL1 register ********/ +#define RCC_SRCCTRL1_AFEMSIRDF ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_SRCCTRL1_AFEHSIRDF ((uint32_t)0x40000000U) /* Bit[30] */ + +#define RCC_SRCCTRL1_SCLKSTS ((uint32_t)0x0C000000U) /* Bit[27:26] */ +#define RCC_SRCCTRL1_SCLKSTS_0 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_SRCCTRL1_SCLKSTS_1 ((uint32_t)0x08000000U) /* Bit27*/ + +#define RCC_SRCCTRL1_SCLKSTS_HSI ((uint32_t)0x00000000U) +#define RCC_SRCCTRL1_SCLKSTS_MSI ((uint32_t)0x04000000U) +#define RCC_SRCCTRL1_SCLKSTS_HSE ((uint32_t)0x08000000U) +#define RCC_SRCCTRL1_SCLKSTS_PLL1 ((uint32_t)0x0C000000U) + +#define RCC_SRCCTRL1_SCLKSW ((uint32_t)0x03000000U) /* Bit[25:24] */ +#define RCC_SRCCTRL1_SCLKSW_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_SRCCTRL1_SCLKSW_1 ((uint32_t)0x02000000U) /* Bit25*/ + +#define RCC_SRCCTRL1_SCLKSW_HSI ((uint32_t)0x00000000U) +#define RCC_SRCCTRL1_SCLKSW_MSI ((uint32_t)0x01000000U) +#define RCC_SRCCTRL1_SCLKSW_HSE ((uint32_t)0x02000000U) +#define RCC_SRCCTRL1_SCLKSW_PLL1 ((uint32_t)0x03000000U) + +#define RCC_SRCCTRL1_HSERDCNTEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_SRCCTRL1_MSIRDF ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_SRCCTRL1_MSIEN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_SRCCTRL1_HSECSSEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_SRCCTRL1_HSEBP ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_SRCCTRL1_HSERDF ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_SRCCTRL1_HSEEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_SRCCTRL1_HSIRDF ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_SRCCTRL1_HSIEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_SRCCTRL2 register ********/ +#define RCC_SRCCTRL2_BORF ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_SRCCTRL2_HSICALEF ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_SRCCTRL2_MSICALEF ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_SRCCTRL2_M7HYPSEL ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_SRCCTRL2_AXIHYPSEL ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_SRCCTRL2_MSICAL ((uint32_t)0x00001F00U) /* Bit[12:8] */ +#define RCC_SRCCTRL2_MSICAL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_SRCCTRL2_MSICAL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_SRCCTRL2_MSICAL_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_SRCCTRL2_MSICAL_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_SRCCTRL2_MSICAL_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_SRCCTRL2_MSITRIM ((uint32_t)0x0000001FU) /* Bit */ +#define RCC_SRCCTRL2_MSITRIM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_SRCCTRL2_MSITRIM_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_SRCCTRL2_MSITRIM_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_SRCCTRL2_MSITRIM_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_SRCCTRL2_MSITRIM_4 ((uint32_t)0x00000010U) /* Bit4*/ + +/******** Bit definition for RCC_SRCCTRL3 register ********/ +#define RCC_SRCCTRL3_HSICAL ((uint32_t)0x01FF0000U) /* Bit[24:16] */ +#define RCC_SRCCTRL3_HSICAL_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_SRCCTRL3_HSICAL_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_SRCCTRL3_HSICAL_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_SRCCTRL3_HSICAL_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_SRCCTRL3_HSICAL_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_SRCCTRL3_HSICAL_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_SRCCTRL3_HSICAL_6 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_SRCCTRL3_HSICAL_7 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_SRCCTRL3_HSICAL_8 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_SRCCTRL3_HSITRIM ((uint32_t)0x000001FFU) /* Bit */ +#define RCC_SRCCTRL3_HSITRIM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_SRCCTRL3_HSITRIM_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_SRCCTRL3_HSITRIM_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_SRCCTRL3_HSITRIM_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_SRCCTRL3_HSITRIM_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_SRCCTRL3_HSITRIM_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_SRCCTRL3_HSITRIM_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_SRCCTRL3_HSITRIM_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_SRCCTRL3_HSITRIM_8 ((uint32_t)0x00000100U) /* Bit8*/ + +/******** Bit definition for RCC_PLL1DIV register ********/ +#define RCC_PLL1DIV_PLL1CDIV ((uint32_t)0x003F0000U) /* Bit[21:16] */ +#define RCC_PLL1DIV_PLL1CDIV_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_PLL1DIV_PLL1CDIV_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_PLL1DIV_PLL1CDIV_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_PLL1DIV_PLL1CDIV_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_PLL1DIV_PLL1CDIV_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_PLL1DIV_PLL1CDIV_5 ((uint32_t)0x00200000U) /* Bit21*/ + +#define RCC_PLL1DIV_PLL1CDIV_DIV1 ((uint32_t)0x00010000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV2 ((uint32_t)0x00020000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV3 ((uint32_t)0x00030000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV4 ((uint32_t)0x00040000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV5 ((uint32_t)0x00050000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV6 ((uint32_t)0x00060000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV7 ((uint32_t)0x00070000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV8 ((uint32_t)0x00080000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV9 ((uint32_t)0x00090000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV10 ((uint32_t)0x000A0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV11 ((uint32_t)0x000B0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV12 ((uint32_t)0x000C0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV13 ((uint32_t)0x000D0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV14 ((uint32_t)0x000E0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV15 ((uint32_t)0x000F0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV16 ((uint32_t)0x00100000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV17 ((uint32_t)0x00110000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV18 ((uint32_t)0x00120000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV19 ((uint32_t)0x00130000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV20 ((uint32_t)0x00140000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV21 ((uint32_t)0x00150000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV22 ((uint32_t)0x00160000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV23 ((uint32_t)0x00170000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV24 ((uint32_t)0x00180000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV25 ((uint32_t)0x00190000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV26 ((uint32_t)0x001A0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV27 ((uint32_t)0x001B0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV28 ((uint32_t)0x001C0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV29 ((uint32_t)0x001D0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV30 ((uint32_t)0x001E0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV31 ((uint32_t)0x001F0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV32 ((uint32_t)0x00200000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV33 ((uint32_t)0x00210000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV34 ((uint32_t)0x00220000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV35 ((uint32_t)0x00230000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV36 ((uint32_t)0x00240000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV37 ((uint32_t)0x00250000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV38 ((uint32_t)0x00260000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV39 ((uint32_t)0x00270000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV40 ((uint32_t)0x00280000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV41 ((uint32_t)0x00290000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV42 ((uint32_t)0x002A0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV43 ((uint32_t)0x002B0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV44 ((uint32_t)0x002C0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV45 ((uint32_t)0x002D0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV46 ((uint32_t)0x002E0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV47 ((uint32_t)0x002F0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV48 ((uint32_t)0x00300000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV49 ((uint32_t)0x00310000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV50 ((uint32_t)0x00320000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV51 ((uint32_t)0x00330000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV52 ((uint32_t)0x00340000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV53 ((uint32_t)0x00350000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV54 ((uint32_t)0x00360000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV55 ((uint32_t)0x00370000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV56 ((uint32_t)0x00380000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV57 ((uint32_t)0x00390000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV58 ((uint32_t)0x003A0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV59 ((uint32_t)0x003B0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV60 ((uint32_t)0x003C0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV61 ((uint32_t)0x003D0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV62 ((uint32_t)0x003E0000U) +#define RCC_PLL1DIV_PLL1CDIV_DIV63 ((uint32_t)0x003F0000U) + +#define RCC_PLL1DIV_PLL1BDIV ((uint32_t)0x00003F00U) /* Bit[13:8] */ +#define RCC_PLL1DIV_PLL1BDIV_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_PLL1DIV_PLL1BDIV_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_PLL1DIV_PLL1BDIV_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_PLL1DIV_PLL1BDIV_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_PLL1DIV_PLL1BDIV_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_PLL1DIV_PLL1BDIV_5 ((uint32_t)0x00002000U) /* Bit13*/ + +#define RCC_PLL1DIV_PLL1BDIV_DIV1 ((uint32_t)0x00000100U) +#define RCC_PLL1DIV_PLL1BDIV_DIV2 ((uint32_t)0x00000200U) +#define RCC_PLL1DIV_PLL1BDIV_DIV3 ((uint32_t)0x00000300U) +#define RCC_PLL1DIV_PLL1BDIV_DIV4 ((uint32_t)0x00000400U) +#define RCC_PLL1DIV_PLL1BDIV_DIV5 ((uint32_t)0x00000500U) +#define RCC_PLL1DIV_PLL1BDIV_DIV6 ((uint32_t)0x00000600U) +#define RCC_PLL1DIV_PLL1BDIV_DIV7 ((uint32_t)0x00000700U) +#define RCC_PLL1DIV_PLL1BDIV_DIV8 ((uint32_t)0x00000800U) +#define RCC_PLL1DIV_PLL1BDIV_DIV9 ((uint32_t)0x00000900U) +#define RCC_PLL1DIV_PLL1BDIV_DIV10 ((uint32_t)0x00000A00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV11 ((uint32_t)0x00000B00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV12 ((uint32_t)0x00000C00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV13 ((uint32_t)0x00000D00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV14 ((uint32_t)0x00000E00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV15 ((uint32_t)0x00000F00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV16 ((uint32_t)0x00001000U) +#define RCC_PLL1DIV_PLL1BDIV_DIV17 ((uint32_t)0x00001100U) +#define RCC_PLL1DIV_PLL1BDIV_DIV18 ((uint32_t)0x00001200U) +#define RCC_PLL1DIV_PLL1BDIV_DIV19 ((uint32_t)0x00001300U) +#define RCC_PLL1DIV_PLL1BDIV_DIV20 ((uint32_t)0x00001400U) +#define RCC_PLL1DIV_PLL1BDIV_DIV21 ((uint32_t)0x00001500U) +#define RCC_PLL1DIV_PLL1BDIV_DIV22 ((uint32_t)0x00001600U) +#define RCC_PLL1DIV_PLL1BDIV_DIV23 ((uint32_t)0x00001700U) +#define RCC_PLL1DIV_PLL1BDIV_DIV24 ((uint32_t)0x00001800U) +#define RCC_PLL1DIV_PLL1BDIV_DIV25 ((uint32_t)0x00001900U) +#define RCC_PLL1DIV_PLL1BDIV_DIV26 ((uint32_t)0x00001A00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV27 ((uint32_t)0x00001B00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV28 ((uint32_t)0x00001C00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV29 ((uint32_t)0x00001D00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV30 ((uint32_t)0x00001E00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV31 ((uint32_t)0x00001F00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV32 ((uint32_t)0x00002000U) +#define RCC_PLL1DIV_PLL1BDIV_DIV33 ((uint32_t)0x00002100U) +#define RCC_PLL1DIV_PLL1BDIV_DIV34 ((uint32_t)0x00002200U) +#define RCC_PLL1DIV_PLL1BDIV_DIV35 ((uint32_t)0x00002300U) +#define RCC_PLL1DIV_PLL1BDIV_DIV36 ((uint32_t)0x00002400U) +#define RCC_PLL1DIV_PLL1BDIV_DIV37 ((uint32_t)0x00002500U) +#define RCC_PLL1DIV_PLL1BDIV_DIV38 ((uint32_t)0x00002600U) +#define RCC_PLL1DIV_PLL1BDIV_DIV39 ((uint32_t)0x00002700U) +#define RCC_PLL1DIV_PLL1BDIV_DIV40 ((uint32_t)0x00002800U) +#define RCC_PLL1DIV_PLL1BDIV_DIV41 ((uint32_t)0x00002900U) +#define RCC_PLL1DIV_PLL1BDIV_DIV42 ((uint32_t)0x00002A00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV43 ((uint32_t)0x00002B00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV44 ((uint32_t)0x00002C00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV45 ((uint32_t)0x00002D00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV46 ((uint32_t)0x00002E00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV47 ((uint32_t)0x00002F00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV48 ((uint32_t)0x00003000U) +#define RCC_PLL1DIV_PLL1BDIV_DIV49 ((uint32_t)0x00003100U) +#define RCC_PLL1DIV_PLL1BDIV_DIV50 ((uint32_t)0x00003200U) +#define RCC_PLL1DIV_PLL1BDIV_DIV51 ((uint32_t)0x00003300U) +#define RCC_PLL1DIV_PLL1BDIV_DIV52 ((uint32_t)0x00003400U) +#define RCC_PLL1DIV_PLL1BDIV_DIV53 ((uint32_t)0x00003500U) +#define RCC_PLL1DIV_PLL1BDIV_DIV54 ((uint32_t)0x00003600U) +#define RCC_PLL1DIV_PLL1BDIV_DIV55 ((uint32_t)0x00003700U) +#define RCC_PLL1DIV_PLL1BDIV_DIV56 ((uint32_t)0x00003800U) +#define RCC_PLL1DIV_PLL1BDIV_DIV57 ((uint32_t)0x00003900U) +#define RCC_PLL1DIV_PLL1BDIV_DIV58 ((uint32_t)0x00003A00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV59 ((uint32_t)0x00003B00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV60 ((uint32_t)0x00003C00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV61 ((uint32_t)0x00003D00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV62 ((uint32_t)0x00003E00U) +#define RCC_PLL1DIV_PLL1BDIV_DIV63 ((uint32_t)0x00003F00U) + +#define RCC_PLL1DIV_PLL1ADIV ((uint32_t)0x0000003FU) /* Bit */ +#define RCC_PLL1DIV_PLL1ADIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_PLL1DIV_PLL1ADIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_PLL1DIV_PLL1ADIV_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_PLL1DIV_PLL1ADIV_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_PLL1DIV_PLL1ADIV_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_PLL1DIV_PLL1ADIV_5 ((uint32_t)0x00000020U) /* Bit5*/ + +#define RCC_PLL1DIV_PLL1ADIV_DIV1 ((uint32_t)0x00000001U) +#define RCC_PLL1DIV_PLL1ADIV_DIV2 ((uint32_t)0x00000002U) +#define RCC_PLL1DIV_PLL1ADIV_DIV3 ((uint32_t)0x00000003U) +#define RCC_PLL1DIV_PLL1ADIV_DIV4 ((uint32_t)0x00000004U) +#define RCC_PLL1DIV_PLL1ADIV_DIV5 ((uint32_t)0x00000005U) +#define RCC_PLL1DIV_PLL1ADIV_DIV6 ((uint32_t)0x00000006U) +#define RCC_PLL1DIV_PLL1ADIV_DIV7 ((uint32_t)0x00000007U) +#define RCC_PLL1DIV_PLL1ADIV_DIV8 ((uint32_t)0x00000008U) +#define RCC_PLL1DIV_PLL1ADIV_DIV9 ((uint32_t)0x00000009U) +#define RCC_PLL1DIV_PLL1ADIV_DIV10 ((uint32_t)0x0000000AU) +#define RCC_PLL1DIV_PLL1ADIV_DIV11 ((uint32_t)0x0000000BU) +#define RCC_PLL1DIV_PLL1ADIV_DIV12 ((uint32_t)0x0000000CU) +#define RCC_PLL1DIV_PLL1ADIV_DIV13 ((uint32_t)0x0000000DU) +#define RCC_PLL1DIV_PLL1ADIV_DIV14 ((uint32_t)0x0000000EU) +#define RCC_PLL1DIV_PLL1ADIV_DIV15 ((uint32_t)0x0000000FU) +#define RCC_PLL1DIV_PLL1ADIV_DIV16 ((uint32_t)0x00000010U) +#define RCC_PLL1DIV_PLL1ADIV_DIV17 ((uint32_t)0x00000011U) +#define RCC_PLL1DIV_PLL1ADIV_DIV18 ((uint32_t)0x00000012U) +#define RCC_PLL1DIV_PLL1ADIV_DIV19 ((uint32_t)0x00000013U) +#define RCC_PLL1DIV_PLL1ADIV_DIV20 ((uint32_t)0x00000014U) +#define RCC_PLL1DIV_PLL1ADIV_DIV21 ((uint32_t)0x00000015U) +#define RCC_PLL1DIV_PLL1ADIV_DIV22 ((uint32_t)0x00000016U) +#define RCC_PLL1DIV_PLL1ADIV_DIV23 ((uint32_t)0x00000017U) +#define RCC_PLL1DIV_PLL1ADIV_DIV24 ((uint32_t)0x00000018U) +#define RCC_PLL1DIV_PLL1ADIV_DIV25 ((uint32_t)0x00000019U) +#define RCC_PLL1DIV_PLL1ADIV_DIV26 ((uint32_t)0x0000001AU) +#define RCC_PLL1DIV_PLL1ADIV_DIV27 ((uint32_t)0x0000001BU) +#define RCC_PLL1DIV_PLL1ADIV_DIV28 ((uint32_t)0x0000001CU) +#define RCC_PLL1DIV_PLL1ADIV_DIV29 ((uint32_t)0x0000001DU) +#define RCC_PLL1DIV_PLL1ADIV_DIV30 ((uint32_t)0x0000001EU) +#define RCC_PLL1DIV_PLL1ADIV_DIV31 ((uint32_t)0x0000001FU) +#define RCC_PLL1DIV_PLL1ADIV_DIV32 ((uint32_t)0x00000020U) +#define RCC_PLL1DIV_PLL1ADIV_DIV33 ((uint32_t)0x00000021U) +#define RCC_PLL1DIV_PLL1ADIV_DIV34 ((uint32_t)0x00000022U) +#define RCC_PLL1DIV_PLL1ADIV_DIV35 ((uint32_t)0x00000023U) +#define RCC_PLL1DIV_PLL1ADIV_DIV36 ((uint32_t)0x00000024U) +#define RCC_PLL1DIV_PLL1ADIV_DIV37 ((uint32_t)0x00000025U) +#define RCC_PLL1DIV_PLL1ADIV_DIV38 ((uint32_t)0x00000026U) +#define RCC_PLL1DIV_PLL1ADIV_DIV39 ((uint32_t)0x00000027U) +#define RCC_PLL1DIV_PLL1ADIV_DIV40 ((uint32_t)0x00000028U) +#define RCC_PLL1DIV_PLL1ADIV_DIV41 ((uint32_t)0x00000029U) +#define RCC_PLL1DIV_PLL1ADIV_DIV42 ((uint32_t)0x0000002AU) +#define RCC_PLL1DIV_PLL1ADIV_DIV43 ((uint32_t)0x0000002BU) +#define RCC_PLL1DIV_PLL1ADIV_DIV44 ((uint32_t)0x0000002CU) +#define RCC_PLL1DIV_PLL1ADIV_DIV45 ((uint32_t)0x0000002DU) +#define RCC_PLL1DIV_PLL1ADIV_DIV46 ((uint32_t)0x0000002EU) +#define RCC_PLL1DIV_PLL1ADIV_DIV47 ((uint32_t)0x0000002FU) +#define RCC_PLL1DIV_PLL1ADIV_DIV48 ((uint32_t)0x00000030U) +#define RCC_PLL1DIV_PLL1ADIV_DIV49 ((uint32_t)0x00000031U) +#define RCC_PLL1DIV_PLL1ADIV_DIV50 ((uint32_t)0x00000032U) +#define RCC_PLL1DIV_PLL1ADIV_DIV51 ((uint32_t)0x00000033U) +#define RCC_PLL1DIV_PLL1ADIV_DIV52 ((uint32_t)0x00000034U) +#define RCC_PLL1DIV_PLL1ADIV_DIV53 ((uint32_t)0x00000035U) +#define RCC_PLL1DIV_PLL1ADIV_DIV54 ((uint32_t)0x00000036U) +#define RCC_PLL1DIV_PLL1ADIV_DIV55 ((uint32_t)0x00000037U) +#define RCC_PLL1DIV_PLL1ADIV_DIV56 ((uint32_t)0x00000038U) +#define RCC_PLL1DIV_PLL1ADIV_DIV57 ((uint32_t)0x00000039U) +#define RCC_PLL1DIV_PLL1ADIV_DIV58 ((uint32_t)0x0000003AU) +#define RCC_PLL1DIV_PLL1ADIV_DIV59 ((uint32_t)0x0000003BU) +#define RCC_PLL1DIV_PLL1ADIV_DIV60 ((uint32_t)0x0000003CU) +#define RCC_PLL1DIV_PLL1ADIV_DIV61 ((uint32_t)0x0000003DU) +#define RCC_PLL1DIV_PLL1ADIV_DIV62 ((uint32_t)0x0000003EU) +#define RCC_PLL1DIV_PLL1ADIV_DIV63 ((uint32_t)0x0000003FU) + + +/******** Bit definition for RCC_PLL2DIV register ********/ +#define RCC_PLL2DIV_PLL2CDIV ((uint32_t)0x003F0000U) /* Bit[21:16] */ +#define RCC_PLL2DIV_PLL2CDIV_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_PLL2DIV_PLL2CDIV_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_PLL2DIV_PLL2CDIV_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_PLL2DIV_PLL2CDIV_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_PLL2DIV_PLL2CDIV_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_PLL2DIV_PLL2CDIV_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_PLL2DIV_PLL2BDIV ((uint32_t)0x00003F00U) /* Bit[13:8] */ +#define RCC_PLL2DIV_PLL2BDIV_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_PLL2DIV_PLL2BDIV_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_PLL2DIV_PLL2BDIV_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_PLL2DIV_PLL2BDIV_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_PLL2DIV_PLL2BDIV_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_PLL2DIV_PLL2BDIV_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_PLL2DIV_PLL2ADIV ((uint32_t)0x0000003FU) /* Bit */ +#define RCC_PLL2DIV_PLL2ADIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_PLL2DIV_PLL2ADIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_PLL2DIV_PLL2ADIV_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_PLL2DIV_PLL2ADIV_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_PLL2DIV_PLL2ADIV_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_PLL2DIV_PLL2ADIV_5 ((uint32_t)0x00000020U) /* Bit5*/ + +/******** Bit definition for RCC_PLL3DIV register ********/ +#define RCC_PLL3DIV_PLL3CDIV ((uint32_t)0x003F0000U) /* Bit[21:16] */ +#define RCC_PLL3DIV_PLL3CDIV_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_PLL3DIV_PLL3CDIV_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_PLL3DIV_PLL3CDIV_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_PLL3DIV_PLL3CDIV_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_PLL3DIV_PLL3CDIV_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_PLL3DIV_PLL3CDIV_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_PLL3DIV_PLL3BDIV ((uint32_t)0x00003F00U) /* Bit[13:8] */ +#define RCC_PLL3DIV_PLL3BDIV_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_PLL3DIV_PLL3BDIV_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_PLL3DIV_PLL3BDIV_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_PLL3DIV_PLL3BDIV_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_PLL3DIV_PLL3BDIV_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_PLL3DIV_PLL3BDIV_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_PLL3DIV_PLL3ADIV ((uint32_t)0x0000003FU) /* Bit */ +#define RCC_PLL3DIV_PLL3ADIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_PLL3DIV_PLL3ADIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_PLL3DIV_PLL3ADIV_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_PLL3DIV_PLL3ADIV_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_PLL3DIV_PLL3ADIV_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_PLL3DIV_PLL3ADIV_5 ((uint32_t)0x00000020U) /* Bit5*/ + +/******** Bit definition for RCC_SYSBUSDIV1 register ********/ +#define RCC_SYSBUSDIV1_AXIHYPDIV ((uint32_t)0x0F000000U) /* Bit[27:24] */ +#define RCC_SYSBUSDIV1_AXIHYPDIV_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_SYSBUSDIV1_AXIHYPDIV_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_SYSBUSDIV1_AXIHYPDIV_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_SYSBUSDIV1_AXIHYPDIV_3 ((uint32_t)0x08000000U) /* Bit27*/ + +#define RCC_SYSBUSDIV1_AXIHYPDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_SYSBUSDIV1_AXIHYPDIV_DIV2 ((uint32_t)0x01000000U) +#define RCC_SYSBUSDIV1_AXIHYPDIV_DIV4 ((uint32_t)0x02000000U) +#define RCC_SYSBUSDIV1_AXIHYPDIV_DIV8 ((uint32_t)0x04000000U) +#define RCC_SYSBUSDIV1_AXIHYPDIV_DIV16 ((uint32_t)0x07000000U) +#define RCC_SYSBUSDIV1_AXIHYPDIV_DIV32 ((uint32_t)0x08000000U) +#define RCC_SYSBUSDIV1_AXIHYPDIV_DIV64 ((uint32_t)0x09000000U) +#define RCC_SYSBUSDIV1_AXIHYPDIV_DIV128 ((uint32_t)0x0A000000U) +#define RCC_SYSBUSDIV1_AXIHYPDIV_DIV256 ((uint32_t)0x0B000000U) +#define RCC_SYSBUSDIV1_AXIHYPDIV_DIV512 ((uint32_t)0x0C000000U) + +#define RCC_SYSBUSDIV1_HSIDIV ((uint32_t)0x00F00000U) /* Bit[23:20] */ +#define RCC_SYSBUSDIV1_HSIDIV_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_SYSBUSDIV1_HSIDIV_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_SYSBUSDIV1_HSIDIV_2 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_SYSBUSDIV1_HSIDIV_3 ((uint32_t)0x00800000U) /* Bit23*/ + +#define RCC_SYSBUSDIV1_HSIDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_SYSBUSDIV1_HSIDIV_DIV2 ((uint32_t)0x00100000U) +#define RCC_SYSBUSDIV1_HSIDIV_DIV4 ((uint32_t)0x00200000U) +#define RCC_SYSBUSDIV1_HSIDIV_DIV8 ((uint32_t)0x00400000U) +#define RCC_SYSBUSDIV1_HSIDIV_DIV16 ((uint32_t)0x00700000U) +#define RCC_SYSBUSDIV1_HSIDIV_DIV32 ((uint32_t)0x00800000U) +#define RCC_SYSBUSDIV1_HSIDIV_DIV64 ((uint32_t)0x00900000U) +#define RCC_SYSBUSDIV1_HSIDIV_DIV128 ((uint32_t)0x00A00000U) +#define RCC_SYSBUSDIV1_HSIDIV_DIV256 ((uint32_t)0x00B00000U) +#define RCC_SYSBUSDIV1_HSIDIV_DIV512 ((uint32_t)0x00C00000U) + +#define RCC_SYSBUSDIV1_M7HYPDIV ((uint32_t)0x000F0000U) /* Bit[19:16] */ +#define RCC_SYSBUSDIV1_M7HYPDIV_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_SYSBUSDIV1_M7HYPDIV_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_SYSBUSDIV1_M7HYPDIV_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_SYSBUSDIV1_M7HYPDIV_3 ((uint32_t)0x00080000U) /* Bit19*/ + +#define RCC_SYSBUSDIV1_M7HYPDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_SYSBUSDIV1_M7HYPDIV_DIV2 ((uint32_t)0x00010000U) +#define RCC_SYSBUSDIV1_M7HYPDIV_DIV4 ((uint32_t)0x00020000U) +#define RCC_SYSBUSDIV1_M7HYPDIV_DIV8 ((uint32_t)0x00040000U) +#define RCC_SYSBUSDIV1_M7HYPDIV_DIV16 ((uint32_t)0x00070000U) +#define RCC_SYSBUSDIV1_M7HYPDIV_DIV32 ((uint32_t)0x00080000U) +#define RCC_SYSBUSDIV1_M7HYPDIV_DIV64 ((uint32_t)0x00090000U) +#define RCC_SYSBUSDIV1_M7HYPDIV_DIV128 ((uint32_t)0x000A0000U) +#define RCC_SYSBUSDIV1_M7HYPDIV_DIV256 ((uint32_t)0x000B0000U) +#define RCC_SYSBUSDIV1_M7HYPDIV_DIV512 ((uint32_t)0x000C0000U) + +#define RCC_SYSBUSDIV1_AXIDIV ((uint32_t)0x0000F000U) /* Bit[15:12] */ +#define RCC_SYSBUSDIV1_AXIDIV_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_SYSBUSDIV1_AXIDIV_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_SYSBUSDIV1_AXIDIV_2 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_SYSBUSDIV1_AXIDIV_3 ((uint32_t)0x00008000U) /* Bit15*/ + +#define RCC_SYSBUSDIV1_AXIDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_SYSBUSDIV1_AXIDIV_DIV2 ((uint32_t)0x00001000U) +#define RCC_SYSBUSDIV1_AXIDIV_DIV4 ((uint32_t)0x00002000U) +#define RCC_SYSBUSDIV1_AXIDIV_DIV8 ((uint32_t)0x00004000U) +#define RCC_SYSBUSDIV1_AXIDIV_DIV16 ((uint32_t)0x00007000U) +#define RCC_SYSBUSDIV1_AXIDIV_DIV32 ((uint32_t)0x00008000U) +#define RCC_SYSBUSDIV1_AXIDIV_DIV64 ((uint32_t)0x00009000U) +#define RCC_SYSBUSDIV1_AXIDIV_DIV128 ((uint32_t)0x0000A000U) +#define RCC_SYSBUSDIV1_AXIDIV_DIV256 ((uint32_t)0x0000B000U) +#define RCC_SYSBUSDIV1_AXIDIV_DIV512 ((uint32_t)0x0000C000U) + +#define RCC_SYSBUSDIV1_BUSDIV ((uint32_t)0x00000F00U) /* Bit[11:8] */ +#define RCC_SYSBUSDIV1_BUSDIV_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_SYSBUSDIV1_BUSDIV_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_SYSBUSDIV1_BUSDIV_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_SYSBUSDIV1_BUSDIV_3 ((uint32_t)0x00000800U) /* Bit11*/ + +#define RCC_SYSBUSDIV1_BUSDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_SYSBUSDIV1_BUSDIV_DIV2 ((uint32_t)0x00000100U) +#define RCC_SYSBUSDIV1_BUSDIV_DIV4 ((uint32_t)0x00000200U) +#define RCC_SYSBUSDIV1_BUSDIV_DIV8 ((uint32_t)0x00000400U) +#define RCC_SYSBUSDIV1_BUSDIV_DIV16 ((uint32_t)0x00000700U) +#define RCC_SYSBUSDIV1_BUSDIV_DIV32 ((uint32_t)0x00000800U) +#define RCC_SYSBUSDIV1_BUSDIV_DIV64 ((uint32_t)0x00000900U) +#define RCC_SYSBUSDIV1_BUSDIV_DIV128 ((uint32_t)0x00000A00U) +#define RCC_SYSBUSDIV1_BUSDIV_DIV256 ((uint32_t)0x00000B00U) +#define RCC_SYSBUSDIV1_BUSDIV_DIV512 ((uint32_t)0x00000C00U) + +#define RCC_SYSBUSDIV1_MSIDIV ((uint32_t)0x000000F0U) /* Bit[7:4] */ +#define RCC_SYSBUSDIV1_MSIDIV_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_SYSBUSDIV1_MSIDIV_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_SYSBUSDIV1_MSIDIV_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_SYSBUSDIV1_MSIDIV_3 ((uint32_t)0x00000080U) /* Bit7*/ + +#define RCC_SYSBUSDIV1_MSIDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_SYSBUSDIV1_MSIDIV_DIV2 ((uint32_t)0x00000010U) +#define RCC_SYSBUSDIV1_MSIDIV_DIV4 ((uint32_t)0x00000020U) +#define RCC_SYSBUSDIV1_MSIDIV_DIV8 ((uint32_t)0x00000040U) +#define RCC_SYSBUSDIV1_MSIDIV_DIV16 ((uint32_t)0x00000070U) +#define RCC_SYSBUSDIV1_MSIDIV_DIV32 ((uint32_t)0x00000080U) +#define RCC_SYSBUSDIV1_MSIDIV_DIV64 ((uint32_t)0x00000090U) +#define RCC_SYSBUSDIV1_MSIDIV_DIV128 ((uint32_t)0x000000A0U) +#define RCC_SYSBUSDIV1_MSIDIV_DIV256 ((uint32_t)0x000000B0U) +#define RCC_SYSBUSDIV1_MSIDIV_DIV512 ((uint32_t)0x000000C0U) + +#define RCC_SYSBUSDIV1_SCLKDIV ((uint32_t)0x0000000FU) /* Bit */ +#define RCC_SYSBUSDIV1_SCLKDIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_SYSBUSDIV1_SCLKDIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_SYSBUSDIV1_SCLKDIV_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_SYSBUSDIV1_SCLKDIV_3 ((uint32_t)0x00000008U) /* Bit3*/ + +#define RCC_SYSBUSDIV1_SCLKDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_SYSBUSDIV1_SCLKDIV_DIV2 ((uint32_t)0x00000001U) +#define RCC_SYSBUSDIV1_SCLKDIV_DIV4 ((uint32_t)0x00000002U) +#define RCC_SYSBUSDIV1_SCLKDIV_DIV8 ((uint32_t)0x00000004U) +#define RCC_SYSBUSDIV1_SCLKDIV_DIV16 ((uint32_t)0x00000007U) +#define RCC_SYSBUSDIV1_SCLKDIV_DIV32 ((uint32_t)0x00000008U) +#define RCC_SYSBUSDIV1_SCLKDIV_DIV64 ((uint32_t)0x00000009U) +#define RCC_SYSBUSDIV1_SCLKDIV_DIV128 ((uint32_t)0x0000000AU) +#define RCC_SYSBUSDIV1_SCLKDIV_DIV256 ((uint32_t)0x0000000BU) +#define RCC_SYSBUSDIV1_SCLKDIV_DIV512 ((uint32_t)0x0000000CU) + +/******** Bit definition for RCC_SYSBUSDIV2 register ********/ +#define RCC_SYSBUSDIV2_APB6DIV ((uint32_t)0x07000000U) /* Bit[26:24] */ +#define RCC_SYSBUSDIV2_APB6DIV_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_SYSBUSDIV2_APB6DIV_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_SYSBUSDIV2_APB6DIV_2 ((uint32_t)0x04000000U) /* Bit26*/ + +#define RCC_SYSBUSDIV2_APB6DIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_SYSBUSDIV2_APB6DIV_DIV2 ((uint32_t)0x04000000U) +#define RCC_SYSBUSDIV2_APB6DIV_DIV4 ((uint32_t)0x05000000U) +#define RCC_SYSBUSDIV2_APB6DIV_DIV8 ((uint32_t)0x06000000U) +#define RCC_SYSBUSDIV2_APB6DIV_DIV16 ((uint32_t)0x07000000U) + +#define RCC_SYSBUSDIV2_APB5DIV ((uint32_t)0x00070000U) /* Bit[18:16] */ +#define RCC_SYSBUSDIV2_APB5DIV_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_SYSBUSDIV2_APB5DIV_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_SYSBUSDIV2_APB5DIV_2 ((uint32_t)0x00040000U) /* Bit18*/ + +#define RCC_SYSBUSDIV2_APB5DIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_SYSBUSDIV2_APB5DIV_DIV2 ((uint32_t)0x00040000U) +#define RCC_SYSBUSDIV2_APB5DIV_DIV4 ((uint32_t)0x00050000U) +#define RCC_SYSBUSDIV2_APB5DIV_DIV8 ((uint32_t)0x00060000U) +#define RCC_SYSBUSDIV2_APB5DIV_DIV16 ((uint32_t)0x00070000U) + +#define RCC_SYSBUSDIV2_APB2DIV ((uint32_t)0x00000700U) /* Bit[10:8] */ +#define RCC_SYSBUSDIV2_APB2DIV_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_SYSBUSDIV2_APB2DIV_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_SYSBUSDIV2_APB2DIV_2 ((uint32_t)0x00000400U) /* Bit10*/ + +#define RCC_SYSBUSDIV2_APB2DIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_SYSBUSDIV2_APB2DIV_DIV2 ((uint32_t)0x00000400U) +#define RCC_SYSBUSDIV2_APB2DIV_DIV4 ((uint32_t)0x00000500U) +#define RCC_SYSBUSDIV2_APB2DIV_DIV8 ((uint32_t)0x00000600U) +#define RCC_SYSBUSDIV2_APB2DIV_DIV16 ((uint32_t)0x00000700U) + +#define RCC_SYSBUSDIV2_APB1DIV ((uint32_t)0x00000007U) /* Bit */ +#define RCC_SYSBUSDIV2_APB1DIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_SYSBUSDIV2_APB1DIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_SYSBUSDIV2_APB1DIV_2 ((uint32_t)0x00000004U) /* Bit2*/ + +#define RCC_SYSBUSDIV2_APB1DIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_SYSBUSDIV2_APB1DIV_DIV2 ((uint32_t)0x00000004U) +#define RCC_SYSBUSDIV2_APB1DIV_DIV4 ((uint32_t)0x00000005U) +#define RCC_SYSBUSDIV2_APB1DIV_DIV8 ((uint32_t)0x00000006U) +#define RCC_SYSBUSDIV2_APB1DIV_DIV16 ((uint32_t)0x00000007U) + +/******** Bit definition for RCC_BOOTMODE register ********/ +#define RCC_BOOTMODE_MODE ((uint32_t)0xFFFFFFFFU) /* Bit */ +#define RCC_BOOTMODE_MODE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_BOOTMODE_MODE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_BOOTMODE_MODE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_BOOTMODE_MODE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_BOOTMODE_MODE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_BOOTMODE_MODE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_BOOTMODE_MODE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_BOOTMODE_MODE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_BOOTMODE_MODE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_BOOTMODE_MODE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_BOOTMODE_MODE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_BOOTMODE_MODE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_BOOTMODE_MODE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_BOOTMODE_MODE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_BOOTMODE_MODE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_BOOTMODE_MODE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define RCC_BOOTMODE_MODE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_BOOTMODE_MODE_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_BOOTMODE_MODE_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_BOOTMODE_MODE_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_BOOTMODE_MODE_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_BOOTMODE_MODE_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_BOOTMODE_MODE_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_BOOTMODE_MODE_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_BOOTMODE_MODE_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_BOOTMODE_MODE_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_BOOTMODE_MODE_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_BOOTMODE_MODE_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_BOOTMODE_MODE_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_BOOTMODE_MODE_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_BOOTMODE_MODE_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_BOOTMODE_MODE_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for RCC_AHB1DIV1 register ********/ +#define RCC_AHB1DIV1_ETH2SYSDIV ((uint32_t)0xF0000000U) /* Bit[31:28] */ +#define RCC_AHB1DIV1_ETH2SYSDIV_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_AHB1DIV1_ETH2SYSDIV_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_AHB1DIV1_ETH2SYSDIV_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_AHB1DIV1_ETH2SYSDIV_3 ((uint32_t)0x80000000U) /* Bit31*/ +#define RCC_AHB1DIV1_SDMMC2SYSDIV ((uint32_t)0x0F000000U) /* Bit[27:24] */ +#define RCC_AHB1DIV1_SDMMC2SYSDIV_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_AHB1DIV1_SDMMC2SYSDIV_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_AHB1DIV1_SDMMC2SYSDIV_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_AHB1DIV1_SDMMC2SYSDIV_3 ((uint32_t)0x08000000U) /* Bit27*/ + +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV2 ((uint32_t)0x01000000U) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV4 ((uint32_t)0x02000000U) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV8 ((uint32_t)0x04000000U) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV16 ((uint32_t)0x07000000U) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV32 ((uint32_t)0x08000000U) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV64 ((uint32_t)0x09000000U) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV128 ((uint32_t)0x0A000000U) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV256 ((uint32_t)0x0B000000U) +#define RCC_AHB1DIV1_SDMMC2SYSDIV_DIV512 ((uint32_t)0x0C000000U) +/******** Bit definition for RCC_AHB1DIV2 register ********/ +#define RCC_AHB1DIV2_ADC3SYSDIV ((uint32_t)0x003F0000U) /* Bit[21:16] */ +#define RCC_AHB1DIV2_ADC3SYSDIV_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_AHB1DIV2_ADC3SYSDIV_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_AHB1DIV2_ADC3SYSDIV_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_AHB1DIV2_ADC3SYSDIV_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_AHB1DIV2_ADC3SYSDIV_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_AHB1DIV2_ADC3SYSDIV_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_AHB1DIV2_ADC2SYSDIV ((uint32_t)0x00003F00U) /* Bit[13:8] */ +#define RCC_AHB1DIV2_ADC2SYSDIV_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_AHB1DIV2_ADC2SYSDIV_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_AHB1DIV2_ADC2SYSDIV_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_AHB1DIV2_ADC2SYSDIV_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_AHB1DIV2_ADC2SYSDIV_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_AHB1DIV2_ADC2SYSDIV_5 ((uint32_t)0x00002000U) /* Bit13*/ + +#define RCC_AHB1DIV2_ADC1SYSDIV ((uint32_t)0x0000003FU) /* Bit */ +#define RCC_AHB1DIV2_ADC1SYSDIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_AHB1DIV2_ADC1SYSDIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_AHB1DIV2_ADC1SYSDIV_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_AHB1DIV2_ADC1SYSDIV_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_AHB1DIV2_ADC1SYSDIV_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_AHB1DIV2_ADC1SYSDIV_5 ((uint32_t)0x00000020U) /* Bit5*/ + +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV1 ((uint32_t)0x00000001U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV2 ((uint32_t)0x00000002U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV3 ((uint32_t)0x00000003U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV4 ((uint32_t)0x00000004U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV5 ((uint32_t)0x00000005U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV6 ((uint32_t)0x00000006U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV7 ((uint32_t)0x00000007U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV8 ((uint32_t)0x00000008U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV9 ((uint32_t)0x00000009U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV10 ((uint32_t)0x0000000AU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV11 ((uint32_t)0x0000000BU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV12 ((uint32_t)0x0000000CU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV13 ((uint32_t)0x0000000DU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV14 ((uint32_t)0x0000000EU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV15 ((uint32_t)0x0000000FU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV16 ((uint32_t)0x00000010U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV17 ((uint32_t)0x00000011U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV18 ((uint32_t)0x00000012U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV19 ((uint32_t)0x00000013U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV20 ((uint32_t)0x00000014U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV21 ((uint32_t)0x00000015U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV22 ((uint32_t)0x00000016U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV23 ((uint32_t)0x00000017U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV24 ((uint32_t)0x00000018U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV25 ((uint32_t)0x00000019U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV26 ((uint32_t)0x0000001AU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV27 ((uint32_t)0x0000001BU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV28 ((uint32_t)0x0000001CU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV29 ((uint32_t)0x0000001DU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV30 ((uint32_t)0x0000001EU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV31 ((uint32_t)0x0000001FU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV32 ((uint32_t)0x00000020U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV33 ((uint32_t)0x00000021U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV34 ((uint32_t)0x00000022U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV35 ((uint32_t)0x00000023U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV36 ((uint32_t)0x00000024U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV37 ((uint32_t)0x00000025U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV38 ((uint32_t)0x00000026U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV39 ((uint32_t)0x00000027U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV40 ((uint32_t)0x00000028U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV41 ((uint32_t)0x00000029U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV42 ((uint32_t)0x0000002AU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV43 ((uint32_t)0x0000002BU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV44 ((uint32_t)0x0000002CU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV45 ((uint32_t)0x0000002DU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV46 ((uint32_t)0x0000002EU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV47 ((uint32_t)0x0000002FU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV48 ((uint32_t)0x00000030U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV49 ((uint32_t)0x00000031U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV50 ((uint32_t)0x00000032U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV51 ((uint32_t)0x00000033U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV52 ((uint32_t)0x00000034U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV53 ((uint32_t)0x00000035U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV54 ((uint32_t)0x00000036U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV55 ((uint32_t)0x00000037U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV56 ((uint32_t)0x00000038U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV57 ((uint32_t)0x00000039U) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV58 ((uint32_t)0x0000003AU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV59 ((uint32_t)0x0000003BU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV60 ((uint32_t)0x0000003CU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV61 ((uint32_t)0x0000003DU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV62 ((uint32_t)0x0000003EU) +#define RCC_AHB1DIV2_ADC1SYSDIV_DIV63 ((uint32_t)0x0000003FU) +/******** Bit definition for RCC_AHB1SEL1 register ********/ +#define RCC_AHB1SEL1_ETH2PTPSEL ((uint32_t)0x00300000U) /* Bit[21:20] */ +#define RCC_AHB1SEL1_ETH2PTPSEL_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_AHB1SEL1_ETH2PTPSEL_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_AHB1SEL1_SDMMC2KERSEL ((uint32_t)0x00007000U) /* Bit[14:12] */ +#define RCC_AHB1SEL1_SDMMC2KERSEL_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_AHB1SEL1_SDMMC2KERSEL_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_AHB1SEL1_SDMMC2KERSEL_2 ((uint32_t)0x00004000U) /* Bit14*/ + +#define RCC_AHB1SEL1_SDMMC2KERSEL_SYSBUSDIV ((uint32_t)0x00000000U) +#define RCC_AHB1SEL1_SDMMC2KERSEL_PERIPH ((uint32_t)0x00001000U) +#define RCC_AHB1SEL1_SDMMC2KERSEL_PLL2A ((uint32_t)0x00002000U) +#define RCC_AHB1SEL1_SDMMC2KERSEL_PLL3A ((uint32_t)0x00003000U) +#define RCC_AHB1SEL1_SDMMC2KERSEL_PLL1B ((uint32_t)0x00004000U) + +#define RCC_AHB1SEL1_ADC3PLLSEL ((uint32_t)0x00000300U) /* Bit[9:8] */ +#define RCC_AHB1SEL1_ADC3PLLSEL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_AHB1SEL1_ADC3PLLSEL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_AHB1SEL1_ADC2PLLSEL ((uint32_t)0x00000030U) /* Bit[5:4] */ +#define RCC_AHB1SEL1_ADC2PLLSEL_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_AHB1SEL1_ADC2PLLSEL_1 ((uint32_t)0x00000020U) /* Bit5*/ + +#define RCC_AHB1SEL1_ADC1PLLSEL ((uint32_t)0x00000003U) /* Bit */ +#define RCC_AHB1SEL1_ADC1PLLSEL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_AHB1SEL1_ADC1PLLSEL_1 ((uint32_t)0x00000002U) /* Bit1*/ + +#define RCC_AHB1SEL1_ADC1PLLSEL_PLL2B ((uint32_t)0x00000000U) /* Bit */ +#define RCC_AHB1SEL1_ADC1PLLSEL_PLL1B ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_AHB1SEL1_ADC1PLLSEL_PLL3B ((uint32_t)0x00000002U) +#define RCC_AHB1SEL1_ADC1PLLSEL_PLL3C ((uint32_t)0x00000003U) +/******** Bit definition for RCC_AHB1EN1 register ********/ +#define RCC_AHB1EN1_M7SDMMC2EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_AHB1EN1_M4SDMMC2EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_AHB1EN1_M7SDMMC2LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_AHB1EN1_M4SDMMC2LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AHB1EN1_M7USB2EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_AHB1EN1_M4USB2EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_AHB1EN1_M7USB2LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AHB1EN1_M4USB2LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AHB1EN1_M7DMAMUX1EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_AHB1EN1_M4DMAMUX1EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_AHB1EN1_M7DMAMUX1LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_AHB1EN1_M4DMAMUX1LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB1EN1_M7ADC1PLLEN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_AHB1EN1_M4ADC1PLLEN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_AHB1EN1_M7ADC1PLLLPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_AHB1EN1_M4ADC1PLLLPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_AHB1EN1_M7ADC1SYSEN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_AHB1EN1_M4ADC1SYSEN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_AHB1EN1_M7ADC1SYSLPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AHB1EN1_M4ADC1SYSLPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB1EN1_M7ADC1BUSEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AHB1EN1_M4ADC1BUSEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AHB1EN1_M7ADC1BUSLPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AHB1EN1_M4ADC1BUSLPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB1EN2 register ********/ +#define RCC_AHB1EN2_M7ETH2TXEN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_AHB1EN2_M4ETH2TXEN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_AHB1EN2_M7ETH2TXLPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AHB1EN2_M4ETH2TXLPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB1EN2_M7ETH2RXEN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_AHB1EN2_M4ETH2RXEN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_AHB1EN2_M7ETH2RXLPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_AHB1EN2_M4ETH2RXLPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AHB1EN2_M7ETH2MACEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AHB1EN2_M4ETH2MACEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AHB1EN2_M7ETH2MACLPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AHB1EN2_M4ETH2MACLPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB1EN3 register ********/ +#define RCC_AHB1EN3_M7ECCMACEN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_AHB1EN3_M4ECCMACEN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_AHB1EN3_M7ECCMACLPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_AHB1EN3_M4ECCMACLPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AHB1EN3_M7DMA1EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_AHB1EN3_M4DMA1EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_AHB1EN3_M7DMA1LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_AHB1EN3_M4DMA1LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB1EN3_M7DMA2EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_AHB1EN3_M4DMA2EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_AHB1EN3_M7DMA2LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AHB1EN3_M4DMA2LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB1EN3_M7DMA3EN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AHB1EN3_M4DMA3EN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AHB1EN3_M7DMA3LPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AHB1EN3_M4DMA3LPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB1EN4 register ********/ +#define RCC_AHB1EN4_M7ADC2PLLEN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_AHB1EN4_M4ADC2PLLEN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_AHB1EN4_M7ADC2PLLLPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_AHB1EN4_M4ADC2PLLLPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AHB1EN4_M7ADC2SYSEN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_AHB1EN4_M4ADC2SYSEN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_AHB1EN4_M7ADC2SYSLPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_AHB1EN4_M4ADC2SYSLPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AHB1EN4_M7ADC2BUSEN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_AHB1EN4_M4ADC2BUSEN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_AHB1EN4_M7ADC2BUSLPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_AHB1EN4_M4ADC2BUSLPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB1EN4_M7ADC3PLLEN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_AHB1EN4_M4ADC3PLLEN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_AHB1EN4_M7ADC3PLLLPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_AHB1EN4_M4ADC3PLLLPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_AHB1EN4_M7ADC3SYSEN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_AHB1EN4_M4ADC3SYSEN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_AHB1EN4_M7ADC3SYSLPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AHB1EN4_M4ADC3SYSLPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB1EN4_M7ADC3BUSEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AHB1EN4_M4ADC3BUSEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AHB1EN4_M7ADC3BUSLPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AHB1EN4_M4ADC3BUSLPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB1RST1 register ********/ +#define RCC_AHB1RST1_SDMMC2RST ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_AHB1RST1_SDHOST2RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AHB1RST1_USB2WRAPRST ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_AHB1RST1_USB2PORRST ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AHB1RST1_USB2RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AHB1RST1_DMAMUX1RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB1RST1_ADC1RST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB1RST2 register ********/ +#define RCC_AHB1RST2_ETH2RST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB1RST3 register ********/ +#define RCC_AHB1RST3_ECCMACRST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AHB1RST3_DMA1RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB1RST3_DMA2RST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB1RST3_DMA3RST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB1RST4 register ********/ +#define RCC_AHB1RST4_ADC2RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB1RST4_ADC3RST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_APB1DIV1 register ********/ +#define RCC_APB1DIV1_APB1USARTDIV ((uint32_t)0x70000000U) /* Bit[30:28] */ +#define RCC_APB1DIV1_APB1USARTDIV_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_APB1DIV1_APB1USARTDIV_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_APB1DIV1_APB1USARTDIV_2 ((uint32_t)0x40000000U) /* Bit30*/ + +#define RCC_APB1DIV1_APB1USARTDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_APB1DIV1_APB1USARTDIV_DIV2 ((uint32_t)0x40000000U) +#define RCC_APB1DIV1_APB1USARTDIV_DIV4 ((uint32_t)0x50000000U) +#define RCC_APB1DIV1_APB1USARTDIV_DIV8 ((uint32_t)0x60000000U) +#define RCC_APB1DIV1_APB1USARTDIV_DIV16 ((uint32_t)0x70000000U) + +#define RCC_APB1DIV1_APB1BTIMDIV ((uint32_t)0x07000000U) /* Bit[26:24] */ +#define RCC_APB1DIV1_APB1BTIMDIV_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_APB1DIV1_APB1BTIMDIV_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_APB1DIV1_APB1BTIMDIV_2 ((uint32_t)0x04000000U) /* Bit26*/ + +#define RCC_APB1DIV1_APB1BTIMDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_APB1DIV1_APB1BTIMDIV_DIV2 ((uint32_t)0x04000000U) +#define RCC_APB1DIV1_APB1BTIMDIV_DIV4 ((uint32_t)0x05000000U) +#define RCC_APB1DIV1_APB1BTIMDIV_DIV8 ((uint32_t)0x06000000U) +#define RCC_APB1DIV1_APB1BTIMDIV_DIV16 ((uint32_t)0x07000000U) + +#define RCC_APB1DIV1_APB1GTIMDIV ((uint32_t)0x00070000U) /* Bit[18:16] */ +#define RCC_APB1DIV1_APB1GTIMDIV_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_APB1DIV1_APB1GTIMDIV_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_APB1DIV1_APB1GTIMDIV_2 ((uint32_t)0x00040000U) /* Bit18*/ + +#define RCC_APB1DIV1_APB1GTIMDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_APB1DIV1_APB1GTIMDIV_DIV2 ((uint32_t)0x00040000U) +#define RCC_APB1DIV1_APB1GTIMDIV_DIV4 ((uint32_t)0x00050000U) +#define RCC_APB1DIV1_APB1GTIMDIV_DIV8 ((uint32_t)0x00060000U) +#define RCC_APB1DIV1_APB1GTIMDIV_DIV16 ((uint32_t)0x00070000U) + +#define RCC_APB1DIV1_APB1I2SDIV ((uint32_t)0x00000700U) /* Bit[10:8] */ +#define RCC_APB1DIV1_APB1I2SDIV_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_APB1DIV1_APB1I2SDIV_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_APB1DIV1_APB1I2SDIV_2 ((uint32_t)0x00000400U) /* Bit10*/ + +#define RCC_APB1DIV1_APB1I2SDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_APB1DIV1_APB1I2SDIV_DIV2 ((uint32_t)0x00000400U) +#define RCC_APB1DIV1_APB1I2SDIV_DIV4 ((uint32_t)0x00000500U) +#define RCC_APB1DIV1_APB1I2SDIV_DIV8 ((uint32_t)0x00000600U) +#define RCC_APB1DIV1_APB1I2SDIV_DIV16 ((uint32_t)0x00000700U) + +#define RCC_APB1DIV1_APB1FDCANDIV ((uint32_t)0x00000070U) /* Bit[6:4] */ +#define RCC_APB1DIV1_APB1FDCANDIV_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_APB1DIV1_APB1FDCANDIV_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_APB1DIV1_APB1FDCANDIV_2 ((uint32_t)0x00000040U) /* Bit6*/ + +#define RCC_APB1DIV1_APB1FDCANDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_APB1DIV1_APB1FDCANDIV_DIV2 ((uint32_t)0x00000040U) +#define RCC_APB1DIV1_APB1FDCANDIV_DIV4 ((uint32_t)0x00000050U) +#define RCC_APB1DIV1_APB1FDCANDIV_DIV8 ((uint32_t)0x00000060U) +#define RCC_APB1DIV1_APB1FDCANDIV_DIV16 ((uint32_t)0x00000070U) + +#define RCC_APB1DIV1_APB1I2CDIV ((uint32_t)0x00000007U) /* Bit */ +#define RCC_APB1DIV1_APB1I2CDIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_APB1DIV1_APB1I2CDIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_APB1DIV1_APB1I2CDIV_2 ((uint32_t)0x00000004U) /* Bit2*/ + +#define RCC_APB1DIV1_APB1I2CDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_APB1DIV1_APB1I2CDIV_DIV2 ((uint32_t)0x00000004U) +#define RCC_APB1DIV1_APB1I2CDIV_DIV4 ((uint32_t)0x00000005U) +#define RCC_APB1DIV1_APB1I2CDIV_DIV8 ((uint32_t)0x00000006U) +#define RCC_APB1DIV1_APB1I2CDIV_DIV16 ((uint32_t)0x00000007U) +/******** Bit definition for RCC_APB1SEL1 register ********/ +#define RCC_APB1SEL1_I2C1KERSEL ((uint32_t)0x70000000U) /* Bit[30:28] */ +#define RCC_APB1SEL1_I2C1KERSEL_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_APB1SEL1_I2C1KERSEL_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_APB1SEL1_I2C1KERSEL_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_APB1SEL1_I2C2KERSEL ((uint32_t)0x07000000U) /* Bit[26:24] */ +#define RCC_APB1SEL1_I2C2KERSEL_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_APB1SEL1_I2C2KERSEL_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_APB1SEL1_I2C2KERSEL_2 ((uint32_t)0x04000000U) /* Bit26*/ + +#define RCC_APB1SEL1_I2C3KERSEL ((uint32_t)0x00700000U) /* Bit[22:20] */ +#define RCC_APB1SEL1_I2C3KERSEL_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_APB1SEL1_I2C3KERSEL_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_APB1SEL1_I2C3KERSEL_2 ((uint32_t)0x00400000U) /* Bit22*/ + +#define RCC_APB1SEL1_I2C3KERSEL_SYSBUSDIV ((uint32_t)0x00000000U) +#define RCC_APB1SEL1_I2C3KERSEL_PLL3C ((uint32_t)0x00100000U) +#define RCC_APB1SEL1_I2C3KERSEL_HSI ((uint32_t)0x00200000U) +#define RCC_APB1SEL1_I2C3KERSEL_MSI ((uint32_t)0x00300000U) + +#define RCC_APB1SEL1_FDCAN1KERSEL ((uint32_t)0x00070000U) /* Bit[18:16] */ +#define RCC_APB1SEL1_FDCAN1KERSEL_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_APB1SEL1_FDCAN1KERSEL_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_APB1SEL1_FDCAN1KERSEL_2 ((uint32_t)0x00040000U) /* Bit18*/ + +#define RCC_APB1SEL1_FDCAN2KERSEL ((uint32_t)0x00000700U) /* Bit[10:8] */ +#define RCC_APB1SEL1_FDCAN2KERSEL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_APB1SEL1_FDCAN2KERSEL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_APB1SEL1_FDCAN2KERSEL_2 ((uint32_t)0x00000400U) /* Bit10*/ + +#define RCC_APB1SEL1_FDCAN2KERSEL_SYSBUSDIV ((uint32_t)0x00000000U) +#define RCC_APB1SEL1_FDCAN2KERSEL_PLL1C ((uint32_t)0x00000100U) +#define RCC_APB1SEL1_FDCAN2KERSEL_PLL2C ((uint32_t)0x00000200U) +#define RCC_APB1SEL1_FDCAN2KERSEL_PLL3B ((uint32_t)0x00000300U) +#define RCC_APB1SEL1_FDCAN2KERSEL_PERIPH ((uint32_t)0x00000400U) + +#define RCC_APB1SEL1_I2S4KERSEL ((uint32_t)0x0000000CU) /* Bit[3:2] */ +#define RCC_APB1SEL1_I2S4KERSEL_0 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_APB1SEL1_I2S4KERSEL_1 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_APB1SEL1_I2S3KERSEL ((uint32_t)0x00000003U) /* Bit */ +#define RCC_APB1SEL1_I2S3KERSEL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_APB1SEL1_I2S3KERSEL_1 ((uint32_t)0x00000002U) /* Bit1*/ + +/******** Bit definition for RCC_APB1SEL2 register ********/ +#define RCC_APB1SEL2_FDCAN5KERSEL ((uint32_t)0x70000000U) /* Bit[30:28] */ +#define RCC_APB1SEL2_FDCAN5KERSEL_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_APB1SEL2_FDCAN5KERSEL_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_APB1SEL2_FDCAN5KERSEL_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_APB1SEL2_FDCAN6KERSEL ((uint32_t)0x00700000U) /* Bit[22:20] */ +#define RCC_APB1SEL2_FDCAN6KERSEL_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_APB1SEL2_FDCAN6KERSEL_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_APB1SEL2_FDCAN6KERSEL_2 ((uint32_t)0x00400000U) /* Bit22*/ + +/******** Bit definition for RCC_APB1EN1 register ********/ +#define RCC_APB1EN1_M7BTIM1EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_APB1EN1_M4BTIM1EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_APB1EN1_M7BTIM1LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_APB1EN1_M4BTIM1LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB1EN1_M7BTIM2EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_APB1EN1_M4BTIM2EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_APB1EN1_M7BTIM2LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_APB1EN1_M4BTIM2LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB1EN1_M7BTIM3EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_APB1EN1_M4BTIM3EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_APB1EN1_M7BTIM3LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_APB1EN1_M4BTIM3LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB1EN1_M7BTIM4EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_APB1EN1_M4BTIM4EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_APB1EN1_M7BTIM4LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_APB1EN1_M4BTIM4LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB1EN1_M7GTIMB1EN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_APB1EN1_M4GTIMB1EN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_APB1EN1_M7GTIMB1LPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_APB1EN1_M4GTIMB1LPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB1EN1_M7GTIMB2EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_APB1EN1_M4GTIMB2EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_APB1EN1_M7GTIMB2LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_APB1EN1_M4GTIMB2LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB1EN1_M7GTIMB3EN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_APB1EN1_M4GTIMB3EN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_APB1EN1_M7GTIMB3LPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_APB1EN1_M4GTIMB3LPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_APB1EN1_M7GTIMA4EN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_APB1EN1_M4GTIMA4EN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_APB1EN1_M7GTIMA4LPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_APB1EN1_M4GTIMA4LPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_APB1EN2 register ********/ +#define RCC_APB1EN2_M7GTIMA5EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_APB1EN2_M4GTIMA5EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_APB1EN2_M7GTIMA5LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_APB1EN2_M4GTIMA5LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB1EN2_M7GTIMA6EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_APB1EN2_M4GTIMA6EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_APB1EN2_M7GTIMA6LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_APB1EN2_M4GTIMA6LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB1EN2_M7GTIMA7EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_APB1EN2_M4GTIMA7EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_APB1EN2_M7GTIMA7LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_APB1EN2_M4GTIMA7LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB1EN2_M7SPI3EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_APB1EN2_M4SPI3EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_APB1EN2_M7SPI3LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_APB1EN2_M4SPI3LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB1EN2_M7DAC12EN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_APB1EN2_M4DAC12EN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_APB1EN2_M7DAC12LPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_APB1EN2_M4DAC12LPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB1EN2_M7WWDG2EN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_APB1EN2_M4WWDG2EN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_APB1EN2_M7WWDG2LPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_APB1EN2_M4WWDG2LPEN ((uint32_t)0x00000010U) /* Bit[4] */ + +/******** Bit definition for RCC_APB1EN3 register ********/ +#define RCC_APB1EN3_M7USART1EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_APB1EN3_M4USART1EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_APB1EN3_M7USART1LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_APB1EN3_M4USART1LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB1EN3_M7USART2EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_APB1EN3_M4USART2EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_APB1EN3_M7USART2LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_APB1EN3_M4USART2LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB1EN3_M7USART3EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_APB1EN3_M4USART3EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_APB1EN3_M7USART3LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_APB1EN3_M4USART3LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB1EN3_M7USART4EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_APB1EN3_M4USART4EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_APB1EN3_M7USART4LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_APB1EN3_M4USART4LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB1EN3_M7UART9EN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_APB1EN3_M4UART9EN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_APB1EN3_M7UART9LPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_APB1EN3_M4UART9LPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB1EN3_M7UART10EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_APB1EN3_M4UART10EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_APB1EN3_M7UART10LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_APB1EN3_M4UART10LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB1EN3_M7UART11EN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_APB1EN3_M4UART11EN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_APB1EN3_M7UART11LPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_APB1EN3_M4UART11LPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_APB1EN3_M7UART12EN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_APB1EN3_M4UART12EN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_APB1EN3_M7UART12LPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_APB1EN3_M4UART12LPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_APB1EN4 register ********/ +#define RCC_APB1EN4_M7I2S3EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_APB1EN4_M4I2S3EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_APB1EN4_M7I2S3LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_APB1EN4_M4I2S3LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB1EN4_M7I2S4EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_APB1EN4_M4I2S4EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_APB1EN4_M7I2S4LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_APB1EN4_M4I2S4LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB1EN4_M7I2C1EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_APB1EN4_M4I2C1EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_APB1EN4_M7I2C1LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_APB1EN4_M4I2C1LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB1EN4_M7I2C2EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_APB1EN4_M4I2C2EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_APB1EN4_M7I2C2LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_APB1EN4_M4I2C2LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB1EN4_M7I2C3EN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_APB1EN4_M4I2C3EN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_APB1EN4_M7I2C3LPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_APB1EN4_M4I2C3LPEN ((uint32_t)0x00001000U) /* Bit[12] */ + +/******** Bit definition for RCC_APB1EN5 register ********/ +#define RCC_APB1EN5_M7FDCAN1EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_APB1EN5_M4FDCAN1EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_APB1EN5_M7FDCAN1LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_APB1EN5_M4FDCAN1LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB1EN5_M7FDCAN2EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_APB1EN5_M4FDCAN2EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_APB1EN5_M7FDCAN2LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_APB1EN5_M4FDCAN2LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB1EN5_M7FDCAN5EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_APB1EN5_M4FDCAN5EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_APB1EN5_M7FDCAN5LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_APB1EN5_M4FDCAN5LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB1EN5_M7FDCAN6EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_APB1EN5_M4FDCAN6EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_APB1EN5_M7FDCAN6LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_APB1EN5_M4FDCAN6LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB1EN5_FDCAN1STPREQ ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_APB1EN5_FDCAN1STPACK ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_APB1EN5_FDCAN2STPREQ ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_APB1EN5_FDCAN2STPACK ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_APB1EN5_FDCAN5STPREQ ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_APB1EN5_FDCAN5STPACK ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_APB1EN5_FDCAN6STPREQ ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_APB1EN5_FDCAN6STPACK ((uint32_t)0x00000004U) /* Bit[2] */ + +/******** Bit definition for RCC_APB1RST1 register ********/ +#define RCC_APB1RST1_BTIM1RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB1RST1_BTIM2RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB1RST1_BTIM3RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB1RST1_BTIM4RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB1RST1_GTIMB1RST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB1RST1_GTIMB2RST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB1RST1_GTIMB3RST ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_APB1RST1_GTIMA4RST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_APB1RST2 register ********/ +#define RCC_APB1RST2_GTIMA5RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB1RST2_GTIMA6RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB1RST2_GTIMA7RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB1RST2_SPI3RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB1RST2_DAC12RST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB1RST2_WWDG2RST ((uint32_t)0x00000010U) /* Bit[4] */ + +/******** Bit definition for RCC_APB1RST3 register ********/ +#define RCC_APB1RST3_USART1RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB1RST3_USART2RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB1RST3_USART3RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB1RST3_USART4RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB1RST3_UART9RST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB1RST3_UART10RST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB1RST3_UART11RST ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_APB1RST3_UART12RST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_APB1RST4 register ********/ +#define RCC_APB1RST4_I2S3RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB1RST4_I2S4RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB1RST4_I2C1RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB1RST4_I2C2RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB1RST4_I2C3RST ((uint32_t)0x00001000U) /* Bit[12] */ + +/******** Bit definition for RCC_APB1RST5 register ********/ +#define RCC_APB1RST5_FDCAN1RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB1RST5_FDCAN2RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB1RST5_FDCAN5RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB1RST5_FDCAN6RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB1RST5_CAHIRST ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_APB1RST5_CAHDRST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB2DIV1 register ********/ +#define RCC_AHB2DIV1_ETH1SYSDIV ((uint32_t)0xF0000000U) /* Bit[31:28] */ +#define RCC_AHB2DIV1_ETH1SYSDIV_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_AHB2DIV1_ETH1SYSDIV_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_AHB2DIV1_ETH1SYSDIV_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_AHB2DIV1_ETH1SYSDIV_3 ((uint32_t)0x80000000U) /* Bit31*/ + +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV2 ((uint32_t)0x10000000U) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV4 ((uint32_t)0x20000000U) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV8 ((uint32_t)0x40000000U) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV16 ((uint32_t)0x70000000U) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV32 ((uint32_t)0x80000000U) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV64 ((uint32_t)0x90000000U) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV128 ((uint32_t)0xA0000000U) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV256 ((uint32_t)0xB0000000U) +#define RCC_AHB2DIV1_ETH1SYSDIV_DIV512 ((uint32_t)0xC0000000U) + +#define RCC_AHB2DIV1_USBHSEDIV ((uint32_t)0x0000000FU) /* Bit */ +#define RCC_AHB2DIV1_USBHSEDIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_AHB2DIV1_USBHSEDIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_AHB2DIV1_USBHSEDIV_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_AHB2DIV1_USBHSEDIV_3 ((uint32_t)0x00000008U) /* Bit3*/ + +#define RCC_AHB2DIV1_USBHSEDIV_DIV1 ((uint32_t)0x00000000U) /* Bit */ +#define RCC_AHB2DIV1_USBHSEDIV_DIV2 ((uint32_t)0x00000001U) +/******** Bit definition for RCC_AHB2SEL1 register ********/ +#define RCC_AHB2SEL1_ETH1PTPSEL ((uint32_t)0x00300000U) /* Bit[21:20] */ +#define RCC_AHB2SEL1_ETH1PTPSEL_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_AHB2SEL1_ETH1PTPSEL_1 ((uint32_t)0x00200000U) /* Bit21*/ + +#define RCC_AHB2SEL1_ETH1PTPSEL_SYSBUSDIV ((uint32_t)0x00000000U) +#define RCC_AHB2SEL1_ETH1PTPSEL_PERIPH ((uint32_t)0x00100000U) +#define RCC_AHB2SEL1_ETH1PTPSEL_PLL2C ((uint32_t)0x00200000U) +#define RCC_AHB2SEL1_ETH1PTPSEL_PLL3A ((uint32_t)0x00300000U) + +#define RCC_AHB2SEL1_ETH1GMIITXSEL ((uint32_t)0x000C0000U) /* Bit[19:18] */ +#define RCC_AHB2SEL1_ETH1GMIITXSEL_0 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_AHB2SEL1_ETH1GMIITXSEL_1 ((uint32_t)0x00080000U) /* Bit19*/ + +#define RCC_AHB2SEL1_ETH1GMIITXSEL_PLL3A ((uint32_t)0x00000000U) +#define RCC_AHB2SEL1_ETH1GMIITXSEL_PLL2B ((uint32_t)0x00040000U) +#define RCC_AHB2SEL1_ETH1GMIITXSEL_IOM ((uint32_t)0x00080000U) +#define RCC_AHB2SEL1_ETH1GMIITXSEL_PLL1C ((uint32_t)0x000C0000U) +/******** Bit definition for RCC_AHB2EN1 register ********/ +#define RCC_AHB2EN1_M7USB1EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_AHB2EN1_M4USB1EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_AHB2EN1_M7USB1LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AHB2EN1_M4USB1LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AHB2EN1_M7ECCM2EN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_AHB2EN1_M4ECCM2EN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_AHB2EN1_M7ECCM2LPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_AHB2EN1_M4ECCM2LPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_AHB2EN1_M7CORDICEN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_AHB2EN1_M4CORDICEN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_AHB2EN1_M7CORDICLPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AHB2EN1_M4CORDICLPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB2EN1_M7SDPUEN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_AHB2EN1_M4SDPUEN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_AHB2EN1_M7SDPULPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_AHB2EN1_M4SDPULPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AHB2EN1_M7FMACEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AHB2EN1_M4FMACEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AHB2EN1_M7FMACLPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AHB2EN1_M4FMACLPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB2EN2 register ********/ +#define RCC_AHB2EN2_M7DAC56EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_AHB2EN2_M4DAC56EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_AHB2EN2_M7DAC56LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AHB2EN2_M4DAC56LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AHB2EN2_M7DAC34EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_AHB2EN2_M4DAC34EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_AHB2EN2_M7DAC34LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_AHB2EN2_M4DAC34LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB2EN2_M7ETH1TXEN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_AHB2EN2_M4ETH1TXEN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_AHB2EN2_M7ETH1TXLPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AHB2EN2_M4ETH1TXLPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB2EN2_M7ETH1RXEN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_AHB2EN2_M4ETH1RXEN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_AHB2EN2_M7ETH1RXLPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_AHB2EN2_M4ETH1RXLPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AHB2EN2_M7ETH1MACEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AHB2EN2_M4ETH1MACEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AHB2EN2_M7ETH1MACLPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AHB2EN2_M4ETH1MACLPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB2RST1 register ********/ +#define RCC_AHB2RST1_DAC56RST ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_AHB2RST1_DAC34RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AHB2RST1_USB1WRAPRST ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_AHB2RST1_USB1PORRST ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AHB2RST1_USB1RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AHB2RST1_ETH1RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB2RST1_ECCM2RST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_AHB2RST1_CORDICRST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB2RST1_SDPURST ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AHB2RST1_FMACRST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_APB2DIV1 register ********/ +#define RCC_APB2DIV1_APB2ATIMDIV ((uint32_t)0x70000000U) /* Bit[30:28] */ +#define RCC_APB2DIV1_APB2ATIMDIV_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_APB2DIV1_APB2ATIMDIV_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_APB2DIV1_APB2ATIMDIV_2 ((uint32_t)0x40000000U) /* Bit30*/ + +#define RCC_APB2DIV1_APB2ATIMDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_APB2DIV1_APB2ATIMDIV_DIV2 ((uint32_t)0x40000000U) +#define RCC_APB2DIV1_APB2ATIMDIV_DIV4 ((uint32_t)0x50000000U) +#define RCC_APB2DIV1_APB2ATIMDIV_DIV8 ((uint32_t)0x60000000U) +#define RCC_APB2DIV1_APB2ATIMDIV_DIV16 ((uint32_t)0x70000000U) + +#define RCC_APB2DIV1_APB2GTIMDIV ((uint32_t)0x07000000U) /* Bit[26:24] */ +#define RCC_APB2DIV1_APB2GTIMDIV_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_APB2DIV1_APB2GTIMDIV_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_APB2DIV1_APB2GTIMDIV_2 ((uint32_t)0x04000000U) /* Bit26*/ + +#define RCC_APB2DIV1_APB2GTIMDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_APB2DIV1_APB2GTIMDIV_DIV2 ((uint32_t)0x04000000U) +#define RCC_APB2DIV1_APB2GTIMDIV_DIV4 ((uint32_t)0x05000000U) +#define RCC_APB2DIV1_APB2GTIMDIV_DIV8 ((uint32_t)0x06000000U) +#define RCC_APB2DIV1_APB2GTIMDIV_DIV16 ((uint32_t)0x07000000U) + + +#define RCC_APB2DIV1_APB2I2SDIV ((uint32_t)0x00070000U) /* Bit[18:16] */ +#define RCC_APB2DIV1_APB2I2SDIV_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_APB2DIV1_APB2I2SDIV_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_APB2DIV1_APB2I2SDIV_2 ((uint32_t)0x00040000U) /* Bit18*/ + +#define RCC_APB2DIV1_APB2DSMUDIV ((uint32_t)0x00007000U) /* Bit[14:12] */ +#define RCC_APB2DIV1_APB2DSMUDIV_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_APB2DIV1_APB2DSMUDIV_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_APB2DIV1_APB2DSMUDIV_2 ((uint32_t)0x00004000U) /* Bit14*/ + +#define RCC_APB2DIV1_APB2DSMUDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_APB2DIV1_APB2DSMUDIV_DIV2 ((uint32_t)0x00004000U) +#define RCC_APB2DIV1_APB2DSMUDIV_DIV4 ((uint32_t)0x00005000U) +#define RCC_APB2DIV1_APB2DSMUDIV_DIV8 ((uint32_t)0x00006000U) +#define RCC_APB2DIV1_APB2DSMUDIV_DIV16 ((uint32_t)0x00007000U) + +#define RCC_APB2DIV1_APB2I2CDIV ((uint32_t)0x00000700U) /* Bit[10:8] */ +#define RCC_APB2DIV1_APB2I2CDIV_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_APB2DIV1_APB2I2CDIV_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_APB2DIV1_APB2I2CDIV_2 ((uint32_t)0x00000400U) /* Bit10*/ + +#define RCC_APB2DIV1_APB2FDCANDIV ((uint32_t)0x00000070U) /* Bit[6:4] */ +#define RCC_APB2DIV1_APB2FDCANDIV_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_APB2DIV1_APB2FDCANDIV_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_APB2DIV1_APB2FDCANDIV_2 ((uint32_t)0x00000040U) /* Bit6*/ + +/******** Bit definition for RCC_APB2SEL1 register ********/ +#define RCC_APB2SEL1_DSMUKERSEL ((uint32_t)0x00100000U) /* Bit[20] */ + +#define RCC_APB2SEL1_DSMUKERSEL_APB2 ((uint32_t)0x00000000U) +#define RCC_APB2SEL1_DSMUKERSEL_SYSBUSDIV ((uint32_t)0x00100000U) + +#define RCC_APB2SEL1_DSMUKERASEL ((uint32_t)0x00070000U) /* Bit[18:16] */ +#define RCC_APB2SEL1_DSMUKERASEL_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_APB2SEL1_DSMUKERASEL_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_APB2SEL1_DSMUKERASEL_2 ((uint32_t)0x00040000U) /* Bit18*/ + +#define RCC_APB2SEL1_DSMUKERASEL_APB2 ((uint32_t)0x00000000U) +#define RCC_APB2SEL1_DSMUKERASEL_PLL1B ((uint32_t)0x00010000U) +#define RCC_APB2SEL1_DSMUKERASEL_PLL2B ((uint32_t)0x00020000U) +#define RCC_APB2SEL1_DSMUKERASEL_PLL3A ((uint32_t)0x00030000U) +#define RCC_APB2SEL1_DSMUKERASEL_CKIN ((uint32_t)0x00040000U) +#define RCC_APB2SEL1_DSMUKERASEL_PERIPH ((uint32_t)0x00050000U) + +#define RCC_APB2SEL1_I2C4KERSEL ((uint32_t)0x00007000U) /* Bit[14:12] */ +#define RCC_APB2SEL1_I2C4KERSEL_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_APB2SEL1_I2C4KERSEL_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_APB2SEL1_I2C4KERSEL_2 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_APB2SEL1_I2C5KERSEL ((uint32_t)0x00000700U) /* Bit[10:8] */ +#define RCC_APB2SEL1_I2C5KERSEL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_APB2SEL1_I2C5KERSEL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_APB2SEL1_I2C5KERSEL_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_APB2SEL1_I2C6KERSEL ((uint32_t)0x00000070U) /* Bit[6:4] */ +#define RCC_APB2SEL1_I2C6KERSEL_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_APB2SEL1_I2C6KERSEL_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_APB2SEL1_I2C6KERSEL_2 ((uint32_t)0x00000040U) /* Bit6*/ + +#define RCC_APB2SEL1_I2S2KERSEL ((uint32_t)0x0000000CU) /* Bit[3:2] */ +#define RCC_APB2SEL1_I2S2KERSEL_0 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_APB2SEL1_I2S2KERSEL_1 ((uint32_t)0x00000008U) /* Bit3*/ + +#define RCC_APB2SEL1_I2S1KERSEL ((uint32_t)0x00000003U) /* Bit */ +#define RCC_APB2SEL1_I2S1KERSEL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_APB2SEL1_I2S1KERSEL_1 ((uint32_t)0x00000002U) /* Bit1*/ + +#define RCC_APB2SEL1_I2S1KERSEL_SYSBUSDIV ((uint32_t)0x00000000U) +#define RCC_APB2SEL1_I2S1KERSEL_PLL3B ((uint32_t)0x00000001U) +#define RCC_APB2SEL1_I2S1KERSEL_HSI ((uint32_t)0x00000002U) +#define RCC_APB2SEL1_I2S1KERSEL_CLKIN ((uint32_t)0x00000003U) +/******** Bit definition for RCC_APB2SEL2 register ********/ +#define RCC_APB2SEL2_FDCAN3KERSEL ((uint32_t)0x70000000U) /* Bit[30:28] */ +#define RCC_APB2SEL2_FDCAN3KERSEL_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_APB2SEL2_FDCAN3KERSEL_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_APB2SEL2_FDCAN3KERSEL_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_APB2SEL2_FDCAN4KERSEL ((uint32_t)0x00700000U) /* Bit[22:20] */ +#define RCC_APB2SEL2_FDCAN4KERSEL_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_APB2SEL2_FDCAN4KERSEL_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_APB2SEL2_FDCAN4KERSEL_2 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_APB2SEL2_FDCAN7KERSEL ((uint32_t)0x00007000U) /* Bit[14:12] */ +#define RCC_APB2SEL2_FDCAN7KERSEL_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_APB2SEL2_FDCAN7KERSEL_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_APB2SEL2_FDCAN7KERSEL_2 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_APB2SEL2_FDCAN8KERSEL ((uint32_t)0x00000070U) /* Bit[6:4] */ +#define RCC_APB2SEL2_FDCAN8KERSEL_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_APB2SEL2_FDCAN8KERSEL_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_APB2SEL2_FDCAN8KERSEL_2 ((uint32_t)0x00000040U) /* Bit6*/ + +/******** Bit definition for RCC_APB2EN1 register ********/ +#define RCC_APB2EN1_M7ATIM1EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_APB2EN1_M4ATIM1EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_APB2EN1_M7ATIM1LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_APB2EN1_M4ATIM1LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB2EN1_M7ATIM2EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_APB2EN1_M4ATIM2EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_APB2EN1_M7ATIM2LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_APB2EN1_M4ATIM2LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB2EN1_M7GTIMA1EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_APB2EN1_M4GTIMA1EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_APB2EN1_M7GTIMA1LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_APB2EN1_M4GTIMA1LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB2EN1_M7GTIMA2EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_APB2EN1_M4GTIMA2EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_APB2EN1_M7GTIMA2LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_APB2EN1_M4GTIMA2LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB2EN1_M7GTIMA3EN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_APB2EN1_M4GTIMA3EN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_APB2EN1_M7GTIMA3LPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_APB2EN1_M4GTIMA3LPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB2EN1_M7SHRTIM1EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_APB2EN1_M4SHRTIM1EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_APB2EN1_M7SHRTIM1LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_APB2EN1_M4SHRTIM1LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB2EN1_M7SHRTIM2EN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_APB2EN1_M4SHRTIM2EN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_APB2EN1_M7SHRTIM2LPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_APB2EN1_M4SHRTIM2LPEN ((uint32_t)0x00000010U) /* Bit[4] */ + +/******** Bit definition for RCC_APB2EN2 register ********/ +#define RCC_APB2EN2_M7I2S1EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_APB2EN2_M4I2S1EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_APB2EN2_M7I2S1LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_APB2EN2_M4I2S1LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB2EN2_M7I2S2EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_APB2EN2_M4I2S2EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_APB2EN2_M7I2S2LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_APB2EN2_M4I2S2LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB2EN2_M7SPI1EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_APB2EN2_M4SPI1EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_APB2EN2_M7SPI1LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_APB2EN2_M4SPI1LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB2EN2_M7SPI2EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_APB2EN2_M4SPI2EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_APB2EN2_M7SPI2LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_APB2EN2_M4SPI2LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB2EN2_M7DSMUEN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_APB2EN2_M4DSMUEN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_APB2EN2_M7DSMULPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_APB2EN2_M4DSMULPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB2EN2_M7I2C4EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_APB2EN2_M4I2C4EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_APB2EN2_M7I2C4LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_APB2EN2_M4I2C4LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB2EN2_M7I2C5EN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_APB2EN2_M4I2C5EN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_APB2EN2_M7I2C5LPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_APB2EN2_M4I2C5LPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_APB2EN2_M7I2C6EN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_APB2EN2_M4I2C6EN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_APB2EN2_M7I2C6LPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_APB2EN2_M4I2C6LPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_APB2EN3 register ********/ +#define RCC_APB2EN3_M7USART5EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_APB2EN3_M4USART5EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_APB2EN3_M7USART5LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_APB2EN3_M4USART5LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB2EN3_M7USART6EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_APB2EN3_M4USART6EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_APB2EN3_M7USART6LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_APB2EN3_M4USART6LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB2EN3_M7USART7EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_APB2EN3_M4USART7EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_APB2EN3_M7USART7LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_APB2EN3_M4USART7LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB2EN3_M7USART8EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_APB2EN3_M4USART8EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_APB2EN3_M7USART8LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_APB2EN3_M4USART8LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB2EN3_M7UART13EN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_APB2EN3_M4UART13EN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_APB2EN3_M7UART13LPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_APB2EN3_M4UART13LPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB2EN3_M7UART14EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_APB2EN3_M4UART14EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_APB2EN3_M7UART14LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_APB2EN3_M4UART14LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB2EN3_M7UART15EN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_APB2EN3_M4UART15EN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_APB2EN3_M7UART15LPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_APB2EN3_M4UART15LPEN ((uint32_t)0x00000010U) /* Bit[4] */ + +/******** Bit definition for RCC_APB2EN4 register ********/ +#define RCC_APB2EN4_M7FDCAN3EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_APB2EN4_M4FDCAN3EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_APB2EN4_M7FDCAN3LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_APB2EN4_M4FDCAN3LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB2EN4_M7FDCAN4EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_APB2EN4_M4FDCAN4EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_APB2EN4_M7FDCAN4LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_APB2EN4_M4FDCAN4LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB2EN4_M7FDCAN7EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_APB2EN4_M4FDCAN7EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_APB2EN4_M7FDCAN7LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_APB2EN4_M4FDCAN7LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB2EN4_M7FDCAN8EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_APB2EN4_M4FDCAN8EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_APB2EN4_M7FDCAN8LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_APB2EN4_M4FDCAN8LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB2EN4_FDCAN3STPREQ ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_APB2EN4_FDCAN3STPACK ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_APB2EN4_FDCAN4STPREQ ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_APB2EN4_FDCAN4STPACK ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_APB2EN4_FDCAN7STPREQ ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_APB2EN4_FDCAN7STPACK ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_APB2EN4_FDCAN8STPREQ ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_APB2EN4_FDCAN8STPACK ((uint32_t)0x00000004U) /* Bit[2] */ + +/******** Bit definition for RCC_APB2RST1 register ********/ +#define RCC_APB2RST1_ATIM1RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB2RST1_ATIM2RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB2RST1_GTIMA1RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB2RST1_GTIMA2RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB2RST1_GTIMA3RST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB2RST1_SHRTIM1RST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB2RST1_SHRTIM2RST ((uint32_t)0x00000010U) /* Bit[4] */ + +/******** Bit definition for RCC_APB2RST2 register ********/ +#define RCC_APB2RST2_I2S1RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB2RST2_I2S2RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB2RST2_SPI1RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB2RST2_SPI2RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB2RST2_DSMURST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB2RST2_I2C4RST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB2RST2_I2C5RST ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_APB2RST2_I2C6RST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_APB2RST3 register ********/ +#define RCC_APB2RST3_USART5RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB2RST3_USART6RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB2RST3_USART7RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB2RST3_USART8RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB2RST3_UART13RST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB2RST3_UART14RST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB2RST3_UART15RST ((uint32_t)0x00000010U) /* Bit[4] */ + +/******** Bit definition for RCC_APB2RST4 register ********/ +#define RCC_APB2RST4_FDCAN3RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB2RST4_FDCAN4RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB2RST4_FDCAN7RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB2RST4_FDCAN8RST ((uint32_t)0x00010000U) /* Bit[16] */ + +/******** Bit definition for RCC_AHB5EN1 register ********/ +#define RCC_AHB5EN1_M7GPIOAEN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_AHB5EN1_M4GPIOAEN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_AHB5EN1_M7GPIOALPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_AHB5EN1_M4GPIOALPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AHB5EN1_M7GPIOBEN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_AHB5EN1_M4GPIOBEN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_AHB5EN1_M7GPIOBLPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_AHB5EN1_M4GPIOBLPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AHB5EN1_M7GPIOCEN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_AHB5EN1_M4GPIOCEN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_AHB5EN1_M7GPIOCLPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AHB5EN1_M4GPIOCLPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AHB5EN1_M7GPIODEN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_AHB5EN1_M4GPIODEN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_AHB5EN1_M7GPIODLPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_AHB5EN1_M4GPIODLPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB5EN1_M7GPIOEEN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_AHB5EN1_M4GPIOEEN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_AHB5EN1_M7GPIOELPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_AHB5EN1_M4GPIOELPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_AHB5EN1_M7GPIOFEN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_AHB5EN1_M4GPIOFEN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_AHB5EN1_M7GPIOFLPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AHB5EN1_M4GPIOFLPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB5EN1_M7GPIOGEN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_AHB5EN1_M4GPIOGEN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_AHB5EN1_M7GPIOGLPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_AHB5EN1_M4GPIOGLPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AHB5EN1_M7GPIOHEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AHB5EN1_M4GPIOHEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AHB5EN1_M7GPIOHLPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AHB5EN1_M4GPIOHLPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB5EN2 register ********/ +#define RCC_AHB5EN2_M7GPIOIEN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_AHB5EN2_M4GPIOIEN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_AHB5EN2_M7GPIOILPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_AHB5EN2_M4GPIOILPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AHB5EN2_M7GPIOJEN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_AHB5EN2_M4GPIOJEN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_AHB5EN2_M7GPIOJLPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_AHB5EN2_M4GPIOJLPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AHB5EN2_M7GPIOKEN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_AHB5EN2_M4GPIOKEN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_AHB5EN2_M7GPIOKLPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AHB5EN2_M4GPIOKLPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AHB5EN2_M7ECCM3EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_AHB5EN2_M4ECCM3EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_AHB5EN2_M7ECCM3LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_AHB5EN2_M4ECCM3LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB5EN2_PWREN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_AHB5EN2_PWRLPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_AHB5EN2_M7CRCEN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_AHB5EN2_M4CRCEN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_AHB5EN2_M7CRCLPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AHB5EN2_M4CRCLPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB5EN2_M7SEMA4EN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_AHB5EN2_M4SEMA4EN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_AHB5EN2_M7SEMA4LPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_AHB5EN2_M4SEMA4LPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AHB5EN2_M7AFIOEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AHB5EN2_M4AFIOEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AHB5EN2_M7AFIOLPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AHB5EN2_M4AFIOLPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB5RST1 register ********/ +#define RCC_AHB5RST1_GPIOARST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AHB5RST1_GPIOBRST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AHB5RST1_GPIOCRST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AHB5RST1_GPIODRST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB5RST1_GPIOERST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_AHB5RST1_GPIOFRST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB5RST1_GPIOGRST ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AHB5RST1_GPIOHRST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB5RST2 register ********/ +#define RCC_AHB5RST2_GPIOIRST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AHB5RST2_GPIOJRST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AHB5RST2_GPIOKRST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AHB5RST2_ECCM3RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AHB5RST2_PWRRST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_AHB5RST2_CRCRST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AHB5RST2_SEMA4RST ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AHB5RST2_AFIORST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_APB5DIV1 register ********/ +#define RCC_APB5DIV1_APB5ATIMDIV ((uint32_t)0x70000000U) /* Bit[30:28] */ +#define RCC_APB5DIV1_APB5ATIMDIV_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_APB5DIV1_APB5ATIMDIV_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_APB5DIV1_APB5ATIMDIV_2 ((uint32_t)0x40000000U) /* Bit30*/ + +#define RCC_APB5DIV1_APB5ATIMDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_APB5DIV1_APB5ATIMDIV_DIV2 ((uint32_t)0x40000000U) +#define RCC_APB5DIV1_APB5ATIMDIV_DIV4 ((uint32_t)0x50000000U) +#define RCC_APB5DIV1_APB5ATIMDIV_DIV8 ((uint32_t)0x60000000U) +#define RCC_APB5DIV1_APB5ATIMDIV_DIV16 ((uint32_t)0x70000000U) + +#define RCC_APB5DIV1_APB5I2CDIV ((uint32_t)0x07000000U) /* Bit[26:24] */ +#define RCC_APB5DIV1_APB5I2CDIV_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_APB5DIV1_APB5I2CDIV_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_APB5DIV1_APB5I2CDIV_2 ((uint32_t)0x04000000U) /* Bit26*/ + +#define RCC_APB5DIV1_APB5EXTIDIV ((uint32_t)0x00700000U) /* Bit[22:20] */ +#define RCC_APB5DIV1_APB5EXTIDIV_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_APB5DIV1_APB5EXTIDIV_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_APB5DIV1_APB5EXTIDIV_2 ((uint32_t)0x00400000U) /* Bit22*/ + +#define RCC_APB5DIV1_APB5EXTIDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_APB5DIV1_APB5EXTIDIV_DIV2 ((uint32_t)0x00400000U) +#define RCC_APB5DIV1_APB5EXTIDIV_DIV4 ((uint32_t)0x00500000U) +#define RCC_APB5DIV1_APB5EXTIDIV_DIV8 ((uint32_t)0x00600000U) +#define RCC_APB5DIV1_APB5EXTIDIV_DIV16 ((uint32_t)0x00700000U) +/******** Bit definition for RCC_APB5SEL1 register ********/ +#define RCC_APB5SEL1_I2C7KERSEL ((uint32_t)0x70000000U) /* Bit[30:28] */ +#define RCC_APB5SEL1_I2C7KERSEL_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_APB5SEL1_I2C7KERSEL_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_APB5SEL1_I2C7KERSEL_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_APB5SEL1_I2C8KERSEL ((uint32_t)0x07000000U) /* Bit[26:24] */ +#define RCC_APB5SEL1_I2C8KERSEL_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_APB5SEL1_I2C8KERSEL_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_APB5SEL1_I2C8KERSEL_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_APB5SEL1_I2C9KERSEL ((uint32_t)0x00700000U) /* Bit[22:20] */ +#define RCC_APB5SEL1_I2C9KERSEL_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_APB5SEL1_I2C9KERSEL_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_APB5SEL1_I2C9KERSEL_2 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_APB5SEL1_I2C10KERSEL ((uint32_t)0x00070000U) /* Bit[18:16] */ +#define RCC_APB5SEL1_I2C10KERSEL_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_APB5SEL1_I2C10KERSEL_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_APB5SEL1_I2C10KERSEL_2 ((uint32_t)0x00040000U) /* Bit18*/ + +/******** Bit definition for RCC_APB5EN1 register ********/ +#define RCC_APB5EN1_M7ATIM3EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_APB5EN1_M4ATIM3EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_APB5EN1_M7ATIM3LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_APB5EN1_M4ATIM3LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB5EN1_M7ATIM4EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_APB5EN1_M4ATIM4EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_APB5EN1_M7ATIM4LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_APB5EN1_M4ATIM4LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB5EN1_M7AFECEN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_APB5EN1_M4AFECEN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_APB5EN1_M7AFECLPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_APB5EN1_M4AFECLPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB5EN1_M7SPI4EN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_APB5EN1_M4SPI4EN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_APB5EN1_M7SPI4LPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_APB5EN1_M4SPI4LPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB5EN1_M7SPI5EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_APB5EN1_M4SPI5EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_APB5EN1_M7SPI5LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_APB5EN1_M4SPI5LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB5EN1_M7SPI6EN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_APB5EN1_M4SPI6EN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_APB5EN1_M7SPI6LPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_APB5EN1_M4SPI6LPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_APB5EN1_M7SPI7EN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_APB5EN1_M4SPI7EN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_APB5EN1_M7SPI7LPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_APB5EN1_M4SPI7LPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_APB5EN2 register ********/ +#define RCC_APB5EN2_M7I2C7EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_APB5EN2_M4I2C7EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_APB5EN2_M7I2C7LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_APB5EN2_M4I2C7LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB5EN2_M7I2C8EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_APB5EN2_M4I2C8EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_APB5EN2_M7I2C8LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_APB5EN2_M4I2C8LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB5EN2_M7I2C9EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_APB5EN2_M4I2C9EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_APB5EN2_M7I2C9LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_APB5EN2_M4I2C9LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB5EN2_M7I2C10EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_APB5EN2_M4I2C10EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_APB5EN2_M7I2C10LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_APB5EN2_M4I2C10LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_APB5EN2_EXTIEN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_APB5EN2_EXTILPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_APB5EN2_M7RTCPCLKEN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_APB5EN2_M4RTCPCLKEN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_APB5EN2_M7RTCPCLKLPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_APB5EN2_M4RTCPCLKLPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB5EN2_IWDG1PCLKEN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_APB5EN2_IWDG1PCLKLPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_APB5EN2_IWDG2PCLKEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_APB5EN2_IWDG2PCLKLPEN ((uint32_t)0x00000002U) /* Bit[1] */ + +/******** Bit definition for RCC_APB5RST1 register ********/ +#define RCC_APB5RST1_ATIM3RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB5RST1_ATIM4RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB5RST1_AFECRST ((uint32_t)0x00100000U) +#define RCC_APB5RST1_SPI4RST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_APB5RST1_SPI5RST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_APB5RST1_SPI6RST ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_APB5RST1_SPI7RST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_APB5RST2 register ********/ +#define RCC_APB5RST2_I2C7RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_APB5RST2_I2C8RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_APB5RST2_I2C9RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_APB5RST2_I2C10RST ((uint32_t)0x00010000U) /* Bit[16] */ + +/******** Bit definition for RCC_AHB9DIV1 register ********/ +#define RCC_AHB9DIV1_ESCSYSDIV ((uint32_t)0x0000000FU) /* Bit */ +#define RCC_AHB9DIV1_ESCSYSDIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_AHB9DIV1_ESCSYSDIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_AHB9DIV1_ESCSYSDIV_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_AHB9DIV1_ESCSYSDIV_3 ((uint32_t)0x00000008U) /* Bit3*/ + +#define RCC_AHB9DIV1_ESCSYSDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV2 ((uint32_t)0x00000001U) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV4 ((uint32_t)0x00000002U) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV8 ((uint32_t)0x00000004U) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV16 ((uint32_t)0x00000007U) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV32 ((uint32_t)0x00000008U) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV64 ((uint32_t)0x00000009U) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV128 ((uint32_t)0x0000000AU) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV256 ((uint32_t)0x0000000BU) +#define RCC_AHB9DIV1_ESCSYSDIV_DIV512 ((uint32_t)0x0000000CU) +/******** Bit definition for RCC_AHB9SEL1 register ********/ +#define RCC_AHB9SEL1_ESCKERSEL ((uint32_t)0x00000007U) /* Bit */ +#define RCC_AHB9SEL1_ESCKERSEL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_AHB9SEL1_ESCKERSEL_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_AHB9SEL1_ESCKERSEL_2 ((uint32_t)0x00000004U) /* Bit2*/ + +#define RCC_AHB9SEL1_ESCKERSEL_SYSBUSDIV ((uint32_t)0x00000000U) +#define RCC_AHB9SEL1_ESCKERSEL_PLL2B ((uint32_t)0x00000001U) +#define RCC_AHB9SEL1_ESCKERSEL_PLL3A ((uint32_t)0x00000002U) +#define RCC_AHB9SEL1_ESCKERSEL_PLL3C ((uint32_t)0x00000003U) +#define RCC_AHB9SEL1_ESCKERSEL_PLL1B ((uint32_t)0x00000004U) +/******** Bit definition for RCC_AHB9EN1 register ********/ +#define RCC_AHB9EN1_M7ESCEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AHB9EN1_M4ESCEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AHB9EN1_M7ESCLPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AHB9EN1_M4ESCLPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AHB9RST1 register ********/ +#define RCC_AHB9RST1_ESCRST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_RDDIV1 register ********/ +#define RCC_RDDIV1_COMPDIV ((uint32_t)0x70000000U) /* Bit[30:28] */ +#define RCC_RDDIV1_COMPDIV_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_RDDIV1_COMPDIV_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_RDDIV1_COMPDIV_2 ((uint32_t)0x40000000U) /* Bit30*/ + +#define RCC_RDDIV1_COMPDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_RDDIV1_COMPDIV_DIV2 ((uint32_t)0x40000000U) +#define RCC_RDDIV1_COMPDIV_DIV4 ((uint32_t)0x50000000U) +#define RCC_RDDIV1_COMPDIV_DIV8 ((uint32_t)0x60000000U) +#define RCC_RDDIV1_COMPDIV_DIV16 ((uint32_t)0x70000000U) + +#define RCC_RDDIV1_LPUARTDIV ((uint32_t)0x07000000U) /* Bit[26:24] */ +#define RCC_RDDIV1_LPUARTDIV_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_RDDIV1_LPUARTDIV_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_RDDIV1_LPUARTDIV_2 ((uint32_t)0x04000000U) /* Bit26*/ + +#define RCC_RDDIV1_LPUARTDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_RDDIV1_LPUARTDIV_DIV2 ((uint32_t)0x04000000U) +#define RCC_RDDIV1_LPUARTDIV_DIV4 ((uint32_t)0x05000000U) +#define RCC_RDDIV1_LPUARTDIV_DIV8 ((uint32_t)0x06000000U) +#define RCC_RDDIV1_LPUARTDIV_DIV16 ((uint32_t)0x07000000U) +/******** Bit definition for RCC_RDSEL1 register ********/ +#define RCC_RDSEL1_LPTIM1SEL ((uint32_t)0xF0000000U) /* Bit[31:28] */ +#define RCC_RDSEL1_LPTIM1SEL_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_RDSEL1_LPTIM1SEL_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_RDSEL1_LPTIM1SEL_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_RDSEL1_LPTIM1SEL_3 ((uint32_t)0x80000000U) /* Bit31*/ + +#define RCC_RDSEL1_LPTIM1SEL_APB5 ((uint32_t)0x00000000) +#define RCC_RDSEL1_LPTIM1SEL_LSI ((uint32_t)0x10000000) +#define RCC_RDSEL1_LPTIM1SEL_LSE ((uint32_t)0x20000000) +#define RCC_RDSEL1_LPTIM1SEL_HSE ((uint32_t)0x30000000) +#define RCC_RDSEL1_LPTIM1SEL_HSI ((uint32_t)0x40000000) +#define RCC_RDSEL1_LPTIM1SEL_MSI ((uint32_t)0x50000000) +#define RCC_RDSEL1_LPTIM1SEL_COMP1 ((uint32_t)0x80000000) +#define RCC_RDSEL1_LPTIM1SEL_COMP2 ((uint32_t)0x90000000) +#define RCC_RDSEL1_LPTIM1SEL_COMP3 ((uint32_t)0xA0000000) +#define RCC_RDSEL1_LPTIM1SEL_COMP4 ((uint32_t)0xB0000000) + +#define RCC_RDSEL1_LPTIM2SEL ((uint32_t)0x0F000000U) /* Bit[27:24] */ +#define RCC_RDSEL1_LPTIM2SEL_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_RDSEL1_LPTIM2SEL_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_RDSEL1_LPTIM2SEL_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_RDSEL1_LPTIM2SEL_3 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_RDSEL1_LPTIM3SEL ((uint32_t)0x00F00000U) /* Bit[23:20] */ +#define RCC_RDSEL1_LPTIM3SEL_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_RDSEL1_LPTIM3SEL_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_RDSEL1_LPTIM3SEL_2 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_RDSEL1_LPTIM3SEL_3 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_RDSEL1_LPTIM4SEL ((uint32_t)0x000F0000U) /* Bit[19:16] */ +#define RCC_RDSEL1_LPTIM4SEL_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_RDSEL1_LPTIM4SEL_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_RDSEL1_LPTIM4SEL_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_RDSEL1_LPTIM4SEL_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_RDSEL1_LPTIM5SEL ((uint32_t)0x0000F000U) /* Bit[15:12] */ +#define RCC_RDSEL1_LPTIM5SEL_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_RDSEL1_LPTIM5SEL_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_RDSEL1_LPTIM5SEL_2 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_RDSEL1_LPTIM5SEL_3 ((uint32_t)0x00008000U) /* Bit15*/ + +#define RCC_RDSEL1_LPUART1SEL ((uint32_t)0x00000700U) /* Bit[10:8] */ +#define RCC_RDSEL1_LPUART1SEL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_RDSEL1_LPUART1SEL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_RDSEL1_LPUART1SEL_2 ((uint32_t)0x00000400U) /* Bit10*/ + +#define RCC_RDSEL1_LPUART1SEL_SYSBUSDIV ((uint32_t)0x00000000U) +#define RCC_RDSEL1_LPUART1SEL_HSI ((uint32_t)0x00000100U) +#define RCC_RDSEL1_LPUART1SEL_LSE ((uint32_t)0x00000200U) +#define RCC_RDSEL1_LPUART1SEL_HSE ((uint32_t)0x00000300U) +#define RCC_RDSEL1_LPUART1SEL_MSI ((uint32_t)0x00000400U) + +#define RCC_RDSEL1_LPUART2SEL ((uint32_t)0x00000070U) /* Bit[6:4] */ +#define RCC_RDSEL1_LPUART2SEL_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_RDSEL1_LPUART2SEL_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_RDSEL1_LPUART2SEL_2 ((uint32_t)0x00000040U) /* Bit6*/ + +#define RCC_RDSEL1_COMPSEL ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_RDCTRL1 register ********/ +#define RCC_RDCTRL1_LPTIM2FLTEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_RDCTRL1_LPTIM2FLTSEL ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_RDCTRL1_LPTIM2COMP4EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_RDCTRL1_LPTIM2COMP3EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_RDCTRL1_LPTIM2COMP2EN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_RDCTRL1_LPTIM2COMP1EN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_RDCTRL1_LPTIM2FLTDFC ((uint32_t)0x001F0000U) /* Bit[20:16] */ +#define RCC_RDCTRL1_LPTIM2FLTDFC_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_RDCTRL1_LPTIM2FLTDFC_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_RDCTRL1_LPTIM2FLTDFC_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_RDCTRL1_LPTIM2FLTDFC_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_RDCTRL1_LPTIM2FLTDFC_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_RDCTRL1_LPTIM1FLTEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_RDCTRL1_LPTIM1FLTSEL ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_RDCTRL1_LPTIM1COMP4EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_RDCTRL1_LPTIM1COMP3EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_RDCTRL1_LPTIM1COMP2EN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_RDCTRL1_LPTIM1COMP1EN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_RDCTRL1_LPTIM1FLTDFC ((uint32_t)0x0000001FU) /* Bit */ +#define RCC_RDCTRL1_LPTIM1FLTDFC_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_RDCTRL1_LPTIM1FLTDFC_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_RDCTRL1_LPTIM1FLTDFC_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_RDCTRL1_LPTIM1FLTDFC_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_RDCTRL1_LPTIM1FLTDFC_4 ((uint32_t)0x00000010U) /* Bit4*/ + +/******** Bit definition for RCC_RDCTRL2 register ********/ +#define RCC_RDCTRL2_LPTIM4FLTEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_RDCTRL2_LPTIM4FLTSEL ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_RDCTRL2_LPTIM4COMP4EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_RDCTRL2_LPTIM4COMP3EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_RDCTRL2_LPTIM4COMP2EN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_RDCTRL2_LPTIM4COMP1EN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_RDCTRL2_LPTIM4FLTDFC ((uint32_t)0x001F0000U) /* Bit[20:16] */ +#define RCC_RDCTRL2_LPTIM4FLTDFC_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_RDCTRL2_LPTIM4FLTDFC_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_RDCTRL2_LPTIM4FLTDFC_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_RDCTRL2_LPTIM4FLTDFC_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_RDCTRL2_LPTIM4FLTDFC_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_RDCTRL2_LPTIM3FLTEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_RDCTRL2_LPTIM3FLTSEL ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_RDCTRL2_LPTIM3COMP4EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_RDCTRL2_LPTIM3COMP3EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_RDCTRL2_LPTIM3COMP2EN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_RDCTRL2_LPTIM3COMP1EN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_RDCTRL2_LPTIM3FLTDFC ((uint32_t)0x0000001FU) /* Bit */ +#define RCC_RDCTRL2_LPTIM3FLTDFC_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_RDCTRL2_LPTIM3FLTDFC_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_RDCTRL2_LPTIM3FLTDFC_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_RDCTRL2_LPTIM3FLTDFC_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_RDCTRL2_LPTIM3FLTDFC_4 ((uint32_t)0x00000010U) /* Bit4*/ + +/******** Bit definition for RCC_RDCTRL3 register ********/ +#define RCC_RDCTRL3_LPTIM5FLTEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_RDCTRL3_LPTIM5FLTSEL ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_RDCTRL3_LPTIM5COMP4EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_RDCTRL3_LPTIM5COMP3EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_RDCTRL3_LPTIM5COMP2EN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_RDCTRL3_LPTIM5COMP1EN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_RDCTRL3_LPTIM5FLTDFC ((uint32_t)0x0000001FU) /* Bit */ +#define RCC_RDCTRL3_LPTIM5FLTDFC_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_RDCTRL3_LPTIM5FLTDFC_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_RDCTRL3_LPTIM5FLTDFC_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_RDCTRL3_LPTIM5FLTDFC_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_RDCTRL3_LPTIM5FLTDFC_4 ((uint32_t)0x00000010U) /* Bit4*/ + +/******** Bit definition for RCC_RDEN1 register ********/ +#define RCC_RDEN1_M7LPTIM1EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_RDEN1_M4LPTIM1EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_RDEN1_M7LPTIM1LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_RDEN1_M4LPTIM1LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_RDEN1_M7LPTIM2EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_RDEN1_M4LPTIM2EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_RDEN1_M7LPTIM2LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_RDEN1_M4LPTIM2LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_RDEN1_M7LPTIM3EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_RDEN1_M4LPTIM3EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_RDEN1_M7LPTIM3LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_RDEN1_M4LPTIM3LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_RDEN1_M7LPTIM4EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_RDEN1_M4LPTIM4EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_RDEN1_M7LPTIM4LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_RDEN1_M4LPTIM4LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_RDEN1_M7LPTIM5EN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_RDEN1_M4LPTIM5EN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_RDEN1_M7LPTIM5LPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_RDEN1_M4LPTIM5LPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_RDEN1_M7LPUART1EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_RDEN1_M4LPUART1EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_RDEN1_M7LPUART1LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_RDEN1_M4LPUART1LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_RDEN1_M7LPUART2EN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_RDEN1_M4LPUART2EN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_RDEN1_M7LPUART2LPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_RDEN1_M4LPUART2LPEN ((uint32_t)0x00000010U) /* Bit[4] */ + +/******** Bit definition for RCC_RDEN2 register ********/ +#define RCC_RDEN2_M7COMPEN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_RDEN2_M4COMPEN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_RDEN2_M7COMPLPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_RDEN2_M4COMPLPEN ((uint32_t)0x10000000U) /* Bit[28] */ + +/******** Bit definition for RCC_RDRST1 register ********/ +#define RCC_RDRST1_LPTIM1RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_RDRST1_LPTIM2RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_RDRST1_LPTIM3RST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_RDRST1_LPTIM4RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_RDRST1_LPTIM5RST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_RDRST1_LPUART1RST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_RDRST1_LPUART2RST ((uint32_t)0x00000010U) /* Bit[4] */ + +/******** Bit definition for RCC_RDRST2 register ********/ +#define RCC_RDRST2_COMPRST ((uint32_t)0x10000000U) /* Bit[28] */ + +/******** Bit definition for RCC_BDCTRL register ********/ +#define RCC_BDCTRL_AFELSERDF ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_BDCTRL_AFELSIRDF ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_BDCTRL_LSELDOEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_BDCTRL_LSIOVREN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_BDCTRL_LSIPFACK ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_BDCTRL_LSIPFF ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_BDCTRL_LSICSSEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_BDCTRL_LSERDCNTEN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_BDCTRL_RTCLSFSW ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_BDCTRL_RTCHSFSW ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_BDCTRL_LSISECRDF ((uint32_t)0x00080000U) /* Bit[19] */ + +#define RCC_BDCTRL_RTCEN ((uint32_t)0x00040000U) /* Bit[18] */ + +#define RCC_BDCTRL_RTCSEL ((uint32_t)0x00030000U) /* Bit[17:16] */ +#define RCC_BDCTRL_RTCSEL_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_BDCTRL_RTCSEL_1 ((uint32_t)0x00020000U) /* Bit17*/ + +#define RCC_BDCTRL_RTCSEL_LSE ((uint32_t)0x00010000U) +#define RCC_BDCTRL_RTCSEL_LSI ((uint32_t)0x00020000U) +#define RCC_BDCTRL_RTCSEL_HSEDIV ((uint32_t)0x00030000U) + +#define RCC_BDCTRL_BORRSTEN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_BDCTRL_C1LPRSTEN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_BDCTRL_C2LPRSTEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_BDCTRL_BDRST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_BDCTRL_BKPEMCRSTEN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_BDCTRL_RETEMCRSTEN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_BDCTRL_LSECSSF ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_BDCTRL_LSECSSEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_BDCTRL_LSERDEN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_BDCTRL_LSEBP ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_BDCTRL_LSERDF ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_BDCTRL_LSEEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_BDCTRL_LSIRDEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_BDCTRL_LSISECEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_BDCTRL_LSIRDF ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_BDCTRL_LSIEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_LSICSSDL register ********/ +#define RCC_LSICSSDL_DELAY ((uint32_t)0xFFFFFFFFU) /* Bit */ +#define RCC_LSICSSDL_DELAY_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_LSICSSDL_DELAY_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_LSICSSDL_DELAY_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_LSICSSDL_DELAY_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_LSICSSDL_DELAY_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_LSICSSDL_DELAY_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_LSICSSDL_DELAY_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_LSICSSDL_DELAY_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_LSICSSDL_DELAY_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_LSICSSDL_DELAY_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_LSICSSDL_DELAY_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_LSICSSDL_DELAY_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_LSICSSDL_DELAY_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_LSICSSDL_DELAY_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_LSICSSDL_DELAY_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_LSICSSDL_DELAY_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define RCC_LSICSSDL_DELAY_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_LSICSSDL_DELAY_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_LSICSSDL_DELAY_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_LSICSSDL_DELAY_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_LSICSSDL_DELAY_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_LSICSSDL_DELAY_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_LSICSSDL_DELAY_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_LSICSSDL_DELAY_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_LSICSSDL_DELAY_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_LSICSSDL_DELAY_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_LSICSSDL_DELAY_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_LSICSSDL_DELAY_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_LSICSSDL_DELAY_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_LSICSSDL_DELAY_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_LSICSSDL_DELAY_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_LSICSSDL_DELAY_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for RCC_CTRLSTS register ********/ +#define RCC_CTRLSTS_RMRSTF ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_CTRLSTS_C1LPRSTF ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_CTRLSTS_C2LPRSTF ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_CTRLSTS_RETEMCRSTF ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_CTRLSTS_BKPEMCRSTF ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_CTRLSTS_BORRSTF ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_CTRLSTS_MMURSTF ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_CTRLSTS_WWDG1RSTF ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_CTRLSTS_WWDG2RSTF ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_CTRLSTS_IWDG1RSTF ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_CTRLSTS_IWDG2RSTF ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_CTRLSTS_CM4SFTRSTF ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_CTRLSTS_CM7SFTRSTF ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_CTRLSTS_PORRSTF ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_CTRLSTS_PINRSTF ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_CLKINT1 register ********/ +#define RCC_CLKINT1_LSECSSIE ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_CLKINT1_LSECSSIF ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_CLKINT1_LSECSSIC ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_CLKINT1_HSECSSIF ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_CLKINT1_HSECSSIC ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_CLKINT1_BORIE ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_CLKINT1_BORIF ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_CLKINT1_BORIC ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_CLKINT1_PLL1RDIE ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_CLKINT1_PLL1RDIF ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_CLKINT1_PLL1RDIC ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_CLKINT1_PLL2RDIE ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_CLKINT1_PLL2RDIF ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_CLKINT1_PLL2RDIC ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_CLKINT1_PLL3RDIE ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_CLKINT1_PLL3RDIF ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_CLKINT1_PLL3RDIC ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_CLKINT1_SHRPLLRDIE ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_CLKINT1_SHRPLLRDIF ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_CLKINT1_SHRPLLRDIC ((uint32_t)0x00000010U) /* Bit[4] */ + +/******** Bit definition for RCC_CLKINT2 register ********/ +#define RCC_CLKINT2_HSERDIE ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_CLKINT2_HSERDIF ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_CLKINT2_HSERDIC ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_CLKINT2_HSIRDIE ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_CLKINT2_HSIRDIF ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_CLKINT2_HSIRDIC ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_CLKINT2_MSIRDIE ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_CLKINT2_MSIRDIF ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_CLKINT2_MSIRDIC ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_CLKINT2_LSERDIE ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_CLKINT2_LSERDIF ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_CLKINT2_LSERDIC ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_CLKINT2_LSIRDIE ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_CLKINT2_LSIRDIF ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_CLKINT2_LSIRDIC ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_CLKINT2_HSICALEIE ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_CLKINT2_HSICALEIF ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_CLKINT2_HSICALEIC ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_CLKINT2_MSICALEIE ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_CLKINT2_MSICALEIF ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_CLKINT2_MSICALEIC ((uint32_t)0x00000010U) /* Bit[4] */ + +/******** Bit definition for RCC_CLKINT3 register ********/ +#define RCC_CLKINT3_PLL1LKFIE ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_CLKINT3_PLL1LKFIF ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_CLKINT3_PLL1LKFIC ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_CLKINT3_PLL2LKFIE ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_CLKINT3_PLL2LKFIF ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_CLKINT3_PLL2LKFIC ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_CLKINT3_PLL3LKFIE ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_CLKINT3_PLL3LKFIF ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_CLKINT3_PLL3LKFIC ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_CLKINT3_SHRPLLLKFIE ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_CLKINT3_SHRPLLLKFIF ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_CLKINT3_SHRPLLLKFIC ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_CLKINT3_LSIFIE ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_CLKINT3_LSIFIF ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_CLKINT3_LSIFIC ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_CFG1 register ********/ +#define RCC_CFG1_WWDG2RSTDLCNT ((uint32_t)0x00F00000U) /* Bit[23:20] */ +#define RCC_CFG1_WWDG2RSTDLCNT_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_CFG1_WWDG2RSTDLCNT_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_CFG1_WWDG2RSTDLCNT_2 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_CFG1_WWDG2RSTDLCNT_3 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_CFG1_WWDG1RSTDLCNT ((uint32_t)0x000F0000U) /* Bit[19:16] */ +#define RCC_CFG1_WWDG1RSTDLCNT_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_CFG1_WWDG1RSTDLCNT_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_CFG1_WWDG1RSTDLCNT_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_CFG1_WWDG1RSTDLCNT_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_CFG1_WWDG2RSTEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_CFG1_WWDG1RSTEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_CFG1_M7TRACEDIV ((uint32_t)0x000000F0U) /* Bit[7:4] */ +#define RCC_CFG1_M7TRACEDIV_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_CFG1_M7TRACEDIV_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_CFG1_M7TRACEDIV_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_CFG1_M7TRACEDIV_3 ((uint32_t)0x00000080U) /* Bit7*/ + +#define RCC_CFG1_M7TRACEDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_CFG1_M7TRACEDIV_DIV2 ((uint32_t)0x00000010U) +#define RCC_CFG1_M7TRACEDIV_DIV4 ((uint32_t)0x00000020U) +#define RCC_CFG1_M7TRACEDIV_DIV8 ((uint32_t)0x00000040U) +#define RCC_CFG1_M7TRACEDIV_DIV16 ((uint32_t)0x00000070U) +#define RCC_CFG1_M7TRACEDIV_DIV32 ((uint32_t)0x00000080U) +#define RCC_CFG1_M7TRACEDIV_DIV64 ((uint32_t)0x00000090U) +#define RCC_CFG1_M7TRACEDIV_DIV128 ((uint32_t)0x000000A0U) +#define RCC_CFG1_M7TRACEDIV_DIV256 ((uint32_t)0x000000B0U) +#define RCC_CFG1_M7TRACEDIV_DIV512 ((uint32_t)0x000000C0U) + +#define RCC_CFG1_M4TRACEDIV ((uint32_t)0x0000000FU) /* Bit */ +#define RCC_CFG1_M4TRACEDIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_CFG1_M4TRACEDIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_CFG1_M4TRACEDIV_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_CFG1_M4TRACEDIV_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for RCC_AXIDIV1 register ********/ +#define RCC_AXIDIV1_JPEGAXIDIV ((uint32_t)0xF0000000U) /* Bit[31:28] */ +#define RCC_AXIDIV1_JPEGAXIDIV_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_AXIDIV1_JPEGAXIDIV_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_AXIDIV1_JPEGAXIDIV_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_AXIDIV1_JPEGAXIDIV_3 ((uint32_t)0x80000000U) /* Bit31*/ +#define RCC_AXIDIV1_JPEGSGDMADIV ((uint32_t)0x0F000000U) /* Bit[27:24] */ +#define RCC_AXIDIV1_JPEGSGDMADIV_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_AXIDIV1_JPEGSGDMADIV_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_AXIDIV1_JPEGSGDMADIV_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_AXIDIV1_JPEGSGDMADIV_3 ((uint32_t)0x08000000U) /* Bit27*/ + +#define RCC_AXIDIV1_SDMMC1AXIDIV ((uint32_t)0x00F00000U) /* Bit[23:20] */ +#define RCC_AXIDIV1_SDMMC1AXIDIV_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_AXIDIV1_SDMMC1AXIDIV_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_AXIDIV1_SDMMC1AXIDIV_2 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_AXIDIV1_SDMMC1AXIDIV_3 ((uint32_t)0x00800000U) /* Bit23*/ + +#define RCC_AXIDIV1_SDMMC1AXIDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_AXIDIV1_SDMMC1AXIDIV_DIV2 ((uint32_t)0x00100000U) +#define RCC_AXIDIV1_SDMMC1AXIDIV_DIV4 ((uint32_t)0x00200000U) +#define RCC_AXIDIV1_SDMMC1AXIDIV_DIV8 ((uint32_t)0x00400000U) +#define RCC_AXIDIV1_SDMMC1AXIDIV_DIV16 ((uint32_t)0x00700000U) +#define RCC_AXIDIV1_SDMMC1AXIDIV_DIV32 ((uint32_t)0x00800000U) +#define RCC_AXIDIV1_SDMMC1AXIDIV_DIV64 ((uint32_t)0x00900000U) +#define RCC_AXIDIV1_SDMMC1AXIDIV_DIV128 ((uint32_t)0x00A00000U) +#define RCC_AXIDIV1_SDMMC1AXIDIV_DIV256 ((uint32_t)0x00B00000U) +#define RCC_AXIDIV1_SDMMC1AXIDIV_DIV512 ((uint32_t)0x00C00000U) + +#define RCC_AXIDIV1_DSIREFDIV ((uint32_t)0x000F0000U) /* Bit[19:16] */ +#define RCC_AXIDIV1_DSIREFDIV_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_AXIDIV1_DSIREFDIV_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_AXIDIV1_DSIREFDIV_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_AXIDIV1_DSIREFDIV_3 ((uint32_t)0x00080000U) /* Bit19*/ + +#define RCC_AXIDIV1_DSIREFDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_AXIDIV1_DSIREFDIV_DIV2 ((uint32_t)0x00010000U) +#define RCC_AXIDIV1_DSIREFDIV_DIV4 ((uint32_t)0x00020000U) +#define RCC_AXIDIV1_DSIREFDIV_DIV8 ((uint32_t)0x00040000U) +#define RCC_AXIDIV1_DSIREFDIV_DIV16 ((uint32_t)0x00070000U) +#define RCC_AXIDIV1_DSIREFDIV_DIV32 ((uint32_t)0x00080000U) +#define RCC_AXIDIV1_DSIREFDIV_DIV64 ((uint32_t)0x00090000U) +#define RCC_AXIDIV1_DSIREFDIV_DIV128 ((uint32_t)0x000A0000U) +#define RCC_AXIDIV1_DSIREFDIV_DIV256 ((uint32_t)0x000B0000U) +#define RCC_AXIDIV1_DSIREFDIV_DIV512 ((uint32_t)0x000C0000U) + +#define RCC_AXIDIV1_LCDCAXIDIV ((uint32_t)0x0000F000U) /* Bit[15:12] */ +#define RCC_AXIDIV1_LCDCAXIDIV_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_AXIDIV1_LCDCAXIDIV_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_AXIDIV1_LCDCAXIDIV_2 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_AXIDIV1_LCDCAXIDIV_3 ((uint32_t)0x00008000U) /* Bit15*/ + +#define RCC_AXIDIV1_LCDCAXIDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_AXIDIV1_LCDCAXIDIV_DIV2 ((uint32_t)0x00001000U) +#define RCC_AXIDIV1_LCDCAXIDIV_DIV4 ((uint32_t)0x00002000U) +#define RCC_AXIDIV1_LCDCAXIDIV_DIV8 ((uint32_t)0x00004000U) +#define RCC_AXIDIV1_LCDCAXIDIV_DIV16 ((uint32_t)0x00007000U) +#define RCC_AXIDIV1_LCDCAXIDIV_DIV32 ((uint32_t)0x00008000U) +#define RCC_AXIDIV1_LCDCAXIDIV_DIV64 ((uint32_t)0x00009000U) +#define RCC_AXIDIV1_LCDCAXIDIV_DIV128 ((uint32_t)0x0000A000U) +#define RCC_AXIDIV1_LCDCAXIDIV_DIV256 ((uint32_t)0x0000B000U) +#define RCC_AXIDIV1_LCDCAXIDIV_DIV512 ((uint32_t)0x0000C000U) + +#define RCC_AXIDIV1_DVPMAXIDIV ((uint32_t)0x00000F00U) /* Bit[11:8] */ +#define RCC_AXIDIV1_DVPMAXIDIV_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_AXIDIV1_DVPMAXIDIV_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_AXIDIV1_DVPMAXIDIV_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_AXIDIV1_DVPMAXIDIV_3 ((uint32_t)0x00000800U) /* Bit11*/ + +#define RCC_AXIDIV1_DVPMAXIDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_AXIDIV1_DVPMAXIDIV_DIV2 ((uint32_t)0x00000100U) +#define RCC_AXIDIV1_DVPMAXIDIV_DIV4 ((uint32_t)0x00000200U) +#define RCC_AXIDIV1_DVPMAXIDIV_DIV8 ((uint32_t)0x00000400U) +#define RCC_AXIDIV1_DVPMAXIDIV_DIV16 ((uint32_t)0x00000700U) +#define RCC_AXIDIV1_DVPMAXIDIV_DIV32 ((uint32_t)0x00000800U) +#define RCC_AXIDIV1_DVPMAXIDIV_DIV64 ((uint32_t)0x00000900U) +#define RCC_AXIDIV1_DVPMAXIDIV_DIV128 ((uint32_t)0x00000A00U) +#define RCC_AXIDIV1_DVPMAXIDIV_DIV256 ((uint32_t)0x00000B00U) +#define RCC_AXIDIV1_DVPMAXIDIV_DIV512 ((uint32_t)0x00000C00U) +/******** Bit definition for RCC_AXIDIV2 register ********/ +#define RCC_AXIDIV2_DSIAXIPPIDIV ((uint32_t)0x00F00000U) /* Bit[23:20] */ +#define RCC_AXIDIV2_DSIAXIPPIDIV_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_AXIDIV2_DSIAXIPPIDIV_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_AXIDIV2_DSIAXIPPIDIV_2 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_AXIDIV2_DSIAXIPPIDIV_3 ((uint32_t)0x00800000U) /* Bit23*/ + +#define RCC_AXIDIV2_DSIREFULPSDIV ((uint32_t)0x000F0000U) /* Bit[19:16] */ +#define RCC_AXIDIV2_DSIREFULPSDIV_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_AXIDIV2_DSIREFULPSDIV_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_AXIDIV2_DSIREFULPSDIV_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_AXIDIV2_DSIREFULPSDIV_3 ((uint32_t)0x00080000U) /* Bit19*/ + +#define RCC_AXIDIV2_DSIREFULPSDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_AXIDIV2_DSIREFULPSDIV_DIV2 ((uint32_t)0x00010000U) +#define RCC_AXIDIV2_DSIREFULPSDIV_DIV4 ((uint32_t)0x00020000U) +#define RCC_AXIDIV2_DSIREFULPSDIV_DIV8 ((uint32_t)0x00040000U) +#define RCC_AXIDIV2_DSIREFULPSDIV_DIV16 ((uint32_t)0x00070000U) +#define RCC_AXIDIV2_DSIREFULPSDIV_DIV32 ((uint32_t)0x00080000U) +#define RCC_AXIDIV2_DSIREFULPSDIV_DIV64 ((uint32_t)0x00090000U) +#define RCC_AXIDIV2_DSIREFULPSDIV_DIV128 ((uint32_t)0x000A0000U) +#define RCC_AXIDIV2_DSIREFULPSDIV_DIV256 ((uint32_t)0x000B0000U) +#define RCC_AXIDIV2_DSIREFULPSDIV_DIV512 ((uint32_t)0x000C0000U) + +#define RCC_AXIDIV2_SDRAMMEMDIV ((uint32_t)0x00000F00U) /* Bit[11:8] */ +#define RCC_AXIDIV2_SDRAMMEMDIV_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_AXIDIV2_SDRAMMEMDIV_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_AXIDIV2_SDRAMMEMDIV_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_AXIDIV2_SDRAMMEMDIV_3 ((uint32_t)0x00000800U) /* Bit11*/ + +#define RCC_AXIDIV2_SDRAMMEMDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_AXIDIV2_SDRAMMEMDIV_DIV2 ((uint32_t)0x00000100U) +#define RCC_AXIDIV2_SDRAMMEMDIV_DIV4 ((uint32_t)0x00000200U) +#define RCC_AXIDIV2_SDRAMMEMDIV_DIV8 ((uint32_t)0x00000400U) +#define RCC_AXIDIV2_SDRAMMEMDIV_DIV16 ((uint32_t)0x00000700U) +#define RCC_AXIDIV2_SDRAMMEMDIV_DIV32 ((uint32_t)0x00000800U) +#define RCC_AXIDIV2_SDRAMMEMDIV_DIV64 ((uint32_t)0x00000900U) +#define RCC_AXIDIV2_SDRAMMEMDIV_DIV128 ((uint32_t)0x00000A00U) +#define RCC_AXIDIV2_SDRAMMEMDIV_DIV256 ((uint32_t)0x00000B00U) +#define RCC_AXIDIV2_SDRAMMEMDIV_DIV512 ((uint32_t)0x00000C00U) + +#define RCC_AXIDIV2_FEMCM1AXIDIV ((uint32_t)0x000000F0U) /* Bit[7:4] */ +#define RCC_AXIDIV2_FEMCM1AXIDIV_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_AXIDIV2_FEMCM1AXIDIV_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_AXIDIV2_FEMCM1AXIDIV_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_AXIDIV2_FEMCM1AXIDIV_3 ((uint32_t)0x00000080U) /* Bit7*/ + +#define RCC_AXIDIV2_FEMCM0AXIDIV ((uint32_t)0x0000000FU) /* Bit */ +#define RCC_AXIDIV2_FEMCM0AXIDIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_AXIDIV2_FEMCM0AXIDIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_AXIDIV2_FEMCM0AXIDIV_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_AXIDIV2_FEMCM0AXIDIV_3 ((uint32_t)0x00000008U) /* Bit3*/ + +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV1 ((uint32_t)0x00000001U) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV2 ((uint32_t)0x00000002U) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV3 ((uint32_t)0x00000003U) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV4 ((uint32_t)0x00000004U) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV5 ((uint32_t)0x00000005U) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV6 ((uint32_t)0x00000006U) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV7 ((uint32_t)0x00000007U) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV8 ((uint32_t)0x00000008U) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV9 ((uint32_t)0x00000009U) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV10 ((uint32_t)0x0000000AU) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV11 ((uint32_t)0x0000000BU) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV12 ((uint32_t)0x0000000CU) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV13 ((uint32_t)0x0000000DU) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV14 ((uint32_t)0x0000000EU) +#define RCC_AXIDIV2_FEMCM0AXIDIV_DIV15 ((uint32_t)0x0000000FU) +/******** Bit definition for RCC_AXISEL1 register ********/ +#define RCC_AXISEL1_DSIULPSSEL ((uint32_t)0x0C000000U) /* Bit[27:26] */ +#define RCC_AXISEL1_DSIULPSSEL_0 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_AXISEL1_DSIULPSSEL_1 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_AXISEL1_DSIKERSEL ((uint32_t)0x03000000U) /* Bit[25:24] */ +#define RCC_AXISEL1_DSIKERSEL_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_AXISEL1_DSIKERSEL_1 ((uint32_t)0x02000000U) /* Bit25*/ + +#define RCC_AXISEL1_SDMMC1KERSEL ((uint32_t)0x00700000U) /* Bit[22:20] */ +#define RCC_AXISEL1_SDMMC1KERSEL_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_AXISEL1_SDMMC1KERSEL_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_AXISEL1_SDMMC1KERSEL_2 ((uint32_t)0x00400000U) /* Bit22*/ + +#define RCC_AXISEL1_SDMMC1KERSEL_AXIDIV ((uint32_t)0x00000000U) +#define RCC_AXISEL1_SDMMC1KERSEL_PERIPH ((uint32_t)0x00100000U) +#define RCC_AXISEL1_SDMMC1KERSEL_PLL2A ((uint32_t)0x00200000U) +#define RCC_AXISEL1_SDMMC1KERSEL_PLL3A ((uint32_t)0x00300000U) +#define RCC_AXISEL1_SDMMC1KERSEL_PLL1B ((uint32_t)0x00400000U) + +#define RCC_AXISEL1_DSIPPITXSEL ((uint32_t)0x00030000U) /* Bit[17:16] */ +#define RCC_AXISEL1_DSIPPITXSEL_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_AXISEL1_DSIPPITXSEL_1 ((uint32_t)0x00020000U) /* Bit17*/ + +#define RCC_AXISEL1_DSIPPITXSEL_REFDIV ((uint32_t)0x00000000U) +#define RCC_AXISEL1_DSIPPITXSEL_PLL2B ((uint32_t)0x00010000U) +#define RCC_AXISEL1_DSIPPITXSEL_PERIPH ((uint32_t)0x00020000U) +#define RCC_AXISEL1_DSIPPITXSEL_AXIDIV ((uint32_t)0x00030000U) + +#define RCC_AXISEL1_LCDCKERSEL ((uint32_t)0x00003000U) /* Bit[13:12] */ +#define RCC_AXISEL1_LCDCKERSEL_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_AXISEL1_LCDCKERSEL_1 ((uint32_t)0x00002000U) /* Bit13*/ + +#define RCC_AXISEL1_LCDCKERSEL_AXIDIV ((uint32_t)0x00000000U) +#define RCC_AXISEL1_LCDCKERSEL_PERIPH ((uint32_t)0x00001000U) +#define RCC_AXISEL1_LCDCKERSEL_PLL2C ((uint32_t)0x00002000U) +#define RCC_AXISEL1_LCDCKERSEL_PLL3B ((uint32_t)0x00003000U) + +#define RCC_AXISEL1_DVP1MSEL ((uint32_t)0x00000C00U) /* Bit[11:10] */ +#define RCC_AXISEL1_DVP1MSEL_0 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_AXISEL1_DVP1MSEL_1 ((uint32_t)0x00000800U) /* Bit11*/ + +#define RCC_AXISEL1_DVP1MSEL_AXIDIV ((uint32_t)0x00000000U) +#define RCC_AXISEL1_DVP1MSEL_PERIPH ((uint32_t)0x00000400U) +#define RCC_AXISEL1_DVP1MSEL_PLL2C ((uint32_t)0x00000800U) +#define RCC_AXISEL1_DVP1MSEL_PLL3A ((uint32_t)0x00000C00U) + +#define RCC_AXISEL1_DVP2MSEL ((uint32_t)0x00000300U) /* Bit[9:8] */ +#define RCC_AXISEL1_DVP2MSEL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_AXISEL1_DVP2MSEL_1 ((uint32_t)0x00000200U) /* Bit9*/ + +#define RCC_AXISEL1_XSPI1SSISEL ((uint32_t)0x00000070U) /* Bit[6:4] */ +#define RCC_AXISEL1_XSPI1SSISEL_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_AXISEL1_XSPI1SSISEL_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_AXISEL1_XSPI1SSISEL_2 ((uint32_t)0x00000040U) /* Bit6*/ + +#define RCC_AXISEL1_XSPI1SSISEL_AXI ((uint32_t)0x00000000U) +#define RCC_AXISEL1_XSPI1SSISEL_PLL3C ((uint32_t)0x00000010U) +#define RCC_AXISEL1_XSPI1SSISEL_PLL1B ((uint32_t)0x00000020U) +#define RCC_AXISEL1_XSPI1SSISEL_PLL2A ((uint32_t)0x00000030U) +#define RCC_AXISEL1_XSPI1SSISEL_PLL2C ((uint32_t)0x00000040U) + +#define RCC_AXISEL1_XSPI2SSISEL ((uint32_t)0x00000007U) /* Bit */ +#define RCC_AXISEL1_XSPI2SSISEL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_AXISEL1_XSPI2SSISEL_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_AXISEL1_XSPI2SSISEL_2 ((uint32_t)0x00000004U) /* Bit2*/ + +/******** Bit definition for RCC_AXISEL2 register ********/ +#define RCC_AXISEL2_SDRAMMEMSEL ((uint32_t)0x00000700U) /* Bit[10:8] */ +#define RCC_AXISEL2_SDRAMMEMSEL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_AXISEL2_SDRAMMEMSEL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_AXISEL2_SDRAMMEMSEL_2 ((uint32_t)0x00000400U) /* Bit10*/ + +#define RCC_AXISEL2_SDRAMMEMSEL_AXIDIV ((uint32_t)0x00000000U) +#define RCC_AXISEL2_SDRAMMEMSEL_PERIPH ((uint32_t)0x00000100U) +#define RCC_AXISEL2_SDRAMMEMSEL_PLL2A ((uint32_t)0x00000200U) +#define RCC_AXISEL2_SDRAMMEMSEL_PLL3A ((uint32_t)0x00000300U) +#define RCC_AXISEL2_SDRAMMEMSEL_PLL1B ((uint32_t)0x00000400U) + +#define RCC_AXISEL2_FEMCM1SEL ((uint32_t)0x00000070U) /* Bit[6:4] */ +#define RCC_AXISEL2_FEMCM1SEL_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_AXISEL2_FEMCM1SEL_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_AXISEL2_FEMCM1SEL_2 ((uint32_t)0x00000040U) /* Bit6*/ + +#define RCC_AXISEL2_FEMCM0SEL ((uint32_t)0x00000007U) /* Bit */ +#define RCC_AXISEL2_FEMCM0SEL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_AXISEL2_FEMCM0SEL_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_AXISEL2_FEMCM0SEL_2 ((uint32_t)0x00000004U) /* Bit2*/ + +#define RCC_AXISEL2_FEMCM0SEL_AXIDIV ((uint32_t)0x00000000U) +#define RCC_AXISEL2_FEMCM0SEL_PERIPH ((uint32_t)0x00000001U) +#define RCC_AXISEL2_FEMCM0SEL_PLL2C ((uint32_t)0x00000002U) +#define RCC_AXISEL2_FEMCM0SEL_PLL3B ((uint32_t)0x00000003U) +#define RCC_AXISEL2_FEMCM0SEL_PLL1B ((uint32_t)0x00000004U) +/******** Bit definition for RCC_AXIEN1 register ********/ +#define RCC_AXIEN1_M7JPEGDEN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_AXIEN1_M4JPEGDEN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_AXIEN1_M7JPEGDLPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_AXIEN1_M4JPEGDLPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AXIEN1_M7JPEGEEN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_AXIEN1_M4JPEGEEN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_AXIEN1_M7JPEGELPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AXIEN1_M4JPEGELPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AXIEN1_M7DMAMUX2EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_AXIEN1_M4DMAMUX2EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_AXIEN1_M7DMAMUX2LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_AXIEN1_M4DMAMUX2LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AXIEN1_M7MDMAEN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_AXIEN1_M4MDMAEN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_AXIEN1_M7MDMALPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_AXIEN1_M4MDMALPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_AXIEN1_M7SDMMC1EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_AXIEN1_M4SDMMC1EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_AXIEN1_M7SDMMC1LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AXIEN1_M4SDMMC1LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AXIEN1_M7ECCM1EN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_AXIEN1_M4ECCM1EN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_AXIEN1_M7ECCM1LPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_AXIEN1_M4ECCM1LPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AXIEN1_M7OTPCEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AXIEN1_M4OTPCEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AXIEN1_M7OTPCLPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AXIEN1_M4OTPCLPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AXIEN2 register ********/ +#define RCC_AXIEN2_M7DSIEN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_AXIEN2_M4DSIEN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_AXIEN2_M7DSILPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_AXIEN2_M4DSILPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AXIEN2_M7LCDCEN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_AXIEN2_M4LCDCEN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_AXIEN2_M7LCDCLPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_AXIEN2_M4LCDCLPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AXIEN2_M7LCDCAPBEN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_AXIEN2_M4LCDCAPBEN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_AXIEN2_M7LCDCAPBLPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AXIEN2_M4LCDCAPBLPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AXIEN2_M7DVP1EN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_AXIEN2_M4DVP1EN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_AXIEN2_M7DVP1LPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_AXIEN2_M4DVP1LPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AXIEN2_M7DVP1APBEN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_AXIEN2_M4DVP1APBEN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_AXIEN2_M7DVP1APBLPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_AXIEN2_M4DVP1APBLPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_AXIEN2_M7DVP2EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_AXIEN2_M4DVP2EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_AXIEN2_M7DVP2LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AXIEN2_M4DVP2LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AXIEN2_M7DVP2APBEN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_AXIEN2_M4DVP2APBEN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_AXIEN2_M7DVP2APBLPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_AXIEN2_M4DVP2APBLPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AXIEN2_M7WWDG1EN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AXIEN2_M4WWDG1EN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AXIEN2_M7WWDG1LPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AXIEN2_M4WWDG1LPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AXIEN3 register ********/ +#define RCC_AXIEN3_M7TASRAM2EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_AXIEN3_M4TASRAM2EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_AXIEN3_M7TASRAM2LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_AXIEN3_M4TASRAM2LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AXIEN3_M7TASRAM3EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_AXIEN3_M4TASRAM3EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_AXIEN3_M7TASRAM3LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_AXIEN3_M4TASRAM3LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AXIEN3_M7TCMEN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_AXIEN3_M4TCMEN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_AXIEN3_M7TCMLPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AXIEN3_M4TCMLPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AXIEN3_M7TCMAXIEN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_AXIEN3_M4TCMAXIEN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_AXIEN3_M7TCMAXILPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_AXIEN3_M4TCMAXILPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AXIEN3_M7TCMAPBEN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_AXIEN3_M4TCMAPBEN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_AXIEN3_M7TCMAPBLPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_AXIEN3_M4TCMAPBLPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_AXIEN3_M7ASRAM1EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_AXIEN3_M4ASRAM1EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_AXIEN3_M7ASRAM1LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AXIEN3_M4ASRAM1LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AXIEN3_M7AXIROMEN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_AXIEN3_M4AXIROMEN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_AXIEN3_M7AXIROMLPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_AXIEN3_M4AXIROMLPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AXIEN3_M7GPUEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AXIEN3_M4GPUEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AXIEN3_M7GPULPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AXIEN3_M4GPULPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AXIEN4 register ********/ +#define RCC_AXIEN4_M7XSPI1EN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_AXIEN4_M4XSPI1EN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_AXIEN4_M7XSPI1LPEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_AXIEN4_M4XSPI1LPEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AXIEN4_M7XSPI2EN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_AXIEN4_M4XSPI2EN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_AXIEN4_M7XSPI2LPEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_AXIEN4_M4XSPI2LPEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AXIEN4_M7FEMCEN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_AXIEN4_M4FEMCEN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_AXIEN4_M7FEMCLPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AXIEN4_M4FEMCLPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AXIEN4_M7SDRAMEN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_AXIEN4_M4SDRAMEN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_AXIEN4_M7SDRAMLPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_AXIEN4_M4SDRAMLPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AXIEN4_M7DSIULPSEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_AXIEN4_M4DSIULPSEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_AXIEN4_M7DSIULPSLPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_AXIEN4_M4DSIULPSLPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AXIRST1 register ********/ +#define RCC_AXIRST1_JPEGDRST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AXIRST1_JPEGERST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AXIRST1_DMAMUX2RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AXIRST1_MDMARST ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_AXIRST1_SDMMC1RST ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_AXIRST1_SDHOST1RST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AXIRST1_ECCM1RST ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_AXIRST1_OTPCRST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AXIRST2 register ********/ +#define RCC_AXIRST2_DSICFGRST ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_AXIRST2_DSIRST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AXIRST2_LCDCRST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AXIRST2_DVP1RST ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_AXIRST2_DVP2RST ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_AXIRST2_WWDG1RST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AXIRST3 register ********/ +#define RCC_AXIRST3_GPURST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_AXIRST4 register ********/ +#define RCC_AXIRST4_XSPI1RST ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_AXIRST4_XSPI2RST ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_AXIRST4_FEMCCFGRST ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_AXIRST4_FEMCRST ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_AXIRST4_SDRAMRST ((uint32_t)0x00010000U) /* Bit[16] */ + +/******** Bit definition for RCC_CFG2 register ********/ +#define RCC_CFG2_M4CAHIEN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_CFG2_M4CAHIPCLKEN ((uint32_t)0x10000000U) /* Bit[28] */ +#define RCC_CFG2_M4CAHDEN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_CFG2_M4CAHDPCLKEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_CFG2_M7MMUEN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_CFG2_M7MMULPEN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_CFG2_M4MMUEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_CFG2_M4MMULPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_CFG2_M7SRAMBKPEN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_CFG2_M4SRAMBKPEN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_CFG2_M7SRAMBKPLPEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_CFG2_M4SRAMBKPLPEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_CFG2_M7SRAM1EN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_CFG2_M4SRAM1EN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_CFG2_M7SRAM1LPEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_CFG2_M4SRAM1LPEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_CFG2_M7SRAM2EN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_CFG2_M4SRAM2EN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_CFG2_M7SRAM2LPEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_CFG2_M4SRAM2LPEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_CFG2_M7SRAM3EN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_CFG2_M4SRAM3EN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_CFG2_M7SRAM3LPEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_CFG2_M4SRAM3LPEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_CFG2_M7SRAM4EN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_CFG2_M4SRAM4EN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_CFG2_M7SRAM4LPEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_CFG2_M4SRAM4LPEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_CFG3 register ********/ +#define RCC_CFG3_MCO1SEL ((uint32_t)0xF0000000U) /* Bit[31:28] */ +#define RCC_CFG3_MCO1SEL_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_CFG3_MCO1SEL_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_CFG3_MCO1SEL_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_CFG3_MCO1SEL_3 ((uint32_t)0x80000000U) /* Bit31*/ + +#define RCC_CFG3_MCO1SEL_LSI ((uint32_t)0x80000000U) +#define RCC_CFG3_MCO1SEL_HSI ((uint32_t)0x90000000U) +#define RCC_CFG3_MCO1SEL_MSI ((uint32_t)0xA0000000U) +#define RCC_CFG3_MCO1SEL_LSE ((uint32_t)0xB0000000U) +#define RCC_CFG3_MCO1SEL_HSE ((uint32_t)0xC0000000U) +#define RCC_CFG3_MCO1SEL_PLL3B ((uint32_t)0xD0000000U) + +#define RCC_CFG3_MCO1DIV ((uint32_t)0x0F000000U) /* Bit[27:24] */ +#define RCC_CFG3_MCO1DIV_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_CFG3_MCO1DIV_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_CFG3_MCO1DIV_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_CFG3_MCO1DIV_3 ((uint32_t)0x08000000U) /* Bit27*/ + +#define RCC_CFG3_MCO1DIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_CFG3_MCO1DIV_DIV2 ((uint32_t)0x01000000U) +#define RCC_CFG3_MCO1DIV_DIV4 ((uint32_t)0x02000000U) +#define RCC_CFG3_MCO1DIV_DIV8 ((uint32_t)0x04000000U) +#define RCC_CFG3_MCO1DIV_DIV16 ((uint32_t)0x07000000U) +#define RCC_CFG3_MCO1DIV_DIV32 ((uint32_t)0x08000000U) +#define RCC_CFG3_MCO1DIV_DIV64 ((uint32_t)0x09000000U) +#define RCC_CFG3_MCO1DIV_DIV128 ((uint32_t)0x0A000000U) + +#define RCC_CFG3_MCO2SEL ((uint32_t)0x00F00000U) /* Bit[23:20] */ +#define RCC_CFG3_MCO2SEL_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_CFG3_MCO2SEL_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_CFG3_MCO2SEL_2 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_CFG3_MCO2SEL_3 ((uint32_t)0x00800000U) /* Bit23*/ + +#define RCC_CFG3_MCO2SEL_SYSCLK ((uint32_t)0x00800000U) +#define RCC_CFG3_MCO2SEL_PLL1A ((uint32_t)0x00900000U) +#define RCC_CFG3_MCO2SEL_PLL2A ((uint32_t)0x00A00000U) +#define RCC_CFG3_MCO2SEL_PLL3A ((uint32_t)0x00B00000U) +#define RCC_CFG3_MCO2SEL_SHRPLL ((uint32_t)0x00C00000U) +#define RCC_CFG3_MCO2SEL_LSE ((uint32_t)0x00D00000U) + +#define RCC_CFG3_MCO2DIV ((uint32_t)0x000F0000U) /* Bit[19:16] */ +#define RCC_CFG3_MCO2DIV_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_CFG3_MCO2DIV_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_CFG3_MCO2DIV_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_CFG3_MCO2DIV_3 ((uint32_t)0x00080000U) /* Bit19*/ + +#define RCC_CFG3_MCO2DIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_CFG3_MCO2DIV_DIV2 ((uint32_t)0x00010000U) +#define RCC_CFG3_MCO2DIV_DIV4 ((uint32_t)0x00020000U) +#define RCC_CFG3_MCO2DIV_DIV8 ((uint32_t)0x00040000U) +#define RCC_CFG3_MCO2DIV_DIV16 ((uint32_t)0x00070000U) +#define RCC_CFG3_MCO2DIV_DIV32 ((uint32_t)0x00080000U) +#define RCC_CFG3_MCO2DIV_DIV64 ((uint32_t)0x00090000U) +#define RCC_CFG3_MCO2DIV_DIV128 ((uint32_t)0x000A0000U) + +#define RCC_CFG3_I2SSEL ((uint32_t)0x0000C000U) /* Bit[15:14] */ +#define RCC_CFG3_I2SSEL_0 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_CFG3_I2SSEL_1 ((uint32_t)0x00008000U) /* Bit15*/ + +#define RCC_CFG3_I2SSEL_I2S1 ((uint32_t)0x00000000U) +#define RCC_CFG3_I2SSEL_I2S2 ((uint32_t)0x00004000U) +#define RCC_CFG3_I2SSEL_I2S3 ((uint32_t)0x00008000U) +#define RCC_CFG3_I2SSEL_I2S4 ((uint32_t)0x0000C000U) + +#define RCC_CFG3_PERSW ((uint32_t)0x00003000U) /* Bit[13:12] */ +#define RCC_CFG3_PERSW_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_CFG3_PERSW_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_CFG3_M7STCLKDIV ((uint32_t)0x000000F0U) /* Bit[7:4] */ +#define RCC_CFG3_M7STCLKDIV_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_CFG3_M7STCLKDIV_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_CFG3_M7STCLKDIV_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_CFG3_M7STCLKDIV_3 ((uint32_t)0x00000080U) /* Bit7*/ + +#define RCC_CFG3_M7STCLKDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_CFG3_M7STCLKDIV_DIV2 ((uint32_t)0x00000010U) +#define RCC_CFG3_M7STCLKDIV_DIV4 ((uint32_t)0x00000020U) +#define RCC_CFG3_M7STCLKDIV_DIV8 ((uint32_t)0x00000040U) +#define RCC_CFG3_M7STCLKDIV_DIV16 ((uint32_t)0x00000070U) +#define RCC_CFG3_M7STCLKDIV_DIV32 ((uint32_t)0x00000080U) +#define RCC_CFG3_M7STCLKDIV_DIV64 ((uint32_t)0x00000090U) +#define RCC_CFG3_M7STCLKDIV_DIV128 ((uint32_t)0x000000A0U) +#define RCC_CFG3_M7STCLKDIV_DIV256 ((uint32_t)0x000000B0U) +#define RCC_CFG3_M7STCLKDIV_DIV512 ((uint32_t)0x000000C0U) + +#define RCC_CFG3_M4STCLKDIV ((uint32_t)0x0000000FU) /* Bit */ +#define RCC_CFG3_M4STCLKDIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_CFG3_M4STCLKDIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_CFG3_M4STCLKDIV_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_CFG3_M4STCLKDIV_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for RCC_CFG4 register ********/ +#define RCC_CFG4_AHB1CLKEN ((uint32_t)0x80000000U) /* Bit[31] */ +#define RCC_CFG4_AHB2CLKEN ((uint32_t)0x40000000U) /* Bit[30] */ +#define RCC_CFG4_AHB3CLKEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define RCC_CFG4_AHB5CLKEN ((uint32_t)0x08000000U) /* Bit[27] */ +#define RCC_CFG4_AHB6CLKEN ((uint32_t)0x04000000U) /* Bit[26] */ +#define RCC_CFG4_AXICLKEN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_CFG4_APB1CLKEN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_CFG4_APB2CLKEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_CFG4_APB5CLKEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_CFG4_APB6CLKEN ((uint32_t)0x00080000U) /* Bit[19] */ +#define RCC_CFG4_AHB9CLKEN ((uint32_t)0x00040000U) /* Bit[18] */ +#define RCC_CFG4_AXIMM7GCLKEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_CFG4_AXIMM4GCLKEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_CFG4_HSICGEN ((uint32_t)0x00008000U) /* Bit[15] */ +#define RCC_CFG4_HSIKERCGEN ((uint32_t)0x00004000U) /* Bit[14] */ +#define RCC_CFG4_HSECGEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_CFG4_HSEKERCGEN ((uint32_t)0x00001000U) /* Bit[12] */ +#define RCC_CFG4_MSICGEN ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_CFG4_MSIKERCGEN ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_CFG4_AXIMM7CLKEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_CFG4_AXIGCLKEN ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_CFG4_AXIMM4CLKEN ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_CFG4_DCMUM7CLKEN ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_CFG4_DCMUM4CLKEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_CFG4_AHBM1CLKEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_CFG4_AHBM2CLKEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_CFG4_AHBM3CLKEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_CFG4_DCMURST ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_CFG5 register ********/ +#define RCC_CFG5_RTCHSEDIV ((uint32_t)0x3F000000U) /* Bit[29:24] */ +#define RCC_CFG5_RTCHSEDIV_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_CFG5_RTCHSEDIV_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_CFG5_RTCHSEDIV_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_CFG5_RTCHSEDIV_3 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_CFG5_RTCHSEDIV_4 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_CFG5_RTCHSEDIV_5 ((uint32_t)0x20000000U) /* Bit29*/ + +#define RCC_CFG5_RTCHSEDIV_DIV1 ((uint32_t)0x01000000U) +#define RCC_CFG5_RTCHSEDIV_DIV2 ((uint32_t)0x02000000U) +#define RCC_CFG5_RTCHSEDIV_DIV3 ((uint32_t)0x03000000U) +#define RCC_CFG5_RTCHSEDIV_DIV4 ((uint32_t)0x04000000U) +#define RCC_CFG5_RTCHSEDIV_DIV5 ((uint32_t)0x05000000U) +#define RCC_CFG5_RTCHSEDIV_DIV6 ((uint32_t)0x06000000U) +#define RCC_CFG5_RTCHSEDIV_DIV7 ((uint32_t)0x07000000U) +#define RCC_CFG5_RTCHSEDIV_DIV8 ((uint32_t)0x08000000U) +#define RCC_CFG5_RTCHSEDIV_DIV9 ((uint32_t)0x09000000U) +#define RCC_CFG5_RTCHSEDIV_DIV10 ((uint32_t)0x0A000000U) +#define RCC_CFG5_RTCHSEDIV_DIV11 ((uint32_t)0x0B000000U) +#define RCC_CFG5_RTCHSEDIV_DIV12 ((uint32_t)0x0C000000U) +#define RCC_CFG5_RTCHSEDIV_DIV13 ((uint32_t)0x0D000000U) +#define RCC_CFG5_RTCHSEDIV_DIV14 ((uint32_t)0x0E000000U) +#define RCC_CFG5_RTCHSEDIV_DIV15 ((uint32_t)0x0F000000U) +#define RCC_CFG5_RTCHSEDIV_DIV16 ((uint32_t)0x10000000U) +#define RCC_CFG5_RTCHSEDIV_DIV17 ((uint32_t)0x11000000U) +#define RCC_CFG5_RTCHSEDIV_DIV18 ((uint32_t)0x12000000U) +#define RCC_CFG5_RTCHSEDIV_DIV19 ((uint32_t)0x13000000U) +#define RCC_CFG5_RTCHSEDIV_DIV20 ((uint32_t)0x14000000U) +#define RCC_CFG5_RTCHSEDIV_DIV21 ((uint32_t)0x15000000U) +#define RCC_CFG5_RTCHSEDIV_DIV22 ((uint32_t)0x16000000U) +#define RCC_CFG5_RTCHSEDIV_DIV23 ((uint32_t)0x17000000U) +#define RCC_CFG5_RTCHSEDIV_DIV24 ((uint32_t)0x18000000U) +#define RCC_CFG5_RTCHSEDIV_DIV25 ((uint32_t)0x19000000U) +#define RCC_CFG5_RTCHSEDIV_DIV26 ((uint32_t)0x1A000000U) +#define RCC_CFG5_RTCHSEDIV_DIV27 ((uint32_t)0x1B000000U) +#define RCC_CFG5_RTCHSEDIV_DIV28 ((uint32_t)0x1C000000U) +#define RCC_CFG5_RTCHSEDIV_DIV29 ((uint32_t)0x1D000000U) +#define RCC_CFG5_RTCHSEDIV_DIV30 ((uint32_t)0x1E000000U) +#define RCC_CFG5_RTCHSEDIV_DIV31 ((uint32_t)0x1F000000U) +#define RCC_CFG5_RTCHSEDIV_DIV32 ((uint32_t)0x20000000U) +#define RCC_CFG5_RTCHSEDIV_DIV33 ((uint32_t)0x21000000U) +#define RCC_CFG5_RTCHSEDIV_DIV34 ((uint32_t)0x22000000U) +#define RCC_CFG5_RTCHSEDIV_DIV35 ((uint32_t)0x23000000U) +#define RCC_CFG5_RTCHSEDIV_DIV36 ((uint32_t)0x24000000U) +#define RCC_CFG5_RTCHSEDIV_DIV37 ((uint32_t)0x25000000U) +#define RCC_CFG5_RTCHSEDIV_DIV38 ((uint32_t)0x26000000U) +#define RCC_CFG5_RTCHSEDIV_DIV39 ((uint32_t)0x27000000U) +#define RCC_CFG5_RTCHSEDIV_DIV40 ((uint32_t)0x28000000U) +#define RCC_CFG5_RTCHSEDIV_DIV41 ((uint32_t)0x29000000U) +#define RCC_CFG5_RTCHSEDIV_DIV42 ((uint32_t)0x2A000000U) +#define RCC_CFG5_RTCHSEDIV_DIV43 ((uint32_t)0x2B000000U) +#define RCC_CFG5_RTCHSEDIV_DIV44 ((uint32_t)0x2C000000U) +#define RCC_CFG5_RTCHSEDIV_DIV45 ((uint32_t)0x2D000000U) +#define RCC_CFG5_RTCHSEDIV_DIV46 ((uint32_t)0x2E000000U) +#define RCC_CFG5_RTCHSEDIV_DIV47 ((uint32_t)0x2F000000U) +#define RCC_CFG5_RTCHSEDIV_DIV48 ((uint32_t)0x30000000U) +#define RCC_CFG5_RTCHSEDIV_DIV49 ((uint32_t)0x31000000U) +#define RCC_CFG5_RTCHSEDIV_DIV50 ((uint32_t)0x32000000U) +#define RCC_CFG5_RTCHSEDIV_DIV51 ((uint32_t)0x33000000U) +#define RCC_CFG5_RTCHSEDIV_DIV52 ((uint32_t)0x34000000U) +#define RCC_CFG5_RTCHSEDIV_DIV53 ((uint32_t)0x35000000U) +#define RCC_CFG5_RTCHSEDIV_DIV54 ((uint32_t)0x36000000U) +#define RCC_CFG5_RTCHSEDIV_DIV55 ((uint32_t)0x37000000U) +#define RCC_CFG5_RTCHSEDIV_DIV56 ((uint32_t)0x38000000U) +#define RCC_CFG5_RTCHSEDIV_DIV57 ((uint32_t)0x39000000U) +#define RCC_CFG5_RTCHSEDIV_DIV58 ((uint32_t)0x3A000000U) +#define RCC_CFG5_RTCHSEDIV_DIV59 ((uint32_t)0x3B000000U) +#define RCC_CFG5_RTCHSEDIV_DIV60 ((uint32_t)0x3C000000U) +#define RCC_CFG5_RTCHSEDIV_DIV61 ((uint32_t)0x3D000000U) +#define RCC_CFG5_RTCHSEDIV_DIV62 ((uint32_t)0x3E000000U) +#define RCC_CFG5_RTCHSEDIV_DIV63 ((uint32_t)0x3F000000U) + +#define RCC_CFG5_M7SRAM5EN ((uint32_t)0x00800000U) /* Bit[23] */ +#define RCC_CFG5_M4SRAM5EN ((uint32_t)0x00400000U) /* Bit[22] */ +#define RCC_CFG5_M7SRAM5LPEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define RCC_CFG5_M4SRAM5LPEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define RCC_CFG5_DCDCLKEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_CFG5_TRNGEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define RCC_CFG5_TRNGSEL ((uint32_t)0x00001000U) /* Bit[12] */ + +#define RCC_CFG5_TRNGDIV ((uint32_t)0x00000F00U) /* Bit[11:8] */ +#define RCC_CFG5_TRNGDIV_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_CFG5_TRNGDIV_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_CFG5_TRNGDIV_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_CFG5_TRNGDIV_3 ((uint32_t)0x00000800U) /* Bit11*/ + +#define RCC_CFG5_TRNGDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_CFG5_TRNGDIV_DIV2 ((uint32_t)0x00000100U) +#define RCC_CFG5_TRNGDIV_DIV4 ((uint32_t)0x00000200U) +#define RCC_CFG5_TRNGDIV_DIV8 ((uint32_t)0x00000400U) +#define RCC_CFG5_TRNGDIV_DIV16 ((uint32_t)0x00000700U) +#define RCC_CFG5_TRNGDIV_DIV32 ((uint32_t)0x00000800U) +#define RCC_CFG5_TRNGDIV_DIV64 ((uint32_t)0x00000900U) +#define RCC_CFG5_TRNGDIV_DIV128 ((uint32_t)0x00000A00U) +#define RCC_CFG5_TRNGDIV_DIV256 ((uint32_t)0x00000B00U) +#define RCC_CFG5_TRNGDIV_DIV512 ((uint32_t)0x00000C00U) + +#define RCC_CFG5_DSIHSEDIV ((uint32_t)0x000000F0U) /* Bit[7:4] */ +#define RCC_CFG5_DSIHSEDIV_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_CFG5_DSIHSEDIV_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_CFG5_DSIHSEDIV_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_CFG5_DSIHSEDIV_3 ((uint32_t)0x00000080U) /* Bit7*/ + +#define RCC_CFG5_RTCHSIDIV ((uint32_t)0x0000000FU) /* Bit */ +#define RCC_CFG5_RTCHSIDIV_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_CFG5_RTCHSIDIV_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_CFG5_RTCHSIDIV_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_CFG5_RTCHSIDIV_3 ((uint32_t)0x00000008U) /* Bit3*/ + +#define RCC_CFG5_RTCHSIDIV_DIV1 ((uint32_t)0x00000000U) +#define RCC_CFG5_RTCHSIDIV_DIV2 ((uint32_t)0x00000001U) +#define RCC_CFG5_RTCHSIDIV_DIV4 ((uint32_t)0x00000002U) +#define RCC_CFG5_RTCHSIDIV_DIV8 ((uint32_t)0x00000004U) +#define RCC_CFG5_RTCHSIDIV_DIV16 ((uint32_t)0x00000007U) +#define RCC_CFG5_RTCHSIDIV_DIV32 ((uint32_t)0x00000008U) +#define RCC_CFG5_RTCHSIDIV_DIV64 ((uint32_t)0x00000009U) +#define RCC_CFG5_RTCHSIDIV_DIV128 ((uint32_t)0x0000000AU) +#define RCC_CFG5_RTCHSIDIV_DIV256 ((uint32_t)0x0000000BU) +#define RCC_CFG5_RTCHSIDIV_DIV512 ((uint32_t)0x0000000CU) +/******** Bit definition for RCC_M4RSTREL register ********/ +#define RCC_M4RSTREL_EN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_LSERDDL register ********/ +#define RCC_LSERDDL_DELAY ((uint32_t)0xFFFFFFFFU) /* Bit */ +#define RCC_LSERDDL_DELAY_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_LSERDDL_DELAY_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_LSERDDL_DELAY_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_LSERDDL_DELAY_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_LSERDDL_DELAY_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_LSERDDL_DELAY_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_LSERDDL_DELAY_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_LSERDDL_DELAY_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_LSERDDL_DELAY_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_LSERDDL_DELAY_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_LSERDDL_DELAY_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_LSERDDL_DELAY_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_LSERDDL_DELAY_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_LSERDDL_DELAY_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_LSERDDL_DELAY_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_LSERDDL_DELAY_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define RCC_LSERDDL_DELAY_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_LSERDDL_DELAY_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_LSERDDL_DELAY_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_LSERDDL_DELAY_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_LSERDDL_DELAY_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_LSERDDL_DELAY_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_LSERDDL_DELAY_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_LSERDDL_DELAY_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_LSERDDL_DELAY_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_LSERDDL_DELAY_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_LSERDDL_DELAY_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_LSERDDL_DELAY_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_LSERDDL_DELAY_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_LSERDDL_DELAY_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_LSERDDL_DELAY_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_LSERDDL_DELAY_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for RCC_MSIRDDL register ********/ +#define RCC_MSIRDDL_DELAY ((uint32_t)0xFFFFFFFFU) /* Bit */ +#define RCC_MSIRDDL_DELAY_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_MSIRDDL_DELAY_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_MSIRDDL_DELAY_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_MSIRDDL_DELAY_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_MSIRDDL_DELAY_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_MSIRDDL_DELAY_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_MSIRDDL_DELAY_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_MSIRDDL_DELAY_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_MSIRDDL_DELAY_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_MSIRDDL_DELAY_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_MSIRDDL_DELAY_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_MSIRDDL_DELAY_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_MSIRDDL_DELAY_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_MSIRDDL_DELAY_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_MSIRDDL_DELAY_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_MSIRDDL_DELAY_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define RCC_MSIRDDL_DELAY_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_MSIRDDL_DELAY_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_MSIRDDL_DELAY_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_MSIRDDL_DELAY_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_MSIRDDL_DELAY_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_MSIRDDL_DELAY_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_MSIRDDL_DELAY_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_MSIRDDL_DELAY_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_MSIRDDL_DELAY_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_MSIRDDL_DELAY_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_MSIRDDL_DELAY_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_MSIRDDL_DELAY_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_MSIRDDL_DELAY_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_MSIRDDL_DELAY_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_MSIRDDL_DELAY_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_MSIRDDL_DELAY_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for RCC_HSERDDL register ********/ +#define RCC_HSERDDL_DELAY ((uint32_t)0xFFFFFFFFU) /* Bit */ +#define RCC_HSERDDL_DELAY_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_HSERDDL_DELAY_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_HSERDDL_DELAY_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_HSERDDL_DELAY_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_HSERDDL_DELAY_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_HSERDDL_DELAY_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_HSERDDL_DELAY_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_HSERDDL_DELAY_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_HSERDDL_DELAY_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_HSERDDL_DELAY_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_HSERDDL_DELAY_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_HSERDDL_DELAY_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_HSERDDL_DELAY_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_HSERDDL_DELAY_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_HSERDDL_DELAY_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_HSERDDL_DELAY_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define RCC_HSERDDL_DELAY_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_HSERDDL_DELAY_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_HSERDDL_DELAY_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_HSERDDL_DELAY_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_HSERDDL_DELAY_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_HSERDDL_DELAY_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_HSERDDL_DELAY_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_HSERDDL_DELAY_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_HSERDDL_DELAY_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_HSERDDL_DELAY_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_HSERDDL_DELAY_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_HSERDDL_DELAY_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_HSERDDL_DELAY_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_HSERDDL_DELAY_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_HSERDDL_DELAY_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_HSERDDL_DELAY_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for RCC_PLLSFTLK register ********/ +#define RCC_PLLSFTLK_SDRAMDLSEL ((uint32_t)0x1E000000U) /* Bit[28:25] */ +#define RCC_PLLSFTLK_SDRAMDLSEL_0 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_PLLSFTLK_SDRAMDLSEL_1 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_PLLSFTLK_SDRAMDLSEL_2 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_PLLSFTLK_SDRAMDLSEL_3 ((uint32_t)0x10000000U) /* Bit28*/ + +#define RCC_PLLSFTLK_SDRAMDLSEL_0_2NS ((uint32_t)0x00000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_0_4NS ((uint32_t)0x02000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_0_6NS ((uint32_t)0x04000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_0_8NS ((uint32_t)0x06000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_1_0NS ((uint32_t)0x08000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_1_2NS ((uint32_t)0x0A000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_1_4NS ((uint32_t)0x0C000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_1_6NS ((uint32_t)0x0E000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_1_8NS ((uint32_t)0x10000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_2_0NS ((uint32_t)0x12000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_2_2NS ((uint32_t)0x14000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_2_4NS ((uint32_t)0x16000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_2_6NS ((uint32_t)0x18000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_2_8NS ((uint32_t)0x1A000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_3_0NS ((uint32_t)0x1C000000U) +#define RCC_PLLSFTLK_SDRAMDLSEL_3_2NS ((uint32_t)0x1E000000U) + +#define RCC_PLLSFTLK_SDRAMDLEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_PLLSFTLK_SHRTIMAFERST ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_PLLSFTLK_SHRPLLSFTLK ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_PLLSFTLK_PLL3SFTLK ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_PLLSFTLK_PLL2SFTLK ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_PLLSFTLK_PLL1SFTLK ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_HSEOS register ********/ +#define RCC_HSEOS_HSEMAXPDTHR ((uint32_t)0xFF000000U) /* Bit[31:24] */ +#define RCC_HSEOS_HSEMAXPDTHR_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define RCC_HSEOS_HSEMAXPDTHR_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define RCC_HSEOS_HSEMAXPDTHR_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define RCC_HSEOS_HSEMAXPDTHR_3 ((uint32_t)0x08000000U) /* Bit27*/ +#define RCC_HSEOS_HSEMAXPDTHR_4 ((uint32_t)0x10000000U) /* Bit28*/ +#define RCC_HSEOS_HSEMAXPDTHR_5 ((uint32_t)0x20000000U) /* Bit29*/ +#define RCC_HSEOS_HSEMAXPDTHR_6 ((uint32_t)0x40000000U) /* Bit30*/ +#define RCC_HSEOS_HSEMAXPDTHR_7 ((uint32_t)0x80000000U) /* Bit31*/ +#define RCC_HSEOS_HSEMINNDTHR ((uint32_t)0x00FF0000U) /* Bit[23:16] */ +#define RCC_HSEOS_HSEMINNDTHR_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_HSEOS_HSEMINNDTHR_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_HSEOS_HSEMINNDTHR_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_HSEOS_HSEMINNDTHR_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_HSEOS_HSEMINNDTHR_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_HSEOS_HSEMINNDTHR_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_HSEOS_HSEMINNDTHR_6 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_HSEOS_HSEMINNDTHR_7 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_HSEOS_HSEOSTHR ((uint32_t)0x0000FF00U) /* Bit[15:8] */ +#define RCC_HSEOS_HSEOSTHR_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_HSEOS_HSEOSTHR_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_HSEOS_HSEOSTHR_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_HSEOS_HSEOSTHR_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_HSEOS_HSEOSTHR_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_HSEOS_HSEOSTHR_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_HSEOS_HSEOSTHR_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_HSEOS_HSEOSTHR_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define RCC_HSEOS_HSEMAXPDF ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_HSEOS_HSEMINNDF ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_HSEOS_HSEOSF ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_HSEOS_HSEMAXPDEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_HSEOS_HSEMINNDEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_HSEOS_HSEOSEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for RCC_HSECAL register ********/ +#define RCC_HSECAL_HSECALCNTEN ((uint32_t)0x00020000U) /* Bit[17] */ +#define RCC_HSECAL_HSECALCNTF ((uint32_t)0x00010000U) /* Bit[16] */ +#define RCC_HSECAL_HSECALCNT ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ +#define RCC_HSECAL_HSECALCNT_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_HSECAL_HSECALCNT_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_HSECAL_HSECALCNT_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_HSECAL_HSECALCNT_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_HSECAL_HSECALCNT_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_HSECAL_HSECALCNT_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_HSECAL_HSECALCNT_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_HSECAL_HSECALCNT_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define RCC_HSECAL_HSECALCNT_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define RCC_HSECAL_HSECALCNT_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define RCC_HSECAL_HSECALCNT_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define RCC_HSECAL_HSECALCNT_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define RCC_HSECAL_HSECALCNT_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define RCC_HSECAL_HSECALCNT_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define RCC_HSECAL_HSECALCNT_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define RCC_HSECAL_HSECALCNT_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/******** Bit definition for RCC_LSEOS register ********/ +#define RCC_LSEOS_LSECALCNTEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define RCC_LSEOS_LSECALCNTF ((uint32_t)0x01000000U) /* Bit[24] */ +#define RCC_LSEOS_LSECALCNT ((uint32_t)0x00FF0000U) /* Bit[23:16] */ +#define RCC_LSEOS_LSECALCNT_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define RCC_LSEOS_LSECALCNT_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define RCC_LSEOS_LSECALCNT_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define RCC_LSEOS_LSECALCNT_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define RCC_LSEOS_LSECALCNT_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define RCC_LSEOS_LSECALCNT_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define RCC_LSEOS_LSECALCNT_6 ((uint32_t)0x00400000U) /* Bit22*/ +#define RCC_LSEOS_LSECALCNT_7 ((uint32_t)0x00800000U) /* Bit23*/ +#define RCC_LSEOS_LSEOSF ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_LSEOS_LSEOSEN ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_LSEOS_LSEOSTHR ((uint32_t)0x000000FFU) /* Bit */ +#define RCC_LSEOS_LSEOSTHR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define RCC_LSEOS_LSEOSTHR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define RCC_LSEOS_LSEOSTHR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define RCC_LSEOS_LSEOSTHR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define RCC_LSEOS_LSEOSTHR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define RCC_LSEOS_LSEOSTHR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define RCC_LSEOS_LSEOSTHR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define RCC_LSEOS_LSEOSTHR_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/******** Bit definition for RCC_PLLFD register ********/ +#define RCC_PLLFD_SHRPLLGF ((uint32_t)0x00000800U) /* Bit[11] */ +#define RCC_PLLFD_PLL3GF ((uint32_t)0x00000400U) /* Bit[10] */ +#define RCC_PLLFD_PLL2GF ((uint32_t)0x00000200U) /* Bit[9] */ +#define RCC_PLLFD_PLL1GF ((uint32_t)0x00000100U) /* Bit[8] */ +#define RCC_PLLFD_SHRPLLFF ((uint32_t)0x00000080U) /* Bit[7] */ +#define RCC_PLLFD_PLL3FF ((uint32_t)0x00000040U) /* Bit[6] */ +#define RCC_PLLFD_PLL2FF ((uint32_t)0x00000020U) /* Bit[5] */ +#define RCC_PLLFD_PLL1FF ((uint32_t)0x00000010U) /* Bit[4] */ +#define RCC_PLLFD_SHRPLLFEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define RCC_PLLFD_PLL3FEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define RCC_PLLFD_PLL2FEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define RCC_PLLFD_PLL1FEN ((uint32_t)0x00000001U) /* Bit[0] */ + + +/*** Power Control ***/ + +/******** Bit definition for PWR_M7CTRL1 register ********/ +#define PWR_M7CTRL1_CVBATF ((uint32_t)0x00010000U) /* Bit[16] Clear VBAT flags*/ +#define PWR_M7CTRL1_CSBF ((uint32_t)0x00000008U) /* Bit[3] Clear STANDBY flags*/ +#define PWR_M7CTRL1_CWKUPF ((uint32_t)0x00000004U) /* Bit[2] Clear the pin wakeup bit*/ +#define PWR_M7CTRL1_PDS ((uint32_t)0x00000002U) /* Bit[1] Power down deep sleep bit*/ + +/******** Bit definition for PWR_M7CTRLSTS register ********/ +#define PWR_M7CTRLSTS_WKUPxF_MASK ((uint32_t)0x07F00000U) /* Bit[26:20] WKUPx pin wakeup flag*/ +#define PWR_M7CTRLSTS_WKUP0F ((uint32_t)0x00100000U) /* Bit20*/ +#define PWR_M7CTRLSTS_WKUP1F ((uint32_t)0x00200000U) /* Bit21*/ +#define PWR_M7CTRLSTS_WKUP2F ((uint32_t)0x00400000U) /* Bit22*/ +#define PWR_M7CTRLSTS_WKUP3F ((uint32_t)0x00800000U) /* Bit23*/ +#define PWR_M7CTRLSTS_WKUP4F ((uint32_t)0x01000000U) /* Bit24*/ +#define PWR_M7CTRLSTS_WKUP5F ((uint32_t)0x02000000U) /* Bit25*/ +#define PWR_M7CTRLSTS_WKUP6F ((uint32_t)0x04000000U) /* Bit26*/ + +#define PWR_M7CTRLSTS_WKUPxPOL_MASK ((uint32_t)0x000FC000U) /* Bit[19:14] Wake-up polarity for the WKUPx pin*/ +#define PWR_M7CTRLSTS_WKUP0POL ((uint32_t)0x00004000U) /* Bit14*/ +#define PWR_M7CTRLSTS_WKUP1POL ((uint32_t)0x00008000U) /* Bit15*/ +#define PWR_M7CTRLSTS_WKUP2POL ((uint32_t)0x00010000U) /* Bit16*/ +#define PWR_M7CTRLSTS_WKUP3POL ((uint32_t)0x00020000U) /* Bit17*/ +#define PWR_M7CTRLSTS_WKUP4POL ((uint32_t)0x00040000U) /* Bit18*/ +#define PWR_M7CTRLSTS_WKUP5POL ((uint32_t)0x00080000U) /* Bit19*/ + +#define PWR_M7CTRLSTS_WKUPxEN_MASK ((uint32_t)0x00003F00U) /* Bit[13:8] WKUPx pin wakeup enable*/ +#define PWR_M7CTRLSTS_WKUP0EN ((uint32_t)0x00000100U) /* Bit8*/ +#define PWR_M7CTRLSTS_WKUP1EN ((uint32_t)0x00000200U) /* Bit9*/ +#define PWR_M7CTRLSTS_WKUP2EN ((uint32_t)0x00000400U) /* Bit10*/ +#define PWR_M7CTRLSTS_WKUP3EN ((uint32_t)0x00000800U) /* Bit11*/ +#define PWR_M7CTRLSTS_WKUP4EN ((uint32_t)0x00001000U) /* Bit12*/ +#define PWR_M7CTRLSTS_WKUP5EN ((uint32_t)0x00002000U) /* Bit13*/ + +#define PWR_M7CTRLSTS_VBATF ((uint32_t)0x00000004U) /* Bit[2] VBAT flag*/ +#define PWR_M7CTRLSTS_SBF ((uint32_t)0x00000002U) /* Bit[1] STANDBY flag*/ + +/******** Bit definition for PWR_M7CTRL2 register ********/ +#define PWR_M7CTRL2_MEM_CNTVAL ((uint32_t)0x7E000000U) /* Bit[30:25] counter value for memory power ready count down*/ + +#define PWR_M7CTRL2_PWR_CNTVAL ((uint32_t)0x01FE0000U) /* Bit[24:17] counter value for CM7 logic power ready count down*/ + +#define PWR_M7CTRL2_TCM_RDYMD ((uint32_t)0x00018000U) /* Bit[16:15] Selected the way of check TCM power ready for CM7 domain*/ +#define PWR_M7CTRL2_TCM_RDYMD_0 ((uint32_t)0x00008000U) /* Bit15*/ +#define PWR_M7CTRL2_TCM_RDYMD_1 ((uint32_t)0x00010000U) /* Bit16*/ + +#define PWR_M7CTRL2_PWR_RDYMD ((uint32_t)0x00006000U) /* Bit[14:13] Selected the way of check power ready for CM7 domain*/ +#define PWR_M7CTRL2_PWR_RDYMD_0 ((uint32_t)0x00002000U) /* Bit13*/ +#define PWR_M7CTRL2_PWR_RDYMD_1 ((uint32_t)0x00004000U) /* Bit14*/ + +#define PWR_M7CTRL2_HCLK_ONINSLP ((uint32_t)0x00001000U) /* Bit[12] HCLK is on when M7 core in sleep*/ +#define PWR_M7CTRL2_NRST_WUPEN ((uint32_t)0x00000800U) /* Bit[11] NRST wakeup event enable in standby mode for M7 core*/ +#define PWR_M7CTRL2_RET_PSWACK1 ((uint32_t)0x00000400U) /* Bit[10] M7 retention power switch ACK1 used as ENA2 enanle for dual-input-header*/ +#define PWR_M7CTRL2_DMN_PSWACK1 ((uint32_t)0x00000200U) /* Bit[9] M7 Domain power switch ACK1 used as ENA2 enanle for dual-input-header*/ +#define PWR_M7CTRL2_RTC_ALMWUPEN ((uint32_t)0x00000100U) /* Bit[8] RTC_ALARM wakeup enable in standby mode for M7 core*/ +#define PWR_M7CTRL2_BSRSTBRET ((uint32_t)0x00000004U) /* Bit[2] Backup SRAM retention enable in STANDBY mode*/ +#define PWR_M7CTRL2_BSRVBRET ((uint32_t)0x00000002U) /* Bit[1] Backup SRAM retention enable in VBAT mode*/ +#define PWR_M7CTRL2_STOP2EN ((uint32_t)0x00000001U) /* Bit[0] M7 core STOP2 mode enable*/ + +/******** Bit definition for PWR_M4CTRL1 register ********/ +#define PWR_M4CTRL1_CVBATF ((uint32_t)0x00010000U) /* Bit[16] Clear VBAT flags*/ +#define PWR_M4CTRL1_CSBVBF ((uint32_t)0x00000008U) /* Bit[3] Clear STANDBY flags*/ +#define PWR_M4CTRL1_CWKUPF ((uint32_t)0x00000004U) /* Bit[2] Clear the pin wakeup bit*/ +#define PWR_M4CTRL1_PDS ((uint32_t)0x00000002U) /* Bit[1] Power down deep sleep bit*/ + +/******** Bit definition for PWR_M4CTRLSTS register ********/ +#define PWR_M4CTRLSTS_WKUPxF_MASK ((uint32_t)0x07F00000U) /* Bit[26:20] WKUP pin flag*/ +#define PWR_M4CTRLSTS_WKUP0F ((uint32_t)0x00100000U) /* Bit20*/ +#define PWR_M4CTRLSTS_WKUP1F ((uint32_t)0x00200000U) /* Bit21*/ +#define PWR_M4CTRLSTS_WKUP2F ((uint32_t)0x00400000U) /* Bit22*/ +#define PWR_M4CTRLSTS_WKUP3F ((uint32_t)0x00800000U) /* Bit23*/ +#define PWR_M4CTRLSTS_WKUP4F ((uint32_t)0x01000000U) /* Bit24*/ +#define PWR_M4CTRLSTS_WKUP5F ((uint32_t)0x02000000U) /* Bit25*/ +#define PWR_M4CTRLSTS_WKUP6F ((uint32_t)0x04000000U) /* Bit26*/ + +#define PWR_M4CTRLSTS_WKUPxPOL_MASK ((uint32_t)0x000FC000U) /* Bit[19:14] Wake-up polarity for the WKUPX pin*/ +#define PWR_M4CTRLSTS_WKUP0POL ((uint32_t)0x00004000U) /* Bit14*/ +#define PWR_M4CTRLSTS_WKUP1POL ((uint32_t)0x00008000U) /* Bit15*/ +#define PWR_M4CTRLSTS_WKUP2POL ((uint32_t)0x00010000U) /* Bit16*/ +#define PWR_M4CTRLSTS_WKUP3POL ((uint32_t)0x00020000U) /* Bit17*/ +#define PWR_M4CTRLSTS_WKUP4POL ((uint32_t)0x00040000U) /* Bit18*/ +#define PWR_M4CTRLSTS_WKUP5POL ((uint32_t)0x00080000U) /* Bit19*/ + +#define PWR_M4CTRLSTS_WKUPxEN ((uint32_t)0x00003F00U) /* Bit[13:8] WKUPx pin wakeup enable*/ +#define PWR_M4CTRLSTS_WKUP0EN ((uint32_t)0x00000100U) /* Bit8*/ +#define PWR_M4CTRLSTS_WKUP1EN ((uint32_t)0x00000200U) /* Bit9*/ +#define PWR_M4CTRLSTS_WKUP2EN ((uint32_t)0x00000400U) /* Bit10*/ +#define PWR_M4CTRLSTS_WKUP3EN ((uint32_t)0x00000800U) /* Bit11*/ +#define PWR_M4CTRLSTS_WKUP4EN ((uint32_t)0x00001000U) /* Bit12*/ +#define PWR_M4CTRLSTS_WKUP5EN ((uint32_t)0x00002000U) /* Bit13*/ + +#define PWR_M4CTRLSTS_VBATF ((uint32_t)0x00000004U) /* Bit[2] VBAT flag.*/ +#define PWR_M4CTRLSTS_SBF ((uint32_t)0x00000002U) /* Bit[1] STANDBY flag.*/ + +/******** Bit definition for PWR_M4CTRL2 register ********/ +#define PWR_M4CTRL2_MEM_CNTVAL ((uint32_t)0x7E000000U) /* Bit[30:25] counter value for M4 memory power ready count down*/ +#define PWR_M4CTRL2_MEM_CNTVAL_0 ((uint32_t)0x02000000U) /* Bit25*/ +#define PWR_M4CTRL2_MEM_CNTVAL_1 ((uint32_t)0x04000000U) /* Bit26*/ +#define PWR_M4CTRL2_MEM_CNTVAL_2 ((uint32_t)0x08000000U) /* Bit27*/ +#define PWR_M4CTRL2_MEM_CNTVAL_3 ((uint32_t)0x10000000U) /* Bit28*/ +#define PWR_M4CTRL2_MEM_CNTVAL_4 ((uint32_t)0x20000000U) /* Bit29*/ +#define PWR_M4CTRL2_MEM_CNTVAL_5 ((uint32_t)0x40000000U) /* Bit30*/ + +#define PWR_M4CTRL2_PWR_CNTVAL ((uint32_t)0x01FE0000U) /* Bit[24:17] counter value for CM4 logic power ready count down*/ +#define PWR_M4CTRL2_PWR_CNTVAL_0 ((uint32_t)0x00020000U) /* Bit17*/ +#define PWR_M4CTRL2_PWR_CNTVAL_1 ((uint32_t)0x00040000U) /* Bit18*/ +#define PWR_M4CTRL2_PWR_CNTVAL_2 ((uint32_t)0x00080000U) /* Bit19*/ +#define PWR_M4CTRL2_PWR_CNTVAL_3 ((uint32_t)0x00100000U) /* Bit20*/ +#define PWR_M4CTRL2_PWR_CNTVAL_4 ((uint32_t)0x00200000U) /* Bit21*/ +#define PWR_M4CTRL2_PWR_CNTVAL_5 ((uint32_t)0x00400000U) /* Bit22*/ +#define PWR_M4CTRL2_PWR_CNTVAL_6 ((uint32_t)0x00800000U) /* Bit23*/ +#define PWR_M4CTRL2_PWR_CNTVAL_7 ((uint32_t)0x01000000U) /* Bit24*/ + +#define PWR_M4CTRL2_MEM_RDYMD ((uint32_t)0x00018000U) /* Bit[16:15] Selected the way of check TCM power ready for CM4 domain*/ +#define PWR_M4CTRL2_MEM_RDYMD_0 ((uint32_t)0x00008000U) /* Bit15*/ +#define PWR_M4CTRL2_MEM_RDYMD_1 ((uint32_t)0x00010000U) /* Bit16*/ + +#define PWR_M4CTRL2_PWR_RDYMD ((uint32_t)0x00006000U) /* Bit[14:13] Selected the way of check power ready for CM4 domain*/ +#define PWR_M4CTRL2_PWR_RDYMD_0 ((uint32_t)0x00002000U) /* Bit13*/ +#define PWR_M4CTRL2_PWR_RDYMD_1 ((uint32_t)0x00004000U) /* Bit14*/ + +#define PWR_M4CTRL2_NRST_WAUPEN ((uint32_t)0x00000800U) /* Bit[11] NRST wakeup event enable in standby mode for M4 core*/ +#define PWR_M4CTRL2_RET_PSWACK1 ((uint32_t)0x00000400U) /* Bit[10] M4 retention power switch ACK1 used as ENA2 enanle for dual-input-header*/ +#define PWR_M4CTRL2_DMN_PSWACK1 ((uint32_t)0x00000200U) /* Bit[9] M4 Domain power switch ACK1 used as ENA2 enanle for dual-input-header*/ +#define PWR_M4CTRL2_RTC_ALMWUPEN ((uint32_t)0x00000100U) /* Bit[8] RTC_ALARM wakeup enable in standby mode for M4 core*/ +#define PWR_M4CTRL2_BSRSTBRET ((uint32_t)0x00000004U) /* Bit[2] Backup SRAM retention enable in STANDBY mode*/ +#define PWR_M4CTRL2_BSRVBRET ((uint32_t)0x00000002U) /* Bit[1] Backup SRAM retention enable in VBAT mode*/ +#define PWR_M4CTRL2_STOP2EN ((uint32_t)0x00000001U) /* Bit[0] M4 core STOP2 mode enable*/ + +/******** Bit definition for PWR_SYSCTRL1 register ********/ +#define PWR_SYSCTRL1_DCDC_VSELKEY ((uint32_t)0xF0000000U) /* Bit[31:28] DCDC_VSELKEY_UNLOCK key*/ +#define PWR_SYSCTRL1_DCDC_VSELKEY_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define PWR_SYSCTRL1_DCDC_VSELKEY_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define PWR_SYSCTRL1_DCDC_VSELKEY_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define PWR_SYSCTRL1_DCDC_VSELKEY_3 ((uint32_t)0x80000000U) /* Bit31*/ + +#define PWR_SYSCTRL1_NRST_DGFCNT ((uint32_t)0x0FFF0000U) /* Bit[27:16] Digtal Glitch Filter on NRST filtered pulse width configuration*/ + +#define PWR_SYSCTRL1_NRST_DGFBP ((uint32_t)0x00008000U) /* Bit[15] Bypass digital glitch Filter on NRST*/ +#define PWR_SYSCTRL1_AGF_STBWUPPBP ((uint32_t)0x00002000U) /* Bit[13] Bypass analog glitch filter on stanby wakeup pads*/ +#define PWR_SYSCTRL1_AGF_DTASGBP ((uint32_t)0x00001000U) /* Bit[12] Bypass analog glitch filter on some Digtal to Analog Enable singnals*/ +#define PWR_SYSCTRL1_AGF_ARSTOBP ((uint32_t)0x00000800U) /* Bit[11] Bypass analog glitch filter on Analog Reset outputs*/ +#define PWR_SYSCTRL1_VDDDRET_PSWACK1 ((uint32_t)0x00000400U) /* Bit[10] Retention domain power switch ACK1 used as ENA2 for dual-input-header*/ +#define PWR_SYSCTRL1_VDDDM_PSWACK1 ((uint32_t)0x00000200U) /* Bit[9] VDDD Main Domain power switch ACK1 used as ENA2 for dual-input-header*/ +#define PWR_SYSCTRL1_DBKP ((uint32_t)0x00000100U) /* Bit[8] Disable write protection for the backup domain*/ +#define PWR_SYSCTRL1_PVDEN ((uint32_t)0x00000010U) /* Bit[4] Power Voltage Detector (PVD) Enable*/ +#define PWR_SYSCTRL1_AVDEN ((uint32_t)0x00000008U) /* Bit[3] Anolog Voltage Detector (AVD) Enable.*/ +#define PWR_SYSCTRL1_SW3EN ((uint32_t)0x00000002U) /* Bit[1] VDDD Backup from Backup LDO*/ +#define PWR_SYSCTRL1_BKPLDOEN ((uint32_t)0x00000001U) /* Bit[0] Backup LDO enable*/ + +/******** Bit definition for PWR_SYSCTRLSTS register ********/ +#define PWR_SYSCTRLSTS_PVDO ((uint32_t)0x00000010U) /* Bit[4] PVD output.*/ +#define PWR_SYSCTRLSTS_AVDO ((uint32_t)0x00000008U) /* Bit[3] AVD output.*/ +#define PWR_SYSCTRLSTS_OTP_PWRRDY ((uint32_t)0x00000002U) /* Bit[1] OTP Power Ready*/ +#define PWR_SYSCTRLSTS_DCDC_BPF ((uint32_t)0x00000001U) /* Bit[0] Working mode is bypass or not for DCDC*/ + +/******** Bit definition for PWR_SYSCTRL2 register ********/ +#define PWR_SYSCTRL2_OTP_LPCLKDIV ((uint32_t)0x07000000U) /* Bit[26:24] Clock dividor of pwr_sys_clk for OTP low power mode cotrol*/ +#define PWR_SYSCTRL2_OTP_LPCLKDIV_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define PWR_SYSCTRL2_OTP_LPCLKDIV_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define PWR_SYSCTRL2_OTP_LPCLKDIV_2 ((uint32_t)0x04000000U) /* Bit26*/ + +#define PWR_SYSCTRL2_OTP_FRCSTB ((uint32_t)0x00800000U) /* Bit[23] OTP_FRCDSTB and OTP_FRCSTB decide the OTP power state in all system power modes*/ +#define PWR_SYSCTRL2_OTP_FRCDSTB ((uint32_t)0x00400000U) /* Bit[22] */ + +#define PWR_SYSCTRL2_OTP_STB_INSTP0 ((uint32_t)0x00200000U) /* Bit[21] OTP_DSTB_INSTP0 and OTP_STB_INSTP0 decide the OTP power state in system STOP0 mode*/ +#define PWR_SYSCTRL2_OTP_DSTB_INSTP0 ((uint32_t)0x00100000U) /* Bit[20] */ + +#define PWR_SYSCTRL2_OTP_STB_INSTP2 ((uint32_t)0x00080000U) /* Bit[19] OTP_DSTB_INSTP2 and OTP_STB_INSTP2 decide the OTP power state in system STOP2 mode*/ +#define PWR_SYSCTRL2_OTP_DSTB_INSTP2 ((uint32_t)0x00040000U) /* Bit[18] */ + +#define PWR_SYSCTRL2_EXTI_MASKRSTEN ((uint32_t)0x00020000U) /* Bit[17] When PWR start to power down CPUn to standby mode, EXTI's IMRn/EMRn register will be reset \ + and no interrupt/event will be send to CPU from exti*/ + +#define PWR_SYSCTRL2_VDDDM_RDYMD ((uint32_t)0x00010000U) /* Bit[16] PWR use dpts4 rdy(feedback from power switch chain) + 2cycle LSI delay as main domain ready*/ +#define PWR_SYSCTRL2_PVS_STBRET ((uint32_t)0x00002000U) /* Bit[13] IO in Retention domain in Retention mode in STANDBY*/ +#define PWR_SYSCTRL2_BKLDO_RUNOFFEN ((uint32_t)0x00000800U) /* Bit[11] Eanble/disable of BKLDO*/ +#define PWR_SYSCTRL2_BG_CTRLEN ((uint32_t)0x00000400U) /* Bit[10] BG is controlled by pwr*/ +#define PWR_SYSCTRL2_SRAM_CTRLEN ((uint32_t)0x00000200U) /* Bit[9] BKP SRAM Power control interface is controlled by pwr*/ +#define PWR_SYSCTRL2_PVS_RETCTRLEN ((uint32_t)0x00000100U) /* Bit[8] PV sense retation on/off is controlled by pwr.*/ +#define PWR_SYSCTRL2_PVS_CTRLEN ((uint32_t)0x00000080U) /* Bit[7] PV sense is controlled by pwr*/ +#define PWR_SYSCTRL2_HSE_CTRLEN ((uint32_t)0x00000040U) /* Bit[6] HSE is controlled by pwr*/ +#define PWR_SYSCTRL2_HSI_CTRLEN ((uint32_t)0x00000020U) /* Bit[5] HSI is controlled by pwr*/ +#define PWR_SYSCTRL2_PLL_CTRLEN ((uint32_t)0x00000010U) /* Bit[4] PLL is controlled by pwr*/ +#define PWR_SYSCTRL2_MR_STBOFFEN ((uint32_t)0x00000002U) /* Bit[1] MR off enable when system enters into Standby mode*/ + +/******** Bit definition for PWR_SYSCTRL3 register ********/ +#define PWR_SYSCTRL3_HSC2_PSWACK1 ((uint32_t)0x00400000U) /* Bit[22] HSC2 Domain power switch ACK1 used as ENA2 for dual-input-header*/ +#define PWR_SYSCTRL3_HSC1_PSW_ACK1 ((uint32_t)0x00200000U) /* Bit[21] HSC1 Domain power switch ACK1 used as ENA2 for dual-input-header*/ +#define PWR_SYSCTRL3_GRC_PSWACK1 ((uint32_t)0x00100000U) /* Bit[20] GRAPHIC Domain power switch ACK1 used as ENA2 for dual-input-header*/ +#define PWR_SYSCTRL3_HSC2_PWRRDY ((uint32_t)0x00040000U) /* Bit[18] HSC2 power domain ready flag*/ +#define PWR_SYSCTRL3_HSC1_PWRRDY ((uint32_t)0x00020000U) /* Bit[17] HSC1 power domain ready flag*/ +#define PWR_SYSCTRL3_GRC_PWRRDY ((uint32_t)0x00010000U) /* Bit[16] GRAPHIC power domain ready flag*/ +#define PWR_SYSCTRL3_HSC2_ISNEN ((uint32_t)0x00000400U) /* Bit[10] HSC2 power domain isolation signal*/ +#define PWR_SYSCTRL3_HSC1_ISNEN ((uint32_t)0x00000200U) /* Bit[9] HSC1 power domain isolation signal*/ +#define PWR_SYSCTRL3_GRC_ISNEN ((uint32_t)0x00000100U) /* Bit[8] GRAPHIC power domain isolation signal*/ +#define PWR_SYSCTRL3_HSC2_FUCEN ((uint32_t)0x00000040U) /* Bit[6] Function mode enable for HSC2 domain*/ +#define PWR_SYSCTRL3_HSC1_FUCEN ((uint32_t)0x00000020U) /* Bit[5] Function mode enable for HSC1 domain*/ +#define PWR_SYSCTRL3_GRC_FUCEN ((uint32_t)0x00000010U) /* Bit[4] Function mode enable for GRAPHIC domain*/ +#define PWR_SYSCTRL3_HSC2_PWREN ((uint32_t)0x00000004U) /* Bit[2] HSC2 domain power enable*/ +#define PWR_SYSCTRL3_HSC1_PWREN ((uint32_t)0x00000002U) /* Bit[1] HSC1 domain power enable*/ +#define PWR_SYSCTRL3_GRC_PWREN ((uint32_t)0x00000001U) /* Bit[0] GRPAHIC domain power enable*/ + +/******** Bit definition for PWR_SYSCTRL4 register ********/ +#define PWR_SYSCTRL4_MR_LPVSELEN ((uint32_t)0x20000000U) /* Bit[29] Enable targeting MR voltage output in low power mode*/ + +#define PWR_SYSCTRL4_DCDC_LPVSEL_MASK ((uint32_t)0x0F000000U) /* Bit[27:24] Targeting dcdc voltage in low power mode*/ +#define PWR_SYSCTRL4_DCDC_LPVSEL_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define PWR_SYSCTRL4_DCDC_LPVSEL_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define PWR_SYSCTRL4_DCDC_LPVSEL_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define PWR_SYSCTRL4_DCDC_LPVSEL_3 ((uint32_t)0x08000000U) /* Bit27*/ + +#define PWR_SYSCTRL4_VDDD_LPPORSEL_MASK ((uint32_t)0x00C00000U) /* Bit[23:22] VDDD por config in low power mode*/ +#define PWR_SYSCTRL4_VDDD_LPPORSEL_0 ((uint32_t)0x00400000U) /* Bit22*/ +#define PWR_SYSCTRL4_VDDD_LPPORSEL_1 ((uint32_t)0x00800000U) /* Bit23*/ + +#define PWR_SYSCTRL4_DCDC_LPPORVSEL ((uint32_t)0x003E0000U) /* Bit[21:17] DCDC POR voltage value 0.05V per step in low power mode*/ +#define PWR_SYSCTRL4_DCDC_LPPORVSEL_0 ((uint32_t)0x00020000U) /* Bit17*/ +#define PWR_SYSCTRL4_DCDC_LPPORVSEL_1 ((uint32_t)0x00040000U) /* Bit18*/ +#define PWR_SYSCTRL4_DCDC_LPPORVSEL_2 ((uint32_t)0x00080000U) /* Bit19*/ +#define PWR_SYSCTRL4_DCDC_LPPORVSEL_3 ((uint32_t)0x00100000U) /* Bit20*/ +#define PWR_SYSCTRL4_DCDC_LPPORVSEL_4 ((uint32_t)0x00200000U) /* Bit21*/ + +#define PWR_SYSCTRL4_BG_LPVREFVSEL ((uint32_t)0x00010000U) /* Bit[16] targeting aldo ref in low power mode*/ +#define PWR_SYSCTRL4_BG_VREFVSEL ((uint32_t)0x00008000U) /* Bit[15] targeting BG in low power mode*/ + +#define PWR_SYSCTRL4_VDDD_PORSEL ((uint32_t)0x00003000U) /* Bit[13:12] VDDD por config in low power mode*/ +#define PWR_SYSCTRL4_VDDD_PORSEL_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define PWR_SYSCTRL4_VDDD_PORSEL_1 ((uint32_t)0x00002000U) /* Bit13*/ + +#define PWR_SYSCTRL4_MLDO_LPOVSEL ((uint32_t)0x00000C00U) /* Bit[11:10] Output voltage of Main Regulator LDO option in SYS STOP2 and STANDBY mode*/ +#define PWR_SYSCTRL4_MLDO_LPOVSEL_0 ((uint32_t)0x00000400U) /* Bit10*/ +#define PWR_SYSCTRL4_MLDO_LPOVSEL_1 ((uint32_t)0x00000800U) /* Bit11*/ + +#define PWR_SYSCTRL4_MLDO_OVSEL ((uint32_t)0x00000300U) /* Bit[9:8] Output voltage of Main Regulator LDO option in SYS RUN mode*/ +#define PWR_SYSCTRL4_MLDO_OVSEL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define PWR_SYSCTRL4_MLDO_OVSEL_1 ((uint32_t)0x00000200U) /* Bit9*/ + +#define PWR_SYSCTRL4_DCDCFRCEN ((uint32_t)0x00000008U) /* Bit[3] DCDC is forcibly activated*/ +#define PWR_SYSCTRL4_DCDCEN ((uint32_t)0x00000004U) /* Bit[2] DCDC is activated*/ +#define PWR_SYSCTRL4_MLDOEN ((uint32_t)0x00000002U) /* Bit[1] LDO is forcibly activated*/ +#define PWR_SYSCTRL4_VCORESRC ((uint32_t)0x00000001U) /* Bit[0] VCORE/VDDD spupplied by external source*/ + +/******** Bit definition for PWR_BORCTRL register ********/ +#define PWR_BORCTRL_BORVSEL_MASK ((uint32_t)0x0000003EU) /* Bit[5:1] BOR voltage selelction*/ +#define PWR_BORCTRL_BORVSEL_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define PWR_BORCTRL_BORVSEL_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define PWR_BORCTRL_BORVSEL_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define PWR_BORCTRL_BORVSEL_3 ((uint32_t)0x00000010U) /* Bit4*/ +#define PWR_BORCTRL_BORVSEL_4 ((uint32_t)0x00000020U) /* Bit5*/ + +#define PWR_BORCTRL_BOREN ((uint32_t)0x00000001U) /* Bit[0] BOR enable*/ + +/******** Bit definition for PWR_IPMEMCTRL register ********/ +#define PWR_IPMEMCTRL_ESC_PWREN ((uint32_t)0x00001000U) /* Bit[12] ESC memory power gate enable*/ +#define PWR_IPMEMCTRL_FMAC_PWREN ((uint32_t)0x00000800U) /* Bit[11] FMAC memory power gate enable*/ +#define PWR_IPMEMCTRL_SDMMC1_PWREN ((uint32_t)0x00000400U) /* Bit[10] SDMMC1 memory power gate enable*/ +#define PWR_IPMEMCTRL_USB1_PWREN ((uint32_t)0x00000200U) /* Bit[9] USB1 memory power gate enable*/ +#define PWR_IPMEMCTRL_ETH1_PWREN ((uint32_t)0x00000100U) /* Bit[8] ETH1 memory power gate enable*/ +#define PWR_IPMEMCTRL_SDMMC2_PWREN ((uint32_t)0x00000080U) /* Bit[7] SDMMC2 memory power gate enable*/ +#define PWR_IPMEMCTRL_USB2_PWREN ((uint32_t)0x00000040U) /* Bit[6] USB2 memory power gate enable*/ +#define PWR_IPMEMCTRL_ETH2_PWREN ((uint32_t)0x00000020U) /* Bit[5] ETH2 memory power gate enable*/ +#define PWR_IPMEMCTRL_DVP_PWREN ((uint32_t)0x00000010U) /* Bit[4] DVP memory power gate enable*/ +#define PWR_IPMEMCTRL_DSI_PWREN ((uint32_t)0x00000008U) /* Bit[3] DSI memory power gate enable*/ +#define PWR_IPMEMCTRL_JPEG_PWREN ((uint32_t)0x00000004U) /* Bit[2] JPEG memory power gate enable*/ +#define PWR_IPMEMCTRL_LCDC_PWREN ((uint32_t)0x00000002U) /* Bit[1] LCDC memory power gate enable*/ +#define PWR_IPMEMCTRL_GPU_PWREN ((uint32_t)0x00000001U) /* Bit[0] GPU memory power gate enable*/ + +/******** Bit definition for PWR_IPMEMCTRLSTS register ********/ +#define PWR_IPMEMCTRLSTS_AIP_MEMPWRRDY ((uint32_t)0x80000000U) /* Bit[31] ALL IP memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_ESC_PWRRDY ((uint32_t)0x00001000U) /* Bit[12] ESC memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_FMAC_PWRRDY ((uint32_t)0x00000800U) /* Bit[11] FMAC memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_SDMMC1_PWRRDY ((uint32_t)0x00000400U) /* Bit[10] SDMMC1 memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_USB1_PWRRDY ((uint32_t)0x00000200U) /* Bit[9] USB1 memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_ETH1_PWRRDY ((uint32_t)0x00000100U) /* Bit[8] ETH1 memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_SDMMC2_PWRRDY ((uint32_t)0x00000080U) /* Bit[7] SDMMC2 memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_USB2_PWRRDY ((uint32_t)0x00000040U) /* Bit[6] USB2 memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_ETH2_PWRRDY ((uint32_t)0x00000020U) /* Bit[5] ETH2 memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_DVP_PWRRDY ((uint32_t)0x00000010U) /* Bit[4] DVP memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_DSI_PWRRDY ((uint32_t)0x00000008U) /* Bit[3] DSI memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_JPEG_PWRRDY ((uint32_t)0x00000004U) /* Bit[2] JPEG memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_LCDC_PWRRDY ((uint32_t)0x00000002U) /* Bit[1] LCDC memory power ready flag*/ +#define PWR_IPMEMCTRLSTS_GPU_PWRRDY ((uint32_t)0x00000001U) /* Bit[0] GPU memory power ready flag*/ + +/******** Bit definition for PWR_M7MEMLPCTRL register ********/ +#define PWR_M7MEMLPCTRL_MEM_PGCFG ((uint32_t)0x0000000CU) /* Bit[3:2] Memory power gate sequence control*/ +#define PWR_M7MEMLPCTRL_MEM_PGCFG_0 ((uint32_t)0x00000004U) /* Bit2*/ +#define PWR_M7MEMLPCTRL_MEM_PGCFG_1 ((uint32_t)0x00000008U) /* Bit3*/ +#define PWR_M7MEMLPCTRL_MEM_RETSTP0EN ((uint32_t)0x00000002U) /* Bit[1] */ +#define PWR_M7MEMLPCTRL_MEM_PGENSTP0 ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for PWR_M7MEMLPSTS register ********/ +#define PWR_M7MEMLPSTS_TCMRDY ((uint32_t)0x80000000U) /* Bit[31] All enabled TCM memory power ready flag*/ + +/******** Bit definition for PWR_M7TCMPG0 register ********/ +#define PWR_M7TCMPG0_M7TCM_SWPG0 ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Software control to power gate TCM memories*/ +#define PWR_M7TCMPG0_M7TCM_SWPG0_0 ((uint32_t)0x00000001U) /* Bit0 range :0x20000000U ?C 0x20003FFFU*/ +#define PWR_M7TCMPG0_M7TCM_SWPG0_1 ((uint32_t)0x00000002U) /* Bit1 range :0x20004000U ?C 0x20007FFFU*/ +#define PWR_M7TCMPG0_M7TCM_SWPG0_2 ((uint32_t)0x00000004U) /* Bit2 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_3 ((uint32_t)0x00000008U) /* Bit3 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_4 ((uint32_t)0x00000010U) /* Bit4 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_5 ((uint32_t)0x00000020U) /* Bit5 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_6 ((uint32_t)0x00000040U) /* Bit6 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_7 ((uint32_t)0x00000080U) /* Bit7 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_8 ((uint32_t)0x00000100U) /* Bit8 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_9 ((uint32_t)0x00000200U) /* Bit9 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_10 ((uint32_t)0x00000400U) /* Bit10 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_11 ((uint32_t)0x00000800U) /* Bit11 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_12 ((uint32_t)0x00001000U) /* Bit12 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_13 ((uint32_t)0x00002000U) /* Bit13 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_14 ((uint32_t)0x00004000U) /* Bit14 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_15 ((uint32_t)0x00008000U) /* Bit15 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_16 ((uint32_t)0x00010000U) /* Bit16 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_17 ((uint32_t)0x00020000U) /* Bit17 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_18 ((uint32_t)0x00040000U) /* Bit18 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_19 ((uint32_t)0x00080000U) /* Bit19 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_20 ((uint32_t)0x00100000U) /* Bit20 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_21 ((uint32_t)0x00200000U) /* Bit21 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_22 ((uint32_t)0x00400000U) /* Bit22 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_23 ((uint32_t)0x00800000U) /* Bit23 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_24 ((uint32_t)0x01000000U) /* Bit24 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_25 ((uint32_t)0x02000000U) /* Bit25 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_26 ((uint32_t)0x04000000U) /* Bit26 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_27 ((uint32_t)0x08000000U) /* Bit27 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_28 ((uint32_t)0x10000000U) /* Bit28 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_29 ((uint32_t)0x20000000U) /* Bit29 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_30 ((uint32_t)0x40000000U) /* Bit30 .... */ +#define PWR_M7TCMPG0_M7TCM_SWPG0_31 ((uint32_t)0x80000000U) /* Bit31 range :0x2007FBFFU ?C 0x2007FFFFU*/ + +/******** Bit definition for PWR_M7TCMPG1 register ********/ +#define PWR_M7TCMPG1_M7TCM_SWPG1 ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Software control to power gate TCM memories*/ +#define PWR_M7TCMPG1_M7TCM_SWPG1_0 ((uint32_t)0x00000001U) /* Bit0 range :0x20080000U ?C 0x20083FFFU*/ +#define PWR_M7TCMPG1_M7TCM_SWPG1_1 ((uint32_t)0x00000002U) /* Bit1 range :0x20084000U ?C 0x20087FFFU*/ +#define PWR_M7TCMPG1_M7TCM_SWPG1_2 ((uint32_t)0x00000004U) /* Bit2 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_3 ((uint32_t)0x00000008U) /* Bit3 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_4 ((uint32_t)0x00000010U) /* Bit4 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_5 ((uint32_t)0x00000020U) /* Bit5 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_6 ((uint32_t)0x00000040U) /* Bit6 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_7 ((uint32_t)0x00000080U) /* Bit7 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_8 ((uint32_t)0x00000100U) /* Bit8 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_9 ((uint32_t)0x00000200U) /* Bit9 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_10 ((uint32_t)0x00000400U) /* Bit10 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_11 ((uint32_t)0x00000800U) /* Bit11 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_12 ((uint32_t)0x00001000U) /* Bit12 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_13 ((uint32_t)0x00002000U) /* Bit13 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_14 ((uint32_t)0x00004000U) /* Bit14 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_15 ((uint32_t)0x00008000U) /* Bit15 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_16 ((uint32_t)0x00010000U) /* Bit16 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_17 ((uint32_t)0x00020000U) /* Bit17 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_18 ((uint32_t)0x00040000U) /* Bit18 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_19 ((uint32_t)0x00080000U) /* Bit19 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_20 ((uint32_t)0x00100000U) /* Bit20 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_21 ((uint32_t)0x00200000U) /* Bit21 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_22 ((uint32_t)0x00400000U) /* Bit22 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_23 ((uint32_t)0x00800000U) /* Bit23 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_24 ((uint32_t)0x01000000U) /* Bit24 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_25 ((uint32_t)0x02000000U) /* Bit25 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_26 ((uint32_t)0x04000000U) /* Bit26 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_27 ((uint32_t)0x08000000U) /* Bit27 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_28 ((uint32_t)0x10000000U) /* Bit28 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_29 ((uint32_t)0x20000000U) /* Bit29 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_30 ((uint32_t)0x40000000U) /* Bit30 .... */ +#define PWR_M7TCMPG1_M7TCM_SWPG1_31 ((uint32_t)0x80000000U) /* Bit31 range :0x200FFBFFU ?C 0x200FFFFFU*/ + +/******** Bit definition for PWR_M7TCMRET1N0 register ********/ +#define PWR_M7TCMRET1N0_M7TCM_RET1CFG0 ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ + +/******** Bit definition for PWR_M7TCMRET1N1 register ********/ +#define PWR_M7TCMRET1N1_M7TCM_RET1CFG1 ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ + +/******** Bit definition for PWR_M7TCMRET2CFG0 register ********/ +#define PWR_M7TCMRET2CFG0_M7TCM_RET2CFG0 ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ + +/******** Bit definition for PWR_M7TCM_RET2CFG1 register ********/ +#define PWR_M7TCM_RET2CFG1_M7TCM_RET2CFG1 ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ + +/******** Bit definition for PWR_M7TCMPRDY0 register ********/ +#define PWR_M7TCMPRDY0_TCM_PRDY0 ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ + +/******** Bit definition for PWR_M7TCMPRDY1 register ********/ +#define PWR_M7TCMPRDY1_TCM_PRDY1 ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ + +/******** Bit definition for PWR_M4MEMLPCTRL register ********/ +#define PWR_M4MEMLPCTRL_MEM_PGCFG ((uint32_t)0x0000000CU) /* Bit[3:2] Memory power gate sequence control*/ +#define PWR_M4MEMLPCTRL_MEM_PGCFG_0 ((uint32_t)0x00000004U) /* Bit2 */ +#define PWR_M4MEMLPCTRL_MEM_PGCFG_1 ((uint32_t)0x00000008U) /* Bit3 */ + +#define PWR_M4MEMLPCTRL_MEM_RETSTP0EN ((uint32_t)0x00000002U) /* Bit[1] */ +#define PWR_M4MEMLPCTRL_MEM_PGSTP0EN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for PWR_SYSMEMLPCTRL register ********/ +#define PWR_SYSMEMLPCTRL_ALLPRDY ((uint32_t)0x80000000U) /* Bit[31] All enabled system memory power ready flag*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM5S2_RET2N ((uint32_t)0x04000000U) /* Bit[26] System SRAM5S2 memory status control */ +#define PWR_SYSMEMLPCTRL_AHBSRAM5S2_RET1N ((uint32_t)0x02000000U) /* Bit[25] System SRAM5S2 memory status control*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM5S1_RET2N ((uint32_t)0x01000000U) /* Bit[24] System SRAM5S1 memory status control*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM5S1_RET1N ((uint32_t)0x00800000U) /* Bit[23] System SRAM5S1 memory status control*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM4_RET2N ((uint32_t)0x00400000U) /* Bit[22] System SRAM4 memory status control*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM4_RET1N ((uint32_t)0x00200000U) /* Bit[21] System SRAM4 memory status control*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM3_RET2N ((uint32_t)0x00100000U) /* Bit[20] System SRAM3 memory status control*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM3_RET1N ((uint32_t)0x00080000U) /* Bit[19] System SRAM3 memory status control*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM2_RET2N ((uint32_t)0x00040000U) /* Bit[18] System SRAM2 memory status control*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM2_RET1N ((uint32_t)0x00020000U) /* Bit[17] System SRAM2 memory status control*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM1_RET2N ((uint32_t)0x00010000U) /* Bit[16] System SRAM1 memory status control*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM1_RET1N ((uint32_t)0x00008000U) /* Bit[15] System SRAM1 memory status control*/ +#define PWR_SYSMEMLPCTRL_AXISRAM_RET2N ((uint32_t)0x00004000U) /* Bit[14] System memory status control*/ +#define PWR_SYSMEMLPCTRL_AXISRAM_RET1N ((uint32_t)0x00002000U) /* Bit[13] System memory status control*/ +#define PWR_SYSMEMLPCTRL_MEM_RETSTP0EN ((uint32_t)0x00000200U) /* Bit[9] all system memory control*/ +#define PWR_SYSMEMLPCTRL_MEM_PGSTP0EN ((uint32_t)0x00000100U) /* Bit[8] all system memory control*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM5S2PG ((uint32_t)0x00000040U) /* Bit[6] Software control to power gate AHB SRAM5S2 in SYS RUN mode*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM5S1_PG ((uint32_t)0x00000020U) /* Bit[5] Software control to power gate AHB SRAM5S1 in SYS RUN mode*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM4PG ((uint32_t)0x00000010U) /* Bit[4] Software control to power gate AHB SRAM4 in SYS RUN mode*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM3_PG ((uint32_t)0x00000008U) /* Bit[3] Software control to power gate AHB SRAM3 in SYS RUN mode*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM2_PG ((uint32_t)0x00000004U) /* Bit[2] Software control to power gate AHB SRAM2 in SYS RUN mode*/ +#define PWR_SYSMEMLPCTRL_AHBSRAM1_PG ((uint32_t)0x00000002U) /* Bit[1] Software control to power gate AHB SRAM1 in SYS RUN mode*/ +#define PWR_SYSMEMLPCTRL_AXISRAM_PG ((uint32_t)0x00000001U) /* Bit[0] Software control to power gate AXI SRAM in SYS RUN mode*/ + +/******** Bit definition for PWR_SHRTIMCTRL register ********/ +#define PWR_SHRTIMCTRL_SHRA_PSWACK1 ((uint32_t)0x00100000U) /* Bit[20] SHRTIM AFE Domain power switch ACK1 used as ENA2 for dual-input-header*/ +#define PWR_SHRTIMCTRL_SHRA_PRDY ((uint32_t)0x00080000U) /* Bit[19] SHRTIM AFE power domain ready flag*/ +#define PWR_SHRTIMCTRL_SHRA_ISNEN ((uint32_t)0x00040000U) /* Bit[18] SHRTIM AFE power domain isolation signal*/ +#define PWR_SHRTIMCTRL_SHRA_FUCEN ((uint32_t)0x00020000U) /* Bit[17] Function mode enable for SHRTIM AFE*/ +#define PWR_SHRTIMCTRL_SHRA_PWREN ((uint32_t)0x00010000U) /* Bit[16] SHRTIM AFE power gate enable*/ +#define PWR_SHRTIMCTRL_SHR2_PSWACK1 ((uint32_t)0x00001000U) /* Bit[12] HRTIM2 Domain power switch ACK1 used as ENA2 for dual-input-header*/ +#define PWR_SHRTIMCTRL_SHR2_PRDY ((uint32_t)0x00000800U) /* Bit[11] SHRTIM2 power domain ready flag*/ +#define PWR_SHRTIMCTRL_SHR2_ISNEN ((uint32_t)0x00000400U) /* Bit[10] SHRTIM2 power domain isolation signal*/ +#define PWR_SHRTIMCTRL_SHR2_FUCEN ((uint32_t)0x00000200U) /* Bit[9] Function mode enable for SHRTIM2 */ +#define PWR_SHRTIMCTRL_SHR2_PWREN ((uint32_t)0x00000100U) /* Bit[8] SHRTIM2 power gate enable*/ +#define PWR_SHRTIMCTRL_SHR1_PSWACK1 ((uint32_t)0x00000010U) /* Bit[4] HRTIM1 Domain power switch ACK1 used as ENA2 for dual-input-header*/ +#define PWR_SHRTIMCTRL_SHR1_PRDY ((uint32_t)0x00000008U) /* Bit[3] SHRTIM1 power domain ready flag*/ +#define PWR_SHRTIMCTRL_SHR1_ISNEN ((uint32_t)0x00000004U) /* Bit[2] SHRTIM1 power domain isolation signal*/ +#define PWR_SHRTIMCTRL_SHR1_FUCEN ((uint32_t)0x00000002U) /* Bit[1] Function mode enable for SHRTIM1 */ +#define PWR_SHRTIMCTRL_SHR1_PWREN ((uint32_t)0x00000001U) /* Bit[0] SHRTIM1 power gate enable*/ + +/******** Bit definition for PWR_MDMACTRL register ********/ +#define PWR_MDMACTRL_MDMA_PSWACK1 ((uint32_t)0x00000010U) /* Bit[4] MDMA Domain power switch ACK1 used as ENA2 for dual-input-header*/ +#define PWR_MDMACTRL_MDMA_PRDY ((uint32_t)0x00000008U) /* Bit[3] MDMA power domain ready flag*/ +#define PWR_MDMACTRL_MDMA_ISNEN ((uint32_t)0x00000004U) /* Bit[2] MDMA power domain isolation signal*/ +#define PWR_MDMACTRL_MDMA_FUCEN ((uint32_t)0x00000002U) /* Bit[1] Function mode enable for MDMA*/ +#define PWR_MDMACTRL_MDMA_PWREN ((uint32_t)0x00000001U) /* Bit[0] MDMA power gate enable*/ + +/******** Bit definition for PWR_ESCCTRL register ********/ +#define PWR_ESCCTRL_ESC_PSWACK1 ((uint32_t)0x00000010U) /* Bit[4] ESC Domain power switch ACK1 used as ENA2 for dual-input-header */ +#define PWR_ESCCTRL_ESC_PRDY ((uint32_t)0x00000008U) /* Bit[3] ESC power domain ready flag*/ +#define PWR_ESCCTRL_ESC_ISNEN ((uint32_t)0x00000004U) /* Bit[2] ESC power domain isolation signal*/ +#define PWR_ESCCTRL_ESC_FUCEN ((uint32_t)0x00000002U) /* Bit[1] Function mode enable for ESC*/ +#define PWR_ESCCTRL_ESC_PWREN ((uint32_t)0x00000001U) /* Bit[0] ESC power gate enable*/ + +/******** Bit definition for PWR_DBGPROB0 register ********/ +#define PWR_DBGPROB0_DBG_PRO1 ((uint32_t)0xFFFF0000U) /* Bit[31:16] Debug probe observation to PWR interanl signals set 1*/ + +#define PWR_DBGPROB0_DBG_PRO0 ((uint32_t)0x0000FFFFU) /* Bit[15:0] Debug probe observation to PWR interanl signals set 0*/ + +/******** Bit definition for PWR_DBGPROB1 register ********/ +#define PWR_DBGPROB1_DBG_PRO3 ((uint32_t)0xFFFF0000U) /* Bit[31:16] Debug probe observation to PWR interanl signals set 3*/ + +#define PWR_DBGPROB1_DBG_PRO2 ((uint32_t)0x0000FFFFU) /* Bit[15:0] Debug probe observation to PWR interanl signals set 2*/ + +/******** Bit definition for PWR_DBGPRO2 register ********/ +#define PWR_DBGPRO2_DBG_PRO5 ((uint32_t)0xFFFF0000U) /* Bit[31:16] Debug probe observation to PWR interanl signals set 5*/ + +#define PWR_DBGPRO2_DBG_PRO4 ((uint32_t)0x0000FFFFU) /* Bit[15:0] Debug probe observation to PWR interanl signals set 4*/ + +/******** Bit definition for PWR_DBGPRO3 register ********/ +#define PWR_DBGPRO3_DBG_PRO7 ((uint32_t)0xFFFF0000U) /* Bit[31:16] Debug probe observation to PWR interanl signals set 5*/ + +#define PWR_DBGPRO3_DBG_PRO6 ((uint32_t)0x0000FFFFU) /* Bit[15:0] Debug probe observation to PWR interanl signals set 6*/ + +/******** Bit definition for PWR_DBGPRO4 register ********/ +#define PWR_DBGPRO4_DBG_PRO9 ((uint32_t)0xFFFF0000U) /* Bit[31:16] Debug probe observation to PWR interanl signals set 9*/ + +#define PWR_DBGPRO4_DBG_PRO8 ((uint32_t)0x0000FFFFU) /* Bit[15:0] Debug probe observation to PWR interanl signals set 8*/ + +/******** Bit definition for PWR_DBGPRO5 register ********/ +#define PWR_DBGPRO5_DBG_PROB ((uint32_t)0xFFFF0000U) /* Bit[31:16] Debug probe observation to PWR interanl signals set B*/ + +#define PWR_DBGPRO5_DBG_PROA ((uint32_t)0x0000FFFFU) /* Bit[15:0] Debug probe observation to PWR interanl signals set A*/ + +/******** Bit definition for PWR_DBGPRO6 register ********/ +#define PWR_DBGPRO6_DBG_PROD ((uint32_t)0xFFFF0000U) /* Bit[31:16] Debug probe observation to PWR interanl signals set D*/ + +#define PWR_DBGPRO6_DBG_PROC ((uint32_t)0x0000FFFFU) /* Bit[15:0] Debug probe observation to PWR interanl signals set C*/ + +/******** Bit definition for PWR_DBGPRO7 register ********/ +#define PWR_DBGPRO7_DBG_PROF ((uint32_t)0xFFFF0000U) /* Bit[31:16] Debug probe observation to PWR interanl signals set F*/ + +#define PWR_DBGPRO7_DBG_PROE ((uint32_t)0x0000FFFFU) /* Bit[15:0] Debug probe observation to PWR interanl signals set E*/ + +/******** Bit definition for PWR_DBGPROBCTRL register ********/ +#define PWR_DBGPROBCTRL_PROB_SEL_MASK ((uint32_t)0x0000000FU) /* Bit[3:0] */ +#define PWR_DBGPROBCTRL_PROB_SEL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define PWR_DBGPROBCTRL_PROB_SEL_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define PWR_DBGPROBCTRL_PROB_SEL_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define PWR_DBGPROBCTRL_PROB_SEL_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for PWR_EMCRETCTRL1 register ********/ +#define PWR_EMCRETCTRL1_RETGBxDET ((uint32_t)0x00000F00U) /* Bit[11:8] RET domain EMC GBx detection enable*/ +#define PWR_EMCRETCTRL1_RETGBxDET_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define PWR_EMCRETCTRL1_RETGBxDET_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define PWR_EMCRETCTRL1_RETGBxDET_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define PWR_EMCRETCTRL1_RETGBxDET_3 ((uint32_t)0x00000800U) /* Bit11*/ + +#define PWR_EMCRETCTRL1_RETGBNxDET ((uint32_t)0x000000F0U) /* Bit[7:4] RET domain EMC GBNx detection enable*/ +#define PWR_EMCRETCTRL1_RETGBNxDET_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define PWR_EMCRETCTRL1_RETGBNxDET_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define PWR_EMCRETCTRL1_RETGBNxDET_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define PWR_EMCRETCTRL1_RETGBNxDET_3 ((uint32_t)0x00000080U) /* Bit7*/ + +#define PWR_EMCRETCTRL1_RETCLPxDET ((uint32_t)0x0000000FU) /* Bit[3:0] RET domain EMC Clampx detection enable*/ +#define PWR_EMCRETCTRL1_RETCLPxDET_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define PWR_EMCRETCTRL1_RETCLPxDET_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define PWR_EMCRETCTRL1_RETCLPxDET_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define PWR_EMCRETCTRL1_RETCLPxDET_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for PWR_EMCCTRLSTS1 register ********/ +#define PWR_EMCCTRLSTS1_EMCFCLR ((uint32_t)0x01000000U) /* Bit[24] Clear EMC Flag*/ + +#define PWR_EMCCTRLSTS1_RETGBxF ((uint32_t)0x00000F00U) /* Bit[11:8] RET Domain EMC GBx Flag*/ +#define PWR_EMCCTRLSTS1_RETGBxF_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define PWR_EMCCTRLSTS1_RETGBxF_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define PWR_EMCCTRLSTS1_RETGBxF_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define PWR_EMCCTRLSTS1_RETGBxF_3 ((uint32_t)0x00000800U) /* Bit11*/ + +#define PWR_EMCCTRLSTS1_RETGBNxF ((uint32_t)0x000000F0U) /* Bit[7:4] RET Domain EMC GBNx Flag*/ +#define PWR_EMCCTRLSTS1_RETGBNxF_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define PWR_EMCCTRLSTS1_RETGBNxF_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define PWR_EMCCTRLSTS1_RETGBNxF_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define PWR_EMCCTRLSTS1_RETGBNxF_3 ((uint32_t)0x00000080U) /* Bit7*/ + +#define PWR_EMCCTRLSTS1_RETCLPxF ((uint32_t)0x0000000FU) /* Bit[3:0] RET Domain EMC Clampx Flag*/ +#define PWR_EMCCTRLSTS1_RETCLPxF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define PWR_EMCCTRLSTS1_RETCLPxF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define PWR_EMCCTRLSTS1_RETCLPxF_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define PWR_EMCCTRLSTS1_RETCLPxF_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for PWR_EMCRETCTRL2 register ********/ +#define PWR_EMCRETCTRL2_RETGBxDET ((uint32_t)0x00000F00U) /* Bit[11:8] RET domain EMC GBx detection enable*/ +#define PWR_EMCRETCTRL2_RETGBxDET_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define PWR_EMCRETCTRL2_RETGBxDET_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define PWR_EMCRETCTRL2_RETGBxDET_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define PWR_EMCRETCTRL2_RETGBxDET_3 ((uint32_t)0x00000800U) /* Bit11*/ + +#define PWR_EMCRETCTRL2_RETGBNxDET ((uint32_t)0x000000F0U) /* Bit[7:4] RET domain EMC GBNx detection enable*/ +#define PWR_EMCRETCTRL2_RETGBNxDET_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define PWR_EMCRETCTRL2_RETGBNxDET_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define PWR_EMCRETCTRL2_RETGBNxDET_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define PWR_EMCRETCTRL2_RETGBNxDET_3 ((uint32_t)0x00000080U) /* Bit7*/ + +#define PWR_EMCRETCTRL2_RETCLPxDET ((uint32_t)0x0000000FU) /* Bit[3:0] RET domain EMC Clampx detection enable*/ +#define PWR_EMCRETCTRL2_RETCLPxDET_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define PWR_EMCRETCTRL2_RETCLPxDET_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define PWR_EMCRETCTRL2_RETCLPxDET_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define PWR_EMCRETCTRL2_RETCLPxDET_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for PWR_EMCRETSTS2 register ********/ +#define PWR_EMCRETSTS2_RETGBxF ((uint32_t)0x00000F00U) /* Bit[11:8] RET Domain EMC GBx Flag*/ +#define PWR_EMCRETSTS2_RETGBxF_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define PWR_EMCRETSTS2_RETGBxF_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define PWR_EMCRETSTS2_RETGBxF_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define PWR_EMCRETSTS2_RETGBxF_3 ((uint32_t)0x00000800U) /* Bit11*/ + +#define PWR_EMCRETSTS2_RETGBNxF ((uint32_t)0x000000F0U) /* Bit[7:4] RET Domain EMC GBNx Flag*/ +#define PWR_EMCRETSTS2_RETGBNxF_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define PWR_EMCRETSTS2_RETGBNxF_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define PWR_EMCRETSTS2_RETGBNxF_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define PWR_EMCRETSTS2_RETGBNxF_3 ((uint32_t)0x00000080U) /* Bit7*/ + +#define PWR_EMCRETSTS2_RETCLPxF ((uint32_t)0x0000000FU) /* Bit[3:0] RET Domain EMC Clampx Flag*/ +#define PWR_EMCRETSTS2_RETCLPxF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define PWR_EMCRETSTS2_RETCLPxF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define PWR_EMCRETSTS2_RETCLPxF_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define PWR_EMCRETSTS2_RETCLPxF_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for PWR_EMCRETCTRL3 register ********/ +#define PWR_EMCRETCTRL3_RETGBxDET ((uint32_t)0x00000F00U) /* Bit[11:8] RET domain EMC GBx detection enable*/ +#define PWR_EMCRETCTRL3_RETGBxDET_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define PWR_EMCRETCTRL3_RETGBxDET_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define PWR_EMCRETCTRL3_RETGBxDET_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define PWR_EMCRETCTRL3_RETGBxDET_3 ((uint32_t)0x00000800U) /* Bit11*/ + +#define PWR_EMCRETCTRL3_RETGBNxDET ((uint32_t)0x000000F0U) /* Bit[7:4] RET domain EMC GBNx detection enable*/ +#define PWR_EMCRETCTRL3_RETGBNxDET_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define PWR_EMCRETCTRL3_RETGBNxDET_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define PWR_EMCRETCTRL3_RETGBNxDET_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define PWR_EMCRETCTRL3_RETGBNxDET_3 ((uint32_t)0x00000080U) /* Bit7*/ + +#define PWR_EMCRETCTRL3_RETCLPxDET ((uint32_t)0x0000000FU) /* Bit[3:0] RET domain EMC Clampx detection enable*/ +#define PWR_EMCRETCTRL3_RETCLPxDET_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define PWR_EMCRETCTRL3_RETCLPxDET_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define PWR_EMCRETCTRL3_RETCLPxDET_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define PWR_EMCRETCTRL3_RETCLPxDET_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for PWR_EMCRETSTS3 register ********/ +#define PWR_EMCRETSTS3_RETGBF ((uint32_t)0x00000F00U) /* Bit[11:8] RET Domain EMC GBx Flag*/ +#define PWR_EMCRETSTS3_RETGBF_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define PWR_EMCRETSTS3_RETGBF_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define PWR_EMCRETSTS3_RETGBF_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define PWR_EMCRETSTS3_RETGBF_3 ((uint32_t)0x00000800U) /* Bit11*/ + +#define PWR_EMCRETSTS3_RETGBNF ((uint32_t)0x000000F0U) /* Bit[7:4] RET Domain EMC GBNx Flag*/ +#define PWR_EMCRETSTS3_RETGBNF_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define PWR_EMCRETSTS3_RETGBNF_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define PWR_EMCRETSTS3_RETGBNF_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define PWR_EMCRETSTS3_RETGBNF_3 ((uint32_t)0x00000080U) /* Bit7*/ + +#define PWR_EMCRETSTS3_RETCLPF ((uint32_t)0x0000000FU) /* Bit[3:0] RET Domain EMC Clampx Flag*/ +#define PWR_EMCRETSTS3_RETCLPF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define PWR_EMCRETSTS3_RETCLPF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define PWR_EMCRETSTS3_RETCLPF_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define PWR_EMCRETSTS3_RETCLPF_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for PWR_EMCRETCTRL4 register ********/ +#define PWR_EMCRETCTRL4_RETGBxDET ((uint32_t)0x00000700U) /* Bit[10:8] RET domain EMC GBx detection enable*/ +#define PWR_EMCRETCTRL4_RETGBxDET_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define PWR_EMCRETCTRL4_RETGBxDET_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define PWR_EMCRETCTRL4_RETGBxDET_2 ((uint32_t)0x00000400U) /* Bit10*/ + +#define PWR_EMCRETCTRL4_RETGBNxDET ((uint32_t)0x00000070U) /* Bit[6:4] RET domain EMC GBNx detection enable*/ +#define PWR_EMCRETCTRL4_RETGBNxDET_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define PWR_EMCRETCTRL4_RETGBNxDET_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define PWR_EMCRETCTRL4_RETGBNxDET_2 ((uint32_t)0x00000040U) /* Bit6*/ + +#define PWR_EMCRETCTRL4_RETCLPxDET ((uint32_t)0x00000007U) /* Bit[2:0] RET domain EMC Clampx detection enable*/ +#define PWR_EMCRETCTRL4_RETCLPxDET_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define PWR_EMCRETCTRL4_RETCLPxDET_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define PWR_EMCRETCTRL4_RETCLPxDET_2 ((uint32_t)0x00000004U) /* Bit2*/ + +/******** Bit definition for PWR_EMCRETSTS4 register ********/ +#define PWR_EMCRETSTS4_RETGBxF ((uint32_t)0x00000700U) /* Bit[10:8] RET Domain EMC GBx Flag*/ +#define PWR_EMCRETSTS4_RETGBxF_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define PWR_EMCRETSTS4_RETGBxF_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define PWR_EMCRETSTS4_RETGBxF_2 ((uint32_t)0x00000400U) /* Bit10*/ + +#define PWR_EMCRETSTS4_RETGBNxF ((uint32_t)0x00000070U) /* Bit[6:4] RET Domain EMC GBNx Flag*/ +#define PWR_EMCRETSTS4_RETGBNxF_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define PWR_EMCRETSTS4_RETGBNxF_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define PWR_EMCRETSTS4_RETGBNxF_2 ((uint32_t)0x00000040U) /* Bit6*/ + +#define PWR_EMCRETSTS4_RETCLPxF ((uint32_t)0x00000007U) /* Bit[2:0] RET Domain EMC Clampx Flag*/ +#define PWR_EMCRETSTS4_RETCLPxF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define PWR_EMCRETSTS4_RETCLPxF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define PWR_EMCRETSTS4_RETCLPxF_2 ((uint32_t)0x00000004U) /* Bit2*/ + +/******** Bit definition for PWR_EMCBKPCTRL register ********/ +#define PWR_EMCBKPCTRL_BKPCBDET ((uint32_t)0x00000100U) /* Bit[8] Backup domain EMC GB detection enable*/ +#define PWR_EMCBKPCTRL_BKPCBNDET ((uint32_t)0x00000010U) /* Bit[4] Backup domain EMC GBN detection enable*/ +#define PWR_EMCBKPCTRL_BKPCLPDET ((uint32_t)0x00000001U) /* Bit[0] Backup domain EMC Clamp detection enable*/ + +/******** Bit definition for PWR_EMCBKPSTS register ********/ +#define PWR_EMCBKPSTS_BKPCLR ((uint32_t)0x01000000U) /* Bit[24] Clear EMC BKP flag*/ +#define PWR_EMCBKPSTS_BKPGBF ((uint32_t)0x00000100U) /* Bit[8] Backup Domain EMC GB Flag*/ +#define PWR_EMCBKPSTS_BKPGBNF ((uint32_t)0x00000010U) /* Bit[4] Backup Domain EMC GBN Flag*/ +#define PWR_EMCBKPSTS_BKPCLPF ((uint32_t)0x00000001U) /* Bit[0] Backup Domain EMC Clamp Flag*/ + + + /******************************************************************************/ + /* */ + /* Low Power UART */ + /* */ + /******************************************************************************/ +/******** Bit definition for LPUART_STS register ********/ +#define LPUART_STS_TXFEF ((uint32_t)0x00010000U) /* Bit[16] transmit FIFO Empty Flag,1:FIFO is empty*/ +#define LPUART_STS_FE ((uint32_t)0x00008000U) /* Bit[15]frame error detected, 1:detect frame error*/ +#define LPUART_STS_IDLEF ((uint32_t)0x00004000U) /* Bit[14] IDLE frame detected,1:detect idle frame*/ +#define LPUART_STS_TXFNEF ((uint32_t)0x00002000U) /* Bit[13] transmit FIFO Non-Empty Flag,1:FIFO is non-empty*/ +#define LPUART_STS_TXFHFF ((uint32_t)0x00001000U) /* Bit[12] transmit FIFO Half Full Flag,1:FIFO is Half-Full*/ +#define LPUART_STS_TXFQFF ((uint32_t)0x00000800U) /* Bit[11] transmit FIFO quarter Full Flag,1:FIFO is three-QUAR-Full*/ +#define LPUART_STS_TXFFF ((uint32_t)0x00000400U) /* Bit[10] transmit FIFO Full Flag,1:FIFO is Full*/ +#define LPUART_STS_TXFOF ((uint32_t)0x00000200U) /* Bit[9] transmit FIFO Overflow Flag,1:FIFO is overflow */ +#define LPUART_STS_NEF ((uint32_t)0x00000100U) /* Bit[8] Noise error Flag,1:Noise is detected*/ +#define LPUART_STS_WUF ((uint32_t)0x00000080U) /* Bit[7] Wakeup from Stop mode Flag,1:Wakeup Events Detected*/ +#define LPUART_STS_CTSF ((uint32_t)0x00000040U) /* Bit[6] Clear to Send Flag,1:CTS Line is Set*/ +#define LPUART_STS_RXFNEF ((uint32_t)0x00000020U) /* Bit[5] FIFO Non-Empty Flag,1:FIFO is non-empty*/ +#define LPUART_STS_RXFHFF ((uint32_t)0x00000010U) /* Bit[4] FIFO Half Full Flag,1:FIFO is Half-Full*/ +#define LPUART_STS_RXFFF ((uint32_t)0x00000008U) /* Bit[3] FIFO Full Flag,1:FIFO is Full */ +#define LPUART_STS_RXFOF ((uint32_t)0x00000004U) /* Bit[2] FIFO Overflow Flag, 1:FIFO is overflow*/ +#define LPUART_STS_TXCF ((uint32_t)0x00000002U) /* Bit[1] TX Complete Flag,1:TX Transmission is Done*/ +#define LPUART_STS_PCEF ((uint32_t)0x00000001U) /* Bit[0] Parity Check Error Flag,1:TX/RX Parity Error is Detected*/ + +/******** Bit definition for LPUART_INTEN register ********/ +#define LPUART_INTEN_TXFEIEN ((uint32_t)0x00004000U) /* Bit[14] TXFIFO Empty Interrupt Enable */ +#define LPUART_INTEN_FEIEN ((uint32_t)0x00002000U) /* Bit[13] FRAME_ERROR Interrupt Enable*/ +#define LPUART_INTEN_IDLEFIEN ((uint32_t)0x00001000U) /* Bit[12] IDLE_FRAMEIE Interrupt Enable*/ +#define LPUART_INTEN_TXFNEIEN ((uint32_t)0x00000800U) /* Bit[11] TXFIFO Non-Empty Interrupt Enable*/ +#define LPUART_INTEN_TXFHFIEN ((uint32_t)0x00000400U) /* Bit[10] TXFIFO Half Full Interrupt Enable*/ +#define LPUART_INTEN_TXFQFIEN ((uint32_t)0x00000200U) /* Bit[9] TXFIFO QUAR Full Interrupt Enable*/ +#define LPUART_INTEN_TXFFIEN ((uint32_t)0x00000100U) /* Bit[8] TXFIFO Full Interrupt Enable*/ +#define LPUART_INTEN_TXFOIEN ((uint32_t)0x00000080U) /* Bit[7] TXFIFO Overflow Interrupt Enable*/ +#define LPUART_INTEN_WUIEN ((uint32_t)0x00000040U) /* Bit[6] Wakeup Interrupt Enable*/ +#define LPUART_INTEN_RXFNEIEN ((uint32_t)0x00000020U) /* Bit[5] FIFO Non-Empty Interrupt Enable*/ +#define LPUART_INTEN_RXFHFIEN ((uint32_t)0x00000010U) /* Bit[4] FIFO Half Full Interrupt Enable*/ +#define LPUART_INTEN_RXFFIEN ((uint32_t)0x00000008U) /* Bit[3] FIFO Full Interrupt Enable*/ +#define LPUART_INTEN_RXFOIEN ((uint32_t)0x00000004U) /* Bit[2] FIFO Overflow Interrupt Enable*/ +#define LPUART_INTEN_TXCIEN ((uint32_t)0x00000002U) /* Bit[1] TX Complete Interrupt Enable*/ +#define LPUART_INTEN_PCEIEN ((uint32_t)0x00000001U) /* Bit[0] Parity Check Error Interrupt Enable*/ + +/******** Bit definition for LPUART_CTRL register ********/ +#define LPUART_CTRL_RXEN ((uint32_t)0x01000000U) /* Bit[24] RX Enable,1 Enable RX*/ +#define LPUART_CTRL_RXNUMWU ((uint32_t)0x00F80000U) /* Bit[23:19] can be configured to receive how many bytes of data to wake */ +#define LPUART_CTRL_RXNUMWU_0 ((uint32_t)0x00080000U) /* Bit19*/ +#define LPUART_CTRL_RXNUMWU_1 ((uint32_t)0x00100000U) /* Bit20*/ +#define LPUART_CTRL_RXNUMWU_2 ((uint32_t)0x00200000U) /* Bit21*/ +#define LPUART_CTRL_RXNUMWU_3 ((uint32_t)0x00400000U) /* Bit22*/ +#define LPUART_CTRL_RXNUMWU_4 ((uint32_t)0x00800000U) /* Bit23*/ +#define LPUART_CTRL_FTXF ((uint32_t)0x00040000U) /* Bit[18] Flush transmit TXFIFO,1:Enable to Flush TXFIFO Content*/ +#define LPUART_CTRL_IDLEFEN ((uint32_t)0x00020000U) /* Bit[17] idle frame detect en,1:enable*/ +#define LPUART_CTRL_SSM ((uint32_t)0x00010000U) /* Bit[16] Specify the sampling method,1: 1 Sample*/ +#define LPUART_CTRL_WUS ((uint32_t)0x0000F000U) /* Bit[15:12] Wakeup Event Selection*/ +#define LPUART_CTRL_WUS_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define LPUART_CTRL_WUS_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define LPUART_CTRL_WUS_2 ((uint32_t)0x00004000U) /* Bit14*/ +#define LPUART_CTRL_WUS_3 ((uint32_t)0x00008000U) /* Bit15*/ +#define LPUART_CTRL_RTSEN ((uint32_t)0x00000800U) /* Bit[11] Hardware Flow Control RX Enable,1: Enable*/ +#define LPUART_CTRL_CTSEN ((uint32_t)0x00000400U) /* Bit[10] Hardware Flow Control TX Enable,1: Enable*/ +#define LPUART_CTRL_RTST ((uint32_t)0x00000300U) /* Bit[9:8] RTS Threshold*/ +#define LPUART_CTRL_RTST_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define LPUART_CTRL_RTST_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define LPUART_CTRL_WUSTPEN ((uint32_t)0x00000080U) /* Bit[7] LPUART Wakeup Enable in Stop mode,1: Able to Wakeup in Stop mode*/ +#define LPUART_CTRL_DMARXEN ((uint32_t)0x00000040U) /* Bit[6] DMA RX Request Enable*/ +#define LPUART_CTRL_DMATXEN ((uint32_t)0x00000020U) /* Bit[5] DMA TX Request Enable*/ +#define LPUART_CTRL_LB ((uint32_t)0x00000010U) /* Bit[4] LoopBack Self-Test,1: Loop Back Test*/ +#define LPUART_CTRL_PC ((uint32_t)0x00000008U) /* Bit[3] Parity Control,1: Disabled Parity Bit*/ +#define LPUART_CTRL_FRXF ((uint32_t)0x00000004U) /* Bit[2] Flush Receiver FIFO,1: Enable to Flush FIFO Content*/ +#define LPUART_CTRL_TXEN ((uint32_t)0x00000002U) /* Bit[1] TX Enable,1: Enable TX*/ +#define LPUART_CTRL_PEN ((uint32_t)0x00000001U) /* Bit[0] Odd Parity Bit Enable,1: Odd Parity Bit*/ + +/******** Bit definition for LPUART_BRCFG1 register ********/ +#define LPUART_BRCFG1_BRP ((uint32_t)0x0000FFFFU) /* Bit[15:0] Baud Rate Parameter Register*/ +#define LPUART_BRCFG1_BRP_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define LPUART_BRCFG1_BRP_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define LPUART_BRCFG1_BRP_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define LPUART_BRCFG1_BRP_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define LPUART_BRCFG1_BRP_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define LPUART_BRCFG1_BRP_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define LPUART_BRCFG1_BRP_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define LPUART_BRCFG1_BRP_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define LPUART_BRCFG1_BRP_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define LPUART_BRCFG1_BRP_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define LPUART_BRCFG1_BRP_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define LPUART_BRCFG1_BRP_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define LPUART_BRCFG1_BRP_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define LPUART_BRCFG1_BRP_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define LPUART_BRCFG1_BRP_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define LPUART_BRCFG1_BRP_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/******** Bit definition for LPUART_TXDAT register ********/ +#define LPUART_TXDAT_DAT ((uint32_t)0x000000FFU) /* Bit[7:0] Write to Data Register for TXFIFO */ +#define LPUART_TXDAT_DAT_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define LPUART_TXDAT_DAT_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define LPUART_TXDAT_DAT_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define LPUART_TXDAT_DAT_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define LPUART_TXDAT_DAT_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define LPUART_TXDAT_DAT_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define LPUART_TXDAT_DAT_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define LPUART_TXDAT_DAT_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/******** Bit definition for LPUART_BRCFG2 register ********/ +#define LPUART_BRCFG2_MC ((uint32_t)0x000000FFU) /* Bit[7:0] Modulation Control Register For Baud Rate Error Correction at Low */ +#define LPUART_BRCFG2_MC_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define LPUART_BRCFG2_MC_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define LPUART_BRCFG2_MC_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define LPUART_BRCFG2_MC_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define LPUART_BRCFG2_MC_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define LPUART_BRCFG2_MC_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define LPUART_BRCFG2_MC_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define LPUART_BRCFG2_MC_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/******** Bit definition for LPUART_WUDAT1 register ********/ +#define LPUART_WUDAT1_DAT ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Configure this register to detect byte or frame match for wakeup CPU from stop mode*/ + +/******** Bit definition for LPUART_WUDAT2 register ********/ +#define LPUART_WUDAT2_DAT ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Configure this register to detect byte or frame match for wakeup CPU from stop mode*/ + +/******** Bit definition for LPUART_RXDAT register ********/ +#define LPUART_RXDAT_DAT ((uint32_t)0x000000FFU) /* Bit[7:0] Read this register to read RX data from RX FIFO*/ +#define LPUART_RXDAT_DAT_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define LPUART_RXDAT_DAT_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define LPUART_RXDAT_DAT_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define LPUART_RXDAT_DAT_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define LPUART_RXDAT_DAT_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define LPUART_RXDAT_DAT_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define LPUART_RXDAT_DAT_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define LPUART_RXDAT_DAT_7 ((uint32_t)0x00000080U) /* Bit7*/ + + + + /******************************************************************************/ + /* */ + /* Backup registers */ + /* */ + /******************************************************************************/ + + /******************* Bit definition for BKP_DR1 register ********************/ +#define BKP_DR1_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR2 register ********************/ +#define BKP_DR2_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR3 register ********************/ +#define BKP_DR3_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR4 register ********************/ +#define BKP_DR4_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR5 register ********************/ +#define BKP_DR5_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR6 register ********************/ +#define BKP_DR6_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR7 register ********************/ +#define BKP_DR7_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR8 register ********************/ +#define BKP_DR8_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR9 register ********************/ +#define BKP_DR9_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR10 register *******************/ +#define BKP_DR10_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR11 register *******************/ +#define BKP_DR11_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR12 register *******************/ +#define BKP_DR12_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR13 register *******************/ +#define BKP_DR13_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR14 register *******************/ +#define BKP_DR14_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR15 register *******************/ +#define BKP_DR15_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR16 register *******************/ +#define BKP_DR16_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR17 register *******************/ +#define BKP_DR17_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /****************** Bit definition for BKP_DR18 register ********************/ +#define BKP_DR18_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR19 register *******************/ +#define BKP_DR19_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR20 register *******************/ +#define BKP_DR20_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR21 register *******************/ +#define BKP_DR21_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR22 register *******************/ +#define BKP_DR22_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR23 register *******************/ +#define BKP_DR23_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR24 register *******************/ +#define BKP_DR24_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR25 register *******************/ +#define BKP_DR25_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR26 register *******************/ +#define BKP_DR26_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR27 register *******************/ +#define BKP_DR27_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR28 register *******************/ +#define BKP_DR28_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR29 register *******************/ +#define BKP_DR29_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR30 register *******************/ +#define BKP_DR30_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR31 register *******************/ +#define BKP_DR31_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR32 register *******************/ +#define BKP_DR32_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR33 register *******************/ +#define BKP_DR33_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR34 register *******************/ +#define BKP_DR34_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR35 register *******************/ +#define BKP_DR35_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR36 register *******************/ +#define BKP_DR36_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR37 register *******************/ +#define BKP_DR37_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR38 register *******************/ +#define BKP_DR38_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR39 register *******************/ +#define BKP_DR39_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR40 register *******************/ +#define BKP_DR40_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR41 register *******************/ +#define BKP_DR41_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /******************* Bit definition for BKP_DR42 register *******************/ +#define BKP_DR42_D ((uint16_t)0xFFFF) /*!< Backup data */ + + /****************** Bit definition for BKP_RTCCR register *******************/ +#define BKP_RTCCR_CAL ((uint16_t)0x007F) /*!< Calibration value */ +#define BKP_RTCCR_CCO ((uint16_t)0x0080) /*!< Calibration Clock Output */ +#define BKP_RTCCR_ASOE ((uint16_t)0x0100) /*!< Alarm or Second Output Enable */ +#define BKP_RTCCR_ASOS ((uint16_t)0x0200) /*!< Alarm or Second Output Selection */ + + /******************** Bit definition for BKP_CR register ********************/ +#define BKP_CR_TPE ((uint8_t)0x01) /*!< TAMPER pin enable */ +#define BKP_CR_TPAL ((uint8_t)0x02) /*!< TAMPER pin active level */ + + /******************* Bit definition for BKP_CSR register ********************/ +#define BKP_CSR_CTE ((uint16_t)0x0001) /*!< Clear Tamper event */ +#define BKP_CSR_CTI ((uint16_t)0x0002) /*!< Clear Tamper Interrupt */ +#define BKP_CSR_TPIE ((uint16_t)0x0004) /*!< TAMPER Pin interrupt enable */ +#define BKP_CSR_TEF ((uint16_t)0x0100) /*!< Tamper Event Flag */ +#define BKP_CSR_TIF ((uint16_t)0x0200) /*!< Tamper Interrupt Flag */ + + + +/*** Cylic Redundancy Check(CRC) Calculation Unit ***/ +/******************** Bit definition for CRC_DAT register ********************/ +#define CRC_DAT_DAT ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] CRC data */ + +/******************** Bit definition for CRC_IDAT register ********************/ +#define CRC_IDAT_IDAT ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] CRC independent data */ + +/******************** Bit definition for CRC_CTRL register ********************/ +#define CRC_CTRL_RESET ((uint32_t)0x00000001U) /* Bit[0] CRC calculation unit reset */ + +#define CRC_CTRL_BYTEENDIAN ((uint32_t)0x00000006U) /* Bit[2:1] CRC byte Endian bits[1:0] */ +#define CRC_CTRL_BYTEENDIAN_0 ((uint32_t)0x00000002U) /* Bit[1] CRC byte Endian bit0 */ +#define CRC_CTRL_BYTEENDIAN_1 ((uint32_t)0x00000004U) /* Bit[2] CRC byte Endian bit1 */ + +#define CRC_CTRL_POLYSIZE ((uint32_t)0x00000018U) /* Bit[4:3] CRC polynomial size bits[1:0] */ +#define CRC_CTRL_POLYSIZE_0 ((uint32_t)0x00000008U) /* Bit[3] CRC polynomial size bit0 */ +#define CRC_CTRL_POLYSIZE_1 ((uint32_t)0x00000010U) /* Bit[4] CRC polynomial size bit1 */ + +#define CRC_CTRL_REVIN ((uint32_t)0x00000060U) /* Bit[6:5] CRC input data reverse bits[1:0] */ +#define CRC_CTRL_REVIN_0 ((uint32_t)0x00000020U) /* Bit[5] CRC input data reverse bit0 */ +#define CRC_CTRL_REVIN_1 ((uint32_t)0x00000040U) /* Bit[6] CRC input data reverse bit1 */ + +#define CRC_CTRL_REVOUT ((uint32_t)0x00000080U) /* Bit[7] CRC output data reverse bit */ + +/******************** Bit definition for CRC_LRC register ********************/ +#define CRC_LRC_LRC ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] CRC LRC value bits */ + +/******************* Bit definition for CRC_INIT register *******************/ +#define CRC_INIT_INIT ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] CRC initial value bits */ + +/******************* Bit definition for CRC_POL register ********************/ +#define CRC_POL_POL ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] CRC pllynomial coefficients bits */ + +/******************* Bit definition for CRC_INXORDAT register ********************/ +#define CRC_INXORDAT_INXOR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] CRC XOR bits before calculation */ + +/******************* Bit definition for CRC_OUTXORDAT register ********************/ +#define CRC_OUTXORDAT_OUTXOR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] CRC XOR bits after calculation */ + + + + /******************************************************************************/ + /* */ + /* General Purpose and Alternate Function I/O */ + /* */ + /******************************************************************************/ + +/******** Bit definition for GPIOx_PMODE register ********/ +#define GPIO_PMODE_PMODE0 ((uint32_t)0x00000003U) /* Port x Pin 0 mode bits */ +#define GPIO_PMODE_PMODE0_0 ((uint32_t)0x00000001U) /* Port x Pin 0 mode bit 0 */ +#define GPIO_PMODE_PMODE0_1 ((uint32_t)0x00000002U) /* Port x Pin 0 mode bit 1 */ + +#define GPIO_PMODE_PMODE1 ((uint32_t)0x0000000CU) /* Port x Pin 1 mode bits */ +#define GPIO_PMODE_PMODE1_0 ((uint32_t)0x00000004U) /* Port x Pin 1 mode bit 0 */ +#define GPIO_PMODE_PMODE1_1 ((uint32_t)0x00000008U) /* Port x Pin 1 mode bit 1 */ + +#define GPIO_PMODE_PMODE2 ((uint32_t)0x00000030U) /* Port x Pin 2 mode bits */ +#define GPIO_PMODE_PMODE2_0 ((uint32_t)0x00000010U) /* Port x Pin 2 mode bit 0 */ +#define GPIO_PMODE_PMODE2_1 ((uint32_t)0x00000020U) /* Port x Pin 2 mode bit 1 */ + +#define GPIO_PMODE_PMODE3 ((uint32_t)0x000000C0U) /* Port x Pin 3 mode bits */ +#define GPIO_PMODE_PMODE3_0 ((uint32_t)0x00000040U) /* Port x Pin 3 mode bit 0 */ +#define GPIO_PMODE_PMODE3_1 ((uint32_t)0x00000080U) /* Port x Pin 3 mode bit 1 */ + +#define GPIO_PMODE_PMODE4 ((uint32_t)0x00000300U) /* Port x Pin 4 mode bits */ +#define GPIO_PMODE_PMODE4_0 ((uint32_t)0x00000100U) /* Port x Pin 4 mode bit 0 */ +#define GPIO_PMODE_PMODE4_1 ((uint32_t)0x00000200U) /* Port x Pin 4 mode bit 1 */ + +#define GPIO_PMODE_PMODE5 ((uint32_t)0x00000C00U) /* Port x Pin 5 mode bits */ +#define GPIO_PMODE_PMODE5_0 ((uint32_t)0x00000400U) /* Port x Pin 5 mode bit 0 */ +#define GPIO_PMODE_PMODE5_1 ((uint32_t)0x00000800U) /* Port x Pin 5 mode bit 1 */ + +#define GPIO_PMODE_PMODE6 ((uint32_t)0x00003000U) /* Port x Pin 6 mode bits */ +#define GPIO_PMODE_PMODE6_0 ((uint32_t)0x00001000U) /* Port x Pin 6 mode bit 0 */ +#define GPIO_PMODE_PMODE6_1 ((uint32_t)0x00002000U) /* Port x Pin 6 mode bit 1 */ + +#define GPIO_PMODE_PMODE7 ((uint32_t)0x0000C000U) /* Port x Pin 7 mode bits */ +#define GPIO_PMODE_PMODE7_0 ((uint32_t)0x00004000U) /* Port x Pin 7 mode bit 0 */ +#define GPIO_PMODE_PMODE7_1 ((uint32_t)0x00008000U) /* Port x Pin 7 mode bit 1 */ + +#define GPIO_PMODE_PMODE8 ((uint32_t)0x00030000U) /* Port x Pin 8 mode bits */ +#define GPIO_PMODE_PMODE8_0 ((uint32_t)0x00010000U) /* Port x Pin 8 mode bit 0 */ +#define GPIO_PMODE_PMODE8_1 ((uint32_t)0x00020000U) /* Port x Pin 8 mode bit 1 */ + +#define GPIO_PMODE_PMODE9 ((uint32_t)0x000C0000U) /* Port x Pin 9 mode bits */ +#define GPIO_PMODE_PMODE9_0 ((uint32_t)0x00040000U) /* Port x Pin 9 mode bit 0 */ +#define GPIO_PMODE_PMODE9_1 ((uint32_t)0x00080000U) /* Port x Pin 9 mode bit 1 */ + +#define GPIO_PMODE_PMODE10 ((uint32_t)0x00300000U) /* Port x Pin 10 mode bits */ +#define GPIO_PMODE_PMODE10_0 ((uint32_t)0x00100000U) /* Port x Pin 10 mode bit 0 */ +#define GPIO_PMODE_PMODE10_1 ((uint32_t)0x00200000U) /* Port x Pin 10 mode bit 1 */ + +#define GPIO_PMODE_PMODE11 ((uint32_t)0x00C00000U) /* Port x Pin 11 mode bits */ +#define GPIO_PMODE_PMODE11_0 ((uint32_t)0x00400000U) /* Port x Pin 11 mode bit 0 */ +#define GPIO_PMODE_PMODE11_1 ((uint32_t)0x00800000U) /* Port x Pin 11 mode bit 1 */ + +#define GPIO_PMODE_PMODE12 ((uint32_t)0x03000000U) /* Port x Pin 12 mode bits */ +#define GPIO_PMODE_PMODE12_0 ((uint32_t)0x01000000U) /* Port x Pin 12 mode bit 0 */ +#define GPIO_PMODE_PMODE12_1 ((uint32_t)0x02000000U) /* Port x Pin 12 mode bit 1 */ + +#define GPIO_PMODE_PMODE13 ((uint32_t)0x0C000000U) /* Port x Pin 13 mode bits */ +#define GPIO_PMODE_PMODE13_0 ((uint32_t)0x04000000U) /* Port x Pin 13 mode bit 0 */ +#define GPIO_PMODE_PMODE13_1 ((uint32_t)0x08000000U) /* Port x Pin 13 mode bit 1 */ + +#define GPIO_PMODE_PMODE14 ((uint32_t)0x30000000U) /* Port x Pin 14 mode bits */ +#define GPIO_PMODE_PMODE14_0 ((uint32_t)0x10000000U) /* Port x Pin 14 mode bit 0 */ +#define GPIO_PMODE_PMODE14_1 ((uint32_t)0x20000000U) /* Port x Pin 14 mode bit 1 */ + +#define GPIO_PMODE_PMODE15 ((uint32_t)0xC0000000U) /* Port x Pin 15 mode bits */ +#define GPIO_PMODE_PMODE15_0 ((uint32_t)0x40000000U) /* Port x Pin 15 mode bit 0 */ +#define GPIO_PMODE_PMODE15_1 ((uint32_t)0x80000000U) /* Port x Pin 15 mode bit 1 */ + +#define GPIO_PMODE_INPUT ((uint32_t)0x00000000U) /* Input mode */ +#define GPIO_PMODE_OUTPUT ((uint32_t)0x00000001U) /* General output mode */ +#define GPIO_PMODE_AF_OUTPUT ((uint32_t)0x00000002U) /* Alternate output mode */ +#define GPIO_PMODE_ANALOG ((uint32_t)0x00000003U) /* Analog mode */ + + /****************** Bit definition for GPIO_POTYPE register *****************/ +#define GPIO_POTYPE_POT0 ((uint32_t)0x00000001U) /* Port x Pin 0 output type bits */ +#define GPIO_POTYPE_POT1 ((uint32_t)0x00000002U) /* Port x Pin 1 output type bits */ +#define GPIO_POTYPE_POT2 ((uint32_t)0x00000004U) /* Port x Pin 2 output type bits */ +#define GPIO_POTYPE_POT3 ((uint32_t)0x00000008U) /* Port x Pin 3 output type bits */ +#define GPIO_POTYPE_POT4 ((uint32_t)0x00000010U) /* Port x Pin 4 output type bits */ +#define GPIO_POTYPE_POT5 ((uint32_t)0x00000020U) /* Port x Pin 5 output type bits */ +#define GPIO_POTYPE_POT6 ((uint32_t)0x00000040U) /* Port x Pin 6 output type bits */ +#define GPIO_POTYPE_POT7 ((uint32_t)0x00000080U) /* Port x Pin 7 output type bits */ +#define GPIO_POTYPE_POT8 ((uint32_t)0x00000100U) /* Port x Pin 8 output type bits */ +#define GPIO_POTYPE_POT9 ((uint32_t)0x00000200U) /* Port x Pin 9 output type bits */ +#define GPIO_POTYPE_POT10 ((uint32_t)0x00000400U) /* Port x Pin 10 output type bits */ +#define GPIO_POTYPE_POT11 ((uint32_t)0x00000800U) /* Port x Pin 11 output type bits */ +#define GPIO_POTYPE_POT12 ((uint32_t)0x00001000U) /* Port x Pin 12 output type bits */ +#define GPIO_POTYPE_POT13 ((uint32_t)0x00002000U) /* Port x Pin 13 output type bits */ +#define GPIO_POTYPE_POT14 ((uint32_t)0x00004000U) /* Port x Pin 14 output type bits */ +#define GPIO_POTYPE_POT15 ((uint32_t)0x00008000U) /* Port x Pin 15 output type bits */ + +#define GPIO_POTYPE_PUSH_PULL ((uint32_t)0x00000000U) +#define GPIO_POTYPE_OPEN_DRAIN ((uint32_t)0x00000001U) + +/** Bit definition for GPIO_SR register **/ +#define GPIO_SR_SR0 ((uint32_t)0x00000001U) /* Port x Pin 0 Slew rate bit */ +#define GPIO_SR_SR1 ((uint32_t)0x00000002U) /* Port x Pin 1 Slew rate bit */ +#define GPIO_SR_SR2 ((uint32_t)0x00000004U) /* Port x Pin 2 Slew rate bit */ +#define GPIO_SR_SR3 ((uint32_t)0x00000008U) /* Port x Pin 3 Slew rate bit */ +#define GPIO_SR_SR4 ((uint32_t)0x00000010U) /* Port x Pin 4 Slew rate bit */ +#define GPIO_SR_SR5 ((uint32_t)0x00000020U) /* Port x Pin 5 Slew rate bit */ +#define GPIO_SR_SR6 ((uint32_t)0x00000040U) /* Port x Pin 6 Slew rate bit */ +#define GPIO_SR_SR7 ((uint32_t)0x00000080U) /* Port x Pin 7 Slew rate bit */ +#define GPIO_SR_SR8 ((uint32_t)0x00000100U) /* Port x Pin 8 Slew rate bit */ +#define GPIO_SR_SR9 ((uint32_t)0x00000200U) /* Port x Pin 9 Slew rate bit */ +#define GPIO_SR_SR10 ((uint32_t)0x00000400U) /* Port x Pin 10 Slew rate bit */ +#define GPIO_SR_SR11 ((uint32_t)0x00000800U) /* Port x Pin 11 Slew rate bit */ +#define GPIO_SR_SR12 ((uint32_t)0x00001000U) /* Port x Pin 12 Slew rate bit */ +#define GPIO_SR_SR13 ((uint32_t)0x00002000U) /* Port x Pin 13 Slew rate bit */ +#define GPIO_SR_SR14 ((uint32_t)0x00004000U) /* Port x Pin 14 Slew rate bit */ +#define GPIO_SR_SR15 ((uint32_t)0x00008000U) /* Port x Pin 15 Slew rate bit */ + +#define GPIO_SR_FAST_SLEW ((uint32_t)0x00000000U) /* Fast slew rate */ +#define GPIO_SR_SLOW_SLEW ((uint32_t)0x00000001U) /* Slow slew rate */ + +/** Bit definition for GPIO_PUPD register **/ +#define GPIO_PUPD_PUPD0 ((uint32_t)0x00000003U) /* Port x Pin 0 pull control bits */ +#define GPIO_PUPD_PUPD0_0 ((uint32_t)0x00000001U) /* Port x Pin 0 pull control bit 0 */ +#define GPIO_PUPD_PUPD0_1 ((uint32_t)0x00000002U) /* Port x Pin 0 pull control bit 1 */ + +#define GPIO_PUPD_PUPD1 ((uint32_t)0x0000000CU) /* Port x Pin 1 pull control bits */ +#define GPIO_PUPD_PUPD1_0 ((uint32_t)0x00000004U) /* Port x Pin 1 pull control bit 0 */ +#define GPIO_PUPD_PUPD1_1 ((uint32_t)0x00000008U) /* Port x Pin 1 pull control bit 1 */ + +#define GPIO_PUPD_PUPD2 ((uint32_t)0x00000030U) /* Port x Pin 2 pull control bits */ +#define GPIO_PUPD_PUPD2_0 ((uint32_t)0x00000010U) /* Port x Pin 2 pull control bit 0 */ +#define GPIO_PUPD_PUPD2_1 ((uint32_t)0x00000020U) /* Port x Pin 2 pull control bit 1 */ + +#define GPIO_PUPD_PUPD3 ((uint32_t)0x000000C0U) /* Port x Pin 3 pull control bits */ +#define GPIO_PUPD_PUPD3_0 ((uint32_t)0x00000040U) /* Port x Pin 3 pull control bit 0 */ +#define GPIO_PUPD_PUPD3_1 ((uint32_t)0x00000080U) /* Port x Pin 3 pull control bit 1 */ + +#define GPIO_PUPD_PUPD4 ((uint32_t)0x00000300U) /* Port x Pin 4 pull control bits */ +#define GPIO_PUPD_PUPD4_0 ((uint32_t)0x00000100U) /* Port x Pin 4 pull control bit 0 */ +#define GPIO_PUPD_PUPD4_1 ((uint32_t)0x00000200U) /* Port x Pin 4 pull control bit 1 */ + +#define GPIO_PUPD_PUPD5 ((uint32_t)0x00000C00U) /* Port x Pin 5 pull control bits */ +#define GPIO_PUPD_PUPD5_0 ((uint32_t)0x00000400U) /* Port x Pin 5 pull control bit 0 */ +#define GPIO_PUPD_PUPD5_1 ((uint32_t)0x00000800U) /* Port x Pin 5 pull control bit 1 */ + +#define GPIO_PUPD_PUPD6 ((uint32_t)0x00003000U) /* Port x Pin 6 pull control bits */ +#define GPIO_PUPD_PUPD6_0 ((uint32_t)0x00001000U) /* Port x Pin 6 pull control bit 0 */ +#define GPIO_PUPD_PUPD6_1 ((uint32_t)0x00002000U) /* Port x Pin 6 pull control bit 1 */ + +#define GPIO_PUPD_PUPD7 ((uint32_t)0x0000C000U) /* Port x Pin 7 pull control bits */ +#define GPIO_PUPD_PUPD7_0 ((uint32_t)0x00004000U) /* Port x Pin 7 pull control bit 0 */ +#define GPIO_PUPD_PUPD7_1 ((uint32_t)0x00008000U) /* Port x Pin 7 pull control bit 1 */ + +#define GPIO_PUPD_PUPD8 ((uint32_t)0x00030000U) /* Port x Pin 8 pull control bits */ +#define GPIO_PUPD_PUPD8_0 ((uint32_t)0x00010000U) /* Port x Pin 8 pull control bit 0 */ +#define GPIO_PUPD_PUPD8_1 ((uint32_t)0x00020000U) /* Port x Pin 8 pull control bit 1 */ + +#define GPIO_PUPD_PUPD9 ((uint32_t)0x000C0000U) /* Port x Pin 9 pull control bits */ +#define GPIO_PUPD_PUPD9_0 ((uint32_t)0x00040000U) /* Port x Pin 9 pull control bit 0 */ +#define GPIO_PUPD_PUPD9_1 ((uint32_t)0x00080000U) /* Port x Pin 9 pull control bit 1 */ + +#define GPIO_PUPD_PUPD10 ((uint32_t)0x00300000U) /* Port x Pin 10 pull control bits */ +#define GPIO_PUPD_PUPD10_0 ((uint32_t)0x00100000U) /* Port x Pin 10 pull control bit 0 */ +#define GPIO_PUPD_PUPD10_1 ((uint32_t)0x00200000U) /* Port x Pin 10 pull control bit 1 */ + +#define GPIO_PUPD_PUPD11 ((uint32_t)0x00C00000U) /* Port x Pin 11 pull control bits */ +#define GPIO_PUPD_PUPD11_0 ((uint32_t)0x00400000U) /* Port x Pin 11 pull control bit 0 */ +#define GPIO_PUPD_PUPD11_1 ((uint32_t)0x00800000U) /* Port x Pin 11 pull control bit 1 */ + +#define GPIO_PUPD_PUPD12 ((uint32_t)0x03000000U) /* Port x Pin 12 pull control bits */ +#define GPIO_PUPD_PUPD12_0 ((uint32_t)0x01000000U) /* Port x Pin 12 pull control bit 0 */ +#define GPIO_PUPD_PUPD12_1 ((uint32_t)0x02000000U) /* Port x Pin 12 pull control bit 1 */ + +#define GPIO_PUPD_PUPD13 ((uint32_t)0x0C000000U) /* Port x Pin 13 pull control bits */ +#define GPIO_PUPD_PUPD13_0 ((uint32_t)0x04000000U) /* Port x Pin 13 pull control bit 0 */ +#define GPIO_PUPD_PUPD13_1 ((uint32_t)0x08000000U) /* Port x Pin 13 pull control bit 1 */ + +#define GPIO_PUPD_PUPD14 ((uint32_t)0x30000000U) /* Port x Pin 14 pull control bits */ +#define GPIO_PUPD_PUPD14_0 ((uint32_t)0x10000000U) /* Port x Pin 14 pull control bit 0 */ +#define GPIO_PUPD_PUPD14_1 ((uint32_t)0x20000000U) /* Port x Pin 14 pull control bit 1 */ + +#define GPIO_PUPD_PUPD15 ((uint32_t)0xC0000000U) /* Port x Pin 15 pull control bits */ +#define GPIO_PUPD_PUPD15_0 ((uint32_t)0x40000000U) /* Port x Pin 15 pull control bit 0 */ +#define GPIO_PUPD_PUPD15_1 ((uint32_t)0x80000000U) /* Port x Pin 15 pull control bit 1 */ + + +#define GPIO_PUPD_NO_PULL ((uint32_t)0x00000000U) /* No pull */ +#define GPIO_PUPD_PULL_UP ((uint32_t)0x00000001U) /* Pull up*/ +#define GPIO_PUPD_PULL_DOWN ((uint32_t)0x00000002U) /* Pull down */ + +/** Bit definition for GPIO_PID register **/ +#define GPIO_PID_PID0 ((uint16_t)0x0001U) /* Port x Pin 0 input bit */ +#define GPIO_PID_PID1 ((uint16_t)0x0002U) /* Port x Pin 1 input bit */ +#define GPIO_PID_PID2 ((uint16_t)0x0004U) /* Port x Pin 2 input bit */ +#define GPIO_PID_PID3 ((uint16_t)0x0008U) /* Port x Pin 3 input bit */ +#define GPIO_PID_PID4 ((uint16_t)0x0010U) /* Port x Pin 4 input bit */ +#define GPIO_PID_PID5 ((uint16_t)0x0020U) /* Port x Pin 5 input bit */ +#define GPIO_PID_PID6 ((uint16_t)0x0040U) /* Port x Pin 6 input bit */ +#define GPIO_PID_PID7 ((uint16_t)0x0080U) /* Port x Pin 7 input bit */ +#define GPIO_PID_PID8 ((uint16_t)0x0100U) /* Port x Pin 8 input bit */ +#define GPIO_PID_PID9 ((uint16_t)0x0200U) /* Port x Pin 9 input bit */ +#define GPIO_PID_PID10 ((uint16_t)0x0400U) /* Port x Pin 10 input bit */ +#define GPIO_PID_PID11 ((uint16_t)0x0800U) /* Port x Pin 11 input bit */ +#define GPIO_PID_PID12 ((uint16_t)0x1000U) /* Port x Pin 12 input bit */ +#define GPIO_PID_PID13 ((uint16_t)0x2000U) /* Port x Pin 13 input bit */ +#define GPIO_PID_PID14 ((uint16_t)0x4000U) /* Port x Pin 14 input bit */ +#define GPIO_PID_PID15 ((uint16_t)0x8000U) /* Port x Pin 15 input bit */ + +/** Bit definition for GPIO_POD register **/ +#define GPIO_POD_POD0 ((uint16_t)0x0001U) /* Port x Pin 0 output bit */ +#define GPIO_POD_POD1 ((uint16_t)0x0002U) /* Port x Pin 1 output bit */ +#define GPIO_POD_POD2 ((uint16_t)0x0004U) /* Port x Pin 2 output bit */ +#define GPIO_POD_POD3 ((uint16_t)0x0008U) /* Port x Pin 3 output bit */ +#define GPIO_POD_POD4 ((uint16_t)0x0010U) /* Port x Pin 4 output bit */ +#define GPIO_POD_POD5 ((uint16_t)0x0020U) /* Port x Pin 5 output bit */ +#define GPIO_POD_POD6 ((uint16_t)0x0040U) /* Port x Pin 6 output bit */ +#define GPIO_POD_POD7 ((uint16_t)0x0080U) /* Port x Pin 7 output bit */ +#define GPIO_POD_POD8 ((uint16_t)0x0100U) /* Port x Pin 8 output bit */ +#define GPIO_POD_POD9 ((uint16_t)0x0200U) /* Port x Pin 9 output bit */ +#define GPIO_POD_POD10 ((uint16_t)0x0400U) /* Port x Pin 10 output bit */ +#define GPIO_POD_POD11 ((uint16_t)0x0800U) /* Port x Pin 11 output bit */ +#define GPIO_POD_POD12 ((uint16_t)0x1000U) /* Port x Pin 12 output bit */ +#define GPIO_POD_POD13 ((uint16_t)0x2000U) /* Port x Pin 13 output bit */ +#define GPIO_POD_POD14 ((uint16_t)0x4000U) /* Port x Pin 14 output bit */ +#define GPIO_POD_POD15 ((uint16_t)0x8000U) /* Port x Pin 15 output bit */ + +/** Bit definition for GPIO_PBSC register **/ +#define GPIO_PBSC_PBS0 ((uint32_t)0x00000001U) /* Port x Pin 0 Set bit 0 */ +#define GPIO_PBSC_PBS1 ((uint32_t)0x00000002U) /* Port x Pin 1 Set bit 1 */ +#define GPIO_PBSC_PBS2 ((uint32_t)0x00000004U) /* Port x Pin 2 Set bit 2 */ +#define GPIO_PBSC_PBS3 ((uint32_t)0x00000008U) /* Port x Pin 3 Set bit 3 */ +#define GPIO_PBSC_PBS4 ((uint32_t)0x00000010U) /* Port x Pin 4 Set bit 4 */ +#define GPIO_PBSC_PBS5 ((uint32_t)0x00000020U) /* Port x Pin 5 Set bit 5 */ +#define GPIO_PBSC_PBS6 ((uint32_t)0x00000040U) /* Port x Pin 6 Set bit 6 */ +#define GPIO_PBSC_PBS7 ((uint32_t)0x00000080U) /* Port x Pin 7 Set bit 7 */ +#define GPIO_PBSC_PBS8 ((uint32_t)0x00000100U) /* Port x Pin 8 Set bit 8 */ +#define GPIO_PBSC_PBS9 ((uint32_t)0x00000200U) /* Port x Pin 9 Set bit 9 */ +#define GPIO_PBSC_PBS10 ((uint32_t)0x00000400U) /* Port x Pin 10 Set bit 10 */ +#define GPIO_PBSC_PBS11 ((uint32_t)0x00000800U) /* Port x Pin 11 Set bit 11 */ +#define GPIO_PBSC_PBS12 ((uint32_t)0x00001000U) /* Port x Pin 12 Set bit 12 */ +#define GPIO_PBSC_PBS13 ((uint32_t)0x00002000U) /* Port x Pin 13 Set bit 13 */ +#define GPIO_PBSC_PBS14 ((uint32_t)0x00004000U) /* Port x Pin 14 Set bit 14 */ +#define GPIO_PBSC_PBS15 ((uint32_t)0x00008000U) /* Port x Pin 15 Set bit 15 */ + +#define GPIO_PBSC_PBC0 ((uint32_t)0x00010000U) /* Port x Pin 0 Reset bit 0 */ +#define GPIO_PBSC_PBC1 ((uint32_t)0x00020000U) /* Port x Pin 1 Reset bit 1 */ +#define GPIO_PBSC_PBC2 ((uint32_t)0x00040000U) /* Port x Pin 2 Reset bit 2 */ +#define GPIO_PBSC_PBC3 ((uint32_t)0x00080000U) /* Port x Pin 3 Reset bit 3 */ +#define GPIO_PBSC_PBC4 ((uint32_t)0x00100000U) /* Port x Pin 4 Reset bit 4 */ +#define GPIO_PBSC_PBC5 ((uint32_t)0x00200000U) /* Port x Pin 5 Reset bit 5 */ +#define GPIO_PBSC_PBC6 ((uint32_t)0x00400000U) /* Port x Pin 6 Reset bit 6 */ +#define GPIO_PBSC_PBC7 ((uint32_t)0x00800000U) /* Port x Pin 7 Reset bit 7 */ +#define GPIO_PBSC_PBC8 ((uint32_t)0x01000000U) /* Port x Pin 8 Reset bit 8 */ +#define GPIO_PBSC_PBC9 ((uint32_t)0x02000000U) /* Port x Pin 9 Reset bit 9 */ +#define GPIO_PBSC_PBC10 ((uint32_t)0x04000000U) /* Port x Pin 10 Reset bit 10 */ +#define GPIO_PBSC_PBC11 ((uint32_t)0x08000000U) /* Port x Pin 11 Reset bit 11 */ +#define GPIO_PBSC_PBC12 ((uint32_t)0x10000000U) /* Port x Pin 12 Reset bit 12 */ +#define GPIO_PBSC_PBC13 ((uint32_t)0x20000000U) /* Port x Pin 13 Reset bit 13 */ +#define GPIO_PBSC_PBC14 ((uint32_t)0x40000000U) /* Port x Pin 14 Reset bit 14 */ +#define GPIO_PBSC_PBC15 ((uint32_t)0x80000000U) /* Port x Pin 15 Reset bit 15 */ + +/** Bit definition for GPIO_PLOCK register **/ +#define GPIO_PLOCK_PLOCK0 ((uint32_t)0x00000001U) /* Port x Pin 0 Lock bit */ +#define GPIO_PLOCK_PLOCK1 ((uint32_t)0x00000002U) /* Port x Pin 1 Lock bit */ +#define GPIO_PLOCK_PLOCK2 ((uint32_t)0x00000004U) /* Port x Pin 2 Lock bit */ +#define GPIO_PLOCK_PLOCK3 ((uint32_t)0x00000008U) /* Port x Pin 3 Lock bit */ +#define GPIO_PLOCK_PLOCK4 ((uint32_t)0x00000010U) /* Port x Pin 4 Lock bit */ +#define GPIO_PLOCK_PLOCK5 ((uint32_t)0x00000020U) /* Port x Pin 5 Lock bit */ +#define GPIO_PLOCK_PLOCK6 ((uint32_t)0x00000040U) /* Port x Pin 6 Lock bit */ +#define GPIO_PLOCK_PLOCK7 ((uint32_t)0x00000080U) /* Port x Pin 7 Lock bit */ +#define GPIO_PLOCK_PLOCK8 ((uint32_t)0x00000100U) /* Port x Pin 8 Lock bit */ +#define GPIO_PLOCK_PLOCK9 ((uint32_t)0x00000200U) /* Port x Pin 9 Lock bit */ +#define GPIO_PLOCK_PLOCK10 ((uint32_t)0x00000400U) /* Port x Pin 10 Lock bit */ +#define GPIO_PLOCK_PLOCK11 ((uint32_t)0x00000800U) /* Port x Pin 11 Lock bit */ +#define GPIO_PLOCK_PLOCK12 ((uint32_t)0x00001000U) /* Port x Pin 12 Lock bit */ +#define GPIO_PLOCK_PLOCK13 ((uint32_t)0x00002000U) /* Port x Pin 13 Lock bit */ +#define GPIO_PLOCK_PLOCK14 ((uint32_t)0x00004000U) /* Port x Pin 14 Lock bit */ +#define GPIO_PLOCK_PLOCK15 ((uint32_t)0x00008000U) /* Port x Pin 15 Lock bit */ +#define GPIO_PLOCK_PLOCKK ((uint32_t)0x00010000U) /* Port x Lock key */ + +/******** Bit definition for GPIOx_AFRL register ********/ +#define GPIOx_AFRL_AFSEL7 ((uint32_t)0xF0000000) /* Bit[31:28] */ +#define GPIOx_AFRL_AFSEL7_0 ((uint32_t)0x10000000) /* Bit28*/ +#define GPIOx_AFRL_AFSEL7_1 ((uint32_t)0x20000000) /* Bit29*/ +#define GPIOx_AFRL_AFSEL7_2 ((uint32_t)0x40000000) /* Bit30*/ +#define GPIOx_AFRL_AFSEL7_3 ((uint32_t)0x80000000) /* Bit31*/ +#define GPIOx_AFRL_AFSEL6 ((uint32_t)0x0F000000) /* Bit[27:24] */ +#define GPIOx_AFRL_AFSEL6_0 ((uint32_t)0x01000000) /* Bit24*/ +#define GPIOx_AFRL_AFSEL6_1 ((uint32_t)0x02000000) /* Bit25*/ +#define GPIOx_AFRL_AFSEL6_2 ((uint32_t)0x04000000) /* Bit26*/ +#define GPIOx_AFRL_AFSEL6_3 ((uint32_t)0x08000000) /* Bit27*/ +#define GPIOx_AFRL_AFSEL5 ((uint32_t)0x00F00000) /* Bit[23:20] */ +#define GPIOx_AFRL_AFSEL5_0 ((uint32_t)0x00100000) /* Bit20*/ +#define GPIOx_AFRL_AFSEL5_1 ((uint32_t)0x00200000) /* Bit21*/ +#define GPIOx_AFRL_AFSEL5_2 ((uint32_t)0x00400000) /* Bit22*/ +#define GPIOx_AFRL_AFSEL5_3 ((uint32_t)0x00800000) /* Bit23*/ +#define GPIOx_AFRL_AFSEL4 ((uint32_t)0x000F0000) /* Bit[19:16] */ +#define GPIOx_AFRL_AFSEL4_0 ((uint32_t)0x00010000) /* Bit16*/ +#define GPIOx_AFRL_AFSEL4_1 ((uint32_t)0x00020000) /* Bit17*/ +#define GPIOx_AFRL_AFSEL4_2 ((uint32_t)0x00040000) /* Bit18*/ +#define GPIOx_AFRL_AFSEL4_3 ((uint32_t)0x00080000) /* Bit19*/ +#define GPIOx_AFRL_AFSEL3 ((uint32_t)0x0000F000) /* Bit[15:12] */ +#define GPIOx_AFRL_AFSEL3_0 ((uint32_t)0x00001000) /* Bit12*/ +#define GPIOx_AFRL_AFSEL3_1 ((uint32_t)0x00002000) /* Bit13*/ +#define GPIOx_AFRL_AFSEL3_2 ((uint32_t)0x00004000) /* Bit14*/ +#define GPIOx_AFRL_AFSEL3_3 ((uint32_t)0x00008000) /* Bit15*/ +#define GPIOx_AFRL_AFSEL2 ((uint32_t)0x00000F00) /* Bit[11:8] */ +#define GPIOx_AFRL_AFSEL2_0 ((uint32_t)0x00000100) /* Bit8*/ +#define GPIOx_AFRL_AFSEL2_1 ((uint32_t)0x00000200) /* Bit9*/ +#define GPIOx_AFRL_AFSEL2_2 ((uint32_t)0x00000400) /* Bit10*/ +#define GPIOx_AFRL_AFSEL2_3 ((uint32_t)0x00000800) /* Bit11*/ +#define GPIOx_AFRL_AFSEL1 ((uint32_t)0x000000F0) /* Bit[7:4] */ +#define GPIOx_AFRL_AFSEL1_0 ((uint32_t)0x00000010) /* Bit4*/ +#define GPIOx_AFRL_AFSEL1_1 ((uint32_t)0x00000020) /* Bit5*/ +#define GPIOx_AFRL_AFSEL1_2 ((uint32_t)0x00000040) /* Bit6*/ +#define GPIOx_AFRL_AFSEL1_3 ((uint32_t)0x00000080) /* Bit7*/ +#define GPIOx_AFRL_AFSEL0 ((uint32_t)0x0000000F) /* Bit[3:0] */ +#define GPIOx_AFRL_AFSEL0_0 ((uint32_t)0x00000001) /* Bit0*/ +#define GPIOx_AFRL_AFSEL0_1 ((uint32_t)0x00000002) /* Bit1*/ +#define GPIOx_AFRL_AFSEL0_2 ((uint32_t)0x00000004) /* Bit2*/ +#define GPIOx_AFRL_AFSEL0_3 ((uint32_t)0x00000008) /* Bit3*/ + +/******** Bit definition for GPIOx_AFRH register ********/ +#define GPIOx_AFRH_AFSEL15 ((uint32_t)0xF0000000) /* Bit[31:28] */ +#define GPIOx_AFRH_AFSEL15_0 ((uint32_t)0x10000000) /* Bit28*/ +#define GPIOx_AFRH_AFSEL15_1 ((uint32_t)0x20000000) /* Bit29*/ +#define GPIOx_AFRH_AFSEL15_2 ((uint32_t)0x40000000) /* Bit30*/ +#define GPIOx_AFRH_AFSEL15_3 ((uint32_t)0x80000000) /* Bit31*/ +#define GPIOx_AFRH_AFSEL14 ((uint32_t)0x0F000000) /* Bit[27:24] */ +#define GPIOx_AFRH_AFSEL14_0 ((uint32_t)0x01000000) /* Bit24*/ +#define GPIOx_AFRH_AFSEL14_1 ((uint32_t)0x02000000) /* Bit25*/ +#define GPIOx_AFRH_AFSEL14_2 ((uint32_t)0x04000000) /* Bit26*/ +#define GPIOx_AFRH_AFSEL14_3 ((uint32_t)0x08000000) /* Bit27*/ +#define GPIOx_AFRH_AFSEL13 ((uint32_t)0x00F00000) /* Bit[23:20] */ +#define GPIOx_AFRH_AFSEL13_0 ((uint32_t)0x00100000) /* Bit20*/ +#define GPIOx_AFRH_AFSEL13_1 ((uint32_t)0x00200000) /* Bit21*/ +#define GPIOx_AFRH_AFSEL13_2 ((uint32_t)0x00400000) /* Bit22*/ +#define GPIOx_AFRH_AFSEL13_3 ((uint32_t)0x00800000) /* Bit23*/ +#define GPIOx_AFRH_AFSEL12 ((uint32_t)0x000F0000) /* Bit[19:16] */ +#define GPIOx_AFRH_AFSEL12_0 ((uint32_t)0x00010000) /* Bit16*/ +#define GPIOx_AFRH_AFSEL12_1 ((uint32_t)0x00020000) /* Bit17*/ +#define GPIOx_AFRH_AFSEL12_2 ((uint32_t)0x00040000) /* Bit18*/ +#define GPIOx_AFRH_AFSEL12_3 ((uint32_t)0x00080000) /* Bit19*/ +#define GPIOx_AFRH_AFSEL11 ((uint32_t)0x0000F000) /* Bit[15:12] */ +#define GPIOx_AFRH_AFSEL11_0 ((uint32_t)0x00001000) /* Bit12*/ +#define GPIOx_AFRH_AFSEL11_1 ((uint32_t)0x00002000) /* Bit13*/ +#define GPIOx_AFRH_AFSEL11_2 ((uint32_t)0x00004000) /* Bit14*/ +#define GPIOx_AFRH_AFSEL11_3 ((uint32_t)0x00008000) /* Bit15*/ +#define GPIOx_AFRH_AFSEL10 ((uint32_t)0x00000F00) /* Bit[11:8] */ +#define GPIOx_AFRH_AFSEL10_0 ((uint32_t)0x00000100) /* Bit8*/ +#define GPIOx_AFRH_AFSEL10_1 ((uint32_t)0x00000200) /* Bit9*/ +#define GPIOx_AFRH_AFSEL10_2 ((uint32_t)0x00000400) /* Bit10*/ +#define GPIOx_AFRH_AFSEL10_3 ((uint32_t)0x00000800) /* Bit11*/ +#define GPIOx_AFRH_AFSEL9 ((uint32_t)0x000000F0) /* Bit[7:4] */ +#define GPIOx_AFRH_AFSEL9_0 ((uint32_t)0x00000010) /* Bit4*/ +#define GPIOx_AFRH_AFSEL9_1 ((uint32_t)0x00000020) /* Bit5*/ +#define GPIOx_AFRH_AFSEL9_2 ((uint32_t)0x00000040) /* Bit6*/ +#define GPIOx_AFRH_AFSEL9_3 ((uint32_t)0x00000080) /* Bit7*/ +#define GPIOx_AFRH_AFSEL8 ((uint32_t)0x0000000F) /* Bit[3:0] */ +#define GPIOx_AFRH_AFSEL8_0 ((uint32_t)0x00000001) /* Bit0*/ +#define GPIOx_AFRH_AFSEL8_1 ((uint32_t)0x00000002) /* Bit1*/ +#define GPIOx_AFRH_AFSEL8_2 ((uint32_t)0x00000004) /* Bit2*/ +#define GPIOx_AFRH_AFSEL8_3 ((uint32_t)0x00000008) /* Bit3*/ + + +#define GPIO_AFSEL_AF0 ((uint32_t)0x00000000U) /* Alternate function 0 */ +#define GPIO_AFSEL_AF1 ((uint32_t)0x00000001U) /* Alternate function 1 */ +#define GPIO_AFSEL_AF2 ((uint32_t)0x00000002U) /* Alternate function 2 */ +#define GPIO_AFSEL_AF3 ((uint32_t)0x00000003U) /* Alternate function 3 */ +#define GPIO_AFSEL_AF4 ((uint32_t)0x00000004U) /* Alternate function 4 */ +#define GPIO_AFSEL_AF5 ((uint32_t)0x00000005U) /* Alternate function 5 */ +#define GPIO_AFSEL_AF6 ((uint32_t)0x00000006U) /* Alternate function 6 */ +#define GPIO_AFSEL_AF7 ((uint32_t)0x00000007U) /* Alternate function 7 */ +#define GPIO_AFSEL_AF8 ((uint32_t)0x00000008U) /* Alternate function 8 */ +#define GPIO_AFSEL_AF9 ((uint32_t)0x00000009U) /* Alternate function 9 */ +#define GPIO_AFSEL_AF10 ((uint32_t)0x0000000AU) /* Alternate function 10 */ +#define GPIO_AFSEL_AF11 ((uint32_t)0x0000000BU) /* Alternate function 11 */ +#define GPIO_AFSEL_AF12 ((uint32_t)0x0000000CU) /* Alternate function 12 */ +#define GPIO_AFSEL_AF13 ((uint32_t)0x0000000DU) /* Alternate function 13 */ +#define GPIO_AFSEL_AF14 ((uint32_t)0x0000000EU) /* Alternate function 14 */ +#define GPIO_AFSEL_AF15 ((uint32_t)0x0000000FU) /* Alternate function 15 */ + +/** Bit definition for GPIO_PBC register **/ +#define GPIO_PBC_PBC0 ((uint16_t)0x0001U) /* Port x Pin 0 Reset bit 0 */ +#define GPIO_PBC_PBC1 ((uint16_t)0x0002U) /* Port x Pin 1 Reset bit 1 */ +#define GPIO_PBC_PBC2 ((uint16_t)0x0004U) /* Port x Pin 2 Reset bit 2 */ +#define GPIO_PBC_PBC3 ((uint16_t)0x0008U) /* Port x Pin 3 Reset bit 3 */ +#define GPIO_PBC_PBC4 ((uint16_t)0x0010U) /* Port x Pin 4 Reset bit 4 */ +#define GPIO_PBC_PBC5 ((uint16_t)0x0020U) /* Port x Pin 5 Reset bit 5 */ +#define GPIO_PBC_PBC6 ((uint16_t)0x0040U) /* Port x Pin 6 Reset bit 6 */ +#define GPIO_PBC_PBC7 ((uint16_t)0x0080U) /* Port x Pin 7 Reset bit 7 */ +#define GPIO_PBC_PBC8 ((uint16_t)0x0100U) /* Port x Pin 8 Reset bit 8 */ +#define GPIO_PBC_PBC9 ((uint16_t)0x0200U) /* Port x Pin 9 Reset bit 9 */ +#define GPIO_PBC_PBC10 ((uint16_t)0x0400U) /* Port x Pin 10 Reset bit 10 */ +#define GPIO_PBC_PBC11 ((uint16_t)0x0800U) /* Port x Pin 11 Reset bit 11 */ +#define GPIO_PBC_PBC12 ((uint16_t)0x1000U) /* Port x Pin 12 Reset bit 12 */ +#define GPIO_PBC_PBC13 ((uint16_t)0x2000U) /* Port x Pin 13 Reset bit 13 */ +#define GPIO_PBC_PBC14 ((uint16_t)0x4000U) /* Port x Pin 14 Reset bit 14 */ +#define GPIO_PBC_PBC15 ((uint16_t)0x8000U) /* Port x Pin 15 Reset bit 15 */ + +/** Bit definition for GPIO_DS register **/ +#define GPIO_DS_DS0 ((uint32_t)0x00000003U) /* Port x Pin 0 Drive bitS */ +#define GPIO_DS_DS0_0 ((uint32_t)0x00000001U) /* Port x Pin 0 Drive bit 0 */ +#define GPIO_DS_DS0_1 ((uint32_t)0x00000002U) /* Port x Pin 0 Drive bit 1 */ + +#define GPIO_DS_DS1 ((uint32_t)0x0000000CU) /* Port x Pin 1 Drive bitS */ +#define GPIO_DS_DS1_0 ((uint32_t)0x00000004U) /* Port x Pin 1 Drive bit 0 */ +#define GPIO_DS_DS1_1 ((uint32_t)0x00000008U) /* Port x Pin 1 Drive bit 1 */ + +#define GPIO_DS_DS2 ((uint32_t)0x00000030U) /* Port x Pin 2 Drive bitS */ +#define GPIO_DS_DS2_0 ((uint32_t)0x00000010U) /* Port x Pin 2 Drive bit 0 */ +#define GPIO_DS_DS2_1 ((uint32_t)0x00000020U) /* Port x Pin 2 Drive bit 1 */ + +#define GPIO_DS_DS3 ((uint32_t)0x000000C0U) /* Port x Pin 3 Drive bitS */ +#define GPIO_DS_DS3_0 ((uint32_t)0x00000040U) /* Port x Pin 3 Drive bit 0 */ +#define GPIO_DS_DS3_1 ((uint32_t)0x00000080U) /* Port x Pin 3 Drive bit 1 */ + +#define GPIO_DS_DS4 ((uint32_t)0x00000300U) /* Port x Pin 4 Drive bitS */ +#define GPIO_DS_DS4_0 ((uint32_t)0x00000100U) /* Port x Pin 4 Drive bit 0 */ +#define GPIO_DS_DS4_1 ((uint32_t)0x00000200U) /* Port x Pin 4 Drive bit 1 */ + +#define GPIO_DS_DS5 ((uint32_t)0x00000C00U) /* Port x Pin 5 Drive bitS */ +#define GPIO_DS_DS5_0 ((uint32_t)0x00000400U) /* Port x Pin 5 Drive bit 0 */ +#define GPIO_DS_DS5_1 ((uint32_t)0x00000800U) /* Port x Pin 5 Drive bit 1 */ + +#define GPIO_DS_DS6 ((uint32_t)0x00003000U) /* Port x Pin 6 Drive bitS */ +#define GPIO_DS_DS6_0 ((uint32_t)0x00001000U) /* Port x Pin 6 Drive bit 0 */ +#define GPIO_DS_DS6_1 ((uint32_t)0x00002000U) /* Port x Pin 6 Drive bit 1 */ + +#define GPIO_DS_DS7 ((uint32_t)0x0000C000U) /* Port x Pin 7 Drive bitS */ +#define GPIO_DS_DS7_0 ((uint32_t)0x00004000U) /* Port x Pin 7 Drive bit 0 */ +#define GPIO_DS_DS7_1 ((uint32_t)0x00008000U) /* Port x Pin 7 Drive bit 1 */ + +#define GPIO_DS_DS8 ((uint32_t)0x00030000U) /* Port x Pin 8 Drive bitS */ +#define GPIO_DS_DS8_0 ((uint32_t)0x00010000U) /* Port x Pin 8 Drive bit 0 */ +#define GPIO_DS_DS8_1 ((uint32_t)0x00020000U) /* Port x Pin 8 Drive bit 1 */ + +#define GPIO_DS_DS9 ((uint32_t)0x000C0000U) /* Port x Pin 9 Drive bitS */ +#define GPIO_DS_DS9_0 ((uint32_t)0x00040000U) /* Port x Pin 9 Drive bit 0 */ +#define GPIO_DS_DS9_1 ((uint32_t)0x00080000U) /* Port x Pin 9 Drive bit 1 */ + +#define GPIO_DS_DS10 ((uint32_t)0x00300000U) /* Port x Pin 10 Drive bitS */ +#define GPIO_DS_DS10_0 ((uint32_t)0x00100000U) /* Port x Pin 10 Drive bit 0 */ +#define GPIO_DS_DS10_1 ((uint32_t)0x00200000U) /* Port x Pin 10 Drive bit 1 */ + +#define GPIO_DS_DS11 ((uint32_t)0x00C00000U) /* Port x Pin 11 Drive bitS */ +#define GPIO_DS_DS11_0 ((uint32_t)0x00400000U) /* Port x Pin 11 Drive bit 0 */ +#define GPIO_DS_DS11_1 ((uint32_t)0x00800000U) /* Port x Pin 11 Drive bit 1 */ + +#define GPIO_DS_DS12 ((uint32_t)0x03000000U) /* Port x Pin 12 Drive bitS */ +#define GPIO_DS_DS12_0 ((uint32_t)0x01000000U) /* Port x Pin 12 Drive bit 0 */ +#define GPIO_DS_DS12_1 ((uint32_t)0x02000000U) /* Port x Pin 12 Drive bit 1 */ + +#define GPIO_DS_DS13 ((uint32_t)0x0C000000U) /* Port x Pin 13 Drive bitS */ +#define GPIO_DS_DS13_0 ((uint32_t)0x04000000U) /* Port x Pin 13 Drive bit 0 */ +#define GPIO_DS_DS13_1 ((uint32_t)0x08000000U) /* Port x Pin 13 Drive bit 1 */ + +#define GPIO_DS_DS14 ((uint32_t)0x30000000U) /* Port x Pin 14 Drive bitS */ +#define GPIO_DS_DS14_0 ((uint32_t)0x10000000U) /* Port x Pin 14 Drive bit 0 */ +#define GPIO_DS_DS14_1 ((uint32_t)0x20000000U) /* Port x Pin 14 Drive bit 1 */ + +#define GPIO_DS_DS15 ((uint32_t)0xC0000000U) /* Port x Pin 15 Drive bitS */ +#define GPIO_DS_DS15_0 ((uint32_t)0x40000000U) /* Port x Pin 15 Drive bit 0 */ +#define GPIO_DS_DS15_1 ((uint32_t)0x80000000U) /* Port x Pin 15 Drive bit 1 */ + +#define GPIO_DS_2mA ((uint32_t)0x00000000U) /* Drive strength is 2mA */ +#define GPIO_DS_4mA ((uint32_t)0x00000002U) /* Drive strength is 4mA */ +#define GPIO_DS_8mA ((uint32_t)0x00000001U) /* Drive strength is 8mA */ +#define GPIO_DS_12mA ((uint32_t)0x00000003U) /* Drive strength is 12mA */ + + + +/******** Bit definition for AFIO_RMP_CFG register ********/ +#define AFIO_RMP_CFG_EXTI_AFLTBYPS ((uint32_t)0x40000000) /* Bit[30] */ +#define AFIO_RMP_CFG_SIP_SDRAM_SEL ((uint32_t)0x20000000) /* Bit[29] */ +#define AFIO_RMP_CFG_SPI4_SEL ((uint32_t)0x10000000) /* Bit[28] */ +#define AFIO_RMP_CFG_SPI3_SEL ((uint32_t)0x08000000) /* Bit[27] */ +#define AFIO_RMP_CFG_SPI2_SEL ((uint32_t)0x04000000) /* Bit[26] */ +#define AFIO_RMP_CFG_SPI1_SEL ((uint32_t)0x02000000) /* Bit[25] */ +#define AFIO_RMP_CFG_SDMMC1_CLKFB ((uint32_t)0x01000000) /* Bit[24] */ +#define AFIO_RMP_CFG_SDMMC2_CLKFB ((uint32_t)0x00800000) /* Bit[23] */ +#define AFIO_RMP_CFG_I2S_FDUP ((uint32_t)0x00600000) /* Bit[22:21] */ +#define AFIO_RMP_CFG_I2S_FDUP_0 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_RMP_CFG_I2S_FDUP_1 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_RMP_CFG_XSPI2_EDN ((uint32_t)0x00080000) /* Bit[19] */ +#define AFIO_RMP_CFG_XSPI1_EDN ((uint32_t)0x00040000) /* Bit[18] */ +#define AFIO_RMP_CFG_FEMCSEL ((uint32_t)0x00020000) /* Bit[17] */ +#define AFIO_RMP_CFG_FEMC_NOBYTE ((uint32_t)0x00010000) /* Bit[16] */ +#define AFIO_RMP_CFG_ETH2_PHY ((uint32_t)0x00008000) /* Bit[15] */ +#define AFIO_RMP_CFG_ETH1_PHY ((uint32_t)0x00006000) /* Bit[14:13] */ +#define AFIO_RMP_CFG_ETH1_PHY_0 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_RMP_CFG_ETH1_PHY_1 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_RMP_CFG_SPI7_NSS ((uint32_t)0x00001000) /* Bit[12] */ +#define AFIO_RMP_CFG_SPI6_NSS ((uint32_t)0x00000800) /* Bit[11] */ +#define AFIO_RMP_CFG_SPI5_NSS ((uint32_t)0x00000400) /* Bit[10] */ +#define AFIO_RMP_CFG_SPI4_NSS ((uint32_t)0x00000200) /* Bit[9] */ +#define AFIO_RMP_CFG_SPI3_NSS ((uint32_t)0x00000100) /* Bit[8] */ +#define AFIO_RMP_CFG_SPI2_NSS ((uint32_t)0x00000080) /* Bit[7] */ +#define AFIO_RMP_CFG_SPI1_NSS ((uint32_t)0x00000040) /* Bit[6] */ +#define AFIO_RMP_CFG_SIP_FLASHSEL ((uint32_t)0x00000007) /* Bit[2:0] */ +#define AFIO_RMP_CFG_SIP_FLASHSEL_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_RMP_CFG_SIP_FLASHSEL_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_RMP_CFG_SIP_FLASHSEL_2 ((uint32_t)0x00000004) /* Bit2*/ + +/******** Bit definition for AFIO_FILTER_CFG register ********/ +#define AFIO_FILTER_CFG_IOFLTCFG ((uint32_t)0x0000007F) /* Bit[6:0] */ +#define AFIO_FILTER_CFG_IOFLTCFG_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_FILTER_CFG_IOFLTCFG_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_FILTER_CFG_IOFLTCFG_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_FILTER_CFG_IOFLTCFG_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_FILTER_CFG_IOFLTCFG_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_FILTER_CFG_IOFLTCFG_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_FILTER_CFG_IOFLTCFG_6 ((uint32_t)0x00000040) /* Bit6*/ + +/** Bit definition for AFIO_XSPI1_NON0 register **/ +#define AFIO_XSPI1_NON0_XSPI1_DEC_NONCE ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ +/** Bit definition for AFIO_XSPI1_NON1 register **/ +#define AFIO_XSPI1_NON1_XSPI1_DEC_NONCE ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ +/** Bit definition for AFIO_XSPI1_NON2 register **/ +#define AFIO_XSPI1_NON2_XSPI1_DEC_NONCE ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ + +/** Bit definition for AFIO_ADCRMP_CFG register **/ +#define AFIO_ADCRMP_CFG_ADC1_EXTIRISEL ((uint32_t)0x00F00000) /* Bit[23:20] */ +#define AFIO_ADCRMP_CFG_ADC1_EXTIRISEL_0 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_ADCRMP_CFG_ADC1_EXTIRISEL_1 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_ADCRMP_CFG_ADC1_EXTIRISEL_2 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_ADCRMP_CFG_ADC1_EXTIRISEL_3 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_ADCRMP_CFG_ADC1_EXTIRRSEL ((uint32_t)0x000F0000) /* Bit[19:16] */ +#define AFIO_ADCRMP_CFG_ADC1_EXTIRRSEL_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_ADCRMP_CFG_ADC1_EXTIRRSEL_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_ADCRMP_CFG_ADC1_EXTIRRSEL_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_ADCRMP_CFG_ADC1_EXTIRRSEL_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_ADCRMP_CFG_ADC2_EXTIRISEL ((uint32_t)0x0000F000) /* Bit[15:12] */ +#define AFIO_ADCRMP_CFG_ADC2_EXTIRISEL_0 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_ADCRMP_CFG_ADC2_EXTIRISEL_1 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_ADCRMP_CFG_ADC2_EXTIRISEL_2 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_ADCRMP_CFG_ADC2_EXTIRISEL_3 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_ADCRMP_CFG_ADC2_EXTIRRSEL ((uint32_t)0x00000F00) /* Bit[11:8] */ +#define AFIO_ADCRMP_CFG_ADC2_EXTIRRSEL_0 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_ADCRMP_CFG_ADC2_EXTIRRSEL_1 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_ADCRMP_CFG_ADC2_EXTIRRSEL_2 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_ADCRMP_CFG_ADC2_EXTIRRSEL_3 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_ADCRMP_CFG_ADC3_EXTIRISEL ((uint32_t)0x000000F0) /* Bit[7:4] */ +#define AFIO_ADCRMP_CFG_ADC3_EXTIRISEL_0 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_ADCRMP_CFG_ADC3_EXTIRISEL_1 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_ADCRMP_CFG_ADC3_EXTIRISEL_2 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_ADCRMP_CFG_ADC3_EXTIRISEL_3 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_ADCRMP_CFG_ADC3_EXTIRRSEL ((uint32_t)0x0000000F) /* Bit[3:0] */ +#define AFIO_ADCRMP_CFG_ADC3_EXTIRRSEL_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_ADCRMP_CFG_ADC3_EXTIRRSEL_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_ADCRMP_CFG_ADC3_EXTIRRSEL_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_ADCRMP_CFG_ADC3_EXTIRRSEL_3 ((uint32_t)0x00000008) /* Bit3*/ + +/******** Bit definition for AFIO_EXTI_CFG1 register ********/ +#define AFIO_EXTI_CFG1_EXTI3 ((uint32_t)0xFF000000) /* Bit[31:24] */ +#define AFIO_EXTI_CFG1_EXTI3_0 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_EXTI_CFG1_EXTI3_1 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_EXTI_CFG1_EXTI3_2 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_EXTI_CFG1_EXTI3_3 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_EXTI_CFG1_EXTI3_4 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_EXTI_CFG1_EXTI3_5 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_EXTI_CFG1_EXTI3_6 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_EXTI_CFG1_EXTI3_7 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_EXTI_CFG1_EXTI2 ((uint32_t)0x00FF0000) /* Bit[23:16] */ +#define AFIO_EXTI_CFG1_EXTI2_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_EXTI_CFG1_EXTI2_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_EXTI_CFG1_EXTI2_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_EXTI_CFG1_EXTI2_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_EXTI_CFG1_EXTI2_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_EXTI_CFG1_EXTI2_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_EXTI_CFG1_EXTI2_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_EXTI_CFG1_EXTI2_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_EXTI_CFG1_EXTI1 ((uint32_t)0x0000FF00) /* Bit[15:8] */ +#define AFIO_EXTI_CFG1_EXTI1_0 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_EXTI_CFG1_EXTI1_1 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_EXTI_CFG1_EXTI1_2 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_EXTI_CFG1_EXTI1_3 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_EXTI_CFG1_EXTI1_4 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_EXTI_CFG1_EXTI1_5 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_EXTI_CFG1_EXTI1_6 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_EXTI_CFG1_EXTI1_7 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_EXTI_CFG1_EXTI0 ((uint32_t)0x000000FF) /* Bit[7:0] */ +#define AFIO_EXTI_CFG1_EXTI0_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_EXTI_CFG1_EXTI0_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_EXTI_CFG1_EXTI0_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_EXTI_CFG1_EXTI0_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_EXTI_CFG1_EXTI0_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_EXTI_CFG1_EXTI0_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_EXTI_CFG1_EXTI0_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_EXTI_CFG1_EXTI0_7 ((uint32_t)0x00000080) /* Bit7*/ + +/******** Bit definition for AFIO_EXTI_CFG2 register ********/ +#define AFIO_EXTI_CFG2_EXTI7 ((uint32_t)0xFF000000) /* Bit[31:24] */ +#define AFIO_EXTI_CFG2_EXTI7_0 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_EXTI_CFG2_EXTI7_1 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_EXTI_CFG2_EXTI7_2 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_EXTI_CFG2_EXTI7_3 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_EXTI_CFG2_EXTI7_4 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_EXTI_CFG2_EXTI7_5 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_EXTI_CFG2_EXTI7_6 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_EXTI_CFG2_EXTI7_7 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_EXTI_CFG2_EXTI6 ((uint32_t)0x00FF0000) /* Bit[23:16] */ +#define AFIO_EXTI_CFG2_EXTI6_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_EXTI_CFG2_EXTI6_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_EXTI_CFG2_EXTI6_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_EXTI_CFG2_EXTI6_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_EXTI_CFG2_EXTI6_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_EXTI_CFG2_EXTI6_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_EXTI_CFG2_EXTI6_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_EXTI_CFG2_EXTI6_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_EXTI_CFG2_EXTI5 ((uint32_t)0x0000FF00) /* Bit[15:8] */ +#define AFIO_EXTI_CFG2_EXTI5_0 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_EXTI_CFG2_EXTI5_1 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_EXTI_CFG2_EXTI5_2 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_EXTI_CFG2_EXTI5_3 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_EXTI_CFG2_EXTI5_4 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_EXTI_CFG2_EXTI5_5 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_EXTI_CFG2_EXTI5_6 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_EXTI_CFG2_EXTI5_7 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_EXTI_CFG2_EXTI4 ((uint32_t)0x000000FF) /* Bit[7:0] */ +#define AFIO_EXTI_CFG2_EXTI4_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_EXTI_CFG2_EXTI4_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_EXTI_CFG2_EXTI4_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_EXTI_CFG2_EXTI4_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_EXTI_CFG2_EXTI4_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_EXTI_CFG2_EXTI4_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_EXTI_CFG2_EXTI4_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_EXTI_CFG2_EXTI4_7 ((uint32_t)0x00000080) /* Bit7*/ + +/******** Bit definition for AFIO_EXTI_CFG3 register ********/ +#define AFIO_EXTI_CFG3_EXTI11 ((uint32_t)0xFF000000) /* Bit[31:24] */ +#define AFIO_EXTI_CFG3_EXTI11_0 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_EXTI_CFG3_EXTI11_1 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_EXTI_CFG3_EXTI11_2 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_EXTI_CFG3_EXTI11_3 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_EXTI_CFG3_EXTI11_4 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_EXTI_CFG3_EXTI11_5 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_EXTI_CFG3_EXTI11_6 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_EXTI_CFG3_EXTI11_7 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_EXTI_CFG3_EXTI10 ((uint32_t)0x00FF0000) /* Bit[23:16] */ +#define AFIO_EXTI_CFG3_EXTI10_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_EXTI_CFG3_EXTI10_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_EXTI_CFG3_EXTI10_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_EXTI_CFG3_EXTI10_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_EXTI_CFG3_EXTI10_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_EXTI_CFG3_EXTI10_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_EXTI_CFG3_EXTI10_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_EXTI_CFG3_EXTI10_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_EXTI_CFG3_EXTI9 ((uint32_t)0x0000FF00) /* Bit[15:8] */ +#define AFIO_EXTI_CFG3_EXTI9_0 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_EXTI_CFG3_EXTI9_1 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_EXTI_CFG3_EXTI9_2 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_EXTI_CFG3_EXTI9_3 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_EXTI_CFG3_EXTI9_4 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_EXTI_CFG3_EXTI9_5 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_EXTI_CFG3_EXTI9_6 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_EXTI_CFG3_EXTI9_7 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_EXTI_CFG3_EXTI8 ((uint32_t)0x000000FF) /* Bit[7:0] */ +#define AFIO_EXTI_CFG3_EXTI8_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_EXTI_CFG3_EXTI8_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_EXTI_CFG3_EXTI8_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_EXTI_CFG3_EXTI8_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_EXTI_CFG3_EXTI8_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_EXTI_CFG3_EXTI8_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_EXTI_CFG3_EXTI8_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_EXTI_CFG3_EXTI8_7 ((uint32_t)0x00000080) /* Bit7*/ + +/******** Bit definition for AFIO_EXTI_CFG4 register ********/ +#define AFIO_EXTI_CFG4_EXTI15 ((uint32_t)0xFF000000) /* Bit[31:24] */ +#define AFIO_EXTI_CFG4_EXTI15_0 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_EXTI_CFG4_EXTI15_1 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_EXTI_CFG4_EXTI15_2 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_EXTI_CFG4_EXTI15_3 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_EXTI_CFG4_EXTI15_4 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_EXTI_CFG4_EXTI15_5 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_EXTI_CFG4_EXTI15_6 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_EXTI_CFG4_EXTI15_7 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_EXTI_CFG4_EXTI14 ((uint32_t)0x00FF0000) /* Bit[23:16] */ +#define AFIO_EXTI_CFG4_EXTI14_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_EXTI_CFG4_EXTI14_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_EXTI_CFG4_EXTI14_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_EXTI_CFG4_EXTI14_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_EXTI_CFG4_EXTI14_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_EXTI_CFG4_EXTI14_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_EXTI_CFG4_EXTI14_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_EXTI_CFG4_EXTI14_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_EXTI_CFG4_EXTI13 ((uint32_t)0x0000FF00) /* Bit[15:8] */ +#define AFIO_EXTI_CFG4_EXTI13_0 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_EXTI_CFG4_EXTI13_1 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_EXTI_CFG4_EXTI13_2 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_EXTI_CFG4_EXTI13_3 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_EXTI_CFG4_EXTI13_4 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_EXTI_CFG4_EXTI13_5 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_EXTI_CFG4_EXTI13_6 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_EXTI_CFG4_EXTI13_7 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_EXTI_CFG4_EXTI12 ((uint32_t)0x000000FF) /* Bit[7:0] */ +#define AFIO_EXTI_CFG4_EXTI12_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_EXTI_CFG4_EXTI12_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_EXTI_CFG4_EXTI12_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_EXTI_CFG4_EXTI12_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_EXTI_CFG4_EXTI12_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_EXTI_CFG4_EXTI12_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_EXTI_CFG4_EXTI12_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_EXTI_CFG4_EXTI12_7 ((uint32_t)0x00000080) /* Bit7*/ + +/******** Bit definition for AFIO_TOL5V_CFG1 register ********/ +#define AFIO_TOL5V_CFG1_PA7TOLENN ((uint32_t)0x00000200) /* Bit[9] */ +#define AFIO_TOL5V_CFG1_PA6TOLENN ((uint32_t)0x00000100) /* Bit[8] */ +#define AFIO_TOL5V_CFG1_PA5TOLENN ((uint32_t)0x00000080) /* Bit[7] */ +#define AFIO_TOL5V_CFG1_PA4TOLENN ((uint32_t)0x00000040) /* Bit[6] */ +#define AFIO_TOL5V_CFG1_PA3TOLENN ((uint32_t)0x00000020) /* Bit[5] */ +#define AFIO_TOL5V_CFG1_PA2TOLENN ((uint32_t)0x00000010) /* Bit[4] */ +#define AFIO_TOL5V_CFG1_PA1_C_TOLENN ((uint32_t)0x00000008) /* Bit[3] */ +#define AFIO_TOL5V_CFG1_PA1TOLENN ((uint32_t)0x00000004) /* Bit[2] */ +#define AFIO_TOL5V_CFG1_PA0_C_TOLENN ((uint32_t)0x00000002) /* Bit[1] */ +#define AFIO_TOL5V_CFG1_PA0TOLENN ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for AFIO_TOL5V_CFG2 register ********/ +#define AFIO_TOL5V_CFG2_PB1TOLENN ((uint32_t)0x00000002) /* Bit[1] */ +#define AFIO_TOL5V_CFG2_PB0TOLENN ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for AFIO_TOL5V_CFG3 register ********/ +#define AFIO_TOL5V_CFG3_PC13TOLENN ((uint32_t)0x00000400) /* Bit[10] */ +#define AFIO_TOL5V_CFG3_PC8TOLENN ((uint32_t)0x00000200) /* Bit[9] */ +#define AFIO_TOL5V_CFG3_PC6TOLENN ((uint32_t)0x00000100) /* Bit[8] */ +#define AFIO_TOL5V_CFG3_PC5TOLENN ((uint32_t)0x00000080) /* Bit[7] */ +#define AFIO_TOL5V_CFG3_PC4TOLENN ((uint32_t)0x00000040) /* Bit[6] */ +#define AFIO_TOL5V_CFG3_PC3_C_TOLENN ((uint32_t)0x00000020) /* Bit[5] */ +#define AFIO_TOL5V_CFG3_PC3TOLENN ((uint32_t)0x00000010) /* Bit[4] */ +#define AFIO_TOL5V_CFG3_PC2_C_TOLENN ((uint32_t)0x00000008) /* Bit[3] */ +#define AFIO_TOL5V_CFG3_PC2TOLENN ((uint32_t)0x00000004) /* Bit[2] */ +#define AFIO_TOL5V_CFG3_PC1TOLENN ((uint32_t)0x00000002) /* Bit[1] */ +#define AFIO_TOL5V_CFG3_PC0TOLENN ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for AFIO_SHRT1_FALT_CFG register ********/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT6 ((uint32_t)0x00F00000) /* Bit[23:20] */ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT6_0 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT6_1 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT6_2 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT6_3 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT5 ((uint32_t)0x000F0000) /* Bit[19:16] */ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT5_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT5_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT5_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT5_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT4 ((uint32_t)0x0000F000) /* Bit[15:12] */ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT4_0 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT4_1 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT4_2 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT4_3 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT3 ((uint32_t)0x00000F00) /* Bit[11:8] */ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT3_0 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT3_1 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT3_2 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT3_3 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT2 ((uint32_t)0x000000F0) /* Bit[7:4] */ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT2_0 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT2_1 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT2_2 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT2_3 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT1 ((uint32_t)0x0000000F) /* Bit[3:0] */ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT1_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT1_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT1_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SHRT1_FALT_CFG_SHRT_FALT1_3 ((uint32_t)0x00000008) /* Bit3*/ + +/******** Bit definition for AFIO_SHRT2_FALT_CFG register ********/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT6 ((uint32_t)0x00F00000) /* Bit[23:20] */ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT6_0 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT6_1 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT6_2 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT6_3 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT5 ((uint32_t)0x000F0000) /* Bit[19:16] */ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT5_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT5_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT5_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT5_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT4 ((uint32_t)0x0000F000) /* Bit[15:12] */ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT4_0 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT4_1 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT4_2 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT4_3 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT3 ((uint32_t)0x00000F00) /* Bit[11:8] */ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT3_0 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT3_1 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT3_2 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT3_3 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT2 ((uint32_t)0x000000F0) /* Bit[7:4] */ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT2_0 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT2_1 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT2_2 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT2_3 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT1 ((uint32_t)0x0000000F) /* Bit[3:0] */ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT1_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT1_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT1_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SHRT2_FALT_CFG_SHRT_FALT1_3 ((uint32_t)0x00000008) /* Bit3*/ + +/******** Bit definition for AFIO_TOL5V_CFG4 register ********/ +#define AFIO_TOL5V_CFG4_PF14TOLENN ((uint32_t)0x00000800) /* Bit[11] */ +#define AFIO_TOL5V_CFG4_PF13TOLENN ((uint32_t)0x00000400) /* Bit[10] */ +#define AFIO_TOL5V_CFG4_PF12TOLENN ((uint32_t)0x00000200) /* Bit[9] */ +#define AFIO_TOL5V_CFG4_PF11TOLENN ((uint32_t)0x00000100) /* Bit[8] */ +#define AFIO_TOL5V_CFG4_PF10TOLENN ((uint32_t)0x00000080) /* Bit[7] */ +#define AFIO_TOL5V_CFG4_PF9TOLENN ((uint32_t)0x00000040) /* Bit[6] */ +#define AFIO_TOL5V_CFG4_PF8TOLENN ((uint32_t)0x00000020) /* Bit[5] */ +#define AFIO_TOL5V_CFG4_PF7TOLENN ((uint32_t)0x00000010) /* Bit[4] */ +#define AFIO_TOL5V_CFG4_PF6TOLENN ((uint32_t)0x00000008) /* Bit[3] */ +#define AFIO_TOL5V_CFG4_PF5TOLENN ((uint32_t)0x00000004) /* Bit[2] */ +#define AFIO_TOL5V_CFG4_PF4TOLENN ((uint32_t)0x00000002) /* Bit[1] */ +#define AFIO_TOL5V_CFG4_PF3TOLENN ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for AFIO_TOL5V_CFG5 register ********/ +#define AFIO_TOL5V_CFG5_PH5TOLENN ((uint32_t)0x00000008) /* Bit[3] */ +#define AFIO_TOL5V_CFG5_PH4TOLENN ((uint32_t)0x00000004) /* Bit[2] */ +#define AFIO_TOL5V_CFG5_PH3TOLENN ((uint32_t)0x00000002) /* Bit[1] */ +#define AFIO_TOL5V_CFG5_PH2TOLENN ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for AFIO_TOL5V_CFG6 register ********/ +#define AFIO_TOL5V_CFG6_PI15TOLENN ((uint32_t)0x00000002) /* Bit[1] */ +#define AFIO_TOL5V_CFG6_PI8TOLENN ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for AFIO_TOL5V_CFG7 register ********/ +#define AFIO_TOL5V_CFG7_PJ7TOLENN ((uint32_t)0x00000020) /* Bit[5] */ +#define AFIO_TOL5V_CFG7_PJ6TOLENN ((uint32_t)0x00000010) /* Bit[4] */ +#define AFIO_TOL5V_CFG7_PJ5TOLENN ((uint32_t)0x00000008) /* Bit[3] */ +#define AFIO_TOL5V_CFG7_PJ4TOLENN ((uint32_t)0x00000004) /* Bit[2] */ +#define AFIO_TOL5V_CFG7_PJ3TOLENN ((uint32_t)0x00000002) /* Bit[1] */ +#define AFIO_TOL5V_CFG7_PJ0TOLENN ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for AFIO_EFT_CFG1 register ********/ +#define AFIO_EFT_CFG1_PB_EFTEN ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_EFT_CFG1_PB_EFTEN_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_EFT_CFG1_PB_EFTEN_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_EFT_CFG1_PB_EFTEN_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_EFT_CFG1_PB_EFTEN_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_EFT_CFG1_PB_EFTEN_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_EFT_CFG1_PB_EFTEN_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_EFT_CFG1_PB_EFTEN_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_EFT_CFG1_PB_EFTEN_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_EFT_CFG1_PB_EFTEN_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_EFT_CFG1_PB_EFTEN_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_EFT_CFG1_PB_EFTEN_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_EFT_CFG1_PB_EFTEN_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_EFT_CFG1_PB_EFTEN_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_EFT_CFG1_PB_EFTEN_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_EFT_CFG1_PB_EFTEN_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_EFT_CFG1_PB_EFTEN_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_EFT_CFG1_PA_EFTEN ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_EFT_CFG1_PA_EFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_EFT_CFG1_PA_EFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_EFT_CFG1_PA_EFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_EFT_CFG1_PA_EFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_EFT_CFG1_PA_EFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_EFT_CFG1_PA_EFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_EFT_CFG1_PA_EFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_EFT_CFG1_PA_EFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_EFT_CFG1_PA_EFTEN_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_EFT_CFG1_PA_EFTEN_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_EFT_CFG1_PA_EFTEN_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_EFT_CFG1_PA_EFTEN_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_EFT_CFG1_PA_EFTEN_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_EFT_CFG1_PA_EFTEN_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_EFT_CFG1_PA_EFTEN_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_EFT_CFG1_PA_EFTEN_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_EFT_CFG2 register ********/ +#define AFIO_EFT_CFG2_PD_EFTEN ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_EFT_CFG2_PD_EFTEN_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_EFT_CFG2_PD_EFTEN_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_EFT_CFG2_PD_EFTEN_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_EFT_CFG2_PD_EFTEN_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_EFT_CFG2_PD_EFTEN_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_EFT_CFG2_PD_EFTEN_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_EFT_CFG2_PD_EFTEN_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_EFT_CFG2_PD_EFTEN_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_EFT_CFG2_PD_EFTEN_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_EFT_CFG2_PD_EFTEN_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_EFT_CFG2_PD_EFTEN_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_EFT_CFG2_PD_EFTEN_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_EFT_CFG2_PD_EFTEN_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_EFT_CFG2_PD_EFTEN_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_EFT_CFG2_PD_EFTEN_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_EFT_CFG2_PD_EFTEN_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_EFT_CFG2_PC_EFTEN ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_EFT_CFG2_PC_EFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_EFT_CFG2_PC_EFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_EFT_CFG2_PC_EFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_EFT_CFG2_PC_EFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_EFT_CFG2_PC_EFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_EFT_CFG2_PC_EFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_EFT_CFG2_PC_EFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_EFT_CFG2_PC_EFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_EFT_CFG2_PC_EFTEN_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_EFT_CFG2_PC_EFTEN_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_EFT_CFG2_PC_EFTEN_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_EFT_CFG2_PC_EFTEN_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_EFT_CFG2_PC_EFTEN_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_EFT_CFG2_PC_EFTEN_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_EFT_CFG2_PC_EFTEN_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_EFT_CFG2_PC_EFTEN_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_EFT_CFG3 register ********/ +#define AFIO_EFT_CFG3_PF_EFTEN ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_EFT_CFG3_PF_EFTEN_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_EFT_CFG3_PF_EFTEN_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_EFT_CFG3_PF_EFTEN_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_EFT_CFG3_PF_EFTEN_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_EFT_CFG3_PF_EFTEN_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_EFT_CFG3_PF_EFTEN_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_EFT_CFG3_PF_EFTEN_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_EFT_CFG3_PF_EFTEN_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_EFT_CFG3_PF_EFTEN_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_EFT_CFG3_PF_EFTEN_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_EFT_CFG3_PF_EFTEN_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_EFT_CFG3_PF_EFTEN_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_EFT_CFG3_PF_EFTEN_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_EFT_CFG3_PF_EFTEN_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_EFT_CFG3_PF_EFTEN_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_EFT_CFG3_PF_EFTEN_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_EFT_CFG3_PE_EFTEN ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_EFT_CFG3_PE_EFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_EFT_CFG3_PE_EFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_EFT_CFG3_PE_EFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_EFT_CFG3_PE_EFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_EFT_CFG3_PE_EFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_EFT_CFG3_PE_EFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_EFT_CFG3_PE_EFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_EFT_CFG3_PE_EFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_EFT_CFG3_PE_EFTEN_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_EFT_CFG3_PE_EFTEN_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_EFT_CFG3_PE_EFTEN_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_EFT_CFG3_PE_EFTEN_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_EFT_CFG3_PE_EFTEN_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_EFT_CFG3_PE_EFTEN_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_EFT_CFG3_PE_EFTEN_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_EFT_CFG3_PE_EFTEN_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_EFT_CFG4 register ********/ +#define AFIO_EFT_CFG4_PH_EFTEN ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_EFT_CFG4_PH_EFTEN_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_EFT_CFG4_PH_EFTEN_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_EFT_CFG4_PH_EFTEN_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_EFT_CFG4_PH_EFTEN_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_EFT_CFG4_PH_EFTEN_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_EFT_CFG4_PH_EFTEN_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_EFT_CFG4_PH_EFTEN_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_EFT_CFG4_PH_EFTEN_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_EFT_CFG4_PH_EFTEN_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_EFT_CFG4_PH_EFTEN_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_EFT_CFG4_PH_EFTEN_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_EFT_CFG4_PH_EFTEN_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_EFT_CFG4_PH_EFTEN_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_EFT_CFG4_PH_EFTEN_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_EFT_CFG4_PH_EFTEN_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_EFT_CFG4_PH_EFTEN_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_EFT_CFG4_PG_EFTEN ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_EFT_CFG4_PG_EFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_EFT_CFG4_PG_EFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_EFT_CFG4_PG_EFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_EFT_CFG4_PG_EFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_EFT_CFG4_PG_EFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_EFT_CFG4_PG_EFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_EFT_CFG4_PG_EFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_EFT_CFG4_PG_EFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_EFT_CFG4_PG_EFTEN_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_EFT_CFG4_PG_EFTEN_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_EFT_CFG4_PG_EFTEN_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_EFT_CFG4_PG_EFTEN_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_EFT_CFG4_PG_EFTEN_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_EFT_CFG4_PG_EFTEN_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_EFT_CFG4_PG_EFTEN_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_EFT_CFG4_PG_EFTEN_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_EFT_CFG5 register ********/ +#define AFIO_EFT_CFG5_PI_EFTEN ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_EFT_CFG5_PI_EFTEN_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_EFT_CFG5_PI_EFTEN_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_EFT_CFG5_PI_EFTEN_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_EFT_CFG5_PI_EFTEN_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_EFT_CFG5_PI_EFTEN_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_EFT_CFG5_PI_EFTEN_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_EFT_CFG5_PI_EFTEN_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_EFT_CFG5_PI_EFTEN_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_EFT_CFG5_PI_EFTEN_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_EFT_CFG5_PI_EFTEN_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_EFT_CFG5_PI_EFTEN_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_EFT_CFG5_PI_EFTEN_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_EFT_CFG5_PI_EFTEN_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_EFT_CFG5_PI_EFTEN_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_EFT_CFG5_PI_EFTEN_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_EFT_CFG5_PI_EFTEN_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_EFT_CFG5_PJ_EFTEN ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_EFT_CFG5_PJ_EFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_EFT_CFG5_PJ_EFTEN_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_EFTIE_CFG6 register ********/ +#define AFIO_EFT_CFG6_JRST_ANA_FIL_BYPASS ((uint32_t)0x00000200) /* Bit[9] */ +#define AFIO_EFT_CFG6_BOOT_EFTEN ((uint32_t)0x00000100) /* Bit[8] */ +#define AFIO_EFT_CFG6_PK_EFTEN ((uint32_t)0x000000FF) /* Bit[7:0] */ +#define AFIO_EFT_CFG6_PK_EFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_EFT_CFG6_PK_EFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_EFT_CFG6_PK_EFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_EFT_CFG6_PK_EFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_EFT_CFG6_PK_EFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_EFT_CFG6_PK_EFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_EFT_CFG6_PK_EFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_EFT_CFG6_PK_EFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ + +/******** Bit definition for AFIO_DIGEFT_CFG1 register ********/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_DIGEFT_CFG1_PB_DIGEFTEN_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_DIGEFT_CFG1_PA_DIGEFTEN_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_DIGEFT_CFG2 register ********/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_DIGEFT_CFG2_PD_DIGEFTEN_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_DIGEFT_CFG2_PC_DIGEFTEN_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_DIGEFT_CFG3 register ********/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_DIGEFT_CFG3_PF_DIGEFTEN_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_DIGEFT_CFG3_PE_DIGEFTEN_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_DIGEFT_CFG4 register ********/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_DIGEFT_CFG4_PH_DIGEFTEN_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_DIGEFT_CFG4_PG_DIGEFTEN_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_DIGEFT_CFG5 register ********/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_DIGEFT_CFG5_PI_DIGEFTEN_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_DIGEFT_CFG5_PJ_DIGEFTEN_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_DIGEFT_CFG6 register ********/ +#define AFIO_DIGEFT_CFG6_PK_DIGEFTEN ((uint32_t)0x000000FF) /* Bit[7:0] */ +#define AFIO_DIGEFT_CFG6_PK_DIGEFTEN_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_DIGEFT_CFG6_PK_DIGEFTEN_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_DIGEFT_CFG6_PK_DIGEFTEN_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_DIGEFT_CFG6_PK_DIGEFTEN_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_DIGEFT_CFG6_PK_DIGEFTEN_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_DIGEFT_CFG6_PK_DIGEFTEN_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_DIGEFT_CFG6_PK_DIGEFTEN_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_DIGEFT_CFG6_PK_DIGEFTEN_7 ((uint32_t)0x00000080) /* Bit7*/ + +/******** Bit definition for AFIO_SHRT1_EXEV_CFG1 register ********/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV5 ((uint32_t)0x01F00000) /* Bit[24:20] */ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV5_0 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV5_1 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV5_2 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV5_3 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV5_4 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV4 ((uint32_t)0x000F8000) /* Bit[19:15] */ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV4_0 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV4_1 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV4_2 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV4_3 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV4_4 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV3 ((uint32_t)0x00007C00) /* Bit[14:10] */ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV3_0 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV3_1 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV3_2 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV3_3 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV3_4 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV2 ((uint32_t)0x000003E0) /* Bit[9:5] */ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV2_0 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV2_1 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV2_2 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV2_3 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV2_4 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV1 ((uint32_t)0x0000001F) /* Bit[4:0] */ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV1_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV1_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV1_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV1_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV1_4 ((uint32_t)0x00000010) /* Bit4*/ + +/******** Bit definition for AFIO_SHRT1_EXEV_CFG2 register ********/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV10 ((uint32_t)0x01F00000) /* Bit[24:20] */ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV10_0 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV10_1 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV10_2 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV10_3 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV10_4 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV9 ((uint32_t)0x000F8000) /* Bit[19:15] */ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV9_0 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV9_1 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV9_2 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV9_3 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV9_4 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV8 ((uint32_t)0x00007C00) /* Bit[14:10] */ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV8_0 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV8_1 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV8_2 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV8_3 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV8_4 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV7 ((uint32_t)0x000003E0) /* Bit[9:5] */ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV7_0 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV7_1 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV7_2 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV7_3 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV7_4 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV6 ((uint32_t)0x0000001F) /* Bit[4:0] */ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV6_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV6_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV6_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV6_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SHRT1_EXEV_CFG2_SHRT_EXEV6_4 ((uint32_t)0x00000010) /* Bit4*/ + +/******** Bit definition for AFIO_SHRT2_EXEV_CFG1 register ********/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV5 ((uint32_t)0x01F00000) /* Bit[24:20] */ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV5_0 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV5_1 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV5_2 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV5_3 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV5_4 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV4 ((uint32_t)0x000F8000) /* Bit[19:15] */ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV4_0 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV4_1 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV4_2 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV4_3 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV4_4 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV3 ((uint32_t)0x00007C00) /* Bit[14:10] */ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV3_0 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV3_1 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV3_2 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV3_3 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV3_4 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV2 ((uint32_t)0x000003E0) /* Bit[9:5] */ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV2_0 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV2_1 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV2_2 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV2_3 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV2_4 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV1 ((uint32_t)0x0000001F) /* Bit[4:0] */ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV1_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV1_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV1_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV1_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV1_4 ((uint32_t)0x00000010) /* Bit4*/ + +/******** Bit definition for AFIO_SHRT2_EXEV_CFG2 register ********/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV10 ((uint32_t)0x01F00000) /* Bit[24:20] */ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV10_0 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV10_1 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV10_2 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV10_3 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV10_4 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV9 ((uint32_t)0x000F8000) /* Bit[19:15] */ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV9_0 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV9_1 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV9_2 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV9_3 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV9_4 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV8 ((uint32_t)0x00007C00) /* Bit[14:10] */ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV8_0 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV8_1 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV8_2 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV8_3 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV8_4 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV7 ((uint32_t)0x000003E0) /* Bit[9:5] */ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV7_0 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV7_1 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV7_2 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV7_3 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV7_4 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV6 ((uint32_t)0x0000001F) /* Bit[4:0] */ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV6_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV6_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV6_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV6_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SHRT2_EXEV_CFG2_SHRT_EXEV6_4 ((uint32_t)0x00000010) /* Bit4*/ + +/******** Bit definition for AFIO_SIP_PUPD register ********/ +#define AFIO_SIP_PUPD_PUPD7 ((uint32_t)0x0000C000) /* Bit[15:14] */ +#define AFIO_SIP_PUPD_PUPD7_0 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SIP_PUPD_PUPD7_1 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SIP_PUPD_PUPD6 ((uint32_t)0x00003000) /* Bit[13:12] */ +#define AFIO_SIP_PUPD_PUPD6_0 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SIP_PUPD_PUPD6_1 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SIP_PUPD_PUPD5 ((uint32_t)0x00000C00) /* Bit[11:10] */ +#define AFIO_SIP_PUPD_PUPD5_0 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SIP_PUPD_PUPD5_1 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SIP_PUPD_PUPD4 ((uint32_t)0x00000300) /* Bit[9:8] */ +#define AFIO_SIP_PUPD_PUPD4_0 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SIP_PUPD_PUPD4_1 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SIP_PUPD_PUPD3 ((uint32_t)0x000000C0) /* Bit[7:6] */ +#define AFIO_SIP_PUPD_PUPD3_0 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SIP_PUPD_PUPD3_1 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SIP_PUPD_PUPD2 ((uint32_t)0x00000030) /* Bit[5:4] */ +#define AFIO_SIP_PUPD_PUPD2_0 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SIP_PUPD_PUPD2_1 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SIP_PUPD_PUPD1 ((uint32_t)0x0000000C) /* Bit[3:2] */ +#define AFIO_SIP_PUPD_PUPD1_0 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SIP_PUPD_PUPD1_1 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SIP_PUPD_PUPD0 ((uint32_t)0x00000003) /* Bit[1:0] */ +#define AFIO_SIP_PUPD_PUPD0_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SIP_PUPD_PUPD0_1 ((uint32_t)0x00000002) /* Bit1*/ + +/******** Bit definition for AFIO_SDRAM_HSMOD_CFG1 register ********/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSA_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SDRAM_HSMOD_CFG1_HSB_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_SDRAM_HSMOD_CFG2 register ********/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSC_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SDRAM_HSMOD_CFG2_HSD_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_SDRAM_HSMOD_CFG3 register ********/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSE_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SDRAM_HSMOD_CFG3_HSF_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_SDRAM_HSMOD_CFG4 register ********/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSG_15 ((uint32_t)0x80000000) /* Bit31*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH ((uint32_t)0x0000FFFF) /* Bit[15:0] */ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SDRAM_HSMOD_CFG4_HSH_15 ((uint32_t)0x00008000) /* Bit15*/ + +/******** Bit definition for AFIO_SDRAM_HSMOD_CFG5 register ********/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI ((uint32_t)0xFFFF0000) /* Bit[31:16] */ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_0 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_1 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_2 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_3 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_4 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_5 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_6 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_7 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_8 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_9 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_10 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_11 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_12 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_13 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_14 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_SDRAM_HSMOD_CFG5_HSI_15 ((uint32_t)0x80000000) /* Bit31*/ + +/******** Bit definition for AFIO_SIP_SR register ********/ +#define AFIO_SIP_SR_SR7 ((uint32_t)0x00000080) /* Bit[7] */ +#define AFIO_SIP_SR_SR6 ((uint32_t)0x00000040) /* Bit[6] */ +#define AFIO_SIP_SR_SR5 ((uint32_t)0x00000020) /* Bit[5] */ +#define AFIO_SIP_SR_SR4 ((uint32_t)0x00000010) /* Bit[4] */ +#define AFIO_SIP_SR_SR3 ((uint32_t)0x00000008) /* Bit[3] */ +#define AFIO_SIP_SR_SR2 ((uint32_t)0x00000004) /* Bit[2] */ +#define AFIO_SIP_SR_SR1 ((uint32_t)0x00000002) /* Bit[1] */ +#define AFIO_SIP_SR_SR0 ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for AFIO_SIPDS_CFG register ********/ +#define AFIO_SIP_DS_DS7 ((uint32_t)0x0000C000) /* Bit[15:14] */ +#define AFIO_SIP_DS_DS7_0 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SIP_DS_DS7_1 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SIP_DS_DS6 ((uint32_t)0x00003000) /* Bit[13:12] */ +#define AFIO_SIP_DS_DS6_0 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SIP_DS_DS6_1 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SIP_DS_DS5 ((uint32_t)0x00000C00) /* Bit[11:10] */ +#define AFIO_SIP_DS_DS5_0 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SIP_DS_DS5_1 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SIP_DS_DS4 ((uint32_t)0x00000300) /* Bit[9:8] */ +#define AFIO_SIP_DS_DS4_0 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SIP_DS_DS4_1 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SIP_DS_DS3 ((uint32_t)0x000000C0) /* Bit[7:6] */ +#define AFIO_SIP_DS_DS3_0 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SIP_DS_DS3_1 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SIP_DS_DS2 ((uint32_t)0x00000030) /* Bit[5:4] */ +#define AFIO_SIP_DS_DS2_0 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SIP_DS_DS2_1 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SIP_DS_DS1 ((uint32_t)0x0000000C) /* Bit[3:2] */ +#define AFIO_SIP_DS_DS1_0 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SIP_DS_DS1_1 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SIP_DS_DS0 ((uint32_t)0x00000003) /* Bit[1:0] */ +#define AFIO_SIP_DS_DS0_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SIP_DS_DS0_1 ((uint32_t)0x00000002) /* Bit1*/ + +/******** Bit definition for AFIO_ADCSW_CFG register ********/ +#define AFIO_ADCSW_CFG_VREF ((uint32_t)0x10000000) /* Bit[28] */ +#define AFIO_ADCSW_CFG_SW_PJ7 ((uint32_t)0x08000000) /* Bit[27] */ +#define AFIO_ADCSW_CFG_SW_PJ6 ((uint32_t)0x04000000) /* Bit[26] */ +#define AFIO_ADCSW_CFG_SW_DAC135_OUT ((uint32_t)0x03800000) /* Bit[25:23] */ +#define AFIO_ADCSW_CFG_SW_DAC5_OUT ((uint32_t)0x02000000) /* Bit[25] */ +#define AFIO_ADCSW_CFG_SW_DAC3_OUT ((uint32_t)0x01000000) /* Bit[24] */ +#define AFIO_ADCSW_CFG_SW_DAC1_OUT ((uint32_t)0x00800000) /* Bit[23] */ +#define AFIO_ADCSW_CFG_SW_PJ5 ((uint32_t)0x00400000) /* Bit[22] */ +#define AFIO_ADCSW_CFG_SW_PJ4 ((uint32_t)0x00200000) /* Bit[21] */ +#define AFIO_ADCSW_CFG_SW_TEMP ((uint32_t)0x00100000) /* Bit[20] */ +#define AFIO_ADCSW_CFG_SW_PJ3 ((uint32_t)0x00080000) /* Bit[19] */ +#define AFIO_ADCSW_CFG_SW_PJ0 ((uint32_t)0x00040000) /* Bit[18] */ +#define AFIO_ADCSW_CFG_SW_DAC246_OUT ((uint32_t)0x00038000) /* Bit[17:15] */ +#define AFIO_ADCSW_CFG_SW_DAC6_OUT ((uint32_t)0x00020000) /* Bit[17] */ +#define AFIO_ADCSW_CFG_SW_DAC4_OUT ((uint32_t)0x00010000) /* Bit[16] */ +#define AFIO_ADCSW_CFG_SW_DAC2_OUT ((uint32_t)0x00008000) /* Bit[15] */ +#define AFIO_ADCSW_CFG_VBAT ((uint32_t)0x00004000) /* Bit[14] */ +#define AFIO_ADCSW_CFG_SWPI15 ((uint32_t)0x00003000) /* Bit[13:12] */ +#define AFIO_ADCSW_CFG_SWPI15_1 ((uint32_t)0x00002000) /* Bit[13] */ +#define AFIO_ADCSW_CFG_SWPI15_0 ((uint32_t)0x00001000) /* Bit[12] */ +#define AFIO_ADCSW_CFG_SWPA1_C ((uint32_t)0x00000C00) /* Bit[11:10] */ +#define AFIO_ADCSW_CFG_SWPA1_C_1 ((uint32_t)0x00000800) /* Bit[11] */ +#define AFIO_ADCSW_CFG_SWPA1_C_0 ((uint32_t)0x00000400) /* Bit[10] */ +#define AFIO_ADCSW_CFG_SWPC3_C ((uint32_t)0x00000300) /* Bit[9:8] */ +#define AFIO_ADCSW_CFG_SWPC3_C_1 ((uint32_t)0x00000200) /* Bit[9] */ +#define AFIO_ADCSW_CFG_SWPC3_C_0 ((uint32_t)0x00000100) /* Bit[8] */ +#define AFIO_ADCSW_CFG_SWPC2_C ((uint32_t)0x000000F0) /* Bit[7:4] */ +#define AFIO_ADCSW_CFG_SWPC2_C_3 ((uint32_t)0x00000080) /* Bit[7] */ +#define AFIO_ADCSW_CFG_SWPC2_C_2 ((uint32_t)0x00000040) /* Bit[6] */ +#define AFIO_ADCSW_CFG_SWPC2_C_1 ((uint32_t)0x00000020) /* Bit[5] */ +#define AFIO_ADCSW_CFG_SWPC2_C_0 ((uint32_t)0x00000010) /* Bit[4] */ +#define AFIO_ADCSW_CFG_SWPA0_C ((uint32_t)0x0000000F) /* Bit[3:0] */ +#define AFIO_ADCSW_CFG_SWPA0_C_3 ((uint32_t)0x00000008) /* Bit[3] */ +#define AFIO_ADCSW_CFG_SWPA0_C_2 ((uint32_t)0x00000004) /* Bit[2] */ +#define AFIO_ADCSW_CFG_SWPA0_C_1 ((uint32_t)0x00000002) /* Bit[1] */ +#define AFIO_ADCSW_CFG_SWPA0_C_0 ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for AFIO_SDRAM_VREF_EN0 register ********/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0 ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_15 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_16 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_17 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_18 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_19 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_20 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_21 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_22 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_23 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_24 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_25 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_26 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_27 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_28 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_29 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_30 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_SDRAM_VREF_EN0_VREF_EN0_31 ((uint32_t)0x80000000) /* Bit31*/ + +/******** Bit definition for AFIO_SDRAM_VREF_EN1 register ********/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1 ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_15 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_16 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_17 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_18 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_19 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_20 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_21 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_22 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_23 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_24 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_25 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_26 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_27 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_28 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_29 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_30 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_SDRAM_VREF_EN1_VREF_EN1_31 ((uint32_t)0x80000000) /* Bit31*/ + +/******** Bit definition for AFIO_SDRAM_VREF_EN2 register ********/ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2 ((uint32_t)0x000007FF) /* Bit[10:0] */ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAM_VREF_EN2_VREF_EN2_10 ((uint32_t)0x00000400) /* Bit10*/ + +/******** Bit definition for AFIO_SDRAMDSN_CFG0 register ********/ +#define AFIO_SDRAMDSN_CFG0_DSN0 ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ +#define AFIO_SDRAMDSN_CFG0_DSN0_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_15 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_16 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_17 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_18 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_19 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_20 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_21 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_22 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_23 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_24 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_25 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_26 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_27 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_28 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_29 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_30 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_SDRAMDSN_CFG0_DSN0_31 ((uint32_t)0x80000000) /* Bit31*/ + +/******** Bit definition for AFIO_SDRAMDSN_CFG1 register ********/ +#define AFIO_SDRAMDSN_CFG1_DSN1 ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ +#define AFIO_SDRAMDSN_CFG1_DSN1_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_15 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_16 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_17 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_18 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_19 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_20 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_21 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_22 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_23 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_24 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_25 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_26 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_27 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_28 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_29 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_30 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_SDRAMDSN_CFG1_DSN1_31 ((uint32_t)0x80000000) /* Bit31*/ + +/******** Bit definition for AFIO_SDRAMDSN_CFG2 register ********/ +#define AFIO_SDRAMDSN_CFG2_DSN2 ((uint32_t)0x000007FF) /* Bit[10:0] */ +#define AFIO_SDRAMDSN_CFG2_DSN2_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAMDSN_CFG2_DSN2_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAMDSN_CFG2_DSN2_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAMDSN_CFG2_DSN2_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAMDSN_CFG2_DSN2_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAMDSN_CFG2_DSN2_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAMDSN_CFG2_DSN2_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAMDSN_CFG2_DSN2_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAMDSN_CFG2_DSN2_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAMDSN_CFG2_DSN2_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAMDSN_CFG2_DSN2_10 ((uint32_t)0x00000400) /* Bit10*/ + +/******** Bit definition for AFIO_SDRAMDSP_CFG0 register ********/ +#define AFIO_SDRAMDSP_CFG0_DSP0 ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ +#define AFIO_SDRAMDSP_CFG0_DSP0_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_15 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_16 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_17 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_18 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_19 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_20 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_21 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_22 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_23 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_24 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_25 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_26 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_27 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_28 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_29 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_30 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_SDRAMDSP_CFG0_DSP0_31 ((uint32_t)0x80000000) /* Bit31*/ + +/******** Bit definition for AFIO_SDRAMDSP_CFG1 register ********/ +#define AFIO_SDRAMDSP_CFG1_DSP1 ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ +#define AFIO_SDRAMDSP_CFG1_DSP1_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_10 ((uint32_t)0x00000400) /* Bit10*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_11 ((uint32_t)0x00000800) /* Bit11*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_12 ((uint32_t)0x00001000) /* Bit12*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_13 ((uint32_t)0x00002000) /* Bit13*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_14 ((uint32_t)0x00004000) /* Bit14*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_15 ((uint32_t)0x00008000) /* Bit15*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_16 ((uint32_t)0x00010000) /* Bit16*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_17 ((uint32_t)0x00020000) /* Bit17*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_18 ((uint32_t)0x00040000) /* Bit18*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_19 ((uint32_t)0x00080000) /* Bit19*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_20 ((uint32_t)0x00100000) /* Bit20*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_21 ((uint32_t)0x00200000) /* Bit21*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_22 ((uint32_t)0x00400000) /* Bit22*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_23 ((uint32_t)0x00800000) /* Bit23*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_24 ((uint32_t)0x01000000) /* Bit24*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_25 ((uint32_t)0x02000000) /* Bit25*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_26 ((uint32_t)0x04000000) /* Bit26*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_27 ((uint32_t)0x08000000) /* Bit27*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_28 ((uint32_t)0x10000000) /* Bit28*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_29 ((uint32_t)0x20000000) /* Bit29*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_30 ((uint32_t)0x40000000) /* Bit30*/ +#define AFIO_SDRAMDSP_CFG1_DSP1_31 ((uint32_t)0x80000000) /* Bit31*/ + +/******** Bit definition for AFIO_SDRAMDSP_CFG2 register ********/ +#define AFIO_SDRAMDSP_CFG2_DSP2 ((uint32_t)0x000007FF) /* Bit[10:0] */ +#define AFIO_SDRAMDSP_CFG2_DSP2_0 ((uint32_t)0x00000001) /* Bit0*/ +#define AFIO_SDRAMDSP_CFG2_DSP2_1 ((uint32_t)0x00000002) /* Bit1*/ +#define AFIO_SDRAMDSP_CFG2_DSP2_2 ((uint32_t)0x00000004) /* Bit2*/ +#define AFIO_SDRAMDSP_CFG2_DSP2_3 ((uint32_t)0x00000008) /* Bit3*/ +#define AFIO_SDRAMDSP_CFG2_DSP2_4 ((uint32_t)0x00000010) /* Bit4*/ +#define AFIO_SDRAMDSP_CFG2_DSP2_5 ((uint32_t)0x00000020) /* Bit5*/ +#define AFIO_SDRAMDSP_CFG2_DSP2_6 ((uint32_t)0x00000040) /* Bit6*/ +#define AFIO_SDRAMDSP_CFG2_DSP2_7 ((uint32_t)0x00000080) /* Bit7*/ +#define AFIO_SDRAMDSP_CFG2_DSP2_8 ((uint32_t)0x00000100) /* Bit8*/ +#define AFIO_SDRAMDSP_CFG2_DSP2_9 ((uint32_t)0x00000200) /* Bit9*/ +#define AFIO_SDRAMDSP_CFG2_DSP2_10 ((uint32_t)0x00000400) /* Bit10*/ + + + +/*** Analog to Digital Converter Peripheral Interface ***/ +/******************** Bit definition for ADC_STS register ********************/ +#define ADC_STS_ALL ((uint32_t)0x0003EB7FU) +#define ADC_STS_WEFLAG ((uint32_t)0x00020000U) /* Bit[17] FIFO write error status */ +#define ADC_STS_REFLAG ((uint32_t)0x00010000U) /* Bit[16] FIFO read error status */ +#define ADC_STS_ROSOVFDSMU ((uint32_t)0x00004000U) /* Bit[14] Regular channel oversampling overrun flag in DSMU mode */ +#define ADC_STS_JOSOVF ((uint32_t)0x00002000U) /* Bit[13] Injected channel oversampling overrun flag*/ +#define ADC_STS_ROSOVF ((uint32_t)0x00001000U) /* Bit[12] Regular channel oversampling overrun flag*/ +#define ADC_STS_EOSAMP ((uint32_t)0x00000800U) /* Bit[11] End of Sampling */ +#define ADC_STS_PDRDY ((uint32_t)0x00000200U) /* Bit[9] ADC power down ready*/ +#define ADC_STS_RDY ((uint32_t)0x00000100U) /* Bit[8] ADC power up ready */ +#define ADC_STS_AWDG1 ((uint32_t)0x00000040U) /* Bit[6] Analog watchdog 1 flag */ +#define ADC_STS_STR ((uint32_t)0x00000020U) /* Bit[5] Regular channel Start flag */ +#define ADC_STS_JENDCA ((uint32_t)0x00000010U) /* Bit[4] Any injected channel end of conversion */ +#define ADC_STS_JENDC ((uint32_t)0x00000008U) /* Bit[3] Injected channel end of conversion */ +#define ADC_STS_JSTR ((uint32_t)0x00000004U) /* Bit[2] Injected channel Start flag*/ +#define ADC_STS_ENDCA ((uint32_t)0x00000002U) /* Bit[1] Any end of conversion */ +#define ADC_STS_ENDC ((uint32_t)0x00000001U) /* Bit[0] End of conversion */ + +/******************* Bit definition for ADC_CTRL1 register ********************/ +#define ADC_CTRL1_WEIEN ((uint32_t)0x40000000U) /* Bit[30] FIFO write error interrupt enable */ +#define ADC_CTRL1_REIEN ((uint32_t)0x20000000U) /* Bit[29] FIFO read error interrupt enable*/ + +#define ADC_CTRL1_EOSMPIEN ((uint32_t)0x10000000U) /* Bit[28] End of Sampling interrupt enable */ +#define ADC_CTRL1_PDRDYIEN ((uint32_t)0x08000000U) /* Bit[27] ADC power up ready interrupt enable */ +#define ADC_CTRL1_RDYIEN ((uint32_t)0x04000000U) /* Bit[26] ADC power up ready interrupt enable */ +#define ADC_CTRL1_DJCH ((uint32_t)0x01000000U) /* Bit[24] Discontinuous mode on injected channels */ +#define ADC_CTRL1_DREGCH ((uint32_t)0x00800000U) /* Bit[23] Discontinuous mode on regular channels*/ +#define ADC_CTRL1_AWD1ERCH ((uint32_t)0x00400000U) /* Bit[22] Analog watchdog 1 enable on regular channels */ +#define ADC_CTRL1_AWD1EJCH ((uint32_t)0x00200000U) /* Bit[21] Analog watchdog 1 enable on injected channels */ + +#define ADC_CTRL1_AWD1CH ((uint32_t)0x001F0000U) /* Bit[20:16] Analog watchdog 1 channel select bits */ +#define ADC_CTRL1_AWD1CH_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define ADC_CTRL1_AWD1CH_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define ADC_CTRL1_AWD1CH_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define ADC_CTRL1_AWD1CH_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define ADC_CTRL1_AWD1CH_4 ((uint32_t)0x00100000U) /* Bit20*/ + +#define ADC_CTRL1_MULTMODE ((uint32_t)0x0000F800U) /* Bit[15:11] Mult-ADC mode selection*/ +#define ADC_CTRL1_MULTMODE_0 ((uint32_t)0x00000800U) /* Bit11*/ +#define ADC_CTRL1_MULTMODE_1 ((uint32_t)0x00001000U) /* Bit12*/ +#define ADC_CTRL1_MULTMODE_2 ((uint32_t)0x00002000U) /* Bit13*/ +#define ADC_CTRL1_MULTMODE_3 ((uint32_t)0x00004000U) /* Bit14*/ +#define ADC_CTRL1_MULTMODE_4 ((uint32_t)0x00008000U) /* Bit15*/ + +#define ADC_CTRL1_DCTU ((uint32_t)0x00000700U) /* Bit[10:8] DISC_NUM[2:0] bits (Discontinuous mode channel count)*/ +#define ADC_CTRL1_DCTU_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define ADC_CTRL1_DCTU_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define ADC_CTRL1_DCTU_2 ((uint32_t)0x00000400U) /* Bit10*/ + +#define ADC_CTRL1_AUTOJC ((uint32_t)0x00000080U) /* Bit[7] Automatic injected group conversion*/ +#define ADC_CTRL1_AWD1SGLEN ((uint32_t)0x00000040U) /* Bit[6] Enable the watchdog 1 on a single channel in scan mode */ + +#define ADC_CTRL1_AWD1IEN ((uint32_t)0x00000020U) /* Bit[5] Analog watchdog 1 interrupt enable*/ +#define ADC_CTRL1_JENDCIEN ((uint32_t)0x00000010U) /* Bit[4] Injected channel end of conversion interrupt enable */ +#define ADC_CTRL1_JENDCAIEN ((uint32_t)0x00000008U) /* Bit[3] Any injected channel end of conversion interrupt enable */ +#define ADC_CTRL1_ENDCIEN ((uint32_t)0x00000004U) /* Bit[2] End of conversion interrupt enable*/ +#define ADC_CTRL1_ENDCAIEN ((uint32_t)0x00000002U) /* Bit[1] Any end of conversion interrupt enable */ + +#define ADC_CTRL1_SCANMD ((uint32_t)0x00000001U) /* Bit[0] Scan mode */ + +/******************* Bit definition for ADC_CTRL2 register ********************/ +#define ADC_CTRL2_EXTPRSEL ((uint32_t)0xC0000000U) /* Bit[31:30] External trigger enable and polarity selection for regular channels */ +#define ADC_CTRL2_EXTPRSEL_0 ((uint32_t)0x40000000U) /* Bit30*/ +#define ADC_CTRL2_EXTPRSEL_1 ((uint32_t)0x80000000U) /* Bit31*/ + +#define ADC_CTRL2_EXTRSEL ((uint32_t)0x3F000000U) /* Bit[29:24] External event select for regular group */ +#define ADC_CTRL2_EXTRSEL_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define ADC_CTRL2_EXTRSEL_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define ADC_CTRL2_EXTRSEL_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define ADC_CTRL2_EXTRSEL_3 ((uint32_t)0x08000000U) /* Bit27*/ +#define ADC_CTRL2_EXTRSEL_4 ((uint32_t)0x10000000U) /* Bit28*/ +#define ADC_CTRL2_EXTRSEL_5 ((uint32_t)0x20000000U) /* Bit29*/ + +#define ADC_CTRL2_TEMPEN ((uint32_t)0x00800000U) /* Bit[23] Temperature Sensor Enable*/ +#define ADC_CTRL2_SWSTRRCH ((uint32_t)0x00400000U) /* Bit[22] Start Conversion of regular channels*/ +#define ADC_CTRL2_SWSTRJCH ((uint32_t)0x00200000U) /* Bit[21] Start Conversion of injected channels*/ +#define ADC_CTRL2_EXTTRIG ((uint32_t)0x00100000U) /* Bit[20] External event trigger of regular channels enable*/ + +#define ADC_CTRL2_EXTJSEL ((uint32_t)0x0007E000U) /* Bit[18:13] External event select for injected group*/ +#define ADC_CTRL2_EXTJSEL_0 ((uint32_t)0x00002000U) /* Bit13*/ +#define ADC_CTRL2_EXTJSEL_1 ((uint32_t)0x00004000U) /* Bit14*/ +#define ADC_CTRL2_EXTJSEL_2 ((uint32_t)0x00008000U) /* Bit15*/ +#define ADC_CTRL2_EXTJSEL_3 ((uint32_t)0x00010000U) /* Bit16*/ +#define ADC_CTRL2_EXTJSEL_4 ((uint32_t)0x00020000U) /* Bit17*/ +#define ADC_CTRL2_EXTJSEL_5 ((uint32_t)0x00040000U) /* Bit18*/ + +#define ADC_CTRL2_JEXTTRIG ((uint32_t)0x00001000U) /* Bit[12] External event trigger of injected channels enable*/ +#define ADC_CTRL2_ALIG ((uint32_t)0x00000800U) /* Bit[11] Data Alignment*/ + +#define ADC_CTRL2_EXTPJSEL ((uint32_t)0x00000600U) /* Bit[10:9] External trigger enable and polarity selection for injected channels*/ +#define ADC_CTRL2_EXTPJSEL_0 ((uint32_t)0x00000200U) /* Bit9*/ +#define ADC_CTRL2_EXTPJSEL_1 ((uint32_t)0x00000400U) /* Bit10*/ + +#define ADC_CTRL2_DMAMD ((uint32_t)0x00000180U) /* Bit[8:7] DMA mode*/ +#define ADC_CTRL2_DMAMD_0 ((uint32_t)0x00000080U) /* Bit7*/ +#define ADC_CTRL2_DMAMD_1 ((uint32_t)0x00000100U) /* Bit8*/ + +#define ADC_CTRL2_MDSMU ((uint32_t)0x00000040U) /* Bit[6] Multi-adc DSMU mode*/ + +#define ADC_CTRL2_DMNGT ((uint32_t)0x00000030U) /* Bit[5:4] Data management configuration for regular conversion data*/ +#define ADC_CTRL2_DMNGT_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define ADC_CTRL2_DMNGT_1 ((uint32_t)0x00000020U) /* Bit5*/ + +#define ADC_CTRL2_ENCAL ((uint32_t)0x00000004U) /* Bit[2] A/D Calibration */ +#define ADC_CTRL2_CTU ((uint32_t)0x00000002U) /* Bit[1] Continuous Conversion*/ +#define ADC_CTRL2_ON ((uint32_t)0x00000001U) /* Bit[0] A/D Converter ON / OFF */ + +/******************* Bit definition for ADC_CTRL3 register ********************/ +#define ADC_CTRL3_GCOMP_SATEN ((uint32_t)0x20000000U) /* Bit[29] Gain compensation saturation enable*/ +#define ADC_CTRL3_GCOMPEN ((uint32_t)0x10000000U) /* Bit[28] Gain compensation Enable*/ + +#define ADC_CTRL3_SWJSTOP ((uint32_t)0x08000000U) /* Bit[27] Stop Conversion of injected channels*/ +#define ADC_CTRL3_SWRSTOP ((uint32_t)0x04000000U) /* Bit[26] Stop Conversion of regular channels*/ + +#define ADC_CTRL3_JSTART ((uint32_t)0x02000000U) /* Bit[25] ADC start of injected conversion*/ +#define ADC_CTRL3_RSTART ((uint32_t)0x01000000U) /* Bit[24] ADC start of regular conversion*/ + +#define ADC_CTRL3_VBATMEN ((uint32_t)0x00000200U) /* Bit[9] Vbat monitor enable*/ +#define ADC_CTRL3_VREFINTEN ((uint32_t)0x00000100U) /* Bit[8] Internal Vrefence Voltage enable*/ + +#define ADC_CTRL3_BPCAL ((uint32_t)0x00000080U) /* Bit[7] Bypass calibration*/ + +#define ADC_CTRL3_PDRDY ((uint32_t)0x00000040U) /* Bit[6] 6.0*/ +#define ADC_CTRL3_RDY ((uint32_t)0x00000020U) /* Bit[5] 5.0*/ + +#define ADC_CTRL3_CLOCKMOD ((uint32_t)0x00000010U) /* Bit[4] Clock Mode*/ + +#define ADC_CTRL3_RES ((uint32_t)0x00000002U) /* Bit[1] Data resolution*/ + +/****************** Bit definition for ADC_SAMPT1 register *******************/ +#define ADC_SAMPT1_SAMP0 ((uint32_t)0x0000000FU) /* SAMP0[3:0] bits (Channel 0 Sample time selection) */ +#define ADC_SAMPT1_SAMP0_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define ADC_SAMPT1_SAMP0_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define ADC_SAMPT1_SAMP0_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define ADC_SAMPT1_SAMP0_3 ((uint32_t)0x00000008U) /* Bit 3 */ + +#define ADC_SAMPT1_SAMP1 ((uint32_t)0x000000F0U) /* SAMP1[3:0] bits (Channel 1 Sample time selection) */ +#define ADC_SAMPT1_SAMP1_0 ((uint32_t)0x00000010U) /* Bit 0 */ +#define ADC_SAMPT1_SAMP1_1 ((uint32_t)0x00000020U) /* Bit 1 */ +#define ADC_SAMPT1_SAMP1_2 ((uint32_t)0x00000040U) /* Bit 2 */ +#define ADC_SAMPT1_SAMP1_3 ((uint32_t)0x00000080U) /* Bit 3 */ + +#define ADC_SAMPT1_SAMP2 ((uint32_t)0x00000F00U) /* SAMP2[3:0] bits (Channel 2 Sample time selection) */ +#define ADC_SAMPT1_SAMP2_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define ADC_SAMPT1_SAMP2_1 ((uint32_t)0x00000200U) /* Bit 1 */ +#define ADC_SAMPT1_SAMP2_2 ((uint32_t)0x00000400U) /* Bit 2 */ +#define ADC_SAMPT1_SAMP2_3 ((uint32_t)0x00000800U) /* Bit 3 */ + +#define ADC_SAMPT1_SAMP3 ((uint32_t)0x0000F000U) /* SAMP3[3:0] bits (Channel 3 Sample time selection) */ +#define ADC_SAMPT1_SAMP3_0 ((uint32_t)0x00001000U) /* Bit 0 */ +#define ADC_SAMPT1_SAMP3_1 ((uint32_t)0x00002000U) /* Bit 1 */ +#define ADC_SAMPT1_SAMP3_2 ((uint32_t)0x00004000U) /* Bit 2 */ +#define ADC_SAMPT1_SAMP3_3 ((uint32_t)0x00008000U) /* Bit 3 */ + +#define ADC_SAMPT1_SAMP4 ((uint32_t)0x000F0000U) /* SAMP4[3:0] bits (Channel 4 Sample time selection) */ +#define ADC_SAMPT1_SAMP4_0 ((uint32_t)0x00010000U) /* Bit 0 */ +#define ADC_SAMPT1_SAMP4_1 ((uint32_t)0x00020000U) /* Bit 1 */ +#define ADC_SAMPT1_SAMP4_2 ((uint32_t)0x00040000U) /* Bit 2 */ +#define ADC_SAMPT1_SAMP4_3 ((uint32_t)0x00080000U) /* Bit 3 */ + +#define ADC_SAMPT1_SAMP5 ((uint32_t)0x00F00000U) /* SAMP5[3:0] bits (Channel 5 Sample time selection) */ +#define ADC_SAMPT1_SAMP5_0 ((uint32_t)0x00100000U) /* Bit 0 */ +#define ADC_SAMPT1_SAMP5_1 ((uint32_t)0x00200000U) /* Bit 1 */ +#define ADC_SAMPT1_SAMP5_2 ((uint32_t)0x00400000U) /* Bit 2 */ +#define ADC_SAMPT1_SAMP5_3 ((uint32_t)0x00800000U) /* Bit 3 */ + +#define ADC_SAMPT1_SAMP6 ((uint32_t)0x0F000000U) /* SAMP6[3:0] bits (Channel 6 Sample time selection) */ +#define ADC_SAMPT1_SAMP6_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define ADC_SAMPT1_SAMP6_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define ADC_SAMPT1_SAMP6_2 ((uint32_t)0x04000000U) /* Bit 2 */ +#define ADC_SAMPT1_SAMP6_3 ((uint32_t)0x08000000U) /* Bit 3 */ + +#define ADC_SAMPT1_SAMP7 ((uint32_t)0xF0000000U) /* SAMP7[3:0] bits (Channel 7 Sample time selection) */ +#define ADC_SAMPT1_SAMP7_0 ((uint32_t)0x10000000U) /* Bit 0 */ +#define ADC_SAMPT1_SAMP7_1 ((uint32_t)0x20000000U) /* Bit 1 */ +#define ADC_SAMPT1_SAMP7_2 ((uint32_t)0x40000000U) /* Bit 2 */ +#define ADC_SAMPT1_SAMP7_3 ((uint32_t)0x80000000U) /* Bit 3 */ + +/****************** Bit definition for ADC_SAMPT2 register *******************/ +#define ADC_SAMPT2_SAMP8 ((uint32_t)0x0000000FU) /* SAMP8[3:0] bits (Channel 8 Sample time selection) */ +#define ADC_SAMPT2_SAMP8_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define ADC_SAMPT2_SAMP8_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define ADC_SAMPT2_SAMP8_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define ADC_SAMPT2_SAMP8_3 ((uint32_t)0x00000008U) /* Bit 3 */ + +#define ADC_SAMPT2_SAMP9 ((uint32_t)0x000000F0U) /* SAMP9[3:0] bits (Channel 9 Sample time selection) */ +#define ADC_SAMPT2_SAMP9_0 ((uint32_t)0x00000010U) /* Bit 0 */ +#define ADC_SAMPT2_SAMP9_1 ((uint32_t)0x00000020U) /* Bit 1 */ +#define ADC_SAMPT2_SAMP9_2 ((uint32_t)0x00000040U) /* Bit 2 */ +#define ADC_SAMPT2_SAMP9_3 ((uint32_t)0x00000080U) /* Bit 3 */ + +#define ADC_SAMPT2_SAMP10 ((uint32_t)0x00000F00U) /* SAMP10[3:0] bits (Channel 10 Sample time selection) */ +#define ADC_SAMPT2_SAMP10_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define ADC_SAMPT2_SAMP10_1 ((uint32_t)0x00000200U) /* Bit 1 */ +#define ADC_SAMPT2_SAMP10_2 ((uint32_t)0x00000400U) /* Bit 2 */ +#define ADC_SAMPT2_SAMP10_3 ((uint32_t)0x00000800U) /* Bit 3 */ + +#define ADC_SAMPT2_SAMP11 ((uint32_t)0x0000F000U) /* SAMP11[3:0] bits (Channel 11 Sample time selection) */ +#define ADC_SAMPT2_SAMP11_0 ((uint32_t)0x00001000U) /* Bit 0 */ +#define ADC_SAMPT2_SAMP11_1 ((uint32_t)0x00002000U) /* Bit 1 */ +#define ADC_SAMPT2_SAMP11_2 ((uint32_t)0x00004000U) /* Bit 2 */ +#define ADC_SAMPT2_SAMP11_3 ((uint32_t)0x00008000U) /* Bit 3 */ + +#define ADC_SAMPT2_SAMP12 ((uint32_t)0x000F0000U) /* SAMP12[3:0] bits (Channel 12 Sample time selection) */ +#define ADC_SAMPT2_SAMP12_0 ((uint32_t)0x00010000U) /* Bit 0 */ +#define ADC_SAMPT2_SAMP12_1 ((uint32_t)0x00020000U) /* Bit 1 */ +#define ADC_SAMPT2_SAMP12_2 ((uint32_t)0x00040000U) /* Bit 2 */ +#define ADC_SAMPT2_SAMP12_3 ((uint32_t)0x00080000U) /* Bit 3 */ + +#define ADC_SAMPT2_SAMP13 ((uint32_t)0x00F00000U) /* SAMP13[3:0] bits (Channel 13 Sample time selection) */ +#define ADC_SAMPT2_SAMP13_0 ((uint32_t)0x00100000U) /* Bit 0 */ +#define ADC_SAMPT2_SAMP13_1 ((uint32_t)0x00200000U) /* Bit 1 */ +#define ADC_SAMPT2_SAMP13_2 ((uint32_t)0x00400000U) /* Bit 2 */ +#define ADC_SAMPT2_SAMP13_3 ((uint32_t)0x00800000U) /* Bit 3 */ + +#define ADC_SAMPT2_SAMP14 ((uint32_t)0x0F000000U) /* SAMP14[3:0] bits (Channel 14 Sample time selection) */ +#define ADC_SAMPT2_SAMP14_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define ADC_SAMPT2_SAMP14_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define ADC_SAMPT2_SAMP14_2 ((uint32_t)0x04000000U) /* Bit 2 */ +#define ADC_SAMPT2_SAMP14_3 ((uint32_t)0x08000000U) /* Bit 3 */ + +#define ADC_SAMPT2_SAMP15 ((uint32_t)0xF0000000U) /* SAMP15[3:0] bits (Channel 15 Sample time selection) */ +#define ADC_SAMPT2_SAMP15_0 ((uint32_t)0x10000000U) /* Bit 0 */ +#define ADC_SAMPT2_SAMP15_1 ((uint32_t)0x20000000U) /* Bit 1 */ +#define ADC_SAMPT2_SAMP15_2 ((uint32_t)0x40000000U) /* Bit 2 */ +#define ADC_SAMPT2_SAMP15_3 ((uint32_t)0x80000000U) /* Bit 3 */ + +/****************** Bit definition for ADC_SAMPT3 register *******************/ +#define ADC_SAMPT3_SAMP16 ((uint32_t)0x0000000FU) /* SAMP16[3:0] bits (Channel 16 Sample time selection) */ +#define ADC_SAMPT3_SAMP16_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define ADC_SAMPT3_SAMP16_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define ADC_SAMPT3_SAMP16_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define ADC_SAMPT3_SAMP16_3 ((uint32_t)0x00000008U) /* Bit 3 */ + +#define ADC_SAMPT3_SAMP17 ((uint32_t)0x000000F0U) /* SAMP17[3:0] bits (Channel 17 Sample time selection) */ +#define ADC_SAMPT3_SAMP17_0 ((uint32_t)0x00000010U) /* Bit 0 */ +#define ADC_SAMPT3_SAMP17_1 ((uint32_t)0x00000020U) /* Bit 1 */ +#define ADC_SAMPT3_SAMP17_2 ((uint32_t)0x00000040U) /* Bit 2 */ +#define ADC_SAMPT3_SAMP17_3 ((uint32_t)0x00000080U) /* Bit 3 */ + +#define ADC_SAMPT3_SAMP18 ((uint32_t)0x00000F00U) /* SAMP18[3:0] bits (Channel 18 Sample time selection) */ +#define ADC_SAMPT3_SAMP18_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define ADC_SAMPT3_SAMP18_1 ((uint32_t)0x00000200U) /* Bit 1 */ +#define ADC_SAMPT3_SAMP18_2 ((uint32_t)0x00000400U) /* Bit 2 */ +#define ADC_SAMPT3_SAMP18_3 ((uint32_t)0x00000800U) /* Bit 3 */ + +#define ADC_SAMPT3_SAMP19 ((uint32_t)0x0000F000U) /* SAMP19[3:0] bits (Channel 19 Sample time selection) */ +#define ADC_SAMPT3_SAMP19_0 ((uint32_t)0x00001000U) /* Bit 0 */ +#define ADC_SAMPT3_SAMP19_1 ((uint32_t)0x00002000U) /* Bit 1 */ +#define ADC_SAMPT3_SAMP19_2 ((uint32_t)0x00004000U) /* Bit 2 */ +#define ADC_SAMPT3_SAMP19_3 ((uint32_t)0x00008000U) /* Bit 3 */ + +/******************** Bit definition for ADC_DIFSEL register *****************/ +#define ADC_DIFSEL_DIFSEL ((uint32_t)0x000FFFFEU) /* SAMP19[3:0] bits (Differential mode for channels 19 to 1) */ +#define ADC_DIFSEL_DIFSEL_CH1 ((uint32_t)0x00000002U) /* Bit1 */ +#define ADC_DIFSEL_DIFSEL_CH2 ((uint32_t)0x00000004U) /* Bit2 */ +#define ADC_DIFSEL_DIFSEL_CH3 ((uint32_t)0x00000008U) /* Bit3 */ +#define ADC_DIFSEL_DIFSEL_CH4 ((uint32_t)0x00000010U) /* Bit4 */ +#define ADC_DIFSEL_DIFSEL_CH5 ((uint32_t)0x00000020U) /* Bit5 */ +#define ADC_DIFSEL_DIFSEL_CH6 ((uint32_t)0x00000040U) /* Bit6 */ +#define ADC_DIFSEL_DIFSEL_CH7 ((uint32_t)0x00000080U) /* Bit7 */ +#define ADC_DIFSEL_DIFSEL_CH8 ((uint32_t)0x00000100U) /* Bit8 */ +#define ADC_DIFSEL_DIFSEL_CH9 ((uint32_t)0x00000200U) /* Bit9 */ +#define ADC_DIFSEL_DIFSEL_CH10 ((uint32_t)0x00000400U) /* Bit10 */ +#define ADC_DIFSEL_DIFSEL_CH11 ((uint32_t)0x00000800U) /* Bit11 */ +#define ADC_DIFSEL_DIFSEL_CH12 ((uint32_t)0x00001000U) /* Bit12 */ +#define ADC_DIFSEL_DIFSEL_CH13 ((uint32_t)0x00002000U) /* Bit13 */ +#define ADC_DIFSEL_DIFSEL_CH14 ((uint32_t)0x00004000U) /* Bit14 */ +#define ADC_DIFSEL_DIFSEL_CH15 ((uint32_t)0x00008000U) /* Bit15 */ +#define ADC_DIFSEL_DIFSEL_CH16 ((uint32_t)0x00010000U) /* Bit16 */ +#define ADC_DIFSEL_DIFSEL_CH17 ((uint32_t)0x00020000U) /* Bit17 */ +#define ADC_DIFSEL_DIFSEL_CH18 ((uint32_t)0x00040000U) /* Bit18 */ +#define ADC_DIFSEL_DIFSEL_CH19 ((uint32_t)0x00080000U) /* Bit19 */ + +/******************** Bit definition for ADC_AWDOTIM register ***************/ +#define ADC_AWDCTRL_AWD3TIMEN ((uint32_t)0x00000004U) /* Bit[2] Analog watchdog 3 event to timer enable*/ +#define ADC_AWDCTRL_AWD2TIMEN ((uint32_t)0x00000002U) /* Bit[1] Analog watchdog 2 event to timer enable*/ +#define ADC_AWDCTRL_AWD1TIMEN ((uint32_t)0x00000001U) /* Bit[0] Analog watchdog 1 event to timer enable*/ + + +/****************** Bit definition for ADC_OFFSET1 register *******************/ +#define ADC_OFFSET1_OFFSCH1DAT ((uint32_t)0x00000FFFU) /* ADC offset number 1 offset date */ +#define ADC_OFFSET1_OFFSCH1DIR ((uint32_t)0x01000000U) /* ADC offset number 1 positive */ +#define ADC_OFFSET1_OFFSCH1SATEN ((uint32_t)0x02000000U) /* ADC offset number 1 saturation enable */ + +#define ADC_OFFSET1_OFFSCH1CH ((uint32_t)0x7C000000U) /* OFFSCH1CH[4:0] bits (ADC offset number 1 channel selection) */ +#define ADC_OFFSET1_OFFSCH1CH_0 ((uint32_t)0x04000000U) /* Bit 0 */ +#define ADC_OFFSET1_OFFSCH1CH_1 ((uint32_t)0x08000000U) /* Bit 1 */ +#define ADC_OFFSET1_OFFSCH1CH_2 ((uint32_t)0x10000000U) /* Bit 2 */ +#define ADC_OFFSET1_OFFSCH1CH_3 ((uint32_t)0x20000000U) /* Bit 3 */ +#define ADC_OFFSET1_OFFSCH1CH_4 ((uint32_t)0x40000000U) /* Bit 4 */ + +#define ADC_OFFSET1_OFFSCH1EN ((uint32_t)0x80000000U) /* ADC offset number 1 offset enable */ + +/****************** Bit definition for ADC_OFFSET2 register *******************/ +#define ADC_OFFSET2_OFFSCH2DAT ((uint32_t)0x00000FFFU) /* ADC offset number 2 offset date */ +#define ADC_OFFSET2_OFFSCH2DIR ((uint32_t)0x01000000U) /* ADC offset number 2 positive */ +#define ADC_OFFSET2_OFFSCH2SATEN ((uint32_t)0x02000000U) /* ADC offset number 2 saturation enable */ + +#define ADC_OFFSET2_OFFSCH2CH ((uint32_t)0x7C000000U) /* OFFSCH2CH[4:0] bits (ADC offset number 2 channel selection) */ +#define ADC_OFFSET2_OFFSCH2CH_0 ((uint32_t)0x04000000U) /* Bit 0 */ +#define ADC_OFFSET2_OFFSCH2CH_1 ((uint32_t)0x08000000U) /* Bit 1 */ +#define ADC_OFFSET2_OFFSCH2CH_2 ((uint32_t)0x10000000U) /* Bit 2 */ +#define ADC_OFFSET2_OFFSCH2CH_3 ((uint32_t)0x20000000U) /* Bit 3 */ +#define ADC_OFFSET2_OFFSCH2CH_4 ((uint32_t)0x40000000U) /* Bit 4 */ + +#define ADC_OFFSET2_OFFSCH2EN ((uint32_t)0x80000000U) /* ADC offset number 2 offset enable */ + +/****************** Bit definition for ADC_OFFSET3 register *******************/ +#define ADC_OFFSET3_OFFSCH3DAT ((uint32_t)0x00000FFFU) /* ADC offset number 3 offset date */ +#define ADC_OFFSET3_OFFSCH3DIR ((uint32_t)0x01000000U) /* ADC offset number 3 positive */ +#define ADC_OFFSET3_OFFSCH3SATEN ((uint32_t)0x02000000U) /* ADC offset number 3 saturation enable */ + +#define ADC_OFFSET3_OFFSCH3CH ((uint32_t)0x7C000000U) /* OFFSCH3CH[4:0] bits (ADC offset number 3 channel selection) */ +#define ADC_OFFSET3_OFFSCH3CH_0 ((uint32_t)0x04000000U) /* Bit 0 */ +#define ADC_OFFSET3_OFFSCH3CH_1 ((uint32_t)0x08000000U) /* Bit 1 */ +#define ADC_OFFSET3_OFFSCH3CH_2 ((uint32_t)0x10000000U) /* Bit 2 */ +#define ADC_OFFSET3_OFFSCH3CH_3 ((uint32_t)0x20000000U) /* Bit 3 */ +#define ADC_OFFSET3_OFFSCH3CH_4 ((uint32_t)0x40000000U) /* Bit 4 */ + +#define ADC_OFFSET3_OFFSCH3EN ((uint32_t)0x80000000U) /* ADC offset number 3 offset enable */ + +/****************** Bit definition for ADC_OFFSET4 register *******************/ +#define ADC_OFFSET4_OFFSCH4DAT ((uint32_t)0x00000FFFU) /* ADC offset number 4 offset date */ +#define ADC_OFFSET4_OFFSCH4DIR ((uint32_t)0x01000000U) /* ADC offset number 4 positive */ +#define ADC_OFFSET4_OFFSCH4SATEN ((uint32_t)0x02000000U) /* ADC offset number 4 saturation enable */ + +#define ADC_OFFSET4_OFFSCH4CH ((uint32_t)0x7C000000U) /* OFFSCH4CH[4:0] bits (ADC offset number 4 channel selection) */ +#define ADC_OFFSET4_OFFSCH4CH_0 ((uint32_t)0x04000000U) /* Bit 0 */ +#define ADC_OFFSET4_OFFSCH4CH_1 ((uint32_t)0x08000000U) /* Bit 1 */ +#define ADC_OFFSET4_OFFSCH4CH_2 ((uint32_t)0x10000000U) /* Bit 2 */ +#define ADC_OFFSET4_OFFSCH4CH_3 ((uint32_t)0x20000000U) /* Bit 3 */ +#define ADC_OFFSET4_OFFSCH4CH_4 ((uint32_t)0x40000000U) /* Bit 4 */ + +#define ADC_OFFSET4_OFFSCH1EN ((uint32_t)0x80000000U) /* ADC offset number 4 offset enable */ + +/****************** Bit definition for ADC_AWD1HIGH register *******************/ +#define ADC_AWD1HIGH_HTH ((uint32_t)0x00000FFFU) /* Analog watchdog 1 high threshold */ + +/****************** Bit definition for ADC_AWD1LOW register ********************/ +#define ADC_AWD1LOW_LTH ((uint32_t)0x00000FFFU) /* Analog watchdog 1 low threshold */ + +#define ADC_AWD1LOW_AWDFIL ((uint32_t)0x00007000U) /* AWDFIL[2:0] bits (Analog watchdog 1 Filter value) */ +#define ADC_AWD1LOW_AWDFIL_0 ((uint32_t)0x00001000U) /* Bit 0 */ +#define ADC_AWD1LOW_AWDFIL_1 ((uint32_t)0x00002000U) /* Bit 1 */ +#define ADC_AWD1LOW_AWDFIL_2 ((uint32_t)0x00004000U) /* Bit 2 */ + +/******************* Bit definition for ADC_AWD2HIGH register *****************/ +#define ADC_AWD2HIGH_HTH ((uint32_t)0x00000FFFU) /* Analog watchdog 2 high threshold */ + +/******************* Bit definition for ADC_AWD2LOW register ******************/ +#define ADC_AWD2LOW_LTH ((uint32_t)0x00000FFFU) /* Analog watchdog 2 low threshold */ + +/******************* Bit definition for ADC_AWD3HIGH register *****************/ +#define ADC_AWD3HIGH_HTH ((uint32_t)0x00000FFFU) /* Analog watchdog 3 high threshold */ + +/******************* Bit definition for ADC_AWD3LOW register ******************/ +#define ADC_AWD3LOW_LTH ((uint32_t)0x00000FFFU) /* Analog watchdog 3 low threshold */ + +/******************** Bit definition for ADC_AWD2EN register ****************/ +#define ADC_AWD2EN_AWD2EN ((uint32_t)0x000FFFFFU) /* AWD2EN[19:0] bits (ADC analog watchdog 2 monitored channel selection) */ +#define ADC_AWD2EN_AWD2EN_CH0 ((uint32_t)0x00000001U) /* ADC analog watchdog 2 monitored channel 0 */ +#define ADC_AWD2EN_AWD2EN_CH1 ((uint32_t)0x00000002U) /* ADC analog watchdog 2 monitored channel 1 */ +#define ADC_AWD2EN_AWD2EN_CH2 ((uint32_t)0x00000004U) /* ADC analog watchdog 2 monitored channel 2 */ +#define ADC_AWD2EN_AWD2EN_CH3 ((uint32_t)0x00000008U) /* ADC analog watchdog 2 monitored channel 3 */ +#define ADC_AWD2EN_AWD2EN_CH4 ((uint32_t)0x00000010U) /* ADC analog watchdog 2 monitored channel 4 */ +#define ADC_AWD2EN_AWD2EN_CH5 ((uint32_t)0x00000020U) /* ADC analog watchdog 2 monitored channel 5 */ +#define ADC_AWD2EN_AWD2EN_CH6 ((uint32_t)0x00000040U) /* ADC analog watchdog 2 monitored channel 6 */ +#define ADC_AWD2EN_AWD2EN_CH7 ((uint32_t)0x00000080U) /* ADC analog watchdog 2 monitored channel 7 */ +#define ADC_AWD2EN_AWD2EN_CH8 ((uint32_t)0x00000100U) /* ADC analog watchdog 2 monitored channel 8 */ +#define ADC_AWD2EN_AWD2EN_CH9 ((uint32_t)0x00000200U) /* ADC analog watchdog 2 monitored channel 9 */ +#define ADC_AWD2EN_AWD2EN_CH10 ((uint32_t)0x00000400U) /* ADC analog watchdog 2 monitored channel 10 */ +#define ADC_AWD2EN_AWD2EN_CH11 ((uint32_t)0x00000800U) /* ADC analog watchdog 2 monitored channel 11 */ +#define ADC_AWD2EN_AWD2EN_CH12 ((uint32_t)0x00001000U) /* ADC analog watchdog 2 monitored channel 12 */ +#define ADC_AWD2EN_AWD2EN_CH13 ((uint32_t)0x00002000U) /* ADC analog watchdog 2 monitored channel 13 */ +#define ADC_AWD2EN_AWD2EN_CH14 ((uint32_t)0x00004000U) /* ADC analog watchdog 2 monitored channel 14 */ +#define ADC_AWD2EN_AWD2EN_CH15 ((uint32_t)0x00008000U) /* ADC analog watchdog 2 monitored channel 15 */ +#define ADC_AWD2EN_AWD2EN_CH16 ((uint32_t)0x00010000U) /* ADC analog watchdog 2 monitored channel 16 */ +#define ADC_AWD2EN_AWD2EN_CH17 ((uint32_t)0x00020000U) /* ADC analog watchdog 2 monitored channel 17 */ +#define ADC_AWD2EN_AWD2EN_CH18 ((uint32_t)0x00040000U) /* ADC analog watchdog 2 monitored channel 18 */ +#define ADC_AWD2EN_AWD2EN_CH19 ((uint32_t)0x00080000U) /* ADC analog watchdog 2 monitored channel 19 */ + +/******************** Bit definition for ADC_AWD3EN register ****************/ +#define ADC_AWD3EN_AWD3EN ((uint32_t)0x000FFFFFU) /* AWD3EN[19:0] bits (ADC analog watchdog 3 monitored channel selection) */ +#define ADC_AWD3EN_AWD3EN_CH0 ((uint32_t)0x00000001U) /* ADC analog watchdog 3 monitored channel 0 */ +#define ADC_AWD3EN_AWD3EN_CH1 ((uint32_t)0x00000002U) /* ADC analog watchdog 3 monitored channel 1 */ +#define ADC_AWD3EN_AWD3EN_CH2 ((uint32_t)0x00000004U) /* ADC analog watchdog 3 monitored channel 2 */ +#define ADC_AWD3EN_AWD3EN_CH3 ((uint32_t)0x00000008U) /* ADC analog watchdog 3 monitored channel 3 */ +#define ADC_AWD3EN_AWD3EN_CH4 ((uint32_t)0x00000010U) /* ADC analog watchdog 3 monitored channel 4 */ +#define ADC_AWD3EN_AWD3EN_CH5 ((uint32_t)0x00000020U) /* ADC analog watchdog 3 monitored channel 5 */ +#define ADC_AWD3EN_AWD3EN_CH6 ((uint32_t)0x00000040U) /* ADC analog watchdog 3 monitored channel 6 */ +#define ADC_AWD3EN_AWD3EN_CH7 ((uint32_t)0x00000080U) /* ADC analog watchdog 3 monitored channel 7 */ +#define ADC_AWD3EN_AWD3EN_CH8 ((uint32_t)0x00000100U) /* ADC analog watchdog 3 monitored channel 8 */ +#define ADC_AWD3EN_AWD3EN_CH9 ((uint32_t)0x00000200U) /* ADC analog watchdog 3 monitored channel 9 */ +#define ADC_AWD3EN_AWD3EN_CH10 ((uint32_t)0x00000400U) /* ADC analog watchdog 3 monitored channel 10 */ +#define ADC_AWD3EN_AWD3EN_CH11 ((uint32_t)0x00000800U) /* ADC analog watchdog 3 monitored channel 11 */ +#define ADC_AWD3EN_AWD3EN_CH12 ((uint32_t)0x00001000U) /* ADC analog watchdog 3 monitored channel 12 */ +#define ADC_AWD3EN_AWD3EN_CH13 ((uint32_t)0x00002000U) /* ADC analog watchdog 3 monitored channel 13 */ +#define ADC_AWD3EN_AWD3EN_CH14 ((uint32_t)0x00004000U) /* ADC analog watchdog 3 monitored channel 14 */ +#define ADC_AWD3EN_AWD3EN_CH15 ((uint32_t)0x00008000U) /* ADC analog watchdog 3 monitored channel 15 */ +#define ADC_AWD3EN_AWD3EN_CH16 ((uint32_t)0x00010000U) /* ADC analog watchdog 3 monitored channel 16 */ +#define ADC_AWD3EN_AWD3EN_CH17 ((uint32_t)0x00020000U) /* ADC analog watchdog 3 monitored channel 17 */ +#define ADC_AWD3EN_AWD3EN_CH18 ((uint32_t)0x00040000U) /* ADC analog watchdog 3 monitored channel 18 */ +#define ADC_AWD3EN_AWD3EN_CH19 ((uint32_t)0x00080000U) /* ADC analog watchdog 3 monitored channel 19 */ + +/******************** Bit definition for ADC_AWD2INTEN register ****************/ +#define ADC_AWD2INTEN ((uint32_t)0x000FFFFFU) /* AWD2INTEN[19:0] bits (ADC analog watchdog 2 channel interrupt enable) */ +#define ADC_AWD2INTEN_CH0 ((uint32_t)0x00000001U) /* ADC analog watchdog 2 channel0 interrupt enable */ +#define ADC_AWD2INTEN_CH1 ((uint32_t)0x00000002U) /* ADC analog watchdog 2 channel1 interrupt enable */ +#define ADC_AWD2INTEN_CH2 ((uint32_t)0x00000004U) /* ADC analog watchdog 2 channel2 interrupt enable */ +#define ADC_AWD2INTEN_CH3 ((uint32_t)0x00000008U) /* ADC analog watchdog 2 channel3 interrupt enable */ +#define ADC_AWD2INTEN_CH4 ((uint32_t)0x00000010U) /* ADC analog watchdog 2 channel4 interrupt enable */ +#define ADC_AWD2INTEN_CH5 ((uint32_t)0x00000020U) /* ADC analog watchdog 2 channel5 interrupt enable */ +#define ADC_AWD2INTEN_CH6 ((uint32_t)0x00000040U) /* ADC analog watchdog 2 channel6 interrupt enable */ +#define ADC_AWD2INTEN_CH7 ((uint32_t)0x00000080U) /* ADC analog watchdog 2 channel7 interrupt enable */ +#define ADC_AWD2INTEN_CH8 ((uint32_t)0x00000100U) /* ADC analog watchdog 2 channel8 interrupt enable */ +#define ADC_AWD2INTEN_CH9 ((uint32_t)0x00000200U) /* ADC analog watchdog 2 channel9 interrupt enable */ +#define ADC_AWD2INTEN_CH10 ((uint32_t)0x00000400U) /* ADC analog watchdog 2 channel10 interrupt enable */ +#define ADC_AWD2INTEN_CH11 ((uint32_t)0x00000800U) /* ADC analog watchdog 2 channel11 interrupt enable */ +#define ADC_AWD2INTEN_CH12 ((uint32_t)0x00001000U) /* ADC analog watchdog 2 channel12 interrupt enable */ +#define ADC_AWD2INTEN_CH13 ((uint32_t)0x00002000U) /* ADC analog watchdog 2 channel13 interrupt enable */ +#define ADC_AWD2INTEN_CH14 ((uint32_t)0x00004000U) /* ADC analog watchdog 2 channel14 interrupt enable */ +#define ADC_AWD2INTEN_CH15 ((uint32_t)0x00008000U) /* ADC analog watchdog 2 channel15 interrupt enable */ +#define ADC_AWD2INTEN_CH16 ((uint32_t)0x00010000U) /* ADC analog watchdog 2 channel16 interrupt enable */ +#define ADC_AWD2INTEN_CH17 ((uint32_t)0x00020000U) /* ADC analog watchdog 2 channel17 interrupt enable */ +#define ADC_AWD2INTEN_CH18 ((uint32_t)0x00040000U) /* ADC analog watchdog 2 channel18 interrupt enable */ +#define ADC_AWD2INTEN_CH19 ((uint32_t)0x00080000U) /* ADC analog watchdog 2 channel19 interrupt enable */ + +/******************** Bit definition for ADC_AWD3EN register ****************/ +#define ADC_AWD3INTEN ((uint32_t)0x000FFFFFU) /* AWD3INTEN[19:0] bits (ADC analog watchdog 3 channel interrupt enable) */ +#define ADC_AWD3INTEN_CH0 ((uint32_t)0x00000001U) /* ADC analog watchdog 3 channel0 interrupt enable */ +#define ADC_AWD3INTEN_CH1 ((uint32_t)0x00000002U) /* ADC analog watchdog 3 channel1 interrupt enable */ +#define ADC_AWD3INTEN_CH2 ((uint32_t)0x00000004U) /* ADC analog watchdog 3 channel2 interrupt enable */ +#define ADC_AWD3INTEN_CH3 ((uint32_t)0x00000008U) /* ADC analog watchdog 3 channel3 interrupt enable */ +#define ADC_AWD3INTEN_CH4 ((uint32_t)0x00000010U) /* ADC analog watchdog 3 channel4 interrupt enable */ +#define ADC_AWD3INTEN_CH5 ((uint32_t)0x00000020U) /* ADC analog watchdog 3 channel5 interrupt enable */ +#define ADC_AWD3INTEN_CH6 ((uint32_t)0x00000040U) /* ADC analog watchdog 3 channel6 interrupt enable */ +#define ADC_AWD3INTEN_CH7 ((uint32_t)0x00000080U) /* ADC analog watchdog 3 channel7 interrupt enable */ +#define ADC_AWD3INTEN_CH8 ((uint32_t)0x00000100U) /* ADC analog watchdog 3 channel8 interrupt enable */ +#define ADC_AWD3INTEN_CH9 ((uint32_t)0x00000200U) /* ADC analog watchdog 3 channel9 interrupt enable */ +#define ADC_AWD3INTEN_CH10 ((uint32_t)0x00000400U) /* ADC analog watchdog 3 channel10 interrupt enable */ +#define ADC_AWD3INTEN_CH11 ((uint32_t)0x00000800U) /* ADC analog watchdog 3 channel11 interrupt enable */ +#define ADC_AWD3INTEN_CH12 ((uint32_t)0x00001000U) /* ADC analog watchdog 3 channel12 interrupt enable */ +#define ADC_AWD3INTEN_CH13 ((uint32_t)0x00002000U) /* ADC analog watchdog 3 channel13 interrupt enable */ +#define ADC_AWD3INTEN_CH14 ((uint32_t)0x00004000U) /* ADC analog watchdog 3 channel14 interrupt enable */ +#define ADC_AWD3INTEN_CH15 ((uint32_t)0x00008000U) /* ADC analog watchdog 3 channel15 interrupt enable */ +#define ADC_AWD3INTEN_CH16 ((uint32_t)0x00010000U) /* ADC analog watchdog 3 channel16 interrupt enable */ +#define ADC_AWD3INTEN_CH17 ((uint32_t)0x00020000U) /* ADC analog watchdog 3 channel17 interrupt enable */ +#define ADC_AWD3INTEN_CH18 ((uint32_t)0x00040000U) /* ADC analog watchdog 3 channel18 interrupt enable */ +#define ADC_AWD3INTEN_CH19 ((uint32_t)0x00080000U) /* ADC analog watchdog 3 channel19 interrupt enable */ + +/******************** Bit definition for ADC_AWD2STS register ****************/ +#define ADC_AWD2STS ((uint32_t)0x000FFFFFU) /* AWD2FLAG[18:0] bits (ADC analog watchdog 2 status flag) */ +#define ADC_AWD2STS_AWD2FLAG_CH0 ((uint32_t)0x00000001U) /* ADC analog watchdog 2 channel0 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH1 ((uint32_t)0x00000002U) /* ADC analog watchdog 2 channel1 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH2 ((uint32_t)0x00000004U) /* ADC analog watchdog 2 channel2 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH3 ((uint32_t)0x00000008U) /* ADC analog watchdog 2 channel3 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH4 ((uint32_t)0x00000010U) /* ADC analog watchdog 2 channel4 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH5 ((uint32_t)0x00000020U) /* ADC analog watchdog 2 channel5 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH6 ((uint32_t)0x00000040U) /* ADC analog watchdog 2 channel6 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH7 ((uint32_t)0x00000080U) /* ADC analog watchdog 2 channel7 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH8 ((uint32_t)0x00000100U) /* ADC analog watchdog 2 channel8 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH9 ((uint32_t)0x00000200U) /* ADC analog watchdog 2 channel9 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH10 ((uint32_t)0x00000400U) /* ADC analog watchdog 2 channel10 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH11 ((uint32_t)0x00000800U) /* ADC analog watchdog 2 channel11 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH12 ((uint32_t)0x00001000U) /* ADC analog watchdog 2 channel12 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH13 ((uint32_t)0x00002000U) /* ADC analog watchdog 2 channel13 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH14 ((uint32_t)0x00004000U) /* ADC analog watchdog 2 channel14 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH15 ((uint32_t)0x00008000U) /* ADC analog watchdog 2 channel15 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH16 ((uint32_t)0x00010000U) /* ADC analog watchdog 2 channel16 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH17 ((uint32_t)0x00020000U) /* ADC analog watchdog 2 channel17 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH18 ((uint32_t)0x00040000U) /* ADC analog watchdog 2 channel18 status flag */ +#define ADC_AWD2STS_AWD2FLAG_CH19 ((uint32_t)0x00080000U) /* ADC analog watchdog 2 channel19 status flag */ + +/******************** Bit definition for ADC_AWD3STS register ****************/ +#define ADC_AWD3STS ((uint32_t)0x000FFFFFU) /* AWD3FLAG[19:0] bits (ADC analog watchdog 3 status flag) */ +#define ADC_AWD3STS_AWD3FLAG_CH0 ((uint32_t)0x00000001U) /* ADC analog watchdog 3 channel0 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH1 ((uint32_t)0x00000002U) /* ADC analog watchdog 3 channel1 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH2 ((uint32_t)0x00000004U) /* ADC analog watchdog 3 channel2 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH3 ((uint32_t)0x00000008U) /* ADC analog watchdog 3 channel3 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH4 ((uint32_t)0x00000010U) /* ADC analog watchdog 3 channel4 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH5 ((uint32_t)0x00000020U) /* ADC analog watchdog 3 channel5 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH6 ((uint32_t)0x00000040U) /* ADC analog watchdog 3 channel6 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH7 ((uint32_t)0x00000080U) /* ADC analog watchdog 3 channel7 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH8 ((uint32_t)0x00000100U) /* ADC analog watchdog 3 channel8 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH9 ((uint32_t)0x00000200U) /* ADC analog watchdog 3 channel9 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH10 ((uint32_t)0x00000400U) /* ADC analog watchdog 3 channel10 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH11 ((uint32_t)0x00000800U) /* ADC analog watchdog 3 channel11 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH12 ((uint32_t)0x00001000U) /* ADC analog watchdog 3 channel12 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH13 ((uint32_t)0x00002000U) /* ADC analog watchdog 3 channel13 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH14 ((uint32_t)0x00004000U) /* ADC analog watchdog 3 channel14 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH15 ((uint32_t)0x00008000U) /* ADC analog watchdog 3 channel15 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH16 ((uint32_t)0x00010000U) /* ADC analog watchdog 3 channel16 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH17 ((uint32_t)0x00020000U) /* ADC analog watchdog 3 channel17 status flag */ +#define ADC_AWD3STS_AWD3FLAG_CH18 ((uint32_t)0x00040000U) /* ADC analog watchdog 3 channel18 status flag */ +#define ADC_AWD2STS_AWD3FLAG_CH19 ((uint32_t)0x00080000U) /* ADC analog watchdog 3 channel19 status flag */ + +/******************* Bit definition for ADC_RSEQ1 register *******************/ +#define ADC_RSEQ1_SEQ19 ((uint32_t)0x0000001FU) /* SEQ19[4:0] bits (19th conversion in regular sequence) */ +#define ADC_RSEQ1_SEQ19_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define ADC_RSEQ1_SEQ19_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define ADC_RSEQ1_SEQ19_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define ADC_RSEQ1_SEQ19_3 ((uint32_t)0x00000008U) /* Bit 3 */ +#define ADC_RSEQ1_SEQ19_4 ((uint32_t)0x00000010U) /* Bit 4 */ + +#define ADC_RSEQ1_SEQ20 ((uint32_t)0x000003E0U) /* SEQ20[4:0] bits (20th conversion in regular sequence) */ +#define ADC_RSEQ1_SEQ20_0 ((uint32_t)0x00000020U) /* Bit 0 */ +#define ADC_RSEQ1_SEQ20_1 ((uint32_t)0x00000040U) /* Bit 1 */ +#define ADC_RSEQ1_SEQ20_2 ((uint32_t)0x00000080U) /* Bit 2 */ +#define ADC_RSEQ1_SEQ20_3 ((uint32_t)0x00000100U) /* Bit 3 */ +#define ADC_RSEQ1_SEQ20_4 ((uint32_t)0x00000200U) /* Bit 4 */ + +#define ADC_RSEQ1_LEN ((uint32_t)0x00007C00U) /* LEN[4:0] bits (Regular channel sequence length) */ +#define ADC_RSEQ1_LEN_0 ((uint32_t)0x00000400U) /* Bit 0 */ +#define ADC_RSEQ1_LEN_1 ((uint32_t)0x00000800U) /* Bit 1 */ +#define ADC_RSEQ1_LEN_2 ((uint32_t)0x00001000U) /* Bit 2 */ +#define ADC_RSEQ1_LEN_3 ((uint32_t)0x00002000U) /* Bit 3 */ +#define ADC_RSEQ1_LEN_4 ((uint32_t)0x00004000U) /* Bit 4 */ + +/******************* Bit definition for ADC_RSEQ2 register *******************/ +#define ADC_RSEQ2_SEQ13 ((uint32_t)0x0000001FU) /* SEQ13[4:0] bits (13th conversion in regular sequence) */ +#define ADC_RSEQ2_SEQ13_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define ADC_RSEQ2_SEQ13_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define ADC_RSEQ2_SEQ13_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define ADC_RSEQ2_SEQ13_3 ((uint32_t)0x00000008U) /* Bit 3 */ +#define ADC_RSEQ2_SEQ13_4 ((uint32_t)0x00000010U) /* Bit 4 */ + +#define ADC_RSEQ2_SEQ14 ((uint32_t)0x000003E0U) /* SEQ14[4:0] bits (14th conversion in regular sequence) */ +#define ADC_RSEQ2_SEQ14_0 ((uint32_t)0x00000020U) /* Bit 0 */ +#define ADC_RSEQ2_SEQ14_1 ((uint32_t)0x00000040U) /* Bit 1 */ +#define ADC_RSEQ2_SEQ14_2 ((uint32_t)0x00000080U) /* Bit 2 */ +#define ADC_RSEQ2_SEQ14_3 ((uint32_t)0x00000100U) /* Bit 3 */ +#define ADC_RSEQ2_SEQ14_4 ((uint32_t)0x00000200U) /* Bit 4 */ + +#define ADC_RSEQ2_SEQ15 ((uint32_t)0x00007C00U) /* SEQ15[4:0] bits (15th conversion in regular sequence) */ +#define ADC_RSEQ2_SEQ15_0 ((uint32_t)0x00000400U) /* Bit 0 */ +#define ADC_RSEQ2_SEQ15_1 ((uint32_t)0x00000800U) /* Bit 1 */ +#define ADC_RSEQ2_SEQ15_2 ((uint32_t)0x00001000U) /* Bit 2 */ +#define ADC_RSEQ2_SEQ15_3 ((uint32_t)0x00002000U) /* Bit 3 */ +#define ADC_RSEQ2_SEQ15_4 ((uint32_t)0x00004000U) /* Bit 4 */ + +#define ADC_RSEQ2_SEQ16 ((uint32_t)0x000F8000U) /* SEQ16[4:0] bits (16th conversion in regular sequence) */ +#define ADC_RSEQ2_SEQ16_0 ((uint32_t)0x00008000U) /* Bit 0 */ +#define ADC_RSEQ2_SEQ16_1 ((uint32_t)0x00010000U) /* Bit 1 */ +#define ADC_RSEQ2_SEQ16_2 ((uint32_t)0x00020000U) /* Bit 2 */ +#define ADC_RSEQ2_SEQ16_3 ((uint32_t)0x00040000U) /* Bit 3 */ +#define ADC_RSEQ2_SEQ16_4 ((uint32_t)0x00080000U) /* Bit 4 */ + +#define ADC_RSEQ2_SEQ17 ((uint32_t)0x01F00000U) /* SEQ17[4:0] bits (17th conversion in regular sequence) */ +#define ADC_RSEQ2_SEQ17_0 ((uint32_t)0x00100000U) /* Bit 0 */ +#define ADC_RSEQ2_SEQ17_1 ((uint32_t)0x00200000U) /* Bit 1 */ +#define ADC_RSEQ2_SEQ17_2 ((uint32_t)0x00400000U) /* Bit 2 */ +#define ADC_RSEQ2_SEQ17_3 ((uint32_t)0x00800000U) /* Bit 3 */ +#define ADC_RSEQ2_SEQ17_4 ((uint32_t)0x01000000U) /* Bit 4 */ + +#define ADC_RSEQ2_SEQ18 ((uint32_t)0x3E000000U) /* SEQ18[4:0] bits (18th conversion in regular sequence) */ +#define ADC_RSEQ2_SEQ18_0 ((uint32_t)0x02000000U) /* Bit 0 */ +#define ADC_RSEQ2_SEQ18_1 ((uint32_t)0x04000000U) /* Bit 1 */ +#define ADC_RSEQ2_SEQ18_2 ((uint32_t)0x08000000U) /* Bit 2 */ +#define ADC_RSEQ2_SEQ18_3 ((uint32_t)0x10000000U) /* Bit 3 */ +#define ADC_RSEQ2_SEQ18_4 ((uint32_t)0x20000000U) /* Bit 4 */ + +/******************* Bit definition for ADC_RSEQ3 register *******************/ +#define ADC_RSEQ3_SEQ7 ((uint32_t)0x0000001FU) /* SEQ7[4:0] bits (7th conversion in regular sequence) */ +#define ADC_RSEQ3_SEQ7_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define ADC_RSEQ3_SEQ7_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define ADC_RSEQ3_SEQ7_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define ADC_RSEQ3_SEQ7_3 ((uint32_t)0x00000008U) /* Bit 3 */ +#define ADC_RSEQ3_SEQ7_4 ((uint32_t)0x00000010U) /* Bit 4 */ + +#define ADC_RSEQ3_SEQ8 ((uint32_t)0x000003E0U) /* SEQ8[4:0] bits (8th conversion in regular sequence) */ +#define ADC_RSEQ3_SEQ8_0 ((uint32_t)0x00000020U) /* Bit 0 */ +#define ADC_RSEQ3_SEQ8_1 ((uint32_t)0x00000040U) /* Bit 1 */ +#define ADC_RSEQ3_SEQ8_2 ((uint32_t)0x00000080U) /* Bit 2 */ +#define ADC_RSEQ3_SEQ8_3 ((uint32_t)0x00000100U) /* Bit 3 */ +#define ADC_RSEQ3_SEQ8_4 ((uint32_t)0x00000200U) /* Bit 4 */ + +#define ADC_RSEQ3_SEQ9 ((uint32_t)0x00007C00U) /* SEQ9[4:0] bits (9th conversion in regular sequence) */ +#define ADC_RSEQ3_SEQ9_0 ((uint32_t)0x00000400U) /* Bit 0 */ +#define ADC_RSEQ3_SEQ9_1 ((uint32_t)0x00000800U) /* Bit 1 */ +#define ADC_RSEQ3_SEQ9_2 ((uint32_t)0x00001000U) /* Bit 2 */ +#define ADC_RSEQ3_SEQ9_3 ((uint32_t)0x00002000U) /* Bit 3 */ +#define ADC_RSEQ3_SEQ9_4 ((uint32_t)0x00004000U) /* Bit 4 */ + +#define ADC_RSEQ3_SEQ10 ((uint32_t)0x000F8000U) /* SEQ10[4:0] bits (10th conversion in regular sequence) */ +#define ADC_RSEQ3_SEQ10_0 ((uint32_t)0x00008000U) /* Bit 0 */ +#define ADC_RSEQ3_SEQ10_1 ((uint32_t)0x00010000U) /* Bit 1 */ +#define ADC_RSEQ3_SEQ10_2 ((uint32_t)0x00020000U) /* Bit 2 */ +#define ADC_RSEQ3_SEQ10_3 ((uint32_t)0x00040000U) /* Bit 3 */ +#define ADC_RSEQ3_SEQ10_4 ((uint32_t)0x00080000U) /* Bit 4 */ + +#define ADC_RSEQ3_SEQ11 ((uint32_t)0x01F00000U) /* SEQ11[4:0] bits (11th conversion in regular sequence) */ +#define ADC_RSEQ3_SEQ11_0 ((uint32_t)0x00100000U) /* Bit 0 */ +#define ADC_RSEQ3_SEQ11_1 ((uint32_t)0x00200000U) /* Bit 1 */ +#define ADC_RSEQ3_SEQ11_2 ((uint32_t)0x00400000U) /* Bit 2 */ +#define ADC_RSEQ3_SEQ11_3 ((uint32_t)0x00800000U) /* Bit 3 */ +#define ADC_RSEQ3_SEQ11_4 ((uint32_t)0x01000000U) /* Bit 4 */ + +#define ADC_RSEQ3_SEQ12 ((uint32_t)0x3E000000U) /* SEQ12[4:0] bits (12th conversion in regular sequence) */ +#define ADC_RSEQ3_SEQ12_0 ((uint32_t)0x02000000U) /* Bit 0 */ +#define ADC_RSEQ3_SEQ12_1 ((uint32_t)0x04000000U) /* Bit 1 */ +#define ADC_RSEQ3_SEQ12_2 ((uint32_t)0x08000000U) /* Bit 2 */ +#define ADC_RSEQ3_SEQ12_3 ((uint32_t)0x10000000U) /* Bit 3 */ +#define ADC_RSEQ3_SEQ12_4 ((uint32_t)0x20000000U) /* Bit 4 */ + +/******************* Bit definition for ADC_RSEQ4 register *******************/ +#define ADC_RSEQ4_SEQ1 ((uint32_t)0x0000001FU) /* SEQ1[4:0] bits (1st conversion in regular sequence) */ +#define ADC_RSEQ4_SEQ1_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define ADC_RSEQ4_SEQ1_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define ADC_RSEQ4_SEQ1_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define ADC_RSEQ4_SEQ1_3 ((uint32_t)0x00000008U) /* Bit 3 */ +#define ADC_RSEQ4_SEQ1_4 ((uint32_t)0x00000010U) /* Bit 4 */ + +#define ADC_RSEQ4_SEQ2 ((uint32_t)0x000003E0U) /* SEQ2[4:0] bits (2nd conversion in regular sequence) */ +#define ADC_RSEQ4_SEQ2_0 ((uint32_t)0x00000020U) /* Bit 0 */ +#define ADC_RSEQ4_SEQ2_1 ((uint32_t)0x00000040U) /* Bit 1 */ +#define ADC_RSEQ4_SEQ2_2 ((uint32_t)0x00000080U) /* Bit 2 */ +#define ADC_RSEQ4_SEQ2_3 ((uint32_t)0x00000100U) /* Bit 3 */ +#define ADC_RSEQ4_SEQ2_4 ((uint32_t)0x00000200U) /* Bit 4 */ + +#define ADC_RSEQ4_SEQ3 ((uint32_t)0x00007C00U) /* SEQ3[4:0] bits (3rd conversion in regular sequence) */ +#define ADC_RSEQ4_SEQ3_0 ((uint32_t)0x00000400U) /* Bit 0 */ +#define ADC_RSEQ4_SEQ3_1 ((uint32_t)0x00000800U) /* Bit 1 */ +#define ADC_RSEQ4_SEQ3_2 ((uint32_t)0x00001000U) /* Bit 2 */ +#define ADC_RSEQ4_SEQ3_3 ((uint32_t)0x00002000U) /* Bit 3 */ +#define ADC_RSEQ4_SEQ3_4 ((uint32_t)0x00004000U) /* Bit 4 */ + +#define ADC_RSEQ4_SEQ4 ((uint32_t)0x000F8000U) /* SEQ4[4:0] bits (4th conversion in regular sequence) */ +#define ADC_RSEQ4_SEQ4_0 ((uint32_t)0x00008000U) /* Bit 0 */ +#define ADC_RSEQ4_SEQ4_1 ((uint32_t)0x00010000U) /* Bit 1 */ +#define ADC_RSEQ4_SEQ4_2 ((uint32_t)0x00020000U) /* Bit 2 */ +#define ADC_RSEQ4_SEQ4_3 ((uint32_t)0x00040000U) /* Bit 3 */ +#define ADC_RSEQ4_SEQ4_4 ((uint32_t)0x00080000U) /* Bit 4 */ + +#define ADC_RSEQ4_SEQ5 ((uint32_t)0x01F00000U) /* SEQ5[4:0] bits (5th conversion in regular sequence) */ +#define ADC_RSEQ4_SEQ5_0 ((uint32_t)0x00100000U) /* Bit 0 */ +#define ADC_RSEQ4_SEQ5_1 ((uint32_t)0x00200000U) /* Bit 1 */ +#define ADC_RSEQ4_SEQ5_2 ((uint32_t)0x00400000U) /* Bit 2 */ +#define ADC_RSEQ4_SEQ5_3 ((uint32_t)0x00800000U) /* Bit 3 */ +#define ADC_RSEQ4_SEQ5_4 ((uint32_t)0x01000000U) /* Bit 4 */ + +#define ADC_RSEQ4_SEQ6 ((uint32_t)0x3E000000U) /* SEQ6[4:0] bits (6th conversion in regular sequence) */ +#define ADC_RSEQ4_SEQ6_0 ((uint32_t)0x02000000U) /* Bit 0 */ +#define ADC_RSEQ4_SEQ6_1 ((uint32_t)0x04000000U) /* Bit 1 */ +#define ADC_RSEQ4_SEQ6_2 ((uint32_t)0x08000000U) /* Bit 2 */ +#define ADC_RSEQ4_SEQ6_3 ((uint32_t)0x10000000U) /* Bit 3 */ +#define ADC_RSEQ4_SEQ6_4 ((uint32_t)0x20000000U) /* Bit 4 */ + +/******************* Bit definition for ADC_JSEQ register *******************/ +#define ADC_JSEQ_JSEQ1 ((uint32_t)0x0000001FU) /* JSEQ1[4:0] bits (1st conversion in injected sequence) */ +#define ADC_JSEQ_JSEQ1_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define ADC_JSEQ_JSEQ1_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define ADC_JSEQ_JSEQ1_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define ADC_JSEQ_JSEQ1_3 ((uint32_t)0x00000008U) /* Bit 3 */ +#define ADC_JSEQ_JSEQ1_4 ((uint32_t)0x00000010U) /* Bit 4 */ + +#define ADC_JSEQ_JSEQ2 ((uint32_t)0x000003E0U) /* JSEQ2[4:0] bits (2nd conversion in injected sequence) */ +#define ADC_JSEQ_JSEQ2_0 ((uint32_t)0x00000020U) /* Bit 0 */ +#define ADC_JSEQ_JSEQ2_1 ((uint32_t)0x00000040U) /* Bit 1 */ +#define ADC_JSEQ_JSEQ2_2 ((uint32_t)0x00000080U) /* Bit 2 */ +#define ADC_JSEQ_JSEQ2_3 ((uint32_t)0x00000100U) /* Bit 3 */ +#define ADC_JSEQ_JSEQ2_4 ((uint32_t)0x00000200U) /* Bit 4 */ + +#define ADC_JSEQ_JSEQ3 ((uint32_t)0x00007C00U) /* JSEQ3[4:0] bits (3rd conversion in injected sequence) */ +#define ADC_JSEQ_JSEQ3_0 ((uint32_t)0x00000400U) /* Bit 0 */ +#define ADC_JSEQ_JSEQ3_1 ((uint32_t)0x00000800U) /* Bit 1 */ +#define ADC_JSEQ_JSEQ3_2 ((uint32_t)0x00001000U) /* Bit 2 */ +#define ADC_JSEQ_JSEQ3_3 ((uint32_t)0x00002000U) /* Bit 3 */ +#define ADC_JSEQ_JSEQ3_4 ((uint32_t)0x00004000U) /* Bit 4 */ + +#define ADC_JSEQ_JSEQ4 ((uint32_t)0x000F8000U) /* JSEQ4[4:0] bits (4th conversion in injected sequence) */ +#define ADC_JSEQ_JSEQ4_0 ((uint32_t)0x00008000U) /* Bit 0 */ +#define ADC_JSEQ_JSEQ4_1 ((uint32_t)0x00010000U) /* Bit 1 */ +#define ADC_JSEQ_JSEQ4_2 ((uint32_t)0x00020000U) /* Bit 2 */ +#define ADC_JSEQ_JSEQ4_3 ((uint32_t)0x00040000U) /* Bit 3 */ +#define ADC_JSEQ_JSEQ4_4 ((uint32_t)0x00080000U) /* Bit 4 */ + +#define ADC_JSEQ_JLEN ((uint32_t)0x06000000U) /* JLEN[1:0] bits (Injected Sequence length) */ +#define ADC_JSEQ_JLEN_0 ((uint32_t)0x02000000U) /* Bit 0 */ +#define ADC_JSEQ_JLEN_1 ((uint32_t)0x04000000U) /* Bit 1 */ + +/******************* Bit definition for ADC_JDAT1 register *******************/ +#define ADC_JDAT1_JDAT ((uint16_t)0xFFFFU) /* Injected data */ + +/******************* Bit definition for ADC_JDAT2 register *******************/ +#define ADC_JDAT2_JDAT ((uint16_t)0xFFFFU) /* Injected data */ + +/******************* Bit definition for ADC_JDAT3 register *******************/ +#define ADC_JDAT3_JDAT ((uint16_t)0xFFFFU) /* Injected data */ + +/******************* Bit definition for ADC_JDAT4 register *******************/ +#define ADC_JDAT4_JDAT ((uint16_t)0xFFFFU) /* Injected data */ + +/******************** Bit definition for ADC_DAT register ********************/ +#define ADC_DAT_DAT ((uint32_t)0x0000FFFFU) /* Regular data */ +#define ADC_DAT_ADC2DAT ((uint32_t)0xFFFF0000U) /* Slave ADC data when operating on Muti-ADC */ + +/******************** Bit definition for ADC_FIFOCFG register ********************/ +#define ADC_FIFOCFG_FINTEN ((uint32_t)0x00000004U) /* FIFO full interrup enable */ +#define ADC_FIFOCFG_EINTEN ((uint32_t)0x00000008U) /* FIFO empty interrup enable */ +#define ADC_FIFOCFG_HFINTEN ((uint32_t)0x00000010U) /* FIFO half-full interrup enable */ +#define ADC_FIFOCFG_EN ((uint32_t)0x00000020U) /* FIFO enable */ + +#define ADC_FIFOCFG_WL ((uint32_t)0x000003C0U) /* WL[1:0] bits (FIFO water level) */ +#define ADC_FIFOCFG_WL_0 ((uint32_t)0x00000040U) /* Bit 0 */ +#define ADC_FIFOCFG_WL_1 ((uint32_t)0x00000080U) /* Bit 1 */ +#define ADC_FIFOCFG_WL_2 ((uint32_t)0x00000100U) /* Bit 2 */ +#define ADC_FIFOCFG_WL_3 ((uint32_t)0x00000200U) /* Bit 3 */ + +#define ADC_FIFOCFG_CLR ((uint32_t)0x00000400U) /* FIFO clear enable */ +#define ADC_FIFOCFG_NEINTEN ((uint32_t)0x00000800U) /* FIFO non-empty interrupt enable */ + +/******************** Bit definition for ADC_FIFOSTS register ********************/ +#define ADC_FIFOSTS_FFLAG ((uint32_t)0x00000004U) /* FIFO full status flag */ +#define ADC_FIFOSTS_EFLAG ((uint32_t)0x00000008U) /* FIFO empty status flag*/ +#define ADC_FIFOSTS_HFFLAG ((uint32_t)0x00000010U) /* FIFO half-full status flag */ + +#define ADC_FIFOSTS_DATCNT ((uint32_t)0x000003E0U) /* DATCNT[4:0] bits (FIFO invalid data count) */ +#define ADC_FIFOSTS_DATCNT_0 ((uint32_t)0x00000020U) /* Bit 0 */ +#define ADC_FIFOSTS_DATCNT_1 ((uint32_t)0x00000040U) /* Bit 1 */ +#define ADC_FIFOSTS_DATCNT_2 ((uint32_t)0x00000080U) /* Bit 2 */ +#define ADC_FIFOSTS_DATCNT_3 ((uint32_t)0x00000100U) /* Bit 3 */ +#define ADC_FIFOSTS_DATCNT_4 ((uint32_t)0x00000200U) /* Bit 4 */ + +#define ADC_FIFOSTS_NEFLAG ((uint32_t)0x00000800U) /* FIFO non-empty status flag */ + +/******************** Bit definition for ADC_DLYSMP register ********************/ +#define ADC_DLYSMP_INTLEADVAL ((uint32_t)0xF0000000U) /* Bit[31:28] The delay time when operating on interleaved mode of dual-ADC or Tripple- ADC */ +#define ADC_DLYSMP_INTLEADVAL_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define ADC_DLYSMP_INTLEADVAL_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define ADC_DLYSMP_INTLEADVAL_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define ADC_DLYSMP_INTLEADVAL_3 ((uint32_t)0x80000000U) /* Bit31*/ + +#define ADC_DLYSMP_DLYVAL ((uint32_t)0x0F000000U) /* Bit[27:24] Delayed sampling cycle configuration in independent mode*/ +#define ADC_DLYSMP_DLYVAL_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define ADC_DLYSMP_DLYVAL_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define ADC_DLYSMP_DLYVAL_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define ADC_DLYSMP_DLYVAL_3 ((uint32_t)0x08000000U) /* Bit27*/ + +#define ADC_DLYSMP_DLYSAMPEN ((uint32_t)0x00800000U) /* Bit[23] */ + +/******************** Bit definition for ADC_OSCFG register *****************/ +#define ADC_OSCFG_OSAWD ((uint32_t)0x01000000U) /* Bit[24] Oversampling data for analog watchdog comparision */ +#define ADC_OSCFG_OSRMD ((uint32_t)0x00800000U) /* Bit[23] Regular channels oversample mode */ +#define ADC_OSCFG_OSRTRIG ((uint32_t)0x00400000U) /* Bit[22] egular channels oversample triagger mode */ + +#define ADC_OSCFG_OSS ((uint32_t)0x003C0000U) /* Bit[21:18] Oversample data right shift */ +#define ADC_OSCFG_OSS_0 ((uint32_t)0x00040000U) /* Bit18*/ +#define ADC_OSCFG_OSS_1 ((uint32_t)0x00080000U) /* Bit19*/ +#define ADC_OSCFG_OSS_2 ((uint32_t)0x00100000U) /* Bit20*/ +#define ADC_OSCFG_OSS_3 ((uint32_t)0x00200000U) /* Bit21*/ + +#define ADC_OSCFG_OSR ((uint32_t)0x0003C000U) /* Bit[17:14] ADC oversampling ratio times */ +#define ADC_OSCFG_OSR_0 ((uint32_t)0x00004000U) /* Bit14*/ +#define ADC_OSCFG_OSR_1 ((uint32_t)0x00008000U) /* Bit15*/ +#define ADC_OSCFG_OSR_2 ((uint32_t)0x00010000U) /* Bit16*/ +#define ADC_OSCFG_OSR_3 ((uint32_t)0x00020000U) /* Bit17*/ + +#define ADC_OSCFG_OSJE ((uint32_t)0x00002000U) /* Bit[13] Injected channels oversample enable*/ +#define ADC_OSCFG_OSRE ((uint32_t)0x00001000U) /* Bit[12] Regular channels oversample enable */ + +/******************** Bit definition for ADC_INTLRCFG register ****************/ +#define ADC_INTLRCFG_WEN ((uint32_t)0x80000000U) /* WEN bits (Write enable) */ +#define ADC_INTLRCFG_RWSTART ((uint32_t)0x40000000U) /* RWSTART bits (Start Write/Read Internal Register) */ +#define ADC_INTLRCFG_DONE ((uint32_t)0x20000000U) /* DONE bits (Write/Read Internal Register Finish Flag) */ + +#define ADC_INTLRCFG_ADDR ((uint32_t)0x1C000000U) /* ADDR[2:0] bits (The address of internal registers) */ +#define ADC_INTLRCFG_WDATA ((uint32_t)0x03FC0000U) /* WDATA[7:0] bits (Data write into internal register) */ +#define ADC_INTLRCFG_RDATA ((uint32_t)0x00003FC0U) /* RDATA[7:0] bits (Data read from internal register) */ + +/******************** Bit definition for ADC_GCOMP register ****************/ +#define ADC_GCOMP_GCOMPDAT ((uint32_t)0x00003FFFU) /* GCOMPDAT[13:0] bits (ADC Gain Compensation Coefficient) */ + + +/*** Digital to Analog Converter Peripheral Interface ***/ +/******************** Bit definition for DAC_CTRL register ********************/ +#define DAC_CTRL_DACxEN ((uint32_t)0x00000001U) /* DACx enable */ +#define DAC_CTRL_DMAxEN ((uint32_t)0x00000002U) /* DACx DMA enable */ +#define DAC_CTRL_BxEN ((uint32_t)0x00000004U) /* DACx output buffer enable */ +#define DAC_CTRL_TxEN ((uint32_t)0x00000008U) /* DACx Trigger enable */ +#define DAC_CTRL_DMAUDRxIEn ((uint32_t)0x00000010U) /* DACx DMA underrun interrupt enable */ +#define DAC_CTRL_HDBxEN ((uint32_t)0x00000020U) /* DACx high driver output buffer enable */ +#define DAC_CTRL_DMADOUBLExEN ((uint32_t)0x00000040U) /* DACx DMA double data mode enable */ +#define DAC_CTRL_SINFORMATxEN ((uint32_t)0x00000080U) /* DACx signed format enable */ + +#define DAC_CTRL_WxEN ((uint32_t)0x00000700U) /* WAVE1[1:0] (DACx noise/triangle wave generation enable) */ +#define DAC_CTRL_WxEN_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define DAC_CTRL_WxEN_1 ((uint32_t)0x00000200U) /* Bit 1 */ +#define DAC_CTRL_WxEN_2 ((uint32_t)0x00000400U) /* Bit 2 */ + +#define DAC_CTRL_CALxEN ((uint32_t)0x00000800U) /* DACx calibrate enable */ +#define DAC_CTRL_INOUTx ((uint32_t)0x00001000U) /* DACx is connected to on chip peripherals enable */ +#define DAC_CTRL_EXOUTx ((uint32_t)0x00002000U) /* DACx is connected to external pin enable */ +#define DAC_CTRL_TROVCxIEN ((uint32_t)0x00004000U) /* DACx's trigger overclock interrupt enable */ + +#define DAC_CTRL_DACyEN ((uint32_t)0x00010000U) /* DACy enable */ +#define DAC_CTRL_DMAyEN ((uint32_t)0x00020000U) /* DACy DMA enable */ +#define DAC_CTRL_ByEN ((uint32_t)0x00040000U) /* DACy output buffer enable */ +#define DAC_CTRL_TyEN ((uint32_t)0x00080000U) /* DACy Trigger enable */ +#define DAC_CTRL_DMAUDRyIEn ((uint32_t)0x00100000U) /* DACy DMA underrun interrupt enable */ +#define DAC_CTRL_HDByEN ((uint32_t)0x00200000U) /* DACy high driver output buffer enable */ +#define DAC_CTRL_DMADOUBLEyEN ((uint32_t)0x00400000U) /* DACy DMA double data mode enable */ +#define DAC_CTRL_SINFORMATyEN ((uint32_t)0x00800000U) /* DACy signed format enable */ + +#define DAC_CTRL_WyEN ((uint32_t)0x07000000U) /* WAVE2[1:0] (DACy noise/triangle wave generation enable) */ +#define DAC_CTRL_WyEN_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define DAC_CTRL_WyEN_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define DAC_CTRL_WyEN_2 ((uint32_t)0x04000000U) /* Bit 2 */ + +#define DAC_CTRL_CALyEN ((uint32_t)0x08000000U) /* DACy calibrate enable */ +#define DAC_CTRL_INOUTy ((uint32_t)0x10000000U) /* DACy is connected to on chip peripherals enable */ +#define DAC_CTRL_EXOUTy ((uint32_t)0x20000000U) /* DACy is connected to external pin enable */ +#define DAC_CTRL_TROVCyIEN ((uint32_t)0x40000000U) /* DACy's trigger overclock interrupt enable */ + +/***************** Bit definition for DAC_SOTTR register ******************/ +#define DAC_SOTTR_TRxEN ((uint32_t)0x00000001U) /* DACx software trigger */ +#define DAC_SOTTR_TRyEN ((uint32_t)0x00000002U) /* DACy software trigger */ +#define DAC_SOTTR_TRBxEN ((uint32_t)0x00010000U) /* DACx sawtooth step signal software trigger */ +#define DAC_SOTTR_TRByEN ((uint32_t)0x00020000U) /* DACy sawtooth step signal software trigger */ + +/******************* Bit definiti on for DAC_DATO1 register *******************/ +#define DACx_DATO_DACxDO ((uint16_t)0x0FFFU) /* DACx data output */ + +/******************* Bit definition for DAC_DATO2 register *******************/ +#define DACy_DATO_DACyDO ((uint16_t)0x0FFFU) /* DACy data output */ + +/****************** Bit definition for DAC_DR8CH1 register ******************/ +#define DACx_DR8_DACxD ((uint16_t)0xFF00U) /* DACx 8-bit Right aligned data */ +#define DACx_DR8_DACxDB ((uint16_t)0x00FFU) /* DACx 8-bit Right aligned data, operating only on double data mode */ + +/***************** Bit definition for DAC_DL12CH1 register ******************/ +#define DACx_DL12_DACxDB ((uint32_t)0x0000FFF0U) /* DACx 12-bit Left aligned data */ +#define DACx_DL12_DACxD ((uint32_t)0xFFF00000U) /* DACx 12-bit Left aligned data, operating only on double data mode */ + +/***************** Bit definition for DAC_DR12CH1 register ******************/ +#define DACx_DR12_DACxDB ((uint32_t)0x00000FFFU) /* DACx 12-bit Right aligned data */ +#define DACx_DR12_DACxD ((uint32_t)0x0FFF0000U) /* DACx 12-bit Right aligned data, operating only on double data mode */ + +/****************** Bit definition for DAC_DR8CH2 register ******************/ +#define DACy_DR8_DACyD ((uint16_t)0xFF00U) /* DACy 8-bit Right aligned data */ +#define DACy_DR8_DACyDB ((uint16_t)0x00FFU) /* DACy 8-bit Right aligned data, operating only on double data mode */ + +/***************** Bit definition for DAC_DL12CH2 register ******************/ +#define DACy_DL12_DACyDB ((uint32_t)0x0000FFF0U) /* DACy 12-bit Left aligned data */ +#define DACy_DL12_DACyD ((uint32_t)0xFFF00000U) /* DACy 12-bit Left aligned data, operating only on double data mode */ + +/***************** Bit definition for DAC_DR12CH2 register ******************/ +#define DACy_DR12_DACyDB ((uint32_t)0x00000FFFU) /* DACy 12-bit Right aligned data */ +#define DACy_DR12_DACyD ((uint32_t)0x0FFF0000U) /* DACy 12-bit Right aligned data, operating only on double data mode */ + +/****************** Bit definition for DAC_DR8DCH register ******************/ +#define DAC_DR8D_DACxD ((uint16_t)0x00FFU) /* DACx 8-bit Right aligned data */ +#define DAC_DR8D_DACyD ((uint16_t)0xFF00U) /* DACy 8-bit Right aligned data */ + +/***************** Bit definition for DAC_DL12DCH register ******************/ +#define DAC_DL12D_DACxD ((uint32_t)0x0000FFF0U) /* DACx 12-bit Left aligned data */ +#define DAC_DL12D_DACyD ((uint32_t)0xFFF00000U) /* DACy 12-bit Left aligned data */ + +/***************** Bit definition for DAC_DR12DCH register ******************/ +#define DAC_DR12D_DACxD ((uint32_t)0x00000FFFU) /* DACx 12-bit Right aligned data */ +#define DAC_DR12D_DACyD ((uint32_t)0x0FFF0000U) /* DACy 12-bit Right aligned data */ + +/***************** Bit definition for DAC_SELCTRL register ******************/ +#define DAC_SETCTRL_SINCSELx ((uint32_t)0x0000003EU) /* DACx sawtooth increment trigger selection */ +#define DAC_SETCTRL_SINCSELx_0 ((uint32_t)0x00000002U) /* Bit 0 */ +#define DAC_SETCTRL_SINCSELx_1 ((uint32_t)0x00000004U) /* Bit 1 */ +#define DAC_SETCTRL_SINCSELx_2 ((uint32_t)0x00000008U) /* Bit 2 */ +#define DAC_SETCTRL_SINCSELx_3 ((uint32_t)0x00000010U) /* Bit 3 */ +#define DAC_SETCTRL_SINCSELx_4 ((uint32_t)0x00000020U) /* Bit 4 */ + +#define DAC_SETCTRL_MAxSEL ((uint32_t)0x000003C0U) /* MAMPx[3:0] (DACx Mask/Amplitude selector) */ +#define DAC_SETCTRL_MAxSEL_0 ((uint32_t)0x00000040U) /* Bit 0 */ +#define DAC_SETCTRL_MAxSEL_1 ((uint32_t)0x00000080U) /* Bit 1 */ +#define DAC_SETCTRL_MAxSEL_2 ((uint32_t)0x00000100U) /* Bit 2 */ +#define DAC_SETCTRL_MAxSEL_3 ((uint32_t)0x00000200U) /* Bit 3 */ + +#define DAC_SETCTRL_TxSEL ((uint32_t)0x0000F100U) /* TSELx[4:0] (DACx Trigger source selection) */ +#define DAC_SETCTRL_TxSEL_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define DAC_SETCTRL_TxSEL_1 ((uint32_t)0x00001000U) /* Bit 1 */ +#define DAC_SETCTRL_TxSEL_2 ((uint32_t)0x00002000U) /* Bit 2 */ +#define DAC_SETCTRL_TxSEL_3 ((uint32_t)0x00004000U) /* Bit 3 */ +#define DAC_SETCTRL_TxSEL_4 ((uint32_t)0x00008000U) /* Bit 4 */ + +#define DAC_SETCTRL_SINCSELy ((uint32_t)0x003E0000U) /* SINCSELy[3:0] (DACy sawtooth increment trigger selection) */ +#define DAC_SETCTRL_SINCSELy_0 ((uint32_t)0x00020000U) /* Bit 0 */ +#define DAC_SETCTRL_SINCSELy_1 ((uint32_t)0x00040000U) /* Bit 1 */ +#define DAC_SETCTRL_SINCSELy_2 ((uint32_t)0x00080000U) /* Bit 2 */ +#define DAC_SETCTRL_SINCSELy_3 ((uint32_t)0x00100000U) /* Bit 3 */ +#define DAC_SETCTRL_SINCSELy_4 ((uint32_t)0x00200000U) /* Bit 4 */ + +#define DAC_SETCTRL_MAySEL ((uint32_t)0x03C00000U) /* MAMPy[3:0] (DACy Mask/Amplitude selector) */ +#define DAC_SETCTRL_MAySEL_0 ((uint32_t)0x00400000U) /* Bit 0 */ +#define DAC_SETCTRL_MAySEL_1 ((uint32_t)0x00800000U) /* Bit 1 */ +#define DAC_SETCTRL_MAySEL_2 ((uint32_t)0x01000000U) /* Bit 2 */ +#define DAC_SETCTRL_MAySEL_3 ((uint32_t)0x02000000U) /* Bit 3 */ + +#define DAC_SETCTRL_TySEL ((uint32_t)0xF1000000U) /* TSELy[4:0] (DACy Trigger source selection) */ +#define DAC_SETCTRL_TySEL_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define DAC_SETCTRL_TySEL_1 ((uint32_t)0x10000000U) /* Bit 1 */ +#define DAC_SETCTRL_TySEL_2 ((uint32_t)0x20000000U) /* Bit 2 */ +#define DAC_SETCTRL_TySEL_3 ((uint32_t)0x40000000U) /* Bit 3 */ +#define DAC_SETCTRL_TySEL_4 ((uint32_t)0x80000000U) /* Bit 4 */ + +/***************** Bit definition for DAC_STS register ******************/ +#define DAC_STS_DMAUDRx ((uint32_t)0x00000001U) /* DACx DMA underrun status flag */ +#define DAC_STS_CALFLAGx ((uint32_t)0x00000002U) /* DACx calibrate offset status flag */ +#define DAC_STS_DORSTATx ((uint32_t)0x00000004U) /* DACx data output register status flag */ +#define DAC_STS_TROVCFLAGx ((uint32_t)0x00000008U) /* DACx trigger source overclock status flag */ +#define DAC_STS_VFLAGxCOMP ((uint32_t)0x00000010U) /* Status flag that indicates DACx output is stable or not */ + +#define DAC_STS_DMAUDRy ((uint32_t)0x00010000U) /* DACy DMA underrun status flag */ +#define DAC_STS_CALFLAGy ((uint32_t)0x00020000U) /* DACy calibrate offset status flag */ +#define DAC_STS_DORSTATy ((uint32_t)0x00040000U) /* DACy data output register status flag */ +#define DAC_STS_TROVCFLAGy ((uint32_t)0x00080000U) /* DACy trigger source overclock status flag */ +#define DAC_STS_VFLAGyCOMP ((uint32_t)0x00100000U) /* Status flag that indicates DACy output is stable or not */ + +/***************** Bit definition for DAC_GCTRL register ******************/ +#define DAC12_GCTRL_HFSEL ((uint32_t)0x00000006U) /* HFSEL[1:0] (High frequency interface mode selection for DAC1/DAC2) */ +#define DAC12_GCTRL_HFSEL_0 ((uint32_t)0x00000002U) /* Bit 0 */ +#define DAC12_GCTRL_HFSEL_1 ((uint32_t)0x00000004U) /* Bit 1 */ + +#define DAC12_GCTRL_PCS ((uint32_t)0x00FF0000U) /* PCS[7:0] (The clock prescale of DAC1/DAC2 selection) */ +#define DAC12_GCTRL_PCS_0 ((uint32_t)0x00010000U) /* Bit 0 */ +#define DAC12_GCTRL_PCS_1 ((uint32_t)0x00020000U) /* Bit 1 */ +#define DAC12_GCTRL_PCS_2 ((uint32_t)0x00040000U) /* Bit 2 */ +#define DAC12_GCTRL_PCS_3 ((uint32_t)0x00080000U) /* Bit 3 */ +#define DAC12_GCTRL_PCS_4 ((uint32_t)0x00100000U) /* Bit 4 */ +#define DAC12_GCTRL_PCS_5 ((uint32_t)0x00200000U) /* Bit 5 */ +#define DAC12_GCTRL_PCS_6 ((uint32_t)0x00400000U) /* Bit 6 */ +#define DAC12_GCTRL_PCS_7 ((uint32_t)0x00800000U) /* Bit 7 */ + +#define DAC3456_GCTRL_PCS ((uint32_t)0x001F0000U) /* PCS[4:0] (The clock prescale of DAC3/DAC4DAC5/DAC6 selection) */ +#define DAC3456_GCTRL_PCS_0 ((uint32_t)0x00010000U) /* Bit 0 */ +#define DAC3456_GCTRL_PCS_1 ((uint32_t)0x00020000U) /* Bit 1 */ +#define DAC3456_GCTRL_PCS_2 ((uint32_t)0x00040000U) /* Bit 2 */ +#define DAC3456_GCTRL_PCS_3 ((uint32_t)0x00080000U) /* Bit 3 */ +#define DAC3456_GCTRL_PCS_4 ((uint32_t)0x00100000U) /* Bit 4 */ + +/***************** Bit definition for DAC_STINC register ******************/ +#define DAC_STINC_STINCDATAx ((uint32_t)0x00000FFFU) /* STINCDATAx[11:0] (The sawtooth step value of DACx) */ +#define DAC_STINC_STINCDATAy ((uint32_t)0x0FFF0000U) /* STINCDATAy[11:0] (The sawtooth step value of DACy) */ + +/***************** Bit definition for DAC_STRST register ******************/ +#define DAC_STRST_STRSTDATAx ((uint32_t)0x00000FFFU) /* STRSTDATAx[11:0] (The sawtooth reset value of DACx) */ +#define DAC_STRST_STRSTDATAy ((uint32_t)0x0FFF0000U) /* STRSTDATAy[11:0] (The sawtooth reset value of DACy) */ + +/***************** Bit definition for DAC_CALC register ******************/ +#define DAC_CALC_OTRIMx ((uint32_t)0x0000001FU) /* OTRIMx[4:0] (The calibration offset value of DACx) */ +#define DAC_CALC_OTRIMy ((uint32_t)0x001F0000U) /* OTRIMy[4:0] (The calibration offset value of DACy) */ + + +/*** Comparators Peripheral Interface ***/ +/******** Bit definition for COMP1_CTRL register ********/ +#define COMP1_CTRL_VV1TRM ((uint32_t)0x1F800000U) /* Bit[28:23] Internal 6bit-dac1 output voltage size*/ +#define COMP1_CTRL_VV1TRM_0 ((uint32_t)0x00800000U) /* Bit23*/ +#define COMP1_CTRL_VV1TRM_1 ((uint32_t)0x01000000U) /* Bit24*/ +#define COMP1_CTRL_VV1TRM_2 ((uint32_t)0x02000000U) /* Bit25*/ +#define COMP1_CTRL_VV1TRM_3 ((uint32_t)0x04000000U) /* Bit26*/ +#define COMP1_CTRL_VV1TRM_4 ((uint32_t)0x08000000U) /* Bit27*/ +#define COMP1_CTRL_VV1TRM_5 ((uint32_t)0x10000000U) /* Bit28*/ + +#define COMP1_CTRL_VV1EN ((uint32_t)0x00400000U) /* Bit[22] Internal 6bit-dac1 output enable*/ + +#define COMP1_CTRL_OUT ((uint32_t)0x00200000U) /* Bit[21] Output state of Comparator_1 */ + +#define COMP1_CTRL_BLKINGEN ((uint32_t)0x00100000U) /* Bit[20] Comparator_1 Blanking enable */ + +#define COMP1_CTRL_BLKING ((uint32_t)0x000F0000U) /* Bit[19:16] Blanking source select of Comparator_1 */ +#define COMP1_CTRL_BLKING_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define COMP1_CTRL_BLKING_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define COMP1_CTRL_BLKING_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define COMP1_CTRL_BLKING_3 ((uint32_t)0x00080000U) /* Bit19*/ + +#define COMP1_CTRL_HYST ((uint32_t)0x0000C000U) /* Bit[15:14] Hysteresis level select of Comparator_1*/ +#define COMP1_CTRL_HYST_0 ((uint32_t)0x00004000U) /* Bit14*/ +#define COMP1_CTRL_HYST_1 ((uint32_t)0x00008000U) /* Bit15*/ + +#define COMP1_CTRL_POL ((uint32_t)0x00002000U) /* Bit[13] */ + +#define COMP1_CTRL_INPSEL ((uint32_t)0x000001E0U) /* Bit[8:5] Non inverting input select of Comparator_1*/ +#define COMP1_CTRL_INPSEL_0 ((uint32_t)0x00000020U) /* Bit5*/ +#define COMP1_CTRL_INPSEL_1 ((uint32_t)0x00000040U) /* Bit6*/ +#define COMP1_CTRL_INPSEL_2 ((uint32_t)0x00000080U) /* Bit7*/ +#define COMP1_CTRL_INPSEL_3 ((uint32_t)0x00000100U) /* Bit8*/ + +#define COMP1_CTRL_INMSEL ((uint32_t)0x0000001EU) /* Bit[4:1] Inverting input select of Comparator_1*/ +#define COMP1_CTRL_INMSEL_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define COMP1_CTRL_INMSEL_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define COMP1_CTRL_INMSEL_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define COMP1_CTRL_INMSEL_3 ((uint32_t)0x00000010U) /* Bit4*/ + +#define COMP1_CTRL_EN ((uint32_t)0x00000001U) /* Bit[0] Comparator_1 enable */ + +/******** Bit definition for COMP1_FILC register ********/ +#define COMP1_FILC_VN_FLAG ((uint32_t)0x00001000U) /* Bit12*/ +#define COMP1_FILC_VP_FLAG ((uint32_t)0x00000800U) /* Bit11*/ + +#define COMP1_FILC_SAMPW ((uint32_t)0x000007C0U) /* Bit[10:6] Comparator_1 filter window size*/ +#define COMP1_FILC_SAMPW_0 ((uint32_t)0x00000040U) /* Bit6*/ +#define COMP1_FILC_SAMPW_1 ((uint32_t)0x00000080U) /* Bit7*/ +#define COMP1_FILC_SAMPW_2 ((uint32_t)0x00000100U) /* Bit8*/ +#define COMP1_FILC_SAMPW_3 ((uint32_t)0x00000200U) /* Bit9*/ +#define COMP1_FILC_SAMPW_4 ((uint32_t)0x00000400U) /* Bit10*/ + +#define COMP1_FILC_THRESH ((uint32_t)0x0000003EU) /* Bit[5:1] Comparator_1 filter threshold size*/ +#define COMP1_FILC_THRESH_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define COMP1_FILC_THRESH_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define COMP1_FILC_THRESH_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define COMP1_FILC_THRESH_3 ((uint32_t)0x00000010U) /* Bit4*/ +#define COMP1_FILC_THRESH_4 ((uint32_t)0x00000020U) /* Bit5*/ + +#define COMP1_FILC_FILEN ((uint32_t)0x00000001U) /* Bit[0] Comparator_1 filter enable*/ + +/******** Bit definition for COMP1_FILP register ********/ +#define COMP1_FILP_CLKPSC ((uint32_t)0x0000FFFFU) /* Bit[15:0] Comparator_1 filter sample clock prescale*/ + +/******** Bit definition for COMP2_CTRL register ********/ +#define COMP2_CTRL_VV2TRM ((uint32_t)0x1F800000U) /* Bit[28:23] Internal 6bit-dac2 output voltage size*/ +#define COMP2_CTRL_VV2TRM_0 ((uint32_t)0x00800000U) /* Bit23*/ +#define COMP2_CTRL_VV2TRM_1 ((uint32_t)0x01000000U) /* Bit24*/ +#define COMP2_CTRL_VV2TRM_2 ((uint32_t)0x02000000U) /* Bit25*/ +#define COMP2_CTRL_VV2TRM_3 ((uint32_t)0x04000000U) /* Bit26*/ +#define COMP2_CTRL_VV2TRM_4 ((uint32_t)0x08000000U) /* Bit27*/ +#define COMP2_CTRL_VV2TRM_5 ((uint32_t)0x10000000U) /* Bit28*/ + +#define COMP2_CTRL_VV2EN ((uint32_t)0x00400000U) /* Bit[22] Internal 6bit-dac2 output enable*/ +#define COMP2_CTRL_OUT ((uint32_t)0x00200000U) /* Bit[21] Output state of Comparator_2*/ + +#define COMP2_CTRL_BLKINGEN ((uint32_t)0x00100000U) /* Bit[20] Comparator_2 Blanking enable*/ + +#define COMP2_CTRL_BLKING ((uint32_t)0x000F0000U) /* Bit[19:16] Blanking source select of Comparator_2*/ +#define COMP2_CTRL_BLKING_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define COMP2_CTRL_BLKING_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define COMP2_CTRL_BLKING_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define COMP2_CTRL_BLKING_3 ((uint32_t)0x00080000U) /* Bit19*/ + +#define COMP2_CTRL_HYST ((uint32_t)0x0000C000U) /* Bit[15:14] Hysteresis level select of Comparator_2*/ +#define COMP2_CTRL_HYST_0 ((uint32_t)0x00004000U) /* Bit14*/ +#define COMP2_CTRL_HYST_1 ((uint32_t)0x00008000U) /* Bit15*/ + +#define COMP2_CTRL_POL ((uint32_t)0x00002000U) /* Bit[13] */ + +#define COMP2_CTRL_INPSEL ((uint32_t)0x000001E0U) /* Bit[8:5] Non inverting input select of Comparator_2*/ +#define COMP2_CTRL_INPSEL_0 ((uint32_t)0x00000020U) /* Bit5*/ +#define COMP2_CTRL_INPSEL_1 ((uint32_t)0x00000040U) /* Bit6*/ +#define COMP2_CTRL_INPSEL_2 ((uint32_t)0x00000080U) /* Bit7*/ +#define COMP2_CTRL_INPSEL_3 ((uint32_t)0x00000100U) /* Bit8*/ + +#define COMP2_CTRL_INMSEL ((uint32_t)0x0000001EU) /* Bit[4:1] Inverting input select of Comparator_2*/ +#define COMP2_CTRL_INMSEL_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define COMP2_CTRL_INMSEL_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define COMP2_CTRL_INMSEL_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define COMP2_CTRL_INMSEL_3 ((uint32_t)0x00000010U) /* Bit4*/ + +#define COMP2_CTRL_EN ((uint32_t)0x00000001U) /* Bit[0] Comparator_2 enable*/ + +/******** Bit definition for COMP2_FILC register ********/ +#define COMP2_FILC_SAMPW ((uint32_t)0x000007C0U) /* Bit[10:6] Comparator_2 filter window size*/ +#define COMP2_FILC_SAMPW_0 ((uint32_t)0x00000040U) /* Bit6*/ +#define COMP2_FILC_SAMPW_1 ((uint32_t)0x00000080U) /* Bit7*/ +#define COMP2_FILC_SAMPW_2 ((uint32_t)0x00000100U) /* Bit8*/ +#define COMP2_FILC_SAMPW_3 ((uint32_t)0x00000200U) /* Bit9*/ +#define COMP2_FILC_SAMPW_4 ((uint32_t)0x00000400U) /* Bit10*/ + +#define COMP2_FILC_THRESH ((uint32_t)0x0000003EU) /* Bit[5:1] Comparator_2 filter threshold size*/ +#define COMP2_FILC_THRESH_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define COMP2_FILC_THRESH_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define COMP2_FILC_THRESH_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define COMP2_FILC_THRESH_3 ((uint32_t)0x00000010U) /* Bit4*/ +#define COMP2_FILC_THRESH_4 ((uint32_t)0x00000020U) /* Bit5*/ + +#define COMP2_FILC_FILEN ((uint32_t)0x00000001U) /* Bit[0] Comparator_2 filter enable */ + +/******** Bit definition for COMP2_FILP register ********/ +#define COMP2_FILP_CLKPSC ((uint32_t)0x0000FFFFU) /* Bit[15:0] Comparator_2 filter sample clock prescale*/ + +/******** Bit definition for COMP3_CTRL register ********/ +#define COMP3_CTRL_OUT ((uint32_t)0x00200000U) /* Bit[21] Output state of Comparator_3*/ + +#define COMP3_CTRL_BLKINGEN ((uint32_t)0x00100000U) /* Bit[20] Comparator_3 Blanking enable*/ + +#define COMP3_CTRL_BLKING ((uint32_t)0x000F0000U) /* Bit[19:16] Blanking source select of Comparator_3*/ +#define COMP3_CTRL_BLKING_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define COMP3_CTRL_BLKING_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define COMP3_CTRL_BLKING_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define COMP3_CTRL_BLKING_3 ((uint32_t)0x00080000U) /* Bit19*/ + +#define COMP3_CTRL_HYST ((uint32_t)0x0000C000U) /* Bit[15:14] Hysteresis level select of Comparator_3*/ +#define COMP3_CTRL_HYST_0 ((uint32_t)0x00004000U) /* Bit14*/ +#define COMP3_CTRL_HYST_1 ((uint32_t)0x00008000U) /* Bit15*/ +#define COMP3_CTRL_POL ((uint32_t)0x00002000U) /* Bit[13] */ + +#define COMP3_CTRL_INPSEL ((uint32_t)0x000001E0U) /* Bit[8:5] Non inverting input select of Comparator_3*/ +#define COMP3_CTRL_INPSEL_0 ((uint32_t)0x00000020U) /* Bit5*/ +#define COMP3_CTRL_INPSEL_1 ((uint32_t)0x00000040U) /* Bit6*/ +#define COMP3_CTRL_INPSEL_2 ((uint32_t)0x00000080U) /* Bit7*/ +#define COMP3_CTRL_INPSEL_3 ((uint32_t)0x00000100U) /* Bit8*/ + +#define COMP3_CTRL_INMSEL ((uint32_t)0x0000001EU) /* Bit[4:1] Inverting input select of Comparator_3*/ +#define COMP3_CTRL_INMSEL_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define COMP3_CTRL_INMSEL_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define COMP3_CTRL_INMSEL_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define COMP3_CTRL_INMSEL_3 ((uint32_t)0x00000010U) /* Bit4*/ + +#define COMP3_CTRL_EN ((uint32_t)0x00000001U) /* Bit[0] Comparator_3 enable*/ + +/******** Bit definition for COMP3_FILC register ********/ +#define COMP3_FILC_SAMPW ((uint32_t)0x000007C0U) /* Bit[10:6] Comparator_3 filter window size*/ +#define COMP3_FILC_SAMPW_0 ((uint32_t)0x00000040U) /* Bit6*/ +#define COMP3_FILC_SAMPW_1 ((uint32_t)0x00000080U) /* Bit7*/ +#define COMP3_FILC_SAMPW_2 ((uint32_t)0x00000100U) /* Bit8*/ +#define COMP3_FILC_SAMPW_3 ((uint32_t)0x00000200U) /* Bit9*/ +#define COMP3_FILC_SAMPW_4 ((uint32_t)0x00000400U) /* Bit10*/ + +#define COMP3_FILC_THRESH ((uint32_t)0x0000003EU) /* Bit[5:1] Comparator_3 filter threshold size*/ +#define COMP3_FILC_THRESH_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define COMP3_FILC_THRESH_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define COMP3_FILC_THRESH_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define COMP3_FILC_THRESH_3 ((uint32_t)0x00000010U) /* Bit4*/ +#define COMP3_FILC_THRESH_4 ((uint32_t)0x00000020U) /* Bit5*/ + +#define COMP3_FILC_FILEN ((uint32_t)0x00000001U) /* Bit[0] Comparator_3 filter enable */ + +/******** Bit definition for COMP3_FILP register ********/ +#define COMP3_FILP_CLKPSC ((uint32_t)0x0000FFFFU) /* Bit[15:0] Comparator_3 filter sample clock prescale*/ + +/******** Bit definition for COMP4_CTRL register ********/ +#define COMP4_CTRL_OUT ((uint32_t)0x00100000U) /* Bit[20] Output state of Comparator_4*/ + +#define COMP4_CTRL_BLKINGEN ((uint32_t)0x00100000U) /* Bit[20] Comparator_4 Blanking enable*/ + +#define COMP4_CTRL_BLKING ((uint32_t)0x000F0000U) /* Bit[19:16] Blanking source select of Comparator_4*/ +#define COMP4_CTRL_BLKING_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define COMP4_CTRL_BLKING_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define COMP4_CTRL_BLKING_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define COMP4_CTRL_BLKING_3 ((uint32_t)0x00080000U) /* Bit19*/ + +#define COMP4_CTRL_HYST ((uint32_t)0x0000C000U) /* Bit[15:14] Hysteresis level select of Comparator_4*/ +#define COMP4_CTRL_HYST_0 ((uint32_t)0x00004000U) /* Bit14*/ +#define COMP4_CTRL_HYST_1 ((uint32_t)0x00008000U) /* Bit15*/ +#define COMP4_CTRL_POL ((uint32_t)0x00002000U) /* Bit[13] */ + +#define COMP4_CTRL_INPSEL ((uint32_t)0x000001E0U) /* Bit[8:5] Non inverting input select of Comparator_4*/ +#define COMP4_CTRL_INPSEL_0 ((uint32_t)0x00000020U) /* Bit5*/ +#define COMP4_CTRL_INPSEL_1 ((uint32_t)0x00000040U) /* Bit6*/ +#define COMP4_CTRL_INPSEL_2 ((uint32_t)0x00000080U) /* Bit7*/ +#define COMP4_CTRL_INPSEL_3 ((uint32_t)0x00000100U) /* Bit8*/ + +#define COMP4_CTRL_INMSEL ((uint32_t)0x0000001EU) /* Bit[4:1] Inverting input select of Comparator_4*/ +#define COMP4_CTRL_INMSEL_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define COMP4_CTRL_INMSEL_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define COMP4_CTRL_INMSEL_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define COMP4_CTRL_INMSEL_3 ((uint32_t)0x00000010U) /* Bit4*/ + +#define COMP4_CTRL_EN ((uint32_t)0x00000001U) /* Bit[0] Comparator_4 enable*/ + +/******** Bit definition for COMP4_FILC register ********/ +#define COMP4_FILC_SAMPW ((uint32_t)0x000007C0U) /* Bit[10:6] Comparator_4 filter window size*/ +#define COMP4_FILC_SAMPW_0 ((uint32_t)0x00000040U) /* Bit6*/ +#define COMP4_FILC_SAMPW_1 ((uint32_t)0x00000080U) /* Bit7*/ +#define COMP4_FILC_SAMPW_2 ((uint32_t)0x00000100U) /* Bit8*/ +#define COMP4_FILC_SAMPW_3 ((uint32_t)0x00000200U) /* Bit9*/ +#define COMP4_FILC_SAMPW_4 ((uint32_t)0x00000400U) /* Bit10*/ + +#define COMP4_FILC_THRESH ((uint32_t)0x0000003EU) /* Bit[5:1] Comparator_4 filter threshold size*/ +#define COMP4_FILC_THRESH_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define COMP4_FILC_THRESH_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define COMP4_FILC_THRESH_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define COMP4_FILC_THRESH_3 ((uint32_t)0x00000010U) /* Bit4*/ +#define COMP4_FILC_THRESH_4 ((uint32_t)0x00000020U) /* Bit5*/ + +#define COMP4_FILC_FILEN ((uint32_t)0x00000001U) /* Bit[0] Comparator_4 filter enable */ + +/******** Bit definition for COMP4_FILP register ********/ +#define COMP4_FILP_CLKPSC ((uint32_t)0x0000FFFFU) /* Bit[15:0] Comparator_4 filter sample clock prescale*/ + +/******** Bit definition for COMP_LPR register ********/ +#define COMP_LPR_CLKSEL ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for COMP_WINMODE register ********/ +#define COMP_WINMODE_COMP34MD ((uint32_t)0x00000002U) /* Bit[1] Comparator_3&4 XOR output*/ +#define COMP_WINMODE_COMP12MD ((uint32_t)0x00000001U) /* Bit[0] Comparator_1&2 XOR output*/ + +/******** Bit definition for COMP_LOCK register ********/ +#define COMP_LOCK_MASK ((uint32_t)0x0000000FU) /* All comparator lock enable */ +#define COMP_LOCK_CMP4LK ((uint32_t)0x00000008U) /* Bit[3] */ +#define COMP_LOCK_CMP3LK ((uint32_t)0x00000004U) /* Bit[2] */ +#define COMP_LOCK_CMP2LK ((uint32_t)0x00000002U) /* Bit[1] */ +#define COMP_LOCK_CMP1LK ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for COMP_INTEN register ********/ +#define COMP_INTEN_MASK ((uint32_t)0x0000000FU) /* Interrupt enable for all COMP */ +#define COMP_INTEN_CMP4IEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define COMP_INTEN_CMP3IEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define COMP_INTEN_CMP2IEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define COMP_INTEN_CMP1IEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for COMP_STS register ********/ +#define COMP_STS_MASK ((uint32_t)0x0000007FU) /* status of all Comparator */ +#define COMP_STS_CMP4IS ((uint32_t)0x00000008U) /* Bit[3] */ +#define COMP_STS_CMP3IS ((uint32_t)0x00000004U) /* Bit[2] */ +#define COMP_STS_CMP2IS ((uint32_t)0x00000002U) /* Bit[1] */ +#define COMP_STS_CMP1IS ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for COMP_OTIMEN register ********/ +#define COMP_OTIMEN_MASK ((uint32_t)0x0000000FU) /* Output to timer for all Comparator */ +#define COMP_OTIMEN_CMP4OEN ((uint32_t)0x00000008U) /* Bit[3] */ +#define COMP_OTIMEN_CMP3OEN ((uint32_t)0x00000004U) /* Bit[2] */ +#define COMP_OTIMEN_CMP2OEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define COMP_OTIMEN_CMP1OEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/*** VREFBUF ***/ +/******** Bit definition for VREFBUF_TRIM1 register ********/ +#define VREFBUF_TRIM1_2_5V_MASK ((uint32_t)0x003F0000U) /* VREFBUF 2.5V TRIMMING*/ +#define VREFBUF_TRIM1_2_048V_MASK ((uint32_t)0x0FC00000U) /* VREFBUF 2.048V TRIMMING */ + +/******** Bit definition for VREFBUF_STS register ********/ +#define VREFBUF_STS_RDY ((uint32_t)0x20000000U) /* VREFBUF ready flag */ + +/******** Bit definition for VREFBUF_CTRL1 register ********/ +#define VREFBUF_CTRL1_EN ((uint32_t)0x00000080U) /* VREFBUF enable */ +#define VREFBUF_CTRL1_HIM ((uint32_t)0x00000200U) /* VREFBUF high implement enable */ + +/******** Bit definition for VREFBUF_CTRL2 register ********/ +#define VREFBUF_CTRL2_VLSEL ((uint32_t)0x00000003U) /* VLSEL[1:0]*/ +#define VREFBUF_CTRL2_VLSEL_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define VREFBUF_CTRL2_VLSEL_1 ((uint32_t)0x00000002U) /* Bit 1 */ + +/******** Bit definition for VREFBUF_TRIM1 register ********/ +#define VREFBUF_TRIM1_1_5V_MASK ((uint32_t)0x00003F00U) /* VREFBUF 1.5V TRIMMING*/ +#define VREFBUF_TRIM1_1_8V_MASK ((uint32_t)0x0000003FU) /* VREFBUF 1.8V TRIMMING */ + + +/*** TIM ***/ + +/** Bit definition for TIM_CTRL1 register **/ +#define TIM_CTRL1_CNTEN ((uint32_t)0x00000001U) /* Counter enable */ +#define TIM_CTRL1_DIR ((uint32_t)0x00000002U) /* Direction */ + +#define TIM_CTRL1_CAMSEL ((uint32_t)0x0000000CU) /* CMS[1:0] bits (Center-aligned mode selection) */ +#define TIM_CTRL1_CAMSEL_0 ((uint32_t)0x00000004U) /* Bit 0 */ +#define TIM_CTRL1_CAMSEL_1 ((uint32_t)0x00000008U) /* Bit 1 */ + +#define TIM_CTRL1_UPRS ((uint32_t)0x00000010U) /* Update request source */ +#define TIM_CTRL1_UPDIS ((uint32_t)0x00000020U) /* Update disable */ + +#define TIM_CTRL1_CLKD ((uint32_t)0x000000C0U) /* CKD[1:0] bits (clock division) */ +#define TIM_CTRL1_CLKD_0 ((uint32_t)0x00000040U) /* Bit 0 */ +#define TIM_CTRL1_CLKD_1 ((uint32_t)0x00000080U) /* Bit 1 */ + +#define TIM_CTRL1_ONEPM ((uint32_t)0x00000100U) /* One pulse mode */ +#define TIM_CTRL1_ARPEN ((uint32_t)0x00000200U) /* Auto-reload preload enable */ +#define TIM_CTRL1_LBKPEN ((uint32_t)0x00000400U) /* LOCKUP as bkp Enable*/ +#define TIM_CTRL1_PBKPEN ((uint32_t)0x00000800U) /* PVD as bkp Enable */ +#define TIM_CTRL1_SMPARERREN ((uint32_t)0x00001000U) /* Sram parity error as bkp Enable */ +#define TIM_CTRL1_CLRSEL ((uint32_t)0x00002000U) /* OCxRef clear selection */ +#define TIM_CTRL1_SMECCERREN ((uint32_t)0x00008000U) /* Sram ecc error as bkp Enable */ + +#define TIM_CTRL1_C1SEL ((uint32_t)0x00010000U) /* Channel 1 selection */ +#define TIM_CTRL1_C2SEL ((uint32_t)0x00020000U) /* Channel 2 selection */ +#define TIM_CTRL1_C3SEL ((uint32_t)0x00040000U) /* Channel 3 selection */ +#define TIM_CTRL1_C4SEL ((uint32_t)0x00080000U) /* Channel 4 selection */ + +#define TIM_CTRL1_CMODE ((uint32_t)0x00300000U) /* In center-aligned mode, channel 4/7/8/9 trigger mode */ +#define TIM_CTRL1_CMODE_0 ((uint32_t)0x00100000U) /* Bit0 */ +#define TIM_CTRL1_CMODE_1 ((uint32_t)0x00200000U) /* Bit1 */ + +#define TIM_CTRL1_ASMMETRIC ((uint32_t)0x00800000U) /* Asynmmetric mode enable in center-aligned */ +#define TIM_CTRL1_UDITFREMAP ((uint32_t)0x01000000U) /* UDITF status bit remapping */ + +/** Bit definition for TIM_CTRL2 register **/ +#define TIM_CTRL2_OI1 ((uint32_t)0x00000001U) /* Output Idle state 1 (OC1 output) */ +#define TIM_CTRL2_OI1N ((uint32_t)0x00000002U) /* Output Idle state 1 (OC1N output) */ +#define TIM_CTRL2_OI2 ((uint32_t)0x00000004U) /* Output Idle state 2 (OC2 output) */ +#define TIM_CTRL2_OI2N ((uint32_t)0x00000008U) /* Output Idle state 2 (OC2N output) */ +#define TIM_CTRL2_OI3 ((uint32_t)0x00000010U) /* Output Idle state 3 (OC3 output) */ +#define TIM_CTRL2_OI3N ((uint32_t)0x00000020U) /* Output Idle state 3 (OC3N output) */ +#define TIM_CTRL2_OI4 ((uint32_t)0x00000040U) /* Output Idle state 4 (OC4 output) */ +#define TIM_CTRL2_OI4N ((uint32_t)0x00000080U) /* Output Idle state 4 (OC4N output) */ +#define TIM_CTRL2_OI5 ((uint32_t)0x00000100U) /* Output Idle state 5 (OC5 output) */ +#define TIM_CTRL2_OI6 ((uint32_t)0x00000400U) /* Output Idle state 6 (OC6 output) */ + +#define TIM_CTRL2_MMSEL ((uint32_t)0x0000F000U) /* MMSEL[3:0] bits (Master Mode Selection) */ +#define TIM_CTRL2_MMSEL_0 ((uint32_t)0x00001000U) /* Bit 0 */ +#define TIM_CTRL2_MMSEL_1 ((uint32_t)0x00002000U) /* Bit 1 */ +#define TIM_CTRL2_MMSEL_2 ((uint32_t)0x00004000U) /* Bit 2 */ +#define TIM_CTRL2_MMSEL_3 ((uint32_t)0x00008000U) /* Bit 3 */ + +#define TIM_CTRL2_CCUSEL ((uint32_t)0x00010000U) /* Capture/Compare Control Update Selection */ +#define TIM_CTRL2_CCDSEL ((uint32_t)0x00020000U) /* Capture/Compare DMA Selection */ +#define TIM_CTRL2_CCPCTL ((uint32_t)0x00040000U) /* Capture/Compare Preloaded Control */ +#define TIM_CTRL2_TI1SEL ((uint32_t)0x00080000U) /* TI1 Selection */ +#define TIM_CTRL2_TRIG4 ((uint32_t)0x00100000U) /* OC4REF trigger to ADC enable */ +#define TIM_CTRL2_TRIG7 ((uint32_t)0x00200000U) /* OC7REF trigger to ADC enable */ +#define TIM_CTRL2_TRIG8 ((uint32_t)0x00400000U) /* OC7REF trigger to ADC enable */ +#define TIM_CTRL2_TRIG9 ((uint32_t)0x00800000U) /* OC7REF trigger to ADC enable */ + +#define TIM_CTRL2_MMSEL2 ((uint32_t)0x0F000000U) /* MMSEL2[3:0] bits (Master Mode Selection) */ +#define TIM_CTRL2_MMSEL2_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define TIM_CTRL2_MMSEL2_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define TIM_CTRL2_MMSEL2_2 ((uint32_t)0x04000000U) /* Bit 2 */ +#define TIM_CTRL2_MMSEL2_3 ((uint32_t)0x08000000U) /* Bit 3 */ + +/** Bit definition for TIM_STS register **/ +#define TIM_STS_CC1ITF ((uint32_t)0x00000001U) /* Capture/Compare 1 interrupt Flag */ +#define TIM_STS_CC2ITF ((uint32_t)0x00000002U) /* Capture/Compare 2 interrupt Flag */ +#define TIM_STS_CC3ITF ((uint32_t)0x00000004U) /* Capture/Compare 3 interrupt Flag */ +#define TIM_STS_CC4ITF ((uint32_t)0x00000008U) /* Capture/Compare 4 interrupt Flag */ +#define TIM_STS_CC5ITF ((uint32_t)0x00000010U) /* Capture/Compare 5 interrupt Flag */ +#define TIM_STS_CC6ITF ((uint32_t)0x00000020U) /* Capture/Compare 6 interrupt Flag */ +#define TIM_STS_CC1OCF ((uint32_t)0x00000100U) /* Capture/Compare 1 Overcapture Flag */ +#define TIM_STS_CC2OCF ((uint32_t)0x00000200U) /* Capture/Compare 2 Overcapture Flag */ +#define TIM_STS_CC3OCF ((uint32_t)0x00000400U) /* Capture/Compare 3 Overcapture Flag */ +#define TIM_STS_CC4OCF ((uint32_t)0x00000800U) /* Capture/Compare 4 Overcapture Flag */ +#define TIM_STS_UDITF ((uint32_t)0x00010000U) /* Update interrupt Flag */ +#define TIM_STS_COMITF ((uint32_t)0x00020000U) /* COM interrupt Flag */ +#define TIM_STS_TITF ((uint32_t)0x00040000U) /* Trigger interrupt Flag */ +#define TIM_STS_BITF ((uint32_t)0x00080000U) /* Break interrupt Flag */ +#define TIM_STS_BITF2 ((uint32_t)0x00100000U) /* Break2 interrupt Flag */ +#define TIM_STS_SBITF ((uint32_t)0x00200000U) /* System Break interrupt Flag */ +#define TIM_STS_CC7ITF ((uint32_t)0x01000000U) /* Capture/Compare 7 interrupt Flag */ +#define TIM_STS_CC8ITF ((uint32_t)0x02000000U) /* Capture/Compare 8 interrupt Flag */ +#define TIM_STS_CC9ITF ((uint32_t)0x04000000U) /* Capture/Compare 9 interrupt Flag */ + +/** Bit definition for TIM_EVTGEN register **/ +#define TIM_EVTGEN_CC1GN ((uint32_t)0x00000001U) /* Capture/Compare 1 Generation */ +#define TIM_EVTGEN_CC2GN ((uint32_t)0x00000002U) /* Capture/Compare 2 Generation */ +#define TIM_EVTGEN_CC3GN ((uint32_t)0x00000004U) /* Capture/Compare 3 Generation */ +#define TIM_EVTGEN_CC4GN ((uint32_t)0x00000008U) /* Capture/Compare 4 Generation */ +#define TIM_EVTGEN_UDGN ((uint32_t)0x00000100U) /* Update Generation */ +#define TIM_EVTGEN_CCUDGN ((uint32_t)0x00000200U) /* Capture/Compare Control Update Generation */ +#define TIM_EVTGEN_TGN ((uint32_t)0x00000400U) /* Trigger Generation */ +#define TIM_EVTGEN_BGN ((uint32_t)0x00000800U) /* Break Generation */ +#define TIM_EVTGEN_BGN2 ((uint32_t)0x00001000U) /* Break2 Generation */ + +/** Bit definition for TIM_SMCTRL register **/ +#define TIM_SMCTRL_TSEL ((uint32_t)0x00000007U) /* TS[2:0] bits (Trigger selection) */ +#define TIM_SMCTRL_TSEL_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define TIM_SMCTRL_TSEL_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define TIM_SMCTRL_TSEL_2 ((uint32_t)0x00000004U) /* Bit 2 */ + +#define TIM_SMCTRL_SMSEL ((uint32_t)0x000000F0U) /* SMS[2:0] bits (Slave mode selection) */ +#define TIM_SMCTRL_SMSEL_0 ((uint32_t)0x00000010U) /* Bit 0 */ +#define TIM_SMCTRL_SMSEL_1 ((uint32_t)0x00000020U) /* Bit 1 */ +#define TIM_SMCTRL_SMSEL_2 ((uint32_t)0x00000040U) /* Bit 2 */ +#define TIM_SMCTRL_SMSEL_3 ((uint32_t)0x00000080U) /* Bit 3 */ + +#define TIM_SMCTRL_EXTPS ((uint32_t)0x00000300U) /* ETPS[1:0] bits (External trigger prescaler) */ +#define TIM_SMCTRL_EXTPS_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define TIM_SMCTRL_EXTPS_1 ((uint32_t)0x00000200U) /* Bit 1 */ + +#define TIM_SMCTRL_EXCEN ((uint32_t)0x00000400U) /* External clock enable */ +#define TIM_SMCTRL_EXTP ((uint32_t)0x00000800U) /* External trigger polarity */ + +#define TIM_SMCTRL_EXTF ((uint32_t)0x0000F000U) /* ETF[3:0] bits (External trigger filter) */ +#define TIM_SMCTRL_EXTF_0 ((uint32_t)0x00001000U) /* Bit 0 */ +#define TIM_SMCTRL_EXTF_1 ((uint32_t)0x00002000U) /* Bit 1 */ +#define TIM_SMCTRL_EXTF_2 ((uint32_t)0x00004000U) /* Bit 2 */ +#define TIM_SMCTRL_EXTF_3 ((uint32_t)0x00008000U) /* Bit 3 */ + +#define TIM_SMCTRL_MSMD ((uint32_t)0x00010000U) /* Master/slave mode */ + +#define TIM_SMCTRL_OCREFCLRP ((uint32_t)0x00080000U) /* Ocrefclear signal polarity */ + +#define TIM_SMCTRL_OCREFCLRF ((uint32_t)0x00F00000U) /* OCREFCLRF[3:0] bits (Ocrefclear signal prescaler) */ +#define TIM_SMCTRL_OCREFCLRF_0 ((uint32_t)0x00100000U) /* Bit 0 */ +#define TIM_SMCTRL_OCREFCLRF_1 ((uint32_t)0x00200000U) /* Bit 1 */ +#define TIM_SMCTRL_OCREFCLRF_2 ((uint32_t)0x00400000U) /* Bit 2 */ +#define TIM_SMCTRL_OCREFCLRF_3 ((uint32_t)0x00800000U) /* Bit 3 */ + +/** Bit definition for TIM_DINTEN register **/ +#define TIM_DINTEN_CC1IEN ((uint32_t)0x00000001U) /* Capture/Compare 1 interrupt enable */ +#define TIM_DINTEN_CC2IEN ((uint32_t)0x00000002U) /* Capture/Compare 2 interrupt enable */ +#define TIM_DINTEN_CC3IEN ((uint32_t)0x00000004U) /* Capture/Compare 3 interrupt enable */ +#define TIM_DINTEN_CC4IEN ((uint32_t)0x00000008U) /* Capture/Compare 4 interrupt enable */ +#define TIM_DINTEN_CC5IEN ((uint32_t)0x00000010U) /* Capture/Compare 5 interrupt enable */ +#define TIM_DINTEN_CC6IEN ((uint32_t)0x00000020U) /* Capture/Compare 6 interrupt enable */ +#define TIM_DINTEN_CC7IEN ((uint32_t)0x00000040U) /* Capture/Compare 7 interrupt enable */ +#define TIM_DINTEN_CC8IEN ((uint32_t)0x00000080U) /* Capture/Compare 8 interrupt enable */ +#define TIM_DINTEN_CC1DEN ((uint32_t)0x00000100U) /* Capture/Compare 1 DMA request enable */ +#define TIM_DINTEN_CC2DEN ((uint32_t)0x00000200U) /* Capture/Compare 2 DMA request enable */ +#define TIM_DINTEN_CC3DEN ((uint32_t)0x00000400U) /* Capture/Compare 3 DMA request enable */ +#define TIM_DINTEN_CC4DEN ((uint32_t)0x00000800U) /* Capture/Compare 4 DMA request enable */ +#define TIM_DINTEN_UIEN ((uint32_t)0x00010000U) /* Update interrupt enable */ +#define TIM_DINTEN_TIEN ((uint32_t)0x00020000U) /* Trigger interrupt enable */ +#define TIM_DINTEN_BIEN ((uint32_t)0x00040000U) /* Break interrupt enable */ +#define TIM_DINTEN_UDEN ((uint32_t)0x00080000U) /* Update DMA request enable */ +#define TIM_DINTEN_COMDEN ((uint32_t)0x00100000U) /* COM DMA request enable */ +#define TIM_DINTEN_TDEN ((uint32_t)0x00200000U) /* Trigger DMA request enable */ +#define TIM_DINTEN_COMIEN ((uint32_t)0x00400000U) /* COM interrupt enable */ +#define TIM_DINTEN_CC9IEN ((uint32_t)0x00800000U) /* Capture/Compare 9 interrupt enable */ + +/** Bit definition for TIM_CCMOD1 register **/ +#define TIM_CCMOD1_CC1SEL ((uint32_t)0x00000003U) /* CC1S[1:0] bits (Capture/Compare 1 Selection) */ +#define TIM_CCMOD1_CC1SEL_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define TIM_CCMOD1_CC1SEL_1 ((uint32_t)0x00000002U) /* Bit 1 */ + +#define TIM_CCMOD1_OC1PEN ((uint32_t)0x00000004U) /* Output Compare 1 Preload enable */ +#define TIM_CCMOD1_OC1FEN ((uint32_t)0x00000008U) /* Output Compare 1 Fast enable */ +#define TIM_CCMOD1_OC1CEN ((uint32_t)0x00000010U) /* Output Compare 1 Clear Enable */ + +#define TIM_CCMOD1_OC1MD ((uint32_t)0x000000E0U) /* OC1MD[2:0] bits (Output Compare 1 Mode) */ +#define TIM_CCMOD1_OC1MD_0 ((uint32_t)0x00000020U) /* Bit 0 */ +#define TIM_CCMOD1_OC1MD_1 ((uint32_t)0x00000040U) /* Bit 1 */ +#define TIM_CCMOD1_OC1MD_2 ((uint32_t)0x00000080U) /* Bit 2 */ + +#define TIM_CCMOD1_CC2SEL ((uint32_t)0x00000300U) /* CC2S[1:0] bits (Capture/Compare 2 Selection) */ +#define TIM_CCMOD1_CC2SEL_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define TIM_CCMOD1_CC2SEL_1 ((uint32_t)0x00000200U) /* Bit 1 */ + +#define TIM_CCMOD1_OC2PEN ((uint32_t)0x00000400U) /* Output Compare 2 Preload enable */ +#define TIM_CCMOD1_OC2FEN ((uint32_t)0x00000800U) /* Output Compare 2 Fast enable */ +#define TIM_CCMOD1_OC2CEN ((uint32_t)0x00001000U) /* Output Compare 2 Clear Enable */ + +#define TIM_CCMOD1_OC2MD ((uint32_t)0x0000E000U) /* OC2MD[2:0] bits (Output Compare 2 Mode) */ +#define TIM_CCMOD1_OC2MD_0 ((uint32_t)0x00002000U) /* Bit 0 */ +#define TIM_CCMOD1_OC2MD_1 ((uint32_t)0x00004000U) /* Bit 1 */ +#define TIM_CCMOD1_OC2MD_2 ((uint32_t)0x00008000U) /* Bit 2 */ + +#define TIM_CCMOD1_OC1MD_3 ((uint32_t)0x00020000U) /* OC1MD3 bit (Output Compare 1 Mode) */ +#define TIM_CCMOD1_OC2MD_3 ((uint32_t)0x00040000U) /* OC2MD3 bit (Output Compare 2 Mode) */ + +#define TIM_CCMOD1_IC1PSC ((uint32_t)0x0000000CU) /* IC1PSC[1:0] bits (Input Capture 1 Prescaler) */ +#define TIM_CCMOD1_IC1PSC_0 ((uint32_t)0x00000004U) /* Bit 0 */ +#define TIM_CCMOD1_IC1PSC_1 ((uint32_t)0x00000008U) /* Bit 1 */ + +#define TIM_CCMOD1_IC1F ((uint32_t)0x000000F0U) /* IC1F[3:0] bits (Input Capture 1 Filter) */ +#define TIM_CCMOD1_IC1F_0 ((uint32_t)0x00000010U) /* Bit 0 */ +#define TIM_CCMOD1_IC1F_1 ((uint32_t)0x00000020U) /* Bit 1 */ +#define TIM_CCMOD1_IC1F_2 ((uint32_t)0x00000040U) /* Bit 2 */ +#define TIM_CCMOD1_IC1F_3 ((uint32_t)0x00000080U) /* Bit 3 */ + +#define TIM_CCMOD1_IC2PSC ((uint32_t)0x00000C00U) /* IC2PSC[1:0] bits (Input Capture 2 Prescaler) */ +#define TIM_CCMOD1_IC2PSC_0 ((uint32_t)0x00000400U) /* Bit 0 */ +#define TIM_CCMOD1_IC2PSC_1 ((uint32_t)0x00000800U) /* Bit 1 */ + +#define TIM_CCMOD1_IC2F ((uint32_t)0x0000F000U) /* IC2F[3:0] bits (Input Capture 2 Filter) */ +#define TIM_CCMOD1_IC2F_0 ((uint32_t)0x00001000U) /* Bit 0 */ +#define TIM_CCMOD1_IC2F_1 ((uint32_t)0x00002000U) /* Bit 1 */ +#define TIM_CCMOD1_IC2F_2 ((uint32_t)0x00004000U) /* Bit 2 */ +#define TIM_CCMOD1_IC2F_3 ((uint32_t)0x00008000U) /* Bit 3 */ + +/** Bit definition for TIM_CCMOD2 register **/ +#define TIM_CCMOD2_CC3SEL ((uint32_t)0x00000003U) /* CC3S[1:0] bits (Capture/Compare 3 Selection) */ +#define TIM_CCMOD2_CC3SEL_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define TIM_CCMOD2_CC3SEL_1 ((uint32_t)0x00000002U) /* Bit 1 */ + +#define TIM_CCMOD2_OC3PEN ((uint32_t)0x00000004U) /* Output Compare 3 Preload enable */ +#define TIM_CCMOD2_OC3FEN ((uint32_t)0x00000008U) /* Output Compare 3 Fast enable */ +#define TIM_CCMOD2_OC3CEN ((uint32_t)0x00000010U) /* Output Compare 3 Clear Enable */ + +#define TIM_CCMOD2_OC3MD ((uint32_t)0x000000E0U) /* OC3MD[2:0] bits (Output Compare 3 Mode) */ +#define TIM_CCMOD2_OC3MD_0 ((uint32_t)0x00000020U) /* Bit 0 */ +#define TIM_CCMOD2_OC3MD_1 ((uint32_t)0x00000040U) /* Bit 1 */ +#define TIM_CCMOD2_OC3MD_2 ((uint32_t)0x00000080U) /* Bit 2 */ + +#define TIM_CCMOD2_CC4SEL ((uint32_t)0x00000300U) /* CC3S[1:0] bits (Capture/Compare 4 Selection) */ +#define TIM_CCMOD2_CC4SEL_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define TIM_CCMOD2_CC4SEL_1 ((uint32_t)0x00000200U) /* Bit 1 */ + +#define TIM_CCMOD2_OC4PEN ((uint32_t)0x00000400U) /* Output Compare 4 Preload enable */ +#define TIM_CCMOD2_OC4FEN ((uint32_t)0x00000800U) /* Output Compare 4 Fast enable */ +#define TIM_CCMOD2_OC4CEN ((uint32_t)0x00001000U) /* Output Compare 4 Clear Enable */ + +#define TIM_CCMOD2_OC4MD ((uint32_t)0x0000E000U) /* OC4MD[2:0] bits (Output Compare 4 Mode) */ +#define TIM_CCMOD2_OC4MD_0 ((uint32_t)0x00002000U) /* Bit 0 */ +#define TIM_CCMOD2_OC4MD_1 ((uint32_t)0x00004000U) /* Bit 1 */ +#define TIM_CCMOD2_OC4MD_2 ((uint32_t)0x00008000U) /* Bit 2 */ + +#define TIM_CCMOD2_OC3MD_3 ((uint32_t)0x00020000U) /* OC3MD3 bit (Output Compare 3 Mode) */ +#define TIM_CCMOD2_OC4MD_3 ((uint32_t)0x00040000U) /* OC4MD3 bit (Output Compare 4 Mode) */ + +#define TIM_CCMOD2_IC3PSC ((uint32_t)0x0000000CU) /* IC3PSC[1:0] bits (Input Capture 3 Prescaler) */ +#define TIM_CCMOD2_IC3PSC_0 ((uint32_t)0x00000004U) /* Bit 0 */ +#define TIM_CCMOD2_IC3PSC_1 ((uint32_t)0x00000008U) /* Bit 1 */ + +#define TIM_CCMOD2_IC3F ((uint32_t)0x000000F0U) /* IC3F[3:0] bits (Input Capture 3 Filter) */ +#define TIM_CCMOD2_IC3F_0 ((uint32_t)0x00000010U) /* Bit 0 */ +#define TIM_CCMOD2_IC3F_1 ((uint32_t)0x00000020U) /* Bit 1 */ +#define TIM_CCMOD2_IC3F_2 ((uint32_t)0x00000040U) /* Bit 2 */ +#define TIM_CCMOD2_IC3F_3 ((uint32_t)0x00000080U) /* Bit 3 */ + +#define TIM_CCMOD2_IC4PSC ((uint32_t)0x00000C00U) /* IC4PSC[1:0] bits (Input Capture 4 Prescaler) */ +#define TIM_CCMOD2_IC4PSC_0 ((uint32_t)0x00000400U) /* Bit 0 */ +#define TIM_CCMOD2_IC4PSC_1 ((uint32_t)0x00000800U) /* Bit 1 */ + +#define TIM_CCMOD2_IC4F ((uint32_t)0x0000F000U) /* IC4F[3:0] bits (Input Capture 4 Filter) */ +#define TIM_CCMOD2_IC4F_0 ((uint32_t)0x00001000U) /* Bit 0 */ +#define TIM_CCMOD2_IC4F_1 ((uint32_t)0x00002000U) /* Bit 1 */ +#define TIM_CCMOD2_IC4F_2 ((uint32_t)0x00004000U) /* Bit 2 */ +#define TIM_CCMOD2_IC4F_3 ((uint32_t)0x00008000U) /* Bit 3 */ + +/** Bit definition for TIM_CCMOD3 register **/ +#define TIM_CCMOD3_OC5PEN ((uint32_t)0x00000004U) /* Output Compare 5 Preload enable */ +#define TIM_CCMOD3_OC5FEN ((uint32_t)0x00000008U) /* Output Compare 5 Fast enable */ +#define TIM_CCMOD3_OC5CEN ((uint32_t)0x00000010U) /* Output Compare 5 Clear Enable */ + +#define TIM_CCMOD3_OC5MD ((uint32_t)0x000000E0U) /* OC5M[2:0] bits (Output Compare 5 Mode) */ +#define TIM_CCMOD3_OC5MD_0 ((uint32_t)0x00000020U) /* Bit 0 */ +#define TIM_CCMOD3_OC5MD_1 ((uint32_t)0x00000040U) /* Bit 1 */ +#define TIM_CCMOD3_OC5MD_2 ((uint32_t)0x00000080U) /* Bit 2 */ + +#define TIM_CCMOD3_OC6PEN ((uint32_t)0x00000400U) /* Output Compare 6 Preload enable */ +#define TIM_CCMOD3_OC6FEN ((uint32_t)0x00000800U) /* Output Compare 6 Fast enable */ +#define TIM_CCMOD3_OC6CEN ((uint32_t)0x00001000U) /* Output Compare 6 Clear Enable */ + +#define TIM_CCMOD3_OC6MD ((uint32_t)0x0000E000U) /* OC6M[2:0] bits (Output Compare 6 Mode) */ +#define TIM_CCMOD3_OC6MD_0 ((uint32_t)0x00002000U) /* Bit 0 */ +#define TIM_CCMOD3_OC6MD_1 ((uint32_t)0x00004000U) /* Bit 1 */ +#define TIM_CCMOD3_OC6MD_2 ((uint32_t)0x00008000U) /* Bit 2 */ + +#define TIM_CCMOD3_OC7PEN ((uint32_t)0x00010000U) /* Output Compare 7 Preload enable */ +#define TIM_CCMOD3_OC8PEN ((uint32_t)0x00100000U) /* Output Compare 8 Preload enable */ +#define TIM_CCMOD3_OC9PEN ((uint32_t)0x01000000U) /* Output Compare 9 Preload enable */ + +/** Bit definition for TIM_CCEN register **/ +#define TIM_CCEN_CC1NEN ((uint32_t)0x00000001U) /* Capture/Compare 1 Complementary output enable */ +#define TIM_CCEN_CC1NP ((uint32_t)0x00000002U) /* Capture/Compare 1 Complementary output Polarity */ +#define TIM_CCEN_CC1EN ((uint32_t)0x00000004U) /* Capture/Compare 1 output enable */ +#define TIM_CCEN_CC1P ((uint32_t)0x00000008U) /* Capture/Compare 1 output Polarity */ +#define TIM_CCEN_CC2NEN ((uint32_t)0x00000010U) /* Capture/Compare 2 Complementary output enable */ +#define TIM_CCEN_CC2NP ((uint32_t)0x00000020U) /* Capture/Compare 2 Complementary output Polarity */ +#define TIM_CCEN_CC2EN ((uint32_t)0x00000040U) /* Capture/Compare 2 output enable */ +#define TIM_CCEN_CC2P ((uint32_t)0x00000080U) /* Capture/Compare 2 output Polarity */ +#define TIM_CCEN_CC3NEN ((uint32_t)0x00000100U) /* Capture/Compare 3 Complementary output enable */ +#define TIM_CCEN_CC3NP ((uint32_t)0x00000200U) /* Capture/Compare 3 Complementary output Polarity */ +#define TIM_CCEN_CC3EN ((uint32_t)0x00000400U) /* Capture/Compare 3 output enable */ +#define TIM_CCEN_CC3P ((uint32_t)0x00000800U) /* Capture/Compare 3 output Polarity */ +#define TIM_CCEN_CC4NEN ((uint32_t)0x00001000U) /* Capture/Compare 4 Complementary output enable */ +#define TIM_CCEN_CC4NP ((uint32_t)0x00002000U) /* Capture/Compare 4 Complementary output Polarity */ +#define TIM_CCEN_CC4EN ((uint32_t)0x00004000U) /* Capture/Compare 4 output enable */ +#define TIM_CCEN_CC4P ((uint32_t)0x00008000U) /* Capture/Compare 4 output Polarity */ +#define TIM_CCEN_CC5EN ((uint32_t)0x00040000U) /* Capture/Compare 5 output enable */ +#define TIM_CCEN_CC5P ((uint32_t)0x00080000U) /* Capture/Compare 5 output Polarity */ +#define TIM_CCEN_CC6EN ((uint32_t)0x00400000U) /* Capture/Compare 6 output enable */ +#define TIM_CCEN_CC6P ((uint32_t)0x00800000U) /* Capture/Compare 6 output Polarity */ + +/** Bit definition for TIM_CCDAT1 register **/ +#define TIM_CCDAT1_CCDAT1 ((uint32_t)0x0000FFFFU) /* Capture/Compare 1 Value */ +#define TIM_CCDAT1_CCDDAT1 ((uint32_t)0xFFFF0000U) /* Capture/Compare 1 down-counting Value */ + +/** Bit definition for TIM_CCDAT2 register **/ +#define TIM_CCDAT2_CCDAT2 ((uint32_t)0x0000FFFFU) /* Capture/Compare 2 Value */ +#define TIM_CCDAT2_CCDDAT2 ((uint32_t)0xFFFF0000U) /* Capture/Compare 2 down-counting Value */ + +/** Bit definition for TIM_CCDAT3 register **/ +#define TIM_CCDAT3_CCDAT3 ((uint32_t)0x0000FFFFU) /* Capture/Compare 3 Value */ +#define TIM_CCDAT3_CCDDAT3 ((uint32_t)0xFFFF0000U) /* Capture/Compare 3 down-counting Value */ + +/** Bit definition for TIM_CCDAT4 register **/ +#define TIM_CCDAT4_CCDAT4 ((uint32_t)0x0000FFFFU) /* Capture/Compare 4 Value */ +#define TIM_CCDAT4_CCDDAT4 ((uint32_t)0xFFFF0000U) /* Capture/Compare 4 down-counting Value */ + +/** Bit definition for TIM_CCDAT5 register **/ +#define TIM_CCDAT5_CCDAT5 ((uint32_t)0x0000FFFFU) /* Capture/Compare 5 Value */ + +/** Bit definition for TIM_CCDAT6 register **/ +#define TIM_CCDAT6_CCDAT6 ((uint32_t)0x0000FFFFU) /* Capture/Compare 6 Value */ + +/** Bit definition for TIM_PSC register **/ +#define TIM_PSC_PSC ((uint32_t)0x0000FFFFU) /* Prescaler Value */ + +/** Bit definition for TIM_AR register **/ +#define TIM_AR_AR ((uint32_t)0x0000FFFFU) /* actual auto-reload Value */ + +/** Bit definition for TIM_CNT register **/ +#define TIM_CNT_CNT ((uint32_t)0xFFFFFFFFU) /* Counter Value */ + +/** Bit definition for TIM_REPCNT register **/ +#define TIM_REPCNT_REPCNT ((uint32_t)0x000000FFU) /* Repetition Counter Value */ + +/** Bit definition for TIM_BKDT register **/ +#define TIM_BKDT_DTGN ((uint32_t)0x000000FFU) /* DTG[0:7] bits (Dead-Time Generator set-up) */ +#define TIM_BKDT_DTGN_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define TIM_BKDT_DTGN_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define TIM_BKDT_DTGN_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define TIM_BKDT_DTGN_3 ((uint32_t)0x00000008U) /* Bit 3 */ +#define TIM_BKDT_DTGN_4 ((uint32_t)0x00000010U) /* Bit 4 */ +#define TIM_BKDT_DTGN_5 ((uint32_t)0x00000020U) /* Bit 5 */ +#define TIM_BKDT_DTGN_6 ((uint32_t)0x00000040U) /* Bit 6 */ +#define TIM_BKDT_DTGN_7 ((uint32_t)0x00000080U) /* Bit 7 */ + +#define TIM_BKDT_MOEN ((uint32_t)0x00000100U) /* Main Output enable */ +#define TIM_BKDT_AOEN ((uint32_t)0x00000200U) /* Automatic Output enable */ +#define TIM_BKDT_BKP ((uint32_t)0x00000400U) /* Break Polarity */ +#define TIM_BKDT_BKEN ((uint32_t)0x00000800U) /* Break enable */ +#define TIM_BKDT_OSSI ((uint32_t)0x00001000U) /* Off-State Selection for Idle mode */ +#define TIM_BKDT_OSSR ((uint32_t)0x00002000U) /* Off-State Selection for Run mode */ + +#define TIM_BKDT_LCKCFG ((uint32_t)0x0000C000U) /* LOCK[1:0] bits (Lock Configuration) */ +#define TIM_BKDT_LCKCFG_0 ((uint32_t)0x00004000U) /* Bit 0 */ +#define TIM_BKDT_LCKCFG_1 ((uint32_t)0x00008000U) /* Bit 1 */ + +#define TIM_BKDT_BK2P ((uint32_t)0x00010000U) /* Break2 Polarity */ +#define TIM_BKDT_BK2EN ((uint32_t)0x00020000U) /* Break2 enable */ +#define TIM_BKDT_BRKDSRM ((uint32_t)0x00040000U) /* Break disarm */ +#define TIM_BKDT_BRK2DSRM ((uint32_t)0x00080000U) /* Break2 disarm */ +#define TIM_BKDT_BRKBID ((uint32_t)0x00100000U) /* Break bidirectional enable */ +#define TIM_BKDT_BRK2BID ((uint32_t)0x00200000U) /* Break2 bidirectional enable */ + +/** Bit definition for TIM_CCDAT7 register **/ +#define TIM_CCDAT7_CCDAT7 ((uint32_t)0x0000FFFFU) /* Capture/Compare 7 Value */ + +/** Bit definition for TIM_CCDAT8 register **/ +#define TIM_CCDAT8_CCDAT8 ((uint32_t)0x0000FFFFU) /* Capture/Compare 8 Value */ + +/** Bit definition for TIM_CCDAT9 register **/ +#define TIM_CCDAT9_CCDAT9 ((uint32_t)0x0000FFFFU) /* Capture/Compare 9 Value */ + +/** Bit definition for TIM_BKFR register **/ +#define TIM_BKFR_THRESH ((uint32_t)0x3F000000U) /* Break1 filter threshold */ +#define TIM_BKFR_THRESH_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define TIM_BKFR_THRESH_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define TIM_BKFR_THRESH_2 ((uint32_t)0x04000000U) /* Bit 2 */ +#define TIM_BKFR_THRESH_3 ((uint32_t)0x08000000U) /* Bit 3 */ +#define TIM_BKFR_THRESH_4 ((uint32_t)0x10000000U) /* Bit 4 */ +#define TIM_BKFR_THRESH_5 ((uint32_t)0x20000000U) /* Bit 5 */ + +#define TIM_BKFR_WSIZE ((uint32_t)0x007E0000U) /* Break1 filter window size */ +#define TIM_BKFR_WSIZE_0 ((uint32_t)0x00020000U) /* Bit 0 */ +#define TIM_BKFR_WSIZE_1 ((uint32_t)0x00040000U) /* Bit 1 */ +#define TIM_BKFR_WSIZE_2 ((uint32_t)0x00080000U) /* Bit 2 */ +#define TIM_BKFR_WSIZE_3 ((uint32_t)0x00100000U) /* Bit 3 */ +#define TIM_BKFR_WSIZE_4 ((uint32_t)0x00200000U) /* Bit 4 */ +#define TIM_BKFR_WSIZE_5 ((uint32_t)0x00400000U) /* Bit 5 */ + +#define TIM_BKFR_FILTEN ((uint32_t)0x00010000U) /* Break1 filter enable */ +#define TIM_BKFR_SFPSC ((uint32_t)0x0000FFFFU) + +/** Bit definition for TIM_C1FILT register **/ +#define TIM_C1FILT_THRESH ((uint32_t)0x3F000000U) /* CH1 filter threshold */ +#define TIM_C1FILT_THRESH_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define TIM_C1FILT_THRESH_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define TIM_C1FILT_THRESH_2 ((uint32_t)0x04000000U) /* Bit 2 */ +#define TIM_C1FILT_THRESH_3 ((uint32_t)0x08000000U) /* Bit 3 */ +#define TIM_C1FILT_THRESH_4 ((uint32_t)0x10000000U) /* Bit 4 */ +#define TIM_C1FILT_THRESH_5 ((uint32_t)0x20000000U) /* Bit 5 */ + +#define TIM_C1FILT_WSIZE ((uint32_t)0x007E0000U) /* CH1 filter window size */ +#define TIM_C1FILT_WSIZE_0 ((uint32_t)0x00020000U) /* Bit 0 */ +#define TIM_C1FILT_WSIZE_1 ((uint32_t)0x00040000U) /* Bit 1 */ +#define TIM_C1FILT_WSIZE_2 ((uint32_t)0x00080000U) /* Bit 2 */ +#define TIM_C1FILT_WSIZE_3 ((uint32_t)0x00100000U) /* Bit 3 */ +#define TIM_C1FILT_WSIZE_4 ((uint32_t)0x00200000U) /* Bit 4 */ +#define TIM_C1FILT_WSIZE_5 ((uint32_t)0x00400000U) /* Bit 5 */ + +#define TIM_C1FILT_FILTEN ((uint32_t)0x00010000U) +#define TIM_C1FILT_SFPSC ((uint32_t)0x0000FFFFU) + +/** Bit definition for TIM_C2FILT register **/ +#define TIM_C2FILT_THRESH ((uint32_t)0x3F000000U) /* CH2 filter threshold */ +#define TIM_C2FILT_THRESH_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define TIM_C2FILT_THRESH_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define TIM_C2FILT_THRESH_2 ((uint32_t)0x04000000U) /* Bit 2 */ +#define TIM_C2FILT_THRESH_3 ((uint32_t)0x08000000U) /* Bit 3 */ +#define TIM_C2FILT_THRESH_4 ((uint32_t)0x10000000U) /* Bit 4 */ +#define TIM_C2FILT_THRESH_5 ((uint32_t)0x20000000U) /* Bit 5 */ + +#define TIM_C2FILT_WSIZE ((uint32_t)0x007E0000U) /* CH2 filter window size */ +#define TIM_C2FILT_WSIZE_0 ((uint32_t)0x00020000U) /* Bit 0 */ +#define TIM_C2FILT_WSIZE_1 ((uint32_t)0x00040000U) /* Bit 1 */ +#define TIM_C2FILT_WSIZE_2 ((uint32_t)0x00080000U) /* Bit 2 */ +#define TIM_C2FILT_WSIZE_3 ((uint32_t)0x00100000U) /* Bit 3 */ +#define TIM_C2FILT_WSIZE_4 ((uint32_t)0x00200000U) /* Bit 4 */ +#define TIM_C2FILT_WSIZE_5 ((uint32_t)0x00400000U) /* Bit 5 */ + +#define TIM_C2FILT_FILTEN ((uint32_t)0x00010000U) +#define TIM_C2FILT_SFPSC ((uint32_t)0x0000FFFFU) + +/** Bit definition for TIM_C3FILT register **/ +#define TIM_C3FILT_THRESH ((uint32_t)0x3F000000U) /* CH3 filter threshold */ +#define TIM_C3FILT_THRESH_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define TIM_C3FILT_THRESH_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define TIM_C3FILT_THRESH_2 ((uint32_t)0x04000000U) /* Bit 2 */ +#define TIM_C3FILT_THRESH_3 ((uint32_t)0x08000000U) /* Bit 3 */ +#define TIM_C3FILT_THRESH_4 ((uint32_t)0x10000000U) /* Bit 4 */ +#define TIM_C3FILT_THRESH_5 ((uint32_t)0x20000000U) /* Bit 5 */ + +#define TIM_C3FILT_WSIZE ((uint32_t)0x007E0000U) /* CH3 filter window size */ +#define TIM_C3FILT_WSIZE_0 ((uint32_t)0x00020000U) /* Bit 0 */ +#define TIM_C3FILT_WSIZE_1 ((uint32_t)0x00040000U) /* Bit 1 */ +#define TIM_C3FILT_WSIZE_2 ((uint32_t)0x00080000U) /* Bit 2 */ +#define TIM_C3FILT_WSIZE_3 ((uint32_t)0x00100000U) /* Bit 3 */ +#define TIM_C3FILT_WSIZE_4 ((uint32_t)0x00200000U) /* Bit 4 */ +#define TIM_C3FILT_WSIZE_5 ((uint32_t)0x00400000U) /* Bit 5 */ + +#define TIM_C3FILT_FILTEN ((uint32_t)0x00010000U) +#define TIM_C3FILT_SFPSC ((uint32_t)0x0000FFFFU) + +/** Bit definition for TIM_C4FILT register **/ +#define TIM_C4FILT_THRESH ((uint32_t)0x3F000000U) /* CH4 filter threshold */ +#define TIM_C4FILT_THRESH_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define TIM_C4FILT_THRESH_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define TIM_C4FILT_THRESH_2 ((uint32_t)0x04000000U) /* Bit 2 */ +#define TIM_C4FILT_THRESH_3 ((uint32_t)0x08000000U) /* Bit 3 */ +#define TIM_C4FILT_THRESH_4 ((uint32_t)0x10000000U) /* Bit 4 */ +#define TIM_C4FILT_THRESH_5 ((uint32_t)0x20000000U) /* Bit 5 */ + +#define TIM_C4FILT_WSIZE ((uint32_t)0x007E0000U) /* CH4 filter window size */ +#define TIM_C4FILT_WSIZE_0 ((uint32_t)0x00020000U) /* Bit 0 */ +#define TIM_C4FILT_WSIZE_1 ((uint32_t)0x00040000U) /* Bit 1 */ +#define TIM_C4FILT_WSIZE_2 ((uint32_t)0x00080000U) /* Bit 2 */ +#define TIM_C4FILT_WSIZE_3 ((uint32_t)0x00100000U) /* Bit 3 */ +#define TIM_C4FILT_WSIZE_4 ((uint32_t)0x00200000U) /* Bit 4 */ +#define TIM_C4FILT_WSIZE_5 ((uint32_t)0x00400000U) /* Bit 5 */ + +#define TIM_C4FILT_FILTEN ((uint32_t)0x00010000U) +#define TIM_C4FILT_SFPSC ((uint32_t)0x0000FFFFU) + +/** Bit definition for TIM_FILTO register **/ +#define TIM_FILTO_C1FILTO ((uint32_t)0x00000001U) /* CH1 filter output state */ +#define TIM_FILTO_C2FILTO ((uint32_t)0x00000002U) /* CH2 filter output state */ +#define TIM_FILTO_C3FILTO ((uint32_t)0x00000004U) /* CH3 filter output state */ +#define TIM_FILTO_C4FILTO ((uint32_t)0x00000008U) /* CH4 filter output state */ + +/** Bit definition for TIM_INSEL register **/ +#define TIM_INSEL_TI1S ((uint32_t)0x0000000FU) /* TI1 signal selection */ +#define TIM_INSEL_TI1S_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define TIM_INSEL_TI1S_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define TIM_INSEL_TI1S_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define TIM_INSEL_TI1S_3 ((uint32_t)0x00000008U) /* Bit 3 */ + +#define TIM_INSEL_TI2S ((uint32_t)0x000000F0U) /* TI2 signal selection */ +#define TIM_INSEL_TI2S_0 ((uint32_t)0x00000010U) /* Bit 0 */ +#define TIM_INSEL_TI2S_1 ((uint32_t)0x00000020U) /* Bit 1 */ +#define TIM_INSEL_TI2S_2 ((uint32_t)0x00000040U) /* Bit 2 */ +#define TIM_INSEL_TI2S_3 ((uint32_t)0x00000080U) /* Bit 3 */ + +#define TIM_INSEL_TI3S ((uint32_t)0x00000F00U) /* TI3 signal selection */ +#define TIM_INSEL_TI3S_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define TIM_INSEL_TI3S_1 ((uint32_t)0x00000200U) /* Bit 1 */ +#define TIM_INSEL_TI3S_2 ((uint32_t)0x00000400U) /* Bit 2 */ +#define TIM_INSEL_TI3S_3 ((uint32_t)0x00000800U) /* Bit 3 */ + +#define TIM_INSEL_TI4S ((uint32_t)0x0000F000U) /* TI4 signal selection */ +#define TIM_INSEL_TI4S_0 ((uint32_t)0x00001000U) /* Bit 0 */ +#define TIM_INSEL_TI4S_1 ((uint32_t)0x00002000U) /* Bit 1 */ +#define TIM_INSEL_TI4S_2 ((uint32_t)0x00004000U) /* Bit 2 */ +#define TIM_INSEL_TI4S_3 ((uint32_t)0x00008000U) /* Bit 3 */ + +#define TIM_INSEL_ETRS ((uint32_t)0x000F0000U) /* etr signal selection */ +#define TIM_INSEL_ETRS_0 ((uint32_t)0x00010000U) /* Bit 0 */ +#define TIM_INSEL_ETRS_1 ((uint32_t)0x00020000U) /* Bit 1 */ +#define TIM_INSEL_ETRS_2 ((uint32_t)0x00040000U) /* Bit 2 */ +#define TIM_INSEL_ETRS_3 ((uint32_t)0x00080000U) /* Bit 3 */ + +#define TIM_INSEL_ITRS ((uint32_t)0x00F00000U) /* itr signal selection */ +#define TIM_INSEL_ITRS_0 ((uint32_t)0x00100000U) /* Bit 0 */ +#define TIM_INSEL_ITRS_1 ((uint32_t)0x00200000U) /* Bit 1 */ +#define TIM_INSEL_ITRS_2 ((uint32_t)0x00400000U) /* Bit 2 */ +#define TIM_INSEL_ITRS_3 ((uint32_t)0x00800000U) /* Bit 3 */ + +#define TIM_INSEL_CLRS ((uint32_t)0x0F000000U) /* Ocrefclear signal selection */ +#define TIM_INSEL_CLRS_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define TIM_INSEL_CLRS_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define TIM_INSEL_CLRS_2 ((uint32_t)0x04000000U) /* Bit 2 */ +#define TIM_INSEL_CLRS_3 ((uint32_t)0x08000000U) /* Bit 3 */ + +/** Bit definition for TIM_AF1 register **/ +#define TIM_AF1_IOMBRKEN ((uint32_t)0x00000001U) /* Enable IOM as break1 input */ +#define TIM_AF1_COMP1BRKEN ((uint32_t)0x00000002U) /* Enable COMP1 as break1 input */ +#define TIM_AF1_COMP2BRKEN ((uint32_t)0x00000004U) /* Enable COMP2 as break1 input */ +#define TIM_AF1_COMP3BRKEN ((uint32_t)0x00000008U) /* Enable COMP3 as break1 input */ +#define TIM_AF1_COMP4BRKEN ((uint32_t)0x00000010U) /* Enable COMP4 as break1 input */ +#define TIM_AF1_DSMU0BRKEN ((uint32_t)0x01000000U) /* Enable DSMU0 as break1 input */ +#define TIM_AF1_DSMU1BRKEN ((uint32_t)0x02000000U) /* Enable DSMU1 as break1 input */ +#define TIM_AF1_DSMU2BRKEN ((uint32_t)0x04000000U) /* Enable DSMU2 as break1 input */ +#define TIM_AF1_DSMU3BRKEN ((uint32_t)0x08000000U) /* Enable DSMU3 as break1 input */ + +#define TIM_AF1_IOMBRKP ((uint32_t)0x00000200U) /* Select polarity of break1 input from IOM */ +#define TIM_AF1_COMP1BRKP ((uint32_t)0x00000400U) /* Select polarity of break1 input from COMP1 */ +#define TIM_AF1_COMP2BRKP ((uint32_t)0x00000800U) /* Select polarity of break1 input from COMP2 */ +#define TIM_AF1_COMP3BRKP ((uint32_t)0x00001000U) /* Select polarity of break1 input from COMP3 */ +#define TIM_AF1_COMP4BRKP ((uint32_t)0x00002000U) /* Select polarity of break1 input from COMP4 */ + +/** Bit definition for TIM_AF2 register **/ +#define TIM_AF2_IOMBRK2EN ((uint32_t)0x00000001U) /* Enable IOM as break2 input */ +#define TIM_AF2_COMP1BRK2EN ((uint32_t)0x00000002U) /* Enable COMP1 as break2 input */ +#define TIM_AF2_COMP2BRK2EN ((uint32_t)0x00000004U) /* Enable COMP2 as break2 input */ +#define TIM_AF2_COMP3BRK2EN ((uint32_t)0x00000008U) /* Enable COMP3 as break2 input */ +#define TIM_AF2_COMP4BRK2EN ((uint32_t)0x00000010U) /* Enable COMP4 as break2 input */ +#define TIM_AF2_DSMU0BRK2EN ((uint32_t)0x01000000U) /* Enable DSMU0 as break2 input */ +#define TIM_AF2_DSMU1BRK2EN ((uint32_t)0x02000000U) /* Enable DSMU1 as break2 input */ +#define TIM_AF2_DSMU2BRK2EN ((uint32_t)0x04000000U) /* Enable DSMU2 as break2 input */ +#define TIM_AF2_DSMU3BRK2EN ((uint32_t)0x08000000U) /* Enable DSMU3 as break2 input */ + + +#define TIM_AF2_IOMBRK2P ((uint32_t)0x00000200U) /* Select polarity of break2 input from IOM */ +#define TIM_AF2_COMP1BRK2P ((uint32_t)0x00000400U) /* Select polarity of break2 input from COMP1 */ +#define TIM_AF2_COMP2BRK2P ((uint32_t)0x00000800U) /* Select polarity of break2 input from COMP2 */ +#define TIM_AF2_COMP3BRK2P ((uint32_t)0x00001000U) /* Select polarity of break2 input from COMP3 */ +#define TIM_AF2_COMP4BRK2P ((uint32_t)0x00002000U) /* Select polarity of break2 input from COMP4 */ + +/** Bit definition for TIM_BKFR2 register **/ +#define TIM_BKFR2_THRESH ((uint32_t)0x3F000000U) /* Break2 filter threshold */ +#define TIM_BKFR2_THRESH_0 ((uint32_t)0x01000000U) /* Bit 0 */ +#define TIM_BKFR2_THRESH_1 ((uint32_t)0x02000000U) /* Bit 1 */ +#define TIM_BKFR2_THRESH_2 ((uint32_t)0x04000000U) /* Bit 2 */ +#define TIM_BKFR2_THRESH_3 ((uint32_t)0x08000000U) /* Bit 3 */ +#define TIM_BKFR2_THRESH_4 ((uint32_t)0x10000000U) /* Bit 4 */ +#define TIM_BKFR2_THRESH_5 ((uint32_t)0x20000000U) /* Bit 5 */ + +#define TIM_BKFR2_WSIZE ((uint32_t)0x007E0000U) /* Break2 filter window size */ +#define TIM_BKFR2_WSIZE_0 ((uint32_t)0x00020000U) /* Bit 0 */ +#define TIM_BKFR2_WSIZE_1 ((uint32_t)0x00040000U) /* Bit 1 */ +#define TIM_BKFR2_WSIZE_2 ((uint32_t)0x00080000U) /* Bit 2 */ +#define TIM_BKFR2_WSIZE_3 ((uint32_t)0x00100000U) /* Bit 3 */ +#define TIM_BKFR2_WSIZE_4 ((uint32_t)0x00200000U) /* Bit 4 */ +#define TIM_BKFR2_WSIZE_5 ((uint32_t)0x00400000U) /* Bit 5 */ + +#define TIM_BKFR2_FILTEN ((uint32_t)0x00010000U) +#define TIM_BKFR2_SFPSC ((uint32_t)0x0000FFFFU) + + + +/** Bit definition for TIM_DCTRL register **/ +#define TIM_DCTRL_DBADDR ((uint32_t)0x00003F00U) /* DBA[5:0] bits (DMA Base Address) */ +#define TIM_DCTRL_DBADDR_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define TIM_DCTRL_DBADDR_1 ((uint32_t)0x00000200U) /* Bit 1 */ +#define TIM_DCTRL_DBADDR_2 ((uint32_t)0x00000400U) /* Bit 2 */ +#define TIM_DCTRL_DBADDR_3 ((uint32_t)0x00000800U) /* Bit 3 */ +#define TIM_DCTRL_DBADDR_4 ((uint32_t)0x00001000U) /* Bit 4 */ +#define TIM_DCTRL_DBADDR_5 ((uint32_t)0x00002000U) /* Bit 5 */ + +#define TIM_DCTRL_DBLEN ((uint32_t)0x0000003FU) /* DBL[5:0] bits (DMA Burst Length) */ +#define TIM_DCTRL_DBLEN_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define TIM_DCTRL_DBLEN_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define TIM_DCTRL_DBLEN_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define TIM_DCTRL_DBLEN_3 ((uint32_t)0x00000008U) /* Bit 3 */ +#define TIM_DCTRL_DBLEN_4 ((uint32_t)0x00000010U) /* Bit 4 */ +#define TIM_DCTRL_DBLEN_5 ((uint32_t)0x00000020U) /* Bit 5 */ + +/** Bit definition for TIM_DADDR register **/ +#define TIM_DADDR_BURST ((uint32_t)0xFFFFFFFFU) /* DMA register for burst accesses */ + +/*** LCDC ***/ + +/** Bit definition for LCDC_SYNCCTRL register **/ +#define LCDC_SYNCCTRL_VSH ((uint32_t)0x0000FFFFU) /* Vertical synchronization height */ +#define LCDC_SYNCCTRL_HSW ((uint32_t)0xFFFF0000U) /* Horizontal synchronization width */ + +/** Bit definition for LCDC_BPCTRL register **/ +#define LCDC_BPCTRL_AHBP ((uint32_t)0x0000FFFFU) /* Accumulated vertical back porch */ +#define LCDC_BPCTRL_AVBP ((uint32_t)0xFFFF0000U) /* Accumulated horizontal back porch */ + +/** Bit definition for LCDC_AWCTRL register **/ +#define LCDC_AWCTRL_AAH ((uint32_t)0x0000FFFFU) /* Accumulated active height */ +#define LCDC_AWCTRL_AAW ((uint32_t)0xFFFF0000U) /* Accumulated active width */ + +/** Bit definition for LCDC_TWCTRL register **/ +#define LCDC_TWCTRL_TOTALH ((uint32_t)0x0000FFFFU) /* Total height */ +#define LCDC_TWCTRL_TOTALW ((uint32_t)0xFFFF0000U) /* Total width */ + +/** Bit definition for LCDC_GCTRL register **/ +#define LCDC_GCTRL_EN ((uint32_t)0x00000001U) /* LCDC enable */ +#define LCDC_GCTRL_GCEN ((uint32_t)0x00000002U) /* Gamma correction enable */ +#define LCDC_GCTRL_DBW ((uint32_t)0x00000070U) /* Bit[6:4] Dither blue width */ +#define LCDC_GCTRL_DGW ((uint32_t)0x00000700U) /* Bit[10:8] Dither green width */ +#define LCDC_GCTRL_DRW ((uint32_t)0x00007000U) /* Bit[14:12] Dither red width */ +#define LCDC_GCTRL_DEN ((uint32_t)0x00010000U) /* Dither enable */ +#define LCDC_GCTRL_PCLKPOL ((uint32_t)0x10000000U) /* Pixel clock polarity */ +#define LCDC_GCTRL_DEPOL ((uint32_t)0x20000000U) /* Data enable polarity */ +#define LCDC_GCTRL_VSPOL ((uint32_t)0x40000000U) /* Vertical polarity */ +#define LCDC_GCTRL_HSPOL ((uint32_t)0x80000000U) /* Horizontal polarity */ + +/** Bit definition for LCDC_SRCTRL register **/ +#define LCDC_SRCTRL_IMR ((uint32_t)0x00000001U) /* Immediate reload */ +#define LCDC_SRCTRL_VBR ((uint32_t)0x00000002U) /* Vertical blanking reload */ + +/** Bit definition for LCDC_BGCCTRL register **/ +#define LCDC_BGCCTRL_BCB ((uint32_t)0x000000FFU) /* Background blue value */ +#define LCDC_BGCCTRL_BCG ((uint32_t)0x0000FF00U) /* Background green value */ +#define LCDC_BGCCTRL_BCR ((uint32_t)0x00FF0000U) /* Background red value */ + +/** Bit definition for LCDC_INTEN register **/ +#define LCDC_INTEN_LIEN ((uint32_t)0x00000001U) /* Line interrupt enable */ +#define LCDC_INTEN_FUIEN ((uint32_t)0x00000002U) /* FIFO underrun interrupt enable */ +#define LCDC_INTEN_BEIEN ((uint32_t)0x00000004U) /* BUS error interrupt enable */ +#define LCDC_INTEN_RRIEN ((uint32_t)0x00000008U) /* Register reload interrupt enable */ +#define LCDC_INTEN_STNSIGIEN ((uint32_t)0x00000010U) /* Slave timing no signal interrupt enable */ +#define LCDC_INTEN_STNSYNCIEN ((uint32_t)0x00000020U) /* Slave timing not in sync interrupt enable */ +#define LCDC_INTEN_FUKIEN ((uint32_t)0x00000040U) /* FIFO underrun killing interrupt enable */ +#define LCDC_INTEN_CRCIEN ((uint32_t)0x00000080U) /* CRC interrupt enable */ +#define LCDC_INTEN_RFEIEN ((uint32_t)0x00000100U) /* Rotation FIFO error interrupt enable */ + +/** Bit definition for LCDC_INTSTS register **/ +#define LCDC_INTSTS_LIF ((uint32_t)0x00000001U) /* Line interrupt flag */ +#define LCDC_INTSTS_FUIF ((uint32_t)0x00000002U) /* FIFO underrun interrupt flag */ +#define LCDC_INTSTS_BEIF ((uint32_t)0x00000004U) /* BUS error interrupt flag */ +#define LCDC_INTSTS_RRIF ((uint32_t)0x00000008U) /* Register reload interrupt flag */ +#define LCDC_INTSTS_STNSIGIF ((uint32_t)0x00000010U) /* Slave timing no signal interrupt flag */ +#define LCDC_INTSTS_STNSYNCIF ((uint32_t)0x00000020U) /* Slave timing not in sync interrupt flag */ +#define LCDC_INTSTS_FUKIF ((uint32_t)0x00000040U) /* FIFO underrun killing interrupt flag */ +#define LCDC_INTSTS_CRCIF ((uint32_t)0x00000080U) /* CRC interrupt flag */ +#define LCDC_INTSTS_RFEIF ((uint32_t)0x00000100U) /* Rotation FIFO error interrupt flag */ + +/** Bit definition for LCDC_INTCLR register **/ +#define LCDC_INTCLR_LICLR ((uint32_t)0x00000001U) /* Line interrupt flag clear */ +#define LCDC_INTCLR_FUICLR ((uint32_t)0x00000002U) /* FIFO underrun interrupt flag clear */ +#define LCDC_INTCLR_BEICLR ((uint32_t)0x00000004U) /* BUS error interrupt flag clear */ +#define LCDC_INTCLR_RRICLR ((uint32_t)0x00000008U) /* Register reload interrupt flag clear */ +#define LCDC_INTCLR_STNSIGICLR ((uint32_t)0x00000010U) /* Slave timing no signal interrupt flag clear */ +#define LCDC_INTCLR_STNSYNCICLR ((uint32_t)0x00000020U) /* Slave timing not in sync interrupt flag clear */ +#define LCDC_INTCLR_FUKICLR ((uint32_t)0x00000040U) /* FIFO underrun killing interrupt flag clear */ +#define LCDC_INTCLR_CRCICLR ((uint32_t)0x00000080U) /* CRC interrupt flag clear */ +#define LCDC_INTCLR_RFEICLR ((uint32_t)0x00000100U) /* Rotation FIFO error interrupt flag clear */ + +/** Bit definition for LCDC_LINTPCTRL register **/ +#define LCDC_LINTPCTRL_LINTP ((uint32_t)0x0000FFFFU) /* Line interrupt position */ + +/** Bit definition for LCDC_CPSTS register **/ +#define LCDC_CPSTS_CYPOS ((uint32_t)0x0000FFFFU) /* Current Y position */ +#define LCDC_CPSTS_CXPOS ((uint32_t)0xFFFF0000U) /* Current X position */ + +/** Bit definition for LCDC_CDSTS register **/ +#define LCDC_CDSTS_VBS ((uint32_t)0x00000001U) /* Vertical blanking status */ +#define LCDC_CDSTS_HBS ((uint32_t)0x00000002U) /* Horizontal blanking status */ +#define LCDC_CDSTS_VSYNCS ((uint32_t)0x00000004U) /* Vertical synchronization status */ +#define LCDC_CDSTS_HSYNCS ((uint32_t)0x00000008U) /* Horizontal synchronization status */ + +/** Bit definition for LCDC_EXTDCTRL register **/ +#define LCDC_EXTDCTRL_DVEN ((uint32_t)0x00100000U) /* Dual view enable */ +#define LCDC_EXTDCTRL_SPMEN ((uint32_t)0x00200000U) /* Sub-pixel mixing enable */ +#define LCDC_EXTDCTRL_PCLKHEEN ((uint32_t)0x00400000U) /* Pixel clock half even enable */ +#define LCDC_EXTDCTRL_PCLKHOEN ((uint32_t)0x00800000U) /* Pixel clock half odd enable */ +#define LCDC_EXTDCTRL_PCLKHES ((uint32_t)0x01000000U) /* Pixel clock half odd/even active edge shift */ + +/** Bit definition for LCDC_LSRCTRL register **/ +#define LCDC_LSRCTRL_IMR ((uint32_t)0x00000001U) /* Layer reload immediate */ +#define LCDC_LSRCTRL_VBR ((uint32_t)0x00000002U) /* Layer reload vertical blanking */ +#define LCDC_LSRCTRL_MGR ((uint32_t)0x00000004U) /* Layer reload mask global */ + +/** Bit definition for LCDC_LCTRL register **/ +#define LCDC_LCTRL_LEN ((uint32_t)0x00000001U) /* Layer enable */ +#define LCDC_LCTRL_CKEN ((uint32_t)0x00000002U) /* Color key enable */ +#define LCDC_LCTRL_VDEN ((uint32_t)0x00000004U) /* Vertical duplication enable */ +#define LCDC_LCTRL_HDEN ((uint32_t)0x00000008U) /* Horizontal duplication enable */ +#define LCDC_LCTRL_CLUTEN ((uint32_t)0x00000010U) /* CLUT enable */ +#define LCDC_LCTRL_CKREN ((uint32_t)0x00000020U) /* Color key replace enable */ + +#define LCDC_LCTRL_DVMD ((uint32_t)0x000000C0U) /* Dual-view insertion mode */ +#define LCDC_LCTRL_DVMD_0 ((uint32_t)0x00000040U) /* Bit 0 */ +#define LCDC_LCTRL_DVMD_1 ((uint32_t)0x00000080U) /* Bit 1 */ + +#define LCDC_LCTRL_HMEN ((uint32_t)0x00000100U) /* Horizontal mirroring enable */ +#define LCDC_LCTRL_DCBEN ((uint32_t)0x00000200U) /* Default color blending enable */ +#define LCDC_LCTRL_SEN ((uint32_t)0x00000400U) /* Scaler enable */ + +/** Bit definition for LCDC_WHCTRL register **/ +#define LCDC_WHPCTRL_WHSTPOS ((uint32_t)0x0000FFFFU) /* Window horizontal start position */ +#define LCDC_WHPCTRL_WHSPPOS ((uint32_t)0xFFFF0000U) /* Window horizontal stop position */ + +/** Bit definition for LCDC_WVCTRL register **/ +#define LCDC_WVPCTRL_WVSTPOS ((uint32_t)0x0000FFFFU) /* Window vertical start position */ +#define LCDC_WVPCTRL_WVSPPOS ((uint32_t)0xFFFF0000U) /* Window vertical stop position */ + +/** Bit definition for LCDC_CKCTRL register **/ +#define LCDC_CKCTRL_CKB ((uint32_t)0x000000FFU) /* Color key blue value */ +#define LCDC_CKCTRL_CKG ((uint32_t)0x0000FF00U) /* Color key green value */ +#define LCDC_CKCTRL_CKR ((uint32_t)0x00FF0000U) /* Color key red value */ + +/** Bit definition for LCDC_PFCTRL register **/ +#define LCDC_PFCTRL_PF ((uint32_t)0x00000007U) /* Pixel format */ +#define LCDC_PFCTRL_PF_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define LCDC_PFCTRL_PF_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define LCDC_PFCTRL_PF_2 ((uint32_t)0x00000004U) /* Bit 2 */ + +/** Bit definition for LCDC_CACTRL register **/ +#define LCDC_CACTRL_CA ((uint32_t)0x000000FFU) /* Constant alpha */ + +/** Bit definition for LCDC_DCCTRL register **/ +#define LCDC_DCCTRL_DCB ((uint32_t)0x000000FFU) /* Default color blue */ +#define LCDC_DCCTRL_DCG ((uint32_t)0x0000FF00U) /* Default color green */ +#define LCDC_DCCTRL_DCR ((uint32_t)0x00FF0000U) /* Default color red */ +#define LCDC_DCCTRL_DCA ((uint32_t)0xFF000000U) /* Default color alpha */ + +/** Bit definition for LCDC_BFCTRL register **/ +#define LCDC_BFCTRL_BF2 ((uint32_t)0x00000007U) /* Blending factor 2 */ +#define LCDC_BFCTRL_BF2_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define LCDC_BFCTRL_BF2_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define LCDC_BFCTRL_BF2_2 ((uint32_t)0x00000004U) /* Bit 2 */ + +#define LCDC_BFCTRL_BF1 ((uint32_t)0x00000700U) /* Blending factor 2 */ +#define LCDC_BFCTRL_BF1_0 ((uint32_t)0x00000100U) /* Bit 0 */ +#define LCDC_BFCTRL_BF1_1 ((uint32_t)0x00000200U) /* Bit 1 */ +#define LCDC_BFCTRL_BF1_2 ((uint32_t)0x00000400U) /* Bit 2 */ + +#define LCDC_BFCTRL_LBOP ((uint32_t)0x000F0000U) /* Layer blending order position */ +#define LCDC_BFCTRL_LBOP_0 ((uint32_t)0x00010000U) /* Bit 0 */ +#define LCDC_BFCTRL_LBOP_1 ((uint32_t)0x00020000U) /* Bit 1 */ +#define LCDC_BFCTRL_LBOP_2 ((uint32_t)0x00040000U) /* Bit 2 */ +#define LCDC_BFCTRL_LBOP_3 ((uint32_t)0x00080000U) /* Bit 3 */ + +/** Bit definition for LCDC_FBBCTRL register **/ +#define LCDC_FBBCTRL_NWB ((uint32_t)0x000000FFU) /* Number of words per burst */ + +/** Bit definition for LCDC_AFBCTRL register **/ +#define LCDC_AFBCTRL_APEN ((uint32_t)0x00000001U) /* Alpha plane enable */ +#define LCDC_AFBCTRL_VDEN ((uint32_t)0x00000002U) /* Vertical duplication enable */ +#define LCDC_AFBCTRL_HDEN ((uint32_t)0x00000004U) /* Horizontal duplication enable */ +#define LCDC_AFBCTRL_YUVEN ((uint32_t)0x00000008U) /* YUV conversion enable */ + +#define LCDC_AFBCTRL_YUVMD ((uint32_t)0x00000030U) /* YUV conversion mode */ +#define LCDC_AFBCTRL_YUVMD_0 ((uint32_t)0x00000010U) /* Bit 0 */ +#define LCDC_AFBCTRL_YUVMD_1 ((uint32_t)0x00000020U) /* Bit 1 */ +#define LCDC_AFBCTRL_YUVMD_2 ((uint32_t)0x00000040U) /* Bit 2 */ + +#define LCDC_AFBCTRL_YUVIMDO ((uint32_t)0x000001C0U) /* YUV interleaved mode order */ +#define LCDC_AFBCTRL_YHEN ((uint32_t)0x00000200U) /* Y headroom enable */ + +/** Bit definition for LCDC_CFBADDR register **/ +#define LCDC_CFBADDR_CFBADDR ((uint32_t)0xFFFFFFFFU) /* Color frame buffer start address */ + +/** Bit definition for LCDC_CFBLEN register **/ +#define LCDC_CFBLEN_CFBLLEN ((uint32_t)0x0000FFFFU) /* Color frame buffer line length */ +#define LCDC_CFBLEN_CFBP ((uint32_t)0xFFFF0000U) /* Color frame buffer pitch in bytes */ + +/** Bit definition for LCDC_CFBLNUM register **/ +#define LCDC_CFBLNUM_CFBLNUM ((uint32_t)0x0000FFFFU) /* Color frame buffer line number */ + +/** Bit definition for LCDC_AFBADDR0 register **/ +#define LCDC_AFBADDR0_AFBADDR0 ((uint32_t)0xFFFFFFFFU) /* Auxiliary 0 frame buffer start address */ + +/** Bit definition for LCDC_AFBADDR1 register **/ +#define LCDC_AFBADDR0_AFBADDR1 ((uint32_t)0xFFFFFFFFU) /* Auxiliary 1 frame buffer start address */ + +/** Bit definition for LCDC_AFBLEN register **/ +#define LCDC_AFBLEN_AFBLLEN ((uint32_t)0x0000FFFFU) /* Auxiliary frame buffer line length */ +#define LCDC_AFBLEN_AFBP ((uint32_t)0xFFFF0000U) /* Auxiliary frame buffer pitch in bytes */ + +/** Bit definition for LCDC_AFBLNUM register **/ +#define LCDC_AFBLNUM_AFBLNUM ((uint32_t)0x0000FFFFU) /* Auxiliary frame buffer line number */ + +/** Bit definition for LCDC_CLUTWR register **/ +#define LCDC_CLUTWR_CLUTB ((uint32_t)0x000000FFU) /* CLUT blue value */ +#define LCDC_CLUTWR_CLUTG ((uint32_t)0x0000FF00U) /* CLUT green value */ +#define LCDC_CLUTWR_CLUTR ((uint32_t)0x00FF0000U) /* CLUT red value */ +#define LCDC_CLUTWR_CLUTADDR ((uint32_t)0xFF000000U) /* CLUT address */ + +/** Bit definition for LCDC_SINS register **/ +#define LCDC_SINS_SINW ((uint32_t)0x00000FFFU) /* Scaler input width */ +#define LCDC_SINS_SINH ((uint32_t)0x0FFF0000U) /* Scaler input height */ + +/** Bit definition for LCDC_SOUTS register **/ +#define LCDC_SOUTS_SOUTW ((uint32_t)0x00000FFFU) /* Scaler output width */ +#define LCDC_SOUTS_SOUTH ((uint32_t)0x0FFF0000U) /* Scaler output height */ + +/** Bit definition for LCDC_VSF register **/ +#define LCDC_VSF_VSF ((uint32_t)0x0000FFFFU) /* Vertical scaling factor */ + +/** Bit definition for LCDC_VSP register **/ +#define LCDC_VSP_VSP ((uint32_t)0x0000FFFFU) /* Vertical scaling phase */ + +/** Bit definition for LCDC_HSF register **/ +#define LCDC_HSF_HSF ((uint32_t)0x0000FFFFU) /* Horizontal scaling factor */ + +/** Bit definition for LCDC_HSP register **/ +#define LCDC_HSP_HSP ((uint32_t)0x0000FFFFU) /* Horizontal scaling phase */ + +/** Bit definition for LCDC_YUVS1 register **/ +#define LCDC_YUVS1_RVCS ((uint32_t)0x000003FFU) /* Red Cr(V) scale */ +#define LCDC_YUVS1_BUCS ((uint32_t)0x03FF0000U) /* Blue Cb(U) scale */ + +/** Bit definition for LCDC_YUVS2 register **/ +#define LCDC_YUVS2_GVCS ((uint32_t)0x000003FFU) /* Green Cr(V) scale */ +#define LCDC_YUVS2_GUCS ((uint32_t)0x03FF0000U) /* Green Cb(U) scale */ + +/** Bit definition for LCDC_FCF1 register **/ +#define LCDC_FCF1_ASB ((uint32_t)0x0000001FU) /* Alpha start bit */ +#define LCDC_FCF1_ALENB ((uint32_t)0x000001E0U) /* Alpha length bit */ +#define LCDC_FCF1_RSB ((uint32_t)0x00003E00U) /* Red start bit */ +#define LCDC_FCF1_RLENB ((uint32_t)0x0003C000U) /* Red length bit */ + +/** Bit definition for LCDC_FCF2 register **/ +#define LCDC_FCF2_GSB ((uint32_t)0x0000001FU) /* Green start bit */ +#define LCDC_FCF2_GLENB ((uint32_t)0x000001E0U) /* Green length bit */ +#define LCDC_FCF2_BSB ((uint32_t)0x00003E00U) /* Blue start bit */ +#define LCDC_FCF2_BLENB ((uint32_t)0x0003C000U) /* Blue length bit */ +#define LCDC_FCF2_BPP ((uint32_t)0x001C0000U) /* Bytes per pixel */ + +/**** JPEG controller ****/ + +/*** JPEG CTRL controller ***/ +/** Bit definition for JPEG_CTRL register **/ +#define JPEG_CTRL_TYPE ((uint32_t)0x00000001U) /* Choose JPEG operation */ +#define JPEG_CTRL_SWAP ((uint32_t)0x00000002U) /* Swap Data for YCbCr 4:2:2 Format in BRC bit */ + + +/*** JPEG BRC controller ***/ +/** Bit definition for JPEGBRC_INIT register **/ +#define JPEGBRC_INIT_INITF ((uint32_t)0x00000010U) /* Initialization completion flag bit */ +#define JPEGBRC_INIT_BUSY ((uint32_t)0x00000002U) /* busy bit */ +#define JPEGBRC_INIT_INIT ((uint32_t)0x00000001U) /* init bit */ + +/** Bit definition for JPEGBRC_EN register **/ +#define JPEGBRC_EN_EN ((uint32_t)0x00000001U) /* Enables stream processing of the core */ + +/** Bit definition for JPEGBRC_BUFBADDR register **/ +#define JPEGBRC_BUFBADDR_ADDR ((uint32_t)0xFFFFFFFFU) /* AXI buffer base address */ +#define JPEGBRC_BUFBADDR_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGBRC_BUFBADDR_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGBRC_BUFBADDR_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGBRC_BUFBADDR_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGBRC_BUFBADDR_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGBRC_BUFBADDR_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGBRC_BUFBADDR_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGBRC_BUFBADDR_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGBRC_BUFBADDR_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGBRC_BUFBADDR_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGBRC_BUFBADDR_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGBRC_BUFBADDR_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGBRC_BUFBADDR_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGBRC_BUFBADDR_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGBRC_BUFBADDR_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGBRC_BUFBADDR_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGBRC_BUFBADDR_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGBRC_BUFBADDR_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGBRC_BUFBADDR_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGBRC_BUFBADDR_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGBRC_BUFBADDR_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGBRC_BUFBADDR_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGBRC_BUFBADDR_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGBRC_BUFBADDR_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGBRC_BUFBADDR_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGBRC_BUFBADDR_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGBRC_BUFBADDR_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGBRC_BUFBADDR_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGBRC_BUFBADDR_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGBRC_BUFBADDR_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGBRC_BUFBADDR_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGBRC_BUFBADDR_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGBRC_BUFSIZE register **/ +#define JPEGBRC_BUFSIZE_SIZE ((uint32_t)0x0000FFFFU) /* AXI buffer size */ +#define JPEGBRC_BUFSIZE_SIZE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGBRC_BUFSIZE_SIZE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGBRC_BUFSIZE_SIZE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGBRC_BUFSIZE_SIZE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGBRC_BUFSIZE_SIZE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGBRC_BUFSIZE_SIZE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGBRC_BUFSIZE_SIZE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGBRC_BUFSIZE_SIZE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGBRC_BUFSIZE_SIZE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGBRC_BUFSIZE_SIZE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGBRC_BUFSIZE_SIZE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGBRC_BUFSIZE_SIZE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGBRC_BUFSIZE_SIZE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGBRC_BUFSIZE_SIZE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGBRC_BUFSIZE_SIZE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGBRC_BUFSIZE_SIZE_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/** Bit definition for JPEGBRC_USMODE register **/ +#define JPEGBRC_USMODE_MODE ((uint32_t)0x00000003U) /* Up sampling mode */ +#define JPEGBRC_USMODE_MODE_0 ((uint32_t)0x00000001U) /* bit1 */ +#define JPEGBRC_USMODE_MODE_1 ((uint32_t)0x00000002U) /* bit0 */ + + + +/*** JPEG RBC controller ***/ +/** Bit definition for JPEGRBC_INIT register **/ +#define JPEGRBC_INIT_INITF ((uint32_t)0x00000010U) /* Init complete flag */ +#define JPEGRBC_INIT_INIT ((uint32_t)0x00000001U) /* Init bit */ + +/** Bit definition for JPEGRBC_EN register **/ +#define JPEGRBC_EN_EN ((uint32_t)0x00000001U) /* Enables stream processing of the core */ + +/** Bit definition for JPEGRBC_SWITCH register **/ +#define JPEGRBC_SWITCH_SWITCH ((uint32_t)0x00000001U) /* Switch input sample order */ + +/** Bit definition for JPEGRBC_FRMW register **/ +#define JPEGRBC_FRMW_WIDTH ((uint32_t)0x0000FFFFU) /* Frame width */ +#define JPEGRBC_FRMW_WIDTH_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_FRMW_WIDTH_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_FRMW_WIDTH_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_FRMW_WIDTH_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_FRMW_WIDTH_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_FRMW_WIDTH_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_FRMW_WIDTH_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_FRMW_WIDTH_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_FRMW_WIDTH_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_FRMW_WIDTH_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_FRMW_WIDTH_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_FRMW_WIDTH_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_FRMW_WIDTH_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_FRMW_WIDTH_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_FRMW_WIDTH_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGRBC_FRMW_WIDTH_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/** Bit definition for JPEGRBC_FRMH register **/ +#define JPEGRBC_FRMH_HEIGHT ((uint32_t)0x0000FFFFU) /* Frame height */ +#define JPEGRBC_FRMH_HEIGHT_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_FRMH_HEIGHT_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_FRMH_HEIGHT_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_FRMH_HEIGHT_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_FRMH_HEIGHT_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_FRMH_HEIGHT_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_FRMH_HEIGHT_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_FRMH_HEIGHT_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_FRMH_HEIGHT_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_FRMH_HEIGHT_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_FRMH_HEIGHT_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_FRMH_HEIGHT_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_FRMH_HEIGHT_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_FRMH_HEIGHT_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_FRMH_HEIGHT_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGRBC_FRMH_HEIGHT_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/** Bit definition for JPEGRBC_PFORM register **/ +#define JPEGRBC_PFORM_FORMAT ((uint32_t)0x00000007U) /* Pixel format */ +#define JPEGRBC_PFORM_FORMAT_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_PFORM_FORMAT_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_PFORM_FORMAT_2 ((uint32_t)0x00000004U) /* Bit2*/ + +/** Bit definition for JPEGRBC_CNAME register **/ +#define JPEGRBC_CNAME_C2 ((uint32_t)0x00FF0000U) /* Name of component 2 */ +#define JPEGRBC_CNAME_C2_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGRBC_CNAME_C2_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGRBC_CNAME_C2_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGRBC_CNAME_C2_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGRBC_CNAME_C2_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGRBC_CNAME_C2_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGRBC_CNAME_C2_6 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGRBC_CNAME_C2_7 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGRBC_CNAME_C1 ((uint32_t)0x0000FF00U) /* Name of component 1 */ +#define JPEGRBC_CNAME_C1_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_CNAME_C1_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_CNAME_C1_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_CNAME_C1_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_CNAME_C1_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_CNAME_C1_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_CNAME_C1_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGRBC_CNAME_C1_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGRBC_CNAME_C0 ((uint32_t)0x000000FFU) /* Name of component 0 */ +#define JPEGRBC_CNAME_C0_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_CNAME_C0_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_CNAME_C0_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_CNAME_C0_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_CNAME_C0_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_CNAME_C0_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_CNAME_C0_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_CNAME_C0_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for JPEGRBC_C0SADD register **/ +#define JPEGRBC_C0SADD_ADDR ((uint32_t)0xFFFFFFFFU) /* Component 0 start address */ +#define JPEGRBC_C0SADD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_C0SADD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_C0SADD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_C0SADD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_C0SADD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_C0SADD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_C0SADD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_C0SADD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_C0SADD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_C0SADD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_C0SADD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_C0SADD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_C0SADD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_C0SADD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_C0SADD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGRBC_C0SADD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGRBC_C0SADD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGRBC_C0SADD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGRBC_C0SADD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGRBC_C0SADD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGRBC_C0SADD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGRBC_C0SADD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGRBC_C0SADD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGRBC_C0SADD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGRBC_C0SADD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGRBC_C0SADD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGRBC_C0SADD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGRBC_C0SADD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGRBC_C0SADD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGRBC_C0SADD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGRBC_C0SADD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGRBC_C0SADD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGRBC_C0EADD register **/ +#define JPEGRBC_C0EADD_ADDR ((uint32_t)0x000003FFU) /* Component 0 end address */ +#define JPEGRBC_C0EADD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_C0EADD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_C0EADD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_C0EADD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_C0EADD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_C0EADD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_C0EADD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_C0EADD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_C0EADD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_C0EADD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ + +/** Bit definition for JPEGRBC_BPS0 register **/ +#define JPEGRBC_BPS0_NUM ((uint32_t)0x0FFFFFFFU) /* Blocks per Scan 0 */ +#define JPEGRBC_BPS0_NUM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_BPS0_NUM_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_BPS0_NUM_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_BPS0_NUM_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_BPS0_NUM_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_BPS0_NUM_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_BPS0_NUM_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_BPS0_NUM_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_BPS0_NUM_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_BPS0_NUM_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_BPS0_NUM_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_BPS0_NUM_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_BPS0_NUM_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_BPS0_NUM_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_BPS0_NUM_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGRBC_BPS0_NUM_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGRBC_BPS0_NUM_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGRBC_BPS0_NUM_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGRBC_BPS0_NUM_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGRBC_BPS0_NUM_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGRBC_BPS0_NUM_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGRBC_BPS0_NUM_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGRBC_BPS0_NUM_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGRBC_BPS0_NUM_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGRBC_BPS0_NUM_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGRBC_BPS0_NUM_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGRBC_BPS0_NUM_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGRBC_BPS0_NUM_27 ((uint32_t)0x08000000U) /* Bit27*/ + +/** Bit definition for JPEGRBC_BPS12 register **/ +#define JPEGRBC_BPS12_NUM ((uint32_t)0x0FFFFFFFU) /* Blocks per Scan 1,2 */ +#define JPEGRBC_BPS12_NUM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_BPS12_NUM_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_BPS12_NUM_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_BPS12_NUM_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_BPS12_NUM_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_BPS12_NUM_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_BPS12_NUM_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_BPS12_NUM_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_BPS12_NUM_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_BPS12_NUM_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_BPS12_NUM_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_BPS12_NUM_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_BPS12_NUM_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_BPS12_NUM_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_BPS12_NUM_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGRBC_BPS12_NUM_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGRBC_BPS12_NUM_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGRBC_BPS12_NUM_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGRBC_BPS12_NUM_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGRBC_BPS12_NUM_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGRBC_BPS12_NUM_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGRBC_BPS12_NUM_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGRBC_BPS12_NUM_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGRBC_BPS12_NUM_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGRBC_BPS12_NUM_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGRBC_BPS12_NUM_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGRBC_BPS12_NUM_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGRBC_BPS12_NUM_27 ((uint32_t)0x08000000U) /* Bit27*/ + +/** Bit definition for JPEGRBC_ROWS0 register **/ +#define JPEGRBC_ROWS0_NUM ((uint32_t)0x00001FFFU) /* MCU rows Scan 0 */ +#define JPEGRBC_ROWS0_NUM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_ROWS0_NUM_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_ROWS0_NUM_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_ROWS0_NUM_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_ROWS0_NUM_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_ROWS0_NUM_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_ROWS0_NUM_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_ROWS0_NUM_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_ROWS0_NUM_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_ROWS0_NUM_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_ROWS0_NUM_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_ROWS0_NUM_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_ROWS0_NUM_12 ((uint32_t)0x00001000U) /* Bit12*/ + +/** Bit definition for JPEGRBC_ROWS12 register **/ +#define JPEGRBC_ROWS12_NUM ((uint32_t)0x00001FFFU) /* MCU rows Scan 1,2 */ +#define JPEGRBC_ROWS12_NUM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_ROWS12_NUM_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_ROWS12_NUM_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_ROWS12_NUM_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_ROWS12_NUM_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_ROWS12_NUM_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_ROWS12_NUM_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_ROWS12_NUM_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_ROWS12_NUM_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_ROWS12_NUM_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_ROWS12_NUM_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_ROWS12_NUM_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_ROWS12_NUM_12 ((uint32_t)0x00001000U) /* Bit12*/ + +/** Bit definition for JPEGRBC_HHALF register **/ +#define JPEGRBC_HHALF_HHALF ((uint32_t)0x00007FFFU) /* Frame height half */ +#define JPEGRBC_HHALF_HHALF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_HHALF_HHALF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_HHALF_HHALF_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_HHALF_HHALF_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_HHALF_HHALF_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_HHALF_HHALF_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_HHALF_HHALF_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_HHALF_HHALF_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_HHALF_HHALF_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_HHALF_HHALF_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_HHALF_HHALF_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_HHALF_HHALF_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_HHALF_HHALF_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_HHALF_HHALF_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_HHALF_HHALF_14 ((uint32_t)0x00004000U) /* Bit14*/ + +/** Bit definition for JPEGRBC_BLSS0 register **/ +#define JPEGRBC_BLSS0_SIZE ((uint32_t)0x0003FFFFU) /* Block line stride Scan 0 */ +#define JPEGRBC_BLSS0_SIZE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_BLSS0_SIZE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_BLSS0_SIZE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_BLSS0_SIZE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_BLSS0_SIZE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_BLSS0_SIZE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_BLSS0_SIZE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_BLSS0_SIZE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_BLSS0_SIZE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_BLSS0_SIZE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_BLSS0_SIZE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_BLSS0_SIZE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_BLSS0_SIZE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_BLSS0_SIZE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_BLSS0_SIZE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGRBC_BLSS0_SIZE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGRBC_BLSS0_SIZE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGRBC_BLSS0_SIZE_17 ((uint32_t)0x00020000U) /* Bit17*/ + +/** Bit definition for JPEGRBC_BLSS12 register **/ +#define JPEGRBC_BLSS12_SIZE ((uint32_t)0x0003FFFFU) /* Block line stride Scan 1,2 */ +#define JPEGRBC_BLSS12_SIZE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_BLSS12_SIZE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_BLSS12_SIZE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_BLSS12_SIZE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_BLSS12_SIZE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_BLSS12_SIZE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_BLSS12_SIZE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_BLSS12_SIZE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_BLSS12_SIZE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_BLSS12_SIZE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_BLSS12_SIZE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_BLSS12_SIZE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_BLSS12_SIZE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_BLSS12_SIZE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_BLSS12_SIZE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGRBC_BLSS12_SIZE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGRBC_BLSS12_SIZE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGRBC_BLSS12_SIZE_17 ((uint32_t)0x00020000U) /* Bit17*/ + +/** Bit definition for JPEGRBC_BPRS0 register **/ +#define JPEGRBC_BPRS0_NUM ((uint32_t)0x00007FFFU) /* Blocks per MCU row Scan 0 */ +#define JPEGRBC_BPRS0_NUM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_BPRS0_NUM_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_BPRS0_NUM_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_BPRS0_NUM_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_BPRS0_NUM_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_BPRS0_NUM_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_BPRS0_NUM_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_BPRS0_NUM_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_BPRS0_NUM_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_BPRS0_NUM_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_BPRS0_NUM_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_BPRS0_NUM_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_BPRS0_NUM_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_BPRS0_NUM_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_BPRS0_NUM_14 ((uint32_t)0x00004000U) /* Bit14*/ + +/** Bit definition for JPEGRBC_BPRS12 register **/ +#define JPEGRBC_BPRS12_NUM ((uint32_t)0x00007FFFU) /* Blocks per MCU row Scan 1,2 */ +#define JPEGRBC_BPRS12_NUM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_BPRS12_NUM_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_BPRS12_NUM_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_BPRS12_NUM_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_BPRS12_NUM_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_BPRS12_NUM_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_BPRS12_NUM_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_BPRS12_NUM_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_BPRS12_NUM_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_BPRS12_NUM_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_BPRS12_NUM_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_BPRS12_NUM_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_BPRS12_NUM_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_BPRS12_NUM_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_BPRS12_NUM_14 ((uint32_t)0x00004000U) /* Bit14*/ + +/** Bit definition for JPEGRBC_MAXW register **/ +#define JPEGRBC_MAXW_WIDTH ((uint32_t)0xFFFFFFFFU) /* Maximum supported width */ +#define JPEGRBC_MAXW_WIDTH_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_MAXW_WIDTH_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_MAXW_WIDTH_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_MAXW_WIDTH_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_MAXW_WIDTH_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_MAXW_WIDTH_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_MAXW_WIDTH_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_MAXW_WIDTH_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_MAXW_WIDTH_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_MAXW_WIDTH_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_MAXW_WIDTH_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_MAXW_WIDTH_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_MAXW_WIDTH_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_MAXW_WIDTH_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_MAXW_WIDTH_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGRBC_MAXW_WIDTH_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGRBC_MAXW_WIDTH_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGRBC_MAXW_WIDTH_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGRBC_MAXW_WIDTH_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGRBC_MAXW_WIDTH_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGRBC_MAXW_WIDTH_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGRBC_MAXW_WIDTH_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGRBC_MAXW_WIDTH_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGRBC_MAXW_WIDTH_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGRBC_MAXW_WIDTH_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGRBC_MAXW_WIDTH_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGRBC_MAXW_WIDTH_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGRBC_MAXW_WIDTH_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGRBC_MAXW_WIDTH_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGRBC_MAXW_WIDTH_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGRBC_MAXW_WIDTH_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGRBC_MAXW_WIDTH_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGRBC_MAXH register **/ +#define JPEGRBC_MAXH_HEIGHT ((uint32_t)0xFFFFFFFFU) /* Maximum supported height */ +#define JPEGRBC_MAXH_HEIGHT_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_MAXH_HEIGHT_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_MAXH_HEIGHT_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_MAXH_HEIGHT_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_MAXH_HEIGHT_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_MAXH_HEIGHT_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_MAXH_HEIGHT_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_MAXH_HEIGHT_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_MAXH_HEIGHT_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_MAXH_HEIGHT_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_MAXH_HEIGHT_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_MAXH_HEIGHT_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_MAXH_HEIGHT_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_MAXH_HEIGHT_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_MAXH_HEIGHT_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGRBC_MAXH_HEIGHT_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGRBC_MAXH_HEIGHT_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGRBC_MAXH_HEIGHT_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGRBC_MAXH_HEIGHT_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGRBC_MAXH_HEIGHT_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGRBC_MAXH_HEIGHT_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGRBC_MAXH_HEIGHT_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGRBC_MAXH_HEIGHT_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGRBC_MAXH_HEIGHT_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGRBC_MAXH_HEIGHT_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGRBC_MAXH_HEIGHT_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGRBC_MAXH_HEIGHT_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGRBC_MAXH_HEIGHT_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGRBC_MAXH_HEIGHT_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGRBC_MAXH_HEIGHT_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGRBC_MAXH_HEIGHT_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGRBC_MAXH_HEIGHT_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGRBC_MBSIZE register **/ +#define JPEGRBC_MBSIZE_SIZE ((uint32_t)0xFFFFFFFFU) /* Maximum supported buffer size */ +#define JPEGRBC_MBSIZE_SIZE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGRBC_MBSIZE_SIZE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGRBC_MBSIZE_SIZE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGRBC_MBSIZE_SIZE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGRBC_MBSIZE_SIZE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGRBC_MBSIZE_SIZE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGRBC_MBSIZE_SIZE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGRBC_MBSIZE_SIZE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGRBC_MBSIZE_SIZE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGRBC_MBSIZE_SIZE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGRBC_MBSIZE_SIZE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGRBC_MBSIZE_SIZE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGRBC_MBSIZE_SIZE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGRBC_MBSIZE_SIZE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGRBC_MBSIZE_SIZE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGRBC_MBSIZE_SIZE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGRBC_MBSIZE_SIZE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGRBC_MBSIZE_SIZE_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGRBC_MBSIZE_SIZE_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGRBC_MBSIZE_SIZE_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGRBC_MBSIZE_SIZE_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGRBC_MBSIZE_SIZE_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGRBC_MBSIZE_SIZE_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGRBC_MBSIZE_SIZE_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGRBC_MBSIZE_SIZE_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGRBC_MBSIZE_SIZE_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGRBC_MBSIZE_SIZE_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGRBC_MBSIZE_SIZE_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGRBC_MBSIZE_SIZE_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGRBC_MBSIZE_SIZE_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGRBC_MBSIZE_SIZE_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGRBC_MBSIZE_SIZE_31 ((uint32_t)0x80000000U) /* Bit31*/ + + +/*** JPEG SGDMA(P2H/H2P) controller ***/ +/** Bit definition for JPEGDMA_CTRL register **/ +#define JPEGDMA_CTRL_HARDRST ((uint32_t)0x80000000U) /* Software hard reset */ +#define JPEGDMA_CTRL_SGLTRST ((uint32_t)0x00000200U) /* Reset the TAIL of the SGList to zero */ +#define JPEGDMA_CTRL_MMODE ((uint32_t)0x000001C0U) /* Descriptor Memory Mode settings */ +#define JPEGDMA_CTRL_MMODE_0 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_CTRL_MMODE_1 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_CTRL_MMODE_2 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_CTRL_OPMODE ((uint32_t)0x00000038U) /* Operation Mode Settings */ +#define JPEGDMA_CTRL_OPMODE_0 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_CTRL_OPMODE_1 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_CTRL_OPMODE_2 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_CTRL_START ((uint32_t)0x00000004U) /* DMA Start */ +#define JPEGDMA_CTRL_EN ((uint32_t)0x00000002U) /* Software enable */ +#define JPEGDMA_CTRL_CLR ((uint32_t)0x00000001U) /* Software reset for the entire H2P/P2H */ + +/** Bit definition for JPEGDMA_STS register **/ +#define JPEGDMA_STS_RRERR ((uint32_t)0x00008000U) /* AXI Read response when error has occurred (MSB) */ +#define JPEGDMA_STS_WRERR ((uint32_t)0x00004000U) /* MSB)(AXI Write response when error has occurred (MSB) */ +#define JPEGDMA_STS_WDATAERR ((uint32_t)0x00002000U) /* AXI MM Write Error when writing data */ +#define JPEGDMA_STS_RDATAERR ((uint32_t)0x00001000U) /* AXI MM Read Error when reading data */ +#define JPEGDMA_STS_WDESCERR ((uint32_t)0x00000800U) /* AXI MM Write Error when writing a descriptor */ +#define JPEGDMA_STS_RDESCERR ((uint32_t)0x00000400U) /* AXI MM Read Error when reading a descriptor */ +#define JPEGDMA_STS_FIFOFULL ((uint32_t)0x00000100U) /* Data FIFO is full */ +#define JPEGDMA_STS_FIFOEMPTY ((uint32_t)0x00000080U) /* Data FIFO is empty */ +#define JPEGDMA_STS_EOD ((uint32_t)0x00000040U) /* End-Of-Descriptor */ +#define JPEGDMA_STS_AOOD ((uint32_t)0x00000020U) /* Channel is Almost Out of Descriptors */ +#define JPEGDMA_STS_OOD ((uint32_t)0x00000010U) /* Out Of Descriptors */ +#define JPEGDMA_STS_EOFIN ((uint32_t)0x00000008U) /* End-Of-Frame sampled at the input of the channel */ +#define JPEGDMA_STS_EOFOUT ((uint32_t)0x00000004U) /* End-Of-Frame sampled at the output of the channel */ +#define JPEGDMA_STS_GINT ((uint32_t)0x00000002U) /* Global interrupt status bit for the Channel */ +#define JPEGDMA_STS_BUSY ((uint32_t)0x00000001U) /* H2P/P2H is processing a transfer */ + +/** Bit definition for JPEGDMA_IE register **/ +#define JPEGDMA_IE_WDATAERREN ((uint32_t)0x00002000U) /* Enable interrupt on AXI MM Write Error when writing data */ +#define JPEGDMA_IE_RDATAERREN ((uint32_t)0x00001000U) /* Enable interrupt on AXI MM Read Error when reading data */ +#define JPEGDMA_IE_WDESCERREN ((uint32_t)0x00000800U) /* Enable interrupt on AXI MM Write Error when writing a descriptor */ +#define JPEGDMA_IE_RDESCERREN ((uint32_t)0x00000400U) /* Enable interrupt on AXI MM Read Error when reading a descriptor */ +#define JPEGDMA_IE_EODINTEN ((uint32_t)0x00000040U) /* Enable for the End of Descriptor interrupt */ +#define JPEGDMA_IE_AOODINTEN ((uint32_t)0x00000020U) /* Enable for the Almost Out of Descriptors interrupt */ +#define JPEGDMA_IE_OODINTEN ((uint32_t)0x00000010U) /* Enable for the Out of Descriptors interrupt */ +#define JPEGDMA_IE_EOFININTEN ((uint32_t)0x00000008U) /* Enable for the input EOF interrupt */ +#define JPEGDMA_IE_EOFOUTINTEN ((uint32_t)0x00000004U) /* Enable for the output EOF interrupt */ +#define JPEGDMA_IE_GINTEN ((uint32_t)0x00000002U) /* Global interrupt enable for the Channel */ + +/** Bit definition for JPEGDMA_INTSTS register **/ +#define JPEGDMA_INTSTS_WDATAERR ((uint32_t)0x00002000U) /* AXI MM Write Error when writing data */ +#define JPEGDMA_INTSTS_RDATAERR ((uint32_t)0x00001000U) /* AXI MM Read Error when reading data */ +#define JPEGDMA_INTSTS_WDESCERR ((uint32_t)0x00000800U) /* AXI MM Write Error when writing a descriptor */ +#define JPEGDMA_INTSTS_RDESCERR ((uint32_t)0x00000400U) /* AXI MM Read Error when reading a descriptor */ +#define JPEGDMA_INTSTS_EOD ((uint32_t)0x00000040U) /* End-Of-Descriptor */ +#define JPEGDMA_INTSTS_AOOD ((uint32_t)0x00000020U) /* Channel is Almost Out of Descriptors */ +#define JPEGDMA_INTSTS_OOD ((uint32_t)0x00000010U) /* Out Of Descriptors */ +#define JPEGDMA_INTSTS_EOFIN ((uint32_t)0x00000008U) /* End-Of-Frame sampled at the input of the channel */ +#define JPEGDMA_INTSTS_EOFOUT ((uint32_t)0x00000004U) /* End-Of-Frame sampled at the output of the channel */ +#define JPEGDMA_INTSTS_GINT ((uint32_t)0x00000002U) /* Global interrupt status bit for the Channel */ + +/** Bit definition for JPEGDMA_AOODT register **/ +#define JPEGDMA_AOODT_VALUE ((uint32_t)0xFFFFFFFFU) /* Almost Out Of Descriptors Threshold */ +#define JPEGDMA_AOODT_VALUE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_AOODT_VALUE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_AOODT_VALUE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_AOODT_VALUE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_AOODT_VALUE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_AOODT_VALUE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_AOODT_VALUE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_AOODT_VALUE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_AOODT_VALUE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_AOODT_VALUE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_AOODT_VALUE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_AOODT_VALUE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_AOODT_VALUE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_AOODT_VALUE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_AOODT_VALUE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_AOODT_VALUE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_AOODT_VALUE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_AOODT_VALUE_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_AOODT_VALUE_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_AOODT_VALUE_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_AOODT_VALUE_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_AOODT_VALUE_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_AOODT_VALUE_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_AOODT_VALUE_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_AOODT_VALUE_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_AOODT_VALUE_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_AOODT_VALUE_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_AOODT_VALUE_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_AOODT_VALUE_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_AOODT_VALUE_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_AOODT_VALUE_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_AOODT_VALUE_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_MBSIZE register **/ +#define JPEGDMA_MBSIZE_SIZE ((uint32_t)0xFFFFFFFFU) /* Maximum allowed size for an AXI4 MM burst */ +#define JPEGDMA_MBSIZE_SIZE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_MBSIZE_SIZE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_MBSIZE_SIZE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_MBSIZE_SIZE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_MBSIZE_SIZE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_MBSIZE_SIZE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_MBSIZE_SIZE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_MBSIZE_SIZE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_MBSIZE_SIZE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_MBSIZE_SIZE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_MBSIZE_SIZE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_MBSIZE_SIZE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_MBSIZE_SIZE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_MBSIZE_SIZE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_MBSIZE_SIZE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_MBSIZE_SIZE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_MBSIZE_SIZE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_MBSIZE_SIZE_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_MBSIZE_SIZE_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_MBSIZE_SIZE_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_MBSIZE_SIZE_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_MBSIZE_SIZE_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_MBSIZE_SIZE_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_MBSIZE_SIZE_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_MBSIZE_SIZE_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_MBSIZE_SIZE_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_MBSIZE_SIZE_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_MBSIZE_SIZE_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_MBSIZE_SIZE_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_MBSIZE_SIZE_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_MBSIZE_SIZE_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_MBSIZE_SIZE_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_SGLPL register **/ +#define JPEGDMA_SGLPL_ADDR ((uint32_t)0xFFFFFFFFU) /* Scatter-Gather List Pointer LSB */ +#define JPEGDMA_SGLPL_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_SGLPL_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_SGLPL_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_SGLPL_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_SGLPL_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_SGLPL_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_SGLPL_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_SGLPL_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_SGLPL_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_SGLPL_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_SGLPL_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_SGLPL_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_SGLPL_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_SGLPL_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_SGLPL_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_SGLPL_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_SGLPL_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_SGLPL_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_SGLPL_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_SGLPL_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_SGLPL_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_SGLPL_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_SGLPL_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_SGLPL_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_SGLPL_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_SGLPL_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_SGLPL_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_SGLPL_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_SGLPL_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_SGLPL_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_SGLPL_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_SGLPL_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_SGLPM register **/ +#define JPEGDMA_SGLPM_ADDR ((uint32_t)0xFFFFFFFFU) /* Scatter-Gather List Pointer MSB */ +#define JPEGDMA_SGLPM_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_SGLPM_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_SGLPM_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_SGLPM_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_SGLPM_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_SGLPM_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_SGLPM_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_SGLPM_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_SGLPM_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_SGLPM_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_SGLPM_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_SGLPM_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_SGLPM_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_SGLPM_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_SGLPM_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_SGLPM_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_SGLPM_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_SGLPM_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_SGLPM_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_SGLPM_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_SGLPM_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_SGLPM_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_SGLPM_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_SGLPM_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_SGLPM_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_SGLPM_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_SGLPM_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_SGLPM_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_SGLPM_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_SGLPM_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_SGLPM_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_SGLPM_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_SGL_SIZE register **/ +#define JPEGDMA_SGL_SIZE_SIZE ((uint32_t)0xFFFFFFFFU) /* Scatter-Gather List Size */ +#define JPEGDMA_SGL_SIZE_SIZE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_SGL_SIZE_SIZE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_SGL_SIZE_SIZE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_SGL_SIZE_SIZE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_SGL_SIZE_SIZE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_SGL_SIZE_SIZE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_SGL_SIZE_SIZE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_SGL_SIZE_SIZE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_SGL_SIZE_SIZE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_SGL_SIZE_SIZE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_SGL_SIZE_SIZE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_SGL_SIZE_SIZE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_SGL_SIZE_SIZE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_SGL_SIZE_SIZE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_SGL_SIZE_SIZE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_SGL_SIZE_SIZE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_SGL_SIZE_SIZE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_SGL_SIZE_SIZE_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_SGL_SIZE_SIZE_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_SGL_SIZE_SIZE_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_SGL_SIZE_SIZE_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_SGL_SIZE_SIZE_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_SGL_SIZE_SIZE_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_SGL_SIZE_SIZE_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_SGL_SIZE_SIZE_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_SGL_SIZE_SIZE_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_SGL_SIZE_SIZE_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_SGL_SIZE_SIZE_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_SGL_SIZE_SIZE_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_SGL_SIZE_SIZE_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_SGL_SIZE_SIZE_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_SGL_SIZE_SIZE_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_SGL_HEAD register **/ +#define JPEGDMA_SGL_HEAD_POS ((uint32_t)0xFFFFFFFFU) /* Scatter-Gather List Head index pointer defines the position of the Head pointer in the list/ring */ +#define JPEGDMA_SGL_HEAD_POS_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_SGL_HEAD_POS_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_SGL_HEAD_POS_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_SGL_HEAD_POS_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_SGL_HEAD_POS_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_SGL_HEAD_POS_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_SGL_HEAD_POS_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_SGL_HEAD_POS_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_SGL_HEAD_POS_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_SGL_HEAD_POS_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_SGL_HEAD_POS_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_SGL_HEAD_POS_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_SGL_HEAD_POS_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_SGL_HEAD_POS_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_SGL_HEAD_POS_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_SGL_HEAD_POS_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_SGL_HEAD_POS_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_SGL_HEAD_POS_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_SGL_HEAD_POS_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_SGL_HEAD_POS_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_SGL_HEAD_POS_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_SGL_HEAD_POS_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_SGL_HEAD_POS_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_SGL_HEAD_POS_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_SGL_HEAD_POS_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_SGL_HEAD_POS_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_SGL_HEAD_POS_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_SGL_HEAD_POS_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_SGL_HEAD_POS_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_SGL_HEAD_POS_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_SGL_HEAD_POS_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_SGL_HEAD_POS_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_SGL_TAIL register **/ +#define JPEGDMA_SGL_TAIL_POS ((uint32_t)0xFFFFFFFFU) /* Scatter-Gather List Tail index pointer defines the position of the tail pointer in the list/ring */ +#define JPEGDMA_SGL_TAIL_POS_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_SGL_TAIL_POS_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_SGL_TAIL_POS_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_SGL_TAIL_POS_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_SGL_TAIL_POS_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_SGL_TAIL_POS_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_SGL_TAIL_POS_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_SGL_TAIL_POS_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_SGL_TAIL_POS_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_SGL_TAIL_POS_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_SGL_TAIL_POS_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_SGL_TAIL_POS_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_SGL_TAIL_POS_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_SGL_TAIL_POS_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_SGL_TAIL_POS_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_SGL_TAIL_POS_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_SGL_TAIL_POS_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_SGL_TAIL_POS_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_SGL_TAIL_POS_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_SGL_TAIL_POS_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_SGL_TAIL_POS_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_SGL_TAIL_POS_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_SGL_TAIL_POS_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_SGL_TAIL_POS_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_SGL_TAIL_POS_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_SGL_TAIL_POS_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_SGL_TAIL_POS_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_SGL_TAIL_POS_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_SGL_TAIL_POS_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_SGL_TAIL_POS_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_SGL_TAIL_POS_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_SGL_TAIL_POS_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_MRADDL register **/ +#define JPEGDMA_MRADDL_ADDR ((uint32_t)0xFFFFFFFFU) /* AXI memory read address reports the current address LSB of the AXI MM interface's read channel accesses */ +#define JPEGDMA_MRADDL_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_MRADDL_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_MRADDL_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_MRADDL_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_MRADDL_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_MRADDL_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_MRADDL_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_MRADDL_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_MRADDL_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_MRADDL_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_MRADDL_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_MRADDL_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_MRADDL_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_MRADDL_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_MRADDL_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_MRADDL_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_MRADDL_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_MRADDL_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_MRADDL_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_MRADDL_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_MRADDL_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_MRADDL_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_MRADDL_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_MRADDL_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_MRADDL_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_MRADDL_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_MRADDL_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_MRADDL_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_MRADDL_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_MRADDL_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_MRADDL_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_MRADDL_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_MRADDM register **/ +#define JPEGDMA_MRADDM_ADDR ((uint32_t)0xFFFFFFFFU) /* AXI memory read address reports the current address MSB of the AXI MM interface's read channel accesses */ +#define JPEGDMA_MRADDM_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_MRADDM_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_MRADDM_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_MRADDM_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_MRADDM_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_MRADDM_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_MRADDM_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_MRADDM_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_MRADDM_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_MRADDM_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_MRADDM_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_MRADDM_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_MRADDM_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_MRADDM_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_MRADDM_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_MRADDM_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_MRADDM_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_MRADDM_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_MRADDM_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_MRADDM_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_MRADDM_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_MRADDM_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_MRADDM_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_MRADDM_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_MRADDM_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_MRADDM_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_MRADDM_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_MRADDM_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_MRADDM_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_MRADDM_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_MRADDM_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_MRADDM_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_MWADDL register **/ +#define JPEGDMA_MWADDL_ADDR ((uint32_t)0xFFFFFFFFU) /* AXI memory write address reports the current address LSB of the AXI MM interface's read channel accesses */ +#define JPEGDMA_MWADDL_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_MWADDL_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_MWADDL_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_MWADDL_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_MWADDL_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_MWADDL_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_MWADDL_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_MWADDL_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_MWADDL_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_MWADDL_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_MWADDL_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_MWADDL_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_MWADDL_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_MWADDL_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_MWADDL_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_MWADDL_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_MWADDL_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_MWADDL_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_MWADDL_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_MWADDL_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_MWADDL_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_MWADDL_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_MWADDL_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_MWADDL_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_MWADDL_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_MWADDL_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_MWADDL_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_MWADDL_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_MWADDL_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_MWADDL_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_MWADDL_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_MWADDL_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_MWADDM register **/ +#define JPEGDMA_MWADDM_ADDR ((uint32_t)0xFFFFFFFFU) /* AXI memory write address reports the current address MSB of the AXI MM interface's read channel accesses */ +#define JPEGDMA_MWADDM_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_MWADDM_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_MWADDM_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_MWADDM_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_MWADDM_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_MWADDM_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_MWADDM_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_MWADDM_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_MWADDM_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_MWADDM_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_MWADDM_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_MWADDM_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_MWADDM_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_MWADDM_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_MWADDM_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_MWADDM_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_MWADDM_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_MWADDM_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_MWADDM_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_MWADDM_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_MWADDM_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_MWADDM_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_MWADDM_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_MWADDM_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_MWADDM_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_MWADDM_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_MWADDM_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_MWADDM_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_MWADDM_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_MWADDM_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_MWADDM_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_MWADDM_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_DESCF register **/ +#define JPEGDMA_DESCF_LINKE ((uint32_t)0x00000001U) /* Link Enable */ +#define JPEGDMA_DESCF_START ((uint32_t)0x00000002U) /* Start of Frame */ +#define JPEGDMA_DESCF_END ((uint32_t)0x00000004U) /* End of Frame */ +#define JPEGDMA_DESCF_DESCCON ((uint32_t)0x00000008U) /* Descriptor Consumed */ + +/** Bit definition for JPEGDMA_DESC_MBSIZE register **/ +#define JPEGDMA_DESC_MBSIZE_SIZE ((uint32_t)0xFFFFFFFFU) /* Descriptor Memory Block Size */ +#define JPEGDMA_DESC_MBSIZE_SIZE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_DESC_MBSIZE_SIZE_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_DESC_MUS register **/ +#define JPEGDMA_DESC_MUS_SIZE ((uint32_t)0xFFFFFFFFU) /* Descriptor Memory Used Space */ +#define JPEGDMA_DESC_MUS_SIZE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_DESC_MUS_SIZE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_DESC_MUS_SIZE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_DESC_MUS_SIZE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_DESC_MUS_SIZE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_DESC_MUS_SIZE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_DESC_MUS_SIZE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_DESC_MUS_SIZE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_DESC_MUS_SIZE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_DESC_MUS_SIZE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_DESC_MUS_SIZE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_DESC_MUS_SIZE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_DESC_MUS_SIZE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_DESC_MUS_SIZE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_DESC_MUS_SIZE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_DESC_MUS_SIZE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_DESC_MUS_SIZE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_DESC_MUS_SIZE_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_DESC_MUS_SIZE_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_DESC_MUS_SIZE_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_DESC_MUS_SIZE_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_DESC_MUS_SIZE_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_DESC_MUS_SIZE_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_DESC_MUS_SIZE_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_DESC_MUS_SIZE_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_DESC_MUS_SIZE_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_DESC_MUS_SIZE_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_DESC_MUS_SIZE_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_DESC_MUS_SIZE_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_DESC_MUS_SIZE_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_DESC_MUS_SIZE_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_DESC_MUS_SIZE_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_DESC_MBADDL register **/ +#define JPEGDMA_DESC_MBADDL_ADDR ((uint32_t)0xFFFFFFFFU) /* Descriptor Memory Block Address LSB */ +#define JPEGDMA_DESC_MBADDL_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_DESC_MBADDL_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_DESC_MBADDL_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_DESC_MBADDL_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_DESC_MBADDL_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_DESC_MBADDL_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_DESC_MBADDL_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_DESC_MBADDL_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_DESC_MBADDL_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_DESC_MBADDL_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_DESC_MBADDL_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_DESC_MBADDL_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_DESC_MBADDL_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_DESC_MBADDL_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_DESC_MBADDL_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_DESC_MBADDL_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_DESC_MBADDL_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_DESC_MBADDL_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_DESC_MBADDL_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_DESC_MBADDL_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_DESC_MBADDL_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_DESC_MBADDL_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_DESC_MBADDL_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_DESC_MBADDL_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_DESC_MBADDL_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_DESC_MBADDL_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_DESC_MBADDL_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_DESC_MBADDL_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_DESC_MBADDL_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_DESC_MBADDL_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_DESC_MBADDL_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_DESC_MBADDL_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_DESC_MBADDH register **/ +#define JPEGDMA_DESC_MBADDH_ADDR ((uint32_t)0xFFFFFFFFU) /* Descriptor Memory Block Address MSB */ +#define JPEGDMA_DESC_MBADDH_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_DESC_MBADDH_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_DESC_MBADDH_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_DESC_MBADDH_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_DESC_MBADDH_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_DESC_MBADDH_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_DESC_MBADDH_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_DESC_MBADDH_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_DESC_MBADDH_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_DESC_MBADDH_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_DESC_MBADDH_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_DESC_MBADDH_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_DESC_MBADDH_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_DESC_MBADDH_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_DESC_MBADDH_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_DESC_MBADDH_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_DESC_MBADDH_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_DESC_MBADDH_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_DESC_MBADDH_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_DESC_MBADDH_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_DESC_MBADDH_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_DESC_MBADDH_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_DESC_MBADDH_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_DESC_MBADDH_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_DESC_MBADDH_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_DESC_MBADDH_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_DESC_MBADDH_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_DESC_MBADDH_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_DESC_MBADDH_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_DESC_MBADDH_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_DESC_MBADDH_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_DESC_MBADDH_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_DESC_LINKL register **/ +#define JPEGDMA_DESC_LINKL_ADDR ((uint32_t)0xFFFFFFFFU) /* Descriptor Link Address LSB - link to the next descriptor */ +#define JPEGDMA_DESC_LINKL_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_DESC_LINKL_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_DESC_LINKL_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_DESC_LINKL_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_DESC_LINKL_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_DESC_LINKL_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_DESC_LINKL_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_DESC_LINKL_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_DESC_LINKL_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_DESC_LINKL_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_DESC_LINKL_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_DESC_LINKL_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_DESC_LINKL_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_DESC_LINKL_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_DESC_LINKL_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_DESC_LINKL_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_DESC_LINKL_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_DESC_LINKL_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_DESC_LINKL_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_DESC_LINKL_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_DESC_LINKL_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_DESC_LINKL_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_DESC_LINKL_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_DESC_LINKL_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_DESC_LINKL_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_DESC_LINKL_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_DESC_LINKL_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_DESC_LINKL_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_DESC_LINKL_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_DESC_LINKL_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_DESC_LINKL_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_DESC_LINKL_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_DESC_LINKH register **/ +#define JPEGDMA_DESC_LINKH_ADDR ((uint32_t)0xFFFFFFFFU) /* Descriptor Link Address MSB - link to the next descriptor */ +#define JPEGDMA_DESC_LINKH_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_DESC_LINKH_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_DESC_LINKH_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_DESC_LINKH_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_DESC_LINKH_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_DESC_LINKH_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_DESC_LINKH_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_DESC_LINKH_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_DESC_LINKH_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_DESC_LINKH_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_DESC_LINKH_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_DESC_LINKH_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_DESC_LINKH_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_DESC_LINKH_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_DESC_LINKH_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_DESC_LINKH_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_DESC_LINKH_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_DESC_LINKH_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_DESC_LINKH_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_DESC_LINKH_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_DESC_LINKH_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_DESC_LINKH_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_DESC_LINKH_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_DESC_LINKH_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_DESC_LINKH_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_DESC_LINKH_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_DESC_LINKH_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_DESC_LINKH_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_DESC_LINKH_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_DESC_LINKH_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_DESC_LINKH_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_DESC_LINKH_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDMA_PARACFG register **/ +#define JPEGDMA_PARACFG_ALIGNEN ((uint32_t)0x00000004U) /* Instance alignment */ +#define JPEGDMA_PARACFG_DESCSIZE ((uint32_t)0x00000002U) /* Size of descriptor */ +#define JPEGDMA_PARACFG_DTYPE ((uint32_t)0x00000001U) /* Type of DMA Channel */ + +/** Bit definition for JPEGDMA_FIFODP register **/ +#define JPEGDMA_FIFODP_DEPTH ((uint32_t)0xFFFFFFFFU) /* Field mirroring the DATA_FIFO_DEPTH parameter */ +#define JPEGDMA_FIFODP_DEPTH_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDMA_FIFODP_DEPTH_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDMA_FIFODP_DEPTH_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDMA_FIFODP_DEPTH_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDMA_FIFODP_DEPTH_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDMA_FIFODP_DEPTH_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDMA_FIFODP_DEPTH_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDMA_FIFODP_DEPTH_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDMA_FIFODP_DEPTH_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDMA_FIFODP_DEPTH_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDMA_FIFODP_DEPTH_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDMA_FIFODP_DEPTH_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDMA_FIFODP_DEPTH_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDMA_FIFODP_DEPTH_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDMA_FIFODP_DEPTH_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDMA_FIFODP_DEPTH_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDMA_FIFODP_DEPTH_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDMA_FIFODP_DEPTH_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDMA_FIFODP_DEPTH_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDMA_FIFODP_DEPTH_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDMA_FIFODP_DEPTH_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDMA_FIFODP_DEPTH_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDMA_FIFODP_DEPTH_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDMA_FIFODP_DEPTH_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDMA_FIFODP_DEPTH_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDMA_FIFODP_DEPTH_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDMA_FIFODP_DEPTH_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDMA_FIFODP_DEPTH_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDMA_FIFODP_DEPTH_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDMA_FIFODP_DEPTH_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDMA_FIFODP_DEPTH_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDMA_FIFODP_DEPTH_31 ((uint32_t)0x80000000U) /* Bit31*/ + + +/*** JPEG DEC controller ***/ +/** Bit definition for JPEGDEC_MODE register **/ +#define JPEGDEC_MODE_EN ((uint32_t)0x00000001U) /* Enable the decode mode */ + +/** Bit definition for JPEGDEC_ERROR register **/ +#define JPEGDEC_ERROR_HTERR ((uint32_t)0x00000020U) /* A Huffman table referenced in a scan (SOS header) is invalid */ +#define JPEGDEC_ERROR_QTERR ((uint32_t)0x00000010U) /* A Quantisation table referenced in a component referenced in a scan (SOS header) selected an invalid Quantisation table */ +#define JPEGDEC_ERROR_CERR ((uint32_t)0x00000008U) /* A component referenced in the scan header (SOS) was not defined in the previous frame header (SOF) */ +#define JPEGDEC_ERROR_HUF ((uint32_t)0x00000004U) /* Huffman decode error detected */ +#define JPEGDEC_ERROR_UNEXP ((uint32_t)0x00000002U) /* Unexpected marker detected */ +#define JPEGDEC_ERROR_UNK ((uint32_t)0x00000001U) /* Unknown marker detected */ + +/** Bit definition for JPEGDEC_UNLOC register **/ +#define JPEGDEC_UNLOC_POS ((uint32_t)0xFFFFFFFFU) /* Unknown marker error location */ +#define JPEGDEC_UNLOC_POS_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_UNLOC_POS_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_UNLOC_POS_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_UNLOC_POS_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_UNLOC_POS_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_UNLOC_POS_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_UNLOC_POS_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_UNLOC_POS_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDEC_UNLOC_POS_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_UNLOC_POS_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_UNLOC_POS_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDEC_UNLOC_POS_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDEC_UNLOC_POS_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDEC_UNLOC_POS_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDEC_UNLOC_POS_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDEC_UNLOC_POS_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDEC_UNLOC_POS_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDEC_UNLOC_POS_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDEC_UNLOC_POS_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDEC_UNLOC_POS_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDEC_UNLOC_POS_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDEC_UNLOC_POS_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDEC_UNLOC_POS_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDEC_UNLOC_POS_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDEC_UNLOC_POS_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDEC_UNLOC_POS_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDEC_UNLOC_POS_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDEC_UNLOC_POS_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDEC_UNLOC_POS_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDEC_UNLOC_POS_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDEC_UNLOC_POS_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDEC_UNLOC_POS_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDEC_UELOC register **/ +#define JPEGDEC_UELOC_POS ((uint32_t)0xFFFFFFFFU) /* Unexpected marker error location */ +#define JPEGDEC_UELOC_POS_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_UELOC_POS_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_UELOC_POS_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_UELOC_POS_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_UELOC_POS_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_UELOC_POS_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_UELOC_POS_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_UELOC_POS_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDEC_UELOC_POS_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_UELOC_POS_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_UELOC_POS_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDEC_UELOC_POS_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDEC_UELOC_POS_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDEC_UELOC_POS_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDEC_UELOC_POS_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDEC_UELOC_POS_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDEC_UELOC_POS_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDEC_UELOC_POS_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDEC_UELOC_POS_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDEC_UELOC_POS_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDEC_UELOC_POS_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDEC_UELOC_POS_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDEC_UELOC_POS_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDEC_UELOC_POS_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDEC_UELOC_POS_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDEC_UELOC_POS_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDEC_UELOC_POS_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDEC_UELOC_POS_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDEC_UELOC_POS_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDEC_UELOC_POS_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDEC_UELOC_POS_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDEC_UELOC_POS_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDEC_HESYM register **/ +#define JPEGDEC_HESYM_HESYM ((uint32_t)0x0000FFFFU) /* The Huffman symbol that is in error */ +#define JPEGDEC_HESYM_HESYM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_HESYM_HESYM_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_HESYM_HESYM_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_HESYM_HESYM_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_HESYM_HESYM_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_HESYM_HESYM_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_HESYM_HESYM_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_HESYM_HESYM_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDEC_HESYM_HESYM_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_HESYM_HESYM_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_HESYM_HESYM_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDEC_HESYM_HESYM_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDEC_HESYM_HESYM_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDEC_HESYM_HESYM_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDEC_HESYM_HESYM_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDEC_HESYM_HESYM_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/** Bit definition for JPEGDEC_HESYMECS register **/ +#define JPEGDEC_HESYMECS_NUM ((uint32_t)0xFFFFFFFFU) /* Huffman ECS Number Symbol */ +#define JPEGDEC_HESYMECS_NUM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_HESYMECS_NUM_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_HESYMECS_NUM_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_HESYMECS_NUM_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_HESYMECS_NUM_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_HESYMECS_NUM_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_HESYMECS_NUM_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_HESYMECS_NUM_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDEC_HESYMECS_NUM_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_HESYMECS_NUM_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_HESYMECS_NUM_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDEC_HESYMECS_NUM_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDEC_HESYMECS_NUM_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDEC_HESYMECS_NUM_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDEC_HESYMECS_NUM_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDEC_HESYMECS_NUM_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDEC_HESYMECS_NUM_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDEC_HESYMECS_NUM_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDEC_HESYMECS_NUM_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDEC_HESYMECS_NUM_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDEC_HESYMECS_NUM_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDEC_HESYMECS_NUM_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDEC_HESYMECS_NUM_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDEC_HESYMECS_NUM_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDEC_HESYMECS_NUM_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDEC_HESYMECS_NUM_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDEC_HESYMECS_NUM_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDEC_HESYMECS_NUM_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDEC_HESYMECS_NUM_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDEC_HESYMECS_NUM_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDEC_HESYMECS_NUM_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDEC_HESYMECS_NUM_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDEC_HUF_SELOC register **/ +#define JPEGDEC_HUF_SELOC_POS ((uint32_t)0xFFFFFFFFU) /* Huffman ECS Number Symbol Error location */ +#define JPEGDEC_HUF_SELOC_POS_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_HUF_SELOC_POS_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_HUF_SELOC_POS_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_HUF_SELOC_POS_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_HUF_SELOC_POS_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_HUF_SELOC_POS_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_HUF_SELOC_POS_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_HUF_SELOC_POS_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDEC_HUF_SELOC_POS_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_HUF_SELOC_POS_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_HUF_SELOC_POS_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDEC_HUF_SELOC_POS_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDEC_HUF_SELOC_POS_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDEC_HUF_SELOC_POS_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDEC_HUF_SELOC_POS_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDEC_HUF_SELOC_POS_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDEC_HUF_SELOC_POS_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDEC_HUF_SELOC_POS_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDEC_HUF_SELOC_POS_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDEC_HUF_SELOC_POS_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDEC_HUF_SELOC_POS_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDEC_HUF_SELOC_POS_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDEC_HUF_SELOC_POS_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDEC_HUF_SELOC_POS_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDEC_HUF_SELOC_POS_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDEC_HUF_SELOC_POS_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDEC_HUF_SELOC_POS_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDEC_HUF_SELOC_POS_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDEC_HUF_SELOC_POS_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDEC_HUF_SELOC_POS_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDEC_HUF_SELOC_POS_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDEC_HUF_SELOC_POS_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDEC_TAB_ACCREQ register **/ +#define JPEGDEC_TAB_ACCREQ_AOK ((uint32_t)0x00000002U) /* Table access flag */ +#define JPEGDEC_TAB_ACCREQ_AQEQ ((uint32_t)0x00000001U) /* Table access request */ + +/** Bit definition for JPEGDEC_HUFTAB0_EOB register **/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M ((uint32_t)0xFFFF0000U) /* Contains the EOB symbol mask for Huffman table 0 */ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_6 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_7 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_8 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_9 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_10 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_11 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_12 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_13 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_14 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0M_15 ((uint32_t)0x80000000U) /* Bit31*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C ((uint32_t)0x0000FFFFU) /* Contains the EOB symbol for Huffman table 0 */ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDEC_HUFTAB0_EOB_EOB0C_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/** Bit definition for JPEGDEC_HUFTAB1_EOB register **/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M ((uint32_t)0xFFFF0000U) /* Contains the EOB symbol mask for Huffman table 1 */ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_6 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_7 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_8 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_9 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_10 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_11 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_12 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_13 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_14 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1M_15 ((uint32_t)0x80000000U) /* Bit31*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C ((uint32_t)0x0000FFFFU) /* Contains the EOB symbol for Huffman table 1 */ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDEC_HUFTAB1_EOB_EOB1C_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/** Bit definition for JPEGDEC_HUFTAB2_EOB register **/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M ((uint32_t)0xFFFF0000U) /* Contains the EOB symbol mask for Huffman table 2 */ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_6 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_7 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_8 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_9 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_10 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_11 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_12 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_13 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_14 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2M_15 ((uint32_t)0x80000000U) /* Bit31*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C ((uint32_t)0x0000FFFFU) /* Contains the EOB symbol for Huffman table 2 */ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDEC_HUFTAB2_EOB_EOB2C_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/** Bit definition for JPEGDEC_HUFTAB3_EOB register **/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M ((uint32_t)0xFFFF0000U) /* Contains the EOB symbol mask for Huffman table 3 */ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_6 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_7 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_8 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_9 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_10 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_11 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_12 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_13 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_14 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3M_15 ((uint32_t)0x80000000U) /* Bit31*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C ((uint32_t)0x0000FFFFU) /* Contains the EOB symbol for Huffman table 3 */ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDEC_HUFTAB3_EOB_EOB3C_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/** Bit definition for JPEGDEC_HUF_ADDR register **/ +#define JPEGDEC_HUF_ADDR_TABLE ((uint32_t)0x00000300U) /* Selects which table to access */ +#define JPEGDEC_HUF_ADDR_TABLE_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_HUF_ADDR_TABLE_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_HUF_ADDR_ACDC ((uint32_t)0x00000010U) /* AC/DC table selector encoded */ +#define JPEGDEC_HUF_ADDR_HNUM ((uint32_t)0x00000003U) /* Selects which Huffman table to access */ +#define JPEGDEC_HUF_ADDR_HNUM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_HUF_ADDR_HNUM_1 ((uint32_t)0x00000002U) /* Bit1*/ + +/** Bit definition for JPEGDEC_HUF_DATA register **/ +#define JPEGDEC_HUF_DATA_HDATA ((uint32_t)0xFFFFFFFFU) /* Huffman table access data */ +#define JPEGDEC_HUF_DATA_HDATA_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_HUF_DATA_HDATA_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_HUF_DATA_HDATA_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_HUF_DATA_HDATA_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_HUF_DATA_HDATA_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_HUF_DATA_HDATA_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_HUF_DATA_HDATA_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_HUF_DATA_HDATA_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDEC_HUF_DATA_HDATA_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_HUF_DATA_HDATA_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_HUF_DATA_HDATA_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDEC_HUF_DATA_HDATA_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDEC_HUF_DATA_HDATA_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDEC_HUF_DATA_HDATA_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDEC_HUF_DATA_HDATA_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDEC_HUF_DATA_HDATA_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDEC_HUF_DATA_HDATA_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDEC_HUF_DATA_HDATA_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDEC_HUF_DATA_HDATA_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDEC_HUF_DATA_HDATA_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDEC_HUF_DATA_HDATA_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDEC_HUF_DATA_HDATA_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDEC_HUF_DATA_HDATA_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDEC_HUF_DATA_HDATA_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDEC_HUF_DATA_HDATA_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDEC_HUF_DATA_HDATA_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDEC_HUF_DATA_HDATA_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDEC_HUF_DATA_HDATA_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDEC_HUF_DATA_HDATA_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDEC_HUF_DATA_HDATA_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDEC_HUF_DATA_HDATA_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDEC_HUF_DATA_HDATA_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDEC_HUF_REM register **/ +#define JPEGDEC_HUF_REM_HREM ((uint32_t)0xFFFFFFFFU) /* Huffman table access number of words remaining */ +#define JPEGDEC_HUF_REM_HREM_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_HUF_REM_HREM_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_HUF_REM_HREM_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_HUF_REM_HREM_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_HUF_REM_HREM_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_HUF_REM_HREM_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_HUF_REM_HREM_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_HUF_REM_HREM_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGDEC_HUF_REM_HREM_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGDEC_HUF_REM_HREM_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGDEC_HUF_REM_HREM_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGDEC_HUF_REM_HREM_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGDEC_HUF_REM_HREM_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGDEC_HUF_REM_HREM_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGDEC_HUF_REM_HREM_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGDEC_HUF_REM_HREM_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGDEC_HUF_REM_HREM_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGDEC_HUF_REM_HREM_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGDEC_HUF_REM_HREM_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGDEC_HUF_REM_HREM_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGDEC_HUF_REM_HREM_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGDEC_HUF_REM_HREM_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGDEC_HUF_REM_HREM_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGDEC_HUF_REM_HREM_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGDEC_HUF_REM_HREM_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGDEC_HUF_REM_HREM_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGDEC_HUF_REM_HREM_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGDEC_HUF_REM_HREM_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGDEC_HUF_REM_HREM_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGDEC_HUF_REM_HREM_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGDEC_HUF_REM_HREM_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGDEC_HUF_REM_HREM_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGDEC_QT0 register **/ +#define JPEGDEC_QT0_QT0 ((uint32_t)0x000000FFU) /* 8-bits of the quantisation value */ +#define JPEGDEC_QT0_QT0_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_QT0_QT0_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_QT0_QT0_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_QT0_QT0_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_QT0_QT0_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_QT0_QT0_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_QT0_QT0_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_QT0_QT0_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for JPEGDEC_QT1 register **/ +#define JPEGDEC_QT1_QT1 ((uint32_t)0x000000FFU) /* 8-bits of the quantisation value */ +#define JPEGDEC_QT1_QT1_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_QT1_QT1_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_QT1_QT1_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_QT1_QT1_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_QT1_QT1_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_QT1_QT1_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_QT1_QT1_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_QT1_QT1_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for JPEGDEC_QT2 register **/ +#define JPEGDEC_QT2_QT2 ((uint32_t)0x000000FFU) /* 8-bits of the quantisation value */ +#define JPEGDEC_QT2_QT2_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_QT2_QT2_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_QT2_QT2_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_QT2_QT2_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_QT2_QT2_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_QT2_QT2_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_QT2_QT2_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_QT2_QT2_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for JPEGDEC_QT3 register **/ +#define JPEGDEC_QT3_QT3 ((uint32_t)0x000000FFU) /* 8-bits of the quantisation value */ +#define JPEGDEC_QT3_QT3_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGDEC_QT3_QT3_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGDEC_QT3_QT3_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGDEC_QT3_QT3_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGDEC_QT3_QT3_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGDEC_QT3_QT3_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGDEC_QT3_QT3_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGDEC_QT3_QT3_7 ((uint32_t)0x00000080U) /* Bit7*/ + + +/*** JPEG ENC controller ***/ +/** Bit definition for JPEGENC_QT0 register **/ +#define JPEGENC_QT0_QT0 ((uint32_t)0x000000FFU) /* Quantisation Table 0 */ +#define JPEGENC_QT0_QT0_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_QT0_QT0_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_QT0_QT0_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_QT0_QT0_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_QT0_QT0_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_QT0_QT0_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_QT0_QT0_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_QT0_QT0_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for JPEGENC_QT1 register **/ +#define JPEGENC_QT1_QT1 ((uint32_t)0x000000FFU) /* Quantisation Table 1 */ +#define JPEGENC_QT1_QT1_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_QT1_QT1_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_QT1_QT1_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_QT1_QT1_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_QT1_QT1_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_QT1_QT1_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_QT1_QT1_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_QT1_QT1_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for JPEGENC_QT2 register **/ +#define JPEGENC_QT2_QT2 ((uint32_t)0x000000FFU) /* Quantisation Table 2 */ +#define JPEGENC_QT2_QT2_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_QT2_QT2_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_QT2_QT2_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_QT2_QT2_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_QT2_QT2_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_QT2_QT2_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_QT2_QT2_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_QT2_QT2_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for JPEGENC_QT3 register **/ +#define JPEGENC_QT3_QT3 ((uint32_t)0x000000FFU) /* Quantisation Table 3 */ +#define JPEGENC_QT3_QT3_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_QT3_QT3_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_QT3_QT3_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_QT3_QT3_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_QT3_QT3_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_QT3_QT3_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_QT3_QT3_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_QT3_QT3_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for JPEGENC_HEADD register **/ +#define JPEGENC_HEADD_ADDR ((uint32_t)0x000007FFU) /* End address of JPEG footer */ +#define JPEGENC_HEADD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_HEADD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_HEADD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_HEADD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_HEADD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_HEADD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_HEADD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_HEADD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGENC_HEADD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGENC_HEADD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGENC_HEADD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ + +/** Bit definition for JPEGENC_HUFTAB0E register **/ +#define JPEGENC_HUFTAB0E_ADDR ((uint32_t)0x000007FFU) /* End address of JPEG Huffman table 0 */ +#define JPEGENC_HUFTAB0E_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_HUFTAB0E_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_HUFTAB0E_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_HUFTAB0E_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_HUFTAB0E_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_HUFTAB0E_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_HUFTAB0E_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_HUFTAB0E_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGENC_HUFTAB0E_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGENC_HUFTAB0E_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGENC_HUFTAB0E_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ + +/** Bit definition for JPEGENC_HUFTAB1E register **/ +#define JPEGENC_HUFTAB1E_ADDR ((uint32_t)0x000007FFU) /* End address of JPEG Huffman table 1 */ +#define JPEGENC_HUFTAB1E_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_HUFTAB1E_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_HUFTAB1E_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_HUFTAB1E_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_HUFTAB1E_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_HUFTAB1E_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_HUFTAB1E_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_HUFTAB1E_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGENC_HUFTAB1E_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGENC_HUFTAB1E_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGENC_HUFTAB1E_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ + +/** Bit definition for JPEGENC_HUFTAB2E register **/ +#define JPEGENC_HUFTAB2E_ADDR ((uint32_t)0x000007FFU) /* End address of JPEG Huffman table 2 */ +#define JPEGENC_HUFTAB2E_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_HUFTAB2E_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_HUFTAB2E_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_HUFTAB2E_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_HUFTAB2E_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_HUFTAB2E_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_HUFTAB2E_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_HUFTAB2E_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGENC_HUFTAB2E_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGENC_HUFTAB2E_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGENC_HUFTAB2E_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ + +/** Bit definition for JPEGENC_HUFTAB3E register **/ +#define JPEGENC_HUFTAB3E_ADDR ((uint32_t)0x000007FFU) /* End address of JPEG Huffman table 3 */ +#define JPEGENC_HUFTAB3E_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_HUFTAB3E_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_HUFTAB3E_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_HUFTAB3E_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_HUFTAB3E_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_HUFTAB3E_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_HUFTAB3E_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_HUFTAB3E_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGENC_HUFTAB3E_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGENC_HUFTAB3E_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGENC_HUFTAB3E_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ + +/** Bit definition for JPEGENC_FEADD register **/ +#define JPEGENC_FEADD_ADDR ((uint32_t)0x000007FFU) /* End address of JPEG footer */ +#define JPEGENC_FEADD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_FEADD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_FEADD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_FEADD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_FEADD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_FEADD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_FEADD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_FEADD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGENC_FEADD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGENC_FEADD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGENC_FEADD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ + +/** Bit definition for JPEGENC_CTRL register **/ +#define JPEGENC_CTRL_QT3 ((uint32_t)0x000C0000U) /* Quantisation table selector for component 3 */ +#define JPEGENC_CTRL_QT3_0 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGENC_CTRL_QT3_1 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGENC_CTRL_QT2 ((uint32_t)0x00030000U) /* Quantisation table selector for component 2 */ +#define JPEGENC_CTRL_QT2_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGENC_CTRL_QT2_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGENC_CTRL_QT1 ((uint32_t)0x0000C000U) /* Quantisation table selector for component 1 */ +#define JPEGENC_CTRL_QT1_0 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGENC_CTRL_QT1_1 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGENC_CTRL_QT0 ((uint32_t)0x00003000U) /* Quantisation table selector for component 0 */ +#define JPEGENC_CTRL_QT0_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGENC_CTRL_QT0_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGENC_CTRL_HUF3 ((uint32_t)0x00000C00U) /* Huffman table selector for component 3 */ +#define JPEGENC_CTRL_HUF3_0 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGENC_CTRL_HUF3_1 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGENC_CTRL_HUF2 ((uint32_t)0x00000300U) /* Huffman table selector for component 2 */ +#define JPEGENC_CTRL_HUF2_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGENC_CTRL_HUF2_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGENC_CTRL_HUF1 ((uint32_t)0x000000C0U) /* Huffman table selector for component 1 */ +#define JPEGENC_CTRL_HUF1_0 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_CTRL_HUF1_1 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGENC_CTRL_HUF0 ((uint32_t)0x00000030U) /* Huffman table selector for component 0 */ +#define JPEGENC_CTRL_HUF0_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_CTRL_HUF0_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_CTRL_ERST ((uint32_t)0x00000002U) /* Core reset */ +#define JPEGENC_CTRL_EN ((uint32_t)0x00000001U) /* Core enable */ + +/** Bit definition for JPEGENC_DYNRCFG register **/ +#define JPEGENC_DYNRCFG_HSAFE ((uint32_t)0x00000004U) /* change the contents of the Header/Footer buffer */ +#define JPEGENC_DYNRCFG_DYNF ((uint32_t)0x00000002U) /* state of the pipeline */ +#define JPEGENC_DYNRCFG_DYNEN ((uint32_t)0x00000001U) /* Dynamic enable */ + +/** Bit definition for JPEGENC_HSEL register **/ +#define JPEGENC_HSEL_ATF ((uint32_t)0x00000200U) /* ATF */ +#define JPEGENC_HSEL_NFD ((uint32_t)0x00000100U) /* NFD */ +#define JPEGENC_HSEL_HT3 ((uint32_t)0x00000080U) /* Ouptut Huffman table 3 in output stream */ +#define JPEGENC_HSEL_HT2 ((uint32_t)0x00000040U) /* Ouptut Huffman table 2 in output stream */ +#define JPEGENC_HSEL_HT1 ((uint32_t)0x00000020U) /* Ouptut Huffman table 1 in output stream */ +#define JPEGENC_HSEL_HT0 ((uint32_t)0x00000010U) /* Ouptut Huffman table 0 in output stream */ +#define JPEGENC_HSEL_QT3 ((uint32_t)0x00000008U) /* Ouptut quantisation table 3 in output stream */ +#define JPEGENC_HSEL_QT2 ((uint32_t)0x00000004U) /* Ouptut quantisation table 2 in output stream */ +#define JPEGENC_HSEL_QT1 ((uint32_t)0x00000002U) /* Ouptut quantisation table 1 in output stream */ +#define JPEGENC_HSEL_QT0 ((uint32_t)0x00000001U) /* Ouptut quantisation table 0 in output stream */ + +/** Bit definition for JPEGENC_PIPESTS register **/ +#define JPEGENC_PIPESTS_OOVF ((uint32_t)0x00000001U) /* Assembly buffer overflow */ + +/** Bit definition for JPEGENC_RICTRL register **/ +#define JPEGENC_RICTRL_RIEN ((uint32_t)0x10000000U) /* Enable restart marker generation */ +#define JPEGENC_RICTRL_BRI ((uint32_t)0x0FFFFFFFU) /* Number of blocks per restart interval minus one */ +#define JPEGENC_RICTRL_BRI_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_RICTRL_BRI_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_RICTRL_BRI_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_RICTRL_BRI_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_RICTRL_BRI_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_RICTRL_BRI_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_RICTRL_BRI_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_RICTRL_BRI_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGENC_RICTRL_BRI_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGENC_RICTRL_BRI_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGENC_RICTRL_BRI_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGENC_RICTRL_BRI_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGENC_RICTRL_BRI_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGENC_RICTRL_BRI_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGENC_RICTRL_BRI_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGENC_RICTRL_BRI_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGENC_RICTRL_BRI_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGENC_RICTRL_BRI_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGENC_RICTRL_BRI_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGENC_RICTRL_BRI_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGENC_RICTRL_BRI_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGENC_RICTRL_BRI_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGENC_RICTRL_BRI_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGENC_RICTRL_BRI_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGENC_RICTRL_BRI_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGENC_RICTRL_BRI_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGENC_RICTRL_BRI_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGENC_RICTRL_BRI_27 ((uint32_t)0x08000000U) /* Bit27*/ + +/** Bit definition for JPEGENC_HFSIZE register **/ +#define JPEGENC_HFSIZE_SIZE ((uint32_t)0xFFFFFFFFU) /* Header/footer RAM size in bytes */ +#define JPEGENC_HFSIZE_SIZE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_HFSIZE_SIZE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_HFSIZE_SIZE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_HFSIZE_SIZE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_HFSIZE_SIZE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_HFSIZE_SIZE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_HFSIZE_SIZE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_HFSIZE_SIZE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGENC_HFSIZE_SIZE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGENC_HFSIZE_SIZE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGENC_HFSIZE_SIZE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGENC_HFSIZE_SIZE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGENC_HFSIZE_SIZE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGENC_HFSIZE_SIZE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGENC_HFSIZE_SIZE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGENC_HFSIZE_SIZE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGENC_HFSIZE_SIZE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGENC_HFSIZE_SIZE_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGENC_HFSIZE_SIZE_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGENC_HFSIZE_SIZE_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGENC_HFSIZE_SIZE_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGENC_HFSIZE_SIZE_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGENC_HFSIZE_SIZE_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGENC_HFSIZE_SIZE_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGENC_HFSIZE_SIZE_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGENC_HFSIZE_SIZE_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGENC_HFSIZE_SIZE_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGENC_HFSIZE_SIZE_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGENC_HFSIZE_SIZE_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGENC_HFSIZE_SIZE_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGENC_HFSIZE_SIZE_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGENC_HFSIZE_SIZE_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGENC_PBSIZE register **/ +#define JPEGENC_PBSIZE_PBSIZE ((uint32_t)0xFFFFFFFFU) /* Pipe buffer size */ +#define JPEGENC_PBSIZE_PBSIZE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_PBSIZE_PBSIZE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_PBSIZE_PBSIZE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_PBSIZE_PBSIZE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_PBSIZE_PBSIZE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_PBSIZE_PBSIZE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_PBSIZE_PBSIZE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_PBSIZE_PBSIZE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGENC_PBSIZE_PBSIZE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGENC_PBSIZE_PBSIZE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGENC_PBSIZE_PBSIZE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGENC_PBSIZE_PBSIZE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGENC_PBSIZE_PBSIZE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGENC_PBSIZE_PBSIZE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGENC_PBSIZE_PBSIZE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGENC_PBSIZE_PBSIZE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGENC_PBSIZE_PBSIZE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGENC_PBSIZE_PBSIZE_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGENC_PBSIZE_PBSIZE_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGENC_PBSIZE_PBSIZE_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGENC_PBSIZE_PBSIZE_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGENC_PBSIZE_PBSIZE_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGENC_PBSIZE_PBSIZE_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGENC_PBSIZE_PBSIZE_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGENC_PBSIZE_PBSIZE_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGENC_PBSIZE_PBSIZE_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGENC_PBSIZE_PBSIZE_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGENC_PBSIZE_PBSIZE_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGENC_PBSIZE_PBSIZE_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGENC_PBSIZE_PBSIZE_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGENC_PBSIZE_PBSIZE_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGENC_PBSIZE_PBSIZE_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for JPEGENC_OBSIZE register **/ +#define JPEGENC_OBSIZE_SIZE ((uint32_t)0xFFFFFFFFU) /* Output Buffer size */ +#define JPEGENC_OBSIZE_SIZE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define JPEGENC_OBSIZE_SIZE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define JPEGENC_OBSIZE_SIZE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define JPEGENC_OBSIZE_SIZE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define JPEGENC_OBSIZE_SIZE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define JPEGENC_OBSIZE_SIZE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define JPEGENC_OBSIZE_SIZE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define JPEGENC_OBSIZE_SIZE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define JPEGENC_OBSIZE_SIZE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define JPEGENC_OBSIZE_SIZE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define JPEGENC_OBSIZE_SIZE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define JPEGENC_OBSIZE_SIZE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define JPEGENC_OBSIZE_SIZE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define JPEGENC_OBSIZE_SIZE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define JPEGENC_OBSIZE_SIZE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define JPEGENC_OBSIZE_SIZE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define JPEGENC_OBSIZE_SIZE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define JPEGENC_OBSIZE_SIZE_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define JPEGENC_OBSIZE_SIZE_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define JPEGENC_OBSIZE_SIZE_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define JPEGENC_OBSIZE_SIZE_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define JPEGENC_OBSIZE_SIZE_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define JPEGENC_OBSIZE_SIZE_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define JPEGENC_OBSIZE_SIZE_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define JPEGENC_OBSIZE_SIZE_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define JPEGENC_OBSIZE_SIZE_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define JPEGENC_OBSIZE_SIZE_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define JPEGENC_OBSIZE_SIZE_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define JPEGENC_OBSIZE_SIZE_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define JPEGENC_OBSIZE_SIZE_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define JPEGENC_OBSIZE_SIZE_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define JPEGENC_OBSIZE_SIZE_31 ((uint32_t)0x80000000U) /* Bit31*/ + + +/*** Digital Video Port controller ***/ + +/** Bit definition for DVP_CTRL register **/ +#define DVP_CTRL_DVPEN ((uint32_t)0x00000001U) /* DVP port enable bit. */ +#define DVP_CTRL_CM ((uint32_t)0x00000002U) /* Capture Mode Control. */ +#define DVP_CTRL_CROPEN ((uint32_t)0x00000100U) /* Cropping Feature Enable bit */ +#define DVP_CTRL_VBFLT ((uint32_t)0xF0000000U) /* VSYNC blanking glitch filtering control */ +#define DVP_CTRL_VBFLT_BIT0 ((uint32_t)0x10000000U) /* BIT0 */ +#define DVP_CTRL_VBFLT_BIT1 ((uint32_t)0x20000000U) /* BIT1 */ +#define DVP_CTRL_VBFLT_BIT2 ((uint32_t)0x40000000U) /* BIT2 */ +#define DVP_CTRL_VBFLT_BIT3 ((uint32_t)0x80000000U) /* BIT3 */ + +/** Bit definition for DVP_INTEN register **/ +#define DVP_INTEN_M1SIE ((uint32_t)0x00000001U) /* Frame Buffer 1 is started to receive image data interrupt enable bit */ +#define DVP_INTEN_M2SIE ((uint32_t)0x00000002U) /* Frame Buffer 2 is started to receive image data interrupt enable bit. */ +#define DVP_INTEN_M1TCIE ((uint32_t)0x00000004U) /* Image data to Frame Buffer 1 transfer complete interrupt enable bit. */ +#define DVP_INTEN_M2TCIE ((uint32_t)0x00000008U) /* Image data to Frame Buffer 2 transfer complete interrupt enable bit. */ +#define DVP_INTEN_FOIE ((uint32_t)0x00000020U) /* Data FIFO Over Flow interrupt enable bit. */ +#define DVP_INTEN_AHBERR ((uint32_t)0x00000080U) /* AHB bus error response interrupt enable bit. */ +#define DVP_INTEN_MOIE ((uint32_t)0x00000100U) /* Frame Buffer Over Flow interrupt enable bit. */ +#define DVP_INTEN_SKIPIE ((uint32_t)0x00010000U) /* Frame skipping interrupt enable bit. */ +#define DVP_INTEN_CERRIE ((uint32_t)0x00020000U) /* SYNC Code mismatch detected interrupt enable bit. */ +#define DVP_INTEN_SERRIE ((uint32_t)0x00040000U) /* SYNC Code error sequence detected interrupt enable bit. */ +#define DVP_INTEN_FMSIE ((uint32_t)0x00080000U) /* Start of Frame detection interrupt Enable bit. */ + +/** Bit definition for DVP_INTSTS register **/ +#define DVP_INTSTS_M1SF ((uint32_t)0x00000001U) /* Data to Frame Buffer 1 start flag */ +#define DVP_INTSTS_M2SF ((uint32_t)0x00000002U) /* Data to Frame Buffer 2 start flag. */ +#define DVP_INTSTS_M1TCF ((uint32_t)0x00000004U) /* Data to Frame Buffer 1 completion flag. */ +#define DVP_INTSTS_M2TCF ((uint32_t)0x00000008U) /* Data to Frame Buffer 2 completion flag. */ +#define DVP_INTSTS_M1FOF ((uint32_t)0x00000010U) /* Frame Buffer 1 FIFO over flow flag. */ +#define DVP_INTSTS_M2FOF ((uint32_t)0x00000020U) /* Frame Buffer 2 FIFO over flow flag. */ +#define DVP_INTSTS_AHBERR1F ((uint32_t)0x00000040U) /* Receiving AHB bus error response on accessing to Frame Buffer 1 flag. */ +#define DVP_INTSTS_AHBERR2F ((uint32_t)0x00000080U) /* Receiving AHB bus error response on accessing to Frame Buffer 2 flag. */ +#define DVP_INTSTS_M1OF ((uint32_t)0x00000100U) /* Frame Buffer 1 Over Flow */ +#define DVP_INTSTS_M2OF ((uint32_t)0x00000200U) /* Frame Buffer 2 Over Flow */ +#define DVP_INTSTS_SKIPF ((uint32_t)0x00010000U) /* Frame skipping detected flag. */ +#define DVP_INTSTS_CERRF ((uint32_t)0x00020000U) /* SYNC Code mismatch error detected flag. */ +#define DVP_INTSTS_SERRF ((uint32_t)0x00040000U) /* SYNC Code sequence error detected flag. */ +#define DVP_INTSTS_FMSF ((uint32_t)0x00080000U) /* Start of Frame detected flag. */ +#define DVP_INTSTS_DVPDIS ((uint32_t)0x01000000U) /* SDVP port disable bit. */ + +/** Bit definition for DVP_PORTCFG register **/ +#define DVP_PORTCFG_PCLKPOL ((uint32_t)0x00000001U) /* DVP port pixel clock polarity control. */ +#define DVP_PORTCFG_HSPOL ((uint32_t)0x00000002U) /* HSYNC polarity control. */ +#define DVP_PORTCFG_VSPOL ((uint32_t)0x00000004U) /* VSYNC polarity control. */ +#define DVP_PORTCFG_DATINV ((uint32_t)0x00000008U) /* Data bit inversion. */ +#define DVP_PORTCFG_DATRVS ((uint32_t)0x00000010U) /* To reverse data bit order. */ +#define DVP_PORTCFG_SLC ((uint32_t)0x00000040U) /* Embedded Synchronization Code Position. */ +#define DVP_PORTCFG_EMBSEN ((uint32_t)0x00000080U) /* Embedded Synchronization Mode enable bit. */ +#define DVP_PORTCFG_DBIT ((uint32_t)0x00000700U) /* DVP data port mode. */ +#define DVP_PORTCFG_DBIT0 ((uint32_t)0x00000100U) /* BIT0. */ +#define DVP_PORTCFG_DBIT1 ((uint32_t)0x00000200U) /* BIT1. */ +#define DVP_PORTCFG_DBIT2 ((uint32_t)0x00000400U) /* BIT2. */ +#define DVP_PORTCFG_PIXELDB ((uint32_t)0x00001000U) /* 2 bytes per pixel */ +#define DVP_PORTCFG_BMAP ((uint32_t)0x00FF0000U) /* Received pixel data to Frame Buffer mapping. */ +#define DVP_PORTCFG_BMAP0 ((uint32_t)0x00010000U) /* BIT0. */ +#define DVP_PORTCFG_BMAP1 ((uint32_t)0x00020000U) /* BIT1. */ +#define DVP_PORTCFG_BMAP2 ((uint32_t)0x00040000U) /* BIT2. */ +#define DVP_PORTCFG_BMAP3 ((uint32_t)0x00080000U) /* BIT3. */ +#define DVP_PORTCFG_BMAP4 ((uint32_t)0x00100000U) /* BIT4. */ +#define DVP_PORTCFG_BMAP5 ((uint32_t)0x00200000U) /* BIT5. */ +#define DVP_PORTCFG_BMAP6 ((uint32_t)0x00400000U) /* BIT6. */ +#define DVP_PORTCFG_BMAP7 ((uint32_t)0x00800000U) /* BIT7. */ +#define DVP_PORTCFG_HISKIP ((uint32_t)0x0F000000U) /* Initial Frame Line Skip Control */ +#define DVP_PORTCFG_HRSKIP ((uint32_t)0xF0000000U) /* Repeat Line Skip Pattern Control (include even/odd line capturing) */ + +/** Bit definition for DVP_FIFOCFG register **/ +#define DVP_FIFOCFG_M1ADDREN ((uint32_t)0x00000001U) /* DVP frame buffer 1 enable control. */ +#define DVP_FIFOCFG_M2ADDREN ((uint32_t)0x00000002U) /* DVP frame buffer 2 enable control. */ +#define DVP_FIFOCFG_DISPMODE ((uint32_t)0x00000010U) /* DVP show current frame buffer status. */ +#define DVP_FIFOCFG_EN1KBD ((uint32_t)0x00000020U) /* DVP bursting across 1K boundary control. */ +#define DVP_FIFOCFG_TXFTH ((uint32_t)0x00000700U) /* DVP FIFO transmit threshold setting. */ +#define DVP_FIFOCFG_TXFTH0 ((uint32_t)0x00000100U) /* BIT0. */ +#define DVP_FIFOCFG_TXFTH1 ((uint32_t)0x00000200U) /* BIT1. */ +#define DVP_FIFOCFG_TXFTH2 ((uint32_t)0x00000400U) /* BIT2. */ +#define DVP_FIFOCFG_TXBURSZ ((uint32_t)0x00070000U) /* DVP AHB master data burst setting. */ +#define DVP_FIFOCFG_TXBURSZ0 ((uint32_t)0x00010000U) /* BIT0. */ +#define DVP_FIFOCFG_TXBURSZ1 ((uint32_t)0x00020000U) /* BIT1. */ +#define DVP_FIFOCFG_TXBURSZ2 ((uint32_t)0x00040000U) /* BIT2. */ + +/** Bit definition for DVP_SMADDR1 register **/ +#define DVP_SMADDR1_MADDR ((uint32_t)0xFFFFFFFFU) /* Frame Buffer 1 Start Address. */ + +/** Bit definition for DVP_SMADDR2 register **/ +#define DVP_SMADDR2_MADDR ((uint32_t)0xFFFFFFFFU) /* Frame Buffer 2 Start Address. */ + +/** Bit definition for DVP_FBS register **/ +#define DVP_FBS_FMSIZE ((uint32_t)0x003FFFFFU) /* Frame Buffer Size. */ + +/** Bit definition for DVP_CSXY register **/ +#define DVP_CSXY_CSTAX ((uint32_t)0x000007FFU) /* X-coordinate of crop image start point. */ +#define DVP_CSXY_CSTAY ((uint32_t)0x07FF0000U) /* Y-coordinate of crop image start point.*/ + +/** Bit definition for DVP_CEXY register **/ +#define DVP_CEXY_CENDX ((uint32_t)0x000007FFU) /* X-coordinate of crop image end point. */ +#define DVP_CEXY_CENDY ((uint32_t)0x07FF0000U) /* Y-coordinate of crop image end point.*/ + +/** Bit definition for DVP_EMSC register **/ +#define DVP_EMSC_VS_PTTN ((uint32_t)0x000000FFU) /* Frame start synchronization code. */ +#define DVP_EMSC_VE_PTTN ((uint32_t)0x0000FF00U) /* Frame end synchronization code. */ +#define DVP_EMSC_HS_PTTN ((uint32_t)0x00FF0000U) /* Active line start synchronization code. */ +#define DVP_EMSC_HE_PTTN ((uint32_t)0xFF000000U) /* Active line end synchronization code. */ + +/** Bit definition for DVP_EMSCM register **/ +#define DVP_EMSCM_VS_MASK ((uint32_t)0x000000FFU) /* Frame start synchronization code Mask. */ +#define DVP_EMSCM_VE_MASK ((uint32_t)0x0000FF00U) /* Frame end synchronization code Mask. */ +#define DVP_EMSCM_HS_MASK ((uint32_t)0x00FF0000U) /* Active line start synchronization code Mask. */ +#define DVP_EMSCM_HE_MASK ((uint32_t)0xFF000000U) /* Active line end synchronization code Mask. */ + + +/*** Ethernet MAC ***/ + +/** Bit definition for ETH_MACCFG register **/ +#define ETH_MACCFG_RE ((uint32_t)0x00000001U) /* Receiver Enable */ +#define ETH_MACCFG_TE ((uint32_t)0x00000002U) /* Transmitter Enable */ +#define ETH_MACCFG_PRELEN ((uint32_t)0x0000000CU) /* PRELEN[1:0]: Preamble Length for Transmit packets */ +#define ETH_MACCFG_PRELEN_0 ((uint32_t)0x00000004U) /* PRELEN bit 0 */ +#define ETH_MACCFG_PRELEN_1 ((uint32_t)0x00000008U) /* PRELEN bit 1 */ +#define ETH_MACCFG_DC ((uint32_t)0x00000010U) /* Deferral Check */ +#define ETH_MACCFG_BL ((uint32_t)0x00000060U) /* BL[1:0]: Back-Off Limit */ +#define ETH_MACCFG_BL_0 ((uint32_t)0x00000020U) /* BL bit 0 */ +#define ETH_MACCFG_BL_1 ((uint32_t)0x00000040U) /* BL bit 1 */ +#define ETH_MACCFG_DR ((uint32_t)0x00000100U) /* Disable Retry */ +#define ETH_MACCFG_DCRS ((uint32_t)0x00000200U) /* Disable Carrier Sense During Transmission */ +#define ETH_MACCFG_DO ((uint32_t)0x00000400U) /* Disable Receive Own */ +#define ETH_MACCFG_ECRSFD ((uint32_t)0x00000800U) /* Enable Carrier Sense Before Transmission in Full-Duplex Mode */ +#define ETH_MACCFG_LM ((uint32_t)0x00001000U) /* Loopback Mode */ +#define ETH_MACCFG_DM ((uint32_t)0x00002000U) /* Duplex Mode (0: Half-duplex, 1: Full-duplex) */ +#define ETH_MACCFG_FES ((uint32_t)0x00004000U) /* Speed (0: 10Mbps, 1: 100Mbps) */ +#define ETH_MACCFG_PS ((uint32_t)0x00008000U) /* Port Select (0: 1000Mbps, 1: 10 or 100Mbps) */ +#define ETH_MACCFG_JE ((uint32_t)0x00010000U) /* Jumbo Packet Enable */ +#define ETH_MACCFG_JD ((uint32_t)0x00020000U) /* Jabber Disable */ +#define ETH_MACCFG_BE ((uint32_t)0x00040000U) /* Packet Burst Enable (Note: ETH2 does not support this bit) */ +#define ETH_MACCFG_WD ((uint32_t)0x00080000U) /* Watchdog Disable */ +#define ETH_MACCFG_ACS ((uint32_t)0x00100000U) /* Automatic Pad or CRC Stripping */ +#define ETH_MACCFG_CST ((uint32_t)0x00200000U) /* CRC stripping for Type packets */ +#define ETH_MACCFG_S2KP ((uint32_t)0x00400000U) /* IEEE 802.3as Support for 2K Packets */ +#define ETH_MACCFG_GPSLCE ((uint32_t)0x00800000U) /* Giant Packet Size Limit Control Enable */ +#define ETH_MACCFG_IPG ((uint32_t)0x07000000U) /* IPG[2:0]: Inter-Packet Gap */ +#define ETH_MACCFG_IPG_0 ((uint32_t)0x01000000U) /* IPG bit 0 */ +#define ETH_MACCFG_IPG_1 ((uint32_t)0x02000000U) /* IPG bit 1 */ +#define ETH_MACCFG_IPG_2 ((uint32_t)0x04000000U) /* IPG bit 2 */ +#define ETH_MACCFG_CSO ((uint32_t)0x08000000U) /* Checksum Offload */ +#define ETH_MACCFG_SARC ((uint32_t)0x70000000U) /* SARC[2:0]: Source Address Insertion or Replacement Control */ +#define ETH_MACCFG_SARC_0 ((uint32_t)0x10000000U) /* SARC bit 0 */ +#define ETH_MACCFG_SARC_1 ((uint32_t)0x20000000U) /* SARC bit 1 */ +#define ETH_MACCFG_SARC_2 ((uint32_t)0x40000000U) /* SARC bit 2 */ +#define ETH_MACCFG_ARPEN ((uint32_t)0x80000000U) /* ARP Offload Enable */ + +/** Bit definition for ETH_MACEXTCFG register **/ +#define ETH_MACEXTCFG_GPSL ((uint32_t)0x00003FFFU) /* Giant Packet Size Limit */ +#define ETH_MACEXTCFG_DCRCC ((uint32_t)0x00010000U) /* Disable CRC Checking for Received Packets */ +#define ETH_MACEXTCFG_SPEN ((uint32_t)0x00020000U) /* Slow Protocol Detection Enable */ +#define ETH_MACEXTCFG_USP ((uint32_t)0x00040000U) /* Unicast Slow Protocol Packet Detect */ +#define ETH_MACEXTCFG_EIPGEN ((uint32_t)0x01000000U) /* Extended Inter-Packet Gap Enable */ +#define ETH_MACEXTCFG_EIPG ((uint32_t)0x3E000000U) /* EIPG[4:0]: Extended Inter-Packet Gap */ +#define ETH_MACEXTCFG_EIPG_0 ((uint32_t)0x02000000U) /* EIPG bit 0 */ +#define ETH_MACEXTCFG_EIPG_1 ((uint32_t)0x04000000U) /* EIPG bit 1 */ +#define ETH_MACEXTCFG_EIPG_2 ((uint32_t)0x08000000U) /* EIPG bit 2 */ +#define ETH_MACEXTCFG_EIPG_3 ((uint32_t)0x10000000U) /* EIPG bit 3 */ +#define ETH_MACEXTCFG_EIPG_4 ((uint32_t)0x20000000U) /* EIPG bit 4 */ +#define ETH_MACEXTCFG_APDIM ((uint32_t)0x40000000U) /* ARP Packet Drop if IP Address Mismatch */ + +/** Bit definition for ETH_MACPFLT register **/ +#define ETH_MACPFLT_PM ((uint32_t)0x00000001U) /* Promiscuous Mode */ +#define ETH_MACPFLT_HUC ((uint32_t)0x00000002U) /* Hash Unicast */ +#define ETH_MACPFLT_HMC ((uint32_t)0x00000004U) /* Hash Multicast */ +#define ETH_MACPFLT_DAIF ((uint32_t)0x00000008U) /* DA Inverse Filtering */ +#define ETH_MACPFLT_PAM ((uint32_t)0x00000010U) /* Pass All Multicast */ +#define ETH_MACPFLT_DBP ((uint32_t)0x00000020U) /* Disable Broadcast Packets */ +#define ETH_MACPFLT_PCP ((uint32_t)0x000000C0U) /* PCF[1:0]: Pass Control Packets */ +#define ETH_MACPFLT_PCP_0 ((uint32_t)0x00000040U) /* PCF bit 0 */ +#define ETH_MACPFLT_PCP_1 ((uint32_t)0x00000080U) /* PCF bit 1 */ +#define ETH_MACPFLT_SAIF ((uint32_t)0x00000100U) /* SA Inverse Filtering */ +#define ETH_MACPFLT_SAF ((uint32_t)0x00000200U) /* SA Filter Enable */ +#define ETH_MACPFLT_HPF ((uint32_t)0x00000400U) /* Hash or Perfect Filter */ +#define ETH_MACPFLT_VTFE ((uint32_t)0x00010000U) /* VLAN Tag Filter Enable */ +#define ETH_MACPFLT_IPFE ((uint32_t)0x00100000U) /* Layer 3 and Layer 4 Filter Enable */ +#define ETH_MACPFLT_DNTU ((uint32_t)0x00200000U) /* Drop Non-TCP/UDP over IP Packets */ +#define ETH_MACPFLT_RA ((uint32_t)0x80000000U) /* Receive All */ + +/** Bit definition for ETH_MACWDGTO register **/ +#define ETH_MACWDGTO_WTO ((uint32_t)0x0000000FU) /* WTO[3:0]: Watchdog Timeout */ +#define ETH_MACWDGTO_WTO_0 ((uint32_t)0x00000001U) /* WTO bit 0 */ +#define ETH_MACWDGTO_WTO_1 ((uint32_t)0x00000002U) /* WTO bit 1 */ +#define ETH_MACWDGTO_WTO_2 ((uint32_t)0x00000004U) /* WTO bit 2 */ +#define ETH_MACWDGTO_WTO_3 ((uint32_t)0x00000008U) /* WTO bit 3 */ +#define ETH_MACWDGTO_PWE ((uint32_t)0x00000100U) /* Programmable Watchdog Enable */ + +/** Bit definition for ETH_MACHASHTR0 register **/ +#define ETH_MACHASHTR0_HT31T0 ((uint32_t)0xFFFFFFFFU) /* MAC Hash Table First 32 Bits */ + +/** Bit definition for ETH_MACHASHTR1 register **/ +#define ETH_MACHASHTR1_HT63T32 ((uint32_t)0xFFFFFFFFU) /* MAC Hash Table Second 32 Bits */ + +/** Bit definition for ETH_MACVLANTAG register **/ +#define ETH_MACVLANTAG_VL ((uint32_t)0x0000FFFFU) /* VLAN Tag Identifier for Receive Packets */ +#define ETH_MACVLANTAG_VL_UP ((uint32_t)0x0000E000U) /* VL[15:13]: User Priority */ +#define ETH_MACVLANTAG_VL_UP_0 ((uint32_t)0x00002000U) /* VL_UP bit 0 */ +#define ETH_MACVLANTAG_VL_UP_1 ((uint32_t)0x00004000U) /* VL_UP bit 1 */ +#define ETH_MACVLANTAG_VL_UP_2 ((uint32_t)0x00008000U) /* VL_UP bit 2 */ +#define ETH_MACVLANTAG_VL_CFIDEI ((uint32_t)0x00001000U) /* VL[12]: Canonical Format Indicator (CFI) or \ + Drop Eligible Indicator (DEI) */ +#define ETH_MACVLANTAG_VL_VID ((uint32_t)0x00000FFFU) /* VL[11:0]: VLAN Identifier field of VLAN tag */ +#define ETH_MACVLANTAG_ETV ((uint32_t)0x00010000U) /* Enable 12-Bit VLAN Tag Comparison */ +#define ETH_MACVLANTAG_VTIM ((uint32_t)0x00020000U) /* VLAN Tag Inverse Match Enable */ +#define ETH_MACVLANTAG_ESVL ((uint32_t)0x00040000U) /* Enable S-VLAN */ +#define ETH_MACVLANTAG_ERSVLM ((uint32_t)0x00080000U) /* Enable Receive S-VLAN Match */ +#define ETH_MACVLANTAG_DOVLTC ((uint32_t)0x00100000U) /* Disable VLAN Type Check */ +#define ETH_MACVLANTAG_EVLS ((uint32_t)0x00600000U) /* EVLS[1:0]: Enable VLAN Tag Stripping on Receive */ +#define ETH_MACVLANTAG_EVLS_0 ((uint32_t)0x00200000U) /* EVLS bit 0 */ +#define ETH_MACVLANTAG_EVLS_1 ((uint32_t)0x00400000U) /* EVLS bit 1 */ +#define ETH_MACVLANTAG_EVLRXS ((uint32_t)0x01000000U) /* Enable VLAN Tag in Rx status */ +#define ETH_MACVLANTAG_VTHM ((uint32_t)0x02000000U) /* VLAN Tag Hash Table Match Enable */ +#define ETH_MACVLANTAG_EDVLP ((uint32_t)0x04000000U) /* Enable Double VLAN Processing */ +#define ETH_MACVLANTAG_ERIVLT ((uint32_t)0x08000000U) /* Enable Inner VLAN Tag */ +#define ETH_MACVLANTAG_EIVLS ((uint32_t)0x30000000U) /* EIVLS[1:0]: Enable Inner VLAN Tag Stripping on Receive */ +#define ETH_MACVLANTAG_EIVLS_0 ((uint32_t)0x10000000U) /* EIVLS bit 0 */ +#define ETH_MACVLANTAG_EIVLS_1 ((uint32_t)0x20000000U) /* EIVLS bit 1 */ +#define ETH_MACVLANTAG_EIVLRXS ((uint32_t)0x80000000U) /* Enable Inner VLAN Tag in Rx Status */ + +/** Bit definition for ETH_MACVHASHT register **/ +#define ETH_MACVHASHT_VLHT ((uint32_t)0x0000FFFFU) /* VLAN Hash Table */ + +/** Bit definition for ETH_MACVLANINC register **/ +#define ETH_MACVLANINC_VLT ((uint32_t)0x0000FFFFU) /* VLAN Tag for Transmit Packets */ +#define ETH_MACVLANINC_VLC ((uint32_t)0x00030000U) /* VLC[1:0]: VLAN Tag Control in Transmit Packets */ +#define ETH_MACVLANINC_VLC_0 ((uint32_t)0x00010000U) /* VLC bit 0 */ +#define ETH_MACVLANINC_VLC_1 ((uint32_t)0x00020000U) /* VLC bit 1 */ +#define ETH_MACVLANINC_VLP ((uint32_t)0x00040000U) /* VLAN Priority Control */ +#define ETH_MACVLANINC_CSVL ((uint32_t)0x00080000U) /* C-VLAN or S-VLAN */ +#define ETH_MACVLANINC_VLTI ((uint32_t)0x00100000U) /* VLAN Tag Input */ + +/** Bit definition for ETH_MACIVLANINC register **/ +#define ETH_MACIVLANINC_VLT ((uint32_t)0x0000FFFFU) /* VLAN Tag for Transmit Packets */ +#define ETH_MACIVLANINC_VLC ((uint32_t)0x00030000U) /* VLC[1:0]: VLAN Tag Control in Transmit Packets */ +#define ETH_MACIVLANINC_VLC_0 ((uint32_t)0x00010000U) /* VLC bit 0 */ +#define ETH_MACIVLANINC_VLC_1 ((uint32_t)0x00020000U) /* VLC bit 1 */ +#define ETH_MACIVLANINC_VLP ((uint32_t)0x00040000U) /* VLAN Priority Control */ +#define ETH_MACIVLANINC_CSVL ((uint32_t)0x00080000U) /* C-VLAN or S-VLAN */ +#define ETH_MACIVLANINC_VLTI ((uint32_t)0x00100000U) /* VLAN Tag Input */ + +/** Bit definition for ETH_MACTXFLWCTRL register **/ +#define ETH_MACTXFLWCTRL_FCB ((uint32_t)0x00000001U) /* Flow Control Busy */ +#define ETH_MACTXFLWCTRL_BPA ((uint32_t)0x00000001U) /* Backpressure Activate */ +#define ETH_MACTXFLWCTRL_TFE ((uint32_t)0x00000002U) /* Transmit Flow Control Enable */ +#define ETH_MACTXFLWCTRL_PLT ((uint32_t)0x00000070U) /* PLT[2:0]: Pause Low Threshold */ +#define ETH_MACTXFLWCTRL_PLT_0 ((uint32_t)0x00000010U) /* PLT bit 0 */ +#define ETH_MACTXFLWCTRL_PLT_1 ((uint32_t)0x00000020U) /* PLT bit 1 */ +#define ETH_MACTXFLWCTRL_PLT_2 ((uint32_t)0x00000040U) /* PLT bit 2 */ +#define ETH_MACTXFLWCTRL_DZPQ ((uint32_t)0x00000080U) /* Disable Zero-Quanta Pause */ +#define ETH_MACTXFLWCTRL_PT ((uint32_t)0xFFFF0000U) /* Pause Time */ + +/** Bit definition for ETH_MACRXFLWCTRL register **/ +#define ETH_MACRXFLWCTRL_RFE ((uint32_t)0x00000001U) /* Receive Flow Control Enable */ +#define ETH_MACRXFLWCTRL_UP ((uint32_t)0x00000002U) /* Unicast Pause Packet Detect */ + +/** Bit definition for ETH_MACINTSTS register **/ +#define ETH_MACINTSTS_PHYIS ((uint32_t)0x00000008U) /* PHY Interrupt */ +#define ETH_MACINTSTS_PMTIS ((uint32_t)0x00000010U) /* PMT Interrupt Status */ +#define ETH_MACINTSTS_LPIIS ((uint32_t)0x00000020U) /* LPI Interrupt Status */ +#define ETH_MACINTSTS_MMCIS ((uint32_t)0x00000100U) /* MMC Interrupt Status */ +#define ETH_MACINTSTS_MMCRXIS ((uint32_t)0x00000200U) /* MMC Receive Interrupt Status */ +#define ETH_MACINTSTS_MMCTXIS ((uint32_t)0x00000400U) /* MMC Transmit Interrupt Status */ +#define ETH_MACINTSTS_MMCRXIPIS ((uint32_t)0x00000800U) /* MMC Receive Checksum Offload Interrupt Status */ +#define ETH_MACINTSTS_TSIS ((uint32_t)0x00001000U) /* Timestamp Interrupt Status */ +#define ETH_MACINTSTS_TXSTSIS ((uint32_t)0x00002000U) /* Transmit Status Interrupt */ +#define ETH_MACINTSTS_RXSTSIS ((uint32_t)0x00004000U) /* Receive Status Interrupt */ +#define ETH_MACINTSTS_MDIOIS ((uint32_t)0x00040000U) /* MDIO Interrupt Status */ + +/** Bit definition for ETH_MACINTEN register **/ +#define ETH_MACINTEN_PHYIE ((uint32_t)0x00000008U) /* PHY Interrupt Enable */ +#define ETH_MACINTEN_PMTIE ((uint32_t)0x00000010U) /* PMT Interrupt Enable */ +#define ETH_MACINTEN_LPIIE ((uint32_t)0x00000020U) /* LPI Interrupt Enable */ +#define ETH_MACINTEN_TSIE ((uint32_t)0x00001000U) /* Timestamp Interrupt Enable */ +#define ETH_MACINTEN_TXSTSIE ((uint32_t)0x00002000U) /* Transmit Status Interrupt Enable */ +#define ETH_MACINTEN_RXSTSIE ((uint32_t)0x00004000U) /* Receive Status Interrupt Enable */ +#define ETH_MACINTEN_MDIOIE ((uint32_t)0x00040000U) /* MDIO Interrupt Enable */ + +/** Bit definition for ETH_MACRXTXSTS register **/ +#define ETH_MACRXTXSTS_TJT ((uint32_t)0x00000001U) /* Transmit Jabber Timeout */ +#define ETH_MACRXTXSTS_NCARR ((uint32_t)0x00000002U) /* No Carrier */ +#define ETH_MACRXTXSTS_LCARR ((uint32_t)0x00000004U) /* Loss of Carrier */ +#define ETH_MACRXTXSTS_EXDEF ((uint32_t)0x00000008U) /* Excessive Deferral */ +#define ETH_MACRXTXSTS_LCOL ((uint32_t)0x00000010U) /* Late Collision */ +#define ETH_MACRXTXSTS_EXCOL ((uint32_t)0x00000020U) /* Excessive Collisions */ +#define ETH_MACRXTXSTS_RWT ((uint32_t)0x00000100U) /* Receive Watchdog Timeout */ + +/** Bit definition for ETH_MACPMTCTRLSTS register **/ +#define ETH_MACPMTCTRLSTS_PWRDWN ((uint32_t)0x00000001U) /* Power Down */ +#define ETH_MACPMTCTRLSTS_MGKPKTEN ((uint32_t)0x00000002U) /* Magic Packet Enable */ +#define ETH_MACPMTCTRLSTS_RWKPKTEN ((uint32_t)0x00000004U) /* Remote Wake-Up Packet Enable */ +#define ETH_MACPMTCTRLSTS_MGKPRCVD ((uint32_t)0x00000020U) /* Magic Packet Received */ +#define ETH_MACPMTCTRLSTS_RWKPRCVD ((uint32_t)0x00000040U) /* Remote Wake-Up Packet Received */ +#define ETH_MACPMTCTRLSTS_GLBLUCAST ((uint32_t)0x00000200U) /* Global Unicast */ +#define ETH_MACPMTCTRLSTS_RWKPFE ((uint32_t)0x00000400U) /* Remote Wake-up Packet Forwarding Enable */ +#define ETH_MACPMTCTRLSTS_RWKPTR ((uint32_t)0x1F000000U) /* Remote Wake-up FIFO Pointer */ +#define ETH_MACPMTCTRLSTS_RWKFILTRST ((uint32_t)0x80000000U) /* Remote Wake-Up Packet Filter Register Pointer Reset */ + +/** Bit definition for ETH_MACRWUPFLT register **/ +#define ETH_MACRWUPFLT_WKUPFRMFTR ((uint32_t)0xFFFFFFFFU) /* RWK Packet Filter */ + +/** Bit definition for ETH_MACLPICTRLSTS register **/ +#define ETH_MACLPICTRLSTS_TLPIEN ((uint32_t)0x00000001U) /* Transmit LPI Entry */ +#define ETH_MACLPICTRLSTS_TLPIEX ((uint32_t)0x00000002U) /* Transmit LPI Exit */ +#define ETH_MACLPICTRLSTS_RLPIEN ((uint32_t)0x00000004U) /* Receive LPI Entry */ +#define ETH_MACLPICTRLSTS_RLPIEX ((uint32_t)0x00000008U) /* Receive LPI Exit */ +#define ETH_MACLPICTRLSTS_TLPIST ((uint32_t)0x00000100U) /* Transmit LPI State */ +#define ETH_MACLPICTRLSTS_RLPIST ((uint32_t)0x00000200U) /* Receive LPI State */ +#define ETH_MACLPICTRLSTS_LPIEN ((uint32_t)0x00010000U) /* LPI Enable */ +#define ETH_MACLPICTRLSTS_PLS ((uint32_t)0x00020000U) /* PHY Link Status */ +#define ETH_MACLPICTRLSTS_LPITXA ((uint32_t)0x00080000U) /* LPI Tx Automate */ +#define ETH_MACLPICTRLSTS_LPIATE ((uint32_t)0x00100000U) /* LPI Timer Enable */ +#define ETH_MACLPICTRLSTS_LPITCSE ((uint32_t)0x00200000U) /* LPI Tx Clock Stop Enable */ + +/** Bit definition for ETH_MACLPITIMCTRL register **/ +#define ETH_MACLPITIMCTRL_TWT ((uint32_t)0x0000FFFFU) /* LPI TW Timer */ +#define ETH_MACLPITIMCTRL_LST ((uint32_t)0x03FF0000U) /* LPI LS Timer */ + +/** Bit definition for ETH_MACLPIETYTIM register **/ +#define ETH_MACLPIETYTIM_LPIET ((uint32_t)0x000FFFF8U) /* LPI Entry Timer */ + +/** Bit definition for ETH_MAC1USTICCNT register **/ +#define ETH_MAC1USTICCNT_TIC1USCNTR ((uint32_t)0x00000FFFU) /* 1US Tick Counter */ + +/** Bit definition for ETH_MACVER register **/ +#define ETH_MACVER_SNPSVER ((uint32_t)0x000000FFU) /* Synopsys-defined Version */ +#define ETH_MACVER_USERVER ((uint32_t)0x0000FF00U) /* User-defined Version */ + +/** Bit definition for ETH_MACDBG register **/ +#define ETH_MACDBG_RPESTS ((uint32_t)0x00000001U) /* MAC GMII or MII Receive Protocol Engine Status */ +#define ETH_MACDBG_RFCFCSTS ((uint32_t)0x00000006U) /* RFCFCSTS[1:0]: MAC Receive Packet Controller FIFO Status */ +#define ETH_MACDBG_RFCFCSTS_0 ((uint32_t)0x00000002U) /* RFCFCSTS bit 0 */ +#define ETH_MACDBG_RFCFCSTS_1 ((uint32_t)0x00000004U) /* RFCFCSTS bit 1 */ +#define ETH_MACDBG_TPESTS ((uint32_t)0x00010000U) /* MAC GMII or MII Transmit Protocol Engine Status */ +#define ETH_MACDBG_TFCSTS ((uint32_t)0x00060000U) /* TFCSTS[1:0]: MAC Transmit Packet Controller Status */ +#define ETH_MACDBG_TFCSTS_0 ((uint32_t)0x00020000U) /* TFCSTS bit 0 */ +#define ETH_MACDBG_TFCSTS_1 ((uint32_t)0x00040000U) /* TFCSTS bit 1 */ + +/** Bit definition for ETH_MACHWF0 register **/ +#define ETH_MACHWF0_MIISEL ((uint32_t)0x00000001U) /* 10 or 100 Mbps Support */ +#define ETH_MACHWF0_GMIISEL ((uint32_t)0x00000002U) /* 1000 Mbps Support */ +#define ETH_MACHWF0_HDSEL ((uint32_t)0x00000004U) /* Half-duplex Support */ +#define ETH_MACHWF0_VLHASH ((uint32_t)0x00000010U) /* VLAN Hash Filter Selected */ +#define ETH_MACHWF0_SMASEL ((uint32_t)0x00000020U) /* SMA (MDIO) Interface */ +#define ETH_MACHWF0_RWKSEL ((uint32_t)0x00000040U) /* PMT Remote Wake-up Packet Enable */ +#define ETH_MACHWF0_MGKSEL ((uint32_t)0x00000080U) /* PMT Magic Packet Enable */ +#define ETH_MACHWF0_MMCSEL ((uint32_t)0x00000100U) /* RMON Module Enable */ +#define ETH_MACHWF0_ARPOFFSEL ((uint32_t)0x00000200U) /* ARP Offload Enabled */ +#define ETH_MACHWF0_TSSEL ((uint32_t)0x00001000U) /* IEEE 1588-2008 Timestamp Enabled */ +#define ETH_MACHWF0_EEESEL ((uint32_t)0x00002000U) /* Energy Efficient Ethernet Enabled */ +#define ETH_MACHWF0_TXCOESEL ((uint32_t)0x00004000U) /* Transmit Checksum Offload Enabled */ +#define ETH_MACHWF0_RXCOESEL ((uint32_t)0x00010000U) /* Receive Checksum Offload Enabled */ +#define ETH_MACHWF0_ADDMACADRSEL ((uint32_t)0x007C0000U) /* MAC Addresses 1-31 Selected */ +#define ETH_MACHWF0_MACADR32SEL ((uint32_t)0x00800000U) /* MAC Addresses 32-63 Selected */ +#define ETH_MACHWF0_MACADR64SEL ((uint32_t)0x01000000U) /* MAC Addresses 64-127 Selected */ +#define ETH_MACHWF0_TSSTSSEL ((uint32_t)0x06000000U) /* Timestamp System Time Source */ +#define ETH_MACHWF0_SAVLANINS ((uint32_t)0x08000000U) /* Source Address or VLAN Insertion Enable */ +#define ETH_MACHWF0_ACTPHYSEL ((uint32_t)0x70000000U) /* Active PHY Selected */ + +/** Bit definition for ETH_MACHWF1 register **/ +#define ETH_MACHWF1_RXFIFOSIZE ((uint32_t)0x0000001FU) /* MTL Receive FIFO Size */ +#define ETH_MACHWF1_SPRAM ((uint32_t)0x00000020U) /* Single Port RAM Enable */ +#define ETH_MACHWF1_TXFIFOSIZE ((uint32_t)0x000007C0U) /* MTL Transmit FIFO Size */ +#define ETH_MACHWF1_OSTEN ((uint32_t)0x00000800U) /* One-Step Timestamping Enable */ +#define ETH_MACHWF1_PTOEN ((uint32_t)0x00001000U) /* PTP Offload Enable */ +#define ETH_MACHWF1_ADVTHWORD ((uint32_t)0x00002000U) /* IEEE 1588 High Word Register Enable */ +#define ETH_MACHWF1_ADDR64 ((uint32_t)0x0000C000U) /* Address Width */ +#define ETH_MACHWF1_DCBEN ((uint32_t)0x00010000U) /* DCB Feature Enable */ +#define ETH_MACHWF1_SPHEN ((uint32_t)0x00020000U) /* Split Header Feature Enable */ +#define ETH_MACHWF1_TSOEN ((uint32_t)0x00040000U) /* TCP Segmentation Offload Enable */ +#define ETH_MACHWF1_DBGMEMA ((uint32_t)0x00080000U) /* DMA Debug Registers Enable */ +#define ETH_MACHWF1_AVSEL ((uint32_t)0x00100000U) /* AV Feature Enable */ +#define ETH_MACHWF1_RAVSEL ((uint32_t)0x00200000U) /* Rx Side Only AV Feature Enable */ +#define ETH_MACHWF1_POUOST ((uint32_t)0x00800000U) /* One Step for PTP over UDP/IP Feature Enable */ +#define ETH_MACHWF1_HASHTBLSZ ((uint32_t)0x03000000U) /* Hash Table Size */ +#define ETH_MACHWF1_L3L4FNUM ((uint32_t)0x78000000U) /* Total number of L3 or L4 Filters */ + +/** Bit definition for ETH_MACHWF2 register **/ +#define ETH_MACHWF2_RXQCNT ((uint32_t)0x0000000FU) /* Number of MTL Receive Queues */ +#define ETH_MACHWF2_TXQCNT ((uint32_t)0x000003C0U) /* Number of MTL Transmit Queues */ +#define ETH_MACHWF2_RXCHCNT ((uint32_t)0x0000F000U) /* Number of DMA Receive Channels */ +#define ETH_MACHWF2_RDCSZ ((uint32_t)0x00030000U) /* Rx DMA Descriptor Cache Size in terms of \ + 16 bytes descriptors */ +#define ETH_MACHWF2_TXCHCNT ((uint32_t)0x003C0000U) /* Number of DMA Transmit Channels */ +#define ETH_MACHWF2_TDCSZ ((uint32_t)0x00C00000U) /* Tx DMA Descriptor Cache Size in terms of \ + 16 bytes descriptors */ +#define ETH_MACHWF2_PPSOUTNUM ((uint32_t)0x03000000U) /* Number of PPS Outputs */ +#define ETH_MACHWF2_AUXSNAPNUM ((uint32_t)0x70000000U) /* Number of Auxiliary Snapshot Inputs */ + +/** Bit definition for ETH_MACHWF3 register **/ +#define ETH_MACHWF3_NRVF ((uint32_t)0x00000007U) /* Number of Extended VLAN Tag Filters Enabled */ +#define ETH_MACHWF3_CBTISEL ((uint32_t)0x00000010U) /* Queue/Channel based VLAN tag insertion on Tx Enable */ +#define ETH_MACHWF3_DVLAN ((uint32_t)0x00000020U) /* Double VLAN Tag Processing Selected */ +#define ETH_MACHWF3_PDUPSEL ((uint32_t)0x00000200U) /* Broadcast/Multicast Packet Duplication */ +#define ETH_MACHWF3_FRPSEL ((uint32_t)0x00000200U) /* Flexible Receive Parser Selected */ +#define ETH_MACHWF3_FRPBS ((uint32_t)0x00001800U) /* Flexible Receive Parser Buffer size */ +#define ETH_MACHWF3_FRPES ((uint32_t)0x00006000U) /* Flexible Receive Parser Table Entries size */ +#define ETH_MACHWF3_ESTSEL ((uint32_t)0x00010000U) /* Enhancements to Scheduled Traffic Enable */ +#define ETH_MACHWF3_ESTDEP ((uint32_t)0x000E0000U) /* Depth of the Gate Control List */ +#define ETH_MACHWF3_ESTWID ((uint32_t)0x00300000U) /* Width of the Time Interval field in the Gate Control List */ +#define ETH_MACHWF3_FPESEL ((uint32_t)0x04000000U) /* Frame Preemption Enable */ +#define ETH_MACHWF3_TBSSEL ((uint32_t)0x08000000U) /* Time Based Scheduling Enable */ +#define ETH_MACHWF3_ASP ((uint32_t)0x30000000U) /* Automotive Safety Package */ + +/** Bit definition for ETH_MACMDIOADDR register **/ +#define ETH_MACMDIOADDR_GB ((uint32_t)0x00000001U) /* GMII/MII Busy */ +#define ETH_MACMDIOADDR_C45E ((uint32_t)0x00000002U) /* Clause 45 PHY Enable */ +#define ETH_MACMDIOADDR_GOC ((uint32_t)0x0000000CU) /* GMII/MII Operation Command */ +#define ETH_MACMDIOADDR_GOC0 ((uint32_t)0x00000004U) /* GMII/MII Operation Command 0 */ +#define ETH_MACMDIOADDR_GOC1 ((uint32_t)0x00000008U) /* GMII/MII Operation Command 1 */ +#define ETH_MACMDIOADDR_SKAP ((uint32_t)0x00000010U) /* Skip Address Packet */ +#define ETH_MACMDIOADDR_CR ((uint32_t)0x00000F00U) /* CR[3:0]: CSR Clock Range */ +#define ETH_MACMDIOADDR_CR_0 ((uint32_t)0x00000100U) /* CR bit 0 */ +#define ETH_MACMDIOADDR_CR_1 ((uint32_t)0x00000200U) /* CR bit 1 */ +#define ETH_MACMDIOADDR_CR_2 ((uint32_t)0x00000400U) /* CR bit 2 */ +#define ETH_MACMDIOADDR_CR_3 ((uint32_t)0x00000800U) /* CR bit 3 */ +#define ETH_MACMDIOADDR_NTC ((uint32_t)0x00007000U) /* Number of Trailing Clocks */ +#define ETH_MACMDIOADDR_RDA ((uint32_t)0x001F0000U) /* Register/Device Address */ +#define ETH_MACMDIOADDR_PA ((uint32_t)0x003E0000U) /* Physical Layer Address */ +#define ETH_MACMDIOADDR_BTB ((uint32_t)0x04000000U) /* Back to Back transactions */ +#define ETH_MACMDIOADDR_PSE ((uint32_t)0x08000000U) /* Preamble Suppression Enable */ + +/** Bit definition for ETH_MACMDIODATA register **/ +#define ETH_MACMDIODATA_GD ((uint32_t)0x0000FFFFU) /* GMII/MII Data */ +#define ETH_MACMDIODATA_RA ((uint32_t)0xFFFF0000U) /* Register Address */ + +/** Bit definition for ETH_MACARPADDR register **/ +#define ETH_MACARPADDR_ARPPA ((uint32_t)0xFFFFFFFFU) /* ARP Protocol Address */ + +/** Bit definition for ETH_MACCSRSWCTRL register **/ +#define ETH_MACCSRSWCTRL_RCWE ((uint32_t)0x00000001U) /* Register Clear on Write 1 Enable */ +#define ETH_MACCSRSWCTRL_SEEN ((uint32_t)0x00000100U) /* Slave Error Response Enable */ + +/** Bit definition for ETH_MACPTNS register **/ +#define ETH_MACPTNS_MPTN ((uint32_t)0xFFFFFFFFU) /* MAC 1722 Presentation Time in ns */ + +/** Bit definition for ETH_MACPTUPDT register **/ +#define ETH_MACPTUPDT_MPTN ((uint32_t)0xFFFFFFFFU) /* MAC 1722 Presentation Time Update */ + +/** Bit definition for ETH_MACADDR0H register **/ +#define ETH_MACADDR0H_ADDRHI ((uint32_t)0x0000FFFFU) /* MAC Address0[47:32] */ +#define ETH_MACADDR0H_AE ((uint32_t)0x80000000U) /* Address Enable */ + +/** Bit definition for ETH_MACADDR0L register **/ +#define ETH_MACADDR0L_ADDRLO ((uint32_t)0xFFFFFFFFU) /* MAC Address0[31:0] */ + +/** Bit definition for ETH_MACADDR1H register **/ +#define ETH_MACADDR1H_ADDRHI ((uint32_t)0x0000FFFFU) /* MAC Address1[47:32] */ +#define ETH_MACADDR1H_MBC ((uint32_t)0x3F000000U) /* MBC[5:0]: Mask Byte Control */ +#define ETH_MACADDR1H_MBC_0 ((uint32_t)0x01000000U) /* MBC bit 0 */ +#define ETH_MACADDR1H_MBC_1 ((uint32_t)0x02000000U) /* MBC bit 1 */ +#define ETH_MACADDR1H_MBC_2 ((uint32_t)0x04000000U) /* MBC bit 2 */ +#define ETH_MACADDR1H_MBC_3 ((uint32_t)0x08000000U) /* MBC bit 3 */ +#define ETH_MACADDR1H_MBC_4 ((uint32_t)0x10000000U) /* MBC bit 4 */ +#define ETH_MACADDR1H_MBC_5 ((uint32_t)0x20000000U) /* MBC bit 5 */ +#define ETH_MACADDR1H_SA ((uint32_t)0x40000000U) /* Source Address */ +#define ETH_MACADDR1H_AE ((uint32_t)0x80000000U) /* Address Enable */ + +/** Bit definition for ETH_MACADDR1L register **/ +#define ETH_MACADDR1L_ADDRLO ((uint32_t)0xFFFFFFFFU) /* MAC Address1[31:0] */ + +/** Bit definition for ETH_MACADDR2H register **/ +#define ETH_MACADDR2H_ADDRHI ((uint32_t)0x0000FFFFU) /* MAC Address2[47:32] */ +#define ETH_MACADDR2H_MBC ((uint32_t)0x3F000000U) /* MBC[5:0]: Mask Byte Control */ +#define ETH_MACADDR2H_MBC_0 ((uint32_t)0x01000000U) /* MBC bit 0 */ +#define ETH_MACADDR2H_MBC_1 ((uint32_t)0x02000000U) /* MBC bit 1 */ +#define ETH_MACADDR2H_MBC_2 ((uint32_t)0x04000000U) /* MBC bit 2 */ +#define ETH_MACADDR2H_MBC_3 ((uint32_t)0x08000000U) /* MBC bit 3 */ +#define ETH_MACADDR2H_MBC_4 ((uint32_t)0x10000000U) /* MBC bit 4 */ +#define ETH_MACADDR2H_MBC_5 ((uint32_t)0x20000000U) /* MBC bit 5 */ +#define ETH_MACADDR2H_SA ((uint32_t)0x40000000U) /* Source Address */ +#define ETH_MACADDR2H_AE ((uint32_t)0x80000000U) /* Address Enable */ + +/** Bit definition for ETH_MACADDR2L register **/ +#define ETH_MACADDR2L_ADDRLO ((uint32_t)0xFFFFFFFFU) /* MAC Address2[31:0] */ + +/** Bit definition for ETH_MACADDR3H register **/ +#define ETH_MACADDR3H_ADDRHI ((uint32_t)0x0000FFFFU) /* MAC Address3[47:32] */ +#define ETH_MACADDR3H_MBC ((uint32_t)0x3F000000U) /* MBC[5:0]: Mask Byte Control */ +#define ETH_MACADDR3H_MBC_0 ((uint32_t)0x01000000U) /* MBC bit 0 */ +#define ETH_MACADDR3H_MBC_1 ((uint32_t)0x02000000U) /* MBC bit 1 */ +#define ETH_MACADDR3H_MBC_2 ((uint32_t)0x04000000U) /* MBC bit 2 */ +#define ETH_MACADDR3H_MBC_3 ((uint32_t)0x08000000U) /* MBC bit 3 */ +#define ETH_MACADDR3H_MBC_4 ((uint32_t)0x10000000U) /* MBC bit 4 */ +#define ETH_MACADDR3H_MBC_5 ((uint32_t)0x20000000U) /* MBC bit 5 */ +#define ETH_MACADDR3H_SA ((uint32_t)0x40000000U) /* Source Address */ +#define ETH_MACADDR3H_AE ((uint32_t)0x80000000U) /* Address Enable */ + +/** Bit definition for ETH_MACADDR3L register **/ +#define ETH_MACADDR3L_ADDRLO ((uint32_t)0xFFFFFFFFU) /* MAC Address3[31:0] */ + +/** Bit definition for ETH_MMCCTRL register **/ +#define ETH_MMCCTRL_CNTRST ((uint32_t)0x00000001U) /* Counters Reset */ +#define ETH_MMCCTRL_CNTSTOPRO ((uint32_t)0x00000002U) /* Counter Stop Rollover */ +#define ETH_MMCCTRL_RSTONRD ((uint32_t)0x00000004U) /* Reset on Read */ +#define ETH_MMCCTRL_CNTFREEZ ((uint32_t)0x00000008U) /* MMC Counter Freeze */ +#define ETH_MMCCTRL_CNTPRST ((uint32_t)0x00000010U) /* Counters Preset */ +#define ETH_MMCCTRL_CNTPRSTLVL ((uint32_t)0x00000020U) /* Full-Half Preset */ +#define ETH_MMCCTRL_UCDBC ((uint32_t)0x00000100U) /* Update MMC Counters for Dropped Broadcast Packets */ + +/** Bit definition for ETH_MMCRXINT register **/ +#define ETH_MMCRXINT_RXBCGPIS ((uint32_t)0x00000008U) /* MMC RX Broadcast Good Packet Counter Interrupt Status */ +#define ETH_MMCRXINT_RXMCGPIS ((uint32_t)0x00000010U) /* MMC RX Multicast Good Packet Counter Interrupt Status */ +#define ETH_MMCRXINT_RXCRCERPIS ((uint32_t)0x00000020U) /* MMC RX CRC Error Packet Counter Interrupt Status */ +#define ETH_MMCRXINT_RXALGNERPIS ((uint32_t)0x00000040U) /* MMC RX Alignment Error Packet Counter Interrupt Status */ +#define ETH_MMCRXINT_RXUCGPIS ((uint32_t)0x00020000U) /* MMC RX Unicast Good Packet Counter Interrupt Status */ +#define ETH_MMCRXINT_RXLPIUSCIS ((uint32_t)0x04000000U) /* MMC Receive LPI microsecond counter interrupt status */ +#define ETH_MMCRXINT_RXLPITRCIS ((uint32_t)0x08000000U) /* MMC Receive LPI transition counter interrupt status */ + +/** Bit definition for ETH_MMCTXINT register **/ +#define ETH_MMCTXINT_TXSCOLGPIS ((uint32_t)0x00004000U) /* MMC TX Single Collision Good Packet Counter Interrupt Status */ +#define ETH_MMCTXINT_TXMCOLGPIS ((uint32_t)0x00008000U) /* MMC TX Multiple Collision Good Packet Counter Interrupt Status */ +#define ETH_MMCTXINT_TXGPKTIS ((uint32_t)0x00200000U) /* MMC TX Good Packet Counter Interrupt Status */ +#define ETH_MMCTXINT_TXLPIUSCIS ((uint32_t)0x04000000U) /* MMC Transmit LPI microsecond counter interrupt status */ +#define ETH_MMCTXINT_TXLPITRCIS ((uint32_t)0x08000000U) /* MMC Transmit LPI transition counter interrupt status */ + +/** Bit definition for ETH_MMCRXINTMSK register **/ +#define ETH_MMCRXINTMSK_RXBCGPIM ((uint32_t)0x00000008U) /* MMC RX Broadcast Good Packet Counter Interrupt Mask */ +#define ETH_MMCRXINTMSK_RXMCGPIM ((uint32_t)0x00000010U) /* MMC RX Multicast Good Packet Counter Interrupt Mask */ +#define ETH_MMCRXINTMSK_RXCRCERPIM ((uint32_t)0x00000020U) /* MMC RX CRC Error Packet Counter Interrupt Mask */ +#define ETH_MMCRXINTMSK_RXALGNERPIM ((uint32_t)0x00000040U) /* MMC RX Alignment Error Packet Counter Interrupt Mask */ +#define ETH_MMCRXINTMSK_RXUCGPIM ((uint32_t)0x00020000U) /* MMC RX Unicast Good Packet Counter Interrupt Mask */ +#define ETH_MMCRXINTMSK_RXLPIUSCIM ((uint32_t)0x04000000U) /* MMC Receive LPI microsecond counter interrupt Mask */ +#define ETH_MMCRXINTMSK_RXLPITRCIM ((uint32_t)0x08000000U) /* MMC Receive LPI transition counter interrupt Mask */ + +/** Bit definition for ETH_MMCTXINTMSK register **/ +#define ETH_MMCTXINTMSK_TXSCOLGPIM ((uint32_t)0x00004000U) /* MMC TX Single Collision Good Packet Counter Interrupt Mask */ +#define ETH_MMCTXINTMSK_TXMCOLGPIM ((uint32_t)0x00008000U) /* MMC TX Multiple Collision Good Packet Counter Interrupt Mask */ +#define ETH_MMCTXINTMSK_TXGPKTIM ((uint32_t)0x00200000U) /* MMC TX Good Packet Counter Interrupt Mask */ +#define ETH_MMCTXINTMSK_TXLPIUSCIM ((uint32_t)0x04000000U) /* MMC Transmit LPI microsecond counter interrupt Mask */ +#define ETH_MMCTXINTMSK_TXLPITRCIM ((uint32_t)0x08000000U) /* MMC Transmit LPI transition counter interrupt Mask */ + +/** Bit definition for ETH_MMCTXSCGP register **/ +#define ETH_MMCTXSCGP_TXSNGLCOLG ((uint32_t)0xFFFFFFFFU) /* Tx Single Collision Good Packets */ + +/** Bit definition for ETH_MMCTXMCGP register **/ +#define ETH_MMCTXMCGP_TXMULTCOLG ((uint32_t)0xFFFFFFFFU) /* Tx Multiple Collision Good Packets */ + +/** Bit definition for ETH_MMCTXPCG register **/ +#define ETH_MMCTXPCG_TXPKTG ((uint32_t)0xFFFFFFFFU) /* Tx Packet Count Good */ + +/** Bit definition for ETH_MMCRXBPG register **/ +#define ETH_MMCRXBPG_RXBCASTG ((uint32_t)0xFFFFFFFFU) /* Rx Broadcast Packets Good */ + +/** Bit definition for ETH_MMCRXMPG register **/ +#define ETH_MMCRXMPG_RXMCASTG ((uint32_t)0xFFFFFFFFU) /* Rx Multicast Packets Good */ + +/** Bit definition for ETH_MMCRXCRCEP register **/ +#define ETH_MMCRXCRCEP_RXCRCERR ((uint32_t)0xFFFFFFFFU) /* Rx CRC Error Packets */ + +/** Bit definition for ETH_MMCRXAEP register **/ +#define ETH_MMCRXAEP_RXALGNERR ((uint32_t)0xFFFFFFFFU) /* Rx Alignment Error Packets */ + +/** Bit definition for ETH_MMCRXUPG register **/ +#define ETH_MMCRXUPG_RXUCASTG ((uint32_t)0xFFFFFFFFU) /* Rx Unicast Packets Good */ + +/** Bit definition for ETH_MMCTXLPIUS register **/ +#define ETH_MMCTXLPIUS_TXLPIUSC ((uint32_t)0xFFFFFFFFU) /* Tx LPI Microseconds Counter */ + +/** Bit definition for ETH_MMCTXLPITRAN register **/ +#define ETH_MMCTXLPITRAN_TXLPITRC ((uint32_t)0xFFFFFFFFU) /* Tx LPI Transition Counter */ + +/** Bit definition for ETH_MMCRXLPIUS register **/ +#define ETH_MMCRXLPIUS_RXLPIUSC ((uint32_t)0xFFFFFFFFU) /* Rx LPI Microseconds Counter */ + +/** Bit definition for ETH_MMCRXLPITRAN register **/ +#define ETH_MMCRXLPITRAN_RXLPITRC ((uint32_t)0xFFFFFFFFU) /* Rx LPI Transition Counter */ + +/** Bit definition for ETH_MMCIPCRXINTMSK register **/ +#define ETH_MMCIPCRXINTMSK_RXIPV4GPIM ((uint32_t)0x00000001U) /* MMC Receive IPV4 Good Packet Counter Interrupt Mask */ +#define ETH_MMCIPCRXINTMSK_RXIPV6GPIM ((uint32_t)0x00000020U) /* MMC Receive IPV6 Good Packet Counter Interrupt Mask */ +#define ETH_MMCIPCRXINTMSK_RXUDPGPIM ((uint32_t)0x00000100U) /* MMC Receive UDP Good Packet Counter Interrupt Mask */ +#define ETH_MMCIPCRXINTMSK_RXUDPERPIM ((uint32_t)0x00000200U) /* MMC Receive UDP Error Packet Counter Interrupt Mask */ +#define ETH_MMCIPCRXINTMSK_RXTCPGPIM ((uint32_t)0x00000400U) /* MMC Receive TCP Good Packet Counter Interrupt Mask */ +#define ETH_MMCIPCRXINTMSK_RXTCPERPIM ((uint32_t)0x00000800U) /* MMC Receive TCP Error Packet Counter Interrupt Mask */ +#define ETH_MMCIPCRXINTMSK_RXICMPGPIM ((uint32_t)0x00001000U) /* MMC Receive ICMP Good Packet Counter Interrupt Mask */ +#define ETH_MMCIPCRXINTMSK_RXICMPERPIM ((uint32_t)0x00002000U) /* MMC Receive ICMP Error Packet Counter Interrupt Mask */ + +/** Bit definition for ETH_MMCIPCRXINT register **/ +#define ETH_MMCIPCRXINT_RXIPV4GPIS ((uint32_t)0x00000001U) /* MMC Receive IPV4 Good Packet Counter Interrupt Status */ +#define ETH_MMCIPCRXINT_RXIPV6GPIS ((uint32_t)0x00000020U) /* MMC Receive IPV6 Good Packet Counter Interrupt Status */ +#define ETH_MMCIPCRXINT_RXUDPGPIS ((uint32_t)0x00000100U) /* MMC Receive UDP Good Packet Counter Interrupt Status */ +#define ETH_MMCIPCRXINT_RXUDPERPIS ((uint32_t)0x00000200U) /* MMC Receive UDP Error Packet Counter Interrupt Status */ +#define ETH_MMCIPCRXINT_RXTCPGPIS ((uint32_t)0x00000400U) /* MMC Receive TCP Good Packet Counter Interrupt Status */ +#define ETH_MMCIPCRXINT_RXTCPERPIS ((uint32_t)0x00000800U) /* MMC Receive TCP Error Packet Counter Interrupt Status */ +#define ETH_MMCIPCRXINT_RXICMPGPIS ((uint32_t)0x00001000U) /* MMC Receive ICMP Good Packet Counter Interrupt Status */ +#define ETH_MMCIPCRXINT_RXICMPERPIS ((uint32_t)0x00002000U) /* MMC Receive ICMP Error Packet Counter Interrupt Status */ + +/** Bit definition for ETH_MMCRXIPV4GP register **/ +#define ETH_MMCRXIPV4GP_RXIPV4GDPKT ((uint32_t)0xFFFFFFFFU) /* RxIPv4 Good Packets */ + +/** Bit definition for ETH_MMCRXIPV6GP register **/ +#define ETH_MMCRXIPV6GP_RXIPV6GDPKT ((uint32_t)0xFFFFFFFFU) /* RxIPv6 Good Packets */ + +/** Bit definition for ETH_MMCRXUDPGP register **/ +#define ETH_MMCRXUDPGP_RXUDPGDPKT ((uint32_t)0xFFFFFFFFU) /* RxUDP Good Packets */ + +/** Bit definition for ETH_MMCRXUDPEP register **/ +#define ETH_MMCRXUDPEP_RXUDPERRPKT ((uint32_t)0xFFFFFFFFU) /* RxUDP Error Packets */ + +/** Bit definition for ETH_MMCRXTCPGP register **/ +#define ETH_MMCRXTCPGP_RXTCPGDPKT ((uint32_t)0xFFFFFFFFU) /* RxTCP Good Packets */ + +/** Bit definition for ETH_MMCRXTCPEP register **/ +#define ETH_MMCRXTCPEP_RXTCPERRPKT ((uint32_t)0xFFFFFFFFU) /* RxTCP Error Packets */ + +/** Bit definition for ETH_MMCRXICMPGP register **/ +#define ETH_MMCRXICMPGP_RXICMPGDPKT ((uint32_t)0xFFFFFFFFU) /* RxICMP Good Packets */ + +/** Bit definition for ETH_MMCRXICMPEP register **/ +#define ETH_MMCRXICMPEP_RXICMPERRPKT ((uint32_t)0xFFFFFFFFU) /* RxICMP Error Packets */ + +/** Bit definition for ETH_MACL3L4F0CTRL register **/ +#define ETH_MACL3L4F0CTRL_L3PEN ((uint32_t)0x00000001U) /* Layer 3 Protocol Enable */ +#define ETH_MACL3L4F0CTRL_L3SAM ((uint32_t)0x00000004U) /* Layer 3 IP SA Match Enable */ +#define ETH_MACL3L4F0CTRL_L3SAIM ((uint32_t)0x00000008U) /* Layer 3 IP SA Inverse Match Enable */ +#define ETH_MACL3L4F0CTRL_L3DAM ((uint32_t)0x00000010U) /* Layer 3 IP DA Match Enable */ +#define ETH_MACL3L4F0CTRL_L3DAIM ((uint32_t)0x00000020U) /* Layer 3 IP DA Inverse Match Enable */ +#define ETH_MACL3L4F0CTRL_L3HSBM ((uint32_t)0x000007C0U) /* L3HSBM[4:0]: Layer 3 IP SA Higher Bits Match */ +#define ETH_MACL3L4F0CTRL_L3HSBM_0 ((uint32_t)0x00000040U) /* L3HSBM bit 0 */ +#define ETH_MACL3L4F0CTRL_L3HSBM_1 ((uint32_t)0x00000080U) /* L3HSBM bit 1 */ +#define ETH_MACL3L4F0CTRL_L3HSBM_2 ((uint32_t)0x00000100U) /* L3HSBM bit 2 */ +#define ETH_MACL3L4F0CTRL_L3HSBM_3 ((uint32_t)0x00000200U) /* L3HSBM bit 3 */ +#define ETH_MACL3L4F0CTRL_L3HSBM_4 ((uint32_t)0x00000400U) /* L3HSBM bit 4 */ +#define ETH_MACL3L4F0CTRL_L3HDBM ((uint32_t)0x0000F800U) /* L3HDBM[4:0]: Layer 3 IP DA Higher Bits Match */ +#define ETH_MACL3L4F0CTRL_L3HDBM_0 ((uint32_t)0x00000800U) /* L3HDBM bit 0 */ +#define ETH_MACL3L4F0CTRL_L3HDBM_1 ((uint32_t)0x00001000U) /* L3HDBM bit 1 */ +#define ETH_MACL3L4F0CTRL_L3HDBM_2 ((uint32_t)0x00002000U) /* L3HDBM bit 2 */ +#define ETH_MACL3L4F0CTRL_L3HDBM_3 ((uint32_t)0x00004000U) /* L3HDBM bit 3 */ +#define ETH_MACL3L4F0CTRL_L3HDBM_4 ((uint32_t)0x00008000U) /* L3HDBM bit 4 */ +#define ETH_MACL3L4F0CTRL_L4PEN ((uint32_t)0x00010000U) /* Layer 4 Protocol Enable */ +#define ETH_MACL3L4F0CTRL_L4SPM ((uint32_t)0x00040000U) /* Layer 4 Source Port Match Enable */ +#define ETH_MACL3L4F0CTRL_L4SPIM ((uint32_t)0x00080000U) /* Layer 4 Source Port Inverse Match Enable */ +#define ETH_MACL3L4F0CTRL_L4DPM ((uint32_t)0x00100000U) /* Layer 4 Destination Port Match Enable */ +#define ETH_MACL3L4F0CTRL_L4DPIM ((uint32_t)0x00200000U) /* Layer 4 Destination Port Inverse Match Enable */ + +/** Bit definition for ETH_MACL4F0PORT register **/ +#define ETH_MACL4F0PORT_L4SP ((uint32_t)0x0000FFFFU) /* Layer 4 Source Port Number Field */ +#define ETH_MACL4F0PORT_L4DP ((uint32_t)0xFFFF0000U) /* Layer 4 Destination Port Number Field */ + +/** Bit definition for ETH_MACL3F0ADDR0 register **/ +#define ETH_MACL3F0ADDR0_L3A0 ((uint32_t)0xFFFFFFFFU) /* Layer 3 Address 0 Field */ + +/** Bit definition for ETH_MACL3F0ADDR1 register **/ +#define ETH_MACL3F0ADDR1_L3A1 ((uint32_t)0xFFFFFFFFU) /* Layer 3 Address 1 Field */ + +/** Bit definition for ETH_MACL3F0ADDR2 register **/ +#define ETH_MACL3F0ADDR2_L3A2 ((uint32_t)0xFFFFFFFFU) /* Layer 3 Address 2 Field */ + +/** Bit definition for ETH_MACL3F0ADDR3 register **/ +#define ETH_MACL3F0ADDR3_L3A3 ((uint32_t)0xFFFFFFFFU) /* Layer 3 Address 3 Field */ + +/** Bit definition for ETH_MACL3L4F1CTRL register **/ +#define ETH_MACL3L4F1CTRL_L3PEN ((uint32_t)0x00000001U) /* Layer 3 Protocol Enable */ +#define ETH_MACL3L4F1CTRL_L3SAM ((uint32_t)0x00000004U) /* Layer 3 IP SA Match Enable */ +#define ETH_MACL3L4F1CTRL_L3SAIM ((uint32_t)0x00000008U) /* Layer 3 IP SA Inverse Match Enable */ +#define ETH_MACL3L4F1CTRL_L3DAM ((uint32_t)0x00000010U) /* Layer 3 IP DA Match Enable */ +#define ETH_MACL3L4F1CTRL_L3DAIM ((uint32_t)0x00000020U) /* Layer 3 IP DA Inverse Match Enable */ +#define ETH_MACL3L4F1CTRL_L3HSBM ((uint32_t)0x000007C0U) /* L3HSBM[4:0]: Layer 3 IP SA Higher Bits Match */ +#define ETH_MACL3L4F1CTRL_L3HSBM_0 ((uint32_t)0x00000040U) /* L3HSBM bit 0 */ +#define ETH_MACL3L4F1CTRL_L3HSBM_1 ((uint32_t)0x00000080U) /* L3HSBM bit 1 */ +#define ETH_MACL3L4F1CTRL_L3HSBM_2 ((uint32_t)0x00000100U) /* L3HSBM bit 2 */ +#define ETH_MACL3L4F1CTRL_L3HSBM_3 ((uint32_t)0x00000200U) /* L3HSBM bit 3 */ +#define ETH_MACL3L4F1CTRL_L3HSBM_4 ((uint32_t)0x00000400U) /* L3HSBM bit 4 */ +#define ETH_MACL3L4F1CTRL_L3HDBM ((uint32_t)0x0000F800U) /* L3HDBM[4:0]: Layer 3 IP DA Higher Bits Match */ +#define ETH_MACL3L4F1CTRL_L3HDBM_0 ((uint32_t)0x00000800U) /* L3HDBM bit 0 */ +#define ETH_MACL3L4F1CTRL_L3HDBM_1 ((uint32_t)0x00001000U) /* L3HDBM bit 1 */ +#define ETH_MACL3L4F1CTRL_L3HDBM_2 ((uint32_t)0x00002000U) /* L3HDBM bit 2 */ +#define ETH_MACL3L4F1CTRL_L3HDBM_3 ((uint32_t)0x00004000U) /* L3HDBM bit 3 */ +#define ETH_MACL3L4F1CTRL_L3HDBM_4 ((uint32_t)0x00008000U) /* L3HDBM bit 4 */ +#define ETH_MACL3L4F1CTRL_L4PEN ((uint32_t)0x00010000U) /* Layer 4 Protocol Enable */ +#define ETH_MACL3L4F1CTRL_L4SPM ((uint32_t)0x00040000U) /* Layer 4 Source Port Match Enable */ +#define ETH_MACL3L4F1CTRL_L4SPIM ((uint32_t)0x00080000U) /* Layer 4 Source Port Inverse Match Enable */ +#define ETH_MACL3L4F1CTRL_L4DPM ((uint32_t)0x00100000U) /* Layer 4 Destination Port Match Enable */ +#define ETH_MACL3L4F1CTRL_L4DPIM ((uint32_t)0x00200000U) /* Layer 4 Destination Port Inverse Match Enable */ + +/** Bit definition for ETH_MACL4F1PORT register **/ +#define ETH_MACL4F1PORT_L4SP ((uint32_t)0x0000FFFFU) /* Layer 4 Source Port Number Field */ +#define ETH_MACL4F1PORT_L4DP ((uint32_t)0xFFFF0000U) /* Layer 4 Destination Port Number Field */ + +/** Bit definition for ETH_MACL3F1ADDR0 register **/ +#define ETH_MACL3F1ADDR0_L3A0 ((uint32_t)0xFFFFFFFFU) /* Layer 3 Address 0 Field */ + +/** Bit definition for ETH_MACL3F1ADDR1 register **/ +#define ETH_MACL3F1ADDR1_L3A1 ((uint32_t)0xFFFFFFFFU) /* Layer 3 Address 1 Field */ + +/** Bit definition for ETH_MACL3F1ADDR2 register **/ +#define ETH_MACL3F1ADDR2_L3A2 ((uint32_t)0xFFFFFFFFU) /* Layer 3 Address 2 Field */ + +/** Bit definition for ETH_MACL3F1ADDR3 register **/ +#define ETH_MACL3F1ADDR3_L3A3 ((uint32_t)0xFFFFFFFFU) /* Layer 3 Address 3 Field */ + +/** Bit definition for ETH_MACTSCTRL register **/ +#define ETH_MACTSCTRL_TSENA ((uint32_t)0x00000001U) /* Enable Timestamp */ +#define ETH_MACTSCTRL_TSCFUPDT ((uint32_t)0x00000002U) /* Fine or Coarse Timestamp Update */ +#define ETH_MACTSCTRL_TSINIT ((uint32_t)0x00000004U) /* Initialize Timestamp */ +#define ETH_MACTSCTRL_TSUPDT ((uint32_t)0x00000008U) /* Update Timestamp */ +#define ETH_MACTSCTRL_TSADDREG ((uint32_t)0x00000020U) /* Update Addend Register */ +#define ETH_MACTSCTRL_PTGE ((uint32_t)0x00000040U) /* Presentation Time Generation Enable */ +#define ETH_MACTSCTRL_TSENALL ((uint32_t)0x00000100U) /* Enable Timestamp for All Packets */ +#define ETH_MACTSCTRL_TSCTRLSSR ((uint32_t)0x00000200U) /* Timestamp Digital or Binary Rollover Control */ +#define ETH_MACTSCTRL_TSVER2ENA ((uint32_t)0x00000400U) /* Enable PTP Packet Processing for Version 2 Format */ +#define ETH_MACTSCTRL_TSIPENA ((uint32_t)0x00000800U) /* Enable Processing of PTP over Ethernet Packets */ +#define ETH_MACTSCTRL_TSIPV6ENA ((uint32_t)0x00001000U) /* Enable Processing of PTP Packets Sent over IPv6-UDP */ +#define ETH_MACTSCTRL_TSIPV4ENA ((uint32_t)0x00002000U) /* Enable Processing of PTP Packets Sent over IPv4-UDP */ +#define ETH_MACTSCTRL_TSEVNTENA ((uint32_t)0x00004000U) /* Enable Timestamp Snapshot for Event Messages */ +#define ETH_MACTSCTRL_TSMSTRENA ((uint32_t)0x00008000U) /* Enable Snapshot for Messages Relevant to Master */ +#define ETH_MACTSCTRL_SNAPTYPSEL ((uint32_t)0x00030000U) /* Select PTP packets for Taking Snapshots */ +#define ETH_MACTSCTRL_TSENMACADDR ((uint32_t)0x00040000U) /* Enable MAC Address for PTP Packet Filtering */ +#define ETH_MACTSCTRL_TXTSSTSM ((uint32_t)0x01000000U) /* Transmit Timestamp Status Mode */ +#define ETH_MACTSCTRL_AV8021ASMEN ((uint32_t)0x10000000U) /* AV 802.1AS Mode Enable */ + +/** Bit definition for ETH_MACSUBSINC register **/ +#define ETH_MACSUBSINC_SSINC ((uint32_t)0x00FF0000U) /* Sub-second Increment Value */ + +/** Bit definition for ETH_MACSYSTS register **/ +#define ETH_MACSYSTS_TSS ((uint32_t)0xFFFFFFFFU) /* Timestamp Second */ + +/** Bit definition for ETH_MACSYSTNS register **/ +#define ETH_MACSYSTNS_TSSS ((uint32_t)0x7FFFFFFFU) /* Timestamp Sub Seconds */ + +/** Bit definition for ETH_MACSYSTSUP register **/ +#define ETH_MACSYSTSUP_TSS ((uint32_t)0xFFFFFFFFU) /* Timestamp Seconds */ + +/** Bit definition for ETH_MACSYSTNSUP register **/ +#define ETH_MACSYSTNSUP_TSSS ((uint32_t)0x7FFFFFFFU) /* Timestamp Sub Seconds */ +#define ETH_MACSYSTNSUP_ADDSUB ((uint32_t)0x80000000U) /* Add or Subtract Time */ + +/** Bit definition for ETH_MACTSADD register **/ +#define ETH_MACTSADD_TSAR ((uint32_t)0xFFFFFFFFU) /* Timestamp Addend Register */ + +/** Bit definition for ETH_MACSYSTHWS register **/ +#define ETH_MACSYSTHWS_TSHWR ((uint32_t)0x0000FFFFU) /* Timestamp Higher Word Register */ + +/** Bit definition for ETH_MACTSSTS register **/ +#define ETH_MACTSSTS_TSSOVF ((uint32_t)0x00000001U) /* Timestamp Seconds Overflow */ +#define ETH_MACTSSTS_TSTARGT0 ((uint32_t)0x00000002U) /* Timestamp Target Time Reached */ +#define ETH_MACTSSTS_AUXTSTRIG ((uint32_t)0x00000004U) /* Auxiliary Timestamp Trigger Snapshot */ +#define ETH_MACTSSTS_TSTRGTERR0 ((uint32_t)0x00000008U) /* Timestamp Target Time Error */ +#define ETH_MACTSSTS_TXTSSIS ((uint32_t)0x00008000U) /* Tx Timestamp Status Interrupt Status */ +#define ETH_MACTSSTS_ATSSTN ((uint32_t)0x000F0000U) /* ATSSTN[3:0]: Auxiliary Timestamp Snapshot Trigger Identifier */ +#define ETH_MACTSSTS_ATSSTN_0 ((uint32_t)0x00010000U) /* ATSSTN bit 0 */ +#define ETH_MACTSSTS_ATSSTN_1 ((uint32_t)0x00020000U) /* ATSSTN bit 1 */ +#define ETH_MACTSSTS_ATSSTN_2 ((uint32_t)0x00040000U) /* ATSSTN bit 2 */ +#define ETH_MACTSSTS_ATSSTN_3 ((uint32_t)0x00080000U) /* ATSSTN bit 3 */ +#define ETH_MACTSSTS_ATSSTM ((uint32_t)0x01000000U) /* Auxiliary Timestamp Snapshot Trigger Missed */ +#define ETH_MACTSSTS_ATSNS ((uint32_t)0x3E000000U) /* Number of Auxiliary Timestamp Snapshots */ + +/** Bit definition for ETH_MACTXTSSTSNS register **/ +#define ETH_MACTXTSSTSNS_TXTSSLO ((uint32_t)0x7FFFFFFFU) /* Number of Auxiliary Timestamp Snapshots */ +#define ETH_MACTXTSSTSNS_TXTSSMIS ((uint32_t)0x80000000U) /* Transmit Timestamp Status Missed */ + +/** Bit definition for ETH_MACTXTSSTSS register **/ +#define ETH_MACTXTSSTSS_TXTSSHI ((uint32_t)0xFFFFFFFFU) /* Transmit Timestamp Status High */ + +/** Bit definition for ETH_MACAUXCTRL register **/ +#define ETH_MACAUXCTRL_ATSFC ((uint32_t)0x00000001U) /* Auxiliary Snapshot FIFO Clear */ +#define ETH_MACAUXCTRL_ATSEN0 ((uint32_t)0x00000010U) /* Auxiliary Snapshot 0 Enable */ +#define ETH_MACAUXCTRL_ATSEN1 ((uint32_t)0x00000020U) /* Auxiliary Snapshot 1 Enable */ +#define ETH_MACAUXCTRL_ATSEN2 ((uint32_t)0x00000040U) /* Auxiliary Snapshot 2 Enable */ +#define ETH_MACAUXCTRL_ATSEN3 ((uint32_t)0x00000080U) /* Auxiliary Snapshot 3 Enable */ + +/** Bit definition for ETH_MACAUXTSNS register **/ +#define ETH_MACAUXTSNS_AUXTSLO ((uint32_t)0x7FFFFFFFU) /* Auxiliary Timestamp Nanoseconds */ + +/** Bit definition for ETH_MACAUXTSS register **/ +#define ETH_MACAUXTSS_AUXTSHI ((uint32_t)0xFFFFFFFFU) /* Auxiliary Timestamp Seconds */ + +/** Bit definition for ETH_MACTSIGASYC register **/ +#define ETH_MACTSIGASYC_OSTIAC ((uint32_t)0xFFFFFFFFU) /* One-Step Timestamp Ingress Asymmetry Correction */ + +/** Bit definition for ETH_MACTSEGASYC register **/ +#define ETH_MACTSEGASYC_OSTEAC ((uint32_t)0xFFFFFFFFU) /* One-Step Timestamp Egress Asymmetry Correction */ + +/** Bit definition for ETH_MACTSIGCNS register **/ +#define ETH_MACTSIGCNS_TSIC ((uint32_t)0xFFFFFFFFU) /* Timestamp Ingress Correction */ + +/** Bit definition for ETH_MACTSEGCNS register **/ +#define ETH_MACTSEGCNS_TSEC ((uint32_t)0xFFFFFFFFU) /* Timestamp Egress Correction */ + +/** Bit definition for ETH_MACTSIGLAT register **/ +#define ETH_MACTSIGLAT_ITLSNS ((uint32_t)0x0000FF00U) /* Ingress Timestamp Latency, in sub-nanoseconds */ +#define ETH_MACTSIGLAT_ITLNS ((uint32_t)0x0FFF0000U) /* Ingress Timestamp Latency, in nanoseconds */ + +/** Bit definition for ETH_MACTSEGLAT register **/ +#define ETH_MACTSEGLAT_ETLSNS ((uint32_t)0x0000FF00U) /* Egress Timestamp Latency, in sub-nanoseconds */ +#define ETH_MACTSEGLAT_ETLNS ((uint32_t)0x0FFF0000U) /* Egress Timestamp Latency, in nanoseconds */ + +/** Bit definition for ETH_MACPPSCTRL register **/ +#define ETH_MACPPSCTRL_PPSCTRL ((uint32_t)0x0000000FU) /* PPSCTRL[3:0]: PPS Output Frequency Control */ +#define ETH_MACPPSCTRL_PPSCTRL_0 ((uint32_t)0x00000001U) /* PPSCTRL bit 0 */ +#define ETH_MACPPSCTRL_PPSCTRL_1 ((uint32_t)0x00000002U) /* PPSCTRL bit 1 */ +#define ETH_MACPPSCTRL_PPSCTRL_2 ((uint32_t)0x00000004U) /* PPSCTRL bit 2 */ +#define ETH_MACPPSCTRL_PPSCTRL_3 ((uint32_t)0x00000008U) /* PPSCTRL bit 3 */ +#define ETH_MACPPSCTRL_PPSCMD ((uint32_t)0x0000000FU) /* PPSCMD[3:0]: Flexible PPS Output (ptp_pps_o [0]) Control, Presentation Time Control */ +#define ETH_MACPPSCTRL_PPSCMD_0 ((uint32_t)0x00000001U) /* PPSCMD bit 0 */ +#define ETH_MACPPSCTRL_PPSCMD_1 ((uint32_t)0x00000002U) /* PPSCMD bit 1 */ +#define ETH_MACPPSCTRL_PPSCMD_2 ((uint32_t)0x00000004U) /* PPSCMD bit 2 */ +#define ETH_MACPPSCTRL_PPSCMD_3 ((uint32_t)0x00000008U) /* PPSCMD bit 3 */ +#define ETH_MACPPSCTRL_PPSEN0 ((uint32_t)0x00000010U) /* Flexible PPS Output Mode Enable */ +#define ETH_MACPPSCTRL_TRGTMODSEL0 ((uint32_t)0x00000060U) /* TRGTMODSEL0[3:0]: Target Time Register Mode for PPS0 Output */ +#define ETH_MACPPSCTRL_TRGTMODSEL0_0 ((uint32_t)0x00000020U) /* TRGTMODSEL0 bit 0 */ +#define ETH_MACPPSCTRL_TRGTMODSEL0_1 ((uint32_t)0x00000040U) /* TRGTMODSEL0 bit 1 */ +#define ETH_MACPPSCTRL_MCGREN0 ((uint32_t)0x00000080U) /* MCGR Mode Enable for PPS0 Output */ +#define ETH_MACPPSCTRL_TIMESEL ((uint32_t)0x10000000U) /* Time Select */ + +/** Bit definition for ETH_MACPPSTTS register **/ +#define ETH_MACPPSTTS_TSTRH0 ((uint32_t)0xFFFFFFFFU) /* PPS Target Time Seconds Register */ + +/** Bit definition for ETH_MACPPSTTNS register **/ +#define ETH_MACPPSTTNS_TTSL0 ((uint32_t)0x7FFFFFFFU) /* Target Time Low for PPS Register */ +#define ETH_MACPPSTTNS_TRGTBUSY0 ((uint32_t)0x80000000U) /* PPS Target Time Register Busy */ + +/** Bit definition for ETH_MACPPSINTE register **/ +#define ETH_MACPPSINTE_PPSINT0 ((uint32_t)0xFFFFFFFFU) /* PPS Output Signal Interval */ + +/** Bit definition for ETH_MACPPSWID register **/ +#define ETH_MACPPSWID_PPSWIDTH0 ((uint32_t)0xFFFFFFFFU) /* PPS Output Signal Width */ + +/** Bit definition for ETH_MACPTOCTRL register **/ +#define ETH_MACPTOCTRL_PTOEN ((uint32_t)0x00000001U) /* PTP Offload Enable */ +#define ETH_MACPTOCTRL_ASYNCEN ((uint32_t)0x00000002U) /* Automatic PTP SYNC message Enable */ +#define ETH_MACPTOCTRL_APDREQEN ((uint32_t)0x00000004U) /* Automatic PTP Pdelay_Req message Enable */ +#define ETH_MACPTOCTRL_ASYNCTRIG ((uint32_t)0x00000010U) /* Automatic PTP SYNC message Trigger */ +#define ETH_MACPTOCTRL_APDREQTRIG ((uint32_t)0x00000020U) /* Automatic PTP Pdelay_Req message Trigger */ +#define ETH_MACPTOCTRL_DRRDIS ((uint32_t)0x00000040U) /* Disable PTO Delay Request/Response response generation */ +#define ETH_MACPTOCTRL_PDRDIS ((uint32_t)0x00000080U) /* Disable Peer Delay Response response generation */ +#define ETH_MACPTOCTRL_DN ((uint32_t)0x0000FF00U) /* Domain Number */ + +/** Bit definition for ETH_MACSRCPID0 register **/ +#define ETH_MACSRCPID0_SPI0 ((uint32_t)0xFFFFFFFFU) /* Source Port Identity 0 */ + +/** Bit definition for ETH_MACSRCPID1 register **/ +#define ETH_MACSRCPID1_SPI1 ((uint32_t)0xFFFFFFFFU) /* Source Port Identity 1 */ + +/** Bit definition for ETH_MACSRCPID2 register **/ +#define ETH_MACSRCPID2_SPI2 ((uint32_t)0x0000FFFFU) /* Source Port Identity 2 */ + +/** Bit definition for ETH_MACLOGMINTE register **/ +#define ETH_MACLOGMINTE_LSI ((uint32_t)0x000000FFU) /* Log Sync Interval */ +#define ETH_MACLOGMINTE_DRSYNCR ((uint32_t)0x00000700U) /* DRSYNCR[2:0]: Delay_Req to SYNC Ratio */ +#define ETH_MACLOGMINTE_DRSYNCR_0 ((uint32_t)0x00000100U) /* DRSYNCR bit 0 */ +#define ETH_MACLOGMINTE_DRSYNCR_1 ((uint32_t)0x00000200U) /* DRSYNCR bit 1 */ +#define ETH_MACLOGMINTE_DRSYNCR_2 ((uint32_t)0x00000400U) /* DRSYNCR bit 2 */ +#define ETH_MACLOGMINTE_LMPDRI ((uint32_t)0xFF000000U) /* Log Min Pdelay_Req Interval */ + + +/*** Ethernet MTL ***/ + +/** Bit definition for ETH_MTLOPMOD register **/ +#define ETH_MTLOPMOD_DTXSTS ((uint32_t)0x00000002U) /* Drop Transmit Status */ +#define ETH_MTLOPMOD_CNTPRST ((uint32_t)0x00000100U) /* Counters Preset */ +#define ETH_MTLOPMOD_CNTCLR ((uint32_t)0x00000200U) /* Counters Reset */ + +/** Bit definition for ETH_MTLINTSTS register **/ +#define ETH_MTLINTSTS_Q0IS ((uint32_t)0x00000001U) /* Queue 0 Interrupt status */ + + +/*** Ethernet MTL Queue ***/ + +/** Bit definition for ETH_MTLTXQOPMOD register **/ +#define ETH_MTLTXQOPMOD_FTQ ((uint32_t)0x00000001U) /* Flush Transmit Queue */ +#define ETH_MTLTXQOPMOD_TSF ((uint32_t)0x00000002U) /* Transmit Store and Forward */ +#define ETH_MTLTXQOPMOD_TTC ((uint32_t)0x00000070U) /* TTC[2:0]: Transmit Threshold Control */ +#define ETH_MTLTXQOPMOD_TTC_0 ((uint32_t)0x00000010U) /* TTC bit 0 */ +#define ETH_MTLTXQOPMOD_TTC_1 ((uint32_t)0x00000020U) /* TTC bit 1 */ +#define ETH_MTLTXQOPMOD_TTC_2 ((uint32_t)0x00000040U) /* TTC bit 2 */ + +/** Bit definition for ETH_MTLTXQUDF register **/ +#define ETH_MTLTXQUDF_UFFRMCNT ((uint32_t)0x000007FFU) /* Underflow Packet Counter */ +#define ETH_MTLTXQUDF_UFCNTOVF ((uint32_t)0x00000800U) /* Overflow Bit for Underflow Packet Counter */ + +/** Bit definition for ETH_MTLTXQDBG register **/ +#define ETH_MTLTXQDBG_TXQPAUSED ((uint32_t)0x00000001U) /* Transmit Queue in Pause */ +#define ETH_MTLTXQDBG_TRCSTS ((uint32_t)0x00000006U) /* TRCSTS[1:0]: MTL Tx Queue Read Controller Status */ +#define ETH_MTLTXQDBG_TRCSTS_0 ((uint32_t)0x00000002U) /* TRCSTS bit 0 */ +#define ETH_MTLTXQDBG_TRCSTS_1 ((uint32_t)0x00000004U) /* TRCSTS bit 1 */ +#define ETH_MTLTXQDBG_TWCSTS ((uint32_t)0x00000008U) /* MTL Tx Queue Write Controller Status */ +#define ETH_MTLTXQDBG_TXQSTS ((uint32_t)0x00000010U) /* MTL Tx Queue Not Empty Status */ +#define ETH_MTLTXQDBG_TXSTSFSTS ((uint32_t)0x00000020U) /* MTL Tx Status FIFO Full Status */ +#define ETH_MTLTXQDBG_PTXQ ((uint32_t)0x00070000U) /* Number of Packets in the Transmit Queue */ +#define ETH_MTLTXQDBG_STXSTSF ((uint32_t)0x00700000U) /* Number of Status Words in Tx Status FIFO of Queue */ + +/** Bit definition for ETH_MTLQINTCTRLSTS register **/ +#define ETH_MTLQINTCTRLSTS_TXUNFIS ((uint32_t)0x00000001U) /* Transmit Queue Underflow Interrupt Status */ +#define ETH_MTLQINTCTRLSTS_TXUIE ((uint32_t)0x00000100U) /* Transmit Queue Underflow Interrupt Enable */ +#define ETH_MTLQINTCTRLSTS_RXOVFIS ((uint32_t)0x00010000U) /* Receive Queue Overflow Interrupt Status */ +#define ETH_MTLQINTCTRLSTS_RXOIE ((uint32_t)0x01000000U) /* Receive Queue Overflow Interrupt Enable */ + +/** Bit definition for ETH_MTLRXQOPMOD register **/ +#define ETH_MTLRXQOPMOD_RTC ((uint32_t)0x00000003U) /* RTC[1:0]: Receive Queue Threshold Control */ +#define ETH_MTLRXQOPMOD_RTC_0 ((uint32_t)0x00000001U) /* RTC bit 0 */ +#define ETH_MTLRXQOPMOD_RTC_1 ((uint32_t)0x00000002U) /* RTC bit 1 */ +#define ETH_MTLRXQOPMOD_FUP ((uint32_t)0x00000008U) /* Forward Undersized Good Packets */ +#define ETH_MTLRXQOPMOD_FEP ((uint32_t)0x00000010U) /* Forward Error Packets */ +#define ETH_MTLRXQOPMOD_RSF ((uint32_t)0x00000020U) /* Receive Queue Store and Forward */ +#define ETH_MTLRXQOPMOD_DISTCPEF ((uint32_t)0x00000040U) /* Disable Dropping of TCP/IP Checksum Error Packets */ + +/** Bit definition for ETH_MTLRXQMPOFCNT register **/ +#define ETH_MTLRXQMPOFCNT_OVFPKTCNT ((uint32_t)0x000007FFU) /* Overflow Packet Counter */ +#define ETH_MTLRXQMPOFCNT_OVFCNTOVF ((uint32_t)0x00000800U) /* Overflow Counter Overflow Bit */ +#define ETH_MTLRXQMPOFCNT_MISPKTCNT ((uint32_t)0x07FF0000U) /* Missed Packet Counter */ +#define ETH_MTLRXQMPOFCNT_MISCNTOVF ((uint32_t)0x08000000U) /* Missed Packet Counter Overflow Bit */ + +/** Bit definition for ETH_MTLRXQDBG register **/ +#define ETH_MTLRXQDBG_RWCSTS ((uint32_t)0x00000001U) /* MTL Rx Queue Write Controller Active Status */ +#define ETH_MTLRXQDBG_RRCSTS ((uint32_t)0x00000006U) /* RRCSTS[1:0]: MTL Rx Queue Read Controller State */ +#define ETH_MTLRXQDBG_RRCSTS_0 ((uint32_t)0x00000002U) /* RRCSTS bit 0 */ +#define ETH_MTLRXQDBG_RRCSTS_1 ((uint32_t)0x00000004U) /* RRCSTS bit 1 */ +#define ETH_MTLRXQDBG_RXQSTS ((uint32_t)0x00000030U) /* RXQSTS[1:0]: MTL Rx Queue Fill-Level Status */ +#define ETH_MTLRXQDBG_RXQSTS_0 ((uint32_t)0x00000010U) /* RXQSTS bit 0 */ +#define ETH_MTLRXQDBG_RXQSTS_1 ((uint32_t)0x00000020U) /* RXQSTS bit 1 */ +#define ETH_MTLRXQDBG_PRXQ ((uint32_t)0x3FFF0000U) /* Number of Packets in Receive Queue */ + + +/*** Ethernet DMA ***/ + +/** Bit definition for ETH_DMAMODE register **/ +#define ETH_DMAMODE_SWR ((uint32_t)0x00000001U) /* Software Reset */ +#define ETH_DMAMODE_DA ((uint32_t)0x00000002U) /* DMA Tx or Rx Arbitration Scheme */ +#define ETH_DMAMODE_TXPR ((uint32_t)0x00000800U) /* Transmit Priority */ +#define ETH_DMAMODE_PR ((uint32_t)0x00007000U) /* PR[2:0]: Priority Ratio */ +#define ETH_DMAMODE_PR_0 ((uint32_t)0x00001000U) /* PR bit 0 */ +#define ETH_DMAMODE_PR_1 ((uint32_t)0x00002000U) /* PR bit 1 */ +#define ETH_DMAMODE_PR_2 ((uint32_t)0x00004000U) /* PR bit 2 */ +#define ETH_DMAMODE_INTM ((uint32_t)0x00030000U) /* INTM[1:0]: Interrupt Mode */ +#define ETH_DMAMODE_INTM_0 ((uint32_t)0x00010000U) /* INTM bit 0 */ +#define ETH_DMAMODE_INTM_1 ((uint32_t)0x00020000U) /* INTM bit 1 */ +#define ETH_DMAMODE_DCHE ((uint32_t)0x00080000U) /* Descriptor Cache Enable */ +#define ETH_DMAMODE_TNDF ((uint32_t)0x00300000U) /* TNDF[1:0]: Tx DMA鈥檚 Maximum Number of Descriptors to be fetched in a burst */ +#define ETH_DMAMODE_TNDF_0 ((uint32_t)0x00100000U) /* TNDF bit 0 */ +#define ETH_DMAMODE_TNDF_1 ((uint32_t)0x00200000U) /* TNDF bit 1 */ +#define ETH_DMAMODE_RNDF ((uint32_t)0x00C00000U) /* RNDF[1:0]: Rx DMA鈥檚 Maximum Number of Descriptors to be fetched in a burst */ +#define ETH_DMAMODE_RNDF_0 ((uint32_t)0x00400000U) /* RNDF bit 0 */ +#define ETH_DMAMODE_RNDF_1 ((uint32_t)0x00800000U) /* RNDF bit 1 */ + +/** Bit definition for ETH_DMASBMODE register **/ +#define ETH_DMASBMODE_FB ((uint32_t)0x00000001U) /* Fixed Burst Length */ +#define ETH_DMASBMODE_AAL ((uint32_t)0x00001000U) /* Address-Aligned Beats */ +#define ETH_DMASBMODE_MB ((uint32_t)0x00004000U) /* Mixed Burst */ +#define ETH_DMASBMODE_RB ((uint32_t)0x00008000U) /* Rebuild INCRx Burst */ + +/** Bit definition for ETH_DMAINTSTS register **/ +#define ETH_DMAINTSTS_DC0IS ((uint32_t)0x00000001U) /* DMA Channel 0 Interrupt Status */ +#define ETH_DMAINTSTS_MTLIS ((uint32_t)0x00010000U) /* MTL Interrupt Status */ +#define ETH_DMAINTSTS_MACIS ((uint32_t)0x00020000U) /* MAC Interrupt Status */ + +/** Bit definition for ETH_DMADBGSTS register **/ +#define ETH_DMADBGSTS_AHBMS ((uint32_t)0x00000001U) /* AHB Master Status */ +#define ETH_DMADBGSTS_RPS0 ((uint32_t)0x00000F00U) /* RPS0[3:0]: DMA Channel 0 Receive Process State */ +#define ETH_DMADBGSTS_RPS0_0 ((uint32_t)0x00000100U) /* RPS0 bit 0 */ +#define ETH_DMADBGSTS_RPS0_1 ((uint32_t)0x00000200U) /* RPS0 bit 1 */ +#define ETH_DMADBGSTS_RPS0_2 ((uint32_t)0x00000400U) /* RPS0 bit 2 */ +#define ETH_DMADBGSTS_RPS0_3 ((uint32_t)0x00000800U) /* RPS0 bit 3 */ +#define ETH_DMADBGSTS_TPS0 ((uint32_t)0x0000F000U) /* TPS0[3:0]: DMA Channel 0 Transmit Process State */ +#define ETH_DMADBGSTS_TPS0_0 ((uint32_t)0x00001000U) /* TPS0 bit 0 */ +#define ETH_DMADBGSTS_TPS0_1 ((uint32_t)0x00002000U) /* TPS0 bit 1 */ +#define ETH_DMADBGSTS_TPS0_2 ((uint32_t)0x00004000U) /* TPS0 bit 2 */ +#define ETH_DMADBGSTS_TPS0_3 ((uint32_t)0x00008000U) /* TPS0 bit 3 */ + + +/*** Ethernet DMA Channel 0 ***/ + +/** Bit definition for ETH_DMACH0CTRL register **/ +#define ETH_DMACH0CTRL_MSS ((uint32_t)0x00003FFFU) /* Maximum Segment Size */ +#define ETH_DMACH0CTRL_PBLx8 ((uint32_t)0x00010000U) /* 8xPBL mode */ +#define ETH_DMACH0CTRL_DSL ((uint32_t)0x001C0000U) /* DSL[2:0]: Descriptor Skip Length */ +#define ETH_DMACH0CTRL_DSL_0 ((uint32_t)0x00040000U) /* DSL bit 0 */ +#define ETH_DMACH0CTRL_DSL_1 ((uint32_t)0x00080000U) /* DSL bit 1 */ +#define ETH_DMACH0CTRL_DSL_2 ((uint32_t)0x00100000U) /* DSL bit 2 */ + +/** Bit definition for ETH_DMACH0TXCTRL register **/ +#define ETH_DMACH0TXCTRL_ST ((uint32_t)0x00000001U) /* Start or Stop Transmission Command */ +#define ETH_DMACH0TXCTRL_OSF ((uint32_t)0x00000010U) /* Operate on Second Packet */ +#define ETH_DMACH0TXCTRL_TSE ((uint32_t)0x00001000U) /* TCP Segmentation Enabled */ +#define ETH_DMACH0TXCTRL_TxPBL ((uint32_t)0x003F0000U) /* TxPBL[5:0]: Transmit Programmable Burst Length */ +#define ETH_DMACH0TXCTRL_TxPBL_0 ((uint32_t)0x00010000U) /* TxPBL bit 0 */ +#define ETH_DMACH0TXCTRL_TxPBL_1 ((uint32_t)0x00020000U) /* TxPBL bit 1 */ +#define ETH_DMACH0TXCTRL_TxPBL_2 ((uint32_t)0x00040000U) /* TxPBL bit 2 */ +#define ETH_DMACH0TXCTRL_TxPBL_3 ((uint32_t)0x00080000U) /* TxPBL bit 3 */ +#define ETH_DMACH0TXCTRL_TxPBL_4 ((uint32_t)0x00100000U) /* TxPBL bit 4 */ +#define ETH_DMACH0TXCTRL_TxPBL_5 ((uint32_t)0x00200000U) /* TxPBL bit 5 */ +#define ETH_DMACH0TXCTRL_ETIC ((uint32_t)0x00400000U) /* Early Transmit Interrupt Control */ + +/** Bit definition for ETH_DMACH0RXCTRL register **/ +#define ETH_DMACH0RXCTRL_SR ((uint32_t)0x00000001U) /* Start or Stop Receive Command */ +#define ETH_DMACH0RXCTRL_RBSZL ((uint32_t)0x00000006U) /* Receive Buffer size Low */ +#define ETH_DMACH0RXCTRL_RBSZH ((uint32_t)0x00007FF8U) /* Receive Buffer size High */ +#define ETH_DMACH0RXCTRL_RxPBL ((uint32_t)0x003F0000U) /* RxPBL[5:0]: Receive Programmable Burst Length */ +#define ETH_DMACH0RXCTRL_RxPBL_0 ((uint32_t)0x00010000U) /* RxPBL bit 0 */ +#define ETH_DMACH0RXCTRL_RxPBL_1 ((uint32_t)0x00020000U) /* RxPBL bit 1 */ +#define ETH_DMACH0RXCTRL_RxPBL_2 ((uint32_t)0x00040000U) /* RxPBL bit 2 */ +#define ETH_DMACH0RXCTRL_RxPBL_3 ((uint32_t)0x00080000U) /* RxPBL bit 3 */ +#define ETH_DMACH0RXCTRL_RxPBL_4 ((uint32_t)0x00100000U) /* RxPBL bit 4 */ +#define ETH_DMACH0RXCTRL_RxPBL_5 ((uint32_t)0x00200000U) /* RxPBL bit 5 */ +#define ETH_DMACH0RXCTRL_ERIC ((uint32_t)0x00400000U) /* Early Receive Interrupt Control */ +#define ETH_DMACH0RXCTRL_RPF ((uint32_t)0x80000000U) /* Rx Packet Flush */ + +/** Bit definition for ETH_DMACH0TXDLA register **/ +#define ETH_DMACH0TXDLA_TDESLA ((uint32_t)0xFFFFFFFCU) /* Start of Transmit List */ + +/** Bit definition for ETH_DMACH0RXDLA register **/ +#define ETH_DMACH0RXDLA_RDESLA ((uint32_t)0xFFFFFFFCU) /* Start of Receive List */ + +/** Bit definition for ETH_DMACH0TXDTP register **/ +#define ETH_DMACH0TXDTP_TDTP ((uint32_t)0xFFFFFFFCU) /* Transmit Descriptor Tail Pointer */ + +/** Bit definition for ETH_DMACH0RXDTP register **/ +#define ETH_DMACH0RXDTP_RDTP ((uint32_t)0xFFFFFFFCU) /* Receive Descriptor Tail Pointer */ + +/** Bit definition for ETH_DMACH0TXDRLEN register **/ +#define ETH_DMACH0TXDRLEN_TDRL ((uint32_t)0x000003FFU) /* Transmit Descriptor Ring Length */ + +/** Bit definition for ETH_DMACH0RXCTRL2 register **/ +#define ETH_DMACH0RXCTRL2_RDRL ((uint32_t)0x000003FFU) /* Receive Descriptor Ring Length */ +#define ETH_DMACH0RXCTRL2_ARBS ((uint32_t)0x00FF0000U) /* Alternate Receive Buffer Size */ + +/** Bit definition for ETH_DMACH0INTEN register **/ +#define ETH_DMACH0INTEN_TIE ((uint32_t)0x00000001U) /* Transmit Interrupt Enable */ +#define ETH_DMACH0INTEN_TXSE ((uint32_t)0x00000002U) /* Transmit Stopped Enable */ +#define ETH_DMACH0INTEN_TBUE ((uint32_t)0x00000004U) /* Transmit Buffer Unavailable Enable */ +#define ETH_DMACH0INTEN_RIE ((uint32_t)0x00000040U) /* Receive Interrupt Enable */ +#define ETH_DMACH0INTEN_RBUE ((uint32_t)0x00000080U) /* Receive Buffer Unavailable Enable */ +#define ETH_DMACH0INTEN_RSE ((uint32_t)0x00000100U) /* Receive Stopped Enable */ +#define ETH_DMACH0INTEN_RWTE ((uint32_t)0x00000200U) /* Receive Watchdog Timeout Enable */ +#define ETH_DMACH0INTEN_ETIE ((uint32_t)0x00000400U) /* Early Transmit Interrupt Enable */ +#define ETH_DMACH0INTEN_ERIE ((uint32_t)0x00000800U) /* Early Receive Interrupt Enable */ +#define ETH_DMACH0INTEN_FBEE ((uint32_t)0x00001000U) /* Fatal Bus Error Enable */ +#define ETH_DMACH0INTEN_CDEE ((uint32_t)0x00002000U) /* Context Descriptor Error Enable */ +#define ETH_DMACH0INTEN_AIE ((uint32_t)0x00004000U) /* Abnormal Interrupt Summary Enable */ +#define ETH_DMACH0INTEN_NIE ((uint32_t)0x00008000U) /* Normal Interrupt Summary Enable */ + +/** Bit definition for ETH_DMACH0RXINTWT register **/ +#define ETH_DMACH0RXINTWT_RWT ((uint32_t)0x000000FFU) /* Receive Interrupt Watchdog Timer Count */ +#define ETH_DMACH0RXINTWT_RWTU ((uint32_t)0x00030000U) /* RWTU[1:0]: Receive Interrupt Watchdog Timer \ + Count Units */ +#define ETH_DMACH0RXINTWT_RWTU_0 ((uint32_t)0x00010000U) /* RWTU bit 0 */ +#define ETH_DMACH0RXINTWT_RWTU_1 ((uint32_t)0x00020000U) /* RWTU bit 1 */ + +/** Bit definition for ETH_DMACH0CATXD register **/ +#define ETH_DMACH0CATXD_CURTDESAPTR ((uint32_t)0xFFFFFFFFU) /* Application Transmit Descriptor Address Pointer */ + +/** Bit definition for ETH_DMACH0CARXD register **/ +#define ETH_DMACH0CARXD_CURRDESAPTR ((uint32_t)0xFFFFFFFFU) /* Application Receive Descriptor Address Pointer */ + +/** Bit definition for ETH_DMACH0CATXB register **/ +#define ETH_DMACH0CATXB_CURTBUFAPTR ((uint32_t)0xFFFFFFFFU) /* Application Transmit Buffer Address Pointer */ + +/** Bit definition for ETH_DMACH0CARXB register **/ +#define ETH_DMACH0CARXB_CURRBUFAPTR ((uint32_t)0xFFFFFFFFU) /* Application Receive Buffer Address Pointer */ + +/** Bit definition for ETH_DMACH0STS register **/ +#define ETH_DMACH0STS_TI ((uint32_t)0x00000001U) /* Transmit Interrupt */ +#define ETH_DMACH0STS_TPS ((uint32_t)0x00000002U) /* Transmit Process Stopped */ +#define ETH_DMACH0STS_TBU ((uint32_t)0x00000004U) /* Transmit Buffer Unavailable */ +#define ETH_DMACH0STS_RI ((uint32_t)0x00000040U) /* Receive Interrupt */ +#define ETH_DMACH0STS_RBU ((uint32_t)0x00000080U) /* Receive Buffer Unavailable */ +#define ETH_DMACH0STS_RPS ((uint32_t)0x00000100U) /* Receive Process Stopped */ +#define ETH_DMACH0STS_RWT ((uint32_t)0x00000200U) /* Receive Watchdog Timeout */ +#define ETH_DMACH0STS_ETI ((uint32_t)0x00000400U) /* Early Transmit Interrupt */ +#define ETH_DMACH0STS_ERI ((uint32_t)0x00000800U) /* Early Receive Interrupt */ +#define ETH_DMACH0STS_FBE ((uint32_t)0x00001000U) /* Fatal Bus Error */ +#define ETH_DMACH0STS_CDE ((uint32_t)0x00002000U) /* Context Descriptor Error */ +#define ETH_DMACH0STS_AIS ((uint32_t)0x00004000U) /* Abnormal Interrupt Summary */ +#define ETH_DMACH0STS_NIS ((uint32_t)0x00008000U) /* Normal Interrupt Summary */ +#define ETH_DMACH0STS_TEB ((uint32_t)0x00070000U) /* TEB[2:0]: Tx DMA Error Bits */ +#define ETH_DMACH0STS_TEB_0 ((uint32_t)0x00010000U) /* TEB bit 0 */ +#define ETH_DMACH0STS_TEB_1 ((uint32_t)0x00020000U) /* TEB bit 1 */ +#define ETH_DMACH0STS_TEB_2 ((uint32_t)0x00040000U) /* TEB bit 2 */ +#define ETH_DMACH0STS_REB ((uint32_t)0x00380000U) /* REB[2:0]: Rx DMA Error Bits */ +#define ETH_DMACH0STS_REB_0 ((uint32_t)0x00080000U) /* REB bit 0 */ +#define ETH_DMACH0STS_REB_1 ((uint32_t)0x00100000U) /* REB bit 1 */ +#define ETH_DMACH0STS_REB_2 ((uint32_t)0x00200000U) /* REB bit 2 */ + +/** Bit definition for ETH_DMACH0DPCNT register **/ +#define ETH_DMACH0DPCNT_DPC ((uint32_t)0x000007FFU) /* Dropped Packet Counters */ +#define ETH_DMACH0DPCNT_DPCO ((uint32_t)0x00008000U) /* Overflow status of the DPC Counter */ + +/** Bit definition for ETH_DMACH0RXERICNT register **/ +#define ETH_DMACH0RXERICNT_ECNT ((uint32_t)0x00000FFFU) /* ERI Counter */ + + +/*** DMA Controller on AHB Bus (DMA1,DMA2,DMA3) ***/ + +/** Bit definition for DMA_CHNSA register **/ +#define DMA_CHNSA_ADDR ((uint32_t)0xFFFFFFFFU) /* Current Source Address of DMA transfer */ + +/** Bit definition for DMA_CHNDA register **/ +#define DMA_CHNDA_ADDR ((uint32_t)0xFFFFFFFFU) /* Current Destination Address of DMA transfer */ + +/** Bit definition for DMA_CHNLLP register **/ +#define DMA_CHNLLP_LOC ((uint32_t)0xFFFFFFFCU) /* Starting Address In Memory of next LLI if block chaining is enabled */ +#define DMA_CHNLLP_LMS ((uint32_t)0x00000003U) /* LMS[1:0] bits (List Master Select) */ +#define DMA_CHNLLP_LMS_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define DMA_CHNLLP_LMS_1 ((uint32_t)0x00000002U) /* Bit 1 */ + +/** Bit definition for DMA_CHNCTRL register **/ +#define DMA_CHNCTRL_DONE ((uint64_t)0x100000000000U) /* Done bit */ +#define DMA_CHNCTRL_BTS ((uint64_t)0x0FFF00000000U) /* Block Transfer Size */ +#define DMA_CHNCTRL_LLPSRCEN ((uint64_t)0x000010000000U) /* Linked List Pointer for Source Enable */ +#define DMA_CHNCTRL_LLPDSTEN ((uint64_t)0x000008000000U) /* Linked List Pointer for Destination Enable */ +#define DMA_CHNCTRL_SMS ((uint64_t)0x000006000000U) /* Source Master Select */ +#define DMA_CHNCTRL_SMS_1 ((uint64_t)0x000004000000U) /* Bit 1 */ +#define DMA_CHNCTRL_SMS_0 ((uint64_t)0x000002000000U) /* Bit 0 */ +#define DMA_CHNCTRL_DMS ((uint64_t)0x000001800000U) /* Destination Master Select */ +#define DMA_CHNCTRL_DMS_1 ((uint64_t)0x000001000000U) /* Bit 1 */ +#define DMA_CHNCTRL_DMS_0 ((uint64_t)0x000000800000U) /* Bit 0 */ +#define DMA_CHNCTRL_TTFC ((uint64_t)0x000000700000U) /* Transfer Type and Flow Control */ +#define DMA_CHNCTRL_TTFC_2 ((uint64_t)0x000000400000U) /* Bit 2 */ +#define DMA_CHNCTRL_TTFC_1 ((uint64_t)0x000000200000U) /* Bit 1 */ +#define DMA_CHNCTRL_TTFC_0 ((uint64_t)0x000000100000U) /* Bit 0 */ +#define DMA_CHNCTRL_DSTSCAEN ((uint64_t)0x000000040000U) /* Destination scatter enable */ +#define DMA_CHNCTRL_SRCGATEN ((uint64_t)0x000000020000U) /* Source gather enable */ +#define DMA_CHNCTRL_SRCMSIZE ((uint64_t)0x00000001C000U) /* Source Burst Transaction Length */ +#define DMA_CHNCTRL_SRCMSIZE_2 ((uint64_t)0x000000010000U) /* Bit 2 */ +#define DMA_CHNCTRL_SRCMSIZE_1 ((uint64_t)0x000000008000U) /* Bit 1 */ +#define DMA_CHNCTRL_SRCMSIZE_0 ((uint64_t)0x000000004000U) /* Bit 0 */ +#define DMA_CHNCTRL_DSTMSIZE ((uint64_t)0x000000003800U) /* Destination Burst Transaction Length */ +#define DMA_CHNCTRL_DSTMSIZE_2 ((uint64_t)0x000000002000U) /* Bit 2 */ +#define DMA_CHNCTRL_DSTMSIZE_1 ((uint64_t)0x000000001000U) /* Bit 1 */ +#define DMA_CHNCTRL_DSTMSIZE_0 ((uint64_t)0x000000000800U) /* Bit 0 */ +#define DMA_CHNCTRL_SINC ((uint64_t)0x000000000600U) /* Source Address Increment */ +#define DMA_CHNCTRL_SINC_1 ((uint64_t)0x000000000400U) /* Bit 1 */ +#define DMA_CHNCTRL_SINC_0 ((uint64_t)0x000000000200U) /* Bit 0 */ +#define DMA_CHNCTRL_DINC ((uint64_t)0x000000000180U) /* Destination Address Increment */ +#define DMA_CHNCTRL_DINC_1 ((uint64_t)0x000000000100U) /* Bit 1 */ +#define DMA_CHNCTRL_DINC_0 ((uint64_t)0x000000000080U) /* Bit 0 */ +#define DMA_CHNCTRL_STW ((uint64_t)0x000000000070U) /* Source Transfer Width */ +#define DMA_CHNCTRL_STW_2 ((uint64_t)0x000000000040U) /* Bit 2 */ +#define DMA_CHNCTRL_STW_1 ((uint64_t)0x000000000020U) /* Bit 1 */ +#define DMA_CHNCTRL_STW_0 ((uint64_t)0x000000000010U) /* Bit 0 */ +#define DMA_CHNCTRL_DTW ((uint64_t)0x00000000000EU) /* Destination Transfer Width */ +#define DMA_CHNCTRL_DTW_2 ((uint64_t)0x000000000008U) /* Bit 2 */ +#define DMA_CHNCTRL_DTW_1 ((uint64_t)0x000000000004U) /* Bit 1 */ +#define DMA_CHNCTRL_DTW_0 ((uint64_t)0x000000000002U) /* Bit 0 */ +#define DMA_CHNCTRL_INTEN ((uint64_t)0x000000000001U) /* Interrupt Enable Bit */ + +/** Bit definition for DMA_CHNCFG register **/ +#define DMA_CHNCFG_DSTPER ((uint64_t)0x380000000000U) /* Destination Peripheral hardware interface */ +#define DMA_CHNCFG_DSTPER_2 ((uint64_t)0x200000000000U) /* Bit 2 */ +#define DMA_CHNCFG_DSTPER_1 ((uint64_t)0x100000000000U) /* Bit 1 */ +#define DMA_CHNCFG_DSTPER_0 ((uint64_t)0x080000000000U) /* Bit 0 */ +#define DMA_CHNCFG_SRCPER ((uint64_t)0x038000000000U) /* Source Peripheral hardware interface */ +#define DMA_CHNCFG_SRCPER_2 ((uint64_t)0x020000000000U) /* Bit 2 */ +#define DMA_CHNCFG_SRCPER_1 ((uint64_t)0x010000000000U) /* Bit 1 */ +#define DMA_CHNCFG_SRCPER_0 ((uint64_t)0x008000000000U) /* Bit 0 */ +#define DMA_CHNCFG_PROTCTL ((uint64_t)0x001C00000000U) /* Protection Control */ +#define DMA_CHNCFG_PROTCTL_2 ((uint64_t)0x001000000000U) /* Bit 2 */ +#define DMA_CHNCFG_PROTCTL_1 ((uint64_t)0x000800000000U) /* Bit 1 */ +#define DMA_CHNCFG_PROTCTL_0 ((uint64_t)0x000400000000U) /* Bit 0 */ +#define DMA_CHNCFG_FIFOMS ((uint64_t)0x000200000000U) /* FIFO Mode Select */ +#define DMA_CHNCFG_FCM ((uint64_t)0x000100000000U) /* Flow Control Mode */ +#define DMA_CHNCFG_ADR ((uint64_t)0x000080000000U) /* Automatic Destination Reload */ +#define DMA_CHNCFG_ASR ((uint64_t)0x000040000000U) /* Automatic Source Reload */ +#define DMA_CHNCFG_MAMBABL ((uint64_t)0x00003FF00000U) /* Maximum AMBA Burst Length */ +#define DMA_CHNCFG_SRCHSPOL ((uint64_t)0x000000080000U) /* Source Handshaking Interface Polarity */ +#define DMA_CHNCFG_DSTHSPOL ((uint64_t)0x000000040000U) /* Destination Handshaking Interface Polarity */ +#define DMA_CHNCFG_LOCKB ((uint64_t)0x000000020000U) /* Bus Lock Bit */ +#define DMA_CHNCFG_LOCKCH ((uint64_t)0x000000010000U) /* Channel Lock Bit */ +#define DMA_CHNCFG_LOCKBL ((uint64_t)0x00000000C000U) /* Bus lock level */ +#define DMA_CHNCFG_LOCKBL_1 ((uint64_t)0x000000008000U) /* Bit 1 */ +#define DMA_CHNCFG_LOCKBL_0 ((uint64_t)0x000000004000U) /* Bit 0 */ +#define DMA_CHNCFG_LOCKCHL ((uint64_t)0x000000003000U) /* Channel lock level */ +#define DMA_CHNCFG_LOCKCHL_1 ((uint64_t)0x000000002000U) /* Bit 1 */ +#define DMA_CHNCFG_LOCKCHL_0 ((uint64_t)0x000000001000U) /* Bit 0 */ +#define DMA_CHNCFG_HSSELSRC ((uint64_t)0x000000000800U) /* Source Software or Hardware Handshaking Select */ +#define DMA_CHNCFG_HSSELDST ((uint64_t)0x000000000400U) /* Destination Software or Hardware Handshaking Select */ +#define DMA_CHNCFG_FIFOEMPTY ((uint64_t)0x000000000200U) /* Channel FIFO status */ +#define DMA_CHNCFG_CHSUSP ((uint64_t)0x000000000100U) /* Channel Suspend */ +#define DMA_CHNCFG_CHPRIOR ((uint64_t)0x0000000000E0U) /* Channel Priority */ +#define DMA_CHNCFG_CHPRIOR_2 ((uint64_t)0x000000000080U) /* Bit 2 */ +#define DMA_CHNCFG_CHPRIOR_1 ((uint64_t)0x000000000040U) /* Bit 1 */ +#define DMA_CHNCFG_CHPRIOR_0 ((uint64_t)0x000000000020U) /* Bit 0 */ + +/** Bit definition for DMA_CHNSG register **/ +#define DMA_CHNSG_SGC ((uint32_t)0x1FF00000U) /* Source Gather Count */ +#define DMA_CHNSG_SGI ((uint32_t)0x000FFFFFU) /* Source Gather Interval */ + +/** Bit definition for DMA_CHNDS register **/ +#define DMA_CHNDS_DSC ((uint32_t)0x1FF00000U) /* Destination Gather Count */ +#define DMA_CHNDS_DSI ((uint32_t)0x000FFFFFU) /* Destination Gather Interval */ + +/** Bit definition for DMA_RAWTCINTSTS register **/ +#define DMA_RAWTCINTSTS_CH7 ((uint32_t)0x00000080U) /* Channel 7 Raw Status for IntTfr Interrupt */ +#define DMA_RAWTCINTSTS_CH6 ((uint32_t)0x00000040U) /* Channel 6 Raw Status for IntTfr Interrupt */ +#define DMA_RAWTCINTSTS_CH5 ((uint32_t)0x00000020U) /* Channel 5 Raw Status for IntTfr Interrupt */ +#define DMA_RAWTCINTSTS_CH4 ((uint32_t)0x00000010U) /* Channel 4 Raw Status for IntTfr Interrupt */ +#define DMA_RAWTCINTSTS_CH3 ((uint32_t)0x00000008U) /* Channel 3 Raw Status for IntTfr Interrupt */ +#define DMA_RAWTCINTSTS_CH2 ((uint32_t)0x00000004U) /* Channel 2 Raw Status for IntTfr Interrupt */ +#define DMA_RAWTCINTSTS_CH1 ((uint32_t)0x00000002U) /* Channel 1 Raw Status for IntTfr Interrupt */ +#define DMA_RAWTCINTSTS_CH0 ((uint32_t)0x00000001U) /* Channel 0 Raw Status for IntTfr Interrupt */ + +/** Bit definition for DMA_RAWBTCINTSTS register **/ +#define DMA_RAWBTCINTSTS_CH7 ((uint32_t)0x00000080U) /* Channel 7 Raw Status for IntBlock Interrupt */ +#define DMA_RAWBTCINTSTS_CH6 ((uint32_t)0x00000040U) /* Channel 6 Raw Status for IntBlock Interrupt */ +#define DMA_RAWBTCINTSTS_CH5 ((uint32_t)0x00000020U) /* Channel 5 Raw Status for IntBlock Interrupt */ +#define DMA_RAWBTCINTSTS_CH4 ((uint32_t)0x00000010U) /* Channel 4 Raw Status for IntBlock Interrupt */ +#define DMA_RAWBTCINTSTS_CH3 ((uint32_t)0x00000008U) /* Channel 3 Raw Status for IntBlock Interrupt */ +#define DMA_RAWBTCINTSTS_CH2 ((uint32_t)0x00000004U) /* Channel 2 Raw Status for IntBlock Interrupt */ +#define DMA_RAWBTCINTSTS_CH1 ((uint32_t)0x00000002U) /* Channel 1 Raw Status for IntBlock Interrupt */ +#define DMA_RAWBTCINTSTS_CH0 ((uint32_t)0x00000001U) /* Channel 0 Raw Status for IntBlock Interrupt */ + +/** Bit definition for DMA_RAWSTCINTSTS register **/ +#define DMA_RAWSTCINTSTS_CH7 ((uint32_t)0x00000080U) /* Channel 7 Raw Status for IntSrcTran Interrupt */ +#define DMA_RAWSTCINTSTS_CH6 ((uint32_t)0x00000040U) /* Channel 6 Raw Status for IntSrcTran Interrupt */ +#define DMA_RAWSTCINTSTS_CH5 ((uint32_t)0x00000020U) /* Channel 5 Raw Status for IntSrcTran Interrupt */ +#define DMA_RAWSTCINTSTS_CH4 ((uint32_t)0x00000010U) /* Channel 4 Raw Status for IntSrcTran Interrupt */ +#define DMA_RAWSTCINTSTS_CH3 ((uint32_t)0x00000008U) /* Channel 3 Raw Status for IntSrcTran Interrupt */ +#define DMA_RAWSTCINTSTS_CH2 ((uint32_t)0x00000004U) /* Channel 2 Raw Status for IntSrcTran Interrupt */ +#define DMA_RAWSTCINTSTS_CH1 ((uint32_t)0x00000002U) /* Channel 1 Raw Status for IntSrcTran Interrupt */ +#define DMA_RAWSTCINTSTS_CH0 ((uint32_t)0x00000001U) /* Channel 0 Raw Status for IntSrcTran Interrupt */ + +/** Bit definition for DMA_RAWDTCINTSTS register **/ +#define DMA_RAWDTCINTSTS_CH7 ((uint32_t)0x00000080U) /* Channel 7 Raw Status for IntDstTran Interrupt */ +#define DMA_RAWDTCINTSTS_CH6 ((uint32_t)0x00000040U) /* Channel 6 Raw Status for IntDstTran Interrupt */ +#define DMA_RAWDTCINTSTS_CH5 ((uint32_t)0x00000020U) /* Channel 5 Raw Status for IntDstTran Interrupt */ +#define DMA_RAWDTCINTSTS_CH4 ((uint32_t)0x00000010U) /* Channel 4 Raw Status for IntDstTran Interrupt */ +#define DMA_RAWDTCINTSTS_CH3 ((uint32_t)0x00000008U) /* Channel 3 Raw Status for IntDstTran Interrupt */ +#define DMA_RAWDTCINTSTS_CH2 ((uint32_t)0x00000004U) /* Channel 2 Raw Status for IntDstTran Interrupt */ +#define DMA_RAWDTCINTSTS_CH1 ((uint32_t)0x00000002U) /* Channel 1 Raw Status for IntDstTran Interrupt */ +#define DMA_RAWDTCINTSTS_CH0 ((uint32_t)0x00000001U) /* Channel 0 Raw Status for IntDstTran Interrupt */ + +/** Bit definition for DMA_RAWERRINTSTS register **/ +#define DMA_RAWERRINTSTS_CH7 ((uint32_t)0x00000080U) /* Channel 7 Raw Status for IntErr Interrupt */ +#define DMA_RAWERRINTSTS_CH6 ((uint32_t)0x00000040U) /* Channel 6 Raw Status for IntErr Interrupt */ +#define DMA_RAWERRINTSTS_CH5 ((uint32_t)0x00000020U) /* Channel 5 Raw Status for IntErr Interrupt */ +#define DMA_RAWERRINTSTS_CH4 ((uint32_t)0x00000010U) /* Channel 4 Raw Status for IntErr Interrupt */ +#define DMA_RAWERRINTSTS_CH3 ((uint32_t)0x00000008U) /* Channel 3 Raw Status for IntErr Interrupt */ +#define DMA_RAWERRINTSTS_CH2 ((uint32_t)0x00000004U) /* Channel 2 Raw Status for IntErr Interrupt */ +#define DMA_RAWERRINTSTS_CH1 ((uint32_t)0x00000002U) /* Channel 1 Raw Status for IntErr Interrupt */ +#define DMA_RAWERRINTSTS_CH0 ((uint32_t)0x00000001U) /* Channel 0 Raw Status for IntErr Interrupt */ + +/** Bit definition for DMA_TCINTSTS register **/ +#define DMA_TCINTSTS_CH7 ((uint32_t)0x00000080U) /* Channel 7 Status for IntTfr Interrupt */ +#define DMA_TCINTSTS_CH6 ((uint32_t)0x00000040U) /* Channel 6 Status for IntTfr Interrupt */ +#define DMA_TCINTSTS_CH5 ((uint32_t)0x00000020U) /* Channel 5 Status for IntTfr Interrupt */ +#define DMA_TCINTSTS_CH4 ((uint32_t)0x00000010U) /* Channel 4 Status for IntTfr Interrupt */ +#define DMA_TCINTSTS_CH3 ((uint32_t)0x00000008U) /* Channel 3 Status for IntTfr Interrupt */ +#define DMA_TCINTSTS_CH2 ((uint32_t)0x00000004U) /* Channel 2 Status for IntTfr Interrupt */ +#define DMA_TCINTSTS_CH1 ((uint32_t)0x00000002U) /* Channel 1 Status for IntTfr Interrupt */ +#define DMA_TCINTSTS_CH0 ((uint32_t)0x00000001U) /* Channel 0 Status for IntTfr Interrupt */ + +/** Bit definition for DMA_BTCINTSTS register **/ +#define DMA_BTCINTSTS_CH7 ((uint32_t)0x00000080U) /* Channel 7 Status for IntBlock Interrupt */ +#define DMA_BTCINTSTS_CH6 ((uint32_t)0x00000040U) /* Channel 6 Status for IntBlock Interrupt */ +#define DMA_BTCINTSTS_CH5 ((uint32_t)0x00000020U) /* Channel 5 Status for IntBlock Interrupt */ +#define DMA_BTCINTSTS_CH4 ((uint32_t)0x00000010U) /* Channel 4 Status for IntBlock Interrupt */ +#define DMA_BTCINTSTS_CH3 ((uint32_t)0x00000008U) /* Channel 3 Status for IntBlock Interrupt */ +#define DMA_BTCINTSTS_CH2 ((uint32_t)0x00000004U) /* Channel 2 Status for IntBlock Interrupt */ +#define DMA_BTCINTSTS_CH1 ((uint32_t)0x00000002U) /* Channel 1 Status for IntBlock Interrupt */ +#define DMA_BTCINTSTS_CH0 ((uint32_t)0x00000001U) /* Channel 0 Status for IntBlock Interrupt */ + +/** Bit definition for DMA_STCINTSTS register **/ +#define DMA_STCINTSTS_CH7 ((uint32_t)0x00000080U) /* Channel 7 Status for IntSrcTran Interrupt */ +#define DMA_STCINTSTS_CH6 ((uint32_t)0x00000040U) /* Channel 6 Status for IntSrcTran Interrupt */ +#define DMA_STCINTSTS_CH5 ((uint32_t)0x00000020U) /* Channel 5 Status for IntSrcTran Interrupt */ +#define DMA_STCINTSTS_CH4 ((uint32_t)0x00000010U) /* Channel 4 Status for IntSrcTran Interrupt */ +#define DMA_STCINTSTS_CH3 ((uint32_t)0x00000008U) /* Channel 3 Status for IntSrcTran Interrupt */ +#define DMA_STCINTSTS_CH2 ((uint32_t)0x00000004U) /* Channel 2 Status for IntSrcTran Interrupt */ +#define DMA_STCINTSTS_CH1 ((uint32_t)0x00000002U) /* Channel 1 Status for IntSrcTran Interrupt */ +#define DMA_STCINTSTS_CH0 ((uint32_t)0x00000001U) /* Channel 0 Status for IntSrcTran Interrupt */ + +/** Bit definition for DMA_DTCINTSTS register **/ +#define DMA_DTCINTSTS_CH7 ((uint32_t)0x00000080U) /* Channel 7 Status for IntDstTran Interrupt */ +#define DMA_DTCINTSTS_CH6 ((uint32_t)0x00000040U) /* Channel 6 Status for IntDstTran Interrupt */ +#define DMA_DTCINTSTS_CH5 ((uint32_t)0x00000020U) /* Channel 5 Status for IntDstTran Interrupt */ +#define DMA_DTCINTSTS_CH4 ((uint32_t)0x00000010U) /* Channel 4 Status for IntDstTran Interrupt */ +#define DMA_DTCINTSTS_CH3 ((uint32_t)0x00000008U) /* Channel 3 Status for IntDstTran Interrupt */ +#define DMA_DTCINTSTS_CH2 ((uint32_t)0x00000004U) /* Channel 2 Status for IntDstTran Interrupt */ +#define DMA_DTCINTSTS_CH1 ((uint32_t)0x00000002U) /* Channel 1 Status for IntDstTran Interrupt */ +#define DMA_DTCINTSTS_CH0 ((uint32_t)0x00000001U) /* Channel 0 Status for IntDstTran Interrupt */ + +/** Bit definition for DMA_ERRINTSTS register **/ +#define DMA_ERRINTSTS_CH7 ((uint32_t)0x00000080U) /* Channel 7 Status for IntErr Interrupt */ +#define DMA_ERRINTSTS_CH6 ((uint32_t)0x00000040U) /* Channel 6 Status for IntErr Interrupt */ +#define DMA_ERRINTSTS_CH5 ((uint32_t)0x00000020U) /* Channel 5 Status for IntErr Interrupt */ +#define DMA_ERRINTSTS_CH4 ((uint32_t)0x00000010U) /* Channel 4 Status for IntErr Interrupt */ +#define DMA_ERRINTSTS_CH3 ((uint32_t)0x00000008U) /* Channel 3 Status for IntErr Interrupt */ +#define DMA_ERRINTSTS_CH2 ((uint32_t)0x00000004U) /* Channel 2 Status for IntErr Interrupt */ +#define DMA_ERRINTSTS_CH1 ((uint32_t)0x00000002U) /* Channel 1 Status for IntErr Interrupt */ +#define DMA_ERRINTSTS_CH0 ((uint32_t)0x00000001U) /* Channel 0 Status for IntErr Interrupt */ + +/** Bit definition for DMA_TCINTMSK register **/ +#define DMA_TCINTMSK_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Interrupt Mask Write Enable */ +#define DMA_TCINTMSK_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Interrupt Mask Write Enable */ +#define DMA_TCINTMSK_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Interrupt Mask Write Enable */ +#define DMA_TCINTMSK_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Interrupt Mask Write Enable */ +#define DMA_TCINTMSK_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Interrupt Mask Write Enable */ +#define DMA_TCINTMSK_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Interrupt Mask Write Enable */ +#define DMA_TCINTMSK_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Interrupt Mask Write Enable */ +#define DMA_TCINTMSK_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Interrupt Mask Write Enable */ +#define DMA_TCINTMSK_CH7 ((uint32_t)0x00000080U) /* Channel 7 IntTfr Interrupt Mask */ +#define DMA_TCINTMSK_CH6 ((uint32_t)0x00000040U) /* Channel 6 IntTfr Interrupt Mask */ +#define DMA_TCINTMSK_CH5 ((uint32_t)0x00000020U) /* Channel 5 IntTfr Interrupt Mask */ +#define DMA_TCINTMSK_CH4 ((uint32_t)0x00000010U) /* Channel 4 IntTfr Interrupt Mask */ +#define DMA_TCINTMSK_CH3 ((uint32_t)0x00000008U) /* Channel 3 IntTfr Interrupt Mask */ +#define DMA_TCINTMSK_CH2 ((uint32_t)0x00000004U) /* Channel 2 IntTfr Interrupt Mask */ +#define DMA_TCINTMSK_CH1 ((uint32_t)0x00000002U) /* Channel 1 IntTfr Interrupt Mask */ +#define DMA_TCINTMSK_CH0 ((uint32_t)0x00000001U) /* Channel 0 IntTfr Interrupt Mask */ + +/** Bit definition for DMA_BTCINTMSK register **/ +#define DMA_BTCINTMSK_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Interrupt Mask Write Enable */ +#define DMA_BTCINTMSK_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Interrupt Mask Write Enable */ +#define DMA_BTCINTMSK_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Interrupt Mask Write Enable */ +#define DMA_BTCINTMSK_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Interrupt Mask Write Enable */ +#define DMA_BTCINTMSK_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Interrupt Mask Write Enable */ +#define DMA_BTCINTMSK_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Interrupt Mask Write Enable */ +#define DMA_BTCINTMSK_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Interrupt Mask Write Enable */ +#define DMA_BTCINTMSK_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Interrupt Mask Write Enable */ +#define DMA_BTCINTMSK_CH7 ((uint32_t)0x00000080U) /* Channel 7 IntBlock Interrupt Mask */ +#define DMA_BTCINTMSK_CH6 ((uint32_t)0x00000040U) /* Channel 6 IntBlock Interrupt Mask */ +#define DMA_BTCINTMSK_CH5 ((uint32_t)0x00000020U) /* Channel 5 IntBlock Interrupt Mask */ +#define DMA_BTCINTMSK_CH4 ((uint32_t)0x00000010U) /* Channel 4 IntBlock Interrupt Mask */ +#define DMA_BTCINTMSK_CH3 ((uint32_t)0x00000008U) /* Channel 3 IntBlock Interrupt Mask */ +#define DMA_BTCINTMSK_CH2 ((uint32_t)0x00000004U) /* Channel 2 IntBlock Interrupt Mask */ +#define DMA_BTCINTMSK_CH1 ((uint32_t)0x00000002U) /* Channel 1 IntBlock Interrupt Mask */ +#define DMA_BTCINTMSK_CH0 ((uint32_t)0x00000001U) /* Channel 0 IntBlock Interrupt Mask */ + +/** Bit definition for DMA_STCINTMSK register **/ +#define DMA_STCINTMSK_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Interrupt Mask Write Enable */ +#define DMA_STCINTMSK_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Interrupt Mask Write Enable */ +#define DMA_STCINTMSK_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Interrupt Mask Write Enable */ +#define DMA_STCINTMSK_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Interrupt Mask Write Enable */ +#define DMA_STCINTMSK_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Interrupt Mask Write Enable */ +#define DMA_STCINTMSK_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Interrupt Mask Write Enable */ +#define DMA_STCINTMSK_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Interrupt Mask Write Enable */ +#define DMA_STCINTMSK_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Interrupt Mask Write Enable */ +#define DMA_STCINTMSK_CH7 ((uint32_t)0x00000080U) /* Channel 7 IntSrcTran Interrupt Mask */ +#define DMA_STCINTMSK_CH6 ((uint32_t)0x00000040U) /* Channel 6 IntSrcTran Interrupt Mask */ +#define DMA_STCINTMSK_CH5 ((uint32_t)0x00000020U) /* Channel 5 IntSrcTran Interrupt Mask */ +#define DMA_STCINTMSK_CH4 ((uint32_t)0x00000010U) /* Channel 4 IntSrcTran Interrupt Mask */ +#define DMA_STCINTMSK_CH3 ((uint32_t)0x00000008U) /* Channel 3 IntSrcTran Interrupt Mask */ +#define DMA_STCINTMSK_CH2 ((uint32_t)0x00000004U) /* Channel 2 IntSrcTran Interrupt Mask */ +#define DMA_STCINTMSK_CH1 ((uint32_t)0x00000002U) /* Channel 1 IntSrcTran Interrupt Mask */ +#define DMA_STCINTMSK_CH0 ((uint32_t)0x00000001U) /* Channel 0 IntSrcTran Interrupt Mask */ + +/** Bit definition for DMA_DTCINTMSK register **/ +#define DMA_DTCINTMSK_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Interrupt Mask Write Enable */ +#define DMA_DTCINTMSK_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Interrupt Mask Write Enable */ +#define DMA_DTCINTMSK_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Interrupt Mask Write Enable */ +#define DMA_DTCINTMSK_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Interrupt Mask Write Enable */ +#define DMA_DTCINTMSK_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Interrupt Mask Write Enable */ +#define DMA_DTCINTMSK_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Interrupt Mask Write Enable */ +#define DMA_DTCINTMSK_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Interrupt Mask Write Enable */ +#define DMA_DTCINTMSK_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Interrupt Mask Write Enable */ +#define DMA_DTCINTMSK_CH7 ((uint32_t)0x00000080U) /* Channel 7 IntDstTran Interrupt Mask */ +#define DMA_DTCINTMSK_CH6 ((uint32_t)0x00000040U) /* Channel 6 IntDstTran Interrupt Mask */ +#define DMA_DTCINTMSK_CH5 ((uint32_t)0x00000020U) /* Channel 5 IntDstTran Interrupt Mask */ +#define DMA_DTCINTMSK_CH4 ((uint32_t)0x00000010U) /* Channel 4 IntDstTran Interrupt Mask */ +#define DMA_DTCINTMSK_CH3 ((uint32_t)0x00000008U) /* Channel 3 IntDstTran Interrupt Mask */ +#define DMA_DTCINTMSK_CH2 ((uint32_t)0x00000004U) /* Channel 2 IntDstTran Interrupt Mask */ +#define DMA_DTCINTMSK_CH1 ((uint32_t)0x00000002U) /* Channel 1 IntDstTran Interrupt Mask */ +#define DMA_DTCINTMSK_CH0 ((uint32_t)0x00000001U) /* Channel 0 IntDstTran Interrupt Mask */ + +/** Bit definition for DMA_ERRINTMSK register **/ +#define DMA_ERRINTMSK_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Interrupt Mask Write Enable */ +#define DMA_ERRINTMSK_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Interrupt Mask Write Enable */ +#define DMA_ERRINTMSK_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Interrupt Mask Write Enable */ +#define DMA_ERRINTMSK_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Interrupt Mask Write Enable */ +#define DMA_ERRINTMSK_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Interrupt Mask Write Enable */ +#define DMA_ERRINTMSK_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Interrupt Mask Write Enable */ +#define DMA_ERRINTMSK_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Interrupt Mask Write Enable */ +#define DMA_ERRINTMSK_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Interrupt Mask Write Enable */ +#define DMA_ERRINTMSK_CH7 ((uint32_t)0x00000080U) /* Channel 7 IntErr Interrupt Mask */ +#define DMA_ERRINTMSK_CH6 ((uint32_t)0x00000040U) /* Channel 6 IntErr Interrupt Mask */ +#define DMA_ERRINTMSK_CH5 ((uint32_t)0x00000020U) /* Channel 5 IntErr Interrupt Mask */ +#define DMA_ERRINTMSK_CH4 ((uint32_t)0x00000010U) /* Channel 4 IntErr Interrupt Mask */ +#define DMA_ERRINTMSK_CH3 ((uint32_t)0x00000008U) /* Channel 3 IntErr Interrupt Mask */ +#define DMA_ERRINTMSK_CH2 ((uint32_t)0x00000004U) /* Channel 2 IntErr Interrupt Mask */ +#define DMA_ERRINTMSK_CH1 ((uint32_t)0x00000002U) /* Channel 1 IntErr Interrupt Mask */ +#define DMA_ERRINTMSK_CH0 ((uint32_t)0x00000001U) /* Channel 0 IntErr Interrupt Mask */ + +/** Bit definition for DMA_TCINTCLR register **/ +#define DMA_TCINTCLR_CH7 ((uint32_t)0x00000080U) /* Channel 7 Clear for IntTfr Interrupt */ +#define DMA_TCINTCLR_CH6 ((uint32_t)0x00000040U) /* Channel 6 Clear for IntTfr Interrupt */ +#define DMA_TCINTCLR_CH5 ((uint32_t)0x00000020U) /* Channel 5 Clear for IntTfr Interrupt */ +#define DMA_TCINTCLR_CH4 ((uint32_t)0x00000010U) /* Channel 4 Clear for IntTfr Interrupt */ +#define DMA_TCINTCLR_CH3 ((uint32_t)0x00000008U) /* Channel 3 Clear for IntTfr Interrupt */ +#define DMA_TCINTCLR_CH2 ((uint32_t)0x00000004U) /* Channel 2 Clear for IntTfr Interrupt */ +#define DMA_TCINTCLR_CH1 ((uint32_t)0x00000002U) /* Channel 1 Clear for IntTfr Interrupt */ +#define DMA_TCINTCLR_CH0 ((uint32_t)0x00000001U) /* Channel 0 Clear for IntTfr Interrupt */ + +/** Bit definition for DMA_BTCINTCLR register **/ +#define DMA_BTCINTCLR_CH7 ((uint32_t)0x00000080U) /* Channel 7 Clear for IntBlock Interrupt */ +#define DMA_BTCINTCLR_CH6 ((uint32_t)0x00000040U) /* Channel 6 Clear for IntBlock Interrupt */ +#define DMA_BTCINTCLR_CH5 ((uint32_t)0x00000020U) /* Channel 5 Clear for IntBlock Interrupt */ +#define DMA_BTCINTCLR_CH4 ((uint32_t)0x00000010U) /* Channel 4 Clear for IntBlock Interrupt */ +#define DMA_BTCINTCLR_CH3 ((uint32_t)0x00000008U) /* Channel 3 Clear for IntBlock Interrupt */ +#define DMA_BTCINTCLR_CH2 ((uint32_t)0x00000004U) /* Channel 2 Clear for IntBlock Interrupt */ +#define DMA_BTCINTCLR_CH1 ((uint32_t)0x00000002U) /* Channel 1 Clear for IntBlock Interrupt */ +#define DMA_BTCINTCLR_CH0 ((uint32_t)0x00000001U) /* Channel 0 Clear for IntBlock Interrupt */ + +/** Bit definition for DMA_STCINTCLR register **/ +#define DMA_STCINTCLR_CH7 ((uint32_t)0x00000080U) /* Channel 7 Clear for IntSrcTran Interrupt */ +#define DMA_STCINTCLR_CH6 ((uint32_t)0x00000040U) /* Channel 6 Clear for IntSrcTran Interrupt */ +#define DMA_STCINTCLR_CH5 ((uint32_t)0x00000020U) /* Channel 5 Clear for IntSrcTran Interrupt */ +#define DMA_STCINTCLR_CH4 ((uint32_t)0x00000010U) /* Channel 4 Clear for IntSrcTran Interrupt */ +#define DMA_STCINTCLR_CH3 ((uint32_t)0x00000008U) /* Channel 3 Clear for IntSrcTran Interrupt */ +#define DMA_STCINTCLR_CH2 ((uint32_t)0x00000004U) /* Channel 2 Clear for IntSrcTran Interrupt */ +#define DMA_STCINTCLR_CH1 ((uint32_t)0x00000002U) /* Channel 1 Clear for IntSrcTran Interrupt */ +#define DMA_STCINTCLR_CH0 ((uint32_t)0x00000001U) /* Channel 0 Clear for IntSrcTran Interrupt */ + +/** Bit definition for DMA_DTCINTCLR register **/ +#define DMA_DTCINTCLR_CH7 ((uint32_t)0x00000080U) /* Channel 7 Clear for IntDstTran Interrupt */ +#define DMA_DTCINTCLR_CH6 ((uint32_t)0x00000040U) /* Channel 6 Clear for IntDstTran Interrupt */ +#define DMA_DTCINTCLR_CH5 ((uint32_t)0x00000020U) /* Channel 5 Clear for IntDstTran Interrupt */ +#define DMA_DTCINTCLR_CH4 ((uint32_t)0x00000010U) /* Channel 4 Clear for IntDstTran Interrupt */ +#define DMA_DTCINTCLR_CH3 ((uint32_t)0x00000008U) /* Channel 3 Clear for IntDstTran Interrupt */ +#define DMA_DTCINTCLR_CH2 ((uint32_t)0x00000004U) /* Channel 2 Clear for IntDstTran Interrupt */ +#define DMA_DTCINTCLR_CH1 ((uint32_t)0x00000002U) /* Channel 1 Clear for IntDstTran Interrupt */ +#define DMA_DTCINTCLR_CH0 ((uint32_t)0x00000001U) /* Channel 0 Clear for IntDstTran Interrupt */ + +/** Bit definition for DMA_ERRINTCLR register **/ +#define DMA_ERRINTCLR_CH7 ((uint32_t)0x00000080U) /* Channel 7 Clear for IntErr Interrupt */ +#define DMA_ERRINTCLR_CH6 ((uint32_t)0x00000040U) /* Channel 6 Clear for IntErr Interrupt */ +#define DMA_ERRINTCLR_CH5 ((uint32_t)0x00000020U) /* Channel 5 Clear for IntErr Interrupt */ +#define DMA_ERRINTCLR_CH4 ((uint32_t)0x00000010U) /* Channel 4 Clear for IntErr Interrupt */ +#define DMA_ERRINTCLR_CH3 ((uint32_t)0x00000008U) /* Channel 3 Clear for IntErr Interrupt */ +#define DMA_ERRINTCLR_CH2 ((uint32_t)0x00000004U) /* Channel 2 Clear for IntErr Interrupt */ +#define DMA_ERRINTCLR_CH1 ((uint32_t)0x00000002U) /* Channel 1 Clear for IntErr Interrupt */ +#define DMA_ERRINTCLR_CH0 ((uint32_t)0x00000001U) /* Channel 0 Clear for IntErr Interrupt */ + +/** Bit definition for DMA_INTCBESTS register **/ +#define DMA_INTCBESTS_ERR ((uint32_t)0x00000010U) /* OR of the contents of DMA_ERRINTSTS register */ +#define DMA_INTCBESTS_DSTT ((uint32_t)0x00000008U) /* OR of the contents of DMA_DTCINTSTS register */ +#define DMA_INTCBESTS_SRCT ((uint32_t)0x00000004U) /* OR of the contents of DMA_STCINTSTS register */ +#define DMA_INTCBESTS_BLOCK ((uint32_t)0x00000002U) /* OR of the contents of DMA_BTCINTSTS register */ +#define DMA_INTCBESTS_TFR ((uint32_t)0x00000001U) /* OR of the contents of DMA_TCINTSTS register */ + +/** Bit definition for DMA_SRCSWTREQ register **/ +#define DMA_SRCSWTREQ_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Source Software Transaction Request write enable */ +#define DMA_SRCSWTREQ_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Source Software Transaction Request write enable */ +#define DMA_SRCSWTREQ_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Source Software Transaction Request write enable */ +#define DMA_SRCSWTREQ_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Source Software Transaction Request write enable */ +#define DMA_SRCSWTREQ_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Source Software Transaction Request write enable */ +#define DMA_SRCSWTREQ_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Source Software Transaction Request write enable */ +#define DMA_SRCSWTREQ_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Source Software Transaction Request write enable */ +#define DMA_SRCSWTREQ_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Source Software Transaction Request write enable */ +#define DMA_SRCSWTREQ_CH7 ((uint32_t)0x00000080U) /* Channel 7 Source Software Transaction Request */ +#define DMA_SRCSWTREQ_CH6 ((uint32_t)0x00000040U) /* Channel 6 Source Software Transaction Request */ +#define DMA_SRCSWTREQ_CH5 ((uint32_t)0x00000020U) /* Channel 5 Source Software Transaction Request */ +#define DMA_SRCSWTREQ_CH4 ((uint32_t)0x00000010U) /* Channel 4 Source Software Transaction Request */ +#define DMA_SRCSWTREQ_CH3 ((uint32_t)0x00000008U) /* Channel 3 Source Software Transaction Request */ +#define DMA_SRCSWTREQ_CH2 ((uint32_t)0x00000004U) /* Channel 2 Source Software Transaction Request */ +#define DMA_SRCSWTREQ_CH1 ((uint32_t)0x00000002U) /* Channel 1 Source Software Transaction Request */ +#define DMA_SRCSWTREQ_CH0 ((uint32_t)0x00000001U) /* Channel 0 Source Software Transaction Request */ + +/** Bit definition for DMA_DSTSWTREQ register **/ +#define DMA_DSTSWTREQ_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Destination Software Transaction Request write enable */ +#define DMA_DSTSWTREQ_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Destination Software Transaction Request write enable */ +#define DMA_DSTSWTREQ_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Destination Software Transaction Request write enable */ +#define DMA_DSTSWTREQ_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Destination Software Transaction Request write enable */ +#define DMA_DSTSWTREQ_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Destination Software Transaction Request write enable */ +#define DMA_DSTSWTREQ_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Destination Software Transaction Request write enable */ +#define DMA_DSTSWTREQ_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Destination Software Transaction Request write enable */ +#define DMA_DSTSWTREQ_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Destination Software Transaction Request write enable */ +#define DMA_DSTSWTREQ_CH7 ((uint32_t)0x00000080U) /* Channel 7 Destination Software Transaction Request */ +#define DMA_DSTSWTREQ_CH6 ((uint32_t)0x00000040U) /* Channel 6 Destination Software Transaction Request */ +#define DMA_DSTSWTREQ_CH5 ((uint32_t)0x00000020U) /* Channel 5 Destination Software Transaction Request */ +#define DMA_DSTSWTREQ_CH4 ((uint32_t)0x00000010U) /* Channel 4 Destination Software Transaction Request */ +#define DMA_DSTSWTREQ_CH3 ((uint32_t)0x00000008U) /* Channel 3 Destination Software Transaction Request */ +#define DMA_DSTSWTREQ_CH2 ((uint32_t)0x00000004U) /* Channel 2 Destination Software Transaction Request */ +#define DMA_DSTSWTREQ_CH1 ((uint32_t)0x00000002U) /* Channel 1 Destination Software Transaction Request */ +#define DMA_DSTSWTREQ_CH0 ((uint32_t)0x00000001U) /* Channel 0 Destination Software Transaction Request */ + +/** Bit definition for DMA_SRCSGTREQ register **/ +#define DMA_SRCSGTREQ_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Source Single Transaction Request write enable */ +#define DMA_SRCSGTREQ_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Source Single Transaction Request write enable */ +#define DMA_SRCSGTREQ_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Source Single Transaction Request write enable */ +#define DMA_SRCSGTREQ_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Source Single Transaction Request write enable */ +#define DMA_SRCSGTREQ_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Source Single Transaction Request write enable */ +#define DMA_SRCSGTREQ_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Source Single Transaction Request write enable */ +#define DMA_SRCSGTREQ_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Source Single Transaction Request write enable */ +#define DMA_SRCSGTREQ_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Source Single Transaction Request write enable */ +#define DMA_SRCSGTREQ_CH7 ((uint32_t)0x00000080U) /* Channel 7 Source Single Transaction Request */ +#define DMA_SRCSGTREQ_CH6 ((uint32_t)0x00000040U) /* Channel 6 Source Single Transaction Request */ +#define DMA_SRCSGTREQ_CH5 ((uint32_t)0x00000020U) /* Channel 5 Source Single Transaction Request */ +#define DMA_SRCSGTREQ_CH4 ((uint32_t)0x00000010U) /* Channel 4 Source Single Transaction Request */ +#define DMA_SRCSGTREQ_CH3 ((uint32_t)0x00000008U) /* Channel 3 Source Single Transaction Request */ +#define DMA_SRCSGTREQ_CH2 ((uint32_t)0x00000004U) /* Channel 2 Source Single Transaction Request */ +#define DMA_SRCSGTREQ_CH1 ((uint32_t)0x00000002U) /* Channel 1 Source Single Transaction Request */ +#define DMA_SRCSGTREQ_CH0 ((uint32_t)0x00000001U) /* Channel 0 Source Single Transaction Request */ + +/** Bit definition for DMA_DSTSGTREQ register **/ +#define DMA_DSTSGTREQ_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Destination Single Transaction Request write enable */ +#define DMA_DSTSGTREQ_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Destination Single Transaction Request write enable */ +#define DMA_DSTSGTREQ_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Destination Single Transaction Request write enable */ +#define DMA_DSTSGTREQ_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Destination Single Transaction Request write enable */ +#define DMA_DSTSGTREQ_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Destination Single Transaction Request write enable */ +#define DMA_DSTSGTREQ_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Destination Single Transaction Request write enable */ +#define DMA_DSTSGTREQ_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Destination Single Transaction Request write enable */ +#define DMA_DSTSGTREQ_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Destination Single Transaction Request write enable */ +#define DMA_DSTSGTREQ_CH7 ((uint32_t)0x00000080U) /* Channel 7 Destination Single Transaction Request */ +#define DMA_DSTSGTREQ_CH6 ((uint32_t)0x00000040U) /* Channel 6 Destination Single Transaction Request */ +#define DMA_DSTSGTREQ_CH5 ((uint32_t)0x00000020U) /* Channel 5 Destination Single Transaction Request */ +#define DMA_DSTSGTREQ_CH4 ((uint32_t)0x00000010U) /* Channel 4 Destination Single Transaction Request */ +#define DMA_DSTSGTREQ_CH3 ((uint32_t)0x00000008U) /* Channel 3 Destination Single Transaction Request */ +#define DMA_DSTSGTREQ_CH2 ((uint32_t)0x00000004U) /* Channel 2 Destination Single Transaction Request */ +#define DMA_DSTSGTREQ_CH1 ((uint32_t)0x00000002U) /* Channel 1 Destination Single Transaction Request */ +#define DMA_DSTSGTREQ_CH0 ((uint32_t)0x00000001U) /* Channel 0 Destination Single Transaction Request */ + +/** Bit definition for DMA_SRCLTREQ register **/ +#define DMA_SRCLTREQ_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Source Last Transaction Request write enable */ +#define DMA_SRCLTREQ_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Source Last Transaction Request write enable */ +#define DMA_SRCLTREQ_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Source Last Transaction Request write enable */ +#define DMA_SRCLTREQ_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Source Last Transaction Request write enable */ +#define DMA_SRCLTREQ_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Source Last Transaction Request write enable */ +#define DMA_SRCLTREQ_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Source Last Transaction Request write enable */ +#define DMA_SRCLTREQ_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Source Last Transaction Request write enable */ +#define DMA_SRCLTREQ_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Source Last Transaction Request write enable */ +#define DMA_SRCLTREQ_CH7 ((uint32_t)0x00000080U) /* Channel 7 Source Last Transaction Request */ +#define DMA_SRCLTREQ_CH6 ((uint32_t)0x00000040U) /* Channel 6 Source Last Transaction Request */ +#define DMA_SRCLTREQ_CH5 ((uint32_t)0x00000020U) /* Channel 5 Source Last Transaction Request */ +#define DMA_SRCLTREQ_CH4 ((uint32_t)0x00000010U) /* Channel 4 Source Last Transaction Request */ +#define DMA_SRCLTREQ_CH3 ((uint32_t)0x00000008U) /* Channel 3 Source Last Transaction Request */ +#define DMA_SRCLTREQ_CH2 ((uint32_t)0x00000004U) /* Channel 2 Source Last Transaction Request */ +#define DMA_SRCLTREQ_CH1 ((uint32_t)0x00000002U) /* Channel 1 Source Last Transaction Request */ +#define DMA_SRCLTREQ_CH0 ((uint32_t)0x00000001U) /* Channel 0 Source Last Transaction Request */ + +/** Bit definition for DMA_DSTLTREQ register **/ +#define DMA_DSTLTREQ_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Destination Last Transaction Request write enable */ +#define DMA_DSTLTREQ_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Destination Last Transaction Request write enable */ +#define DMA_DSTLTREQ_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Destination Last Transaction Request write enable */ +#define DMA_DSTLTREQ_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Destination Last Transaction Request write enable */ +#define DMA_DSTLTREQ_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Destination Last Transaction Request write enable */ +#define DMA_DSTLTREQ_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Destination Last Transaction Request write enable */ +#define DMA_DSTLTREQ_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Destination Last Transaction Request write enable */ +#define DMA_DSTLTREQ_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Destination Last Transaction Request write enable */ +#define DMA_DSTLTREQ_CH7 ((uint32_t)0x00000080U) /* Channel 7 Destination Last Transaction Request */ +#define DMA_DSTLTREQ_CH6 ((uint32_t)0x00000040U) /* Channel 6 Destination Last Transaction Request */ +#define DMA_DSTLTREQ_CH5 ((uint32_t)0x00000020U) /* Channel 5 Destination Last Transaction Request */ +#define DMA_DSTLTREQ_CH4 ((uint32_t)0x00000010U) /* Channel 4 Destination Last Transaction Request */ +#define DMA_DSTLTREQ_CH3 ((uint32_t)0x00000008U) /* Channel 3 Destination Last Transaction Request */ +#define DMA_DSTLTREQ_CH2 ((uint32_t)0x00000004U) /* Channel 2 Destination Last Transaction Request */ +#define DMA_DSTLTREQ_CH1 ((uint32_t)0x00000002U) /* Channel 1 Destination Last Transaction Request */ +#define DMA_DSTLTREQ_CH0 ((uint32_t)0x00000001U) /* Channel 0 Destination Last Transaction Request */ + +/** Bit definition for DMA_CFG ENister **/ +#define DMA_CFG_EN ((uint32_t)0x00000001U) /* DMA Enable bit */ + +/** Bit definition for DMA_CHEN register **/ +#define DMA_CHEN_CH7WEN ((uint32_t)0x00008000U) /* Channel 7 Enable bit write enable */ +#define DMA_CHEN_CH6WEN ((uint32_t)0x00004000U) /* Channel 6 Enable bit write enable */ +#define DMA_CHEN_CH5WEN ((uint32_t)0x00002000U) /* Channel 5 Enable bit write enable */ +#define DMA_CHEN_CH4WEN ((uint32_t)0x00001000U) /* Channel 4 Enable bit write enable */ +#define DMA_CHEN_CH3WEN ((uint32_t)0x00000800U) /* Channel 3 Enable bit write enable */ +#define DMA_CHEN_CH2WEN ((uint32_t)0x00000400U) /* Channel 2 Enable bit write enable */ +#define DMA_CHEN_CH1WEN ((uint32_t)0x00000200U) /* Channel 1 Enable bit write enable */ +#define DMA_CHEN_CH0WEN ((uint32_t)0x00000100U) /* Channel 0 Enable bit write enable */ +#define DMA_CHEN_CH7 ((uint32_t)0x00000080U) /* Channel 7 Enable bit */ +#define DMA_CHEN_CH6 ((uint32_t)0x00000040U) /* Channel 6 Enable bit */ +#define DMA_CHEN_CH5 ((uint32_t)0x00000020U) /* Channel 5 Enable bit */ +#define DMA_CHEN_CH4 ((uint32_t)0x00000010U) /* Channel 4 Enable bit */ +#define DMA_CHEN_CH3 ((uint32_t)0x00000008U) /* Channel 3 Enable bit */ +#define DMA_CHEN_CH2 ((uint32_t)0x00000004U) /* Channel 2 Enable bit */ +#define DMA_CHEN_CH1 ((uint32_t)0x00000002U) /* Channel 1 Enable bit */ +#define DMA_CHEN_CH0 ((uint32_t)0x00000001U) /* Channel 0 Enable bit */ + +/** Bit definition for DMA_ID ENister **/ +#define DMA_ID_VALUE ((uint32_t)0xFFFFFFFFU) /* Hardcoded DMA peripheral ID */ + +/** Bit definition for DMA_LPTIMEOUT ENister **/ +#define DMA_LPTIMEOUT_VALUE ((uint32_t)0xFFFFFFFFU) /* Timeout value of low power counter register */ + + + +/*** DMA AXI Bus Controller (MDMA) ***/ + +/** Bit definition for MDMA_ID register **/ +#define MDMA_ID_NBR ((uint32_t)0xFFFFFFFFU) /* MDMA Component ID Number */ + +/** Bit definition for MDMA_VERSION register **/ +#define MDMA_VERSION_NBR ((uint32_t)0xFFFFFFFFU) /* MDMA Component Version Number */ + +/** Bit definition for MDMA_CFG register **/ +#define MDMA_CFG_GLBINTEN ((uint32_t)0x00000002U) /* Global interrupt generation enable bit */ +#define MDMA_CFG_EN ((uint32_t)0x00000001U) /* MDMA enable bit */ + +/** Bit definition for MDMA_CHEN register **/ +#define MDMA_CHEN_CH15WEN ((uint32_t)0x80000000U) /* Channel 15 Enable bit write enable */ +#define MDMA_CHEN_CH14WEN ((uint32_t)0x40000000U) /* Channel 14 Enable bit write enable */ +#define MDMA_CHEN_CH13WEN ((uint32_t)0x20000000U) /* Channel 13 Enable bit write enable */ +#define MDMA_CHEN_CH12WEN ((uint32_t)0x10000000U) /* Channel 12 Enable bit write enable */ +#define MDMA_CHEN_CH11WEN ((uint32_t)0x08000000U) /* Channel 11 Enable bit write enable */ +#define MDMA_CHEN_CH10WEN ((uint32_t)0x04000000U) /* Channel 10 Enable bit write enable */ +#define MDMA_CHEN_CH9WEN ((uint32_t)0x02000000U) /* Channel 9 Enable bit write enable */ +#define MDMA_CHEN_CH8WEN ((uint32_t)0x01000000U) /* Channel 8 Enable bit write enable */ +#define MDMA_CHEN_CH7WEN ((uint32_t)0x00800000U) /* Channel 7 Enable bit write enable */ +#define MDMA_CHEN_CH6WEN ((uint32_t)0x00400000U) /* Channel 6 Enable bit write enable */ +#define MDMA_CHEN_CH5WEN ((uint32_t)0x00200000U) /* Channel 5 Enable bit write enable */ +#define MDMA_CHEN_CH4WEN ((uint32_t)0x00100000U) /* Channel 4 Enable bit write enable */ +#define MDMA_CHEN_CH3WEN ((uint32_t)0x00080000U) /* Channel 3 Enable bit write enable */ +#define MDMA_CHEN_CH2WEN ((uint32_t)0x00040000U) /* Channel 2 Enable bit write enable */ +#define MDMA_CHEN_CH1WEN ((uint32_t)0x00020000U) /* Channel 1 Enable bit write enable */ +#define MDMA_CHEN_CH0WEN ((uint32_t)0x00010000U) /* Channel 0 Enable bit write enable */ +#define MDMA_CHEN_CH15 ((uint32_t)0x00008000U) /* Channel 15 Enable bit */ +#define MDMA_CHEN_CH14 ((uint32_t)0x00004000U) /* Channel 14 Enable bit */ +#define MDMA_CHEN_CH13 ((uint32_t)0x00002000U) /* Channel 13 Enable bit */ +#define MDMA_CHEN_CH12 ((uint32_t)0x00001000U) /* Channel 12 Enable bit */ +#define MDMA_CHEN_CH11 ((uint32_t)0x00000800U) /* Channel 11 Enable bit */ +#define MDMA_CHEN_CH10 ((uint32_t)0x00000400U) /* Channel 10 Enable bit */ +#define MDMA_CHEN_CH9 ((uint32_t)0x00000200U) /* Channel 9 Enable bit */ +#define MDMA_CHEN_CH8 ((uint32_t)0x00000100U) /* Channel 8 Enable bit */ +#define MDMA_CHEN_CH7 ((uint32_t)0x00000080U) /* Channel 7 Enable bit */ +#define MDMA_CHEN_CH6 ((uint32_t)0x00000040U) /* Channel 6 Enable bit */ +#define MDMA_CHEN_CH5 ((uint32_t)0x00000020U) /* Channel 5 Enable bit */ +#define MDMA_CHEN_CH4 ((uint32_t)0x00000010U) /* Channel 4 Enable bit */ +#define MDMA_CHEN_CH3 ((uint32_t)0x00000008U) /* Channel 3 Enable bit */ +#define MDMA_CHEN_CH2 ((uint32_t)0x00000004U) /* Channel 2 Enable bit */ +#define MDMA_CHEN_CH1 ((uint32_t)0x00000002U) /* Channel 1 Enable bit */ +#define MDMA_CHEN_CH0 ((uint32_t)0x00000001U) /* Channel 0 Enable bit */ + +/** Bit definition for MDMA_CHSUSP register **/ +#define MDMA_CHSUSP_CH15WEN ((uint32_t)0x80000000U) /* Channel 15 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH14WEN ((uint32_t)0x40000000U) /* Channel 14 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH13WEN ((uint32_t)0x20000000U) /* Channel 13 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH12WEN ((uint32_t)0x10000000U) /* Channel 12 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH11WEN ((uint32_t)0x08000000U) /* Channel 11 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH10WEN ((uint32_t)0x04000000U) /* Channel 10 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH9WEN ((uint32_t)0x02000000U) /* Channel 9 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH8WEN ((uint32_t)0x01000000U) /* Channel 8 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH7WEN ((uint32_t)0x00800000U) /* Channel 7 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH6WEN ((uint32_t)0x00400000U) /* Channel 6 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH5WEN ((uint32_t)0x00200000U) /* Channel 5 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH4WEN ((uint32_t)0x00100000U) /* Channel 4 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH3WEN ((uint32_t)0x00080000U) /* Channel 3 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH2WEN ((uint32_t)0x00040000U) /* Channel 2 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH1WEN ((uint32_t)0x00020000U) /* Channel 1 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH0WEN ((uint32_t)0x00010000U) /* Channel 0 Suspend Request bit write enable */ +#define MDMA_CHSUSP_CH15 ((uint32_t)0x00008000U) /* Channel 15 Suspend Request bit */ +#define MDMA_CHSUSP_CH14 ((uint32_t)0x00004000U) /* Channel 14 Suspend Request bit */ +#define MDMA_CHSUSP_CH13 ((uint32_t)0x00002000U) /* Channel 13 Suspend Request bit */ +#define MDMA_CHSUSP_CH12 ((uint32_t)0x00001000U) /* Channel 12 Suspend Request bit */ +#define MDMA_CHSUSP_CH11 ((uint32_t)0x00000800U) /* Channel 11 Suspend Request bit */ +#define MDMA_CHSUSP_CH10 ((uint32_t)0x00000400U) /* Channel 10 Suspend Request bit */ +#define MDMA_CHSUSP_CH9 ((uint32_t)0x00000200U) /* Channel 9 Suspend Request bit */ +#define MDMA_CHSUSP_CH8 ((uint32_t)0x00000100U) /* Channel 8 Suspend Request bit */ +#define MDMA_CHSUSP_CH7 ((uint32_t)0x00000080U) /* Channel 7 Suspend Request bit */ +#define MDMA_CHSUSP_CH6 ((uint32_t)0x00000040U) /* Channel 6 Suspend Request bit */ +#define MDMA_CHSUSP_CH5 ((uint32_t)0x00000020U) /* Channel 5 Suspend Request bit */ +#define MDMA_CHSUSP_CH4 ((uint32_t)0x00000010U) /* Channel 4 Suspend Request bit */ +#define MDMA_CHSUSP_CH3 ((uint32_t)0x00000008U) /* Channel 3 Suspend Request bit */ +#define MDMA_CHSUSP_CH2 ((uint32_t)0x00000004U) /* Channel 2 Suspend Request bit */ +#define MDMA_CHSUSP_CH1 ((uint32_t)0x00000002U) /* Channel 1 Suspend Request bit */ +#define MDMA_CHSUSP_CH0 ((uint32_t)0x00000001U) /* Channel 0 Suspend Request bit */ + +/** Bit definition for MDMA_INTSTS register **/ +#define MDMA_INTSTS_COMREG ((uint64_t)0x100000000UL) /* Common register interrupt status bit */ +#define MDMA_INTSTS_CH15 ((uint64_t)0x000008000UL) /* Channel 15 interrupt status bit */ +#define MDMA_INTSTS_CH14 ((uint64_t)0x000004000UL) /* Channel 14 interrupt status bit */ +#define MDMA_INTSTS_CH13 ((uint64_t)0x000002000UL) /* Channel 13 interrupt status bit */ +#define MDMA_INTSTS_CH12 ((uint64_t)0x000001000UL) /* Channel 12 interrupt status bit */ +#define MDMA_INTSTS_CH11 ((uint64_t)0x000000800UL) /* Channel 11 interrupt status bit */ +#define MDMA_INTSTS_CH10 ((uint64_t)0x000000400UL) /* Channel 10 interrupt status bit */ +#define MDMA_INTSTS_CH9 ((uint64_t)0x000000200UL) /* Channel 9 interrupt status bit */ +#define MDMA_INTSTS_CH8 ((uint64_t)0x000000100UL) /* Channel 8 interrupt status bit */ +#define MDMA_INTSTS_CH7 ((uint64_t)0x000000080UL) /* Channel 7 interrupt status bit */ +#define MDMA_INTSTS_CH6 ((uint64_t)0x000000040UL) /* Channel 6 interrupt status bit */ +#define MDMA_INTSTS_CH5 ((uint64_t)0x000000020UL) /* Channel 5 interrupt status bit */ +#define MDMA_INTSTS_CH4 ((uint64_t)0x000000010UL) /* Channel 4 interrupt status bit */ +#define MDMA_INTSTS_CH3 ((uint64_t)0x000000008UL) /* Channel 3 interrupt status bit */ +#define MDMA_INTSTS_CH2 ((uint64_t)0x000000004UL) /* Channel 2 interrupt status bit */ +#define MDMA_INTSTS_CH1 ((uint64_t)0x000000002UL) /* Channel 1 interrupt status bit */ +#define MDMA_INTSTS_CH0 ((uint64_t)0x000000001UL) /* Channel 0 interrupt status bit */ + +/** Bit definition for MDMA_CRINTCLR register **/ +#define MDMA_CRINTCLR_SIURDEIC ((uint32_t)0x00000100U) /* Slave Interface Undefined Register Decode Error Interrupt Clear bit */ +#define MDMA_CRINTCLR_SICRWOHEIC ((uint32_t)0x00000008U) /* Slave Interface Common Register Write On Hold Error Interrupt Clear bit */ +#define MDMA_CRINTCLR_SICRR2WOEIC ((uint32_t)0x00000004U) /* Slave Interface Common Register Read to Write Only Error Interrupt Clear bit */ +#define MDMA_CRINTCLR_SICRW2ROEIC ((uint32_t)0x00000002U) /* Slave Interface Common Register Write to Read Only Error Interrupt Clear bit */ +#define MDMA_CRINTCLR_SICRDEIC ((uint32_t)0x00000001U) /* Slave Interface Common Register Decode Error Interrupt Clear bit */ + +/** Bit definition for MDMA_CRINTSTSEN register **/ +#define MDMA_CRINTSTSEN_SIURDEIS ((uint32_t)0x00000100U) /* Slave Interface Undefined Register Decode Error Interrupt Status bit */ +#define MDMA_CRINTSTSEN_SICRWOHEIS ((uint32_t)0x00000008U) /* Slave Interface Common Register Write On Hold Error Interrupt Status bit */ +#define MDMA_CRINTSTSEN_SICRR2WOEIS ((uint32_t)0x00000004U) /* Slave Interface Common Register Read to Write Only Error Interrupt Status bit */ +#define MDMA_CRINTSTSEN_SICRW2ROEIS ((uint32_t)0x00000002U) /* Slave Interface Common Register Write to Read Only Error Interrupt Status bit */ +#define MDMA_CRINTSTSEN_SICRDEIS ((uint32_t)0x00000001U) /* Slave Interface Common Register Decode Error Interrupt Status bit */ + +/** Bit definition for MDMA_CRINTSGLEN register **/ +#define MDMA_CRINTSGLEN_SIURDEIS ((uint32_t)0x00000100U) /* Slave Interface Undefined Register Decode Error Interrupt Status bit */ +#define MDMA_CRINTSGLEN_SICRWOHEIS ((uint32_t)0x00000008U) /* Slave Interface Common Register Write On Hold Error Interrupt Status bit */ +#define MDMA_CRINTSGLEN_SICRR2WOEIS ((uint32_t)0x00000004U) /* Slave Interface Common Register Read to Write Only Error Interrupt Status bit */ +#define MDMA_CRINTSGLEN_SICRW2ROEIS ((uint32_t)0x00000002U) /* Slave Interface Common Register Write to Read Only Error Interrupt Status bit */ +#define MDMA_CRINTSGLEN_SICRDEIS ((uint32_t)0x00000001U) /* Slave Interface Common Register Decode Error Interrupt Status bit */ + +/** Bit definition for MDMA_CRINTSTS register **/ +#define MDMA_CRINTSTS_SIURDEIS ((uint32_t)0x00000100U) /* Slave Interface Undefined Register Decode Error Interrupt Status bit */ +#define MDMA_CRINTSTS_SICRWOHEIS ((uint32_t)0x00000008U) /* Slave Interface Common Register Write On Hold Error Interrupt Status bit */ +#define MDMA_CRINTSTS_SICRR2WOEIS ((uint32_t)0x00000004U) /* Slave Interface Common Register Read to Write Only Error Interrupt Status bit */ +#define MDMA_CRINTSTS_SICRW2ROEIS ((uint32_t)0x00000002U) /* Slave Interface Common Register Write to Read Only Error Interrupt Status bit */ +#define MDMA_CRINTSTS_SICRDEIS ((uint32_t)0x00000001U) /* Slave Interface Common Register Decode Error Interrupt Status bit */ + +/** Bit definition for MDMA_SWRST register **/ +#define MDMA_SWRST_RSTREQ ((uint32_t)0x00000001U) /* MDMA Reset Request bit */ + +/** Bit definition for MDMA_LPCFG register **/ +#define MDMA_LPCFG_MXIFLPDLY ((uint64_t)0xFF000000000000UL) /* Bit55:48 */ +#define MDMA_LPCFG_SBIULPDLY ((uint64_t)0x00FF0000000000UL) /* Bit47:40 */ +#define MDMA_LPCFG_GLCHLPDLY ((uint64_t)0x0000FF00000000UL) /* Bit39:32 */ +#define MDMA_LPCFG_MXIFCSLPEN ((uint64_t)0x00000000000008UL) /* AXI Master Interface Context Sensitive Low Power feature enable */ +#define MDMA_LPCFG_SBIUCSLPEN ((uint64_t)0x00000000000004UL) /* SBIU Context Sensitive Low Power feature enable */ +#define MDMA_LPCFG_CHCSLPEN ((uint64_t)0x00000000000002UL) /* MDMA Channel Context Sensitive Low Power feature enable */ +#define MDMA_LPCFG_GBLCSLPEN ((uint64_t)0x00000000000001UL) /* Global Context Sensitive Low Power feature enable */ + +/** Bit definition for MDMA_CHNSA register **/ +#define MDMA_CHNSA_ADDR ((uint64_t)0xFFFFFFFFFFFFFFFFUL) /* Current Source Address of MDMA transfer */ + +/** Bit definition for MDMA_CHNDA register **/ +#define MDMA_CHNDA_ADDR ((uint64_t)0xFFFFFFFFFFFFFFFFUL) /* Current Destination Address of MDMA transfer */ + +/** Bit definition for MDMA_CHNBTS register **/ +#define MDMA_CHNBTS_NUM ((uint32_t)0x003FFFFFU) /* Block Transfer Size */ + +/** Bit definition for MDMA_CHNCTRL register **/ +#define MDMA_CHNCTRL_SRLLI ((uint64_t)0x8000000000000000UL) /* Linked List Item (LLI) valid */ +#define MDMA_CHNCTRL_LSRLLI ((uint64_t)0x4000000000000000UL) /* Linked List Item (LLI) */ +#define MDMA_CHNCTRL_BTIOC ((uint64_t)0x0400000000000000UL) /* Interrupt On Completion of Block Transfer */ +#define MDMA_CHNCTRL_DBL ((uint64_t)0x00FF000000000000UL) /* Destination Burst Length */ +#define MDMA_CHNCTRL_DBLEN ((uint64_t)0x0000800000000000UL) /* Destination Burst Length Enable */ +#define MDMA_CHNCTRL_SBL ((uint64_t)0x00007F8000000000UL) /* Source Burst Length */ +#define MDMA_CHNCTRL_SBLEN ((uint64_t)0x0000004000000000UL) /* Source Burst Length Enable */ +#define MDMA_CHNCTRL_NPLWEN ((uint64_t)0x0000000040000000UL) /* Non Posted Last Write Enable */ +#define MDMA_CHNCTRL_DSTMSIZE ((uint64_t)0x00000000003C0000UL) /* Destination Burst Transaction Length */ +#define MDMA_CHNCTRL_DSTMSIZE_0 ((uint64_t)0x0000000000040000UL) /* Bit18 */ +#define MDMA_CHNCTRL_DSTMSIZE_1 ((uint64_t)0x0000000000080000UL) /* Bit19 */ +#define MDMA_CHNCTRL_DSTMSIZE_2 ((uint64_t)0x0000000000100000UL) /* Bit20 */ +#define MDMA_CHNCTRL_DSTMSIZE_3 ((uint64_t)0x0000000000200000UL) /* Bit21 */ +#define MDMA_CHNCTRL_SRCMSIZE ((uint64_t)0x000000000003C000UL) /* Source Burst Transaction Length */ +#define MDMA_CHNCTRL_SRCMSIZE_0 ((uint64_t)0x0000000000004000UL) /* Bit14 */ +#define MDMA_CHNCTRL_SRCMSIZE_1 ((uint64_t)0x0000000000008000UL) /* Bit15 */ +#define MDMA_CHNCTRL_SRCMSIZE_2 ((uint64_t)0x0000000000010000UL) /* Bit16 */ +#define MDMA_CHNCTRL_SRCMSIZE_3 ((uint64_t)0x0000000000020000UL) /* Bit17 */ +#define MDMA_CHNCTRL_DTW ((uint64_t)0x0000000000003800UL) /* Destination Transfer Width */ +#define MDMA_CHNCTRL_DTW_0 ((uint64_t)0x0000000000000800UL) /* Bit11 */ +#define MDMA_CHNCTRL_DTW_1 ((uint64_t)0x0000000000001000UL) /* Bit12 */ +#define MDMA_CHNCTRL_DTW_2 ((uint64_t)0x0000000000002000UL) /* Bit13 */ +#define MDMA_CHNCTRL_STW ((uint64_t)0x0000000000000700UL) /* Source Transfer Width */ +#define MDMA_CHNCTRL_STW_0 ((uint64_t)0x0000000000000100UL) /* Bit8 */ +#define MDMA_CHNCTRL_STW_1 ((uint64_t)0x0000000000000200UL) /* Bit9 */ +#define MDMA_CHNCTRL_STW_2 ((uint64_t)0x0000000000000400UL) /* Bit10 */ +#define MDMA_CHNCTRL_DINC ((uint64_t)0x0000000000000040UL) /* Destination Address Increment */ +#define MDMA_CHNCTRL_SINC ((uint64_t)0x0000000000000010UL) /* Source Address Increment */ +#define MDMA_CHNCTRL_DMS ((uint64_t)0x0000000000000004UL) /* Destination Master Select */ +#define MDMA_CHNCTRL_SMS ((uint64_t)0x0000000000000001UL) /* Source Master Select */ + +/** Bit definition for MDMA_CHNCFG register **/ +#define MDMA_CHNCFG_DSTOSRLMT ((uint64_t)0x7800000000000000UL) /* Destination Outstanding Request Limit */ +#define MDMA_CHNCFG_DSTOSRLMT_0 ((uint64_t)0x0000000000000000UL) /* Bit59*/ +#define MDMA_CHNCFG_DSTOSRLMT_1 ((uint64_t)0x0000000000000000UL) /* Bit60*/ +#define MDMA_CHNCFG_DSTOSRLMT_2 ((uint64_t)0x0000000000000000UL) /* Bit61*/ +#define MDMA_CHNCFG_DSTOSRLMT_3 ((uint64_t)0x0000000000000000UL) /* Bit62*/ +#define MDMA_CHNCFG_SRCOSRLMT ((uint64_t)0x0780000000000000UL) /* Source Outstanding Request Limit */ +#define MDMA_CHNCFG_SRCOSRLMT_0 ((uint64_t)0x0000000000000000UL) /* Bit55*/ +#define MDMA_CHNCFG_SRCOSRLMT_1 ((uint64_t)0x0000000000000000UL) /* Bit56*/ +#define MDMA_CHNCFG_SRCOSRLMT_2 ((uint64_t)0x0000000000000000UL) /* Bit57*/ +#define MDMA_CHNCFG_SRCOSRLMT_3 ((uint64_t)0x0000000000000000UL) /* Bit58*/ +#define MDMA_CHNCFG_CHPRIOR ((uint64_t)0x000F800000000000UL) /* Channel Priority */ +#define MDMA_CHNCFG_DSTHHIPOL ((uint64_t)0x0000004000000000UL) /* Destination Hardware Handshaking Interface Polarity */ +#define MDMA_CHNCFG_SRCHHIPOL ((uint64_t)0x0000002000000000UL) /* Source Hardware Handshaking Interface Polarity */ +#define MDMA_CHNCFG_HSSELDST ((uint64_t)0x0000001000000000UL) /* Destination Software or Hardware Handshaking Select */ +#define MDMA_CHNCFG_HSSELSRC ((uint64_t)0x0000000800000000UL) /* Source Software or Hardware Handshaking Select */ +#define MDMA_CHNCFG_TTFC ((uint64_t)0x0000000700000000UL) /* Transfer Type and Flow Control */ +#define MDMA_CHNCFG_TTFC_0 ((uint64_t)0x0000000100000000UL) /* Bit32*/ +#define MDMA_CHNCFG_TTFC_1 ((uint64_t)0x0000000200000000UL) /* Bit33*/ +#define MDMA_CHNCFG_TTFC_2 ((uint64_t)0x0000000400000000UL) /* Bit34*/ +#define MDMA_CHNCFG_WRUID ((uint64_t)0x000000001E000000UL) /* Defines the number of AXI Unique ID's supported for the AXI Write Channel */ +#define MDMA_CHNCFG_RDUID ((uint64_t)0x00000000003C0000UL) /* Defines the number of AXI Unique ID's supported for the AXI Read Channel */ +#define MDMA_CHNCFG_DSTPER ((uint64_t)0x0000000000007800UL) /* Bit14:11 */ +#define MDMA_CHNCFG_SRCPER ((uint64_t)0x00000000000000F0UL) /* Bit7:4 */ +#define MDMA_CHNCFG_DMBTT ((uint64_t)0x000000000000000CUL) /* Destination Multi Block Transfer Type */ +#define MDMA_CHNCFG_DMBTT_0 ((uint64_t)0x0000000000000004UL) /* Bit2*/ +#define MDMA_CHNCFG_DMBTT_1 ((uint64_t)0x0000000000000008UL) /* Bit3*/ +#define MDMA_CHNCFG_SMBTT ((uint64_t)0x0000000000000003UL) /* Source Multi Block Transfer Type */ +#define MDMA_CHNCFG_SMBTT_0 ((uint64_t)0x0000000000000001UL) /* Bit0*/ +#define MDMA_CHNCFG_SMBTT_1 ((uint64_t)0x0000000000000002UL) /* Bit1*/ + +/** Bit definition for MDMA_CHNLLP register **/ +#define MDMA_CHNLLP_ADDR ((uint64_t)0xFFFFFFFFFFFFFFC0UL) /* Starting Address Memory of LLI block */ +#define MDMA_CHNLLP_LMS ((uint64_t)0x0000000000000001UL) /* LLI master Select */ + +/** Bit definition for MDMA_CHNSTS register **/ +#define MDMA_CHNSTS_LEFTDATA ((uint64_t)0x7FFF00000000UL) /* Data Left in FIFO */ +#define MDMA_CHNSTS_CBTSIZE ((uint64_t)0x0000003FFFFFUL) /* Completed Block Transfer Size */ + +/** Bit definition for MDMA_CHNSHSRC register **/ +#define MDMA_CHNSHSRC_SHLRWE ((uint32_t)0x00000020U) /* Write Enable bit for Software Handshake Last Request for Channel Source */ +#define MDMA_CHNSHSRC_SHLR ((uint32_t)0x00000010U) /* Software Handshake Last Request for Channel Source */ +#define MDMA_CHNSHSRC_SHSRWE ((uint32_t)0x00000008U) /* Write Enable bit for Software Handshake Single Request for Channel Source */ +#define MDMA_CHNSHSRC_SHSR ((uint32_t)0x00000004U) /* Software Handshake Single Request for Channel Source */ +#define MDMA_CHNSHSRC_SHRWE ((uint32_t)0x00000002U) /* Write Enable bit for Software Handshake Request for Channel Source */ +#define MDMA_CHNSHSRC_SHR ((uint32_t)0x00000001U) /* Software Handshake Request for Channel Source */ + +/** Bit definition for MDMA_CHNSHDST register **/ +#define MDMA_CHNSHDST_SHLRWE ((uint32_t)0x00000020U) /* Write Enable bit for Software Handshake Last Request for Channel Destination */ +#define MDMA_CHNSHDST_SHLR ((uint32_t)0x00000010U) /* Software Handshake Last Request for Channel Destination */ +#define MDMA_CHNSHDST_SHSRWE ((uint32_t)0x00000008U) /* Write Enable bit for Software Handshake Single Request for Channel Destination */ +#define MDMA_CHNSHDST_SHSR ((uint32_t)0x00000004U) /* Software Handshake Single Request for Channel Destination */ +#define MDMA_CHNSHDST_SHRWE ((uint32_t)0x00000002U) /* Write Enable bit for Software Handshake Request for Channel Destination */ +#define MDMA_CHNSHDST_SHR ((uint32_t)0x00000001U) /* Software Handshake Request for Channel Destination */ + +/** Bit definition for MDMA_CHNBTRR register **/ +#define MDMA_CHNBTRR_RESREQ ((uint32_t)0x00000001U) /* Block Transfer Resume Request during Linked-List-based multi-block transfer */ + +/** Bit definition for MDMA_CHNAXIQOS register **/ +#define MDMA_CHNAXIQOS_ARQOS ((uint32_t)0x000000F0U) /* AXI ARQOS */ +#define MDMA_CHNAXIQOS_AWQOS ((uint32_t)0x0000000FU) /* AXI AWQOS */ + +/** Bit definition for MDMA_CHNINTSTSEN register **/ +#define MDMA_CHNINTSTSEN_CHA ((uint32_t)0x80000000U) /* Channel Aborted */ +#define MDMA_CHNINTSTSEN_CHD ((uint32_t)0x40000000U) /* Channel Disabled */ +#define MDMA_CHNINTSTSEN_CHS ((uint32_t)0x20000000U) /* Channel Suspended */ +#define MDMA_CHNINTSTSEN_CHSS ((uint32_t)0x10000000U) /* Channel Source Suspended */ +#define MDMA_CHNINTSTSEN_CHLC ((uint32_t)0x08000000U) /* Channel Lock Cleared */ +#define MDMA_CHNINTSTSEN_SIWOHE ((uint32_t)0x00200000U) /* Slave Interface Write On Hold Error */ +#define MDMA_CHNINTSTSEN_SIWOCEE ((uint32_t)0x00080000U) /* Slave Interface Write On Channel Enabled Error */ +#define MDMA_CHNINTSTSEN_SIRTWOE ((uint32_t)0x00040000U) /* Slave Interface Read to Write Only Error */ +#define MDMA_CHNINTSTSEN_SIWTROE ((uint32_t)0x00020000U) /* Slave Interface Write to Read Only Error */ +#define MDMA_CHNINTSTSEN_SIDE ((uint32_t)0x00010000U) /* Slave Interface Decode Error */ +#define MDMA_CHNINTSTSEN_SIMBTE ((uint32_t)0x00004000U) /* Slave Interface Multi Block Type Error */ +#define MDMA_CHNINTSTSEN_SLIE ((uint32_t)0x00002000U) /* LLI Invalid Error */ +#define MDMA_CHNINTSTSEN_LWSE ((uint32_t)0x00001000U) /* LLI Write Slave Error */ +#define MDMA_CHNINTSTSEN_LRSE ((uint32_t)0x00000800U) /* LLI Read Slave Error */ +#define MDMA_CHNINTSTSEN_LWDE ((uint32_t)0x00000400U) /* LLI Write Decode Error */ +#define MDMA_CHNINTSTSEN_LRDE ((uint32_t)0x00000200U) /* LLI Read Decode Error */ +#define MDMA_CHNINTSTSEN_DSTSE ((uint32_t)0x00000100U) /* Destination Slave Error */ +#define MDMA_CHNINTSTSEN_SRCSE ((uint32_t)0x00000080U) /* Source Slave Error */ +#define MDMA_CHNINTSTSEN_DSTDE ((uint32_t)0x00000040U) /* Destination Decode Error */ +#define MDMA_CHNINTSTSEN_SRCDE ((uint32_t)0x00000020U) /* Source Decode Error */ +#define MDMA_CHNINTSTSEN_DSTTC ((uint32_t)0x00000010U) /* Destination Transaction Completed */ +#define MDMA_CHNINTSTSEN_SRCTC ((uint32_t)0x00000008U) /* Source Transaction Completed */ +#define MDMA_CHNINTSTSEN_DMATD ((uint32_t)0x00000002U) /* DMA Transfer Done */ +#define MDMA_CHNINTSTSEN_BLKTD ((uint32_t)0x00000001U) /* Block Transfer Done */ + +/** Bit definition for MDMA_CHNINTSTS register **/ +#define MDMA_CHNINTSTS_CHA ((uint32_t)0x80000000U) /* Channel Aborted */ +#define MDMA_CHNINTSTS_CHD ((uint32_t)0x40000000U) /* Channel Disabled */ +#define MDMA_CHNINTSTS_CHS ((uint32_t)0x20000000U) /* Channel Suspended */ +#define MDMA_CHNINTSTS_CHSS ((uint32_t)0x10000000U) /* Channel Source Suspended */ +#define MDMA_CHNINTSTS_CHLC ((uint32_t)0x08000000U) /* Channel Lock Cleared */ +#define MDMA_CHNINTSTS_SIWOHE ((uint32_t)0x00200000U) /* Slave Interface Write On Hold Error */ +#define MDMA_CHNINTSTS_SIWOCEE ((uint32_t)0x00080000U) /* Slave Interface Write On Channel Enabled Error */ +#define MDMA_CHNINTSTS_SIRTWOE ((uint32_t)0x00040000U) /* Slave Interface Read to Write Only Error */ +#define MDMA_CHNINTSTS_SIWTROE ((uint32_t)0x00020000U) /* Slave Interface Write to Read Only Error */ +#define MDMA_CHNINTSTS_SIDE ((uint32_t)0x00010000U) /* Slave Interface Decode Error */ +#define MDMA_CHNINTSTS_SIMBTE ((uint32_t)0x00004000U) /* Slave Interface Multi Block Type Error */ +#define MDMA_CHNINTSTS_SLIE ((uint32_t)0x00002000U) /* LLI Invalid Error */ +#define MDMA_CHNINTSTS_LWSE ((uint32_t)0x00001000U) /* LLI Write Slave Error */ +#define MDMA_CHNINTSTS_LRSE ((uint32_t)0x00000800U) /* LLI Read Slave Error */ +#define MDMA_CHNINTSTS_LWDE ((uint32_t)0x00000400U) /* LLI Write Decode Error */ +#define MDMA_CHNINTSTS_LRDE ((uint32_t)0x00000200U) /* LLI Read Decode Error */ +#define MDMA_CHNINTSTS_DSTSE ((uint32_t)0x00000100U) /* Destination Slave Error */ +#define MDMA_CHNINTSTS_SRCSE ((uint32_t)0x00000080U) /* Source Slave Error */ +#define MDMA_CHNINTSTS_DSTDE ((uint32_t)0x00000040U) /* Destination Decode Error */ +#define MDMA_CHNINTSTS_SRCDE ((uint32_t)0x00000020U) /* Source Decode Error */ +#define MDMA_CHNINTSTS_DSTTC ((uint32_t)0x00000010U) /* Destination Transaction Completed */ +#define MDMA_CHNINTSTS_SRCTC ((uint32_t)0x00000008U) /* Source Transaction Completed */ +#define MDMA_CHNINTSTS_DMATD ((uint32_t)0x00000002U) /* DMA Transfer Done */ +#define MDMA_CHNINTSTS_BLKTD ((uint32_t)0x00000001U) /* Block Transfer Done */ + +/** Bit definition for MDMA_CHNINTSGLEN register **/ +#define MDMA_CHNINTSGLEN_CHA ((uint32_t)0x80000000U) /* Channel Aborted */ +#define MDMA_CHNINTSGLEN_CHD ((uint32_t)0x40000000U) /* Channel Disabled */ +#define MDMA_CHNINTSGLEN_CHS ((uint32_t)0x20000000U) /* Channel Suspended */ +#define MDMA_CHNINTSGLEN_CHSS ((uint32_t)0x10000000U) /* Channel Source Suspended */ +#define MDMA_CHNINTSGLEN_CHLC ((uint32_t)0x08000000U) /* Channel Lock Cleared */ +#define MDMA_CHNINTSGLEN_SIWOHE ((uint32_t)0x00200000U) /* Slave Interface Write On Hold Error */ +#define MDMA_CHNINTSGLEN_SIWOCEE ((uint32_t)0x00080000U) /* Slave Interface Write On Channel Enabled Error */ +#define MDMA_CHNINTSGLEN_SIRTWOE ((uint32_t)0x00040000U) /* Slave Interface Read to Write Only Error */ +#define MDMA_CHNINTSGLEN_SIWTROE ((uint32_t)0x00020000U) /* Slave Interface Write to Read Only Error */ +#define MDMA_CHNINTSGLEN_SIDE ((uint32_t)0x00010000U) /* Slave Interface Decode Error */ +#define MDMA_CHNINTSGLEN_SIMBTE ((uint32_t)0x00004000U) /* Slave Interface Multi Block Type Error */ +#define MDMA_CHNINTSGLEN_SLIE ((uint32_t)0x00002000U) /* LLI Invalid Error */ +#define MDMA_CHNINTSGLEN_LWSE ((uint32_t)0x00001000U) /* LLI Write Slave Error */ +#define MDMA_CHNINTSGLEN_LRSE ((uint32_t)0x00000800U) /* LLI Read Slave Error */ +#define MDMA_CHNINTSGLEN_LWDE ((uint32_t)0x00000400U) /* LLI Write Decode Error */ +#define MDMA_CHNINTSGLEN_LRDE ((uint32_t)0x00000200U) /* LLI Read Decode Error */ +#define MDMA_CHNINTSGLEN_DSTSE ((uint32_t)0x00000100U) /* Destination Slave Error */ +#define MDMA_CHNINTSGLEN_SRCSE ((uint32_t)0x00000080U) /* Source Slave Error */ +#define MDMA_CHNINTSGLEN_DSTDE ((uint32_t)0x00000040U) /* Destination Decode Error */ +#define MDMA_CHNINTSGLEN_SRCDE ((uint32_t)0x00000020U) /* Source Decode Error */ +#define MDMA_CHNINTSGLEN_DSTTC ((uint32_t)0x00000010U) /* Destination Transaction Completed */ +#define MDMA_CHNINTSGLEN_SRCTC ((uint32_t)0x00000008U) /* Source Transaction Completed */ +#define MDMA_CHNINTSGLEN_DMATD ((uint32_t)0x00000002U) /* DMA Transfer Done */ +#define MDMA_CHNINTSGLEN_BLKTD ((uint32_t)0x00000001U) /* Block Transfer Done */ + +/** Bit definition for MDMA_CHNINTCLR register **/ +#define MDMA_CHNINTCLR_CHA ((uint32_t)0x80000000U) /* Channel Aborted */ +#define MDMA_CHNINTCLR_CHD ((uint32_t)0x40000000U) /* Channel Disabled */ +#define MDMA_CHNINTCLR_CHS ((uint32_t)0x20000000U) /* Channel Suspended */ +#define MDMA_CHNINTCLR_CHSS ((uint32_t)0x10000000U) /* Channel Source Suspended */ +#define MDMA_CHNINTCLR_CHLC ((uint32_t)0x08000000U) /* Channel Lock Cleared */ +#define MDMA_CHNINTCLR_SIWOHE ((uint32_t)0x00200000U) /* Slave Interface Write On Hold Error */ +#define MDMA_CHNINTCLR_SIWOCEE ((uint32_t)0x00080000U) /* Slave Interface Write On Channel Enabled Error */ +#define MDMA_CHNINTCLR_SIRTWOE ((uint32_t)0x00040000U) /* Slave Interface Read to Write Only Error */ +#define MDMA_CHNINTCLR_SIWTROE ((uint32_t)0x00020000U) /* Slave Interface Write to Read Only Error */ +#define MDMA_CHNINTCLR_SIDE ((uint32_t)0x00010000U) /* Slave Interface Decode Error */ +#define MDMA_CHNINTCLR_SIMBTE ((uint32_t)0x00004000U) /* Slave Interface Multi Block Type Error */ +#define MDMA_CHNINTCLR_SLIE ((uint32_t)0x00002000U) /* LLI Invalid Error */ +#define MDMA_CHNINTCLR_LWSE ((uint32_t)0x00001000U) /* LLI Write Slave Error */ +#define MDMA_CHNINTCLR_LRSE ((uint32_t)0x00000800U) /* LLI Read Slave Error */ +#define MDMA_CHNINTCLR_LWDE ((uint32_t)0x00000400U) /* LLI Write Decode Error */ +#define MDMA_CHNINTCLR_LRDE ((uint32_t)0x00000200U) /* LLI Read Decode Error */ +#define MDMA_CHNINTCLR_DSTSE ((uint32_t)0x00000100U) /* Destination Slave Error */ +#define MDMA_CHNINTCLR_SRCSE ((uint32_t)0x00000080U) /* Source Slave Error */ +#define MDMA_CHNINTCLR_DSTDE ((uint32_t)0x00000040U) /* Destination Decode Error */ +#define MDMA_CHNINTCLR_SRCDE ((uint32_t)0x00000020U) /* Source Decode Error */ +#define MDMA_CHNINTCLR_DSTTC ((uint32_t)0x00000010U) /* Destination Transaction Completed */ +#define MDMA_CHNINTCLR_SRCTC ((uint32_t)0x00000008U) /* Source Transaction Completed */ +#define MDMA_CHNINTCLR_DMATD ((uint32_t)0x00000002U) /* DMA Transfer Done */ +#define MDMA_CHNINTCLR_BLKTD ((uint32_t)0x00000001U) /* Block Transfer Done */ + + + + + +/******************************************************************************/ +/* */ +/* DMAMUX */ +/* */ +/******************************************************************************/ + + +/******** Bit definition for DMAMUX_CHxCTRL register ********/ +#define DMAMUX_CHxCTRL_SYID_MASK ((uint32_t)0x0F000000U) /* Bit[27:24] */ +#define DMAMUX_CHxCTRL_SYID_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define DMAMUX_CHxCTRL_SYID_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define DMAMUX_CHxCTRL_SYID_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define DMAMUX_CHxCTRL_SYID_3 ((uint32_t)0x08000000U) /* Bit27*/ + +#define DMAMUX_CHxCTRL_NUMREQ_MASK ((uint32_t)0x00F80000U) /* Bit[23:19] */ +#define DMAMUX_CHxCTRL_NUMREQ_0 ((uint32_t)0x00080000U) /* Bit19*/ +#define DMAMUX_CHxCTRL_NUMREQ_1 ((uint32_t)0x00100000U) /* Bit20*/ +#define DMAMUX_CHxCTRL_NUMREQ_2 ((uint32_t)0x00200000U) /* Bit21*/ +#define DMAMUX_CHxCTRL_NUMREQ_3 ((uint32_t)0x00400000U) /* Bit22*/ +#define DMAMUX_CHxCTRL_NUMREQ_4 ((uint32_t)0x00800000U) /* Bit23*/ + +#define DMAMUX_CHxCTRL_SYPOL_MASK ((uint32_t)0x00060000U) /* Bit[18:17] */ +#define DMAMUX_CHxCTRL_SYPOL_0 ((uint32_t)0x00020000U) /* Bit17*/ +#define DMAMUX_CHxCTRL_SYPOL_1 ((uint32_t)0x00040000U) /* Bit18*/ +#define DMAMUX_CHxCTRL_SYEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define DMAMUX_CHxCTRL_EVEGEN ((uint32_t)0x00000200U) /* Bit[9] */ +#define DMAMUX_CHxCTRL_SOIEN ((uint32_t)0x00000100U) /* Bit[8] */ + +#define DMAMUX_CHxCTRL_REQID_MASK ((uint32_t)0x000000FFU) /* Bit[7:0] */ +#define DMAMUX_CHxCTRL_REQID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define DMAMUX_CHxCTRL_REQID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define DMAMUX_CHxCTRL_REQID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define DMAMUX_CHxCTRL_REQID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define DMAMUX_CHxCTRL_REQID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define DMAMUX_CHxCTRL_REQID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define DMAMUX_CHxCTRL_REQID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define DMAMUX_CHxCTRL_REQID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/******** Bit definition for DMAMUX_STS register ********/ +#define DMAMUX_STS_SOFx ((uint32_t)0x00FFFFFFU) /* Bit[23:0] */ + +/******** Bit definition for DMAMUX_CLR register ********/ +#define DMAMUX_CLR_CSOFx ((uint32_t)0x00FFFFFFU) /* Bit[23:0] */ + +/******** Bit definition for DMAMUX_CHxCFG register ********/ +#define DMAMUX_CHxCFG_GNUMREQ_MASK ((uint32_t)0x00F80000U) /* Bit[23:19] */ +#define DMAMUX_CHxCFG_GNUMREQ_0 ((uint32_t)0x00080000U) /* Bit19*/ +#define DMAMUX_CHxCFG_GNUMREQ_1 ((uint32_t)0x00100000U) /* Bit20*/ +#define DMAMUX_CHxCFG_GNUMREQ_2 ((uint32_t)0x00200000U) /* Bit21*/ +#define DMAMUX_CHxCFG_GNUMREQ_3 ((uint32_t)0x00400000U) /* Bit22*/ +#define DMAMUX_CHxCFG_GNUMREQ_4 ((uint32_t)0x00800000U) /* Bit23*/ + +#define DMAMUX_CHxCFG_GPOL_MASK ((uint32_t)0x00060000U) /* Bit[18:17] */ +#define DMAMUX_CHxCFG_GPOL_0 ((uint32_t)0x00020000U) /* Bit17*/ +#define DMAMUX_CHxCFG_GPOL_1 ((uint32_t)0x00040000U) /* Bit18*/ + +#define DMAMUX_CHxCFG_GEN ((uint32_t)0x00010000U) /* Bit[16] */ +#define DMAMUX_CHxCFG_TOVIEN ((uint32_t)0x00000100U) /* Bit[8] */ + +#define DMAMUX_CHxCFG_SYID_MASK ((uint32_t)0x0000003FU) /* Bit[5:0] */ +#define DMAMUX_CHxCFG_SYID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define DMAMUX_CHxCFG_SYID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define DMAMUX_CHxCFG_SYID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define DMAMUX_CHxCFG_SYID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define DMAMUX_CHxCFG_SYID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define DMAMUX_CHxCFG_SYID_5 ((uint32_t)0x00000020U) /* Bit5*/ + +/******** Bit definition for DMAMUX_RGSTS register ********/ +#define DMAMUX_RGSTS_OFx ((uint32_t)0x0000FFFF) /* Bit[15:0] */ + +/******** Bit definition for DMAMUX_RGCLR register ********/ +#define DMAMUX_RGCLR_COFx ((uint32_t)0x0000FFFF) /* Bit[15:0] */ + + + +/******************************************************************************/ +/* */ +/* DCMU Dualcore Messaging Unit */ +/* */ +/******************************************************************************/ +/******************* Bit definition for DCMU_STS register ********************/ +#define DCMU_STS_RCVFN0_Pos (0U) +#define DCMU_STS_RCVFN0 ((uint32_t)0x00000001U) /* dualcore messaging status register flag 0 bit */ +#define DCMU_STS_RCVFN1 ((uint32_t)0x00000002U) /* dualcore messaging status register flag 1 bit */ +#define DCMU_STS_RCVFN2 ((uint32_t)0x00000004U) /* dualcore messaging status register flag 2 bit */ +#define DCMU_STS_EPF ((uint32_t)0x00000010U) /* dualcore messaging status register event pending flag bit */ +#define DCMU_STS_RSTF ((uint32_t)0x00000080U) /* dualcore messaging status register other core reset status bit */ +#define DCMU_STS_FUPF ((uint32_t)0x00000100U) /* dualcore messaging status register flag update pending flag bit */ +#define DCMU_STS_TEF3_Pos (20U) +#define DCMU_STS_TEF3 ((uint32_t)0x00100000U) /* dualcore messaging status register transmit 3 empty bit */ +#define DCMU_STS_TEF2 ((uint32_t)0x00200000U) /* dualcore messaging status register transmit 2 empty bit */ +#define DCMU_STS_TEF1 ((uint32_t)0x00400000U) /* dualcore messaging status register transmit 1 empty bit */ +#define DCMU_STS_TEF0 ((uint32_t)0x00800000U) /* dualcore messaging status register transmit 0 empty bit */ +#define DCMU_STS_RFF3_Pos (24U) +#define DCMU_STS_RFF3 ((uint32_t)0x01000000U) /* dualcore messaging status register receive 3 full bit */ +#define DCMU_STS_RFF2 ((uint32_t)0x02000000U) /* dualcore messaging status register receive 2 full bit */ +#define DCMU_STS_RFF1 ((uint32_t)0x04000000U) /* dualcore messaging status register receive 1 full bit */ +#define DCMU_STS_RFF0 ((uint32_t)0x08000000U) /* dualcore messaging status register receive 0 full bit */ +#define DCMU_STS_GPIF3_Pos (28U) +#define DCMU_STS_GPIF3 ((uint32_t)0x10000000U) /* dualcore messaging status register general interrupt from other core request 3 pending bit */ +#define DCMU_STS_GPIF2 ((uint32_t)0x20000000U) /* dualcore messaging status register general interrupt from other core request 2 pending bit */ +#define DCMU_STS_GPIF1 ((uint32_t)0x40000000U) /* dualcore messaging status register general interrupt from other core request 1 pending bit */ +#define DCMU_STS_GPIF0 ((uint32_t)0x80000000U) /* dualcore messaging status register general interrupt from other core request 0 pending bit */ + +/******************* Bit definition for DCMU_CTRL register ********************/ +#define DCMU_CTRL_TXFN0_Pos (0U) +#define DCMU_CTRL_TXFN0 ((uint32_t)0x00000001U) /* dualcore messaging control register flag 0 bit */ +#define DCMU_CTRL_TXFN1 ((uint32_t)0x00000002U) /* dualcore messaging control register flag 1 bit */ +#define DCMU_CTRL_TXFN2 ((uint32_t)0x00000004U) /* dualcore messaging control register flag 2 bit */ +#if defined(CORE_CM7) +#define DCMU_CTRL_RST ((uint32_t)0x00000020U) /* dualcore messaging control register reset both cores bit */ +#endif +#define DCMU_CTRL_GPIR3_Pos (16U) +#define DCMU_CTRL_GPIR3 ((uint32_t)0x00010000U) /* dualcore messaging control register general interrupt to other core request 3 pending bit */ +#define DCMU_CTRL_GPIR2 ((uint32_t)0x00020000U) /* dualcore messaging control register general interrupt to other core request 2 pending bit */ +#define DCMU_CTRL_GPIR1 ((uint32_t)0x00040000U) /* dualcore messaging control register general interrupt to other core request 1 pending bit */ +#define DCMU_CTRL_GPIR0 ((uint32_t)0x00080000U) /* dualcore messaging control register general interrupt to other core request 0 pending bit */ +#define DCMU_CTRL_TEIE3_Pos (20U) +#define DCMU_CTRL_TEIE3 ((uint32_t)0x00100000U) /* dualcore messaging control register transmit 3 interrupt enable bit */ +#define DCMU_CTRL_TEIE2 ((uint32_t)0x00200000U) /* dualcore messaging control register transmit 2 interrupt enable bit */ +#define DCMU_CTRL_TEIE1 ((uint32_t)0x00400000U) /* dualcore messaging control register transmit 1 interrupt enable bit */ +#define DCMU_CTRL_TEIE0 ((uint32_t)0x00800000U) /* dualcore messaging control register transmit 0 interrupt enable bit */ +#define DCMU_CTRL_RFIE3_Pos (24U) +#define DCMU_CTRL_RFIE3 ((uint32_t)0x01000000U) /* dualcore messaging control register receive 3 interrupt enable bit */ +#define DCMU_CTRL_RFIE2 ((uint32_t)0x02000000U) /* dualcore messaging control register receive 2 interrupt enable bit */ +#define DCMU_CTRL_RFIE1 ((uint32_t)0x04000000U) /* dualcore messaging control register receive 1 interrupt enable bit */ +#define DCMU_CTRL_RFIE0 ((uint32_t)0x08000000U) /* dualcore messaging control register receive 0 interrupt enable bit */ +#define DCMU_CTRL_GPIE3_Pos (28U) +#define DCMU_CTRL_GPIE3 ((uint32_t)0x10000000U) /* dualcore messaging control register general purpose 3 interrupt enable bit */ +#define DCMU_CTRL_GPIE2 ((uint32_t)0x20000000U) /* dualcore messaging control register general purpose 2 interrupt enable bit */ +#define DCMU_CTRL_GPIE1 ((uint32_t)0x40000000U) /* dualcore messaging control register general purpose 1 interrupt enable bit */ +#define DCMU_CTRL_GPIE0 ((uint32_t)0x80000000U) /* dualcore messaging control register general purpose 0 interrupt enable bit */ + +/******************************************************************************/ +/* */ +/* SEMA4 HW Semaphore */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for SEMA4_R register ********************/ +#define SEMA4_R_PROCID_Pos (0U) +#define SEMA4_R_PROCID ((uint32_t)0x000000FFU) /* Semaphore ProcessID */ +#define SEMA4_R_COREID_Pos (8U) +#define SEMA4_R_COREID ((uint32_t)0x0000FF00U) /* Semaphore CoreID. */ +#define SEMA4_R_LOCK ((uint32_t)0x80000000U) /* Lock indication. */ + +/******************** Bit definition for SEMA4_RL register ******************/ +#define SEMA4_RL_PROCID_Pos (0U) +#define SEMA4_RL_PROCID ((uint32_t)0x000000FFU) /* Semaphore ProcessID */ +#define SEMA4_RL_COREID_Pos (8U) +#define SEMA4_RL_COREID ((uint32_t)0x0000FF00U) /* Semaphore CoreID. */ +#define SEMA4_RL_LOCK_Pos (31U) +#define SEMA4_RL_LOCK ((uint32_t)0x80000000U) /* Lock indication. */ + +/******************** Bit definition for SEMA4_CLR register *****************/ +#define SEMA4_CLR_COREID_OFFSET (8U) +#define SEMA4_CLR_COREID ((uint32_t)0x0000FF00U) /* CoreID of semaphores to be cleared. */ +#define SEMA4_CLR_KEY_OFFSET (16U) +#define SEMA4_CLR_KEY ((uint32_t)0xFFFF0000U) /* semaphores clear key. */ + +/******************** Bit definition for SEMA4_KEYCLR register *****************/ +#define SEMA4_KEYR_KEY_OFFSET (16U) +#define SEMA4_KEYCLR_KEY ((uint32_t)0xFFFF0000U) /* semaphores clear key. */ + +/*** CORDIC Processors ***/ + +/** Bit definition for CORDIC_CTRLSTS register **/ +#define CORDIC_CTRLSTS_FUNC ((uint32_t)0x0000000FU) /* bit[3:0] Function bits[3:0] */ +#define CORDIC_CTRLSTS_FUNC_0 ((uint32_t)0x00000001U) /* bit[0] Function bit 0 */ +#define CORDIC_CTRLSTS_FUNC_1 ((uint32_t)0x00000002U) /* bit[1] Function bit 1 */ +#define CORDIC_CTRLSTS_FUNC_2 ((uint32_t)0x00000004U) /* bit[2] Function bit 2 */ +#define CORDIC_CTRLSTS_FUNC_3 ((uint32_t)0x00000008U) /* bit[3] Function bit 3 */ + +#define CORDIC_CTRLSTS_PRECISION ((uint32_t)0x000000F0U) /* bit[7:4] Precision required (number of iterations) bits[3:0] */ +#define CORDIC_CTRLSTS_PRECISION_0 ((uint32_t)0x00000010U) /* bit[4] Precision bit 0 */ +#define CORDIC_CTRLSTS_PRECISION_1 ((uint32_t)0x00000020U) /* bit[5] Precision bit 1 */ +#define CORDIC_CTRLSTS_PRECISION_2 ((uint32_t)0x00000040U) /* bit[6] Precision bit 2 */ +#define CORDIC_CTRLSTS_PRECISION_3 ((uint32_t)0x00000080U) /* bit[7] Precision bit 3 */ + +#define CORDIC_CTRLSTS_SCALE ((uint32_t)0x00000700U) /* bit[10:8] Scaling factor bits[2:0] */ +#define CORDIC_CTRLSTS_SCALE_0 ((uint32_t)0x00000100U) /* bit[4] Scaling bit 0 */ +#define CORDIC_CTRLSTS_SCALE_1 ((uint32_t)0x00000200U) /* bit[5] Scaling bit 1 */ +#define CORDIC_CTRLSTS_SCALE_2 ((uint32_t)0x00000400U) /* bit[6] Scaling bit 2 */ + +#define CORDIC_CTRLSTS_INTEN ((uint32_t)0x00010000U) /* bit[16] Interrupt Enable */ +#define CORDIC_CTRLSTS_DMAREN ((uint32_t)0x00020000U) /* bit[17] DMA read Enable */ +#define CORDIC_CTRLSTS_DMAWEN ((uint32_t)0x00040000U) /* bit[18] DMA write Enable */ +#define CORDIC_CTRLSTS_NUMREAD ((uint32_t)0x00080000U) /* bit[19] Number of results in the CORDIC_RDATA register */ +#define CORDIC_CTRLSTS_NUMWRITE ((uint32_t)0x00100000U) /* bit[20] Number of arguments expected by the CORDIC_WDATA register */ +#define CORDIC_CTRLSTS_OUTSIZE ((uint32_t)0x00200000U) /* bit[21] Size of output data */ +#define CORDIC_CTRLSTS_INSIZE ((uint32_t)0x00400000U) /* bit[22] Size of input data */ +#define CORDIC_CTRLSTS_FLOATIN ((uint32_t)0x00800000U) /* bit[23] Floating-point fixed-point input control */ +#define CORDIC_CTRLSTS_FLOATOUT ((uint32_t)0x01000000U) /* bit[24] Floating-point fixed-point output control */ +#define CORDIC_CTRLSTS_PHASELIMIT ((uint32_t)0x02000000U) /* bit[25] Phase Output Limit Control */ +#define CORDIC_CTRLSTS_CODINLIMIT ((uint32_t)0x04000000U) /* bit[26] Coordinate output limit control */ +#define CORDIC_CTRLSTS_INOVINTEN ((uint32_t)0x08000000U) /* bit[27] Input parameter overflow interrupt control bit */ +#define CORDIC_CTRLSTS_INOVF ((uint32_t)0x40000000U) /* bit[30] Input parameter overflow flag */ +#define CORDIC_CTRLSTS_RRF ((uint32_t)0x80000000U) /* bit[31] Result ready flag */ + +/** Bit definition for CORDIC_WDAT register **/ +#define CORDIC_WDAT_WDAT ((uint32_t)0xFFFFFFFFU) /* bit[31:0] Write data */ + +/** Bit definition for CORDIC_RDAT register **/ +#define CORDIC_RDAT_RDAT ((uint32_t)0xFFFFFFFFU) /* bit[31:0] Read data */ + +/*** Digital filter for Sigma delta modulators(DSMU) ***/ +/** Bit definition for DSMU_CHYCFG1 register **/ +#define DSMU_CHYCFG1_DSMUEN ((uint32_t)0x80000000U) /* Bit[31] DSMU interface global enable */ +#define DSMU_CHYCFG1_CLKOUTSRC ((uint32_t)0x40000000U) /* Bit[30] Output serial clock source selection */ + +#define DSMU_CHYCFG1_CLKOUTDIV ((uint32_t)0x00FF0000U) /* Bit[23:16] Output serial clock divider */ +#define DSMU_CHYCFG1_CLKOUTDIV_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_CHYCFG1_CLKOUTDIV_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_CHYCFG1_CLKOUTDIV_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_CHYCFG1_CLKOUTDIV_3 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_CHYCFG1_CLKOUTDIV_4 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_CHYCFG1_CLKOUTDIV_5 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_CHYCFG1_CLKOUTDIV_6 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_CHYCFG1_CLKOUTDIV_7 ((uint32_t)0x00800000U) /* Bit23 */ + +#define DSMU_CHYCFG1_DATPACK ((uint32_t)0x0000C000U) /* Bit[15:14] Data packing config in DSMU_CHYDATIN register */ +#define DSMU_CHYCFG1_DATPACK_0 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_CHYCFG1_DATPACK_1 ((uint32_t)0x00008000U) /* Bit15 */ + +#define DSMU_CHYCFG1_DATMUX ((uint32_t)0x00003000U) /* Bit[13:12] Data input multiplexer for channel y */ +#define DSMU_CHYCFG1_DATMUX_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_CHYCFG1_DATMUX_1 ((uint32_t)0x00002000U) /* Bit13 */ + +#define DSMU_CHYCFG1_CHINSEL ((uint32_t)0x00000100U) /* Bit[8] Channel inputs selection */ +#define DSMU_CHYCFG1_CHEN ((uint32_t)0x00000080U) /* Bit[7] channel y enable */ +#define DSMU_CHYCFG1_CLKABEN ((uint32_t)0x00000040U) /* Bit[6] Clock absence detector enable on channel y */ +#define DSMU_CHYCFG1_SCDETEN ((uint32_t)0x00000020U) /* Bit[5] Short-circuit detector enable on channel y */ + +#define DSMU_CHYCFG1_SPICLKSEL ((uint32_t)0x0000000CU) /* Bit[3:2] SPI clock source config for channel y */ +#define DSMU_CHYCFG1_SPICLKSEL_0 ((uint32_t)0x00000004U) /* Bit2 */ +#define DSMU_CHYCFG1_SPICLKSEL_1 ((uint32_t)0x00000008U) /* Bit3 */ + +#define DSMU_CHYCFG1_SITP ((uint32_t)0x00000003U) /* Bit[1:0] Serial interface type for channel y */ +#define DSMU_CHYCFG1_SITP_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_CHYCFG1_SITP_1 ((uint32_t)0x00000002U) /* Bit1 */ + +/** Bit definition for DSMU_CHYCFG2 register **/ +#define DSMU_CHYCFG2_CALOFFSET ((uint32_t)0xFFFFFF00U) /* Bit[31:8] channel y 24-bit calibration CALOFFSET value. */ +#define DSMU_CHYCFG2_CALOFFSET_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_CHYCFG2_CALOFFSET_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_CHYCFG2_CALOFFSET_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_CHYCFG2_CALOFFSET_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_CHYCFG2_CALOFFSET_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_CHYCFG2_CALOFFSET_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_CHYCFG2_CALOFFSET_6 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_CHYCFG2_CALOFFSET_7 ((uint32_t)0x00008000U) /* Bit15 */ +#define DSMU_CHYCFG2_CALOFFSET_8 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_CHYCFG2_CALOFFSET_9 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_CHYCFG2_CALOFFSET_10 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_CHYCFG2_CALOFFSET_11 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_CHYCFG2_CALOFFSET_12 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_CHYCFG2_CALOFFSET_13 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_CHYCFG2_CALOFFSET_14 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_CHYCFG2_CALOFFSET_15 ((uint32_t)0x00800000U) /* Bit23 */ +#define DSMU_CHYCFG2_CALOFFSET_16 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_CHYCFG2_CALOFFSET_17 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_CHYCFG2_CALOFFSET_18 ((uint32_t)0x04000000U) /* Bit26 */ +#define DSMU_CHYCFG2_CALOFFSET_19 ((uint32_t)0x08000000U) /* Bit27 */ +#define DSMU_CHYCFG2_CALOFFSET_20 ((uint32_t)0x10000000U) /* Bit28 */ +#define DSMU_CHYCFG2_CALOFFSET_21 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_CHYCFG2_CALOFFSET_22 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_CHYCFG2_CALOFFSET_23 ((uint32_t)0x80000000U) /* Bit31 */ + +#define DSMU_CHYCFG2_DATRBS ((uint32_t)0x000000F8U) /* Bit[7:3] channel y data right bit-shift value */ +#define DSMU_CHYCFG2_DATRBS_0 ((uint32_t)0x00000008U) /* Bit3 */ +#define DSMU_CHYCFG2_DATRBS_1 ((uint32_t)0x00000010U) /* Bit4 */ +#define DSMU_CHYCFG2_DATRBS_2 ((uint32_t)0x00000020U) /* Bit5 */ +#define DSMU_CHYCFG2_DATRBS_3 ((uint32_t)0x00000040U) /* Bit6 */ +#define DSMU_CHYCFG2_DATRBS_4 ((uint32_t)0x00000080U) /* Bit7 */ + +/** Bit definition for DSMU_CHYAWDSCDET register **/ +#define DSMU_CHYAWDSCDET_AWDFORD ((uint32_t)0x00C00000U) /* Bit[23:22] Analog watchdog Sinc filter order on channel y */ +#define DSMU_CHYAWDSCDET_AWDFORD_0 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_CHYAWDSCDET_AWDFORD_1 ((uint32_t)0x00800000U) /* Bit23 */ + +#define DSMU_CHYAWDSCDET_AWDFOSR ((uint32_t)0x001F0000U) /* Bit[20:16] Analog watchdog filter oversampling ratio (decimation rate) on channel y */ +#define DSMU_CHYAWDSCDET_AWDFOSR_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_CHYAWDSCDET_AWDFOSR_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_CHYAWDSCDET_AWDFOSR_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_CHYAWDSCDET_AWDFOSR_3 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_CHYAWDSCDET_AWDFOSR_4 ((uint32_t)0x00100000U) /* Bit20 */ + +#define DSMU_CHYAWDSCDET_BKSCDET ((uint32_t)0x0000F000U) /* Bit[15:12] Break signal assignment for short-circuit detector on channel y */ +#define DSMU_CHYAWDSCDET_BKSCDET_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_CHYAWDSCDET_BKSCDET_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_CHYAWDSCDET_BKSCDET_2 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_CHYAWDSCDET_BKSCDET_3 ((uint32_t)0x00008000U) /* Bit15 */ + +#define DSMU_CHYAWDSCDET_SCDETTH ((uint32_t)0x000000FFU) /* Bit[7:0] short-circuit detector threshold value for channel y */ +#define DSMU_CHYAWDSCDET_SCDETTH_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_CHYAWDSCDET_SCDETTH_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_CHYAWDSCDET_SCDETTH_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define DSMU_CHYAWDSCDET_SCDETTH_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define DSMU_CHYAWDSCDET_SCDETTH_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define DSMU_CHYAWDSCDET_SCDETTH_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define DSMU_CHYAWDSCDET_SCDETTH_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define DSMU_CHYAWDSCDET_SCDETTH_7 ((uint32_t)0x00000080U) /* Bit7 */ + +/** Bit definition for DSMU_CHYAWDDAT register **/ +#define DSMU_CHYAWDDAT_AWDDAT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Input channel y watchdog data */ +#define DSMU_CHYAWDDAT_AWDDAT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_CHYAWDDAT_AWDDAT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_CHYAWDDAT_AWDDAT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define DSMU_CHYAWDDAT_AWDDAT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define DSMU_CHYAWDDAT_AWDDAT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define DSMU_CHYAWDDAT_AWDDAT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define DSMU_CHYAWDDAT_AWDDAT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define DSMU_CHYAWDDAT_AWDDAT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define DSMU_CHYAWDDAT_AWDDAT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_CHYAWDDAT_AWDDAT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_CHYAWDDAT_AWDDAT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_CHYAWDDAT_AWDDAT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_CHYAWDDAT_AWDDAT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_CHYAWDDAT_AWDDAT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_CHYAWDDAT_AWDDAT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_CHYAWDDAT_AWDDAT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for DSMU_CHYDATIN register **/ +#define DSMU_CHYDATIN_INDATAT1 ((uint32_t)0xFFFF0000U) /* Bit[31:16] Input data for channel y or channel y+1 */ +#define DSMU_CHYDATIN_INDATAT1_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_CHYDATIN_INDATAT1_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_CHYDATIN_INDATAT1_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_CHYDATIN_INDATAT1_3 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_CHYDATIN_INDATAT1_4 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_CHYDATIN_INDATAT1_5 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_CHYDATIN_INDATAT1_6 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_CHYDATIN_INDATAT1_7 ((uint32_t)0x00800000U) /* Bit23 */ +#define DSMU_CHYDATIN_INDATAT1_8 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_CHYDATIN_INDATAT1_9 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_CHYDATIN_INDATAT1_10 ((uint32_t)0x04000000U) /* Bit26 */ +#define DSMU_CHYDATIN_INDATAT1_11 ((uint32_t)0x08000000U) /* Bit27 */ +#define DSMU_CHYDATIN_INDATAT1_12 ((uint32_t)0x10000000U) /* Bit28 */ +#define DSMU_CHYDATIN_INDATAT1_13 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_CHYDATIN_INDATAT1_14 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_CHYDATIN_INDATAT1_15 ((uint32_t)0x80000000U) /* Bit31 */ + +#define DSMU_CHYDATIN_INDATAT0 ((uint32_t)0x0000FFFFU) /* Bit[15:0] Input data for channel y */ +#define DSMU_CHYDATIN_INDATAT0_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_CHYDATIN_INDATAT0_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_CHYDATIN_INDATAT0_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define DSMU_CHYDATIN_INDATAT0_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define DSMU_CHYDATIN_INDATAT0_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define DSMU_CHYDATIN_INDATAT0_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define DSMU_CHYDATIN_INDATAT0_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define DSMU_CHYDATIN_INDATAT0_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define DSMU_CHYDATIN_INDATAT0_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_CHYDATIN_INDATAT0_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_CHYDATIN_INDATAT0_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_CHYDATIN_INDATAT0_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_CHYDATIN_INDATAT0_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_CHYDATIN_INDATAT0_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_CHYDATIN_INDATAT0_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_CHYDATIN_INDATAT0_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for DSMU_FLTXCTRL1 register **/ +#define DSMU_FLTXCTRL1_AWDFSEL ((uint32_t)0x40000000U) /* Bit[30] Analog watchdog input data selection */ +#define DSMU_FLTXCTRL1_FAST ((uint32_t)0x20000000U) /* Bit[29] Fast conversion mode selection for regular conversions */ + +#define DSMU_FLTXCTRL1_RCH ((uint32_t)0x07000000U) /* Bit[26:24] Regular conversion channel */ +#define DSMU_FLTXCTRL1_RCH_0 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_FLTXCTRL1_RCH_1 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_FLTXCTRL1_RCH_2 ((uint32_t)0x04000000U) /* Bit26 */ + +#define DSMU_FLTXCTRL1_RDMAEN ((uint32_t)0x00200000U) /* Bit[21] DMA channel enabled to read regular conversion data */ +#define DSMU_FLTXCTRL1_RSYNC ((uint32_t)0x00080000U) /* Bit[19] Launch regular conversion synchronously with DSMU_FLTX */ +#define DSMU_FLTXCTRL1_RCONT ((uint32_t)0x00040000U) /* Bit[18] Continuous mode config for regular conversions */ +#define DSMU_FLTXCTRL1_RSWSTART ((uint32_t)0x00020000U) /* Bit[17] Software trigger of a conversion on the regular channel */ + +#define DSMU_FLTXCTRL1_JEXTEN ((uint32_t)0x00006000U) /* Bit[14:13] External trigger enable and trigger active edge selection for injected conversions */ +#define DSMU_FLTXCTRL1_JEXTEN_0 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_FLTXCTRL1_JEXTEN_1 ((uint32_t)0x00004000U) /* Bit14 */ + +#define DSMU_FLTXCTRL1_JEXTSEL ((uint32_t)0x00001F00U) /* Bit[12:8] External trigger signal selection for launching injected conversions */ +#define DSMU_FLTXCTRL1_JEXTSEL_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_FLTXCTRL1_JEXTSEL_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_FLTXCTRL1_JEXTSEL_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_FLTXCTRL1_JEXTSEL_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_FLTXCTRL1_JEXTSEL_4 ((uint32_t)0x00001000U) /* Bit12 */ + +#define DSMU_FLTXCTRL1_JDMAEN ((uint32_t)0x00000020U) /* Bit[5] DMA channel enabled to read data for the injected conversion */ +#define DSMU_FLTXCTRL1_JSCAN ((uint32_t)0x00000010U) /* Bit[4] Injected scanning conversion mode */ +#define DSMU_FLTXCTRL1_JSYNC ((uint32_t)0x00000008U) /* Bit[3] Launch an injected conversion synchronously with the DSMU_FLTX JSWSTART event */ +#define DSMU_FLTXCTRL1_JSWSTART ((uint32_t)0x00000002U) /* Bit[1] Start a conversion of the injected group of channels */ +#define DSMU_FLTXCTRL1_DFLTEN ((uint32_t)0x00000001U) /* Bit[0] DSMU_FLTX enable */ + +/** Bit definition for DSMU_FLTXCTRL2 register **/ +#define DSMU_FLTXCTRL2_AWDCH ((uint32_t)0x00FF0000U) /* Bit[23:16] Analog watchdog channel selection */ +#define DSMU_FLTXCTRL2_AWDCH_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_FLTXCTRL2_AWDCH_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_FLTXCTRL2_AWDCH_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_FLTXCTRL2_AWDCH_3 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_FLTXCTRL2_AWDCH_4 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_FLTXCTRL2_AWDCH_5 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_FLTXCTRL2_AWDCH_6 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_FLTXCTRL2_AWDCH_7 ((uint32_t)0x00800000U) /* Bit23 */ + +#define DSMU_FLTXCTRL2_EXDETCH ((uint32_t)0x0000FF00U) /* Bit[15:8] Extremes detector channel selection */ +#define DSMU_FLTXCTRL2_EXDETCH_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_FLTXCTRL2_EXDETCH_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_FLTXCTRL2_EXDETCH_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_FLTXCTRL2_EXDETCH_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_FLTXCTRL2_EXDETCH_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_FLTXCTRL2_EXDETCH_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_FLTXCTRL2_EXDETCH_6 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_FLTXCTRL2_EXDETCH_7 ((uint32_t)0x00008000U) /* Bit15 */ + +#define DSMU_FLTXCTRL2_CLKABIEN ((uint32_t)0x00000040U) /* Bit[6] Clock absence interrupt enable */ +#define DSMU_FLTXCTRL2_SCDETIEN ((uint32_t)0x00000020U) /* Bit[5] Short-circuit detector interrupt enable */ +#define DSMU_FLTXCTRL2_AWDIEN ((uint32_t)0x00000010U) /* Bit[4] Analog watchdog interrupt enable */ +#define DSMU_FLTXCTRL2_ROVRIEN ((uint32_t)0x00000008U) /* Bit[3] Regular data overrun interrupt enable */ +#define DSMU_FLTXCTRL2_JOVRIEN ((uint32_t)0x00000004U) /* Bit[2] Injected data overrun interrupt enable */ +#define DSMU_FLTXCTRL2_REOCIEN ((uint32_t)0x00000002U) /* Bit[1] Regular conversion end interrupt enable */ +#define DSMU_FLTXCTRL2_JEOCIEN ((uint32_t)0x00000001U) /* Bit[0] Injected conversion end interrupt enable */ + +/** Bit definition for DSMU_FLTXSTS register **/ +#define DSMU_FLTXSTS_SCDETF ((uint32_t)0xFF000000U) /* Bit[31:24] short-circuit event flag */ +#define DSMU_FLTXSTS_SCDETF_0 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_FLTXSTS_SCDETF_1 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_FLTXSTS_SCDETF_2 ((uint32_t)0x04000000U) /* Bit26 */ +#define DSMU_FLTXSTS_SCDETF_3 ((uint32_t)0x08000000U) /* Bit27 */ +#define DSMU_FLTXSTS_SCDETF_4 ((uint32_t)0x10000000U) /* Bit28 */ +#define DSMU_FLTXSTS_SCDETF_5 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_FLTXSTS_SCDETF_6 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_FLTXSTS_SCDETF_7 ((uint32_t)0x80000000U) /* Bit31 */ + +#define DSMU_FLTXSTS_CLKABF ((uint32_t)0x00FF0000U) /* Bit[23:16] Clock absence event flag */ +#define DSMU_FLTXSTS_CLKABF_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_FLTXSTS_CLKABF_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_FLTXSTS_CLKABF_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_FLTXSTS_CLKABF_3 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_FLTXSTS_CLKABF_4 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_FLTXSTS_CLKABF_5 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_FLTXSTS_CLKABF_6 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_FLTXSTS_CLKABF_7 ((uint32_t)0x00800000U) /* Bit23 */ + +#define DSMU_FLTXSTS_RCIP ((uint32_t)0x00004000U) /* Bit[14] Regular conversion active status */ +#define DSMU_FLTXSTS_JCIP ((uint32_t)0x00002000U) /* Bit[13] Injected conversion active status */ +#define DSMU_FLTXSTS_AWDF ((uint32_t)0x00000010U) /* Bit[4] Analog watchdog event flag */ +#define DSMU_FLTXSTS_ROVRF ((uint32_t)0x00000008U) /* Bit[3] Regular conversion overrun flag */ +#define DSMU_FLTXSTS_JOVRF ((uint32_t)0x00000004U) /* Bit[2] Injected conversion overrun flag */ +#define DSMU_FLTXSTS_REOCF ((uint32_t)0x00000002U) /* Bit[1] Regular conversion end event flag */ +#define DSMU_FLTXSTS_JEOCF ((uint32_t)0x00000001U) /* Bit[0] Injected conversion end event flag */ + +/** Bit definition for DSMU_FLTXINTCLR register **/ +#define DSMU_FLTXINTCLR_CLRSCDETF ((uint32_t)0xFF000000U) /* Bit[31:24] Clear the short-circuit event flag */ +#define DSMU_FLTXINTCLR_CLRSCDETF_0 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_FLTXINTCLR_CLRSCDETF_1 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_FLTXINTCLR_CLRSCDETF_2 ((uint32_t)0x04000000U) /* Bit26 */ +#define DSMU_FLTXINTCLR_CLRSCDETF_3 ((uint32_t)0x08000000U) /* Bit27 */ +#define DSMU_FLTXINTCLR_CLRSCDETF_4 ((uint32_t)0x10000000U) /* Bit28 */ +#define DSMU_FLTXINTCLR_CLRSCDETF_5 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_FLTXINTCLR_CLRSCDETF_6 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_FLTXINTCLR_CLRSCDETF_7 ((uint32_t)0x80000000U) /* Bit31 */ + +#define DSMU_FLTXINTCLR_CLRCLKABF ((uint32_t)0x00FF0000U) /* Bit[23:16] Clear the clock absence flag */ +#define DSMU_FLTXINTCLR_CLRCLKABF_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_FLTXINTCLR_CLRCLKABF_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_FLTXINTCLR_CLRCLKABF_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_FLTXINTCLR_CLRCLKABF_3 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_FLTXINTCLR_CLRCLKABF_4 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_FLTXINTCLR_CLRCLKABF_5 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_FLTXINTCLR_CLRCLKABF_6 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_FLTXINTCLR_CLRCLKABF_7 ((uint32_t)0x00800000U) /* Bit23 */ + +#define DSMU_FLTXINTCLR_CLRROVRF ((uint32_t)0x00000008U) /* Bit[3] Clear the regular conversion overrun flag */ +#define DSMU_FLTXINTCLR_CLRJOVRF ((uint32_t)0x00000004U) /* Bit[2] Clear the injected conversion overrun flag */ + +/** Bit definition for DSMU_FLTXJCHG register **/ +#define DSMU_FLTXJCHG_JCHG ((uint32_t)0x000000FFU) /* Bit[7:0] Injected channel group selection */ +#define DSMU_FLTXJCHG_JCHG_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_FLTXJCHG_JCHG_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_FLTXJCHG_JCHG_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define DSMU_FLTXJCHG_JCHG_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define DSMU_FLTXJCHG_JCHG_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define DSMU_FLTXJCHG_JCHG_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define DSMU_FLTXJCHG_JCHG_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define DSMU_FLTXJCHG_JCHG_7 ((uint32_t)0x00000080U) /* Bit7 */ + +/** Bit definition for DSMU_FLTXFCTRL register **/ +#define DSMU_FLTXFCTRL_FORD ((uint32_t)0xE0000000U) /* Bit[31:29] Sinc filter order */ +#define DSMU_FLTXFCTRL_FORD_0 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_FLTXFCTRL_FORD_1 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_FLTXFCTRL_FORD_2 ((uint32_t)0x80000000U) /* Bit31 */ + +#define DSMU_FLTXFCTRL_FOSR ((uint32_t)0x03FF0000U) /* Bit[25:16] Sinc filter oversampling ratio (decimation rate) */ +#define DSMU_FLTXFCTRL_FOSR_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_FLTXFCTRL_FOSR_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_FLTXFCTRL_FOSR_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_FLTXFCTRL_FOSR_3 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_FLTXFCTRL_FOSR_4 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_FLTXFCTRL_FOSR_5 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_FLTXFCTRL_FOSR_6 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_FLTXFCTRL_FOSR_7 ((uint32_t)0x00800000U) /* Bit23 */ +#define DSMU_FLTXFCTRL_FOSR_8 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_FLTXFCTRL_FOSR_9 ((uint32_t)0x02000000U) /* Bit25 */ + +#define DSMU_FLTXFCTRL_IOSR ((uint32_t)0x000000FFU) /* Bit[7:0] Integrator oversampling ratio (averaging length) */ +#define DSMU_FLTXFCTRL_IOSR_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_FLTXFCTRL_IOSR_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_FLTXFCTRL_IOSR_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define DSMU_FLTXFCTRL_IOSR_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define DSMU_FLTXFCTRL_IOSR_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define DSMU_FLTXFCTRL_IOSR_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define DSMU_FLTXFCTRL_IOSR_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define DSMU_FLTXFCTRL_IOSR_7 ((uint32_t)0x00000080U) /* Bit7 */ + +/** Bit definition for DSMU_FLTXJDAT register **/ +#define DSMU_FLTXJDAT_JDAT ((uint32_t)0xFFFFFF00U) /* Bit[31:8] Injected group conversion data */ +#define DSMU_FLTXJDAT_JDAT_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_FLTXJDAT_JDAT_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_FLTXJDAT_JDAT_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_FLTXJDAT_JDAT_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_FLTXJDAT_JDAT_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_FLTXJDAT_JDAT_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_FLTXJDAT_JDAT_6 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_FLTXJDAT_JDAT_7 ((uint32_t)0x00008000U) /* Bit15 */ +#define DSMU_FLTXJDAT_JDAT_8 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_FLTXJDAT_JDAT_9 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_FLTXJDAT_JDAT_10 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_FLTXJDAT_JDAT_11 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_FLTXJDAT_JDAT_12 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_FLTXJDAT_JDAT_13 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_FLTXJDAT_JDAT_14 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_FLTXJDAT_JDAT_15 ((uint32_t)0x00800000U) /* Bit23 */ +#define DSMU_FLTXJDAT_JDAT_16 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_FLTXJDAT_JDAT_17 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_FLTXJDAT_JDAT_18 ((uint32_t)0x04000000U) /* Bit26 */ +#define DSMU_FLTXJDAT_JDAT_19 ((uint32_t)0x08000000U) /* Bit27 */ +#define DSMU_FLTXJDAT_JDAT_20 ((uint32_t)0x10000000U) /* Bit28 */ +#define DSMU_FLTXJDAT_JDAT_21 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_FLTXJDAT_JDAT_22 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_FLTXJDAT_JDAT_23 ((uint32_t)0x80000000U) /* Bit31 */ + +#define DSMU_FLTXJDAT_JDATCH ((uint32_t)0x00000007U) /* Bit[2:0] Injected channel most recently converted */ +#define DSMU_FLTXJDAT_JDATCH_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_FLTXJDAT_JDATCH_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_FLTXJDAT_JDATCH_2 ((uint32_t)0x00000004U) /* Bit2 */ + +/** Bit definition for DSMU_FLTXRDAT register **/ +#define DSMU_FLTXRDAT_RDAT ((uint32_t)0xFFFFFF00U) /* Bit[31:8] Regular channel conversion data */ +#define DSMU_FLTXRDAT_RDAT_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_FLTXRDAT_RDAT_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_FLTXRDAT_RDAT_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_FLTXRDAT_RDAT_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_FLTXRDAT_RDAT_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_FLTXRDAT_RDAT_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_FLTXRDAT_RDAT_6 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_FLTXRDAT_RDAT_7 ((uint32_t)0x00008000U) /* Bit15 */ +#define DSMU_FLTXRDAT_RDAT_8 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_FLTXRDAT_RDAT_9 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_FLTXRDAT_RDAT_10 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_FLTXRDAT_RDAT_11 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_FLTXRDAT_RDAT_12 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_FLTXRDAT_RDAT_13 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_FLTXRDAT_RDAT_14 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_FLTXRDAT_RDAT_15 ((uint32_t)0x00800000U) /* Bit23 */ +#define DSMU_FLTXRDAT_RDAT_16 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_FLTXRDAT_RDAT_17 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_FLTXRDAT_RDAT_18 ((uint32_t)0x04000000U) /* Bit26 */ +#define DSMU_FLTXRDAT_RDAT_19 ((uint32_t)0x08000000U) /* Bit27 */ +#define DSMU_FLTXRDAT_RDAT_20 ((uint32_t)0x10000000U) /* Bit28 */ +#define DSMU_FLTXRDAT_RDAT_21 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_FLTXRDAT_RDAT_22 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_FLTXRDAT_RDAT_23 ((uint32_t)0x80000000U) /* Bit31 */ + +#define DSMU_FLTXRDAT_RPEND ((uint32_t)0x00000010U) /* Bit[4] Regular channel pending data */ + +#define DSMU_FLTXRDAT_RDATCH ((uint32_t)0x00000007U) /* Bit[2:0] Regular channel most recently converted */ +#define DSMU_FLTXRDAT_RDATCH_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_FLTXRDAT_RDATCH_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_FLTXRDAT_RDATCH_2 ((uint32_t)0x00000004U) /* Bit2 */ + +/** Bit definition for DSMU_FLTXAWDHT register **/ +#define DSMU_FLTXAWDHT_AWDHT ((uint32_t)0xFFFFFF00U) /* Bit[31:8] Analog watchdog threshold high */ +#define DSMU_FLTXAWDHT_AWDHT_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_FLTXAWDHT_AWDHT_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_FLTXAWDHT_AWDHT_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_FLTXAWDHT_AWDHT_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_FLTXAWDHT_AWDHT_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_FLTXAWDHT_AWDHT_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_FLTXAWDHT_AWDHT_6 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_FLTXAWDHT_AWDHT_7 ((uint32_t)0x00008000U) /* Bit15 */ +#define DSMU_FLTXAWDHT_AWDHT_8 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_FLTXAWDHT_AWDHT_9 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_FLTXAWDHT_AWDHT_10 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_FLTXAWDHT_AWDHT_11 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_FLTXAWDHT_AWDHT_12 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_FLTXAWDHT_AWDHT_13 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_FLTXAWDHT_AWDHT_14 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_FLTXAWDHT_AWDHT_15 ((uint32_t)0x00800000U) /* Bit23 */ +#define DSMU_FLTXAWDHT_AWDHT_16 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_FLTXAWDHT_AWDHT_17 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_FLTXAWDHT_AWDHT_18 ((uint32_t)0x04000000U) /* Bit26 */ +#define DSMU_FLTXAWDHT_AWDHT_19 ((uint32_t)0x08000000U) /* Bit27 */ +#define DSMU_FLTXAWDHT_AWDHT_20 ((uint32_t)0x10000000U) /* Bit28 */ +#define DSMU_FLTXAWDHT_AWDHT_21 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_FLTXAWDHT_AWDHT_22 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_FLTXAWDHT_AWDHT_23 ((uint32_t)0x80000000U) /* Bit31 */ + +#define DSMU_FLTXAWDHT_BKAWDHT ((uint32_t)0x0000000FU) /* Bit[3:0] Break signal assignment to analog watchdog threshold high event */ +#define DSMU_FLTXAWDHT_BKAWDHT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_FLTXAWDHT_BKAWDHT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_FLTXAWDHT_BKAWDHT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define DSMU_FLTXAWDHT_BKAWDHT_3 ((uint32_t)0x00000008U) /* Bit3 */ + +/** Bit definition for DSMU_FLTXAWDLT register **/ +#define DSMU_FLTXAWDLT_AWDLT ((uint32_t)0xFFFFFF00U) /* Bit[31:8] Analog watchdog threshold low */ +#define DSMU_FLTXAWDLT_AWDLT_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_FLTXAWDLT_AWDLT_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_FLTXAWDLT_AWDLT_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_FLTXAWDLT_AWDLT_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_FLTXAWDLT_AWDLT_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_FLTXAWDLT_AWDLT_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_FLTXAWDLT_AWDLT_6 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_FLTXAWDLT_AWDLT_7 ((uint32_t)0x00008000U) /* Bit15 */ +#define DSMU_FLTXAWDLT_AWDLT_8 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_FLTXAWDLT_AWDLT_9 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_FLTXAWDLT_AWDLT_10 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_FLTXAWDLT_AWDLT_11 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_FLTXAWDLT_AWDLT_12 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_FLTXAWDLT_AWDLT_13 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_FLTXAWDLT_AWDLT_14 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_FLTXAWDLT_AWDLT_15 ((uint32_t)0x00800000U) /* Bit23 */ +#define DSMU_FLTXAWDLT_AWDLT_16 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_FLTXAWDLT_AWDLT_17 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_FLTXAWDLT_AWDLT_18 ((uint32_t)0x04000000U) /* Bit26 */ +#define DSMU_FLTXAWDLT_AWDLT_19 ((uint32_t)0x08000000U) /* Bit27 */ +#define DSMU_FLTXAWDLT_AWDLT_20 ((uint32_t)0x10000000U) /* Bit28 */ +#define DSMU_FLTXAWDLT_AWDLT_21 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_FLTXAWDLT_AWDLT_22 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_FLTXAWDLT_AWDLT_23 ((uint32_t)0x80000000U) /* Bit31 */ + +#define DSMU_FLTXAWDLT_BKAWDLT ((uint32_t)0x0000000FU) /* Bit[3:0] Break signal assignment to analog watchdog threshold low event */ +#define DSMU_FLTXAWDLT_BKAWDLT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_FLTXAWDLT_BKAWDLT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_FLTXAWDLT_BKAWDLT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define DSMU_FLTXAWDLT_BKAWDLT_3 ((uint32_t)0x00000008U) /* Bit3 */ + +/** Bit definition for DSMU_FLTXAWDSTS register **/ +#define DSMU_FLTXAWDSTS_AWDHTF ((uint32_t)0x0000FF00U) /* Bit[15:8] Analog watchdog threshold high flag */ +#define DSMU_FLTXAWDSTS_AWDHTF_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_FLTXAWDSTS_AWDHTF_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_FLTXAWDSTS_AWDHTF_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_FLTXAWDSTS_AWDHTF_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_FLTXAWDSTS_AWDHTF_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_FLTXAWDSTS_AWDHTF_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_FLTXAWDSTS_AWDHTF_6 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_FLTXAWDSTS_AWDHTF_7 ((uint32_t)0x00008000U) /* Bit15 */ + +#define DSMU_FLTXAWDSTS_AWDLTF ((uint32_t)0x000000FFU) /* Bit[7:0] Analog watchdog threshold low flag */ +#define DSMU_FLTXAWDSTS_AWDLTF_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_FLTXAWDSTS_AWDLTF_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_FLTXAWDSTS_AWDLTF_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define DSMU_FLTXAWDSTS_AWDLTF_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define DSMU_FLTXAWDSTS_AWDLTF_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define DSMU_FLTXAWDSTS_AWDLTF_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define DSMU_FLTXAWDSTS_AWDLTF_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define DSMU_FLTXAWDSTS_AWDLTF_7 ((uint32_t)0x00000080U) /* Bit7 */ + +/** Bit definition for DSMU_FLTXAWDCLR register **/ +#define DSMU_FLTXAWDCLR_CLRAWDHTF ((uint32_t)0x0000FF00U) /* Bit[15:8] Clear the analog watchdog threshold high flag */ +#define DSMU_FLTXAWDCLR_CLRAWDHTF_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_FLTXAWDCLR_CLRAWDHTF_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_FLTXAWDCLR_CLRAWDHTF_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_FLTXAWDCLR_CLRAWDHTF_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_FLTXAWDCLR_CLRAWDHTF_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_FLTXAWDCLR_CLRAWDHTF_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_FLTXAWDCLR_CLRAWDHTF_6 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_FLTXAWDCLR_CLRAWDHTF_7 ((uint32_t)0x00008000U) /* Bit15 */ + +#define DSMU_FLTXAWDCLR_CLRAWDLTF ((uint32_t)0x000000FFU) /* Bit[7:0] Clear the analog watchdog threshold low flag */ +#define DSMU_FLTXAWDCLR_CLRAWDLTF_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_FLTXAWDCLR_CLRAWDLTF_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_FLTXAWDCLR_CLRAWDLTF_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define DSMU_FLTXAWDCLR_CLRAWDLTF_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define DSMU_FLTXAWDCLR_CLRAWDLTF_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define DSMU_FLTXAWDCLR_CLRAWDLTF_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define DSMU_FLTXAWDCLR_CLRAWDLTF_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define DSMU_FLTXAWDCLR_CLRAWDLTF_7 ((uint32_t)0x00000080U) /* Bit7 */ + +/** Bit definition for DSMU_FLTXEXDETMAX register **/ +#define DSMU_FLTXEXDETMAX_EXDETMAX ((uint32_t)0xFFFFFF00U) /* Bit[31:8] Extremes detector maximum value */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_6 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_7 ((uint32_t)0x00008000U) /* Bit15 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_8 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_9 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_10 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_11 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_12 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_13 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_14 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_15 ((uint32_t)0x00800000U) /* Bit23 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_16 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_17 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_18 ((uint32_t)0x04000000U) /* Bit26 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_19 ((uint32_t)0x08000000U) /* Bit27 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_20 ((uint32_t)0x10000000U) /* Bit28 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_21 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_22 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_FLTXEXDETMAX_EXDETMAX_23 ((uint32_t)0x80000000U) /* Bit31 */ + +#define DSMU_FLTXEXDETMAX_EXDETMAXCH ((uint32_t)0x00000007U) /* Bit[2:0] Extremes detector maximum data channel. */ +#define DSMU_FLTXEXDETMAX_EXDETMAXCH_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_FLTXEXDETMAX_EXDETMAXCH_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_FLTXEXDETMAX_EXDETMAXCH_2 ((uint32_t)0x00000004U) /* Bit2 */ + +/** Bit definition for DSMU_FLTXEXDETMIN register **/ +#define DSMU_FLTXEXDETMIN_EXDETMIN ((uint32_t)0xFFFFFF00U) /* Bit[31:8] Extremes detector minimum value */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_6 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_7 ((uint32_t)0x00008000U) /* Bit15 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_8 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_9 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_10 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_11 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_12 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_13 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_14 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_15 ((uint32_t)0x00800000U) /* Bit23 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_16 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_17 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_18 ((uint32_t)0x04000000U) /* Bit26 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_19 ((uint32_t)0x08000000U) /* Bit27 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_20 ((uint32_t)0x10000000U) /* Bit28 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_21 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_22 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_FLTXEXDETMIN_EXDETMIN_23 ((uint32_t)0x80000000U) /* Bit31 */ + +#define DSMU_FLTXEXDETMIN_EXDETMINCH ((uint32_t)0x00000007U) /* Bit[2:0] Extremes detector minimum data channel */ +#define DSMU_FLTXEXDETMIN_EXDETMINCH_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define DSMU_FLTXEXDETMIN_EXDETMINCH_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define DSMU_FLTXEXDETMIN_EXDETMINCH_2 ((uint32_t)0x00000004U) /* Bit2 */ + +/** Bit definition for DSMU_FLTXCOVTIM register **/ +#define DSMU_FLTXCOVTIM_COVCNT ((uint32_t)0xFFFFFFF0U) /* Bit[31:4] 28-bit timer counting conversion time t = CNVCNT[27:0] / fDSMUCLK */ +#define DSMU_FLTXCOVTIM_COVCNT_0 ((uint32_t)0x00000010U) /* Bit4 */ +#define DSMU_FLTXCOVTIM_COVCNT_1 ((uint32_t)0x00000020U) /* Bit5 */ +#define DSMU_FLTXCOVTIM_COVCNT_2 ((uint32_t)0x00000040U) /* Bit6 */ +#define DSMU_FLTXCOVTIM_COVCNT_3 ((uint32_t)0x00000080U) /* Bit7 */ +#define DSMU_FLTXCOVTIM_COVCNT_4 ((uint32_t)0x00000100U) /* Bit8 */ +#define DSMU_FLTXCOVTIM_COVCNT_5 ((uint32_t)0x00000200U) /* Bit9 */ +#define DSMU_FLTXCOVTIM_COVCNT_6 ((uint32_t)0x00000400U) /* Bit10 */ +#define DSMU_FLTXCOVTIM_COVCNT_7 ((uint32_t)0x00000800U) /* Bit11 */ +#define DSMU_FLTXCOVTIM_COVCNT_8 ((uint32_t)0x00001000U) /* Bit12 */ +#define DSMU_FLTXCOVTIM_COVCNT_9 ((uint32_t)0x00002000U) /* Bit13 */ +#define DSMU_FLTXCOVTIM_COVCNT_10 ((uint32_t)0x00004000U) /* Bit14 */ +#define DSMU_FLTXCOVTIM_COVCNT_11 ((uint32_t)0x00008000U) /* Bit15 */ +#define DSMU_FLTXCOVTIM_COVCNT_12 ((uint32_t)0x00010000U) /* Bit16 */ +#define DSMU_FLTXCOVTIM_COVCNT_13 ((uint32_t)0x00020000U) /* Bit17 */ +#define DSMU_FLTXCOVTIM_COVCNT_14 ((uint32_t)0x00040000U) /* Bit18 */ +#define DSMU_FLTXCOVTIM_COVCNT_15 ((uint32_t)0x00080000U) /* Bit19 */ +#define DSMU_FLTXCOVTIM_COVCNT_16 ((uint32_t)0x00100000U) /* Bit20 */ +#define DSMU_FLTXCOVTIM_COVCNT_17 ((uint32_t)0x00200000U) /* Bit21 */ +#define DSMU_FLTXCOVTIM_COVCNT_18 ((uint32_t)0x00400000U) /* Bit22 */ +#define DSMU_FLTXCOVTIM_COVCNT_19 ((uint32_t)0x00800000U) /* Bit23 */ +#define DSMU_FLTXCOVTIM_COVCNT_20 ((uint32_t)0x01000000U) /* Bit24 */ +#define DSMU_FLTXCOVTIM_COVCNT_21 ((uint32_t)0x02000000U) /* Bit25 */ +#define DSMU_FLTXCOVTIM_COVCNT_22 ((uint32_t)0x04000000U) /* Bit26 */ +#define DSMU_FLTXCOVTIM_COVCNT_23 ((uint32_t)0x08000000U) /* Bit27 */ +#define DSMU_FLTXCOVTIM_COVCNT_24 ((uint32_t)0x10000000U) /* Bit28 */ +#define DSMU_FLTXCOVTIM_COVCNT_25 ((uint32_t)0x20000000U) /* Bit29 */ +#define DSMU_FLTXCOVTIM_COVCNT_26 ((uint32_t)0x40000000U) /* Bit30 */ +#define DSMU_FLTXCOVTIM_COVCNT_27 ((uint32_t)0x80000000U) /* Bit31 */ + +/*** Flexible Extended Memory Controller ***/ + +/** Bit definition for FEMC_STS register **/ +#define FEMC_STS_RECCINTF ((uint32_t)0x00001000U) +#define FEMC_STS_ECCINTF ((uint32_t)0x00000400U) +#define FEMC_STS_ECCINTENF ((uint32_t)0x00000100U) +#define FEMC_STS_RINT1F ((uint32_t)0x00000040U) +#define FEMC_STS_RINT0F ((uint32_t)0x00000020U) +#define FEMC_STS_INT1F ((uint32_t)0x00000010U) +#define FEMC_STS_INT0F ((uint32_t)0x00000008U) +#define FEMC_STS_INT1ENF ((uint32_t)0x00000004U) +#define FEMC_STS_INT0ENF ((uint32_t)0x00000002U) +#define FEMC_STS_LPSTS ((uint32_t)0x00000001U) + +/** Bit definition for FEMC_STS1 register **/ +#define FEMC_STS1_M0TYPE ((uint32_t)0x00000003U) +#define FEMC_STS1_M0TYPE_0 ((uint32_t)0x00000001U) +#define FEMC_STS1_M0TYPE_1 ((uint32_t)0x00000002U) + +/** Bit definition for FEMC_CFG register **/ +#define FEMC_CFG_ASYNCADV ((uint32_t)0x00000100U) +#define FEMC_CFG_ECCINTEN ((uint32_t)0x00000040U) +#define FEMC_CFG_INT1EN ((uint32_t)0x00000002U) +#define FEMC_CFG_INT0EN ((uint32_t)0x00000001U) + +/** Bit definition for FEMC_CCFG register **/ +#define FEMC_CCFG_ASYNCADVDIS ((uint32_t)0x00000100U) +#define FEMC_CCFG_ECCINTDIS ((uint32_t)0x00000040U) +#define FEMC_CCFG_INT1CLR ((uint32_t)0x00000010U) +#define FEMC_CCFG_INT0CLR ((uint32_t)0x00000008U) +#define FEMC_CCFG_INT1DIS ((uint32_t)0x00000002U) +#define FEMC_CCFG_INT0DIS ((uint32_t)0x00000001U) + +/** Bit definition for FEMC_CTRL register **/ +#define FEMC_CTRL_CHIPNUM ((uint32_t)0x03800000U) +#define FEMC_CTRL_CHIPNUM_0 ((uint32_t)0x00800000U) +#define FEMC_CTRL_CHIPNUM_1 ((uint32_t)0x01000000U) +#define FEMC_CTRL_CHIPNUM_2 ((uint32_t)0x02000000U) +#define FEMC_CTRL_CMDTYPE ((uint32_t)0x00600000U) +#define FEMC_CTRL_CMDTYPE_0 ((uint32_t)0x00200000U) +#define FEMC_CTRL_CMDTYPE_1 ((uint32_t)0x00400000U) +#define FEMC_CTRL_CREPOL ((uint32_t)0x00100000U) +#define FEMC_CTRL_ADDR ((uint32_t)0x000FFFFFU) + +/** Bit definition for FEMC_TCFG register **/ +#define FEMC_TCFG_WERR ((uint32_t)0x00700000U) +#define FEMC_TCFG_TRAR ((uint32_t)0x000E0000U) +#define FEMC_TCFG_PCCLR ((uint32_t)0x0001C000U) +#define FEMC_TCFG_WP ((uint32_t)0x00003800U) +#define FEMC_TCFG_CERE ((uint32_t)0x00000700U) +#define FEMC_TCFG_WC ((uint32_t)0x000000F0U) +#define FEMC_TCFG_RC ((uint32_t)0x0000000FU) + +/** Bit definition for FEMC_OMCFG register **/ +#define FEMC_OMCFG_BSTAGN ((uint32_t)0x0000E000U) +#define FEMC_OMCFG_BSTAGN_0 ((uint32_t)0x00002000U) +#define FEMC_OMCFG_BSTAGN_1 ((uint32_t)0x00004000U) +#define FEMC_OMCFG_BSTAGN_2 ((uint32_t)0x00008000U) +#define FEMC_OMCFG_BLSS ((uint32_t)0x00001000U) +#define FEMC_OMCFG_ADV ((uint32_t)0x00000800U) +#define FEMC_OMCFG_BAA ((uint32_t)0x00000400U) +#define FEMC_OMCFG_WRBL ((uint32_t)0x00000380U) +#define FEMC_OMCFG_WRBL_0 ((uint32_t)0x00000080U) +#define FEMC_OMCFG_WRBL_1 ((uint32_t)0x00000100U) +#define FEMC_OMCFG_WRBL_2 ((uint32_t)0x00002000U) +#define FEMC_OMCFG_WRSYN ((uint32_t)0x00000040U) +#define FEMC_OMCFG_RDBL ((uint32_t)0x00000038U) +#define FEMC_OMCFG_RDBL_0 ((uint32_t)0x00000008U) +#define FEMC_OMCFG_RDBL_1 ((uint32_t)0x00000010U) +#define FEMC_OMCFG_RDBL_2 ((uint32_t)0x00000020U) +#define FEMC_OMCFG_RDSYN ((uint32_t)0x00000004U) +#define FEMC_OMCFG_MDBW ((uint32_t)0x00000003U) +#define FEMC_OMCFG_MDBW_0 ((uint32_t)0x00000001U) +#define FEMC_OMCFG_MDBW_1 ((uint32_t)0x00000002U) + +/** Bit definition for FEMC_RPE register **/ +#define FEMC_RPE_REFPRD ((uint32_t)0x0000000FU) + +/** Bit definition for FEMC_SNTSTS1/2/3/4 register **/ +#define FEMC_SNTSTS_WECS ((uint32_t)0x00100000U) +#define FEMC_SNTSTS_TR ((uint32_t)0x000E0000U) +#define FEMC_SNTSTS_PC ((uint32_t)0x0001C000U) +#define FEMC_SNTSTS_WP ((uint32_t)0x00003800U) +#define FEMC_SNTSTS_CEOE ((uint32_t)0x00000700U) +#define FEMC_SNTSTS_WC ((uint32_t)0x000000F0U) +#define FEMC_SNTSTS_RC ((uint32_t)0x0000000FU) + +/** Bit definition for FEMC_SNOMSTS1/2/3/4 register **/ +#define FEMC_SNOMSTS_ADDRMCH ((uint32_t)0xFF000000U) +#define FEMC_SNOMSTS_ADDRMSK ((uint32_t)0x00FF0000U) +#define FEMC_SNOMSTS_BSTAGN ((uint32_t)0x0000E000U) +#define FEMC_SNOMSTS_BSTAGN_0 ((uint32_t)0x00002000U) +#define FEMC_SNOMSTS_BSTAGN_1 ((uint32_t)0x00004000U) +#define FEMC_SNOMSTS_BSTAGN_2 ((uint32_t)0x00008000U) +#define FEMC_SNOMSTS_BLSS ((uint32_t)0x00001000U) +#define FEMC_SNOMSTS_ADV ((uint32_t)0x00000800U) +#define FEMC_SNOMSTS_BAA ((uint32_t)0x00000400U) +#define FEMC_SNOMSTS_WRBL ((uint32_t)0x00000380U) +#define FEMC_SNOMSTS_WRBL_0 ((uint32_t)0x00000080U) +#define FEMC_SNOMSTS_WRBL_1 ((uint32_t)0x00000100U) +#define FEMC_SNOMSTS_WRBL_2 ((uint32_t)0x00002000U) +#define FEMC_SNOMSTS_WRSYN ((uint32_t)0x00000040U) +#define FEMC_SNOMSTS_RDBL ((uint32_t)0x00000038U) +#define FEMC_SNOMSTS_RDBL_0 ((uint32_t)0x00000008U) +#define FEMC_SNOMSTS_RDBL_1 ((uint32_t)0x00000010U) +#define FEMC_SNOMSTS_RDBL_2 ((uint32_t)0x00000020U) +#define FEMC_SNOMCFG_RDSYN ((uint32_t)0x00000004U) +#define FEMC_SNOMSTS_MDBW ((uint32_t)0x00000003U) +#define FEMC_SNOMSTS_MDBW_0 ((uint32_t)0x00000001U) +#define FEMC_SNOMSTS_MDBW_1 ((uint32_t)0x00000002U) + +/** Bit definition for FEMC_NTSTS1/2 register **/ +#define FEMC_NTSTS_RR ((uint32_t)0x00700000U) +#define FEMC_NTSTS_AR ((uint32_t)0x000E0000U) +#define FEMC_NTSTS_CLR ((uint32_t)0x0001C000U) +#define FEMC_NTSTS_WP ((uint32_t)0x00003800U) +#define FEMC_NTSTS_REA ((uint32_t)0x00000700U) +#define FEMC_NTSTS_WC ((uint32_t)0x000000F0U) +#define FEMC_NTSTS_RC ((uint32_t)0x0000000FU) + +/** Bit definition for FEMC_NOMSTS1/2 register **/ +#define FEMC_SNOMSTS_ADDRMCH ((uint32_t)0xFF000000U) +#define FEMC_SNOMSTS_ADDRMSK ((uint32_t)0x00FF0000U) +#define FEMC_SNOMSTS_MDBW ((uint32_t)0x00000003U) +#define FEMC_SNOMSTS_MDBW_0 ((uint32_t)0x00000001U) +#define FEMC_SNOMSTS_MDBW_1 ((uint32_t)0x00000002U) + +/** Bit definition for FEMC_USTS register **/ +#define FEMC_USTS_USER ((uint32_t)0x000000FFU) + +/** Bit definition for FEMC_CFG register **/ +#define FEMC_CFG_USER ((uint32_t)0x000000FFU) + +/** Bit definition for FEMC_ECCSTS register **/ +#define FEMC_ECCSTS_RDF ((uint32_t)0x3E000000U) +#define FEMC_ECCSTS_RDF_0 ((uint32_t)0x02000000U) +#define FEMC_ECCSTS_RDF_1 ((uint32_t)0x04000000U) +#define FEMC_ECCSTS_RDF_2 ((uint32_t)0x08000000U) +#define FEMC_ECCSTS_RDF_3 ((uint32_t)0x10000000U) +#define FEMC_ECCSTS_RDF_4 ((uint32_t)0x20000000U) +#define FEMC_ECCSTS_CORCTF ((uint32_t)0x01F00000U) +#define FEMC_ECCSTS_CORCTF_0 ((uint32_t)0x00100000U) +#define FEMC_ECCSTS_CORCTF_1 ((uint32_t)0x00200000U) +#define FEMC_ECCSTS_CORCTF_2 ((uint32_t)0x00400000U) +#define FEMC_ECCSTS_CORCTF_3 ((uint32_t)0x00800000U) +#define FEMC_ECCSTS_CORCTF_4 ((uint32_t)0x01000000U) +#define FEMC_ECCSTS_FAILF ((uint32_t)0x000F8000U) +#define FEMC_ECCSTS_FAILF_0 ((uint32_t)0x00008000U) +#define FEMC_ECCSTS_FAILF_1 ((uint32_t)0x00010000U) +#define FEMC_ECCSTS_FAILF_2 ((uint32_t)0x00020000U) +#define FEMC_ECCSTS_FAILF_3 ((uint32_t)0x00040000U) +#define FEMC_ECCSTS_FAILF_4 ((uint32_t)0x00080000U) +#define FEMC_ECCSTS_VLDF ((uint32_t)0x00007C00U) +#define FEMC_ECCSTS_VLDF_0 ((uint32_t)0x00000400U) +#define FEMC_ECCSTS_VLDF_1 ((uint32_t)0x00000800U) +#define FEMC_ECCSTS_VLDF_2 ((uint32_t)0x00001000U) +#define FEMC_ECCSTS_VLDF_3 ((uint32_t)0x00002000U) +#define FEMC_ECCSTS_VLDF_4 ((uint32_t)0x00004000U) +#define FEMC_ECCSTS_WRF ((uint32_t)0x00000200U) +#define FEMC_ECCSTS_LASTS ((uint32_t)0x00000180U) +#define FEMC_ECCSTS_LASTS_0 ((uint32_t)0x00000080U) +#define FEMC_ECCSTS_LASTS_1 ((uint32_t)0x00000100U) +#define FEMC_ECCSTS_BUSY ((uint32_t)0x00000040U) +#define FEMC_ECCSTS_INTF ((uint32_t)0x0000003FU) +#define FEMC_ECCSTS_INTF_0 ((uint32_t)0x00000001U) +#define FEMC_ECCSTS_INTF_1 ((uint32_t)0x00000002U) +#define FEMC_ECCSTS_INTF_2 ((uint32_t)0x00000004U) +#define FEMC_ECCSTS_INTF_3 ((uint32_t)0x00000008U) +#define FEMC_ECCSTS_INTF_4 ((uint32_t)0x00000010U) +#define FEMC_ECCSTS_INTF_5 ((uint32_t)0x00000020U) + +/** Bit definition for FEMC_ECCCFG register **/ +#define FEMC_ECCCFG_EBLKSIZ ((uint32_t)0x00001800U) +#define FEMC_ECCCFG_EBLKSIZ_0 ((uint32_t)0x00000800U) +#define FEMC_ECCCFG_EBLKSIZ_1 ((uint32_t)0x00001000U) +#define FEMC_ECCCFG_EBLKEN ((uint32_t)0x00000400U) +#define FEMC_ECCCFG_ABTINT ((uint32_t)0x00000200U) +#define FEMC_ECCCFG_RDCINT ((uint32_t)0x00000100U) +#define FEMC_ECCCFG_A8OUTMSK ((uint32_t)0x00000080U) +#define FEMC_ECCCFG_JUMP ((uint32_t)0x00000060U) +#define FEMC_ECCCFG_JUMP_0 ((uint32_t)0x00000020U) +#define FEMC_ECCCFG_JUMP_1 ((uint32_t)0x00000040U) +#define FEMC_ECCCFG_RMOD ((uint32_t)0x00000010U) +#define FEMC_ECCCFG_MOD ((uint32_t)0x0000000CU) +#define FEMC_ECCCFG_MOD_0 ((uint32_t)0x00000004U) +#define FEMC_ECCCFG_MOD_1 ((uint32_t)0x00000008U) +#define FEMC_ECCCFG_BLKNUM ((uint32_t)0x00000003U) +#define FEMC_ECCCFG_BLKNUM_0 ((uint32_t)0x00000001U) +#define FEMC_ECCCFG_BLKNUM_1 ((uint32_t)0x00000002U) + +/** Bit definition for FEMC_ECCMD0 register **/ +#define FEMC_ECCMD0_UEND ((uint32_t)0x01000000U) +#define FEMC_ECCMD0_RDEND ((uint32_t)0x00FF0000U) +#define FEMC_ECCMD0_RD ((uint32_t)0x0000FF00U) +#define FEMC_ECCMD0_WR ((uint32_t)0x000000FFU) + +/** Bit definition for FEMC_ECCMD1 register **/ +#define FEMC_ECCMD1_UEND ((uint32_t)0x01000000U) +#define FEMC_ECCMD1_RDCOLEND ((uint32_t)0x00FF0000U) +#define FEMC_ECCMD1_RDCOL ((uint32_t)0x0000FF00U) +#define FEMC_ECCMD1_WRCOL ((uint32_t)0x000000FFU) + +/** Bit definition for FEMC_ECCADDR0 register **/ +#define FEMC_ECCADDR0_ADDR ((uint32_t)0xFFFFFFFFU) + +/** Bit definition for FEMC_ECCADDR1 register **/ +#define FEMC_ECCADDR1_ADDR ((uint32_t)0x00FFFFFFU) + +/** Bit definition for FEMC_ECCBLK0/1/2/3 and FEMC_ECCEBLK register **/ +#define FEMC_ECCBLK_INTF ((uint32_t)0x80000000U) +#define FEMC_ECCBLK_VALDF ((uint32_t)0x40000000U) +#define FEMC_ECCBLK_RDF ((uint32_t)0x20000000U) +#define FEMC_ECCBLK_ERRF ((uint32_t)0x10000000U) +#define FEMC_ECCBLK_CRTF ((uint32_t)0x08000000U) +#define FEMC_ECCBLK_VAL ((uint32_t)0x00FFFFFFU) + +/** Bit definition for FEMC_SNADDR1/2/3/4 register **/ +#define FEMC_SNADDR_ADDRMCH ((uint32_t)0xFF000000U) +#define FEMC_SNADDR_ADDRMSK ((uint32_t)0x00FF0000U) + +/** Bit definition for FEMC_NADDR1/2 register **/ +#define FEMC_NADDR_ADDRMCH ((uint32_t)0xFF000000U) +#define FEMC_NADDR_ADDRMSK ((uint32_t)0x00FF0000U) + +/** Bit definition for FEMC_SNMOD register **/ +#define FEMC_SNMOD_MUXEN ((uint32_t)0x00000020U) +#define FEMC_SNMOD_AGTM ((uint32_t)0x00000010U) +#define FEMC_SNMOD_SYNC ((uint32_t)0x00000008U) + +/** Bit definition for FEMC_NMOD register **/ +#define FEMC_NMOD_CSL ((uint32_t)0x00000040U) +#define FEMC_NMOD_AGTM ((uint32_t)0x00000010U) +#define FEMC_NMOD_SYNC ((uint32_t)0x00000008U) + +/** Bit definition for FEMC_REMAP register **/ +#define FEMC_REMAP_REMAP ((uint32_t)0x00000001U) + +/*** Real-Time Clock (RTC) ***/ +/** Bits definition for RTC_TSH register **/ +#define RTC_TSH_APM ((uint32_t)0x00400000) +#define RTC_TSH_HOT ((uint32_t)0x00300000) +#define RTC_TSH_HOT_0 ((uint32_t)0x00100000) +#define RTC_TSH_HOT_1 ((uint32_t)0x00200000) +#define RTC_TSH_HOU ((uint32_t)0x000F0000) +#define RTC_TSH_HOU_0 ((uint32_t)0x00010000) +#define RTC_TSH_HOU_1 ((uint32_t)0x00020000) +#define RTC_TSH_HOU_2 ((uint32_t)0x00040000) +#define RTC_TSH_HOU_3 ((uint32_t)0x00080000) +#define RTC_TSH_MIT ((uint32_t)0x00007000) +#define RTC_TSH_MIT_0 ((uint32_t)0x00001000) +#define RTC_TSH_MIT_1 ((uint32_t)0x00002000) +#define RTC_TSH_MIT_2 ((uint32_t)0x00004000) +#define RTC_TSH_MIU ((uint32_t)0x00000F00) +#define RTC_TSH_MIU_0 ((uint32_t)0x00000100) +#define RTC_TSH_MIU_1 ((uint32_t)0x00000200) +#define RTC_TSH_MIU_2 ((uint32_t)0x00000400) +#define RTC_TSH_MIU_3 ((uint32_t)0x00000800) +#define RTC_TSH_SCT ((uint32_t)0x00000070) +#define RTC_TSH_SCT_0 ((uint32_t)0x00000010) +#define RTC_TSH_SCT_1 ((uint32_t)0x00000020) +#define RTC_TSH_SCT_2 ((uint32_t)0x00000040) +#define RTC_TSH_SCU ((uint32_t)0x0000000F) +#define RTC_TSH_SCU_0 ((uint32_t)0x00000001) +#define RTC_TSH_SCU_1 ((uint32_t)0x00000002) +#define RTC_TSH_SCU_2 ((uint32_t)0x00000004) +#define RTC_TSH_SCU_3 ((uint32_t)0x00000008) + +/** Bits definition for RTC_DATE register **/ +#define RTC_DATE_YRT ((uint32_t)0x00F00000) +#define RTC_DATE_YRT_0 ((uint32_t)0x00100000) +#define RTC_DATE_YRT_1 ((uint32_t)0x00200000) +#define RTC_DATE_YRT_2 ((uint32_t)0x00400000) +#define RTC_DATE_YRT_3 ((uint32_t)0x00800000) +#define RTC_DATE_YRU ((uint32_t)0x000F0000) +#define RTC_DATE_YRU_0 ((uint32_t)0x00010000) +#define RTC_DATE_YRU_1 ((uint32_t)0x00020000) +#define RTC_DATE_YRU_2 ((uint32_t)0x00040000) +#define RTC_DATE_YRU_3 ((uint32_t)0x00080000) +#define RTC_DATE_WDU ((uint32_t)0x0000E000) +#define RTC_DATE_WDU_0 ((uint32_t)0x00002000) +#define RTC_DATE_WDU_1 ((uint32_t)0x00004000) +#define RTC_DATE_WDU_2 ((uint32_t)0x00008000) +#define RTC_DATE_MOT ((uint32_t)0x00001000) +#define RTC_DATE_MOU ((uint32_t)0x00000F00) +#define RTC_DATE_MOU_0 ((uint32_t)0x00000100) +#define RTC_DATE_MOU_1 ((uint32_t)0x00000200) +#define RTC_DATE_MOU_2 ((uint32_t)0x00000400) +#define RTC_DATE_MOU_3 ((uint32_t)0x00000800) +#define RTC_DATE_DAT ((uint32_t)0x00000030) +#define RTC_DATE_DAT_0 ((uint32_t)0x00000010) +#define RTC_DATE_DAT_1 ((uint32_t)0x00000020) +#define RTC_DATE_DAU ((uint32_t)0x0000000F) +#define RTC_DATE_DAU_0 ((uint32_t)0x00000001) +#define RTC_DATE_DAU_1 ((uint32_t)0x00000002) +#define RTC_DATE_DAU_2 ((uint32_t)0x00000004) +#define RTC_DATE_DAU_3 ((uint32_t)0x00000008) + +/** Bits definition for RTC_CTRL register **/ +#define RTC_CTRL_CAOVIEN ((uint32_t)0x08000000) +#define RTC_CTRL_TAMPOE ((uint32_t)0x04000000) +#define RTC_CTRL_IETSEN ((uint32_t)0x01000000) +#define RTC_CTRL_COEN ((uint32_t)0x00800000) +#define RTC_CTRL_OUTSEL ((uint32_t)0x00600000) +#define RTC_CTRL_OUTSEL_0 ((uint32_t)0x00200000) +#define RTC_CTRL_OUTSEL_1 ((uint32_t)0x00400000) +#define RTC_CTRL_OPOL ((uint32_t)0x00100000) +#define RTC_CTRL_CALOSEL ((uint32_t)0x00080000) +#define RTC_CTRL_BAKP ((uint32_t)0x00040000) +#define RTC_CTRL_SU1H ((uint32_t)0x00020000) +#define RTC_CTRL_AD1H ((uint32_t)0x00010000) +#define RTC_CTRL_TSIEN ((uint32_t)0x00008000) +#define RTC_CTRL_WTIEN ((uint32_t)0x00004000) +#define RTC_CTRL_ALBIEN ((uint32_t)0x00002000) +#define RTC_CTRL_ALAIEN ((uint32_t)0x00001000) +#define RTC_CTRL_TSEN ((uint32_t)0x00000800) +#define RTC_CTRL_WTEN ((uint32_t)0x00000400) +#define RTC_CTRL_ALBEN ((uint32_t)0x00000200) +#define RTC_CTRL_ALAEN ((uint32_t)0x00000100) +#define RTC_CTRL_CAOVEN ((uint32_t)0x00000080) + +#define RTC_CTRL_HFMT ((uint32_t)0x00000040) +#define RTC_CTRL_BYPS ((uint32_t)0x00000020) +#define RTC_CTRL_REFCLKEN ((uint32_t)0x00000010) +#define RTC_CTRL_TEDGE ((uint32_t)0x00000008) +#define RTC_CTRL_WKUPSEL ((uint32_t)0x00000007) +#define RTC_CTRL_WKUPSEL_0 ((uint32_t)0x00000001) +#define RTC_CTRL_WKUPSEL_1 ((uint32_t)0x00000002) +#define RTC_CTRL_WKUPSEL_2 ((uint32_t)0x00000004) + +/** Bits definition for RTC_INITSTS register **/ +#define RTC_INITSTS_BKSRAMREF ((uint32_t)0x01000000) +#define RTC_INITSTS_IETSF ((uint32_t)0x00800000) +#define RTC_INITSTS_CAOVF ((uint32_t)0x00400000) +#define RTC_INITSTS_TAM8F ((uint32_t)0x00200000) +#define RTC_INITSTS_TAM7F ((uint32_t)0x00100000) +#define RTC_INITSTS_TAM6F ((uint32_t)0x00080000) +#define RTC_INITSTS_TAM5F ((uint32_t)0x00040000) +#define RTC_INITSTS_TAM4F ((uint32_t)0x00020000) +#define RTC_INITSTS_RECPF ((uint32_t)0x00010000) +#define RTC_INITSTS_TAM3F ((uint32_t)0x00008000) +#define RTC_INITSTS_TAM2F ((uint32_t)0x00004000) +#define RTC_INITSTS_TAM1F ((uint32_t)0x00002000) +#define RTC_INITSTS_TISOVF ((uint32_t)0x00001000) +#define RTC_INITSTS_TISF ((uint32_t)0x00000800) +#define RTC_INITSTS_WTF ((uint32_t)0x00000400) +#define RTC_INITSTS_ALBF ((uint32_t)0x00000200) +#define RTC_INITSTS_ALAF ((uint32_t)0x00000100) +#define RTC_INITSTS_INITM ((uint32_t)0x00000080) +#define RTC_INITSTS_INITF ((uint32_t)0x00000040) +#define RTC_INITSTS_RSYF ((uint32_t)0x00000020) +#define RTC_INITSTS_INITSF ((uint32_t)0x00000010) +#define RTC_INITSTS_SHOPF ((uint32_t)0x00000008) +#define RTC_INITSTS_WTWF ((uint32_t)0x00000004) +#define RTC_INITSTS_ALBWF ((uint32_t)0x00000002) +#define RTC_INITSTS_ALAWF ((uint32_t)0x00000001) + +/** Bits definition for RTC_PRE register **/ +#define RTC_PRE_DIVA ((uint32_t)0x007F0000) +#define RTC_PRE_DIVS ((uint32_t)0x00007FFF) + +/** Bits definition for RTC_WKUPT register **/ +#define RTC_WKUPT_WKUPT ((uint32_t)0x0000FFFF) + + +/** Bits definition for RTC_ALARMA register **/ +#define RTC_ALARMA_MASK4 ((uint32_t)0x80000000) +#define RTC_ALARMA_WKDSEL ((uint32_t)0x40000000) +#define RTC_ALARMA_DTT ((uint32_t)0x30000000) +#define RTC_ALARMA_DTT_0 ((uint32_t)0x10000000) +#define RTC_ALARMA_DTT_1 ((uint32_t)0x20000000) +#define RTC_ALARMA_DTU ((uint32_t)0x0F000000) +#define RTC_ALARMA_DTU_0 ((uint32_t)0x01000000) +#define RTC_ALARMA_DTU_1 ((uint32_t)0x02000000) +#define RTC_ALARMA_DTU_2 ((uint32_t)0x04000000) +#define RTC_ALARMA_DTU_3 ((uint32_t)0x08000000) +#define RTC_ALARMA_MASK3 ((uint32_t)0x00800000) +#define RTC_ALARMA_APM ((uint32_t)0x00400000) +#define RTC_ALARMA_HOT ((uint32_t)0x00300000) +#define RTC_ALARMA_HOT_0 ((uint32_t)0x00100000) +#define RTC_ALARMA_HOT_1 ((uint32_t)0x00200000) +#define RTC_ALARMA_HOU ((uint32_t)0x000F0000) +#define RTC_ALARMA_HOU_0 ((uint32_t)0x00010000) +#define RTC_ALARMA_HOU_1 ((uint32_t)0x00020000) +#define RTC_ALARMA_HOU_2 ((uint32_t)0x00040000) +#define RTC_ALARMA_HOU_3 ((uint32_t)0x00080000) +#define RTC_ALARMA_MASK2 ((uint32_t)0x00008000) +#define RTC_ALARMA_MIT ((uint32_t)0x00007000) +#define RTC_ALARMA_MIT_0 ((uint32_t)0x00001000) +#define RTC_ALARMA_MIT_1 ((uint32_t)0x00002000) +#define RTC_ALARMA_MIT_2 ((uint32_t)0x00004000) +#define RTC_ALARMA_MIU ((uint32_t)0x00000F00) +#define RTC_ALARMA_MIU_0 ((uint32_t)0x00000100) +#define RTC_ALARMA_MIU_1 ((uint32_t)0x00000200) +#define RTC_ALARMA_MIU_2 ((uint32_t)0x00000400) +#define RTC_ALARMA_MIU_3 ((uint32_t)0x00000800) +#define RTC_ALARMA_MASK1 ((uint32_t)0x00000080) +#define RTC_ALARMA_SET ((uint32_t)0x00000070) +#define RTC_ALARMA_SET_0 ((uint32_t)0x00000010) +#define RTC_ALARMA_SET_1 ((uint32_t)0x00000020) +#define RTC_ALARMA_SET_2 ((uint32_t)0x00000040) +#define RTC_ALARMA_SEU ((uint32_t)0x0000000F) +#define RTC_ALARMA_SEU_0 ((uint32_t)0x00000001) +#define RTC_ALARMA_SEU_1 ((uint32_t)0x00000002) +#define RTC_ALARMA_SEU_2 ((uint32_t)0x00000004) +#define RTC_ALARMA_SEU_3 ((uint32_t)0x00000008) + +/** Bits definition for RTC_ALARMB register **/ +#define RTC_ALARMB_MASK4 ((uint32_t)0x80000000) +#define RTC_ALARMB_WKDSEL ((uint32_t)0x40000000) +#define RTC_ALARMB_DTT ((uint32_t)0x30000000) +#define RTC_ALARMB_DTT_0 ((uint32_t)0x10000000) +#define RTC_ALARMB_DTT_1 ((uint32_t)0x20000000) +#define RTC_ALARMB_DTU ((uint32_t)0x0F000000) +#define RTC_ALARMB_DTU_0 ((uint32_t)0x01000000) +#define RTC_ALARMB_DTU_1 ((uint32_t)0x02000000) +#define RTC_ALARMB_DTU_2 ((uint32_t)0x04000000) +#define RTC_ALARMB_DTU_3 ((uint32_t)0x08000000) +#define RTC_ALARMB_MASK3 ((uint32_t)0x00800000) +#define RTC_ALARMB_APM ((uint32_t)0x00400000) +#define RTC_ALARMB_HOT ((uint32_t)0x00300000) +#define RTC_ALARMB_HOT_0 ((uint32_t)0x00100000) +#define RTC_ALARMB_HOT_1 ((uint32_t)0x00200000) +#define RTC_ALARMB_HOU ((uint32_t)0x000F0000) +#define RTC_ALARMB_HOU_0 ((uint32_t)0x00010000) +#define RTC_ALARMB_HOU_1 ((uint32_t)0x00020000) +#define RTC_ALARMB_HOU_2 ((uint32_t)0x00040000) +#define RTC_ALARMB_HOU_3 ((uint32_t)0x00080000) +#define RTC_ALARMB_MASK2 ((uint32_t)0x00008000) +#define RTC_ALARMB_MIT ((uint32_t)0x00007000) +#define RTC_ALARMB_MIT_0 ((uint32_t)0x00001000) +#define RTC_ALARMB_MIT_1 ((uint32_t)0x00002000) +#define RTC_ALARMB_MIT_2 ((uint32_t)0x00004000) +#define RTC_ALARMB_MIU ((uint32_t)0x00000F00) +#define RTC_ALARMB_MIU_0 ((uint32_t)0x00000100) +#define RTC_ALARMB_MIU_1 ((uint32_t)0x00000200) +#define RTC_ALARMB_MIU_2 ((uint32_t)0x00000400) +#define RTC_ALARMB_MIU_3 ((uint32_t)0x00000800) +#define RTC_ALARMB_MASK1 ((uint32_t)0x00000080) +#define RTC_ALARMB_SET ((uint32_t)0x00000070) +#define RTC_ALARMB_SET_0 ((uint32_t)0x00000010) +#define RTC_ALARMB_SET_1 ((uint32_t)0x00000020) +#define RTC_ALARMB_SET_2 ((uint32_t)0x00000040) +#define RTC_ALARMB_SEU ((uint32_t)0x0000000F) +#define RTC_ALARMB_SEU_0 ((uint32_t)0x00000001) +#define RTC_ALARMB_SEU_1 ((uint32_t)0x00000002) +#define RTC_ALARMB_SEU_2 ((uint32_t)0x00000004) +#define RTC_ALARMB_SEU_3 ((uint32_t)0x00000008) + +/** Bits definition for RTC_WRP register **/ +#define RTC_WRP_PKEY ((uint32_t)0x000000FF) + +/** Bits definition for RTC_SUBS register **/ +#define RTC_SUBS_SS ((uint32_t)0x0000FFFF) + +/** Bits definition for RTC_SCTRL register **/ +#define RTC_SCTRL_AD1S ((uint32_t)0x80000000) +#define RTC_SCTRL_SUBF ((uint32_t)0x00007FFF) + + + +/** Bits definition for RTC_TST register **/ +#define RTC_TST_APM ((uint32_t)0x00400000) +#define RTC_TST_HOT ((uint32_t)0x00300000) +#define RTC_TST_HOT_0 ((uint32_t)0x00100000) +#define RTC_TST_HOT_1 ((uint32_t)0x00200000) +#define RTC_TST_HOU ((uint32_t)0x000F0000) +#define RTC_TST_HOU_0 ((uint32_t)0x00010000) +#define RTC_TST_HOU_1 ((uint32_t)0x00020000) +#define RTC_TST_HOU_2 ((uint32_t)0x00040000) +#define RTC_TST_HOU_3 ((uint32_t)0x00080000) +#define RTC_TST_MIT ((uint32_t)0x00007000) +#define RTC_TST_MIT_0 ((uint32_t)0x00001000) +#define RTC_TST_MIT_1 ((uint32_t)0x00002000) +#define RTC_TST_MIT_2 ((uint32_t)0x00004000) +#define RTC_TST_MIU ((uint32_t)0x00000F00) +#define RTC_TST_MIU_0 ((uint32_t)0x00000100) +#define RTC_TST_MIU_1 ((uint32_t)0x00000200) +#define RTC_TST_MIU_2 ((uint32_t)0x00000400) +#define RTC_TST_MIU_3 ((uint32_t)0x00000800) +#define RTC_TST_SET ((uint32_t)0x00000070) +#define RTC_TST_SET_0 ((uint32_t)0x00000010) +#define RTC_TST_SET_1 ((uint32_t)0x00000020) +#define RTC_TST_SET_2 ((uint32_t)0x00000040) +#define RTC_TST_SEU ((uint32_t)0x0000000F) +#define RTC_TST_SEU_0 ((uint32_t)0x00000001) +#define RTC_TST_SEU_1 ((uint32_t)0x00000002) +#define RTC_TST_SEU_2 ((uint32_t)0x00000004) +#define RTC_TST_SEU_3 ((uint32_t)0x00000008) + +/** Bits definition for RTC_TSD register **/ +#define RTC_TSD_YRT ((uint32_t)0x00F00000) +#define RTC_TSD_YRT_0 ((uint32_t)0x00100000) +#define RTC_TSD_YRT_1 ((uint32_t)0x00200000) +#define RTC_TSD_YRT_2 ((uint32_t)0x00400000) +#define RTC_TSD_YRT_3 ((uint32_t)0x00800000) +#define RTC_TSD_YRU ((uint32_t)0x000F0000) +#define RTC_TSD_YRU_0 ((uint32_t)0x00010000) +#define RTC_TSD_YRU_1 ((uint32_t)0x00020000) +#define RTC_TSD_YRU_2 ((uint32_t)0x00040000) +#define RTC_TSD_YRU_3 ((uint32_t)0x00080000) + +#define RTC_TSD_WDU ((uint32_t)0x0000E000) +#define RTC_TSD_WDU_0 ((uint32_t)0x00002000) +#define RTC_TSD_WDU_1 ((uint32_t)0x00004000) +#define RTC_TSD_WDU_2 ((uint32_t)0x00008000) +#define RTC_TSD_MOT ((uint32_t)0x00001000) +#define RTC_TSD_MOU ((uint32_t)0x00000F00) +#define RTC_TSD_MOU_0 ((uint32_t)0x00000100) +#define RTC_TSD_MOU_1 ((uint32_t)0x00000200) +#define RTC_TSD_MOU_2 ((uint32_t)0x00000400) +#define RTC_TSD_MOU_3 ((uint32_t)0x00000800) +#define RTC_TSD_DAT ((uint32_t)0x00000030) +#define RTC_TSD_DAT_0 ((uint32_t)0x00000010) +#define RTC_TSD_DAT_1 ((uint32_t)0x00000020) +#define RTC_TSD_DAU ((uint32_t)0x0000000F) +#define RTC_TSD_DAU_0 ((uint32_t)0x00000001) +#define RTC_TSD_DAU_1 ((uint32_t)0x00000002) +#define RTC_TSD_DAU_2 ((uint32_t)0x00000004) +#define RTC_TSD_DAU_3 ((uint32_t)0x00000008) + +/** Bits definition for RTC_TSSS register **/ +#define RTC_TSSS_SSE ((uint32_t)0x0000FFFF) + +/** Bits definition for RTC_CALIB register **/ +#define RTC_CALIB_CP ((uint32_t)0x00008000) +#define RTC_CALIB_CW8 ((uint32_t)0x00004000) +#define RTC_CALIB_CW16 ((uint32_t)0x00002000) +#define RTC_CALIB_CM ((uint32_t)0x000001FF) +#define RTC_CALIB_CM_0 ((uint32_t)0x00000001) +#define RTC_CALIB_CM_1 ((uint32_t)0x00000002) +#define RTC_CALIB_CM_2 ((uint32_t)0x00000004) +#define RTC_CALIB_CM_3 ((uint32_t)0x00000008) +#define RTC_CALIB_CM_4 ((uint32_t)0x00000010) +#define RTC_CALIB_CM_5 ((uint32_t)0x00000020) +#define RTC_CALIB_CM_6 ((uint32_t)0x00000040) +#define RTC_CALIB_CM_7 ((uint32_t)0x00000080) +#define RTC_CALIB_CM_8 ((uint32_t)0x00000100) + +/** Bits definition for RTC_ALRMASS register **/ +#define RTC_ALRMASS_MASKSSB ((uint32_t)0x0F000000) +#define RTC_ALRMASS_MASKSSB_0 ((uint32_t)0x01000000) +#define RTC_ALRMASS_MASKSSB_1 ((uint32_t)0x02000000) +#define RTC_ALRMASS_MASKSSB_2 ((uint32_t)0x04000000) +#define RTC_ALRMASS_MASKSSB_3 ((uint32_t)0x08000000) +#define RTC_ALRMASS_SSV ((uint32_t)0x00007FFF) + +/** Bits definition for RTC_ALRMBSS register **/ +#define RTC_ALRMBSS_MASKSSB ((uint32_t)0x0F000000) +#define RTC_ALRMBSS_MASKSSB_0 ((uint32_t)0x01000000) +#define RTC_ALRMBSS_MASKSSB_1 ((uint32_t)0x02000000) +#define RTC_ALRMBSS_MASKSSB_2 ((uint32_t)0x04000000) +#define RTC_ALRMBSS_MASKSSB_3 ((uint32_t)0x08000000) +#define RTC_ALRMBSS_SSV ((uint32_t)0x00007FFF) + +/** Bits definition for RTC_OPT register **/ +#define RTC_OPT_OPDC ((uint32_t)0x00000080) +#define RTC_OPT_OUTMAP ((uint32_t)0x00000008) +#define RTC_OPT_OUTPU ((uint32_t)0x00000004) +#define RTC_OPT_PWREST ((uint32_t)0x00000002) +#define RTC_OPT_TYPE ((uint32_t)0x00000001) + +/** Bits definition for RTC_BKP1 register **/ +#define RTC_BKP1 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP2 register **/ +#define RTC_BKP2 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP3 register **/ +#define RTC_BKP3 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP4 register **/ +#define RTC_BKP4 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP5 register **/ +#define RTC_BKP5 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP6 register **/ +#define RTC_BKP6 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP7 register **/ +#define RTC_BKP7 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP8 register **/ +#define RTC_BKP8 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP9 register **/ +#define RTC_BKP9 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP10 register **/ +#define RTC_BKP10 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP11 register **/ +#define RTC_BKP11 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP12register **/ +#define RTC_BKP12 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP13 register **/ +#define RTC_BKP13 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP14 register **/ +#define RTC_BKP14 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP15 register **/ +#define RTC_BKP15 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP16 register **/ +#define RTC_BKP16 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP17register **/ +#define RTC_BKP17 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP18 register **/ +#define RTC_BKP18 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP19 register **/ +#define RTC_BKP19 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP20 register **/ +#define RTC_BKP20 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP21 register **/ +#define RTC_BKP21 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP22 register **/ +#define RTC_BKP22 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP23 register **/ +#define RTC_BKP23 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP24 register **/ +#define RTC_BKP24 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP25 register **/ +#define RTC_BKP25 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP26 register **/ +#define RTC_BKP26 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP27 register **/ +#define RTC_BKP27 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP28 register **/ +#define RTC_BKP28 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP29 register **/ +#define RTC_BKP29 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP30 register **/ +#define RTC_BKP30 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP31 register **/ +#define RTC_BKP31 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_BKP32 register **/ +#define RTC_BKP32 ((uint32_t)0xFFFFFFFF) + +/** Bits definition for RTC_TMPCFG register **/ +#define RTC_TMPCFG_TPPUDIS ((uint32_t)0x00008000) +#define RTC_TMPCFG_TPPRCH ((uint32_t)0x00006000) +#define RTC_TMPCFG_TPPRCH_0 ((uint32_t)0x00002000) +#define RTC_TMPCFG_TPPRCH_1 ((uint32_t)0x00004000) +#define RTC_TMPCFG_TPFLT ((uint32_t)0x00001800) +#define RTC_TMPCFG_TPFLT_0 ((uint32_t)0x00000800) +#define RTC_TMPCFG_TPFLT_1 ((uint32_t)0x00001000) +#define RTC_TMPCFG_TPFREQ ((uint32_t)0x00000700) +#define RTC_TMPCFG_TPFREQ_0 ((uint32_t)0x00000100) +#define RTC_TMPCFG_TPFREQ_1 ((uint32_t)0x00000200) +#define RTC_TMPCFG_TPFREQ_2 ((uint32_t)0x00000400) +#define RTC_TMPCFG_TPTS ((uint32_t)0x00000080) +#define RTC_TMPCFG_TPINIEN ((uint32_t)0x00000004) + +/** Bits definition for RTC_TMPCTRL1/2/3/4/5/6/7/8 register **/ +#define RTC_TMPCTRL_TPMF ((uint32_t)0x00000010) +#define RTC_TMPCTRL_TPNOE ((uint32_t)0x00000008) +#define RTC_TMPCTRL_TPINTEN ((uint32_t)0x00000004) +#define RTC_TMPCTRL_TPTRG ((uint32_t)0x00000002) +#define RTC_TMPCTRL_TPEN ((uint32_t)0x00000001) + + +/*** FMAC ***/ +/*** Filter Math Accelerator (FMAC) ***/ +/***************** Bit definition for FMAC_X1BUFCFG register ****************/ +#define FMAC_X1BUFCFG_X1BASE ((uint32_t)0x000000FFU) /* bit[7:0] X1 buffer Base address bits[7:0] */ +#define FMAC_X1BUFCFG_X1BUFSIZE ((uint32_t)0x0000FF00U) /* bit[15:8] X1 buffer size(16-bit words) bits[7:0] */ +#define FMAC_X1BUFCFG_X1BUFWM ((uint32_t)0x03000000U) /* bit[25:24] X1 buffer full watermark size bits[1:0] */ +#define FMAC_X1BUFCFG_X1BUFWM_0 ((uint32_t)0x01000000U) /* bit[24] Watermark bit 0 */ +#define FMAC_X1BUFCFG_X1BUFWM_1 ((uint32_t)0x02000000U) /* bit[25] Watermark bit 1 */ + +/***************** Bit definition for FMAC_X2BUFCFG register ************/ +#define FMAC_X2BUFCFG_X2BASE ((uint32_t)0x000000FFU) /* bit[7:0] X2 buffer Base address bits[7:0] */ +#define FMAC_X2BUFCFG_X2BUFSIZE ((uint32_t)0x0000FF00U) /* bit[15:8] X2 buffer size(16-bit words) bits[7:0] */ + +/***************** Bit definition for FMAC_YBUFCFG register *************/ +#define FMAC_YBUFCFG_YBASE ((uint32_t)0x000000FFU) /* bit[7:0] Y buffer Base address bits[7:0] */ +#define FMAC_YBUFCFG_YBUFSIZE ((uint32_t)0x0000FF00U) /* bit[15:8] Y buffer size(16-bit words) bits[7:0] */ +#define FMAC_YBUFCFG_YBUFWM ((uint32_t)0x03000000U) /* bit[25:24] Y buffer full watermark size bits[1:0] */ +#define FMAC_YBUFCFG_YBUFWM_0 ((uint32_t)0x01000000U) /* bit[24] Watermark bit 0 */ +#define FMAC_YBUFCFG_YBUFWM_1 ((uint32_t)0x02000000U) /* bit[25] Watermark bit 1 */ + +/****************** Bit definition for FMAC_PARAMCFG register **************/ +#define FMAC_PARAMCFG_P ((uint32_t)0x000000FFU) /* bit[ 7: 0] Input parameter P bits[7:0] */ +#define FMAC_PARAMCFG_Q ((uint32_t)0x0000FF00U) /* bit[15: 8] Input parameter Q bits[7:0] */ +#define FMAC_PARAMCFG_R ((uint32_t)0x00FF0000U) /* bit[23:16] Input parameter R bits[7:0] */ +#define FMAC_PARAMCFG_FUNC ((uint32_t)0x7F000000U) /* bit[30:24] Function bits[6:0] */ +#define FMAC_PARAMCFG_START ((uint32_t)0x80000000U) /* bit[31] Enable execution bit */ + +/******************** Bit definition for FMAC_CTRL register ***************/ +#define FMAC_CTRL_RINTEN ((uint32_t)0x00000001U) /* bit[0] Enable read interrupt */ +#define FMAC_CTRL_WIINEN ((uint32_t)0x00000002U) /* bit[1] Enable write interrupt */ +#define FMAC_CTRL_OVINTEN ((uint32_t)0x00000004U) /* bit[2] Enable overflow error interrupts */ +#define FMAC_CTRL_UNINTEN ((uint32_t)0x00000008U) /* bit[3] Enable underflow error interrupts */ +#define FMAC_CTRL_SATINTEN ((uint32_t)0x00000010U) /* bit[4] Enable saturation error interrupts */ +#define FMAC_CTRL_DMAREN ((uint32_t)0x00000100U) /* bit[8] Enable DMA read channel requests */ +#define FMAC_CTRL_DMAWEN ((uint32_t)0x00000200U) /* bit[9] Enable DMA write channel requests */ +#define FMAC_CTRL_LIMITEN ((uint32_t)0x00008000U) /* bit[15] Enable limit */ +#define FMAC_CTRL_RESET ((uint32_t)0x00010000U) /* bit[16] Reset filter mathematical accelerator unit */ + +/******************* Bit definition for FMAC_STS register ****************/ +#define FMAC_STS_YBUFEF ((uint32_t)0x00000001U) /* bit[0] Y buffer empty flag */ +#define FMAC_STS_X1BUFFF ((uint32_t)0x00000002U) /* bit[1] X1 buffer full flag */ +#define FMAC_STS_OVF ((uint32_t)0x00000100U) /* bit[8] Overflow error flag */ +#define FMAC_STS_UNF ((uint32_t)0x00000200U) /* bit[9] Underflow error flag */ +#define FMAC_STS_SATF ((uint32_t)0x00000400U) /* bit[10] Saturation error flag */ + +/****************** Bit definition for FMAC_WDAT register **************/ +#define FMAC_WDAT_WDAT ((uint32_t)0x0000FFFFU) /* bit[15:0] Write data */ + +/****************** Bit definition for FMACX_RDAT register *************/ +#define FMAC_RDAT_RDAT ((uint32_t)0x0000FFFFU) /* bit[15:0] Read data */ + + +/** Bit definition for SHRTIM_MCTRL register **/ +#define SHRTIM_MCTRL_BRSTDMA ((uint32_t)0xC0000000U) /* Bit[31:30] Burst DMA update */ +#define SHRTIM_MCTRL_BRSTDMA_0 ((uint32_t)0x40000000U) /* Bit30 */ +#define SHRTIM_MCTRL_BRSTDMA_1 ((uint32_t)0x80000000U) /* Bit31 */ +#define SHRTIM_MCTRL_MREPTUEN ((uint32_t)0x20000000U) /* Bit[29] Master timer repetitiion update */ +#define SHRTIM_MCTRL_PLEN ((uint32_t)0x08000000U) /* Bit[27] Preload enable */ +#define SHRTIM_MCTRL_DACTRIG ((uint32_t)0x06000000U) /* Bit[26:25] DAC synchronization trigger */ +#define SHRTIM_MCTRL_DACTRIG_0 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_MCTRL_DACTRIG_1 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_MCTRL_TFCNTEN ((uint32_t)0x00400000U) /* Bit[22] Timer F counter enable */ +#define SHRTIM_MCTRL_TECNTEN ((uint32_t)0x00200000U) /* Bit[21] Timer E counter enable */ +#define SHRTIM_MCTRL_TDCNTEN ((uint32_t)0x00100000U) /* Bit[20] Timer D counter enable */ +#define SHRTIM_MCTRL_TCCNTEN ((uint32_t)0x00080000U) /* Bit[19] Timer C counter enable */ +#define SHRTIM_MCTRL_TBCNTEN ((uint32_t)0x00040000U) /* Bit[18] Timer B counter enable */ +#define SHRTIM_MCTRL_TACNTEN ((uint32_t)0x00020000U) /* Bit[17] Timer A counter enable */ +#define SHRTIM_MCTRL_MCNTEN ((uint32_t)0x00010000U) /* Bit[16] Master timer counter enable */ +#define SHRTIM_MCTRL_SYNCOSRC ((uint32_t)0x0000C000U) /* Bit[15:14] Synchronization source */ +#define SHRTIM_MCTRL_SYNCOSRC_0 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_MCTRL_SYNCOSRC_1 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_MCTRL_SYNCSTRT ((uint32_t)0x00002000U) /* Bit[13] Synchronization to allow master start */ +#define SHRTIM_MCTRL_SYNCRST ((uint32_t)0x00001000U) /* Bit[12] Synchronization to allow master reset */ +#define SHRTIM_MCTRL_SYNCIN ((uint32_t)0x00000700U) /* Bit[10:8] Synchronization input */ +#define SHRTIM_MCTRL_SYNCIN_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_MCTRL_SYNCIN_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_MCTRL_SYNCIN_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_MCTRL_ILV ((uint32_t)0x000000C0U) /* Bit[7:6] Master interleaved mode */ +#define SHRTIM_MCTRL_ILV_0 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_MCTRL_ILV_1 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_MCTRL_HLF ((uint32_t)0x00000020U) /* Bit[5] Half mode. */ +#define SHRTIM_MCTRL_RTG ((uint32_t)0x00000010U) /* Bit[4] Master retrigger mode */ +#define SHRTIM_MCTRL_CONT ((uint32_t)0x00000008U) /* Bit[3] Master continues mode */ +#define SHRTIM_MCTRL_CKPSC ((uint32_t)0x00000007U) /* Bit[2:0] Master clock prescaler */ +#define SHRTIM_MCTRL_CKPSC_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_MCTRL_CKPSC_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_MCTRL_CKPSC_2 ((uint32_t)0x00000004U) /* Bit2 */ + +/** Bit definition for SHRTIM_MINTSTS register **/ +#define SHRTIM_MINTSTS_MUPDITF ((uint32_t)0x00000040U) /* Bit[6] Master registers update interrupt flag */ +#define SHRTIM_MINTSTS_SYNCINITF ((uint32_t)0x00000020U) /* Bit[5] Synchronization input interrupt flag */ +#define SHRTIM_MINTSTS_MREPTITF ((uint32_t)0x00000010U) /* Bit[4] Master repetition interrupt flag */ +#define SHRTIM_MINTSTS_MCMP4ITF ((uint32_t)0x00000008U) /* Bit[3] Master timer compare 4 interrupt flag */ +#define SHRTIM_MINTSTS_MCMP3ITF ((uint32_t)0x00000004U) /* Bit[2] Master timer compare 3 interrupt flag */ +#define SHRTIM_MINTSTS_MCMP2ITF ((uint32_t)0x00000002U) /* Bit[1] Master timer compare 2 interrupt flag */ +#define SHRTIM_MINTSTS_MCMP1ITF ((uint32_t)0x00000001U) /* Bit[0] Master timer compare 1 interrupt flag */ + +/** Bit definition for SHRTIM_MINTCLR register **/ +#define SHRTIM_MINTCLR_MUPDIC ((uint32_t)0x00000040U) /* Bit[6] Master update interrupt flag clear */ +#define SHRTIM_MINTCLR_SYNCINIC ((uint32_t)0x00000020U) /* Bit[5] Master sync interrupt flag clear */ +#define SHRTIM_MINTCLR_MREPTIC ((uint32_t)0x00000010U) /* Bit[4] Master repetition interrupt flag clear */ +#define SHRTIM_MINTCLR_MCMP4IC ((uint32_t)0x00000008U) /* Bit[3] Master compare4 interrupt flag clear */ +#define SHRTIM_MINTCLR_MCMP3IC ((uint32_t)0x00000004U) /* Bit[2] Master compare3 interrupt flag clear */ +#define SHRTIM_MINTCLR_MCMP2IC ((uint32_t)0x00000002U) /* Bit[1] Master compare2 interrupt flag clear */ +#define SHRTIM_MINTCLR_MCMP1IC ((uint32_t)0x00000001U) /* Bit[0] Master compare1 interrupt flag clear */ + +/** Bit definition for SHRTIM_MIDEN register **/ +#define SHRTIM_MIDEN_MUPDDEN ((uint32_t)0x00400000U) /* Bit[22] Master registers update DMA request enable */ +#define SHRTIM_MIDEN_SYNCINDEN ((uint32_t)0x00200000U) /* Bit[21] Synchronization input DMA request enable */ +#define SHRTIM_MIDEN_MREPTDEN ((uint32_t)0x00100000U) /* Bit[20] Master repetition counter DMA request enable */ +#define SHRTIM_MIDEN_MCMP4DEN ((uint32_t)0x00080000U) /* Bit[19] Master timer compare 4 DMA request enable */ +#define SHRTIM_MIDEN_MCMP3DEN ((uint32_t)0x00040000U) /* Bit[18] Master timer compare 3 DMA request enable */ +#define SHRTIM_MIDEN_MCMP2DEN ((uint32_t)0x00020000U) /* Bit[17] Master timer compare 2 DMA request enable */ +#define SHRTIM_MIDEN_MCMP1DEN ((uint32_t)0x00010000U) /* Bit[16] Master timer compare 1 DMA request enable */ +#define SHRTIM_MIDEN_MUPDIEN ((uint32_t)0x00000040U) /* Bit[6] Master registers update interrupt request enable */ +#define SHRTIM_MIDEN_SYNCINIEN ((uint32_t)0x00000020U) /* Bit[5] Synchronization input interrupt request enable */ +#define SHRTIM_MIDEN_MREPTIEN ((uint32_t)0x00000010U) /* Bit[4] Master repetition counter interrupt request enable */ +#define SHRTIM_MIDEN_MCMP4IEN ((uint32_t)0x00000008U) /* Bit[3] Master timer compare 4 interrupt request enable */ +#define SHRTIM_MIDEN_MCMP3IEN ((uint32_t)0x00000004U) /* Bit[2] Master timer compare 3 interrupt request enable */ +#define SHRTIM_MIDEN_MCMP2IEN ((uint32_t)0x00000002U) /* Bit[1] Master timer compare 2 interrupt request enable */ +#define SHRTIM_MIDEN_MCMP1IEN ((uint32_t)0x00000001U) /* Bit[0] Master timer compare 1 interrupt request enable */ + +/** Bit definition for SHRTIM_MCNT register **/ +#define SHRTIM_MCNT_MCOUNT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Master timer counter */ +#define SHRTIM_MCNT_MCOUNT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_MCNT_MCOUNT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_MCNT_MCOUNT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_MCNT_MCOUNT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_MCNT_MCOUNT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_MCNT_MCOUNT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_MCNT_MCOUNT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_MCNT_MCOUNT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_MCNT_MCOUNT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_MCNT_MCOUNT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_MCNT_MCOUNT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_MCNT_MCOUNT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_MCNT_MCOUNT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_MCNT_MCOUNT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_MCNT_MCOUNT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_MCNT_MCOUNT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_MPRD register **/ +#define SHRTIM_MPRD_MPRD ((uint32_t)0x0000FFFFU) /* Bit[15:0] Master timer period */ +#define SHRTIM_MPRD_MPRD_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_MPRD_MPRD_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_MPRD_MPRD_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_MPRD_MPRD_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_MPRD_MPRD_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_MPRD_MPRD_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_MPRD_MPRD_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_MPRD_MPRD_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_MPRD_MPRD_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_MPRD_MPRD_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_MPRD_MPRD_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_MPRD_MPRD_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_MPRD_MPRD_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_MPRD_MPRD_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_MPRD_MPRD_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_MPRD_MPRD_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_MREPT register **/ +#define SHRTIM_MREPT_MREPT ((uint32_t)0x000000FFU) /* Bit[7:0] Master timer repetition period */ +#define SHRTIM_MREPT_MREPT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_MREPT_MREPT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_MREPT_MREPT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_MREPT_MREPT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_MREPT_MREPT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_MREPT_MREPT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_MREPT_MREPT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_MREPT_MREPT_7 ((uint32_t)0x00000080U) /* Bit7 */ + +/** Bit definition for SHRTIM_MCMP1DAT register **/ +#define SHRTIM_MCMP1DAT_MCMP1DAT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Master timer compare 1 data */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_MCMP1DAT_MCMP1DAT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_MCMP2DAT register **/ +#define SHRTIM_MCMP2DAT_MCMP2DAT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Master timer compare 2 data */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_MCMP2DAT_MCMP2DAT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_MCMP3DAT register **/ +#define SHRTIM_MCMP3DAT_MCMP3DAT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Master timer compare 3 data */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_MCMP3DAT_MCMP3DAT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_MCMP4DAT register **/ +#define SHRTIM_MCMP4DAT_MCMP4DAT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Master timer compare 4 data */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_MCMP4DAT_MCMP4DAT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_SYNCOUT register **/ +#define SHRTIM_SYNCOUT_SYNCOUTPUS ((uint32_t)0x00000003U) /* Bit[1:0] These bitfield define the polarity of synchronization output. */ +#define SHRTIM_SYNCOUT_SYNCOUTPUS_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_SYNCOUT_SYNCOUTPUS_1 ((uint32_t)0x00000002U) /* Bit1 */ + +/** Bit definition for SHRTIM_FRZDIS register **/ +#define SHRTIM_FRZDIS_ALLTIMDBGEN ((uint32_t)0x00000080U) /* Bit[7] Debug freeze bit used to hault all timers (master + slave) while in debug mode */ +#define SHRTIM_FRZDIS_TFDBGEN ((uint32_t)0x00000040U) /* Bit[6] Debug freeze bit used to skip haulting the timer F while in debug mode */ +#define SHRTIM_FRZDIS_TEDBGEN ((uint32_t)0x00000020U) /* Bit[5] Debug freeze bit used to skip haulting the timer E while in debug mode */ +#define SHRTIM_FRZDIS_TDDBGEN ((uint32_t)0x00000010U) /* Bit[4] Debug freeze bit used to skip haulting the timer D while in debug mode */ +#define SHRTIM_FRZDIS_TCDBGEN ((uint32_t)0x00000008U) /* Bit[3] Debug freeze bit used to skip haulting the timer C while in debug mode */ +#define SHRTIM_FRZDIS_TBDBGEN ((uint32_t)0x00000004U) /* Bit[2] Debug freeze bit used to skip haulting the timer B while in debug mode */ +#define SHRTIM_FRZDIS_TADBGEN ((uint32_t)0x00000002U) /* Bit[1] Debug freeze bit used to skip haulting the timer A while in debug mode */ +#define SHRTIM_FRZDIS_MDBGEN ((uint32_t)0x00000001U) /* Bit[0] Debug freeze bit used to skip haulting the master timer while in debug mode */ + +/** Bit definition for SHRTIM_TXCTRL register **/ +#define SHRTIM_TXCTRL_UPDGAT ((uint32_t)0xF0000000U) /* Bit[31:28] Register update events for timer x */ +#define SHRTIM_TXCTRL_UPDGAT_0 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_TXCTRL_UPDGAT_1 ((uint32_t)0x20000000U) /* Bit29 */ +#define SHRTIM_TXCTRL_UPDGAT_2 ((uint32_t)0x40000000U) /* Bit30 */ +#define SHRTIM_TXCTRL_UPDGAT_3 ((uint32_t)0x80000000U) /* Bit31 */ +#define SHRTIM_TXCTRL_PLEN ((uint32_t)0x08000000U) /* Bit[27] timer x preload enable */ +#define SHRTIM_TXCTRL_DACTRIG ((uint32_t)0x06000000U) /* Bit[26:25] The update event can be used to generate a DAC synchronization. The active output is chosen based on this register configuration. */ +#define SHRTIM_TXCTRL_DACTRIG_0 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_TXCTRL_DACTRIG_1 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_TXCTRL_MUEN ((uint32_t)0x01000000U) /* Bit[24] Master timer update */ +#define SHRTIM_TXCTRL_TEUEN ((uint32_t)0x00800000U) /* Bit[23] Timer E update */ +#define SHRTIM_TXCTRL_TDUEN ((uint32_t)0x00400000U) /* Bit[22] Timer D update */ +#define SHRTIM_TXCTRL_TCUEN ((uint32_t)0x00200000U) /* Bit[21] Timer C update */ +#define SHRTIM_TXCTRL_TBUEN ((uint32_t)0x00100000U) /* Bit[20] Timer B update */ +#define SHRTIM_TXCTRL_TAUEN ((uint32_t)0x00080000U) /* Bit[19] Timer A update */ +#define SHRTIM_TXCTRL_RSTROUEN ((uint32_t)0x00040000U) /* Bit[18] Timer A reset update */ +#define SHRTIM_TXCTRL_REPTUEN ((uint32_t)0x00020000U) /* Bit[17] Timer A repetitiion update */ +#define SHRTIM_TXCTRL_TFUEN ((uint32_t)0x00010000U) /* Bit[16] Timer F update */ +#define SHRTIM_TXCTRL_DELCMP4M ((uint32_t)0x0000C000U) /* Bit[15:14] CMP4 delayed mode */ +#define SHRTIM_TXCTRL_DELCMP4M_0 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXCTRL_DELCMP4M_1 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_TXCTRL_DELCMP2M ((uint32_t)0x00003000U) /* Bit[13:12] CMP2 delayed mode */ +#define SHRTIM_TXCTRL_DELCMP2M_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXCTRL_DELCMP2M_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXCTRL_SYNCSTRT ((uint32_t)0x00000800U) /* Bit[11] Synchronizationto allow timer x start */ +#define SHRTIM_TXCTRL_SYNCRST ((uint32_t)0x00000400U) /* Bit[10] Synchronizationto allow timer x reset */ +#define SHRTIM_TXCTRL_RSYNCUPD ((uint32_t)0x00000200U) /* Bit[9] Update on resynchronization */ +#define SHRTIM_TXCTRL_ILV ((uint32_t)0x00000180U) /* Bit[8:7] Timer A interleaved mode */ +#define SHRTIM_TXCTRL_ILV_0 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXCTRL_ILV_1 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXCTRL_PP ((uint32_t)0x00000040U) /* Bit[6] Push pull mode enable */ +#define SHRTIM_TXCTRL_HLF ((uint32_t)0x00000020U) /* Bit[5] Half mode. */ +#define SHRTIM_TXCTRL_RTG ((uint32_t)0x00000010U) /* Bit[4] Retrigger mode */ +#define SHRTIM_TXCTRL_CONT ((uint32_t)0x00000008U) /* Bit[3] Continuous mode */ +#define SHRTIM_TXCTRL_CKPSC ((uint32_t)0x00000007U) /* Bit[2:0] Clock prescaler */ +#define SHRTIM_TXCTRL_CKPSC_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXCTRL_CKPSC_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXCTRL_CKPSC_2 ((uint32_t)0x00000004U) /* Bit2 */ + +/** Bit definition for SHRTIM_TXINTSTS register **/ +#define SHRTIM_TXINTSTS_O2BCKUP ((uint32_t)0x00200000U) /* Bit[21] Timer x channel 2 output backup. */ +#define SHRTIM_TXINTSTS_O1BCKUP ((uint32_t)0x00100000U) /* Bit[20] Timer x channel 2 output backup. */ +#define SHRTIM_TXINTSTS_O2DIPSTS ((uint32_t)0x00080000U) /* Bit[19] Timer x channnel 2 delayed idle protection status. */ +#define SHRTIM_TXINTSTS_O1DIPSTS ((uint32_t)0x00040000U) /* Bit[18] Timer x channnel 1 delayed idle protection status. */ +#define SHRTIM_TXINTSTS_IPPSTS ((uint32_t)0x00020000U) /* Bit[17] Idle push pull status. */ +#define SHRTIM_TXINTSTS_CPPSTS ((uint32_t)0x00010000U) /* Bit[16] Push pull status */ +#define SHRTIM_TXINTSTS_DPITF ((uint32_t)0x00004000U) /* Bit[14] Delayed protection interrupt flag */ +#define SHRTIM_TXINTSTS_RSTROITF ((uint32_t)0x00002000U) /* Bit[13] Counter reset or roll-over status */ +#define SHRTIM_TXINTSTS_RST2ITF ((uint32_t)0x00001000U) /* Bit[12] Output 2 reset interrupt flag */ +#define SHRTIM_TXINTSTS_SET2ITF ((uint32_t)0x00000800U) /* Bit[11] Output 2 set interrupt flag */ +#define SHRTIM_TXINTSTS_RST1ITF ((uint32_t)0x00000400U) /* Bit[10] Output 1 reset interrupt flag */ +#define SHRTIM_TXINTSTS_SET1ITF ((uint32_t)0x00000200U) /* Bit[9] Output 1 set interrupt flag */ +#define SHRTIM_TXINTSTS_CPT2ITF ((uint32_t)0x00000100U) /* Bit[8] Capture 2 interrupt flag */ +#define SHRTIM_TXINTSTS_CPT1ITF ((uint32_t)0x00000080U) /* Bit[7] Capture 1 interrupt flag */ +#define SHRTIM_TXINTSTS_UPDITF ((uint32_t)0x00000040U) /* Bit[6] Update interrupt flag */ +#define SHRTIM_TXINTSTS_REPTITF ((uint32_t)0x00000020U) /* Bit[5] Repetition interrupt flag */ +#define SHRTIM_TXINTSTS_CMP5ITF ((uint32_t)0x00000010U) /* Bit[4] Compare 5 flag */ +#define SHRTIM_TXINTSTS_CMP4ITF ((uint32_t)0x00000008U) /* Bit[3] Compare 4 interrupt flag */ +#define SHRTIM_TXINTSTS_CMP3ITF ((uint32_t)0x00000004U) /* Bit[2] Compare 3 interrupt flag */ +#define SHRTIM_TXINTSTS_CMP2ITF ((uint32_t)0x00000002U) /* Bit[1] Compare 2 interrupt flag */ +#define SHRTIM_TXINTSTS_CMP1ITF ((uint32_t)0x00000001U) /* Bit[0] Compare 1 interrupt flag */ + +/** Bit definition for SHRTIM_TXINTCLR register **/ +#define SHRTIM_TXINTCLR_DPIC ((uint32_t)0x00004000U) /* Bit[14] Delayed protection interrupt flag clear */ +#define SHRTIM_TXINTCLR_RSTROIC ((uint32_t)0x00002000U) /* Bit[13] Reset and/or roll-over interrupt flag clear */ +#define SHRTIM_TXINTCLR_RST2IC ((uint32_t)0x00001000U) /* Bit[12] Output channel 2 reset interrupt flag clear */ +#define SHRTIM_TXINTCLR_SET2IC ((uint32_t)0x00000800U) /* Bit[11] Output channel 2 set interrupt flag clear */ +#define SHRTIM_TXINTCLR_RST1IC ((uint32_t)0x00000400U) /* Bit[10] Output channel 2 reset interrupt flag clear */ +#define SHRTIM_TXINTCLR_SET1IC ((uint32_t)0x00000200U) /* Bit[9] Output channel 2 set interrupt flag clear */ +#define SHRTIM_TXINTCLR_CPT2IC ((uint32_t)0x00000100U) /* Bit[8] Capture 2 interrupt flag clear */ +#define SHRTIM_TXINTCLR_CPT1IC ((uint32_t)0x00000080U) /* Bit[7] Capture 1 interrupt flag clear */ +#define SHRTIM_TXINTCLR_UPDIC ((uint32_t)0x00000040U) /* Bit[6] Update interrupt flag clear */ +#define SHRTIM_TXINTCLR_REPTIC ((uint32_t)0x00000020U) /* Bit[5] Repetition interrupt flag clear */ +#define SHRTIM_TXINTCLR_CMP5IC ((uint32_t)0x00000010U) /* Bit[4] Compare 5 flag clear */ +#define SHRTIM_TXINTCLR_CMP4IC ((uint32_t)0x00000008U) /* Bit[3] Compare 4 interrupt flag clear */ +#define SHRTIM_TXINTCLR_CMP3IC ((uint32_t)0x00000004U) /* Bit[2] Compare 3 interrupt flag clear */ +#define SHRTIM_TXINTCLR_CMP2IC ((uint32_t)0x00000002U) /* Bit[1] Compare 2 interrupt flag clear */ +#define SHRTIM_TXINTCLR_CMP1IC ((uint32_t)0x00000001U) /* Bit[0] Compare 1 interrupt flag clear */ + +/** Bit definition for SHRTIM_TXIDEN register **/ +#define SHRTIM_TXIDEN_DPDEN ((uint32_t)0x40000000U) /* Bit[30] Reserved, must be kept at reset value */ +#define SHRTIM_TXIDEN_RSTRODEN ((uint32_t)0x20000000U) /* Bit[29] Reset/roll-over DMA request enable */ +#define SHRTIM_TXIDEN_RST2DEN ((uint32_t)0x10000000U) /* Bit[28] Output 2 reset DMA request enable */ +#define SHRTIM_TXIDEN_SET2DEN ((uint32_t)0x08000000U) /* Bit[27] Output 2 set DMA request enable */ +#define SHRTIM_TXIDEN_RST1DEN ((uint32_t)0x04000000U) /* Bit[26] Output 1 reset DMA request enable */ +#define SHRTIM_TXIDEN_SET1DEN ((uint32_t)0x02000000U) /* Bit[25] Output 1 set DMA request enable */ +#define SHRTIM_TXIDEN_CPT2DEN ((uint32_t)0x01000000U) /* Bit[24] Capture 2 DMA request enable */ +#define SHRTIM_TXIDEN_CPT1DEN ((uint32_t)0x00800000U) /* Bit[23] Capture 1 DMA request enable */ +#define SHRTIM_TXIDEN_UPDDEN ((uint32_t)0x00400000U) /* Bit[22] Update DMA request enable */ +#define SHRTIM_TXIDEN_REPTDEN ((uint32_t)0x00100000U) /* Bit[20] Repetition DMA request enable */ +#define SHRTIM_TXIDEN_CMP4DEN ((uint32_t)0x00080000U) /* Bit[19] Compare 4 DMA request enable */ +#define SHRTIM_TXIDEN_CMP3DEN ((uint32_t)0x00040000U) /* Bit[18] Compare 3 DMA request enable */ +#define SHRTIM_TXIDEN_CMP2DEN ((uint32_t)0x00020000U) /* Bit[17] Compare 2 DMA request enable */ +#define SHRTIM_TXIDEN_CMP1DEN ((uint32_t)0x00010000U) /* Bit[16] Compare 1 DMA request enable */ +#define SHRTIM_TXIDEN_DPIEN ((uint32_t)0x00004000U) /* Bit[14] Delayed protection interrupt enable */ +#define SHRTIM_TXIDEN_RSTROIEN ((uint32_t)0x00002000U) /* Bit[13] Reset/roll-over interrupt enable */ +#define SHRTIM_TXIDEN_RST2IEN ((uint32_t)0x00001000U) /* Bit[12] Output 2 reset interrupt enable */ +#define SHRTIM_TXIDEN_SET2IEN ((uint32_t)0x00000800U) /* Bit[11] Output 2 set interrupt enable */ +#define SHRTIM_TXIDEN_RST1IEN ((uint32_t)0x00000400U) /* Bit[10] Output 1 reset interrupt enable */ +#define SHRTIM_TXIDEN_SET1IEN ((uint32_t)0x00000200U) /* Bit[9] Output 1 set interrupt enable */ +#define SHRTIM_TXIDEN_CPT2IEN ((uint32_t)0x00000100U) /* Bit[8] Capture interrupt enable */ +#define SHRTIM_TXIDEN_CPT1IEN ((uint32_t)0x00000080U) /* Bit[7] Capture interrupt enable */ +#define SHRTIM_TXIDEN_UPDIEN ((uint32_t)0x00000040U) /* Bit[6] Update interrupt enable */ +#define SHRTIM_TXIDEN_REPTIEN ((uint32_t)0x00000020U) /* Bit[5] Repetition interrupt enable */ +#define SHRTIM_TXIDEN_CMP4IEN ((uint32_t)0x00000008U) /* Bit[3] Compare 4 interrupt enable */ +#define SHRTIM_TXIDEN_CMP3IEN ((uint32_t)0x00000004U) /* Bit[2] Compare 3 interrupt enable */ +#define SHRTIM_TXIDEN_CMP2IEN ((uint32_t)0x00000002U) /* Bit[1] Compare 2 interrupt enable */ +#define SHRTIM_TXIDEN_CMP1IEN ((uint32_t)0x00000001U) /* Bit[0] Compare 1 interrupt enable */ + +/** Bit definition for SHRTIM_TXCNT register **/ +#define SHRTIM_TXCNT_COUNT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Timer x counter value */ +#define SHRTIM_TXCNT_COUNT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXCNT_COUNT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXCNT_COUNT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXCNT_COUNT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXCNT_COUNT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXCNT_COUNT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXCNT_COUNT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXCNT_COUNT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXCNT_COUNT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXCNT_COUNT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXCNT_COUNT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXCNT_COUNT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXCNT_COUNT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXCNT_COUNT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXCNT_COUNT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXCNT_COUNT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_TXPRD register **/ +#define SHRTIM_TXPRD_PRD ((uint32_t)0x0000FFFFU) /* Bit[15:0] Timer x period value */ +#define SHRTIM_TXPRD_PRD_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXPRD_PRD_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXPRD_PRD_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXPRD_PRD_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXPRD_PRD_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXPRD_PRD_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXPRD_PRD_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXPRD_PRD_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXPRD_PRD_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXPRD_PRD_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXPRD_PRD_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXPRD_PRD_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXPRD_PRD_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXPRD_PRD_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXPRD_PRD_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXPRD_PRD_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_TXREPT register **/ +#define SHRTIM_TXREPT_REPT ((uint32_t)0x000000FFU) /* Bit[7:0] Timer x repetition period value */ +#define SHRTIM_TXREPT_REPT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXREPT_REPT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXREPT_REPT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXREPT_REPT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXREPT_REPT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXREPT_REPT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXREPT_REPT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXREPT_REPT_7 ((uint32_t)0x00000080U) /* Bit7 */ + +/** Bit definition for SHRTIM_TXCMP1DAT register **/ +#define SHRTIM_TXCMP1DAT_CMP1DAT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Timer x compare 1 value */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXCMP1DAT_CMP1DAT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_TXRCMP1DAT register **/ +#define SHRTIM_TXRCMP1DAT_REPT ((uint32_t)0x00FF0000U) /* Bit[23:16] Timer x repetititon counter alias */ +#define SHRTIM_TXRCMP1DAT_REPT_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_TXRCMP1DAT_REPT_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_TXRCMP1DAT_REPT_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_TXRCMP1DAT_REPT_3 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_TXRCMP1DAT_REPT_4 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_TXRCMP1DAT_REPT_5 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_TXRCMP1DAT_REPT_6 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_TXRCMP1DAT_REPT_7 ((uint32_t)0x00800000U) /* Bit23 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Timer x compare 1 data */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXRCMP1DAT_CMP1DAT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_TxCMP2DAT register **/ +#define SHRTIM_TXCMP2DAT_CMP2DAT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Timer x compare 2 data */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXCMP2DAT_CMP2DAT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_TXCMP3DAT register **/ +#define SHRTIM_TXCMP3DAT_CMP3DAT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Timer x compare 3 data */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXCMP3DAT_CMP3DAT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_TXCMP4DAT register **/ +#define SHRTIM_TXCMP4DAT_CMP4DAT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Timer x compare 4 data */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXCMP4DAT_CMP4DAT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_TXCPT1 register **/ +#define SHRTIM_TXCPT1_UDSTS1 ((uint32_t)0x00010000U) /* Bit[16] Status for timer x counting direction while capture 1 happened */ +#define SHRTIM_TXCPT1_CPT1 ((uint32_t)0x0000FFFFU) /* Bit[15:0] Timer x capture 1 data */ +#define SHRTIM_TXCPT1_CPT1_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXCPT1_CPT1_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXCPT1_CPT1_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXCPT1_CPT1_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXCPT1_CPT1_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXCPT1_CPT1_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXCPT1_CPT1_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXCPT1_CPT1_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXCPT1_CPT1_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXCPT1_CPT1_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXCPT1_CPT1_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXCPT1_CPT1_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXCPT1_CPT1_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXCPT1_CPT1_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXCPT1_CPT1_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXCPT1_CPT1_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_TXCPT2 register **/ +#define SHRTIM_TXCPT2_UDSTS2 ((uint32_t)0x00010000U) /* Bit[16] Status for timer x counting direction while capture 2 happened */ +#define SHRTIM_TXCPT2_CPT2 ((uint32_t)0x0000FFFFU) /* Bit[15:0] Timer x capture 2 data */ +#define SHRTIM_TXCPT2_CPT2_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXCPT2_CPT2_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXCPT2_CPT2_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXCPT2_CPT2_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXCPT2_CPT2_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXCPT2_CPT2_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXCPT2_CPT2_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXCPT2_CPT2_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXCPT2_CPT2_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXCPT2_CPT2_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXCPT2_CPT2_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXCPT2_CPT2_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXCPT2_CPT2_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXCPT2_CPT2_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXCPT2_CPT2_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXCPT2_CPT2_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_TXDT register **/ +#define SHRTIM_TXDT_DTFLCK ((uint32_t)0x80000000U) /* Bit[31] Deadtime falling lock */ +#define SHRTIM_TXDT_DTFSLCK ((uint32_t)0x40000000U) /* Bit[30] Deadtime falling sign lock */ +#define SHRTIM_TXDT_SDTF ((uint32_t)0x02000000U) /* Bit[25] Sign deadtime falling value */ +#define SHRTIM_TXDT_DTF ((uint32_t)0x01FF0000U) /* Bit[24:16] Deadtime falling value */ +#define SHRTIM_TXDT_DTF_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_TXDT_DTF_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_TXDT_DTF_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_TXDT_DTF_3 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_TXDT_DTF_4 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_TXDT_DTF_5 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_TXDT_DTF_6 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_TXDT_DTF_7 ((uint32_t)0x00800000U) /* Bit23 */ +#define SHRTIM_TXDT_DTF_8 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_TXDT_DTRLCK ((uint32_t)0x00008000U) /* Bit[15] Deadtime rising lock */ +#define SHRTIM_TXDT_DTRSLCK ((uint32_t)0x00004000U) /* Bit[14] Deadtime rising sign lock */ +#define SHRTIM_TXDT_DTPSC ((uint32_t)0x00001C00U) /* Bit[12:10] Deadtime prescaler */ +#define SHRTIM_TXDT_DTPSC_0 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXDT_DTPSC_1 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXDT_DTPSC_2 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXDT_SDTR ((uint32_t)0x00000200U) /* Bit[9] Sign deadtime rising value */ +#define SHRTIM_TXDT_DTR ((uint32_t)0x000001FFU) /* Bit[8:0] Deadtime rising value */ +#define SHRTIM_TXDT_DTR_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXDT_DTR_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXDT_DTR_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXDT_DTR_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXDT_DTR_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXDT_DTR_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXDT_DTR_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXDT_DTR_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXDT_DTR_8 ((uint32_t)0x00000100U) /* Bit8 */ + +/** Bit definition for SHRTIM_TXSET1 register **/ +#define SHRTIM_TXSET1_UPD ((uint32_t)0x80000000U) /* Bit[31] Registers update (transfer preload to active) */ +#define SHRTIM_TXSET1_EXEV10 ((uint32_t)0x40000000U) /* Bit[30] External event 10 */ +#define SHRTIM_TXSET1_EXEV9 ((uint32_t)0x20000000U) /* Bit[29] External event 9 */ +#define SHRTIM_TXSET1_EXEV8 ((uint32_t)0x10000000U) /* Bit[28] External event 8 */ +#define SHRTIM_TXSET1_EXEV7 ((uint32_t)0x08000000U) /* Bit[27] External event 7 */ +#define SHRTIM_TXSET1_EXEV6 ((uint32_t)0x04000000U) /* Bit[26] External event 6 */ +#define SHRTIM_TXSET1_EXEV5 ((uint32_t)0x02000000U) /* Bit[25] External event 5 */ +#define SHRTIM_TXSET1_EXEV4 ((uint32_t)0x01000000U) /* Bit[24] External event 4 */ +#define SHRTIM_TXSET1_EXEV3 ((uint32_t)0x00800000U) /* Bit[23] External event 3 */ +#define SHRTIM_TXSET1_EXEV2 ((uint32_t)0x00400000U) /* Bit[22] External event 2 */ +#define SHRTIM_TXSET1_EXEV1 ((uint32_t)0x00200000U) /* Bit[21] External event 1 */ +#define SHRTIM_TXSET1_TIMEV9 ((uint32_t)0x00100000U) /* Bit[20] Timer event 9 */ +#define SHRTIM_TXSET1_TIMEV8 ((uint32_t)0x00080000U) /* Bit[19] Timer event 8 */ +#define SHRTIM_TXSET1_TIMEV7 ((uint32_t)0x00040000U) /* Bit[18] Timer event 7 */ +#define SHRTIM_TXSET1_TIMEV6 ((uint32_t)0x00020000U) /* Bit[17] Timer event 6 */ +#define SHRTIM_TXSET1_TIMEV5 ((uint32_t)0x00010000U) /* Bit[16] Timer event 5 */ +#define SHRTIM_TXSET1_TIMEV4 ((uint32_t)0x00008000U) /* Bit[15] Timer event 4 */ +#define SHRTIM_TXSET1_TIMEV3 ((uint32_t)0x00004000U) /* Bit[14] Timer event 3 */ +#define SHRTIM_TXSET1_TIMEV2 ((uint32_t)0x00002000U) /* Bit[13] Timer event 2 */ +#define SHRTIM_TXSET1_TIMEV1 ((uint32_t)0x00001000U) /* Bit[12] Timer event 1 */ +#define SHRTIM_TXSET1_MCMP4 ((uint32_t)0x00000800U) /* Bit[11] Master compare 4 */ +#define SHRTIM_TXSET1_MCMP3 ((uint32_t)0x00000400U) /* Bit[10] Master compare 3 */ +#define SHRTIM_TXSET1_MCMP2 ((uint32_t)0x00000200U) /* Bit[9] Master compare 2 */ +#define SHRTIM_TXSET1_MCMP1 ((uint32_t)0x00000100U) /* Bit[8] Master compare 1 */ +#define SHRTIM_TXSET1_MPRD ((uint32_t)0x00000080U) /* Bit[7] Master period */ +#define SHRTIM_TXSET1_CMP4 ((uint32_t)0x00000040U) /* Bit[6] Timer x compare 4 */ +#define SHRTIM_TXSET1_CMP3 ((uint32_t)0x00000020U) /* Bit[5] Timer x compare 3 */ +#define SHRTIM_TXSET1_CMP2 ((uint32_t)0x00000010U) /* Bit[4] Timer x compare 2 */ +#define SHRTIM_TXSET1_CMP1 ((uint32_t)0x00000008U) /* Bit[3] Timer x compare 1 */ +#define SHRTIM_TXSET1_PRD ((uint32_t)0x00000004U) /* Bit[2] Timer x period */ +#define SHRTIM_TXSET1_RSYNC ((uint32_t)0x00000002U) /* Bit[1] Timer x resynchronization */ +#define SHRTIM_TXSET1_SWT ((uint32_t)0x00000001U) /* Bit[0] Software set trigger */ + +/** Bit definition for SHRTIM_TXRST1 register **/ +#define SHRTIM_TXRST1_UPD ((uint32_t)0x80000000U) /* Bit[31] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_EXEV10 ((uint32_t)0x40000000U) /* Bit[30] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_EXEV9 ((uint32_t)0x20000000U) /* Bit[29] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_EXEV8 ((uint32_t)0x10000000U) /* Bit[28] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_EXEV7 ((uint32_t)0x08000000U) /* Bit[27] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_EXEV6 ((uint32_t)0x04000000U) /* Bit[26] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_EXEV5 ((uint32_t)0x02000000U) /* Bit[25] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_EXEV4 ((uint32_t)0x01000000U) /* Bit[24] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_EXEV3 ((uint32_t)0x00800000U) /* Bit[23] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_EXEV2 ((uint32_t)0x00400000U) /* Bit[22] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_EXEV1 ((uint32_t)0x00200000U) /* Bit[21] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_TIMEV9 ((uint32_t)0x00100000U) /* Bit[20] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_TIMEV8 ((uint32_t)0x00080000U) /* Bit[19] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_TIMEV7 ((uint32_t)0x00040000U) /* Bit[18] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_TIMEV6 ((uint32_t)0x00020000U) /* Bit[17] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_TIMEV5 ((uint32_t)0x00010000U) /* Bit[16] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_TIMEV4 ((uint32_t)0x00008000U) /* Bit[15] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_TIMEV3 ((uint32_t)0x00004000U) /* Bit[14] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_TIMEV2 ((uint32_t)0x00002000U) /* Bit[13] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_TIMEV1 ((uint32_t)0x00001000U) /* Bit[12] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_MCMP4 ((uint32_t)0x00000800U) /* Bit[11] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_MCMP3 ((uint32_t)0x00000400U) /* Bit[10] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_MCMP2 ((uint32_t)0x00000200U) /* Bit[9] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_MCMP1 ((uint32_t)0x00000100U) /* Bit[8] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_MPRD ((uint32_t)0x00000080U) /* Bit[7] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_CMP4 ((uint32_t)0x00000040U) /* Bit[6] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_CMP3 ((uint32_t)0x00000020U) /* Bit[5] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_CMP2 ((uint32_t)0x00000010U) /* Bit[4] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_CMP1 ((uint32_t)0x00000008U) /* Bit[3] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_PRD ((uint32_t)0x00000004U) /* Bit[2] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_RSYNC ((uint32_t)0x00000002U) /* Bit[1] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXRST1_SWT ((uint32_t)0x00000001U) /* Bit[0] Refer to SHRTIM_TASET1 bits description. */ + +/** Bit definition for SHRTIM_TXSET2 register **/ +#define SHRTIM_TXSET2_UPD ((uint32_t)0x80000000U) /* Bit[31] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXSET2_EXEV10 ((uint32_t)0x40000000U) /* Bit[30] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXSET2_EXEV9 ((uint32_t)0x20000000U) /* Bit[29] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXSET2_EXEV8 ((uint32_t)0x10000000U) /* Bit[28] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXSET2_EXEV7 ((uint32_t)0x08000000U) /* Bit[27] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXSET2_EXEV6 ((uint32_t)0x04000000U) /* Bit[26] Refer to SHRTIM_TASET1 bits description. */ +#define SHRTIM_TXSET2_EXEV5 ((uint32_t)0x02000000U) /* Bit[25] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_EXEV4 ((uint32_t)0x01000000U) /* Bit[24] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_EXEV3 ((uint32_t)0x00800000U) /* Bit[23] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_EXEV2 ((uint32_t)0x00400000U) /* Bit[22] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_EXEV1 ((uint32_t)0x00200000U) /* Bit[21] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_TIMEV9 ((uint32_t)0x00100000U) /* Bit[20] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_TIMEV8 ((uint32_t)0x00080000U) /* Bit[19] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_TIMEV7 ((uint32_t)0x00040000U) /* Bit[18] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_TIMEV6 ((uint32_t)0x00020000U) /* Bit[17] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_TIMEV5 ((uint32_t)0x00010000U) /* Bit[16] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_TIMEV4 ((uint32_t)0x00008000U) /* Bit[15] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_TIMEV3 ((uint32_t)0x00004000U) /* Bit[14] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_TIMEV2 ((uint32_t)0x00002000U) /* Bit[13] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_TIMEV1 ((uint32_t)0x00001000U) /* Bit[12] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_MCMP4 ((uint32_t)0x00000800U) /* Bit[11] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_MCMP3 ((uint32_t)0x00000400U) /* Bit[10] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_MCMP2 ((uint32_t)0x00000200U) /* Bit[9] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_MCMP1 ((uint32_t)0x00000100U) /* Bit[8] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_MPRD ((uint32_t)0x00000080U) /* Bit[7] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_CMP4 ((uint32_t)0x00000040U) /* Bit[6] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_CMP3 ((uint32_t)0x00000020U) /* Bit[5] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_CMP2 ((uint32_t)0x00000010U) /* Bit[4] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_CMP1 ((uint32_t)0x00000008U) /* Bit[3] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_PRD ((uint32_t)0x00000004U) /* Bit[2] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_RSYNC ((uint32_t)0x00000002U) /* Bit[1] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXSET2_SWT ((uint32_t)0x00000001U) /* Bit[0] Refer to SHRTIM_TASET bits description. */ + +/** Bit definition for SHRTIM_TXRST2 register **/ +#define SHRTIM_TXRST2_UPD ((uint32_t)0x80000000U) /* Bit[31] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_EXEV10 ((uint32_t)0x40000000U) /* Bit[30] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_EXEV9 ((uint32_t)0x20000000U) /* Bit[29] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_EXEV8 ((uint32_t)0x10000000U) /* Bit[28] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_EXEV7 ((uint32_t)0x08000000U) /* Bit[27] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_EXEV6 ((uint32_t)0x04000000U) /* Bit[26] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_EXEV5 ((uint32_t)0x02000000U) /* Bit[25] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_EXEV4 ((uint32_t)0x01000000U) /* Bit[24] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_EXEV3 ((uint32_t)0x00800000U) /* Bit[23] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_EXEV2 ((uint32_t)0x00400000U) /* Bit[22] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_EXEV1 ((uint32_t)0x00200000U) /* Bit[21] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_TIMEV9 ((uint32_t)0x00100000U) /* Bit[20] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_TIMEV8 ((uint32_t)0x00080000U) /* Bit[19] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_TIMEV7 ((uint32_t)0x00040000U) /* Bit[18] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_TIMEV6 ((uint32_t)0x00020000U) /* Bit[17] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_TIMEV5 ((uint32_t)0x00010000U) /* Bit[16] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_TIMEV4 ((uint32_t)0x00008000U) /* Bit[15] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_TIMEV3 ((uint32_t)0x00004000U) /* Bit[14] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_TIMEV2 ((uint32_t)0x00002000U) /* Bit[13] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_TIMEV1 ((uint32_t)0x00001000U) /* Bit[12] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_MCMP4 ((uint32_t)0x00000800U) /* Bit[11] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_MCMP3 ((uint32_t)0x00000400U) /* Bit[10] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_MCMP2 ((uint32_t)0x00000200U) /* Bit[9] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_MCMP1 ((uint32_t)0x00000100U) /* Bit[8] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_MPRD ((uint32_t)0x00000080U) /* Bit[7] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_CMP4 ((uint32_t)0x00000040U) /* Bit[6] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_CMP3 ((uint32_t)0x00000020U) /* Bit[5] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_CMP2 ((uint32_t)0x00000010U) /* Bit[4] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_CMP1 ((uint32_t)0x00000008U) /* Bit[3] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_PRD ((uint32_t)0x00000004U) /* Bit[2] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_RSYNC ((uint32_t)0x00000002U) /* Bit[1] Refer to SHRTIM_TASET bits description. */ +#define SHRTIM_TXRST2_SWT ((uint32_t)0x00000001U) /* Bit[0] Refer to SHRTIM_TASET bits description. */ + +/** Bit definition for SHRTIM_TXEXEVFLT1 register **/ +#define SHRTIM_TXEXEVFLT1_EXEVWINSEL ((uint32_t)0x80000000U) /* Bit 31 External event window selection */ +#define SHRTIM_TXEXEVFLT1_EXEV5FLT ((uint32_t)0x1E000000U) /* Bit[28:25] External event 5 filter */ +#define SHRTIM_TXEXEVFLT1_EXEV5FLT_0 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_TXEXEVFLT1_EXEV5FLT_1 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_TXEXEVFLT1_EXEV5FLT_2 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_TXEXEVFLT1_EXEV5FLT_3 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_TXEXEVFLT1_EXEV5LATCH ((uint32_t)0x01000000U) /* Bit[24] External event 5 latch */ +#define SHRTIM_TXEXEVFLT1_EXEV4FLT ((uint32_t)0x00780000U) /* Bit[22:19] External event 4 filter */ +#define SHRTIM_TXEXEVFLT1_EXEV4FLT_0 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_TXEXEVFLT1_EXEV4FLT_1 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_TXEXEVFLT1_EXEV4FLT_2 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_TXEXEVFLT1_EXEV4FLT_3 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_TXEXEVFLT1_EXEV4LATCH ((uint32_t)0x00040000U) /* Bit[18] External event 4 latch */ +#define SHRTIM_TXEXEVFLT1_EXEV3FLT ((uint32_t)0x0001E000U) /* Bit[16:13] External event 3 filter */ +#define SHRTIM_TXEXEVFLT1_EXEV3FLT_0 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXEXEVFLT1_EXEV3FLT_1 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXEXEVFLT1_EXEV3FLT_2 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_TXEXEVFLT1_EXEV3FLT_3 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_TXEXEVFLT1_EXEV3LATCH ((uint32_t)0x00001000U) /* Bit[12] External event 3 latch */ +#define SHRTIM_TXEXEVFLT1_EXEV2FLT ((uint32_t)0x00000780U) /* Bit[10:7] External event 2 filter */ +#define SHRTIM_TXEXEVFLT1_EXEV2FLT_0 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXEXEVFLT1_EXEV2FLT_1 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXEXEVFLT1_EXEV2FLT_2 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXEXEVFLT1_EXEV2FLT_3 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXEXEVFLT1_EXEV2LATCH ((uint32_t)0x00000040U) /* Bit[6] External event 2 latch */ +#define SHRTIM_TXEXEVFLT1_EXEV1FLT ((uint32_t)0x0000001EU) /* Bit[4:1] External event 1 filter */ +#define SHRTIM_TXEXEVFLT1_EXEV1FLT_0 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXEXEVFLT1_EXEV1FLT_1 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXEXEVFLT1_EXEV1FLT_2 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXEXEVFLT1_EXEV1FLT_3 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXEXEVFLT1_EXEV1LATCH ((uint32_t)0x00000001U) /* Bit[0] External event 1 LATCH */ + +/** Bit definition for SHRTIM_TXEXEVFLT2 register **/ +#define SHRTIM_TXEXEVFLT2_EXEV10FLT ((uint32_t)0x1E000000U) /* Bit[28:25] External event 10 filter */ +#define SHRTIM_TXEXEVFLT2_EXEV10FLT_0 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_TXEXEVFLT2_EXEV10FLT_1 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_TXEXEVFLT2_EXEV10FLT_2 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_TXEXEVFLT2_EXEV10FLT_3 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_TXEXEVFLT2_EXEV10LATCH ((uint32_t)0x01000000U) /* Bit[24] External event 10 latch */ +#define SHRTIM_TXEXEVFLT2_EXE9VFLT ((uint32_t)0x00780000U) /* Bit[22:19] External event 9 filter */ +#define SHRTIM_TXEXEVFLT2_EXE9VFLT_0 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_TXEXEVFLT2_EXE9VFLT_1 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_TXEXEVFLT2_EXE9VFLT_2 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_TXEXEVFLT2_EXE9VFLT_3 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_TXEXEVFLT2_EXEV9LATCH ((uint32_t)0x00040000U) /* Bit[18] External event 9 latch */ +#define SHRTIM_TXEXEVFLT2_EXE8VFLT ((uint32_t)0x0001E000U) /* Bit[16:13] External event 8 filter */ +#define SHRTIM_TXEXEVFLT2_EXE8VFLT_0 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXEXEVFLT2_EXE8VFLT_1 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXEXEVFLT2_EXE8VFLT_2 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_TXEXEVFLT2_EXE8VFLT_3 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_TXEXEVFLT2_EXEV8LATCH ((uint32_t)0x00001000U) /* Bit[12] External event 8 latch */ +#define SHRTIM_TXEXEVFLT2_EXE7VFLT ((uint32_t)0x00000780U) /* Bit[10:7] External event 7 filter */ +#define SHRTIM_TXEXEVFLT2_EXE7VFLT_0 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXEXEVFLT2_EXE7VFLT_1 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXEXEVFLT2_EXE7VFLT_2 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXEXEVFLT2_EXE7VFLT_3 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXEXEVFLT2_EXEV7LATCH ((uint32_t)0x00000040U) /* Bit[6] External event 7 latch */ +#define SHRTIM_TXEXEVFLT2_EXE6VFLT ((uint32_t)0x0000001EU) /* Bit[4:1] External event 6 filter */ +#define SHRTIM_TXEXEVFLT2_EXE6VFLT_0 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXEXEVFLT2_EXE6VFLT_1 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXEXEVFLT2_EXE6VFLT_2 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXEXEVFLT2_EXE6VFLT_3 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXEXEVFLT2_EXEV6LATCH ((uint32_t)0x00000001U) /* Bit[0] External event 6 latch */ + +/** Bit definition for SHRTIM_TACNTRST register **/ +#define SHRTIM_TACNTRST_TFCMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer F compare 2 */ +#define SHRTIM_TACNTRST_TECMP4 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 4 */ +#define SHRTIM_TACNTRST_TECMP2 ((uint32_t)0x20000000U) /* Bit[29] Timer E compare 2 */ +#define SHRTIM_TACNTRST_TECMP1 ((uint32_t)0x10000000U) /* Bit[28] Timer E compare 1 */ +#define SHRTIM_TACNTRST_TDCMP4 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 4 */ +#define SHRTIM_TACNTRST_TDCMP2 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 2 */ +#define SHRTIM_TACNTRST_TDCMP1 ((uint32_t)0x02000000U) /* Bit[25] Timer D compare 1 */ +#define SHRTIM_TACNTRST_TCCMP4 ((uint32_t)0x01000000U) /* Bit[24] Timer C compare 4 */ +#define SHRTIM_TACNTRST_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TACNTRST_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TACNTRST_TBCMP4 ((uint32_t)0x00200000U) /* Bit[21] Timer B compare 4 */ +#define SHRTIM_TACNTRST_TBCMP2 ((uint32_t)0x00100000U) /* Bit[20] Timer B compare 2 */ +#define SHRTIM_TACNTRST_TBCMP1 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 1 */ +#define SHRTIM_TACNTRST_EXEV10 ((uint32_t)0x00040000U) /* Bit[18] External event 10 */ +#define SHRTIM_TACNTRST_EXEV9 ((uint32_t)0x00020000U) /* Bit[17] External event 9 */ +#define SHRTIM_TACNTRST_EXEV8 ((uint32_t)0x00010000U) /* Bit[16] External event 8 */ +#define SHRTIM_TACNTRST_EXEV7 ((uint32_t)0x00008000U) /* Bit[15] External event 7 */ +#define SHRTIM_TACNTRST_EXEV6 ((uint32_t)0x00004000U) /* Bit[14] External event 6 */ +#define SHRTIM_TACNTRST_EXEV5 ((uint32_t)0x00002000U) /* Bit[13] External event 5 */ +#define SHRTIM_TACNTRST_EXEV4 ((uint32_t)0x00001000U) /* Bit[12] External event 4 */ +#define SHRTIM_TACNTRST_EXEV3 ((uint32_t)0x00000800U) /* Bit[11] External event 3 */ +#define SHRTIM_TACNTRST_EXEV2 ((uint32_t)0x00000400U) /* Bit[10] External event 2 */ +#define SHRTIM_TACNTRST_EXEV1 ((uint32_t)0x00000200U) /* Bit[9] External event 1 */ +#define SHRTIM_TACNTRST_MCMP4 ((uint32_t)0x00000100U) /* Bit[8] Master compare 4 */ +#define SHRTIM_TACNTRST_MCMP3 ((uint32_t)0x00000080U) /* Bit[7] Master compare 3 */ +#define SHRTIM_TACNTRST_MCMP2 ((uint32_t)0x00000040U) /* Bit[6] Master compare 2 */ +#define SHRTIM_TACNTRST_MCMP1 ((uint32_t)0x00000020U) /* Bit[5] Master compare 1 */ +#define SHRTIM_TACNTRST_MPRD ((uint32_t)0x00000010U) /* Bit[4] Master timer period */ +#define SHRTIM_TACNTRST_CMP4 ((uint32_t)0x00000008U) /* Bit[3] Timer A compare 4 reset */ +#define SHRTIM_TACNTRST_CMP2 ((uint32_t)0x00000004U) /* Bit[2] Timer A compare 2 reset */ +#define SHRTIM_TACNTRST_UPD ((uint32_t)0x00000002U) /* Bit[1] Timer A update reset */ +#define SHRTIM_TACNTRST_TFCMP1 ((uint32_t)0x00000001U) /* Bit[0] Timer F compare 1 */ + +/** Bit definition for SHRTIM_TBCNTRST register **/ +#define SHRTIM_TBCNTRST_TFCMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer F compare 2 */ +#define SHRTIM_TBCNTRST_TECMP4 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 4 */ +#define SHRTIM_TBCNTRST_TECMP2 ((uint32_t)0x20000000U) /* Bit[29] Timer E compare 2 */ +#define SHRTIM_TBCNTRST_TECMP1 ((uint32_t)0x10000000U) /* Bit[28] Timer E compare 1 */ +#define SHRTIM_TBCNTRST_TDCMP4 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 4 */ +#define SHRTIM_TBCNTRST_TDCMP2 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 2 */ +#define SHRTIM_TBCNTRST_TDCMP1 ((uint32_t)0x02000000U) /* Bit[25] Timer D compare 1 */ +#define SHRTIM_TBCNTRST_TCCMP4 ((uint32_t)0x01000000U) /* Bit[24] Timer C compare 4 */ +#define SHRTIM_TBCNTRST_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TBCNTRST_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TBCNTRST_TACMP4 ((uint32_t)0x00200000U) /* Bit[21] Timer B compare 4 */ +#define SHRTIM_TBCNTRST_TACMP2 ((uint32_t)0x00100000U) /* Bit[20] Timer B compare 2 */ +#define SHRTIM_TBCNTRST_TACMP1 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 1 */ +#define SHRTIM_TBCNTRST_EXEV10 ((uint32_t)0x00040000U) /* Bit[18] External event 10 */ +#define SHRTIM_TBCNTRST_EXEV9 ((uint32_t)0x00020000U) /* Bit[17] External event 9 */ +#define SHRTIM_TBCNTRST_EXEV8 ((uint32_t)0x00010000U) /* Bit[16] External event 8 */ +#define SHRTIM_TBCNTRST_EXEV7 ((uint32_t)0x00008000U) /* Bit[15] External event 7 */ +#define SHRTIM_TBCNTRST_EXEV6 ((uint32_t)0x00004000U) /* Bit[14] External event 6 */ +#define SHRTIM_TBCNTRST_EXEV5 ((uint32_t)0x00002000U) /* Bit[13] External event 5 */ +#define SHRTIM_TBCNTRST_EXEV4 ((uint32_t)0x00001000U) /* Bit[12] External event 4 */ +#define SHRTIM_TBCNTRST_EXEV3 ((uint32_t)0x00000800U) /* Bit[11] External event 3 */ +#define SHRTIM_TBCNTRST_EXEV2 ((uint32_t)0x00000400U) /* Bit[10] External event 2 */ +#define SHRTIM_TBCNTRST_EXEV1 ((uint32_t)0x00000200U) /* Bit[9] External event 1 */ +#define SHRTIM_TBCNTRST_MCMP4 ((uint32_t)0x00000100U) /* Bit[8] Master compare 4 */ +#define SHRTIM_TBCNTRST_MCMP3 ((uint32_t)0x00000080U) /* Bit[7] Master compare 3 */ +#define SHRTIM_TBCNTRST_MCMP2 ((uint32_t)0x00000040U) /* Bit[6] Master compare 2 */ +#define SHRTIM_TBCNTRST_MCMP1 ((uint32_t)0x00000020U) /* Bit[5] Master compare 1 */ +#define SHRTIM_TBCNTRST_MPRD ((uint32_t)0x00000010U) /* Bit[4] Master timer period */ +#define SHRTIM_TBCNTRST_CMP4 ((uint32_t)0x00000008U) /* Bit[3] Timer B compare 4 reset */ +#define SHRTIM_TBCNTRST_CMP2 ((uint32_t)0x00000004U) /* Bit[2] Timer B compare 2 reset */ +#define SHRTIM_TBCNTRST_UPD ((uint32_t)0x00000002U) /* Bit[1] Timer B update reset */ +#define SHRTIM_TBCNTRST_TFCMP1 ((uint32_t)0x00000001U) /* Bit[0] Timer F compare 1 */ + +/** Bit definition for SHRTIM_TCCNTRST register **/ +#define SHRTIM_TCCNTRST_TFCMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer F compare 2 */ +#define SHRTIM_TCCNTRST_TECMP4 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 4 */ +#define SHRTIM_TCCNTRST_TECMP2 ((uint32_t)0x20000000U) /* Bit[29] Timer E compare 2 */ +#define SHRTIM_TCCNTRST_TECMP1 ((uint32_t)0x10000000U) /* Bit[28] Timer E compare 1 */ +#define SHRTIM_TCCNTRST_TDCMP4 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 4 */ +#define SHRTIM_TCCNTRST_TDCMP2 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 2 */ +#define SHRTIM_TCCNTRST_TDCMP1 ((uint32_t)0x02000000U) /* Bit[25] Timer D compare 1 */ +#define SHRTIM_TCCNTRST_TBCMP4 ((uint32_t)0x01000000U) /* Bit[24] Timer C compare 4 */ +#define SHRTIM_TCCNTRST_TBCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TCCNTRST_TBCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TCCNTRST_TACMP4 ((uint32_t)0x00200000U) /* Bit[21] Timer B compare 4 */ +#define SHRTIM_TCCNTRST_TACMP2 ((uint32_t)0x00100000U) /* Bit[20] Timer B compare 2 */ +#define SHRTIM_TCCNTRST_TACMP1 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 1 */ +#define SHRTIM_TCCNTRST_EXEV10 ((uint32_t)0x00040000U) /* Bit[18] External event */ +#define SHRTIM_TCCNTRST_EXEV9 ((uint32_t)0x00020000U) /* Bit[17] External event */ +#define SHRTIM_TCCNTRST_EXEV8 ((uint32_t)0x00010000U) /* Bit[16] External event */ +#define SHRTIM_TCCNTRST_EXEV7 ((uint32_t)0x00008000U) /* Bit[15] External event */ +#define SHRTIM_TCCNTRST_EXEV6 ((uint32_t)0x00004000U) /* Bit[14] External event */ +#define SHRTIM_TCCNTRST_EXEV5 ((uint32_t)0x00002000U) /* Bit[13] External event */ +#define SHRTIM_TCCNTRST_EXEV4 ((uint32_t)0x00001000U) /* Bit[12] External event */ +#define SHRTIM_TCCNTRST_EXEV3 ((uint32_t)0x00000800U) /* Bit[11] External event */ +#define SHRTIM_TCCNTRST_EXEV2 ((uint32_t)0x00000400U) /* Bit[10] External event */ +#define SHRTIM_TCCNTRST_EXEV1 ((uint32_t)0x00000200U) /* Bit[9] External event */ +#define SHRTIM_TCCNTRST_MCMP4 ((uint32_t)0x00000100U) /* Bit[8] Master compare 4 */ +#define SHRTIM_TCCNTRST_MCMP3 ((uint32_t)0x00000080U) /* Bit[7] Master compare 3 */ +#define SHRTIM_TCCNTRST_MCMP2 ((uint32_t)0x00000040U) /* Bit[6] Master compare 2 */ +#define SHRTIM_TCCNTRST_MCMP1 ((uint32_t)0x00000020U) /* Bit[5] Master compare 1 */ +#define SHRTIM_TCCNTRST_MPRD ((uint32_t)0x00000010U) /* Bit[4] Master timer period */ +#define SHRTIM_TCCNTRST_CMP4 ((uint32_t)0x00000008U) /* Bit[3] Timer C compare 4 reset */ +#define SHRTIM_TCCNTRST_CMP2 ((uint32_t)0x00000004U) /* Bit[2] Timer C compare 2 reset */ +#define SHRTIM_TCCNTRST_UPD ((uint32_t)0x00000002U) /* Bit[1] Timer C update reset */ +#define SHRTIM_TCCNTRST_TFCMP1 ((uint32_t)0x00000001U) /* Bit[0] Timer F compare 1 */ + +/** Bit definition for SHRTIM_TDCNTRST register **/ +#define SHRTIM_TDCNTRST_TFCMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer F compare 2 */ +#define SHRTIM_TDCNTRST_TECMP4 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 4 */ +#define SHRTIM_TDCNTRST_TECMP2 ((uint32_t)0x20000000U) /* Bit[29] Timer E compare 2 */ +#define SHRTIM_TDCNTRST_TECMP1 ((uint32_t)0x10000000U) /* Bit[28] Timer E compare 1 */ +#define SHRTIM_TDCNTRST_TCCMP4 ((uint32_t)0x08000000U) /* Bit[27] Timer C compare 4 */ +#define SHRTIM_TDCNTRST_TCCMP2 ((uint32_t)0x04000000U) /* Bit[26] Timer C compare 2 */ +#define SHRTIM_TDCNTRST_TCCMP1 ((uint32_t)0x02000000U) /* Bit[25] Timer C compare 1 */ +#define SHRTIM_TDCNTRST_TBCMP4 ((uint32_t)0x01000000U) /* Bit[24] Timer D compare 4 */ +#define SHRTIM_TDCNTRST_TBCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer D compare 2 */ +#define SHRTIM_TDCNTRST_TBCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer D compare 1 */ +#define SHRTIM_TDCNTRST_TACMP4 ((uint32_t)0x00200000U) /* Bit[21] Timer B compare 4 */ +#define SHRTIM_TDCNTRST_TACMP2 ((uint32_t)0x00100000U) /* Bit[20] Timer B compare 2 */ +#define SHRTIM_TDCNTRST_TACMP1 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 1 */ +#define SHRTIM_TDCNTRST_EXEV10 ((uint32_t)0x00040000U) /* Bit[18] External event */ +#define SHRTIM_TDCNTRST_EXEV9 ((uint32_t)0x00020000U) /* Bit[17] External event */ +#define SHRTIM_TDCNTRST_EXEV8 ((uint32_t)0x00010000U) /* Bit[16] External event */ +#define SHRTIM_TDCNTRST_EXEV7 ((uint32_t)0x00008000U) /* Bit[15] External event */ +#define SHRTIM_TDCNTRST_EXEV6 ((uint32_t)0x00004000U) /* Bit[14] External event */ +#define SHRTIM_TDCNTRST_EXEV5 ((uint32_t)0x00002000U) /* Bit[13] External event */ +#define SHRTIM_TDCNTRST_EXEV4 ((uint32_t)0x00001000U) /* Bit[12] External event */ +#define SHRTIM_TDCNTRST_EXEV3 ((uint32_t)0x00000800U) /* Bit[11] External event */ +#define SHRTIM_TDCNTRST_EXEV2 ((uint32_t)0x00000400U) /* Bit[10] External event */ +#define SHRTIM_TDCNTRST_EXEV1 ((uint32_t)0x00000200U) /* Bit[9] External event */ +#define SHRTIM_TDCNTRST_MCMP4 ((uint32_t)0x00000100U) /* Bit[8] Master compare 4 */ +#define SHRTIM_TDCNTRST_MCMP3 ((uint32_t)0x00000080U) /* Bit[7] Master compare 3 */ +#define SHRTIM_TDCNTRST_MCMP2 ((uint32_t)0x00000040U) /* Bit[6] Master compare 2 */ +#define SHRTIM_TDCNTRST_MCMP1 ((uint32_t)0x00000020U) /* Bit[5] Master compare 1 */ +#define SHRTIM_TDCNTRST_MPRD ((uint32_t)0x00000010U) /* Bit[4] Master timer period */ +#define SHRTIM_TDCNTRST_CMP4 ((uint32_t)0x00000008U) /* Bit[3] Timer D compare 4 reset */ +#define SHRTIM_TDCNTRST_CMP2 ((uint32_t)0x00000004U) /* Bit[2] Timer D compare 2 reset */ +#define SHRTIM_TDCNTRST_UPD ((uint32_t)0x00000002U) /* Bit[1] Timer D update reset */ +#define SHRTIM_TDCNTRST_TFCMP1 ((uint32_t)0x00000001U) /* Bit[0] Timer F compare 1 */ + +/** Bit definition for SHRTIM_TECNTRST register **/ +#define SHRTIM_TECNTRST_TFCMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer F compare 2 */ +#define SHRTIM_TECNTRST_TDCMP4 ((uint32_t)0x40000000U) /* Bit[30] Timer D compare 4 */ +#define SHRTIM_TECNTRST_TDCMP2 ((uint32_t)0x20000000U) /* Bit[29] Timer D compare 2 */ +#define SHRTIM_TECNTRST_TDCMP1 ((uint32_t)0x10000000U) /* Bit[28] Timer D compare 1 */ +#define SHRTIM_TECNTRST_TCCMP4 ((uint32_t)0x08000000U) /* Bit[27] Timer C compare 4 */ +#define SHRTIM_TECNTRST_TCCMP2 ((uint32_t)0x04000000U) /* Bit[26] Timer C compare 2 */ +#define SHRTIM_TECNTRST_TCCMP1 ((uint32_t)0x02000000U) /* Bit[25] Timer C compare 1 */ +#define SHRTIM_TECNTRST_TBCMP4 ((uint32_t)0x01000000U) /* Bit[24] Timer E compare 4 */ +#define SHRTIM_TECNTRST_TBCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer E compare 2 */ +#define SHRTIM_TECNTRST_TBCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer E compare 1 */ +#define SHRTIM_TECNTRST_TACMP4 ((uint32_t)0x00200000U) /* Bit[21] Timer B compare 4 */ +#define SHRTIM_TECNTRST_TACMP2 ((uint32_t)0x00100000U) /* Bit[20] Timer B compare 2 */ +#define SHRTIM_TECNTRST_TACMP1 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 1 */ +#define SHRTIM_TECNTRST_EXEV10 ((uint32_t)0x00040000U) /* Bit[18] External event */ +#define SHRTIM_TECNTRST_EXEV9 ((uint32_t)0x00020000U) /* Bit[17] External event */ +#define SHRTIM_TECNTRST_EXEV8 ((uint32_t)0x00010000U) /* Bit[16] External event */ +#define SHRTIM_TECNTRST_EXEV7 ((uint32_t)0x00008000U) /* Bit[15] External event */ +#define SHRTIM_TECNTRST_EXEV6 ((uint32_t)0x00004000U) /* Bit[14] External event */ +#define SHRTIM_TECNTRST_EXEV5 ((uint32_t)0x00002000U) /* Bit[13] External event */ +#define SHRTIM_TECNTRST_EXEV4 ((uint32_t)0x00001000U) /* Bit[12] External event */ +#define SHRTIM_TECNTRST_EXEV3 ((uint32_t)0x00000800U) /* Bit[11] External event */ +#define SHRTIM_TECNTRST_EXEV2 ((uint32_t)0x00000400U) /* Bit[10] External event */ +#define SHRTIM_TECNTRST_EXEV1 ((uint32_t)0x00000200U) /* Bit[9] External event */ +#define SHRTIM_TECNTRST_MCMP4 ((uint32_t)0x00000100U) /* Bit[8] Master compare 4 */ +#define SHRTIM_TECNTRST_MCMP3 ((uint32_t)0x00000080U) /* Bit[7] Master compare 3 */ +#define SHRTIM_TECNTRST_MCMP2 ((uint32_t)0x00000040U) /* Bit[6] Master compare 2 */ +#define SHRTIM_TECNTRST_MCMP1 ((uint32_t)0x00000020U) /* Bit[5] Master compare 1 */ +#define SHRTIM_TECNTRST_MPRD ((uint32_t)0x00000010U) /* Bit[4] Master timer period */ +#define SHRTIM_TECNTRST_CMP4 ((uint32_t)0x00000008U) /* Bit[3] Timer E compare 4 reset */ +#define SHRTIM_TECNTRST_CMP2 ((uint32_t)0x00000004U) /* Bit[2] Timer E compare 2 reset */ +#define SHRTIM_TECNTRST_UPD ((uint32_t)0x00000002U) /* Bit[1] Timer E update reset */ +#define SHRTIM_TECNTRST_TFCMP1 ((uint32_t)0x00000001U) /* Bit[0] Timer F compare 1 */ + +/** Bit definition for SHRTIM_TFCNTRST register **/ +#define SHRTIM_TFCNTRST_TECMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer E compare 2 */ +#define SHRTIM_TFCNTRST_TDCMP4 ((uint32_t)0x40000000U) /* Bit[30] Timer D compare 4 */ +#define SHRTIM_TFCNTRST_TDCMP2 ((uint32_t)0x20000000U) /* Bit[29] Timer D compare 2 */ +#define SHRTIM_TFCNTRST_TDCMP1 ((uint32_t)0x10000000U) /* Bit[28] Timer D compare 1 */ +#define SHRTIM_TFCNTRST_TCCMP4 ((uint32_t)0x08000000U) /* Bit[27] Timer C compare 4 */ +#define SHRTIM_TFCNTRST_TCCMP2 ((uint32_t)0x04000000U) /* Bit[26] Timer C compare 2 */ +#define SHRTIM_TFCNTRST_TCCMP1 ((uint32_t)0x02000000U) /* Bit[25] Timer C compare 1 */ +#define SHRTIM_TFCNTRST_TBCMP4 ((uint32_t)0x01000000U) /* Bit[24] Timer F compare 4 */ +#define SHRTIM_TFCNTRST_TBCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer F compare 2 */ +#define SHRTIM_TFCNTRST_TBCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer F compare 1 */ +#define SHRTIM_TFCNTRST_TACMP4 ((uint32_t)0x00200000U) /* Bit[21] Timer B compare 4 */ +#define SHRTIM_TFCNTRST_TACMP2 ((uint32_t)0x00100000U) /* Bit[20] Timer B compare 2 */ +#define SHRTIM_TFCNTRST_TACMP1 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 1 */ +#define SHRTIM_TFCNTRST_EXEV10 ((uint32_t)0x00040000U) /* Bit[18] External event */ +#define SHRTIM_TFCNTRST_EXEV9 ((uint32_t)0x00020000U) /* Bit[17] External event */ +#define SHRTIM_TFCNTRST_EXEV8 ((uint32_t)0x00010000U) /* Bit[16] External event */ +#define SHRTIM_TFCNTRST_EXEV7 ((uint32_t)0x00008000U) /* Bit[15] External event */ +#define SHRTIM_TFCNTRST_EXEV6 ((uint32_t)0x00004000U) /* Bit[14] External event */ +#define SHRTIM_TFCNTRST_EXEV5 ((uint32_t)0x00002000U) /* Bit[13] External event */ +#define SHRTIM_TFCNTRST_EXEV4 ((uint32_t)0x00001000U) /* Bit[12] External event */ +#define SHRTIM_TFCNTRST_EXEV3 ((uint32_t)0x00000800U) /* Bit[11] External event */ +#define SHRTIM_TFCNTRST_EXEV2 ((uint32_t)0x00000400U) /* Bit[10] External event */ +#define SHRTIM_TFCNTRST_EXEV1 ((uint32_t)0x00000200U) /* Bit[9] External event */ +#define SHRTIM_TFCNTRST_MCMP4 ((uint32_t)0x00000100U) /* Bit[8] Master compare 4 */ +#define SHRTIM_TFCNTRST_MCMP3 ((uint32_t)0x00000080U) /* Bit[7] Master compare 3 */ +#define SHRTIM_TFCNTRST_MCMP2 ((uint32_t)0x00000040U) /* Bit[6] Master compare 2 */ +#define SHRTIM_TFCNTRST_MCMP1 ((uint32_t)0x00000020U) /* Bit[5] Master compare 1 */ +#define SHRTIM_TFCNTRST_MPRD ((uint32_t)0x00000010U) /* Bit[4] Master timer period */ +#define SHRTIM_TFCNTRST_CMP4 ((uint32_t)0x00000008U) /* Bit[3] Timer F compare 4 reset */ +#define SHRTIM_TFCNTRST_CMP2 ((uint32_t)0x00000004U) /* Bit[2] Timer F compare 2 reset */ +#define SHRTIM_TFCNTRST_UPD ((uint32_t)0x00000002U) /* Bit[1] Timer F update reset */ +#define SHRTIM_TFCNTRST_TECMP1 ((uint32_t)0x00000001U) /* Bit[0] Timer E compare 1 */ + +/** Bit definition for SHRTIM_TXCHOP register **/ +#define SHRTIM_TXCHOP_STARTPW ((uint32_t)0x00000780U) /* Bit[10:7] Timer x start pulse width */ +#define SHRTIM_TXCHOP_STARTPW_0 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXCHOP_STARTPW_1 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXCHOP_STARTPW_2 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXCHOP_STARTPW_3 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXCHOP_CARDCY ((uint32_t)0x00000070U) /* Bit[6:4] Timer x chopper duty cycle value */ +#define SHRTIM_TXCHOP_CARDCY_0 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXCHOP_CARDCY_1 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXCHOP_CARDCY_2 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXCHOP_CARFRQ ((uint32_t)0x0000000FU) /* Bit[3:0] Timer x carrier frequency value */ +#define SHRTIM_TXCHOP_CARFRQ_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXCHOP_CARFRQ_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXCHOP_CARFRQ_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXCHOP_CARFRQ_3 ((uint32_t)0x00000008U) /* Bit3 */ + +/** Bit definition for SHRTIM_TACPT1CTRL register **/ +#define SHRTIM_TACPT1CTRL_TECMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer E compare 2 */ +#define SHRTIM_TACPT1CTRL_TECMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 1 */ +#define SHRTIM_TACPT1CTRL_TE1RST ((uint32_t)0x20000000U) /* Bit[29] Timer E output 1 reset */ +#define SHRTIM_TACPT1CTRL_TE1SET ((uint32_t)0x10000000U) /* Bit[28] Timer E output 1 reset */ +#define SHRTIM_TACPT1CTRL_TDCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 2 */ +#define SHRTIM_TACPT1CTRL_TDCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 1 */ +#define SHRTIM_TACPT1CTRL_TD1RST ((uint32_t)0x02000000U) /* Bit[25] Timer D output 1 reset */ +#define SHRTIM_TACPT1CTRL_TD1SET ((uint32_t)0x01000000U) /* Bit[24] Timer D output 1 reset */ +#define SHRTIM_TACPT1CTRL_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TACPT1CTRL_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TACPT1CTRL_TC1RST ((uint32_t)0x00200000U) /* Bit[21] Timer C output 1 reset */ +#define SHRTIM_TACPT1CTRL_TC1SET ((uint32_t)0x00100000U) /* Bit[20] Timer C output 1 reset */ +#define SHRTIM_TACPT1CTRL_TBCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 2 */ +#define SHRTIM_TACPT1CTRL_TBCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer B compare 1 */ +#define SHRTIM_TACPT1CTRL_TB1RST ((uint32_t)0x00020000U) /* Bit[17] Timer B output 1 reset */ +#define SHRTIM_TACPT1CTRL_TB1SET ((uint32_t)0x00010000U) /* Bit[16] Timer B output 1 reset */ +#define SHRTIM_TACPT1CTRL_TFCMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer F compare 2 */ +#define SHRTIM_TACPT1CTRL_TFCMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer F compare 1 */ +#define SHRTIM_TACPT1CTRL_TF1RST ((uint32_t)0x00002000U) /* Bit[13] Timer F output 1 reset */ +#define SHRTIM_TACPT1CTRL_TF1SET ((uint32_t)0x00001000U) /* Bit[12] Timer F output 1 reset */ +#define SHRTIM_TACPT1CTRL_EXEV10 ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TACPT1CTRL_EXEV9 ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TACPT1CTRL_EXEV8 ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TACPT1CTRL_EXEV7 ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TACPT1CTRL_EXEV6 ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TACPT1CTRL_EXEV5 ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TACPT1CTRL_EXEV4 ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TACPT1CTRL_EXEV3 ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TACPT1CTRL_EXEV2 ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TACPT1CTRL_EXEV1 ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TACPT1CTRL_UPD ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TACPT1CTRL_SW ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TACPT2CTRL register **/ +#define SHRTIM_TACPT2CTRL_TECMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer E compare 2 */ +#define SHRTIM_TACPT2CTRL_TECMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 1 */ +#define SHRTIM_TACPT2CTRL_TE1RST ((uint32_t)0x20000000U) /* Bit[29] Timer E output 1 reset */ +#define SHRTIM_TACPT2CTRL_TE1SET ((uint32_t)0x10000000U) /* Bit[28] Timer E output 1 reset */ +#define SHRTIM_TACPT2CTRL_TDCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 2 */ +#define SHRTIM_TACPT2CTRL_TDCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 1 */ +#define SHRTIM_TACPT2CTRL_TD1RST ((uint32_t)0x02000000U) /* Bit[25] Timer D output 1 reset */ +#define SHRTIM_TACPT2CTRL_TD1SET ((uint32_t)0x01000000U) /* Bit[24] Timer D output 1 reset */ +#define SHRTIM_TACPT2CTRL_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TACPT2CTRL_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TACPT2CTRL_TC1RST ((uint32_t)0x00200000U) /* Bit[21] Timer C output 1 reset */ +#define SHRTIM_TACPT2CTRL_TC1SET ((uint32_t)0x00100000U) /* Bit[20] Timer C output 1 reset */ +#define SHRTIM_TACPT2CTRL_TBCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 2 */ +#define SHRTIM_TACPT2CTRL_TBCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer B compare 1 */ +#define SHRTIM_TACPT2CTRL_TB1RST ((uint32_t)0x00020000U) /* Bit[17] Timer B output 1 reset */ +#define SHRTIM_TACPT2CTRL_TB1SET ((uint32_t)0x00010000U) /* Bit[16] Timer B output 1 reset */ +#define SHRTIM_TACPT2CTRL_TFCMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer F compare 2 */ +#define SHRTIM_TACPT2CTRL_TFCMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer F compare 1 */ +#define SHRTIM_TACPT2CTRL_TF1RST ((uint32_t)0x00002000U) /* Bit[13] Timer F output 1 reset */ +#define SHRTIM_TACPT2CTRL_TF1SET ((uint32_t)0x00001000U) /* Bit[12] Timer F output 1 reset */ +#define SHRTIM_TACPT2CTRL_EXEV10CPT ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TACPT2CTRL_EXEV9CPT ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TACPT2CTRL_EXEV8CPT ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TACPT2CTRL_EXEV7CPT ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TACPT2CTRL_EXEV6CPT ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TACPT2CTRL_EXEV5CPT ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TACPT2CTRL_EXEV4CPT ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TACPT2CTRL_EXEV3CPT ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TACPT2CTRL_EXEV2CPT ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TACPT2CTRL_EXEV1CPT ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TACPT2CTRL_UPDCPT ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TACPT2CTRL_SWCPT ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TBCPT1CTRL register **/ +#define SHRTIM_TBCPT1CTRL_TECMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer E compare 2 */ +#define SHRTIM_TBCPT1CTRL_TECMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 1 */ +#define SHRTIM_TBCPT1CTRL_TE1RST ((uint32_t)0x20000000U) /* Bit[29] Timer E output 1 reset */ +#define SHRTIM_TBCPT1CTRL_TE1SET ((uint32_t)0x10000000U) /* Bit[28] Timer E output 1 reset */ +#define SHRTIM_TBCPT1CTRL_TDCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 2 */ +#define SHRTIM_TBCPT1CTRL_TDCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 1 */ +#define SHRTIM_TBCPT1CTRL_TD1RST ((uint32_t)0x02000000U) /* Bit[25] Timer D output 1 reset */ +#define SHRTIM_TBCPT1CTRL_TD1SET ((uint32_t)0x01000000U) /* Bit[24] Timer D output 1 reset */ +#define SHRTIM_TBCPT1CTRL_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TBCPT1CTRL_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TBCPT1CTRL_TC1RST ((uint32_t)0x00200000U) /* Bit[21] Timer C output 1 reset */ +#define SHRTIM_TBCPT1CTRL_TC1SET ((uint32_t)0x00100000U) /* Bit[20] Timer C output 1 reset */ +#define SHRTIM_TBCPT1CTRL_TFCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer F compare 2 */ +#define SHRTIM_TBCPT1CTRL_TFCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer F compare 1 */ +#define SHRTIM_TBCPT1CTRL_TF1RST ((uint32_t)0x00020000U) /* Bit[17] Timer F output 1 reset */ +#define SHRTIM_TBCPT1CTRL_TF1SET ((uint32_t)0x00010000U) /* Bit[16] Timer F output 1 reset */ +#define SHRTIM_TBCPT1CTRL_TACMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer A compare 2 */ +#define SHRTIM_TBCPT1CTRL_TACMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer A compare 1 */ +#define SHRTIM_TBCPT1CTRL_TA1RST ((uint32_t)0x00002000U) /* Bit[13] Timer A output 1 reset */ +#define SHRTIM_TBCPT1CTRL_TA1SET ((uint32_t)0x00001000U) /* Bit[12] Timer A output 1 reset */ +#define SHRTIM_TBCPT1CTRL_EXEV10CPT ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TBCPT1CTRL_EXEV9CPT ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TBCPT1CTRL_EXEV8CPT ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TBCPT1CTRL_EXEV7CPT ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TBCPT1CTRL_EXEV6CPT ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TBCPT1CTRL_EXEV5CPT ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TBCPT1CTRL_EXEV4CPT ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TBCPT1CTRL_EXEV3CPT ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TBCPT1CTRL_EXEV2CPT ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TBCPT1CTRL_EXEV1CPT ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TBCPT1CTRL_UPDCPT ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TBCPT1CTRL_SWCPT ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TBCPT2CTRL register **/ +#define SHRTIM_TBCPT2CTRL_TECMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer E compare 2 */ +#define SHRTIM_TBCPT2CTRL_TECMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 1 */ +#define SHRTIM_TBCPT2CTRL_TE1RST ((uint32_t)0x20000000U) /* Bit[29] Timer E output 1 reset */ +#define SHRTIM_TBCPT2CTRL_TE1SET ((uint32_t)0x10000000U) /* Bit[28] Timer E output 1 reset */ +#define SHRTIM_TBCPT2CTRL_TDCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 2 */ +#define SHRTIM_TBCPT2CTRL_TDCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 1 */ +#define SHRTIM_TBCPT2CTRL_TD1RST ((uint32_t)0x02000000U) /* Bit[25] Timer D output 1 reset */ +#define SHRTIM_TBCPT2CTRL_TD1SET ((uint32_t)0x01000000U) /* Bit[24] Timer D output 1 reset */ +#define SHRTIM_TBCPT2CTRL_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TBCPT2CTRL_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TBCPT2CTRL_TC1RST ((uint32_t)0x00200000U) /* Bit[21] Timer C output 1 reset */ +#define SHRTIM_TBCPT2CTRL_TC1SET ((uint32_t)0x00100000U) /* Bit[20] Timer C output 1 reset */ +#define SHRTIM_TBCPT2CTRL_TFCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer F compare 2 */ +#define SHRTIM_TBCPT2CTRL_TFCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer F compare 1 */ +#define SHRTIM_TBCPT2CTRL_TF1RST ((uint32_t)0x00020000U) /* Bit[17] Timer F output 1 reset */ +#define SHRTIM_TBCPT2CTRL_TF1SET ((uint32_t)0x00010000U) /* Bit[16] Timer F output 1 reset */ +#define SHRTIM_TBCPT2CTRL_TACMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer A compare 2 */ +#define SHRTIM_TBCPT2CTRL_TACMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer A compare 1 */ +#define SHRTIM_TBCPT2CTRL_TA1RST ((uint32_t)0x00002000U) /* Bit[13] Timer A output 1 reset */ +#define SHRTIM_TBCPT2CTRL_TA1SET ((uint32_t)0x00001000U) /* Bit[12] Timer A output 1 reset */ +#define SHRTIM_TBCPT2CTRL_EXEV10CPT ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TBCPT2CTRL_EXEV9CPT ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TBCPT2CTRL_EXEV8CPT ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TBCPT2CTRL_EXEV7CPT ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TBCPT2CTRL_EXEV6CPT ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TBCPT2CTRL_EXEV5CPT ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TBCPT2CTRL_EXEV4CPT ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TBCPT2CTRL_EXEV3CPT ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TBCPT2CTRL_EXEV2CPT ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TBCPT2CTRL_EXEV1CPT ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TBCPT2CTRL_UPDCPT ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TBCPT2CTRL_SWCPT ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TCCPT1CTRL register **/ +#define SHRTIM_TCCPT1CTRL_TECMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer E compare 2 */ +#define SHRTIM_TCCPT1CTRL_TECMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 1 */ +#define SHRTIM_TCCPT1CTRL_TE1RST ((uint32_t)0x20000000U) /* Bit[29] Timer E output 1 reset */ +#define SHRTIM_TCCPT1CTRL_TE1SET ((uint32_t)0x10000000U) /* Bit[28] Timer E output 1 reset */ +#define SHRTIM_TCCPT1CTRL_TDCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 2 */ +#define SHRTIM_TCCPT1CTRL_TDCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 1 */ +#define SHRTIM_TCCPT1CTRL_TD1RST ((uint32_t)0x02000000U) /* Bit[25] Timer D output 1 reset */ +#define SHRTIM_TCCPT1CTRL_TD1SET ((uint32_t)0x01000000U) /* Bit[24] Timer D output 1 reset */ +#define SHRTIM_TCCPT1CTRL_TFCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer F compare 2 */ +#define SHRTIM_TCCPT1CTRL_TFCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer F compare 1 */ +#define SHRTIM_TCCPT1CTRL_TF1RST ((uint32_t)0x00200000U) /* Bit[21] Timer F output 1 reset */ +#define SHRTIM_TCCPT1CTRL_TF1SET ((uint32_t)0x00100000U) /* Bit[20] Timer F output 1 reset */ +#define SHRTIM_TCCPT1CTRL_TBCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 2 */ +#define SHRTIM_TCCPT1CTRL_TBCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer B compare 1 */ +#define SHRTIM_TCCPT1CTRL_TB1RST ((uint32_t)0x00020000U) /* Bit[17] Timer B output 1 reset */ +#define SHRTIM_TCCPT1CTRL_TB1SET ((uint32_t)0x00010000U) /* Bit[16] Timer B output 1 reset */ +#define SHRTIM_TCCPT1CTRL_TACMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer A compare 2 */ +#define SHRTIM_TCCPT1CTRL_TACMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer A compare 1 */ +#define SHRTIM_TCCPT1CTRL_TA1RST ((uint32_t)0x00002000U) /* Bit[13] Timer A output 1 reset */ +#define SHRTIM_TCCPT1CTRL_TA1SET ((uint32_t)0x00001000U) /* Bit[12] Timer A output 1 reset */ +#define SHRTIM_TCCPT1CTRL_EXEV10CPT ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TCCPT1CTRL_EXEV9CPT ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TCCPT1CTRL_EXEV8CPT ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TCCPT1CTRL_EXEV7CPT ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TCCPT1CTRL_EXEV6CPT ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TCCPT1CTRL_EXEV5CPT ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TCCPT1CTRL_EXEV4CPT ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TCCPT1CTRL_EXEV3CPT ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TCCPT1CTRL_EXEV2CPT ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TCCPT1CTRL_EXEV1CPT ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TCCPT1CTRL_UPDCPT ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TCCPT1CTRL_SWCPT ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TCCPT2CTRL register **/ +#define SHRTIM_TCCPT2CTRL_TECMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer E compare 2 */ +#define SHRTIM_TCCPT2CTRL_TECMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 1 */ +#define SHRTIM_TCCPT2CTRL_TE1RST ((uint32_t)0x20000000U) /* Bit[29] Timer E output 1 reset */ +#define SHRTIM_TCCPT2CTRL_TE1SET ((uint32_t)0x10000000U) /* Bit[28] Timer E output 1 reset */ +#define SHRTIM_TCCPT2CTRL_TDCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 2 */ +#define SHRTIM_TCCPT2CTRL_TDCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 1 */ +#define SHRTIM_TCCPT2CTRL_TD1RST ((uint32_t)0x02000000U) /* Bit[25] Timer D output 1 reset */ +#define SHRTIM_TCCPT2CTRL_TD1SET ((uint32_t)0x01000000U) /* Bit[24] Timer D output 1 reset */ +#define SHRTIM_TCCPT2CTRL_TFCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer F compare 2 */ +#define SHRTIM_TCCPT2CTRL_TFCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer F compare 1 */ +#define SHRTIM_TCCPT2CTRL_TF1RST ((uint32_t)0x00200000U) /* Bit[21] Timer F output 1 reset */ +#define SHRTIM_TCCPT2CTRL_TF1SET ((uint32_t)0x00100000U) /* Bit[20] Timer F output 1 reset */ +#define SHRTIM_TCCPT2CTRL_TBCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 2 */ +#define SHRTIM_TCCPT2CTRL_TBCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer B compare 1 */ +#define SHRTIM_TCCPT2CTRL_TB1RST ((uint32_t)0x00020000U) /* Bit[17] Timer B output 1 reset */ +#define SHRTIM_TCCPT2CTRL_TB1SET ((uint32_t)0x00010000U) /* Bit[16] Timer B output 1 reset */ +#define SHRTIM_TCCPT2CTRL_TACMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer A compare 2 */ +#define SHRTIM_TCCPT2CTRL_TACMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer A compare 1 */ +#define SHRTIM_TCCPT2CTRL_TA1RST ((uint32_t)0x00002000U) /* Bit[13] Timer A output 1 reset */ +#define SHRTIM_TCCPT2CTRL_TA1SET ((uint32_t)0x00001000U) /* Bit[12] Timer A output 1 reset */ +#define SHRTIM_TCCPT2CTRL_EXEV10CPT ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TCCPT2CTRL_EXEV9CPT ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TCCPT2CTRL_EXEV8CPT ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TCCPT2CTRL_EXEV7CPT ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TCCPT2CTRL_EXEV6CPT ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TCCPT2CTRL_EXEV5CPT ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TCCPT2CTRL_EXEV4CPT ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TCCPT2CTRL_EXEV3CPT ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TCCPT2CTRL_EXEV2CPT ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TCCPT2CTRL_EXEV1CPT ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TCCPT2CTRL_UPDCPT ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TCCPT2CTRL_SWCPT ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TDCPT1CTRL register **/ +#define SHRTIM_TDCPT1CTRL_TECMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer E compare 2 */ +#define SHRTIM_TDCPT1CTRL_TECMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 1 */ +#define SHRTIM_TDCPT1CTRL_TE1RST ((uint32_t)0x20000000U) /* Bit[29] Timer E output 1 reset */ +#define SHRTIM_TDCPT1CTRL_TE1SET ((uint32_t)0x10000000U) /* Bit[28] Timer E output 1 reset */ +#define SHRTIM_TDCPT1CTRL_TFCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer F compare 2 */ +#define SHRTIM_TDCPT1CTRL_TFCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer F compare 1 */ +#define SHRTIM_TDCPT1CTRL_TF1RST ((uint32_t)0x02000000U) /* Bit[25] Timer F output 1 reset */ +#define SHRTIM_TDCPT1CTRL_TF1SET ((uint32_t)0x01000000U) /* Bit[24] Timer F output 1 reset */ +#define SHRTIM_TDCPT1CTRL_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TDCPT1CTRL_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TDCPT1CTRL_TC1RST ((uint32_t)0x00200000U) /* Bit[21] Timer C output 1 reset */ +#define SHRTIM_TDCPT1CTRL_TC1SET ((uint32_t)0x00100000U) /* Bit[20] Timer C output 1 reset */ +#define SHRTIM_TDCPT1CTRL_TBCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 2 */ +#define SHRTIM_TDCPT1CTRL_TBCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer B compare 1 */ +#define SHRTIM_TDCPT1CTRL_TB1RST ((uint32_t)0x00020000U) /* Bit[17] Timer B output 1 reset */ +#define SHRTIM_TDCPT1CTRL_TB1SET ((uint32_t)0x00010000U) /* Bit[16] Timer B output 1 reset */ +#define SHRTIM_TDCPT1CTRL_TACMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer A compare 2 */ +#define SHRTIM_TDCPT1CTRL_TACMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer A compare 1 */ +#define SHRTIM_TDCPT1CTRL_TA1RST ((uint32_t)0x00002000U) /* Bit[13] Timer A output 1 reset */ +#define SHRTIM_TDCPT1CTRL_TA1SET ((uint32_t)0x00001000U) /* Bit[12] Timer A output 1 reset */ +#define SHRTIM_TDCPT1CTRL_EXEV10CPT ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TDCPT1CTRL_EXEV9CPT ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TDCPT1CTRL_EXEV8CPT ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TDCPT1CTRL_EXEV7CPT ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TDCPT1CTRL_EXEV6CPT ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TDCPT1CTRL_EXEV5CPT ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TDCPT1CTRL_EXEV4CPT ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TDCPT1CTRL_EXEV3CPT ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TDCPT1CTRL_EXEV2CPT ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TDCPT1CTRL_EXEV1CPT ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TDCPT1CTRL_UPDCPT ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TDCPT1CTRL_SWCPT ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TDCPT2CTRL register **/ +#define SHRTIM_TDCPT2CTRL_TECMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer E compare 2 */ +#define SHRTIM_TDCPT2CTRL_TECMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 1 */ +#define SHRTIM_TDCPT2CTRL_TE1RST ((uint32_t)0x20000000U) /* Bit[29] Timer E output 1 reset */ +#define SHRTIM_TDCPT2CTRL_TE1SET ((uint32_t)0x10000000U) /* Bit[28] Timer E output 1 reset */ +#define SHRTIM_TDCPT2CTRL_TFCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer F compare 2 */ +#define SHRTIM_TDCPT2CTRL_TFCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer F compare 1 */ +#define SHRTIM_TDCPT2CTRL_TF1RST ((uint32_t)0x02000000U) /* Bit[25] Timer F output 1 reset */ +#define SHRTIM_TDCPT2CTRL_TF1SET ((uint32_t)0x01000000U) /* Bit[24] Timer F output 1 reset */ +#define SHRTIM_TDCPT2CTRL_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TDCPT2CTRL_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TDCPT2CTRL_TC1RST ((uint32_t)0x00200000U) /* Bit[21] Timer C output 1 reset */ +#define SHRTIM_TDCPT2CTRL_TC1SET ((uint32_t)0x00100000U) /* Bit[20] Timer C output 1 reset */ +#define SHRTIM_TDCPT2CTRL_TBCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 2 */ +#define SHRTIM_TDCPT2CTRL_TBCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer B compare 1 */ +#define SHRTIM_TDCPT2CTRL_TB1RST ((uint32_t)0x00020000U) /* Bit[17] Timer B output 1 reset */ +#define SHRTIM_TDCPT2CTRL_TB1SET ((uint32_t)0x00010000U) /* Bit[16] Timer B output 1 reset */ +#define SHRTIM_TDCPT2CTRL_TACMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer A compare 2 */ +#define SHRTIM_TDCPT2CTRL_TACMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer A compare 1 */ +#define SHRTIM_TDCPT2CTRL_TA1RST ((uint32_t)0x00002000U) /* Bit[13] Timer A output 1 reset */ +#define SHRTIM_TDCPT2CTRL_TA1SET ((uint32_t)0x00001000U) /* Bit[12] Timer A output 1 reset */ +#define SHRTIM_TDCPT2CTRL_EXEV10CPT ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TDCPT2CTRL_EXEV9CPT ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TDCPT2CTRL_EXEV8CPT ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TDCPT2CTRL_EXEV7CPT ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TDCPT2CTRL_EXEV6CPT ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TDCPT2CTRL_EXEV5CPT ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TDCPT2CTRL_EXEV4CPT ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TDCPT2CTRL_EXEV3CPT ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TDCPT2CTRL_EXEV2CPT ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TDCPT2CTRL_EXEV1CPT ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TDCPT2CTRL_UPDCPT ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TDCPT2CTRL_SWCPT ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TECPT1CTRL register **/ +#define SHRTIM_TECPT1CTRL_TFCMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer F compare 2 */ +#define SHRTIM_TECPT1CTRL_TFCMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer F compare 1 */ +#define SHRTIM_TECPT1CTRL_TF1RST ((uint32_t)0x20000000U) /* Bit[29] Timer F output 1 reset */ +#define SHRTIM_TECPT1CTRL_TF1SET ((uint32_t)0x10000000U) /* Bit[28] Timer F output 1 reset */ +#define SHRTIM_TECPT1CTRL_TDCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 2 */ +#define SHRTIM_TECPT1CTRL_TDCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 1 */ +#define SHRTIM_TECPT1CTRL_TD1RST ((uint32_t)0x02000000U) /* Bit[25] Timer D output 1 reset */ +#define SHRTIM_TECPT1CTRL_TD1SET ((uint32_t)0x01000000U) /* Bit[24] Timer D output 1 reset */ +#define SHRTIM_TECPT1CTRL_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TECPT1CTRL_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TECPT1CTRL_TC1RST ((uint32_t)0x00200000U) /* Bit[21] Timer C output 1 reset */ +#define SHRTIM_TECPT1CTRL_TC1SET ((uint32_t)0x00100000U) /* Bit[20] Timer C output 1 reset */ +#define SHRTIM_TECPT1CTRL_TBCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 2 */ +#define SHRTIM_TECPT1CTRL_TBCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer B compare 1 */ +#define SHRTIM_TECPT1CTRL_TB1RST ((uint32_t)0x00020000U) /* Bit[17] Timer B output 1 reset */ +#define SHRTIM_TECPT1CTRL_TB1SET ((uint32_t)0x00010000U) /* Bit[16] Timer B output 1 reset */ +#define SHRTIM_TECPT1CTRL_TACMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer A compare 2 */ +#define SHRTIM_TECPT1CTRL_TACMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer A compare 1 */ +#define SHRTIM_TECPT1CTRL_TA1RST ((uint32_t)0x00002000U) /* Bit[13] Timer A output 1 reset */ +#define SHRTIM_TECPT1CTRL_TA1SET ((uint32_t)0x00001000U) /* Bit[12] Timer A output 1 reset */ +#define SHRTIM_TECPT1CTRL_EXEV10CPT ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TECPT1CTRL_EXEV9CPT ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TECPT1CTRL_EXEV8CPT ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TECPT1CTRL_EXEV7CPT ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TECPT1CTRL_EXEV6CPT ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TECPT1CTRL_EXEV5CPT ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TECPT1CTRL_EXEV4CPT ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TECPT1CTRL_EXEV3CPT ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TECPT1CTRL_EXEV2CPT ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TECPT1CTRL_EXEV1CPT ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TECPT1CTRL_UPDCPT ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TECPT1CTRL_SWCPT ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TECPT2CTRL register **/ +#define SHRTIM_TECPT2CTRL_TFCMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer F compare 2 */ +#define SHRTIM_TECPT2CTRL_TFCMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer F compare 1 */ +#define SHRTIM_TECPT2CTRL_TF1RST ((uint32_t)0x20000000U) /* Bit[29] Timer F output 1 reset */ +#define SHRTIM_TECPT2CTRL_TF1SET ((uint32_t)0x10000000U) /* Bit[28] Timer F output 1 reset */ +#define SHRTIM_TECPT2CTRL_TDCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 2 */ +#define SHRTIM_TECPT2CTRL_TDCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 1 */ +#define SHRTIM_TECPT2CTRL_TD1RST ((uint32_t)0x02000000U) /* Bit[25] Timer D output 1 reset */ +#define SHRTIM_TECPT2CTRL_TD1SET ((uint32_t)0x01000000U) /* Bit[24] Timer D output 1 reset */ +#define SHRTIM_TECPT2CTRL_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TECPT2CTRL_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TECPT2CTRL_TC1RST ((uint32_t)0x00200000U) /* Bit[21] Timer C output 1 reset */ +#define SHRTIM_TECPT2CTRL_TC1SET ((uint32_t)0x00100000U) /* Bit[20] Timer C output 1 reset */ +#define SHRTIM_TECPT2CTRL_TBCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 2 */ +#define SHRTIM_TECPT2CTRL_TBCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer B compare 1 */ +#define SHRTIM_TECPT2CTRL_TB1RST ((uint32_t)0x00020000U) /* Bit[17] Timer B output 1 reset */ +#define SHRTIM_TECPT2CTRL_TB1SET ((uint32_t)0x00010000U) /* Bit[16] Timer B output 1 reset */ +#define SHRTIM_TECPT2CTRL_TACMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer A compare 2 */ +#define SHRTIM_TECPT2CTRL_TACMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer A compare 1 */ +#define SHRTIM_TECPT2CTRL_TA1RST ((uint32_t)0x00002000U) /* Bit[13] Timer A output 1 reset */ +#define SHRTIM_TECPT2CTRL_TA1SET ((uint32_t)0x00001000U) /* Bit[12] Timer A output 1 reset */ +#define SHRTIM_TECPT2CTRL_EXEV10CPT ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TECPT2CTRL_EXEV9CPT ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TECPT2CTRL_EXEV8CPT ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TECPT2CTRL_EXEV7CPT ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TECPT2CTRL_EXEV6CPT ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TECPT2CTRL_EXEV5CPT ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TECPT2CTRL_EXEV4CPT ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TECPT2CTRL_EXEV3CPT ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TECPT2CTRL_EXEV2CPT ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TECPT2CTRL_EXEV1CPT ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TECPT2CTRL_UPDCPT ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TECPT2CTRL_SWCPT ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TFCPT1CTRL register **/ +#define SHRTIM_TFCPT1CTRL_TECMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer E compare 2 */ +#define SHRTIM_TFCPT1CTRL_TECMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 1 */ +#define SHRTIM_TFCPT1CTRL_TE1RST ((uint32_t)0x20000000U) /* Bit[29] Timer E output 1 reset */ +#define SHRTIM_TFCPT1CTRL_TE1SET ((uint32_t)0x10000000U) /* Bit[28] Timer E output 1 reset */ +#define SHRTIM_TFCPT1CTRL_TDCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 2 */ +#define SHRTIM_TFCPT1CTRL_TDCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 1 */ +#define SHRTIM_TFCPT1CTRL_TD1RST ((uint32_t)0x02000000U) /* Bit[25] Timer D output 1 reset */ +#define SHRTIM_TFCPT1CTRL_TD1SET ((uint32_t)0x01000000U) /* Bit[24] Timer D output 1 reset */ +#define SHRTIM_TFCPT1CTRL_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TFCPT1CTRL_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TFCPT1CTRL_TC1RST ((uint32_t)0x00200000U) /* Bit[21] Timer C output 1 reset */ +#define SHRTIM_TFCPT1CTRL_TC1SET ((uint32_t)0x00100000U) /* Bit[20] Timer C output 1 reset */ +#define SHRTIM_TFCPT1CTRL_TBCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 2 */ +#define SHRTIM_TFCPT1CTRL_TBCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer B compare 1 */ +#define SHRTIM_TFCPT1CTRL_TB1RST ((uint32_t)0x00020000U) /* Bit[17] Timer B output 1 reset */ +#define SHRTIM_TFCPT1CTRL_TB1SET ((uint32_t)0x00010000U) /* Bit[16] Timer B output 1 reset */ +#define SHRTIM_TFCPT1CTRL_TACMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer A compare 2 */ +#define SHRTIM_TFCPT1CTRL_TACMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer A compare 1 */ +#define SHRTIM_TFCPT1CTRL_TA1RST ((uint32_t)0x00002000U) /* Bit[13] Timer A output 1 reset */ +#define SHRTIM_TFCPT1CTRL_TA1SET ((uint32_t)0x00001000U) /* Bit[12] Timer A output 1 reset */ +#define SHRTIM_TFCPT1CTRL_EXEV10CPT ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TFCPT1CTRL_EXEV9CPT ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TFCPT1CTRL_EXEV8CPT ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TFCPT1CTRL_EXEV7CPT ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TFCPT1CTRL_EXEV6CPT ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TFCPT1CTRL_EXEV5CPT ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TFCPT1CTRL_EXEV4CPT ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TFCPT1CTRL_EXEV3CPT ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TFCPT1CTRL_EXEV2CPT ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TFCPT1CTRL_EXEV1CPT ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TFCPT1CTRL_UPDCPT ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TFCPT1CTRL_SWCPT ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TFCPT2CTRL register **/ +#define SHRTIM_TFCPT2CTRL_TECMP2 ((uint32_t)0x80000000U) /* Bit[31] Timer E compare 2 */ +#define SHRTIM_TFCPT2CTRL_TECMP1 ((uint32_t)0x40000000U) /* Bit[30] Timer E compare 1 */ +#define SHRTIM_TFCPT2CTRL_TE1RST ((uint32_t)0x20000000U) /* Bit[29] Timer E output 1 reset */ +#define SHRTIM_TFCPT2CTRL_TE1SET ((uint32_t)0x10000000U) /* Bit[28] Timer E output 1 reset */ +#define SHRTIM_TFCPT2CTRL_TDCMP2 ((uint32_t)0x08000000U) /* Bit[27] Timer D compare 2 */ +#define SHRTIM_TFCPT2CTRL_TDCMP1 ((uint32_t)0x04000000U) /* Bit[26] Timer D compare 1 */ +#define SHRTIM_TFCPT2CTRL_TD1RST ((uint32_t)0x02000000U) /* Bit[25] Timer D output 1 reset */ +#define SHRTIM_TFCPT2CTRL_TD1SET ((uint32_t)0x01000000U) /* Bit[24] Timer D output 1 reset */ +#define SHRTIM_TFCPT2CTRL_TCCMP2 ((uint32_t)0x00800000U) /* Bit[23] Timer C compare 2 */ +#define SHRTIM_TFCPT2CTRL_TCCMP1 ((uint32_t)0x00400000U) /* Bit[22] Timer C compare 1 */ +#define SHRTIM_TFCPT2CTRL_TC1RST ((uint32_t)0x00200000U) /* Bit[21] Timer C output 1 reset */ +#define SHRTIM_TFCPT2CTRL_TC1SET ((uint32_t)0x00100000U) /* Bit[20] Timer C output 1 reset */ +#define SHRTIM_TFCPT2CTRL_TBCMP2 ((uint32_t)0x00080000U) /* Bit[19] Timer B compare 2 */ +#define SHRTIM_TFCPT2CTRL_TBCMP1 ((uint32_t)0x00040000U) /* Bit[18] Timer B compare 1 */ +#define SHRTIM_TFCPT2CTRL_TB1RST ((uint32_t)0x00020000U) /* Bit[17] Timer B output 1 reset */ +#define SHRTIM_TFCPT2CTRL_TB1SET ((uint32_t)0x00010000U) /* Bit[16] Timer B output 1 reset */ +#define SHRTIM_TFCPT2CTRL_TACMP2 ((uint32_t)0x00008000U) /* Bit[15] Timer A compare 2 */ +#define SHRTIM_TFCPT2CTRL_TACMP1 ((uint32_t)0x00004000U) /* Bit[14] Timer A compare 1 */ +#define SHRTIM_TFCPT2CTRL_TA1RST ((uint32_t)0x00002000U) /* Bit[13] Timer A output 1 reset */ +#define SHRTIM_TFCPT2CTRL_TA1SET ((uint32_t)0x00001000U) /* Bit[12] Timer A output 1 reset */ +#define SHRTIM_TFCPT2CTRL_EXEV10CPT ((uint32_t)0x00000800U) /* Bit[11] External event 10 capture */ +#define SHRTIM_TFCPT2CTRL_EXEV9CPT ((uint32_t)0x00000400U) /* Bit[10] External event 9 capture */ +#define SHRTIM_TFCPT2CTRL_EXEV8CPT ((uint32_t)0x00000200U) /* Bit[9] External event 8 capture */ +#define SHRTIM_TFCPT2CTRL_EXEV7CPT ((uint32_t)0x00000100U) /* Bit[8] External event 7 capture */ +#define SHRTIM_TFCPT2CTRL_EXEV6CPT ((uint32_t)0x00000080U) /* Bit[7] External event 6 capture */ +#define SHRTIM_TFCPT2CTRL_EXEV5CPT ((uint32_t)0x00000040U) /* Bit[6] External event 5 capture */ +#define SHRTIM_TFCPT2CTRL_EXEV4CPT ((uint32_t)0x00000020U) /* Bit[5] External event 4 capture */ +#define SHRTIM_TFCPT2CTRL_EXEV3CPT ((uint32_t)0x00000010U) /* Bit[4] External event 3 capture */ +#define SHRTIM_TFCPT2CTRL_EXEV2CPT ((uint32_t)0x00000008U) /* Bit[3] External event 2 capture */ +#define SHRTIM_TFCPT2CTRL_EXEV1CPT ((uint32_t)0x00000004U) /* Bit[2] External event 1 capture */ +#define SHRTIM_TFCPT2CTRL_UPDCPT ((uint32_t)0x00000002U) /* Bit[1] Update capture */ +#define SHRTIM_TFCPT2CTRL_SWCPT ((uint32_t)0x00000001U) /* Bit[0] Software capture */ + +/** Bit definition for SHRTIM_TXOUT register **/ +#define SHRTIM_TXOUT_DIDL2 ((uint32_t)0x00800000U) /* Bit[23] Output2 deadtime upon burst mode idle entry */ +#define SHRTIM_TXOUT_CHP2 ((uint32_t)0x00400000U) /* Bit[22] Output2 chopper enable */ +#define SHRTIM_TXOUT_FALT2 ((uint32_t)0x00300000U) /* Bit[21:20] Output timer x channel 2 fault state */ +#define SHRTIM_TXOUT_FALT2_0 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_TXOUT_FALT2_1 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_TXOUT_IDLES2 ((uint32_t)0x00080000U) /* Bit[19] Output 2 idle state */ +#define SHRTIM_TXOUT_IDLEM2 ((uint32_t)0x00040000U) /* Bit[18] Output channel 2 idle mode */ +#define SHRTIM_TXOUT_POL2 ((uint32_t)0x00020000U) /* Bit[17] Output1 polarity */ +#define SHRTIM_TXOUT_BIAR ((uint32_t)0x00004000U) /* Bit[14] Balanced idle automatic resume */ +#define SHRTIM_TXOUT_DP ((uint32_t)0x00001C00U) /* Bit[12:10] Delay protection source and output */ +#define SHRTIM_TXOUT_DP_0 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXOUT_DP_1 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXOUT_DP_2 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXOUT_DPEN ((uint32_t)0x00000200U) /* Bit[9] Delayed protection enable */ +#define SHRTIM_TXOUT_DTEN ((uint32_t)0x00000100U) /* Bit[8] Deadtime enable */ +#define SHRTIM_TXOUT_DIDL1 ((uint32_t)0x00000080U) /* Bit[7] Output 1 deadtime upon burst mode idle entry */ +#define SHRTIM_TXOUT_CHP1 ((uint32_t)0x00000040U) /* Bit[6] Output 1 chopper enable */ +#define SHRTIM_TXOUT_FALT1 ((uint32_t)0x00000030U) /* Bit[5:4] Output channel 1 fault state */ +#define SHRTIM_TXOUT_FALT1_0 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXOUT_FALT1_1 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXOUT_IDLES1 ((uint32_t)0x00000008U) /* Bit[3] Output channel 1 idle state */ +#define SHRTIM_TXOUT_IDLEM1 ((uint32_t)0x00000004U) /* Bit[2] Output channel 1 idle mode */ +#define SHRTIM_TXOUT_POL1 ((uint32_t)0x00000002U) /* Bit[1] Output 1 polarity */ + +/** Bit definition for SHRTIM_TXFALT register **/ +#define SHRTIM_TXFALT_FALTLCK ((uint32_t)0x80000000U) /* Bit[31] Fault sources lock */ +#define SHRTIM_TXFALT_FALT6EN ((uint32_t)0x00000020U) /* Bit[5] Fault 6 enable */ +#define SHRTIM_TXFALT_FALT5EN ((uint32_t)0x00000010U) /* Bit[4] Fault 5 enable */ +#define SHRTIM_TXFALT_FALT4EN ((uint32_t)0x00000008U) /* Bit[3] Fault 4 enable */ +#define SHRTIM_TXFALT_FALT3EN ((uint32_t)0x00000004U) /* Bit[2] Fault 3 enable */ +#define SHRTIM_TXFALT_FALT2EN ((uint32_t)0x00000002U) /* Bit[1] Fault 2 enable */ +#define SHRTIM_TXFALT_FALT1EN ((uint32_t)0x00000001U) /* Bit[0] Fault 1 enable */ + +/** Bit definition for SHRTIM_TXCTRL2 register **/ +#define SHRTIM_TXCTRL2_TRGHLF ((uint32_t)0x00100000U) /* Bit[20] Triggered-half mode */ +#define SHRTIM_TXCTRL2_GTCMP3 ((uint32_t)0x00020000U) /* Bit[17] Greater than compare 3 PWM mode */ +#define SHRTIM_TXCTRL2_GTCMP1 ((uint32_t)0x00010000U) /* Bit[16] Greater than compare 1 PWM mode */ +#define SHRTIM_TXCTRL2_FEROM ((uint32_t)0x0000C000U) /* Bit[15:14] Fault and event roll-over mode */ +#define SHRTIM_TXCTRL2_FEROM_0 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXCTRL2_FEROM_1 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_TXCTRL2_BMROM ((uint32_t)0x00003000U) /* Bit[13:12] Burst mode roll-over mode */ +#define SHRTIM_TXCTRL2_BMROM_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXCTRL2_BMROM_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXCTRL2_ADCROM ((uint32_t)0x00000C00U) /* Bit[11:10] ADC roll-over mode */ +#define SHRTIM_TXCTRL2_ADCROM_0 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXCTRL2_ADCROM_1 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXCTRL2_OUTROM ((uint32_t)0x00000300U) /* Bit[9:8] Output roll-over mode */ +#define SHRTIM_TXCTRL2_OUTROM_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXCTRL2_OUTROM_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXCTRL2_ROM ((uint32_t)0x000000C0U) /* Bit[7:6] Roll-over mode */ +#define SHRTIM_TXCTRL2_ROM_0 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXCTRL2_ROM_1 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXCTRL2_UPDOWNM ((uint32_t)0x00000010U) /* Bit[4] Up-down mode */ +#define SHRTIM_TXCTRL2_DUDACRST ((uint32_t)0x00000004U) /* Bit[2] Dual DAC reset trigger */ +#define SHRTIM_TXCTRL2_DUDACSTEP ((uint32_t)0x00000002U) /* Bit[1] The trigger is generated on compare 2 event */ +#define SHRTIM_TXCTRL2_DUDACEN ((uint32_t)0x00000001U) /* Bit[0] Dual DAC trigger enable */ + +/** Bit definition for SHRTIM_TXEXEVFLT3 register **/ +#define SHRTIM_TXEXEVFLT3_EXEVCNT ((uint32_t)0x00003F00U) /* Bit[13:8] External event A counter */ +#define SHRTIM_TXEXEVFLT3_EXEVCNT_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXEXEVFLT3_EXEVCNT_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXEXEVFLT3_EXEVCNT_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXEXEVFLT3_EXEVCNT_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXEXEVFLT3_EXEVCNT_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXEXEVFLT3_EXEVCNT_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXEXEVFLT3_EXEVSEL ((uint32_t)0x000000F0U) /* Bit[7:4] External event A selection */ +#define SHRTIM_TXEXEVFLT3_EXEVSEL_0 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXEXEVFLT3_EXEVSEL_1 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXEXEVFLT3_EXEVSEL_2 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXEXEVFLT3_EXEVSEL_3 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXEXEVFLT3_EXEVRSTM ((uint32_t)0x00000004U) /* Bit[2] External event A reset mode */ +#define SHRTIM_TXEXEVFLT3_EXEVCNTRST ((uint32_t)0x00000002U) /* Bit[1] External event A counter reset */ +#define SHRTIM_TXEXEVFLT3_EXEVCNTEN ((uint32_t)0x00000001U) /* Bit[0] External event A counter enable */ + +/** Bit definition for SHRTIM_TXCMP5DAT register **/ +#define SHRTIM_TXCMP5DAT_CMP5DAT ((uint32_t)0x0000FFFFU) /* Bit[15:0] Timer A compare 5 value */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_TXCMP5DAT_CMP5DAT_15 ((uint32_t)0x00008000U) /* Bit15 */ + +/** Bit definition for SHRTIM_CTRL1 register **/ +#define SHRTIM_CTRL1_ADTG4UPDSRC ((uint32_t)0x0E000000U) /* Bit[27:25] ADC trigger update source 4 */ +#define SHRTIM_CTRL1_ADTG4UPDSRC_0 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_CTRL1_ADTG4UPDSRC_1 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_CTRL1_ADTG4UPDSRC_2 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_CTRL1_ADTG3UPDSRC ((uint32_t)0x01C00000U) /* Bit[24:22] ADC trigger update source 3 */ +#define SHRTIM_CTRL1_ADTG3UPDSRC_0 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_CTRL1_ADTG3UPDSRC_1 ((uint32_t)0x00800000U) /* Bit23 */ +#define SHRTIM_CTRL1_ADTG3UPDSRC_2 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_CTRL1_ADTG2UPDSRC ((uint32_t)0x00380000U) /* Bit[21:19] ADC trigger update source 2 */ +#define SHRTIM_CTRL1_ADTG2UPDSRC_0 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_CTRL1_ADTG2UPDSRC_1 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_CTRL1_ADTG2UPDSRC_2 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_CTRL1_ADTG1UPDSRC ((uint32_t)0x00070000U) /* Bit[18:16] ADC trigger update source 1 */ +#define SHRTIM_CTRL1_ADTG1UPDSRC_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_CTRL1_ADTG1UPDSRC_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_CTRL1_ADTG1UPDSRC_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_CTRL1_TFUPDDIS ((uint32_t)0x00000040U) /* Bit[6] Timer F update disable */ +#define SHRTIM_CTRL1_TEUPDDIS ((uint32_t)0x00000020U) /* Bit[5] Timer E update disable */ +#define SHRTIM_CTRL1_TDUPDDIS ((uint32_t)0x00000010U) /* Bit[4] Timer D update disable */ +#define SHRTIM_CTRL1_TCUPDDIS ((uint32_t)0x00000008U) /* Bit[3] Timer C update disable */ +#define SHRTIM_CTRL1_TBUPDDIS ((uint32_t)0x00000004U) /* Bit[2] Timer B update disable */ +#define SHRTIM_CTRL1_TAUPDDIS ((uint32_t)0x00000002U) /* Bit[1] Timer A update disable */ +#define SHRTIM_CTRL1_MUPDDIS ((uint32_t)0x00000001U) /* Bit[0] Master update disable */ + +/** Bit definition for SHRTIM_CTRL2 register **/ +#define SHRTIM_CTRL2_SWAPF ((uint32_t)0x00200000U) /* Bit[21] Timer F output swap */ +#define SHRTIM_CTRL2_SWAPE ((uint32_t)0x00100000U) /* Bit[20] Timer E output swap */ +#define SHRTIM_CTRL2_SWAPD ((uint32_t)0x00080000U) /* Bit[19] Timer D output swap */ +#define SHRTIM_CTRL2_SWAPC ((uint32_t)0x00040000U) /* Bit[18] Timer C output swap */ +#define SHRTIM_CTRL2_SWAPB ((uint32_t)0x00020000U) /* Bit[17] Timer B output swap */ +#define SHRTIM_CTRL2_SWAPA ((uint32_t)0x00010000U) /* Bit[16] Timer A output swap */ +#define SHRTIM_CTRL2_TFSWCNTRST ((uint32_t)0x00004000U) /* Bit[14] Software counter reset for timer F */ +#define SHRTIM_CTRL2_TESWCNTRST ((uint32_t)0x00002000U) /* Bit[13] Software counter reset for timer E */ +#define SHRTIM_CTRL2_TDSWCNTRST ((uint32_t)0x00001000U) /* Bit[12] Software counter reset for timer D */ +#define SHRTIM_CTRL2_TCSWCNTRST ((uint32_t)0x00000800U) /* Bit[11] Software counter reset for timer C */ +#define SHRTIM_CTRL2_TBSWCNTRST ((uint32_t)0x00000400U) /* Bit[10] Software counter reset for timer B */ +#define SHRTIM_CTRL2_TASWCNTRST ((uint32_t)0x00000200U) /* Bit[9] Software counter reset for timer A */ +#define SHRTIM_CTRL2_MSWCNTRST ((uint32_t)0x00000100U) /* Bit[8] Software counter reset for master timer */ +#define SHRTIM_CTRL2_TFSWUPD ((uint32_t)0x00000040U) /* Bit[6] Software update timer F */ +#define SHRTIM_CTRL2_TESWUPD ((uint32_t)0x00000020U) /* Bit[5] Software update timer E */ +#define SHRTIM_CTRL2_TDSWUPD ((uint32_t)0x00000010U) /* Bit[4] Software update timer D */ +#define SHRTIM_CTRL2_TCSWUPD ((uint32_t)0x00000008U) /* Bit[3] Software update timer C */ +#define SHRTIM_CTRL2_TBSWUPD ((uint32_t)0x00000004U) /* Bit[2] Software update timer B */ +#define SHRTIM_CTRL2_TASWUPD ((uint32_t)0x00000002U) /* Bit[1] Software update timer A */ +#define SHRTIM_CTRL2_MSWUPD ((uint32_t)0x00000001U) /* Bit[0] Software update master timer */ + +/** Bit definition for SHRTIM_INTSTS register **/ +#define SHRTIM_INTSTS_BMPRDITF ((uint32_t)0x00020000U) /* Bit[17] Burst mode period interrupt flag */ +#define SHRTIM_INTSTS_FALT6ITF ((uint32_t)0x00000040U) /* Bit[6] Fault 6 interrupt flag */ +#define SHRTIM_INTSTS_SYSFALTITF ((uint32_t)0x00000020U) /* Bit[5] System fault interrupt flag */ +#define SHRTIM_INTSTS_FALT5ITF ((uint32_t)0x00000010U) /* Bit[4] Fault 5 interrupt flag */ +#define SHRTIM_INTSTS_FALT4ITF ((uint32_t)0x00000008U) /* Bit[3] Fault 4 interrupt flag */ +#define SHRTIM_INTSTS_FALT3ITF ((uint32_t)0x00000004U) /* Bit[2] Fault 3 interrupt flag */ +#define SHRTIM_INTSTS_FALT2ITF ((uint32_t)0x00000002U) /* Bit[1] Fault 2 interrupt flag */ +#define SHRTIM_INTSTS_FALT1ITF ((uint32_t)0x00000001U) /* Bit[0] Fault 1 interrupt flag */ + +/** Bit definition for SHRTIM_INTCLR register **/ +#define SHRTIM_INTCLR_BMPRDIC ((uint32_t)0x00020000U) /* Bit[17] Burst mode period flag clear */ +#define SHRTIM_INTCLR_FALT6IC ((uint32_t)0x00000040U) /* Bit[6] Fault 6 interrupt flag clear */ +#define SHRTIM_INTCLR_SYSFALTIC ((uint32_t)0x00000020U) /* Bit[5] System fault interrupt flag clear */ +#define SHRTIM_INTCLR_FALT5IC ((uint32_t)0x00000010U) /* Bit[4] Fault 5 interrupt flag clear */ +#define SHRTIM_INTCLR_FALT4IC ((uint32_t)0x00000008U) /* Bit[3] Fault 4 interrupt flag clear */ +#define SHRTIM_INTCLR_FALT3IC ((uint32_t)0x00000004U) /* Bit[2] Fault 3 interrupt flag clear */ +#define SHRTIM_INTCLR_FALT2IC ((uint32_t)0x00000002U) /* Bit[1] Fault 2 interrupt flag clear */ +#define SHRTIM_INTCLR_FALT1IC ((uint32_t)0x00000001U) /* Bit[0] Fault 1 interrupt flag clear */ + +/** Bit definition for SHRTIM_INTEN register **/ +#define SHRTIM_INTEN_BMPRDIEN ((uint32_t)0x00020000U) /* Bit[17] Burst mode period interrupt enable */ +#define SHRTIM_INTEN_FALT6IEN ((uint32_t)0x00000040U) /* Bit[6] Fault 6 interrupt enable */ +#define SHRTIM_INTEN_SYSFALTIEN ((uint32_t)0x00000020U) /* Bit[5] System fault interrupt enable */ +#define SHRTIM_INTEN_FALT5IEN ((uint32_t)0x00000010U) /* Bit[4] Fault 5 interrupt enable */ +#define SHRTIM_INTEN_FALT4IEN ((uint32_t)0x00000008U) /* Bit[3] Fault 4 interrupt enable */ +#define SHRTIM_INTEN_FALT3IEN ((uint32_t)0x00000004U) /* Bit[2] Fault 3 interrupt enable */ +#define SHRTIM_INTEN_FALT2IEN ((uint32_t)0x00000002U) /* Bit[1] Fault 2 interrupt enable */ +#define SHRTIM_INTEN_FALT1IEN ((uint32_t)0x00000001U) /* Bit[0] Fault 1 interrupt enable */ + +/** Bit definition for SHRTIM_OEN register **/ +#define SHRTIM_OEN_TF2OEN ((uint32_t)0x00000800U) /* Bit[11] Timer F output 2 enable */ +#define SHRTIM_OEN_TF1OEN ((uint32_t)0x00000400U) /* Bit[10] Timer F output 1 enable */ +#define SHRTIM_OEN_TE2OEN ((uint32_t)0x00000200U) /* Bit[9] Timer E output 2 enable */ +#define SHRTIM_OEN_TE1OEN ((uint32_t)0x00000100U) /* Bit[8] Timer E output 1 enable */ +#define SHRTIM_OEN_TD2OEN ((uint32_t)0x00000080U) /* Bit[7] Timer D output 2 enable */ +#define SHRTIM_OEN_TD1OEN ((uint32_t)0x00000040U) /* Bit[6] Timer D output 1 enable */ +#define SHRTIM_OEN_TC2OEN ((uint32_t)0x00000020U) /* Bit[5] Timer C output 2 enable */ +#define SHRTIM_OEN_TC1OEN ((uint32_t)0x00000010U) /* Bit[4] Timer C output 1 enable */ +#define SHRTIM_OEN_TB2OEN ((uint32_t)0x00000008U) /* Bit[3] Timer B output 2 enable */ +#define SHRTIM_OEN_TB1OEN ((uint32_t)0x00000004U) /* Bit[2] Timer B output 1 enable */ +#define SHRTIM_OEN_TA2OEN ((uint32_t)0x00000002U) /* Bit[1] Timer A output 2 enable */ +#define SHRTIM_OEN_TA1OEN ((uint32_t)0x00000001U) /* Bit[0] Timer A output 1 enable */ + +/** Bit definition for SHRTIM_ODIS register **/ +#define SHRTIM_ODIS_TF2ODIS ((uint32_t)0x00000800U) /* Bit[11] Timer F output 2 disable */ +#define SHRTIM_ODIS_TF1ODIS ((uint32_t)0x00000400U) /* Bit[10] Timer F output 1 disable */ +#define SHRTIM_ODIS_TE2ODIS ((uint32_t)0x00000200U) /* Bit[9] Timer E output 2 disable */ +#define SHRTIM_ODIS_TE1ODIS ((uint32_t)0x00000100U) /* Bit[8] Timer E output 1 disable */ +#define SHRTIM_ODIS_TD2ODIS ((uint32_t)0x00000080U) /* Bit[7] Timer D output 2 disable */ +#define SHRTIM_ODIS_TD1ODIS ((uint32_t)0x00000040U) /* Bit[6] Timer D output 1 disable */ +#define SHRTIM_ODIS_TC2ODIS ((uint32_t)0x00000020U) /* Bit[5] Timer C output 2 disable */ +#define SHRTIM_ODIS_TC1ODIS ((uint32_t)0x00000010U) /* Bit[4] Timer C output 1 disable */ +#define SHRTIM_ODIS_TB2ODIS ((uint32_t)0x00000008U) /* Bit[3] Timer B output 2 disable */ +#define SHRTIM_ODIS_TB1ODIS ((uint32_t)0x00000004U) /* Bit[2] Timer B output 1 disable */ +#define SHRTIM_ODIS_TA2ODIS ((uint32_t)0x00000002U) /* Bit[1] Timer A output 2 disable */ +#define SHRTIM_ODIS_TA1ODIS ((uint32_t)0x00000001U) /* Bit[0] Timer A output 1 disable */ + +/** Bit definition for SHRTIM_ODISSTS register **/ +#define SHRTIM_ODISSTS_TF2ODISSTS ((uint32_t)0x00000800U) /* Bit[11] Timer F output 2 disable status */ +#define SHRTIM_ODISSTS_TF1ODISSTS ((uint32_t)0x00000400U) /* Bit[10] Timer F output 1 disable status */ +#define SHRTIM_ODISSTS_TE2ODISSTS ((uint32_t)0x00000200U) /* Bit[9] Timer E output 2 disable status */ +#define SHRTIM_ODISSTS_TE1ODISSTS ((uint32_t)0x00000100U) /* Bit[8] Timer E output 1 disable status */ +#define SHRTIM_ODISSTS_TD2ODISSTS ((uint32_t)0x00000080U) /* Bit[7] Timer D output 2 disable status */ +#define SHRTIM_ODISSTS_TD1ODISSTS ((uint32_t)0x00000040U) /* Bit[6] Timer D output 1 disable status */ +#define SHRTIM_ODISSTS_TC2ODISSTS ((uint32_t)0x00000020U) /* Bit[5] Timer C output 2 disable status */ +#define SHRTIM_ODISSTS_TC1ODISSTS ((uint32_t)0x00000010U) /* Bit[4] Timer C output 1 disable status */ +#define SHRTIM_ODISSTS_TB2ODISSTS ((uint32_t)0x00000008U) /* Bit[3] Timer B output 2 disable status */ +#define SHRTIM_ODISSTS_TB1ODISSTS ((uint32_t)0x00000004U) /* Bit[2] Timer B output 1 disable status */ +#define SHRTIM_ODISSTS_TA2ODISSTS ((uint32_t)0x00000002U) /* Bit[1] Timer A output 2 disable status */ +#define SHRTIM_ODISSTS_TA1ODISSTS ((uint32_t)0x00000001U) /* Bit[0] Timer A output 1 disable status */ + +/** Bit definition for SHRTIM_BMCTRL register **/ +#define SHRTIM_BMCTRL_BMSTS ((uint32_t)0x80000000U) /* Bit[31] Burst mode operation status */ +#define SHRTIM_BMCTRL_TFBM ((uint32_t)0x00400000U) /* Bit[22] Timer F burst mode */ +#define SHRTIM_BMCTRL_TEBM ((uint32_t)0x00200000U) /* Bit[21] Timer E burst mode */ +#define SHRTIM_BMCTRL_TDBM ((uint32_t)0x00100000U) /* Bit[20] Timer D burst mode */ +#define SHRTIM_BMCTRL_TCBM ((uint32_t)0x00080000U) /* Bit[19] Timer C burst mode */ +#define SHRTIM_BMCTRL_TBBM ((uint32_t)0x00040000U) /* Bit[18] Timer B burst mode */ +#define SHRTIM_BMCTRL_TABM ((uint32_t)0x00020000U) /* Bit[17] Timer A burst mode */ +#define SHRTIM_BMCTRL_MBM ((uint32_t)0x00010000U) /* Bit[16] Master timer burst mode */ +#define SHRTIM_BMCTRL_BMPLEN ((uint32_t)0x00000400U) /* Bit[10] Burst mode preload enable */ +#define SHRTIM_BMCTRL_BMPSC ((uint32_t)0x000003C0U) /* Bit[9:6] Burst mode prescaler */ +#define SHRTIM_BMCTRL_BMPSC_0 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_BMCTRL_BMPSC_1 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_BMCTRL_BMPSC_2 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_BMCTRL_BMPSC_3 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_BMCTRL_BMCK ((uint32_t)0x0000003CU) /* Bit[5:2] Burst mode clock source */ +#define SHRTIM_BMCTRL_BMCK_0 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_BMCTRL_BMCK_1 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_BMCTRL_BMCK_2 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_BMCTRL_BMCK_3 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_BMCTRL_BMOM ((uint32_t)0x00000002U) /* Bit[1] Burst mode operating mode */ +#define SHRTIM_BMCTRL_BMEN ((uint32_t)0x00000001U) /* Bit[0] Burst mode enable */ + +/** Bit definition for SHRTIM_BMTG register **/ +#define SHRTIM_BMTG_OCEV ((uint32_t)0x80000000U) /* Bit[31] On-chip event */ +#define SHRTIM_BMTG_EXEV8 ((uint32_t)0x40000000U) /* Bit[30] External event 8 (TIMD filters applied) */ +#define SHRTIM_BMTG_EXEV7 ((uint32_t)0x20000000U) /* Bit[29] External event 7 (TIMA filters applied) */ +#define SHRTIM_BMTG_TDPRDEXEV8 ((uint32_t)0x10000000U) /* Bit[28] Timer D period following external event 8 */ +#define SHRTIM_BMTG_TAPRDEXEV7 ((uint32_t)0x08000000U) /* Bit[27] Timer A period following external event 7 */ +#define SHRTIM_BMTG_TECMP2 ((uint32_t)0x04000000U) /* Bit[26] Timer E compare 2 event */ +#define SHRTIM_BMTG_TECMP1 ((uint32_t)0x02000000U) /* Bit[25] Timer E compare 1 event */ +#define SHRTIM_BMTG_TEREPT ((uint32_t)0x01000000U) /* Bit[24] Timer E repetition */ +#define SHRTIM_BMTG_TFCMP1 ((uint32_t)0x00800000U) /* Bit[23] Timer F compare 1 event */ +#define SHRTIM_BMTG_TDCMP2 ((uint32_t)0x00400000U) /* Bit[22] Timer D compare 2 event */ +#define SHRTIM_BMTG_TFREPT ((uint32_t)0x00200000U) /* Bit[21] Timer F repetition */ +#define SHRTIM_BMTG_TDREPT ((uint32_t)0x00100000U) /* Bit[20] Timer D repetition */ +#define SHRTIM_BMTG_TDRSTRO ((uint32_t)0x00080000U) /* Bit[19] Timer D reset or roll-over */ +#define SHRTIM_BMTG_TFRSTRO ((uint32_t)0x00040000U) /* Bit[18] Timer F reset or roll-over */ +#define SHRTIM_BMTG_TCCMP1 ((uint32_t)0x00020000U) /* Bit[17] Timer C compare 1 event */ +#define SHRTIM_BMTG_TCREPT ((uint32_t)0x00010000U) /* Bit[16] Timer C repetition */ +#define SHRTIM_BMTG_TCRSTRO ((uint32_t)0x00008000U) /* Bit[15] Timer C reset or roll-over */ +#define SHRTIM_BMTG_TBCMP2 ((uint32_t)0x00004000U) /* Bit[14] Timer B compare 2 event */ +#define SHRTIM_BMTG_TBCMP1 ((uint32_t)0x00002000U) /* Bit[13] Timer B compare 1 event */ +#define SHRTIM_BMTG_TBREPT ((uint32_t)0x00001000U) /* Bit[12] Timer B repetition */ +#define SHRTIM_BMTG_TBRSTRO ((uint32_t)0x00000800U) /* Bit[11] Timer B reset or roll-over */ +#define SHRTIM_BMTG_TACMP2 ((uint32_t)0x00000400U) /* Bit[10] Timer A compare 2 event */ +#define SHRTIM_BMTG_TACMP1 ((uint32_t)0x00000200U) /* Bit[9] Timer A compare 1 event */ +#define SHRTIM_BMTG_TAREPT ((uint32_t)0x00000100U) /* Bit[8] Timer A repetition */ +#define SHRTIM_BMTG_TARSTRO ((uint32_t)0x00000080U) /* Bit[7] Timer A reset or roll-over */ +#define SHRTIM_BMTG_MCMP4 ((uint32_t)0x00000040U) /* Bit[6] Master compare 4 */ +#define SHRTIM_BMTG_MCMP3 ((uint32_t)0x00000020U) /* Bit[5] Master compare 3 */ +#define SHRTIM_BMTG_MCMP2 ((uint32_t)0x00000010U) /* Bit[4] Master compare 2 */ +#define SHRTIM_BMTG_MCMP1 ((uint32_t)0x00000008U) /* Bit[3] Master compare 1 */ +#define SHRTIM_BMTG_MREPT ((uint32_t)0x00000004U) /* Bit[2] Master repetition */ +#define SHRTIM_BMTG_MRSTRO ((uint32_t)0x00000002U) /* Bit[1] Master reset or roll-over */ +#define SHRTIM_BMTG_SWSTRT ((uint32_t)0x00000001U) /* Bit[0] Software start */ + +/** Bit definition for SHRTIM_BMCMP register **/ +#define SHRTIM_BMCMP_BMCMP ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Compare value while in burst mode */ +#define SHRTIM_BMCMP_BMCMP_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_BMCMP_BMCMP_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_BMCMP_BMCMP_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_BMCMP_BMCMP_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_BMCMP_BMCMP_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_BMCMP_BMCMP_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_BMCMP_BMCMP_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_BMCMP_BMCMP_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_BMCMP_BMCMP_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_BMCMP_BMCMP_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_BMCMP_BMCMP_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_BMCMP_BMCMP_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_BMCMP_BMCMP_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_BMCMP_BMCMP_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_BMCMP_BMCMP_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_BMCMP_BMCMP_15 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_BMCMP_BMCMP_16 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_BMCMP_BMCMP_17 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_BMCMP_BMCMP_18 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_BMCMP_BMCMP_19 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_BMCMP_BMCMP_20 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_BMCMP_BMCMP_21 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_BMCMP_BMCMP_22 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_BMCMP_BMCMP_23 ((uint32_t)0x00800000U) /* Bit23 */ +#define SHRTIM_BMCMP_BMCMP_24 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_BMCMP_BMCMP_25 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_BMCMP_BMCMP_26 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_BMCMP_BMCMP_27 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_BMCMP_BMCMP_28 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_BMCMP_BMCMP_29 ((uint32_t)0x20000000U) /* Bit29 */ +#define SHRTIM_BMCMP_BMCMP_30 ((uint32_t)0x40000000U) /* Bit30 */ +#define SHRTIM_BMCMP_BMCMP_31 ((uint32_t)0x80000000U) /* Bit31 */ + +/** Bit definition for SHRTIM_BMPRD register **/ +#define SHRTIM_BMPRD_BMPRD ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Period value while in burst mode */ +#define SHRTIM_BMPRD_BMPRD_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_BMPRD_BMPRD_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_BMPRD_BMPRD_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_BMPRD_BMPRD_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_BMPRD_BMPRD_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_BMPRD_BMPRD_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_BMPRD_BMPRD_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_BMPRD_BMPRD_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_BMPRD_BMPRD_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_BMPRD_BMPRD_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_BMPRD_BMPRD_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_BMPRD_BMPRD_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_BMPRD_BMPRD_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_BMPRD_BMPRD_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_BMPRD_BMPRD_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_BMPRD_BMPRD_15 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_BMPRD_BMPRD_16 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_BMPRD_BMPRD_17 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_BMPRD_BMPRD_18 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_BMPRD_BMPRD_19 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_BMPRD_BMPRD_20 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_BMPRD_BMPRD_21 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_BMPRD_BMPRD_22 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_BMPRD_BMPRD_23 ((uint32_t)0x00800000U) /* Bit23 */ +#define SHRTIM_BMPRD_BMPRD_24 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_BMPRD_BMPRD_25 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_BMPRD_BMPRD_26 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_BMPRD_BMPRD_27 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_BMPRD_BMPRD_28 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_BMPRD_BMPRD_29 ((uint32_t)0x20000000U) /* Bit29 */ +#define SHRTIM_BMPRD_BMPRD_30 ((uint32_t)0x40000000U) /* Bit30 */ +#define SHRTIM_BMPRD_BMPRD_31 ((uint32_t)0x80000000U) /* Bit31 */ + +/** Bit definition for SHRTIM_EXEVCTRL1 register **/ +#define SHRTIM_EXEVCTRL1_EXEV5SENS ((uint32_t)0x30000000U) /* Bit[29:28] External event 5 sensitivity */ +#define SHRTIM_EXEVCTRL1_EXEV5SENS_0 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_EXEVCTRL1_EXEV5SENS_1 ((uint32_t)0x20000000U) /* Bit29 */ +#define SHRTIM_EXEVCTRL1_EXEV5POL ((uint32_t)0x08000000U) /* Bit[27] External event 5 polarity */ +#define SHRTIM_EXEVCTRL1_EXEV5SRC ((uint32_t)0x07000000U) /* Bit[26:24] External event 5 source */ +#define SHRTIM_EXEVCTRL1_EXEV5SRC_0 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_EXEVCTRL1_EXEV5SRC_1 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_EXEVCTRL1_EXEV5SRC_2 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_EXEVCTRL1_EXEV4SENS ((uint32_t)0x00C00000U) /* Bit[23:22] External event 4 sensitivity */ +#define SHRTIM_EXEVCTRL1_EXEV4SENS_0 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_EXEVCTRL1_EXEV4SENS_1 ((uint32_t)0x00800000U) /* Bit23 */ +#define SHRTIM_EXEVCTRL1_EXEV4POL ((uint32_t)0x00200000U) /* Bit[21] External event 4 polarity */ +#define SHRTIM_EXEVCTRL1_EXEV4SRC ((uint32_t)0x001C0000U) /* Bit[20:18] External event 4 source */ +#define SHRTIM_EXEVCTRL1_EXEV4SRC_0 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_EXEVCTRL1_EXEV4SRC_1 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_EXEVCTRL1_EXEV4SRC_2 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_EXEVCTRL1_EXEV3SENS ((uint32_t)0x00030000U) /* Bit[17:16] External event 3 sensitivity */ +#define SHRTIM_EXEVCTRL1_EXEV3SENS_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_EXEVCTRL1_EXEV3SENS_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_EXEVCTRL1_EXEV3POL ((uint32_t)0x00008000U) /* Bit[15] External event 3 polarity */ +#define SHRTIM_EXEVCTRL1_EXEV3SRC ((uint32_t)0x00007000U) /* Bit[14:12] External event 3 source */ +#define SHRTIM_EXEVCTRL1_EXEV3SRC_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_EXEVCTRL1_EXEV3SRC_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_EXEVCTRL1_EXEV3SRC_2 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_EXEVCTRL1_EXEV2SENS ((uint32_t)0x00000C00U) /* Bit[11:10] External event 2 sensitivity */ +#define SHRTIM_EXEVCTRL1_EXEV2SENS_0 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_EXEVCTRL1_EXEV2SENS_1 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_EXEVCTRL1_EXEV2POL ((uint32_t)0x00000200U) /* Bit[9] External event 2 polarity */ +#define SHRTIM_EXEVCTRL1_EXEV2SRC ((uint32_t)0x000001C0U) /* Bit[8:6] External event 2 source */ +#define SHRTIM_EXEVCTRL1_EXEV2SRC_0 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_EXEVCTRL1_EXEV2SRC_1 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_EXEVCTRL1_EXEV2SRC_2 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_EXEVCTRL1_EXEV1SENS ((uint32_t)0x00000030U) /* Bit[5:4] External event 1 sensitivity */ +#define SHRTIM_EXEVCTRL1_EXEV1SENS_0 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_EXEVCTRL1_EXEV1SENS_1 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_EXEVCTRL1_EXEV1POL ((uint32_t)0x00000008U) /* Bit[3] External event 1 polarity */ +#define SHRTIM_EXEVCTRL1_EXEV1SRC ((uint32_t)0x00000007U) /* Bit[2:0] External event 1 source */ +#define SHRTIM_EXEVCTRL1_EXEV1SRC_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_EXEVCTRL1_EXEV1SRC_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_EXEVCTRL1_EXEV1SRC_2 ((uint32_t)0x00000004U) /* Bit2 */ + +/** Bit definition for SHRTIM_EXEVCTRL2 register **/ +#define SHRTIM_EXEVCTRL2_EXEV10SENS ((uint32_t)0x30000000U) /* Bit[29:28] External event 10 sensitivity */ +#define SHRTIM_EXEVCTRL2_EXEV10SENS_0 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_EXEVCTRL2_EXEV10SENS_1 ((uint32_t)0x20000000U) /* Bit29 */ +#define SHRTIM_EXEVCTRL2_EXEV10POL ((uint32_t)0x08000000U) /* Bit[27] External event 10 polarity */ +#define SHRTIM_EXEVCTRL2_EXEV10SRC ((uint32_t)0x07000000U) /* Bit[26:24] External event 10 source */ +#define SHRTIM_EXEVCTRL2_EXEV10SRC_0 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_EXEVCTRL2_EXEV10SRC_1 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_EXEVCTRL2_EXEV10SRC_2 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_EXEVCTRL2_EXEV9SENS ((uint32_t)0x00C00000U) /* Bit[23:22] External event 9 sensitivity */ +#define SHRTIM_EXEVCTRL2_EXEV9SENS_0 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_EXEVCTRL2_EXEV9SENS_1 ((uint32_t)0x00800000U) /* Bit23 */ +#define SHRTIM_EXEVCTRL2_EXEV9POL ((uint32_t)0x00200000U) /* Bit[21] External event 9 polarity */ +#define SHRTIM_EXEVCTRL2_EXEV9SRC ((uint32_t)0x001C0000U) /* Bit[20:18] External event 9 source */ +#define SHRTIM_EXEVCTRL2_EXEV9SRC_0 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_EXEVCTRL2_EXEV9SRC_1 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_EXEVCTRL2_EXEV9SRC_2 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_EXEVCTRL2_EXEV8SENS ((uint32_t)0x00030000U) /* Bit[17:16] External event 8 sensitivity */ +#define SHRTIM_EXEVCTRL2_EXEV8SENS_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_EXEVCTRL2_EXEV8SENS_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_EXEVCTRL2_EXEV8POL ((uint32_t)0x00008000U) /* Bit[15] External event 8 polarity */ +#define SHRTIM_EXEVCTRL2_EXEV8SRC ((uint32_t)0x00007000U) /* Bit[14:12] External event 8 source */ +#define SHRTIM_EXEVCTRL2_EXEV8SRC_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_EXEVCTRL2_EXEV8SRC_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_EXEVCTRL2_EXEV8SRC_2 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_EXEVCTRL2_EXEV7SENS ((uint32_t)0x00000C00U) /* Bit[11:10] External event 7 sensitivity */ +#define SHRTIM_EXEVCTRL2_EXEV7SENS_0 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_EXEVCTRL2_EXEV7SENS_1 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_EXEVCTRL2_EXEV7POL ((uint32_t)0x00000200U) /* Bit[9] External event 7 polarity */ +#define SHRTIM_EXEVCTRL2_EXEV7SRC ((uint32_t)0x000001C0U) /* Bit[8:6] External event 7 source */ +#define SHRTIM_EXEVCTRL2_EXEV7SRC_0 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_EXEVCTRL2_EXEV7SRC_1 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_EXEVCTRL2_EXEV7SRC_2 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_EXEVCTRL2_EXEV6SENS ((uint32_t)0x00000030U) /* Bit[5:4] External event 6 sensitivity */ +#define SHRTIM_EXEVCTRL2_EXEV6SENS_0 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_EXEVCTRL2_EXEV6SENS_1 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_EXEVCTRL2_EXEV6POL ((uint32_t)0x00000008U) /* Bit[3] External event 6 polarity */ +#define SHRTIM_EXEVCTRL2_EXEV6SRC ((uint32_t)0x00000007U) /* Bit[2:0] External event 6 source */ +#define SHRTIM_EXEVCTRL2_EXEV6SRC_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_EXEVCTRL2_EXEV6SRC_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_EXEVCTRL2_EXEV6SRC_2 ((uint32_t)0x00000004U) /* Bit2 */ + +/** Bit definition for SHRTIM_EXEVCTRL3 register **/ +#define SHRTIM_EXEVCTRL3_EXEV5FM ((uint32_t)0x10000000U) /* Bit[28] External event 5 fast mode */ +#define SHRTIM_EXEVCTRL3_EXEV5F ((uint32_t)0x0F000000U) /* Bit[27:24] External event 5 filter */ +#define SHRTIM_EXEVCTRL3_EXEV5F_0 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_EXEVCTRL3_EXEV5F_1 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_EXEVCTRL3_EXEV5F_2 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_EXEVCTRL3_EXEV5F_3 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_EXEVCTRL3_EXEV4FM ((uint32_t)0x00400000U) /* Bit[22] External event 4 fast mode */ +#define SHRTIM_EXEVCTRL3_EXEV4F ((uint32_t)0x003C0000U) /* Bit[21:18] External event 4 filter */ +#define SHRTIM_EXEVCTRL3_EXEV4F_0 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_EXEVCTRL3_EXEV4F_1 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_EXEVCTRL3_EXEV4F_2 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_EXEVCTRL3_EXEV4F_3 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_EXEVCTRL3_EXEV3FM ((uint32_t)0x00010000U) /* Bit[16] External event 3 fast mode */ +#define SHRTIM_EXEVCTRL3_EXEV3F ((uint32_t)0x0000F000U) /* Bit[15:12] External event 3 filter */ +#define SHRTIM_EXEVCTRL3_EXEV3F_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_EXEVCTRL3_EXEV3F_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_EXEVCTRL3_EXEV3F_2 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_EXEVCTRL3_EXEV3F_3 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_EXEVCTRL3_EXEV2FM ((uint32_t)0x00000400U) /* Bit[10] External event 2 fast mode */ +#define SHRTIM_EXEVCTRL3_EXEV2F ((uint32_t)0x000003C0U) /* Bit[9:6] External event 2 filter */ +#define SHRTIM_EXEVCTRL3_EXEV2F_0 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_EXEVCTRL3_EXEV2F_1 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_EXEVCTRL3_EXEV2F_2 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_EXEVCTRL3_EXEV2F_3 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_EXEVCTRL3_EXEV1FM ((uint32_t)0x00000010U) /* Bit[4] External event 1 fast mode */ +#define SHRTIM_EXEVCTRL3_EXEV1F ((uint32_t)0x0000000FU) /* Bit[3:0] External event 1 filter */ +#define SHRTIM_EXEVCTRL3_EXEV1F_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_EXEVCTRL3_EXEV1F_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_EXEVCTRL3_EXEV1F_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_EXEVCTRL3_EXEV1F_3 ((uint32_t)0x00000008U) /* Bit3 */ + +/** Bit definition for SHRTIM_EXEVCTRL4 register **/ +#define SHRTIM_EXEVCTRL4_EXEVSCD ((uint32_t)0xC0000000U) /* Bit[31:30] External event sampling clock division */ +#define SHRTIM_EXEVCTRL4_EXEVSCD_0 ((uint32_t)0x40000000U) /* Bit30 */ +#define SHRTIM_EXEVCTRL4_EXEVSCD_1 ((uint32_t)0x80000000U) /* Bit31 */ +#define SHRTIM_EXEVCTRL4_EXEV10FM ((uint32_t)0x10000000U) /* Bit[28] External event10 fast mode */ +#define SHRTIM_EXEVCTRL4_EXEV10F ((uint32_t)0x0F000000U) /* Bit[27:24] External event 10 filter */ +#define SHRTIM_EXEVCTRL4_EXEV10F_0 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_EXEVCTRL4_EXEV10F_1 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_EXEVCTRL4_EXEV10F_2 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_EXEVCTRL4_EXEV10F_3 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_EXEVCTRL4_EXEV9FM ((uint32_t)0x00400000U) /* Bit[22] External event9 fast mode */ +#define SHRTIM_EXEVCTRL4_EXEV9F ((uint32_t)0x003C0000U) /* Bit[21:18] External event 9 filter */ +#define SHRTIM_EXEVCTRL4_EXEV9F_0 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_EXEVCTRL4_EXEV9F_1 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_EXEVCTRL4_EXEV9F_2 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_EXEVCTRL4_EXEV9F_3 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_EXEVCTRL4_EXEV8FM ((uint32_t)0x00010000U) /* Bit[16] External event 8 fast mode */ +#define SHRTIM_EXEVCTRL4_EXEV8F ((uint32_t)0x0000F000U) /* Bit[15:12] External event 8 filter */ +#define SHRTIM_EXEVCTRL4_EXEV8F_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_EXEVCTRL4_EXEV8F_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_EXEVCTRL4_EXEV8F_2 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_EXEVCTRL4_EXEV8F_3 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_EXEVCTRL4_EXEV7FM ((uint32_t)0x00000400U) /* Bit[10] External event7 fast mode */ +#define SHRTIM_EXEVCTRL4_EXEV7F ((uint32_t)0x000003C0U) /* Bit[9:6] External event 7 filter */ +#define SHRTIM_EXEVCTRL4_EXEV7F_0 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_EXEVCTRL4_EXEV7F_1 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_EXEVCTRL4_EXEV7F_2 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_EXEVCTRL4_EXEV7F_3 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_EXEVCTRL4_EXEV6FM ((uint32_t)0x00000010U) /* Bit[4] External event6 fast mode */ +#define SHRTIM_EXEVCTRL4_EXEV6F ((uint32_t)0x0000000FU) /* Bit[3:0] External event 6 filter */ +#define SHRTIM_EXEVCTRL4_EXEV6F_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_EXEVCTRL4_EXEV6F_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_EXEVCTRL4_EXEV6F_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_EXEVCTRL4_EXEV6F_3 ((uint32_t)0x00000008U) /* Bit3 */ + +/** Bit definition for SHRTIM_ADTG1SRC1 register **/ +#define SHRTIM_ADTG1SRC1_ADTG1TCPRD ((uint32_t)0x04000000U) /* Bit[26] ADC trigger 1 driven by timer C period event */ +#define SHRTIM_ADTG1SRC1_ADTG1TCCMP5 ((uint32_t)0x02000000U) /* Bit[25] ADC trigger 1 driven by timer C compare 5 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TCCMP4 ((uint32_t)0x01000000U) /* Bit[24] ADC trigger 1 driven by timer C compare 4 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TCCMP3 ((uint32_t)0x00800000U) /* Bit[23] ADC trigger 1 driven by timer C compare 3 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TCCMP2 ((uint32_t)0x00400000U) /* Bit[22] ADC trigger 1 driven by timer C compare 2 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TCCMP1 ((uint32_t)0x00200000U) /* Bit[21] ADC trigger 1 driven by timer C compare 1 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TBRSTRO ((uint32_t)0x00100000U) /* Bit[20] ADC trigger 1 driven by timer B reset and roll-over events */ +#define SHRTIM_ADTG1SRC1_ADTG1TBPRD ((uint32_t)0x00080000U) /* Bit[19] ADC trigger 1 driven by timer B period event */ +#define SHRTIM_ADTG1SRC1_ADTG1TBCMP5 ((uint32_t)0x00040000U) /* Bit[18] ADC trigger 1 driven by timer B compare 5 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TBCMP4 ((uint32_t)0x00020000U) /* Bit[17] ADC trigger 1 driven by timer B compare 4 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TBCMP3 ((uint32_t)0x00010000U) /* Bit[16] ADC trigger 1 driven by timer B compare 3 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TBCMP2 ((uint32_t)0x00008000U) /* Bit[15] ADC trigger 1 driven by timer B compare 2 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TBCMP1 ((uint32_t)0x00004000U) /* Bit[14] ADC trigger 1 driven by timer B compare 1 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TARSTRO ((uint32_t)0x00002000U) /* Bit[13] ADC trigger 1 driven by timer A reset and roll-over events */ +#define SHRTIM_ADTG1SRC1_ADTG1TAPRD ((uint32_t)0x00001000U) /* Bit[12] ADC trigger 1 driven by timer A period event */ +#define SHRTIM_ADTG1SRC1_ADTG1TACMP5 ((uint32_t)0x00000800U) /* Bit[11] ADC trigger 1 driven by timer A compare 5 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TACMP4 ((uint32_t)0x00000400U) /* Bit[10] ADC trigger 1 driven by timer A compare 4 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TACMP3 ((uint32_t)0x00000200U) /* Bit[9] ADC trigger 1 driven by timer A compare 3 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TACMP2 ((uint32_t)0x00000100U) /* Bit[8] ADC trigger 1 driven by timer A compare 2 event */ +#define SHRTIM_ADTG1SRC1_ADTG1TACMP1 ((uint32_t)0x00000080U) /* Bit[7] ADC trigger 1 driven by timer A compare 1 event */ +#define SHRTIM_ADTG1SRC1_ADTG1MPRD ((uint32_t)0x00000020U) /* Bit[5] ADC trigger 1 driven by master period event */ +#define SHRTIM_ADTG1SRC1_ADTG1MCMP4 ((uint32_t)0x00000008U) /* Bit[3] ADC trigger 1 driven by master compare 4 event */ +#define SHRTIM_ADTG1SRC1_ADTG1MCMP3 ((uint32_t)0x00000004U) /* Bit[2] ADC trigger 1 driven by master compare 3 event */ +#define SHRTIM_ADTG1SRC1_ADTG1MCMP2 ((uint32_t)0x00000002U) /* Bit[1] ADC trigger 1 driven by master compare 2 event */ +#define SHRTIM_ADTG1SRC1_ADTG1MCMP1 ((uint32_t)0x00000001U) /* Bit[0] ADC trigger 1 driven by master compare 1 event */ + +/** Bit definition for SHRTIM_ADTG1SRC2 register **/ +#define SHRTIM_ADTG1SRC2_ADTG1EXEV5 ((uint32_t)0x02000000U) /* Bit[25] ADC trigger 1 driven by external event 5 */ +#define SHRTIM_ADTG1SRC2_ADTG1EXEV4 ((uint32_t)0x01000000U) /* Bit[24] ADC trigger 1 driven by external event 4 */ +#define SHRTIM_ADTG1SRC2_ADTG1EXEV3 ((uint32_t)0x00800000U) /* Bit[23] ADC trigger 1 driven by external event 3 */ +#define SHRTIM_ADTG1SRC2_ADTG1EXEV2 ((uint32_t)0x00400000U) /* Bit[22] ADC trigger 1 driven by external event 2 */ +#define SHRTIM_ADTG1SRC2_ADTG1EXEV1 ((uint32_t)0x00200000U) /* Bit[21] ADC trigger 1 driven by external event 1 */ +#define SHRTIM_ADTG1SRC2_ADTG1TFRSTRO ((uint32_t)0x00100000U) /* Bit[20] ADC trigger 1 driven by timer F reset and roll-over events */ +#define SHRTIM_ADTG1SRC2_ADTG1TFPRD ((uint32_t)0x00080000U) /* Bit[19] ADC trigger 1 driven by timer F period event */ +#define SHRTIM_ADTG1SRC2_ADTG1TFCMP5 ((uint32_t)0x00040000U) /* Bit[18] ADC trigger 1 driven by timer F compare 5 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TFCMP4 ((uint32_t)0x00020000U) /* Bit[17] ADC trigger 1 driven by timer F compare 4 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TFCMP3 ((uint32_t)0x00010000U) /* Bit[16] ADC trigger 1 driven by timer F compare 3 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TFCMP2 ((uint32_t)0x00008000U) /* Bit[15] ADC trigger 1 driven by timer F compare 2 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TFCMP1 ((uint32_t)0x00004000U) /* Bit[14] ADC trigger 1 driven by timer F compare 1 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TEPRD ((uint32_t)0x00001000U) /* Bit[12] ADC trigger 1 driven by timer E period event */ +#define SHRTIM_ADTG1SRC2_ADTG1TECMP5 ((uint32_t)0x00000800U) /* Bit[11] ADC trigger 1 driven by timer E compare 5 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TECMP4 ((uint32_t)0x00000400U) /* Bit[10] ADC trigger 1 driven by timer E compare 4 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TECMP3 ((uint32_t)0x00000200U) /* Bit[9] ADC trigger 1 driven by timer E compare 3 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TECMP2 ((uint32_t)0x00000100U) /* Bit[8] ADC trigger 1 driven by timer E compare 2 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TECMP1 ((uint32_t)0x00000080U) /* Bit[7] ADC trigger 1 driven by timer E compare 1 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TDPRD ((uint32_t)0x00000020U) /* Bit[5] ADC trigger 1 driven by timer D period event */ +#define SHRTIM_ADTG1SRC2_ADTG1TDCMP5 ((uint32_t)0x00000010U) /* Bit[4] ADC trigger 1 driven by timer D compare 5 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TDCMP4 ((uint32_t)0x00000008U) /* Bit[3] ADC trigger 1 driven by timer D compare 4 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TDCMP3 ((uint32_t)0x00000004U) /* Bit[2] ADC trigger 1 driven by timer D compare 3 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TDCMP2 ((uint32_t)0x00000002U) /* Bit[1] ADC trigger 1 driven by timer D compare 2 event */ +#define SHRTIM_ADTG1SRC2_ADTG1TDCMP1 ((uint32_t)0x00000001U) /* Bit[0] ADC trigger 1 driven by timer D compare 1 event */ + +/** Bit definition for SHRTIM_ADTG2SRC1 register **/ +#define SHRTIM_ADTG2SRC1_ADTG2TCRSTRO ((uint32_t)0x08000000U) /* Bit[27] ADC trigger 2 driven by timer C reset and roll-over events */ +#define SHRTIM_ADTG2SRC1_ADTG2TCPRD ((uint32_t)0x04000000U) /* Bit[26] ADC trigger 2 driven by timer C period event */ +#define SHRTIM_ADTG2SRC1_ADTG2TCCMP5 ((uint32_t)0x02000000U) /* Bit[25] ADC trigger 2 driven by timer C compare 5 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TCCMP4 ((uint32_t)0x01000000U) /* Bit[24] ADC trigger 2 driven by timer C compare 4 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TCCMP3 ((uint32_t)0x00800000U) /* Bit[23] ADC trigger 2 driven by timer C compare 3 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TCCMP2 ((uint32_t)0x00400000U) /* Bit[22] ADC trigger 2 driven by timer C compare 2 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TCCMP1 ((uint32_t)0x00200000U) /* Bit[21] ADC trigger 2 driven by timer C compare 1 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TBPRD ((uint32_t)0x00080000U) /* Bit[19] ADC trigger 2 driven by timer B period event */ +#define SHRTIM_ADTG2SRC1_ADTG2TBCMP5 ((uint32_t)0x00040000U) /* Bit[18] ADC trigger 2 driven by timer B compare 5 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TBCMP4 ((uint32_t)0x00020000U) /* Bit[17] ADC trigger 2 driven by timer B compare 4 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TBCMP3 ((uint32_t)0x00010000U) /* Bit[16] ADC trigger 2 driven by timer B compare 3 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TBCMP2 ((uint32_t)0x00008000U) /* Bit[15] ADC trigger 2 driven by timer B compare 2 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TBCMP1 ((uint32_t)0x00004000U) /* Bit[14] ADC trigger 2 driven by timer B compare 1 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TAPRD ((uint32_t)0x00001000U) /* Bit[12] ADC trigger 2 driven by timer A period event */ +#define SHRTIM_ADTG2SRC1_ADTG2TACMP5 ((uint32_t)0x00000800U) /* Bit[11] ADC trigger 2 driven by timer A compare 5 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TACMP4 ((uint32_t)0x00000400U) /* Bit[10] ADC trigger 2 driven by timer A compare 4 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TACMP3 ((uint32_t)0x00000200U) /* Bit[9] ADC trigger 2 driven by timer A compare 3 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TACMP2 ((uint32_t)0x00000100U) /* Bit[8] ADC trigger 2 driven by timer A compare 2 event */ +#define SHRTIM_ADTG2SRC1_ADTG2TACMP1 ((uint32_t)0x00000080U) /* Bit[7] ADC trigger 2 driven by timer A compare 1 event */ +#define SHRTIM_ADTG2SRC1_ADTG2MPRD ((uint32_t)0x00000020U) /* Bit[5] ADC trigger 2 driven by master period event */ +#define SHRTIM_ADTG2SRC1_ADTG2MCMP4 ((uint32_t)0x00000008U) /* Bit[3] ADC trigger 2 driven by master compare 4 event */ +#define SHRTIM_ADTG2SRC1_ADTG2MCMP3 ((uint32_t)0x00000004U) /* Bit[2] ADC trigger 2 driven by master compare 3 event */ +#define SHRTIM_ADTG2SRC1_ADTG2MCMP2 ((uint32_t)0x00000002U) /* Bit[1] ADC trigger 2 driven by master compare 2 event */ +#define SHRTIM_ADTG2SRC1_ADTG2MCMP1 ((uint32_t)0x00000001U) /* Bit[0] ADC trigger 2 driven by master compare 1 event */ + +/** Bit definition for SHRTIM_ADTG2SRC2 register **/ +#define SHRTIM_ADTG2SRC2_ADTG2EXEV10 ((uint32_t)0x02000000U) /* Bit[25] ADC trigger 2 driven by external event 10 */ +#define SHRTIM_ADTG2SRC2_ADTG2EXEV9 ((uint32_t)0x01000000U) /* Bit[24] ADC trigger 2 driven by external event 9 */ +#define SHRTIM_ADTG2SRC2_ADTG2EXEV8 ((uint32_t)0x00800000U) /* Bit[23] ADC trigger 2 driven by external event 8 */ +#define SHRTIM_ADTG2SRC2_ADTG2EXEV7 ((uint32_t)0x00400000U) /* Bit[22] ADC trigger 2 driven by external event 7 */ +#define SHRTIM_ADTG2SRC2_ADTG2EXEV6 ((uint32_t)0x00200000U) /* Bit[21] ADC trigger 2 driven by external event 6 */ +#define SHRTIM_ADTG2SRC2_ADTG2TFPRD ((uint32_t)0x00080000U) /* Bit[19] ADC trigger 2 driven by timer F period event */ +#define SHRTIM_ADTG2SRC2_ADTG2TFCMP5 ((uint32_t)0x00040000U) /* Bit[18] ADC trigger 2 driven by timer F compare 5 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TFCMP4 ((uint32_t)0x00020000U) /* Bit[17] ADC trigger 2 driven by timer F compare 4 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TFCMP3 ((uint32_t)0x00010000U) /* Bit[16] ADC trigger 2 driven by timer F compare 3 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TFCMP2 ((uint32_t)0x00008000U) /* Bit[15] ADC trigger 2 driven by timer F compare 2 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TFCMP1 ((uint32_t)0x00004000U) /* Bit[14] ADC trigger 2 driven by timer F compare 1 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TERSTRO ((uint32_t)0x00002000U) /* Bit[13] ADC trigger 2 driven by timer E reset and roll-over events */ +#define SHRTIM_ADTG2SRC2_ADTG2TECMP5 ((uint32_t)0x00000800U) /* Bit[11] ADC trigger 2 driven by timer E compare 5 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TECMP4 ((uint32_t)0x00000400U) /* Bit[10] ADC trigger 2 driven by timer E compare 4 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TECMP3 ((uint32_t)0x00000200U) /* Bit[9] ADC trigger 2 driven by timer E compare 3 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TECMP2 ((uint32_t)0x00000100U) /* Bit[8] ADC trigger 2 driven by timer E compare 2 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TECMP1 ((uint32_t)0x00000080U) /* Bit[7] ADC trigger 2 driven by timer E compare 1 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TDRSTRO ((uint32_t)0x00000040U) /* Bit[6] ADC trigger 2 driven by timer D reset and roll-over events */ +#define SHRTIM_ADTG2SRC2_ADTG2TDPRD ((uint32_t)0x00000020U) /* Bit[5] ADC trigger 2 driven by timer D period event */ +#define SHRTIM_ADTG2SRC2_ADTG2TDCMP5 ((uint32_t)0x00000010U) /* Bit[4] ADC trigger 2 driven by timer D compare 5 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TDCMP4 ((uint32_t)0x00000008U) /* Bit[3] ADC trigger 2 driven by timer D compare 4 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TDCMP3 ((uint32_t)0x00000004U) /* Bit[2] ADC trigger 2 driven by timer D compare 3 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TDCMP2 ((uint32_t)0x00000002U) /* Bit[1] ADC trigger 2 driven by timer D compare 2 event */ +#define SHRTIM_ADTG2SRC2_ADTG2TDCMP1 ((uint32_t)0x00000001U) /* Bit[0] ADC trigger 2 driven by timer D compare 1 event */ + +/** Bit definition for SHRTIM_ADTG3SRC1 register **/ +#define SHRTIM_ADTG3SRC1_ADTG3TCPRD ((uint32_t)0x04000000U) /* Bit[26] ADC trigger 3 driven by timer C period event */ +#define SHRTIM_ADTG3SRC1_ADTG3TCCMP5 ((uint32_t)0x02000000U) /* Bit[25] ADC trigger 3 driven by timer C compare 5 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TCCMP4 ((uint32_t)0x01000000U) /* Bit[24] ADC trigger 3 driven by timer C compare 4 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TCCMP3 ((uint32_t)0x00800000U) /* Bit[23] ADC trigger 3 driven by timer C compare 3 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TCCMP2 ((uint32_t)0x00400000U) /* Bit[22] ADC trigger 3 driven by timer C compare 2 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TCCMP1 ((uint32_t)0x00200000U) /* Bit[21] ADC trigger 3 driven by timer C compare 1 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TBRSTRO ((uint32_t)0x00100000U) /* Bit[20] ADC trigger 3 driven by timer B reset and roll-over events */ +#define SHRTIM_ADTG3SRC1_ADTG3TBPRD ((uint32_t)0x00080000U) /* Bit[19] ADC trigger 3 driven by timer B period event */ +#define SHRTIM_ADTG3SRC1_ADTG3TBCMP5 ((uint32_t)0x00040000U) /* Bit[18] ADC trigger 3 driven by timer B compare 5 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TBCMP4 ((uint32_t)0x00020000U) /* Bit[17] ADC trigger 3 driven by timer B compare 4 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TBCMP3 ((uint32_t)0x00010000U) /* Bit[16] ADC trigger 3 driven by timer B compare 3 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TBCMP2 ((uint32_t)0x00008000U) /* Bit[15] ADC trigger 3 driven by timer B compare 2 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TBCMP1 ((uint32_t)0x00004000U) /* Bit[14] ADC trigger 3 driven by timer B compare 1 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TARSTRO ((uint32_t)0x00002000U) /* Bit[13] ADC trigger 3 driven by timer A reset and roll-over events */ +#define SHRTIM_ADTG3SRC1_ADTG3TAPRD ((uint32_t)0x00001000U) /* Bit[12] ADC trigger 3 driven by timer A period event */ +#define SHRTIM_ADTG3SRC1_ADTG3TACMP5 ((uint32_t)0x00000800U) /* Bit[11] ADC trigger 3 driven by timer A compare 5 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TACMP4 ((uint32_t)0x00000400U) /* Bit[10] ADC trigger 3 driven by timer A compare 4 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TACMP3 ((uint32_t)0x00000200U) /* Bit[9] ADC trigger 3 driven by timer A compare 3 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TACMP2 ((uint32_t)0x00000100U) /* Bit[8] ADC trigger 3 driven by timer A compare 2 event */ +#define SHRTIM_ADTG3SRC1_ADTG3TACMP1 ((uint32_t)0x00000080U) /* Bit[7] ADC trigger 3 driven by timer A compare 1 event */ +#define SHRTIM_ADTG3SRC1_ADTG3MPRD ((uint32_t)0x00000020U) /* Bit[5] ADC trigger 3 driven by master period event */ +#define SHRTIM_ADTG3SRC1_ADTG3MCMP4 ((uint32_t)0x00000008U) /* Bit[3] ADC trigger 3 driven by master compare 4 event */ +#define SHRTIM_ADTG3SRC1_ADTG3MCMP3 ((uint32_t)0x00000004U) /* Bit[2] ADC trigger 3 driven by master compare 3 event */ +#define SHRTIM_ADTG3SRC1_ADTG3MCMP2 ((uint32_t)0x00000002U) /* Bit[1] ADC trigger 3 driven by master compare 2 event */ +#define SHRTIM_ADTG3SRC1_ADTG3MCMP1 ((uint32_t)0x00000001U) /* Bit[0] ADC trigger 3 driven by master compare 1 event */ + +/** Bit definition for SHRTIM_ADTG3SRC2 register **/ +#define SHRTIM_ADTG3SRC2_ADTG3EXEV5 ((uint32_t)0x02000000U) /* Bit[25] ADC trigger 3 driven by external event 5 */ +#define SHRTIM_ADTG3SRC2_ADTG3EXEV4 ((uint32_t)0x01000000U) /* Bit[24] ADC trigger 3 driven by external event 4 */ +#define SHRTIM_ADTG3SRC2_ADTG3EXEV3 ((uint32_t)0x00800000U) /* Bit[23] ADC trigger 3 driven by external event 3 */ +#define SHRTIM_ADTG3SRC2_ADTG3EXEV2 ((uint32_t)0x00400000U) /* Bit[22] ADC trigger 3 driven by external event 2 */ +#define SHRTIM_ADTG3SRC2_ADTG3EXEV1 ((uint32_t)0x00200000U) /* Bit[21] ADC trigger 3 driven by external event 1 */ +#define SHRTIM_ADTG3SRC2_ADTG3TFRSTRO ((uint32_t)0x00100000U) /* Bit[20] ADC trigger 3 driven by timer F reset and roll-over events */ +#define SHRTIM_ADTG3SRC2_ADTG3TFPRD ((uint32_t)0x00080000U) /* Bit[19] ADC trigger 3 driven by timer F period event */ +#define SHRTIM_ADTG3SRC2_ADTG3TFCMP5 ((uint32_t)0x00040000U) /* Bit[18] ADC trigger 3 driven by timer F compare 5 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TFCMP4 ((uint32_t)0x00020000U) /* Bit[17] ADC trigger 3 driven by timer F compare 4 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TFCMP3 ((uint32_t)0x00010000U) /* Bit[16] ADC trigger 3 driven by timer F compare 3 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TFCMP2 ((uint32_t)0x00008000U) /* Bit[15] ADC trigger 3 driven by timer F compare 2 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TFCMP1 ((uint32_t)0x00004000U) /* Bit[14] ADC trigger 3 driven by timer F compare 1 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TEPRD ((uint32_t)0x00001000U) /* Bit[12] ADC trigger 3 driven by timer E period event */ +#define SHRTIM_ADTG3SRC2_ADTG3TECMP5 ((uint32_t)0x00000800U) /* Bit[11] ADC trigger 3 driven by timer E compare 5 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TECMP4 ((uint32_t)0x00000400U) /* Bit[10] ADC trigger 3 driven by timer E compare 4 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TECMP3 ((uint32_t)0x00000200U) /* Bit[9] ADC trigger 3 driven by timer E compare 3 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TECMP2 ((uint32_t)0x00000100U) /* Bit[8] ADC trigger 3 driven by timer E compare 2 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TECMP1 ((uint32_t)0x00000080U) /* Bit[7] ADC trigger 3 driven by timer E compare 1 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TDPRD ((uint32_t)0x00000020U) /* Bit[5] ADC trigger 3 driven by timer D period event */ +#define SHRTIM_ADTG3SRC2_ADTG3TDCMP5 ((uint32_t)0x00000010U) /* Bit[4] ADC trigger 3 driven by timer D compare 5 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TDCMP4 ((uint32_t)0x00000008U) /* Bit[3] ADC trigger 3 driven by timer D compare 4 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TDCMP3 ((uint32_t)0x00000004U) /* Bit[2] ADC trigger 3 driven by timer D compare 3 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TDCMP2 ((uint32_t)0x00000002U) /* Bit[1] ADC trigger 3 driven by timer D compare 2 event */ +#define SHRTIM_ADTG3SRC2_ADTG3TDCMP1 ((uint32_t)0x00000001U) /* Bit[0] ADC trigger 3 driven by timer D compare 1 event */ + +/** Bit definition for SHRTIM_ADTG4SRC1 register **/ +#define SHRTIM_ADTG4SRC1_ADTG4TCRSTRO ((uint32_t)0x08000000U) /* Bit[27] ADC trigger 4 driven by timer C reset and roll-over events */ +#define SHRTIM_ADTG4SRC1_ADTG4TCPRD ((uint32_t)0x04000000U) /* Bit[26] ADC trigger 4 driven by timer C period event */ +#define SHRTIM_ADTG4SRC1_ADTG4TCCMP5 ((uint32_t)0x02000000U) /* Bit[25] ADC trigger 4 driven by timer C compare 5 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TCCMP4 ((uint32_t)0x01000000U) /* Bit[24] ADC trigger 4 driven by timer C compare 4 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TCCMP3 ((uint32_t)0x00800000U) /* Bit[23] ADC trigger 4 driven by timer C compare 3 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TCCMP2 ((uint32_t)0x00400000U) /* Bit[22] ADC trigger 4 driven by timer C compare 2 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TCCMP1 ((uint32_t)0x00200000U) /* Bit[21] ADC trigger 4 driven by timer C compare 1 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TBPRD ((uint32_t)0x00080000U) /* Bit[19] ADC trigger 4 driven by timer B period event */ +#define SHRTIM_ADTG4SRC1_ADTG4TBCMP5 ((uint32_t)0x00040000U) /* Bit[18] ADC trigger 4 driven by timer B compare 5 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TBCMP4 ((uint32_t)0x00020000U) /* Bit[17] ADC trigger 4 driven by timer B compare 4 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TBCMP3 ((uint32_t)0x00010000U) /* Bit[16] ADC trigger 4 driven by timer B compare 3 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TBCMP2 ((uint32_t)0x00008000U) /* Bit[15] ADC trigger 4 driven by timer B compare 2 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TBCMP1 ((uint32_t)0x00004000U) /* Bit[14] ADC trigger 4 driven by timer B compare 1 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TAPRD ((uint32_t)0x00001000U) /* Bit[12] ADC trigger 4 driven by timer A period event */ +#define SHRTIM_ADTG4SRC1_ADTG4TACMP5 ((uint32_t)0x00000800U) /* Bit[11] ADC trigger 4 driven by timer A compare 5 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TACMP4 ((uint32_t)0x00000400U) /* Bit[10] ADC trigger 4 driven by timer A compare 4 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TACMP3 ((uint32_t)0x00000200U) /* Bit[9] ADC trigger 4 driven by timer A compare 3 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TACMP2 ((uint32_t)0x00000100U) /* Bit[8] ADC trigger 4 driven by timer A compare 2 event */ +#define SHRTIM_ADTG4SRC1_ADTG4TACMP1 ((uint32_t)0x00000080U) /* Bit[7] ADC trigger 4 driven by timer A compare 1 event */ +#define SHRTIM_ADTG4SRC1_ADTG4MPRD ((uint32_t)0x00000020U) /* Bit[5] ADC trigger 4 driven by master period event */ +#define SHRTIM_ADTG4SRC1_ADTG4MCMP4 ((uint32_t)0x00000008U) /* Bit[3] ADC trigger 4 driven by master compare 4 event */ +#define SHRTIM_ADTG4SRC1_ADTG4MCMP3 ((uint32_t)0x00000004U) /* Bit[2] ADC trigger 4 driven by master compare 3 event */ +#define SHRTIM_ADTG4SRC1_ADTG4MCMP2 ((uint32_t)0x00000002U) /* Bit[1] ADC trigger 4 driven by master compare 2 event */ +#define SHRTIM_ADTG4SRC1_ADTG4MCMP1 ((uint32_t)0x00000001U) /* Bit[0] ADC trigger 4 driven by master compare 1 event */ + +/** Bit definition for SHRTIM_ADTG4SRC2 register **/ +#define SHRTIM_ADTG4SRC2_ADTG4EXEV10 ((uint32_t)0x02000000U) /* Bit[25] ADC trigger 4 driven by external event 10 */ +#define SHRTIM_ADTG4SRC2_ADTG4EXEV9 ((uint32_t)0x01000000U) /* Bit[24] ADC trigger 4 driven by external event 9 */ +#define SHRTIM_ADTG4SRC2_ADTG4EXEV8 ((uint32_t)0x00800000U) /* Bit[23] ADC trigger 4 driven by external event 8 */ +#define SHRTIM_ADTG4SRC2_ADTG4EXEV7 ((uint32_t)0x00400000U) /* Bit[22] ADC trigger 4 driven by external event 7 */ +#define SHRTIM_ADTG4SRC2_ADTG4EXEV6 ((uint32_t)0x00200000U) /* Bit[21] ADC trigger 4 driven by external event 6 */ +#define SHRTIM_ADTG4SRC2_ADTG4TFPRD ((uint32_t)0x00080000U) /* Bit[19] ADC trigger 4 driven by timer F period event */ +#define SHRTIM_ADTG4SRC2_ADTG4TFCMP5 ((uint32_t)0x00040000U) /* Bit[18] ADC trigger 4 driven by timer F compare 5 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TFCMP4 ((uint32_t)0x00020000U) /* Bit[17] ADC trigger 4 driven by timer F compare 4 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TFCMP3 ((uint32_t)0x00010000U) /* Bit[16] ADC trigger 4 driven by timer F compare 3 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TFCMP2 ((uint32_t)0x00008000U) /* Bit[15] ADC trigger 4 driven by timer F compare 2 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TFCMP1 ((uint32_t)0x00004000U) /* Bit[14] ADC trigger 4 driven by timer F compare 1 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TERSTRO ((uint32_t)0x00002000U) /* Bit[13] ADC trigger 4 driven by timer E reset and roll-over events */ +#define SHRTIM_ADTG4SRC2_ADTG4TECMP5 ((uint32_t)0x00000800U) /* Bit[11] ADC trigger 4 driven by timer E compare 5 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TECMP4 ((uint32_t)0x00000400U) /* Bit[10] ADC trigger 4 driven by timer E compare 4 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TECMP3 ((uint32_t)0x00000200U) /* Bit[9] ADC trigger 4 driven by timer E compare 3 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TECMP2 ((uint32_t)0x00000100U) /* Bit[8] ADC trigger 4 driven by timer E compare 2 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TECMP1 ((uint32_t)0x00000080U) /* Bit[7] ADC trigger 4 driven by timer E compare 1 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TDRSTRO ((uint32_t)0x00000040U) /* Bit[6] ADC trigger 4 driven by timer D reset and roll-over events */ +#define SHRTIM_ADTG4SRC2_ADTG4TDPRD ((uint32_t)0x00000020U) /* Bit[5] ADC trigger 4 driven by timer D period event */ +#define SHRTIM_ADTG4SRC2_ADTG4TDCMP5 ((uint32_t)0x00000010U) /* Bit[4] ADC trigger 4 driven by timer D compare 5 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TDCMP4 ((uint32_t)0x00000008U) /* Bit[3] ADC trigger 4 driven by timer D compare 4 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TDCMP3 ((uint32_t)0x00000004U) /* Bit[2] ADC trigger 4 driven by timer D compare 3 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TDCMP2 ((uint32_t)0x00000002U) /* Bit[1] ADC trigger 4 driven by timer D compare 2 event */ +#define SHRTIM_ADTG4SRC2_ADTG4TDCMP1 ((uint32_t)0x00000001U) /* Bit[0] ADC trigger 4 driven by timer D compare 1 event */ + +/** Bit definition for SHRTIM_FALTIN1 register **/ +#define SHRTIM_FALTIN1_FALT4LCK ((uint32_t)0x80000000U) /* Bit[31] Fault 4 lock */ +#define SHRTIM_FALTIN1_FALT4FLT ((uint32_t)0x78000000U) /* Bit[30:27] Fault 4 filter */ +#define SHRTIM_FALTIN1_FALT4FLT_0 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_FALTIN1_FALT4FLT_1 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_FALTIN1_FALT4FLT_2 ((uint32_t)0x20000000U) /* Bit29 */ +#define SHRTIM_FALTIN1_FALT4FLT_3 ((uint32_t)0x40000000U) /* Bit30 */ +#define SHRTIM_FALTIN1_FALT4SRC0 ((uint32_t)0x04000000U) /* Bit[26] Fault 4 source bit 0 */ +#define SHRTIM_FALTIN1_FALT4POL ((uint32_t)0x02000000U) /* Bit[25] Fault 4 polarity */ +#define SHRTIM_FALTIN1_FALT4E ((uint32_t)0x01000000U) /* Bit[24] Fault 4 enable */ +#define SHRTIM_FALTIN1_FALT3LCK ((uint32_t)0x00800000U) /* Bit[23] Fault 3 lock */ +#define SHRTIM_FALTIN1_FALT3FLT ((uint32_t)0x00780000U) /* Bit[22:19] Fault 3 filter */ +#define SHRTIM_FALTIN1_FALT3FLT_0 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_FALTIN1_FALT3FLT_1 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_FALTIN1_FALT3FLT_2 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_FALTIN1_FALT3FLT_3 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_FALTIN1_FALT3SRC0 ((uint32_t)0x00040000U) /* Bit[18] Fault 3 source bit 0 */ +#define SHRTIM_FALTIN1_FALT3POL ((uint32_t)0x00020000U) /* Bit[17] Fault 3 polarity */ +#define SHRTIM_FALTIN1_FALT3E ((uint32_t)0x00010000U) /* Bit[16] Fault 3 enable */ +#define SHRTIM_FALTIN1_FALT2LCK ((uint32_t)0x00008000U) /* Bit[15] Fault 2 lock */ +#define SHRTIM_FALTIN1_FALT2FLT ((uint32_t)0x00007800U) /* Bit[14:11] Fault 2 filter */ +#define SHRTIM_FALTIN1_FALT2FLT_0 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_FALTIN1_FALT2FLT_1 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_FALTIN1_FALT2FLT_2 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_FALTIN1_FALT2FLT_3 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_FALTIN1_FALT2SRC0 ((uint32_t)0x00000400U) /* Bit[10] Fault 2 source bit 0 */ +#define SHRTIM_FALTIN1_FALT2POL ((uint32_t)0x00000200U) /* Bit[9] Fault 2 polarity */ +#define SHRTIM_FALTIN1_FALT2E ((uint32_t)0x00000100U) /* Bit[8] Fault 2 enable */ +#define SHRTIM_FALTIN1_FALT1LCK ((uint32_t)0x00000080U) /* Bit[7] Fault 1 lock */ +#define SHRTIM_FALTIN1_FALT1FLT ((uint32_t)0x00000078U) /* Bit[6:3] Fault 1 filter */ +#define SHRTIM_FALTIN1_FALT1FLT_0 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_FALTIN1_FALT1FLT_1 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_FALTIN1_FALT1FLT_2 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_FALTIN1_FALT1FLT_3 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_FALTIN1_FALT1SRC0 ((uint32_t)0x00000004U) /* Bit[2] Fault 1 source bit 0 */ +#define SHRTIM_FALTIN1_FALT1POL ((uint32_t)0x00000002U) /* Bit[1] Fault 1 polarity */ +#define SHRTIM_FALTIN1_FALT1E ((uint32_t)0x00000001U) /* Bit[0] Fault 1 enable */ + +/** Bit definition for SHRTIM_FALTIN2 register **/ +#define SHRTIM_FALTIN2_SFALTSPLLEN ((uint32_t)0x80000000U) /* Bit[31] The SHRPLL lock fault as SHRTIM system fault input enable */ +#define SHRTIM_FALTIN2_SFALTPVDEN ((uint32_t)0x40000000U) /* Bit[30] The PVD error as SHRTIM system fault input enable */ +#define SHRTIM_FALTIN2_SFALTLOCKUPEN ((uint32_t)0x20000000U) /* Bit[29] The core lockup as SHRTIM system fault input enable */ +#define SHRTIM_FALTIN2_SFALTSMPAREN ((uint32_t)0x10000000U) /* Bit[28] The sram parity error as SHRTIM system fault input enable */ +#define SHRTIM_FALTIN2_SFALTSMECCEN ((uint32_t)0x08000000U) /* Bit[27] The sram ECC error as SHRTIM system fault input enable */ +#define SHRTIM_FALTIN2_SFALTCKSECEN ((uint32_t)0x04000000U) /* Bit[26] The clock security system error as SHRTIM system fault input enable */ +#define SHRTIM_FALTIN2_FALTSCD ((uint32_t)0x03000000U) /* Bit[25:24] Fault sampling clock division */ +#define SHRTIM_FALTIN2_FALTSCD_0 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_FALTIN2_FALTSCD_1 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_FALTIN2_FALT6SRC1 ((uint32_t)0x00200000U) /* Bit[21] Fault 6 source bit 1 */ +#define SHRTIM_FALTIN2_FALT5SRC1 ((uint32_t)0x00100000U) /* Bit[20] Fault 5 source bit 1 */ +#define SHRTIM_FALTIN2_FALT4SRC1 ((uint32_t)0x00080000U) /* Bit[19] Fault 4 source bit 1 */ +#define SHRTIM_FALTIN2_FALT3SRC1 ((uint32_t)0x00040000U) /* Bit[18] Fault 3 source bit 1 */ +#define SHRTIM_FALTIN2_FALT2SRC1 ((uint32_t)0x00020000U) /* Bit[17] Fault 2 source bit 1 */ +#define SHRTIM_FALTIN2_FALT1SRC1 ((uint32_t)0x00010000U) /* Bit[16] Fault 1 source bit 1 */ +#define SHRTIM_FALTIN2_FALT6LCK ((uint32_t)0x00008000U) /* Bit[15] Fault 6 lock */ +#define SHRTIM_FALTIN2_FALT6FLT ((uint32_t)0x00007800U) /* Bit[14:11] Fault 6 filter */ +#define SHRTIM_FALTIN2_FALT6FLT_0 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_FALTIN2_FALT6FLT_1 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_FALTIN2_FALT6FLT_2 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_FALTIN2_FALT6FLT_3 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_FALTIN2_FALT6SRC0 ((uint32_t)0x00000400U) /* Bit[10] Fault 6 source bit 0 */ +#define SHRTIM_FALTIN2_FALT6POL ((uint32_t)0x00000200U) /* Bit[9] Fault 6 polarity */ +#define SHRTIM_FALTIN2_FALT6E ((uint32_t)0x00000100U) /* Bit[8] Fault 6 enable */ +#define SHRTIM_FALTIN2_FALT5LCK ((uint32_t)0x00000080U) /* Bit[7] Fault 5 lock */ +#define SHRTIM_FALTIN2_FALT5FLT ((uint32_t)0x00000078U) /* Bit[6:3] Fault 5 filter */ +#define SHRTIM_FALTIN2_FALT5FLT_0 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_FALTIN2_FALT5FLT_1 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_FALTIN2_FALT5FLT_2 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_FALTIN2_FALT5FLT_3 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_FALTIN2_FALT5SRC0 ((uint32_t)0x00000004U) /* Bit[2] Fault 5 source bit 0 */ +#define SHRTIM_FALTIN2_FALT5POL ((uint32_t)0x00000002U) /* Bit[1] Fault 5 polarity */ +#define SHRTIM_FALTIN2_FALT5E ((uint32_t)0x00000001U) /* Bit[0] Fault 5 enable */ + +/** Bit definition for SHRTIM_FALTIN3 register **/ +#define SHRTIM_FALTIN3_FALT4RSTM ((uint32_t)0x80000000U) /* Bit[31] Fault 4 reset mode */ +#define SHRTIM_FALTIN3_FALT4CRST ((uint32_t)0x40000000U) /* Bit[30] Fault 4 counter reset */ +#define SHRTIM_FALTIN3_FALT4CNT ((uint32_t)0x3C000000U) /* Bit[29:26] Fault 4 counter */ +#define SHRTIM_FALTIN3_FALT4CNT_0 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_FALTIN3_FALT4CNT_1 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_FALTIN3_FALT4CNT_2 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_FALTIN3_FALT4CNT_3 ((uint32_t)0x20000000U) /* Bit29 */ +#define SHRTIM_FALTIN3_FALT4BLKS ((uint32_t)0x02000000U) /* Bit[25] Fault 4 blanking source */ +#define SHRTIM_FALTIN3_FALT4BLKEN ((uint32_t)0x01000000U) /* Bit[24] Fault 4 blanking enable */ +#define SHRTIM_FALTIN3_FALT3RSTM ((uint32_t)0x00800000U) /* Bit[23] Fault 3 reset mode */ +#define SHRTIM_FALTIN3_FALT3CRST ((uint32_t)0x00400000U) /* Bit[22] Fault 3 counter reset */ +#define SHRTIM_FALTIN3_FALT3CNT ((uint32_t)0x003C0000U) /* Bit[21:18] Fault 3 counter */ +#define SHRTIM_FALTIN3_FALT3CNT_0 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_FALTIN3_FALT3CNT_1 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_FALTIN3_FALT3CNT_2 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_FALTIN3_FALT3CNT_3 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_FALTIN3_FALT3BLKS ((uint32_t)0x00020000U) /* Bit[17] Fault 3 blanking source */ +#define SHRTIM_FALTIN3_FALT3BLKEN ((uint32_t)0x00010000U) /* Bit[16] Fault 3 blanking enable */ +#define SHRTIM_FALTIN3_FALT2RSTM ((uint32_t)0x00008000U) /* Bit[15] Fault 2 reset mode */ +#define SHRTIM_FALTIN3_FALT2CRST ((uint32_t)0x00004000U) /* Bit[14] Fault 2 counter reset */ +#define SHRTIM_FALTIN3_FALT2CNT ((uint32_t)0x00003C00U) /* Bit[13:10] Fault 2 counter */ +#define SHRTIM_FALTIN3_FALT2CNT_0 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_FALTIN3_FALT2CNT_1 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_FALTIN3_FALT2CNT_2 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_FALTIN3_FALT2CNT_3 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_FALTIN3_FALT2BLKS ((uint32_t)0x00000200U) /* Bit[9] Fault 2 blanking source */ +#define SHRTIM_FALTIN3_FALT2BLKEN ((uint32_t)0x00000100U) /* Bit[8] Fault 2 blanking enable */ +#define SHRTIM_FALTIN3_FALT1RSTM ((uint32_t)0x00000080U) /* Bit[7] Fault 1 reset mode */ +#define SHRTIM_FALTIN3_FALT1CRST ((uint32_t)0x00000040U) /* Bit[6] Fault 1 counter reset */ +#define SHRTIM_FALTIN3_FALT1CNT ((uint32_t)0x0000003CU) /* Bit[5:2] Fault 1 counter */ +#define SHRTIM_FALTIN3_FALT1CNT_0 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_FALTIN3_FALT1CNT_1 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_FALTIN3_FALT1CNT_2 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_FALTIN3_FALT1CNT_3 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_FALTIN3_FALT1BLKS ((uint32_t)0x00000002U) /* Bit[1] Fault 1 blanking source */ +#define SHRTIM_FALTIN3_FALT1BLKEN ((uint32_t)0x00000001U) /* Bit[0] Fault 1 blanking enable */ + +/** Bit definition for SHRTIM_FALTIN4 register **/ +#define SHRTIM_FALTIN4_FALT6RSTM ((uint32_t)0x00008000U) /* Bit[15] Fault 6 reset mode */ +#define SHRTIM_FALTIN4_FALT6CRST ((uint32_t)0x00004000U) /* Bit[14] Fault 6 counter reset */ +#define SHRTIM_FALTIN4_FALT6CNT ((uint32_t)0x00003C00U) /* Bit[13:10] Fault 6 counter */ +#define SHRTIM_FALTIN4_FALT6CNT_0 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_FALTIN4_FALT6CNT_1 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_FALTIN4_FALT6CNT_2 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_FALTIN4_FALT6CNT_3 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_FALTIN4_FALT6BLKS ((uint32_t)0x00000200U) /* Bit[9] Fault 6 blanking source */ +#define SHRTIM_FALTIN4_FALT6BLKEN ((uint32_t)0x00000100U) /* Bit[8] Fault 6 blanking enable */ +#define SHRTIM_FALTIN4_FALT5RSTM ((uint32_t)0x00000080U) /* Bit[7] Fault 5 reset mode */ +#define SHRTIM_FALTIN4_FALT5CRST ((uint32_t)0x00000040U) /* Bit[6] Fault 5 counter reset */ +#define SHRTIM_FALTIN4_FALT5CNT ((uint32_t)0x0000003CU) /* Bit[5:2] Fault 5 counter */ +#define SHRTIM_FALTIN4_FALT5CNT_0 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_FALTIN4_FALT5CNT_1 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_FALTIN4_FALT5CNT_2 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_FALTIN4_FALT5CNT_3 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_FALTIN4_FALT5BLKS ((uint32_t)0x00000002U) /* Bit[1] Fault 5 blanking source */ +#define SHRTIM_FALTIN4_FALT5BLKEN ((uint32_t)0x00000001U) /* Bit[0] Fault 5 blanking enable */ + +/** Bit definition for SHRTIM_BDMTUPD register **/ +#define SHRTIM_BDMTUPD_MCMPDAT4 ((uint32_t)0x00000200U) /* Bit[9] SHRTIM_MCMP4DAT register update enable */ +#define SHRTIM_BDMTUPD_MCMPDAT3 ((uint32_t)0x00000100U) /* Bit[8] SHRTIM_MCMP3DAT register update enable */ +#define SHRTIM_BDMTUPD_MCMPDAT2 ((uint32_t)0x00000080U) /* Bit[7] SHRTIM_MCMP2DAT register update enable */ +#define SHRTIM_BDMTUPD_MCMPDAT1 ((uint32_t)0x00000040U) /* Bit[6] SHRTIM_MCMP1DAT regiser update enable */ +#define SHRTIM_BDMTUPD_MREPT ((uint32_t)0x00000020U) /* Bit[5] SHRTIM_MREPT register update enable */ +#define SHRTIM_BDMTUPD_MPRD ((uint32_t)0x00000010U) /* Bit[4] SHRTIM_MPRD register update enable */ +#define SHRTIM_BDMTUPD_MCNT ((uint32_t)0x00000008U) /* Bit[3] SHRTIM_MCNT register update enable */ +#define SHRTIM_BDMTUPD_MIDEN ((uint32_t)0x00000004U) /* Bit[2] SHRTIM_MIDEN register update enable */ +#define SHRTIM_BDMTUPD_MINTCLR ((uint32_t)0x00000002U) /* Bit[1] SHRTIM_MINTCLR register update enable */ +#define SHRTIM_BDMTUPD_MCTRL ((uint32_t)0x00000001U) /* Bit[0] SHRTIM_CTRL register update enable */ + +/** Bit definition for SHRTIM_BDTAUPD register **/ +#define SHRTIM_BDTAUPD_TAEXEVFLT3 ((uint32_t)0x00400000U) /* Bit[22] SHRTIM_TAEXEVFLT3 register update enable. */ +#define SHRTIM_BDTAUPD_TACTRL2 ((uint32_t)0x00200000U) /* Bit[21] SHRTIM_TACTRL2 register update enable. */ +#define SHRTIM_BDTAUPD_TAFALT ((uint32_t)0x00100000U) /* Bit[20] SHRTIM_TAFAULT register update enable. */ +#define SHRTIM_BDTAUPD_TAOUT ((uint32_t)0x00080000U) /* Bit[19] SHRTIM_TAOUT register update enable. */ +#define SHRTIM_BDTAUPD_TACHOP ((uint32_t)0x00040000U) /* Bit[18] SHRTIM_TACHOP register update enable. */ +#define SHRTIM_BDTAUPD_TACNTRST ((uint32_t)0x00020000U) /* Bit[17] SHRTIM_TACNTRST register update enable */ +#define SHRTIM_BDTAUPD_TAEXEVFLT2 ((uint32_t)0x00010000U) /* Bit[16] SHRTIM_TAEXEVFLT2 register update enable. */ +#define SHRTIM_BDTAUPD_TAEXEVFLT1 ((uint32_t)0x00008000U) /* Bit[15] SHRTIM_TAEXEVFLT1 register update enable. */ +#define SHRTIM_BDTAUPD_TARST2 ((uint32_t)0x00004000U) /* Bit[14] SHRTIM_TARST2 register update enable. */ +#define SHRTIM_BDTAUPD_TASET2 ((uint32_t)0x00002000U) /* Bit[13] SHRTIM_TASET2 register update enable. */ +#define SHRTIM_BDTAUPD_TARST1 ((uint32_t)0x00001000U) /* Bit[12] SHRTIM_TARST1 register update enable. */ +#define SHRTIM_BDTAUPD_TASET1 ((uint32_t)0x00000800U) /* Bit[11] SHRTIM_TASET1 register update enable. */ +#define SHRTIM_BDTAUPD_TADT ((uint32_t)0x00000400U) /* Bit[10] SHRTIM_TADT register update enable. */ +#define SHRTIM_BDTAUPD_TACMP4DAT ((uint32_t)0x00000200U) /* Bit[9] SHRTIM_TACMP4DAT register update enable. */ +#define SHRTIM_BDTAUPD_TACMP3DAT ((uint32_t)0x00000100U) /* Bit[8] SHRTIM_TACMP3DAT register update enable. */ +#define SHRTIM_BDTAUPD_TACMP2DAT ((uint32_t)0x00000080U) /* Bit[7] SHRTIM_TACMP2DAT register update enable. */ +#define SHRTIM_BDTAUPD_TACMP1DAT ((uint32_t)0x00000040U) /* Bit[6] SHRTIM_TACMP1DAT register update enable. */ +#define SHRTIM_BDTAUPD_TAREPT ((uint32_t)0x00000020U) /* Bit[5] SHRTIM_TAREPT register update enable. */ +#define SHRTIM_BDTAUPD_TAPRD ((uint32_t)0x00000010U) /* Bit[4] SHRTIM_TAPRD register update enable. */ +#define SHRTIM_BDTAUPD_TACNT ((uint32_t)0x00000008U) /* Bit[3] SHRTIM_TACNT register update enable. */ +#define SHRTIM_BDTAUPD_TAIDEN ((uint32_t)0x00000004U) /* Bit[2] SHRTIM_TAIDEN register update enable. */ +#define SHRTIM_BDTAUPD_TAINTCLR ((uint32_t)0x00000002U) /* Bit[1] SHRTIM_TAINTCLR register update enable. */ +#define SHRTIM_BDTAUPD_TACTRL ((uint32_t)0x00000001U) /* Bit[0] SHRTIM_TIMACTRL register update enable. */ + +/** Bit definition for SHRTIM_BDTBUPD register **/ +#define SHRTIM_BDTBUPD_TBEXEVFLT3 ((uint32_t)0x00400000U) /* Bit[22] SHRTIM_TBEXEVFLT3 register update enable. */ +#define SHRTIM_BDTBUPD_TBCTRL2 ((uint32_t)0x00200000U) /* Bit[21] SHRTIM_TBCTRL2 register update enable. */ +#define SHRTIM_BDTBUPD_TBFALT ((uint32_t)0x00100000U) /* Bit[20] SHRTIM_TBFAULT register update enable. */ +#define SHRTIM_BDTBUPD_TBOUT ((uint32_t)0x00080000U) /* Bit[19] SHRTIM_TBOUT register update enable. */ +#define SHRTIM_BDTBUPD_TBCHOP ((uint32_t)0x00040000U) /* Bit[18] SHRTIM_TBCHOP register update enable. */ +#define SHRTIM_BDTBUPD_TBCNTRST ((uint32_t)0x00020000U) /* Bit[17] SHRTIM_TBCNTRST register update enable */ +#define SHRTIM_BDTBUPD_TBEXEVFLT2 ((uint32_t)0x00010000U) /* Bit[16] SHRTIM_TBEXEVFLT2 register update enable. */ +#define SHRTIM_BDTBUPD_TBEXEVFLT1 ((uint32_t)0x00008000U) /* Bit[15] SHRTIM_TBEXEVFLT1 register update enable. */ +#define SHRTIM_BDTBUPD_TBRST2 ((uint32_t)0x00004000U) /* Bit[14] SHRTIM_TBRST2 register update enable. */ +#define SHRTIM_BDTBUPD_TBSET2 ((uint32_t)0x00002000U) /* Bit[13] SHRTIM_TBSET2 register update enable. */ +#define SHRTIM_BDTBUPD_TBRST1 ((uint32_t)0x00001000U) /* Bit[12] SHRTIM_TBRST1 register update enable. */ +#define SHRTIM_BDTBUPD_TBSET1 ((uint32_t)0x00000800U) /* Bit[11] SHRTIM_TBSET1 register update enable. */ +#define SHRTIM_BDTBUPD_TBDT ((uint32_t)0x00000400U) /* Bit[10] SHRTIM_TBDT register update enable. */ +#define SHRTIM_BDTBUPD_TBCMP4DAT ((uint32_t)0x00000200U) /* Bit[9] SHRTIM_TBCMP4DAT register update enable. */ +#define SHRTIM_BDTBUPD_TBCMP3DAT ((uint32_t)0x00000100U) /* Bit[8] SHRTIM_TBCMP3DAT register update enable. */ +#define SHRTIM_BDTBUPD_TBCMP2DAT ((uint32_t)0x00000080U) /* Bit[7] SHRTIM_TBCMP2DAT register update enable. */ +#define SHRTIM_BDTBUPD_TBCMP1DAT ((uint32_t)0x00000040U) /* Bit[6] SHRTIM_TBCMP1DAT register update enable. */ +#define SHRTIM_BDTBUPD_TBREPT ((uint32_t)0x00000020U) /* Bit[5] SHRTIM_TBREPT register update enable. */ +#define SHRTIM_BDTBUPD_TBPRD ((uint32_t)0x00000010U) /* Bit[4] SHRTIM_TBPRD register update enable. */ +#define SHRTIM_BDTBUPD_TBCNT ((uint32_t)0x00000008U) /* Bit[3] SHRTIM_TBCNT register update enable. */ +#define SHRTIM_BDTBUPD_TBIDEN ((uint32_t)0x00000004U) /* Bit[2] SHRTIM_TBIDEN register update enable. */ +#define SHRTIM_BDTBUPD_TBINTCLR ((uint32_t)0x00000002U) /* Bit[1] SHRTIM_TBINTCLR register update enable. */ +#define SHRTIM_BDTBUPD_TBCTRL ((uint32_t)0x00000001U) /* Bit[0] SHRTIM_TACTRL register update enable. */ + +/** Bit definition for SHRTIM_BDTCUPD register **/ +#define SHRTIM_BDTCUPD_TCEXEVFLT3 ((uint32_t)0x00400000U) /* Bit[22] SHRTIM_TCEXEVFLT3 register update enable. */ +#define SHRTIM_BDTCUPD_TCCTRL2 ((uint32_t)0x00200000U) /* Bit[21] SHRTIM_TCCTRL2 register update enable. */ +#define SHRTIM_BDTCUPD_TCFALT ((uint32_t)0x00100000U) /* Bit[20] SHRTIM_TCFAULT register update enable. */ +#define SHRTIM_BDTCUPD_TCOUT ((uint32_t)0x00080000U) /* Bit[19] SHRTIM_TCOUT register update enable. */ +#define SHRTIM_BDTCUPD_TCCHOP ((uint32_t)0x00040000U) /* Bit[18] SHRTIM_TCCHOP register update enable. */ +#define SHRTIM_BDTCUPD_TCCNTRST ((uint32_t)0x00020000U) /* Bit[17] SHRTIM_TCCNTRST register update enable */ +#define SHRTIM_BDTCUPD_TCEXEVFLT2 ((uint32_t)0x00010000U) /* Bit[16] SHRTIM_TCEXEVFLT2 register update enable. */ +#define SHRTIM_BDTCUPD_TCEXEVFLT1 ((uint32_t)0x00008000U) /* Bit[15] SHRTIM_TCEXEVFLT1 register update enable. */ +#define SHRTIM_BDTCUPD_TCRST2 ((uint32_t)0x00004000U) /* Bit[14] SHRTIM_TCRST2 register update enable. */ +#define SHRTIM_BDTCUPD_TCSET2 ((uint32_t)0x00002000U) /* Bit[13] SHRTIM_TCSET2 register update enable. */ +#define SHRTIM_BDTCUPD_TCRST1 ((uint32_t)0x00001000U) /* Bit[12] SHRTIM_TCRST1 register update enable. */ +#define SHRTIM_BDTCUPD_TCSET1 ((uint32_t)0x00000800U) /* Bit[11] SHRTIM_TCSET1 register update enable. */ +#define SHRTIM_BDTCUPD_TCDT ((uint32_t)0x00000400U) /* Bit[10] SHRTIM_TCDT register update enable. */ +#define SHRTIM_BDTCUPD_TCCMP4DAT ((uint32_t)0x00000200U) /* Bit[9] SHRTIM_TCCMP4DAT register update enable. */ +#define SHRTIM_BDTCUPD_TCCMP3DAT ((uint32_t)0x00000100U) /* Bit[8] SHRTIM_TCCMP3DAT register update enable. */ +#define SHRTIM_BDTCUPD_TCCMP2DAT ((uint32_t)0x00000080U) /* Bit[7] SHRTIM_TCCMP2DAT register update enable. */ +#define SHRTIM_BDTCUPD_TCCMP1DAT ((uint32_t)0x00000040U) /* Bit[6] SHRTIM_TCCMP1DAT register update enable. */ +#define SHRTIM_BDTCUPD_TCREPT ((uint32_t)0x00000020U) /* Bit[5] SHRTIM_TCREPT register update enable. */ +#define SHRTIM_BDTCUPD_TCPRD ((uint32_t)0x00000010U) /* Bit[4] SHRTIM_TCPRD register update enable. */ +#define SHRTIM_BDTCUPD_TCCNT ((uint32_t)0x00000008U) /* Bit[3] SHRTIM_TCCNT register update enable. */ +#define SHRTIM_BDTCUPD_TCIDEN ((uint32_t)0x00000004U) /* Bit[2] SHRTIM_TCIDEN register update enable. */ +#define SHRTIM_BDTCUPD_TCINTCLR ((uint32_t)0x00000002U) /* Bit[1] SHRTIM_TCINTCLR register update enable. */ +#define SHRTIM_BDTCUPD_TCCTRL ((uint32_t)0x00000001U) /* Bit[0] SHRTIM_TCCTRL register update enable. */ + +/** Bit definition for SHRTIM_BDTDUPD register **/ +#define SHRTIM_BDTDUPD_TDEXEVFLT3 ((uint32_t)0x00400000U) /* Bit[22] SHRTIM_TDEXEVFLT3 register update enable. */ +#define SHRTIM_BDTDUPD_TDCTRL2 ((uint32_t)0x00200000U) /* Bit[21] SHRTIM_TDCTRL2 register update enable. */ +#define SHRTIM_BDTDUPD_TDFALT ((uint32_t)0x00100000U) /* Bit[20] SHRTIM_TDFAULT register update enable. */ +#define SHRTIM_BDTDUPD_TDOUT ((uint32_t)0x00080000U) /* Bit[19] SHRTIM_TDOUT register update enable. */ +#define SHRTIM_BDTDUPD_TDCHOP ((uint32_t)0x00040000U) /* Bit[18] SHRTIM_TDCHOP register update enable. */ +#define SHRTIM_BDTDUPD_TDCNTRST ((uint32_t)0x00020000U) /* Bit[17] SHRTIM_TDCNTRST register update enable */ +#define SHRTIM_BDTDUPD_TDEXEVFLT2 ((uint32_t)0x00010000U) /* Bit[16] SHRTIM_TDEXEVFLT2 register update enable. */ +#define SHRTIM_BDTDUPD_TDEXEVFLT1 ((uint32_t)0x00008000U) /* Bit[15] SHRTIM_TDEXEVFLT1 register update enable. */ +#define SHRTIM_BDTDUPD_TDRST2 ((uint32_t)0x00004000U) /* Bit[14] SHRTIM_TDRST2 register update enable. */ +#define SHRTIM_BDTDUPD_TDSET2 ((uint32_t)0x00002000U) /* Bit[13] SHRTIM_TDSET2 register update enable. */ +#define SHRTIM_BDTDUPD_TDRST1 ((uint32_t)0x00001000U) /* Bit[12] SHRTIM_TDRST1 register update enable. */ +#define SHRTIM_BDTDUPD_TDSET1 ((uint32_t)0x00000800U) /* Bit[11] SHRTIM_TDSET1 register update enable. */ +#define SHRTIM_BDTDUPD_TDDT ((uint32_t)0x00000400U) /* Bit[10] SHRTIM_TDDT register update enable. */ +#define SHRTIM_BDTDUPD_TDCMP4DAT ((uint32_t)0x00000200U) /* Bit[9] SHRTIM_TDCMP4DAT register update enable. */ +#define SHRTIM_BDTDUPD_TDCMP3DAT ((uint32_t)0x00000100U) /* Bit[8] SHRTIM_TDCMP3DAT register update enable. */ +#define SHRTIM_BDTDUPD_TDCMP2DAT ((uint32_t)0x00000080U) /* Bit[7] SHRTIM_TDCMP2DAT register update enable. */ +#define SHRTIM_BDTDUPD_TDCMP1DAT ((uint32_t)0x00000040U) /* Bit[6] SHRTIM_TDCMP1DAT register update enable. */ +#define SHRTIM_BDTDUPD_TDREPT ((uint32_t)0x00000020U) /* Bit[5] SHRTIM_TDREPT register update enable. */ +#define SHRTIM_BDTDUPD_TDPRD ((uint32_t)0x00000010U) /* Bit[4] SHRTIM_TDPRD register update enable. */ +#define SHRTIM_BDTDUPD_TDCNT ((uint32_t)0x00000008U) /* Bit[3] SHRTIM_TDCNT register update enable. */ +#define SHRTIM_BDTDUPD_TDIDEN ((uint32_t)0x00000004U) /* Bit[2] SHRTIM_TDIDEN register update enable. */ +#define SHRTIM_BDTDUPD_TDINTDLR ((uint32_t)0x00000002U) /* Bit[1] SHRTIM_TDINTDLR register update enable. */ +#define SHRTIM_BDTDUPD_TDCTRL ((uint32_t)0x00000001U) /* Bit[0] SHRTIM_TDCTRL register update enable. */ + +/** Bit definition for SHRTIM_BDTEUPD register **/ +#define SHRTIM_BDTEUPD_TEEXEVFLT3 ((uint32_t)0x00400000U) /* Bit[22] SHRTIM_TEEXEVFLT3 register update enable. */ +#define SHRTIM_BDTEUPD_TECTRL2 ((uint32_t)0x00200000U) /* Bit[21] SHRTIM_TECTRL2 register update enable. */ +#define SHRTIM_BDTEUPD_TEFALT ((uint32_t)0x00100000U) /* Bit[20] SHRTIM_TEFAULT register update enable. */ +#define SHRTIM_BDTEUPD_TEOUT ((uint32_t)0x00080000U) /* Bit[19] SHRTIM_TEOUT register update enable. */ +#define SHRTIM_BDTEUPD_TECHOP ((uint32_t)0x00040000U) /* Bit[18] SHRTIM_TECHOP register update enable. */ +#define SHRTIM_BDTEUPD_TECNTRST ((uint32_t)0x00020000U) /* Bit[17] SHRTIM_TECNTRST register update enable */ +#define SHRTIM_BDTEUPD_TEEXEVFLT2 ((uint32_t)0x00010000U) /* Bit[16] SHRTIM_TEEXEVFLT2 register update enable. */ +#define SHRTIM_BDTEUPD_TEEXEVFLT1 ((uint32_t)0x00008000U) /* Bit[15] SHRTIM_TEEXEVFLT1 register update enable. */ +#define SHRTIM_BDTEUPD_TERST2 ((uint32_t)0x00004000U) /* Bit[14] SHRTIM_TERST2 register update enable. */ +#define SHRTIM_BDTEUPD_TESET2 ((uint32_t)0x00002000U) /* Bit[13] SHRTIM_TESET2 register update enable. */ +#define SHRTIM_BDTEUPD_TERST1 ((uint32_t)0x00001000U) /* Bit[12] SHRTIM_TERST1 register update enable. */ +#define SHRTIM_BDTEUPD_TESET1 ((uint32_t)0x00000800U) /* Bit[11] SHRTIM_TESET1 register update enable. */ +#define SHRTIM_BDTEUPD_TEDT ((uint32_t)0x00000400U) /* Bit[10] SHRTIM_TEDT register update enable. */ +#define SHRTIM_BDTEUPD_TECMP4DAT ((uint32_t)0x00000200U) /* Bit[9] SHRTIM_TECMP4DAT register update enable. */ +#define SHRTIM_BDTEUPD_TECMP3DAT ((uint32_t)0x00000100U) /* Bit[8] SHRTIM_TECMP3DAT register update enable. */ +#define SHRTIM_BDTEUPD_TECMP2DAT ((uint32_t)0x00000080U) /* Bit[7] SHRTIM_TECMP2DAT register update enable. */ +#define SHRTIM_BDTEUPD_TECMP1DAT ((uint32_t)0x00000040U) /* Bit[6] SHRTIM_TECMP1DAT register update enable. */ +#define SHRTIM_BDTEUPD_TEREPT ((uint32_t)0x00000020U) /* Bit[5] SHRTIM_TEREPT register update enable. */ +#define SHRTIM_BDTEUPD_TEPRD ((uint32_t)0x00000010U) /* Bit[4] SHRTIM_TEPRD register update enable. */ +#define SHRTIM_BDTEUPD_TECNT ((uint32_t)0x00000008U) /* Bit[3] SHRTIM_TECNT register update enable. */ +#define SHRTIM_BDTEUPD_TEIDEN ((uint32_t)0x00000004U) /* Bit[2] SHRTIM_TEIDEN register update enable. */ +#define SHRTIM_BDTEUPD_TEINTELR ((uint32_t)0x00000002U) /* Bit[1] SHRTIM_TEINTELR register update enable. */ +#define SHRTIM_BDTEUPD_TECTRL ((uint32_t)0x00000001U) /* Bit[0] SHRTIM_TECTRL register update enable. */ + +/** Bit definition for SHRTIM_BDTFUPD register **/ +#define SHRTIM_BDTFUPD_TFEXEVFLT3 ((uint32_t)0x00400000U) /* Bit[22] SHRTIM_TFEXEVFLT3 register update enable. */ +#define SHRTIM_BDTFUPD_TFCTRL2 ((uint32_t)0x00200000U) /* Bit[21] SHRTIM_TFCTRL2 register update enable. */ +#define SHRTIM_BDTFUPD_TFFALT ((uint32_t)0x00100000U) /* Bit[20] SHRTIM_TFFAULT register update enable. */ +#define SHRTIM_BDTFUPD_TFOUT ((uint32_t)0x00080000U) /* Bit[19] SHRTIM_TFOUT register update enable. */ +#define SHRTIM_BDTFUPD_TFCHOP ((uint32_t)0x00040000U) /* Bit[18] SHRTIM_TFCHOP register update enable. */ +#define SHRTIM_BDTFUPD_TFCNTRST ((uint32_t)0x00020000U) /* Bit[17] SHRTIM_TFCNTRST register update enable */ +#define SHRTIM_BDTFUPD_TFEXEVFLT2 ((uint32_t)0x00010000U) /* Bit[16] SHRTIM_TFEXEVFLT2 register update enable. */ +#define SHRTIM_BDTFUPD_TFEXEVFLT1 ((uint32_t)0x00008000U) /* Bit[15] SHRTIM_TFEXEVFLT1 register update enable. */ +#define SHRTIM_BDTFUPD_TFRST2 ((uint32_t)0x00004000U) /* Bit[14] SHRTIM_TFRST2 register update enable. */ +#define SHRTIM_BDTFUPD_TFSET2 ((uint32_t)0x00002000U) /* Bit[13] SHRTIM_TFSET2 register update enable. */ +#define SHRTIM_BDTFUPD_TFRST1 ((uint32_t)0x00001000U) /* Bit[12] SHRTIM_TFRST1 register update enable. */ +#define SHRTIM_BDTFUPD_TFSET1 ((uint32_t)0x00000800U) /* Bit[11] SHRTIM_TFSET1 register update enable. */ +#define SHRTIM_BDTFUPD_TFDT ((uint32_t)0x00000400U) /* Bit[10] SHRTIM_TFDT register update enable. */ +#define SHRTIM_BDTFUPD_TFCMP4DAT ((uint32_t)0x00000200U) /* Bit[9] SHRTIM_TFCMP4DAT register update enable. */ +#define SHRTIM_BDTFUPD_TFCMP3DAT ((uint32_t)0x00000100U) /* Bit[8] SHRTIM_TFCMP3DAT register update enable. */ +#define SHRTIM_BDTFUPD_TFCMP2DAT ((uint32_t)0x00000080U) /* Bit[7] SHRTIM_TFCMP2DAT register update enable. */ +#define SHRTIM_BDTFUPD_TFCMP1DAT ((uint32_t)0x00000040U) /* Bit[6] SHRTIM_TFCMP1DAT register update enable. */ +#define SHRTIM_BDTFUPD_TFREPT ((uint32_t)0x00000020U) /* Bit[5] SHRTIM_TFREPT register update enable. */ +#define SHRTIM_BDTFUPD_TFPRD ((uint32_t)0x00000010U) /* Bit[4] SHRTIM_TFPRD register update enable. */ +#define SHRTIM_BDTFUPD_TFCNT ((uint32_t)0x00000008U) /* Bit[3] SHRTIM_TFCNT register update enable. */ +#define SHRTIM_BDTFUPD_TFIDEN ((uint32_t)0x00000004U) /* Bit[2] SHRTIM_TFIDEN register update enable. */ +#define SHRTIM_BDTFUPD_TFINTFLR ((uint32_t)0x00000002U) /* Bit[1] SHRTIM_TFINTFLR register update enable. */ +#define SHRTIM_BDTFUPD_TFCTRL ((uint32_t)0x00000001U) /* Bit[0] SHRTIM_TFCTRL register update enable. */ + +/** Bit definition for SHRTIM_BDDAT register **/ +#define SHRTIM_BDDAT_BDMADATA ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Burst DMA data register */ +#define SHRTIM_BDDAT_BDMADATA_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_BDDAT_BDMADATA_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_BDDAT_BDMADATA_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_BDDAT_BDMADATA_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_BDDAT_BDMADATA_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_BDDAT_BDMADATA_5 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_BDDAT_BDMADATA_6 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_BDDAT_BDMADATA_7 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_BDDAT_BDMADATA_8 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_BDDAT_BDMADATA_9 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_BDDAT_BDMADATA_10 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_BDDAT_BDMADATA_11 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_BDDAT_BDMADATA_12 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_BDDAT_BDMADATA_13 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_BDDAT_BDMADATA_14 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_BDDAT_BDMADATA_15 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_BDDAT_BDMADATA_16 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_BDDAT_BDMADATA_17 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_BDDAT_BDMADATA_18 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_BDDAT_BDMADATA_19 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_BDDAT_BDMADATA_20 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_BDDAT_BDMADATA_21 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_BDDAT_BDMADATA_22 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_BDDAT_BDMADATA_23 ((uint32_t)0x00800000U) /* Bit23 */ +#define SHRTIM_BDDAT_BDMADATA_24 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_BDDAT_BDMADATA_25 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_BDDAT_BDMADATA_26 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_BDDAT_BDMADATA_27 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_BDDAT_BDMADATA_28 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_BDDAT_BDMADATA_29 ((uint32_t)0x20000000U) /* Bit29 */ +#define SHRTIM_BDDAT_BDMADATA_30 ((uint32_t)0x40000000U) /* Bit30 */ +#define SHRTIM_BDDAT_BDMADATA_31 ((uint32_t)0x80000000U) /* Bit31 */ + +/** Bit definition for SHRTIM_ADTGEX1 register **/ +#define SHRTIM_ADTGEX1_ADTG9SRC ((uint32_t)0x003F0000U) /* Bit[21:16] Description */ +#define SHRTIM_ADTGEX1_ADTG9SRC_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_ADTGEX1_ADTG9SRC_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_ADTGEX1_ADTG9SRC_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_ADTGEX1_ADTG9SRC_3 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_ADTGEX1_ADTG9SRC_4 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_ADTGEX1_ADTG9SRC_5 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_ADTGEX1_ADTG7SRC ((uint32_t)0x00003F00U) /* Bit[13:8] Description */ +#define SHRTIM_ADTGEX1_ADTG7SRC_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_ADTGEX1_ADTG7SRC_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_ADTGEX1_ADTG7SRC_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_ADTGEX1_ADTG7SRC_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_ADTGEX1_ADTG7SRC_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_ADTGEX1_ADTG7SRC_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_ADTGEX1_ADTG5SRC ((uint32_t)0x0000003FU) /* Bit[5:0] Trigger on master compare 1 */ +#define SHRTIM_ADTGEX1_ADTG5SRC_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_ADTGEX1_ADTG5SRC_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_ADTGEX1_ADTG5SRC_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_ADTGEX1_ADTG5SRC_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_ADTGEX1_ADTG5SRC_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_ADTGEX1_ADTG5SRC_5 ((uint32_t)0x00000020U) /* Bit5 */ + +/** Bit definition for SHRTIM_ADTGEX2 register **/ +#define SHRTIM_ADTGEX2_ADTG10SRC ((uint32_t)0x003F0000U) /* Bit[21:16] Description */ +#define SHRTIM_ADTGEX2_ADTG10SRC_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_ADTGEX2_ADTG10SRC_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_ADTGEX2_ADTG10SRC_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_ADTGEX2_ADTG10SRC_3 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_ADTGEX2_ADTG10SRC_4 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_ADTGEX2_ADTG10SRC_5 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_ADTGEX2_ADTG8SRC ((uint32_t)0x00003F00U) /* Bit[13:8] Description */ +#define SHRTIM_ADTGEX2_ADTG8SRC_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_ADTGEX2_ADTG8SRC_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_ADTGEX2_ADTG8SRC_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_ADTGEX2_ADTG8SRC_3 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_ADTGEX2_ADTG8SRC_4 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_ADTGEX2_ADTG8SRC_5 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_ADTGEX2_ADTG6SRC ((uint32_t)0x0000003FU) /* Bit[5:0] Trigger on master compare 1 */ +#define SHRTIM_ADTGEX2_ADTG6SRC_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_ADTGEX2_ADTG6SRC_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_ADTGEX2_ADTG6SRC_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_ADTGEX2_ADTG6SRC_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_ADTGEX2_ADTG6SRC_4 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_ADTGEX2_ADTG6SRC_5 ((uint32_t)0x00000020U) /* Bit5 */ + +/** Bit definition for SHRTIM_ADTGUPD register **/ +#define SHRTIM_ADTGUPD_ADTG10UPDSRC ((uint32_t)0x00700000U) /* Bit[22:20] ADC trigger 10 update source */ +#define SHRTIM_ADTGUPD_ADTG10UPDSRC_0 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_ADTGUPD_ADTG10UPDSRC_1 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_ADTGUPD_ADTG10UPDSRC_2 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_ADTGUPD_ADTG9UPDSRC ((uint32_t)0x00070000U) /* Bit[18:16] ADC trigger 9 update source */ +#define SHRTIM_ADTGUPD_ADTG9UPDSRC_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_ADTGUPD_ADTG9UPDSRC_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_ADTGUPD_ADTG9UPDSRC_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_ADTGUPD_ADTG8UPDSRC ((uint32_t)0x00007000U) /* Bit[14:12] ADC trigger 8 update source */ +#define SHRTIM_ADTGUPD_ADTG8UPDSRC_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_ADTGUPD_ADTG8UPDSRC_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_ADTGUPD_ADTG8UPDSRC_2 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_ADTGUPD_ADTG7UPDSRC ((uint32_t)0x00000700U) /* Bit[10:8] ADC trigger 7 update source */ +#define SHRTIM_ADTGUPD_ADTG7UPDSRC_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_ADTGUPD_ADTG7UPDSRC_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_ADTGUPD_ADTG7UPDSRC_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_ADTGUPD_ADTG6UPDSRC ((uint32_t)0x00000070U) /* Bit[6:4] ADC trigger 6 update source */ +#define SHRTIM_ADTGUPD_ADTG6UPDSRC_0 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_ADTGUPD_ADTG6UPDSRC_1 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_ADTGUPD_ADTG6UPDSRC_2 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_ADTGUPD_ADTG5UPDSRC ((uint32_t)0x00000007U) /* Bit[2:0] ADC trigger 5 update source */ +#define SHRTIM_ADTGUPD_ADTG5UPDSRC_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_ADTGUPD_ADTG5UPDSRC_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_ADTGUPD_ADTG5UPDSRC_2 ((uint32_t)0x00000004U) /* Bit2 */ + +/** Bit definition for SHRTIM_ADCPSC1 register **/ +#define SHRTIM_ADCPSC1_ADC5PSC ((uint32_t)0x1F000000U) /* Bit[28:24] ADC trigger 5 post scaler */ +#define SHRTIM_ADCPSC1_ADC5PSC_0 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_ADCPSC1_ADC5PSC_1 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_ADCPSC1_ADC5PSC_2 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_ADCPSC1_ADC5PSC_3 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_ADCPSC1_ADC5PSC_4 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_ADCPSC1_ADC4PSC ((uint32_t)0x007C0000U) /* Bit[22:18] ADC trigger 4 post scaler */ +#define SHRTIM_ADCPSC1_ADC4PSC_0 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_ADCPSC1_ADC4PSC_1 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_ADCPSC1_ADC4PSC_2 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_ADCPSC1_ADC4PSC_3 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_ADCPSC1_ADC4PSC_4 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_ADCPSC1_ADC3PSC ((uint32_t)0x0001F000U) /* Bit[16:12] ADC trigger 3 post scaler */ +#define SHRTIM_ADCPSC1_ADC3PSC_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_ADCPSC1_ADC3PSC_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_ADCPSC1_ADC3PSC_2 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_ADCPSC1_ADC3PSC_3 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_ADCPSC1_ADC3PSC_4 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_ADCPSC1_ADC2PSC ((uint32_t)0x000007C0U) /* Bit[10:6] ADC trigger 2 post scaler */ +#define SHRTIM_ADCPSC1_ADC2PSC_0 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_ADCPSC1_ADC2PSC_1 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_ADCPSC1_ADC2PSC_2 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_ADCPSC1_ADC2PSC_3 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_ADCPSC1_ADC2PSC_4 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_ADCPSC1_ADC1PSC ((uint32_t)0x0000001FU) /* Bit[4:0] ADC trigger 1 post scaler */ +#define SHRTIM_ADCPSC1_ADC1PSC_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_ADCPSC1_ADC1PSC_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_ADCPSC1_ADC1PSC_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_ADCPSC1_ADC1PSC_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_ADCPSC1_ADC1PSC_4 ((uint32_t)0x00000010U) /* Bit4 */ + +/** Bit definition for SHRTIM_ADCPSC2 register **/ +#define SHRTIM_ADCPSC2_ADC10PSC ((uint32_t)0x1F000000U) /* Bit[28:24] ADC trigger 10 post scaler */ +#define SHRTIM_ADCPSC2_ADC10PSC_0 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_ADCPSC2_ADC10PSC_1 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_ADCPSC2_ADC10PSC_2 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_ADCPSC2_ADC10PSC_3 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_ADCPSC2_ADC10PSC_4 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_ADCPSC2_ADC9PSC ((uint32_t)0x007C0000U) /* Bit[22:18] ADC trigger 9 post scaler */ +#define SHRTIM_ADCPSC2_ADC9PSC_0 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_ADCPSC2_ADC9PSC_1 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_ADCPSC2_ADC9PSC_2 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_ADCPSC2_ADC9PSC_3 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_ADCPSC2_ADC9PSC_4 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_ADCPSC2_ADC8PSC ((uint32_t)0x0001F000U) /* Bit[16:12] ADC trigger 8 post scaler */ +#define SHRTIM_ADCPSC2_ADC8PSC_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_ADCPSC2_ADC8PSC_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_ADCPSC2_ADC8PSC_2 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_ADCPSC2_ADC8PSC_3 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_ADCPSC2_ADC8PSC_4 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_ADCPSC2_ADC7PSC ((uint32_t)0x000007C0U) /* Bit[10:6] ADC trigger 7 post scaler */ +#define SHRTIM_ADCPSC2_ADC7PSC_0 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_ADCPSC2_ADC7PSC_1 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_ADCPSC2_ADC7PSC_2 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_ADCPSC2_ADC7PSC_3 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_ADCPSC2_ADC7PSC_4 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_ADCPSC2_ADC6PSC ((uint32_t)0x0000001FU) /* Bit[4:0] ADC trigger 6 post scaler */ +#define SHRTIM_ADCPSC2_ADC6PSC_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_ADCPSC2_ADC6PSC_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_ADCPSC2_ADC6PSC_2 ((uint32_t)0x00000004U) /* Bit2 */ +#define SHRTIM_ADCPSC2_ADC6PSC_3 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_ADCPSC2_ADC6PSC_4 ((uint32_t)0x00000010U) /* Bit4 */ + +/** Bit definition for SHRTIM_SFTFALT register **/ +#define SHRTIM_SFTFALT_SFTFALT6 ((uint32_t)0x00000020U) /* Bit[5] Software fault 6 */ +#define SHRTIM_SFTFALT_SFTFALT5 ((uint32_t)0x00000010U) /* Bit[4] Software fault 5 */ +#define SHRTIM_SFTFALT_SFTFALT4 ((uint32_t)0x00000008U) /* Bit[3] Software fault 4 */ +#define SHRTIM_SFTFALT_SFTFALT3 ((uint32_t)0x00000004U) /* Bit[2] Software fault 3 */ +#define SHRTIM_SFTFALT_SFTFALT2 ((uint32_t)0x00000002U) /* Bit[1] Software fault 2 */ +#define SHRTIM_SFTFALT_SFTFALT1 ((uint32_t)0x00000001U) /* Bit[0] Software fault 1 */ + +/** Bit definition for SHRTIM_SFTDP register **/ +#define SHRTIM_SFTDP_SFTDPF2 ((uint32_t)0x00000800U) /* Bit[11] Software delay protection F for channel 2 */ +#define SHRTIM_SFTDP_SFTDPE2 ((uint32_t)0x00000400U) /* Bit[10] Software delay protection E for channel 2 */ +#define SHRTIM_SFTDP_SFTDPD2 ((uint32_t)0x00000200U) /* Bit[9] Software delay protection D for channel 2 */ +#define SHRTIM_SFTDP_SFTDPC2 ((uint32_t)0x00000100U) /* Bit[8] Software delay protection C for channel 2 */ +#define SHRTIM_SFTDP_SFTDPB2 ((uint32_t)0x00000080U) /* Bit[7] Software delay protection B for channel 2 */ +#define SHRTIM_SFTDP_SFTDPA2 ((uint32_t)0x00000040U) /* Bit[6] Software delay protection A for channel 2 */ +#define SHRTIM_SFTDP_SFTDPF1 ((uint32_t)0x00000020U) /* Bit[5] Software delay protection F for channel 1 */ +#define SHRTIM_SFTDP_SFTDPE1 ((uint32_t)0x00000010U) /* Bit[4] Software delay protection E for channel 1 */ +#define SHRTIM_SFTDP_SFTDPD1 ((uint32_t)0x00000008U) /* Bit[3] Software delay protection D for channel 1 */ +#define SHRTIM_SFTDP_SFTDPC1 ((uint32_t)0x00000004U) /* Bit[2] Software delay protection C for channel 1 */ +#define SHRTIM_SFTDP_SFTDPB1 ((uint32_t)0x00000002U) /* Bit[1] Software delay protection B for channel 1 */ +#define SHRTIM_SFTDP_SFTDPA1 ((uint32_t)0x00000001U) /* Bit[0] Software delay protection A for channel 1 */ + +/** Bit definition for SHRTIM_FALTIN5 register **/ +#define SHRTIM_FALTIN5_FALT6CSEL ((uint32_t)0x00700000U) /* Bit[22:20] Analog comp x sellect for fault 6 */ +#define SHRTIM_FALTIN5_FALT6CSEL_0 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_FALTIN5_FALT6CSEL_1 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_FALTIN5_FALT6CSEL_2 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_FALTIN5_FALT5CSEL ((uint32_t)0x00070000U) /* Bit[18:16] Analog comp x sellect for fault5 */ +#define SHRTIM_FALTIN5_FALT5CSEL_0 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_FALTIN5_FALT5CSEL_1 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_FALTIN5_FALT5CSEL_2 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_FALTIN5_FALT4CSEL ((uint32_t)0x00007000U) /* Bit[14:12] Analog comp x sellect for fault 4 */ +#define SHRTIM_FALTIN5_FALT4CSEL_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_FALTIN5_FALT4CSEL_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_FALTIN5_FALT4CSEL_2 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_FALTIN5_FALT3CSEL ((uint32_t)0x00000700U) /* Bit[10:8] Analog comp x sellect for fault3 */ +#define SHRTIM_FALTIN5_FALT3CSEL_0 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_FALTIN5_FALT3CSEL_1 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_FALTIN5_FALT3CSEL_2 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_FALTIN5_FALT2CSEL ((uint32_t)0x00000070U) /* Bit[6:4] Analog comp x sellect for fault2 */ +#define SHRTIM_FALTIN5_FALT2CSEL_0 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_FALTIN5_FALT2CSEL_1 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_FALTIN5_FALT2CSEL_2 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_FALTIN5_FALT1CSEL ((uint32_t)0x00000007U) /* Bit[2:0] Analog comp x sellect for fault1 */ +#define SHRTIM_FALTIN5_FALT1CSEL_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_FALTIN5_FALT1CSEL_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_FALTIN5_FALT1CSEL_2 ((uint32_t)0x00000004U) /* Bit2 */ + +/** Bit definition for SHRTIM_EXEVCTRL5 register **/ +#define SHRTIM_EXEVCTRL5_EXEV10CSEL ((uint32_t)0x38000000U) /* Bit[29:27] Analog comp x sellect for external event 10 */ +#define SHRTIM_EXEVCTRL5_EXEV10CSEL_0 ((uint32_t)0x08000000U) /* Bit27 */ +#define SHRTIM_EXEVCTRL5_EXEV10CSEL_1 ((uint32_t)0x10000000U) /* Bit28 */ +#define SHRTIM_EXEVCTRL5_EXEV10CSEL_2 ((uint32_t)0x20000000U) /* Bit29 */ +#define SHRTIM_EXEVCTRL5_EXEV9CSEL ((uint32_t)0x07000000U) /* Bit[26:24] Analog comp x sellect for external event 9 */ +#define SHRTIM_EXEVCTRL5_EXEV9CSEL_0 ((uint32_t)0x01000000U) /* Bit24 */ +#define SHRTIM_EXEVCTRL5_EXEV9CSEL_1 ((uint32_t)0x02000000U) /* Bit25 */ +#define SHRTIM_EXEVCTRL5_EXEV9CSEL_2 ((uint32_t)0x04000000U) /* Bit26 */ +#define SHRTIM_EXEVCTRL5_EXEV8CSEL ((uint32_t)0x00E00000U) /* Bit[23:21] Analog comp x sellect for external event 8 */ +#define SHRTIM_EXEVCTRL5_EXEV8CSEL_0 ((uint32_t)0x00200000U) /* Bit21 */ +#define SHRTIM_EXEVCTRL5_EXEV8CSEL_1 ((uint32_t)0x00400000U) /* Bit22 */ +#define SHRTIM_EXEVCTRL5_EXEV8CSEL_2 ((uint32_t)0x00800000U) /* Bit23 */ +#define SHRTIM_EXEVCTRL5_EXEV7CSEL ((uint32_t)0x001C0000U) /* Bit[20:18] Analog comp x sellect for external event 7 */ +#define SHRTIM_EXEVCTRL5_EXEV7CSEL_0 ((uint32_t)0x00040000U) /* Bit18 */ +#define SHRTIM_EXEVCTRL5_EXEV7CSEL_1 ((uint32_t)0x00080000U) /* Bit19 */ +#define SHRTIM_EXEVCTRL5_EXEV7CSEL_2 ((uint32_t)0x00100000U) /* Bit20 */ +#define SHRTIM_EXEVCTRL5_EXEV6CSEL ((uint32_t)0x00038000U) /* Bit[17:15] Analog comp x sellect for external event 6 */ +#define SHRTIM_EXEVCTRL5_EXEV6CSEL_0 ((uint32_t)0x00008000U) /* Bit15 */ +#define SHRTIM_EXEVCTRL5_EXEV6CSEL_1 ((uint32_t)0x00010000U) /* Bit16 */ +#define SHRTIM_EXEVCTRL5_EXEV6CSEL_2 ((uint32_t)0x00020000U) /* Bit17 */ +#define SHRTIM_EXEVCTRL5_EXEV5CSEL ((uint32_t)0x00007000U) /* Bit[14:12] Analog comp x sellect for external event 5 */ +#define SHRTIM_EXEVCTRL5_EXEV5CSEL_0 ((uint32_t)0x00001000U) /* Bit12 */ +#define SHRTIM_EXEVCTRL5_EXEV5CSEL_1 ((uint32_t)0x00002000U) /* Bit13 */ +#define SHRTIM_EXEVCTRL5_EXEV5CSEL_2 ((uint32_t)0x00004000U) /* Bit14 */ +#define SHRTIM_EXEVCTRL5_EXEV4CSEL ((uint32_t)0x00000E00U) /* Bit[11:9] Analog comp x sellect for external event 4 */ +#define SHRTIM_EXEVCTRL5_EXEV4CSEL_0 ((uint32_t)0x00000200U) /* Bit9 */ +#define SHRTIM_EXEVCTRL5_EXEV4CSEL_1 ((uint32_t)0x00000400U) /* Bit10 */ +#define SHRTIM_EXEVCTRL5_EXEV4CSEL_2 ((uint32_t)0x00000800U) /* Bit11 */ +#define SHRTIM_EXEVCTRL5_EXEV3CSEL ((uint32_t)0x000001C0U) /* Bit[8:6] Analog comp x sellect for external event 3 */ +#define SHRTIM_EXEVCTRL5_EXEV3CSEL_0 ((uint32_t)0x00000040U) /* Bit6 */ +#define SHRTIM_EXEVCTRL5_EXEV3CSEL_1 ((uint32_t)0x00000080U) /* Bit7 */ +#define SHRTIM_EXEVCTRL5_EXEV3CSEL_2 ((uint32_t)0x00000100U) /* Bit8 */ +#define SHRTIM_EXEVCTRL5_EXEV2CSEL ((uint32_t)0x00000038U) /* Bit[5:3] Analog comp x sellect for external event 2 */ +#define SHRTIM_EXEVCTRL5_EXEV2CSEL_0 ((uint32_t)0x00000008U) /* Bit3 */ +#define SHRTIM_EXEVCTRL5_EXEV2CSEL_1 ((uint32_t)0x00000010U) /* Bit4 */ +#define SHRTIM_EXEVCTRL5_EXEV2CSEL_2 ((uint32_t)0x00000020U) /* Bit5 */ +#define SHRTIM_EXEVCTRL5_EXEV1CSEL ((uint32_t)0x00000007U) /* Bit[2:0] Analog comp x sellect for external event 1 */ +#define SHRTIM_EXEVCTRL5_EXEV1CSEL_0 ((uint32_t)0x00000001U) /* Bit0 */ +#define SHRTIM_EXEVCTRL5_EXEV1CSEL_1 ((uint32_t)0x00000002U) /* Bit1 */ +#define SHRTIM_EXEVCTRL5_EXEV1CSEL_2 ((uint32_t)0x00000004U) /* Bit2 */ + +/* Bit definition for SHRTIM_EXTEND register */ +#define SHRTIM_EXTEND_AUXBYPA ((uint32_t)0xC0000000U) /* Bit[31:30] Auxiliary output bypass */ +#define SHRTIM_EXTEND_AUXBYPA_0 ((uint32_t)0x40000000U) /* Bit30 */ +#define SHRTIM_EXTEND_AUXBYPA_1 ((uint32_t)0x80000000U) /* Bit31 */ + +/*** Low-Power Timer ***/ + +/** Bit definition for LPTIM_INTSTS register **/ +#define LPTIM_INTSTS_CMPM ((uint32_t)0x00000001U) /* Compare match */ +#define LPTIM_INTSTS_ARRM ((uint32_t)0x00000002U) /* Autoreload match */ +#define LPTIM_INTSTS_EXTRIG ((uint32_t)0x00000004U) /* External trigger edge event */ +#define LPTIM_INTSTS_CMPUPD ((uint32_t)0x00000008U) /* Compare register update OK */ +#define LPTIM_INTSTS_ARRUPD ((uint32_t)0x00000010U) /* Autoreload register update OK */ +#define LPTIM_INTSTS_UP ((uint32_t)0x00000020U) /* Counter direction change down to up */ +#define LPTIM_INTSTS_DOWN ((uint32_t)0x00000040U) /* Counter direction change up to down */ + +/** Bit definition for LPTIM_INTCLR register **/ +#define LPTIM_INTCLR_CMPMCF ((uint32_t)0x00000001U) /* Compare match Clear Flag */ +#define LPTIM_INTCLR_ARRMCF ((uint32_t)0x00000002U) /* Autoreload match Clear Flag */ +#define LPTIM_INTCLR_EXTRIGCF ((uint32_t)0x00000004U) /* External trigger edge event Clear Flag */ +#define LPTIM_INTCLR_CMPUPDCF ((uint32_t)0x00000008U) /* Compare register update OK Clear Flag */ +#define LPTIM_INTCLR_ARRUPDCF ((uint32_t)0x00000010U) /* Autoreload register update OK Clear Flag */ +#define LPTIM_INTCLR_UPCF ((uint32_t)0x00000020U) /* Counter direction change down to up Clear Flag */ +#define LPTIM_INTCLR_DOWNCF ((uint32_t)0x00000040U) /* Counter direction change up to down Clear Flag */ + +/** Bit definition for LPTIM_INTEN register **/ +#define LPTIM_INTEN_CMPMIE ((uint32_t)0x00000001U) /* Compare match Interrupt Enable */ +#define LPTIM_INTEN_ARRMIE ((uint32_t)0x00000002U) /* Autoreload match Interrupt Enable */ +#define LPTIM_INTEN_EXTRIGIE ((uint32_t)0x00000004U) /* External trigger edge event Interrupt Enable */ +#define LPTIM_INTEN_CMPUPDIE ((uint32_t)0x00000008U) /* Compare register update OK Interrupt Enable */ +#define LPTIM_INTEN_ARRUPDIE ((uint32_t)0x00000010U) /* Autoreload register update OK Interrupt Enable */ +#define LPTIM_INTEN_UPIE ((uint32_t)0x00000020U) /* Counter direction change down to up Interrupt Enable */ +#define LPTIM_INTEN_DOWNIE ((uint32_t)0x00000040U) /* Counter direction change up to down Interrupt Enable */ + +/** Bit definition for LPTIM_CFG register **/ +#define LPTIM_CFG_CLKSEL ((uint32_t)0x00000001U) /* Clock selector */ + +#define LPTIM_CFG_CLKPOL ((uint32_t)0x00000006U) /* CLKPOL[1:0] bits (Clock polarity) */ +#define LPTIM_CFG_CLKPOL_0 ((uint32_t)0x00000002U) /* CLKPOL bit 0 */ +#define LPTIM_CFG_CLKPOL_1 ((uint32_t)0x00000004U) /* CLKPOL bit 1 */ + +#define LPTIM_CFG_CLKFLT ((uint32_t)0x00000018U) /* CLKFLT[1:0] bits (Configurable digital filter for external clock) */ +#define LPTIM_CFG_CLKFLT_0 ((uint32_t)0x00000008U) /* CLKFLT bit 0 */ +#define LPTIM_CFG_CLKFLT_1 ((uint32_t)0x00000010U) /* CLKFLT bit 1 */ + +#define LPTIM_CFG_TRIGFLT ((uint32_t)0x000000C0U) /* TRIGFLT[1:0] bits (Configurable digital filter for trigger) */ +#define LPTIM_CFG_TRIGFLT_0 ((uint32_t)0x00000040U) /* TRIGFLT bit 0 */ +#define LPTIM_CFG_TRIGFLT_1 ((uint32_t)0x00000080U) /* TRIGFLT bit 1 */ + +#define LPTIM_CFG_CLKPRE ((uint32_t)0x00000E00U) /* CLKPRE[2:0] bits (Clock prescaler) */ +#define LPTIM_CFG_CLKPRE_0 ((uint32_t)0x00000200U) /* CLKPRE bit 0 */ +#define LPTIM_CFG_CLKPRE_1 ((uint32_t)0x00000400U) /* CLKPRE bit 1 */ +#define LPTIM_CFG_CLKPRE_2 ((uint32_t)0x00000800U) /* CLKPRE bit 2 */ + +#define LPTIM_CFG_TRGSEL ((uint32_t)0x0001E000U) /* TRGSEL[3:0]] bits (Trigger selector) */ +#define LPTIM_CFG_TRGSEL_0 ((uint32_t)0x00002000U) /* TRGSEL bit 0 */ +#define LPTIM_CFG_TRGSEL_1 ((uint32_t)0x00004000U) /* TRGSEL bit 1 */ +#define LPTIM_CFG_TRGSEL_2 ((uint32_t)0x00008000U) /* TRGSEL bit 2 */ +#define LPTIM_CFG_TRGSEL_3 ((uint32_t)0x00010000U) /* TRGSEL bit 3 */ + +#define LPTIM_CFG_TRGEN ((uint32_t)0x00060000U) /* TRGEN[1:0] bits (Trigger enable and polarity) */ +#define LPTIM_CFG_TRGEN_0 ((uint32_t)0x00020000U) /* TRGEN bit 0 */ +#define LPTIM_CFG_TRGEN_1 ((uint32_t)0x00040000U) /* TRGEN bit 1 */ + +#define LPTIM_CFG_TIMOUTEN ((uint32_t)0x00080000U) /* Timout enable */ +#define LPTIM_CFG_WAVE ((uint32_t)0x00100000U) /* Waveform shape */ +#define LPTIM_CFG_WAVEPOL ((uint32_t)0x00200000U) /* Waveform shape polarity */ +#define LPTIM_CFG_RELOAD ((uint32_t)0x00400000U) /* Reg update mode */ +#define LPTIM_CFG_CNTMEN ((uint32_t)0x00800000U) /* Counter mode enable */ +#define LPTIM_CFG_ENC ((uint32_t)0x01000000U) /* Encoder mode enable */ +#define LPTIM_CFG_NENC ((uint32_t)0x02000000U) /* NONEncoder mode enable */ + +/** Bit definition for LPTIM_CTRL register **/ +#define LPTIM_CTRL_LPTIMEN ((uint32_t)0x00000001U) /* LPTIMer enable */ +#define LPTIM_CTRL_SNGMST ((uint32_t)0x00000002U) /* Timer start in single mode */ +#define LPTIM_CTRL_TSTCM ((uint32_t)0x00000004U) /* Timer start in continuous mode */ + +/** Bit definition for LPTIM_CMP register **/ +#define LPTIM_CMP_CMPVAL ((uint16_t)0xFFFFU) /* Compare register */ + +/** Bit definition for LPTIM_ARR register **/ +#define LPTIM_ARR_ARRVAL ((uint16_t)0xFFFFU) /* Auto reload register */ + +/** Bit definition for LPTIM_CNT register **/ +#define LPTIM_CNT_CNTVAL ((uint16_t)0xFFFFU) /* Counter register */ + +/** Bit definition for LPTIM_OPT register **/ +#define LPTIM_OPT_OPT1 ((uint32_t)0x00000007U) /* OPT1[2:0]] bits (LPTIM input1 connection option bits) */ +#define LPTIM_OPT_OPT1_0 ((uint32_t)0x00000001U) /* OPT1 bit 0 */ +#define LPTIM_OPT_OPT1_1 ((uint32_t)0x00000002U) /* OPT1 bit 1 */ +#define LPTIM_OPT_OPT1_2 ((uint32_t)0x00000004U) /* OPT1 bit 2 */ +#define LPTIM_OPT_OPT2 ((uint32_t)0x00000038U) /* OPT2[2:0]] bits (LPTIM input2 connection option bits) */ +#define LPTIM_OPT_OPT2_0 ((uint32_t)0x00000008U) /* OPT2 bit 0 */ +#define LPTIM_OPT_OPT2_1 ((uint32_t)0x00000010U) /* OPT2 bit 1 */ +#define LPTIM_OPT_OPT2_2 ((uint32_t)0x00000020U) /* OPT2 bit 2 */ + + +/******** Bit definition for XSPI_CTRL0 register ********/ +#define XSPI_CTRL0_MST ((uint32_t)0x80000000U) /* Bit[31] */ +#define XSPI_CTRL0_MST_MASTER ((uint32_t)0x80000000U) +#define XSPI_CTRL0_MST_SLAVE ((uint32_t)0x00000000U) +#define XSPI_CTRL0_DWSEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define XSPI_CTRL0_SPIHYPEEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define XSPI_CTRL0_SPIFRF ((uint32_t)0x00C00000U) /* Bit[23:22] */ +#define XSPI_CTRL0_SPIFRF_0 ((uint32_t)0x00400000U) /* Bit22*/ +#define XSPI_CTRL0_SPIFRF_1 ((uint32_t)0x00800000U) /* Bit23*/ +#define XSPI_CTRL0_SPIFRF_STANDARD_FORMAT ((uint32_t)0x00000000U) +#define XSPI_CTRL0_SPIFRF_DUAL_FORMAT ((uint32_t)0x00400000U) +#define XSPI_CTRL0_SPIFRF_QUAD_FORMAT ((uint32_t)0x00800000U) +#define XSPI_CTRL0_SPIFRF_OCTAL_FORMAT ((uint32_t)0x00C00000U) + +#define XSPI_CTRL0_CFS ((uint32_t)0x000F0000U) /* Bit[19:16] */ +#define XSPI_CTRL0_CFS_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define XSPI_CTRL0_CFS_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define XSPI_CTRL0_CFS_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define XSPI_CTRL0_CFS_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define XSPI_CTRL0_CFS_1_BIT ((uint32_t)0x00000000U) +#define XSPI_CTRL0_CFS_2_BIT ((uint32_t)0x00010000U) +#define XSPI_CTRL0_CFS_3_BIT ((uint32_t)0x00020000U) +#define XSPI_CTRL0_CFS_4_BIT ((uint32_t)0x00030000U) +#define XSPI_CTRL0_CFS_5_BIT ((uint32_t)0x00040000U) +#define XSPI_CTRL0_CFS_6_BIT ((uint32_t)0x00050000U) +#define XSPI_CTRL0_CFS_7_BIT ((uint32_t)0x00060000U) +#define XSPI_CTRL0_CFS_8_BIT ((uint32_t)0x00070000U) +#define XSPI_CTRL0_CFS_9_BIT ((uint32_t)0x00080000U) +#define XSPI_CTRL0_CFS_10_BIT ((uint32_t)0x00090000U) +#define XSPI_CTRL0_CFS_11_BIT ((uint32_t)0x000A0000U) +#define XSPI_CTRL0_CFS_12_BIT ((uint32_t)0x000B0000U) +#define XSPI_CTRL0_CFS_13_BIT ((uint32_t)0x000C0000U) +#define XSPI_CTRL0_CFS_14_BIT ((uint32_t)0x000D0000U) +#define XSPI_CTRL0_CFS_15_BIT ((uint32_t)0x000E0000U) +#define XSPI_CTRL0_CFS_16_BIT ((uint32_t)0x000F0000U) + +#define XSPI_CTRL0_SSTE ((uint32_t)0x00004000U) /* Bit[14] */ +#define XSPI_CTRL0_SSTE_EN ((uint32_t)0x00004000U) /* SSTE(Slave Select Toggle Enable) */ +#define XSPI_CTRL0_SSTE_DISABLE ((uint32_t)0x00000000U) +#define XSPI_CTRL0_SRL ((uint32_t)0x00002000U) /* Bit[13] */ +#define XSPI_CTRL0_SRL_EN ((uint32_t)0x00002000U) /* SRL (Shift Register Loop) */ +#define XSPI_CTRL0_SLVOE ((uint32_t)0x00001000U) /* Bit[12] */ + +#define XSPI_CTRL0_TMOD ((uint32_t)0x00000C00U) /* Bit[11:10] */ +#define XSPI_CTRL0_TMOD_0 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_CTRL0_TMOD_1 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_CTRL0_TMOD_TX_AND_RX ((uint32_t)0x00000000U) +#define XSPI_CTRL0_TMOD_TX_ONLY ((uint32_t)0x00000400U) +#define XSPI_CTRL0_TMOD_RX_ONLY ((uint32_t)0x00000800U) +#define XSPI_CTRL0_TMOD_EEPROM_READ ((uint32_t)0x00000C00U) + +#define XSPI_CTRL0_SCPOL ((uint32_t)0x00000200U) /* Bit[9] */ +#define XSPI_CTRL0_SCPOL_LOW ((uint32_t)0x00000000U) +#define XSPI_CTRL0_SCPOL_HIGH ((uint32_t)0x00000200U) + +#define XSPI_CTRL0_SCPH ((uint32_t)0x00000100U) /* Bit[8] */ +#define XSPI_CTRL0_SCPH_FIRST_EDGE ((uint32_t)0x00000000U) +#define XSPI_CTRL0_SCPH_SECOND_EDGE ((uint32_t)0x00000100U) + +#define XSPI_CTRL0_FRF ((uint32_t)0x000000C0U) /* Bit[7:6] */ +#define XSPI_CTRL0_FRF_0 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_CTRL0_FRF_1 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_CTRL0_FRF_MOTOROLA ((uint32_t)0x00000000U) +#define XSPI_CTRL0_FRF_TI ((uint32_t)0x00000040U) +#define XSPI_CTRL0_FRF_MICROWIRE ((uint32_t)0x00000080U) + +#define XSPI_CTRL0_DFS ((uint32_t)0x0000001FU) /* Bit[4:0] */ +#define XSPI_CTRL0_DFS_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_CTRL0_DFS_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_CTRL0_DFS_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_CTRL0_DFS_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_CTRL0_DFS_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_CTRL0_DFS_4_BIT ((uint32_t)0x00000003U) +#define XSPI_CTRL0_DFS_5_BIT ((uint32_t)0x00000004U) +#define XSPI_CTRL0_DFS_6_BIT ((uint32_t)0x00000005U) +#define XSPI_CTRL0_DFS_7_BIT ((uint32_t)0x00000006U) +#define XSPI_CTRL0_DFS_8_BIT ((uint32_t)0x00000007U) +#define XSPI_CTRL0_DFS_9_BIT ((uint32_t)0x00000008U) +#define XSPI_CTRL0_DFS_10_BIT ((uint32_t)0x00000009U) +#define XSPI_CTRL0_DFS_11_BIT ((uint32_t)0x0000000AU) +#define XSPI_CTRL0_DFS_12_BIT ((uint32_t)0x0000000BU) +#define XSPI_CTRL0_DFS_13_BIT ((uint32_t)0x0000000CU) +#define XSPI_CTRL0_DFS_14_BIT ((uint32_t)0x0000000DU) +#define XSPI_CTRL0_DFS_15_BIT ((uint32_t)0x0000000EU) +#define XSPI_CTRL0_DFS_16_BIT ((uint32_t)0x0000000FU) +#define XSPI_CTRL0_DFS_17_BIT ((uint32_t)0x00000010U) +#define XSPI_CTRL0_DFS_18_BIT ((uint32_t)0x00000011U) +#define XSPI_CTRL0_DFS_19_BIT ((uint32_t)0x00000012U) +#define XSPI_CTRL0_DFS_20_BIT ((uint32_t)0x00000013U) +#define XSPI_CTRL0_DFS_21_BIT ((uint32_t)0x00000014U) +#define XSPI_CTRL0_DFS_22_BIT ((uint32_t)0x00000015U) +#define XSPI_CTRL0_DFS_23_BIT ((uint32_t)0x00000016U) +#define XSPI_CTRL0_DFS_24_BIT ((uint32_t)0x00000017U) +#define XSPI_CTRL0_DFS_25_BIT ((uint32_t)0x00000018U) +#define XSPI_CTRL0_DFS_26_BIT ((uint32_t)0x00000019U) +#define XSPI_CTRL0_DFS_27_BIT ((uint32_t)0x0000001AU) +#define XSPI_CTRL0_DFS_28_BIT ((uint32_t)0x0000001BU) +#define XSPI_CTRL0_DFS_29_BIT ((uint32_t)0x0000001CU) +#define XSPI_CTRL0_DFS_30_BIT ((uint32_t)0x0000001DU) +#define XSPI_CTRL0_DFS_31_BIT ((uint32_t)0x0000001EU) +#define XSPI_CTRL0_DFS_32_BIT ((uint32_t)0x0000001FU) + +/******** Bit definition for XSPI_CTRL1 register ********/ +#define XSPI_CTRL1_NDF ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ +#define XSPI_CTRL1_NDF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_CTRL1_NDF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_CTRL1_NDF_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_CTRL1_NDF_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_CTRL1_NDF_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_CTRL1_NDF_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_CTRL1_NDF_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_CTRL1_NDF_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_CTRL1_NDF_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_CTRL1_NDF_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_CTRL1_NDF_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_CTRL1_NDF_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_CTRL1_NDF_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_CTRL1_NDF_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_CTRL1_NDF_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_CTRL1_NDF_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/******** Bit definition for XSPI_EN register ********/ +#define XSPI_EN_XSPIEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for XSPI_MW_CTRL register ********/ +#define XSPI_MW_CTRL_MHSEN ((uint32_t)0x00000004U) /* Bit[2] */ + +#define XSPI_MW_CTRL_MCDIR ((uint32_t)0x00000002U) /* Bit[1] */ +#define XSPI_MW_CTRL_MCDIR_RX ((uint32_t)0x00000000U) +#define XSPI_MW_CTRL_MCDIR_TX ((uint32_t)0x00000002U) + +#define XSPI_MW_CTRL_MWMOD ((uint32_t)0x00000001U) /* Bit[0] */ +#define XSPI_MW_CTRL_MWMOD_UNSEQUENTIAL ((uint32_t)0x00000000U) +#define XSPI_MW_CTRL_MWMOD_SEQUENTIAL ((uint32_t)0x00000001U) + +/******** Bit definition for XSPI_SLAVE_EN register ********/ +#define XSPI_SLAVE_EN_SEN ((uint32_t)0x0000000FU) /* Bit[3:0] */ +#define XSPI_SLAVE_EN_SEN_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_SLAVE_EN_SEN_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_SLAVE_EN_SEN_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_SLAVE_EN_SEN_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for XSPI_BAUD register ********/ +#define XSPI_BAUD_CLKDIV ((uint32_t)0x0000FFFEU) /* Bit[15:1] */ +#define XSPI_BAUD_CLKDIV_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_BAUD_CLKDIV_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_BAUD_CLKDIV_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_BAUD_CLKDIV_3 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_BAUD_CLKDIV_4 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_BAUD_CLKDIV_5 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_BAUD_CLKDIV_6 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_BAUD_CLKDIV_7 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_BAUD_CLKDIV_8 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_BAUD_CLKDIV_9 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_BAUD_CLKDIV_10 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_BAUD_CLKDIV_11 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_BAUD_CLKDIV_12 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_BAUD_CLKDIV_13 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_BAUD_CLKDIV_14 ((uint32_t)0x00008000U) /* Bit15*/ + +/******** Bit definition for XSPI_TXFT register ********/ +#define XSPI_TXFT_TXFTST ((uint32_t)0x001F0000U) /* Bit[20:16] */ +#define XSPI_TXFT_TXFTST_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define XSPI_TXFT_TXFTST_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define XSPI_TXFT_TXFTST_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define XSPI_TXFT_TXFTST_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define XSPI_TXFT_TXFTST_4 ((uint32_t)0x00100000U) /* Bit20*/ + +#define XSPI_TXFT_TXFTTEI ((uint32_t)0x0000001FU) /* Bit[4:0] */ +#define XSPI_TXFT_TXFTTEI_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_TXFT_TXFTTEI_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_TXFT_TXFTTEI_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_TXFT_TXFTTEI_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_TXFT_TXFTTEI_4 ((uint32_t)0x00000010U) /* Bit4*/ + +/******** Bit definition for XSPI_RXFT register ********/ +#define XSPI_RXFT_RXFTTFI ((uint32_t)0x0000001FU) /* Bit[4:0] */ +#define XSPI_RXFT_RXFTTFI_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_RXFT_RXFTTFI_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_RXFT_RXFTTFI_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_RXFT_RXFTTFI_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_RXFT_RXFTTFI_4 ((uint32_t)0x00000010U) /* Bit4*/ + +/******** Bit definition for XSPI_TXFN register ********/ +#define XSPI_TXFN_TXFN ((uint32_t)0x0000003FU) /* Bit[5:0] */ +#define XSPI_TXFN_TXFN_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_TXFN_TXFN_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_TXFN_TXFN_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_TXFN_TXFN_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_TXFN_TXFN_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_TXFN_TXFN_5 ((uint32_t)0x00000020U) /* Bit5*/ + +/******** Bit definition for XSPI_RXFN register ********/ +#define XSPI_RXFN_RXFN ((uint32_t)0x0000003FU) /* Bit[5:0] */ +#define XSPI_RXFN_RXFN_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_RXFN_RXFN_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_RXFN_RXFN_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_RXFN_RXFN_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_RXFN_RXFN_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_RXFN_RXFN_5 ((uint32_t)0x00000020U) /* Bit5*/ + +/******** Bit definition for XSPI_STS register ********/ +#define XSPI_STS_CMPLTDDF ((uint32_t)0xFFFF8000U) /* Bit[31:15] */ +#define XSPI_STS_CMPLTDDF_0 ((uint32_t)0x00008000U) /* Bit15*/ +#define XSPI_STS_CMPLTDDF_1 ((uint32_t)0x00010000U) /* Bit16*/ +#define XSPI_STS_CMPLTDDF_2 ((uint32_t)0x00020000U) /* Bit17*/ +#define XSPI_STS_CMPLTDDF_3 ((uint32_t)0x00040000U) /* Bit18*/ +#define XSPI_STS_CMPLTDDF_4 ((uint32_t)0x00080000U) /* Bit19*/ +#define XSPI_STS_CMPLTDDF_5 ((uint32_t)0x00100000U) /* Bit20*/ +#define XSPI_STS_CMPLTDDF_6 ((uint32_t)0x00200000U) /* Bit21*/ +#define XSPI_STS_CMPLTDDF_7 ((uint32_t)0x00400000U) /* Bit22*/ +#define XSPI_STS_CMPLTDDF_8 ((uint32_t)0x00800000U) /* Bit23*/ +#define XSPI_STS_CMPLTDDF_9 ((uint32_t)0x01000000U) /* Bit24*/ +#define XSPI_STS_CMPLTDDF_10 ((uint32_t)0x02000000U) /* Bit25*/ +#define XSPI_STS_CMPLTDDF_11 ((uint32_t)0x04000000U) /* Bit26*/ +#define XSPI_STS_CMPLTDDF_12 ((uint32_t)0x08000000U) /* Bit27*/ +#define XSPI_STS_CMPLTDDF_13 ((uint32_t)0x10000000U) /* Bit28*/ +#define XSPI_STS_CMPLTDDF_14 ((uint32_t)0x20000000U) /* Bit29*/ +#define XSPI_STS_CMPLTDDF_15 ((uint32_t)0x40000000U) /* Bit30*/ +#define XSPI_STS_CMPLTDDF_16 ((uint32_t)0x80000000U) /* Bit31*/ + +#define XSPI_STS ((uint32_t)0x0000007FU) /* STS[6:0] (status flag) */ +#define XSPI_STS_DCERR ((uint32_t)0x00000040U) /* Bit[6] DCERR (Data Conflict Error)*/ +#define XSPI_STS_TXE ((uint32_t)0x00000020U) /* Bit[5] TXE (Transmit FIFO error)*/ +#define XSPI_STS_RXFF ((uint32_t)0x00000010U) /* Bit[4] RXFF (Receive FIFO not Full)*/ +#define XSPI_STS_RXFNE ((uint32_t)0x00000008U) /* Bit[3] RXFNE (Receive FIFO not Empty)*/ +#define XSPI_STS_TXFE ((uint32_t)0x00000004U) /* Bit[2] TXFE (Transmit FIFO not Empty)*/ +#define XSPI_STS_TXFNF ((uint32_t)0x00000002U) /* Bit[1] TXFNF (Transmit FIFO not Full)*/ +#define XSPI_STS_BUSY ((uint32_t)0x00000001U) /* Bit[0] BUSY (Transfer Busy Flag) */ + +/******** Bit definition for XSPI_IMASK register ********/ +#define XSPI_IMASK_DONEIM ((uint32_t)0x00000800U) /* Bit[11] */ +#define XSPI_IMASK_SPITEIM ((uint32_t)0x00000400U) /* Bit[10] */ +#define XSPI_IMASK_AXIEIM ((uint32_t)0x00000100U) /* Bit[8] */ +#define XSPI_IMASK_TXUIM ((uint32_t)0x00000080U) /* Bit[7] */ + +#define XSPI_IMASK ((uint32_t)0x0000007FU) /* IMASK[6:0] (Interrupt of Mask) */ +#define XSPI_IMASK_XRXOIM ((uint32_t)0x00000040U) /* Bit[6] */ +#define XSPI_IMASK_MMCIM ((uint32_t)0x00000020U) /* Bit[5] */ +#define XSPI_IMASK_RXFFIM ((uint32_t)0x00000010U) /* Bit[4] */ +#define XSPI_IMASK_RXFOIM ((uint32_t)0x00000008U) /* Bit[3] */ +#define XSPI_IMASK_RXFUIM ((uint32_t)0x00000004U) /* Bit[2] */ +#define XSPI_IMASK_TXFOIM ((uint32_t)0x00000002U) /* Bit[1] */ +#define XSPI_IMASK_TXFEIM ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for XSPI_ISTS register ********/ +#define XSPI_ISTS_DONEIS ((uint32_t)0x00000800U) /* Bit[11] */ +#define XSPI_ISTS_SPITEIS ((uint32_t)0x00000400U) /* Bit[10] */ +#define XSPI_ISTS_AXIEIS ((uint32_t)0x00000100U) /* Bit[8] */ +#define XSPI_ISTS_TXUIS ((uint32_t)0x00000080U) /* Bit[7] */ + +#define XSPI_ISTS ((uint32_t)0x0000007FU) /* All bits of interrupt stasus */ +#define XSPI_ISTS_XRXOIS ((uint32_t)0x00000040U) /* Bit[6] */ +#define XSPI_ISTS_MMCIS ((uint32_t)0x00000020U) /* Bit[5] */ +#define XSPI_ISTS_RXFFIS ((uint32_t)0x00000010U) /* Bit[4] */ +#define XSPI_ISTS_RXFOIS ((uint32_t)0x00000008U) /* Bit[3] */ +#define XSPI_ISTS_RXFUIS ((uint32_t)0x00000004U) /* Bit[2] */ +#define XSPI_ISTS_TXFOIS ((uint32_t)0x00000002U) /* Bit[1] */ +#define XSPI_ISTS_TXFEIS ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for XSPI_RISTS register ********/ +#define XSPI_RISTS_DONEIR ((uint32_t)0x00000800U) /* Bit[11] */ +#define XSPI_RISTS_SPITEIR ((uint32_t)0x00000400U) /* Bit[10] */ +#define XSPI_RISTS_AXIEIR ((uint32_t)0x00000100U) /* Bit[8] */ +#define XSPI_RISTS_TXUIR ((uint32_t)0x00000080U) /* Bit[7] */ + +#define XSPI_RISTS ((uint32_t)0x0000007FU) /* All bits of raw interrupt stasus */ +#define XSPI_RISTS_XRXORIS ((uint32_t)0x00000040U) /* Bit[6] */ +#define XSPI_RISTS_MMCRIS ((uint32_t)0x00000020U) /* Bit[5] */ +#define XSPI_RISTS_RXFFRIS ((uint32_t)0x00000010U) /* Bit[4] */ +#define XSPI_RISTS_RXFORIS ((uint32_t)0x00000008U) /* Bit[3] */ +#define XSPI_RISTS_RXFURIS ((uint32_t)0x00000004U) /* Bit[2] */ +#define XSPI_RISTS_TXFORIS ((uint32_t)0x00000002U) /* Bit[1] */ +#define XSPI_RISTS_TXFERIS ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for XSPI_TXEICR_CLR register ********/ +#define XSPI_TXEICR_CLR_TXEICR ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for XSPI_RXFOI_CLR register ********/ +#define XSPI_RXFOI_CLR_RXFOIC ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for XSPI_RXFUI_CLR register ********/ +#define XSPI_RXFUI_CLR_RXFUIC ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for XSPI_MMC_CLR register ********/ +#define XSPI_MMC_CLR_MMCIC ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for XSPI_ICLR register ********/ +#define XSPI_ICLR_INTC ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for XSPI_DMA_CTRL register ********/ +#define XSPI_DMA_CTRL_AID ((uint32_t)0x001F8000U) /* Bit[20:15] */ +#define XSPI_DMA_CTRL_AID_0 ((uint32_t)0x00008000U) /* Bit15*/ +#define XSPI_DMA_CTRL_AID_1 ((uint32_t)0x00010000U) /* Bit16*/ +#define XSPI_DMA_CTRL_AID_2 ((uint32_t)0x00020000U) /* Bit17*/ +#define XSPI_DMA_CTRL_AID_3 ((uint32_t)0x00040000U) /* Bit18*/ +#define XSPI_DMA_CTRL_AID_4 ((uint32_t)0x00080000U) /* Bit19*/ +#define XSPI_DMA_CTRL_AID_5 ((uint32_t)0x00100000U) /* Bit20*/ +#define XSPI_DMA_CTRL_APROT ((uint32_t)0x00007000U) /* Bit[14:12] */ +#define XSPI_DMA_CTRL_APROT_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_DMA_CTRL_APROT_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_DMA_CTRL_APROT_2 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_DMA_CTRL_ACACHE ((uint32_t)0x00000F00U) /* Bit[11:8] */ +#define XSPI_DMA_CTRL_ACACHE_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_DMA_CTRL_ACACHE_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_DMA_CTRL_ACACHE_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_DMA_CTRL_ACACHE_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_DMA_CTRL_AINC ((uint32_t)0x00000040U) /* Bit[6] */ +#define XSPI_DMA_CTRL_ATW ((uint32_t)0x00000018U) /* Bit[4:3] */ +#define XSPI_DMA_CTRL_ATW_0 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_DMA_CTRL_ATW_1 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_DMA_CTRL_IDMAE ((uint32_t)0x00000004U) /* Bit[2] */ +#define XSPI_DMA_CTRL_TXDMAEN ((uint32_t)0x00000002U) /* Bit[1] */ +#define XSPI_DMA_CTRL_RXDMAEN ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for XSPI_DMATDL_CTRL register ********/ +#define XSPI_DMATDL_CTRL_DMATDL ((uint32_t)0x0000001FU) /* Bit[4:0] */ +#define XSPI_DMATDL_CTRL_DMATDL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_DMATDL_CTRL_DMATDL_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_DMATDL_CTRL_DMATDL_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_DMATDL_CTRL_DMATDL_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_DMATDL_CTRL_DMATDL_4 ((uint32_t)0x00000010U) /* Bit4*/ + +/******** Bit definition for XSPI_DMARDL_CTRL register ********/ +#define XSPI_DMARDL_CTRL_DMARDL ((uint32_t)0x0000001FU) /* Bit[4:0] */ +#define XSPI_DMARDL_CTRL_DMARDL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_DMARDL_CTRL_DMARDL_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_DMARDL_CTRL_DMARDL_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_DMARDL_CTRL_DMARDL_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_DMARDL_CTRL_DMARDL_4 ((uint32_t)0x00000010U) /* Bit4*/ + +/******** Bit definition for XSPI_IDR register ********/ +#define XSPI_IDR_IDCODE ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define XSPI_IDR_IDCODE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_IDR_IDCODE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_IDR_IDCODE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_IDR_IDCODE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_IDR_IDCODE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_IDR_IDCODE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_IDR_IDCODE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_IDR_IDCODE_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_IDR_IDCODE_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_IDR_IDCODE_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_IDR_IDCODE_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_IDR_IDCODE_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_IDR_IDCODE_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_IDR_IDCODE_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_IDR_IDCODE_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_IDR_IDCODE_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define XSPI_IDR_IDCODE_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define XSPI_IDR_IDCODE_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define XSPI_IDR_IDCODE_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define XSPI_IDR_IDCODE_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define XSPI_IDR_IDCODE_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define XSPI_IDR_IDCODE_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define XSPI_IDR_IDCODE_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define XSPI_IDR_IDCODE_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define XSPI_IDR_IDCODE_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define XSPI_IDR_IDCODE_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define XSPI_IDR_IDCODE_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define XSPI_IDR_IDCODE_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define XSPI_IDR_IDCODE_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define XSPI_IDR_IDCODE_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define XSPI_IDR_IDCODE_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define XSPI_IDR_IDCODE_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for XSPI_VERSION_ID register ********/ +#define XSPI_VERSION_ID_VERSION ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define XSPI_VERSION_ID_VERSION_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_VERSION_ID_VERSION_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_VERSION_ID_VERSION_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_VERSION_ID_VERSION_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_VERSION_ID_VERSION_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_VERSION_ID_VERSION_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_VERSION_ID_VERSION_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_VERSION_ID_VERSION_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_VERSION_ID_VERSION_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_VERSION_ID_VERSION_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_VERSION_ID_VERSION_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_VERSION_ID_VERSION_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_VERSION_ID_VERSION_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_VERSION_ID_VERSION_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_VERSION_ID_VERSION_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_VERSION_ID_VERSION_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define XSPI_VERSION_ID_VERSION_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define XSPI_VERSION_ID_VERSION_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define XSPI_VERSION_ID_VERSION_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define XSPI_VERSION_ID_VERSION_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define XSPI_VERSION_ID_VERSION_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define XSPI_VERSION_ID_VERSION_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define XSPI_VERSION_ID_VERSION_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define XSPI_VERSION_ID_VERSION_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define XSPI_VERSION_ID_VERSION_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define XSPI_VERSION_ID_VERSION_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define XSPI_VERSION_ID_VERSION_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define XSPI_VERSION_ID_VERSION_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define XSPI_VERSION_ID_VERSION_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define XSPI_VERSION_ID_VERSION_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define XSPI_VERSION_ID_VERSION_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define XSPI_VERSION_ID_VERSION_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for XSPI_DATx register ********/ +#define XSPI_DATx_DATx ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define XSPI_DATx_DATx_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_DATx_DATx_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_DATx_DATx_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_DATx_DATx_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_DATx_DATx_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_DATx_DATx_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_DATx_DATx_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_DATx_DATx_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_DATx_DATx_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_DATx_DATx_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_DATx_DATx_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_DATx_DATx_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_DATx_DATx_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_DATx_DATx_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_DATx_DATx_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_DATx_DATx_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define XSPI_DATx_DATx_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define XSPI_DATx_DATx_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define XSPI_DATx_DATx_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define XSPI_DATx_DATx_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define XSPI_DATx_DATx_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define XSPI_DATx_DATx_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define XSPI_DATx_DATx_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define XSPI_DATx_DATx_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define XSPI_DATx_DATx_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define XSPI_DATx_DATx_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define XSPI_DATx_DATx_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define XSPI_DATx_DATx_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define XSPI_DATx_DATx_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define XSPI_DATx_DATx_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define XSPI_DATx_DATx_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define XSPI_DATx_DATx_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for XSPI_RX_DELAY register ********/ +#define XSPI_RX_DELAY_SES ((uint32_t)0x00010000U) /* Bit[16] */ +#define XSPI_RX_DELAY_SES_RISING_EDGE ((uint32_t)0x00000000U) +#define XSPI_RX_DELAY_SES_FALLING_EDGE ((uint32_t)0x00010000U) + +#define XSPI_RX_DELAY_SDCN ((uint32_t)0x000000FFU) /* Bit[7:0] */ +#define XSPI_RX_DELAY_SDCN_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_RX_DELAY_SDCN_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_RX_DELAY_SDCN_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_RX_DELAY_SDCN_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_RX_DELAY_SDCN_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_RX_DELAY_SDCN_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_RX_DELAY_SDCN_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_RX_DELAY_SDCN_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_RX_DELAY_SDCN_0_CYCLES ((uint32_t)0x00000000U) +#define XSPI_RX_DELAY_SDCN_1_CYCLES ((uint32_t)0x00000001U) +#define XSPI_RX_DELAY_SDCN_2_CYCLES ((uint32_t)0x00000002U) +#define XSPI_RX_DELAY_SDCN_3_CYCLES ((uint32_t)0x00000003U) +#define XSPI_RX_DELAY_SDCN_4_CYCLES ((uint32_t)0x00000004U) +#define XSPI_RX_DELAY_SDCN_5_CYCLES ((uint32_t)0x00000005U) +#define XSPI_RX_DELAY_SDCN_6_CYCLES ((uint32_t)0x00000006U) + +/******** Bit definition for XSPI_ENH_CTRL0 register ********/ +#define XSPI_ENH_CTRL0_CLKSTREN ((uint32_t)0x40000000U) /* Bit[30] */ +#define XSPI_ENH_CTRL0_XIPPREEN ((uint32_t)0x20000000U) /* Bit[29] */ +#define XSPI_ENH_CTRL0_XIPMBL ((uint32_t)0x0C000000U) /* Bit[27:26] */ +#define XSPI_ENH_CTRL0_XIPMBL_0 ((uint32_t)0x04000000U) /* Bit26*/ +#define XSPI_ENH_CTRL0_XIPMBL_1 ((uint32_t)0x08000000U) /* Bit27*/ +#define XSPI_ENH_CTRL0_RXDSSIGEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define XSPI_ENH_CTRL0_SPIDMEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define XSPI_ENH_CTRL0_XIPCTEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define XSPI_ENH_CTRL0_XIPINSTEN ((uint32_t)0x00100000U) /* Bit[20] */ +#define XSPI_ENH_CTRL0_XIPDFSHC ((uint32_t)0x00080000U) /* Bit[19] */ + +#define XSPI_ENH_CTRL0_SPIRXDSEN ((uint32_t)0x00040000U) /* Bit[18] */ +#define XSPI_ENH_CTRL0_WRINDDREN ((uint32_t)0x00020000U) /* Bit[17] */ +#define XSPI_ENH_CTRL0_WRSPIDDREN ((uint32_t)0x00010000U) /* Bit[16] */ + +#define XSPI_ENH_CTRL0_WAITCYCLES ((uint32_t)0x0000F800U) /* Bit[15:11] */ +#define XSPI_ENH_CTRL0_WAITCYCLES_0 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_ENH_CTRL0_WAITCYCLES_1 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_ENH_CTRL0_WAITCYCLES_2 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_ENH_CTRL0_WAITCYCLES_3 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_ENH_CTRL0_WAITCYCLES_4 ((uint32_t)0x00008000U) /* Bit15*/ +#define XSPI_ENH_CTRL0_WAIT_1CYCLES ((uint32_t)0x00000800U) +#define XSPI_ENH_CTRL0_WAIT_2CYCLES ((uint32_t)0x00001000U) +#define XSPI_ENH_CTRL0_WAIT_3CYCLES ((uint32_t)0x00001800U) +#define XSPI_ENH_CTRL0_WAIT_4CYCLES ((uint32_t)0x00002000U) +#define XSPI_ENH_CTRL0_WAIT_5CYCLES ((uint32_t)0x00002800U) +#define XSPI_ENH_CTRL0_WAIT_6CYCLES ((uint32_t)0x00003000U) +#define XSPI_ENH_CTRL0_WAIT_7CYCLES ((uint32_t)0x00003800U) +#define XSPI_ENH_CTRL0_WAIT_8CYCLES ((uint32_t)0x00004000U) +#define XSPI_ENH_CTRL0_WAIT_9CYCLES ((uint32_t)0x00004800U) +#define XSPI_ENH_CTRL0_WAIT_10CYCLES ((uint32_t)0x00005000U) +#define XSPI_ENH_CTRL0_WAIT_11CYCLES ((uint32_t)0x00005800U) +#define XSPI_ENH_CTRL0_WAIT_12CYCLES ((uint32_t)0x00006000U) +#define XSPI_ENH_CTRL0_WAIT_13CYCLES ((uint32_t)0x00006800U) +#define XSPI_ENH_CTRL0_WAIT_14CYCLES ((uint32_t)0x00007000U) +#define XSPI_ENH_CTRL0_WAIT_15CYCLES ((uint32_t)0x00007800U) +#define XSPI_ENH_CTRL0_WAIT_16CYCLES ((uint32_t)0x00008000U) +#define XSPI_ENH_CTRL0_WAIT_17CYCLES ((uint32_t)0x00008800U) +#define XSPI_ENH_CTRL0_WAIT_18CYCLES ((uint32_t)0x00009000U) +#define XSPI_ENH_CTRL0_WAIT_19CYCLES ((uint32_t)0x00009800U) +#define XSPI_ENH_CTRL0_WAIT_20CYCLES ((uint32_t)0x0000A000U) +#define XSPI_ENH_CTRL0_WAIT_21CYCLES ((uint32_t)0x0000A800U) +#define XSPI_ENH_CTRL0_WAIT_22CYCLES ((uint32_t)0x0000B000U) +#define XSPI_ENH_CTRL0_WAIT_23CYCLES ((uint32_t)0x0000B800U) +#define XSPI_ENH_CTRL0_WAIT_24CYCLES ((uint32_t)0x0000C000U) +#define XSPI_ENH_CTRL0_WAIT_25CYCLES ((uint32_t)0x0000C800U) +#define XSPI_ENH_CTRL0_WAIT_26CYCLES ((uint32_t)0x0000D000U) +#define XSPI_ENH_CTRL0_WAIT_27CYCLES ((uint32_t)0x0000D800U) +#define XSPI_ENH_CTRL0_WAIT_28CYCLES ((uint32_t)0x0000E000U) +#define XSPI_ENH_CTRL0_WAIT_29CYCLES ((uint32_t)0x0000E800U) +#define XSPI_ENH_CTRL0_WAIT_30CYCLES ((uint32_t)0x0000F000U) +#define XSPI_ENH_CTRL0_WAIT_31CYCLES ((uint32_t)0x0000F800U) + +#define XSPI_ENH_CTRL0_INSTL ((uint32_t)0x00000300U) /* Bit[9:8] */ +#define XSPI_ENH_CTRL0_INSTL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_ENH_CTRL0_INSTL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_ENH_CTRL0_INST_L_0_LINE ((uint32_t)0x00000000U) +#define XSPI_ENH_CTRL0_INST_L_4_LINE ((uint32_t)0x00000100U) +#define XSPI_ENH_CTRL0_INST_L_8_LINE ((uint32_t)0x00000200U) +#define XSPI_ENH_CTRL0_INST_L_16_LINE ((uint32_t)0x00000300U) + +#define XSPI_ENH_CTRL0_XIPMDBEN ((uint32_t)0x00000080U) /* Bit[7] */ + +#define XSPI_ENH_CTRL0_ADDRLEN ((uint32_t)0x0000003CU) /* Bit[5:2] */ +#define XSPI_ENH_CTRL0_ADDRLEN_0 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_ENH_CTRL0_ADDRLEN_1 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_ENH_CTRL0_ADDRLEN_2 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_ENH_CTRL0_ADDRLEN_3 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_ENH_CTRL0_ADDRLEN_4_BIT ((uint32_t)0x00000004U) +#define XSPI_ENH_CTRL0_ADDRLEN_8_BIT ((uint32_t)0x00000008U) +#define XSPI_ENH_CTRL0_ADDRLEN_12_BIT ((uint32_t)0x0000000CU) +#define XSPI_ENH_CTRL0_ADDRLEN_16_BIT ((uint32_t)0x00000010U) +#define XSPI_ENH_CTRL0_ADDRLEN_20_BIT ((uint32_t)0x00000014U) +#define XSPI_ENH_CTRL0_ADDRLEN_24_BIT ((uint32_t)0x00000018U) +#define XSPI_ENH_CTRL0_ADDRLEN_28_BIT ((uint32_t)0x0000001CU) +#define XSPI_ENH_CTRL0_ADDRLEN_32_BIT ((uint32_t)0x00000020U) +#define XSPI_ENH_CTRL0_ADDRLEN_36_BIT ((uint32_t)0x00000024U) +#define XSPI_ENH_CTRL0_ADDRLEN_40_BIT ((uint32_t)0x00000028U) +#define XSPI_ENH_CTRL0_ADDRLEN_44_BIT ((uint32_t)0x0000002CU) +#define XSPI_ENH_CTRL0_ADDRLEN_48_BIT ((uint32_t)0x00000030U) +#define XSPI_ENH_CTRL0_ADDRLEN_52_BIT ((uint32_t)0x00000034U) +#define XSPI_ENH_CTRL0_ADDRLEN_56_BIT ((uint32_t)0x00000038U) +#define XSPI_ENH_CTRL0_ADDRLEN_60_BIT ((uint32_t)0x0000003CU) + +#define XSPI_ENH_CTRL0_TRANSTYPE ((uint32_t)0x00000003U) /* Bit[1:0] */ +#define XSPI_ENH_CTRL0_TRANSTYPE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_ENH_CTRL0_TRANSTYPE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_ENH_CTRL0_TRANSTYPE_STANDARD ((uint32_t)0x00000000U) +#define XSPI_ENH_CTRL0_TRANSTYPE_ADDRESS_BY_FRF ((uint32_t)0x00000001U) +#define XSPI_ENH_CTRL0_TRANSTYPE_ALL_BY_FRF ((uint32_t)0x00000002U) +/******** Bit definition for XSPI_DDR_TXDE register ********/ +#define XSPI_DDR_TXDE_TXDE ((uint32_t)0x000000FFU) /* Bit[7:0] */ +#define XSPI_DDR_TXDE_TXDE_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_DDR_TXDE_TXDE_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_DDR_TXDE_TXDE_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_DDR_TXDE_TXDE_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_DDR_TXDE_TXDE_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_DDR_TXDE_TXDE_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_DDR_TXDE_TXDE_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_DDR_TXDE_TXDE_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/******** Bit definition for XSPI_XIP_MODE register ********/ +#define XSPI_XIP_MODE_XIPMDBITS ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ +#define XSPI_XIP_MODE_XIPMDBITS_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_XIP_MODE_XIPMDBITS_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_XIP_MODE_XIPMDBITS_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_XIP_MODE_XIPMDBITS_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_XIP_MODE_XIPMDBITS_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_XIP_MODE_XIPMDBITS_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_XIP_MODE_XIPMDBITS_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_XIP_MODE_XIPMDBITS_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_XIP_MODE_XIPMDBITS_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_XIP_MODE_XIPMDBITS_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_XIP_MODE_XIPMDBITS_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_XIP_MODE_XIPMDBITS_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_XIP_MODE_XIPMDBITS_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_XIP_MODE_XIPMDBITS_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_XIP_MODE_XIPMDBITS_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_XIP_MODE_XIPMDBITS_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/******** Bit definition for XSPI_XIP_INCR_TOC register ********/ +#define XSPI_XIP_INCR_TOC_ITOC ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ +#define XSPI_XIP_INCR_TOC_ITOC_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_XIP_INCR_TOC_ITOC_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_XIP_INCR_TOC_ITOC_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_XIP_INCR_TOC_ITOC_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_XIP_INCR_TOC_ITOC_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_XIP_INCR_TOC_ITOC_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_XIP_INCR_TOC_ITOC_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_XIP_INCR_TOC_ITOC_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_XIP_INCR_TOC_ITOC_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_XIP_INCR_TOC_ITOC_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_XIP_INCR_TOC_ITOC_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_XIP_INCR_TOC_ITOC_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_XIP_INCR_TOC_ITOC_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_XIP_INCR_TOC_ITOC_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_XIP_INCR_TOC_ITOC_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_XIP_INCR_TOC_ITOC_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/******** Bit definition for XSPI_XIP_WRAP_TOC register ********/ +#define XSPI_XIP_WRAP_TOC_WTOC ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ +#define XSPI_XIP_WRAP_TOC_WTOC_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_XIP_WRAP_TOC_WTOC_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_XIP_WRAP_TOC_WTOC_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_XIP_WRAP_TOC_WTOC_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_XIP_WRAP_TOC_WTOC_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_XIP_WRAP_TOC_WTOC_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_XIP_WRAP_TOC_WTOC_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_XIP_WRAP_TOC_WTOC_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_XIP_WRAP_TOC_WTOC_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_XIP_WRAP_TOC_WTOC_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_XIP_WRAP_TOC_WTOC_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_XIP_WRAP_TOC_WTOC_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_XIP_WRAP_TOC_WTOC_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_XIP_WRAP_TOC_WTOC_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_XIP_WRAP_TOC_WTOC_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_XIP_WRAP_TOC_WTOC_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/******** Bit definition for XSPI_XIP_CTRL register ********/ +#define XSPI_XIP_CTRL_XIPPREEN ((uint32_t)0x20000000U) /* Bit[29] */ + +#define XSPI_XIP_CTRL_XIPMBL ((uint32_t)0x0C000000U) /* Bit[27:26] */ +#define XSPI_XIP_CTRL_XIPMBL_0 ((uint32_t)0x04000000U) /* Bit26*/ +#define XSPI_XIP_CTRL_XIPMBL_1 ((uint32_t)0x08000000U) /* Bit27*/ +#define XSPI_XIP_CTRL_XIPMBL_LEN_2_BIT ((uint32_t)0x00000000U) +#define XSPI_XIP_CTRL_XIPMBL_LEN_4_BIT ((uint32_t)0x04000000U) +#define XSPI_XIP_CTRL_XIPMBL_LEN_8_BIT ((uint32_t)0x08000000U) +#define XSPI_XIP_CTRL_XIPMBL_LEN_16_BIT ((uint32_t)0x0C000000U) + +#define XSPI_XIP_CTRL_RXDSSIGEN ((uint32_t)0x02000000U) /* Bit[25] */ +#define XSPI_XIP_CTRL_XIPHYPEEN ((uint32_t)0x01000000U) /* Bit[24] */ +#define XSPI_XIP_CTRL_XIPCTEN ((uint32_t)0x00800000U) /* Bit[23] */ +#define XSPI_XIP_CTRL_XIPINSTEN ((uint32_t)0x00400000U) /* Bit[22] */ +#define XSPI_XIP_CTRL_RXDSEN ((uint32_t)0x00200000U) /* Bit[21] */ +#define XSPI_XIP_CTRL_WRINDDREN ((uint32_t)0x00100000U) /* Bit[20] */ +#define XSPI_XIP_CTRL_DDREN ((uint32_t)0x00080000U) /* Bit[19] */ +#define XSPI_XIP_CTRL_DFSHC ((uint32_t)0x00040000U) /* Bit[18] */ + +#define XSPI_XIP_CTRL_WAITCYCLES ((uint32_t)0x0003E000U) /* Bit[17:13] */ +#define XSPI_XIP_CTRL_WAITCYCLES_0 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_XIP_CTRL_WAITCYCLES_1 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_XIP_CTRL_WAITCYCLES_2 ((uint32_t)0x00008000U) /* Bit15*/ +#define XSPI_XIP_CTRL_WAITCYCLES_3 ((uint32_t)0x00010000U) /* Bit16*/ +#define XSPI_XIP_CTRL_WAITCYCLES_4 ((uint32_t)0x00020000U) /* Bit17*/ +#define XSPI_XIP_CTRL_WAIT_1CYCLES ((uint32_t)0x00002000U) +#define XSPI_XIP_CTRL_WAIT_2CYCLES ((uint32_t)0x00004000U) +#define XSPI_XIP_CTRL_WAIT_3CYCLES ((uint32_t)0x00006000U) +#define XSPI_XIP_CTRL_WAIT_4CYCLES ((uint32_t)0x00008000U) +#define XSPI_XIP_CTRL_WAIT_5CYCLES ((uint32_t)0x0000A000U) +#define XSPI_XIP_CTRL_WAIT_6CYCLES ((uint32_t)0x0000C000U) +#define XSPI_XIP_CTRL_WAIT_7CYCLES ((uint32_t)0x0000E000U) +#define XSPI_XIP_CTRL_WAIT_8CYCLES ((uint32_t)0x00010000U) +#define XSPI_XIP_CTRL_WAIT_9CYCLES ((uint32_t)0x00012000U) +#define XSPI_XIP_CTRL_WAIT_10CYCLES ((uint32_t)0x00014000U) +#define XSPI_XIP_CTRL_WAIT_11CYCLES ((uint32_t)0x00016000U) +#define XSPI_XIP_CTRL_WAIT_12CYCLES ((uint32_t)0x00018000U) +#define XSPI_XIP_CTRL_WAIT_13CYCLES ((uint32_t)0x0001A000U) +#define XSPI_XIP_CTRL_WAIT_14CYCLES ((uint32_t)0x0001C000U) +#define XSPI_XIP_CTRL_WAIT_15CYCLES ((uint32_t)0x0001E000U) +#define XSPI_XIP_CTRL_WAIT_16CYCLES ((uint32_t)0x00020000U) +#define XSPI_XIP_CTRL_WAIT_17CYCLES ((uint32_t)0x00022000U) +#define XSPI_XIP_CTRL_WAIT_18CYCLES ((uint32_t)0x00024000U) +#define XSPI_XIP_CTRL_WAIT_19CYCLES ((uint32_t)0x00026000U) +#define XSPI_XIP_CTRL_WAIT_20CYCLES ((uint32_t)0x00028000U) +#define XSPI_XIP_CTRL_WAIT_21CYCLES ((uint32_t)0x0002A000U) +#define XSPI_XIP_CTRL_WAIT_22CYCLES ((uint32_t)0x0002C000U) +#define XSPI_XIP_CTRL_WAIT_23CYCLES ((uint32_t)0x0002E000U) +#define XSPI_XIP_CTRL_WAIT_24CYCLES ((uint32_t)0x00030000U) +#define XSPI_XIP_CTRL_WAIT_25CYCLES ((uint32_t)0x00032000U) +#define XSPI_XIP_CTRL_WAIT_26CYCLES ((uint32_t)0x00034000U) +#define XSPI_XIP_CTRL_WAIT_27CYCLES ((uint32_t)0x00036000U) +#define XSPI_XIP_CTRL_WAIT_28CYCLES ((uint32_t)0x00038000U) +#define XSPI_XIP_CTRL_WAIT_29CYCLES ((uint32_t)0x0003A000U) +#define XSPI_XIP_CTRL_WAIT_30CYCLES ((uint32_t)0x0003C000U) +#define XSPI_XIP_CTRL_WAIT_31CYCLES ((uint32_t)0x0003E000U) + +#define XSPI_XIP_CTRL_MDBITSEN ((uint32_t)0x00001000U) /* Bit[12] */ + +#define XSPI_XIP_CTRL_INSTL ((uint32_t)0x00000600U) /* Bit[10:9] */ +#define XSPI_XIP_CTRL_INSTL_0 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_XIP_CTRL_INSTL_1 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_XIP_CTRL_INSTL_0_LINE ((uint32_t)0x00000000U) +#define XSPI_XIP_CTRL_INSTL_4_LINE ((uint32_t)0x00000200U) +#define XSPI_XIP_CTRL_INSTL_8_LINE ((uint32_t)0x00000400U) +#define XSPI_XIP_CTRL_INSTL_16_LINE ((uint32_t)0x00000600U) + +#define XSPI_XIP_CTRL_ADDRL ((uint32_t)0x000000F0U) /* Bit[7:4] */ +#define XSPI_XIP_CTRL_ADDRL_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_XIP_CTRL_ADDRL_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_XIP_CTRL_ADDRL_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_XIP_CTRL_ADDRL_3 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_XIP_CTRL_ADDR_4BIT ((uint32_t)0x00000010U) +#define XSPI_XIP_CTRL_ADDR_8BIT ((uint32_t)0x00000020U) +#define XSPI_XIP_CTRL_ADDR_12BIT ((uint32_t)0x00000030U) +#define XSPI_XIP_CTRL_ADDR_16BIT ((uint32_t)0x00000040U) +#define XSPI_XIP_CTRL_ADDR_20BIT ((uint32_t)0x00000050U) +#define XSPI_XIP_CTRL_ADDR_24BIT ((uint32_t)0x00000060U) +#define XSPI_XIP_CTRL_ADDR_28BIT ((uint32_t)0x00000070U) +#define XSPI_XIP_CTRL_ADDR_32BIT ((uint32_t)0x00000080U) +#define XSPI_XIP_CTRL_ADDR_36BIT ((uint32_t)0x00000090U) +#define XSPI_XIP_CTRL_ADDR_40BIT ((uint32_t)0x000000A0U) +#define XSPI_XIP_CTRL_ADDR_44BIT ((uint32_t)0x000000B0U) +#define XSPI_XIP_CTRL_ADDR_48BIT ((uint32_t)0x000000C0U) +#define XSPI_XIP_CTRL_ADDR_52BIT ((uint32_t)0x000000D0U) +#define XSPI_XIP_CTRL_ADDR_56BIT ((uint32_t)0x000000E0U) +#define XSPI_XIP_CTRL_ADDR_60BIT ((uint32_t)0x000000F0U) + +#define XSPI_XIP_CTRL_TRANSTYPE ((uint32_t)0x0000000CU) /* Bit[3:2] */ +#define XSPI_XIP_CTRL_TRANSTYPE_0 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_XIP_CTRL_TRANSTYPE_1 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_XIP_CTRL_TRANSTYPE_STANDARD_SPI ((uint32_t)0x00000000U) +#define XSPI_XIP_CTRL_TRANSTYPE_ADDRESS_BY_XIP_FRF ((uint32_t)0x00000004U) +#define XSPI_XIP_CTRL_TRANSTYPE_INSTRUCT_BY_XIP_FRF ((uint32_t)0x00000008U) + +#define XSPI_XIP_CTRL_FRF ((uint32_t)0x00000003U) /* Bit[1:0] */ +#define XSPI_XIP_CTRL_FRF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_XIP_CTRL_FRF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_XIP_CTRL_FRF_2_LINE ((uint32_t)0x00000001U) +#define XSPI_XIP_CTRL_FRF_4_LINE ((uint32_t)0x00000002U) + +/******** Bit definition for XSPI_XIP_SLAVE_EN register ********/ +#define XSPI_XIP_SLAVE_EN_SEN ((uint32_t)0x0000000FU) /* Bit[3:0] */ +#define XSPI_XIP_SLAVE_EN_SEN_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_XIP_SLAVE_EN_SEN_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_XIP_SLAVE_EN_SEN_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_XIP_SLAVE_EN_SEN_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for XSPI_XIP_RXFOI_CLR register ********/ +#define XSPI_XIP_RXFOI_CLR_XRXFOIC ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for XSPI_XIP_TOUT register ********/ +#define XSPI_XIP_TOUT_XTOUT ((uint32_t)0x000000FFU) /* Bit[7:0] */ +#define XSPI_XIP_TOUT_XTOUT_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_XIP_TOUT_XTOUT_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_XIP_TOUT_XTOUT_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_XIP_TOUT_XTOUT_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_XIP_TOUT_XTOUT_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_XIP_TOUT_XTOUT_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_XIP_TOUT_XTOUT_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_XIP_TOUT_XTOUT_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/******** Bit definition for XSPI_XIP_WRITE_INCR_INST register ********/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_XIP_WRITE_INCR_INST_INCRWRINST_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/******** Bit definition for XSPI_XIP_WRITE_WRAP_INST register ********/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_XIP_WRITE_WRAP_INST_WRAPWRINST_15 ((uint32_t)0x00008000U) /* Bit15*/ + +/******** Bit definition for XSPI_XIP_WRITE_CTRL register ********/ +#define XSPI_XIP_WRITE_CTRL_XIPWRWCY ((uint32_t)0x001F0000U) /* Bit[20:16] */ +#define XSPI_XIP_WRITE_CTRL_XIPWRWCY_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define XSPI_XIP_WRITE_CTRL_XIPWRWCY_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define XSPI_XIP_WRITE_CTRL_XIPWRWCY_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define XSPI_XIP_WRITE_CTRL_XIPWRWCY_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define XSPI_XIP_WRITE_CTRL_XIPWRWCY_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define XSPI_XIP_WRITE_CTRL_WAIT_1CYCLES ((uint32_t)0x00010000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_2CYCLES ((uint32_t)0x00020000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_3CYCLES ((uint32_t)0x00030000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_4CYCLES ((uint32_t)0x00040000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_5CYCLES ((uint32_t)0x00050000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_6CYCLES ((uint32_t)0x00060000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_7CYCLES ((uint32_t)0x00070000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_8CYCLES ((uint32_t)0x00080000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_9CYCLES ((uint32_t)0x00090000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_10CYCLES ((uint32_t)0x000A0000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_11CYCLES ((uint32_t)0x000B0000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_12CYCLES ((uint32_t)0x000C0000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_13CYCLES ((uint32_t)0x000D0000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_14CYCLES ((uint32_t)0x000E0000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_15CYCLES ((uint32_t)0x000F0000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_16CYCLES ((uint32_t)0x00100000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_17CYCLES ((uint32_t)0x00110000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_18CYCLES ((uint32_t)0x00120000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_19CYCLES ((uint32_t)0x00130000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_20CYCLES ((uint32_t)0x00140000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_21CYCLES ((uint32_t)0x00150000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_22CYCLES ((uint32_t)0x00160000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_23CYCLES ((uint32_t)0x00170000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_24CYCLES ((uint32_t)0x00180000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_25CYCLES ((uint32_t)0x00190000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_26CYCLES ((uint32_t)0x001A0000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_27CYCLES ((uint32_t)0x001B0000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_28CYCLES ((uint32_t)0x001C0000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_29CYCLES ((uint32_t)0x001D0000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_30CYCLES ((uint32_t)0x001E0000U) +#define XSPI_XIP_WRITE_CTRL_WAIT_31CYCLES ((uint32_t)0x001F0000U) + +#define XSPI_XIP_WRITE_CTRL_XIPWRRXDSSIGEN ((uint32_t)0x00002000U) /* Bit[13] */ +#define XSPI_XIP_WRITE_CTRL_XIPWRHYPEEN ((uint32_t)0x00001000U) /* Bit[12] */ + +#define XSPI_XIP_WRITE_CTRL_WRINDDREN ((uint32_t)0x00000800U) /* Bit[11] */ +#define XSPI_XIP_WRITE_CTRL_WRSPIDDREN ((uint32_t)0x00000400U) /* Bit[10] */ + +#define XSPI_XIP_WRITE_CTRL_WRINSTL ((uint32_t)0x00000300U) /* Bit[9:8] */ +#define XSPI_XIP_WRITE_CTRL_WRINSTL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_XIP_WRITE_CTRL_WRINSTL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_XIP_WRITE_CTRL_WRINSTL_0_LINE ((uint32_t)0x00000000U) +#define XSPI_XIP_WRITE_CTRL_WRINSTL_4_LINE ((uint32_t)0x00000200U) +#define XSPI_XIP_WRITE_CTRL_WRINSTL_8_LINE ((uint32_t)0x00000400U) +#define XSPI_XIP_WRITE_CTRL_WRINSTL_16_LINE ((uint32_t)0x00000600U) + +#define XSPI_XIP_WRITE_CTRL_WRADDRL ((uint32_t)0x000000F0U) /* Bit[7:4] */ +#define XSPI_XIP_WRITE_CTRL_WRADDRL_0 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_XIP_WRITE_CTRL_WRADDRL_1 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_XIP_WRITE_CTRL_WRADDRL_2 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_XIP_WRITE_CTRL_WRADDRL_3 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_XIP_WRITE_CTRL_WRADDRL_4BIT ((uint32_t)0x00000010U) +#define XSPI_XIP_WRITE_CTRL_WRADDRL_8BIT ((uint32_t)0x00000020U) +#define XSPI_XIP_WRITE_CTRL_WRADDRL_12BIT ((uint32_t)0x00000030U) +#define XSPI_XIP_WRITE_CTRL_WRADDRL_16BIT ((uint32_t)0x00000040U) +#define XSPI_XIP_WRITE_CTRL_WRADDRL_20BIT ((uint32_t)0x00000050U) +#define XSPI_XIP_WRITE_CTRL_WRADDRL_24BIT ((uint32_t)0x00000060U) +#define XSPI_XIP_WRITE_CTRL_WRADDRL_28BIT ((uint32_t)0x00000070U) +#define XSPI_XIP_WRITE_CTRL_WRADDRL_32BIT ((uint32_t)0x00000080U) + +#define XSPI_XIP_WRITE_CTRL_WRTRTYPE ((uint32_t)0x0000000CU) /* Bit[3:2] */ +#define XSPI_XIP_WRITE_CTRL_WRTRTYPE_0 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_XIP_WRITE_CTRL_WRTRTYPE_1 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_XIP_WRITE_CTRL_WRTRTYPE_STANDARD_SPI ((uint32_t)0x00000000U) +#define XSPI_XIP_WRITE_CTRL_WRTRTYPE_ADDRESS_BY_XIP_WRITE_WRFRF ((uint32_t)0x00000004U) +#define XSPI_XIP_WRITE_CTRL_WRTRTYPE_INSTRUCT_BY_XIP_WRITE_WRFRF ((uint32_t)0x00000008U) + + +#define XSPI_XIP_WRITE_CTRL_WRFRF ((uint32_t)0x00000003U) /* Bit[1:0] */ +#define XSPI_XIP_WRITE_CTRL_WRFRF_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_XIP_WRITE_CTRL_WRFRF_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_XIP_WRITE_CTRL_WRFRF_2_LINE ((uint32_t)0x00000001U) +#define XSPI_XIP_WRITE_CTRL_WRFRF_4_LINE ((uint32_t)0x00000002U) +#define XSPI_XIP_WRITE_CTRL_WRFRF_8_LINE ((uint32_t)0x00000003U) +/******** Bit definition for XSPI_XIP_WRITE_TIMING register ********/ +#define XSPI_XIP_WRITE_TIMING_TPP ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ +#define XSPI_XIP_WRITE_TIMING_TPP_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_XIP_WRITE_TIMING_TPP_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_XIP_WRITE_TIMING_TPP_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_XIP_WRITE_TIMING_TPP_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define XSPI_XIP_WRITE_TIMING_TPP_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define XSPI_XIP_WRITE_TIMING_TPP_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define XSPI_XIP_WRITE_TIMING_TPP_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define XSPI_XIP_WRITE_TIMING_TPP_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define XSPI_XIP_WRITE_TIMING_TPP_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define XSPI_XIP_WRITE_TIMING_TPP_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define XSPI_XIP_WRITE_TIMING_TPP_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define XSPI_XIP_WRITE_TIMING_TPP_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define XSPI_XIP_WRITE_TIMING_TPP_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define XSPI_XIP_WRITE_TIMING_TPP_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define XSPI_XIP_WRITE_TIMING_TPP_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define XSPI_XIP_WRITE_TIMING_TPP_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define XSPI_XIP_WRITE_TIMING_TPP_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define XSPI_XIP_WRITE_TIMING_TPP_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define XSPI_XIP_WRITE_TIMING_TPP_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define XSPI_XIP_WRITE_TIMING_TPP_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define XSPI_XIP_WRITE_TIMING_TPP_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define XSPI_XIP_WRITE_TIMING_TPP_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define XSPI_XIP_WRITE_TIMING_TPP_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define XSPI_XIP_WRITE_TIMING_TPP_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define XSPI_XIP_WRITE_TIMING_TPP_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define XSPI_XIP_WRITE_TIMING_TPP_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define XSPI_XIP_WRITE_TIMING_TPP_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define XSPI_XIP_WRITE_TIMING_TPP_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define XSPI_XIP_WRITE_TIMING_TPP_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define XSPI_XIP_WRITE_TIMING_TPP_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define XSPI_XIP_WRITE_TIMING_TPP_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define XSPI_XIP_WRITE_TIMING_TPP_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/******** Bit definition for XSPI_RXDS_DELAY_CTRL register ********/ +#define XSPI_RXDS_DELAY_CTRL_RXDSDELAYEN ((uint32_t)0x00000010U) /* Bit[4] */ +#define XSPI_RXDS_DELAY_CTRL_RXDSTAPDELAY ((uint32_t)0x0000000FU) /* Bit[3:0] */ +#define XSPI_RXDS_DELAY_CTRL_RXDSTAPDELAY_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define XSPI_RXDS_DELAY_CTRL_RXDSTAPDELAY_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define XSPI_RXDS_DELAY_CTRL_RXDSTAPDELAY_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define XSPI_RXDS_DELAY_CTRL_RXDSTAPDELAY_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/** Bit definition for SPI_CTRL1 register **/ +#define SPI_CTRL1_BR ((uint16_t)0x0007U) /* BR[2:0] bits (Baud Rate Control) */ +#define SPI_CTRL1_BR0 ((uint16_t)0x0001U) /* Bit 0 */ +#define SPI_CTRL1_BR1 ((uint16_t)0x0002U) /* Bit 1 */ +#define SPI_CTRL1_BR2 ((uint16_t)0x0004U) /* Bit 2 */ + +#define SPI_CTRL1_CLKPOL ((uint16_t)0x0010U) /* Clock Polarity */ +#define SPI_CTRL1_CLKPHA ((uint16_t)0x0020U) /* Clock Phase */ + +#define SPI_CTRL1_MSEL ((uint16_t)0x0040U) /* Master Selection */ +#define SPI_CTRL1_LSBFF ((uint16_t)0x0080U) /* Frame Format */ +#define SPI_CTRL1_DATFF ((uint16_t)0x0100U) /* Data Frame Format */ +#define SPI_CTRL1_CRCNEXT ((uint16_t)0x0200U) /* Transmit CRC next Software slave management */ +#define SPI_CTRL1_SSOEN ((uint16_t)0x0400U) /* SS Output Enable */ +#define SPI_CTRL1_SSEL ((uint16_t)0x0800U) /* Internal slave select */ +#define SPI_CTRL1_SSMEN ((uint16_t)0x1000U) /* Software slave management */ +#define SPI_CTRL1_RONLY ((uint16_t)0x2000U) /* Receive only */ +#define SPI_CTRL1_BIDIROEN ((uint16_t)0x4000U) /* Output enable in bidirectional mode */ +#define SPI_CTRL1_BIDIRMODE ((uint16_t)0x8000U) /* Bidirectional data mode enable */ + +/** Bit definition for SPI_CTRL2 register **/ +#define SPI_CTRL2_SPIEN ((uint16_t)0x0001U) /* SPI enable */ +#define SPI_CTRL2_RDMAEN ((uint16_t)0x0002U) /* Rx buffer DMA enable */ +#define SPI_CTRL2_TDMAEN ((uint16_t)0x0004U) /* Tx buffer DMA enable */ +#define SPI_CTRL2_CRCEN ((uint16_t)0x0008U) /* Hardware CRC calculation enable */ +#define SPI_CTRL2_TEINTEN ((uint16_t)0x0010U) /* Tx buffer empty interrupt enable */ +#define SPI_CTRL2_RNEINTEN ((uint16_t)0x0020U) /* RX buffer not empty interrupt enable */ +#define SPI_CTRL2_ERRINTEN ((uint16_t)0x0040U) /* Error interrupt enable */ +#define SPI_CTRL2_SS_POL ((uint16_t)0x0080U) /* NSS polarity control */ +#define SPI_CTRL2_FIFOEN ((uint16_t)0x0100U) /* FIFO mode enable */ +#define SPI_CTRL2_FIFOCLR ((uint16_t)0x0200U) /* FIFO clear enable */ +#define SPI_CTRL2_TXFHEINTEN ((uint16_t)0x0400U) /* Send FIFO half empty interrupt enable */ +#define SPI_CTRL2_RXFHFINTEN ((uint16_t)0x0800U) /* Receive FIFO half full interrupt enable */ +#define SPI_CTRL2_RXFFUINTEN ((uint16_t)0x1000U) /* Receive FIFO full interrupt enable */ +#define SPI_CTRL2_CRCNMISEN ((uint16_t)0x2000U) /* CRC stop calculation enable */ +#define SPI_CTRL2_RXCPINTEN ((uint16_t)0x4000U) /* Receive transfer complete interrupt enable */ +#define SPI_CTRL2_RNEDMABYPASS ((uint16_t)0x8000U) /* rxne for dma is bypass */ + +/** Bit definition for SPI_STS register **/ +#define SPI_STS_TE ((uint16_t)0x0001U) /* Transmit buffer Empty */ +#define SPI_STS_RNE ((uint16_t)0x0002U) /* Receive buffer Not Empty */ +#define SPI_STS_BUSY ((uint16_t)0x0004U) /* Busy flag */ +#define SPI_STS_CRCERR ((uint16_t)0x0008U) /* CRC Error flag */ +#define SPI_STS_MODERR ((uint16_t)0x0010U) /* Mode fault */ +#define SPI_STS_OVER ((uint16_t)0x0020U) /* Overrun flag */ +#define SPI_STS_UNDER ((uint16_t)0x0040U) /* Underrun flag */ +#define SPI_STS_CHSIDE ((uint16_t)0x0080U) /* Channel side */ +#define SPI_STS_TXFIFHE ((uint16_t)0x0100U) /* TX FIFO half empty flag */ +#define SPI_STS_RXFIFHF ((uint16_t)0x0200U) /* RX FIFO half empty flag */ +#define SPI_STS_TXFIFFU ((uint16_t)0x0400U) /* TX FIFO full flag */ +#define SPI_STS_RXFIFFU ((uint16_t)0x0800U) /* RX FIFO full flag */ +#define SPI_STS_RXTSCP ((uint16_t)0x1000U) /* In receive-only mode, the transmission complete status */ + +/** Bit definition for SPI_DAT register **/ +#define SPI_DAT_DAT ((uint16_t)0xFFFFU) /* Data Register */ + +/** Bit definition for SPI_CRCTDAT register **/ +#define SPI_CRCTDAT_CRCTDAT ((uint16_t)0xFFFFU) /* Tx CRC Register */ + +/** Bit definition for SPI_CRCRDAT register **/ +#define SPI_CRCRDAT_CRCRDAT ((uint16_t)0xFFFFU) /* Rx CRC Register */ + +/** Bit definition for SPI_CRCPOLY register **/ +#define SPI_CRCPOLY_CRCPOLY ((uint16_t)0xFFFFU) /* CRC polynomial register */ + +/** Bit definition for SPI_I2SCFG register **/ +#define SPI_I2SCFG_I2SEN ((uint16_t)0x0001U) /* I2S Enable */ +#define SPI_I2SCFG_I2SMOD ((uint16_t)0x0002U) /* I2S mode selection */ +#define SPI_I2SCFG_I2SSTD ((uint16_t)0x000CU) /* I2SSTD[1:0] bits (I2S standard selection) */ +#define SPI_I2SCFG_I2SSTD0 ((uint16_t)0x0004U) /* Bit 0 */ +#define SPI_I2SCFG_I2SSTD1 ((uint16_t)0x0008U) /* Bit 1 */ +#define SPI_I2SCFG_I2SCFG ((uint16_t)0x0030U) /* I2SCFG[1:0] bits (I2S mode setting) */ +#define SPI_I2SCFG_I2SCFG0 ((uint16_t)0x0010U) /* Bit 0 */ +#define SPI_I2SCFG_I2SCFG1 ((uint16_t)0x0020U) /* Bit 1 */ +#define SPI_I2SCFG_DATLEN ((uint16_t)0x00C0U) /* DATLEN[1:0] bits (Data length to be transferred) */ +#define SPI_I2SCFG_DATLEN0 ((uint16_t)0x0040U) /* Bit 0 */ +#define SPI_I2SCFG_DATLEN1 ((uint16_t)0x0080U) /* Bit 1 */ +#define SPI_I2SCFG_CHLEN ((uint16_t)0x0100U) /* Channel length (number of bits per audio channel) */ +#define SPI_I2SCFG_PCMFSYNC ((uint16_t)0x0200U) /* PCM frame synchronization */ +#define SPI_I2SCFG_CLKPOL ((uint16_t)0x0400U) /* steady state clock polarity */ +#define SPI_I2SCFG_PCMBYPASS ((uint16_t)0x0800U) /* pcm long for 13bit is bypass */ + +/** Bit definition for SPI_I2SPREDIV register **/ +#define SPI_I2SPREDIV_LDIV ((uint16_t)0x03FFU) /* I2S Linear prescaler */ +#define SPI_I2SPREDIV_ODDEVEN ((uint16_t)0x0400U) /* Odd factor for the prescaler */ +#define SPI_I2SPREDIV_MCLKOEN ((uint16_t)0x0800U) /* Master Clock Output Enable */ + +/** Bit definition for SPI_RX_FIFO register **/ +#define SPI_RXFIFDAT ((uint16_t)0xFFFFU) /* RX FIFO Data Register */ + +/** Bit definition for SPI_FIFO_NUM register **/ +#define SPI_FIFO_NUM_TXFBSNUM ((uint16_t)0x0007U) /* FIFO_NUM [2:0] bits (TX FIFO half empty NUM configuration) */ +#define SPI_FIFO_NUM_TXFBSNUM0 ((uint16_t)0x0001U) /* Bit 0 */ +#define SPI_FIFO_NUM_TXFBSNUM1 ((uint16_t)0x0002U) /* Bit 1 */ +#define SPI_FIFO_NUM_TXFBSNUM2 ((uint16_t)0x0004U) /* Bit 2*/ +#define SPI_FIFO_NUM_RXFBSNUM ((uint16_t)0x0070U) /* FIFO_NUM [2:0] bits (RX FIFO half full NUM configuration) */ +#define SPI_FIFO_NUM_RXFBSNUM0 ((uint16_t)0x0010U) /* Bit 0 */ +#define SPI_FIFO_NUM_RXFBSNUM1 ((uint16_t)0x0020U) /* Bit 1 */ +#define SPI_FIFO_NUM_RXFBSNUM2 ((uint16_t)0x0040U) /* Bit 2*/ + +/** Bit definition for SPI_FIFO_CNT register **/ +#define SPI_FIFO_CNT_TXFIFCNT ((uint16_t)0x000FU) /* FIFO_CNT[3:0] bits (TX FIFO Valid number) */ +#define SPI_FIFO_CNT_TXFIFCNT0 ((uint16_t)0x0001U) /* Bit 0 */ +#define SPI_FIFO_CNT_TXFIFCNT1 ((uint16_t)0x0002U) /* Bit 1 */ +#define SPI_FIFO_CNT_TXFIFCNT2 ((uint16_t)0x0004U) /* Bit 2*/ +#define SPI_FIFO_CNT_TXFIFCNT3 ((uint16_t)0x0008U) /* Bit 3*/ +#define SPI_FIFO_CNT_RXFIFCNT ((uint16_t)0x00F0U) /* FIFO_CNT [3:0] bits (RX FIFO Valid number) */ +#define SPI_FIFO_CNT_RXFIFCNT0 ((uint16_t)0x0010U) /* Bit 0 */ +#define SPI_FIFO_CNT_RXFIFCNT1 ((uint16_t)0x0020U) /* Bit 1 */ +#define SPI_FIFO_CNT_RXFIFCNT2 ((uint16_t)0x0040U) /* Bit 2*/ +#define SPI_FIFO_CNT_RXFIFCNT3 ((uint16_t)0x0080U) /* Bit 3*/ + +/** Bit definition for SPI_TRANS_NUM register **/ +#define SPI_TRANS_NUM_TRANSNUM ((uint16_t)0xFFFFU) /* RX FIFO Data Register */ + +/** Bit definition for SPI_CR3 register **/ +#define SPI_CR3_DELAYTIME ((uint16_t)0x000FU) /* CR[3:0] bits (Clock Sample Delay Register) */ +#define SPI_CR3_DELAYTIME0 ((uint16_t)0x0001U) /* Bit 0 */ +#define SPI_CR3_DELAYTIME1 ((uint16_t)0x0002U) /* Bit 1 */ +#define SPI_CR3_DELAYTIME2 ((uint16_t)0x0004U) /* Bit 2 */ +#define SPI_CR3_DELAYTIME3 ((uint16_t)0x0008U) /* Bit 3 */ + +/** Bit definition for I2SEXT_CTRL2 register **/ +#define I2SEXT_CTRL2_RDMAEN ((uint16_t)0x0002U) /* Rx buffer DMA enable */ +#define I2SEXT_CTRL2_TDMAEN ((uint16_t)0x0004U) /* Tx buffer DMA enable */ +#define I2SEXT_CTRL2_TEINTEN ((uint16_t)0x0010U) /* Tx buffer empty interrupt enable */ +#define I2SEXT_CTRL2_RNEINTEN ((uint16_t)0x0020U) /* RX buffer not empty interrupt enable */ +#define I2SEXT_CTRL2_ERRINTEN ((uint16_t)0x0040U) /* Error interrupt enable */ +#define I2SEXT_CTRL2_RXNEDMABYPASS ((uint16_t)0x8000U) /* rxne for dma is bypass */ + +/** Bit definition for I2SEXT_STS register **/ +#define I2SEXT_STS_TE ((uint16_t)0x0001U) /* Transmit buffer Empty */ +#define I2SEXT_STS_RNE ((uint16_t)0x0002U) /* Receive buffer Not Empty */ +#define I2SEXT_STS_BUSY ((uint16_t)0x0004U) /* Busy flag */ +#define I2SEXT_STS_OVER ((uint16_t)0x0020U) /* Overrun flag */ +#define I2SEXT_STS_UNDER ((uint16_t)0x0040U) /* Underrun flag */ +#define I2SEXT_STS_CHSIDE ((uint16_t)0x0080U) /* Channel side */ + +/** Bit definition for I2SEXT_DAT register **/ +#define I2SEXT_DAT_DAT ((uint16_t)0xFFFFU) /* Data Register */ + +/** Bit definition for I2SEXT_I2SCFG register **/ +#define I2SEXT_I2SCFG_I2SEN ((uint16_t)0x0001U) /* I2S Enable */ +#define I2SEXT_I2SCFG_I2SMOD ((uint16_t)0x0002U) /* I2S mode selection */ +#define I2SEXT_I2SCFG_I2SSTD ((uint16_t)0x000CU) /* STDSEL[1:0] bits (I2S standard selection) */ +#define I2SEXT_I2SCFG_I2SSTD0 ((uint16_t)0x0004U) /* Bit 0 */ +#define I2SEXT_I2SCFG_I2SSTD1 ((uint16_t)0x0008U) /* Bit 1 */ +#define I2SEXT_I2SCFG_I2SCFG ((uint16_t)0x0030U) /* MODCFG[1:0] bits (I2S configuration mode) */ +#define I2SEXT_I2SCFG_I2SCFG0 ((uint16_t)0x0010U) /* Bit 0 */ +#define I2SEXT_I2SCFG_I2SCFG1 ((uint16_t)0x0020U) /* Bit 1 */ +#define I2SEXT_I2SCFG_DATLEN ((uint16_t)0x00C0U) /* TDATLEN[1:0] bits (Data length to be transferred) */ +#define I2SEXT_I2SCFG_DATLEN0 ((uint16_t)0x0040U) /* Bit 0 */ +#define I2SEXT_I2SCFG_DATLEN1 ((uint16_t)0x0080U) /* Bit 1 */ +#define I2SEXT_I2SCFG_CHLEN ((uint16_t)0x0100U) /* Channel length (number of bits per audio channel) */ +#define I2SEXT_I2SCFG_PCMFSYNC ((uint16_t)0x0200U) /* PCM frame synchronization */ +#define I2SEXT_I2SCFG_CLKPOL ((uint16_t)0x0400U) /* steady state clock polarity */ +#define I2SEXT_I2SCFG_PCMLBYPASS ((uint16_t)0x0800U) /* pcm long for 13bit is bypass */ + +/******** Bit definition for I2C_CTRL1 register ********/ +#define I2C_CTRL1_FTXIE ((uint32_t)0x80000000U) /* FTXIE enable */ +#define I2C_CTRL1_FRXIE ((uint32_t)0x40000000U) /* FRXIE enable */ +#define I2C_CTRL1_DFX ((uint32_t)0x3F000000U) /* DFX enable */ +#define I2C_CTRL1_DFX_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define I2C_CTRL1_DFX_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define I2C_CTRL1_DFX_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define I2C_CTRL1_DFX_3 ((uint32_t)0x08000000U) /* Bit27*/ +#define I2C_CTRL1_DFX_4 ((uint32_t)0x10000000U) /* Bit28*/ +#define I2C_CTRL1_DFX_5 ((uint32_t)0x20000000U) /* Bit29*/ +#define I2C_CTRL1_CRCEN ((uint32_t)0x00800000U) /* CRC enable */ +#define I2C_CTRL1_ALRTEN ((uint32_t)0x00400000U) /* SMBus alert enable */ +#define I2C_CTRL1_SMBD ((uint32_t)0x00200000U) /* SMBus host default address enable */ +#define I2C_CTRL1_SMBH ((uint32_t)0x00100000U) /* SMBus host address enable */ +#define I2C_CTRL1_GENC ((uint32_t)0x00080000U) /* General call enable */ +#define I2C_CTRL1_NOSTRCH ((uint32_t)0x00020000U) /* Clock stretching disable */ +#define I2C_CTRL1_SBCTL ((uint32_t)0x00010000U) /* Slave byte control */ +#define I2C_CTRL1_DMARDEN ((uint32_t)0x00008000U) /* DMA reception requests enable */ +#define I2C_CTRL1_DMAWREN ((uint32_t)0x00004000U) /* DMA transmission requests enable */ +#define I2C_CTRL1_AFOFF ((uint32_t)0x00001000U) /* Analog noise filter OFF */ +#define I2C_CTRL1_DF ((uint32_t)0x00000F00U) /* Digital noise filter */ +#define I2C_CTRL1_DF_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define I2C_CTRL1_DF_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define I2C_CTRL1_DF_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define I2C_CTRL1_DF_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define I2C_CTRL1_ERRIE ((uint32_t)0x00000080U) /* Errors interrupt enable */ +#define I2C_CTRL1_TFCIE ((uint32_t)0x00000040U) /* Transfer complete interrupt enable */ +#define I2C_CTRL1_STOPIE ((uint32_t)0x00000020U) /* STOP detection interrupt enable */ +#define I2C_CTRL1_NAKIE ((uint32_t)0x00000010U) /* NACK received interrupt enable */ +#define I2C_CTRL1_ADRIE ((uint32_t)0x00000008U) /* Address match interrupt enable */ +#define I2C_CTRL1_RDRIE ((uint32_t)0x00000004U) /* RX interrupt enable */ +#define I2C_CTRL1_WDRIE ((uint32_t)0x00000002U) /* TX interrupt enable */ +#define I2C_CTRL1_I2CEN ((uint32_t)0x00000001U) /* Peripheral enable */ + +/******** Bit definition for I2C_CTRL2 register ********/ +#define I2C_CTRL2_CRCBYTE ((uint32_t)0x04000000U) /* Packet error checking byte */ +#define I2C_CTRL2_AUTOSTOP ((uint32_t)0x02000000U) /* Automatic end mode (master mode) */ +#define I2C_CTRL2_REFILL ((uint32_t)0x01000000U) /* NBYTES reload mode */ +#define I2C_CTRL2_BYTECNT ((uint32_t)0x00FF0000U) /* Number of bytes */ +#define I2C_CTRL2_BYTECNT_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define I2C_CTRL2_BYTECNT_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define I2C_CTRL2_BYTECNT_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define I2C_CTRL2_BYTECNT_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define I2C_CTRL2_BYTECNT_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define I2C_CTRL2_BYTECNT_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define I2C_CTRL2_BYTECNT_6 ((uint32_t)0x00400000U) /* Bit22*/ +#define I2C_CTRL2_BYTECNT_7 ((uint32_t)0x00800000U) /* Bit23*/ +#define I2C_CTRL2_NAK ((uint32_t)0x00008000U) /* NACK generation (slave mode) */ +#define I2C_CTRL2_STOP ((uint32_t)0x00004000U) /* STOP generation (master mode) */ +#define I2C_CTRL2_START ((uint32_t)0x00002000U) /* START generation */ +#define I2C_CTRL2_HDR10 ((uint32_t)0x00001000U) /* 10-bit address header only read direction (master mode) */ +#define I2C_CTRL2_ADR10 ((uint32_t)0x00000800U) /* 10-bit addressing mode (master mode) */ +#define I2C_CTRL2_RWN ((uint32_t)0x00000400U) /* Transfer direction (master mode) */ +#define I2C_CTRL2_SADR ((uint32_t)0x000003FFU) /* Slave address (master mode) */ +#define I2C_CTRL2_SADR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define I2C_CTRL2_SADR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define I2C_CTRL2_SADR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define I2C_CTRL2_SADR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define I2C_CTRL2_SADR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define I2C_CTRL2_SADR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define I2C_CTRL2_SADR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define I2C_CTRL2_SADR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define I2C_CTRL2_SADR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define I2C_CTRL2_SADR_9 ((uint32_t)0x00000200U) /* Bit9*/ + +/******** Bit definition for I2C_ADR1 register ********/ +#define I2C_ADR1_AD1EN ((uint32_t)0x00008000U) /* Own address 1 enable */ +#define I2C_ADR1_AD1MODE ((uint32_t)0x00000400U) /* Own address 1 10-bit mode */ +#define I2C_ADR1_AD1 ((uint32_t)0x000003FFU) /* Interface own address 1 */ +#define I2C_ADR1_AD1_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define I2C_ADR1_AD1_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define I2C_ADR1_AD1_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define I2C_ADR1_AD1_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define I2C_ADR1_AD1_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define I2C_ADR1_AD1_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define I2C_ADR1_AD1_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define I2C_ADR1_AD1_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define I2C_ADR1_AD1_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define I2C_ADR1_AD1_9 ((uint32_t)0x00000200U) /* Bit9*/ + +/******** Bit definition for I2C_ADR2 register ********/ +#define I2C_ADR2_AD2EN ((uint32_t)0x00008000U) /* Own address 2 enable */ +#define I2C_ADR2_AD2MSK ((uint32_t)0x00000700U) /* AD2[7:1] is masked, No comparison is done */ +#define I2C_ADR2_AD2MSK_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define I2C_ADR2_AD2MSK_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define I2C_ADR2_AD2MSK_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define I2C_ADR2_AD2 ((uint32_t)0x000000FEU) /* Own address 2 masks */ +#define I2C_ADR2_AD2_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define I2C_ADR2_AD2_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define I2C_ADR2_AD2_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define I2C_ADR2_AD2_3 ((uint32_t)0x00000010U) /* Bit4*/ +#define I2C_ADR2_AD2_4 ((uint32_t)0x00000020U) /* Bit5*/ +#define I2C_ADR2_AD2_5 ((uint32_t)0x00000040U) /* Bit6*/ +#define I2C_ADR2_AD2_6 ((uint32_t)0x00000080U) /* Bit7*/ + +/******** Bit definition for I2C_BUSTM register ********/ +#define I2C_BUSTM_CKDIV ((uint32_t)0xF0000000U) /* Timings CK Divider */ +#define I2C_BUSTM_CKDIV_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define I2C_BUSTM_CKDIV_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define I2C_BUSTM_CKDIV_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define I2C_BUSTM_CKDIV_3 ((uint32_t)0x80000000U) /* Bit31*/ +#define I2C_BUSTM_DSCL ((uint32_t)0x00F00000U) /* Data setup time */ +#define I2C_BUSTM_DSCL_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define I2C_BUSTM_DSCL_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define I2C_BUSTM_DSCL_2 ((uint32_t)0x00400000U) /* Bit22*/ +#define I2C_BUSTM_DSCL_3 ((uint32_t)0x00800000U) /* Bit23*/ +#define I2C_BUSTM_DSDA ((uint32_t)0x000F0000U) /* Data hold time */ +#define I2C_BUSTM_DSDA_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define I2C_BUSTM_DSDA_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define I2C_BUSTM_DSDA_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define I2C_BUSTM_DSDA_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define I2C_BUSTM_HSCL ((uint32_t)0x0000FF00U) /* SCL high period (master mode) */ +#define I2C_BUSTM_HSCL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define I2C_BUSTM_HSCL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define I2C_BUSTM_HSCL_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define I2C_BUSTM_HSCL_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define I2C_BUSTM_HSCL_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define I2C_BUSTM_HSCL_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define I2C_BUSTM_HSCL_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define I2C_BUSTM_HSCL_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define I2C_BUSTM_LSCL ((uint32_t)0x000000FFU) /* SCL low period (master mode) */ +#define I2C_BUSTM_LSCL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define I2C_BUSTM_LSCL_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define I2C_BUSTM_LSCL_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define I2C_BUSTM_LSCL_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define I2C_BUSTM_LSCL_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define I2C_BUSTM_LSCL_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define I2C_BUSTM_LSCL_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define I2C_BUSTM_LSCL_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/******** Bit definition for I2C_TMOUTR register ********/ +#define I2C_TMOUTR_TMEXTEN ((uint32_t)0x80000000U) /* Extended clock timeout enable */ +#define I2C_TMOUTR_TMOUTB ((uint32_t)0x0FFF0000U) /* Bus timeout B*/ +#define I2C_TMOUTR_TMOUTB_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define I2C_TMOUTR_TMOUTB_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define I2C_TMOUTR_TMOUTB_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define I2C_TMOUTR_TMOUTB_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define I2C_TMOUTR_TMOUTB_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define I2C_TMOUTR_TMOUTB_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define I2C_TMOUTR_TMOUTB_6 ((uint32_t)0x00400000U) /* Bit22*/ +#define I2C_TMOUTR_TMOUTB_7 ((uint32_t)0x00800000U) /* Bit23*/ +#define I2C_TMOUTR_TMOUTB_8 ((uint32_t)0x01000000U) /* Bit24*/ +#define I2C_TMOUTR_TMOUTB_9 ((uint32_t)0x02000000U) /* Bit25*/ +#define I2C_TMOUTR_TMOUTB_10 ((uint32_t)0x04000000U) /* Bit26*/ +#define I2C_TMOUTR_TMOUTB_11 ((uint32_t)0x08000000U) /* Bit27*/ +#define I2C_TMOUTR_TMOUTEN ((uint32_t)0x00008000U) /* Clock timeout enable */ +#define I2C_TMOUTR_TMIDLE ((uint32_t)0x00001000U) /* Idle clock timeout detection */ +#define I2C_TMOUTR_TMOUTA ((uint32_t)0x00000FFFU) /* Bus timeout A */ +#define I2C_TMOUTR_TMOUTA_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define I2C_TMOUTR_TMOUTA_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define I2C_TMOUTR_TMOUTA_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define I2C_TMOUTR_TMOUTA_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define I2C_TMOUTR_TMOUTA_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define I2C_TMOUTR_TMOUTA_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define I2C_TMOUTR_TMOUTA_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define I2C_TMOUTR_TMOUTA_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define I2C_TMOUTR_TMOUTA_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define I2C_TMOUTR_TMOUTA_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define I2C_TMOUTR_TMOUTA_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define I2C_TMOUTR_TMOUTA_11 ((uint32_t)0x00000800U) /* Bit11*/ + +/******** Bit definition for I2C_STSINT register ********/ +#define I2C_STSINT_FTXIS ((uint32_t)0x80000000U) /* Bit[31] */ +#define I2C_STSINT_FRXNE ((uint32_t)0x40000000U) /* Bit[30] */ +#define I2C_STSINT_ADRRCV ((uint32_t)0x00FE0000U) /* Address match code (slave mode) */ +#define I2C_STSINT_ADRRCV_0 ((uint32_t)0x00020000U) /* Bit17*/ +#define I2C_STSINT_ADRRCV_1 ((uint32_t)0x00040000U) /* Bit18*/ +#define I2C_STSINT_ADRRCV_2 ((uint32_t)0x00080000U) /* Bit19*/ +#define I2C_STSINT_ADRRCV_3 ((uint32_t)0x00100000U) /* Bit20*/ +#define I2C_STSINT_ADRRCV_4 ((uint32_t)0x00200000U) /* Bit21*/ +#define I2C_STSINT_ADRRCV_5 ((uint32_t)0x00400000U) /* Bit22*/ +#define I2C_STSINT_ADRRCV_6 ((uint32_t)0x00800000U) /* Bit23*/ +#define I2C_STSINT_DIR ((uint32_t)0x00010000U) /* Transfer direction (slave mode) */ +#define I2C_STSINT_BUSY ((uint32_t)0x00008000U) /* Bus busy */ +#define I2C_STSINT_QADR ((uint32_t)0x00004000U) /* Quick command address matched */ +#define I2C_STSINT_ALRT ((uint32_t)0x00002000U) /* SMBus alert */ +#define I2C_STSINT_TMOUT ((uint32_t)0x00001000U) /* Timeout or Tlow detection flag */ +#define I2C_STSINT_CRCERR ((uint32_t)0x00000800U) /* PEC error in reception */ +#define I2C_STSINT_OVF ((uint32_t)0x00000400U) /* Overrun/Underrun */ +#define I2C_STSINT_ABLO ((uint32_t)0x00000200U) /* Arbitration lost */ +#define I2C_STSINT_BSER ((uint32_t)0x00000100U) /* Bus error */ +#define I2C_STSINT_TFCR ((uint32_t)0x00000080U) /* Transfer complete reload */ +#define I2C_STSINT_TFC ((uint32_t)0x00000040U) /* Transfer complete (master mode) */ +#define I2C_STSINT_STOPF ((uint32_t)0x00000020U) /* STOP detection flag */ +#define I2C_STSINT_NAKF ((uint32_t)0x00000010U) /* NACK received flag */ +#define I2C_STSINT_ADR ((uint32_t)0x00000008U) /* ADRess matched (slave mode)*/ +#define I2C_STSINT_RDAVL ((uint32_t)0x00000004U) /* Receive data register not empty */ +#define I2C_STSINT_WRAVL ((uint32_t)0x00000002U) /* Transmit interrupt status */ +#define I2C_STSINT_WRE ((uint32_t)0x00000001U) /* Transmit data register empty */ + +/******** Bit definition for I2C_INTCLR register ********/ +#define I2C_INTCLR_ALRTCLR ((uint32_t)0x00002000U) /* Alert clear flag */ +#define I2C_INTCLR_TMOUTCLR ((uint32_t)0x00001000U) /* Timeout clear flag */ +#define I2C_INTCLR_CRCCLR ((uint32_t)0x00000800U) /* PAC error clear flag */ +#define I2C_INTCLR_OVFCLR ((uint32_t)0x00000400U) /* Overrun/Underrun clear flag */ +#define I2C_INTCLR_ABLOCLR ((uint32_t)0x00000200U) /* Arbitration lost clear flag */ +#define I2C_INTCLR_BSERCLR ((uint32_t)0x00000100U) /* Bus error clear flag */ +#define I2C_INTCLR_STOPCLR ((uint32_t)0x00000020U) /* STOP detection clear flag */ +#define I2C_INTCLR_NAKCLR ((uint32_t)0x00000010U) /* NACK clear flag */ +#define I2C_INTCLR_ADRCLR ((uint32_t)0x00000008U) /* Address matched clear flag */ + +/******** Bit definition for I2C_CRCR register ********/ +#define I2C_CRCR_CRC ((uint32_t)0x000000FFU) /* CRC register */ + +/******** Bit definition for I2C_RDR register ********/ +#define I2C_RDR_RDAT ((uint32_t)0x000000FFU) /* 8-bit receive data */ + +/******** Bit definition for I2C_WDR register ********/ +#define I2C_WDR_WDAT ((uint32_t)0x000000FFU) /* 8-bit transmit data */ + +/******** Bit definition for I2C_HSBUSTM register ********/ +#define I2C_HSBUSTM_HSCKDIV ((uint32_t)0xF0000000U) /* High speed mode timing prescaler*/ +#define I2C_HSBUSTM_HSCKDIV_0 ((uint32_t)0x10000000U) /* Bit28*/ +#define I2C_HSBUSTM_HSCKDIV_1 ((uint32_t)0x20000000U) /* Bit29*/ +#define I2C_HSBUSTM_HSCKDIV_2 ((uint32_t)0x40000000U) /* Bit30*/ +#define I2C_HSBUSTM_HSCKDIV_3 ((uint32_t)0x80000000U) /* Bit31*/ +#define I2C_HSBUSTM_HSDSCL ((uint32_t)0x00F00000U) /* High speed mode Data setup time*/ +#define I2C_HSBUSTM_HSDSCL_0 ((uint32_t)0x00100000U) /* Bit20*/ +#define I2C_HSBUSTM_HSDSCL_1 ((uint32_t)0x00200000U) /* Bit21*/ +#define I2C_HSBUSTM_HSDSCL_2 ((uint32_t)0x00400000U) /* Bit22*/ +#define I2C_HSBUSTM_HSDSCL_3 ((uint32_t)0x00800000U) /* Bit23*/ +#define I2C_HSBUSTM_HSDSDA ((uint32_t)0x000F0000U) /* High speed mode Data hold time*/ +#define I2C_HSBUSTM_HSDSDA_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define I2C_HSBUSTM_HSDSDA_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define I2C_HSBUSTM_HSDSDA_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define I2C_HSBUSTM_HSDSDA_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define I2C_HSBUSTM_HSHSCL ((uint32_t)0x0000FF00U) /* High speed mode SCL High period */ +#define I2C_HSBUSTM_HSHSCL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define I2C_HSBUSTM_HSHSCL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define I2C_HSBUSTM_HSHSCL_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define I2C_HSBUSTM_HSHSCL_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define I2C_HSBUSTM_HSHSCL_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define I2C_HSBUSTM_HSHSCL_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define I2C_HSBUSTM_HSHSCL_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define I2C_HSBUSTM_HSHSCL_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define I2C_HSBUSTM_HSLSCL ((uint32_t)0x000000FFU) /* High speed mode SCL low period */ +#define I2C_HSBUSTM_HSLSCL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define I2C_HSBUSTM_HSLSCL_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define I2C_HSBUSTM_HSLSCL_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define I2C_HSBUSTM_HSLSCL_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define I2C_HSBUSTM_HSLSCL_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define I2C_HSBUSTM_HSLSCL_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define I2C_HSBUSTM_HSLSCL_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define I2C_HSBUSTM_HSLSCL_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/******** Bit definition for I2C_FIFOCSR register ********/ +#define I2C_FIFOCSR_TFE ((uint32_t)0x80000000U) /* Set TX FIFO active*/ +#define I2C_FIFOCSR_RFE ((uint32_t)0x40000000U) /* Set RX FIFO active*/ +#define I2C_FIFOCSR_TXILEVEL ((uint32_t)0x0F000000U) /* Bit[27:24] */ +#define I2C_FIFOCSR_TXILEVEL_0 ((uint32_t)0x01000000U) /* Bit24*/ +#define I2C_FIFOCSR_TXILEVEL_1 ((uint32_t)0x02000000U) /* Bit25*/ +#define I2C_FIFOCSR_TXILEVEL_2 ((uint32_t)0x04000000U) /* Bit26*/ +#define I2C_FIFOCSR_TXILEVEL_3 ((uint32_t)0x08000000U) /* Bit27*/ +#define I2C_FIFOCSR_RXILEVEL ((uint32_t)0x000F0000U) /* Bit[19:16] */ +#define I2C_FIFOCSR_RXILEVEL_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define I2C_FIFOCSR_RXILEVEL_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define I2C_FIFOCSR_RXILEVEL_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define I2C_FIFOCSR_RXILEVEL_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define I2C_FIFOCSR_TXFLEVEL ((uint32_t)0x00000F00U) /* TX FIFO filled level*/ +#define I2C_FIFOCSR_TXFLEVEL_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define I2C_FIFOCSR_TXFLEVEL_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define I2C_FIFOCSR_TXFLEVEL_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define I2C_FIFOCSR_TXFLEVEL_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define I2C_FIFOCSR_RXFLEVEL ((uint32_t)0x0000000FU) /* RX FIFO filled level*/ +#define I2C_FIFOCSR_RXFLEVEL_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define I2C_FIFOCSR_RXFLEVEL_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define I2C_FIFOCSR_RXFLEVEL_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define I2C_FIFOCSR_RXFLEVEL_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/******** Bit definition for I2C_QCMD register ********/ +#define I2C_QCMD_QCMDEN ((uint32_t)0x00008000U) /* SMB Quick command enable*/ +#define I2C_QCMD_QCMDAD ((uint32_t)0x000000FEU) /* SMB Quick command address*/ +#define I2C_QCMD_QCMDAD_0 ((uint32_t)0x00000002U) /* Bit1*/ +#define I2C_QCMD_QCMDAD_1 ((uint32_t)0x00000004U) /* Bit2*/ +#define I2C_QCMD_QCMDAD_2 ((uint32_t)0x00000008U) /* Bit3*/ +#define I2C_QCMD_QCMDAD_3 ((uint32_t)0x00000010U) /* Bit4*/ +#define I2C_QCMD_QCMDAD_4 ((uint32_t)0x00000020U) /* Bit5*/ +#define I2C_QCMD_QCMDAD_5 ((uint32_t)0x00000040U) /* Bit6*/ +#define I2C_QCMD_QCMDAD_6 ((uint32_t)0x00000080U) /* Bit7*/ + +/******** Bit definition for I2C_GFLTRCTRL register ********/ +#define I2C_GFLTRCTRL_SCLAFENN ((uint32_t)0x00008000U) /* SCL analog filter enable*/ +#define I2C_GFLTRCTRL_SCLAFW ((uint32_t)0x00003000U) /* SCL analog filter adjustment range control*/ +#define I2C_GFLTRCTRL_SCLAFW_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define I2C_GFLTRCTRL_SCLAFW_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define I2C_GFLTRCTRL_SDAAFENN ((uint32_t)0x00000800U) /* SDA analog filter enable*/ +#define I2C_GFLTRCTRL_SDAAFW ((uint32_t)0x00000300U) /* SDA analog filter adjustment range control*/ +#define I2C_GFLTRCTRL_SDAAFW_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define I2C_GFLTRCTRL_SDAAFW_1 ((uint32_t)0x00000200U) /* Bit9*/ + + +/** Bit definition for USART_CTRL1 register **/ +#define USART_CTRL1_UEN ((uint32_t)0x00000001U) /* USART Enable */ +#define USART_CTRL1_RXEN ((uint32_t)0x00000002U) /* Receiver Enable */ +#define USART_CTRL1_TXEN ((uint32_t)0x00000004U) /* Transmitter Enable */ +#define USART_CTRL1_PSEL ((uint32_t)0x00000008U) /* Parity Selection */ +#define USART_CTRL1_PCEN ((uint32_t)0x00000010U) /* Parity Control Enable */ +#define USART_CTRL1_WL ((uint32_t)0x00000020U) /* Word length */ +#define USART_CTRL1_RCVWU ((uint32_t)0x00000040U) /* Receiver wakeup */ +#define USART_CTRL1_WUM ((uint32_t)0x00000080U) /* Wakeup method */ +#define USART_CTRL1_IDLEIEN ((uint32_t)0x00000100U) /* IDLE Interrupt Enable */ +#define USART_CTRL1_RXDNEIEN ((uint32_t)0x00000200U) /* RXNE Interrupt Enable */ +#define USART_CTRL1_TXDEIEN ((uint32_t)0x00000400U) /* TXE Interrupt Enable */ +#define USART_CTRL1_TXCIEN ((uint32_t)0x00000800U) /* Transmission Complete Interrupt Enable */ +#define USART_CTRL1_PEIEN ((uint32_t)0x00001000U) /* PE Interrupt Enable */ +#define USART_CTRL1_SDBRK ((uint32_t)0x00002000U) /* Send Break */ +#define USART_CTRL1_DEM ((uint32_t)0x00004000U) /* Driver enable mode */ +#define USART_CTRL1_DEP ((uint32_t)0x00008000U) /* Driver enable polarity selection */ +#define USART_CTRL1_DEDT_MASK ((uint32_t)0x001F0000U) /* Driver Enable deassertion time mask */ +#define USART_CTRL1_DEAT_MASK ((uint32_t)0x03E00000U) /* Driver Enable assertion time mask */ +#define USART_CTRL1_OSPM ((uint32_t)0x04000000U) /* Oversampling mode */ +#define USART_CTRL1_SWAP ((uint32_t)0x08000000U) /* Swap TX/RX pins */ +#define USART_CTRL1_IFCEN ((uint32_t)0x10000000U) /* Idle frame controllable enable */ + +/** Bit definition for USART_CTRL2 register **/ +#define USART_CTRL2_ADDR ((uint32_t)0x0000000FU) /* Address of the USART node */ +#define USART_CTRL2_STPB ((uint32_t)0x00000060U) /* STOP[1:0] bits (STOP bits) */ +#define USART_CTRL2_STPB_0 ((uint32_t)0x00000020U) /* Bit 0 */ +#define USART_CTRL2_STPB_1 ((uint32_t)0x00000040U) /* Bit 1 */ +#define USART_CTRL2_CLKEN ((uint32_t)0x00000100U) /* Clock Enable */ +#define USART_CTRL2_CLKPOL ((uint32_t)0x00000200U) /* Clock Polarity */ +#define USART_CTRL2_CLKPHA ((uint32_t)0x00000400U) /* Clock Phase */ +#define USART_CTRL2_LBCLK ((uint32_t)0x00000800U) /* Last Bit Clock pulse */ +#define USART_CTRL2_LINMEN ((uint32_t)0x00001000U) /* LIN mode enable */ +#define USART_CTRL2_LINBDIEN ((uint32_t)0x00002000U) /* LIN Break Detection Interrupt Enable */ +#define USART_CTRL2_LINBDL ((uint32_t)0x00004000U) /* LIN Break Detection Length */ +#define USART_CTRL2_RTOEN ((uint32_t)0x00008000U) /* Receiver timeout enable */ +#define USART_CTRL2_RTOCF ((uint32_t)0x00010000U) /* Receiver timeout clear flag */ +#define USART_CTRL2_RTOIEN ((uint32_t)0x00020000U) /* Receiver timeout interrupt enable */ +#define USART_CTRL2_PEFLOSE ((uint32_t)0x00040000U) /* PEF Data Discard Enable Bit */ +#define USART_CTRL2_NEFLOSE ((uint32_t)0x00080000U) /* NEF Data Discard Enable Bit */ +#define USART_CTRL2_FEFLOSE ((uint32_t)0x00100000U) /* FEF Data Discard Enable Bit */ + +/** Bit definition for USART_CTRL3 register **/ +#define USART_CTRL3_CTSEN ((uint32_t)0x00000001U) /* CTS Enable */ +#define USART_CTRL3_CTSIEN ((uint32_t)0x00000002U) /* CTS Interrupt Enable */ +#define USART_CTRL3_RTSEN ((uint32_t)0x00000004U) /* RTS Enable */ +#define USART_CTRL3_HDMEN ((uint32_t)0x00000008U) /* Half-Duplex Selection */ +#define USART_CTRL3_DMATXEN ((uint32_t)0x00000010U) /* DMA Enable Transmitter */ +#define USART_CTRL3_DMARXEN ((uint32_t)0x00000020U) /* DMA Enable Receiver */ +#define USART_CTRL3_ERRIEN ((uint32_t)0x00000040U) /* Error Interrupt Enable */ +#define USART_CTRL3_IRDAMEN ((uint32_t)0x00000080U) /* IrDA mode Enable */ +#define USART_CTRL3_IRDALP ((uint32_t)0x00000100U) /* IrDA Low-Power */ +#define USART_CTRL3_SCMEN ((uint32_t)0x00000200U) /* Smartcard mode enable */ +#define USART_CTRL3_SCNACK ((uint32_t)0x00000400U) /* Smartcard NACK enable */ + +/** Bit definition for USART_STS register **/ +#define USART_STS_TXFF ((uint32_t)0x00000001U) /* Send FIFO full */ +#define USART_STS_RXFF ((uint32_t)0x00000002U) /* Receive FIFO full */ +#define USART_STS_TXFE ((uint32_t)0x00000004U) /* Send FIFO empty*/ +#define USART_STS_RXFE ((uint32_t)0x00000008U) /* Receive FIFO empty */ +#define USART_STS_RXFT ((uint32_t)0x00000010U) /* RX FIFO threshold */ +#define USART_STS_TXFT ((uint32_t)0x00000020U) /* TX FIFO threshold*/ +#define USART_STS_IDLEF ((uint32_t)0x00000040U) /* IDLE line detected */ +#define USART_STS_TXDE ((uint32_t)0x00000080U) /* Transmit Data Register Empty */ +#define USART_STS_TXC ((uint32_t)0x00000100U) /* Transmission Complete */ +#define USART_STS_RXDNE ((uint32_t)0x00000200U) /* Read Data Register Not Empty */ +#define USART_STS_CTSF ((uint32_t)0x00000400U) /* CTS Flag */ +#define USART_STS_LINBDF ((uint32_t)0x00000800U) /* LIN Break Detection Flag */ +#define USART_STS_PEF ((uint32_t)0x00001000U) /* Parity Error */ +#define USART_STS_OREF ((uint32_t)0x00002000U) /* OverRun Error */ +#define USART_STS_NEF ((uint32_t)0x00004000U) /* Noise Error Flag */ +#define USART_STS_FEF ((uint32_t)0x00008000U) /* Framing Error */ +#define USART_STS_RTOF ((uint32_t)0x00010000U) /* recevier timeout */ +#define USART_STS_PELOSEF ((uint32_t)0x00020000U) /* Received Data PE Error Discard Flag */ +#define USART_STS_NELOSEF ((uint32_t)0x00040000U) /* Received Data NE Error Discard Flag */ +#define USART_STS_FELOSEF ((uint32_t)0x00080000U) /* Received Data FE Error Discard Flag */ + +/** Bit definition for USART_DAT register **/ +#define USART_DAT_DATV ((uint32_t)0x000001FFU) /* Data value */ + +/** Bit definition for USART_BRCF register **/ +#define USART_BRCF_DIV_Decimal ((uint32_t)0x000FU) /* Fraction of USARTDIV */ +#define USART_BRCF_DIV_Integer ((uint32_t)0xFFF0U) /* Mantissa of USARTDIV */ + +/** Bit definition for USART_GTP register **/ +#define USART_GTP_PSCV ((uint32_t)0x00FFU) /* PSC[7:0] bits (Prescaler value) */ +#define USART_GTP_PSCV_0 ((uint32_t)0x0001U) /* Bit 0 */ +#define USART_GTP_PSCV_1 ((uint32_t)0x0002U) /* Bit 1 */ +#define USART_GTP_PSCV_2 ((uint32_t)0x0004U) /* Bit 2 */ +#define USART_GTP_PSCV_3 ((uint32_t)0x0008U) /* Bit 3 */ +#define USART_GTP_PSCV_4 ((uint32_t)0x0010U) /* Bit 4 */ +#define USART_GTP_PSCV_5 ((uint32_t)0x0020U) /* Bit 5 */ +#define USART_GTP_PSCV_6 ((uint32_t)0x0040U) /* Bit 6 */ +#define USART_GTP_PSCV_7 ((uint32_t)0x0080U) /* Bit 7 */ + +#define USART_GTP_GTV ((uint32_t)0xFF00U) /* Guard time value */ + +/** Bit definition for USART_FIFO register **/ +#define USART_FIFO_EN ((uint32_t)0x00000001U) /* FIFO model enable */ +#define USART_FIFO_CLR ((uint32_t)0x00000002U) /* FIFO clear */ +#define USART_FIFO_TXFTCFG_MASK ((uint32_t)0x0000001CU) /* TXFIFO threshold configuration */ +#define USART_FIFO_RXFTCFG_MASK ((uint32_t)0x000000E0U) /* RXFIFO threshold configuration */ +#define USART_FIFO_TXFFIEN ((uint32_t)0x00000100U) /* TXFIFO full interrupt enable */ +#define USART_FIFO_RXFFIEN ((uint32_t)0x00000200U) /* RXFIFO full interrupt enable */ +#define USART_FIFO_TXFEIEN ((uint32_t)0x00000400U) /* TXFIFO empty interrupt enable */ +#define USART_FIFO_RXFEIEN ((uint32_t)0x00000800U) /* RXFIFO empty interrupt enable */ +#define USART_FIFO_RXFTIEN ((uint32_t)0x00001000U) /* RXFIFO threshold interrupt enable */ +#define USART_FIFO_TXFTIEN ((uint32_t)0x00002000U) /* TXFIFO threshold interrupt enable */ +#define USART_FIFO_RXCNT_MASK ((uint32_t)0x0003C000U) /* number of RXFIFO valid data mask */ +#define USART_FIFO_TXCNT_MASK ((uint32_t)0x003C0000U) /* number of TXFIFO valid data mask */ + +/** Bit definition for USART_IFW register **/ +#define USART_IFW_WIDTH_MASK ((uint32_t)0x0FFFFFFFU) /* Receiver timeout value */ + +/*** USB High Speed ***/ +/** Bit definition for USBHS_GCTRLSTS register **/ +#define USBHS_GCTRLSTS_VBVALOVEN_POS (2U) +#define USBHS_GCTRLSTS_VBVALOVEN ((uint32_t)0x00000004U) /* VBUS valid override enable */ +#define USBHS_GCTRLSTS_VBVALOVAL_POS (3U) +#define USBHS_GCTRLSTS_VBVALOVAL ((uint32_t)0x00000008U) /* VBUS valid override value */ +#define USBHS_GCTRLSTS_AVALOVEN_POS (4U) +#define USBHS_GCTRLSTS_AVALOVEN ((uint32_t)0x00000010U) /* A perpheral session valid override enable */ +#define USBHS_GCTRLSTS_AVALOVAL_POS (5U) +#define USBHS_GCTRLSTS_AVALOVAL ((uint32_t)0x00000020U) /* A perpheral session valid override value */ +#define USBHS_GCTRLSTS_BVALOVEN_POS (6U) +#define USBHS_GCTRLSTS_BVALOVEN ((uint32_t)0x00000040U) /* B perpheral session valid override enable */ +#define USBHS_GCTRLSTS_BVALOVAL_POS (7U) +#define USBHS_GCTRLSTS_BVALOVAL ((uint32_t)0x00000080U) /* B perpheral session valid override value */ +#define USBHS_GCTRLSTS_IDSTS_POS (16U) +#define USBHS_GCTRLSTS_IDSTS ((uint32_t)0x00010000U) /* ID pin status */ +#define USBHS_GCTRLSTS_DETIM_POS (17U) +#define USBHS_GCTRLSTS_DETIM ((uint32_t)0x00020000U) /* Debounce valid */ +#define USBHS_GCTRLSTS_ASVLD_POS (18U) +#define USBHS_GCTRLSTS_ASVLD ((uint32_t)0x00040000U) /* A session valid */ +#define USBHS_GCTRLSTS_BSVLD_POS (19U) +#define USBHS_GCTRLSTS_BSVLD ((uint32_t)0x00080000U) /* B session valid */ +#define USBHS_GCTRLSTS_CMODE_POS (21U) +#define USBHS_GCTRLSTS_CMODE ((uint32_t)0x00200000U) /* Current mode */ + + +/** Bit definition for USBHS_GAHBCFG register **/ +#define USBHS_GAHBCFG_GINTEN_POS (0U) +#define USBHS_GAHBCFG_GINTEN ((uint32_t)0x00000001U) +#define USBHS_GAHBCFG_BURSTTYP_POS (1U) +#define USBHS_GAHBCFG_BURSTTYP ((uint32_t)0x0000001EU) +#define USBHS_GAHBCFG_DMAEN_POS (5U) +#define USBHS_GAHBCFG_DMAEN ((uint32_t)0x00000020U) +#define USBHS_GAHBCFG_NPTXFETH_POS (7U) +#define USBHS_GAHBCFG_NPTXFETH ((uint32_t)0x00000080U) +#define USBHS_GAHBCFG_PTXFETH_POS (8U) +#define USBHS_GAHBCFG_PTXFETH ((uint32_t)0x00000100U) + +/** Bit definition for USBHS_GCFG register **/ +#define USBHS_GCFG_TOCAL_POS (0U) +#define USBHS_GCFG_TOCAL ((uint32_t)0x00000007U) +#define USBHS_GCFG_PHYIF_POS (3U) +#define USBHS_GCFG_PHYIF ((uint32_t)0x00000008U) +#define USBHS_GCFG_PHYSEL_POS (6U) +#define USBHS_GCFG_PHYSEL ((uint32_t)0x00000040U) +#define USBHS_GCFG_TRDTIM_POS (10U) +#define USBHS_GCFG_TRDTIM ((uint32_t)0x00003C00U) +#define USBHS_GCFG_FHMODE_POS (29U) +#define USBHS_GCFG_FHMODE ((uint32_t)0x20000000U) +#define USBHS_GCFG_FDMODE_POS (30U) +#define USBHS_GCFG_FDMODE ((uint32_t)0x40000000U) + +/** Bit definition for USBHS_GRSTCTRL register **/ +#define USBHS_GRSTCTRL_CSRST_POS (0U) +#define USBHS_GRSTCTRL_CSRST ((uint32_t)0x00000001U) +#define USBHS_GRSTCTRL_PFSSRST_POS (1U) +#define USBHS_GRSTCTRL_PFSSRST ((uint32_t)0x00000002U) +#define USBHS_GRSTCTRL_HFCRST_POS (2U) +#define USBHS_GRSTCTRL_HFCRST ((uint32_t)0x00000004U) +#define USBHS_GRSTCTRL_RXFFLSH_POS (4U) +#define USBHS_GRSTCTRL_RXFFLSH ((uint32_t)0x00000010U) +#define USBHS_GRSTCTRL_TXFFLSH_POS (5U) +#define USBHS_GRSTCTRL_TXFFLSH ((uint32_t)0x00000020U) +#define USBHS_GRSTCTRL_TXFNUM_POS (6U) +#define USBHS_GRSTCTRL_TXFNUM ((uint32_t)0x000007C0U) +#define USBHS_GRSTCTRL_SRSTDNE_POS (29U) +#define USBHS_GRSTCTRL_SRSTDNE ((uint32_t)0x20000000U) +#define USBHS_GRSTCTRL_DMAREQ_POS (30U) +#define USBHS_GRSTCTRL_DMAREQ ((uint32_t)0x40000000U) +#define USBHS_GRSTCTRL_AHBIDLE_POS (31U) +#define USBHS_GRSTCTRL_AHBIDLE ((uint32_t)0x80000000U) + +/** Bit definition for USBHS_GINTSTS register **/ +#define USBHS_GINTSTS_CMODE_POS (0U) +#define USBHS_GINTSTS_CMODE ((uint32_t)0x00000001U) +#define USBHS_GINTSTS_MODMISIF_POS (1U) +#define USBHS_GINTSTS_MODMISIF ((uint32_t)0x00000002U) +#define USBHS_GINTSTS_SOFIF_POS (3U) +#define USBHS_GINTSTS_SOFIF ((uint32_t)0x00000008U) +#define USBHS_GINTSTS_RXFNEIF_POS (4U) +#define USBHS_GINTSTS_RXFNEIF ((uint32_t)0x00000010U) +#define USBHS_GINTSTS_NPTXFEIF_POS (5U) +#define USBHS_GINTSTS_NPTXFEIF ((uint32_t)0x00000020U) +#define USBHS_GINTSTS_GINNPNAKEIF_POS (6U) +#define USBHS_GINTSTS_GINNPNAKEIF ((uint32_t)0x00000040U) +#define USBHS_GINTSTS_GOUTNAKEIF_POS (7U) +#define USBHS_GINTSTS_GOUTNAKEIF ((uint32_t)0x00000080U) +#define USBHS_GINTSTS_ESUSPIF_POS (10U) +#define USBHS_GINTSTS_ESUSPIF ((uint32_t)0x00000400U) +#define USBHS_GINTSTS_USBSUSPIF_POS (11U) +#define USBHS_GINTSTS_USBSUSPIF ((uint32_t)0x00000800U) +#define USBHS_GINTSTS_USBRSTIF_POS (12U) +#define USBHS_GINTSTS_USBRSTIF ((uint32_t)0x00001000U) +#define USBHS_GINTSTS_ENUMDIF_POS (13U) +#define USBHS_GINTSTS_ENUMDIF ((uint32_t)0x00002000U) +#define USBHS_GINTSTS_ISOUTPDIF_POS (14U) +#define USBHS_GINTSTS_ISOUTPDIF ((uint32_t)0x00004000U) +#define USBHS_GINTSTS_EOPFIF_POS (15U) +#define USBHS_GINTSTS_EOPFIF ((uint32_t)0x00008000U) +#define USBHS_GINTSTS_INEPIF_POS (18U) +#define USBHS_GINTSTS_INEPIF ((uint32_t)0x00040000U) +#define USBHS_GINTSTS_OUTEPIF_POS (19U) +#define USBHS_GINTSTS_OUTEPIF ((uint32_t)0x00080000U) +#define USBHS_GINTSTS_ISOINCIF_POS (20U) +#define USBHS_GINTSTS_ISOINCIF ((uint32_t)0x00100000U) +#define USBHS_GINTSTS_PTNCIF_ISOUTNCIF_POS (21U) +#define USBHS_GINTSTS_PTNCIF_ISOUTNCIF ((uint32_t)0x00200000U) +#define USBHS_GINTSTS_FETSUSPIF_POS (22U) +#define USBHS_GINTSTS_FETSUSPIF ((uint32_t)0x00400000U) +#define USBHS_GINTSTS_RSTDIF_POS (23U) +#define USBHS_GINTSTS_RSTDIF ((uint32_t)0x00800000U) +#define USBHS_GINTSTS_HPIF_POS (24U) +#define USBHS_GINTSTS_HPIF ((uint32_t)0x01000000U) +#define USBHS_GINTSTS_HCHIF_POS (25U) +#define USBHS_GINTSTS_HCHIF ((uint32_t)0x02000000U) +#define USBHS_GINTSTS_PTXFEIF_POS (26U) +#define USBHS_GINTSTS_PTXFEIF ((uint32_t)0x04000000U) +#define USBHS_GINTSTS_IDSTSCIF_POS (28U) +#define USBHS_GINTSTS_IDSTSCIF ((uint32_t)0x10000000U) +#define USBHS_GINTSTS_DISCIF_POS (29U) +#define USBHS_GINTSTS_DISCIF ((uint32_t)0x20000000U) +#define USBHS_GINTSTS_WKUPIF_POS (31U) +#define USBHS_GINTSTS_WKUPIF ((uint32_t)0x80000000U) + +/** Bit definition for USBHS_GINTEN register **/ +#define USBHS_GINTEN_MODMISIEN_POS (1U) +#define USBHS_GINTEN_MODMISIEN ((uint32_t)0x00000002U) +#define USBHS_GINTEN_USBHSIEN_POS (2U) +#define USBHS_GINTEN_USBHSIEN ((uint32_t)0x00000004U) +#define USBHS_GINTEN_SOFIEN_POS (3U) +#define USBHS_GINTEN_SOFIEN ((uint32_t)0x00000008U) +#define USBHS_GINTEN_RXFNEIEN_POS (4U) +#define USBHS_GINTEN_RXFNEIEN ((uint32_t)0x00000010U) +#define USBHS_GINTEN_NPTXFEIEN_POS (5U) +#define USBHS_GINTEN_NPTXFEIEN ((uint32_t)0x00000020U) +#define USBHS_GINTEN_GINNPNAKEIEN_POS (6U) +#define USBHS_GINTEN_GINNPNAKEIEN ((uint32_t)0x00000040U) +#define USBHS_GINTEN_GOUTNAKEIEN_POS (7U) +#define USBHS_GINTEN_GOUTNAKEIEN ((uint32_t)0x00000080U) +#define USBHS_GINTEN_ESUSPIEN_POS (10U) +#define USBHS_GINTEN_ESUSPIEN ((uint32_t)0x00000400U) +#define USBHS_GINTEN_USBSUSPIEN_POS (11U) +#define USBHS_GINTEN_USBSUSPIEN ((uint32_t)0x00000800U) +#define USBHS_GINTEN_USBRSTIEN_POS (12U) +#define USBHS_GINTEN_USBRSTIEN ((uint32_t)0x00001000U) +#define USBHS_GINTEN_ENUMDIEN_POS (13U) +#define USBHS_GINTEN_ENUMDIEN ((uint32_t)0x00002000U) +#define USBHS_GINTEN_ISOUTPDIEN_POS (14U) +#define USBHS_GINTEN_ISOUTPDIEN ((uint32_t)0x00004000U) +#define USBHS_GINTEN_EOPFIEN_POS (15U) +#define USBHS_GINTEN_EOPFIEN ((uint32_t)0x00008000U) +#define USBHS_GINTEN_INEPIEN_POS (18U) +#define USBHS_GINTEN_INEPIEN ((uint32_t)0x00040000U) +#define USBHS_GINTEN_OUTEPIEN_POS (19U) +#define USBHS_GINTEN_OUTEPIEN ((uint32_t)0x00080000U) +#define USBHS_GINTEN_ISOINCIEN_POS (20U) +#define USBHS_GINTEN_ISOINCIEN ((uint32_t)0x00100000U) +#define USBHS_GINTEN_PTNCIEN_ISOUTNCIEN_POS (21U) +#define USBHS_GINTEN_PTNCIEN_ISOUTNCIEN ((uint32_t)0x00200000U) +#define USBHS_GINTEN_FETSUSPIEN_POS (22U) +#define USBHS_GINTEN_FETSUSPIEN ((uint32_t)0x00400000U) +#define USBHS_GINTEN_RSTDIEN_POS (23U) +#define USBHS_GINTEN_RSTDIEN ((uint32_t)0x00800000U) +#define USBHS_GINTEN_HPIEN_POS (24U) +#define USBHS_GINTEN_HPIEN ((uint32_t)0x01000000U) +#define USBHS_GINTEN_HCHIEN_POS (25U) +#define USBHS_GINTEN_HCHIEN ((uint32_t)0x02000000U) +#define USBHS_GINTEN_PTXFEIEN_POS (26U) +#define USBHS_GINTEN_PTXFEIEN ((uint32_t)0x04000000U) +#define USBHS_GINTEN_IDSTSCIEN_POS (28U) +#define USBHS_GINTEN_IDSTSCIEN ((uint32_t)0x10000000U) +#define USBHS_GINTEN_DISCIEN_POS (29U) +#define USBHS_GINTEN_DISCIEN ((uint32_t)0x20000000U) +#define USBHS_GINTEN_VBUSVIF_POS (30U) +#define USBHS_GINTEN_VBUSVIF ((uint32_t)0x40000000U) +#define USBHS_GINTEN_WKUPIEN_POS (31U) +#define USBHS_GINTEN_WKUPIEN ((uint32_t)0x80000000U) + +/** Bit definition for USBHS_GRXSTS/USBHS_GRXSTSP register **/ +#define USBHS_GRXSTS_CHEPNUM_POS (0U) +#define USBHS_GRXSTS_CHEPNUM ((uint32_t)0x0000000FU) +#define USBHS_GRXSTS_BCNT_POS (4U) +#define USBHS_GRXSTS_BCNT ((uint32_t)0x00007FF0U) +#define USBHS_GRXSTS_DPID_POS (15U) +#define USBHS_GRXSTS_DPID ((uint32_t)0x00018000U) +#define USBHS_GRXSTS_PKTSTS_POS (17U) +#define USBHS_GRXSTS_PKTSTS ((uint32_t)0x001E0000U) +#define USBHS_GRXSTS_FUNM_POS (21U) +#define USBHS_GRXSTS_FUNM ((uint32_t)0x01E00000U) + +/** Bit definition for USBHS_GRXFSIZ register **/ +#define USBHS_GRXFSIZ_RXFDEP ((uint32_t)0x000007FFU) + +/** Bit definition for USBHS_HNPTXFSIZ register **/ +#define USBHS_HNPTXFSIZ_NPTXFSADD_POS (0U) +#define USBHS_HNPTXFSIZ_NPTXFSADD ((uint32_t)0x000007FFU) +#define USBHS_HNPTXFSIZ_IEP0TXFDEP_POS (16U) +#define USBHS_HNPTXFSIZ_IEP0TXFDEP ((uint32_t)0x07FF0000U) + +/** Bit definition for USBHS_DINEP0TXSIZ register **/ +#define USBHS_DINEP0TXSIZ_IEP0TXFRSADD_POS (0U) +#define USBHS_DINEP0TXSIZ_IEP0TXFRSADD ((uint32_t)0x000007FFU) +#define USBHS_DINEP0TXSIZ_NPTXFDEP_POS (16U) +#define USBHS_DINEP0TXSIZ_NPTXFDEP ((uint32_t)0x07FF0000U) + +/** Bit definition for USBHS_GNPTXFSTS register **/ +#define USBHS_GNPTXFSTS_NPTXFSAV_POS (0U) +#define USBHS_GNPTXFSTS_NPTXFSAV ((uint32_t)0x0000FFFFU) +#define USBHS_GNPTXFSTS_NPTXRQSAV_POS (16U) +#define USBHS_GNPTXFSTS_NPTXRQSAV ((uint32_t)0x00FF0000U) +#define USBHS_GNPTXFSTS_NPTXRQTOP_POS (24U) +#define USBHS_GNPTXFSTS_NPTXRQTOP ((uint32_t)0x7F000000U) +#define USBHS_GNPTXFSTS_NPTXRQTOP_END_POS (24U) +#define USBHS_GNPTXFSTS_NPTXRQTOP_END ((uint32_t)0x01000000U) +#define USBHS_GNPTXFSTS_NPTXRQTOP_TOKEN_POS (25U) +#define USBHS_GNPTXFSTS_NPTXRQTOP_TOKEN ((uint32_t)0x06000000U) +#define USBHS_GNPTXFSTS_NPTXRQTOP_CHNUM_POS (27U) +#define USBHS_GNPTXFSTS_NPTXRQTOP_CHNUM ((uint32_t)0x78000000U) + +/** Bit definition for USBHS_CID register **/ +#define USBHS_CID ((uint32_t)0xFFFFFFFFU) + +/** Bit definition for USBHS_GPD register **/ +#define USBHS_GPD_LINSTSCHNGSTS_POS (7U) +#define USBHS_GPD_LINSTSCHNGSTS ((uint32_t)0x00000080U) +#define USBHS_GPD_LINSTSCHNGINTEN_POS (8U) +#define USBHS_GPD_LINSTSCHNGINTEN ((uint32_t)0x00000100U) +#define USBHS_GPD_RESTDETSTS_POS (9U) +#define USBHS_GPD_RESTDETSTS ((uint32_t)0x00000200U) +#define USBHS_GPD_RESTDETINTEN_POS (10U) +#define USBHS_GPD_RESTDETINTEN ((uint32_t)0x00000400U) +#define USBHS_GPD_DISCONNDETSTS_POS (11U) +#define USBHS_GPD_DISCONNDETSTS ((uint32_t)0x00000800U) +#define USBHS_GPD_DISCONNDETINTEN_POS (12U) +#define USBHS_GPD_DISCONNDETINTEN ((uint32_t)0x00001000U) +#define USBHS_GPD_CONNDETSTS_POS (13U) +#define USBHS_GPD_CONNDETSTS ((uint32_t)0x00002000U) +#define USBHS_GPD_CONNDETINTEN_POS (14U) +#define USBHS_GPD_CONNDETINTEN ((uint32_t)0x00004000U) +#define USBHS_GPD_STSCHNGINTSTS_POS (17U) +#define USBHS_GPD_STSCHNGINTSTS ((uint32_t)0x00020000U) +#define USBHS_GPD_STSCHNGINTEN_POS (18U) +#define USBHS_GPD_STSCHNGINTEN ((uint32_t)0x00040000U) +#define USBHS_GPD_LINSTS_POS (19U) +#define USBHS_GPD_LINSTS ((uint32_t)0x00180000U) +#define USBHS_GPD_IDDIG_POS (21U) +#define USBHS_GPD_IDDIG ((uint32_t)0x00200000U) + +/** Bit definition for USBHS_HPTXFSIZ register **/ +#define USBHS_HPTXFSIZ_HPTXFSADD_POS (0U) +#define USBHS_HPTXFSIZ_HPTXFSADD ((uint32_t)0x0000FFFFU) +#define USBHS_HPTXFSIZ_HPTXFDEP_POS (16U) +#define USBHS_HPTXFSIZ_HPTXFDEP ((uint32_t)0xFFFF0000U) + +/** Bit definition for USBHS_DINEPPTXFSIZ1/2/3/4/5/6/7/8 register **/ +#define USBHS_DINEPPTXFSIZ_INEPTXSADD_POS (0U) +#define USBHS_DINEPPTXFSIZ_INEPTXSADD ((uint32_t)0x0000FFFFU) +#define USBHS_DINEPPTXFSIZ_INEPTXFDEP_POS (16U) +#define USBHS_DINEPPTXFSIZ_INEPTXFDEP ((uint32_t)0xFFFF0000U) + +/** Bit definition for USBHS_HCFG register **/ +#define USBHS_HCFG_SPSEL_POS (2U) +#define USBHS_HCFG_SPSEL ((uint32_t)0x00000004U) + +/** Bit definition for USBHS_HFRI register **/ +#define USBHS_HFRI_FRI_POS (0U) +#define USBHS_HFRI_FRI ((uint32_t)0x0000FFFFU) +#define USBHS_HFRI_DRLDEN_POS (16U) +#define USBHS_HFRI_DRLDEN ((uint32_t)0x00010000U) + +/** Bit definition for USBHS_HFNUM register **/ +#define USBHS_HFNUM_FRNUM_POS (0U) +#define USBHS_HFNUM_FRNUM ((uint32_t)0x0000FFFFU) +#define USBHS_HFNUM_FRT_POS (16U) +#define USBHS_HFNUM_FRT ((uint32_t)0xFFFF0000U) + +/** Bit definition for USBHS_HPTXFQSTS register **/ +#define USBHS_HPTXFQSTS_PTXFSAVL_POS (0U) +#define USBHS_HPTXFQSTS_PTXFSAVL ((uint32_t)0x0000FFFFU) +#define USBHS_HPTXFQSTS_PTXRQSAV_POS (16U) +#define USBHS_HPTXFQSTS_PTXRQSAV ((uint32_t)0x007F0000U) +#define USBHS_HPTXFQSTS_PTXRQTOP_POS (23U) +#define USBHS_HPTXFQSTS_PTXRQTOP ((uint32_t)0xFF800000U) +#define USBHS_HPTXFQSTS_PTXRQTOP_END_POS (23U) +#define USBHS_HPTXFQSTS_PTXRQTOP_END ((uint32_t)0x00800000U) +#define USBHS_HPTXFQSTS_PTXRQTOP_PEND_POS (24U) +#define USBHS_HPTXFQSTS_PTXRQTOP_PEND ((uint32_t)0x01000000U) +#define USBHS_HPTXFQSTS_PTXRQTOP_TOKEN_POS (25U) +#define USBHS_HPTXFQSTS_PTXRQTOP_TOKEN ((uint32_t)0x06000000U) +#define USBHS_HPTXFQSTS_PTXRQTOP_CHNUM_POS (27U) +#define USBHS_HPTXFQSTS_PTXRQTOP_CHNUM ((uint32_t)0x78000000U) +#define USBHS_HPTXFQSTS_PTXRQTOP_OEFRM_POS (31U) +#define USBHS_HPTXFQSTS_PTXRQTOP_OEFRM ((uint32_t)0x80000000U) + + + +/** Bit definition for USBHS_HACHINT register **/ +#define USBHS_HACHINT_POS (0U) +#define USBHS_HACHINT ((uint32_t)0x0000FFFFU) + +/** Bit definition for USBHS_HACHINTEN register **/ +#define USBHS_HACHINTEN_POS (0U) +#define USBHS_HACHINTEN ((uint32_t)0x0000FFFFU) + +/** Bit definition for USBHS_HPCS register **/ +#define USBHS_HPCS_PCSTS_POS (0U) +#define USBHS_HPCS_PCSTS ((uint32_t)0x00000001U) +#define USBHS_HPCS_PCDET_POS (1U) +#define USBHS_HPCS_PCDET ((uint32_t)0x00000002U) +#define USBHS_HPCS_PEN_POS (2U) +#define USBHS_HPCS_PEN ((uint32_t)0x00000004U) +#define USBHS_HPCS_PENC_POS (3U) +#define USBHS_HPCS_PENC ((uint32_t)0x00000008U) +#define USBHS_HPCS_POCA_POS (4U) +#define USBHS_HPCS_POCA ((uint32_t)0x00000010U) +#define USBHS_HPCS_POCC_POS (5U) +#define USBHS_HPCS_POCC ((uint32_t)0x00000020U) +#define USBHS_HPCS_PRES_POS (6U) +#define USBHS_HPCS_PRES ((uint32_t)0x00000040U) +#define USBHS_HPCS_PSUSP_POS (7U) +#define USBHS_HPCS_PSUSP ((uint32_t)0x00000080U) +#define USBHS_HPCS_PRST_POS (8U) +#define USBHS_HPCS_PRST ((uint32_t)0x00000100U) +#define USBHS_HPCS_PLSTS_POS (10U) +#define USBHS_HPCS_PLSTS ((uint32_t)0x00000C00U) +#define USBHS_HPCS_PPWR_POS (12U) +#define USBHS_HPCS_PPWR ((uint32_t)0x00001000U) +#define USBHS_HPCS_PTCTRL_POS (13U) +#define USBHS_HPCS_PTCTRL ((uint32_t)0x0001E000U) +#define USBHS_HPCS_PSPD_POS (17U) +#define USBHS_HPCS_PSPD ((uint32_t)0x00060000U) + +/** Bit definition for USBHS_HCHCTRL(0~15) register **/ +#define USBHS_HCHCTRL_MPS_POS (0U) +#define USBHS_HCHCTRL_MPS ((uint32_t)0x000007FFU) +#define USBHS_HCHCTRL_EPNUM_POS (11U) +#define USBHS_HCHCTRL_EPNUM ((uint32_t)0x00007800U) +#define USBHS_HCHCTRL_EPDIR_POS (15U) +#define USBHS_HCHCTRL_EPDIR ((uint32_t)0x00008000U) +#define USBHS_HCHCTRL_LSPDDEV_POS (17U) +#define USBHS_HCHCTRL_LSPDDEV ((uint32_t)0x00020000U) +#define USBHS_HCHCTRL_EPTYPE_POS (18U) +#define USBHS_HCHCTRL_EPTYPE ((uint32_t)0x000C0000U) +#define USBHS_HCHCTRL_DEVADDR_POS (22U) +#define USBHS_HCHCTRL_DEVADR ((uint32_t)0x1FC00000U) +#define USBHS_HCHCTRL_ODDFRM_POS (29U) +#define USBHS_HCHCTRL_ODDFRM ((uint32_t)0x20000000U) +#define USBHS_HCHCTRL_CHDIS_POS (30U) +#define USBHS_HCHCTRL_CHDIS ((uint32_t)0x40000000U) +#define USBHS_HCHCTRL_CHEN_POS (31U) +#define USBHS_HCHCTRL_CHEN ((uint32_t)0x80000000U) + +/** Bit definition for USBHS_HCHSCTRL(0~15) register **/ +#define USBHS_HCHSCTRL_PRTADD_POS (0U) +#define USBHS_HCHSCTRL_PRTADD ((uint32_t)0x0000007FU) +#define USBHS_HCHSCTRL_HUBADD_POS (7U) +#define USBHS_HCHSCTRL_HUBADD ((uint32_t)0x00003FC0U) +#define USBHS_HCHSCTRL_TRANPOS_POS (14U) +#define USBHS_HCHSCTRL_TRANPOS ((uint32_t)0x0000C000U) +#define USBHS_HCHSCTRL_COMPSPLF_POS (16U) +#define USBHS_HCHSCTRL_COMPSPLF ((uint32_t)0x00010000U) +#define USBHS_HCHCTRL_SPLEN_POS (31U) +#define USBHS_HCHCTRL_SPLEN ((uint32_t)0x80000000U) + +/** Bit definition for USBHS_HCINTSTS(0~15) register **/ +#define USBHS_HCHINTSTS_TXCFIF_POS (0U) +#define USBHS_HCHINTSTS_TXCFIF ((uint32_t)0x00000001U) +#define USBHS_HCHINTSTS_CHHTDIF_POS (1U) +#define USBHS_HCHINTSTS_CHHTDIF ((uint32_t)0x00000002U) +#define USBHS_HCHINTSTS_AHBERRIF_POS (2U) +#define USBHS_HCHINTSTS_AHBERRIF ((uint32_t)0x00000004U) +#define USBHS_HCHINTSTS_STALLIF_POS (3U) +#define USBHS_HCHINTSTS_STALLIF ((uint32_t)0x00000008U) +#define USBHS_HCHINTSTS_NAKIF_POS (4U) +#define USBHS_HCHINTSTS_NAKIF ((uint32_t)0x00000010U) +#define USBHS_HCHINTSTS_ACKIF_POS (5U) +#define USBHS_HCHINTSTS_ACKIF ((uint32_t)0x00000020U) +#define USBHS_HCHINTSTS_NYETIF_POS (6U) +#define USBHS_HCHINTSTS_NYETIF ((uint32_t)0x00000040U) +#define USBHS_HCHINTSTS_TXERRIF_POS (7U) +#define USBHS_HCHINTSTS_TXERRIF ((uint32_t)0x00000080U) +#define USBHS_HCHINTSTS_BBERRIF_POS (8U) +#define USBHS_HCHINTSTS_BBERRIF ((uint32_t)0x00000100U) +#define USBHS_HCHINTSTS_FOVRIF_POS (9U) +#define USBHS_HCHINTSTS_FOVRIF ((uint32_t)0x00000200U) +#define USBHS_HCHINTSTS_DTERRIF_POS (10U) +#define USBHS_HCHINTSTS_DTERRIF ((uint32_t)0x00000400U) + +/** Bit definition for USBHS_HCHINTEN(0~15) register **/ +#define USBHS_HCHINTEN_TXCIEN_POS (0U) +#define USBHS_HCHINTEN_TXCIEN ((uint32_t)0x00000001U) +#define USBHS_HCHINTEN_CHHTDIEN_POS (1U) +#define USBHS_HCHINTEN_CHHTDIEN ((uint32_t)0x00000002U) +#define USBHS_HCHINTEN_AHBERRIEN_POS (2U) +#define USBHS_HCHINTEN_AHBERRIEN ((uint32_t)0x00000004U) +#define USBHS_HCHINTEN_STALLIEN_POS (3U) +#define USBHS_HCHINTEN_STALLIEN ((uint32_t)0x00000008U) +#define USBHS_HCHINTEN_NAKIEN_POS (4U) +#define USBHS_HCHINTEN_NAKIEN ((uint32_t)0x00000010U) +#define USBHS_HCHINTEN_ACKIEN_POS (5U) +#define USBHS_HCHINTEN_ACKIEN ((uint32_t)0x00000020U) +#define USBHS_HCHINTEN_NYETIEN_POS (6U) +#define USBHS_HCHINTEN_NYETIEN ((uint32_t)0x00000020U) +#define USBHS_HCHINTEN_TXERRIEN_POS (7U) +#define USBHS_HCHINTEN_TXERRIEN ((uint32_t)0x00000080U) +#define USBHS_HCHINTEN_BBERRIEN_POS (8U) +#define USBHS_HCHINTEN_BBERRIEN ((uint32_t)0x00000100U) +#define USBHS_HCHINTEN_FOVRIEN_POS (9U) +#define USBHS_HCHINTEN_FOVRIEN ((uint32_t)0x00000200U) +#define USBHS_HCHINTEN_DTERRIEN_POS (10U) +#define USBHS_HCHINTEN_DTERRIEN ((uint32_t)0x00000400U) + +/** Bit definition for USBHS_HCHTXSIZ(0~15) register **/ +#define USBHS_HCHTXSIZ_TXSIZ_POS (0U) +#define USBHS_HCHTXSIZ_TXSIZ ((uint32_t)0x0007FFFFU) +#define USBHS_HCHTXSIZ_PKCNT_POS (19U) +#define USBHS_HCHTXSIZ_PKCNT ((uint32_t)0x1FF80000U) +#define USBHS_HCHTXSIZ_PID_POS (29U) +#define USBHS_HCHTXSIZ_PID ((uint32_t)0x60000000U) +#define USBHS_HCHCTRL_DPING_POS (31U) +#define USBHS_HCHCTRL_DPING ((uint32_t)0x80000000U) + +/** Bit definition for USBHS_HCDMA(0~15) register **/ +#define USBHS_HCDMA ((uint32_t)0xFFFFFFFFU) + +/** Bit definition for USBHS_DCFG register **/ +#define USBHS_DCFG_DEVSPD_POS (0U) +#define USBHS_DCFG_DEVSPD ((uint32_t)0x00000003U) +#define USBHS_DCFG_NZLSOUTHSK_POS (2U) +#define USBHS_DCFG_NZLSOUTHSK ((uint32_t)0x00000004U) +#define USBHS_DCFG_DEVARR_POS (4U) +#define USBHS_DCFG_DEVARR ((uint32_t)0x000007F0U) +#define USBHS_DCFG_PFRITVL_POS (11U) +#define USBHS_DCFG_PFRITVL ((uint32_t)0x00001800U) +#define USBHS_DCFG_XCVDRLY_POS (14U) +#define USBHS_DCFG_XCVDRLY ((uint32_t)0x00004000U) +#define USBHS_DCFG_EERRAIEN_POS (15U) +#define USBHS_DCFG_EERRAIEN ((uint32_t)0x00008000U) +#define USBHS_DCFG_PSITVL_POS (24U) +#define USBHS_DCFG_PSITVL ((uint32_t)0x03000000U) + +/** Bit definition for USBHS_DCTRL register **/ +#define USBHS_DCTRL_RMWKUP_POS (0U) +#define USBHS_DCTRL_RMWKUP ((uint32_t)0x00000001U) +#define USBHS_DCTRL_SFTDIS_POS (1U) +#define USBHS_DCTRL_SFTDIS ((uint32_t)0x00000002U) +#define USBHS_DCTRL_GINAKSTS_POS (2U) +#define USBHS_DCTRL_GINAKSTS ((uint32_t)0x00000004U) +#define USBHS_DCTRL_GONAKSTS_POS (3U) +#define USBHS_DCTRL_GONAKSTS ((uint32_t)0x00000008U) +#define USBHS_DCTRL_TSCTRL_POS (4U) +#define USBHS_DCTRL_TSCTRL ((uint32_t)0x00000070U) +#define USBHS_DCTRL_SGINAK_POS (7U) +#define USBHS_DCTRL_SGINAK ((uint32_t)0x00000080U) +#define USBHS_DCTRL_CGNPINAK_POS (8U) +#define USBHS_DCTRL_CGNPINAK ((uint32_t)0x00000100U) +#define USBHS_DCTRL_SGONAK_POS (9U) +#define USBHS_DCTRL_SGONAK ((uint32_t)0x00000200U) +#define USBHS_DCTRL_CGONAK_POS (10U) +#define USBHS_DCTRL_CGONAK ((uint32_t)0x00000400U) +#define USBHS_DCTRL_POPDNE_POS (11U) +#define USBHS_DCTRL_POPDNE ((uint32_t)0x00000800U) +#define USBHS_DCTRL_NAKOBBLE_POS (16U) +#define USBHS_DCTRL_NAKOBBLE ((uint32_t)0x00010000U) + +/** Bit definition for USBHS_DSTS register **/ +#define USBHS_DSTS_SUSPF_POS (0U) +#define USBHS_DSTS_SUSPF ((uint32_t)0x00000001U) +#define USBHS_DSTS_ENUMSPD_POS (1U) +#define USBHS_DSTS_ENUMSPD ((uint32_t)0x00000006U) +#define USBHS_DSTS_ERERRF_POS (3U) +#define USBHS_DSTS_ERERRF ((uint32_t)0x00000008U) +#define USBHS_DSTS_SOFFN_POS (8U) +#define USBHS_DSTS_SOFFN ((uint32_t)0x003FFF00U) +#define USBHS_DSTS_DEVLINSTS_POS (22U) +#define USBHS_DSTS_DEVLINSTS ((uint32_t)0x00C00000U) + +/** Bit definition for USBHS_DINEPINTEN register **/ +#define USBHS_DINEPINTEN_TXCIEN_POS (0U) +#define USBHS_DINEPINTEN_TXCIEN ((uint32_t)0x00000001U) +#define USBHS_DINEPINTEN_EPDIEN_POS (1U) +#define USBHS_DINEPINTEN_EPDIEN ((uint32_t)0x00000002U) +#define USBHS_DINEPINTEN_AHBERRIEN_POS (2U) +#define USBHS_DINEPINTEN_AHBERRIEN ((uint32_t)0x00000004U) +#define USBHS_DINEPINTEN_TOIEN_POS (3U) +#define USBHS_DINEPINTEN_TOIEN ((uint32_t)0x00000008U) +#define USBHS_DINEPINTEN_TXFERINTKIEN_POS (4U) +#define USBHS_DINEPINTEN_TXFERINTKIEN ((uint32_t)0x00000010U) +#define USBHS_DINEPINTEN_INTREPMISIEN_POS (5U) +#define USBHS_DINEPINTEN_INTREPMISIEN ((uint32_t)0x00000020U) +#define USBHS_DINEPINTEN_INEPNAKEIEN_POS (6U) +#define USBHS_DINEPINTEN_INEPNAKEIEN ((uint32_t)0x00000040U) +#define USBHS_DINEPINTEN_TXFUDIEN_POS (8U) +#define USBHS_DINEPINTEN_TXFUDIEN ((uint32_t)0x00000100U) +#define USBHS_DINEPINTEN_NAKIEN_POS (13U) +#define USBHS_DINEPINTEN_NAKIEN ((uint32_t)0x00002000U) + +/** Bit definition for USBHS_DOUTEPINTEN register **/ +#define USBHS_DOUTEPINTEN_TXCIEN_POS (0U) +#define USBHS_DOUTEPINTEN_TXCIEN ((uint32_t)0x00000001U) +#define USBHS_DOUTEPINTEN_EPDIEN_POS (1U) +#define USBHS_DOUTEPINTEN_EPDIEN ((uint32_t)0x00000002U) +#define USBHS_DOUTEPINTEN_AHBERRIEN_POS (2U) +#define USBHS_DOUTEPINTEN_AHBERRIEN ((uint32_t)0x00000004U) +#define USBHS_DOUTEPINTEN_STUPDNEIEN_POS (3U) +#define USBHS_DOUTEPINTEN_STUPDNEIEN ((uint32_t)0x00000008U) +#define USBHS_DOUTEPINTEN_EPDISROTIEN_POS (4U) +#define USBHS_DOUTEPINTEN_EPDISROTIEN ((uint32_t)0x00000010U) +#define USBHS_DOUTEPINTEN_B2BSTUPIEN_POS (6U) +#define USBHS_DOUTEPINTEN_B2BSTUPIEN ((uint32_t)0x00000040U) +#define USBHS_DOUTEPINTEN_OPERRIEN_POS (8U) +#define USBHS_DOUTEPINTEN_OPERRIEN ((uint32_t)0x00000100U) +#define USBHS_DOUTEPINTEN_BERRIEN_POS (12U) +#define USBHS_DOUTEPINTEN_BERRIEN ((uint32_t)0x00001000U) +#define USBHS_DOUTEPINTEN_NAKIEN_POS (13U) +#define USBHS_DOUTEPINTEN_NAKIEN ((uint32_t)0x00002000U) +#define USBHS_DOUTEPINTEN_NYETIEN_POS (14U) +#define USBHS_DOUTEPINTEN_NYETIEN ((uint32_t)0x00004000U) + +/** Bit definition for USBHS_DAEPINTSTS register **/ +#define USBHS_DAEPINTSTS_INEPINT_POS (0U) +#define USBHS_DAEPINTSTS_IEPINT ((uint32_t)0x000001FFU) +#define USBHS_DAEPINTSTS_OUTEPINT_POS (16U) +#define USBHS_DAEPINTSTS_OUTEPINT ((uint32_t)0x01FF0000U) + +/** Bit definition for USBHS_DAEPINTEN register **/ +#define USBHS_DAEPINTEN_INEPIEN_POS (0U) +#define USBHS_DAEPINTEN_INEPIEN ((uint32_t)0x000001FFU) +#define USBHS_DAEPINTEN_OUTEPIEN_POS (16U) +#define USBHS_DAEPINTEN_OUTEPIEN ((uint32_t)0x01FF0000U) + +/** Bit definition for USBHS_DTHRCTRL register **/ +#define USBHS_DTHRCTRL_NISOINEPTHREN_POS (0U) +#define USBHS_DTHRCTRL_NISOINEPTHREN ((uint32_t)0x00000001U) +#define USBHS_DTHRCTRL_ISOINEPTHREN_POS (1U) +#define USBHS_DTHRCTRL_ISOINEPTHREN ((uint32_t)0x00000002U) +#define USBHS_DTHRCTRL_TXTHRLEN_POS (2U) +#define USBHS_DTHRCTRL_TXTHRLEN ((uint32_t)0x000007FCU) +#define USBHS_DTHRCTRL_RXTHREN_POS (16U) +#define USBHS_DTHRCTRL_RXTHREN ((uint32_t)0x00010000U) +#define USBHS_DTHRCTRL_RXTHRLEN_POS (17U) +#define USBHS_DTHRCTRL_RXTHRLEN ((uint32_t)0x03FE0000U) +#define USBHS_DTHRCTRL_ARPEN_POS (27U) +#define USBHS_DTHRCTRL_ARPEN ((uint32_t)0x08000000U) + +/** Bit definition for USBHS_DINEPFEINTEN register **/ +#define USBHS_DINEPFEINTEN_INEPTXFEIEN ((uint32_t)0x0000FFFFU) + +/** Bit definition for USBHS_DEEPINTSTS register **/ +#define USBHS_DEEPINTSTS_INEPINT_POS (0U) +#define USBHS_DEEPINTSTS_IEPINT ((uint32_t)0x000000FFU) +#define USBHS_DEEPINTSTS_OUTEPINT_POS (16U) +#define USBHS_DEEPINTSTS_OUTEPINT ((uint32_t)0x00FF0000U) + +/** Bit definition for USBHS_DEEPINTEN register **/ +#define USBHS_DEEPINTEN_INEPIEN_POS (0U) +#define USBHS_DEEPINTEN_INEPIEN ((uint32_t)0x000000FFU) +#define USBHS_DEEPINTEN_OUTEPIEN_POS (16U) +#define USBHS_DEEPINTEN_OUTEPIEN ((uint32_t)0x00FF0000U) + +/** Bit definition for USBHS_DINEPXINTEN(0~8) register **/ +#define USBHS_DINEPXINTEN_TXCIEN_POS (0U) +#define USBHS_DINEPXINTEN_TXCIEN ((uint32_t)0x00000001U) +#define USBHS_DINEPXINTEN_EPDISIEN_POS (1U) +#define USBHS_DINEPXINTEN_EPDISIEN ((uint32_t)0x00000002U) +#define USBHS_DINEPXINTEN_AHBERRIEN_POS (2U) +#define USBHS_DINEPXINTEN_AHBERRIEN ((uint32_t)0x00000004U) +#define USBHS_DINEPXINTEN_TOIEN_POS (3U) +#define USBHS_DINEPXINTEN_TOIEN ((uint32_t)0x00000008U) +#define USBHS_DINEPXINTEN_TXFERINTKIEN_POS (4U) +#define USBHS_DINEPXINTEN_TXFERINTKIEN ((uint32_t)0x00000010U) +#define USBHS_DINEPXINTEN_INTREPMISIEN_POS (5U) +#define USBHS_DINEPXINTEN_INTREPMISIEN ((uint32_t)0x00000020U) +#define USBHS_DINEPXINTEN_INEPNAKEIEN_POS (6U) +#define USBHS_DINEPXINTEN_INEPNAKEIEN ((uint32_t)0x00000040U) +#define USBHS_DINEPXINTEN_TXFUDIEN_POS (8U) +#define USBHS_DINEPXINTEN_TXFUDIEN ((uint32_t)0x00000100U) +#define USBHS_DINEPXINTEN_NAKIEN_POS (13U) +#define USBHS_DINEPXINTEN_NAKIEN ((uint32_t)0x00002000U) + +/** Bit definition for USBHS_DOUTEPXINTEN(0~8) register **/ +#define USBHS_DOUTEPXINTEN_TXCIEN_POS (0U) +#define USBHS_DOUTEPXINTEN_TXCIEN ((uint32_t)0x00000001U) +#define USBHS_DOUTEPXINTEN_EPDIEN_POS (1U) +#define USBHS_DOUTEPXINTEN_EPDIEN ((uint32_t)0x00000002U) +#define USBHS_DOUTEPXINTEN_AHBERRIEN_POS (2U) +#define USBHS_DOUTEPXINTEN_AHBERRIEN ((uint32_t)0x00000004U) +#define USBHS_DOUTEPXINTEN_STUPDNEIEN_POS (3U) +#define USBHS_DOUTEPXINTEN_STUPDNEIEN ((uint32_t)0x00000008U) +#define USBHS_DOUTEPXINTEN_EPDISROTIEN_POS (4U) +#define USBHS_DOUTEPXINTEN_EPDISROTIEN ((uint32_t)0x00000010U) +#define USBHS_DOUTEPXINTEN_B2BSTUPIEN_POS (6U) +#define USBHS_DOUTEPXINTEN_B2BSTUPIEN ((uint32_t)0x00000040U) +#define USBHS_DOUTEPXINTEN_OPERRIEN_POS (8U) +#define USBHS_DOUTEPXINTEN_OPERRIEN ((uint32_t)0x00000100U) +#define USBHS_DOUTEPXINTEN_BERRIEN_POS (12U) +#define USBHS_DOUTEPXINTEN_BERRIEN ((uint32_t)0x00001000U) +#define USBHS_DOUTEPXINTEN_NAKIEN_POS (13U) +#define USBHS_DOUTEPXINTEN_NAKIEN ((uint32_t)0x00002000U) +#define USBHS_DOUTEPXINTEN_NYETIEN_POS (14U) +#define USBHS_DOUTEPXINTEN_NYETIEN ((uint32_t)0x00004000U) + +/** Bit definition for USBHS_DINEP0CTRL register **/ +#define USBHS_DINEP0CTRL_MPLEN_POS (0U) +#define USBHS_DINEP0CTRL_MPLEN ((uint32_t)0x00000003U) +#define USBHS_DINEP0CTRL_EPACT_POS (15U) +#define USBHS_DINEP0CTRL_EPACT ((uint32_t)0x00008000U) +#define USBHS_DINEP0CTRL_NAKSTS_POS (17U) +#define USBHS_DINEP0CTRL_NAKSTS ((uint32_t)0x00020000U) +#define USBHS_DINEP0CTRL_EPTYPE_POS (18U) +#define USBHS_DINEP0CTRL_EPTYPE ((uint32_t)0x000C0000U) +#define USBHS_DINEP0CTRL_STALL_POS (21U) +#define USBHS_DINEP0CTRL_STALL ((uint32_t)0x00200000U) +#define USBHS_DINEP0CTRL_TXFNUM_POS (22U) +#define USBHS_DINEP0CTRL_TXFNUM ((uint32_t)0x03C00000U) +#define USBHS_DINEP0CTRL_CNAK_POS (26U) +#define USBHS_DINEP0CTRL_CNAK ((uint32_t)0x04000000U) +#define USBHS_DINEP0CTRL_SNAK_POS (27U) +#define USBHS_DINEP0CTRL_SNAK ((uint32_t)0x08000000U) +#define USBHS_DINEP0CTRL_EPDIS_POS (30U) +#define USBHS_DINEP0CTRL_EPDIS ((uint32_t)0x40000000U) +#define USBHS_DINEP0CTRL_EPEN_POS (31U) +#define USBHS_DINEP0CTRL_EPEN ((uint32_t)0x80000000U) + +/** Bit definition for USBHS_DINEPCTRL(1~8) register **/ +#define USBHS_DINEPCTRL_MPLEN_POS (0U) +#define USBHS_DINEPCTRL_MPLEN ((uint32_t)0x000007FFU) +#define USBHS_DINEPCTRL_EPACT_POS (15U) +#define USBHS_DINEPCTRL_EPACT ((uint32_t)0x00008000U) +#define USBHS_DINEPCTRL_EPDPID_EPEOFRM_POS (16U) +#define USBHS_DINEPCTRL_EPDPID_EPEOFRM ((uint32_t)0x00010000U) +#define USBHS_DINEPCTRL_NAKSTS_POS (17U) +#define USBHS_DINEPCTRL_NAKSTS ((uint32_t)0x00020000U) +#define USBHS_DINEPCTRL_EPTYPE_POS (18U) +#define USBHS_DINEPCTRL_EPTYPE ((uint32_t)0x000C0000U) +#define USBHS_DINEPCTRL_STALL_POS (21U) +#define USBHS_DINEPCTRL_STALL ((uint32_t)0x00200000U) +#define USBHS_DINEPCTRL_TXFNUM_POS (22U) +#define USBHS_DINEPCTRL_TXFNUM ((uint32_t)0x03C00000U) +#define USBHS_DINEPCTRL_CNAK_POS (26U) +#define USBHS_DINEPCTRL_CNAK ((uint32_t)0x04000000U) +#define USBHS_DINEPCTRL_SNAK_POS (27U) +#define USBHS_DINEPCTRL_SNAK ((uint32_t)0x08000000U) +#define USBHS_DINEPCTRL_SD0PID_SEVNFRM_POS (28U) +#define USBHS_DINEPCTRL_SD0PID_SEVNFRM ((uint32_t)0x10000000U) +#define USBHS_DINEPCTRL_SD1PID_SODDFRM_POS (29U) +#define USBHS_DINEPCTRL_SD1PID_SODDFRM ((uint32_t)0x20000000U) +#define USBHS_DINEPCTRL_EPDIS_POS (30U) +#define USBHS_DINEPCTRL_EPDIS ((uint32_t)0x40000000U) +#define USBHS_DINEPCTRL_EPEN_POS (31U) +#define USBHS_DINEPCTRL_EPEN ((uint32_t)0x80000000U) + +/** Bit definition for USBHS_DINEPINTSTS(0~8) register **/ +#define USBHS_DINEPINTSTS_TXCIF_POS (0U) +#define USBHS_DINEPINTSTS_TXCIF ((uint32_t)0x00000001U) +#define USBHS_DINEPINTSTS_EPDISIF_POS (1U) +#define USBHS_DINEPINTSTS_EPDISIF ((uint32_t)0x00000002U) +#define USBHS_DINEPINTSTS_AHBERRIF_POS (2U) +#define USBHS_DINEPINTSTS_AHBERRIF ((uint32_t)0x00000004U) +#define USBHS_DINEPINTSTS_TOUTIF_POS (3U) +#define USBHS_DINEPINTSTS_TOUTIF ((uint32_t)0x00000008U) +#define USBHS_DINEPINTSTS_TXFERINTIF_POS (4U) +#define USBHS_DINEPINTSTS_TXFERINTIF ((uint32_t)0x00000010U) +#define USBHS_DINEPINTSTS_INEPMISIF_POS (5U) +#define USBHS_DINEPINTSTS_INEPMISIF ((uint32_t)0x00000020U) +#define USBHS_DINEPINTSTS_INEPNAKEIF_POS (6U) +#define USBHS_DINEPINTSTS_INEPNAKEIF ((uint32_t)0x00000040U) +#define USBHS_DINEPINTSTS_TXFEIF_POS (7U) +#define USBHS_DINEPINTSTS_TXFEIF ((uint32_t)0x00000080U) +#define USBHS_DINEPINTSTS_TXFUDRIF_POS (8U) +#define USBHS_DINEPINTSTS_TXFUDRIF ((uint32_t)0x00000100U) +#define USBHS_DINEPINTSTS_PKDRPSTS_POS (11U) +#define USBHS_DINEPINTSTS_PKDRPSTS ((uint32_t)0x00000800U) +#define USBHS_DINEPINTSTS_BBERRIF_POS (12U) +#define USBHS_DINEPINTSTS_BBERRIF ((uint32_t)0x00001000U) +#define USBHS_DINEPINTSTS_NAKIF_POS (13U) +#define USBHS_DINEPINTSTS_NAKIF ((uint32_t)0x00002000U) +#define USBHS_DINEPINTSTS_NYETIF_POS (14U) +#define USBHS_DINEPINTSTS_NYETIF ((uint32_t)0x00004000U) + +/** Bit definition for USBHS_DINEP0TXSIZ register **/ +#define USBHS_DINEP0TXSIZ_TLEN_POS (0U) +#define USBHS_DINEP0TXSIZ_TLEN ((uint32_t)0x0000007FU) +#define USBHS_DINEP0TXSIZ_PKTCNT_POS (19U) +#define USBHS_DINEP0TXSIZ_PKTCNT ((uint32_t)0x00180000U) + +/** Bit definition for USBHS_DINEPTXSIZ(1~8) register **/ +#define USBHS_DINEPTXSIZ_TLEN_POS (0U) +#define USBHS_DINEPTXSIZ_TLEN ((uint32_t)0x0007FFFFU) +#define USBHS_DINEPTXSIZ_PKTCNT_POS (19U) +#define USBHS_DINEPTXSIZ_PKTCNT ((uint32_t)0x1FF80000U) +#define USBHS_DINEPTXSIZ_MCNT_POS (29U) +#define USBHS_DINEPTXSIZ_MCNT ((uint32_t)0x60000000U) + +/** Bit definition for USBHS_DIEPDMADD(0~8) register **/ +#define USBHS_DIEPDMADD_DMADD_POS (0U) +#define USBHS_DIEPDMADD_DMADD ((uint32_t)0xFFFFFFFFU) + +/** Bit definition for USBHS_DINEPTXFSTS(0~8) register **/ +#define USBHS_DINEPTXFSTS_TXFSPCAVL_POS (0U) +#define USBHS_DINEPTXFSTS_TXFSPCAVL ((uint32_t)0x0000FFFFU) + +/** Bit definition for USBHS_DOUTEP0CTRL register **/ +#define USBHS_DOUTEP0CTRL_MPLEN_POS (0U) +#define USBHS_DOUTEP0CTRL_MPLEN ((uint32_t)0x00000003U) +#define USBHS_DOUTEP0CTRL_EPACT_POS (15U) +#define USBHS_DOUTEP0CTRL_EPACT ((uint32_t)0x00008000U) +#define USBHS_DOUTEP0CTRL_NAKSTS_POS (17U) +#define USBHS_DOUTEP0CTRL_NAKSTS ((uint32_t)0x00020000U) +#define USBHS_DOUTEP0CTRL_EPTYPE_POS (18U) +#define USBHS_DOUTEP0CTRL_EPTYPE ((uint32_t)0x000C0000U) +#define USBHS_DOUTEP0CTRL_STALL_POS (21U) +#define USBHS_DOUTEP0CTRL_STALL ((uint32_t)0x00200000U) +#define USBHS_DOUTEP0CTRL_CNAK_POS (26U) +#define USBHS_DOUTEP0CTRL_CNAK ((uint32_t)0x04000000U) +#define USBHS_DOUTEP0CTRL_SNAK_POS (27U) +#define USBHS_DOUTEP0CTRL_SNAK ((uint32_t)0x08000000U) +#define USBHS_DOUTEP0CTRL_EPDIS_POS (30U) +#define USBHS_DOUTEP0CTRL_EPDIS ((uint32_t)0x40000000U) +#define USBHS_DOUTEP0CTRL_EPEN_POS (31U) +#define USBHS_DOUTEP0CTRL_EPEN ((uint32_t)0x80000000U) + + +/** Bit definition for USBHS_DOUTEPCTRL(1~8) register **/ +#define USBHS_DOUTEPCTRL_MPLEN_POS (0U) +#define USBHS_DOUTEPCTRL_MPLEN ((uint32_t)0x00000003U) +#define USBHS_DOUTEPCTRL_EPACT_POS (15U) +#define USBHS_DOUTEPCTRL_EPACT ((uint32_t)0x00008000U) +#define USBHS_DOUTEPCTRL_EPDPID_EPEOFRM_POS (16U) +#define USBHS_DOUTEPCTRL_EPDPID_EPEOFRM ((uint32_t)0x00010000U) +#define USBHS_DOUTEPCTRL_NAKSTS_POS (17U) +#define USBHS_DOUTEPCTRL_NAKSTS ((uint32_t)0x00020000U) +#define USBHS_DOUTEPCTRL_EPTYPE_POS (18U) +#define USBHS_DOUTEPCTRL_EPTYPE ((uint32_t)0x000C0000U) +#define USBHS_DOUTEPCTRL_STALL_POS (21U) +#define USBHS_DOUTEPCTRL_STALL ((uint32_t)0x00200000U) +#define USBHS_DOUTEPCTRL_CNAK_POS (26U) +#define USBHS_DOUTEPCTRL_CNAK ((uint32_t)0x04000000U) +#define USBHS_DOUTEPCTRL_SNAK_POS (27U) +#define USBHS_DOUTEPCTRL_SNAK ((uint32_t)0x08000000U) +#define USBHS_DOUTEPCTRL_SD0PID_SEVNFRM_POS (28U) +#define USBHS_DOUTEPCTRL_SD0PID_SEVNFRM ((uint32_t)0x10000000U) +#define USBHS_DOUTEPCTRL_SD1PID_SODDFRM_POS (29U) +#define USBHS_DOUTEPCTRL_SD1PID_SODDFRM ((uint32_t)0x20000000U) +#define USBHS_DOUTEPCTRL_EPDIS_POS (30U) +#define USBHS_DOUTEPCTRL_EPDIS ((uint32_t)0x40000000U) +#define USBHS_DOUTEPCTRL_EPEN_POS (31U) +#define USBHS_DOUTEPCTRL_EPEN ((uint32_t)0x80000000U) + + +/** Bit definition for USBHS_DOUTEPINTSTS(0~8) register **/ +#define USBHS_DOUTEPINTSTS_TXCIF_POS (0U) +#define USBHS_DOUTEPINTSTS_TXCIF ((uint32_t)0x00000001U) +#define USBHS_DOUTEPINTSTS_EPDISIF_POS (1U) +#define USBHS_DOUTEPINTSTS_EPDISIF ((uint32_t)0x00000002U) +#define USBHS_DOUTEPINTSTS_AHBERRIF_POS (2U) +#define USBHS_DOUTEPINTSTS_AHBERRIF ((uint32_t)0x00000004U) +#define USBHS_DOUTEPINTSTS_STUPPDNEIF_POS (3U) +#define USBHS_DOUTEPINTSTS_STUPPDNEIF ((uint32_t)0x00000008U) +#define USBHS_DOUTEPINTSTS_OUTTRXEPDISIF_POS (4U) +#define USBHS_DOUTEPINTSTS_OUTTRXEPDISIF ((uint32_t)0x00000010U) +#define USBHS_DOUTEPINTSTS_STSPRXIF_POS (5U) +#define USBHS_DOUTEPINTSTS_STSPRXIF ((uint32_t)0x00000020U) +#define USBHS_DOUTEPINTSTS_B2BSTUPRIF_POS (6U) +#define USBHS_DOUTEPINTSTS_B2BSTUPRIF ((uint32_t)0x00000040U) +#define USBHS_DOUTEPINTSTS_OUTPCKERRIF_POS (8U) +#define USBHS_DOUTEPINTSTS_OUTPCKERRIF ((uint32_t)0x00000100U) +#define USBHS_DOUTEPINTSTS_PKDRPSTS_POS (11U) +#define USBHS_DOUTEPINTSTS_PKDRPSTS ((uint32_t)0x00000800U) +#define USBHS_DOUTEPINTSTS_BBERRIF_POS (12U) +#define USBHS_DOUTEPINTSTS_BBERRIF ((uint32_t)0x00001000U) +#define USBHS_DOUTEPINTSTS_NAKIF_POS (13U) +#define USBHS_DOUTEPINTSTS_NAKIF ((uint32_t)0x00002000U) +#define USBHS_DOUTEPINTSTS_NYETIF_POS (14U) +#define USBHS_DOUTEPINTSTS_NYETIF ((uint32_t)0x00004000U) +#define USBHS_DOUTEPINTSTS_STUPPRXIF_POS (15U) +#define USBHS_DOUTEPINTSTS_STUPPRXIF ((uint32_t)0x00008000U) + + +/** Bit definition for USBHS_DOUTEP0TXSIZ register **/ +#define USBHS_DOUTEP0TXSIZ_TLEN_POS (0U) +#define USBHS_DOUTEP0TXSIZ_TLEN ((uint32_t)0x0000007FU) +#define USBHS_DOUTEP0TXSIZ_PKTCNT_POS (19U) +#define USBHS_DOUTEP0TXSIZ_PKTCNT ((uint32_t)0x00080000U) +#define USBHS_DOUTEP0TXSIZ_STUPPCNT_POS (29U) +#define USBHS_DOUTEP0TXSIZ_STUPPCNT ((uint32_t)0x60000000U) + +/** Bit definition for USBHS_DOUTEPTXSIZ(1~8) register **/ +#define USBHS_DOUTEPTXSIZ_TLEN_POS (0U) +#define USBHS_DOUTEPTXSIZ_TLEN ((uint32_t)0x0007FFFFU) +#define USBHS_DOUTEPTXSIZ_PKTCNT_POS (19U) +#define USBHS_DOUTEPTXSIZ_PKTCNT ((uint32_t)0x1FF80000U) +#define USBHS_DOUTEPTXSIZ_STUPPCNT_POS (29U) +#define USBHS_DOUTEPTXSIZ_STUPPCNT_RXDPID ((uint32_t)0x60000000U) + +/** Bit definition for USBHS_DINEPDMADD(0~8) register **/ +#define USBHS_DINEPDMADD_DMADD ((uint32_t)0xFFFFFFFFU) + +/** Bit definition for USBHS_PWRCTRL register **/ +#define USBHS_PWRCTRL_PHYSTP_POS (0U) +#define USBHS_PWRCTRL_PHYSTP ((uint32_t)0x00000001U) +#define USBHS_PWRCTRL_GATEHCLK_POS (1U) +#define USBHS_PWRCTRL_GATEHCLK ((uint32_t)0x00000002U) +#define USBHS_PWRCTRL_PDMRST_POS (3U) +#define USBHS_PWRCTRL_PDMRST ((uint32_t)0x00000008U) +#define USBHS_PWRCTRL_PHYSLEEP_POS (6U) +#define USBHS_PWRCTRL_PHYSLEEP ((uint32_t)0x00000040U) +#define USBHS_PWRCTRL_DSLEEP_POS (7U) +#define USBHS_PWRCTRL_DSLEEP ((uint32_t)0x00000080U) + +/** Bit definition for USBHS_PWRCTRL1 register **/ +#define USBHS_PWRCTRL1_GATEN_POS (0U) +#define USBHS_PWRCTRL1_GATEN ((uint32_t)0x00000001U) +#define USBHS_PWRCTRL1_CNT_POS (1U) +#define USBHS_PWRCTRL1_CNT ((uint32_t)0x00000006U) +#define USBHS_PWRCTRL1_RAMCLKEN_POS (3U) +#define USBHS_PWRCTRL1_RAMCLKEN ((uint32_t)0x00000008U) + +/** Bit definition for USBHS_WRPCTRL register **/ +#define USBHS_WRPCTRL_PINDETEN_POS (16U) +#define USBHS_WRPCTRL_PINDETEN ((uint32_t)0x00010000U) +#define USBHS_WRPCTRL_VBRMDETEN_POS (17U) +#define USBHS_WRPCTRL_VBRMDETEN ((uint32_t)0x00020000U) +#define USBHS_WRPCTRL_HDISCEN_POS (18U) +#define USBHS_WRPCTRL_HDISCEN ((uint32_t)0x00040000U) +#define USBHS_WRPCTRL_IDDETEN_POS (19U) +#define USBHS_WRPCTRL_IDDETEN ((uint32_t)0x00080000U) +#define USBHS_WRPCTRL_SUSPWKEN_POS (20U) +#define USBHS_WRPCTRL_SUSPWKEN ((uint32_t)0x00100000U) +#define USBHS_WRPCTRL_LSCHGEN_POS (21U) +#define USBHS_WRPCTRL_LSCHGEN ((uint32_t)0x00200000U) + +/** Bit definition for USBHS_WRPCFG register **/ +#define USBHS_WRPCFG_PHYCLKSEL_POS (0U) +#define USBHS_WRPCFG_PHYCLKSEL ((uint32_t)0x00000007U) +#define USBHS_WRPCFG_PHYCLKSEL_10M ((uint32_t)0x00000000)//[2:0] +#define USBHS_WRPCFG_PHYCLKSEL_12M ((uint32_t)0x00000001)//[2:0] +#define USBHS_WRPCFG_PHYCLKSEL_25M ((uint32_t)0x00000002)//[2:0] +#define USBHS_WRPCFG_PHYCLKSEL_30M ((uint32_t)0x00000003)//[2:0] +#define USBHS_WRPCFG_PHYCLKSEL_19_2M ((uint32_t)0x00000004)//[2:0] +#define USBHS_WRPCFG_PHYCLKSEL_24M ((uint32_t)0x00000005)//[2:0] +#define USBHS_WRPCFG_PHYCLKSEL_27M ((uint32_t)0x00000006)//[2:0] +#define USBHS_WRPCFG_PHYCLKSEL_40M ((uint32_t)0x00000007)//[2:0] + +#define USBHS_WRPCFG_PLLEN_POS (3U) +#define USBHS_WRPCFG_PLLEN ((uint32_t)0x00000008U) +#define USBHS_WRPCFG_IDEN_POS (9U) +#define USBHS_WRPCFG_IDEN ((uint32_t)0x00000200U) +#define USBHS_WRPCFG_LSEN_POS (10U) +#define USBHS_WRPCFG_LSEN ((uint32_t)0x00000400U) +#define USBHS_WRPCFG_SOFDEN_POS (11U) +#define USBHS_WRPCFG_SOFDEN ((uint32_t)0x00000800U) +#define USBHS_WRPCFG_IDSIG_POS (12U) +#define USBHS_WRPCFG_IDSIG ((uint32_t)0x00001000U) + +/*** MIPI DSI HOST ***/ + +/** Bit definition for DSI_Wrapper register **/ +/** Bit definition for DSI_WRPCTRL register **/ +#define DSI_WRPCTRL_ULPSCLEN ((uint32_t)0x00000001U) /* Bit 0 */ +#define DSI_WRPCTRL_ULPSDLEN_POS (1) +#define DSI_WRPCTRL_ULPSDLEN ((uint32_t)0x0000001EU) /* Bit[4:1] */ +#define DSI_WRPCTRL_ULPSDLEN_0 ((uint32_t)0x00000002U) /* Bit 1 */ +#define DSI_WRPCTRL_ULPSDLEN_1 ((uint32_t)0x00000004U) /* Bit 2 */ +#define DSI_WRPCTRL_ULPSDLEN_2 ((uint32_t)0x00000008U) /* Bit 3 */ +#define DSI_WRPCTRL_ULPSDLEN_3 ((uint32_t)0x00000010U) /* Bit 4 */ +#define DSI_WRPCTRL_ISKEWCAL ((uint32_t)0x00000020U) /* Bit 5 */ +#define DSI_WRPCTRL_PSKEWCAL ((uint32_t)0x00000040U) /* Bit 6 */ +#define DSI_WRPCTRL_TRIGSEND_POS (7) +#define DSI_WRPCTRL_TRIGSEND ((uint32_t)0x00000180U) /* Bit[8:7] */ +#define DSI_WRPCTRL_TRIGSEND_0 ((uint32_t)0x00000080U) /* Bit 7 */ +#define DSI_WRPCTRL_TRIGSEND_1 ((uint32_t)0x00000100U) /* Bit 8 */ +#define DSI_WRPCTRL_TRIGREQ ((uint32_t)0x00000200U) /* Bit 9 */ +#define DSI_WRPCTRL_BLKEERIEN ((uint32_t)0x00000400U) /* Bit 10 */ +#define DSI_WRPCTRL_SPERRIEN ((uint32_t)0x00000800U) /* Bit 11 */ +#define DSI_WRPCTRL_OVERRIEN ((uint32_t)0x00001000U) /* Bit 12 */ +#define DSI_WRPCTRL_UNDERRIEN ((uint32_t)0x00002000U) /* Bit 13 */ + +/** Bit definition for DSI_WRPSTS register **/ +#define DSI_WRPSTS_ULPSCLACT ((uint32_t)0x00000001U) /* Bit 0 */ +#define DSI_WRPSTS_ULPSDLACT_POS (1) +#define DSI_WRPSTS_ULPSDLACT ((uint32_t)0x0000001EU) /* Bit[4:1] */ +#define DSI_WRPSTS_ULPSDLEN_0 ((uint32_t)0x00000002U) /* Bit 1 */ +#define DSI_WRPSTS_ULPSDLEN_1 ((uint32_t)0x00000004U) /* Bit 2 */ +#define DSI_WRPSTS_ULPSDLEN_2 ((uint32_t)0x00000008U) /* Bit 3 */ +#define DSI_WRPSTS_ULPSDLEN_3 ((uint32_t)0x00000010U) /* Bit 4 */ +#define DSI_WRPSTS_ISKEWCALDN ((uint32_t)0x00000020U) /* Bit 5 */ +#define DSI_WRPSTS_PSKEWCALDN ((uint32_t)0x00000040U) /* Bit 6 */ +#define DSI_WRPSTS_TRIGACK ((uint32_t)0x00000080U) /* Bit 7 */ +#define DSI_WRPSTS_BLKERRF ((uint32_t)0x00000100U) /* Bit 8 */ +#define DSI_WRPSTS_SPERRIEN ((uint32_t)0x00000200U) /* Bit 9 */ +#define DSI_WRPSTS_OVERRIEN ((uint32_t)0x00000400U) /* Bit 10 */ +#define DSI_WRPSTS_UNDERRIEN ((uint32_t)0x00000800U) /* Bit 11 */ + +/** Bit definition for DSIPHY_CTRL1 register **/ +#define DSIPHY_CTRL1_HSDBW ((uint32_t)0x00000001U) /* Bit 0 */ +#define DSIPHY_CTRL1_CKLANESET_POS (1) +#define DSIPHY_CTRL1_CKLANESET ((uint32_t)0x0000003EU) /* Bit[5:1] */ +#define DSIPHY_CTRL1_L4SEL_POS (6) +#define DSIPHY_CTRL1_L4SEL ((uint32_t)0x000001C0U) /* Bit[8:6] */ +#define DSIPHY_CTRL1_L3SEL_POS (9) +#define DSIPHY_CTRL1_L3SEL ((uint32_t)0x00000E00U) /* Bit[11:9] */ +#define DSIPHY_CTRL1_L2SEL_POS (12) +#define DSIPHY_CTRL1_L2SEL ((uint32_t)0x00007000U) /* Bit[14:12] */ +#define DSIPHY_CTRL1_L1SEL_POS (15) +#define DSIPHY_CTRL1_L1SEL ((uint32_t)0x00038000U) /* Bit[17:15] */ +#define DSIPHY_CTRL1_L0SEL_POS (18) +#define DSIPHY_CTRL1_L0SEL ((uint32_t)0x001C0000U) /* Bit[20:18] */ +#define DSIPHY_CTRL1_DPDNSEN_POS (21) +#define DSIPHY_CTRL1_DPDNSEN ((uint32_t)0x03E00000U) /* Bit[25:21] */ +#define DSIPHY_CTRL1_REFCKSEL_POS (26) +#define DSIPHY_CTRL1_REFCKSEL ((uint32_t)0x1C000000U) /* Bit[28:26] */ +#define DSIPHY_CTRL1_EXTDCYCEL_POS (29) +#define DSIPHY_CTRL1_EXTDCYCEL ((uint32_t)0xE0000000U) /* Bit[31:29] */ + +/** Bit definition for DSIPHY_CTRL2 register **/ +#define DSIPHY_CTRL2_DLPRET_POS (0) +#define DSIPHY_CTRL2_DLPRET ((uint32_t)0x000000FFU) /* Bit[7:0] */ +#define DSIPHY_CTRL2_DLZEROT_POS (8) +#define DSIPHY_CTRL2_DLZEROT ((uint32_t)0x0000FF00U) /* Bit[15:8] */ +#define DSIPHY_CTRL2_DLTRAT_POS (16) +#define DSIPHY_CTRL2_DLTRAT ((uint32_t)0x00FF0000U) /* Bit[23:16] */ +#define DSIPHY_CTRL2_CLPRET_POS (24) +#define DSIPHY_CTRL2_CLPRET ((uint32_t)0xFF000000U) /* Bit[31:24] */ + +/** Bit definition for DSIPHY_CTRL3 register **/ +#define DSIPHY_CTRL3_CLZEROT_POS (0) +#define DSIPHY_CTRL3_CLZEROT ((uint32_t)0x000000FFU) /* Bit[7:0] */ +#define DSIPHY_CTRL3_CLTRLT_POS (8) +#define DSIPHY_CTRL3_CLTRLT ((uint32_t)0x0000FF00U) /* Bit[15:8] */ +#define DSIPHY_CTRL3_CLCLKPRET_POS (16) +#define DSIPHY_CTRL3_CLCLKPRET ((uint32_t)0x00FF0000U) /* Bit[23:16] */ +#define DSIPHY_CTRL3_CLCLKPOST_POS (24) +#define DSIPHY_CTRL3_CLCLKPOST ((uint32_t)0xFF000000U) /* Bit[31:24] */ + +/** Bit definition for DSIPHY_CTRL4 register **/ +#define DSIPHY_CTRL4_VCTRL_POS (0) +#define DSIPHY_CTRL4_VCTRL ((uint32_t)0x0000001FU) /* Bit[4:0] */ + +/** Bit definition for DSIPHY_PLLCTRL1 register **/ +#define DSIPHY_PLLCTRL1_PLLFBKFRA_POS (0) +#define DSIPHY_PLLCTRL1_PLLFBKFRA ((uint32_t)0x00FFFFFFU) /* Bit[23:0] */ + +/** Bit definition for DSIPHY_PLLCTRL2 register **/ +#define DSIPHY_PLLCTRL2_FBKINT_POS (0) +#define DSIPHY_PLLCTRL2_FBKINT ((uint32_t)0x000001FFU) /* Bit[8:0] */ +#define DSIPHY_PLLCTRL2_PREDIV_POS (9) +#define DSIPHY_PLLCTRL2_PREDIV ((uint32_t)0x00000600U) /* Bit[10:9] */ +#define DSIPHY_PLLCTRL2_DOSTBEN ((uint32_t)0x00000800U) /* Bit 11 */ +#define DSIPHY_PLLCTRL2_SSCAMPOP_POS (12) +#define DSIPHY_PLLCTRL2_SSCAMPOP ((uint32_t)0x03FFF000U) /* Bit[29:12] */ + +/** Bit definition for DSIPHY_PLLCTRL3 register **/ +#define DSIPHY_PLLCTRL3_SSCAMPINIT_POS (0) +#define DSIPHY_PLLCTRL3_SSCAMPINIT ((uint32_t)0x00003FFFU) /* Bit[17:0] */ +#define DSIPHY_PLLCTRL3_SSCPRD_POS (18) +#define DSIPHY_PLLCTRL3_SSCPRD ((uint32_t)0x0FFC0000U) /* Bit[27:18] */ +#define DSIPHY_PLLCTRL3_SSCEN ((uint32_t)0x10000000U) /* Bit 28 */ +#define DSIPHY_PLLCTRL3_PLLFBKCHG ((uint32_t)0x20000000U) /* Bit 29 */ +#define DSIPHY_PLLCTRL3_PLLDOST_POS (30) +#define DSIPHY_PLLCTRL3_PLLDOST ((uint32_t)0xC0000000U) /* Bit[31:30] */ + +/** Bit definition for DSIPHY_PLLCTRL4 register **/ +#define DSIPHY_PLLCTRL4_L2NHTR_POS (0) +#define DSIPHY_PLLCTRL4_L2NHTR ((uint32_t)0x0000001FU) /* Bit[4:0] */ +#define DSIPHY_PLLCTRL4_L2PHTR_POS (5) +#define DSIPHY_PLLCTRL4_L2PHTR ((uint32_t)0x000003E0U) /* Bit[9:5] */ +#define DSIPHY_PLLCTRL4_L1NHTR_POS (10) +#define DSIPHY_PLLCTRL4_L1NHTR ((uint32_t)0x00007C00U) /* Bit[14:10] */ +#define DSIPHY_PLLCTRL4_L1PHTR_POS (15) +#define DSIPHY_PLLCTRL4_L1PHTR ((uint32_t)0x000F8000U) /* Bit[19:15] */ +#define DSIPHY_PLLCTRL4_L0NHTR_POS (20) +#define DSIPHY_PLLCTRL4_L0NHTR ((uint32_t)0x01F00000U) /* Bit[24:20] */ +#define DSIPHY_PLLCTRL4_L0PHTR_POS (25) +#define DSIPHY_PLLCTRL4_L0PHTR ((uint32_t)0x3E000000U) /* Bit[29:25] */ + +/** Bit definition for DSIPHY_PLLCTRL5 register **/ +#define DSIPHY_PLLCTRL5_L4NHTR_POS (0) +#define DSIPHY_PLLCTRL5_L4NHTR ((uint32_t)0x0000001FU) /* Bit[4:0] */ +#define DSIPHY_PLLCTRL5_L4PHTR_POS (5) +#define DSIPHY_PLLCTRL5_L4PHTR ((uint32_t)0x000003E0U) /* Bit[9:5] */ +#define DSIPHY_PLLCTRL5_L3NHTR_POS (10) +#define DSIPHY_PLLCTRL5_L3NHTR ((uint32_t)0x00007C00U) /* Bit[14:10] */ +#define DSIPHY_PLLCTRL5_L3PHTR_POS (15) +#define DSIPHY_PLLCTRL5_L3PHTR ((uint32_t)0x000F8000U) /* Bit[19:15] */ +#define DSIPHY_PLLCTRL5_PLLFMTOR_POS (20) +#define DSIPHY_PLLCTRL5_PLLFMTOR ((uint32_t)0x00300000U) /* Bit[21:20] */ +#define DSIPHY_PLLCTRL3_PLLWTGEN ((uint32_t)0x00400000U) /* Bit 22 */ +#define DSIPHY_PLLCTRL3_PLLFMEN ((uint32_t)0x00800000U) /* Bit 23 */ + +/** Bit definition for DSIPHY_PLLSTS register **/ +#define DSIPHY_PLLSTS_PLLUNLOCK ((uint32_t)0x00000001U) /* Bit 0 */ +#define DSIPHY_PLLSTS_PLLFMCPLT ((uint32_t)0x00000002U) /* Bit 1 */ +#define DSIPHY_PLLSTS_PLLFMUNDER ((uint32_t)0x00000004U) /* Bit 2 */ +#define DSIPHY_PLLSTS_PLLFMOVER ((uint32_t)0x00000008U) /* Bit 3 */ +#define DSIPHY_PLLSTS_PLLDIGCKMISS ((uint32_t)0x00000010U) /* Bit 4 */ +#define DSIPHY_PLLSTS_PLLFBKCKMISS ((uint32_t)0x00000020U) /* Bit 5 */ +#define DSIPHY_PLLSTS_PLLREFCKMISS ((uint32_t)0x00000040U) /* Bit 6 */ +#define DSIPHY_PLLSTS_PHYREADY ((uint32_t)0x00000080U) /* Bit 7 */ + +/** Bit definition for DSI HOST Control register **/ +/** Bit definition for DSI_NUMLANES register **/ +#define DSI_NUMLANES_NUMLANES_POS (0) +#define DSI_NUMLANES_NUMLANES ((uint32_t)0x0000000FU) /* Bit[3:0] */ +#define DSI_NUMLANES_NUMLANES_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define DSI_NUMLANES_NUMLANES_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define DSI_NUMLANES_NUMLANES_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define DSI_NUMLANES_NUMLANES_3 ((uint32_t)0x00000008U) /* Bit 3 */ + +/** Bit definition for DSI_CONTHSCLK register **/ +#define DSI_CONTHSCLK_CONTHSCLK_POS (0) +#define DSI_CONTHSCLK_CONTHSCLK ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for DSI_TPRE register **/ +#define DSI_TPRE_TPRE_POS (0) +#define DSI_TPRE_TPRE ((uint32_t)0x000000FFU) /* Bit[7:0] */ + +/** Bit definition for DSI_TPOST register **/ +#define DSI_TPOST_TPOST_POS (0) +#define DSI_TPOST_TPOST ((uint32_t)0x000000FFU) /* Bit[7:0] */ + +/** Bit definition for DSI_TXGAP register **/ +#define DSI_TXGAP_TXGAP_POS (0) +#define DSI_TXGAP_TXGAP ((uint32_t)0x000000FFU) /* Bit[7:0] */ + +/** Bit definition for DSI_AUTOINSERT_EOTP register **/ +#define DSI_AUTOINSERT_EOTP_AUTOINSEOTP ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for DSI_DISRXCRCCHK register **/ +#define DSI_DISRXCRCCHK_DISRXCRCCHK ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for DSI_HSTXTOCNT register **/ +#define DSI_HSTXTOCNT_HSTXTOCNT_POS (0) +#define DSI_HSTXTOCNT_HSTXTOCNT ((uint32_t)0x00FFFFFFU) /* Bit[23:0] */ + +/** Bit definition for DSI_LRXTOCNT register **/ +#define DSI_LRXTOCNT_LRXTOCNT_POS (0) +#define DSI_LRXTOCNT_LRXTOCNT ((uint32_t)0x00FFFFFFU) /* Bit[23:0] */ + +/** Bit definition for DSI_BTATOCNT register **/ +#define DSI_BTATOCNT_BTATOCNT_POS (0) +#define DSI_BTATOCNT_BTATOCNT ((uint32_t)0x00FFFFFFU) /* Bit[23:0] */ + +/** Bit definition for DSI_TWAKEUP register **/ +#define DSI_TWAKEUP_TWAKEUP_POS (0) +#define DSI_TWAKEUP_TWAKEUP ((uint32_t)0x0007FFFFU) /* Bit[18:0] */ + +/** Bit definition for DSI_DISBST register **/ +#define DSI_DISBST_DISBST ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for DSI_STS register **/ +#define DSI_STS_SOTERR ((uint32_t)0x00000001U) /* Bit 0 */ +#define DSI_STS_SOTSYNCERR ((uint32_t)0x00000002U) /* Bit 1 */ +#define DSI_STS_EOTSYNCERR ((uint32_t)0x00000004U) /* Bit 2 */ +#define DSI_STS_ESCMODERR ((uint32_t)0x00000008U) /* Bit 3 */ +#define DSI_STS_LPTXSYNCERR ((uint32_t)0x00000010U) /* Bit 4 */ +#define DSI_STS_TOERR ((uint32_t)0x00000020U) /* Bit 5 */ +#define DSI_STS_FCTRLERR ((uint32_t)0x00000040U) /* Bit 6 */ +#define DSI_STS_COTDET ((uint32_t)0x00000080U) /* Bit 7 */ +#define DSI_STS_ECCSERR ((uint32_t)0x00000100U) /* Bit 8 */ +#define DSI_STS_ECCMERR ((uint32_t)0x00000200U) /* Bit 9 */ +#define DSI_STS_CRCERR ((uint32_t)0x00000400U) /* Bit 10 */ +#define DSI_STS_DATYPERR ((uint32_t)0x00000800U) /* Bit 11 */ +#define DSI_STS_VCIDINVLD ((uint32_t)0x00001000U) /* Bit 12 */ +#define DSI_STS_INVLDTXL ((uint32_t)0x00002000U) /* Bit 13 */ +#define DSI_STS_PROVILT ((uint32_t)0x00008000U) /* Bit 15 */ +#define DSI_STS_BIT0 ((uint32_t)0x00010000U) /* Bit 16 */ +#define DSI_STS_BIT1 ((uint32_t)0x00020000U) /* Bit 17 */ +#define DSI_STS_BIT2 ((uint32_t)0x00040000U) /* Bit 18 */ +#define DSI_STS_BIT3 ((uint32_t)0x00080000U) /* Bit 19 */ + +/** Bit definition for DSI_ERRSTS register **/ +#define DSI_ERRSTS_ECCSERR ((uint32_t)0x00000001U) /* Bit 0 */ +#define DSI_ERRSTS_ECCMERR ((uint32_t)0x00000002U) /* Bit 1 */ +#define DSI_ERRSTS_ECCERRBIT_POS (2) +#define DSI_ERRSTS_ECCERRBIT ((uint32_t)0x0000007CU) /* Bit [6:2] */ +#define DSI_ERRSTS_ECCERRBIT_0 ((uint32_t)0x00000004U) /* Bit 2 */ +#define DSI_ERRSTS_ECCERRBIT_1 ((uint32_t)0x00000008U) /* Bit 3 */ +#define DSI_ERRSTS_ECCERRBIT_2 ((uint32_t)0x00000010U) /* Bit 4 */ +#define DSI_ERRSTS_ECCERRBIT_3 ((uint32_t)0x00000020U) /* Bit 5 */ +#define DSI_ERRSTS_ECCERRBIT_4 ((uint32_t)0x00000040U) /* Bit 6 */ +#define DSI_ERRSTS_CRCERR ((uint32_t)0x00000080U) /* Bit 7 */ +#define DSI_ERRSTS_HTXTOERR ((uint32_t)0x00000100U) /* Bit 8 */ +#define DSI_ERRSTS_LRXTOERR ((uint32_t)0x00000200U) /* Bit 9 */ +#define DSI_ERRSTS_BATTOERR ((uint32_t)0x00000400U) /* Bit 10 */ + +/** Bit definition for DSI_CLKLANEN register **/ +#define DSI_CLKLANEN_CLKLANEN ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for DSI_DATLANEN register **/ +#define DSI_DATLANEN_DATLANEN_POS (0) +#define DSI_DATLANEN_DATLANEN ((uint32_t)0x0000000FU) /* Bit[3:0] */ +#define DSI_DATLANEN_DATLANEN_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define DSI_DATLANEN_DATLANEN_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define DSI_DATLANEN_DATLANEN_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define DSI_DATLANEN_DATLANEN_3 ((uint32_t)0x00000008U) /* Bit 3 */ + +/** Bit definition for DSI_SKEWCALTIMI register **/ +#define DSI_SKEWCALTIMI_SKEWVALTIMI_POS (0) +#define DSI_SKEWCALTIMI_SKEWVALTIMI ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for DSI_SKEWCALTIMP register **/ +#define DSI_SKEWCALTIMP_SKEWVALTIMP_POS (0) +#define DSI_SKEWCALTIMP_SKEWVALTIMP ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for DSI_ALTCALTIM register **/ +#define DSI_ALTCALTIM_ALTCALTIM_POS (0) +#define DSI_ALTCALTIM_ALTCALTIM ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for DSI_SKEWCALINE register **/ +#define DSI_SKEWCALINE_SKEWCALINE_POS (0) +#define DSI_SKEWCALINE_SKEWCALINE ((uint32_t)0x000000FFU) /* Bit[7:0] */ + +/** Bit definition for VID_EN register **/ +#define VID_EN_EN_POS (0) +#define VID_EN_EN ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for VID_PIXPERPKT register **/ +#define VID_PIXPERPKT_PIXPERPKT_POS (0) +#define VID_PIXPERPKT_PIXPERPKT ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + + +/** Bit definition for VID_PIXPLDSIZ register **/ +#define VID_PIXPLDSIZ_PIXPLDSIZ_POS (0) +#define VID_PIXPLDSIZ_PIXPLDSIZ ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for VID_PIXALIGN register **/ +#define VID_PIXALIGN_PIXALIGN_POS (0) +#define VID_PIXALIGN_PIXALIGN ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for VID_PIXFMT register **/ +#define VID_PIXFMT_PIXFMT_POS (0) +#define VID_PIXFMT_PIXFMT ((uint32_t)0x0000003FU) /* Bit[5:0] */ + +/** Bit definition for VID_VSYNCPOL register **/ +#define VID_VSYNCPOL_VSYNCPOL_POS (0) +#define VID_VSYNCPOL_VSYNCPOL ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for VID_HSYNCPOL register **/ +#define VID_HSYNCPOL_HSYNCPOL_POS (0) +#define VID_HSYNCPOL_HSYNCPOL ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for VID_VIDEOMOD register **/ +#define VID_VIDEOMOD_VIDEOMOD_POS (0) +#define VID_VIDEOMOD_VIDEOMOD ((uint32_t)0x00000003U) /* Bit[1:0] */ +#define VID_VIDEOMOD_VIDEOMOD_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define VID_VIDEOMOD_VIDEOMOD_1 ((uint32_t)0x00000002U) /* Bit 1 */ + + +/** Bit definition for VID_OVERIDE register **/ +#define VID_OVERIDE_OVERIDE_POS (0) +#define VID_OVERIDE_OVERIDE ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for VID_STD register **/ +#define VID_STD_STD_POS (0) +#define VID_STD_STD ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for VID_HFP register **/ +#define VID_HFP_HFP_POS (0) +#define VID_HFP_HFP ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for VID_HBP register **/ +#define VID_HBP_HBP_POS (0) +#define VID_HBP_HBP ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for VID_HSA register **/ +#define VID_HSA_HSA_POS (0) +#define VID_HSA_HSA ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for VID_PKTPERLINE register **/ +#define VID_PKTPERLINE_PKTPERLINE_POS (0) +#define VID_PKTPERLINE_PKTPERLINE ((uint32_t)0x0000000FU) /* Bit[3:0] */ +#define VID_PKTPERLINE_PKTPERLINE_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define VID_PKTPERLINE_PKTPERLINE_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define VID_PKTPERLINE_PKTPERLINE_2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define VID_PKTPERLINE_PKTPERLINE_3 ((uint32_t)0x00000008U) /* Bit 3 */ + +/** Bit definition for VID_VBP register **/ +#define VID_VBP_VBP_POS (0) +#define VID_VBP_VBP ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for VID_VFP register **/ +#define VID_VFP_VFP_POS (0) +#define VID_VFP_VFP ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for VID_BLLPMOD register **/ +#define VID_BLLPMOD_BLLPMOD_POS (0) +#define VID_BLLPMOD_BLLPMOD ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for VID_NULLPKTBLLP register **/ +#define VID_NULLPKTBLLP_NULLPKTBLLP_POS (0) +#define VID_NULLPKTBLLP_NULLPKTBLLP ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for VID_VACT register **/ +#define VID_VACT_VACT_POS (0) +#define VID_VACT_VACT ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for VID_VC register **/ +#define VID_VC_VC_POS (0) +#define VID_VC_VC ((uint32_t)0x00000003U) /* Bit[1:0] */ +#define VID_VC_VC_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define VID_VC_VC_1 ((uint32_t)0x00000002U) /* Bit 1 */ + +/** Bit definition for VID_EXTPKTEN register **/ +#define VID_EXTPKTEN_EXTPKTEN_POS (0) +#define VID_EXTPKTEN_EXTPKTEN ((uint32_t)0x0000000FU) /* Bit[3:0] */ +#define VID_EXTPKTEN_EXTPKTEN_0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define VID_EXTPKTEN_EXTPKTEN_1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define VID_EXTPKTEN_EXTPKTEN_2 ((uint32_t)0x00000003U) /* Bit 2 */ +#define VID_EXTPKTEN_EXTPKTEN_3 ((uint32_t)0x00000004U) /* Bit 3 */ + +/** Bit definition for VID_VSSPLD register **/ +#define VID_VSSPLD_VSSPLD_POS (0) +#define VID_VSSPLD_VSSPLD ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for VID_PLDPERPKT register **/ +#define VID_PLDPERPKT_PLLPERPKT_POS (0) +#define VID_PLDPERPKT_PLLPERPKT ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for DSI_TXPLD register **/ +#define DSI_TXPLD_TXPLD_POS (0) +#define DSI_TXPLD_TXPLD ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ + +/** Bit definition for DSI_PKTCTRL register **/ +#define DSI_PKTCTRL_CNT_POS (0) +#define DSI_PKTCTRL_CNT ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ +#define DSI_PKTCTRL_VC_POS (16) +#define DSI_PKTCTRL_VC ((uint32_t)0x00030000U) /* Bit[17:16] */ +#define DSI_PKTCTRL_VC_0 ((uint32_t)0x00010000U) /* Bit 16 */ +#define DSI_PKTCTRL_VC_1 ((uint32_t)0x00020000U) /* Bit 17 */ +#define DSI_PKTCTRL_HDTYP_POS (18) +#define DSI_PKTCTRL_HDTYP ((uint32_t)0x00FC0000U) /* Bit[23:18] */ +#define DSI_PKTCTRL_HDTYP_0 ((uint32_t)0x00040000U) /* Bit 18 */ +#define DSI_PKTCTRL_HDTYP_1 ((uint32_t)0x00080000U) /* Bit 19 */ +#define DSI_PKTCTRL_HDTYP_2 ((uint32_t)0x00100000U) /* Bit 20 */ +#define DSI_PKTCTRL_HDTYP_3 ((uint32_t)0x00200000U) /* Bit 21 */ +#define DSI_PKTCTRL_HDTYP_4 ((uint32_t)0x00400000U) /* Bit 22 */ +#define DSI_PKTCTRL_HDTYP_5 ((uint32_t)0x00800000U) /* Bit 23 */ +#define DSI_PKTCTRL_MOD ((uint32_t)0x01000000U) /* Bit 24 */ +#define DSI_PKTCTRL_BATIMM ((uint32_t)0x02000000U) /* Bit 25 */ +#define DSI_PKTCTRL_BATNOPKT ((uint32_t)0x04000000U) /* Bit 26 */ + +/** Bit definition for DSI_SENDPKT register **/ +#define DSI_SENDPKT_SENDPKT ((uint32_t)0x00000001U) /* Bit 0 */ + +/** Bit definition for DSI_PKTSTS register **/ +#define DSI_PKTSTS_NIDLE ((uint32_t)0x00000001U) /* Bit 0 */ +#define DSI_PKTSTS_TXD ((uint32_t)0x00000002U) /* Bit 1 */ +#define DSI_PKTSTS_DPHYDIR ((uint32_t)0x00000004U) /* Bit 2 */ +#define DSI_PKTSTS_TXFOVER ((uint32_t)0x00000008U) /* Bit 3 */ +#define DSI_PKTSTS_TXFUNDER ((uint32_t)0x00000010U) /* Bit 4 */ +#define DSI_PKTSTS_RXFOVER ((uint32_t)0x00000020U) /* Bit 5 */ +#define DSI_PKTSTS_RXFUNDER ((uint32_t)0x00000040U) /* Bit 6 */ +#define DSI_PKTSTS_RXPKTD ((uint32_t)0x00000080U) /* Bit 7 */ +#define DSI_PKTSTS_ALLRXPKTD ((uint32_t)0x00000100U) /* Bit 8 */ + +/** Bit definition for DSI_PKTFWRLVL register **/ +#define DSI_PKTFWRLVL_POS (0) +#define DSI_PKTFWRLVL_PKTFWRLVL ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for DSI_PKTFRDLVL register **/ +#define DSI_PKTFRDLVL_POS (0) +#define DSI_PKTFRDLVL_PKTFRDLVL ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ + +/** Bit definition for DSI_PKTRXPLD register **/ +#define DSI_PKTRXPLD_POS (0) +#define DSI_PKTRXPLD_PKTRXPLD ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] */ + +/** Bit definition for DSI_PKTRXHDR register **/ +#define DSI_PKTRXHDR_POS (0) +#define DSI_PKTRXHDR_CNT ((uint32_t)0x0000FFFFU) /* Bit[15:0] */ +#define DSI_PKTRXHDR_DATATYP_POS (16) +#define DSI_PKTRXHDR_DATATYP ((uint32_t)0x003F0000U) /* Bit[21:16] */ +#define DSI_PKTRXHDR_DATATYP_0 ((uint32_t)0x00010000U) /* Bit 16 */ +#define DSI_PKTRXHDR_DATATYP_1 ((uint32_t)0x00020000U) /* Bit 17 */ +#define DSI_PKTRXHDR_DATATYP_2 ((uint32_t)0x00040000U) /* Bit 18 */ +#define DSI_PKTRXHDR_DATATYP_3 ((uint32_t)0x00080000U) /* Bit 19 */ +#define DSI_PKTRXHDR_DATATYP_4 ((uint32_t)0x00100000U) /* Bit 20 */ +#define DSI_PKTRXHDR_DATATYP_5 ((uint32_t)0x00200000U) /* Bit 21 */ +#define DSI_PKTRXHDR_VCN_POS (22) +#define DSI_PKTRXHDR_VCN ((uint32_t)0x00C00000U) /* Bit[23:22] */ +#define DSI_PKTRXHDR_VCN_0 ((uint32_t)0x00400000U) /* Bit 22 */ +#define DSI_PKTRXHDR_VCN_1 ((uint32_t)0x00800000U) /* Bit 23 */ + +/** Bit definition for DSI_IFPRIOSEL register **/ +#define DSI_IFPRIOSEL_IFPRIOSEL ((uint32_t)0x0000FFFFU) /* Bit 0 */ + +/*** Window WATCHDOG ***/ + +/** Bit definition for WWDG_CFG register **/ +#define WWDG_CFG_W ((uint32_t)0x00003FFFU) /* W[13:0] bits (14-bit window value) */ +#define WWDG_CFG_W0 ((uint32_t)0x00000001U) /* Bit 0 */ +#define WWDG_CFG_W1 ((uint32_t)0x00000002U) /* Bit 1 */ +#define WWDG_CFG_W2 ((uint32_t)0x00000004U) /* Bit 2 */ +#define WWDG_CFG_W3 ((uint32_t)0x00000008U) /* Bit 3 */ +#define WWDG_CFG_W4 ((uint32_t)0x00000010U) /* Bit 4 */ +#define WWDG_CFG_W5 ((uint32_t)0x00000020U) /* Bit 5 */ +#define WWDG_CFG_W6 ((uint32_t)0x00000040U) /* Bit 6 */ +#define WWDG_CFG_W7 ((uint32_t)0x00000080U) /* Bit 7 */ +#define WWDG_CFG_W8 ((uint32_t)0x00000100U) /* Bit 8 */ +#define WWDG_CFG_W9 ((uint32_t)0x00000200U) /* Bit 9 */ +#define WWDG_CFG_W10 ((uint32_t)0x00000400U) /* Bit 10 */ +#define WWDG_CFG_W11 ((uint32_t)0x00000800U) /* Bit 11 */ +#define WWDG_CFG_W12 ((uint32_t)0x00001000U) /* Bit 12 */ +#define WWDG_CFG_W13 ((uint32_t)0x00002000U) /* Bit 13 */ + +#define WWDG_CFG_TIMERB ((uint32_t)0x0000C000U) /* WDGTB[1:0] bits (Timer Base) */ +#define WWDG_CFG_TIMERB0 ((uint32_t)0x00004000U) /* Bit 0 */ +#define WWDG_CFG_TIMERB1 ((uint32_t)0x00008000U) /* Bit 1 */ + +#define WWDG_CFG_EWINT ((uint32_t)0x00010000U) /* Early Wakeup Interrupt */ + +/** Bit definition for WWDG_CTRL register **/ +#define WWDG_CTRL_T ((uint16_t)0x3FFFU) /*T[13:0] bits(14-bit counter (MSB to LSB)) */ +#define WWDG_CTRL_T0 ((uint16_t)0x0001U) /* Bit 0 */ +#define WWDG_CTRL_T1 ((uint16_t)0x0002U) /* Bit 1 */ +#define WWDG_CTRL_T2 ((uint16_t)0x0004U) /* Bit 2 */ +#define WWDG_CTRL_T3 ((uint16_t)0x0008U) /* Bit 3 */ +#define WWDG_CTRL_T4 ((uint16_t)0x0010U) /* Bit 4 */ +#define WWDG_CTRL_T5 ((uint16_t)0x0020U) /* Bit 5 */ +#define WWDG_CTRL_T6 ((uint16_t)0x0040U) /* Bit 6 */ +#define WWDG_CTRL_T7 ((uint16_t)0x0080U) /* Bit 7 */ +#define WWDG_CTRL_T8 ((uint16_t)0x0100U) /* Bit 8 */ +#define WWDG_CTRL_T9 ((uint16_t)0x0200U) /* Bit 9 */ +#define WWDG_CTRL_T10 ((uint16_t)0x0400U) /* Bit 10 */ +#define WWDG_CTRL_T11 ((uint16_t)0x0800U) /* Bit 11 */ +#define WWDG_CTRL_T12 ((uint16_t)0x1000U) /* Bit 12 */ +#define WWDG_CTRL_T13 ((uint16_t)0x2000U) /* Bit 13 */ + +#define WWDG_CTRL_ACTB ((uint16_t)0x4000U) /* Activation bit */ + +/** Bit definition for WWDG_STS register **/ +#define WWDG_STS_EWINTF ((uint8_t)0x01U) /* Early Wakeup Interrupt Flag */ + +/*** Independent watchdog ***/ + +/** Bit definition for IWDG_KEY register **/ +#define IWDG_KEY_KEYV ((uint16_t)0xFFFFU) /* Key value (write only, read 0000h) */ + +/** Bit definition for IWDG_STS register **/ +#define IWDG_STS_PVU ((uint8_t)0x01U) /* Watchdog prescaler value update */ +#define IWDG_STS_CRVU ((uint8_t)0x02U) /* Watchdog counter reload value update */ +#define IWDG_STS_FRZF ((uint8_t)0x04U) /* The freeze flag */ + +/** Bit definition for IWDG_PREDIV register **/ +#define IWDG_PREDIV_PD ((uint8_t)0x07U) /* PD[2:0] (Prescaler divider) */ +#define IWDG_PREDIV_PD0 ((uint8_t)0x01U) /* Bit 0 */ +#define IWDG_PREDIV_PD1 ((uint8_t)0x02U) /* Bit 1 */ +#define IWDG_PREDIV_PD2 ((uint8_t)0x04U) /* Bit 2 */ + +/** Bit definition for IWDG_RELV register **/ +#define IWDG_RELV_REL ((uint16_t)0x0FFFU) /* Watchdog counter reload value */ + + +/*** Flexible Datarate Controller Area Network ***/ + +/** Bit definition for FDCAN_CREL register **/ +#define FDCAN_CREL_DAY ((uint32_t)0x000000FFU) /* Timestamp Day bits */ +#define FDCAN_CREL_DAY_0 ((uint32_t)0x00000001U) /* Timestamp Day bit 0 */ +#define FDCAN_CREL_DAY_1 ((uint32_t)0x00000002U) /* Timestamp Day bit 1 */ +#define FDCAN_CREL_DAY_2 ((uint32_t)0x00000004U) /* Timestamp Day bit 2 */ +#define FDCAN_CREL_DAY_3 ((uint32_t)0x00000008U) /* Timestamp Day bit 3 */ +#define FDCAN_CREL_DAY_4 ((uint32_t)0x00000010U) /* Timestamp Day bit 4 */ +#define FDCAN_CREL_DAY_5 ((uint32_t)0x00000020U) /* Timestamp Day bit 5 */ +#define FDCAN_CREL_DAY_6 ((uint32_t)0x00000040U) /* Timestamp Day bit 6 */ +#define FDCAN_CREL_DAY_7 ((uint32_t)0x00000080U) /* Timestamp Day bit 7 */ + +#define FDCAN_CREL_MON ((uint32_t)0x0000FF00U) /* Timestamp Month bits */ +#define FDCAN_CREL_MON_0 ((uint32_t)0x00000100U) /* Timestamp Month bit 0 */ +#define FDCAN_CREL_MON_1 ((uint32_t)0x00000200U) /* Timestamp Month bit 1 */ +#define FDCAN_CREL_MON_2 ((uint32_t)0x00000400U) /* Timestamp Month bit 2 */ +#define FDCAN_CREL_MON_3 ((uint32_t)0x00000800U) /* Timestamp Month bit 3 */ +#define FDCAN_CREL_MON_4 ((uint32_t)0x00001000U) /* Timestamp Month bit 4 */ +#define FDCAN_CREL_MON_5 ((uint32_t)0x00002000U) /* Timestamp Month bit 5 */ +#define FDCAN_CREL_MON_6 ((uint32_t)0x00004000U) /* Timestamp Month bit 6 */ +#define FDCAN_CREL_MON_7 ((uint32_t)0x00008000U) /* Timestamp Month bit 7 */ + +#define FDCAN_CREL_YEAR ((uint32_t)0x000F0000U) /* Timestamp Year bits */ +#define FDCAN_CREL_YEAR_0 ((uint32_t)0x00010000U) /* Timestamp Year bit 0 */ +#define FDCAN_CREL_YEAR_1 ((uint32_t)0x00020000U) /* Timestamp Year bit 1 */ +#define FDCAN_CREL_YEAR_2 ((uint32_t)0x00040000U) /* Timestamp Year bit 2 */ +#define FDCAN_CREL_YEAR_3 ((uint32_t)0x00080000U) /* Timestamp Year bit 3 */ + +#define FDCAN_CREL_SUBSTEP ((uint32_t)0x00F00000U) /* Sub-step of Core release bits */ +#define FDCAN_CREL_SUBSTEP_0 ((uint32_t)0x00100000U) /* Sub-step of Core release bit 0 */ +#define FDCAN_CREL_SUBSTEP_1 ((uint32_t)0x00200000U) /* Sub-step of Core release bit 1 */ +#define FDCAN_CREL_SUBSTEP_2 ((uint32_t)0x00400000U) /* Sub-step of Core release bit 2 */ +#define FDCAN_CREL_SUBSTEP_3 ((uint32_t)0x00800000U) /* Sub-step of Core release bit 3 */ + +#define FDCAN_CREL_STEP ((uint32_t)0x0F000000U) /* Step of Core release bits */ +#define FDCAN_CREL_STEP_0 ((uint32_t)0x01000000U) /* Step of Core release bit 0 */ +#define FDCAN_CREL_STEP_1 ((uint32_t)0x02000000U) /* Step of Core release bit 1 */ +#define FDCAN_CREL_STEP_2 ((uint32_t)0x04000000U) /* Step of Core release bit 2 */ +#define FDCAN_CREL_STEP_3 ((uint32_t)0x08000000U) /* Step of Core release bit 3 */ + +#define FDCAN_CREL_REL ((uint32_t)0xF0000000U) /* Core release bits */ +#define FDCAN_CREL_REL_0 ((uint32_t)0x10000000U) /* Core release bits 0 */ +#define FDCAN_CREL_REL_1 ((uint32_t)0x20000000U) /* Core release bits 1 */ +#define FDCAN_CREL_REL_2 ((uint32_t)0x40000000U) /* Core release bits 2 */ +#define FDCAN_CREL_REL_3 ((uint32_t)0x80000000U) /* Core release bits 3 */ + +/** Bit definition for FDCAN_ENDN register **/ +#define FDCAN_ENDN_ETV ((uint32_t)0xFFFFFFFFU) /* Endianness Test Value */ + +/** Bit definition for FDCAN_DBTP register **/ +#define FDCAN_DBTP_DSJW ((uint32_t)0x0000000FU) /* Synchronization Jump Width bits */ +#define FDCAN_DBTP_DTSEG2 ((uint32_t)0x000000F0U) /* Data time segment after sample point bits */ +#define FDCAN_DBTP_DTSEG1 ((uint32_t)0x00001F00U) /* Data time segment before sample point bits */ +#define FDCAN_DBTP_DBRP ((uint32_t)0x001F0000U) /* Data BIt Rate Prescaler bits */ + +#define FDCAN_DBTP_TDC ((uint32_t)0x00800000U) /* Transceiver Delay Compensation */ + +/** Bit definition for FDCAN_TEST register **/ +#define FDCAN_TEST_LBCK ((uint32_t)0x00000010U) /* Loop Back Mode */ +#define FDCAN_TEST_TX ((uint32_t)0x00000060U) /* Control bits of Transmit Pin */ +#define FDCAN_TEST_RX ((uint32_t)0x00000080U) /* Receive Pin status */ + +/** Bit definition for FDCAN_RWD register **/ +#define FDCAN_RWD_WDC ((uint32_t)0x000000FFU) /* Watchdog Configuration bits */ +#define FDCAN_RWD_WDC_0 ((uint32_t)0x00000001U) /* Watchdog Configuration bit 0 */ +#define FDCAN_RWD_WDC_1 ((uint32_t)0x00000002U) /* Watchdog Configuration bit 1 */ +#define FDCAN_RWD_WDC_2 ((uint32_t)0x00000004U) /* Watchdog Configuration bit 2 */ +#define FDCAN_RWD_WDC_3 ((uint32_t)0x00000008U) /* Watchdog Configuration bit 3 */ +#define FDCAN_RWD_WDC_4 ((uint32_t)0x00000010U) /* Watchdog Configuration bit 4 */ +#define FDCAN_RWD_WDC_5 ((uint32_t)0x00000020U) /* Watchdog Configuration bit 5 */ +#define FDCAN_RWD_WDC_6 ((uint32_t)0x00000040U) /* Watchdog Configuration bit 6 */ +#define FDCAN_RWD_WDC_7 ((uint32_t)0x00000080U) /* Watchdog Configuration bit 7 */ + +#define FDCAN_RWD_WDV ((uint32_t)0x0000FF00U) /* Watchdog Value bits */ +#define FDCAN_RWD_WDV_0 ((uint32_t)0x00000100U) /* Watchdog Value bit 0 */ +#define FDCAN_RWD_WDV_1 ((uint32_t)0x00000200U) /* Watchdog Value bit 1 */ +#define FDCAN_RWD_WDV_2 ((uint32_t)0x00000400U) /* Watchdog Value bit 2 */ +#define FDCAN_RWD_WDV_3 ((uint32_t)0x00000800U) /* Watchdog Value bit 3 */ +#define FDCAN_RWD_WDV_4 ((uint32_t)0x00001000U) /* Watchdog Value bit 4 */ +#define FDCAN_RWD_WDV_5 ((uint32_t)0x00002000U) /* Watchdog Value bit 5 */ +#define FDCAN_RWD_WDV_6 ((uint32_t)0x00004000U) /* Watchdog Value bit 6 */ +#define FDCAN_RWD_WDV_7 ((uint32_t)0x00008000U) /* Watchdog Value bit 7 */ + +/** Bit definition for FDCAN_CCCR register **/ +#define FDCAN_CCCR_INIT ((uint32_t)0x00000001U) /* Initialization */ +#define FDCAN_CCCR_CCE ((uint32_t)0x00000002U) /* Configuration Change Enable */ +#define FDCAN_CCCR_ASM ((uint32_t)0x00000004U) /* ASM Restricted Operation Mode */ +#define FDCAN_CCCR_CSA ((uint32_t)0x00000008U) /* Clock Stop Acknowledge */ +#define FDCAN_CCCR_CSR ((uint32_t)0x00000010U) /* Clock Stop Request */ +#define FDCAN_CCCR_MON ((uint32_t)0x00000020U) /* Bus Monitoring Mode */ +#define FDCAN_CCCR_DAR ((uint32_t)0x00000040U) /* Disable Automatic Retransmission */ +#define FDCAN_CCCR_TEST ((uint32_t)0x00000080U) /* Test Mode Enable */ +#define FDCAN_CCCR_FDOE ((uint32_t)0x00000100U) /* FD Operation Enable */ +#define FDCAN_CCCR_BRSE ((uint32_t)0x00000200U) /* FDCAN Bit Rate Switch Enable */ +#define FDCAN_CCCR_PXHD ((uint32_t)0x00001000U) /* Protocol Exception Handling Disable */ +#define FDCAN_CCCR_EFBI ((uint32_t)0x00002000U) /* Edge Filtering during Bus Integration */ +#define FDCAN_CCCR_TXP ((uint32_t)0x00004000U) /* Two CAN bit times Transmit Pause */ +#define FDCAN_CCCR_NISO ((uint32_t)0x00008000U) /* Non ISO Operation */ + +/** Bit definition for FDCAN_NBTP register **/ +#define FDCAN_NBTP_NTSEG2 ((uint32_t)0x0000007FU) /* Nominal Time segment after sample point */ +#define FDCAN_NBTP_NTSEG1 ((uint32_t)0x0000FF00U) /* Nominal Time segment before sample point bits bits */ +#define FDCAN_NBTP_NBRP ((uint32_t)0x01FF0000U) /* Bit Rate Prescaler bits */ +#define FDCAN_NBTP_NSJW ((uint32_t)0xFE000000U) /* Nominal (Re)Synchronization Jump Width bits */ + +/** Bit definition for FDCAN_TSCC register **/ +#define FDCAN_TSCC_TSS ((uint32_t)0x00000003U) /* Timestamp Select bits */ +#define FDCAN_TSCC_CONSTANT ((uint32_t)0x00000000U) /* Timestamp counter is always 0x0000 */ +#define FDCAN_TSCC_INC_TCP ((uint32_t)0x00000001U) /* Timestamp counter is increasd according to TCP */ +#define FDCAN_TSCC_USE_EXT ((uint32_t)0x00000002U) /* Use Extern Timestamp counter */ + +#define FDCAN_TSCC_TCP ((uint32_t)0x000F0000U) /* Timestamp Counter Prescaler bits */ +#define FDCAN_TSCC_TCP_DIV1 ((uint32_t)0x00000000U) /* Timestamp counter time unit in equal to CAN bit time */ +#define FDCAN_TSCC_TCP_DIV2 ((uint32_t)0x00010000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 2 */ +#define FDCAN_TSCC_TCP_DIV3 ((uint32_t)0x00020000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 3 */ +#define FDCAN_TSCC_TCP_DIV4 ((uint32_t)0x00030000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 4 */ +#define FDCAN_TSCC_TCP_DIV5 ((uint32_t)0x00040000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 5 */ +#define FDCAN_TSCC_TCP_DIV6 ((uint32_t)0x00050000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 6 */ +#define FDCAN_TSCC_TCP_DIV7 ((uint32_t)0x00060000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 7 */ +#define FDCAN_TSCC_TCP_DIV8 ((uint32_t)0x00070000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 8 */ +#define FDCAN_TSCC_TCP_DIV9 ((uint32_t)0x00080000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 9 */ +#define FDCAN_TSCC_TCP_DIV10 ((uint32_t)0x00090000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 10 */ +#define FDCAN_TSCC_TCP_DIV11 ((uint32_t)0x000A0000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 11 */ +#define FDCAN_TSCC_TCP_DIV12 ((uint32_t)0x000B0000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 12 */ +#define FDCAN_TSCC_TCP_DIV13 ((uint32_t)0x000C0000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 13 */ +#define FDCAN_TSCC_TCP_DIV14 ((uint32_t)0x000D0000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 14 */ +#define FDCAN_TSCC_TCP_DIV15 ((uint32_t)0x000E0000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 15 */ +#define FDCAN_TSCC_TCP_DIV16 ((uint32_t)0x000F0000U) /* Timestamp counter time unit in equal to CAN bit time multiplied by 16 */ + +/** Bit definition for FDCAN_TSCV register **/ +#define FDCAN_TSCV_TSC ((uint32_t)0x0000FFFFU) /* Timestamp Counter */ + +/** Bit definition for FDCAN_TOCC register **/ +#define FDCAN_TOCC_ETOC ((uint32_t)0x00000001U) /* Enable Timeout Counter */ + +#define FDCAN_TOCC_TOS ((uint32_t)0x00000006U) /* Timeout Select bits */ +#define FDCAN_TOCC_TOS_CONTINUOUS ((uint32_t)0x00000000U) /* Continuous operation */ +#define FDCAN_TOCC_TOS_TX_EVENT_FIFO ((uint32_t)0x00000002U) /* Controlled by Tx event FIFO */ +#define FDCAN_TOCC_TOS_RX_FIFO0 ((uint32_t)0x00000004U) /* Controlled by Rx FIFO 0 */ +#define FDCAN_TOCC_TOS_RX_FIFO1 ((uint32_t)0x00000006U) /* Controlled by Rx FIFO 1 */ + +#define FDCAN_TOCC_TOP ((uint32_t)0xFFFF0000U) /* Timeout Period */ + +/** Bit definition for FDCAN_TOCV register **/ +#define FDCAN_TOCV_TOC ((uint32_t)0x0000FFFFU) /* Timeout Counter */ + +/** Bit definition for FDCAN_ECR register **/ +#define FDCAN_ECR_TEC ((uint32_t)0x000000FFU) /* Transmit Error Counter */ +#define FDCAN_ECR_REC ((uint32_t)0x00007F00U) /* Receive Error Counter */ +#define FDCAN_ECR_RP ((uint32_t)0x00008000U) /* Receive Error Passive */ +#define FDCAN_ECR_CEL ((uint32_t)0x00FF0000U) /* CAN Error Logging */ + +/** Bit definition for FDCAN_PSR register **/ +#define FDCAN_PSR_LEC ((uint32_t)0x00000007U) /* Last Error Code bits */ +#define FDCAN_PSR_LEC_NONE ((uint32_t)0x00000000U) /* No error occurred */ +#define FDCAN_PSR_LEC_STUFF ((uint32_t)0x00000001U) /* Stuff error */ +#define FDCAN_PSR_LEC_FORM ((uint32_t)0x00000002U) /* Form error */ +#define FDCAN_PSR_LEC_ACK ((uint32_t)0x00000003U) /* Acknowledge error */ +#define FDCAN_PSR_LEC_BIT1 ((uint32_t)0x00000004U) /* Bit 1 (recessive) error */ +#define FDCAN_PSR_LEC_BIT0 ((uint32_t)0x00000005U) /* Bit 0 (dominant) error */ +#define FDCAN_PSR_LEC_CRC ((uint32_t)0x00000006U) /* CRC check sum error */ +#define FDCAN_PSR_LEC_NO_CHANGE ((uint32_t)0x00000007U) /* No change since last read */ + +#define FDCAN_PSR_ACT ((uint32_t)0x00000018U) /* Activity bits */ +#define FDCAN_PSR_ACT_SYNC ((uint32_t)0x00000000U) /* Node is synchronizing on CAN communication */ +#define FDCAN_PSR_ACT_IDLE ((uint32_t)0x00000008U) /* Node is neither receiver nor transmitter */ +#define FDCAN_PSR_ACT_RX ((uint32_t)0x00000010U) /* Node is operating as receiver */ +#define FDCAN_PSR_ACT_TX ((uint32_t)0x00000018U) /* Node is operating as transmitter */ + +#define FDCAN_PSR_EP ((uint32_t)0x00000020U) /* Error Passive bit */ +#define FDCAN_PSR_EW ((uint32_t)0x00000040U) /* Warning Status bit */ +#define FDCAN_PSR_BO ((uint32_t)0x00000080U) /* Bus_Off Status */ + +#define FDCAN_PSR_DLEC ((uint32_t)0x00000700U) /* Data Last Error Code bits */ +#define FDCAN_PSR_DLEC_NONE ((uint32_t)0x00000000U) /* No error occurred */ +#define FDCAN_PSR_DLEC_STUFF ((uint32_t)0x00000100U) /* Stuff error */ +#define FDCAN_PSR_DLEC_FORM ((uint32_t)0x00000200U) /* Form error */ +#define FDCAN_PSR_DLEC_ACK ((uint32_t)0x00000300U) /* Acknowledge error */ +#define FDCAN_PSR_DLEC_BIT1 ((uint32_t)0x00000400U) /* Bit 1 (recessive) error */ +#define FDCAN_PSR_DLEC_BIT0 ((uint32_t)0x00000500U) /* Bit 0 (dominant) error */ +#define FDCAN_PSR_DLEC_CRC ((uint32_t)0x00000600U) /* CRC check sum error */ +#define FDCAN_PSR_DLEC_NO_CHANGE ((uint32_t)0x00000700U) /* No change since last read */ + +#define FDCAN_PSR_RESI ((uint32_t)0x00000800U) /* ESI flag of last received FDCAN Message */ +#define FDCAN_PSR_RBRS ((uint32_t)0x00001000U) /* BRS flag of last received FDCAN Message */ +#define FDCAN_PSR_RFDF ((uint32_t)0x00002000U) /* Received FDCAN Message */ +#define FDCAN_PSR_PXE ((uint32_t)0x00004000U) /* Protocol Exception Event */ + +#define FDCAN_PSR_TDCV ((uint32_t)0x007F0000U) /* Transmitter Delay Compensation Value bits */ + +/** Bit definition for FDCAN_TDCR register **/ +#define FDCAN_TDCR_TDCF ((uint32_t)0x0000007FU) /* Transmitter Delay Compensation Filter bits */ +#define FDCAN_TDCR_TDCF_0 ((uint32_t)0x00000001U) /* Transmitter Delay Compensation Filter bit 0 */ +#define FDCAN_TDCR_TDCF_1 ((uint32_t)0x00000002U) /* Transmitter Delay Compensation Filter bit 1 */ +#define FDCAN_TDCR_TDCF_2 ((uint32_t)0x00000004U) /* Transmitter Delay Compensation Filter bit 2 */ +#define FDCAN_TDCR_TDCF_3 ((uint32_t)0x00000008U) /* Transmitter Delay Compensation Filter bit 3 */ +#define FDCAN_TDCR_TDCF_4 ((uint32_t)0x00000010U) /* Transmitter Delay Compensation Filter bit 4 */ +#define FDCAN_TDCR_TDCF_5 ((uint32_t)0x00000020U) /* Transmitter Delay Compensation Filter bit 5 */ +#define FDCAN_TDCR_TDCF_6 ((uint32_t)0x00000040U) /* Transmitter Delay Compensation Filter bit 6 */ + +#define FDCAN_TDCR_TDCO ((uint32_t)0x00007F00U) /* Transmitter Delay Compensation Offset bits */ +#define FDCAN_TDCR_TDCO_0 ((uint32_t)0x00000100U) /* Transmitter Delay Compensation Offset bit 0 */ +#define FDCAN_TDCR_TDCO_1 ((uint32_t)0x00000200U) /* Transmitter Delay Compensation Offset bit 1 */ +#define FDCAN_TDCR_TDCO_2 ((uint32_t)0x00000400U) /* Transmitter Delay Compensation Offset bit 2 */ +#define FDCAN_TDCR_TDCO_3 ((uint32_t)0x00000800U) /* Transmitter Delay Compensation Offset bit 3 */ +#define FDCAN_TDCR_TDCO_4 ((uint32_t)0x00001000U) /* Transmitter Delay Compensation Offset bit 4 */ +#define FDCAN_TDCR_TDCO_5 ((uint32_t)0x00002000U) /* Transmitter Delay Compensation Offset bit 5 */ +#define FDCAN_TDCR_TDCO_6 ((uint32_t)0x00004000U) /* Transmitter Delay Compensation Offset bit 6 */ + +/** Bit definition for FDCAN_IR register **/ +#define FDCAN_IR_RF0N ((uint32_t)0x00000001U) /* Rx FIFO 0 New Message */ +#define FDCAN_IR_RF0W ((uint32_t)0x00000002U) /* Rx FIFO 0 Watermark Reached */ +#define FDCAN_IR_RF0F ((uint32_t)0x00000004U) /* Rx FIFO 0 Full */ +#define FDCAN_IR_RF0L ((uint32_t)0x00000008U) /* Rx FIFO 0 Message Lost */ +#define FDCAN_IR_RF1N ((uint32_t)0x00000010U) /* Rx FIFO 1 New Message */ +#define FDCAN_IR_RF1W ((uint32_t)0x00000020U) /* Rx FIFO 1 Watermark Reached */ +#define FDCAN_IR_RF1F ((uint32_t)0x00000040U) /* Rx FIFO 1 Full */ +#define FDCAN_IR_RF1L ((uint32_t)0x00000080U) /* Rx FIFO 1 Message Lost */ +#define FDCAN_IR_HPM ((uint32_t)0x00000100U) /* High Priority Message */ +#define FDCAN_IR_TC ((uint32_t)0x00000200U) /* Transmission Completed */ +#define FDCAN_IR_TCF ((uint32_t)0x00000400U) /* Transmission Cancellation Finished */ +#define FDCAN_IR_TFE ((uint32_t)0x00000800U) /* Tx FIFO Empty */ +#define FDCAN_IR_TEFN ((uint32_t)0x00001000U) /* Tx Event FIFO New Entry */ +#define FDCAN_IR_TEFW ((uint32_t)0x00002000U) /* Tx Event FIFO Watermark Reached */ +#define FDCAN_IR_TEFF ((uint32_t)0x00004000U) /* Tx Event FIFO Full */ +#define FDCAN_IR_TEFL ((uint32_t)0x00008000U) /* Tx Event FIFO Element Lost */ +#define FDCAN_IR_TSW ((uint32_t)0x00010000U) /* Timestamp Wraparound */ +#define FDCAN_IR_MRAF ((uint32_t)0x00020000U) /* Message RAM Access Failure */ +#define FDCAN_IR_TOO ((uint32_t)0x00040000U) /* Timeout Occurred */ +#define FDCAN_IR_DRX ((uint32_t)0x00080000U) /* Bit Error Uncorrected */ +#define FDCAN_IR_BEC ((uint32_t)0x00100000U) /* Bit Error Corrected */ +#define FDCAN_IR_BEU ((uint32_t)0x00200000U) /* Bit Error Uncorrected */ +#define FDCAN_IR_ELO ((uint32_t)0x00400000U) /* Error Logging Overflow */ +#define FDCAN_IR_EP ((uint32_t)0x00800000U) /* Error Passive */ +#define FDCAN_IR_EW ((uint32_t)0x01000000U) /* Warning Status */ +#define FDCAN_IR_BO ((uint32_t)0x02000000U) /* Bus_Off Status */ +#define FDCAN_IR_WDI ((uint32_t)0x04000000U) /* Watchdog Interrupt */ +#define FDCAN_IR_PEA ((uint32_t)0x08000000U) /* Protocol Error in Arbitration Phase */ +#define FDCAN_IR_PED ((uint32_t)0x10000000U) /* Protocol Error in Data Phase */ +#define FDCAN_IR_ARA ((uint32_t)0x20000000U) /* Access to Reserved Address */ + +/** Bit definition for FDCAN_IE register **/ +#define FDCAN_IE_RF0NE ((uint32_t)0x00000001U) /* Rx FIFO 0 New Message interrupt enable */ +#define FDCAN_IE_RF0WE ((uint32_t)0x00000002U) /* Rx FIFO 0 Watermark Reached interrupt enable */ +#define FDCAN_IE_RF0FE ((uint32_t)0x00000004U) /* Rx FIFO 0 Full interrupt enable */ +#define FDCAN_IE_RF0LE ((uint32_t)0x00000008U) /* Rx FIFO 0 Message Lost interrupt enable */ +#define FDCAN_IE_RF1NE ((uint32_t)0x00000010U) /* Rx FIFO 1 New Message interrupt enable */ +#define FDCAN_IE_RF1WE ((uint32_t)0x00000020U) /* Rx FIFO 1 Watermark Reached interrupt enable */ +#define FDCAN_IE_RF1FE ((uint32_t)0x00000040U) /* Rx FIFO 1 Full interrupt enable */ +#define FDCAN_IE_RF1LE ((uint32_t)0x00000080U) /* Rx FIFO 1 Message Lost interrupt enable */ +#define FDCAN_IE_HPME ((uint32_t)0x00000100U) /* High Priority Message interrupt enable */ +#define FDCAN_IE_TCE ((uint32_t)0x00000200U) /* Transmission Completed interrupt enable */ +#define FDCAN_IE_TCFE ((uint32_t)0x00000400U) /* Transmission Cancellation Finished interrupt enable */ +#define FDCAN_IE_TFEE ((uint32_t)0x00000800U) /* Tx FIFO Empty interrupt enable */ +#define FDCAN_IE_TEFNE ((uint32_t)0x00001000U) /* Tx Event FIFO New Entry interrupt enable */ +#define FDCAN_IE_TEFWE ((uint32_t)0x00002000U) /* Tx Event FIFO Watermark Reached interrupt enable */ +#define FDCAN_IE_TEFFE ((uint32_t)0x00004000U) /* Tx Event FIFO Full interrupt enable */ +#define FDCAN_IE_TEFLE ((uint32_t)0x00008000U) /* Tx Event FIFO Element Lost interrupt enable */ +#define FDCAN_IE_TSWE ((uint32_t)0x00010000U) /* Timestamp Wraparound interrupt enable */ +#define FDCAN_IE_MRAFE ((uint32_t)0x00020000U) /* Message RAM Access Failure interrupt enable */ +#define FDCAN_IE_TOOE ((uint32_t)0x00040000U) /* Timeout Occurred interrupt enable */ +#define FDCAN_IE_DRXE ((uint32_t)0x00080000U) /* Message stored to Dedicated Rx Buffer interrupt enable */ +#define FDCAN_IE_BECE ((uint32_t)0x00100000U) /* Bit Error Corrected interrupt enable */ +#define FDCAN_IE_BEUE ((uint32_t)0x00200000U) /* Bit Error Uncorrected interrupt enable */ +#define FDCAN_IE_ELOE ((uint32_t)0x00400000U) /* Error Logging Overflow interrupt enable */ +#define FDCAN_IE_EPE ((uint32_t)0x00800000U) /* Error Passive interrupt enable */ +#define FDCAN_IE_EWE ((uint32_t)0x01000000U) /* Warning Status interrupt enable */ +#define FDCAN_IE_BOE ((uint32_t)0x02000000U) /* Bus_Off Status interrupt enable */ +#define FDCAN_IE_WDIE ((uint32_t)0x04000000U) /* Watchdog Interrupt enable */ +#define FDCAN_IE_PEAE ((uint32_t)0x08000000U) /* Protocol Error in Arbitration Phase interrupt enable */ +#define FDCAN_IE_PEDE ((uint32_t)0x10000000U) /* Protocol Error in Data Phase interrupt enable */ +#define FDCAN_IE_ARAE ((uint32_t)0x20000000U) /* AcEcess to Reserved Address interrupt enable */ + +/** Bit definition for FDCAN_ILS register **/ +#define FDCAN_ILS_RF0NL ((uint32_t)0x00000001U) /* Rx FIFO 0 New Message Line */ +#define FDCAN_ILS_RF0WL ((uint32_t)0x00000002U) /* Rx FIFO 0 Watermark Reached Line */ +#define FDCAN_ILS_RF0FL ((uint32_t)0x00000004U) /* Rx FIFO 0 Full Line */ +#define FDCAN_ILS_RF0LL ((uint32_t)0x00000008U) /* Rx FIFO 0 Message Lost Line */ +#define FDCAN_ILS_RF1NL ((uint32_t)0x00000010U) /* Rx FIFO 1 New Message Line */ +#define FDCAN_ILS_RF1WL ((uint32_t)0x00000020U) /* Rx FIFO 1 Watermark Reached Line */ +#define FDCAN_ILS_RF1FL ((uint32_t)0x00000040U) /* Rx FIFO 1 Full Line */ +#define FDCAN_ILS_RF1LL ((uint32_t)0x00000080U) /* Rx FIFO 1 Message Lost Line */ +#define FDCAN_ILS_HPML ((uint32_t)0x00000100U) /* High Priority Message Line */ +#define FDCAN_ILS_TCL ((uint32_t)0x00000200U) /* Transmission Completed Line */ +#define FDCAN_ILS_TCFL ((uint32_t)0x00000400U) /* Transmission Cancellation Finished Line */ +#define FDCAN_ILS_TFEL ((uint32_t)0x00000800U) /* Tx FIFO Empty Line */ +#define FDCAN_ILS_TEFNL ((uint32_t)0x00001000U) /* Tx Event FIFO New Entry Line */ +#define FDCAN_ILS_TEFWL ((uint32_t)0x00002000U) /* Tx Event FIFO Watermark Reached Line */ +#define FDCAN_ILS_TEFFL ((uint32_t)0x00004000U) /* Tx Event FIFO Full Line */ +#define FDCAN_ILS_TEFLL ((uint32_t)0x00008000U) /* Tx Event FIFO Element Lost Line */ +#define FDCAN_ILS_TSWL ((uint32_t)0x00010000U) /* Timestamp Wraparound Line */ +#define FDCAN_ILS_MRAFL ((uint32_t)0x00020000U) /* Message RAM Access Failure Line */ +#define FDCAN_ILS_TOOL ((uint32_t)0x00040000U) /* Timeout Occurred Line */ +#define FDCAN_ILS_DRXL ((uint32_t)0x00080000U) /* Message stored to Dedicated Rx Buffer Line */ +#define FDCAN_ILS_BECL ((uint32_t)0x00100000U) /* Bit Error Corrected interrupt Line */ +#define FDCAN_ILS_BEUL ((uint32_t)0x00200000U) /* Bit Error Uncorrected interrupt Line */ +#define FDCAN_ILS_ELOL ((uint32_t)0x00400000U) /* Error Logging Overflow Line */ +#define FDCAN_ILS_EPL ((uint32_t)0x00800000U) /* Error Passive Line */ +#define FDCAN_ILS_EWL ((uint32_t)0x01000000U) /* Warning Status Line */ +#define FDCAN_ILS_BOL ((uint32_t)0x02000000U) /* Bus_Off Status Line */ +#define FDCAN_ILS_WDIL ((uint32_t)0x04000000U) /* Watchdog Line */ +#define FDCAN_ILS_PEAL ((uint32_t)0x08000000U) /* Protocol Error in Arbitration Phase Line */ +#define FDCAN_ILS_PEDL ((uint32_t)0x10000000U) /* Protocol Error in Data Phase Line */ +#define FDCAN_ILS_ARAL ((uint32_t)0x20000000U) /* Access to Reserved Address Line */ + +/** Bit definition for FDCAN_ILE register **/ +#define FDCAN_ILE_EINT0 ((uint32_t)0x00000001U) /* Enable Interrupt Line 0 */ +#define FDCAN_ILE_EINT1 ((uint32_t)0x00000002U) /* Enable Interrupt Line 1 */ + +/** Bit definition for FDCAN_GFC register **/ +#define FDCAN_GFC_RRFE ((uint32_t)0x00000001U) /* Reject Extended Remote Frames */ +#define FDCAN_GFC_RRFS ((uint32_t)0x00000002U) /* Reject Standard Remote Frames */ + +#define FDCAN_GFC_ANFE ((uint32_t)0x0000000CU) /* Accept Extended Non-matching Frames bits */ +#define FDCAN_GFC_ANFE_0 ((uint32_t)0x00000004U) /* Accept Extended Non-matching Frames bit 0 */ +#define FDCAN_GFC_ANFE_1 ((uint32_t)0x00000008U) /* Accept Extended Non-matching Frames bit 1 */ + +#define FDCAN_GFC_ANFS ((uint32_t)0x00000030U) /* Accept Standard Non-matching Frames bits */ +#define FDCAN_GFC_ANFS_0 ((uint32_t)0x00000010U) /* Accept Standard Non-matching Frames bit 0 */ +#define FDCAN_GFC_ANFS_1 ((uint32_t)0x00000020U) /* Accept Standard Non-matching Frames bit 1 */ + +/** Bit definition for FDCAN_SIDFC register **/ +#define FDCAN_SIDFC_FLSSA ((uint32_t)0x0000FFFCU) /* Filter List Standard Start Address */ +#define FDCAN_SIDFC_LSS ((uint32_t)0x00FF0000U) /* List Size Standard */ + +/** Bit definition for FDCAN_XIDFC register **/ +#define FDCAN_XIDFC_FLESA ((uint32_t)0x0000FFFCU) /* Filter List Extended Start Address */ +#define FDCAN_XIDFC_LSE ((uint32_t)0x007F0000U) /* List Size Extended */ + +/** Bit definition for FDCAN_XIDAM register **/ +#define FDCAN_XIDAM_EIDM ((uint32_t)0x1FFFFFFFU) /* Extended ID Mask */ + +/** Bit definition for FDCAN_HPMS register **/ +#define FDCAN_HPMS_BIDX ((uint32_t)0x0000003FU) /* Buffer Index bits */ + +#define FDCAN_HPMS_MSI ((uint32_t)0x000000C0U) /* Message Storage Indicator bits */ +#define FDCAN_HPMS_MSI_NO_FIFO ((uint32_t)0x00000000U) /* No fifo selected */ +#define FDCAN_HPMS_MSI_MSG_LOST ((uint32_t)0x00000040U) /* Message lost */ +#define FDCAN_HPMS_MSI_FIFO0 ((uint32_t)0x00000080U) /* Message Stored in FIFO 0 */ +#define FDCAN_HPMS_MSI_FIFO1 ((uint32_t)0x000000C0U) /* Message Stored in FIFO 1 */ + +#define FDCAN_HPMS_FIDX ((uint32_t)0x00007F00U) /* Filter Index bits */ + +#define FDCAN_HPMS_FLST ((uint32_t)0x00008000U) /* Filter List */ +#define FDCAN_HPMS_FLST_STD ((uint32_t)0x00000000U) /* Standard Filter List */ +#define FDCAN_HPMS_FLST_EXT ((uint32_t)0x00008000U) /* Extended Filter List */ + +/** Bit definition for FDCAN_NDAT1 register **/ +#define FDCAN_NDAT1_ND0 ((uint32_t)0x00000001U) /* New Data flag of Rx Buffer 0 */ +#define FDCAN_NDAT1_ND1 ((uint32_t)0x00000002U) /* New Data flag of Rx Buffer 1 */ +#define FDCAN_NDAT1_ND2 ((uint32_t)0x00000004U) /* New Data flag of Rx Buffer 2 */ +#define FDCAN_NDAT1_ND3 ((uint32_t)0x00000008U) /* New Data flag of Rx Buffer 3 */ +#define FDCAN_NDAT1_ND4 ((uint32_t)0x00000010U) /* New Data flag of Rx Buffer 4 */ +#define FDCAN_NDAT1_ND5 ((uint32_t)0x00000020U) /* New Data flag of Rx Buffer 5 */ +#define FDCAN_NDAT1_ND6 ((uint32_t)0x00000040U) /* New Data flag of Rx Buffer 6 */ +#define FDCAN_NDAT1_ND7 ((uint32_t)0x00000080U) /* New Data flag of Rx Buffer 7 */ +#define FDCAN_NDAT1_ND8 ((uint32_t)0x00000100U) /* New Data flag of Rx Buffer 8 */ +#define FDCAN_NDAT1_ND9 ((uint32_t)0x00000200U) /* New Data flag of Rx Buffer 9 */ +#define FDCAN_NDAT1_ND10 ((uint32_t)0x00000400U) /* New Data flag of Rx Buffer 10 */ +#define FDCAN_NDAT1_ND11 ((uint32_t)0x00000800U) /* New Data flag of Rx Buffer 11 */ +#define FDCAN_NDAT1_ND12 ((uint32_t)0x00001000U) /* New Data flag of Rx Buffer 12 */ +#define FDCAN_NDAT1_ND13 ((uint32_t)0x00002000U) /* New Data flag of Rx Buffer 13 */ +#define FDCAN_NDAT1_ND14 ((uint32_t)0x00004000U) /* New Data flag of Rx Buffer 14 */ +#define FDCAN_NDAT1_ND15 ((uint32_t)0x00008000U) /* New Data flag of Rx Buffer 15 */ +#define FDCAN_NDAT1_ND16 ((uint32_t)0x00010000U) /* New Data flag of Rx Buffer 16 */ +#define FDCAN_NDAT1_ND17 ((uint32_t)0x00020000U) /* New Data flag of Rx Buffer 17 */ +#define FDCAN_NDAT1_ND18 ((uint32_t)0x00040000U) /* New Data flag of Rx Buffer 18 */ +#define FDCAN_NDAT1_ND19 ((uint32_t)0x00080000U) /* New Data flag of Rx Buffer 19 */ +#define FDCAN_NDAT1_ND20 ((uint32_t)0x00100000U) /* New Data flag of Rx Buffer 20 */ +#define FDCAN_NDAT1_ND21 ((uint32_t)0x00200000U) /* New Data flag of Rx Buffer 21 */ +#define FDCAN_NDAT1_ND22 ((uint32_t)0x00400000U) /* New Data flag of Rx Buffer 22 */ +#define FDCAN_NDAT1_ND23 ((uint32_t)0x00800000U) /* New Data flag of Rx Buffer 23 */ +#define FDCAN_NDAT1_ND24 ((uint32_t)0x01000000U) /* New Data flag of Rx Buffer 24 */ +#define FDCAN_NDAT1_ND25 ((uint32_t)0x02000000U) /* New Data flag of Rx Buffer 25 */ +#define FDCAN_NDAT1_ND26 ((uint32_t)0x04000000U) /* New Data flag of Rx Buffer 26 */ +#define FDCAN_NDAT1_ND27 ((uint32_t)0x08000000U) /* New Data flag of Rx Buffer 27 */ +#define FDCAN_NDAT1_ND28 ((uint32_t)0x10000000U) /* New Data flag of Rx Buffer 28 */ +#define FDCAN_NDAT1_ND29 ((uint32_t)0x20000000U) /* New Data flag of Rx Buffer 29 */ +#define FDCAN_NDAT1_ND30 ((uint32_t)0x40000000U) /* New Data flag of Rx Buffer 30 */ +#define FDCAN_NDAT1_ND31 ((uint32_t)0x80000000U) /* New Data flag of Rx Buffer 31 */ + +/** Bit definition for FDCAN_NDAT2 register **/ +#define FDCAN_NDAT2_ND32 ((uint32_t)0x00000001U) /* New Data flag of Rx Buffer 32 */ +#define FDCAN_NDAT2_ND33 ((uint32_t)0x00000002U) /* New Data flag of Rx Buffer 33 */ +#define FDCAN_NDAT2_ND34 ((uint32_t)0x00000004U) /* New Data flag of Rx Buffer 34 */ +#define FDCAN_NDAT2_ND35 ((uint32_t)0x00000008U) /* New Data flag of Rx Buffer 35 */ +#define FDCAN_NDAT2_ND36 ((uint32_t)0x00000010U) /* New Data flag of Rx Buffer 36 */ +#define FDCAN_NDAT2_ND37 ((uint32_t)0x00000020U) /* New Data flag of Rx Buffer 37 */ +#define FDCAN_NDAT2_ND38 ((uint32_t)0x00000040U) /* New Data flag of Rx Buffer 38 */ +#define FDCAN_NDAT2_ND39 ((uint32_t)0x00000080U) /* New Data flag of Rx Buffer 39 */ +#define FDCAN_NDAT2_ND40 ((uint32_t)0x00000100U) /* New Data flag of Rx Buffer 40 */ +#define FDCAN_NDAT2_ND41 ((uint32_t)0x00000200U) /* New Data flag of Rx Buffer 41 */ +#define FDCAN_NDAT2_ND42 ((uint32_t)0x00000400U) /* New Data flag of Rx Buffer 42 */ +#define FDCAN_NDAT2_ND43 ((uint32_t)0x00000800U) /* New Data flag of Rx Buffer 43 */ +#define FDCAN_NDAT2_ND44 ((uint32_t)0x00001000U) /* New Data flag of Rx Buffer 44 */ +#define FDCAN_NDAT2_ND45 ((uint32_t)0x00002000U) /* New Data flag of Rx Buffer 45 */ +#define FDCAN_NDAT2_ND46 ((uint32_t)0x00004000U) /* New Data flag of Rx Buffer 46 */ +#define FDCAN_NDAT2_ND47 ((uint32_t)0x00008000U) /* New Data flag of Rx Buffer 47 */ +#define FDCAN_NDAT2_ND48 ((uint32_t)0x00010000U) /* New Data flag of Rx Buffer 48 */ +#define FDCAN_NDAT2_ND49 ((uint32_t)0x00020000U) /* New Data flag of Rx Buffer 49 */ +#define FDCAN_NDAT2_ND50 ((uint32_t)0x00040000U) /* New Data flag of Rx Buffer 50 */ +#define FDCAN_NDAT2_ND51 ((uint32_t)0x00080000U) /* New Data flag of Rx Buffer 51 */ +#define FDCAN_NDAT2_ND52 ((uint32_t)0x00100000U) /* New Data flag of Rx Buffer 52 */ +#define FDCAN_NDAT2_ND53 ((uint32_t)0x00200000U) /* New Data flag of Rx Buffer 53 */ +#define FDCAN_NDAT2_ND54 ((uint32_t)0x00400000U) /* New Data flag of Rx Buffer 54 */ +#define FDCAN_NDAT2_ND55 ((uint32_t)0x00800000U) /* New Data flag of Rx Buffer 55 */ +#define FDCAN_NDAT2_ND56 ((uint32_t)0x01000000U) /* New Data flag of Rx Buffer 56 */ +#define FDCAN_NDAT2_ND57 ((uint32_t)0x02000000U) /* New Data flag of Rx Buffer 57 */ +#define FDCAN_NDAT2_ND58 ((uint32_t)0x04000000U) /* New Data flag of Rx Buffer 58 */ +#define FDCAN_NDAT2_ND59 ((uint32_t)0x08000000U) /* New Data flag of Rx Buffer 59 */ +#define FDCAN_NDAT2_ND60 ((uint32_t)0x10000000U) /* New Data flag of Rx Buffer 60 */ +#define FDCAN_NDAT2_ND61 ((uint32_t)0x20000000U) /* New Data flag of Rx Buffer 61 */ +#define FDCAN_NDAT2_ND62 ((uint32_t)0x40000000U) /* New Data flag of Rx Buffer 62 */ +#define FDCAN_NDAT2_ND63 ((uint32_t)0x80000000U) /* New Data flag of Rx Buffer 63 */ + +/** Bit definition for FDCAN_RXF0C register **/ +#define FDCAN_RXF0C_F0SA ((uint32_t)0x0000FFFCU) /* Rx FIFO 0 Start Address */ +#define FDCAN_RXF0C_F0S ((uint32_t)0x007F0000U) /* Rx FIFO 0 Size */ +#define FDCAN_RXF0C_F0WM ((uint32_t)0x7F000000U) /* Rx FIFO 0 Watermark */ +#define FDCAN_RXF0C_F0OM ((uint32_t)0x80000000U) /* Rx FIFO 0 Operation Mode */ + +/** Bit definition for FDCAN_RXF0S register **/ +#define FDCAN_RXF0S_F0FL ((uint32_t)0x0000007FU) /* Rx FIFO 0 Fill Level bits */ +#define FDCAN_RXF0S_F0GI ((uint32_t)0x00003F00U) /* Rx FIFO 0 Get Index bits */ +#define FDCAN_RXF0S_F0PI ((uint32_t)0x003F0000U) /* Rx FIFO 0 Put Index bits */ +#define FDCAN_RXF0S_F0F ((uint32_t)0x01000000U) /* Rx FIFO 0 Full */ +#define FDCAN_RXF0S_RF0L ((uint32_t)0x02000000U) /* Rx FIFO 0 Message Lost */ + +/** Bit definition for FDCAN_RXF0A register **/ +#define FDCAN_RXF0A_F0AI ((uint32_t)0x0000003FU) /* Rx FIFO 0 Acknowledge Index bits */ + +/** Bit definition for FDCAN_RXBC register **/ +#define FDCAN_RXBC_RBSA ((uint32_t)0x0000FFFCU) /* Rx Buffer Start Address */ + +/** Bit definition for FDCAN_RXF1C register **/ +#define FDCAN_RXF1C_F1SA ((uint32_t)0x0000FFFCU) /* Rx FIFO 1 Start Address */ +#define FDCAN_RXF1C_F1S ((uint32_t)0x007F0000U) /* Rx FIFO 1 Size */ +#define FDCAN_RXF1C_F1WM ((uint32_t)0x7F000000U) /* Rx FIFO 1 Watermark */ +#define FDCAN_RXF1C_F1OM ((uint32_t)0x80000000U) /* Rx FIFO 1 Operation Mode */ + +/** Bit definition for FDCAN_RXF1S register **/ +#define FDCAN_RXF1S_F1FL ((uint32_t)0x0000007FU) /* Rx FIFO 1 Fill Level bits */ +#define FDCAN_RXF1S_F1GI ((uint32_t)0x00003F00U) /* Rx FIFO 1 Get Index bits */ +#define FDCAN_RXF1S_F1PI ((uint32_t)0x003F0000U) /* Rx FIFO 1 Put Index bits */ +#define FDCAN_RXF1S_F1F ((uint32_t)0x01000000U) /* Rx FIFO 1 Full */ +#define FDCAN_RXF1S_RF1L ((uint32_t)0x02000000U) /* Rx FIFO 1 Message Lost */ + +#define FDCAN_RXF1S_DMS ((uint32_t)0xC0000000U) /* Debug message status bits */ +#define FDCAN_RXF1S_DMS_0 ((uint32_t)0x40000000U) /* Debug message status bit 0 */ +#define FDCAN_RXF1S_DMS_1 ((uint32_t)0x80000000U) /* Debug message status bit 1 */ + +/** Bit definition for FDCAN_RXF1A register **/ +#define FDCAN_RXF1A_F1AI ((uint32_t)0x0000003FU) /* Rx FIFO 1 Acknowledge Index bits */ + +/** Bit definition for FDCAN_RXESC register **/ +#define FDCAN_RXESC_F0DS ((uint32_t)0x00000007U) /* Rx FIFO 1 Data Field Size bits */ +#define FDCAN_RXESC_F1DS ((uint32_t)0x00000070U) /* Rx FIFO 0 Data Field Size bits */ +#define FDCAN_RXESC_RBDS ((uint32_t)0x00000700U) /* Rx Buffer Data Field Size bits */ + +/** Bit definition for FDCAN_TXBC register **/ +#define FDCAN_TXBC_TBSA ((uint32_t)0x0000FFFCU) /* Tx Buffers Start Address */ +#define FDCAN_TXBC_NDTB ((uint32_t)0x003F0000U) /* Number of Dedicated Transmit Buffers bits */ +#define FDCAN_TXBC_TFQS ((uint32_t)0x3F000000U) /* Transmit FIFO/Queue Size bits */ +#define FDCAN_TXBC_TFQM ((uint32_t)0x40000000U) /* Tx FIFO/Queue Mode */ + +/** Bit definition for FDCAN_TXFQS register **/ +#define FDCAN_TXFQS_TFFL ((uint32_t)0x0000003FU) /* Tx FIFO Free Level bits */ +#define FDCAN_TXFQS_TFGI ((uint32_t)0x00001F00U) /* Tx FIFO Get Index bits */ +#define FDCAN_TXFQS_TFQPI ((uint32_t)0x001F0000U) /* Tx FIFO/Queue Put Index bis */ +#define FDCAN_TXFQS_TFQF ((uint32_t)0x00200000U) /* Tx FIFO/Queue Full */ + +/** Bit definition for FDCAN_TXESC register **/ +#define FDCAN_TXESC_TBDS ((uint32_t)0x00000007U) /* Tx Buffer Data Field Size */ + +#define FDCAN_TXESC_TBDS_8BYTE ((uint32_t)0x00000000U) /* Tx Buffer Data Field Size is 8 Byte */ +#define FDCAN_TXESC_TBDS_12BYTE ((uint32_t)0x00000001U) /* Tx Buffer Data Field Size is 12 Byte */ +#define FDCAN_TXESC_TBDS_16BYTE ((uint32_t)0x00000002U) /* Tx Buffer Data Field Size is 16 Byte */ +#define FDCAN_TXESC_TBDS_20BYTE ((uint32_t)0x00000003U) /* Tx Buffer Data Field Size is 20 Byte */ +#define FDCAN_TXESC_TBDS_24BYTE ((uint32_t)0x00000004U) /* Tx Buffer Data Field Size is 24 Byte */ +#define FDCAN_TXESC_TBDS_32BYTE ((uint32_t)0x00000005U) /* Tx Buffer Data Field Size is 32 Byte */ +#define FDCAN_TXESC_TBDS_48BYTE ((uint32_t)0x00000006U) /* Tx Buffer Data Field Size is 48 Byte */ +#define FDCAN_TXESC_TBDS_64BYTE ((uint32_t)0x00000007U) /* Tx Buffer Data Field Size is 64 Byte */ + +/** Bit definition for FDCAN_TXBRP register **/ +#define FDCAN_TXBRP_TRP0 ((uint32_t)0x00000001U) /* Transmission Request Pending 0 */ +#define FDCAN_TXBRP_TRP1 ((uint32_t)0x00000002U) /* Transmission Request Pending 1 */ +#define FDCAN_TXBRP_TRP2 ((uint32_t)0x00000004U) /* Transmission Request Pending 2 */ +#define FDCAN_TXBRP_TRP3 ((uint32_t)0x00000008U) /* Transmission Request Pending 3 */ +#define FDCAN_TXBRP_TRP4 ((uint32_t)0x00000010U) /* Transmission Request Pending 4 */ +#define FDCAN_TXBRP_TRP5 ((uint32_t)0x00000020U) /* Transmission Request Pending 5 */ +#define FDCAN_TXBRP_TRP6 ((uint32_t)0x00000040U) /* Transmission Request Pending 6 */ +#define FDCAN_TXBRP_TRP7 ((uint32_t)0x00000080U) /* Transmission Request Pending 7 */ +#define FDCAN_TXBRP_TRP8 ((uint32_t)0x00000100U) /* Transmission Request Pending 8 */ +#define FDCAN_TXBRP_TRP9 ((uint32_t)0x00000200U) /* Transmission Request Pending 9 */ +#define FDCAN_TXBRP_TRP10 ((uint32_t)0x00000400U) /* Transmission Request Pending 10 */ +#define FDCAN_TXBRP_TRP11 ((uint32_t)0x00000800U) /* Transmission Request Pending 11 */ +#define FDCAN_TXBRP_TRP12 ((uint32_t)0x00001000U) /* Transmission Request Pending 12 */ +#define FDCAN_TXBRP_TRP13 ((uint32_t)0x00002000U) /* Transmission Request Pending 13 */ +#define FDCAN_TXBRP_TRP14 ((uint32_t)0x00004000U) /* Transmission Request Pending 14 */ +#define FDCAN_TXBRP_TRP15 ((uint32_t)0x00008000U) /* Transmission Request Pending 15 */ +#define FDCAN_TXBRP_TRP16 ((uint32_t)0x00010000U) /* Transmission Request Pending 16 */ +#define FDCAN_TXBRP_TRP17 ((uint32_t)0x00020000U) /* Transmission Request Pending 17 */ +#define FDCAN_TXBRP_TRP18 ((uint32_t)0x00040000U) /* Transmission Request Pending 18 */ +#define FDCAN_TXBRP_TRP19 ((uint32_t)0x00080000U) /* Transmission Request Pending 19 */ +#define FDCAN_TXBRP_TRP20 ((uint32_t)0x00100000U) /* Transmission Request Pending 20 */ +#define FDCAN_TXBRP_TRP21 ((uint32_t)0x00200000U) /* Transmission Request Pending 21 */ +#define FDCAN_TXBRP_TRP22 ((uint32_t)0x00400000U) /* Transmission Request Pending 22 */ +#define FDCAN_TXBRP_TRP23 ((uint32_t)0x00800000U) /* Transmission Request Pending 23 */ +#define FDCAN_TXBRP_TRP24 ((uint32_t)0x01000000U) /* Transmission Request Pending 24 */ +#define FDCAN_TXBRP_TRP25 ((uint32_t)0x02000000U) /* Transmission Request Pending 25 */ +#define FDCAN_TXBRP_TRP26 ((uint32_t)0x04000000U) /* Transmission Request Pending 26 */ +#define FDCAN_TXBRP_TRP27 ((uint32_t)0x08000000U) /* Transmission Request Pending 27 */ +#define FDCAN_TXBRP_TRP28 ((uint32_t)0x10000000U) /* Transmission Request Pending 28 */ +#define FDCAN_TXBRP_TRP29 ((uint32_t)0x20000000U) /* Transmission Request Pending 29 */ +#define FDCAN_TXBRP_TRP30 ((uint32_t)0x40000000U) /* Transmission Request Pending 30 */ +#define FDCAN_TXBRP_TRP31 ((uint32_t)0x80000000U) /* Transmission Request Pending 31 */ + +/** Bit definition for FDCAN_TXBAR register **/ +#define FDCAN_TXBAR_AR0 ((uint32_t)0x00000001U) /* Add Request 0 */ +#define FDCAN_TXBAR_AR1 ((uint32_t)0x00000002U) /* Add Request 1 */ +#define FDCAN_TXBAR_AR2 ((uint32_t)0x00000004U) /* Add Request 2 */ +#define FDCAN_TXBAR_AR3 ((uint32_t)0x00000008U) /* Add Request 3 */ +#define FDCAN_TXBAR_AR4 ((uint32_t)0x00000010U) /* Add Request 4 */ +#define FDCAN_TXBAR_AR5 ((uint32_t)0x00000020U) /* Add Request 5 */ +#define FDCAN_TXBAR_AR6 ((uint32_t)0x00000040U) /* Add Request 6 */ +#define FDCAN_TXBAR_AR7 ((uint32_t)0x00000080U) /* Add Request 7 */ +#define FDCAN_TXBAR_AR8 ((uint32_t)0x00000100U) /* Add Request 8 */ +#define FDCAN_TXBAR_AR9 ((uint32_t)0x00000200U) /* Add Request 9 */ +#define FDCAN_TXBAR_AR10 ((uint32_t)0x00000400U) /* Add Request 10 */ +#define FDCAN_TXBAR_AR11 ((uint32_t)0x00000800U) /* Add Request 11 */ +#define FDCAN_TXBAR_AR12 ((uint32_t)0x00001000U) /* Add Request 12 */ +#define FDCAN_TXBAR_AR13 ((uint32_t)0x00002000U) /* Add Request 13 */ +#define FDCAN_TXBAR_AR14 ((uint32_t)0x00004000U) /* Add Request 14 */ +#define FDCAN_TXBAR_AR15 ((uint32_t)0x00008000U) /* Add Request 15 */ +#define FDCAN_TXBAR_AR16 ((uint32_t)0x00010000U) /* Add Request 16 */ +#define FDCAN_TXBAR_AR17 ((uint32_t)0x00020000U) /* Add Request 17 */ +#define FDCAN_TXBAR_AR18 ((uint32_t)0x00040000U) /* Add Request 18 */ +#define FDCAN_TXBAR_AR19 ((uint32_t)0x00080000U) /* Add Request 19 */ +#define FDCAN_TXBAR_AR20 ((uint32_t)0x00100000U) /* Add Request 20 */ +#define FDCAN_TXBAR_AR21 ((uint32_t)0x00200000U) /* Add Request 21 */ +#define FDCAN_TXBAR_AR22 ((uint32_t)0x00400000U) /* Add Request 22 */ +#define FDCAN_TXBAR_AR23 ((uint32_t)0x00800000U) /* Add Request 23 */ +#define FDCAN_TXBAR_AR24 ((uint32_t)0x01000000U) /* Add Request 24 */ +#define FDCAN_TXBAR_AR25 ((uint32_t)0x02000000U) /* Add Request 25 */ +#define FDCAN_TXBAR_AR26 ((uint32_t)0x04000000U) /* Add Request 26 */ +#define FDCAN_TXBAR_AR27 ((uint32_t)0x08000000U) /* Add Request 27 */ +#define FDCAN_TXBAR_AR28 ((uint32_t)0x10000000U) /* Add Request 28 */ +#define FDCAN_TXBAR_AR29 ((uint32_t)0x20000000U) /* Add Request 29 */ +#define FDCAN_TXBAR_AR30 ((uint32_t)0x40000000U) /* Add Request 30 */ +#define FDCAN_TXBAR_AR31 ((uint32_t)0x80000000U) /* Add Request 31 */ + +/** Bit definition for FDCAN_TXBCR register **/ +#define FDCAN_TXBCR_CR0 ((uint32_t)0x00000001U) /* Cancellation Request 0 */ +#define FDCAN_TXBCR_CR1 ((uint32_t)0x00000002U) /* Cancellation Request 1 */ +#define FDCAN_TXBCR_CR2 ((uint32_t)0x00000004U) /* Cancellation Request 2 */ +#define FDCAN_TXBCR_CR3 ((uint32_t)0x00000008U) /* Cancellation Request 3 */ +#define FDCAN_TXBCR_CR4 ((uint32_t)0x00000010U) /* Cancellation Request 4 */ +#define FDCAN_TXBCR_CR5 ((uint32_t)0x00000020U) /* Cancellation Request 5 */ +#define FDCAN_TXBCR_CR6 ((uint32_t)0x00000040U) /* Cancellation Request 6 */ +#define FDCAN_TXBCR_CR7 ((uint32_t)0x00000080U) /* Cancellation Request 7 */ +#define FDCAN_TXBCR_CR8 ((uint32_t)0x00000100U) /* Cancellation Request 8 */ +#define FDCAN_TXBCR_CR9 ((uint32_t)0x00000200U) /* Cancellation Request 9 */ +#define FDCAN_TXBCR_CR10 ((uint32_t)0x00000400U) /* Cancellation Request 10 */ +#define FDCAN_TXBCR_CR11 ((uint32_t)0x00000800U) /* Cancellation Request 11 */ +#define FDCAN_TXBCR_CR12 ((uint32_t)0x00001000U) /* Cancellation Request 12 */ +#define FDCAN_TXBCR_CR13 ((uint32_t)0x00002000U) /* Cancellation Request 13 */ +#define FDCAN_TXBCR_CR14 ((uint32_t)0x00004000U) /* Cancellation Request 14 */ +#define FDCAN_TXBCR_CR15 ((uint32_t)0x00008000U) /* Cancellation Request 15 */ +#define FDCAN_TXBCR_CR16 ((uint32_t)0x00010000U) /* Cancellation Request 16 */ +#define FDCAN_TXBCR_CR17 ((uint32_t)0x00020000U) /* Cancellation Request 17 */ +#define FDCAN_TXBCR_CR18 ((uint32_t)0x00040000U) /* Cancellation Request 18 */ +#define FDCAN_TXBCR_CR19 ((uint32_t)0x00080000U) /* Cancellation Request 19 */ +#define FDCAN_TXBCR_CR20 ((uint32_t)0x00100000U) /* Cancellation Request 20 */ +#define FDCAN_TXBCR_CR21 ((uint32_t)0x00200000U) /* Cancellation Request 21 */ +#define FDCAN_TXBCR_CR22 ((uint32_t)0x00400000U) /* Cancellation Request 22 */ +#define FDCAN_TXBCR_CR23 ((uint32_t)0x00800000U) /* Cancellation Request 23 */ +#define FDCAN_TXBCR_CR24 ((uint32_t)0x01000000U) /* Cancellation Request 24 */ +#define FDCAN_TXBCR_CR25 ((uint32_t)0x02000000U) /* Cancellation Request 25 */ +#define FDCAN_TXBCR_CR26 ((uint32_t)0x04000000U) /* Cancellation Request 26 */ +#define FDCAN_TXBCR_CR27 ((uint32_t)0x08000000U) /* Cancellation Request 27 */ +#define FDCAN_TXBCR_CR28 ((uint32_t)0x10000000U) /* Cancellation Request 28 */ +#define FDCAN_TXBCR_CR29 ((uint32_t)0x20000000U) /* Cancellation Request 29 */ +#define FDCAN_TXBCR_CR30 ((uint32_t)0x40000000U) /* Cancellation Request 30 */ +#define FDCAN_TXBCR_CR31 ((uint32_t)0x80000000U) /* Cancellation Request 31 */ + +/** Bit definition for FDCAN_TXBTO register **/ +#define FDCAN_TXBTO_TO0 ((uint32_t)0x00000001U) /* Transmission Occurred 0 */ +#define FDCAN_TXBTO_TO1 ((uint32_t)0x00000002U) /* Transmission Occurred 1 */ +#define FDCAN_TXBTO_TO2 ((uint32_t)0x00000004U) /* Transmission Occurred 2 */ +#define FDCAN_TXBTO_TO3 ((uint32_t)0x00000008U) /* Transmission Occurred 3 */ +#define FDCAN_TXBTO_TO4 ((uint32_t)0x00000010U) /* Transmission Occurred 4 */ +#define FDCAN_TXBTO_TO5 ((uint32_t)0x00000020U) /* Transmission Occurred 5 */ +#define FDCAN_TXBTO_TO6 ((uint32_t)0x00000040U) /* Transmission Occurred 6 */ +#define FDCAN_TXBTO_TO7 ((uint32_t)0x00000080U) /* Transmission Occurred 7 */ +#define FDCAN_TXBTO_TO8 ((uint32_t)0x00000100U) /* Transmission Occurred 8 */ +#define FDCAN_TXBTO_TO9 ((uint32_t)0x00000200U) /* Transmission Occurred 9 */ +#define FDCAN_TXBTO_TO10 ((uint32_t)0x00000400U) /* Transmission Occurred 10 */ +#define FDCAN_TXBTO_TO11 ((uint32_t)0x00000800U) /* Transmission Occurred 11 */ +#define FDCAN_TXBTO_TO12 ((uint32_t)0x00001000U) /* Transmission Occurred 12 */ +#define FDCAN_TXBTO_TO13 ((uint32_t)0x00002000U) /* Transmission Occurred 13 */ +#define FDCAN_TXBTO_TO14 ((uint32_t)0x00004000U) /* Transmission Occurred 14 */ +#define FDCAN_TXBTO_TO15 ((uint32_t)0x00008000U) /* Transmission Occurred 15 */ +#define FDCAN_TXBTO_TO16 ((uint32_t)0x00010000U) /* Transmission Occurred 16 */ +#define FDCAN_TXBTO_TO17 ((uint32_t)0x00020000U) /* Transmission Occurred 17 */ +#define FDCAN_TXBTO_TO18 ((uint32_t)0x00040000U) /* Transmission Occurred 18 */ +#define FDCAN_TXBTO_TO19 ((uint32_t)0x00080000U) /* Transmission Occurred 19 */ +#define FDCAN_TXBTO_TO20 ((uint32_t)0x00100000U) /* Transmission Occurred 20 */ +#define FDCAN_TXBTO_TO21 ((uint32_t)0x00200000U) /* Transmission Occurred 21 */ +#define FDCAN_TXBTO_TO22 ((uint32_t)0x00400000U) /* Transmission Occurred 22 */ +#define FDCAN_TXBTO_TO23 ((uint32_t)0x00800000U) /* Transmission Occurred 23 */ +#define FDCAN_TXBTO_TO24 ((uint32_t)0x01000000U) /* Transmission Occurred 24 */ +#define FDCAN_TXBTO_TO25 ((uint32_t)0x02000000U) /* Transmission Occurred 25 */ +#define FDCAN_TXBTO_TO26 ((uint32_t)0x04000000U) /* Transmission Occurred 26 */ +#define FDCAN_TXBTO_TO27 ((uint32_t)0x08000000U) /* Transmission Occurred 27 */ +#define FDCAN_TXBTO_TO28 ((uint32_t)0x10000000U) /* Transmission Occurred 28 */ +#define FDCAN_TXBTO_TO29 ((uint32_t)0x20000000U) /* Transmission Occurred 29 */ +#define FDCAN_TXBTO_TO30 ((uint32_t)0x40000000U) /* Transmission Occurred 30 */ +#define FDCAN_TXBTO_TO31 ((uint32_t)0x80000000U) /* Transmission Occurred 31 */ + +/** Bit definition for FDCAN_TXBCF register **/ +#define FDCAN_TXBCF_CF0 ((uint32_t)0x00000001U) /* Cancellation Finished 0 */ +#define FDCAN_TXBCF_CF1 ((uint32_t)0x00000002U) /* Cancellation Finished 1 */ +#define FDCAN_TXBCF_CF2 ((uint32_t)0x00000004U) /* Cancellation Finished 2 */ +#define FDCAN_TXBCF_CF3 ((uint32_t)0x00000008U) /* Cancellation Finished 3 */ +#define FDCAN_TXBCF_CF4 ((uint32_t)0x00000010U) /* Cancellation Finished 4 */ +#define FDCAN_TXBCF_CF5 ((uint32_t)0x00000020U) /* Cancellation Finished 5 */ +#define FDCAN_TXBCF_CF6 ((uint32_t)0x00000040U) /* Cancellation Finished 6 */ +#define FDCAN_TXBCF_CF7 ((uint32_t)0x00000080U) /* Cancellation Finished 7 */ +#define FDCAN_TXBCF_CF8 ((uint32_t)0x00000100U) /* Cancellation Finished 8 */ +#define FDCAN_TXBCF_CF9 ((uint32_t)0x00000200U) /* Cancellation Finished 9 */ +#define FDCAN_TXBCF_CF10 ((uint32_t)0x00000400U) /* Cancellation Finished 10 */ +#define FDCAN_TXBCF_CF11 ((uint32_t)0x00000800U) /* Cancellation Finished 11 */ +#define FDCAN_TXBCF_CF12 ((uint32_t)0x00001000U) /* Cancellation Finished 12 */ +#define FDCAN_TXBCF_CF13 ((uint32_t)0x00002000U) /* Cancellation Finished 13 */ +#define FDCAN_TXBCF_CF14 ((uint32_t)0x00004000U) /* Cancellation Finished 14 */ +#define FDCAN_TXBCF_CF15 ((uint32_t)0x00008000U) /* Cancellation Finished 15 */ +#define FDCAN_TXBCF_CF16 ((uint32_t)0x00010000U) /* Cancellation Finished 16 */ +#define FDCAN_TXBCF_CF17 ((uint32_t)0x00020000U) /* Cancellation Finished 17 */ +#define FDCAN_TXBCF_CF18 ((uint32_t)0x00040000U) /* Cancellation Finished 18 */ +#define FDCAN_TXBCF_CF19 ((uint32_t)0x00080000U) /* Cancellation Finished 19 */ +#define FDCAN_TXBCF_CF20 ((uint32_t)0x00100000U) /* Cancellation Finished 20 */ +#define FDCAN_TXBCF_CF21 ((uint32_t)0x00200000U) /* Cancellation Finished 21 */ +#define FDCAN_TXBCF_CF22 ((uint32_t)0x00400000U) /* Cancellation Finished 22 */ +#define FDCAN_TXBCF_CF23 ((uint32_t)0x00800000U) /* Cancellation Finished 23 */ +#define FDCAN_TXBCF_CF24 ((uint32_t)0x01000000U) /* Cancellation Finished 24 */ +#define FDCAN_TXBCF_CF25 ((uint32_t)0x02000000U) /* Cancellation Finished 25 */ +#define FDCAN_TXBCF_CF26 ((uint32_t)0x04000000U) /* Cancellation Finished 26 */ +#define FDCAN_TXBCF_CF27 ((uint32_t)0x08000000U) /* Cancellation Finished 27 */ +#define FDCAN_TXBCF_CF28 ((uint32_t)0x10000000U) /* Cancellation Finished 28 */ +#define FDCAN_TXBCF_CF29 ((uint32_t)0x20000000U) /* Cancellation Finished 29 */ +#define FDCAN_TXBCF_CF30 ((uint32_t)0x40000000U) /* Cancellation Finished 30 */ +#define FDCAN_TXBCF_CF31 ((uint32_t)0x80000000U) /* Cancellation Finished 31 */ + +/** Bit definition for FDCAN_TXBTIE register **/ +#define FDCAN_TXBTIE_TIE0 ((uint32_t)0x00000001U) /* Transmission Interrupt Enable 0 */ +#define FDCAN_TXBTIE_TIE1 ((uint32_t)0x00000002U) /* Transmission Interrupt Enable 1 */ +#define FDCAN_TXBTIE_TIE2 ((uint32_t)0x00000004U) /* Transmission Interrupt Enable 2 */ +#define FDCAN_TXBTIE_TIE3 ((uint32_t)0x00000008U) /* Transmission Interrupt Enable 3 */ +#define FDCAN_TXBTIE_TIE4 ((uint32_t)0x00000010U) /* Transmission Interrupt Enable 4 */ +#define FDCAN_TXBTIE_TIE5 ((uint32_t)0x00000020U) /* Transmission Interrupt Enable 5 */ +#define FDCAN_TXBTIE_TIE6 ((uint32_t)0x00000040U) /* Transmission Interrupt Enable 6 */ +#define FDCAN_TXBTIE_TIE7 ((uint32_t)0x00000080U) /* Transmission Interrupt Enable 7 */ +#define FDCAN_TXBTIE_TIE8 ((uint32_t)0x00000100U) /* Transmission Interrupt Enable 8 */ +#define FDCAN_TXBTIE_TIE9 ((uint32_t)0x00000200U) /* Transmission Interrupt Enable 9 */ +#define FDCAN_TXBTIE_TIE10 ((uint32_t)0x00000400U) /* Transmission Interrupt Enable 10 */ +#define FDCAN_TXBTIE_TIE11 ((uint32_t)0x00000800U) /* Transmission Interrupt Enable 11 */ +#define FDCAN_TXBTIE_TIE12 ((uint32_t)0x00001000U) /* Transmission Interrupt Enable 12 */ +#define FDCAN_TXBTIE_TIE13 ((uint32_t)0x00002000U) /* Transmission Interrupt Enable 13 */ +#define FDCAN_TXBTIE_TIE14 ((uint32_t)0x00004000U) /* Transmission Interrupt Enable 14 */ +#define FDCAN_TXBTIE_TIE15 ((uint32_t)0x00008000U) /* Transmission Interrupt Enable 15 */ +#define FDCAN_TXBTIE_TIE16 ((uint32_t)0x00010000U) /* Transmission Interrupt Enable 16 */ +#define FDCAN_TXBTIE_TIE17 ((uint32_t)0x00020000U) /* Transmission Interrupt Enable 17 */ +#define FDCAN_TXBTIE_TIE18 ((uint32_t)0x00040000U) /* Transmission Interrupt Enable 18 */ +#define FDCAN_TXBTIE_TIE19 ((uint32_t)0x00080000U) /* Transmission Interrupt Enable 19 */ +#define FDCAN_TXBTIE_TIE20 ((uint32_t)0x00100000U) /* Transmission Interrupt Enable 20 */ +#define FDCAN_TXBTIE_TIE21 ((uint32_t)0x00200000U) /* Transmission Interrupt Enable 21 */ +#define FDCAN_TXBTIE_TIE22 ((uint32_t)0x00400000U) /* Transmission Interrupt Enable 22 */ +#define FDCAN_TXBTIE_TIE23 ((uint32_t)0x00800000U) /* Transmission Interrupt Enable 23 */ +#define FDCAN_TXBTIE_TIE24 ((uint32_t)0x01000000U) /* Transmission Interrupt Enable 24 */ +#define FDCAN_TXBTIE_TIE25 ((uint32_t)0x02000000U) /* Transmission Interrupt Enable 25 */ +#define FDCAN_TXBTIE_TIE26 ((uint32_t)0x04000000U) /* Transmission Interrupt Enable 26 */ +#define FDCAN_TXBTIE_TIE27 ((uint32_t)0x08000000U) /* Transmission Interrupt Enable 27 */ +#define FDCAN_TXBTIE_TIE28 ((uint32_t)0x10000000U) /* Transmission Interrupt Enable 28 */ +#define FDCAN_TXBTIE_TIE29 ((uint32_t)0x20000000U) /* Transmission Interrupt Enable 29 */ +#define FDCAN_TXBTIE_TIE30 ((uint32_t)0x40000000U) /* Transmission Interrupt Enable 30 */ +#define FDCAN_TXBTIE_TIE31 ((uint32_t)0x80000000U) /* Transmission Interrupt Enable 31 */ + +/** Bit definition for TXBCIE register **/ +#define FDCAN_TXBCIE_CFIE0 ((uint32_t)0x00000001U) /* Cancellation Finished Interrupt Enable 0 */ +#define FDCAN_TXBCIE_CFIE1 ((uint32_t)0x00000002U) /* Cancellation Finished Interrupt Enable 1 */ +#define FDCAN_TXBCIE_CFIE2 ((uint32_t)0x00000004U) /* Cancellation Finished Interrupt Enable 2 */ +#define FDCAN_TXBCIE_CFIE3 ((uint32_t)0x00000008U) /* Cancellation Finished Interrupt Enable 3 */ +#define FDCAN_TXBCIE_CFIE4 ((uint32_t)0x00000010U) /* Cancellation Finished Interrupt Enable 4 */ +#define FDCAN_TXBCIE_CFIE5 ((uint32_t)0x00000020U) /* Cancellation Finished Interrupt Enable 5 */ +#define FDCAN_TXBCIE_CFIE6 ((uint32_t)0x00000040U) /* Cancellation Finished Interrupt Enable 6 */ +#define FDCAN_TXBCIE_CFIE7 ((uint32_t)0x00000080U) /* Cancellation Finished Interrupt Enable 7 */ +#define FDCAN_TXBCIE_CFIE8 ((uint32_t)0x00000100U) /* Cancellation Finished Interrupt Enable 8 */ +#define FDCAN_TXBCIE_CFIE9 ((uint32_t)0x00000200U) /* Cancellation Finished Interrupt Enable 9 */ +#define FDCAN_TXBCIE_CFIE10 ((uint32_t)0x00000400U) /* Cancellation Finished Interrupt Enable 10 */ +#define FDCAN_TXBCIE_CFIE11 ((uint32_t)0x00000800U) /* Cancellation Finished Interrupt Enable 11 */ +#define FDCAN_TXBCIE_CFIE12 ((uint32_t)0x00001000U) /* Cancellation Finished Interrupt Enable 12 */ +#define FDCAN_TXBCIE_CFIE13 ((uint32_t)0x00002000U) /* Cancellation Finished Interrupt Enable 13 */ +#define FDCAN_TXBCIE_CFIE14 ((uint32_t)0x00004000U) /* Cancellation Finished Interrupt Enable 14 */ +#define FDCAN_TXBCIE_CFIE15 ((uint32_t)0x00008000U) /* Cancellation Finished Interrupt Enable 15 */ +#define FDCAN_TXBCIE_CFIE16 ((uint32_t)0x00010000U) /* Cancellation Finished Interrupt Enable 16 */ +#define FDCAN_TXBCIE_CFIE17 ((uint32_t)0x00020000U) /* Cancellation Finished Interrupt Enable 17 */ +#define FDCAN_TXBCIE_CFIE18 ((uint32_t)0x00040000U) /* Cancellation Finished Interrupt Enable 18 */ +#define FDCAN_TXBCIE_CFIE19 ((uint32_t)0x00080000U) /* Cancellation Finished Interrupt Enable 19 */ +#define FDCAN_TXBCIE_CFIE20 ((uint32_t)0x00100000U) /* Cancellation Finished Interrupt Enable 20 */ +#define FDCAN_TXBCIE_CFIE21 ((uint32_t)0x00200000U) /* Cancellation Finished Interrupt Enable 21 */ +#define FDCAN_TXBCIE_CFIE22 ((uint32_t)0x00400000U) /* Cancellation Finished Interrupt Enable 22 */ +#define FDCAN_TXBCIE_CFIE23 ((uint32_t)0x00800000U) /* Cancellation Finished Interrupt Enable 23 */ +#define FDCAN_TXBCIE_CFIE24 ((uint32_t)0x01000000U) /* Cancellation Finished Interrupt Enable 24 */ +#define FDCAN_TXBCIE_CFIE25 ((uint32_t)0x02000000U) /* Cancellation Finished Interrupt Enable 25 */ +#define FDCAN_TXBCIE_CFIE26 ((uint32_t)0x04000000U) /* Cancellation Finished Interrupt Enable 26 */ +#define FDCAN_TXBCIE_CFIE27 ((uint32_t)0x08000000U) /* Cancellation Finished Interrupt Enable 27 */ +#define FDCAN_TXBCIE_CFIE28 ((uint32_t)0x10000000U) /* Cancellation Finished Interrupt Enable 28 */ +#define FDCAN_TXBCIE_CFIE29 ((uint32_t)0x20000000U) /* Cancellation Finished Interrupt Enable 29 */ +#define FDCAN_TXBCIE_CFIE30 ((uint32_t)0x40000000U) /* Cancellation Finished Interrupt Enable 30 */ +#define FDCAN_TXBCIE_CFIE31 ((uint32_t)0x80000000U) /* Cancellation Finished Interrupt Enable 31 */ + +/** Bit definition for FDCAN_TXEFC register **/ +#define FDCAN_TXEFC_EFSA ((uint32_t)0x0000FFFCU) /* Event FIFO Start Address */ +#define FDCAN_TXEFC_EFS ((uint32_t)0x003F0000U) /* Event FIFO Size bits */ +#define FDCAN_TXEFC_EFWM ((uint32_t)0x3F000000U) /* Event FIFO Watermark bits */ + +/** Bit definition for FDCAN_TXEFS register **/ +#define FDCAN_TXEFS_EFFL ((uint32_t)0x0000003FU) /* Event FIFO Fill Level bits */ +#define FDCAN_TXEFS_EFGI ((uint32_t)0x00001F00U) /* Event FIFO Get Index bits */ +#define FDCAN_TXEFS_EFPI ((uint32_t)0x001F0000U) /* Event FIFO Put Index bits */ +#define FDCAN_TXEFS_EFF ((uint32_t)0x01000000U) /* Event FIFO Full */ +#define FDCAN_TXEFS_TEFL ((uint32_t)0x02000000U) /* Tx Event FIFO Element Lost */ + +/** Bit definition for FDCAN_TXEFA register **/ +#define FDCAN_TXEFA_EFAI ((uint32_t)0x0000001FU) /* Event FIFO Acknowledge Index bits */ + +/** Bit definition for FDCAN_TTTMC register **/ +#define FDCAN_TTTMC_TME ((uint32_t)0x007F0000U) /* Trigger memory elements bits */ +#define FDCAN_TTTMC_TME_0 ((uint32_t)0x00010000U) /* Trigger memory elements bits 0 */ +#define FDCAN_TTTMC_TME_1 ((uint32_t)0x00020000U) /* Trigger memory elements bits 1 */ +#define FDCAN_TTTMC_TME_2 ((uint32_t)0x00040000U) /* Trigger memory elements bits 2 */ +#define FDCAN_TTTMC_TME_3 ((uint32_t)0x00080000U) /* Trigger memory elements bits 3 */ +#define FDCAN_TTTMC_TME_4 ((uint32_t)0x00100000U) /* Trigger memory elements bits 4 */ +#define FDCAN_TTTMC_TME_5 ((uint32_t)0x00200000U) /* Trigger memory elements bits 5 */ +#define FDCAN_TTTMC_TME_6 ((uint32_t)0x00400000U) /* Trigger memory elements bits 6 */ + +#define FDCAN_TTTMC_TMSA ((uint32_t)0x0000FFFCU) /* Trigger memory start address bits */ + +/** Bit definition for FDCAN_TTRMC register **/ +#define FDCAN_TTRMC_RMPS ((uint32_t)0x80000000U) /* Reference message Payload select bit */ +#define FDCAN_TTRMC_XTD ((uint32_t)0x40000000U) /* Extended identifier bit */ + +#define FDCAN_TTRMC_RID ((uint32_t)0x1FFFFFFFU) /* Reference identifier Bits */ +#define FDCAN_TTRMC_RID_0 ((uint32_t)0x00000001U) /* Reference identifier Bit0 */ +#define FDCAN_TTRMC_RID_1 ((uint32_t)0x00000002U) /* Reference identifier Bit1 */ +#define FDCAN_TTRMC_RID_2 ((uint32_t)0x00000004U) /* Reference identifier Bit2 */ +#define FDCAN_TTRMC_RID_3 ((uint32_t)0x00000008U) /* Reference identifier Bit3 */ +#define FDCAN_TTRMC_RID_4 ((uint32_t)0x00000010U) /* Reference identifier Bit4 */ +#define FDCAN_TTRMC_RID_5 ((uint32_t)0x00000020U) /* Reference identifier Bit5 */ +#define FDCAN_TTRMC_RID_6 ((uint32_t)0x00000040U) /* Reference identifier Bit6 */ +#define FDCAN_TTRMC_RID_7 ((uint32_t)0x00000080U) /* Reference identifier Bit7 */ +#define FDCAN_TTRMC_RID_8 ((uint32_t)0x00000100U) /* Reference identifier Bit8 */ +#define FDCAN_TTRMC_RID_9 ((uint32_t)0x00000200U) /* Reference identifier Bit9 */ +#define FDCAN_TTRMC_RID_10 ((uint32_t)0x00000400U) /* Reference identifier Bit10 */ +#define FDCAN_TTRMC_RID_11 ((uint32_t)0x00000800U) /* Reference identifier Bit11 */ +#define FDCAN_TTRMC_RID_12 ((uint32_t)0x00001000U) /* Reference identifier Bit12 */ +#define FDCAN_TTRMC_RID_13 ((uint32_t)0x00002000U) /* Reference identifier Bit13 */ +#define FDCAN_TTRMC_RID_14 ((uint32_t)0x00004000U) /* Reference identifier Bit14 */ +#define FDCAN_TTRMC_RID_15 ((uint32_t)0x00008000U) /* Reference identifier Bit15 */ +#define FDCAN_TTRMC_RID_16 ((uint32_t)0x00010000U) /* Reference identifier Bit16 */ +#define FDCAN_TTRMC_RID_17 ((uint32_t)0x00020000U) /* Reference identifier Bit17 */ +#define FDCAN_TTRMC_RID_18 ((uint32_t)0x00040000U) /* Reference identifier Bit18 */ +#define FDCAN_TTRMC_RID_19 ((uint32_t)0x00080000U) /* Reference identifier Bit19 */ +#define FDCAN_TTRMC_RID_20 ((uint32_t)0x00100000U) /* Reference identifier Bit20 */ +#define FDCAN_TTRMC_RID_21 ((uint32_t)0x00200000U) /* Reference identifier Bit21 */ +#define FDCAN_TTRMC_RID_22 ((uint32_t)0x00400000U) /* Reference identifier Bit22 */ +#define FDCAN_TTRMC_RID_23 ((uint32_t)0x00800000U) /* Reference identifier Bit23 */ +#define FDCAN_TTRMC_RID_24 ((uint32_t)0x01000000U) /* Reference identifier Bit24 */ +#define FDCAN_TTRMC_RID_25 ((uint32_t)0x02000000U) /* Reference identifier Bit25 */ +#define FDCAN_TTRMC_RID_26 ((uint32_t)0x04000000U) /* Reference identifier Bit26 */ +#define FDCAN_TTRMC_RID_27 ((uint32_t)0x08000000U) /* Reference identifier Bit27 */ +#define FDCAN_TTRMC_RID_28 ((uint32_t)0x10000000U) /* Reference identifier Bit28 */ + +/** Bit definition for FDCAN_TTOCF register **/ +#define FDCAN_TTOCF_EVTP ((uint32_t)0x04000000U) /* Event trigger polarity bit */ +#define FDCAN_TTOCF_ECC ((uint32_t)0x02000000U) /* Enable clock calibration bit */ +#define FDCAN_TTOCF_EGTF ((uint32_t)0x01000000U) /* Enable global time Filtering bit */ + +#define FDCAN_TTOCF_AWL ((uint32_t)0x00FF0000U) /* Application watchdog limit bits */ +#define FDCAN_TTOCF_AWL_0 ((uint32_t)0x00010000U) /* Application watchdog limit bit 0 */ +#define FDCAN_TTOCF_AWL_1 ((uint32_t)0x00020000U) /* Application watchdog limit bit 1 */ +#define FDCAN_TTOCF_AWL_2 ((uint32_t)0x00040000U) /* Application watchdog limit bit 2 */ +#define FDCAN_TTOCF_AWL_3 ((uint32_t)0x00080000U) /* Application watchdog limit bit 3 */ +#define FDCAN_TTOCF_AWL_4 ((uint32_t)0x00100000U) /* Application watchdog limit bit 4 */ +#define FDCAN_TTOCF_AWL_5 ((uint32_t)0x00200000U) /* Application watchdog limit bit 5 */ +#define FDCAN_TTOCF_AWL_6 ((uint32_t)0x00400000U) /* Application watchdog limit bit 6 */ +#define FDCAN_TTOCF_AWL_7 ((uint32_t)0x00800000U) /* Application watchdog limit bit 7 */ + +#define FDCAN_TTOCF_EECS ((uint32_t)0x00008000U) /* Enable external clock synchronization bit */ + +#define FDCAN_TTOCF_IRTO ((uint32_t)0x00007F00U) /* Initial reference trigger offset bits */ +#define FDCAN_TTOCF_IRTO_0 ((uint32_t)0x00000100U) /* Initial reference trigger offset bit 0 */ +#define FDCAN_TTOCF_IRTO_1 ((uint32_t)0x00000200U) /* Initial reference trigger offset bit 1 */ +#define FDCAN_TTOCF_IRTO_2 ((uint32_t)0x00000400U) /* Initial reference trigger offset bit 2 */ +#define FDCAN_TTOCF_IRTO_3 ((uint32_t)0x00000800U) /* Initial reference trigger offset bit 3 */ +#define FDCAN_TTOCF_IRTO_4 ((uint32_t)0x00001000U) /* Initial reference trigger offset bit 4 */ +#define FDCAN_TTOCF_IRTO_5 ((uint32_t)0x00002000U) /* Initial reference trigger offset bit 5 */ +#define FDCAN_TTOCF_IRTO_6 ((uint32_t)0x00004000U) /* Initial reference trigger offset bit 6 */ + +#define FDCAN_TTOCF_LDSDL ((uint32_t)0x000000E0U) /* LD of synchronization deviation limit bits */ +#define FDCAN_TTOCF_LDSDL_0 ((uint32_t)0x00000020U) /* LD of synchronization deviation limit bit0 */ +#define FDCAN_TTOCF_LDSDL_1 ((uint32_t)0x00000040U) /* LD of synchronization deviation limit bit1 */ +#define FDCAN_TTOCF_LDSDL_2 ((uint32_t)0x00000080U) /* LD of synchronization deviation limit bit2 */ + +#define FDCAN_TTOCF_TM ((uint32_t)0x00000010U) /* Time master bit */ +#define FDCAN_TTOCF_GEN ((uint32_t)0x00000008U) /* Gap enable bit */ + +#define FDCAN_TTOCF_OM ((uint32_t)0x00000003U) /* Operation mode bits */ +#define FDCAN_TTOCF_OM_EVENT ((uint32_t)0x00000000U) /* Event driven CAN communication, default */ +#define FDCAN_TTOCF_OM_LEVEL1 ((uint32_t)0x00000001U) /* TTCAN Level 1 */ +#define FDCAN_TTOCF_OM_LEVEL2 ((uint32_t)0x00000002U) /* TTCAN Level 2 */ +#define FDCAN_TTOCF_OM_LEVEL0 ((uint32_t)0x00000003U) /* TTCAN Level 0 */ + +/** Bit definition for FDCAN_TTMLM register **/ +#define FDCAN_TTMLM_ENTT ((uint32_t)0x0FFF0000U) /* Expected Number of Tx triggers bits */ +#define FDCAN_TTMLM_ENTT_0 ((uint32_t)0x00010000U) /* Expected Number of Tx triggers bit 0 */ +#define FDCAN_TTMLM_ENTT_1 ((uint32_t)0x00020000U) /* Expected Number of Tx triggers bit 1 */ +#define FDCAN_TTMLM_ENTT_2 ((uint32_t)0x00040000U) /* Expected Number of Tx triggers bit 2 */ +#define FDCAN_TTMLM_ENTT_3 ((uint32_t)0x00080000U) /* Expected Number of Tx triggers bit 3 */ +#define FDCAN_TTMLM_ENTT_4 ((uint32_t)0x00100000U) /* Expected Number of Tx triggers bit 4 */ +#define FDCAN_TTMLM_ENTT_5 ((uint32_t)0x00200000U) /* Expected Number of Tx triggers bit 5 */ +#define FDCAN_TTMLM_ENTT_6 ((uint32_t)0x00400000U) /* Expected Number of Tx triggers bit 6 */ +#define FDCAN_TTMLM_ENTT_7 ((uint32_t)0x00800000U) /* Expected Number of Tx triggers bit 7 */ +#define FDCAN_TTMLM_ENTT_8 ((uint32_t)0x01000000U) /* Expected Number of Tx triggers bit 8 */ +#define FDCAN_TTMLM_ENTT_9 ((uint32_t)0x02000000U) /* Expected Number of Tx triggers bit 9 */ +#define FDCAN_TTMLM_ENTT_10 ((uint32_t)0x04000000U) /* Expected Number of Tx triggers bit 10 */ +#define FDCAN_TTMLM_ENTT_11 ((uint32_t)0x08000000U) /* Expected Number of Tx triggers bit 11 */ + +#define FDCAN_TTMLM_TXEW ((uint32_t)0x00000F00U) /* Tx enable Window bits */ +#define FDCAN_TTMLM_TXEW_0 ((uint32_t)0x00000100U) /* Tx enable Window bit 0 */ +#define FDCAN_TTMLM_TXEW_1 ((uint32_t)0x00000200U) /* Tx enable Window bit 1 */ +#define FDCAN_TTMLM_TXEW_2 ((uint32_t)0x00000400U) /* Tx enable Window bit 2 */ +#define FDCAN_TTMLM_TXEW_3 ((uint32_t)0x00000800U) /* Tx enable Window bit 3 */ + +#define FDCAN_TTMLM_CSS ((uint32_t)0x000000C0U) /* Cycle start synchronization bits */ +#define FDCAN_TTMLM_CSS_NONE ((uint32_t)0x00000000U) /* No synchronization pulse */ +#define FDCAN_TTMLM_CSS_BASIC ((uint32_t)0x00000040U) /* Synchronization pulse at the beginning of the basic cycle */ +#define FDCAN_TTMLM_CSS_MATRIX ((uint32_t)0x00000080U) /* Synchronization pulse at the beginning of the matrix cycle */ + +#define FDCAN_TTMLM_CCM ((uint32_t)0x0000003FU) /* Cycle count Max bits */ +#define FDCAN_TTMLM_CCM_NUM1 ((uint32_t)0x00000000U) /* 1 basic cycle per matrix cycle */ +#define FDCAN_TTMLM_CCM_NUM2 ((uint32_t)0x00000001U) /* 2 basic cycle per matrix cycle */ +#define FDCAN_TTMLM_CCM_NUM4 ((uint32_t)0x00000003U) /* 4 basic cycle per matrix cycle */ +#define FDCAN_TTMLM_CCM_NUM8 ((uint32_t)0x00000007U) /* 8 basic cycle per matrix cycle */ +#define FDCAN_TTMLM_CCM_NUM16 ((uint32_t)0x0000000FU) /* 16 basic cycle per matrix cycle */ +#define FDCAN_TTMLM_CCM_NUM32 ((uint32_t)0x0000001FU) /* 32 basic cycle per matrix cycle */ +#define FDCAN_TTMLM_CCM_NUM64 ((uint32_t)0x0000003FU) /* 64 basic cycle per matrix cycle */ + +/** Bit definition for FDCAN_TURCF register **/ +#define FDCAN_TURCF_ELT ((uint32_t)0x80000000U) /* Enable local time bit */ + +#define FDCAN_TURCF_DC ((uint32_t)0x3FFF0000U) /* Denominator configuration bits */ +#define FDCAN_TURCF_DC_0 ((uint32_t)0x00010000U) /* Denominator configuration bit0 */ +#define FDCAN_TURCF_DC_1 ((uint32_t)0x00020000U) /* Denominator configuration bit1 */ +#define FDCAN_TURCF_DC_2 ((uint32_t)0x00040000U) /* Denominator configuration bit2 */ +#define FDCAN_TURCF_DC_3 ((uint32_t)0x00080000U) /* Denominator configuration bit3 */ +#define FDCAN_TURCF_DC_4 ((uint32_t)0x00100000U) /* Denominator configuration bit4 */ +#define FDCAN_TURCF_DC_5 ((uint32_t)0x00200000U) /* Denominator configuration bit5 */ +#define FDCAN_TURCF_DC_6 ((uint32_t)0x00400000U) /* Denominator configuration bit6 */ +#define FDCAN_TURCF_DC_7 ((uint32_t)0x00800000U) /* Denominator configuration bit7 */ +#define FDCAN_TURCF_DC_8 ((uint32_t)0x01000000U) /* Denominator configuration bit8 */ +#define FDCAN_TURCF_DC_9 ((uint32_t)0x02000000U) /* Denominator configuration bit9 */ +#define FDCAN_TURCF_DC_10 ((uint32_t)0x04000000U) /* Denominator configuration bit10 */ +#define FDCAN_TURCF_DC_11 ((uint32_t)0x08000000U) /* Denominator configuration bit11 */ +#define FDCAN_TURCF_DC_12 ((uint32_t)0x10000000U) /* Denominator configuration bit12 */ +#define FDCAN_TURCF_DC_13 ((uint32_t)0x20000000U) /* Denominator configuration bit13 */ + +#define FDCAN_TURCF_NCL ((uint32_t)0x0000FFFFU) /* Numerator configuration low bits */ +#define FDCAN_TURCF_NCL_0 ((uint32_t)0x00000001U) /* Numerator configuration low bit0 */ +#define FDCAN_TURCF_NCL_1 ((uint32_t)0x00000002U) /* Numerator configuration low bit1 */ +#define FDCAN_TURCF_NCL_2 ((uint32_t)0x00000004U) /* Numerator configuration low bit2 */ +#define FDCAN_TURCF_NCL_3 ((uint32_t)0x00000008U) /* Numerator configuration low bit3 */ +#define FDCAN_TURCF_NCL_4 ((uint32_t)0x00000010U) /* Numerator configuration low bit4 */ +#define FDCAN_TURCF_NCL_5 ((uint32_t)0x00000020U) /* Numerator configuration low bit5 */ +#define FDCAN_TURCF_NCL_6 ((uint32_t)0x00000040U) /* Numerator configuration low bit6 */ +#define FDCAN_TURCF_NCL_7 ((uint32_t)0x00000080U) /* Numerator configuration low bit7 */ +#define FDCAN_TURCF_NCL_8 ((uint32_t)0x00000100U) /* Numerator configuration low bit8 */ +#define FDCAN_TURCF_NCL_9 ((uint32_t)0x00000200U) /* Numerator configuration low bit9 */ +#define FDCAN_TURCF_NCL_10 ((uint32_t)0x00000400U) /* Numerator configuration low bit10 */ +#define FDCAN_TURCF_NCL_11 ((uint32_t)0x00000800U) /* Numerator configuration low bit11 */ +#define FDCAN_TURCF_NCL_12 ((uint32_t)0x00001000U) /* Numerator configuration low bit12 */ +#define FDCAN_TURCF_NCL_13 ((uint32_t)0x00002000U) /* Numerator configuration low bit13 */ +#define FDCAN_TURCF_NCL_14 ((uint32_t)0x00004000U) /* Numerator configuration low bit14 */ +#define FDCAN_TURCF_NCL_15 ((uint32_t)0x00008000U) /* Numerator configuration low bit15 */ + +/** Bit definition for FDCAN_TTOCN register **/ +#define FDCAN_TTOCN_LCKC ((uint32_t)0x00008000U) /* TT operation control register Locked bit */ +#define FDCAN_TTOCN_ESCN ((uint32_t)0x00002000U) /* External synchronization control bit */ +#define FDCAN_TTOCN_NIG ((uint32_t)0x00001000U) /* Next is Gap bit */ +#define FDCAN_TTOCN_TMG ((uint32_t)0x00000800U) /* Time mark Gap bit */ +#define FDCAN_TTOCN_FGP ((uint32_t)0x00000400U) /* Finish Gap bit */ +#define FDCAN_TTOCN_GCS ((uint32_t)0x00000200U) /* Gap control select bit */ +#define FDCAN_TTOCN_TTIE ((uint32_t)0x00000100U) /* Trigger time mark interrupt pulse enable bit */ + +#define FDCAN_TTOCN_TMC ((uint32_t)0x000000C0U) /* Register time mark Compare bits */ +#define FDCAN_TTOCN_TMC_NONE ((uint32_t)0x00000000U) /* Register time stamp interrupt not generated */ +#define FDCAN_TTOCN_TMC_BASIC ((uint32_t)0x00000040U) /* If time stamp = cycle time, a register time stamp interrupt is generated */ +#define FDCAN_TTOCN_TMC_LOCAL ((uint32_t)0x00000080U) /* If time stamp = local time, a register time stamp interrupt is generated */ +#define FDCAN_TTOCN_TMC_GLOBAL ((uint32_t)0x000000C0U) /* If time stamp = global time, a register time stamp interrupt is generated */ + +#define FDCAN_TTOCN_RTIE ((uint32_t)0x00000020U) /* Register time mark interrupt pulse enable */ + +#define FDCAN_TTOCN_SWS ((uint32_t)0x00000018U) /* Stop watch source bits */ +#define FDCAN_TTOCN_SWS_STOP ((uint32_t)0x00000000U) /* Stop Monitor Disable */ +#define FDCAN_TTOCN_SWS_CYCLE ((uint32_t)0x00000008U) /* The actual value of the cycle time is copied to FDCAN_TTCPT.SWV */ +#define FDCAN_TTOCN_SWS_LOCAL ((uint32_t)0x00000010U) /* The actual value of the local time is copied to FDCAN_TTCPT.SWV */ +#define FDCAN_TTOCN_SWS_GLOBAL ((uint32_t)0x00000018U) /* The actual value of the global time is copied to FDCAN_TTCPT.SWV */ + +#define FDCAN_TTOCN_SWP ((uint32_t)0x00000004U) /* Stop watch polarity bit */ +#define FDCAN_TTOCN_ECS ((uint32_t)0x00000002U) /* External clock synchronization bit */ +#define FDCAN_TTOCN_SGT ((uint32_t)0x00000001U) /* Set global time bit */ + +/** Bit definition for FDCAN_TTGTP register **/ +#define FDCAN_TTGTP_CTP ((uint32_t)0xFFFF0000U) /* Cycle time target phase bits */ +#define FDCAN_TTGTP_CTP_0 ((uint32_t)0x00010000U) /* Cycle time target phase bit0 */ +#define FDCAN_TTGTP_CTP_1 ((uint32_t)0x00020000U) /* Cycle time target phase bit1 */ +#define FDCAN_TTGTP_CTP_2 ((uint32_t)0x00040000U) /* Cycle time target phase bit2 */ +#define FDCAN_TTGTP_CTP_3 ((uint32_t)0x00080000U) /* Cycle time target phase bit3 */ +#define FDCAN_TTGTP_CTP_4 ((uint32_t)0x00100000U) /* Cycle time target phase bit4 */ +#define FDCAN_TTGTP_CTP_5 ((uint32_t)0x00200000U) /* Cycle time target phase bit5 */ +#define FDCAN_TTGTP_CTP_6 ((uint32_t)0x00400000U) /* Cycle time target phase bit6 */ +#define FDCAN_TTGTP_CTP_7 ((uint32_t)0x00800000U) /* Cycle time target phase bit7 */ +#define FDCAN_TTGTP_CTP_8 ((uint32_t)0x01000000U) /* Cycle time target phase bit8 */ +#define FDCAN_TTGTP_CTP_9 ((uint32_t)0x02000000U) /* Cycle time target phase bit9 */ +#define FDCAN_TTGTP_CTP_10 ((uint32_t)0x04000000U) /* Cycle time target phase bit10 */ +#define FDCAN_TTGTP_CTP_11 ((uint32_t)0x08000000U) /* Cycle time target phase bit11 */ +#define FDCAN_TTGTP_CTP_12 ((uint32_t)0x10000000U) /* Cycle time target phase bit12 */ +#define FDCAN_TTGTP_CTP_13 ((uint32_t)0x20000000U) /* Cycle time target phase bit13 */ +#define FDCAN_TTGTP_CTP_14 ((uint32_t)0x40000000U) /* Cycle time target phase bit14 */ +#define FDCAN_TTGTP_CTP_15 ((uint32_t)0x80000000U) /* Cycle time target phase bit15 */ + +#define FDCAN_TTGTP_TP ((uint32_t)0x0000FFFFU) /* Time Preset bits */ +#define FDCAN_TTGTP_TP_0 ((uint32_t)0x00000001U) /* Time Preset bit0 */ +#define FDCAN_TTGTP_TP_1 ((uint32_t)0x00000002U) /* Time Preset bit1 */ +#define FDCAN_TTGTP_TP_2 ((uint32_t)0x00000004U) /* Time Preset bit2 */ +#define FDCAN_TTGTP_TP_3 ((uint32_t)0x00000008U) /* Time Preset bit3 */ +#define FDCAN_TTGTP_TP_4 ((uint32_t)0x00000010U) /* Time Preset bit4 */ +#define FDCAN_TTGTP_TP_5 ((uint32_t)0x00000020U) /* Time Preset bit5 */ +#define FDCAN_TTGTP_TP_6 ((uint32_t)0x00000040U) /* Time Preset bit6 */ +#define FDCAN_TTGTP_TP_7 ((uint32_t)0x00000080U) /* Time Preset bit7 */ +#define FDCAN_TTGTP_TP_8 ((uint32_t)0x00000100U) /* Time Preset bit8 */ +#define FDCAN_TTGTP_TP_9 ((uint32_t)0x00000200U) /* Time Preset bit9 */ +#define FDCAN_TTGTP_TP_10 ((uint32_t)0x00000400U) /* Time Preset bit10 */ +#define FDCAN_TTGTP_TP_11 ((uint32_t)0x00000800U) /* Time Preset bit11 */ +#define FDCAN_TTGTP_TP_12 ((uint32_t)0x00001000U) /* Time Preset bit12 */ +#define FDCAN_TTGTP_TP_13 ((uint32_t)0x00002000U) /* Time Preset bit13 */ +#define FDCAN_TTGTP_TP_14 ((uint32_t)0x00004000U) /* Time Preset bit14 */ +#define FDCAN_TTGTP_TP_15 ((uint32_t)0x00008000U) /* Time Preset bit15 */ + +/** Bit definition for FDCAN_TTTMK register **/ +#define FDCAN_TTTMK_LCKM ((uint32_t)0x80000000U) /* TT time mark register Locked */ + +#define FDCAN_TTTMK_TICC ((uint32_t)0x007F0000U) /* Time mark cycle code bits */ +#define FDCAN_TTTMK_TICC_0 ((uint32_t)0x00010000U) /* Time mark cycle code bit 0 */ +#define FDCAN_TTTMK_TICC_1 ((uint32_t)0x00020000U) /* Time mark cycle code bit 1 */ +#define FDCAN_TTTMK_TICC_2 ((uint32_t)0x00040000U) /* Time mark cycle code bit 2 */ +#define FDCAN_TTTMK_TICC_3 ((uint32_t)0x00080000U) /* Time mark cycle code bit 3 */ +#define FDCAN_TTTMK_TICC_4 ((uint32_t)0x00100000U) /* Time mark cycle code bit 4 */ +#define FDCAN_TTTMK_TICC_5 ((uint32_t)0x00200000U) /* Time mark cycle code bit 5 */ +#define FDCAN_TTTMK_TICC_6 ((uint32_t)0x00400000U) /* Time mark cycle code bit 6 */ + +#define FDCAN_TTTMK_TM ((uint32_t)0x0000FFFFU) /* Time mark bits */ +#define FDCAN_TTTMK_TM_0 ((uint32_t)0x00000001U) /* Time mark bit0 */ +#define FDCAN_TTTMK_TM_1 ((uint32_t)0x00000002U) /* Time mark bit1 */ +#define FDCAN_TTTMK_TM_2 ((uint32_t)0x00000004U) /* Time mark bit2 */ +#define FDCAN_TTTMK_TM_3 ((uint32_t)0x00000008U) /* Time mark bit3 */ +#define FDCAN_TTTMK_TM_4 ((uint32_t)0x00000010U) /* Time mark bit4 */ +#define FDCAN_TTTMK_TM_5 ((uint32_t)0x00000020U) /* Time mark bit5 */ +#define FDCAN_TTTMK_TM_6 ((uint32_t)0x00000040U) /* Time mark bit6 */ +#define FDCAN_TTTMK_TM_7 ((uint32_t)0x00000080U) /* Time mark bit7 */ +#define FDCAN_TTTMK_TM_8 ((uint32_t)0x00000100U) /* Time mark bit8 */ +#define FDCAN_TTTMK_TM_9 ((uint32_t)0x00000200U) /* Time mark bit9 */ +#define FDCAN_TTTMK_TM_10 ((uint32_t)0x00000400U) /* Time mark bit10 */ +#define FDCAN_TTTMK_TM_11 ((uint32_t)0x00000800U) /* Time mark bit11 */ +#define FDCAN_TTTMK_TM_12 ((uint32_t)0x00001000U) /* Time mark bit12 */ +#define FDCAN_TTTMK_TM_13 ((uint32_t)0x00002000U) /* Time mark bit13 */ +#define FDCAN_TTTMK_TM_14 ((uint32_t)0x00004000U) /* Time mark bit14 */ +#define FDCAN_TTTMK_TM_15 ((uint32_t)0x00008000U) /* Time mark bit15 */ + +/** Bit definition for FDCAN_TTIR register **/ +#define FDCAN_TTIR_CER ((uint32_t)0x00040000U) /* Configuration error bit */ +#define FDCAN_TTIR_AW ((uint32_t)0x00020000U) /* Application watchdog bit */ +#define FDCAN_TTIR_WT ((uint32_t)0x00010000U) /* Watch trigger bit */ +#define FDCAN_TTIR_IWT ((uint32_t)0x00008000U) /* Initialization watch trigger bit */ +#define FDCAN_TTIR_ELC ((uint32_t)0x00004000U) /* Error level Changed bit */ +#define FDCAN_TTIR_SE2 ((uint32_t)0x00002000U) /* Scheduling error 2 bit */ +#define FDCAN_TTIR_SE1 ((uint32_t)0x00001000U) /* Scheduling error 1 bit */ +#define FDCAN_TTIR_TXO ((uint32_t)0x00000800U) /* Tx count overflow bit */ +#define FDCAN_TTIR_TXU ((uint32_t)0x00000400U) /* Tx count underflow bit */ +#define FDCAN_TTIR_GTE ((uint32_t)0x00000200U) /* Global time error bit */ +#define FDCAN_TTIR_GTD ((uint32_t)0x00000100U) /* Global time discontinuity bit */ +#define FDCAN_TTIR_GTW ((uint32_t)0x00000080U) /* Global time wrap bit */ +#define FDCAN_TTIR_SWE ((uint32_t)0x00000040U) /* Stop watch event bit */ +#define FDCAN_TTIR_TTMI ((uint32_t)0x00000020U) /* Trigger time mark event internal bit */ +#define FDCAN_TTIR_RTMI ((uint32_t)0x00000010U) /* Register time mark interrupt bit */ +#define FDCAN_TTIR_SOG ((uint32_t)0x00000008U) /* Start of Gap bit */ +#define FDCAN_TTIR_CSM ((uint32_t)0x00000004U) /* Change of synchronization mode bit */ +#define FDCAN_TTIR_SMC ((uint32_t)0x00000002U) /* Start of matrix cycle bit */ +#define FDCAN_TTIR_SBC ((uint32_t)0x00000001U) /* Start of basic cycle bit */ + +/** Bit definition for FDCAN_TTIE register **/ +#define FDCAN_TTIE_CERE ((uint32_t)0x00040000U) /* Configuration error interrupt enable bit */ +#define FDCAN_TTIE_AWE ((uint32_t)0x00020000U) /* Application watchdog interrupt enable bit */ +#define FDCAN_TTIE_WTE ((uint32_t)0x00010000U) /* Watch trigger interrupt enable bit */ +#define FDCAN_TTIE_IWTE ((uint32_t)0x00008000U) /* Initialization watch trigger interrupt enable bit */ +#define FDCAN_TTIE_ELCE ((uint32_t)0x00004000U) /* Change error level interrupt enable bit */ +#define FDCAN_TTIE_SE2E ((uint32_t)0x00002000U) /* Scheduling error 2 interrupt enable bit */ +#define FDCAN_TTIE_SE1E ((uint32_t)0x00001000U) /* Scheduling error 1 interrupt enable bit */ +#define FDCAN_TTIE_TXOE ((uint32_t)0x00000800U) /* Tx count overflow interrupt enable bit */ +#define FDCAN_TTIE_TXUE ((uint32_t)0x00000400U) /* Tx count underflow interrupt enable bit */ +#define FDCAN_TTIE_GTEE ((uint32_t)0x00000200U) /* Global time error interrupt enable bit */ +#define FDCAN_TTIE_GTDE ((uint32_t)0x00000100U) /* Global time discontinuity interrupt enable bit */ +#define FDCAN_TTIE_GTWE ((uint32_t)0x00000080U) /* Global time wrap interrupt enable bit */ +#define FDCAN_TTIE_SWEE ((uint32_t)0x00000040U) /* Stop watch event interrupt enable bit */ +#define FDCAN_TTIE_TTMIE ((uint32_t)0x00000020U) /* Trigger time mark event internal interrupt enable bit */ +#define FDCAN_TTIE_RTMIE ((uint32_t)0x00000010U) /* Register time mark interrupt enable bit */ +#define FDCAN_TTIE_SOGE ((uint32_t)0x00000008U) /* Start of gap interrupt enable bit */ +#define FDCAN_TTIE_CSME ((uint32_t)0x00000004U) /* Change of synchronization mode interrupt enable bit */ +#define FDCAN_TTIE_SMCE ((uint32_t)0x00000002U) /* Start of matrix cycle interrupt enable bit */ +#define FDCAN_TTIE_SBCE ((uint32_t)0x00000001U) /* Start of basic cycle interrupt enable bit */ + +/** Bit definition for FDCAN_TTILS register **/ +#define FDCAN_TTILS_CERL ((uint32_t)0x00040000U) /* Configuration error interrupt Line bit */ +#define FDCAN_TTILS_AWL ((uint32_t)0x00020000U) /* Application watchdog interrupt Line bit */ +#define FDCAN_TTILS_WTL ((uint32_t)0x00010000U) /* Watch trigger interrupt Line bit */ +#define FDCAN_TTILS_IWTL ((uint32_t)0x00008000U) /* Initialization watch trigger interrupt Line bit */ +#define FDCAN_TTILS_ELCL ((uint32_t)0x00004000U) /* Change error level interrupt Line bit */ +#define FDCAN_TTILS_SE2L ((uint32_t)0x00002000U) /* Scheduling error 2 interrupt Line bit */ +#define FDCAN_TTILS_SE1L ((uint32_t)0x00001000U) /* Scheduling error 1 interrupt Line bit */ +#define FDCAN_TTILS_TXOL ((uint32_t)0x00000800U) /* Tx count overflow interrupt Line bit */ +#define FDCAN_TTILS_TXUL ((uint32_t)0x00000400U) /* Tx count underflow interrupt Line bit */ +#define FDCAN_TTILS_GTEL ((uint32_t)0x00000200U) /* Global time error interrupt Line bit */ +#define FDCAN_TTILS_GTDL ((uint32_t)0x00000100U) /* Global time discontinuity interrupt Line bit */ +#define FDCAN_TTILS_GTWL ((uint32_t)0x00000080U) /* Global time wrap interrupt Line bit */ +#define FDCAN_TTILS_SWEL ((uint32_t)0x00000040U) /* Stop watch event interrupt Line bit */ +#define FDCAN_TTILS_TTMIL ((uint32_t)0x00000020U) /* Trigger time mark event internal interrupt Line bit */ +#define FDCAN_TTILS_RTMIL ((uint32_t)0x00000010U) /* Register time mark interrupt Line bit */ +#define FDCAN_TTILS_SOGL ((uint32_t)0x00000008U) /* Start of gap interrupt Line bit */ +#define FDCAN_TTILS_CSML ((uint32_t)0x00000004U) /* Change of synchronization mode interrupt Line bit */ +#define FDCAN_TTILS_SMCL ((uint32_t)0x00000002U) /* Start of matrix cycle interrupt Line bit */ +#define FDCAN_TTILS_SBCL ((uint32_t)0x00000001U) /* Start of basic cycle interrupt Line bit */ + +/** Bit definition for FDCAN_TTOST register **/ +#define FDCAN_TTOST_SPL ((uint32_t)0x80000000U) /* Schedule phase lock bit */ +#define FDCAN_TTOST_WECS ((uint32_t)0x40000000U) /* Wait for external clock synchronization bit */ +#define FDCAN_TTOST_AWE ((uint32_t)0x20000000U) /* Application watchdog event bit */ +#define FDCAN_TTOST_WFE ((uint32_t)0x10000000U) /* Wait for event bit */ +#define FDCAN_TTOST_GSI ((uint32_t)0x08000000U) /* Gap started Indicator bit */ + +#define FDCAN_TTOST_TMP ((uint32_t)0x07000000U) /* Time master priority bits */ +#define FDCAN_TTOST_TMP_0 ((uint32_t)0x01000000U) /* Time master priority bit0 */ +#define FDCAN_TTOST_TMP_1 ((uint32_t)0x02000000U) /* Time master priority bit1 */ +#define FDCAN_TTOST_TMP_2 ((uint32_t)0x04000000U) /* Time master priority bit2 */ + +#define FDCAN_TTOST_GFI ((uint32_t)0x00800000U) /* Gap finished Indicator bit */ +#define FDCAN_TTOST_WGTD ((uint32_t)0x00400000U) /* Wait for global time discontinuity bits */ + +#define FDCAN_TTOST_RTO ((uint32_t)0x0000FF00U) /* Reference trigger offset bits */ +#define FDCAN_TTOST_RTO_0 ((uint32_t)0x00000100U) /* Reference trigger offset bit0 */ +#define FDCAN_TTOST_RTO_1 ((uint32_t)0x00000200U) /* Reference trigger offset bit1 */ +#define FDCAN_TTOST_RTO_2 ((uint32_t)0x00000400U) /* Reference trigger offset bit2 */ +#define FDCAN_TTOST_RTO_3 ((uint32_t)0x00000800U) /* Reference trigger offset bit3 */ +#define FDCAN_TTOST_RTO_4 ((uint32_t)0x00001000U) /* Reference trigger offset bit4 */ +#define FDCAN_TTOST_RTO_5 ((uint32_t)0x00002000U) /* Reference trigger offset bit5 */ +#define FDCAN_TTOST_RTO_6 ((uint32_t)0x00004000U) /* Reference trigger offset bit6 */ +#define FDCAN_TTOST_RTO_7 ((uint32_t)0x00008000U) /* Reference trigger offset bit7 */ + +#define FDCAN_TTOST_QCS ((uint32_t)0x00000080U) /* Quality of clock Speed bit */ +#define FDCAN_TTOST_QGTP ((uint32_t)0x00000040U) /* Quality of global time phase bit */ + +#define FDCAN_TTOST_SYS ((uint32_t)0x00000030U) /* Synchronization state bits */ +#define FDCAN_TTOST_SYS_NONE ((uint32_t)0x00000000U) /* unsynchronized */ +#define FDCAN_TTOST_SYS_BUS ((uint32_t)0x00000010U) /* Synchronization to FDCAN communications */ +#define FDCAN_TTOST_SYS_GAP ((uint32_t)0x00000020U) /* Scheduling is hung up by gaps (In_Gap) */ +#define FDCAN_TTOST_SYS_SCHEDULE ((uint32_t)0x00000030U) /* Synchronize to Schedule (In_Schedule) */ + +#define FDCAN_TTOST_MS ((uint32_t)0x0000000CU) /* Master state bits */ +#define FDCAN_TTOST_MS_NONE ((uint32_t)0x00000000U) /* No associated master node attributes */ +#define FDCAN_TTOST_MS_SLAVE ((uint32_t)0x00000004U) /* Working as a time-controlled node */ +#define FDCAN_TTOST_MS_BACKUP ((uint32_t)0x00000008U) /* Working as a backup time master node */ +#define FDCAN_TTOST_MS_CURRENT ((uint32_t)0x0000000CU) /* Work as a current time master node */ + +#define FDCAN_TTOST_EL ((uint32_t)0x00000003U) /* Error level bits */ +#define FDCAN_TTOST_EL_S0 ((uint32_t)0x00000000U) /* Severity 0 - no errors */ +#define FDCAN_TTOST_EL_S1 ((uint32_t)0x00000001U) /* Severity 1 - Warning */ +#define FDCAN_TTOST_EL_S2 ((uint32_t)0x00000002U) /* Severity 2 - Error */ +#define FDCAN_TTOST_EL_S3 ((uint32_t)0x00000003U) /* Severity 3 - Serious error */ + +/** Bit definition for FDCAN_TURNA register **/ +#define FDCAN_TURNA_NAV ((uint32_t)0x0003FFFFU) /* Numerator actual value bits */ +#define FDCAN_TURNA_NAV_0 ((uint32_t)0x00000001U) /* Numerator actual value bit0 */ +#define FDCAN_TURNA_NAV_1 ((uint32_t)0x00000002U) /* Numerator actual value bit1 */ +#define FDCAN_TURNA_NAV_2 ((uint32_t)0x00000004U) /* Numerator actual value bit2 */ +#define FDCAN_TURNA_NAV_3 ((uint32_t)0x00000008U) /* Numerator actual value bit3 */ +#define FDCAN_TURNA_NAV_4 ((uint32_t)0x00000010U) /* Numerator actual value bit4 */ +#define FDCAN_TURNA_NAV_5 ((uint32_t)0x00000020U) /* Numerator actual value bit5 */ +#define FDCAN_TURNA_NAV_6 ((uint32_t)0x00000040U) /* Numerator actual value bit6 */ +#define FDCAN_TURNA_NAV_7 ((uint32_t)0x00000080U) /* Numerator actual value bit7 */ +#define FDCAN_TURNA_NAV_8 ((uint32_t)0x00000100U) /* Numerator actual value bit8 */ +#define FDCAN_TURNA_NAV_9 ((uint32_t)0x00000200U) /* Numerator actual value bit9 */ +#define FDCAN_TURNA_NAV_10 ((uint32_t)0x00000400U) /* Numerator actual value bit10 */ +#define FDCAN_TURNA_NAV_11 ((uint32_t)0x00000800U) /* Numerator actual value bit11 */ +#define FDCAN_TURNA_NAV_12 ((uint32_t)0x00001000U) /* Numerator actual value bit12 */ +#define FDCAN_TURNA_NAV_13 ((uint32_t)0x00002000U) /* Numerator actual value bit13 */ +#define FDCAN_TURNA_NAV_14 ((uint32_t)0x00004000U) /* Numerator actual value bit14 */ +#define FDCAN_TURNA_NAV_15 ((uint32_t)0x00008000U) /* Numerator actual value bit15 */ +#define FDCAN_TURNA_NAV_16 ((uint32_t)0x00010000U) /* Numerator actual value bit16 */ +#define FDCAN_TURNA_NAV_17 ((uint32_t)0x00020000U) /* Numerator actual value bit17 */ + +/** Bit definition for FDCAN_TTLGT register **/ +#define FDCAN_TTLGT_GT ((uint32_t)0xFFFF0000U) /* Global time bits */ +#define FDCAN_TTLGT_GT_0 ((uint32_t)0x00010000U) /* Global time bit0 */ +#define FDCAN_TTLGT_GT_1 ((uint32_t)0x00020000U) /* Global time bit1 */ +#define FDCAN_TTLGT_GT_2 ((uint32_t)0x00040000U) /* Global time bit2 */ +#define FDCAN_TTLGT_GT_3 ((uint32_t)0x00080000U) /* Global time bit3 */ +#define FDCAN_TTLGT_GT_4 ((uint32_t)0x00100000U) /* Global time bit4 */ +#define FDCAN_TTLGT_GT_5 ((uint32_t)0x00200000U) /* Global time bit5 */ +#define FDCAN_TTLGT_GT_6 ((uint32_t)0x00400000U) /* Global time bit6 */ +#define FDCAN_TTLGT_GT_7 ((uint32_t)0x00800000U) /* Global time bit7 */ +#define FDCAN_TTLGT_GT_8 ((uint32_t)0x01000000U) /* Global time bit8 */ +#define FDCAN_TTLGT_GT_9 ((uint32_t)0x02000000U) /* Global time bit9 */ +#define FDCAN_TTLGT_GT_10 ((uint32_t)0x04000000U) /* Global time bit10 */ +#define FDCAN_TTLGT_GT_11 ((uint32_t)0x08000000U) /* Global time bit11 */ +#define FDCAN_TTLGT_GT_12 ((uint32_t)0x10000000U) /* Global time bit12 */ +#define FDCAN_TTLGT_GT_13 ((uint32_t)0x20000000U) /* Global time bit13 */ +#define FDCAN_TTLGT_GT_14 ((uint32_t)0x40000000U) /* Global time bit14 */ +#define FDCAN_TTLGT_GT_15 ((uint32_t)0x80000000U) /* Global time bit15 */ + +#define FDCAN_TTLGT_LT ((uint32_t)0x0000FFFFU) /* Local time bits */ +#define FDCAN_TTLGT_LT_0 ((uint32_t)0x00000001U) /* Local time bit0 */ +#define FDCAN_TTLGT_LT_1 ((uint32_t)0x00000002U) /* Local time bit1 */ +#define FDCAN_TTLGT_LT_2 ((uint32_t)0x00000004U) /* Local time bit2 */ +#define FDCAN_TTLGT_LT_3 ((uint32_t)0x00000008U) /* Local time bit3 */ +#define FDCAN_TTLGT_LT_4 ((uint32_t)0x00000010U) /* Local time bit4 */ +#define FDCAN_TTLGT_LT_5 ((uint32_t)0x00000020U) /* Local time bit5 */ +#define FDCAN_TTLGT_LT_6 ((uint32_t)0x00000040U) /* Local time bit6 */ +#define FDCAN_TTLGT_LT_7 ((uint32_t)0x00000080U) /* Local time bit7 */ +#define FDCAN_TTLGT_LT_8 ((uint32_t)0x00000100U) /* Local time bit8 */ +#define FDCAN_TTLGT_LT_9 ((uint32_t)0x00000200U) /* Local time bit9 */ +#define FDCAN_TTLGT_LT_10 ((uint32_t)0x00000400U) /* Local time bit10 */ +#define FDCAN_TTLGT_LT_11 ((uint32_t)0x00000800U) /* Local time bit11 */ +#define FDCAN_TTLGT_LT_12 ((uint32_t)0x00001000U) /* Local time bit12 */ +#define FDCAN_TTLGT_LT_13 ((uint32_t)0x00002000U) /* Local time bit13 */ +#define FDCAN_TTLGT_LT_14 ((uint32_t)0x00004000U) /* Local time bit14 */ +#define FDCAN_TTLGT_LT_15 ((uint32_t)0x00008000U) /* Local time bit15 */ + +/** Bit definition for FDCAN_TTCTC register **/ +#define FDCAN_TTCTC_CC ((uint32_t)0x003F0000U) /* Cycle count bits */ +#define FDCAN_TTCTC_CC_0 ((uint32_t)0x00010000U) /* Cycle count bit0 */ +#define FDCAN_TTCTC_CC_1 ((uint32_t)0x00020000U) /* Cycle count bit1 */ +#define FDCAN_TTCTC_CC_2 ((uint32_t)0x00040000U) /* Cycle count bit2 */ +#define FDCAN_TTCTC_CC_3 ((uint32_t)0x00080000U) /* Cycle count bit3 */ +#define FDCAN_TTCTC_CC_4 ((uint32_t)0x00100000U) /* Cycle count bit4 */ +#define FDCAN_TTCTC_CC_5 ((uint32_t)0x00200000U) /* Cycle count bit5 */ + +#define FDCAN_TTCTC_CT ((uint32_t)0x0000FFFFU) /* Cycle time bits */ +#define FDCAN_TTCTC_CT_0 ((uint32_t)0x00000001U) /* Cycle time bit0 */ +#define FDCAN_TTCTC_CT_1 ((uint32_t)0x00000002U) /* Cycle time bit1 */ +#define FDCAN_TTCTC_CT_2 ((uint32_t)0x00000004U) /* Cycle time bit2 */ +#define FDCAN_TTCTC_CT_3 ((uint32_t)0x00000008U) /* Cycle time bit3 */ +#define FDCAN_TTCTC_CT_4 ((uint32_t)0x00000010U) /* Cycle time bit4 */ +#define FDCAN_TTCTC_CT_5 ((uint32_t)0x00000020U) /* Cycle time bit5 */ +#define FDCAN_TTCTC_CT_6 ((uint32_t)0x00000040U) /* Cycle time bit6 */ +#define FDCAN_TTCTC_CT_7 ((uint32_t)0x00000080U) /* Cycle time bit7 */ +#define FDCAN_TTCTC_CT_8 ((uint32_t)0x00000100U) /* Cycle time bit8 */ +#define FDCAN_TTCTC_CT_9 ((uint32_t)0x00000200U) /* Cycle time bit9 */ +#define FDCAN_TTCTC_CT_10 ((uint32_t)0x00000400U) /* Cycle time bit10 */ +#define FDCAN_TTCTC_CT_11 ((uint32_t)0x00000800U) /* Cycle time bit11 */ +#define FDCAN_TTCTC_CT_12 ((uint32_t)0x00001000U) /* Cycle time bit12 */ +#define FDCAN_TTCTC_CT_13 ((uint32_t)0x00002000U) /* Cycle time bit13 */ +#define FDCAN_TTCTC_CT_14 ((uint32_t)0x00004000U) /* Cycle time bit14 */ +#define FDCAN_TTCTC_CT_15 ((uint32_t)0x00008000U) /* Cycle time bit15 */ + +/** Bit definition for FDCAN_TTCPT register **/ +#define FDCAN_TTCPT_SWV ((uint32_t)0xFFFF0000U) /* Stop watch value bits */ +#define FDCAN_TTCPT_SWV_0 ((uint32_t)0x00010000U) /* Stop watch value bit0 */ +#define FDCAN_TTCPT_SWV_1 ((uint32_t)0x00020000U) /* Stop watch value bit1 */ +#define FDCAN_TTCPT_SWV_2 ((uint32_t)0x00040000U) /* Stop watch value bit2 */ +#define FDCAN_TTCPT_SWV_3 ((uint32_t)0x00080000U) /* Stop watch value bit3 */ +#define FDCAN_TTCPT_SWV_4 ((uint32_t)0x00100000U) /* Stop watch value bit4 */ +#define FDCAN_TTCPT_SWV_5 ((uint32_t)0x00200000U) /* Stop watch value bit5 */ +#define FDCAN_TTCPT_SWV_6 ((uint32_t)0x00400000U) /* Stop watch value bit6 */ +#define FDCAN_TTCPT_SWV_7 ((uint32_t)0x00800000U) /* Stop watch value bit7 */ +#define FDCAN_TTCPT_SWV_8 ((uint32_t)0x01000000U) /* Stop watch value bit8 */ +#define FDCAN_TTCPT_SWV_9 ((uint32_t)0x02000000U) /* Stop watch value bit9 */ +#define FDCAN_TTCPT_SWV_10 ((uint32_t)0x04000000U) /* Stop watch value bit10 */ +#define FDCAN_TTCPT_SWV_11 ((uint32_t)0x08000000U) /* Stop watch value bit11 */ +#define FDCAN_TTCPT_SWV_12 ((uint32_t)0x10000000U) /* Stop watch value bit12 */ +#define FDCAN_TTCPT_SWV_13 ((uint32_t)0x20000000U) /* Stop watch value bit13 */ +#define FDCAN_TTCPT_SWV_14 ((uint32_t)0x40000000U) /* Stop watch value bit14 */ +#define FDCAN_TTCPT_SWV_15 ((uint32_t)0x80000000U) /* Stop watch value bit15 */ + +#define FDCAN_TTCPT_CCV ((uint32_t)0x0000003FU) /* Cycle count value bits */ +#define FDCAN_TTCPT_CCV_0 ((uint32_t)0x00000001U) /* Cycle count value bit0 */ +#define FDCAN_TTCPT_CCV_1 ((uint32_t)0x00000002U) /* Cycle count value bit1 */ +#define FDCAN_TTCPT_CCV_2 ((uint32_t)0x00000004U) /* Cycle count value bit2 */ +#define FDCAN_TTCPT_CCV_3 ((uint32_t)0x00000008U) /* Cycle count value bit3 */ +#define FDCAN_TTCPT_CCV_4 ((uint32_t)0x00000010U) /* Cycle count value bit4 */ +#define FDCAN_TTCPT_CCV_5 ((uint32_t)0x00000020U) /* Cycle count value bit5 */ + +/** Bit definition for FDCAN_TTCSM register **/ +#define FDCAN_TTCSM_CSM ((uint32_t)0x0000FFFFU) /* Cycle sync mark bits */ +#define FDCAN_TTCSM_CSM_0 ((uint32_t)0x00000001U) /* Cycle sync mark bit0 */ +#define FDCAN_TTCSM_CSM_1 ((uint32_t)0x00000002U) /* Cycle sync mark bit1 */ +#define FDCAN_TTCSM_CSM_2 ((uint32_t)0x00000004U) /* Cycle sync mark bit2 */ +#define FDCAN_TTCSM_CSM_3 ((uint32_t)0x00000008U) /* Cycle sync mark bit3 */ +#define FDCAN_TTCSM_CSM_4 ((uint32_t)0x00000010U) /* Cycle sync mark bit4 */ +#define FDCAN_TTCSM_CSM_5 ((uint32_t)0x00000020U) /* Cycle sync mark bit5 */ +#define FDCAN_TTCSM_CSM_6 ((uint32_t)0x00000040U) /* Cycle sync mark bit6 */ +#define FDCAN_TTCSM_CSM_7 ((uint32_t)0x00000080U) /* Cycle sync mark bit7 */ +#define FDCAN_TTCSM_CSM_8 ((uint32_t)0x00000100U) /* Cycle sync mark bit8 */ +#define FDCAN_TTCSM_CSM_9 ((uint32_t)0x00000200U) /* Cycle sync mark bit9 */ +#define FDCAN_TTCSM_CSM_10 ((uint32_t)0x00000400U) /* Cycle sync mark bit10 */ +#define FDCAN_TTCSM_CSM_11 ((uint32_t)0x00000800U) /* Cycle sync mark bit11 */ +#define FDCAN_TTCSM_CSM_12 ((uint32_t)0x00001000U) /* Cycle sync mark bit12 */ +#define FDCAN_TTCSM_CSM_13 ((uint32_t)0x00002000U) /* Cycle sync mark bit13 */ +#define FDCAN_TTCSM_CSM_14 ((uint32_t)0x00004000U) /* Cycle sync mark bit14 */ +#define FDCAN_TTCSM_CSM_15 ((uint32_t)0x00008000U) /* Cycle sync mark bit15 */ + +/** Bit definition for FDCAN_TTTS register **/ +#define FDCAN_TTSS_SSWT ((uint32_t)0x00000003U) /* Select SWT bits */ +#define FDCAN_TTSS_SSWT_0 ((uint32_t)0x00000000U) /* Select SWT0 */ +#define FDCAN_TTSS_SSWT_1 ((uint32_t)0x00000001U) /* Select SWT1 */ +#define FDCAN_TTSS_SSWT_2 ((uint32_t)0x00000002U) /* Select SWT1 */ +#define FDCAN_TTSS_SSWT_3 ((uint32_t)0x00000003U) /* Select SWT2 */ + +#define FDCAN_TTSS_SEVT ((uint32_t)0x0000000CU) /* Select SWT bits */ +#define FDCAN_TTSS_SEVT_0 ((uint32_t)0x00000000U) /* Select SWT0 */ +#define FDCAN_TTSS_SEVT_1 ((uint32_t)0x00000004U) /* Select SWT1 */ +#define FDCAN_TTSS_SEVT_2 ((uint32_t)0x00000008U) /* Select SWT2 */ +#define FDCAN_TTSS_SEVT_3 ((uint32_t)0x0000000CU) /* Select SWT3 */ + +#define FDCAN_TTSS_MRD ((uint32_t)0x00000010U) /* Modify on read */ + +#define FDCAN_TTSS_TS_SEL ((uint32_t)0x000000E0U) /* Select External timestamp clock divided bits */ +#define FDCAN_TTSS_TS_SEL_0 ((uint32_t)0x00000020U) /* Select External timestamp clock divided bit 0 */ +#define FDCAN_TTSS_TS_SEL_1 ((uint32_t)0x00000040U) /* Select External timestamp clock divided bit 1 */ +#define FDCAN_TTSS_TS_SEL_2 ((uint32_t)0x00000080U) /* Select External timestamp clock divided bit 2 */ + +#define FDCAN_TTSS_TS_SEL_DIV4 ((uint32_t)0x00000000U) /* Select External timestamp clock divided is 4 */ +#define FDCAN_TTSS_TS_SEL_DIV8 ((uint32_t)0x00000020U) /* Select External timestamp clock divided is 8 */ +#define FDCAN_TTSS_TS_SEL_DIV16 ((uint32_t)0x00000040U) /* Select External timestamp clock divided is 16 */ +#define FDCAN_TTSS_TS_SEL_DIV32 ((uint32_t)0x00000060U) /* Select External timestamp clock divided is 32 */ +#define FDCAN_TTSS_TS_SEL_DIV64 ((uint32_t)0x00000080U) /* Select External timestamp clock divided is 64 */ +#define FDCAN_TTSS_TS_SEL_DIV128 ((uint32_t)0x000000A0U) /* Select External timestamp clock divided is 128 */ +#define FDCAN_TTSS_TS_SEL_DIV256 ((uint32_t)0x000000C0U) /* Select External timestamp clock divided is 256 */ +#define FDCAN_TTSS_TS_SEL_DIV512 ((uint32_t)0x000000E0U) /* Select External timestamp clock divided is 512 */ + +#define FDCAN_TTSS_TS_EN ((uint32_t)0x00000100U) /* External timestamp vector enable */ + +#define FDCAN_TTSS_RAMSEL ((uint32_t)0x00000200U) /* Message RAM Selection */ + +/*** Secure digital multimedia cards ***/ + +/** Bit definition for SDMMC_CFG1 register **/ +#define SDMMC_CFG1_MBL ((uint32_t)0x00C00000U) /* Maximum Block Length supported by the Core/Device */ +#define SDMMC_CFG1_MBL_0 ((uint32_t)0x00400000U) /* Maximum Block Length supported by the Core/Device bit0 */ +#define SDMMC_CFG1_MBL_1 ((uint32_t)0x00800000U) /* Maximum Block Length supported by the Core/Device bit1 */ +#define SDMMC_CFG1_BCLKF ((uint32_t)0x003FC000U) /* Base Clock Frequency for SD Clock */ +#define SDMMC_CFG1_BCLKF_0 ((uint32_t)0x00004000U) /* Base Clock Frequency for SD Clock bit0 */ +#define SDMMC_CFG1_BCLKF_1 ((uint32_t)0x00008000U) /* Base Clock Frequency for SD Clock bit1 */ +#define SDMMC_CFG1_BCLKF_2 ((uint32_t)0x00010000U) /* Base Clock Frequency for SD Clock bit2 */ +#define SDMMC_CFG1_BCLKF_3 ((uint32_t)0x00020000U) /* Base Clock Frequency for SD Clock bit3 */ +#define SDMMC_CFG1_BCLKF_4 ((uint32_t)0x00040000U) /* Base Clock Frequency for SD Clock bit4 */ +#define SDMMC_CFG1_BCLKF_5 ((uint32_t)0x00080000U) /* Base Clock Frequency for SD Clock bit5 */ +#define SDMMC_CFG1_BCLKF_6 ((uint32_t)0x00100000U) /* Base Clock Frequency for SD Clock bit6 */ +#define SDMMC_CFG1_BCLKF_7 ((uint32_t)0x00200000U) /* Base Clock Frequency for SD Clock bit7 */ +#define SDMMC_CFG1_TCLKU ((uint32_t)0x00002000U) /* Timeout Clock Unit */ +#define SDMMC_CFG1_TCNT ((uint32_t)0x0000007EU) /* Tuning Count */ +#define SDMMC_CFG1_TCNT_0 ((uint32_t)0x00000002U) /* Tuning Count bit0 */ +#define SDMMC_CFG1_TCNT_1 ((uint32_t)0x00000004U) /* Tuning Count bit1 */ +#define SDMMC_CFG1_TCNT_2 ((uint32_t)0x00000008U) /* Tuning Count bit2 */ +#define SDMMC_CFG1_TCNT_3 ((uint32_t)0x00000010U) /* Tuning Count bit3 */ +#define SDMMC_CFG1_TCNT_4 ((uint32_t)0x00000020U) /* Tuning Count bit4 */ +#define SDMMC_CFG1_TCNT_5 ((uint32_t)0x00000040U) /* Tuning Count bit5 */ +#define SDMMC_CFG1_WSGM ((uint32_t)0x00000001U) /* Wakeup Signal Generation Mode */ + +/** Bit definition for SDMMC_CFG2 register **/ +#define SDMMC_CFG2_SPIBMOD ((uint32_t)0x00080000U) /* SPI Block Mode */ +#define SDMMC_CFG2_SPIMOD ((uint32_t)0x00040000U) /* SPI Mode */ +#define SDMMC_CFG2_DDR50 ((uint32_t)0x00004000U) /* DDR50 Support */ +#define SDMMC_CFG2_SDR104 ((uint32_t)0x00002000U) /* SDR104 Support */ +#define SDMMC_CFG2_SDR50 ((uint32_t)0x00001000U) /* SDR50 Support */ +#define SDMMC_CFG2_STYP ((uint32_t)0x00000C00U) /* lot Type */ +#define SDMMC_CFG2_STYP_0 ((uint32_t)0x00000400U) /* lot Type bit0 */ +#define SDMMC_CFG2_STYP_1 ((uint32_t)0x00000800U) /* lot Type bit1 */ +#define SDMMC_CFG2_ASYNCINT ((uint32_t)0x00000200U) /* Asynchronous Interrupt */ +#define SDMMC_CFG2_VS33 ((uint32_t)0x00000020U) /* 3.3V Support */ +#define SDMMC_CFG2_SRS ((uint32_t)0x00000010U) /* Suspend/Resume Support */ +#define SDMMC_CFG2_SDMA ((uint32_t)0x00000008U) /* SDMA Support */ +#define SDMMC_CFG2_HS ((uint32_t)0x00000004U) /* High Speed Support */ +#define SDMMC_CFG2_ADMA2 ((uint32_t)0x00000002U) /* ADMA2 Mode */ +#define SDMMC_CFG2_EMBUS ((uint32_t)0x00000001U) /* 8-bit Support for Embedded Device */ + +/** Bit definition for SDMMC_CFG3 register **/ +#define SDMMC_CFG3_UTFSDR50 ((uint32_t)0x00000010U) /* Use Tuning for SDR50 */ + +/** Bit definition for SDMMC_PV0CTRL register **/ +#define SDMMC_PV0CTRL_CLKFS_DS ((uint32_t)0x007FE000U) /* SDCLK Frequency Select Value for Default Speed */ +#define SDMMC_PV0CTRL_CLKFS_DS_0 ((uint32_t)0x00002000U) /* SDCLK Frequency Select Value for Default Speed bit0 */ +#define SDMMC_PV0CTRL_CLKFS_DS_1 ((uint32_t)0x00004000U) /* SDCLK Frequency Select Value for Default Speed bit1 */ +#define SDMMC_PV0CTRL_CLKFS_DS_2 ((uint32_t)0x00008000U) /* SDCLK Frequency Select Value for Default Speed bit2 */ +#define SDMMC_PV0CTRL_CLKFS_DS_3 ((uint32_t)0x00010000U) /* SDCLK Frequency Select Value for Default Speed bit3 */ +#define SDMMC_PV0CTRL_CLKFS_DS_4 ((uint32_t)0x00020000U) /* SDCLK Frequency Select Value for Default Speed bit4 */ +#define SDMMC_PV0CTRL_CLKFS_DS_5 ((uint32_t)0x00040000U) /* SDCLK Frequency Select Value for Default Speed bit5 */ +#define SDMMC_PV0CTRL_CLKFS_DS_6 ((uint32_t)0x00080000U) /* SDCLK Frequency Select Value for Default Speed bit6 */ +#define SDMMC_PV0CTRL_CLKFS_DS_7 ((uint32_t)0x00100000U) /* SDCLK Frequency Select Value for Default Speed bit7 */ +#define SDMMC_PV0CTRL_CLKFS_DS_8 ((uint32_t)0x00200000U) /* SDCLK Frequency Select Value for Default Speed bit8 */ +#define SDMMC_PV0CTRL_CLKFS_DS_9 ((uint32_t)0x00400000U) /* SDCLK Frequency Select Value for Default Speed bit9 */ +#define SDMMC_PV0CTRL_CLKFS_INIT ((uint32_t)0x00001FFFU) /* SDCLK Frequency Select Value for Initialization */ +#define SDMMC_PV0CTRL_CLKFS_INIT_0 ((uint32_t)0x00000001U) /* SDCLK Frequency Select Value for Initialization Bit0*/ +#define SDMMC_PV0CTRL_CLKFS_INIT_1 ((uint32_t)0x00000002U) /* SDCLK Frequency Select Value for Initialization Bit1*/ +#define SDMMC_PV0CTRL_CLKFS_INIT_2 ((uint32_t)0x00000004U) /* SDCLK Frequency Select Value for Initialization Bit2*/ +#define SDMMC_PV0CTRL_CLKFS_INIT_3 ((uint32_t)0x00000008U) /* SDCLK Frequency Select Value for Initialization Bit3*/ +#define SDMMC_PV0CTRL_CLKFS_INIT_4 ((uint32_t)0x00000010U) /* SDCLK Frequency Select Value for Initialization Bit4*/ +#define SDMMC_PV0CTRL_CLKFS_INIT_5 ((uint32_t)0x00000020U) /* SDCLK Frequency Select Value for Initialization Bit5*/ +#define SDMMC_PV0CTRL_CLKFS_INIT_6 ((uint32_t)0x00000040U) /* SDCLK Frequency Select Value for Initialization Bit6*/ +#define SDMMC_PV0CTRL_CLKFS_INIT_7 ((uint32_t)0x00000080U) /* SDCLK Frequency Select Value for Initialization Bit7*/ +#define SDMMC_PV0CTRL_CLKFS_INIT_8 ((uint32_t)0x00000100U) /* SDCLK Frequency Select Value for Initialization Bit8*/ +#define SDMMC_PV0CTRL_CLKFS_INIT_9 ((uint32_t)0x00000200U) /* SDCLK Frequency Select Value for Initialization Bit9*/ + +/** Bit definition for SDMMC_PV1CTRL register **/ +#define SDMMC_PV1CTRL_CLKFS_SDR12 ((uint32_t)0x007FE000U) /* SDCLK Frequency Select Value for SDR12 */ +#define SDMMC_PV1CTRL_CLKFS_SDR12_0 ((uint32_t)0x00002000U) /* SDCLK Frequency Select Value for SDR12 bit0 */ +#define SDMMC_PV1CTRL_CLKFS_SDR12_1 ((uint32_t)0x00004000U) /* SDCLK Frequency Select Value for SDR12 bit1 */ +#define SDMMC_PV1CTRL_CLKFS_SDR12_2 ((uint32_t)0x00008000U) /* SDCLK Frequency Select Value for SDR12 bit2 */ +#define SDMMC_PV1CTRL_CLKFS_SDR12_3 ((uint32_t)0x00010000U) /* SDCLK Frequency Select Value for SDR12 bit3 */ +#define SDMMC_PV1CTRL_CLKFS_SDR12_4 ((uint32_t)0x00020000U) /* SDCLK Frequency Select Value for SDR12 bit4 */ +#define SDMMC_PV1CTRL_CLKFS_SDR12_5 ((uint32_t)0x00040000U) /* SDCLK Frequency Select Value for SDR12 bit5 */ +#define SDMMC_PV1CTRL_CLKFS_SDR12_6 ((uint32_t)0x00080000U) /* SDCLK Frequency Select Value for SDR12 bit6 */ +#define SDMMC_PV1CTRL_CLKFS_SDR12_7 ((uint32_t)0x00100000U) /* SDCLK Frequency Select Value for SDR12 bit7 */ +#define SDMMC_PV1CTRL_CLKFS_SDR12_8 ((uint32_t)0x00200000U) /* SDCLK Frequency Select Value for SDR12 bit8 */ +#define SDMMC_PV1CTRL_CLKFS_SDR12_9 ((uint32_t)0x00400000U) /* SDCLK Frequency Select Value for SDR12 bit9 */ +#define SDMMC_PV1CTRL_CLKFS_HS ((uint32_t)0x00001FFFU) /* SDCLK Frequency Select Value for High Speed */ +#define SDMMC_PV1CTRL_CLKFS_HS_0 ((uint32_t)0x00000001U) /* SDCLK Frequency Select Value for High Speed Bit0 */ +#define SDMMC_PV1CTRL_CLKFS_HS_1 ((uint32_t)0x00000002U) /* SDCLK Frequency Select Value for High Speed Bit1 */ +#define SDMMC_PV1CTRL_CLKFS_HS_2 ((uint32_t)0x00000004U) /* SDCLK Frequency Select Value for High Speed Bit2 */ +#define SDMMC_PV1CTRL_CLKFS_HS_3 ((uint32_t)0x00000008U) /* SDCLK Frequency Select Value for High Speed Bit3 */ +#define SDMMC_PV1CTRL_CLKFS_HS_4 ((uint32_t)0x00000010U) /* SDCLK Frequency Select Value for High Speed Bit4 */ +#define SDMMC_PV1CTRL_CLKFS_HS_5 ((uint32_t)0x00000020U) /* SDCLK Frequency Select Value for High Speed Bit5 */ +#define SDMMC_PV1CTRL_CLKFS_HS_6 ((uint32_t)0x00000040U) /* SDCLK Frequency Select Value for High Speed Bit6 */ +#define SDMMC_PV1CTRL_CLKFS_HS_7 ((uint32_t)0x00000080U) /* SDCLK Frequency Select Value for High Speed Bit7 */ +#define SDMMC_PV1CTRL_CLKFS_HS_8 ((uint32_t)0x00000100U) /* SDCLK Frequency Select Value for High Speed Bit8 */ +#define SDMMC_PV1CTRL_CLKFS_HS_9 ((uint32_t)0x00000200U) /* SDCLK Frequency Select Value for High Speed Bit9 */ + +/** Bit definition for SDMMC_PV2CTRL register **/ +#define SDMMC_PV2CTRL_CLKFS_SDR50 ((uint32_t)0x007FE000U) /* SDCLK Frequency Select Value for SDR50 */ +#define SDMMC_PV2CTRL_CLKFS_SDR50_0 ((uint32_t)0x00002000U) /* SDCLK Frequency Select Value for SDR50 Bit0 */ +#define SDMMC_PV2CTRL_CLKFS_SDR50_1 ((uint32_t)0x00004000U) /* SDCLK Frequency Select Value for SDR50 Bit1 */ +#define SDMMC_PV2CTRL_CLKFS_SDR50_2 ((uint32_t)0x00008000U) /* SDCLK Frequency Select Value for SDR50 Bit2 */ +#define SDMMC_PV2CTRL_CLKFS_SDR50_3 ((uint32_t)0x00010000U) /* SDCLK Frequency Select Value for SDR50 Bit3 */ +#define SDMMC_PV2CTRL_CLKFS_SDR50_4 ((uint32_t)0x00020000U) /* SDCLK Frequency Select Value for SDR50 Bit4 */ +#define SDMMC_PV2CTRL_CLKFS_SDR50_5 ((uint32_t)0x00040000U) /* SDCLK Frequency Select Value for SDR50 Bit5 */ +#define SDMMC_PV2CTRL_CLKFS_SDR50_6 ((uint32_t)0x00080000U) /* SDCLK Frequency Select Value for SDR50 Bit6 */ +#define SDMMC_PV2CTRL_CLKFS_SDR50_7 ((uint32_t)0x00100000U) /* SDCLK Frequency Select Value for SDR50 Bit7 */ +#define SDMMC_PV2CTRL_CLKFS_SDR50_8 ((uint32_t)0x00200000U) /* SDCLK Frequency Select Value for SDR50 Bit8 */ +#define SDMMC_PV2CTRL_CLKFS_SDR50_9 ((uint32_t)0x00400000U) /* SDCLK Frequency Select Value for SDR50 Bit9 */ +#define SDMMC_PV2CTRL_CLKFS_SDR25 ((uint32_t)0x00001FFFU) /* SDCLK Frequency Select Value for SDR25 */ +#define SDMMC_PV2CTRL_CLKFS_SDR25_0 ((uint32_t)0x00000001U) /* SDCLK Frequency Select Value for SDR25 Bit0 */ +#define SDMMC_PV2CTRL_CLKFS_SDR25_1 ((uint32_t)0x00000002U) /* SDCLK Frequency Select Value for SDR25 Bit1 */ +#define SDMMC_PV2CTRL_CLKFS_SDR25_2 ((uint32_t)0x00000004U) /* SDCLK Frequency Select Value for SDR25 Bit2 */ +#define SDMMC_PV2CTRL_CLKFS_SDR25_3 ((uint32_t)0x00000008U) /* SDCLK Frequency Select Value for SDR25 Bit3 */ +#define SDMMC_PV2CTRL_CLKFS_SDR25_4 ((uint32_t)0x00000010U) /* SDCLK Frequency Select Value for SDR25 Bit4 */ +#define SDMMC_PV2CTRL_CLKFS_SDR25_5 ((uint32_t)0x00000020U) /* SDCLK Frequency Select Value for SDR25 Bit5 */ +#define SDMMC_PV2CTRL_CLKFS_SDR25_6 ((uint32_t)0x00000040U) /* SDCLK Frequency Select Value for SDR25 Bit6 */ +#define SDMMC_PV2CTRL_CLKFS_SDR25_7 ((uint32_t)0x00000080U) /* SDCLK Frequency Select Value for SDR25 Bit7 */ +#define SDMMC_PV2CTRL_CLKFS_SDR25_8 ((uint32_t)0x00000100U) /* SDCLK Frequency Select Value for SDR25 Bit8 */ +#define SDMMC_PV2CTRL_CLKFS_SDR25_9 ((uint32_t)0x00000200U) /* SDCLK Frequency Select Value for SDR25 Bit9 */ + +/** Bit definition for SDMMC_PV3CTRL register **/ +#define SDMMC_PV3CTRL_CLKFS_SDR104 ((uint32_t)0x007FE000U) /* SDCLK Frequency Select Value for SDR104 */ +#define SDMMC_PV3CTRL_CLKFS_SDR104_0 ((uint32_t)0x00002000U) /* SDCLK Frequency Select Value for SDR104 Bit0 */ +#define SDMMC_PV3CTRL_CLKFS_SDR104_1 ((uint32_t)0x00004000U) /* SDCLK Frequency Select Value for SDR104 Bit1 */ +#define SDMMC_PV3CTRL_CLKFS_SDR104_2 ((uint32_t)0x00008000U) /* SDCLK Frequency Select Value for SDR104 Bit2 */ +#define SDMMC_PV3CTRL_CLKFS_SDR104_3 ((uint32_t)0x00010000U) /* SDCLK Frequency Select Value for SDR104 Bit3 */ +#define SDMMC_PV3CTRL_CLKFS_SDR104_4 ((uint32_t)0x00020000U) /* SDCLK Frequency Select Value for SDR104 Bit4 */ +#define SDMMC_PV3CTRL_CLKFS_SDR104_5 ((uint32_t)0x00040000U) /* SDCLK Frequency Select Value for SDR104 Bit5 */ +#define SDMMC_PV3CTRL_CLKFS_SDR104_6 ((uint32_t)0x00080000U) /* SDCLK Frequency Select Value for SDR104 Bit6 */ +#define SDMMC_PV3CTRL_CLKFS_SDR104_7 ((uint32_t)0x00100000U) /* SDCLK Frequency Select Value for SDR104 Bit7 */ +#define SDMMC_PV3CTRL_CLKFS_SDR104_8 ((uint32_t)0x00200000U) /* SDCLK Frequency Select Value for SDR104 Bit8 */ +#define SDMMC_PV3CTRL_CLKFS_SDR104_9 ((uint32_t)0x00400000U) /* SDCLK Frequency Select Value for SDR104 Bit9 */ +#define SDMMC_PV3CTRL_CLKFS_DDR50 ((uint32_t)0x00001FFFU) /* SDCLK Frequency Select Value for DDR50 */ +#define SDMMC_PV3CTRL_CLKFS_DDR50_0 ((uint32_t)0x00000001U) /* SDCLK Frequency Select Value for DDR50 Bit0 */ +#define SDMMC_PV3CTRL_CLKFS_DDR50_1 ((uint32_t)0x00000002U) /* SDCLK Frequency Select Value for DDR50 Bit1 */ +#define SDMMC_PV3CTRL_CLKFS_DDR50_2 ((uint32_t)0x00000004U) /* SDCLK Frequency Select Value for DDR50 Bit2 */ +#define SDMMC_PV3CTRL_CLKFS_DDR50_3 ((uint32_t)0x00000008U) /* SDCLK Frequency Select Value for DDR50 Bit3 */ +#define SDMMC_PV3CTRL_CLKFS_DDR50_4 ((uint32_t)0x00000010U) /* SDCLK Frequency Select Value for DDR50 Bit4 */ +#define SDMMC_PV3CTRL_CLKFS_DDR50_5 ((uint32_t)0x00000020U) /* SDCLK Frequency Select Value for DDR50 Bit5 */ +#define SDMMC_PV3CTRL_CLKFS_DDR50_6 ((uint32_t)0x00000040U) /* SDCLK Frequency Select Value for DDR50 Bit6 */ +#define SDMMC_PV3CTRL_CLKFS_DDR50_7 ((uint32_t)0x00000080U) /* SDCLK Frequency Select Value for DDR50 Bit7 */ +#define SDMMC_PV3CTRL_CLKFS_DDR50_8 ((uint32_t)0x00000100U) /* SDCLK Frequency Select Value for DDR50 Bit8 */ +#define SDMMC_PV3CTRL_CLKFS_DDR50_9 ((uint32_t)0x00000200U) /* SDCLK Frequency Select Value for DDR50 Bit9 */ + +/** Bit definition for SDMMC_DLYCTRL register **/ +#define SDMMC_DLYCTRL_OTDE ((uint32_t)0x00000800U) /* Output tap Delay Enable */ +#define SDMMC_DLYCTRL_OTDS ((uint32_t)0x00000780U) /* Output Tap Delay Select */ +#define SDMMC_DLYCTRL_OTDS_0 ((uint32_t)0x00000080U) /* Output Tap Delay Select bit0 */ +#define SDMMC_DLYCTRL_OTDS_1 ((uint32_t)0x00000100U) /* Output Tap Delay Select bit1 */ +#define SDMMC_DLYCTRL_OTDS_2 ((uint32_t)0x00000200U) /* Output Tap Delay Select bit2 */ +#define SDMMC_DLYCTRL_OTDS_3 ((uint32_t)0x00000400U) /* Output Tap Delay Select bit3 */ +#define SDMMC_DLYCTRL_ITCW ((uint32_t)0x00000040U) /* Input Tap Change Window */ +#define SDMMC_DLYCTRL_ITDE ((uint32_t)0x00000020U) /* Input Tap Delay Enable */ +#define SDMMC_DLYCTRL_ITDS ((uint32_t)0x0000001FU) /* Input Tap Delay Select */ +#define SDMMC_DLYCTRL_ITDS_0 ((uint32_t)0x00000001U) /* Input Tap Delay Select Bit0 */ +#define SDMMC_DLYCTRL_ITDS_1 ((uint32_t)0x00000002U) /* Input Tap Delay Select Bit1 */ +#define SDMMC_DLYCTRL_ITDS_2 ((uint32_t)0x00000004U) /* Input Tap Delay Select Bit2 */ +#define SDMMC_DLYCTRL_ITDS_3 ((uint32_t)0x00000008U) /* Input Tap Delay Select Bit3 */ +#define SDMMC_DLYCTRL_ITDS_4 ((uint32_t)0x00000010U) /* Input Tap Delay Select Bit4 */ + +/** Bit definition for SDHOST_DSADD register **/ +#define SDHOST_DSADD_ADD ((uint32_t)0xFFFFFFFFU) /* physical system memory address used for DMA transfers + or the second argument for the Auto CMD23 Bits */ + +/** Bit definition for SDHOST_BLKCFG register **/ +#define SDHOST_BLKCFG_CNT ((uint32_t)0xFFFF0000U) /* Blocks Count for Current Transfer bits */ +#define SDHOST_BLKCFG_CNT_0 ((uint32_t)0x00010000U) /* Blocks Count for Current Transfer bit0 */ +#define SDHOST_BLKCFG_CNT_1 ((uint32_t)0x00020000U) /* Blocks Count for Current Transfer bit1 */ +#define SDHOST_BLKCFG_CNT_2 ((uint32_t)0x00040000U) /* Blocks Count for Current Transfer bit2 */ +#define SDHOST_BLKCFG_CNT_3 ((uint32_t)0x00080000U) /* Blocks Count for Current Transfer bit3 */ +#define SDHOST_BLKCFG_CNT_4 ((uint32_t)0x00100000U) /* Blocks Count for Current Transfer bit4 */ +#define SDHOST_BLKCFG_CNT_5 ((uint32_t)0x00200000U) /* Blocks Count for Current Transfer bit5 */ +#define SDHOST_BLKCFG_CNT_6 ((uint32_t)0x00400000U) /* Blocks Count for Current Transfer bit6 */ +#define SDHOST_BLKCFG_CNT_7 ((uint32_t)0x00800000U) /* Blocks Count for Current Transfer bit7 */ +#define SDHOST_BLKCFG_CNT_8 ((uint32_t)0x01000000U) /* Blocks Count for Current Transfer bit8 */ +#define SDHOST_BLKCFG_CNT_9 ((uint32_t)0x02000000U) /* Blocks Count for Current Transfer bit9 */ +#define SDHOST_BLKCFG_CNT_10 ((uint32_t)0x04000000U) /* Blocks Count for Current Transfer bit10 */ +#define SDHOST_BLKCFG_CNT_11 ((uint32_t)0x08000000U) /* Blocks Count for Current Transfer bit11 */ +#define SDHOST_BLKCFG_CNT_12 ((uint32_t)0x10000000U) /* Blocks Count for Current Transfer bit12 */ +#define SDHOST_BLKCFG_CNT_13 ((uint32_t)0x20000000U) /* Blocks Count for Current Transfer bit13 */ +#define SDHOST_BLKCFG_CNT_14 ((uint32_t)0x40000000U) /* Blocks Count for Current Transfer bit14 */ +#define SDHOST_BLKCFG_CNT_15 ((uint32_t)0x80000000U) /* Blocks Count for Current Transfer bit15 */ +#define SDHOST_BLKCFG_HDBS ((uint32_t)0x00007000U) /* Host SDMA Buffer Size */ +#define SDHOST_BLKCFG_HDBS_0 ((uint32_t)0x00001000U) /* Host SDMA Buffer Size Bit0 */ +#define SDHOST_BLKCFG_HDBS_1 ((uint32_t)0x00002000U) /* Host SDMA Buffer Size Bit1 */ +#define SDHOST_BLKCFG_HDBS_2 ((uint32_t)0x00004000U) /* Host SDMA Buffer Size Bit2 */ +#define SDHOST_BLKCFG_SIZE ((uint32_t)0x00000FFFU) /* Transfer Block Size */ +#define SDHOST_BLKCFG_SIZE_0 ((uint32_t)0x00000001U) /* Transfer Block Size Bit0 */ +#define SDHOST_BLKCFG_SIZE_1 ((uint32_t)0x00000002U) /* Transfer Block Size Bit1 */ +#define SDHOST_BLKCFG_SIZE_2 ((uint32_t)0x00000004U) /* Transfer Block Size Bit2 */ +#define SDHOST_BLKCFG_SIZE_3 ((uint32_t)0x00000008U) /* Transfer Block Size Bit3 */ +#define SDHOST_BLKCFG_SIZE_4 ((uint32_t)0x00000010U) /* Transfer Block Size Bit4 */ +#define SDHOST_BLKCFG_SIZE_5 ((uint32_t)0x00000020U) /* Transfer Block Size Bit5 */ +#define SDHOST_BLKCFG_SIZE_6 ((uint32_t)0x00000040U) /* Transfer Block Size Bit6 */ +#define SDHOST_BLKCFG_SIZE_7 ((uint32_t)0x00000080U) /* Transfer Block Size Bit7 */ +#define SDHOST_BLKCFG_SIZE_8 ((uint32_t)0x00000100U) /* Transfer Block Size Bit8 */ +#define SDHOST_BLKCFG_SIZE_9 ((uint32_t)0x00000200U) /* Transfer Block Size Bit9 */ +#define SDHOST_BLKCFG_SIZE_10 ((uint32_t)0x00000400U) /* Transfer Block Size Bit10 */ +#define SDHOST_BLKCFG_SIZE_11 ((uint32_t)0x00000800U) /* Transfer Block Size Bit11 */ + +/** Bit definition for SDHOST_CMDARG1 register **/ +#define SDHOST_CMDARG1_ARG1 ((uint32_t)0xFFFFFFFFU) /* SD CMD Argument Bit */ +#define SDHOST_CMDARG1_ARG1_0 ((uint32_t)0x00000001U) /* SD CMD Argument Bit0 */ +#define SDHOST_CMDARG1_ARG1_1 ((uint32_t)0x00000002U) /* SD CMD Argument Bit1 */ +#define SDHOST_CMDARG1_ARG1_2 ((uint32_t)0x00000004U) /* SD CMD Argument Bit2 */ +#define SDHOST_CMDARG1_ARG1_3 ((uint32_t)0x00000008U) /* SD CMD Argument Bit3 */ +#define SDHOST_CMDARG1_ARG1_4 ((uint32_t)0x00000010U) /* SD CMD Argument Bit4 */ +#define SDHOST_CMDARG1_ARG1_5 ((uint32_t)0x00000020U) /* SD CMD Argument Bit5 */ +#define SDHOST_CMDARG1_ARG1_6 ((uint32_t)0x00000040U) /* SD CMD Argument Bit6 */ +#define SDHOST_CMDARG1_ARG1_7 ((uint32_t)0x00000080U) /* SD CMD Argument Bit7 */ +#define SDHOST_CMDARG1_ARG1_8 ((uint32_t)0x00000100U) /* SD CMD Argument Bit8 */ +#define SDHOST_CMDARG1_ARG1_9 ((uint32_t)0x00000200U) /* SD CMD Argument Bit9 */ +#define SDHOST_CMDARG1_ARG1_10 ((uint32_t)0x00000400U) /* SD CMD Argument Bit10 */ +#define SDHOST_CMDARG1_ARG1_11 ((uint32_t)0x00000800U) /* SD CMD Argument Bit11 */ +#define SDHOST_CMDARG1_ARG1_12 ((uint32_t)0x00001000U) /* SD CMD Argument Bit12 */ +#define SDHOST_CMDARG1_ARG1_13 ((uint32_t)0x00002000U) /* SD CMD Argument Bit13 */ +#define SDHOST_CMDARG1_ARG1_14 ((uint32_t)0x00004000U) /* SD CMD Argument Bit14 */ +#define SDHOST_CMDARG1_ARG1_15 ((uint32_t)0x00008000U) /* SD CMD Argument Bit15 */ +#define SDHOST_CMDARG1_ARG1_16 ((uint32_t)0x00010000U) /* SD CMD Argument Bit16 */ +#define SDHOST_CMDARG1_ARG1_17 ((uint32_t)0x00020000U) /* SD CMD Argument Bit17 */ +#define SDHOST_CMDARG1_ARG1_18 ((uint32_t)0x00040000U) /* SD CMD Argument Bit18 */ +#define SDHOST_CMDARG1_ARG1_19 ((uint32_t)0x00080000U) /* SD CMD Argument Bit19 */ +#define SDHOST_CMDARG1_ARG1_20 ((uint32_t)0x00100000U) /* SD CMD Argument Bit20 */ +#define SDHOST_CMDARG1_ARG1_21 ((uint32_t)0x00200000U) /* SD CMD Argument Bit21 */ +#define SDHOST_CMDARG1_ARG1_22 ((uint32_t)0x00400000U) /* SD CMD Argument Bit22 */ +#define SDHOST_CMDARG1_ARG1_23 ((uint32_t)0x00800000U) /* SD CMD Argument Bit23 */ +#define SDHOST_CMDARG1_ARG1_24 ((uint32_t)0x01000000U) /* SD CMD Argument Bit24 */ +#define SDHOST_CMDARG1_ARG1_25 ((uint32_t)0x02000000U) /* SD CMD Argument Bit25 */ +#define SDHOST_CMDARG1_ARG1_26 ((uint32_t)0x04000000U) /* SD CMD Argument Bit26 */ +#define SDHOST_CMDARG1_ARG1_27 ((uint32_t)0x08000000U) /* SD CMD Argument Bit27 */ +#define SDHOST_CMDARG1_ARG1_28 ((uint32_t)0x10000000U) /* SD CMD Argument Bit28 */ +#define SDHOST_CMDARG1_ARG1_29 ((uint32_t)0x20000000U) /* SD CMD Argument Bit29 */ +#define SDHOST_CMDARG1_ARG1_30 ((uint32_t)0x40000000U) /* SD CMD Argument Bit30 */ +#define SDHOST_CMDARG1_ARG1_31 ((uint32_t)0x80000000U) /* SD CMD Argument Bit31 */ + +/** Bit definition for SDHOST_TMODE register **/ +#define SDHOST_TMODE_INDEX ((uint32_t)0x3F000000U) /* Command Index */ +#define SDHOST_TMODE_INDEX_0 ((uint32_t)0x01000000U) /* Command Index Bit0 */ +#define SDHOST_TMODE_INDEX_1 ((uint32_t)0x02000000U) /* Command Index Bit1 */ +#define SDHOST_TMODE_INDEX_2 ((uint32_t)0x04000000U) /* Command Index Bit2 */ +#define SDHOST_TMODE_INDEX_3 ((uint32_t)0x08000000U) /* Command Index Bit3 */ +#define SDHOST_TMODE_INDEX_4 ((uint32_t)0x10000000U) /* Command Index Bit4 */ +#define SDHOST_TMODE_INDEX_5 ((uint32_t)0x20000000U) /* Command Index Bit5 */ +#define SDHOST_TMODE_TYPE ((uint32_t)0x00C00000U) /* Command Type */ +#define SDHOST_TMODE_TYPE_0 ((uint32_t)0x00400000U) /* Command Type bit0 */ +#define SDHOST_TMODE_TYPE_1 ((uint32_t)0x00800000U) /* Command Type bit1 */ +#define SDHOST_TMODE_DPRESEL ((uint32_t)0x00200000U) /* Data Present Select */ +#define SDHOST_TMODE_INDEXCK ((uint32_t)0x00100000U) /* Command Index Check Enable */ +#define SDHOST_TMODE_CRCCK ((uint32_t)0x00080000U) /* Command CRC Check Enable */ +#define SDHOST_TMODE_RTYPESEL ((uint32_t)0x00030000U) /* Response Type Select */ +#define SDHOST_TMODE_RTYPESEL_0 ((uint32_t)0x00010000U) /* Response Type Select Bit0 */ +#define SDHOST_TMODE_RTYPESEL_1 ((uint32_t)0x00020000U) /* Response Type Select Bit1 */ +#define SDHOST_TMODE_BLKSEL ((uint32_t)0x00000020U) /* Multi / Single Block Select */ +#define SDHOST_TMODE_DATDIR ((uint32_t)0x00000010U) /* Data Transfer Direction Select */ +#define SDHOST_TMODE_AUTOCMDE ((uint32_t)0x0000000CU) /* Auto CMD Enable */ +#define SDHOST_TMODE_AUTOCMDE_0 ((uint32_t)0x00000004U) /* Auto CMD Enable Bit0 */ +#define SDHOST_TMODE_AUTOCMDE_1 ((uint32_t)0x00000008U) /* Auto CMD Enable Bit1 */ +#define SDHOST_TMODE_BLOCKCNTE ((uint32_t)0x00000002U) /* Block Count Enable */ +#define SDHOST_TMODE_DMAE ((uint32_t)0x00000001U) /* DMA Enable */ + +/** Bit definition for SDHOST_CMDRSP0 register **/ +#define SDHOST_CMDRSP0_RESP0 ((uint32_t)0xFFFFFFFFU) /* CMD response Bit[31:0] */ +/** Bit definition for SDHOST_CMDRSP1 register **/ +#define SDHOST_CMDRSP1_RESP1 ((uint32_t)0xFFFFFFFFU) /* CMD response Bit[63:32] */ +/** Bit definition for SDHOST_CMDRSP2 register **/ +#define SDHOST_CMDRSP2_RESP2 ((uint32_t)0xFFFFFFFFU) /* CMD response Bit[95:64] */ +/** Bit definition for SDHOST_CMDRSP3 register **/ +#define SDHOST_CMDRSP3_RESP3 ((uint32_t)0xFFFFFFFFU) /* CMD response Bit[127:96] */ + +/** Bit definition for SDHOST_BUFDAT register **/ +#define SDHOST_BUFDAT_DAT ((uint32_t)0xFFFFFFFFU) /* Data content Bits */ +#define SDHOST_BUFDAT_DAT_0 ((uint32_t)0x00000001U) /* Data content Bit0 */ +#define SDHOST_BUFDAT_DAT_1 ((uint32_t)0x00000002U) /* Data content Bit1 */ +#define SDHOST_BUFDAT_DAT_2 ((uint32_t)0x00000004U) /* Data content Bit2 */ +#define SDHOST_BUFDAT_DAT_3 ((uint32_t)0x00000008U) /* Data content Bit3 */ +#define SDHOST_BUFDAT_DAT_4 ((uint32_t)0x00000010U) /* Data content Bit4 */ +#define SDHOST_BUFDAT_DAT_5 ((uint32_t)0x00000020U) /* Data content Bit5 */ +#define SDHOST_BUFDAT_DAT_6 ((uint32_t)0x00000040U) /* Data content Bit6 */ +#define SDHOST_BUFDAT_DAT_7 ((uint32_t)0x00000080U) /* Data content Bit7 */ +#define SDHOST_BUFDAT_DAT_8 ((uint32_t)0x00000100U) /* Data content Bit8 */ +#define SDHOST_BUFDAT_DAT_9 ((uint32_t)0x00000200U) /* Data content Bit9 */ +#define SDHOST_BUFDAT_DAT_10 ((uint32_t)0x00000400U) /* Data content Bit10 */ +#define SDHOST_BUFDAT_DAT_11 ((uint32_t)0x00000800U) /* Data content Bit11 */ +#define SDHOST_BUFDAT_DAT_12 ((uint32_t)0x00001000U) /* Data content Bit12 */ +#define SDHOST_BUFDAT_DAT_13 ((uint32_t)0x00002000U) /* Data content Bit13 */ +#define SDHOST_BUFDAT_DAT_14 ((uint32_t)0x00004000U) /* Data content Bit14 */ +#define SDHOST_BUFDAT_DAT_15 ((uint32_t)0x00008000U) /* Data content Bit15 */ +#define SDHOST_BUFDAT_DAT_16 ((uint32_t)0x00010000U) /* Data content Bit16 */ +#define SDHOST_BUFDAT_DAT_17 ((uint32_t)0x00020000U) /* Data content Bit17 */ +#define SDHOST_BUFDAT_DAT_18 ((uint32_t)0x00040000U) /* Data content Bit18 */ +#define SDHOST_BUFDAT_DAT_19 ((uint32_t)0x00080000U) /* Data content Bit19 */ +#define SDHOST_BUFDAT_DAT_20 ((uint32_t)0x00100000U) /* Data content Bit20 */ +#define SDHOST_BUFDAT_DAT_21 ((uint32_t)0x00200000U) /* Data content Bit21 */ +#define SDHOST_BUFDAT_DAT_22 ((uint32_t)0x00400000U) /* Data content Bit22 */ +#define SDHOST_BUFDAT_DAT_23 ((uint32_t)0x00800000U) /* Data content Bit23 */ +#define SDHOST_BUFDAT_DAT_24 ((uint32_t)0x01000000U) /* Data content Bit24 */ +#define SDHOST_BUFDAT_DAT_25 ((uint32_t)0x02000000U) /* Data content Bit25 */ +#define SDHOST_BUFDAT_DAT_26 ((uint32_t)0x04000000U) /* Data content Bit26 */ +#define SDHOST_BUFDAT_DAT_27 ((uint32_t)0x08000000U) /* Data content Bit27 */ +#define SDHOST_BUFDAT_DAT_28 ((uint32_t)0x10000000U) /* Data content Bit28 */ +#define SDHOST_BUFDAT_DAT_29 ((uint32_t)0x20000000U) /* Data content Bit29 */ +#define SDHOST_BUFDAT_DAT_30 ((uint32_t)0x40000000U) /* Data content Bit30 */ +#define SDHOST_BUFDAT_DAT_31 ((uint32_t)0x80000000U) /* Data content Bit31 */ + +/** Bit definition for SDHOST_PRESTS register **/ +#define SDHOST_PRESTS_DATLH ((uint32_t)0x1E000000U) /* DAT[7:4] Line Signal Level */ +#define SDHOST_PRESTS_DATLH_0 ((uint32_t)0x02000000U) /* DAT[4] Line Signal Level */ +#define SDHOST_PRESTS_DATLH_1 ((uint32_t)0x04000000U) /* DAT[5] Line Signal Level */ +#define SDHOST_PRESTS_DATLH_2 ((uint32_t)0x08000000U) /* DAT[6] Line Signal Level */ +#define SDHOST_PRESTS_DATLH_3 ((uint32_t)0x10000000U) /* DAT[7] Line Signal Level */ +#define SDHOST_PRESTS_CMDL ((uint32_t)0x01000000U) /* CMD Line Signal Level */ +#define SDHOST_PRESTS_DATLL ((uint32_t)0x00F00000U) /* DAT[3:0] Line Signal Level */ +#define SDHOST_PRESTS_DATLL_0 ((uint32_t)0x00100000U) /* DAT[0] Line Signal Level */ +#define SDHOST_PRESTS_DATLL_1 ((uint32_t)0x00200000U) /* DAT[1] Line Signal Level */ +#define SDHOST_PRESTS_DATLL_2 ((uint32_t)0x00400000U) /* DAT[2] Line Signal Level */ +#define SDHOST_PRESTS_DATLL_3 ((uint32_t)0x00800000U) /* DAT[3] Line Signal Level */ +#define SDHOST_PRESTS_SDWPL ((uint32_t)0x00080000U) /* Write Protect Switch Pin Level */ +#define SDHOST_PRESTS_SDCDL ((uint32_t)0x00040000U) /* Card Detect Pin Level */ +#define SDHOST_PRESTS_CSTSL ((uint32_t)0x00020000U) /* Card State Stable */ +#define SDHOST_PRESTS_CINS ((uint32_t)0x00010000U) /* Card Inserted */ +#define SDHOST_PRESTS_BUFR ((uint32_t)0x00000800U) /* Buffer Read Enable */ +#define SDHOST_PRESTS_BUFW ((uint32_t)0x00000400U) /* Buffer Write Enable */ +#define SDHOST_PRESTS_RTRANACT ((uint32_t)0x00000200U) /* Read Transfer Active */ +#define SDHOST_PRESTS_WTRANACT ((uint32_t)0x00000100U) /* Write Transfer Active */ +#define SDHOST_PRESTS_RETUNREQ ((uint32_t)0x00000008U) /* Re-Tuning Request */ +#define SDHOST_PRESTS_DLACT ((uint32_t)0x00000004U) /* DAT Line Active */ +#define SDHOST_PRESTS_CMDINHD ((uint32_t)0x00000002U) /* Command Inhibit (DAT) */ +#define SDHOST_PRESTS_CMDINHC ((uint32_t)0x00000001U) /* Command Inhibit (CMD) */ + +/** Bit definition for SDHOST_CTRL1 register **/ +#define SDHOST_CTRL1_RMVWKUP ((uint32_t)0x04000000U) /* Wakeup Event Enable On SD Card Removal */ +#define SDHOST_CTRL1_INSTWKUP ((uint32_t)0x02000000U) /* Wakeup Event Enable On SD Card Insertion */ +#define SDHOST_CTRL1_INTWKUP ((uint32_t)0x01000000U) /* Wakeup Event Enable On Card Interrupt */ +#define SDHOST_CTRL1_BOOTACKC ((uint32_t)0x00800000U) /* Boot Ack Check */ +#define SDHOST_CTRL1_BOOTINALT ((uint32_t)0x00400000U) /* To start boot code access in alternative mode */ +#define SDHOST_CTRL1_BOOTEN ((uint32_t)0x00200000U) /* To start boot code access */ +#define SDHOST_CTRL1_SPIMODE ((uint32_t)0x00100000U) /* SPI mode enable */ +#define SDHOST_CTRL1_INTATBG ((uint32_t)0x00080000U) /* Interrupt At Block Gap */ +#define SDHOST_CTRL1_RWAITCTRL ((uint32_t)0x00040000U) /* Read Wait Control */ +#define SDHOST_CTRL1_CONTREQ ((uint32_t)0x00020000U) /* Continue Request */ +#define SDHOST_CTRL1_SABGREQ ((uint32_t)0x00010000U) /* Stop At Block Gap Request */ +#define SDHOST_CTRL1_HWRST ((uint32_t)0x00001000U) /* Hardware reset */ +#define SDHOST_CTRL1_SDBVSEL ((uint32_t)0x00000E00U) /* SD Bus Voltage Select */ +#define SDHOST_CTRL1_SDPWR ((uint32_t)0x00000100U) /* SD Bus Power */ +#define SDHOST_CTRL1_CDSD ((uint32_t)0x00000080U) /* Card detect signal detection */ +#define SDHOST_CTRL1_CDTL ((uint32_t)0x00000040U) /* Card Detect Test Level */ +#define SDHOST_CTRL1_EDTWIDTH ((uint32_t)0x00000020U) /* Extended Data Transfer Width */ +#define SDHOST_CTRL1_DMASEL ((uint32_t)0x00000018U) /* DMA Select */ +#define SDHOST_CTRL1_DMASEL_0 ((uint32_t)0x00000008U) /* DMA Select Bit0 */ +#define SDHOST_CTRL1_DMASEL_1 ((uint32_t)0x00000010U) /* DMA Select Bit1 */ +#define SDHOST_CTRL1_HSEN ((uint32_t)0x00000004U) /* High Speed Enable */ +#define SDHOST_CTRL1_DTWIDTH ((uint32_t)0x00000002U) /* Data Transfer Width */ +#define SDHOST_CTRL1_LEDCTRL ((uint32_t)0x00000001U) /* LED Control */ + +/** Bit definition for SDHOST_CTRL2 register **/ +#define SDHOST_CTRL2_SWRSTDL ((uint32_t)0x04000000U) /* Software Reset for DAT Line */ +#define SDHOST_CTRL2_SWRSTCL ((uint32_t)0x02000000U) /* Software Reset for CMD Line */ +#define SDHOST_CTRL2_SWRSTALL ((uint32_t)0x01000000U) /* Software Reset for All */ +#define SDHOST_CTRL2_DTCNT ((uint32_t)0x000F0000U) /* Data Timeout Counter Value */ +#define SDHOST_CTRL2_DTCNT_0 ((uint32_t)0x00010000U) /* Data Timeout Counter Value Bit0 */ +#define SDHOST_CTRL2_DTCNT_1 ((uint32_t)0x00020000U) /* Data Timeout Counter Value Bit1 */ +#define SDHOST_CTRL2_DTCNT_2 ((uint32_t)0x00040000U) /* Data Timeout Counter Value Bit2 */ +#define SDHOST_CTRL2_DTCNT_3 ((uint32_t)0x00080000U) /* Data Timeout Counter Value Bit3 */ +#define SDHOST_CTRL2_SDCLKSEL ((uint32_t)0x0000FFC0U) /* SDCLK Frequency Select */ +#define SDHOST_CTRL2_SDCLKSEL_0 ((uint32_t)0x00000040U) /* SDCLK Frequency Select Bit0 */ +#define SDHOST_CTRL2_SDCLKSEL_1 ((uint32_t)0x00000080U) /* SDCLK Frequency Select Bit1 */ +#define SDHOST_CTRL2_SDCLKSEL_2 ((uint32_t)0x00000100U) /* SDCLK Frequency Select Bit2 */ +#define SDHOST_CTRL2_SDCLKSEL_3 ((uint32_t)0x00000200U) /* SDCLK Frequency Select Bit3 */ +#define SDHOST_CTRL2_SDCLKSEL_4 ((uint32_t)0x00000400U) /* SDCLK Frequency Select Bit4 */ +#define SDHOST_CTRL2_SDCLKSEL_5 ((uint32_t)0x00000800U) /* SDCLK Frequency Select Bit5 */ +#define SDHOST_CTRL2_SDCLKSEL_6 ((uint32_t)0x00001000U) /* SDCLK Frequency Select Bit6 */ +#define SDHOST_CTRL2_SDCLKSEL_7 ((uint32_t)0x00002000U) /* SDCLK Frequency Select Bit7 */ +#define SDHOST_CTRL2_SDCLKSEL_8 ((uint32_t)0x00004000U) /* SDCLK Frequency Select Bit8 */ +#define SDHOST_CTRL2_SDCLKSEL_9 ((uint32_t)0x00008000U) /* SDCLK Frequency Select Bit9 */ +#define SDHOST_CTRL2_SDCLKE ((uint32_t)0x00000004U) /* SD Clock Enable */ +#define SDHOST_CTRL2_INCLKSTS ((uint32_t)0x00000002U) /* Internal Clock Stable */ +#define SDHOST_CTRL2_INCLKE ((uint32_t)0x00000001U) /* Internal Clock Enable */ + +/** Bit definition for SDHOST_INTSTS register **/ +#define SDHOST_INTSTS_TRGRERR ((uint32_t)0x10000000U) /* Target Response error */ +#define SDHOST_INTSTS_ADMAERR ((uint32_t)0x02000000U) /* ADMA Error */ +#define SDHOST_INTSTS_ACMDERR ((uint32_t)0x01000000U) /* Auto CMD Error */ +#define SDHOST_INTSTS_DENDERR ((uint32_t)0x00400000U) /* Data End Bit Error */ +#define SDHOST_INTSTS_DCRCERR ((uint32_t)0x00200000U) /* Data CRC Error */ +#define SDHOST_INTSTS_DTERR ((uint32_t)0x00100000U) /* Data Timeout Error */ +#define SDHOST_INTSTS_CINXERR ((uint32_t)0x00080000U) /* Command Index Error */ +#define SDHOST_INTSTS_CENDBERR ((uint32_t)0x00040000U) /* Command End Bit Error */ +#define SDHOST_INTSTS_CCRCERR ((uint32_t)0x00020000U) /* Command CRC Error */ +#define SDHOST_INTSTS_CTERR ((uint32_t)0x00010000U) /* Command Timeout Error */ +#define SDHOST_INTSTS_ALLERR ((uint32_t)0x00008000U) /* Error Interrupt */ +#define SDHOST_INTSTS_BOOTTER ((uint32_t)0x00004000U) /* Boot terminate Interrupt */ +#define SDHOST_INTSTS_BOOTACKR ((uint32_t)0x00002000U) /* Boot ack rcv */ +#define SDHOST_INTSTS_RETUNE ((uint32_t)0x00001000U) /* Re-Tuning Event */ +#define SDHOST_INTSTS_CINT ((uint32_t)0x00000100U) /* Card Interrupt */ +#define SDHOST_INTSTS_CRMV ((uint32_t)0x00000080U) /* Card Removal */ +#define SDHOST_INTSTS_CINS ((uint32_t)0x00000040U) /* Card Insertion */ +#define SDHOST_INTSTS_BUFRRDY ((uint32_t)0x00000020U) /* Buffer Read Ready */ +#define SDHOST_INTSTS_BUFWRDY ((uint32_t)0x00000010U) /* Buffer Write Ready */ +#define SDHOST_INTSTS_DMAINT ((uint32_t)0x00000008U) /* DMA Interrupt */ +#define SDHOST_INTSTS_BLKGAPE ((uint32_t)0x00000004U) /* Block Gap Event */ +#define SDHOST_INTSTS_TC ((uint32_t)0x00000002U) /* Transfer Complete */ +#define SDHOST_INTSTS_CMDC ((uint32_t)0x00000001U) /* Command Complete */ + +/** Bit definition for SDHOST_IE register **/ +#define SDHOST_IE_TRGREE ((uint32_t)0x10000000U) /* Target Response Error /Host Error Status Enable */ +#define SDHOST_IE_ADMAEE ((uint32_t)0x02000000U) /* ADMA Error Status Enable */ +#define SDHOST_IE_ACMDEE ((uint32_t)0x01000000U) /* Auto CMD12 Error Status Enable */ +#define SDHOST_IE_DENDEE ((uint32_t)0x00400000U) /* Data End Bit Error Status Enable */ +#define SDHOST_IE_DCRCEE ((uint32_t)0x00200000U) /* Data CRC Error Status Enable */ +#define SDHOST_IE_DTEE ((uint32_t)0x00100000U) /* Data Timeout Error Status Enable */ +#define SDHOST_IE_CINXEE ((uint32_t)0x00080000U) /* Command Index Error Status Enable */ +#define SDHOST_IE_CENDBEE ((uint32_t)0x00040000U) /* Command End Bit Error Status Enable */ +#define SDHOST_IE_CCRCEE ((uint32_t)0x00020000U) /* Command CRC Error Status Enable */ +#define SDHOST_IE_CTEE ((uint32_t)0x00010000U) /* Command Timeout Error Status Enable */ +#define SDHOST_IE_BOOTTIE ((uint32_t)0x00004000U) /* Boot terminate Interrupt enable */ +#define SDHOST_IE_BOOTACKRE ((uint32_t)0x00002000U) /* Boot ack rcv enable */ +#define SDHOST_IE_RTUNE ((uint32_t)0x00001000U) /* Re-Tuning Event Status Enable */ +#define SDHOST_IE_CINTE ((uint32_t)0x00000100U) /* Card Interrupt Status Enable */ +#define SDHOST_IE_CRMVE ((uint32_t)0x00000080U) /* Card Removal Status Enable */ +#define SDHOST_IE_CINSE ((uint32_t)0x00000040U) /* Card Insertion Status Enable */ +#define SDHOST_IE_BUFRRDYE ((uint32_t)0x00000020U) /* Buffer Read Ready Status Enable */ +#define SDHOST_IE_BUFWRDYE ((uint32_t)0x00000010U) /* Buffer Write Ready Status Enable */ +#define SDHOST_IE_DMAINTE ((uint32_t)0x00000008U) /* DMA Interrupt Status Enable */ +#define SDHOST_IE_BLKGAPEE ((uint32_t)0x00000004U) /* Block Gap Event Status Enable */ +#define SDHOST_IE_TCE ((uint32_t)0x00000002U) /* Transfer Complete Status Enable */ +#define SDHOST_IE_CMDCE ((uint32_t)0x00000001U) /* Command Complete Status Enable */ + +/** Bit definition for SDHOST_ISE register **/ +#define SDHOST_ISE_TRGRESE ((uint32_t)0x10000000U) /* Target Response Error /Host Error Signal Enable */ +#define SDHOST_ISE_ADMAESE ((uint32_t)0x02000000U) /* ADMA Error Signal Enable */ +#define SDHOST_ISE_ACMDESE ((uint32_t)0x01000000U) /* Auto CMD12 Error Signal Enable */ +#define SDHOST_ISE_DENDESE ((uint32_t)0x00400000U) /* Data End Bit Error Signal Enable */ +#define SDHOST_ISE_DCRCESE ((uint32_t)0x00200000U) /* Data CRC Error Signal Enable */ +#define SDHOST_ISE_DTESE ((uint32_t)0x00100000U) /* Data Timeout Error Signal Enable */ +#define SDHOST_ISE_CINXESE ((uint32_t)0x00080000U) /* Command Index Error Signal Enable */ +#define SDHOST_ISE_CENDBESE ((uint32_t)0x00040000U) /* Command End Bit Error Signal Enable */ +#define SDHOST_ISE_CCRCESE ((uint32_t)0x00020000U) /* Command CRC Error Signal Enable */ +#define SDHOST_ISE_CTESE ((uint32_t)0x00010000U) /* Command Timeout Error Signal Enable */ +#define SDHOST_ISE_BOOTTISE ((uint32_t)0x00004000U) /* Boot terminate Interrupt signal enable */ +#define SDHOST_ISE_BOOTACKRSE ((uint32_t)0x00002000U) /* Boot ack rcv signal enable */ +#define SDHOST_ISE_RTUNSE ((uint32_t)0x00001000U) /* Re-Tuning Event signal Enable */ +#define SDHOST_ISE_CINTSE ((uint32_t)0x00000100U) /* Card Interrupt Signal Enable */ +#define SDHOST_ISE_CRMVSE ((uint32_t)0x00000080U) /* Card Removal Signal Enable */ +#define SDHOST_ISE_CINSSE ((uint32_t)0x00000040U) /* Card Insertion Signal Enable */ +#define SDHOST_ISE_BUFRRDYSE ((uint32_t)0x00000020U) /* Buffer Read Ready Signal Enable */ +#define SDHOST_ISE_BUFWRDYSE ((uint32_t)0x00000010U) /* Buffer Write Ready Signal Enable */ +#define SDHOST_ISE_DMAINTSE ((uint32_t)0x00000008U) /* DMA Interrupt Signal Enable */ +#define SDHOST_ISE_BLKGAPESE ((uint32_t)0x00000004U) /* Block Gap Event Signal Enable */ +#define SDHOST_ISE_TCSE ((uint32_t)0x00000002U) /* Transfer Complete Signal Enable */ +#define SDHOST_ISE_CMDCSE ((uint32_t)0x00000001U) /* Command Complete Signal Enable */ + +/** Bit definition for SDHOST_CTRLSTS register **/ +#define SDHOST_CTRLSTS_PREVE ((uint32_t)0x80000000U) /* Preset Value Enable */ +#define SDHOST_CTRLSTS_ASYNCIE ((uint32_t)0x40000000U) /* Asynchronous Interrupt Enable */ +#define SDHOST_CTRLSTS_SCS ((uint32_t)0x00800000U) /* Sampling Clock Select */ +#define SDHOST_CTRLSTS_ETUN ((uint32_t)0x00400000U) /* Execute Tuning */ +#define SDHOST_CTRLSTS_V18SE ((uint32_t)0x00080000U) /* 1.8V Signaling Enable */ +#define SDHOST_CTRLSTS_UHSMOD ((uint32_t)0x00070000U) /* UHS Mode Select */ +#define SDHOST_CTRLSTS_UHSMOD_0 ((uint32_t)0x00010000U) /* UHS Mode Select Bit0 */ +#define SDHOST_CTRLSTS_UHSMOD_1 ((uint32_t)0x00020000U) /* UHS Mode Select Bit1 */ +#define SDHOST_CTRLSTS_UHSMOD_2 ((uint32_t)0x00040000U) /* UHS Mode Select Bit2 */ +#define SDHOST_CTRLSTS_ACMD12E ((uint32_t)0x00000080U) /* Auto CMD12 Enable */ +#define SDHOST_CTRLSTS_ACMDINXE ((uint32_t)0x00000010U) /* Auto CMD Index Error */ +#define SDHOST_CTRLSTS_ACMDEBE ((uint32_t)0x00000008U) /* Auto CMD End Bit Error */ +#define SDHOST_CTRLSTS_ACMDCRCE ((uint32_t)0x00000004U) /* Auto CMD CRC Error */ +#define SDHOST_CTRLSTS_ACMDTE ((uint32_t)0x00000002U) /* Auto CMD Timeout Error */ +#define SDHOST_CTRLSTS_ACMD12NE ((uint32_t)0x00000001U) /* Auto CMD12 not Executed */ + +/** Bit definition for SDHOST_CAP0STS register **/ +#define SDHOST_CAP0STS_STYP ((uint32_t)0xC0000000U) /* Slot Type */ +#define SDHOST_CAP0STS_STYP_0 ((uint32_t)0x40000000U) /* Slot Type bit0 */ +#define SDHOST_CAP0STS_STYP_1 ((uint32_t)0x80000000U) /* Slot Type bit1 */ +#define SDHOST_CAP0STS_ASYNCINT ((uint32_t)0x20000000U) /* Asynchronous Interrupt Support */ +#define SDHOST_CAP0STS_VS33 ((uint32_t)0x01000000U) /* Voltage Support 3.3V */ +#define SDHOST_CAP0STS_SRS ((uint32_t)0x00800000U) /* Suspend / Resume Support */ +#define SDHOST_CAP0STS_SDMA ((uint32_t)0x00400000U) /* SDMA Support */ +#define SDHOST_CAP0STS_HS ((uint32_t)0x00200000U) /* High Speed Support */ +#define SDHOST_CAP0STS_ADMA2 ((uint32_t)0x00080000U) /* ADMA2 */ +#define SDHOST_CAP0STS_EMBUS ((uint32_t)0x00040000U) /* Extended Media Bus Support */ +#define SDHOST_CAP0STS_MBL ((uint32_t)0x00030000U) /* Max Block Length */ +#define SDHOST_CAP0STS_MBL_0 ((uint32_t)0x00010000U) /* Max Block Length Bit0 */ +#define SDHOST_CAP0STS_MBL_1 ((uint32_t)0x00020000U) /* Max Block Length Bit1 */ +#define SDHOST_CAP0STS_BCLKF ((uint32_t)0x0000FF00U) /* Base Clock Frequency for SD Clock */ +#define SDHOST_CAP0STS_BCLKF_0 ((uint32_t)0x00000100U) /* Base Clock Frequency for SD Clock Bit0 */ +#define SDHOST_CAP0STS_BCLKF_1 ((uint32_t)0x00000200U) /* Base Clock Frequency for SD Clock Bit1 */ +#define SDHOST_CAP0STS_BCLKF_2 ((uint32_t)0x00000400U) /* Base Clock Frequency for SD Clock Bit2 */ +#define SDHOST_CAP0STS_BCLKF_3 ((uint32_t)0x00000800U) /* Base Clock Frequency for SD Clock Bit3 */ +#define SDHOST_CAP0STS_BCLKF_4 ((uint32_t)0x00001000U) /* Base Clock Frequency for SD Clock Bit4 */ +#define SDHOST_CAP0STS_BCLKF_5 ((uint32_t)0x00002000U) /* Base Clock Frequency for SD Clock Bit5 */ +#define SDHOST_CAP0STS_BCLKF_6 ((uint32_t)0x00004000U) /* Base Clock Frequency for SD Clock Bit6 */ +#define SDHOST_CAP0STS_BCLKF_7 ((uint32_t)0x00008000U) /* Base Clock Frequency for SD Clock Bit7 */ +#define SDHOST_CAP0STS_TCLKU ((uint32_t)0x00000080U) /* Timeout Clock Unit */ + +/** Bit definition for SDHOST_CAP1STS register **/ +#define SDHOST_CAP1STS_SPIBMOD ((uint32_t)0x02000000U) /* SPI block mode */ +#define SDHOST_CAP1STS_SPIMOD ((uint32_t)0x01000000U) /* SPI mode */ +#define SDHOST_CAP1STS_UTFSDR50 ((uint32_t)0x00002000U) /* Use Tuning for SDR50 */ +#define SDHOST_CAP1STS_RTTIMCNT ((uint32_t)0x00000F00U) /* Timer Count for Re-Tuning */ +#define SDHOST_CAP1STS_RTTIMCNT_0 ((uint32_t)0x00000100U) /* Timer Count for Re-Tuning Bit0 */ +#define SDHOST_CAP1STS_RTTIMCNT_1 ((uint32_t)0x00000200U) /* Timer Count for Re-Tuning Bit1 */ +#define SDHOST_CAP1STS_RTTIMCNT_2 ((uint32_t)0x00000400U) /* Timer Count for Re-Tuning Bit2 */ +#define SDHOST_CAP1STS_RTTIMCNT_3 ((uint32_t)0x00000800U) /* Timer Count for Re-Tuning Bit3 */ +#define SDHOST_CAP1STS_DDR50 ((uint32_t)0x00000004U) /* DDR50 Support */ +#define SDHOST_CAP1STS_SDR104 ((uint32_t)0x00000002U) /* SDR104 Support */ +#define SDHOST_CAP1STS_SDR50 ((uint32_t)0x00000001U) /* SDR50 Support */ + +/** Bit definition for SDHOST_STSFE register **/ +#define SDHOST_STSFE_ADMAE ((uint32_t)0x02000000U) /* Force Event for ADMA Error */ +#define SDHOST_STSFE_ACMDE ((uint32_t)0x01000000U) /* Force Event for Auto CMD Error */ +#define SDHOST_STSFE_DEBE ((uint32_t)0x00400000U) /* Force Event for Data End Bit Error */ +#define SDHOST_STSFE_DCRCE ((uint32_t)0x00200000U) /* Force Event for Data CRC Error */ +#define SDHOST_STSFE_DTE ((uint32_t)0x00100000U) /* Force Event for Data Timeout Error */ +#define SDHOST_STSFE_CINXE ((uint32_t)0x00080000U) /* Force Event for Command Index Error */ +#define SDHOST_STSFE_CEBE ((uint32_t)0x00040000U) /* Force Event for Command End Bit Error */ +#define SDHOST_STSFE_CCRCE ((uint32_t)0x00020000U) /* Force Event for Command CRC Error */ +#define SDHOST_STSFE_CTE ((uint32_t)0x00010000U) /* Force Event for Command Timeout Error */ +#define SDHOST_STSFE_ACMD12E ((uint32_t)0x00000080U) /* Force Event for command not issued by Auto CMD12 Error */ +#define SDHOST_STSFE_ACMDINXE ((uint32_t)0x00000010U) /* Force Event for Auto CMD Index Error */ +#define SDHOST_STSFE_ACMDEBE ((uint32_t)0x00000008U) /* Force Event for Auto CMD End bit Error */ +#define SDHOST_STSFE_ACMDCRCE ((uint32_t)0x00000004U) /* Force Event for Auto CMD CRC Error */ +#define SDHOST_STSFE_ACMDTE ((uint32_t)0x00000002U) /* Force Event for Auto CMD timeout Error */ +#define SDHOST_STSFE_ACMD12NE ((uint32_t)0x00000001U) /* Force Event for Auto CMD12 NOT Executed */ + +/** Bit definition for SDHOST_ADMAESTS register **/ +#define SDHOST_ADMAESTS_ADMALME ((uint32_t)0x00000004U) /* ADMA Length Mismatch Error */ +#define SDHOST_ADMAESTS_ADMAE ((uint32_t)0x00000003U) /* ADMA Error State */ +#define SDHOST_ADMAESTS_ADMAE_0 ((uint32_t)0x00000001U) /* ADMA Error State Bit0 */ +#define SDHOST_ADMAESTS_ADMAE_1 ((uint32_t)0x00000002U) /* ADMA Error State Bit1 */ + +/** Bit definition for SDHOST_ASADD0 register **/ +#define SDHOST_ASADD0_ADD0 ((uint32_t)0xFFFFFFFFU) /* ADMA System Address Bit[31:0] */ +/** Bit definition for SDHOST_ASADD1 register **/ +#define SDHOST_ASADD1_ADD1 ((uint32_t)0xFFFFFFFFU) /* ADMA System Address Bit[63:32] */ + +/** Bit definition for SDHOST_PV0STS register **/ +#define SDHOST_PV0STS_CLKFS_DS ((uint32_t)0x03FF0000U) /* SDCLK Frequency Select Value for Default Speed */ +#define SDHOST_PV0STS_CLKFS_DS_0 ((uint32_t)0x00010000U) /* SDCLK Frequency Select Value for Default Speed Bit0 */ +#define SDHOST_PV0STS_CLKFS_DS_1 ((uint32_t)0x00020000U) /* SDCLK Frequency Select Value for Default Speed Bit1 */ +#define SDHOST_PV0STS_CLKFS_DS_2 ((uint32_t)0x00040000U) /* SDCLK Frequency Select Value for Default Speed Bit2 */ +#define SDHOST_PV0STS_CLKFS_DS_3 ((uint32_t)0x00080000U) /* SDCLK Frequency Select Value for Default Speed Bit3 */ +#define SDHOST_PV0STS_CLKFS_DS_4 ((uint32_t)0x00100000U) /* SDCLK Frequency Select Value for Default Speed Bit4 */ +#define SDHOST_PV0STS_CLKFS_DS_5 ((uint32_t)0x00200000U) /* SDCLK Frequency Select Value for Default Speed Bit5 */ +#define SDHOST_PV0STS_CLKFS_DS_6 ((uint32_t)0x00400000U) /* SDCLK Frequency Select Value for Default Speed Bit6 */ +#define SDHOST_PV0STS_CLKFS_DS_7 ((uint32_t)0x00800000U) /* SDCLK Frequency Select Value for Default Speed Bit7 */ +#define SDHOST_PV0STS_CLKFS_DS_8 ((uint32_t)0x01000000U) /* SDCLK Frequency Select Value for Default Speed Bit8 */ +#define SDHOST_PV0STS_CLKFS_DS_9 ((uint32_t)0x02000000U) /* SDCLK Frequency Select Value for Default Speed Bit9 */ +#define SDHOST_PV0STS_CLKFS_INIT ((uint32_t)0x000003FFU) /* SDCLK Frequency Select Value for Initialization */ +#define SDHOST_PV0STS_CLKFS_INIT_0 ((uint32_t)0x00000001U) /* SDCLK Frequency Select Value for Initialization Bit0 */ +#define SDHOST_PV0STS_CLKFS_INIT_1 ((uint32_t)0x00000002U) /* SDCLK Frequency Select Value for Initialization Bit1 */ +#define SDHOST_PV0STS_CLKFS_INIT_2 ((uint32_t)0x00000004U) /* SDCLK Frequency Select Value for Initialization Bit2 */ +#define SDHOST_PV0STS_CLKFS_INIT_3 ((uint32_t)0x00000008U) /* SDCLK Frequency Select Value for Initialization Bit3 */ +#define SDHOST_PV0STS_CLKFS_INIT_4 ((uint32_t)0x00000010U) /* SDCLK Frequency Select Value for Initialization Bit4 */ +#define SDHOST_PV0STS_CLKFS_INIT_5 ((uint32_t)0x00000020U) /* SDCLK Frequency Select Value for Initialization Bit5 */ +#define SDHOST_PV0STS_CLKFS_INIT_6 ((uint32_t)0x00000040U) /* SDCLK Frequency Select Value for Initialization Bit6 */ +#define SDHOST_PV0STS_CLKFS_INIT_7 ((uint32_t)0x00000080U) /* SDCLK Frequency Select Value for Initialization Bit7 */ +#define SDHOST_PV0STS_CLKFS_INIT_8 ((uint32_t)0x00000100U) /* SDCLK Frequency Select Value for Initialization Bit8 */ +#define SDHOST_PV0STS_CLKFS_INIT_9 ((uint32_t)0x00000200U) /* SDCLK Frequency Select Value for Initialization Bit9 */ + +/** Bit definition for SDHOST_PV1STS register **/ +#define SDHOST_PV1STS_CLKFS_SDR12 ((uint32_t)0x03FF0000U) /* SDCLK Frequency Select Value for SDR12 */ +#define SDHOST_PV1STS_CLKFS_SDR12_0 ((uint32_t)0x00010000U) /* SDCLK Frequency Select Value for SDR12 Bit0 */ +#define SDHOST_PV1STS_CLKFS_SDR12_1 ((uint32_t)0x00020000U) /* SDCLK Frequency Select Value for SDR12 Bit1 */ +#define SDHOST_PV1STS_CLKFS_SDR12_2 ((uint32_t)0x00040000U) /* SDCLK Frequency Select Value for SDR12 Bit2 */ +#define SDHOST_PV1STS_CLKFS_SDR12_3 ((uint32_t)0x00080000U) /* SDCLK Frequency Select Value for SDR12 Bit3 */ +#define SDHOST_PV1STS_CLKFS_SDR12_4 ((uint32_t)0x00100000U) /* SDCLK Frequency Select Value for SDR12 Bit4 */ +#define SDHOST_PV1STS_CLKFS_SDR12_5 ((uint32_t)0x00200000U) /* SDCLK Frequency Select Value for SDR12 Bit5 */ +#define SDHOST_PV1STS_CLKFS_SDR12_6 ((uint32_t)0x00400000U) /* SDCLK Frequency Select Value for SDR12 Bit6 */ +#define SDHOST_PV1STS_CLKFS_SDR12_7 ((uint32_t)0x00800000U) /* SDCLK Frequency Select Value for SDR12 Bit7 */ +#define SDHOST_PV1STS_CLKFS_SDR12_8 ((uint32_t)0x01000000U) /* SDCLK Frequency Select Value for SDR12 Bit8 */ +#define SDHOST_PV1STS_CLKFS_SDR12_9 ((uint32_t)0x02000000U) /* SDCLK Frequency Select Value for SDR12 Bit9 */ +#define SDHOST_PV1STS_CLKFS_HS ((uint32_t)0x000003FFU) /* SDCLK Frequency Select Value for High Speed */ +#define SDHOST_PV1STS_CLKFS_HS_0 ((uint32_t)0x00000001U) /* SDCLK Frequency Select Value for High Speed Bit0 */ +#define SDHOST_PV1STS_CLKFS_HS_1 ((uint32_t)0x00000002U) /* SDCLK Frequency Select Value for High Speed Bit1 */ +#define SDHOST_PV1STS_CLKFS_HS_2 ((uint32_t)0x00000004U) /* SDCLK Frequency Select Value for High Speed Bit2 */ +#define SDHOST_PV1STS_CLKFS_HS_3 ((uint32_t)0x00000008U) /* SDCLK Frequency Select Value for High Speed Bit3 */ +#define SDHOST_PV1STS_CLKFS_HS_4 ((uint32_t)0x00000010U) /* SDCLK Frequency Select Value for High Speed Bit4 */ +#define SDHOST_PV1STS_CLKFS_HS_5 ((uint32_t)0x00000020U) /* SDCLK Frequency Select Value for High Speed Bit5 */ +#define SDHOST_PV1STS_CLKFS_HS_6 ((uint32_t)0x00000040U) /* SDCLK Frequency Select Value for High Speed Bit6 */ +#define SDHOST_PV1STS_CLKFS_HS_7 ((uint32_t)0x00000080U) /* SDCLK Frequency Select Value for High Speed Bit7 */ +#define SDHOST_PV1STS_CLKFS_HS_8 ((uint32_t)0x00000100U) /* SDCLK Frequency Select Value for High Speed Bit8 */ +#define SDHOST_PV1STS_CLKFS_HS_9 ((uint32_t)0x00000200U) /* SDCLK Frequency Select Value for High Speed Bit9 */ + +/** Bit definition for SDHOST_PV2STS register **/ +#define SDHOST_PV2STS_CLKFS_SDR50 ((uint32_t)0x03FF0000U) /* SDCLK Frequency Select Value for SDR50 */ +#define SDHOST_PV2STS_CLKFS_SDR50_0 ((uint32_t)0x00010000U) /* SDCLK Frequency Select Value for SDR50 Bit0 */ +#define SDHOST_PV2STS_CLKFS_SDR50_1 ((uint32_t)0x00020000U) /* SDCLK Frequency Select Value for SDR50 Bit1 */ +#define SDHOST_PV2STS_CLKFS_SDR50_2 ((uint32_t)0x00040000U) /* SDCLK Frequency Select Value for SDR50 Bit2 */ +#define SDHOST_PV2STS_CLKFS_SDR50_3 ((uint32_t)0x00080000U) /* SDCLK Frequency Select Value for SDR50 Bit3 */ +#define SDHOST_PV2STS_CLKFS_SDR50_4 ((uint32_t)0x00100000U) /* SDCLK Frequency Select Value for SDR50 Bit4 */ +#define SDHOST_PV2STS_CLKFS_SDR50_5 ((uint32_t)0x00200000U) /* SDCLK Frequency Select Value for SDR50 Bit5 */ +#define SDHOST_PV2STS_CLKFS_SDR50_6 ((uint32_t)0x00400000U) /* SDCLK Frequency Select Value for SDR50 Bit6 */ +#define SDHOST_PV2STS_CLKFS_SDR50_7 ((uint32_t)0x00800000U) /* SDCLK Frequency Select Value for SDR50 Bit7 */ +#define SDHOST_PV2STS_CLKFS_SDR50_8 ((uint32_t)0x01000000U) /* SDCLK Frequency Select Value for SDR50 Bit8 */ +#define SDHOST_PV2STS_CLKFS_SDR50_9 ((uint32_t)0x02000000U) /* SDCLK Frequency Select Value for SDR50 Bit9 */ +#define SDHOST_PV2STS_CLKFS_SDR25 ((uint32_t)0x000003FFU) /* SDCLK Frequency Select Value for SDR25 */ +#define SDHOST_PV2STS_CLKFS_SDR25_0 ((uint32_t)0x00000001U) /* SDCLK Frequency Select Value for SDR25 Bit0 */ +#define SDHOST_PV2STS_CLKFS_SDR25_1 ((uint32_t)0x00000002U) /* SDCLK Frequency Select Value for SDR25 Bit1 */ +#define SDHOST_PV2STS_CLKFS_SDR25_2 ((uint32_t)0x00000004U) /* SDCLK Frequency Select Value for SDR25 Bit2 */ +#define SDHOST_PV2STS_CLKFS_SDR25_3 ((uint32_t)0x00000008U) /* SDCLK Frequency Select Value for SDR25 Bit3 */ +#define SDHOST_PV2STS_CLKFS_SDR25_4 ((uint32_t)0x00000010U) /* SDCLK Frequency Select Value for SDR25 Bit4 */ +#define SDHOST_PV2STS_CLKFS_SDR25_5 ((uint32_t)0x00000020U) /* SDCLK Frequency Select Value for SDR25 Bit5 */ +#define SDHOST_PV2STS_CLKFS_SDR25_6 ((uint32_t)0x00000040U) /* SDCLK Frequency Select Value for SDR25 Bit6 */ +#define SDHOST_PV2STS_CLKFS_SDR25_7 ((uint32_t)0x00000080U) /* SDCLK Frequency Select Value for SDR25 Bit7 */ +#define SDHOST_PV2STS_CLKFS_SDR25_8 ((uint32_t)0x00000100U) /* SDCLK Frequency Select Value for SDR25 Bit8 */ +#define SDHOST_PV2STS_CLKFS_SDR25_9 ((uint32_t)0x00000200U) /* SDCLK Frequency Select Value for SDR25 Bit9 */ + +/** Bit definition for SDHOST_PV3STS register **/ +#define SDHOST_PV3STS_CLKFS_DDR50 ((uint32_t)0x03FF0000U) /* SDCLK Frequency Select Value for DDR50 */ +#define SDHOST_PV3STS_CLKFS_DDR50_0 ((uint32_t)0x00010000U) /* SDCLK Frequency Select Value for DDR50 Bit0 */ +#define SDHOST_PV3STS_CLKFS_DDR50_1 ((uint32_t)0x00020000U) /* SDCLK Frequency Select Value for DDR50 Bit1 */ +#define SDHOST_PV3STS_CLKFS_DDR50_2 ((uint32_t)0x00040000U) /* SDCLK Frequency Select Value for DDR50 Bit2 */ +#define SDHOST_PV3STS_CLKFS_DDR50_3 ((uint32_t)0x00080000U) /* SDCLK Frequency Select Value for DDR50 Bit3 */ +#define SDHOST_PV3STS_CLKFS_DDR50_4 ((uint32_t)0x00100000U) /* SDCLK Frequency Select Value for DDR50 Bit4 */ +#define SDHOST_PV3STS_CLKFS_DDR50_5 ((uint32_t)0x00200000U) /* SDCLK Frequency Select Value for DDR50 Bit5 */ +#define SDHOST_PV3STS_CLKFS_DDR50_6 ((uint32_t)0x00400000U) /* SDCLK Frequency Select Value for DDR50 Bit6 */ +#define SDHOST_PV3STS_CLKFS_DDR50_7 ((uint32_t)0x00800000U) /* SDCLK Frequency Select Value for DDR50 Bit7 */ +#define SDHOST_PV3STS_CLKFS_DDR50_8 ((uint32_t)0x01000000U) /* SDCLK Frequency Select Value for DDR50 Bit8 */ +#define SDHOST_PV3STS_CLKFS_DDR50_9 ((uint32_t)0x02000000U) /* SDCLK Frequency Select Value for DDR50 Bit9 */ +#define SDHOST_PV3STS_CLKFS_SDR104 ((uint32_t)0x000003FFU) /* SDCLK Frequency Select Value for SDR104 */ +#define SDHOST_PV3STS_CLKFS_SDR104_0 ((uint32_t)0x00000001U) /* SDCLK Frequency Select Value for SDR104 Bit0 */ +#define SDHOST_PV3STS_CLKFS_SDR104_1 ((uint32_t)0x00000002U) /* SDCLK Frequency Select Value for SDR104 Bit1 */ +#define SDHOST_PV3STS_CLKFS_SDR104_2 ((uint32_t)0x00000004U) /* SDCLK Frequency Select Value for SDR104 Bit2 */ +#define SDHOST_PV3STS_CLKFS_SDR104_3 ((uint32_t)0x00000008U) /* SDCLK Frequency Select Value for SDR104 Bit3 */ +#define SDHOST_PV3STS_CLKFS_SDR104_4 ((uint32_t)0x00000010U) /* SDCLK Frequency Select Value for SDR104 Bit4 */ +#define SDHOST_PV3STS_CLKFS_SDR104_5 ((uint32_t)0x00000020U) /* SDCLK Frequency Select Value for SDR104 Bit5 */ +#define SDHOST_PV3STS_CLKFS_SDR104_6 ((uint32_t)0x00000040U) /* SDCLK Frequency Select Value for SDR104 Bit6 */ +#define SDHOST_PV3STS_CLKFS_SDR104_7 ((uint32_t)0x00000080U) /* SDCLK Frequency Select Value for SDR104 Bit7 */ +#define SDHOST_PV3STS_CLKFS_SDR104_8 ((uint32_t)0x00000100U) /* SDCLK Frequency Select Value for SDR104 Bit8 */ +#define SDHOST_PV3STS_CLKFS_SDR104_9 ((uint32_t)0x00000200U) /* SDCLK Frequency Select Value for SDR104 Bit9 */ + +/** Bit definition for SDHOST_BOOTTCTRL register **/ +#define SDHOST_BOOTTCTRL_CNT ((uint32_t)0xFFFFFFFFU) /* Boot Data Timeout Counter Value */ +#define SDHOST_BOOTTCTRL_CNT_0 ((uint32_t)0x00000001U) /* Boot Data Timeout Counter Value Bit0 */ +#define SDHOST_BOOTTCTRL_CNT_1 ((uint32_t)0x00000002U) /* Boot Data Timeout Counter Value Bit1 */ +#define SDHOST_BOOTTCTRL_CNT_2 ((uint32_t)0x00000004U) /* Boot Data Timeout Counter Value Bit2 */ +#define SDHOST_BOOTTCTRL_CNT_3 ((uint32_t)0x00000008U) /* Boot Data Timeout Counter Value Bit3 */ +#define SDHOST_BOOTTCTRL_CNT_4 ((uint32_t)0x00000010U) /* Boot Data Timeout Counter Value Bit4 */ +#define SDHOST_BOOTTCTRL_CNT_5 ((uint32_t)0x00000020U) /* Boot Data Timeout Counter Value Bit5 */ +#define SDHOST_BOOTTCTRL_CNT_6 ((uint32_t)0x00000040U) /* Boot Data Timeout Counter Value Bit6 */ +#define SDHOST_BOOTTCTRL_CNT_7 ((uint32_t)0x00000080U) /* Boot Data Timeout Counter Value Bit7 */ +#define SDHOST_BOOTTCTRL_CNT_8 ((uint32_t)0x00000100U) /* Boot Data Timeout Counter Value Bit8 */ +#define SDHOST_BOOTTCTRL_CNT_9 ((uint32_t)0x00000200U) /* Boot Data Timeout Counter Value Bit9 */ +#define SDHOST_BOOTTCTRL_CNT_10 ((uint32_t)0x00000400U) /* Boot Data Timeout Counter Value Bit10 */ +#define SDHOST_BOOTTCTRL_CNT_11 ((uint32_t)0x00000800U) /* Boot Data Timeout Counter Value Bit11 */ +#define SDHOST_BOOTTCTRL_CNT_12 ((uint32_t)0x00001000U) /* Boot Data Timeout Counter Value Bit12 */ +#define SDHOST_BOOTTCTRL_CNT_13 ((uint32_t)0x00002000U) /* Boot Data Timeout Counter Value Bit13 */ +#define SDHOST_BOOTTCTRL_CNT_14 ((uint32_t)0x00004000U) /* Boot Data Timeout Counter Value Bit14 */ +#define SDHOST_BOOTTCTRL_CNT_15 ((uint32_t)0x00008000U) /* Boot Data Timeout Counter Value Bit15 */ +#define SDHOST_BOOTTCTRL_CNT_16 ((uint32_t)0x00010000U) /* Boot Data Timeout Counter Value Bit16 */ +#define SDHOST_BOOTTCTRL_CNT_17 ((uint32_t)0x00020000U) /* Boot Data Timeout Counter Value Bit17 */ +#define SDHOST_BOOTTCTRL_CNT_18 ((uint32_t)0x00040000U) /* Boot Data Timeout Counter Value Bit18 */ +#define SDHOST_BOOTTCTRL_CNT_19 ((uint32_t)0x00080000U) /* Boot Data Timeout Counter Value Bit19 */ +#define SDHOST_BOOTTCTRL_CNT_20 ((uint32_t)0x00100000U) /* Boot Data Timeout Counter Value Bit20 */ +#define SDHOST_BOOTTCTRL_CNT_21 ((uint32_t)0x00200000U) /* Boot Data Timeout Counter Value Bit21 */ +#define SDHOST_BOOTTCTRL_CNT_22 ((uint32_t)0x00400000U) /* Boot Data Timeout Counter Value Bit22 */ +#define SDHOST_BOOTTCTRL_CNT_23 ((uint32_t)0x00800000U) /* Boot Data Timeout Counter Value Bit23 */ +#define SDHOST_BOOTTCTRL_CNT_24 ((uint32_t)0x01000000U) /* Boot Data Timeout Counter Value Bit24 */ +#define SDHOST_BOOTTCTRL_CNT_25 ((uint32_t)0x02000000U) /* Boot Data Timeout Counter Value Bit25 */ +#define SDHOST_BOOTTCTRL_CNT_26 ((uint32_t)0x04000000U) /* Boot Data Timeout Counter Value Bit26 */ +#define SDHOST_BOOTTCTRL_CNT_27 ((uint32_t)0x08000000U) /* Boot Data Timeout Counter Value Bit27 */ +#define SDHOST_BOOTTCTRL_CNT_28 ((uint32_t)0x10000000U) /* Boot Data Timeout Counter Value Bit28 */ +#define SDHOST_BOOTTCTRL_CNT_29 ((uint32_t)0x20000000U) /* Boot Data Timeout Counter Value Bit29 */ +#define SDHOST_BOOTTCTRL_CNT_30 ((uint32_t)0x40000000U) /* Boot Data Timeout Counter Value Bit30 */ +#define SDHOST_BOOTTCTRL_CNT_31 ((uint32_t)0x80000000U) /* Boot Data Timeout Counter Value Bit31 */ + + + +/******** DBG Module ********/ +/******** Bit definition for DBG_ID register ********/ +#define DBG_ID_IDCODE ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ + +/******** Bit definition for DBG_CTRL register ********/ +#define DBG_CTRL_TRACE_CFG ((uint32_t)0x00000400U) /* Bit[10] */ +#define DBG_CTRL_TRACE_MODE ((uint32_t)0x00000300U) /* Bit[9:8] */ +#define DBG_CTRL_TRACE_MODE_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define DBG_CTRL_TRACE_MODE_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define DBG_CTRL_TRACE_IOEN ((uint32_t)0x00000080U) /* Bit[7] */ +#define DBG_CTRL_TRGOEN ((uint32_t)0x00000040U) /* Bit[6] */ +#define DBG_CTRL_M7STBY ((uint32_t)0x00000020U) /* Bit[5] */ +#define DBG_CTRL_M7STOP ((uint32_t)0x00000010U) /* Bit[4] */ +#define DBG_CTRL_M7SLEEP ((uint32_t)0x00000008U) /* Bit[3] */ +#define DBG_CTRL_M4STBY ((uint32_t)0x00000004U) /* Bit[2] */ +#define DBG_CTRL_M4STOP ((uint32_t)0x00000002U) /* Bit[1] */ +#define DBG_CTRL_M4SLEEP ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for DBG_M7APB1FZ register ********/ +#define DBG_M7APB1FZ_CANFD5_STOP ((uint32_t)0x00040000U) /* Bit18*/ +#define DBG_M7APB1FZ_CANFD4_STOP ((uint32_t)0x00020000U) /* Bit17*/ +#define DBG_M7APB1FZ_CANFD2_STOP ((uint32_t)0x00010000U) /* Bit16*/ +#define DBG_M7APB1FZ_CANFD1_STOP ((uint32_t)0x00008000U) /* Bit15*/ +#define DBG_M7APB1FZ_WWDG2_STOP ((uint32_t)0x00004000U) /* Bit14 */ +#define DBG_M7APB1FZ_I2C3_STOP ((uint32_t)0x00002000U) /* Bit13*/ +#define DBG_M7APB1FZ_I2C2_STOP ((uint32_t)0x00001000U) /* Bit12*/ +#define DBG_M7APB1FZ_I2C1_STOP ((uint32_t)0x00000800U) /* Bit11*/ +#define DBG_M7APB1FZ_GTIMB3_STOP ((uint32_t)0x00000400U) /* Bit10*/ +#define DBG_M7APB1FZ_GTIMB2_STOP ((uint32_t)0x00000200U) /* Bit9*/ +#define DBG_M7APB1FZ_GTIMB1_STOP ((uint32_t)0x00000100U) /* Bit8*/ +#define DBG_M7APB1FZ_GTIMA7_STOP ((uint32_t)0x00000080U) /* Bit7*/ +#define DBG_M7APB1FZ_GTIMA6_STOP ((uint32_t)0x00000040U) /* Bit6*/ +#define DBG_M7APB1FZ_GTIMA5_STOP ((uint32_t)0x00000020U) /* Bit5*/ +#define DBG_M7APB1FZ_GTIMA4_STOP ((uint32_t)0x00000010U) /* Bit4*/ +#define DBG_M7APB1FZ_BTIM4_STOP ((uint32_t)0x00000008U) /* Bit3*/ +#define DBG_M7APB1FZ_BTIM3_STOP ((uint32_t)0x00000004U) /* Bit2*/ +#define DBG_M7APB1FZ_BTIM2_STOP ((uint32_t)0x00000002U) /* Bit1*/ +#define DBG_M7APB1FZ_BTIM1_STOP ((uint32_t)0x00000001U) /* Bit0*/ + +/******** Bit definition for DBG_M4APB1FZ register ********/ +#define DBG_M4APB1FZ_CANFD5_STOP ((uint32_t)0x00040000U) /* Bit18*/ +#define DBG_M4APB1FZ_CANFD4_STOP ((uint32_t)0x00020000U) /* Bit17*/ +#define DBG_M4APB1FZ_CANFD2_STOP ((uint32_t)0x00010000U) /* Bit16*/ +#define DBG_M4APB1FZ_CANFD1_STOP ((uint32_t)0x00008000U) /* Bit15*/ +#define DBG_M4APB1FZ_WWDG2_STOP ((uint32_t)0x00004000U) /* Bit14 */ +#define DBG_M4APB1FZ_I2C3_STOP ((uint32_t)0x00002000U) /* Bit13*/ +#define DBG_M4APB1FZ_I2C2_STOP ((uint32_t)0x00001000U) /* Bit12*/ +#define DBG_M4APB1FZ_I2C1_STOP ((uint32_t)0x00000800U) /* Bit11*/ +#define DBG_M4APB1FZ_GTIMB3_STOP ((uint32_t)0x00000400U) /* Bit10*/ +#define DBG_M4APB1FZ_GTIMB2_STOP ((uint32_t)0x00000200U) /* Bit9*/ +#define DBG_M4APB1FZ_GTIMB1_STOP ((uint32_t)0x00000100U) /* Bit8*/ +#define DBG_M4APB1FZ_GTIMA7_STOP ((uint32_t)0x00000080U) /* Bit7*/ +#define DBG_M4APB1FZ_GTIMA6_STOP ((uint32_t)0x00000040U) /* Bit6*/ +#define DBG_M4APB1FZ_GTIMA5_STOP ((uint32_t)0x00000020U) /* Bit5*/ +#define DBG_M4APB1FZ_GTIMA4_STOP ((uint32_t)0x00000010U) /* Bit4*/ +#define DBG_M4APB1FZ_BTIM4_STOP ((uint32_t)0x00000008U) /* Bit3*/ +#define DBG_M4APB1FZ_BTIM3_STOP ((uint32_t)0x00000004U) /* Bit2*/ +#define DBG_M4APB1FZ_BTIM2_STOP ((uint32_t)0x00000002U) /* Bit1*/ +#define DBG_M4APB1FZ_BTIM1_STOP ((uint32_t)0x00000001U) /* Bit0*/ + +/******** Bit definition for DBG_M7APB2FZ register ********/ +#define DBG_M7APB2FZ_CANFD8_STOP ((uint32_t)0x00002000U) /* Bit13*/ +#define DBG_M7APB2FZ_CANFD7_STOP ((uint32_t)0x00001000U) /* Bit12*/ +#define DBG_M7APB2FZ_CANFD4_STOP ((uint32_t)0x00000800U) /* Bit11*/ +#define DBG_M7APB2FZ_CANFD3_STOP ((uint32_t)0x00000400U) /* Bit10*/ +#define DBG_M7APB2FZ_I2C6_STOP ((uint32_t)0x00000200U) /* Bit9*/ +#define DBG_M7APB2FZ_I2C5_STOP ((uint32_t)0x00000100U) /* Bit8*/ +#define DBG_M7APB2FZ_I2C4_STOP ((uint32_t)0x00000080U) /* Bit7*/ +#define DBG_M7APB2FZ_ATIM2_STOP ((uint32_t)0x00000040U) /* Bit6*/ +#define DBG_M7APB2FZ_ATIM1_STOP ((uint32_t)0x00000020U) /* Bit5*/ +#define DBG_M7APB2FZ_GTIMA3_STOP ((uint32_t)0x00000010U) /* Bit4*/ +#define DBG_M7APB2FZ_GTIMA2_STOP ((uint32_t)0x00000008U) /* Bit3*/ +#define DBG_M7APB2FZ_GTIMA1_STOP ((uint32_t)0x00000004U) /* Bit2*/ +#define DBG_M7APB2FZ_SHRTIM2_STOP ((uint32_t)0x00000002U) /* Bit1*/ +#define DBG_M7APB2FZ_SHRTIM1_STOP ((uint32_t)0x00000001U) /* Bit0*/ +/******** Bit definition for DBG_M4APB2FZ register ********/ +#define DBG_M4APB2FZ_CANFD8_STOP ((uint32_t)0x00002000U) /* Bit13*/ +#define DBG_M4APB2FZ_CANFD7_STOP ((uint32_t)0x00001000U) /* Bit12*/ +#define DBG_M4APB2FZ_CANFD4_STOP ((uint32_t)0x00000800U) /* Bit11*/ +#define DBG_M4APB2FZ_CANFD3_STOP ((uint32_t)0x00000400U) /* Bit10*/ +#define DBG_M4APB2FZ_I2C6_STOP ((uint32_t)0x00000200U) /* Bit9*/ +#define DBG_M4APB2FZ_I2C5_STOP ((uint32_t)0x00000100U) /* Bit8*/ +#define DBG_M4APB2FZ_I2C4_STOP ((uint32_t)0x00000080U) /* Bit7*/ +#define DBG_M4APB2FZ_ATIM2_STOP ((uint32_t)0x00000040U) /* Bit6*/ +#define DBG_M4APB2FZ_ATIM1_STOP ((uint32_t)0x00000020U) /* Bit5*/ +#define DBG_M4APB2FZ_GTIMA3_STOP ((uint32_t)0x00000010U) /* Bit4*/ +#define DBG_M4APB2FZ_GTIMA2_STOP ((uint32_t)0x00000008U) /* Bit3*/ +#define DBG_M4APB2FZ_GTIMA1_STOP ((uint32_t)0x00000004U) /* Bit2*/ +#define DBG_M4APB2FZ_SHRTIM2_STOP ((uint32_t)0x00000002U) /* Bit1*/ +#define DBG_M4APB2FZ_SHRTIM1_STOP ((uint32_t)0x00000001U) /* Bit0*/ + +/******** Bit definition for DBG_M7APB5FZ register ********/ +#define DBG_M7APB5FZ_RTC_STOP ((uint32_t)0x00002000U) /* Bit13 */ +#define DBG_M7APB5FZ_LPTIM5_STOP ((uint32_t)0x00001000U) /* Bit12*/ +#define DBG_M7APB5FZ_LPTIM4_STOP ((uint32_t)0x00000800U) /* Bit11*/ +#define DBG_M7APB5FZ_LPTIM3_STOP ((uint32_t)0x00000400U) /* Bit10*/ +#define DBG_M7APB5FZ_LPTIM2_STOP ((uint32_t)0x00000200U) /* Bit9*/ +#define DBG_M7APB5FZ_LPTIM1_STOP ((uint32_t)0x00000100U) /* Bit8*/ +#define DBG_M7APB5FZ_IWDG2_STOP ((uint32_t)0x00000080U) /* Bit7*/ +#define DBG_M7APB5FZ_IWDG1_STOP ((uint32_t)0x00000040U) /* Bit6*/ +#define DBG_M7APB5FZ_I2C10_STOP ((uint32_t)0x00000020U) /* Bit5*/ +#define DBG_M7APB5FZ_I2C9_STOP ((uint32_t)0x00000010U) /* Bit4*/ +#define DBG_M7APB5FZ_I2C8_STOP ((uint32_t)0x00000008U) /* Bit3*/ +#define DBG_M7APB5FZ_I2C7_STOP ((uint32_t)0x00000004U) /* Bit2*/ +#define DBG_M7APB5FZ_ATIM4_STOP ((uint32_t)0x00000002U) /* Bit1*/ +#define DBG_M7APB5FZ_ATIM3_STOP ((uint32_t)0x00000001U) /* Bit0*/ + +/******** Bit definition for DBG_M4APB5FZ register ********/ +#define DBG_M4APB5FZ_RTC_STOP ((uint32_t)0x00002000U) /* Bit13 */ +#define DBG_M4APB5FZ_LPTIM5_STOP ((uint32_t)0x00001000U) /* Bit12*/ +#define DBG_M4APB5FZ_LPTIM4_STOP ((uint32_t)0x00000800U) /* Bit11*/ +#define DBG_M4APB5FZ_LPTIM3_STOP ((uint32_t)0x00000400U) /* Bit10*/ +#define DBG_M4APB5FZ_LPTIM2_STOP ((uint32_t)0x00000200U) /* Bit9*/ +#define DBG_M4APB5FZ_LPTIM1_STOP ((uint32_t)0x00000100U) /* Bit8*/ +#define DBG_M4APB5FZ_IWDG2_STOP ((uint32_t)0x00000080U) /* Bit7*/ +#define DBG_M4APB5FZ_IWDG1_STOP ((uint32_t)0x00000040U) /* Bit6*/ +#define DBG_M4APB5FZ_I2C10_STOP ((uint32_t)0x00000020U) /* Bit5*/ +#define DBG_M4APB5FZ_I2C9_STOP ((uint32_t)0x00000010U) /* Bit4*/ +#define DBG_M4APB5FZ_I2C8_STOP ((uint32_t)0x00000008U) /* Bit3*/ +#define DBG_M4APB5FZ_I2C7_STOP ((uint32_t)0x00000004U) /* Bit2*/ +#define DBG_M4APB5FZ_ATIM4_STOP ((uint32_t)0x00000002U) /* Bit1*/ +#define DBG_M4APB5FZ_ATIM3_STOP ((uint32_t)0x00000001U) /* Bit0*/ + +/******** Bit definition for DBG_M7APB6FZ register ********/ +#define DBG_M7APB6FZ_WWDG1_STOP ((uint32_t)0x00000001U) /* Bit[0] */ + +/******** Bit definition for DBG_M4APB6FZ register ********/ +#define DBG_M4APB6FZ_WWDG1_STOP ((uint32_t)0x00000001U) /* Bit[0] */ + + +/******** ECCMON Module ********/ +/******** Bit definition for ECCMON_CTRL1 register ********/ +#define ECCMON_CTRL1_E2INTEN6 ((uint32_t)0x20000000) /* Bit[29] */ +#define ECCMON_CTRL1_E2INTEN5 ((uint32_t)0x10000000) /* Bit[28] */ +#define ECCMON_CTRL1_E2INTEN4 ((uint32_t)0x08000000) /* Bit[27] */ +#define ECCMON_CTRL1_E2INTEN3 ((uint32_t)0x04000000) /* Bit[26] */ +#define ECCMON_CTRL1_E2INTEN2 ((uint32_t)0x02000000) /* Bit[25] */ +#define ECCMON_CTRL1_E2INTEN1 ((uint32_t)0x01000000) /* Bit[24] */ +#define ECCMON_CTRL1_E1INTEN6 ((uint32_t)0x00200000) /* Bit[21] */ +#define ECCMON_CTRL1_E1INTEN5 ((uint32_t)0x00100000) /* Bit[20] */ +#define ECCMON_CTRL1_E1INTEN4 ((uint32_t)0x00080000) /* Bit[19] */ +#define ECCMON_CTRL1_E1INTEN3 ((uint32_t)0x00040000) /* Bit[18] */ +#define ECCMON_CTRL1_E1INTEN2 ((uint32_t)0x00020000) /* Bit[17] */ +#define ECCMON_CTRL1_E1INTEN1 ((uint32_t)0x00010000) /* Bit[16] */ +#define ECCMON_CTRL1_TDRBYP6 ((uint32_t)0x00002000) /* Bit[13] */ +#define ECCMON_CTRL1_TDRBYP5 ((uint32_t)0x00001000) /* Bit[12] */ +#define ECCMON_CTRL1_TDRBYP4 ((uint32_t)0x00000800) /* Bit[11] */ +#define ECCMON_CTRL1_TDRBYP3 ((uint32_t)0x00000400) /* Bit[10] */ +#define ECCMON_CTRL1_TDRBYP2 ((uint32_t)0x00000200) /* Bit[9] */ +#define ECCMON_CTRL1_TDRBYP1 ((uint32_t)0x00000100) /* Bit[8] */ +#define ECCMON_CTRL1_ECCEN6 ((uint32_t)0x00000020) /* Bit[5] */ +#define ECCMON_CTRL1_ECCEN5 ((uint32_t)0x00000010) /* Bit[4] */ +#define ECCMON_CTRL1_ECCEN4 ((uint32_t)0x00000008) /* Bit[3] */ +#define ECCMON_CTRL1_ECCEN3 ((uint32_t)0x00000004) /* Bit[2] */ +#define ECCMON_CTRL1_ECCEN2 ((uint32_t)0x00000002) /* Bit[1] */ +#define ECCMON_CTRL1_ECCEN1 ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for ECCMON_CTRL2 register ********/ +#define ECCMON_CTRL2_E2FOEN6 ((uint32_t)0x20000000) /* Bit[29] */ +#define ECCMON_CTRL2_E2FOEN5 ((uint32_t)0x10000000) /* Bit[28] */ +#define ECCMON_CTRL2_E2FOEN4 ((uint32_t)0x08000000) /* Bit[27] */ +#define ECCMON_CTRL2_E2FOEN3 ((uint32_t)0x04000000) /* Bit[26] */ +#define ECCMON_CTRL2_E2FOEN2 ((uint32_t)0x02000000) /* Bit[25] */ +#define ECCMON_CTRL2_E2FOEN1 ((uint32_t)0x01000000) /* Bit[24] */ +#define ECCMON_CTRL2_E1FOEN6 ((uint32_t)0x00200000) /* Bit[21] */ +#define ECCMON_CTRL2_E1FOEN5 ((uint32_t)0x00100000) /* Bit[20] */ +#define ECCMON_CTRL2_E1FOEN4 ((uint32_t)0x00080000) /* Bit[19] */ +#define ECCMON_CTRL2_E1FOEN3 ((uint32_t)0x00040000) /* Bit[18] */ +#define ECCMON_CTRL2_E1FOEN2 ((uint32_t)0x00020000) /* Bit[17] */ +#define ECCMON_CTRL2_E1FOEN1 ((uint32_t)0x00010000) /* Bit[16] */ +#define ECCMON_CTRL2_WROE2EN6 ((uint32_t)0x00000020) /* Bit[5] */ +#define ECCMON_CTRL2_WROE2EN5 ((uint32_t)0x00000010) /* Bit[4] */ +#define ECCMON_CTRL2_WROE2EN4 ((uint32_t)0x00000008) /* Bit[3] */ +#define ECCMON_CTRL2_WROE2EN3 ((uint32_t)0x00000004) /* Bit[2] */ +#define ECCMON_CTRL2_WROE2EN2 ((uint32_t)0x00000002) /* Bit[1] */ +#define ECCMON_CTRL2_WROE2EN1 ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for ECCMON_EINJ register ********/ +#define ECCMON_EINJ_ECSEL6 ((uint32_t)0x0C000000) /* Bit[27:26] */ +#define ECCMON_EINJ_ECSEL6_0 ((uint32_t)0x04000000) /* Bit26*/ +#define ECCMON_EINJ_ECSEL6_1 ((uint32_t)0x08000000) /* Bit27*/ +#define ECCMON_EINJ_ECSEL5 ((uint32_t)0x03000000) /* Bit[25:24] */ +#define ECCMON_EINJ_ECSEL5_0 ((uint32_t)0x01000000) /* Bit24*/ +#define ECCMON_EINJ_ECSEL5_1 ((uint32_t)0x02000000) /* Bit25*/ +#define ECCMON_EINJ_ECSEL4 ((uint32_t)0x00C00000) /* Bit[23:22] */ +#define ECCMON_EINJ_ECSEL4_0 ((uint32_t)0x00400000) /* Bit22*/ +#define ECCMON_EINJ_ECSEL4_1 ((uint32_t)0x00800000) /* Bit23*/ +#define ECCMON_EINJ_ECSEL3 ((uint32_t)0x00300000) /* Bit[21:20] */ +#define ECCMON_EINJ_ECSEL3_0 ((uint32_t)0x00100000) /* Bit20*/ +#define ECCMON_EINJ_ECSEL3_1 ((uint32_t)0x00200000) /* Bit21*/ +#define ECCMON_EINJ_ECSEL2 ((uint32_t)0x000C0000) /* Bit[19:18] */ +#define ECCMON_EINJ_ECSEL2_0 ((uint32_t)0x00040000) /* Bit18*/ +#define ECCMON_EINJ_ECSEL2_1 ((uint32_t)0x00080000) /* Bit19*/ +#define ECCMON_EINJ_ECSEL1 ((uint32_t)0x00030000) /* Bit[17:16] */ +#define ECCMON_EINJ_ECSEL1_0 ((uint32_t)0x00010000) /* Bit16*/ +#define ECCMON_EINJ_ECSEL1_1 ((uint32_t)0x00020000) /* Bit17*/ +#define ECCMON_EINJ_ERICTR6 ((uint32_t)0x00000C00) /* Bit[11:10] */ +#define ECCMON_EINJ_ERICTR6_0 ((uint32_t)0x00000400) /* Bit10*/ +#define ECCMON_EINJ_ERICTR6_1 ((uint32_t)0x00000800) /* Bit11*/ +#define ECCMON_EINJ_ERICTR5 ((uint32_t)0x00000300) /* Bit[9:8] */ +#define ECCMON_EINJ_ERICTR5_0 ((uint32_t)0x00000100) /* Bit8*/ +#define ECCMON_EINJ_ERICTR5_1 ((uint32_t)0x00000200) /* Bit9*/ +#define ECCMON_EINJ_ERICTR4 ((uint32_t)0x000000C0) /* Bit[7:6] */ +#define ECCMON_EINJ_ERICTR4_0 ((uint32_t)0x00000040) /* Bit6*/ +#define ECCMON_EINJ_ERICTR4_1 ((uint32_t)0x00000080) /* Bit7*/ +#define ECCMON_EINJ_ERICTR3 ((uint32_t)0x00000030) /* Bit[5:4] */ +#define ECCMON_EINJ_ERICTR3_0 ((uint32_t)0x00000010) /* Bit4*/ +#define ECCMON_EINJ_ERICTR3_1 ((uint32_t)0x00000020) /* Bit5*/ +#define ECCMON_EINJ_ERICTR2 ((uint32_t)0x0000000C) /* Bit[3:2] */ +#define ECCMON_EINJ_ERICTR2_0 ((uint32_t)0x00000004) /* Bit2*/ +#define ECCMON_EINJ_ERICTR2_1 ((uint32_t)0x00000008) /* Bit3*/ +#define ECCMON_EINJ_ERICTR1 ((uint32_t)0x00000003) /* Bit[1:0] */ +#define ECCMON_EINJ_ERICTR1_0 ((uint32_t)0x00000001) /* Bit0*/ +#define ECCMON_EINJ_ERICTR1_1 ((uint32_t)0x00000002) /* Bit1*/ + +/******** Bit definition for ECCMON_INTFS register ********/ +#define ECCMON_INTFS_E2DCIF6 ((uint32_t)0x00200000) /* Bit[21] */ +#define ECCMON_INTFS_E2DCIF5 ((uint32_t)0x00100000) /* Bit[20] */ +#define ECCMON_INTFS_E2DCIF4 ((uint32_t)0x00080000) /* Bit[19] */ +#define ECCMON_INTFS_E2DCIF3 ((uint32_t)0x00040000) /* Bit[18] */ +#define ECCMON_INTFS_E2DCIF2 ((uint32_t)0x00020000) /* Bit[17] */ +#define ECCMON_INTFS_E2DCIF1 ((uint32_t)0x00010000) /* Bit[16] */ +#define ECCMON_INTFS_E1DCIF6 ((uint32_t)0x00000020) /* Bit[5] */ +#define ECCMON_INTFS_E1DCIF5 ((uint32_t)0x00000010) /* Bit[4] */ +#define ECCMON_INTFS_E1DCIF4 ((uint32_t)0x00000008) /* Bit[3] */ +#define ECCMON_INTFS_E1DCIF3 ((uint32_t)0x00000004) /* Bit[2] */ +#define ECCMON_INTFS_E1DCIF2 ((uint32_t)0x00000002) /* Bit[1] */ +#define ECCMON_INTFS_E1DCIF1 ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for ECCMON_INTF1 register ********/ +#define ECCMON_INTF1_E2DCIFR ((uint32_t)0x00000008) /* Bit[3] */ +#define ECCMON_INTF1_E1DCIFR ((uint32_t)0x00000004) /* Bit[2] */ +#define ECCMON_INTF1_E2DCIFW ((uint32_t)0x00000002) /* Bit[1] */ +#define ECCMON_INTF1_E1DCIFW ((uint32_t)0x00000001) /* Bit[0] */ + +/******** Bit definition for ECCMON_FEADR1 register ********/ +#define ECCMON_FEADR1_E2EAD ((uint32_t)0x80000000) /* Bit[31] */ +#define ECCMON_FEADR1_E1EAD ((uint32_t)0x40000000) /* Bit[30] */ +#define ECCMON_FEADR1_EER ((uint32_t)0x20000000) /* Bit[29] */ +#define ECCMON_FEADR1_EEW ((uint32_t)0x10000000) /* Bit[28] */ +#define ECCMON_FEADR1_EFADR ((uint32_t)0x0FFFFFFF) /* Bit[27:0] */ +#define ECCMON_FEADR1_EFADR_0 ((uint32_t)0x00000001) /* Bit0*/ +#define ECCMON_FEADR1_EFADR_1 ((uint32_t)0x00000002) /* Bit1*/ +#define ECCMON_FEADR1_EFADR_2 ((uint32_t)0x00000004) /* Bit2*/ +#define ECCMON_FEADR1_EFADR_3 ((uint32_t)0x00000008) /* Bit3*/ +#define ECCMON_FEADR1_EFADR_4 ((uint32_t)0x00000010) /* Bit4*/ +#define ECCMON_FEADR1_EFADR_5 ((uint32_t)0x00000020) /* Bit5*/ +#define ECCMON_FEADR1_EFADR_6 ((uint32_t)0x00000040) /* Bit6*/ +#define ECCMON_FEADR1_EFADR_7 ((uint32_t)0x00000080) /* Bit7*/ +#define ECCMON_FEADR1_EFADR_8 ((uint32_t)0x00000100) /* Bit8*/ +#define ECCMON_FEADR1_EFADR_9 ((uint32_t)0x00000200) /* Bit9*/ +#define ECCMON_FEADR1_EFADR_10 ((uint32_t)0x00000400) /* Bit10*/ +#define ECCMON_FEADR1_EFADR_11 ((uint32_t)0x00000800) /* Bit11*/ +#define ECCMON_FEADR1_EFADR_12 ((uint32_t)0x00001000) /* Bit12*/ +#define ECCMON_FEADR1_EFADR_13 ((uint32_t)0x00002000) /* Bit13*/ +#define ECCMON_FEADR1_EFADR_14 ((uint32_t)0x00004000) /* Bit14*/ +#define ECCMON_FEADR1_EFADR_15 ((uint32_t)0x00008000) /* Bit15*/ +#define ECCMON_FEADR1_EFADR_16 ((uint32_t)0x00010000) /* Bit16*/ +#define ECCMON_FEADR1_EFADR_17 ((uint32_t)0x00020000) /* Bit17*/ +#define ECCMON_FEADR1_EFADR_18 ((uint32_t)0x00040000) /* Bit18*/ +#define ECCMON_FEADR1_EFADR_19 ((uint32_t)0x00080000) /* Bit19*/ +#define ECCMON_FEADR1_EFADR_20 ((uint32_t)0x00100000) /* Bit20*/ +#define ECCMON_FEADR1_EFADR_21 ((uint32_t)0x00200000) /* Bit21*/ +#define ECCMON_FEADR1_EFADR_22 ((uint32_t)0x00400000) /* Bit22*/ +#define ECCMON_FEADR1_EFADR_23 ((uint32_t)0x00800000) /* Bit23*/ +#define ECCMON_FEADR1_EFADR_24 ((uint32_t)0x01000000) /* Bit24*/ +#define ECCMON_FEADR1_EFADR_25 ((uint32_t)0x02000000) /* Bit25*/ +#define ECCMON_FEADR1_EFADR_26 ((uint32_t)0x04000000) /* Bit26*/ +#define ECCMON_FEADR1_EFADR_27 ((uint32_t)0x08000000) /* Bit27*/ + +/******** Bit definition for ECCMON_FEDATL1 register ********/ +#define ECCMON_FEDATL1_ERDATL ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ +#define ECCMON_FEDATL1_ERDATL_0 ((uint32_t)0x00000001) /* Bit0*/ +#define ECCMON_FEDATL1_ERDATL_1 ((uint32_t)0x00000002) /* Bit1*/ +#define ECCMON_FEDATL1_ERDATL_2 ((uint32_t)0x00000004) /* Bit2*/ +#define ECCMON_FEDATL1_ERDATL_3 ((uint32_t)0x00000008) /* Bit3*/ +#define ECCMON_FEDATL1_ERDATL_4 ((uint32_t)0x00000010) /* Bit4*/ +#define ECCMON_FEDATL1_ERDATL_5 ((uint32_t)0x00000020) /* Bit5*/ +#define ECCMON_FEDATL1_ERDATL_6 ((uint32_t)0x00000040) /* Bit6*/ +#define ECCMON_FEDATL1_ERDATL_7 ((uint32_t)0x00000080) /* Bit7*/ +#define ECCMON_FEDATL1_ERDATL_8 ((uint32_t)0x00000100) /* Bit8*/ +#define ECCMON_FEDATL1_ERDATL_9 ((uint32_t)0x00000200) /* Bit9*/ +#define ECCMON_FEDATL1_ERDATL_10 ((uint32_t)0x00000400) /* Bit10*/ +#define ECCMON_FEDATL1_ERDATL_11 ((uint32_t)0x00000800) /* Bit11*/ +#define ECCMON_FEDATL1_ERDATL_12 ((uint32_t)0x00001000) /* Bit12*/ +#define ECCMON_FEDATL1_ERDATL_13 ((uint32_t)0x00002000) /* Bit13*/ +#define ECCMON_FEDATL1_ERDATL_14 ((uint32_t)0x00004000) /* Bit14*/ +#define ECCMON_FEDATL1_ERDATL_15 ((uint32_t)0x00008000) /* Bit15*/ +#define ECCMON_FEDATL1_ERDATL_16 ((uint32_t)0x00010000) /* Bit16*/ +#define ECCMON_FEDATL1_ERDATL_17 ((uint32_t)0x00020000) /* Bit17*/ +#define ECCMON_FEDATL1_ERDATL_18 ((uint32_t)0x00040000) /* Bit18*/ +#define ECCMON_FEDATL1_ERDATL_19 ((uint32_t)0x00080000) /* Bit19*/ +#define ECCMON_FEDATL1_ERDATL_20 ((uint32_t)0x00100000) /* Bit20*/ +#define ECCMON_FEDATL1_ERDATL_21 ((uint32_t)0x00200000) /* Bit21*/ +#define ECCMON_FEDATL1_ERDATL_22 ((uint32_t)0x00400000) /* Bit22*/ +#define ECCMON_FEDATL1_ERDATL_23 ((uint32_t)0x00800000) /* Bit23*/ +#define ECCMON_FEDATL1_ERDATL_24 ((uint32_t)0x01000000) /* Bit24*/ +#define ECCMON_FEDATL1_ERDATL_25 ((uint32_t)0x02000000) /* Bit25*/ +#define ECCMON_FEDATL1_ERDATL_26 ((uint32_t)0x04000000) /* Bit26*/ +#define ECCMON_FEDATL1_ERDATL_27 ((uint32_t)0x08000000) /* Bit27*/ +#define ECCMON_FEDATL1_ERDATL_28 ((uint32_t)0x10000000) /* Bit28*/ +#define ECCMON_FEDATL1_ERDATL_29 ((uint32_t)0x20000000) /* Bit29*/ +#define ECCMON_FEDATL1_ERDATL_30 ((uint32_t)0x40000000) /* Bit30*/ +#define ECCMON_FEDATL1_ERDATL_31 ((uint32_t)0x80000000) /* Bit31*/ + +/******** Bit definition for ECCMON_FEDATH1 register ********/ +#define ECCMON_FEDATH1_ERDATH ((uint32_t)0xFFFFFFFF) /* Bit[31:0] */ +#define ECCMON_FEDATH1_ERDATH_0 ((uint32_t)0x00000001) /* Bit0*/ +#define ECCMON_FEDATH1_ERDATH_1 ((uint32_t)0x00000002) /* Bit1*/ +#define ECCMON_FEDATH1_ERDATH_2 ((uint32_t)0x00000004) /* Bit2*/ +#define ECCMON_FEDATH1_ERDATH_3 ((uint32_t)0x00000008) /* Bit3*/ +#define ECCMON_FEDATH1_ERDATH_4 ((uint32_t)0x00000010) /* Bit4*/ +#define ECCMON_FEDATH1_ERDATH_5 ((uint32_t)0x00000020) /* Bit5*/ +#define ECCMON_FEDATH1_ERDATH_6 ((uint32_t)0x00000040) /* Bit6*/ +#define ECCMON_FEDATH1_ERDATH_7 ((uint32_t)0x00000080) /* Bit7*/ +#define ECCMON_FEDATH1_ERDATH_8 ((uint32_t)0x00000100) /* Bit8*/ +#define ECCMON_FEDATH1_ERDATH_9 ((uint32_t)0x00000200) /* Bit9*/ +#define ECCMON_FEDATH1_ERDATH_10 ((uint32_t)0x00000400) /* Bit10*/ +#define ECCMON_FEDATH1_ERDATH_11 ((uint32_t)0x00000800) /* Bit11*/ +#define ECCMON_FEDATH1_ERDATH_12 ((uint32_t)0x00001000) /* Bit12*/ +#define ECCMON_FEDATH1_ERDATH_13 ((uint32_t)0x00002000) /* Bit13*/ +#define ECCMON_FEDATH1_ERDATH_14 ((uint32_t)0x00004000) /* Bit14*/ +#define ECCMON_FEDATH1_ERDATH_15 ((uint32_t)0x00008000) /* Bit15*/ +#define ECCMON_FEDATH1_ERDATH_16 ((uint32_t)0x00010000) /* Bit16*/ +#define ECCMON_FEDATH1_ERDATH_17 ((uint32_t)0x00020000) /* Bit17*/ +#define ECCMON_FEDATH1_ERDATH_18 ((uint32_t)0x00040000) /* Bit18*/ +#define ECCMON_FEDATH1_ERDATH_19 ((uint32_t)0x00080000) /* Bit19*/ +#define ECCMON_FEDATH1_ERDATH_20 ((uint32_t)0x00100000) /* Bit20*/ +#define ECCMON_FEDATH1_ERDATH_21 ((uint32_t)0x00200000) /* Bit21*/ +#define ECCMON_FEDATH1_ERDATH_22 ((uint32_t)0x00400000) /* Bit22*/ +#define ECCMON_FEDATH1_ERDATH_23 ((uint32_t)0x00800000) /* Bit23*/ +#define ECCMON_FEDATH1_ERDATH_24 ((uint32_t)0x01000000) /* Bit24*/ +#define ECCMON_FEDATH1_ERDATH_25 ((uint32_t)0x02000000) /* Bit25*/ +#define ECCMON_FEDATH1_ERDATH_26 ((uint32_t)0x04000000) /* Bit26*/ +#define ECCMON_FEDATH1_ERDATH_27 ((uint32_t)0x08000000) /* Bit27*/ +#define ECCMON_FEDATH1_ERDATH_28 ((uint32_t)0x10000000) /* Bit28*/ +#define ECCMON_FEDATH1_ERDATH_29 ((uint32_t)0x20000000) /* Bit29*/ +#define ECCMON_FEDATH1_ERDATH_30 ((uint32_t)0x40000000) /* Bit30*/ +#define ECCMON_FEDATH1_ERDATH_31 ((uint32_t)0x80000000) /* Bit31*/ + +/******** Bit definition for ECCMON_FECOD1 register ********/ +#define ECCMON_FECOD1_ERCOD ((uint32_t)0x0000007F) /* Bit[6:0] */ +#define ECCMON_FECOD1_ERCOD_0 ((uint32_t)0x00000001) /* Bit0*/ +#define ECCMON_FECOD1_ERCOD_1 ((uint32_t)0x00000002) /* Bit1*/ +#define ECCMON_FECOD1_ERCOD_2 ((uint32_t)0x00000004) /* Bit2*/ +#define ECCMON_FECOD1_ERCOD_3 ((uint32_t)0x00000008) /* Bit3*/ +#define ECCMON_FECOD1_ERCOD_4 ((uint32_t)0x00000010) /* Bit4*/ +#define ECCMON_FECOD1_ERCOD_5 ((uint32_t)0x00000020) /* Bit5*/ +#define ECCMON_FECOD1_ERCOD_6 ((uint32_t)0x00000040) /* Bit6*/ + +/*** OPTC register ***/ +/** Bit definition for OTPC_CTRL register **/ +#define OTPC_CTRL_BEEN ((uint32_t)0x00000040U) /* Bit[6] Busy Error Interrupt Control */ +#define OTPC_CTRL_OOREEN ((uint32_t)0x00000020U) /* Bit[5] Operate Over Region Error Interrupt Control */ +#define OTPC_CTRL_RDPEEN ((uint32_t)0x00000010U) /* Bit[4] Read Protected Error Interrupt Control */ +#define OTPC_CTRL_WRPEEN ((uint32_t)0x00000008U) /* Bit[3] Write Protected Error Interrupt Control */ +#define OTPC_CTRL_PGEEN ((uint32_t)0x00000004U) /* Bit[2] Program Error Interrupt Control */ +#define OTPC_CTRL_PRMD ((uint32_t)0x00000002U) /* Bit[1] Read or Write Control */ +#define OTPC_CTRL_LOCK ((uint32_t)0x00000001U) /* Bit[0] Lock Control */ + +/** Bit definition for OTPC_STS register **/ +#define OTPC_STS_BE ((uint32_t)0x00000040U) /* Bit[6] Busy Error Flag */ +#define OTPC_STS_OORE ((uint32_t)0x00000020U) /* Bit[5] Operate Over Region Error Flag */ +#define OTPC_STS_RDPE ((uint32_t)0x00000010U) /* Bit[4] Read Protected Error Flag */ +#define OTPC_STS_WRPE ((uint32_t)0x00000008U) /* Bit[3] Write Protected Error Flag */ +#define OTPC_STS_PGE ((uint32_t)0x00000004U) /* Bit[2] Program Error Flag */ +#define OTPC_STS_KEYE ((uint32_t)0x00000002U) /* Bit[1] Unlock Err Flag */ +#define OTPC_STS_BUSY ((uint32_t)0x00000001U) /* Bit[0] Busy Flag */ + +/** Bit definition for OTPC_KEY register **/ +#define OTPC_KEY_KEY ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Unlock Key */ + +/** Bit definition for OTPC_USC register **/ +#define OTPC_USC_VAL ((uint32_t)0x000001FFU) /* Bit[8:0] 1us Counter */ + + +/** Bit definition for OTPC_ADDR register **/ +#define OTPC_ADDR_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Operate Address of the OTP */ + +/** Bit definition for OTPC_RDATA register **/ +#define OTPC_RDATA_DAT ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Read Data */ + +/** Bit definition for OTPC_WDATA register **/ +#define OTPC_WDATA_DAT ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Program Data */ + +/** Bit definition for OTPC_SECJVLD register **/ +#define OTPC_SECJVLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] SEC_JTAG Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_SECMDVLD register **/ +#define OTPC_SECMDVLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] SEC_MODE Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_RDP2PVLD register **/ +#define OTPC_RDP2PVLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] RDP2_PROG Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_BTMVLD register **/ +#define OTPC_BTMVLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] BTM Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_BORVLD register **/ +#define OTPC_BORVLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] BOR Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_IWDGVLD register **/ +#define OTPC_IWDGVLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] IWDG Multi-Copies Valid Tag */ + + +/** Bit definition for OTPC_TCMSZVLD register **/ +#define OTPC_TCMSZVLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] TCM SIZE Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_JTAGKVLD register **/ +#define OTPC_JTAGKVLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] JTAG_KEY Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_REKU1VLD register **/ +#define OTPC_REKU1VLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] REK_UNIT1 Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_REKU2VLD register **/ +#define OTPC_REKU2VLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] REK_UNIT2 Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_REKU3VLD register **/ +#define OTPC_REKU3VLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] REK_UNIT3 Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_REKU4V register **/ +#define OTPC_REKU4VLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] REK_UNIT4 Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_IDKU1VLD register **/ +#define OTPC_IDKU1VLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] IDK_UNIT1 Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_IDKU2VLD register **/ +#define OTPC_IDKU2VLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] IDK_UNIT2 Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_IDKU3VLD register **/ +#define OTPC_IDKU3VLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] IDK_UNIT3 Multi-Copies Valid Tag */ + +/** Bit definition for OTPC_IDKU4VLD register **/ +#define OTPC_IDKU4VLD_IDX ((uint32_t)0x0000FFFFU) /* Bit[15:0] IDK_UNIT4 Multi-Copies Valid Tag */ + + +/** Bit definition for OTPC_UMUU0 register **/ +#define OTPC_UMUU0_UU ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] User Memory Unused Flag */ + +/** Bit definition for OTPC_UMUU1 register **/ +#define OTPC_UMUU1_UU ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] User Memory Unused Flag */ + +/** Bit definition for OTPC_UMUU2 register **/ +#define OTPC_UMUU2_UU ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] User Memory Unused Flag */ + +/** Bit definition for OTPC_UMUU3 register **/ +#define OTPC_UMUU3_UU ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] User Memory Unused Flag */ + +/** Bit definition for OTPC_UMUU4 register **/ +#define OTPC_UMUU4_UU ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] User Memory Unused Flag */ + +/** Bit definition for OTPC_UMUU5 register **/ +#define OTPC_UMUU5_UU ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] User Memory Unused Flag */ + +/** Bit definition for OTPC_UMUU6 register **/ +#define OTPC_UMUU6_UU ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] User Memory Unused Flag */ + +/** Bit definition for OTPC_UMUU7 register **/ +#define OTPC_UMUU7_UU ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] User Memory Unused Flag */ + +/** Bit definition for OTPC_CRLD1 register **/ +#define OTPC_CRLD1_NRIWDG ((uint32_t)0x3FFF0000U) /* Bit[29:16] SYS_CFG_NRST_IWDG_OTP Payload Data */ +#define OTPC_CRLD1_NRIWDG_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define OTPC_CRLD1_NRIWDG_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define OTPC_CRLD1_NRIWDG_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define OTPC_CRLD1_NRIWDG_3 ((uint32_t)0x00080000U) /* Bit19*/ +#define OTPC_CRLD1_NRIWDG_4 ((uint32_t)0x00100000U) /* Bit20*/ +#define OTPC_CRLD1_NRIWDG_5 ((uint32_t)0x00200000U) /* Bit21*/ +#define OTPC_CRLD1_NRIWDG_6 ((uint32_t)0x00400000U) /* Bit22*/ +#define OTPC_CRLD1_NRIWDG_7 ((uint32_t)0x00800000U) /* Bit23*/ +#define OTPC_CRLD1_NRIWDG_8 ((uint32_t)0x01000000U) /* Bit24*/ +#define OTPC_CRLD1_NRIWDG_9 ((uint32_t)0x02000000U) /* Bit25*/ +#define OTPC_CRLD1_NRIWDG_10 ((uint32_t)0x04000000U) /* Bit26*/ +#define OTPC_CRLD1_NRIWDG_11 ((uint32_t)0x08000000U) /* Bit27*/ +#define OTPC_CRLD1_NRIWDG_12 ((uint32_t)0x10000000U) /* Bit28*/ +#define OTPC_CRLD1_NRIWDG_13 ((uint32_t)0x20000000U) /* Bit29*/ +#define OTPC_CRLD1_BOR ((uint32_t)0x00007000U) /* Bit[14:12] SYS_CFG_BOR_OTP Payload Data*/ +#define OTPC_CRLD1_BOR_0 ((uint32_t)0x00001000U) /* Bit12*/ +#define OTPC_CRLD1_BOR_1 ((uint32_t)0x00002000U) /* Bit13*/ +#define OTPC_CRLD1_BOR_2 ((uint32_t)0x00004000U) /* Bit14*/ +#define OTPC_CRLD1_SJAG ((uint32_t)0x0000000FU) /* Bit[3:0] SEC_JTAG_CFG_OTP Payload Data */ +#define OTPC_CRLD1_SJAG_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define OTPC_CRLD1_SJAG_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define OTPC_CRLD1_SJAG_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define OTPC_CRLD1_SJAG_3 ((uint32_t)0x00000008U) /* Bit3*/ + +/** Bit definition for OTPC_CRLD2 register **/ +#define OTPC_CRLD2_L2MD ((uint32_t)0x00001000U) /* Bit[12] L2_Mode State */ +#define OTPC_CRLD2_L1MD ((uint32_t)0x00000800U) /* Bit[11] L1_Mode State */ +#define OTPC_CRLD2_L0MD ((uint32_t)0x00000400U) /* Bit[10] L0_Mode State */ +#define OTPC_CRLD2_ROOTMD ((uint32_t)0x00000200U) /* Bit[9] ROOT_Mode State */ +#define OTPC_CRLD2_INITMD ((uint32_t)0x00000100U) /* Bit[8] INIT_MOde State */ +#define OTPC_CRLD2_TCMSZ ((uint32_t)0x0000003FU) /* Bit[5:0] TCM_SZ_CFG_OTP Payload Data */ +#define OTPC_CRLD2_TCMSZ_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define OTPC_CRLD2_TCMSZ_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define OTPC_CRLD2_TCMSZ_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define OTPC_CRLD2_TCMSZ_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define OTPC_CRLD2_TCMSZ_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define OTPC_CRLD2_TCMSZ_5 ((uint32_t)0x00000020U) /* Bit5*/ + + + +/*** MMU register ***/ +/** Bit definition for MMU_CTRL register **/ +#define MMU_CTRL_RSTE ((uint32_t)0x00000002U) /* Bit[1] Rest MMU*/ +#define MMU_CTRL_INTE ((uint32_t)0x00000001U) /* Bit[0] MMU Interrupt Enable*/ + +/** Bit definition for MMU_STS register **/ +#define MMU_STS_XSPIL ((uint32_t)0x04000000U) /* Bit[26] XSP1 Configuration Lock Flag*/ +#define MMU_STS_ITRDE ((uint32_t)0x02000000U) /* Bit[25] ITCM Read Error Flag*/ +#define MMU_STS_ITWRE ((uint32_t)0x01000000U) /* Bit[24] ITCM Write Error Flag*/ +#define MMU_STS_BKRDE ((uint32_t)0x00800000U) /* Bit[23] Back Sram Read Error Flag*/ +#define MMU_STS_BKWRE ((uint32_t)0x00400000U) /* Bit[22] Back Sram Write Error Flag*/ +#define MMU_STS_H5RDE ((uint32_t)0x00200000U) /* Bit[21] AHB SRAM5 Read Error Flag*/ +#define MMU_STS_H5WRE ((uint32_t)0x00100000U) /* Bit[20] AHB SRAM5 Write Error Flag*/ +#define MMU_STS_H4RDE ((uint32_t)0x00080000U) /* Bit[19] AHB SRAM4 Read Error Flag*/ +#define MMU_STS_H4WRE ((uint32_t)0x00040000U) /* Bit[18] AHB SRAM4 Write Error Flag*/ +#define MMU_STS_H3RDE ((uint32_t)0x00020000U) /* Bit[17] AHB SRAM3 Read Error Flag*/ +#define MMU_STS_H3WRE ((uint32_t)0x00010000U) /* Bit[16] AHB SRAM3 Write Error Flag*/ +#define MMU_STS_H2RDE ((uint32_t)0x00008000U) /* Bit[15] AHB SRAM2 Read Error Flag*/ +#define MMU_STS_H2WRE ((uint32_t)0x00004000U) /* Bit[14] AHB SRAM2 Write Error Flag*/ +#define MMU_STS_H1RDE ((uint32_t)0x00002000U) /* Bit[13] AHB SRAM1 Read Error Flag*/ +#define MMU_STS_H1WRE ((uint32_t)0x00001000U) /* Bit[12] AHB SRAM1 Write Error Flag*/ +#define MMU_STS_X3RDE ((uint32_t)0x00000800U) /* Bit[11] AXI SRAM3 Read Error Flag*/ +#define MMU_STS_X3WRE ((uint32_t)0x00000400U) /* Bit[10] AXI SRAM3 Write Error Flag*/ +#define MMU_STS_X2RDE ((uint32_t)0x00000200U) /* Bit[9] AXI SRAM2 Read Error Flag*/ +#define MMU_STS_X2WRE ((uint32_t)0x00000100U) /* Bit[8] AXI SRAM2 Write Error Flag*/ +#define MMU_STS_X1RDE ((uint32_t)0x00000080U) /* Bit[7] AXI SRAM1 Read Error Flag*/ +#define MMU_STS_X1WRE ((uint32_t)0x00000040U) /* Bit[6] AXI SRAM1 Write Error Flag*/ +#define MMU_STS_OBL ((uint32_t)0x00000020U) /* Bit[5] OB FLASH Lock*/ +#define MMU_STS_FLASHL ((uint32_t)0x00000010U) /* Bit[4] Flash Lock Flag*/ +#define MMU_STS_XSPIRDE ((uint32_t)0x00000008U) /* Bit[3] XSPI Read Error Flag*/ + +/** Bit definition for MMU_RTADC1~4 register **/ +#define MMU_RTADC_RPROPERTY ((uint32_t)0x000000C0U) /* Region x Property */ +#define MMU_RTADC_RPROPERTY_0 ((uint32_t)0x00000040U) /* Region x Property Bit0 */ +#define MMU_RTADC_RPROPERTY_1 ((uint32_t)0x00000080U) /* Region x Property Bit1 */ + +#define MMU_RTADC_RMOD ((uint32_t)0x00000030U) /* RTAD mode for RTAD Region x */ +#define MMU_RTADC_RMOD_0 ((uint32_t)0x00000010U) /* RTAD mode for RTAD Region x Bit0 */ +#define MMU_RTADC_RMOD_1 ((uint32_t)0x00000020U) /* RTAD mode for RTAD Region x Bit1 */ + +#define MMU_RTADC_RKEYL ((uint32_t)0x00000004U) /* RTAD key lock for RTAD Region x */ +#define MMU_RTADC_RCFGL ((uint32_t)0x00000002U) /* RTAD configuration lock for RTAD Region x */ +#define MMU_RTADC_REN ((uint32_t)0x00000001U) /* RTAD Region x Enable */ + +/** Bit definition for MMU_RTKXPX register **/ +#define MMU_RTKXPX_KEY ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] RegionX PartX Key*/ +#define MMU_RTKXPX_KEY_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_RTKXPX_KEY_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_RTKXPX_KEY_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_RTKXPX_KEY_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_RTKXPX_KEY_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_RTKXPX_KEY_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_RTKXPX_KEY_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_RTKXPX_KEY_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_RTKXPX_KEY_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_RTKXPX_KEY_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_RTKXPX_KEY_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_RTKXPX_KEY_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_RTKXPX_KEY_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_RTKXPX_KEY_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_RTKXPX_KEY_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_RTKXPX_KEY_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_RTKXPX_KEY_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_RTKXPX_KEY_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_RTKXPX_KEY_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_RTKXPX_KEY_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_RTKXPX_KEY_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_RTKXPX_KEY_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_RTKXPX_KEY_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_RTKXPX_KEY_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_RTKXPX_KEY_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_RTKXPX_KEY_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_RTKXPX_KEY_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_RTKXPX_KEY_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_RTKXPX_KEY_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_RTKXPX_KEY_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_RTKXPX_KEY_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_RTKXPX_KEY_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_RTRX register **/ +#define MMU_RTRX_REND ((uint32_t)0x1FFF0000U) /* Bit[28:16] RTAD Region x END for RTAD Region x */ +#define MMU_RTRX_RBEG ((uint32_t)0x00001FFFU) /* Bit[12:0] RTAD Region x BEGIN for RTAD Region x*/ + +/** Bit definition for MMU_RTCRC register **/ +#define MMU_RTCRC_CRC ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] RTAD CRC Poly*/ +#define MMU_RTCRC_CRC_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_RTCRC_CRC_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_RTCRC_CRC_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_RTCRC_CRC_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_RTCRC_CRC_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_RTCRC_CRC_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_RTCRC_CRC_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_RTCRC_CRC_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_RTCRC_CRC_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_RTCRC_CRC_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_RTCRC_CRC_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_RTCRC_CRC_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_RTCRC_CRC_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_RTCRC_CRC_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_RTCRC_CRC_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_RTCRC_CRC_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_RTCRC_CRC_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_RTCRC_CRC_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_RTCRC_CRC_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_RTCRC_CRC_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_RTCRC_CRC_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_RTCRC_CRC_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_RTCRC_CRC_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_RTCRC_CRC_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_RTCRC_CRC_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_RTCRC_CRC_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_RTCRC_CRC_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_RTCRC_CRC_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_RTCRC_CRC_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_RTCRC_CRC_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_RTCRC_CRC_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_RTCRC_CRC_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_ETH1ME register **/ +#define MMU_ETH1ME_MID ((uint32_t)0x00070000U) /* Bit[18:16] ETH1 Master*/ +#define MMU_ETH1ME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_ETH1ME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_ETH1ME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_ETH1ME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] ETH1 User ID*/ +#define MMU_ETH1ME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_ETH1ME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_ETH1ME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_ETH1ME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_ETH1ME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_ETH1ME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_ETH1ME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_ETH1ME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_ETH1ME_EN ((uint32_t)0x00000001U) /* Bit[0] ETH1 Memory Enable*/ + +/** Bit definition for MMU_ETH2ME register **/ +#define MMU_ETH2ME_MID ((uint32_t)0x00070000U) /* Bit[18:16] ETH2 Master*/ +#define MMU_ETH2ME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_ETH2ME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_ETH2ME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_ETH2ME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] ETH2 User ID*/ +#define MMU_ETH2ME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_ETH2ME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_ETH2ME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_ETH2ME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_ETH2ME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_ETH2ME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_ETH2ME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_ETH2ME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_ETH2ME_EN ((uint32_t)0x00000001U) /* Bit[0] ETH2 Memory Enable*/ + +/** Bit definition for MMU_USB1ME register **/ +#define MMU_USB1ME_MID ((uint32_t)0x00070000U) /* Bit[18:16] USB1 Master*/ +#define MMU_USB1ME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_USB1ME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_USB1ME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_USB1ME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] USB1 User ID*/ +#define MMU_USB1ME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_USB1ME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_USB1ME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_USB1ME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_USB1ME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_USB1ME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_USB1ME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_USB1ME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_USB1ME_EN ((uint32_t)0x00000001U) /* Bit[0] USB1 Memory Enable*/ + +/** Bit definition for MMU_USB2ME register **/ +#define MMU_USB2ME_MID ((uint32_t)0x00070000U) /* Bit[18:16] USB2 Master*/ +#define MMU_USB2ME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_USB2ME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_USB2ME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_USB2ME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] USB2 User ID*/ +#define MMU_USB2ME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_USB2ME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_USB2ME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_USB2ME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_USB2ME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_USB2ME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_USB2ME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_USB2ME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_USB2ME_EN ((uint32_t)0x00000001U) /* Bit[0] USB2 Memory Enable*/ + +/** Bit definition for MMU_SD1ME register **/ +#define MMU_SD1ME_MID ((uint32_t)0x00070000U) /* Bit[18:16] SDMMC1 Master*/ +#define MMU_SD1ME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_SD1ME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_SD1ME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_SD1ME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] SDMMC User ID*/ +#define MMU_SD1ME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_SD1ME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_SD1ME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_SD1ME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_SD1ME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_SD1ME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_SD1ME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_SD1ME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_SD1ME_EN ((uint32_t)0x00000001U) /* Bit[0] SDMMC1 Memory Enable*/ + +/** Bit definition for MMU_SD2ME register **/ +#define MMU_SD2ME_MID ((uint32_t)0x00070000U) /* Bit[18:16] SDMMC2 Master*/ +#define MMU_SD2ME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_SD2ME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_SD2ME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_SD2ME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] SDMMC2 User ID*/ +#define MMU_SD2ME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_SD2ME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_SD2ME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_SD2ME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_SD2ME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_SD2ME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_SD2ME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_SD2ME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_SD2ME_EN ((uint32_t)0x00000001U) /* Bit[0] SDMMC2 Memory Enable*/ + +/** Bit definition for MMU_DVP1ME register **/ +#define MMU_DVP1ME_MID ((uint32_t)0x00070000U) /* Bit[18:16] DVP1 Master*/ +#define MMU_DVP1ME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_DVP1ME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_DVP1ME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_DVP1ME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] DVP1 User ID*/ +#define MMU_DVP1ME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_DVP1ME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_DVP1ME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_DVP1ME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_DVP1ME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_DVP1ME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_DVP1ME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_DVP1ME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_DVP1ME_EN ((uint32_t)0x00000001U) /* Bit[0] DVP1 Memory Enable*/ + +/** Bit definition for MMU_DVP2ME register **/ +#define MMU_DVP2ME_MID ((uint32_t)0x00070000U) /* Bit[18:16] DVP2 Master*/ +#define MMU_DVP2ME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_DVP2ME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_DVP2ME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_DVP2ME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] DVP2 User ID*/ +#define MMU_DVP2ME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_DVP2ME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_DVP2ME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_DVP2ME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_DVP2ME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_DVP2ME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_DVP2ME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_DVP2ME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_DVP2ME_EN ((uint32_t)0x00000001U) /* Bit[0] DVP2 Memory Enable*/ + +/** Bit definition for MMU_DMA1ME register **/ +#define MMU_DMA1ME_MID ((uint32_t)0x00070000U) /* Bit[18:16] DMA1 Master*/ +#define MMU_DMA1ME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_DMA1ME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_DMA1ME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_DMA1ME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] DMA1 User ID*/ +#define MMU_DMA1ME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_DMA1ME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_DMA1ME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_DMA1ME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_DMA1ME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_DMA1ME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_DMA1ME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_DMA1ME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_DMA1ME_EN ((uint32_t)0x00000001U) /* Bit[0] DMA1 Memory Enable*/ + +/** Bit definition for MMU_DMA2ME register **/ +#define MMU_DMA2ME_MID ((uint32_t)0x00070000U) /* Bit[18:16] DMA2 Master*/ +#define MMU_DMA2ME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_DMA2ME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_DMA2ME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_DMA2ME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] DMA2 User ID*/ +#define MMU_DMA2ME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_DMA2ME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_DMA2ME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_DMA2ME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_DMA2ME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_DMA2ME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_DMA2ME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_DMA2ME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_DMA2ME_EN ((uint32_t)0x00000001U) /* Bit[0] DMA2 Memory Enable*/ + +/** Bit definition for MMU_DMA3ME register **/ +#define MMU_DMA3ME_MID ((uint32_t)0x00070000U) /* Bit[18:16] DMA3 Master*/ +#define MMU_DMA3ME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_DMA3ME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_DMA3ME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_DMA3ME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] DMA3 User ID*/ +#define MMU_DMA3ME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_DMA3ME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_DMA3ME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_DMA3ME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_DMA3ME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_DMA3ME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_DMA3ME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_DMA3ME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_DMA3ME_EN ((uint32_t)0x00000001U) /* Bit[0] DMA3 Memory Enable*/ + +/** Bit definition for MMU_MDMAME register **/ +#define MMU_MDMAME_MID ((uint32_t)0x00070000U) /* Bit[18:16] MDMA Master*/ +#define MMU_MDMAME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_MDMAME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_MDMAME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_MDMAME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] MDMA User ID*/ +#define MMU_MDMAME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_MDMAME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_MDMAME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_MDMAME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_MDMAME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_MDMAME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_MDMAME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_MDMAME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_MDMAME_EN ((uint32_t)0x00000001U) /* Bit[0] MDMA Memory Enable*/ + +/** Bit definition for MMU_JPEGME register **/ +#define MMU_JPEGME_MID ((uint32_t)0x00070000U) /* Bit[18:16] JPEG Master*/ +#define MMU_JPEGME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_JPEGME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_JPEGME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_JPEGME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] JPEG User ID*/ +#define MMU_JPEGME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_JPEGME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_JPEGME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_JPEGME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_JPEGME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_JPEGME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_JPEGME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_JPEGME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_JPEGME_EN ((uint32_t)0x00000001U) /* Bit[0] JPEG Memory Enable*/ + +/** Bit definition for MMU_LCDME register **/ +#define MMU_LCDME_MID ((uint32_t)0x00070000U) /* Bit[18:16] LCDC Master*/ +#define MMU_LCDME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_LCDME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_LCDME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_LCDME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] LCDC User ID*/ +#define MMU_LCDME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_LCDME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_LCDME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_LCDME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_LCDME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_LCDME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_LCDME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_LCDME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_LCDME_EN ((uint32_t)0x00000001U) /* Bit[0] LCDC Memory Enable*/ + +/** Bit definition for MMU_GPUME register **/ +#define MMU_GPUME_MID ((uint32_t)0x00070000U) /* Bit[18:16] GPU Master*/ +#define MMU_GPUME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_GPUME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_GPUME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_GPUME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] GPU User ID*/ +#define MMU_GPUME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_GPUME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_GPUME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_GPUME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_GPUME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_GPUME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_GPUME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_GPUME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_GPUME_ME ((uint32_t)0x00000001U) /* Bit[0] GPU Memory Enable*/ + +/** Bit definition for MMU_SDPUME register **/ +#define MMU_SDPUME_MID ((uint32_t)0x00070000U) /* Bit[18:16] SDPU Master*/ +#define MMU_SDPUME_MID_0 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_SDPUME_MID_1 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_SDPUME_MID_2 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_SDPUME_UID ((uint32_t)0x0000FF00U) /* Bit[15:8] SDPU User ID*/ +#define MMU_SDPUME_UID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_SDPUME_UID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_SDPUME_UID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_SDPUME_UID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_SDPUME_UID_4 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_SDPUME_UID_5 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_SDPUME_UID_6 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_SDPUME_UID_7 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_SDPUME_EN ((uint32_t)0x00000001U) /* Bit[0] SDPU Memory Enable*/ + +/** Bit definition for MMU_XRD register **/ +#define MMU_XRD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] XSPI Master ID*/ +#define MMU_XRD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_XRD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_XRD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_XRD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_XRD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] XSPI UID*/ +#define MMU_XRD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_XRD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_XRD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_XRD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_XRD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_XRD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_XRD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_XRD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_XRAD register **/ +#define MMU_XRAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] XSPI Read Error Address*/ +#define MMU_XRAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_XRAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_XRAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_XRAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_XRAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_XRAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_XRAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_XRAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_XRAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_XRAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_XRAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_XRAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_XRAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_XRAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_XRAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_XRAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_XRAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_XRAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_XRAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_XRAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_XRAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_XRAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_XRAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_XRAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_XRAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_XRAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_XRAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_XRAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_XRAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_XRAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_XRAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_XRAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_XxWD register **/ +#define MMU_X1WD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AXI SRAM1 Master ID*/ +#define MMU_X1WD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X1WD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X1WD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X1WD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X1WD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AXI SRAM1 UID*/ +#define MMU_X1WD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X1WD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X1WD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X1WD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X1WD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X1WD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X1WD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X1WD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_X1RD register **/ +#define MMU_X1RD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AXI SRAM1 Master ID*/ +#define MMU_X1RD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X1RD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X1RD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X1RD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X1RD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AXI SRAM1 UID*/ +#define MMU_X1RD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X1RD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X1RD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X1RD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X1RD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X1RD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X1RD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X1RD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_X1WAD register **/ +#define MMU_X1WAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AXI SRAM1 Write Error Address*/ +#define MMU_X1WAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X1WAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X1WAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X1WAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X1WAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X1WAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X1WAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X1WAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_X1WAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X1WAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X1WAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X1WAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X1WAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_X1WAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_X1WAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_X1WAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_X1WAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_X1WAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_X1WAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_X1WAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_X1WAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_X1WAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_X1WAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_X1WAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_X1WAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_X1WAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_X1WAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_X1WAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_X1WAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_X1WAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_X1WAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_X1WAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_X1RAD register **/ +#define MMU_X1RAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AXI SRAM1 Read Error Address*/ +#define MMU_X1RAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X1RAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X1RAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X1RAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X1RAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X1RAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X1RAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X1RAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_X1RAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X1RAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X1RAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X1RAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X1RAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_X1RAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_X1RAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_X1RAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_X1RAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_X1RAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_X1RAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_X1RAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_X1RAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_X1RAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_X1RAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_X1RAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_X1RAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_X1RAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_X1RAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_X1RAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_X1RAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_X1RAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_X1RAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_X1RAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_X2WD register **/ +#define MMU_X2WD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AXI SRAM2 Master ID*/ +#define MMU_X2WD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X2WD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X2WD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X2WD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X2WD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AXI SRAM2 UID*/ +#define MMU_X2WD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X2WD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X2WD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X2WD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X2WD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X2WD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X2WD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X2WD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_X2RD register **/ +#define MMU_X2RD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AXI SRAM2 Master ID*/ +#define MMU_X2RD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X2RD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X2RD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X2RD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X2RD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AXI SRAM2 UID*/ +#define MMU_X2RD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X2RD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X2RD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X2RD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X2RD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X2RD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X2RD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X2RD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_X2WAD register **/ +#define MMU_X2WAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AXI SRAM2 Write Error Address*/ +#define MMU_X2WAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X2WAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X2WAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X2WAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X2WAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X2WAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X2WAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X2WAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_X2WAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X2WAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X2WAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X2WAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X2WAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_X2WAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_X2WAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_X2WAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_X2WAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_X2WAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_X2WAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_X2WAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_X2WAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_X2WAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_X2WAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_X2WAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_X2WAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_X2WAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_X2WAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_X2WAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_X2WAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_X2WAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_X2WAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_X2WAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_X2RAD register **/ +#define MMU_X2RAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AXI SRAM2 Read Error Address*/ +#define MMU_X2RAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X2RAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X2RAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X2RAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X2RAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X2RAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X2RAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X2RAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_X2RAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X2RAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X2RAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X2RAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X2RAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_X2RAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_X2RAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_X2RAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_X2RAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_X2RAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_X2RAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_X2RAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_X2RAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_X2RAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_X2RAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_X2RAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_X2RAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_X2RAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_X2RAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_X2RAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_X2RAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_X2RAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_X2RAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_X2RAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_X3WD register **/ +#define MMU_X3WD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AXI SRAM3 Master ID*/ +#define MMU_X3WD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X3WD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X3WD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X3WD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X3WD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AXI SRAM3 UID*/ +#define MMU_X3WD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X3WD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X3WD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X3WD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X3WD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X3WD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X3WD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X3WD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_X3RD register **/ +#define MMU_X3RD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AXI SRAM3 Master ID*/ +#define MMU_X3RD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X3RD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X3RD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X3RD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X3RD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AXI SRAM3 UID*/ +#define MMU_X3RD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X3RD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X3RD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X3RD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X3RD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X3RD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X3RD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X3RD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_X3WAD register **/ +#define MMU_X3WAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AXI SRAM3 Write Error Address*/ +#define MMU_X3WAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X3WAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X3WAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X3WAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X3WAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X3WAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X3WAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X3WAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_X3WAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X3WAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X3WAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X3WAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X3WAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_X3WAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_X3WAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_X3WAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_X3WAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_X3WAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_X3WAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_X3WAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_X3WAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_X3WAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_X3WAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_X3WAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_X3WAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_X3WAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_X3WAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_X3WAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_X3WAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_X3WAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_X3WAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_X3WAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_X3RAD register **/ +#define MMU_X3RAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AXI SRAM3 Read Error Address*/ +#define MMU_X3RAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_X3RAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_X3RAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_X3RAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_X3RAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_X3RAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_X3RAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_X3RAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_X3RAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_X3RAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_X3RAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_X3RAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_X3RAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_X3RAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_X3RAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_X3RAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_X3RAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_X3RAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_X3RAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_X3RAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_X3RAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_X3RAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_X3RAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_X3RAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_X3RAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_X3RAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_X3RAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_X3RAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_X3RAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_X3RAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_X3RAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_X3RAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_H1WD register **/ +#define MMU_H1WD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AHB SRAM1 Master ID*/ +#define MMU_H1WD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H1WD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H1WD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H1WD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H1WD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AHB SRAM1 UID*/ +#define MMU_H1WD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H1WD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H1WD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H1WD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H1WD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H1WD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H1WD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H1WD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_H1RD register **/ +#define MMU_H1RD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AHB SRAM1 Master ID*/ +#define MMU_H1RD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H1RD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H1RD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H1RD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H1RD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AHB SRAM1 UID*/ +#define MMU_H1RD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H1RD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H1RD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H1RD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H1RD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H1RD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H1RD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H1RD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_H1WAD register **/ +#define MMU_H1WAD_ADDDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AHB SRAM1 Write Error Address*/ +#define MMU_H1WAD_ADDDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H1WAD_ADDDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H1WAD_ADDDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H1WAD_ADDDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H1WAD_ADDDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H1WAD_ADDDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H1WAD_ADDDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H1WAD_ADDDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_H1WAD_ADDDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H1WAD_ADDDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H1WAD_ADDDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H1WAD_ADDDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H1WAD_ADDDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_H1WAD_ADDDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_H1WAD_ADDDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_H1WAD_ADDDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_H1WAD_ADDDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_H1WAD_ADDDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_H1WAD_ADDDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_H1WAD_ADDDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_H1WAD_ADDDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_H1WAD_ADDDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_H1WAD_ADDDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_H1WAD_ADDDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_H1WAD_ADDDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_H1WAD_ADDDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_H1WAD_ADDDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_H1WAD_ADDDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_H1WAD_ADDDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_H1WAD_ADDDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_H1WAD_ADDDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_H1WAD_ADDDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_H1RAD register **/ +#define MMU_H1RAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AHB SRAM1 Read Error Address*/ +#define MMU_H1RAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H1RAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H1RAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H1RAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H1RAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H1RAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H1RAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H1RAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_H1RAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H1RAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H1RAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H1RAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H1RAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_H1RAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_H1RAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_H1RAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_H1RAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_H1RAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_H1RAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_H1RAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_H1RAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_H1RAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_H1RAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_H1RAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_H1RAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_H1RAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_H1RAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_H1RAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_H1RAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_H1RAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_H1RAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_H1RAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_H2WD register **/ +#define MMU_H2WD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AHB SRAM2 Master ID*/ +#define MMU_H2WD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H2WD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H2WD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H2WD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H2WD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AHB SRAM2 UID*/ +#define MMU_H2WD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H2WD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H2WD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H2WD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H2WD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H2WD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H2WD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H2WD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_H2RD register **/ +#define MMU_H2RD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AHB SRAM2 Master ID*/ +#define MMU_H2RD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H2RD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H2RD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H2RD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H2RD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AHB SRAM2 UID*/ +#define MMU_H2RD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H2RD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H2RD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H2RD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H2RD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H2RD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H2RD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H2RD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_H2WAD register **/ +#define MMU_H2WAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AHB SRAM2 Write Error Address*/ +#define MMU_H2WAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H2WAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H2WAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H2WAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H2WAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H2WAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H2WAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H2WAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_H2WAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H2WAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H2WAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H2WAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H2WAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_H2WAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_H2WAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_H2WAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_H2WAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_H2WAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_H2WAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_H2WAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_H2WAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_H2WAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_H2WAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_H2WAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_H2WAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_H2WAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_H2WAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_H2WAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_H2WAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_H2WAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_H2WAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_H2WAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_H2RAD register **/ +#define MMU_H2RAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AHB SRAM2 Read Error Address*/ +#define MMU_H2RAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H2RAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H2RAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H2RAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H2RAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H2RAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H2RAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H2RAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_H2RAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H2RAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H2RAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H2RAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H2RAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_H2RAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_H2RAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_H2RAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_H2RAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_H2RAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_H2RAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_H2RAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_H2RAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_H2RAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_H2RAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_H2RAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_H2RAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_H2RAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_H2RAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_H2RAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_H2RAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_H2RAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_H2RAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_H2RAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_H3WD register **/ +#define MMU_H3WD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AHB SRAM3 Master ID*/ +#define MMU_H3WD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H3WD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H3WD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H3WD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H3WD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AHB SRAM3 UID*/ +#define MMU_H3WD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H3WD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H3WD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H3WD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H3WD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H3WD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H3WD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H3WD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_H3RD register **/ +#define MMU_H3RD_ID ((uint32_t)0x00000F00U) /* Bit[11:8] AHB SRAM3 Master ID*/ +#define MMU_H3RD_ID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H3RD_ID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H3RD_ID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H3RD_ID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H3RD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AHB SRAM3 UID*/ +#define MMU_H3RD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H3RD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H3RD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H3RD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H3RD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H3RD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H3RD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H3RD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_H3WAD register **/ +#define MMU_H3WAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AHB SRAM3 Write Error Address*/ +#define MMU_H3WAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H3WAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H3WAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H3WAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H3WAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H3WAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H3WAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H3WAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_H3WAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H3WAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H3WAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H3WAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H3WAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_H3WAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_H3WAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_H3WAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_H3WAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_H3WAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_H3WAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_H3WAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_H3WAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_H3WAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_H3WAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_H3WAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_H3WAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_H3WAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_H3WAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_H3WAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_H3WAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_H3WAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_H3WAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_H3WAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_H3RAD register **/ +#define MMU_H3RAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AHB SRAM3 Read Error Address*/ +#define MMU_H3RAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H3RAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H3RAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H3RAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H3RAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H3RAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H3RAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H3RAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_H3RAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H3RAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H3RAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H3RAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H3RAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_H3RAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_H3RAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_H3RAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_H3RAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_H3RAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_H3RAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_H3RAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_H3RAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_H3RAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_H3RAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_H3RAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_H3RAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_H3RAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_H3RAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_H3RAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_H3RAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_H3RAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_H3RAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_H3RAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_H4WD register **/ +#define MMU_H4WD_ID ((uint32_t)0x00000F00U) /* Bit[11:8] AHB SRAM4 Master ID*/ +#define MMU_H4WD_ID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H4WD_ID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H4WD_ID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H4WD_ID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H4WD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AHB SRAM4 UID*/ +#define MMU_H4WD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H4WD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H4WD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H4WD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H4WD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H4WD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H4WD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H4WD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_H4RD register **/ +#define MMU_H4RD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AHB SRAM4 Master ID*/ +#define MMU_H4RD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H4RD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H4RD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H4RD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H4RD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AHB SRAM4 UID*/ +#define MMU_H4RD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H4RD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H4RD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H4RD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H4RD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H4RD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H4RD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H4RD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_H4WAD register **/ +#define MMU_H4WAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AHB SRAM4 Write Error Address*/ +#define MMU_H4WAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H4WAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H4WAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H4WAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H4WAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H4WAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H4WAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H4WAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_H4WAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H4WAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H4WAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H4WAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H4WAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_H4WAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_H4WAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_H4WAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_H4WAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_H4WAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_H4WAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_H4WAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_H4WAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_H4WAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_H4WAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_H4WAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_H4WAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_H4WAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_H4WAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_H4WAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_H4WAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_H4WAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_H4WAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_H4WAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_H4RAD register **/ +#define MMU_H4RAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AHB SRAM4 Read Error Address*/ +#define MMU_H4RAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H4RAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H4RAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H4RAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H4RAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H4RAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H4RAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H4RAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_H4RAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H4RAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H4RAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H4RAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H4RAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_H4RAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_H4RAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_H4RAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_H4RAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_H4RAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_H4RAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_H4RAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_H4RAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_H4RAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_H4RAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_H4RAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_H4RAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_H4RAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_H4RAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_H4RAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_H4RAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_H4RAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_H4RAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_H4RAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_H5WD register **/ +#define MMU_H5WD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AHB SRAM5 Master ID*/ +#define MMU_H5WD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H5WD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H5WD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H5WD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H5WD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AHB SRAM5 UID*/ +#define MMU_H5WD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H5WD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H5WD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H5WD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H5WD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H5WD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H5WD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H5WD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_H5RD register **/ +#define MMU_H5RD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] AHB SRAM5 Master ID*/ +#define MMU_H5RD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H5RD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H5RD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H5RD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H5RD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] AHB SRAM5 UID*/ +#define MMU_H5RD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H5RD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H5RD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H5RD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H5RD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H5RD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H5RD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H5RD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_H5WAD register **/ +#define MMU_H5WAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] AHB SRAM5 Read Error Address*/ +#define MMU_H5WAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_H5WAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_H5WAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_H5WAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_H5WAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_H5WAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_H5WAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_H5WAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_H5WAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_H5WAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_H5WAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_H5WAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_H5WAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_H5WAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_H5WAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_H5WAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_H5WAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_H5WAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_H5WAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_H5WAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_H5WAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_H5WAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_H5WAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_H5WAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_H5WAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_H5WAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_H5WAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_H5WAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_H5WAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_H5WAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_H5WAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_H5WAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_BKWD register **/ +#define MMU_BKWD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] Backup SRAM Master ID*/ +#define MMU_BKWD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_BKWD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_BKWD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_BKWD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_BKWD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] Backup SRAM UID*/ +#define MMU_BKWD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_BKWD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_BKWD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_BKWD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_BKWD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_BKWD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_BKWD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_BKWD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_BKRD register **/ +#define MMU_BKRD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] Backup SRAM Master ID*/ +#define MMU_BKRD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_BKRD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_BKRD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_BKRD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_BKRD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] Backup SRAM UID*/ +#define MMU_BKRD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_BKRD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_BKRD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_BKRD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_BKRD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_BKRD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_BKRD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_BKRD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_BKWAD register **/ +#define MMU_BKWAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Backup SRAM Write Error Address*/ +#define MMU_BKWAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_BKWAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_BKWAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_BKWAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_BKWAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_BKWAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_BKWAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_BKWAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_BKWAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_BKWAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_BKWAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_BKWAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_BKWAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_BKWAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_BKWAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_BKWAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_BKWAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_BKWAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_BKWAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_BKWAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_BKWAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_BKWAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_BKWAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_BKWAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_BKWAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_BKWAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_BKWAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_BKWAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_BKWAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_BKWAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_BKWAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_BKWAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_BKRAD register **/ +#define MMU_BKRAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] Backup SRAM Read Error Address*/ +#define MMU_BKRAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_BKRAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_BKRAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_BKRAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_BKRAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_BKRAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_BKRAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_BKRAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_BKRAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_BKRAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_BKRAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_BKRAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_BKRAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_BKRAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_BKRAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_BKRAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_BKRAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_BKRAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_BKRAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_BKRAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_BKRAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_BKRAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_BKRAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_BKRAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_BKRAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_BKRAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_BKRAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_BKRAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_BKRAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_BKRAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_BKRAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_BKRAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_ITWD register **/ +#define MMU_ITWD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] ITCM Master ID*/ +#define MMU_ITWD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_ITWD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_ITWD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_ITWD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_ITWD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] ITCM UID*/ +#define MMU_ITWD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_ITWD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_ITWD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_ITWD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_ITWD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_ITWD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_ITWD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_ITWD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_ITRD register **/ +#define MMU_ITRD_MID ((uint32_t)0x00000F00U) /* Bit[11:8] ITCM Master ID*/ +#define MMU_ITRD_MID_0 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_ITRD_MID_1 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_ITRD_MID_2 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_ITRD_MID_3 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_ITRD_UID ((uint32_t)0x000000FFU) /* Bit[7:0] ITCM UID*/ +#define MMU_ITRD_UID_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_ITRD_UID_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_ITRD_UID_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_ITRD_UID_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_ITRD_UID_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_ITRD_UID_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_ITRD_UID_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_ITRD_UID_7 ((uint32_t)0x00000080U) /* Bit7*/ + +/** Bit definition for MMU_ITWAD register **/ +#define MMU_ITWAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] ITCM Write Error Address*/ +#define MMU_ITWAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_ITWAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_ITWAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_ITWAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_ITWAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_ITWAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_ITWAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_ITWAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_ITWAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_ITWAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_ITWAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_ITWAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_ITWAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_ITWAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_ITWAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_ITWAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_ITWAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_ITWAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_ITWAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_ITWAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_ITWAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_ITWAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_ITWAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_ITWAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_ITWAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_ITWAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_ITWAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_ITWAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_ITWAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_ITWAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_ITWAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_ITWAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + +/** Bit definition for MMU_ITRAD register **/ +#define MMU_ITRAD_ADDR ((uint32_t)0xFFFFFFFFU) /* Bit[31:0] ITCM Read Error Address*/ +#define MMU_ITRAD_ADDR_0 ((uint32_t)0x00000001U) /* Bit0*/ +#define MMU_ITRAD_ADDR_1 ((uint32_t)0x00000002U) /* Bit1*/ +#define MMU_ITRAD_ADDR_2 ((uint32_t)0x00000004U) /* Bit2*/ +#define MMU_ITRAD_ADDR_3 ((uint32_t)0x00000008U) /* Bit3*/ +#define MMU_ITRAD_ADDR_4 ((uint32_t)0x00000010U) /* Bit4*/ +#define MMU_ITRAD_ADDR_5 ((uint32_t)0x00000020U) /* Bit5*/ +#define MMU_ITRAD_ADDR_6 ((uint32_t)0x00000040U) /* Bit6*/ +#define MMU_ITRAD_ADDR_7 ((uint32_t)0x00000080U) /* Bit7*/ +#define MMU_ITRAD_ADDR_8 ((uint32_t)0x00000100U) /* Bit8*/ +#define MMU_ITRAD_ADDR_9 ((uint32_t)0x00000200U) /* Bit9*/ +#define MMU_ITRAD_ADDR_10 ((uint32_t)0x00000400U) /* Bit10*/ +#define MMU_ITRAD_ADDR_11 ((uint32_t)0x00000800U) /* Bit11*/ +#define MMU_ITRAD_ADDR_12 ((uint32_t)0x00001000U) /* Bit12*/ +#define MMU_ITRAD_ADDR_13 ((uint32_t)0x00002000U) /* Bit13*/ +#define MMU_ITRAD_ADDR_14 ((uint32_t)0x00004000U) /* Bit14*/ +#define MMU_ITRAD_ADDR_15 ((uint32_t)0x00008000U) /* Bit15*/ +#define MMU_ITRAD_ADDR_16 ((uint32_t)0x00010000U) /* Bit16*/ +#define MMU_ITRAD_ADDR_17 ((uint32_t)0x00020000U) /* Bit17*/ +#define MMU_ITRAD_ADDR_18 ((uint32_t)0x00040000U) /* Bit18*/ +#define MMU_ITRAD_ADDR_19 ((uint32_t)0x00080000U) /* Bit19*/ +#define MMU_ITRAD_ADDR_20 ((uint32_t)0x00100000U) /* Bit20*/ +#define MMU_ITRAD_ADDR_21 ((uint32_t)0x00200000U) /* Bit21*/ +#define MMU_ITRAD_ADDR_22 ((uint32_t)0x00400000U) /* Bit22*/ +#define MMU_ITRAD_ADDR_23 ((uint32_t)0x00800000U) /* Bit23*/ +#define MMU_ITRAD_ADDR_24 ((uint32_t)0x01000000U) /* Bit24*/ +#define MMU_ITRAD_ADDR_25 ((uint32_t)0x02000000U) /* Bit25*/ +#define MMU_ITRAD_ADDR_26 ((uint32_t)0x04000000U) /* Bit26*/ +#define MMU_ITRAD_ADDR_27 ((uint32_t)0x08000000U) /* Bit27*/ +#define MMU_ITRAD_ADDR_28 ((uint32_t)0x10000000U) /* Bit28*/ +#define MMU_ITRAD_ADDR_29 ((uint32_t)0x20000000U) /* Bit29*/ +#define MMU_ITRAD_ADDR_30 ((uint32_t)0x40000000U) /* Bit30*/ +#define MMU_ITRAD_ADDR_31 ((uint32_t)0x80000000U) /* Bit31*/ + + +/** Bit Offset register **/ +#define REG_BIT0_OFFSET ((uint32_t)0x00000000U) +#define REG_BIT1_OFFSET ((uint32_t)0x00000001U) +#define REG_BIT2_OFFSET ((uint32_t)0x00000002U) +#define REG_BIT3_OFFSET ((uint32_t)0x00000003U) +#define REG_BIT4_OFFSET ((uint32_t)0x00000004U) +#define REG_BIT5_OFFSET ((uint32_t)0x00000005U) +#define REG_BIT6_OFFSET ((uint32_t)0x00000006U) +#define REG_BIT7_OFFSET ((uint32_t)0x00000007U) +#define REG_BIT8_OFFSET ((uint32_t)0x00000008U) +#define REG_BIT9_OFFSET ((uint32_t)0x00000009U) +#define REG_BIT10_OFFSET ((uint32_t)0x0000000AU) +#define REG_BIT11_OFFSET ((uint32_t)0x0000000BU) +#define REG_BIT12_OFFSET ((uint32_t)0x0000000CU) +#define REG_BIT13_OFFSET ((uint32_t)0x0000000DU) +#define REG_BIT14_OFFSET ((uint32_t)0x0000000EU) +#define REG_BIT15_OFFSET ((uint32_t)0x0000000FU) +#define REG_BIT16_OFFSET ((uint32_t)0x00000010U) +#define REG_BIT17_OFFSET ((uint32_t)0x00000011U) +#define REG_BIT18_OFFSET ((uint32_t)0x00000012U) +#define REG_BIT19_OFFSET ((uint32_t)0x00000013U) +#define REG_BIT20_OFFSET ((uint32_t)0x00000014U) +#define REG_BIT21_OFFSET ((uint32_t)0x00000015U) +#define REG_BIT22_OFFSET ((uint32_t)0x00000016U) +#define REG_BIT23_OFFSET ((uint32_t)0x00000017U) +#define REG_BIT24_OFFSET ((uint32_t)0x00000018U) +#define REG_BIT25_OFFSET ((uint32_t)0x00000019U) +#define REG_BIT26_OFFSET ((uint32_t)0x0000001AU) +#define REG_BIT27_OFFSET ((uint32_t)0x0000001BU) +#define REG_BIT28_OFFSET ((uint32_t)0x0000001CU) +#define REG_BIT29_OFFSET ((uint32_t)0x0000001DU) +#define REG_BIT30_OFFSET ((uint32_t)0x0000001EU) +#define REG_BIT31_OFFSET ((uint32_t)0x0000001FU) + + +/*** Exported_macro ***/ + +#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))) + +#define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))) + +#define DWT_CR (*(__IO uint32_t *)0xE0001000U) +#define DWT_CYCCNT (*(__IO uint32_t *)0xE0001004U) +#define DEM_CR (*(__IO uint32_t *)0xE000EDFCU) +#define DEM_CR_TRCENA ((uint32_t)0x01000000U) +#define DWT_CR_CYCCNTENA ((uint32_t)0x00000001U) + +#define CPU_DELAY_INTI() do{ \ + /* Enable DWT*/ \ + DEM_CR |= DEM_CR_TRCENA; \ + /* Clear DWT CYCCNT*/ \ + DWT_CYCCNT = 0U; \ + /* Enable DWT CYCCNT*/ \ + DWT_CR |= DWT_CR_CYCCNTENA; \ + }while(0) + +#define CPU_DELAY_DISABLE() do{ \ + /* Disable DWT*/ \ + DEM_CR &= (uint32_t)(~(uint32_t)DEM_CR_TRCENA); \ + }while(0) + + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_78X_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h76x.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h76x.s new file mode 100644 index 0000000000..1b1e020258 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h76x.s @@ -0,0 +1,892 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + + +Stack_Size EQU 0x200 + + 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 0x200 + + 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 N32SysTick_Handler ; N32SysTick Handler + + ; External Interrupts + DCD WWDG1_IRQHandler ; Window1 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD FPU_CPU1_IRQHandler ; FPU_CM7 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD SEMA4_INT1_IRQHandler ; SEMA4 interrupt1 + DCD 0 ; Reserved + DCD WWDG2_RST_IRQHandler ; WWDG2 reset interrupt through EXTI line 82 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUB_IRQHandler ; DCMUB interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_IRQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; Reserved + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt + DCD SysTick_Handler ; SysTick Handler + +__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 +N32SysTick_Handler PROC + EXPORT N32SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG1_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT RTC_TAMPER_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT DMA1_Channel0_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 DMA2_Channel0_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT DMA2_Channel6_IRQHandler [WEAK] + EXPORT DMA2_Channel7_IRQHandler [WEAK] + EXPORT DMA3_Channel0_IRQHandler [WEAK] + EXPORT DMA3_Channel1_IRQHandler [WEAK] + EXPORT DMA3_Channel2_IRQHandler [WEAK] + EXPORT DMA3_Channel3_IRQHandler [WEAK] + EXPORT DMA3_Channel4_IRQHandler [WEAK] + EXPORT DMA3_Channel5_IRQHandler [WEAK] + EXPORT DMA3_Channel6_IRQHandler [WEAK] + EXPORT DMA3_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel0_IRQHandler [WEAK] + EXPORT MDMA_Channel1_IRQHandler [WEAK] + EXPORT MDMA_Channel2_IRQHandler [WEAK] + EXPORT MDMA_Channel3_IRQHandler [WEAK] + EXPORT MDMA_Channel4_IRQHandler [WEAK] + EXPORT MDMA_Channel5_IRQHandler [WEAK] + EXPORT MDMA_Channel6_IRQHandler [WEAK] + EXPORT MDMA_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel8_IRQHandler [WEAK] + EXPORT MDMA_Channel9_IRQHandler [WEAK] + EXPORT MDMA_Channel10_IRQHandler [WEAK] + EXPORT MDMA_Channel11_IRQHandler [WEAK] + EXPORT MDMA_Channel12_IRQHandler [WEAK] + EXPORT MDMA_Channel13_IRQHandler [WEAK] + EXPORT MDMA_Channel14_IRQHandler [WEAK] + EXPORT MDMA_Channel15_IRQHandler [WEAK] + EXPORT SDPU_IRQHandler [WEAK] + EXPORT FPU_CPU1_IRQHandler [WEAK] + EXPORT ECCMON_IRQHandler [WEAK] + EXPORT RTC_ALARM_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT I2C3_EV_IRQHandler [WEAK] + EXPORT I2C3_ER_IRQHandler [WEAK] + EXPORT I2C4_EV_IRQHandler [WEAK] + EXPORT I2C4_ER_IRQHandler [WEAK] + EXPORT I2C5_EV_IRQHandler [WEAK] + EXPORT I2C5_ER_IRQHandler [WEAK] + EXPORT I2C6_EV_IRQHandler [WEAK] + EXPORT I2C6_ER_IRQHandler [WEAK] + EXPORT I2C7_EV_IRQHandler [WEAK] + EXPORT I2C7_ER_IRQHandler [WEAK] + EXPORT I2C8_EV_IRQHandler [WEAK] + EXPORT I2C8_ER_IRQHandler [WEAK] + EXPORT I2C9_EV_IRQHandler [WEAK] + EXPORT I2C9_ER_IRQHandler [WEAK] + EXPORT I2C10_EV_IRQHandler [WEAK] + EXPORT I2C10_ER_IRQHandler [WEAK] + EXPORT I2S1_IRQHandler [WEAK] + EXPORT I2S2_IRQHandler [WEAK] + EXPORT I2S3_IRQHandler [WEAK] + EXPORT I2S4_IRQHandler [WEAK] + EXPORT xSPI1_IRQHandler [WEAK] + EXPORT xSPI2_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT SPI4_IRQHandler [WEAK] + EXPORT SPI5_IRQHandler [WEAK] + EXPORT SPI6_IRQHandler [WEAK] + EXPORT SPI7_IRQHandler [WEAK] + EXPORT LCD_EV_IRQHandler [WEAK] + EXPORT LCD_ER_IRQHandler [WEAK] + EXPORT DVP1_IRQHandler [WEAK] + EXPORT DVP2_IRQHandler [WEAK] + EXPORT DMAMUX2_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB1_HS_WKUP_IRQHandler [WEAK] + EXPORT USB1_HS_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB2_HS_WKUP_IRQHandler [WEAK] + EXPORT USB2_HS_IRQHandler [WEAK] + EXPORT ETH1_IRQHandler [WEAK] + EXPORT ETH1_PMT_LPI_IRQHandler [WEAK] + EXPORT ETH2_IRQHandler [WEAK] + EXPORT ETH2_PMT_LPI_IRQHandler [WEAK] + EXPORT FDCAN1_INT0_IRQHandler [WEAK] + EXPORT FDCAN2_INT0_IRQHandler [WEAK] + EXPORT FDCAN3_INT0_IRQHandler [WEAK] + EXPORT FDCAN4_INT0_IRQHandler [WEAK] + EXPORT FDCAN1_INT1_IRQHandler [WEAK] + EXPORT FDCAN2_INT1_IRQHandler [WEAK] + EXPORT FDCAN3_INT1_IRQHandler [WEAK] + EXPORT FDCAN4_INT1_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT USART4_IRQHandler [WEAK] + EXPORT USART5_IRQHandler [WEAK] + EXPORT USART6_IRQHandler [WEAK] + EXPORT USART7_IRQHandler [WEAK] + EXPORT USART8_IRQHandler [WEAK] + EXPORT UART9_IRQHandler [WEAK] + EXPORT UART10_IRQHandler [WEAK] + EXPORT UART11_IRQHandler [WEAK] + EXPORT UART12_IRQHandler [WEAK] + EXPORT UART13_IRQHandler [WEAK] + EXPORT UART14_IRQHandler [WEAK] + EXPORT UART15_IRQHandler [WEAK] + EXPORT LPUART1_IRQHandler [WEAK] + EXPORT LPUART2_IRQHandler [WEAK] + EXPORT GPU_IRQHandler [WEAK] + EXPORT SDMMC1_IRQHandler [WEAK] + EXPORT SDMMC2_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT ADC2_IRQHandler [WEAK] + EXPORT ADC3_IRQHandler [WEAK] + EXPORT COMP1_2_IRQHandler [WEAK] + EXPORT COMP3_4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT1_IRQHandler [WEAK] + EXPORT SHRTIM1_INT2_IRQHandler [WEAK] + EXPORT SHRTIM1_INT3_IRQHandler [WEAK] + EXPORT SHRTIM1_INT4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT5_IRQHandler [WEAK] + EXPORT SHRTIM1_INT6_IRQHandler [WEAK] + EXPORT SHRTIM1_INT7_IRQHandler [WEAK] + EXPORT SHRTIM1_INT8_IRQHandler [WEAK] + EXPORT SHRTIM2_INT1_IRQHandler [WEAK] + EXPORT SHRTIM2_INT2_IRQHandler [WEAK] + EXPORT SHRTIM2_INT3_IRQHandler [WEAK] + EXPORT SHRTIM2_INT4_IRQHandler [WEAK] + EXPORT SHRTIM2_INT5_IRQHandler [WEAK] + EXPORT SHRTIM2_INT6_IRQHandler [WEAK] + EXPORT SHRTIM2_INT7_IRQHandler [WEAK] + EXPORT SHRTIM2_INT8_IRQHandler [WEAK] + EXPORT FDCAN5_INT0_IRQHandler [WEAK] + EXPORT FDCAN6_INT0_IRQHandler [WEAK] + EXPORT FDCAN7_INT0_IRQHandler [WEAK] + EXPORT FDCAN8_INT0_IRQHandler [WEAK] + EXPORT FDCAN5_INT1_IRQHandler [WEAK] + EXPORT FDCAN6_INT1_IRQHandler [WEAK] + EXPORT FDCAN7_INT1_IRQHandler [WEAK] + EXPORT FDCAN8_INT1_IRQHandler [WEAK] + EXPORT LPTIM5_WKUP_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_H2P_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_P2H_IRQHandler [WEAK] + EXPORT WAKEUP_IO_IRQHandler [WEAK] + EXPORT SEMA4_INT1_IRQHandler [WEAK] + EXPORT WWDG2_RST_IRQHandler [WEAK] + EXPORT OTPC_IRQHandler [WEAK] + EXPORT FEMC_IRQHandler [WEAK] + EXPORT DCMUB_IRQHandler [WEAK] + EXPORT DAC1_IRQHandler [WEAK] + EXPORT DAC2_IRQHandler [WEAK] + EXPORT MDMA_AHBS_ER_IRQHandler [WEAK] + EXPORT CM7_CATCH_READ_ER_IRQHandler [WEAK] + EXPORT DAC3_IRQHandler [WEAK] + EXPORT DAC4_IRQHandler [WEAK] + EXPORT EMC_IRQHandler [WEAK] + EXPORT DAC5_IRQHandler [WEAK] + EXPORT DAC6_IRQHandler [WEAK] + EXPORT ESC_OPB_IRQHandler [WEAK] + EXPORT ESC_SYNC0_IRQHandler [WEAK] + EXPORT ESC_SYNC1_IRQHandler [WEAK] + EXPORT ESC_WRP_IRQHandler [WEAK] + EXPORT ATIM1_BRK_IRQHandler [WEAK] + EXPORT ATIM1_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM1_CC_IRQHandler [WEAK] + EXPORT ATIM1_UP_IRQHandler [WEAK] + EXPORT ATIM2_BRK_IRQHandler [WEAK] + EXPORT ATIM2_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM2_CC_IRQHandler [WEAK] + EXPORT ATIM2_UP_IRQHandler [WEAK] + EXPORT ATIM3_BRK_IRQHandler [WEAK] + EXPORT ATIM3_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM3_CC_IRQHandler [WEAK] + EXPORT ATIM3_UP_IRQHandler [WEAK] + EXPORT ATIM4_BRK_IRQHandler [WEAK] + EXPORT ATIM4_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM4_CC_IRQHandler [WEAK] + EXPORT ATIM4_UP_IRQHandler [WEAK] + EXPORT GTIMA1_IRQHandler [WEAK] + EXPORT GTIMA2_IRQHandler [WEAK] + EXPORT GTIMA3_IRQHandler [WEAK] + EXPORT GTIMA4_IRQHandler [WEAK] + EXPORT GTIMA5_IRQHandler [WEAK] + EXPORT GTIMA6_IRQHandler [WEAK] + EXPORT GTIMA7_IRQHandler [WEAK] + EXPORT GTIMB1_IRQHandler [WEAK] + EXPORT GTIMB2_IRQHandler [WEAK] + EXPORT GTIMB3_IRQHandler [WEAK] + EXPORT BTIM1_IRQHandler [WEAK] + EXPORT BTIM2_IRQHandler [WEAK] + EXPORT BTIM3_IRQHandler [WEAK] + EXPORT BTIM4_IRQHandler [WEAK] + EXPORT LPTIM1_WKUP_IRQHandler [WEAK] + EXPORT LPTIM2_WKUP_IRQHandler [WEAK] + EXPORT LPTIM3_WKUP_IRQHandler [WEAK] + EXPORT LPTIM4_WKUP_IRQHandler [WEAK] + EXPORT DSMU_FLT0_IRQHandler [WEAK] + EXPORT DSMU_FLT1_IRQHandler [WEAK] + EXPORT DSMU_FLT2_IRQHandler [WEAK] + EXPORT DSMU_FLT3_IRQHandler [WEAK] + EXPORT FMAC_IRQHandler [WEAK] + EXPORT CORDIC_IRQHandler [WEAK] + EXPORT DMAMUX1_IRQHandler [WEAK] + EXPORT MMU_IRQHandler [WEAK] + EXPORT SysTick_Handler [WEAK] + +WWDG1_IRQHandler +PVD_IRQHandler +RTC_TAMPER_IRQHandler +RTC_WKUP_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +EXTI9_5_IRQHandler +EXTI15_10_IRQHandler +DMA1_Channel0_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +DMA2_Channel0_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +DMA2_Channel6_IRQHandler +DMA2_Channel7_IRQHandler +DMA3_Channel0_IRQHandler +DMA3_Channel1_IRQHandler +DMA3_Channel2_IRQHandler +DMA3_Channel3_IRQHandler +DMA3_Channel4_IRQHandler +DMA3_Channel5_IRQHandler +DMA3_Channel6_IRQHandler +DMA3_Channel7_IRQHandler +MDMA_Channel0_IRQHandler +MDMA_Channel1_IRQHandler +MDMA_Channel2_IRQHandler +MDMA_Channel3_IRQHandler +MDMA_Channel4_IRQHandler +MDMA_Channel5_IRQHandler +MDMA_Channel6_IRQHandler +MDMA_Channel7_IRQHandler +MDMA_Channel8_IRQHandler +MDMA_Channel9_IRQHandler +MDMA_Channel10_IRQHandler +MDMA_Channel11_IRQHandler +MDMA_Channel12_IRQHandler +MDMA_Channel13_IRQHandler +MDMA_Channel14_IRQHandler +MDMA_Channel15_IRQHandler +SDPU_IRQHandler +FPU_CPU1_IRQHandler +ECCMON_IRQHandler +RTC_ALARM_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +I2C3_EV_IRQHandler +I2C3_ER_IRQHandler +I2C4_EV_IRQHandler +I2C4_ER_IRQHandler +I2C5_EV_IRQHandler +I2C5_ER_IRQHandler +I2C6_EV_IRQHandler +I2C6_ER_IRQHandler +I2C7_EV_IRQHandler +I2C7_ER_IRQHandler +I2C8_EV_IRQHandler +I2C8_ER_IRQHandler +I2C9_EV_IRQHandler +I2C9_ER_IRQHandler +I2C10_EV_IRQHandler +I2C10_ER_IRQHandler +I2S1_IRQHandler +I2S2_IRQHandler +I2S3_IRQHandler +I2S4_IRQHandler +xSPI1_IRQHandler +xSPI2_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +SPI3_IRQHandler +SPI4_IRQHandler +SPI5_IRQHandler +SPI6_IRQHandler +SPI7_IRQHandler +LCD_EV_IRQHandler +LCD_ER_IRQHandler +DVP1_IRQHandler +DVP2_IRQHandler +DMAMUX2_IRQHandler +USB1_HS_EPx_OUT_IRQHandler +USB1_HS_EPx_IN_IRQHandler +USB1_HS_WKUP_IRQHandler +USB1_HS_IRQHandler +USB2_HS_EPx_OUT_IRQHandler +USB2_HS_EPx_IN_IRQHandler +USB2_HS_WKUP_IRQHandler +USB2_HS_IRQHandler +ETH1_IRQHandler +ETH1_PMT_LPI_IRQHandler +ETH2_IRQHandler +ETH2_PMT_LPI_IRQHandler +FDCAN1_INT0_IRQHandler +FDCAN2_INT0_IRQHandler +FDCAN3_INT0_IRQHandler +FDCAN4_INT0_IRQHandler +FDCAN1_INT1_IRQHandler +FDCAN2_INT1_IRQHandler +FDCAN3_INT1_IRQHandler +FDCAN4_INT1_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +USART4_IRQHandler +USART5_IRQHandler +USART6_IRQHandler +USART7_IRQHandler +USART8_IRQHandler +UART9_IRQHandler +UART10_IRQHandler +UART11_IRQHandler +UART12_IRQHandler +UART13_IRQHandler +UART14_IRQHandler +UART15_IRQHandler +LPUART1_IRQHandler +LPUART2_IRQHandler +GPU_IRQHandler +SDMMC1_IRQHandler +SDMMC2_IRQHandler +ADC1_IRQHandler +ADC2_IRQHandler +ADC3_IRQHandler +COMP1_2_IRQHandler +COMP3_4_IRQHandler +SHRTIM1_INT1_IRQHandler +SHRTIM1_INT2_IRQHandler +SHRTIM1_INT3_IRQHandler +SHRTIM1_INT4_IRQHandler +SHRTIM1_INT5_IRQHandler +SHRTIM1_INT6_IRQHandler +SHRTIM1_INT7_IRQHandler +SHRTIM1_INT8_IRQHandler +SHRTIM2_INT1_IRQHandler +SHRTIM2_INT2_IRQHandler +SHRTIM2_INT3_IRQHandler +SHRTIM2_INT4_IRQHandler +SHRTIM2_INT5_IRQHandler +SHRTIM2_INT6_IRQHandler +SHRTIM2_INT7_IRQHandler +SHRTIM2_INT8_IRQHandler +FDCAN5_INT0_IRQHandler +FDCAN6_INT0_IRQHandler +FDCAN7_INT0_IRQHandler +FDCAN8_INT0_IRQHandler +FDCAN5_INT1_IRQHandler +FDCAN6_INT1_IRQHandler +FDCAN7_INT1_IRQHandler +FDCAN8_INT1_IRQHandler +LPTIM5_WKUP_IRQHandler +JPEG_SGDMA_H2P_IRQHandler +JPEG_SGDMA_P2H_IRQHandler +WAKEUP_IO_IRQHandler +SEMA4_INT1_IRQHandler +WWDG2_RST_IRQHandler +OTPC_IRQHandler +FEMC_IRQHandler +DCMUB_IRQHandler +DAC1_IRQHandler +DAC2_IRQHandler +MDMA_AHBS_ER_IRQHandler +CM7_CATCH_READ_ER_IRQHandler +DAC3_IRQHandler +DAC4_IRQHandler +EMC_IRQHandler +DAC5_IRQHandler +DAC6_IRQHandler +ESC_OPB_IRQHandler +ESC_SYNC0_IRQHandler +ESC_SYNC1_IRQHandler +ESC_WRP_IRQHandler +ATIM1_BRK_IRQHandler +ATIM1_TRG_COM_IRQHandler +ATIM1_CC_IRQHandler +ATIM1_UP_IRQHandler +ATIM2_BRK_IRQHandler +ATIM2_TRG_COM_IRQHandler +ATIM2_CC_IRQHandler +ATIM2_UP_IRQHandler +ATIM3_BRK_IRQHandler +ATIM3_TRG_COM_IRQHandler +ATIM3_CC_IRQHandler +ATIM3_UP_IRQHandler +ATIM4_BRK_IRQHandler +ATIM4_TRG_COM_IRQHandler +ATIM4_CC_IRQHandler +ATIM4_UP_IRQHandler +GTIMA1_IRQHandler +GTIMA2_IRQHandler +GTIMA3_IRQHandler +GTIMA4_IRQHandler +GTIMA5_IRQHandler +GTIMA6_IRQHandler +GTIMA7_IRQHandler +GTIMB1_IRQHandler +GTIMB2_IRQHandler +GTIMB3_IRQHandler +BTIM1_IRQHandler +BTIM2_IRQHandler +BTIM3_IRQHandler +BTIM4_IRQHandler +LPTIM1_WKUP_IRQHandler +LPTIM2_WKUP_IRQHandler +LPTIM3_WKUP_IRQHandler +LPTIM4_WKUP_IRQHandler +DSMU_FLT0_IRQHandler +DSMU_FLT1_IRQHandler +DSMU_FLT2_IRQHandler +DSMU_FLT3_IRQHandler +FMAC_IRQHandler +CORDIC_IRQHandler +DMAMUX1_IRQHandler +MMU_IRQHandler +SysTick_Handler + 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 + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h76x_EWARM.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h76x_EWARM.s new file mode 100644 index 0000000000..3c72ea193e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h76x_EWARM.s @@ -0,0 +1,1529 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + + 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 + + __iar_init$$done: ; The vector table is not needed + ; until after copy initialization is done + +__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 N32SysTick_Handler ; N32SysTick Handler + + + + ; External Interrupts + DCD WWDG1_IRQHandler ; Window1 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD FPU_CPU1_IRQHandler ; FPU_CM7 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD SEMA4_INT1_IRQHandler ; SEMA4 interrupt1 + DCD 0 ; Reserved + DCD WWDG2_RST_IRQHandler ; WWDG2 reset interrupt through EXTI line 82 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUB_IRQHandler ; DCMUB interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_RQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; Reserved + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt + DCD SysTick_Handler ; SysTick Handler + ;need check to user manual of exti chapter + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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 N32SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +N32SysTick_Handler + B N32SysTick_Handler + + PUBWEAK WWDG1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG1_IRQHandler + B WWDG1_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK RTC_TAMPER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_TAMPER_IRQHandler + B RTC_TAMPER_IRQHandler + + PUBWEAK RTC_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_WKUP_IRQHandler + B RTC_WKUP_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK DMA1_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel0_IRQHandler + B DMA1_Channel0_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 DMA2_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel0_IRQHandler + B DMA2_Channel0_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_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel4_IRQHandler + B DMA2_Channel4_IRQHandler + + PUBWEAK DMA2_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel5_IRQHandler + B DMA2_Channel5_IRQHandler + + PUBWEAK DMA2_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel6_IRQHandler + B DMA2_Channel6_IRQHandler + + PUBWEAK DMA2_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel7_IRQHandler + B DMA2_Channel7_IRQHandler + + PUBWEAK DMA3_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel0_IRQHandler + B DMA3_Channel0_IRQHandler + + PUBWEAK DMA3_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel1_IRQHandler + B DMA3_Channel1_IRQHandler + + PUBWEAK DMA3_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel2_IRQHandler + B DMA3_Channel2_IRQHandler + + PUBWEAK DMA3_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel3_IRQHandler + B DMA3_Channel3_IRQHandler + + PUBWEAK DMA3_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel4_IRQHandler + B DMA3_Channel4_IRQHandler + + PUBWEAK DMA3_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel5_IRQHandler + B DMA3_Channel5_IRQHandler + + PUBWEAK DMA3_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel6_IRQHandler + B DMA3_Channel6_IRQHandler + + PUBWEAK DMA3_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel7_IRQHandler + B DMA3_Channel7_IRQHandler + + PUBWEAK MDMA_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel0_IRQHandler + B MDMA_Channel0_IRQHandler + + PUBWEAK MDMA_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel1_IRQHandler + B MDMA_Channel1_IRQHandler + + PUBWEAK MDMA_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel2_IRQHandler + B MDMA_Channel2_IRQHandler + + PUBWEAK MDMA_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel3_IRQHandler + B MDMA_Channel3_IRQHandler + + PUBWEAK MDMA_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel4_IRQHandler + B MDMA_Channel4_IRQHandler + + PUBWEAK MDMA_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel5_IRQHandler + B MDMA_Channel5_IRQHandler + + PUBWEAK MDMA_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel6_IRQHandler + B MDMA_Channel6_IRQHandler + + PUBWEAK MDMA_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel7_IRQHandler + B MDMA_Channel7_IRQHandler + + PUBWEAK MDMA_Channel8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel8_IRQHandler + B MDMA_Channel8_IRQHandler + + PUBWEAK MDMA_Channel9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel9_IRQHandler + B MDMA_Channel9_IRQHandler + + PUBWEAK MDMA_Channel10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel10_IRQHandler + B MDMA_Channel10_IRQHandler + + PUBWEAK MDMA_Channel11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel11_IRQHandler + B MDMA_Channel11_IRQHandler + + PUBWEAK MDMA_Channel12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel12_IRQHandler + B MDMA_Channel12_IRQHandler + + PUBWEAK MDMA_Channel13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel13_IRQHandler + B MDMA_Channel13_IRQHandler + + PUBWEAK MDMA_Channel14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel14_IRQHandler + B MDMA_Channel14_IRQHandler + + PUBWEAK MDMA_Channel15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel15_IRQHandler + B MDMA_Channel15_IRQHandler + + PUBWEAK SDPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDPU_IRQHandler + B SDPU_IRQHandler + + PUBWEAK FPU_CPU1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FPU_CPU1_IRQHandler + B FPU_CPU1_IRQHandler + + PUBWEAK ECCMON_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ECCMON_IRQHandler + B ECCMON_IRQHandler + + PUBWEAK RTC_ALARM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_ALARM_IRQHandler + B RTC_ALARM_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 I2C3_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_EV_IRQHandler + B I2C3_EV_IRQHandler + + PUBWEAK I2C3_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_ER_IRQHandler + B I2C3_ER_IRQHandler + + PUBWEAK I2C4_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_EV_IRQHandler + B I2C4_EV_IRQHandler + + PUBWEAK I2C4_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_ER_IRQHandler + B I2C4_ER_IRQHandler + + PUBWEAK I2C5_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_EV_IRQHandler + B I2C5_EV_IRQHandler + + PUBWEAK I2C5_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_ER_IRQHandler + B I2C5_ER_IRQHandler + + PUBWEAK I2C6_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_EV_IRQHandler + B I2C6_EV_IRQHandler + + PUBWEAK I2C6_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_ER_IRQHandler + B I2C6_ER_IRQHandler + + PUBWEAK I2C7_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_EV_IRQHandler + B I2C7_EV_IRQHandler + + PUBWEAK I2C7_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_ER_IRQHandler + B I2C7_ER_IRQHandler + + PUBWEAK I2C8_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_EV_IRQHandler + B I2C8_EV_IRQHandler + + PUBWEAK I2C8_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_ER_IRQHandler + B I2C8_ER_IRQHandler + + PUBWEAK I2C9_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_EV_IRQHandler + B I2C9_EV_IRQHandler + + PUBWEAK I2C9_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_ER_IRQHandler + B I2C9_ER_IRQHandler + + PUBWEAK I2C10_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_EV_IRQHandler + B I2C10_EV_IRQHandler + + PUBWEAK I2C10_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_ER_IRQHandler + B I2C10_ER_IRQHandler + + PUBWEAK I2S1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S1_IRQHandler + B I2S1_IRQHandler + + PUBWEAK I2S2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S2_IRQHandler + B I2S2_IRQHandler + + PUBWEAK I2S3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S3_IRQHandler + B I2S3_IRQHandler + + PUBWEAK I2S4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S4_IRQHandler + B I2S4_IRQHandler + + PUBWEAK xSPI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI1_IRQHandler + B xSPI1_IRQHandler + + PUBWEAK xSPI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI2_IRQHandler + B xSPI2_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 SPI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK SPI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI4_IRQHandler + B SPI4_IRQHandler + + PUBWEAK SPI5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI5_IRQHandler + B SPI5_IRQHandler + + PUBWEAK SPI6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI6_IRQHandler + B SPI6_IRQHandler + + PUBWEAK SPI7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI7_IRQHandler + B SPI7_IRQHandler + + PUBWEAK LCD_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_EV_IRQHandler + B LCD_EV_IRQHandler + + PUBWEAK LCD_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_ER_IRQHandler + B LCD_ER_IRQHandler + + PUBWEAK DVP1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP1_IRQHandler + B DVP1_IRQHandler + + PUBWEAK DVP2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP2_IRQHandler + B DVP2_IRQHandler + + PUBWEAK DMAMUX2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX2_IRQHandler + B DMAMUX2_IRQHandler + + PUBWEAK USB1_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_OUT_IRQHandler + B USB1_HS_EPx_OUT_IRQHandler + + PUBWEAK USB1_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_IN_IRQHandler + B USB1_HS_EPx_IN_IRQHandler + + PUBWEAK USB1_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_WKUP_IRQHandler + B USB1_HS_WKUP_IRQHandler + + PUBWEAK USB1_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_IRQHandler + B USB1_HS_IRQHandler + + PUBWEAK USB2_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_OUT_IRQHandler + B USB2_HS_EPx_OUT_IRQHandler + + PUBWEAK USB2_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_IN_IRQHandler + B USB2_HS_EPx_IN_IRQHandler + + PUBWEAK USB2_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_WKUP_IRQHandler + B USB2_HS_WKUP_IRQHandler + + PUBWEAK USB2_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_IRQHandler + B USB2_HS_IRQHandler + + PUBWEAK ETH1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_IRQHandler + B ETH1_IRQHandler + + PUBWEAK ETH1_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_PMT_LPI_IRQHandler + B ETH1_PMT_LPI_IRQHandler + + PUBWEAK ETH2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_IRQHandler + B ETH2_IRQHandler + + PUBWEAK ETH2_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_PMT_LPI_IRQHandler + B ETH2_PMT_LPI_IRQHandler + + PUBWEAK FDCAN1_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT0_IRQHandler + B FDCAN1_INT0_IRQHandler + + PUBWEAK FDCAN2_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT0_IRQHandler + B FDCAN2_INT0_IRQHandler + + PUBWEAK FDCAN3_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT0_IRQHandler + B FDCAN3_INT0_IRQHandler + + PUBWEAK FDCAN4_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT0_IRQHandler + B FDCAN4_INT0_IRQHandler + + PUBWEAK FDCAN1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT1_IRQHandler + B FDCAN1_INT1_IRQHandler + + PUBWEAK FDCAN2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT1_IRQHandler + B FDCAN2_INT1_IRQHandler + + PUBWEAK FDCAN3_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT1_IRQHandler + B FDCAN3_INT1_IRQHandler + + PUBWEAK FDCAN4_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT1_IRQHandler + B FDCAN4_INT1_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 USART4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART4_IRQHandler + B USART4_IRQHandler + + PUBWEAK USART5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART5_IRQHandler + B USART5_IRQHandler + + PUBWEAK USART6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART6_IRQHandler + B USART6_IRQHandler + + PUBWEAK USART7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART7_IRQHandler + B USART7_IRQHandler + + PUBWEAK USART8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART8_IRQHandler + B USART8_IRQHandler + + PUBWEAK UART9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART9_IRQHandler + B UART9_IRQHandler + + PUBWEAK UART10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART10_IRQHandler + B UART10_IRQHandler + + PUBWEAK UART11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART11_IRQHandler + B UART11_IRQHandler + + PUBWEAK UART12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART12_IRQHandler + B UART12_IRQHandler + + PUBWEAK UART13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART13_IRQHandler + B UART13_IRQHandler + + PUBWEAK UART14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART14_IRQHandler + B UART14_IRQHandler + + PUBWEAK UART15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART15_IRQHandler + B UART15_IRQHandler + + PUBWEAK LPUART1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART1_IRQHandler + B LPUART1_IRQHandler + + PUBWEAK LPUART2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART2_IRQHandler + B LPUART2_IRQHandler + + PUBWEAK GPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GPU_IRQHandler + B GPU_IRQHandler + + PUBWEAK SDMMC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC1_IRQHandler + B SDMMC1_IRQHandler + + PUBWEAK SDMMC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC2_IRQHandler + B SDMMC2_IRQHandler + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + PUBWEAK ADC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC2_IRQHandler + B ADC2_IRQHandler + + PUBWEAK ADC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC3_IRQHandler + B ADC3_IRQHandler + + PUBWEAK COMP1_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP1_2_IRQHandler + B COMP1_2_IRQHandler + + PUBWEAK COMP3_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP3_4_IRQHandler + B COMP3_4_IRQHandler + + PUBWEAK SHRTIM1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT1_IRQHandler + B SHRTIM1_INT1_IRQHandler + + PUBWEAK SHRTIM1_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT2_IRQHandler + B SHRTIM1_INT2_IRQHandler + + PUBWEAK SHRTIM1_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT3_IRQHandler + B SHRTIM1_INT3_IRQHandler + + PUBWEAK SHRTIM1_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT4_IRQHandler + B SHRTIM1_INT4_IRQHandler + + PUBWEAK SHRTIM1_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT5_IRQHandler + B SHRTIM1_INT5_IRQHandler + + PUBWEAK SHRTIM1_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT6_IRQHandler + B SHRTIM1_INT6_IRQHandler + + PUBWEAK SHRTIM1_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT7_IRQHandler + B SHRTIM1_INT7_IRQHandler + + PUBWEAK SHRTIM1_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT8_IRQHandler + B SHRTIM1_INT8_IRQHandler + + PUBWEAK SHRTIM2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT1_IRQHandler + B SHRTIM2_INT1_IRQHandler + + PUBWEAK SHRTIM2_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT2_IRQHandler + B SHRTIM2_INT2_IRQHandler + + PUBWEAK SHRTIM2_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT3_IRQHandler + B SHRTIM2_INT3_IRQHandler + + PUBWEAK SHRTIM2_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT4_IRQHandler + B SHRTIM2_INT4_IRQHandler + + PUBWEAK SHRTIM2_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT5_IRQHandler + B SHRTIM2_INT5_IRQHandler + + PUBWEAK SHRTIM2_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT6_IRQHandler + B SHRTIM2_INT6_IRQHandler + + PUBWEAK SHRTIM2_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT7_IRQHandler + B SHRTIM2_INT7_IRQHandler + + PUBWEAK SHRTIM2_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT8_IRQHandler + B SHRTIM2_INT8_IRQHandler + + PUBWEAK FDCAN5_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT0_IRQHandler + B FDCAN5_INT0_IRQHandler + + PUBWEAK FDCAN6_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT0_IRQHandler + B FDCAN6_INT0_IRQHandler + + PUBWEAK FDCAN7_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT0_IRQHandler + B FDCAN7_INT0_IRQHandler + + PUBWEAK FDCAN8_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT0_IRQHandler + B FDCAN8_INT0_IRQHandler + + PUBWEAK FDCAN5_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT1_IRQHandler + B FDCAN5_INT1_IRQHandler + + PUBWEAK FDCAN6_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT1_IRQHandler + B FDCAN6_INT1_IRQHandler + + PUBWEAK FDCAN7_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT1_IRQHandler + B FDCAN7_INT1_IRQHandler + + PUBWEAK FDCAN8_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT1_IRQHandler + B FDCAN8_INT1_IRQHandler + + PUBWEAK LPTIM5_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM5_WKUP_IRQHandler + B LPTIM5_WKUP_IRQHandler + + PUBWEAK JPEG_SGDMA_H2P_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_H2P_IRQHandler + B JPEG_SGDMA_H2P_IRQHandler + + PUBWEAK JPEG_SGDMA_P2H_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_P2H_IRQHandler + B JPEG_SGDMA_P2H_IRQHandler + + PUBWEAK WAKEUP_IO_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WAKEUP_IO_IRQHandler + B WAKEUP_IO_IRQHandler + + PUBWEAK SEMA4_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SEMA4_INT1_IRQHandler + B SEMA4_INT1_IRQHandler + + PUBWEAK WWDG2_RST_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG2_RST_IRQHandler + B WWDG2_RST_IRQHandler + + PUBWEAK OTPC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +OTPC_IRQHandler + B OTPC_IRQHandler + + PUBWEAK FEMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FEMC_IRQHandler + B FEMC_IRQHandler + + PUBWEAK DCMUB_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DCMUB_IRQHandler + B DCMUB_IRQHandler + + PUBWEAK DAC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC1_IRQHandler + B DAC1_IRQHandler + + PUBWEAK DAC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC2_IRQHandler + B DAC2_IRQHandler + + PUBWEAK MDMA_AHBS_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_AHBS_ER_IRQHandler + B MDMA_AHBS_ER_IRQHandler + + PUBWEAK CM7_CATCH_READ_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CM7_CATCH_READ_ER_IRQHandler + B CM7_CATCH_READ_ER_IRQHandler + + PUBWEAK DAC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC3_IRQHandler + B DAC3_IRQHandler + + PUBWEAK DAC4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC4_IRQHandler + B DAC4_IRQHandler + + PUBWEAK EMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EMC_IRQHandler + B EMC_IRQHandler + + PUBWEAK DAC5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC5_IRQHandler + B DAC5_IRQHandler + + PUBWEAK DAC6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC6_IRQHandler + B DAC6_IRQHandler + + PUBWEAK ESC_OPB_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_OPB_IRQHandler + B ESC_OPB_IRQHandler + + PUBWEAK ESC_SYNC0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC0_IRQHandler + B ESC_SYNC0_IRQHandler + + PUBWEAK ESC_SYNC1_RQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC1_RQHandler + B ESC_SYNC1_RQHandler + + PUBWEAK ESC_WRP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_WRP_IRQHandler + B ESC_WRP_IRQHandler + + PUBWEAK ATIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_BRK_IRQHandler + B ATIM1_BRK_IRQHandler + + PUBWEAK ATIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_TRG_COM_IRQHandler + B ATIM1_TRG_COM_IRQHandler + + PUBWEAK ATIM1_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_CC_IRQHandler + B ATIM1_CC_IRQHandler + + PUBWEAK ATIM1_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_UP_IRQHandler + B ATIM1_UP_IRQHandler + + PUBWEAK ATIM2_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_BRK_IRQHandler + B ATIM2_BRK_IRQHandler + + PUBWEAK ATIM2_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_TRG_COM_IRQHandler + B ATIM2_TRG_COM_IRQHandler + + PUBWEAK ATIM2_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_CC_IRQHandler + B ATIM2_CC_IRQHandler + + PUBWEAK ATIM2_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_UP_IRQHandler + B ATIM2_UP_IRQHandler + + PUBWEAK ATIM3_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_BRK_IRQHandler + B ATIM3_BRK_IRQHandler + + PUBWEAK ATIM3_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_TRG_COM_IRQHandler + B ATIM3_TRG_COM_IRQHandler + + PUBWEAK ATIM3_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_CC_IRQHandler + B ATIM3_CC_IRQHandler + + PUBWEAK ATIM3_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_UP_IRQHandler + B ATIM3_UP_IRQHandler + + PUBWEAK ATIM4_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_BRK_IRQHandler + B ATIM4_BRK_IRQHandler + + PUBWEAK ATIM4_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_TRG_COM_IRQHandler + B ATIM4_TRG_COM_IRQHandler + + PUBWEAK ATIM4_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_CC_IRQHandler + B ATIM4_CC_IRQHandler + + PUBWEAK ATIM4_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_UP_IRQHandler + B ATIM4_UP_IRQHandler + + PUBWEAK GTIMA1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA1_IRQHandler + B GTIMA1_IRQHandler + + PUBWEAK GTIMA2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA2_IRQHandler + B GTIMA2_IRQHandler + + PUBWEAK GTIMA3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA3_IRQHandler + B GTIMA3_IRQHandler + + PUBWEAK GTIMA4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA4_IRQHandler + B GTIMA4_IRQHandler + + PUBWEAK GTIMA5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA5_IRQHandler + B GTIMA5_IRQHandler + + PUBWEAK GTIMA6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA6_IRQHandler + B GTIMA6_IRQHandler + + PUBWEAK GTIMA7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA7_IRQHandler + B GTIMA7_IRQHandler + + PUBWEAK GTIMB1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB1_IRQHandler + B GTIMB1_IRQHandler + + PUBWEAK GTIMB2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB2_IRQHandler + B GTIMB2_IRQHandler + + PUBWEAK GTIMB3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB3_IRQHandler + B GTIMB3_IRQHandler + + PUBWEAK BTIM1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM1_IRQHandler + B BTIM1_IRQHandler + + PUBWEAK BTIM2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM2_IRQHandler + B BTIM2_IRQHandler + + PUBWEAK BTIM3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM3_IRQHandler + B BTIM3_IRQHandler + + PUBWEAK BTIM4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM4_IRQHandler + B BTIM4_IRQHandler + + PUBWEAK LPTIM1_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM1_WKUP_IRQHandler + B LPTIM1_WKUP_IRQHandler + + PUBWEAK LPTIM2_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM2_WKUP_IRQHandler + B LPTIM2_WKUP_IRQHandler + + PUBWEAK LPTIM3_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM3_WKUP_IRQHandler + B LPTIM3_WKUP_IRQHandler + + PUBWEAK LPTIM4_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM4_WKUP_IRQHandler + B LPTIM4_WKUP_IRQHandler + + PUBWEAK DSMU_FLT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT0_IRQHandler + B DSMU_FLT0_IRQHandler + + PUBWEAK DSMU_FLT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT1_IRQHandler + B DSMU_FLT1_IRQHandler + + PUBWEAK DSMU_FLT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT2_IRQHandler + B DSMU_FLT2_IRQHandler + + PUBWEAK DSMU_FLT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT3_IRQHandler + B DSMU_FLT3_IRQHandler + + PUBWEAK FMAC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FMAC_IRQHandler + B FMAC_IRQHandler + + PUBWEAK CORDIC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CORDIC_IRQHandler + B CORDIC_IRQHandler + + PUBWEAK DMAMUX1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX1_IRQHandler + B DMAMUX1_IRQHandler + + PUBWEAK MMU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MMU_IRQHandler + B MMU_IRQHandler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + END + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm4.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm4.s new file mode 100644 index 0000000000..d651a057ca --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm4.s @@ -0,0 +1,897 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00002000 + + 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 0x00000400 + + 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 WWDG2_IRQHandler ; Window2 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD AHB_ICACHE_IRQHandler ; CM4 AHB iCache interrupt + DCD AHB_DCACHE_IRQHandler ; CM4 AHB dCache interrupt + DCD FPU_CPU2_IRQHandler ; FPU_CM4 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD DSI_IRQHandler ; MIPI DSI Interrupt through EXTI line 87 + DCD AHB_CACHE_PARMON_IRQHandler ; AHB i/dCACHE parity error intertupt + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD 0 ; + DCD SEMA4_INT2_IRQHandler ; SEMA4 interrupt2 + DCD WWDG1_RST_IRQHandler ; WWDG1 reset interrupt through EXTI line 81 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUA_IRQHandler ; DCMUA interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_IRQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt +__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 WWDG2_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT RTC_TAMPER_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT DMA1_Channel0_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 DMA2_Channel0_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT DMA2_Channel6_IRQHandler [WEAK] + EXPORT DMA2_Channel7_IRQHandler [WEAK] + EXPORT DMA3_Channel0_IRQHandler [WEAK] + EXPORT DMA3_Channel1_IRQHandler [WEAK] + EXPORT DMA3_Channel2_IRQHandler [WEAK] + EXPORT DMA3_Channel3_IRQHandler [WEAK] + EXPORT DMA3_Channel4_IRQHandler [WEAK] + EXPORT DMA3_Channel5_IRQHandler [WEAK] + EXPORT DMA3_Channel6_IRQHandler [WEAK] + EXPORT DMA3_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel0_IRQHandler [WEAK] + EXPORT MDMA_Channel1_IRQHandler [WEAK] + EXPORT MDMA_Channel2_IRQHandler [WEAK] + EXPORT MDMA_Channel3_IRQHandler [WEAK] + EXPORT MDMA_Channel4_IRQHandler [WEAK] + EXPORT MDMA_Channel5_IRQHandler [WEAK] + EXPORT MDMA_Channel6_IRQHandler [WEAK] + EXPORT MDMA_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel8_IRQHandler [WEAK] + EXPORT MDMA_Channel9_IRQHandler [WEAK] + EXPORT MDMA_Channel10_IRQHandler [WEAK] + EXPORT MDMA_Channel11_IRQHandler [WEAK] + EXPORT MDMA_Channel12_IRQHandler [WEAK] + EXPORT MDMA_Channel13_IRQHandler [WEAK] + EXPORT MDMA_Channel14_IRQHandler [WEAK] + EXPORT MDMA_Channel15_IRQHandler [WEAK] + EXPORT SDPU_IRQHandler [WEAK] + EXPORT AHB_ICACHE_IRQHandler [WEAK] + EXPORT AHB_DCACHE_IRQHandler [WEAK] + EXPORT FPU_CPU2_IRQHandler [WEAK] + EXPORT ECCMON_IRQHandler [WEAK] + EXPORT RTC_ALARM_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT I2C3_EV_IRQHandler [WEAK] + EXPORT I2C3_ER_IRQHandler [WEAK] + EXPORT I2C4_EV_IRQHandler [WEAK] + EXPORT I2C4_ER_IRQHandler [WEAK] + EXPORT I2C5_EV_IRQHandler [WEAK] + EXPORT I2C5_ER_IRQHandler [WEAK] + EXPORT I2C6_EV_IRQHandler [WEAK] + EXPORT I2C6_ER_IRQHandler [WEAK] + EXPORT I2C7_EV_IRQHandler [WEAK] + EXPORT I2C7_ER_IRQHandler [WEAK] + EXPORT I2C8_EV_IRQHandler [WEAK] + EXPORT I2C8_ER_IRQHandler [WEAK] + EXPORT I2C9_EV_IRQHandler [WEAK] + EXPORT I2C9_ER_IRQHandler [WEAK] + EXPORT I2C10_EV_IRQHandler [WEAK] + EXPORT I2C10_ER_IRQHandler [WEAK] + EXPORT I2S1_IRQHandler [WEAK] + EXPORT I2S2_IRQHandler [WEAK] + EXPORT I2S3_IRQHandler [WEAK] + EXPORT I2S4_IRQHandler [WEAK] + EXPORT xSPI1_IRQHandler [WEAK] + EXPORT xSPI2_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT SPI4_IRQHandler [WEAK] + EXPORT SPI5_IRQHandler [WEAK] + EXPORT SPI6_IRQHandler [WEAK] + EXPORT SPI7_IRQHandler [WEAK] + EXPORT LCD_EV_IRQHandler [WEAK] + EXPORT LCD_ER_IRQHandler [WEAK] + EXPORT DVP1_IRQHandler [WEAK] + EXPORT DVP2_IRQHandler [WEAK] + EXPORT DMAMUX2_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB1_HS_WKUP_IRQHandler [WEAK] + EXPORT USB1_HS_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB2_HS_WKUP_IRQHandler [WEAK] + EXPORT USB2_HS_IRQHandler [WEAK] + EXPORT ETH1_IRQHandler [WEAK] + EXPORT ETH1_PMT_LPI_IRQHandler [WEAK] + EXPORT ETH2_IRQHandler [WEAK] + EXPORT ETH2_PMT_LPI_IRQHandler [WEAK] + EXPORT FDCAN1_INT0_IRQHandler [WEAK] + EXPORT FDCAN2_INT0_IRQHandler [WEAK] + EXPORT FDCAN3_INT0_IRQHandler [WEAK] + EXPORT FDCAN4_INT0_IRQHandler [WEAK] + EXPORT FDCAN1_INT1_IRQHandler [WEAK] + EXPORT FDCAN2_INT1_IRQHandler [WEAK] + EXPORT FDCAN3_INT1_IRQHandler [WEAK] + EXPORT FDCAN4_INT1_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT USART4_IRQHandler [WEAK] + EXPORT USART5_IRQHandler [WEAK] + EXPORT USART6_IRQHandler [WEAK] + EXPORT USART7_IRQHandler [WEAK] + EXPORT USART8_IRQHandler [WEAK] + EXPORT UART9_IRQHandler [WEAK] + EXPORT UART10_IRQHandler [WEAK] + EXPORT UART11_IRQHandler [WEAK] + EXPORT UART12_IRQHandler [WEAK] + EXPORT UART13_IRQHandler [WEAK] + EXPORT UART14_IRQHandler [WEAK] + EXPORT UART15_IRQHandler [WEAK] + EXPORT LPUART1_IRQHandler [WEAK] + EXPORT LPUART2_IRQHandler [WEAK] + EXPORT GPU_IRQHandler [WEAK] + EXPORT SDMMC1_IRQHandler [WEAK] + EXPORT SDMMC2_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT ADC2_IRQHandler [WEAK] + EXPORT ADC3_IRQHandler [WEAK] + EXPORT COMP1_2_IRQHandler [WEAK] + EXPORT COMP3_4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT1_IRQHandler [WEAK] + EXPORT SHRTIM1_INT2_IRQHandler [WEAK] + EXPORT SHRTIM1_INT3_IRQHandler [WEAK] + EXPORT SHRTIM1_INT4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT5_IRQHandler [WEAK] + EXPORT SHRTIM1_INT6_IRQHandler [WEAK] + EXPORT SHRTIM1_INT7_IRQHandler [WEAK] + EXPORT SHRTIM1_INT8_IRQHandler [WEAK] + EXPORT SHRTIM2_INT1_IRQHandler [WEAK] + EXPORT SHRTIM2_INT2_IRQHandler [WEAK] + EXPORT SHRTIM2_INT3_IRQHandler [WEAK] + EXPORT SHRTIM2_INT4_IRQHandler [WEAK] + EXPORT SHRTIM2_INT5_IRQHandler [WEAK] + EXPORT SHRTIM2_INT6_IRQHandler [WEAK] + EXPORT SHRTIM2_INT7_IRQHandler [WEAK] + EXPORT SHRTIM2_INT8_IRQHandler [WEAK] + EXPORT FDCAN5_INT0_IRQHandler [WEAK] + EXPORT FDCAN6_INT0_IRQHandler [WEAK] + EXPORT FDCAN7_INT0_IRQHandler [WEAK] + EXPORT FDCAN8_INT0_IRQHandler [WEAK] + EXPORT FDCAN5_INT1_IRQHandler [WEAK] + EXPORT FDCAN6_INT1_IRQHandler [WEAK] + EXPORT FDCAN7_INT1_IRQHandler [WEAK] + EXPORT FDCAN8_INT1_IRQHandler [WEAK] + EXPORT DSI_IRQHandler [WEAK] + EXPORT AHB_CACHE_PARMON_IRQHandler [WEAK] + EXPORT LPTIM5_WKUP_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_H2P_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_P2H_IRQHandler [WEAK] + EXPORT WAKEUP_IO_IRQHandler [WEAK] + EXPORT SEMA4_INT2_IRQHandler [WEAK] + EXPORT WWDG1_RST_IRQHandler [WEAK] + EXPORT OTPC_IRQHandler [WEAK] + EXPORT FEMC_IRQHandler [WEAK] + EXPORT DCMUA_IRQHandler [WEAK] + EXPORT DAC1_IRQHandler [WEAK] + EXPORT DAC2_IRQHandler [WEAK] + EXPORT MDMA_AHBS_ER_IRQHandler [WEAK] + EXPORT CM7_CATCH_READ_ER_IRQHandler [WEAK] + EXPORT DAC3_IRQHandler [WEAK] + EXPORT DAC4_IRQHandler [WEAK] + EXPORT EMC_IRQHandler [WEAK] + EXPORT DAC5_IRQHandler [WEAK] + EXPORT DAC6_IRQHandler [WEAK] + EXPORT ESC_OPB_IRQHandler [WEAK] + EXPORT ESC_SYNC0_IRQHandler [WEAK] + EXPORT ESC_SYNC1_IRQHandler [WEAK] + EXPORT ESC_WRP_IRQHandler [WEAK] + EXPORT ATIM1_BRK_IRQHandler [WEAK] + EXPORT ATIM1_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM1_CC_IRQHandler [WEAK] + EXPORT ATIM1_UP_IRQHandler [WEAK] + EXPORT ATIM2_BRK_IRQHandler [WEAK] + EXPORT ATIM2_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM2_CC_IRQHandler [WEAK] + EXPORT ATIM2_UP_IRQHandler [WEAK] + EXPORT ATIM3_BRK_IRQHandler [WEAK] + EXPORT ATIM3_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM3_CC_IRQHandler [WEAK] + EXPORT ATIM3_UP_IRQHandler [WEAK] + EXPORT ATIM4_BRK_IRQHandler [WEAK] + EXPORT ATIM4_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM4_CC_IRQHandler [WEAK] + EXPORT ATIM4_UP_IRQHandler [WEAK] + EXPORT GTIMA1_IRQHandler [WEAK] + EXPORT GTIMA2_IRQHandler [WEAK] + EXPORT GTIMA3_IRQHandler [WEAK] + EXPORT GTIMA4_IRQHandler [WEAK] + EXPORT GTIMA5_IRQHandler [WEAK] + EXPORT GTIMA6_IRQHandler [WEAK] + EXPORT GTIMA7_IRQHandler [WEAK] + EXPORT GTIMB1_IRQHandler [WEAK] + EXPORT GTIMB2_IRQHandler [WEAK] + EXPORT GTIMB3_IRQHandler [WEAK] + EXPORT BTIM1_IRQHandler [WEAK] + EXPORT BTIM2_IRQHandler [WEAK] + EXPORT BTIM3_IRQHandler [WEAK] + EXPORT BTIM4_IRQHandler [WEAK] + EXPORT LPTIM1_WKUP_IRQHandler [WEAK] + EXPORT LPTIM2_WKUP_IRQHandler [WEAK] + EXPORT LPTIM3_WKUP_IRQHandler [WEAK] + EXPORT LPTIM4_WKUP_IRQHandler [WEAK] + EXPORT DSMU_FLT0_IRQHandler [WEAK] + EXPORT DSMU_FLT1_IRQHandler [WEAK] + EXPORT DSMU_FLT2_IRQHandler [WEAK] + EXPORT DSMU_FLT3_IRQHandler [WEAK] + EXPORT FMAC_IRQHandler [WEAK] + EXPORT CORDIC_IRQHandler [WEAK] + EXPORT DMAMUX1_IRQHandler [WEAK] + EXPORT MMU_IRQHandler [WEAK] + + +WWDG2_IRQHandler +PVD_IRQHandler +RTC_TAMPER_IRQHandler +RTC_WKUP_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +EXTI9_5_IRQHandler +EXTI15_10_IRQHandler +DMA1_Channel0_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +DMA2_Channel0_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +DMA2_Channel6_IRQHandler +DMA2_Channel7_IRQHandler +DMA3_Channel0_IRQHandler +DMA3_Channel1_IRQHandler +DMA3_Channel2_IRQHandler +DMA3_Channel3_IRQHandler +DMA3_Channel4_IRQHandler +DMA3_Channel5_IRQHandler +DMA3_Channel6_IRQHandler +DMA3_Channel7_IRQHandler +MDMA_Channel0_IRQHandler +MDMA_Channel1_IRQHandler +MDMA_Channel2_IRQHandler +MDMA_Channel3_IRQHandler +MDMA_Channel4_IRQHandler +MDMA_Channel5_IRQHandler +MDMA_Channel6_IRQHandler +MDMA_Channel7_IRQHandler +MDMA_Channel8_IRQHandler +MDMA_Channel9_IRQHandler +MDMA_Channel10_IRQHandler +MDMA_Channel11_IRQHandler +MDMA_Channel12_IRQHandler +MDMA_Channel13_IRQHandler +MDMA_Channel14_IRQHandler +MDMA_Channel15_IRQHandler +SDPU_IRQHandler +AHB_ICACHE_IRQHandler +AHB_DCACHE_IRQHandler +FPU_CPU2_IRQHandler +ECCMON_IRQHandler +RTC_ALARM_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +I2C3_EV_IRQHandler +I2C3_ER_IRQHandler +I2C4_EV_IRQHandler +I2C4_ER_IRQHandler +I2C5_EV_IRQHandler +I2C5_ER_IRQHandler +I2C6_EV_IRQHandler +I2C6_ER_IRQHandler +I2C7_EV_IRQHandler +I2C7_ER_IRQHandler +I2C8_EV_IRQHandler +I2C8_ER_IRQHandler +I2C9_EV_IRQHandler +I2C9_ER_IRQHandler +I2C10_EV_IRQHandler +I2C10_ER_IRQHandler +I2S1_IRQHandler +I2S2_IRQHandler +I2S3_IRQHandler +I2S4_IRQHandler +xSPI1_IRQHandler +xSPI2_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +SPI3_IRQHandler +SPI4_IRQHandler +SPI5_IRQHandler +SPI6_IRQHandler +SPI7_IRQHandler +LCD_EV_IRQHandler +LCD_ER_IRQHandler +DVP1_IRQHandler +DVP2_IRQHandler +DMAMUX2_IRQHandler +USB1_HS_EPx_OUT_IRQHandler +USB1_HS_EPx_IN_IRQHandler +USB1_HS_WKUP_IRQHandler +USB1_HS_IRQHandler +USB2_HS_EPx_OUT_IRQHandler +USB2_HS_EPx_IN_IRQHandler +USB2_HS_WKUP_IRQHandler +USB2_HS_IRQHandler +ETH1_IRQHandler +ETH1_PMT_LPI_IRQHandler +ETH2_IRQHandler +ETH2_PMT_LPI_IRQHandler +FDCAN1_INT0_IRQHandler +FDCAN2_INT0_IRQHandler +FDCAN3_INT0_IRQHandler +FDCAN4_INT0_IRQHandler +FDCAN1_INT1_IRQHandler +FDCAN2_INT1_IRQHandler +FDCAN3_INT1_IRQHandler +FDCAN4_INT1_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +USART4_IRQHandler +USART5_IRQHandler +USART6_IRQHandler +USART7_IRQHandler +USART8_IRQHandler +UART9_IRQHandler +UART10_IRQHandler +UART11_IRQHandler +UART12_IRQHandler +UART13_IRQHandler +UART14_IRQHandler +UART15_IRQHandler +LPUART1_IRQHandler +LPUART2_IRQHandler +GPU_IRQHandler +SDMMC1_IRQHandler +SDMMC2_IRQHandler +ADC1_IRQHandler +ADC2_IRQHandler +ADC3_IRQHandler +COMP1_2_IRQHandler +COMP3_4_IRQHandler +SHRTIM1_INT1_IRQHandler +SHRTIM1_INT2_IRQHandler +SHRTIM1_INT3_IRQHandler +SHRTIM1_INT4_IRQHandler +SHRTIM1_INT5_IRQHandler +SHRTIM1_INT6_IRQHandler +SHRTIM1_INT7_IRQHandler +SHRTIM1_INT8_IRQHandler +SHRTIM2_INT1_IRQHandler +SHRTIM2_INT2_IRQHandler +SHRTIM2_INT3_IRQHandler +SHRTIM2_INT4_IRQHandler +SHRTIM2_INT5_IRQHandler +SHRTIM2_INT6_IRQHandler +SHRTIM2_INT7_IRQHandler +SHRTIM2_INT8_IRQHandler +FDCAN5_INT0_IRQHandler +FDCAN6_INT0_IRQHandler +FDCAN7_INT0_IRQHandler +FDCAN8_INT0_IRQHandler +FDCAN5_INT1_IRQHandler +FDCAN6_INT1_IRQHandler +FDCAN7_INT1_IRQHandler +FDCAN8_INT1_IRQHandler +DSI_IRQHandler +AHB_CACHE_PARMON_IRQHandler +LPTIM5_WKUP_IRQHandler +JPEG_SGDMA_H2P_IRQHandler +JPEG_SGDMA_P2H_IRQHandler +WAKEUP_IO_IRQHandler +SEMA4_INT2_IRQHandler +WWDG1_RST_IRQHandler +OTPC_IRQHandler +FEMC_IRQHandler +DCMUA_IRQHandler +DAC1_IRQHandler +DAC2_IRQHandler +MDMA_AHBS_ER_IRQHandler +CM7_CATCH_READ_ER_IRQHandler +DAC3_IRQHandler +DAC4_IRQHandler +EMC_IRQHandler +DAC5_IRQHandler +DAC6_IRQHandler +ESC_OPB_IRQHandler +ESC_SYNC0_IRQHandler +ESC_SYNC1_IRQHandler +ESC_WRP_IRQHandler +ATIM1_BRK_IRQHandler +ATIM1_TRG_COM_IRQHandler +ATIM1_CC_IRQHandler +ATIM1_UP_IRQHandler +ATIM2_BRK_IRQHandler +ATIM2_TRG_COM_IRQHandler +ATIM2_CC_IRQHandler +ATIM2_UP_IRQHandler +ATIM3_BRK_IRQHandler +ATIM3_TRG_COM_IRQHandler +ATIM3_CC_IRQHandler +ATIM3_UP_IRQHandler +ATIM4_BRK_IRQHandler +ATIM4_TRG_COM_IRQHandler +ATIM4_CC_IRQHandler +ATIM4_UP_IRQHandler +GTIMA1_IRQHandler +GTIMA2_IRQHandler +GTIMA3_IRQHandler +GTIMA4_IRQHandler +GTIMA5_IRQHandler +GTIMA6_IRQHandler +GTIMA7_IRQHandler +GTIMB1_IRQHandler +GTIMB2_IRQHandler +GTIMB3_IRQHandler +BTIM1_IRQHandler +BTIM2_IRQHandler +BTIM3_IRQHandler +BTIM4_IRQHandler +LPTIM1_WKUP_IRQHandler +LPTIM2_WKUP_IRQHandler +LPTIM3_WKUP_IRQHandler +LPTIM4_WKUP_IRQHandler +DSMU_FLT0_IRQHandler +DSMU_FLT1_IRQHandler +DSMU_FLT2_IRQHandler +DSMU_FLT3_IRQHandler +FMAC_IRQHandler +CORDIC_IRQHandler +DMAMUX1_IRQHandler +MMU_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 + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm4_EWARM.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm4_EWARM.s new file mode 100644 index 0000000000..8cfe4e5359 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm4_EWARM.s @@ -0,0 +1,1543 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + + 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 + + __iar_init$$done: ; The vector table is not needed + ; until after copy initialization is done + +__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 WWDG2_IRQHandler ; Window2 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD AHB_ICACHE_IRQHandler ; CM4 AHB iCache interrupt + DCD AHB_DCACHE_IRQHandler ; CM4 AHB dCache interrupt + DCD FPU_CPU2_IRQHandler ; FPU_CM4 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD DSI_IRQHandler ; MIPI DSI Interrupt through EXTI line 87 + DCD CACHE_PARITY_ER_IRQHandler ; AHB i/dCACHE parity error intertupt + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD 0 ; Reserved + DCD SEMA4_INT2_IRQHandler ; SEMA4 interrupt2 + DCD WWDG2_RST_IRQHandler ; WWDG2 reset interrupt through EXTI line 82 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUA_IRQHandler ; DCMUA interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_RQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; Reserved + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt + ;need check to user manual of exti chapter + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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 WWDG2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG2_IRQHandler + B WWDG2_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK RTC_TAMPER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_TAMPER_IRQHandler + B RTC_TAMPER_IRQHandler + + PUBWEAK RTC_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_WKUP_IRQHandler + B RTC_WKUP_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK DMA1_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel0_IRQHandler + B DMA1_Channel0_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 DMA2_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel0_IRQHandler + B DMA2_Channel0_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_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel4_IRQHandler + B DMA2_Channel4_IRQHandler + + PUBWEAK DMA2_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel5_IRQHandler + B DMA2_Channel5_IRQHandler + + PUBWEAK DMA2_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel6_IRQHandler + B DMA2_Channel6_IRQHandler + + PUBWEAK DMA2_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel7_IRQHandler + B DMA2_Channel7_IRQHandler + + PUBWEAK DMA3_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel0_IRQHandler + B DMA3_Channel0_IRQHandler + + PUBWEAK DMA3_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel1_IRQHandler + B DMA3_Channel1_IRQHandler + + PUBWEAK DMA3_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel2_IRQHandler + B DMA3_Channel2_IRQHandler + + PUBWEAK DMA3_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel3_IRQHandler + B DMA3_Channel3_IRQHandler + + PUBWEAK DMA3_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel4_IRQHandler + B DMA3_Channel4_IRQHandler + + PUBWEAK DMA3_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel5_IRQHandler + B DMA3_Channel5_IRQHandler + + PUBWEAK DMA3_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel6_IRQHandler + B DMA3_Channel6_IRQHandler + + PUBWEAK DMA3_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel7_IRQHandler + B DMA3_Channel7_IRQHandler + + PUBWEAK MDMA_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel0_IRQHandler + B MDMA_Channel0_IRQHandler + + PUBWEAK MDMA_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel1_IRQHandler + B MDMA_Channel1_IRQHandler + + PUBWEAK MDMA_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel2_IRQHandler + B MDMA_Channel2_IRQHandler + + PUBWEAK MDMA_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel3_IRQHandler + B MDMA_Channel3_IRQHandler + + PUBWEAK MDMA_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel4_IRQHandler + B MDMA_Channel4_IRQHandler + + PUBWEAK MDMA_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel5_IRQHandler + B MDMA_Channel5_IRQHandler + + PUBWEAK MDMA_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel6_IRQHandler + B MDMA_Channel6_IRQHandler + + PUBWEAK MDMA_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel7_IRQHandler + B MDMA_Channel7_IRQHandler + + PUBWEAK MDMA_Channel8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel8_IRQHandler + B MDMA_Channel8_IRQHandler + + PUBWEAK MDMA_Channel9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel9_IRQHandler + B MDMA_Channel9_IRQHandler + + PUBWEAK MDMA_Channel10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel10_IRQHandler + B MDMA_Channel10_IRQHandler + + PUBWEAK MDMA_Channel11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel11_IRQHandler + B MDMA_Channel11_IRQHandler + + PUBWEAK MDMA_Channel12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel12_IRQHandler + B MDMA_Channel12_IRQHandler + + PUBWEAK MDMA_Channel13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel13_IRQHandler + B MDMA_Channel13_IRQHandler + + PUBWEAK MDMA_Channel14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel14_IRQHandler + B MDMA_Channel14_IRQHandler + + PUBWEAK MDMA_Channel15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel15_IRQHandler + B MDMA_Channel15_IRQHandler + + PUBWEAK SDPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDPU_IRQHandler + B SDPU_IRQHandler + + PUBWEAK AHB_ICACHE_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +AHB_ICACHE_IRQHandler + B AHB_ICACHE_IRQHandler + + PUBWEAK AHB_DCACHE_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +AHB_DCACHE_IRQHandler + B AHB_DCACHE_IRQHandler + + PUBWEAK FPU_CPU2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FPU_CPU2_IRQHandler + B FPU_CPU2_IRQHandler + + PUBWEAK ECCMON_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ECCMON_IRQHandler + B ECCMON_IRQHandler + + PUBWEAK RTC_ALARM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_ALARM_IRQHandler + B RTC_ALARM_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 I2C3_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_EV_IRQHandler + B I2C3_EV_IRQHandler + + PUBWEAK I2C3_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_ER_IRQHandler + B I2C3_ER_IRQHandler + + PUBWEAK I2C4_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_EV_IRQHandler + B I2C4_EV_IRQHandler + + PUBWEAK I2C4_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_ER_IRQHandler + B I2C4_ER_IRQHandler + + PUBWEAK I2C5_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_EV_IRQHandler + B I2C5_EV_IRQHandler + + PUBWEAK I2C5_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_ER_IRQHandler + B I2C5_ER_IRQHandler + + PUBWEAK I2C6_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_EV_IRQHandler + B I2C6_EV_IRQHandler + + PUBWEAK I2C6_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_ER_IRQHandler + B I2C6_ER_IRQHandler + + PUBWEAK I2C7_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_EV_IRQHandler + B I2C7_EV_IRQHandler + + PUBWEAK I2C7_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_ER_IRQHandler + B I2C7_ER_IRQHandler + + PUBWEAK I2C8_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_EV_IRQHandler + B I2C8_EV_IRQHandler + + PUBWEAK I2C8_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_ER_IRQHandler + B I2C8_ER_IRQHandler + + PUBWEAK I2C9_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_EV_IRQHandler + B I2C9_EV_IRQHandler + + PUBWEAK I2C9_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_ER_IRQHandler + B I2C9_ER_IRQHandler + + PUBWEAK I2C10_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_EV_IRQHandler + B I2C10_EV_IRQHandler + + PUBWEAK I2C10_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_ER_IRQHandler + B I2C10_ER_IRQHandler + + PUBWEAK I2S1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S1_IRQHandler + B I2S1_IRQHandler + + PUBWEAK I2S2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S2_IRQHandler + B I2S2_IRQHandler + + PUBWEAK I2S3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S3_IRQHandler + B I2S3_IRQHandler + + PUBWEAK I2S4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S4_IRQHandler + B I2S4_IRQHandler + + PUBWEAK xSPI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI1_IRQHandler + B xSPI1_IRQHandler + + PUBWEAK xSPI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI2_IRQHandler + B xSPI2_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 SPI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK SPI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI4_IRQHandler + B SPI4_IRQHandler + + PUBWEAK SPI5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI5_IRQHandler + B SPI5_IRQHandler + + PUBWEAK SPI6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI6_IRQHandler + B SPI6_IRQHandler + + PUBWEAK SPI7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI7_IRQHandler + B SPI7_IRQHandler + + PUBWEAK LCD_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_EV_IRQHandler + B LCD_EV_IRQHandler + + PUBWEAK LCD_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_ER_IRQHandler + B LCD_ER_IRQHandler + + PUBWEAK DVP1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP1_IRQHandler + B DVP1_IRQHandler + + PUBWEAK DVP2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP2_IRQHandler + B DVP2_IRQHandler + + PUBWEAK DMAMUX2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX2_IRQHandler + B DMAMUX2_IRQHandler + + PUBWEAK USB1_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_OUT_IRQHandler + B USB1_HS_EPx_OUT_IRQHandler + + PUBWEAK USB1_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_IN_IRQHandler + B USB1_HS_EPx_IN_IRQHandler + + PUBWEAK USB1_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_WKUP_IRQHandler + B USB1_HS_WKUP_IRQHandler + + PUBWEAK USB1_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_IRQHandler + B USB1_HS_IRQHandler + + PUBWEAK USB2_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_OUT_IRQHandler + B USB2_HS_EPx_OUT_IRQHandler + + PUBWEAK USB2_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_IN_IRQHandler + B USB2_HS_EPx_IN_IRQHandler + + PUBWEAK USB2_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_WKUP_IRQHandler + B USB2_HS_WKUP_IRQHandler + + PUBWEAK USB2_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_IRQHandler + B USB2_HS_IRQHandler + + PUBWEAK ETH1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_IRQHandler + B ETH1_IRQHandler + + PUBWEAK ETH1_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_PMT_LPI_IRQHandler + B ETH1_PMT_LPI_IRQHandler + + PUBWEAK ETH2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_IRQHandler + B ETH2_IRQHandler + + PUBWEAK ETH2_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_PMT_LPI_IRQHandler + B ETH2_PMT_LPI_IRQHandler + + PUBWEAK FDCAN1_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT0_IRQHandler + B FDCAN1_INT0_IRQHandler + + PUBWEAK FDCAN2_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT0_IRQHandler + B FDCAN2_INT0_IRQHandler + + PUBWEAK FDCAN3_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT0_IRQHandler + B FDCAN3_INT0_IRQHandler + + PUBWEAK FDCAN4_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT0_IRQHandler + B FDCAN4_INT0_IRQHandler + + PUBWEAK FDCAN1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT1_IRQHandler + B FDCAN1_INT1_IRQHandler + + PUBWEAK FDCAN2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT1_IRQHandler + B FDCAN2_INT1_IRQHandler + + PUBWEAK FDCAN3_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT1_IRQHandler + B FDCAN3_INT1_IRQHandler + + PUBWEAK FDCAN4_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT1_IRQHandler + B FDCAN4_INT1_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 USART4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART4_IRQHandler + B USART4_IRQHandler + + PUBWEAK USART5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART5_IRQHandler + B USART5_IRQHandler + + PUBWEAK USART6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART6_IRQHandler + B USART6_IRQHandler + + PUBWEAK USART7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART7_IRQHandler + B USART7_IRQHandler + + PUBWEAK USART8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART8_IRQHandler + B USART8_IRQHandler + + PUBWEAK UART9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART9_IRQHandler + B UART9_IRQHandler + + PUBWEAK UART10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART10_IRQHandler + B UART10_IRQHandler + + PUBWEAK UART11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART11_IRQHandler + B UART11_IRQHandler + + PUBWEAK UART12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART12_IRQHandler + B UART12_IRQHandler + + PUBWEAK UART13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART13_IRQHandler + B UART13_IRQHandler + + PUBWEAK UART14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART14_IRQHandler + B UART14_IRQHandler + + PUBWEAK UART15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART15_IRQHandler + B UART15_IRQHandler + + PUBWEAK LPUART1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART1_IRQHandler + B LPUART1_IRQHandler + + PUBWEAK LPUART2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART2_IRQHandler + B LPUART2_IRQHandler + + PUBWEAK GPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GPU_IRQHandler + B GPU_IRQHandler + + PUBWEAK SDMMC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC1_IRQHandler + B SDMMC1_IRQHandler + + PUBWEAK SDMMC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC2_IRQHandler + B SDMMC2_IRQHandler + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + PUBWEAK ADC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC2_IRQHandler + B ADC2_IRQHandler + + PUBWEAK ADC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC3_IRQHandler + B ADC3_IRQHandler + + PUBWEAK COMP1_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP1_2_IRQHandler + B COMP1_2_IRQHandler + + PUBWEAK COMP3_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP3_4_IRQHandler + B COMP3_4_IRQHandler + + PUBWEAK SHRTIM1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT1_IRQHandler + B SHRTIM1_INT1_IRQHandler + + PUBWEAK SHRTIM1_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT2_IRQHandler + B SHRTIM1_INT2_IRQHandler + + PUBWEAK SHRTIM1_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT3_IRQHandler + B SHRTIM1_INT3_IRQHandler + + PUBWEAK SHRTIM1_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT4_IRQHandler + B SHRTIM1_INT4_IRQHandler + + PUBWEAK SHRTIM1_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT5_IRQHandler + B SHRTIM1_INT5_IRQHandler + + PUBWEAK SHRTIM1_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT6_IRQHandler + B SHRTIM1_INT6_IRQHandler + + PUBWEAK SHRTIM1_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT7_IRQHandler + B SHRTIM1_INT7_IRQHandler + + PUBWEAK SHRTIM1_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT8_IRQHandler + B SHRTIM1_INT8_IRQHandler + + PUBWEAK SHRTIM2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT1_IRQHandler + B SHRTIM2_INT1_IRQHandler + + PUBWEAK SHRTIM2_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT2_IRQHandler + B SHRTIM2_INT2_IRQHandler + + PUBWEAK SHRTIM2_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT3_IRQHandler + B SHRTIM2_INT3_IRQHandler + + PUBWEAK SHRTIM2_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT4_IRQHandler + B SHRTIM2_INT4_IRQHandler + + PUBWEAK SHRTIM2_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT5_IRQHandler + B SHRTIM2_INT5_IRQHandler + + PUBWEAK SHRTIM2_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT6_IRQHandler + B SHRTIM2_INT6_IRQHandler + + PUBWEAK SHRTIM2_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT7_IRQHandler + B SHRTIM2_INT7_IRQHandler + + PUBWEAK SHRTIM2_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT8_IRQHandler + B SHRTIM2_INT8_IRQHandler + + PUBWEAK FDCAN5_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT0_IRQHandler + B FDCAN5_INT0_IRQHandler + + PUBWEAK FDCAN6_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT0_IRQHandler + B FDCAN6_INT0_IRQHandler + + PUBWEAK FDCAN7_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT0_IRQHandler + B FDCAN7_INT0_IRQHandler + + PUBWEAK FDCAN8_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT0_IRQHandler + B FDCAN8_INT0_IRQHandler + + PUBWEAK FDCAN5_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT1_IRQHandler + B FDCAN5_INT1_IRQHandler + + PUBWEAK FDCAN6_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT1_IRQHandler + B FDCAN6_INT1_IRQHandler + + PUBWEAK FDCAN7_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT1_IRQHandler + B FDCAN7_INT1_IRQHandler + + PUBWEAK FDCAN8_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT1_IRQHandler + B FDCAN8_INT1_IRQHandler + + PUBWEAK DSI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSI_IRQHandler + B DSI_IRQHandler + + PUBWEAK CACHE_PARITY_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CACHE_PARITY_ER_IRQHandler + B CACHE_PARITY_ER_IRQHandler + + PUBWEAK LPTIM5_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM5_WKUP_IRQHandler + B LPTIM5_WKUP_IRQHandler + + PUBWEAK JPEG_SGDMA_H2P_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_H2P_IRQHandler + B JPEG_SGDMA_H2P_IRQHandler + + PUBWEAK JPEG_SGDMA_P2H_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_P2H_IRQHandler + B JPEG_SGDMA_P2H_IRQHandler + + PUBWEAK WAKEUP_IO_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WAKEUP_IO_IRQHandler + B WAKEUP_IO_IRQHandler + + PUBWEAK SEMA4_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SEMA4_INT2_IRQHandler + B SEMA4_INT2_IRQHandler + + PUBWEAK WWDG2_RST_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG2_RST_IRQHandler + B WWDG2_RST_IRQHandler + + PUBWEAK OTPC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +OTPC_IRQHandler + B OTPC_IRQHandler + + PUBWEAK FEMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FEMC_IRQHandler + B FEMC_IRQHandler + + PUBWEAK DCMUA_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DCMUA_IRQHandler + B DCMUA_IRQHandler + + PUBWEAK DAC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC1_IRQHandler + B DAC1_IRQHandler + + PUBWEAK DAC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC2_IRQHandler + B DAC2_IRQHandler + + PUBWEAK MDMA_AHBS_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_AHBS_ER_IRQHandler + B MDMA_AHBS_ER_IRQHandler + + PUBWEAK CM7_CATCH_READ_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CM7_CATCH_READ_ER_IRQHandler + B CM7_CATCH_READ_ER_IRQHandler + + PUBWEAK DAC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC3_IRQHandler + B DAC3_IRQHandler + + PUBWEAK DAC4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC4_IRQHandler + B DAC4_IRQHandler + + PUBWEAK EMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EMC_IRQHandler + B EMC_IRQHandler + + PUBWEAK DAC5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC5_IRQHandler + B DAC5_IRQHandler + + PUBWEAK DAC6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC6_IRQHandler + B DAC6_IRQHandler + + PUBWEAK ESC_OPB_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_OPB_IRQHandler + B ESC_OPB_IRQHandler + + PUBWEAK ESC_SYNC0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC0_IRQHandler + B ESC_SYNC0_IRQHandler + + PUBWEAK ESC_SYNC1_RQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC1_RQHandler + B ESC_SYNC1_RQHandler + + PUBWEAK ESC_WRP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_WRP_IRQHandler + B ESC_WRP_IRQHandler + + PUBWEAK ATIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_BRK_IRQHandler + B ATIM1_BRK_IRQHandler + + PUBWEAK ATIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_TRG_COM_IRQHandler + B ATIM1_TRG_COM_IRQHandler + + PUBWEAK ATIM1_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_CC_IRQHandler + B ATIM1_CC_IRQHandler + + PUBWEAK ATIM1_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_UP_IRQHandler + B ATIM1_UP_IRQHandler + + PUBWEAK ATIM2_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_BRK_IRQHandler + B ATIM2_BRK_IRQHandler + + PUBWEAK ATIM2_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_TRG_COM_IRQHandler + B ATIM2_TRG_COM_IRQHandler + + PUBWEAK ATIM2_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_CC_IRQHandler + B ATIM2_CC_IRQHandler + + PUBWEAK ATIM2_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_UP_IRQHandler + B ATIM2_UP_IRQHandler + + PUBWEAK ATIM3_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_BRK_IRQHandler + B ATIM3_BRK_IRQHandler + + PUBWEAK ATIM3_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_TRG_COM_IRQHandler + B ATIM3_TRG_COM_IRQHandler + + PUBWEAK ATIM3_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_CC_IRQHandler + B ATIM3_CC_IRQHandler + + PUBWEAK ATIM3_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_UP_IRQHandler + B ATIM3_UP_IRQHandler + + PUBWEAK ATIM4_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_BRK_IRQHandler + B ATIM4_BRK_IRQHandler + + PUBWEAK ATIM4_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_TRG_COM_IRQHandler + B ATIM4_TRG_COM_IRQHandler + + PUBWEAK ATIM4_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_CC_IRQHandler + B ATIM4_CC_IRQHandler + + PUBWEAK ATIM4_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_UP_IRQHandler + B ATIM4_UP_IRQHandler + + PUBWEAK GTIMA1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA1_IRQHandler + B GTIMA1_IRQHandler + + PUBWEAK GTIMA2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA2_IRQHandler + B GTIMA2_IRQHandler + + PUBWEAK GTIMA3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA3_IRQHandler + B GTIMA3_IRQHandler + + PUBWEAK GTIMA4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA4_IRQHandler + B GTIMA4_IRQHandler + + PUBWEAK GTIMA5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA5_IRQHandler + B GTIMA5_IRQHandler + + PUBWEAK GTIMA6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA6_IRQHandler + B GTIMA6_IRQHandler + + PUBWEAK GTIMA7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA7_IRQHandler + B GTIMA7_IRQHandler + + PUBWEAK GTIMB1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB1_IRQHandler + B GTIMB1_IRQHandler + + PUBWEAK GTIMB2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB2_IRQHandler + B GTIMB2_IRQHandler + + PUBWEAK GTIMB3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB3_IRQHandler + B GTIMB3_IRQHandler + + PUBWEAK BTIM1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM1_IRQHandler + B BTIM1_IRQHandler + + PUBWEAK BTIM2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM2_IRQHandler + B BTIM2_IRQHandler + + PUBWEAK BTIM3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM3_IRQHandler + B BTIM3_IRQHandler + + PUBWEAK BTIM4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM4_IRQHandler + B BTIM4_IRQHandler + + PUBWEAK LPTIM1_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM1_WKUP_IRQHandler + B LPTIM1_WKUP_IRQHandler + + PUBWEAK LPTIM2_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM2_WKUP_IRQHandler + B LPTIM2_WKUP_IRQHandler + + PUBWEAK LPTIM3_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM3_WKUP_IRQHandler + B LPTIM3_WKUP_IRQHandler + + PUBWEAK LPTIM4_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM4_WKUP_IRQHandler + B LPTIM4_WKUP_IRQHandler + + PUBWEAK DSMU_FLT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT0_IRQHandler + B DSMU_FLT0_IRQHandler + + PUBWEAK DSMU_FLT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT1_IRQHandler + B DSMU_FLT1_IRQHandler + + PUBWEAK DSMU_FLT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT2_IRQHandler + B DSMU_FLT2_IRQHandler + + PUBWEAK DSMU_FLT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT3_IRQHandler + B DSMU_FLT3_IRQHandler + + PUBWEAK FMAC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FMAC_IRQHandler + B FMAC_IRQHandler + + PUBWEAK CORDIC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CORDIC_IRQHandler + B CORDIC_IRQHandler + + PUBWEAK DMAMUX1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX1_IRQHandler + B DMAMUX1_IRQHandler + + PUBWEAK MMU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MMU_IRQHandler + B MMU_IRQHandler + + END + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm7.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm7.s new file mode 100644 index 0000000000..fbbb87e838 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm7.s @@ -0,0 +1,892 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +Stack_Size EQU 0x00002000 + + 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 0x00002000 + + 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 N32SysTick_Handler ; N32SysTick Handler + + ; External Interrupts + DCD WWDG1_IRQHandler ; Window1 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD FPU_CPU1_IRQHandler ; FPU_CM7 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD DSI_IRQHandler ; MIPI DSI Interrupt through EXTI line 87 + DCD 0 ; + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD SEMA4_INT1_IRQHandler ; SEMA4 interrupt1 + DCD 0 ; + DCD WWDG2_RST_IRQHandler ; WWDG2 reset interrupt through EXTI line 82 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUB_IRQHandler ; DCMUB interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_IRQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt + DCD SysTick_Handler ; SysTick Handler + +__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 +N32SysTick_Handler PROC + EXPORT N32SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG1_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT RTC_TAMPER_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT DMA1_Channel0_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 DMA2_Channel0_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT DMA2_Channel6_IRQHandler [WEAK] + EXPORT DMA2_Channel7_IRQHandler [WEAK] + EXPORT DMA3_Channel0_IRQHandler [WEAK] + EXPORT DMA3_Channel1_IRQHandler [WEAK] + EXPORT DMA3_Channel2_IRQHandler [WEAK] + EXPORT DMA3_Channel3_IRQHandler [WEAK] + EXPORT DMA3_Channel4_IRQHandler [WEAK] + EXPORT DMA3_Channel5_IRQHandler [WEAK] + EXPORT DMA3_Channel6_IRQHandler [WEAK] + EXPORT DMA3_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel0_IRQHandler [WEAK] + EXPORT MDMA_Channel1_IRQHandler [WEAK] + EXPORT MDMA_Channel2_IRQHandler [WEAK] + EXPORT MDMA_Channel3_IRQHandler [WEAK] + EXPORT MDMA_Channel4_IRQHandler [WEAK] + EXPORT MDMA_Channel5_IRQHandler [WEAK] + EXPORT MDMA_Channel6_IRQHandler [WEAK] + EXPORT MDMA_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel8_IRQHandler [WEAK] + EXPORT MDMA_Channel9_IRQHandler [WEAK] + EXPORT MDMA_Channel10_IRQHandler [WEAK] + EXPORT MDMA_Channel11_IRQHandler [WEAK] + EXPORT MDMA_Channel12_IRQHandler [WEAK] + EXPORT MDMA_Channel13_IRQHandler [WEAK] + EXPORT MDMA_Channel14_IRQHandler [WEAK] + EXPORT MDMA_Channel15_IRQHandler [WEAK] + EXPORT SDPU_IRQHandler [WEAK] + EXPORT FPU_CPU1_IRQHandler [WEAK] + EXPORT ECCMON_IRQHandler [WEAK] + EXPORT RTC_ALARM_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT I2C3_EV_IRQHandler [WEAK] + EXPORT I2C3_ER_IRQHandler [WEAK] + EXPORT I2C4_EV_IRQHandler [WEAK] + EXPORT I2C4_ER_IRQHandler [WEAK] + EXPORT I2C5_EV_IRQHandler [WEAK] + EXPORT I2C5_ER_IRQHandler [WEAK] + EXPORT I2C6_EV_IRQHandler [WEAK] + EXPORT I2C6_ER_IRQHandler [WEAK] + EXPORT I2C7_EV_IRQHandler [WEAK] + EXPORT I2C7_ER_IRQHandler [WEAK] + EXPORT I2C8_EV_IRQHandler [WEAK] + EXPORT I2C8_ER_IRQHandler [WEAK] + EXPORT I2C9_EV_IRQHandler [WEAK] + EXPORT I2C9_ER_IRQHandler [WEAK] + EXPORT I2C10_EV_IRQHandler [WEAK] + EXPORT I2C10_ER_IRQHandler [WEAK] + EXPORT I2S1_IRQHandler [WEAK] + EXPORT I2S2_IRQHandler [WEAK] + EXPORT I2S3_IRQHandler [WEAK] + EXPORT I2S4_IRQHandler [WEAK] + EXPORT xSPI1_IRQHandler [WEAK] + EXPORT xSPI2_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT SPI4_IRQHandler [WEAK] + EXPORT SPI5_IRQHandler [WEAK] + EXPORT SPI6_IRQHandler [WEAK] + EXPORT SPI7_IRQHandler [WEAK] + EXPORT LCD_EV_IRQHandler [WEAK] + EXPORT LCD_ER_IRQHandler [WEAK] + EXPORT DVP1_IRQHandler [WEAK] + EXPORT DVP2_IRQHandler [WEAK] + EXPORT DMAMUX2_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB1_HS_WKUP_IRQHandler [WEAK] + EXPORT USB1_HS_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB2_HS_WKUP_IRQHandler [WEAK] + EXPORT USB2_HS_IRQHandler [WEAK] + EXPORT ETH1_IRQHandler [WEAK] + EXPORT ETH1_PMT_LPI_IRQHandler [WEAK] + EXPORT ETH2_IRQHandler [WEAK] + EXPORT ETH2_PMT_LPI_IRQHandler [WEAK] + EXPORT FDCAN1_INT0_IRQHandler [WEAK] + EXPORT FDCAN2_INT0_IRQHandler [WEAK] + EXPORT FDCAN3_INT0_IRQHandler [WEAK] + EXPORT FDCAN4_INT0_IRQHandler [WEAK] + EXPORT FDCAN1_INT1_IRQHandler [WEAK] + EXPORT FDCAN2_INT1_IRQHandler [WEAK] + EXPORT FDCAN3_INT1_IRQHandler [WEAK] + EXPORT FDCAN4_INT1_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT USART4_IRQHandler [WEAK] + EXPORT USART5_IRQHandler [WEAK] + EXPORT USART6_IRQHandler [WEAK] + EXPORT USART7_IRQHandler [WEAK] + EXPORT USART8_IRQHandler [WEAK] + EXPORT UART9_IRQHandler [WEAK] + EXPORT UART10_IRQHandler [WEAK] + EXPORT UART11_IRQHandler [WEAK] + EXPORT UART12_IRQHandler [WEAK] + EXPORT UART13_IRQHandler [WEAK] + EXPORT UART14_IRQHandler [WEAK] + EXPORT UART15_IRQHandler [WEAK] + EXPORT LPUART1_IRQHandler [WEAK] + EXPORT LPUART2_IRQHandler [WEAK] + EXPORT GPU_IRQHandler [WEAK] + EXPORT SDMMC1_IRQHandler [WEAK] + EXPORT SDMMC2_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT ADC2_IRQHandler [WEAK] + EXPORT ADC3_IRQHandler [WEAK] + EXPORT COMP1_2_IRQHandler [WEAK] + EXPORT COMP3_4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT1_IRQHandler [WEAK] + EXPORT SHRTIM1_INT2_IRQHandler [WEAK] + EXPORT SHRTIM1_INT3_IRQHandler [WEAK] + EXPORT SHRTIM1_INT4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT5_IRQHandler [WEAK] + EXPORT SHRTIM1_INT6_IRQHandler [WEAK] + EXPORT SHRTIM1_INT7_IRQHandler [WEAK] + EXPORT SHRTIM1_INT8_IRQHandler [WEAK] + EXPORT SHRTIM2_INT1_IRQHandler [WEAK] + EXPORT SHRTIM2_INT2_IRQHandler [WEAK] + EXPORT SHRTIM2_INT3_IRQHandler [WEAK] + EXPORT SHRTIM2_INT4_IRQHandler [WEAK] + EXPORT SHRTIM2_INT5_IRQHandler [WEAK] + EXPORT SHRTIM2_INT6_IRQHandler [WEAK] + EXPORT SHRTIM2_INT7_IRQHandler [WEAK] + EXPORT SHRTIM2_INT8_IRQHandler [WEAK] + EXPORT FDCAN5_INT0_IRQHandler [WEAK] + EXPORT FDCAN6_INT0_IRQHandler [WEAK] + EXPORT FDCAN7_INT0_IRQHandler [WEAK] + EXPORT FDCAN8_INT0_IRQHandler [WEAK] + EXPORT FDCAN5_INT1_IRQHandler [WEAK] + EXPORT FDCAN6_INT1_IRQHandler [WEAK] + EXPORT FDCAN7_INT1_IRQHandler [WEAK] + EXPORT FDCAN8_INT1_IRQHandler [WEAK] + EXPORT DSI_IRQHandler [WEAK] + EXPORT LPTIM5_WKUP_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_H2P_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_P2H_IRQHandler [WEAK] + EXPORT WAKEUP_IO_IRQHandler [WEAK] + EXPORT SEMA4_INT1_IRQHandler [WEAK] + EXPORT WWDG2_RST_IRQHandler [WEAK] + EXPORT OTPC_IRQHandler [WEAK] + EXPORT FEMC_IRQHandler [WEAK] + EXPORT DCMUB_IRQHandler [WEAK] + EXPORT DAC1_IRQHandler [WEAK] + EXPORT DAC2_IRQHandler [WEAK] + EXPORT MDMA_AHBS_ER_IRQHandler [WEAK] + EXPORT CM7_CATCH_READ_ER_IRQHandler [WEAK] + EXPORT DAC3_IRQHandler [WEAK] + EXPORT DAC4_IRQHandler [WEAK] + EXPORT EMC_IRQHandler [WEAK] + EXPORT DAC5_IRQHandler [WEAK] + EXPORT DAC6_IRQHandler [WEAK] + EXPORT ESC_OPB_IRQHandler [WEAK] + EXPORT ESC_SYNC0_IRQHandler [WEAK] + EXPORT ESC_SYNC1_IRQHandler [WEAK] + EXPORT ESC_WRP_IRQHandler [WEAK] + EXPORT ATIM1_BRK_IRQHandler [WEAK] + EXPORT ATIM1_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM1_CC_IRQHandler [WEAK] + EXPORT ATIM1_UP_IRQHandler [WEAK] + EXPORT ATIM2_BRK_IRQHandler [WEAK] + EXPORT ATIM2_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM2_CC_IRQHandler [WEAK] + EXPORT ATIM2_UP_IRQHandler [WEAK] + EXPORT ATIM3_BRK_IRQHandler [WEAK] + EXPORT ATIM3_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM3_CC_IRQHandler [WEAK] + EXPORT ATIM3_UP_IRQHandler [WEAK] + EXPORT ATIM4_BRK_IRQHandler [WEAK] + EXPORT ATIM4_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM4_CC_IRQHandler [WEAK] + EXPORT ATIM4_UP_IRQHandler [WEAK] + EXPORT GTIMA1_IRQHandler [WEAK] + EXPORT GTIMA2_IRQHandler [WEAK] + EXPORT GTIMA3_IRQHandler [WEAK] + EXPORT GTIMA4_IRQHandler [WEAK] + EXPORT GTIMA5_IRQHandler [WEAK] + EXPORT GTIMA6_IRQHandler [WEAK] + EXPORT GTIMA7_IRQHandler [WEAK] + EXPORT GTIMB1_IRQHandler [WEAK] + EXPORT GTIMB2_IRQHandler [WEAK] + EXPORT GTIMB3_IRQHandler [WEAK] + EXPORT BTIM1_IRQHandler [WEAK] + EXPORT BTIM2_IRQHandler [WEAK] + EXPORT BTIM3_IRQHandler [WEAK] + EXPORT BTIM4_IRQHandler [WEAK] + EXPORT LPTIM1_WKUP_IRQHandler [WEAK] + EXPORT LPTIM2_WKUP_IRQHandler [WEAK] + EXPORT LPTIM3_WKUP_IRQHandler [WEAK] + EXPORT LPTIM4_WKUP_IRQHandler [WEAK] + EXPORT DSMU_FLT0_IRQHandler [WEAK] + EXPORT DSMU_FLT1_IRQHandler [WEAK] + EXPORT DSMU_FLT2_IRQHandler [WEAK] + EXPORT DSMU_FLT3_IRQHandler [WEAK] + EXPORT FMAC_IRQHandler [WEAK] + EXPORT CORDIC_IRQHandler [WEAK] + EXPORT DMAMUX1_IRQHandler [WEAK] + EXPORT MMU_IRQHandler [WEAK] + EXPORT SysTick_Handler [WEAK] + +WWDG1_IRQHandler +PVD_IRQHandler +RTC_TAMPER_IRQHandler +RTC_WKUP_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +EXTI9_5_IRQHandler +EXTI15_10_IRQHandler +DMA1_Channel0_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +DMA2_Channel0_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +DMA2_Channel6_IRQHandler +DMA2_Channel7_IRQHandler +DMA3_Channel0_IRQHandler +DMA3_Channel1_IRQHandler +DMA3_Channel2_IRQHandler +DMA3_Channel3_IRQHandler +DMA3_Channel4_IRQHandler +DMA3_Channel5_IRQHandler +DMA3_Channel6_IRQHandler +DMA3_Channel7_IRQHandler +MDMA_Channel0_IRQHandler +MDMA_Channel1_IRQHandler +MDMA_Channel2_IRQHandler +MDMA_Channel3_IRQHandler +MDMA_Channel4_IRQHandler +MDMA_Channel5_IRQHandler +MDMA_Channel6_IRQHandler +MDMA_Channel7_IRQHandler +MDMA_Channel8_IRQHandler +MDMA_Channel9_IRQHandler +MDMA_Channel10_IRQHandler +MDMA_Channel11_IRQHandler +MDMA_Channel12_IRQHandler +MDMA_Channel13_IRQHandler +MDMA_Channel14_IRQHandler +MDMA_Channel15_IRQHandler +SDPU_IRQHandler +FPU_CPU1_IRQHandler +ECCMON_IRQHandler +RTC_ALARM_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +I2C3_EV_IRQHandler +I2C3_ER_IRQHandler +I2C4_EV_IRQHandler +I2C4_ER_IRQHandler +I2C5_EV_IRQHandler +I2C5_ER_IRQHandler +I2C6_EV_IRQHandler +I2C6_ER_IRQHandler +I2C7_EV_IRQHandler +I2C7_ER_IRQHandler +I2C8_EV_IRQHandler +I2C8_ER_IRQHandler +I2C9_EV_IRQHandler +I2C9_ER_IRQHandler +I2C10_EV_IRQHandler +I2C10_ER_IRQHandler +I2S1_IRQHandler +I2S2_IRQHandler +I2S3_IRQHandler +I2S4_IRQHandler +xSPI1_IRQHandler +xSPI2_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +SPI3_IRQHandler +SPI4_IRQHandler +SPI5_IRQHandler +SPI6_IRQHandler +SPI7_IRQHandler +LCD_EV_IRQHandler +LCD_ER_IRQHandler +DVP1_IRQHandler +DVP2_IRQHandler +DMAMUX2_IRQHandler +USB1_HS_EPx_OUT_IRQHandler +USB1_HS_EPx_IN_IRQHandler +USB1_HS_WKUP_IRQHandler +USB1_HS_IRQHandler +USB2_HS_EPx_OUT_IRQHandler +USB2_HS_EPx_IN_IRQHandler +USB2_HS_WKUP_IRQHandler +USB2_HS_IRQHandler +ETH1_IRQHandler +ETH1_PMT_LPI_IRQHandler +ETH2_IRQHandler +ETH2_PMT_LPI_IRQHandler +FDCAN1_INT0_IRQHandler +FDCAN2_INT0_IRQHandler +FDCAN3_INT0_IRQHandler +FDCAN4_INT0_IRQHandler +FDCAN1_INT1_IRQHandler +FDCAN2_INT1_IRQHandler +FDCAN3_INT1_IRQHandler +FDCAN4_INT1_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +USART4_IRQHandler +USART5_IRQHandler +USART6_IRQHandler +USART7_IRQHandler +USART8_IRQHandler +UART9_IRQHandler +UART10_IRQHandler +UART11_IRQHandler +UART12_IRQHandler +UART13_IRQHandler +UART14_IRQHandler +UART15_IRQHandler +LPUART1_IRQHandler +LPUART2_IRQHandler +GPU_IRQHandler +SDMMC1_IRQHandler +SDMMC2_IRQHandler +ADC1_IRQHandler +ADC2_IRQHandler +ADC3_IRQHandler +COMP1_2_IRQHandler +COMP3_4_IRQHandler +SHRTIM1_INT1_IRQHandler +SHRTIM1_INT2_IRQHandler +SHRTIM1_INT3_IRQHandler +SHRTIM1_INT4_IRQHandler +SHRTIM1_INT5_IRQHandler +SHRTIM1_INT6_IRQHandler +SHRTIM1_INT7_IRQHandler +SHRTIM1_INT8_IRQHandler +SHRTIM2_INT1_IRQHandler +SHRTIM2_INT2_IRQHandler +SHRTIM2_INT3_IRQHandler +SHRTIM2_INT4_IRQHandler +SHRTIM2_INT5_IRQHandler +SHRTIM2_INT6_IRQHandler +SHRTIM2_INT7_IRQHandler +SHRTIM2_INT8_IRQHandler +FDCAN5_INT0_IRQHandler +FDCAN6_INT0_IRQHandler +FDCAN7_INT0_IRQHandler +FDCAN8_INT0_IRQHandler +FDCAN5_INT1_IRQHandler +FDCAN6_INT1_IRQHandler +FDCAN7_INT1_IRQHandler +FDCAN8_INT1_IRQHandler +DSI_IRQHandler +LPTIM5_WKUP_IRQHandler +JPEG_SGDMA_H2P_IRQHandler +JPEG_SGDMA_P2H_IRQHandler +WAKEUP_IO_IRQHandler +SEMA4_INT1_IRQHandler +WWDG2_RST_IRQHandler +OTPC_IRQHandler +FEMC_IRQHandler +DCMUB_IRQHandler +DAC1_IRQHandler +DAC2_IRQHandler +MDMA_AHBS_ER_IRQHandler +CM7_CATCH_READ_ER_IRQHandler +DAC3_IRQHandler +DAC4_IRQHandler +EMC_IRQHandler +DAC5_IRQHandler +DAC6_IRQHandler +ESC_OPB_IRQHandler +ESC_SYNC0_IRQHandler +ESC_SYNC1_IRQHandler +ESC_WRP_IRQHandler +ATIM1_BRK_IRQHandler +ATIM1_TRG_COM_IRQHandler +ATIM1_CC_IRQHandler +ATIM1_UP_IRQHandler +ATIM2_BRK_IRQHandler +ATIM2_TRG_COM_IRQHandler +ATIM2_CC_IRQHandler +ATIM2_UP_IRQHandler +ATIM3_BRK_IRQHandler +ATIM3_TRG_COM_IRQHandler +ATIM3_CC_IRQHandler +ATIM3_UP_IRQHandler +ATIM4_BRK_IRQHandler +ATIM4_TRG_COM_IRQHandler +ATIM4_CC_IRQHandler +ATIM4_UP_IRQHandler +GTIMA1_IRQHandler +GTIMA2_IRQHandler +GTIMA3_IRQHandler +GTIMA4_IRQHandler +GTIMA5_IRQHandler +GTIMA6_IRQHandler +GTIMA7_IRQHandler +GTIMB1_IRQHandler +GTIMB2_IRQHandler +GTIMB3_IRQHandler +BTIM1_IRQHandler +BTIM2_IRQHandler +BTIM3_IRQHandler +BTIM4_IRQHandler +LPTIM1_WKUP_IRQHandler +LPTIM2_WKUP_IRQHandler +LPTIM3_WKUP_IRQHandler +LPTIM4_WKUP_IRQHandler +DSMU_FLT0_IRQHandler +DSMU_FLT1_IRQHandler +DSMU_FLT2_IRQHandler +DSMU_FLT3_IRQHandler +FMAC_IRQHandler +CORDIC_IRQHandler +DMAMUX1_IRQHandler +MMU_IRQHandler +SysTick_Handler + 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 + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm7_EWARM.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm7_EWARM.s new file mode 100644 index 0000000000..1b3db8abd6 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/startup/startup_n32h78x_cm7_EWARM.s @@ -0,0 +1,1535 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + + 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 + + __iar_init$$done: ; The vector table is not needed + ; until after copy initialization is done + + +__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 N32SysTick_Handler ; N32SysTick Handler + + + + ; External Interrupts + DCD WWDG1_IRQHandler ; Window1 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD FPU_CPU1_IRQHandler ; FPU_CM7 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD DSI_IRQHandler ; MIPI DSI Interrupt through EXTI line 87 + DCD 0 ; Reserved + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD SEMA4_INT1_IRQHandler ; SEMA4 interrupt1 + DCD 0 ; Reserved + DCD WWDG2_RST_IRQHandler ; WWDG2 reset interrupt through EXTI line 82 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUB_IRQHandler ; DCMUB interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_RQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; Reserved + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt + DCD SysTick_Handler ; SysTick Handler + ;need check to user manual of exti chapter + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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 N32SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +N32SysTick_Handler + B N32SysTick_Handler + + PUBWEAK WWDG1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG1_IRQHandler + B WWDG1_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK RTC_TAMPER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_TAMPER_IRQHandler + B RTC_TAMPER_IRQHandler + + PUBWEAK RTC_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_WKUP_IRQHandler + B RTC_WKUP_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK DMA1_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel0_IRQHandler + B DMA1_Channel0_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 DMA2_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel0_IRQHandler + B DMA2_Channel0_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_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel4_IRQHandler + B DMA2_Channel4_IRQHandler + + PUBWEAK DMA2_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel5_IRQHandler + B DMA2_Channel5_IRQHandler + + PUBWEAK DMA2_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel6_IRQHandler + B DMA2_Channel6_IRQHandler + + PUBWEAK DMA2_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel7_IRQHandler + B DMA2_Channel7_IRQHandler + + PUBWEAK DMA3_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel0_IRQHandler + B DMA3_Channel0_IRQHandler + + PUBWEAK DMA3_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel1_IRQHandler + B DMA3_Channel1_IRQHandler + + PUBWEAK DMA3_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel2_IRQHandler + B DMA3_Channel2_IRQHandler + + PUBWEAK DMA3_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel3_IRQHandler + B DMA3_Channel3_IRQHandler + + PUBWEAK DMA3_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel4_IRQHandler + B DMA3_Channel4_IRQHandler + + PUBWEAK DMA3_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel5_IRQHandler + B DMA3_Channel5_IRQHandler + + PUBWEAK DMA3_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel6_IRQHandler + B DMA3_Channel6_IRQHandler + + PUBWEAK DMA3_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel7_IRQHandler + B DMA3_Channel7_IRQHandler + + PUBWEAK MDMA_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel0_IRQHandler + B MDMA_Channel0_IRQHandler + + PUBWEAK MDMA_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel1_IRQHandler + B MDMA_Channel1_IRQHandler + + PUBWEAK MDMA_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel2_IRQHandler + B MDMA_Channel2_IRQHandler + + PUBWEAK MDMA_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel3_IRQHandler + B MDMA_Channel3_IRQHandler + + PUBWEAK MDMA_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel4_IRQHandler + B MDMA_Channel4_IRQHandler + + PUBWEAK MDMA_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel5_IRQHandler + B MDMA_Channel5_IRQHandler + + PUBWEAK MDMA_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel6_IRQHandler + B MDMA_Channel6_IRQHandler + + PUBWEAK MDMA_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel7_IRQHandler + B MDMA_Channel7_IRQHandler + + PUBWEAK MDMA_Channel8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel8_IRQHandler + B MDMA_Channel8_IRQHandler + + PUBWEAK MDMA_Channel9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel9_IRQHandler + B MDMA_Channel9_IRQHandler + + PUBWEAK MDMA_Channel10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel10_IRQHandler + B MDMA_Channel10_IRQHandler + + PUBWEAK MDMA_Channel11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel11_IRQHandler + B MDMA_Channel11_IRQHandler + + PUBWEAK MDMA_Channel12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel12_IRQHandler + B MDMA_Channel12_IRQHandler + + PUBWEAK MDMA_Channel13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel13_IRQHandler + B MDMA_Channel13_IRQHandler + + PUBWEAK MDMA_Channel14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel14_IRQHandler + B MDMA_Channel14_IRQHandler + + PUBWEAK MDMA_Channel15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel15_IRQHandler + B MDMA_Channel15_IRQHandler + + PUBWEAK SDPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDPU_IRQHandler + B SDPU_IRQHandler + + PUBWEAK FPU_CPU1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FPU_CPU1_IRQHandler + B FPU_CPU1_IRQHandler + + PUBWEAK ECCMON_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ECCMON_IRQHandler + B ECCMON_IRQHandler + + PUBWEAK RTC_ALARM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_ALARM_IRQHandler + B RTC_ALARM_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 I2C3_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_EV_IRQHandler + B I2C3_EV_IRQHandler + + PUBWEAK I2C3_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_ER_IRQHandler + B I2C3_ER_IRQHandler + + PUBWEAK I2C4_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_EV_IRQHandler + B I2C4_EV_IRQHandler + + PUBWEAK I2C4_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_ER_IRQHandler + B I2C4_ER_IRQHandler + + PUBWEAK I2C5_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_EV_IRQHandler + B I2C5_EV_IRQHandler + + PUBWEAK I2C5_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_ER_IRQHandler + B I2C5_ER_IRQHandler + + PUBWEAK I2C6_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_EV_IRQHandler + B I2C6_EV_IRQHandler + + PUBWEAK I2C6_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_ER_IRQHandler + B I2C6_ER_IRQHandler + + PUBWEAK I2C7_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_EV_IRQHandler + B I2C7_EV_IRQHandler + + PUBWEAK I2C7_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_ER_IRQHandler + B I2C7_ER_IRQHandler + + PUBWEAK I2C8_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_EV_IRQHandler + B I2C8_EV_IRQHandler + + PUBWEAK I2C8_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_ER_IRQHandler + B I2C8_ER_IRQHandler + + PUBWEAK I2C9_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_EV_IRQHandler + B I2C9_EV_IRQHandler + + PUBWEAK I2C9_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_ER_IRQHandler + B I2C9_ER_IRQHandler + + PUBWEAK I2C10_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_EV_IRQHandler + B I2C10_EV_IRQHandler + + PUBWEAK I2C10_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_ER_IRQHandler + B I2C10_ER_IRQHandler + + PUBWEAK I2S1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S1_IRQHandler + B I2S1_IRQHandler + + PUBWEAK I2S2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S2_IRQHandler + B I2S2_IRQHandler + + PUBWEAK I2S3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S3_IRQHandler + B I2S3_IRQHandler + + PUBWEAK I2S4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S4_IRQHandler + B I2S4_IRQHandler + + PUBWEAK xSPI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI1_IRQHandler + B xSPI1_IRQHandler + + PUBWEAK xSPI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI2_IRQHandler + B xSPI2_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 SPI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK SPI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI4_IRQHandler + B SPI4_IRQHandler + + PUBWEAK SPI5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI5_IRQHandler + B SPI5_IRQHandler + + PUBWEAK SPI6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI6_IRQHandler + B SPI6_IRQHandler + + PUBWEAK SPI7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI7_IRQHandler + B SPI7_IRQHandler + + PUBWEAK LCD_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_EV_IRQHandler + B LCD_EV_IRQHandler + + PUBWEAK LCD_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_ER_IRQHandler + B LCD_ER_IRQHandler + + PUBWEAK DVP1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP1_IRQHandler + B DVP1_IRQHandler + + PUBWEAK DVP2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP2_IRQHandler + B DVP2_IRQHandler + + PUBWEAK DMAMUX2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX2_IRQHandler + B DMAMUX2_IRQHandler + + PUBWEAK USB1_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_OUT_IRQHandler + B USB1_HS_EPx_OUT_IRQHandler + + PUBWEAK USB1_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_IN_IRQHandler + B USB1_HS_EPx_IN_IRQHandler + + PUBWEAK USB1_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_WKUP_IRQHandler + B USB1_HS_WKUP_IRQHandler + + PUBWEAK USB1_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_IRQHandler + B USB1_HS_IRQHandler + + PUBWEAK USB2_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_OUT_IRQHandler + B USB2_HS_EPx_OUT_IRQHandler + + PUBWEAK USB2_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_IN_IRQHandler + B USB2_HS_EPx_IN_IRQHandler + + PUBWEAK USB2_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_WKUP_IRQHandler + B USB2_HS_WKUP_IRQHandler + + PUBWEAK USB2_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_IRQHandler + B USB2_HS_IRQHandler + + PUBWEAK ETH1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_IRQHandler + B ETH1_IRQHandler + + PUBWEAK ETH1_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_PMT_LPI_IRQHandler + B ETH1_PMT_LPI_IRQHandler + + PUBWEAK ETH2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_IRQHandler + B ETH2_IRQHandler + + PUBWEAK ETH2_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_PMT_LPI_IRQHandler + B ETH2_PMT_LPI_IRQHandler + + PUBWEAK FDCAN1_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT0_IRQHandler + B FDCAN1_INT0_IRQHandler + + PUBWEAK FDCAN2_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT0_IRQHandler + B FDCAN2_INT0_IRQHandler + + PUBWEAK FDCAN3_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT0_IRQHandler + B FDCAN3_INT0_IRQHandler + + PUBWEAK FDCAN4_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT0_IRQHandler + B FDCAN4_INT0_IRQHandler + + PUBWEAK FDCAN1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT1_IRQHandler + B FDCAN1_INT1_IRQHandler + + PUBWEAK FDCAN2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT1_IRQHandler + B FDCAN2_INT1_IRQHandler + + PUBWEAK FDCAN3_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT1_IRQHandler + B FDCAN3_INT1_IRQHandler + + PUBWEAK FDCAN4_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT1_IRQHandler + B FDCAN4_INT1_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 USART4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART4_IRQHandler + B USART4_IRQHandler + + PUBWEAK USART5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART5_IRQHandler + B USART5_IRQHandler + + PUBWEAK USART6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART6_IRQHandler + B USART6_IRQHandler + + PUBWEAK USART7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART7_IRQHandler + B USART7_IRQHandler + + PUBWEAK USART8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART8_IRQHandler + B USART8_IRQHandler + + PUBWEAK UART9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART9_IRQHandler + B UART9_IRQHandler + + PUBWEAK UART10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART10_IRQHandler + B UART10_IRQHandler + + PUBWEAK UART11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART11_IRQHandler + B UART11_IRQHandler + + PUBWEAK UART12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART12_IRQHandler + B UART12_IRQHandler + + PUBWEAK UART13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART13_IRQHandler + B UART13_IRQHandler + + PUBWEAK UART14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART14_IRQHandler + B UART14_IRQHandler + + PUBWEAK UART15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART15_IRQHandler + B UART15_IRQHandler + + PUBWEAK LPUART1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART1_IRQHandler + B LPUART1_IRQHandler + + PUBWEAK LPUART2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART2_IRQHandler + B LPUART2_IRQHandler + + PUBWEAK GPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GPU_IRQHandler + B GPU_IRQHandler + + PUBWEAK SDMMC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC1_IRQHandler + B SDMMC1_IRQHandler + + PUBWEAK SDMMC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC2_IRQHandler + B SDMMC2_IRQHandler + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + PUBWEAK ADC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC2_IRQHandler + B ADC2_IRQHandler + + PUBWEAK ADC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC3_IRQHandler + B ADC3_IRQHandler + + PUBWEAK COMP1_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP1_2_IRQHandler + B COMP1_2_IRQHandler + + PUBWEAK COMP3_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP3_4_IRQHandler + B COMP3_4_IRQHandler + + PUBWEAK SHRTIM1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT1_IRQHandler + B SHRTIM1_INT1_IRQHandler + + PUBWEAK SHRTIM1_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT2_IRQHandler + B SHRTIM1_INT2_IRQHandler + + PUBWEAK SHRTIM1_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT3_IRQHandler + B SHRTIM1_INT3_IRQHandler + + PUBWEAK SHRTIM1_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT4_IRQHandler + B SHRTIM1_INT4_IRQHandler + + PUBWEAK SHRTIM1_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT5_IRQHandler + B SHRTIM1_INT5_IRQHandler + + PUBWEAK SHRTIM1_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT6_IRQHandler + B SHRTIM1_INT6_IRQHandler + + PUBWEAK SHRTIM1_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT7_IRQHandler + B SHRTIM1_INT7_IRQHandler + + PUBWEAK SHRTIM1_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT8_IRQHandler + B SHRTIM1_INT8_IRQHandler + + PUBWEAK SHRTIM2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT1_IRQHandler + B SHRTIM2_INT1_IRQHandler + + PUBWEAK SHRTIM2_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT2_IRQHandler + B SHRTIM2_INT2_IRQHandler + + PUBWEAK SHRTIM2_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT3_IRQHandler + B SHRTIM2_INT3_IRQHandler + + PUBWEAK SHRTIM2_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT4_IRQHandler + B SHRTIM2_INT4_IRQHandler + + PUBWEAK SHRTIM2_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT5_IRQHandler + B SHRTIM2_INT5_IRQHandler + + PUBWEAK SHRTIM2_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT6_IRQHandler + B SHRTIM2_INT6_IRQHandler + + PUBWEAK SHRTIM2_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT7_IRQHandler + B SHRTIM2_INT7_IRQHandler + + PUBWEAK SHRTIM2_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT8_IRQHandler + B SHRTIM2_INT8_IRQHandler + + PUBWEAK FDCAN5_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT0_IRQHandler + B FDCAN5_INT0_IRQHandler + + PUBWEAK FDCAN6_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT0_IRQHandler + B FDCAN6_INT0_IRQHandler + + PUBWEAK FDCAN7_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT0_IRQHandler + B FDCAN7_INT0_IRQHandler + + PUBWEAK FDCAN8_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT0_IRQHandler + B FDCAN8_INT0_IRQHandler + + PUBWEAK FDCAN5_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT1_IRQHandler + B FDCAN5_INT1_IRQHandler + + PUBWEAK FDCAN6_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT1_IRQHandler + B FDCAN6_INT1_IRQHandler + + PUBWEAK FDCAN7_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT1_IRQHandler + B FDCAN7_INT1_IRQHandler + + PUBWEAK FDCAN8_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT1_IRQHandler + B FDCAN8_INT1_IRQHandler + + PUBWEAK DSI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSI_IRQHandler + B DSI_IRQHandler + + PUBWEAK LPTIM5_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM5_WKUP_IRQHandler + B LPTIM5_WKUP_IRQHandler + + PUBWEAK JPEG_SGDMA_H2P_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_H2P_IRQHandler + B JPEG_SGDMA_H2P_IRQHandler + + PUBWEAK JPEG_SGDMA_P2H_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_P2H_IRQHandler + B JPEG_SGDMA_P2H_IRQHandler + + PUBWEAK WAKEUP_IO_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WAKEUP_IO_IRQHandler + B WAKEUP_IO_IRQHandler + + PUBWEAK SEMA4_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SEMA4_INT1_IRQHandler + B SEMA4_INT1_IRQHandler + + PUBWEAK WWDG2_RST_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG2_RST_IRQHandler + B WWDG2_RST_IRQHandler + + PUBWEAK OTPC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +OTPC_IRQHandler + B OTPC_IRQHandler + + PUBWEAK FEMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FEMC_IRQHandler + B FEMC_IRQHandler + + PUBWEAK DCMUB_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DCMUB_IRQHandler + B DCMUB_IRQHandler + + PUBWEAK DAC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC1_IRQHandler + B DAC1_IRQHandler + + PUBWEAK DAC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC2_IRQHandler + B DAC2_IRQHandler + + PUBWEAK MDMA_AHBS_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_AHBS_ER_IRQHandler + B MDMA_AHBS_ER_IRQHandler + + PUBWEAK CM7_CATCH_READ_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CM7_CATCH_READ_ER_IRQHandler + B CM7_CATCH_READ_ER_IRQHandler + + PUBWEAK DAC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC3_IRQHandler + B DAC3_IRQHandler + + PUBWEAK DAC4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC4_IRQHandler + B DAC4_IRQHandler + + PUBWEAK EMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EMC_IRQHandler + B EMC_IRQHandler + + PUBWEAK DAC5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC5_IRQHandler + B DAC5_IRQHandler + + PUBWEAK DAC6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC6_IRQHandler + B DAC6_IRQHandler + + PUBWEAK ESC_OPB_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_OPB_IRQHandler + B ESC_OPB_IRQHandler + + PUBWEAK ESC_SYNC0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC0_IRQHandler + B ESC_SYNC0_IRQHandler + + PUBWEAK ESC_SYNC1_RQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC1_RQHandler + B ESC_SYNC1_RQHandler + + PUBWEAK ESC_WRP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_WRP_IRQHandler + B ESC_WRP_IRQHandler + + PUBWEAK ATIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_BRK_IRQHandler + B ATIM1_BRK_IRQHandler + + PUBWEAK ATIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_TRG_COM_IRQHandler + B ATIM1_TRG_COM_IRQHandler + + PUBWEAK ATIM1_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_CC_IRQHandler + B ATIM1_CC_IRQHandler + + PUBWEAK ATIM1_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_UP_IRQHandler + B ATIM1_UP_IRQHandler + + PUBWEAK ATIM2_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_BRK_IRQHandler + B ATIM2_BRK_IRQHandler + + PUBWEAK ATIM2_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_TRG_COM_IRQHandler + B ATIM2_TRG_COM_IRQHandler + + PUBWEAK ATIM2_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_CC_IRQHandler + B ATIM2_CC_IRQHandler + + PUBWEAK ATIM2_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_UP_IRQHandler + B ATIM2_UP_IRQHandler + + PUBWEAK ATIM3_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_BRK_IRQHandler + B ATIM3_BRK_IRQHandler + + PUBWEAK ATIM3_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_TRG_COM_IRQHandler + B ATIM3_TRG_COM_IRQHandler + + PUBWEAK ATIM3_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_CC_IRQHandler + B ATIM3_CC_IRQHandler + + PUBWEAK ATIM3_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_UP_IRQHandler + B ATIM3_UP_IRQHandler + + PUBWEAK ATIM4_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_BRK_IRQHandler + B ATIM4_BRK_IRQHandler + + PUBWEAK ATIM4_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_TRG_COM_IRQHandler + B ATIM4_TRG_COM_IRQHandler + + PUBWEAK ATIM4_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_CC_IRQHandler + B ATIM4_CC_IRQHandler + + PUBWEAK ATIM4_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_UP_IRQHandler + B ATIM4_UP_IRQHandler + + PUBWEAK GTIMA1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA1_IRQHandler + B GTIMA1_IRQHandler + + PUBWEAK GTIMA2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA2_IRQHandler + B GTIMA2_IRQHandler + + PUBWEAK GTIMA3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA3_IRQHandler + B GTIMA3_IRQHandler + + PUBWEAK GTIMA4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA4_IRQHandler + B GTIMA4_IRQHandler + + PUBWEAK GTIMA5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA5_IRQHandler + B GTIMA5_IRQHandler + + PUBWEAK GTIMA6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA6_IRQHandler + B GTIMA6_IRQHandler + + PUBWEAK GTIMA7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA7_IRQHandler + B GTIMA7_IRQHandler + + PUBWEAK GTIMB1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB1_IRQHandler + B GTIMB1_IRQHandler + + PUBWEAK GTIMB2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB2_IRQHandler + B GTIMB2_IRQHandler + + PUBWEAK GTIMB3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB3_IRQHandler + B GTIMB3_IRQHandler + + PUBWEAK BTIM1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM1_IRQHandler + B BTIM1_IRQHandler + + PUBWEAK BTIM2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM2_IRQHandler + B BTIM2_IRQHandler + + PUBWEAK BTIM3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM3_IRQHandler + B BTIM3_IRQHandler + + PUBWEAK BTIM4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM4_IRQHandler + B BTIM4_IRQHandler + + PUBWEAK LPTIM1_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM1_WKUP_IRQHandler + B LPTIM1_WKUP_IRQHandler + + PUBWEAK LPTIM2_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM2_WKUP_IRQHandler + B LPTIM2_WKUP_IRQHandler + + PUBWEAK LPTIM3_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM3_WKUP_IRQHandler + B LPTIM3_WKUP_IRQHandler + + PUBWEAK LPTIM4_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM4_WKUP_IRQHandler + B LPTIM4_WKUP_IRQHandler + + PUBWEAK DSMU_FLT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT0_IRQHandler + B DSMU_FLT0_IRQHandler + + PUBWEAK DSMU_FLT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT1_IRQHandler + B DSMU_FLT1_IRQHandler + + PUBWEAK DSMU_FLT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT2_IRQHandler + B DSMU_FLT2_IRQHandler + + PUBWEAK DSMU_FLT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT3_IRQHandler + B DSMU_FLT3_IRQHandler + + PUBWEAK FMAC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FMAC_IRQHandler + B FMAC_IRQHandler + + PUBWEAK CORDIC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CORDIC_IRQHandler + B CORDIC_IRQHandler + + PUBWEAK DMAMUX1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX1_IRQHandler + B DMAMUX1_IRQHandler + + PUBWEAK MMU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MMU_IRQHandler + B MMU_IRQHandler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + END + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/system_n32h76x_78x.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/system_n32h76x_78x.c new file mode 100644 index 0000000000..08b4d5e8dc --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/system_n32h76x_78x.c @@ -0,0 +1,233 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file system_n32h76x_78x.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x.h" + +#if !defined (HSE_VALUE) +#define HSE_VALUE ((uint32_t)8000000UL) /* Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (CSI_VALUE) + #define CSI_VALUE ((uint32_t)4000000UL) /* Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)64000000UL) /* Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +#define VECT_TAB_OFFSET ((uint32_t)0x00000000UL) /* Vector Table base offset field. */ + +#define FLASH_BANK1_BASE (0x15000000U) + +#define FLASH_BANK2_BASE (0x15080000U) + +uint32_t SystemCoreClock = 600000000; + +#define TCM_SIZE_VALUE (0x20) /*TCM_SIZE=0x20 :256 KB ITCM,256 KB DTCM,512 KB AXI_SRAM*/ + +/** Private_Functions */ + +/* defaule power supply is extern LDO. User can change the way of power supply*/ +//#define PWR_SUPPLY_SELECTION (PWR_LDO_SUPPLY) /* External LDO Supply */ +#define PWR_SUPPLY_SELECTION (PWR_DIRECT_SMPS_SUPPLY) /* DCDC Supply */ +//#define PWR_SUPPLY_SELECTION (PWR_EXTERNAL_SOURCE_SUPPLY) /* VCAP Supply */ + +/** + *\*\name ConfigTcmSize. + *\*\fun Config TCM_SIZE + *\*\param tcmSizeValue : + *\*\ 0x00 :1024KB ITCM,0 KB DTCM,0 KB AXI_SRAM + *\*\ 0x01 :896 KB ITCM,128 KB DTCM,0 KB AXI_SRAM + *\*\ 0x02 :768 KB ITCM,256 KB DTCM,0 KB AXI_SRAM + *\*\ 0x03 :640 KB ITCM,384 KB DTCM,0 KB AXI_SRAM + *\*\ 0x04 :512 KB ITCM,512 KB DTCM,0 KB AXI_SRAM + *\*\ 0x05 :384 KB ITCM,640 KB DTCM,0 KB AXI_SRAM + *\*\ 0x06 :256 KB ITCM,768 KB DTCM,0 KB AXI_SRAM + *\*\ 0x07 :128 KB ITCM,896 KB DTCM,0 KB AXI_SRAM + *\*\ 0x08 :0 KB ITCM,1024KB DTCM,0 KB AXI_SRAM + *\*\ 0x09 :896 KB ITCM,0 KB DTCM,128 KB AXI_SRAM + *\*\ 0x0A :768 KB ITCM,128 KB DTCM,128 KB AXI_SRAM + *\*\ 0x0B :640 KB ITCM,256 KB DTCM,128 KB AXI_SRAM + *\*\ 0x0C :512 KB ITCM,384 KB DTCM,128 KB AXI_SRAM + *\*\ 0x0D :384 KB ITCM,512 KB DTCM,128 KB AXI_SRAM + *\*\ 0x0E :256 KB ITCM,640 KB DTCM,128 KB AXI_SRAM + *\*\ 0x0F :128 KB ITCM,768 KB DTCM,128 KB AXI_SRAM + *\*\ 0x10 :0 KB ITCM,896 KB DTCM,128 KB AXI_SRAM + *\*\ 0x11 :768 KB ITCM,0 KB DTCM,256 KB AXI_SRAM + *\*\ 0x12 :640 KB ITCM,128 KB DTCM,256 KB AXI_SRAM + *\*\ 0x13 :512 KB ITCM,256 KB DTCM,256 KB AXI_SRAM + *\*\ 0x14 :384 KB ITCM,384 KB DTCM,256 KB AXI_SRAM + *\*\ 0x15 :256 KB ITCM,512 KB DTCM,256 KB AXI_SRAM + *\*\ 0x16 :128 KB ITCM,640 KB DTCM,256 KB AXI_SRAM + *\*\ 0x17 :0 KB ITCM,768 KB DTCM,256 KB AXI_SRAM + *\*\ 0x18 :640 KB ITCM,0 KB DTCM,384 KB AXI_SRAM + *\*\ 0x19 :512 KB ITCM,128 KB DTCM,384 KB AXI_SRAM + *\*\ 0x1A :384 KB ITCM,256 KB DTCM,384 KB AXI_SRAM + *\*\ 0x1B :256 KB ITCM,384 KB DTCM,384 KB AXI_SRAM + *\*\ 0x1C :128 KB ITCM,512 KB DTCM,384 KB AXI_SRAM + *\*\ 0x1D :0 KB ITCM,640 KB DTCM,384 KB AXI_SRAM + *\*\ 0x1E :512 KB ITCM,0 KB DTCM,512 KB AXI_SRAM + *\*\ 0x1F :384 KB ITCM,128 KB DTCM,512 KB AXI_SRAM + *\*\ 0x20 :256 KB ITCM,256 KB DTCM,512 KB AXI_SRAM + *\*\ 0x21 :128 KB ITCM,384 KB DTCM,512 KB AXI_SRAM + *\*\ 0x22 :0 KB ITCM,512 KB DTCM,512 KB AXI_SRAM + *\*\ 0x23 :384 KB ITCM,0 KB DTCM,640 KB AXI_SRAM + *\*\ 0x24 :256 KB ITCM,128 KB DTCM,640 KB AXI_SRAM + *\*\ 0x25 :128 KB ITCM,256 KB DTCM,640 KB AXI_SRAM + *\*\ 0x26 :0 KB ITCM,384 KB DTCM,640 KB AXI_SRAM + *\*\ 0x27 :256 KB ITCM,0 KB DTCM,768 KB AXI_SRAM + *\*\ 0x28 :128 KB ITCM,128 KB DTCM,768 KB AXI_SRAM + *\*\ 0x29 :0 KB ITCM,256 KB DTCM,768 KB AXI_SRAM + *\*\ 0x2A :128 KB ITCM,0 KB DTCM,896 KB AXI_SRAM + *\*\ 0x2B :0 KB ITCM,128 KB DTCM,896 KB AXI_SRAM + *\*\ 0x2C~2F :0KB ITCM,0 KB DTCM,1024KB AXI_SRAM + *\*\return none + */ +void ConfigTcmSize(uint32_t tcmSizeValue) +{ + uint32_t currValue = (*(uint32_t(*)(void))0x1ff00f01)(); + if((currValue == 0x2c) && (currValue != tcmSizeValue)) + { + *(uint32_t*)0x51105280 = tcmSizeValue; + NVIC_SystemReset(); + } +} +#ifdef CORE_CM7 +/** +*\*\name PWR_ConfigSupply. +*\*\fun Configure the PWR supply. +*\*\param SupplySource (The input parameters must be the following values): +*\*\ - PWR_LDO_SUPPLY :External LDO SUPPLY +*\*\ - PWR_DIRECT_SMPS_SUPPLY :DCDC SUPPLY +*\*\ - PWR_EXTERNAL_SOURCE_SUPPLY :External VCAP SUPPLY +*\*\return none +**/ +static void PWR_ConfigSupply(uint32_t SupplySource) +{ + __IO uint32_t tempreg; + /* Get the old register value */ + tempreg = PWR->SYSCTRL4; + /* Clear the old value */ + tempreg &= (~PWR_SUPPLY_MODE_MASK); + /* Set the new values */ + tempreg |= SupplySource; + /* Set the power supply configuration */ + PWR->SYSCTRL4 = tempreg; +} +#endif +/** + *\*\name SystemInit. + *\*\fun Setup the microcontroller system.Initialize the FPU setting, vector table location and External memory configuration. + *\*\param none + *\*\return none + */ +void SystemInit (void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */ + #endif + + /*SEVONPEND enabled so that an interrupt coming from the CPU(n) interrupt signal is + detectable by the CPU after a WFI/WFE instruction.*/ + SCB->SCR |= SCB_SCR_SEVONPEND_Msk; + +#ifdef CORE_CM7 + +#endif /* CORE_CM7*/ + +#ifdef CORE_CM4 + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = 0x30000000; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BANK2_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif + +#else +#ifdef CORE_CM7 + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = 0x24000000; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BANK1_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif + + /*defaule TCM_SIZE=0x3f,All TCMSRAM are AXI_SRAM,if you want to use ITCM/DTCM, define INIT_TCM_SIZE*/ +#ifdef USING_TCM + ConfigTcmSize(TCM_SIZE_VALUE); +#endif + /*User can change the way of power supply */ + PWR_ConfigSupply(PWR_SUPPLY_SELECTION); + +#else +#error Please #define CORE_CM4 or CORE_CM7 +#endif +#endif +} + + +/** + *\*\name N32SysTick_Handler. + *\*\fun This function handles N32SysTick Handler. + *\*\param none + *\*\return none + */ +void N32SysTick_Handler(void) +{ + +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/system_n32h76x_78x.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/system_n32h76x_78x.h new file mode 100644 index 0000000000..08f1b3cc79 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/CMSIS/device/system_n32h76x_78x.h @@ -0,0 +1,79 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file system_n32h76x_78x.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __SYSTEM_N32H76X_78X_H__ +#define __SYSTEM_N32H76X_78X_H__ + +#include +#ifdef __cplusplus +extern "C" { +#endif + +/** N32H76X_78X_System */ + + /** Power supply source configuration **/ +#define PWR_SUPPLY_MODE_MASK (PWR_SYSCTRL4_MLDOEN | PWR_SYSCTRL4_DCDCEN | PWR_SYSCTRL4_VCORESRC | PWR_SYSCTRL4_DCDCFRCEN) +#define PWR_LDO_SUPPLY (PWR_SYSCTRL4_MLDOEN) /* Core domains are supplied from the LDO */ +#define PWR_DIRECT_SMPS_SUPPLY (PWR_SYSCTRL4_DCDCEN) /* Core domains are supplied from the SMPS */ +#define PWR_EXTERNAL_SOURCE_SUPPLY (PWR_SYSCTRL4_VCORESRC) /* The SMPS and the LDO are Bypassed. The Core domains are supplied from an external source */ + + + +extern uint32_t SystemCoreClock; /* System Clock Frequency (Core Clock) */ + +extern void SystemInit(void); +#ifdef __cplusplus +} +#endif + +#endif /*__SYSTEM_N32H76X_78X_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_Common.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_Common.h new file mode 100644 index 0000000000..b3bb87af01 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_Common.h @@ -0,0 +1,273 @@ +/***************************************************************************** +* NationS Microcontroller Software Support +* ---------------------------------------------------------------------------- +* Copyright (c) 2022, NationS Corporation +* +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the disclaimer below. +* +* NationS's name may not be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +* DISCLAIMED. IN NO EVENT SHALL NATIONZ BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ****************************************************************************/ +/***************************************************************************** +* File Name: Common.h +* Function: Defining Common algorithm library API +* version: V1.0 +* Author: Nations Solution Team +* date: 2022-05-23 +* ****************************************************************************/ +#ifndef _Common_H_ +#define _Common_H_ +#include + +enum{ + Cpy_OK=0x5a5a5a5a,//copy success + SetData_OK = 0x5a5a5a5a,//set zero success + Reverse_OK = 0x5a5a5a5a, //reverse success + IsZero_NOT = 0x5a5a5a5a, //Big number is not zero + IsOne_NOT = 0x5a5a5a5a,//big number is one + IsOne_YES = 0x05a5a5a5,//big number is not one + IsZero_YES = 0x05a5a5a5, //Big number is zero + + Cmp_EQUAL = 0, //Two big number are equal + Cmp_LESS = (int32_t)0xa5a55a5a, //The former big number is less than the latter + Cmp_GREATER = 0x1a5a5a5a,//The former big number is greater than the latter + Cmp_ERROR=0x3a3a3a3a, + RandomSort_OK = 0x5a5a5a5a, //disturb order success + XOR_OK=0x5a5a5a5a, //XOR success + Reverse_ERROR = 0x7A9E0863, //reverse fail due to src and dst are same +}; +typedef struct +{ + uint32_t *data; + uint32_t wordLen; +}N_BIGNUM; +/** + * @brief disturb the sequence order + * @param[in] order pointer to the sequence to be disturbed + * @param[in] rand pointer to random number + * @param[in] the length of order + * @return RandomSort_OK: disturb order success; Others: disturb order fail; + * @note + */ +uint32_t RandomSort(uint8_t *order, const uint8_t *rand, uint32_t len); + +/** + * @brief Copy data by byte + * @param[in] dst pointer to destination data + * @param[in] src pointer to source data + * @param[in] byte length + * @return Cpy_OK: success; others: fail. + * @note 1. dst and src cannot be same + */ +uint32_t Cpy_U8(uint8_t *dst, uint8_t *src, uint32_t byteLen); + +/** + * @brief Copy data by word + * @param[in] dst pointer to destination data + * @param[in] src pointer to source data + * @param[in] word length + * @return Cpy_OK: success; others: fail. + * @note 1. dst and src must be aligned by word + */ +uint32_t Cpy_U32(uint32_t *dst, const uint32_t *src, uint32_t wordLen); + + + /** + * @brief XOR + * @param[in] a pointer to one data to be XORed + * @param[in] b pointer to another data to be XORed + * @param[in] the length of order + * @return XOR_OK: operation success; Others: operation fail; + * @note + */ +uint32_t XOR_U8(uint8_t *a, uint8_t *b, uint8_t *c, uint32_t byteLen); + + /** + * @brief XORed two u32 arrays + * @param[in] a pointer to one data to be XORed + * @param[in] b pointer to another data to be XORed + * @param[in] the length of order + * @return XOR_OK: operation success; Others: operation fail; + * @note + */ +uint32_t XOR_U32(uint32_t *a,uint32_t *b,uint32_t *c,uint32_t wordLen); + +/** + * @brief set data by byte + * @param[in] dst pointer to the address to be set data + * @param[in] data + * @param[in] byte length + * @return SetData_OK: success; others: fail. + * @note + */ +uint32_t SetData_U8(uint8_t *dst,uint8_t data, uint32_t byteLen); + +/** + * @brief set data by word + * @param[in] dst pointer to the address to be set data + * @param[in] data + * @param[in] word length + * @return SetData_OK: success; others: fail. + * @note + */ +uint32_t SetData_U32(uint32_t *dst,uint32_t data, uint32_t wordLen); + +/** + * @brief byte reverse through the whole byte array + * @param[in] dst pointer to the address to be set zero + * @param[in] byte length + * @return Reverse_OK: success; others: fail. + * @note 1.dst and src can be same + 2.first byte and last byte of the array are swapped + */ +uint32_t Reverse_U8(uint8_t *dst, const uint8_t *src, uint32_t byteLen);//�ֽڼ��С��ת�� + +/** + * @brief word reverse((0x00010203,04050607,0x08090A0B)->(0x08090A0B,04050607,0x00010203)) + * @param[out] dst pointer to the destination address + * @param[in] dst pointer to the source address + * @param[in] word length of src + * @return Reverse_OK: success; others: fail. + * @note 1.dst and src can be same + 2.first word and last word of the array are swapped; the words stay the same + */ +uint32_t Reverse_U32(uint32_t *dst, const uint32_t *src, uint32_t wordLen);//�ּ��С��ת�� + +/** + * @brief reverse byte order of every word, the words stay the same + * @param[in] dst pointer to the destination address + * @param[in] src pointer to the source address + * @param[in] word length + * @return Reverse_OK: success; others: fail. + * @note 1.dst and src can be same + */ +uint32_t ReverseBytesInWord_U32(uint32_t *dst, const uint32_t *src, uint32_t wordLen);//���ڴ�С��ת�� + +/** + * @brief get bit length of a byte array + * @param[in] n pointer to the array + * @param[in] byteLen + * @return bit length + * @note 1. the byte array is little byte-endian + */ +uint32_t GetBitLen_U8(const uint8_t *n, uint32_t byteLen); + +/** + * @brief get the bit length of big number + * @param[in] n pointer to big number + * @param[in] word length of src + * @return The bit length of n + * @note 1. word little-endian; in a word, it's byte little-endian + */ +uint32_t GetBitLen_U32(const uint32_t *n, uint32_t wordLen); + +/** + * @brief check whether big number is zero or not + * @param[in] n pointer to big number + * @param[in] word length of n + * @return IsZero_YES: zero; IsZero_NOT: not zero. + * @note 1. word little-endian; in a word, it's byte little-endian + */ +uint32_t IsZero_U32(const uint32_t *n, uint32_t wordLen); + +/** + * @brief check whether big number is zero or not + * @param[in] n pointer to big number + * @param[in] byte length of n + * @return IsZero_YES: zero; IsZero_NOT: not zero. + * @note 1. word little-endian; in a word, it's byte little-endian + */ +uint32_t IsZero_U8(const uint8_t *n, uint32_t byteLen); + +/** + * @brief check whether the big number is one or not + * @param[in] n pointer to big number + * @param[in] the word length of n + * @return IsOne_NOT: big number is not one; IsOne_YES: big number is one; + * @note + */ +uint32_t IsOne_U32(const uint32_t *n, uint32_t wordLen); + +/** + * @brief compare two big number + * @param[in] a pointer to one big number + * @param[in] word length of a + * @param[in] b pointer to another big number + * @param[in] word length of b + * @return Cmp_GREATER: a > b; Cmp_LESS: a < b;Cmp_EQUAL: a==b. + * @note 1. word little-endian; in a word, it's byte little-endian + */ +int32_t Cmp_U32(const uint32_t *a, uint32_t aWordLen, const uint32_t *b, uint32_t bWordLen); + +/** + * @brief compare two big number + * @param[in] a pointer to one big number + * @param[in] word length of a + * @param[in] b pointer to another big number + * @param[in] word length of b + * @return Cmp_GREATER: a > b; Cmp_LESS: a < b;Cmp_EQUAL: a==b. + * @note 1. it's byte big-endian + */ +int32_t Cmp_U8(const uint8_t *a, uint32_t aByteLen, const uint8_t *b, uint32_t bByteLen); + +/** + * @brief Load data from buffer to FIFO + * @param[out] dst pointer to destination data + * @param[in] src pointer to source data + * @param[in] word length + * @return Cpy_OK: success; others: fail. + * @note + */ +uint32_t BufToFIFO(volatile uint32_t *dst, const void *src, uint32_t wordLen); + +/** + * @brief Copy data from FIFO to buffer + * @param[out] dst pointer to destination data + * @param[in] src pointer to source data + * @param[in] word length + * @return Cpy_OK: success; others: fail. + * @note + */ +uint32_t FIFOToBuf(void *dst, volatile uint32_t *src, uint32_t wordLen); +/** + * @brief compare two big number(scrambling sequence) + * @param[in] a pointer to one big number + * @param[in] b pointer to another big number + * @param[in] word length of a or b + * @param[in] order pointer to scrambling sequence + * @return Cmp_GREATER: a > b; Cmp_LESS: a < b;Cmp_EQUAL: a==b. + * @note 1. word little-endian; in a word, it's byte little-endian + */ +int32_t Cmp_U32_S(const uint32_t *a, const uint32_t *b, uint32_t wordLen, const uint8_t *order); + + +/** + * @brief compare a and b in byte length + * @param[in] a + * @param[in] b + * @param[in] byteLen + * @param[in] order + * @return Cmp_LESS, a < b Cmp_EQUAL, a = b Cmp_GREATER, a > b Cmp_ERROR, error happens + * @note a[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x89}, b[8]={0x12,0x22,0x33,0x44,0x55,0x66,0x77,0x88} Cmp_U8_S(a,b) = Cmp_LESS + */ + +int32_t Cmp_U8_S(const uint8_t *a, const uint8_t *b, uint32_t byteLen, const uint8_t *order); +#endif + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_DES.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_DES.h new file mode 100644 index 0000000000..da227a3335 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_DES.h @@ -0,0 +1,131 @@ +/***************************************************************************** +* NationS Microcontroller Software Support +* ---------------------------------------------------------------------------- +* Copyright (c) 2025, NationS Corporation +* +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the disclaimer below. +* +* NationS's name may not be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +* DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ****************************************************************************/ +/*****************************************************************************/ +/***************************************************************************** +* File Name: DES.h +* Function: Defining DES algorithm library API +* version: V1.0 +* Author: nations +* date: 2025-04-15 +* ****************************************************************************/ +#ifndef _DES_H_ +#define _DES_H_ + +#include +#include "n32h76x_78x_Common.h" +#define DES_ECB (0) +#define DES_CBC (1) +#define DES_ENCRYPT 0 +#define DES_DECRYPT 1 + +#define TDES_ECB (0) +#define TDES_CBC (1) +#define TDES_ENCRYPT 0 +#define TDES_DECRYPT 1 + +enum DES +{ + DES_Init_OK = 0x2a2a7a7a, //DES opreation success + DES_Crypto_OK = 0x2a2a7a7a, //DES opreation success + DES_ModeErr = 0x5a5a5a5a, //Working mode error(Neither ECB nor CBC) + DES_EnDeErr, //En&De error(Neither encryption nor decryption) + DES_ParaNull, // the part of input(output/iv) Null + DES_KeyLenErr, + DES_LengthErr, + DES_ATTACKED, //DES subjected to attack +}; +typedef struct +{ + uint8_t *in; // the part of input to be encrypted or decrypted + uint8_t *iv; // the part of initial vector + uint8_t *out; // the part of out + uint8_t *key; // the part of key + uint32_t inByteLen; // the length(by byte) of plaintext or cipher + uint32_t En_De; // 0x33333333- encrypt, 0x44444444 - decrypt + uint32_t Mode; // 0x11111111 - ECB, 0x22222222 - CBC + uint32_t keyByteLen; //the length(by byte) of key +}DES_PARM; + +typedef DES_PARM TDES_PARM; + + + + +/** + * @brief DES Init + * @param[in] parm pointer to DES context and the detail please refer to struct DES_PARM in DES.h + * @return DES_Init_OK, DES Init success; othets: DES Init fail(reference to the definition by enum variation) + * @note 1.Please refer to the demo in user guidance before using this function + * 2. IV can be NULL when ECB mode + * 3. The byte lengrh of message must be as times as 8. + */ +uint32_t DES_Init(DES_PARM *parm); + + + + + +/** + * @brief DES crypto + * @param[in] parm pointer to DES context and the detail please refer to struct DES_PARM in SM1.h + * @return DES_Crypto_OK, DES crypto success; othets: DES crypto fail(reference to the definition by enum variation) + * @note 1.Please refer to the demo in user guidance before using this function + * 2. IV can be NULL when ECB mode + * 3. The byte lengrh of message must be as times as 8. + */ + uint32_t DES_Crypto1(DES_PARM *parm); + +/** + * @brief DES close + * @return none + * @note + */ + void DES_Close(void); + + +#define TDES_Init DES_Init +#define TDES_Crypto1 DES_Crypto1 +#define TDES_Close DES_Close + +/** + * @brief Get DES lib version + * @param[out] type pointer one byte type information represents the type of the lib, like Commercial version.\ + * @Bits 0~4 stands for Commercial (C), Security (S), Normal (N), Evaluation (E), Test (T), Bits 5~7 are reserved. e.g. 0x09 stands for CE version. + * @param[out] customer pointer one byte customer information represents customer ID. for example, 0x00 stands for standard version, 0x01 is for Tianyu customized version... + * @param[out] date pointer array which include three bytes date information. If the returned bytes are 18,9,13,this denotes September 13,2018 + * @param[out] version pointer one byte version information represents develop version of the lib. e.g. 0x12 denotes version 1.2. + * @return none + * @1.You can recall this function to get DES lib information + */ + void DES_Version(uint8_t *type, uint8_t *customer, uint8_t date[3], uint8_t *version); + +#define TDES_Version DES_Version +#endif /*_DES_H_*/ + + +/** @} */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_HASH.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_HASH.h new file mode 100644 index 0000000000..ce79776dd4 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_HASH.h @@ -0,0 +1,216 @@ +/***************************************************************************** +* NationS Microcontroller Software Support +* ---------------------------------------------------------------------------- +* Copyright (c) 2025, NationS Corporation +* +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the disclaimer below. +* +* NationS's name may not be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +* DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ****************************************************************************/ +/*****************************************************************************/ +/***************************************************************************** +* File Name:Hash.h +* Function: Defining AES algorithm library API +* version: V1.0 +* Author: nations +* date: 2025-04-15 +* ****************************************************************************/ +#ifndef _HASH_H_ +#define _HASH_H_ +#include "n32h76x_78x_Common.h" +#define ALG_SHA1 (uint16_t)(0x0004) +#define ALG_SHA224 (uint16_t)(0x000A) +#define ALG_SHA256 (uint16_t)(0x000B) +#define ALG_SHA384 (uint16_t)(0x000C) +#define ALG_SHA512 (uint16_t)(0x000D) + +enum +{ + HASH_SEQUENCE_TRUE = 0x0105A5A5,//save IV + HASH_SEQUENCE_FALSE = 0x010A5A5A, //not save IV + HASH_Init_OK = 0x5a5a5a5a,//hash init success + HASH_Start_OK = 0x5a5a5a5a,//hash update success + HASH_Update_OK = 0x5a5a5a5a,//hash update success + HASH_Complete_OK = 0x5a5a5a5a,//hash complete success + HASH_Close_OK = 0x5a5a5a5a,//hash close success + HASH_ByteLenPlus_OK = 0x5a5a5a5a,//byte length plus success + HASH_PadMsg_OK = 0x5a5a5a5a,//message padding success + HASH_ProcMsgBuf_OK = 0x5a5a5a5a, //message processing success + SM3_Hash_OK = 0x5a5a5a5a,//sm3 operation success + SHA256_Hash_OK = 0x5a5a5a5a,//sha256 operation success + SHA1_Hash_OK = 0,//sha1 operation success + SHA224_Hash_OK = 0,//sha224 operation success + SHA384_Hash_OK = 0,//sha384 operation success + SHA512_Hash_OK = 0,//sha512 operation success + HASH_Init_ERROR = 0x01044400,//hash init error + HASH_Start_ERROR, //hash start error + HASH_Update_ERROR, //hash update error + HASH_Complete_ERROR,//hash complete error + HASH_ByteLenPlus_ERROR,//hash byte plus error + HASH_ATTACK, //hash operation subject to attack +}; + + struct _HASH_CTX_; + +typedef struct +{ + const uint16_t HashAlgID;//choice hash algorithm + //const uint32_t * const K, KLen;//K and byte length of K + const uint32_t * const IV, IVLen;//IV and byte length of IV + const uint32_t HASH_ALGCR, HASH_SACCR, HASH_HASHCTRL;//relate registers + const uint32_t BlockByteLen, BlockWordLen; //byte length of block, word length of block + const uint32_t DigestByteLen, DigestWordLen; //byte length of digest,word length of digest + const uint32_t Cycle; //interation times + uint32_t (* const ByteLenPlus)(uint32_t *, uint32_t); //function pointer + uint32_t (* const PadMsg)(struct _HASH_CTX_ *); //function pointer +}HASH_ALG; + + +typedef struct _HASH_CTX_ +{ + const HASH_ALG *hashAlg; //pointer to HASH_ALG + uint32_t sequence; // TRUE if the IV should be saved + uint32_t IV[16]; + uint32_t msgByteLen[4]; + uint8_t msgBuf[132]; + uint32_t msgIdx; +}HASH_CTX; + + +extern const HASH_ALG HASH_ALG_SHA1[1]; +extern const HASH_ALG HASH_ALG_SHA224[1]; +extern const HASH_ALG HASH_ALG_SHA256[1]; +extern const HASH_ALG HASH_ALG_SHA384[1]; +extern const HASH_ALG HASH_ALG_SHA512[1]; + +/** + * @brief Hash init + * @param[in] ctx pointer to HASH_CTX struct + * @return HASH_Init_OK, Hash init success; othets: Hash init fail + * @note 1.Please refer to the demo in user guidance before using this function + */ +uint32_t HASH_Init(HASH_CTX *ctx); + +/** + * @brief Hash start + * @param[in] ctx pointer to HASH_CTX struct + * @return HASH_Start_OK, Hash start success; othets: Hash start fail + * @note 1.Please refer to the demo in user guidance before using this function + * 2.HASH_Init() should be recalled before use this function + */ +uint32_t HASH_Start(HASH_CTX *ctx); + +/** + * @brief Hash update + * @param[in] ctx pointer to HASH_CTX struct + * @param[in] in pointer to message + * @param[out] out pointer tohash result,digest + * @return HASH_Update_OK, Hash update success; othets: Hash update fail + * @note 1.Please refer to the demo in user guidance before using this function + * 2.HASH_Init() and HASH_Start() should be recalled before use this function + */ +uint32_t HASH_Update(HASH_CTX *ctx, uint8_t *in, uint32_t byteLen); + +/** + * @brief Hash complete + * @param[in] ctx pointer to HASH_CTX struct + * @param[out] out pointer tohash result,digest + * @return HASH_Complete_OK, Hash complete success; othets: Hash complete fail + * @note 1.Please refer to the demo in user guidance before using this function + * 2.HASH_Init(), HASH_Start() and HASH_Update() should be recalled before use this function + */ +uint32_t HASH_Complete(HASH_CTX *ctx, uint8_t *out); + +/** + * @brief Hash close + * @return HASH_Close_OK, Hash close success; othets: Hash close fail + * @note 1.Please refer to the demo in user guidance before using this function + */ +void HASH_Close(void); + + + +/** + * @brief SHA1 Hash + * @param[in] in pointer to message + * @param[in] byte length of in + * @param[out] out pointer tohash result,digest + * @return SHA1_Hash_OK, SHA1 hash success; othets: SHA1 hash fail + * @note 1.Please refer to the demo in user guidance before using this function + */ +uint32_t SHA1_Hash(uint8_t* in,uint32_t byteLen, uint8_t* out); + +/** + * @brief SHA224 Hash + * @param[in] in pointer to message + * @param[in] byte length of in + * @param[out] out pointer tohash result,digest + * @return SHA224_Hash_OK, SHA224 hash success; othets: SHA224 hash fail + * @note 1.Please refer to the demo in user guidance before using this function + */ +uint32_t SHA224_Hash(uint8_t* in,uint32_t byteLen, uint8_t* out); + + +/** + * @brief SHA256 Hash + * @param[in] in pointer to message + * @param[in] byte length of in + * @param[out] out pointer tohash result,digest + * @return SHA256_Hash_OK, SHA256 hash success; othets: SHA256 hash fail + * @note 1.Please refer to the demo in user guidance before using this function + */ +uint32_t SHA256_Hash(uint8_t* in,uint32_t byteLen, uint8_t* out); + +/** + * @brief SHA384 Hash + * @param[in] in pointer to message + * @param[in] byte length of in + * @param[in] out pointer tohash result,digest + * @return SHA384_Hash_OK, SHA384 hash success; othets: SHA384 hash fail + * @note 1.Please refer to the demo in user guidance before using this function + */ +uint32_t SHA384_Hash(uint8_t* in,uint32_t byteLen, uint8_t* out); + +/** + * @brief SHA512 Hash + * @param[in] in pointer to message + * @param[in] byte length of in + * @param[out] out pointer tohash result,digest + * @return SHA512_Hash_OK, SHA512 hash success; othets: SHA512 hash fail + * @note 1.Please refer to the demo in user guidance before using this function + */ +uint32_t SHA512_Hash(uint8_t* in,uint32_t byteLen, uint8_t* out); + + +/** + * @brief Get HASH lib version + * @param[out] type pointer one byte type information represents the type of the lib, like Commercial version.\ + * @Bits 0~4 stands for Commercial (C), Security (S), Normal (N), Evaluation (E), Test (T), Bits 5~7 are reserved. e.g. 0x09 stands for CE version. + * @param[out] customer pointer one byte customer information represents customer ID. for example, 0x00 stands for standard version, 0x01 is for Tianyu customized version... + * @param[out] date pointer array which include three bytes date information. If the returned bytes are 18,9,13,this denotes September 13,2018 + * @param[out] version pointer one byte version information represents develop version of the lib. e.g. 0x12 denotes version 1.2. + * @return none + * @1.You can recall this function to get HASH lib information + */ +void HASH_Version(uint8_t *type, uint8_t *customer, uint8_t date[3], uint8_t *version); + + +#endif diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_RNG.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_RNG.h new file mode 100644 index 0000000000..e84dfaeace --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_RNG.h @@ -0,0 +1,112 @@ +/***************************************************************************** +* NationS Microcontroller Software Support +* ---------------------------------------------------------------------------- +* Copyright (c) 2025, NationS Corporation +* +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the disclaimer below. +* +* NationS's name may not be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +* DISCLAIMED. IN NO EVENT SHALL NATIONZ BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ****************************************************************************/ +/***************************************************************************** +* File Name: RNG.h +* Function: Defining RNG API +* author: nations +* version: V1.0 +* date: 2025-4-15 +* ****************************************************************************/ + + + + + +#include +#ifndef __RNG_H__ +#define __RNG_H__ + + +enum{ + + RNG_OK = 0x5a5a5a5a,//RNG generation process is ok + RNG_LENError = 0x311ECF50, //RNG generation of key length error + RNG_ADDRError = 0x63BB4C39, //This return value is not used + RNG_ADDRNULL = 0x7A9DB86C, // This address is empty + RNG_Attack = 0x4794674F, //The RNG generation process is attacked + RNG_ModeError=0x479467aa, //RNG choose mode is fail + RNG_TESTFAIL=0x479467bb, //RNG test is fail + RNG_SEEDNULL=0x479467cc, //RNG seed is NULL +}; + + +/** + * @brief Get true random number + * @param[out] rand pointer to random number + * @param[out] wordLen pointer to word length of rand + * @return RNG_OK:get random number success; othets: get random number fail + * @note + */ +uint32_t GetTrueRand_U32(uint32_t *rand, uint32_t wordLen); + +/** + * @brief Get true random number + * @param[out] rand pointer to random number + * @param[out] wordLen pointer to word length of rand + * @return RNG_OK:get random number success; othets: get random number fail + * @note + */ +uint32_t GetTrueRand_U8(uint8_t *rand, uint32_t bytelen); + +/** + * @brief PseudoRandNumInit + * @param[in] seed of PseudoRandNum + * @return RNG_OK:PseudoRandNumInit success; othets: PseudoRandNumInit fail + * @note + */ +uint32_t PseudoRandNumInit(uint32_t seed[5]); + +/** + * @brief PseudoRandNumReseed + * @param[in] seed of PseudoRandNum + * @return RNG_OK:PseudoRandNumReseed success; othets: PseudoRandNumReseed fail + * @note + */ +uint32_t PseudoRandNumReseed(uint32_t seed[5]); +/** + * @brief Get pseudo random number + * @param[out] rand pointer to random number + * @param[out] rand pointer to random number + * @return RNG_OK:get random number success; othets: get random number fail + */ + +uint32_t GetPseudoRand_U32(uint32_t *rand, uint32_t wordLen); +/** + * @brief Get RNG lib version + * @param[out] type pointer one byte type information represents the type of the lib, like Commercial version.\ + * @Bits 0~4 stands for Commercial (C), Security (S), Normal (N), Evaluation (E), Test (T), Bits 5~7 are reserved. e.g. 0x09 stands for CE version. + * @param[out] customer pointer one byte customer information represents customer ID. for example, 0x00 stands for standard version, 0x01 is for Tianyu customized version... + * @param[out] date pointer array which include three bytes date information. If the returned bytes are 18,9,13,this denotes September 13,2018 + * @param[out] version pointer one byte version information represents develop version of the lib. e.g. 0x12 denotes version 1.2. + * @return none + * @1.You can recall this function to get DES lib information + */ +void RNG_Version(uint8_t *type, uint8_t *customer, uint8_t date[3], uint8_t *version); + +#endif + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_SAC_Common.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_SAC_Common.h new file mode 100644 index 0000000000..567fc09af6 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_SAC_Common.h @@ -0,0 +1,122 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_SAC_Common.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __SAC_Common_H +#define __SAC_Common_H +#include +//#include "ns3610.h" + +/** + * @file SAC_Common.h + * @brief Declaring registers related to SAC module. + * @author Nations + * @version V0.1 + * @date 7th Dec, 2022 + */ + +#define SDPU_BASE (0x400F2000) +#define SDMA_BASE (SDPU_BASE)//(AHB2PERIPH_BASE + 0x2000):0x400F2000 +#define SAC_BASE (SDPU_BASE + 0x1000) +#define RNG_BASE (SDPU_BASE + 0x1080) +typedef struct +{ + volatile uint32_t SACCR ;//0 + volatile uint32_t SACSR;//4 + volatile uint32_t RESERVED0;//8 + volatile uint32_t SACSFR1;//C +}SAC_TypeDef; + +typedef struct +{ + volatile uint32_t SDMACR;//0 + volatile uint32_t SDMACH0SRCADDR;//4 + volatile uint32_t SDMACH1DSTADDR;//8 + volatile uint32_t RESERVED0;//C + volatile uint32_t RESERVED1;//10 + volatile uint32_t SDMACHCTRL;//14 + volatile uint32_t SDMAINTSTATUS;//18 + volatile uint32_t SDMAINTEN;//1C + volatile uint32_t SDMACRCVALUE0;//20 + volatile uint32_t SDMACRCVALUE1;//24 +}SDMA_TypeDef; + +typedef struct +{ + volatile uint32_t RNGCCTRL;//0 + volatile uint32_t RNGSTATE;//4 + volatile uint32_t RNGDATA1;//8 + volatile uint32_t RNGDRNGSEED;//c + volatile uint32_t RNGDRNGSEED1;//10 + volatile uint32_t RNGINTOUTEN;//14 + +}RNG_TypeDef; + +#define SAC ((SAC_TypeDef * ) SAC_BASE) +#define SDMA ((SDMA_TypeDef * ) SDMA_BASE) +#define RNG ((RNG_TypeDef * ) RNG_BASE) +#define REG32( addr ) (*(volatile uint32_t *)(addr)) +#define SACP1ADR REG32(SDPU_BASE + 0x1040) +#define SACP2ADR REG32(SDPU_BASE + 0x1044) +#define SACP3ADR REG32(SDPU_BASE + 0x1048) +#define SACKADR REG32(SDPU_BASE + 0x104C) +#define SACIADR REG32(SDPU_BASE + 0x1050) +#define SACOADR REG32(SDPU_BASE + 0x1054) +#define SACCNTADR REG32(SDPU_BASE + 0x1058) +#define RNGINTEN REG32((SDPU_BASE + 0x1094)) +#define SDPU_M7_EN REG32 (0x580300B0) +#define RNG_En REG32 (0x58030170) +#define AFEC_RNG REG32 (0x58000434) + + +#endif diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_SM4.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_SM4.h new file mode 100644 index 0000000000..e0817d6bd6 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_SM4.h @@ -0,0 +1,108 @@ +/***************************************************************************** +* NationS Microcontroller Software Support +* ---------------------------------------------------------------------------- +* Copyright (c) 2025, NationS Corporation +* +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the disclaimer below. +* +* NationS's name may not be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +* DISCLAIMED. IN NO EVENT SHALL NATIONZ BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ****************************************************************************/ +/***************************************************************************** +* File Name: SM4.h +* Function: Defining RNG API +* author: nations +* version: V1.0 +* date: 2025-4-15 +* ****************************************************************************/ + +#ifndef _SM4_H_ +#define _SM4_H_ + +#include "n32h76x_78x_Common.h" + +#define SM4_ECB 0 +#define SM4_CBC 1 +#define SM4_ENCRYPT 0 +#define SM4_DECRYPT 1 + +enum SM4_ENUM +{ + + SM4_Init_OK = 0x5a5a5a5a, //SM4 opreation success + SM4_Crypto_OK=0x5a5a5a5a, //SM4 opreation success + SM4_ParaNull =0x27A90E35, //the address of input is NULL + SM4_ModeErr, //working mode error(Neither ECB nor CBC) + SM4_EnDeErr, // En&De error(Neither encryption nor decryption) + SM4_LengthErr,//the byte length of input error + SM4_ATTACKED, //SM4 subjected to attack +}; +typedef struct{ + uint8_t *in; // the part of input to be encrypted or decrypted + uint8_t *iv; // the part of initial vector + uint8_t *out; // the part of out + uint8_t *key; // the part of key + uint32_t inBytelen; //the word length of input or output + uint32_t En_De; //encrypt/decrypt + uint32_t Mode; // ECB/CBC +}SM4_PARM; +/** + * @brief SM4 Init + * @param[in] parm pointer to SM4 context and the detail please refer to struct SM4_PARM in SM4.h + * @return SM4_Init_OK, SM4 Init success; othets: SM4 Init fail(reference to the definition by enum variation) + * @note 1.Please refer to the demo in user guidance before using this function + * 2. IV can be NULL when ECB mode + * 3. The byte lengrh of message must be as times as 16. + */ + +uint32_t SM4_Init(SM4_PARM *parm); + +/** + * @brief SM4 crypto + * @param[in] parm pointer to SM4 context and the detail please refer to struct SM4_PARM in SM4.h + * @return SM4_Crypto_OK, SM4 crypto success; othets: SM4 crypto fail(reference to the definition by enum variation) + * @note 1.Please refer to the demo in user guidance before using this function + * 2. IV can be NULL when ECB mode + * 3. The byte lengrh of message must be as times as 16. + */ +uint32_t SM4_Crypto1(SM4_PARM *parm); +/** + * @brief Close SM4 algorithm + * @return none + * @note if you want to close SM4 algorithm, this function can be recalled. + */ +void SM4_Close(void); + + +/** + * @brief Get SM4 lib version + * @param[out] type pointer one byte type information represents the type of the lib, like Commercial version.\ + * @Bits 0~4 stands for Commercial (C), Security (S), Normal (N), Evaluation (E), Test (T), Bits 5~7 are reserved. e.g. 0x09 stands for CE version. + * @param[out] customer pointer one byte customer information represents customer ID. for example, 0x00 stands for standard version, 0x01 is for Tianyu customized version... + * @param[out] date pointer array which include three bytes date information. If the returned bytes are 18,9,13,this denotes September 13,2018 + * @param[out] version pointer one byte version information represents develop version of the lib. e.g. 0x12 denotes version 1.2. + * @return none + * @1.You can recall this function to get SM4 lib information + */ +void SM4_Version(uint8_t *type, uint8_t *customer, uint8_t date[3], uint8_t *version); + + +#endif /*_SM4_H_*/ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_aes.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_aes.h new file mode 100644 index 0000000000..5310261083 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_algo_lib/inc/n32h76x_78x_aes.h @@ -0,0 +1,119 @@ +/***************************************************************************** +* NationS Microcontroller Software Support +* ---------------------------------------------------------------------------- +* Copyright (c) 2025, NationS Corporation +* +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the disclaimer below. +* +* NationS's name may not be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +* DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* ****************************************************************************/ +/*****************************************************************************/ +/***************************************************************************** +* File Name: AES.h +* Function: Defining AES algorithm library API +* version: V1.0 +* Author: nations +* date: 2025-04-15 +* ****************************************************************************/ +#ifndef __AES_H +#define __AES_H +#include + +#define AES_ECB 0x11111111 +#define AES_CBC 0x22222222 +#define AES_CTR 0x33333333 +#define AES_ENCRYPT 0x44444444 +#define AES_DECRYPT 0x55555555 +#define AES_KEY_128 0x66666666 +#define AES_KEY_192 0x77777777 +#define AES_KEY_256 0x88888888 + + +enum{ + AES_Init_OK = 0x3a3a5a5a, //AES opreation success + AES_Crypto_OK=0x3a3aa5a5, //AES opreation success + AES_ModeErr= 0x5a5a5a5a, //Working mode error(Neither ECB nor CBC,CTR) + AES_EnDeErr, // En&De error(Neither encryption nor decryption) + AES_ParaNull, // the part of input(output/iv) Null + AES_LengthErr,// + AES_KeyLengthError, + AES_ATTACKED, //AES subjected to attack +}; +typedef struct +{ + uint8_t *in; // the part of input to be encrypted or decrypted + uint8_t *iv; // the part of initial vector + uint8_t *out; // the part of out + uint8_t *key; // the part of key + uint32_t keyBytelen; // the length(by byte) of key + uint32_t inBytelen; // the length(by byte) of plaintext or cipher + uint32_t En_De; // 0x44444444- encrypt, 0x55555555 - decrypt + uint32_t Mode; // 0x11111111 - ECB, 0x22222222 - CBC,0x33333333-AES_CTR +}AES_PARM; + +/** + * @brief AES Init + * @param[in] parm pointer to AES context and the detail please refer to struct DES_PARM in DES.h + * @return AES_Init_OK, AES Init success; othets: AES Init fail(reference to the definition by enum variation) + * @note 1.Please refer to the demo in user guidance before using this function + * 2. IV can be NULL when ECB mode + * 3. The byte lengrh of message must be as times as 16. + */ +uint32_t AES_Init(AES_PARM *parm); + +/** + * @brief AES crypto + * @param[in] parm pointer to DES context and the detail please refer to struct DES_PARM in SM1.h + * @return AES_Crypto_OK, DES crypto success; othets: AES crypto fail(reference to the definition by enum variation) + * @note 1.Please refer to the demo in user guidance before using this function + * 2. IV can be NULL when ECB mode + * 3. The byte lengrh of message must be as times as 16. + */ + +uint32_t AES_Crypto(AES_PARM *parm); + +/** + * @brief AES close + * @return none + * @note + */ +void AES_Close(void); + + + + /** + * @brief Get AES lib version + * @param[out] type pointer one byte type information represents the type of the lib, like Commercial version.\ + * @Bits 0~4 stands for Commercial (C), Security (S), Normal (N), Evaluation (E), Test (T), Bits 5~7 are reserved. e.g. 0x09 stands for CE version. + * @param[out] customer pointer one byte customer information represents customer ID. for example, 0x00 stands for standard version, 0x01 is for Tianyu customized version... + * @param[out] date pointer array which include three bytes date information. If the returned bytes are 18,9,13,this denotes September 13,2018 + * @param[out] version pointer one byte version information represents develop version of the lib. e.g. 0x12 denotes version 1.2. + * @return none + * @1.You can recall this function to get AES lib information + */ +void AES_Version(uint8_t *type, uint8_t *customer, uint8_t date[3], uint8_t *version); + + +#endif + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/mmc_host.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/mmc_host.h new file mode 100644 index 0000000000..0f7e076694 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/mmc_host.h @@ -0,0 +1,266 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file mmc_host.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __MMC_HOST_H__ +#define __MMC_HOST_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "sdmmc_spec.h" +#include "n32h76x_78x_sdmmc.h" + + + + +/* MMC card flags */ +enum +{ + MMC_SupportHighSpeed26MHZFlag = (1U << 0U), /*mmc_card_information Support high speed 26MHZ */ + MMC_SupportHighSpeed52MHZFlag = (1U << 1U), /*mmc_card_information Support high speed 52MHZ */ + MMC_SupportHighSpeedDDR52MHZ180V300VFlag = (1 << 2U), /*mmc_card_information ddr 52MHZ 1.8V or 3.0V */ + MMC_SupportHighSpeedDDR52MHZ120VFlag = (1 << 3U), /*mmc_card_information DDR 52MHZ 1.2V */ + MMC_SupportHS200200MHZ180VFlag = (1 << 4U), /*mmc_card_information HS200 ,200MHZ,1.8V */ + MMC_SupportHS200200MHZ120VFlag = (1 << 5U), /*mmc_card_information HS200, 200MHZ, 1.2V */ + MMC_SupportHS400DDR200MHZ180VFlag = (1 << 6U), /*mmc_card_information HS400, DDR, 200MHZ,1.8V */ + MMC_SupportHS400DDR200MHZ120VFlag = (1 << 7U), /*mmc_card_information HS400, DDR, 200MHZ,1.2V */ + MMC_SupportHighCapacityFlag = (1U << 8U), /*mmc_card_information Support high capacity */ + MMC_SupportAlternateBootFlag = (1U << 9U), /*mmc_card_information Support alternate boot */ + MMC_SupportDDRBootFlag = (1U << 10U), /*mmc_card_information support DDR boot flag*/ + MMC_SupportHighSpeedBootFlag = (1U << 11U), /*mmc_card_information support high speed boot flag */ + MMC_SupportEnhanceHS400StrobeFlag = (1U << 12U), /*mmc_card_information support enhance HS400 strobe */ +}; + +/* MMC card individual commands */ +typedef enum +{ + MMC_SendOperationCondition = 1U, /* Send Operation Condition */ + MMC_SetRelativeAddress = 3U, /* Set Relative Address */ + MMC_SleepAwake = 5U, /* Sleep Awake */ + MMC_Switch = 6U, /* Switch */ + MMC_SendExtendedCsd = 8U, /* Send EXT_CSD */ + MMC_ReadDataUntilStop = 11U, /* Read Data Until Stop */ + MMC_BusTestRead = 14U, /* Test Read */ + MMC_SendingBusTest = 19U, /* test bus width cmd*/ + MMC_WriteDataUntilStop = 20U, /* Write Data Until Stop */ + MMC_SendTuningBlock = 21U, /* MMC sending tuning block */ + MMC_ProgramCid = 26U, /* Program CID */ + MMC_EraseGroupStart = 35U, /* Erase Group Start */ + MMC_EraseGroupEnd = 36U, /* Erase Group End */ + MMC_FastInputOutput = 39U, /* Fast IO */ + MMC_GoInterruptState = 40U, /* Go interrupt State */ +} mmc_command_t; + +/* mmccard cmd13 retry times */ +#define MMC_CMD13_RETRY_TIMES (10) +/* mmccard access idle timeout value */ +#define MMC_CARD_ACCESS_WAIT_IDLE_TIMEOUT (10000U) + +/* Record information of mmccard */ +typedef struct +{ + uint32_t flags; /* mmccard Flags */ + uint32_t busy; /* busy status */ + uint32_t ocr; /* Raw OCR content,, only 24bit avalible for SDIO mmccard */ + mmc_cid cid; /* CID */ + uint32_t rca; /* Relative address of the mmccard */ + mmc_csd_t csd; /* CSD */ + uint32_t userPartitionBlocks; /* Card total block number in user partition */ + uint32_t bootPartitionBlocks; /* Boot partition size united as block size */ + uint32_t eraseGroupBlocks; /* Erase group size united as block size */ + uint32_t blockCount; /* Card total block number */ + uint32_t blockSize; /* mmccard block size */ + mmc_extended_csd_t extendedCsd; /* Extended CSD */ + uint32_t version; /* mmccard version */ +// sd_status_t stat; /* sd 512 bit status */ +}mmc_card_info; + + +/* mmccard bus width */ +typedef enum +{ + MMC_DataBusWidth1bit = 0U, /* MMC data bus width is 1 bit */ + MMC_DataBusWidth4bit = 1U, /* MMC data bus width is 4 bits */ + MMC_DataBusWidth8bit = 2U, /* MMC data bus width is 8 bits */ + MMC_DataBusWidth4bitDDR = 5U, /* MMC data bus width is 4 bits ddr */ + MMC_DataBusWidth8bitDDR = 6U, /* MMC data bus width is 8 bits ddr */ +}mmc_buswidth_t; + + + +/* The bit mask for VOLTAGE WINDOW 1.70V to 1.95V field in OCR */ +#define MMC_OCR_V170TO195_SHIFT (7U) +/* The bit mask for VOLTAGE WINDOW 1.70V to 1.95V field in OCR */ +#define MMC_OCR_V170TO195_MASK (0x00000080U) +/* The bit shift for VOLTAGE WINDOW 2.00V to 2.60V field in OCR */ +#define MMC_OCR_V200TO260_SHIFT (8U) +/* The bit mask for VOLTAGE WINDOW 2.00V to 2.60V field in OCR */ +#define MMC_OCR_V200TO260_MASK (0x00007F00U) +/* The bit shift for VOLTAGE WINDOW 2.70V to 3.60V field in OCR */ +#define MMC_OCR_V270TO360_SHIFT (15U) +/* The bit mask for VOLTAGE WINDOW 2.70V to 3.60V field in OCR */ +#define MMC_OCR_V270TO360_MASK (0x00FF8000U) +/* The bit shift for ACCESS MODE field in OCR */ +#define MMC_OCR_ACCESS_MODE_SHIFT (29U) +/* The bit mask for ACCESS MODE field in OCR */ +#define MMC_OCR_ACCESS_MODE_MASK (0x60000000U) +/* The bit shift for BUSY field in OCR */ +#define MMC_OCR_BUSY_SHIFT (31U) +/* The bit mask for BUSY field in OCR */ +#define MMC_OCR_BUSY_MASK (1U << MMC_OCR_BUSY_SHIFT) + +/* MMC card access mode(Access mode in OCR). */ +typedef enum +{ + MMC_AccessModeByte = 0U, /* The card should be accessed as byte */ + MMC_AccessModeSector = 2U, /* The card should be accessed as sector */ +} mmc_access_mode_t; + +/* mmccard operation voltage */ +typedef enum +{ + MMC_OperationVoltageNone = 0U, /* indicate current voltage setting is not setting by suser*/ + MMC_OperationVoltage120V = 1U, /* mmccard operation voltage is 1.2v */ + MMC_OperationVoltage170to195V = 2U, /* mmccard operation voltage is 1.7v to 1.95v */ + MMC_OperationVoltage270to360V = 0x1FFU, /* mmccard operation voltage is 2.7v to 3.6v */ +}mmc_operation_voltage_t; + +/* CSD structure version(CSD_STRUCTURE in CSD). */ +typedef enum _mmc_csd_structure_version +{ + MMC_CsdStrucureVersion10 = 0U, /* CSD version No. 1.0 */ + MMC_CsdStrucureVersion11 = 1U, /* CSD version No. 1.1 */ + MMC_CsdStrucureVersion12 = 2U, /* CSD version No. 1.2 */ + MMC_CsdStrucureVersionInExtcsd = 3U, /* Version coded in Extended CSD */ +} mmc_csd_structure_version_t; + +/* MMC card specification version(SPEC_VERS in CSD). */ +typedef enum _mmc_specification_version +{ + MMC_SpecificationVersion0 = 0U, /* Allocated by MMCA */ + MMC_SpecificationVersion1 = 1U, /* Allocated by MMCA */ + MMC_SpecificationVersion2 = 2U, /* Allocated by MMCA */ + MMC_SpecificationVersion3 = 3U, /* Allocated by MMCA */ + MMC_SpecificationVersion4 = 4U, /* Version 4.1/4.2/4.3/4.41-4.5-4.51-5.0 */ +} mmc_specification_version_t; + +/* MMC card high-speed timing(HS_TIMING in Extended CSD) */ +typedef enum +{ + MMC_HighSpeedTimingNone = 0U, /* MMC card using none high-speed timing */ + MMC_HighSpeedTiming = 1U, /* MMC card using high-speed timing */ + MMC_HighSpeed200Timing = 2U, /* MMC card high speed 200 timing*/ + MMC_NormalSpeedTiming = 3U, /* MMC card not using high-speed timing */ +} mmc_high_speed_timing_t; + +/* The divide value used to avoid float point calculation when calculate max speed in normal mode. */ +#define DIVIDER_IN_TRANSFER_SPEED (10U) +/* Frequency unit defined in TRANSFER SPEED field in CSD */ +static const uint32_t g_transerSpeedFrequencyUnit[] = {100000U, 1000000U, 10000000U, 100000000U}; +/* The multiplying value defined in TRANSFER SPEED field in CSD */ +static const uint32_t g_transerSpeedMultiplierFactor[] = {0U, 10U, 12U, 13U, 15U, 20U, 26U, 30U, + 35U, 40U, 45U, 52U, 55U, 60U, 70U, 80U}; + +/* SD mmccard communication method and speed */ +typedef struct +{ + uint32_t busClock_Hz; /* SD bus clock frequency united in Hz */ + mmc_buswidth_t busWidth; /* set DATA bus width */ + mmc_high_speed_timing_t busTiming; /* work mode */ + sdmmc_dma_t dma; /* dma mode */ + mmc_operation_voltage_t operationVoltageflag; /* mmccard current operation voltage */ +}mmc_card_workmode; + +/* SD mmccard state + * Define the mmccard structure including the necessary fields to identify and describe the mmccard. + */ +typedef struct +{ + SDHOST_Module* SDHOSTx; /* Host device */ + SDMMC_Module* SDMMCx; /* SDMMC */ + SDMMC_CMD command; + mmc_card_info mmc_card_information; + mmc_card_workmode card_workmode; + SDHOST_TMODE_struct TMODE_truct; +} mmc_card_t; + +/* MMC card default relative address */ +#define MMC_DEFAULT_RELATIVE_ADDRESS (2UL) + +Status_card MMC_NormalCMD_Send(mmc_card_t* mmccard, uint32_t index,uint32_t argument,SDMMC_CardRspType responseType); +Status_card MMC_AutoCMD_Send(mmc_card_t* mmccard, uint32_t index,uint32_t argument,SDMMC_CardRspType responseType); + +void MMC_DecodeCid(mmc_card_t* mmccard); +void MMC_DecodeCsd(mmc_card_t* mmccard); +Status_card MMC_PollingCardStatusBusy(mmc_card_t* mmccard,uint32_t timeoutMs); +Status_card MMC_SendExtCsd(mmc_card_t* mmccard); +Status_card MMC_SetMaxEraseUnitSize(mmc_card_t* mmccard); +Status_card MMC_EraseGroups(mmc_card_t* mmccard, uint32_t startGroup, uint32_t endGroup); +Status_card MMC_ReadBlocks(mmc_card_t *mmccard, uint32_t *buffer, uint32_t startBlock, uint32_t blockCount); +Status_card MMC_WriteBlocks(mmc_card_t *mmccard, uint32_t *buffer, uint32_t startBlock, uint32_t blockCount); +Status_card MMC_SwitchVoltage(mmc_card_t *mmccard); +Status_card MMC_SelectBusTiming(mmc_card_t *mmccard); + +/* delay function */ +extern uint32_t MMC_systick_timeoutms; +uint32_t MMC_User_Time_Read(uint32_t time); +void MMC_SysTick_start_time(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __MMC_HOST_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/sd_host.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/sd_host.h new file mode 100644 index 0000000000..67e80bf00e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/sd_host.h @@ -0,0 +1,180 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file sd_host.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __SD_HOST_H__ +#define __SD_HOST_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "sdmmc_spec.h" +#include "n32h76x_78x_sdmmc.h" + + + +/* SDSPI individual commands */ +typedef enum +{ + kSDSPI_CommandCrc = 59U, /* Command crc protection on/off */ +} sdspi_command_t; + +/* SD card individual application commands */ +typedef enum +{ + SD_ApplicationSetBusWdith = 6U, /* Set Bus Width */ + SD_ApplicationStatus = 13U, /* Send SD status */ + SD_ApplicationSendNumberWriteBlocks = 22U, /* Send Number Of Written Blocks */ + SD_ApplicationSetWriteBlockEraseCount = 23U, /* Set Write Block Erase Count */ + SD_ApplicationSendOperationCondition = 41U, /* Send Operation Condition */ + SD_ApplicationSetClearCardDetect = 42U, /* Set Connnect/Disconnect pull up on detect pin */ + SD_ApplicationSendScr = 51U, /* Send Scr */ +} sd_application_command_t; + + + +/* card cmd13 retry times */ +#define SD_CMD13_RETRY_TIMES (10) +/* card access idle timeout value */ +#define SD_CARD_ACCESS_WAIT_IDLE_TIMEOUT (600U) /* more then 500ms timeout value */ + + +/* Record information of card */ +typedef struct +{ + uint32_t flags; /* sd card Flags */ + uint32_t busy; /* busy status */ + uint32_t ocr; /* Raw OCR content,, only 24bit avalible for SDIO card */ + sd_cid cid; /* CID */ + uint32_t rca; /* Relative address of the card */ + sd_csd_t csd; /* CSD */ + uint32_t blockCount; /* Card total block number */ + uint32_t blockSize; /* Card block size */ + sd_scr_t scr; /* SCR */ + uint32_t version; /* Card version */ +// sd_status_t stat; /* sd 512 bit status */ +}sd_card_info; + + +/* card bus width */ +typedef enum +{ + SDMMC_BusWdith1Bit = 0U, /* card bus 1 width */ + SDMMC_BusWdith4Bit = 1U, /* card bus 4 width */ + SDMMC_BusWdith8Bit = 2U, /* card bus 8 width */ +}sd_buswidth_t; + + + + +/* card operation voltage */ +typedef enum +{ + SD_OperationVoltageNone = 0U, /* indicate current voltage setting is not setting by suser*/ + SD_OperationVoltage330V = 1U, /* card operation voltage around 3.3v */ + SD_OperationVoltage300V = 2U, /* card operation voltage around 3.0v */ + SD_OperationVoltage180V = 3U, /* card operation voltage around 1.8v */ +}sd_operation_voltage_t; + +/* SD card communication method and speed */ +typedef struct +{ + uint32_t busClock_Hz; /* SD bus clock frequency united in Hz */ + sd_buswidth_t busWidth; /* set DATA bus width */ + SD_ModeConfig mode; /* work mode */ + sdmmc_dma_t dma; /* dma mode */ + sd_operation_voltage_t operationVoltageflag; /* card current operation voltage */ +}sd_card_workmode; + +/* SD card state + * Define the card structure including the necessary fields to identify and describe the card. + */ +typedef struct +{ + SDHOST_Module* SDHOSTx; /* Host device */ + SDMMC_Module* SDMMCx; /* SDMMC */ + SDMMC_CMD command; + sd_card_info sd_card_information; + sd_card_workmode card_workmode; + SDHOST_TMODE_struct TMODE_truct; +} sd_card_t; + + +/* Default block size */ +#define FSL_SDMMC_DEFAULT_BLOCK_SIZE (512U) + +Status_card SD_NormalCMD_Send(sd_card_t* card, uint32_t index,uint32_t argument,SDMMC_CardRspType responseType); +Status_card SD_AutoCMD_Send(sd_card_t* card, uint32_t index,uint32_t argument,SDMMC_CardRspType responseType); + +void SD_DecodeCid(sd_card_t* card); +void SD_DecodeCsd(sd_card_t* card); +Status_card SD_PollingCardStatusBusy(sd_card_t* card,uint32_t timeoutMs); +Status_card SD_SendSCR(sd_card_t* card); +Status_card SD_Erase_Block(sd_card_t* card, uint32_t startBlock, uint32_t blockCount); +Status_card SD_ReadBlocks(sd_card_t *card, uint32_t *buffer, uint32_t startBlock, uint32_t blockCount); +Status_card SD_WriteBlocks(sd_card_t *card, uint32_t *buffer, uint32_t startBlock, uint32_t blockCount); +Status_card SD_SwitchVoltage(sd_card_t *card); +Status_card SD_SelectBusTiming(sd_card_t *card); + +/* delay function */ +extern uint32_t SD_systick_timeoutms; +uint32_t SD_User_Time_Read(uint32_t time); +void SD_SysTick_start_time(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __SD_HOST_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/sdmmc_spec.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/sdmmc_spec.h new file mode 100644 index 0000000000..253c747d8a --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/inc/sdmmc_spec.h @@ -0,0 +1,548 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file sdmmc_spec.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __SDMMC_SPEC_H__ +#define __SDMMC_SPEC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define swap_uint32( val) (((val << 24) & 0xff000000) | ((val << 8) & 0x00ff0000) | ((val >> 8) & 0x0000ff00) | ((val >> 24) & 0x000000ff)) +/* mask convert */ +#define SDMMC_MASK(bit) (1UL << (bit)) + +/* SD/mmccard status */ +typedef enum +{ + Status_Success = 1, /* Generic status for Success */ + Status_Fail, /* Generic status for Fail */ + Status_PollingCardIdleFailed, /* polling mmccard idle status failed */ + Status_CardStatusIdle, /* mmccard idle */ + Status_CardStatusBusy, /* mmccard busy */ + Status_CardOutOfRange, /* Out of range access. */ + Status_CardNotSupportYet, /* Haven't supported. */ + Status_CardSwitchFailed, /* Switch command failed */ +}Status_card; + +/* Card status bit in R1 */ +enum +{ + SDMMC_R1OutOfRangeFlag = 31, /* Out of range status bit */ + SDMMC_R1AddressErrorFlag = 30, /* Address error status bit */ + SDMMC_R1BlockLengthErrorFlag = 29, /* Block length error status bit */ + SDMMC_R1EraseSequenceErrorFlag = 28, /* Erase sequence error status bit */ + SDMMC_R1EraseParameterErrorFlag = 27, /* Erase parameter error status bit */ + SDMMC_R1WriteProtectViolationFlag = 26, /* Write protection violation status bit */ + SDMMC_R1CardIsLockedFlag = 25, /* Card locked status bit */ + SDMMC_R1LockUnlockFailedFlag = 24, /* lock/unlock error status bit */ + SDMMC_R1CommandCrcErrorFlag = 23, /* CRC error status bit */ + SDMMC_R1IllegalCommandFlag = 22, /* Illegal command status bit */ + SDMMC_R1CardEccFailedFlag = 21, /* Card ecc error status bit */ + SDMMC_R1CardControllerErrorFlag = 20, /* Internal card controller error status bit */ + SDMMC_R1ErrorFlag = 19, /* A general or an unknown error status bit */ + SDMMC_R1CidCsdOverwriteFlag = 16, /* Cid/csd overwrite status bit */ + SDMMC_R1WriteProtectEraseSkipFlag = 15, /* Write protection erase skip status bit */ + SDMMC_R1CardEccDisabledFlag = 14, /* Card ecc disabled status bit */ + SDMMC_R1EraseResetFlag = 13, /* Erase reset status bit */ + SDMMC_R1ReadyForDataFlag = 8, /* Ready for data status bit */ + SDMMC_R1SwitchErrorFlag = 7, /* Switch error status bit */ + SDMMC_R1ApplicationCommandFlag = 5, /* Application command enabled status bit */ + SDMMC_R1AuthenticationSequenceErrorFlag = 3, /* error in the sequence of authentication process */ +}; + +/* R1: current state */ +#define SDMMC_R1_CURRENT_STATE(x) (((x)&0x00001E00U) >> 9U) + +/* CURRENT_STATE filed in R1 */ +typedef enum +{ + SDMMC_R1StateIdle = 0U, /* R1: current state: idle */ + SDMMC_R1StateReady = 1U, /* R1: current state: ready */ + SDMMC_R1StateIdentify = 2U, /* R1: current state: identification */ + SDMMC_R1StateStandby = 3U, /* R1: current state: standby */ + SDMMC_R1StateTransfer = 4U, /* R1: current state: transfer */ + SDMMC_R1StateSendData = 5U, /* R1: current state: sending data */ + SDMMC_R1StateReceiveData = 6U, /* R1: current state: receiving data */ + SDMMC_R1StateProgram = 7U, /* R1: current state: programming */ + SDMMC_R1StateDisconnect = 8U, /* R1: current state: disconnect */ +} sdmmc_r1_current_state_t; + +/* MMC card Extended CSD fix version(EXT_CSD_REV in Extended CSD) */ +enum +{ + MMC_ExtendedCsdRevision10 = 0U, /* Revision 1.0 */ + MMC_ExtendedCsdRevision11 = 1U, /* Revision 1.1 */ + MMC_ExtendedCsdRevision12 = 2U, /* Revision 1.2 */ + MMC_ExtendedCsdRevision13 = 3U, /* Revision 1.3 MMC4.3*/ + MMC_ExtendedCsdRevision14 = 4U, /* Revision 1.4 obsolete*/ + MMC_ExtendedCsdRevision15 = 5U, /* Revision 1.5 MMC4.41*/ + MMC_ExtendedCsdRevision16 = 6U, /* Revision 1.6 MMC4.5*/ + MMC_ExtendedCsdRevision17 = 7U, /* Revision 1.7 MMC5.0 */ +}; + +/* SD card product name length united as bytes. */ +#define SD_PRODUCT_NAME_BYTES (5U) +/* SD card CID register */ +typedef struct +{ + uint8_t manufacturerID; /* Manufacturer ID [127:120] */ + uint16_t applicationID; /* OEM/Application ID [119:104] */ + uint8_t productName[SD_PRODUCT_NAME_BYTES]; /* Product name [103:64] */ + uint8_t productVersion; /* Product revision [63:56] */ + uint32_t productSerialNumber; /* Product serial number [55:24] */ + uint16_t manufacturerData; /* Manufacturing date [19:8] */ +} sd_cid; + +/* MMC card product name length united as bytes. */ +#define MMC_PRODUCT_NAME_BYTES (6U) +/* MMC card CID register. */ +typedef struct +{ + uint8_t manufacturerID; /* Manufacturer ID */ + uint16_t applicationID; /* OEM/Application ID */ + uint8_t productName[MMC_PRODUCT_NAME_BYTES]; /* Product name */ + uint8_t productVersion; /* Product revision */ + uint32_t productSerialNumber; /* Product serial number */ + uint8_t manufacturerData; /* Manufacturing date */ +} mmc_cid; + +/* SD card CSD register flags */ +enum +{ + SD_CsdReadBlockPartialFlag = (1U << 0U), /* Partial blocks for read allowed [79:79] */ + SD_CsdWriteBlockMisalignFlag = (1U << 1U), /* Write block misalignment [78:78] */ + SD_CsdReadBlockMisalignFlag = (1U << 2U), /* Read block misalignment [77:77] */ + SD_CsdDsrImplementedFlag = (1U << 3U), /* DSR implemented [76:76] */ + SD_CsdEraseBlockEnabledFlag = (1U << 4U), /* Erase single block enabled [46:46] */ + SD_CsdWriteProtectGroupEnabledFlag = (1U << 5U), /* Write protect group enabled [31:31] */ + SD_CsdWriteBlockPartialFlag = (1U << 6U), /* Partial blocks for write allowed [21:21] */ + SD_CsdFileFormatGroupFlag = (1U << 7U), /* File format group [15:15] */ + SD_CsdCopyFlag = (1U << 8U), /* Copy flag [14:14] */ + SD_CsdPermanentWriteProtectFlag = (1U << 9U), /* Permanent write protection [13:13] */ + SD_CsdTemporaryWriteProtectFlag = (1U << 10U), /* Temporary write protection [12:12] */ +}; + +/* MMC card CSD register flags */ +enum +{ + MMC_CsdReadBlockPartialFlag = (1U << 0U), /* Partial blocks for read allowed */ + MMC_CsdWriteBlockMisalignFlag = (1U << 1U), /* Write block misalignment */ + MMC_CsdReadBlockMisalignFlag = (1U << 2U), /* Read block misalignment */ + MMC_CsdDsrImplementedFlag = (1U << 3U), /* DSR implemented */ + MMC_CsdWriteProtectGroupEnabledFlag = (1U << 4U), /* Write protect group enabled */ + MMC_CsdWriteBlockPartialFlag = (1U << 5U), /* Partial blocks for write allowed */ + MMC_ContentProtectApplicationFlag = (1U << 6U), /* Content protect application */ + MMC_CsdFileFormatGroupFlag = (1U << 7U), /* File format group */ + MMC_CsdCopyFlag = (1U << 8U), /* Copy flag */ + MMC_CsdPermanentWriteProtectFlag = (1U << 9U), /* Permanent write protection */ + MMC_CsdTemporaryWriteProtectFlag = (1U << 10U), /* Temporary write protection */ +}; + +/* SD/MMC mmccard common commands */ +typedef enum +{ + SDMMC_GoIdleState = 0U, /* Go Idle State */ + SDMMC_AllSendCid = 2U, /* All Send CID */ + SDMMC_SetDsr = 4U, /* Set DSR */ + SDMMC_SelectCard = 7U, /* Select mmccard */ + SDMMC_SendCsd = 9U, /* Send CSD */ + SDMMC_SendCid = 10U, /* Send CID */ + SDMMC_StopTransmission = 12U, /* Stop Transmission */ + SDMMC_SendStatus = 13U, /* Send Status */ + SDMMC_GoInactiveState = 15U, /* Go Inactive State */ + SDMMC_SetBlockLength = 16U, /* Set Block Length */ + SDMMC_ReadSingleBlock = 17U, /* Read Single Block */ + SDMMC_ReadMultipleBlock = 18U, /* Read Multiple Block */ + SDMMC_SetBlockCount = 23U, /* Set Block Count */ + SDMMC_WriteSingleBlock = 24U, /* Write Single Block */ + SDMMC_WriteMultipleBlock = 25U, /* Write Multiple Block */ + SDMMC_ProgramCsd = 27U, /* Program CSD */ + SDMMC_SetWriteProtect = 28U, /* Set Write Protect */ + SDMMC_ClearWriteProtect = 29U, /* Clear Write Protect */ + SDMMC_SendWriteProtect = 30U, /* Send Write Protect */ + SDMMC_Erase = 38U, /* Erase */ + SDMMC_LockUnlock = 42U, /* Lock Unlock */ + SDMMC_ApplicationCommand = 55U, /* Send Application Command */ + SDMMC_GeneralCommand = 56U, /* General Purpose Command */ + SDMMC_ReadOcr = 58U, /* Read OCR */ +} sdmmc_command_t; + +/* SD card CSD register */ +typedef struct +{ + uint8_t csdStructure; /* CSD structure [127:126] */ + uint8_t dataReadAccessTime1; /* Data read access-time-1 [119:112] */ + uint8_t dataReadAccessTime2; /* Data read access-time-2 in clock cycles (NSAC*100) [111:104] */ + uint8_t transferSpeed; /* Maximum data transfer rate [103:96] */ + uint16_t cardCommandClass; /* Card command classes [95:84] */ + uint8_t readBlockLength; /* Maximum read data block length [83:80] */ + uint16_t flags; /* Flags in _sd_csd_flag */ + uint32_t deviceSize; /* Device size [73:62] */ + /* Following fields from 'readCurrentVddMin' to 'deviceSizeMultiplier' exist in CSD version 1 */ + uint8_t readCurrentVddMin; /* Maximum read current at VDD min [61:59] */ + uint8_t readCurrentVddMax; /* Maximum read current at VDD max [58:56] */ + uint8_t writeCurrentVddMin; /* Maximum write current at VDD min [55:53] */ + uint8_t writeCurrentVddMax; /* Maximum write current at VDD max [52:50] */ + uint8_t deviceSizeMultiplier; /* Device size multiplier [49:47] */ + + uint8_t eraseSectorSize; /* Erase sector size [45:39] */ + uint8_t writeProtectGroupSize; /* Write protect group size [38:32] */ + uint8_t writeSpeedFactor; /* Write speed factor [28:26] */ + uint8_t writeBlockLength; /* Maximum write data block length [25:22] */ + uint8_t fileFormat; /* File format [11:10] */ +} sd_csd_t; + +/* MMC card CSD register. */ +typedef struct _mmc_csd +{ + uint8_t csdStructureVersion; /* CSD structure [127:126] */ + uint8_t systemSpecificationVersion; /* System specification version [125:122] */ + uint8_t dataReadAccessTime1; /* Data read access-time 1 [119:112] */ + uint8_t dataReadAccessTime2; /* Data read access-time 2 in CLOCK cycles (NSAC*100) [111:104] */ + uint8_t transferSpeed; /* Max. bus clock frequency [103:96] */ + uint16_t cardCommandClass; /* card command classes [95:84] */ + uint8_t readBlockLength; /* Max. read data block length [83:80] */ + uint16_t flags; /* Contain flags in _mmc_csd_flag */ + uint16_t deviceSize; /* Device size [73:62] */ + uint8_t readCurrentVddMin; /* Max. read current @ VDD min [61:59] */ + uint8_t readCurrentVddMax; /* Max. read current @ VDD max [58:56] */ + uint8_t writeCurrentVddMin; /* Max. write current @ VDD min [55:53] */ + uint8_t writeCurrentVddMax; /* Max. write current @ VDD max [52:50] */ + uint8_t deviceSizeMultiplier; /* Device size multiplier [49:47] */ + uint8_t eraseGroupSize; /* Erase group size [46:42] */ + uint8_t eraseGroupSizeMultiplier; /* Erase group size multiplier [41:37] */ + uint8_t writeProtectGroupSize; /* Write protect group size [36:32] */ + uint8_t defaultEcc; /* Manufacturer default ECC [30:29] */ + uint8_t writeSpeedFactor; /* Write speed factor [28:26] */ + uint8_t maxWriteBlockLength; /* Max. write data block length [25:22] */ + uint8_t fileFormat; /* File format [11:10] */ + uint8_t eccCode; /* ECC code [9:8] */ +} mmc_csd_t; + +/* SD card SCR register flags */ +enum +{ + SD_ScrDataStatusAfterErase = (1U << 0U), /* Data status after erases [55:55] */ + SD_ScrSdSpecification3 = (1U << 1U), /* Specification version 3.00 or higher [47:47]*/ +}; + +/* SD card SCR register */ +typedef struct _sd_scr +{ + uint8_t scrStructure; /* SCR Structure [63:60] */ + uint8_t sdSpecification; /* SD memory card specification version [59:56] */ + uint16_t flags; /* SCR flags in _sd_scr_flag */ + uint8_t sdSecurity; /* Security specification supported [54:52] */ + uint8_t sdBusWidths; /* Data bus widths supported [51:48] */ + uint8_t commandSupport; /* Command support bits [33:32] 33-support CMD23, 32-support cmd20*/ + uint32_t reservedForManufacturer; /* reserved for manufacturer usage [31:0] */ +} sd_scr_t; + + +/* MMC card Extended CSD register (unit: byte). */ +typedef struct _mmc_extended_csd +{ + /*uint8_t SecureRemoveType;*/ /* secure removal type[16]*/ + /*uint8_t enProductStateAware;*/ /* product state awareness enablement[17]*/ + /*uint32_t maxPreLoadDataSize;*/ /* max preload data size[21-18]*/ + /*uint32_t preLoadDataSize;*/ /* pre-load data size[25-22]*/ + /*uint8_t ffuStatus;*/ /* FFU status [26]*/ + /*uint8_t modeOperationCode;*/ /* mode operation code[29]*/ + /*uint8_t modeConfig;*/ /* mode config [30]*/ + uint8_t cacheCtrl; /* control to turn on/off cache[33]*/ + /*uint8_t pwroffNotify;*/ /* power off notification[34]*/ + /*uint8_t packedCmdFailIndex;*/ /* packed cmd fail index [35]*/ + /*uint8_t packedCmdStatus;*/ /* packed cmd status[36]*/ + /*uint32_t contextConfig[4U];*/ /* context configuration[51-37]*/ + /*uint16_t extPartitionAttr;*/ /* extended partitions attribut[53-52]*/ + /*uint16_t exceptEventStatus;*/ /* exception events status[55-54]*/ + /*uint16_t exceptEventControl;*/ /* exception events control[57-56]*/ + /*uint8_t toReleaseAddressedGroup;*/ /* number of group to be released[58]*/ + /*uint8_t class6CmdCtrl;*/ /* class 6 command control[59]*/ + /*uint8_t intTimeoutEmu;*/ /* 1st initiallization after disabling sector size emu[60]*/ + /*uint8_t sectorSize;*/ /* sector size[61] */ + /*uint8_t sectorSizeEmu;*/ /* sector size emulation[62]*/ + /*uint8_t nativeSectorSize;*/ /* native sector size[63]*/ + /*uint8_t periodWakeup;*/ /* period wakeup [131]*/ + /*uint8_t tCASESupport;*/ /* package case temperature is controlled[132]*/ + /*uint8_t productionStateAware;*/ /* production state awareness[133]*/ + /*uint32_t enhanceUsrDataStartAddr;*/ /* enhanced user data start addr [139-136]*/ + /*uint32_t enhanceUsrDataSize;*/ /* enhanced user data area size[142-140]*/ + /*uint32_t generalPartitionSize[3];*/ /* general purpose partition size[154-143]*/ + uint8_t partitionAttribute; /* partition attribute [156]*/ + /*uint32_t maxEnhanceAreaSize;*/ /* max enhance area size [159-157]*/ + /*uint8_t hpiManagementEn;*/ /* HPI management [161]*/ + /*uint8_t writeReliabilityParameter;*/ /* write reliability parameter register[166] */ + /*uint8_t writeReliabilitySet;*/ /* write reliability setting register[167] */ + /*uint8_t rpmbSizeMult;*/ /* RPMB size multi [168]*/ + /*uint8_t fwConfig;*/ /* FW configuration[169]*/ + uint8_t userWP; /* user write protect register[171] */ + uint8_t bootPartitionWP; /* boot write protect register[173]*/ + uint8_t bootWPStatus; /* boot write protect status register[174]*/ + uint8_t highDensityEraseGroupDefinition; /* High-density erase group definition [175] */ + uint8_t bootDataBusConditions; /* Boot bus conditions [177] */ + uint8_t bootConfigProtect; /* Boot config protection [178]*/ + uint8_t partitionConfig; /* Boot configuration [179] */ + uint8_t eraseMemoryContent; /* Erased memory content [181] */ + uint8_t dataBusWidth; /* Data bus width mode [183] */ + uint8_t highSpeedTiming; /* High-speed interface timing [185] */ + uint8_t powerClass; /* Power class [187] */ + uint8_t commandSetRevision; /* Command set revision [189] */ + uint8_t commandSet; /* Command set [191] */ + uint8_t extendecCsdVersion; /* Extended CSD revision [192] */ + uint8_t csdStructureVersion; /* CSD structure version [194] */ + uint8_t cardType; /* Card Type [196] */ + uint8_t ioDriverStrength; /* IO driver strength [197] */ + /*uint8_t OutofInterruptBusyTiming;*/ /* out of interrupt busy timing [198] */ + uint8_t partitionSwitchTimeout; /* partition switch timing [199] */ + uint8_t powerClass52MHz195V; /* Power Class for 52MHz @ 1.95V [200] */ + uint8_t powerClass26MHz195V; /* Power Class for 26MHz @ 1.95V [201] */ + uint8_t powerClass52MHz360V; /* Power Class for 52MHz @ 3.6V [202] */ + uint8_t powerClass26MHz360V; /* Power Class for 26MHz @ 3.6V [203] */ + uint8_t minimumReadPerformance4Bit26MHz; /* Minimum Read Performance for 4bit at 26MHz [205] */ + uint8_t minimumWritePerformance4Bit26MHz; /* Minimum Write Performance for 4bit at 26MHz [206] */ + uint8_t minimumReadPerformance8Bit26MHz4Bit52MHz; + /* Minimum read Performance for 8bit at 26MHz/4bit @52MHz [207] */ + uint8_t minimumWritePerformance8Bit26MHz4Bit52MHz; + /* Minimum Write Performance for 8bit at 26MHz/4bit @52MHz [208] */ + uint8_t minimumReadPerformance8Bit52MHz; /* Minimum Read Performance for 8bit at 52MHz [209] */ + uint8_t minimumWritePerformance8Bit52MHz; /* Minimum Write Performance for 8bit at 52MHz [210] */ + uint32_t sectorCount; /* Sector Count [215:212] */ + /*uint8_t sleepNotificationTimeout;*/ /* sleep notification timeout [216]*/ + uint8_t sleepAwakeTimeout; /* Sleep/awake timeout [217] */ + /*uint8_t productionStateAwareTimeout;*/ /* Production state awareness timeout [218]*/ + uint8_t sleepCurrentVCCQ; /* Sleep current (VCCQ) [219] */ + uint8_t sleepCurrentVCC; /* Sleep current (VCC) [220] */ + uint8_t highCapacityWriteProtectGroupSize; /* High-capacity write protect group size [221] */ + uint8_t reliableWriteSectorCount; /* Reliable write sector count [222] */ + uint8_t highCapacityEraseTimeout; /* High-capacity erase timeout [223] */ + uint8_t highCapacityEraseUnitSize; /* High-capacity erase unit size [224] */ + uint8_t accessSize; /* Access size [225] */ + /*uint8_t secureTrimMultiplier;*/ /* secure trim multiplier[229]*/ + /*uint8_t secureEraseMultiplier;*/ /* secure erase multiplier[230]*/ + /*uint8_t secureFeatureSupport;*/ /* secure feature support[231]*/ + /*uint32_t trimMultiplier;*/ /* trim multiplier[232]*/ + uint8_t minReadPerformance8bitAt52MHZDDR; /* Minimum read performance for 8bit at DDR 52MHZ[234]*/ + uint8_t minWritePerformance8bitAt52MHZDDR; /* Minimum write performance for 8bit at DDR 52MHZ[235]*/ + uint8_t powerClass200MHZVCCQ130VVCC360V; /* power class for 200MHZ, at VCCQ= 1.3V,VCC=3.6V[236]*/ + uint8_t powerClass200MHZVCCQ195VVCC360V; /* power class for 200MHZ, at VCCQ= 1.95V,VCC=3.6V[237]*/ + uint8_t powerClass52MHZDDR195V; /* power class for 52MHZ,DDR at Vcc 1.95V[238]*/ + uint8_t powerClass52MHZDDR360V; /* power class for 52MHZ,DDR at Vcc 3.6V[239]*/ + /*uint8_t iniTimeoutAP;*/ /* 1st initialization time after partitioning[241]*/ + /*uint32_t correctPrgSectorNum;*/ /* correct prg sectors number[245-242]*/ + /*uint8_t bkOpsStatus;*/ /* background operations status[246]*/ + /*uint8_t powerOffNotifyTimeout;*/ /* power off notification timeout[247]*/ + uint32_t genericCMD6Timeout; /* generic CMD6 timeout[248]*/ + uint32_t cacheSize; /* cache size[252-249]*/ + uint8_t powerClass200MHZDDR360V; /* power class for 200MHZ, DDR at VCC=2.6V[253]*/ + /*uint32_t fwVer[2U];*/ /* fw VERSION [261-254]*/ + /*uint16_t deviceVer;*/ /* device version[263-262]*/ + /*uint8_t optimalTrimSize;*/ /* optimal trim size[264]*/ + /*uint8_t optimalWriteSize;*/ /* optimal write size[265]*/ + /*uint8_t optimalReadSize;*/ /* optimal read size[266]*/ + /*uint8_t preEolInfo;*/ /* pre EOL information[267]*/ + /*uint8_t deviceLifeTimeEstimationA;*/ /* device life time estimation typeA[268]*/ + /*uint8_t deviceLifeTimeEstimationB;*/ /* device life time estimation typeB[269]*/ + /*uint32_t correctPrgFWSectorNum;*/ /* number of FW sectors correctly programmed[305-302]*/ + /*uint32_t ffuArg;*/ /* FFU argument[490-487]*/ + /*uint8_t operationCodeTimeout;*/ /* operation code timeout[491]*/ + /*uint8_t supportMode;*/ /* support mode [493]*/ + uint8_t extPartitionSupport; /* extended partition attribute support[494]*/ + /*uint8_t largeUnitSize;*/ /* large unit size[495]*/ + /*uint8_t contextManageCap;*/ /* context management capability[496]*/ + /*uint8_t tagResourceSize;*/ /* tag resource size[497]*/ + /*uint8_t tagUnitSize;*/ /* tag unit size[498]*/ + /*uint8_t maxPackedWriteCmd;*/ /* max packed write cmd[500]*/ + /*uint8_t maxPackedReadCmd;*/ /* max packed read cmd[501]*/ + /*uint8_t hpiFeature;*/ /* HPI feature[503]*/ + uint8_t supportedCommandSet; /* Supported Command Sets [504] */ + /*uint8_t extSecurityCmdError;*/ /* extended security commands error[505]*/ +} mmc_extended_csd_t; + + +/* MMC card command set(COMMAND_SET in Extended CSD) */ +typedef enum +{ + MMC_CommandSetStandard = 0U, /*MMC Standard MMC */ + MMC_CommandSet1 = 1U, /*MMC Command set 1 */ + MMC_CommandSet2 = 2U, /*MMC Command set 2 */ + MMC_CommandSet3 = 3U, /*MMC Command set 3 */ + MMC_CommandSet4 = 4U, /*MMC Command set 4 */ +} mmc_command_set_t; + +/* Extended CSD register access mode(Access mode in CMD6). */ +typedef enum +{ + MMC_ExtendedCsdAccessModeCommandSet = 0U, /* MMC Command set related setting */ + MMC_ExtendedCsdAccessModeSetBits = 1U, /* MMC Set bits in specific byte in Extended CSD */ + MMC_ExtendedCsdAccessModeClearBits = 2U, /* MMC Clear bits in specific byte in Extended CSD */ + MMC_ExtendedCsdAccessModeWriteBits = 3U, /* MMC Write a value to specific byte in Extended CSD */ +} mmc_extended_csd_access_mode_t; + +/* EXT CSD byte index */ +typedef enum +{ + MMC_ExtendedCsdIndexFlushCache = 32U, /* flush cache */ + MMC_ExtendedCsdIndexCacheControl = 33U, /* cache control */ + MMC_ExtendedCsdIndexBootPartitionWP = 173U, /* Boot partition write protect */ + MMC_ExtendedCsdIndexEraseGroupDefinition = 175U, /* Erase Group Def */ + MMC_ExtendedCsdIndexBootBusConditions = 177U, /* Boot Bus conditions */ + MMC_ExtendedCsdIndexBootConfigWP = 178U, /* Boot config write protect */ + MMC_ExtendedCsdIndexPartitionConfig = 179U, /* Partition Config, before BOOT_CONFIG */ + MMC_ExtendedCsdIndexBusWidth = 183U, /* Bus Width */ + MMC_ExtendedCsdIndexHighSpeedTiming = 185U, /* High-speed Timing */ + MMC_ExtendedCsdIndexPowerClass = 187U, /* Power Class */ + MMC_ExtendedCsdIndexCommandSet = 191U, /* Command Set */ +} mmc_extended_csd_index_t; + +/* mmc driver strength */ +enum +{ + MMC_DriverStrength0 = 0U, /* Driver type0 ,nominal impedance 50ohm */ + MMC_DriverStrength1 = 1U, /* Driver type1 ,nominal impedance 33ohm */ + MMC_DriverStrength2 = 2U, /* Driver type2 ,nominal impedance 66ohm */ + MMC_DriverStrength3 = 3U, /* Driver type3 ,nominal impedance 100ohm */ + MMC_DriverStrength4 = 4U, /* Driver type4 ,nominal impedance 40ohm */ +}; + +/* The bit shift for COMMAND SET field in SWITCH command. */ +#define MMC_SWITCH_COMMAND_SET_SHIFT (0U) +/* The bit mask for COMMAND set field in SWITCH command. */ +#define MMC_SWITCH_COMMAND_SET_MASK (0x00000007U) +/* The bit shift for VALUE field in SWITCH command */ +#define MMC_SWITCH_VALUE_SHIFT (8U) +/* The bit mask for VALUE field in SWITCH command */ +#define MMC_SWITCH_VALUE_MASK (0x0000FF00U) +/* The bit shift for BYTE INDEX field in SWITCH command */ +#define MMC_SWITCH_BYTE_INDEX_SHIFT (16U) +/* The bit mask for BYTE INDEX field in SWITCH command */ +#define MMC_SWITCH_BYTE_INDEX_MASK (0x00FF0000U) +/* The bit shift for ACCESS MODE field in SWITCH command */ +#define MMC_SWITCH_ACCESS_MODE_SHIFT (24U) +/* The bit mask for ACCESS MODE field in SWITCH command */ +#define MMC_SWTICH_ACCESS_MODE_MASK (0x03000000U) + +/* Default block size */ +#define FSL_SDMMC_DEFAULT_BLOCK_SIZE (512U) + +/* MMC Extended CSD configuration. */ +typedef struct +{ + mmc_command_set_t commandSet; /* MMC Command set */ + uint8_t ByteValue; /* MMC The value to set */ + uint8_t ByteIndex; /* MMC The byte index in Extended CSD(mmc_extended_csd_index_t) */ + mmc_extended_csd_access_mode_t accessMode; /* MMC Access mode */ +} mmc_extended_csd_config_t; + +/* SD card command class */ +enum +{ + SD_CommandClassBasic = (1U << 0U), /* Card command class 0 */ + SD_CommandClassBlockRead = (1U << 2U), /* Card command class 2 */ + SD_CommandClassBlockWrite = (1U << 4U), /* Card command class 4 */ + SD_CommandClassErase = (1U << 5U), /* Card command class 5 */ + SD_CommandClassWriteProtect = (1U << 6U), /* Card command class 6 */ + SD_CommandClassLockCard = (1U << 7U), /* Card command class 7 */ + SD_CommandClassApplicationSpecific = (1U << 8U), /* Card command class 8 */ + SD_CommandClassInputOutputMode = (1U << 9U), /* Card command class 9 */ + SD_CommandClassSwitch = (1U << 10U), /* Card command class 10 */ +}; + +/* SD card specification version number */ +enum +{ + SD_SpecificationVersion1_0 = (1U << 0U), /* SD card version 1.0-1.01 */ + SD_SpecificationVersion1_1 = (1U << 1U), /* SD card version 1.10 */ + SD_SpecificationVersion2_0 = (1U << 2U), /* SD card version 2.00 */ + SD_SpecificationVersion3_0 = (1U << 3U), /* SD card version 3.0 */ +}; +/* dma mode */ +typedef enum +{ + SDMMC_NODMA = 0U, /* no use dma */ + SDMMC_SDMA = 1U, /* use sdma */ + SDMMC_ADMA = 2U, /* use adma */ +}sdmmc_dma_t; +/* SD card flags */ +enum +{ + SD_SupportHighCapacityFlag = (1U << 1U), /* Support high capacity */ + SD_Support4BitWidthFlag = (1U << 2U), /* Support 4-bit data width */ + SD_SupportSdhcFlag = (1U << 3U), /* Card is SDHC */ + SD_SupportSdxcFlag = (1U << 4U), /* Card is SDXC */ + SD_SupportVoltage180v = (1U << 5U), /* card support 1.8v voltage*/ + SD_SupportSetBlockCountCmd = (1U << 6U), /* card support cmd23 flag*/ + SD_SupportSpeedClassControlCmd = (1U << 7U), /* card support speed class control flag */ +}; +/* SD card individual commands */ +typedef enum +{ + SD_SendRelativeAddress = 3U, /* Send Relative Address */ + SD_Switch = 6U, /* Switch Function */ + SD_SendInterfaceCondition = 8U, /* Send Interface Condition */ + SD_VoltageSwitch = 11U, /* Voltage Switch */ + SD_SpeedClassControl = 20U, /* Speed Class control */ + SD_EraseWriteBlockStart = 32U, /* Write Block Start */ + SD_EraseWriteBlockEnd = 33U, /* Write Block End */ + SD_SendTuningBlock = 19U, /* Send Tuning Block */ +} sd_command_t; +#ifdef __cplusplus +} +#endif + +#endif /* __SDMMC_SPEC_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/src/mmc_host.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/src/mmc_host.c new file mode 100644 index 0000000000..ed49429a04 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/src/mmc_host.c @@ -0,0 +1,1272 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file mmc_host.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "mmc_host.h" + +static Status_card MMC_SendCardStatus(mmc_card_t* mmccard); +static void MMC_configSDMABufferSize(mmc_card_t *mmccard, uint32_t *buffer, uint32_t blockCount); +//static Status_card SD_SwitchFunction(mmc_card_t *mmccard,uint32_t mode); +static Status_card MMC_SetExtendedCsdConfig(mmc_card_t *mmccard, const mmc_extended_csd_config_t *config, uint32_t timeout); + +/* mmccard block erase time, varies according to different cards */ +#define MMC_BLOCKERASE_TIME (250U) + +uint32_t MMC_systick_timeoutms = 0; + +Status_card MMC_NormalCMD_Send(mmc_card_t* mmccard, uint32_t index,uint32_t argument,SDMMC_CardRspType responseType) +{ + Status_card status_temp; + + mmccard->command.index = index; + mmccard->command.argument = argument; + mmccard->command.type = CARD_CommandTypeNormal; + mmccard->command.responseType = responseType; + mmccard->command.flags = 0x00; + mmccard->command.responseErrorFlags = 0x00; + SDMMC_SendCommand(mmccard->SDHOSTx,&mmccard->command,&mmccard->TMODE_truct); + if(SDMMC_WaitCommandDone(mmccard->SDHOSTx,&mmccard->command,ENABLE) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + else + { + status_temp = Status_Success; + } + return status_temp; +} + + +Status_card MMC_AutoCMD_Send(mmc_card_t* mmccard, uint32_t index,uint32_t argument,SDMMC_CardRspType responseType) +{ + Status_card status_temp = Status_Success; + + /* CMD55 */ + mmccard->command.index = SDMMC_ApplicationCommand; + mmccard->command.argument = mmccard->mmc_card_information.rca << 16; + mmccard->command.type = CARD_CommandTypeNormal; + mmccard->command.responseType = CARD_ResponseTypeR1; + mmccard->command.flags = 0x00; + mmccard->command.responseErrorFlags = 0x00; + SDMMC_SendCommand(mmccard->SDHOSTx,&mmccard->command,&mmccard->TMODE_truct); + if(SDMMC_WaitCommandDone(mmccard->SDHOSTx,&mmccard->command,ENABLE) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + + mmccard->command.index = index; + mmccard->command.argument = argument; + mmccard->command.type = CARD_CommandTypeNormal; + mmccard->command.responseType = responseType; + mmccard->command.flags = 0x00; + mmccard->command.responseErrorFlags = 0x00; + SDMMC_SendCommand(mmccard->SDHOSTx,&mmccard->command,&mmccard->TMODE_truct); + if(SDMMC_WaitCommandDone(mmccard->SDHOSTx,&mmccard->command,ENABLE) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + + return status_temp; +} + + +void MMC_DecodeCid(mmc_card_t* mmccard) +{ + /* get cid */ + mmccard->mmc_card_information.cid.manufacturerID = (uint8_t)((mmccard->command.response[3U] & 0xFF000000U) >> 24U); + mmccard->mmc_card_information.cid.applicationID = (uint16_t)((mmccard->command.response[3U] & 0xFFFF00U) >> 8U); + + mmccard->mmc_card_information.cid.productName[0U] = (uint8_t)((mmccard->command.response[3U] & 0xFFU)); + mmccard->mmc_card_information.cid.productName[1U] = (uint8_t)((mmccard->command.response[2U] & 0xFF000000U) >> 24U); + mmccard->mmc_card_information.cid.productName[2U] = (uint8_t)((mmccard->command.response[2U] & 0xFF0000U) >> 16U); + mmccard->mmc_card_information.cid.productName[3U] = (uint8_t)((mmccard->command.response[2U] & 0xFF00U) >> 8U); + mmccard->mmc_card_information.cid.productName[4U] = (uint8_t)((mmccard->command.response[2U] & 0xFFU)); + mmccard->mmc_card_information.cid.productName[5U] = (uint8_t)((mmccard->command.response[1U] & 0xFF000000U) >> 24U); + + mmccard->mmc_card_information.cid.productVersion = (uint8_t)((mmccard->command.response[1U] & 0xFF000000U) >> 16U); + + mmccard->mmc_card_information.cid.productSerialNumber = (uint32_t)((mmccard->command.response[1U] & 0xFFFFU) << 16U); + mmccard->mmc_card_information.cid.productSerialNumber |= (uint32_t)((mmccard->command.response[0U] & 0xFFFF0000U) >> 16U); + + mmccard->mmc_card_information.cid.manufacturerData = (uint16_t)((mmccard->command.response[0U] & 0xFFF00U) >> 8U); +} + + +void MMC_DecodeCsd(mmc_card_t* mmccard) +{ + uint32_t multiplier; + + mmccard->mmc_card_information.csd.csdStructureVersion = (uint8_t)((mmccard->command.response[3U] & 0xC0000000U) >> 30U); + mmccard->mmc_card_information.csd.systemSpecificationVersion = (uint8_t)((mmccard->command.response[3U] & 0x3C0000000U) >> 26U); + mmccard->mmc_card_information.csd.dataReadAccessTime1 = (uint8_t)((mmccard->command.response[3U] & 0xFF0000U) >> 16U); + mmccard->mmc_card_information.csd.dataReadAccessTime2 = (uint8_t)((mmccard->command.response[3U] & 0xFF00U) >> 8U); + mmccard->mmc_card_information.csd.transferSpeed = (uint8_t)(mmccard->command.response[3U] & 0xFFU); + mmccard->mmc_card_information.csd.cardCommandClass = (uint16_t)((mmccard->command.response[2U] & 0xFFF00000U) >> 20U); + mmccard->mmc_card_information.csd.readBlockLength = (uint8_t)((mmccard->command.response[2U] & 0xF0000U) >> 16U); + if ((mmccard->command.response[2U] & 0x8000U) != 0U) + { + mmccard->mmc_card_information.csd.flags |= (uint16_t)MMC_CsdReadBlockPartialFlag; + } + if ((mmccard->command.response[2U] & 0x4000U) != 0U) + { + mmccard->mmc_card_information.csd.flags |= (uint16_t)MMC_CsdWriteBlockMisalignFlag; + } + if ((mmccard->command.response[2U] & 0x2000U) != 0U) + { + mmccard->mmc_card_information.csd.flags |= (uint16_t)MMC_CsdReadBlockMisalignFlag; + } + if ((mmccard->command.response[2U] & 0x1000U) != 0U) + { + mmccard->mmc_card_information.csd.flags |= (uint16_t)MMC_CsdDsrImplementedFlag; + } + + mmccard->mmc_card_information.csd.deviceSize = (uint16_t)(((mmccard->command.response[2U] & 0x3FFU) << 2U) + ((mmccard->command.response[1U] & 0xC0000000U) >> 30U)); + mmccard->mmc_card_information.csd.readCurrentVddMin = (uint8_t)((mmccard->command.response[1U] & 0x38000000U) >> 27U); + mmccard->mmc_card_information.csd.readCurrentVddMax = (uint8_t)((mmccard->command.response[1U] & 0x07000000U) >> 24U); + mmccard->mmc_card_information.csd.writeCurrentVddMin = (uint8_t)((mmccard->command.response[1U] & 0x00E00000U) >> 21U); + mmccard->mmc_card_information.csd.writeCurrentVddMax = (uint8_t)((mmccard->command.response[1U] & 0x001C0000U) >> 18U); + mmccard->mmc_card_information.csd.deviceSizeMultiplier = (uint8_t)((mmccard->command.response[1U] & 0x00038000U) >> 15U); + mmccard->mmc_card_information.csd.eraseGroupSize = (uint8_t)((mmccard->command.response[1U] & 0x00007C00U) >> 10U); + mmccard->mmc_card_information.csd.eraseGroupSizeMultiplier = (uint8_t)((mmccard->command.response[1U] & 0x000003E0U) >> 5U); + mmccard->mmc_card_information.csd.writeProtectGroupSize = (uint8_t)(mmccard->command.response[1U] & 0x0000001FU); + if ((mmccard->command.response[0U] & 0x80000000U) != 0U) + { + mmccard->mmc_card_information.csd.flags |= (uint16_t)MMC_CsdWriteProtectGroupEnabledFlag; + } + mmccard->mmc_card_information.csd.defaultEcc = (uint8_t)((mmccard->command.response[0U] & 0x60000000U) >> 29U); + mmccard->mmc_card_information.csd.writeSpeedFactor = (uint8_t)((mmccard->command.response[0U] & 0x1C000000U) >> 26U); + mmccard->mmc_card_information.csd.maxWriteBlockLength = (uint8_t)((mmccard->command.response[0U] & 0x03C00000U) >> 22U); + if ((mmccard->command.response[0U] & 0x00200000U) != 0U) + { + mmccard->mmc_card_information.csd.flags |= (uint16_t)MMC_CsdWriteBlockPartialFlag; + } + if ((mmccard->command.response[0U] & 0x00010000U) != 0U) + { + mmccard->mmc_card_information.csd.flags |= (uint16_t)MMC_ContentProtectApplicationFlag; + } + if ((mmccard->command.response[0U] & 0x00008000U) != 0U) + { + mmccard->mmc_card_information.csd.flags |= (uint16_t)MMC_CsdFileFormatGroupFlag; + } + if ((mmccard->command.response[0U] & 0x00004000U) != 0U) + { + mmccard->mmc_card_information.csd.flags |= (uint16_t)MMC_CsdCopyFlag; + } + if ((mmccard->command.response[0U] & 0x00002000U) != 0U) + { + mmccard->mmc_card_information.csd.flags |= (uint16_t)MMC_CsdPermanentWriteProtectFlag; + } + if ((mmccard->command.response[0U] & 0x00001000U) != 0U) + { + mmccard->mmc_card_information.csd.flags |= (uint16_t)MMC_CsdTemporaryWriteProtectFlag; + } + mmccard->mmc_card_information.csd.fileFormat = (uint8_t)((mmccard->command.response[0U] & 0x00000C00U) >> 10U); + mmccard->mmc_card_information.csd.eccCode = (uint8_t)((mmccard->command.response[0U] & 0x00000300U) >> 8U); + + /* Calculate the device total block count. */ + /* For the card capacity of witch higher than 2GB, the maximum possible value should be set to this register + is 0xFFF. */ + if (mmccard->mmc_card_information.csd.deviceSize != 0xFFFU) + { + multiplier = (2UL << (mmccard->mmc_card_information.csd.deviceSizeMultiplier + 2U - 1U)); + mmccard->mmc_card_information.userPartitionBlocks = (((mmccard->mmc_card_information.csd.deviceSize + 1UL) * multiplier) / FSL_SDMMC_DEFAULT_BLOCK_SIZE); + } + + mmccard->mmc_card_information.blockSize = FSL_SDMMC_DEFAULT_BLOCK_SIZE; +} + +static Status_card MMC_SendCardStatus(mmc_card_t* mmccard) +{ + Status_card status_temp; + uint32_t retry = MMC_CMD13_RETRY_TIMES; + while(retry != 0U) + { + /* CMD13 */ + if(MMC_NormalCMD_Send(mmccard,SDMMC_SendStatus,mmccard->mmc_card_information.rca << 16,CARD_ResponseTypeR1) != Status_Success) + { + if(SDMMC_GetPresentFlagStatus(mmccard->SDHOSTx,SDHOST_CommandInhibitFlag)) + { + SDMMC_SoftWareReset(mmccard->SDHOSTx,SDHOST_SOFTWARE_CMDLINE); + } + status_temp = Status_Fail; + retry--; + } + else + { + if(((mmccard->command.response[0] & SDMMC_MASK(SDMMC_R1ReadyForDataFlag)) != 0U) && + (SDMMC_R1_CURRENT_STATE(mmccard->command.response[0U]) != (uint32_t)SDMMC_R1StateProgram)) + { + status_temp = Status_CardStatusIdle; + } + else + { + status_temp = Status_CardStatusBusy; + } + break; + } + } + return status_temp; +} + +Status_card MMC_PollingCardStatusBusy(mmc_card_t* mmccard,uint32_t timeoutMs) +{ + uint32_t timeout_temp; + uint32_t timeout_cnt = 0; + bool cardBusy = false; + Status_card status_temp = Status_CardStatusBusy; + + MMC_SysTick_start_time(); + timeout_temp = MMC_systick_timeoutms; + while(timeout_cnt < timeoutMs) + { + if(SDMMC_GetPresentFlagStatus(mmccard->SDHOSTx,SDHOST_Data0LineLevelFlag) == SET) + { + cardBusy = false; + } + else + { + cardBusy = true; + } + + if (cardBusy == false) + { + status_temp = MMC_SendCardStatus(mmccard); + if (status_temp == Status_CardStatusIdle) + { + break; + } + } + + timeout_cnt = MMC_User_Time_Read(timeout_temp); + } + + if(SDMMC_GetFlagStatus(mmccard->SDHOSTx,SDHOST_DataCompleteFlag) == SET) + { + SDMMC_ClrFlag(mmccard->SDHOSTx,SDHOST_DataCompleteFlag); + } + + return status_temp; +} + +static Status_card MMC_SetExtendedCsdConfig(mmc_card_t *mmccard, const mmc_extended_csd_config_t *config, uint32_t timeout) +{ + Status_card status_temp; + uint32_t parameter = 0U; + uint32_t timeoutMS = timeout == 0U ? mmccard->mmc_card_information.extendedCsd.genericCMD6Timeout : timeout; + + parameter |= ((uint32_t)(config->commandSet) << MMC_SWITCH_COMMAND_SET_SHIFT); + parameter |= ((uint32_t)(config->ByteValue) << MMC_SWITCH_VALUE_SHIFT); + parameter |= ((uint32_t)(config->ByteIndex) << MMC_SWITCH_BYTE_INDEX_SHIFT); + parameter |= ((uint32_t)(config->accessMode) << MMC_SWITCH_ACCESS_MODE_SHIFT); + + /* CMD6 */ + if(MMC_NormalCMD_Send(mmccard,MMC_Switch,parameter,CARD_ResponseTypeR1b) != Status_Success) + { + return Status_Fail; + } + + /* Wait for the card write process complete because of that card read process and write process use one buffer. */ + status_temp = MMC_PollingCardStatusBusy(mmccard, timeoutMS == 0U ? MMC_CARD_ACCESS_WAIT_IDLE_TIMEOUT : timeoutMS); + if (Status_CardStatusIdle != status_temp) + { + return Status_PollingCardIdleFailed; + } + + return Status_Success; +} + +Status_card MMC_SetMaxEraseUnitSize(mmc_card_t* mmccard) +{ + uint32_t erase_group_size; + uint32_t erase_group_multiplier; + mmc_extended_csd_config_t extendedCsdconfig; + + /* Legacy mmc card , do not support the command */ + if ((mmccard->mmc_card_information.csd.systemSpecificationVersion == (uint32_t)MMC_SpecificationVersion3) && + (mmccard->mmc_card_information.csd.csdStructureVersion == (uint32_t)MMC_CsdStrucureVersion12)) + { + return Status_Success; + } + + if(((mmccard->mmc_card_information.flags & MMC_SupportHighCapacityFlag) == 0U) || + (mmccard->mmc_card_information.extendedCsd.highCapacityEraseUnitSize == 0U) || + (mmccard->mmc_card_information.extendedCsd.highCapacityEraseTimeout == 0U)) + { + erase_group_size = mmccard->mmc_card_information.csd.eraseGroupSize; + erase_group_multiplier = mmccard->mmc_card_information.csd.eraseGroupSizeMultiplier; + mmccard->mmc_card_information.eraseGroupBlocks = ((erase_group_size + 1U) * (erase_group_multiplier + 1U)); + } + else + { + /* Erase Unit Size = 512Kbyte * HC_ERASE_GRP_SIZE. Block size is 512 bytes. */ + mmccard->mmc_card_information.eraseGroupBlocks = (mmccard->mmc_card_information.extendedCsd.highCapacityEraseUnitSize * 1024UL); + + /* Enable high capacity erase unit size. */ + extendedCsdconfig.accessMode = MMC_ExtendedCsdAccessModeSetBits; + extendedCsdconfig.ByteIndex = (uint8_t)MMC_ExtendedCsdIndexEraseGroupDefinition; + extendedCsdconfig.ByteValue = 0x01U; /* The high capacity erase unit size enable bit is bit 0 */ + extendedCsdconfig.commandSet = MMC_CommandSetStandard; + if (Status_Success != MMC_SetExtendedCsdConfig(mmccard, &extendedCsdconfig, 0U)) + { + return Status_Fail; + } + } + + return Status_Success; +} + + + +Status_card MMC_SendExtCsd(mmc_card_t* mmccard) +{ + uint32_t card_ExtCsd[512/4]; + uint8_t* ExtCsd_temp; + SDMMC_Transfer transfer; + Status_card status_temp = Status_Success; + + /* Legacy mmc card , do not support the command */ + if ((mmccard->mmc_card_information.csd.systemSpecificationVersion == (uint32_t)MMC_SpecificationVersion3) && + (mmccard->mmc_card_information.csd.csdStructureVersion == (uint32_t)MMC_CsdStrucureVersion12)) + { + return status_temp; + } + + SDMMC_EnableFlagStatus(mmccard->SDHOSTx,SDHOST_DataErrorFlag | SDHOST_CommandErrorFlag,DISABLE); + + transfer.data.AutoCommand12_23 = NoAutoCommand; + transfer.data.enableIgnoreError = ENABLE; + transfer.data.dataType = SDHOST_TransferDataNormal; + transfer.data.blockCount = 1; + transfer.data.blockSize = 512; + transfer.data.rxData = card_ExtCsd; + transfer.data.txData = NULL; + + transfer.command.index = MMC_SendExtendedCsd; + transfer.command.argument = 0x00; + transfer.command.type = CARD_CommandTypeNormal; + transfer.command.responseType = CARD_ResponseTypeR1; + transfer.command.flags = 0x00; + transfer.command.responseErrorFlags = 0x00; + + if(SDMMC_TransferBlocking(mmccard->SDHOSTx,NULL,&transfer,&mmccard->TMODE_truct) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + + if(status_temp == Status_Success) + { + ExtCsd_temp = (uint8_t*)card_ExtCsd; + + /* Extended CSD is transferred as a data block from least byte indexed 0. */ + mmccard->mmc_card_information.extendedCsd.bootPartitionWP = ExtCsd_temp[173U]; + mmccard->mmc_card_information.extendedCsd.bootWPStatus = ExtCsd_temp[174U]; + mmccard->mmc_card_information.extendedCsd.highDensityEraseGroupDefinition = ExtCsd_temp[175U]; + mmccard->mmc_card_information.extendedCsd.bootDataBusConditions = ExtCsd_temp[177U]; + mmccard->mmc_card_information.extendedCsd.bootConfigProtect = ExtCsd_temp[178U]; + mmccard->mmc_card_information.extendedCsd.partitionConfig = ExtCsd_temp[179U]; + mmccard->mmc_card_information.extendedCsd.eraseMemoryContent = ExtCsd_temp[181U]; + mmccard->mmc_card_information.extendedCsd.dataBusWidth = ExtCsd_temp[183U]; + mmccard->mmc_card_information.extendedCsd.highSpeedTiming = ExtCsd_temp[185U]; + mmccard->mmc_card_information.extendedCsd.powerClass = ExtCsd_temp[187U]; + mmccard->mmc_card_information.extendedCsd.commandSetRevision = ExtCsd_temp[189U]; + mmccard->mmc_card_information.extendedCsd.commandSet = ExtCsd_temp[191U]; + mmccard->mmc_card_information.extendedCsd.extendecCsdVersion = ExtCsd_temp[192U]; + mmccard->mmc_card_information.extendedCsd.csdStructureVersion = ExtCsd_temp[194U]; + mmccard->mmc_card_information.extendedCsd.partitionAttribute = ExtCsd_temp[156U]; + mmccard->mmc_card_information.extendedCsd.extPartitionSupport = ExtCsd_temp[494U]; + mmccard->mmc_card_information.extendedCsd.cardType = ExtCsd_temp[196U]; + /* This field define the type of the card. The only currently valid values for this field are 0x01 and 0x03. */ + mmccard->mmc_card_information.flags |= mmccard->mmc_card_information.extendedCsd.cardType; + + mmccard->mmc_card_information.extendedCsd.ioDriverStrength = ExtCsd_temp[197U]; + + mmccard->mmc_card_information.extendedCsd.partitionSwitchTimeout = ExtCsd_temp[199U]; + mmccard->mmc_card_information.extendedCsd.powerClass52MHz195V = ExtCsd_temp[200U]; + mmccard->mmc_card_information.extendedCsd.powerClass26MHz195V = ExtCsd_temp[201U]; + mmccard->mmc_card_information.extendedCsd.powerClass52MHz360V = ExtCsd_temp[202U]; + mmccard->mmc_card_information.extendedCsd.powerClass26MHz360V = ExtCsd_temp[203U]; + mmccard->mmc_card_information.extendedCsd.powerClass200MHZVCCQ130VVCC360V = ExtCsd_temp[236U]; + mmccard->mmc_card_information.extendedCsd.powerClass200MHZVCCQ195VVCC360V = ExtCsd_temp[237U]; + mmccard->mmc_card_information.extendedCsd.powerClass52MHZDDR195V = ExtCsd_temp[238U]; + mmccard->mmc_card_information.extendedCsd.powerClass52MHZDDR360V = ExtCsd_temp[239U]; + mmccard->mmc_card_information.extendedCsd.powerClass200MHZDDR360V = ExtCsd_temp[253U]; + mmccard->mmc_card_information.extendedCsd.minimumReadPerformance4Bit26MHz = ExtCsd_temp[205U]; + mmccard->mmc_card_information.extendedCsd.minimumWritePerformance4Bit26MHz = ExtCsd_temp[206U]; + mmccard->mmc_card_information.extendedCsd.minimumReadPerformance8Bit26MHz4Bit52MHz = ExtCsd_temp[207U]; + mmccard->mmc_card_information.extendedCsd.minimumWritePerformance8Bit26MHz4Bit52MHz = ExtCsd_temp[208U]; + mmccard->mmc_card_information.extendedCsd.minimumReadPerformance8Bit52MHz = ExtCsd_temp[209U]; + mmccard->mmc_card_information.extendedCsd.minimumWritePerformance8Bit52MHz = ExtCsd_temp[210U]; + mmccard->mmc_card_information.extendedCsd.minReadPerformance8bitAt52MHZDDR = ExtCsd_temp[234U]; + mmccard->mmc_card_information.extendedCsd.minWritePerformance8bitAt52MHZDDR = ExtCsd_temp[235U]; + /* Get user partition size. */ + mmccard->mmc_card_information.extendedCsd.sectorCount = ((((uint32_t)ExtCsd_temp[215U]) << 24U) + (((uint32_t)ExtCsd_temp[214U]) << 16U) + + (((uint32_t)ExtCsd_temp[213U]) << 8U) + (uint32_t)ExtCsd_temp[212U]); + if ((mmccard->mmc_card_information.flags & (uint32_t)MMC_SupportHighCapacityFlag) != 0U) + { + mmccard->mmc_card_information.userPartitionBlocks = mmccard->mmc_card_information.extendedCsd.sectorCount; + } + + mmccard->mmc_card_information.extendedCsd.sleepAwakeTimeout = ExtCsd_temp[217U]; + mmccard->mmc_card_information.extendedCsd.sleepCurrentVCCQ = ExtCsd_temp[219U]; + mmccard->mmc_card_information.extendedCsd.sleepCurrentVCC = ExtCsd_temp[220U]; + mmccard->mmc_card_information.extendedCsd.highCapacityWriteProtectGroupSize = ExtCsd_temp[221U]; + mmccard->mmc_card_information.extendedCsd.reliableWriteSectorCount = ExtCsd_temp[222U]; + mmccard->mmc_card_information.extendedCsd.highCapacityEraseTimeout = ExtCsd_temp[223U]; + mmccard->mmc_card_information.extendedCsd.highCapacityEraseUnitSize = ExtCsd_temp[224U]; + mmccard->mmc_card_information.extendedCsd.accessSize = ExtCsd_temp[225U]; + + /* Get boot partition size: 128KB * BOOT_SIZE_MULT*/ + mmccard->mmc_card_information.bootPartitionBlocks = ((128U * 1024U * ExtCsd_temp[226U]) / FSL_SDMMC_DEFAULT_BLOCK_SIZE); + + /* support HS400 data strobe */ + if (ExtCsd_temp[184] == 1U) + { + mmccard->mmc_card_information.flags |= (uint32_t)MMC_SupportEnhanceHS400StrobeFlag; + } + + /* Check if card support boot mode. */ + if ((ExtCsd_temp[228U] & 0x1U) != 0U) + { + mmccard->mmc_card_information.flags |= (uint32_t)MMC_SupportAlternateBootFlag; + } + else if ((ExtCsd_temp[228U] & 0x2U) != 0U) + { + mmccard->mmc_card_information.flags |= (uint32_t)MMC_SupportDDRBootFlag; + } + else if ((ExtCsd_temp[228U] & 0x4U) != 0U) + { + mmccard->mmc_card_information.flags |= (uint32_t)MMC_SupportHighSpeedBootFlag; + } + else + { + /* empty with intentional */ + } + /* cache size unit 1kb */ + mmccard->mmc_card_information.extendedCsd.cacheSize = (((uint32_t)ExtCsd_temp[252U]) << 24) | (((uint32_t)ExtCsd_temp[251U]) << 16) | + (((uint32_t)ExtCsd_temp[250U]) << 8) | (((uint32_t)ExtCsd_temp[249U])); + + mmccard->mmc_card_information.extendedCsd.genericCMD6Timeout = ExtCsd_temp[248U] * 10UL; + mmccard->mmc_card_information.extendedCsd.supportedCommandSet = ExtCsd_temp[504U]; + + + status_temp = Status_Success; + } + SDMMC_EnableFlagStatus(mmccard->SDHOSTx,SDHOST_DataErrorFlag | SDHOST_CommandErrorFlag,ENABLE); + + return status_temp; +} + +static Status_card MMC_CheckEraseGroupRange(mmc_card_t *mmccard, uint32_t startGroup, uint32_t endGroup) +{ + Status_card status_temp = Status_Success; + uint32_t partitionBlocks; + uint32_t eraseGroupBoundary; + + partitionBlocks = mmccard->mmc_card_information.userPartitionBlocks; + + /* Check if current partition's total block count is integer multiples of the erase group size. */ + if ((partitionBlocks % mmccard->mmc_card_information.eraseGroupBlocks) == 0U) + { + eraseGroupBoundary = (partitionBlocks / mmccard->mmc_card_information.eraseGroupBlocks); + } + else + { + /* mmccard will ignore the unavailable blocks within the last erase group automatically. */ + eraseGroupBoundary = (partitionBlocks / mmccard->mmc_card_information.eraseGroupBlocks + 1U); + } + + /* Check if the group range accessed is within current partition's erase group boundary. */ + if ((startGroup > eraseGroupBoundary) || (endGroup > eraseGroupBoundary)) + { + status_temp = Status_CardOutOfRange; + } + + return status_temp; +} + + +Status_card MMC_EraseGroups(mmc_card_t* mmccard, uint32_t startGroup, uint32_t endGroup) +{ + uint32_t startGroupAddress; + uint32_t endGroupAddress; + Status_card status_temp = Status_CardStatusBusy; + uint32_t timeout_value = MMC_CARD_ACCESS_WAIT_IDLE_TIMEOUT; + + status_temp = MMC_CheckEraseGroupRange(mmccard, startGroup, endGroup); + if(status_temp != Status_Success) + { + status_temp = Status_CardOutOfRange; + } + else + { + /* polling mmccard status idle */ + status_temp = MMC_PollingCardStatusBusy(mmccard, MMC_CARD_ACCESS_WAIT_IDLE_TIMEOUT); + if (Status_CardStatusIdle != status_temp) + { + status_temp = Status_PollingCardIdleFailed; + } + } + + if(status_temp == Status_CardStatusIdle) + { + /* Calculate the start group address and end group address */ + startGroupAddress = startGroup; + endGroupAddress = endGroup; + if ((mmccard->mmc_card_information.flags & (uint32_t)MMC_SupportHighCapacityFlag) != 0U) + { + /* The implementation of a higher than 2GB of density of memory will not be backwards compatible with the + lower densities.First of all the address argument for higher than 2GB of density of memory is changed to + be sector address (512B sectors) instead of byte address */ + startGroupAddress = (startGroupAddress * (mmccard->mmc_card_information.eraseGroupBlocks)); + endGroupAddress = (endGroupAddress * (mmccard->mmc_card_information.eraseGroupBlocks)); + } + else + { + /* The address unit is byte when card capacity is lower than 2GB */ + startGroupAddress = (startGroupAddress * (mmccard->mmc_card_information.eraseGroupBlocks) * FSL_SDMMC_DEFAULT_BLOCK_SIZE); + endGroupAddress = (endGroupAddress * (mmccard->mmc_card_information.eraseGroupBlocks) * FSL_SDMMC_DEFAULT_BLOCK_SIZE); + } + + /* CMD35 */ + if(MMC_NormalCMD_Send(mmccard,MMC_EraseGroupStart,startGroupAddress,CARD_ResponseTypeR1) != Status_Success) + { + return Status_Fail; + } + + /* CMD36 */ + if(MMC_NormalCMD_Send(mmccard,MMC_EraseGroupEnd,endGroupAddress,CARD_ResponseTypeR1) != Status_Success) + { + return Status_Fail; + } + + /* CMD38 */ + if(MMC_NormalCMD_Send(mmccard,SDMMC_Erase,0x00,CARD_ResponseTypeR1b) != Status_Success) + { + return Status_Fail; + } + + if ((0U != (mmccard->mmc_card_information.flags & (uint32_t)MMC_SupportHighCapacityFlag)) && + (mmccard->mmc_card_information.extendedCsd.highCapacityEraseTimeout != 0U)) + { + timeout_value = + (uint32_t)mmccard->mmc_card_information.extendedCsd.highCapacityEraseTimeout * 300U * (endGroup - startGroup + 1U); + } + + status_temp = MMC_PollingCardStatusBusy(mmccard, timeout_value); + if (Status_CardStatusIdle != status_temp) + { + status_temp = Status_PollingCardIdleFailed; + } + else + { + status_temp = Status_Success; + } + } + + return status_temp; +} + + +static void MMC_configSDMABufferSize(mmc_card_t *mmccard, uint32_t *buffer, uint32_t blockCount) +{ + SDHOST_SDMA_Buffer_Size Size; + uint32_t address = (uint32_t)buffer; + + if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x1000) <= 0x1000) + { + Size = SDHOST_SDMABUFFERSIZE_4KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x2000) <= 0x2000) + { + Size = SDHOST_SDMABUFFERSIZE_8KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x4000) <= 0x4000) + { + Size = SDHOST_SDMABUFFERSIZE_16KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x8000) <= 0x8000) + { + Size = SDHOST_SDMABUFFERSIZE_32KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x10000) <= 0x10000) + { + Size = SDHOST_SDMABUFFERSIZE_64KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x20000) <= 0x20000) + { + Size = SDHOST_SDMABUFFERSIZE_128KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x40000) <= 0x40000) + { + Size = SDHOST_SDMABUFFERSIZE_256KB; + } + else + { + Size = SDHOST_SDMABUFFERSIZE_512KB; + } + SDMMC_ConfigSDMABufferSize(mmccard->SDHOSTx,Size); +} + +Status_card MMC_ReadBlocks(mmc_card_t *mmccard, uint32_t *buffer, uint32_t startBlock, uint32_t blockCount) +{ + SDMMC_Transfer transfer; + SDHOST_ADMAconfig dmaConfigtemp; + SDHOST_ADMAconfig *dmaConfig; + Status_card status_temp; + + if(startBlock + blockCount > mmccard->mmc_card_information.userPartitionBlocks) + { + return Status_CardOutOfRange; + } + + /* polling mmccard status idle */ + status_temp = MMC_PollingCardStatusBusy(mmccard, MMC_CARD_ACCESS_WAIT_IDLE_TIMEOUT); + if (Status_CardStatusIdle != status_temp) + { + return Status_PollingCardIdleFailed; + } + + if(mmccard->card_workmode.dma == SDMMC_NODMA) + { + dmaConfig = NULL; + } + else if(mmccard->card_workmode.dma == SDMMC_SDMA) + { + dmaConfig = &dmaConfigtemp; + dmaConfig->dmaMode = DmaModeSimple; + dmaConfig->admaTable = NULL; + dmaConfig->admaTableWords = 0; + MMC_configSDMABufferSize(mmccard,buffer,blockCount); + } + else //ADMA + { + dmaConfig = &dmaConfigtemp; + dmaConfig->dmaMode = DmaModeAdma2; + dmaConfig->admaTable = buffer; + dmaConfig->admaTableWords = (*buffer & 0xFFFF0000) >> 16; + } + + transfer.data.enableIgnoreError = ENABLE; + transfer.data.dataType = SDHOST_TransferDataNormal; + transfer.data.blockCount = blockCount; + transfer.data.blockSize = FSL_SDMMC_DEFAULT_BLOCK_SIZE; + transfer.data.rxData = buffer; + transfer.data.txData = NULL; + + if(blockCount <= 1) + { + transfer.command.index = SDMMC_ReadSingleBlock; + transfer.data.AutoCommand12_23 = NoAutoCommand; + } + else + { + transfer.command.index = SDMMC_ReadMultipleBlock; + transfer.data.AutoCommand12_23 = AutoCommand12; + } + transfer.command.argument = startBlock; + transfer.command.type = CARD_CommandTypeNormal; + transfer.command.responseType = CARD_ResponseTypeR1; + transfer.command.flags = 0x00; + transfer.command.responseErrorFlags = 0x00; + + if(SDMMC_TransferBlocking(mmccard->SDHOSTx,dmaConfig,&transfer,&mmccard->TMODE_truct) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + else + { + status_temp = Status_Success; + } + + return status_temp; +} + + +Status_card MMC_WriteBlocks(mmc_card_t *mmccard, uint32_t *buffer, uint32_t startBlock, uint32_t blockCount) +{ + SDMMC_Transfer transfer; + SDHOST_ADMAconfig *dmaConfig; + SDHOST_ADMAconfig dmaConfigtemp; + Status_card status_temp; + + if(startBlock + blockCount > mmccard->mmc_card_information.userPartitionBlocks) + { + return Status_CardOutOfRange; + } + + /* polling mmccard status idle */ + status_temp = MMC_PollingCardStatusBusy(mmccard, MMC_CARD_ACCESS_WAIT_IDLE_TIMEOUT); + if (Status_CardStatusIdle != status_temp) + { + return Status_PollingCardIdleFailed; + } + + if(mmccard->card_workmode.dma == SDMMC_NODMA) + { + dmaConfig = NULL; + } + else if(mmccard->card_workmode.dma == SDMMC_SDMA) + { + dmaConfig = &dmaConfigtemp; + dmaConfig->dmaMode = DmaModeSimple; + dmaConfig->admaTable = NULL; + dmaConfig->admaTableWords = 0; + MMC_configSDMABufferSize(mmccard,buffer,blockCount); + } + else //ADMA + { + dmaConfig = &dmaConfigtemp; + dmaConfig->dmaMode = DmaModeAdma2; + dmaConfig->admaTable = buffer; + dmaConfig->admaTableWords = (*buffer & 0xFFFF0000) >> 16; + } + transfer.data.enableIgnoreError = ENABLE; + transfer.data.dataType = SDHOST_TransferDataNormal; + transfer.data.blockCount = blockCount; + transfer.data.blockSize = FSL_SDMMC_DEFAULT_BLOCK_SIZE; + transfer.data.rxData = NULL; + transfer.data.txData = buffer; + + if(blockCount <= 1) + { + transfer.command.index = SDMMC_WriteSingleBlock; + transfer.data.AutoCommand12_23 = NoAutoCommand; + } + else + { + transfer.command.index = SDMMC_WriteMultipleBlock; + transfer.data.AutoCommand12_23 = AutoCommand12; + } + transfer.command.argument = startBlock; + transfer.command.type = CARD_CommandTypeNormal; + transfer.command.responseType = CARD_ResponseTypeR1; + transfer.command.flags = 0x00; + transfer.command.responseErrorFlags = 0x00; + + if(SDMMC_TransferBlocking(mmccard->SDHOSTx,dmaConfig,&transfer,&mmccard->TMODE_truct) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + else + { + status_temp = Status_Success; + } + + return status_temp; +} + + +Status_card MMC_SwitchVoltage(mmc_card_t *mmccard) +{ + Status_card status_temp = Status_Success; + uint32_t Mscnt_value; + uint32_t Mscnt_temp; + if((mmccard->mmc_card_information.flags & SD_SupportVoltage180v) != SD_SupportVoltage180v) + { + status_temp = Status_CardNotSupportYet; + } + + /* CMD11 */ + else if(MMC_NormalCMD_Send(mmccard,SD_VoltageSwitch,0x00,CARD_ResponseTypeR1) != Status_Success) + { + status_temp = Status_Fail; + } + else + { + SDMMC_EnableSDCLK(mmccard->SDHOSTx,DISABLE); + /* delay 5ms */ + Mscnt_value = 0; + MMC_SysTick_start_time(); + Mscnt_temp = MMC_systick_timeoutms; + while(Mscnt_value<1) + { + Mscnt_value = MMC_User_Time_Read(Mscnt_temp); + } + + + if(SDMMC_GetPresentFlagStatus(mmccard->SDHOSTx,(SDHOST_Data0LineLevelFlag | SDHOST_Data1LineLevelFlag | + SDHOST_Data2LineLevelFlag | SDHOST_Data3LineLevelFlag)) == SET) + { + status_temp = Status_Fail; + return status_temp; + } + + SDMMC_EnableVolSwitch(mmccard->SDHOSTx,ENABLE); + /* delay 5ms */ + Mscnt_value = 0; + MMC_SysTick_start_time(); + Mscnt_temp = MMC_systick_timeoutms; + while(Mscnt_value<5) + { + Mscnt_value = MMC_User_Time_Read(Mscnt_temp); + } + + if((mmccard->SDHOSTx->CTRLSTS & SDHOST_CTRLSTS_V18SE) != SDHOST_CTRLSTS_V18SE) + { + status_temp = Status_Fail; + } + else + { + SDMMC_EnableSDCLK(mmccard->SDHOSTx,ENABLE);; + /* Wait until the clock is stable. */ + SDMMC_WaitSDCLKStable(mmccard->SDHOSTx); + + /* delay 1ms */ + Mscnt_value = 0; + MMC_SysTick_start_time(); + Mscnt_temp = MMC_systick_timeoutms; + while(Mscnt_value<1) + { + Mscnt_value = MMC_User_Time_Read(Mscnt_temp); + } + + if(SDMMC_GetPresentFlagStatus(mmccard->SDHOSTx,(SDHOST_Data0LineLevelFlag | SDHOST_Data1LineLevelFlag | + SDHOST_Data2LineLevelFlag | SDHOST_Data3LineLevelFlag)) != SET) + { + status_temp = Status_Fail; + } + } + } + return status_temp; +} + + +//static Status_card SD_SwitchFunction(mmc_card_t *mmccard,uint32_t mode) +//{ +// uint32_t card_scr[16]; +// uint32_t cnt_value; +// SDMMC_Transfer transfer; +// Status_card status_temp = Status_Success; +// +// if(mode > 2) +// { +// mode = mode - 2; +// } + +// SDMMC_EnableFlagStatus(mmccard->SDHOSTx,SDHOST_DataErrorFlag | SDHOST_CommandErrorFlag,DISABLE); +// +// transfer.data.AutoCommand12_23 = NoAutoCommand; +// transfer.data.enableIgnoreError = DISABLE; +// transfer.data.dataType = SDHOST_TransferDataNormal; +// transfer.data.blockCount = 1; +// transfer.data.blockSize = 64; +// transfer.data.rxData = card_scr; +// transfer.data.txData = NULL; + +// transfer.command.index = SD_Switch; +// transfer.command.argument = (0x00fffff0U | mode); +// transfer.command.type = CARD_CommandTypeNormal; +// transfer.command.responseType = CARD_ResponseTypeR1; +// transfer.command.flags = 0x00; +// transfer.command.responseErrorFlags = 0x00; +// +// if(SDMMC_TransferBlocking(mmccard->SDHOSTx,NULL,&transfer,&mmccard->TMODE_truct) != SDMMC_SUCCESS) +// { +// status_temp = Status_Fail; +// } +// +// if(status_temp == Status_Success) +// { +// for(cnt_value = 0;cnt_value< 16; cnt_value++) +// { +// card_scr[cnt_value] = swap_uint32(card_scr[cnt_value]); +// } +// +// /* -card_scr[0U]---bit511~bit480; +// -card_scr[1U]---bit479~bit448; +// -card_scr[2U]---bit447~bit416; +// -card_scr[3U]---bit415~bit384; +// -card_scr[4U]---bit383~bit352; +// According to the "switch function status[bits 511~0]" return by switch command in mode "check function": +// -Check if function 1(high speed) in function group 1 is supported by checking if bit 401 is set; +// -check if function 1 is ready and can be switched by checking if bits 379~376 equal value 1; +// */ +// if((((card_scr[3] >> 16) & (1 << mode)) == 0) || (((card_scr[4] & 0x0F000000) >> 24) != mode)) +// { +// log_info("\r\nError: current mmccard not support function %d\r\n", mode); +// status_temp = Status_CardNotSupportYet; +// } +// } +// +// if(status_temp == Status_Success) +// { +// transfer.command.argument = (0x80fffff0U | mode); +// if(SDMMC_TransferBlocking(mmccard->SDHOSTx,NULL,&transfer,&mmccard->TMODE_truct) != SDMMC_SUCCESS) +// { +// status_temp = Status_Fail; +// } +// +// if(status_temp == Status_Success) +// { +// for(cnt_value = 0;cnt_value< 16; cnt_value++) +// { +// card_scr[cnt_value] = swap_uint32(card_scr[cnt_value]); +// } +// +// /* According to the "switch function status[bits 511~0]" return by switch command in mode "set function": +// -check if group 1 is successfully changed to function 1 by checking if bits 379~376 equal value 1; +// */ +// if(((card_scr[4] & 0x0F000000) >> 24) != mode) +// { +// log_info("\r\nError: switch to function %d failed\r\n", mode); +// status_temp = Status_CardSwitchFailed; +// } +// } +// } +// +// SDMMC_EnableFlagStatus(mmccard->SDHOSTx,SDHOST_DataErrorFlag | SDHOST_CommandErrorFlag,ENABLE); +// return status_temp; +//} + + +static Status_card MMC_SetMaxDataBusWidth(mmc_card_t *mmccard) +{ + Status_card status_temp = Status_Success; + mmc_extended_csd_config_t extendedCsdconfig; + + extendedCsdconfig.accessMode = MMC_ExtendedCsdAccessModeWriteBits; + extendedCsdconfig.ByteIndex = (uint8_t)MMC_ExtendedCsdIndexBusWidth; + extendedCsdconfig.ByteValue = (uint8_t)MMC_DataBusWidth8bitDDR; + extendedCsdconfig.commandSet = MMC_CommandSetStandard; + + if (mmccard->card_workmode.busWidth == MMC_DataBusWidth8bitDDR) + { + if(0U != (mmccard->mmc_card_information.flags & ((uint32_t)MMC_SupportHighSpeedDDR52MHZ180V300VFlag | + (uint32_t)MMC_SupportHighSpeedDDR52MHZ120VFlag))) + { + /* Set data bus width */ + extendedCsdconfig.ByteValue = (uint8_t)MMC_DataBusWidth8bitDDR; + if(MMC_SetExtendedCsdConfig(mmccard,&extendedCsdconfig, 0U) != Status_Success) + { + status_temp = Status_Fail; + } + else + { + SDMMC_ConfigBusWidth(mmccard->SDHOSTx, SDHOST_DataBusWidth8Bit); + status_temp = Status_Success; + mmccard->mmc_card_information.extendedCsd.dataBusWidth = MMC_DataBusWidth8bitDDR; + } + } + else + { + status_temp = Status_CardNotSupportYet; + } + } + + if (mmccard->card_workmode.busWidth == MMC_DataBusWidth4bitDDR) + { + if(0U != (mmccard->mmc_card_information.flags & ((uint32_t)MMC_SupportHighSpeedDDR52MHZ180V300VFlag | + (uint32_t)MMC_SupportHighSpeedDDR52MHZ120VFlag))) + { + /* Set data bus width */ + extendedCsdconfig.ByteValue = (uint8_t)MMC_DataBusWidth4bitDDR; + if(MMC_SetExtendedCsdConfig(mmccard,&extendedCsdconfig, 0U) != Status_Success) + { + status_temp = Status_Fail; + } + else + { + SDMMC_ConfigBusWidth(mmccard->SDHOSTx, SDHOST_DataBusWidth4Bit); + status_temp = Status_Success; + mmccard->mmc_card_information.extendedCsd.dataBusWidth = MMC_DataBusWidth4bitDDR; + } + } + else + { + status_temp = Status_CardNotSupportYet; + } + } + + if (mmccard->card_workmode.busWidth == MMC_DataBusWidth8bit) + { + /* Set data bus width */ + extendedCsdconfig.ByteValue = (uint8_t)MMC_DataBusWidth8bit; + if(MMC_SetExtendedCsdConfig(mmccard,&extendedCsdconfig, 0U) != Status_Success) + { + status_temp = Status_Fail; + } + else + { + SDMMC_ConfigBusWidth(mmccard->SDHOSTx, SDHOST_DataBusWidth8Bit); + status_temp = Status_Success; + mmccard->mmc_card_information.extendedCsd.dataBusWidth = MMC_DataBusWidth8bit; + } + } + + if (mmccard->card_workmode.busWidth == MMC_DataBusWidth4bit) + { + /* Set data bus width */ + extendedCsdconfig.ByteValue = (uint8_t)MMC_DataBusWidth4bit; + if(MMC_SetExtendedCsdConfig(mmccard,&extendedCsdconfig, 0U) != Status_Success) + { + status_temp = Status_Fail; + } + else + { + SDMMC_ConfigBusWidth(mmccard->SDHOSTx, SDHOST_DataBusWidth4Bit); + status_temp = Status_Success; + mmccard->mmc_card_information.extendedCsd.dataBusWidth = MMC_DataBusWidth4bit; + } + } + + return status_temp; +} + + +static Status_card MMC_SwitchHSTiming(mmc_card_t *mmccard, uint8_t timing, uint8_t driverStrength) +{ + uint8_t hsTiming = 0; + + mmc_extended_csd_config_t extendedCsdconfig; + + /* check the target driver strength support or not */ + if (((mmccard->mmc_card_information.extendedCsd.ioDriverStrength & (1U << driverStrength)) == 0U) && + (mmccard->mmc_card_information.extendedCsd.extendecCsdVersion >= (uint8_t)MMC_ExtendedCsdRevision16)) + { + return Status_CardNotSupportYet; + } + /* calucate the register value */ + hsTiming = (timing & 0xFU) | (uint8_t)(driverStrength << 4U); + + /* Switch to high speed timing. */ + extendedCsdconfig.accessMode = MMC_ExtendedCsdAccessModeWriteBits; + extendedCsdconfig.ByteIndex = (uint8_t)MMC_ExtendedCsdIndexHighSpeedTiming; + extendedCsdconfig.ByteValue = hsTiming; + extendedCsdconfig.commandSet = MMC_CommandSetStandard; + if (Status_Success != MMC_SetExtendedCsdConfig(mmccard, &extendedCsdconfig, 0U)) + { + return Status_Fail; + } + + mmccard->mmc_card_information.extendedCsd.highSpeedTiming = hsTiming; + + return Status_Success; +} + +static Status_card MMC_SwitchToHS200(mmc_card_t *mmccard) +{ + Status_card status_temp = Status_Fail; + + /* select bus width before select bus timing for HS200 mode */ + if (MMC_SetMaxDataBusWidth(mmccard) != Status_Success) + { + return Status_Fail; + } + + /* switch to HS200 mode */ + if (Status_Success != MMC_SwitchHSTiming(mmccard, (uint8_t)MMC_HighSpeed200Timing, MMC_DriverStrength0)) + { + return Status_Fail; + } + + SDMMC_ConfigWorkMode(mmccard->SDHOSTx,SDMMC_SDR104); + + +// card->busClock_Hz = SDMMCHOST_SetCardClock(card->host, freq); +// /* config io speed and strength */ +// if (card->usrParam.ioStrength != NULL) +// { +// card->usrParam.ioStrength(freq); +// } + +// /* excute tuning for HS200 */ +// if (MMC_ExecuteTuning(card) != kStatus_Success) +// { +// return kStatus_SDMMC_TuningFail; +// } + + status_temp = MMC_PollingCardStatusBusy(mmccard, MMC_CARD_ACCESS_WAIT_IDLE_TIMEOUT); + if (Status_CardStatusIdle != status_temp) + { + return Status_Fail; + } + + return Status_Success; +} + +static Status_card MMC_SwitchToHighSpeed(mmc_card_t *mmccard) +{ +// uint32_t freq = 0U; + + if (Status_Success != MMC_SwitchHSTiming(mmccard, (uint8_t)MMC_HighSpeedTiming, MMC_DriverStrength0)) + { + return Status_Fail; + } + +// if ((mmccard->mmc_card_information.flags & (uint32_t)MMC_SupportHighSpeed52MHZFlag) != 0U) +// { +// freq = FSL_SDMMC_CARD_MAX_BUS_FREQ(card->usrParam.maxFreq, MMC_CLOCK_52MHZ); +// } +// else if ((card->flags & (uint32_t)kMMC_SupportHighSpeed26MHZFlag) != 0U) +// { +// freq = FSL_SDMMC_CARD_MAX_BUS_FREQ(card->usrParam.maxFreq, MMC_CLOCK_26MHZ); +// } +// else +// { +// /* Intentional empty */ +// } + +// card->busClock_Hz = SDMMCHOST_SetCardClock(card->host, freq); +// /* config io speed and strength */ +// if (card->usrParam.ioStrength != NULL) +// { +// card->usrParam.ioStrength(MMC_CLOCK_52MHZ); +// } + + /* Set card data width, it is nessesary to config the the data bus here, to meet emmc5.0 specification, + * when you are working in DDR mode , HS_TIMING must set before set bus width + */ + if (MMC_SetMaxDataBusWidth(mmccard) != Status_Success) + { + return Status_Fail; + } + + if ((mmccard->card_workmode.busWidth == MMC_DataBusWidth4bitDDR) || (mmccard->card_workmode.busWidth == MMC_DataBusWidth8bitDDR)) + { + SDMMC_ConfigWorkMode(mmccard->SDHOSTx,SDMMC_DDR50); + } + else + { + SDMMC_ConfigWorkMode(mmccard->SDHOSTx,SDMMC_SDR50); + } + +// card->busTiming = kMMC_HighSpeedTiming; + + return Status_Success; +} + +Status_card MMC_SelectBusTiming(mmc_card_t *mmccard) +{ + Status_card status_temp = Status_Success; + + /* Legacy mmc card , do not support the command */ + if ((mmccard->mmc_card_information.csd.systemSpecificationVersion == (uint32_t)MMC_SpecificationVersion3) && + (mmccard->mmc_card_information.csd.csdStructureVersion == (uint32_t)MMC_CsdStrucureVersion12)) + { + return Status_Success; + } + + if(mmccard->card_workmode.busTiming == MMC_HighSpeedTimingNone) + { + /* if timing not specified, probe card capability from normal mode */ + mmccard->card_workmode.busTiming = MMC_NormalSpeedTiming; + } + + if(mmccard->card_workmode.busTiming == MMC_HighSpeed200Timing) + { + if(((mmccard->card_workmode.operationVoltageflag == MMC_OperationVoltage170to195V) || \ + (mmccard->card_workmode.operationVoltageflag == MMC_OperationVoltage120V)) && \ + ((mmccard->mmc_card_information.flags & (MMC_SupportHS200200MHZ180VFlag | MMC_SupportHS200200MHZ120VFlag)) != 0U)) + { + if(MMC_SwitchToHS200(mmccard) != Status_Success) + { + return Status_Fail; + } + else + { + status_temp = Status_Success; + } + } + else + { + status_temp = Status_CardNotSupportYet; + } + } + + if(mmccard->card_workmode.busTiming == MMC_HighSpeedTiming) + { + if(MMC_SwitchToHighSpeed(mmccard) != Status_Success) + { + return Status_Fail; + } + else + { + status_temp = Status_Success; + } + } + + if(mmccard->card_workmode.busTiming == MMC_NormalSpeedTiming) + { + /* select bus width */ + if (MMC_SetMaxDataBusWidth(mmccard) != Status_Success) + { + return Status_Fail; + } + else + { + status_temp = Status_Success; + } + } + + return status_temp; +} + +/** Read User Time Since Last Set + * param last time. + */ +uint32_t MMC_User_Time_Read(uint32_t time) +{ + if(MMC_systick_timeoutms>=time) + { + return MMC_systick_timeoutms-time; + } + return(0xFFFFFFFF-time+MMC_systick_timeoutms); +} + +/** MMC_SysTick_start_time. **/ +void MMC_SysTick_start_time(void) +{ + MMC_systick_timeoutms = 0; + +} + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/src/sd_host.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/src/sd_host.c new file mode 100644 index 0000000000..b07fdb68dd --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_periph_app/src/sd_host.c @@ -0,0 +1,873 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file sd_host.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "sd_host.h" + +static Status_card SD_SendCardStatus(sd_card_t* card); +static void SD_configSDMABufferSize(sd_card_t *card, uint32_t *buffer, uint32_t blockCount); +static Status_card SD_SwitchFunction(sd_card_t *card,uint32_t mode);; + + + +/* SD card block erase time, varies according to different SD cards */ +#define SD_BLOCKERASE_TIME (250U) + +uint32_t SD_systick_timeoutms = 0; + +Status_card SD_NormalCMD_Send(sd_card_t* card, uint32_t index,uint32_t argument,SDMMC_CardRspType responseType) +{ + Status_card status_temp; + + card->command.index = index; + card->command.argument = argument; + card->command.type = CARD_CommandTypeNormal; + card->command.responseType = responseType; + card->command.flags = 0x00; + card->command.responseErrorFlags = 0x00; + SDMMC_SendCommand(card->SDHOSTx,&card->command,&card->TMODE_truct); + if(SDMMC_WaitCommandDone(card->SDHOSTx,&card->command,ENABLE) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + else + { + status_temp = Status_Success; + } + return status_temp; +} + + +Status_card SD_AutoCMD_Send(sd_card_t* card, uint32_t index,uint32_t argument,SDMMC_CardRspType responseType) +{ + Status_card status_temp = Status_Success; + + /* CMD55 */ + card->command.index = SDMMC_ApplicationCommand; + card->command.argument = card->sd_card_information.rca << 16; + card->command.type = CARD_CommandTypeNormal; + card->command.responseType = CARD_ResponseTypeR1; + card->command.flags = 0x00; + card->command.responseErrorFlags = 0x00; + SDMMC_SendCommand(card->SDHOSTx,&card->command,&card->TMODE_truct); + if(SDMMC_WaitCommandDone(card->SDHOSTx,&card->command,ENABLE) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + + card->command.index = index; + card->command.argument = argument; + card->command.type = CARD_CommandTypeNormal; + card->command.responseType = responseType; + card->command.flags = 0x00; + card->command.responseErrorFlags = 0x00; + SDMMC_SendCommand(card->SDHOSTx,&card->command,&card->TMODE_truct); + if(SDMMC_WaitCommandDone(card->SDHOSTx,&card->command,ENABLE) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + + return status_temp; +} + + +void SD_DecodeCid(sd_card_t* card) +{ + /* get cid */ + card->sd_card_information.cid.manufacturerID = (uint8_t)((card->command.response[3U] & 0xFF000000U) >> 24U); + card->sd_card_information.cid.applicationID = (uint16_t)((card->command.response[3U] & 0xFFFF00U) >> 8U); + + card->sd_card_information.cid.productName[0U] = (uint8_t)((card->command.response[3U] & 0xFFU)); + card->sd_card_information.cid.productName[1U] = (uint8_t)((card->command.response[2U] & 0xFF000000U) >> 24U); + card->sd_card_information.cid.productName[2U] = (uint8_t)((card->command.response[2U] & 0xFF0000U) >> 16U); + card->sd_card_information.cid.productName[3U] = (uint8_t)((card->command.response[2U] & 0xFF00U) >> 8U); + card->sd_card_information.cid.productName[4U] = (uint8_t)((card->command.response[2U] & 0xFFU)); + + card->sd_card_information.cid.productVersion = (uint8_t)((card->command.response[1U] & 0xFF000000U) >> 24U); + + card->sd_card_information.cid.productSerialNumber = (uint32_t)((card->command.response[1U] & 0xFFFFFFU) << 8U); + card->sd_card_information.cid.productSerialNumber |= (uint32_t)((card->command.response[0U] & 0xFF000000U) >> 24U); + + card->sd_card_information.cid.manufacturerData = (uint16_t)((card->command.response[0U] & 0xFFF00U) >> 8U); +} + + +void SD_DecodeCsd(sd_card_t* card) +{ + card->sd_card_information.csd.csdStructure = (uint8_t)((card->command.response[3U] & 0xC0000000U) >> 30U); + card->sd_card_information.csd.dataReadAccessTime1 = (uint8_t)((card->command.response[3U] & 0xFF0000U) >> 16U); + card->sd_card_information.csd.dataReadAccessTime2 = (uint8_t)((card->command.response[3U] & 0xFF00U) >> 8U); + card->sd_card_information.csd.transferSpeed = (uint8_t)(card->command.response[3U] & 0xFFU); + card->sd_card_information.csd.cardCommandClass = (uint16_t)((card->command.response[2U] & 0xFFF00000U) >> 20U); + card->sd_card_information.csd.readBlockLength = (uint8_t)((card->command.response[2U] & 0xF0000U) >> 16U); + if ((card->command.response[2U] & 0x8000U) != 0U) + { + card->sd_card_information.csd.flags |= (uint16_t)SD_CsdReadBlockPartialFlag; + } + if ((card->command.response[2U] & 0x4000U) != 0U) + { + card->sd_card_information.csd.flags |= (uint16_t)SD_CsdWriteBlockMisalignFlag; + } + if ((card->command.response[2U] & 0x2000U) != 0U) + { + card->sd_card_information.csd.flags |= (uint16_t)SD_CsdReadBlockMisalignFlag; + } + if ((card->command.response[2U] & 0x1000U) != 0U) + { + card->sd_card_information.csd.flags |= (uint16_t)SD_CsdDsrImplementedFlag; + } + if (card->sd_card_information.csd.csdStructure == 0U) + { + card->sd_card_information.csd.deviceSize = (uint32_t)((card->command.response[2U] & 0x3FFU) << 2U); + card->sd_card_information.csd.deviceSize |= (uint32_t)((card->command.response[1U] & 0xC0000000U) >> 30U); + card->sd_card_information.csd.readCurrentVddMin = (uint8_t)((card->command.response[1U] & 0x38000000U) >> 27U); + card->sd_card_information.csd.readCurrentVddMax = (uint8_t)((card->command.response[1U] & 0x7000000U) >> 24U); + card->sd_card_information.csd.writeCurrentVddMin = (uint8_t)((card->command.response[1U] & 0xE00000U) >> 20U); + card->sd_card_information.csd.writeCurrentVddMax = (uint8_t)((card->command.response[1U] & 0x1C0000U) >> 18U); + card->sd_card_information.csd.deviceSizeMultiplier = (uint8_t)((card->command.response[1U] & 0x38000U) >> 15U); + + /* Get card total block count and block size. */ + card->sd_card_information.blockCount = ((card->sd_card_information.csd.deviceSize + 1U) << (card->sd_card_information.csd.deviceSizeMultiplier + 2U)); + card->sd_card_information.blockSize = (1UL << (card->sd_card_information.csd.readBlockLength)); + if (card->sd_card_information.blockSize != FSL_SDMMC_DEFAULT_BLOCK_SIZE) + { + card->sd_card_information.blockCount = (card->sd_card_information.blockCount * card->sd_card_information.blockSize); + card->sd_card_information.blockSize = FSL_SDMMC_DEFAULT_BLOCK_SIZE; + card->sd_card_information.blockCount = (card->sd_card_information.blockCount / card->sd_card_information.blockSize); + } + } + else if (card->sd_card_information.csd.csdStructure == 1U) + { + card->sd_card_information.blockSize = FSL_SDMMC_DEFAULT_BLOCK_SIZE; + + card->sd_card_information.csd.deviceSize = (uint32_t)((card->command.response[2U] & 0x3FU) << 16U); + card->sd_card_information.csd.deviceSize |= (uint32_t)((card->command.response[1U] & 0xFFFF0000U) >> 16U); + if (card->sd_card_information.csd.deviceSize >= 0xFFFFU) + { + card->sd_card_information.flags |= (uint32_t)SD_SupportSdxcFlag; + } + + card->sd_card_information.blockCount = ((card->sd_card_information.csd.deviceSize + 1U) * 1024U); + } + else + { + /* not support csd version */ + } + + if ((uint8_t)((card->command.response[1U] & 0x4000U) >> 14U) != 0U) + { + card->sd_card_information.csd.flags |= (uint16_t)SD_CsdEraseBlockEnabledFlag; + } + card->sd_card_information.csd.eraseSectorSize = (uint8_t)((card->command.response[1U] & 0x3F80U) >> 7U); + card->sd_card_information.csd.writeProtectGroupSize = (uint8_t)(card->command.response[1U] & 0x7FU); + if ((uint8_t)(card->command.response[0U] & 0x80000000U) != 0U) + { + card->sd_card_information.csd.flags |= (uint16_t)SD_CsdWriteProtectGroupEnabledFlag; + } + card->sd_card_information.csd.writeSpeedFactor = (uint8_t)((card->command.response[0U] & 0x1C000000U) >> 26U); + card->sd_card_information.csd.writeBlockLength = (uint8_t)((card->command.response[0U] & 0x3C00000U) >> 22U); + if ((uint8_t)((card->command.response[0U] & 0x200000U) >> 21U) != 0U) + { + card->sd_card_information.csd.flags |= (uint16_t)SD_CsdWriteBlockPartialFlag; + } + if ((uint8_t)((card->command.response[0U] & 0x8000U) >> 15U) != 0U) + { + card->sd_card_information.csd.flags |= (uint16_t)SD_CsdFileFormatGroupFlag; + } + if ((uint8_t)((card->command.response[0U] & 0x4000U) >> 14U) != 0U) + { + card->sd_card_information.csd.flags |= (uint16_t)SD_CsdCopyFlag; + } + if ((uint8_t)((card->command.response[0U] & 0x2000U) >> 13U) != 0U) + { + card->sd_card_information.csd.flags |= (uint16_t)SD_CsdPermanentWriteProtectFlag; + } + if ((uint8_t)((card->command.response[0U] & 0x1000U) >> 12U) != 0U) + { + card->sd_card_information.csd.flags |= (uint16_t)SD_CsdTemporaryWriteProtectFlag; + } + card->sd_card_information.csd.fileFormat = (uint8_t)((card->command.response[0U] & 0xC00U) >> 10U); +} + +static Status_card SD_SendCardStatus(sd_card_t* card) +{ + Status_card status_temp; + uint32_t retry = SD_CMD13_RETRY_TIMES; + while(retry != 0U) + { + /* CMD13 */ + if(SD_NormalCMD_Send(card,SDMMC_SendStatus,card->sd_card_information.rca << 16,CARD_ResponseTypeR1) != Status_Success) + { + if(SDMMC_GetPresentFlagStatus(card->SDHOSTx,SDHOST_CommandInhibitFlag)) + { + SDMMC_SoftWareReset(card->SDHOSTx,SDHOST_SOFTWARE_CMDLINE); + } + status_temp = Status_Fail; + retry--; + } + else + { + if(((card->command.response[0] & SDMMC_MASK(SDMMC_R1ReadyForDataFlag)) != 0U) && + (SDMMC_R1_CURRENT_STATE(card->command.response[0U]) != (uint32_t)SDMMC_R1StateProgram)) + { + status_temp = Status_CardStatusIdle; + } + else + { + status_temp = Status_CardStatusBusy; + } + break; + } + } + return status_temp; +} + +Status_card SD_PollingCardStatusBusy(sd_card_t* card,uint32_t timeoutMs) +{ + uint32_t timeout_temp; + uint32_t timeout_cnt = 0; + bool cardBusy = false; + Status_card status_temp = Status_CardStatusBusy; + + SD_SysTick_start_time(); + timeout_temp = SD_systick_timeoutms; + while(timeout_cnt < timeoutMs) + { + if(SDMMC_GetPresentFlagStatus(card->SDHOSTx,SDHOST_Data0LineLevelFlag) == SET) + { + cardBusy = false; + } + else + { + cardBusy = true; + } + + if (cardBusy == false) + { + status_temp = SD_SendCardStatus(card); + if (status_temp == Status_CardStatusIdle) + { + break; + } + } + + timeout_cnt = SD_User_Time_Read(timeout_temp); + } + + if(SDMMC_GetFlagStatus(card->SDHOSTx,SDHOST_DataCompleteFlag) == SET) + { + SDMMC_ClrFlag(card->SDHOSTx,SDHOST_DataCompleteFlag); + } + + return status_temp; +} + +Status_card SD_SendSCR(sd_card_t* card) +{ + uint32_t card_scr[2]; + SDMMC_Transfer transfer; + Status_card status_temp = Status_Success; + + SDMMC_EnableFlagStatus(card->SDHOSTx,SDHOST_DataErrorFlag | SDHOST_CommandErrorFlag,DISABLE); + + /* CMD55 */ + if(SD_NormalCMD_Send(card,SDMMC_ApplicationCommand,card->sd_card_information.rca << 16,CARD_ResponseTypeR1) != Status_Success) + { + status_temp = Status_Fail; + } + + + transfer.data.AutoCommand12_23 = NoAutoCommand; + transfer.data.enableIgnoreError = DISABLE; + transfer.data.dataType = SDHOST_TransferDataNormal; + transfer.data.blockCount = 1; + transfer.data.blockSize = 8; + transfer.data.rxData = card_scr; + transfer.data.txData = NULL; + + transfer.command.index = SD_ApplicationSendScr; + transfer.command.argument = 0x00; + transfer.command.type = CARD_CommandTypeNormal; + transfer.command.responseType = CARD_ResponseTypeR1; + transfer.command.flags = 0x00; + transfer.command.responseErrorFlags = 0x00; + + if(SDMMC_TransferBlocking(card->SDHOSTx,NULL,&transfer,&card->TMODE_truct) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + + if(status_temp == Status_Success) + { + card->sd_card_information.scr.scrStructure = (uint8_t)((card_scr[0] & 0x000000F0U) >> 4); + card->sd_card_information.scr.sdSpecification = (uint8_t)(card_scr[0] & 0x0000000FU); + + if((card_scr[0] & 0x00008000) != 0) + { + card->sd_card_information.scr.flags |= (uint8_t)SD_ScrDataStatusAfterErase; + } + card->sd_card_information.scr.sdSecurity = (uint8_t)((card_scr[0] & 0x00007000U) >> 12); + card->sd_card_information.scr.sdBusWidths = (uint8_t)((card_scr[0] & 0x00000F00U) >> 8); + if((card_scr[0] & 0x00800000) != 0) + { + card->sd_card_information.scr.flags |= (uint8_t)SD_ScrSdSpecification3; + } + card->sd_card_information.scr.commandSupport = (uint8_t)((card_scr[0] & 0x03000000U) >> 24); + card->sd_card_information.scr.reservedForManufacturer = (((card_scr[1] << 24) & 0xff000000) | ((card_scr[1] << 8) & 0x00ff0000) + | ((card_scr[1] >> 8) & 0x0000ff00) | ((card_scr[1] >> 24) & 0x000000ff)); + + if(card->sd_card_information.scr.sdSpecification == 0U) + { + card->sd_card_information.version = SD_SpecificationVersion1_0; + } + else if(card->sd_card_information.scr.sdSpecification == 1U) + { + card->sd_card_information.version = SD_SpecificationVersion1_1; + } + else if(card->sd_card_information.scr.sdSpecification == 2U) + { + card->sd_card_information.version = SD_SpecificationVersion2_0; + if((card->sd_card_information.flags & SD_ScrSdSpecification3) != 0) + { + card->sd_card_information.version = SD_SpecificationVersion3_0; + } + } + else + { + /* reserved */ + } + + if((card->sd_card_information.scr.sdBusWidths & 0x04U) != 0) + { + card->sd_card_information.flags |= (uint32_t)SD_Support4BitWidthFlag; + } + + if((card->sd_card_information.scr.commandSupport & 0x01U) != 0) + { + card->sd_card_information.flags |= (uint32_t)SD_SupportSpeedClassControlCmd; + } + + if((card->sd_card_information.scr.commandSupport & 0x02U) != 0) + { + card->sd_card_information.flags |= (uint32_t)SD_SupportSetBlockCountCmd; + } + + status_temp = Status_Success; + } + SDMMC_EnableFlagStatus(card->SDHOSTx,SDHOST_DataErrorFlag | SDHOST_CommandErrorFlag,ENABLE); + + return status_temp; +} + + +Status_card SD_Erase_Block(sd_card_t* card, uint32_t startBlock, uint32_t blockCount) +{ + uint32_t eraseBlockStart; + uint32_t eraseBlockEnd; + Status_card status_temp = Status_CardStatusBusy; + uint32_t timeout_block = SD_BLOCKERASE_TIME; /* 250ms erase timeout by default */ + + if(startBlock + blockCount > card->sd_card_information.blockCount) + { + return Status_CardOutOfRange; + } + + /* polling card status idle */ + status_temp = SD_PollingCardStatusBusy(card, SD_CARD_ACCESS_WAIT_IDLE_TIMEOUT); + if (Status_CardStatusIdle != status_temp) + { + return Status_PollingCardIdleFailed; + } + + eraseBlockStart = startBlock; + eraseBlockEnd = eraseBlockStart + blockCount - 1U; + + /* SDSC card */ + if (0U == (card->sd_card_information.flags & (uint32_t)SD_SupportHighCapacityFlag)) + { + eraseBlockStart = startBlock * FSL_SDMMC_DEFAULT_BLOCK_SIZE; + eraseBlockEnd = eraseBlockEnd * FSL_SDMMC_DEFAULT_BLOCK_SIZE; + } + + /* CMD32 */ + if(SD_NormalCMD_Send(card,SD_EraseWriteBlockStart,eraseBlockStart,CARD_ResponseTypeR1) != Status_Success) + { + return Status_Fail; + } + + /* CMD33 */ + if(SD_NormalCMD_Send(card,SD_EraseWriteBlockEnd,eraseBlockEnd,CARD_ResponseTypeR1) != Status_Success) + { + return Status_Fail; + } + + /* CMD38 */ + if(SD_NormalCMD_Send(card,SDMMC_Erase,0x00,CARD_ResponseTypeR1b) != Status_Success) + { + return Status_Fail; + } + + status_temp = SD_PollingCardStatusBusy(card, timeout_block*blockCount); + if (Status_CardStatusIdle != status_temp) + { + return Status_PollingCardIdleFailed; + } + return status_temp; +} + + +static void SD_configSDMABufferSize(sd_card_t *card, uint32_t *buffer, uint32_t blockCount) +{ + SDHOST_SDMA_Buffer_Size Size; + uint32_t address = (uint32_t)buffer; + + if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x1000) <= 0x1000) + { + Size = SDHOST_SDMABUFFERSIZE_4KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x2000) <= 0x2000) + { + Size = SDHOST_SDMABUFFERSIZE_8KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x4000) <= 0x4000) + { + Size = SDHOST_SDMABUFFERSIZE_16KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x8000) <= 0x8000) + { + Size = SDHOST_SDMABUFFERSIZE_32KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x10000) <= 0x10000) + { + Size = SDHOST_SDMABUFFERSIZE_64KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x20000) <= 0x20000) + { + Size = SDHOST_SDMABUFFERSIZE_128KB; + } + else if(blockCount * FSL_SDMMC_DEFAULT_BLOCK_SIZE + (address%0x40000) <= 0x40000) + { + Size = SDHOST_SDMABUFFERSIZE_256KB; + } + else + { + Size = SDHOST_SDMABUFFERSIZE_512KB; + } + SDMMC_ConfigSDMABufferSize(card->SDHOSTx,Size); +} + +Status_card SD_ReadBlocks(sd_card_t *card, uint32_t *buffer, uint32_t startBlock, uint32_t blockCount) +{ + SDMMC_Transfer transfer; + SDHOST_ADMAconfig dmaConfigtemp; + SDHOST_ADMAconfig *dmaConfig; + Status_card status_temp; + + if(startBlock + blockCount > card->sd_card_information.blockCount) + { + return Status_CardOutOfRange; + } + + /* polling card status idle */ + status_temp = SD_PollingCardStatusBusy(card, SD_CARD_ACCESS_WAIT_IDLE_TIMEOUT); + if (Status_CardStatusIdle != status_temp) + { + return Status_PollingCardIdleFailed; + } + + if(card->card_workmode.dma == SDMMC_NODMA) + { + dmaConfig = NULL; + } + else if(card->card_workmode.dma == SDMMC_SDMA) + { + dmaConfig = &dmaConfigtemp; + dmaConfig->dmaMode = DmaModeSimple; + dmaConfig->admaTable = NULL; + dmaConfig->admaTableWords = 0; + SD_configSDMABufferSize(card,buffer,blockCount); + } + else //ADMA + { + dmaConfig = &dmaConfigtemp; + dmaConfig->dmaMode = DmaModeAdma2; + dmaConfig->admaTable = buffer; + dmaConfig->admaTableWords = (*buffer & 0xFFFF0000) >> 16; + } + + transfer.data.enableIgnoreError = DISABLE; + transfer.data.dataType = SDHOST_TransferDataNormal; + transfer.data.blockCount = blockCount; + transfer.data.blockSize = FSL_SDMMC_DEFAULT_BLOCK_SIZE; + transfer.data.rxData = buffer; + transfer.data.txData = NULL; + + if(blockCount <= 1) + { + transfer.command.index = SDMMC_ReadSingleBlock; + transfer.data.AutoCommand12_23 = NoAutoCommand; + } + else + { + transfer.command.index = SDMMC_ReadMultipleBlock; + transfer.data.AutoCommand12_23 = AutoCommand12; + } + transfer.command.argument = startBlock; + transfer.command.type = CARD_CommandTypeNormal; + transfer.command.responseType = CARD_ResponseTypeR1; + transfer.command.flags = 0x00; + transfer.command.responseErrorFlags = 0x00; + + if(SDMMC_TransferBlocking(card->SDHOSTx,dmaConfig,&transfer,&card->TMODE_truct) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + else + { + status_temp = Status_Success; + } + + return status_temp; +} + + +Status_card SD_WriteBlocks(sd_card_t *card, uint32_t *buffer, uint32_t startBlock, uint32_t blockCount) +{ + SDMMC_Transfer transfer; + SDHOST_ADMAconfig *dmaConfig; + SDHOST_ADMAconfig dmaConfigtemp; + Status_card status_temp; + + if(startBlock + blockCount > card->sd_card_information.blockCount) + { + return Status_CardOutOfRange; + } + + /* polling card status idle */ + status_temp = SD_PollingCardStatusBusy(card, SD_CARD_ACCESS_WAIT_IDLE_TIMEOUT); + if (Status_CardStatusIdle != status_temp) + { + return Status_PollingCardIdleFailed; + } + + if(card->card_workmode.dma == SDMMC_NODMA) + { + dmaConfig = NULL; + } + else if(card->card_workmode.dma == SDMMC_SDMA) + { + dmaConfig = &dmaConfigtemp; + dmaConfig->dmaMode = DmaModeSimple; + dmaConfig->admaTable = NULL; + dmaConfig->admaTableWords = 0; + SD_configSDMABufferSize(card,buffer,blockCount); + } + else //ADMA + { + dmaConfig = &dmaConfigtemp; + dmaConfig->dmaMode = DmaModeAdma2; + dmaConfig->admaTable = buffer; + dmaConfig->admaTableWords = (*buffer & 0xFFFF0000) >> 16; + } + transfer.data.enableIgnoreError = DISABLE; + transfer.data.dataType = SDHOST_TransferDataNormal; + transfer.data.blockCount = blockCount; + transfer.data.blockSize = FSL_SDMMC_DEFAULT_BLOCK_SIZE; + transfer.data.rxData = NULL; + transfer.data.txData = buffer; + + if(blockCount <= 1) + { + transfer.command.index = SDMMC_WriteSingleBlock; + transfer.data.AutoCommand12_23 = NoAutoCommand; + } + else + { + transfer.command.index = SDMMC_WriteMultipleBlock; + transfer.data.AutoCommand12_23 = AutoCommand12; + } + transfer.command.argument = startBlock; + transfer.command.type = CARD_CommandTypeNormal; + transfer.command.responseType = CARD_ResponseTypeR1; + transfer.command.flags = 0x00; + transfer.command.responseErrorFlags = 0x00; + + if(SDMMC_TransferBlocking(card->SDHOSTx,dmaConfig,&transfer,&card->TMODE_truct) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + else + { + status_temp = Status_Success; + } + + return status_temp; +} + + +Status_card SD_SwitchVoltage(sd_card_t *card) +{ + Status_card status_temp = Status_Success; + uint32_t Mscnt_value; + uint32_t Mscnt_temp; + if((card->sd_card_information.flags & SD_SupportVoltage180v) != SD_SupportVoltage180v) + { + status_temp = Status_CardNotSupportYet; + } + + /* CMD11 */ + else if(SD_NormalCMD_Send(card,SD_VoltageSwitch,0x00,CARD_ResponseTypeR1) != Status_Success) + { + status_temp = Status_Fail; + } + else + { + SDMMC_EnableSDCLK(card->SDHOSTx,DISABLE); + /* delay 5ms */ + Mscnt_value = 0; + SD_SysTick_start_time(); + Mscnt_temp = SD_systick_timeoutms; + while(Mscnt_value<1) + { + Mscnt_value = SD_User_Time_Read(Mscnt_temp); + } + + if(SDMMC_GetPresentFlagStatus(card->SDHOSTx,(SDHOST_Data0LineLevelFlag | SDHOST_Data1LineLevelFlag | + SDHOST_Data2LineLevelFlag | SDHOST_Data3LineLevelFlag)) == SET) + { + status_temp = Status_Fail; + return status_temp; + } + + SDMMC_EnableVolSwitch(card->SDHOSTx,ENABLE); + /* delay 5ms */ + Mscnt_value = 0; + SD_SysTick_start_time(); + Mscnt_temp = SD_systick_timeoutms; + while(Mscnt_value<5) + { + Mscnt_value = SD_User_Time_Read(Mscnt_temp); + } + + if((card->SDHOSTx->CTRLSTS & SDHOST_CTRLSTS_V18SE) != SDHOST_CTRLSTS_V18SE) + { + status_temp = Status_Fail; + } + else + { + SDMMC_EnableSDCLK(card->SDHOSTx,ENABLE);; + /* Wait until the SD clock is stable. */ + SDMMC_WaitSDCLKStable(card->SDHOSTx); + + /* delay 1ms */ + Mscnt_value = 0; + SD_SysTick_start_time(); + Mscnt_temp = SD_systick_timeoutms; + while(Mscnt_value<1) + { + Mscnt_value = SD_User_Time_Read(Mscnt_temp); + } + + if(SDMMC_GetPresentFlagStatus(card->SDHOSTx,(SDHOST_Data0LineLevelFlag | SDHOST_Data1LineLevelFlag | + SDHOST_Data2LineLevelFlag | SDHOST_Data3LineLevelFlag)) != SET) + { + status_temp = Status_Fail; + } + } + } + return status_temp; +} + + +void sd_delay(uint32_t cnt) +{ + while(cnt--); +} + +static Status_card SD_SwitchFunction(sd_card_t *card,uint32_t mode) +{ + uint32_t card_scr[16]; + uint32_t cnt_value; + SDMMC_Transfer transfer; + Status_card status_temp = Status_Success; + + if(mode > 2) + { + mode = mode - 2; + } + + SDMMC_EnableFlagStatus(card->SDHOSTx,SDHOST_DataErrorFlag | SDHOST_CommandErrorFlag,DISABLE); + + transfer.data.AutoCommand12_23 = NoAutoCommand; + transfer.data.enableIgnoreError = DISABLE; + transfer.data.dataType = SDHOST_TransferDataNormal; + transfer.data.blockCount = 1; + transfer.data.blockSize = 64; + transfer.data.rxData = card_scr; + transfer.data.txData = NULL; + + transfer.command.index = SD_Switch; + transfer.command.argument = (0x00fffff0U | mode); + transfer.command.type = CARD_CommandTypeNormal; + transfer.command.responseType = CARD_ResponseTypeR1; + transfer.command.flags = 0x00; + transfer.command.responseErrorFlags = 0x00; + + if(SDMMC_TransferBlocking(card->SDHOSTx,NULL,&transfer,&card->TMODE_truct) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + + if(status_temp == Status_Success) + { + for(cnt_value = 0;cnt_value< 16; cnt_value++) + { + card_scr[cnt_value] = swap_uint32(card_scr[cnt_value]); + } + + /* -card_scr[0U]---bit511~bit480; + -card_scr[1U]---bit479~bit448; + -card_scr[2U]---bit447~bit416; + -card_scr[3U]---bit415~bit384; + -card_scr[4U]---bit383~bit352; + According to the "switch function status[bits 511~0]" return by switch command in mode "check function": + -Check if function 1(high speed) in function group 1 is supported by checking if bit 401 is set; + -check if function 1 is ready and can be switched by checking if bits 379~376 equal value 1; + */ + if((((card_scr[3] >> 16) & (1 << mode)) == 0) || (((card_scr[4] & 0x0F000000) >> 24) != mode)) + { + status_temp = Status_CardNotSupportYet; + } + } + + if(status_temp == Status_Success) + { + transfer.command.argument = (0x80fffff0U | mode); + if(SDMMC_TransferBlocking(card->SDHOSTx,NULL,&transfer,&card->TMODE_truct) != SDMMC_SUCCESS) + { + status_temp = Status_Fail; + } + + if(status_temp == Status_Success) + { + for(cnt_value = 0;cnt_value< 16; cnt_value++) + { + card_scr[cnt_value] = swap_uint32(card_scr[cnt_value]); + } + + /* According to the "switch function status[bits 511~0]" return by switch command in mode "set function": + -check if group 1 is successfully changed to function 1 by checking if bits 379~376 equal value 1; + */ + if(((card_scr[4] & 0x0F000000) >> 24) != mode) + { + status_temp = Status_CardSwitchFailed; + } + } + } + + SDMMC_EnableFlagStatus(card->SDHOSTx,SDHOST_DataErrorFlag | SDHOST_CommandErrorFlag,ENABLE); + return status_temp; +} + + +Status_card SD_SelectBusTiming(sd_card_t *card) +{ + Status_card status_temp; + if((card->sd_card_information.version <= SD_SpecificationVersion1_0) || ((card->sd_card_information.csd.cardCommandClass & SD_CommandClassSwitch) != SD_CommandClassSwitch)) + { + status_temp = Status_CardNotSupportYet; + } + else + { + if((card->card_workmode.mode == SDMMC_DS) || (card->card_workmode.mode == SDMMC_HS)) + { + status_temp = SD_SwitchFunction(card,card->card_workmode.mode); + } + else + { + if((card->sd_card_information.flags & SD_SupportVoltage180v) != SD_SupportVoltage180v) + { + status_temp = Status_CardNotSupportYet; + } + else + { + status_temp = SD_SwitchFunction(card,card->card_workmode.mode); + } + } + } + return status_temp; +} + +/** Read User Time Since Last Set + * param last time. + */ +uint32_t SD_User_Time_Read(uint32_t time) +{ + if(SD_systick_timeoutms>=time) + { + return SD_systick_timeoutms-time; + } + return(0xFFFFFFFF-time+SD_systick_timeoutms); +} + +/** SD_SysTick_start_time. **/ +void SD_SysTick_start_time(void) +{ + SD_systick_timeoutms = 0; + +} + + + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/misc.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/misc.h new file mode 100644 index 0000000000..f8a0da2208 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/misc.h @@ -0,0 +1,292 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file misc.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __MISC_H__ +#define __MISC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/** MISC Driving Functions Declaration **/ + +/** NVIC Init Structure definition **/ +typedef struct +{ + uint8_t NVIC_IRQChannel; /* Specifies the IRQ channel to be enabled or disabled. */ + + uint8_t NVIC_IRQChannelPreemptionPriority; /* Specifies the pre-emption priority for the IRQ channel + specified in NVIC_IRQChannel. */ + + uint8_t NVIC_IRQChannelSubPriority; /* Specifies the subpriority level for the IRQ channel specified + in NVIC_IRQChannel. */ + + FunctionalState NVIC_IRQChannelCmd; /* Specifies whether the IRQ channel defined in NVIC_IRQChannel + will be enabled or disabled. */ +} NVIC_InitType; + +#if (__MPU_PRESENT == 1) + +/** MPU Region initialization structure **/ +typedef struct +{ + uint8_t Enable; /* Specifies the status of the region. */ + uint8_t Number; /* Specifies the number of the region to protect. */ + uint32_t BaseAddress; /* Specifies the base address of the region to protect. */ + uint8_t Size; /* Specifies the size of the region to protect. */ + uint8_t SubRegionDisable; /* Specifies the number of the subregion protection to disable. */ + uint8_t TypeExtField; /* Specifies the TEX field level. */ + uint8_t AccessPermission; /* Specifies the region access permission type. */ + uint8_t DisableExec; /* Specifies the instruction access status. */ + uint8_t IsShareable; /* Specifies the shareability status of the protected region. */ + uint8_t IsCacheable; /* Specifies the cacheable status of the region protected. */ + uint8_t IsBufferable; /* Specifies the bufferable status of the protected region. */ +}MPU_Region_InitType; + + +/** CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control */ +#define MPU_HFNMI_PRIVDEF_NONE ((uint32_t)0x00000000UL) +#define MPU_HARDFAULT_NMI ((uint32_t)0x00000002UL) +#define MPU_PRIVILEGED_DEFAULT ((uint32_t)0x00000004UL) +#define MPU_HFNMI_PRIVDEF ((uint32_t)0x00000006UL) + + +/** CORTEX_MPU_Region_Enable CORTEX MPU Region Enable */ +#define MPU_REGION_ENABLE ((uint8_t)0x01u) +#define MPU_REGION_DISABLE ((uint8_t)0x00u) + +/** CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access */ +#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00u) +#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01u) + + +/** CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable */ +#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01u) +#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00u) + +/** CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable */ +#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01u) +#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00u) + + +/** CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable */ +#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01u) +#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00u) + +/** CORTEX_MPU_TEX_Levels MPU TEX Levels */ +#define MPU_TEX_LEVEL0 ((uint8_t)0x00u) +#define MPU_TEX_LEVEL1 ((uint8_t)0x01u) +#define MPU_TEX_LEVEL2 ((uint8_t)0x02u) + +/** CORTEX_MPU_Region_Size CORTEX MPU Region Size */ +#define MPU_REGION_SIZE_32B ((uint8_t)0x04u) +#define MPU_REGION_SIZE_64B ((uint8_t)0x05u) +#define MPU_REGION_SIZE_128B ((uint8_t)0x06u) +#define MPU_REGION_SIZE_256B ((uint8_t)0x07u) +#define MPU_REGION_SIZE_512B ((uint8_t)0x08u) +#define MPU_REGION_SIZE_1KB ((uint8_t)0x09u) +#define MPU_REGION_SIZE_2KB ((uint8_t)0x0Au) +#define MPU_REGION_SIZE_4KB ((uint8_t)0x0Bu) +#define MPU_REGION_SIZE_8KB ((uint8_t)0x0Cu) +#define MPU_REGION_SIZE_16KB ((uint8_t)0x0Du) +#define MPU_REGION_SIZE_32KB ((uint8_t)0x0Eu) +#define MPU_REGION_SIZE_64KB ((uint8_t)0x0Fu) +#define MPU_REGION_SIZE_128KB ((uint8_t)0x10u) +#define MPU_REGION_SIZE_256KB ((uint8_t)0x11u) +#define MPU_REGION_SIZE_512KB ((uint8_t)0x12u) +#define MPU_REGION_SIZE_1MB ((uint8_t)0x13u) +#define MPU_REGION_SIZE_2MB ((uint8_t)0x14u) +#define MPU_REGION_SIZE_4MB ((uint8_t)0x15u) +#define MPU_REGION_SIZE_8MB ((uint8_t)0x16u) +#define MPU_REGION_SIZE_16MB ((uint8_t)0x17u) +#define MPU_REGION_SIZE_32MB ((uint8_t)0x18u) +#define MPU_REGION_SIZE_64MB ((uint8_t)0x19u) +#define MPU_REGION_SIZE_128MB ((uint8_t)0x1Au) +#define MPU_REGION_SIZE_256MB ((uint8_t)0x1Bu) +#define MPU_REGION_SIZE_512MB ((uint8_t)0x1Cu) +#define MPU_REGION_SIZE_1GB ((uint8_t)0x1Du) +#define MPU_REGION_SIZE_2GB ((uint8_t)0x1Eu) +#define MPU_REGION_SIZE_4GB ((uint8_t)0x1Fu) + + +/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes + * @{ + */ +#define MPU_REGION_NO_ACCESS ((uint8_t)0x00u) +#define MPU_REGION_PRIV_RW ((uint8_t)0x01u) +#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02u) +#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03u) +#define MPU_REGION_PRIV_RO ((uint8_t)0x05u) +#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06u) + + +/**CORTEX_MPU_Region_Number CORTEX MPU Region Number */ + +#define MPU_REGION_NUMBER0 ((uint8_t)0x00u) +#define MPU_REGION_NUMBER1 ((uint8_t)0x01u) +#define MPU_REGION_NUMBER2 ((uint8_t)0x02u) +#define MPU_REGION_NUMBER3 ((uint8_t)0x03u) +#define MPU_REGION_NUMBER4 ((uint8_t)0x04u) +#define MPU_REGION_NUMBER5 ((uint8_t)0x05u) +#define MPU_REGION_NUMBER6 ((uint8_t)0x06u) +#define MPU_REGION_NUMBER7 ((uint8_t)0x07u) +#if !defined(CORE_CM4) +#define MPU_REGION_NUMBER8 ((uint8_t)0x08u) +#define MPU_REGION_NUMBER9 ((uint8_t)0x09u) +#define MPU_REGION_NUMBER10 ((uint8_t)0x0Au) +#define MPU_REGION_NUMBER11 ((uint8_t)0x0Bu) +#define MPU_REGION_NUMBER12 ((uint8_t)0x0Cu) +#define MPU_REGION_NUMBER13 ((uint8_t)0x0Du) +#define MPU_REGION_NUMBER14 ((uint8_t)0x0Eu) +#define MPU_REGION_NUMBER15 ((uint8_t)0x0Fu) +#endif /* !defined(CORE_CM4) */ + + +#endif /* __MPU_PRESENT */ + + + +/** MISC driver modules **/ +#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000U) /* access key */ + +/** Vector_Table_Base **/ +#define NVIC_VectTab_RAM ((uint32_t)0x20000000U) /* RAM start address*/ +#define NVIC_VectTab_FLASH ((uint32_t)0x08000000U) /* FLASH start address*/ + +/** LowPowerMode **/ +#define NVIC_LP_SEVONPEND (SCB_SCR_SEVONPEND) +#define NVIC_LP_SLEEPDEEP (SCB_SCR_SLEEPDEEP) +#define NVIC_LP_SLEEPONEXIT (SCB_SCR_SLEEPONEXIT) + +/** Preemption_Sub_Priority_Group **/ +#define NVIC_PriorityGroup_0 (SCB_AIRCR_PRIGROUP7) /* 0 bits for pre-emption priority 4 bits for subpriority */ +#define NVIC_PriorityGroup_1 (SCB_AIRCR_PRIGROUP6) /* 1 bits for pre-emption priority 3 bits for subpriority */ +#define NVIC_PriorityGroup_2 (SCB_AIRCR_PRIGROUP5) /* 2 bits for pre-emption priority 2 bits for subpriority */ +#define NVIC_PriorityGroup_3 (SCB_AIRCR_PRIGROUP4) /* 3 bits for pre-emption priority 1 bits for subpriority */ +#define NVIC_PriorityGroup_4 (SCB_AIRCR_PRIGROUP3) /* 4 bits for pre-emption priority 0 bits for subpriority */ + +/** Preemption_Priority_Group **/ +#define NVIC_PRE_PRIORITY_0 ((uint8_t)0x00U) +#define NVIC_PRE_PRIORITY_1 ((uint8_t)0x01U) +#define NVIC_PRE_PRIORITY_2 ((uint8_t)0x02U) +#define NVIC_PRE_PRIORITY_3 ((uint8_t)0x03U) +#define NVIC_PRE_PRIORITY_4 ((uint8_t)0x04U) +#define NVIC_PRE_PRIORITY_5 ((uint8_t)0x05U) +#define NVIC_PRE_PRIORITY_6 ((uint8_t)0x06U) +#define NVIC_PRE_PRIORITY_7 ((uint8_t)0x07U) +#define NVIC_PRE_PRIORITY_8 ((uint8_t)0x08U) +#define NVIC_PRE_PRIORITY_9 ((uint8_t)0x09U) +#define NVIC_PRE_PRIORITY_10 ((uint8_t)0x0AU) +#define NVIC_PRE_PRIORITY_11 ((uint8_t)0x0BU) +#define NVIC_PRE_PRIORITY_12 ((uint8_t)0x0CU) +#define NVIC_PRE_PRIORITY_13 ((uint8_t)0x0DU) +#define NVIC_PRE_PRIORITY_14 ((uint8_t)0x0EU) +#define NVIC_PRE_PRIORITY_15 ((uint8_t)0x0FU) + +/** Sub_Priority_Group **/ +#define NVIC_SUB_PRIORITY_0 ((uint8_t)0x00U) +#define NVIC_SUB_PRIORITY_1 ((uint8_t)0x01U) +#define NVIC_SUB_PRIORITY_2 ((uint8_t)0x02U) +#define NVIC_SUB_PRIORITY_3 ((uint8_t)0x03U) +#define NVIC_SUB_PRIORITY_4 ((uint8_t)0x04U) +#define NVIC_SUB_PRIORITY_5 ((uint8_t)0x05U) +#define NVIC_SUB_PRIORITY_6 ((uint8_t)0x06U) +#define NVIC_SUB_PRIORITY_7 ((uint8_t)0x07U) +#define NVIC_SUB_PRIORITY_8 ((uint8_t)0x08U) +#define NVIC_SUB_PRIORITY_9 ((uint8_t)0x09U) +#define NVIC_SUB_PRIORITY_10 ((uint8_t)0x0AU) +#define NVIC_SUB_PRIORITY_11 ((uint8_t)0x0BU) +#define NVIC_SUB_PRIORITY_12 ((uint8_t)0x0CU) +#define NVIC_SUB_PRIORITY_13 ((uint8_t)0x0DU) +#define NVIC_SUB_PRIORITY_14 ((uint8_t)0x0EU) +#define NVIC_SUB_PRIORITY_15 ((uint8_t)0x0FU) + +#define CM7_CPU ((uint32_t)0x00000002) + +#define VECT_SIZE ((uint32_t)0x400U) + +#if defined(DUAL_CORE) +#define CM4_CPU ((uint32_t)0x00000001) +#endif /*DUAL_CORE*/ + +/** SysTick_CLKSource **/ +#define SysTick_CLKSource_HCLK_Div8 (~SysTick_CTRL_CLKSOURCE) +#define SysTick_CLKSource_HCLK (SysTick_CTRL_CLKSOURCE) + + +#if (__MPU_PRESENT == 1) + +void MPU_Disable(void); +void MPU_Enable(uint32_t MPU_Control); +void MPU_ConfigRegion(MPU_Region_InitType *MPU_Init); + +#endif /*__MPU_PRESENT == 1*/ + +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); +void NVIC_Init(NVIC_InitType* NVIC_InitStruct); +void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset); +void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState Cmd); +void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource); + +void CopyVectTable(uint32_t SrcAddr, uint32_t DesAddr, uint32_t size); +uint32_t Get_CurrentCPU(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __MISC_H__ */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_adc.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_adc.h new file mode 100644 index 0000000000..a52fb404ef --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_adc.h @@ -0,0 +1,733 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_adc.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_ADC_H__ +#define __N32H76X_78X_ADC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" +#include + + + +/** ADC_Exported_Types **/ + + +/** ADC Init structure definition **/ +typedef struct +{ + uint32_t WorkMode; /* Configures the ADC to operate in independent or dual mode.*/ + + FunctionalState MultiChEn; /* Specifies whether the conversion is performed in + Scan (multichannels) or Single (one channel) mode. */ + + FunctionalState ContinueConvEn; /* Specifies whether the conversion is performed in + Continuous or Single mode. */ + uint32_t ExtTrigSelect; /*Set ADC group regular conversion trigger source: internal (SW start) or from external peripheral */ + + uint32_t DataTransferMode; /*Set ADC group regular conversion data transfer mode: no transfer, transfer by DMA or DFSDM.*/ + + uint32_t DatAlign; /* Set ADC conversion data alignment.*/ + + uint8_t ChsNumber; /* Set ADC group regular sequencer length*/ + + uint32_t Resolution; /* Set ADC resolution*/ + +} ADC_InitType; + +/** ADC offset structure definition **/ +typedef struct +{ + FunctionalState OffsetEn; /* Set Offset enable or disable*/ + FunctionalState OffsetSatenEn; /* Set Offset satera*/ + FunctionalState OffsetDirPositiveEn; + uint8_t OffsetChannel; + uint16_t OffsetData; +} ADC_OffsetType; + + +typedef enum +{ + ADC_CTRL3_CKMOD_AHB = 0, + ADC_CTRL3_CKMOD_PLL = 1, +} ADC_CTRL3_CKMOD; + +typedef enum +{ + ADC_AWDG1 = 0, + ADC_AWDG2 = 1, + ADC_AWDG3 = 2, +} ADC_AWDG; + + /** Multimode - Delay between two sampling phases **/ +#define ADC_ADC_MULTI_TWOSMP_DELAY_MASK (ADC_DLYSMP_INTLEADVAL) +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_1 ((uint32_t)0x00000000U << 28U) /**1 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_2 ((uint32_t)0x00000001U << 28U) /**2 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_3 ((uint32_t)0x00000002U << 28U) /**3 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_4 ((uint32_t)0x00000003U << 28U) /**4 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_5 ((uint32_t)0x00000004U << 28U) /**5 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_6 ((uint32_t)0x00000005U << 28U) /**6 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_7 ((uint32_t)0x00000006U << 28U) /**7 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_8 ((uint32_t)0x00000007U << 28U) /**8 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_9 ((uint32_t)0x00000008U << 28U) /**9 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_10 ((uint32_t)0x00000009U << 28U) /**0 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_11 ((uint32_t)0x0000000AU << 28U) /**11 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_12 ((uint32_t)0x0000000BU << 28U) /**12 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_13 ((uint32_t)0x0000000CU << 28U) /**13 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_14 ((uint32_t)0x0000000DU << 28U) /**14 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_15 ((uint32_t)0x0000000EU << 28U) /**15 ADC clock cycle */ +#define ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_16 ((uint32_t)0x0000000FU << 28U) /**16 ADC clock cycle */ + + + /** Indenpent mode - Delay between two sampling phases **/ +#define ADC_INDENPENT_TWOSMP_DELAY_EN_MASK (ADC_DLYSMP_DLYSAMPEN) + +#define ADC_INDENPENT_TWOSMP_DELAY_MASK (ADC_DLYSMP_DLYVAL | ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_1 (((uint32_t)0x00000000U << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**1 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_2 (((uint32_t)0x00000001U << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**2 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_3 (((uint32_t)0x00000002U << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**3 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_4 (((uint32_t)0x00000003U << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**4 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_5 (((uint32_t)0x00000004U << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**5 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_6 (((uint32_t)0x00000005U << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**6 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_7 (((uint32_t)0x00000006U << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**7 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_8 (((uint32_t)0x00000007U << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**8 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_9 (((uint32_t)0x00000008U << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**9 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_10 (((uint32_t)0x00000009U << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**10 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_11 (((uint32_t)0x0000000AU << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**11 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_12 (((uint32_t)0x0000000BU << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**12 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_13 (((uint32_t)0x0000000CU << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**13 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_14 (((uint32_t)0x0000000DU << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**14 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_15 (((uint32_t)0x0000000EU << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**15 ADC clock cycle */ +#define ADC_INDENPENT_TWOSMP_DELAY_CYCLE_16 (((uint32_t)0x0000000FU << 24U)|ADC_INDENPENT_TWOSMP_DELAY_EN_MASK) /**16 ADC clock cycle */ + +/** ADC_muli_mode ,including dual-ADC mode and tripple-ADC mode **/ +#define ADC_WORKMODE_MULT_MASK (ADC_CTRL1_MULTMODE) +#define ADC_WORKMODE_INDEPENDENT ((uint32_t)0x00000000U << 11U) +/** Dual-ADC mode **/ +#define ADC_WORKMODE_DUAL_REG_INJECT_SIMULT ((uint32_t)0x00000001U << 11U) +#define ADC_WORKMODE_DUAL_REG_SIMULT_ALTER_TRIG ((uint32_t)0x00000002U << 11U) +#define ADC_WORKMODE_DUAL_INJ_SIMULT_INTERL ((uint32_t)0x00000003U << 11U) +#define ADC_WORKMODE_DUAL_INJ_SIMULT ((uint32_t)0x00000005U << 11U) +#define ADC_WORKMODE_DUAL_REG_SIMULT ((uint32_t)0x00000006U << 11U) +#define ADC_WORKMODE_DUAL_INTERL ((uint32_t)0x00000007U << 11U) +#define ADC_WORKMODE_DUAL_ALTER_TRIG ((uint32_t)0x00000009U << 11U) +/** Tripple-ADC mode **/ +#define ADC_WORKMODE_TRIPPLE_REG_INJECT_SIMULT ((uint32_t)0x00000011U << 11U) +#define ADC_WORKMODE_TRIPPLE_REG_SIMULT_ALTER_TRIG ((uint32_t)0x00000012U << 11U) +#define ADC_WORKMODE_TRIPPLE_INJ_SIMULT_INTERL ((uint32_t)0x00000013U << 11U) +#define ADC_WORKMODE_TRIPPLE_INJ_SIMULT ((uint32_t)0x00000015U << 11U) +#define ADC_WORKMODE_TRIPPLE_REG_SIMULT ((uint32_t)0x00000016U << 11U) +#define ADC_WORKMODE_TRIPPLE_INTERL ((uint32_t)0x00000017U << 11U) +#define ADC_WORKMODE_TRIPPLE_ALTER_TRIG ((uint32_t)0x00000019U << 11U) + + +/** ADC CTRL1 MASK **/ +#define ADC_SCANMD_EN_MASK (ADC_CTRL1_SCANMD) /* Muti-channels enable mask */ +#define ADC_JAUTO_EN_MASK (ADC_CTRL1_AUTOJC) /* Automatic injected group conversion enable mask */ + +#define ADC_DISC_REG_EN_MASK (ADC_CTRL1_DREGCH) /* ADC Discontinous mode enable on regluar channels mask */ +#define ADC_DISC_INJ_EN_MASK (ADC_CTRL1_DJCH) /* ADC Discontinous mode enable on injected channels mask */ + +#define ADC_DISC_NUM_MASK (ADC_CTRL1_DCTU) /* ADC Discontinuous mode channel count */ +/** ADC_channels_definition **/ +#define ADC_CH_MASK (ADC_CTRL1_AWD1CH) +#define ADC_CH_0 ((uint8_t)0x00U) +#define ADC_CH_1 ((uint8_t)0x01U) +#define ADC_CH_2 ((uint8_t)0x02U) +#define ADC_CH_3 ((uint8_t)0x03U) +#define ADC_CH_4 ((uint8_t)0x04U) +#define ADC_CH_5 ((uint8_t)0x05U) +#define ADC_CH_6 ((uint8_t)0x06U) +#define ADC_CH_7 ((uint8_t)0x07U) +#define ADC_CH_8 ((uint8_t)0x08U) +#define ADC_CH_9 ((uint8_t)0x09U) +#define ADC_CH_10 ((uint8_t)0x0AU) +#define ADC_CH_11 ((uint8_t)0x0BU) +#define ADC_CH_12 ((uint8_t)0x0CU) +#define ADC_CH_13 ((uint8_t)0x0DU) +#define ADC_CH_14 ((uint8_t)0x0EU) +#define ADC_CH_15 ((uint8_t)0x0FU) +#define ADC_CH_16 ((uint8_t)0x10U) +#define ADC_CH_17 ((uint8_t)0x11U) +#define ADC_CH_18 ((uint8_t)0x12U) +#define ADC_CH_19 ((uint8_t)0x13U) + +/** ADC_analog_watchdog_channels_Mask_definition **/ +#define ADC_AWD1CH_MASK (ADC_CTRL1_AWD1CH) + +/** ADC_analog_watchdog_selection **/ +#define ADC_ANALOG_WTDG_SINGLEREG_ENABLE (ADC_CTRL1_AWD1SGLEN | ADC_CTRL1_AWD1ERCH) +#define ADC_ANALOG_WTDG_SINGLEINJEC_ENABLE (ADC_CTRL1_AWD1SGLEN | ADC_CTRL1_AWD1EJCH) +#define ADC_ANALOG_WTDG_SINGLEREG_OR_INJEC_ENABLE (ADC_CTRL1_AWD1SGLEN | ADC_CTRL1_AWD1ERCH | ADC_CTRL1_AWD1EJCH) +#define ADC_ANALOG_WTDG_ALLREG_ENABLE (ADC_CTRL1_AWD1ERCH) +#define ADC_ANALOG_WTDG_ALLINJEC_ENABLE (ADC_CTRL1_AWD1EJCH) +#define ADC_ANALOG_WTDG_ALLREG_ALLINJEC_ENABLE (ADC_CTRL1_AWD1ERCH | ADC_CTRL1_AWD1EJCH) +#define ADC_ANALOG_WTDG_NONE ((uint32_t)0x00000000U) + +/** ADC CTRL2 MASK **/ +#define ADC_ON_EN_MASK (ADC_CTRL2_ON) /* ADC enable mask */ +#define ADC_CONT_EN_MASK (ADC_CTRL2_CTU) /* ADC continuous conversion mask */ +#define ADC_CALI_EN_MASK (ADC_CTRL2_ENCAL) /* A/D start calibration mask */ +#define ADC_MUTI_ADC_DSMU_MASK (ADC_CTRL2_MDSMU) /* Multi-adc DSMU mode mask */ + +/** ADC_Regular_Group_Trigger_Edge_Configuration **/ +#define ADC_REG_TRIG_EXT_MASK (ADC_CTRL2_EXTPRSEL) +#define ADC_REG_TRIG_EXT_SOFTWARE ((uint32_t)0x00000000U) +#define ADC_REG_TRIG_EXT_RISING (ADC_CTRL2_EXTPRSEL_0) /* rising edge */ +#define ADC_REG_TRIG_EXT_FALLING (ADC_CTRL2_EXTPRSEL_1) /* falling edge */ +#define ADC_REG_TRIG_EXT_RISINGFALLING (ADC_CTRL2_EXTPRSEL_1 | ADC_CTRL2_EXTPRSEL_0) /* rising and falling edges */ + +#define ADC_REG_TRIG_EXT_EDGE_DEFAULT (ADC_REG_TRIG_EXT_RISING) /* default trigger rising edge */ +/** ADC_Injected_Group_Trigger_Edge_Configuration **/ +#define ADC_INJ_TRIG_EXT_MASK (ADC_CTRL2_EXTPJSEL) +#define ADC_INJ_TRIG_EXT_SOFTWARE ((uint32_t)0x00000000U) +#define ADC_INJ_TRIG_EXT_RISING (ADC_CTRL2_EXTPJSEL_0) /* rising edge */ +#define ADC_INJ_TRIG_EXT_FALLING (ADC_CTRL2_EXTPJSEL_1) /* falling edge */ +#define ADC_INJ_TRIG_EXT_RISINGFALLING (ADC_CTRL2_EXTPJSEL_1 | ADC_CTRL2_EXTPJSEL_0) /* rising and falling edges */ + +#define ADC_INJ_TRIG_EXT_EDGE_DEFAULT (ADC_INJ_TRIG_EXT_RISING) /* default trigger rising edge */ + +/** ADC_external_trigger_sources_for_injected_channels_conversion **/ +#define ADC_EXT_TRIG_INJ_CONV_MASK (ADC_CTRL2_EXTJSEL | ADC_INJ_TRIG_EXT_MASK) +#define ADC_EXT_TRIG_INJ_CONV_ATIM1_CC1 (((uint32_t)0x00000000U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM1_CC2 (((uint32_t)0x00000001U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM1_CC3 (((uint32_t)0x00000002U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM1_CC4 (((uint32_t)0x00000003U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM1_TRGO (((uint32_t)0x00000004U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM2_CC1 (((uint32_t)0x00000005U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM2_CC2 (((uint32_t)0x00000006U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM2_CC3 (((uint32_t)0x00000007U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM1_TRGO2 (((uint32_t)0x00000008U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM2_TRGO (((uint32_t)0x00000009U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM3_CC1 (((uint32_t)0x0000000AU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM3_CC2 (((uint32_t)0x0000000BU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM3_CC3 (((uint32_t)0x0000000CU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM3_CC4 (((uint32_t)0x0000000DU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM2_TRGO2 (((uint32_t)0x0000000EU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM3_TRGO (((uint32_t)0x0000000FU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM4_TRGO2 (((uint32_t)0x00000010U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM3_TRGO2 (((uint32_t)0x00000011U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_ATIM4_TRGO (((uint32_t)0x00000012U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_GTIMB1_TRGO (((uint32_t)0x00000013U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_GTIMB2_TRGO (((uint32_t)0x00000014U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_GTIMB3_TRGO (((uint32_t)0x00000015U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_GTIMA1_TRGO (((uint32_t)0x00000016U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_GTIMB1_CC1 (((uint32_t)0x00000017U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_GTIMB2_CC4 (((uint32_t)0x00000018U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_GTIMB3_CC1 (((uint32_t)0x00000019U << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_GTIMA1_CC3 (((uint32_t)0x0000001AU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_SHRTIM1_TRGO2 (((uint32_t)0x0000001BU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_SHRTIM1_TRGO4 (((uint32_t)0x0000001CU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_SHRTIM2_TRGO2 (((uint32_t)0x0000001DU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_SHRTIM2_TRGO4 (((uint32_t)0x0000001EU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_EXT_INT0_15 (((uint32_t)0x0000001FU << 13U) | ADC_INJ_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_INJ_CONV_SOFTWARE (((uint32_t)0x00000000U << 13U)) + +/** ADC_external_trigger_sources_for_regular_channels_conversion **/ +#define ADC_EXT_TRIG_REG_CONV_MASK (ADC_CTRL2_EXTRSEL | ADC_REG_TRIG_EXT_MASK) +#define ADC_EXT_TRIG_REG_CONV_ATIM1_CC1 (((uint32_t)0x00000000U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM1_CC2 (((uint32_t)0x00000001U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM1_CC3 (((uint32_t)0x00000002U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM1_CC4 (((uint32_t)0x00000003U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO (((uint32_t)0x00000004U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM2_CC1 (((uint32_t)0x00000005U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM2_CC2 (((uint32_t)0x00000006U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM2_CC3 (((uint32_t)0x00000007U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO2 (((uint32_t)0x00000008U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO (((uint32_t)0x00000009U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM3_CC1 (((uint32_t)0x0000000AU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM3_CC2 (((uint32_t)0x0000000BU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM3_CC3 (((uint32_t)0x0000000CU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM3_CC4 (((uint32_t)0x0000000DU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO2 (((uint32_t)0x0000000EU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM3_TRGO (((uint32_t)0x0000000FU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM4_TRGO2 (((uint32_t)0x00000010U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM3_TRGO2 (((uint32_t)0x00000011U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_ATIM4_TRGO (((uint32_t)0x00000012U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_GTIMB1_TRGO (((uint32_t)0x00000013U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_GTIMB2_TRGO (((uint32_t)0x00000014U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_GTIMB3_TRGO (((uint32_t)0x00000015U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_GTIMA1_TRGO (((uint32_t)0x00000016U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_GTIMB1_CC2 (((uint32_t)0x00000017U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_GTIMB2_CC4 (((uint32_t)0x00000018U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_GTIMB3_CC2 (((uint32_t)0x00000019U << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_GTIMA1_CC4 (((uint32_t)0x0000001AU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_SHRTIM1_TRGO1 (((uint32_t)0x0000001BU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_SHRTIM1_TRGO3 (((uint32_t)0x0000001CU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_SHRTIM2_TRGO1 (((uint32_t)0x0000001DU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_SHRTIM2_TRGO3 (((uint32_t)0x0000001EU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_EXT_INT0_15 (((uint32_t)0x0000001FU << 24U) | ADC_REG_TRIG_EXT_EDGE_DEFAULT) +#define ADC_EXT_TRIG_REG_CONV_SOFTWARE (((uint32_t)0x00000000U << 24U)) + +/** ADC DMA Mode **/ +#define ADC_MULTI_REG_DMA_MODE_MASK (ADC_CTRL2_DMAMD) +#define ADC_MULTI_REG_DMA_DISABLE (0x00000000UL) +#define ADC_MULTI_REG_DMA_EACH_ADC (ADC_CTRL2_DMAMD_0) /* each ADC uses its own DMA channel, with its individual DMA transfer settings */ +#define ADC_MULTI_REG_DMA_LIMIT_RES12_10B (ADC_CTRL2_DMAMD_1) /* one DMA channel for muti ADC (DMA of ADC master). Setting for ADC resolution of 12 and 10 bits */ + +/** ADC_data_align **/ +#define ADC_DAT_ALIGN_MASK (ADC_CTRL2_ALIG) +#define ADC_DAT_ALIGN_R ((uint32_t)0x00000000U) +#define ADC_DAT_ALIGN_L (ADC_CTRL2_ALIG) + +#define ADC_TS_EN_MASK (ADC_CTRL2_TEMPEN) /** ADC temper sensor enable **/ +#define ADC_VREFINT_EN_MASK (ADC_CTRL3_VREFINTEN) /** ADC vreint enable **/ +#define ADC_INJ_SWSTART_MASK (ADC_CTRL2_SWSTRJCH)/** Start conversion of injected channels **/ +#define ADC_REG_SWSTART_MASK (ADC_CTRL2_SWSTRRCH)/** Start conversion of regular channels **/ + +/** DataTransferMode **/ +#define ADC_DATA_TRANS_Mode_MASK (ADC_CTRL2_DMNGT | ADC_CTRL2_MDSMU ) +#define ADC_REG_DR_TRANSFER (0x00000000U ) /** ADC conversions are transferred to DR rigister **/ +#define ADC_REG_DSMU_TRANSFER (ADC_CTRL2_DMNGT_1) /** ADC conversion data are transferred to DSMU ,using for single-ADC**/ +#define ADC_REG_MUTI_DSMU_TRANSFER (ADC_CTRL2_DMNGT_1 | ADC_CTRL2_MDSMU) /** ADC conversion data are transferred to DSMU ,using for muti-ADC**/ +#define ADC_REG_DMA_TRANSFER (ADC_CTRL2_DMNGT_1 | ADC_CTRL2_DMNGT_0)/** ADC conversion data are transferred by DMA **/ + +/** ADC CTRL3 MASK **/ +#define ADC_DATA_RES_MASK (ADC_CTRL3_RES) +#define ADC_DATA_RES_10BIT (~ADC_DATA_RES_MASK) +#define ADC_DATA_RES_12BIT (ADC_DATA_RES_MASK) + +#define ADC_CAL_DIFF_MODE_MASK (ADC_CTRL3_CALDIF) /** ADC differential mode bit mask **/ +#define ADC_CAL_AUTO_LOAD_MASK (ADC_CTRL3_CALALD) /** ADC auto calibration bit mask **/ +#define ADC_CLOCK_MODE_MASK (ADC_CTRL3_CLOCKMOD) /** ADC clock mode bit mask **/ +#define ADC_BYPASS_CAL_MASK (ADC_CTRL3_BPCAL) /** ADC bypass calibration mode bit mask **/ +#define ADC_VOLT_MONITOR_EN_MASK (ADC_CTRL3_VBATMEN)/** ADCVbat monitor enable bit mask **/ + +#define ADC_GAIN_COMPENSATION_MODE_MASK (ADC_CTRL3_GCOMPEN | ADC_CTRL3_GCOMP_SATEN) +#define ADC_GAIN_COMPENSATION_MODE0 (ADC_CTRL3_GCOMPEN) /** ADC gain compensation enable and the Saturation range is max 0x0-0xFFFU **/ +#define ADC_GAIN_COMPENSATION_MODE1 (ADC_CTRL3_GCOMPEN | ADC_CTRL3_GCOMP_SATEN) /** ADC gain compensation enable and the Saturation range is max 0x0-0x3FFFU **/ + +#define ADC_GAIN_COMPENSATION_VALUE_MASK (ADC_GCOMP_GCOMPDAT) + +#define ADC_INJ_SWSTOP_MASK (ADC_CTRL3_SWJSTOP) /** Stop conversion of injected channels **/ +#define ADC_REG_SWSTOP_MASK (ADC_CTRL3_SWRSTOP) /** Stop conversion of regular channels **/ +#define ADC_INJ_START_MASK (ADC_CTRL3_JSTART ) /** Start conversion of injected channels **/ +#define ADC_REG_START_MASK (ADC_CTRL3_RSTART ) /** Start conversion of regular channels **/ + +#define ADC_CLOCK_MODE_PLL (ADC_CLOCK_MODE_MASK) +#define ADC_CLOCK_MODE_AHB (~ADC_CLOCK_MODE_MASK) + +#define ADC_OVERSAMPE_RATE_TIMES_MASK (ADC_OSCFG_OSR) /**ADC oversampling ratio times bit mask **/ +#define ADC_OVERSAMPE_RATE_TIMES_1 (((uint32_t)0x00000000U) << 14) +#define ADC_OVERSAMPE_RATE_TIMES_2 (((uint32_t)0x00000001U) << 14) +#define ADC_OVERSAMPE_RATE_TIMES_4 (((uint32_t)0x00000002U) << 14) +#define ADC_OVERSAMPE_RATE_TIMES_8 (((uint32_t)0x00000003U) << 14) +#define ADC_OVERSAMPE_RATE_TIMES_16 (((uint32_t)0x00000004U) << 14) +#define ADC_OVERSAMPE_RATE_TIMES_32 (((uint32_t)0x00000005U) << 14) +#define ADC_OVERSAMPE_RATE_TIMES_64 (((uint32_t)0x00000006U) << 14) +#define ADC_OVERSAMPE_RATE_TIMES_128 (((uint32_t)0x00000007U) << 14) +#define ADC_OVERSAMPE_RATE_TIMES_256 (((uint32_t)0x00000008U) << 14) +#define ADC_OVERSAMPE_RATE_TIMES_512 (((uint32_t)0x00000009U) << 14) +#define ADC_OVERSAMPE_RATE_TIMES_1024 (((uint32_t)0x0000000AU) << 14) + +#define ADC_OVERSAMPE_DATA_SHIFT_MASK (ADC_OSCFG_OSS) /**ADC oversampling data right shift bit mask **/ +#define ADC_OVERSAMPE_DATA_SHIFT_0 (((uint32_t)0x00000000U) << 18) +#define ADC_OVERSAMPE_DATA_SHIFT_1 (((uint32_t)0x00000001U) << 18) +#define ADC_OVERSAMPE_DATA_SHIFT_2 (((uint32_t)0x00000002U) << 18) +#define ADC_OVERSAMPE_DATA_SHIFT_3 (((uint32_t)0x00000003U) << 18) +#define ADC_OVERSAMPE_DATA_SHIFT_4 (((uint32_t)0x00000004U) << 18) +#define ADC_OVERSAMPE_DATA_SHIFT_5 (((uint32_t)0x00000005U) << 18) +#define ADC_OVERSAMPE_DATA_SHIFT_6 (((uint32_t)0x00000006U) << 18) +#define ADC_OVERSAMPE_DATA_SHIFT_7 (((uint32_t)0x00000007U) << 18) +#define ADC_OVERSAMPE_DATA_SHIFT_8 (((uint32_t)0x00000008U) << 18) +#define ADC_OVERSAMPE_DATA_SHIFT_9 (((uint32_t)0x00000009U) << 18) +#define ADC_OVERSAMPE_DATA_SHIFT_10 (((uint32_t)0x0000000AU) << 18) + +#define ADC_OVERSAMPE_REG_EN_MASK (ADC_OSCFG_OSRE) /**ADC oversampling on regular channels **/ +#define ADC_OVERSAMPE_INJ_EN_MASK (ADC_OSCFG_OSJE) /**ADC oversampling on injected channels **/ +#define ADC_OVERSAMPE_TRIG_REG_MASK (ADC_OSCFG_OSRTRIG) /**ADC oversampling trigger mode on regular channels **/ +#define ADC_OVERSAMPE_MODE_MASK (ADC_OSCFG_OSRMD) /**ADC oversampling mode on regular channels **/ +/**Oversample scope **/ +#define ADC_OVERSAMPE_DISABLE ((uint32_t)0x00000000U) +#define ADC_OVERSAMPE_REGULAR_CONTINUED (ADC_OVERSAMPE_REG_EN_MASK) +#define ADC_OVERSAMPE_REGULAR_RESUMED (ADC_OVERSAMPE_MODE_MASK | ADC_OVERSAMPE_REG_EN_MASK) +#define ADC_OVERSAMPE_INJECTED (ADC_OVERSAMPE_INJ_EN_MASK) +#define ADC_OVERSAMPE_REGULAR_INJECTED (ADC_OVERSAMPE_REG_EN_MASK | ADC_OVERSAMPE_INJ_EN_MASK) + +/** ADC_sampling_time **/ +#define ADC_SAMP_TIME_CYCLES_MASK (ADC_SAMPT1_SAMP0) +#define ADC_SAMP_TIME_CYCLES_1 ((uint8_t)0x00U) +#define ADC_SAMP_TIME_CYCLES_2 ((uint8_t)0x01U) +#define ADC_SAMP_TIME_CYCLES_3 ((uint8_t)0x02U) +#define ADC_SAMP_TIME_CYCLES_4 ((uint8_t)0x03U) +#define ADC_SAMP_TIME_CYCLES_5 ((uint8_t)0x04U) +#define ADC_SAMP_TIME_CYCLES_6 ((uint8_t)0x05U) +#define ADC_SAMP_TIME_CYCLES_7 ((uint8_t)0x06U) +#define ADC_SAMP_TIME_CYCLES_10 ((uint8_t)0x07U) +#define ADC_SAMP_TIME_CYCLES_13 ((uint8_t)0x08U) +#define ADC_SAMP_TIME_CYCLES_17 ((uint8_t)0x09U) +#define ADC_SAMP_TIME_CYCLES_24 ((uint8_t)0x0AU) +#define ADC_SAMP_TIME_CYCLES_32 ((uint8_t)0x0BU) +#define ADC_SAMP_TIME_CYCLES_83 ((uint8_t)0x0CU) +#define ADC_SAMP_TIME_CYCLES_93 ((uint8_t)0x0DU) +#define ADC_SAMP_TIME_CYCLES_215 ((uint8_t)0x0EU) +#define ADC_SAMP_TIME_CYCLES_397 ((uint8_t)0x0FU) + + +/** ADC_offset_channel_offset **/ +#define ADC_REGESTER_OFFSET_1 ((uint8_t)0x24U) +#define ADC_REGESTER_OFFSET_2 ((uint8_t)0x28U) +#define ADC_REGESTER_OFFSET_3 ((uint8_t)0x2CU) +#define ADC_REGESTER_OFFSET_4 ((uint8_t)0x30U) + +#define ADC_OFFSET_EN_MASK (ADC_OFFSET1_OFFSCH1EN) +#define ADC_OFFSET_CH_MASK (ADC_OFFSET1_OFFSCH1CH) +#define ADC_OFFSET_SATEN_EN_MASK (ADC_OFFSET1_OFFSCH1SATEN) +#define ADC_OFFSET_DIR_MASK (ADC_OFFSET1_OFFSCH1DIR) +#define ADC_OFFSET_DATA_MASK (ADC_OFFSET1_OFFSCH1DAT) + +/** AWDG 1 Filtering Definition **/ +#define ADC_AWDG1_FILTERING_MASK (ADC_AWD1LOW_AWDFIL) +#define ADC_AWDG1_FILTERING_NONE (0x00000000U) +#define ADC_AWDG1_FILTERING_2SAMPLES (ADC_AWD1LOW_AWDFIL_0) +#define ADC_AWDG1_FILTERING_3SAMPLES (ADC_AWD1LOW_AWDFIL_1) +#define ADC_AWDG1_FILTERING_4SAMPLES (ADC_AWD1LOW_AWDFIL_1 | ADC_AWD1LOW_AWDFIL_0) +#define ADC_AWDG1_FILTERING_5SAMPLES (ADC_AWD1LOW_AWDFIL_2) +#define ADC_AWDG1_FILTERING_6SAMPLES (ADC_AWD1LOW_AWDFIL_2 | ADC_AWD1LOW_AWDFIL_0) +#define ADC_AWDG1_FILTERING_7SAMPLES (ADC_AWD1LOW_AWDFIL_2 | ADC_AWD1LOW_AWDFIL_1) +#define ADC_AWDG1_FILTERING_8SAMPLES (ADC_AWD1LOW_AWDFIL_2 | ADC_AWD1LOW_AWDFIL_1 | ADC_AWD1LOW_AWDFIL_0) + +/** AWDG 2/3 Enable Definition **/ +#define ADC_AWDG2_EN_OFFSET ((uint8_t)0x4CU) +#define ADC_AWDG3_EN_OFFSET ((uint8_t)0x50U) +#define ADC_AWDG23_EN_MASK (ADC_AWD2EN_AWD2EN) +/** AWDG 2/3 Interrupt Enable Definition **/ +#define ADC_AWDG2_INTEN_OFFSET ((uint8_t)0x54U) +#define ADC_AWDG3_INTEN_OFFSET ((uint8_t)0x58U) +#define ADC_AWDG23_INTEN_MASK (ADC_AWD2INTEN) +/** AWDG 2/3 Status Definition **/ +#define ADC_AWDG2_STS_OFFSET ((uint8_t)0x5CU) +#define ADC_AWDG3_STS_OFFSET ((uint8_t)0x60U) +#define ADC_AWDG23_STATUS_MASK (ADC_AWD2STS) + +/** ADC regular sequence **/ +#define ADC_RESQ_SEQ_MASK (ADC_RSEQ4_SEQ1) + + +/** ADC inject sequence **/ +#define ADC_JESQ_LEN_MASK (ADC_JSEQ_JLEN) +#define ADC_JESQ_SEQ_MASK (ADC_JSEQ_JSEQ1) + + +#define ADC_INJECT_DATA_OFFSET_1 ((uint8_t)0x78U) +#define ADC_INJECT_DATA_OFFSET_2 ((uint8_t)0x7CU) +#define ADC_INJECT_DATA_OFFSET_3 ((uint8_t)0x80U) +#define ADC_INJECT_DATA_OFFSET_4 ((uint8_t)0x84U) + + + +/** ADC_flags_definition **/ +#define ADC_FLAG_ALL_MASK (ADC_STS_ALL) +#define ADC_FLAG_ENDC (ADC_STS_ENDC) +#define ADC_FLAG_EOC_ANY (ADC_STS_ENDCA) +#define ADC_FLAG_JSTR (ADC_STS_JSTR) +#define ADC_FLAG_JENDC (ADC_STS_JENDC) +#define ADC_FLAG_JEOC_ANY (ADC_STS_JENDCA) +#define ADC_FLAG_STR (ADC_STS_STR) +#define ADC_FLAG_AWDG1 (ADC_STS_AWDG1) +#define ADC_FLAG_RDY (ADC_STS_RDY) +#define ADC_FLAG_PDRDY (ADC_STS_PDRDY) +#define ADC_FLAG_EOSAMP (ADC_STS_EOSAMP) +#define ADC_FLAG_ROSOVF (ADC_STS_ROSOVF) +#define ADC_FLAG_JOSOVF (ADC_STS_JOSOVF) +#define ADC_FLAG_ROSOVFDSMU (ADC_STS_ROSOVFDSMU) +#define ADC_FLAG_REFLAG (ADC_STS_REFLAG) +#define ADC_FLAG_WEFLAG (ADC_STS_WEFLAG) + + +/** ADC_FIFO_flags_definition **/ +#define ADC_FIFO_FLAG_FULL ((uint16_t)ADC_FIFOSTS_FFLAG) +#define ADC_FIFO_FLAG_EMPTY ((uint16_t)ADC_FIFOSTS_EFLAG) +#define ADC_FIFO_FLAG_HALF_FULL ((uint16_t)ADC_FIFOSTS_HFFLAG) +#define ADC_FIFO_FLAG_NOT_EMPTY ((uint16_t)ADC_FIFOSTS_NEFLAG) + +/** ADC_FIFO_Invailed_Data_definition **/ +#define ADC_FIFO_INVALIED_DATA_COUNT_MASK (ADC_FIFOSTS_DATCNT) + +/** ADC_FIFO_CFG_definition **/ +#define ADC_FIFO_EN_MASK (ADC_FIFOCFG_EN) +#define ADC_FIFO_CLR_MASK (ADC_FIFOCFG_CLR) +#define ADC_FIFO_WATER_LEVEL_MASK (ADC_FIFOCFG_WL) + +/** ADC_FIFO_INTEN_definition **/ +#define ADC_FIFO_INT_FULL ((uint16_t)ADC_FIFOCFG_FINTEN) +#define ADC_FIFO_INT_EMPTY ((uint16_t)ADC_FIFOCFG_EINTEN) +#define ADC_FIFO_INT_HALF_FULL ((uint16_t)ADC_FIFOCFG_HFINTEN) +#define ADC_FIFO_INT_NOT_EMPTY ((uint16_t)ADC_FIFOCFG_NEINTEN) + + +/** ADC_interrupts_definition **/ +#define ADC_INT_CONTROL_MASK (0x7C00003FU) /*bit8 - bit25 insert ADC_STS Flag*/ +#define ADC_INT_WRITEERR (ADC_CTRL1_WEIEN | ((uint32_t)ADC_FLAG_WEFLAG <<8U) ) +#define ADC_INT_READERR (ADC_CTRL1_REIEN | ((uint32_t)ADC_FLAG_REFLAG <<8U) ) +#define ADC_INT_EOSAMP (ADC_CTRL1_EOSMPIEN | ((uint32_t)ADC_FLAG_EOSAMP <<8U) ) +#define ADC_INT_PDRDY (ADC_CTRL1_PDRDYIEN | ((uint32_t)ADC_FLAG_PDRDY <<8U) ) +#define ADC_INT_RDY (ADC_CTRL1_RDYIEN | ((uint32_t)ADC_FLAG_RDY <<8U) ) +#define ADC_INT_AWD1 (ADC_CTRL1_AWD1IEN | ((uint32_t)ADC_FLAG_AWDG1 <<8U) ) +#define ADC_INT_JENDC (ADC_CTRL1_JENDCIEN | ((uint32_t)ADC_FLAG_JENDC <<8U) ) +#define ADC_INT_JENDCA (ADC_CTRL1_JENDCAIEN | ((uint32_t)ADC_FLAG_JEOC_ANY <<8U) ) +#define ADC_INT_ENDC (ADC_CTRL1_ENDCIEN | ((uint32_t)ADC_FLAG_ENDC <<8U) ) +#define ADC_INT_ENDCA (ADC_CTRL1_ENDCAIEN | ((uint32_t)ADC_FLAG_EOC_ANY <<8U) ) + +// /** ADC1_channels_definition **/ +#define ADC1_Channel_00_PA0_C (ADC_CH_0) +#define ADC1_Channel_01_PA1_C (ADC_CH_1) +#define ADC1_Channel_02_PF11 (ADC_CH_2) +#define ADC1_Channel_03_PA6 (ADC_CH_3) +#define ADC1_Channel_04_PC4 (ADC_CH_4) +#define ADC1_Channel_05_PB1 (ADC_CH_5) +#define ADC1_Channel_06_PF12 (ADC_CH_6) +#define ADC1_Channel_07_PA7 (ADC_CH_7) +#define ADC1_Channel_08_PC5 (ADC_CH_8) +#define ADC1_Channel_09_PB0 (ADC_CH_9) +#define ADC1_Channel_10_PC0 (ADC_CH_10) +#define ADC1_Channel_11_PC1 (ADC_CH_11) +#define ADC1_Channel_12_PC2 (ADC_CH_12) +#define ADC1_Channel_13_PC3 (ADC_CH_13) +#define ADC1_Channel_14_PA2 (ADC_CH_14) +#define ADC1_Channel_15_PA3 (ADC_CH_15) +#define ADC1_Channel_16_PA0 (ADC_CH_16) +#define ADC1_Channel_17_PA1 (ADC_CH_17) +#define ADC1_Channel_18_PA4 (ADC_CH_18) +#define ADC1_Channel_19_PA5 (ADC_CH_19) + +// /** ADC2_channels_definition **/ +#define ADC2_Channel_00_PA0_C_PC2_C (ADC_CH_0) //this channel can be optionally conected to PA0_C or PC2_C; +#define ADC2_Channel_01_PA1_C_PC3_C (ADC_CH_1) //this channel can be optionally conected to PA1_C or PC3_C; +#define ADC2_Channel_02_PF13 (ADC_CH_2) +#define ADC2_Channel_03_PA6 (ADC_CH_3) +#define ADC2_Channel_04_PC4 (ADC_CH_4) +#define ADC2_Channel_05_PB1 (ADC_CH_5) +#define ADC2_Channel_06_PF14 (ADC_CH_6) +#define ADC2_Channel_07_PA7 (ADC_CH_7) +#define ADC2_Channel_08_PC5 (ADC_CH_8) +#define ADC2_Channel_09_PB0 (ADC_CH_9) +#define ADC2_Channel_10_PC0 (ADC_CH_10) +#define ADC2_Channel_11_PC1 (ADC_CH_11) +#define ADC2_Channel_12_PC2 (ADC_CH_12) +#define ADC2_Channel_13_PC3 (ADC_CH_13) +#define ADC2_Channel_14_PA2 (ADC_CH_14) +#define ADC2_Channel_15_PA3 (ADC_CH_15) +#define ADC2_Channel_16_DAC135 (ADC_CH_16) +#define ADC2_Channel_17_DAC246 (ADC_CH_17) +#define ADC2_Channel_18_PA4 (ADC_CH_18) +#define ADC2_Channel_19_PA5 (ADC_CH_19) + +// /** ADC3_channels_definition **/ +#define ADC3_Channel_00_PC2_C (ADC_CH_0) +#define ADC3_Channel_01_PC3_C (ADC_CH_1) +#define ADC3_Channel_02_PF9 (ADC_CH_2) +#define ADC3_Channel_03_PF7 (ADC_CH_3) +#define ADC3_Channel_04_PF5 (ADC_CH_4) +#define ADC3_Channel_05_PF3 (ADC_CH_5) +#define ADC3_Channel_06_PF10 (ADC_CH_6) +#define ADC3_Channel_07_PF8 (ADC_CH_7) +#define ADC3_Channel_08_PF6 (ADC_CH_8) +#define ADC3_Channel_09_PF4 (ADC_CH_9) +#define ADC3_Channel_10_PC0 (ADC_CH_10) +#define ADC3_Channel_11_PC1 (ADC_CH_11) +#define ADC3_Channel_12_PC2 (ADC_CH_12) +#define ADC3_Channel_13_PH2 (ADC_CH_13) +#define ADC3_Channel_14_PH3 (ADC_CH_14) +#define ADC3_Channel_15_PH4 (ADC_CH_15) +#define ADC3_Channel_16_PH5 (ADC_CH_16) +#define ADC3_Channel_17_Battery_DIV4 (ADC_CH_17) +#define ADC3_Channel_18_Temperture_Sensor (ADC_CH_18) +#define ADC3_Channel_19_VREFINT (ADC_CH_19) + +/** ADC_differential_selection_channnels_definition **/ +#define ADC_DIFSEL_CHS_MASK (ADC_DIFSEL_DIFSEL) +#define ADC_DIFSEL_CHS_1 (ADC_DIFSEL_DIFSEL_CH1) +#define ADC_DIFSEL_CHS_2 (ADC_DIFSEL_DIFSEL_CH2) +#define ADC_DIFSEL_CHS_3 (ADC_DIFSEL_DIFSEL_CH3) +#define ADC_DIFSEL_CHS_4 (ADC_DIFSEL_DIFSEL_CH4) +#define ADC_DIFSEL_CHS_5 (ADC_DIFSEL_DIFSEL_CH5) +#define ADC_DIFSEL_CHS_6 (ADC_DIFSEL_DIFSEL_CH6) +#define ADC_DIFSEL_CHS_7 (ADC_DIFSEL_DIFSEL_CH7) +#define ADC_DIFSEL_CHS_8 (ADC_DIFSEL_DIFSEL_CH8) +#define ADC_DIFSEL_CHS_9 (ADC_DIFSEL_DIFSEL_CH9) +#define ADC_DIFSEL_CHS_10 (ADC_DIFSEL_DIFSEL_CH10) +#define ADC_DIFSEL_CHS_11 (ADC_DIFSEL_DIFSEL_CH11) +#define ADC_DIFSEL_CHS_12 (ADC_DIFSEL_DIFSEL_CH12) +#define ADC_DIFSEL_CHS_13 (ADC_DIFSEL_DIFSEL_CH13) +#define ADC_DIFSEL_CHS_14 (ADC_DIFSEL_DIFSEL_CH14) +#define ADC_DIFSEL_CHS_15 (ADC_DIFSEL_DIFSEL_CH15) +#define ADC_DIFSEL_CHS_16 (ADC_DIFSEL_DIFSEL_CH16) +#define ADC_DIFSEL_CHS_17 (ADC_DIFSEL_DIFSEL_CH17) +#define ADC_DIFSEL_CHS_18 (ADC_DIFSEL_DIFSEL_CH18) +#define ADC_DIFSEL_CHS_19 (ADC_DIFSEL_DIFSEL_CH19) + + +/** ADC_channel_mode_definition **/ +#define ADC_SINGLE_ENDED ((uint32_t)0x00LU) /** signal-ended mode **/ +#define ADC_DIFFERENTIAL_ENDED ((uint32_t)0x01LU) /** differential mode **/ + +/** ADC_Write/Read_Internal_Register_definition **/ + +#define ADC_WRITE_READ_TIMEOUT_CYCLE ((uint32_t)0xFFLU) + +#define ADC_WRITE_REG_MASK (ADC_INTLRCFG_WEN | ADC_INTLRCFG_ADDR | ADC_INTLRCFG_WDATA | ADC_INTLRCFG_RWSTART) +#define ADC_WRITE_READ_START (ADC_INTLRCFG_RWSTART) +#define ADC_WRITE_READ_RDY (ADC_INTLRCFG_DONE) +#define ADC_READ_REG_MASK (ADC_INTLRCFG_WEN | ADC_INTLRCFG_ADDR | ADC_INTLRCFG_RWSTART) +#define ADC_RDATA_MASK (ADC_INTLRCFG_RDATA) + +#define ADC_CALIBRATION_ADDR ((uint8_t)0x05U) +#define ADC_CALIBRATION_RDY ((uint8_t)0x40U) +#define ADC_CALIBRATION_RDY ((uint8_t)0x40U) +/** ADC_Gain_Compensation_definition **/ +#define ADC_GAIN_COMPENSATION_EN_MASK (ADC_GCOMP_GCOMPDAT) + + + +/** ADC_Exported_Functions **/ + +void ADC_DeInit(ADC_Module* ADCx); +void ADC_Init(ADC_Module* ADCx, ADC_InitType* ADC_InitStruct); +void ADC_InitStruct(ADC_InitType* ADC_InitStruct); +void ADC_Enable(ADC_Module* ADCx, FunctionalState Cmd); +void ADC_SetDMATransferMode(ADC_Module *ADCx, uint32_t DMAMode); +void ADC_CalibrationOperation(ADC_Module* ADCx); +void ADC_CalibrationReset(ADC_Module* ADCx); +FlagStatus ADC_GetCalibrationStatus(ADC_Module* ADCx); + +void ADC_EnableSoftwareStartConv(ADC_Module* ADCx, FunctionalState Cmd); +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_Module* ADCx); +void ADC_EnableSoftwareStartInjectedConv(ADC_Module* ADCx, FunctionalState Cmd); +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_Module* ADCx); +FlagStatus ADC_GetGainCompensationCmdStatus(ADC_Module* ADCx); +void ADC_EnableTempSensor(FunctionalState Cmd); +void ADC_EnableVrefint(FunctionalState Cmd); +void ADC_StopRegularConv(ADC_Module* ADCx); +void ADC_StopInjectedConv(ADC_Module* ADCx); +void ADC_StartInjectedConv(ADC_Module *ADCx); +void ADC_StartRegularConv(ADC_Module *ADCx); +void ADC_SetRegularDataTransferMode(ADC_Module *ADCx, uint32_t DataTransferMode); +void ADC_EnableMutiAdcDSMU(ADC_Module *ADCx, FunctionalState Cmd); + +void ADC_SetRegularTriggerEdge(ADC_Module* ADCx, uint32_t ExternalRegularTriggerEdge); +void ADC_SetInjectTriggerEdge(ADC_Module* ADCx, uint32_t ExternalInjectTriggerEdge); + +void ADC_SetIndenpentSamplingDelay(ADC_Module* ADCx, uint32_t IndenpentSamplingDelay); +void ADC_SetMultiTwoSamplingDelay(ADC_Module* ADCx, uint32_t MultiTwoSamplingDelay); + +void ADC_ConfigDiscModeChannelCount(ADC_Module* ADCx, uint8_t Number); +void ADC_EnableDiscMode(ADC_Module* ADCx, FunctionalState Cmd); +void ADC_ConfigRegularChannel(ADC_Module* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +uint16_t ADC_GetDat(ADC_Module* ADCx); +uint32_t ADC_GetMutiModeConversionDat(ADC_Module* ADCx); +void ADC_EnableAutoInjectedConv(ADC_Module* ADCx, FunctionalState Cmd); +void ADC_EnableInjectedDiscMode(ADC_Module* ADCx, FunctionalState Cmd); +void ADC_ConfigExternalTrigInjectedConv(ADC_Module* ADCx, uint32_t ADC_ExternalTrigInjecConv); +void ADC_ConfigExternalTrigRegularConv(ADC_Module* ADCx, uint32_t ADC_ExternalTrigRegularConv); + +void ADC_ConfigInjectedChannel(ADC_Module* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_ConfigInjectedSequencerLength(ADC_Module* ADCx, uint8_t Length); +uint16_t ADC_GetInjectedConversionDat(ADC_Module* ADCx, uint8_t ADC_InjectedChannel); +void ADC_ConfigAnalogWatchdog1WorkChannelType(ADC_Module* ADCx, uint32_t ADC_AnalogWatchdog); +void ADC_SetAWDG1FilteringConfig(ADC_Module *ADCx, uint32_t FilteringCount); +void ADC_ConfigAnalogWatchdogThresholds(ADC_Module* ADCx, ADC_AWDG Awdg, uint16_t HighThreshold, uint16_t LowThreshold); +void ADC_ConfigAnalogWatchdog1SingleChannel(ADC_Module* ADCx, uint8_t ADC_Channel); +void ADC_SetAnalogWatchdog23MonitChannels(ADC_Module* ADCx, uint8_t AWDG_RegEnOffset, uint32_t AWDG_ChannelGroup); +uint32_t ADC_GetAnalogWatchdog23MonitChannels(ADC_Module* ADCx, uint8_t AWDG_RegEnOffset); +void ADC_SetAnalogWatchdog23IntConfig(ADC_Module* ADCx, uint8_t AWDG_RegIntEnOffset, uint32_t AWDG_ChannelEn); +uint32_t ADC_GetAnalogWatchdog23IntConfig(ADC_Module* ADCx, uint8_t AWDG_RegEnOffset); +uint32_t ADC_GetAnalogWatchdog23StatusFlag(ADC_Module* ADCx, uint8_t AWDG_RegSTSOffset); +void ADC_ClearAnalogWatchdog23StatusFlag(ADC_Module* ADCx, uint8_t AWDG_RegSTSOffset, uint32_t AWDG_ChannelFlag); +void ADC_EnableAnalogWatchdogEventToTIM(ADC_Module* ADCx, ADC_AWDG Awdg, FunctionalState Cmd); + +FlagStatus ADC_GetFlagStatus(ADC_Module* ADCx, uint32_t ADC_FLAG); +void ADC_ClearFlag(ADC_Module* ADCx, uint32_t ADC_FLAG); +void ADC_ConfigInt(ADC_Module* ADCx, uint32_t ADC_IT, FunctionalState Cmd); +INTStatus ADC_GetIntStatus(ADC_Module* ADCx, uint32_t ADC_IT); +void ADC_ClearIntPendingBit(ADC_Module* ADCx, uint32_t ADC_IT); + +void ADC_SetChannelSingleDiff(ADC_Module* ADCx, uint32_t Channel, uint32_t SingleDiff); + +void ADC_SetConvResultBitNum(ADC_Module* ADCx, uint32_t ResultBitNum); +void ADC_SelectClockMode(ADC_Module* ADCx, uint32_t ClockMode); +void ADC_SetBypassCalibration(ADC_Module* ADCx, FunctionalState Cmd); +void ADC_EnableBatteryVoltageMonitor(FunctionalState Cmd); + +/*functions related to oversampling */ +void ADC_ConfigOverSamplingRatioAndShift(ADC_Module *ADCx, uint32_t Ratio, uint32_t Shift); +void ADC_SetOverSamplingScope(ADC_Module *ADCx, uint32_t OversampleScope); +void ADC_EnableOverSamplingDiscont(ADC_Module *ADCx, FunctionalState Cmd); +void ADC_SetOffsetConfig(ADC_Module* ADCx, uint8_t ADC_Offset, ADC_OffsetType* ADC_OffsetStruct); +void ADC_GetOffsetConfig(ADC_Module* ADCx, uint8_t ADC_Offset, ADC_OffsetType* ADC_OffsetStruct); +void ADC_SetGainCompensation(ADC_Module *ADCx, uint32_t GainCompensationMode, uint32_t GainCompensationValue); + +/*functions related to FIFO operations*/ +void ADC_ClearFIFO(ADC_Module* ADCx); +void ADC_EnableFIFO(ADC_Module* ADCx, FunctionalState Cmd); +uint8_t ADC_GetFIFOInvalidedDataCount(ADC_Module* ADCx); +FlagStatus ADC_GetFIFOFlagStatus(ADC_Module* ADCx, uint16_t ADC_FIFOFLAG); +void ADC_ClearFIFOFlag(ADC_Module* ADCx, uint16_t ADC_FIFO_FLAG); +void ADC_ConfigFIFOWaterLevel(ADC_Module* ADCx, uint32_t FIFO_Level); +void ADC_ConfigFIFOInt(ADC_Module* ADCx, uint16_t ADC_FIFO_IT, FunctionalState Cmd); +void ADC_ClearFIFOIntPendingBit(ADC_Module* ADCx, uint16_t ADC_FIFO_IT); + +//ErrorStatus ADC_ReadDataFromInternalReg(ADC_Module* ADCx, uint8_t Addr, uint16_t *ReadOutData); +//ErrorStatus ADC_WriteDataIntoInternalReg(ADC_Module* ADCx, uint8_t Addr, uint8_t Data); + +void ADC_ConfigClk(ADC_Module* ADCx, ADC_CTRL3_CKMOD ADC_ClkMode, uint32_t Pll_CLK_source, uint32_t RCC_ADCPrescaler); + +#ifdef __cplusplus +} +#endif + +#endif /*__N32H76X_78X_ADC_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_comp.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_comp.h new file mode 100644 index 0000000000..37c5959dba --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_comp.h @@ -0,0 +1,330 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_comp.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_COMP_H__ +#define __N32H76X_78X_COMP_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" +#include + + +/** COMP_Exported_Types **/ + +typedef enum +{ + COMP1 = 0, + COMP2 = 1, + COMP3 = 2, + COMP4 = 3 +} COMPX; + + +typedef enum { + COMPX_CTRL_INMSEL_RES = (0x7U << 1), + /*comp1 inm sel*/ + COMP1_CTRL_INMSEL_PB1 = (0x0U << 1), + COMP1_CTRL_INMSEL_PC4 = (0x1U << 1), + COMP1_CTRL_INMSEL_DAC1_IOUT = (0x2U << 1), + COMP1_CTRL_INMSEL_DAC2_IOUT = (0x3U << 1), + COMP1_CTRL_INMSEL_DAC3_IOUT = (0x4U << 1), + COMP1_CTRL_INMSEL_DAC4_IOUT = (0x5U << 1), + COMP1_CTRL_INMSEL_DAC5_IOUT = (0x6U << 1), + COMP1_CTRL_INMSEL_DAC6_IOUT = (0x7U << 1), + COMP1_CTRL_INMSEL_VREF1 = (0x8U << 1), + COMP1_CTRL_INMSEL_PF3 = (0x9U << 1), + /*comp2 inm sel*/ + COMP2_CTRL_INMSEL_PE7 = (0x0U << 1), + COMP2_CTRL_INMSEL_PE10 = (0x1U << 1), + COMP2_CTRL_INMSEL_DAC1_IOUT = (0x2U << 1), + COMP2_CTRL_INMSEL_DAC2_IOUT = (0x3U << 1), + COMP2_CTRL_INMSEL_DAC3_IOUT = (0x4U << 1), + COMP2_CTRL_INMSEL_DAC4_IOUT = (0x5U << 1), + COMP2_CTRL_INMSEL_DAC5_IOUT = (0x6U << 1), + COMP2_CTRL_INMSEL_DAC6_IOUT = (0x7U << 1), + COMP2_CTRL_INMSEL_VREF2 = (0x8U << 1), + COMP2_CTRL_INMSEL_PF6 = (0x9U << 1), + /*comp3 inm sel*/ + COMP3_CTRL_INMSEL_PF1 = (0x0U << 1), + COMP3_CTRL_INMSEL_PF14 = (0x1U << 1), + COMP3_CTRL_INMSEL_DAC1_IOUT = (0x2U << 1), + COMP3_CTRL_INMSEL_DAC2_IOUT = (0x3U << 1), + COMP3_CTRL_INMSEL_DAC3_IOUT = (0x4U << 1), + COMP3_CTRL_INMSEL_DAC4_IOUT = (0x5U << 1), + COMP3_CTRL_INMSEL_DAC5_IOUT = (0x6U << 1), + COMP3_CTRL_INMSEL_DAC6_IOUT = (0x7U << 1), + + /*comp4 inm sel*/ + COMP4_CTRL_INMSEL_PH9 = (0x0U << 1), + COMP4_CTRL_INMSEL_PH6 = (0x1U << 1), + COMP4_CTRL_INMSEL_DAC1_IOUT = (0x2U << 1), + COMP4_CTRL_INMSEL_DAC2_IOUT = (0x3U << 1), + COMP4_CTRL_INMSEL_DAC3_IOUT = (0x4U << 1), + COMP4_CTRL_INMSEL_DAC4_IOUT = (0x5U << 1), + COMP4_CTRL_INMSEL_DAC5_IOUT = (0x6U << 1), + COMP4_CTRL_INMSEL_DAC6_IOUT = (0x7U << 1), + COMP4_CTRL_INMSEL_PH8 = (0x8U << 1) +}COMP_CTRL_INMSEL; + +typedef enum { + COMPX_CTRL_INPSEL_RES = (0xFU << 5), + /*comp1 inp sel*/ + COMP1_CTRL_INPSEL_PB0 = (0x0U << 5), + COMP1_CTRL_INPSEL_PB2 = (0x1U << 5), + COMP1_CTRL_INPSEL_DAC1_IOUT = (0x2U << 5), + COMP1_CTRL_INPSEL_DAC2_IOUT = (0x3U << 5), + COMP1_CTRL_INPSEL_DAC3_IOUT = (0x4U << 5), + COMP1_CTRL_INPSEL_DAC4_IOUT = (0x5U << 5), + COMP1_CTRL_INPSEL_DAC5_IOUT = (0x6U << 5), + COMP1_CTRL_INPSEL_DAC6_IOUT = (0x7U << 5), + COMP1_CTRL_INPSEL_VREF1 = (0x8U << 5), + COMP1_CTRL_INPSEL_PF5 = (0x9U << 5), + /*comp2 inp sel*/ + COMP2_CTRL_INPSEL_PE9 = (0x0U << 5), + COMP2_CTRL_INPSEL_PE11 = (0x1U << 5), + COMP2_CTRL_INPSEL_DAC1_IOUT = (0x2U << 5), + COMP2_CTRL_INPSEL_DAC2_IOUT = (0x3U << 5), + COMP2_CTRL_INPSEL_DAC3_IOUT = (0x4U << 5), + COMP2_CTRL_INPSEL_DAC4_IOUT = (0x5U << 5), + COMP2_CTRL_INPSEL_DAC5_IOUT = (0x6U << 5), + COMP2_CTRL_INPSEL_DAC6_IOUT = (0x7U << 5), + COMP2_CTRL_INPSEL_VREF2 = (0x8U << 5), + COMP2_CTRL_INPSEL_PB2 = (0x9U << 5), + COMP2_CTRL_INPSEL_PF7 = (0xAU << 5), + /*comp3 inp sel*/ + COMP3_CTRL_INPSEL_PF2 = (0x0U << 5), + COMP3_CTRL_INPSEL_PF15 = (0x1U << 5), + COMP3_CTRL_INPSEL_DAC1_IOUT = (0x2U << 5), + COMP3_CTRL_INPSEL_DAC2_IOUT = (0x3U << 5), + COMP3_CTRL_INPSEL_DAC3_IOUT = (0x4U << 5), + COMP3_CTRL_INPSEL_DAC4_IOUT = (0x5U << 5), + COMP3_CTRL_INPSEL_DAC5_IOUT = (0x6U << 5), + COMP3_CTRL_INPSEL_DAC6_IOUT = (0x7U << 5), + + /*comp4 inp sel*/ + COMP4_CTRL_INPSEL_PH10 = (0x0U << 5), + COMP4_CTRL_INPSEL_PH7 = (0x1U << 5), + COMP4_CTRL_INPSEL_DAC1_IOUT = (0x2U << 5), + COMP4_CTRL_INPSEL_DAC2_IOUT = (0x3U << 5), + COMP4_CTRL_INPSEL_DAC3_IOUT = (0x4U << 5), + COMP4_CTRL_INPSEL_DAC4_IOUT = (0x5U << 5), + COMP4_CTRL_INPSEL_DAC5_IOUT = (0x6U << 5), + COMP4_CTRL_INPSEL_DAC6_IOUT = (0x7U << 5), + COMP4_CTRL_INPSEL_PF15 = (0x8U << 5), + COMP4_CTRL_INPSEL_PF10 = (0x9U << 5) +}COMP_CTRL_INPSEL; + +/*comp hysteresis level select*/ +typedef enum +{ + COMP_CTRL_HYST_NO = (0x0U << 14), + COMP_CTRL_HYST_LOW = (0x1U << 14), + COMP_CTRL_HYST_MID = (0x2U << 14), + COMP_CTRL_HYST_HIGH = (0x3U << 14) +} COMP_CTRL_HYST; + +/*comp Blking source select*/ +typedef enum +{ + COMP_CTRL_BLKING_NO = (0x0U << 16 ), + COMP_CTRL_BLKING_ATIM1_OC5 = (0x0U << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_GTIMB1_OC5 = (0x1U << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_GTIMB2_OC5 = (0x2U << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_ATIM2_OC5 = (0x3U << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_ATIM3_OC5 = (0x4U << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_ATIM4_OC1 = (0x5U << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_GTIMB3_OC5 = (0x6U << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_GTIMA4_OC5 = (0x7U << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_GTIMA2_OC3 = (0x8U << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_GTIMA1_OC3 = (0x9U << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_GTIMA3_OC3 = (0xAU << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_GTIMA5_OC3 = (0xBU << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_GTIMA6_OC3 = (0xCU << 16 | COMP1_CTRL_BLKINGEN), + COMP_CTRL_BLKING_GTIMA7_OC3 = (0xDU << 16 | COMP1_CTRL_BLKINGEN) +} COMP_CTRL_BLKING; + +/** COMP_Exported_Constants **/ + +/** COMPx_CTRL **/ +#define COMP_CTRL_OUT_MASK (COMP1_CTRL_OUT) + +#define COMP_CTRL_BLKING_MASK (COMP1_CTRL_BLKING | COMP1_CTRL_BLKINGEN) + +#define COMP_CTRL_HYST_MASK (COMP1_CTRL_HYST) + +#define COMP_POL_MASK (COMP1_CTRL_POL) +#define COMP_OUTPOL_FLIP (COMP1_CTRL_POL) +#define COMP_OUTPOL_NFLIP (0x00000000U) + +#define COMP_CTRL_INPSEL_MASK (COMP1_CTRL_INPSEL) /*MAX INPSEL BIT.*/ + +#define COMP_CTRL_INMSEL_MASK (COMP1_CTRL_INMSEL) /*MAX INMSEL BIT.*/ + +#define COMP_CTRL_EN_MASK (COMP1_CTRL_EN) + +/** COMPx_FILC **/ + +#define COMP_VFLAG_P (COMP1_FILC_VP_FLAG) /*using DAC stable value as Comparator's positive input.*/ +#define COMP_VFLAG_N (COMP1_FILC_VN_FLAG) /*using DAC stable value as Comparator's negetive input.*/ +#define COMP_FILC_SAMPW_MASK (COMP1_FILC_SAMPW) /*Low filter sample window size. Number of samples to monitor is SAMPWIN+1.*/ +#define COMP_FILC_THRESH_MASK (COMP1_FILC_THRESH)/*For proper operation, the value of THRESH must be greater than SAMPWIN / 2.*/ +#define COMP_FILC_FILEN_MASK (COMP1_FILC_FILEN) /*Filter enable.*/ + +/** COMPx_FILP **/ +#define COMP_FILCLKCR_CLKPSC_MASK (COMP1_FILP_CLKPSC)/*Low filter sample clock prescale. Number of system clocks between samples = CLK_PRE_CYCLE + 1, e.g.*/ + + +/** COMP_LPMODE **/ +#define COMP_LPMODE_LP_EN_MASK (COMP_LPR_CLKSEL) + +/** COMP_WINMODE **/ +#define COMP_WINMODE_CMPMD_MSK (COMP_WINMODE_COMP12MD|COMP_WINMODE_COMP34MD) +#define COMP_WINMODE_CMP34MD (COMP_WINMODE_COMP34MD)/* Comparators 3 and 4 can be used in window mode.*/ +#define COMP_WINMODE_CMP12MD (COMP_WINMODE_COMP12MD)/* Comparators 1 and 2 can be used in window mode.*/ + +/** COMP_LOCK **/ +#define COMP_LOCK_MSK (COMP_LOCK) +#define COMP1_LOCK (COMP_LOCK_CMP1LK) +#define COMP2_LOCK (COMP_LOCK_CMP2LK) +#define COMP3_LOCK (COMP_LOCK_CMP3LK) +#define COMP4_LOCK (COMP_LOCK_CMP4LK) + +/** COMP_INTEN **/ +#define COMP_INTIEN_MSK (COMP_INTEN) +#define COMP1_INTEN (COMP_INTEN_CMP1IEN) +#define COMP2_INTEN (COMP_INTEN_CMP2IEN) +#define COMP3_INTEN (COMP_INTEN_CMP3IEN) +#define COMP4_INTEN (COMP_INTEN_CMP4IEN) + +/** COMP_INTSTS **/ +#define COMP_INTSTS_MSK (COMP_INTSTS) +#define COMP1_INTSTS (COMP_INTSTS_COMP1IS) +#define COMP2_INTSTS (COMP_INTSTS_COMP2IS) +#define COMP3_INTSTS (COMP_INTSTS_COMP3IS) +#define COMP4_INTSTS (COMP_INTSTS_COMP4IS) + +/** COMP_VREFSCL **/ +#define COMP_VREFSCL_VVEN_MSK (COMP1_CTRL_VV1EN) +#define COMP_VREFSCL_VVTRM_MSK (COMP1_CTRL_VV1TRM) /** Vref Voltage scaler triming value. **/ + +/** COMP_OTIMEN **/ +#define COMP_TIM_EN_MSK (COMP_OTIMEN_MASK) +#define COMP1_TIM_EN (COMP_OTIMEN_CMP1OEN) +#define COMP2_TIM_EN (COMP_OTIMEN_CMP2OEN) +#define COMP3_TIM_EN (COMP_OTIMEN_CMP3OEN) +#define COMP4_TIM_EN (COMP_OTIMEN_CMP4OEN) + +/** COMP Init structure definition **/ +typedef struct +{ + COMP_CTRL_BLKING Blking; + + COMP_CTRL_HYST Hyst; + + FunctionalState PolRev; /* out polarity reverse */ + + COMP_CTRL_INPSEL InpSel; + COMP_CTRL_INMSEL InmSel; + + FunctionalState En; /* COMP enable */ + + /* filter config */ + uint8_t SampWindow; /* 5bit */ + uint8_t Threshold; /* 5bit need > SampWindow/2 */ + FunctionalState FilterEn; + + /* filter psc config */ + uint16_t ClkPsc; +} COMP_InitType; + + +/** COMP_Exported_Functions **/ +void COMP_DeInit(void); +void COMP_StructInit(COMP_InitType* COMP_InitStruct); +void COMP_Init(COMPX COMPx, COMP_InitType* COMP_InitStruct); + +void COMP_Enable(COMPX COMPx, FunctionalState Cmd); +void COMP_SetInpSel(COMPX COMPx, COMP_CTRL_INPSEL VpSel); +void COMP_SetInmSel(COMPX COMPx, COMP_CTRL_INMSEL VmSel); +void COMP_SetHyst(COMPX COMPx , COMP_CTRL_HYST HYST); +void COMP_SetBlanking(COMPX COMPx , COMP_CTRL_BLKING BLK); + +void COMP_SetFilterPrescaler(COMPX COMPx , uint16_t FilPreVal); +void COMP_SetFilterControl(COMPX COMPx , uint8_t FilEn, uint8_t TheresNum , uint8_t SampPW); +void COMP_EnableVflag(COMPX COMPx, uint32_t InputMode, FunctionalState Cmd); + +FlagStatus COMP_GetOutStatus(COMPX COMPx); +FlagStatus COMP_GetFilterOutStatus(COMPX COMPx); + +void COMP_SetLowPowerMode(FunctionalState Cmd); +void COMP_WindowModeEnable(uint32_t WinModeEn, FunctionalState Cmd); +void COMP_SetLock(uint32_t Lock); +void COMP_SetIntEn(uint32_t IntEn, FunctionalState Cmd); + +FlagStatus COMP_GetIntStsOneComp(COMPX COMPx); +void COMP_ClearIntStsOneComp(COMPX COMPx); + +void COMP_SetRefScl( uint8_t Vv2Trim, bool Vv2En, uint8_t Vv1Trim, bool Vv1En); +void COMP_OutToTimEnable(uint32_t TimEn, FunctionalState Cmd); + +#ifdef __cplusplus +} +#endif + +#endif /*__N32H76X_78X_COMP_H__ */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_cordic.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_cordic.h new file mode 100644 index 0000000000..eda862761e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_cordic.h @@ -0,0 +1,236 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_cordic.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_CORDIC_H__ +#define __N32H76X_78X_CORDIC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + + +/*** CORDIC Structure Definition Start ***/ + +/** CORDIC initialize configuration structure definition **/ +typedef struct +{ + uint32_t Function; /* Select function */ + uint32_t Precision; /* Set the number of iterations */ + uint32_t Scale; /* Select Scaling Factor */ + uint32_t NbWrite; /* Select the number of CORDIC_WDAT register to write */ + uint32_t NbRead; /* Select the number of CORDIC_RDAT register to read */ + uint32_t InSize; /* Select input data width */ + uint32_t OutSize; /* Select output data width */ + uint32_t InSelect; /* Select floating-point input or fixed-point input */ + uint32_t OutSelect; /* Select floating-point output or fixed-point output */ + uint32_t CodinLimit; /* Enables or disables Coordinate Limit */ + uint32_t PhaseLimit; /* Enables or disables Phase Limit */ +} CORDIC_InitType; + +/*** CORDIC Structure Definition End ***/ + + +/*** CORDIC Macro Definition Start ***/ + +/** CORDIC Coordinate Limit definition **/ +#define CORDIC_CODIN_LIMIT_ENABLE (CORDIC_CTRLSTS_CODINLIMIT) /* Coordinate Output Limit enable */ +#define CORDIC_CODIN_LIMIT_DISABLE ((uint32_t)0x00000000U) /* Coordinate Output Limit disable */ + +/** CORDIC Phase Limit definition **/ +#define CORDIC_PHASE_LIMIT_ENABLE (CORDIC_CTRLSTS_PHASELIMIT) /* Phase Output Limit enable */ +#define CORDIC_PHASE_LIMIT_DISABLE ((uint32_t)0x00000000U) /* Phase Output Limit disable */ + +/** CORDIC Output Select definition **/ +#define CORDIC_OUTPUT_FLOAT (CORDIC_CTRLSTS_FLOATOUT) /* Floating-point Output */ +#define CORDIC_OUTPUT_FIX ((uint32_t)0x00000000U) /* Fixed-point Output */ + +/** CORDIC Input Select definition **/ +#define CORDIC_INPUT_FLOAT (CORDIC_CTRLSTS_FLOATIN) /* Floating-point Input */ +#define CORDIC_INPUT_FIX ((uint32_t)0x00000000U) /* Fixed-point Input */ + +/** CORDIC Output width definition **/ +#define CORDIC_OUTSIZE_16BITS (CORDIC_CTRLSTS_OUTSIZE) /* 16 bits output data size (e.g:Q1.15 format) */ +#define CORDIC_OUTSIZE_32BITS ((uint32_t)0x00000000U) /* 32 bits output data size (e.g:Q1.31 format) */ + +/** CORDIC Input width definition **/ +#define CORDIC_INSIZE_16BITS (CORDIC_CTRLSTS_INSIZE) /* 16 bits input data size (e.g:Q1.15 format) */ +#define CORDIC_INSIZE_32BITS ((uint32_t)0x00000000U) /* 32 bits input data size (e.g:Q1.31 format) */ + +/** CORDIC Read register Number definition **/ +#define CORDIC_NBREAD_2 (CORDIC_CTRLSTS_NUMREAD) /* Two 32-bit Data containing two 32-bits + data output (e.g:Q1.31 format) */ +#define CORDIC_NBREAD_1 ((uint32_t)0x00000000U) /* One 32-bits read containing either only one \ + 32-bit data output (e.g:Q1.31 format), or two \ + 16-bit data output (e.g:Q1.15 format) packed \ + in one 32 bits Data */ + +/** CORDIC Write register Number definition **/ +#define CORDIC_NBWRITE_2 (CORDIC_CTRLSTS_NUMWRITE) /* Two 32-bit write containing two 32-bits \ + data input (e.g:Q1.31 format) */ +#define CORDIC_NBWRITE_1 ((uint32_t)0x00000000U) /* One 32-bits write containing either only one \ + 32-bit data input (e.g:Q1.31 format), or two \ + 16-bit data input (e.g:Q1.15 format) packed \ + in one 32 bits Data */ + +/** CORDIC Scaling Factor definition **/ +#define CORDIC_SCALE_0 ( (uint32_t)0x00000000U) /* Scaling Factor is 2^0 */ +#define CORDIC_SCALE_1 ( CORDIC_CTRLSTS_SCALE_0 ) /* Scaling Factor is 2^1 */ +#define CORDIC_SCALE_2 ( CORDIC_CTRLSTS_SCALE_1 ) /* Scaling Factor is 2^2 */ +#define CORDIC_SCALE_3 ( CORDIC_CTRLSTS_SCALE_1 \ + | CORDIC_CTRLSTS_SCALE_0 ) /* Scaling Factor is 2^3 */ +#define CORDIC_SCALE_4 ( CORDIC_CTRLSTS_SCALE_2 ) /* Scaling Factor is 2^4 */ +#define CORDIC_SCALE_5 ( CORDIC_CTRLSTS_SCALE_2 \ + | CORDIC_CTRLSTS_SCALE_0 ) /* Scaling Factor is 2^5 */ +#define CORDIC_SCALE_6 ( CORDIC_CTRLSTS_SCALE_2 \ + | CORDIC_CTRLSTS_SCALE_1 ) /* Scaling Factor is 2^6 */ +#define CORDIC_SCALE_7 ( CORDIC_CTRLSTS_SCALE_2 \ + | CORDIC_CTRLSTS_SCALE_1 \ + | CORDIC_CTRLSTS_SCALE_0 ) /* Scaling Factor is 2^7 */ + +/** CORDIC Precision(Number of iterations) definition **/ +#define CORDIC_PRECISION_1CYCLE ( CORDIC_CTRLSTS_PRECISION_0 ) /* Iteration Count is 1*4*/ +#define CORDIC_PRECISION_2CYCLES ( CORDIC_CTRLSTS_PRECISION_1 ) /* Iteration Count is 2*4*/ +#define CORDIC_PRECISION_3CYCLES ( CORDIC_CTRLSTS_PRECISION_1 \ + | CORDIC_CTRLSTS_PRECISION_0 ) /* Iteration Count is 3*4*/ +#define CORDIC_PRECISION_4CYCLES ( CORDIC_CTRLSTS_PRECISION_2 ) /* Iteration Count is 4*4*/ +#define CORDIC_PRECISION_5CYCLES ( CORDIC_CTRLSTS_PRECISION_2 \ + | CORDIC_CTRLSTS_PRECISION_0 ) /* Iteration Count is 5*4*/ +#define CORDIC_PRECISION_6CYCLES ( CORDIC_CTRLSTS_PRECISION_2 \ + | CORDIC_CTRLSTS_PRECISION_1 ) /* Iteration Count is 6*4*/ +#define CORDIC_PRECISION_7CYCLES ( CORDIC_CTRLSTS_PRECISION_2 \ + | CORDIC_CTRLSTS_PRECISION_1 \ + | CORDIC_CTRLSTS_PRECISION_0 ) /* Iteration Count is 7*4*/ +#define CORDIC_PRECISION_8CYCLES ( CORDIC_CTRLSTS_PRECISION_3 ) /* Iteration Count is 8*4*/ +#define CORDIC_PRECISION_9CYCLES ( CORDIC_CTRLSTS_PRECISION_3 \ + | CORDIC_CTRLSTS_PRECISION_0 ) /* Iteration Count is 9*4*/ +#define CORDIC_PRECISION_10CYCLES ( CORDIC_CTRLSTS_PRECISION_3 \ + | CORDIC_CTRLSTS_PRECISION_1 ) /* Iteration Count is 10*4*/ +#define CORDIC_PRECISION_11CYCLES ( CORDIC_CTRLSTS_PRECISION_3 \ + | CORDIC_CTRLSTS_PRECISION_1 \ + | CORDIC_CTRLSTS_PRECISION_0 ) /* Iteration Count is 11*4*/ +#define CORDIC_PRECISION_12CYCLES ( CORDIC_CTRLSTS_PRECISION_3 \ + | CORDIC_CTRLSTS_PRECISION_2 ) /* Iteration Count is 12*4*/ +#define CORDIC_PRECISION_13CYCLES ( CORDIC_CTRLSTS_PRECISION_3 \ + | CORDIC_CTRLSTS_PRECISION_2 \ + | CORDIC_CTRLSTS_PRECISION_0 ) /* Iteration Count is 13*4*/ +#define CORDIC_PRECISION_14CYCLES ( CORDIC_CTRLSTS_PRECISION_3 \ + | CORDIC_CTRLSTS_PRECISION_2 \ + | CORDIC_CTRLSTS_PRECISION_1 ) /* Iteration Count is 14*4*/ +#define CORDIC_PRECISION_15CYCLES ( CORDIC_CTRLSTS_PRECISION_3 \ + | CORDIC_CTRLSTS_PRECISION_2 \ + | CORDIC_CTRLSTS_PRECISION_1 \ + | CORDIC_CTRLSTS_PRECISION_0 ) /* Iteration Count is 15*4*/ + +/** CORDIC Function definition **/ +#define CORDIC_FUNCTION_COSINE ((uint32_t)0x00000000U) /* Cosine */ +#define CORDIC_FUNCTION_SINE ( CORDIC_CTRLSTS_FUNC_0 ) /* Sine */ +#define CORDIC_FUNCTION_PHASE ( CORDIC_CTRLSTS_FUNC_1 ) /* Phase */ +#define CORDIC_FUNCTION_MODULUS ( CORDIC_CTRLSTS_FUNC_1 \ + | CORDIC_CTRLSTS_FUNC_0 ) /* Modulus */ +#define CORDIC_FUNCTION_ARCTANGENT ( CORDIC_CTRLSTS_FUNC_2 ) /* Arctangent */ +#define CORDIC_FUNCTION_HCOSINE ( CORDIC_CTRLSTS_FUNC_2 \ + | CORDIC_CTRLSTS_FUNC_0 ) /* Hyperbolic Cosine */ +#define CORDIC_FUNCTION_HSINE ( CORDIC_CTRLSTS_FUNC_2 \ + | CORDIC_CTRLSTS_FUNC_1 ) /* Hyperbolic Sine */ +#define CORDIC_FUNCTION_HARCTANGENT ( CORDIC_CTRLSTS_FUNC_2 \ + | CORDIC_CTRLSTS_FUNC_1 \ + | CORDIC_CTRLSTS_FUNC_0 ) /* Hyperbolic Arctangent */ +#define CORDIC_FUNCTION_NATURALLOG ( CORDIC_CTRLSTS_FUNC_3 ) /* Natural Logarithm */ +#define CORDIC_FUNCTION_SQUAREROOT ( CORDIC_CTRLSTS_FUNC_3 \ + | CORDIC_CTRLSTS_FUNC_0 ) /* Square Root */ + +/** CORDIC Interrupt definition **/ +#define CORDIC_INT (CORDIC_CTRLSTS_INTEN) /* Result Ready Interrupt Enable */ +#define CORDIC_INT_INOVERFLOW (CORDIC_CTRLSTS_INOVINTEN) /* Input overflow Interrupt Enable */ + +/** CORDIC on DMA transfer direction definition **/ +#define CORDIC_AS_DMA_DSTADDR ((uint32_t)0x00000001U) /* CORDIC register address as Destination address for DMA */ +#define CORDIC_AS_DMA_SRCADDR ((uint32_t)0x00000000U) /* CORDIC register address as Source address for DMA */ + +/** CORDIC flag definition **/ +#define CORDIC_FLAG_RRF (CORDIC_CTRLSTS_RRF) /* Result ready flag */ +#define CORDIC_FLAG_INOVF (CORDIC_CTRLSTS_INOVF) /* Input parameter overflow flag */ +#define CORDIC_FLAG_DMAWENF (CORDIC_CTRLSTS_DMAWEN) /* DMA Write Request Enable Flag */ +#define CORDIC_FLAG_DMARENF (CORDIC_CTRLSTS_DMAREN) /* DMA Read Request Enable Flag */ +#define CORDIC_FLAG_INTENF (CORDIC_CTRLSTS_INTEN) /* CORDIC Interrupt Enable Flag */ +#define CORDIC_FLAG_INOVINTENF (CORDIC_CTRLSTS_INOVINTEN) /* CORDIC Overflow Interrupt Enable Flag */ + +/*** CORDIC Macro Definition End ***/ + +/*** CORDIC Driving Functions Declaration ***/ +void CORDIC_DeInit(void); +void CORDIC_Init(CORDIC_InitType* CORDIC_InitParam); +void CORDIC_StructInit(CORDIC_InitType* CORDIC_InitParam); +void CORDIC_InterruptCmd(uint32_t Interrupt, FunctionalStatus Cmd); +void CORDIC_DMAReadRequestCmd(FunctionalStatus Cmd); +void CORDIC_DMAWriteRequestCmd(FunctionalStatus Cmd); +uint32_t CORDIC_GetRegisterAddr(uint32_t Direction); +void CORDIC_WriteData(uint32_t *pInData); +void CORDIC_ReadData(uint32_t *pOutData); +FlagStatus CORDIC_GetFlagStatus(uint32_t Flag); +void CORDIC_ClearStatusFlag(uint32_t Flag); + +/*** CORDIC Driving Functions Declaration End ***/ + + + +#ifdef __cplusplus +} +#endif + +#endif /*__N32H76X_78X_CORDIC_H__ */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_crc.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_crc.h new file mode 100644 index 0000000000..7c9f827f11 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_crc.h @@ -0,0 +1,160 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_crc.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76x_78x_CRC_H__ +#define __N32H76x_78x_CRC_H__ + +/* C binding of definitions if building with C++ compiler */ +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "n32h76x_78x.h" + +typedef struct +{ + uint32_t GeneratingPolynomial; /* Set CRC generating polynomial as a 7, 8, 16 or 32-bit long value for a polynomial degree + respectively equal to 7, 8, 16 or 32. This field is written in normal, + representation e.g., for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 + is written 0x65. */ + uint32_t CRCLength; /* This parameter is a value of ref CRC_Polynomial_Sizes and indicates CRC length. + Value can be either one of + arg ref CRC_POLYLENGTH_32B (32-bit CRC), + arg ref CRC_POLYLENGTH_16B (16-bit CRC), + arg ref CRC_POLYLENGTH_8B (8-bit CRC), + arg ref CRC_POLYLENGTH_7B (7-bit CRC). */ + uint32_t InitValue; /* Init value to initiate CRC computation. No need to specify it if DefaultInitValueUse + is set to DEFAULT_INIT_VALUE_ENABLE. */ + uint32_t InputDataByteInversionMode; /* This parameter is a value of ref CRC Input Data Byte Reverse and specifies input data byte inversion mode. + Can be either one of the following values + arg ref CRC_INDATA_BYTE_REVERSE_NONE no input data inversion + arg ref CRC_INDATA_BYTE_REVERSE_HALFWORD halfword-wise inversion,0x1A2B3C4D becomes 0x2B1A4D3C + arg ref CRC_INDATA_BYTE_REVERSE_WORD word-wise inversion, 0x1A2B3C4D becomes 0x4D3C2B1A */ + uint32_t InputDataBitInversionMode; /* This parameter is a value of ref CRC Input Data Bit Reverse and specifies input data inversion mode. + Can be either one of the following values + arg ref CRC_INDATA_BIT_REVERSE_NONE no input data inversion + arg ref CRC_INDATA_BIT_REVERSE_BYTE byte-wise inversion, 0x1A2B3C4D becomes 0x58D43CB2 + arg ref CRC_INDATA_BIT_REVERSE_HALFWORD halfword-wise inversion,0x1A2B3C4D becomes 0xD458B23C + arg ref CRC_INDATA_BIT_REVERSE_WORD word-wise inversion, 0x1A2B3C4D becomes 0xB23CD458 */ + uint32_t OutputDataInversionMode; /* This parameter is a value of ref CRC Output Data Reverse and specifies output data (i.e. CRC) inversion mode. + Can be either + arg ref CRC_OUTPUTDATA_INVERSION_DISABLE no CRC inversion, + arg ref CRC_OUTPUTDATA_INVERSION_ENABLE CRC 0x11223344 is converted into 0x22CC4488 */ + uint32_t InputDataXor; /* This parameter is used to set CRC_DR XOR calculation value before CRC calculation. */ + + uint32_t OutputDataXor; /* This parameter is used to set CRC_DR XOR calculation value after CRC calculation. */ +} CRC_InitType; + +/** CRC_Default_Polynomial_Value Default CRC generating polynomial **/ +#define DEFAULT_CRC32_POLY ((uint32_t)0x04C11DB7U) /* X^32 + X^26 + X^23 + X^22 + X^16 + X^12 + X^11 + X^10 +X^8 + X^7 + X^5 + X^4 + X^2+ X +1 */ + +/** CRC_Default_InitValue Default CRC computation initialization value */ +#define DEFAULT_CRC_INITVALUE ((uint32_t)0xFFFFFFFFU) /* Initial CRC default value */ + +/** CRC_Polynomial_Sizes Polynomial sizes to configure the peripheral */ +#define CRC_POLYLENGTH_32B ((uint32_t)0x00000000U) /* Resort to a 32-bit long generating polynomial */ +#define CRC_POLYLENGTH_16B (CRC_CTRL_POLYSIZE_0) /* Resort to a 16-bit long generating polynomial */ +#define CRC_POLYLENGTH_8B (CRC_CTRL_POLYSIZE_1) /* Resort to a 8-bit long generating polynomial */ +#define CRC_POLYLENGTH_7B (CRC_CTRL_POLYSIZE) /* Resort to a 7-bit long generating polynomial */ + +/** CRC Input Data Byte Reverse */ +#define CRC_INDATA_BYTE_REVERSE_NONE ((uint32_t)0x00000000U) /* Input Data Byte order not affected */ +#define CRC_INDATA_BYTE_REVERSE_HALFWORD (CRC_CTRL_BYTEENDIAN_1) /* Input Data Byte reversal done by half-word */ +#define CRC_INDATA_BYTE_REVERSE_WORD (CRC_CTRL_BYTEENDIAN) /* Input Data Byte reversal done by word */ + +/** CRC Input Data Bit Reverse */ +#define CRC_INDATA_BIT_REVERSE_NONE ((uint32_t)0x00000000U) /* Input Data bit order not affected */ +#define CRC_INDATA_BIT_REVERSE_BYTE (CRC_CTRL_REVIN_0) /* Input Data bit reversal done by byte */ +#define CRC_INDATA_BIT_REVERSE_HALFWORD (CRC_CTRL_REVIN_1) /* Input Data bit reversal done by half-word */ +#define CRC_INDATA_BIT_REVERSE_WORD (CRC_CTRL_REVIN_1 \ + |CRC_CTRL_REVIN_0) /* Input Data bit reversal done by word */ + +/** CRC Output Data Reverse */ +#define CRC_OUTDATA_REVERSE_NONE ((uint32_t)0x00000000U) /* Output Data bit order not affected */ +#define CRC_OUTDATA_REVERSE_BIT (CRC_CTRL_REVOUT) /* Output Data bit reversal done by bit */ + +/** CRC_Input_Buffer_Format Input Buffer Format */ +#define CRC_INPUTDATA_FORMAT_BYTES ((uint32_t)0x00000001U) /* Input data in byte format */ +#define CRC_INPUTDATA_FORMAT_HALFWORDS ((uint32_t)0x00000002U) /* Input data in half-word format */ +#define CRC_INPUTDATA_FORMAT_WORDS ((uint32_t)0x00000003U) /* Input data in word format */ + + +void CRC_ResetCalculation(void); +void CRC_DeInit(void); +void CRC_SetInputByteOrder(uint32_t ReverseMode); +void CRC_SetInputBitOrder(uint32_t ReverseMode); +void CRC_SetOutputBitOrder(uint32_t ReverseMode); +void CRC_SetInputDataXor(uint32_t xor_value); +void CRC_SetOutputDataXor(uint32_t xor_value); +void CRC_SetInitialData(uint32_t InitCrc); +void CRC_SetPolynomialCoef(uint32_t PolynomCoef); +void CRC_SetPolynomialSize(uint32_t PolySize); + +void CRC_StructInit(CRC_InitType *CRC_InitStruct); +void CRC_Init(CRC_InitType *CRC_InitStruct); +uint32_t CRC_Calculate(uint32_t InputDataFormat, void *pBuffer, uint32_t BufferLength); +uint32_t CRC_Accumulate(uint32_t InputDataFormat, void *pBuffer, uint32_t BufferLength); +uint32_t CRC_GetLRC(void); +uint32_t CRC_GetIDAT(void); +void CRC_WriteIDAT(uint32_t Idat); + + +#ifdef __cplusplus +} +#endif + +#endif /* __n32h76x_78x_CRC_H__ */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dac.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dac.h new file mode 100644 index 0000000000..a1a4e4dee3 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dac.h @@ -0,0 +1,346 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dac.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_DAC_H__ +#define __N32H76X_78X_DAC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/** DAC_Exported_Types **/ + +typedef enum +{ + DAC1 = 0, + DAC2 = 1, + DAC3 = 2, + DAC4 = 3, + DAC5 = 4, + DAC6 = 5 +} DACX; + +typedef struct +{ + uint32_t DAC_Trigger; + + uint32_t DAC_Trigger2; + + uint32_t DAC_WaveGeneration; + + uint32_t DAC_LFSRUnmask_TriangleAmplitude; + + FunctionalState DAC_OutputBuffer; /* Enable or disable the DAC output buffer */ + + FunctionalState DAC_TriggerEnable; /* Enable or disable the DAC external trigger ,when it is disable, it means Conversion is automatic once the DACx(y)_Dxxx register \ + has been loaded, and not by external trigger */ + + FunctionalState DAC_ConnectOnChipPeripheral ; /* Secifies whether the DAC output is connected or not to on chip peripheral */ + + FunctionalState DAC_ConnectExternalPin ; /* Secifies whether the DAC output is connected or not to external pin */ + + FunctionalState DAC_DMADoubleDataMode; /* Enable or disable DMA double data mode */ + + FunctionalState DAC_SignedFormat; /* Enable or disable signed format mode */ + +}DAC_InitType; + + +/** DAC_Exported_Constants **/ + +/** DAC_trigger **/ +#define DAC_Trigger_Software ((uint32_t)0x00000000U << 11) +#define DAC_Trigger_ATIM1_TRGO ((uint32_t)0x00000001U << 11) +#define DAC_Trigger_ATIM2_TRGO ((uint32_t)0x00000002U << 11) +#define DAC_Trigger_ATIM3_TRGO ((uint32_t)0x00000003U << 11) +#define DAC_Trigger_ATIM4_TRGO ((uint32_t)0x00000004U << 11) +#define DAC_Trigger_GTIMA1_TRGO ((uint32_t)0x00000005U << 11) +#define DAC_Trigger_GTIMA2_TRGO ((uint32_t)0x00000006U << 11) +#define DAC_Trigger_GTIMA3_TRGO ((uint32_t)0x00000007U << 11) +#define DAC_Trigger_GTIMA4_TRGO ((uint32_t)0x00000008U << 11) +#define DAC_Trigger_GTIMA5_TRGO ((uint32_t)0x00000009U << 11) +#define DAC_Trigger_GTIMA6_TRGO ((uint32_t)0x0000000AU << 11) +#define DAC_Trigger_GTIMA7_TRGO ((uint32_t)0x0000000BU << 11) +#define DAC_Trigger_GTIMB1_TRGO ((uint32_t)0x0000000CU << 11) +#define DAC_Trigger_GTIMB2_TRGO ((uint32_t)0x0000000DU << 11) +#define DAC_Trigger_GTIMB3_TRGO ((uint32_t)0x0000000EU << 11) +#define DAC_Trigger_EXTI5 ((uint32_t)0x0000000FU << 11) +#define DAC_Trigger_EXTI7 ((uint32_t)0x00000010U << 11) +#define DAC_Trigger_EXTI9 ((uint32_t)0x00000011U << 11) +#define DAC_Trigger_SHRTIM1_RST_TRG1 ((uint32_t)0x00000012U << 11) +#define DAC_Trigger_SHRTIM1_RST_TRG2 ((uint32_t)0x00000013U << 11) +#define DAC_Trigger_SHRTIM1_RST_TRG3 ((uint32_t)0x00000014U << 11) +#define DAC_Trigger_SHRTIM1_RST_TRG4 ((uint32_t)0x00000015U << 11) +#define DAC_Trigger_SHRTIM1_RST_TRG5 ((uint32_t)0x00000016U << 11) +#define DAC_Trigger_SHRTIM1_RST_TRG6 ((uint32_t)0x00000017U << 11) +#define DAC_Trigger_SHRTIM1_RST_TRGO123 ((uint32_t)0x00000018U << 11) +#define DAC_Trigger_SHRTIM2_RST_TRG1 ((uint32_t)0x00000019U << 11) +#define DAC_Trigger_SHRTIM2_RST_TRG2 ((uint32_t)0x0000001AU << 11) +#define DAC_Trigger_SHRTIM2_RST_TRG3 ((uint32_t)0x0000001BU << 11) +#define DAC_Trigger_SHRTIM2_RST_TRG4 ((uint32_t)0x0000001CU << 11) +#define DAC_Trigger_SHRTIM2_RST_TRG5 ((uint32_t)0x0000001DU << 11) +#define DAC_Trigger_SHRTIM2_RST_TRG6 ((uint32_t)0x0000001EU << 11) +#define DAC_Trigger_SHRTIM2_RST_TRGO123 ((uint32_t)0x0000001FU << 11) + +/** DAC_step_trigger **/ +#define DAC_Trigger2_Software ((uint32_t)0x00000000U << 1) +#define DAC_Trigger2_ATIM1_TRGO ((uint32_t)0x00000001U << 1) +#define DAC_Trigger2_ATIM2_TRGO ((uint32_t)0x00000002U << 1) +#define DAC_Trigger2_ATIM3_TRGO ((uint32_t)0x00000003U << 1) +#define DAC_Trigger2_ATIM4_TRGO ((uint32_t)0x00000004U << 1) +#define DAC_Trigger2_GTIMA1_TRGO ((uint32_t)0x00000005U << 1) +#define DAC_Trigger2_GTIMA2_TRGO ((uint32_t)0x00000006U << 1) +#define DAC_Trigger2_GTIMA3_TRGO ((uint32_t)0x00000007U << 1) +#define DAC_Trigger2_GTIMA4_TRGO ((uint32_t)0x00000008U << 1) +#define DAC_Trigger2_GTIMA5_TRGO ((uint32_t)0x00000009U << 1) +#define DAC_Trigger2_GTIMA6_TRGO ((uint32_t)0x0000000AU << 1) +#define DAC_Trigger2_GTIMA7_TRGO ((uint32_t)0x0000000BU << 1) +#define DAC_Trigger2_GTIMB1_TRGO ((uint32_t)0x0000000CU << 1) +#define DAC_Trigger2_GTIMB2_TRGO ((uint32_t)0x0000000DU << 1) +#define DAC_Trigger2_GTIMB3_TRGO ((uint32_t)0x0000000EU << 1) +#define DAC_Trigger2_EXTI6 ((uint32_t)0x0000000FU << 1) +#define DAC_Trigger2_EXTI8 ((uint32_t)0x00000010U << 1) +#define DAC_Trigger2_EXTI10 ((uint32_t)0x00000011U << 1) +#define DAC_Trigger2_SHRTIM1_STEP_TRG1 ((uint32_t)0x00000012U << 1) +#define DAC_Trigger2_SHRTIM1_STEP_TRG2 ((uint32_t)0x00000013U << 1) +#define DAC_Trigger2_SHRTIM1_STEP_TRG3 ((uint32_t)0x00000014U << 1) +#define DAC_Trigger2_SHRTIM1_STEP_TRG4 ((uint32_t)0x00000015U << 1) +#define DAC_Trigger2_SHRTIM1_STEP_TRG5 ((uint32_t)0x00000016U << 1) +#define DAC_Trigger2_SHRTIM1_STEP_TRG6 ((uint32_t)0x00000017U << 1) +#define DAC_Trigger2_SHRTIM2_STEP_TRG1 ((uint32_t)0x00000019U << 1) +#define DAC_Trigger2_SHRTIM2_STEP_TRG2 ((uint32_t)0x0000001AU << 1) +#define DAC_Trigger2_SHRTIM2_STEP_TRG3 ((uint32_t)0x0000001BU << 1) +#define DAC_Trigger2_SHRTIM2_STEP_TRG4 ((uint32_t)0x0000001CU << 1) +#define DAC_Trigger2_SHRTIM2_STEP_TRG5 ((uint32_t)0x0000001DU << 1) +#define DAC_Trigger2_SHRTIM2_STEP_TRG6 ((uint32_t)0x0000001EU << 1) + + +/** DAC_wave_generation **/ +#define DAC_WaveGeneration_None ((uint32_t)0x00000000U) +#define DAC_WaveGeneration_Noise ((uint32_t)DAC_CTRL_WxEN_0) +#define DAC_WaveGeneration_Triangle ((uint32_t)DAC_CTRL_WxEN_1) +#define DAC_WaveGeneration_SAWTOOTH_INC ((uint32_t)DAC_CTRL_WxEN_2) +#define DAC_WaveGeneration_SAWTOOTH_DEC ((uint32_t)DAC_CTRL_WxEN_2 | DAC_CTRL_WxEN_1) + +/** DAC_lfsrunmask_triangleamplitude **/ +#define DAC_LFSRUnmask_Bit0 ((uint32_t)0x00000000U << 6) /* Unmask DAC channel LFSR bit0 for noise wave generation */ +#define DAC_LFSRUnmask_Bits1_0 ((uint32_t)0x00000001U << 6) /* Unmask DAC channel LFSR bit[1:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits2_0 ((uint32_t)0x00000002U << 6) /* Unmask DAC channel LFSR bit[2:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits3_0 ((uint32_t)0x00000003U << 6) /* Unmask DAC channel LFSR bit[3:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits4_0 ((uint32_t)0x00000004U << 6) /* Unmask DAC channel LFSR bit[4:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits5_0 ((uint32_t)0x00000005U << 6) /* Unmask DAC channel LFSR bit[5:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits6_0 ((uint32_t)0x00000006U << 6) /* Unmask DAC channel LFSR bit[6:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits7_0 ((uint32_t)0x00000007U << 6) /* Unmask DAC channel LFSR bit[7:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits8_0 ((uint32_t)0x00000008U << 6) /* Unmask DAC channel LFSR bit[8:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits9_0 ((uint32_t)0x00000009U << 6) /* Unmask DAC channel LFSR bit[9:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits10_0 ((uint32_t)0x0000000AU << 6) /* Unmask DAC channel LFSR bit[10:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits11_0 ((uint32_t)0x0000000BU << 6) /* Unmask DAC channel LFSR bit[11:0] for noise wave generation */ +#define DAC_TriangleAmplitude_1 ((uint32_t)0x00000000U << 6) /* Select max triangle amplitude of 1 */ +#define DAC_TriangleAmplitude_3 ((uint32_t)0x00000001U << 6) /* Select max triangle amplitude of 3 */ +#define DAC_TriangleAmplitude_7 ((uint32_t)0x00000002U << 6) /* Select max triangle amplitude of 7 */ +#define DAC_TriangleAmplitude_15 ((uint32_t)0x00000003U << 6) /* Select max triangle amplitude of 15 */ +#define DAC_TriangleAmplitude_31 ((uint32_t)0x00000004U << 6) /* Select max triangle amplitude of 31 */ +#define DAC_TriangleAmplitude_63 ((uint32_t)0x00000005U << 6) /* Select max triangle amplitude of 63 */ +#define DAC_TriangleAmplitude_127 ((uint32_t)0x00000006U << 6) /* Select max triangle amplitude of 127 */ +#define DAC_TriangleAmplitude_255 ((uint32_t)0x00000007U << 6) /* Select max triangle amplitude of 255 */ +#define DAC_TriangleAmplitude_511 ((uint32_t)0x00000008U << 6) /* Select max triangle amplitude of 511 */ +#define DAC_TriangleAmplitude_1023 ((uint32_t)0x00000009U << 6) /* Select max triangle amplitude of 1023 */ +#define DAC_TriangleAmplitude_2047 ((uint32_t)0x0000000AU << 6) /* Select max triangle amplitude of 2047 */ +#define DAC_TriangleAmplitude_4095 ((uint32_t)0x0000000BU << 6) /* Select max triangle amplitude of 4095 */ + + +/** DAC_CTRL **/ +#define DACy_CTRL_TRIG_OVERLOCKIEN_EN_MASK ((uint32_t)DAC_CTRL_TROVCyIEN) +#define DACy_CTRL_OUTPUT_TO_EXTPIN_EN_MASK ((uint32_t)DAC_CTRL_EXOUTy) +#define DACy_CTRL_OUTPUT_TO_ONCHAIP_EN_MASK ((uint32_t)DAC_CTRL_INOUTy) +#define DACy_CTRL_CALIBATE_EN_MASK ((uint32_t)DAC_CTRL_CALyEN) +#define DACy_CTRL_WAVE_TYPE_MASK ((uint32_t)DAC_CTRL_WyEN) +#define DACy_CTRL_SINGFORMAT_EN_MASK ((uint32_t)DAC_CTRL_SINFORMATyEN) +#define DACy_CTRL_DMADOUBLEMODE_EN_MASK ((uint32_t)DAC_CTRL_DMADOUBLEyEN) +#define DACy_CTRL_HIGH_DRIVER_EN_MASK ((uint32_t)DAC_CTRL_HDByEN) +#define DACy_CTRL_DMA_UDRIEN_EN_MASK ((uint32_t)DAC_CTRL_DMAUDRyIEn) +#define DACy_CTRL_TRIGGER_EN_MASK ((uint32_t)DAC_CTRL_TyEN) +#define DACy_CTRL_BUFF_EN_MASK ((uint32_t)DAC_CTRL_ByEN) +#define DACy_CTRL_DMA_EN_MASK ((uint32_t)DAC_CTRL_DMAyEN) +#define DACy_CTRL_EN_MASK ((uint32_t)DAC_CTRL_DACyEN) + +#define DACx_CTRL_TRIG_OVERLOCKIEN_EN_MASK ((uint32_t)DAC_CTRL_TROVCxIEN) +#define DACx_CTRL_OUTPUT_TO_EXTPIN_EN_MASK ((uint32_t)DAC_CTRL_EXOUTx) +#define DACx_CTRL_OUTPUT_TO_ONCHAIP_EN_MASK ((uint32_t)DAC_CTRL_INOUTx) +#define DACx_CTRL_CALIBATE_EN_MASK ((uint32_t)DAC_CTRL_CALxEN) +#define DACx_CTRL_WAVE_TYPE_MASK ((uint32_t)DAC_CTRL_WxEN) +#define DACx_CTRL_SINGFORMAT_EN_MASK ((uint32_t)DAC_CTRL_SINFORMATxEN) +#define DACx_CTRL_DMADOUBLEMODE_EN_MASK ((uint32_t)DAC_CTRL_DMADOUBLExEN) +#define DACx_CTRL_HIGH_DRIVER_EN_MASK ((uint32_t)DAC_CTRL_HDBxEN) +#define DACx_CTRL_DMA_UDRIEN_EN_MASK ((uint32_t)DAC_CTRL_DMAUDRxIEn) +#define DACx_CTRL_TRIGGER_EN_MASK ((uint32_t)DAC_CTRL_TxEN) +#define DACx_CTRL_BUFF_EN_MASK ((uint32_t)DAC_CTRL_BxEN) +#define DACx_CTRL_DMA_EN_MASK ((uint32_t)DAC_CTRL_DMAxEN) +#define DACx_CTRL_EN_MASK ((uint32_t)DAC_CTRL_DACxEN) + +/** DAC_SOTT **/ +#define DACx_CTRL_TRIGxEN_MASK (DAC_SOTTR_TRxEN) +#define DACy_CTRL_TRIGyEN_MASK (DAC_SOTTR_TRyEN) +#define DACx_CTRL_TRIGxSTEPEN_MASK (DAC_SOTTR_TRBxEN) +#define DACy_CTRL_TRIGySTEPEN_MASK (DAC_SOTTR_TRByEN) + +#define DACx_CTRL_TRIGALLEN_MASK (DAC_SOTTR_TRxEN | DAC_SOTTR_TRyEN) +#define DACy_CTRL_TRIGALLSTEPEN_MASK (DAC_SOTTR_TRBxEN | DAC_SOTTR_TRByEN) + +/** DAC_SELCTRL **/ +#define DACx_SELCTRL_SINCSEL_MASK (DAC_SETCTRL_SINCSELx) +#define DACx_SELCTRL_MAxSEL_MASK (DAC_SETCTRL_MAxSEL) +#define DACx_SELCTRL_TxSEL_MASK (DAC_SETCTRL_TxSEL) + +#define DACy_SELCTRL_SINCSEL_MASK (DAC_SETCTRL_SINCSELy) +#define DACy_SELCTRL_MAySEL_MASK (DAC_SETCTRL_MAySEL) +#define DACy_SELCTRL_TySEL_MASK (DAC_SETCTRL_TySEL) + +/** DAC_GCTRL **/ +#define DAC_GCTRL_SYNSEL_MASK (DAC_GCTRL_SYNSEL) + +#define DAC12_GCTRL_PCS_MASK (DAC12_GCTRL_PCS) +#define DAC3456_GCTRL_PCS_MASK (DAC3456_GCTRL_PCS) + +#define DAC_GCTRL_FREQ_MODE_MASK (DAC12_GCTRL_HFSEL) +#define DAC_HIGH_FREQ_MODE_DISABLE ((~DAC12_GCTRL_HFSEL)) +#define DAC_HIGH_FREQ_MODE_BELOW_80M (DAC12_GCTRL_HFSEL_0) +#define DAC_HIGH_FREQ_MODE_BELOW_160M (DAC12_GCTRL_HFSEL_1) +#define DAC_HIGH_FREQ_MODE_ABOVE_160M (DAC12_GCTRL_HFSEL_0|DAC12_GCTRL_HFSEL_1) + +/** DAC_CALC **/ +#define DAC_CALC_OTRIMxVALUE_MASK (DAC_CALC_OTRIMx) +#define DAC_CALC_OTRIMyVALUE_MASK (DAC_CALC_OTRIMy) + +/** DAC_STINC **/ +#define DAC_STINC_STINCDATAx_MASK (DAC_STINC_STINCDATAx) +#define DAC_STINC_STINCDATAy_MASK (DAC_STINC_STINCDATAy) +/** DAC_STRST **/ +#define DAC_STRST_STRSTDATAx_MASK (DAC_STRST_STRSTDATAx) +#define DAC_STRST_STRSTDATAy_MASK (DAC_STRST_STRSTDATAy) + +#define IS_DAC12(x) ((uint8_t)(x) < 2) +#define IS_DAC34(x) (((uint8_t)(x) == 2) || ((uint8_t)(x) == 3)) +#define IS_DAC56(x) (((uint8_t)(x) == 4) || ((uint8_t)(x) == 5)) + +#define IS_DAC13(x) ((((uint8_t)(x) == 0) || ((uint8_t)(x) == 2))) + +#define IS_DAC135(x) (((uint8_t)(x) % 2) == 0) +#define IS_DAC246(x) (((uint8_t)(x) % 2) != 0) + +/** DAC_data_alignment **/ +#define DAC_ALIGN_R_8BIT ((uint32_t)0x00000000U) +#define DAC_ALIGN_L_12BIT ((uint32_t)0x00000004U) +#define DAC_ALIGN_R_12BIT ((uint32_t)0x00000008U) + +/**DAC interrupts_definition **/ +#define DAC_INT_DMAUDRIEN (DAC_CTRL_DMAUDRxIEn) +#define DAC_INT_TROVIEN (DAC_CTRL_TROVCxIEN) + +/** DAC_STS Flag **/ +#define DAC_FLAG_DMAUDR (DAC_STS_DMAUDRx) +#define DAC_FLAG_CALCOMPLETE (DAC_STS_CALFLAGx) +#define DAC_FLAG_DORSTAT (DAC_STS_DORSTATx) +#define DAC_FLAG_TROVC (DAC_STS_TROVCFLAGx) +#define DAC_FLAG_VFLAGCOMP (DAC_STS_VFLAGxCOMP) + +/** DAC_STS INT Flag **/ +#define DAC_INTFLAG_DMAUDR (DAC_STS_DMAUDRx) +#define DAC_INTFLAG_TROVC (DAC_STS_TROVCFLAGx) + + +/** DAC_Exported_Functions **/ +void DAC_DeInit(DACX DACx); +void DAC_StructInit(DAC_InitType* DAC_InitStruct); +void DAC_Init(DACX DACx, DAC_InitType* DAC_InitStruct); + +void DAC_Enable(DACX DACx, FunctionalState Cmd); +void DAC_DmaEnable(DACX DACx, FunctionalState Cmd); +void DAC_CaliEnable(DACX DACx, FunctionalState Cmd); +void DAC_ConnetToExternalPinEnable(DACX DACx, FunctionalState Cmd); +void DAC_ConnetToOnChipEnable(DACX DACx, FunctionalState Cmd); +void DAC_HighDriveAbilityEnable(DACX DACx, FunctionalState Cmd); +void DAC_SignFormatModeEnable(DACX DACx, FunctionalState Cmd); +void DAC_DMADoubleDataModeEnable(DACX DACx, FunctionalState Cmd); + +void DAC_SoftTrgEnable(DACX DACx, FunctionalState Cmd); +void DAC_SoftTrgSawStepEnable(DACX DACx, FunctionalState Cmd); +void DAC_DualSoftwareTrgEnable(DAC_Module *Dual_DACx, FunctionalState Cmd); +void DAC_DualSoftwareTrgSawStepEnable(DAC_Module *Dual_DACx, FunctionalState Cmd); + +void DAC_WaveGenerationConfig(DACX DACx, uint32_t DAC_Wave); +void DAC_SetSawtoothResetValue(DACX DACx, uint16_t ResetValue); +void DAC_SetSawtoothStepValue(DACX DACx, uint16_t StepData); +void DAC_SetData(DACX DACx, uint32_t DAC_Align, uint16_t Data); +void DAC_SetDualChData(DAC_Module *Dual_DACx, uint32_t DAC_Align, uint16_t Data2, uint16_t Data1); +uint16_t DAC_GetOutputDataVal(DACX DACx); + +FlagStatus DAC_GetFlagSts(DACX DACx, uint32_t DAC_FLAG); +void DAC_ClearFlag(DACX DACx, uint32_t DAC_FLAG); + +void DAC_ConfigInt(DACX DACx, uint32_t DAC_IT, FunctionalState Cmd); +FlagStatus DAC_GetIntSts(DACX DACx, uint32_t DAC_IT); +void DAC_ClearITPendingBit(DACX DACx, uint32_t DAC_IT); + +void DAC_ConfigClkPrescaler(DAC_Module* DACx, uint8_t Prescaler); +void DAC_SetHighFrequencyMode(DAC_Module* DACx, uint32_t mode); +void DAC_SetUserTrimming(DACX DACx, uint8_t TrimmingValue); +#ifdef __cplusplus +} +#endif + +#endif /*__N32H76X_78X_DAC_H__ */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dbg.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dbg.h new file mode 100644 index 0000000000..0be5790509 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dbg.h @@ -0,0 +1,161 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dbg.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76x_78x_DBG_H__ +#define __N32H76x_78x_DBG_H__ + +/* C binding of definitions if building with C++ compiler */ +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "n32h76x_78x.h" + + +#define DBG_FLASH_SIZE_MASK ((uint32_t)0x000000C0U) +#define DBG_REV_NUM_MASK ((uint32_t)0xFF000000U) +#define DBG_DEV_NUM_MASK ((uint32_t)0x00FFF000U) + +#define REGISTER_OFFSET_POS ((uint8_t)0x18U) +#define REGISTER_OFFSET_MASK ((uint32_t)0xFF000000U) +#define REGISTER_DBG_CTRL_OFFSET ((uint32_t)0x04000000U) +#define REGISTER_M7_APB1_OFFSET ((uint32_t)0x08000000U) +#define REGISTER_M7_APB2_OFFSET ((uint32_t)0x10000000U) +#define REGISTER_M7_APB5_OFFSET ((uint32_t)0x18000000U) +#define REGISTER_M7_APB6_OFFSET ((uint32_t)0x20000000U) + + + +#define DBG_TRGIO_INPUT_DIRECTION ((uint32_t)0x00000000U) +#define DBG_TRGIO_OUTPUT_DIRECTION (DBG_CTRL_TRACE_IOEN) + +#define DBG_M7SLEEP (DBG_CTRL_M7SLEEP | REGISTER_DBG_CTRL_OFFSET) +#define DBG_M7STOP (DBG_CTRL_M7STOP | REGISTER_DBG_CTRL_OFFSET) +#define DBG_M7STANDBY (DBG_CTRL_M7STBY | REGISTER_DBG_CTRL_OFFSET) +#define DBG_M4SLEEP (DBG_CTRL_M4SLEEP | REGISTER_DBG_CTRL_OFFSET) +#define DBG_M4STOP (DBG_CTRL_M4STOP | REGISTER_DBG_CTRL_OFFSET) +#define DBG_M4STANDBY (DBG_CTRL_M4STBY | REGISTER_DBG_CTRL_OFFSET) + +#define DBG_WWDG1_STOP (DBG_M7APB6FZ_WWDG1_STOP | REGISTER_M7_APB6_OFFSET ) + +#define DBG_ATIM3_STOP (DBG_M7APB5FZ_ATIM3_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_ATIM4_STOP (DBG_M7APB5FZ_ATIM4_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_I2C7SMBUS_TIMEOUT (DBG_M7APB5FZ_I2C7_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_I2C8SMBUS_TIMEOUT (DBG_M7APB5FZ_I2C8_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_I2C9SMBUS_TIMEOUT (DBG_M7APB5FZ_I2C9_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_I2C10SMBUS_TIMEOUT (DBG_M7APB5FZ_I2C10_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_IWDG1_STOP (DBG_M7APB5FZ_IWDG1_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_IWDG2_STOP (DBG_M7APB5FZ_IWDG2_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_LPTIM1_STOP (DBG_M7APB5FZ_LPTIM1_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_LPTIM2_STOP (DBG_M7APB5FZ_LPTIM2_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_LPTIM3_STOP (DBG_M7APB5FZ_LPTIM3_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_LPTIM4_STOP (DBG_M7APB5FZ_LPTIM4_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_LPTIM5_STOP (DBG_M7APB5FZ_LPTIM5_STOP | REGISTER_M7_APB5_OFFSET) +#define DBG_RTC_STOP (DBG_M7APB5FZ_RTC_STOP | REGISTER_M7_APB5_OFFSET) + +#define DBG_CANFD3_STOP (DBG_M7APB2FZ_CANFD3_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_CANFD4_STOP (DBG_M7APB2FZ_CANFD4_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_CANFD7_STOP (DBG_M7APB2FZ_CANFD7_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_CANFD8_STOP (DBG_M7APB2FZ_CANFD8_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_I2C4SMBUS_TIMEOUT (DBG_M7APB2FZ_I2C4_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_I2C5SMBUS_TIMEOUT (DBG_M7APB2FZ_I2C5_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_I2C6SMBUS_TIMEOUT (DBG_M7APB2FZ_I2C6_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_ATIM1_STOP (DBG_M7APB2FZ_ATIM1_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_ATIM2_STOP (DBG_M7APB2FZ_ATIM2_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_GTIMA1_STOP (DBG_M7APB2FZ_GTIMA1_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_GTIMA2_STOP (DBG_M7APB2FZ_GTIMA2_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_GTIMA3_STOP (DBG_M7APB2FZ_GTIMA3_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_SHRTIM1_STOP (DBG_M7APB2FZ_SHRTIM1_STOP | REGISTER_M7_APB2_OFFSET) +#define DBG_SHRTIM2_STOP (DBG_M7APB2FZ_SHRTIM2_STOP | REGISTER_M7_APB2_OFFSET) + +#define DBG_BTIM1_STOP (DBG_M7APB1FZ_BTIM1_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_BTIM2_STOP (DBG_M7APB1FZ_BTIM2_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_BTIM3_STOP (DBG_M7APB1FZ_BTIM3_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_BTIM4_STOP (DBG_M7APB1FZ_BTIM4_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_GTIMA4_STOP (DBG_M7APB1FZ_GTIMA4_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_GTIMA5_STOP (DBG_M7APB1FZ_GTIMA5_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_GTIMA6_STOP (DBG_M7APB1FZ_GTIMA6_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_GTIMA7_STOP (DBG_M7APB1FZ_GTIMA7_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_GTIMB1_STOP (DBG_M7APB1FZ_GTIMB1_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_GTIMB2_STOP (DBG_M7APB1FZ_GTIMB2_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_GTIMB3_STOP (DBG_M7APB1FZ_GTIMB3_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_I2C1SMBUS_TIMEOUT (DBG_M7APB1FZ_I2C1_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_I2C2SMBUS_TIMEOUT (DBG_M7APB1FZ_I2C2_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_I2C3SMBUS_TIMEOUT (DBG_M7APB1FZ_I2C3_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_WWDG2_STOP (DBG_M7APB1FZ_WWDG2_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_CANFD1_STOP (DBG_M7APB1FZ_CANFD1_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_CANFD2_STOP (DBG_M7APB1FZ_CANFD2_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_CANFD5_STOP (DBG_M7APB1FZ_CANFD5_STOP | REGISTER_M7_APB1_OFFSET) +#define DBG_CANFD6_STOP (DBG_M7APB1FZ_CANFD6_STOP | REGISTER_M7_APB1_OFFSET) + + + +uint32_t DBG_GetRevNum(void); +uint32_t DBG_GetDevNum(void); + +void DBG_SetExternalTriggerPinDirection(uint32_t PinDirection); +void DBG_M7ConfigPeriph(uint32_t DBG_Periph, FunctionalState Cmd); +void DBG_M4ConfigPeriph(uint32_t DBG_Periph, FunctionalState Cmd); + +uint32_t DBG_GetFlashSize(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76x_78x_DBG_H__ */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dcmu.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dcmu.h new file mode 100644 index 0000000000..7eef8b6d4f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dcmu.h @@ -0,0 +1,197 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dcmu.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_DCMU_H__ +#define __N32H76X_78X_DCMU_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/** n32h76x_78x_StdPeriph_Driver **/ + +/** DCMU_Exported_Constants **/ + +/** DCMU Min and Max Define **/ +#define DCMU_TXMSGID_MIN (0U) /* DCMU Transmit Messaging Register ID Min */ +#define DCMU_TXMSGID_MAX (3U) /* DCMU Transmit Messaging Register ID Max */ +#define DCMU_RXMSGID_MIN (0U) /* DCMU Receive Messaging Register ID Min */ +#define DCMU_RXMSGID_MAX (3U) /* DCMU Receive Messaging Register ID Max */ +#define DCMU_GPIRID_MIN (0U) /* DCMU General Purpose Interrupt Request ID Min */ +#define DCMU_GPIRID_MAX (3U) /* DCMU General Purpose Interrupt Request ID Max */ +#define DCMU_FLAGID_MIN (0U) /* DCMU Flag ID Min */ +#define DCMU_FLAGID_MAX (2U) /* DCMU Flag ID Max */ + +#define DCMU_CTRL_GPIE0_MASK (DCMU_CTRL_GPIE0) +#define DCMU_CTRL_GPIE1_MASK (DCMU_CTRL_GPIE1) +#define DCMU_CTRL_GPIE2_MASK (DCMU_CTRL_GPIE2) +#define DCMU_CTRL_GPIE3_MASK (DCMU_CTRL_GPIE3) +#define DCMU_CTRL_TEIE0_MASK (DCMU_CTRL_TEIE0) +#define DCMU_CTRL_TEIE1_MASK (DCMU_CTRL_TEIE1) +#define DCMU_CTRL_TEIE2_MASK (DCMU_CTRL_TEIE2) +#define DCMU_CTRL_TEIE3_MASK (DCMU_CTRL_TEIE3) + +#define DCMU_CTRL_RFIE0_MASK (DCMU_CTRL_RFIE0) +#define DCMU_CTRL_RFIE1_MASK (DCMU_CTRL_RFIE1) +#define DCMU_CTRL_RFIE2_MASK (DCMU_CTRL_RFIE2) +#define DCMU_CTRL_RFIE3_MASK (DCMU_CTRL_RFIE3) + +#define DCMU_CTRL_GPIE_ALL_MASK (DCMU_CTRL_GPIE0 | DCMU_CTRL_GPIE1 | DCMU_CTRL_GPIE2 | DCMU_CTRL_GPIE3) +#define DCMU_CTRL_TEIE_ALL_MASK (DCMU_CTRL_TEIE0 | DCMU_CTRL_TEIE1 | DCMU_CTRL_TEIE2 | DCMU_CTRL_TEIE3) +#define DCMU_CTRL_RFIE_ALL_MASK (DCMU_CTRL_RFIE0 | DCMU_CTRL_RFIE1 | DCMU_CTRL_RFIE2 | DCMU_CTRL_RFIE3) +#define DCMU_CTRL_ALL_IE_MASK (DCMU_CTRL_GPIE_ALL_MASK|DCMU_CTRL_TEIE_ALL_MASK|DCMU_CTRL_RFIE_ALL_MASK) + +#define DCMU_CTRL_GPIR0_MASK (DCMU_CTRL_GPIR0) +#define DCMU_CTRL_GPIR1_MASK (DCMU_CTRL_GPIR1) +#define DCMU_CTRL_GPIR2_MASK (DCMU_CTRL_GPIR2) +#define DCMU_CTRL_GPIR3_MASK (DCMU_CTRL_GPIR3) +#define DCMU_CTRL_GPIR_ALL_MASK (DCMU_CTRL_GPIR0_MASK | DCMU_CTRL_GPIR1_MASK | DCMU_CTRL_GPIR2_MASK | DCMU_CTRL_GPIR3_MASK) + +#define DCMU_CTRL_RST_MASK (DCMU_CTRL_RST) + +#define DCMU_CTRL_TXFN0_MASK (DCMU_CTRL_TXFN0) +#define DCMU_CTRL_TXFN1_MASK (DCMU_CTRL_TXFN1) +#define DCMU_CTRL_TXFN2_MASK (DCMU_CTRL_TXFN2) +#define DCMU_CTRL_TXFN_ALL_MASK (DCMU_CTRL_TXFN0_MASK | DCMU_CTRL_TXFN1_MASK | DCMU_CTRL_TXFN2_MASK) + +#define DCMU_STS_GPIF0_MASK (DCMU_STS_GPIF0) +#define DCMU_STS_GPIF1_MASK (DCMU_STS_GPIF1) +#define DCMU_STS_GPIF2_MASK (DCMU_STS_GPIF2) +#define DCMU_STS_GPIF3_MASK (DCMU_STS_GPIF3) +#define DCMU_STS_TEF0_MASK (DCMU_STS_TEF0) +#define DCMU_STS_TEF1_MASK (DCMU_STS_TEF1) +#define DCMU_STS_TEF2_MASK (DCMU_STS_TEF2) +#define DCMU_STS_TEF3_MASK (DCMU_STS_TEF3) +#define DCMU_STS_RFF0_MASK (DCMU_STS_RFF0) +#define DCMU_STS_RFF1_MASK (DCMU_STS_RFF1) +#define DCMU_STS_RFF2_MASK (DCMU_STS_RFF2) +#define DCMU_STS_RFF3_MASK (DCMU_STS_RFF3) + +#define DCMU_STS_GPIF_ALL_MASK (DCMU_STS_GPIF0_MASK|DCMU_STS_GPIF1_MASK|DCMU_STS_GPIF2_MASK|DCMU_STS_GPIF3_MASK) +#define DCMU_STS_TEF_ALL_MASK (DCMU_STS_TEF0_MASK|DCMU_STS_TEF1_MASK|DCMU_STS_TEF2_MASK|DCMU_STS_TEF3_MASK) +#define DCMU_STS_RFF_ALL_MASK (DCMU_STS_RFF0_MASK|DCMU_STS_RFF1_MASK|DCMU_STS_RFF2_MASK|DCMU_STS_RFF3_MASK) + +#define DCMU_STS_EPF_MASK (DCMU_STS_EPF) +#define DCMU_STS_FUPF_MASK (DCMU_STS_FUPF) +#define DCMU_STS_RSTF_MASK (DCMU_STS_RSTF) + +#define DCMU_STS_RCVFN0_MASK (DCMU_STS_RCVFN0) +#define DCMU_STS_RCVFN1_MASK (DCMU_STS_RCVFN1) +#define DCMU_STS_RCVFN2_MASK (DCMU_STS_RCVFN2) +#define DCMU_STS_RCVFN_ALL_MASK (DCMU_STS_RCVFN0_MASK|DCMU_STS_RCVFN1_MASK|DCMU_STS_RCVFN2_MASK) + + +/** DCMU_Exported_Typedef_t **/ +typedef enum dcmu_wait_mode +{ + NON_BLOCKING =0, + BLOCKING + +}dcmu_wait_mode_t; + +typedef enum dcmu_txmsg_idx +{ + TXMSG_IDX0 = 0, + TXMSG_IDX1 , + TXMSG_IDX2 , + TXMSG_IDX3 + +}dcmu_txmsg_idx_t; + +typedef enum dcmu_rcvmsg_idx +{ + RCVMSG_IDX0 = 0, + RCVMSG_IDX1 , + RCVMSG_IDX2 , + RCVMSG_IDX3 + +}dcmu_rcvmsg_idx_t; + +typedef enum dcmu_gpi_idx +{ + GPI_IDX0 = 0, + GPI_IDX1 , + GPI_IDX2 , + GPI_IDX3 + +}dcmu_gpi_idx_t; + + + + +/** DCMU_Exported_Functions **/ + +void DCMU_DeInit( void ); + +#if defined(CORE_CM7) +void DCMU_SelfReset( void ); +#endif + +void DCMU_TransmitMsg( uint8_t TxIdx, uint32_t TxMsgData, dcmu_wait_mode_t Mode); +uint32_t DCMU_ReceiveMsg( uint8_t RcvIdx, dcmu_wait_mode_t Mode); +void DCMU_Set3BitFlagNumbers( uint8_t FlagData, dcmu_wait_mode_t Mode); +uint8_t DCMU_Get3BitFlagNumbers( void ); +uint32_t DCMU_GetStatusFlags( uint32_t StatusMask); +uint32_t DCMU_GetIntPendingFlags( uint32_t IntPendingMask); +void DCMU_ClearIntPendingFlags( uint32_t GPIntPendingMask); +void DCMU_ConfigInt( uint32_t IntMask, FunctionalState Cmd); +void DCMU_RequestGPInt( uint32_t ReqGPIntMask); + +#ifdef __cplusplus +} +#endif + +#endif /*__N32H76X_78X_DCMU_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dma.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dma.h new file mode 100644 index 0000000000..e18255f88e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dma.h @@ -0,0 +1,448 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dma.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76x_78x_DMA_H__ +#define __N32H76x_78x_DMA_H__ + + +#include +#include "n32h76x_78x.h" + + +#if defined(DMA1) || defined(DMA2) || defined(DMA3) + + + +/** DMA Channel Numbers per DMA Controller definition **/ +#define DMA_NUM_CHANNELS 8 + +/** DMA Channel Enable/Disable definition **/ +#define DMA_CH_ENABLE ((uint32_t)(DMA_CHEN_CH0WEN | DMA_CHEN_CH0)) +#define DMA_CH_DISABLE ((uint32_t)(DMA_CHEN_CH0WEN & (~DMA_CHEN_CH0))) + +/** DMA Interrupt Mask/Unmask definition **/ +#define DMA_INT_UNMASK ((uint32_t)(DMA_TCINTMSK_CH0WEN | DMA_TCINTMSK_CH0)) +#define DMA_INT_MASK ((uint32_t)(DMA_TCINTMSK_CH0WEN & (~DMA_TCINTMSK_CH0))) + +/** DMA Source Single Transaction Request Enable/Disable definition **/ +#define DMA_SSTR_ENABLE ((uint32_t)(DMA_SRCSGTREQ_CH0WEN | DMA_SRCSGTREQ_CH0)) +#define DMA_SSTR_DISABLE ((uint32_t)(DMA_SRCSGTREQ_CH0WEN & (~DMA_SRCSGTREQ_CH0))) + +/** DMA Source Last Transaction Request Enable/Disable definition **/ +#define DMA_SLTR_ENABLE ((uint32_t)(DMA_SRCLTREQ_CH0WEN | DMA_SRCLTREQ_CH0)) +#define DMA_SLTR_DISABLE ((uint32_t)(DMA_SRCLTREQ_CH0WEN & (~DMA_SRCLTREQ_CH0))) + +/** DMA Source Transaction Request Enable/Disable definition **/ +#define DMA_STR_ENABLE ((uint32_t)(DMA_SRCSWTREQ_CH0WEN | DMA_SRCSWTREQ_CH0)) +#define DMA_STR_DISABLE ((uint32_t)(DMA_SRCSWTREQ_CH0WEN & (~DMA_SRCSWTREQ_CH0))) + +/** DMA Destination Single Transaction Request Enable/Disable definition **/ +#define DMA_DSTR_ENABLE ((uint32_t)(DMA_DSTSGTREQ_CH0WEN | DMA_DSTSGTREQ_CH0)) +#define DMA_DSTR_DISABLE ((uint32_t)(DMA_DSTSGTREQ_CH0WEN & (~DMA_DSTSGTREQ_CH0))) + +/** DMA Destination Last Transaction Request Enable/Disable definition **/ +#define DMA_DLTR_ENABLE ((uint32_t)(DMA_DSTLTREQ_CH0WEN | DMA_DSTLTREQ_CH0)) +#define DMA_DLTR_DISABLE ((uint32_t)(DMA_DSTLTREQ_CH0WEN & (~DMA_DSTLTREQ_CH0))) + +/** DMA Destination Transaction Request Enable/Disable definition **/ +#define DMA_DTR_ENABLE ((uint32_t)(DMA_DSTSWTREQ_CH0WEN | DMA_DSTSWTREQ_CH0)) +#define DMA_DTR_DISABLE ((uint32_t)(DMA_DSTSWTREQ_CH0WEN & (~DMA_DSTSWTREQ_CH0))) + +/** DMA Channel Bus Lock Level definition **/ +#define DMA_CH_BUS_LOCK_LEVEL_OCDMATFR ((uint64_t)(DMA_CHNCFG_LOCKBL_0 \ + & DMA_CHNCFG_LOCKBL_1)) /* Over complete DMA transfer */ +#define DMA_CH_BUS_LOCK_LEVEL_OCDMABLKTFR ((uint64_t)(DMA_CHNCFG_LOCKBL_0)) /* Over complete DMA block transfer */ +#define DMA_CH_BUS_LOCK_LEVEL_OCDMATRAN ((uint64_t)(DMA_CHNCFG_LOCKBL_1)) /* Over complete DMA transfer */ + +/** DMA Channel Lock Level definition **/ +#define DMA_CH_LOCK_LEVEL_OCDMATFR ((uint64_t)(DMA_CHNCFG_LOCKCHL_0 \ + & DMA_CHNCFG_LOCKCHL_1)) /* Over complete DMA transfer */ +#define DMA_CH_LOCK_LEVEL_OCDMABLKTFR ((uint64_t)(DMA_CHNCFG_LOCKCHL_0)) /* Over complete DMA block transfer */ +#define DMA_CH_LOCK_LEVEL_OCDMATRAN ((uint64_t)(DMA_CHNCFG_LOCKCHL_1)) /* Over complete DMA transfer */ + +/** DMA Channel interrupt event definition **/ +#define DMA_EVENT_TRANSFER_COMPLETE ((uint32_t)DMA_TCINTSTS_CH0) /* IntTfr: Transfer complete interrupt event */ +#define DMA_EVENT_BLOCK_TRANSFER_COMPLETE ((uint32_t)DMA_BTCINTSTS_CH0) /* IntBlock: Block transfer complete interrupt event */ +#define DMA_EVENT_SRC_TRANSACTION_COMPLETE ((uint32_t)DMA_STCINTSTS_CH0) /* IntSrcTran: Source transaction complete interrupt event */ +#define DMA_EVENT_DST_TRANSACTION_COMPLETE ((uint32_t)DMA_DTCINTSTS_CH0) /* IntDstTran: Destination transaction complete interrupt event */ +#define DMA_EVENT_ERROR ((uint32_t)DMA_ERRINTSTS_CH0) /* IntErr: Error interrupt event */ + + +/** DMA Channel Number typedef **/ +typedef enum +{ + DMA_CHANNEL_0 = 0x0UL, + DMA_CHANNEL_1 = 0x1UL, + DMA_CHANNEL_2 = 0x2UL, + DMA_CHANNEL_3 = 0x3UL, + DMA_CHANNEL_4 = 0x4UL, + DMA_CHANNEL_5 = 0x5UL, + DMA_CHANNEL_6 = 0x6UL, + DMA_CHANNEL_7 = 0x7UL +} DMA_ChNumType; + +/** DMA Channel Status typedef **/ +typedef enum +{ + DMA_CH_STS_OK = 0, /* DMA status OK */ + DMA_CH_STS_ERROR, /* DMA status Error */ + DMA_CH_STS_BUSY /* DMA status Busy */ +} DMA_ChStatusType; + +/** DMA channel transfer types typedef **/ +typedef enum +{ + DMA_CH_TRANSFER_TYPE_SINGLE_BLOCK, /* Single block */ + DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_CONTIGUOUS_DSTADR_RELOAD, /* Multi-block: src address contiguous, dst address reload */ + DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_RELOAD_DSTADR_CONTIGUOUS, /* Multi-block: src address reload, dst address contiguous */ + DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_RELOAD_DSTADR_RELOAD, /* Multi-block: src address reload, dst address reload */ + DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_CONTIGUOUS_DSTADR_LINKED, /* Multi-block: src address contiguous, dst address linked */ + DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_RELOAD_DSTADR_LINKED, /* Multi-block: src address reload, dst address linked */ + DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_LINKED_DSTADR_CONTIGUOUS, /* Multi-block: src address linked, dst address contiguous */ + DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_LINKED_DSTADR_RELOAD, /* Multi-block: src address linked, dst address reload */ + DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_LINKED_DSTADR_LINKED /* Multi-block: src address linked, dst address linked */ +} DMA_ChTfrType; + +/** DMA channel transfer flow modes typedef **/ +typedef enum +{ + DMA_CH_TRANSFER_FLOW_M2M_DMA = 0x0UL, /* Memory to memory (DMA flow controller) */ + DMA_CH_TRANSFER_FLOW_M2P_DMA = 0x1UL, /* Memory to peripheral (DMA flow controller) */ + DMA_CH_TRANSFER_FLOW_P2M_DMA = 0x2UL, /* Peripheral to memory (DMA flow controller) */ + DMA_CH_TRANSFER_FLOW_P2P_DMA = 0x3UL, /* Peripheral to peripheral (DMA flow controller) */ + DMA_CH_TRANSFER_FLOW_P2M_PER = 0x4UL, /* Peripheral to memory (Peripheral flow controller) */ + DMA_CH_TRANSFER_FLOW_P2P_SRCPER = 0x5UL, /* Peripheral to peripheral (Source peripheral flow controller) */ + DMA_CH_TRANSFER_FLOW_M2P_PER = 0x6UL, /* Memory to peripheral (Peripheral flow controller) */ + DMA_CH_TRANSFER_FLOW_P2P_DSTPER = 0x7UL /* Peripheral to peripheral (Destination peripheral flow controller) */ +} DMA_ChTfrFlowType; + +/** DMA channel master interface layer select typedef **/ +typedef enum +{ + DMA_CH_AHB_MASTER_1 = 0x0UL, /* AHB master 1 */ + DMA_CH_AHB_MASTER_2 = 0x1UL /* AHB master 2 */ +} DMA_ChMstSelType; + +/** DMA channel valid burst length value typedef **/ +typedef enum +{ + DMA_CH_BURST_LENGTH_1 = 0x0UL, /* Burst length: 1 data item */ + DMA_CH_BURST_LENGTH_4 = 0x1UL, /* Burst length: 4 data items */ + DMA_CH_BURST_LENGTH_8 = 0x2UL, /* Burst length: 8 data items */ + DMA_CH_BURST_LENGTH_16 = 0x3UL, /* Burst length: 16 data items */ + DMA_CH_BURST_LENGTH_32 = 0x4UL, /* Burst length: 32 data items */ + DMA_CH_BURST_LENGTH_64 = 0x5UL, /* Burst length: 64 data items */ + DMA_CH_BURST_LENGTH_128 = 0x6UL, /* Burst length: 128 data items */ + DMA_CH_BURST_LENGTH_256 = 0x7UL /* Burst length: 256 data items */ +} DMA_ChBurstLenType; + +/** DMA channel valid transfer width values typedef **/ +typedef enum +{ + DMA_CH_TRANSFER_WIDTH_8 = 0x0UL, /* 8-bit transfer width */ + DMA_CH_TRANSFER_WIDTH_16 = 0x1UL, /* 16-bit transfer width */ + DMA_CH_TRANSFER_WIDTH_32 = 0x2UL, /* 32-bit transfer width */ +} DMA_ChTfrWidthType; + +/** DMA channel address count mode typedef **/ +typedef enum +{ + DMA_CH_ADDRESS_COUNT_MODE_INCREMENT = 0x0UL, /* Address count mode: increment */ + DMA_CH_ADDRESS_COUNT_MODE_DECREMENT = 0x1UL, /* Address count mode: decrement */ + DMA_CH_ADDRESS_COUNT_MODE_NO_CHANGE = 0x2UL /* Address count mode: no change */ +} DMA_ChAddrCountType; + +/** DMA channel priorities typedef **/ +typedef enum +{ + DMA_CH_PRIORITY_0 = 0x0UL, /* DMA channel priority 0 (low) */ + DMA_CH_PRIORITY_1 = 0x1UL, /* DMA channel priority 1 */ + DMA_CH_PRIORITY_2 = 0x2UL, /* DMA channel priority 2 */ + DMA_CH_PRIORITY_3 = 0x3UL, /* DMA channel priority 3 */ + DMA_CH_PRIORITY_4 = 0x4UL, /* DMA channel priority 4 */ + DMA_CH_PRIORITY_5 = 0x5UL, /* DMA channel priority 5 */ + DMA_CH_PRIORITY_6 = 0x6UL, /* DMA channel priority 6 */ + DMA_CH_PRIORITY_7 = 0x7UL /* DMA channel priority 7 (high) */ +} DMA_ChPriorType; + +/** DMA channel Source handshake interface typedef **/ +typedef enum +{ + DMA_CH_SRC_HANDSHAKING_HARDWARE = 0x0UL, /* Source: hardware handshake */ + DMA_CH_SRC_HANDSHAKING_SOFTWARE = 0x1UL /* Source: software handshake */ +} DMA_ChSrcHsType; + +/** DMA channel Destination handshake interface typedef **/ +typedef enum +{ + DMA_CH_DST_HANDSHAKING_HARDWARE = 0x0UL, /* Destination: hardware handshake */ + DMA_CH_DST_HANDSHAKING_SOFTWARE = 0x1UL /* Destination: software handshake */ +} DMA_ChDstHsType; + +/** DMA channel hardware handshaking interface, available when DMA is flow controller typedef **/ +typedef enum +{ + DMA_CH_HARDWARE_HANDSHAKING_IF_0 = 0x0UL, /* Hardware handshaking interface 0 */ + DMA_CH_HARDWARE_HANDSHAKING_IF_1 = 0x1UL, /* Hardware handshaking interface 1 */ + DMA_CH_HARDWARE_HANDSHAKING_IF_2 = 0x2UL, /* Hardware handshaking interface 2 */ + DMA_CH_HARDWARE_HANDSHAKING_IF_3 = 0x3UL, /* Hardware handshaking interface 3 */ + DMA_CH_HARDWARE_HANDSHAKING_IF_4 = 0x4UL, /* Hardware handshaking interface 4 */ + DMA_CH_HARDWARE_HANDSHAKING_IF_5 = 0x5UL, /* Hardware handshaking interface 5 */ + DMA_CH_HARDWARE_HANDSHAKING_IF_6 = 0x6UL, /* Hardware handshaking interface 6 */ + DMA_CH_HARDWARE_HANDSHAKING_IF_7 = 0x7UL, /* Hardware handshaking interface 7 */ +} DMA_ChHwHsIfType; + +/* DMA channel handshaking interface polarity typedef */ +typedef enum +{ + DMA_CH_HANDSHAKING_IF_POL_H = 0x0UL, /* Active HIGH */ + DMA_CH_HANDSHAKING_IF_POL_L = 0x1UL, /* Active LOW */ +} DMA_ChHsIfPolType; + +/** DMA Channel events typedef **/ +typedef enum +{ + DMA_CH_EVENT_TRANSFER_COMPLETE = 0x1UL, /* Transfer complete event */ + DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE = 0x2UL, /* Block transfer complete event */ + DMA_CH_EVENT_SRC_TRANSACTION_COMPLETE = 0x4UL, /* Source transaction complete event */ + DMA_CH_EVENT_DST_TRANSACTION_COMPLETE = 0x8UL, /* Destination transaction complete event */ + DMA_CH_EVENT_ERROR = 0x10UL /* DMA error event */ +} DMA_ChEventType; + +/** DMA Channel Transaction types typedef **/ +typedef enum +{ + DMA_CH_TRANSACTION_TYPE_SINGLE, /* Single DMA transaction */ + DMA_CH_TRANSACTION_TYPE_BURST /* Burst transaction */ +} DMA_ChTransacType; + + + +/** Start of section using anonymous unions **/ +#if defined (__CC_ARM) + /* Save the current compiler state (Keil only) */ + #pragma push + /* Enable anonymous unions */ + #pragma anon_unions +#elif defined(__ICCARM__) + /* Enable anonymous consortia */ + #pragma language=extended +#elif defined(__GNUC__) + /* GCC supports anonymous unions by default */ +#else + #warning "Anonymous unions may not be supported by this compiler. Check compiler documentation." +#endif + +/** DMA channel linked list item structure, 32-bits alignment **/ +typedef struct __DMA_LinkListItemType +{ + uint32_t SrcAddr; /* Source address */ + uint32_t DstAddr; /* Destination address */ + struct __DMA_LinkListItemType *pNext; /* The next linked list item pointer */ + + union + { + uint32_t ChCtrlL32; + struct + { + uint32_t IntEn: 1; /* Enable interrupts? */ + uint32_t DstTfrWidth: 3; /* Destination transfer width */ + uint32_t SrcTfrWidth: 3; /* Source transfer width */ + uint32_t DstAddrCountMode: 2; /* Destination address count mode */ + uint32_t SrcAddrCountMode: 2; /* Source address count mode */ + uint32_t DstBurstLen: 3; /* Destination burst length */ + uint32_t SrcBurstLen: 3; /* Source burst length */ + uint32_t SrcGatherEn: 1; /* Enable source gather? */ + uint32_t DstScatterEn: 1; /* Enable destination scatter? */ + uint32_t : 1; + uint32_t TfrTypeFlowCtrl: 3; /* Transfer Type and Flow Control */ + uint32_t : 4; + uint32_t DstLinkedListEn: 1; /* Enable destination linked list? */ + uint32_t SrcLinkedListEn: 1; /* Enable source linked list? */ + uint32_t : 3; + }; + }; + + union + { + uint32_t ChCtrlH32; + struct + { + uint32_t BlkTfrSize: 12; /* DMA block size for DMA controlled transfers [max. 4095]*/ + uint32_t DoneFlag: 1; /* Block transfer complete flag */ + uint32_t : 19; + }; + }; + +} DMA_LinkListItemType; + +/** DMA Channel Initialize configuration structure **/ +typedef struct +{ + union + { + uint64_t ChCtrl; + struct + { + uint64_t IntEn: 1; /* Enable interrupts? */ + uint64_t DstTfrWidth: 3; /* Destination transfer width */ + uint64_t SrcTfrWidth: 3; /* Source transfer width */ + uint64_t DstAddrCountMode: 2; /* Destination address count mode */ + uint64_t SrcAddrCountMode: 2; /* Source address count mode */ + uint64_t DstBurstLen: 3; /* Destination burst length */ + uint64_t SrcBurstLen: 3; /* Source burst length */ + uint64_t SrcGatherEn: 1; /* Enable source gather? */ + uint64_t DstScatterEn: 1; /* Enable destination scatter? */ + uint64_t : 1; + uint64_t TfrTypeFlowCtrl: 3; /* Transfer Type and Flow Control */ + uint64_t DstMasterSelect: 2; /* Destination Master Interface layer */ + uint64_t SrcMasterSelect: 2; /* Source Master Interface layer */ + uint64_t : 5; + uint64_t BlkTfrSize: 12; /* DMA block size for DMA controlled transfers [max. 4095]*/ + uint64_t : 20; + }; + }; + + uint32_t SrcAddr; /* Source address */ + uint32_t DstAddr; /* Destination address */ + DMA_LinkListItemType* pLinkListItem; /* Linked list item pointer */ + + union + { + uint32_t SrcGatherCtrl; + struct + { + uint32_t SrcGatherInterval: 20; /* Source gather interval */ + uint32_t SrcGatherCount: 12; /* Source gather count */ + }; + }; + + union + { + uint32_t DstScatterCtrl; + struct + { + uint32_t DstScatterInterval: 20; /* Destination scatter interval */ + uint32_t DstScatterCount: 12; /* Destination scatter count */ + }; + }; + + DMA_ChTfrType TfrType; /* DMA transfer type */ + DMA_ChPriorType ChannelPriority; /* DMA channel priority */ + DMA_ChSrcHsType SrcHandshaking; /* DMA source handshaking interface */ + DMA_ChHwHsIfType SrcHsInterface; /* DMA source assigned handshaking interface */ + DMA_ChHsIfPolType SrcHsInterfacePol; /* DMA source handshaking interface polarity */ + DMA_ChDstHsType DstHandshaking; /* DMA destination handshaking interface */ + DMA_ChHwHsIfType DstHsInterface; /* DMA destination assigned handshaking interface */ + DMA_ChHsIfPolType DstHsInterfacePol; /* DMA destination handshaking interface polarity */ + +} DMA_ChInitType; + + +/** End of section using anonymous unions (Keil only) **/ +#if defined (__CC_ARM) + /* Restore compiler settings */ + #pragma pop +#endif + + +void DMA_ControllerCmd(DMA_Module *const DMAy, FunctionalStatus Cmd); +bool DMA_ControllerIsEnabled(DMA_Module *const DMAy); +void DMA_ChannelCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd); +bool DMA_ChannelIsEnabled(DMA_Module *const DMAy, DMA_ChNumType ChNum); +DMA_ChStatusType DMA_ChannelInit(DMA_Module *const DMAy, DMA_ChInitType *const DMA_ChInitParam, DMA_ChNumType ChNum); +void DMA_ChannelStructInit(DMA_ChInitType *const DMA_ChInitParam); +void DMA_ChannelSuspend(DMA_Module *const DMAy, DMA_ChNumType ChNum); +bool DMA_ChannelIsSuspended(DMA_Module *const DMAy, DMA_ChNumType ChNum); +void DMA_ChannelResume(DMA_Module *const DMAy, DMA_ChNumType ChNum); + +void DMA_ChannelEventCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t Event, FunctionalStatus Cmd); +void DMA_ClearChannelEventStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t Event); +uint8_t DMA_GetCombinedStatus(DMA_Module *const DMAy); +INTStatus DMA_GetChannelIntTfrStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum); +INTStatus DMA_GetChannelIntBlockStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum); +INTStatus DMA_GetChannelIntSrcTranStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum); +INTStatus DMA_GetChannelIntDstTranStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum); +INTStatus DMA_GetChannelIntErrStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum); + +void DMA_ChannelSourceGatherCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd); +void DMA_SetChannelSourceGather(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t Interval, uint16_t Count); +void DMA_ChannelDestinationScatterCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd); +void DMA_SetChannelDestinationScatter(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t Interval, uint16_t Count); + +void DMA_SetChannelSourceAddress(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t *pAddr); +void DMA_SetChannelDestinationAddress(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t *pAddr); +void DMA_SetChannelBlockSize(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t Size); +uint16_t DMA_GetTransferredNumber(DMA_Module *const DMAy, DMA_ChNumType ChNum); +void DMA_SetChannelLinkedListPointer(DMA_Module *const DMAy, DMA_ChNumType ChNum, DMA_LinkListItemType* pStr); +void DMA_TriggerSourceRequest(DMA_Module *const DMAy, DMA_ChNumType ChNum, DMA_ChTransacType Type, bool isLast); +void DMA_TriggerDestinationRequest(DMA_Module *const DMAy, DMA_ChNumType ChNum, DMA_ChTransacType Type, bool isLast); +void DMA_ChannelSourceAddressReloadCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd); +void DMA_ChannelDestinationAddressReloadCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd); + +void DMA_ChannelBusLockCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd); +void DMA_ChannelLockCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd); +void DMA_SetChannelBusLockLevel(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint64_t Level); +void DMA_SetChannelLockLevel(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint64_t Level); + + + +#ifdef __cplusplus +} +#endif + + +#endif /* ( defined(DMA1) || defined(DMA2) || defined(DMA3) ) */ +#endif /* __N32H76x_H78x_DMA_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dmamux.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dmamux.h new file mode 100644 index 0000000000..8117877bba --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dmamux.h @@ -0,0 +1,534 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dmamux.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef N32H76x_78x_DMAMUX_H +#define N32H76x_78x_DMAMUX_H + +#include "n32h76x_78x.h" + + +typedef enum +{ + DMAMUX1_ID =0, + DMAMUX2_ID =1 +}DMAMUX_ID; + + +/* Define used to get DMAMUX CHxCTRL register size */ +#define DMAMUX_CHCTRL_SIZE (0x00000004U) + +/* Define used to get DMAMUX status register offset */ +#define DMAMUX_CH_STATUS_OFFSET (0x80U) +/* Define used to get DMAMUX RequestGenerator offset */ +#define DMAMUX_REQ_GEN_OFFSET (0x100U) +/* Define used to get DMAMUX Request Generator status register offset */ +#define DMAMUX_REQ_GEN_STATUS_OFFSET (0x180U) + + +/** DMAMUX1_Request_selection DMAMUX1 Request selection */ +#define DMAMUX_REQUEST_ID_MASK (DMAMUX_CHxCTRL_REQID_MASK) +/* DMAMUX1 requests */ +#define DMAMUX1_REQUEST_GENERATOR0 ((uint16_t)0x01U-1U) /* DMAMUX1 request generator 0 */ +#define DMAMUX1_REQUEST_GENERATOR1 ((uint16_t)0x02U-1U) /* DMAMUX1 request generator 1 */ +#define DMAMUX1_REQUEST_GENERATOR2 ((uint16_t)0x03U-1U) /* DMAMUX1 request generator 2 */ +#define DMAMUX1_REQUEST_GENERATOR3 ((uint16_t)0x04U-1U) /* DMAMUX1 request generator 3 */ +#define DMAMUX1_REQUEST_GENERATOR4 ((uint16_t)0x05U-1U) /* DMAMUX1 request generator 4 */ +#define DMAMUX1_REQUEST_GENERATOR5 ((uint16_t)0x06U-1U) /* DMAMUX1 request generator 5 */ +#define DMAMUX1_REQUEST_GENERATOR6 ((uint16_t)0x07U-1U) /* DMAMUX1 request generator 6 */ +#define DMAMUX1_REQUEST_GENERATOR7 ((uint16_t)0x08U-1U) /* DMAMUX1 request generator 7 */ +#define DMAMUX1_REQUEST_ADC1 ((uint16_t)0x09U-1U) /* DMAMUX1 ADC1 request */ +#define DMAMUX1_REQUEST_ADC2 ((uint16_t)0x0AU-1U) /* DMAMUX1 ADC2 request */ +#define DMAMUX1_REQUEST_ADC3 ((uint16_t)0x0BU-1U) /* DMAMUX1 ADC3 request */ +//SHRTIM_DMA0-6 SHRTIM1-2 12-25 +#define DMAMUX1_REQUEST_SHRTIM1_DMA0 ((uint16_t)0x0CU-1U) /* DMAMUX1 SHRTIM1 request */ +#define DMAMUX1_REQUEST_SHRTIM1_DMA1 ((uint16_t)0x0DU-1U) /* DMAMUX1 SHRTIM1 request */ +#define DMAMUX1_REQUEST_SHRTIM1_DMA2 ((uint16_t)0x0EU-1U) /* DMAMUX1 SHRTIM1 request */ +#define DMAMUX1_REQUEST_SHRTIM1_DMA3 ((uint16_t)0x0FU-1U) /* DMAMUX1 SHRTIM1 request */ +#define DMAMUX1_REQUEST_SHRTIM1_DMA4 ((uint16_t)0x10U-1U) /* DMAMUX1 SHRTIM1 request */ +#define DMAMUX1_REQUEST_SHRTIM1_DMA5 ((uint16_t)0x11U-1U) /* DMAMUX1 SHRTIM1 request */ +#define DMAMUX1_REQUEST_SHRTIM1_DMA6 ((uint16_t)0x12U-1U) /* DMAMUX1 SHRTIM1 request */ +#define DMAMUX1_REQUEST_SHRTIM2_DMA0 ((uint16_t)0x13U-1U) /* DMAMUX1 SHRTIM2 request */ +#define DMAMUX1_REQUEST_SHRTIM2_DMA1 ((uint16_t)0x14U-1U) /* DMAMUX1 SHRTIM2 request */ +#define DMAMUX1_REQUEST_SHRTIM2_DMA2 ((uint16_t)0x15U-1U) /* DMAMUX1 SHRTIM2 request */ +#define DMAMUX1_REQUEST_SHRTIM2_DMA3 ((uint16_t)0x16U-1U) /* DMAMUX1 SHRTIM2 request */ +#define DMAMUX1_REQUEST_SHRTIM2_DMA4 ((uint16_t)0x17U-1U) /* DMAMUX1 SHRTIM2 request */ +#define DMAMUX1_REQUEST_SHRTIM2_DMA5 ((uint16_t)0x18U-1U) /* DMAMUX1 SHRTIM2 request */ +#define DMAMUX1_REQUEST_SHRTIM2_DMA6 ((uint16_t)0x19U-1U) /* DMAMUX1 SHRTIM2 request */ +//ATIM 26-53 +#define DMAMUX1_REQUEST_ATIM1_UP ((uint16_t)0x1AU-1U) /* DMAMUX1 ATIM1 UP request */ +#define DMAMUX1_REQUEST_ATIM1_CH1 ((uint16_t)0x1BU-1U) /* DMAMUX1 ATIM1 CH1 request */ +#define DMAMUX1_REQUEST_ATIM1_CH2 ((uint16_t)0x1CU-1U) /* DMAMUX1 ATIM1 CH2 request */ +#define DMAMUX1_REQUEST_ATIM1_CH3 ((uint16_t)0x1DU-1U) /* DMAMUX1 ATIM1 CH3 request */ +#define DMAMUX1_REQUEST_ATIM1_CH4 ((uint16_t)0x1EU-1U) /* DMAMUX1 ATIM1 CH4 request */ +#define DMAMUX1_REQUEST_ATIM1_TRIG ((uint16_t)0x1FU-1U) /* DMAMUX1 ATIM1 TRIG request */ +#define DMAMUX1_REQUEST_ATIM1_COM ((uint16_t)0x20U-1U) /* DMAMUX1 ATIM1 COM request */ +#define DMAMUX1_REQUEST_ATIM2_UP ((uint16_t)0x21U-1U) /* DMAMUX1 ATIM2 UP request */ +#define DMAMUX1_REQUEST_ATIM2_CH1 ((uint16_t)0x22U-1U) /* DMAMUX1 ATIM2 CH1 request */ +#define DMAMUX1_REQUEST_ATIM2_CH2 ((uint16_t)0x23U-1U) /* DMAMUX1 ATIM2 CH2 request */ +#define DMAMUX1_REQUEST_ATIM2_CH3 ((uint16_t)0x24U-1U) /* DMAMUX1 ATIM2 CH3 request */ +#define DMAMUX1_REQUEST_ATIM2_CH4 ((uint16_t)0x25U-1U) /* DMAMUX1 ATIM2 CH4 request */ +#define DMAMUX1_REQUEST_ATIM2_TRIG ((uint16_t)0x26U-1U) /* DMAMUX1 ATIM2 TRIG request */ +#define DMAMUX1_REQUEST_ATIM2_COM ((uint16_t)0x27U-1U) /* DMAMUX1 ATIM2 COM request */ +#define DMAMUX1_REQUEST_ATIM3_UP ((uint16_t)0x28U-1U) /* DMAMUX1 ATIM3 UP request */ +#define DMAMUX1_REQUEST_ATIM3_CH1 ((uint16_t)0x29U-1U) /* DMAMUX1 ATIM3 CH1 request */ +#define DMAMUX1_REQUEST_ATIM3_CH2 ((uint16_t)0x2AU-1U) /* DMAMUX1 ATIM3 CH2 request */ +#define DMAMUX1_REQUEST_ATIM3_CH3 ((uint16_t)0x2BU-1U) /* DMAMUX1 ATIM3 CH3 request */ +#define DMAMUX1_REQUEST_ATIM3_CH4 ((uint16_t)0x2CU-1U) /* DMAMUX1 ATIM3 CH4 request */ +#define DMAMUX1_REQUEST_ATIM3_TRIG ((uint16_t)0x2DU-1U) /* DMAMUX1 ATIM3 TRIG request */ +#define DMAMUX1_REQUEST_ATIM3_COM ((uint16_t)0x2EU-1U) /* DMAMUX1 ATIM1 COM request */ +#define DMAMUX1_REQUEST_ATIM4_UP ((uint16_t)0x2FU-1U) /* DMAMUX1 ATIM4 UP request */ +#define DMAMUX1_REQUEST_ATIM4_CH1 ((uint16_t)0x30U-1U) /* DMAMUX1 ATIM4 CH1 request */ +#define DMAMUX1_REQUEST_ATIM4_CH2 ((uint16_t)0x31U-1U) /* DMAMUX1 ATIM4 CH2 request */ +#define DMAMUX1_REQUEST_ATIM4_CH3 ((uint16_t)0x32U-1U) /* DMAMUX1 ATIM4 CH3 request */ +#define DMAMUX1_REQUEST_ATIM4_CH4 ((uint16_t)0x33U-1U) /* DMAMUX1 ATIM4 CH4 request */ +#define DMAMUX1_REQUEST_ATIM4_TRIG ((uint16_t)0x34U-1U) /* DMAMUX1 ATIM4 TRIG request */ +#define DMAMUX1_REQUEST_ATIM4_COM ((uint16_t)0x35U-1U) /* DMAMUX1 ATIM1 COM request */ +//GTIM 54-113 +#define DMAMUX1_REQUEST_GTIMA1_CH1 ((uint16_t)0x36U-1U) /* DMAMUX1 GTIMA1 CH1 request */ +#define DMAMUX1_REQUEST_GTIMA1_CH2 ((uint16_t)0x37U-1U) /* DMAMUX1 GTIMA1 CH2 request */ +#define DMAMUX1_REQUEST_GTIMA1_CH3 ((uint16_t)0x38U-1U) /* DMAMUX1 GTIMA1 CH3 request */ +#define DMAMUX1_REQUEST_GTIMA1_CH4 ((uint16_t)0x39U-1U) /* DMAMUX1 GTIMA1 CH4 request */ +#define DMAMUX1_REQUEST_GTIMA1_TRIG ((uint16_t)0x3AU-1U) /* DMAMUX1 GTIMA1 TRIG request */ +#define DMAMUX1_REQUEST_GTIMA1_UP ((uint16_t)0x3BU-1U) /* DMAMUX1 GTIMA1 UP request */ +#define DMAMUX1_REQUEST_GTIMA2_CH1 ((uint16_t)0x3CU-1U) /* DMAMUX1 GTIMA2 CH1 request */ +#define DMAMUX1_REQUEST_GTIMA2_CH2 ((uint16_t)0x3DU-1U) /* DMAMUX1 GTIMA2 CH2 request */ +#define DMAMUX1_REQUEST_GTIMA2_CH3 ((uint16_t)0x3EU-1U) /* DMAMUX1 GTIMA2 CH3 request */ +#define DMAMUX1_REQUEST_GTIMA2_CH4 ((uint16_t)0x3FU-1U) /* DMAMUX1 GTIMA2 CH4 request */ +#define DMAMUX1_REQUEST_GTIMA2_TRIG ((uint16_t)0x40U-1U) /* DMAMUX1 GTIMA2 TRIG request */ +#define DMAMUX1_REQUEST_GTIMA2_UP ((uint16_t)0x41U-1U) /* DMAMUX1 GTIMA2 UP request */ +#define DMAMUX1_REQUEST_GTIMA3_CH1 ((uint16_t)0x42U-1U) /* DMAMUX1 GTIMA3 CH1 request */ +#define DMAMUX1_REQUEST_GTIMA3_CH2 ((uint16_t)0x43U-1U) /* DMAMUX1 GTIMA3 CH2 request */ +#define DMAMUX1_REQUEST_GTIMA3_CH3 ((uint16_t)0x44U-1U) /* DMAMUX1 GTIMA3 CH3 request */ +#define DMAMUX1_REQUEST_GTIMA3_CH4 ((uint16_t)0x45U-1U) /* DMAMUX1 GTIMA3 CH4 request */ +#define DMAMUX1_REQUEST_GTIMA3_TRIG ((uint16_t)0x46U-1U) /* DMAMUX1 GTIMA3 TRIG request */ +#define DMAMUX1_REQUEST_GTIMA3_UP ((uint16_t)0x47U-1U) /* DMAMUX1 GTIMA3 UP request */ +#define DMAMUX1_REQUEST_GTIMA4_CH1 ((uint16_t)0x48U-1U) /* DMAMUX1 GTIMA4 CH1 request */ +#define DMAMUX1_REQUEST_GTIMA4_CH2 ((uint16_t)0x49U-1U) /* DMAMUX1 GTIMA4 CH2 request */ +#define DMAMUX1_REQUEST_GTIMA4_CH3 ((uint16_t)0x4AU-1U) /* DMAMUX1 GTIMA4 CH3 request */ +#define DMAMUX1_REQUEST_GTIMA4_CH4 ((uint16_t)0x4BU-1U) /* DMAMUX1 GTIMA4 CH4 request */ +#define DMAMUX1_REQUEST_GTIMA4_TRIG ((uint16_t)0x4CU-1U) /* DMAMUX1 GTIMA4 TRIG request */ +#define DMAMUX1_REQUEST_GTIMA4_UP ((uint16_t)0x4DU-1U) /* DMAMUX1 GTIMA4 UP request */ +#define DMAMUX1_REQUEST_GTIMA5_CH1 ((uint16_t)0x4EU-1U) /* DMAMUX1 GTIMA5 CH1 request */ +#define DMAMUX1_REQUEST_GTIMA5_CH2 ((uint16_t)0x4FU-1U) /* DMAMUX1 GTIMA5 CH2 request */ +#define DMAMUX1_REQUEST_GTIMA5_CH3 ((uint16_t)0x50U-1U) /* DMAMUX1 GTIMA5 CH3 request */ +#define DMAMUX1_REQUEST_GTIMA5_CH4 ((uint16_t)0x51U-1U) /* DMAMUX1 GTIMA5 CH4 request */ +#define DMAMUX1_REQUEST_GTIMA5_TRIG ((uint16_t)0x52U-1U) /* DMAMUX1 GTIMA5 TRIG request */ +#define DMAMUX1_REQUEST_GTIMA5_UP ((uint16_t)0x53U-1U) /* DMAMUX1 GTIMA5 UP request */ +#define DMAMUX1_REQUEST_GTIMA6_CH1 ((uint16_t)0x54U-1U) /* DMAMUX1 GTIMA6 CH1 request */ +#define DMAMUX1_REQUEST_GTIMA6_CH2 ((uint16_t)0x55U-1U) /* DMAMUX1 GTIMA6 CH2 request */ +#define DMAMUX1_REQUEST_GTIMA6_CH3 ((uint16_t)0x56U-1U) /* DMAMUX1 GTIMA6 CH3 request */ +#define DMAMUX1_REQUEST_GTIMA6_CH4 ((uint16_t)0x57U-1U) /* DMAMUX1 GTIMA6 CH4 request */ +#define DMAMUX1_REQUEST_GTIMA6_TRIG ((uint16_t)0x58U-1U) /* DMAMUX1 GTIMA6 TRIG request */ +#define DMAMUX1_REQUEST_GTIMA6_UP ((uint16_t)0x59U-1U) /* DMAMUX1 GTIMA6 UP request */ +#define DMAMUX1_REQUEST_GTIMA7_CH1 ((uint16_t)0x5AU-1U) /* DMAMUX1 GTIMA7 CH1 request */ +#define DMAMUX1_REQUEST_GTIMA7_CH2 ((uint16_t)0x5BU-1U) /* DMAMUX1 GTIMA7 CH2 request */ +#define DMAMUX1_REQUEST_GTIMA7_CH3 ((uint16_t)0x5CU-1U) /* DMAMUX1 GTIMA7 CH3 request */ +#define DMAMUX1_REQUEST_GTIMA7_CH4 ((uint16_t)0x5DU-1U) /* DMAMUX1 GTIMA7 CH4 request */ +#define DMAMUX1_REQUEST_GTIMA7_TRIG ((uint16_t)0x5EU-1U) /* DMAMUX1 GTIMA7 TRIG request */ +#define DMAMUX1_REQUEST_GTIMA7_UP ((uint16_t)0x5FU-1U) /* DMAMUX1 GTIMA7 UP request */ +#define DMAMUX1_REQUEST_GTIMB1_CH1 ((uint16_t)0x60U-1U) /* DMAMUX1 GTIMB1 CH1 request */ +#define DMAMUX1_REQUEST_GTIMB1_CH2 ((uint16_t)0x61U-1U) /* DMAMUX1 GTIMB1 CH2 request */ +#define DMAMUX1_REQUEST_GTIMB1_CH3 ((uint16_t)0x62U-1U) /* DMAMUX1 GTIMB1 CH3 request */ +#define DMAMUX1_REQUEST_GTIMB1_CH4 ((uint16_t)0x63U-1U) /* DMAMUX1 GTIMB1 CH4 request */ +#define DMAMUX1_REQUEST_GTIMB1_TRIG ((uint16_t)0x64U-1U) /* DMAMUX1 GTIMB1 TRIG request */ +#define DMAMUX1_REQUEST_GTIMB1_UP ((uint16_t)0x65U-1U) /* DMAMUX1 GTIMB1 UP request */ +#define DMAMUX1_REQUEST_GTIMB2_CH1 ((uint16_t)0x66U-1U) /* DMAMUX1 GTIMB2 CH1 request */ +#define DMAMUX1_REQUEST_GTIMB2_CH2 ((uint16_t)0x67U-1U) /* DMAMUX1 GTIMB2 CH2 request */ +#define DMAMUX1_REQUEST_GTIMB2_CH3 ((uint16_t)0x68U-1U) /* DMAMUX1 GTIMB2 CH3 request */ +#define DMAMUX1_REQUEST_GTIMB2_CH4 ((uint16_t)0x69U-1U) /* DMAMUX1 GTIMB2 CH4 request */ +#define DMAMUX1_REQUEST_GTIMB2_TRIG ((uint16_t)0x6AU-1U) /* DMAMUX1 GTIMB2 TRIG request */ +#define DMAMUX1_REQUEST_GTIMB2_UP ((uint16_t)0x6BU-1U) /* DMAMUX1 GTIMB2 UP request */ +#define DMAMUX1_REQUEST_GTIMB3_CH1 ((uint16_t)0x6CU-1U) /* DMAMUX1 GTIMB3 CH1 request */ +#define DMAMUX1_REQUEST_GTIMB3_CH2 ((uint16_t)0x6DU-1U) /* DMAMUX1 GTIMB3 CH2 request */ +#define DMAMUX1_REQUEST_GTIMB3_CH3 ((uint16_t)0x6EU-1U) /* DMAMUX1 GTIMB3 CH3 request */ +#define DMAMUX1_REQUEST_GTIMB3_CH4 ((uint16_t)0x6FU-1U) /* DMAMUX1 GTIMB3 CH4 request */ +#define DMAMUX1_REQUEST_GTIMB3_TRIG ((uint16_t)0x70U-1U) /* DMAMUX1 GTIMB3 TRIG request */ +#define DMAMUX1_REQUEST_GTIMB3_UP ((uint16_t)0x71U-1U) /* DMAMUX1 GTIMB3 UP request */ +//I2C 114-133 +#define DMAMUX1_REQUEST_I2C1_RX ((uint16_t)0x72U-1U) /* DMAMUX1 I2C1 RX request */ +#define DMAMUX1_REQUEST_I2C1_TX ((uint16_t)0x73U-1U) /* DMAMUX1 I2C1 TX request */ +#define DMAMUX1_REQUEST_I2C2_RX ((uint16_t)0x74U-1U) /* DMAMUX1 I2C2 RX request */ +#define DMAMUX1_REQUEST_I2C2_TX ((uint16_t)0x75U-1U) /* DMAMUX1 I2C2 TX request */ +#define DMAMUX1_REQUEST_I2C3_RX ((uint16_t)0x76U-1U) /* DMAMUX1 I2C3 RX request */ +#define DMAMUX1_REQUEST_I2C3_TX ((uint16_t)0x77U-1U) /* DMAMUX1 I2C3 TX request */ +#define DMAMUX1_REQUEST_I2C4_RX ((uint16_t)0x78U-1U) /* DMAMUX1 I2C4 RX request */ +#define DMAMUX1_REQUEST_I2C4_TX ((uint16_t)0x79U-1U) /* DMAMUX1 I2C4 TX request */ +#define DMAMUX1_REQUEST_I2C5_RX ((uint16_t)0x7AU-1U) /* DMAMUX1 I2C5 RX request */ +#define DMAMUX1_REQUEST_I2C5_TX ((uint16_t)0x7BU-1U) /* DMAMUX1 I2C5 TX request */ +#define DMAMUX1_REQUEST_I2C6_RX ((uint16_t)0x7CU-1U) /* DMAMUX1 I2C6 RX request */ +#define DMAMUX1_REQUEST_I2C6_TX ((uint16_t)0x7DU-1U) /* DMAMUX1 I2C6 TX request */ +#define DMAMUX1_REQUEST_I2C7_RX ((uint16_t)0x7EU-1U) /* DMAMUX1 I2C7 RX request */ +#define DMAMUX1_REQUEST_I2C7_TX ((uint16_t)0x7FU-1U) /* DMAMUX1 I2C7 TX request */ +#define DMAMUX1_REQUEST_I2C8_RX ((uint16_t)0x80U-1U) /* DMAMUX1 I2C8 RX request */ +#define DMAMUX1_REQUEST_I2C8_TX ((uint16_t)0x81U-1U) /* DMAMUX1 I2C8 TX request */ +#define DMAMUX1_REQUEST_I2C9_RX ((uint16_t)0x82U-1U) /* DMAMUX1 I2C9 RX request */ +#define DMAMUX1_REQUEST_I2C9_TX ((uint16_t)0x83U-1U) /* DMAMUX1 I2C9 TX request */ +#define DMAMUX1_REQUEST_I2C10_RX ((uint16_t)0x84U-1U) /* DMAMUX1 I2C10 RX request */ +#define DMAMUX1_REQUEST_I2C10_TX ((uint16_t)0x85U-1U) /* DMAMUX1 I2C10 TX request */ +//USART 134-149 +#define DMAMUX1_REQUEST_USART1_RX ((uint16_t)0x86U-1U) /* DMAMUX1 USART1 RX request */ +#define DMAMUX1_REQUEST_USART1_TX ((uint16_t)0x87U-1U) /* DMAMUX1 USART1 TX request */ +#define DMAMUX1_REQUEST_USART2_RX ((uint16_t)0x88U-1U) /* DMAMUX1 USART2 RX request */ +#define DMAMUX1_REQUEST_USART2_TX ((uint16_t)0x89U-1U) /* DMAMUX1 USART2 TX request */ +#define DMAMUX1_REQUEST_USART3_RX ((uint16_t)0x8AU-1U) /* DMAMUX1 USART3 RX request */ +#define DMAMUX1_REQUEST_USART3_TX ((uint16_t)0x8BU-1U) /* DMAMUX1 USART3 TX request */ +#define DMAMUX1_REQUEST_USART4_RX ((uint16_t)0x8CU-1U) /* DMAMUX1 USART4 RX request */ +#define DMAMUX1_REQUEST_USART4_TX ((uint16_t)0x8DU-1U) /* DMAMUX1 USART4 TX request */ +#define DMAMUX1_REQUEST_USART5_RX ((uint16_t)0x8EU-1U) /* DMAMUX1 USART5 RX request */ +#define DMAMUX1_REQUEST_USART5_TX ((uint16_t)0x8FU-1U) /* DMAMUX1 USART5 TX request */ +#define DMAMUX1_REQUEST_USART6_RX ((uint16_t)0x90U-1U) /* DMAMUX1 USART6 RX request */ +#define DMAMUX1_REQUEST_USART6_TX ((uint16_t)0x91U-1U) /* DMAMUX1 USART6 TX request */ +#define DMAMUX1_REQUEST_USART7_RX ((uint16_t)0x92U-1U) /* DMAMUX1 USART7 RX request */ +#define DMAMUX1_REQUEST_USART7_TX ((uint16_t)0x93U-1U) /* DMAMUX1 USART7 TX request */ +#define DMAMUX1_REQUEST_USART8_RX ((uint16_t)0x94U-1U) /* DMAMUX1 USART8 RX request */ +#define DMAMUX1_REQUEST_USART8_TX ((uint16_t)0x95U-1U) /* DMAMUX1 USART8 TX request */ +//UART9-15 150-163 +#define DMAMUX1_REQUEST_UART9_RX ((uint16_t)0x96U-1U) /* DMAMUX1 UART9 RX request */ +#define DMAMUX1_REQUEST_UART9_TX ((uint16_t)0x97U-1U) /* DMAMUX1 UART9 TX request */ +#define DMAMUX1_REQUEST_UART10_RX ((uint16_t)0x98U-1U) /* DMAMUX1 UART10 RX request */ +#define DMAMUX1_REQUEST_UART10_TX ((uint16_t)0x99U-1U) /* DMAMUX1 UART10 TX request */ +#define DMAMUX1_REQUEST_UART11_RX ((uint16_t)0x9AU-1U) /* DMAMUX1 UART11 RX request */ +#define DMAMUX1_REQUEST_UART11_TX ((uint16_t)0x9BU-1U) /* DMAMUX1 UART11 TX request */ +#define DMAMUX1_REQUEST_UART12_RX ((uint16_t)0x9CU-1U) /* DMAMUX1 UART12 RX request */ +#define DMAMUX1_REQUEST_UART12_TX ((uint16_t)0x9DU-1U) /* DMAMUX1 UART12 TX request */ +#define DMAMUX1_REQUEST_UART13_RX ((uint16_t)0x9EU-1U) /* DMAMUX1 UART13 RX request */ +#define DMAMUX1_REQUEST_UART13_TX ((uint16_t)0x9FU-1U) /* DMAMUX1 UART13 TX request */ +#define DMAMUX1_REQUEST_UART14_RX ((uint16_t)0xA0U-1U) /* DMAMUX1 UART14 RX request */ +#define DMAMUX1_REQUEST_UART14_TX ((uint16_t)0xA1U-1U) /* DMAMUX1 UART14 TX request */ +#define DMAMUX1_REQUEST_UART15_RX ((uint16_t)0xA2U-1U) /* DMAMUX1 UART15 RX request */ +#define DMAMUX1_REQUEST_UART15_TX ((uint16_t)0xA3U-1U) /* DMAMUX1 UART15 TX request */ +//SPI1-7 164-185 +#define DMAMUX1_REQUEST_SPI1_RX ((uint16_t)0xA4U-1U) /* DMAMUX1 SPI1 RX request */ +#define DMAMUX1_REQUEST_I2S1_TX ((uint16_t)0xA5U-1U) /* DMAMUX1 I2S1 TX request */ +#define DMAMUX1_REQUEST_SPI2_RX ((uint16_t)0xA6U-1U) /* DMAMUX1 SPI2 RX request */ +#define DMAMUX1_REQUEST_I2S2_TX ((uint16_t)0xA7U-1U) /* DMAMUX1 I2S2 TX request */ +#define DMAMUX1_REQUEST_SPI3_RX ((uint16_t)0xA8U-1U) /* DMAMUX1 SPI3 RX request */ +#define DMAMUX1_REQUEST_I2S3_TX ((uint16_t)0xA9U-1U) /* DMAMUX1 I2S3 TX request */ +#define DMAMUX1_REQUEST_SPI4_RX ((uint16_t)0xAAU-1U) /* DMAMUX1 SPI4 RX request */ +#define DMAMUX1_REQUEST_I2S4_TX ((uint16_t)0xABU-1U) /* DMAMUX1 I2S4 TX request */ +#define DMAMUX1_REQUEST_SPI5_RX ((uint16_t)0xACU-1U) /* DMAMUX1 SPI5 RX request */ +#define DMAMUX1_REQUEST_SPI1_TX ((uint16_t)0xADU-1U) /* DMAMUX1 SPI1 TX request */ +#define DMAMUX1_REQUEST_SPI6_RX ((uint16_t)0xAEU-1U) /* DMAMUX1 SPI6 RX request */ +#define DMAMUX1_REQUEST_SPI2_TX ((uint16_t)0xAFU-1U) /* DMAMUX1 SPI2 TX request */ +#define DMAMUX1_REQUEST_SPI7_RX ((uint16_t)0xB0U-1U) /* DMAMUX1 SPI7 RX request */ +#define DMAMUX1_REQUEST_SPI3_TX ((uint16_t)0xB1U-1U) /* DMAMUX1 SPI3 TX request */ +#define DMAMUX1_REQUEST_I2S1_RX ((uint16_t)0xB2U-1U) /* DMAMUX1 I2S1 RX request */ +#define DMAMUX1_REQUEST_SPI4_TX ((uint16_t)0xB3U-1U) /* DMAMUX1 SPI4 TX request */ +#define DMAMUX1_REQUEST_I2S2_RX ((uint16_t)0xB4U-1U) /* DMAMUX1 I2S2 RX request */ +#define DMAMUX1_REQUEST_SPI5_TX ((uint16_t)0xB5U-1U) /* DMAMUX1 SPI5 TX request */ +#define DMAMUX1_REQUEST_I2S3_RX ((uint16_t)0xB6U-1U) /* DMAMUX1 I2S3 RX request */ +#define DMAMUX1_REQUEST_SPI6_TX ((uint16_t)0xB7U-1U) /* DMAMUX1 SPI6 TX request */ +#define DMAMUX1_REQUEST_I2S4_RX ((uint16_t)0xB8U-1U) /* DMAMUX1 I2S4 RX request */ +#define DMAMUX1_REQUEST_SPI7_TX ((uint16_t)0xB9U-1U) /* DMAMUX1 SPI7 TX request */ +//LPUART 1-2 +#define DMAMUX1_REQUEST_LPUART1_RX ((uint16_t)0xBAU-1U) /* DMAMUX1 LPUART1 RX request */ +#define DMAMUX1_REQUEST_LPUART1_TX ((uint16_t)0xBBU-1U) /* DMAMUX1 LPUART1 RX request */ +#define DMAMUX1_REQUEST_LPUART2_RX ((uint16_t)0xBCU-1U) /* DMAMUX1 LPUART2 RX request */ +#define DMAMUX1_REQUEST_LPUART2_TX ((uint16_t)0xBDU-1U) /* DMAMUX1 LPUART2 RX request */ +//DAC1-2 190-191 +#define DMAMUX1_REQUEST_DAC1 ((uint16_t)0xBEU-1U) /* DMAMUX1 DAC1 request */ +#define DMAMUX1_REQUEST_DAC2 ((uint16_t)0xBFU-1U) /* DMAMUX1 DAC2 request */ +//DSMU 192-195 +#define DMAMUX1_REQUEST_DSMU_CH1 ((uint16_t)0xC0U-1U) /* DMAMUX1 DSMU1 request */ +#define DMAMUX1_REQUEST_DSMU_CH2 ((uint16_t)0xC1U-1U) /* DMAMUX1 DSMU2 request */ +#define DMAMUX1_REQUEST_DSMU_CH3 ((uint16_t)0xC2U-1U) /* DMAMUX1 DSMU3 request */ +#define DMAMUX1_REQUEST_DSMU_CH4 ((uint16_t)0xC3U-1U) /* DMAMUX1 DSMU4 request */ +//CANFD 1-2 196-203 +#define DMAMUX1_REQUEST_CANFD1 ((uint16_t)0xC4U-1U) /* DMAMUX1 CANFD1 request */ +#define DMAMUX1_REQUEST_CANFD2 ((uint16_t)0xC5U-1U) /* DMAMUX1 CANFD2 request */ +#define DMAMUX1_REQUEST_CANFD3 ((uint16_t)0xC6U-1U) /* DMAMUX1 CANFD3 request */ +#define DMAMUX1_REQUEST_CANFD4 ((uint16_t)0xC7U-1U) /* DMAMUX1 CANFD4 request */ +#define DMAMUX1_REQUEST_CANFD5 ((uint16_t)0xC8U-1U) /* DMAMUX1 CANFD5 request */ +#define DMAMUX1_REQUEST_CANFD6 ((uint16_t)0xC9U-1U) /* DMAMUX1 CANFD6 request */ +#define DMAMUX1_REQUEST_CANFD7 ((uint16_t)0xCAU-1U) /* DMAMUX1 CANFD7 request */ +#define DMAMUX1_REQUEST_CANFD8 ((uint16_t)0xCBU-1U) /* DMAMUX1 CANFD8 request */ +//CORDIC 204-205 +#define DMAMUX1_REQUEST_CORDIC_READ ((uint16_t)0xCCU-1U) /* DMAMUX1 CORDIC Read request */ +#define DMAMUX1_REQUEST_CORDIC_WRITE ((uint16_t)0xCDU-1U) /* DMAMUX1 CORDIC Write request */ +//CORDIC 206-207 +#define DMAMUX1_REQUEST_FMAC_READ ((uint16_t)0xCEU-1U) /* DMAMUX1 FMAC Read request */ +#define DMAMUX1_REQUEST_FMAC_WRITE ((uint16_t)0xCFU-1U) /* DMAMUX1 FMAC Write request */ +//BTIM1-4 208-211UEST +#define DMAMUX1_REQUEST_BTIM1 ((uint16_t)0xD0U-1U) /* DMAMUX1 BTIM1 request */ +#define DMAMUX1_REQUEST_BTIM2 ((uint16_t)0xD1U-1U) /* DMAMUX1 BTIM2 request */ +#define DMAMUX1_REQUEST_BTIM3 ((uint16_t)0xD2U-1U) /* DMAMUX1 BTIM3 request */ +#define DMAMUX1_REQUEST_BTIM4 ((uint16_t)0xD3U-1U) /* DMAMUX1 BTIM4 request */ +//GTIMB1-3 212-214UEST +#define DMAMUX1_REQUEST_GTIMB1_COM ((uint16_t)0xD4U-1U) /* DMAMUX1 GTIMB1 COM request */ +#define DMAMUX1_REQUEST_GTIMB2_COM ((uint16_t)0xD5U-1U) /* DMAMUX1 GTIMB2 COM request */ +#define DMAMUX1_REQUEST_GTIMB3_COM ((uint16_t)0xD6U-1U) /* DMAMUX1 GTIMB3 COM request */ +//DAC3-6 215-218 +#define DMAMUX1_REQUEST_DAC3 ((uint16_t)0xB7U-1U) /* DMAMUX1 DAC3 request */ +#define DMAMUX1_REQUEST_DAC4 ((uint16_t)0xB8U-1U) /* DMAMUX1 DAC4 request */ +#define DMAMUX1_REQUEST_DAC5 ((uint16_t)0xB9U-1U) /* DMAMUX1 DAC5 request */ +#define DMAMUX1_REQUEST_DAC6 ((uint16_t)0xBAU-1U) /* DMAMUX1 DAC6 request */ + + +/* DMAMUX_2 requests */ +#define DMAMUX2_REQUEST_GENERATOR0 ((uint16_t)0x01U-1U) /* DMAMUX2 request generator 0 */ +#define DMAMUX2_REQUEST_GENERATOR1 ((uint16_t)0x02U-1U) /* DMAMUX2 request generator 1 */ +#define DMAMUX2_REQUEST_GENERATOR2 ((uint16_t)0x03U-1U) /* DMAMUX2 request generator 2 */ +#define DMAMUX2_REQUEST_GENERATOR3 ((uint16_t)0x04U-1U) /* DMAMUX2 request generator 3 */ +#define DMAMUX2_REQUEST_GENERATOR4 ((uint16_t)0x05U-1U) /* DMAMUX2 request generator 4 */ +#define DMAMUX2_REQUEST_GENERATOR5 ((uint16_t)0x06U-1U) /* DMAMUX2 request generator 5 */ +#define DMAMUX2_REQUEST_GENERATOR6 ((uint16_t)0x07U-1U) /* DMAMUX2 request generator 6 */ +#define DMAMUX2_REQUEST_GENERATOR7 ((uint16_t)0x08U-1U) /* DMAMUX2 request generator 7 */ +#define DMAMUX2_REQUEST_GENERATOR8 ((uint16_t)0x09U-1U) /* DMAMUX2 request generator 8 */ +#define DMAMUX2_REQUEST_GENERATOR9 ((uint16_t)0x0AU-1U) /* DMAMUX2 request generator 9 */ +#define DMAMUX2_REQUEST_GENERATOR10 ((uint16_t)0x0BU-1U) /* DMAMUX2 request generator 10 */ +#define DMAMUX2_REQUEST_GENERATOR11 ((uint16_t)0x0CU-1U) /* DMAMUX2 request generator 11 */ +#define DMAMUX2_REQUEST_GENERATOR12 ((uint16_t)0x0DU-1U) /* DMAMUX2 request generator 12 */ +#define DMAMUX2_REQUEST_GENERATOR13 ((uint16_t)0x0EU-1U) /* DMAMUX2 request generator 13 */ +#define DMAMUX2_REQUEST_GENERATOR14 ((uint16_t)0x0FU-1U) /* DMAMUX2 request generator 14 */ +#define DMAMUX2_REQUEST_GENERATOR15 ((uint16_t)0x10U-1U) /* DMAMUX2 request generator 15 */ +//xSPI1-2 1-4 +#define DMAMUX2_REQUEST_REQ_XSPI1_RX ((uint16_t)0x19U-1U) /* DMAMUX2 XSPI1 RX request */ +#define DMAMUX2_REQUEST_REQ_XSPI1_TX ((uint16_t)0x1AU-1U) /* DMAMUX2 XSPI1 TX request */ +#define DMAMUX2_REQUEST_REQ_XSPI2_RX ((uint16_t)0x1BU-1U) /* DMAMUX2 XSPI2 RX request */ +#define DMAMUX2_REQUEST_REQ_XSPI2_TX ((uint16_t)0x1CU-1U) /* DMAMUX2 XSPI2 TX request */ + +#define DMAMUX_SYNC_ID_MASK (DMAMUX_CHxCTRL_SYID_MASK) +/** DMAMUX_SYNC_EVT Synchronization Signal Event */ +#define DMAMUX1_SYNC_DMAMUX1_EVT0_7 ((uint32_t)0x00000000U) /* DMAMUX1 synchronization Signal is DMAMUX1 Channel0~7 Event */ +#define DMAMUX1_SYNC_DMAMUX1_EVT8_15 ((uint32_t)0x01000000U) /* DMAMUX1 synchronization Signal is DMAMUX1 Channel8~15 Event */ +#define DMAMUX1_SYNC_DMAMUX1_EVT16_23 ((uint32_t)0x02000000U) /* DMAMUX1 synchronization Signal is DMAMUX1 Channel16~23 Event */ +#define DMAMUX1_SYNC_LPTIM5_OUT ((uint32_t)0x03000000U) /* DMAMUX1 synchronization Signal is LPTIM5 OUT */ +#define DMAMUX1_SYNC_LPTIM4_OUT ((uint32_t)0x04000000U) /* DMAMUX1 synchronization Signal is LPTIM4 OUT */ +#define DMAMUX1_SYNC_LPTIM3_OUT ((uint32_t)0x05000000U) /* DMAMUX1 synchronization Signal is LPTIM3 OUT */ +#define DMAMUX1_SYNC_LPTIM2_OUT ((uint32_t)0x06000000U) /* DMAMUX1 synchronization Signal is LPTIM2 OUT */ +#define DMAMUX1_SYNC_LPTIM1_OUT ((uint32_t)0x07000000U) /* DMAMUX1 synchronization Signal is LPTIM1 OUT */ +#define DMAMUX1_SYNC_EXTI0 ((uint32_t)0x08000000U) /* DMAMUX1 synchronization Signal is EXTI0 IT */ +#define DMAMUX2_SYNC_INTERNAL_USED ((uint32_t)0x00000000U) /* DMAMUX2 synchronization Signal is Internal used or unused */ + + +#define DMAMUX_REQ_NUMBER_MASK (DMAMUX_CHxCTRL_NUMREQ_MASK) +#define DMAMUX_REQ_NUMBER_Pos (19U) + +/** DMAMUX Synchronization Signal Polarity*/ +#define DMAMUX_SYNC_POL_MASK (DMAMUX_CHxCTRL_SYPOL_MASK) +#define DMAMUX_SYNC_NO_EVENT (0x00000000U) /* All requests are blocked */ +#define DMAMUX_SYNC_POL_RISING (DMAMUX_CHxCTRL_SYPOL_0) /* Synchronization on event on rising edge */ +#define DMAMUX_SYNC_POL_FALLING (DMAMUX_CHxCTRL_SYPOL_1) /* Synchronization on event on falling edge */ +#define DMAMUX_SYNC_POL_RISING_FALLING (DMAMUX_CHxCTRL_SYPOL_0 | DMAMUX_CHxCTRL_SYPOL_1) /* Synchronization on event on rising and falling edge */ + +#define DMAMUX_EVENT_GEN_MASK (DMAMUX_CHxCTRL_EVEGEN) +#define DMAMUX_SYN_ENABLE_MASK (DMAMUX_CHxCTRL_SYEN) +#define DMAMUX_SYNOVERRUN_INTEN_MASK (DMAMUX_CHxCTRL_SOIEN) + +#define DMAMUX_GEN_ENABLE_MASK (DMAMUX_CHxCFG_GEN) + +/** DMAMUX_REQUEST_GENERATOR Request Generator Channel */ +#define DMAMUX_REQ_GEN_0 (0x00000000U) +#define DMAMUX_REQ_GEN_1 (0x00000001U) +#define DMAMUX_REQ_GEN_2 (0x00000002U) +#define DMAMUX_REQ_GEN_3 (0x00000003U) +#define DMAMUX_REQ_GEN_4 (0x00000004U) +#define DMAMUX_REQ_GEN_5 (0x00000005U) +#define DMAMUX_REQ_GEN_6 (0x00000006U) +#define DMAMUX_REQ_GEN_7 (0x00000007U) +#define DMAMUX_REQ_GEN_8 (0x00000008U) +#define DMAMUX_REQ_GEN_9 (0x00000009U) +#define DMAMUX_REQ_GEN_10 (0x0000000AU) +#define DMAMUX_REQ_GEN_11 (0x0000000BU) +#define DMAMUX_REQ_GEN_12 (0x0000000CU) +#define DMAMUX_REQ_GEN_13 (0x0000000DU) +#define DMAMUX_REQ_GEN_14 (0x0000000EU) +#define DMAMUX_REQ_GEN_15 (0x0000000FU) + +/** DMAMUX_REQUEST_GEN_POLARITY External Request Signal Generation Polarity */ +#define DMAMUX_REQ_GEN_POL_MASK (DMAMUX_CHxCFG_GPOL_MASK) +#define DMAMUX_REQ_GEN_NO_EVENT (0x00000000U) /* No external DMA request generation */ +#define DMAMUX_REQ_GEN_POL_RISING (DMAMUX_CHxCFG_GPOL_0) /* External DMA request generation on event on rising edge */ +#define DMAMUX_REQ_GEN_POL_FALLING (DMAMUX_CHxCFG_GPOL_1) /* External DMA request generation on event on falling edge */ +#define DMAMUX_REQ_GEN_POL_RISING_FALLING (DMAMUX_CHxCFG_GPOL_0 | DMAMUX_CHxCFG_GPOL_1) /* External DMA request generation on rising and falling edge */ + +#define DMAMUX_REQ_GEN_NUMBER_MASK (DMAMUX_CHxCFG_GNUMREQ_MASK) +#define DMAMUX_REQ_GEN_NUMBER_Pos (19U) + +#define DMAMUX_TRIGOVERRUN_INTEN_MASK (DMAMUX_CHxCFG_TOVIEN) + +#define DMAMUX_REQ_GEN_SIG_ID_MASK (DMAMUX_CHxCFG_SYID_MASK) + +/** DMAMUX1 External Request Signal Generation */ +#define DMAMUX1_REQ_GEN_DMAMUX1_EVT0_EVT7 ((uint32_t)0x00000001U-1U) /* DMAMUX1 Request generator Signal is DMAMUX1 Channel0-7 Event */ +#define DMAMUX1_REQ_GEN_DMAMUX1_EVT8_EVT5 ((uint32_t)0x00000002U-1U) /* DMAMUX1 Request generator Signal is DMAMUX1 Channel8_15 Event */ +#define DMAMUX1_REQ_GEN_DMAMUX1_EVT16_EVT23 ((uint32_t)0x00000003U-1U) /* DMAMUX1 Request generator Signal is DMAMUX1 Channel16_23 Event */ +#define DMAMUX1_REQ_GEN_LPTIM4_OUT ((uint32_t)0x00000004U-1U) /* DMAMUX1 Request generator Signal is LPTIM4 OUT */ +#define DMAMUX1_REQ_GEN_LPTIM3_OUT ((uint32_t)0x00000005U-1U) /* DMAMUX1 Request generator Signal is LPTIM3 OUT */ +#define DMAMUX1_REQ_GEN_LPTIM2_OUT ((uint32_t)0x00000006U-1U) /* DMAMUX1 Request generator Signal is LPTIM2 OUT */ +#define DMAMUX1_REQ_GEN_LPTIM1_OUT ((uint32_t)0x00000007U-1U) /* DMAMUX1 Request generator Signal is LPTIM1 OUT */ +#define DMAMUX1_REQ_GEN_EXTI0 ((uint32_t)0x00000008U-1U) /* DMAMUX1 Request generator Signal is EXTI0 IT */ +#define DMAMUX1_REQ_GEN_CANFD1_INT0 ((uint32_t)0x00000009U-1U) /* DMAMUX1 Request generator Signal is CANFD1 golgal interrupt 0 */ +#define DMAMUX1_REQ_GEN_CANFD2_INT0 ((uint32_t)0x0000000AU-1U) /* DMAMUX1 Request generator Signal is CANFD2 golgal interrupt 0 */ +#define DMAMUX1_REQ_GEN_CANFD3_INT0 ((uint32_t)0x0000000BU-1U) /* DMAMUX1 Request generator Signal is CANFD3 golgal interrupt 0 */ +#define DMAMUX1_REQ_GEN_CANFD4_INT0 ((uint32_t)0x0000000CU-1U) /* DMAMUX1 Request generator Signal is CANFD4 golgal interrupt 0 */ +#define DMAMUX1_REQ_GEN_CANFD5_INT0 ((uint32_t)0x0000000DU-1U) /* DMAMUX1 Request generator Signal is CANFD5 golgal interrupt 0 */ +#define DMAMUX1_REQ_GEN_CANFD6_INT0 ((uint32_t)0x0000000EU-1U) /* DMAMUX1 Request generator Signal is CANFD6 golgal interrupt 0 */ +#define DMAMUX1_REQ_GEN_CANFD7_INT0 ((uint32_t)0x0000000FU-1U) /* DMAMUX1 Request generator Signal is CANFD7 golgal interrupt 0 */ +#define DMAMUX1_REQ_GEN_CANFD8_INT0 ((uint32_t)0x00000010U-1U) /* DMAMUX1 Request generator Signal is CANFD8 golgal interrupt 0 */ +#define DMAMUX1_REQ_GEN_LPTIM5_OUT ((uint32_t)0x00000011U-1U) /* DMAMUX1 Request generator Signal is LPTIM4 OUT */ +#define DMAMUX1_REQ_GEN_ESC_INT ((uint32_t)0x00000012U-1U) /* DMAMUX1 Request generator Signal is ESC golgal interrupt */ +#define DMAMUX1_REQ_GEN_CANFD1_INT1 ((uint32_t)0x00000013U-1U) /* DMAMUX1 Request generator Signal is CANFD1 golgal interrupt 1 */ +#define DMAMUX1_REQ_GEN_CANFD2_INT1 ((uint32_t)0x00000014U-1U) /* DMAMUX1 Request generator Signal is CANFD2 golgal interrupt 1 */ +#define DMAMUX1_REQ_GEN_CANFD3_INT1 ((uint32_t)0x00000015U-1U) /* DMAMUX1 Request generator Signal is CANFD3 golgal interrupt 1 */ +#define DMAMUX1_REQ_GEN_CANFD4_INT1 ((uint32_t)0x00000016U-1U) /* DMAMUX1 Request generator Signal is CANFD4 golgal interrupt 1 */ +#define DMAMUX1_REQ_GEN_CANFD5_INT1 ((uint32_t)0x00000017U-1U) /* DMAMUX1 Request generator Signal is CANFD5 golgal interrupt 1 */ +#define DMAMUX1_REQ_GEN_CANFD6_INT1 ((uint32_t)0x00000018U-1U) /* DMAMUX1 Request generator Signal is CANFD6 golgal interrupt 1 */ +#define DMAMUX1_REQ_GEN_CANFD7_INT1 ((uint32_t)0x00000019U-1U) /* DMAMUX1 Request generator Signal is CANFD7 golgal interrupt 1 */ +#define DMAMUX1_REQ_GEN_CANFD8_INT1 ((uint32_t)0x0000001AU-1U) /* DMAMUX1 Request generator Signal is CANFD8 golgal interrupt 1 */ +/** DMAMUX2 External Request Signal Generation */ +#define DMAMUX2_DMA1_CH0_TC_INT ((uint32_t)0x00000001U-1U) /* DMAMUX2 Request generator Signal is DMA1 Channel0 Transfer complete inttrupt */ +#define DMAMUX2_DMA1_CH1_TC_INT ((uint32_t)0x00000002U-1U) /* DMAMUX2 Request generator Signal is DMA1 Channel1 Transfer complete inttrupt */ +#define DMAMUX2_DMA1_CH2_TC_INT ((uint32_t)0x00000003U-1U) /* DMAMUX2 Request generator Signal is DMA1 Channel2 Transfer complete inttrupt */ +#define DMAMUX2_DMA1_CH3_TC_INT ((uint32_t)0x00000004U-1U) /* DMAMUX2 Request generator Signal is DMA1 Channel3 Transfer complete inttrupt */ +#define DMAMUX2_DMA1_CH4_TC_INT ((uint32_t)0x00000005U-1U) /* DMAMUX2 Request generator Signal is DMA1 Channel4 Transfer complete inttrupt */ +#define DMAMUX2_DMA1_CH5_TC_INT ((uint32_t)0x00000006U-1U) /* DMAMUX2 Request generator Signal is DMA1 Channel5 Transfer complete inttrupt */ +#define DMAMUX2_DMA1_CH6_TC_INT ((uint32_t)0x00000007U-1U) /* DMAMUX2 Request generator Signal is DMA1 Channel6 Transfer complete inttrupt */ +#define DMAMUX2_DMA1_CH7_TC_INT ((uint32_t)0x00000008U-1U) /* DMAMUX2 Request generator Signal is DMA1 Channel7 Transfer complete inttrupt */ +#define DMAMUX2_DMA2_CH0_TC_INT ((uint32_t)0x00000009U-1U) /* DMAMUX2 Request generator Signal is DMA2 Channel0 Transfer complete inttrupt */ +#define DMAMUX2_DMA2_CH1_TC_INT ((uint32_t)0x0000000AU-1U) /* DMAMUX2 Request generator Signal is DMA2 Channel1 Transfer complete inttrupt */ +#define DMAMUX2_DMA2_CH2_TC_INT ((uint32_t)0x0000000BU-1U) /* DMAMUX2 Request generator Signal is DMA2 Channel2 Transfer complete inttrupt */ +#define DMAMUX2_DMA2_CH3_TC_INT ((uint32_t)0x0000000CU-1U) /* DMAMUX2 Request generator Signal is DMA2 Channel3 Transfer complete inttrupt */ +#define DMAMUX2_DMA2_CH4_TC_INT ((uint32_t)0x0000000DU-1U) /* DMAMUX2 Request generator Signal is DMA2 Channel4 Transfer complete inttrupt */ +#define DMAMUX2_DMA2_CH5_TC_INT ((uint32_t)0x0000000EU-1U) /* DMAMUX2 Request generator Signal is DMA2 Channel5 Transfer complete inttrupt */ +#define DMAMUX2_DMA2_CH6_TC_INT ((uint32_t)0x0000000FU-1U) /* DMAMUX2 Request generator Signal is DMA2 Channel6 Transfer complete inttrupt */ +#define DMAMUX2_DMA2_CH7_TC_INT ((uint32_t)0x00000010U-1U) /* DMAMUX2 Request generator Signal is DMA2 Channel7 Transfer complete inttrupt */ +#define DMAMUX2_DMA3_CH0_TC_INT ((uint32_t)0x00000011U-1U) /* DMAMUX2 Request generator Signal is DMA3 Channel0 Transfer complete inttrupt */ +#define DMAMUX2_DMA3_CH1_TC_INT ((uint32_t)0x00000012U-1U) /* DMAMUX2 Request generator Signal is DMA3 Channel1 Transfer complete inttrupt */ +#define DMAMUX2_DMA3_CH2_TC_INT ((uint32_t)0x00000013U-1U) /* DMAMUX2 Request generator Signal is DMA3 Channel2 Transfer complete inttrupt */ +#define DMAMUX2_DMA3_CH3_TC_INT ((uint32_t)0x00000014U-1U) /* DMAMUX2 Request generator Signal is DMA3 Channel3 Transfer complete inttrupt */ +#define DMAMUX2_DMA3_CH4_TC_INT ((uint32_t)0x00000015U-1U) /* DMAMUX2 Request generator Signal is DMA3 Channel4 Transfer complete inttrupt */ +#define DMAMUX2_DMA3_CH5_TC_INT ((uint32_t)0x00000016U-1U) /* DMAMUX2 Request generator Signal is DMA3 Channel5 Transfer complete inttrupt */ +#define DMAMUX2_DMA3_CH6_TC_INT ((uint32_t)0x00000017U-1U) /* DMAMUX2 Request generator Signal is DMA3 Channel6 Transfer complete inttrupt */ +#define DMAMUX2_DMA3_CH7_TC_INT ((uint32_t)0x00000018U-1U) /* DMAMUX2 Request generator Signal is DMA3 Channel7 Transfer complete inttrupt */ +#define DMAMUX2_REQ_GEN_DMAMUX2_LCDC_INT ((uint32_t)0x00000019U-1U) /* DMAMUX2 Request generator Signal is LCD interrupt */ +#define DMAMUX2_REQ_GEN_DMAMUX2_GPU_INT ((uint32_t)0x0000001AU-1U) /* DMAMUX2 Request generator Signal is GPU interrupt */ +#define DMAMUX2_REQ_GEN_DMAMUX2_JEPG_SGDMA_H2P_INT ((uint32_t)0x0000001BU-1U) /* DMAMUX2 Request generator Signal is JEPG_SGDMA_H2P interrupt */ +#define DMAMUX2_REQ_GEN_DMAMUX2_JEPG_SGDMA_P2H_INT ((uint32_t)0x0000001CU-1U) /* DMAMUX2 Request generator Signal is JEPG_SGDMA_P2H interrupt */ +#define DMAMUX2_REQ_GEN_DMAMUX2_MIPI_INT ((uint32_t)0x0000001DU-1U) /* DMAMUX2 Request generator Signal is MIPI interrupt */ +#define DMAMUX2_REQ_GEN_DMAMUX2_USB1_INT ((uint32_t)0x0000001EU-1U) /* DMAMUX2 Request generator Signal is USB1 interrupt */ +#define DMAMUX2_REQ_GEN_DMAMUX2_USB2_INT ((uint32_t)0x0000001FU-1U) /* DMAMUX2 Request generator Signal is USB2 interrupt */ +#define DMAMUX2_REQ_GEN_SDMMC1_INT ((uint32_t)0x00000020U-1U) /* DMAMUX2 Request generator Signal is USB2 interrupt */ +#define DMAMUX2_REQ_GEN_SDMMC2_INT ((uint32_t)0x00000021U-1U) /* DMAMUX2 Request generator Signal is USB2 interrupt */ +#define DMAMUX2_REQ_GEN_DVP1_INT ((uint32_t)0x00000022U-1U) /* DMAMUX2 Request generator Signal is USB2 interrupt */ +#define DMAMUX2_REQ_GEN_DVP2_INT ((uint32_t)0x00000023U-1U) /* DMAMUX2 Request generator Signal is USB2 interrupt */ +#define DMAMUX2_REQ_GEN_EHT1_INT ((uint32_t)0x00000024U-1U) /* DMAMUX2 Request generator Signal is USB2 interrupt */ +#define DMAMUX2_REQ_GEN_EHT2_INT ((uint32_t)0x00000025U-1U) /* DMAMUX2 Request generator Signal is USB2 interrupt */ +#define DMAMUX2_REQ_GEN_SDPU_INT ((uint32_t)0x00000026U-1U) /* DMAMUX2 Request generator Signal is USB2 interrupt */ + + +/* DMAMUX_CHANNEL DMAMUX Channel */ +#define DMAMUX_CHANNEL_0 ((uint32_t)0x00000000U) /* DMAMUX1 Channel 0 connected to DMA1 Channel 0 , DMAMUX_MDMA Channel 0 connected to MDMA Channel 0 */ +#define DMAMUX_CHANNEL_1 ((uint32_t)0x00000001U) /* DMAMUX1 Channel 1 connected to DMA1 Channel 1 , DMAMUX_MDMA Channel 1 connected to MDMA Channel 1 */ +#define DMAMUX_CHANNEL_2 ((uint32_t)0x00000002U) /* DMAMUX1 Channel 2 connected to DMA1 Channel 2 , DMAMUX_MDMA Channel 2 connected to MDMA Channel 2 */ +#define DMAMUX_CHANNEL_3 ((uint32_t)0x00000003U) /* DMAMUX1 Channel 3 connected to DMA1 Channel 3 , DMAMUX_MDMA Channel 3 connected to MDMA Channel 3 */ +#define DMAMUX_CHANNEL_4 ((uint32_t)0x00000004U) /* DMAMUX1 Channel 4 connected to DMA1 Channel 4 , DMAMUX_MDMA Channel 4 connected to MDMA Channel 4 */ +#define DMAMUX_CHANNEL_5 ((uint32_t)0x00000005U) /* DMAMUX1 Channel 5 connected to DMA1 Channel 5 , DMAMUX_MDMA Channel 5 connected to MDMA Channel 5 */ +#define DMAMUX_CHANNEL_6 ((uint32_t)0x00000006U) /* DMAMUX1 Channel 6 connected to DMA1 Channel 6 , DMAMUX_MDMA Channel 6 connected to MDMA Channel 6 */ +#define DMAMUX_CHANNEL_7 ((uint32_t)0x00000007U) /* DMAMUX1 Channel 7 connected to DMA1 Channel 7 , DMAMUX_MDMA Channel 7 connected to MDMA Channel 7 */ +#define DMAMUX_CHANNEL_8 ((uint32_t)0x00000008U) /* DMAMUX1 Channel 8 connected to DMA2 Channel 0 , DMAMUX_MDMA Channel 8 connected to MDMA Channel 8 */ +#define DMAMUX_CHANNEL_9 ((uint32_t)0x00000009U) /* DMAMUX1 Channel 9 connected to DMA2 Channel 1 , DMAMUX_MDMA Channel 9 connected to MDMA Channel 9 */ +#define DMAMUX_CHANNEL_10 ((uint32_t)0x0000000AU) /* DMAMUX1 Channel 10 connected to DMA2 Channel 2 , DMAMUX_MDMA Channel 10 connected to MDMA Channel 10 */ +#define DMAMUX_CHANNEL_11 ((uint32_t)0x0000000BU) /* DMAMUX1 Channel 11 connected to DMA2 Channel 3 , DMAMUX_MDMA Channel 11 connected to MDMA Channel 11 */ +#define DMAMUX_CHANNEL_12 ((uint32_t)0x0000000CU) /* DMAMUX1 Channel 12 connected to DMA2 Channel 4 , DMAMUX_MDMA Channel 12 connected to MDMA Channel 12 */ +#define DMAMUX_CHANNEL_13 ((uint32_t)0x0000000DU) /* DMAMUX1 Channel 13 connected to DMA2 Channel 5 , DMAMUX_MDMA Channel 13 connected to MDMA Channel 13 */ +#define DMAMUX_CHANNEL_14 ((uint32_t)0x0000000EU) /* DMAMUX1 Channel 14 connected to DMA2 Channel 6 , DMAMUX_MDMA Channel 14 connected to MDMA Channel 14 */ +#define DMAMUX_CHANNEL_15 ((uint32_t)0x0000000FU) /* DMAMUX1 Channel 15 connected to DMA2 Channel 7 , DMAMUX_MDMA Channel 15 connected to MDMA Channel 15 */ +#define DMAMUX_CHANNEL_16 ((uint32_t)0x00000010U) /* DMAMUX1 Channel 16 connected to DMA3 Channel 0 , invailed for MDMA*/ +#define DMAMUX_CHANNEL_17 ((uint32_t)0x00000011U) /* DMAMUX1 Channel 17 connected to DMA3 Channel 1 , invailed for MDMA */ +#define DMAMUX_CHANNEL_18 ((uint32_t)0x00000012U) /* DMAMUX1 Channel 18 connected to DMA3 Channel 2 , invailed for MDMA */ +#define DMAMUX_CHANNEL_19 ((uint32_t)0x00000013U) /* DMAMUX1 Channel 19 connected to DMA3 Channel 3 , invailed for MDMA */ +#define DMAMUX_CHANNEL_20 ((uint32_t)0x00000014U) /* DMAMUX1 Channel 20 connected to DMA3 Channel 4 , invailed for MDMA */ +#define DMAMUX_CHANNEL_21 ((uint32_t)0x00000015U) /* DMAMUX1 Channel 21 connected to DMA3 Channel 5 , invailed for MDMA */ +#define DMAMUX_CHANNEL_22 ((uint32_t)0x00000016U) /* DMAMUX1 Channel 22 connected to DMA3 Channel 6 , invailed for MDMA */ +#define DMAMUX_CHANNEL_23 ((uint32_t)0x00000017U) /* DMAMUX1 Channel 23 connected to DMA3 Channel 7 , invailed for MDMA */ + + +void DMAMUX_DeInit(DMAMUX_ID DMAMUXx); + +void DMAMUX_SetRequestID(DMAMUX_ID DMAMUXx, uint32_t Channel, uint32_t Request); +uint32_t DMAMUX_GetRequestID(DMAMUX_ID DMAMUXx, uint32_t Channel); +void DMAMUX_SetSyncID(DMAMUX_ID DMAMUXx, uint32_t Channel, uint32_t SyncID); +uint32_t DMAMUX_GetSyncID(DMAMUX_ID DMAMUXx, uint32_t Channel); +void DMAMUX_SetSyncRequestNumber(DMAMUX_ID DMAMUXx, uint32_t Channel, uint32_t RequestNumber); +uint32_t DMAMUX_GetSyncRequestNumber(DMAMUX_ID DMAMUXx, uint32_t Channel); +void DMAMUX_SetSyncPolarity(DMAMUX_ID DMAMUXx, uint32_t Channel, uint32_t Polarity); +uint32_t DMAMUX_GetSyncPolarity(DMAMUX_ID DMAMUXx, uint32_t Channel); +void DMAMUX_EnableEventGeneration(DMAMUX_ID DMAMUXx, uint32_t Channel, FunctionalState Cmd); +void DMAMUX_EnableSync(DMAMUX_ID DMAMUXx, uint32_t Channel, FunctionalState Cmd); +void DMAMUX_EnableRequestGen(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel, FunctionalState Cmd); +void DMAMUX_SetRequestGenPolarity(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel, uint32_t Polarity); +uint32_t DMAMUX_GetRequestGenPolarity(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel); +void DMAMUX_SetGenRequestNumber(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel, uint32_t RequestNumber); +uint32_t DMAMUX_GetGenRequestNumber(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel); +void DMAMUX_SetRequestSignalID(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel, uint32_t RequestSignalID); +uint32_t DMAMUX_GetRequestSignalID(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel); + +void DMAMUX_EnableSynEventOverrunInt(DMAMUX_ID DMAMUXx, uint32_t Channel, FunctionalState Cmd); +void DMAMUX_EnableTrigOverrunInt(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel, FunctionalState Cmd); + +FlagStatus DMAMUX_GetSynOverrunStatus(DMAMUX_ID DMAMUXx, uint32_t Channel); +FlagStatus DMAMUX_GetTrigOverrunStatus(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel); +void DMAMUX_ClearSynOverrunStatus(DMAMUX_ID DMAMUXx, uint32_t Channel); +void DMAMUX_ClearTrigOverrunStatus(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel); + + +#ifdef __cplusplus +} +#endif + + + +#endif /*N32H76x_H78x_DMAMUX_H */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dsi.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dsi.h new file mode 100644 index 0000000000..8f26c72a76 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dsi.h @@ -0,0 +1,623 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dsi.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_DSI_H__ +#define __N32H76X_78X_DSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Includes */ +#include "n32h76x_78x.h" + +#define DSI_TIME_OUT_VALUE ((uint32_t)0x00001000U) + +#define DSI_REGISTER_MASK ((uint32_t)0x00000000U) + +#define DSI_NO_ERRORS ((uint32_t)0x00000000U) + +#define DSI_MAX_RETURN_PKT_SIZE ((uint32_t)0x00000037U) /* Maximum return packet configuration */ + +/** DSI_Video_Mode_Type DSI Video Mode Type **/ +#define DSI_VID_MODE_NB_PULSES DSI_REGISTER_MASK +#define DSI_VID_MODE_NB_EVENTS VID_VIDEOMOD_VIDEOMOD_0 +#define DSI_VID_MODE_BURST VID_VIDEOMOD_VIDEOMOD_1 + +/** DSI_Video_Pixel_Format **/ +#define DSI_RGB_565_16BIT ((uint32_t)0x0EU) +#define DSI_RGB_666_18BIT ((uint32_t)0x1EU) +#define DSI_RGB_666_18BIT_LP ((uint32_t)0x2EU) +#define DSI_RGB_888_24BIT ((uint32_t)0x3EU) + +/** DSI ACTIVE LANES **/ +#define DSI_ACTIVE_DATALANE0 ((uint32_t)0U) +#define DSI_ACTIVE_DATALANE1 ((uint32_t)1U) +#define DSI_ACTIVE_DATALANE2 ((uint32_t)2U) +#define DSI_ACTIVE_DATALANE3 ((uint32_t)3U) + +/** DSI_Number_Of_Lanes **/ +#define DSI_ONE_DATA_LANE (1) +#define DSI_TWO_DATA_LANES (2) +#define DSI_THREE_DATA_LANES (3) +#define DSI_FOUR_DATA_LANES (4) + +#define DSI_DATALANE0 (DSI_REGISTER_MASK) +#define DSI_DATALANE1 (VID_VC_VC_0) +#define DSI_DATALANE2 (VID_VC_VC_1) +#define DSI_DATALANE3 (VID_VC_VC_0 | VID_VC_VC_1) + +#define DSI_ULPS_ONE_DATA_LANE (DSI_WRPCTRL_ULPSDLEN_0) +#define DSI_ULPS_TWO_DATA_LANE (DSI_WRPCTRL_ULPSDLEN_0 | DSI_WRPCTRL_ULPSDLEN_1) +#define DSI_ULPS_THREE_DATA_LANE (DSI_WRPCTRL_ULPSDLEN_0 | DSI_WRPCTRL_ULPSDLEN_1 | DSI_WRPCTRL_ULPSDLEN_2) +#define DSI_ULPS_FOUR_DATA_LANE (DSI_WRPCTRL_ULPSDLEN_0 | DSI_WRPCTRL_ULPSDLEN_1 | DSI_WRPCTRL_ULPSDLEN_2 | DSI_WRPCTRL_ULPSDLEN_3) + +/** DSI Multiple packets per video line **/ +#define DSI_1_PACKETS_PER_LINE (VID_PKTPERLINE_PKTPERLINE_0) +#define DSI_2_PACKETS_PER_LINE (VID_PKTPERLINE_PKTPERLINE_1) +#define DSI_4_PACKETS_PER_LINE (VID_PKTPERLINE_PKTPERLINE_2) + +/** DSI_HOST: CONTROLLER OFF/ON **/ +#define DSI_TURN_OFF (DSI_REGISTER_MASK) +#define DSI_TURN_ON (DSI_NUMLANES_NUMLANES) + +/** DSI_HOST NON-CONTINUOUS HS CLOCK/CONTINUOUS HS CLOCK **/ +#define DSI_NON_CONTINUOUS_HS_CLOCK (DSI_REGISTER_MASK) +#define DSI_CONTINUOUS_HS_CLOCK (DSI_CONTHSCLK_CONTHSCLK) + +/** DSI_HOST ENABLE INSERT AN EOTP **/ +#define DSI_INSERT_EOTP_DISABLE (DSI_REGISTER_MASK) +#define DSI_INSERT_EOTP_ENABLE (DSI_AUTOINSERT_EOTP_AUTOINSEOTP) + +/** DSI_HOST ENABLE CHECK CRC **/ +#define DSI_CHECK_CRC_ENABLE (DSI_REGISTER_MASK) +#define DSI_CHECK_CRC_DISABLE (DSI_DISRXCRCCHK_DISRXCRCCHK) + +/** DSI_HOST DISABLE BURST **/ +#define DSI_BURST_ENABLE (DSI_REGISTER_MASK) +#define DSI_BURST_DISABLE (DSI_DISBST_DISBST) + +/** DSI_HOST ENABLE CLK SIGNALS **/ +#define DSI_CLKLANE_DISABLE (DSI_REGISTER_MASK) +#define DSI_CLKLANE_ENABLE (DSI_CLKLANEN_CLKLANEN) + +/** DSI_HOST ENABLE DATA LANE SIGNALS **/ +#define DSI_DATALANEALL_DISABLE (DSI_REGISTER_MASK) +#define DSI_ONE_DATALANE_ENABLE (DSI_DATLANEN_DATLANEN_0) +#define DSI_TWO_DATALANES_ENABLE (DSI_DATLANEN_DATLANEN_1 | DSI_DATLANEN_DATLANEN_0) +#define DSI_THREE_DATALANES_ENABLE (DSI_DATLANEN_DATLANEN_2 | DSI_DATLANEN_DATLANEN_1 | DSI_DATLANEN_DATLANEN_0) +#define DSI_FOUR_DATALANES_ENABLE (DSI_DATLANEN_DATLANEN_3 | DSI_DATLANEN_DATLANEN_2 | DSI_DATLANEN_DATLANEN_1 | DSI_DATLANEN_DATLANEN_0) + +/** DSI_HOST VID SKEW CAL ENABLE **/ +#define DSI_SKEWCALLINE_DISABLE (DSI_REGISTER_MASK) +#define DSI_SKEWCALLINE_ENABLE (DSI_SKEWCALINE_SKEWCALINE) + +/** DSI_HOST VID ENABLE **/ +#define DSI_VID_DISABLE (DSI_REGISTER_MASK) +#define DSI_VID_ENABLE (VID_EN_EN) + +/** DSI_HOST VID THE ALIGNMENT OF PIXELS **/ +#define DSI_LSB_ALIGNMENT (DSI_REGISTER_MASK) +#define DSI_MSB_ALIGNMENT (VID_PIXALIGN_PIXALIGN) + +/** DSI_HOST VID Polarity of VSYNC **/ +#define DSI_VSYNC_ACTIVE_LOW (DSI_REGISTER_MASK) +#define DSI_VSYNC_ACTIVE_HIGH (VID_VSYNCPOL_VSYNCPOL) + +/** DSI_HOST VID Polarity of HSYNC **/ +#define DSI_HSYNC_ACTIVE_LOW (DSI_REGISTER_MASK) +#define DSI_HSYNC_ACTIVE_HIGH (VID_HSYNCPOL_HSYNCPOL) + +/** DSI_HOST VID OVERRIDE MODE **/ +#define DSI_OVERRIDE_MODE_DISABLE (DSI_REGISTER_MASK) +#define DSI_OVERRIDE_MODE_ENABLE (VID_OVERIDE_OVERIDE) + +/** DSI_HOST VID BLLP MODE **/ +#define DSI_BLANKING_PACKETS_INBLLP (DSI_REGISTER_MASK) +#define DSI_LP_MODE_INBLLP (VID_BLLPMOD_BLLPMOD) + +/** DSI_HOST VID NULL PACKET IN BLLP MODE **/ +#define DSI_NULL_PACKET_INBLLP_DISABLE (DSI_REGISTER_MASK) +#define DSI_NULL_PACKET_INBLLP_ENABLE (VID_NULLPKTBLLP_NULLPKTBLLP) + +/** DSI_HOST VID EXTERNAL VIDEO INTERFACE PACKET REQUESTS ARE ALLOWED **/ +#define DSI_EXT_PACKETS_DISABLE (DSI_REGISTER_MASK) +#define DSI_EXT_PACKETS_VSYNC_ENABLE (VID_EXTPKTEN_EXTPKTEN_0) +#define DSI_EXT_PACKETS_VBP_ENABLE (VID_EXTPKTEN_EXTPKTEN_1) +#define DSI_EXT_PACKETS_AVL_ENABLE (VID_EXTPKTEN_EXTPKTEN_2) +#define DSI_EXT_PACKETS_VFP_ENABLE (VID_EXTPKTEN_EXTPKTEN_3) + +/** DSI Packets Data type **/ +#define DSI_SHORT_VSYNC_START (0x01U) +#define DSI_SHORT_VSYNC_END (0x11U) +#define DSI_SHORT_HSYNC_START (0x21U) +#define DSI_SHORT_HSYNC_END (0x31U) +#define DSI_SHORT_EOTP (0x08U) +#define DSI_SHORT_CMOFF (0x02U) +#define DSI_SHORT_CMON (0x12U) +#define DSI_SHORT_SHUTDOWN_PH (0x22U) +#define DSI_SHORT_TURNON_PH (0x3FU) +#define DSI_SHORT_GWRITE_NOPARA (0x03U) +#define DSI_SHORT_GWRITE_1PARA (0x13U) +#define DSI_SHORT_GWRITE_2PARA (0x23U) +#define DSI_SHORT_GREAD_NOPARA (0x04U) +#define DSI_SHORT_GREAD_1PARA (0x14U) +#define DSI_SHORT_GREAD_2PARA (0x24U) +#define DSI_SHORT_DCSWRITE_NOPARA (0x05U) +#define DSI_SHORT_DCSWRITE_1PARA (0x15U) +#define DSI_SHORT_DCSREAD_NOPARA (0x06U) +#define DSI_SHORT_MAX_PKTSIZE (0x37U) +#define DSI_LONG_NULL_PKT (0x09U) +#define DSI_LONG_BLANK_PKT (0x19U) +#define DSI_LONG_GWRITE (0x29U) +#define DSI_LONG_DCSWRITE (0x39U) +#define DSI_LONG_YUV422_20BIT (0x0CU) +#define DSI_LONG_YUV422_24BIT (0x1CU) +#define DSI_LONG_YUV422_16BIT (0x2CU) +#define DSI_LONG_RGB101010_30BIT (0x0DU) +#define DSI_LONG_RGB121212_36BIT (0x1DU) +#define DSI_LONG_YUV420_12BIT (0x3DU) +#define DSI_LONG_RGB565 (0x0EU) +#define DSI_LONG_RGB666 (0x1EU) +#define DSI_LONG_RGB666_LP (0x2EU) +#define DSI_LONG_RGB888 (0x3EU) + +/** DSI_DCS_Command DSI DCS Command **/ +#define DSI_ENTER_IDLE_MODE (0x39U) +#define DSI_ENTER_INVERT_MODE (0x21U) +#define DSI_ENTER_NORMAL_MODE (0x13U) +#define DSI_ENTER_PARTIAL_MODE (0x12U) +#define DSI_ENTER_SLEEP_MODE (0x10U) +#define DSI_EXIT_IDLE_MODE (0x38U) +#define DSI_EXIT_INVERT_MODE (0x20U) +#define DSI_EXIT_SLEEP_MODE (0x11U) +#define DSI_GET_3D_CONTROL (0x3FU) +#define DSI_GET_ADDRESS_MODE (0x0BU) +#define DSI_GET_BLUE_CHANNEL (0x08U) +#define DSI_GET_DIAGNOSTIC_RESULT (0x0FU) +#define DSI_GET_DISPLAY_MODE (0x0DU) +#define DSI_GET_GREEN_CHANNEL (0x07U) +#define DSI_GET_PIXEL_FORMAT (0x0CU) +#define DSI_GET_POWER_MODE (0x0AU) +#define DSI_GET_RED_CHANNEL (0x06U) +#define DSI_GET_SCANLINE (0x45U) +#define DSI_GET_SIGNAL_MODE (0x0EU) +#define DSI_NOP (0x00U) +#define DSI_READ_DDB_CONTINUE (0xA8U) +#define DSI_READ_DDB_START (0xA1U) +#define DSI_READ_MEMORY_CONTINUE (0x3EU) +#define DSI_READ_MEMORY_START (0x2EU) +#define DSI_SET_3D_CONTROL (0x3DU) +#define DSI_SET_ADDRESS_MODE (0x36U) +#define DSI_SET_COLUMN_ADDRESS (0x2AU) +#define DSI_SET_DISPLAY_OFF (0x28U) +#define DSI_SET_DISPLAY_ON (0x29U) +#define DSI_SET_GAMMA_CURVE (0x26U) +#define DSI_SET_PAGE_ADDRESS (0x2BU) +#define DSI_SET_PARTIAL_COLUMNS (0x31U) +#define DSI_SET_PARTIAL_ROWS (0x30U) +#define DSI_SET_PIXEL_FORMAT (0x3AU) +#define DSI_SET_SCROLL_AREA (0x33U) +#define DSI_SET_SCROLL_START (0x37U) +#define DSI_SET_TEAR_OFF (0x34U) +#define DSI_SET_TEAR_ON (0x35U) +#define DSI_SET_TEAR_SCANLINE (0x44U) +#define DSI_SET_VSYNC_TIMING (0x40U) +#define DSI_SOFT_RESET (0x01U) +#define DSI_WRITE_LUT (0x2DU) +#define DSI_WRITE_MEMORY_CONTINUE (0x3CU) +#define DSI_WRITE_MEMORY_START (0x2CU) + +/** DSI_Color_Coding DSI Color Coding **/ +#define DSI_RGB565 ((uint32_t)0x00000000U) /* The values 0x00000001 and 0x00000002 can also be used for the RGB565 color mode configuration */ +#define DSI_RGB666 ((uint32_t)0x00000003U) /* The value 0x00000004 can also be used for the RGB666 color mode configuration */ +#define DSI_RGB888 ((uint32_t)0x00000005U) + +/** DSI PHY Flags DSI Flags **/ +#define DSI_PHY_FLAG_PLL_UNLOCK (DSIPHY_PLLSTS_PLLUNLOCK) +#define DSI_PHY_FLAG_PLL_FM_CPLT (DSIPHY_PLLSTS_PLLFMCPLT) +#define DSI_PHY_FLAG_PLL_FM_UNDER (DSIPHY_PLLSTS_PLLFMUNDER) +#define DSI_PHY_FLAG_PLL_FM_OVER (DSIPHY_PLLSTS_PLLFMOVER) +#define DSI_PHY_FLAG_PLL_DIGCLK_MISS (DSIPHY_PLLSTS_PLLDIGCKMISS) +#define DSI_PHY_FLAG_PLL_FBCLK_MISS (DSIPHY_PLLSTS_PLLFBKCKMISS) +#define DSI_PHY_FLAG_PLL_REFCLK_MISS (DSIPHY_PLLSTS_PLLREFCKMISS) +#define DSI_PHY_FLAG_PHY_READY (DSIPHY_PLLSTS_PHYREADY) + +/** DSI_SHORT_WRITE_PKT_Data_Type DSI SHORT WRITE PKT Data Type **/ +#define DSI_DCS_SHORT_PKT_WRITE_P0 ((uint32_t)0x00000005U) /* DCS short write, no parameters */ +#define DSI_DCS_SHORT_PKT_WRITE_P1 ((uint32_t)0x00000015U) /* DCS short write, one parameter */ +#define DSI_GEN_SHORT_PKT_WRITE_P0 ((uint32_t)0x00000003U) /* Generic short write, no parameters */ +#define DSI_GEN_SHORT_PKT_WRITE_P1 ((uint32_t)0x00000013U) /* Generic short write, one parameter */ +#define DSI_GEN_SHORT_PKT_WRITE_P2 ((uint32_t)0x00000023U) /* Generic short write, two parameters */ + +/** DSI_LONG_WRITE_PKT_Data_Type DSI LONG WRITE PKT Data Type **/ +#define DSI_DCS_LONG_PKT_WRITE ((uint32_t)0x00000039U) /* DCS long write */ +#define DSI_GEN_LONG_PKT_WRITE ((uint32_t)0x00000029U) /* Generic long write */ + +/** DSI_SHORT_READ_PKT_Data_Type DSI SHORT READ PKT Data Type **/ +#define DSI_DCS_SHORT_PKT_READ ((uint32_t)0x00000006U) /* DCS short read */ +#define DSI_GEN_SHORT_PKT_READ_P0 ((uint32_t)0x00000004U) /* Generic short read, no parameters */ +#define DSI_GEN_SHORT_PKT_READ_P1 ((uint32_t)0x00000014U) /* Generic short read, one parameter */ +#define DSI_GEN_SHORT_PKT_READ_P2 ((uint32_t)0x00000024U) /* Generic short read, two parameters */ + +#define DSI_EOTP ((uint32_t)0x00000008U) + +/** DSI_Lane_Group DSI Lane Group **/ +#define DSI_CLOCK_LANE ((uint32_t)0x00000000U) +#define DSI_DATA_LANES ((uint32_t)0x00000001U) + +/** DSI_Communication_Delay DSI Communication Delay **/ +#define DSI_SLEW_RATE_HSTX ((uint32_t)0x00000000U) +#define DSI_SLEW_RATE_LPTX ((uint32_t)0x00000001U) +#define DSI_HS_DELAY ((uint32_t)0x00000002U) + +/** DSI_CustomLane DSI CustomLane **/ +#define DSI_SWAP_LANE_PINS ((uint32_t)0x00000000U) +#define DSI_INVERT_HS_SIGNAL ((uint32_t)0x00000001U) + +/** DSI_Lane_Select DSI Lane Select **/ +#define DSI_CLK_LANE ((uint32_t)0x00000000U) +#define DSI_DATA_LANE0 ((uint32_t)0x00000001U) +#define DSI_DATA_LANE1 ((uint32_t)0x00000002U) + +#define DSI_MODE_LPDT (DSI_REGISTER_MASK) +#define DSI_MODE_HSDT (DSI_PKTCTRL_MOD) + +/** DSI Host periph status flag **/ +#define DSI_FLAG_SOT_ERROR (DSI_STS_SOTERR) +#define DSI_FLAG_SOTSYNC_ERROR (DSI_STS_SOTSYNCERR) +#define DSI_FLAG_EOTSYNC_ERROR (DSI_STS_EOTSYNCERR) +#define DSI_FLAG_ESCMOD_ERROR (DSI_STS_ESCMODERR) +#define DSI_FLAG_LPTXSYNC_ERROR (DSI_STS_LPTXSYNCERR) +#define DSI_FLAG_TO_ERROR (DSI_STS_TOERR) +#define DSI_FLAG_FCTRL_ERROR (DSI_STS_FCTRLERR) +#define DSI_FLAG_COTDET_ERROR (DSI_STS_COTDET) +#define DSI_FLAG_ECCSB_ERROR (DSI_STS_ECCSERR) +#define DSI_FLAG_ECCML_ERROR (DSI_STS_ECCMERR) +#define DSI_FLAG_CRC_ERROR (DSI_STS_CRCERR) +#define DSI_FLAG_DATATYPE_ERROR (DSI_STS_DATYPERR) +#define DSI_FLAG_VCIDINVLID_ERROR (DSI_STS_VCIDINVLD) +#define DSI_FLAG_INVLID_TXLEN_ERROR (DSI_STS_INVLDTXL) +#define DSI_FLAG_PROVILT_ERROR (DSI_STS_PROVILT) +#define DSI_FLAG_BIT0_ERROR (DSI_STS_BIT0) +#define DSI_FLAG_BIT1_ERROR (DSI_STS_BIT1) +#define DSI_FLAG_BIT2_ERROR (DSI_STS_BIT2) +#define DSI_FLAG_BIT3_ERROR (DSI_STS_BIT3) + +/** DSI Host RX error status flag **/ +#define DSI_ERROR_FLAG_ECCSB (DSI_ERRSTS_ECCSERR) +#define DSI_ERROR_FLAG_ECCML (DSI_ERRSTS_ECCMERR) +#define DSI_ERROR_FLAG_CRC (DSI_ERRSTS_CRCERR) +#define DSI_ERROR_FLAG_HTXTO (DSI_ERRSTS_HTXTOERR) +#define DSI_ERROR_FLAG_LRXTO (DSI_ERRSTS_LRXTOERR) +#define DSI_ERROR_FLAG_BATTO (DSI_ERRSTS_BATTOERR) + +/** DSI Host packet status flag **/ +#define DSI_PKT_FLAG_NIDLE (DSI_PKTSTS_NIDLE) +#define DSI_PKT_FLAG_TXD (DSI_PKTSTS_TXD) +#define DSI_PKT_FLAG_DPHYDIR (DSI_PKTSTS_DPHYDIR) +#define DSI_PKT_FLAG_TXFOVER (DSI_PKTSTS_TXFOVER) +#define DSI_PKT_FLAG_TXFUNDER (DSI_PKTSTS_TXFUNDER) +#define DSI_PKT_FLAG_RXFOVER (DSI_PKTSTS_RXFOVER) +#define DSI_PKT_FLAG_RXFUNDER (DSI_PKTSTS_RXFUNDER) +#define DSI_PKT_FLAG_RXPKTD (DSI_PKTSTS_RXPKTD) +#define DSI_PKT_FLAG_ALLRXPKTD (DSI_PKTSTS_ALLRXPKTD) + +/** DSI Wrapper interrupt sources **/ +#define DSI_WRAPPER_INT_BLKERRIEN (DSI_WRPCTRL_BLKEERIEN) +#define DSI_WRAPPER_INT_SPERRIEN (DSI_WRPCTRL_SPERRIEN) +#define DSI_WRAPPER_INT_OVERRIEN (DSI_WRPCTRL_OVERRIEN) +#define DSI_WRAPPER_INT_UNDERRIEN (DSI_WRPCTRL_UNDERRIEN) + +/** DSI Wrapper Flag **/ +#define DSI_WRAPPER_FLAG_ISKEWCALDN (DSI_WRPSTS_ISKEWCALDN) +#define DSI_WRAPPER_FLAG_PSKEWCALDN (DSI_WRPSTS_PSKEWCALDN) +#define DSI_WRAPPER_FLAG_TRIGACK (DSI_WRPSTS_TRIGACK) +#define DSI_WRAPPER_FLAG_BLKERRIEN (DSI_WRPSTS_BLKERRF) +#define DSI_WRAPPER_FLAG_SPERRIEN (DSI_WRPSTS_SPERRIEN) +#define DSI_WRAPPER_FLAG_OVERRIEN (DSI_WRPSTS_OVERRIEN) +#define DSI_WRAPPER_FLAG_UNDERRIEN (DSI_WRPSTS_UNDERRIEN) + + +/** DSI Lock structures definition **/ +typedef enum +{ + DSI_UNLOCKED = 0x00, + DSI_LOCKED = 0x01 +} DSI_LockTypeDef; + +/** DSI Status structures definition **/ +typedef enum +{ + DSI_OK = 0x00, + DSI_RESET = 0x01, + DSI_READY = 0x02, + DSI_ERROR = 0x03, + DSI_BUSY = 0x04, + DSI_TIMEOUT = 0x05 +} DSI_StateTypeDef; + +/** DSI Host Init Structure definition **/ +typedef struct +{ + uint32_t NumOfLanes; /* Number of lanes */ + uint32_t BurstSel; /* Select combined burst or not */ + uint32_t AutoInsertEOTP; /* Select auto insert EOTP or not */ + uint32_t DisRXCRC; /* Select check CRC or not */ +} DSI_HostInitTypeDef; + +/** DSI Clock structure definition **/ +typedef struct +{ + uint32_t ClockBeforeHS; /* Set the number of byte clock periods before HS */ + uint32_t ClockHS2LP; /* Set the number of byte clock periods before clock lane into LP after detected in stop state */ + uint32_t ClockLP2HS; /* Set the number of byte clock periods LP mode to HS mode */ + uint32_t ClockExitULPS; /* Set the number of byte clock periods in MARK_1 state after exiting ULPS */ + uint32_t ContinuousHSCLK; /* Select the continuous HS clock or non-continuous HS clock */ +} DSI_ClockInitTypeDef; + +/** DSI Skew Calibration Clock structure definition **/ +typedef struct +{ + uint32_t ClockInitialSkewcal; /* Set the number of byte clock consumed by an initial skewcal */ + uint32_t ClockPeriodicSkewcal; /* Set the number of byte clock consumed by a periodic skewcal */ + uint32_t ClockAlternateCal; /* Set the number of byte clock consumed by an alternate calibration */ + uint32_t LinePeriodicSkewcal; /* Set the lane to issue periodic */ +} DSI_SkewcalInitTypeDef; + + +/** DSI PHY Clock structure definition **/ +typedef struct +{ + uint32_t RefCLK_In_Sel; + uint32_t PLL_PRE_DIV; + uint32_t PLL_FBK_INT; + uint32_t EXTD_CYCLE_SEL; + uint32_t PLL_FBK_FRA23_16; + uint32_t PLL_FBK_FRA15_8; + uint32_t PLL_FBK_FRA7_0; + uint32_t PLL_SSC_PRD9_8; + uint32_t PLL_SSC_PRD7_0; + uint32_t PLL_SSC_DELTA_INIT17_16; + uint32_t PLL_SSC_DELTA_INIT15_8; + uint32_t PLL_SSC_DELTA_INIT7_0; + uint32_t PLL_SSC_DELTA17_16; + uint32_t PLL_SSC_DELTA15_8; + uint32_t PLL_SSC_DELTA7_0; + uint32_t DLANE_HS_PER_TIME; + uint32_t DLANE_HS_ZERO_TIME; + uint32_t DLANE_HS_TRAIL_TIME; + uint32_t CLANE_HS_PER_TIME; + uint32_t CLANE_HS_ZERO_TIME; + uint32_t CLANE_HS_TRAIL_TIME; + uint32_t CLANE_HS_CLK_PRE_TIME; + uint32_t CLANE_HS_CLK_POST_TIME; + uint32_t L0_Swap_Sel_Value; // data/clock lane value config to PAD_CDTX_L0X + uint32_t L1_Swap_Sel_Value; // data/clock lane value config to PAD_CDTX_L1X + uint32_t L2_Swap_Sel_Value; // data/clock lane value config to PAD_CDTX_L2X + uint32_t L3_Swap_Sel_Value; // data/clock lane value config to PAD_CDTX_L3X + uint32_t L4_Swap_Sel_Value; // data/clock lane value config to PAD_CDTX_L4X +} DSI_PHY_InitTypeDef; + + +/** DSI Video mode configuration **/ +typedef struct +{ + uint32_t PixelsPerPacket; /* Number of pixels to be sent on a video line */ + uint32_t PixelPayloadSize; /* Maximum number of pixels that should be sent as one DSI packet */ + uint32_t PixelAlignment; /* Set the alignment of pixels smaller than the maximum pixel size */ + uint32_t PixelFormat; /* Set the pixel format */ + uint32_t VSPolarity; /* VSYNC pin polarity */ + uint32_t HSPolarity; /* HSYNC pin polarity */ + uint32_t Mode; /* Video mode type */ + uint32_t Override; /* Select CFG_VID parameters or first video frame is used to calibrate */ + uint32_t DelayFromStart; /* Set the number of cycles to delay the start of line */ + uint32_t HorizontalFrontPorch; /* Horizontal front-porch duration, Only Override = 1 need to program */ + uint32_t HorizontalBackPorch; /* Horizontal back-porch duration (in lane byte clock cycles), Only Override = 1 need to program */ + uint32_t HorizontalSyncActive; /* Horizontal synchronism active duration (in lane byte clock cycles), Only Override = 1 need to program */ + uint32_t PacketsPerLine; /* Multiple packets per video line */ + uint32_t VerticalBackPorch; /* Vertical back-porch duration, Only Override = 1 need to program */ + uint32_t VerticalFrontPorch; /* Vertical front-porch duration, Only Override = 1 need to program */ + uint32_t BLLPMode; /* Select blanking packets or LP mode in BLLP */ + uint32_t NULLPacketInBLLP; /* Select blanking packet or NULL packet in BLLP */ + uint32_t VerticalActive; /* Vertical active duration, Only Override = 1 need to program */ + uint32_t VirtualChannel; /* Virtual channel ID */ + uint32_t ExternalPacket; /* Select external to the video interface packet requests are allowed */ + uint32_t VerticalSyncStartPayload; /* Set the payload value for vertical sync start */ + uint32_t PayloadPerPacket; /* Set the payload in a multipacket per video line */ +} DSI_VidCfgTypeDef; + +/** DSI HOST Timeouts definition **/ +typedef struct +{ + uint32_t HighSpeedTXTimeout; /* High-speed tx time-out */ + uint32_t LowPowerRxTimeout; /* Low-power rx time-out */ + uint32_t BTATimeout; /* Bus turn around BTA time-out */ +} DSI_TimeoutCfgTypeDef; + +/** DSI Adapted command mode configuration **/ +typedef struct +{ + uint32_t VirtualChannelID; /* Virtual channel ID */ + uint32_t ColorCoding; /* Color coding for LCDC interface */ + uint32_t CommandSize; /* Maximum allowed size for an LCDC write memory command, measured in pixels.*/ + uint32_t TearingEffectSource; /* Tearing effect source */ + uint32_t TearingEffectPolarity; /* Tearing effect pin polarity */ + uint32_t HSPolarity; /* HSYNC pin polarity */ + uint32_t VSPolarity; /* VSYNC pin polarity */ + uint32_t DEPolarity; /* Data Enable pin polarity */ + uint32_t VSyncPol; /* VSync edge on which the LCDC is halted */ + uint32_t AutomaticRefresh; /* Automatic refresh mode */ + uint32_t TEAcknowledgeRequest; /* Tearing Effect Acknowledge Request Enable */ +} DSI_CmdCfgTypeDef; + +/** DSI lowpower command transmission mode configuration **/ +typedef struct +{ + uint32_t LPGenShortWriteNoP; /* Generic Short Write Zero parameters Transmission */ + uint32_t LPGenShortWriteOneP; /* Generic Short Write One parameter Transmission */ + uint32_t LPGenShortWriteTwoP; /* Generic Short Write Two parameters Transmission */ + uint32_t LPGenShortReadNoP; /* Generic Short Read Zero parameters Transmission */ + uint32_t LPGenShortReadOneP; /* Generic Short Read One parameter Transmission */ + uint32_t LPGenShortReadTwoP; /* Generic Short Read Two parameters Transmission */ + uint32_t LPGenLongWrite; /* Generic Long Write Transmission */ + uint32_t LPDcsShortWriteNoP; /* DCS Short Write Zero parameters Transmission */ + uint32_t LPDcsShortWriteOneP; /* DCS Short Write One parameter Transmission */ + uint32_t LPDcsShortReadNoP; /* DCS Short Read Zero parameters Transmission */ + uint32_t LPDcsLongWrite; /* DCS Long Write Transmission */ + uint32_t LPMaxReadPacket; /* Maximum Read Packet Size Transmission */ + uint32_t AcknowledgeRequest; /* Acknowledge Request Enable */ +} DSI_LPCmdTypeDef; + +/** DSI PHY Timings definition **/ +typedef struct +{ + uint32_t ClockLaneHS2LPTime; /* The maximum time that the D-PHY clock lane takes to go from high-speed to low-power transmission */ + uint32_t ClockLaneLP2HSTime; /* The maximum time that the D-PHY clock lane takes to go from low-power to high-speed transmission */ + uint32_t DataLaneHS2LPTime; /* The maximum time that the D-PHY data lanes takes to go from high-speed to low-power transmission */ + uint32_t DataLaneLP2HSTime; /* The maximum time that the D-PHY data lanes takes to go from low-power to high-speed transmission */ + uint32_t DataLaneMaxReadTime; /* The maximum time required to perform a read command */ + uint32_t StopWaitTime; /* The minimum wait period to request a High-Speed transmission after the Stop state */ +} DSI_PHY_TimerTypeDef; + +/** DSI Packet header type define **/ +typedef struct +{ + uint32_t WordCount; /* DSI packet word count */ + uint32_t ChannelID; /* DSI packet virtual channel */ + uint32_t DataType; /* DSI Error monitoring mask */ +} DSI_PKTHeaderTypeDef; + +/** DSI Packet Control type define **/ +typedef struct +{ + DSI_PKTHeaderTypeDef Header; + uint32_t CmdType; + uint32_t IsBTAEnable; + uint32_t IsBTAOnly; +} DSI_PKTCtrlTypeDef; + + +/** DSI handle Structure definition **/ +typedef struct +{ + DSI_Module *Instance; /* DSI Register base address */ + DSI_Wrapper_Module *InstanceWrap; /* DSI Wrapper Register base address */ + DSI_HostInitTypeDef HostInit; /* DSI required parameters */ + DSI_ClockInitTypeDef ClockInit; /* DSI required parameters */ + DSI_SkewcalInitTypeDef SkewcalInit; /* DSI optional required parameters */ + DSI_LockTypeDef Lock; /* DSI peripheral status */ + __IO DSI_StateTypeDef State; /* DSI communication state */ + __IO uint32_t ErrorCode; /* DSI Error code */ + uint32_t ErrorMsk; /* DSI Error monitoring mask */ +} DSI_HandleTypeDef; + + + +DSI_StateTypeDef DSI_EnableResetTrigger(DSI_HandleTypeDef *hdsi); + +void DSI_EnableWrapper(DSI_HandleTypeDef *hdsi, FunctionalState Cmd); +void DSI_Disable(DSI_HandleTypeDef *hdsi); + +void DSI_EnableClockLane(DSI_HandleTypeDef *hdsi, FunctionalState Cmd); +void DSI_ConfigDataLaneNum(DSI_HandleTypeDef *hdsi, uint32_t datalinenum); + +void DSI_CofigWrapULPSDL(DSI_HandleTypeDef *hdsi, uint32_t datalinenum, FunctionalState Cmd); +void DSI_EnableWrapULPSCL(DSI_HandleTypeDef *hdsi, FunctionalState Cmd); +DSI_StateTypeDef DSI_EnterULPSData(DSI_HandleTypeDef *hdsi, FunctionalState Cmd); +DSI_StateTypeDef DSI_EnterULPSClock(DSI_HandleTypeDef *hdsi); +DSI_StateTypeDef DSI_ExitULPSClock(DSI_HandleTypeDef *hdsi); +DSI_StateTypeDef DSI_EnterULPS(DSI_HandleTypeDef *hdsi); +DSI_StateTypeDef DSI_ExitULPS(DSI_HandleTypeDef *hdsi); + +void DSI_DisableSkewCal(DSI_HandleTypeDef *hdsi); +void DSI_EnableWrapperISkewCal(DSI_HandleTypeDef *hdsi, FunctionalState Cmd); +void DSI_EnableWrapperPSkewCal(DSI_HandleTypeDef *hdsi, FunctionalState Cmd); +DSI_StateTypeDef DSI_EnableInitialSkewCalib(DSI_HandleTypeDef *hdsi); +DSI_StateTypeDef DSI_EnablePeriodSkewCali(DSI_HandleTypeDef *hdsi); + +void DSI_SetVCID(DSI_HandleTypeDef *hdsi, uint32_t channel); +DSI_StateTypeDef DSI_ConfigTimeout(DSI_HandleTypeDef *hdsi, uint32_t hstxcnt, uint32_t lprxcnt, uint32_t btacnt); +DSI_StateTypeDef DSI_Start(DSI_HandleTypeDef *hdsi); + + +DSI_StateTypeDef DSI_APBPKT_ShortWrite(DSI_HandleTypeDef *hdsi, uint32_t ChannelID, uint32_t Mode, uint32_t Speed, uint32_t Param1, uint32_t Param2); +DSI_StateTypeDef DSI_APBPKT_LongWrite(DSI_HandleTypeDef *hdsi, uint32_t ChannelID, uint32_t Mode, uint32_t Speed, uint8_t *ParametersTable, uint32_t NbParams); +DSI_StateTypeDef DSI_LongWrite(DSI_HandleTypeDef *hdsi, DSI_PKTCtrlTypeDef PacketCtrl, uint8_t *ParametersTable); +DSI_StateTypeDef DSI_APBPKT_Read(DSI_HandleTypeDef *hdsi, uint32_t ChannelNbr, uint8_t *Array, uint32_t Size, uint32_t Mode, uint32_t DCSCmd, uint8_t *ParametersTable); +DSI_StateTypeDef DSI_APBPKT_Read_BTA(DSI_HandleTypeDef *hdsi, uint32_t ChannelNbr, uint8_t *Array, uint32_t Size, uint32_t Mode); +DSI_StateTypeDef DSI_Read(DSI_HandleTypeDef *hdsi, uint8_t *RxArray, uint32_t RxSize); + +void DSI_Wrapper_ConfigInt(DSI_HandleTypeDef *hdsi, uint32_t DSI_IT, FunctionalState Cmd); +FlagStatus DSI_Wrapper_GetFlagStatus(DSI_HandleTypeDef *hdsi, uint32_t DSI_FLAG); +void DSI_Wrapper_ClearFlag(DSI_HandleTypeDef *hdsi, uint32_t DSI_FLAG); +INTStatus DSI_Wrapper_GetIntStatus(DSI_HandleTypeDef *hdsi, uint32_t DSI_IT); + +FlagStatus DSI_GetPHYStatus(DSI_HandleTypeDef *hdsi); +FlagStatus DSI_GetSTS(DSI_HandleTypeDef *hdsi, uint32_t DSI_FLAG); +FlagStatus DSI_GetERRSTS(DSI_HandleTypeDef *hdsi, uint32_t DSI_FLAG); +FlagStatus DSI_GetPKTSTS(DSI_HandleTypeDef *hdsi, uint32_t DSI_FLAG); + +DSI_StateTypeDef DSI_DeInit(DSI_HandleTypeDef *hdsi); +void DSI_InitHostWrap(DSI_HandleTypeDef *hdsi); +void DSI_InitPHY(DSI_HandleTypeDef *hdsi, DSI_PHY_InitTypeDef *PHY_InitParams); +DSI_StateTypeDef DSI_Init(DSI_HandleTypeDef *hdsi); +DSI_StateTypeDef DSI_ConfigVideoMode(DSI_HandleTypeDef *hdsi, DSI_VidCfgTypeDef *VidCfg); + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_78X_DSI_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dsmu.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dsmu.h new file mode 100644 index 0000000000..0b35e3d49c --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dsmu.h @@ -0,0 +1,446 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dsmu.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76x_78x_DSMU_H__ +#define __N32H76x_78x_DSMU_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "n32h76x_78x.h" + +/** DSMU channel output clock structure definition **/ +typedef struct +{ + FunctionalState Activation; /* Output clock enable/disable */ + uint32_t Selection; /* Output clock is system clock or audio clock. + This parameter can be a value of @ref DSMU_Channel_OuputClock */ + uint32_t Divider; /* Output clock divider. + This parameter must be a number between Min_Data = 2 and Max_Data = 256 */ +}DSMU_Channel_OutputClockType; + +/** DSMU channel input structure definition **/ +typedef struct +{ + uint32_t Multiplexer; /* Input is external serial inputs, internal register or ADC output. + This parameter can be a value of @ref DSMU_Channel_InputMultiplexer */ + uint32_t DataPacking; /* Standard, interleaved or dual mode for internal register. + This parameter can be a value of @ref DSMU_Channel_DataPacking */ + uint32_t Pins; /* Input pins are taken from same or following channel. + This parameter can be a value of @ref DSMU_Channel_InputPins */ +}DSMU_Channel_InputType; + +/** DSMU channel serial interface structure definition **/ +typedef struct +{ + uint32_t Type; /* SPI or Manchester modes. + This parameter can be a value of @ref DSMU_Channel_SerialInterfaceType */ + uint32_t SpiClock; /* SPI clock select (external or internal with different sampling point). + This parameter can be a value of @ref DSMU_Channel_SpiClock */ +} DSMU_Channel_SerialInterfaceType; + +/** DSMU channel analog watchdog structure definition **/ +typedef struct +{ + uint32_t FilterOrder; /* Analog watchdog Sinc filter order. + This parameter can be a value of @ref DSMU_Channel_AwdFilterOrder */ + uint32_t Oversampling; /* Analog watchdog filter oversampling ratio. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 */ +} DSMU_Channel_AwdType; + +/** DSMU channel init structure definition **/ +typedef struct +{ + DSMU_Channel_OutputClockType OutputClock; /* DSMU channel output clock parameters */ + DSMU_Channel_InputType Input; /* DSMU channel input parameters */ + DSMU_Channel_SerialInterfaceType SerialInterface; /* DSMU channel serial interface parameters */ + DSMU_Channel_AwdType Awd; /* DSMU channel analog watchdog parameters */ + int32_t Offset; /* DSMU channel offset. + This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607 */ + uint32_t RightBitShift; /* DSMU channel right bit shift. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */ +} DSMU_Channel_InitType; + +/** DSMU filter regular conversion parameters structure definition **/ +typedef struct +{ + uint32_t Trigger; /* Trigger used to start regular conversion: software or synchronous. + This parameter can be a value of @ref DSMU_Filter_Trigger */ + FunctionalState FastMode; /* Enable/disable fast mode for regular conversion */ + FunctionalState DmaMode; /* Enable/disable DMA for regular conversion */ +} DSMU_Filter_RegularParamType; + +/** DSMU filter injected conversion parameters structure definition **/ +typedef struct +{ + uint32_t Trigger; /* Trigger used to start injected conversion: software, external or synchronous. + This parameter can be a value of @ref DSMU_Filter_Trigger */ + FunctionalState ScanMode; /* Enable/disable scanning mode for injected conversion */ + FunctionalState DmaMode; /* Enable/disable DMA for injected conversion */ + uint32_t ExtTrigger; /* External trigger. + This parameter can be a value of @ref DSMU_Filter_ExtTrigger */ +} DSMU_Filter_InjectedParamType; + +/** DSMU filter parameters structure definition **/ +typedef struct +{ + uint32_t SincOrder; /* Sinc filter order. + This parameter can be a value of @ref DSMU_Filter_SincOrder */ + uint32_t Oversampling; /* Filter oversampling ratio. + This parameter must be a number between Min_Data = 1 and Max_Data = 1024 */ + uint32_t IntOversampling; /* Integrator oversampling ratio. + This parameter must be a number between Min_Data = 1 and Max_Data = 256 */ +} DSMU_Filter_FilterParamType; + +/** DSMU filter init structure definition **/ +typedef struct +{ + DSMU_Filter_RegularParamType RegularParam; /* DSMU regular conversion parameters */ + DSMU_Filter_InjectedParamType InjectedParam; /* DSMU injected conversion parameters */ + DSMU_Filter_FilterParamType FilterParam; /* DSMU filter parameters */ +} DSMU_Filter_InitType; + + +/** DSMU filter analog watchdog parameters structure definition **/ +typedef struct +{ + uint32_t DataSource; /* Values from digital filter or from channel watchdog filter. + This parameter can be a value of @ref DSMU_Filter_AwdDataSource */ + uint32_t ChannelSelect; /* Analog watchdog channel selection. + This parameter can be a values combination of @ref DSMU_Channel_Selection */ + int32_t HighThreshold; /* High threshold for the analog watchdog. + This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607 */ + int32_t LowThreshold; /* Low threshold for the analog watchdog. + This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607 */ + uint32_t HighBreakSignal; /* Break signal assigned to analog watchdog high threshold event. + This parameter can be a values combination of @ref DSMU_BreakSignals */ + uint32_t LowBreakSignal; /* Break signal assigned to analog watchdog low threshold event. + This parameter can be a values combination of @ref DSMU_BreakSignals */ +} DSMU_Filter_AwdParamType; + +/** DSMU_Channel_OuputClock DSMU channel output clock selection **/ +#define DSMU_CHANNEL_OUTPUT_CLOCK_SYSTEM ((uint32_t)0x00000000U) /* Source for output clock is system clock */ +#define DSMU_CHANNEL_OUTPUT_CLOCK_AUDIO (DSMU_CHYCFG1_CLKOUTSRC) /* Source for output clock is audio clock */ + +/** DSMU_Channel_InputMultiplexer DSMU channel input multiplexer **/ +#define DSMU_CHANNEL_EXTERNAL_INPUTS ((uint32_t)0x00000000U) /* Data are taken from external inputs */ +#define DSMU_CHANNEL_ADC_OUTPUT (DSMU_CHYCFG1_DATMUX_0) /* Data are taken from ADC output */ +#define DSMU_CHANNEL_INTERNAL_REGISTER (DSMU_CHYCFG1_DATMUX_1) /* Data are taken from internal register */ + +/** DSMU_Channel_DataPacking DSMU channel input data packing **/ +#define DSMU_CHANNEL_STANDARD_MODE ((uint32_t)0x00000000U) /* Standard data packing mode */ +#define DSMU_CHANNEL_INTERLEAVED_MODE (DSMU_CHYCFG1_DATPACK_0) /* Interleaved data packing mode */ +#define DSMU_CHANNEL_DUAL_MODE (DSMU_CHYCFG1_DATPACK_1) /* Dual data packing mode */ + +/** DSMU_Channel_InputPins DSMU channel input pins **/ +#define DSMU_CHANNEL_SAME_CHANNEL_PINS ((uint32_t)0x00000000U) /* Input from pins on same channel */ +#define DSMU_CHANNEL_FOLLOWING_CHANNEL_PINS (DSMU_CHYCFG1_CHINSEL) /* Input from pins on following channel */ + +/** DSMU_Channel_SerialInterfaceType DSMU channel serial interface type **/ +#define DSMU_CHANNEL_SPI_RISING ((uint32_t)0x00000000U) /* SPI with rising edge */ +#define DSMU_CHANNEL_SPI_FALLING (DSMU_CHYCFG1_SITP_0) /* SPI with falling edge */ +#define DSMU_CHANNEL_MANCHESTER_RISING (DSMU_CHYCFG1_SITP_1) /* Manchester with rising edge */ +#define DSMU_CHANNEL_MANCHESTER_FALLING (DSMU_CHYCFG1_SITP) /* Manchester with falling edge */ + +/** DSMU_Channel_SpiClock DSMU channel SPI clock selection **/ +#define DSMU_CHANNEL_SPI_CLOCK_EXTERNAL ((uint32_t)0x00000000U) /* External SPI clock */ +#define DSMU_CHANNEL_SPI_CLOCK_INTERNAL (DSMU_CHYCFG1_SPICLKSEL_0) /* Internal SPI clock */ +#define DSMU_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING (DSMU_CHYCFG1_SPICLKSEL_1) /* Internal SPI clock divided by 2, falling edge */ +#define DSMU_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING (DSMU_CHYCFG1_SPICLKSEL) /* Internal SPI clock divided by 2, rising edge */ + +/** DSMU_Channel_AwdFilterOrder DSMU channel analog watchdog filter order **/ +#define DSMU_AWD_FASTSINC_ORDER ((uint32_t)0x00000000U) /* FastSinc filter type */ +#define DSMU_AWD_SINC1_ORDER (DSMU_CHYAWDSCDET_AWDFORD_0) /* Sinc 1 filter type */ +#define DSMU_AWD_SINC2_ORDER (DSMU_CHYAWDSCDET_AWDFORD_1) /* Sinc 2 filter type */ +#define DSMU_AWD_SINC3_ORDER (DSMU_CHYAWDSCDET_AWDFORD) /* Sinc 3 filter type */ + +/** DSMU_Filter_Trigger DSMU filter conversion trigger **/ +#define DSMU_FILTER_SW_TRIGGER ((uint32_t)0x00000000U) /* Software trigger */ +#define DSMU_FILTER_SYNC_TRIGGER ((uint32_t)0x00000001U) /* Synchronous with DSMU_FLT0 */ +#define DSMU_FILTER_EXT_TRIGGER ((uint32_t)0x00000002U) /* External trigger (only for injected conversion) */ + +/** DSMU_Channel_Selection DSMU filter channel select **/ +/* bit[31:24] used for FLTxCTRL1.RCH[2:0]*/ +/* bit[23:16] used for FLTxCTRL2.AWDCH[7:0]*/ +/* bit[15:8] used for FLTxCTRL2.EXDETCH[7:0]*/ +/* bit[7:0] used for FLTxJCHG.JCHG[7:0]*/ +#define DSMU_CHANNEL_SELECT_0 ((uint32_t)0x00010101U) /* Select Channel 0 */ +#define DSMU_CHANNEL_SELECT_1 ((uint32_t)0x01020202U) /* Select Channel 1 */ +#define DSMU_CHANNEL_SELECT_2 ((uint32_t)0x02040404U) /* Select Channel 2 */ +#define DSMU_CHANNEL_SELECT_3 ((uint32_t)0x03080808U) /* Select Channel 3 */ +#define DSMU_CHANNEL_SELECT_4 ((uint32_t)0x04101010U) /* Select Channel 4 */ +#define DSMU_CHANNEL_SELECT_5 ((uint32_t)0x05202020U) /* Select Channel 5 */ +#define DSMU_CHANNEL_SELECT_6 ((uint32_t)0x06404040U) /* Select Channel 6 */ +#define DSMU_CHANNEL_SELECT_7 ((uint32_t)0x07808080U) /* Select Channel 7 */ + +/** DSMU_Filter_ExtTrigger DSMU filter external trigger **/ +#define DSMU_FILTER_EXT_TRIG_ATIM1_TRGO ((uint32_t)0x00000000U) /* Select ATIM1_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_ATIM2_TRGO ((uint32_t)0x00000100U) /* Select ATIM2_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_ATIM3_TRGO ((uint32_t)0x00000200U) /* Select ATIM3_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_ATIM4_TRGO ((uint32_t)0x00000300U) /* Select ATIM4_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_GTIMB1_TRGO ((uint32_t)0x00000400U) /* Select GTIMB1_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_GTIMB2_TRGO ((uint32_t)0x00000500U) /* Select GTIMB2_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_GTIMB3_TRGO ((uint32_t)0x00000600U) /* Select GTIMB3_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_GTIMA1_TRGO ((uint32_t)0x00000700U) /* Select GTIMA1_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_GTIMA2_TRGO ((uint32_t)0x00000800U) /* Select GTIMA2_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_GTIMA3_TRGO ((uint32_t)0x00000900U) /* Select GTIMA3_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_GTIMA4_TRGO ((uint32_t)0x00000A00U) /* Select GTIMA4_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_GTIMA5_TRGO ((uint32_t)0x00000B00U) /* Select GTIMA5_TRGO as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_ATIM1_TRGO2 ((uint32_t)0x00000C00U) /* Select ATIM1_TRGO2 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_ATIM3_TRGO2 ((uint32_t)0x00000D00U) /* Select ATIM3_TRGO2 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG1 ((uint32_t)0x00000E00U) /* Select SHRTIM1_ADC_TRG1 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG2 ((uint32_t)0x00000F00U) /* Select SHRTIM1_ADC_TRG2 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG3 ((uint32_t)0x00001000U) /* Select SHRTIM1_ADC_TRG3 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG4 ((uint32_t)0x00001100U) /* Select SHRTIM1_ADC_TRG4 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG1 ((uint32_t)0x00001200U) /* Select SHRTIM2_ADC_TRG1 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG2 ((uint32_t)0x00001300U) /* Select SHRTIM2_ADC_TRG2 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG3 ((uint32_t)0x00001400U) /* Select SHRTIM2_ADC_TRG3 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG4 ((uint32_t)0x00001500U) /* Select SHRTIM2_ADC_TRG4 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_EXTI6 ((uint32_t)0x00001600U) /* Select EXTI6 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_EXTI7 ((uint32_t)0x00001700U) /* Select EXTI7 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_EXTI8 ((uint32_t)0x00001800U) /* Select EXTI8 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_EXTI9 ((uint32_t)0x00001900U) /* Select EXTI9 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_EXTI10 ((uint32_t)0x00001A00U) /* Select EXTI10 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_EXTI11 ((uint32_t)0x00001B00U) /* Select EXTI11 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_EXTI12 ((uint32_t)0x00001C00U) /* Select EXTI12 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_EXTI13 ((uint32_t)0x00001D00U) /* Select EXTI13 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_EXTI14 ((uint32_t)0x00001E00U) /* Select EXTI14 as trigger signal for injected conversion */ +#define DSMU_FILTER_EXT_TRIG_EXTI15 ((uint32_t)0x00001F00U) /* Select EXTI15 as trigger signal for injected conversion */ + +/** DSMU_Filter_ExtTriggerEdge DSMU filter external trigger edge **/ +#define DSMU_FILTER_EXT_TRIG_DISABLE ((uint32_t)0x00000000U) /* External trigger disable */ +#define DSMU_FILTER_EXT_TRIG_RISING_EDGE (DSMU_FLTXCTRL1_JEXTEN_0) /* External rising edge */ +#define DSMU_FILTER_EXT_TRIG_FALLING_EDGE (DSMU_FLTXCTRL1_JEXTEN_1) /* External falling edge */ +#define DSMU_FILTER_EXT_TRIG_BOTH_EDGES (DSMU_FLTXCTRL1_JEXTEN) /* External rising and falling edges */ + +/** DSMU_Filter_SincOrder DSMU filter sinc order **/ +#define DSMU_FILTER_FASTSINC_ORDER ((uint32_t)0x00000000U) /* FastSinc filter type */ +#define DSMU_FILTER_SINC1_ORDER ( DSMU_FLTXFCTRL_FORD_0) /* Sinc 1 filter type */ +#define DSMU_FILTER_SINC2_ORDER ( DSMU_FLTXFCTRL_FORD_1) /* Sinc 2 filter type */ +#define DSMU_FILTER_SINC3_ORDER ( DSMU_FLTXFCTRL_FORD_0 \ + | DSMU_FLTXFCTRL_FORD_1) /* Sinc 3 filter type */ +#define DSMU_FILTER_SINC4_ORDER ( DSMU_FLTXFCTRL_FORD_2) /* Sinc 4 filter type */ +#define DSMU_FILTER_SINC5_ORDER ( DSMU_FLTXFCTRL_FORD_0 \ + | DSMU_FLTXFCTRL_FORD_2) /* Sinc 5 filter type */ + +/** DSMU_Filter_AwdDataSource DSMU filter analog watchdog data source **/ +#define DSMU_FILTER_AWD_FILTER_DATA ((uint32_t)0x00000000U) /* From digital filter */ +#define DSMU_FILTER_AWD_CHANNEL_DATA (DSMU_FLTXCTRL1_AWDFSEL) /* From analog watchdog channel */ + +/** DSMU_BreakSignals DSMU break signals **/ +#define DSMU_NO_BREAK_SIGNAL ((uint32_t)0x00000000U) /* No break signal */ +#define DSMU_BREAK_SIGNAL_0 ((uint32_t)0x00000001U) /* Break signal 0 */ +#define DSMU_BREAK_SIGNAL_1 ((uint32_t)0x00000002U) /* Break signal 1 */ +#define DSMU_BREAK_SIGNAL_2 ((uint32_t)0x00000004U) /* Break signal 2 */ +#define DSMU_BREAK_SIGNAL_3 ((uint32_t)0x00000008U) /* Break signal 3 */ + +/** DSMU_ContinuousMode DSMU Continuous Mode **/ +#define DSMU_CONTINUOUS_CONV_OFF ((uint32_t)0x00000000U) /* Conversion are not continuous */ +#define DSMU_CONTINUOUS_CONV_ON (DSMU_FLTXCTRL1_RCONT) /* Conversion are continuous */ + +/** DSMU_AwdThreshold DSMU analog watchdog threshold **/ +#define DSMU_AWD_HIGH_THRESHOLD ((uint32_t)0x00000000U) /* Analog watchdog high threshold */ +#define DSMU_AWD_LOW_THRESHOLD ((uint32_t)0x00000001U) /* Analog watchdog low threshold */ + +/** DSMU interrupt enable bit **/ +#define DSMU_INT_CLOCK_ABSENCE (DSMU_FLTXCTRL2_CLKABIEN) /* Clock absence interrupt enable */ +#define DSMU_INT_SHORT_CIRCUIT (DSMU_FLTXCTRL2_SCDETIEN) /* Short circuit interrupt enable */ +#define DSMU_INT_ANALOG_WATCHDOG (DSMU_FLTXCTRL2_AWDIEN) /* Analog watchdog interrupt enable */ +#define DSMU_INT_REGULAR_OVERRUN (DSMU_FLTXCTRL2_ROVRIEN) /* Regular conversion overrun interrupt enable */ +#define DSMU_INT_INJECT_OVERRUN (DSMU_FLTXCTRL2_JOVRIEN) /* Injected conversion overrun interrupt enable */ +#define DSMU_INT_REGULAR_END (DSMU_FLTXCTRL2_REOCIEN) /* Regular conversion end interrupt enable */ +#define DSMU_INT_INJECT_END (DSMU_FLTXCTRL2_JEOCIEN) /* Injected conversion end interrupt enable */ + +/** DSMU interrupt flag bit **/ +#define DSMU_FLAG_SHORT_CIRCUIT_CH0 (DSMU_FLTXSTS_SCDETF_0) /* Short circuit event flag for channel0 */ +#define DSMU_FLAG_SHORT_CIRCUIT_CH1 (DSMU_FLTXSTS_SCDETF_1) /* Short circuit event flag for channel1 */ +#define DSMU_FLAG_SHORT_CIRCUIT_CH2 (DSMU_FLTXSTS_SCDETF_2) /* Short circuit event flag for channel2 */ +#define DSMU_FLAG_SHORT_CIRCUIT_CH3 (DSMU_FLTXSTS_SCDETF_3) /* Short circuit event flag for channel3 */ +#define DSMU_FLAG_SHORT_CIRCUIT_CH4 (DSMU_FLTXSTS_SCDETF_4) /* Short circuit event flag for channel4 */ +#define DSMU_FLAG_SHORT_CIRCUIT_CH5 (DSMU_FLTXSTS_SCDETF_5) /* Short circuit event flag for channel5 */ +#define DSMU_FLAG_SHORT_CIRCUIT_CH6 (DSMU_FLTXSTS_SCDETF_6) /* Short circuit event flag for channel6 */ +#define DSMU_FLAG_SHORT_CIRCUIT_CH7 (DSMU_FLTXSTS_SCDETF_7) /* Short circuit event flag for channel7 */ +#define DSMU_FLAG_CLOCK_ABSENCE_CH0 (DSMU_FLTXSTS_CLKABF_0) /* Clock absence event flag for channel0 */ +#define DSMU_FLAG_CLOCK_ABSENCE_CH1 (DSMU_FLTXSTS_CLKABF_1) /* Clock absence event flag for channel1 */ +#define DSMU_FLAG_CLOCK_ABSENCE_CH2 (DSMU_FLTXSTS_CLKABF_2) /* Clock absence event flag for channel2 */ +#define DSMU_FLAG_CLOCK_ABSENCE_CH3 (DSMU_FLTXSTS_CLKABF_3) /* Clock absence event flag for channel3 */ +#define DSMU_FLAG_CLOCK_ABSENCE_CH4 (DSMU_FLTXSTS_CLKABF_4) /* Clock absence event flag for channel4 */ +#define DSMU_FLAG_CLOCK_ABSENCE_CH5 (DSMU_FLTXSTS_CLKABF_5) /* Clock absence event flag for channel5 */ +#define DSMU_FLAG_CLOCK_ABSENCE_CH6 (DSMU_FLTXSTS_CLKABF_6) /* Clock absence event flag for channel6 */ +#define DSMU_FLAG_CLOCK_ABSENCE_CH7 (DSMU_FLTXSTS_CLKABF_7) /* Clock absence event flag for channel7 */ +#define DSMU_FLAG_REGULAR_ACTIVE (DSMU_FLTXSTS_RCIP) /* Rugular conversion active flag */ +#define DSMU_FLAG_INJECT_ACTIVE (DSMU_FLTXSTS_JCIP) /* Injected conversion active flag */ +#define DSMU_FLAG_ANALOG_WATCHDOG (DSMU_FLTXSTS_AWDF) /* Analog watchdog event flag */ +#define DSMU_FLAG_REGULAR_OVERRUN (DSMU_FLTXSTS_ROVRF) /* Regular conversion overrun flag */ +#define DSMU_FLAG_INJECT_OVERRUN (DSMU_FLTXSTS_JOVRF) /* Injected conversion overrun flag */ +#define DSMU_FLAG_REGULAR_END (DSMU_FLTXSTS_REOCF) /* Regular conversion end flag */ +#define DSMU_FLAG_INJECT_END (DSMU_FLTXSTS_JEOCF) /* Injected conversion end flag */ + +/** DSMU interrupt flag clear bit **/ +#define DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH0 (DSMU_FLTXINTCLR_CLRSCDETF_0) /* Clear Short circuit event flag for channel0 */ +#define DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH1 (DSMU_FLTXINTCLR_CLRSCDETF_1) /* Clear Short circuit event flag for channel1 */ +#define DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH2 (DSMU_FLTXINTCLR_CLRSCDETF_2) /* Clear Short circuit event flag for channel2 */ +#define DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH3 (DSMU_FLTXINTCLR_CLRSCDETF_3) /* Clear Short circuit event flag for channel3 */ +#define DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH4 (DSMU_FLTXINTCLR_CLRSCDETF_4) /* Clear Short circuit event flag for channel4 */ +#define DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH5 (DSMU_FLTXINTCLR_CLRSCDETF_5) /* Clear Short circuit event flag for channel5 */ +#define DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH6 (DSMU_FLTXINTCLR_CLRSCDETF_6) /* Clear Short circuit event flag for channel6 */ +#define DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH7 (DSMU_FLTXINTCLR_CLRSCDETF_7) /* Clear Short circuit event flag for channel7 */ +#define DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH0 (DSMU_FLTXINTCLR_CLRCLKABF_0) /* Clear Clock absence event flag for channel0 */ +#define DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH1 (DSMU_FLTXINTCLR_CLRCLKABF_1) /* Clear Clock absence event flag for channel1 */ +#define DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH2 (DSMU_FLTXINTCLR_CLRCLKABF_2) /* Clear Clock absence event flag for channel2 */ +#define DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH3 (DSMU_FLTXINTCLR_CLRCLKABF_3) /* Clear Clock absence event flag for channel3 */ +#define DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH4 (DSMU_FLTXINTCLR_CLRCLKABF_4) /* Clear Clock absence event flag for channel4 */ +#define DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH5 (DSMU_FLTXINTCLR_CLRCLKABF_5) /* Clear Clock absence event flag for channel5 */ +#define DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH6 (DSMU_FLTXINTCLR_CLRCLKABF_6) /* Clear Clock absence event flag for channel6 */ +#define DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH7 (DSMU_FLTXINTCLR_CLRCLKABF_7) /* Clear Clock absence event flag for channel7 */ +#define DSMU_CLEAR_FLAG_REGULAR_OVERRUN (DSMU_FLTXINTCLR_CLRROVRF) /* Clear Regular conversion overrun flag */ +#define DSMU_CLEAR_FLAG_INJECT_OVERRUN (DSMU_FLTXINTCLR_CLRJOVRF) /* Clear Injected conversion overrun flag */ +#define DSMU_CLEAR_FLAG_ALL ( DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH0 | DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH1 \ + | DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH2 | DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH3 \ + | DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH4 | DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH5 \ + | DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH6 | DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH7 \ + | DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH0 | DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH1 \ + | DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH2 | DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH3 \ + | DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH4 | DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH5 \ + | DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH6 | DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH7 \ + | DSMU_CLEAR_FLAG_REGULAR_OVERRUN | DSMU_CLEAR_FLAG_INJECT_OVERRUN ) + +/** DSMU analog watchdog flag bit **/ +#define DSMU_AWD_FLAG_HIGH_THRESHOLD_CH0 (DSMU_FLTXAWDSTS_AWDHTF_0) /* Analog wathcdog high threshold error flag for channel0 */ +#define DSMU_AWD_FLAG_HIGH_THRESHOLD_CH1 (DSMU_FLTXAWDSTS_AWDHTF_1) /* Analog wathcdog high threshold error flag for channel1 */ +#define DSMU_AWD_FLAG_HIGH_THRESHOLD_CH2 (DSMU_FLTXAWDSTS_AWDHTF_2) /* Analog wathcdog high threshold error flag for channel2 */ +#define DSMU_AWD_FLAG_HIGH_THRESHOLD_CH3 (DSMU_FLTXAWDSTS_AWDHTF_3) /* Analog wathcdog high threshold error flag for channel3 */ +#define DSMU_AWD_FLAG_HIGH_THRESHOLD_CH4 (DSMU_FLTXAWDSTS_AWDHTF_4) /* Analog wathcdog high threshold error flag for channel4 */ +#define DSMU_AWD_FLAG_HIGH_THRESHOLD_CH5 (DSMU_FLTXAWDSTS_AWDHTF_5) /* Analog wathcdog high threshold error flag for channel5 */ +#define DSMU_AWD_FLAG_HIGH_THRESHOLD_CH6 (DSMU_FLTXAWDSTS_AWDHTF_6) /* Analog wathcdog high threshold error flag for channel6 */ +#define DSMU_AWD_FLAG_HIGH_THRESHOLD_CH7 (DSMU_FLTXAWDSTS_AWDHTF_7) /* Analog wathcdog high threshold error flag for channel7 */ +#define DSMU_AWD_FLAG_LOW_THRESHOLD_CH0 (DSMU_FLTXAWDSTS_AWDLTF_0) /* Analog wathcdog low threshold error flag for channel0 */ +#define DSMU_AWD_FLAG_LOW_THRESHOLD_CH1 (DSMU_FLTXAWDSTS_AWDLTF_1) /* Analog wathcdog low threshold error flag for channel1 */ +#define DSMU_AWD_FLAG_LOW_THRESHOLD_CH2 (DSMU_FLTXAWDSTS_AWDLTF_2) /* Analog wathcdog low threshold error flag for channel2 */ +#define DSMU_AWD_FLAG_LOW_THRESHOLD_CH3 (DSMU_FLTXAWDSTS_AWDLTF_3) /* Analog wathcdog low threshold error flag for channel3 */ +#define DSMU_AWD_FLAG_LOW_THRESHOLD_CH4 (DSMU_FLTXAWDSTS_AWDLTF_4) /* Analog wathcdog low threshold error flag for channel4 */ +#define DSMU_AWD_FLAG_LOW_THRESHOLD_CH5 (DSMU_FLTXAWDSTS_AWDLTF_5) /* Analog wathcdog low threshold error flag for channel5 */ +#define DSMU_AWD_FLAG_LOW_THRESHOLD_CH6 (DSMU_FLTXAWDSTS_AWDLTF_6) /* Analog wathcdog low threshold error flag for channel6 */ +#define DSMU_AWD_FLAG_LOW_THRESHOLD_CH7 (DSMU_FLTXAWDSTS_AWDLTF_7) /* Analog wathcdog low threshold error flag for channel7 */ + +/** DSMU analog watchdog flag clear bit **/ +#define DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH0 (DSMU_FLTXAWDCLR_CLRAWDHTF_0) /* Clear Analog wathcdog high threshold error flag for channel0 */ +#define DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH1 (DSMU_FLTXAWDCLR_CLRAWDHTF_1) /* Clear Analog wathcdog high threshold error flag for channel1 */ +#define DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH2 (DSMU_FLTXAWDCLR_CLRAWDHTF_2) /* Clear Analog wathcdog high threshold error flag for channel2 */ +#define DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH3 (DSMU_FLTXAWDCLR_CLRAWDHTF_3) /* Clear Analog wathcdog high threshold error flag for channel3 */ +#define DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH4 (DSMU_FLTXAWDCLR_CLRAWDHTF_4) /* Clear Analog wathcdog high threshold error flag for channel4 */ +#define DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH5 (DSMU_FLTXAWDCLR_CLRAWDHTF_5) /* Clear Analog wathcdog high threshold error flag for channel5 */ +#define DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH6 (DSMU_FLTXAWDCLR_CLRAWDHTF_6) /* Clear Analog wathcdog high threshold error flag for channel6 */ +#define DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH7 (DSMU_FLTXAWDCLR_CLRAWDHTF_7) /* Clear Analog wathcdog high threshold error flag for channel7 */ +#define DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH0 (DSMU_FLTXAWDCLR_CLRAWDLTF_0) /* Clear Analog wathcdog low threshold error flag for channel0 */ +#define DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH1 (DSMU_FLTXAWDCLR_CLRAWDLTF_1) /* Clear Analog wathcdog low threshold error flag for channel1 */ +#define DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH2 (DSMU_FLTXAWDCLR_CLRAWDLTF_2) /* Clear Analog wathcdog low threshold error flag for channel2 */ +#define DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH3 (DSMU_FLTXAWDCLR_CLRAWDLTF_3) /* Clear Analog wathcdog low threshold error flag for channel3 */ +#define DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH4 (DSMU_FLTXAWDCLR_CLRAWDLTF_4) /* Clear Analog wathcdog low threshold error flag for channel4 */ +#define DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH5 (DSMU_FLTXAWDCLR_CLRAWDLTF_5) /* Clear Analog wathcdog low threshold error flag for channel5 */ +#define DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH6 (DSMU_FLTXAWDCLR_CLRAWDLTF_6) /* Clear Analog wathcdog low threshold error flag for channel6 */ +#define DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH7 (DSMU_FLTXAWDCLR_CLRAWDLTF_7) /* Clear Analog wathcdog low threshold error flag for channel7 */ +#define DSMU_CLEAR_AWD_FLAG_ALL ( DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH0 | DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH1 \ + | DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH2 | DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH3 \ + | DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH4 | DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH5 \ + | DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH6 | DSMU_CLEAR_AWD_FLAG_HIGH_THRESHOLD_CH7 \ + | DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH0 | DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH1 \ + | DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH2 | DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH3 \ + | DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH4 | DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH5 \ + | DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH6 | DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH7) + + +void DSMU_DeInit(void); +void DSMU_InitChannelStruct(DSMU_Channel_InitType* DSMU_ChannelInitStruct); +void DSMU_InitFilterStruct(DSMU_Filter_InitType* DSMU_FilterInitStruct); +ErrorStatus DSMU_ChannelInit(DSMU_Channel_Submodule* DSMU_Channely, DSMU_Channel_InitType* DSMU_ChannelInitStruct); +void DSMU_ChannelDeInit(DSMU_Channel_Submodule* DSMU_Channely); +void DSMU_ChannelCkAbEnable(DSMU_Channel_Submodule* DSMU_Channely); +void DSMU_ChannelCkAbDisable(DSMU_Channel_Submodule* DSMU_Channely); +void DSMU_ChannelScdStart(DSMU_Channel_Submodule* DSMU_Channely,uint32_t Threshold, uint32_t BreakSignal); +void DSMU_ChannelScdStop(DSMU_Channel_Submodule* DSMU_Channely); +int16_t DSMU_ChannelGetAwdValue(const DSMU_Channel_Submodule* DSMU_Channely); +void DSMU_ChannelModifyOffset(DSMU_Channel_Submodule* DSMU_Channely, int32_t Offset); +void DSMU_ChannelWriteData(DSMU_Channel_Submodule* DSMU_Channely,uint32_t data); +ErrorStatus DSMU_FilterInit(DSMU_Filter_Submodule* DSMU_Filterx, DSMU_Filter_InitType* DSMU_FilterInitStruct); +void DSMU_FilterEnable(DSMU_Filter_Submodule* DSMU_Filterx, FunctionalState Cmd); +void DSMU_FilterConfigRegChannel(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t ChannelSelect,uint32_t ContinuousMode); +void DSMU_FilterConfigInjChannel(DSMU_Filter_Submodule* DSMU_Filterx,uint32_t ChannelSelect); +int32_t DSMU_FilterGetRegularValue(const DSMU_Filter_Submodule* DSMU_Filterx, uint32_t* Channel); +int32_t DSMU_FilterGetInjectedValue(const DSMU_Filter_Submodule* DSMU_Filterx,uint32_t* Channel); +void DSMU_FilterAwdStart(DSMU_Filter_Submodule* DSMU_Filterx, DSMU_Filter_AwdParamType* awdParam); +void DSMU_FilterAwdStop(DSMU_Filter_Submodule* DSMU_Filterx); +void DSMU_FilterExdStart(DSMU_Filter_Submodule* DSMU_Filterx,uint32_t ChannelSelect); +void DSMU_FilterExdStop(DSMU_Filter_Submodule* DSMU_Filterx); +int32_t DSMU_FilterGetExdMaxValue(const DSMU_Filter_Submodule* DSMU_Filterx,uint32_t* Channel); +int32_t DSMU_FilterGetExdMinValue(const DSMU_Filter_Submodule* DSMU_Filterx,uint32_t* Channel); +uint32_t DSMU_FilterGetConvTimeValue(const DSMU_Filter_Submodule* DSMU_Filterx); +void DSMU_RegConvStart(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger); +void DSMU_RegConvStop(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger); +void DSMU_InjConvStart(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger, uint32_t TiggerEdge); +void DSMU_InjConvStop(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger); +FlagStatus DSMU_GetFlagStatus(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_IntFlag); +void DSMU_ClearFlag(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_IntFlagClear); +FlagStatus DSMU_GetAwdFlagStatus(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_AwdFlag); +void DSMU_ClearAwdFlag(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_AwdFlagClear); +void DSMU_ConfigInt(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_Int, FunctionalState Cmd); +void DSMU_ConfigRegChDMA(DSMU_Filter_Submodule* DSMU_Filterx, FunctionalState Cmd); +void DSMU_ConfigInjChDMA(DSMU_Filter_Submodule* DSMU_Filterx, FunctionalState Cmd); + +#ifdef __cplusplus +} +#endif + +#endif /* N32H76x_78x_DSMU_H */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dvp.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dvp.h new file mode 100644 index 0000000000..0016d66e0d --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_dvp.h @@ -0,0 +1,433 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dvp.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76x_78x_DVP_H +#define __N32H76x_78x_DVP_H + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/*** DVP Structure Definition Start ***/ + +/** DVP Init structure definition **/ +typedef struct +{ + + uint32_t CaptureMode; /* Specifies the capture mode. */ + + uint32_t CropMode; /* Specifies the crop mode. */ + + uint32_t SynchroMode; /*!< Specifies the Synchronization Mode: Hardware or Embedded.*/ + + uint16_t CropStartX; /* Specifies the start point x. */ + + uint16_t CropStartY; /* Specifies the start point y. */ + + uint16_t CropEndX; /* Specifies the end point x. */ + + uint16_t CropEndY; /* Specifies the end point y. */ + + uint8_t VBFilter; /* Specifies the VSYNC blanking glitch filtering. */ + + uint32_t PixelClkPolarity; /* Specifies the pixel clock polarity */ + + uint32_t HsyncPolarity; /* Specifies the Horizontal synchronization polarity */ + + uint32_t VsyncPolarity; /* Specifies the vertical synchronization polarity */ + + uint32_t DataInvert; /* Specifies the data invert. */ + + uint32_t DataReverse; /* Specifies the data reverse. */ + + uint32_t DataMode; /* Specifies the data port mode. */ + + uint32_t PixelByte; /* Specifies pixel byte. */ + +}DVP_InitType; + + +/** DVP DMA init structure definition **/ +typedef struct +{ + + uint8_t FrameBufferNum; /* Specifies Frame Buffer number. */ + + uint32_t FrameBufferAddress1; /* Specifies Frame Buffer 1 Address. */ + + uint32_t FrameBufferAddress2; /* Specifies Frame Buffer 2 Address. */ + + uint32_t DisplayStatus; /* Specifies Display buffer status. */ + + uint32_t FifoThreshold; /* Specifies FIFO transmit threshold. */ + + uint32_t BurstSize; /* Specifies Frame Buffer size. */ + + uint32_t FrameBufferSize; /* Specifies Frame Buffer size. */ + +}DVP_DMAInitType; + +/*** DVP Structure Definition End ***/ + +/*** DVP Macro Definition Start ***/ +/** DVP register bit field mask definition **/ +#define DVP_REG_BIT_FIELD_MASK ((uint32_t)0x00000000U) + +/** DVP enable definition**/ +#define DVP_ENABLE (DVP_CTRL_DVPEN) +#define DVP_DISABLE (DVP_INTSTS_DVPDIS) + +/** DVP Capture Mode definition**/ +#define DVP_CAPTURE_MODE_MASK (~DVP_CTRL_CM) +#define DVP_CAPTURE_MODE_CONTINUE (DVP_REG_BIT_FIELD_MASK) +#define DVP_CAPTURE_MODE_SINGLE (DVP_CTRL_CM) + +/** DVP Cropping Feature definition**/ +#define DVP_CROP_MODE_MASK (~DVP_CTRL_CROPEN) +#define DVP_NORMAL_MODE (DVP_REG_BIT_FIELD_MASK) +#define DVP_CROP_MODE (DVP_CTRL_CROPEN) + +/** DVP VSYNC blanking glitch filtering control definition**/ +#define DVP_VBFLT_MASK (~((uint32_t)DVP_CTRL_VBFLT)) + +/** DVP interrupts definition **/ +#define DVP_INT_M1S (DVP_INTEN_M1SIE ) +#define DVP_INT_M2S (DVP_INTEN_M2SIE ) +#define DVP_INT_M1TC (DVP_INTEN_M1TCIE ) +#define DVP_INT_M2TC (DVP_INTEN_M2TCIE ) +#define DVP_INT_FO (DVP_INTEN_FOIE ) +#define DVP_INT_AHBERR (DVP_INTEN_AHBERR ) +#define DVP_INT_MO (DVP_INTEN_MOIE ) +#define DVP_INT_SKIP (DVP_INTEN_SKIPIE ) +#define DVP_INT_CERR (DVP_INTEN_CERRIE ) +#define DVP_INT_SERR (DVP_INTEN_SERRIE ) +#define DVP_INT_FMS (DVP_INTEN_FMSIE ) + +/** DVP flags definition **/ +#define DVP_FLAG_M1S (DVP_INTSTS_M1SF ) +#define DVP_FLAG_M2S (DVP_INTSTS_M2SF ) +#define DVP_FLAG_M1TC (DVP_INTSTS_M1TCF ) +#define DVP_FLAG_M2TC (DVP_INTSTS_M2TCF ) +#define DVP_FLAG_M1FO (DVP_INTSTS_M1FOF ) +#define DVP_FLAG_M2FO (DVP_INTSTS_M2FOF ) +#define DVP_FLAG_AHBERR1 (DVP_INTSTS_AHBERR1F ) +#define DVP_FLAG_AHBERR2 (DVP_INTSTS_AHBERR2F ) +#define DVP_FLAG_M1O (DVP_INTSTS_M1OF ) +#define DVP_FLAG_M2O (DVP_INTSTS_M2OF ) +#define DVP_FLAG_SKIP (DVP_INTSTS_SKIPF ) +#define DVP_FLAG_CERR (DVP_INTSTS_CERRF ) +#define DVP_FLAG_SERR (DVP_INTSTS_SERRF ) +#define DVP_FLAG_FMS (DVP_INTSTS_FMSF ) + +/** DVP pixel clock polarity definition **/ +#define DVP_PIXEL_POLARITY_MASK (~DVP_PORTCFG_PCLKPOL) +#define DVP_PIXEL_POLARITY_RISING (DVP_REG_BIT_FIELD_MASK) /* if the data from the sensor is expected to be latched at the rising edge of the pixel clock. */ +#define DVP_PIXEL_POLARITY_FALLING (DVP_PORTCFG_PCLKPOL) /* if the data from the sensor is expected to be latched at the falling edge of the pixel clock. */ + +/** DVP horizontal polarity definition **/ +#define DVP_HSYNC_POLARITY_MASK (~DVP_PORTCFG_HSPOL) +#define DVP_HSYNC_POLARITY_HIGH (DVP_REG_BIT_FIELD_MASK) /* when HSYNC=0 is high active. */ +#define DVP_HSYNC_POLARITY_LOW (DVP_PORTCFG_HSPOL) /* when HSYNC=1 is low active. */ + +/** DVP vertical polarity definition **/ +#define DVP_VSYNC_POLARITY_MASK (~DVP_PORTCFG_VSPOL) +#define DVP_VSYNC_POLARITY_HIGH (DVP_PORTCFG_VSPOL) /* when VSYNC=1 is high active. */ +#define DVP_VSYNC_POLARITY_LOW (DVP_REG_BIT_FIELD_MASK) /* when VSYNC=0 islow active. */ + +/** DVP Data bit inversion definition **/ +#define DVP_DATA_INVERT_MASK (~DVP_PORTCFG_DATINV) +#define DVP_DATA_INVERT (DVP_PORTCFG_DATINV) /* enable data bit inversion on the DVP port data. */ +#define DVP_DATA_NOTINVERT (DVP_REG_BIT_FIELD_MASK) /* data bit inversion is not enabled. */ + +/** DVP Data bit reverse definition **/ +#define DVP_DATA_REVERSE_MASK (~DVP_PORTCFG_DATRVS) +#define DVP_DATA_REVERSE (DVP_PORTCFG_DATRVS) /* enable to reverse data bit order on the DVP port data. */ +#define DVP_DATA_NOTREVERSE (DVP_REG_BIT_FIELD_MASK) /* remain original data bit order. */ + + +/** DVP Embedded Synchronization Code Position definition **/ +#define DVP_EMBSYNC_POS_MASK (~DVP_PORTCFG_SLC) +#define DVP_EMBSYNC_LSB (DVP_PORTCFG_SLC) /* the sync code is aligned to the least significant bit of the data lines. */ +#define DVP_EMBSYNC_MSB (DVP_REG_BIT_FIELD_MASK) /* the sync code is aligned to the most significant bit of the data lines. */ + +/** DVP Embedded Synchronization Code mode definition **/ +#define DVP_EMBSYNC_MASK (~DVP_PORTCFG_EMBSEN) +#define DVP_SYNC_MODE_SOFTWARE (DVP_PORTCFG_EMBSEN) /* embedded synchronization mode. */ +#define DVP_SYNC_MODE_HARDWARE (DVP_REG_BIT_FIELD_MASK) /* use VSYNC and HSYNC to do synchronization. */ + +/** DVP data port mode definition **/ +#define DVP_DATA_MODE_MASK (~DVP_PORTCFG_DBIT) +#define DVP_DATA_MODE1 (DVP_REG_BIT_FIELD_MASK) /* 8-bit physical data port, and data is captured on all data lines. */ +#define DVP_DATA_MODE2 (DVP_PORTCFG_DBIT0) /* 10-bit physical data port, and data is captured on all data lines. */ +#define DVP_DATA_MODE3 (DVP_PORTCFG_DBIT1) /* 12-bit physical data port, and data is captured on all data lines. */ +#define DVP_DATA_MODE4 (DVP_PORTCFG_DBIT0 | DVP_PORTCFG_DBIT1) /* 14-bit physical data port, and data is captured on all data lines. */ +#define DVP_DATA_MODE5 (DVP_PORTCFG_DBIT2) /* 16-bit physical data port, and data is captured on all data lines. */ +#define DVP_DATA_MODE6 (DVP_PORTCFG_DBIT0 | DVP_PORTCFG_DBIT2) /* 10-bit physical data port, and data is captured on 8 data lines [9:2] only. */ +#define DVP_DATA_MODE7 (DVP_PORTCFG_DBIT1 | DVP_PORTCFG_DBIT2) /* 12-bit physical data port, and data is captured on 10 data lines [11:2] only. */ +#define DVP_DATA_MODE8 (DVP_PORTCFG_DBIT) /* 12-bit physical data port, and data is captured on 8 data lines [11:4] only. */ + +/** DVP pixel bytes definition **/ +#define DVP_PIXEL_BYTE_MASK (~DVP_PORTCFG_PIXELDB) +#define DVP_PIXEL_BYTE1 (DVP_REG_BIT_FIELD_MASK) /* one byte per pixel */ +#define DVP_PIXEL_BYTE2 (DVP_PORTCFG_PIXELDB) /* two byte per pixel */ + +/** DVP bytes mapping definition **/ +#define DVP_BYTE_ORDER_MASK (~DVP_PORTCFG_BMAP) + +#define DVP_BYTE0_ORDER1 (DVP_REG_BIT_FIELD_MASK) +#define DVP_BYTE0_ORDER2 (DVP_PORTCFG_BMAP0) +#define DVP_BYTE0_ORDER3 (DVP_PORTCFG_BMAP1) +#define DVP_BYTE0_ORDER4 (DVP_PORTCFG_BMAP0 | DVP_PORTCFG_BMAP1) + +#define DVP_BYTE1_ORDER1 (DVP_REG_BIT_FIELD_MASK) +#define DVP_BYTE1_ORDER2 (DVP_PORTCFG_BMAP2) +#define DVP_BYTE1_ORDER3 (DVP_PORTCFG_BMAP3) +#define DVP_BYTE1_ORDER4 (DVP_PORTCFG_BMAP2 | DVP_PORTCFG_BMAP3) + +#define DVP_BYTE2_ORDER1 (DVP_REG_BIT_FIELD_MASK) +#define DVP_BYTE2_ORDER2 (DVP_PORTCFG_BMAP4) +#define DVP_BYTE2_ORDER3 (DVP_PORTCFG_BMAP5) +#define DVP_BYTE2_ORDER4 (DVP_PORTCFG_BMAP4 | DVP_PORTCFG_BMAP5) + +#define DVP_BYTE3_ORDER1 (DVP_REG_BIT_FIELD_MASK) +#define DVP_BYTE3_ORDER2 (DVP_PORTCFG_BMAP6) +#define DVP_BYTE3_ORDER3 (DVP_PORTCFG_BMAP7) +#define DVP_BYTE3_ORDER4 (DVP_PORTCFG_BMAP6 | DVP_PORTCFG_BMAP7) + +/** DVP Frame Line Skip definition **/ +#define DVP_SKIP_LINE1 ((uint32_t)0x00000001U) +#define DVP_SKIP_LINE2 ((uint32_t)0x00000002U) +#define DVP_SKIP_LINE3 ((uint32_t)0x00000003U) +#define DVP_SKIP_LINE4 ((uint32_t)0x00000004U) +#define DVP_SKIP_LINE5 ((uint32_t)0x00000005U) +#define DVP_SKIP_LINE6 ((uint32_t)0x00000006U) +#define DVP_SKIP_LINE7 ((uint32_t)0x00000007U) +#define DVP_SKIP_LINE8 ((uint32_t)0x00000008U) +#define DVP_SKIP_LINE9 ((uint32_t)0x00000009U) +#define DVP_SKIP_LINE10 ((uint32_t)0x0000000AU) +#define DVP_SKIP_LINE11 ((uint32_t)0x0000000BU) +#define DVP_SKIP_LINE12 ((uint32_t)0x0000000CU) +#define DVP_SKIP_LINE13 ((uint32_t)0x0000000DU) +#define DVP_SKIP_LINE14 ((uint32_t)0x0000000EU) +#define DVP_SKIP_LINE15 ((uint32_t)0x0000000FU) + +/** DVP Initial Frame Line Skip definition **/ +#define DVP_ISKIP_MASK (~DVP_PORTCFG_HISKIP) + +/** DVP Repeat Frame Line Skip definition **/ +#define DVP_RSKIP_MASK (~DVP_PORTCFG_HRSKIP) +#define DVP_ODD_LINE ((uint32_t)0x0000000EU) +#define DVP_EVEN_LINE ((uint32_t)0x0000000FU) + +/** DVP Frame Buffer 1 enable control definition **/ +#define DVP_BUFFER1_MASK ((uint32_t)~DVP_FIFOCFG_M1ADDREN) +#define DVP_BUFFER1 ((uint32_t)DVP_FIFOCFG_M1ADDREN) + +/** DVP Frame Buffer 2 enable control definition **/ +#define DVP_BUFFER2_MASK (~DVP_FIFOCFG_M2ADDREN) +#define DVP_BUFFER2 (DVP_FIFOCFG_M2ADDREN) + +/** DVP bursting across 1K boundary control definition **/ +#define DVP_1K_BOUNDARY_MASK (~DVP_FIFOCFG_EN1KBD) +#define DVP_1K_BOUNDARY_ENABLE (DVP_FIFOCFG_EN1KBD) +#define DVP_1K_BOUNDARY_DISABLE (DVP_REG_BIT_FIELD_MASK) + +/** DVP show current frame buffer status definition **/ +#define DVP_DISPLAY_STATUS_MASK (~DVP_FIFOCFG_DISPMODE) +#define DVP_DISPLAY_ADDRESS (DVP_FIFOCFG_DISPMODE) +#define DVP_DISPLAY_NUMBER (DVP_REG_BIT_FIELD_MASK) + +/** DVP transmit threshold definition **/ +#define DVP_FIFO_THRSEHOLD_MASK (~DVP_FIFOCFG_TXFTH) +#define DVP_FIFO_THRSEHOLD_BYTE_8 (DVP_REG_BIT_FIELD_MASK) +#define DVP_FIFO_THRSEHOLD_BYTE_16 (DVP_FIFOCFG_TXFTH0) +#define DVP_FIFO_THRSEHOLD_BYTE_32 (DVP_FIFOCFG_TXFTH1) +#define DVP_FIFO_THRSEHOLD_BYTE_64 (DVP_FIFOCFG_TXFTH0 | DVP_FIFOCFG_TXFTH1) +#define DVP_FIFO_THRSEHOLD_BYTE_128 (DVP_FIFOCFG_TXFTH2) +#define DVP_FIFO_THRSEHOLD_BYTE_256 (DVP_FIFOCFG_TXFTH2 | DVP_FIFOCFG_TXFTH0) +#define DVP_FIFO_THRSEHOLD_BYTE_512 (DVP_FIFOCFG_TXFTH2 | DVP_FIFOCFG_TXFTH1) +#define DVP_FIFO_THRSEHOLD_BYTE_1024 (DVP_FIFOCFG_TXFTH2 | DVP_FIFOCFG_TXFTH1 | DVP_FIFOCFG_TXFTH0) + +/** DVP data burst definition **/ +#define DVP_BURST_SIZE_MASK (~DVP_FIFOCFG_TXBURSZ) +#define DVP_BURST_SIZE_BYTE_8 (DVP_REG_BIT_FIELD_MASK) +#define DVP_BURST_SIZE_BYTE_16 (DVP_FIFOCFG_TXBURSZ0) +#define DVP_BURST_SIZE_BYTE_24 (DVP_FIFOCFG_TXBURSZ1) +#define DVP_BURST_SIZE_BYTE_32 (DVP_FIFOCFG_TXBURSZ0 | DVP_FIFOCFG_TXBURSZ1) +#define DVP_BURST_SIZE_BYTE_40 (DVP_FIFOCFG_TXBURSZ2) +#define DVP_BURST_SIZE_BYTE_48 (DVP_FIFOCFG_TXBURSZ2 | DVP_FIFOCFG_TXBURSZ0) +#define DVP_BURST_SIZE_BYTE_56 (DVP_FIFOCFG_TXBURSZ2 | DVP_FIFOCFG_TXBURSZ1) +#define DVP_BURST_SIZE_BYTE_64 (DVP_FIFOCFG_TXBURSZ) +/*** DVP Private Definition End ***/ + +/*** DVP Driving Functions Declaration ***/ +void DVP_DeInit(DVP_Module *DVPx); +void DVP_Init(DVP_Module *DVPx, DVP_InitType* DVP_InitParam); +void DVP_StructInit(DVP_InitType* DVP_InitParam); +void DVP_ConfigDma(DVP_Module *DVPx, DVP_DMAInitType* DVP_DMAInitParam); +void DVP_DMAStructInit(DVP_DMAInitType* DVP_DMAInitParam); +void DVP_EnablePort(DVP_Module *DVPx, FunctionalState Cmd); +void DVP_EnableCrop(DVP_Module *DVPx, FunctionalState Cmd); +void DVP_ConfigVBlankFilter(DVP_Module *DVPx, uint8_t Filt); +void DVP_ConfigInt(DVP_Module *DVPx, uint32_t DVPInt, FunctionalState Cmd); +FlagStatus DVP_GetFlagStatus(DVP_Module *DVPx, uint32_t DVP_Flag); +void DVP_ClearFlag(DVP_Module *DVPx, uint32_t DVP_Flag); +INTStatus DVP_GetIntStatus(DVP_Module *DVPx, uint32_t DVP_Int); +void DVP_ClrIntPendingBit(DVP_Module *DVPx, uint32_t DVP_Int); +void DVP_ConfigPixelClockPolarity(DVP_Module *DVPx, uint32_t PLCK_POL); +void DVP_ConfigHSyncPolarity(DVP_Module *DVPx, uint32_t HSYNC_POL); +void DVP_ConfigVSyncPolarity(DVP_Module *DVPx, uint32_t VSYNC_POL); +void DVP_EnableDataInvert(DVP_Module *DVPx, FunctionalState Cmd); +void DVP_EnableDataReverse(DVP_Module *DVPx, FunctionalState Cmd); +void DVP_ConfigEmbSyncPos(DVP_Module *DVPx, uint32_t SYNC_Pos); +void DVP_ConfigEmbSyncData(DVP_Module *DVPx, uint8_t FrameStartValue, uint8_t FrameEndValue, uint8_t LineStartValue, uint8_t LineEndValue); +void DVP_ConfigEmbSyncDataMask(DVP_Module *DVPx, uint8_t FrameStartMask, uint8_t FrameEndMask, uint8_t LineStartMask, uint8_t LineEndMask); +void DVP_EnableEmbSyncMode(DVP_Module *DVPx, FunctionalState Cmd); +void DVP_ConfigDataMode(DVP_Module *DVPx, uint32_t Mode); +void DVP_ConfigPixelByte(DVP_Module *DVPx, uint32_t Pixel_Byte); +void DVP_ConfigDATAByteOrder(DVP_Module *DVPx, uint32_t Byte0, uint32_t Byte1, uint32_t Byte2, uint32_t Byte3); +void DVP_ConfigInitSKIP(DVP_Module *DVPx, uint32_t Line); +void DVP_EnableBuffer1(DVP_Module *DVPx, FunctionalState Cmd); +void DVP_SetBuffer1Address(DVP_Module *DVPx, uint32_t Addres); +void DVP_EnableBuffer2(DVP_Module *DVPx, FunctionalState Cmd); +void DVP_SetBuffer2Address(DVP_Module *DVPx, uint32_t Addres); +void DVP_SetBufferSize(DVP_Module *DVPx, uint32_t Size); +void DVP_SetDisplayBufferStatus(DVP_Module *DVPx, uint32_t State_Mode); +uint32_t DVP_GetDisplayBufferStatus1(DVP_Module *DVPx); +uint32_t DVP_GetDisplayBufferStatus2(DVP_Module *DVPx); +void DVP_EnableAcross1KBoundary(DVP_Module *DVPx, FunctionalState Cmd); +void DVP_ConfigCROPStart(DVP_Module *DVPx, uint16_t X,uint16_t Y); +void DVP_ConfigCROPEnd(DVP_Module *DVPx, uint16_t X,uint16_t Y); + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76x_78x_DVP_H */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_eccmon.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_eccmon.h new file mode 100644 index 0000000000..84afa1d35f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_eccmon.h @@ -0,0 +1,170 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_eccmon.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76x_78x_ECCMON_H__ +#define __N32H76x_78x_ECCMON_H__ + +/* C binding of definitions if building with C++ compiler */ +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "n32h76x_78x.h" +#include "n32h76x_78x_rcc.h" + + +/** ECCMON Init Structure definition **/ +typedef struct +{ + uint32_t MemType; /*Specifies ECCMON monit memory ,can |(or) operation */ + uint32_t CaptureSelect;/*Specifies ECC error event capture selection*/ + uint32_t ErrFlagOut;/*Specifies which error flag out to FLAG_En_OT port,as system fault events*/ +} ECCMON_InitType; + +typedef struct +{ + ECCMON_TypeDef * MonitorUnit;/*ECCMON1P1,ECCMON1P2.......ECCMON3*/ + uint32_t MonitorIndex;/*min:0,max:5*/ +}ECCMON_MonitorType; +#define ECCMON_GROUP_REG_ADDR_GAP (0x05UL) //5 registers +#define AXI_SRAM1_BASE_ADDR ((uint32_t)0x24000000) +#define AXI_SRAM2_BASE_ADDR ((uint32_t)0x24020000) +#define AXI_SRAM3_BASE_ADDR ((uint32_t)0x240A0000) +#define AHB_SRAM1_BASE_ADDR ((uint32_t)0x30000000) +#define AHB_SRAM2_BASE_ADDR ((uint32_t)0x30020000) +#define AHB_SRAM3_BASE_ADDR ((uint32_t)0x30040000) +#define AHB_SRAM4_BASE_ADDR ((uint32_t)0x30048000) +#define AHB_SRAM5_BANK1_BASE_ADDR ((uint32_t)0x30050000) +#define AHB_SRAM5_BANK2_BASE_ADDR ((uint32_t)0x30054000) +#define ITCM_BASE_ADDR ((uint32_t)0x00000000) +#define DTCM_BASE_ADDR ((uint32_t)0x20000000) +#define BACKUP_SRAM_BASE_ADDR ((uint32_t)0x38000000) +/** ECCMON Memory Type definition **/ +#define ECCMON_NONE_SRAM ((uint32_t)0x0000) +#define ECCMON_AXI_SRAM1 ((uint32_t)0x0001) //corresponding ECCMON1P1,n=1 +#define ECCMON_AXI_SRAM2 ((uint32_t)0x0002) //corresponding ECCMON1P2,n=0 +#define ECCMON_AXI_SRAM3 ((uint32_t)0x0004) //corresponding ECCMON1P2,n=1 +#define ECCMON_ITCM ((uint32_t)0x0008) //corresponding ECCMON1P3,n=0 +#define ECCMON_D0TCM ((uint32_t)0x0010) //corresponding ECCMON1P4,n=0 +#define ECCMON_D1TCM ((uint32_t)0x0020) //corresponding ECCMON1P4,n=1 +#define ECCMON_AHB_SRAM1 ((uint32_t)0x0040) //corresponding ECCMON2,n=0 +#define ECCMON_AHB_SRAM2 ((uint32_t)0x0080) //corresponding ECCMON2,n=1 +#define ECCMON_AHB_SRAM3 ((uint32_t)0x0100) //corresponding ECCMON2,n=2 +#define ECCMON_AHB_SRAM4 ((uint32_t)0x0200) //corresponding ECCMON2,n=3 +#define ECCMON_AHB_SRAM5_BANK1 ((uint32_t)0x0400) //corresponding ECCMON2,n=4 +#define ECCMON_AHB_SRAM5_BANK2 ((uint32_t)0x0800) //corresponding ECCMON2,n=5 +#define ECCMON_BACKUP_SRAM ((uint32_t)0x1000) //corresponding ECCMON3,n=0 +/**ECCMON Error Flag Out Type definiton**/ +#define ECCMON_NO_ERROR_FLAG_OUT ((uint32_t)0x00u) +#define ECCMON_1BIT_ERROR_FLAG_OUT ((uint32_t)0x01u) +#define ECCMON_2BIT_ERROR_FLAG_OUT ((uint32_t)0x02u) +#define ECCMON_1_2BIT_ERROR_FLAG_OUT ((uint32_t)0x03u) +/**ECCMON Capture Selection**/ +#define ECCMON_CAPTURE_1_2BIT_ERROR ((uint32_t)0x00u) +#define ECCMON_CAPTURE_1BIT_ERROR ((uint32_t)ECCMON_EINJ_ECSEL1_0) +#define ECCMON_CAPTURE_2BIT_ERROR ((uint32_t)ECCMON_EINJ_ECSEL1_1) +#define ECCMON_CAPTURE_NONE_ERROR ((uint32_t)ECCMON_EINJ_ECSEL1_0|ECCMON_EINJ_ECSEL1_1) + + +/**ECCMON interrupt Type definiton**/ +#define ECCMON_1BIT_ERROR_INT ((uint32_t)0x01u) +#define ECCMON_2BIT_ERROR_INT ((uint32_t)0x02u) +#define ECCMON_1_2BIT_ERROR_INT ((uint32_t)0x03u) + +/**ECCMON Interrupt definiton**/ +#define ECCMON_FLAG_E1DCIFW (ECCMON_INTF1_E1DCIFW) +#define ECCMON_FLAG_E2DCIFW (ECCMON_INTF1_E2DCIFW) +#define ECCMON_FLAG_E1DCIFR (ECCMON_INTF1_E1DCIFR) +#define ECCMON_FLAG_E2DCIFR (ECCMON_INTF1_E2DCIFR) + +#define ECCMON_INT_E1DCIFW (ECCMON_INTF1_E1DCIFW) +#define ECCMON_INT_E2DCIFW (ECCMON_INTF1_E2DCIFW) +#define ECCMON_INT_E1DCIFR (ECCMON_INTF1_E1DCIFR) +#define ECCMON_INT_E2DCIFR (ECCMON_INTF1_E2DCIFR) +/**ECCMON error context flag define */ +#define ECCMON_ERR_CONTEXT_FLAG_E2EAD (ECCMON_FEADR1_E2EAD) +#define ECCMON_ERR_CONTEXT_FLAG_E1EAD (ECCMON_FEADR1_E1EAD) + +/**ECCMON Inject type**/ +#define ECCMON_NO_INJECT ((uint32_t)0x00u) +#define ECCMON_INJECT_1BIT (ECCMON_EINJ_ERICTR1_0) +#define ECCMON_INJECT_2BIT (ECCMON_EINJ_ERICTR1_0|ECCMON_EINJ_ERICTR1_1) +#define ECCMON_INJECT_MASK (ECCMON_EINJ_ERICTR1_0|ECCMON_EINJ_ERICTR1_1) + +void ECCMON_StructInit(ECCMON_InitType *ECCMON_InitStruct); +void ECCMON_Init(ECCMON_InitType *ECCMON_InitStruct); +void ECCMON_ConfigInt(uint32_t ECCMON_MemType, uint32_t ECCMON_IntType); +void ECCMON_InjectError(uint32_t ECCMON_MemType, uint32_t ECCMON_InjectType); +void ECCMON_SetBypassTempRegister(uint32_t ECCMON_MemType, FunctionalState Cmd); +void ECCMON_SetWriteOn2Bit(uint32_t ECCMON_MemType, FunctionalState Cmd); +void ECCMON_Enable(uint32_t ECCMON_MemType,FunctionalState Cmd); +void ECCMON_EnableClk(void); +uint32_t ECCMON_GetFailAddress(uint32_t ECCMON_MemType); +uint32_t ECCMON_GetFailDataLow(uint32_t ECCMON_MemType); +uint32_t ECCMON_GetFailDataHigh(uint32_t ECCMON_MemType); +uint32_t ECCMON_GetFailErrorCode(uint32_t ECCMON_MemType); +FlagStatus ECCMON_GetErrorContextFlagStatus(uint32_t ECCMON_MemType, uint32_t ECCMON_ERR_CONTEXT_FLAG); +void ECCMON_ClrErrorContextFlag(uint32_t ECCMON_MemType, uint32_t ECCMON_ERR_CONTEXT_FLAG); + +FlagStatus ECCMON_GetFlagStatus(uint32_t ECCMON_MemType, uint32_t ECCMON_FLAG); +void ECCMON_ClrFlag(uint32_t ECCMON_MemType, uint32_t ECCMON_FLAG); +INTStatus ECCMON_GetIntStatus(uint32_t ECCMON_MemType, uint32_t ECCMON_INT); +#ifdef __cplusplus +} +#endif + +#endif /* __n32h76x_78x_CRC_H__ */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_eth.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_eth.h new file mode 100644 index 0000000000..81b840cbe8 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_eth.h @@ -0,0 +1,1490 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_eth.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_ETH_H__ +#define __N32H76X_78X_ETH_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include "n32h76x_78x.h" +#include "n32h76x_78x_rcc.h" +#include "n32h76x_78x_gpio.h" + + +#define ETH_TX_DESC_NUMBER ((uint32_t)0x00000004U) /* Tx Descriptor Length: Minimum is 4, maximum is 1024 */ +#define ETH_RX_DESC_NUMBER ((uint32_t)0x00000004U) /* Rx Descriptor Length: Minimum is 4, maximum is 1024 */ + + +/*** ETH Structure Definition Start ***/ + +typedef enum +{ + ETH_MII_MODE = ((uint32_t)0x00000000U), + ETH_RMII_MODE = ((uint32_t)0x00000001U), + ETH_GMII_MODE = ((uint32_t)0x00000002U) +} EthMediaInterfaceType; + +typedef enum +{ + ETH_MDCCLK_NORMAL = ((uint32_t)0x00000000U), /* Frequency range: 1.0MHz ≤ MDC clock ≤ 2.5MHz */ + ETH_MDCCLK_FAST = ((uint32_t)0x00000001U) /* Frequency range: MDC clock > 2.5MHz */ +} EthMdcClkType; + +typedef enum +{ + ETH_SUCCESS = ((uint32_t)0x00000000U), /* No error */ + ETH_ERROR_BUSY = ((uint32_t)0x00000001U), /* Busy error */ + ETH_ERROR_PARAM = ((uint32_t)0x00000002U), /* Parameter error */ + ETH_ERROR_TIMEOUT = ((uint32_t)0x00000004U), /* Timeout error */ + ETH_ERROR_DMA = ((uint32_t)0x00000008U), /* DMA transfer error */ + ETH_ERROR_MAC = ((uint32_t)0x00000010U), /* MAC transfer error */ + ETH_ERROR_RPHY = ((uint32_t)0x00000020U), /* Read PHY register error */ + ETH_ERROR_WPHY = ((uint32_t)0x00000040U), /* Write PHY register error */ + DESC_OWNED_BY_DMA = ((uint32_t)0x00000080U), /* Descriptor is owned by the DMA */ + NO_DESC_TO_BUILD = ((uint32_t)0x00000100U), /* No descriptors to build */ + NO_DATA_TRANSFER = ((uint32_t)0x00000200U), /* No data transfer */ + FATAL_BUS_ERROR = ((uint32_t)0x00000400U), /* Fatal Bus Error */ + ETH_ERROR_MIF = ((uint32_t)0x00000800U) /* Media interface selection error */ +} EthFuncStatusType; + +typedef enum +{ + ETH_MAC_ADDR0_OFFSET = ((uint32_t)0x00000000U), /* MAC Address0 Offset */ + ETH_MAC_ADDR1_OFFSET = ((uint32_t)0x00000008U), /* MAC Address1 Offset */ + ETH_MAC_ADDR2_OFFSET = ((uint32_t)0x00000010U), /* MAC Address2 Offset */ + ETH_MAC_ADDR3_OFFSET = ((uint32_t)0x00000018U) /* MAC Address3 Offset */ +} EthMacAddr0123Type; + +typedef enum +{ + ETH_MACADDR1_OFFSET = ((uint32_t)0x00000008U), /* MAC Address1 Offset */ + ETH_MACADDR2_OFFSET = ((uint32_t)0x00000010U), /* MAC Address2 Offset */ + ETH_MACADDR3_OFFSET = ((uint32_t)0x00000018U) /* MAC Address3 Offset */ +} EthMacAddr123Type; + +typedef enum +{ + ETH_MMC_SCGP_OFFSET = ((uint32_t)0x0000004CU), /* TX Single Collision Good Packets Counter register address Offset */ + ETH_MMC_MCGP_OFFSET = ((uint32_t)0x00000050U), /* TX Multiple Collision Good Packets Counter register address Offset */ + ETH_MMC_PCG_OFFSET = ((uint32_t)0x00000068U), /* TX Good Packets Counter register address Offset */ + ETH_MMC_BPG_OFFSET = ((uint32_t)0x0000008CU), /* RX Good Broadcast Packets Counter register address Offset */ + ETH_MMC_MPG_OFFSET = ((uint32_t)0x00000090U), /* RX Good Multicast Packets Counter register address Offset */ + ETH_MMC_CRCEP_OFFSET = ((uint32_t)0x00000094U), /* RX CRC Error Packets Counter register address Offset */ + ETH_MMC_AEP_OFFSET = ((uint32_t)0x00000098U), /* RX Alignment Error Packets Counter register address Offset */ + ETH_MMC_UPG_OFFSET = ((uint32_t)0x000000C4U) /* RX Good Unicast Packets Counter register address Offset */ +} EthMmcAddrType; + +typedef enum +{ + ETH_MACTS_SSIR_OFFSET = ((uint32_t)0x00000004U), /* Sub Second Increment register address Offset */ + ETH_MACTS_STSR_OFFSET = ((uint32_t)0x00000008U), /* System Time Seconds register address Offset */ + ETH_MACTS_STNSR_OFFSET = ((uint32_t)0x0000000CU), /* System Time Nanoseconds register address Offset */ + ETH_MACTS_STSUR_OFFSET = ((uint32_t)0x00000010U), /* System Time Seconds Update register address Offset */ + ETH_MACTS_STNSUR_OFFSET = ((uint32_t)0x00000014U), /* System Time Nanoseconds Update register address Offset */ + ETH_MACTS_TAR_OFFSET = ((uint32_t)0x00000018U), /* Timestamp Addend register address Offset */ + ETH_MACTS_TTSNSR_OFFSET = ((uint32_t)0x00000030U), /* Tx Timestamp Status Nanoseconds register address Offset */ + ETH_MACTS_TTSSR_OFFSET = ((uint32_t)0x00000034U), /* Tx Timestamp Status Seconds register address Offset */ + ETH_MACTS_TICNSR_OFFSET = ((uint32_t)0x00000058U), /* Timestamp Ingress Correction Nanosecond register address Offset */ + ETH_MACTS_TECNSR_OFFSET = ((uint32_t)0x0000005CU), /* Timestamp Egress Correction Nanosecond register address Offset */ + ETH_MACTS_TILR_OFFSET = ((uint32_t)0x00000068U), /* Timestamp Ingress Latency register address Offset */ + ETH_MACTS_TELR_OFFSET = ((uint32_t)0x0000006CU), /* Timestamp Egress Latency register address Offset */ + ETH_MACTS_PTTSR_OFFSET = ((uint32_t)0x00000080U), /* PPS Target Time Seconds register address Offset */ + ETH_MACTS_PTTNSR_OFFSET = ((uint32_t)0x00000084U) /* PPS Target Time Nanosecond register address Offset */ +} EthTsAddrType; + +typedef enum +{ + ETH_TX_PACKETS_FEATURES_CSUM = ((uint32_t)0x00000001U), /* Checksum Control */ + ETH_TX_PACKETS_FEATURES_SAIC = ((uint32_t)0x00000002U), /* Source Address Insertion Control */ + ETH_TX_PACKETS_FEATURES_VLANTAG = ((uint32_t)0x00000004U), /* VLAN Tag */ + ETH_TX_PACKETS_FEATURES_INNERVLANTAG = ((uint32_t)0x00000008U), /* Inner VLAN Tag */ + ETH_TX_PACKETS_FEATURES_TSO = ((uint32_t)0x00000010U), /* TCP Segementation */ + ETH_TX_PACKETS_FEATURES_CRCPAD = ((uint32_t)0x00000020U), /* CRC Pad Control */ + ETH_TX_PACKETS_FEATURES_OSTC = ((uint32_t)0x00000040U) /* One-Step Timestamp Correction */ +} EthTxPackAttrType; + +typedef enum +{ + ETH_MACADDR_FILTER_SA = ((uint32_t)0x00000000U), + ETH_MACADDR_FILTER_DA = ((uint32_t)0x00000008U) +} EthMacAddrFilterType; + +typedef enum +{ + ETH_PREAMBLE_LEN_7BYTES = ((uint32_t)0x00000000U), + ETH_PREAMBLE_LEN_5BYTES = ((uint32_t)0x00000004U), + ETH_PREAMBLE_LEN_3BYTES = ((uint32_t)0x00000008U) +} EthTxPreLenType; + +typedef enum +{ + ETH_BACK_OFF_LIMIT_10 = ((uint32_t)0x00000000U), + ETH_BACK_OFF_LIMIT_8 = ((uint32_t)0x00000020U), + ETH_BACK_OFF_LIMIT_4 = ((uint32_t)0x00000040U), + ETH_BACK_OFF_LIMIT_1 = ((uint32_t)0x00000060U) +} EthBacOffLimType; + +typedef enum +{ + ETH_HALF_DUPLEX_MODE = ((uint32_t)0x00000000U), + ETH_FULL_DUPLEX_MODE = ((uint32_t)0x00002000U) +} EthDuplexType; + +typedef enum +{ + ETH_SPEED_1000M = ((uint32_t)0x00000000U), + ETH_SPEED_10M = ((uint32_t)0x00008000U), + ETH_SPEED_100M = ((uint32_t)0x0000C000U) +} EthSpeedType; + +typedef enum +{ + ETH_INTER_PACKET_GAP_96BIT = ((uint32_t)0x00000000U), + ETH_INTER_PACKET_GAP_88BIT = ((uint32_t)0x01000000U), + ETH_INTER_PACKET_GAP_80BIT = ((uint32_t)0x02000000U), + ETH_INTER_PACKET_GAP_72BIT = ((uint32_t)0x03000000U), + ETH_INTER_PACKET_GAP_64BIT = ((uint32_t)0x04000000U), + ETH_INTER_PACKET_GAP_56BIT = ((uint32_t)0x05000000U), + ETH_INTER_PACKET_GAP_48BIT = ((uint32_t)0x06000000U), + ETH_INTER_PACKET_GAP_40BIT = ((uint32_t)0x07000000U) +} EthIntPktGapType; + +typedef enum +{ + ETH_SRC_ADDR_CTRL_INTERNAL_SIGNALS = ((uint32_t)0x00000000U), /* The generation of the source address field is controlled by internal signals */ + ETH_SRC_ADDR_CTRL_INSERT_MACAR0 = ((uint32_t)0x20000000U), /* The Source Address field is inserted by the contents of the MAC Address 0 register */ + ETH_SRC_ADDR_CTRL_REPLACE_MACAR0 = ((uint32_t)0x30000000U), /* The Source Address field is replaced by the contents of the MAC Address 0 register */ + ETH_SRC_ADDR_CTRL_INSERT_MACAR1 = ((uint32_t)0x60000000U), /* The Source Address field is inserted by the contents of the MAC Address 1 register */ + ETH_SRC_ADDR_CTRL_REPLACE_MACAR1 = ((uint32_t)0x70000000U), /* The Source Address field is replaced by the contents of the MAC Address 1 register */ +} EthSrcAddrCtrlType; + +typedef enum +{ + ETH_CTRL_PACKETS_FLTR_ALL = ((uint32_t)0x00000000U), /* MAC filters all control packets from reaching the application */ + ETH_CTRL_PACKETS_FW_XCPT_PAU = ((uint32_t)0x00000040U), /* MAC forwards all control packets except Pause packets to the \ + application even if they fail the Address filter */ + ETH_CTRL_PACKETS_FW_ALL = ((uint32_t)0x00000080U), /* MAC forwards all control packets to the application even if \ + they fail the Address filter */ + ETH_CTRL_PACKETS_FW_PASS = ((uint32_t)0x000000C0U) /* MAC forwards the control packets that pass the Address filter */ +} EthCtrlPktType; + +typedef enum +{ + ETH_WDG_TIMEOUT_2KBYTES = ((uint32_t)0x00000000U), + ETH_WDG_TIMEOUT_3KBYTES = ((uint32_t)0x00000001U), + ETH_WDG_TIMEOUT_4KBYTES = ((uint32_t)0x00000002U), + ETH_WDG_TIMEOUT_5KBYTES = ((uint32_t)0x00000003U), + ETH_WDG_TIMEOUT_6KBYTES = ((uint32_t)0x00000004U), + ETH_WDG_TIMEOUT_7KBYTES = ((uint32_t)0x00000005U), + ETH_WDG_TIMEOUT_8KBYTES = ((uint32_t)0x00000006U), + ETH_WDG_TIMEOUT_9KBYTES = ((uint32_t)0x00000007U), + ETH_WDG_TIMEOUT_10KBYTES = ((uint32_t)0x00000008U), + ETH_WDG_TIMEOUT_11KBYTES = ((uint32_t)0x00000009U), + ETH_WDG_TIMEOUT_12KBYTES = ((uint32_t)0x0000000AU), + ETH_WDG_TIMEOUT_13KBYTES = ((uint32_t)0x0000000BU), + ETH_WDG_TIMEOUT_14KBYTES = ((uint32_t)0x0000000CU), + ETH_WDG_TIMEOUT_15KBYTES = ((uint32_t)0x0000000DU), + ETH_WDG_TIMEOUT_16KBYTES = ((uint32_t)0x0000000EU) +} EthWdgTimOutType; + +typedef enum +{ + ETH_PAUSE_LOW_THRESHOLD_PT4 = ((uint32_t)0x00000000U), /* Pause Time minus 4 Slot Times */ + ETH_PAUSE_LOW_THRESHOLD_PT28 = ((uint32_t)0x00000010U), /* Pause Time minus 28 Slot Times */ + ETH_PAUSE_LOW_THRESHOLD_PT36 = ((uint32_t)0x00000020U), /* Pause Time minus 36 Slot Times */ + ETH_PAUSE_LOW_THRESHOLD_PT144 = ((uint32_t)0x00000030U), /* Pause Time minus 144 Slot Times */ + ETH_PAUSE_LOW_THRESHOLD_PT256 = ((uint32_t)0x00000040U), /* Pause Time minus 256 Slot Times */ + ETH_PAUSE_LOW_THRESHOLD_PT512 = ((uint32_t)0x00000050U) /* Pause Time minus 512 Slot Times */ +} EthPauLowThdType; + +typedef enum +{ + ETH_TXQUEUE_OPERATE_THRESHOLD_32 = ((uint32_t)0x00000000U), /* Threshold Mode, level: 32Bytes */ + ETH_TXQUEUE_OPERATE_STOREFORWARD = ((uint32_t)0x00000002U), /* Store and Forward Mode */ + ETH_TXQUEUE_OPERATE_THRESHOLD_64 = ((uint32_t)0x00000010U), /* Threshold Mode, level: 64Bytes */ + ETH_TXQUEUE_OPERATE_THRESHOLD_96 = ((uint32_t)0x00000020U), /* Threshold Mode, level: 96Bytes */ + ETH_TXQUEUE_OPERATE_THRESHOLD_128 = ((uint32_t)0x00000030U), /* Threshold Mode, level: 128Bytes */ + ETH_TXQUEUE_OPERATE_THRESHOLD_192 = ((uint32_t)0x00000040U), /* Threshold Mode, level: 192Bytes */ + ETH_TXQUEUE_OPERATE_THRESHOLD_256 = ((uint32_t)0x00000050U), /* Threshold Mode, level: 256Bytes */ + ETH_TXQUEUE_OPERATE_THRESHOLD_384 = ((uint32_t)0x00000060U), /* Threshold Mode, level: 384Bytes */ + ETH_TXQUEUE_OPERATE_THRESHOLD_512 = ((uint32_t)0x00000070U) /* Threshold Mode, level: 512Bytes */ +} EthTxQOpeType; + +typedef enum +{ + ETH_RXQUEUE_OPERATE_THRESHOLD_64 = ((uint32_t)0x00000000U), /* Threshold Mode, level: 64Bytes */ + ETH_RXQUEUE_OPERATE_THRESHOLD_32 = ((uint32_t)0x00000001U), /* Threshold Mode, level: 32Bytes */ + ETH_RXQUEUE_OPERATE_THRESHOLD_96 = ((uint32_t)0x00000002U), /* Threshold Mode, level: 96Bytes */ + ETH_RXQUEUE_OPERATE_THRESHOLD_128 = ((uint32_t)0x00000003U), /* Threshold Mode, level: 128Bytes */ + ETH_RXQUEUE_OPERATE_STOREFORWARD = ((uint32_t)0x00000020U) /* Store and Forward Mode */ +} EthRxQOpeType; + +typedef enum +{ + ETH_DMA_ARBITRA_WRR_RX1_TX1 = ((uint32_t)0x00000000U), /* Weighted Round-Robin with Rx:Tx, Rx:Tx = 1:1 */ + ETH_DMA_ARBITRA_FP_RX = ((uint32_t)0x00000002U), /* Fixed Priority, Rx path has priority over Tx path */ + ETH_DMA_ARBITRA_WRR_TX1_RX1 = ((uint32_t)0x00000800U), /* Weighted Round-Robin with Tx:Rx, Tx:Rx = 1:1 */ + ETH_DMA_ARBITRA_FP_TX = ((uint32_t)0x00000802U), /* Fixed Priority, Tx path has priority over Rx path */ + ETH_DMA_ARBITRA_WRR_RX2_TX1 = ((uint32_t)0x00001000U), /* Weighted Round-Robin with Rx:Tx, Rx:Tx = 2:1 */ + ETH_DMA_ARBITRA_WRR_TX2_RX1 = ((uint32_t)0x00001800U), /* Weighted Round-Robin with Tx:Rx, Tx:Rx = 2:1 */ + ETH_DMA_ARBITRA_WRR_RX3_TX1 = ((uint32_t)0x00002000U), /* Weighted Round-Robin with Rx:Tx, Rx:Tx = 3:1 */ + ETH_DMA_ARBITRA_WRR_TX3_RX1 = ((uint32_t)0x00002800U), /* Weighted Round-Robin with Tx:Rx, Tx:Rx = 3:1 */ + ETH_DMA_ARBITRA_WRR_RX4_TX1 = ((uint32_t)0x00003000U), /* Weighted Round-Robin with Rx:Tx, Rx:Tx = 4:1 */ + ETH_DMA_ARBITRA_WRR_TX4_RX1 = ((uint32_t)0x00003800U), /* Weighted Round-Robin with Tx:Rx, Tx:Rx = 4:1 */ + ETH_DMA_ARBITRA_WRR_RX5_TX1 = ((uint32_t)0x00004000U), /* Weighted Round-Robin with Rx:Tx, Rx:Tx = 5:1 */ + ETH_DMA_ARBITRA_WRR_TX5_RX1 = ((uint32_t)0x00004800U), /* Weighted Round-Robin with Tx:Rx, Tx:Rx = 5:1 */ + ETH_DMA_ARBITRA_WRR_RX6_TX1 = ((uint32_t)0x00005000U), /* Weighted Round-Robin with Rx:Tx, Rx:Tx = 6:1 */ + ETH_DMA_ARBITRA_WRR_TX6_RX1 = ((uint32_t)0x00005800U), /* Weighted Round-Robin with Tx:Rx, Tx:Rx = 6:1 */ + ETH_DMA_ARBITRA_WRR_RX7_TX1 = ((uint32_t)0x00006000U), /* Weighted Round-Robin with Rx:Tx, Rx:Tx = 7:1 */ + ETH_DMA_ARBITRA_WRR_TX7_RX1 = ((uint32_t)0x00006800U), /* Weighted Round-Robin with Tx:Rx, Tx:Rx = 7:1 */ + ETH_DMA_ARBITRA_WRR_RX8_TX1 = ((uint32_t)0x00007000U), /* Weighted Round-Robin with Rx:Tx, Rx:Tx = 8:1 */ + ETH_DMA_ARBITRA_WRR_TX8_RX1 = ((uint32_t)0x00007800U) /* Weighted Round-Robin with Tx:Rx, Tx:Rx = 8:1 */ +} EthTxRxArbType; + +typedef enum +{ + ETH_BURST_MODE_UNFIXED = ((uint32_t)0x00000000U), /* Unspecified length (INCR) or SINGLE transfers */ + ETH_BURST_MODE_FIXED = ((uint32_t)0x00000001U), /* Specified length (INCRx or SINGLE) */ + ETH_BURST_MODE_MIXED = ((uint32_t)0x00004000U) /* Mixed Burst */ +} EthBurstType; + +typedef enum +{ + ETH_DESC_SKIP_LEN_0BIT = ((uint32_t)0x00000000U), + ETH_DESC_SKIP_LEN_32BIT = ((uint32_t)0x00040000U), + ETH_DESC_SKIP_LEN_64BIT = ((uint32_t)0x00080000U), + ETH_DESC_SKIP_LEN_96BIT = ((uint32_t)0x000C0000U), + ETH_DESC_SKIP_LEN_128BIT = ((uint32_t)0x00100000U), + ETH_DESC_SKIP_LEN_160BIT = ((uint32_t)0x00140000U), + ETH_DESC_SKIP_LEN_192BIT = ((uint32_t)0x00180000U), + ETH_DESC_SKIP_LEN_224BIT = ((uint32_t)0x001C0000U) +} EthDesSkiLenType; + +typedef enum +{ + ETH_TX_PROGRAM_BURST_LEN_1 = ((uint32_t)0x00010000U), + ETH_TX_PROGRAM_BURST_LEN_2 = ((uint32_t)0x00020000U), + ETH_TX_PROGRAM_BURST_LEN_4 = ((uint32_t)0x00040000U), + ETH_TX_PROGRAM_BURST_LEN_8 = ((uint32_t)0x00080000U), + ETH_TX_PROGRAM_BURST_LEN_16 = ((uint32_t)0x00100000U), + ETH_TX_PROGRAM_BURST_LEN_32 = ((uint32_t)0x00200000U) +} EthTxBurLenType; + +typedef enum +{ + ETH_RX_PROGRAM_BURST_LEN_1 = ((uint32_t)0x00010000U), + ETH_RX_PROGRAM_BURST_LEN_2 = ((uint32_t)0x00020000U), + ETH_RX_PROGRAM_BURST_LEN_4 = ((uint32_t)0x00040000U), + ETH_RX_PROGRAM_BURST_LEN_8 = ((uint32_t)0x00080000U), + ETH_RX_PROGRAM_BURST_LEN_16 = ((uint32_t)0x00100000U), + ETH_RX_PROGRAM_BURST_LEN_32 = ((uint32_t)0x00200000U) +} EthRxBurLenType; + +typedef enum +{ + ETH_VLANTAGRXSTRIPPING_NONE = ((uint32_t)0x00000000U), + ETH_VLANTAGRXSTRIPPING_IFPASS = ((uint32_t)0x00200000U), + ETH_VLANTAGRXSTRIPPING_IFFAILS = ((uint32_t)0x00400000U), + ETH_VLANTAGRXSTRIPPING_ALWAYS = ((uint32_t)0x00600000U) +} EthRxVlanStripType; + +typedef enum +{ + ETH_VLANTYPECHECK_CVLAN = ((uint32_t)0x00000000U), + ETH_VLANTYPECHECK_SVLAN = ((uint32_t)0x000C0000U), + ETH_VLANTYPECHECK_DISABLE = ((uint32_t)0x00100000U) +} EthVlanCheckType; + + + + +/** ETH initialize configuration structure definition **/ +typedef struct +{ + /******************* MAC Basic Configuration *******************/ + EthTxPreLenType TxPreambleLen; /* Configs the Preamble Length for Transmit packets */ + + uint32_t DeferralCheck; /* Enables or Disable Deferral check function in the half-duplex mode */ + + EthBacOffLimType BackOffLimit; /* Selects the Back-Off limit value in the half-duplex mode */ + + uint32_t DisTxRetry; /* Enables or Disable MAC retry transmission, when a collision occurs in Half Duplex mode */ + + uint32_t DisCSDuringTransmit; /* Enables or Disable Carrier Sense During Transmission in the half-duplex mode */ + + uint32_t DisRxOwn; /* Enables or Disable Receive Own in Half Duplex mode */ + + uint32_t CSBeforeTransmit; /* Enables or Disable Carrier Sense Before Transmission in the full-duplex mode */ + + uint32_t Loopback; /* Enables or Disable Loopback Mode */ + + EthDuplexType Duplex; /* Selects the Half-duplex or Full-duplex mode */ + + EthSpeedType SpeedSelect; /* Selects the speed mode: 10Mbps or 100Mbps or 1000Mbps, note ETH2 only 10Mbps or 100Mbps */ + + uint32_t JumboPacket; /* Enables or Disable Jumbo Packet */ + + uint32_t DisTxJabber; /* Enables or Disable Jabber timer on Tx path */ + + uint32_t PacketBurst; /* Enables or Disable Packet Burst in GMII half-duplex mode, ETH2 is not supported */ + + uint32_t DisRxWatchdog; /* Enables or Disable Watchdog timer on Rx path */ + + uint32_t AutoPadCRCStrip; /* Enables or Disable Automatic Pad or CRC Stripping function */ + + uint32_t CRCStripTypePacket; /* Enables or Disable CRC stripping for Type packets function */ + + uint32_t Support2KPacket; /* Enables or Disable IEEE 802.3as Support for 2K Packets function */ + + uint32_t GiantPacketSizeLimitCtrl; /* Enables or Disable Giant Packet Size Limit Control */ + + EthIntPktGapType InterPacketGapVal; /* Configs the minimum Inter-Packet Gap between packets during transmission */ + + uint32_t ChecksumOffload; /* Enables or Disable Checksum Offload function */ + + EthSrcAddrCtrlType SrcAddrCtrl; /* Selects the Source Address Insertion or Replacement Control */ + + uint32_t ARPOffload; /* Enables or Disable ARP Offload function */ + + /****************** MAC Extended Configuration ******************/ + uint32_t GiantPacketSizeLimit; /* Configs Giant Packet Size Limit value, If the received packet size is greater than the \ + value programmed in this field in units of bytes, the MAC declares the received packet \ + as Giant packet. This value must be ≥ 1518 bytes */ + + uint32_t DisRxPacketCRCCheck; /* Enables or Disable CRC Checking for Rx Packets */ + + uint32_t SPDetect; /* Enables or Disable Slow Protocol Detection */ + + uint32_t USPPacketDetect; /* Enables or Disable Unicast Slow Protocol Packet Detect */ + + uint32_t ExtInterPacketGap; /* Enables or Disable Extended Inter-Packet Gap */ + + uint32_t ExtInterPacketGapVal; /* Configs the minimum Inter-Packet Gap between packets during transmission */ + + uint32_t DropARPPacket; /* Enables or Disable ARP Packet Drop function if IP Address Mismatch */ + + /**************** MAC Packet Filter Configuration ***************/ + uint32_t Promiscuous; /* Enables or Disable Promiscuous Mode */ + + uint32_t HashUnicast; /* Enables or Disable Hash Unicast Filtering Mode */ + + uint32_t HashMulticast; /* Enables or Disable Hash Multicast Filtering Mode */ + + uint32_t DAInverseFiltering; /* Enables or Disable DA Inverse Filtering Mode */ + + uint32_t PassAllMulticast; /* Enables or Disable Pass All Multicast Mode */ + + uint32_t DisBroadcastPackets; /* Enables or Disable Broadcast Packets */ + + EthCtrlPktType PassControlPackets; /* Configs the forwarding of all control packets */ + + uint32_t SAInverseFiltering; /* Enables or Disable SA Inverse Filtering Mode */ + + uint32_t SAFilter; /* Enables or Disable SA Filter */ + + uint32_t HashOrPerfectFilter; /* Enables or Disable Hash or Perfect Filter */ + + uint32_t VLANTagFilter; /* Enables or Disable VLAN Tag Filter */ + + uint32_t Layer3Layer4Filter; /* Enables or Disable Layer 3 and Layer 4 Filter */ + + uint32_t DropNonTcpUdpPackets; /* Enables or Disable Drop Non-TCP/UDP over IP Packets */ + + uint32_t ReceiveAll; /* Enables or Disable Receive All mode */ + + /************** MAC Watchdog Timeout Configuration **************/ + EthWdgTimOutType WatchdogTimeout; /* Configs watchdog timeout for a received packet, if the length of a received packet \ + exceeds the value of this field, such packet is terminated and declared as an error \ + packet */ + + uint32_t ProgramWatchdog; /* Enables or Disable Programmable Watchdog function */ + + /**************** MAC Flow Control Configuration ****************/ + uint32_t TxFlowControl; /* Enables or Disable Transmit Flow Control function */ + + EthPauLowThdType PauseLowThreshold; /* Configs the threshold of the Pause timer */ + + uint32_t DisZeroQuantaPause; /* Enables or Disable Zero-Quanta Pause function */ + + uint32_t PauseTime; /* Configs the value to be used in the Pause Time field in the Tx control packet */ + + uint32_t RxFlowControl; /* Enables or Disable Receive Flow Control function */ + + uint32_t UPPacketDetect; /* Enables or Disable Unicast Pause Packet Detect */ + + /*********** MAC Transaction Layer (MTL) Configuration **********/ + EthTxQOpeType TxQueueOperateMode; /* Config Tx Store and Forward Mode or Threshold Mode and threshold level */ + + EthRxQOpeType RxQueueOperateMode; /* Configs Rx Store and Forward Mode or Threshold Mode and threshold level */ + + uint32_t ForwardUSGoodPacket; /* Enables or Disable Forward Undersized Good Packets function */ + + uint32_t ForwardErrorPacket; /* Enables or Disable Forward Error Packets function */ + + uint32_t DisDropTCPIPCSErrorPacket; /* Enables or Disable Dropping of TCP/IP Checksum Error Packets */ + + /****************** DMA Bus Mode Configuration ******************/ + EthTxRxArbType TxRxArbitration; /* Configs the arbitration scheme between the Tx and Rx paths of DMA */ + + uint32_t DescriptorCache; /* Enables or Disable Descriptor Cache function */ + + /*************** DMA System Bus Mode Configuration **************/ + EthBurstType BurstMode; /* Configs the AHB Master interface burst transfers */ + + uint32_t AddrAlignedBeats; /* Enables or Disable AHB Master interface address-aligned burst transfers on Read \ + and Write channels */ + + uint32_t RebuildINCRxBurst; /* Enables or Disable AHB Master to rebuild the pending beats of any initiated burst \ + transfer with INCRx and SINGLE transfers */ + + /******************* DMA Channel Configuration ******************/ + uint32_t MaxSegmentSize; /* Configs the maximum segment size that should be used while segmenting the packet \ + This parameter can be a value from 0x40 to 0x3FFF */ + + uint32_t PBLx8mode; /* Enables or Disable PBL multiplication by eight */ + + EthDesSkiLenType DescriptorSkipLen; /* Configs the Word number to skip between two unchained descriptors */ + + /************** DMA Channel Transmit Configuration **************/ + uint32_t OperateSecondPacket; /* Enables or Disable Operate on Second Packet mode, it instructs the DMA to process \ + the second packet of the Transmit data even before the status for the first packet \ + is obtained */ + + uint32_t TCPSegment; /* Enables or Disable TCP Segmentation function */ + + EthTxBurLenType TxBurstLength; /* Configs the maximum number of beats to be transferred in one DMA block data transfer */ + + uint32_t EarlyTxInterruptCtrl; /* Enables or Disable Early Transmit Interrupt function */ + + /*************** DMA Channel Receive Configuration ***************/ + EthRxBurLenType RxBurstLength; /* Configs the maximum number of beats to be transferred in one DMA block data transfer */ + + uint32_t EarlyRxInterruptCtrl; /* Enables or Disable Early Receive Interrupt function */ + + uint32_t RxPacketFlush; /* Enables or Disable Rx Packet Flush function */ + +} ETH_InitType; + +/** ETH Rx VLAN tag initialize configuration structure definition **/ +typedef struct +{ + uint32_t VLANTagHashTableMatch; /* Enables or Disables VLAN Tag Hash Table Match */ + + uint32_t VLANTagInStatus; /* Enables or Disables VLAN Tag in Rx status */ + + EthRxVlanStripType StripVLANTag; /* Sets the VLAN Tag Stripping on Receive */ + + EthVlanCheckType VLANTypeCheck; /* Enables or Disables VLAN Type Check */ + + uint32_t VLANTagInverceMatch; /* Enables or disables VLAN Tag Inverse Match */ + + uint32_t VLANTagComparison12Bit; /* Enables or disables 12-Bit VLAN Tag Comparison */ + +} ETH_RxVLANTagInitType; + +/** ETH DMA Descriptor structure definition **/ +typedef struct +{ + __IO uint32_t DESC0; + __IO uint32_t DESC1; + __IO uint32_t DESC2; + __IO uint32_t DESC3; + __IO uint32_t Buf1Addr; /* Used to backup rx buffer 1 address */ + __IO uint32_t Buf2Addr; /* Used to backup rx buffer 2 address */ +} ETH_DMADescType; + +/** ETH DMA Tx Descriptor List structure definition **/ +typedef struct +{ + uint32_t TxDesc[ETH_TX_DESC_NUMBER]; /* Tx DMA descriptors addresses */ + + uint32_t CurTxDesc; /* Current Tx descriptor index for packet transmission */ +} ETH_TxDescListType; + +/** ETH DMA Rx Descriptor List structure definition **/ +typedef struct +{ + uint32_t RxDesc[ETH_RX_DESC_NUMBER]; /* Rx DMA descriptors addresses */ + + uint32_t CurRxDesc; /* Current Rx descriptor, ready for next reception */ + + uint32_t FirstAppDesc; /* First descriptor of last received packet */ + + uint32_t AppDescNbr; /* Number of descriptors of last received packet */ + + uint32_t AppContextDesc; /* If 1 a context descriptor is present in last received packet + If 0 no context descriptor is present in last received packet */ + + uint32_t ItMode; /* If 1, DMA will generate the Rx complete interrupt + If 0, DMA will not generate the Rx complete interrupt */ +} ETH_RxDescListType; + +/** ETH Buffers List structure definition **/ +typedef struct __ETH_BufferType +{ + uint8_t* pBuf; /* buffer address */ + + uint32_t Len; /* buffer length */ + + struct __ETH_BufferType* pNext; /* Pointer to the next buffer in the list */ +} ETH_BufferType; + +/** ETH Transmit Packet structure definition **/ +typedef struct +{ + uint32_t Attributes; /* Tx packet HW features capabilities + This parameter can be a combination of EthTxPackAttrType */ + + ETH_BufferType* pTxBuffer; /* Tx buffers pointers */ + + uint32_t Length; /* Total packet length */ + + uint32_t SAInsertCtrl; /* Source address insertion control */ + + uint32_t CRCPadCtrl; /* Specifies the CRC and Pad insertion and replacement control */ + + uint32_t ChecksumCtrl; /* Specifies the checksum insertion control */ + + uint32_t VlanTag; /* Sets VLAN Tag only when VLAN is enabled */ +} ETH_TxPacketType; + +/** ETH Received Packet structure definition **/ +typedef struct +{ + uint32_t DescriptorCnt; /* Number of Rx Descriptors */ + + uint32_t VlanTag; /* Vlan Tag value */ + + uint32_t Checksum; /* Rx Checksum status */ + + uint32_t HeaderType; /* IP header type */ + + uint32_t PayloadType; /* Payload type */ + + uint32_t MACFilterStatus; /* MAC filter status */ + + uint32_t ErrorCode; /* Rx error code */ +} ETH_RxPacketType; + +/** Function prototype for phy get link status functions. +*\*\param addr PHY port address +*\*\param reg PHY register address +*\*\return Acquired PHY link state value containing speed core duplex mode +**/ +typedef uint16_t (*phyGetLinkStatus_fn)(uint16_t addr, uint16_t reg); + +/** ETH External PHY information definition **/ +typedef struct +{ + uint16_t phyAddr; /* PHY address, value 0~31 */ + + uint16_t bcRegAddr; /* PHY Basic Control Register */ + + uint16_t bsRegAddr; /* PHY Basic Status Register */ + + uint16_t sdRegAddr; /* Address of the status register indicating speed and duplex mode in auto-negotiation mode */ + + uint16_t phyReset; /* PHY Reset */ + + // uint16_t phyLoopback; /* Select PHY's loop-back mode */ + + uint16_t phyMode; /* Set PHY's duplex and speed mode */ + + uint16_t phyAutoNeg; /* Enable PHY's auto-negotiation function */ + + uint16_t phyAutoNegOK; /* Auto-negotiation completed */ + + uint16_t phyLinkOK; /* Valid link established */ + + uint16_t phyDuplexMask; /* PHY Duplex mask */ + + uint16_t phySpeedMask; /* PHY Speed mask */ + + phyGetLinkStatus_fn phyGetLinkStatus; +} ETH_PHYInfoType; + +/** ETH module information definition **/ +typedef struct +{ + EthMediaInterfaceType MediaInterface; /* Selects the interface where the MAC is connected to the PHY */ + + FunctionalStatus AutoNegCmd; /* Enables or Disables the AutoNegotiation mode for the external PHY */ + + FunctionalStatus PPSOutCmd; /* Enables or Disables the PPS out operations */ + + FunctionalStatus PMTCmd; /* Enables or Disables the PMT (MAC Magic Packet/Remote Wake-Up Packet) */ + + FunctionalStatus LPICmd; /* Enables or Disables the LPI (Low-power interface, EEE mode) */ + + EthMdcClkType MDCClockMode; /* Selects the MDC clock range from 1.0M to 2.5M or greater than 2.5M */ + + uint32_t CSRClkDiv; /* Provides the CSR clock division factor used to calculate the MDC clock. + Available only when the MDC clock range is greater than 2.5M */ + + uint8_t* pMACAddr; /* MAC Address of used Hardware: must be pointer on an array of 6 bytes */ + + ETH_DMADescType* pTxDesc; /* Provides the address of the first DMA Tx descriptor in the list */ + + ETH_DMADescType* pRxDesc; /* Provides the address of the first DMA Rx descriptor in the list */ + + uint32_t RxBuffLen; /* Provides the length of Rx buffers size */ + + ETH_TxDescListType TxDescList; /* Holds all Tx descriptors list addresses and current descriptor index */ + + ETH_RxDescListType RxDescList; /* Holds all Rx descriptors list addresses and current descriptor index */ + + ETH_PHYInfoType PHYInfo; /* Provides information related to PHY initialization and some status information */ + +} ETH_InfoType; + + +/*** ETH Structure Definition End ***/ + + +/*** ETH Macro Definition Start ***/ + +/** ETH register bit field mask definition **/ +#define ETH_REG_BIT_FIELD_MASK ((uint32_t)0x00000000U) + +/** ETH Link speed duplex definition **/ +#define ETH_LINK_10FULL ((uint32_t)0x00000001U) +#define ETH_LINK_10HALF ((uint32_t)0x00000002U) +#define ETH_LINK_100FULL ((uint32_t)0x00000004U) +#define ETH_LINK_100HALF ((uint32_t)0x00000008U) +#define ETH_LINK_1000FULL ((uint32_t)0x00000010U) +#define ETH_LINK_1000HALF ((uint32_t)0x00000020U) + +/** ETH MAC Interrupt flag definition **/ +#define ETH_MAC_INT_FLAG_PHY ((uint32_t)(ETH_MACINTSTS_PHYIS)) +#define ETH_MAC_INT_FLAG_PMT ((uint32_t)(ETH_MACINTSTS_PMTIS)) +#define ETH_MAC_INT_FLAG_MMCRX ((uint32_t)(ETH_MACINTSTS_MMCIS \ + | ETH_MACINTSTS_MMCRXIS)) +#define ETH_MAC_INT_FLAG_MMCTX ((uint32_t)(ETH_MACINTSTS_MMCIS \ + | ETH_MACINTSTS_MMCTXIS)) +#define ETH_MAC_INT_FLAG_TS ((uint32_t)(ETH_MACINTSTS_TSIS)) +#define ETH_MAC_INT_FLAG_TX ((uint32_t)(ETH_MACINTSTS_TXSTSIS)) +#define ETH_MAC_INT_FLAG_RX ((uint32_t)(ETH_MACINTSTS_RXSTSIS)) +#define ETH_MAC_INT_FLAG_MDIO ((uint32_t)(ETH_MACINTSTS_MDIOIS)) + +/** ETH MAC Interrupt definition **/ +#define ETH_MAC_INT_PHY ((uint32_t)ETH_MACINTEN_PHYIE) +#define ETH_MAC_INT_PMT ((uint32_t)ETH_MACINTEN_PMTIE) +#define ETH_MAC_INT_TS ((uint32_t)ETH_MACINTEN_TSIE) +#define ETH_MAC_INT_TX ((uint32_t)ETH_MACINTEN_TXSTSIE) +#define ETH_MAC_INT_RX ((uint32_t)ETH_MACINTEN_RXSTSIE) +#define ETH_MAC_INT_MDIO ((uint32_t)ETH_MACINTEN_MDIOIE) + +/** ETH MAC TX-RX flag definition **/ +#define ETH_MACTX_FLAG_TJT ((uint32_t)ETH_MACRXTXSTS_TJT) +#define ETH_MACTX_FLAG_NCARR ((uint32_t)ETH_MACRXTXSTS_NCARR) +#define ETH_MACTX_FLAG_LCARR ((uint32_t)ETH_MACRXTXSTS_LCARR) +#define ETH_MACTX_FLAG_EXDEF ((uint32_t)ETH_MACRXTXSTS_EXDEF) +#define ETH_MACTX_FLAG_LCOL ((uint32_t)ETH_MACRXTXSTS_LCOL) +#define ETH_MACTX_FLAG_EXCOL ((uint32_t)ETH_MACRXTXSTS_EXCOL) +#define ETH_MACRX_FLAG_RWT ((uint32_t)ETH_MACRXTXSTS_RWT) + +/** ETH PMT flag definition **/ +#define ETH_PMT_FLAG_WUPFRPR ((uint32_t)ETH_MACPMTCTRLSTS_RWKFILTRST) /* Remote Wake-Up Packet Filter Register Pointer Reset */ +#define ETH_PMT_FLAG_WUPR ((uint32_t)ETH_MACPMTCTRLSTS_RWKPRCVD) /* Remote Wake-Up Packet Received */ +#define ETH_PMT_FLAG_MPR ((uint32_t)ETH_MACPMTCTRLSTS_MGKPRCVD) /* Magic Packet Received */ + +/** ETH MDC clock frequency definition **/ +#define ETH_MACMDIOADDR_CR_MASK ((uint32_t)(ETH_MACMDIOADDR_CR)) +#define ETH_MDCNCLK_CRSCLK_DIV42 ((uint32_t)(ETH_MACMDIOADDR_CR_0 \ + & ETH_MACMDIOADDR_CR_1 \ + & ETH_MACMDIOADDR_CR_2 \ + & ETH_MACMDIOADDR_CR_3)) +#define ETH_MDCNCLK_CRSCLK_DIV62 ((uint32_t)(ETH_MACMDIOADDR_CR_0)) +#define ETH_MDCNCLK_CRSCLK_DIV16 ((uint32_t)(ETH_MACMDIOADDR_CR_1)) +#define ETH_MDCNCLK_CRSCLK_DIV26 ((uint32_t)(ETH_MACMDIOADDR_CR_0 \ + | ETH_MACMDIOADDR_CR_1)) +#define ETH_MDCNCLK_CRSCLK_DIV102 ((uint32_t)(ETH_MACMDIOADDR_CR_2)) +#define ETH_MDCNCLK_CRSCLK_DIV124 ((uint32_t)(ETH_MACMDIOADDR_CR_0 \ + | ETH_MACMDIOADDR_CR_2)) +#define ETH_MDCNCLK_CRSCLK_DIV204 ((uint32_t)(ETH_MACMDIOADDR_CR_1 \ + | ETH_MACMDIOADDR_CR_2)) +#define ETH_MDCNCLK_CRSCLK_DIV324 ((uint32_t)(ETH_MACMDIOADDR_CR_0 \ + | ETH_MACMDIOADDR_CR_1 \ + | ETH_MACMDIOADDR_CR_2)) + +#define ETH_MDCFCLK_CRSCLK_DIV4 ((uint32_t)(ETH_MACMDIOADDR_CR_3)) +#define ETH_MDCFCLK_CRSCLK_DIV6 ((uint32_t)(ETH_MACMDIOADDR_CR_0 \ + | ETH_MACMDIOADDR_CR_3)) +#define ETH_MDCFCLK_CRSCLK_DIV8 ((uint32_t)(ETH_MACMDIOADDR_CR_1 \ + | ETH_MACMDIOADDR_CR_3)) +#define ETH_MDCFCLK_CRSCLK_DIV10 ((uint32_t)(ETH_MACMDIOADDR_CR_0 \ + | ETH_MACMDIOADDR_CR_1 \ + | ETH_MACMDIOADDR_CR_3)) +#define ETH_MDCFCLK_CRSCLK_DIV12 ((uint32_t)(ETH_MACMDIOADDR_CR_2 \ + | ETH_MACMDIOADDR_CR_3)) +#define ETH_MDCFCLK_CRSCLK_DIV14 ((uint32_t)(ETH_MACMDIOADDR_CR_0 \ + | ETH_MACMDIOADDR_CR_2 \ + | ETH_MACMDIOADDR_CR_3)) +#define ETH_MDCFCLK_CRSCLK_DIV16 ((uint32_t)(ETH_MACMDIOADDR_CR_1 \ + | ETH_MACMDIOADDR_CR_2 \ + | ETH_MACMDIOADDR_CR_3)) +#define ETH_MDCFCLK_CRSCLK_DIV18 ((uint32_t)(ETH_MACMDIOADDR_CR_0 \ + | ETH_MACMDIOADDR_CR_1 \ + | ETH_MACMDIOADDR_CR_2 \ + | ETH_MACMDIOADDR_CR_3)) + +/** ETH MAC Address Filter Mask Bytes definition **/ +#define ETH_MACADDR_MASK_MBC ((uint32_t)ETH_MACADDR1H_MBC) +#define ETH_MACADDR_MASK_BYTE1 ((uint32_t)ETH_MACADDR1H_MBC_0) /* Mask MAC Address low reg bits [7:0] */ +#define ETH_MACADDR_MASK_BYTE2 ((uint32_t)ETH_MACADDR1H_MBC_1) /* Mask MAC Address low reg bits [15:8] */ +#define ETH_MACADDR_MASK_BYTE3 ((uint32_t)ETH_MACADDR1H_MBC_2) /* Mask MAC Address low reg bits [23:16] */ +#define ETH_MACADDR_MASK_BYTE4 ((uint32_t)ETH_MACADDR1H_MBC_3) /* Mask MAC Address low reg bits [31:24] */ +#define ETH_MACADDR_MASK_BYTE5 ((uint32_t)ETH_MACADDR1H_MBC_4) /* Mask MAC Address high reg bits [7:0] */ +#define ETH_MACADDR_MASK_BYTE6 ((uint32_t)ETH_MACADDR1H_MBC_5) /* Mask MAC Address high reg bits [15:8] */ + +/** ETH MAC Timestamp update method definition **/ +#define ETH_MACTS_FINE_UPDATE ((uint32_t)ETH_MACTSCTRL_TSCFUPDT) /* Fine Update method */ +#define ETH_MACTS_COARSE_UPDATE ((uint32_t)ETH_REG_BIT_FIELD_MASK) /* Coarse Update method */ + +/** ETH MAC PTP Packet Type definition **/ +#define ETH_MACPTP_TYPE_VERSION2 ((uint32_t)ETH_MACTSCTRL_TSVER2ENA) +#define ETH_MACPTP_TYPE_ETHERNET ((uint32_t)ETH_MACTSCTRL_TSIPENA) +#define ETH_MACPTP_TYPE_IPV6UDP ((uint32_t)ETH_MACTSCTRL_TSIPV6ENA) +#define ETH_MACPTP_TYPE_IPV4UDP ((uint32_t)ETH_MACTSCTRL_TSIPV4ENA) + +/** ETH MAC TimeStamp update calculation mode definition **/ +#define ETH_MACTS_CALMODE_SUB ((uint32_t)ETH_MACSYSTNSUP_ADDSUB) /* Subtract Time */ +#define ETH_MACTS_CALMODE_ADD ((uint32_t)ETH_REG_BIT_FIELD_MASK) /* Add Time */ + +/** ETH MAC PPS Frequency Control definition **/ +#define ETH_MACPPS_FREQCTRL_B2D1 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_0)) /* Binary rollover is 2 Hz, Digital rollover is 1 Hz */ +#define ETH_MACPPS_FREQCTRL_B4D2 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_1)) /* Binary rollover is 4 Hz, Digital rollover is 2 Hz */ +#define ETH_MACPPS_FREQCTRL_B8D4 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_0 \ + | ETH_MACPPSCTRL_PPSCTRL_1)) /* Binary rollover is 8 Hz, Digital rollover is 4 Hz */ +#define ETH_MACPPS_FREQCTRL_B16D8 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_2)) /* Binary rollover is 16 Hz, Digital rollover is 8 Hz */ +#define ETH_MACPPS_FREQCTRL_B32D16 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_0 \ + | ETH_MACPPSCTRL_PPSCTRL_2)) /* Binary rollover is 32 Hz, Digital rollover is 16 Hz */ +#define ETH_MACPPS_FREQCTRL_B64D32 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_1 \ + | ETH_MACPPSCTRL_PPSCTRL_2)) /* Binary rollover is 64 Hz, Digital rollover is 32 Hz */ +#define ETH_MACPPS_FREQCTRL_B128D64 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_0 \ + | ETH_MACPPSCTRL_PPSCTRL_1 \ + | ETH_MACPPSCTRL_PPSCTRL_2)) /* Binary rollover is 128 Hz, Digital rollover is 64 Hz */ +#define ETH_MACPPS_FREQCTRL_B256D128 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_3)) /* Binary rollover is 256 Hz, Digital rollover is 128 Hz */ +#define ETH_MACPPS_FREQCTRL_B512D256 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_0 \ + | ETH_MACPPSCTRL_PPSCTRL_3)) /* Binary rollover is 512 Hz, Digital rollover is 256 Hz */ +#define ETH_MACPPS_FREQCTRL_B1024D512 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_1 \ + | ETH_MACPPSCTRL_PPSCTRL_3)) /* Binary rollover is 1024 Hz, Digital rollover is 512 Hz */ +#define ETH_MACPPS_FREQCTRL_B2048D1024 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_0 \ + | ETH_MACPPSCTRL_PPSCTRL_1 \ + | ETH_MACPPSCTRL_PPSCTRL_3)) /* Binary rollover is 2048 Hz, Digital rollover is 1024 Hz */ +#define ETH_MACPPS_FREQCTRL_B4096D2048 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_2 \ + | ETH_MACPPSCTRL_PPSCTRL_3)) /* Binary rollover is 4096 Hz, Digital rollover is 2048 Hz */ +#define ETH_MACPPS_FREQCTRL_B8192D4096 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_0 \ + | ETH_MACPPSCTRL_PPSCTRL_2 \ + | ETH_MACPPSCTRL_PPSCTRL_3)) /* Binary rollover is 8192 Hz, Digital rollover is 4096 Hz */ +#define ETH_MACPPS_FREQCTRL_B16384D8192 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_1 \ + | ETH_MACPPSCTRL_PPSCTRL_2 \ + | ETH_MACPPSCTRL_PPSCTRL_3)) /* Binary rollover is 16384 Hz, Digital rollover is 8192 Hz */ +#define ETH_MACPPS_FREQCTRL_B32768D16384 ((uint32_t)(ETH_MACPPSCTRL_PPSCTRL_0 \ + | ETH_MACPPSCTRL_PPSCTRL_1 \ + | ETH_MACPPSCTRL_PPSCTRL_2 \ + | ETH_MACPPSCTRL_PPSCTRL_3)) /* Binary rollover is 32768 Hz, Digital rollover is 16384 Hz */ + + +/** ETH MMC RX Interrupt flag definition **/ +#define ETH_MMCRX_INT_FLAG_BCGPIS ((uint32_t)ETH_MMCRXINT_RXBCGPIS) +#define ETH_MMCRX_INT_FLAG_MCGPIS ((uint32_t)ETH_MMCRXINT_RXMCGPIS) +#define ETH_MMCRX_INT_FLAG_CRCERPIS ((uint32_t)ETH_MMCRXINT_RXCRCERPIS) +#define ETH_MMCRX_INT_FLAG_ALGNERPIS ((uint32_t)ETH_MMCRXINT_RXALGNERPIS) +#define ETH_MMCRX_INT_FLAG_UCGPIS ((uint32_t)ETH_MMCRXINT_RXUCGPIS) + +/** ETH MMC TX Interrupt flag definition **/ +#define ETH_MMCTX_INT_FLAG_SCOLGPIS ((uint32_t)ETH_MMCTXINT_TXSCOLGPIS) +#define ETH_MMCTX_INT_FLAG_MCOLGPIS ((uint32_t)ETH_MMCTXINT_TXMCOLGPIS) +#define ETH_MMCTX_INT_FLAG_GPKTIS ((uint32_t)ETH_MMCTXINT_TXGPKTIS) + +/** ETH MMC RX Interrupt definition **/ +#define ETH_MMCRX_INT_BCGPIM ((uint32_t)ETH_MMCRXINTMSK_RXBCGPIM) +#define ETH_MMCRX_INT_MCGPIM ((uint32_t)ETH_MMCRXINTMSK_RXMCGPIM) +#define ETH_MMCRX_INT_CRCERPIM ((uint32_t)ETH_MMCRXINTMSK_RXCRCERPIM) +#define ETH_MMCRX_INT_ALGNERPIM ((uint32_t)ETH_MMCRXINTMSK_RXALGNERPIM) +#define ETH_MMCRX_INT_UCGPIM ((uint32_t)ETH_MMCRXINTMSK_RXUCGPIM) + +/** ETH MMC TX Interrupt definition **/ +#define ETH_MMCTX_INT_SCOLGPIM ((uint32_t)ETH_MMCTXINTMSK_TXSCOLGPIM) +#define ETH_MMCTX_INT_MCOLGPIM ((uint32_t)ETH_MMCTXINTMSK_TXMCOLGPIM) +#define ETH_MMCTX_INT_GPKTIM ((uint32_t)ETH_MMCTXINTMSK_TXGPKTIM) + +/** ETH MAC TimeStamp flag definition **/ +#define ETH_MACTS_FLAG_SOVF ((uint32_t)ETH_MACTSSTS_TSSOVF) /* Seconds Overflow flag */ +#define ETH_MACTS_FLAG_TARGT0 ((uint32_t)ETH_MACTSSTS_TSTARGT0) /* Target Time Reached flag */ +#define ETH_MACTS_FLAG_TRGTERR0 ((uint32_t)ETH_MACTSSTS_TSTRGTERR0) /* Target Time Error flag */ +#define ETH_MACTS_FLAG_TXTSSIS ((uint32_t)ETH_MACTSSTS_TXTSSIS) /* Tx Timestamp Status Interrupt Status flag */ + + + +/** ETH MTL Interrupt flag definition **/ +#define ETH_MTL_INT_FLAG_Q0IS ((uint32_t)ETH_MTLINTSTS_Q0IS) + +/** ETH MTL Queue Interrupt definition **/ +#define ETH_MTLTXQUEUE_INT_UIE ((uint32_t)ETH_MTLQINTCTRLSTS_TXUIE) /* Transmit Queue Underflow Interrupt */ +#define ETH_MTLRXQUEUE_INT_OIE ((uint32_t)ETH_MTLQINTCTRLSTS_RXOIE) /* Receive Queue Overflow Interrupt */ + +/** ETH MTL Queue Interrupt flag definition **/ +#define ETH_MTLTXQUEUE_INT_FLAG_UNFIS ((uint32_t)ETH_MTLQINTCTRLSTS_TXUNFIS) /* Transmit Queue Underflow Interrupt Flag */ +#define ETH_MTLRXQUEUE_INT_FLAG_OVFIS ((uint32_t)ETH_MTLQINTCTRLSTS_RXOVFIS) /* Receive Queue Overflow Interrupt Flag */ + +/** ETH MTL Counter flag definition **/ +#define ETH_MTLCOUNTER_FLAG_UFCNTOVF ((uint32_t)ETH_MTLTXQUDF_UFCNTOVF) /* Underflow Packet Counter Overflow Flag */ +#define ETH_MTLCOUNTER_FLAG_OVFCNTOVF ((uint32_t)ETH_MTLRXQMPOFCNT_OVFCNTOVF) /* Overflow Packet Counter Overflow Flag */ +#define ETH_MTLCOUNTER_FLAG_MISCNTOVF ((uint32_t)ETH_MTLRXQMPOFCNT_MISCNTOVF) /* Missed Packet Counter Overflow Flag */ + +/** ETH MTL Queue Status definition **/ +#define ETH_TRCSTS_MASK ((uint32_t)(ETH_MTLTXQDBG_TRCSTS)) +#define ETH_MTLTXQSTS_IDLE ((uint32_t)(ETH_MTLTXQDBG_TRCSTS_0 \ + & ETH_MTLTXQDBG_TRCSTS_1)) +#define ETH_MTLTXQSTS_READ ((uint32_t)(ETH_MTLTXQDBG_TRCSTS_0)) +#define ETH_MTLTXQSTS_WAIT ((uint32_t)(ETH_MTLTXQDBG_TRCSTS_1)) +#define ETH_MTLTXQSTS_FLUSH ((uint32_t)(ETH_MTLTXQDBG_TRCSTS_0 \ + | ETH_MTLTXQDBG_TRCSTS_1)) +#define ETH_MTLTXQSTS_NOT_EMPTY ((uint32_t)(ETH_MTLTXQDBG_TXQSTS)) + +#define ETH_RRCSTS_MASK ((uint32_t)(ETH_MTLRXQDBG_RRCSTS)) +#define ETH_MTLRXQSTS_IDLE ((uint32_t)(ETH_MTLRXQDBG_RRCSTS_0 \ + & ETH_MTLRXQDBG_RRCSTS_1)) +#define ETH_MTLRXQSTS_READ_DATA ((uint32_t)(ETH_MTLRXQDBG_RRCSTS_0)) /* Reading packet data */ +#define ETH_MTLRXQSTS_READ_STS ((uint32_t)(ETH_MTLRXQDBG_RRCSTS_1)) /* Reading packet status (or timestamp) */ +#define ETH_MTLRXQSTS_FLUSH ((uint32_t)(ETH_MTLRXQDBG_RRCSTS_0 \ + | ETH_MTLRXQDBG_RRCSTS_1)) /* Flushing the packet data and status */ + +#define ETH_RXQSTS_MASK ((uint32_t)(ETH_MTLRXQDBG_RXQSTS)) +#define ETH_MTLRXQSTS_EMPTY ((uint32_t)(ETH_MTLRXQDBG_RXQSTS_0 \ + & ETH_MTLRXQDBG_RXQSTS_1)) /* Rx Queue empty */ +#define ETH_MTLRXQSTS_BLW_THR ((uint32_t)(ETH_MTLRXQDBG_RXQSTS_0)) /* Rx Queue fill-level below flow-control deactivate threshold */ +#define ETH_MTLRXQSTS_ABV_THR ((uint32_t)(ETH_MTLRXQDBG_RXQSTS_1)) /* Rx Queue fill-level above flow-control activate threshold */ +#define ETH_MTLRXQSTS_FULL ((uint32_t)(ETH_MTLRXQDBG_RXQSTS_0 \ + | ETH_MTLRXQDBG_RXQSTS_1)) /* Rx Queue full */ + +#define ETH_MTLRXQSTS_PACK_NBR ((uint32_t)(ETH_MTLRXQDBG_PRXQ)) + +/** ETH DMA Interrupt flag definition **/ +#define ETH_DMA_INT_FLAG_DMACH0 ((uint32_t)ETH_DMAINTSTS_DC0IS) +#define ETH_DMA_INT_FLAG_MTL ((uint32_t)ETH_DMAINTSTS_MTLIS) +#define ETH_DMA_INT_FLAG_MAC ((uint32_t)ETH_DMAINTSTS_MACIS) + +/** ETH DMA channel 0 transmit process flag definition **/ +#define ETH_DMACH0_TXPRO_FLAG_STOP ((uint32_t)(ETH_DMADBGSTS_TPS0_0 \ + & ETH_DMADBGSTS_TPS0_1 \ + & ETH_DMADBGSTS_TPS0_2 \ + & ETH_DMADBGSTS_TPS0_3)) /* Stopped (Reset or Stop Transmit Command issued) */ +#define ETH_DMACH0_TXPRO_FLAG_RUN_FTTD ((uint32_t)(ETH_DMADBGSTS_TPS0_0)) /* Running (Fetching Tx Transfer Descriptor) */ +#define ETH_DMACH0_TXPRO_FLAG_RUN_WS ((uint32_t)(ETH_DMADBGSTS_TPS0_1)) /* Running (Waiting for status) */ +#define ETH_DMACH0_TXPRO_FLAG_RUN_RDS ((uint32_t)(ETH_DMADBGSTS_TPS0_0 \ + | ETH_DMADBGSTS_TPS0_1)) /* Running (Reading Data from system memory buffer and queuing it to the Tx buffer (Tx FIFO)) */ +#define ETH_DMACH0_TXPRO_FLAG_TSTMP_WS ((uint32_t)(ETH_DMADBGSTS_TPS0_2)) /* Timestamp write status */ +#define ETH_DMACH0_TXPRO_FLAG_SUSPND ((uint32_t)(ETH_DMADBGSTS_TPS0_1 \ + | ETH_DMADBGSTS_TPS0_2)) /* Suspended (Tx Descriptor Unavailable or Tx Buffer Underflow) */ +#define ETH_DMACH0_TXPRO_FLAG_RUN_CTD ((uint32_t)(ETH_DMADBGSTS_TPS0_0 \ + | ETH_DMADBGSTS_TPS0_1 \ + | ETH_DMADBGSTS_TPS0_2)) /* Running (Closing Tx Descriptor) */ + +/** ETH DMA channel 0 receive process flag definition **/ +#define ETH_DMACH0_RXPRO_FLAG_STOP ((uint32_t)(ETH_DMADBGSTS_RPS0_0 \ + & ETH_DMADBGSTS_RPS0_1 \ + & ETH_DMADBGSTS_RPS0_2 \ + & ETH_DMADBGSTS_RPS0_3)) /* Stopped (Reset or Stop Receive Command issued) */ +#define ETH_DMACH0_RXPRO_FLAG_RUN_FTTD ((uint32_t)(ETH_DMADBGSTS_RPS0_0)) /* Running (Fetching Rx Transfer Descriptor) */ +#define ETH_DMACH0_RXPRO_FLAG_RUN_WRP ((uint32_t)(ETH_DMADBGSTS_RPS0_0 \ + | ETH_DMADBGSTS_RPS0_1)) /* Running (Waiting for Rx packet) */ +#define ETH_DMACH0_RXPRO_FLAG_SUSPND ((uint32_t)(ETH_DMADBGSTS_RPS0_2)) /* Suspended (Rx Descriptor Unavailable) */ +#define ETH_DMACH0_RXPRO_FLAG_RUN_CRD ((uint32_t)(ETH_DMADBGSTS_RPS0_0 \ + | ETH_DMADBGSTS_RPS0_2)) /* Running (Closing the Rx Descriptor) */ +#define ETH_DMACH0_RXPRO_FLAG_TSTMP ((uint32_t)(ETH_DMADBGSTS_RPS0_1 \ + | ETH_DMADBGSTS_RPS0_2)) /* Timestamp write status */ +#define ETH_DMACH0_RXPRO_FLAG_RUN_TRP ((uint32_t)(ETH_DMADBGSTS_RPS0_0 \ + | ETH_DMADBGSTS_RPS0_1 \ + | ETH_DMADBGSTS_RPS0_2)) /* Running (Transferring the received packet data from the Rx buffer to the system memory) */ + +/** ETH DMA channel 0 Interrupt definition **/ +#define ETH_DMACH0_INT_TI ((uint32_t)ETH_DMACH0INTEN_TIE) +#define ETH_DMACH0_INT_TPS ((uint32_t)ETH_DMACH0INTEN_TXSE) +#define ETH_DMACH0_INT_TBU ((uint32_t)ETH_DMACH0INTEN_TBUE) +#define ETH_DMACH0_INT_RI ((uint32_t)ETH_DMACH0INTEN_RIE) +#define ETH_DMACH0_INT_RBU ((uint32_t)ETH_DMACH0INTEN_RBUE) +#define ETH_DMACH0_INT_RPS ((uint32_t)ETH_DMACH0INTEN_RSE) +#define ETH_DMACH0_INT_RWT ((uint32_t)ETH_DMACH0INTEN_RWTE) +#define ETH_DMACH0_INT_ETI ((uint32_t)ETH_DMACH0INTEN_ETIE) +#define ETH_DMACH0_INT_ERI ((uint32_t)ETH_DMACH0INTEN_ERIE) +#define ETH_DMACH0_INT_FBE ((uint32_t)ETH_DMACH0INTEN_FBEE) +#define ETH_DMACH0_INT_CDE ((uint32_t)ETH_DMACH0INTEN_CDEE) +#define ETH_DMACH0_INT_AIS ((uint32_t)ETH_DMACH0INTEN_AIE) +#define ETH_DMACH0_INT_NIS ((uint32_t)ETH_DMACH0INTEN_NIE) + +/** ETH DMA channel 0 flag definition **/ +#define ETH_DMACH0_FLAG_TI ((uint32_t)ETH_DMACH0STS_TI) +#define ETH_DMACH0_FLAG_TPS ((uint32_t)ETH_DMACH0STS_TPS) +#define ETH_DMACH0_FLAG_TBU ((uint32_t)ETH_DMACH0STS_TBU) +#define ETH_DMACH0_FLAG_RI ((uint32_t)ETH_DMACH0STS_RI) +#define ETH_DMACH0_FLAG_RBU ((uint32_t)ETH_DMACH0STS_RBU) +#define ETH_DMACH0_FLAG_RPS ((uint32_t)ETH_DMACH0STS_RPS) +#define ETH_DMACH0_FLAG_RWT ((uint32_t)ETH_DMACH0STS_RWT) +#define ETH_DMACH0_FLAG_ETI ((uint32_t)ETH_DMACH0STS_ETI) +#define ETH_DMACH0_FLAG_ERI ((uint32_t)ETH_DMACH0STS_ERI) +#define ETH_DMACH0_FLAG_FBE ((uint32_t)ETH_DMACH0STS_FBE) +#define ETH_DMACH0_FLAG_CDE ((uint32_t)ETH_DMACH0STS_CDE) +#define ETH_DMACH0_FLAG_AIS ((uint32_t)ETH_DMACH0STS_AIS) +#define ETH_DMACH0_FLAG_NIS ((uint32_t)ETH_DMACH0STS_NIS) + +/** ETH DMA channel 0 Interrupt flag definition **/ +#define ETH_DMACH0_INT_FLAG_TI ((uint32_t)ETH_DMACH0STS_TI) +#define ETH_DMACH0_INT_FLAG_TPS ((uint32_t)ETH_DMACH0STS_TPS) +#define ETH_DMACH0_INT_FLAG_TBU ((uint32_t)ETH_DMACH0STS_TBU) +#define ETH_DMACH0_INT_FLAG_RI ((uint32_t)ETH_DMACH0STS_RI) +#define ETH_DMACH0_INT_FLAG_RBU ((uint32_t)ETH_DMACH0STS_RBU) +#define ETH_DMACH0_INT_FLAG_RPS ((uint32_t)ETH_DMACH0STS_RPS) +#define ETH_DMACH0_INT_FLAG_RWT ((uint32_t)ETH_DMACH0STS_RWT) +#define ETH_DMACH0_INT_FLAG_ETI ((uint32_t)ETH_DMACH0STS_ETI) +#define ETH_DMACH0_INT_FLAG_ERI ((uint32_t)ETH_DMACH0STS_ERI) +#define ETH_DMACH0_INT_FLAG_FBE ((uint32_t)ETH_DMACH0STS_FBE) +#define ETH_DMACH0_INT_FLAG_CDE ((uint32_t)ETH_DMACH0STS_CDE) +#define ETH_DMACH0_INT_FLAG_AIS ((uint32_t)ETH_DMACH0STS_AIS) +#define ETH_DMACH0_INT_FLAG_NIS ((uint32_t)ETH_DMACH0STS_NIS) + +/** ETH DMA Receive Interrupt Watchdog Timer Count Unit definition **/ +#define ETH_DMARXINT_WDGTIM_CNTUNIT_256 ((uint32_t)(ETH_DMACH0RXINTWT_RWTU_0 \ + & ETH_DMACH0RXINTWT_RWTU_1)) +#define ETH_DMARXINT_WDGTIM_CNTUNIT_512 ((uint32_t)(ETH_DMACH0RXINTWT_RWTU_0)) +#define ETH_DMARXINT_WDGTIM_CNTUNIT_1024 ((uint32_t)(ETH_DMACH0RXINTWT_RWTU_1)) +#define ETH_DMARXINT_WDGTIM_CNTUNIT_2048 ((uint32_t)(ETH_DMACH0RXINTWT_RWTU_0 \ + | ETH_DMACH0RXINTWT_RWTU_1)) + + + +/*** ETH Macro Definition End ***/ + + +/*** ETH DMA Transmit Normal Descriptor (Read Format) Start ***/ + +/** Bit definition for ETH_DMATXND0RF register (TDES0) **/ +#define ETH_DMATXND0RF_BUF1AP ((uint32_t)0xFFFFFFFF) /* Buffer 1 Address Pointer */ +#define ETH_DMATXND0RF_TSOHAP ((uint32_t)0xFFFFFFFF) /* TSO Header Address Pointer */ + +/** Bit definition for ETH_DMATXND1RF register (TDES1) **/ +#define ETH_DMATXND1RF_BUF2AP ((uint32_t)0xFFFFFFFF) /* Buffer 2 Address Pointer */ + +/** Bit definition for ETH_DMATXND2RF register (TDES2) **/ +#define ETH_DMATXND2RF_B1L ((uint32_t)0x00003FFF) /* Buffer 1 Length */ +#define ETH_DMATXND2RF_HL ((uint32_t)0x00003FFF) /* Header length when TCP segmentation is enabled */ +#define ETH_DMATXND2RF_VTIR ((uint32_t)0x0000C000) /* VTIR[1:0]: VLAN Tag Insertion or Replacement */ +#define ETH_DMATXND2RF_VTIR_0 ((uint32_t)0x00004000) /* VTIR bit 0 */ +#define ETH_DMATXND2RF_VTIR_1 ((uint32_t)0x00008000) /* VTIR bit 1 */ +#define ETH_DMATXND2RF_B2L ((uint32_t)0x3FFF0000) /* Buffer 2 Length */ +#define ETH_DMATXND2RF_TTSE ((uint32_t)0x40000000) /* Transmit Timestamp Enable */ +#define ETH_DMATXND2RF_IOC ((uint32_t)0x80000000) /* Interrupt on Completion */ + +/** Bit definition for ETH_DMATXND3RF register (TDES3) **/ +#define ETH_DMATXND3RF_FL ((uint32_t)0x00007FFF) /* Frame Length */ +#define ETH_DMATXND3RF_TPL ((uint32_t)0x0003FFFF) /* TCP Payload Length */ +#define ETH_DMATXND3RF_CIC ((uint32_t)0x00030000) /* CIC[1:0]: Checksum Insertion Control */ +#define ETH_DMATXND3RF_CIC_0 ((uint32_t)0x00010000) /* CIC bit 0 */ +#define ETH_DMATXND3RF_CIC_1 ((uint32_t)0x00020000) /* CIC bit 1 */ +#define ETH_DMATXND3RF_TSE ((uint32_t)0x00040000) /* TCP Segmentation Enable */ +#define ETH_DMATXND3RF_THL ((uint32_t)0x00780000) /* TCP/UDP Header Length */ +#define ETH_DMATXND3RF_SAIC ((uint32_t)0x00380000) /* SAIC[2:0]: SA Insertion Control */ +#define ETH_DMATXND3RF_SAIC_0 ((uint32_t)0x00080000) /* SAIC bit 0 */ +#define ETH_DMATXND3RF_SAIC_1 ((uint32_t)0x00100000) /* SAIC bit 1 */ +#define ETH_DMATXND3RF_SAIC_2 ((uint32_t)0x00200000) /* SAIC bit 2 */ +#define ETH_DMATXND3RF_CPC ((uint32_t)0x0C000000) /* CPC[1:0]: CRC Pad Control */ +#define ETH_DMATXND3RF_CPC_0 ((uint32_t)0x04000000) /* CPC bit 0 */ +#define ETH_DMATXND3RF_CPC_1 ((uint32_t)0x08000000) /* CPC bit 1 */ +#define ETH_DMATXND3RF_LD ((uint32_t)0x10000000) /* Last Descriptor */ +#define ETH_DMATXND3RF_FD ((uint32_t)0x20000000) /* First Descriptor */ +#define ETH_DMATXND3RF_CTXT ((uint32_t)0x40000000) /* Context Type */ +#define ETH_DMATXND3RF_OWN ((uint32_t)0x80000000) /* Own Bit */ + +#define ETH_CHECKSUM_INSERT_DISABIE ((uint32_t)(ETH_DMATXND3RF_CIC_0 \ + & ETH_DMATXND3RF_CIC_1)) +#define ETH_CHECKSUM_INSERT_ONLY_IPHDR ((uint32_t)(ETH_DMATXND3RF_CIC_0)) +#define ETH_CHECKSUM_INSERT_IPHDR_PAYLOAD ((uint32_t)(ETH_DMATXND3RF_CIC_1)) +#define ETH_CHECKSUM_INSERT_IPHDR_PAYLOAD_PHDR_CALC ((uint32_t)(ETH_DMATXND3RF_CIC_0 \ + | ETH_DMATXND3RF_CIC_1)) + +#define ETH_CRC_PAD_INSERT ((uint32_t)(ETH_DMATXND3RF_CPC_0 \ + & ETH_DMATXND3RF_CPC_1)) +#define ETH_CRC_INSERT ((uint32_t)(ETH_DMATXND3RF_CPC_0)) +#define ETH_CRC_INSERT_DISABIE ((uint32_t)(ETH_DMATXND3RF_CPC_1)) +#define ETH_CRC_REPLACEMENT ((uint32_t)(ETH_DMATXND3RF_CPC_0 \ + | ETH_DMATXND3RF_CPC_1)) + +/*** ETH DMA Transmit Normal Descriptor (Read Format) End ***/ + + +/*** ETH DMA Transmit Normal Descriptor (Write-Back Format) Start ***/ + +/** Bit definition for ETH_DMATXND0WBF register (TDES0) **/ +#define ETH_DMATXND0WBF_TTSL ((uint32_t)0xFFFFFFFF) /* Transmit Packet Timestamp Low */ + +/** Bit definition for ETH_DMATXND1WBF register (TDES1) **/ +#define ETH_DMATXND1WBF_TTSH ((uint32_t)0xFFFFFFFF) /* Transmit Packet Timestamp High */ + +/** Bit definition for ETH_DMATXND3WBF register (TDES3) **/ +#define ETH_DMATXND3WBF_IHE ((uint32_t)0x00000001) /* IP Header Error */ +#define ETH_DMATXND3WBF_DB ((uint32_t)0x00000002) /* Deferred Bit */ +#define ETH_DMATXND3WBF_UF ((uint32_t)0x00000004) /* Underflow Error */ +#define ETH_DMATXND3WBF_ED ((uint32_t)0x00000004) /* Excessive Deferral */ +#define ETH_DMATXND3WBF_CC ((uint32_t)0x000000F0) /* Collision Count */ +#define ETH_DMATXND3WBF_EC ((uint32_t)0x00000100) /* Excessive Collision */ +#define ETH_DMATXND3WBF_LC ((uint32_t)0x00000200) /* Late Collision */ +#define ETH_DMATXND3WBF_NC ((uint32_t)0x00000400) /* No Carrier */ +#define ETH_DMATXND3WBF_LOC ((uint32_t)0x00000800) /* Loss of Carrier */ +#define ETH_DMATXND3WBF_PCE ((uint32_t)0x00001000) /* Payload Checksum Error */ +#define ETH_DMATXND3WBF_PF ((uint32_t)0x00002000) /* Packet Flushed */ +#define ETH_DMATXND3WBF_JT ((uint32_t)0x00004000) /* Jabber Timeout */ +#define ETH_DMATXND3WBF_ES ((uint32_t)0x00008000) /* Error Summary */ +#define ETH_DMATXND3WBF_EUE ((uint32_t)0x00010000) /* ECC Uncorrectable Error Status in TSO memory */ +#define ETH_DMATXND3WBF_TTSS ((uint32_t)0x00020000) /* Tx Timestamp Status */ +#define ETH_DMATXND3WBF_DE ((uint32_t)0x00800000) /* Descriptor Error */ +#define ETH_DMATXND3WBF_LD ((uint32_t)0x10000000) /* Last Descriptor */ +#define ETH_DMATXND3WBF_FD ((uint32_t)0x20000000) /* First Descriptor */ +#define ETH_DMATXND3WBF_CTXT ((uint32_t)0x40000000) /* Context Type */ +#define ETH_DMATXND3WBF_OWN ((uint32_t)0x80000000) /* Own Bit */ + +/** ETH DMA Tx Descriptor flag definition **/ +#define ETH_DMATXDESC_FLAG_IHE ((uint32_t)ETH_DMATXND3WBF_IHE) +#define ETH_DMATXDESC_FLAG_DB ((uint32_t)ETH_DMATXND3WBF_DB) +#define ETH_DMATXDESC_FLAG_UF ((uint32_t)ETH_DMATXND3WBF_UF) +#define ETH_DMATXDESC_FLAG_ED ((uint32_t)ETH_DMATXND3WBF_ED) +#define ETH_DMATXDESC_FLAG_CC ((uint32_t)ETH_DMATXND3WBF_CC) +#define ETH_DMATXDESC_FLAG_EC ((uint32_t)ETH_DMATXND3WBF_EC) +#define ETH_DMATXDESC_FLAG_LC ((uint32_t)ETH_DMATXND3WBF_LC) +#define ETH_DMATXDESC_FLAG_NC ((uint32_t)ETH_DMATXND3WBF_NC) +#define ETH_DMATXDESC_FLAG_LOC ((uint32_t)ETH_DMATXND3WBF_LOC) +#define ETH_DMATXDESC_FLAG_PCE ((uint32_t)ETH_DMATXND3WBF_PCE) +#define ETH_DMATXDESC_FLAG_PF ((uint32_t)ETH_DMATXND3WBF_PF) +#define ETH_DMATXDESC_FLAG_JT ((uint32_t)ETH_DMATXND3WBF_JT) +#define ETH_DMATXDESC_FLAG_ES ((uint32_t)ETH_DMATXND3WBF_ES) +#define ETH_DMATXDESC_FLAG_TTSS ((uint32_t)ETH_DMATXND3WBF_TTSS) +#define ETH_DMATXDESC_FLAG_DE ((uint32_t)ETH_DMATXND3WBF_DE) +#define ETH_DMATXDESC_FLAG_LD ((uint32_t)ETH_DMATXND3WBF_LD) +#define ETH_DMATXDESC_FLAG_FD ((uint32_t)ETH_DMATXND3WBF_FD) + +/*** ETH DMA Transmit Normal Descriptor (Write-Back Format) End ***/ + + +/*** ETH DMA Transmit Context Descriptor Start ***/ + +/** Bit definition for ETH_DMATXCD0 register (TDES0) **/ +#define ETH_DMATXCD0_TTSL ((uint32_t)0xFFFFFFFF) /* Transmit Packet Timestamp Low */ + +/** Bit definition for ETH_DMATXCD1 register (TDES1) **/ +#define ETH_DMATXCD1_TTSH ((uint32_t)0xFFFFFFFF) /* Transmit Packet Timestamp High */ + +/** Bit definition for ETH_DMATXCD2 register (TDES2) **/ +#define ETH_DMATXCD2_MSS ((uint32_t)0x00003FFF) /* Maximum Segment Size */ +#define ETH_DMATXCD2_IVT ((uint32_t)0xFFFF0000) /* Inner VLAN Tag */ + +/** Bit definition for ETH_DMATXCD3 register (TDES3) **/ +#define ETH_DMATXCD3_VT ((uint32_t)0x0000FFFF) /* VLAN Tag */ +#define ETH_DMATXCD3_VLTV ((uint32_t)0x00010000) /* VLAN Tag Valid */ +#define ETH_DMATXCD3_IVLTV ((uint32_t)0x00020000) /* VLAN Tag Valid */ +#define ETH_DMATXCD3_IVTIR ((uint32_t)0x000C0000) /* IVTIR[1:0]: Inner VLAN Tag Insert or Replace */ +#define ETH_DMATXCD3_IVTIR_0 ((uint32_t)0x00040000) /* IVTIR bit 0 */ +#define ETH_DMATXCD3_IVTIR_1 ((uint32_t)0x00080000) /* IVTIR bit 1 */ +#define ETH_DMATXCD3_CDE ((uint32_t)0x00800000) /* Context Descriptor Error */ +#define ETH_DMATXCD3_TCMSSV ((uint32_t)0x04000000) /* One-Step Timestamp Correction Input */ +#define ETH_DMATXCD3_OSTC ((uint32_t)0x08000000) /* One-Step Timestamp Correction Enable */ +#define ETH_DMATXCD3_CTXT ((uint32_t)0x40000000) /* Context Type */ +#define ETH_DMATXCD3_OWN ((uint32_t)0x80000000) /* Own Bit */ + + +/*** ETH DMA Transmit Context Descriptor End ***/ + + +/*** ETH DMA Receive Normal Descriptor (Read Format) Start ***/ + +/** Bit definition for ETH_DMARXND0RF register (RDES0) **/ +#define ETH_DMARXND0RF_BUF1AP ((uint32_t)0xFFFFFFFF) /* Buffer 1 Address Pointer */ + +/** Bit definition for ETH_DMARXND2RF register (RDES2) **/ +#define ETH_DMARXND2RF_BUF2AP ((uint32_t)0xFFFFFFFF) /* Buffer 2 Address Pointer */ + +/** Bit definition for ETH_DMARXND3RF register (RDES3) **/ +#define ETH_DMARXND3RF_BUF1V ((uint32_t)0x01000000) /* Buffer 1 Address Valid */ +#define ETH_DMARXND3RF_BUF2V ((uint32_t)0x02000000) /* Buffer 2 Address Valid */ +#define ETH_DMARXND3RF_IOC ((uint32_t)0x40000000) /* Interrupt Enabled on Completion */ +#define ETH_DMARXND3RF_OWN ((uint32_t)0x80000000) /* Own Bit */ + +/*** ETH DMA Receive Normal Descriptor (Read Format) End ***/ + + +/*** ETH DMA Receive Normal Descriptor (Write-Back Format) Start ***/ + +/** Bit definition for ETH_DMARXND0WBF register (RDES0) **/ +#define ETH_DMARXND0WBF_OVT ((uint32_t)0x0000FFFF) /* Outer VLAN Tag */ +#define ETH_DMARXND0WBF_IVT ((uint32_t)0xFFFF0000) /* Inner VLAN Tag */ + +/** Bit definition for ETH_DMARXND1WBF register (RDES1) **/ +#define ETH_DMARXND1WBF_PT ((uint32_t)0x00000007) /* PT[2:0]: Payload Type */ +#define ETH_DMARXND1WBF_PT_0 ((uint32_t)0x00000001) /* PT bit 0 */ +#define ETH_DMARXND1WBF_PT_1 ((uint32_t)0x00000002) /* PT bit 1 */ +#define ETH_DMARXND1WBF_PT_2 ((uint32_t)0x00000004) /* PT bit 2 */ +#define ETH_DMARXND1WBF_IPHE ((uint32_t)0x00000008) /* IP Header Error */ +#define ETH_DMARXND1WBF_IPV4 ((uint32_t)0x00000010) /* IPV4 Header Present */ +#define ETH_DMARXND1WBF_IPV6 ((uint32_t)0x00000020) /* IPV6 Header Present */ +#define ETH_DMARXND1WBF_IPCB ((uint32_t)0x00000040) /* IP Checksum Bypassed */ +#define ETH_DMARXND1WBF_IPCE ((uint32_t)0x00000080) /* IP Payload Error */ +#define ETH_DMARXND1WBF_PMT ((uint32_t)0x00000F00) /* PMT[3:0]: PTP Message Type */ +#define ETH_DMARXND1WBF_PMT_0 ((uint32_t)0x00000100) /* PMT bit 0 */ +#define ETH_DMARXND1WBF_PMT_1 ((uint32_t)0x00000200) /* PMT bit 1 */ +#define ETH_DMARXND1WBF_PMT_2 ((uint32_t)0x00000400) /* PMT bit 2 */ +#define ETH_DMARXND1WBF_PMT_3 ((uint32_t)0x00000800) /* PMT bit 3 */ +#define ETH_DMARXND1WBF_PFT ((uint32_t)0x00001000) /* PTP Packet Type */ +#define ETH_DMARXND1WBF_PV ((uint32_t)0x00002000) /* PTP Version */ +#define ETH_DMARXND1WBF_TSA ((uint32_t)0x00004000) /* Timestamp Available */ +#define ETH_DMARXND1WBF_TD ((uint32_t)0x00008000) /* Timestamp Dropped */ +#define ETH_DMARXND1WBF_OPC ((uint32_t)0xFFFF0000) /* OAM Sub-Type Code, or MAC Control Packet opcode */ + +/** ETH DMA Rx Descriptor Extended flag definition **/ +#define ETH_DMARXDESC_EXTFLAG_PT_NONE ((uint32_t)(ETH_DMARXND1WBF_PT_0 \ + & ETH_DMARXND1WBF_PT_1 \ + & ETH_DMARXND1WBF_PT_2)) /* Payload Type: Unknown */ +#define ETH_DMARXDESC_EXTFLAG_PT_NUDP ((uint32_t)(ETH_DMARXND1WBF_PT_0)) /* Payload Type: UDP */ +#define ETH_DMARXDESC_EXTFLAG_PT_TCP ((uint32_t)(ETH_DMARXND1WBF_PT_1)) /* Payload Type: TCP */ +#define ETH_DMARXDESC_EXTFLAG_PT_ICNP ((uint32_t)(ETH_DMARXND1WBF_PT_0 \ + | ETH_DMARXND1WBF_PT_1)) /* Payload Type: ICMP */ +#define ETH_DMARXDESC_EXTFLAG_IPHE ((uint32_t)(ETH_DMARXND1WBF_IPHE)) +#define ETH_DMARXDESC_EXTFLAG_IPV4 ((uint32_t)(ETH_DMARXND1WBF_IPV4)) +#define ETH_DMARXDESC_EXTFLAG_IPV6 ((uint32_t)(ETH_DMARXND1WBF_IPV6)) +#define ETH_DMARXDESC_EXTFLAG_IPCB ((uint32_t)(ETH_DMARXND1WBF_IPCB)) +#define ETH_DMARXDESC_EXTFLAG_IPCE ((uint32_t)(ETH_DMARXND1WBF_IPCE)) +#define ETH_DMARXDESC_EXTFLAG_PMT_NONE ((uint32_t)(ETH_DMARXND1WBF_PMT_0 \ + & ETH_DMARXND1WBF_PMT_1 \ + & ETH_DMARXND1WBF_PMT_2 \ + & ETH_DMARXND1WBF_PMT_3)) /* No PTP message received */ +#define ETH_DMARXDESC_EXTFLAG_PMT_SYNC ((uint32_t)(ETH_DMARXND1WBF_PMT_0)) /* PTP Message Type: SYNC */ +#define ETH_DMARXDESC_EXTFLAG_PMT_FU ((uint32_t)(ETH_DMARXND1WBF_PMT_1)) /* PTP Message Type: Follow_Up */ +#define ETH_DMARXDESC_EXTFLAG_PMT_DREQ ((uint32_t)(ETH_DMARXND1WBF_PMT_0 \ + | ETH_DMARXND1WBF_PMT_1)) /* PTP Message Type: Delay_Req */ +#define ETH_DMARXDESC_EXTFLAG_PMT_DRESP ((uint32_t)(ETH_DMARXND1WBF_PMT_2)) /* PTP Message Type: Delay_Resp */ +#define ETH_DMARXDESC_EXTFLAG_PMT_PDREQ ((uint32_t)(ETH_DMARXND1WBF_PMT_0 \ + | ETH_DMARXND1WBF_PMT_2)) /* PTP Message Type: Pdelay_Req */ +#define ETH_DMARXDESC_EXTFLAG_PMT_PDRESP ((uint32_t)(ETH_DMARXND1WBF_PMT_1 \ + | ETH_DMARXND1WBF_PMT_2)) /* PTP Message Type: Pdelay_Resp */ +#define ETH_DMARXDESC_EXTFLAG_PMT_PRFU ((uint32_t)(ETH_DMARXND1WBF_PMT_0 \ + | ETH_DMARXND1WBF_PMT_1 \ + | ETH_DMARXND1WBF_PMT_2)) /* PTP Message Type: Pdelay_Resp_Follow_Up */ +#define ETH_DMARXDESC_EXTFLAG_PMT_ANN ((uint32_t)(ETH_DMARXND1WBF_PMT_3)) /* PTP Message Type: Announce */ +#define ETH_DMARXDESC_EXTFLAG_PMT_MAN ((uint32_t)(ETH_DMARXND1WBF_PMT_0 \ + | ETH_DMARXND1WBF_PMT_3)) /* PTP Message Type: Management */ +#define ETH_DMARXDESC_EXTFLAG_PMT_SIG ((uint32_t)(ETH_DMARXND1WBF_PMT_1 \ + | ETH_DMARXND1WBF_PMT_3)) /* PTP Message Type: Signaling */ +#define ETH_DMARXDESC_EXTFLAG_PMT_PRT ((uint32_t)(ETH_DMARXND1WBF_PMT_0 \ + | ETH_DMARXND1WBF_PMT_1 \ + | ETH_DMARXND1WBF_PMT_2 \ + | ETH_DMARXND1WBF_PMT_3)) /* PTP packet with Reserved message Type */ +#define ETH_DMARXDESC_EXTFLAG_PFT ((uint32_t)(ETH_DMARXND1WBF_PFT)) +#define ETH_DMARXDESC_EXTFLAG_PV ((uint32_t)(ETH_DMARXND1WBF_PV)) +#define ETH_DMARXDESC_EXTFLAG_TSA ((uint32_t)(ETH_DMARXND1WBF_TSA)) +#define ETH_DMARXDESC_EXTFLAG_TD ((uint32_t)(ETH_DMARXND1WBF_TD)) + + +/** Bit definition for ETH_DMARXND2WBF register (RDES2) **/ +#define ETH_DMARXND2WBF_ARPNR ((uint32_t)0x00000400) /* ARP Reply Not Generated */ +#define ETH_DMARXND2WBF_VFS ((uint32_t)0x00008000) /* VLAN Filter Status */ +#define ETH_DMARXND2WBF_SAF ((uint32_t)0x00010000) /* SA Address Filter Fail */ +#define ETH_DMARXND2WBF_DAF ((uint32_t)0x00020000) /* DA Address Filter Fail */ +#define ETH_DMARXND2WBF_HF ((uint32_t)0x00040000) /* Hash Filter Status */ +#define ETH_DMARXND2WBF_MADRM ((uint32_t)0x07F80000) /* MAC Address Match */ +#define ETH_DMARXND2WBF_HV ((uint32_t)0x07F80000) /* Hash Value */ +#define ETH_DMARXND2WBF_L3FM ((uint32_t)0x08000000) /* Layer 3 Filter Match */ +#define ETH_DMARXND2WBF_L4FM ((uint32_t)0x10000000) /* Layer 4 Filter Match */ +#define ETH_DMARXND2WBF_L3L4FM ((uint32_t)0xE0000000) /* L3L4FM[2:0]: Layer 3 and Layer 4 Filter Number Matched */ +#define ETH_DMARXND2WBF_L3L4FM_0 ((uint32_t)0x20000000) /* L3L4FM bit 0 */ +#define ETH_DMARXND2WBF_L3L4FM_1 ((uint32_t)0x40000000) /* L3L4FM bit 1 */ +#define ETH_DMARXND2WBF_L3L4FM_2 ((uint32_t)0x80000000) /* L3L4FM bit 2 */ + +/** ETH DMA Rx Descriptor Filter flag definition **/ +#define ETH_DMARXDESC_FLTFLAG_VFS ((uint32_t)(ETH_DMARXND2WBF_VFS)) +#define ETH_DMARXDESC_FLTFLAG_SAF ((uint32_t)(ETH_DMARXND2WBF_SAF)) +#define ETH_DMARXDESC_FLTFLAG_DAF ((uint32_t)(ETH_DMARXND2WBF_DAF)) +#define ETH_DMARXDESC_FLTFLAG_HF ((uint32_t)(ETH_DMARXND2WBF_HF)) + + +/** Bit definition for ETH_DMARXND3WBF register (RDES3) **/ +#define ETH_DMARXND3WBF_PL ((uint32_t)0x00007FFF) /* Packet Length */ +#define ETH_DMARXND3WBF_ES ((uint32_t)0x00008000) /* Error Summary */ +#define ETH_DMARXND3WBF_LT ((uint32_t)0x00070000) /* LT[2:0]: Length/Type Field */ +#define ETH_DMARXND3WBF_LT_0 ((uint32_t)0x00010000) /* LT bit 0 */ +#define ETH_DMARXND3WBF_LT_1 ((uint32_t)0x00020000) /* LT bit 1 */ +#define ETH_DMARXND3WBF_LT_2 ((uint32_t)0x00040000) /* LT bit 2 */ +#define ETH_DMARXND3WBF_DE ((uint32_t)0x00080000) /* Dribble Bit Error */ +#define ETH_DMARXND3WBF_RE ((uint32_t)0x00100000) /* Receive Error */ +#define ETH_DMARXND3WBF_OE ((uint32_t)0x00200000) /* Overflow Error */ +#define ETH_DMARXND3WBF_RWT ((uint32_t)0x00400000) /* Receive Watchdog Timeout */ +#define ETH_DMARXND3WBF_GP ((uint32_t)0x00800000) /* Giant Packet */ +#define ETH_DMARXND3WBF_CE ((uint32_t)0x01000000) /* CRC Error */ +#define ETH_DMARXND3WBF_RS0V ((uint32_t)0x02000000) /* Receive Status RDES0 Valid */ +#define ETH_DMARXND3WBF_RS1V ((uint32_t)0x04000000) /* Receive Status RDES1 Valid */ +#define ETH_DMARXND3WBF_RS2V ((uint32_t)0x08000000) /* Receive Status RDES2 Valid */ +#define ETH_DMARXND3WBF_LD ((uint32_t)0x10000000) /* Last Descriptor */ +#define ETH_DMARXND3WBF_FD ((uint32_t)0x20000000) /* First Descriptor */ +#define ETH_DMARXND3WBF_CTXT ((uint32_t)0x40000000) /* Receive Context Descriptor */ +#define ETH_DMARXND3WBF_OWN ((uint32_t)0x80000000) /* Own Bit */ + +#define ETH_DMARXND3WBF_LT_LP ((uint32_t)(ETH_DMARXND3WBF_LT_0 \ + & ETH_DMARXND3WBF_LT_1 \ + & ETH_DMARXND3WBF_LT_2)) /* length packet */ +#define ETH_DMARXND3WBF_LT_TP ((uint32_t)(ETH_DMARXND3WBF_LT_0)) /* type packet */ +#define ETH_DMARXND3WBF_LT_ARP ((uint32_t)(ETH_DMARXND3WBF_LT_0 \ + | ETH_DMARXND3WBF_LT_1)) /* ARP Request packet type */ +#define ETH_DMARXND3WBF_LT_VLAN ((uint32_t)(ETH_DMARXND3WBF_LT_2)) /* Type packet with VLAN Tag */ +#define ETH_DMARXND3WBF_LT_DVLAN ((uint32_t)(ETH_DMARXND3WBF_LT_0 \ + | ETH_DMARXND3WBF_LT_2)) /* Type packet with Double VLAN Tag */ +#define ETH_DMARXND3WBF_LT_MAC ((uint32_t)(ETH_DMARXND3WBF_LT_1 \ + | ETH_DMARXND3WBF_LT_2)) /* MAC Control packet type */ +#define ETH_DMARXND3WBF_LT_OAM ((uint32_t)(ETH_DMARXND3WBF_LT_0 \ + | ETH_DMARXND3WBF_LT_1 \ + | ETH_DMARXND3WBF_LT_2)) /* OAM packet type */ + +/** ETH DMA Rx Descriptor flag definition **/ +#define ETH_DMARXDESC_FLAG_ES ((uint32_t)(ETH_DMATXND3WBF_IHE)) +#define ETH_DMARXDESC_FLAG_LT_LP ((uint32_t)(ETH_DMARXND3WBF_LT_0 \ + & ETH_DMARXND3WBF_LT_1 \ + & ETH_DMARXND3WBF_LT_2)) /* length packet */ +#define ETH_DMARXDESC_FLAG_LT_TP ((uint32_t)(ETH_DMARXND3WBF_LT_0)) /* type packet */ +#define ETH_DMARXDESC_FLAG_LT_ARP ((uint32_t)(ETH_DMARXND3WBF_LT_0 \ + | ETH_DMARXND3WBF_LT_1)) /* ARP Request packet type */ +#define ETH_DMARXDESC_FLAG_LT_VLAN ((uint32_t)(ETH_DMARXND3WBF_LT_2)) /* Type packet with VLAN Tag */ +#define ETH_DMARXDESC_FLAG_LT_DVLAN ((uint32_t)(ETH_DMARXND3WBF_LT_0 \ + | ETH_DMARXND3WBF_LT_2)) /* Type packet with Double VLAN Tag */ +#define ETH_DMARXDESC_FLAG_LT_MAC ((uint32_t)(ETH_DMARXND3WBF_LT_1 \ + | ETH_DMARXND3WBF_LT_2)) /* MAC Control packet type */ +#define ETH_DMARXDESC_FLAG_LT_OAM ((uint32_t)(ETH_DMARXND3WBF_LT_0 \ + | ETH_DMARXND3WBF_LT_1 \ + | ETH_DMARXND3WBF_LT_2)) /* OAM packet type */ +#define ETH_DMARXDESC_FLAG_DE ((uint32_t)(ETH_DMARXND3WBF_DE)) +#define ETH_DMARXDESC_FLAG_RE ((uint32_t)(ETH_DMARXND3WBF_RE)) +#define ETH_DMARXDESC_FLAG_OE ((uint32_t)(ETH_DMARXND3WBF_OE)) +#define ETH_DMARXDESC_FLAG_RWT ((uint32_t)(ETH_DMARXND3WBF_RWT)) +#define ETH_DMARXDESC_FLAG_GP ((uint32_t)(ETH_DMARXND3WBF_GP)) +#define ETH_DMARXDESC_FLAG_CE ((uint32_t)(ETH_DMARXND3WBF_CE)) +#define ETH_DMARXDESC_FLAG_RS0V ((uint32_t)(ETH_DMARXND3WBF_RS0V)) +#define ETH_DMARXDESC_FLAG_RS1V ((uint32_t)(ETH_DMARXND3WBF_RS1V)) +#define ETH_DMARXDESC_FLAG_RS2V ((uint32_t)(ETH_DMARXND3WBF_RS2V)) +#define ETH_DMARXDESC_FLAG_LD ((uint32_t)(ETH_DMARXND3WBF_LD)) +#define ETH_DMARXDESC_FLAG_FD ((uint32_t)(ETH_DMARXND3WBF_FD)) + + +/*** ETH DMA Receive Normal Descriptor (Write-Back Format) End ***/ + + +/*** ETH DMA Receive Context Descriptor Start ***/ + +/** Bit definition for ETH_DMARXCD0 register (RDES0) **/ +#define ETH_DMARXCD0_RTSL ((uint32_t)0xFFFFFFFF) /* Receive Packet Timestamp Low */ + +/** Bit definition for ETH_DMARXCD1 register (RDES1) **/ +#define ETH_DMARXCD1_RTSH ((uint32_t)0xFFFFFFFF) /* Receive Packet Timestamp High */ + +/** Bit definition for ETH_DMARXCD3 register (RDES3) **/ +#define ETH_DMARXCD3_DE ((uint32_t)0x20000000) /* Descriptor Error */ +#define ETH_DMARXCD3_CTXT ((uint32_t)0x40000000) /* Receive Context Descriptor */ +#define ETH_DMARXCD3_OWN ((uint32_t)0x80000000) /* Own Bit */ + +/*** ETH DMA Receive Context Descriptor End ***/ + + +/*** ETH Driving Functions Declaration ***/ +void ETH_DeInit(ETH_Module* ETHx); +void ETH_StructInit(ETH_Module* ETHx, ETH_InitType* ETH_InitParam); +void ETH_DMATxDescListInit(ETH_Module* ETHx, ETH_InfoType* pInfo); +void ETH_DMARxDescListInit(ETH_Module* ETHx, ETH_InfoType* pInfo); +void ETH_ConfigMDCNormalClock(ETH_Module* ETHx, RCC_ClocksTypeDef* pClk); +void ETH_ConfigMDCFastClock(ETH_Module* ETHx, uint32_t DivValue); +uint32_t ETH_ReadPHYRegister(ETH_Module* ETHx, uint32_t PHYAddr, uint32_t PHYReg, uint32_t* pRegValue); +uint32_t ETH_WritePHYRegister(ETH_Module* ETHx, uint32_t PHYAddr, uint32_t PHYReg, uint32_t PHYRegValue); +EthFuncStatusType ETH_ExternalPHYInit(ETH_Module* ETHx, ETH_InfoType* pInfo, ETH_InitType* ETH_InitParam); +EthFuncStatusType ETH_Init(ETH_Module* ETHx, ETH_InfoType* pInfo, ETH_InitType* ETH_InitParam); +void ETH_TxMACCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_RxMACCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_SetHashTable(ETH_Module* ETHx, uint32_t *pHashTable); +void ETH_RxVLANTagStructInit(ETH_RxVLANTagInitType* ETH_RxVTInitParam); +void ETH_RxVLANTagInit(ETH_Module* ETHx, ETH_RxVLANTagInitType* ETH_RxVTInitParam); +void ETH_SetVLANHashTable(ETH_Module* ETHx, uint16_t HashTable); +void ETH_SetRxVLANIdentifier(ETH_Module* ETHx, uint32_t VLANIdentifier); +void ETH_InitiatePauseControlPacket(ETH_Module* ETHx); +void ETH_ActivateBackpressure(ETH_Module* ETHx); +void ETH_PowerDownCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_MagicPacketDetectionCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_WakeUpPacketDetectionCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_GlobalUnicastWakeUpCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_ResetWakeUpPacketFilterRegPointer(ETH_Module* ETHx); +void ETH_SetWakeUpPacketFilterRegister(ETH_Module* ETHx, uint32_t *pBuffer); +void ETH_CSRRegisterWrite1ClearCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_SetMACAddress(ETH_Module* ETHx, EthMacAddr0123Type Offset, uint8_t* pAddr); +void ETH_GetMACAddress(ETH_Module* ETHx, EthMacAddr0123Type Offset, uint8_t* pAddr); +void ETH_MACAddressPerfectFilterCmd(ETH_Module* ETHx, EthMacAddr123Type Offset, FunctionalStatus Cmd); +void ETH_SetMACAddressFilter(ETH_Module* ETHx, EthMacAddr123Type Offset, EthMacAddrFilterType Filter); +void ETH_SetMACAddressFilterMaskBytes(ETH_Module* ETHx, EthMacAddr123Type Offset, uint32_t MaskByte); +void ETH_MMCCountersReset(ETH_Module* ETHx); +void ETH_MMCCounterStopRolloverCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_MMCResetOnReadCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_MMCCounterFreezeCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_MMCCounterHalfPreset(ETH_Module* ETHx); +void ETH_MMCCounterFullPreset(ETH_Module* ETHx); +void ETH_MMCCounterUpdateForDropBCPacketCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +uint32_t ETH_GetMMCCounterValue(ETH_Module* ETHx, EthMmcAddrType Offset); +void ETH_MACTimeStampCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_SetTimeStampUpdateMethod(ETH_Module* ETHx, uint32_t Method); +void ETH_MACTimeStampInit(ETH_Module* ETHx); +void ETH_MACTimeStampUpdate(ETH_Module* ETHx); +// void ETH_EnableTimeStampIntTrigger(ETH_Module* ETHx); +void ETH_MACTimeStampAddendRegUpdate(ETH_Module* ETHx); +void ETH_MACTimeStampAllPacketsCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_MACTimeStampDigBinRolloverCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_PTPTypePacketProcesCmd(ETH_Module* ETHx, uint32_t PacketType, FunctionalStatus Cmd); +void ETH_MACAddrPTPPacketFilterCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_MACTxTimeStampStatusModeCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_SetSubSecondIncrementValue(ETH_Module* ETHx, uint8_t IncValue); +void ETH_SetTimeStampUpdateValue(ETH_Module* ETHx, uint32_t CalMode, uint32_t SecondValue, uint32_t SubSecondValue); +void ETH_SetTimeStampAddendValue(ETH_Module* ETHx, uint32_t AddValue); +uint32_t ETH_GetTimeStampRegValue(ETH_Module* ETHx, EthTsAddrType Offset); +void ETH_ConfigPPSOutput(ETH_Module* ETHx, uint32_t OutputFreq); +void ETH_SetPPSTargetTimeValue(ETH_Module* ETHx, uint32_t SecondValue, uint32_t SubSecondValue); + +void ETH_MTLDropTxStatusCmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_MTLCounterPreset(ETH_Module* ETHx); +void ETH_MTLCounterReset(ETH_Module* ETHx); +void ETH_FlushTransmitQueue(ETH_Module* ETHx); +uint16_t ETH_GetMTLUnderflowPacketCounter(ETH_Module* ETHx); +uint16_t ETH_GetMTLOverflowPacketCounter(ETH_Module* ETHx); +uint16_t ETH_GetMTLMissedPacketCounter(ETH_Module* ETHx); + +void ETH_SoftwareReset(ETH_Module* ETHx); +void ETH_TxDMACmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_RxDMACmd(ETH_Module* ETHx, FunctionalStatus Cmd); +void ETH_ResumeDMATransmission(ETH_Module* ETHx); +void ETH_ResumeDMAReception(ETH_Module* ETHx); +void ETH_SetRxInterruptWatchdogTimer(ETH_Module* ETHx, uint32_t CntUnit, uint32_t CntValue); +uint32_t ETH_GetCurrentTxDescriptorAddress(ETH_Module* ETHx); +uint32_t ETH_GetCurrentRxDescriptorAddress(ETH_Module* ETHx); +uint32_t ETH_GetCurrentTxBufferAddress(ETH_Module* ETHx); +uint32_t ETH_GetCurrentRxBufferAddress(ETH_Module* ETHx); +uint8_t ETH_GetTxDMAErrorType(ETH_Module* ETHx); +uint8_t ETH_GetRxDMAErrorType(ETH_Module* ETHx); +uint16_t ETH_GetDMACh0DroppedPacketCounter(ETH_Module* ETHx); +uint16_t ETH_GetDMACh0ERICounter(ETH_Module* ETHx); + +EthFuncStatusType ETH_RxDescAssignMemory(ETH_InfoType* pInfo, uint32_t Index, uint8_t* pBuffer1, uint8_t* pBuffer2); +EthFuncStatusType ETH_BuildRxDescriptors(ETH_Module* ETHx, ETH_InfoType* pInfo); +EthFuncStatusType ETH_PrepareTxDescriptors(ETH_Module* ETHx, ETH_InfoType* pInfo, ETH_TxPacketType* pTxPacket, uint32_t ItMode); +EthFuncStatusType ETH_Transmit(ETH_Module* ETHx, ETH_InfoType* pInfo, ETH_TxPacketType* pTxPacket, uint32_t Timeout); +EthFuncStatusType ETH_TransmitIT(ETH_Module* ETHx, ETH_InfoType* pInfo, ETH_TxPacketType* pTxPacket); +uint8_t ETH_IsRxDataAvailable(ETH_InfoType* pInfo); +EthFuncStatusType ETH_GetRxDataBuffer(ETH_InfoType* pInfo, ETH_BufferType* pRxBuffer); +uint32_t ETH_GetRxDataLength(ETH_InfoType* pInfo); +EthFuncStatusType ETH_GetRxPacketInfo(ETH_InfoType* pInfo, ETH_RxPacketType* pRxPacket); +void ETH_Start(ETH_Module* ETHx); +void ETH_StartIT(ETH_Module* ETHx, ETH_InfoType* pInfo); +void ETH_Stop(ETH_Module* ETHx); +void ETH_StopIT(ETH_Module* ETHx, ETH_InfoType* pInfo); + +FlagStatus ETH_GetTxDescFlagStatus(ETH_DMADescType* pTxDescriptor, uint32_t Flag); +FlagStatus ETH_GetRxDescExtendedFlagStatus(ETH_DMADescType* pRxDescriptor, uint32_t Flag); +FlagStatus ETH_GetRxDescFilterFlagStatus(ETH_DMADescType* pRxDescriptor, uint32_t Flag); +FlagStatus ETH_GetRxDescFlagStatus(ETH_DMADescType* pRxDescriptor, uint32_t Flag); +FlagStatus ETH_GetFlowControlBusyStatus(ETH_Module* ETHx); +INTStatus ETH_GetMACInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag); +FlagStatus ETH_GetMACTxRxFlagStatus(ETH_Module* ETHx, uint32_t Flag); +FlagStatus ETH_GetPMTFlagStatus(ETH_Module* ETHx, uint32_t Flag); +INTStatus ETH_GetMMCRxInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag); +INTStatus ETH_GetMMCTxInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag); +FlagStatus ETH_GetMACTimeStampFlagStatus(ETH_Module* ETHx, uint32_t Flag); +FlagStatus ETH_GetFlushTransmitQueueStatus(ETH_Module* ETHx); +INTStatus ETH_GetMTLInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag); +INTStatus ETH_GetMTLQueueInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag); +FlagStatus ETH_GetMTLCounterFlagStatus(ETH_Module* ETHx, uint32_t Flag); +FlagStatus ETH_GetSoftwareResetStatus(ETH_Module* ETHx); +INTStatus ETH_GetDMAInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag); +uint32_t ETH_GetDMACh0TxProcessStatus(ETH_Module* ETHx); +uint32_t ETH_GetDMACh0RxProcessStatus(ETH_Module* ETHx); +FlagStatus ETH_GetDMACh0FlagStatus(ETH_Module* ETHx, uint32_t Flag); +INTStatus ETH_GetDMACh0InterruptStatus(ETH_Module* ETHx, uint32_t IntFlag); + +void ETH_ClearMACPHYInterruptFlag(ETH_Module* ETHx); +void ETH_ClearPMTFlag(ETH_Module* ETHx, uint32_t Flag); +void ETH_ClearMMCRxInterruptFlag(ETH_Module* ETHx, uint32_t IntFlag); +void ETH_ClearMMCTxInterruptFlag(ETH_Module* ETHx, uint32_t IntFlag); +void ETH_ClearMACTimeStampFlag(ETH_Module* ETHx, uint32_t Flag); +void ETH_ClearMACTxRxFlag(ETH_Module* ETHx, uint32_t Flag); +void ETH_ClearMACMDIOInterruptFlag(ETH_Module* ETHx); +void ETH_ClearMTLQueueInterruptFlag(ETH_Module* ETHx, uint32_t IntFlag); +void ETH_ClearDMACh0Flag(ETH_Module* ETHx, uint32_t Flag); +void ETH_ClearDMACh0InterruptFlag(ETH_Module* ETHx, uint32_t IntFlag); + +void ETH_ConfigMACInterrupt(ETH_Module* ETHx, uint32_t Interrupt, FunctionalStatus Cmd); +void ETH_ConfigMMCRxInterrupt(ETH_Module* ETHx, uint32_t Interrupt, FunctionalStatus Cmd); +void ETH_ConfigMMCTxInterrupt(ETH_Module* ETHx, uint32_t Interrupt, FunctionalStatus Cmd); +void ETH_ConfigMTLQueueInterrupt(ETH_Module* ETHx, uint32_t Interrupt, FunctionalStatus Cmd); +void ETH_ConfigDMACh0Interrupt(ETH_Module* ETHx, uint32_t Interrupt, FunctionalStatus Cmd); + +/*** ETH Driving Functions Declaration End ***/ + + +#ifdef __cplusplus +} +#endif + + +#endif /* __N32H76X_78X_ETH_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_exti.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_exti.h new file mode 100644 index 0000000000..34cef24979 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_exti.h @@ -0,0 +1,200 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_exti.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_EXTI_H__ +#define __N32H76X_78X_EXTI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "n32h76x_78x.h" + +/*** EXTI Structure Definition Start ***/ + + + +/** EXTI mode enumeration **/ +typedef enum +{ + EXTI_Mode_Interrupt = 0x60, + EXTI_Mode_Event = 0xA0, +}EXTIMode_TypeDef; + +/** EXTI Trigger enumeration **/ +typedef enum +{ + EXTI_Trigger_Rising = 0x00, + EXTI_Trigger_Falling = 0x20, + EXTI_Trigger_Rising_Falling = 0x10 +}EXTITrigger_TypeDef; + +/** EXTI Init Structure definition **/ +typedef struct +{ + uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled. */ + + EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines.*/ + + EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. */ + + FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines. */ +} EXTI_InitType; + +/*** EXTI Structure Definition End ***/ + + +/*** EXTI Macro Definition Start ***/ +/** EXTI_Lines **/ +#define EXTI_LINE0 ((uint32_t)0) /* External interrupt line 0 */ +#define EXTI_LINE1 ((uint32_t)1) /* External interrupt line 1 */ +#define EXTI_LINE2 ((uint32_t)2) /* External interrupt line 2 */ +#define EXTI_LINE3 ((uint32_t)3) /* External interrupt line 3 */ +#define EXTI_LINE4 ((uint32_t)4) /* External interrupt line 4 */ +#define EXTI_LINE5 ((uint32_t)5) /* External interrupt line 5 */ +#define EXTI_LINE6 ((uint32_t)6) /* External interrupt line 6 */ +#define EXTI_LINE7 ((uint32_t)7) /* External interrupt line 7 */ +#define EXTI_LINE8 ((uint32_t)8) /* External interrupt line 8 */ +#define EXTI_LINE9 ((uint32_t)9) /* External interrupt line 9 */ +#define EXTI_LINE10 ((uint32_t)10) /* External interrupt line 10 */ +#define EXTI_LINE11 ((uint32_t)11) /* External interrupt line 11 */ +#define EXTI_LINE12 ((uint32_t)12) /* External interrupt line 12 */ +#define EXTI_LINE13 ((uint32_t)13) /* External interrupt line 13 */ +#define EXTI_LINE14 ((uint32_t)14) /* External interrupt line 14 */ +#define EXTI_LINE15 ((uint32_t)15) /* External interrupt line 15 */ +#define EXTI_LINE16 ((uint32_t)16) /* External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE17 ((uint32_t)17) /* External interrupt line 17 Connected to the RTC_ALARM */ +#define EXTI_LINE18 ((uint32_t)18) /* External interrupt line 18 Connected to the RTC tamper or timestamp*/ +#define EXTI_LINE19 ((uint32_t)19) /* External interrupt line 19 Connected to the RTC wakeup timer */ +#define EXTI_LINE20 ((uint32_t)20) /* External interrupt line 20 Connected to the COMP1 output */ +#define EXTI_LINE21 ((uint32_t)21) /* External interrupt line 21 Connected to the COMP2 output */ +#define EXTI_LINE22 ((uint32_t)22) /* External interrupt line 22 Connected to the COMP3 output */ +#define EXTI_LINE23 ((uint32_t)23) /* External interrupt line 23 Connected to the COMP4 output */ +#define EXTI_LINE24 ((uint32_t)100) /* External interrupt line 24 Connected to the SDMMC1_wkup */ +#define EXTI_LINE25 ((uint32_t)101) /* External interrupt line 25 Connected to the SDMMC2_wkup*/ +#define EXTI_LINE49 ((uint32_t)42) /* External interrupt line 49 Connected to the LPUART1 wakeup */ +#define EXTI_LINE51 ((uint32_t)127) /* External interrupt line 51 Connected to the DCMUA Interrupt */ +#define EXTI_LINE52 ((uint32_t)43) /* External interrupt line 52 Connected to the LPUART2 wakeup */ +#define EXTI_LINE54 ((uint32_t)130) /* External interrupt line 54 Connected to the DCMUB Interruptt */ +#define EXTI_LINE55 ((uint32_t)139) /* External interrupt line 55 Connected to the CM7 AHBS_ABORT */ +#define EXTI_LINE56 ((uint32_t)138) /* External interrupt line 56 Connected to the CM7_AHBSRDY_ERROR */ +#define EXTI_LINE62 ((uint32_t)48) /* External interrupt line 62 Connected to the USB1 wakeup */ +#define EXTI_LINE63 ((uint32_t)49) /* External interrupt line 63 Connected to the USB2 wakeup */ +#define EXTI_LINE64 ((uint32_t)44) /* External interrupt line 64 Connected to the CM7 Correctable Error on Cache Read */ +#define EXTI_LINE65 ((uint32_t)45) /* External interrupt line 65 Connected to the CM7 Fatal Error on Cache Read */ +#define EXTI_LINE66 ((uint32_t)37) /* External interrupt line 66 Connected to the LPTIM1 wakeup */ +#define EXTI_LINE67 ((uint32_t)38) /* External interrupt line 67 Connected to the LPTIM2 wakeup */ +#define EXTI_LINE68 ((uint32_t)39) /* External interrupt line 68 Connected to the LPTIM3 wakeup */ +#define EXTI_LINE69 ((uint32_t)40) /* External interrupt line 69 Connected to the LPTIM4 wakeup */ +#define EXTI_LINE70 ((uint32_t)31) /* External interrupt line 70 Connected to the wakeup1 */ +#define EXTI_LINE71 ((uint32_t)32) /* External interrupt line 71 Connected to the wakeup2 */ +#define EXTI_LINE72 ((uint32_t)33) /* External interrupt line 72 Connected to the wakeup3 */ +#define EXTI_LINE73 ((uint32_t)34) /* External interrupt line 73 Connected to the wakeup4 */ +#define EXTI_LINE74 ((uint32_t)35) /* External interrupt line 74 Connected to the wakeup5 */ +#define EXTI_LINE75 ((uint32_t)36) /* External interrupt line 75 Connected to the wakeup6 */ +#define EXTI_LINE76 ((uint32_t)152) /* External interrupt line 76 Connected to the RCC interrupt */ +#define EXTI_LINE77 ((uint32_t)153) /* External interrupt line 77 Connected to the SEMA1 interrupt */ +#define EXTI_LINE78 ((uint32_t)154) /* External interrupt line 78 Connected to the SEMA2 interrupt */ +#define EXTI_LINE79 ((uint32_t)155) /* External interrupt line 79 Connected to the CortexM4 SEV interrupt */ +#define EXTI_LINE80 ((uint32_t)156) /* External interrupt line 80 Connected to the CortexM7 SEV interrupt */ +#define EXTI_LINE81 ((uint32_t)24) /* External interrupt line 81 Connected to the WWDG1 reset */ +#define EXTI_LINE82 ((uint32_t)25) /* External interrupt line 82 Connected to the WWDG2 reset */ +#define EXTI_LINE83 ((uint32_t)102) /* External interrupt line 83 Connected to the ETH1 Wkup */ +#define EXTI_LINE84 ((uint32_t)103) /* External interrupt line 84 Connected to the ETH2 Wkup */ +#define EXTI_LINE85 ((uint32_t)157) /* External interrupt line 85 Connected to the HSECSS interrupt */ +#define EXTI_LINE86 ((uint32_t)41) /* External interrupt line 86 Connected to the LPTIM5 wakeup */ +#define EXTI_LINE87 ((uint32_t)28) /* External interrupt line 87 Connected to the DSI Error Event */ +#define EXTI_LINE88 ((uint32_t)51) /* External interrupt line 88 Connected to the BKP EMC */ +#define EXTI_LINE89 ((uint32_t)50) /* External interrupt line 89 Connected to the VDDD EMC */ + +/** EXTI_TSSEL_Line **/ +#define EXTI_TSSEL_LINE_MASK (EXTI_TS_SEL_TSSEL) /** External interrupt line all **/ +#define EXTI_TSSEL_LINE0 (EXTI_TS_SEL_EXTI0) /** External interrupt line 0 **/ +#define EXTI_TSSEL_LINE1 (EXTI_TS_SEL_EXTI1) /** External interrupt line 1 **/ +#define EXTI_TSSEL_LINE2 (EXTI_TS_SEL_EXTI2) /** External interrupt line 2 **/ +#define EXTI_TSSEL_LINE3 (EXTI_TS_SEL_EXTI3) /** External interrupt line 3 **/ +#define EXTI_TSSEL_LINE4 (EXTI_TS_SEL_EXTI4) /** External interrupt line 4 **/ +#define EXTI_TSSEL_LINE5 (EXTI_TS_SEL_EXTI5) /** External interrupt line 5 **/ +#define EXTI_TSSEL_LINE6 (EXTI_TS_SEL_EXTI6) /** External interrupt line 6 **/ +#define EXTI_TSSEL_LINE7 (EXTI_TS_SEL_EXTI7) /** External interrupt line 7 **/ +#define EXTI_TSSEL_LINE8 (EXTI_TS_SEL_EXTI8) /** External interrupt line 8 **/ +#define EXTI_TSSEL_LINE9 (EXTI_TS_SEL_EXTI9) /** External interrupt line 9 **/ +#define EXTI_TSSEL_LINE10 (EXTI_TS_SEL_EXTI10) /** External interrupt line 10 **/ +#define EXTI_TSSEL_LINE11 (EXTI_TS_SEL_EXTI11) /** External interrupt line 11 **/ +#define EXTI_TSSEL_LINE12 (EXTI_TS_SEL_EXTI12) /** External interrupt line 12 **/ +#define EXTI_TSSEL_LINE13 (EXTI_TS_SEL_EXTI13) /** External interrupt line 13 **/ +#define EXTI_TSSEL_LINE14 (EXTI_TS_SEL_EXTI14) /** External interrupt line 14 **/ +#define EXTI_TSSEL_LINE15 (EXTI_TS_SEL_EXTI15) /** External interrupt line 15 **/ + +/*** EXTI Macro Definition End ***/ + +/** EXTI Driving Functions Declaration **/ +void EXTI_DeInit(void); + +void EXTI_InitPeripheral(EXTI_InitType* EXTI_InitStruct ); +void EXTI_InitStruct(EXTI_InitType* EXTI_InitStruct ); +void EXTI_TriggerSWInt(uint32_t EXTI_Line ); +FlagStatus EXTI_GetStatusFlag( uint32_t EXTI_Line); +void EXTI_ClrStatusFlag(uint32_t EXTI_Line); +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); +void EXTI_ClrITPendBit(uint32_t EXTI_Line); +void EXTI_RTCTimeStampSel(uint32_t EXTI_TSSEL_Line); + +#ifdef __cplusplus +} + +#endif + +#endif /* __N32H76X_78X_EXTI_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_fdcan.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_fdcan.h new file mode 100644 index 0000000000..5836d5093c --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_fdcan.h @@ -0,0 +1,1718 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_fdcan.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_FDCAN_H__ +#define __N32H76X_78X_FDCAN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/** FDCAN Message RAM blocks **/ +typedef struct +{ + uint32_t StdFilterStrAddr; /* Specifies the Standard Filter List Start Address. + This parameter must be 32-bit alignment */ + uint32_t ExtFilterStrAddr; /* Specifies the Extended Filter List Start Address. + This parameter must be a 32-bit alignment */ + uint32_t RxFIFO0StrAddr; /* Specifies the Rx FIFO 0 Start Address. + This parameter must be a 32-bit alignment */ + uint32_t RxFIFO1StrAddr; /* Specifies the Rx FIFO 1 Start Address. + This parameter must be a 32-bit alignment */ + uint32_t RxBufferStrAddr; /* Specifies the Rx Buffer Start Address. + This parameter must be a 32-bit alignment */ + uint32_t TxEventFIFOStrAddr; /* Specifies the Tx Event FIFO Start Address. + This parameter must be a 32-bit alignment */ + uint32_t TxBufferStrAddr; /* Specifies the Tx Buffers Start Address. + This parameter must be a 32-bit alignment */ + uint32_t TxFIFOQueueStrAddr; /* Specifies the Tx FIFO/Queue Start Address. + This parameter must be a 32-bit alignment */ + uint32_t TTMemoryStrAddr; /* Specifies the Trigger Memory Start Address. + This parameter must be a 32-bit alignment */ + uint32_t EndAddress; /* Specifies the End Address of the allocated RAM. + This parameter must be a 32-bit alignment */ + uint32_t LastTxFifoQReqBuf; /* FDCAN Tx buffer index of latest Tx FIFO/Queue request */ + uint32_t RxFifo0Size; /* Specifies the number of Rx FIFO0 Elements. + This parameter must be a value between 0 and 64. */ + uint32_t RxFifo1Size; /* Specifies the number of Rx FIFO1 Elements. + This parameter must be a value between 0 and 64. */ + uint32_t RxBufferSize; /* Specifies the number of Dedicated Rx Buffer elements. + This parameter must be a value between 0 and 64. */ + uint32_t TxBufferSize; /* Specifies the number of Dedicated Tx Buffers. + This parameter must be a value between 0 and 32. */ + uint32_t RxFifo0DataSize; /* Specifies the Data Field Size in an Rx FIFO 0 element,counted in words. + This parameter must be one of the following values: + - FDCAN_DATA_BYTES_8 + - FDCAN_DATA_BYTES_12 + - FDCAN_DATA_BYTES_16 + - FDCAN_DATA_BYTES_20 + - FDCAN_DATA_BYTES_24 + - FDCAN_DATA_BYTES_32 + - FDCAN_DATA_BYTES_48 + - FDCAN_DATA_BYTES_64 */ + uint32_t RxFifo1DataSize; /* Specifies the Data Field Size in an Rx FIFO 1 element,counted in words. + This parameter must be one of the following values: + - FDCAN_DATA_BYTES_8 + - FDCAN_DATA_BYTES_12 + - FDCAN_DATA_BYTES_16 + - FDCAN_DATA_BYTES_20 + - FDCAN_DATA_BYTES_24 + - FDCAN_DATA_BYTES_32 + - FDCAN_DATA_BYTES_48 + - FDCAN_DATA_BYTES_64 */ + uint32_t RxBufferDataSize; /* Specifies the Data Field Size in an Rx Buffer element,counted in words. + This parameter must be one of the following values: + - FDCAN_DATA_BYTES_8 + - FDCAN_DATA_BYTES_12 + - FDCAN_DATA_BYTES_16 + - FDCAN_DATA_BYTES_20 + - FDCAN_DATA_BYTES_24 + - FDCAN_DATA_BYTES_32 + - FDCAN_DATA_BYTES_48 + - FDCAN_DATA_BYTES_64 */ + uint32_t TxBufferDataSize; /* Specifies the Data Field Size in a Dedicated Tx Buffer element,counted in words. + This parameter must be one of the following values: + - FDCAN_DATA_BYTES_8 + - FDCAN_DATA_BYTES_12 + - FDCAN_DATA_BYTES_16 + - FDCAN_DATA_BYTES_20 + - FDCAN_DATA_BYTES_24 + - FDCAN_DATA_BYTES_32 + - FDCAN_DATA_BYTES_48 + - FDCAN_DATA_BYTES_64 */ +} FDCAN_MsgRamType; + +/** FDCAN Init Structure Definition **/ +typedef struct +{ + uint32_t FrameFormat; /* FDCAN frame format. This parameter must be one of the following values: + - FDCAN_FRAME_CLASSIC + - FDCAN_FRAME_FD_NO_BRS + - FDCAN_FRAME_FD_BRS */ + uint32_t Mode; /* FDCAN operation mode. This parameter must be one of the following values: + - FDCAN_MODE_NORMAL + - FDCAN_MODE_RESTRICTED_OPERATION + - FDCAN_MODE_BUS_MONITORING + - FDCAN_MODE_INTERNAL_LOOPBACK + - FDCAN_MODE_EXTERNAL_LOOPBACK */ + uint32_t Prescaler; /* Specifies the Nominal Bit Rate Prescaler. + This parameter must be a value between 1 and 512. */ + uint32_t SyncJumpWidth; /* Specifies the Nominal (Re)Synchronization Jump Width. + This parameter must be a value between 1 and 128. */ + uint32_t TimeSeg1; /* Specifies the Nominal time segment before sample point. + This parameter must be a value between 2 and 256. */ + uint32_t TimeSeg2; /* Specifies the Nominal time segment after sample point. + This parameter must be a value between 2 and 128. */ + + uint32_t DataPrescaler; /* Specifies the Data Bit Rate Prescaler. + This parameter must be a value between 1 and 32. */ + uint32_t DataSyncJumpWidth; /* Specifies the Data (Re)Synchronization Jump Width. + This parameter must be a value between 1 and 16. */ + uint32_t DataTimeSeg1; /* Specifies the Data time segment before sample point. + This parameter must be a value between 1 and 32. */ + uint32_t DataTimeSeg2; /* Specifies the Data time segment after sample point. + This parameter must be a value between 1 and 16. */ + + uint32_t MsgRamStrAddr; /* Specifies the Message RAM start address. + This parameter must be one of the following values: + - FDCAN_START_ADDRESS_SRAM5BANK1 , 0x30050000 as FDCAN base address. + - FDCAN_START_ADDRESS_SRAM5BANK2 , 0x30054000 as FDCAN base address.*/ + uint32_t MsgRamOffset; /* Specifies the valid Message RAM word address offset, Overall offset of FDCAN nodes. + This parameter must be a value between 0 and 0x4000 */ + uint32_t StdFilterSize; /* Specifies the number of standard Message ID filters. + This parameter must be a value between 0 and 128. */ + uint32_t ExtFilterSize; /* pecifies the number of extended Message ID filters. + This parameter must be a value between 0 and 64. */ + uint32_t RxFifo0Size; /* Specifies the number of Rx FIFO0 Elements. + This parameter must be a value between 0 and 64. */ + uint32_t RxFifo1Size; /* Specifies the number of Rx FIFO1 Elements. + This parameter must be a value between 0 and 64. */ + uint32_t RxBufferSize; /* Specifies the number of Dedicated Rx Buffer elements. + This parameter must be a value between 0 and 64. */ + uint32_t TxEventSize; /* Specifies the number of Tx Event FIFO elements. + This parameter must be a value between 0 and 32. */ + uint32_t TxBufferSize; /* Specifies the number of Dedicated Tx Buffers. + This parameter must be a value between 0 and 32. */ + uint32_t RxFifo0DataSize; /* Specifies the Data Field Size in an Rx FIFO 0 element,counted in words. + This parameter must be one of the following values: + - FDCAN_DATA_BYTES_8 + - FDCAN_DATA_BYTES_12 + - FDCAN_DATA_BYTES_16 + - FDCAN_DATA_BYTES_20 + - FDCAN_DATA_BYTES_24 + - FDCAN_DATA_BYTES_32 + - FDCAN_DATA_BYTES_48 + - FDCAN_DATA_BYTES_64 */ + uint32_t RxFifo1DataSize; /* Specifies the Data Field Size in an Rx FIFO 1 element,counted in words. + This parameter must be one of the following values: + - FDCAN_DATA_BYTES_8 + - FDCAN_DATA_BYTES_12 + - FDCAN_DATA_BYTES_16 + - FDCAN_DATA_BYTES_20 + - FDCAN_DATA_BYTES_24 + - FDCAN_DATA_BYTES_32 + - FDCAN_DATA_BYTES_48 + - FDCAN_DATA_BYTES_64 */ + uint32_t RxBufferDataSize; /* Specifies the Data Field Size in an Rx Buffer element,counted in words. + This parameter must be one of the following values: + - FDCAN_DATA_BYTES_8 + - FDCAN_DATA_BYTES_12 + - FDCAN_DATA_BYTES_16 + - FDCAN_DATA_BYTES_20 + - FDCAN_DATA_BYTES_24 + - FDCAN_DATA_BYTES_32 + - FDCAN_DATA_BYTES_48 + - FDCAN_DATA_BYTES_64 */ + uint32_t TxBufferDataSize; /* Specifies the Data Field Size in a Dedicated Tx Buffer element,counted in words. + This parameter must be one of the following values: + - FDCAN_DATA_BYTES_8 + - FDCAN_DATA_BYTES_12 + - FDCAN_DATA_BYTES_16 + - FDCAN_DATA_BYTES_20 + - FDCAN_DATA_BYTES_24 + - FDCAN_DATA_BYTES_32 + - FDCAN_DATA_BYTES_48 + - FDCAN_DATA_BYTES_64 */ + + uint32_t TxFifoQueueMode; /* Tx FIFO/Queue Mode selection. + This parameter must be one of the following values: + - FDCAN_TX_FIFO_MODE + - FDCAN_TX_QUEUE_MODE */ + uint32_t TxFifoQueueSize; /* Specifies the number of Tx Buffers used for Tx FIFO/Queue. + This parameter must be a value between 0 and 32. */ + FDCAN_MsgRamType *pMsgInfo; /* Pointer to the message info block used for current FDCANx . */ + FunctionalState AutoRetransmission; /* Enable or disable the automatic retransmission mode. + This parameter must be set to ENABLE or DISABLE. */ + FunctionalState TransmitPause; /* Enable or disable the Transmit Pause feature. + This parameter must be set to ENABLE or DISABLE. */ + FunctionalState ProtocolException; /* Enable or disable the Protocol Exception Handling. + This parameter must be set to ENABLE or DISABLE. */ +} FDCAN_InitType; + +/** FDCAN filter structure definition **/ +typedef struct +{ + uint32_t IdType; /* Specifies the identifier type. + This parameter must be one of the following values: + - FDCAN_STANDARD_ID + - FDCAN_EXTENDED_ID */ + uint32_t FilterIndex; /* Specifies the filter which will be initialized. + This parameter must be a value between: + - 0 and 127, if IdType is FDCAN_STANDARD_ID + - 0 and 63, if IdType is FDCAN_EXTENDED_ID */ + uint32_t FilterType; /* Specifies the filter type. + This parameter must be one of the following values: + - FDCAN_FILTER_RANGE + - FDCAN_FILTER_DUAL + - FDCAN_FILTER_MASK + - FDCAN_FILTER_RANGE_NO_EIDM */ + uint32_t FilterConfig; /* Specifies the filter configuration. + This parameter must be one of the following values: + -FDCAN_FILTER_DISABLE + -FDCAN_FILTER_TO_RXFIFO0 + -FDCAN_FILTER_TO_RXFIFO1 + -FDCAN_FILTER_REJECT + -FDCAN_FILTER_HP + -FDCAN_FILTER_TO_RXFIFO0_HP + -FDCAN_FILTER_TO_RXFIFO1_HP + -FDCAN_FILTER_TO_RXBUFFER */ + uint32_t FilterID1; /* Specifies the filter identification 1. + This parameter must be a value between: + - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID */ + uint32_t FilterID2; /* Specifies the filter identification 2. + This parameter must be a value between: + - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID + This parameter is ignored if FilterConfig is set to FDCAN_FILTER_TO_RXBUFFER. */ + uint32_t RxBufferIndex; /* Specifies the index of Rx buffer in which the matching message will be stored. + This parameter must be a value between 0 and 63. + And it is ignored if FilterConfig is not FDCAN_FILTER_TO_RXBUFFER */ +} FDCAN_FilterType; + + +/** FDCAN Tx buffer header structure definition **/ +typedef struct +{ + uint32_t IdType; /* Specifies the identifier type for the message that will be transmitted. + This parameter must be one of the following values: + - FDCAN_STANDARD_ID + - FDCAN_EXTENDED_ID */ + uint32_t ID; /* Specifies the identifier. + This parameter must be a value between: + - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID */ + uint32_t TxFrameType; /* Specifies the frame type of the message that will be transmitted. + This parameter must be one of the following values: + - FDCAN_DATA_FRAME + - FDCAN_REMOTE_FRAME */ + uint32_t DataLength; /* Specifies the length of the data frame that will be transmitted. + This parameter must be one of the following values: + - FDCAN_DLC_BYTES_0 + - FDCAN_DLC_BYTES_1 + - FDCAN_DLC_BYTES_2 + - FDCAN_DLC_BYTES_3 + - FDCAN_DLC_BYTES_4 + - FDCAN_DLC_BYTES_5 + - FDCAN_DLC_BYTES_6 + - FDCAN_DLC_BYTES_7 + - FDCAN_DLC_BYTES_8 + - FDCAN_DLC_BYTES_12 + - FDCAN_DLC_BYTES_16 + - FDCAN_DLC_BYTES_20 + - FDCAN_DLC_BYTES_24 + - FDCAN_DLC_BYTES_32 + - FDCAN_DLC_BYTES_48 + - FDCAN_DLC_BYTES_64 */ + uint32_t ErrorState; /* Specifies the error state indicator. + This parameter must be one of the following values: + - FDCAN_ESI_ACTIVE + - FDCAN_ESI_PASSIVE */ + uint32_t BitRateSwitch; /* Specifies whether the data frame transmitted with or without bit rate switching. + This parameter must be one of the following values: + - FDCAN_BRS_OFF + - FDCAN_BRS_ON */ + uint32_t FDFormat; /* Specifies whether the Tx frame transmitted in classic or FD format. + This parameter must be one of the following values: + - FDCAN_CLASSIC_CAN + - FDCAN_FD_CAN */ + uint32_t TxEventFifo; /* Specifies the event FIFO control. + This parameter must be one of the following values: + - FDCAN_NO_TX_EVENTS + - FDCAN_STORE_TX_EVENTS */ + uint32_t MsgMarker; /* Specifies the message marker copied into Tx Event FIFO element. + This parameter must be a value between 0 and 0xFF */ +} FDCAN_TxHeaderType; + +/** FDCAN Rx header structure definition **/ +typedef struct +{ + uint32_t IdType; /* Specifies the identifier type of the received message. + This parameter must be one of the following values: + - FDCAN_STANDARD_ID + - FDCAN_EXTENDED_ID */ + uint32_t ID; /* Specifies the identifier type for the message that will be transmitted. + This parameter must be a value between: + - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID */ + uint32_t RxFrameType; /* Specifies the the received message frame type. + This parameter must be one of the following values: + - FDCAN_DATA_FRAME + - FDCAN_REMOTE_FRAME */ + uint32_t DataLength; /* Specifies the received frame length. + This parameter must be one of the following values: + - FDCAN_DLC_BYTES_0 + - FDCAN_DLC_BYTES_1 + - FDCAN_DLC_BYTES_2 + - FDCAN_DLC_BYTES_3 + - FDCAN_DLC_BYTES_4 + - FDCAN_DLC_BYTES_5 + - FDCAN_DLC_BYTES_6 + - FDCAN_DLC_BYTES_7 + - FDCAN_DLC_BYTES_8 + - FDCAN_DLC_BYTES_12 + - FDCAN_DLC_BYTES_16 + - FDCAN_DLC_BYTES_20 + - FDCAN_DLC_BYTES_24 + - FDCAN_DLC_BYTES_32 + - FDCAN_DLC_BYTES_48 + - FDCAN_DLC_BYTES_64 */ + uint32_t ErrorState; /* Specifies the error state indicator. + This parameter must be one of the following values: + - FDCAN_ESI_ACTIVE + - FDCAN_ESI_PASSIVE */ + uint32_t BitRateSwitch; /* Specifies whether the Rx frame is received with or without bit + This parameter must be one of the following values: + - FDCAN_BRS_OFF + - FDCAN_BRS_ON */ + uint32_t FDFormat; /* Specifies whether the Rx frame is received in classic or FD + This parameter must be one of the following values: + - FDCAN_CLASSIC_CAN + - FDCAN_FD_CAN */ + uint32_t RxTimestamp; /* Specifies the timestamp counter value captured on start of frame reception. + This parameter must be a value between 0 and 0xFFFF */ + uint32_t FilterIndex; /* Specifies the index of matching Rx acceptance filter element. + This parameter must be a value between: + - 0 and 127, if IdType is FDCAN_STANDARD_ID + - 0 and 63, if IdType is FDCAN_EXTENDED_ID */ + uint32_t Matching; /* Specifies whether the accepted frame did not match any Rx filter. + This parameter must be one of the following values: + - FDCAN_ACCEPT_MACHING_FIDX + - FDCAN_ACCEPT_NON_MATCHING */ + +} FDCAN_RxHeaderType; + +/** FDCAN Tx event FIFO structure definition **/ +typedef struct +{ + uint32_t IdType; /* Specifies the identifier type for the message that will be transmitted. + This parameter must be one of the following values: + - FDCAN_STANDARD_ID + - FDCAN_EXTENDED_ID */ + uint32_t ID; /* Specifies the identifier. + This parameter must be a value between: + - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID */ + uint32_t TxFrameType; /* Specifies the frame type of the message that will be transmitted. + This parameter must be one of the following values: + - FDCAN_DATA_FRAME + - FDCAN_REMOTE_FRAME */ + uint32_t DataLength; /* Specifies the length of the data frame that will be transmitted. + This parameter must be one of the following values: + - FDCAN_DLC_BYTES_0 + - FDCAN_DLC_BYTES_1 + - FDCAN_DLC_BYTES_2 + - FDCAN_DLC_BYTES_3 + - FDCAN_DLC_BYTES_4 + - FDCAN_DLC_BYTES_5 + - FDCAN_DLC_BYTES_6 + - FDCAN_DLC_BYTES_7 + - FDCAN_DLC_BYTES_8 + - FDCAN_DLC_BYTES_12 + - FDCAN_DLC_BYTES_16 + - FDCAN_DLC_BYTES_20 + - FDCAN_DLC_BYTES_24 + - FDCAN_DLC_BYTES_32 + - FDCAN_DLC_BYTES_48 + - FDCAN_DLC_BYTES_64 */ + uint32_t ErrorState; /* Specifies the error state indicator. + This parameter must be one of the following values: + - FDCAN_ESI_ACTIVE + - FDCAN_ESI_PASSIVE */ + uint32_t BitRateSwitch; /* Specifies whether the data frame transmitted with or without bit rate switching. + This parameter must be one of the following values: + - FDCAN_BRS_OFF + - FDCAN_BRS_ON */ + uint32_t FDFormat; /* Specifies whether the Tx frame transmitted in classic or FD format. + This parameter must be one of the following values: + - FDCAN_CLASSIC_CAN + - FDCAN_FD_CAN */ + uint32_t TxTimestamp; /* Specifies the timestamp counter value captured on start of frame transmission. + This parameter must be a value between 0 and 0xFFFF */ + uint32_t MsgMarker; /* Specifies the message marker copied from Tx buffer. + This parameter must be a value between 0 and 0xFF */ + uint32_t EventType; /* Specifies the event type. + This parameter must be one of the following values: + - FDCAN_TX_EVENT + - FDCAN_TX_IN_SPITE_OF_ABORT */ +} FDCAN_TxEventFifoType; + +/** FDCAN High Priority Message Status structure definition **/ +typedef struct +{ + uint32_t FilterList; /* Specifies the filter list of the matching filter element. + This parameter can be one of the following values: + - FDCAN_HP_STANDARD_FILTER_LIST + - FDCAN_HP_EXTENDED_FILTER_LIST */ + uint32_t FilterIndex; /* Specifies the index of matching filter element. + This parameter can be a value between: + - 0 and 127, if FilterList is FDCAN_HP_STANDARD_FILTER_LIST + - 0 and 63, if FilterList is FDCAN_HP_EXTENDED_FILTER_LIST */ + uint32_t MsgStore; /* Specifies the HP Message Storage. + This parameter can be one of the following values: + - FDCAN_HP_STORAGE_NO_FIFO + - FDCAN_HP_STORAGE_MSG_LOST + - FDCAN_HP_STORAGE_RXFIFO0 + - FDCAN_HP_STORAGE_RXFIFO1 */ + uint32_t MsgIndex; /* Specifies the Index of Rx FIFO element to which the message was stored. + This parameter is valid only when MessageStorage is one of the following values + - FDCAN_HP_STORAGE_RXFIFO0 + - FDCAN_HP_STORAGE_RXFIFO1 */ +} FDCAN_HpMsgStatus; + +/** FDCAN Protocol Status structure definition **/ +typedef struct +{ + uint32_t LastError; /* Specifies the type of the last error that occurred on the FDCAN bus. + This parameter can be one of the following values: + - FDCAN_LAST_ERROR_NONE + - FDCAN_LAST_ERROR_STUFF + - FDCAN_LAST_ERROR_FORM + - FDCAN_LAST_ERROR_ACK + - FDCAN_LAST_ERROR_BIT1 + - FDCAN_LAST_ERROR_BIT0 + - FDCAN_LAST_ERROR_CRC + - FDCAN_LAST_ERROR_NO_CHANGE */ + uint32_t LastDataError; /* Specifies the type of the last error that occurred in the data phase of a CAN FD frame. + This parameter can be one of the following values: + - FDCAN_LAST_DATA_ERROR_NONE + - FDCAN_LAST_DATA_ERROR_STUFF + - FDCAN_LAST_DATA_ERROR_FORM + - FDCAN_LAST_DATA_ERROR_ACK + - FDCAN_LAST_DATA_ERROR_BIT1 + - FDCAN_LAST_DATA_ERROR_BIT0 + - FDCAN_LAST_DATA_ERROR_CRC + - FDCAN_LAST_DATA_ERROR_NO_CHANGE */ + uint32_t Activity; /* Specifies the FDCAN module communication state. + This parameter can be one of the following values: + - FDCAN_COM_STATE_SYNC + - FDCAN_COM_STATE_IDLE + - FDCAN_COM_STATE_RX + - FDCAN_COM_STATE_TX */ + uint32_t Error; /* Specifies the FDCAN module error status. + This parameter can be one of the following values: + - FDCAN_ERROR_ACTIVE + - FDCAN_ERROR_PASSIVE */ + uint32_t Warning; /* Specifies the FDCAN module warning status. + This parameter can be one of the following values: + - FDCAN_WARNING_BELOW_96 + - FDCAN_WARNING_REACH_96 */ + uint32_t BusOff; /* Specifies the FDCAN module Bus_Off status. + This parameter can be one of the following values: + - FDCAN_BUS_ON + - FDCAN_BUS_OFF */ + uint32_t RxESIflag; /* Specifies ESI flag of last received CAN FD message. + This parameter can be one of the following values: + - FDCAN_ESI_NOT_SET + - FDCAN_ESI_SET */ + uint32_t RxBRSflag; /* Specifies BRS flag of last received CAN FD message. + This parameter can be one of the following values: + - FDCAN_BRS_NOT_SET + - FDCAN_BRS_SET */ + uint32_t RxFDFflag; /* Specifies if CAN FD message (FDF flag set) has been received since last protocol status. + This parameter can be one of the following values: + - FDCAN_FDMSG_NOT_RECEIVED + - FDCAN_FDMSG_RECEIVED */ + uint32_t Exception; /* Specifies the FDCAN module Protocol Exception status. + This parameter can be one of the following values: + - FDCAN_NO_EXCEPTION + - FDCAN_HAVE_EXCEPTION */ + uint32_t TDCvalue; /* Specifies the Transmitter Delay Compensation Value. + This parameter can be a value between 0 and 127 */ + +} FDCAN_ProtocolStatus; + +/**FDCAN Error Counters structure definition **/ +typedef struct +{ + uint32_t TxErrorCnt; /* Specifies the Transmit Error Counter Value. + This parameter can be a value between 0 and 255 */ + uint32_t RxErrorCnt; /* Specifies the Receive Error Counter Value. + This parameter can be a value between 0 and 127 */ + uint32_t RxErrorPassive; /* Specifies the Receive Error Passive status. + This parameter can be one of the following values: + - FDCAN_RX_ERROR_BELOW_128 + - FDCAN_RX_ERROR_REACH_128 */ + uint32_t ErrorLogging; /* Specifies the Transmit/Receive error logging counter value. + This parameter can be a value between 0 and 255. */ +} FDCAN_ErrorCounters; + +/** FDCAN TT Init structure definition **/ +typedef struct +{ + uint32_t OperationMode; /* Specifies the FDCAN Operation Mode. + This parameter must be one of the following values: + - FDCAN_TT_COMMUNICATION_LEVEL1 + - FDCAN_TT_COMMUNICATION_LEVEL2 + - FDCAN_TT_COMMUNICATION_LEVEL0 */ + uint32_t GapEnable; /* Specifies the FDCAN TT Operation. + This parameter must be one of the following values: + - FDCAN_STRICTLY_TT_OPERATION + - FDCAN_EXT_EVT_SYNC_TT_OPERATION */ + uint32_t TimeMaster; /* Specifies whether the instance is a slave or a potential master. + This parameter must be one of the following values: + - FDCAN_TT_SLAVE + - FDCAN_TT_POTENTIAL_MASTER */ + uint32_t SyncDevLimit; /* Specifies the Synchronization Deviation Limit SDL of the TUR + numerator : TUR = (Numerator +/- SDL) / Denominator. + With : SDL = 2^(SyncDevLimit+5). + This parameter must be a value between 0 and 7 */ + uint32_t InitRefTrigOffset; /* Specifies the Initial Reference Trigger Offset. + This parameter must be a value between 0 and 127 */ + uint32_t ExternalClkSync; /* Enable or disable External Clock Synchronization. + This parameter must be one of the following values: + - FDCAN_TT_EXT_CLK_SYNC_DISABLE + - FDCAN_TT_EXT_CLK_SYNC_ENABLE + This parameter is ignored if OperationMode is FDCAN_TT_COMMUNICATION_LEVEL1 */ + uint32_t AppWdgLimit; /* Specifies the Application Watchdog Limit . + This parameter must be a value between 0 and 255. + This parameter is ignored if OperationMode is FDCAN_TT_COMMUNICATION_LEVEL0 */ + uint32_t GlobalTimeFilter; /* Enable or disable Global Time Filtering. + This parameter must be one of the following values: + - FDCAN_TT_GLOB_TIME_FILT_DISABLE + - FDCAN_TT_GLOB_TIME_FILT_ENABLE + This parameter is ignored if OperationMode is set to FDCAN_TT_COMMUNICATION_LEVEL1 */ + uint32_t ClockCalibration; /* Enable or disable Automatic Clock Calibration. + This parameter must be one of the following values: + - FDCAN_TT_AUTO_CLK_CALIB_DISABLE + - FDCAN_TT_AUTO_CLK_CALIB_ENABLE + This parameter is ignored if OperationMode is set to FDCAN_TT_COMMUNICATION_LEVEL1 */ + uint32_t EvtTrigPolarity; /* Specifies the Event Trigger Polarity. + This parameter must be one of the following values: + - FDCAN_TT_EVT_TRIG_POL_RISING + - FDCAN_TT_EVT_TRIG_POL_FALLING + This parameter is ignored if OperationMode is set to FDCAN_TT_COMMUNICATION_LEVEL0 */ + uint32_t BasicCycles; /* Specifies the number of basic cycles in the system matrix. + This parameter must be one of the following values: + - FDCAN_TT_CYCLES_PER_MATRIX_1 + - FDCAN_TT_CYCLES_PER_MATRIX_2 + - FDCAN_TT_CYCLES_PER_MATRIX_4 + - FDCAN_TT_CYCLES_PER_MATRIX_8 + - FDCAN_TT_CYCLES_PER_MATRIX_16 + - FDCAN_TT_CYCLES_PER_MATRIX_32 + - FDCAN_TT_CYCLES_PER_MATRIX_64 */ + uint32_t CycleStartSync; /* Enable or disable synchronization pulse output at pin fdcan1_soc. + This parameter must be one of the following values: + - FDCAN_TT_NO_SYNC_PULSE + - FDCAN_TT_SYNC_BASIC_CYCLE_START + - FDCAN_TT_SYNC_MATRIX_START */ + uint32_t TxEnableWindow; /* Specifies the length of Tx enable window in NTUs. + This parameter must be a value between 1 and 16 */ + uint32_t ExpTxTrigSize; /* Specifies the number of expected Tx_Triggers in the system matrix. + This is the sum of Tx_Triggers for exclusive, single arbitrating and + merged arbitrating windows. + This parameter must be a value between 0 and 4095 */ + uint32_t TURNumerator; /* Specifies the TUR (Time Unit Ratio) numerator. + It is advised to set this parameter to the largest applicable value. + This parameter must be a value between 0x10000 and 0x1FFFF */ + uint32_t TURDenominator; /* Specifies the TUR (Time Unit Ratio) denominator. + This parameter must be a value between 0x0001 and 0x3FFF */ + uint32_t TrigMemorySize; /* Specifies the number of trigger memory elements. + This parameter must be a value between 0 and 64 */ + uint32_t StopWatchTrigSel; /* Specifies the input to be used as stop watch trigger. + This parameter must be one of the following values: + - FDCAN_TT_STOP_WATCH_TRIGGER_0 + - FDCAN_TT_STOP_WATCH_TRIGGER_1 + - FDCAN_TT_STOP_WATCH_TRIGGER_2 + - FDCAN_TT_STOP_WATCH_TRIGGER_3 */ + uint32_t EventTrigSel; /* Specifies the input to be used as event trigger. + This parameter must be one of the following values: + - FDCAN_TT_EVENT_TRIGGER_0 + - FDCAN_TT_EVENT_TRIGGER_1 + - FDCAN_TT_EVENT_TRIGGER_2 + - FDCAN_TT_EVENT_TRIGGER_3 */ + +} FDCAN_TT_InitType; + +/** FDCAN Trigger structure definition **/ +typedef struct +{ + uint32_t TriggerIndex; /* Specifies the trigger which will be configured. + This parameter must be a number between 0 and 63 */ + uint32_t TimeMark; /* Specifies the cycle time for which the trigger becomes active. + This parameter must be a number between 0 and 0xFFFF */ + uint32_t RepeatFactor; /* Specifies the trigger repeat factor. + This parameter must be one of the following values: + - FDCAN_TT_REPEAT_EVERY_CYCLE + - FDCAN_TT_REPEAT_EVERY_2ND_CYCLE + - FDCAN_TT_REPEAT_EVERY_4TH_CYCLE + - FDCAN_TT_REPEAT_EVERY_8TH_CYCLE + - FDCAN_TT_REPEAT_EVERY_16TH_CYCLE + - FDCAN_TT_REPEAT_EVERY_32ND_CYCLE + - FDCAN_TT_REPEAT_EVERY_64TH_CYCLE */ + uint32_t StartCycle; /* Specifies the index of the first cycle in which the trigger becomes active. + This parameter must be a value between 0 and RepeatFactor. + This parameter is ignored if RepeatFactor is set to FDCAN_TT_REPEAT_EVERY_CYCLE. */ + uint32_t TmEventInt; /* Enable or disable the internal time mark event. + This parameter must be one of the following values: + - FDCAN_TT_TM_NO_INTERNAL_EVENT + - FDCAN_TT_TM_GEN_INTERNAL_EVENT */ + uint32_t TmEventExt; /* Enable or disable the external time mark event. + This parameter must be one of the following values: + - FDCAN_TT_TM_NO_EXTERNAL_EVENT + - FDCAN_TT_TM_GEN_EXTERNAL_EVENT */ + uint32_t TriggerType; /* Specifies the trigger type. + This parameter must be one of the following values: + - FDCAN_TT_TX_REF_TRIGGER + - FDCAN_TT_TX_REF_TRIGGER_GAP + - FDCAN_TT_TX_TRIGGER_SINGLE + - FDCAN_TT_TX_TRIGGER_CONTINUOUS + - FDCAN_TT_TX_TRIGGER_ARBITRATION + - FDCAN_TT_TX_TRIGGER_MERGED + - FDCAN_TT_WATCH_TRIGGER + - FDCAN_TT_WATCH_TRIGGER_GAP + - FDCAN_TT_RX_TRIGGER + - FDCAN_TT_TIME_BASE_TRIGGER + - FDCAN_TT_END_OF_LIST */ + uint32_t FilterType; /* Specifies the filter identifier type. + This parameter must be one of the following values: + - FDCAN_STANDARD_ID + - FDCAN_EXTENDED_ID */ + uint32_t TxBufferIndex; /* Specifies the index of the Tx buffer for which the trigger is valid. + This parameter must be one of the following values: + - FDCAN_TX_BUFFER0 + - FDCAN_TX_BUFFER1 + - FDCAN_TX_BUFFER2 + - FDCAN_TX_BUFFER3 + - FDCAN_TX_BUFFER4 + - FDCAN_TX_BUFFER5 + - FDCAN_TX_BUFFER6 + - FDCAN_TX_BUFFER7 + - FDCAN_TX_BUFFER8 + - FDCAN_TX_BUFFER9 + - FDCAN_TX_BUFFER10 + - FDCAN_TX_BUFFER11 + - FDCAN_TX_BUFFER12 + - FDCAN_TX_BUFFER13 + - FDCAN_TX_BUFFER14 + - FDCAN_TX_BUFFER15 + - FDCAN_TX_BUFFER16 + - FDCAN_TX_BUFFER17 + - FDCAN_TX_BUFFER18 + - FDCAN_TX_BUFFER19 + - FDCAN_TX_BUFFER20 + - FDCAN_TX_BUFFER21 + - FDCAN_TX_BUFFER22 + - FDCAN_TX_BUFFER23 + - FDCAN_TX_BUFFER24 + - FDCAN_TX_BUFFER25 + - FDCAN_TX_BUFFER26 + - FDCAN_TX_BUFFER27 + - FDCAN_TX_BUFFER28 + - FDCAN_TX_BUFFER29 + - FDCAN_TX_BUFFER30 + - FDCAN_TX_BUFFER31 */ + uint32_t FilterIndex; /* Specifies the filter for which the trigger is valid. + This parameter must be a number between: + - 0 and 127, if FilterType is FDCAN_STANDARD_ID + - 0 and 63, if FilterType is FDCAN_EXTENDED_ID */ +} FDCAN_TriggerType; + +/** FDCAN TT Operation Status structure definition **/ +typedef struct +{ + uint32_t ErrorLevel; /* Specifies the type of the TT operation error level. + This parameter can be one of the following values: + - FDCAN_TT_NO_ERROR + - FDCAN_TT_WARNING + - FDCAN_TT_ERROR + - FDCAN_TT_SEVERE_ERROR */ + uint32_t MasterState; /* Specifies the type of the TT master state. + This parameter can be one of the following values: + - FDCAN_TT_MASTER_OFF + - FDCAN_TT_TIME_SLAVE + - FDCAN_TT_BACKUP_TIME_MASTER + - FDCAN_TT_CURRENT_TIME_MASTER */ + uint32_t SyncState; /* Specifies the type of the TT synchronization state. + This parameter can be one of the following values: + - FDCAN_TT_OUT_OF_SYNC + - FDCAN_TT_SYNCHRONIZING + - FDCAN_TT_IN_GAP + - FDCAN_TT_IN_SCHEDULE */ + uint32_t GTimeQuality; /* Specifies the Quality of Global Time Phase. + This parameter is only relevant in Level 0 and Level 2, otherwise fixed to 0. + This parameter can be: + - FDCAN_TT_GTIME_NOT_VALID + - FDCAN_TT_GTIME_IN_MASTER_PHASE */ + uint32_t ClockQuality; /* Specifies the Quality of Clock Speed. + This parameter is only relevant in Level 0 and Level 2, otherwise fixed to 1. + This parameter can be: + - FDCAN_TT_LOCAL_CLOCK_NOT_SYNC + - FDCAN_TT_SYNC_DEV_LESS_THAN_SDL */ + uint32_t RefTrigOffset; /* Specifies the Actual Reference Trigger Offset Value. + This parameter can be a number between 0 and 0xFF */ + uint32_t GTimeDiscPending; /* Specifies the Global Time Discontinuity State. + This parameter can be: + - FDCAN_TT_NO_GTIME_PENDING + - FDCAN_TT_WATI_GTIMESYNC_PRESENT */ + uint32_t GapFinished; /* Specifies whether a Gap is finished. + This parameter can be: + - FDCAN_TT_GAP_RESET + - FDCAN_TT_GAP_FINISHED */ + uint32_t MasterPriority; /* Specifies the Priority of actual Time Master. + This parameter can be a number between 0 and 0x7 */ + uint32_t GapStarted; /* Specifies whether a Gap is started. + This parameter can be: + - FDCAN_TT_NO_GAP + - FDCAN_TT_GAP_STARTED */ + uint32_t WaitForEvt; /* Specifies whether a Gap is announced. + This parameter can be: + - FDCAN_TT_GAP_NOT_ANNOUNCED + - FDCAN_TT_REF_MSG_RECEIVED */ + uint32_t AppWdgEvt; /* Specifies the Application Watchdog State. + This parameter can be: + - FDCAN_TT_WATCHDOG_VALID + - FDCAN_TT_WATCHDOG_INVALID */ + uint32_t ECSPending; /* Specifies the External Clock Synchronization State. + This parameter can be: + - FDCAN_TT_NO_EXT_CLOCK_SYNC + - FDCAN_TT_WAIT_EXT_CLOCK_SYNC */ + uint32_t PhaseLock; /* Specifies the Phase Lock State. + This parameter can be: + - FDCAN_TT_PHASE_OUT_OF_RANGE + - FDCAN_TT_PHASE_IN_RANGE */ +} FDCAN_TT_Status; + + +/** FDCAN timeout constant define **/ +#define FDCAN_TIMEOUT_VALUE (600000U) /*10ms*/ +#define FDCAN_TIMEOUT_COUNT (50U) + +/*** FDCAN message ram define ***/ + +/*** FDCAN Message ram size define ***/ +#define FDCAN_MESSAGE_RAM_SIZE (0x1000UL*4UL) /* max 0x1000 words */ + +/*** FDCAN Message element size define, conuted in word(32bit) ***/ +#define FDCAN_STD_FILTER_WORDS (1U) +#define FDCAN_EXT_FILTER_WORDS (2U) +#define FDCAN_TX_EVENT_FIFO_WORDS (2U) +#define FDCAN_TT_MEMORY_WORDS (2U) + +/*** FD CAN message element bit define for Rx FIFO0/1, Rx buffer, Tx buffer, and Tx evnet fifo ***/ +/** Element 1st byte define, used for both Rx FIFO0/1, Rx buffer, Tx buffer, and Tx evnet fifo **/ +#define FDCAN_ELEMENT_ESI ((uint32_t)0x80000000U) /* Error State Indicator */ +#define FDCAN_ELEMENT_XTD ((uint32_t)0x40000000U) /* Extended Identifier */ +#define FDCAN_ELEMENT_RTR ((uint32_t)0x20000000U) /* Remote Transmission Request */ +#define FDCAN_ELEMENT_EXTID ((uint32_t)0x1FFFFFFFU) /* Extended Identifier */ +#define FDCAN_ELEMENT_STDID ((uint32_t)0x1FFC0000U) /* Standard Identifier */ + +/** Part of element 2nd byte define, used for both Rx FIFO0/1, Rx buffer, Tx buffer, and Tx evnet fifo **/ +#define FDCAN_ELEMENT_FDF ((uint32_t)0x00200000U) /* FD Format */ +#define FDCAN_ELEMENT_BRS ((uint32_t)0x00100000U) /* Bit Rate Switch */ +#define FDCAN_ELEMENT_DLC ((uint32_t)0x000F0000U) /* Data Length Code */ + +/** Part of element 2nd byte define, used for both Rx FIFO0/1, Rx buffer **/ +#define FDCAN_ELEMENT_ANMF ((uint32_t)0x80000000U) /* Accepted Non-matching Frame */ +#define FDCAN_ELEMENT_FIDX ((uint32_t)0x7F000000U) /* Filter Index */ + +/** Part of element 2nd byte define, used for both Rx FIFO0/1, Rx buffer, and Tx evnet fifo **/ +#define FDCAN_ELEMENT_TS ((uint32_t)0x0000FFFFU) /* Timestamp */ + +/** Part of element 2nd byte define, used for Tx buffer and Tx evnet fifo **/ +#define FDCAN_ELEMENT_MM ((uint32_t)0xFF000000U) /* Message Marker */ + +/** Part of element 2nd byte define, just used for Tx buffer **/ +#define FDCAN_ELEMENT_EFC ((uint32_t)0x00800000U) /* Event FIFO Control */ + +/** Part of element 2nd byte define, just used for Tx evnet fifo **/ +#define FDCAN_ELEMENT_ET ((uint32_t)0x00C00000U) /* Event type */ + +/** Bit offset define **/ +#define FDCAN_ELEMENT_STDID_OFFSET (REG_BIT18_OFFSET) +#define FDCAN_ELEMENT_FIDX_OFFSET (REG_BIT24_OFFSET) +#define FDCAN_ELEMENT_DLC_OFFSET (REG_BIT16_OFFSET) +#define FDCAN_ELEMENT_MM_OFFSET (REG_BIT24_OFFSET) + +/** FDCAN Error State Indicator, used for elememnt FDCAN_ELEMENT_ESI **/ +#define FDCAN_ESI_ACTIVE ((uint32_t)0x00000000U) /* Transmitting node is error active */ +#define FDCAN_ESI_PASSIVE (FDCAN_ELEMENT_ESI) /* Transmitting node is error passive */ + +/** ID type define, used for elememnt FDCAN_ELEMENT_XTD and register TTRMC **/ +#define FDCAN_STANDARD_ID ((uint32_t)0x00000000U) /* Standard ID element */ +#define FDCAN_EXTENDED_ID (FDCAN_ELEMENT_XTD) /* Extended ID element */ + +/** Standard frame type define, used for elememnt FDCAN_ELEMENT_RTR **/ +#define FDCAN_DATA_FRAME ((uint32_t)0x00000000U) /* Data frame */ +#define FDCAN_REMOTE_FRAME (FDCAN_ELEMENT_RTR) /* Remote frame */ + +/** FDCAN format define, used for elememnt FDCAN_ELEMENT_FDF **/ +#define FDCAN_CLASSIC_CAN ((uint32_t)0x00000000U) /* Frame transmitted/received in Classic CAN format */ +#define FDCAN_FD_CAN (FDCAN_ELEMENT_FDF) /* Frame transmitted/received in FDCAN format */ + +/** FDCAN Bit Rate Switching define, used for elememnt FDCAN_ELEMENT_BRS **/ +#define FDCAN_BRS_OFF ((uint32_t)0x00000000U) /* FDCAN frames transmitted/received without bit rate switching */ +#define FDCAN_BRS_ON (FDCAN_ELEMENT_BRS) /* FDCAN frames transmitted/received with bit rate switching */ + +/** FDCAN Data Length Code define, used for element FDCAN_ELEMENT_DLC **/ +#define FDCAN_DLC_BYTES_0 ((uint32_t)0x00000000U) /* 0 bytes data field */ +#define FDCAN_DLC_BYTES_1 ((uint32_t)0x00010000U) /* 1 bytes data field */ +#define FDCAN_DLC_BYTES_2 ((uint32_t)0x00020000U) /* 2 bytes data field */ +#define FDCAN_DLC_BYTES_3 ((uint32_t)0x00030000U) /* 3 bytes data field */ +#define FDCAN_DLC_BYTES_4 ((uint32_t)0x00040000U) /* 4 bytes data field */ +#define FDCAN_DLC_BYTES_5 ((uint32_t)0x00050000U) /* 5 bytes data field */ +#define FDCAN_DLC_BYTES_6 ((uint32_t)0x00060000U) /* 6 bytes data field */ +#define FDCAN_DLC_BYTES_7 ((uint32_t)0x00070000U) /* 7 bytes data field */ +#define FDCAN_DLC_BYTES_8 ((uint32_t)0x00080000U) /* 8 bytes data field */ +#define FDCAN_DLC_BYTES_12 ((uint32_t)0x00090000U) /* 12 bytes data field */ +#define FDCAN_DLC_BYTES_16 ((uint32_t)0x000A0000U) /* 16 bytes data field */ +#define FDCAN_DLC_BYTES_20 ((uint32_t)0x000B0000U) /* 20 bytes data field */ +#define FDCAN_DLC_BYTES_24 ((uint32_t)0x000C0000U) /* 24 bytes data field */ +#define FDCAN_DLC_BYTES_32 ((uint32_t)0x000D0000U) /* 32 bytes data field */ +#define FDCAN_DLC_BYTES_48 ((uint32_t)0x000E0000U) /* 48 bytes data field */ +#define FDCAN_DLC_BYTES_64 (FDCAN_ELEMENT_DLC) /* 64 bytes data field */ + +/** FDCAN accept non-natching frame define, used for element FDCAN_ELEMENT_ANMF **/ +#define FDCAN_ACCEPT_MACHING_FIDX ((uint32_t)0x00000000U) /* Accepted frame matches the ID indecated by FIDX */ +#define FDCAN_ACCEPT_NON_MATCHING (FDCAN_ELEMENT_ANMF) /* Accepted frame does't match and ID */ + +/** FDCAN Event FIFO control define, used for element **/ +#define FDCAN_NO_TX_EVENTS ((uint32_t)0x00000000U) /* Do not store Tx events */ +#define FDCAN_STORE_TX_EVENTS (FDCAN_ELEMENT_EFC) /* Store Tx events */ + +/** FDCAN Event Type, used for element FDCAN_ELEMENT_ET **/ +#define FDCAN_TX_EVENT ((uint32_t)0x00400000U) /* Tx event */ +#define FDCAN_TX_IN_SPITE_OF_ABORT ((uint32_t)0x00800000U) /* Transmission in spite of cancellation */ + +/*** FD CAN message element bit define for Standard and Extended message ID filter ***/ +/** FDCAN Filter element define, used for Standard filter **/ +#define FDCAN_ELEMENT_SFT ((uint32_t)0xC0000000U) /* Standard Filter Type */ +#define FDCAN_ELEMENT_SFEC ((uint32_t)0x38000000U) /* Standard Filter Element Configuration */ +#define FDCAN_ELEMENT_SFID1 ((uint32_t)0x07FF0000U) /* Standard Filter ID 1 */ +#define FDCAN_ELEMENT_SFID2 ((uint32_t)0x000007FFU) /* Standard Filter ID 2 */ + +/** FDCAN Filter element define, used for Externded filter **/ +/* Byte 0 */ +#define FDCAN_ELEMENT_EFEC ((uint32_t)0xE0000000U) /* Externded Filter Element Configuration */ +#define FDCAN_ELEMENT_EFID1 ((uint32_t)0x1FFFFFFFU) /* Externded Filter ID 1 */ + +/* Byte 1 */ +#define FDCAN_ELEMENT_EFT ((uint32_t)0xC0000000U) /* Externded Filter Type */ +#define FDCAN_ELEMENT_EFID2 ((uint32_t)0x1FFFFFFFU) /* Externded Filter ID 1 */ + +/** FDCAN Filter Type, used for both FDCAN_ELEMENT_EFT and FDCAN_ELEMENT_SFT **/ +#define FDCAN_FILTER_RANGE ((uint32_t)0x00000000U) /* Range filter from FilterID1 to FilterID2 */ +#define FDCAN_FILTER_DUAL ((uint32_t)0x40000000U) /* Dual ID filter for FilterID1 or FilterID2 */ +#define FDCAN_FILTER_MASK ((uint32_t)0x80000000U) /* Classic filter: FilterID1 = filter, FilterID2 = mask */ +#define FDCAN_FILTER_RANGE_NO_EIDM (FDCAN_ELEMENT_EFT) /* Range filter from FilterID1 to FilterID2, EIDM mask not applied */ + +/** FDCAN Filter Configuration, usd for FDCAN_ELEMENT_EFEC and FDCAN_ELEMENT_SFEC, it must be used with bit offset **/ +#define FDCAN_FILTER_DISABLE ((uint32_t)0x0000000U) /* Disable filter element */ +#define FDCAN_FILTER_TO_RXFIFO0 ((uint32_t)0x0000001U) /* Store in Rx FIFO 0 if filter matches */ +#define FDCAN_FILTER_TO_RXFIFO1 ((uint32_t)0x0000002U) /* Store in Rx FIFO 1 if filter matches */ +#define FDCAN_FILTER_REJECT ((uint32_t)0x0000003U) /* Reject ID if filter matches */ +#define FDCAN_FILTER_HP ((uint32_t)0x0000004U) /* Set high priority if filter matches */ +#define FDCAN_FILTER_TO_RXFIFO0_HP ((uint32_t)0x0000005U) /* Set high priority and store in FIFO 0 if filter matches */ +#define FDCAN_FILTER_TO_RXFIFO1_HP ((uint32_t)0x0000006U) /* Set high priority and store in FIFO 1 if filter matches */ +#define FDCAN_FILTER_TO_RXBUFFER ((uint32_t)0x0000007U) /* Store into Rx Buffer, configuration of FilterType ignored */ + +/** Bit offset define **/ +#define FDCAN_ELEMENT_SFEC_OFFSET (REG_BIT27_OFFSET) +#define FDCAN_ELEMENT_ID1_OFFSET (REG_BIT16_OFFSET) +#define FDCAN_ELEMENT_EFEC_OFFSET (REG_BIT29_OFFSET) + +/*** FD CAN message element bit define for Trigger Memory ***/ +/* Byte 0 */ +#define FDCAN_ELEMENT_TM ((uint32_t)0xFFFF0000U) /* Time Mark */ +#define FDCAN_ELEMENT_CC ((uint32_t)0x00007F00U) /* Cycle Code */ +#define FDCAN_ELEMENT_TMIN ((uint32_t)0x00000020U) /* Internal Time Mark Event */ +#define FDCAN_ELEMENT_TMEX ((uint32_t)0x00000010U) /* External Time Mark Event */ +#define FDCAN_ELEMENT_TYPE ((uint32_t)0x0000000FU) /* Trigger Type */ + +/* Byte 1 */ +#define FDCAN_ELEMENT_FTYPE ((uint32_t)0x00800000U) /* Filter Type */ +#define FDCAN_ELEMENT_MNR ((uint32_t)0x007F0000U) /* Message Number */ +#define FDCAN_ELEMENT_MSC ((uint32_t)0x00000007U) /* Message Status Count */ + +/** Bit offset define **/ +#define FDCAN_ELEMENT_TM_OFFSET (REG_BIT16_OFFSET) +#define FDCAN_ELEMENT_CC_OFFSET (REG_BIT8_OFFSET) +#define FDCAN_ELEMENT_MNR_OFFSET (REG_BIT16_OFFSET) + +/** FDCAN TT trigger valid cycle code, used for both FDCAN_ELEMENT_CC and register TTTMK **/ +#define FDCAN_TT_REPEAT_EVERY_CYCLE ((uint32_t)0x00000000U) /* Trigger valid for all cycles */ +#define FDCAN_TT_REPEAT_EVERY_2ND_CYCLE ((uint32_t)0x00000002U) /* Trigger valid every 2nd cycle */ +#define FDCAN_TT_REPEAT_EVERY_4TH_CYCLE ((uint32_t)0x00000004U) /* Trigger valid every 4th cycle */ +#define FDCAN_TT_REPEAT_EVERY_8TH_CYCLE ((uint32_t)0x00000008U) /* Trigger valid every 8th cycle */ +#define FDCAN_TT_REPEAT_EVERY_16TH_CYCLE ((uint32_t)0x00000010U) /* Trigger valid every 16th cycle */ +#define FDCAN_TT_REPEAT_EVERY_32ND_CYCLE ((uint32_t)0x00000020U) /* Trigger valid every 32nd cycle */ +#define FDCAN_TT_REPEAT_EVERY_64TH_CYCLE ((uint32_t)0x00000040U) /* Trigger valid every 64th cycle */ + +/** FDCAN TT time mark event internal, used for FDCAN_ELEMENT_TMIN **/ +#define FDCAN_TT_TM_NO_INTERNAL_EVENT ((uint32_t)0x00000000U) /* No action */ +#define FDCAN_TT_TM_GEN_INTERNAL_EVENT (FDCAN_ELEMENT_TMIN) /* Internal event is generated when trigger becomes active */ + +/** FDCAN TT time mark event external, used for FDCAN_ELEMENT_TMEX **/ +#define FDCAN_TT_TM_NO_EXTERNAL_EVENT ((uint32_t)0x00000000U) /* No action */ +#define FDCAN_TT_TM_GEN_EXTERNAL_EVENT (FDCAN_ELEMENT_TMEX) /* External event (pulse) is generated when trigger becomes active */ + +/** FDCAN TT trigger type,used for FDCAN_ELEMENT_TYPE **/ +#define FDCAN_TT_TX_REF_TRIGGER ((uint32_t)0x00000000U) /* Transmit reference message in strictly time-triggered operation */ +#define FDCAN_TT_TX_REF_TRIGGER_GAP ((uint32_t)0x00000001U) /* Transmit reference message in external event-synchronized time-triggered operation */ +#define FDCAN_TT_TX_TRIGGER_SINGLE ((uint32_t)0x00000002U) /* Start a single transmission in an exclusive time window */ +#define FDCAN_TT_TX_TRIGGER_CONTINUOUS ((uint32_t)0x00000003U) /* Start a continuous transmission in an exclusive time window */ +#define FDCAN_TT_TX_TRIGGER_ARBITRATION ((uint32_t)0x00000004U) /* Start a transmission in an arbitration time window */ +#define FDCAN_TT_TX_TRIGGER_MERGED ((uint32_t)0x00000005U) /* Start a merged arbitration window */ +#define FDCAN_TT_WATCH_TRIGGER ((uint32_t)0x00000006U) /* Check for missing reference messages in strictly time-triggered operation */ +#define FDCAN_TT_WATCH_TRIGGER_GAP ((uint32_t)0x00000007U) /* Check for missing reference messages in external event-synchronized time-triggered operation */ +#define FDCAN_TT_RX_TRIGGER ((uint32_t)0x00000008U) /* Check for the reception of periodic messages in exclusive time windows */ +#define FDCAN_TT_TIME_BASE_TRIGGER ((uint32_t)0x00000009U) /* Generate internal/external events depending on TmEventInt/TmEventExt configuration */ +#define FDCAN_TT_END_OF_LIST ((uint32_t)0x0000000AU) /* Illegal trigger, to be assigned to the unused triggers after a FDCAN_TT_WATCH_TRIGGER or FDCAN_TT_WATCH_TRIGGER_GAP */ + +/** FDCAN TT trigger type,used for FDCAN_ELEMENT_FTYPE **/ +#define FDCAN_FILTER_STANDARD_ID ((uint32_t)0x00000000U) /* Standard ID element */ +#define FDCAN_FILTER_EXTENDED_ID (FDCAN_ELEMENT_FTYPE) /* Extended ID element */ + +/*** FDCAN register define ***/ + +/** FDCAN frame format define **/ +#define FDCAN_FRAME_CLASSIC ((uint32_t)0x00000000U) /* Classic mode */ +#define FDCAN_FRAME_FD_NO_BRS (FDCAN_CCCR_FDOE) /* FD mode without BitRate Switching */ +#define FDCAN_FRAME_FD_BRS (FDCAN_CCCR_FDOE|FDCAN_CCCR_BRSE) /* FD mode with BitRate Switching */ + +/** FDCAN operatioin mode define **/ +#define FDCAN_MODE_NORMAL ((uint32_t)0x00000000U) /* Normal mode */ +#define FDCAN_MODE_RESTRICTED_OPERATION (FDCAN_CCCR_ASM) /* Restricted Operation mode */ +#define FDCAN_MODE_BUS_MONITORING (FDCAN_CCCR_MON) /* Bus Monitoring mode */ +#define FDCAN_MODE_INTERNAL_LOOPBACK (FDCAN_CCCR_TEST|FDCAN_CCCR_MON) /* Internal LoopBack mode */ +#define FDCAN_MODE_EXTERNAL_LOOPBACK (FDCAN_CCCR_TEST) /* External LoopBack mode */ + +/** FDCAN Tx FIFO and Tx Queue operation modes define **/ +#define FDCAN_TX_FIFO_MODE ((uint32_t)0x00000000U) /* FIFO mode */ +#define FDCAN_TX_QUEUE_MODE ((uint32_t)FDCAN_TXBC_TFQM) /* Queue mode */ + +/** FDCAN data field size define, conuted in words, used for both Rx FIFO0/1, Rx buffer, Tx buffer **/ +#define FDCAN_DATA_BYTES_8 ((uint32_t)0x00000004U) /* 8 bytes data field */ +#define FDCAN_DATA_BYTES_12 ((uint32_t)0x00000005U) /* 12 bytes data field */ +#define FDCAN_DATA_BYTES_16 ((uint32_t)0x00000006U) /* 16 bytes data field */ +#define FDCAN_DATA_BYTES_20 ((uint32_t)0x00000007U) /* 20 bytes data field */ +#define FDCAN_DATA_BYTES_24 ((uint32_t)0x00000008U) /* 24 bytes data field */ +#define FDCAN_DATA_BYTES_32 ((uint32_t)0x0000000AU) /* 32 bytes data field */ +#define FDCAN_DATA_BYTES_48 ((uint32_t)0x0000000EU) /* 48 bytes data field */ +#define FDCAN_DATA_BYTES_64 ((uint32_t)0x00000012U) /* 64 bytes data field */ + +/** FDCAN FDCAN Tx Location bit define, used for TXBRP, TXBAR, TXBCR, TXBTO, TXBCF, TXBTIE, TXBCIE registers **/ +#define FDCAN_TX_BUFFER0 (FDCAN_TXBRP_TRP0 ) /* Tx Buffer 0 bit */ +#define FDCAN_TX_BUFFER1 (FDCAN_TXBRP_TRP1 ) /* Tx Buffer 1 bit */ +#define FDCAN_TX_BUFFER2 (FDCAN_TXBRP_TRP2 ) /* Tx Buffer 2 bit */ +#define FDCAN_TX_BUFFER3 (FDCAN_TXBRP_TRP3 ) /* Tx Buffer 3 bit */ +#define FDCAN_TX_BUFFER4 (FDCAN_TXBRP_TRP4 ) /* Tx Buffer 4 bit */ +#define FDCAN_TX_BUFFER5 (FDCAN_TXBRP_TRP5 ) /* Tx Buffer 5 bit */ +#define FDCAN_TX_BUFFER6 (FDCAN_TXBRP_TRP6 ) /* Tx Buffer 6 bit */ +#define FDCAN_TX_BUFFER7 (FDCAN_TXBRP_TRP7 ) /* Tx Buffer 7 bit */ +#define FDCAN_TX_BUFFER8 (FDCAN_TXBRP_TRP8 ) /* Tx Buffer 8 bit */ +#define FDCAN_TX_BUFFER9 (FDCAN_TXBRP_TRP9 ) /* Tx Buffer 9 bit */ +#define FDCAN_TX_BUFFER10 (FDCAN_TXBRP_TRP10) /* Tx Buffer 10 bit */ +#define FDCAN_TX_BUFFER11 (FDCAN_TXBRP_TRP11) /* Tx Buffer 11 bit */ +#define FDCAN_TX_BUFFER12 (FDCAN_TXBRP_TRP12) /* Tx Buffer 12 bit */ +#define FDCAN_TX_BUFFER13 (FDCAN_TXBRP_TRP13) /* Tx Buffer 13 bit */ +#define FDCAN_TX_BUFFER14 (FDCAN_TXBRP_TRP14) /* Tx Buffer 14 bit */ +#define FDCAN_TX_BUFFER15 (FDCAN_TXBRP_TRP15) /* Tx Buffer 15 bit */ +#define FDCAN_TX_BUFFER16 (FDCAN_TXBRP_TRP16) /* Tx Buffer 16 bit */ +#define FDCAN_TX_BUFFER17 (FDCAN_TXBRP_TRP17) /* Tx Buffer 17 bit */ +#define FDCAN_TX_BUFFER18 (FDCAN_TXBRP_TRP18) /* Tx Buffer 18 bit */ +#define FDCAN_TX_BUFFER19 (FDCAN_TXBRP_TRP19) /* Tx Buffer 19 bit */ +#define FDCAN_TX_BUFFER20 (FDCAN_TXBRP_TRP20) /* Tx Buffer 20 bit */ +#define FDCAN_TX_BUFFER21 (FDCAN_TXBRP_TRP21) /* Tx Buffer 21 bit */ +#define FDCAN_TX_BUFFER22 (FDCAN_TXBRP_TRP22) /* Tx Buffer 22 bit */ +#define FDCAN_TX_BUFFER23 (FDCAN_TXBRP_TRP23) /* Tx Buffer 23 bit */ +#define FDCAN_TX_BUFFER24 (FDCAN_TXBRP_TRP24) /* Tx Buffer 24 bit */ +#define FDCAN_TX_BUFFER25 (FDCAN_TXBRP_TRP25) /* Tx Buffer 25 bit */ +#define FDCAN_TX_BUFFER26 (FDCAN_TXBRP_TRP26) /* Tx Buffer 26 bit */ +#define FDCAN_TX_BUFFER27 (FDCAN_TXBRP_TRP27) /* Tx Buffer 27 bit */ +#define FDCAN_TX_BUFFER28 (FDCAN_TXBRP_TRP28) /* Tx Buffer 28 bit */ +#define FDCAN_TX_BUFFER29 (FDCAN_TXBRP_TRP29) /* Tx Buffer 29 bit */ +#define FDCAN_TX_BUFFER30 (FDCAN_TXBRP_TRP30) /* Tx Buffer 30 bit */ +#define FDCAN_TX_BUFFER31 (FDCAN_TXBRP_TRP31) /* Tx Buffer 31 bit */ + +/** FDCAN Rx buffer index define **/ +#define FDCAN_RX_BUFFER0 ((uint32_t)0x00000000U) /* Rx Buffer 0 */ +#define FDCAN_RX_BUFFER1 ((uint32_t)0x00000001U) /* Rx Buffer 1 */ +#define FDCAN_RX_BUFFER2 ((uint32_t)0x00000002U) /* Rx Buffer 2 */ +#define FDCAN_RX_BUFFER3 ((uint32_t)0x00000003U) /* Rx Buffer 3 */ +#define FDCAN_RX_BUFFER4 ((uint32_t)0x00000004U) /* Rx Buffer 4 */ +#define FDCAN_RX_BUFFER5 ((uint32_t)0x00000005U) /* Rx Buffer 5 */ +#define FDCAN_RX_BUFFER6 ((uint32_t)0x00000006U) /* Rx Buffer 6 */ +#define FDCAN_RX_BUFFER7 ((uint32_t)0x00000007U) /* Rx Buffer 7 */ +#define FDCAN_RX_BUFFER8 ((uint32_t)0x00000008U) /* Rx Buffer 8 */ +#define FDCAN_RX_BUFFER9 ((uint32_t)0x00000009U) /* Rx Buffer 9 */ +#define FDCAN_RX_BUFFER10 ((uint32_t)0x0000000AU) /* Rx Buffer 10 */ +#define FDCAN_RX_BUFFER11 ((uint32_t)0x0000000BU) /* Rx Buffer 11 */ +#define FDCAN_RX_BUFFER12 ((uint32_t)0x0000000CU) /* Rx Buffer 12 */ +#define FDCAN_RX_BUFFER13 ((uint32_t)0x0000000DU) /* Rx Buffer 13 */ +#define FDCAN_RX_BUFFER14 ((uint32_t)0x0000000EU) /* Rx Buffer 14 */ +#define FDCAN_RX_BUFFER15 ((uint32_t)0x0000000FU) /* Rx Buffer 15 */ +#define FDCAN_RX_BUFFER16 ((uint32_t)0x00000010U) /* Rx Buffer 16 */ +#define FDCAN_RX_BUFFER17 ((uint32_t)0x00000011U) /* Rx Buffer 17 */ +#define FDCAN_RX_BUFFER18 ((uint32_t)0x00000012U) /* Rx Buffer 18 */ +#define FDCAN_RX_BUFFER19 ((uint32_t)0x00000013U) /* Rx Buffer 19 */ +#define FDCAN_RX_BUFFER20 ((uint32_t)0x00000014U) /* Rx Buffer 20 */ +#define FDCAN_RX_BUFFER21 ((uint32_t)0x00000015U) /* Rx Buffer 21 */ +#define FDCAN_RX_BUFFER22 ((uint32_t)0x00000016U) /* Rx Buffer 22 */ +#define FDCAN_RX_BUFFER23 ((uint32_t)0x00000017U) /* Rx Buffer 23 */ +#define FDCAN_RX_BUFFER24 ((uint32_t)0x00000018U) /* Rx Buffer 24 */ +#define FDCAN_RX_BUFFER25 ((uint32_t)0x00000019U) /* Rx Buffer 25 */ +#define FDCAN_RX_BUFFER26 ((uint32_t)0x0000001AU) /* Rx Buffer 26 */ +#define FDCAN_RX_BUFFER27 ((uint32_t)0x0000001BU) /* Rx Buffer 27 */ +#define FDCAN_RX_BUFFER28 ((uint32_t)0x0000001CU) /* Rx Buffer 28 */ +#define FDCAN_RX_BUFFER29 ((uint32_t)0x0000001DU) /* Rx Buffer 29 */ +#define FDCAN_RX_BUFFER30 ((uint32_t)0x0000001EU) /* Rx Buffer 30 */ +#define FDCAN_RX_BUFFER31 ((uint32_t)0x0000001FU) /* Rx Buffer 31 */ +#define FDCAN_RX_BUFFER32 ((uint32_t)0x00000020U) /* Rx Buffer 32 */ +#define FDCAN_RX_BUFFER33 ((uint32_t)0x00000021U) /* Rx Buffer 33 */ +#define FDCAN_RX_BUFFER34 ((uint32_t)0x00000022U) /* Rx Buffer 34 */ +#define FDCAN_RX_BUFFER35 ((uint32_t)0x00000023U) /* Rx Buffer 35 */ +#define FDCAN_RX_BUFFER36 ((uint32_t)0x00000024U) /* Rx Buffer 36 */ +#define FDCAN_RX_BUFFER37 ((uint32_t)0x00000025U) /* Rx Buffer 37 */ +#define FDCAN_RX_BUFFER38 ((uint32_t)0x00000026U) /* Rx Buffer 38 */ +#define FDCAN_RX_BUFFER39 ((uint32_t)0x00000027U) /* Rx Buffer 39 */ +#define FDCAN_RX_BUFFER40 ((uint32_t)0x00000028U) /* Rx Buffer 40 */ +#define FDCAN_RX_BUFFER41 ((uint32_t)0x00000029U) /* Rx Buffer 41 */ +#define FDCAN_RX_BUFFER42 ((uint32_t)0x0000002AU) /* Rx Buffer 42 */ +#define FDCAN_RX_BUFFER43 ((uint32_t)0x0000002BU) /* Rx Buffer 43 */ +#define FDCAN_RX_BUFFER44 ((uint32_t)0x0000002CU) /* Rx Buffer 44 */ +#define FDCAN_RX_BUFFER45 ((uint32_t)0x0000002DU) /* Rx Buffer 45 */ +#define FDCAN_RX_BUFFER46 ((uint32_t)0x0000002EU) /* Rx Buffer 46 */ +#define FDCAN_RX_BUFFER47 ((uint32_t)0x0000002FU) /* Rx Buffer 47 */ +#define FDCAN_RX_BUFFER48 ((uint32_t)0x00000030U) /* Rx Buffer 48 */ +#define FDCAN_RX_BUFFER49 ((uint32_t)0x00000031U) /* Rx Buffer 49 */ +#define FDCAN_RX_BUFFER50 ((uint32_t)0x00000032U) /* Rx Buffer 50 */ +#define FDCAN_RX_BUFFER51 ((uint32_t)0x00000033U) /* Rx Buffer 51 */ +#define FDCAN_RX_BUFFER52 ((uint32_t)0x00000034U) /* Rx Buffer 52 */ +#define FDCAN_RX_BUFFER53 ((uint32_t)0x00000035U) /* Rx Buffer 53 */ +#define FDCAN_RX_BUFFER54 ((uint32_t)0x00000036U) /* Rx Buffer 54 */ +#define FDCAN_RX_BUFFER55 ((uint32_t)0x00000037U) /* Rx Buffer 55 */ +#define FDCAN_RX_BUFFER56 ((uint32_t)0x00000038U) /* Rx Buffer 56 */ +#define FDCAN_RX_BUFFER57 ((uint32_t)0x00000039U) /* Rx Buffer 57 */ +#define FDCAN_RX_BUFFER58 ((uint32_t)0x0000003AU) /* Rx Buffer 58 */ +#define FDCAN_RX_BUFFER59 ((uint32_t)0x0000003BU) /* Rx Buffer 59 */ +#define FDCAN_RX_BUFFER60 ((uint32_t)0x0000003CU) /* Rx Buffer 60 */ +#define FDCAN_RX_BUFFER61 ((uint32_t)0x0000003DU) /* Rx Buffer 61 */ +#define FDCAN_RX_BUFFER62 ((uint32_t)0x0000003EU) /* Rx Buffer 62 */ +#define FDCAN_RX_BUFFER63 ((uint32_t)0x0000003FU) /* Rx Buffer 63 */ + +/** FDCAN virtual index define for Rx FIFO and Tx envent FIFO **/ +#define FDCAN_RX_FIFO0 ((uint32_t)0x00000040U) /* Rx FIFO 0 */ +#define FDCAN_RX_FIFO1 ((uint32_t)0x00000041U) /* Rx FIFO 1 */ +#define FDCAN_TX_EVENT_FIFO ((uint32_t)0x00000042U) /* Tx event FIFO */ + +/** FDCAN High Priority Message Storage **/ +#define FDCAN_HP_STANDARD_FILTER_LIST (FDCAN_HPMS_FLST_STD) /* Standard filter list */ +#define FDCAN_HP_EXTENDED_FILTER_LIST (FDCAN_HPMS_FLST_EXT) /* Extended filter list */ + +/** FDCAN High Priority Message Storage **/ +#define FDCAN_HP_STORAGE_NO_FIFO (FDCAN_HPMS_MSI_NO_FIFO ) /* No FIFO selected */ +#define FDCAN_HP_STORAGE_MSG_LOST (FDCAN_HPMS_MSI_MSG_LOST) /* FIFO message lost */ +#define FDCAN_HP_STORAGE_RXFIFO0 (FDCAN_HPMS_MSI_FIFO0 ) /* Message stored in FIFO 0 */ +#define FDCAN_HP_STORAGE_RXFIFO1 (FDCAN_HPMS_MSI_FIFO0 ) /* Message stored in FIFO 1 */ + +/** FDCAN receive error passive **/ +#define FDCAN_RX_ERROR_BELOW_128 ((uint32_t)0x00000000U) /* The receive error counter is below the error passive level of 128 */ +#define FDCAN_RX_ERROR_REACH_128 (FDCAN_ECR_RP) /* The receive error counter has reached the error passive level of 128 */ + +/** FDCAN protocol error code **/ +#define FDCAN_LAST_ERROR_NONE (FDCAN_PSR_LEC_NONE ) /* No error occurred */ +#define FDCAN_LAST_ERROR_STUFF (FDCAN_PSR_LEC_STUFF ) /* Stuff error */ +#define FDCAN_LAST_ERROR_FORM (FDCAN_PSR_LEC_FORM ) /* Form error */ +#define FDCAN_LAST_ERROR_ACK (FDCAN_PSR_LEC_ACK ) /* Acknowledge error */ +#define FDCAN_LAST_ERROR_BIT1 (FDCAN_PSR_LEC_BIT1 ) /* Bit 1 (recessive) error */ +#define FDCAN_LAST_ERROR_BIT0 (FDCAN_PSR_LEC_BIT0 ) /* Bit 0 (dominant) error */ +#define FDCAN_LAST_ERROR_CRC (FDCAN_PSR_LEC_CRC ) /* CRC check sum error */ +#define FDCAN_LAST_ERROR_NO_CHANGE (FDCAN_PSR_LEC_NO_CHANGE) /* No change since last read */ + +#define FDCAN_LAST_DATA_ERROR_NONE (FDCAN_PSR_DLEC_NONE ) /* No error occurred */ +#define FDCAN_LAST_DATA_ERROR_STUFF (FDCAN_PSR_DLEC_STUFF ) /* Stuff error */ +#define FDCAN_LAST_DATA_ERROR_FORM (FDCAN_PSR_DLEC_FORM ) /* Form error */ +#define FDCAN_LAST_DATA_ERROR_ACK (FDCAN_PSR_DLEC_ACK ) /* Acknowledge error */ +#define FDCAN_LAST_DATA_ERROR_BIT1 (FDCAN_PSR_DLEC_BIT1 ) /* Bit 1 (recessive) error */ +#define FDCAN_LAST_DATA_ERROR_BIT0 (FDCAN_PSR_DLEC_BIT0 ) /* Bit 0 (dominant) error */ +#define FDCAN_LAST_DATA_ERROR_CRC (FDCAN_PSR_DLEC_CRC ) /* CRC check sum error */ +#define FDCAN_LAST_DATA_ERROR_NO_CHANGE (FDCAN_PSR_DLEC_NO_CHANGE) /* No change since last read */ + +/** FDCAN protocol communication state **/ +#define FDCAN_COM_STATE_SYNC (FDCAN_PSR_ACT_SYNC) /* Node is synchronizing on CAN communication */ +#define FDCAN_COM_STATE_IDLE (FDCAN_PSR_ACT_IDLE) /* Node is neither receiver nor transmitter */ +#define FDCAN_COM_STATE_RX (FDCAN_PSR_ACT_RX ) /* Node is operating as receiver */ +#define FDCAN_COM_STATE_TX (FDCAN_PSR_ACT_TX ) /* Node is operating as transmitter */ + +/** FDCAN protocol error passive **/ +#define FDCAN_ERROR_ACTIVE ((uint32_t)0x00000000U) /* Node is active error state */ +#define FDCAN_ERROR_PASSIVE (FDCAN_PSR_EP) /* Node is passive error state */ + +/** FDCAN protocol warning status **/ +#define FDCAN_WARNING_BELOW_96 ((uint32_t)0x00000000U) /* RxErrorCnt and TxErrorCnt are below the Error_Warning limit of 96 */ +#define FDCAN_WARNING_REACH_96 (FDCAN_PSR_EW) /* At least one of error counters has reached the Error_Warning limit of 96 */ + +/** FDCAN protocol bus off status **/ +#define FDCAN_BUS_ON ((uint32_t)0x00000000U) /* Node is not bus off state */ +#define FDCAN_BUS_OFF (FDCAN_PSR_BO) /* Node is bus off state */ + +/** FDCAN protocol ESI flag of last received FDCAN message **/ +#define FDCAN_ESI_NOT_SET ((uint32_t)0x00000000U) /* ESI flag of last received FDCAN message is not set */ +#define FDCAN_ESI_SET (FDCAN_PSR_RESI) /* ESI flag of last received FDCAN message is set */ + +/** FDCAN protocol BRS flag of last received FDCAN message **/ +#define FDCAN_BRS_NOT_SET ((uint32_t)0x00000000U) /* BSR flag of last received FDCAN message is not set */ +#define FDCAN_BRS_SET (FDCAN_PSR_RBRS) /* BSR flag of last received FDCAN message is set */ + +/** FDCAN protocol received a FDCAN message **/ +#define FDCAN_FDMSG_NOT_RECEIVED ((uint32_t)0x00000000U) /* Have not received any FDCAN message after CPU reset */ +#define FDCAN_FDMSG_RECEIVED (FDCAN_PSR_RFDF) /* Have received FDCAN message after CPU reset */ + +/** FDCAN protocol exception event **/ +#define FDCAN_NO_EXCEPTION ((uint32_t)0x00000000U) /* No protocol exception event occurred since last read access */ +#define FDCAN_HAVE_EXCEPTION (FDCAN_PSR_PXE) /* Protocol exception event occurred */ + +/** FDCAN FIFO operation mode, used for both Rx FIFO 0 and FIFO 1 **/ +#define FDCAN_RX_FIFO_BLOCKING ((uint32_t)0x00000000U) /* Rx FIFO blocking mode */ +#define FDCAN_RX_FIFO_OVERWRITE (FDCAN_RXF0C_F0OM) /* Rx FIFO overwrite mode */ + +/** FDCAN non-matching frames **/ +#define FDCAN_ACCEPT_STD_IN_RX_FIFO0 ((uint32_t)0x00000000U) /* Accept Standard Frame in Rx FIFO 0 */ +#define FDCAN_ACCEPT_STD_IN_RX_FIFO1 (FDCAN_GFC_ANFS_0) /* Accept Standard Frame in Rx FIFO 1 */ +#define FDCAN_REJECT_STD (FDCAN_GFC_ANFS_1) /* Reject Standard Frame */ + +#define FDCAN_ACCEPT_EXT_IN_RX_FIFO0 ((uint32_t)0x00000000U) /* Accept Extended Frame in Rx FIFO 0 */ +#define FDCAN_ACCEPT_EXT_IN_RX_FIFO1 (FDCAN_GFC_ANFE_0) /* Accept Extended Frame in Rx FIFO 1 */ +#define FDCAN_REJECT_EXT (FDCAN_GFC_ANFE_1) /* Reject Extended Frame */ + +/** FDCAN reject remote frames **/ +#define FDCAN_FILTER_STD_REMOTE ((uint32_t)0x00000000U) /* Filter Standard remote frames */ +#define FDCAN_REJECT_STD_REMOTE (FDCAN_GFC_RRFS) /* Reject all Standard remote frames */ +#define FDCAN_FILTER_EXT_REMOTE ((uint32_t)0x00000000U) /* Filter Extended remote frames */ +#define FDCAN_REJECT_EXT_REMOTE (FDCAN_GFC_RRFE) /* Reject all Extended remote frames */ + +/** FDCAN interrupt line **/ +#define FDCAN_INTERRUPT_LINE0 (FDCAN_ILE_EINT0) /* Interrupt Line 0 */ +#define FDCAN_INTERRUPT_LINE1 (FDCAN_ILE_EINT1) /* Interrupt Line 1 */ + +/** FDCAN timestamp select define **/ +#define FDCAN_TIMESTAMP_DISABLE (FDCAN_TSCC_CONSTANT) /* Timestamp counter value is always 0x0000 */ +#define FDCAN_TIMESTAMP_INTERNAL (FDCAN_TSCC_INC_TCP) /* Timestamp counter value incremented according to TCP */ +#define FDCAN_TIMESTAMP_EXTERNAL (FDCAN_TSCC_USE_EXT) /* External timestamp counter value used */ + +/** FDCAN internal timestamp prescaler define **/ +#define FDCAN_TIMESTAMP_PRESC_1 (FDCAN_TSCC_TCP_DIV1 ) /* Timestamp counter time unit in equal to CAN bit time */ +#define FDCAN_TIMESTAMP_PRESC_2 (FDCAN_TSCC_TCP_DIV2 ) /* Timestamp counter time unit in equal to CAN bit time multiplied by 2 */ +#define FDCAN_TIMESTAMP_PRESC_3 (FDCAN_TSCC_TCP_DIV3 ) /* Timestamp counter time unit in equal to CAN bit time multiplied by 3 */ +#define FDCAN_TIMESTAMP_PRESC_4 (FDCAN_TSCC_TCP_DIV4 ) /* Timestamp counter time unit in equal to CAN bit time multiplied by 4 */ +#define FDCAN_TIMESTAMP_PRESC_5 (FDCAN_TSCC_TCP_DIV5 ) /* Timestamp counter time unit in equal to CAN bit time multiplied by 5 */ +#define FDCAN_TIMESTAMP_PRESC_6 (FDCAN_TSCC_TCP_DIV6 ) /* Timestamp counter time unit in equal to CAN bit time multiplied by 6 */ +#define FDCAN_TIMESTAMP_PRESC_7 (FDCAN_TSCC_TCP_DIV7 ) /* Timestamp counter time unit in equal to CAN bit time multiplied by 7 */ +#define FDCAN_TIMESTAMP_PRESC_8 (FDCAN_TSCC_TCP_DIV8 ) /* Timestamp counter time unit in equal to CAN bit time multiplied by 8 */ +#define FDCAN_TIMESTAMP_PRESC_9 (FDCAN_TSCC_TCP_DIV9 ) /* Timestamp counter time unit in equal to CAN bit time multiplied by 9 */ +#define FDCAN_TIMESTAMP_PRESC_10 (FDCAN_TSCC_TCP_DIV10) /* Timestamp counter time unit in equal to CAN bit time multiplied by 10 */ +#define FDCAN_TIMESTAMP_PRESC_11 (FDCAN_TSCC_TCP_DIV11) /* Timestamp counter time unit in equal to CAN bit time multiplied by 11 */ +#define FDCAN_TIMESTAMP_PRESC_12 (FDCAN_TSCC_TCP_DIV12) /* Timestamp counter time unit in equal to CAN bit time multiplied by 12 */ +#define FDCAN_TIMESTAMP_PRESC_13 (FDCAN_TSCC_TCP_DIV13) /* Timestamp counter time unit in equal to CAN bit time multiplied by 13 */ +#define FDCAN_TIMESTAMP_PRESC_14 (FDCAN_TSCC_TCP_DIV14) /* Timestamp counter time unit in equal to CAN bit time multiplied by 14 */ +#define FDCAN_TIMESTAMP_PRESC_15 (FDCAN_TSCC_TCP_DIV15) /* Timestamp counter time unit in equal to CAN bit time multiplied by 15 */ +#define FDCAN_TIMESTAMP_PRESC_16 (FDCAN_TSCC_TCP_DIV16) /* Timestamp counter time unit in equal to CAN bit time multiplied by 16 */ + +/** FDCAN external timestamp clock divider define **/ +#define FDCAN_EXT_TIMESTAMP_DISABLE ((uint32_t)0x00000000U) /* Extenal timestamp clock disable */ +#define FDCAN_EXT_TIMESTAMP_ENABLE (FDCAN_TTSS_TS_EN) /* Extenal timestamp clock enable */ + +/** FDCAN external timestamp clock divider define **/ +#define FDCAN_EXT_TIMESTAMP_DIV_4 (FDCAN_TTSS_TS_SEL_DIV4 ) /* Extenal timestamp clock is PCLK divided by 4 */ +#define FDCAN_EXT_TIMESTAMP_DIV_8 (FDCAN_TTSS_TS_SEL_DIV8 ) /* Extenal timestamp clock is PCLK divided by 8 */ +#define FDCAN_EXT_TIMESTAMP_DIV_16 (FDCAN_TTSS_TS_SEL_DIV16 ) /* Extenal timestamp clock is PCLK divided by 16 */ +#define FDCAN_EXT_TIMESTAMP_DIV_32 (FDCAN_TTSS_TS_SEL_DIV32 ) /* Extenal timestamp clock is PCLK divided by 32 */ +#define FDCAN_EXT_TIMESTAMP_DIV_64 (FDCAN_TTSS_TS_SEL_DIV64 ) /* Extenal timestamp clock is PCLK divided by 64 */ +#define FDCAN_EXT_TIMESTAMP_DIV_128 (FDCAN_TTSS_TS_SEL_DIV128) /* Extenal timestamp clock is PCLK divided by 128 */ +#define FDCAN_EXT_TIMESTAMP_DIV_256 (FDCAN_TTSS_TS_SEL_DIV256) /* Extenal timestamp clock is PCLK divided by 256 */ +#define FDCAN_EXT_TIMESTAMP_DIV_512 (FDCAN_TTSS_TS_SEL_DIV512) /* Extenal timestamp clock is PCLK divided by 512 */ + +/** FDCAN timeout operation define **/ +#define FDCAN_TIMEOUT_CONTINUOUS (FDCAN_TOCC_TOS_CONTINUOUS ) /* Timeout continuous operation */ +#define FDCAN_TIMEOUT_TX_EVENT_FIFO (FDCAN_TOCC_TOS_TX_EVENT_FIFO) /* Timeout controlled by Tx Event FIFO */ +#define FDCAN_TIMEOUT_RX_FIFO0 (FDCAN_TOCC_TOS_RX_FIFO0 ) /* Timeout controlled by Rx FIFO 0 */ +#define FDCAN_TIMEOUT_RX_FIFO1 (FDCAN_TOCC_TOS_RX_FIFO1 ) /* Timeout controlled by Rx FIFO 1 */ + +/* FDCAN modify on read function define */ +#define FDCAN_ENABLE_MODIFY_ON_READ ((uint32_t)0x00000000U) /* Modify on read enable */ +#define FDCAN_DISABLE_MODIFY_ON_READ (FDCAN_TTSS_MRD) /* Modify on read disable */ + +/*** TT-CAN register define ***/ + +/** FDCAN TT reference message payload **/ +#define FDCAN_TT_REF_MSG_NO_PAYLOAD ((uint32_t)0x00000000U) /* Reference message has no additional payload */ +#define FDCAN_TT_REF_MSG_ADD_PAYLOAD ((uint32_t)FDCAN_TTRMC_RMPS) /* Additional payload is taken from Tx Buffer 0 */ + +/** FDCAN Operation Mode **/ +#define FDCAN_TT_COMMUNICATION_LEVEL1 (FDCAN_TTOCF_OM_LEVEL1) /* Time triggered communication, level 1 */ +#define FDCAN_TT_COMMUNICATION_LEVEL2 (FDCAN_TTOCF_OM_LEVEL2) /* Time triggered communication, level 2 */ +#define FDCAN_TT_COMMUNICATION_LEVEL0 (FDCAN_TTOCF_OM_LEVEL0) /* Time triggered communication, level 0 */ + +/** FDCAN TT Operation **/ +#define FDCAN_STRICTLY_TT_OPERATION ((uint32_t)0x00000000U) /* Strictly time-triggered operation */ +#define FDCAN_EXT_EVT_SYNC_TT_OPERATION ((uint32_t)FDCAN_TTOCF_GEN) /* External event-synchronized time-triggered operation */ + +/** FDCAN TT Time Master **/ +#define FDCAN_TT_SLAVE ((uint32_t)0x00000000U) /* Time slave */ +#define FDCAN_TT_POTENTIAL_MASTER ((uint32_t)FDCAN_TTOCF_TM) /* Potential time master */ + +/** FDCAN TT External Clock Synchronization **/ +#define FDCAN_TT_EXT_CLK_SYNC_DISABLE ((uint32_t)0x00000000U) /* External clock synchronization in Level 0,2 disabled */ +#define FDCAN_TT_EXT_CLK_SYNC_ENABLE ((uint32_t)FDCAN_TTOCF_EECS) /* External clock synchronization in Level 0,2 enabled */ + +/** FDCAN TT Global Time Filtering **/ +#define FDCAN_TT_GLOB_TIME_FILT_DISABLE ((uint32_t)0x00000000U) /* Global time filtering in Level 0,2 disabled */ +#define FDCAN_TT_GLOB_TIME_FILT_ENABLE ((uint32_t)FDCAN_TTOCF_EGTF) /* Global time filtering in Level 0,2 enabled */ + +/** FDCAN TT Automatic Clock Calibration **/ +#define FDCAN_TT_AUTO_CLK_CALIB_DISABLE ((uint32_t)0x00000000U) /* Automatic clock calibration in Level 0,2 disabled */ +#define FDCAN_TT_AUTO_CLK_CALIB_ENABLE ((uint32_t)FDCAN_TTOCF_ECC) /* Automatic clock calibration in Level 0,2 enabled */ + +/**FDCAN TT Event Trigger Polarity **/ +#define FDCAN_TT_EVT_TRIG_POL_RISING ((uint32_t)0x00000000U) /* Rising edge trigger */ +#define FDCAN_TT_EVT_TRIG_POL_FALLING ((uint32_t)FDCAN_TTOCF_EVTP) /* Falling edge trigger */ + +/** FDCAN TT Basic Cycle Number **/ +#define FDCAN_TT_CYCLES_PER_MATRIX_1 (FDCAN_TTMLM_CCM_NUM1 ) /* 1 Basic Cycle per Matrix */ +#define FDCAN_TT_CYCLES_PER_MATRIX_2 (FDCAN_TTMLM_CCM_NUM2 ) /* 2 Basic Cycles per Matrix */ +#define FDCAN_TT_CYCLES_PER_MATRIX_4 (FDCAN_TTMLM_CCM_NUM4 ) /* 4 Basic Cycles per Matrix */ +#define FDCAN_TT_CYCLES_PER_MATRIX_8 (FDCAN_TTMLM_CCM_NUM8 ) /* 8 Basic Cycles per Matrix */ +#define FDCAN_TT_CYCLES_PER_MATRIX_16 (FDCAN_TTMLM_CCM_NUM16) /* 16 Basic Cycles per Matrix */ +#define FDCAN_TT_CYCLES_PER_MATRIX_32 (FDCAN_TTMLM_CCM_NUM32) /* 32 Basic Cycles per Matrix */ +#define FDCAN_TT_CYCLES_PER_MATRIX_64 (FDCAN_TTMLM_CCM_NUM64) /* 64 Basic Cycles per Matrix */ + +/** FDCAN TT Cycle Start Sync **/ +#define FDCAN_TT_NO_SYNC_PULSE (FDCAN_TTMLM_CSS_NONE) /* No sync pulse */ +#define FDCAN_TT_SYNC_BASIC_CYCLE_START (FDCAN_TTMLM_CSS_BASIC ) /* Sync pulse at start of basic cycle */ +#define FDCAN_TT_SYNC_MATRIX_START (FDCAN_TTMLM_CSS_MATRIX) /* Sync pulse at start of matrix */ + +/** FDCAN TT Stop Watch Trigger Selection **/ +#define FDCAN_TT_STOP_WATCH_TRIGGER_0 (FDCAN_TTSS_SSWT_0) /* GTIMx selected as stop watch trigger */ +#define FDCAN_TT_STOP_WATCH_TRIGGER_1 (FDCAN_TTSS_SSWT_1) /* GTIMx selected as stop watch trigger */ +#define FDCAN_TT_STOP_WATCH_TRIGGER_2 (FDCAN_TTSS_SSWT_2) /* ETHx selected as stop watch trigger */ +#define FDCAN_TT_STOP_WATCH_TRIGGER_3 (FDCAN_TTSS_SSWT_3) /* SHRTIMx selected as stop watch trigger */ + +/**FDCAN TT Event Trigger Selection **/ +#define FDCAN_TT_EVENT_TRIGGER_0 (FDCAN_TTSS_SEVT_0) /* GTIMx selected as event trigger */ +#define FDCAN_TT_EVENT_TRIGGER_1 (FDCAN_TTSS_SEVT_1) /* GTIMx selected as event trigger */ +#define FDCAN_TT_EVENT_TRIGGER_2 (FDCAN_TTSS_SEVT_2) /* ETHx selected as event trigger */ +#define FDCAN_TT_EVENT_TRIGGER_3 (FDCAN_TTSS_SEVT_3) /* SHRTIMx selected as event trigger */ + +/** FDCAN TT Stop Watch Source **/ +#define FDCAN_TT_STOP_WATCH_DISABLED (FDCAN_TTOCN_SWS_STOP) /* Stop Watch disabled */ +#define FDCAN_TT_STOP_WATCH_CYCLE_TIME (FDCAN_TTOCN_SWS_CYCLE ) /* Cycle time is copied to Capture Time register */ +#define FDCAN_TT_STOP_WATCH_LOCAL_TIME (FDCAN_TTOCN_SWS_LOCAL ) /* Local time is copied to Capture Time register */ +#define FDCAN_TT_STOP_WATCH_GLOBAL_TIME (FDCAN_TTOCN_SWS_GLOBAL ) /* Global time is copied to Capture Time register */ + +/** FDCAN TT Stop Watch Polarity **/ +#define FDCAN_TT_STOP_WATCH_RISING ((uint32_t)0x00000000U)/* Stop watch source is captured at rising edge of fdcan1_swt */ +#define FDCAN_TT_STOP_WATCH_FALLING (FDCAN_TTOCN_SWP) /* Stop watch source is captured at falling edge of fdcan1_swt */ + +/** FDCAN TT Time Mark Source **/ +#define FDCAN_TT_REG_TIMEMARK_DIABLED (FDCAN_TTOCN_TMC_NONE) /* No Register Time Mark Interrupt generated */ +#define FDCAN_TT_REG_TIMEMARK_CYCLE_TIME (FDCAN_TTOCN_TMC_BASIC ) /* Register Time Mark Interrupt if Time Mark = cycle time */ +#define FDCAN_TT_REG_TIMEMARK_LOCAL_TIME (FDCAN_TTOCN_TMC_LOCAL ) /* Register Time Mark Interrupt if Time Mark = local time */ +#define FDCAN_TT_REG_TIMEMARK_GLOBAL_TIME (FDCAN_TTOCN_TMC_GLOBAL ) /* Register Time Mark Interrupt if Time Mark = global time */ + +/** FDCAN TT Error Level **/ +#define FDCAN_TT_NO_ERROR (FDCAN_TTOST_EL_S0) /* Severity 0 - No Error */ +#define FDCAN_TT_WARNING (FDCAN_TTOST_EL_S1) /* Severity 1 - Warning */ +#define FDCAN_TT_ERROR (FDCAN_TTOST_EL_S2) /* Severity 2 - Error */ +#define FDCAN_TT_SEVERE_ERROR (FDCAN_TTOST_EL_S3) /* Severity 3 - Severe Error */ + +/** FDCAN TT Master State **/ +#define FDCAN_TT_MASTER_OFF (FDCAN_TTOST_MS_NONE ) /* Master_Off, no master properties relevant */ +#define FDCAN_TT_TIME_SLAVE (FDCAN_TTOST_MS_SLAVE ) /* Operating as Time Slave */ +#define FDCAN_TT_BACKUP_TIME_MASTER (FDCAN_TTOST_MS_BACKUP ) /* Operating as Backup Time Master */ +#define FDCAN_TT_CURRENT_TIME_MASTER (FDCAN_TTOST_MS_CURRENT) /* Operating as current Time Master */ + +/** FDCAN TT Synchronization State **/ +#define FDCAN_TT_OUT_OF_SYNC (FDCAN_TTOST_SYS_NONE ) /* Out of Synchronization */ +#define FDCAN_TT_SYNCHRONIZING (FDCAN_TTOST_SYS_SYNC ) /* Synchronizing to communication */ +#define FDCAN_TT_IN_GAP (FDCAN_TTOST_SYS_IN_GAP ) /* Schedule suspended by Gap */ +#define FDCAN_TT_IN_SCHEDULE (FDCAN_TTOST_SYS_IN_SCHEDULE) /* Synchronized to schedule */ + +/** FDCAN TT Quality of global time phase. **/ +#define FDCAN_TT_GTIME_NOT_VALID ((uint32_t)0x00000000U) /* Global time not valid */ +#define FDCAN_TT_GTIME_IN_MASTER_PHASE (FDCAN_TTOST_QGTP ) /* Global time in phase with Time Master */ + +/** FDCAN TT Quality of clock Speed **/ +#define FDCAN_TT_LOCAL_CLOCK_NOT_SYNC ((uint32_t)0x00000000U) /* Local clock speed not synchronized to Time Master clock speed */ +#define FDCAN_TT_SYNC_DEV_LESS_THAN_SDL (FDCAN_TTOST_QCS ) /* Synchronization Deviation <= SDL */ + +/** FDCAN TT Wait for global time discontinuity **/ +#define FDCAN_TT_NO_GTIME_PENDING ((uint32_t)0x00000000U) /* No global time preset pending */ +#define FDCAN_TT_WATI_GTIMESYNC_PRESENT (FDCAN_TTOST_WGTD ) /* Node waits for the global time preset to take effect */ + +/** FDCAN TT Gap finished Indicator **/ +#define FDCAN_TT_GAP_RESET ((uint32_t)0x00000000U) /* Reset at the end of each reference message */ +#define FDCAN_TT_GAP_FINISHED (FDCAN_TTOST_GFI ) /* Gap finished by FDCAN */ + +/** FDCAN TT Gap started Indicator **/ +#define FDCAN_TT_NO_GAP ((uint32_t)0x00000000U) /* No Gap in schedule */ +#define FDCAN_TT_GAP_STARTED (FDCAN_TTOST_GSI ) /* Gap time after basic cycle has started */ + +/** FDCAN TT Wait for event **/ +#define FDCAN_TT_GAP_NOT_ANNOUNCED ((uint32_t)0x00000000U) /* No Gap announced */ +#define FDCAN_TT_REF_MSG_RECEIVED (FDCAN_TTOST_WFE ) /* Reference message with Next_is_Gap = 1 received */ + +/** FDCAN TT Application watchdog event. **/ +#define FDCAN_TT_WATCHDOG_VALID ((uint32_t)0x00000000U) /* Application watchdog served in time */ +#define FDCAN_TT_WATCHDOG_INVALID (FDCAN_TTOST_AWE ) /* Failed to serve application watchdog in time */ + +/** FDCAN TT Wait for external clock synchronization **/ +#define FDCAN_TT_NO_EXT_CLOCK_SYNC ((uint32_t)0x00000000U) /* No external clock synchronization pending. */ +#define FDCAN_TT_WAIT_EXT_CLOCK_SYNC (FDCAN_TTOST_WECS ) /* Node waits for external clock synchronization to take effect. */ + +/** FDCAN TT Schedule phase lock. **/ +#define FDCAN_TT_PHASE_OUT_OF_RANGE ((uint32_t)0x00000000U) /* Phase outside range. */ +#define FDCAN_TT_PHASE_IN_RANGE (FDCAN_TTOST_SPL ) /* Phase inside range. */ + +/** FDCAN Interrupt masks **/ +#define FDCAN_INT_MASK ((uint32_t)0x3FFFFFFFU)/* FDCAN interrupts mask */ + +/** FDCAN Flags **/ +#define FDCAN_FLAG_RESERVED_ADDRESS_ACCESS (FDCAN_IR_ARA ) /* Access to reserved address occurred */ +#define FDCAN_FLAG_DATA_PROTOCOL_ERROR (FDCAN_IR_PED ) /* Protocol error in data phase detected */ +#define FDCAN_FLAG_ARB_PROTOCOL_ERROR (FDCAN_IR_PEA ) /* Protocol error in arbitration phase detected */ +#define FDCAN_FLAG_RAM_WATCHDOG (FDCAN_IR_WDI ) /* Message RAM Watchdog event due to missing READY */ +#define FDCAN_FLAG_BUS_OFF (FDCAN_IR_BO ) /* Bus_Off status changed */ +#define FDCAN_FLAG_ERROR_WARNING (FDCAN_IR_EW ) /* Error_Warning status changed */ +#define FDCAN_FLAG_ERROR_PASSIVE (FDCAN_IR_EP ) /* Error_Passive status changed */ +#define FDCAN_FLAG_ERROR_LOGGING_OVERFLOW (FDCAN_IR_ELO ) /* Overflow of FDCAN Error Logging Counter occurred */ +#define FDCAN_FLAG_BITERROR_CORRECTED (FDCAN_IR_BEC ) /* Bit Error Corrected */ +#define FDCAN_FLAG_BITERROR_UNCORRECTED (FDCAN_IR_BEU ) /* Bit Error Uncorrected */ +#define FDCAN_FLAG_RX_BUFFER_NEW_MESSAGE (FDCAN_IR_DRX ) /* At least one received message stored into a Rx Buffer */ +#define FDCAN_FLAG_TIMEOUT_OCCURRED (FDCAN_IR_TOO ) /* Timeout reached */ +#define FDCAN_FLAG_RAM_ACCESS_FAILURE (FDCAN_IR_MRAF) /* Message RAM access failure occurred */ +#define FDCAN_FLAG_TIMESTAMP_WRAPAROUND (FDCAN_IR_TSW ) /* Timestamp counter wrapped around */ +#define FDCAN_FLAG_TX_EVT_FIFO_ELT_LOST (FDCAN_IR_TEFL) /* Tx Event FIFO element lost */ +#define FDCAN_FLAG_TX_EVT_FIFO_FULL (FDCAN_IR_TEFF) /* Tx Event FIFO full */ +#define FDCAN_FLAG_TX_EVT_FIFO_WATERMARK (FDCAN_IR_TEFW) /* Tx Event FIFO fill level reached watermark */ +#define FDCAN_FLAG_TX_EVT_FIFO_NEW_DATA (FDCAN_IR_TEFN) /* Tx Handler wrote Tx Event FIFO element */ +#define FDCAN_FLAG_TX_FIFO_EMPTY (FDCAN_IR_TFE ) /* Tx FIFO Empty */ +#define FDCAN_FLAG_TX_ABORT_COMPLETE (FDCAN_IR_TCF ) /* Transmission Cancellation Finished */ +#define FDCAN_FLAG_TX_COMPLETE (FDCAN_IR_TC ) /* Transmission Completed */ +#define FDCAN_FLAG_RX_HIGH_PRIORITY_MSG (FDCAN_IR_HPM ) /* High priority message received */ +#define FDCAN_FLAG_RX_FIFO1_MESSAGE_LOST (FDCAN_IR_RF1L) /* Rx FIFO 1 message lost */ +#define FDCAN_FLAG_RX_FIFO1_FULL (FDCAN_IR_RF1F) /* Rx FIFO 1 full */ +#define FDCAN_FLAG_RX_FIFO1_WATERMARK (FDCAN_IR_RF1W) /* Rx FIFO 1 fill level reached watermark */ +#define FDCAN_FLAG_RX_FIFO1_NEW_MESSAGE (FDCAN_IR_RF1N) /* New message written to Rx FIFO 1 */ +#define FDCAN_FLAG_RX_FIFO0_MESSAGE_LOST (FDCAN_IR_RF0L) /* Rx FIFO 0 message lost */ +#define FDCAN_FLAG_RX_FIFO0_FULL (FDCAN_IR_RF0F) /* Rx FIFO 0 full */ +#define FDCAN_FLAG_RX_FIFO0_WATERMARK (FDCAN_IR_RF0W) /* Rx FIFO 0 fill level reached watermark */ +#define FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE (FDCAN_IR_RF0N) /* New message written to Rx FIFO 0 */ + +/** FDCAN Tx Interrupts **/ +#define FDCAN_INT_TX_COMPLETE (FDCAN_IE_TCE ) /* Transmission Completed */ +#define FDCAN_INT_TX_ABORT_COMPLETE (FDCAN_IE_TCFE) /* Transmission Cancellation Finished */ +#define FDCAN_INT_TX_FIFO_EMPTY (FDCAN_IE_TFEE) /* Tx FIFO Empty */ + +/**FDCAN Rx Interrupts **/ +#define FDCAN_INT_RX_HIGH_PRIORITY_MSG (FDCAN_IE_HPME) /* High priority message received */ +#define FDCAN_INT_RX_BUFFER_NEW_MESSAGE (FDCAN_IE_DRXE) /* At least one received message stored into a Rx Buffer */ + +/** FDCAN Counter Interrupts **/ +#define FDCAN_INT_TIMESTAMP_WRAPAROUND (FDCAN_IE_TSWE) /* Timestamp counter wrapped around */ +#define FDCAN_INT_TIMEOUT_OCCURRED (FDCAN_IE_TOOE) /* Timeout reached */ + +/** FDCAN Tx Event FIFO Interrupts **/ +#define FDCAN_INT_TX_EVT_FIFO_ELT_LOST (FDCAN_IE_TEFLE) /* Tx Event FIFO element lost */ +#define FDCAN_INT_TX_EVT_FIFO_FULL (FDCAN_IE_TEFFE) /* Tx Event FIFO full */ +#define FDCAN_INT_TX_EVT_FIFO_WATERMARK (FDCAN_IE_TEFWE) /* Tx Event FIFO fill level reached watermark */ +#define FDCAN_INT_TX_EVT_FIFO_NEW_DATA (FDCAN_IE_TEFNE) /* Tx Handler wrote Tx Event FIFO element */ + +/** FDCAN Rx FIFO 0 Interrupts **/ +#define FDCAN_INT_RX_FIFO0_MESSAGE_LOST (FDCAN_IE_RF0LE) /* Rx FIFO 0 message lost */ +#define FDCAN_INT_RX_FIFO0_FULL (FDCAN_IE_RF0FE) /* Rx FIFO 0 full */ +#define FDCAN_INT_RX_FIFO0_WATERMARK (FDCAN_IE_RF0WE) /* Rx FIFO 0 fill level reached watermark */ +#define FDCAN_INT_RX_FIFO0_NEW_MESSAGE (FDCAN_IE_RF0NE) /* New message written to Rx FIFO 0 */ + +/** FDCAN Rx FIFO 1 Interrupts **/ +#define FDCAN_INT_RX_FIFO1_MESSAGE_LOST (FDCAN_IE_RF1LE) /* Rx FIFO 1 message lost */ +#define FDCAN_INT_RX_FIFO1_FULL (FDCAN_IE_RF1FE) /* Rx FIFO 1 full */ +#define FDCAN_INT_RX_FIFO1_WATERMARK (FDCAN_IE_RF1WE) /* Rx FIFO 1 fill level reached watermark */ +#define FDCAN_INT_RX_FIFO1_NEW_MESSAGE (FDCAN_IE_RF1NE) /* New message written to Rx FIFO 1 */ + +/** FDCAN Error Interrupts **/ +#define FDCAN_INT_RAM_ACCESS_FAILURE (FDCAN_IE_MRAFE) /* Message RAM access failure occurred */ +#define FDCAN_INT_ERROR_LOGGING_OVERFLOW (FDCAN_IE_ELOE ) /* Overflow of FDCAN Error Logging Counter occurred */ +#define FDCAN_INT_RAM_WATCHDOG (FDCAN_IE_WDIE ) /* Message RAM Watchdog event due to missing READY */ +#define FDCAN_INT_ARB_PROTOCOL_ERROR (FDCAN_IE_PEAE ) /* Protocol error in arbitration phase detected */ +#define FDCAN_INT_DATA_PROTOCOL_ERROR (FDCAN_IE_PEDE ) /* Protocol error in data phase detected */ +#define FDCAN_INT_RESERVED_ADDRESS_ACCESS (FDCAN_IE_ARAE ) /* Access to reserved address occurred */ + +/** FDCAN Error Status Interrupts **/ +#define FDCAN_INT_ERROR_PASSIVE (FDCAN_IE_EPE) /* Error_Passive status changed */ +#define FDCAN_INT_ERROR_WARNING (FDCAN_IE_EWE) /* Error_Warning status changed */ +#define FDCAN_INT_BUS_OFF (FDCAN_IE_BOE) /* Bus_Off status changed */ + +/** SRAM Bit Error Status Interrupts **/ +#define FDCAN_INT_BITERROR_CORRECTED (FDCAN_IE_BECE) /* Bit Error Corrected */ +#define FDCAN_INT_BITERROR_UNCORRECTED (FDCAN_IE_BEUE) /* Bit Error Uncorrected */ + +/** FDCAN TT Interrupt masks **/ +#define FDCAN_TT_INT_MASK ((uint32_t)0x0007FFFFU) /* FDCAN TT interrupts mask */ + +/** FDCAN TT Flags **/ +#define FDCAN_TT_FLAG_BASIC_CYCLE_START (FDCAN_TTIR_SBC ) /* Start of Basic Cycle */ +#define FDCAN_TT_FLAG_MATRIX_CYCLE_START (FDCAN_TTIR_SMC ) /* Start of Matrix Cycle */ +#define FDCAN_TT_FLAG_SYNC_MODE_CHANGE (FDCAN_TTIR_CSM ) /* Change of Synchronization Mode */ +#define FDCAN_TT_FLAG_START_OF_GAP (FDCAN_TTIR_SOG ) /* Start of Gap */ +#define FDCAN_TT_FLAG_REG_TIME_MARK (FDCAN_TTIR_RTMI) /* Register Time Mark Interrupt */ +#define FDCAN_TT_FLAG_TRIG_TIME_MARK (FDCAN_TTIR_TTMI) /* Trigger Time Mark Event Internal */ +#define FDCAN_TT_FLAG_STOP_WATCH (FDCAN_TTIR_SWE ) /* Stop Watch Event */ +#define FDCAN_TT_FLAG_GLOBAL_TIME_WRAP (FDCAN_TTIR_GTW ) /* Global Time Wrap */ +#define FDCAN_TT_FLAG_GLOBAL_TIME_DISC (FDCAN_TTIR_GTD ) /* Global Time Discontinuity */ +#define FDCAN_TT_FLAG_GLOBAL_TIME_ERROR (FDCAN_TTIR_GTE ) /* Global Time Error */ +#define FDCAN_TT_FLAG_TX_COUNT_UNDERFLOW (FDCAN_TTIR_TXU ) /* Tx Count Underflow */ +#define FDCAN_TT_FLAG_TX_COUNT_OVERFLOW (FDCAN_TTIR_TXO ) /* Tx Count Overflow */ +#define FDCAN_TT_FLAG_SCHEDULING_ERROR_1 (FDCAN_TTIR_SE1 ) /* Scheduling Error 1 */ +#define FDCAN_TT_FLAG_SCHEDULING_ERROR_2 (FDCAN_TTIR_SE2 ) /* Scheduling Error 2 */ +#define FDCAN_TT_FLAG_ERROR_LEVEL_CHANGE (FDCAN_TTIR_ELC ) /* Error Level Changed */ +#define FDCAN_TT_FLAG_INIT_WATCH_TRIGGER (FDCAN_TTIR_IWT ) /* Initialization Watch Trigger */ +#define FDCAN_TT_FLAG_WATCH_TRIGGER (FDCAN_TTIR_WT ) /* Watch Trigger */ +#define FDCAN_TT_FLAG_APPLICATION_WATCHDOG (FDCAN_TTIR_AW ) /* Application Watchdog */ +#define FDCAN_TT_FLAG_CONFIG_ERROR (FDCAN_TTIR_CER ) /* Configuration Error */ + +/** FDCAN TT Schedule Synchronization Interrupts **/ +#define FDCAN_TT_INT_BASIC_CYCLE_START (FDCAN_TTIE_SBCE) /* Start of Basic Cycle */ +#define FDCAN_TT_INT_MATRIX_CYCLE_START (FDCAN_TTIE_SMCE) /* Start of Matrix Cycle */ +#define FDCAN_TT_INT_SYNC_MODE_CHANGE (FDCAN_TTIE_CSME) /* Change of Synchronization Mode */ +#define FDCAN_TT_INT_START_OF_GAP (FDCAN_TTIE_SOGE) /* Start of Gap */ + +/** FDCAN TT Time Mark Interrupts **/ +#define FDCAN_TT_INT_REG_TIME_MARK (FDCAN_TTIE_RTMIE) /* Register Time Mark Interrupt */ +#define FDCAN_TT_INT_TRIG_TIME_MARK (FDCAN_TTIE_TTMIE) /* Trigger Time Mark Event Internal */ + +/** FDCAN TT Stop Watch Interrupt **/ +#define FDCAN_TT_INT_STOP_WATCH (FDCAN_TTIE_SWEE) /* Stop Watch Event */ + +/** FDCAN TT Global Time Interrupts **/ +#define FDCAN_TT_INT_GLOBAL_TIME_WRAP (FDCAN_TTIE_GTWE) /* Global Time Wrap */ +#define FDCAN_TT_INT_GLOBAL_TIME_DISC (FDCAN_TTIE_GTDE) /* Global Time Discontinuity */ + +/** FDCAN TT Disturbing Error Interrupts **/ +#define FDCAN_TT_INT_GLOBAL_TIME_ERROR (FDCAN_TTIE_GTEE) /* Global Time Error */ +#define FDCAN_TT_INT_TX_COUNT_UNDERFLOW (FDCAN_TTIE_TXUE) /* Tx Count Underflow */ +#define FDCAN_TT_INT_TX_COUNT_OVERFLOW (FDCAN_TTIE_TXOE) /* Tx Count Overflow */ +#define FDCAN_TT_INT_SCHEDULING_ERROR_1 (FDCAN_TTIE_SE1E) /* Scheduling Error 1 */ +#define FDCAN_TT_INT_SCHEDULING_ERROR_2 (FDCAN_TTIE_SE2E) /* Scheduling Error 2 */ +#define FDCAN_TT_INT_ERROR_LEVEL_CHANGE (FDCAN_TTIE_ELCE) /* Error Level Changed */ + +/** FDCAN TT Fatal Error Interrupts **/ +#define FDCAN_TT_INT_INIT_WATCH_TRIGGER (FDCAN_TTIE_IWTE) /* Initialization Watch Trigger */ +#define FDCAN_TT_INT_WATCH_TRIGGER (FDCAN_TTIE_WTE ) /* Watch Trigger */ +#define FDCAN_TT_INT_APPLICATION_WATCHDOG (FDCAN_TTIE_AWE ) /* Application Watchdog */ +#define FDCAN_TT_INT_CONFIG_ERROR (FDCAN_TTIE_CERE) /* Configuration Error */ + +/*** Registers bit offset define ***/ + +/** FDCAN DBTP register bit offset define **/ +#define FDCAN_DBTP_DTSEG2_OFFSET (REG_BIT4_OFFSET) /* Date time segment after sample point */ +#define FDCAN_DBTP_DTSEG1_OFFSET (REG_BIT8_OFFSET) /* Date time segment before sample point */ +#define FDCAN_DBTP_DBRP_OFFSET (REG_BIT16_OFFSET) /* Date Bit Rate Prescaler */ +#define FDCAN_DBTP_DSJW_OFFSET (REG_BIT0_OFFSET) /* Date (Re)Synchronization Jump Width */ + +/** FDCAN NBTP register bit offset define **/ +#define FDCAN_NBTP_NTSEG2_OFFSET (REG_BIT0_OFFSET) /* Nominal time segment after sample point */ +#define FDCAN_NBTP_NTSEG1_OFFSET (REG_BIT8_OFFSET) /* Nominal time segment before sample point */ +#define FDCAN_NBTP_NBRP_OFFSET (REG_BIT16_OFFSET) /* Nominal Bit Rate Prescaler */ +#define FDCAN_NBTP_NSJW_OFFSET (REG_BIT25_OFFSET) /* Nominal (Re)Synchronization Jump Width */ + +/** FDCAN TOCC register bit offset define **/ +#define FDCAN_TOCC_TOP_OFFSET (REG_BIT16_OFFSET) /* Timeout Period */ + +/** FDCAN ECR register bit offset define **/ +#define FDCAN_ECR_REC_OFFSET (REG_BIT8_OFFSET) /* Receive Error Counter */ +#define FDCAN_ECR_CEL_OFFSET (REG_BIT16_OFFSET) /* FDCAN Error Logging*/ + +/** FDCAN PSR register bit offset define **/ +#define FDCAN_PSR_TDCV_OFFSET (REG_BIT16_OFFSET) /* FDCAN Transmitter Delay Compensation Value */ + +/** FDCAN TDCR register bit offset define **/ +#define FDCAN_TDCR_TDCO_OFFSET (REG_BIT8_OFFSET) /* ransmitter Delay Compensation SSP Offset */ + +/** FDCAN HPMS register bit offset define **/ +#define FDCAN_HPMS_FIDX_OFFSET (REG_BIT8_OFFSET) /* Filter Index */ + +/** FDCAN RXESC register bit offset define **/ +#define FDCAN_RXESC_F0DS_OFFSET (REG_BIT0_OFFSET ) /* FDCAN Rx FIFO 0 element size */ +#define FDCAN_RXESC_F1DS_OFFSET (REG_BIT4_OFFSET ) /* FDCAN Rx FIFO 1 element size */ +#define FDCAN_RXESC_RBDS_OFFSET (REG_BIT8_OFFSET ) /* FDCAN Rx Buffer element size */ + +/** FDCAN RXF0C/RXF1C register bit offset define **/ +#define FDCAN_RXFXC_FXWM_OFFSET (REG_BIT24_OFFSET ) /* FDCAN Rx FIFO 0/1 watermark */ + +/** FDCAN RXF0C/RXF1C register bit offset define **/ +#define FDCAN_RXFXS_FXGI_OFFSET (REG_BIT8_OFFSET ) /* FDCAN Rx FIFO 0/1 Get Index */ + +/** FDCAN start address and size bit offset define, used for: + - Standard filter list + - Extended filter list + - Rx FIFO0 + - Rx FIFO1 + - Rx buffer + - Tx event FIFO + - Tx buffer + - Trigger Memory + **/ +#define FDCAN_START_ADDRESS_OFFSET (REG_BIT2_OFFSET) /* Start address */ +#define FDCAN_SIZE_NUMBER_OFFSET (REG_BIT16_OFFSET) /* Number of elements */ + +/** FDCAN TXBC register bit offset define **/ +#define FDCAN_TXBC_TFQS_OFFSET (REG_BIT24_OFFSET) /* Tx FIFO/queue elements number */ +#define FDCAN_TXBC_NDTB_OFFSET (REG_BIT16_OFFSET) /* Number of Dedicated Transmit Buffers */ + +/** FDCAN TXFQS register bit offset define **/ +#define FDCAN_TXFQS_TFQPI_OFFSET (REG_BIT16_OFFSET) /* Tx FIFO/Queue Put Index */ + +/** FDCAN TXEFS register bit offset define **/ +#define FDCAN_TXEFS_EFGI_OFFSET (REG_BIT8_OFFSET) /** FDCAN Tx event fifo get index */ + +/* FDCAN start address SRAM5 BANK select */ +#define FDCAN_START_ADDRESS_SRAM5BANK1 ((uint32_t)0x30050000U) /* Select SRAM5 BANK1: 0x30050000 as FDCAN base address. */ +#define FDCAN_START_ADDRESS_SRAM5BANK2 ((uint32_t)0x30054000U) /* Select SRAM5 BANK2: 0x30054000 as FDCAN base address. */ +#define FDCAN_START_ADDRESS_RAMSEL (FDCAN_TTSS_RAMSEL) /* Message RAM select. */ +/** FDCAN TTRMC register bit offset define **/ +#define FDCAN_TTRMC_STD_ID_OFFSET (REG_BIT18_OFFSET) /* TT Standard Reference Identifier */ + +/** FDCAN TTOCF register bit offset define **/ +#define FDCAN_TTOCF_LDSDL_OFFSET (REG_BIT5_OFFSET) /* TT LD of Synchronization Deviation Limit */ +#define FDCAN_TTOCF_IRTO_OFFSET (REG_BIT8_OFFSET) /* TT Initial Reference Trigger Offset*/ +#define FDCAN_TTOCF_AWL_OFFSET (REG_BIT16_OFFSET) /* TT Application Watchdog Limit */ + +/** FDCAN TTMLM register bit offset define **/ +#define FDCAN_TTMLM_TXEW_OFFSET (REG_BIT8_OFFSET) /* TT Tx Enable Window */ +#define FDCAN_TTMLM_ENIT_OFFSET (REG_BIT16_OFFSET) /* TT Expected Number of Tx Triggers */ + +/** FDCAN TURCF register bit offset define **/ +#define FDCAN_TURCF_DC_OFFSET (REG_BIT16_OFFSET) /* TT Time Unit Ratio */ + +/** FDCAN TTGTP register bit offset define **/ +#define FDCAN_TTGTP_CTP_OFFSET (REG_BIT16_OFFSET) /* TT Cycle Time Target Phase */ + +/** FDCAN TTTMK register bit offset define **/ +#define FDCAN_TTTMK_TICC_OFFSET (REG_BIT16_OFFSET) /* TT Time Mark Cycle Code */ + +/** FDCAN TTOST register bit offset define **/ +#define FDCAN_TTOST_RTO_OFFSET (REG_BIT8_OFFSET) /* TT Reference trigger offset */ +#define FDCAN_TTOST_TMP_OFFSET (REG_BIT24_OFFSET) /* TT Time master priority */ +/** Variable declaration **/ +extern FDCAN_MsgRamType FDCAN_MsgRam; + +/** Function declaration **/ +void FDCAN_DeInit(FDCAN_Module* FDCANx); +ErrorStatus FDCAN_Init(FDCAN_Module* FDCANx, FDCAN_InitType *FDCAN_InitParam); +ErrorStatus FDCAN_EnterSleep(FDCAN_Module *FDCANx); +ErrorStatus FDCAN_ExitSleep(FDCAN_Module *FDCANx); +void FDCAN_EnableISOMode(FDCAN_Module *FDCANx); +void FDCAN_DisableISOMode(FDCAN_Module *FDCANx); +void FDCAN_EnableEdgeFilter(FDCAN_Module *FDCANx); +void FDCAN_DisableEdgeFilter(FDCAN_Module *FDCANx); +void FDCAN_Start(FDCAN_Module *FDCANx); +ErrorStatus FDCAN_Stop(FDCAN_Module *FDCANx); +void FDCAN_GetProtocolStatus(FDCAN_Module *FDCANx, FDCAN_ProtocolStatus *ProtocolStatus); +void FDCAN_GetErrorCounters(FDCAN_Module *FDCANx, FDCAN_ErrorCounters *ErrorCounters); +void FDCAN_ConfigRamWatchdog(FDCAN_Module *FDCANx, uint32_t Value); +uint32_t FDCAN_CheckRestrictedMode(FDCAN_Module *FDCANx); +void FDCAN_ExitRestrictedMode(FDCAN_Module *FDCANx); + +void FDCAN_ConfigFilter(FDCAN_Module *FDCANx, FDCAN_FilterType *sFilterConfig); +void FDCAN_ConfigGlobalFilter(FDCAN_Module *FDCANx, + uint32_t NonMatchingStd, + uint32_t NonMatchingExt, + uint32_t RejectRemoteStd, + uint32_t RejectRemoteExt); +void FDCAN_ConfigExtIdMask(FDCAN_Module *FDCANx, uint32_t Mask); + + +void FDCAN_ConfigRxFifoMode(FDCAN_Module *FDCANx, uint32_t RxFifo, uint32_t Mode); +void FDCAN_ConfigFifoWatermark(FDCAN_Module *FDCANx, uint32_t FIFO, uint32_t Watermark); +uint32_t FDCAN_GetRxFifoFillLevel(FDCAN_Module *FDCANx, uint32_t RxFifo); + +ErrorStatus FDCAN_GetRxMsg(FDCAN_Module *FDCANx, uint32_t RxLocation, FDCAN_RxHeaderType *pRxHeader, uint8_t *pRxData); +void FDCAN_GetHpMsgStatus(FDCAN_Module *FDCANx, FDCAN_HpMsgStatus *HpMsgStatus); +ErrorStatus FDCAN_CheckNewRxBufMsg(FDCAN_Module *FDCANx, uint32_t Index); + +void FDCAN_ConfigTSPrescaler(FDCAN_Module *FDCANx, uint32_t Prescaler); +void FDCAN_Config_TS(FDCAN_Module *FDCANx, uint32_t Select); +uint16_t FDCAN_Get_TS(FDCAN_Module *FDCANx); +void FDCAN_Reset_TS(FDCAN_Module *FDCANx); +void FDCAN_ConfigExtTSDivider(FDCAN_Module *FDCANx, uint32_t Div); +void FDCAN_EnableExtTS(FDCAN_Module *FDCANx, FunctionalState Cmd); +void FDCAN_ConfigTimeoutCounter(FDCAN_Module *FDCANx, uint32_t TimeoutSelect, uint32_t TimeoutPeriod); +void FDCAN_EnableTimeoutCounter(FDCAN_Module *FDCANx); +void FDCAN_DisableTimeoutCounter(FDCAN_Module *FDCANx); +uint16_t FDCAN_GetTimeoutCounter(FDCAN_Module *FDCANx); +void FDCAN_ResetTimeoutCounter(FDCAN_Module *FDCANx); + +void FDCAN_ConfigTxDelayCompensation(FDCAN_Module *FDCANx, uint32_t Offset, uint32_t Filter); +void FDCAN_EnableTxDelayCompensation(FDCAN_Module *FDCANx); +void FDCAN_DisableTxDelayCompensation(FDCAN_Module *FDCANx); + +ErrorStatus FDCAN_AddMsgToTxFifoQ(FDCAN_Module *FDCANx, FDCAN_TxHeaderType *pTxHeader, uint8_t *pTxData); +ErrorStatus FDCAN_AddMsgToTxBuffer(FDCAN_Module *FDCANx, FDCAN_TxHeaderType *pTxHeader, uint8_t *pTxData, uint32_t BufferIndex); +void FDCAN_EnableTxBufferRequest(FDCAN_Module *FDCANx, uint32_t BufferIndex); +uint32_t FDCAN_GetLastTxFifoQReqBuf(FDCAN_Module *FDCANx); +void FDCAN_AbortTxRequest(FDCAN_Module *FDCANx, uint32_t BufferIndex); +ErrorStatus FDCAN_GetTxEvent(FDCAN_Module *FDCANx, FDCAN_TxEventFifoType *pTxEvent); +FlagStatus FDCAN_CheckTxBufRequest(FDCAN_Module *FDCANx, uint32_t IndexBit); +FlagStatus FDCAN_CheckBufTxResult(FDCAN_Module *FDCANx, uint32_t IndexBit); +FlagStatus FDCAN_CheckBufTxCancel(FDCAN_Module *FDCANx, uint32_t IndexBit); +uint32_t FDCAN_GetTxFifoFreeLevel(FDCAN_Module *FDCANx); + +ErrorStatus FDCAN_TT_Init(FDCAN_Module *FDCANx, FDCAN_TT_InitType *pTTParams); +void FDCAN_TT_ConfigRefMsg(FDCAN_Module *FDCANx, uint32_t IdType, uint32_t ID, uint32_t Payload); +void FDCAN_TT_ConfigTrigger(FDCAN_Module *FDCANx, FDCAN_TriggerType *sTriggerConfig); +ErrorStatus FDCAN_TT_SetGlobalTime(FDCAN_Module *FDCANx, uint32_t TimePreset); +ErrorStatus FDCAN_TT_SetClockSync(FDCAN_Module *FDCANx, uint32_t NewTURNumerator); +ErrorStatus FDCAN_TT_ConfigStopWatch(FDCAN_Module *FDCANx, uint32_t Source, uint32_t Polarity); +ErrorStatus FDCAN_TT_ConfigRegTimeMark(FDCAN_Module *FDCANx, + uint32_t TimeMarkSource, uint32_t TimeMarkValue, + uint32_t RepeatFactor, uint32_t StartCycle); +ErrorStatus FDCAN_TT_EnableRegTMPulse(FDCAN_Module *FDCANx, FunctionalState Cmd); +ErrorStatus FDCAN_TT_EnableTrigTMPulse(FDCAN_Module *FDCANx, FunctionalState Cmd); +ErrorStatus FDCAN_TT_EnableGapPinCtrl(FDCAN_Module *FDCANx, FunctionalState Cmd); +ErrorStatus FDCAN_TT_EnableTMGapCtrl(FDCAN_Module *FDCANx, FunctionalState Cmd); +ErrorStatus FDCAN_TT_SetNextIsGap(FDCAN_Module *FDCANx); +ErrorStatus FDCAN_TT_SetEndOfGap(FDCAN_Module *FDCANx); +ErrorStatus FDCAN_TT_ConfigExtSyncPhase(FDCAN_Module *FDCANx, uint32_t TargetPhase); +ErrorStatus FDCAN_TT_EnableExtSync(FDCAN_Module *FDCANx, FunctionalState Cmd); +void FDCAN_TT_GetStatus(FDCAN_Module *FDCANx, FDCAN_TT_Status *TTStatus); + +FlagStatus FDCAN_GetFlag(FDCAN_Module *FDCANx, uint32_t Flag); +void FDCAN_ClearFlag(FDCAN_Module *FDCANx, uint32_t Flag); +void FDCAN_ConfigIntLine(FDCAN_Module *FDCANx, uint32_t Int, uint32_t IntLine); +void FDCAN_EnableInt(FDCAN_Module *FDCANx, uint32_t Int); +void FDCAN_DisableInt(FDCAN_Module *FDCANx, uint32_t Int); +FlagStatus FDCAN_GetIntFlag(FDCAN_Module *FDCANx, uint32_t Flag); +ErrorStatus FDCAN_ActivateInt(FDCAN_Module *FDCANx, uint32_t Int, uint32_t BufferIndexes); +void FDCAN_DeactivateInt(FDCAN_Module *FDCANx, uint32_t Int); + +FlagStatus FDCAN_TT_GetIntFlag(FDCAN_Module *FDCANx, uint32_t TT_Flag); +FlagStatus FDCAN_TT_GetFlag(FDCAN_Module *FDCANx, uint32_t TT_Flag); +void FDCAN_TT_ClearFlag(FDCAN_Module *FDCANx, uint32_t TT_Flag); +void FDCAN_TT_ConfigIntLine(FDCAN_Module *FDCANx, uint32_t TT_Int, uint32_t IntLine); +void FDCAN_TT_EnableInt(FDCAN_Module *FDCANx, uint32_t TT_Int, FunctionalState Cmd); +void FDCAN_TT_DisableInt(FDCAN_Module *FDCANx, uint32_t TT_Int); +FlagStatus FDCAN_TT_GetInt(FDCAN_Module *FDCANx, uint32_t TT_Flag); +ErrorStatus FDCAN_TT_ActivateInt(FDCAN_Module *FDCANx, uint32_t TT_Int); +void FDCAN_TT_DeactivateInt(FDCAN_Module *FDCANx, uint32_t TT_Int); + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_78X_FDCAN_H__ */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_femc.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_femc.h new file mode 100644 index 0000000000..cb23e4896e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_femc.h @@ -0,0 +1,372 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_femc.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_FEMC_H__ +#define __N32H76X_78X_FEMC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + + +/** Timing parameters **/ +typedef struct +{ + uint32_t Trc; /* Defines the RC in memory clock cycles. This parameter can be a value between Min_Data = 0 and Max_Data = 0x0F */ + + uint32_t Twc; /* Defines the WC in memory clock cycles. This parameter can be a value between Min_Data = 0 and Max_Data = 0x0F */ + + uint32_t Tcere; /* Defines the CEOE or REA in memory clock cycles. This parameter can be a value between Min_Data = 0 and Max_Data = 7 */ + + uint32_t Twp; /* Defines the WP in memory clock cycles. This parameter can be a value between Min_Data = 0 and Max_Data = 7 */ + + uint32_t Tpcclr; /* Defines the PC OR CLR in memory clock cycles. This parameter can be a value between Min_Data = 0 and Max_Data = 7 */ + + uint32_t Ttrar; /* Defines the TR or AR in memory clock cycles. This parameter can be a value between Min_Data = 0 and Max_Data = 7 */ + + uint32_t Twerr; /* Defines the WE or RR in memory clock cycles. This parameter can be a value between Min_Data = 0 and Max_Data = 7 */ + +} FEMC_TimingInitType; + +/** FEMC Chip Init structure definition **/ +typedef struct +{ + uint32_t ReadSyncMode; /* Defines the read sync enable. This parameter can be a value of @ref FEMC_Memory_Read_Mode */ + + uint32_t WriteSyncMode; /* Defines the write sync enable. This parameter can be a value of @ref FEMC_Memory_Write_Mode */ + + uint32_t ReadBurstLen; /* Defines the number of read data access. This parameter can be a value of @ref FEMC_Memory_Read_Burst_Length. */ + + uint32_t WriteBurstLen; /* Defines the number of write data access. This parameter can be a value of @ref FEMC_Memory_Write_Burst_Length. */ + + uint32_t MemWidth; /* Defines the memory width. This parameter can be a value of @ref FEMC_Memory_Width. */ + + uint32_t BAA; /* Defines the BAA signal enable. This parameter can be a value of @ref FEMC_BAA_Port_Selection. */ + + uint32_t ADV; /* Defines the ADVS signal enable. This parameter can be a value of @ref FEMC_ADV_Port_Selection. */ + + uint32_t BLSS; /* Defines the BLS signal selection. This parameter can be a value of @ref FEMC_BLS_Synchronization_Selection. */ + + uint32_t BurstAlign; /* Defines whether memory bursts are split on memory burst boundaries, when you configure the FEMC to perform synchronous transfers + This parameter can be a value of @ref FEMC_Burst_align_Selection. */ + +} FEMC_ChipInitType; + +/** FEMC Init structure definition **/ +typedef struct +{ + FEMC_ChipInitType ChipCfg; + FEMC_TimingInitType TimingCfg; + +}FEMC_InitType; + +/** FEMC ECC Configuration Structure definition **/ +typedef struct +{ + uint32_t BLKNum; /* Defines the number of 512 byte blocks in a nand flash page. */ + + uint32_t Mode; /* Defines the mode of the ECC block. This parameter can be a value of @ref FEMC_ECC_Mode */ + + uint32_t ReadMode; /* Defines when ECC values are read from memory. This parameter can be a value of @ref FEMC_ECC_Read_Time */ + + uint32_t JUMP; /* Defines whether the memory supports column change address commands or not. This parameter can be a value of @ref FEMC_ECC_Jump_Mode */ + + uint32_t A8OUTMSK; /* Defines if A8 is output with the address. This parameter can be a value of @ref FEMC_ECC_A8_Output */ + + uint32_t ReadINT; /* Defines the ECC pass interrupt state when the ECC data is read from memory. This parameter can be a value of @ref FEMC_ECC_Pass_Interrupt */ + + uint32_t ABTINT; /* Defines the ECC error interrupt state when an error occurs. This parameter can be a value of @ref FEMC_ECC_Abort_Interrupt */ + + uint32_t EXTBLKEN; /* Defines whether enables a small block for extra information after the last 512 bytes block in the page or not. + This parameter can be a value of @ref FEMC_ECC_Extra_Block_State */ + + uint32_t EXTBLKSize; /* Defines the size of the extra block in memory after the last 512-byte block. This parameter can be a value of @ref FEMC_ECC_Extra_Block_Size */ + + uint32_t CMD0; /* Defines the commands that the ECC block uses to detect the start of an ECC operation for nand flash memory interface*/ + + uint32_t CMD1; /* Defines the commands that the ECC block uses to access different parts of a NAND page for nand flash memory interface*/ + +}FEMC_ECCInitType; + +/** Last Ecc Operation Status **/ +typedef enum +{ + COMPLETE = 0U, + UNALIGNADDR = 1U, + DATASTOP = 2U, + DATASTOP_NOREAD = 3U, +} ECC_Last_Stats; + + +#define SRAM_NOR_CHIP_1 (0x00) /* SRAM Nor Flash Chip 0 */ +#define SRAM_NOR_CHIP_2 (0x01) /* SRAM Nor Flash Chip 1 */ +#define SRAM_NOR_CHIP_3 (0x02) /* SRAM Nor Flash Chip 2 */ +#define SRAM_NOR_CHIP_4 (0x03) /* SRAM Nor Flash Chip 3 */ + +#define NAND_CHIP_1 (0x04) /* NAND Chip 1 */ +#define NAND_CHIP_2 (0x05) /* NAND Chip 2 */ + + +/** FEMC Memory Read Mode **/ +#define FEMC_MEM_READ_ASYNC ((uint32_t)0x00000000) +#define FEMC_MEM_READ_SYNC (FEMC_OMCFG_RDSYN) +/** FEMC Memory Write Mode **/ +#define FEMC_MEM_WRITE_ASYNC ((uint32_t)0x00000000) +#define FEMC_MEM_WRITE_SYNC (FEMC_OMCFG_WRSYN) + +/** FEMC Memory Read Burst Length **/ +#define FEMC_MEM_READ_BURST_1 ((uint32_t)0x00000000) /* 1 beat */ +#define FEMC_MEM_READ_BURST_4 (FEMC_OMCFG_RDBL_0) /* 4 beats */ +#define FEMC_MEM_READ_BURST_8 (FEMC_OMCFG_RDBL_1) /* 8 beats */ +#define FEMC_MEM_READ_BURST_16 (FEMC_OMCFG_RDBL_1 | FEMC_OMCFG_RDBL_0) /* 16 beats */ +#define FEMC_MEM_READ_BURST_32 (FEMC_OMCFG_RDBL_2) /* 32 beats */ +#define FEMC_MEM_READ_BURST_CONTINUOUS (FEMC_OMCFG_RDBL_2 | FEMC_OMCFG_RDBL_0) /* continuous */ + +/** FEMC Memory Write Burst Length **/ +#define FEMC_MEM_WRITE_BURST_1 (0UL) /* 1 beat */ +#define FEMC_MEM_WRITE_BURST_4 (FEMC_OMCFG_WRBL_0) /* 4 beats */ +#define FEMC_MEM_WRITE_BURST_8 (FEMC_OMCFG_WRBL_1) /* 8 beats */ +#define FEMC_MEM_WRITE_BURST_16 (FEMC_OMCFG_WRBL_1 | FEMC_OMCFG_WRBL_0) /* 16 beats */ +#define FEMC_MEM_WRITE_BURST_32 (FEMC_OMCFG_WRBL_2) /* 32 beats */ +#define FEMC_MEM_WRITE_BURST_CONTINUOUS (FEMC_OMCFG_WRBL_2 | FEMC_OMCFG_WRBL_0) /* continuous */ + +/** FEMC Memory Width **/ +#define FEMC_MEMORY_WIDTH_8BIT ((uint32_t)0x00000000) +#define FEMC_MEMORY_WIDTH_16BIT (FEMC_OMCFG_MDBW_0) +#define FEMC_MEMORY_WIDTH_32BIT (FEMC_OMCFG_MDBW_1) + +/** FEMC BAA Port Selection **/ +#define FEMC_BAA_PORT_DISABLE ((uint32_t)0x00000000) +#define FEMC_BAA_PORT_ENABLE (FEMC_OMCFG_BAA) + +/** FEMC ADV Port Selection **/ +#define FEMC_ADV_PORT_DISABLE ((uint32_t)0x00000000) +#define FEMC_ADV_PORT_ENABLE (FEMC_OMCFG_ADV) + +/** FEMC_BLS_Synchronization_Selection **/ +#define FEMC_BLS_SYNC_CS ((uint32_t)0x00000000) +#define FEMC_BLS_SYNC_WE (FEMC_OMCFG_BLSS) + +/** FEMC_Burst_align_Selection **/ +#define FEMC_BURST_NO_SPLIT ((uint32_t)0x00000000) +#define FEMC_BURST_SPLIT_ON_32 (FEMC_OMCFG_BSTAGN_0) +#define FEMC_BURST_SPLIT_ON_64 (FEMC_OMCFG_BSTAGN_1) +#define FEMC_BURST_SPLIT_ON_128 (FEMC_OMCFG_BSTAGN_1 | FEMC_OMCFG_BSTAGN_0) +#define FEMC_BURST_SPLIT_ON_256 (FEMC_OMCFG_BSTAGN_2) + +/** FEMC Command **/ +#define FEMC_CMD_UPDATEREGS_AND_AXI ((uint32_t)0x00000000) +#define FEMC_CMD_MDREGCONFIG (FEMC_CTRL_CMDTYPE_0) +#define FEMC_CMD_UPDATEREGS (FEMC_CTRL_CMDTYPE_1) +#define FEMC_CMD_MDREGCONFIG_AND_UPDATEREGS (FEMC_CTRL_CMDTYPE_1 | FEMC_CTRL_CMDTYPE_0) + +/** FEMC CRE Polarity **/ +#define FEMC_CRE_POLARITY_LOW ((uint32_t)0x00000000) /* CRE is LOW */ +#define FEMC_CRE_POLARITY_HIGH (FEMC_CTRL_CREPOL) /* CRE is HIGH when ModeReg write occurs */ + +/** FEMC Flag definition **/ +#define FEMC_SRAM_FLAG (FEMC_STS_RINT0F) +#define FEMC_NAND_FLAG (FEMC_STS_RINT1F) +#define FEMC_ECC_FLAG (FEMC_STS_RECCINTF) +#define FEMC_SRAM_EN_FLAG (FEMC_STS_INT0ENF) +#define FEMC_NAND_EN_FLAG (FEMC_STS_INT1ENF) +#define FEMC_ECC_EN_FLAG (FEMC_STS_ECCINTENF) + +/** FEMC Flag clear */ +#define FEMC_SRAM_FLAG_CLEAR (FEMC_CCFG_INT0CLR) +#define FEMC_NAND_FLAG_CLEAR (FEMC_CCFG_INT1CLR) + +/** FEMC interrupts definition **/ +#define FEMC_IT_SRAM_EN (FEMC_CFG_INT0EN) +#define FEMC_IT_NAND_EN (FEMC_CFG_INT1EN) +#define FEMC_IT_ECC_EN (FEMC_CFG_ECCINTEN) + +/** FEMC interrupts clear */ +#define FEMC_IT_SRAM_FLAG_CLEAR (FEMC_CCFG_INT0CLR) +#define FEMC_IT_NAND_FLAG_CLEAR (FEMC_CCFG_INT1CLR) + +/** FEMC interrupts disable **/ +#define FEMC_IT_SRAM_DIS (FEMC_CCFG_INT0DIS) +#define FEMC_IT_NAND_DIS (FEMC_CCFG_INT1DIS) +#define FEMC_IT_ECC_DIS (FEMC_CCFG_ECCINTDIS) + +/** FEMC interrupts status **/ +#define FEMC_IT_SRAM_FLAG (FEMC_STS_INT0F) +#define FEMC_IT_NAND_FLAG (FEMC_STS_INT1F) +#define FEMC_IT_ECC_FLAG (FEMC_STS_ECCINTF) + +/** FEMC SRAM interface type **/ +#define FEMC_SRAM_MULT (FEMC_STS1_M0TYPE_0 | FEMC_STS1_M0TYPE_1) +#define FEMC_SRAM_NON_MULT (FEMC_STS1_M0TYPE_0) + +/** FEMC ECC Page block number **/ +#define FEMC_ECC_NO_512_BYTES ((uint32_t)0x00000000) +#define FEMC_ECC_ONE_512_BYTES (FEMC_ECCCFG_BLKNUM_0) +#define FEMC_ECC_TWO_512_BYTES (FEMC_ECCCFG_BLKNUM_1) +#define FEMC_ECC_FOUR_512_BYTES (FEMC_ECCCFG_BLKNUM_1 | FEMC_ECCCFG_BLKNUM_0) + +/** FEMC ECC Mode **/ +#define FEMC_ECC_BYPASSED ((uint32_t)0x00000000) +#define FEMC_ECC_FOR_APB (FEMC_ECCCFG_MOD_0) +#define FEMC_ECC_AUTO_WR (FEMC_ECCCFG_MOD_1) + +/** FEMC ECC Read Mode **/ +#define FEMC_ECC_READ_BLOCK_END ((uint32_t)0x00000000) +#define FEMC_ECC_READ_PAGE_END (FEMC_ECCCFG_RMOD) + +/** FEMC ECC Jump Mode **/ +#define FEMC_ECC_NO_JUMP ((uint32_t)0x00000000) +#define FEMC_ECC_COLUMN_JUMP (FEMC_ECCCFG_JUMP_0) +#define FEMC_ECC_FULL_JUMP (FEMC_ECCCFG_JUMP_1) + +/** FEMC ECC A8 Output **/ +#define FEMC_A8_OUTPUT_DISABLE (FEMC_ECCCFG_A8OUTMSK) +#define FEMC_A8_OUTPUT_ENABLE ((uint32_t)0x00000000) + +/** FEMC ECC Pass Interrupt **/ +#define FEMC_ECC_PASS_INTERRUPT_DISABLE ((uint32_t)0x00000000) +#define FEMC_ECC_PASS_INTERRUPT_ENABLE (FEMC_ECCCFG_RDCINT) + +/** FEMC ECC Abort Interrupt **/ +#define FEMC_ECC_ABORT_INTERRUPT_DISABLE ((uint32_t)0x00000000) +#define FEMC_ECC_ABORT_INTERRUPT_ENABLE (FEMC_ECCCFG_ABTINT) + +/** FEMC ECC Extra Block Size **/ +#define FEMC_ECC_EXTRA_BLOCK_4_BYTES ((uint32_t)0x00000000) +#define FEMC_ECC_EXTRA_BLOCK_8_BYTES (FEMC_ECCCFG_EBLKSIZ_0) +#define FEMC_ECC_EXTRA_BLOCK_16_BYTES (FEMC_ECCCFG_EBLKSIZ_1) +#define FEMC_ECC_EXTRA_BLOCK_32_BYTES (FEMC_ECCCFG_EBLKSIZ_1 | FEMC_ECCCFG_EBLKSIZ_0) + +/** FEMC ECC Extra Block State **/ +#define FEMC_ECC_EXTRA_BLOCK_DISABLE ((uint32_t)0x00000000) +#define FEMC_ECC_EXTRA_BLOCK_ENABLE (FEMC_ECCCFG_EBLKEN) + +/** FEMC ECC Page block Index **/ +#define FEMC_ECC_PAGE_BLOCK_INDEX0 ((uint32_t)0x00000000) +#define FEMC_ECC_PAGE_BLOCK_INDEX1 ((uint32_t)0x00000001) +#define FEMC_ECC_PAGE_BLOCK_INDEX2 ((uint32_t)0x00000002) +#define FEMC_ECC_PAGE_BLOCK_INDEX3 ((uint32_t)0x00000003) +#define FEMC_ECC_PAGE_BLOCK_EXTRA ((uint32_t)0x00000004) + +/** FEMC Flag Index **/ +#define FEMC_ECC_FLAG_VALUE_VALID (FEMC_ECCSTS_VLDF_0) +#define FEMC_ECC_FLAG_FAIL (FEMC_ECCSTS_FAILF_0) +#define FEMC_ECC_FLAG_CAN_CORRECT (FEMC_ECCSTS_CORCTF_0) +#define FEMC_ECC_FLAG_READ (FEMC_ECCSTS_RDF_0) + +/** FEMC ECC Page Block Interrupt Index **/ +#define FEMC_ECC_INT_FLAG_PAGE_BLOCK0 (FEMC_ECCSTS_INTF_0) +#define FEMC_ECC_INT_FLAG_PAGE_BLOCK1 (FEMC_ECCSTS_INTF_1) +#define FEMC_ECC_INT_FLAG_PAGE_BLOCK2 (FEMC_ECCSTS_INTF_2) +#define FEMC_ECC_INT_FLAG_PAGE_BLOCK3 (FEMC_ECCSTS_INTF_3) +#define FEMC_ECC_INT_FLAG_PAGE_EXTRA (FEMC_ECCSTS_INTF_4) +#define FEMC_ECC_INT_FLAG_ABORT (FEMC_ECCSTS_INTF_5) + +/** FEMC ECC Block Flag Index **/ +#define FEMC_ECC_BLOCK_FLAG_CAN_CORRECT ((uint32_t)0x0000001) +#define FEMC_ECC_BLOCK_FLAG_FAIL ((uint32_t)0x0000002) +#define FEMC_ECC_BLOCK_FLAG_READ ((uint32_t)0x0000004) +#define FEMC_ECC_BLOCK_FLAG_VALUE_VALID ((uint32_t)0x0000008) +#define FEMC_ECC_BLOCK_FLAG_INTERRUPT ((uint32_t)0x0000010) + +/** FEMC Last status **/ +#define FEMC_ECC_LAST_STATUS_COMPLETE ((uint32_t)0x0000000) +#define FEMC_ECC_LAST_STATUS_UNALIGNADDR (FEMC_ECCSTS_LASTS_0) +#define FEMC_ECC_LAST_STATUS_DATASTOP (FEMC_ECCSTS_LASTS_1) +#define FEMC_ECC_LAST_STATUS_DATASTOP_NOREAD (FEMC_ECCSTS_LASTS_0 | FEMC_ECCSTS_LASTS_1) + +/** FEMC_Exported_Functions **/ +void FEMC_Init(FEMC_InitType *FEMC_InitStruct); +void FEMC_InitStruct(FEMC_InitType* FEMC_InitStruct); +void FEMC_SetCommand(uint32_t Chip, uint32_t Cmd, uint32_t CrePolarity, uint32_t Address); +ErrorStatus FEMC_CheckChipStatus(uint32_t Chip, FEMC_ChipInitType *ChipCfg); +ErrorStatus FEMC_CheckTimingStatus(uint32_t Chip, FEMC_TimingInitType *TimingCfg); +void FEMC_SetRefreshPeriod(uint32_t PeriodVal); +uint32_t FEMC_GetRefreshPeriod(void); +void FEMC_SetAddressmatch(uint32_t Chip, uint32_t Address_Match_Value); +void FEMC_SRAMMuxModeEnable(FunctionalState NewState); +void FEMC_SRAMAGTMEnable(FunctionalState NewState); +void FEMC_SRAMSYNCEnable(FunctionalState NewState); +void FEMC_NANDCSLEnable(FunctionalState NewState); +void FEMC_NANDAGTMEnable(FunctionalState NewState); +void FEMC_NANDSYNCEnable(FunctionalState NewState); +void FEMC_RemapEnable(FunctionalState NewState); +void FEMC_AsyncADVConfig(FunctionalState NewState); +uint32_t FEMC_GetSRAMType(void); + +void FEMC_ClrFlag(uint32_t FEMC_FLAG); +FlagStatus FEMC_GetFlag(uint32_t FEMC_FLAG); +void FEMC_ITConfig(uint32_t FEMC_IT, FunctionalState NewState); +void FEMC_ClrITFlag(uint32_t FEMC_FLAG); +ITStatus FEMC_GetITFlag(uint32_t FEMC_IT_FLAG); + +void FEMC_ECC_Init(const FEMC_ECCInitType *ECCInitType); +void FEMC_SetECCAddr(uint32_t address0, uint32_t address1); +FlagStatus FEMC_GetECCFlag(uint32_t FEMC_ECC_Flag_Index, uint32_t ECC_Block_Index); +FlagStatus FEMC_GetECCITFlag(uint32_t ECC_Block_Index); +void FEMC_ECCClrFlag(uint32_t ECC_Block_Index); +FlagStatus FEMC_GetECCBusyFlag(void); +ECC_Last_Stats FEMC_GetECCLastSTS(void); +FlagStatus FEMC_GetECCRWFlag(void); +FlagStatus FEMC_GetECCBlockSTS(uint32_t ECC_Block_Index, uint32_t FEMC_Block_Flag_Index); +void FEMC_ClrECCBlockSTS(uint32_t ECC_Block_Index, uint32_t FEMC_Block_Flag_Index); +uint32_t FEMC_GetECCvalue(uint32_t ECC_Block_Index); + +#ifdef __cplusplus +} +#endif + +#endif /*__N32H76X_78X_FEMC_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_fmac.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_fmac.h new file mode 100644 index 0000000000..c7127943bc --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_fmac.h @@ -0,0 +1,189 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_fmac.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_FMAC_H +#define __N32H76X_78X_FMAC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/** FMAC Init structure definition **/ + +typedef struct +{ + uint8_t InputBufBaseAddress; /* Base address of the input buffer (X1) within the internal memory (0x00 to 0xFF) */ + + uint8_t InputBufSize; /* Number of 16-bit words allocated to the input buffer (including the optional "headroom")*/ + + uint8_t CoeffBufBaseAddress; /* Base address of the coefficient buffer (X2) within the internal memory (0x00 to 0xFF)*/ + + uint8_t CoeffBufSize; /* Number of 16-bit words allocated to the coefficient buffer */ + + uint8_t OutBufBaseAddress; /* Base address of the output buffer (Y) within the internal memory (0x00 to 0xFF). */ + + uint8_t OutBufSize; /* Number of 16-bit words allocated to the output buffer (including the optional "headroom") */ + + uint8_t P; /* Parameter P (vector length, number of filter taps, etc.) */ + + uint8_t Q; /* Parameter Q (vector length, etc.). Ignored if not needed */ + + uint8_t R; /* Parameter R (gain, etc.). Ignored if not needed. */ + + uint32_t InputBufThreshold; /* Input threshold: the buffer full flag will be set if the number of free spaces in the buffer is lower than this threshold*/ + + uint32_t OutBufThreshold; /* Output threshold: the buffer empty flag will be set if the number of unread values */ + + uint32_t Limit; /* Enable or disable the limit feature */ + + uint32_t Func; /* Filter type */ +} FMAC_InitType; + +/** FMAC preload buffer parameters structure definition **/ +typedef struct +{ + int16_t *pInputData; /* content of the input data */ + uint8_t InputDataSize; /* Size of the input data */ + + int16_t *pCoeffA; /* [IIR only] Initialization of the coefficient vector A. If not needed, it should be set to NULL. */ + uint8_t CoeffASize; /* Size of the coefficient vector A. */ + int16_t *pCoeffB; /* Initialization of the coefficient vector B. If not needed (re-use of a previously loaded buffer), it should be set to NULL. */ + uint8_t CoeffBSize; /* Size of the coefficient vector B. */ + int16_t *pOutputData; /* content of the output data */ + uint8_t OutputDataSize; /* size of the output data */ +} FMAC_PreLoadType; + +/* Function define */ +#define FMAC_FUNC_LOADX1 ((uint32_t)0x01000000U) /* Load X1 buffer */ +#define FMAC_FUNC_LOADX2 ((uint32_t)0x02000000U) /* Load X2 buffer */ +#define FMAC_FUNC_LOADY ((uint32_t)0x03000000U) /* Load Y buffer */ +#define FMAC_FUNC_CONVO_FIR ((uint32_t)0x08000000U) /* Convolution (FIR filter) */ +#define FMAC_FUNC_IIR_DIRECT_FORM_1 ((uint32_t)0x09000000U) /* IIR filter (direct form 1) */ + +/* Buffer threshold define, used for X1 buffer and Y buffer */ +#define FMAC_THRESHOLD1 ((uint32_t)0x00000000U) /* Input: Buffer full flag set if the number of free spaces in the buffer is less than 1. + Output: Buffer empty flag set if the number of unread values in the buffer is less than 1. */ +#define FMAC_THRESHOLD2 ((uint32_t)0x01000000U) /* Input: Buffer full flag set if the number of free spaces in the buffer is less than 2. + Output: Buffer empty flag set if the number of unread values in the buffer is less than 2. */ +#define FMAC_THRESHOLD4 ((uint32_t)0x02000000U) /* Input: Buffer full flag set if the number of free spaces in the buffer is less than 4. + Output: Buffer empty flag set if the number of unread values in the buffer is less than 4. */ +#define FMAC_THRESHOLD8 ((uint32_t)0x03000000U) /* Input: Buffer full flag set if the number of free spaces in the buffer is less than 8. + Output: Buffer empty flag set if the number of unread values in the buffer is less than 8. */ + +/* Data limit define */ +#define FMAC_LIMIT_DISABLE ((uint32_t)0x00000000U) /* Limit disabled */ +#define FMAC_LIMIT_ENABLE FMAC_CTRL_LIMITEN /* Limit enabled */ + +/* FMAC flag definitions */ +#define FMAC_FLAG_YBUFEF FMAC_STS_YBUFEF /* Y buffer empty flag */ +#define FMAC_FLAG_X1BUFFF FMAC_STS_X1BUFFF /* X1 buffer full flag */ +#define FMAC_FLAG_OVF FMAC_STS_OVF /* Overflow error flag */ +#define FMAC_FLAG_UNF FMAC_STS_UNF /* Underflow error flag */ +#define FMAC_FLAG_SATF FMAC_STS_SATF /* Saturation error flag */ + +/* FMAC interrupt definitions */ +#define FMAC_INT_READ FMAC_CTRL_RINTEN /* Enable read interrupt */ +#define FMAC_INT_WRITE FMAC_CTRL_WIINEN /* Enable write interrupt */ +#define FMAC_INT_OV FMAC_CTRL_OVINTEN /* Enable overflow error interrupts */ +#define FMAC_INT_UN FMAC_CTRL_UNINTEN /* Enable underflow error interrupts */ +#define FMAC_INT_SAT FMAC_CTRL_SATINTEN /* Enable saturation error interrupts */ + +/* FMAC DMA mdoe definitions */ +#define FMAC_DMA_READ FMAC_CTRL_DMAREN /* Enable DMA read channel requests */ +#define FMAC_DMA_WRITE FMAC_CTRL_DMAWEN /* Enable DMA write channel requests */ + +/* FMAC interrupt flag definitions */ +#define FMAC_INT_FLAG_YBUFEF ((FMAC_INT_READ << 16U) | FMAC_FLAG_YBUFEF) /* Y buffer empty interrupt flag */ +#define FMAC_INT_FLAG_X1BUFFF ((FMAC_INT_WRITE << 16U) | FMAC_FLAG_X1BUFFF) /* X1 buffer full interrupt flag */ +#define FMAC_INT_FLAG_OVF ((FMAC_INT_OV << 16U) | FMAC_FLAG_OVF) /* Overflow error interrupt flag */ +#define FMAC_INT_FLAG_UNF ((FMAC_INT_UN << 16U) | FMAC_FLAG_UNF) /* underflow error interrupt flag */ +#define FMAC_INT_FLAG_SATF ((FMAC_INT_SAT << 16U) | FMAC_FLAG_SATF) /* saturation error interrupt flag */ +#define FMAC_INT_FLAG_MASK ((uint32_t)0x0000FFFF) + +/* FMAC polling-based communications time-out value */ +#define FMAC_TIMEOUT (400000000U) +/* FMAC reset time-out value */ +#define FMAC_RESET_TIMEOUT_VALUE (200000000U) + +void FMAC_DeInit(void); +void FMAC_StructInit(FMAC_InitType * FMAC_InitStruct); +void FMAC_PreLoadStructInit(FMAC_PreLoadType * FMAC_PreloadStruct); +void FMAC_Init(FMAC_InitType * FMAC_InitStruct); +void FMAC_PreLoadData(uint32_t size, int16_t array[]); +ErrorStatus FMAC_PreloadBufferData(FMAC_PreLoadType * FMAC_PreloadStruct); +void FMAC_ConfigParam(FMAC_InitType* FMAC_ParamStruct); +void FMAC_FilterStart(FMAC_InitType* FMAC_ParamStruct); +ErrorStatus FMAC_Reset(void); +void FMAC_Enable(FunctionalState Cmd); +void FMAC_ConfigX1(uint8_t Baseaddr, uint8_t Bufsize, uint32_t Threshold); +void FMAC_ConfigX2(uint8_t Baseaddr, uint8_t Bufsize); +void FMAC_ConfigY(uint8_t Baseaddr, uint8_t Bufsize, uint32_t Threshold); +void FMAC_WriteData(int16_t data); +int16_t FMAC_ReadData(void); +void FMAC_EnableLimit(FunctionalState Cmd); +void FMAC_EnableDMA(uint32_t dma_req, FunctionalState Cmd); +ErrorStatus FMAC_FinishCalculate(void); +void FMAC_ConfigInt(uint32_t interrupt, FunctionalState Cmd); +FlagStatus FMAC_GetIntStatus(uint32_t FMAC_INT); +FlagStatus FMAC_GetFlagStatus(uint32_t FMAC_FLAG); + + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_78X_FMAC_H */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_gpio.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_gpio.h new file mode 100644 index 0000000000..db2b79deef --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_gpio.h @@ -0,0 +1,912 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_gpio.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ + +#ifndef __N32H76X_78X_GPIO_H__ +#define __N32H76X_78X_GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "n32h76x_78x.h" + + + /*** GPIO Structure Definition Start ***/ + + + /***GPIO Init structure definition***/ +typedef struct +{ + uint32_t Pin; /* Specifies the GPIO pins to be configured. */ + uint32_t GPIO_Mode; /* Specifies the operating mode for the selected pins. */ + uint32_t GPIO_Pull; /* Specifies the Pull-up or Pull-Down activation for the selected pins. */ + uint32_t GPIO_Slew_Rate; /* Specify the reverse speed for the selected pins. */ + uint32_t GPIO_Current; /* Driving capability of the select pins. */ + uint32_t GPIO_Alternate; /* Peripheral to be connected to the selected pins. */ +}GPIO_InitType; + +/** Bit_SET and Bit_RESET enumeration **/ +typedef enum +{ + Bit_RESET = 0, + Bit_SET +}Bit_OperateType; + +/*** GPIO Structure Definition End ***/ + +/*** GPIO Macro Definition Start ***/ +#define GPIO_GET_INDEX(GPIOX_BASE) (((GPIOX_BASE) - GPIOA_BASE)/0x400UL) + +#define GPIO_GET_PERIPH(INDEX) ((GPIO_Module*)(GPIOA_BASE + (INDEX) * 0x400UL)) + +/** Bit mask define **/ +#define GPIO_PMODE_BIT_MASK (GPIO_PMODE_PMODE0) +#define GPIO_PUPD_BIT_MASK (GPIO_PUPD_PUPD0) +#define GPIO_AFSEL_BIT_MASK (GPIO_AFSEL0_AFSEL0) +#define GPIO_DS_BIT_MASK (GPIO_DS_DS0) +#define GPIO_SR_BIT_MASK (GPIO_SR_SR0) +#define AFIO_EXTI_BIT_MASK (AFIO_EXTI_CFG1_EXTI0) + +/** SIP SDRAM priority select in AFIO **/ +#define AFIO_SIP_SDRAM_PRIORITY_HIGH (AFIO_RMP_CFG_SIP_SDRAM_SEL) +#define AFIO_SIP_SDRAM_PRIORITY_LOW ((uint32_t)0x00000000U) + +/** SPI mode definition in AFIO **/ +#define AFIO_SPI1_NSS (AFIO_RMP_CFG_SPI1_NSS) +#define AFIO_SPI2_NSS (AFIO_RMP_CFG_SPI2_NSS) +#define AFIO_SPI3_NSS (AFIO_RMP_CFG_SPI3_NSS) +#define AFIO_SPI4_NSS (AFIO_RMP_CFG_SPI4_NSS) +#define AFIO_SPI5_NSS (AFIO_RMP_CFG_SPI5_NSS) +#define AFIO_SPI6_NSS (AFIO_RMP_CFG_SPI6_NSS) +#define AFIO_SPI7_NSS (AFIO_RMP_CFG_SPI7_NSS) +#define AFIO_SPI_NSS_HIGH_IMPEDANCE ((uint32_t)0x00000000U) +#define AFIO_SPI_NSS_HIGH_LEVEL (AFIO_RMP_CFG_SPI1_NSS) + +/** SIP FLASH MODE SEL in AFIO **/ +#define AFIO_FLASH0 ((uint32_t)0x00000000U) // IS25WJ032F +#define AFIO_FLASH1 AFIO_RMP_CFG_SIP_FLASHSEL_0 // IS25LP016D +#define AFIO_FLASH2 AFIO_RMP_CFG_SIP_FLASHSEL_1 // XM25LU32CK +#define AFIO_FLASH3 AFIO_RMP_CFG_SIP_FLASHSEL_1 | AFIO_RMP_CFG_SIP_FLASHSEL_0 // GT25Q16A +#define AFIO_FLASH4 AFIO_RMP_CFG_SIP_FLASHSEL_2 // GT25Q32A +#define AFIO_DISFLASH AFIO_RMP_CFG_SIP_FLASHSEL_2 | AFIO_RMP_CFG_SIP_FLASHSEL_1 | AFIO_RMP_CFG_SIP_FLASHSEL_0 // Disable SIP segment (switch to Main IOM) Default + +/** EXTI Analog Filter definition in AFIO **/ +#define AFIO_EXTI_FILTER_ENABLE ((uint32_t)0x00000000U) +#define AFIO_EXTI_FILTER_DISABLE (AFIO_RMP_CFG_EXTI_AFLTBYPS) + +/** DBG enable definition in AFIO **/ +#define AFIO_SELECT_SPI1 (AFIO_RMP_CFG_SPI1_SEL) +#define AFIO_SELECT_SPI2 (AFIO_RMP_CFG_SPI2_SEL) +#define AFIO_SELECT_SPI3 (AFIO_RMP_CFG_SPI3_SEL) +#define AFIO_SELECT_SPI4 (AFIO_RMP_CFG_SPI4_SEL) +#define I2S_MODE ((uint32_t)0x00000000U) +#define SPI_MODE (AFIO_RMP_CFG_SPI1_SEL) + +/** SDMMC clk select in AFIO **/ +#define SDMMC1_CLKFB (AFIO_RMP_CFG_SDMMC1_CLKFB) +#define SDMMC2_CLKFB (AFIO_RMP_CFG_SDMMC2_CLKFB) + +#define I2S1_FULLDUPLEX ((uint32_t)0x00000000) +#define I2S2_FULLDUPLEX (AFIO_RMP_CFG_I2S_FDUP_0) +#define I2S3_FULLDUPLEX (AFIO_RMP_CFG_I2S_FDUP_1) +#define I2S4_FULLDUPLEX (AFIO_RMP_CFG_I2S_FDUP_0 | AFIO_RMP_CFG_I2S_FDUP_1) + +#define SIP_Mode_FAST (GPIO_SR_FAST_SLEW) +#define SIP_Mode_SLOW (GPIO_SR_SLOW_SLEW) + +/** XSPI BigEndian select in AFIO **/ +#define XSPI1_ENDIAN (AFIO_RMP_CFG_XSPI1_EDN) +#define XSPI2_ENDIAN (AFIO_RMP_CFG_XSPI2_EDN) +#define XSPI_LITTLE_ENDIAN ((uint32_t)0x00000000U) +#define XSPI_BIG_ENDIAN (AFIO_RMP_CFG_XSPI1_EDN) + +/** FEMC NAND SRAM select in AFIO **/ +#define FEMC_NAND_SEL (AFIO_RMP_CFG_FEMCSEL) +#define FEMC_SRAM_SEL ((uint32_t)0x00000000U) + +/** FEMC NO_BYTE STROBE select in AFIO **/ +#define NO_BYTE_STROBE (AFIO_RMP_CFG_FEMC_NOBYTE) +#define BYTE_STROBE ((uint32_t)0x00000000U) + +/** ETH2 PHY select in AFIO **/ +#define ETH2_RMII_SEL (AFIO_RMP_CFG_ETH2_PHY) +#define ETH2_MII_SEL ((uint32_t)0x00000000U) + +/** ETH1 PHY select in AFIO **/ +#define ETH1_GMII_SEL ((uint32_t)0x00000000U) +#define ETH1_RGMII_SEL (AFIO_RMP_CFG_ETH1_PHY_0) +#define ETH1_RMII_SEL (AFIO_RMP_CFG_ETH1_PHY_1) +#define ETH1_MII_SEL (AFIO_RMP_CFG_ETH1_PHY_0 | AFIO_RMP_CFG_ETH1_PHY_1) + +/** Bit mask define **/ +#define GPIO_PUPD_BIT_MASK (GPIO_PUPD_PUPD0) +#define GPIO_DS_BIT_MASK (GPIO_DS_DS0) +#define GPIO_SR_BIT_MASK (GPIO_SR_SR0) + +/** GPIO_mode_define **/ +#define GPIO_MODE_OD_MARK (GPIO_POTYPE_OPEN_DRAIN << 4) + +#define GPIO_MODE_INPUT (GPIO_PMODE_INPUT) /* Input Floating Mode */ +#define GPIO_MODE_OUTPUT_PP (GPIO_PMODE_OUTPUT) /* Output Push Pull Mode */ +#define GPIO_MODE_OUTPUT_OD (GPIO_PMODE_OUTPUT | GPIO_MODE_OD_MARK) /* Output Open Drain Mode */ +#define GPIO_MODE_AF_PP (GPIO_PMODE_AF_OUTPUT) /* Alternate Function Push Pull Mode */ +#define GPIO_MODE_AF_OD (GPIO_PMODE_AF_OUTPUT | GPIO_MODE_OD_MARK) /* Alternate Function Open Drain Mode */ +#define GPIO_MODE_ANALOG (GPIO_PMODE_ANALOG) /* Analog Mode */ + +/** GPIO pins define **/ +#define GPIO_PIN_0 ((uint16_t)0x0001U) /* Pin 0 selected */ +#define GPIO_PIN_1 ((uint16_t)0x0002U) /* Pin 1 selected */ +#define GPIO_PIN_2 ((uint16_t)0x0004U) /* Pin 2 selected */ +#define GPIO_PIN_3 ((uint16_t)0x0008U) /* Pin 3 selected */ +#define GPIO_PIN_4 ((uint16_t)0x0010U) /* Pin 4 selected */ +#define GPIO_PIN_5 ((uint16_t)0x0020U) /* Pin 5 selected */ +#define GPIO_PIN_6 ((uint16_t)0x0040U) /* Pin 6 selected */ +#define GPIO_PIN_7 ((uint16_t)0x0080U) /* Pin 7 selected */ +#define GPIO_PIN_8 ((uint16_t)0x0100U) /* Pin 8 selected */ +#define GPIO_PIN_9 ((uint16_t)0x0200U) /* Pin 9 selected */ +#define GPIO_PIN_10 ((uint16_t)0x0400U) /* Pin 10 selected */ +#define GPIO_PIN_11 ((uint16_t)0x0800U) /* Pin 11 selected */ +#define GPIO_PIN_12 ((uint16_t)0x1000U) /* Pin 12 selected */ +#define GPIO_PIN_13 ((uint16_t)0x2000U) /* Pin 13 selected */ +#define GPIO_PIN_14 ((uint16_t)0x4000U) /* Pin 14 selected */ +#define GPIO_PIN_15 ((uint16_t)0x8000U) /* Pin 15 selected */ +#define GPIO_PIN_ALL ((uint16_t)0xFFFFU) /* All pins selected */ +#define GPIO_PIN_NONE ((uint16_t)0x0000U) /* None pin selected */ + +/** GPIO Pull-Up or Pull-Down Activation **/ +#define GPIO_NO_PULL (GPIO_PUPD_NO_PULL) /* No Pull-up or Pull-down activation */ +#define GPIO_PULL_UP (GPIO_PUPD_PULL_UP) /* Pull-up activation */ +#define GPIO_PULL_DOWN (GPIO_PUPD_PULL_DOWN) /* Pull-down activation */ + +/** GPIO Drive strength config **/ +#define GPIO_DC_2mA (GPIO_DS_2mA) +#define GPIO_DC_4mA (GPIO_DS_4mA) +#define GPIO_DC_8mA (GPIO_DS_8mA) +#define GPIO_DC_12mA (GPIO_DS_12mA) + +#define GPIO_5VTOL_DC_1mA (GPIO_DS_2mA) +#define GPIO_5VTOL_DC_2mA (GPIO_DS_4mA) +#define GPIO_5VTOL_DC_4mA (GPIO_DS_8mA) +#define GPIO_5VTOL_DC_6mA (GPIO_DS_12mA) + +#define GPIO_SDRAM_DC_1mA (GPIO_DS_2mA) +#define GPIO_SDRAM_DC_2mA (GPIO_DS_2mA) +#define GPIO_SDRAM_DC_4mA (GPIO_DS_4mA) +#define GPIO_SDRAM_DC_5mA (GPIO_DS_4mA) +#define GPIO_SDRAM_DC_8mA (GPIO_DS_8mA) +#define GPIO_SDRAM_DC_12mA (GPIO_DS_12mA) + +/** slew rate config **/ +#define GPIO_SLEW_RATE_FAST (GPIO_SR_FAST_SLEW) +#define GPIO_SLEW_RATE_SLOW (GPIO_SR_SLOW_SLEW) + +/** GPIO port sources **/ +#define GPIOA_PORT_SOURCE ((uint8_t)0x00U) +#define GPIOB_PORT_SOURCE ((uint8_t)0x01U) +#define GPIOC_PORT_SOURCE ((uint8_t)0x02U) +#define GPIOD_PORT_SOURCE ((uint8_t)0x03U) +#define GPIOE_PORT_SOURCE ((uint8_t)0x04U) +#define GPIOF_PORT_SOURCE ((uint8_t)0x05U) +#define GPIOG_PORT_SOURCE ((uint8_t)0x06U) +#define GPIOH_PORT_SOURCE ((uint8_t)0x07U) +#define GPIOI_PORT_SOURCE ((uint8_t)0x08U) +#define GPIOJ_PORT_SOURCE ((uint8_t)0x09U) +#define GPIOK_PORT_SOURCE ((uint8_t)0x0AU) + +/** GPIO pin sources **/ +#define GPIO_PIN_SOURCE0 ((uint8_t)0x00U) /* Pin 0 selected */ +#define GPIO_PIN_SOURCE1 ((uint8_t)0x01U) /* Pin 1 selected */ +#define GPIO_PIN_SOURCE2 ((uint8_t)0x02U) /* Pin 2 selected */ +#define GPIO_PIN_SOURCE3 ((uint8_t)0x03U) /* Pin 3 selected */ +#define GPIO_PIN_SOURCE4 ((uint8_t)0x04U) /* Pin 4 selected */ +#define GPIO_PIN_SOURCE5 ((uint8_t)0x05U) /* Pin 5 selected */ +#define GPIO_PIN_SOURCE6 ((uint8_t)0x06U) /* Pin 6 selected */ +#define GPIO_PIN_SOURCE7 ((uint8_t)0x07U) /* Pin 7 selected */ +#define GPIO_PIN_SOURCE8 ((uint8_t)0x08U) /* Pin 8 selected */ +#define GPIO_PIN_SOURCE9 ((uint8_t)0x09U) /* Pin 9 selected */ +#define GPIO_PIN_SOURCE10 ((uint8_t)0x0AU) /* Pin 10 selected */ +#define GPIO_PIN_SOURCE11 ((uint8_t)0x0BU) /* Pin 11 selected */ +#define GPIO_PIN_SOURCE12 ((uint8_t)0x0CU) /* Pin 12 selected */ +#define GPIO_PIN_SOURCE13 ((uint8_t)0x0DU) /* Pin 13 selected */ +#define GPIO_PIN_SOURCE14 ((uint8_t)0x0EU) /* Pin 14 selected */ +#define GPIO_PIN_SOURCE15 ((uint8_t)0x0FU) /* Pin 15 selected */ + +/** GPIOx_Alternate_function_selection Alternate function selection **/ +#define GPIO_AF0 (GPIO_AFSEL_AF0 ) +#define GPIO_AF1 (GPIO_AFSEL_AF1 ) +#define GPIO_AF2 (GPIO_AFSEL_AF2 ) +#define GPIO_AF3 (GPIO_AFSEL_AF3 ) +#define GPIO_AF4 (GPIO_AFSEL_AF4 ) +#define GPIO_AF5 (GPIO_AFSEL_AF5 ) +#define GPIO_AF6 (GPIO_AFSEL_AF6 ) +#define GPIO_AF7 (GPIO_AFSEL_AF7 ) +#define GPIO_AF8 (GPIO_AFSEL_AF8 ) +#define GPIO_AF9 (GPIO_AFSEL_AF9 ) +#define GPIO_AF10 (GPIO_AFSEL_AF10) +#define GPIO_AF11 (GPIO_AFSEL_AF11) +#define GPIO_AF12 (GPIO_AFSEL_AF12) +#define GPIO_AF13 (GPIO_AFSEL_AF13) +#define GPIO_AF14 (GPIO_AFSEL_AF14) +#define GPIO_AF15 (GPIO_AFSEL_AF15) +#define GPIO_NO_AF (GPIO_AFSEL_AF15) +#define GPIO_NO_AF1 (GPIO_AFSEL_AF13) //user can change no alternate function according different GPIOs + +#define EXTI_GPIOA_Pin_0 ((uint8_t)0x00) +#define EXTI_GPIOB_Pin_0 ((uint8_t)0x01) +#define EXTI_GPIOC_Pin_0 ((uint8_t)0x02) +#define EXTI_GPIOD_Pin_0 ((uint8_t)0x03) +#define EXTI_GPIOE_Pin_0 ((uint8_t)0x04) +#define EXTI_GPIOF_Pin_0 ((uint8_t)0x05) +#define EXTI_GPIOG_Pin_0 ((uint8_t)0x06) +#define EXTI_GPIOH_Pin_0 ((uint8_t)0x07) +#define EXTI_GPIOI_Pin_0 ((uint8_t)0x08) +#define EXTI_GPIOJ_Pin_0 ((uint8_t)0x09) +#define EXTI_GPIOK_Pin_0 ((uint8_t)0x0A) + +#define EXTI_GPIOA_Pin_1 ((uint8_t)0x0B) +#define EXTI_GPIOB_Pin_1 ((uint8_t)0x0C) +#define EXTI_GPIOC_Pin_1 ((uint8_t)0x0D) +#define EXTI_GPIOD_Pin_1 ((uint8_t)0x0E) +#define EXTI_GPIOE_Pin_1 ((uint8_t)0x0F) +#define EXTI_GPIOF_Pin_1 ((uint8_t)0x10) +#define EXTI_GPIOG_Pin_1 ((uint8_t)0x11) +#define EXTI_GPIOH_Pin_1 ((uint8_t)0x12) +#define EXTI_GPIOI_Pin_1 ((uint8_t)0x13) +#define EXTI_GPIOJ_Pin_1 ((uint8_t)0x14) +#define EXTI_GPIOK_Pin_1 ((uint8_t)0x15) + +#define EXTI_GPIOA_Pin_2 ((uint8_t)0x16) +#define EXTI_GPIOB_Pin_2 ((uint8_t)0x17) +#define EXTI_GPIOC_Pin_2 ((uint8_t)0x18) +#define EXTI_GPIOD_Pin_2 ((uint8_t)0x19) +#define EXTI_GPIOE_Pin_2 ((uint8_t)0x1A) +#define EXTI_GPIOF_Pin_2 ((uint8_t)0x1B) +#define EXTI_GPIOG_Pin_2 ((uint8_t)0x1C) +#define EXTI_GPIOH_Pin_2 ((uint8_t)0x1D) +#define EXTI_GPIOI_Pin_2 ((uint8_t)0x1E) +#define EXTI_GPIOJ_Pin_2 ((uint8_t)0x1F) +#define EXTI_GPIOK_Pin_2 ((uint8_t)0x20) + +#define EXTI_GPIOA_Pin_3 ((uint8_t)0x21) +#define EXTI_GPIOB_Pin_3 ((uint8_t)0x22) +#define EXTI_GPIOC_Pin_3 ((uint8_t)0x23) +#define EXTI_GPIOD_Pin_3 ((uint8_t)0x24) +#define EXTI_GPIOE_Pin_3 ((uint8_t)0x25) +#define EXTI_GPIOF_Pin_3 ((uint8_t)0x26) +#define EXTI_GPIOG_Pin_3 ((uint8_t)0x27) +#define EXTI_GPIOH_Pin_3 ((uint8_t)0x28) +#define EXTI_GPIOI_Pin_3 ((uint8_t)0x29) +#define EXTI_GPIOJ_Pin_3 ((uint8_t)0x2A) +#define EXTI_GPIOK_Pin_3 ((uint8_t)0x2B) + +#define EXTI_GPIOA_Pin_4 ((uint8_t)0x2C) +#define EXTI_GPIOB_Pin_4 ((uint8_t)0x2D) +#define EXTI_GPIOC_Pin_4 ((uint8_t)0x2E) +#define EXTI_GPIOD_Pin_4 ((uint8_t)0x2F) +#define EXTI_GPIOE_Pin_4 ((uint8_t)0x30) +#define EXTI_GPIOF_Pin_4 ((uint8_t)0x31) +#define EXTI_GPIOG_Pin_4 ((uint8_t)0x32) +#define EXTI_GPIOH_Pin_4 ((uint8_t)0x33) +#define EXTI_GPIOI_Pin_4 ((uint8_t)0x34) +#define EXTI_GPIOJ_Pin_4 ((uint8_t)0x35) +#define EXTI_GPIOK_Pin_4 ((uint8_t)0x36) + +#define EXTI_GPIOA_Pin_5 ((uint8_t)0x37) +#define EXTI_GPIOB_Pin_5 ((uint8_t)0x38) +#define EXTI_GPIOC_Pin_5 ((uint8_t)0x39) +#define EXTI_GPIOD_Pin_5 ((uint8_t)0x3A) +#define EXTI_GPIOE_Pin_5 ((uint8_t)0x3B) +#define EXTI_GPIOF_Pin_5 ((uint8_t)0x3C) +#define EXTI_GPIOG_Pin_5 ((uint8_t)0x3D) +#define EXTI_GPIOH_Pin_5 ((uint8_t)0x3E) +#define EXTI_GPIOI_Pin_5 ((uint8_t)0x3F) +#define EXTI_GPIOJ_Pin_5 ((uint8_t)0x40) +#define EXTI_GPIOK_Pin_5 ((uint8_t)0x41) + +#define EXTI_GPIOA_Pin_6 ((uint8_t)0x42) +#define EXTI_GPIOB_Pin_6 ((uint8_t)0x43) +#define EXTI_GPIOC_Pin_6 ((uint8_t)0x44) +#define EXTI_GPIOD_Pin_6 ((uint8_t)0x45) +#define EXTI_GPIOE_Pin_6 ((uint8_t)0x46) +#define EXTI_GPIOF_Pin_6 ((uint8_t)0x47) +#define EXTI_GPIOG_Pin_6 ((uint8_t)0x48) +#define EXTI_GPIOH_Pin_6 ((uint8_t)0x49) +#define EXTI_GPIOI_Pin_6 ((uint8_t)0x4A) +#define EXTI_GPIOJ_Pin_6 ((uint8_t)0x4B) +#define EXTI_GPIOK_Pin_6 ((uint8_t)0x4C) + +#define EXTI_GPIOA_Pin_7 ((uint8_t)0x4D) +#define EXTI_GPIOB_Pin_7 ((uint8_t)0x4E) +#define EXTI_GPIOC_Pin_7 ((uint8_t)0x4F) +#define EXTI_GPIOD_Pin_7 ((uint8_t)0x50) +#define EXTI_GPIOE_Pin_7 ((uint8_t)0x51) +#define EXTI_GPIOF_Pin_7 ((uint8_t)0x52) +#define EXTI_GPIOG_Pin_7 ((uint8_t)0x53) +#define EXTI_GPIOH_Pin_7 ((uint8_t)0x54) +#define EXTI_GPIOI_Pin_7 ((uint8_t)0x55) +#define EXTI_GPIOJ_Pin_7 ((uint8_t)0x56) +#define EXTI_GPIOK_Pin_7 ((uint8_t)0x57) + +#define EXTI_GPIOA_Pin_8 ((uint8_t)0x58) +#define EXTI_GPIOB_Pin_8 ((uint8_t)0x59) +#define EXTI_GPIOC_Pin_8 ((uint8_t)0x5A) +#define EXTI_GPIOD_Pin_8 ((uint8_t)0x5B) +#define EXTI_GPIOE_Pin_8 ((uint8_t)0x5C) +#define EXTI_GPIOF_Pin_8 ((uint8_t)0x5D) +#define EXTI_GPIOG_Pin_8 ((uint8_t)0x5E) +#define EXTI_GPIOH_Pin_8 ((uint8_t)0x5F) +#define EXTI_GPIOI_Pin_8 ((uint8_t)0x60) +#define EXTI_GPIOJ_Pin_8 ((uint8_t)0x61) + +#define EXTI_GPIOA_Pin_9 ((uint8_t)0x63) +#define EXTI_GPIOB_Pin_9 ((uint8_t)0x64) +#define EXTI_GPIOC_Pin_9 ((uint8_t)0x65) +#define EXTI_GPIOD_Pin_9 ((uint8_t)0x66) +#define EXTI_GPIOE_Pin_9 ((uint8_t)0x67) +#define EXTI_GPIOF_Pin_9 ((uint8_t)0x68) +#define EXTI_GPIOG_Pin_9 ((uint8_t)0x69) +#define EXTI_GPIOH_Pin_9 ((uint8_t)0x6A) +#define EXTI_GPIOI_Pin_9 ((uint8_t)0x6B) +#define EXTI_GPIOJ_Pin_9 ((uint8_t)0x6C) + +#define EXTI_GPIOA_Pin_10 ((uint8_t)0x6E) +#define EXTI_GPIOB_Pin_10 ((uint8_t)0x6F) +#define EXTI_GPIOC_Pin_10 ((uint8_t)0x70) +#define EXTI_GPIOD_Pin_10 ((uint8_t)0x71) +#define EXTI_GPIOE_Pin_10 ((uint8_t)0x72) +#define EXTI_GPIOF_Pin_10 ((uint8_t)0x73) +#define EXTI_GPIOG_Pin_10 ((uint8_t)0x74) +#define EXTI_GPIOH_Pin_10 ((uint8_t)0x75) +#define EXTI_GPIOI_Pin_10 ((uint8_t)0x76) +#define EXTI_GPIOJ_Pin_10 ((uint8_t)0x77) + +#define EXTI_GPIOA_Pin_11 ((uint8_t)0x79) +#define EXTI_GPIOB_Pin_11 ((uint8_t)0x7A) +#define EXTI_GPIOC_Pin_11 ((uint8_t)0x7B) +#define EXTI_GPIOD_Pin_11 ((uint8_t)0x7C) +#define EXTI_GPIOE_Pin_11 ((uint8_t)0x7D) +#define EXTI_GPIOF_Pin_11 ((uint8_t)0x7E) +#define EXTI_GPIOG_Pin_11 ((uint8_t)0x7F) +#define EXTI_GPIOH_Pin_11 ((uint8_t)0x80) +#define EXTI_GPIOI_Pin_11 ((uint8_t)0x81) +#define EXTI_GPIOJ_Pin_11 ((uint8_t)0x82) + +#define EXTI_GPIOA_Pin_12 ((uint8_t)0x84) +#define EXTI_GPIOB_Pin_12 ((uint8_t)0x85) +#define EXTI_GPIOC_Pin_12 ((uint8_t)0x86) +#define EXTI_GPIOD_Pin_12 ((uint8_t)0x87) +#define EXTI_GPIOE_Pin_12 ((uint8_t)0x88) +#define EXTI_GPIOF_Pin_12 ((uint8_t)0x89) +#define EXTI_GPIOG_Pin_12 ((uint8_t)0x8A) +#define EXTI_GPIOH_Pin_12 ((uint8_t)0x8B) +#define EXTI_GPIOI_Pin_12 ((uint8_t)0x8C) +#define EXTI_GPIOJ_Pin_12 ((uint8_t)0x8D) + +#define EXTI_GPIOA_Pin_13 ((uint8_t)0x8F) +#define EXTI_GPIOB_Pin_13 ((uint8_t)0x90) +#define EXTI_GPIOC_Pin_13 ((uint8_t)0x91) +#define EXTI_GPIOD_Pin_13 ((uint8_t)0x92) +#define EXTI_GPIOE_Pin_13 ((uint8_t)0x93) +#define EXTI_GPIOF_Pin_13 ((uint8_t)0x94) +#define EXTI_GPIOG_Pin_13 ((uint8_t)0x95) +#define EXTI_GPIOH_Pin_13 ((uint8_t)0x96) +#define EXTI_GPIOI_Pin_13 ((uint8_t)0x97) +#define EXTI_GPIOJ_Pin_13 ((uint8_t)0x98) + +#define EXTI_GPIOA_Pin_14 ((uint8_t)0x9A) +#define EXTI_GPIOB_Pin_14 ((uint8_t)0x9B) +#define EXTI_GPIOC_Pin_14 ((uint8_t)0x9C) +#define EXTI_GPIOD_Pin_14 ((uint8_t)0x9D) +#define EXTI_GPIOE_Pin_14 ((uint8_t)0x9E) +#define EXTI_GPIOF_Pin_14 ((uint8_t)0x9F) +#define EXTI_GPIOG_Pin_14 ((uint8_t)0xA0) +#define EXTI_GPIOH_Pin_14 ((uint8_t)0xA1) +#define EXTI_GPIOI_Pin_14 ((uint8_t)0xA2) +#define EXTI_GPIOJ_Pin_14 ((uint8_t)0xA3) + +#define EXTI_GPIOA_Pin_15 ((uint8_t)0xA5) +#define EXTI_GPIOB_Pin_15 ((uint8_t)0xA6) +#define EXTI_GPIOC_Pin_15 ((uint8_t)0xA7) +#define EXTI_GPIOD_Pin_15 ((uint8_t)0xA8) +#define EXTI_GPIOE_Pin_15 ((uint8_t)0xA9) +#define EXTI_GPIOF_Pin_15 ((uint8_t)0xAA) +#define EXTI_GPIOG_Pin_15 ((uint8_t)0xAB) +#define EXTI_GPIOH_Pin_15 ((uint8_t)0xAC) +#define EXTI_GPIOI_Pin_15 ((uint8_t)0xAD) +#define EXTI_GPIOJ_Pin_15 ((uint8_t)0xAE) + +#define AFIO_TOL5V_PA0 (AFIO_TOL5V_CFG1_PA0TOLENN) +#define AFIO_TOL5V_PA0_C (AFIO_TOL5V_CFG1_PA0_C_TOLENN) +#define AFIO_TOL5V_PA1 (AFIO_TOL5V_CFG1_PA1TOLENN) +#define AFIO_TOL5V_PA1_C (AFIO_TOL5V_CFG1_PA1_C_TOLENN) +#define AFIO_TOL5V_PA2 (AFIO_TOL5V_CFG1_PA2TOLENN) +#define AFIO_TOL5V_PA3 (AFIO_TOL5V_CFG1_PA3TOLENN) +#define AFIO_TOL5V_PA4 (AFIO_TOL5V_CFG1_PA4TOLENN) +#define AFIO_TOL5V_PA5 (AFIO_TOL5V_CFG1_PA5TOLENN) +#define AFIO_TOL5V_PA6 (AFIO_TOL5V_CFG1_PA6TOLENN) +#define AFIO_TOL5V_PA7 (AFIO_TOL5V_CFG1_PA7TOLENN) + +#define AFIO_TOL5V_PB0 (AFIO_TOL5V_CFG2_PB0TOLENN) +#define AFIO_TOL5V_PB1 (AFIO_TOL5V_CFG2_PB1TOLENN) + +#define AFIO_TOL5V_PC0 (AFIO_TOL5V_CFG3_PC0TOLENN) +#define AFIO_TOL5V_PC1 (AFIO_TOL5V_CFG3_PC1TOLENN) +#define AFIO_TOL5V_PC2 (AFIO_TOL5V_CFG3_PC2TOLENN) +#define AFIO_TOL5V_PC2_C (AFIO_TOL5V_CFG3_PC2_C_TOLENN) +#define AFIO_TOL5V_PC3 (AFIO_TOL5V_CFG3_PC3TOLENN) +#define AFIO_TOL5V_PC3_C (AFIO_TOL5V_CFG3_PC3_C_TOLENN) +#define AFIO_TOL5V_PC4 (AFIO_TOL5V_CFG3_PC4TOLENN) +#define AFIO_TOL5V_PC5 (AFIO_TOL5V_CFG3_PC5TOLENN) +#define AFIO_TOL5V_PC6 (AFIO_TOL5V_CFG3_PC6TOLENN) +#define AFIO_TOL5V_PC8 (AFIO_TOL5V_CFG3_PC8TOLENN) +#define AFIO_TOL5V_PC13 (AFIO_TOL5V_CFG3_PC13TOLENN) + +#define AFIO_TOL5V_PF3 (AFIO_TOL5V_CFG4_PF3TOLENN) +#define AFIO_TOL5V_PF4 (AFIO_TOL5V_CFG4_PF4TOLENN) +#define AFIO_TOL5V_PF5 (AFIO_TOL5V_CFG4_PF5TOLENN) +#define AFIO_TOL5V_PF6 (AFIO_TOL5V_CFG4_PF6TOLENN) +#define AFIO_TOL5V_PF7 (AFIO_TOL5V_CFG4_PF7TOLENN) +#define AFIO_TOL5V_PF8 (AFIO_TOL5V_CFG4_PF8TOLENN) +#define AFIO_TOL5V_PF9 (AFIO_TOL5V_CFG4_PF9TOLENN) +#define AFIO_TOL5V_PF10 (AFIO_TOL5V_CFG4_PF10TOLENN) +#define AFIO_TOL5V_PF11 (AFIO_TOL5V_CFG4_PF11TOLENN) +#define AFIO_TOL5V_PF12 (AFIO_TOL5V_CFG4_PF12TOLENN) +#define AFIO_TOL5V_PF13 (AFIO_TOL5V_CFG4_PF13TOLENN) +#define AFIO_TOL5V_PF14 (AFIO_TOL5V_CFG4_PF14TOLENN) + +#define AFIO_TOL5V_PH2 (AFIO_TOL5V_CFG5_PH2TOLENN) +#define AFIO_TOL5V_PH3 (AFIO_TOL5V_CFG5_PH3TOLENN) +#define AFIO_TOL5V_PH4 (AFIO_TOL5V_CFG5_PH4TOLENN) +#define AFIO_TOL5V_PH5 (AFIO_TOL5V_CFG5_PH5TOLENN) + +#define AFIO_TOL5V_PI8 (AFIO_TOL5V_CFG6_PI8TOLENN) +#define AFIO_TOL5V_PI15 (AFIO_TOL5V_CFG6_PI15TOLENN) + +#define AFIO_TOL5V_PJ0 (AFIO_TOL5V_CFG7_PJ0TOLENN) +#define AFIO_TOL5V_PJ3 (AFIO_TOL5V_CFG7_PJ3TOLENN) +#define AFIO_TOL5V_PJ4 (AFIO_TOL5V_CFG7_PJ4TOLENN) +#define AFIO_TOL5V_PJ5 (AFIO_TOL5V_CFG7_PJ5TOLENN) +#define AFIO_TOL5V_PJ6 (AFIO_TOL5V_CFG7_PJ6TOLENN) +#define AFIO_TOL5V_PJ7 (AFIO_TOL5V_CFG7_PJ7TOLENN) + + +typedef enum +{ + SHRT_FAULT_CHANNEL_1 = 0, + SHRT_FAULT_CHANNEL_2, + SHRT_FAULT_CHANNEL_3, + SHRT_FAULT_CHANNEL_4, + SHRT_FAULT_CHANNEL_5, + SHRT_FAULT_CHANNEL_6, +}SHRT_FAULT_CHANNEL_NUM; + +/*FAULT*/ +typedef enum +{ + SHRT1_FAULT_CHANNEL_PA15 = 1, + SHRT1_FAULT_CHANNEL_PB3, + SHRT1_FAULT_CHANNEL_PC11, + SHRT1_FAULT_CHANNEL_PD4, + SHRT1_FAULT_CHANNEL_PE4, + SHRT1_FAULT_CHANNEL_PG9, + SHRT1_FAULT_CHANNEL_PG10, + SHRT1_FAULT_CHANNEL_PI6, + SHRT1_FAULT_CHANNEL_PI15, + SHRT1_FAULT_CHANNEL_PK2, +}SHRT1_FAULT_CHANNEL; + +typedef enum +{ + SHRT2_FAULT_CHANNEL_PC5 = 1, + SHRT2_FAULT_CHANNEL_PD1, + SHRT2_FAULT_CHANNEL_PD15, + SHRT2_FAULT_CHANNEL_PF9, + SHRT2_FAULT_CHANNEL_PF13, + SHRT2_FAULT_CHANNEL_PG1, + SHRT2_FAULT_CHANNEL_PI0, + SHRT2_FAULT_CHANNEL_PI9, + SHRT2_FAULT_CHANNEL_PI13, + SHRT2_FAULT_CHANNEL_PJ0, + SHRT2_FAULT_CHANNEL_PK1, + SHRT2_FAULT_CHANNEL_PK6, +}SHRT2_FAULT_CHANNEL; + +typedef enum +{ + SHRT_EXEV_CHANNEL_1 = 0, + SHRT_EXEV_CHANNEL_2, + SHRT_EXEV_CHANNEL_3, + SHRT_EXEV_CHANNEL_4, + SHRT_EXEV_CHANNEL_5, + SHRT_EXEV_CHANNEL_6, + SHRT_EXEV_CHANNEL_7, + SHRT_EXEV_CHANNEL_8, + SHRT_EXEV_CHANNEL_9, + SHRT_EXEV_CHANNEL_10, +}SHRT_EXEV_CHANNEL_NUM; + +/*External Event*/ +typedef enum +{ + SHRT1_EXEV_CHANNEL_PB4 = 1, + SHRT1_EXEV_CHANNEL_PB5, + SHRT1_EXEV_CHANNEL_PB6, + SHRT1_EXEV_CHANNEL_PB7, + SHRT1_EXEV_CHANNEL_PC10, + SHRT1_EXEV_CHANNEL_PC12, + SHRT1_EXEV_CHANNEL_PD5, + SHRT1_EXEV_CHANNEL_PD8, + SHRT1_EXEV_CHANNEL_PD9, + SHRT1_EXEV_CHANNEL_PE6, + SHRT1_EXEV_CHANNEL_PG0, + SHRT1_EXEV_CHANNEL_PG11, + SHRT1_EXEV_CHANNEL_PG12, + SHRT1_EXEV_CHANNEL_PG13, + SHRT1_EXEV_CHANNEL_PI14, + SHRT1_EXEV_CHANNEL_PJ5, + SHRT1_EXEV_CHANNEL_PK3, + SHRT1_EXEV_CHANNEL_PK4, +}SHRT1_EXEV_CHANNEL; + +typedef enum +{ + SHRT2_EXEV_CHANNEL_PA2 = 1, + SHRT2_EXEV_CHANNEL_PC4, + SHRT2_EXEV_CHANNEL_PD0, + SHRT2_EXEV_CHANNEL_PD11, + SHRT2_EXEV_CHANNEL_PE3, + SHRT2_EXEV_CHANNEL_PE14, + SHRT2_EXEV_CHANNEL_PF10, + SHRT2_EXEV_CHANNEL_PG8, + SHRT2_EXEV_CHANNEL_PG15, + SHRT2_EXEV_CHANNEL_PH7, + SHRT2_EXEV_CHANNEL_PH8, + SHRT2_EXEV_CHANNEL_PH10, + SHRT2_EXEV_CHANNEL_PH11, + SHRT2_EXEV_CHANNEL_PH12, + SHRT2_EXEV_CHANNEL_PI11, + SHRT2_EXEV_CHANNEL_PJ2, + SHRT2_EXEV_CHANNEL_PJ14, + SHRT2_EXEV_CHANNEL_PK0, +}SHRT2_EXEV_CHANNEL; + +#define AFIO_SIP_DAT0 (0x00) +#define AFIO_SIP_DAT1 (0x01) +#define AFIO_SIP_DAT2 (0x02) +#define AFIO_SIP_DAT3 (0x03) +#define AFIO_SIP_DAT4 (0x04) +#define AFIO_SIP_DAT5 (0x05) +#define AFIO_SIP_DAT6 (0x06) +#define AFIO_SIP_DAT7 (0x07) +#define AFIO_SIP_MASK ((uint32_t)0x00000003U) +#define AFIO_SIP_Mode_NO_PULL (GPIO_PUPD_NO_PULL) /* No Pull-up or Pull-down activation */ +#define AFIO_SIP_Mode_PULL_UP (GPIO_PUPD_PULL_UP) /* Pull-up activation */ +#define AFIO_SIP_Mode_PULL_DOWN (GPIO_PUPD_PULL_DOWN) /* Pull-down activation */ + +/** AFIO SIP Drive strength config **/ +#define SIP_DC_2mA (GPIO_DS_2mA) +#define SIP_DC_4mA (GPIO_DS_4mA) +#define SIP_DC_8mA (GPIO_DS_8mA) +#define SIP_DC_12mA (GPIO_DS_12mA) + +/** AFIO SIP Slew_Rate **/ +#define SIP_Mode_FAST (GPIO_SR_FAST_SLEW) +#define SIP_Mode_SLOW (GPIO_SR_SLOW_SLEW) + +/** ADC switch config **/ +#define ADC_SW_PA0_C_MSK (AFIO_ADCSW_CFG_SWPA0_C) +#define ADC_SW_PA0_C_ADC2_INP0 (AFIO_ADCSW_CFG_SWPA0_C_0) +#define ADC_SW_PA0_C_ADC2_INP1 (AFIO_ADCSW_CFG_SWPA0_C_1) +#define ADC_SW_PA0_C_ADC1_INP0 (AFIO_ADCSW_CFG_SWPA0_C_2) +#define ADC_SW_PA0_C_ADC1_INP1 (AFIO_ADCSW_CFG_SWPA0_C_3) +#define ADC_SW_PA0_C_CLOSE ((uint32_t)0x00000000U) + +#define ADC_SW_PC2_C_MSK (AFIO_ADCSW_CFG_SWPC2_C) +#define ADC_SW_PC2_C_ADC2_INP0 (AFIO_ADCSW_CFG_SWPC2_C_0) +#define ADC_SW_PC2_C_ADC2_INP1 (AFIO_ADCSW_CFG_SWPC2_C_1) +#define ADC_SW_PC2_C_ADC3_INP0 (AFIO_ADCSW_CFG_SWPC2_C_2) +#define ADC_SW_PC2_C_ADC3_INP1 (AFIO_ADCSW_CFG_SWPC2_C_3) +#define ADC_SW_PC2_C_CLOSE ((uint32_t)0x00000000U) + +#define ADC_SW_PC3_C_MSK (AFIO_ADCSW_CFG_SWPC3_C) +#define ADC_SW_PC3_C_ADC2_INP1 (AFIO_ADCSW_CFG_SWPC3_C_0) +#define ADC_SW_PC3_C_ADC3_INP2 (AFIO_ADCSW_CFG_SWPC3_C_1) +#define ADC_SW_PC3_C_CLOSE ((uint32_t)0x00000000U) + +#define ADC_SW_PA1_C_MSK (AFIO_ADCSW_CFG_SWPA1_C) +#define ADC_SW_PA1_C_ADC2_INP1 (AFIO_ADCSW_CFG_SWPA1_C_0) +#define ADC_SW_PA1_C_ADC1_INP1 (AFIO_ADCSW_CFG_SWPA1_C_1) +#define ADC_SW_PA1_C_CLOSE ((uint32_t)0x00000000U) + +#define ADC_SW_PI15_MSK (AFIO_ADCSW_CFG_SWPI15) +#define ADC_SW_PI15_ADC2_INP17 (AFIO_ADCSW_CFG_SWPI15_0) +#define ADC_SW_PI15_ADC3_INP17 (AFIO_ADCSW_CFG_SWPI15_1) +#define ADC_SW_PI15_CLOSE ((uint32_t)0x00000000U) + +#define ADC_SW_VBAT_MSK (0x00000000) +#define ADC_SW_VBAT_ADC3_INP17 (AFIO_ADCSW_CFG_VBAT) + +#define ADC_SW_PJ0_MSK (0x00000000) +#define ADC_SW_PJ0_ADC2_INP16 (AFIO_ADCSW_CFG_SW_PJ0) + +#define ADC_SW_PJ3_MSK (0x00000000) +#define ADC_SW_PJ3_ADC3_INP18 (AFIO_ADCSW_CFG_SW_PJ3) + +#define ADC_SW_TEMP_MSK (0x00000000) +#define ADC_SW_TEMP_ADC3_INP18 (AFIO_ADCSW_CFG_SW_TEMP) + +#define ADC_SW_PJ4_MSK (0x00000000) +#define ADC_SW_PJ4_ADC3_INP19 (AFIO_ADCSW_CFG_SW_PJ4) + +#define ADC_SW_PJ5_MSK (0x00000000) +#define ADC_SW_PJ5_ADC2_INP16 (AFIO_ADCSW_CFG_SW_PJ5) + +#define ADC_SW_PJ6_MSK (0x00000000) +#define ADC_SW_PJ6_ADC3_INP18 (AFIO_ADCSW_CFG_SW_PJ6) + +#define ADC_SW_PJ7_MSK (0x00000000) +#define ADC_SW_PJ7_ADC3_INP19 (AFIO_ADCSW_CFG_SW_PJ7) + +#define ADC_SW_VREF_MSK (0x00000000) +#define ADC_SW_VREF_ADC3_INP19 (AFIO_ADCSW_CFG_VREF) + +#define ADC_SW_DAC246_OUT_MSK (AFIO_ADCSW_CFG_SW_DAC246_OUT) +#define ADC_SW_DAC2_OUT_ADC2_INP17 (AFIO_ADCSW_CFG_SW_DAC2_OUT) +#define ADC_SW_DAC4_OUT_ADC2_INP17 (AFIO_ADCSW_CFG_SW_DAC4_OUT) +#define ADC_SW_DAC6_OUT_ADC2_INP17 (AFIO_ADCSW_CFG_SW_DAC6_OUT) +#define ADC_SW_DAC246_OUT_ADC2_DISABLE ((uint32_t)0x00000000U) + +#define ADC_SW_DAC135_OUT_MSK (AFIO_ADCSW_CFG_SW_DAC135_OUT) +#define ADC_SW_DAC1_OUT_ADC2_INP16 (AFIO_ADCSW_CFG_SW_DAC1_OUT) +#define ADC_SW_DAC3_OUT_ADC2_INP16 (AFIO_ADCSW_CFG_SW_DAC3_OUT) +#define ADC_SW_DAC5_OUT_ADC2_INP16 (AFIO_ADCSW_CFG_SW_DAC5_OUT) +#define ADC_SW_DAC135_OUT_ADC2_DISABLE ((uint32_t)0x00000000U) + +typedef enum +{ + AFIO_ADC_1 = 2U, + AFIO_ADC_2 = 1U, + AFIO_ADC_3 = 0U +}AFIO_ADC_NUM; + +typedef enum +{ + AFIO_ADC_ETRR = 0U, + AFIO_ADC_ETRI = 1U +}AFIO_ADC_ETRType; + +typedef enum +{ + AFIO_ADC_TRIG_EXTI_0 = 0x00U, + AFIO_ADC_TRIG_EXTI_1 = 0x01U, + AFIO_ADC_TRIG_EXTI_2, + AFIO_ADC_TRIG_EXTI_3, + AFIO_ADC_TRIG_EXTI_4, + AFIO_ADC_TRIG_EXTI_5, + AFIO_ADC_TRIG_EXTI_6, + AFIO_ADC_TRIG_EXTI_7, + AFIO_ADC_TRIG_EXTI_8, + AFIO_ADC_TRIG_EXTI_9, + AFIO_ADC_TRIG_EXTI_10, + AFIO_ADC_TRIG_EXTI_11, + AFIO_ADC_TRIG_EXTI_12, + AFIO_ADC_TRIG_EXTI_13, + AFIO_ADC_TRIG_EXTI_14, + AFIO_ADC_TRIG_EXTI_15, +}AFIO_ADC_Trig_RemapType; + +typedef enum +{ + AFIO_SDRAM_PIN_PA4 = 0, + AFIO_SDRAM_PIN_PA5 = 1, + AFIO_SDRAM_PIN_PA7, + AFIO_SDRAM_PIN_PB5, + AFIO_SDRAM_PIN_PB6, + AFIO_SDRAM_PIN_PB14, + AFIO_SDRAM_PIN_PB15, + AFIO_SDRAM_PIN_PC0, + AFIO_SDRAM_PIN_PC2, + AFIO_SDRAM_PIN_PC3, + AFIO_SDRAM_PIN_PC4, + AFIO_SDRAM_PIN_PC5, + AFIO_SDRAM_PIN_PC12, + AFIO_SDRAM_PIN_PD0, + AFIO_SDRAM_PIN_PD1, + AFIO_SDRAM_PIN_PD2, + AFIO_SDRAM_PIN_PD8, + AFIO_SDRAM_PIN_PD9, + AFIO_SDRAM_PIN_PD10, + AFIO_SDRAM_PIN_PD14, + AFIO_SDRAM_PIN_PD15, + AFIO_SDRAM_PIN_PE0, + AFIO_SDRAM_PIN_PE1, + AFIO_SDRAM_PIN_PE7, + AFIO_SDRAM_PIN_PE8, + AFIO_SDRAM_PIN_PE9, + AFIO_SDRAM_PIN_PE10, + AFIO_SDRAM_PIN_PE11, + AFIO_SDRAM_PIN_PE12, + AFIO_SDRAM_PIN_PE13, + AFIO_SDRAM_PIN_PE14, + AFIO_SDRAM_PIN_PE15, + + AFIO_SDRAM_PIN_PF0, + AFIO_SDRAM_PIN_PF1, + AFIO_SDRAM_PIN_PF2, + AFIO_SDRAM_PIN_PF3, + AFIO_SDRAM_PIN_PF4, + AFIO_SDRAM_PIN_PF5, + AFIO_SDRAM_PIN_PF11, + AFIO_SDRAM_PIN_PF12, + AFIO_SDRAM_PIN_PF13, + AFIO_SDRAM_PIN_PF14, + AFIO_SDRAM_PIN_PF15, + AFIO_SDRAM_PIN_PG0, + AFIO_SDRAM_PIN_PG1, + AFIO_SDRAM_PIN_PG2, + AFIO_SDRAM_PIN_PG4, + AFIO_SDRAM_PIN_PG5, + AFIO_SDRAM_PIN_PG8, + AFIO_SDRAM_PIN_PG15, + AFIO_SDRAM_PIN_PH2, + AFIO_SDRAM_PIN_PH3, + AFIO_SDRAM_PIN_PH5, + AFIO_SDRAM_PIN_PH6, + AFIO_SDRAM_PIN_PH7, + AFIO_SDRAM_PIN_PH8, + AFIO_SDRAM_PIN_PH9, + AFIO_SDRAM_PIN_PH10, + AFIO_SDRAM_PIN_PH11, + AFIO_SDRAM_PIN_PH12, + AFIO_SDRAM_PIN_PH13, + AFIO_SDRAM_PIN_PH14, + AFIO_SDRAM_PIN_PH15, + AFIO_SDRAM_PIN_PI0, + + AFIO_SDRAM_PIN_PI1, + AFIO_SDRAM_PIN_PI2, + AFIO_SDRAM_PIN_PI3, + AFIO_SDRAM_PIN_PI4, + AFIO_SDRAM_PIN_PI5, + AFIO_SDRAM_PIN_PI6, + AFIO_SDRAM_PIN_PI7, + AFIO_SDRAM_PIN_PI9, + AFIO_SDRAM_PIN_PI10 +} AFIO_SDRAM_PIN; + + +/** GPIO_Exported_Functions **/ +void GPIO_DeInit( GPIO_Module *GPIOx); +void GPIO_AFIODeInit( void ); +void GPIO_InitStruct(GPIO_InitType* InitStruct); +void GPIO_InitPeripheral( GPIO_Module* GPIOx, GPIO_InitType* GPIO_InitStruct); +uint8_t GPIO_ReadInputDataBit( GPIO_Module* GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadInputData( GPIO_Module* GPIOx ); +uint8_t GPIO_ReadOutputDataBit( GPIO_Module* GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadOutputData( GPIO_Module* GPIOx ); +void GPIO_SetBits( GPIO_Module* GPIOx, uint16_t GPIO_Pin); +void GPIO_ResetBits( GPIO_Module* GPIOx, uint16_t GPIO_Pin ); +void GPIO_WriteBit( GPIO_Module* GPIOx, uint16_t GPIO_Pin, Bit_OperateType BitVal); +void GPIO_Write( GPIO_Module* GPIOx, uint16_t data_value ); +void GPIO_TogglePin(GPIO_Module *GPIOx, uint16_t Pin); +void GPIO_ConfigPinLock( GPIO_Module* GPIOx, uint16_t GPIO_Pin); + +void GPIO_ConfigEXTILine(uint8_t EXTI_Line, uint8_t GPIO_PinSource); +void AFIO_ConfigEXTIFilter(uint32_t EXTI_Filter); + +void AFIO_ConfigADCExtLineTrigSource(AFIO_ADC_NUM ADC_num, AFIO_ADC_ETRType ADCETRType, AFIO_ADC_Trig_RemapType ADCTrigRemap); + +void GPIO_AFIOInitDefault(void); +void AFIO_ConfigSHRT1EXEVPin(SHRT1_EXEV_CHANNEL channel_pin, SHRT_EXEV_CHANNEL_NUM channel_num); +void AFIO_ConfigSHRT1FALTPin(SHRT1_FAULT_CHANNEL channel_pin, SHRT_FAULT_CHANNEL_NUM channel_num); +void AFIO_ConfigSHRT2EXEVPin(SHRT2_EXEV_CHANNEL channel_pin, SHRT_EXEV_CHANNEL_NUM channel_num); +void AFIO_ConfigSHRT2FALTPin(SHRT2_FAULT_CHANNEL channel_pin, SHRT_FAULT_CHANNEL_NUM channel_num); +void AFIO_ConfigSIPFLASHSEL(uint32_t AFIO_FLASH); +void AFIO_ConfigSIPSDRAMPrior(uint32_t priority); +void AFIO_ConfigSPII2SMode(uint32_t AFIO_SPIx_I2Sx, uint32_t PADS_Mode); +void AFIO_ConfigSPINSSMode(uint32_t AFIO_SPIx_NSS, uint32_t NSS_Mode); +void AFIO_ConfigXSPIBigEndian(uint32_t xspi_endian, uint32_t Endian); +void AFIO_ConfigIOFilter(uint8_t Filter_Cycle); +void AFIO_ConfigPinAnFilter(GPIO_Module* GPIOx, uint32_t Pin,FunctionalState cmd); +void AFIO_ConfigPinFilter(GPIO_Module* GPIOx, uint32_t Pin,FunctionalState cmd); +void AFIO_ConfigHSMODE(GPIO_Module* GPIOx, uint32_t Pin, FunctionalState cmd); +void AFIO_ConfigPinTol5VGPIOA(uint32_t Pin,FunctionalState cmd); +void AFIO_ConfigPinTol5VGPIOB(uint32_t Pin,FunctionalState cmd); +void AFIO_ConfigPinTol5VGPIOC(uint32_t Pin,FunctionalState cmd); +void AFIO_ConfigPinTol5VGPIOF(uint32_t Pin,FunctionalState cmd); +void AFIO_ConfigPinTol5VGPIOH(uint32_t Pin,FunctionalState cmd); +void AFIO_ConfigPinTol5VGPIOI(uint32_t Pin,FunctionalState cmd); +void AFIO_ConfigPinTol5VGPIOJ(uint32_t Pin,FunctionalState cmd); +void AFIO_ConfigSDRAMDSNRemap(AFIO_SDRAM_PIN pin, FunctionalState cmd); +void AFIO_ConfigSDRAMDSPRemap(AFIO_SDRAM_PIN pin, FunctionalState cmd); +void AFIO_ConfigSDRAMVREFRemap(AFIO_SDRAM_PIN pin, FunctionalState cmd); +void AFIO_ConfigSDRAMVREFData(uint8_t reg_index, uint32_t data); +void AFIO_ConfigSDRAMDSNData(uint8_t reg_index, uint32_t data); +void AFIO_ConfigSDRAMDSPData(uint8_t reg_index, uint32_t data); +void AFIO_ConfigETH1Mode(uint32_t ETH1_PHY_sel); +void AFIO_ConfigETH2Mode(uint32_t ETH2_PHY_sel); +void AFIO_ConfigFEMCNANDSRAM(uint32_t Nand_Sram_sel); +void AFIO_FEMCNOByteStrobe(uint32_t Byte_Strobes_sel); +void AFIO_I2SFullpuplexSel(uint32_t AFIO_clk_sel); +void AFIO_SDMMCClkSel(uint32_t AFIO_clk_sel, FunctionalState cmd); +void AFIO_ConfigXSPIDecNonce(uint8_t nonce_num, u32 data); +void AFIO_SIPInitPeripheral(uint8_t sip_index, uint32_t pupd, uint32_t slew_rate, uint32_t driver_stength); + +void AFIO_ADCSWPJ0Enable(FunctionalState Cmd); +void AFIO_ADCSWPJ3Enable(FunctionalState Cmd); +void AFIO_ADCSWPJ4Enable(FunctionalState Cmd); +void AFIO_ADCSWPJ5Enable(FunctionalState Cmd); +void AFIO_ADCSWPJ6Enable(FunctionalState Cmd); +void AFIO_ADCSWPJ7Enable(FunctionalState Cmd); +void AFIO_ADCSWTEMPEnable(FunctionalState Cmd); +void AFIO_ADCSWVBATEnable(FunctionalState Cmd); +void AFIO_ADCSWVREFEnable(FunctionalState Cmd); + +void AFIO_ConfigADCSWDAC246OUT(uint32_t ADCsw); +void AFIO_ConfigADCSWDAC135OUT(uint32_t ADCsw); +void AFIO_ConfigADCSWPA0_C(uint32_t ADCsw); +void AFIO_ConfigADCSWPA1_C(uint32_t ADCsw); +void AFIO_ConfigADCSWPC2_C(uint32_t ADCsw); +void AFIO_ConfigADCSWPC3_C(uint32_t ADCsw); +void AFIO_ConfigADCSWPI15(uint32_t ADCsw); + + +#ifdef __cplusplus +} + +#endif + +#endif /* __N32H76X_78X_GPIO_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_i2c.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_i2c.h new file mode 100644 index 0000000000..d3998e7a0e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_i2c.h @@ -0,0 +1,430 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_i2c.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_I2C_H__ +#define __N32H76X_78X_I2C_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/** n32h76x_78x_StdPeriph_Driver **/ + +/** I2C Init structure definition **/ + +typedef struct +{ + uint32_t Timing; /* Specifies the I2C_BUSTIM_register value. + This parameter calculated by referring to I2C initialization + section in Reference manual */ + + uint32_t HSTiming; /* Specifies the I2C_HSBUSTIM_register value. + This parameter calculated by referring to I2C initialization + section in Reference manual */ + + uint32_t OwnAddress1; /* Specifies the first device own address. + This parameter can be a 7-bit or 10-bit address. */ + + uint32_t AddressingMode; /* Specifies if 7-bit or 10-bit addressing mode is selected. */ + + uint32_t DualAddressMode; /* Specifies if dual addressing mode is selected. */ + + uint32_t OwnAddress2; /* Specifies the second device own address if dual addressing mode is selected + This parameter can be a 7-bit address. */ + + uint32_t OwnAddress2Masks; /* Specifies the acknowledge mask address second device own address if dual addressing mode is selected */ + + uint32_t GeneralCallMode; /* Specifies if general call mode is selected. */ + + uint32_t NoStretchMode; /* Specifies if nostretch mode is selected. */ + +} I2C_InitType; + + + +#define I2C_REG_BIT_MASK ((uint32_t)0x00000000U) +#define TIMING_CLEAR_MASK (0xF0FFFFFFU) +#define CTRL1_CLEAR_MASK (~(I2C_CTRL1_GENC|I2C_CTRL1_NOSTRCH)) +#define CTRL2_CLEAR_MASK (~(I2C_CTRL2_ADR10|I2C_CTRL2_AUTOSTOP|I2C_CTRL2_NAK)) + +/** High speed setting with sys_clk = 30Mhz **/ +#define I2C_H_SPEED_2_7_4_MHZ 0x00010204 +#define I2C_H_SPEED_3_MHZ 0x00010104 +#define I2C_H_SPEED_3_3_4_MHZ 0x00010103 +#define I2C_H_SPEED_3_7_7_MHZ 0x00010102 +#define I2C_TIMING 0x50210607 //48Mhz Sys_Clk :400Khz + +/** I2C_ADDRESSING_MODE I2C Addressing Mode **/ +#define I2C_ADDRESSINGMODE_7BIT (0x00000001U) +#define I2C_ADDRESSINGMODE_10BIT (0x00000002U) + +/** I2C_DUAL_ADDRESSING_MODE I2C Dual Addressing Mode **/ +#define I2C_DUALADDRESS_DISABLE (I2C_REG_BIT_MASK) +#define I2C_DUALADDRESS_ENABLE I2C_ADR2_AD2EN + +/** I2C AD2MASK mask **/ +#define I2C_ADDRESS2MASK_NONE (I2C_REG_BIT_MASK) +#define I2C_ADDRESS2MASK_1 (I2C_ADR2_AD2MSK_0) +#define I2C_ADDRESS2MASK_2_1 (I2C_ADR2_AD2MSK_1) +#define I2C_ADDRESS2MASK_3_1 (I2C_ADR2_AD2MSK_0|I2C_ADR2_AD2MSK_1) +#define I2C_ADDRESS2MASK_4_1 (I2C_ADR2_AD2MSK_2) +#define I2C_ADDRESS2MASK_5_1 (I2C_ADR2_AD2MSK_0|I2C_ADR2_AD2MSK_2) +#define I2C_ADDRESS2MASK_6_1 (I2C_ADR2_AD2MSK_1|I2C_ADR2_AD2MSK_2) +#define I2C_ADDRESS2MASK_7_1 (I2C_ADR2_AD2MSK) + +/** I2C_GENERAL_CALL_ADDRESSING_MODE I2C General Call Addressing Mode **/ +#define I2C_GENERALCALL_DISABLE (I2C_REG_BIT_MASK) +#define I2C_GENERALCALL_ENABLE I2C_CTRL1_GENC + +/** I2C_NOSTRCH_MODE I2C No-Stretch Mode **/ +#define I2C_NOSTRCH_DISABLE (I2C_REG_BIT_MASK) +#define I2C_NOSTRCH_ENABLE I2C_CTRL1_NOSTRCH + + +/** I2C Private Defines **/ + +/** I2C SPE mask **/ +#define CTRL1_SPEN_SET I2C_CTRL1_I2CEN +#define CTRL1_SPEN_RESET (~I2C_CTRL1_I2CEN) + +/** I2C DF mask **/ +#define CTRL1_DF_SET I2C_CTRL1_DF +/** I2C DFX filter mask **/ +#define CTRL1_DFX_SET I2C_CTRL1_DFX + +#define CTRL1_DF10_RESET (~(I2C_CTRL1_DFX | I2C_CTRL1_DF)) + +/** I2C AF mask **/ +#define CTRL1_AF_SET I2C_CTRL1_AFOFF +#define CTRL1_AF_RESET (~I2C_CTRL1_AFOFF) + +/** I2C DMA TRANSMISSION mask **/ +#define CTRL1_DMAWREN_TRANSMISSION_SET I2C_CTRL1_DMAWREN +#define CTRL1_DMAWREN_TRANSMISSION_RESET (~I2C_CTRL1_DMAWREN) + +/** I2C DMA RECEPTION mask **/ +#define CTRL1_DMARDEN_RECEPTION_SET I2C_CTRL1_DMARDEN +#define CTRL1_DMARDEN_RECEPTION_RESET (~I2C_CTRL1_DMARDEN) + +/** I2C (SBCTL)SLAVE BYTE CONTROL mask **/ +#define CTRL1_SBCTL_SET I2C_CTRL1_SBCTL +#define CTRL1_SBCTL_RESET (~I2C_CTRL1_SBCTL) + +/** I2C NOSTRETCH mask **/ +#define CTRL1_NOSTRETCH_SET I2C_CTRL1_NOSTRCH +#define CTRL1_NOSTRETCH_RESET (~I2C_CTRL1_NOSTRCH) + +/** I2C GENC mask **/ +#define CTRL1_GENC_SET I2C_CTRL1_GENC +#define CTRL1_GENC_RESET (~I2C_CTRL1_GENC) + +/** I2C SMBH mask **/ +#define CTRL1_SMBH_SET I2C_CTRL1_SMBH +#define CTRL1_SMBH_RESET (~I2C_CTRL1_SMBH) + +/** I2C SMBD mask **/ +#define CTRL1_SMBD_SET I2C_CTRL1_SMBD +#define CTRL1_SMBD_RESET (~I2C_CTRL1_SMBD) + +/** I2C ALRTEN mask **/ +#define CTRL1_ALRTEN_SET I2C_CTRL1_ALRTEN +#define CTRL1_ALRTEN_RESET (~I2C_CTRL1_ALRTEN) + +/** I2C CRC mask **/ +#define CTRL1_CRCEN_SET I2C_CTRL1_CRCEN +#define CTRL1_CRCEN_RESET (~I2C_CTRL1_CRCEN) + +/** I2C RX FIFO INTERRUPT mask **/ +#define CTRL1_FRXIE_SET I2C_CTRL1_FRXIE +#define CTRL1_FRXIE_RESET (~I2C_CTRL1_FRXIE) + +/** I2C TX FIFO INTERRUPT mask **/ +#define CTRL1_FTXIE_SET I2C_CTRL1_FTXIE +#define CTRL1_FTXIE_RESET (~I2C_CTRL1_FTXIE) + +/** I2C NAK mask **/ +#define STSINT_ADRRCV_MASK I2C_STSINT_ADRRCV + +/** I2C MASTER TRANSFER DIRECTION **/ +#define CTRL2_MASTER_WRITE (~I2C_CTRL2_RD_RWNN) +#define CTRL2_MASTER_READ I2C_CTRL2_RD_RWNN + +/** I2C 10/7 addressing mode **/ +#define CTRL2_ADR10 I2C_CTRL2_ADR10 +#define CTRL2_ADR7 (~I2C_CTRL2_ADR10) + +/** I2C HDR10 mask **/ +#define CTRL2_HDR10_ENABLE I2C_CTRL2_HDR10 +#define CTRL2_HDR10_DISABLE (~I2C_CTRL2_HDR10) + +/** I2C START mask **/ +#define CTRL2_START_ENABLE I2C_CTRL2_START +#define CTRL2_START_DISABLE (~I2C_CTRL2_START) + +/** I2C STOP mask **/ +#define CTRL2_STOP_ENABLE I2C_CTRL2_STOP +#define CTRL2_STOP_DISABLE (~I2C_CTRL2_STOP) + +/** I2C NAK mask **/ +#define CTRL2_NACK I2C_CTRL2_NAK +#define CTRL2_ACK (~I2C_CTRL2_NAK) + +/** I2C REFILL **/ +#define CTRL2_REFILL_ENABLE I2C_CTRL2_REFILL +#define CTRL2_REFILL_DISABLE (~I2C_CTRL2_REFILL) + +/** I2C AUTOSTOP **/ +#define CTRL2_AUTO_STOP I2C_CTRL2_AUTOSTOP +#define CTRL2_SOFTWARE_STOP (~I2C_CTRL2_AUTOSTOP) + +/** I2C CRCBYTE mask **/ +#define CTRL2_CRCBYTE_ENABLE I2C_CTRL2_CRCBYTE +#define CTRL2_CRCBYTE_DISABLE (~I2C_CTRL2_CRCBYTE) + +/** I2C own ADR1 mask **/ +#define ADR1_OWN_ADR1_ENABLE I2C_ADR1_AD1EN +#define ADR1_OWN_ADR1_DISABLE (~I2C_ADR1_AD1EN) + +/** I2C AD1MODE mask **/ +#define ADR1MODE_10_BIT_ADDR I2C_ADR1_AD1MODE +#define ADR1MODE_7_BIT_ADDR (~I2C_ADR1_AD1MODE) + +/** I2C AD2 mask **/ +#define ADR2_ENABLE I2C_ADR2_AD2EN +#define ADR2_DISABLE (~I2C_ADR2_AD2EN) + +/** I2C ADD2 mask **/ +#define ADR2_AD2_RESET (~I2C_ADR2_AD2) +#define ADR2_AD2_SET I2C_ADR2_AD2 + +/** I2C TMOUTA idle clok timeout detection **/ +#define TMOUTA_SCL_LOW_TMOUT (~I2C_TMOUTR_TMIDLE) +#define TMOUTA_SCL_SDA_LOW_TMOUT I2C_TMOUTR_TMIDLE + +/** I2C TMOUTEN mask **/ +#define TMOUTEN_ENABLE I2C_TMOUTR_TMOUTEN +#define TMOUTEN_DISABLE (~I2C_TMOUTR_TMOUTEN) + +/** I2C TMEXTEN mask **/ +#define TMEXTEN_ENABLE I2C_TMOUTR_TMEXTEN +#define TMEXTEN_DISABLE (~I2C_TMOUTR_TMEXTEN) + +/** I2C TX FIFO active **/ +#define TFE_ENABLE I2C_FIFOCSR_TFE +#define TFE_DISABLE (~I2C_FIFOCSR_TFE) + +/** I2C RX FIFO active **/ +#define RFE_ENABLE I2C_FIFOCSR_RFE +#define RFE_DISABLE (~I2C_FIFOCSR_RFE) + +/** I2C TX_ILEVEL **/ +#define TX_ILEVEL_1 I2C_FIFOCSR_TX_ILEVEL01 +#define TX_ILEVEL_2 I2C_FIFOCSR_TX_ILEVEL02 +#define TX_ILEVEL_3 I2C_FIFOCSR_TX_ILEVEL03 +#define TX_ILEVEL_4 I2C_FIFOCSR_TX_ILEVEL04 +#define TX_ILEVEL_5 I2C_FIFOCSR_TX_ILEVEL05 +#define TX_ILEVEL_6 I2C_FIFOCSR_TX_ILEVEL06 +#define TX_ILEVEL_7 I2C_FIFOCSR_TX_ILEVEL07 +#define TX_ILEVEL_8 I2C_FIFOCSR_TX_ILEVEL08 + +/** I2C RX_ILEVEL **/ +#define RX_ILEVEL_1 I2C_FIFOCSR_RX_ILEVEL01 +#define RX_ILEVEL_2 I2C_FIFOCSR_RX_ILEVEL02 +#define RX_ILEVEL_3 I2C_FIFOCSR_RX_ILEVEL03 +#define RX_ILEVEL_4 I2C_FIFOCSR_RX_ILEVEL04 +#define RX_ILEVEL_5 I2C_FIFOCSR_RX_ILEVEL05 +#define RX_ILEVEL_6 I2C_FIFOCSR_RX_ILEVEL06 +#define RX_ILEVEL_7 I2C_FIFOCSR_RX_ILEVEL07 +#define RX_ILEVEL_8 I2C_FIFOCSR_RX_ILEVEL08 + +/** I2C QUICK COMMAND **/ +#define QCMD_ENABLE I2C_QCMD_QCMDEN +#define QCMD_DISABLE (~I2C_QCMD_QCMDEN) + +#define QCMDAD_MASK (~I2C_QCMD_QCMDAD) + +/** I2C SCL ANALOG FILTER mask **/ +#define SCLAFENN_ENABLE I2C_GFLTRCTRL_SCLAFENN +#define SCLAFENN_DISABLE (~I2C_GFLTRCTRL_SCLAFENN) + +/** I2C bus timeout **/ +#define I2C_TMOUTA_MASK (~I2C_TMOUTR_TMOUTA) +#define I2C_TMOUTB_MASK (~I2C_TMOUTR_TMOUTB) + +#define I2C_TMOUTA_DETECT_SCL_LOW (I2C_REG_BIT_MASK) +#define I2C_TMOUTA_DETECT_BUS_IDLE (I2C_TMOUTR_TMIDLE) + +/** I2C Analogue Filter Width **/ +/* I2C GFLTRCTRL mask */ +#define I2C_SDAAFW_MASK (~I2C_GFLTRCTRL_SDAAFW) +#define I2C_SCLAFW_MASK (~I2C_GFLTRCTRL_SCLAFW) + +#define I2C_ANALOG_FILTER_WIDTH_5NS (I2C_REG_BIT_MASK) +#define I2C_ANALOG_FILTER_WIDTH_15NS (I2C_GFLTRCTRL_SDAAFW_0) +#define I2C_ANALOG_FILTER_WIDTH_25NS (I2C_GFLTRCTRL_SDAAFW_1) +#define I2C_ANALOG_FILTER_WIDTH_35NS (I2C_GFLTRCTRL_SDAAFW) + +/** I2C SDA ANALOG FILTER mask **/ +#define SDAAFENN_ENABLE I2C_GFLTRCTRL_SDAAFENN +#define SDAAFENN_DISABLE (~I2C_GFLTRCTRL_SDAAFENN) + +#define I2C_SADR_RWN_MASK (~(I2C_CTRL2_RWN|I2C_CTRL2_SADR)) +#define I2C_SADR_MASK (I2C_CTRL2_SADR) +#define I2C_DIRECTION_SEND (I2C_REG_BIT_MASK) +#define I2C_DIRECTION_RECV (I2C_CTRL2_RWN) + +/** I2C Flag definition **/ +#define I2C_FLAG_WRE I2C_STSINT_WRE +#define I2C_FLAG_WRAVL I2C_STSINT_WRAVL +#define I2C_FLAG_RDAVL I2C_STSINT_RDAVL +#define I2C_FLAG_ADR I2C_STSINT_ADR +#define I2C_FLAG_NAKF I2C_STSINT_NAKF +#define I2C_FLAG_STOPF I2C_STSINT_STOPF +#define I2C_FLAG_TFC I2C_STSINT_TFC +#define I2C_FLAG_TFCR I2C_STSINT_TFCR +#define I2C_FLAG_BSER I2C_STSINT_BSER +#define I2C_FLAG_ABLO I2C_STSINT_ABLO +#define I2C_FLAG_OVF I2C_STSINT_OVF +#define I2C_FLAG_CRCERR I2C_STSINT_CRCERR +#define I2C_FLAG_TMOUT I2C_STSINT_TMOUT +#define I2C_FLAG_ALRT I2C_STSINT_ALRT +#define I2C_FLAG_QADR I2C_STSINT_QADR +#define I2C_FLAG_BUSY I2C_STSINT_BUSY +#define I2C_FLAG_DIR I2C_STSINT_DIR +#define I2C_FLAG_FRXNE I2C_STSINT_FRXNE +#define I2C_FLAG_FTXIS I2C_STSINT_FTXIS + +/** I2C_interrupts_definition **/ +#define I2C_INT_WDR I2C_CTRL1_WDRIE /* TX interrupt enable */ +#define I2C_INT_RDR I2C_CTRL1_RDRIE /* RX interrupt enable */ +#define I2C_INT_ADR I2C_CTRL1_ADRIE +#define I2C_INT_NACK I2C_CTRL1_NAKIE /* Address match interrupt enable */ +#define I2C_INT_STOP I2C_CTRL1_STOPIE /* Stop detection interrupt enable */ +#define I2C_INT_TFC I2C_CTRL1_TFCIE /* Transfer complete interrupt enable */ +#define I2C_INT_ERR I2C_CTRL1_ERRIE /* Error interrupt enable */ +#define I2C_INT_RXFIFO I2C_CTRL1_FRXIE /* FIFO RX interrupt enable */ +#define I2C_INT_TXFIFO I2C_CTRL1_FTXIE /* FIFO TX interrupt enable */ + +/* I2C BYTENUM byte number mask */ +#define BYTENUM_Mask (~I2C_CTRL2_BYTECNT) +/* I2C FIFO_TX_ILEVEL mask */ +#define FIFO_TX_ILEVEL_Mask (~I2C_FIFOCSR_TXILEVEL) +/* I2C FIFO_RX_ILEVEL mask */ +#define FIFO_RX_ILEVEL_Mask (~I2C_FIFOCSR_RXILEVEL) +/* I2C FIFO_TX_ILEVEL mask */ +#define FIFO_TX_FLEVEL_Mask (I2C_FIFOCSR_TXFLEVEL) +/* I2C FIFO_RX_ILEVEL mask */ +#define FIFO_RX_FLEVEL_Mask (I2C_FIFOCSR_RXFLEVEL) + +/** I2C_Exported_Macros **/ + +/** I2C_Exported_Functions **/ +void I2C_DeInit(I2C_Module* I2Cx); +void I2C_Init(I2C_Module* I2Cx, I2C_InitType* I2C_InitStruct); +void I2C_InitStruct(I2C_InitType* I2C_StructInit); +void I2C_Enable(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_ConfigSendAddress(I2C_Module* I2Cx, uint32_t address, uint32_t direction); +void I2C_Enable10bitAddressHeader(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableAutomaticEnd(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableReload(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_GenerateStart(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_GenerateStop(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_ConfigAck(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_ConfigOwnAddr2(I2C_Module* I2Cx, uint8_t Address); +void I2C_EnableDualAddr(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableGeneralCall(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableSlaveByteControl(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableSMBusAlert(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableSMBusDefaultAddr(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableSMBusHostAddr(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_SendData(I2C_Module* I2Cx, uint8_t Data); +uint8_t I2C_RecvData(I2C_Module* I2Cx); +void I2C_SendCRC(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableCRC(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableQuickCommand(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_ConfigQuickCommandAddr(I2C_Module* I2Cx, uint8_t Address); +void I2C_EnableTXFIFO(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableRXFIFO(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableTXDMA(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableRXDMA(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_SetTransferByteNumber(I2C_Module* I2Cx, uint8_t Number_Of_bytes); +void I2C_SetTXFIFO_ILEVEL(I2C_Module* I2Cx, uint8_t TX_ILEVEL); +void I2C_SetRXFIFO_ILEVEL(I2C_Module* I2Cx, uint8_t RX_ILEVEL); +void I2C_EnableSCLTimeoutDetection(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableExtenClkTimeout(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_SetBusTimeoutA(I2C_Module* I2Cx, uint32_t bus_timeout); +void I2C_SetBusTimeoutB(I2C_Module* I2Cx, uint32_t bus_timeout); +void I2C_ConfigIdleClockTimeout(I2C_Module* I2Cx, uint32_t bus_timeout); +void I2C_EnableAnalogFilter(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableSDAAnalogFilter(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_EnableSCLAnalogFilter(I2C_Module* I2Cx, FunctionalState Cmd); +void I2C_SetSCLAnalogFilterWidth(I2C_Module* I2Cx, uint32_t width); +void I2C_SetSDAAnalogFilterWidth(I2C_Module* I2Cx, uint32_t width); +void I2C_SetDigitalFilterWidth(I2C_Module* I2Cx, uint32_t width); +void I2C_ClrFlag(I2C_Module* I2Cx, uint32_t I2C_FLAG); +void I2C_ConfigInt(I2C_Module* I2Cx, uint32_t I2C_IT, FunctionalState Cmd); + +uint8_t I2C_GetTXFIFO_FLEVEL(I2C_Module* I2Cx); +uint8_t I2C_GetRXFIFO_FLEVEL(I2C_Module* I2Cx); +uint8_t I2C_GetCRC(I2C_Module* I2Cx); +uint8_t I2C_GetReceiveAddress(I2C_Module* I2Cx); +FlagStatus I2C_GetFlag(I2C_Module* I2Cx, uint32_t I2C_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif /*__N32H76X_78X_I2C_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_i2s.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_i2s.h new file mode 100644 index 0000000000..19e3495aa0 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_i2s.h @@ -0,0 +1,272 @@ +/** ---------------------------------------------------------------------------- + * Nationz Technology Software Support - NATIONZ - + * ----------------------------------------------------------------------------- + * Copyright (c) 2019, Nationz Corporation All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the disclaiimer below. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the disclaimer below in the documentation and/or + * other materials provided with the distribution. + * + * Nationz's name may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONZ "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ----------------------------------------------------------------------------- + */ +/** **************************************************************************** + * @copyright Nationz Co.,Ltd + * Copyright (c) 2019 All Rights Reserved + ******************************************************************************* + * @file ns3610cm4_spi.h + * @author + * @date + * @version v1.0.0 + * @brief + ******************************************************************************/ +#ifndef __NS3610CM4_I2S_H +#define __NS3610CM4_I2S_H + +/* Includes ------------------------------------------------------------------*/ +#include "n32h76x_78x.h" +#include "n32h76x_78x_rcc.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** Bit definition for I2S_RX_FIFO register **/ +#define I2S_RX_FIFO ((uint16_t)0xFFFF) + +/** Bit definition for I2S_FIFO_BURST_NUM register **/ +#define I2S_FIFO_BURST_NUM_TX ((uint16_t)0x0007) /* I2S TX FIFO Half Empty Threshold Value Configure */ +#define I2S_FIFO_BURST_NUM_RX ((uint16_t)0x0070) /* I2S RX FIFO Half Full Threshold Value Configure */ + +/** Bit definition for I2S_FIFO_NUM register **/ +#define I2S_FIFO_NUM_TX_CNT ((uint16_t)0x000F) /* I2S TX FIFO Valid Data Number */ +#define I2S_FIFO_NUM_RX_CNT ((uint16_t)0x00F0) /* I2S RX FIFO Valid Data Number */ + +/** Bit definition for I2S_TRANS_NUM register **/ +#define I2S_TRANS_NUM ((uint16_t)0xFFFF) + +/** Bit definition for I2S_I2SCFG register **/ +#define I2SCFG_I2SEN ((uint16_t)0x0001) /* I2S Enable */ +#define SPI_I2SCFG_MOD ((uint16_t)0x0002) /* I2S Mode */ + +#define I2SCFG_STD ((uint16_t)0x000C) /* STD[3:2] bits (I2S standard selection) */ +#define I2SCFG_STDSEL1 ((uint16_t)0x0008) /* Bit 1 */ +#define I2SCFG_STDSEL0 ((uint16_t)0x0004) /* Bit 0 */ + +#define I2SCFG_TDATLEN ((uint16_t)0x00C0) /* TDATLEN[1:0] bits (Data length to be transferred) */ +#define I2SCFG_TDATLEN1 ((uint16_t)0x0080) /* Bit 1 */ +#define I2SCFG_TDATLEN0 ((uint16_t)0x0040) /* Bit 0 */ + +#define I2SCFG_CHLEN ((uint16_t)0x0100) /* Channel Length */ +#define I2SCFG_PCMFSYNC ((uint16_t)0x0200) /* PCM frame synchronization */ +#define I2SCFG_CLKPOL ((uint16_t)0x0400) /* steady state clock polarity */ +#define I2SCFG_ERR_BYPASS ((uint16_t)0x0800) /* PCM Long for 13bit is No bypass */ + +/** Bit definition for SPI_I2SPR register **/ +#define I2SPR_I2SDIV ((uint16_t)0x00FF) /* I2S Linear prescaler */ +#define I2SPR_ODD ((uint16_t)0x0100) /* Odd factor for the prescaler */ +#define I2SPR_MCKOEN ((uint16_t)0x0800) /* Master Clock Output Enable */ + +/* -------------------------- Up is the Bit Define -------------------------------- */ + +/** I2s Mode select**/ +#define I2S_MODE_SEL_MASK (~SPI_I2SCFG_MOD) /* selet spi/I2S mode bit */ +#define SEL_SPI_MODE ((uint16_t)0x0000) +#define SEL_I2S_MODE (SPI_I2SCFG_MOD) + + +#define I2SCFG_CFG ((uint16_t)0x0030) /* I2S Mode Configure */ +#define I2SCFG_CFG1 ((uint16_t)0x0020) /* I2S Mode Configure Bit */ +#define I2SCFG_CFG0 ((uint16_t)0x0010) /* I2S Mode Configure Bit */ +/** I2sMode **/ +#define I2S_MODE_SlAVE_TX ((uint16_t)0x0000U) +#define I2S_MODE_SlAVE_RX (I2SCFG_CFG0) +#define I2S_MODE_MASTER_TX (I2SCFG_CFG1) +#define I2S_MODE_MASTER_RX (I2SCFG_CFG0 | I2SCFG_CFG1) +#define I2S_MODE_MASK (I2SCFG_CFG) /* MODCFG bit Mask */ + + + +/** I2S_EXT_DMA_transfer_requests **/ +#define I2S_EXT_DMA_TX ((uint16_t)0x0004U) +#define I2S_EXT_DMA_RX ((uint16_t)0x0002U) +/** I2S_EXT_interrupts_definition **/ +#define I2S_EXT_INT_TEINTEN ((uint16_t)0x0010U) +#define I2S_EXT_INT_RNEINTEN ((uint16_t)0x0020U) +#define I2S_EXT_INT_ERRINTEN ((uint16_t)0x0040U) + +/** I2S_EXT_flags_definition **/ +#define I2S_EXT_TE_FLAG ((uint16_t)0x0001U) +#define I2S_EXT_RNE_FLAG ((uint16_t)0x0002U) +#define I2S_EXT_BUSY_FLAG ((uint16_t)0x0004U) +#define I2S_EXT_OVER_FLAG ((uint16_t)0x0020U) +#define I2S_EXT_UNDER_FLAG ((uint16_t)0x0040U) +#define I2S_EXT_CHSIDE_FLAG ((uint16_t)0x0080U) + +/** I2S_interrupts_definition **/ +#define I2S_INT_TE ((uint8_t)0x40) +#define I2S_INT_RNE ((uint8_t)0x51) +#define I2S_INT_ERR ((uint8_t)0x60) +#define I2S_INT_RXONLYC ((uint8_t)0xEC) +#define I2S_INT_RXFIFOF ((uint8_t)0xCB) +#define I2S_INT_RXFIFOHF ((uint8_t)0xB9) +#define I2S_INT_TXFIFOHE ((uint8_t)0xA8) +#define I2S_INT_MODERR ((uint8_t)0x64) +#define I2S_INT_CRCERR ((uint8_t)0x63) +#define I2S_INT_OVERERR ((uint8_t)0x65) +#define I2S_INT_UNDER ((uint8_t)0x66) + + +/** I2S_flags_definition **/ +#define I2S_TE_FLAG ((uint16_t)0x0001U) +#define I2S_RNE_FLAG ((uint16_t)0x0002U) +#define I2S_BUSY_FLAG ((uint16_t)0x0004U) +#define I2S_CRCERR_FLAG ((uint16_t)0x0008U) +#define I2S_MODERR_FLAG ((uint16_t)0x0010U) +#define I2S_OVER_FLAG ((uint16_t)0x0020U) +#define I2S_UNDER_FLAG ((uint16_t)0x0040U) +#define I2S_CHSIDE_FLAG ((uint16_t)0x0080U) +#define I2S_TXFIFOHE_FLAG ((uint16_t)0x0100U) +#define I2S_RXFIFOHF_FLAG ((uint16_t)0x0200U) +#define I2S_TXFIFOE_FLAG ((uint16_t)0x0400U) +#define I2S_RXFIFOF_FLAG ((uint16_t)0x0800U) +#define I2S_RXONLYC_FLAG ((uint16_t)0x1000U) + +/** I2S_DMA_transfer_requests **/ + +#define I2S_DMA_TX ((uint16_t)0x0004U) +#define I2S_DMA_RX ((uint16_t)0x0002U) + +/** I2S Init structure definition **/ + +typedef struct +{ + uint16_t I2sMode; /*!< Specifies the I2S operating mode. + This parameter can be a value of @ref I2sMode */ + + uint16_t Standard; /*!< Specifies the standard used for the I2S communication. + This parameter can be a value of @ref Standard */ + + uint16_t DataFormat; /*!< Specifies the data format for the I2S communication. + This parameter can be a value of @ref I2S_Data_Format */ + + uint16_t MCLKEnable; /*!< Specifies whether the I2S MCLK output is enabled or not. + This parameter can be a value of @ref I2S_MCLK_Output */ + + uint32_t AudioFrequency; /*!< Specifies the frequency selected for the I2S communication. + This parameter can be a value of @ref I2S_Audio_Frequency */ + + uint16_t CLKPOL; /*!< Specifies the idle state of the I2S clock. + This parameter can be a value of @ref I2S_Clock_Polarity */ + uint32_t ClkSrcFrequency; /*!< Specifies the I2S clock source frequency in Hz.*/ +} I2S_InitType; + + +/** Standard **/ +#define I2S_STD_PHILLIPS ((uint16_t)0x0000U) +#define I2S_STD_MSB_ALIGN (I2SCFG_STDSEL0) +#define I2S_STD_LSB_ALIGN (I2SCFG_STDSEL1) +#define I2S_STD_PCM_SHORTFRAME (I2SCFG_STDSEL0 | I2SCFG_STDSEL1) +#define I2S_STD_PCM_LONGFRAME (I2SCFG_STDSEL0 | I2SCFG_STDSEL1 | I2SCFG_PCMFSYNC) +#define I2S_STANDARD_MASK (I2SCFG_STD) /* STDSEL and PCMFSYNC bit Mask */ + + +/** I2S_Data_Format **/ +#define I2S_DATA_FORMAT_MASK (~(I2SCFG_CHLEN | I2SCFG_TDATLEN)) /* CHBITS and TDATLEN bit Mask */ +#define I2S_DATA_FMT_16BITS ((uint16_t)0x0000U) +#define I2S_DATA_FMT_16BITS_EXTENDED (I2SCFG_CHLEN) +#define I2S_DATA_FMT_24BITS (I2SCFG_CHLEN | I2SCFG_TDATLEN0) +#define I2S_DATA_FMT_32BITS (I2SCFG_CHLEN | I2SCFG_TDATLEN1) + +/** I2S_MCLK_Output **/ + +#define I2S_MCLK_ENABLE ((uint16_t)0x0800U) +#define I2S_MCLK_DISABLE ((uint16_t)0x0000U) + + +/** I2S_Audio_Frequency **/ + +#define I2S_AUDIO_FREQ_192K ((uint32_t)192000U) +#define I2S_AUDIO_FREQ_96K ((uint32_t)96000U) +#define I2S_AUDIO_FREQ_48K ((uint32_t)48000U) +#define I2S_AUDIO_FREQ_44K ((uint32_t)44100U) +#define I2S_AUDIO_FREQ_32K ((uint32_t)32000U) +#define I2S_AUDIO_FREQ_22K ((uint32_t)22050U) +#define I2S_AUDIO_FREQ_16K ((uint32_t)16000U) +#define I2S_AUDIO_FREQ_11K ((uint32_t)11025U) +#define I2S_AUDIO_FREQ_8K ((uint32_t)8000U) +#define I2S_AUDIO_FREQ_DEFAULT ((uint32_t)2U) + +/** I2S_Clock_Polarity **/ +#define I2S_CLKPOL_LOW ((uint16_t)0x0000U) +#define I2S_CLKPOL_HIGH (SPI_I2SCFG_CLKPOL) +#define I2S_CLKPOL_MASK (~SPI_I2SCFG_CLKPOL) /* MCLKOEN bit Mask */ + +/** I2S Converter **/ +#define I2S_TURN_ON (I2SCFG_I2SEN | SPI_I2SCFG_MOD) /* I2SEN and MODSEL bit */ +#define I2S_TURN_OFF (~(I2SCFG_I2SEN | SPI_I2SCFG_MOD)) /* I2SEN bit Mask */ + +///** I2S_EXT_DMA_transfer_requests **/ + +#define I2S_EXT_DMA_TX ((uint16_t)0x0004U) +#define I2S_EXT_DMA_RX ((uint16_t)0x0002U) + +void I2S_Reset(I2S_Module* I2Sx); +void I2S_EnableInt(I2S_Module* I2Sx, uint8_t I2S_IT, FunctionalState Cmd); +FlagStatus I2S_GetStatus(I2S_Module* I2Sx, uint8_t i2s_flag); +INTStatus I2S_GetIntStatus(const I2S_Module* I2sx, uint8_t I2S_IT); +void I2S_ClrITPendingBit(I2S_Module* I2Sx, uint8_t I2S_IT); +void I2S_TransmitData(I2S_Module* I2Sx, uint16_t Data); +uint16_t I2S_ReceiveData(I2S_Module* I2Sx); +void I2S_EnableDma(I2S_Module* I2Sx, uint16_t I2S_DMAReq, FunctionalState Cmd); +void I2S_Init(I2S_Module* I2Sx,const I2S_InitType* I2S_InitStruct); +void I2S_Enable(I2S_Module* I2Sx, FunctionalState Cmd); +void I2S_InitStruct(I2S_InitType* I2S_InitStruct); +void I2S_MclkEnable(I2S_Module* I2Sx, FunctionalState Cmd); +void I2S_StandardConfig(I2S_Module* I2Sx, uint16_t Standard); +void I2S_ModeConfig(I2S_Module* I2Sx, uint16_t I2sMode); +void I2S_DataFormatConfig(I2S_Module* I2Sx, uint16_t DataFormat); +void I2S_ClkPolConfig(I2S_Module* I2Sx, uint16_t CLKPOL); +void I2S_AudioFrequencyConfig(I2S_Module* I2Sx, uint32_t AudioFrequency); +void I2S_EXTInit(I2S_EXT_Module* I2Sx_EXT,const I2S_InitType* I2S_EXT_InitStruct); +void I2S_EXTInitStruct(I2S_InitType* I2S_EXT_InitStruct); +void I2S_EXTEnable(I2S_EXT_Module* I2Sx_EXT, FunctionalState Cmd); +void I2S_EXTTransmitData(I2S_EXT_Module* I2Sx, uint16_t Data); +uint16_t I2S_EXTReceiveData(const I2S_EXT_Module* I2Sx); +FlagStatus I2S_EXTGetStatus(const I2S_EXT_Module* I2Sx, uint16_t I2S_EXT_FLAG); +void I2S_EXTEnableDma(I2S_EXT_Module* I2Sx, uint16_t I2S_EXT_DMAReq, FunctionalState Cmd); +void I2S_EXTEnableInt(I2S_EXT_Module* I2Sx, uint8_t I2S_EXT_IT, FunctionalState Cmd); +void I2S_SPIModeSelect(I2S_Module* I2Sx, uint16_t Mode); +INTStatus I2S_EXTGetIntStatus(const I2S_EXT_Module* I2Sx, uint8_t I2S_EXT_IT); +void I2S_DataFifoTransmit(I2S_Module* I2Sx, uint16_t Data); +uint16_t I2S_DataFifoGet(I2S_Module* I2Sx); +void I2S_EXTClrITPendingBit(I2S_EXT_Module* I2Sx, uint8_t I2S_EXT_IT); + +#ifdef __cplusplus +} + +#endif +#endif /*__NS3610CM4_I2S_H */ + + +/******************* (C) COPYRIGHT 2019 NATIONZ *****END OF FILE****/ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_iwdg.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_iwdg.h new file mode 100644 index 0000000000..3ac450a26f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_iwdg.h @@ -0,0 +1,108 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_iwdg.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_IWDG_H__ +#define __N32H76X_78X_IWDG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +typedef enum +{ + IWDG_PVU_FLAG = IWDG_STS_PVU, + IWDG_CRVU_FLAG = IWDG_STS_CRVU, + IWDG_FRZF_FLAG = IWDG_STS_FRZF, +}IWDG_STATUS_FLAG; + +/** KEY register bit mask **/ +#define KEY_ReloadKey ((uint16_t)0xAAAA) +#define KEY_EnableKey ((uint16_t)0xCCCC) +#define IWDG_FREEZE ((uint16_t)0x4567) +#define IWDG_UNFREEZE ((uint16_t)0x89AB) + +/** PREDIV and RELV register write permission **/ +typedef enum +{ + IWDG_WRITE_ENABLE = 0x5555, + IWDG_WRITE_DISABLE = 0x0000 +}IWDOG_WRITE_CONFIG; + +#define IWDG_PRESCALER_DIV4 ((uint8_t)0x00) +#define IWDG_PRESCALER_DIV8 (IWDG_PREDIV_PD0) +#define IWDG_PRESCALER_DIV16 (IWDG_PREDIV_PD1) +#define IWDG_PRESCALER_DIV32 (IWDG_PREDIV_PD1 | IWDG_PREDIV_PD0) +#define IWDG_PRESCALER_DIV64 (IWDG_PREDIV_PD2) +#define IWDG_PRESCALER_DIV128 (IWDG_PREDIV_PD2 | IWDG_PREDIV_PD0) +#define IWDG_PRESCALER_DIV256 (IWDG_PREDIV_PD2 | IWDG_PREDIV_PD1 | IWDG_PREDIV_PD0) + + +void IWDG_WriteConfig(IWDG_Module* IWDGx,IWDOG_WRITE_CONFIG IWDG_WriteAccess); +void IWDG_SetPrescalerDiv(IWDG_Module* IWDGx,uint8_t IWDG_Prescaler); +void IWDG_CntReload(IWDG_Module* IWDGx,uint16_t Reload); +void IWDG_ReloadKey(IWDG_Module* IWDGx); +void IWDG_Enable(IWDG_Module* IWDGx); +void IWDG_Freeze_Enable(IWDG_Module* IWDGx,FunctionalState Cmd); +FlagStatus IWDG_GetStatus(IWDG_Module* IWDGx,IWDG_STATUS_FLAG IWDG_FLAG); + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_IWDG_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_jpeg.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_jpeg.h new file mode 100644 index 0000000000..7c64df8d03 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_jpeg.h @@ -0,0 +1,383 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_jpeg.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76x_78x_JPEG_H__ +#define __N32H76x_78x_JPEG_H__ + +/* C binding of definitions if building with C++ compiler */ +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "n32h76x_78x.h" + +typedef enum +{ + BITEQ0 = 0U, + BITEQ1 = 1U +} BitValue; + +/***** JPEG CTRL module ****/ +#define JPEG_DECODE ((uint32_t)0x00000000U) /* JPEG operation Decode */ +#define JPEG_ENCODE JPEG_CTRL_TYPE /* JPEG operation Encode */ + +#define JPEG_NOSWAP ((uint32_t)0x00000000U) /* No Swap Data for YCbCr 4:2:2 Format in BRC */ +#define JPEG_SWAP JPEG_CTRL_SWAP /* Swap Data for YCbCr 4:2:2 Format in BRC */ + + +/* JPEG SGDMA Module */ + +/* Descriptor flag */ +#define SGDMA_DESCF_LINKDISABLE ((uint32_t)0x00000000U) /* Link Disable */ +#define SGDMA_DESCF_LINKENABLE JPEGDMA_DESCF_LINKE /* Link Enable */ + +#define SGDMA_DESCF_STARTDISABLE ((uint32_t)0x00000000U) /* Non Start of Frame */ +#define SGDMA_DESCF_STARTENABLE JPEGDMA_DESCF_LINKE /* Start of Frame */ + +#define SGDMA_DESCF_ENDDISABLE ((uint32_t)0x00000000U) /* Non End of Frame */ +#define SGDMA_DESCF_ENDENABLE JPEGDMA_DESCF_LINKE /* End of Frame */ + +#define SGDMA_DESCF_DESCCONDISABLE ((uint32_t)0x00000000U) /* The descriptor is not consumed */ +#define SGDMA_DESCF_DESCCONENABLE JPEGDMA_DESCF_LINKE /* Descriptor Consumed */ + +/** Scatter-Gather Descriptor **/ +typedef struct{ + uint32_t linkenable : 1; // bit 0 - Link Enable. + uint32_t startframe : 1; // bit 1 - Start of Frame. + uint32_t endframe : 1; // bit 2 - End of Frame. + uint32_t desccons : 1; // bit 3 - Descriptor Consumed. + uint32_t reserved : 28; // bit 31:4 - Reserved. +} SGx_desc_flags_bits; + +typedef union{ + uint32_t value; + SGx_desc_flags_bits bits; +}SGx_desc_flags; + +/** Scatter-Gather Descriptor type - 32-bit **/ +typedef struct +{ + SGx_desc_flags desc_flags; //Descriptor flag bits: 0: Link Enable, 1: Start of Frame, 2: End of Frame, 3: Descriptor Consumed. 4-31: Reserved + uint32_t blk_size; //[15:0] Block_Size [31:16] Block_Used + uint32_t blk_addr; // The starting address of the data block + uint32_t link_addr; // Link to the next descriptor. Used when Link Enable = 1. +} SGx_DESC32; + +/** Scatter-Gather Descriptor type - 64-bit **/ +typedef struct +{ + SGx_desc_flags desc_flags; // Descriptor flag bits: 0: Link Enable, 1: Start of Frame, 2: End of Frame, 3: Descriptor Consumed. 4-31: Reserved + uint32_t blk_size; // Block_Size + uint32_t blk_used; // Block_Used + uint32_t blk_addr_low; // The starting address of the data block [31:0] + uint32_t blk_addr_high; // The starting address of the data block [63:32] + uint32_t reserved; // Reserved field; not used in current implementation + uint32_t link_addr_low; // Link to the next descriptor. Used when Link Enable = 1. + uint32_t link_addr_high; // Link to the next descriptor. Used when Link Enable = 1. +} SGx_DESC64; + + +/** SGDMA Descriptor Memory Mode **/ +#define SGDMA_DESCLIST_LIST ((uint32_t)0x00000000U) /* The descriptor list structure is a simple List */ +#define SGDMA_DESCLIST_RING JPEGDMA_CTRL_MMODE_1 /* The descriptor list structure is a Ring Buffer */ + +#define SGDMA_DESC_MEMORY ((uint32_t)0x00000000U) /* Descriptors stored in memory */ +#define SGDMA_DESC_CSR JPEGDMA_CTRL_MMODE_0 /* Descriptors programmed through CSR */ + +/** SGDMA Operation Mode **/ +#define SGDMA_EOF_PAUSEDMA ((uint32_t)0x00000000U) /* Pause DMA operation on EOF and wait for driver action */ +#define SGDMA_EOF_RESUMEDMA JPEGDMA_CTRL_OPMODE_0 /* Resume operation of the DMA normally after the EOF */ + +#define SGDMA_BURST_FIXED ((uint32_t)0x00000000U) /* AXI4 MM FIXED burst (aligned addresses only) */ +#define SGDMA_BURST_INCR JPEGDMA_CTRL_OPMODE_1 /* AXI4 MM INCR burst */ + +/** SGDMA H2P Init Structure definition **/ +typedef struct +{ + SGx_DESC64 h2p_desc; /* 64bit Descriptor */ + uint32_t max_burstsize; /* Maximum allowed size for an AXI4 MM burst */ + uint32_t SGlist_size; /* Scatter-Gather List Size */ + uint32_t SGlist_Head; /* Scatter-Gather List Head index pointer */ + uint32_t SGlist_Tail; /* Scatter-Gather List Tail index pointer */ + uint32_t SGlist_Threshold; /* Almost Out Of Descriptors Threshold */ + uint32_t desclist_type; /* The descriptor list structure type */ + uint32_t descstored_type; /* The descriptor storage location */ + uint32_t DMA_EOF_type; /* DMA operation mode on EOF */ + uint32_t DMA_burst_type; /* DMA burst type */ +} SGDMA_H2P_InitType; + +/** SGDMA P2H Init Structure definition **/ +typedef struct +{ + SGx_DESC64 p2h_desc; /* 64bit Descriptor */ + uint32_t max_burstsize; /* Maximum allowed size for an AXI4 MM burst */ + uint32_t SGlist_size; /* Scatter-Gather List Size */ + uint32_t SGlist_Head; /* Scatter-Gather List Head index pointer */ + uint32_t SGlist_Tail; /* Scatter-Gather List Tail index pointer */ + uint32_t SGlist_Threshold; /* Almost Out Of Descriptors Threshold */ + uint32_t desclist_type; /* The descriptor list structure type */ + uint32_t descstored_type; /* The descriptor storage location */ + uint32_t DMA_EOF_type; /* DMA operation mode on EOF */ + uint32_t DMA_burst_type; /* DMA burst type */ +} SGDMA_P2H_InitType; + +/* SGDMA interrupt */ +#define SGDMA_INTSTS_WDATAERREN JPEGDMA_INTSTS_WDATAERR /* AXI MM Write Error when writing data */ +#define SGDMA_INTSTS_RDATAERR JPEGDMA_INTSTS_RDATAERR /* AXI MM Read Error when reading data */ +#define SGDMA_INTSTS_WDESCERR JPEGDMA_INTSTS_WDESCERR /* AXI MM Write Error when writing a descriptor */ +#define SGDMA_INTSTS_RDESCERR JPEGDMA_INTSTS_RDESCERR /* AXI MM Read Error when reading a descriptor */ +#define SGDMA_INTSTS_EOD JPEGDMA_INTSTS_EOD /* End-Of-Descriptor */ +#define SGDMA_INTSTS_AOOD JPEGDMA_INTSTS_AOOD /* Channel is Almost Out of Descriptors */ +#define SGDMA_INTSTS_OOD JPEGDMA_INTSTS_OOD /* Out Of Descriptors */ +#define SGDMA_INTSTS_EOFIN JPEGDMA_INTSTS_EOFIN /* End-Of-Frame sampled at the input of the channel */ +#define SGDMA_INTSTS_EOFOUT JPEGDMA_INTSTS_EOFOUT /* End-Of-Frame sampled at the output of the channel */ +#define SGDMA_INTSTS_GINT JPEGDMA_INTSTS_GINT /* Global interrupt status bit for the Channel */ +#define SGDMA_INTSTS_BUSY JPEGDMA_STS_BUSY /* H2P/P2H is processing a transfer */ + +/* JPEG BRC Module */ + +/** JPEG BRC Init Structure definition **/ +typedef struct +{ + uint32_t buffer_addr; /* buffer memory address */ + uint32_t buffer_size; /* buffer memory size, in byte */ + uint32_t upsample_mode; /* Up sampling mode */ +} JPEGBRC_InitType; + +/* JPEG RBC Module */ + +/** JPEG BRC Init Structure definition **/ +typedef struct +{ + uint32_t pixel_format; /* Pixel format */ + uint32_t sample_order; /* Switch input sample order */ + uint32_t frame_width; /* Frame width */ + uint32_t frame_height; /* Frame height */ + uint32_t component0names; /* Component 0 names */ + uint32_t component1names; /* Component 1 names */ + uint32_t component2names; /* Component 2 names */ + uint32_t C0startaddress; /* Component 0 Start Address */ + uint32_t C0buffersize; /* Size of buffer in the AXI memory */ +} JPEGRBC_InitType; + +/* Pixel format */ +#define JPEGRBC_4_4_4_NONINTERLEAVED ((uint32_t)0x00000000U) /* 4:4:4 non-interleaved format */ +#define JPEGRBC_4_2_2_NONINTERLEAVED ((uint32_t)0x00000001U) /* 4:2:2 non-interleaved format */ +#define JPEGRBC_4_2_0_NONINTERLEAVED ((uint32_t)0x00000002U) /* 4:2:0 non-interleaved format */ +#define JPEGRBC_MONOCHROME ((uint32_t)0x00000003U) /* monochrome format */ +#define JPEGRBC_4_4_4_INTERLEAVED ((uint32_t)0x00000004U) /* 4:4:4 interleaved format */ +#define JPEGRBC_4_2_2_INTERLEAVED ((uint32_t)0x00000005U) /* 4:2:2 interleaved format */ +#define JPEGRBC_4_2_0_INTERLEAVED ((uint32_t)0x00000006U) /* 4:2:0 interleaved format */ + +/* sample_order */ +#define JPEGRBC_MSBSAMPLE ((uint32_t)0x00000000U) /* Switch input sample order MSB */ +#define JPEGRBC_LSBSAMPLE (JPEGRBC_SWITCH_SWITCH) /* Switch input sample order LSB */ + + +/* JPEG DEC Module */ + +/** JPEG DEC Init Structure definition **/ +typedef struct +{ + uint32_t buffer_addr; /* buffer memory address */ + uint32_t buffer_size; /* buffer memory size, in byte */ + uint32_t upsample_mode; /* Up sampling mode */ +} JPEGDEC_InitType; + +#define JPEGDEC_EOB0_ADDRESS ((uint32_t)0x20U) /* JPEGDEC_HUFTAB0_EOB offset address */ +#define JPEGDEC_EOB1_ADDRESS ((uint32_t)0x24U) /* JPEGDEC_HUFTAB1_EOB offset address */ +#define JPEGDEC_EOB2_ADDRESS ((uint32_t)0x28U) /* JPEGDEC_HUFTAB2_EOB offset address */ +#define JPEGDEC_EOB3_ADDRESS ((uint32_t)0x2CU) /* JPEGDEC_HUFTAB3_EOB offset address */ + +#define JPEGDEC_HUFFTABLE ((uint32_t)0x00000000U) /* Huffman decoder table */ +#define JPEGDEC_DVECTORTABLE (JPEGDEC_HUF_ADDR_TABLE_0) /* D vector table */ +#define JPEGDEC_IVECTORTABLE (JPEGDEC_HUF_ADDR_TABLE_1) /* I vector table */ +#define JPEGDEC_HUFFACCTABLE (JPEGDEC_HUF_ADDR_TABLE) /* Huffman decoder accelerator tables */ + +#define JPEGDEC_DCTABLE ((uint32_t)0x00000000U) /* DC table */ +#define JPEGDEC_ACTABLE (JPEGDEC_HUF_ADDR_ACDC) /* AC table */ + +#define JPEGDEC_HUFFTABLE_0 ((uint32_t)0x00000000U) /* table 0 */ +#define JPEGDEC_HUFFTABLE_1 (JPEGDEC_HUF_ADDR_HNUM_0) /* table 1 */ +#define JPEGDEC_HUFFTABLE_2 (JPEGDEC_HUF_ADDR_HNUM_1) /* table 2 */ +#define JPEGDEC_HUFFTABLE_3 (JPEGDEC_HUF_ADDR_HNUM) /* table 3 */ + +#define JPEGDEC_QT0_ADDRESS ((uint32_t)0x400U) /* QT0 offset address */ +#define JPEGDEC_QT1_ADDRESS ((uint32_t)0x500U) /* QT1 offset address */ +#define JPEGDEC_QT2_ADDRESS ((uint32_t)0x600U) /* QT2 offset address */ +#define JPEGDEC_QT3_ADDRESS ((uint32_t)0x700U) /* QT3 offset address */ + +/* JPEG ENC Module */ + +/* output_select */ +#define JPEGENC_OUTPUT_NOTHING ((uint32_t)0x00000000U)/* No data Ouptut in output stream */ +#define JPEGENC_OUTPUT_QT0 (JPEGENC_HSEL_QT0) /* Ouptut quantisation table 0 in output stream */ +#define JPEGENC_OUTPUT_QT1 (JPEGENC_HSEL_QT1) /* Ouptut quantisation table 1 in output stream */ +#define JPEGENC_OUTPUT_QT2 (JPEGENC_HSEL_QT2) /* Ouptut quantisation table 2 in output stream */ +#define JPEGENC_OUTPUT_QT3 (JPEGENC_HSEL_QT3) /* Ouptut quantisation table 3 in output stream */ +#define JPEGENC_OUTPUT_HT0 (JPEGENC_HSEL_HT0) /* Ouptut Huffman table 0 in output stream */ +#define JPEGENC_OUTPUT_HT1 (JPEGENC_HSEL_HT1) /* Ouptut Huffman table 1 in output stream */ +#define JPEGENC_OUTPUT_HT2 (JPEGENC_HSEL_HT2) /* Ouptut Huffman table 2 in output stream */ +#define JPEGENC_OUTPUT_HT3 (JPEGENC_HSEL_HT3) /* Ouptut Huffman table 3 in output stream */ +#define JPEGENC_OUTPUT_ONLY (JPEGENC_HSEL_NFD) /* Output tables in only one frames */ +#define JPEGENC_OUTPUT_NOECS (JPEGENC_HSEL_ATF) /* No ouptut ECS data in only one frames in output stream */ + +/* output_select */ +#define JPEGENC_RESSART_DISABLE ((uint32_t)0x00000000U) /* Disable restart marker generation */ +#define JPEGENC_RESSART_ENABLE (JPEGENC_RICTRL_RIEN) /* Enable restart marker generation */ + +/* Corereset */ +#define JPEGENC_CORERST_ENABLE ((uint32_t)0x00000000U) /* no reset the core if any error occurred */ +#define JPEGENC_CORERST_DISABLE (JPEGENC_CTRL_ERST) /* reset the core if any error occurred */ + + +/*** Huffman tables ***/ +typedef struct +{ + uint16_t* DCcode_offset; + uint16_t* ACcode_offset; + uint16_t* DCcode_start; + uint16_t* ACcode_start; + uint32_t EOBS; + uint32_t ZRLS; +} Huffmantables_InitType; + +/** JPEG ENC Init Structure definition **/ +typedef struct +{ + Huffmantables_InitType HuffmanTable0; /* Huffman table0 */ + Huffmantables_InitType HuffmanTable1; /* Huffman table0 */ + Huffmantables_InitType HuffmanTable2; /* Huffman table0 */ + Huffmantables_InitType HuffmanTable3; /* Huffman table0 */ + uint8_t* header_address; /* File frame header storage address */ + uint32_t header_size; /* File frame header size */ + uint8_t* hufftab0_header_address; /* Huffman table0 frame header storage address */ + uint32_t hufftab0_header_size; /* Huffman table0 frame header size */ + uint8_t* hufftab1_header_address; /* Huffman table1 frame header storage address */ + uint32_t hufftab1_header_size; /* Huffman table1 frame header size */ + uint8_t* hufftab2_header_address; /* Huffman table2 frame header storage address */ + uint32_t hufftab2_header_size; /* Huffman table2 frame header size */ + uint8_t* hufftab3_header_address; /* Huffman table3 frame header storage address */ + uint32_t hufftab3_header_size; /* Huffman table3 frame header size */ + uint8_t* footer_address; /* File frame footer storage address */ + uint32_t footer_size; /* File frame footer size */ + uint32_t output_select; /* Header parts out select */ + uint8_t* QT0_address; /* Quantisation table 0 storage address */ + uint8_t* QT1_address; /* Quantisation table 1 storage address */ + uint8_t* QT2_address; /* Quantisation table 2 storage address */ + uint8_t* QT3_address; /* Quantisation table 3 storage address */ + uint32_t restart_interval; /* restart interval enable*/ + uint32_t interval_num; /* Number of blocks per restart interval */ + uint32_t C0QT_select; /* Quantisation table selector for component 0 */ + uint32_t C1QT_select; /* Quantisation table selector for component 1 */ + uint32_t C2QT_select; /* Quantisation table selector for component 2 */ + uint32_t C3QT_select; /* Quantisation table selector for component 3 */ + uint32_t C0HT_select; /* Huffman table selector for component 0 */ + uint32_t C1HT_select; /* Huffman table selector for component 1 */ + uint32_t C2HT_select; /* Huffman table selector for component 2 */ + uint32_t C3HT_select; /* Huffman table selector for component 3 */ + uint32_t Corereset; /* reset the core if any error occurred */ +} JPEGENC_InitType; + + +/***** JPEG CTRL module ****/ +void JPEG_ConfigType(uint32_t Type); +void JPEG_ConfigSwap(uint32_t Type); + +/***** JPEG SGDMA module ****/ +void SGDMA_H2P_Init(SGDMA_H2P_InitType* SGDMA_H2P_InitStruct); +void SGDMA_P2H_Init(SGDMA_P2H_InitType* SGDMA_P2H_InitStruct); +void SGDMA_Reset(JPEG_SGDMA_Module *SGDMAx); +void SGDMA_Start(JPEG_SGDMA_Module *SGDMAx); +void SGDMA_ConfigInt(JPEG_SGDMA_Module* SGDMAx, uint32_t SGDMA_INT, FunctionalState Cmd); +FlagStatus SGDMAx_GetFlagStatus(JPEG_SGDMA_Module* SGDMAx, uint32_t Flag); +FlagStatus SGDMAx_GetIntStatus(JPEG_SGDMA_Module* SGDMAx, uint32_t Flag); +void SGDMAx_ClrFlag(JPEG_SGDMA_Module* SGDMAx, uint32_t Flag); + +/***** JPEG BRC module ****/ +ErrorStatus JPEGBRC_Init(JPEGBRC_InitType* JPEGBRC_InitStruct); +void JPEGBRC_Enable(FunctionalState Cmd); + +/***** JPEG RBC module ****/ +ErrorStatus JPEGRBC_Init(JPEGRBC_InitType* JPEGRBC_InitStruct); +void JPEGRBC_Enable(FunctionalState Cmd); + +/***** JPEG DEC module ****/ +void JPEGDEC_Enable(FunctionalState Cmd); +FlagStatus JPEGDEC_GetFlagStatus(uint32_t Flag); +uint32_t JPEGDEC_GetUNKErrorAddress(void); +uint32_t JPEGDEC_GetUNEXPErrorAddress(void); +uint16_t JPEGDEC_GetHESYMErrorAddress(void); +uint32_t JPEGDEC_GetHESYMECSErrorAddress(void); +uint32_t JPEGDEC_GetHUFSErrorAddress(void); +ErrorStatus JPEGDEC_TableAccessRequest(FunctionalState Cmd); +void JPEGDEC_SetHUFTable_EOB(uint32_t TableAddress,uint32_t EOBSymbol,uint32_t EOBSymbolMask); +ErrorStatus JPEGDEC_SetHuffTable(uint32_t TableType,uint32_t Tableselector,uint32_t TableNum,uint32_t* Value,uint32_t Count); +void JPEGDEC_SetQuantiTable(uint32_t TableAddress,uint8_t* Value,uint32_t Count); + +/***** JPEG ENC module ****/ +ErrorStatus JPEGENC_Init(JPEGENC_InitType* JPEGENC_InitStruct); +void JPEGENC_OutputEnable(uint32_t outputsel,FunctionalState Cmd); +void JPEGENC_Enable(FunctionalState Cmd); +void JPEGENC_DynamicAdjustEnable(FunctionalState Cmd); + + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76x_78x_JPEG_H__ */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lcdc.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lcdc.h new file mode 100644 index 0000000000..1d54171f2c --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lcdc.h @@ -0,0 +1,335 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_lcdc.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76x_78x_LCDC_H +#define __N32H76x_78x_LCDC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/*** LCDC Structure Definition Start ***/ + +/** LCDC Init structure definition is used with LCDC. **/ +typedef struct +{ + uint32_t LCDC_HSPolarity; /* configures the horizontal synchronization polarity. */ + + uint32_t LCDC_VSPolarity; /* configures the vertical synchronization polarity. */ + + uint32_t LCDC_DEPolarity; /* configures the data enable polarity. */ + + uint32_t LCDC_PCPolarity; /* configures the pixel clock polarity. */ + + uint32_t LCDC_HorizontalSync; /* configures the number of Horizontal synchronization width. */ + + uint32_t LCDC_VerticalSync; /* configures the number of Vertical synchronization height. */ + + uint32_t LCDC_AccumulatedHBP; /* configures the accumulated horizontal back porch width. */ + + uint32_t LCDC_AccumulatedVBP; /* configures the accumulated vertical back porch height. */ + + uint32_t LCDC_AccumulatedActiveW; /* configures the accumulated active width. */ + + uint32_t LCDC_AccumulatedActiveH; /* configures the accumulated active height. */ + + uint32_t LCDC_TotalWidth; /* configures the total width. */ + + uint32_t LCDC_TotalHeight; /* configures the total height. */ + + uint32_t LCDC_BackgroundRedValue; /* configures the background red value. */ + + uint32_t LCDC_BackgroundGreenValue; /* configures the background green value. */ + + uint32_t LCDC_BackgroundBlueValue; /* configures the background blue value. */ +} LCDC_InitType; + +typedef struct +{ + uint32_t LCDC_HorizontalStart; /* Configures the window horizontal start Position. */ + + uint32_t LCDC_HorizontalStop; /* Configures the window horizontal stop Position. */ + + uint32_t LCDC_HorizontalScalerStop; /* Configures the scaler window horizontal stop Position. */ + + uint32_t LCDC_VerticalStart; /* Configures the window vertical start Position. */ + + uint32_t LCDC_VerticalStop; /* Configures the window vertical stop Position. */ + + uint32_t LCDC_VerticalScalerStop; /* Configures the scaler window vertical stop Position. */ + + uint32_t LCDC_PixelFormat; /* Specifies the pixel format. */ + + uint32_t LCDC_ConstantAlpha; /* Specifies the constant alpha used for blending. */ + + uint32_t LCDC_DefaultAlpha; /* Configures the default alpha value. */ + + uint32_t LCDC_BlendingFactor1; /* Select the blending factor 1. */ + + uint32_t LCDC_BlendingFactor2; /* Select the blending factor 2. */ + + uint32_t LCDC_CFBStartAdress; /* Configures the color frame buffer address. */ + + uint32_t LCDC_AFB0StartAdress; /* Configures the Auxiliary frame buffer 0 address. */ + + uint32_t LCDC_AFB1StartAdress; /* Configures the Auxiliary frame buffer 1 address. */ + + uint32_t LCDC_CFBLineLength; /* Configures the color frame buffer line length. */ + + uint32_t LCDC_CFBLineNumber; /* Configures the number of line in frame buffer. */ + + uint32_t LCDC_CFBPitch; /* Configures the color frame buffer pitch in bytes. */ + + uint32_t LCDC_DefaultColorBlue; /* Configures the default blue value. */ + + uint32_t LCDC_DefaultColorGreen; /* Configures the default green value. */ + + uint32_t LCDC_DefaultColorRed; /* Configures the default red value. */ +} LCDC_Layer_InitType; + +typedef struct +{ + uint32_t LCDC_Blue; /* Blue width */ + + uint32_t LCDC_Green; /* Green width */ + + uint32_t LCDC_Red; /* Red width */ +}LCDC_RGBType; + +typedef struct +{ + uint32_t LCDC_POSX; /* Current X Position */ + uint32_t LCDC_POSY; /* Current Y Position */ +} LCDC_PosType; + +typedef struct +{ + uint32_t LCDC_ColorKeyBlue; /* Configures the color key blue value. + This parameter must range from 0x00 to 0xFF. */ + + uint32_t LCDC_ColorKeyGreen; /* Configures the color key green value. + This parameter must range from 0x00 to 0xFF. */ + + uint32_t LCDC_ColorKeyRed; /* Configures the color key red value. + This parameter must range from 0x00 to 0xFF. */ +} LCDC_ColorKeying_InitType; + + +typedef struct +{ + uint32_t LCDC_CLUTAdress; /* Configures the CLUT address. + This parameter must range from 0x00 to 0xFF. */ + + uint32_t LCDC_RedValue; /* Configures the red value. + This parameter must range from 0x00 to 0xFF. */ + + uint32_t LCDC_GreenValue; /* Configures the green value. + This parameter must range from 0x00 to 0xFF. */ + + uint32_t LCDC_BlueValue; /* Configures the blue value. + This parameter must range from 0x00 to 0xFF. */ +} LCDC_CLUT_InitType; + +/*** LCDC Structure Definition End ***/ + +/*** LCDC Macro Definition Start ***/ + +/** LCDC register bit mask definition **/ +#define LCDC_REG_BIT_MASK ((uint32_t)0x00000000) + +/** Horizontal Synchronization Polarity **/ +#define LCDC_HSPolarity_LOW (LCDC_REG_BIT_MASK) +#define LCDC_HSPolarity_HIGH (LCDC_GCTRL_HSPOL) + +/** Vertical Synchronization Polarity **/ +#define LCDC_VSPolarity_LOW (LCDC_REG_BIT_MASK) +#define LCDC_VSPolarity_HIGH (LCDC_GCTRL_VSPOL) + +/** Data enable Polarity **/ +#define LCDC_DEPolarity_LOW (LCDC_GCTRL_DEPOL) +#define LCDC_DEPolarity_HIGH (LCDC_REG_BIT_MASK) + +/** Pixel clock Polarity **/ +#define LCDC_PCPolarity_IPC (LCDC_REG_BIT_MASK) +#define LCDC_PCPolarity_IIPC (LCDC_GCTRL_PCLKPOL) + +/** LCDC reload **/ +#define LCDC_IMReload (LCDC_SRCTRL_IMR) +#define LCDC_VBReload (LCDC_SRCTRL_VBR) + +/** LCDC reload **/ +#define LCDC_LayerIMReload (LCDC_LSRCTRL_IMR) +#define LCDC_LayerVBReload (LCDC_LSRCTRL_VBR) +#define LCDC_LayerMGReload (LCDC_LSRCTRL_MGR) + +/** LCDC Pixel format **/ +#define LCDC_Pixel_Format_ARGB8888 (LCDC_REG_BIT_MASK) +#define LCDC_Pixel_Format_ABGR8888 (LCDC_PFCTRL_PF_0) +#define LCDC_Pixel_Format_RGBA8888 (LCDC_PFCTRL_PF_1) +#define LCDC_Pixel_Format_BGRA8888 (LCDC_PFCTRL_PF_0 | LCDC_PFCTRL_PF_1) +#define LCDC_Pixel_Format_RGB565 (LCDC_PFCTRL_PF_2) +#define LCDC_Pixel_Format_BGR565 (LCDC_PFCTRL_PF_0 | LCDC_PFCTRL_PF_2) +#define LCDC_Pixel_Format_RGB888 (LCDC_PFCTRL_PF_1 | LCDC_PFCTRL_PF_2) +#define LCDC_Pixel_Format_Custom (LCDC_PFCTRL_PF_0 | LCDC_PFCTRL_PF_1 | LCDC_PFCTRL_PF_2) + +/** LCDC blending factor1 **/ +#define LCDC_BlendingFactor1_CA (LCDC_BFCTRL_BF1_2) +#define LCDC_BlendingFactor1_PAxCA (LCDC_BFCTRL_BF1_1 | LCDC_BFCTRL_BF1_2) + +/** LCDC blending factor2 **/ +#define LCDC_BlendingFactor2_CA (LCDC_BFCTRL_BF2_0 | LCDC_BFCTRL_BF2_2) +#define LCDC_BlendingFactor2_PAxCA (LCDC_BFCTRL_BF2_0 | LCDC_BFCTRL_BF2_1 | LCDC_BFCTRL_BF2_2) + +/** LCDC interrupt sources **/ +#define LCDC_INT_LIEN (LCDC_INTEN_LIEN) +#define LCDC_INT_FUIEN (LCDC_INTEN_FUIEN) +#define LCDC_INT_BEIEN (LCDC_INTEN_BEIEN) +#define LCDC_INT_RRIEN (LCDC_INTEN_RRIEN) +#define LCDC_INT_STNSIGIEN (LCDC_INTEN_STNSIGIEN) +#define LCDC_INT_STNSYNCIEN (LCDC_INTEN_STNSYNCIEN) +#define LCDC_INT_FUKIEN (LCDC_INTEN_FUKIEN) +#define LCDC_INT_CRCIEN (LCDC_INTEN_CRCIEN) +#define LCDC_INT_RFEIEN (LCDC_INTEN_RFEIEN) + +/** LCDC Flags **/ +#define LCDC_FLAG_L (LCDC_INTEN_LIEN) +#define LCDC_FLAG_FU (LCDC_INTEN_FUIEN) +#define LCDC_FLAG_BE (LCDC_INTEN_BEIEN) +#define LCDC_FLAG_RR (LCDC_INTEN_RRIEN) +#define LCDC_FLAG_STNSIG (LCDC_INTEN_STNSIGIEN) +#define LCDC_FLAG_STNSYNC (LCDC_INTEN_STNSYNCIEN) +#define LCDC_FLAG_FUK (LCDC_INTEN_FUKIEN) +#define LCDC_FLAG_CRC (LCDC_INTEN_CRCIEN) +#define LCDC_FLAG_RFE (LCDC_INTEN_RFEIEN) + + +void LCDC_DeInit(void); +void LCDC_Init(LCDC_InitType* LCDC_InitStruct); +void LCDC_StructInit(LCDC_InitType* LCDC_InitStruct); +void LCDC_StructInit(LCDC_InitType* LCDC_InitStruct); +void LCDC_Enable(FunctionalState Cmd); +void LCDC_DitherEnable(FunctionalState Cmd); +LCDC_RGBType LCDC_GetDitherWidth(void); +void LCDC_DitherStructInit(LCDC_RGBType* LCDC_RGB_DitherStruct); +void LCDC_LINTPConfig(uint32_t LCDC_LINTPosition); +void LCDC_LayerInit(LCDC_Layer_Module* LCDC_Layerx , LCDC_Layer_InitType* LCDC_Layer_InitStruct); +void LCDC_LayerStructInit(LCDC_Layer_InitType* LCDC_Layer_InitStruct); +void LCDC_LayerEnable(LCDC_Layer_Module* LCDC_Layerx , FunctionalState Cmd); +LCDC_PosType LCDC_GetPosStatus(void); +void LCDC_PosStructInit(LCDC_PosType* LCDC_Pos_InitStruct); +FlagStatus LCDC_GetCDStatus(uint32_t LCDC_CD); +void LCDC_ReloadConfig(uint32_t LCDC_Reload); +void LCDC_LayerReloadConfig(LCDC_Layer_Module* LCDC_Layerx , uint32_t LCDC_LayerReload); +void LCDC_ColorKeyingConfig(LCDC_Layer_Module* LCDC_Layerx, LCDC_ColorKeying_InitType* LCDC_ColorKeying_InitStruct, FunctionalState Cmd); +void LCDC_ColorKeyingStructInit(LCDC_ColorKeying_InitType* LCDC_ColorKeying_InitStruct); +void LCDC_CLUTEnable(LCDC_Layer_Module* LCDC_Layerx, FunctionalState Cmd); +void LCDC_CLUTInit(LCDC_Layer_Module* LCDC_Layerx, LCDC_CLUT_InitType* LCDC_CLUT_InitStruct); +void LCDC_CLUTStructInit(LCDC_CLUT_InitType* LCDC_CLUT_InitStruct); +void LCDC_LayerPosition(LCDC_Layer_Module* LCDC_Layerx, uint16_t OffsetX, uint16_t OffsetY); +void LCDC_LayerAlpha(LCDC_Layer_Module* LCDC_Layerx, uint8_t ConstantAlpha); +void LCDC_LayerAddress(LCDC_Layer_Module* LCDC_Layerx, uint32_t Address); +void LCDC_LayerSize(LCDC_Layer_Module* LCDC_Layerx, uint32_t Width, uint32_t Height); +void LCDC_LayerPixelFormat(LCDC_Layer_Module* LCDC_Layerx, uint32_t PixelFormat); +void LCDC_ConfigInt(uint32_t LCDC_IT, FunctionalState Cmd); +FlagStatus LCDC_GetFlagStatus(uint32_t LCDC_FLAG); +FlagStatus LCDC_GetFlagStatus(uint32_t LCDC_FLAG); +void LCDC_ClearFlag(uint32_t LCDC_FLAG); +INTStatus LCDC_GetIntStatus(uint32_t LCDC_IT); +void LCDC_ClrIntPendingBit(uint32_t LCDC_IT); + + + + +/** LCDC_Exported_Functions End **/ + +#ifdef __cplusplus +} + +#endif + +#endif /*__N32H76x_78x_LCDC_H */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lptim.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lptim.h new file mode 100644 index 0000000000..c4ab1dd621 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lptim.h @@ -0,0 +1,284 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_lptim.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_LPTIM_H__ +#define __N32H76X_78X_LPTIM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" +#include "n32h76x_78x_rcc.h" + +/*** LPTIM Structure Definition Start ***/ + + +/** LPTIM initialize configuration structure definition **/ +typedef struct +{ + uint32_t ClockSource; /* Specifies the source of the clock used by the LPTIM instance. + This parameter can be a value of LPTIM Clock Source definition. + This feature can be modified afterwards using unitary function LPTIM_SetClockSource().*/ + + uint32_t Prescaler; /* Specifies the prescaler division ratio. + This parameter can be a value of LPTIM Prescaler Value definition. + This feature can be modified afterwards using using unitary function LPTIM_SetPrescaler().*/ + + uint32_t Waveform; /* Specifies the waveform shape. + This parameter can be a value of LPTIM Output Waveform Type definition. + This feature can be modified afterwards using unitary function LPTIM_ConfigOutput().*/ + + uint32_t Polarity; /* Specifies waveform polarity. + This parameter can be a value of LPTIM Output Polarity definition. + This feature can be modified afterwards using unitary function LPTIM_ConfigOutput().*/ +} LPTIM_InitType; + +/*** LPTIM Structure Definition End ***/ + + +/*** LPTIM Macro Definition Start ***/ + +/** LPTIM status definition **/ +#define LPTIM_COMP_MATCH_STATUS ((uint32_t)LPTIM_INTSTS_CMPM) /* Compare match */ +#define LPTIM_AUTO_RELOAD_STATUS ((uint32_t)LPTIM_INTSTS_ARRM) /* Autoreload match */ +#define LPTIM_EXT_TRIG_EDGE_EVENT_STATUS ((uint32_t)LPTIM_INTSTS_EXTRIG) /* External trigger edge event */ +#define LPTIM_COMP_UPDATE_STATUS ((uint32_t)LPTIM_INTSTS_CMPUPD) /* Compare register update OK */ +#define LPTIM_AUTO_RELOAD_UPDATE_STATUS ((uint32_t)LPTIM_INTSTS_ARRUPD) /* Autoreload register update OK */ +#define LPTIM_COUNTER_DIR_UP_STATUS ((uint32_t)LPTIM_INTSTS_UP) /* Counter direction change down to up */ +#define LPTIM_COUNTER_DIR_DOWN_STATUS ((uint32_t)LPTIM_INTSTS_DOWN) /* Counter direction change up to down */ + +/** LPTIM flag definition **/ +#define LPTIM_COMP_MATCH_FLAG ((uint32_t)LPTIM_INTCLR_CMPMCF) /* Compare match Clear Flag */ +#define LPTIM_AUTO_RELOAD_FLAG ((uint32_t)LPTIM_INTCLR_ARRMCF) /* Autoreload match Clear Flag */ +#define LPTIM_EXT_TRIG_EDGE_EVENT_FLAG ((uint32_t)LPTIM_INTCLR_EXTRIGCF) /* External trigger edge event Clear Flag */ +#define LPTIM_COMP_UPDATE_FLAG ((uint32_t)LPTIM_INTCLR_CMPUPDCF) /* Compare register update OK Clear Flag */ +#define LPTIM_AUTO_RELOAD_UPDATE_FLAG ((uint32_t)LPTIM_INTCLR_ARRUPDCF) /* Autoreload register update OK Clear Flag */ +#define LPTIM_COUNTER_DIR_UP_FLAG ((uint32_t)LPTIM_INTCLR_UPCF) /* Counter direction change down to up Clear Flag */ +#define LPTIM_COUNTER_DIR_DOWN_FLAG ((uint32_t)LPTIM_INTCLR_DOWNCF) /* Counter direction change up to down Clear Flag */ + +/** LPTIM interrupt definition **/ +#define LPTIM_COMP_MATCH_INT ((uint32_t)LPTIM_INTEN_CMPMIE) /* Compare match Interrupt */ +#define LPTIM_AUTO_RELOAD_INT ((uint32_t)LPTIM_INTEN_ARRMIE) /* Autoreload match Interrupt */ +#define LPTIM_EXT_TRIG_EDGE_EVENT_INT ((uint32_t)LPTIM_INTEN_EXTRIGIE) /* External trigger edge event Interrupt */ +#define LPTIM_COMP_UPDATE_INT ((uint32_t)LPTIM_INTEN_CMPUPDIE) /* Compare register update OK Interrupt */ +#define LPTIM_AUTO_RELOAD_UPDATE_INT ((uint32_t)LPTIM_INTEN_ARRUPDIE) /* Autoreload register update OK Interrupt */ +#define LPTIM_COUNTER_DIR_UP_INT ((uint32_t)LPTIM_INTEN_UPIE) /* Counter direction change down to up Interrupt */ +#define LPTIM_COUNTER_DIR_DOWN_INT ((uint32_t)LPTIM_INTEN_DOWNIE) /* Counter direction change up to down Interrupt */ + +/** LPTIM Operating Mode definition **/ +#define LPTIM_OPERATING_MODE_CONTINUOUS ((uint32_t)LPTIM_CTRL_TSTCM) /* LP Timer starts in continuous mode */ +#define LPTIM_OPERATING_MODE_ONESHOT ((uint32_t)LPTIM_CTRL_SNGMST) /* LP Tilmer starts in single mode */ + +/** LPTIM Update Mode definition **/ +#define LPTIM_UPDATE_MODE_IMMEDIATE ((uint32_t)0x00000000U) /* Preload is disabled: registers are updated after each APB bus write access */ +#define LPTIM_UPDATE_MODE_ENDOFPERIOD ((uint32_t)LPTIM_CFG_RELOAD) /* preload is enabled: registers are updated at the end of the current LPTIM period */ + +/** LPTIM Counter Mode definition **/ +#define LPTIM_COUNTER_MODE_INTERNAL ((uint32_t)0x00000000U) /* The counter is incremented following each internal clock pulse */ +#define LPTIM_COUNTER_MODE_EXTERNAL ((uint32_t)LPTIM_CFG_CNTMEN) /* The counter is incremented following each valid clock pulse on the LPTIM external Input1 */ + +/** LPTIM Output Waveform Type definition **/ +#define LPTIM_OUTPUT_WAVEFORM_PWM ((uint32_t)0x00000000U) /* LPTIM generates either a PWM waveform or a One pulse waveform depending on chosen operating mode CONTINOUS or SINGLE */ +#define LPTIM_OUTPUT_WAVEFORM_SETONCE ((uint32_t)LPTIM_CFG_WAVE) /* LPTIM generates a Set Once waveform */ + +/** LPTIM Output Polarity definition **/ +#define LPTIM_OUTPUT_POLARITY_REGULAR ((uint32_t)0x00000000U) /* The LPTIM output reflects the compare results between LPTIMx_ARR and LPTIMx_CMP registers */ +#define LPTIM_OUTPUT_POLARITY_INVERSE ((uint32_t)LPTIM_CFG_WAVEPOL) /* The LPTIM output reflects the inverse of the compare results between LPTIMx_ARR and LPTIMx_CMP registers */ + +/** LPTIM Prescaler Value definition **/ +#define LPTIM_PRESCALER_DIV1 ((uint32_t)0x00000000U) /* Prescaler division factor is set to 1 */ +#define LPTIM_PRESCALER_DIV2 ((uint32_t)LPTIM_CFG_CLKPRE_0) /* Prescaler division factor is set to 2 */ +#define LPTIM_PRESCALER_DIV4 ((uint32_t)LPTIM_CFG_CLKPRE_1) /* Prescaler division factor is set to 4 */ +#define LPTIM_PRESCALER_DIV8 ((uint32_t)LPTIM_CFG_CLKPRE_1 \ + | LPTIM_CFG_CLKPRE_0) /* Prescaler division factor is set to 8 */ +#define LPTIM_PRESCALER_DIV16 ((uint32_t)LPTIM_CFG_CLKPRE_2) /* Prescaler division factor is set to 16 */ +#define LPTIM_PRESCALER_DIV32 ((uint32_t)LPTIM_CFG_CLKPRE_2 \ + | LPTIM_CFG_CLKPRE_0) /* Prescaler division factor is set to 32 */ +#define LPTIM_PRESCALER_DIV64 ((uint32_t)LPTIM_CFG_CLKPRE_2 \ + | LPTIM_CFG_CLKPRE_1) /* Prescaler division factor is set to 64 */ +#define LPTIM_PRESCALER_DIV128 ((uint32_t)LPTIM_CFG_CLKPRE) /* Prescaler division factor is set to 128 */ + +/** LPTIM Trigger Source definition **/ +#define LPTIM_TRIG_SOURCE_GPIO ((uint32_t)0x00000000U) /* External input trigger is connected to TIMx_ETR input */ +#define LPTIM_TRIG_SOURCE_RTCALARMA ((uint32_t)LPTIM_CFG_TRGSEL_0) /* External input trigger is connected to RTC Alarm A */ +#define LPTIM_TRIG_SOURCE_RTCALARMB ((uint32_t)LPTIM_CFG_TRGSEL_1) /* External input trigger is connected to RTC Alarm B */ +#define LPTIM_TRIG_SOURCE_RTCTAMP1 ((uint32_t)LPTIM_CFG_TRGSEL_1 \ + | LPTIM_CFG_TRGSEL_0) /* External input trigger is connected to RTC Tamper 1 */ +#define LPTIM_TRIG_SOURCE_RTCTAMP2 ((uint32_t)LPTIM_CFG_TRGSEL_2) /* External input trigger is connected to RTC Tamper 2 */ +#define LPTIM_TRIG_SOURCE_RTCTAMP3 ((uint32_t)LPTIM_CFG_TRGSEL_2 \ + | LPTIM_CFG_TRGSEL_0) /* External input trigger is connected to RTC Tamper 3 */ +#define LPTIM_TRIG_SOURCE_COMP1 ((uint32_t)LPTIM_CFG_TRGSEL_2 \ + | LPTIM_CFG_TRGSEL_1) /* External input trigger is connected to COMP1 output */ +#define LPTIM_TRIG_SOURCE_COMP2 ((uint32_t)LPTIM_CFG_TRGSEL_2 \ + | LPTIM_CFG_TRGSEL_1 \ + | LPTIM_CFG_TRGSEL_0) /* External input trigger is connected to COMP2 output */ +#define LPTIM_TRIG_SOURCE_COMP3 ((uint32_t)LPTIM_CFG_TRGSEL_3) /* External input trigger is connected to COMP3 output */ +#define LPTIM_TRIG_SOURCE_COMP4 ((uint32_t)LPTIM_CFG_TRGSEL_3 \ + | LPTIM_CFG_TRGSEL_0) /* External input trigger is connected to COMP4 output */ + +/** LPTIM Trigger Filter definition **/ +#define LPTIM_TRIG_FILTER_NONE ((uint32_t)0x00000000U) /* Any trigger active level change is considered as a valid trigger */ +#define LPTIM_TRIG_FILTER_2 ((uint32_t)LPTIM_CFG_TRIGFLT_0) /* Trigger active level change must be stable for at least 2 clock periods before it is considered as valid trigger */ +#define LPTIM_TRIG_FILTER_4 ((uint32_t)LPTIM_CFG_TRIGFLT_1) /* Trigger active level change must be stable for at least 4 clock periods before it is considered as valid trigger */ +#define LPTIM_TRIG_FILTER_8 ((uint32_t)LPTIM_CFG_TRIGFLT) /* Trigger active level change must be stable for at least 8 clock periods before it is considered as valid trigger */ + +/** LPTIM Trigger Polarity definition **/ +#define LPTIM_TRIG_POLARITY_RISING ((uint32_t)LPTIM_CFG_TRGEN_0) /* LPTIM counter starts when a rising edge is detected */ +#define LPTIM_TRIG_POLARITY_FALLING ((uint32_t)LPTIM_CFG_TRGEN_1) /* LPTIM counter starts when a falling edge is detected */ +#define LPTIM_TRIG_POLARITY_RISING_FALLING ((uint32_t)LPTIM_CFG_TRGEN) /* LPTIM counter starts when a rising or a falling edge is detected */ + +/** LPTIM Clock Source definition **/ +#define LPTIM_CLK_SOURCE_INTERNAL ((uint32_t)0x00000000U) /* LPTIM is clocked by internal clock source ((uint32_t)APB clock or any of the embedded oscillators) */ +#define LPTIM_CLK_SOURCE_EXTERNAL ((uint32_t)LPTIM_CFG_CLKSEL) /* LPTIM is clocked by an external clock source through the LPTIM external Input1 */ + +/** LPTIM Clock Filter definition **/ +#define LPTIM_CLK_FILTER_NONE ((uint32_t)0x00000000U) /* Any external clock signal level change is considered as a valid transition */ +#define LPTIM_CLK_FILTER_2 ((uint32_t)LPTIM_CFG_CLKFLT_0) /* External clock signal level change must be stable for at least 2 clock periods before it is considered as valid transition */ +#define LPTIM_CLK_FILTER_4 ((uint32_t)LPTIM_CFG_CLKFLT_1) /* External clock signal level change must be stable for at least 4 clock periods before it is considered as valid transition */ +#define LPTIM_CLK_FILTER_8 ((uint32_t)LPTIM_CFG_CLKFLT) /* External clock signal level change must be stable for at least 8 clock periods before it is considered as valid transition */ + +/** LPTIM Clock Polarity definition **/ +#define LPTIM_CLK_POLARITY_RISING ((uint32_t)0x00000000U) /* The rising edge is the active edge used for counting */ +#define LPTIM_CLK_POLARITY_FALLING ((uint32_t)LPTIM_CFG_CLKPOL_0) /* The falling edge is the active edge used for counting */ +#define LPTIM_CLK_POLARITY_RISING_FALLING ((uint32_t)LPTIM_CFG_CLKPOL_1) /* Both edges are active edges */ +#define LPTIM_CLK_POLARITY_RISING_FALLING_NO ((uint32_t)LPTIM_CFG_CLKPOL_0 \ + | LPTIM_CFG_CLKPOL_1) /* Both edges are not active edges */ + +/** LPTIM Encoder Mode definition **/ +#define LPTIM_ENCODER_MODE_RISING ((uint32_t)0x00000000U) /* The rising edge is the active edge used for counting */ +#define LPTIM_ENCODER_MODE_FALLING ((uint32_t)LPTIM_CFG_CLKPOL_0) /* The falling edge is the active edge used for counting */ +#define LPTIM_ENCODER_MODE_RISING_FALLING ((uint32_t)LPTIM_CFG_CLKPOL_1) /* Both edges are active edges */ + +/** LPTIM Input1 connected option definition **/ +#define LPTIM_INPUT1_CONNECT_GPIO ((uint32_t)0x00000000U) /* Input1 connected to GPIO */ +#define LPTIM_INPUT1_CONNECT_COMP1 ((uint32_t)LPTIM_OPT_OPT1_2) /* Input1 connected to COMP1_OUT */ +#define LPTIM_INPUT1_CONNECT_COMP2 ((uint32_t)LPTIM_OPT_OPT1_2 \ + | LPTIM_OPT_OPT1_0) /* Input1 connected to COMP2_OUT */ +#define LPTIM_INPUT1_CONNECT_COMP3 ((uint32_t)LPTIM_OPT_OPT1_2 \ + | LPTIM_OPT_OPT1_1) /* Input1 connected to COMP3_OUT */ +#define LPTIM_INPUT1_CONNECT_COMP4 ((uint32_t)LPTIM_OPT_OPT1_2 \ + | LPTIM_OPT_OPT1_1 \ + | LPTIM_OPT_OPT1_0) /* Input1 connected to COMP4_OUT */ + + +/** LPTIM Input2 connected option definition **/ +#define LPTIM_INPUT2_CONNECT_GPIO ((uint32_t)0x00000000U) /* Input2 connected to GPIO */ +#define LPTIM_INPUT2_CONNECT_COMP1 ((uint32_t)LPTIM_OPT_OPT2_2) /* Input2 connected to COMP1_OUT */ +#define LPTIM_INPUT2_CONNECT_COMP2 ((uint32_t)LPTIM_OPT_OPT2_2 \ + | LPTIM_OPT_OPT2_0) /* Input2 connected to COMP2_OUT */ +#define LPTIM_INPUT2_CONNECT_COMP3 ((uint32_t)LPTIM_OPT_OPT2_2 \ + | LPTIM_OPT_OPT2_1) /* Input2 connected to COMP3_OUT */ +#define LPTIM_INPUT2_CONNECT_COMP4 ((uint32_t)LPTIM_OPT_OPT2_2 \ + | LPTIM_OPT_OPT2_1 \ + | LPTIM_OPT_OPT2_0) /* Input2 connected to COMP4_OUT */ + +/*** LPTIM Driving Functions Declaration ***/ +void LPTIM_DeInit(LPTIM_Module* LPTIMx); +void LPTIM_StructInit(LPTIM_InitType* LPTIM_InitStruct); +ErrorStatus LPTIM_Init(LPTIM_Module* LPTIMx, LPTIM_InitType* LPTIM_InitStruct); +void LPTIM_Cmd(LPTIM_Module* LPTIMx, FunctionalStatus Cmd); +uint32_t LPTIM_IsEnabled(LPTIM_Module* LPTIMx); +void LPTIM_StartCounter(LPTIM_Module* LPTIMx, uint32_t OperatingMode); +void LPTIM_SetUpdateMode(LPTIM_Module* LPTIMx, uint32_t UpdateMode); +uint32_t LPTIM_GetUpdateMode(LPTIM_Module* LPTIMx); +void LPTIM_SetAutoReloadValue(LPTIM_Module* LPTIMx, uint32_t AutoReload); +uint32_t LPTIM_GetAutoReloadValue(LPTIM_Module* LPTIMx); +void LPTIM_SetCompareValue(LPTIM_Module* LPTIMx, uint32_t CompareValue); +uint32_t LPTIM_GetCompareValue(LPTIM_Module* LPTIMx); +uint32_t LPTIM_GetCounterValue(LPTIM_Module* LPTIMx); +void LPTIM_SetCounterMode(LPTIM_Module* LPTIMx, uint32_t CounterMode); +uint32_t LPTIM_GetCounterMode(LPTIM_Module* LPTIMx); +void LPTIM_ConfigOutput(LPTIM_Module* LPTIMx, uint32_t Waveform, uint32_t Polarity); +void LPTIM_SetWaveform(LPTIM_Module* LPTIMx, uint32_t Waveform); +uint32_t LPTIM_GetWaveform(LPTIM_Module* LPTIMx); +void LPTIM_SetPolarity(LPTIM_Module* LPTIMx, uint32_t Polarity); +uint32_t LPTIM_GetPolarity(LPTIM_Module* LPTIMx); +void LPTIM_SetPrescaler(LPTIM_Module* LPTIMx, uint32_t Prescaler); +uint32_t LPTIM_GetPrescaler(LPTIM_Module* LPTIMx); +void LPTIM_TimeoutCmd(LPTIM_Module* LPTIMx, FunctionalStatus Cmd); +uint32_t LPTIM_IsEnabledTimeout(LPTIM_Module* LPTIMx); +void LPTIM_SoftwareTrigger(LPTIM_Module* LPTIMx); +void LPTIM_ConfigTrigger(LPTIM_Module* LPTIMx, uint32_t Source, uint32_t Filter, uint32_t Polarity); +uint32_t LPTIM_GetTriggerSource(LPTIM_Module* LPTIMx); +uint32_t LPTIM_GetTriggerFilter(LPTIM_Module* LPTIMx); +uint32_t LPTIM_GetTriggerPolarity(LPTIM_Module* LPTIMx); +void LPTIM_SetClockSource(LPTIM_Module* LPTIMx, uint32_t ClockSource); +uint32_t LPTIM_GetClockSource(LPTIM_Module* LPTIMx); +void LPTIM_ConfigClock(LPTIM_Module* LPTIMx, uint32_t ClockFilter, uint32_t ClockPolarity); +uint32_t LPTIM_GetClockPolarity(LPTIM_Module* LPTIMx); +uint32_t LPTIM_GetClockFilter(LPTIM_Module* LPTIMx); +void LPTIM_SetEncoderModeClockPolarity(LPTIM_Module* LPTIMx, uint32_t ClockPolarity); +uint32_t LPTIM_GetEncoderModeClockPolarity(LPTIM_Module* LPTIMx); +void LPTIM_EncoderModeCmd(LPTIM_Module* LPTIMx, FunctionalStatus Cmd); +void LPTIM_NoEncoderModeCmd(LPTIM_Module* LPTIMx, FunctionalStatus Cmd); +uint32_t LPTIM_IsEnabledEncoderMode(LPTIM_Module* LPTIMx); +uint32_t LPTIM_IsEnabledNoEncoderMode(LPTIM_Module* LPTIMx); +void LPTIM_ClearIntFlag(LPTIM_Module* LPTIMx, uint32_t IntFlag); +uint32_t LPTIM_IsActiveIntStatus(LPTIM_Module* LPTIMx, uint32_t IntSts); +void LPTIM_ConfigInt(LPTIM_Module* LPTIMx, uint32_t Interrupt, FunctionalStatus Cmd); +uint32_t LPTIM_IsEnabledInt(LPTIM_Module* LPTIMx, uint32_t Interrupt); +void LPTIM_ConfigInput1(LPTIM_Module* LPTIMx, uint32_t ConnectSelect); +void LPTIM_ConfigInput2(LPTIM_Module* LPTIMx, uint32_t ConnectSelect); + + +/*** LPTIM Driving Functions Declaration End ***/ + + +#ifdef __cplusplus +} +#endif + +#endif /*__N32H76X_78X_LPTIM_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lpuart.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lpuart.h new file mode 100644 index 0000000000..241d553892 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_lpuart.h @@ -0,0 +1,319 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_lpuart.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_LPUART_H__ +#define __N32H76X_LPUART_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + + +/** @addtogroup LPUART + * @{ + */ + +/** @addtogroup LPUART_Exported_Types + * @{ + */ + +/** + * @brief LPUART Init Structure definition + */ + +typedef struct +{ + uint32_t BaudRate; /*!< This member configures the LPUART communication baud rate. + The baud rate is computed using the following formula: + - IntegerDivider = ((CLK) / (LPUART_InitStruct->BaudRate))) + - FractionalDivider */ + + uint32_t Parity; /*!< Specifies the parity mode. + This parameter can be a value of @ref Parity + @note When parity is enabled, the computed parity is inserted + at the MSB position of the transmitted data (only support + 8 data bits). */ + + uint32_t Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref Mode */ + + uint32_t RtsThreshold; /* Specifies RTS Threshold. + This parameter can be a value of @ref RtsThreshold */ + + uint32_t HardwareFlowControl; /*!< Specifies wether the hardware flow control mode is enabled + or disabled. + This parameter can be a value of @ref LPUART_Hardware_Flow_Control */ +} LPUART_InitType; + +#define LPUART_REG_BIT_MASK (uint32_t)0x00000000U + +#define CTRL_CLR_MASK ((uint32_t)(~(LPUART_CTRL_RXEN \ + |LPUART_CTRL_TXEN \ + |LPUART_CTRL_PC \ + |LPUART_CTRL_PEN \ + |LPUART_CTRL_RTST_0 \ + |LPUART_CTRL_RTST_1\ + |LPUART_CTRL_CTSEN \ + |LPUART_CTRL_RTSEN))) /*!< LPUART CTRL Mask */ + + + + +/** LPUART parity selection **/ + +#define LPUART_PE_NO ((uint32_t)LPUART_CTRL_PC) /* LPUART parity disable */ +#define LPUART_PE_EVEN ((uint32_t)LPUART_REG_BIT_MASK)/* Even parity */ +#define LPUART_PE_ODD ((uint32_t)LPUART_CTRL_PEN) /* Odd parity */ +#define IS_LPUART_PARITY(PARITY) (((PARITY) == LPUART_PE_NO) || ((PARITY) == LPUART_PE_EVEN) || ((PARITY) == LPUART_PE_ODD)) + + +/** LPUART is configured as RX or TX **/ +#define LPUART_MODE_RX ((uint32_t)LPUART_CTRL_RXEN) /* Transmitter enable */ +#define LPUART_MODE_TX ((uint32_t)LPUART_CTRL_TXEN) /* Receiver enable */ +#define IS_LPUART_MODE(MODE) (((MODE) == LPUART_MODE_RX) || ((MODE) == LPUART_MODE_TX)) + + +/** LPUART RtsThreshold **/ +#define LPUART_RTSTH_FIFOHF ((uint32_t)LPUART_REG_BIT_MASK) +#define LPUART_RTSTH_FIFO3QF ((uint32_t)LPUART_CTRL_RTST_0) +#define LPUART_RTSTH_FIFOFU ((uint32_t)LPUART_CTRL_RTST_1) +#define IS_LPUART_RTSTHRESHOLD(RTSTHRESHOLD) \ + (((RTSTHRESHOLD) == LPUART_RTSTH_FIFOHF) || ((RTSTHRESHOLD) == LPUART_RTSTH_FIFO3QF) || ((RTSTHRESHOLD) == LPUART_RTSTH_FIFOFU)) + + + /** LPUART Hardware Flow Control **/ +#define CTRL_HFCTRL_MASK ((uint32_t)(~LPUART_HFCTRL_RTS_CTS)) /* LPUART HFCTRL Bit Mask */ +#define LPUART_HFCTRL_NONE ((uint32_t)LPUART_REG_BIT_MASK) +#define LPUART_HFCTRL_CTS ((uint32_t)LPUART_CTRL_CTSEN) +#define LPUART_HFCTRL_RTS ((uint32_t)LPUART_CTRL_RTSEN) +#define LPUART_HFCTRL_RTS_CTS ((uint32_t)(LPUART_CTRL_CTSEN | LPUART_CTRL_RTSEN)) +#define IS_LPUART_HARDWARE_FLOW_CONTROL(CONTROL) \ + (((CONTROL) == LPUART_HFCTRL_NONE) || ((CONTROL) == LPUART_HFCTRL_RTS) || ((CONTROL) == LPUART_HFCTRL_CTS) \ + || ((CONTROL) == LPUART_HFCTRL_RTS_CTS)) + +/** LPUART_Interrupt_definition **/ +#define LPUART_INT_MASK ((uint32_t)0x00007FFFU) /* LPUART Interrupt Mask */ +#define LPUART_INT_PE ((uint32_t)LPUART_INTEN_PCEIEN) +#define LPUART_INT_TXC ((uint32_t)LPUART_INTEN_TXCIEN) +#define LPUART_INT_RXFIFO_OV ((uint32_t)LPUART_INTEN_RXFOIEN) +#define LPUART_INT_RXFIFO_FU ((uint32_t)LPUART_INTEN_RXFFIEN) +#define LPUART_INT_RXFIFO_HF ((uint32_t)LPUART_INTEN_RXFHFIEN) +#define LPUART_INT_RXFIFO_NE ((uint32_t)LPUART_INTEN_RXFNEIEN) +#define LPUART_INT_WUF ((uint32_t)LPUART_INTEN_WUIEN) +#define LPUART_INT_TXFIFO_OV ((uint32_t)LPUART_INTEN_TXFOIEN) +#define LPUART_INT_TXFIFO_FU ((uint32_t)LPUART_INTEN_TXFFIEN) +#define LPUART_INT_TXFIFO_QF ((uint32_t)LPUART_INTEN_TXFQFIEN) +#define LPUART_INT_TXFIFO_HF ((uint32_t)LPUART_INTEN_TXFHFIEN) +#define LPUART_INT_TXFIFO_NE ((uint32_t)LPUART_INTEN_TXFNEIEN) + +#define LPUART_INT_IDLEF ((uint32_t)LPUART_INTEN_IDLEFIEN) +#define LPUART_INT_FE ((uint32_t)LPUART_INTEN_FEIEN) +#define LPUART_INT_TXFIFO_EM ((uint32_t)LPUART_INTEN_TXFEIEN) + + +#define IS_LPUART_CFG_INT(IT) \ + (((IT) == LPUART_INT_PE) || ((IT) == LPUART_INT_TXC) || ((IT) == LPUART_INT_RXFIFO_OV) || ((IT) == LPUART_INT_RXFIFO_FU) \ + || ((IT) == LPUART_INT_RXFIFO_HF) || ((IT) == LPUART_INT_RXFIFO_NE) || ((IT) == LPUART_INT_WUF)||((IT) == LPUART_INT_TXFIFO_OV) \ + || ((IT) == LPUART_INT_TXFIFO_FU) || ((IT) == LPUART_INT_TXFIFO_QF) || ((IT) == LPUART_INT_TXFIFO_HF)||((IT) == LPUART_INT_TXFIFO_NE) \ + || ((IT) == LPUART_INT_IDLEF) || ((IT) == LPUART_INT_FE) || ((IT) == LPUART_INT_TXFIFO_EM)) + +#define IS_LPUART_GET_INT(IT) \ + (((IT) == LPUART_INT_PE) || ((IT) == LPUART_INT_TXC) || ((IT) == LPUART_INT_RXFIFO_OV) || ((IT) == LPUART_INT_RXFIFO_FU) \ + || ((IT) == LPUART_INT_RXFIFO_HF) || ((IT) == LPUART_INT_RXFIFO_NE) || ((IT) == LPUART_INT_WUF)||((IT) == LPUART_INT_TXFIFO_OV) \ + || ((IT) == LPUART_INT_TXFIFO_FU) || ((IT) == LPUART_INT_TXFIFO_QF) || ((IT) == LPUART_INT_TXFIFO_HF)||((IT) == LPUART_INT_TXFIFO_NE) \ + || ((IT) == LPUART_INT_IDLEF) || ((IT) == LPUART_INT_FE) || ((IT) == LPUART_INT_TXFIFO_EM)) +#define IS_LPUART_CLR_INT(IT) \ + (((IT) == LPUART_INT_PE) || ((IT) == LPUART_INT_TXC) || ((IT) == LPUART_INT_RXFIFO_OV) || ((IT) == LPUART_INT_RXFIFO_FU) \ + || ((IT) == LPUART_INT_RXFIFO_HF) || ((IT) == LPUART_INT_RXFIFO_NE) || ((IT) == LPUART_INT_WUF)||((IT) == LPUART_INT_TXFIFO_OV) \ + || ((IT) == LPUART_INT_TXFIFO_FU) || ((IT) == LPUART_INT_TXFIFO_QF) || ((IT) == LPUART_INT_TXFIFO_HF)||((IT) == LPUART_INT_TXFIFO_NE) \ + || ((IT) == LPUART_INT_IDLEF) || ((IT) == LPUART_INT_FE) || ((IT) == LPUART_INT_TXFIFO_EM)) + +/** LPUART_DMA_Requests **/ +#define LPUART_DMAREQ_TX ((uint32_t)LPUART_CTRL_DMATXEN) +#define LPUART_DMAREQ_RX ((uint32_t)LPUART_CTRL_DMARXEN) + +#define IS_LPUART_DMAREQ(DMAREQ) ((((DMAREQ) & (uint32_t)0xFFFFFF9F) == (uint32_t)0x00) && ((DMAREQ) != (uint32_t)0x00)) + + +/** LPUART_WakeUp_methods **/ +#define LPUART_WUSTP_ON ((uint32_t)LPUART_CTRL_WUSTPEN) +#define LPUART_WUSTP_STARTBIT ((uint32_t)(LPUART_CTRL_WUS_0|LPUART_CTRL_WUS_1|LPUART_CTRL_WUS_3)) +#define LPUART_WUSTP_RXNE ((uint32_t)LPUART_CTRL_WUS_0) +#define LPUART_WUSTP_BYTE ((uint32_t)LPUART_CTRL_WUS_1) +#define LPUART_WUSTP_FRAME_2 ((uint32_t)(LPUART_CTRL_WUS_1|LPUART_CTRL_WUS_0)) +#define LPUART_WUSTP_FRAME_3 ((uint32_t)(LPUART_CTRL_WUS_2) +#define LPUART_WUSTP_FRAME_4 ((uint32_t)(LPUART_CTRL_WUS_2|LPUART_CTRL_WUS_0)) +#define LPUART_WUSTP_FRAME_5 ((uint32_t)(LPUART_CTRL_WUS_2|LPUART_CTRL_WUS_1)) +#define LPUART_WUSTP_FRAME_6 ((uint32_t)(LPUART_CTRL_WUS_2|LPUART_CTRL_WUS_1|LPUART_CTRL_WUS_0)) +#define LPUART_WUSTP_FRAME_7 ((uint32_t)LPUART_CTRL_WUS_3) +#define LPUART_WUSTP_FRAME_8 ((uint32_t)(LPUART_CTRL_WUS_3|LPUART_CTRL_WUS_0)) +#define LPUART_WUSTP_FRAME_MANY ((uint32_t)(LPUART_CTRL_WUS_3|LPUART_CTRL_WUS_1)) +#define CTRL_WUSTP_MASK ((uint32_t)(~(LPUART_CTRL_WUS_0|LPUART_CTRL_WUS_1|LPUART_CTRL_WUS_2|LPUART_CTRL_WUS_3))) /*!< LPUART WakeUp Method Mask */ + +#define IS_LPUART_WAKEUP(WAKEUP) \ + (((WAKEUP) == LPUART_WUSTP_STARTBIT) || ((WAKEUP) == LPUART_WUSTP_RXNE) || ((WAKEUP) == LPUART_WUSTP_BYTE) || ((WAKEUP) == LPUART_WUSTP_FRAME_2) \ + ((WAKEUP) == LPUART_WUSTP_FRAME_3) || ((WAKEUP) == LPUART_WUSTP_FRAME_4) || ((WAKEUP) == LPUART_WUSTP_FRAME_5) || ((WAKEUP) == LPUART_WUSTP_FRAME_6) \ + ((WAKEUP) == LPUART_WUSTP_FRAME_7) || ((WAKEUP) == LPUART_WUSTP_FRAME_8) || ((WAKEUP) == LPUART_WUSTP_FRAME_MANY)) + +/** LPUART_Sampling_methods **/ +#define LPUART_SMPCNT_3B ((uint32_t)LPUART_REG_BIT_MASK) +#define LPUART_SMPCNT_1B ((uint32_t)LPUART_CTRL_SSM) +#define CTRL_SMPCNT_MASK ((uint32_t)(~LPUART_CTRL_SSM)) /*!< LPUART Sampling Method Mask */ + +/** LPUART_Flush_TXFIFO **/ +#define LPUART_FLUSHTXF_ENABLE ((uint32_t)LPUART_CTRL_FTXF) +#define LPUART_FLUSHTXF_DISABLE ((uint32_t)(~LPUART_CTRL_FTXF)) + + +/** LPUART_Flush_RXFIFO **/ +#define LPUART_FLUSHRXF_ENABLE ((uint32_t)LPUART_CTRL_FRXF) +#define LPUART_FLUSHRXF_DISABLE ((uint32_t)(~LPUART_CTRL_FRXF)) + + +/** LPUART_IDLEFRAME_DETECT **/ +#define LPUART_IDLEF_ENABLE ((uint32_t)LPUART_CTRL_IDLEFEN) /* LPUART Idle frame Enable */ +#define LPUART_IDLEF_DISABLE ((uint32_t)(~LPUART_CTRL_IDLEFEN)) /* LPUART Idle frame Disable */ + +/** LPUART_LoopBack_Self-Test **/ +#define LPUART_LOOPBACK_ENABLE ((uint32_t)LPUART_CTRL_LB) +#define LPUART_LOOPBACK_DISABLE ((uint32_t)(~LPUART_CTRL_LB)) + + +/** LPUART_Flags **/ + +#define LPUART_FLAG_PE ((uint32_t)LPUART_INTEN_PCEIEN) +#define LPUART_FLAG_TXC ((uint32_t)LPUART_STS_TXCF) +#define LPUART_FLAG_RXFIFO_OV ((uint32_t)LPUART_STS_RXFOF) +#define LPUART_FLAG_RXFIFO_FU ((uint32_t)LPUART_STS_RXFFF) +#define LPUART_FLAG_RXFIFO_HF ((uint32_t)LPUART_STS_RXFHFF) +#define LPUART_FLAG_RXFIFO_NE ((uint32_t)LPUART_STS_RXFNEF) +#define LPUART_FLAG_CTS ((uint32_t)LPUART_STS_CTSF) +#define LPUART_FLAG_WUF ((uint32_t)LPUART_STS_WUF) +#define LPUART_FLAG_NEF ((uint32_t)LPUART_STS_NEF) +#define LPUART_FLAG_TXFIFO_OV ((uint32_t)LPUART_STS_TXFOF) +#define LPUART_FLAG_TXFIFO_FU ((uint32_t)LPUART_STS_TXFFF) +#define LPUART_FLAG_TXFIFO_QF ((uint32_t)LPUART_STS_TXFQFF) +#define LPUART_FLAG_TXFIFO_HF ((uint32_t)LPUART_STS_TXFHFF) +#define LPUART_FLAG_TXFIFO_NE ((uint32_t)LPUART_STS_TXFNEF) +#define LPUART_FLAG_IDLEF ((uint32_t)LPUART_STS_IDLEF) +#define LPUART_FLAG_FRAME_ER ((uint32_t)LPUART_STS_FE) +#define LPUART_FLAG_TXFIFO_EM ((uint32_t)LPUART_STS_TXFEF) + + +#define IS_LPUART_FLAG(FLAG) \ + (((FLAG) == LPUART_FLAG_PE) || ((FLAG) == LPUART_FLAG_TXC) || ((FLAG) == LPUART_FLAG_RXFIFO_OV) \ + || ((FLAG) == LPUART_FLAG_RXFIFO_FU) || ((FLAG) == LPUART_FLAG_RXFIFO_HF) || ((FLAG) == LPUART_FLAG_RXFIFO_NE) \ + || ((FLAG) == LPUART_FLAG_CTS) || ((FLAG) == LPUART_FLAG_WUF) || ((FLAG) == LPUART_FLAG_NEF) \ + || ((FLAG) == LPUART_FLAG_TXFIFO_OV) || ((FLAG) == LPUART_FLAG_TXFIFO_FU) || ((FLAG) == LPUART_FLAG_TXFIFO_QF) \ + || ((FLAG) == LPUART_FLAG_TXFIFO_HF) || ((FLAG) == LPUART_FLAG_TXFIFO_NE) || ((FLAG) == LPUART_FLAG_IDLEF) \ + || ((FLAG) == LPUART_FLAG_FRAME_ER) || ((FLAG) == LPUART_FLAG_TXFIFO_EM) ) + +//#define IS_LPUART_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFE40) == 0x00) && ((FLAG) != (uint16_t)0x00)) + +#define IS_LPUART_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0) && ((BAUDRATE) < 0x010000)) + +#define IS_LPUART_DATA(DATA) ((DATA) <= 0xFF) + + + + +/** + * @} + */ + +/** @addtogroup LPUART_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup LPUART_Exported_Functions + * @{ + */ + + + + + +void LPUART_DeInit(LPUART_Module* LPUARTx); +void LPUART_Init(LPUART_Module* LPUARTx, LPUART_InitType* LPUART_InitStruct); +void LPUART_StructInit(LPUART_InitType* LPUART_InitStruct); +void LPUART_FlushRxFifo(LPUART_Module* LPUARTx); +void LPUART_FlushTxFifo(LPUART_Module* LPUARTx); +void LPUART_ConfigInt(LPUART_Module* LPUARTx,uint32_t LPUART_INT, FunctionalState Cmd); +void LPUART_EnableDMA(LPUART_Module* LPUARTx,uint32_t LPUART_DMAReq, FunctionalState Cmd); +void LPUART_ConfigWakeUpMethod(LPUART_Module* LPUARTx,uint32_t LPUART_WakeUpMethod); +void LPUART_EnableWakeUpStop(LPUART_Module* LPUARTx,FunctionalState Cmd); +void LPUART_ConfigSamplingMethod(LPUART_Module* LPUARTx,uint32_t LPUART_SamplingMethod); +void LPUART_EnableLoopBack(LPUART_Module* LPUARTx,FunctionalState Cmd); +void LPUART_SendData(LPUART_Module* LPUARTx,uint8_t Data); +uint8_t LPUART_ReceiveData(LPUART_Module* LPUARTx); +void LPUART_ConfigWakeUpData(LPUART_Module* LPUARTx,uint32_t LPUART_WakeUpData1,uint32_t LPUART_WakeUpData2); +FlagStatus LPUART_GetFlagStatus(LPUART_Module* LPUARTx,uint32_t LPUART_FLAG); +void LPUART_ClrFlag(LPUART_Module* LPUARTx,uint32_t LPUART_FLAG); +INTStatus LPUART_GetIntStatus(LPUART_Module* LPUARTx,uint32_t LPUART_INT); +void LPUART_ClrIntPendingBit(LPUART_Module* LPUARTx,uint32_t LPART_INT); +void LPUART_IdleFrameSet(LPUART_Module* LPUARTx,FunctionalState Cmd); +void LPUART_ConfigRXByte(LPUART_Module* LPUARTx,uint8_t LPUART_RXNUMWU); + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_78X_LPUART_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_mdma.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_mdma.h new file mode 100644 index 0000000000..1d1524f145 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_mdma.h @@ -0,0 +1,540 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_mdma.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76x_78x_MDMA_H__ +#define __N32H76x_78x_MDMA_H__ + + +#include +#include "n32h76x_78x.h" + + +#if defined (MDMA) + + +/** MDMA Channel Numbers per MDMA Controller definition **/ +#define MDMA_NUM_CHANNELS (16U) + +/** MDMA Channel Enable/Disable definition **/ +#define MDMA_CH_ENABLE ((uint32_t)(MDMA_CHEN_CH0WEN | MDMA_CHEN_CH0)) +#define MDMA_CH_DISABLE ((uint32_t)(MDMA_CHEN_CH0WEN & (~MDMA_CHEN_CH0))) + +/** MDMA Channel Suspend/Resume definition **/ +#define MDMA_CH_SUSPEND ((uint32_t)(MDMA_CHSUSP_CH0WEN | MDMA_CHSUSP_CH0)) +#define MDMA_CH_RESUME ((uint32_t)(MDMA_CHSUSP_CH0WEN & (~MDMA_CHSUSP_CH0))) + +/** MDMA Common Register Interrupt definition **/ +#define MDMA_COMMON_INT_SIURDEI ((uint32_t)MDMA_CRINTSTSEN_SIURDEIS) /* Slave Interface Undefined Register Decode Error Interrupt */ +#define MDMA_COMMON_INT_SICRWOHEI ((uint32_t)MDMA_CRINTSTSEN_SICRWOHEIS) /* Slave Interface Common Register Write On Hold Error Interrupt */ +#define MDMA_COMMON_INT_SICRR2WOEI ((uint32_t)MDMA_CRINTSTSEN_SICRR2WOEIS) /* Slave Interface Common Register Read to Write Only Error Interrupt */ +#define MDMA_COMMON_INT_SICRW2ROEI ((uint32_t)MDMA_CRINTSTSEN_SICRW2ROEIS) /* Slave Interface Common Register Write to Read Only Error Interrupt */ +#define MDMA_COMMON_INT_SICRDEI ((uint32_t)MDMA_CRINTSTSEN_SICRDEIS) /* Slave Interface Common Register Decode Error Interrupt */ + +/** MDMA Clear Common Register Interrupt definition **/ +#define MDMA_COMMON_INT_CLEAR ((uint32_t)(MDMA_CRINTCLR_SIURDEIC | \ + MDMA_CRINTCLR_SICRWOHEIC | \ + MDMA_CRINTCLR_SICRR2WOEIC | \ + MDMA_CRINTCLR_SICRW2ROEIC | \ + MDMA_CRINTCLR_SICRDEIC)) + +/** MDMA Common Register Interrupt Status Enable register mask definition **/ +#define MDMA_COMMON_INT_STS_MASK ((uint32_t)(MDMA_CRINTSTSEN_SIURDEIS | \ + MDMA_CRINTSTSEN_SICRWOHEIS | \ + MDMA_CRINTSTSEN_SICRR2WOEIS | \ + MDMA_CRINTSTSEN_SICRW2ROEIS | \ + MDMA_CRINTSTSEN_SICRDEIS)) + +/** MDMA Common Register Interrupt Signal Enable register mask definition **/ +#define MDMA_COMMON_INT_SGL_MASK ((uint32_t)(MDMA_CRINTSGLEN_SIURDEIS | \ + MDMA_CRINTSGLEN_SICRWOHEIS | \ + MDMA_CRINTSGLEN_SICRR2WOEIS | \ + MDMA_CRINTSGLEN_SICRW2ROEIS | \ + MDMA_CRINTSGLEN_SICRDEIS)) + +/** MDMA Channel Interrupt definition **/ +#define MDMA_CH_INT_CH_ABORTED ((uint32_t)MDMA_CHNINTSTSEN_CHA) +#define MDMA_CH_INT_CH_DISABLED ((uint32_t)MDMA_CHNINTSTSEN_CHD) +#define MDMA_CH_INT_CH_SUSPENDED ((uint32_t)MDMA_CHNINTSTSEN_CHS) +#define MDMA_CH_INT_CH_SRC_SUSPENDED ((uint32_t)MDMA_CHNINTSTSEN_CHSS) +#define MDMA_CH_INT_CH_LOCK_CLEARED ((uint32_t)MDMA_CHNINTSTSEN_CHLC) +#define MDMA_CH_INT_SLV_IF_W_ON_HOLD_ERR ((uint32_t)MDMA_CHNINTSTSEN_SIWOHE) +#define MDMA_CH_INT_SLV_IF_W_ON_CH_EN_ERR ((uint32_t)MDMA_CHNINTSTSEN_SIWOCEE) +#define MDMA_CH_INT_SLV_IF_R2WO_ERR ((uint32_t)MDMA_CHNINTSTSEN_SIRTWOE) +#define MDMA_CH_INT_SLV_IF_W2RO_ERR ((uint32_t)MDMA_CHNINTSTSEN_SIWTROE) +#define MDMA_CH_INT_SLV_IF_DEC_ERR ((uint32_t)MDMA_CHNINTSTSEN_SIDE) +#define MDMA_CH_INT_SLV_IF_MULTI_BLK_TYPE_ERR ((uint32_t)MDMA_CHNINTSTSEN_SIMBTE) +#define MDMA_CH_INT_SDW_REG_LLI_INVALID_ERR ((uint32_t)MDMA_CHNINTSTSEN_SLIE) +#define MDMA_CH_INT_LLI_W_SLV_ERR ((uint32_t)MDMA_CHNINTSTSEN_LWSE) +#define MDMA_CH_INT_LLI_R_SLV_ERR ((uint32_t)MDMA_CHNINTSTSEN_LRSE) +#define MDMA_CH_INT_LLI_W_DEC_ERR ((uint32_t)MDMA_CHNINTSTSEN_LWDE) +#define MDMA_CH_INT_LLI_R_DEC_ERR ((uint32_t)MDMA_CHNINTSTSEN_LRDE) +#define MDMA_CH_INT_DST_SLV_ERR ((uint32_t)MDMA_CHNINTSTSEN_DSTSE) +#define MDMA_CH_INT_SRC_SLV_ERR ((uint32_t)MDMA_CHNINTSTSEN_SRCSE) +#define MDMA_CH_INT_DST_DEC_ERR ((uint32_t)MDMA_CHNINTSTSEN_DSTDE) +#define MDMA_CH_INT_SRC_DEC_ERR ((uint32_t)MDMA_CHNINTSTSEN_SRCDE) +#define MDMA_CH_INT_DST_TRAN_COMPLE ((uint32_t)MDMA_CHNINTSTSEN_DSTTC) +#define MDMA_CH_INT_SRC_TRAN_COMPLE ((uint32_t)MDMA_CHNINTSTSEN_SRCTC) +#define MDMA_CH_INT_DMA_TRF_DONE ((uint32_t)MDMA_CHNINTSTSEN_DMATD) +#define MDMA_CH_INT_BLK_TRF_DONE ((uint32_t)MDMA_CHNINTSTSEN_BLKTD) + +/** MDMA Clear Channel Interrupt definition **/ +#define MDMA_CH_INT_CLEAR ((uint32_t)(MDMA_CHNINTCLR_CHA | \ + MDMA_CHNINTCLR_CHD | \ + MDMA_CHNINTCLR_CHS | \ + MDMA_CHNINTCLR_CHSS | \ + MDMA_CHNINTCLR_CHLC | \ + MDMA_CHNINTCLR_SIWOHE | \ + MDMA_CHNINTCLR_SIWOCEE | \ + MDMA_CHNINTCLR_SIRTWOE | \ + MDMA_CHNINTCLR_SIWTROE | \ + MDMA_CHNINTCLR_SIDE | \ + MDMA_CHNINTCLR_SIMBTE | \ + MDMA_CHNINTCLR_SLIE | \ + MDMA_CHNINTCLR_LWSE | \ + MDMA_CHNINTCLR_LRSE | \ + MDMA_CHNINTCLR_LWDE | \ + MDMA_CHNINTCLR_LRDE | \ + MDMA_CHNINTCLR_DSTSE | \ + MDMA_CHNINTCLR_SRCSE | \ + MDMA_CHNINTCLR_DSTDE | \ + MDMA_CHNINTCLR_SRCDE | \ + MDMA_CHNINTCLR_DSTTC | \ + MDMA_CHNINTCLR_SRCTC | \ + MDMA_CHNINTCLR_DMATD | \ + MDMA_CHNINTCLR_BLKTD)) + +/** MDMA Channel Interrupt Status Enable register mask definition **/ +#define MDMA_CH_INT_STS_MASK ((uint32_t)(MDMA_CHNINTSTSEN_CHA | \ + MDMA_CHNINTSTSEN_CHD | \ + MDMA_CHNINTSTSEN_CHS | \ + MDMA_CHNINTSTSEN_CHSS | \ + MDMA_CHNINTSTSEN_CHLC | \ + MDMA_CHNINTSTSEN_SIWOHE | \ + MDMA_CHNINTSTSEN_SIWOCEE | \ + MDMA_CHNINTSTSEN_SIRTWOE | \ + MDMA_CHNINTSTSEN_SIWTROE | \ + MDMA_CHNINTSTSEN_SIDE | \ + MDMA_CHNINTSTSEN_SIMBTE | \ + MDMA_CHNINTSTSEN_SLIE | \ + MDMA_CHNINTSTSEN_LWSE | \ + MDMA_CHNINTSTSEN_LRSE | \ + MDMA_CHNINTSTSEN_LWDE | \ + MDMA_CHNINTSTSEN_LRDE | \ + MDMA_CHNINTSTSEN_DSTSE | \ + MDMA_CHNINTSTSEN_SRCSE | \ + MDMA_CHNINTSTSEN_DSTDE | \ + MDMA_CHNINTSTSEN_SRCDE | \ + MDMA_CHNINTSTSEN_DSTTC | \ + MDMA_CHNINTSTSEN_SRCTC | \ + MDMA_CHNINTSTSEN_DMATD | \ + MDMA_CHNINTSTSEN_BLKTD)) + +/** MDMA Channel Interrupt Signal Enable register mask definition **/ +#define MDMA_CH_INT_SGL_MASK ((uint32_t)(MDMA_CHNINTSGLEN_CHA | \ + MDMA_CHNINTSGLEN_CHD | \ + MDMA_CHNINTSGLEN_CHS | \ + MDMA_CHNINTSGLEN_CHSS | \ + MDMA_CHNINTSGLEN_CHLC | \ + MDMA_CHNINTSGLEN_SIWOHE | \ + MDMA_CHNINTSGLEN_SIWOCEE | \ + MDMA_CHNINTSGLEN_SIRTWOE | \ + MDMA_CHNINTSGLEN_SIWTROE | \ + MDMA_CHNINTSGLEN_SIDE | \ + MDMA_CHNINTSGLEN_SIMBTE | \ + MDMA_CHNINTSGLEN_SLIE | \ + MDMA_CHNINTSGLEN_LWSE | \ + MDMA_CHNINTSGLEN_LRSE | \ + MDMA_CHNINTSGLEN_LWDE | \ + MDMA_CHNINTSGLEN_LRDE | \ + MDMA_CHNINTSGLEN_DSTSE | \ + MDMA_CHNINTSGLEN_SRCSE | \ + MDMA_CHNINTSGLEN_DSTDE | \ + MDMA_CHNINTSGLEN_SRCDE | \ + MDMA_CHNINTSGLEN_DSTTC | \ + MDMA_CHNINTSGLEN_SRCTC | \ + MDMA_CHNINTSGLEN_DMATD | \ + MDMA_CHNINTSGLEN_BLKTD)) + + + +/** MDMA Channel Number typedef **/ +typedef enum +{ + MDMA_CHANNEL_0 = 0x0UL, + MDMA_CHANNEL_1 = 0x1UL, + MDMA_CHANNEL_2 = 0x2UL, + MDMA_CHANNEL_3 = 0x3UL, + MDMA_CHANNEL_4 = 0x4UL, + MDMA_CHANNEL_5 = 0x5UL, + MDMA_CHANNEL_6 = 0x6UL, + MDMA_CHANNEL_7 = 0x7UL, + MDMA_CHANNEL_8 = 0x8UL, + MDMA_CHANNEL_9 = 0x9UL, + MDMA_CHANNEL_10 = 0xAUL, + MDMA_CHANNEL_11 = 0xBUL, + MDMA_CHANNEL_12 = 0xCUL, + MDMA_CHANNEL_13 = 0xDUL, + MDMA_CHANNEL_14 = 0xEUL, + MDMA_CHANNEL_15 = 0xFUL +} MDMA_ChNumType; + +/** MDMA Channel Status typedef **/ +typedef enum +{ + MDMA_CH_STS_OK = 0, /* MDMA status OK */ + MDMA_CH_STS_ERROR, /* MDMA status Error */ + MDMA_CH_STS_BUSY /* MDMA status Busy */ +} MDMA_ChStatusType; + +/** MDMA Channel Master Select typedef **/ +typedef enum +{ + MDMA_CH_MASTER_1 = 0, /* AXI master 1 */ + MDMA_CH_MASTER_2 /* AXI master 2 */ +} MDMA_ChMasterSelType; + +/** MDMA channel multi block transfer type typedef **/ +typedef enum +{ + MDMA_CH_MULTI_BLOCK_CONTIGUOUS = 0x0UL, /* Contiguous Multiblock Type */ + MDMA_CH_MULTI_BLOCK_RELOAD = 0x1UL, /* Reload Multiblock Type */ + MDMA_CH_MULTI_BLOCK_LINKED_LIST = 0x3UL /* Linked List based Multiblock Type */ +} MDMA_ChMultBlkTfrType; + +/** MDMA channel transfer type and flow control typedef **/ +typedef enum +{ + MDMA_CH_TRANSFER_FLOW_M2M_MDMA = 0x0UL, /* Memory to memory (MDMA flow controller) */ + MDMA_CH_TRANSFER_FLOW_M2P_MDMA = 0x1UL, /* Memory to peripheral (MDMA flow controller) */ + MDMA_CH_TRANSFER_FLOW_P2M_MDMA = 0x2UL, /* Peripheral to memory (MDMA flow controller) */ + MDMA_CH_TRANSFER_FLOW_P2P_MDMA = 0x3UL, /* Peripheral to peripheral (MDMA flow controller) */ + MDMA_CH_TRANSFER_FLOW_P2M_SRCPER = 0x4UL, /* Peripheral to memory (Source Peripheral flow controller) */ + MDMA_CH_TRANSFER_FLOW_P2P_SRCPER = 0x5UL, /* Peripheral to peripheral (Source peripheral flow controller) */ + MDMA_CH_TRANSFER_FLOW_M2P_DSTPER = 0x6UL, /* Memory to peripheral (Destination Peripheral flow controller) */ + MDMA_CH_TRANSFER_FLOW_P2P_DSTPER = 0x7UL /* Peripheral to peripheral (Destination peripheral flow controller) */ +} MDMA_ChTfrFlowType; + +/** MDMA channel transfer width typedef **/ +typedef enum +{ + MDMA_CH_TRANSFER_WIDTH_8 = 0x0UL, /* 8-bit transfer width */ + MDMA_CH_TRANSFER_WIDTH_16 = 0x1UL, /* 16-bit transfer width */ + MDMA_CH_TRANSFER_WIDTH_32 = 0x2UL, /* 32-bit transfer width */ + MDMA_CH_TRANSFER_WIDTH_64 = 0x3UL /* 64-bit transfer width */ +} MDMA_ChTfrWidthType; + +/** MDMA channel burst transaction length typedef **/ +typedef enum +{ + MDMA_CH_BURST_TRAN_LEN_1 = 0x0UL, /* 1 Data Item read from Source in the burst transaction */ + MDMA_CH_BURST_TRAN_LEN_4 = 0x1UL, /* 4 Data Item read from Source in the burst transaction */ + MDMA_CH_BURST_TRAN_LEN_8 = 0x2UL, /* 8 Data Item read from Source in the burst transaction */ + MDMA_CH_BURST_TRAN_LEN_16 = 0x3UL, /* 16 Data Item read from Source in the burst transaction */ + MDMA_CH_BURST_TRAN_LEN_32 = 0x4UL, /* 32 Data Item read from Source in the burst transaction */ + MDMA_CH_BURST_TRAN_LEN_64 = 0x5UL, /* 64 Data Item read from Source in the burst transaction */ + MDMA_CH_BURST_TRAN_LEN_128 = 0x6UL, /* 128 Data Item read from Source in the burst transaction */ +} MDMA_ChBurstTranLenType; + +/** MDMA channel address count mode typedef **/ +typedef enum +{ + MDMA_CH_ADDRESS_COUNT_MODE_INCREMENT = 0x0UL, /* Address count mode: increment */ + MDMA_CH_ADDRESS_COUNT_MODE_NO_CHANGE = 0x1UL /* Address count mode: no change */ +} MDMA_ChAddrCountType; + +/** MDMA channel priorities typedef **/ +typedef enum +{ + MDMA_CH_PRIORITY_0 = 0x0UL, /* MDMA channel priority 0 (low) */ + MDMA_CH_PRIORITY_1 = 0x1UL, /* MDMA channel priority 1 */ + MDMA_CH_PRIORITY_2 = 0x2UL, /* MDMA channel priority 2 */ + MDMA_CH_PRIORITY_3 = 0x3UL, /* MDMA channel priority 3 */ + MDMA_CH_PRIORITY_4 = 0x4UL, /* MDMA channel priority 4 */ + MDMA_CH_PRIORITY_5 = 0x5UL, /* MDMA channel priority 5 */ + MDMA_CH_PRIORITY_6 = 0x6UL, /* MDMA channel priority 6 */ + MDMA_CH_PRIORITY_7 = 0x7UL, /* MDMA channel priority 7 */ + MDMA_CH_PRIORITY_8 = 0x8UL, /* MDMA channel priority 8 */ + MDMA_CH_PRIORITY_9 = 0x9UL, /* MDMA channel priority 9 */ + MDMA_CH_PRIORITY_10 = 0xAUL, /* MDMA channel priority 10 */ + MDMA_CH_PRIORITY_11 = 0xBUL, /* MDMA channel priority 11 */ + MDMA_CH_PRIORITY_12 = 0xCUL, /* MDMA channel priority 12 */ + MDMA_CH_PRIORITY_13 = 0xDUL, /* MDMA channel priority 13 */ + MDMA_CH_PRIORITY_14 = 0xEUL, /* MDMA channel priority 14 */ + MDMA_CH_PRIORITY_15 = 0xFUL /* MDMA channel priority 15 (high) */ +} MDMA_ChPriorType; + +/** MDMA channel Source handshake interface typedef **/ +typedef enum +{ + MDMA_CH_SRC_HANDSHAKING_HARDWARE = 0x0UL, /* Source: hardware handshake */ + MDMA_CH_SRC_HANDSHAKING_SOFTWARE = 0x1UL /* Source: software handshake */ +} MDMA_ChSrcHsType; + +/** MDMA channel Destination handshake interface typedef **/ +typedef enum +{ + MDMA_CH_DST_HANDSHAKING_HARDWARE = 0x0UL, /* Destination: hardware handshake */ + MDMA_CH_DST_HANDSHAKING_SOFTWARE = 0x1UL /* Destination: software handshake */ +} MDMA_ChDstHsType; + +/** MDMA channel hardware handshaking interface typedef, available when MDMA is flow controller **/ +typedef enum +{ + MDMA_CH_HARDWARE_HANDSHAKING_IF_0 = 0x0UL, /* Hardware handshaking interface 0 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_1 = 0x1UL, /* Hardware handshaking interface 1 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_2 = 0x2UL, /* Hardware handshaking interface 2 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_3 = 0x3UL, /* Hardware handshaking interface 3 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_4 = 0x4UL, /* Hardware handshaking interface 4 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_5 = 0x5UL, /* Hardware handshaking interface 5 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_6 = 0x6UL, /* Hardware handshaking interface 6 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_7 = 0x7UL, /* Hardware handshaking interface 7 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_8 = 0x8UL, /* Hardware handshaking interface 8 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_9 = 0x9UL, /* Hardware handshaking interface 9 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_10 = 0xAUL, /* Hardware handshaking interface 10 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_11 = 0xBUL, /* Hardware handshaking interface 11 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_12 = 0xCUL, /* Hardware handshaking interface 12 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_13 = 0xDUL, /* Hardware handshaking interface 13 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_14 = 0xEUL, /* Hardware handshaking interface 14 */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_15 = 0xFUL /* Hardware handshaking interface 15 */ +} MDMA_ChHwHsIfType; + +/** MDMA channel hardware handshaking interface polarity typedef **/ +typedef enum +{ + MDMA_CH_HARDWARE_HANDSHAKING_IF_POL_H = 0x0UL, /* Active HIGH */ + MDMA_CH_HARDWARE_HANDSHAKING_IF_POL_L = 0x1UL /* Active LOW */ +} MDMA_ChHwHsIfPolType; + +/** MDMA Channel Software Handshake transfer types typedef **/ +typedef enum +{ + MDMA_CH_SOFTWARE_HANDSHAKING_TFR_SINGLE, /* Single DMA transfer */ + MDMA_CH_SOFTWARE_HANDSHAKING_TFR_BURST /* Burst transfer */ +} MDMA_ChSwHsTfrType; + + +/** Start of section using anonymous unions **/ +#if defined (__CC_ARM) + /* Save the current compiler state (Keil only) */ + #pragma push + /* Enable anonymous unions */ + #pragma anon_unions +#elif defined(__ICCARM__) + /* Enable anonymous consortia */ + #pragma language=extended +#elif defined(__GNUC__) + /* GCC supports anonymous unions by default */ +#else + #warning "Anonymous unions may not be supported by this compiler. Check compiler documentation." +#endif + +/** MDMA channel linked list item structure, 64-bits alignment **/ +typedef struct __MDMA_LinkListItemType +{ + uint64_t SrcAddr; /* Source address */ + + uint64_t DstAddr; /* Destination address */ + + uint32_t BlkSize; /* MDMA block size for MDMA controlled transfers [max. 8191] */ + + uint32_t RESERVED0; /* Reserved */ + + struct __MDMA_LinkListItemType *pNext; /* The next linked list item pointer */ + + union + { + uint64_t ChCtrl; + struct + { + uint64_t SrcMasterSel: 1; /* Source Master Select "0: AXI master 1, 1: AXI Master 2" */ + uint64_t : 1; + uint64_t DstMasterSel: 1; /* Destination Master Select "0: AXI master 1, 1: AXI Master 2" */ + uint64_t : 1; + uint64_t SrcAddrInc: 1; /* Source Address Increment */ + uint64_t : 1; + uint64_t DstAddrInc: 1; /* Destination Address Increment */ + uint64_t : 1; + uint64_t SrcTfrWidth: 3; /* Source Transfer width */ + uint64_t DstTfrWidth: 3; /* Destination Transfer width */ + uint64_t SrcBurstTranLen: 4; /* Source Burst Transaction Length */ + uint64_t DstBurstTranLen: 4; /* Destination Burst Transaction Length */ + uint64_t : 8; + uint64_t NonPosLastWriteEn: 1; /* Non Posted Last Write Enable */ + uint64_t : 1; + + uint64_t : 6; + uint64_t SrcBurstLenEn: 1; /* Source Burst Length Enable */ + uint64_t SrcBurstLen: 8; /* Source Burst Length */ + uint64_t DstBurstLenEn: 1; /* Destination Burst Length Enable */ + uint64_t DstBurstLen: 8; /* Destination Burst Length */ + uint64_t : 2; + uint64_t IocBlkTfr: 1; /* Interrupt On completion of Block Transfer */ + uint64_t : 3; + uint64_t SdwLlILast: 1; /* Last Linked List Item */ + uint64_t SdwLlIValid: 1; /* Linked List Item (LLI) valid */ + }; + }; + +} MDMA_LinkListItemType; + +/** MDMA Channel Initialize configuration structure **/ +typedef struct +{ + union + { + uint64_t ChCtrl; + struct + { + uint64_t SrcMasterSel: 1; /* Source Master Select "0: AXI master 1, 1: AXI Master 2" */ + uint64_t : 1; + uint64_t DstMasterSel: 1; /* Destination Master Select "0: AXI master 1, 1: AXI Master 2" */ + uint64_t : 1; + uint64_t SrcAddrInc: 1; /* Source Address Increment */ + uint64_t : 1; + uint64_t DstAddrInc: 1; /* Destination Address Increment */ + uint64_t : 1; + uint64_t SrcTfrWidth: 3; /* Source Transfer width */ + uint64_t DstTfrWidth: 3; /* Destination Transfer width */ + uint64_t SrcBurstTranLen: 4; /* Source Burst Transaction Length */ + uint64_t DstBurstTranLen: 4; /* Destination Burst Transaction Length */ + uint64_t : 8; + uint64_t NonPosLastWriteEn: 1; /* Non Posted Last Write Enable */ + uint64_t : 1; + + uint64_t : 6; + uint64_t SrcBurstLenEn: 1; /* Source Burst Length Enable */ + uint64_t SrcBurstLen: 8; /* Source Burst Length */ + uint64_t DstBurstLenEn: 1; /* Destination Burst Length Enable */ + uint64_t DstBurstLen: 8; /* Destination Burst Length */ + uint64_t : 2; + uint64_t IocBlkTfr: 1; /* Interrupt On completion of Block Transfer */ + uint64_t : 3; + uint64_t SdwLlILast: 1; /* Last Linked List Item */ + uint64_t SdwLlIValid: 1; /* Linked List Item (LLI) valid */ + }; + }; + + uint64_t SrcAddr; /* Source address */ + uint64_t DstAddr; /* Destination address */ + MDMA_LinkListItemType *pLinkListItem; /* Linked list item pointer */ + + uint32_t BlkSize; /* MDMA block size for MDMA controlled transfers [max. 8191] */ + MDMA_ChPriorType ChannelPriority; /* MDMA channel priority */ + + MDMA_ChSrcHsType SrcHandshaking; /* MDMA source handshaking interface */ + MDMA_ChHwHsIfType SrcHsInterface; /* MDMA source assigned handshaking interface */ + MDMA_ChHwHsIfPolType SrcHsInterfacePol; /* MDMA source hardware handshaking interface polarity */ + MDMA_ChDstHsType DstHandshaking; /* MDMA destination handshaking interface */ + MDMA_ChHwHsIfType DstHsInterface; /* MDMA destination assigned handshaking interface */ + MDMA_ChHwHsIfPolType DstHsInterfacePol; /* MDMA destination hardware handshaking interface polarity */ + + MDMA_ChTfrFlowType TfrTypeFlowCtrl; /* MDMA transfer type and flow control */ + MDMA_ChMultBlkTfrType SrcMultBlkTfrType; /* Source Multi Block Transfer Type */ + MDMA_ChMultBlkTfrType DstMultBlkTfrType; /* Destination Multi Block Transfer Type */ + +} MDMA_ChInitType; + +/** End of section using anonymous unions (Keil only) **/ +#if defined (__CC_ARM) + /* Restore compiler settings */ + #pragma pop +#endif + + +void MDMA_ControllerCmd(MDMA_Module *const MDMAy, FunctionalStatus Cmd); +bool MDMA_ControllerIsEnabled(MDMA_Module *const MDMAy); +void MDMA_ControllerSoftReset(MDMA_Module *const MDMAy); +void MDMA_ChannelCmd(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, FunctionalStatus Cmd); +bool MDMA_ChannelIsEnabled(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum); +MDMA_ChStatusType MDMA_ChannelInit(MDMA_Module *const MDMAy, MDMA_ChInitType *const MDMA_ChInitParam, MDMA_ChNumType ChNum); +void MDMA_ChannelStructInit(MDMA_ChInitType *const MDMA_ChInitParam); +void MDMA_ChannelSuspend(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum); +bool MDMA_ChannelIsSuspended(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum); +void MDMA_ChannelResume(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum); + +void MDMA_GlobalInterruptCmd(MDMA_Module *const MDMAy, FunctionalStatus Cmd); +void MDMA_CommonInterruptStatusCmd(MDMA_Module *const MDMAy, uint32_t Interrupt, FunctionalStatus Cmd); +void MDMA_CommonInterruptSignalCmd(MDMA_Module *const MDMAy, uint32_t Interrupt, FunctionalStatus Cmd); +void MDMA_ClearCommonInterruptStatus(MDMA_Module *const MDMAy, uint32_t Interrupt); +uint64_t MDMA_GetCombinedStatus(MDMA_Module *const MDMAy); +INTStatus MDMA_GetCommonInterruptStatus(MDMA_Module *const MDMAy, uint32_t Interrupt); +void MDMA_ChannelInterruptStatusCmd(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint32_t Interrupt, FunctionalStatus Cmd); +void MDMA_ChannelInterruptSignalCmd(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint32_t Interrupt, FunctionalStatus Cmd); +void MDMA_ClearChannelInterruptStatus(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint32_t Interrupt); +INTStatus MDMA_GetChannelInterruptStatus(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint32_t Interrupt); + +void MDMA_SetChannelSourceAddress(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint64_t Addr); +void MDMA_SetChannelDestinationAddress(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint64_t Addr); +void MDMA_SetChannelBlockSize(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint32_t Size); +uint32_t MDMA_GetTransferredNumber(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum); +void MDMA_SetChannelLinkedListPointer(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint64_t StrAddr); +void MDMA_SetChannelSrcMultiBlockType(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, MDMA_ChMultBlkTfrType Type); +void MDMA_SetChannelDstMultiBlockType(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, MDMA_ChMultBlkTfrType Type); +void MDMA_TriggerSourceRequest(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, MDMA_ChSwHsTfrType Type, bool isLast); +void MDMA_TriggerDestinationRequest(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, MDMA_ChSwHsTfrType Type, bool isLast); +void MDMA_BlockTransferResumeRequest(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum); + +void MDMA_SetChannelLinkedListItemValid(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum); +bool MDMA_ChannelLinkedListItemIsValid(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum); +void MDMA_SetChannelLastLinkedListItem(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum); + + + +#ifdef __cplusplus +} +#endif + +#endif /* defined (MDMA) */ +#endif /* __N32H76x_78x_MDMA_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_mmu.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_mmu.h new file mode 100644 index 0000000000..38795d2381 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_mmu.h @@ -0,0 +1,256 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_mmu.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_MMU_H__ +#define __N32H76X_78X_MMU_H__ + +#include "n32h76x_78x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** MMU Flash Key **/ +#define MMU_FLASH_KEY0 ((uint32_t) 0x89ABCDEFU) +#define MMU_FLASH_KEY1 ((uint32_t) 0x01234567U) + +/** MMU Control **/ +#define MMU_RESET (MMU_CTRL_RSTE) +#define MMU_INT_EN (MMU_CTRL_INTE) + +/** MMU status register **/ +#define MMU_XSPI_LOCK_FLAG (MMU_STS_XSPIL) +#define MMU_ITCM_RERR_FLAG (MMU_STS_ITRDE) +#define MMU_ITCM_WERR_FLAG (MMU_STS_ITWRE) +#define MMU_BKSRAM_RERR_FLAG (MMU_STS_BKRDE) +#define MMU_BKSRAM_WERR_FLAG (MMU_STS_BKWRE) +#define MMU_AHBSRAM5_RERR_FLAG (MMU_STS_H5RDE) +#define MMU_AHBSRAM5_WERR_FLAG (MMU_STS_H5WRE) +#define MMU_AHBSRAM4_RERR_FLAG (MMU_STS_H4RDE) +#define MMU_AHBSRAM4_WERR_FLAG (MMU_STS_H4WRE) +#define MMU_AHBSRAM3_RERR_FLAG (MMU_STS_H3RDE) +#define MMU_AHBSRAM3_WERR_FLAG (MMU_STS_H3WRE) +#define MMU_AHBSRAM2_RERR_FLAG (MMU_STS_H2RDE) +#define MMU_AHBSRAM2_WERR_FLAG (MMU_STS_H2WRE) +#define MMU_AHBSRAM1_RERR_FLAG (MMU_STS_H1RDE) +#define MMU_AHBSRAM1_WERR_FLAG (MMU_STS_H1WRE) +#define MMU_AXISRAM3_RERR_FLAG (MMU_STS_X3RDE) +#define MMU_AXISRAM3_WERR_FLAG (MMU_STS_X3WRE) +#define MMU_AXISRAM2_RERR_FLAG (MMU_STS_X2RDE) +#define MMU_AXISRAM2_WERR_FLAG (MMU_STS_X2WRE) +#define MMU_AXISRAM1_RERR_FLAG (MMU_STS_X1RDE) +#define MMU_AXISRAM1_WERR_FLAG (MMU_STS_X1WRE) +#define MMU_OB_LOCK_FLAG (MMU_STS_OBL) +#define MMU_FLASH_LOCK_FLAG (MMU_STS_FLASHL) +#define MMU_XSPI_RERR_FLAG (MMU_STS_XSPIRDE) + +/** MMU RTAD **/ +#define MMU_RTAD_ADDRESS_OFFSET ((uint32_t)0x00000034U) +#define MMU_RTAD1 ((uint32_t)0x00000001U) +#define MMU_RTAD2 ((uint32_t)0x00000002U) +#define MMU_RTAD3 ((uint32_t)0x00000003U) +#define MMU_RTAD4 ((uint32_t)0x00000004U) + +#define MMU_RTR_ADDRESS_OFFSET ((uint32_t)0x00000084U) +#define MMU_RTR_ENDADDR_OFFSET ((uint32_t)0x00000010U) +#define MMU_RTAD_REGION1 ((uint32_t)0x00000001U) +#define MMU_RTAD_REGION2 ((uint32_t)0x00000002U) +#define MMU_RTAD_REGION3 ((uint32_t)0x00000003U) +#define MMU_RTAD_REGION4 ((uint32_t)0x00000004U) + +#define MMU_RTAD_ENABLE (MMU_RTADC_REN) +#define MMU_RTAD_CFG_LOCK (MMU_RTADC_RCFGL) +#define MMU_RTAD_KEY_LOCK (MMU_RTADC_RKEYL) + +#define MMU_RTAD_MODE_DEC_INST ((uint32_t) 0x00000000U) +#define MMU_RTAD_MODE_DEC_DATA (MMU_RTADC_RMOD_0) +#define MMU_RTAD_MODE_DEC_ALL (MMU_RTADC_RMOD_1) +#define MMU_RTAD_MODE_MASK (MMU_RTADC_RMOD) + +#define MMU_RTAD_PROPERTY_INST ((uint32_t) 0x00000000U) +#define MMU_RTAD_PROPERTY_DATA (MMU_RTADC_RPROPERTY_0) +#define MMU_RTAD_PROPERTY_ALL (MMU_RTADC_RPROPERTY_1) +#define MMU_RTAD_PROPERTY_MASK (MMU_RTADC_RPROPERTY) + +#define MMU_RTAD_REGION1_PART0_KEY ((uint32_t) 0x00000044U) +#define MMU_RTAD_REGION1_PART1_KEY ((uint32_t) 0x00000048U) +#define MMU_RTAD_REGION1_PART2_KEY ((uint32_t) 0x0000004CU) +#define MMU_RTAD_REGION1_PART3_KEY ((uint32_t) 0x00000050U) + +#define MMU_RTAD_REGION2_PART0_KEY ((uint32_t) 0x00000054U) +#define MMU_RTAD_REGION2_PART1_KEY ((uint32_t) 0x00000058U) +#define MMU_RTAD_REGION2_PART2_KEY ((uint32_t) 0x0000005CU) +#define MMU_RTAD_REGION2_PART3_KEY ((uint32_t) 0x00000060U) + +#define MMU_RTAD_REGION3_PART0_KEY ((uint32_t) 0x00000064U) +#define MMU_RTAD_REGION3_PART1_KEY ((uint32_t) 0x00000068U) +#define MMU_RTAD_REGION3_PART2_KEY ((uint32_t) 0x0000006CU) +#define MMU_RTAD_REGION3_PART3_KEY ((uint32_t) 0x00000070U) + +#define MMU_RTAD_REGION4_PART0_KEY ((uint32_t) 0x00000074U) +#define MMU_RTAD_REGION4_PART1_KEY ((uint32_t) 0x00000078U) +#define MMU_RTAD_REGION4_PART2_KEY ((uint32_t) 0x0000007CU) +#define MMU_RTAD_REGION4_PART3_KEY ((uint32_t) 0x00000080U) + + +/** MMU Module Memory **/ +#define MMU_MEMORY_ADDRESS_OFFSET ((uint32_t)0x0000012CU) +#define MMU_MEMORY_EN (MMU_ETH1ME_EN) +#define MMU_MEMORY_ETH1 ((uint32_t) 0x00000001U) +#define MMU_MEMORY_ETH2 ((uint32_t) 0x00000002U) +#define MMU_MEMORY_USB1 ((uint32_t) 0x00000003U) +#define MMU_MEMORY_USB2 ((uint32_t) 0x00000004U) +#define MMU_MEMORY_SDMMC1 ((uint32_t) 0x00000005U) +#define MMU_MEMORY_SDMMC2 ((uint32_t) 0x00000006U) +#define MMU_MEMORY_DVP1 ((uint32_t) 0x00000007U) +#define MMU_MEMORY_DVP2 ((uint32_t) 0x00000008U) +#define MMU_MEMORY_DMA1 ((uint32_t) 0x00000009U) +#define MMU_MEMORY_DMA2 ((uint32_t) 0x0000000AU) +#define MMU_MEMORY_DMA3 ((uint32_t) 0x0000000BU) +#define MMU_MEMORY_MDMA ((uint32_t) 0x0000000CU) +#define MMU_MEMORY_JPEG ((uint32_t) 0x0000000DU) +#define MMU_MEMORY_LCDC ((uint32_t) 0x0000000EU) +#define MMU_MEMORY_GPU ((uint32_t) 0x0000000FU) +#define MMU_MEMORY_SDPU ((uint32_t) 0x00000010U) +#define MMU_MEMORY_UID_OFFSET (REG_BIT8_OFFSET) +#define MMU_MEMORY_MID_OFFSET (REG_BIT16_OFFSET) + +/** MMU Read Error Address Register **/ +#define MMU_XRAD_ADDR_OFFSET ((uint32_t) 0x00000178U) +#define MMU_X1RAD_ADDR_OFFSET ((uint32_t) 0x00000188U) +#define MMU_X2RAD_ADDR_OFFSET ((uint32_t) 0x00000198U) +#define MMU_X3RAD_ADDR_OFFSET ((uint32_t) 0x000001A8U) + +#define MMU_H1RAD_ADDR_OFFSET ((uint32_t) 0x0000021CU) +#define MMU_H2RAD_ADDR_OFFSET ((uint32_t) 0x0000022CU) +#define MMU_H3RAD_ADDR_OFFSET ((uint32_t) 0x0000023CU) +#define MMU_H4RAD_ADDR_OFFSET ((uint32_t) 0x0000024CU) +#define MMU_H5RAD_ADDR_OFFSET ((uint32_t) 0x0000025CU) + +#define MMU_BKRAD_ADDR_OFFSET ((uint32_t) 0x0000026CU) +#define MMU_ITRAD_ADDR_OFFSET ((uint32_t) 0x0000027CU) + +/** MMU Write Error Address Register **/ +#define MMU_X1WAD_ADDR_OFFSET ((uint32_t) 0x00000184U) +#define MMU_X2WAD_ADDR_OFFSET ((uint32_t) 0x00000194U) +#define MMU_X3WAD_ADDR_OFFSET ((uint32_t) 0x000001A4U) + +#define MMU_H1WAD_ADDR_OFFSET ((uint32_t) 0x00000218U) +#define MMU_H2WAD_ADDR_OFFSET ((uint32_t) 0x00000228U) +#define MMU_H3WAD_ADDR_OFFSET ((uint32_t) 0x00000238U) +#define MMU_H4WAD_ADDR_OFFSET ((uint32_t) 0x00000248U) +#define MMU_H5WAD_ADDR_OFFSET ((uint32_t) 0x00000258U) + +#define MMU_BKWAD_ADDR_OFFSET ((uint32_t) 0x00000268U) +#define MMU_ITWAD_ADDR_OFFSET ((uint32_t) 0x00000278U) + +/** MMU Read Error Debug Register **/ +#define MMU_XRD_ADDR_OFFSET ((uint32_t) 0x00000170U) +#define MMU_X1RD_ADDR_OFFSET ((uint32_t) 0x00000180U) +#define MMU_X2RD_ADDR_OFFSET ((uint32_t) 0x00000190U) +#define MMU_X3RD_ADDR_OFFSET ((uint32_t) 0x000001A0U) + +#define MMU_H1RD_ADDR_OFFSET ((uint32_t) 0x00000214U) +#define MMU_H2RD_ADDR_OFFSET ((uint32_t) 0x00000224U) +#define MMU_H3RD_ADDR_OFFSET ((uint32_t) 0x00000234U) +#define MMU_H4RD_ADDR_OFFSET ((uint32_t) 0x00000244U) +#define MMU_H5RD_ADDR_OFFSET ((uint32_t) 0x00000254U) + +#define MMU_BKRD_ADDR_OFFSET ((uint32_t) 0x00000264U) +#define MMU_ITRD_ADDR_OFFSET ((uint32_t) 0x00000274U) +#define MMU_RERRDEBUG_MID_OFFSET (REG_BIT8_OFFSET) + +/** MMU Write Error Debug Register **/ +#define MMU_X1WD_ADDR_OFFSET ((uint32_t) 0x0000017CU) +#define MMU_X2WD_ADDR_OFFSET ((uint32_t) 0x0000018CU) +#define MMU_X3WD_ADDR_OFFSET ((uint32_t) 0x0000019CU) + +#define MMU_H1WD_ADDR_OFFSET ((uint32_t) 0x00000210U) +#define MMU_H2WD_ADDR_OFFSET ((uint32_t) 0x00000220U) +#define MMU_H3WD_ADDR_OFFSET ((uint32_t) 0x00000230U) +#define MMU_H4WD_ADDR_OFFSET ((uint32_t) 0x00000240U) +#define MMU_H5WD_ADDR_OFFSET ((uint32_t) 0x00000250U) + +#define MMU_BKWD_ADDR_OFFSET ((uint32_t) 0x00000260U) +#define MMU_ITWD_ADDR_OFFSET ((uint32_t) 0x00000270U) +#define MMU_WERRDEBUG_MID_OFFSET (REG_BIT8_OFFSET) + +/** MMU Function **/ +void MMU_ConfigReset(FunctionalState Cmd); +void MMU_ConfigInt(FunctionalState Cmd); +FlagStatus MMU_GetFlagStatus(uint32_t MMU_FLAG); +void MMU_ClrFlag(uint32_t MMU_FLAG); +void MMU_EnableRTAD(uint32_t RTADx, FunctionalState Cmd); +uint32_t MMU_GetRTADRegionKey(uint32_t region); +void MMU_ConfigRTADCFGLock(uint32_t RTADx, FunctionalState Cmd); +void MMU_ConfigRTADKeyLock(uint32_t RTADx, FunctionalState Cmd); +void MMU_ConfigRTADMode(uint32_t RTADx, uint32_t mode); +void MMU_ConfigRTADProperty(uint32_t RTADx, uint32_t property); +void MMU_ConfigRTADRegionAddress(uint32_t region, uint32_t begin_addr, uint32_t end_addr); +uint32_t MMU_GetRTADCRC(void); +void MMU_EnableModuleMemory(uint32_t module, FunctionalState Cmd); +uint8_t MMU_GetModuleUserID(uint32_t module); +uint8_t MMU_GetModuleMasterID(uint32_t module); +uint32_t MMU_GetReadErrorAddress(uint32_t readerroraddr); +uint32_t MMU_GetWriteErrorAddress(uint32_t writeerroraddr); +uint32_t MMU_GetWriteErrorMasterID(uint32_t writeerrordebug); +uint32_t MMU_GetWriteErrorUserID(uint32_t writeerrordebug); +uint32_t MMU_GetReadErrorMasterID(uint32_t readerrordebug); +uint32_t MMU_GetReadErrorUserID(uint32_t readerrordebug); + + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_78X_MMU_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_otpc.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_otpc.h new file mode 100644 index 0000000000..bdcea155bd --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_otpc.h @@ -0,0 +1,171 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_otpc.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_OTPC_H__ +#define __N32H76X_78X_OTPC_H__ + +#include "n32h76x_78x.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** OTPC status**/ +typedef enum +{ + OTPC_UNCOMPLETE = 1, + OTPC_ERR_TIMEOUT, + OTPC_COMPLETE, +}OTPC_STS; + +/** OTPC reload data structure definition **/ +typedef struct +{ + uint32_t NRST_IWDG_OTPValue; /* Corresponding to the value of SYS_CFG_CRST_SWDG_OTP in OTP */ + uint32_t BOR_OTPValue; /* Corresponding to the value of BOR in OTP */ + uint32_t SEC_JTAG_OTPValue; /* Corresponding to the value of SEC_JTAG in OTP */ + FlagStatus L2MODE; /* Chip L2 mode*/ + FlagStatus L1MODE; /* Chip L2 mode*/ + FlagStatus L0MODE; /* Chip L2 mode*/ + FlagStatus ROOTMODE; /* Chip ROOT mode*/ + FlagStatus INITMODE; /* Chip INIT mode*/ + uint32_t TCM_SIZE_OTPValue; /* Corresponding to the value of TCM_SIZE in OTP */ +} OTPC_DBGReloadValue; + + +/** OTPC Keys **/ +#define OTPC_KEY1 ((uint32_t)0x45670123U) +#define OTPC_KEY2 ((uint32_t)0xCDEF89ABU) + +/** OTPC Operation **/ +#define OTPC_CMD_WRITE (OTPC_CTRL_PRMD) +#define OTPC_CMD_READ (~OTPC_CTRL_PRMD) +#define OTPC_CMD_LOCK (OTPC_CTRL_LOCK) + +/** OTPC us Counter Mask**/ +#define OTPC_USC_MASK (OTPC_USC_VAL) + +/** OTPC Flags **/ +#define OTPC_FLAG_BE ((uint32_t)OTPC_STS_BE ) /* Bit[6] */ +#define OTPC_FLAG_OORE ((uint32_t)OTPC_STS_OORE) /* Bit[5] */ +#define OTPC_FLAG_RDPE ((uint32_t)OTPC_STS_RDPE) /* Bit[4] */ +#define OTPC_FLAG_WRPE ((uint32_t)OTPC_STS_WRPE) /* Bit[3] */ +#define OTPC_FLAG_PGE ((uint32_t)OTPC_STS_PGE ) /* Bit[2] */ +#define OTPC_FLAG_KEYE ((uint32_t)OTPC_STS_KEYE) /* Bit[1] */ +#define OTPC_FLAG_BUSY ((uint32_t)OTPC_STS_BUSY) /* Bit[0] */ +#define OTPC_ERROR_STS (OTPC_FLAG_BE | OTPC_FLAG_OORE | OTPC_FLAG_RDPE | OTPC_FLAG_WRPE | OTPC_FLAG_PGE) +#define OTPC_ALLERROR_STS (OTPC_FLAG_BE | OTPC_FLAG_OORE | OTPC_FLAG_RDPE | OTPC_FLAG_WRPE | OTPC_FLAG_PGE | OTPC_FLAG_KEYE) + +/** OTPC Interrupt **/ +#define OTPC_INT_BE ((uint32_t)OTPC_CTRL_BEEN) /* Bit[6] */ +#define OTPC_INT_OORE ((uint32_t)OTPC_CTRL_OOREEN) /* Bit[5] */ +#define OTPC_INT_RDPE ((uint32_t)OTPC_CTRL_RDPEEN) /* Bit[4] */ +#define OTPC_INT_WRPE ((uint32_t)OTPC_CTRL_WRPEEN) /* Bit[3] */ +#define OTPC_INT_PGE ((uint32_t)OTPC_CTRL_PGEEN) /* Bit[2] */ + +/** User config register Offset Address **/ +#define OTPC_VARIOUS_REG_MASK ((uint32_t)0x0000FFFFU) +#define OTPC_SEC_JTAG_REG ((uint32_t)0x00000020U) +#define OTPC_SEC_MODE_REG ((uint32_t)0x00000028U) +#define OTPC_RDP2_REG ((uint32_t)0x00000030U) +#define OTPC_BTM_REG ((uint32_t)0x00000038U) +#define OTPC_BOR_REG ((uint32_t)0x0000003CU) +#define OTPC_IWDG_REG ((uint32_t)0x00000040U) +#define OTPC_TCM_SIZE_REG ((uint32_t)0x00000044U) +#define OTPC_JTAG_KEY_REG ((uint32_t)0x00000050U) +#define OTPC_REK_UNIT1_REG ((uint32_t)0x00000054U) +#define OTPC_REK_UNIT2_REG ((uint32_t)0x00000058U) +#define OTPC_REK_UNIT3_REG ((uint32_t)0x0000005CU) +#define OTPC_REK_UNIT4_REG ((uint32_t)0x00000060U) +#define OTPC_IDK_UNIT1_REG ((uint32_t)0x00000064U) +#define OTPC_IDK_UNIT2_REG ((uint32_t)0x00000068U) +#define OTPC_IDK_UNIT3_REG ((uint32_t)0x0000006CU) +#define OTPC_IDK_UNIT4_REG ((uint32_t)0x00000070U) +#define OTPC_UMUU_BASE_REG ((uint32_t)0x00000074U) + +/** OTPC CRLD1 register bit offset define **/ +#define OTPC_CRLD1_NRIWDG_OFFSET (REG_BIT16_OFFSET) /* NRST IWDG OTP Value */ +#define OTPC_CRLD1_BOR_OFFSET (REG_BIT12_OFFSET) /* BOR OTP Value */ + +#define OTPC_TIME_OUT ((uint32_t)0xffffffffU) /* timeout */ + +/* OTPC User unuse memory */ +#define OTPC_UNUSE_STARTADDRESS ((uint32_t)0x00000500U) /* OTPC User unuse memory start address */ +#define OTPC_UNUSE_PAGESIZE ((uint32_t)0x00000020U) /* OTPC User unuse memory page size */ + +/** OTPC Function **/ +void OTPC_Unlock(void); +void OTPC_Lock(void); +FlagStatus OTPC_GetLockStatus(void); +void OTPC_SetUsCount(uint32_t us_count); +FlagStatus OTPC_GetFlagStatus(uint32_t optc_flag); +void OTPC_ClearFlag(uint32_t optc_flag); +FlagStatus OTPC_CheckError(void); +OTPC_STS OTPC_WaitForLastOperation(void); +void OTPC_ConfigInterrupt(uint32_t otpc_int, FunctionalState cmd); +void OTPC_WriteEnable(void); +void OTPC_ReadEnable(void); +void OTPC_SetAddr(uint32_t addr); +void OTPC_SetWriteData(uint32_t data); +OTPC_STS OTPC_ProgramWord(uint32_t addr, uint32_t data); +OTPC_STS OTPC_ReadWord(uint32_t addr, uint32_t *data); +uint32_t OTPC_GetUserCfgVaildNum(uint32_t ConfigUser); +FlagStatus OTPC_CheckUserMemoryUnused(uint32_t addr); +void OTPC_GetReload(OTPC_DBGReloadValue* DBGReloadValue); + + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_78X_OTPC_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_pwr.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_pwr.h new file mode 100644 index 0000000000..c661c7c7f5 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_pwr.h @@ -0,0 +1,425 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_pwr.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_PWR_H__ +#define __N32H76X_78X_PWR_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "n32h76x_78x.h" + + +/** PWR sleep status enmu definition **/ +typedef enum +{ + PWR_SLEEP_NOW = 0x0, + PWR_SLEEP_ON_EXIT = 0x1, +} PWR_SLEEPONEXIT_STATUS; + +/** PWR registers bit mask **/ +/** PWR system status enmu definition **/ +typedef enum +{ + PWR_SYSTEM_RUN = 0x0, + PWR_SYSTEM_STOP0 = 0x1, + PWR_SYSTEM_STOP2 = 0x2, +} SYSTEM_OPTC_STATUS; +/** PWR system memory enmu definition **/ +typedef enum +{ + SYSTEM_MEMORY_AXISRAM = 0x0, + SYSTEM_MEMORY_AHBSRAM1 = 0x1, + SYSTEM_MEMORY_AHBSRAM2 = 0x2, + SYSTEM_MEMORY_AHBSRAM3 = 0x3, + SYSTEM_MEMORY_AHBSRAM4 = 0x4, + SYSTEM_MEMORY_AHBSRAM5S1 = 0x5, + SYSTEM_MEMORY_AHBSRAM5S2 = 0x6, +} SYSTEM_MEMORY_TYPE; +/** PWR VDDD POR/PDR mode enmu definition **/ +typedef enum +{ + SYSTEM_RUN_MODE = 0x0, + SYSTEM_LOW_POWER_MODE = 0x1, +} SYSTEM_POWER_TYPE; + +/** register bit mask **/ +#define PWR_REG_BIT_MASK ((uint32_t)0x00000000U) + +/** POR BOR DCDC VSEL Control Register **/ +#define PVD_ContrlBaseAddress (AFEC_BASE + 0x2CU) +#define AVD_ContrlBaseAddress (AFEC_BASE + 0x00U) +#define DCDC_ContrlBaseAddress (AFEC_BASE + 0x30U) +/** POR BOR DCDC VSEL bit mask **/ +#define BOR_VSEL_BIT_MASK ((uint32_t)0x03E00000U) +#define POR_VSEL_BIT_MASK ((uint32_t)0x001F0000U) + +#define DCDC_VSEL_MASK ((uint32_t)0x00001F00U) +#define DCDC_VSEL_POR_MASK ((uint32_t)0x001F0000U) +#define DCDC_VSEL_BOR_MASK ((uint32_t)0x03E00000U) + + +/** CM7/CM4 low power config **/ +#define PWR_PDSLPS_MASK (~(PWR_CTRL_LPS | PWR_CTRL_PDS)) +#define PWR_PDS_SET (PWR_CTRL_PDS) +#define PWR_REGULATOR_NORMAL (PWR_REG_BIT_MASK) +#define PWR_REGULATOR_LOWPOWER (PWR_CTRL_LPS) + +/** PWR_ENABLE **/ +#define PWR_STBRET_ENABLE (PWR_M7CTRL2_BSRSTBRET) +#define PWR_VBATRET_ENABLE (PWR_M7CTRL2_BSRVBRET) + +/** PVD level config **/ +#define PWR_PVD_LEVEL_MASK ((uint32_t)0x001E0000U) +#define PWR_PVD_LEVEL_2V28 ((uint32_t)0x000A0000U) +#define PWR_PVD_LEVEL_2V38 ((uint32_t)0x000C0000U) +#define PWR_PVD_LEVEL_2V48 ((uint32_t)0x000E0000U) +#define PWR_PVD_LEVEL_2V58 ((uint32_t)0x00100000U) +#define PWR_PVD_LEVEL_2V68 ((uint32_t)0x00120000U) +#define PWR_PVD_LEVEL_2V78 ((uint32_t)0x00140000U) +#define PWR_PVD_LEVEL_2V88 ((uint32_t)0x00160000U) +#define PWR_PVD_LEVEL_3V28 ((uint32_t)0x00180000U) +#define PWR_PVD_LEVEL_3V38 ((uint32_t)0x001A0000U) +#define PWR_PVD_LEVEL_3V48 ((uint32_t)0x001C0000U) +#define PWR_PVD_LEVEL_3V58 ((uint32_t)0x001E0000U) +/** AVD level config **/ +#define PWR_AVD_LEVEL_MASK ((uint32_t)0x0000F000U) +#define PWR_AVD_LEVEL_2V28 ((uint32_t)0x00005000U) +#define PWR_AVD_LEVEL_2V38 ((uint32_t)0x00006000U) +#define PWR_AVD_LEVEL_2V48 ((uint32_t)0x00007000U) +#define PWR_AVD_LEVEL_2V58 ((uint32_t)0x00008000U) +#define PWR_AVD_LEVEL_2V68 ((uint32_t)0x00009000U) +#define PWR_AVD_LEVEL_2V78 ((uint32_t)0x0000A000U) +#define PWR_AVD_LEVEL_2V88 ((uint32_t)0x0000B000U) +#define PWR_AVD_LEVEL_3V28 ((uint32_t)0x0000C000U) +#define PWR_AVD_LEVEL_3V38 ((uint32_t)0x0000D000U) +#define PWR_AVD_LEVEL_3V48 ((uint32_t)0x0000E000U) +#define PWR_AVD_LEVEL_3V58 ((uint32_t)0x0000F000U) + +/**VDDD POR PDR level config **/ +#define PWR_VDDD_POR_Level_MASK ((uint32_t)0x00000003U) +#define PWR_VDDD_POR_Level_0V70 ((uint32_t)0x00000000U) +#define PWR_VDDD_POR_Level_0V75 ((uint32_t)0x00000002U) +#define PWR_VDDD_POR_Level_0V80 ((uint32_t)0x00000003U) +/**VDDD POR PDR bit offset **/ +#define PWR_VDDD_POR_LEVEL_OFFSET ((uint32_t)0x0000000CU) +#define PWR_VDDD_LPPOR_LEVEL_OFFSET ((uint32_t)0x00000016U) + +/** DCDC POR PDR level config **/ +#define PWR_DCDC_POR_Level_MASK ((uint32_t)0x0000001FU) +#define PWR_DCDC_POR_Level_0V80 ((uint32_t)0x00000005U) +#define PWR_DCDC_POR_Level_0V85 ((uint32_t)0x00000006U) +#define PWR_DCDC_POR_Level_0V90 ((uint32_t)0x00000007U) +/**DCDC POR PDR bit offset **/ +#define PWR_DCDC_POR_LEVEL_OFFSET ((uint32_t)0x00000010U) +#define PWR_DCDC_LPPOR_LEVEL_OFFSET ((uint32_t)0x00000011U) + +/** Main LDO Output Voltage config **/ +#define PWR_MLDO_VOLTAGE_OUTPUT_LEVEL_MASK ((uint32_t)0x00000003U) +#define PWR_MLDO_VOLTAGE_OUTPUT_LEVEL_0V80 ((uint32_t)0x00000000U) +#define PWR_MLDO_VOLTAGE_OUTPUT_LEVEL_0V85 ((uint32_t)0x00000001U) +#define PWR_MLDO_VOLTAGE_OUTPUT_LEVEL_0V90 ((uint32_t)0x00000002U) +/**Main LDO Output Voltage bit offset **/ +#define PWR_MLDO_VOLT_OUTPUT_LEVEL_OFFSET ((uint32_t)0x00000008U) +#define PWR_MLDO_LP_VOLT_OUTPUT_LEVEL_OFFSET ((uint32_t)0x0000000AU) + +/** DCDC Output Voltage config **/ +#define PWR_DCDC_VOLTAGE_OUTPUT_LEVEL_MASK ((uint32_t)0x0000000FU) +#define PWR_DCDC_VOLTAGE_OUTPUT_LEVEL_0V80 ((uint32_t)0x00000005U) +#define PWR_DCDC_VOLTAGE_OUTPUT_LEVEL_0V85 ((uint32_t)0x00000006U) +#define PWR_DCDC_VOLTAGE_OUTPUT_LEVEL_0V90 ((uint32_t)0x00000007U) +/**DCDC Output Voltage bit offset **/ +#define PWR_DCDC_VOLT_OUTPUT_LEVEL_OFFSET ((uint32_t)0x00000008U) +#define PWR_DCDC_LP_VOLT_OUTPUT_LEVEL_OFFSET ((uint32_t)0x00000018U) + +/** BKPLDO Output Voltage config **/ +#define PWR_BKPLDO_VOLTAGE_OUTPUT_LEVEL_MASK ((uint32_t)0x00000001U) +#define PWR_BKPLDO_VOLTAGE_OUTPUT_LEVEL_0V80 ((uint32_t)0x00000001U) +#define PWR_BKPLDO_VOLTAGE_OUTPUT_LEVEL_0V90 ((uint32_t)0x00000000U) +/**BKPLDO Output Voltage bit offset **/ +#define PWR_BKPLDO_VOLT_OUTPUT_LEVEL_OFFSET ((uint32_t)0x0000000FU) +#define PWR_BKPLDO_LP_VOLT_OUTPUT_LEVEL_OFFSET ((uint32_t)0x00000010U) + +/**MR Output Voltage Enable bit **/ +#define PWR_MR_LPVSELEN (PWR_SYSCTRL4_MR_LPVSELEN) + +/** Sleep_mode_entry **/ +#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01U) +#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02U) + +/** STOP_mode_entry **/ +#define PWR_STOPENTRY_WFI ((uint8_t)0x01U) +#define PWR_STOPENTRY_WFE ((uint8_t)0x02U) + +/** STANDBY_mode_entry **/ +#define PWR_STANDBYEntry_WFI ((uint8_t)0x01U) +#define PWR_STANDBYEntry_WFE ((uint8_t)0x02U) + + +/** Stop2 enable **/ +#define PWR_STOP2EN (PWR_M7CTRL2_STOP2EN) +#define PWR_PDSEN (PWR_M7CTRL1_PDS) + +/** wakeup pin enable **/ +#define WAKEUP_PIN0EN (PWR_M7CTRLSTS_WKUP0EN) +#define WAKEUP_PIN1EN (PWR_M7CTRLSTS_WKUP1EN) +#define WAKEUP_PIN2EN (PWR_M7CTRLSTS_WKUP2EN) +#define WAKEUP_PIN3EN (PWR_M7CTRLSTS_WKUP3EN) +#define WAKEUP_PIN4EN (PWR_M7CTRLSTS_WKUP4EN) +#define WAKEUP_PIN5EN (PWR_M7CTRLSTS_WKUP5EN) + +#define WAKEUP_RTCEN (PWR_M7CTRL2_RTC_ALMWUPEN) +#define WAKEUP_NRSTEN (PWR_M7CTRL2_NRST_WUPEN) + +/** wakeup pin polarity config **/ +#define WAKEUP_PIN0POL (PWR_M7CTRLSTS_WKUP0POL) +#define WAKEUP_PIN1POL (PWR_M7CTRLSTS_WKUP1POL) +#define WAKEUP_PIN2POL (PWR_M7CTRLSTS_WKUP2POL) +#define WAKEUP_PIN3POL (PWR_M7CTRLSTS_WKUP3POL) +#define WAKEUP_PIN4POL (PWR_M7CTRLSTS_WKUP4POL) +#define WAKEUP_PIN5POL (PWR_M7CTRLSTS_WKUP5POL) + +/** PWR_Flag **/ +#define PWR_FLAG_WKUP0 (PWR_M7CTRLSTS_WKUP0F) +#define PWR_FLAG_WKUP1 (PWR_M7CTRLSTS_WKUP1F) +#define PWR_FLAG_WKUP2 (PWR_M7CTRLSTS_WKUP2F) +#define PWR_FLAG_WKUP3 (PWR_M7CTRLSTS_WKUP3F) +#define PWR_FLAG_WKUP4 (PWR_M7CTRLSTS_WKUP4F) +#define PWR_FLAG_WKUP5 (PWR_M7CTRLSTS_WKUP5F) +#define PWR_FLAG_WKUPP (PWR_M7CTRLSTS_WKUP6F) +#define PWR_FLAG_STANDBY (PWR_M7CTRLSTS_SBF) +#define PWR_FLAG_VBAT (PWR_M7CTRLSTS_VBATF) + +/** PWR_Flag clear **/ +#define PWR_CLR_WKUPx (PWR_M7CTRL1_CWKUPF) +#define PWR_CLR_STANDBY (PWR_M7CTRL1_CSBF) +#define PWR_CLR_VBAT (PWR_M7CTRL1_CVBATF) + + +/** PWR_system control 1 **/ +#define PWR_PVDEN (PWR_SYSCTRL1_PVDEN) +#define PWR_AVDEN (PWR_SYSCTRL1_AVDEN) +#define PWR_DBKPEN (PWR_SYSCTRL1_DBKP) +#define PWR_BKPLDOEN (PWR_SYSCTRL1_BKPLDOEN) + +/** NRST_Digital Filtering **/ +#define PWR_NRST_DGF_CNT_MASK (PWR_SYSCTRL1_NRST_DGFCNT) +#define PWR_NRST_DGF_BP (PWR_SYSCTRL1_NRST_DGFBP) + +#define PWR_NRST_DGF_CNT_BIT_OFFSET (16U) +/** PWR_SystemFlag **/ +#define PWR_SYSFLAG_PVDO (PWR_SYSCTRLSTS_PVDO) +#define PWR_SYSFLAG_AVDO (PWR_SYSCTRLSTS_AVDO) +#define PWR_SYSFLAG_OTPRDY (PWR_SYSCTRLSTS_OTP_PWRRDY) +#define PWR_FLAG_DCDCBP (PWR_SYSCTRLSTS_DCDC_BPF) + +/** PWR_system control 2 **/ +#define PWR_MROFF_IN_STANDBY (PWR_SYSCTRL2_MR_STBOFFEN) + +/** Module PWR Enable **/ +#define GRAPHIC_GPU_PWRCTRL (PWR_IPMEMCTRL_GPU_PWREN) +#define GRAPHIC_LCDC_PWRCTRL (PWR_IPMEMCTRL_LCDC_PWREN) +#define GRAPHIC_JPEG_PWRCTRL (PWR_IPMEMCTRL_JPEG_PWREN) +#define GRAPHIC_DSI_PWRCTRL (PWR_IPMEMCTRL_DSI_PWREN) +#define GRAPHIC_DVP_PWRCTRL (PWR_IPMEMCTRL_DVP_PWREN) +#define HSC2_ETH2_PWRCTRL (PWR_IPMEMCTRL_ETH2_PWREN) +#define HSC2_USB2_PWRCTRL (PWR_IPMEMCTRL_USB2_PWREN) +#define HSC2_SDMMC2_PWRCTRL (PWR_IPMEMCTRL_SDMMC2_PWREN) +#define HSC1_ETH1_PWRCTRL (PWR_IPMEMCTRL_ETH1_PWREN) +#define HSC1_USB1_PWRCTRL (PWR_IPMEMCTRL_USB1_PWREN) +#define HSC1_SDMMC1_PWRCTRL (PWR_IPMEMCTRL_SDMMC1_PWREN) +#define FMAC_PWRCTRL (PWR_IPMEMCTRL_FMAC_PWREN) +#define ESC_PWRCTRL (PWR_IPMEMCTRL_ESC_PWREN) + +/** PWR Ready flag **/ +#define FMAC_PWRRDY_FLAG (PWR_IPMEMCTRLSTS_FMAC_PWRRDY) +#define ESC_PWRRDY_FLAG (PWR_IPMEMCTRLSTS_ESC_PWRRDY) + +/** MDMA PWR control **/ +#define MDMA_POWER_ENABLE (PWR_MDMACTRL_MDMA_PWREN) +#define MDMA_FUNCTION_ENABLE (PWR_MDMACTRL_MDMA_FUCEN) +#define MDMA_ISOLATION_ENABLE (PWR_MDMACTRL_MDMA_ISNEN) +#define MDMA_POWER_RDY (PWR_MDMACTRL_MDMA_PRDY) +#define MDMA_PSWACK1 (PWR_MDMACTRL_MDMA_PSWACK1) + +/** ESC PWR control **/ +#define ESC_POWER_ENABLE (PWR_ESCCTRL_ESC_PWREN) +#define ESC_FUNCTION_ENABLE (PWR_ESCCTRL_ESC_FUCEN) +#define ESC_ISOLATION_ENABLE (PWR_ESCCTRL_ESC_ISNEN) +#define ESC_POWER_RDY (PWR_ESCCTRL_ESC_PRDY) +#define ESC_PSWACK1 (PWR_ESCCTRL_ESC_PSWACK1) + +/** SHRTIM PWR control **/ +#define SHRTIM1_POWER_ENABLE (PWR_SHRTIMCTRL_SHR1_PWREN) +#define SHRTIM1_FUNCTION_ENABLE (PWR_SHRTIMCTRL_SHR1_FUCEN) +#define SHRTIM1_ISOLATION_ENABLE (PWR_SHRTIMCTRL_SHR1_ISNEN) +#define SHRTIM1_POWER_RDY (PWR_SHRTIMCTRL_SHR1_PRDY) +#define SHRTIM1_PSWACK1 (PWR_SHRTIMCTRL_SHR1_PSWACK1) + +#define SHRTIM2_POWER_ENABLE (PWR_SHRTIMCTRL_SHR2_PWREN) +#define SHRTIM2_FUNCTION_ENABLE (PWR_SHRTIMCTRL_SHR2_FUCEN) +#define SHRTIM2_ISOLATION_ENABLE (PWR_SHRTIMCTRL_SHR2_ISNEN) +#define SHRTIM2_POWER_RDY (PWR_SHRTIMCTRL_SHR2_PRDY) +#define SHRTIM2_PSWACK1 (PWR_SHRTIMCTRL_SHR2_PSWACK1) + +#define SHRTIMA_POWER_ENABLE (PWR_SHRTIMCTRL_SHRA_PWREN) +#define SHRTIMA_FUNCTION_ENABLE (PWR_SHRTIMCTRL_SHRA_FUCEN) +#define SHRTIMA_ISOLATION_ENABLE (PWR_SHRTIMCTRL_SHRA_ISNEN) +#define SHRTIMA_POWER_RDY (PWR_SHRTIMCTRL_SHRA_PRDY) +#define SHRTIMA_PSWACK1 (PWR_SHRTIMCTRL_SHRA_PSWACK1) + +/** OPTC_POWER control **/ +#define OPTC_POWER_ENTER_MODE_MASK (0x000000003U) +#define OPTC_POWER_ENTER_RUN_MODE (0x000000000U) +#define OPTC_POWER_ENTER_DEEPSTANDBY_MODE (0x000000001U) +#define OPTC_POWER_ENTER_STANDBY_MODE (0x000000002U) + + + +/** SYSTEM MEMORY Low Power mode in Stop2 mode **/ +#define SYSTEM_MEMORY_STATUS_MASK (0x000000003U) +#define SYSTEM_MEMORY_STATUS_PD (0x000000000U) +#define SYSTEM_MEMORY_STATUS_RETENTION_1 (0x000000001U) +#define SYSTEM_MEMORY_STATUS_RETENTION_2 (0x000000002U) + +#define SYSTEM_MEMORY_AXISRAM_BITOFFSET (0x00000000DU) + +/** ALL SYSTEM MEMORY Low Power mode in Stop0 mode **/ +#define ALL_SYSTEM_MEMORY_STATUS_MASK (PWR_SYSMEMLPCTRL_MEM_PGSTP0EN | PWR_SYSMEMLPCTRL_MEM_RETSTP0EN) +#define ALL_SYSTEM_MEMORY_STATUS_CHIP_DISABLE (0x000000000U) +#define ALL_SYSTEM_MEMORY_STATUS_PRECHARGE (PWR_SYSMEMLPCTRL_MEM_RETSTP0EN) +#define ALL_SYSTEM_MEMORY_STATUS_RETENTION_1 (PWR_SYSMEMLPCTRL_MEM_PGSTP0EN | PWR_SYSMEMLPCTRL_MEM_RETSTP0EN) + + + +typedef enum{ + GRAPHIC_Domain = 0, + HSC1_Domain = 1, + HSC2_Domain = 2 +}DOMAIN_Type; + +typedef enum{ + Power_SHRTIM1 = 0, + Power_SHRTIM2 = 1, +}SHRTIM_PowerType; + +/** PWR wakeup PIN polarity enmu definition **/ +typedef enum +{ + POL_HIGH = 0x0, + POL_LOW = 0x1, +} WAKEUP_PIN_POL; + + + +/** PWR_Exported_Functions **/ + +void PWR_DeInit_Sys(void); +void PWR_DeInit_CM7(void); +void PWR_DeInit_CM4(void); + +void PWR_BackupAccessEnable(FunctionalState Cmd); +void PWR_AvdEnable(FunctionalState Cmd); +void PWR_PvdEnable(FunctionalState Cmd); +void PWR_BorEnable(FunctionalState Cmd); +void PWR_PVDLevelConfig(uint32_t level); +void PWR_AVDLevelConfig(uint32_t level); +void PWR_EnableMRInStandby(FunctionalState Cmd); +void PWR_EnableBKPLDO(FunctionalState Cmd); + +void PWR_ConfigDigitalFilterOnNRST(uint32_t cycle_cnt, FunctionalState Cmd); + +void PWR_EnableLPMRVoltageOutput(FunctionalState Cmd); +void PWR_VDDDPORLevelConfig(SYSTEM_POWER_TYPE mode, uint32_t level); +void PWR_DCDCPORLevelConfig(SYSTEM_POWER_TYPE mode, uint32_t level); + +void PWR_MLDOOutputVoltageConfig(SYSTEM_POWER_TYPE mode, uint32_t level); +void PWR_DCDCOutputVoltageConfig(SYSTEM_POWER_TYPE mode, uint32_t level); +void PWR_BKPLDOOutputVoltageConfig(SYSTEM_POWER_TYPE mode, uint32_t level); + +void PWR_MDMA_DomainEnable(FunctionalState Cmd); +void PWR_SHRTIM_DomainEnable(SHRTIM_PowerType shrtimx, FunctionalState Cmd); +void PWR_MoudlePowerEnable(uint32_t module, FunctionalState Cmd); + +void PWR_EnableBKPSRAMRetainInStandbyMode(FunctionalState Cmd); +void PWR_EnableBKPSRAMRetainInVbatMode(FunctionalState Cmd); +void PWR_WakeUpPinEnable(uint32_t pin, FunctionalState Cmd); +void PWR_WakeUpPinPolarity(uint32_t pin, WAKEUP_PIN_POL polarity); +void PWR_WakeUpRTCEnable(FunctionalState Cmd); +void PWR_WakeUpNRSTEnable(FunctionalState Cmd); + +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); +FlagStatus PWR_GetSystemFlagStatus(uint32_t PWR_FLAG); +void PWR_ClearFlag(uint32_t PWR_FLAG); + +void PWR_EnterSLEEPMode(uint8_t SLEEPONEXIT, uint8_t PWR_SLEEPEntry); +void PWR_EnterSTOP0Mode(uint8_t PWR_STOPEntry); +void PWR_EnterSTOP2Mode(uint8_t PWR_STOPEntry); +void PWR_EnterSTANDBYMode(void); + +void PWR_EnableOPTC_LPMode(SYSTEM_OPTC_STATUS ChipStatus, uint32_t OPTC_Mode, FunctionalState Cmd); +void PWR_EnableTCMPiece(uint32_t PieceIndex, FunctionalState Cmd); +void PWR_TCMModeSelInSTOP2(uint32_t PieceIndex, uint32_t Mode); + +void PWR_SystemMemoryModeSelInSTOP2(SYSTEM_MEMORY_TYPE SysMemoryType, uint32_t Mode); +void PWR_SystemMemoryModeSelInSTOP0(uint32_t Mode); +void PWR_EnableSystemMemory(SYSTEM_MEMORY_TYPE SysMemoryType, FunctionalState Cmd); + +#ifdef __cplusplus +} +#endif + +#endif //__N32H76X_78X_PWR_H__ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_rcc.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_rcc.h new file mode 100644 index 0000000000..fc0e93a579 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_rcc.h @@ -0,0 +1,2542 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_rcc.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_RCC_H +#define __N32H76X_78X_RCC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes */ +#include "n32h76x_78x.h" + +/** RCC_Exported_Types **/ +typedef struct +{ + uint32_t PLL1AClkFreq; /* returns PLL1A clock frequency expressed in Hz */ + uint32_t PLL1BClkFreq; /* returns PLL1B clock frequency expressed in Hz */ + uint32_t PLL1CClkFreq; /* returns PLL1C clock frequency expressed in Hz */ + uint32_t PLL2AClkFreq; /* returns PLL2A clock frequency expressed in Hz */ + uint32_t PLL2BClkFreq; /* returns PLL2B clock frequency expressed in Hz */ + uint32_t PLL2CClkFreq; /* returns PLL2C clock frequency expressed in Hz */ + uint32_t PLL3AClkFreq; /* returns PLL3A clock frequency expressed in Hz */ + uint32_t PLL3BClkFreq; /* returns PLL3B clock frequency expressed in Hz */ + uint32_t PLL3CClkFreq; /* returns PLL3C clock frequency expressed in Hz */ + uint32_t SysClkFreq; /* returns SysClk clock frequency expressed in Hz */ + uint32_t SysBusDivClkFreq; /* returns SysBusDivClk clock frequency expressed in Hz */ + uint32_t M4ClkFreq; /* returns M4 clock frequency expressed in Hz */ + uint32_t M7ClkFreq; /* returns M7 clock frequency expressed in Hz */ + uint32_t AXIClkFreq; /* returns AXI clock frequency expressed in Hz */ + uint32_t AHB1ClkFreq; /* returns AHB1 clock frequency expressed in Hz */ + uint32_t AHB2ClkFreq; /* returns AHB2 clock frequency expressed in Hz */ + uint32_t AHB5ClkFreq; /* returns AHB5 clock frequency expressed in Hz */ + uint32_t AHB6ClkFreq; /* returns AHB6 clock frequency expressed in Hz */ + uint32_t AHB9ClkFreq; /* returns AHB9 clock frequency expressed in Hz */ + uint32_t APB1ClkFreq; /* returns APB1 clock frequency expressed in Hz */ + uint32_t APB2ClkFreq; /* returns APB2 clock frequency expressed in Hz */ + uint32_t APB5ClkFreq; /* returns APB5 clock frequency expressed in Hz */ + uint32_t APB6ClkFreq; /* returns APB6 clock frequency expressed in Hz */ + uint32_t PeriphClkFreq; /* returns Periph clock frequency expressed in Hz */ + +}RCC_ClocksTypeDef; + +#define VCO_MIN 300000000 //300M +#define VCO_MAX 1250000000//1.25G +#define REF_MIN 1000000 //1M +#define REF_MAX 64000000 //64M +#define NR_MIN 1 +#define NR_MAX 64 +#define NF_MIN 2 +#define NF_MAX 4095 + +/** RCC R_BIT_MASK **/ +#define RCC_REG_BIT_MASK ((uint32_t)0x00000000) + +/** RCC_Flag **/ +#define RCC_FLAG_MASK ((uint8_t)0x1F) +#define RCC_FLAG_OFFSET ((uint8_t)0x05) +//SRCCTRL1=1 +#define RCC_FLAG_HSIRD ((uint8_t)0x21) +#define RCC_FLAG_HSERD ((uint8_t)0x23) +#define RCC_FLAG_MSIRD ((uint8_t)0x27) +#define RCC_FLAG_AFEHSIRD ((uint8_t)0x3E) +#define RCC_FLAG_AFEMSIRD ((uint8_t)0x3F) +//SRCCTRL2=2 +#define RCC_FLAG_MSICALE ((uint8_t)0x5C) +#define RCC_FLAG_HSICALE ((uint8_t)0x5D) +#define RCC_FLAG_BOR ((uint8_t)0x5E) +//BDCTRL=3 +#define RCC_FLAG_LSIRD ((uint8_t)0x61) +#define RCC_FLAG_LSERD ((uint8_t)0x65) +#define RCC_FLAG_LSECSS ((uint8_t)0x69) +#define RCC_FLAG_LSISECRD ((uint8_t)0x73) +#define RCC_FLAG_RTCHSFSW ((uint8_t)0x74) +#define RCC_FLAG_RTCLSFSW ((uint8_t)0x75) +#define RCC_FLAG_LSIPF ((uint8_t)0x79) +#define RCC_FLAG_AFELSIRD ((uint8_t)0x7E) +#define RCC_FLAG_AFELSERD ((uint8_t)0x7F) +//CTRLSTS=4 +#define RCC_FLAG_PINRST ((uint8_t)0x80) +#define RCC_FLAG_PORRST ((uint8_t)0x81) +#define RCC_FLAG_CM7SFTRST ((uint8_t)0x82) +#define RCC_FLAG_CM4SFTRST ((uint8_t)0x83) +#define RCC_FLAG_IWDG2RST ((uint8_t)0x84) +#define RCC_FLAG_IWDG1RST ((uint8_t)0x85) +#define RCC_FLAG_WWDG2RST ((uint8_t)0x86) +#define RCC_FLAG_WWDG1RST ((uint8_t)0x87) +#define RCC_FLAG_MMURST ((uint8_t)0x89) +#define RCC_FLAG_BORRST ((uint8_t)0x8B) +#define RCC_FLAG_BKPEMCRST ((uint8_t)0x8C) +#define RCC_FLAG_RETEMCRST ((uint8_t)0x8D) +#define RCC_FLAG_C2LPRST ((uint8_t)0x8E) +#define RCC_FLAG_C1LPRST ((uint8_t)0x8F) +//PLLFD=5 +#define RCC_FLAG_SHRPLLG ((uint8_t)0xAB) +#define RCC_FLAG_PLL3G ((uint8_t)0xAA) +#define RCC_FLAG_PLL2G ((uint8_t)0xA9) +#define RCC_FLAG_PLL1G ((uint8_t)0xA8) +#define RCC_FLAG_SHRPLLF ((uint8_t)0xA7) +#define RCC_FLAG_PLL3F ((uint8_t)0xA6) +#define RCC_FLAG_PLL2F ((uint8_t)0xA5) +#define RCC_FLAG_PLL1F ((uint8_t)0xA4) + + +#define RCC_REMOVE_RESET_FLAG (RCC_CTRLSTS_RMRSTF) +#define RCC_RSTEN_M4REL (RCC_M4RSTREL_EN) + +/** AHB1 peripherals reset **/ +#define RCC_AHB1_PERIPHRST_SDMMC2 (RCC_AHB1RST1_SDMMC2RST) +#define RCC_AHB1_PERIPHRST_SDHOST2 (RCC_AHB1RST1_SDHOST2RST ) +#define RCC_AHB1_PERIPHRST_USB2WRAP (RCC_AHB1RST1_USB2WRAPRST ) +#define RCC_AHB1_PERIPHRST_USB2POR (RCC_AHB1RST1_USB2PORRST ) +#define RCC_AHB1_PERIPHRST_USB2 (RCC_AHB1RST1_USB2RST ) +#define RCC_AHB1_PERIPHRST_DMAMUX1 (RCC_AHB1RST1_DMAMUX1RST ) +#define RCC_AHB1_PERIPHRST_ADC1 (RCC_AHB1RST1_ADC1RST ) + +#define RCC_AHB1_PERIPHRST_ETH2 (RCC_AHB1RST2_ETH2RST) + +#define RCC_AHB1_PERIPHRST_ECCMAC (RCC_AHB1RST3_ECCMACRST) +#define RCC_AHB1_PERIPHRST_DMA1 (RCC_AHB1RST3_DMA1RST ) +#define RCC_AHB1_PERIPHRST_DMA2 (RCC_AHB1RST3_DMA2RST ) +#define RCC_AHB1_PERIPHRST_DMA3 (RCC_AHB1RST3_DMA3RST ) + +#define RCC_AHB1_PERIPHRST_ADC2 (RCC_AHB1RST4_ADC2RST) +#define RCC_AHB1_PERIPHRST_ADC3 (RCC_AHB1RST4_ADC3RST) +/** APB1 peripherals reset **/ +#define RCC_APB1_PERIPHRST_BTIM1 (RCC_APB1RST1_BTIM1RST ) +#define RCC_APB1_PERIPHRST_BTIM2 (RCC_APB1RST1_BTIM2RST ) +#define RCC_APB1_PERIPHRST_BTIM3 (RCC_APB1RST1_BTIM3RST ) +#define RCC_APB1_PERIPHRST_BTIM4 (RCC_APB1RST1_BTIM4RST ) +#define RCC_APB1_PERIPHRST_GTIMB1 (RCC_APB1RST1_GTIMB1RST) +#define RCC_APB1_PERIPHRST_GTIMB2 (RCC_APB1RST1_GTIMB2RST) +#define RCC_APB1_PERIPHRST_GTIMB3 (RCC_APB1RST1_GTIMB3RST) +#define RCC_APB1_PERIPHRST_GTIMA4 (RCC_APB1RST1_GTIMA4RST) + +#define RCC_APB1_PERIPHRST_GTIMA5 (RCC_APB1RST2_GTIMA5RST) +#define RCC_APB1_PERIPHRST_GTIMA6 (RCC_APB1RST2_GTIMA6RST) +#define RCC_APB1_PERIPHRST_GTIMA7 (RCC_APB1RST2_GTIMA7RST) +#define RCC_APB1_PERIPHRST_SPI3 (RCC_APB1RST2_SPI3RST ) +#define RCC_APB1_PERIPHRST_DAC12 (RCC_APB1RST2_DAC12RST ) +#define RCC_APB1_PERIPHRST_WWDG2 (RCC_APB1RST2_WWDG2RST ) + +#define RCC_APB1_PERIPHRST_USART1 (RCC_APB1RST3_USART1RST) +#define RCC_APB1_PERIPHRST_USART2 (RCC_APB1RST3_USART2RST) +#define RCC_APB1_PERIPHRST_USART3 (RCC_APB1RST3_USART3RST) +#define RCC_APB1_PERIPHRST_USART4 (RCC_APB1RST3_USART4RST) +#define RCC_APB1_PERIPHRST_UART9 (RCC_APB1RST3_UART9RST ) +#define RCC_APB1_PERIPHRST_UART10 (RCC_APB1RST3_UART10RST ) +#define RCC_APB1_PERIPHRST_UART11 (RCC_APB1RST3_UART11RST ) +#define RCC_APB1_PERIPHRST_UART12 (RCC_APB1RST3_UART12RST ) + +#define RCC_APB1_PERIPHRST_I2S3 (RCC_APB1RST4_I2S3RST ) +#define RCC_APB1_PERIPHRST_I2S4 (RCC_APB1RST4_I2S4RST ) +#define RCC_APB1_PERIPHRST_I2C1 (RCC_APB1RST4_I2C1RST ) +#define RCC_APB1_PERIPHRST_I2C2 (RCC_APB1RST4_I2C2RST ) +#define RCC_APB1_PERIPHRST_I2C3 (RCC_APB1RST4_I2C3RST ) + +#define RCC_APB1_PERIPHRST_FDCAN1 (RCC_APB1RST5_FDCAN1RST) +#define RCC_APB1_PERIPHRST_FDCAN2 (RCC_APB1RST5_FDCAN2RST) +#define RCC_APB1_PERIPHRST_FDCAN5 (RCC_APB1RST5_FDCAN5RST) +#define RCC_APB1_PERIPHRST_FDCAN6 (RCC_APB1RST5_FDCAN6RST) +#define RCC_APB1_PERIPHRST_CAHI (RCC_APB1RST5_CAHIRST ) +#define RCC_APB1_PERIPHRST_CAHD (RCC_APB1RST5_CAHDRST ) +/** AHB2 peripherals reset **/ +#define RCC_AHB2_PERIPHRST_DAC56 (RCC_AHB2RST1_DAC56RST ) +#define RCC_AHB2_PERIPHRST_DAC34 (RCC_AHB2RST1_DAC34RST ) +#define RCC_AHB2_PERIPHRST_USB1WRAP (RCC_AHB2RST1_USB1WRAPRST) +#define RCC_AHB2_PERIPHRST_USB1POR (RCC_AHB2RST1_USB1PORRST ) +#define RCC_AHB2_PERIPHRST_USB1 (RCC_AHB2RST1_USB1RST ) +#define RCC_AHB2_PERIPHRST_ETH1 (RCC_AHB2RST1_ETH1RST ) +#define RCC_AHB2_PERIPHRST_ECCM2 (RCC_AHB2RST1_ECCM2RST ) +#define RCC_AHB2_PERIPHRST_CORDIC (RCC_AHB2RST1_CORDICRST ) +#define RCC_AHB2_PERIPHRST_SDPU (RCC_AHB2RST1_SDPURST ) +#define RCC_AHB2_PERIPHRST_FMAC (RCC_AHB2RST1_FMACRST ) +/** APB2 peripherals reset **/ +#define RCC_APB2_PERIPHRST_ATIM1 (RCC_APB2RST1_ATIM1RST ) +#define RCC_APB2_PERIPHRST_ATIM2 (RCC_APB2RST1_ATIM2RST ) +#define RCC_APB2_PERIPHRST_GTIMA1 (RCC_APB2RST1_GTIMA1RST ) +#define RCC_APB2_PERIPHRST_GTIMA2 (RCC_APB2RST1_GTIMA2RST ) +#define RCC_APB2_PERIPHRST_GTIMA3 (RCC_APB2RST1_GTIMA3RST ) +#define RCC_APB2_PERIPHRST_SHRTIM1 (RCC_APB2RST1_SHRTIM1RST) +#define RCC_APB2_PERIPHRST_SHRTIM2 (RCC_APB2RST1_SHRTIM2RST) + +#define RCC_APB2_PERIPHRST_I2S1 (RCC_APB2RST2_I2S1RST ) +#define RCC_APB2_PERIPHRST_I2S2 (RCC_APB2RST2_I2S2RST ) +#define RCC_APB2_PERIPHRST_SPI1 (RCC_APB2RST2_SPI1RST ) +#define RCC_APB2_PERIPHRST_SPI2 (RCC_APB2RST2_SPI2RST ) +#define RCC_APB2_PERIPHRST_DSMU (RCC_APB2RST2_DSMURST ) +#define RCC_APB2_PERIPHRST_I2C4 (RCC_APB2RST2_I2C4RST ) +#define RCC_APB2_PERIPHRST_I2C5 (RCC_APB2RST2_I2C5RST ) +#define RCC_APB2_PERIPHRST_I2C6 (RCC_APB2RST2_I2C6RST ) + +#define RCC_APB2_PERIPHRST_USART5 (RCC_APB2RST3_USART5RST ) +#define RCC_APB2_PERIPHRST_USART6 (RCC_APB2RST3_USART6RST ) +#define RCC_APB2_PERIPHRST_USART7 (RCC_APB2RST3_USART7RST ) +#define RCC_APB2_PERIPHRST_USART8 (RCC_APB2RST3_USART8RST ) +#define RCC_APB2_PERIPHRST_UART13 (RCC_APB2RST3_UART13RST ) +#define RCC_APB2_PERIPHRST_UART14 (RCC_APB2RST3_UART14RST ) +#define RCC_APB2_PERIPHRST_UART15 (RCC_APB2RST3_UART15RST ) + +#define RCC_APB2_PERIPHRST_FDCAN3 (RCC_APB2RST4_FDCAN3RST ) +#define RCC_APB2_PERIPHRST_FDCAN4 (RCC_APB2RST4_FDCAN4RST ) +#define RCC_APB2_PERIPHRST_FDCAN7 (RCC_APB2RST4_FDCAN7RST ) +#define RCC_APB2_PERIPHRST_FDCAN8 (RCC_APB2RST4_FDCAN8RST ) +/** AHB5 peripherals reset **/ +#define RCC_AHB5_PERIPHRST_GPIOA (RCC_AHB5RST1_GPIOARST) +#define RCC_AHB5_PERIPHRST_GPIOB (RCC_AHB5RST1_GPIOBRST) +#define RCC_AHB5_PERIPHRST_GPIOC (RCC_AHB5RST1_GPIOCRST) +#define RCC_AHB5_PERIPHRST_GPIOD (RCC_AHB5RST1_GPIODRST) +#define RCC_AHB5_PERIPHRST_GPIOE (RCC_AHB5RST1_GPIOERST) +#define RCC_AHB5_PERIPHRST_GPIOF (RCC_AHB5RST1_GPIOFRST) +#define RCC_AHB5_PERIPHRST_GPIOG (RCC_AHB5RST1_GPIOGRST) +#define RCC_AHB5_PERIPHRST_GPIOH (RCC_AHB5RST1_GPIOHRST) + +#define RCC_AHB5_PERIPHRST_GPIOI (RCC_AHB5RST2_GPIOIRST) +#define RCC_AHB5_PERIPHRST_GPIOJ (RCC_AHB5RST2_GPIOJRST) +#define RCC_AHB5_PERIPHRST_GPIOK (RCC_AHB5RST2_GPIOKRST) +#define RCC_AHB5_PERIPHRST_ECCM3 (RCC_AHB5RST2_ECCM3RST) +#define RCC_AHB5_PERIPHRST_PWR (RCC_AHB5RST2_PWRRST ) +#define RCC_AHB5_PERIPHRST_CRC (RCC_AHB5RST2_CRCRST ) +#define RCC_AHB5_PERIPHRST_SEMA4 (RCC_AHB5RST2_SEMA4RST) +#define RCC_AHB5_PERIPHRST_AFIO (RCC_AHB5RST2_AFIORST ) +/** APB5 peripherals reset **/ +#define RCC_APB5_PERIPHRST_ATIM3 (RCC_APB5RST1_ATIM3RST) +#define RCC_APB5_PERIPHRST_ATIM4 (RCC_APB5RST1_ATIM4RST) +#define RCC_APB5_PERIPHRST_SPI4 (RCC_APB5RST1_SPI4RST ) +#define RCC_APB5_PERIPHRST_SPI5 (RCC_APB5RST1_SPI5RST ) +#define RCC_APB5_PERIPHRST_SPI6 (RCC_APB5RST1_SPI6RST ) +#define RCC_APB5_PERIPHRST_SPI7 (RCC_APB5RST1_SPI7RST ) + +#define RCC_APB5_PERIPHRST_I2C7 (RCC_APB5RST2_I2C7RST ) +#define RCC_APB5_PERIPHRST_I2C8 (RCC_APB5RST2_I2C8RST ) +#define RCC_APB5_PERIPHRST_I2C9 (RCC_APB5RST2_I2C9RST ) +#define RCC_APB5_PERIPHRST_I2C10 (RCC_APB5RST2_I2C10RST) +/** AXI/AHB6/APB6 peripherals reset **/ +#define RCC_AXI_PERIPHRST_JPEGD (RCC_AXIRST1_JPEGDRST ) +#define RCC_AXI_PERIPHRST_JPEGE (RCC_AXIRST1_JPEGERST ) +#define RCC_AXI_PERIPHRST_DMAMUX2 (RCC_AXIRST1_DMAMUX2RST ) +#define RCC_AXI_PERIPHRST_MDMA (RCC_AXIRST1_MDMARST ) +#define RCC_AXI_PERIPHRST_SDMMC1 (RCC_AXIRST1_SDMMC1RST) +#define RCC_AXI_PERIPHRST_SDHOST1 (RCC_AXIRST1_SDHOST1RST ) +#define RCC_AXI_PERIPHRST_ECCM1 (RCC_AXIRST1_ECCM1RST ) +#define RCC_AXI_PERIPHRST_OTPC (RCC_AXIRST1_OTPCRST ) + +#define RCC_AXI_PERIPHRST_DSICFG (RCC_AXIRST2_DSICFGRST ) +#define RCC_AXI_PERIPHRST_DSI (RCC_AXIRST2_DSIRST ) +#define RCC_AXI_PERIPHRST_LCDC (RCC_AXIRST2_LCDCRST ) +#define RCC_AXI_PERIPHRST_DVP1 (RCC_AXIRST2_DVP1RST ) +#define RCC_AXI_PERIPHRST_DVP2 (RCC_AXIRST2_DVP2RST ) +#define RCC_AXI_PERIPHRST_WWDG1 (RCC_AXIRST2_WWDG1RST ) + +#define RCC_AXI_PERIPHRST_GPU (RCC_AXIRST3_GPURST ) + +#define RCC_AXI_PERIPHRST_XSPI1 (RCC_AXIRST4_XSPI1RST ) +#define RCC_AXI_PERIPHRST_XSPI2 (RCC_AXIRST4_XSPI2RST ) +#define RCC_AXI_PERIPHRST_FEMCCFG (RCC_AXIRST4_FEMCCFGRST ) +#define RCC_AXI_PERIPHRST_FEMC (RCC_AXIRST4_FEMCRST ) +#define RCC_AXI_PERIPHRST_SDRAM (RCC_AXIRST4_SDRAMRST ) +/** AHB9 peripherals reset **/ +#define RCC_AHB9_PERIPHRST_ESC (RCC_AHB9RST1_ESCRST) +/** Retention domain peripherals reset **/ +#define RCC_RD_PERIPHRST_LPTIM1 (RCC_RDRST1_LPTIM1RST ) +#define RCC_RD_PERIPHRST_LPTIM2 (RCC_RDRST1_LPTIM2RST ) +#define RCC_RD_PERIPHRST_LPTIM3 (RCC_RDRST1_LPTIM3RST ) +#define RCC_RD_PERIPHRST_LPTIM4 (RCC_RDRST1_LPTIM4RST ) +#define RCC_RD_PERIPHRST_LPTIM5 (RCC_RDRST1_LPTIM5RST ) +#define RCC_RD_PERIPHRST_LPUART1 (RCC_RDRST1_LPUART1RST) +#define RCC_RD_PERIPHRST_LPUART2 (RCC_RDRST1_LPUART2RST) + +#define RCC_RD_PERIPHRST_COMP (RCC_RDRST2_COMPRST) + + +/** AHB1 peripherals enable **/ +#define RCC_AHB1_PERIPHEN_M7_SDMMC2 (RCC_AHB1EN1_M7SDMMC2EN ) +#define RCC_AHB1_PERIPHEN_M4_SDMMC2 (RCC_AHB1EN1_M4SDMMC2EN ) +#define RCC_AHB1_PERIPHEN_M7_SDMMC2LP (RCC_AHB1EN1_M7SDMMC2LPEN ) +#define RCC_AHB1_PERIPHEN_M4_SDMMC2LP (RCC_AHB1EN1_M4SDMMC2LPEN ) +#define RCC_AHB1_PERIPHEN_M7_USB2 (RCC_AHB1EN1_M7USB2EN ) +#define RCC_AHB1_PERIPHEN_M4_USB2 (RCC_AHB1EN1_M4USB2EN ) +#define RCC_AHB1_PERIPHEN_M7_USB2LP (RCC_AHB1EN1_M7USB2LPEN ) +#define RCC_AHB1_PERIPHEN_M4_USB2LP (RCC_AHB1EN1_M4USB2LPEN ) +#define RCC_AHB1_PERIPHEN_M7_DMAMUX1 (RCC_AHB1EN1_M7DMAMUX1EN ) +#define RCC_AHB1_PERIPHEN_M4_DMAMUX1 (RCC_AHB1EN1_M4DMAMUX1EN ) +#define RCC_AHB1_PERIPHEN_M7_DMAMUX1LP (RCC_AHB1EN1_M7DMAMUX1LPEN ) +#define RCC_AHB1_PERIPHEN_M4_DMAMUX1LP (RCC_AHB1EN1_M4DMAMUX1LPEN ) +#define RCC_AHB1_PERIPHEN_M7_ADC1PLL (RCC_AHB1EN1_M7ADC1PLLEN ) +#define RCC_AHB1_PERIPHEN_M4_ADC1PLL (RCC_AHB1EN1_M4ADC1PLLEN ) +#define RCC_AHB1_PERIPHEN_M7_ADC1PLLLP (RCC_AHB1EN1_M7ADC1PLLLPEN) +#define RCC_AHB1_PERIPHEN_M4_ADC1PLLLP (RCC_AHB1EN1_M4ADC1PLLLPEN) +#define RCC_AHB1_PERIPHEN_M7_ADC1SYS (RCC_AHB1EN1_M7ADC1SYSEN ) +#define RCC_AHB1_PERIPHEN_M4_ADC1SYS (RCC_AHB1EN1_M4ADC1SYSEN ) +#define RCC_AHB1_PERIPHEN_M7_ADC1SYSLP (RCC_AHB1EN1_M7ADC1SYSLPEN) +#define RCC_AHB1_PERIPHEN_M4_ADC1SYSLP (RCC_AHB1EN1_M4ADC1SYSLPEN) +#define RCC_AHB1_PERIPHEN_M7_ADC1BUS (RCC_AHB1EN1_M7ADC1BUSEN ) +#define RCC_AHB1_PERIPHEN_M4_ADC1BUS (RCC_AHB1EN1_M4ADC1BUSEN ) +#define RCC_AHB1_PERIPHEN_M7_ADC1BUSLP (RCC_AHB1EN1_M7ADC1BUSLPEN) +#define RCC_AHB1_PERIPHEN_M4_ADC1BUSLP (RCC_AHB1EN1_M4ADC1BUSLPEN) + +#define RCC_AHB1_PERIPHEN_M7_ETH2TX (RCC_AHB1EN2_M7ETH2TXEN ) +#define RCC_AHB1_PERIPHEN_M4_ETH2TX (RCC_AHB1EN2_M4ETH2TXEN ) +#define RCC_AHB1_PERIPHEN_M7_ETH2TXLP (RCC_AHB1EN2_M7ETH2TXLPEN ) +#define RCC_AHB1_PERIPHEN_M4_ETH2TXLP (RCC_AHB1EN2_M4ETH2TXLPEN ) +#define RCC_AHB1_PERIPHEN_M7_ETH2RX (RCC_AHB1EN2_M7ETH2RXEN ) +#define RCC_AHB1_PERIPHEN_M4_ETH2RX (RCC_AHB1EN2_M4ETH2RXEN ) +#define RCC_AHB1_PERIPHEN_M7_ETH2RXLP (RCC_AHB1EN2_M7ETH2RXLPEN ) +#define RCC_AHB1_PERIPHEN_M4_ETH2RXLP (RCC_AHB1EN2_M4ETH2RXLPEN ) +#define RCC_AHB1_PERIPHEN_M7_ETH2MAC (RCC_AHB1EN2_M7ETH2MACEN ) +#define RCC_AHB1_PERIPHEN_M4_ETH2MAC (RCC_AHB1EN2_M4ETH2MACEN ) +#define RCC_AHB1_PERIPHEN_M7_ETH2MACLP (RCC_AHB1EN2_M7ETH2MACLPEN) +#define RCC_AHB1_PERIPHEN_M4_ETH2MACLP (RCC_AHB1EN2_M4ETH2MACLPEN) + +#define RCC_AHB1_PERIPHEN_M7_ECCMAC (RCC_AHB1EN3_M7ECCMACEN ) +#define RCC_AHB1_PERIPHEN_M4_ECCMAC (RCC_AHB1EN3_M4ECCMACEN ) +#define RCC_AHB1_PERIPHEN_M7_ECCMACLP (RCC_AHB1EN3_M7ECCMACLPEN ) +#define RCC_AHB1_PERIPHEN_M4_ECCMACLP (RCC_AHB1EN3_M4ECCMACLPEN ) +#define RCC_AHB1_PERIPHEN_M7_DMA1 (RCC_AHB1EN3_M7DMA1EN ) +#define RCC_AHB1_PERIPHEN_M4_DMA1 (RCC_AHB1EN3_M4DMA1EN ) +#define RCC_AHB1_PERIPHEN_M7_DMA1LP (RCC_AHB1EN3_M7DMA1LPEN ) +#define RCC_AHB1_PERIPHEN_M4_DMA1LP (RCC_AHB1EN3_M4DMA1LPEN ) +#define RCC_AHB1_PERIPHEN_M7_DMA2 (RCC_AHB1EN3_M7DMA2EN ) +#define RCC_AHB1_PERIPHEN_M4_DMA2 (RCC_AHB1EN3_M4DMA2EN ) +#define RCC_AHB1_PERIPHEN_M7_DMA2LP (RCC_AHB1EN3_M7DMA2LPEN ) +#define RCC_AHB1_PERIPHEN_M4_DMA2LP (RCC_AHB1EN3_M4DMA2LPEN ) +#define RCC_AHB1_PERIPHEN_M7_DMA3 (RCC_AHB1EN3_M7DMA3EN ) +#define RCC_AHB1_PERIPHEN_M4_DMA3 (RCC_AHB1EN3_M4DMA3EN ) +#define RCC_AHB1_PERIPHEN_M7_DMA3LP (RCC_AHB1EN3_M7DMA3LPEN ) +#define RCC_AHB1_PERIPHEN_M4_DMA3LP (RCC_AHB1EN3_M4DMA3LPEN ) + +#define RCC_AHB1_PERIPHEN_M7_ADC2PLL (RCC_AHB1EN4_M7ADC2PLLEN ) +#define RCC_AHB1_PERIPHEN_M4_ADC2PLL (RCC_AHB1EN4_M4ADC2PLLEN ) +#define RCC_AHB1_PERIPHEN_M7_ADC2PLLLP (RCC_AHB1EN4_M7ADC2PLLLPEN) +#define RCC_AHB1_PERIPHEN_M4_ADC2PLLLP (RCC_AHB1EN4_M4ADC2PLLLPEN) +#define RCC_AHB1_PERIPHEN_M7_ADC2SYS (RCC_AHB1EN4_M7ADC2SYSEN ) +#define RCC_AHB1_PERIPHEN_M4_ADC2SYS (RCC_AHB1EN4_M4ADC2SYSEN ) +#define RCC_AHB1_PERIPHEN_M7_ADC2SYSLP (RCC_AHB1EN4_M7ADC2SYSLPEN) +#define RCC_AHB1_PERIPHEN_M4_ADC2SYSLP (RCC_AHB1EN4_M4ADC2SYSLPEN) +#define RCC_AHB1_PERIPHEN_M7_ADC2BUS (RCC_AHB1EN4_M7ADC2BUSEN ) +#define RCC_AHB1_PERIPHEN_M4_ADC2BUS (RCC_AHB1EN4_M4ADC2BUSEN ) +#define RCC_AHB1_PERIPHEN_M7_ADC2BUSLP (RCC_AHB1EN4_M7ADC2BUSLPEN) +#define RCC_AHB1_PERIPHEN_M4_ADC2BUSLP (RCC_AHB1EN4_M4ADC2BUSLPEN) +#define RCC_AHB1_PERIPHEN_M7_ADC3PLL (RCC_AHB1EN4_M7ADC3PLLEN ) +#define RCC_AHB1_PERIPHEN_M4_ADC3PLL (RCC_AHB1EN4_M4ADC3PLLEN ) +#define RCC_AHB1_PERIPHEN_M7_ADC3PLLLP (RCC_AHB1EN4_M7ADC3PLLLPEN) +#define RCC_AHB1_PERIPHEN_M4_ADC3PLLLP (RCC_AHB1EN4_M4ADC3PLLLPEN) +#define RCC_AHB1_PERIPHEN_M7_ADC3SYS (RCC_AHB1EN4_M7ADC3SYSEN ) +#define RCC_AHB1_PERIPHEN_M4_ADC3SYS (RCC_AHB1EN4_M4ADC3SYSEN ) +#define RCC_AHB1_PERIPHEN_M7_ADC3SYSLP (RCC_AHB1EN4_M7ADC3SYSLPEN) +#define RCC_AHB1_PERIPHEN_M4_ADC3SYSLP (RCC_AHB1EN4_M4ADC3SYSLPEN) +#define RCC_AHB1_PERIPHEN_M7_ADC3BUS (RCC_AHB1EN4_M7ADC3BUSEN ) +#define RCC_AHB1_PERIPHEN_M4_ADC3BUS (RCC_AHB1EN4_M4ADC3BUSEN ) +#define RCC_AHB1_PERIPHEN_M7_ADC3BUSLP (RCC_AHB1EN4_M7ADC3BUSLPEN) +#define RCC_AHB1_PERIPHEN_M4_ADC3BUSLP (RCC_AHB1EN4_M4ADC3BUSLPEN) +/** APB1 peripherals enable **/ +#define RCC_APB1_PERIPHEN_M7_BTIM1 (RCC_APB1EN1_M7BTIM1EN ) +#define RCC_APB1_PERIPHEN_M4_BTIM1 (RCC_APB1EN1_M4BTIM1EN ) +#define RCC_APB1_PERIPHEN_M7_BTIM1LP (RCC_APB1EN1_M7BTIM1LPEN ) +#define RCC_APB1_PERIPHEN_M4_BTIM1LP (RCC_APB1EN1_M4BTIM1LPEN ) +#define RCC_APB1_PERIPHEN_M7_BTIM2 (RCC_APB1EN1_M7BTIM2EN ) +#define RCC_APB1_PERIPHEN_M4_BTIM2 (RCC_APB1EN1_M4BTIM2EN ) +#define RCC_APB1_PERIPHEN_M7_BTIM2LP (RCC_APB1EN1_M7BTIM2LPEN ) +#define RCC_APB1_PERIPHEN_M4_BTIM2LP (RCC_APB1EN1_M4BTIM2LPEN ) +#define RCC_APB1_PERIPHEN_M7_BTIM3 (RCC_APB1EN1_M7BTIM3EN ) +#define RCC_APB1_PERIPHEN_M4_BTIM3 (RCC_APB1EN1_M4BTIM3EN ) +#define RCC_APB1_PERIPHEN_M7_BTIM3LP (RCC_APB1EN1_M7BTIM3LPEN ) +#define RCC_APB1_PERIPHEN_M4_BTIM3LP (RCC_APB1EN1_M4BTIM3LPEN ) +#define RCC_APB1_PERIPHEN_M7_BTIM4 (RCC_APB1EN1_M7BTIM4EN ) +#define RCC_APB1_PERIPHEN_M4_BTIM4 (RCC_APB1EN1_M4BTIM4EN ) +#define RCC_APB1_PERIPHEN_M7_BTIM4LP (RCC_APB1EN1_M7BTIM4LPEN ) +#define RCC_APB1_PERIPHEN_M4_BTIM4LP (RCC_APB1EN1_M4BTIM4LPEN ) +#define RCC_APB1_PERIPHEN_M7_GTIMB1 (RCC_APB1EN1_M7GTIMB1EN ) +#define RCC_APB1_PERIPHEN_M4_GTIMB1 (RCC_APB1EN1_M4GTIMB1EN ) +#define RCC_APB1_PERIPHEN_M7_GTIMB1LP (RCC_APB1EN1_M7GTIMB1LPEN) +#define RCC_APB1_PERIPHEN_M4_GTIMB1LP (RCC_APB1EN1_M4GTIMB1LPEN) +#define RCC_APB1_PERIPHEN_M7_GTIMB2 (RCC_APB1EN1_M7GTIMB2EN ) +#define RCC_APB1_PERIPHEN_M4_GTIMB2 (RCC_APB1EN1_M4GTIMB2EN ) +#define RCC_APB1_PERIPHEN_M7_GTIMB2LP (RCC_APB1EN1_M7GTIMB2LPEN) +#define RCC_APB1_PERIPHEN_M4_GTIMB2LP (RCC_APB1EN1_M4GTIMB2LPEN) +#define RCC_APB1_PERIPHEN_M7_GTIMB3 (RCC_APB1EN1_M7GTIMB3EN ) +#define RCC_APB1_PERIPHEN_M4_GTIMB3 (RCC_APB1EN1_M4GTIMB3EN ) +#define RCC_APB1_PERIPHEN_M7_GTIMB3LP (RCC_APB1EN1_M7GTIMB3LPEN) +#define RCC_APB1_PERIPHEN_M4_GTIMB3LP (RCC_APB1EN1_M4GTIMB3LPEN) +#define RCC_APB1_PERIPHEN_M7_GTIMA4 (RCC_APB1EN1_M7GTIMA4EN ) +#define RCC_APB1_PERIPHEN_M4_GTIMA4 (RCC_APB1EN1_M4GTIMA4EN ) +#define RCC_APB1_PERIPHEN_M7_GTIMA4LP (RCC_APB1EN1_M7GTIMA4LPEN) +#define RCC_APB1_PERIPHEN_M4_GTIMA4LP (RCC_APB1EN1_M4GTIMA4LPEN) + +#define RCC_APB1_PERIPHEN_M7_GTIMA5 (RCC_APB1EN2_M7GTIMA5EN ) +#define RCC_APB1_PERIPHEN_M4_GTIMA5 (RCC_APB1EN2_M4GTIMA5EN ) +#define RCC_APB1_PERIPHEN_M7_GTIMA5LP (RCC_APB1EN2_M7GTIMA5LPEN) +#define RCC_APB1_PERIPHEN_M4_GTIMA5LP (RCC_APB1EN2_M4GTIMA5LPEN) +#define RCC_APB1_PERIPHEN_M7_GTIMA6 (RCC_APB1EN2_M7GTIMA6EN ) +#define RCC_APB1_PERIPHEN_M4_GTIMA6 (RCC_APB1EN2_M4GTIMA6EN ) +#define RCC_APB1_PERIPHEN_M7_GTIMA6LP (RCC_APB1EN2_M7GTIMA6LPEN) +#define RCC_APB1_PERIPHEN_M4_GTIMA6LP (RCC_APB1EN2_M4GTIMA6LPEN) +#define RCC_APB1_PERIPHEN_M7_GTIMA7 (RCC_APB1EN2_M7GTIMA7EN ) +#define RCC_APB1_PERIPHEN_M4_GTIMA7 (RCC_APB1EN2_M4GTIMA7EN ) +#define RCC_APB1_PERIPHEN_M7_GTIMA7LP (RCC_APB1EN2_M7GTIMA7LPEN) +#define RCC_APB1_PERIPHEN_M4_GTIMA7LP (RCC_APB1EN2_M4GTIMA7LPEN) +#define RCC_APB1_PERIPHEN_M7_SPI3 (RCC_APB1EN2_M7SPI3EN ) +#define RCC_APB1_PERIPHEN_M4_SPI3 (RCC_APB1EN2_M4SPI3EN ) +#define RCC_APB1_PERIPHEN_M7_SPI3LP (RCC_APB1EN2_M7SPI3LPEN ) +#define RCC_APB1_PERIPHEN_M4_SPI3LP (RCC_APB1EN2_M4SPI3LPEN ) +#define RCC_APB1_PERIPHEN_M7_DAC12 (RCC_APB1EN2_M7DAC12EN ) +#define RCC_APB1_PERIPHEN_M4_DAC12 (RCC_APB1EN2_M4DAC12EN ) +#define RCC_APB1_PERIPHEN_M7_DAC12LP (RCC_APB1EN2_M7DAC12LPEN ) +#define RCC_APB1_PERIPHEN_M4_DAC12LP (RCC_APB1EN2_M4DAC12LPEN ) +#define RCC_APB1_PERIPHEN_M7_WWDG2 (RCC_APB1EN2_M7WWDG2EN ) +#define RCC_APB1_PERIPHEN_M4_WWDG2 (RCC_APB1EN2_M4WWDG2EN ) +#define RCC_APB1_PERIPHEN_M7_WWDG2LP (RCC_APB1EN2_M7WWDG2LPEN ) +#define RCC_APB1_PERIPHEN_M4_WWDG2LP (RCC_APB1EN2_M4WWDG2LPEN ) + + +#define RCC_APB1_PERIPHEN_M7_USART1 (RCC_APB1EN3_M7USART1EN ) +#define RCC_APB1_PERIPHEN_M4_USART1 (RCC_APB1EN3_M4USART1EN ) +#define RCC_APB1_PERIPHEN_M7_USART1LP (RCC_APB1EN3_M7USART1LPEN) +#define RCC_APB1_PERIPHEN_M4_USART1LP (RCC_APB1EN3_M4USART1LPEN) +#define RCC_APB1_PERIPHEN_M7_USART2 (RCC_APB1EN3_M7USART2EN ) +#define RCC_APB1_PERIPHEN_M4_USART2 (RCC_APB1EN3_M4USART2EN ) +#define RCC_APB1_PERIPHEN_M7_USART2LP (RCC_APB1EN3_M7USART2LPEN) +#define RCC_APB1_PERIPHEN_M4_USART2LP (RCC_APB1EN3_M4USART2LPEN) +#define RCC_APB1_PERIPHEN_M7_USART3 (RCC_APB1EN3_M7USART3EN ) +#define RCC_APB1_PERIPHEN_M4_USART3 (RCC_APB1EN3_M4USART3EN ) +#define RCC_APB1_PERIPHEN_M7_USART3LP (RCC_APB1EN3_M7USART3LPEN) +#define RCC_APB1_PERIPHEN_M4_USART3LP (RCC_APB1EN3_M4USART3LPEN) +#define RCC_APB1_PERIPHEN_M7_USART4 (RCC_APB1EN3_M7USART4EN ) +#define RCC_APB1_PERIPHEN_M4_USART4 (RCC_APB1EN3_M4USART4EN ) +#define RCC_APB1_PERIPHEN_M7_USART4LP (RCC_APB1EN3_M7USART4LPEN) +#define RCC_APB1_PERIPHEN_M4_USART4LP (RCC_APB1EN3_M4USART4LPEN) +#define RCC_APB1_PERIPHEN_M7_UART9 (RCC_APB1EN3_M7UART9EN ) +#define RCC_APB1_PERIPHEN_M4_UART9 (RCC_APB1EN3_M4UART9EN ) +#define RCC_APB1_PERIPHEN_M7_UART9LP (RCC_APB1EN3_M7UART9LPEN ) +#define RCC_APB1_PERIPHEN_M4_UART9LP (RCC_APB1EN3_M4UART9LPEN ) +#define RCC_APB1_PERIPHEN_M7_UART10 (RCC_APB1EN3_M7UART10EN ) +#define RCC_APB1_PERIPHEN_M4_UART10 (RCC_APB1EN3_M4UART10EN ) +#define RCC_APB1_PERIPHEN_M7_UART10LP (RCC_APB1EN3_M7UART10LPEN ) +#define RCC_APB1_PERIPHEN_M4_UART10LP (RCC_APB1EN3_M4UART10LPEN ) +#define RCC_APB1_PERIPHEN_M7_UART11 (RCC_APB1EN3_M7UART11EN ) +#define RCC_APB1_PERIPHEN_M4_UART11 (RCC_APB1EN3_M4UART11EN ) +#define RCC_APB1_PERIPHEN_M7_UART11LP (RCC_APB1EN3_M7UART11LPEN ) +#define RCC_APB1_PERIPHEN_M4_UART11LP (RCC_APB1EN3_M4UART11LPEN ) +#define RCC_APB1_PERIPHEN_M7_UART12 (RCC_APB1EN3_M7UART12EN ) +#define RCC_APB1_PERIPHEN_M4_UART12 (RCC_APB1EN3_M4UART12EN ) +#define RCC_APB1_PERIPHEN_M7_UART12LP (RCC_APB1EN3_M7UART12LPEN ) +#define RCC_APB1_PERIPHEN_M4_UART12LP (RCC_APB1EN3_M4UART12LPEN ) + +#define RCC_APB1_PERIPHEN_M7_I2S3 (RCC_APB1EN4_M7I2S3EN ) +#define RCC_APB1_PERIPHEN_M4_I2S3 (RCC_APB1EN4_M4I2S3EN ) +#define RCC_APB1_PERIPHEN_M7_I2S3LP (RCC_APB1EN4_M7I2S3LPEN ) +#define RCC_APB1_PERIPHEN_M4_I2S3LP (RCC_APB1EN4_M4I2S3LPEN ) +#define RCC_APB1_PERIPHEN_M7_I2S4 (RCC_APB1EN4_M7I2S4EN ) +#define RCC_APB1_PERIPHEN_M4_I2S4 (RCC_APB1EN4_M4I2S4EN ) +#define RCC_APB1_PERIPHEN_M7_I2S4LP (RCC_APB1EN4_M7I2S4LPEN ) +#define RCC_APB1_PERIPHEN_M4_I2S4LP (RCC_APB1EN4_M4I2S4LPEN ) +#define RCC_APB1_PERIPHEN_M7_I2C1 (RCC_APB1EN4_M7I2C1EN ) +#define RCC_APB1_PERIPHEN_M4_I2C1 (RCC_APB1EN4_M4I2C1EN ) +#define RCC_APB1_PERIPHEN_M7_I2C1LP (RCC_APB1EN4_M7I2C1LPEN ) +#define RCC_APB1_PERIPHEN_M4_I2C1LP (RCC_APB1EN4_M4I2C1LPEN ) +#define RCC_APB1_PERIPHEN_M7_I2C2 (RCC_APB1EN4_M7I2C2EN ) +#define RCC_APB1_PERIPHEN_M4_I2C2 (RCC_APB1EN4_M4I2C2EN ) +#define RCC_APB1_PERIPHEN_M7_I2C2LP (RCC_APB1EN4_M7I2C2LPEN ) +#define RCC_APB1_PERIPHEN_M4_I2C2LP (RCC_APB1EN4_M4I2C2LPEN ) +#define RCC_APB1_PERIPHEN_M7_I2C3 (RCC_APB1EN4_M7I2C3EN ) +#define RCC_APB1_PERIPHEN_M4_I2C3 (RCC_APB1EN4_M4I2C3EN ) +#define RCC_APB1_PERIPHEN_M7_I2C3LP (RCC_APB1EN4_M7I2C3LPEN ) +#define RCC_APB1_PERIPHEN_M4_I2C3LP (RCC_APB1EN4_M4I2C3LPEN ) + +#define RCC_APB1_PERIPHEN_M7_FDCAN1 (RCC_APB1EN5_M7FDCAN1EN ) +#define RCC_APB1_PERIPHEN_M4_FDCAN1 (RCC_APB1EN5_M4FDCAN1EN ) +#define RCC_APB1_PERIPHEN_M7_FDCAN1LP (RCC_APB1EN5_M7FDCAN1LPEN) +#define RCC_APB1_PERIPHEN_M4_FDCAN1LP (RCC_APB1EN5_M4FDCAN1LPEN) +#define RCC_APB1_PERIPHEN_M7_FDCAN2 (RCC_APB1EN5_M7FDCAN2EN ) +#define RCC_APB1_PERIPHEN_M4_FDCAN2 (RCC_APB1EN5_M4FDCAN2EN ) +#define RCC_APB1_PERIPHEN_M7_FDCAN2LP (RCC_APB1EN5_M7FDCAN2LPEN) +#define RCC_APB1_PERIPHEN_M4_FDCAN2LP (RCC_APB1EN5_M4FDCAN2LPEN) +#define RCC_APB1_PERIPHEN_M7_FDCAN5 (RCC_APB1EN5_M7FDCAN5EN ) +#define RCC_APB1_PERIPHEN_M4_FDCAN5 (RCC_APB1EN5_M4FDCAN5EN ) +#define RCC_APB1_PERIPHEN_M7_FDCAN5LP (RCC_APB1EN5_M7FDCAN5LPEN) +#define RCC_APB1_PERIPHEN_M4_FDCAN5LP (RCC_APB1EN5_M4FDCAN5LPEN) +#define RCC_APB1_PERIPHEN_M7_FDCAN6 (RCC_APB1EN5_M7FDCAN6EN ) +#define RCC_APB1_PERIPHEN_M4_FDCAN6 (RCC_APB1EN5_M4FDCAN6EN ) +#define RCC_APB1_PERIPHEN_M7_FDCAN6LP (RCC_APB1EN5_M7FDCAN6LPEN) +#define RCC_APB1_PERIPHEN_M4_FDCAN6LP (RCC_APB1EN5_M4FDCAN6LPEN) +/** AHB2 peripherals enable **/ +#define RCC_AHB2_PERIPHEN_M7_USB1 (RCC_AHB2EN1_M7USB1EN ) +#define RCC_AHB2_PERIPHEN_M4_USB1 (RCC_AHB2EN1_M4USB1EN ) +#define RCC_AHB2_PERIPHEN_M7_USB1LP (RCC_AHB2EN1_M7USB1LPEN ) +#define RCC_AHB2_PERIPHEN_M4_USB1LP (RCC_AHB2EN1_M4USB1LPEN ) +#define RCC_AHB2_PERIPHEN_M7_ECCM2 (RCC_AHB2EN1_M7ECCM2EN ) +#define RCC_AHB2_PERIPHEN_M4_ECCM2 (RCC_AHB2EN1_M4ECCM2EN ) +#define RCC_AHB2_PERIPHEN_M7_ECCM2LP (RCC_AHB2EN1_M7ECCM2LPEN ) +#define RCC_AHB2_PERIPHEN_M4_ECCM2LP (RCC_AHB2EN1_M4ECCM2LPEN ) +#define RCC_AHB2_PERIPHEN_M7_CORDIC (RCC_AHB2EN1_M7CORDICEN ) +#define RCC_AHB2_PERIPHEN_M4_CORDIC (RCC_AHB2EN1_M4CORDICEN ) +#define RCC_AHB2_PERIPHEN_M7_CORDICLP (RCC_AHB2EN1_M7CORDICLPEN ) +#define RCC_AHB2_PERIPHEN_M4_CORDICLP (RCC_AHB2EN1_M4CORDICLPEN ) +#define RCC_AHB2_PERIPHEN_M7_SDPU (RCC_AHB2EN1_M7SDPUEN ) +#define RCC_AHB2_PERIPHEN_M4_SDPU (RCC_AHB2EN1_M4SDPUEN ) +#define RCC_AHB2_PERIPHEN_M7_SDPULP (RCC_AHB2EN1_M7SDPULPEN ) +#define RCC_AHB2_PERIPHEN_M4_SDPULP (RCC_AHB2EN1_M4SDPULPEN ) +#define RCC_AHB2_PERIPHEN_M7_FMAC (RCC_AHB2EN1_M7FMACEN ) +#define RCC_AHB2_PERIPHEN_M4_FMAC (RCC_AHB2EN1_M4FMACEN ) +#define RCC_AHB2_PERIPHEN_M7_FMACLP (RCC_AHB2EN1_M7FMACLPEN ) +#define RCC_AHB2_PERIPHEN_M4_FMACLP (RCC_AHB2EN1_M4FMACLPEN ) + +#define RCC_AHB2_PERIPHEN_M7_DAC56 (RCC_AHB2EN2_M7DAC56EN ) +#define RCC_AHB2_PERIPHEN_M4_DAC56 (RCC_AHB2EN2_M4DAC56EN ) +#define RCC_AHB2_PERIPHEN_M7_DAC56LP (RCC_AHB2EN2_M7DAC56LPEN ) +#define RCC_AHB2_PERIPHEN_M4_DAC56LP (RCC_AHB2EN2_M4DAC56LPEN ) +#define RCC_AHB2_PERIPHEN_M7_DAC34 (RCC_AHB2EN2_M7DAC34EN ) +#define RCC_AHB2_PERIPHEN_M4_DAC34 (RCC_AHB2EN2_M4DAC34EN ) +#define RCC_AHB2_PERIPHEN_M7_DAC34LP (RCC_AHB2EN2_M7DAC34LPEN ) +#define RCC_AHB2_PERIPHEN_M4_DAC34LP (RCC_AHB2EN2_M4DAC34LPEN ) +#define RCC_AHB2_PERIPHEN_M7_ETH1TX (RCC_AHB2EN2_M7ETH1TXEN ) +#define RCC_AHB2_PERIPHEN_M4_ETH1TX (RCC_AHB2EN2_M4ETH1TXEN ) +#define RCC_AHB2_PERIPHEN_M7_ETH1TXLP (RCC_AHB2EN2_M7ETH1TXLPEN ) +#define RCC_AHB2_PERIPHEN_M4_ETH1TXLP (RCC_AHB2EN2_M4ETH1TXLPEN ) +#define RCC_AHB2_PERIPHEN_M7_ETH1RX (RCC_AHB2EN2_M7ETH1RXEN ) +#define RCC_AHB2_PERIPHEN_M4_ETH1RX (RCC_AHB2EN2_M4ETH1RXEN ) +#define RCC_AHB2_PERIPHEN_M7_ETH1RXLP (RCC_AHB2EN2_M7ETH1RXLPEN ) +#define RCC_AHB2_PERIPHEN_M4_ETH1RXLP (RCC_AHB2EN2_M4ETH1RXLPEN ) +#define RCC_AHB2_PERIPHEN_M7_ETH1MAC (RCC_AHB2EN2_M7ETH1MACEN ) +#define RCC_AHB2_PERIPHEN_M4_ETH1MAC (RCC_AHB2EN2_M4ETH1MACEN ) +#define RCC_AHB2_PERIPHEN_M7_ETH1MACLP (RCC_AHB2EN2_M7ETH1MACLPEN) +#define RCC_AHB2_PERIPHEN_M4_ETH1MACLP (RCC_AHB2EN2_M4ETH1MACLPEN) +/** APB2 peripherals enable **/ +#define RCC_APB2_PERIPHEN_M7_ATIM1 (RCC_APB2EN1_M7ATIM1EN ) +#define RCC_APB2_PERIPHEN_M4_ATIM1 (RCC_APB2EN1_M4ATIM1EN ) +#define RCC_APB2_PERIPHEN_M7_ATIM1LP (RCC_APB2EN1_M7ATIM1LPEN ) +#define RCC_APB2_PERIPHEN_M4_ATIM1LP (RCC_APB2EN1_M4ATIM1LPEN ) +#define RCC_APB2_PERIPHEN_M7_ATIM2 (RCC_APB2EN1_M7ATIM2EN ) +#define RCC_APB2_PERIPHEN_M4_ATIM2 (RCC_APB2EN1_M4ATIM2EN ) +#define RCC_APB2_PERIPHEN_M7_ATIM2LP (RCC_APB2EN1_M7ATIM2LPEN ) +#define RCC_APB2_PERIPHEN_M4_ATIM2LP (RCC_APB2EN1_M4ATIM2LPEN ) +#define RCC_APB2_PERIPHEN_M7_GTIMA1 (RCC_APB2EN1_M7GTIMA1EN ) +#define RCC_APB2_PERIPHEN_M4_GTIMA1 (RCC_APB2EN1_M4GTIMA1EN ) +#define RCC_APB2_PERIPHEN_M7_GTIMA1LP (RCC_APB2EN1_M7GTIMA1LPEN ) +#define RCC_APB2_PERIPHEN_M4_GTIMA1LP (RCC_APB2EN1_M4GTIMA1LPEN ) +#define RCC_APB2_PERIPHEN_M7_GTIMA2 (RCC_APB2EN1_M7GTIMA2EN ) +#define RCC_APB2_PERIPHEN_M4_GTIMA2 (RCC_APB2EN1_M4GTIMA2EN ) +#define RCC_APB2_PERIPHEN_M7_GTIMA2LP (RCC_APB2EN1_M7GTIMA2LPEN ) +#define RCC_APB2_PERIPHEN_M4_GTIMA2LP (RCC_APB2EN1_M4GTIMA2LPEN ) +#define RCC_APB2_PERIPHEN_M7_GTIMA3 (RCC_APB2EN1_M7GTIMA3EN ) +#define RCC_APB2_PERIPHEN_M4_GTIMA3 (RCC_APB2EN1_M4GTIMA3EN ) +#define RCC_APB2_PERIPHEN_M7_GTIMA3LP (RCC_APB2EN1_M7GTIMA3LPEN ) +#define RCC_APB2_PERIPHEN_M4_GTIMA3LP (RCC_APB2EN1_M4GTIMA3LPEN ) +#define RCC_APB2_PERIPHEN_M7_SHRTIM1 (RCC_APB2EN1_M7SHRTIM1EN ) +#define RCC_APB2_PERIPHEN_M4_SHRTIM1 (RCC_APB2EN1_M4SHRTIM1EN ) +#define RCC_APB2_PERIPHEN_M7_SHRTIM1LP (RCC_APB2EN1_M7SHRTIM1LPEN) +#define RCC_APB2_PERIPHEN_M4_SHRTIM1LP (RCC_APB2EN1_M4SHRTIM1LPEN) +#define RCC_APB2_PERIPHEN_M7_SHRTIM2 (RCC_APB2EN1_M7SHRTIM2EN ) +#define RCC_APB2_PERIPHEN_M4_SHRTIM2 (RCC_APB2EN1_M4SHRTIM2EN ) +#define RCC_APB2_PERIPHEN_M7_SHRTIM2LP (RCC_APB2EN1_M7SHRTIM2LPEN) +#define RCC_APB2_PERIPHEN_M4_SHRTIM2LP (RCC_APB2EN1_M4SHRTIM2LPEN) + +#define RCC_APB2_PERIPHEN_M7_I2S1 (RCC_APB2EN2_M7I2S1EN ) +#define RCC_APB2_PERIPHEN_M4_I2S1 (RCC_APB2EN2_M4I2S1EN ) +#define RCC_APB2_PERIPHEN_M7_I2S1LP (RCC_APB2EN2_M7I2S1LPEN ) +#define RCC_APB2_PERIPHEN_M4_I2S1LP (RCC_APB2EN2_M4I2S1LPEN ) +#define RCC_APB2_PERIPHEN_M7_I2S2 (RCC_APB2EN2_M7I2S2EN ) +#define RCC_APB2_PERIPHEN_M4_I2S2 (RCC_APB2EN2_M4I2S2EN ) +#define RCC_APB2_PERIPHEN_M7_I2S2LP (RCC_APB2EN2_M7I2S2LPEN ) +#define RCC_APB2_PERIPHEN_M4_I2S2LP (RCC_APB2EN2_M4I2S2LPEN ) +#define RCC_APB2_PERIPHEN_M7_SPI1 (RCC_APB2EN2_M7SPI1EN ) +#define RCC_APB2_PERIPHEN_M4_SPI1 (RCC_APB2EN2_M4SPI1EN ) +#define RCC_APB2_PERIPHEN_M7_SPI1LP (RCC_APB2EN2_M7SPI1LPEN ) +#define RCC_APB2_PERIPHEN_M4_SPI1LP (RCC_APB2EN2_M4SPI1LPEN ) +#define RCC_APB2_PERIPHEN_M7_SPI2 (RCC_APB2EN2_M7SPI2EN ) +#define RCC_APB2_PERIPHEN_M4_SPI2 (RCC_APB2EN2_M4SPI2EN ) +#define RCC_APB2_PERIPHEN_M7_SPI2LP (RCC_APB2EN2_M7SPI2LPEN ) +#define RCC_APB2_PERIPHEN_M4_SPI2LP (RCC_APB2EN2_M4SPI2LPEN ) +#define RCC_APB2_PERIPHEN_M7_DSMU (RCC_APB2EN2_M7DSMUEN ) +#define RCC_APB2_PERIPHEN_M4_DSMU (RCC_APB2EN2_M4DSMUEN ) +#define RCC_APB2_PERIPHEN_M7_DSMULP (RCC_APB2EN2_M7DSMULPEN ) +#define RCC_APB2_PERIPHEN_M4_DSMULP (RCC_APB2EN2_M4DSMULPEN ) +#define RCC_APB2_PERIPHEN_M7_I2C4 (RCC_APB2EN2_M7I2C4EN ) +#define RCC_APB2_PERIPHEN_M4_I2C4 (RCC_APB2EN2_M4I2C4EN ) +#define RCC_APB2_PERIPHEN_M7_I2C4LP (RCC_APB2EN2_M7I2C4LPEN ) +#define RCC_APB2_PERIPHEN_M4_I2C4LP (RCC_APB2EN2_M4I2C4LPEN ) +#define RCC_APB2_PERIPHEN_M7_I2C5 (RCC_APB2EN2_M7I2C5EN ) +#define RCC_APB2_PERIPHEN_M4_I2C5 (RCC_APB2EN2_M4I2C5EN ) +#define RCC_APB2_PERIPHEN_M7_I2C5LP (RCC_APB2EN2_M7I2C5LPEN ) +#define RCC_APB2_PERIPHEN_M4_I2C5LP (RCC_APB2EN2_M4I2C5LPEN ) +#define RCC_APB2_PERIPHEN_M7_I2C6 (RCC_APB2EN2_M7I2C6EN ) +#define RCC_APB2_PERIPHEN_M4_I2C6 (RCC_APB2EN2_M4I2C6EN ) +#define RCC_APB2_PERIPHEN_M7_I2C6LP (RCC_APB2EN2_M7I2C6LPEN ) +#define RCC_APB2_PERIPHEN_M4_I2C6LP (RCC_APB2EN2_M4I2C6LPEN ) + +#define RCC_APB2_PERIPHEN_M7_USART5 (RCC_APB2EN3_M7USART5EN ) +#define RCC_APB2_PERIPHEN_M4_USART5 (RCC_APB2EN3_M4USART5EN ) +#define RCC_APB2_PERIPHEN_M7_USART5LP (RCC_APB2EN3_M7USART5LPEN ) +#define RCC_APB2_PERIPHEN_M4_USART5LP (RCC_APB2EN3_M4USART5LPEN ) +#define RCC_APB2_PERIPHEN_M7_USART6 (RCC_APB2EN3_M7USART6EN ) +#define RCC_APB2_PERIPHEN_M4_USART6 (RCC_APB2EN3_M4USART6EN ) +#define RCC_APB2_PERIPHEN_M7_USART6LP (RCC_APB2EN3_M7USART6LPEN ) +#define RCC_APB2_PERIPHEN_M4_USART6LP (RCC_APB2EN3_M4USART6LPEN ) +#define RCC_APB2_PERIPHEN_M7_USART7 (RCC_APB2EN3_M7USART7EN ) +#define RCC_APB2_PERIPHEN_M4_USART7 (RCC_APB2EN3_M4USART7EN ) +#define RCC_APB2_PERIPHEN_M7_USART7LP (RCC_APB2EN3_M7USART7LPEN ) +#define RCC_APB2_PERIPHEN_M4_USART7LP (RCC_APB2EN3_M4USART7LPEN ) +#define RCC_APB2_PERIPHEN_M7_USART8 (RCC_APB2EN3_M7USART8EN ) +#define RCC_APB2_PERIPHEN_M4_USART8 (RCC_APB2EN3_M4USART8EN ) +#define RCC_APB2_PERIPHEN_M7_USART8LP (RCC_APB2EN3_M7USART8LPEN ) +#define RCC_APB2_PERIPHEN_M4_USART8LP (RCC_APB2EN3_M4USART8LPEN ) +#define RCC_APB2_PERIPHEN_M7_UART13 (RCC_APB2EN3_M7UART13EN ) +#define RCC_APB2_PERIPHEN_M4_UART13 (RCC_APB2EN3_M4UART13EN ) +#define RCC_APB2_PERIPHEN_M7_UART13LP (RCC_APB2EN3_M7UART13LPEN ) +#define RCC_APB2_PERIPHEN_M4_UART13LP (RCC_APB2EN3_M4UART13LPEN ) +#define RCC_APB2_PERIPHEN_M7_UART14 (RCC_APB2EN3_M7UART14EN ) +#define RCC_APB2_PERIPHEN_M4_UART14 (RCC_APB2EN3_M4UART14EN ) +#define RCC_APB2_PERIPHEN_M7_UART14LP (RCC_APB2EN3_M7UART14LPEN ) +#define RCC_APB2_PERIPHEN_M4_UART14LP (RCC_APB2EN3_M4UART14LPEN ) +#define RCC_APB2_PERIPHEN_M7_UART15 (RCC_APB2EN3_M7UART15EN ) +#define RCC_APB2_PERIPHEN_M4_UART15 (RCC_APB2EN3_M4UART15EN ) +#define RCC_APB2_PERIPHEN_M7_UART15LP (RCC_APB2EN3_M7UART15LPEN ) +#define RCC_APB2_PERIPHEN_M4_UART15LP (RCC_APB2EN3_M4UART15LPEN ) + +#define RCC_APB2_PERIPHEN_M7_FDCAN3 (RCC_APB2EN4_M7FDCAN3EN ) +#define RCC_APB2_PERIPHEN_M4_FDCAN3 (RCC_APB2EN4_M4FDCAN3EN ) +#define RCC_APB2_PERIPHEN_M7_FDCAN3LP (RCC_APB2EN4_M7FDCAN3LPEN ) +#define RCC_APB2_PERIPHEN_M4_FDCAN3LP (RCC_APB2EN4_M4FDCAN3LPEN ) +#define RCC_APB2_PERIPHEN_M7_FDCAN4 (RCC_APB2EN4_M7FDCAN4EN ) +#define RCC_APB2_PERIPHEN_M4_FDCAN4 (RCC_APB2EN4_M4FDCAN4EN ) +#define RCC_APB2_PERIPHEN_M7_FDCAN4LP (RCC_APB2EN4_M7FDCAN4LPEN ) +#define RCC_APB2_PERIPHEN_M4_FDCAN4LP (RCC_APB2EN4_M4FDCAN4LPEN ) +#define RCC_APB2_PERIPHEN_M7_FDCAN7 (RCC_APB2EN4_M7FDCAN7EN ) +#define RCC_APB2_PERIPHEN_M4_FDCAN7 (RCC_APB2EN4_M4FDCAN7EN ) +#define RCC_APB2_PERIPHEN_M7_FDCAN7LP (RCC_APB2EN4_M7FDCAN7LPEN ) +#define RCC_APB2_PERIPHEN_M4_FDCAN7LP (RCC_APB2EN4_M4FDCAN7LPEN ) +#define RCC_APB2_PERIPHEN_M7_FDCAN8 (RCC_APB2EN4_M7FDCAN8EN ) +#define RCC_APB2_PERIPHEN_M4_FDCAN8 (RCC_APB2EN4_M4FDCAN8EN ) +#define RCC_APB2_PERIPHEN_M7_FDCAN8LP (RCC_APB2EN4_M7FDCAN8LPEN ) +#define RCC_APB2_PERIPHEN_M4_FDCAN8LP (RCC_APB2EN4_M4FDCAN8LPEN ) +/** AHB5 peripherals enable **/ +#define RCC_AHB5_PERIPHEN_M7_GPIOA (RCC_AHB5EN1_M7GPIOAEN ) +#define RCC_AHB5_PERIPHEN_M4_GPIOA (RCC_AHB5EN1_M4GPIOAEN ) +#define RCC_AHB5_PERIPHEN_M7_GPIOALP (RCC_AHB5EN1_M7GPIOALPEN) +#define RCC_AHB5_PERIPHEN_M4_GPIOALP (RCC_AHB5EN1_M4GPIOALPEN) +#define RCC_AHB5_PERIPHEN_M7_GPIOB (RCC_AHB5EN1_M7GPIOBEN ) +#define RCC_AHB5_PERIPHEN_M4_GPIOB (RCC_AHB5EN1_M4GPIOBEN ) +#define RCC_AHB5_PERIPHEN_M7_GPIOBLP (RCC_AHB5EN1_M7GPIOBLPEN) +#define RCC_AHB5_PERIPHEN_M4_GPIOBLP (RCC_AHB5EN1_M4GPIOBLPEN) +#define RCC_AHB5_PERIPHEN_M7_GPIOC (RCC_AHB5EN1_M7GPIOCEN ) +#define RCC_AHB5_PERIPHEN_M4_GPIOC (RCC_AHB5EN1_M4GPIOCEN ) +#define RCC_AHB5_PERIPHEN_M7_GPIOCLP (RCC_AHB5EN1_M7GPIOCLPEN) +#define RCC_AHB5_PERIPHEN_M4_GPIOCLP (RCC_AHB5EN1_M4GPIOCLPEN) +#define RCC_AHB5_PERIPHEN_M7_GPIOD (RCC_AHB5EN1_M7GPIODEN ) +#define RCC_AHB5_PERIPHEN_M4_GPIOD (RCC_AHB5EN1_M4GPIODEN ) +#define RCC_AHB5_PERIPHEN_M7_GPIODLP (RCC_AHB5EN1_M7GPIODLPEN) +#define RCC_AHB5_PERIPHEN_M4_GPIODLP (RCC_AHB5EN1_M4GPIODLPEN) +#define RCC_AHB5_PERIPHEN_M7_GPIOE (RCC_AHB5EN1_M7GPIOEEN ) +#define RCC_AHB5_PERIPHEN_M4_GPIOE (RCC_AHB5EN1_M4GPIOEEN ) +#define RCC_AHB5_PERIPHEN_M7_GPIOELP (RCC_AHB5EN1_M7GPIOELPEN) +#define RCC_AHB5_PERIPHEN_M4_GPIOELP (RCC_AHB5EN1_M4GPIOELPEN) +#define RCC_AHB5_PERIPHEN_M7_GPIOF (RCC_AHB5EN1_M7GPIOFEN ) +#define RCC_AHB5_PERIPHEN_M4_GPIOF (RCC_AHB5EN1_M4GPIOFEN ) +#define RCC_AHB5_PERIPHEN_M7_GPIOFLP (RCC_AHB5EN1_M7GPIOFLPEN) +#define RCC_AHB5_PERIPHEN_M4_GPIOFLP (RCC_AHB5EN1_M4GPIOFLPEN) +#define RCC_AHB5_PERIPHEN_M7_GPIOG (RCC_AHB5EN1_M7GPIOGEN ) +#define RCC_AHB5_PERIPHEN_M4_GPIOG (RCC_AHB5EN1_M4GPIOGEN ) +#define RCC_AHB5_PERIPHEN_M7_GPIOGLP (RCC_AHB5EN1_M7GPIOGLPEN) +#define RCC_AHB5_PERIPHEN_M4_GPIOGLP (RCC_AHB5EN1_M4GPIOGLPEN) +#define RCC_AHB5_PERIPHEN_M7_GPIOH (RCC_AHB5EN1_M7GPIOHEN ) +#define RCC_AHB5_PERIPHEN_M4_GPIOH (RCC_AHB5EN1_M4GPIOHEN ) +#define RCC_AHB5_PERIPHEN_M7_GPIOHLP (RCC_AHB5EN1_M7GPIOHLPEN) +#define RCC_AHB5_PERIPHEN_M4_GPIOHLP (RCC_AHB5EN1_M4GPIOHLPEN) + +#define RCC_AHB5_PERIPHEN_M7_GPIOI (RCC_AHB5EN2_M7GPIOIEN ) +#define RCC_AHB5_PERIPHEN_M4_GPIOI (RCC_AHB5EN2_M4GPIOIEN ) +#define RCC_AHB5_PERIPHEN_M7_GPIOILP (RCC_AHB5EN2_M7GPIOILPEN) +#define RCC_AHB5_PERIPHEN_M4_GPIOILP (RCC_AHB5EN2_M4GPIOILPEN) +#define RCC_AHB5_PERIPHEN_M7_GPIOJ (RCC_AHB5EN2_M7GPIOJEN ) +#define RCC_AHB5_PERIPHEN_M4_GPIOJ (RCC_AHB5EN2_M4GPIOJEN ) +#define RCC_AHB5_PERIPHEN_M7_GPIOJLP (RCC_AHB5EN2_M7GPIOJLPEN) +#define RCC_AHB5_PERIPHEN_M4_GPIOJLP (RCC_AHB5EN2_M4GPIOJLPEN) +#define RCC_AHB5_PERIPHEN_M7_GPIOK (RCC_AHB5EN2_M7GPIOKEN ) +#define RCC_AHB5_PERIPHEN_M4_GPIOK (RCC_AHB5EN2_M4GPIOKEN ) +#define RCC_AHB5_PERIPHEN_M7_GPIOKLP (RCC_AHB5EN2_M7GPIOKLPEN) +#define RCC_AHB5_PERIPHEN_M4_GPIOKLP (RCC_AHB5EN2_M4GPIOKLPEN) +#define RCC_AHB5_PERIPHEN_M7_ECCM3 (RCC_AHB5EN2_M7ECCM3EN ) +#define RCC_AHB5_PERIPHEN_M4_ECCM3 (RCC_AHB5EN2_M4ECCM3EN ) +#define RCC_AHB5_PERIPHEN_M7_ECCM3LP (RCC_AHB5EN2_M7ECCM3LPEN) +#define RCC_AHB5_PERIPHEN_M4_ECCM3LP (RCC_AHB5EN2_M4ECCM3LPEN) +#define RCC_AHB5_PERIPHEN_PWR (RCC_AHB5EN2_PWREN ) +#define RCC_AHB5_PERIPHEN_PWRLP (RCC_AHB5EN2_PWRLPEN ) +#define RCC_AHB5_PERIPHEN_M7_CRC (RCC_AHB5EN2_M7CRCEN ) +#define RCC_AHB5_PERIPHEN_M4_CRC (RCC_AHB5EN2_M4CRCEN ) +#define RCC_AHB5_PERIPHEN_M7_CRCLP (RCC_AHB5EN2_M7CRCLPEN ) +#define RCC_AHB5_PERIPHEN_M4_CRCLP (RCC_AHB5EN2_M4CRCLPEN ) +#define RCC_AHB5_PERIPHEN_M7_SEMA4 (RCC_AHB5EN2_M7SEMA4EN ) +#define RCC_AHB5_PERIPHEN_M4_SEMA4 (RCC_AHB5EN2_M4SEMA4EN ) +#define RCC_AHB5_PERIPHEN_M7_SEMA4LP (RCC_AHB5EN2_M7SEMA4LPEN) +#define RCC_AHB5_PERIPHEN_M4_SEMA4LP (RCC_AHB5EN2_M4SEMA4LPEN) +#define RCC_AHB5_PERIPHEN_M7_AFIO (RCC_AHB5EN2_M7AFIOEN ) +#define RCC_AHB5_PERIPHEN_M4_AFIO (RCC_AHB5EN2_M4AFIOEN ) +#define RCC_AHB5_PERIPHEN_M7_AFIOLP (RCC_AHB5EN2_M7AFIOLPEN ) +#define RCC_AHB5_PERIPHEN_M4_AFIOLP (RCC_AHB5EN2_M4AFIOLPEN ) +/** APB5 peripherals enable **/ +#define RCC_APB5_PERIPHEN_M7_ATIM3 (RCC_APB5EN1_M7ATIM3EN ) +#define RCC_APB5_PERIPHEN_M4_ATIM3 (RCC_APB5EN1_M4ATIM3EN ) +#define RCC_APB5_PERIPHEN_M7_ATIM3LP (RCC_APB5EN1_M7ATIM3LPEN ) +#define RCC_APB5_PERIPHEN_M4_ATIM3LP (RCC_APB5EN1_M4ATIM3LPEN ) +#define RCC_APB5_PERIPHEN_M7_ATIM4 (RCC_APB5EN1_M7ATIM4EN ) +#define RCC_APB5_PERIPHEN_M4_ATIM4 (RCC_APB5EN1_M4ATIM4EN ) +#define RCC_APB5_PERIPHEN_M7_ATIM4LP (RCC_APB5EN1_M7ATIM4LPEN ) +#define RCC_APB5_PERIPHEN_M4_ATIM4LP (RCC_APB5EN1_M4ATIM4LPEN ) +#define RCC_APB5_PERIPHEN_M7_AFEC (RCC_APB5EN1_M7AFECEN ) +#define RCC_APB5_PERIPHEN_M4_AFEC (RCC_APB5EN1_M4AFECEN ) +#define RCC_APB5_PERIPHEN_M7_AFECLP (RCC_APB5EN1_M7AFECLPEN ) +#define RCC_APB5_PERIPHEN_M4_AFECLP (RCC_APB5EN1_M4AFECLPEN ) +#define RCC_APB5_PERIPHEN_M7_SPI4 (RCC_APB5EN1_M7SPI4EN ) +#define RCC_APB5_PERIPHEN_M4_SPI4 (RCC_APB5EN1_M4SPI4EN ) +#define RCC_APB5_PERIPHEN_M7_SPI4LP (RCC_APB5EN1_M7SPI4LPEN ) +#define RCC_APB5_PERIPHEN_M4_SPI4LP (RCC_APB5EN1_M4SPI4LPEN ) +#define RCC_APB5_PERIPHEN_M7_SPI5 (RCC_APB5EN1_M7SPI5EN ) +#define RCC_APB5_PERIPHEN_M4_SPI5 (RCC_APB5EN1_M4SPI5EN ) +#define RCC_APB5_PERIPHEN_M7_SPI5LP (RCC_APB5EN1_M7SPI5LPEN ) +#define RCC_APB5_PERIPHEN_M4_SPI5LP (RCC_APB5EN1_M4SPI5LPEN ) +#define RCC_APB5_PERIPHEN_M7_SPI6 (RCC_APB5EN1_M7SPI6EN ) +#define RCC_APB5_PERIPHEN_M4_SPI6 (RCC_APB5EN1_M4SPI6EN ) +#define RCC_APB5_PERIPHEN_M7_SPI6LP (RCC_APB5EN1_M7SPI6LPEN ) +#define RCC_APB5_PERIPHEN_M4_SPI6LP (RCC_APB5EN1_M4SPI6LPEN ) +#define RCC_APB5_PERIPHEN_M7_SPI7 (RCC_APB5EN1_M7SPI7EN ) +#define RCC_APB5_PERIPHEN_M4_SPI7 (RCC_APB5EN1_M4SPI7EN ) +#define RCC_APB5_PERIPHEN_M7_SPI7LP (RCC_APB5EN1_M7SPI7LPEN ) +#define RCC_APB5_PERIPHEN_M4_SPI7LP (RCC_APB5EN1_M4SPI7LPEN ) + +#define RCC_APB5_PERIPHEN_M7_I2C7 (RCC_APB5EN2_M7I2C7EN ) +#define RCC_APB5_PERIPHEN_M4_I2C7 (RCC_APB5EN2_M4I2C7EN ) +#define RCC_APB5_PERIPHEN_M7_I2C7LP (RCC_APB5EN2_M7I2C7LPEN ) +#define RCC_APB5_PERIPHEN_M4_I2C7LP (RCC_APB5EN2_M4I2C7LPEN ) +#define RCC_APB5_PERIPHEN_M7_I2C8 (RCC_APB5EN2_M7I2C8EN ) +#define RCC_APB5_PERIPHEN_M4_I2C8 (RCC_APB5EN2_M4I2C8EN ) +#define RCC_APB5_PERIPHEN_M7_I2C8LP (RCC_APB5EN2_M7I2C8LPEN ) +#define RCC_APB5_PERIPHEN_M4_I2C8LP (RCC_APB5EN2_M4I2C8LPEN ) +#define RCC_APB5_PERIPHEN_M7_I2C9 (RCC_APB5EN2_M7I2C9EN ) +#define RCC_APB5_PERIPHEN_M4_I2C9 (RCC_APB5EN2_M4I2C9EN ) +#define RCC_APB5_PERIPHEN_M7_I2C9LP (RCC_APB5EN2_M7I2C9LPEN ) +#define RCC_APB5_PERIPHEN_M4_I2C9LP (RCC_APB5EN2_M4I2C9LPEN ) +#define RCC_APB5_PERIPHEN_M7_I2C10 (RCC_APB5EN2_M7I2C10EN ) +#define RCC_APB5_PERIPHEN_M4_I2C10 (RCC_APB5EN2_M4I2C10EN ) +#define RCC_APB5_PERIPHEN_M7_I2C10LP (RCC_APB5EN2_M7I2C10LPEN ) +#define RCC_APB5_PERIPHEN_M4_I2C10LP (RCC_APB5EN2_M4I2C10LPEN ) +#define RCC_APB5_PERIPHEN_EXTI (RCC_APB5EN2_EXTIEN ) +#define RCC_APB5_PERIPHEN_EXTILP (RCC_APB5EN2_EXTILPEN ) +#define RCC_APB5_PERIPHEN_M7_RTCPCLK (RCC_APB5EN2_M7RTCPCLKEN ) +#define RCC_APB5_PERIPHEN_M4_RTCPCLK (RCC_APB5EN2_M4RTCPCLKEN ) +#define RCC_APB5_PERIPHEN_M7_RTCPCLKLP (RCC_APB5EN2_M7RTCPCLKLPEN) +#define RCC_APB5_PERIPHEN_M4_RTCPCLKLP (RCC_APB5EN2_M4RTCPCLKLPEN) +#define RCC_APB5_PERIPHEN_IWDG1PCLK (RCC_APB5EN2_IWDG1PCLKEN ) +#define RCC_APB5_PERIPHEN_IWDG1PCLKLP (RCC_APB5EN2_IWDG1PCLKLPEN) +#define RCC_APB5_PERIPHEN_IWDG2PCLK (RCC_APB5EN2_IWDG2PCLKEN ) +#define RCC_APB5_PERIPHEN_IWDG2PCLKLP (RCC_APB5EN2_IWDG2PCLKLPEN) +/** APB9 peripherals enable **/ +#define RCC_AHB9_PERIPHEN_M7_ESC (RCC_AHB9EN1_M7ESCEN ) +#define RCC_AHB9_PERIPHEN_M4_ESC (RCC_AHB9EN1_M4ESCEN ) +#define RCC_AHB9_PERIPHEN_M7_ESCLP (RCC_AHB9EN1_M7ESCLPEN) +#define RCC_AHB9_PERIPHEN_M4_ESCLP (RCC_AHB9EN1_M4ESCLPEN) +/** Retention domain peripherals enable **/ +#define RCC_RD_PERIPHEN_M7_LPTIM1 (RCC_RDEN1_M7LPTIM1EN ) +#define RCC_RD_PERIPHEN_M4_LPTIM1 (RCC_RDEN1_M4LPTIM1EN ) +#define RCC_RD_PERIPHEN_M7_LPTIM1LP (RCC_RDEN1_M7LPTIM1LPEN ) +#define RCC_RD_PERIPHEN_M4_LPTIM1LP (RCC_RDEN1_M4LPTIM1LPEN ) +#define RCC_RD_PERIPHEN_M7_LPTIM2 (RCC_RDEN1_M7LPTIM2EN ) +#define RCC_RD_PERIPHEN_M4_LPTIM2 (RCC_RDEN1_M4LPTIM2EN ) +#define RCC_RD_PERIPHEN_M7_LPTIM2LP (RCC_RDEN1_M7LPTIM2LPEN ) +#define RCC_RD_PERIPHEN_M4_LPTIM2LP (RCC_RDEN1_M4LPTIM2LPEN ) +#define RCC_RD_PERIPHEN_M7_LPTIM3 (RCC_RDEN1_M7LPTIM3EN ) +#define RCC_RD_PERIPHEN_M4_LPTIM3 (RCC_RDEN1_M4LPTIM3EN ) +#define RCC_RD_PERIPHEN_M7_LPTIM3LP (RCC_RDEN1_M7LPTIM3LPEN ) +#define RCC_RD_PERIPHEN_M4_LPTIM3LP (RCC_RDEN1_M4LPTIM3LPEN ) +#define RCC_RD_PERIPHEN_M7_LPTIM4 (RCC_RDEN1_M7LPTIM4EN ) +#define RCC_RD_PERIPHEN_M4_LPTIM4 (RCC_RDEN1_M4LPTIM4EN ) +#define RCC_RD_PERIPHEN_M7_LPTIM4LP (RCC_RDEN1_M7LPTIM4LPEN ) +#define RCC_RD_PERIPHEN_M4_LPTIM4LP (RCC_RDEN1_M4LPTIM4LPEN ) +#define RCC_RD_PERIPHEN_M7_LPTIM5 (RCC_RDEN1_M7LPTIM5EN ) +#define RCC_RD_PERIPHEN_M4_LPTIM5 (RCC_RDEN1_M4LPTIM5EN ) +#define RCC_RD_PERIPHEN_M7_LPTIM5LP (RCC_RDEN1_M7LPTIM5LPEN ) +#define RCC_RD_PERIPHEN_M4_LPTIM5LP (RCC_RDEN1_M4LPTIM5LPEN ) +#define RCC_RD_PERIPHEN_M7_LPUART1 (RCC_RDEN1_M7LPUART1EN ) +#define RCC_RD_PERIPHEN_M4_LPUART1 (RCC_RDEN1_M4LPUART1EN ) +#define RCC_RD_PERIPHEN_M7_LPUART1LP (RCC_RDEN1_M7LPUART1LPEN) +#define RCC_RD_PERIPHEN_M4_LPUART1LP (RCC_RDEN1_M4LPUART1LPEN) +#define RCC_RD_PERIPHEN_M7_LPUART2 (RCC_RDEN1_M7LPUART2EN ) +#define RCC_RD_PERIPHEN_M4_LPUART2 (RCC_RDEN1_M4LPUART2EN ) +#define RCC_RD_PERIPHEN_M7_LPUART2LP (RCC_RDEN1_M7LPUART2LPEN) +#define RCC_RD_PERIPHEN_M4_LPUART2LP (RCC_RDEN1_M4LPUART2LPEN) + +#define RCC_RD_PERIPHEN_M7_COMP (RCC_RDEN2_M7COMPEN ) +#define RCC_RD_PERIPHEN_M4_COMP (RCC_RDEN2_M4COMPEN ) +#define RCC_RD_PERIPHEN_M7_COMPLP (RCC_RDEN2_M7COMPLPEN ) +#define RCC_RD_PERIPHEN_M4_COMPLP (RCC_RDEN2_M4COMPLPEN ) +/** AXI peripherals enable **/ +#define RCC_AXI_PERIPHEN_M7_JPEGD (RCC_AXIEN1_M7JPEGDEN ) +#define RCC_AXI_PERIPHEN_M4_JPEGD (RCC_AXIEN1_M4JPEGDEN ) +#define RCC_AXI_PERIPHEN_M7_JPEGDLP (RCC_AXIEN1_M7JPEGDLPEN ) +#define RCC_AXI_PERIPHEN_M4_JPEGDLP (RCC_AXIEN1_M4JPEGDLPEN ) +#define RCC_AXI_PERIPHEN_M7_JPEGE (RCC_AXIEN1_M7JPEGEEN ) +#define RCC_AXI_PERIPHEN_M4_JPEGE (RCC_AXIEN1_M4JPEGEEN ) +#define RCC_AXI_PERIPHEN_M7_JPEGELP (RCC_AXIEN1_M7JPEGELPEN ) +#define RCC_AXI_PERIPHEN_M4_JPEGELP (RCC_AXIEN1_M4JPEGELPEN ) +#define RCC_AXI_PERIPHEN_M7_DMAMUX2 (RCC_AXIEN1_M7DMAMUX2EN ) +#define RCC_AXI_PERIPHEN_M4_DMAMUX2 (RCC_AXIEN1_M4DMAMUX2EN ) +#define RCC_AXI_PERIPHEN_M7_DMAMUX2LP (RCC_AXIEN1_M7DMAMUX2LPEN) +#define RCC_AXI_PERIPHEN_M4_DMAMUX2LP (RCC_AXIEN1_M4DMAMUX2LPEN) +#define RCC_AXI_PERIPHEN_M7_MDMA (RCC_AXIEN1_M7MDMAEN ) +#define RCC_AXI_PERIPHEN_M4_MDMA (RCC_AXIEN1_M4MDMAEN ) +#define RCC_AXI_PERIPHEN_M7_MDMALP (RCC_AXIEN1_M7MDMALPEN ) +#define RCC_AXI_PERIPHEN_M4_MDMALP (RCC_AXIEN1_M4MDMALPEN ) +#define RCC_AXI_PERIPHEN_M7_SDMMC1 (RCC_AXIEN1_M7SDMMC1EN ) +#define RCC_AXI_PERIPHEN_M4_SDMMC1 (RCC_AXIEN1_M4SDMMC1EN ) +#define RCC_AXI_PERIPHEN_M7_SDMMC1LP (RCC_AXIEN1_M7SDMMC1LPEN ) +#define RCC_AXI_PERIPHEN_M4_SDMMC1LP (RCC_AXIEN1_M4SDMMC1LPEN ) +#define RCC_AXI_PERIPHEN_M7_ECCM1 (RCC_AXIEN1_M7ECCM1EN ) +#define RCC_AXI_PERIPHEN_M4_ECCM1 (RCC_AXIEN1_M4ECCM1EN ) +#define RCC_AXI_PERIPHEN_M7_ECCM1LP (RCC_AXIEN1_M7ECCM1LPEN ) +#define RCC_AXI_PERIPHEN_M4_ECCM1LP (RCC_AXIEN1_M4ECCM1LPEN ) +#define RCC_AXI_PERIPHEN_M7_OTPC (RCC_AXIEN1_M7OTPCEN ) +#define RCC_AXI_PERIPHEN_M4_OTPC (RCC_AXIEN1_M4OTPCEN ) +#define RCC_AXI_PERIPHEN_M7_OTPCLP (RCC_AXIEN1_M7OTPCLPEN ) +#define RCC_AXI_PERIPHEN_M4_OTPCLP (RCC_AXIEN1_M4OTPCLPEN ) + +#define RCC_AXI_PERIPHEN_M7_DSI (RCC_AXIEN2_M7DSIEN ) +#define RCC_AXI_PERIPHEN_M4_DSI (RCC_AXIEN2_M4DSIEN ) +#define RCC_AXI_PERIPHEN_M7_DSILP (RCC_AXIEN2_M7DSILPEN ) +#define RCC_AXI_PERIPHEN_M4_DSILP (RCC_AXIEN2_M4DSILPEN ) +#define RCC_AXI_PERIPHEN_M7_LCDC (RCC_AXIEN2_M7LCDCEN ) +#define RCC_AXI_PERIPHEN_M4_LCDC (RCC_AXIEN2_M4LCDCEN ) +#define RCC_AXI_PERIPHEN_M7_LCDCLP (RCC_AXIEN2_M7LCDCLPEN ) +#define RCC_AXI_PERIPHEN_M4_LCDCLP (RCC_AXIEN2_M4LCDCLPEN ) +#define RCC_AXI_PERIPHEN_M7_LCDCAPB (RCC_AXIEN2_M7LCDCAPBEN ) +#define RCC_AXI_PERIPHEN_M4_LCDCAPB (RCC_AXIEN2_M4LCDCAPBEN ) +#define RCC_AXI_PERIPHEN_M7_LCDCAPBLP (RCC_AXIEN2_M7LCDCAPBLPEN ) +#define RCC_AXI_PERIPHEN_M4_LCDCAPBLP (RCC_AXIEN2_M4LCDCAPBLPEN ) +#define RCC_AXI_PERIPHEN_M7_DVP1 (RCC_AXIEN2_M7DVP1EN ) +#define RCC_AXI_PERIPHEN_M4_DVP1 (RCC_AXIEN2_M4DVP1EN ) +#define RCC_AXI_PERIPHEN_M7_DVP1LP (RCC_AXIEN2_M7DVP1LPEN ) +#define RCC_AXI_PERIPHEN_M4_DVP1LP (RCC_AXIEN2_M4DVP1LPEN ) +#define RCC_AXI_PERIPHEN_M7_DVP1APB (RCC_AXIEN2_M7DVP1APBEN ) +#define RCC_AXI_PERIPHEN_M4_DVP1APB (RCC_AXIEN2_M4DVP1APBEN ) +#define RCC_AXI_PERIPHEN_M7_DVP1APBLP (RCC_AXIEN2_M7DVP1APBLPEN) +#define RCC_AXI_PERIPHEN_M4_DVP1APBLP (RCC_AXIEN2_M4DVP1APBLPEN) +#define RCC_AXI_PERIPHEN_M7_DVP2 (RCC_AXIEN2_M7DVP2EN ) +#define RCC_AXI_PERIPHEN_M4_DVP2 (RCC_AXIEN2_M4DVP2EN ) +#define RCC_AXI_PERIPHEN_M7_DVP2LP (RCC_AXIEN2_M7DVP2LPEN ) +#define RCC_AXI_PERIPHEN_M4_DVP2LP (RCC_AXIEN2_M4DVP2LPEN ) +#define RCC_AXI_PERIPHEN_M7_DVP2APB (RCC_AXIEN2_M7DVP2APBEN ) +#define RCC_AXI_PERIPHEN_M4_DVP2APB (RCC_AXIEN2_M4DVP2APBEN ) +#define RCC_AXI_PERIPHEN_M7_DVP2APBLP (RCC_AXIEN2_M7DVP2APBLPEN) +#define RCC_AXI_PERIPHEN_M4_DVP2APBLP (RCC_AXIEN2_M4DVP2APBLPEN) +#define RCC_AXI_PERIPHEN_M7_WWDG1 (RCC_AXIEN2_M7WWDG1EN ) +#define RCC_AXI_PERIPHEN_M4_WWDG1 (RCC_AXIEN2_M4WWDG1EN ) +#define RCC_AXI_PERIPHEN_M7_WWDG1LP (RCC_AXIEN2_M7WWDG1LPEN ) +#define RCC_AXI_PERIPHEN_M4_WWDG1LP (RCC_AXIEN2_M4WWDG1LPEN ) + +#define RCC_AXI_PERIPHEN_M7_TASRAM2 (RCC_AXIEN3_M7TASRAM2EN ) +#define RCC_AXI_PERIPHEN_M4_TASRAM2 (RCC_AXIEN3_M4TASRAM2EN ) +#define RCC_AXI_PERIPHEN_M7_TASRAM2LP (RCC_AXIEN3_M7TASRAM2LPEN) +#define RCC_AXI_PERIPHEN_M4_TASRAM2LP (RCC_AXIEN3_M4TASRAM2LPEN) +#define RCC_AXI_PERIPHEN_M7_TASRAM3 (RCC_AXIEN3_M7TASRAM3EN ) +#define RCC_AXI_PERIPHEN_M4_TASRAM3 (RCC_AXIEN3_M4TASRAM3EN ) +#define RCC_AXI_PERIPHEN_M7_TASRAM3LP (RCC_AXIEN3_M7TASRAM3LPEN) +#define RCC_AXI_PERIPHEN_M4_TASRAM3LP (RCC_AXIEN3_M4TASRAM3LPEN) +#define RCC_AXI_PERIPHEN_M7_TCM (RCC_AXIEN3_M7TCMEN ) +#define RCC_AXI_PERIPHEN_M4_TCM (RCC_AXIEN3_M4TCMEN ) +#define RCC_AXI_PERIPHEN_M7_TCMLP (RCC_AXIEN3_M7TCMLPEN ) +#define RCC_AXI_PERIPHEN_M4_TCMLP (RCC_AXIEN3_M4TCMLPEN ) +#define RCC_AXI_PERIPHEN_M7_TCMAXI (RCC_AXIEN3_M7TCMAXIEN ) +#define RCC_AXI_PERIPHEN_M4_TCMAXI (RCC_AXIEN3_M4TCMAXIEN ) +#define RCC_AXI_PERIPHEN_M7_TCMAXILP (RCC_AXIEN3_M7TCMAXILPEN ) +#define RCC_AXI_PERIPHEN_M4_TCMAXILP (RCC_AXIEN3_M4TCMAXILPEN ) +#define RCC_AXI_PERIPHEN_M7_TCMAPB (RCC_AXIEN3_M7TCMAPBEN ) +#define RCC_AXI_PERIPHEN_M4_TCMAPB (RCC_AXIEN3_M4TCMAPBEN ) +#define RCC_AXI_PERIPHEN_M7_TCMAPBLP (RCC_AXIEN3_M7TCMAPBLPEN ) +#define RCC_AXI_PERIPHEN_M4_TCMAPBLP (RCC_AXIEN3_M4TCMAPBLPEN ) +#define RCC_AXI_PERIPHEN_M7_ASRAM1 (RCC_AXIEN3_M7ASRAM1EN ) +#define RCC_AXI_PERIPHEN_M4_ASRAM1 (RCC_AXIEN3_M4ASRAM1EN ) +#define RCC_AXI_PERIPHEN_M7_ASRAM1LP (RCC_AXIEN3_M7ASRAM1LPEN ) +#define RCC_AXI_PERIPHEN_M4_ASRAM1LP (RCC_AXIEN3_M4ASRAM1LPEN ) +#define RCC_AXI_PERIPHEN_M7_AXIROM (RCC_AXIEN3_M7AXIROMEN ) +#define RCC_AXI_PERIPHEN_M4_AXIROM (RCC_AXIEN3_M4AXIROMEN ) +#define RCC_AXI_PERIPHEN_M7_AXIROMLP (RCC_AXIEN3_M7AXIROMLPEN ) +#define RCC_AXI_PERIPHEN_M4_AXIROMLP (RCC_AXIEN3_M4AXIROMLPEN ) +#define RCC_AXI_PERIPHEN_M7_GPU (RCC_AXIEN3_M7GPUEN ) +#define RCC_AXI_PERIPHEN_M4_GPU (RCC_AXIEN3_M4GPUEN ) +#define RCC_AXI_PERIPHEN_M7_GPULP (RCC_AXIEN3_M7GPULPEN ) +#define RCC_AXI_PERIPHEN_M4_GPULP (RCC_AXIEN3_M4GPULPEN ) + +#define RCC_AXI_PERIPHEN_M7_XSPI1 (RCC_AXIEN4_M7XSPI1EN ) +#define RCC_AXI_PERIPHEN_M4_XSPI1 (RCC_AXIEN4_M4XSPI1EN ) +#define RCC_AXI_PERIPHEN_M7_XSPI1LP (RCC_AXIEN4_M7XSPI1LPEN ) +#define RCC_AXI_PERIPHEN_M4_XSPI1LP (RCC_AXIEN4_M4XSPI1LPEN ) +#define RCC_AXI_PERIPHEN_M7_XSPI2 (RCC_AXIEN4_M7XSPI2EN ) +#define RCC_AXI_PERIPHEN_M4_XSPI2 (RCC_AXIEN4_M4XSPI2EN ) +#define RCC_AXI_PERIPHEN_M7_XSPI2LP (RCC_AXIEN4_M7XSPI2LPEN ) +#define RCC_AXI_PERIPHEN_M4_XSPI2LP (RCC_AXIEN4_M4XSPI2LPEN ) +#define RCC_AXI_PERIPHEN_M7_FEMC (RCC_AXIEN4_M7FEMCEN ) +#define RCC_AXI_PERIPHEN_M4_FEMC (RCC_AXIEN4_M4FEMCEN ) +#define RCC_AXI_PERIPHEN_M7_FEMCLP (RCC_AXIEN4_M7FEMCLPEN ) +#define RCC_AXI_PERIPHEN_M4_FEMCLP (RCC_AXIEN4_M4FEMCLPEN ) +#define RCC_AXI_PERIPHEN_M7_SDRAM (RCC_AXIEN4_M7SDRAMEN ) +#define RCC_AXI_PERIPHEN_M4_SDRAM (RCC_AXIEN4_M4SDRAMEN ) +#define RCC_AXI_PERIPHEN_M7_SDRAMLP (RCC_AXIEN4_M7SDRAMLPEN ) +#define RCC_AXI_PERIPHEN_M4_SDRAMLP (RCC_AXIEN4_M4SDRAMLPEN ) +#define RCC_AXI_PERIPHEN_M7_DSIULPS (RCC_AXIEN4_M7DSIULPSEN ) +#define RCC_AXI_PERIPHEN_M4_DSIULPS (RCC_AXIEN4_M4DSIULPSEN ) +#define RCC_AXI_PERIPHEN_M7_DSIULPSLP (RCC_AXIEN4_M7DSIULPSLPEN) +#define RCC_AXI_PERIPHEN_M4_DSIULPSLP (RCC_AXIEN4_M4DSIULPSLPEN) + +/** CFG2 register peripherals enable **/ +#define RCC_CFG2_PERIPHEN_M4_CAHI (RCC_CFG2_M4CAHIEN ) +#define RCC_CFG2_PERIPHEN_M4_CAHIPCLK (RCC_CFG2_M4CAHIPCLKEN ) +#define RCC_CFG2_PERIPHEN_M4_CAHD (RCC_CFG2_M4CAHDEN ) +#define RCC_CFG2_PERIPHEN_M4_CAHDPCLK (RCC_CFG2_M4CAHDPCLKEN ) +#define RCC_CFG2_PERIPHEN_M7_MMU (RCC_CFG2_M7MMUEN ) +#define RCC_CFG2_PERIPHEN_M7_MMULP (RCC_CFG2_M7MMULPEN ) +#define RCC_CFG2_PERIPHEN_M4_MMU (RCC_CFG2_M4MMUEN ) +#define RCC_CFG2_PERIPHEN_M4_MMULP (RCC_CFG2_M4MMULPEN ) +#define RCC_CFG2_PERIPHEN_M7_SRAMBKP (RCC_CFG2_M7SRAMBKPEN ) +#define RCC_CFG2_PERIPHEN_M4_SRAMBKP (RCC_CFG2_M4SRAMBKPEN ) +#define RCC_CFG2_PERIPHEN_M7_SRAMBKPLP (RCC_CFG2_M7SRAMBKPLPEN) +#define RCC_CFG2_PERIPHEN_M4_SRAMBKPLP (RCC_CFG2_M4SRAMBKPLPEN) +#define RCC_CFG2_PERIPHEN_M7_SRAM1 (RCC_CFG2_M7SRAM1EN ) +#define RCC_CFG2_PERIPHEN_M4_SRAM1 (RCC_CFG2_M4SRAM1EN ) +#define RCC_CFG2_PERIPHEN_M7_SRAM1LP (RCC_CFG2_M7SRAM1LPEN ) +#define RCC_CFG2_PERIPHEN_M4_SRAM1LP (RCC_CFG2_M4SRAM1LPEN ) +#define RCC_CFG2_PERIPHEN_M7_SRAM2 (RCC_CFG2_M7SRAM2EN ) +#define RCC_CFG2_PERIPHEN_M4_SRAM2 (RCC_CFG2_M4SRAM2EN ) +#define RCC_CFG2_PERIPHEN_M7_SRAM2LP (RCC_CFG2_M7SRAM2LPEN ) +#define RCC_CFG2_PERIPHEN_M4_SRAM2LP (RCC_CFG2_M4SRAM2LPEN ) +#define RCC_CFG2_PERIPHEN_M7_SRAM3 (RCC_CFG2_M7SRAM3EN ) +#define RCC_CFG2_PERIPHEN_M4_SRAM3 (RCC_CFG2_M4SRAM3EN ) +#define RCC_CFG2_PERIPHEN_M7_SRAM3LP (RCC_CFG2_M7SRAM3LPEN ) +#define RCC_CFG2_PERIPHEN_M4_SRAM3LP (RCC_CFG2_M4SRAM3LPEN ) +#define RCC_CFG2_PERIPHEN_M7_SRAM4 (RCC_CFG2_M7SRAM4EN ) +#define RCC_CFG2_PERIPHEN_M4_SRAM4 (RCC_CFG2_M4SRAM4EN ) +#define RCC_CFG2_PERIPHEN_M7_SRAM4LP (RCC_CFG2_M7SRAM4LPEN ) +#define RCC_CFG2_PERIPHEN_M4_SRAM4LP (RCC_CFG2_M4SRAM4LPEN ) + +/** CFG4 register peripherals enable **/ +#define RCC_CFG4_PERIPHEN_AHB1BUS (RCC_CFG4_AHB1CLKEN ) +#define RCC_CFG4_PERIPHEN_AHB2BUS (RCC_CFG4_AHB2CLKEN ) +#define RCC_CFG4_PERIPHEN_AHB5BUS (RCC_CFG4_AHB5CLKEN ) +#define RCC_CFG4_PERIPHEN_AHB6BUS (RCC_CFG4_AHB6CLKEN ) +#define RCC_CFG4_PERIPHEN_AXIBUS (RCC_CFG4_AXICLKEN ) +#define RCC_CFG4_PERIPHEN_APB1BUS (RCC_CFG4_APB1CLKEN ) +#define RCC_CFG4_PERIPHEN_APB2BUS (RCC_CFG4_APB2CLKEN ) +#define RCC_CFG4_PERIPHEN_APB5BUS (RCC_CFG4_APB5CLKEN ) +#define RCC_CFG4_PERIPHEN_APB6BUS (RCC_CFG4_APB6CLKEN ) +#define RCC_CFG4_PERIPHEN_AHB9BUS (RCC_CFG4_AHB9CLKEN ) +#define RCC_CFG4_PERIPHEN_M7AXIMATRIX_GPV (RCC_CFG4_AXIMM7GCLKEN) +#define RCC_CFG4_PERIPHEN_M4AXIMATRIX_GPV (RCC_CFG4_AXIMM4GCLKEN) +#define RCC_CFG4_PERIPHEN_HSICG (RCC_CFG4_HSICGEN ) +#define RCC_CFG4_PERIPHEN_HSIKERCG (RCC_CFG4_HSIKERCGEN ) +#define RCC_CFG4_PERIPHEN_HSECG (RCC_CFG4_HSECGEN ) +#define RCC_CFG4_PERIPHEN_HSEKERCG (RCC_CFG4_HSEKERCGEN ) +#define RCC_CFG4_PERIPHEN_MSICG (RCC_CFG4_MSICGEN ) +#define RCC_CFG4_PERIPHEN_MSIKERCG (RCC_CFG4_MSIKERCGEN ) +#define RCC_CFG4_PERIPHEN_M7AXIMATRIX (RCC_CFG4_AXIMM7CLKEN ) +#define RCC_CFG4_PERIPHEN_AXIGGPV (RCC_CFG4_AXIGCLKEN ) +#define RCC_CFG4_PERIPHEN_M4AXIMATRIX (RCC_CFG4_AXIMM4CLKEN ) +#define RCC_CFG4_PERIPHEN_M7DCMUCLK (RCC_CFG4_DCMUM7CLKEN ) +#define RCC_CFG4_PERIPHEN_M4DCMUCLK (RCC_CFG4_DCMUM4CLKEN ) +#define RCC_CFG4_PERIPHEN_AHBMATRIX1 (RCC_CFG4_AHBM1CLKEN ) +#define RCC_CFG4_PERIPHEN_AHBMATRIX2 (RCC_CFG4_AHBM2CLKEN ) +#define RCC_CFG4_PERIPHEN_AHBMATRIX3 (RCC_CFG4_AHBM3CLKEN ) + +/** CFG5 register peripherals enable **/ +#define RCC_CFG5_PERIPHEN_M7_SRAM5 (RCC_CFG5_M7SRAM5EN ) +#define RCC_CFG5_PERIPHEN_M4_SRAM5 (RCC_CFG5_M4SRAM5EN ) +#define RCC_CFG5_PERIPHEN_M7_SRAM5LP (RCC_CFG5_M7SRAM5LPEN ) +#define RCC_CFG5_PERIPHEN_M4_SRAM5LP (RCC_CFG5_M4SRAM5LPEN ) + + +/** HSE_configuration **/ +#define RCC_HSE_DISABLE (RCC_REG_BIT_MASK) +#define RCC_HSE_ENABLE (RCC_SRCCTRL1_HSEEN) +#define RCC_HSE_BYPASS (RCC_SRCCTRL1_HSEBP) +#define RCC_HSE_RDCNTEN (RCC_SRCCTRL1_HSERDCNTEN) +#define RCC_HSE_STABLE_FLAG (RCC_SRCCTRL1_HSERDF) + +/** LSI_configuration **/ +#define RCC_LSI_ENABLE (RCC_BDCTRL_LSIEN) +#define RCC_LSIRDY_ENABLE (RCC_BDCTRL_LSIRDEN) +#define RCC_LSI_STABLE_FLAG (RCC_BDCTRL_LSIRDF|RCC_BDCTRL_AFELSIRDF) + +#define RCC_SECLSI_ENABLE (RCC_BDCTRL_LSISECEN) +#define RCC_SECLSI_STABLE_FLAG (RCC_BDCTRL_LSISECRDF) + +/** HSI_configuration **/ +#define RCC_HSI_ENABLE (RCC_SRCCTRL1_HSIEN) +#define RCC_HSI_STABLE_FLAG (RCC_SRCCTRL1_HSIRDF|RCC_SRCCTRL1_AFEHSIRDF) + +/** MSI_configuration **/ +#define RCC_MSI_ENABLE (RCC_SRCCTRL1_MSIEN) +#define RCC_MSI_STABLE_FLAG (RCC_SRCCTRL1_MSIRDF|RCC_SRCCTRL1_AFEMSIRDF) + +/** System_clock_status mask **/ +#define RCC_SYSCLK_STS_MASK (RCC_SRCCTRL1_SCLKSTS) +#define RCC_SYSCLK_STS_HSI (RCC_SRCCTRL1_SCLKSTS_HSI ) +#define RCC_SYSCLK_STS_MSI (RCC_SRCCTRL1_SCLKSTS_MSI ) +#define RCC_SYSCLK_STS_HSE (RCC_SRCCTRL1_SCLKSTS_HSE ) +#define RCC_SYSCLK_STS_PLL1A (RCC_SRCCTRL1_SCLKSTS_PLL1) + +#define RCC_SYSCLK_SRC_MASK (~RCC_SRCCTRL1_SCLKSW ) +#define RCC_SYSCLK_SRC_HSI (RCC_SRCCTRL1_SCLKSW_HSI ) +#define RCC_SYSCLK_SRC_MSI (RCC_SRCCTRL1_SCLKSW_MSI ) +#define RCC_SYSCLK_SRC_HSE (RCC_SRCCTRL1_SCLKSW_HSE ) +#define RCC_SYSCLK_SRC_PLL1A (RCC_SRCCTRL1_SCLKSW_PLL1) + + +/** LSE_configuration **/ +#define RCC_LSE_DISABLE (RCC_REG_BIT_MASK) +#define RCC_LSE_ENABLE (RCC_BDCTRL_LSEEN) +#define RCC_LSE_BYPASS (RCC_BDCTRL_LSEBP) +#define RCC_LSE_LSELDO (RCC_BDCTRL_LSELDOEN) +#define RCC_LSERDY_ENABLE (RCC_BDCTRL_LSERDEN) +#define RCC_LSE_RDCNTEN (RCC_BDCTRL_LSERDCNTEN) +#define RCC_LSE_STABLE_FLAG (RCC_BDCTRL_LSERDF|RCC_BDCTRL_AFELSERDF) +/** PLL_clock **/ +#define RCC_PLL_BWAJ_MASK (~RCC_PLL1CTRL1_PLL1BWAJ) +#define RCC_PLL_CLKR_CLKF_MASK (RCC_REG_BIT_MASK) +#define RCC_PLL_SRC_MASK (~RCC_PLL1CTRL1_PLL1SRC) +#define RCC_PLL_LOCK_FLAG (RCC_PLL1CTRL1_PLL1PHLK) +#define RCC_PLL_LDO_ENABLE (RCC_PLL1CTRL1_PLL1LDOEN) +#define RCC_PLL_ENABLE (RCC_PLL1CTRL1_PLL1EN ) +#define RCC_PLL_RESET_ENABLE (RCC_PLL1CTRL1_PLL1RST ) +#define RCC_PLL_POWER_DOWN (RCC_PLL1CTRL1_PLL1PD ) + +#define RCC_PLL_SRC_HSI (RCC_REG_BIT_MASK ) +#define RCC_PLL_SRC_MSI (RCC_PLL1CTRL1_PLL1SRC_1 ) +#define RCC_PLL_SRC_HSE (RCC_PLL1CTRL1_PLL1SRC_0|RCC_PLL1CTRL1_PLL1SRC_1 ) + +/** cortex Selection **/ +#define RCC_M7HYPERCLK_SRC_MASK (~RCC_SRCCTRL2_M7HYPSEL ) +#define RCC_M7HYPERCLK_SRC_PLL1A (RCC_REG_BIT_MASK ) +#define RCC_M7HYPERCLK_SRC_PLL2A (RCC_SRCCTRL2_M7HYPSEL ) + +#define RCC_AXIHYPERCLK_SRC_MASK (~RCC_SRCCTRL2_AXIHYPSEL ) +#define RCC_AXIHYPERCLK_SRC_PLL1A (RCC_REG_BIT_MASK ) +#define RCC_AXIHYPERCLK_SRC_PLL2A (RCC_SRCCTRL2_AXIHYPSEL ) + +/** PLL1C,PLL2C,PLL3C DIV values **/ +#define RCC_PLLC_DIV_MASK (~RCC_PLL1DIV_PLL1CDIV ) +#define RCC_PLLC_DIV1 (RCC_PLL1DIV_PLL1CDIV_DIV1 ) +#define RCC_PLLC_DIV2 (RCC_PLL1DIV_PLL1CDIV_DIV2 ) +#define RCC_PLLC_DIV3 (RCC_PLL1DIV_PLL1CDIV_DIV3 ) +#define RCC_PLLC_DIV4 (RCC_PLL1DIV_PLL1CDIV_DIV4 ) +#define RCC_PLLC_DIV5 (RCC_PLL1DIV_PLL1CDIV_DIV5 ) +#define RCC_PLLC_DIV6 (RCC_PLL1DIV_PLL1CDIV_DIV6 ) +#define RCC_PLLC_DIV7 (RCC_PLL1DIV_PLL1CDIV_DIV7 ) +#define RCC_PLLC_DIV8 (RCC_PLL1DIV_PLL1CDIV_DIV8 ) +#define RCC_PLLC_DIV9 (RCC_PLL1DIV_PLL1CDIV_DIV9 ) +#define RCC_PLLC_DIV10 (RCC_PLL1DIV_PLL1CDIV_DIV10) +#define RCC_PLLC_DIV11 (RCC_PLL1DIV_PLL1CDIV_DIV11) +#define RCC_PLLC_DIV12 (RCC_PLL1DIV_PLL1CDIV_DIV12) +#define RCC_PLLC_DIV13 (RCC_PLL1DIV_PLL1CDIV_DIV13) +#define RCC_PLLC_DIV14 (RCC_PLL1DIV_PLL1CDIV_DIV14) +#define RCC_PLLC_DIV15 (RCC_PLL1DIV_PLL1CDIV_DIV15) +#define RCC_PLLC_DIV16 (RCC_PLL1DIV_PLL1CDIV_DIV16) +#define RCC_PLLC_DIV17 (RCC_PLL1DIV_PLL1CDIV_DIV17) +#define RCC_PLLC_DIV18 (RCC_PLL1DIV_PLL1CDIV_DIV18) +#define RCC_PLLC_DIV19 (RCC_PLL1DIV_PLL1CDIV_DIV19) +#define RCC_PLLC_DIV20 (RCC_PLL1DIV_PLL1CDIV_DIV20) +#define RCC_PLLC_DIV21 (RCC_PLL1DIV_PLL1CDIV_DIV21) +#define RCC_PLLC_DIV22 (RCC_PLL1DIV_PLL1CDIV_DIV22) +#define RCC_PLLC_DIV23 (RCC_PLL1DIV_PLL1CDIV_DIV23) +#define RCC_PLLC_DIV24 (RCC_PLL1DIV_PLL1CDIV_DIV24) +#define RCC_PLLC_DIV25 (RCC_PLL1DIV_PLL1CDIV_DIV25) +#define RCC_PLLC_DIV26 (RCC_PLL1DIV_PLL1CDIV_DIV26) +#define RCC_PLLC_DIV27 (RCC_PLL1DIV_PLL1CDIV_DIV27) +#define RCC_PLLC_DIV28 (RCC_PLL1DIV_PLL1CDIV_DIV28) +#define RCC_PLLC_DIV29 (RCC_PLL1DIV_PLL1CDIV_DIV29) +#define RCC_PLLC_DIV30 (RCC_PLL1DIV_PLL1CDIV_DIV30) +#define RCC_PLLC_DIV31 (RCC_PLL1DIV_PLL1CDIV_DIV31) +#define RCC_PLLC_DIV32 (RCC_PLL1DIV_PLL1CDIV_DIV32) +#define RCC_PLLC_DIV33 (RCC_PLL1DIV_PLL1CDIV_DIV33) +#define RCC_PLLC_DIV34 (RCC_PLL1DIV_PLL1CDIV_DIV34) +#define RCC_PLLC_DIV35 (RCC_PLL1DIV_PLL1CDIV_DIV35) +#define RCC_PLLC_DIV36 (RCC_PLL1DIV_PLL1CDIV_DIV36) +#define RCC_PLLC_DIV37 (RCC_PLL1DIV_PLL1CDIV_DIV37) +#define RCC_PLLC_DIV38 (RCC_PLL1DIV_PLL1CDIV_DIV38) +#define RCC_PLLC_DIV39 (RCC_PLL1DIV_PLL1CDIV_DIV39) +#define RCC_PLLC_DIV40 (RCC_PLL1DIV_PLL1CDIV_DIV40) +#define RCC_PLLC_DIV41 (RCC_PLL1DIV_PLL1CDIV_DIV41) +#define RCC_PLLC_DIV42 (RCC_PLL1DIV_PLL1CDIV_DIV42) +#define RCC_PLLC_DIV43 (RCC_PLL1DIV_PLL1CDIV_DIV43) +#define RCC_PLLC_DIV44 (RCC_PLL1DIV_PLL1CDIV_DIV44) +#define RCC_PLLC_DIV45 (RCC_PLL1DIV_PLL1CDIV_DIV45) +#define RCC_PLLC_DIV46 (RCC_PLL1DIV_PLL1CDIV_DIV46) +#define RCC_PLLC_DIV47 (RCC_PLL1DIV_PLL1CDIV_DIV47) +#define RCC_PLLC_DIV48 (RCC_PLL1DIV_PLL1CDIV_DIV48) +#define RCC_PLLC_DIV49 (RCC_PLL1DIV_PLL1CDIV_DIV49) +#define RCC_PLLC_DIV50 (RCC_PLL1DIV_PLL1CDIV_DIV50) +#define RCC_PLLC_DIV51 (RCC_PLL1DIV_PLL1CDIV_DIV51) +#define RCC_PLLC_DIV52 (RCC_PLL1DIV_PLL1CDIV_DIV52) +#define RCC_PLLC_DIV53 (RCC_PLL1DIV_PLL1CDIV_DIV53) +#define RCC_PLLC_DIV54 (RCC_PLL1DIV_PLL1CDIV_DIV54) +#define RCC_PLLC_DIV55 (RCC_PLL1DIV_PLL1CDIV_DIV55) +#define RCC_PLLC_DIV56 (RCC_PLL1DIV_PLL1CDIV_DIV56) +#define RCC_PLLC_DIV57 (RCC_PLL1DIV_PLL1CDIV_DIV57) +#define RCC_PLLC_DIV58 (RCC_PLL1DIV_PLL1CDIV_DIV58) +#define RCC_PLLC_DIV59 (RCC_PLL1DIV_PLL1CDIV_DIV59) +#define RCC_PLLC_DIV60 (RCC_PLL1DIV_PLL1CDIV_DIV60) +#define RCC_PLLC_DIV61 (RCC_PLL1DIV_PLL1CDIV_DIV61) +#define RCC_PLLC_DIV62 (RCC_PLL1DIV_PLL1CDIV_DIV62) +#define RCC_PLLC_DIV63 (RCC_PLL1DIV_PLL1CDIV_DIV63) + +/** PLL1B,PLL2B,PLL3B DIV values **/ +#define RCC_PLLB_DIV_MASK (~RCC_PLL1DIV_PLL1BDIV ) +#define RCC_PLLB_DIV1 (RCC_PLL1DIV_PLL1BDIV_DIV1 ) +#define RCC_PLLB_DIV2 (RCC_PLL1DIV_PLL1BDIV_DIV2 ) +#define RCC_PLLB_DIV3 (RCC_PLL1DIV_PLL1BDIV_DIV3 ) +#define RCC_PLLB_DIV4 (RCC_PLL1DIV_PLL1BDIV_DIV4 ) +#define RCC_PLLB_DIV5 (RCC_PLL1DIV_PLL1BDIV_DIV5 ) +#define RCC_PLLB_DIV6 (RCC_PLL1DIV_PLL1BDIV_DIV6 ) +#define RCC_PLLB_DIV7 (RCC_PLL1DIV_PLL1BDIV_DIV7 ) +#define RCC_PLLB_DIV8 (RCC_PLL1DIV_PLL1BDIV_DIV8 ) +#define RCC_PLLB_DIV9 (RCC_PLL1DIV_PLL1BDIV_DIV9 ) +#define RCC_PLLB_DIV10 (RCC_PLL1DIV_PLL1BDIV_DIV10) +#define RCC_PLLB_DIV11 (RCC_PLL1DIV_PLL1BDIV_DIV11) +#define RCC_PLLB_DIV12 (RCC_PLL1DIV_PLL1BDIV_DIV12) +#define RCC_PLLB_DIV13 (RCC_PLL1DIV_PLL1BDIV_DIV13) +#define RCC_PLLB_DIV14 (RCC_PLL1DIV_PLL1BDIV_DIV14) +#define RCC_PLLB_DIV15 (RCC_PLL1DIV_PLL1BDIV_DIV15) +#define RCC_PLLB_DIV16 (RCC_PLL1DIV_PLL1BDIV_DIV16) +#define RCC_PLLB_DIV17 (RCC_PLL1DIV_PLL1BDIV_DIV17) +#define RCC_PLLB_DIV18 (RCC_PLL1DIV_PLL1BDIV_DIV18) +#define RCC_PLLB_DIV19 (RCC_PLL1DIV_PLL1BDIV_DIV19) +#define RCC_PLLB_DIV20 (RCC_PLL1DIV_PLL1BDIV_DIV20) +#define RCC_PLLB_DIV21 (RCC_PLL1DIV_PLL1BDIV_DIV21) +#define RCC_PLLB_DIV22 (RCC_PLL1DIV_PLL1BDIV_DIV22) +#define RCC_PLLB_DIV23 (RCC_PLL1DIV_PLL1BDIV_DIV23) +#define RCC_PLLB_DIV24 (RCC_PLL1DIV_PLL1BDIV_DIV24) +#define RCC_PLLB_DIV25 (RCC_PLL1DIV_PLL1BDIV_DIV25) +#define RCC_PLLB_DIV26 (RCC_PLL1DIV_PLL1BDIV_DIV26) +#define RCC_PLLB_DIV27 (RCC_PLL1DIV_PLL1BDIV_DIV27) +#define RCC_PLLB_DIV28 (RCC_PLL1DIV_PLL1BDIV_DIV28) +#define RCC_PLLB_DIV29 (RCC_PLL1DIV_PLL1BDIV_DIV29) +#define RCC_PLLB_DIV30 (RCC_PLL1DIV_PLL1BDIV_DIV30) +#define RCC_PLLB_DIV31 (RCC_PLL1DIV_PLL1BDIV_DIV31) +#define RCC_PLLB_DIV32 (RCC_PLL1DIV_PLL1BDIV_DIV32) +#define RCC_PLLB_DIV33 (RCC_PLL1DIV_PLL1BDIV_DIV33) +#define RCC_PLLB_DIV34 (RCC_PLL1DIV_PLL1BDIV_DIV34) +#define RCC_PLLB_DIV35 (RCC_PLL1DIV_PLL1BDIV_DIV35) +#define RCC_PLLB_DIV36 (RCC_PLL1DIV_PLL1BDIV_DIV36) +#define RCC_PLLB_DIV37 (RCC_PLL1DIV_PLL1BDIV_DIV37) +#define RCC_PLLB_DIV38 (RCC_PLL1DIV_PLL1BDIV_DIV38) +#define RCC_PLLB_DIV39 (RCC_PLL1DIV_PLL1BDIV_DIV39) +#define RCC_PLLB_DIV40 (RCC_PLL1DIV_PLL1BDIV_DIV40) +#define RCC_PLLB_DIV41 (RCC_PLL1DIV_PLL1BDIV_DIV41) +#define RCC_PLLB_DIV42 (RCC_PLL1DIV_PLL1BDIV_DIV42) +#define RCC_PLLB_DIV43 (RCC_PLL1DIV_PLL1BDIV_DIV43) +#define RCC_PLLB_DIV44 (RCC_PLL1DIV_PLL1BDIV_DIV44) +#define RCC_PLLB_DIV45 (RCC_PLL1DIV_PLL1BDIV_DIV45) +#define RCC_PLLB_DIV46 (RCC_PLL1DIV_PLL1BDIV_DIV46) +#define RCC_PLLB_DIV47 (RCC_PLL1DIV_PLL1BDIV_DIV47) +#define RCC_PLLB_DIV48 (RCC_PLL1DIV_PLL1BDIV_DIV48) +#define RCC_PLLB_DIV49 (RCC_PLL1DIV_PLL1BDIV_DIV49) +#define RCC_PLLB_DIV50 (RCC_PLL1DIV_PLL1BDIV_DIV50) +#define RCC_PLLB_DIV51 (RCC_PLL1DIV_PLL1BDIV_DIV51) +#define RCC_PLLB_DIV52 (RCC_PLL1DIV_PLL1BDIV_DIV52) +#define RCC_PLLB_DIV53 (RCC_PLL1DIV_PLL1BDIV_DIV53) +#define RCC_PLLB_DIV54 (RCC_PLL1DIV_PLL1BDIV_DIV54) +#define RCC_PLLB_DIV55 (RCC_PLL1DIV_PLL1BDIV_DIV55) +#define RCC_PLLB_DIV56 (RCC_PLL1DIV_PLL1BDIV_DIV56) +#define RCC_PLLB_DIV57 (RCC_PLL1DIV_PLL1BDIV_DIV57) +#define RCC_PLLB_DIV58 (RCC_PLL1DIV_PLL1BDIV_DIV58) +#define RCC_PLLB_DIV59 (RCC_PLL1DIV_PLL1BDIV_DIV59) +#define RCC_PLLB_DIV60 (RCC_PLL1DIV_PLL1BDIV_DIV60) +#define RCC_PLLB_DIV61 (RCC_PLL1DIV_PLL1BDIV_DIV61) +#define RCC_PLLB_DIV62 (RCC_PLL1DIV_PLL1BDIV_DIV62) +#define RCC_PLLB_DIV63 (RCC_PLL1DIV_PLL1BDIV_DIV63) + +/** PLL1A,PLL2A,PLL3A DIV values **/ +#define RCC_PLLA_DIV_MASK (~RCC_PLL1DIV_PLL1ADIV ) +#define RCC_PLLA_DIV1 (RCC_PLL1DIV_PLL1ADIV_DIV1 ) +#define RCC_PLLA_DIV2 (RCC_PLL1DIV_PLL1ADIV_DIV2 ) +#define RCC_PLLA_DIV3 (RCC_PLL1DIV_PLL1ADIV_DIV3 ) +#define RCC_PLLA_DIV4 (RCC_PLL1DIV_PLL1ADIV_DIV4 ) +#define RCC_PLLA_DIV5 (RCC_PLL1DIV_PLL1ADIV_DIV5 ) +#define RCC_PLLA_DIV6 (RCC_PLL1DIV_PLL1ADIV_DIV6 ) +#define RCC_PLLA_DIV7 (RCC_PLL1DIV_PLL1ADIV_DIV7 ) +#define RCC_PLLA_DIV8 (RCC_PLL1DIV_PLL1ADIV_DIV8 ) +#define RCC_PLLA_DIV9 (RCC_PLL1DIV_PLL1ADIV_DIV9 ) +#define RCC_PLLA_DIV10 (RCC_PLL1DIV_PLL1ADIV_DIV10) +#define RCC_PLLA_DIV11 (RCC_PLL1DIV_PLL1ADIV_DIV11) +#define RCC_PLLA_DIV12 (RCC_PLL1DIV_PLL1ADIV_DIV12) +#define RCC_PLLA_DIV13 (RCC_PLL1DIV_PLL1ADIV_DIV13) +#define RCC_PLLA_DIV14 (RCC_PLL1DIV_PLL1ADIV_DIV14) +#define RCC_PLLA_DIV15 (RCC_PLL1DIV_PLL1ADIV_DIV15) +#define RCC_PLLA_DIV16 (RCC_PLL1DIV_PLL1ADIV_DIV16) +#define RCC_PLLA_DIV17 (RCC_PLL1DIV_PLL1ADIV_DIV17) +#define RCC_PLLA_DIV18 (RCC_PLL1DIV_PLL1ADIV_DIV18) +#define RCC_PLLA_DIV19 (RCC_PLL1DIV_PLL1ADIV_DIV19) +#define RCC_PLLA_DIV20 (RCC_PLL1DIV_PLL1ADIV_DIV20) +#define RCC_PLLA_DIV21 (RCC_PLL1DIV_PLL1ADIV_DIV21) +#define RCC_PLLA_DIV22 (RCC_PLL1DIV_PLL1ADIV_DIV22) +#define RCC_PLLA_DIV23 (RCC_PLL1DIV_PLL1ADIV_DIV23) +#define RCC_PLLA_DIV24 (RCC_PLL1DIV_PLL1ADIV_DIV24) +#define RCC_PLLA_DIV25 (RCC_PLL1DIV_PLL1ADIV_DIV25) +#define RCC_PLLA_DIV26 (RCC_PLL1DIV_PLL1ADIV_DIV26) +#define RCC_PLLA_DIV27 (RCC_PLL1DIV_PLL1ADIV_DIV27) +#define RCC_PLLA_DIV28 (RCC_PLL1DIV_PLL1ADIV_DIV28) +#define RCC_PLLA_DIV29 (RCC_PLL1DIV_PLL1ADIV_DIV29) +#define RCC_PLLA_DIV30 (RCC_PLL1DIV_PLL1ADIV_DIV30) +#define RCC_PLLA_DIV31 (RCC_PLL1DIV_PLL1ADIV_DIV31) +#define RCC_PLLA_DIV32 (RCC_PLL1DIV_PLL1ADIV_DIV32) +#define RCC_PLLA_DIV33 (RCC_PLL1DIV_PLL1ADIV_DIV33) +#define RCC_PLLA_DIV34 (RCC_PLL1DIV_PLL1ADIV_DIV34) +#define RCC_PLLA_DIV35 (RCC_PLL1DIV_PLL1ADIV_DIV35) +#define RCC_PLLA_DIV36 (RCC_PLL1DIV_PLL1ADIV_DIV36) +#define RCC_PLLA_DIV37 (RCC_PLL1DIV_PLL1ADIV_DIV37) +#define RCC_PLLA_DIV38 (RCC_PLL1DIV_PLL1ADIV_DIV38) +#define RCC_PLLA_DIV39 (RCC_PLL1DIV_PLL1ADIV_DIV39) +#define RCC_PLLA_DIV40 (RCC_PLL1DIV_PLL1ADIV_DIV40) +#define RCC_PLLA_DIV41 (RCC_PLL1DIV_PLL1ADIV_DIV41) +#define RCC_PLLA_DIV42 (RCC_PLL1DIV_PLL1ADIV_DIV42) +#define RCC_PLLA_DIV43 (RCC_PLL1DIV_PLL1ADIV_DIV43) +#define RCC_PLLA_DIV44 (RCC_PLL1DIV_PLL1ADIV_DIV44) +#define RCC_PLLA_DIV45 (RCC_PLL1DIV_PLL1ADIV_DIV45) +#define RCC_PLLA_DIV46 (RCC_PLL1DIV_PLL1ADIV_DIV46) +#define RCC_PLLA_DIV47 (RCC_PLL1DIV_PLL1ADIV_DIV47) +#define RCC_PLLA_DIV48 (RCC_PLL1DIV_PLL1ADIV_DIV48) +#define RCC_PLLA_DIV49 (RCC_PLL1DIV_PLL1ADIV_DIV49) +#define RCC_PLLA_DIV50 (RCC_PLL1DIV_PLL1ADIV_DIV50) +#define RCC_PLLA_DIV51 (RCC_PLL1DIV_PLL1ADIV_DIV51) +#define RCC_PLLA_DIV52 (RCC_PLL1DIV_PLL1ADIV_DIV52) +#define RCC_PLLA_DIV53 (RCC_PLL1DIV_PLL1ADIV_DIV53) +#define RCC_PLLA_DIV54 (RCC_PLL1DIV_PLL1ADIV_DIV54) +#define RCC_PLLA_DIV55 (RCC_PLL1DIV_PLL1ADIV_DIV55) +#define RCC_PLLA_DIV56 (RCC_PLL1DIV_PLL1ADIV_DIV56) +#define RCC_PLLA_DIV57 (RCC_PLL1DIV_PLL1ADIV_DIV57) +#define RCC_PLLA_DIV58 (RCC_PLL1DIV_PLL1ADIV_DIV58) +#define RCC_PLLA_DIV59 (RCC_PLL1DIV_PLL1ADIV_DIV59) +#define RCC_PLLA_DIV60 (RCC_PLL1DIV_PLL1ADIV_DIV60) +#define RCC_PLLA_DIV61 (RCC_PLL1DIV_PLL1ADIV_DIV61) +#define RCC_PLLA_DIV62 (RCC_PLL1DIV_PLL1ADIV_DIV62) +#define RCC_PLLA_DIV63 (RCC_PLL1DIV_PLL1ADIV_DIV63) + +/** HSI DIV values **/ +#define RCC_HSICLK_DIV_MASK (~RCC_SYSBUSDIV1_HSIDIV ) +#define RCC_HSICLK_DIV1 (RCC_SYSBUSDIV1_HSIDIV_DIV1 ) +#define RCC_HSICLK_DIV2 (RCC_SYSBUSDIV1_HSIDIV_DIV2 ) +#define RCC_HSICLK_DIV4 (RCC_SYSBUSDIV1_HSIDIV_DIV4 ) +#define RCC_HSICLK_DIV8 (RCC_SYSBUSDIV1_HSIDIV_DIV8 ) +#define RCC_HSICLK_DIV16 (RCC_SYSBUSDIV1_HSIDIV_DIV16 ) +#define RCC_HSICLK_DIV32 (RCC_SYSBUSDIV1_HSIDIV_DIV32 ) +#define RCC_HSICLK_DIV64 (RCC_SYSBUSDIV1_HSIDIV_DIV64 ) +#define RCC_HSICLK_DIV128 (RCC_SYSBUSDIV1_HSIDIV_DIV128) +#define RCC_HSICLK_DIV256 (RCC_SYSBUSDIV1_HSIDIV_DIV256) +#define RCC_HSICLK_DIV512 (RCC_SYSBUSDIV1_HSIDIV_DIV512) + +/** MSI DIV values **/ +#define RCC_MSICLK_DIV_MASK (~RCC_SYSBUSDIV1_MSIDIV ) +#define RCC_MSICLK_DIV1 (RCC_SYSBUSDIV1_MSIDIV_DIV1 ) +#define RCC_MSICLK_DIV2 (RCC_SYSBUSDIV1_MSIDIV_DIV2 ) +#define RCC_MSICLK_DIV4 (RCC_SYSBUSDIV1_MSIDIV_DIV4 ) +#define RCC_MSICLK_DIV8 (RCC_SYSBUSDIV1_MSIDIV_DIV8 ) +#define RCC_MSICLK_DIV16 (RCC_SYSBUSDIV1_MSIDIV_DIV16 ) +#define RCC_MSICLK_DIV32 (RCC_SYSBUSDIV1_MSIDIV_DIV32 ) +#define RCC_MSICLK_DIV64 (RCC_SYSBUSDIV1_MSIDIV_DIV64 ) +#define RCC_MSICLK_DIV128 (RCC_SYSBUSDIV1_MSIDIV_DIV128) +#define RCC_MSICLK_DIV256 (RCC_SYSBUSDIV1_MSIDIV_DIV256) +#define RCC_MSICLK_DIV512 (RCC_SYSBUSDIV1_MSIDIV_DIV512) + +/** AXI Clock Hyper Mode DIV values **/ +#define RCC_AXICLK_HYP_DIV_MASK (~RCC_SYSBUSDIV1_AXIHYPDIV ) +#define RCC_AXICLK_HYP_DIV1 (RCC_SYSBUSDIV1_AXIHYPDIV_DIV1 ) +#define RCC_AXICLK_HYP_DIV2 (RCC_SYSBUSDIV1_AXIHYPDIV_DIV2 ) +#define RCC_AXICLK_HYP_DIV4 (RCC_SYSBUSDIV1_AXIHYPDIV_DIV4 ) +#define RCC_AXICLK_HYP_DIV8 (RCC_SYSBUSDIV1_AXIHYPDIV_DIV8 ) +#define RCC_AXICLK_HYP_DIV16 (RCC_SYSBUSDIV1_AXIHYPDIV_DIV16 ) +#define RCC_AXICLK_HYP_DIV32 (RCC_SYSBUSDIV1_AXIHYPDIV_DIV32 ) +#define RCC_AXICLK_HYP_DIV64 (RCC_SYSBUSDIV1_AXIHYPDIV_DIV64 ) +#define RCC_AXICLK_HYP_DIV128 (RCC_SYSBUSDIV1_AXIHYPDIV_DIV128) +#define RCC_AXICLK_HYP_DIV256 (RCC_SYSBUSDIV1_AXIHYPDIV_DIV256) +#define RCC_AXICLK_HYP_DIV512 (RCC_SYSBUSDIV1_AXIHYPDIV_DIV512) + +/** M7 Clock Hyper Mode DIV values **/ +#define RCC_M7CLK_HYP_DIV_MASK (~RCC_SYSBUSDIV1_M7HYPDIV ) +#define RCC_M7CLK_HYP_DIV1 (RCC_SYSBUSDIV1_M7HYPDIV_DIV1 ) +#define RCC_M7CLK_HYP_DIV2 (RCC_SYSBUSDIV1_M7HYPDIV_DIV2 ) +#define RCC_M7CLK_HYP_DIV4 (RCC_SYSBUSDIV1_M7HYPDIV_DIV4 ) +#define RCC_M7CLK_HYP_DIV8 (RCC_SYSBUSDIV1_M7HYPDIV_DIV8 ) +#define RCC_M7CLK_HYP_DIV16 (RCC_SYSBUSDIV1_M7HYPDIV_DIV16 ) +#define RCC_M7CLK_HYP_DIV32 (RCC_SYSBUSDIV1_M7HYPDIV_DIV32 ) +#define RCC_M7CLK_HYP_DIV64 (RCC_SYSBUSDIV1_M7HYPDIV_DIV64 ) +#define RCC_M7CLK_HYP_DIV128 (RCC_SYSBUSDIV1_M7HYPDIV_DIV128) +#define RCC_M7CLK_HYP_DIV256 (RCC_SYSBUSDIV1_M7HYPDIV_DIV256) +#define RCC_M7CLK_HYP_DIV512 (RCC_SYSBUSDIV1_M7HYPDIV_DIV512) + +/** AXI Clock DIV values **/ +#define RCC_AXICLK_DIV_MASK (~RCC_SYSBUSDIV1_AXIDIV ) +#define RCC_AXICLK_DIV1 (RCC_SYSBUSDIV1_AXIDIV_DIV1 ) +#define RCC_AXICLK_DIV2 (RCC_SYSBUSDIV1_AXIDIV_DIV2 ) +#define RCC_AXICLK_DIV4 (RCC_SYSBUSDIV1_AXIDIV_DIV4 ) +#define RCC_AXICLK_DIV8 (RCC_SYSBUSDIV1_AXIDIV_DIV8 ) +#define RCC_AXICLK_DIV16 (RCC_SYSBUSDIV1_AXIDIV_DIV16 ) +#define RCC_AXICLK_DIV32 (RCC_SYSBUSDIV1_AXIDIV_DIV32 ) +#define RCC_AXICLK_DIV64 (RCC_SYSBUSDIV1_AXIDIV_DIV64 ) +#define RCC_AXICLK_DIV128 (RCC_SYSBUSDIV1_AXIDIV_DIV128) +#define RCC_AXICLK_DIV256 (RCC_SYSBUSDIV1_AXIDIV_DIV256) +#define RCC_AXICLK_DIV512 (RCC_SYSBUSDIV1_AXIDIV_DIV512) + +/** System bus clock DIV values **/ +#define RCC_BUSCLK_DIV_MASK (~RCC_SYSBUSDIV1_BUSDIV ) +#define RCC_BUSCLK_DIV1 (RCC_SYSBUSDIV1_BUSDIV_DIV1 ) +#define RCC_BUSCLK_DIV2 (RCC_SYSBUSDIV1_BUSDIV_DIV2 ) +#define RCC_BUSCLK_DIV4 (RCC_SYSBUSDIV1_BUSDIV_DIV4 ) +#define RCC_BUSCLK_DIV8 (RCC_SYSBUSDIV1_BUSDIV_DIV8 ) +#define RCC_BUSCLK_DIV16 (RCC_SYSBUSDIV1_BUSDIV_DIV16 ) +#define RCC_BUSCLK_DIV32 (RCC_SYSBUSDIV1_BUSDIV_DIV32 ) +#define RCC_BUSCLK_DIV64 (RCC_SYSBUSDIV1_BUSDIV_DIV64 ) +#define RCC_BUSCLK_DIV128 (RCC_SYSBUSDIV1_BUSDIV_DIV128) +#define RCC_BUSCLK_DIV256 (RCC_SYSBUSDIV1_BUSDIV_DIV256) +#define RCC_BUSCLK_DIV512 (RCC_SYSBUSDIV1_BUSDIV_DIV512) + +/** System clock DIV values **/ +#define RCC_SYSCLK_DIV_MASK (~RCC_SYSBUSDIV1_SCLKDIV ) +#define RCC_SYSCLK_DIV1 (RCC_SYSBUSDIV1_SCLKDIV_DIV1 ) +#define RCC_SYSCLK_DIV2 (RCC_SYSBUSDIV1_SCLKDIV_DIV2 ) +#define RCC_SYSCLK_DIV4 (RCC_SYSBUSDIV1_SCLKDIV_DIV4 ) +#define RCC_SYSCLK_DIV8 (RCC_SYSBUSDIV1_SCLKDIV_DIV8 ) +#define RCC_SYSCLK_DIV16 (RCC_SYSBUSDIV1_SCLKDIV_DIV16 ) +#define RCC_SYSCLK_DIV32 (RCC_SYSBUSDIV1_SCLKDIV_DIV32 ) +#define RCC_SYSCLK_DIV64 (RCC_SYSBUSDIV1_SCLKDIV_DIV64 ) +#define RCC_SYSCLK_DIV128 (RCC_SYSBUSDIV1_SCLKDIV_DIV128) +#define RCC_SYSCLK_DIV256 (RCC_SYSBUSDIV1_SCLKDIV_DIV256) +#define RCC_SYSCLK_DIV512 (RCC_SYSBUSDIV1_SCLKDIV_DIV512) + + +#define RCC_APBCLK_DIV_MASK (~(RCC_SYSBUSDIV2_APB1DIV|RCC_SYSBUSDIV2_APB2DIV|RCC_SYSBUSDIV2_APB5DIV|RCC_SYSBUSDIV2_APB6DIV)) +/** APB6 clock DIV values **/ +#define RCC_APB6CLK_DIV1 (RCC_SYSBUSDIV2_APB6DIV_DIV1 ) +#define RCC_APB6CLK_DIV2 (RCC_SYSBUSDIV2_APB6DIV_DIV2 ) +#define RCC_APB6CLK_DIV4 (RCC_SYSBUSDIV2_APB6DIV_DIV4 ) +#define RCC_APB6CLK_DIV8 (RCC_SYSBUSDIV2_APB6DIV_DIV8 ) +#define RCC_APB6CLK_DIV16 (RCC_SYSBUSDIV2_APB6DIV_DIV16) +/** APB5 clock DIV values **/ +#define RCC_APB5CLK_DIV1 (RCC_SYSBUSDIV2_APB5DIV_DIV1 ) +#define RCC_APB5CLK_DIV2 (RCC_SYSBUSDIV2_APB5DIV_DIV2 ) +#define RCC_APB5CLK_DIV4 (RCC_SYSBUSDIV2_APB5DIV_DIV4 ) +#define RCC_APB5CLK_DIV8 (RCC_SYSBUSDIV2_APB5DIV_DIV8 ) +#define RCC_APB5CLK_DIV16 (RCC_SYSBUSDIV2_APB5DIV_DIV16) +/** APB2 clock DIV values **/ +#define RCC_APB2CLK_DIV1 (RCC_SYSBUSDIV2_APB2DIV_DIV1 ) +#define RCC_APB2CLK_DIV2 (RCC_SYSBUSDIV2_APB2DIV_DIV2 ) +#define RCC_APB2CLK_DIV4 (RCC_SYSBUSDIV2_APB2DIV_DIV4 ) +#define RCC_APB2CLK_DIV8 (RCC_SYSBUSDIV2_APB2DIV_DIV8 ) +#define RCC_APB2CLK_DIV16 (RCC_SYSBUSDIV2_APB2DIV_DIV16) +/** APB1 clock DIV values **/ +#define RCC_APB1CLK_DIV1 (RCC_SYSBUSDIV2_APB1DIV_DIV1 ) +#define RCC_APB1CLK_DIV2 (RCC_SYSBUSDIV2_APB1DIV_DIV2 ) +#define RCC_APB1CLK_DIV4 (RCC_SYSBUSDIV2_APB1DIV_DIV4 ) +#define RCC_APB1CLK_DIV8 (RCC_SYSBUSDIV2_APB1DIV_DIV8 ) +#define RCC_APB1CLK_DIV16 (RCC_SYSBUSDIV2_APB1DIV_DIV16) + +/** Ethernet system clock DIV values **/ +#define RCC_ETHPTPCLK_SRC_MASK (~RCC_AHB2SEL1_ETH1PTPSEL) +#define RCC_ETHPTPCLK_SRC_SYSBUSDIV (RCC_AHB2SEL1_ETH1PTPSEL_SYSBUSDIV) +#define RCC_ETHPTPCLK_SRC_PERIPH (RCC_AHB2SEL1_ETH1PTPSEL_PERIPH) +#define RCC_ETHPTPCLK_SRC_PLL2C (RCC_AHB2SEL1_ETH1PTPSEL_PLL2C ) +#define RCC_ETHPTPCLK_SRC_PLL3A (RCC_AHB2SEL1_ETH1PTPSEL_PLL3A ) + +#define RCC_ETHPTPCLK_SYSBUSDIV_MASK (~RCC_AHB2DIV1_ETH1SYSDIV ) +#define RCC_ETHPTPCLK_SYSBUSDIV1 (RCC_AHB2DIV1_ETH1SYSDIV_DIV1 ) +#define RCC_ETHPTPCLK_SYSBUSDIV2 (RCC_AHB2DIV1_ETH1SYSDIV_DIV2 ) +#define RCC_ETHPTPCLK_SYSBUSDIV4 (RCC_AHB2DIV1_ETH1SYSDIV_DIV4 ) +#define RCC_ETHPTPCLK_SYSBUSDIV8 (RCC_AHB2DIV1_ETH1SYSDIV_DIV8 ) +#define RCC_ETHPTPCLK_SYSBUSDIV16 (RCC_AHB2DIV1_ETH1SYSDIV_DIV16 ) +#define RCC_ETHPTPCLK_SYSBUSDIV32 (RCC_AHB2DIV1_ETH1SYSDIV_DIV32 ) +#define RCC_ETHPTPCLK_SYSBUSDIV64 (RCC_AHB2DIV1_ETH1SYSDIV_DIV64 ) +#define RCC_ETHPTPCLK_SYSBUSDIV128 (RCC_AHB2DIV1_ETH1SYSDIV_DIV128) +#define RCC_ETHPTPCLK_SYSBUSDIV256 (RCC_AHB2DIV1_ETH1SYSDIV_DIV256) +#define RCC_ETHPTPCLK_SYSBUSDIV512 (RCC_AHB2DIV1_ETH1SYSDIV_DIV512) + +#define RCC_ETH1GMIITXCLK_SRC_MASK (~RCC_AHB2SEL1_ETH1GMIITXSEL) +#define RCC_ETH1GMIITXCLK_SRC_PLL3A (RCC_AHB2SEL1_ETH1GMIITXSEL_PLL3A) +#define RCC_ETH1GMIITXCLK_SRC_PLL2B (RCC_AHB2SEL1_ETH1GMIITXSEL_PLL2B) +#define RCC_ETH1GMIITXCLK_SRC_IOM (RCC_AHB2SEL1_ETH1GMIITXSEL_IOM ) +#define RCC_ETH1GMIITXCLK_SRC_PLL1C (RCC_AHB2SEL1_ETH1GMIITXSEL_PLL1C) +/** SDMMC2 clock values **/ +#define RCC_SDMMC2KERCLK_SRC_MASK (~RCC_AHB1SEL1_SDMMC2KERSEL) +#define RCC_SDMMC2KERCLK_SRC_SYSBUSDIV (RCC_AHB1SEL1_SDMMC2KERSEL_SYSBUSDIV) +#define RCC_SDMMC2KERCLK_SRC_PERIPH (RCC_AHB1SEL1_SDMMC2KERSEL_PERIPH) +#define RCC_SDMMC2KERCLK_SRC_PLL2A (RCC_AHB1SEL1_SDMMC2KERSEL_PLL2A ) +#define RCC_SDMMC2KERCLK_SRC_PLL3A (RCC_AHB1SEL1_SDMMC2KERSEL_PLL3A ) +#define RCC_SDMMC2KERCLK_SRC_PLL1B (RCC_AHB1SEL1_SDMMC2KERSEL_PLL1B ) + +#define RCC_SDMMC2KERCLK_SYSBUSDIV_MASK (~RCC_AHB1DIV1_SDMMC2SYSDIV ) +#define RCC_SDMMC2KERCLK_SYSBUSDIV1 (RCC_AHB1DIV1_SDMMC2SYSDIV_DIV1 ) +#define RCC_SDMMC2KERCLK_SYSBUSDIV2 (RCC_AHB1DIV1_SDMMC2SYSDIV_DIV2 ) +#define RCC_SDMMC2KERCLK_SYSBUSDIV4 (RCC_AHB1DIV1_SDMMC2SYSDIV_DIV4 ) +#define RCC_SDMMC2KERCLK_SYSBUSDIV8 (RCC_AHB1DIV1_SDMMC2SYSDIV_DIV8 ) +#define RCC_SDMMC2KERCLK_SYSBUSDIV16 (RCC_AHB1DIV1_SDMMC2SYSDIV_DIV16 ) +#define RCC_SDMMC2KERCLK_SYSBUSDIV32 (RCC_AHB1DIV1_SDMMC2SYSDIV_DIV32 ) +#define RCC_SDMMC2KERCLK_SYSBUSDIV64 (RCC_AHB1DIV1_SDMMC2SYSDIV_DIV64 ) +#define RCC_SDMMC2KERCLK_SYSBUSDIV128 (RCC_AHB1DIV1_SDMMC2SYSDIV_DIV128) +#define RCC_SDMMC2KERCLK_SYSBUSDIV256 (RCC_AHB1DIV1_SDMMC2SYSDIV_DIV256) +#define RCC_SDMMC2KERCLK_SYSBUSDIV512 (RCC_AHB1DIV1_SDMMC2SYSDIV_DIV512) + + +#define RCC_SDMMC1KERCLK_SRC_MASK (~RCC_AXISEL1_SDMMC1KERSEL) +#define RCC_SDMMC1KERCLK_SRC_AXIDIV (RCC_AXISEL1_SDMMC1KERSEL_AXIDIV) +#define RCC_SDMMC1KERCLK_SRC_PERIPH (RCC_AXISEL1_SDMMC1KERSEL_PERIPH) +#define RCC_SDMMC1KERCLK_SRC_PLL2A (RCC_AXISEL1_SDMMC1KERSEL_PLL2A ) +#define RCC_SDMMC1KERCLK_SRC_PLL3A (RCC_AXISEL1_SDMMC1KERSEL_PLL3A ) +#define RCC_SDMMC1KERCLK_SRC_PLL1B (RCC_AXISEL1_SDMMC1KERSEL_PLL1B ) + +#define RCC_SDMMC1KERCLK_AXIDIV_MASK (~RCC_AXIDIV1_SDMMC1AXIDIV ) +#define RCC_SDMMC1KERCLK_AXIDIV1 (RCC_AXIDIV1_SDMMC1AXIDIV_DIV1 ) +#define RCC_SDMMC1KERCLK_AXIDIV2 (RCC_AXIDIV1_SDMMC1AXIDIV_DIV2 ) +#define RCC_SDMMC1KERCLK_AXIDIV4 (RCC_AXIDIV1_SDMMC1AXIDIV_DIV4 ) +#define RCC_SDMMC1KERCLK_AXIDIV8 (RCC_AXIDIV1_SDMMC1AXIDIV_DIV8 ) +#define RCC_SDMMC1KERCLK_AXIDIV16 (RCC_AXIDIV1_SDMMC1AXIDIV_DIV16 ) +#define RCC_SDMMC1KERCLK_AXIDIV32 (RCC_AXIDIV1_SDMMC1AXIDIV_DIV32 ) +#define RCC_SDMMC1KERCLK_AXIDIV64 (RCC_AXIDIV1_SDMMC1AXIDIV_DIV64 ) +#define RCC_SDMMC1KERCLK_AXIDIV128 (RCC_AXIDIV1_SDMMC1AXIDIV_DIV128) +#define RCC_SDMMC1KERCLK_AXIDIV256 (RCC_AXIDIV1_SDMMC1AXIDIV_DIV256) +#define RCC_SDMMC1KERCLK_AXIDIV512 (RCC_AXIDIV1_SDMMC1AXIDIV_DIV512) + + +/** DSMU system bus clock prescalar values **/ +#define RCC_DSMUKERCLK_SRC_MASK (~RCC_APB2SEL1_DSMUKERSEL ) +#define RCC_DSMUKERCLK_SRC_APB2 (RCC_APB2SEL1_DSMUKERSEL_APB2 ) +#define RCC_DSMUKERCLK_SRC_SYSBUSDIV (RCC_APB2SEL1_DSMUKERSEL_SYSBUSDIV) + +#define RCC_DSMUKERCLK_SYSBUSDIV_MASK (~RCC_APB2DIV1_APB2DSMUDIV ) +#define RCC_DSMUKERCLK_SYSBUSDIV1 (RCC_APB2DIV1_APB2DSMUDIV_DIV1 ) +#define RCC_DSMUKERCLK_SYSBUSDIV2 (RCC_APB2DIV1_APB2DSMUDIV_DIV2 ) +#define RCC_DSMUKERCLK_SYSBUSDIV4 (RCC_APB2DIV1_APB2DSMUDIV_DIV4 ) +#define RCC_DSMUKERCLK_SYSBUSDIV8 (RCC_APB2DIV1_APB2DSMUDIV_DIV8 ) +#define RCC_DSMUKERCLK_SYSBUSDIV16 (RCC_APB2DIV1_APB2DSMUDIV_DIV16) + + + +/** DSMU Kernel A clock selection register + */ + +#define RCC_DSMUKERACLK_SRC_MASK (~RCC_APB2SEL1_DSMUKERASEL ) +#define RCC_DSMUKERACLK_SRC_APB2 (RCC_APB2SEL1_DSMUKERASEL_APB2 ) +#define RCC_DSMUKERACLK_SRC_PLL1B (RCC_APB2SEL1_DSMUKERASEL_PLL1B ) +#define RCC_DSMUKERACLK_SRC_PLL2B (RCC_APB2SEL1_DSMUKERASEL_PLL2B ) +#define RCC_DSMUKERACLK_SRC_PLL3A (RCC_APB2SEL1_DSMUKERASEL_PLL3A ) +#define RCC_DSMUKERACLK_SRC_CKIN (RCC_APB2SEL1_DSMUKERASEL_CKIN ) +#define RCC_DSMUKERACLK_SRC_PERIPH (RCC_APB2SEL1_DSMUKERASEL_PERIPH) + +#define RCC_DSMUKERACLK_CKIN_MASK (~RCC_CFG3_I2SSEL) +#define RCC_DSMUKERACLK_CKIN_I2S1 (RCC_CFG3_I2SSEL_I2S1) +#define RCC_DSMUKERACLK_CKIN_I2S2 (RCC_CFG3_I2SSEL_I2S2) +#define RCC_DSMUKERACLK_CKIN_I2S3 (RCC_CFG3_I2SSEL_I2S3) +#define RCC_DSMUKERACLK_CKIN_I2S4 (RCC_CFG3_I2SSEL_I2S4) + +/** Periph clock selection register + */ +#define RCC_PERIPHCLK_SRC_MASK (~RCC_CFG3_PERSW) +#define RCC_PERIPHCLK_SRC_HSI (RCC_REG_BIT_MASK) +#define RCC_PERIPHCLK_SRC_MSI (RCC_CFG3_PERSW_1) +#define RCC_PERIPHCLK_SRC_HSE (RCC_CFG3_PERSW_0|RCC_CFG3_PERSW_1) + +/** USB1/2 reference clock selection register + */ +#define RCC_USBREFCLK_HSE_DIV_MASK (~RCC_AHB2DIV1_USBHSEDIV) +#define RCC_USBREFCLK_HSE_DIV1 (RCC_AHB2DIV1_USBHSEDIV_DIV1) +#define RCC_USBREFCLK_HSE_DIV2 (RCC_AHB2DIV1_USBHSEDIV_DIV2) + +#define RCC_ADC1PLLCLK_SRC_MASK (~RCC_AHB1SEL1_ADC1PLLSEL) +#define RCC_ADC2PLLCLK_SRC_MASK (~RCC_AHB1SEL1_ADC2PLLSEL) +#define RCC_ADC3PLLCLK_SRC_MASK (~RCC_AHB1SEL1_ADC3PLLSEL) +#define RCC_ADCPLLCLK_SRC_PLL2B (RCC_AHB1SEL1_ADC1PLLSEL_PLL2B) +#define RCC_ADCPLLCLK_SRC_PLL1B (RCC_AHB1SEL1_ADC1PLLSEL_PLL1B) +#define RCC_ADCPLLCLK_SRC_PLL3B (RCC_AHB1SEL1_ADC1PLLSEL_PLL3B) +#define RCC_ADCPLLCLK_SRC_PLL3C (RCC_AHB1SEL1_ADC1PLLSEL_PLL3C) + + +#define RCC_ADC1SYSCLK_DIV_MASK (~RCC_AHB1DIV2_ADC1SYSDIV) +#define RCC_ADC2SYSCLK_DIV_MASK (~RCC_AHB1DIV2_ADC2SYSDIV) +#define RCC_ADC3SYSCLK_DIV_MASK (~RCC_AHB1DIV2_ADC3SYSDIV) +#define RCC_ADCSYSCLK_DIV1 (RCC_AHB1DIV2_ADC1SYSDIV_DIV1 ) +#define RCC_ADCSYSCLK_DIV2 (RCC_AHB1DIV2_ADC1SYSDIV_DIV2 ) +#define RCC_ADCSYSCLK_DIV3 (RCC_AHB1DIV2_ADC1SYSDIV_DIV3 ) +#define RCC_ADCSYSCLK_DIV4 (RCC_AHB1DIV2_ADC1SYSDIV_DIV4 ) +#define RCC_ADCSYSCLK_DIV5 (RCC_AHB1DIV2_ADC1SYSDIV_DIV5 ) +#define RCC_ADCSYSCLK_DIV6 (RCC_AHB1DIV2_ADC1SYSDIV_DIV6 ) +#define RCC_ADCSYSCLK_DIV7 (RCC_AHB1DIV2_ADC1SYSDIV_DIV7 ) +#define RCC_ADCSYSCLK_DIV8 (RCC_AHB1DIV2_ADC1SYSDIV_DIV8 ) +#define RCC_ADCSYSCLK_DIV9 (RCC_AHB1DIV2_ADC1SYSDIV_DIV9 ) +#define RCC_ADCSYSCLK_DIV10 (RCC_AHB1DIV2_ADC1SYSDIV_DIV10) +#define RCC_ADCSYSCLK_DIV11 (RCC_AHB1DIV2_ADC1SYSDIV_DIV11) +#define RCC_ADCSYSCLK_DIV12 (RCC_AHB1DIV2_ADC1SYSDIV_DIV12) +#define RCC_ADCSYSCLK_DIV13 (RCC_AHB1DIV2_ADC1SYSDIV_DIV13) +#define RCC_ADCSYSCLK_DIV14 (RCC_AHB1DIV2_ADC1SYSDIV_DIV14) +#define RCC_ADCSYSCLK_DIV15 (RCC_AHB1DIV2_ADC1SYSDIV_DIV15) +#define RCC_ADCSYSCLK_DIV16 (RCC_AHB1DIV2_ADC1SYSDIV_DIV16) +#define RCC_ADCSYSCLK_DIV17 (RCC_AHB1DIV2_ADC1SYSDIV_DIV17) +#define RCC_ADCSYSCLK_DIV18 (RCC_AHB1DIV2_ADC1SYSDIV_DIV18) +#define RCC_ADCSYSCLK_DIV19 (RCC_AHB1DIV2_ADC1SYSDIV_DIV19) +#define RCC_ADCSYSCLK_DIV20 (RCC_AHB1DIV2_ADC1SYSDIV_DIV20) +#define RCC_ADCSYSCLK_DIV21 (RCC_AHB1DIV2_ADC1SYSDIV_DIV21) +#define RCC_ADCSYSCLK_DIV22 (RCC_AHB1DIV2_ADC1SYSDIV_DIV22) +#define RCC_ADCSYSCLK_DIV23 (RCC_AHB1DIV2_ADC1SYSDIV_DIV23) +#define RCC_ADCSYSCLK_DIV24 (RCC_AHB1DIV2_ADC1SYSDIV_DIV24) +#define RCC_ADCSYSCLK_DIV25 (RCC_AHB1DIV2_ADC1SYSDIV_DIV25) +#define RCC_ADCSYSCLK_DIV26 (RCC_AHB1DIV2_ADC1SYSDIV_DIV26) +#define RCC_ADCSYSCLK_DIV27 (RCC_AHB1DIV2_ADC1SYSDIV_DIV27) +#define RCC_ADCSYSCLK_DIV28 (RCC_AHB1DIV2_ADC1SYSDIV_DIV28) +#define RCC_ADCSYSCLK_DIV29 (RCC_AHB1DIV2_ADC1SYSDIV_DIV29) +#define RCC_ADCSYSCLK_DIV30 (RCC_AHB1DIV2_ADC1SYSDIV_DIV30) +#define RCC_ADCSYSCLK_DIV31 (RCC_AHB1DIV2_ADC1SYSDIV_DIV31) +#define RCC_ADCSYSCLK_DIV32 (RCC_AHB1DIV2_ADC1SYSDIV_DIV32) +#define RCC_ADCSYSCLK_DIV33 (RCC_AHB1DIV2_ADC1SYSDIV_DIV33) +#define RCC_ADCSYSCLK_DIV34 (RCC_AHB1DIV2_ADC1SYSDIV_DIV34) +#define RCC_ADCSYSCLK_DIV35 (RCC_AHB1DIV2_ADC1SYSDIV_DIV35) +#define RCC_ADCSYSCLK_DIV36 (RCC_AHB1DIV2_ADC1SYSDIV_DIV36) +#define RCC_ADCSYSCLK_DIV37 (RCC_AHB1DIV2_ADC1SYSDIV_DIV37) +#define RCC_ADCSYSCLK_DIV38 (RCC_AHB1DIV2_ADC1SYSDIV_DIV38) +#define RCC_ADCSYSCLK_DIV39 (RCC_AHB1DIV2_ADC1SYSDIV_DIV39) +#define RCC_ADCSYSCLK_DIV40 (RCC_AHB1DIV2_ADC1SYSDIV_DIV40) +#define RCC_ADCSYSCLK_DIV41 (RCC_AHB1DIV2_ADC1SYSDIV_DIV41) +#define RCC_ADCSYSCLK_DIV42 (RCC_AHB1DIV2_ADC1SYSDIV_DIV42) +#define RCC_ADCSYSCLK_DIV43 (RCC_AHB1DIV2_ADC1SYSDIV_DIV43) +#define RCC_ADCSYSCLK_DIV44 (RCC_AHB1DIV2_ADC1SYSDIV_DIV44) +#define RCC_ADCSYSCLK_DIV45 (RCC_AHB1DIV2_ADC1SYSDIV_DIV45) +#define RCC_ADCSYSCLK_DIV46 (RCC_AHB1DIV2_ADC1SYSDIV_DIV46) +#define RCC_ADCSYSCLK_DIV47 (RCC_AHB1DIV2_ADC1SYSDIV_DIV47) +#define RCC_ADCSYSCLK_DIV48 (RCC_AHB1DIV2_ADC1SYSDIV_DIV48) +#define RCC_ADCSYSCLK_DIV49 (RCC_AHB1DIV2_ADC1SYSDIV_DIV49) +#define RCC_ADCSYSCLK_DIV50 (RCC_AHB1DIV2_ADC1SYSDIV_DIV50) +#define RCC_ADCSYSCLK_DIV51 (RCC_AHB1DIV2_ADC1SYSDIV_DIV51) +#define RCC_ADCSYSCLK_DIV52 (RCC_AHB1DIV2_ADC1SYSDIV_DIV52) +#define RCC_ADCSYSCLK_DIV53 (RCC_AHB1DIV2_ADC1SYSDIV_DIV53) +#define RCC_ADCSYSCLK_DIV54 (RCC_AHB1DIV2_ADC1SYSDIV_DIV54) +#define RCC_ADCSYSCLK_DIV55 (RCC_AHB1DIV2_ADC1SYSDIV_DIV55) +#define RCC_ADCSYSCLK_DIV56 (RCC_AHB1DIV2_ADC1SYSDIV_DIV56) +#define RCC_ADCSYSCLK_DIV57 (RCC_AHB1DIV2_ADC1SYSDIV_DIV57) +#define RCC_ADCSYSCLK_DIV58 (RCC_AHB1DIV2_ADC1SYSDIV_DIV58) +#define RCC_ADCSYSCLK_DIV59 (RCC_AHB1DIV2_ADC1SYSDIV_DIV59) +#define RCC_ADCSYSCLK_DIV60 (RCC_AHB1DIV2_ADC1SYSDIV_DIV60) +#define RCC_ADCSYSCLK_DIV61 (RCC_AHB1DIV2_ADC1SYSDIV_DIV61) +#define RCC_ADCSYSCLK_DIV62 (RCC_AHB1DIV2_ADC1SYSDIV_DIV62) +#define RCC_ADCSYSCLK_DIV63 (RCC_AHB1DIV2_ADC1SYSDIV_DIV63) + + +/** APB1 "btimer(n)_gated_ker_clk" DIV values **/ +#define RCC_BTIMKERCLK_AHB1_DIV_MASK (~RCC_APB1DIV1_APB1BTIMDIV ) +#define RCC_BTIMKERCLK_AHB1_DIV1 (RCC_APB1DIV1_APB1BTIMDIV_DIV1 ) +#define RCC_BTIMKERCLK_AHB1_DIV2 (RCC_APB1DIV1_APB1BTIMDIV_DIV2 ) +#define RCC_BTIMKERCLK_AHB1_DIV4 (RCC_APB1DIV1_APB1BTIMDIV_DIV4 ) +#define RCC_BTIMKERCLK_AHB1_DIV8 (RCC_APB1DIV1_APB1BTIMDIV_DIV8 ) +#define RCC_BTIMKERCLK_AHB1_DIV16 (RCC_APB1DIV1_APB1BTIMDIV_DIV16) + +/** APB1 "gtimer(n)_gated_ker_clk" DIV values **/ +#define RCC_GTIMKERCLK_AHB1_DIV_MASK (~RCC_APB1DIV1_APB1GTIMDIV ) +#define RCC_GTIMKERCLK_AHB1_DIV1 (RCC_APB1DIV1_APB1GTIMDIV_DIV1 ) +#define RCC_GTIMKERCLK_AHB1_DIV2 (RCC_APB1DIV1_APB1GTIMDIV_DIV2 ) +#define RCC_GTIMKERCLK_AHB1_DIV4 (RCC_APB1DIV1_APB1GTIMDIV_DIV4 ) +#define RCC_GTIMKERCLK_AHB1_DIV8 (RCC_APB1DIV1_APB1GTIMDIV_DIV8 ) +#define RCC_GTIMKERCLK_AHB1_DIV16 (RCC_APB1DIV1_APB1GTIMDIV_DIV16) + +/** APB2 "atimer(n)_gated_ker_clk" prescalar values **/ +#define RCC_ATIMKERCLK_AHB2_DIV_MASK (~RCC_APB2DIV1_APB2ATIMDIV ) +#define RCC_ATIMKERCLK_AHB2_DIV1 (RCC_APB2DIV1_APB2ATIMDIV_DIV1 ) +#define RCC_ATIMKERCLK_AHB2_DIV2 (RCC_APB2DIV1_APB2ATIMDIV_DIV2 ) +#define RCC_ATIMKERCLK_AHB2_DIV4 (RCC_APB2DIV1_APB2ATIMDIV_DIV4 ) +#define RCC_ATIMKERCLK_AHB2_DIV8 (RCC_APB2DIV1_APB2ATIMDIV_DIV8 ) +#define RCC_ATIMKERCLK_AHB2_DIV16 (RCC_APB2DIV1_APB2ATIMDIV_DIV16) + +/** APB2 "gtimer(n)_gated_ker_clk" prescalar values **/ +#define RCC_GTIMKERCLK_AHB2_DIV_MASK (~RCC_APB2DIV1_APB2GTIMDIV ) +#define RCC_GTIMKERCLK_AHB2_DIV1 (RCC_APB2DIV1_APB2GTIMDIV_DIV1 ) +#define RCC_GTIMKERCLK_AHB2_DIV2 (RCC_APB2DIV1_APB2GTIMDIV_DIV2 ) +#define RCC_GTIMKERCLK_AHB2_DIV4 (RCC_APB2DIV1_APB2GTIMDIV_DIV4 ) +#define RCC_GTIMKERCLK_AHB2_DIV8 (RCC_APB2DIV1_APB2GTIMDIV_DIV8 ) +#define RCC_GTIMKERCLK_AHB2_DIV16 (RCC_APB2DIV1_APB2GTIMDIV_DIV16) + +/** APB5 "atimer(n)_gated_ker_clk" prescalar values **/ +#define RCC_ATIMKERCLK_AHB5_DIV_MASK (~RCC_APB5DIV1_APB5ATIMDIV ) +#define RCC_ATIMKERCLK_AHB5_DIV1 (RCC_APB5DIV1_APB5ATIMDIV_DIV1 ) +#define RCC_ATIMKERCLK_AHB5_DIV2 (RCC_APB5DIV1_APB5ATIMDIV_DIV2 ) +#define RCC_ATIMKERCLK_AHB5_DIV4 (RCC_APB5DIV1_APB5ATIMDIV_DIV4 ) +#define RCC_ATIMKERCLK_AHB5_DIV8 (RCC_APB5DIV1_APB5ATIMDIV_DIV8 ) +#define RCC_ATIMKERCLK_AHB5_DIV16 (RCC_APB5DIV1_APB5ATIMDIV_DIV16) + + +/** APB1 USART prescalar values **/ +#define RCC_USARTPCLK_AHB1_DIV_MASK (~RCC_APB1DIV1_APB1USARTDIV ) +#define RCC_USARTPCLK_AHB1_DIV1 (RCC_APB1DIV1_APB1USARTDIV_DIV1 ) +#define RCC_USARTPCLK_AHB1_DIV2 (RCC_APB1DIV1_APB1USARTDIV_DIV2 ) +#define RCC_USARTPCLK_AHB1_DIV4 (RCC_APB1DIV1_APB1USARTDIV_DIV4 ) +#define RCC_USARTPCLK_AHB1_DIV8 (RCC_APB1DIV1_APB1USARTDIV_DIV8 ) +#define RCC_USARTPCLK_AHB1_DIV16 (RCC_APB1DIV1_APB1USARTDIV_DIV16) + +/** APB1 "i2s(n)_ker_gated_clk" DIV values **/ +#define RCC_I2S1_2_KERCLK_SYSBUSDIV_MASK (~RCC_APB2DIV1_APB2I2SDIV ) +#define RCC_I2S3_4_KERCLK_SYSBUSDIV_MASK (~RCC_APB1DIV1_APB1I2SDIV ) +#define RCC_I2SKERCLK_SYSBUSDIV1 (RCC_APB1DIV1_APB1I2SDIV_DIV1 ) +#define RCC_I2SKERCLK_SYSBUSDIV2 (RCC_APB1DIV1_APB1I2SDIV_DIV2 ) +#define RCC_I2SKERCLK_SYSBUSDIV4 (RCC_APB1DIV1_APB1I2SDIV_DIV4 ) +#define RCC_I2SKERCLK_SYSBUSDIV8 (RCC_APB1DIV1_APB1I2SDIV_DIV8 ) +#define RCC_I2SKERCLK_SYSBUSDIV16 (RCC_APB1DIV1_APB1I2SDIV_DIV16) + + +#define RCC_I2S1KERCLK_SRC_MASK (~RCC_APB2SEL1_I2S1KERSEL ) +#define RCC_I2S2KERCLK_SRC_MASK (~RCC_APB2SEL1_I2S2KERSEL ) +#define RCC_I2S3KERCLK_SRC_MASK (~RCC_APB1SEL1_I2S3KERSEL ) +#define RCC_I2S4KERCLK_SRC_MASK (~RCC_APB1SEL1_I2S4KERSEL ) +#define RCC_I2SKERCLK_SRC_SYSBUSDIV (RCC_APB2SEL1_I2S1KERSEL_SYSBUSDIV) +#define RCC_I2SKERCLK_SRC_PLL3B (RCC_APB2SEL1_I2S1KERSEL_PLL3B ) +#define RCC_I2SKERCLK_SRC_HSI (RCC_APB2SEL1_I2S1KERSEL_HSI ) +#define RCC_I2SKERCLK_SRC_CLKIN (RCC_APB2SEL1_I2S1KERSEL_CLKIN ) + +/** "i2c(n)_ker_gated_clk" prescalar values when "I2C(n)_KER_CLK_SEL" is selected as 3'b100 **/ + +#define RCC_I2C1_3_KERCLK_SYSBUSDIV_MASK (~RCC_APB1DIV1_APB1I2CDIV ) +#define RCC_I2C4_6_KERCLK_SYSBUSDIV_MASK (~RCC_APB2DIV1_APB2I2CDIV ) +#define RCC_I2C7_10_KERCLK_SYSBUSDIV_MASK (~RCC_APB5DIV1_APB5I2CDIV ) + +#define RCC_I2CKERCLK_SYSBUSDIV1 (RCC_APB1DIV1_APB1I2CDIV_DIV1 ) +#define RCC_I2CKERCLK_SYSBUSDIV2 (RCC_APB1DIV1_APB1I2CDIV_DIV2 ) +#define RCC_I2CKERCLK_SYSBUSDIV4 (RCC_APB1DIV1_APB1I2CDIV_DIV4 ) +#define RCC_I2CKERCLK_SYSBUSDIV8 (RCC_APB1DIV1_APB1I2CDIV_DIV8 ) +#define RCC_I2CKERCLK_SYSBUSDIV16 (RCC_APB1DIV1_APB1I2CDIV_DIV16) + +#define RCC_I2C1KERCLK_SRC_MASK (~RCC_APB1SEL1_I2C1KERSEL ) +#define RCC_I2C2KERCLK_SRC_MASK (~RCC_APB1SEL1_I2C2KERSEL ) +#define RCC_I2C3KERCLK_SRC_MASK (~RCC_APB1SEL1_I2C3KERSEL ) +#define RCC_I2C4KERCLK_SRC_MASK (~RCC_APB2SEL1_I2C4KERSEL ) +#define RCC_I2C5KERCLK_SRC_MASK (~RCC_APB2SEL1_I2C5KERSEL ) +#define RCC_I2C6KERCLK_SRC_MASK (~RCC_APB2SEL1_I2C6KERSEL ) +#define RCC_I2C7KERCLK_SRC_MASK (~RCC_APB5SEL1_I2C7KERSEL ) +#define RCC_I2C8KERCLK_SRC_MASK (~RCC_APB5SEL1_I2C8KERSEL ) +#define RCC_I2C9KERCLK_SRC_MASK (~RCC_APB5SEL1_I2C9KERSEL ) +#define RCC_I2C10KERCLK_SRC_MASK (~RCC_APB5SEL1_I2C10KERSEL ) + +#define RCC_I2CKERCLK_SRC_SYSBUSDIV (RCC_APB1SEL1_I2C3KERSEL_SYSBUSDIV) +#define RCC_I2CKERCLK_SRC_PLL3C (RCC_APB1SEL1_I2C3KERSEL_PLL3C ) +#define RCC_I2CKERCLK_SRC_HSI (RCC_APB1SEL1_I2C3KERSEL_HSI ) +#define RCC_I2CKERCLK_SRC_MSI (RCC_APB1SEL1_I2C3KERSEL_MSI ) + + +/** CAN FD Kernel clock selection register **/ +#define RCC_FDCAN1_2_5_6_KERCLK_SYSBUSDIV_MASK (~RCC_APB1DIV1_APB1FDCANDIV ) +#define RCC_FDCAN3_4_7_8_KERCLK_SYSBUSDIV_MASK (~RCC_APB2DIV1_APB2FDCANDIV ) + +#define RCC_FDCANKERCLK_SYSBUSDIV1 (RCC_APB1DIV1_APB1FDCANDIV_DIV1 ) +#define RCC_FDCANKERCLK_SYSBUSDIV2 (RCC_APB1DIV1_APB1FDCANDIV_DIV2 ) +#define RCC_FDCANKERCLK_SYSBUSDIV4 (RCC_APB1DIV1_APB1FDCANDIV_DIV4 ) +#define RCC_FDCANKERCLK_SYSBUSDIV8 (RCC_APB1DIV1_APB1FDCANDIV_DIV8 ) +#define RCC_FDCANKERCLK_SYSBUSDIV16 (RCC_APB1DIV1_APB1FDCANDIV_DIV16) + +#define RCC_FDCAN1KERCLK_SRC_MASK (~RCC_APB1SEL1_FDCAN1KERSEL) +#define RCC_FDCAN2KERCLK_SRC_MASK (~RCC_APB1SEL1_FDCAN2KERSEL) +#define RCC_FDCAN5KERCLK_SRC_MASK (~RCC_APB1SEL2_FDCAN5KERSEL) +#define RCC_FDCAN6KERCLK_SRC_MASK (~RCC_APB1SEL2_FDCAN6KERSEL) +#define RCC_FDCAN3KERCLK_SRC_MASK (~RCC_APB2SEL2_FDCAN3KERSEL) +#define RCC_FDCAN4KERCLK_SRC_MASK (~RCC_APB2SEL2_FDCAN4KERSEL) +#define RCC_FDCAN7KERCLK_SRC_MASK (~RCC_APB2SEL2_FDCAN7KERSEL) +#define RCC_FDCAN8KERCLK_SRC_MASK (~RCC_APB2SEL2_FDCAN8KERSEL) + +#define RCC_FDCANKERCLK_SRC_SYSBUSDIV (RCC_APB1SEL1_FDCAN2KERSEL_SYSBUSDIV) +#define RCC_FDCANKERCLK_SRC_PLL1C (RCC_APB1SEL1_FDCAN2KERSEL_PLL1C ) +#define RCC_FDCANKERCLK_SRC_PLL2C (RCC_APB1SEL1_FDCAN2KERSEL_PLL2C ) +#define RCC_FDCANKERCLK_SRC_PLL3B (RCC_APB1SEL1_FDCAN2KERSEL_PLL3B ) +#define RCC_FDCANKERCLK_SRC_PERIPH (RCC_APB1SEL1_FDCAN2KERSEL_PERIPH) + + +/** EXTI clock source selection. **/ + +#define RCC_EXTI_SYSBUSDIV_MASK (~RCC_APB5DIV1_APB5EXTIDIV ) +#define RCC_EXTICLK_SYSBUSDIV1 (RCC_APB5DIV1_APB5EXTIDIV_DIV1 ) +#define RCC_EXTICLK_SYSBUSDIV2 (RCC_APB5DIV1_APB5EXTIDIV_DIV2 ) +#define RCC_EXTICLK_SYSBUSDIV4 (RCC_APB5DIV1_APB5EXTIDIV_DIV4 ) +#define RCC_EXTICLK_SYSBUSDIV8 (RCC_APB5DIV1_APB5EXTIDIV_DIV8 ) +#define RCC_EXTICLK_SYSBUSDIV16 (RCC_APB5DIV1_APB5EXTIDIV_DIV16) + +/** RTC Kernel clock source selection. The BDRST bit can be used to reset this field **/ +#define RCC_RTC_ENABLE (RCC_BDCTRL_RTCEN) + +#define RCC_RTCCLK_SRC_MASK (~RCC_BDCTRL_RTCSEL) +#define RCC_RTCCLK_SRC_LSE (RCC_BDCTRL_RTCSEL_LSE) +#define RCC_RTCCLK_SRC_LSI (RCC_BDCTRL_RTCSEL_LSI) +#define RCC_RTCCLK_SRC_HSEDIV (RCC_BDCTRL_RTCSEL_HSEDIV) + +#define RCC_RTCCLK_HSEDIV_MASK (~RCC_CFG5_RTCHSEDIV ) +#define RCC_RTCCLK_HSEDIV1 (RCC_CFG5_RTCHSEDIV_DIV1 ) +#define RCC_RTCCLK_HSEDIV2 (RCC_CFG5_RTCHSEDIV_DIV2 ) +#define RCC_RTCCLK_HSEDIV3 (RCC_CFG5_RTCHSEDIV_DIV3 ) +#define RCC_RTCCLK_HSEDIV4 (RCC_CFG5_RTCHSEDIV_DIV4 ) +#define RCC_RTCCLK_HSEDIV5 (RCC_CFG5_RTCHSEDIV_DIV5 ) +#define RCC_RTCCLK_HSEDIV6 (RCC_CFG5_RTCHSEDIV_DIV6 ) +#define RCC_RTCCLK_HSEDIV7 (RCC_CFG5_RTCHSEDIV_DIV7 ) +#define RCC_RTCCLK_HSEDIV8 (RCC_CFG5_RTCHSEDIV_DIV8 ) +#define RCC_RTCCLK_HSEDIV9 (RCC_CFG5_RTCHSEDIV_DIV9 ) +#define RCC_RTCCLK_HSEDIV10 (RCC_CFG5_RTCHSEDIV_DIV10 ) +#define RCC_RTCCLK_HSEDIV11 (RCC_CFG5_RTCHSEDIV_DIV11 ) +#define RCC_RTCCLK_HSEDIV12 (RCC_CFG5_RTCHSEDIV_DIV12 ) +#define RCC_RTCCLK_HSEDIV13 (RCC_CFG5_RTCHSEDIV_DIV13 ) +#define RCC_RTCCLK_HSEDIV14 (RCC_CFG5_RTCHSEDIV_DIV14 ) +#define RCC_RTCCLK_HSEDIV15 (RCC_CFG5_RTCHSEDIV_DIV15 ) +#define RCC_RTCCLK_HSEDIV16 (RCC_CFG5_RTCHSEDIV_DIV16 ) +#define RCC_RTCCLK_HSEDIV17 (RCC_CFG5_RTCHSEDIV_DIV17 ) +#define RCC_RTCCLK_HSEDIV18 (RCC_CFG5_RTCHSEDIV_DIV18 ) +#define RCC_RTCCLK_HSEDIV19 (RCC_CFG5_RTCHSEDIV_DIV19 ) +#define RCC_RTCCLK_HSEDIV20 (RCC_CFG5_RTCHSEDIV_DIV20 ) +#define RCC_RTCCLK_HSEDIV21 (RCC_CFG5_RTCHSEDIV_DIV21 ) +#define RCC_RTCCLK_HSEDIV22 (RCC_CFG5_RTCHSEDIV_DIV22 ) +#define RCC_RTCCLK_HSEDIV23 (RCC_CFG5_RTCHSEDIV_DIV23 ) +#define RCC_RTCCLK_HSEDIV24 (RCC_CFG5_RTCHSEDIV_DIV24 ) +#define RCC_RTCCLK_HSEDIV25 (RCC_CFG5_RTCHSEDIV_DIV25 ) +#define RCC_RTCCLK_HSEDIV26 (RCC_CFG5_RTCHSEDIV_DIV26 ) +#define RCC_RTCCLK_HSEDIV27 (RCC_CFG5_RTCHSEDIV_DIV27 ) +#define RCC_RTCCLK_HSEDIV28 (RCC_CFG5_RTCHSEDIV_DIV28 ) +#define RCC_RTCCLK_HSEDIV29 (RCC_CFG5_RTCHSEDIV_DIV29 ) +#define RCC_RTCCLK_HSEDIV30 (RCC_CFG5_RTCHSEDIV_DIV30 ) +#define RCC_RTCCLK_HSEDIV31 (RCC_CFG5_RTCHSEDIV_DIV31 ) +#define RCC_RTCCLK_HSEDIV32 (RCC_CFG5_RTCHSEDIV_DIV32 ) +#define RCC_RTCCLK_HSEDIV33 (RCC_CFG5_RTCHSEDIV_DIV33 ) +#define RCC_RTCCLK_HSEDIV34 (RCC_CFG5_RTCHSEDIV_DIV34 ) +#define RCC_RTCCLK_HSEDIV35 (RCC_CFG5_RTCHSEDIV_DIV35 ) +#define RCC_RTCCLK_HSEDIV36 (RCC_CFG5_RTCHSEDIV_DIV36 ) +#define RCC_RTCCLK_HSEDIV37 (RCC_CFG5_RTCHSEDIV_DIV37 ) +#define RCC_RTCCLK_HSEDIV38 (RCC_CFG5_RTCHSEDIV_DIV38 ) +#define RCC_RTCCLK_HSEDIV39 (RCC_CFG5_RTCHSEDIV_DIV39 ) +#define RCC_RTCCLK_HSEDIV40 (RCC_CFG5_RTCHSEDIV_DIV40 ) +#define RCC_RTCCLK_HSEDIV41 (RCC_CFG5_RTCHSEDIV_DIV41 ) +#define RCC_RTCCLK_HSEDIV42 (RCC_CFG5_RTCHSEDIV_DIV42 ) +#define RCC_RTCCLK_HSEDIV43 (RCC_CFG5_RTCHSEDIV_DIV43 ) +#define RCC_RTCCLK_HSEDIV44 (RCC_CFG5_RTCHSEDIV_DIV44 ) +#define RCC_RTCCLK_HSEDIV45 (RCC_CFG5_RTCHSEDIV_DIV45 ) +#define RCC_RTCCLK_HSEDIV46 (RCC_CFG5_RTCHSEDIV_DIV46 ) +#define RCC_RTCCLK_HSEDIV47 (RCC_CFG5_RTCHSEDIV_DIV47 ) +#define RCC_RTCCLK_HSEDIV48 (RCC_CFG5_RTCHSEDIV_DIV48 ) +#define RCC_RTCCLK_HSEDIV49 (RCC_CFG5_RTCHSEDIV_DIV49 ) +#define RCC_RTCCLK_HSEDIV50 (RCC_CFG5_RTCHSEDIV_DIV50 ) +#define RCC_RTCCLK_HSEDIV51 (RCC_CFG5_RTCHSEDIV_DIV51 ) +#define RCC_RTCCLK_HSEDIV52 (RCC_CFG5_RTCHSEDIV_DIV52 ) +#define RCC_RTCCLK_HSEDIV53 (RCC_CFG5_RTCHSEDIV_DIV53 ) +#define RCC_RTCCLK_HSEDIV54 (RCC_CFG5_RTCHSEDIV_DIV54 ) +#define RCC_RTCCLK_HSEDIV55 (RCC_CFG5_RTCHSEDIV_DIV55 ) +#define RCC_RTCCLK_HSEDIV56 (RCC_CFG5_RTCHSEDIV_DIV56 ) +#define RCC_RTCCLK_HSEDIV57 (RCC_CFG5_RTCHSEDIV_DIV57 ) +#define RCC_RTCCLK_HSEDIV58 (RCC_CFG5_RTCHSEDIV_DIV58 ) +#define RCC_RTCCLK_HSEDIV59 (RCC_CFG5_RTCHSEDIV_DIV59 ) +#define RCC_RTCCLK_HSEDIV60 (RCC_CFG5_RTCHSEDIV_DIV60 ) +#define RCC_RTCCLK_HSEDIV61 (RCC_CFG5_RTCHSEDIV_DIV61 ) +#define RCC_RTCCLK_HSEDIV62 (RCC_CFG5_RTCHSEDIV_DIV62 ) +#define RCC_RTCCLK_HSEDIV63 (RCC_CFG5_RTCHSEDIV_DIV63 ) + +#define RCC_BKUP_RESET (RCC_BDCTRL_BDRST) +#define RCC_DCMU_RESET (RCC_CFG4_DCMURST) +/** LPTIMER1 Kernel clock selection register **/ +#define RCC_LPTIM1CLK_SRC_MASK (~RCC_RDSEL1_LPTIM1SEL ) +#define RCC_LPTIM2CLK_SRC_MASK (~RCC_RDSEL1_LPTIM2SEL ) +#define RCC_LPTIM3CLK_SRC_MASK (~RCC_RDSEL1_LPTIM3SEL ) +#define RCC_LPTIM4CLK_SRC_MASK (~RCC_RDSEL1_LPTIM4SEL ) +#define RCC_LPTIM5CLK_SRC_MASK (~RCC_RDSEL1_LPTIM5SEL ) + +#define RCC_LPTIMCLK_SRC_APB5 (RCC_RDSEL1_LPTIM1SEL_APB5 ) +#define RCC_LPTIMCLK_SRC_LSI (RCC_RDSEL1_LPTIM1SEL_LSI ) +#define RCC_LPTIMCLK_SRC_LSE (RCC_RDSEL1_LPTIM1SEL_LSE ) +#define RCC_LPTIMCLK_SRC_HSE (RCC_RDSEL1_LPTIM1SEL_HSE ) +#define RCC_LPTIMCLK_SRC_HSI (RCC_RDSEL1_LPTIM1SEL_HSI ) +#define RCC_LPTIMCLK_SRC_MSI (RCC_RDSEL1_LPTIM1SEL_MSI ) +#define RCC_LPTIMCLK_SRC_COMP1 (RCC_RDSEL1_LPTIM1SEL_COMP1) +#define RCC_LPTIMCLK_SRC_COMP2 (RCC_RDSEL1_LPTIM1SEL_COMP2) +#define RCC_LPTIMCLK_SRC_COMP3 (RCC_RDSEL1_LPTIM1SEL_COMP3) +#define RCC_LPTIMCLK_SRC_COMP4 (RCC_RDSEL1_LPTIM1SEL_COMP4) + +#define RCC_GATEEN_LPTIM1_COMP1 (RCC_RDCTRL1_LPTIM1COMP1EN) +#define RCC_GATEEN_LPTIM1_COMP2 (RCC_RDCTRL1_LPTIM1COMP2EN) +#define RCC_GATEEN_LPTIM1_COMP3 (RCC_RDCTRL1_LPTIM1COMP3EN) +#define RCC_GATEEN_LPTIM1_COMP4 (RCC_RDCTRL1_LPTIM1COMP4EN) + +#define RCC_GATEEN_LPTIM2_COMP1 (RCC_RDCTRL1_LPTIM2COMP1EN) +#define RCC_GATEEN_LPTIM2_COMP2 (RCC_RDCTRL1_LPTIM2COMP2EN) +#define RCC_GATEEN_LPTIM2_COMP3 (RCC_RDCTRL1_LPTIM2COMP3EN) +#define RCC_GATEEN_LPTIM2_COMP4 (RCC_RDCTRL1_LPTIM2COMP4EN) + +#define RCC_GATEEN_LPTIM3_COMP1 (RCC_RDCTRL2_LPTIM3COMP1EN) +#define RCC_GATEEN_LPTIM3_COMP2 (RCC_RDCTRL2_LPTIM3COMP2EN) +#define RCC_GATEEN_LPTIM3_COMP3 (RCC_RDCTRL2_LPTIM3COMP3EN) +#define RCC_GATEEN_LPTIM3_COMP4 (RCC_RDCTRL2_LPTIM3COMP4EN) + +#define RCC_GATEEN_LPTIM4_COMP1 (RCC_RDCTRL2_LPTIM4COMP1EN) +#define RCC_GATEEN_LPTIM4_COMP2 (RCC_RDCTRL2_LPTIM4COMP2EN) +#define RCC_GATEEN_LPTIM4_COMP3 (RCC_RDCTRL2_LPTIM4COMP3EN) +#define RCC_GATEEN_LPTIM4_COMP4 (RCC_RDCTRL2_LPTIM4COMP4EN) + +#define RCC_GATEEN_LPTIM5_COMP1 (RCC_RDCTRL3_LPTIM5COMP1EN) +#define RCC_GATEEN_LPTIM5_COMP2 (RCC_RDCTRL3_LPTIM5COMP2EN) +#define RCC_GATEEN_LPTIM5_COMP3 (RCC_RDCTRL3_LPTIM5COMP3EN) +#define RCC_GATEEN_LPTIM5_COMP4 (RCC_RDCTRL3_LPTIM5COMP4EN) + +/** LPUART1 Kernel clock selection register **/ +#define RCC_LPUART1CLK_SRC_MASK (~RCC_RDSEL1_LPUART1SEL ) +#define RCC_LPUART2CLK_SRC_MASK (~RCC_RDSEL1_LPUART2SEL ) + +#define RCC_LPUARTCLK_SRC_SYSBUSDIV (RCC_RDSEL1_LPUART1SEL_SYSBUSDIV ) +#define RCC_LPUARTCLK_SRC_HSI (RCC_RDSEL1_LPUART1SEL_HSI ) +#define RCC_LPUARTCLK_SRC_LSE (RCC_RDSEL1_LPUART1SEL_LSE ) +#define RCC_LPUARTCLK_SRC_HSE (RCC_RDSEL1_LPUART1SEL_HSE ) +#define RCC_LPUARTCLK_SRC_MSI (RCC_RDSEL1_LPUART1SEL_MSI ) + +#define RCC_LPUARTCLK_SYSBUSDIV_MASK (~RCC_RDDIV1_LPUARTDIV ) +#define RCC_LPUARTCLK_SYSBUSDIV1 (RCC_RDDIV1_LPUARTDIV_DIV1 ) +#define RCC_LPUARTCLK_SYSBUSDIV2 (RCC_RDDIV1_LPUARTDIV_DIV2 ) +#define RCC_LPUARTCLK_SYSBUSDIV4 (RCC_RDDIV1_LPUARTDIV_DIV4 ) +#define RCC_LPUARTCLK_SYSBUSDIV8 (RCC_RDDIV1_LPUARTDIV_DIV8 ) +#define RCC_LPUARTCLK_SYSBUSDIV16 (RCC_RDDIV1_LPUARTDIV_DIV16) + +/** Comparator Controller Clock Switch Selection **/ + +#define RCC_COMPLSXCLK_SRC_MASK (~RCC_RDSEL1_COMPSEL ) +#define RCC_COMPLSXCLK_SRC_LSI (RCC_REG_BIT_MASK ) +#define RCC_COMPLSXCLK_SRC_LSE (RCC_RDSEL1_COMPSEL ) + +#define RCC_COMPKERCLK_SYSBUSDIV_MASK (~RCC_RDDIV1_COMPDIV ) +#define RCC_COMPKERCLK_SYSBUSDIV1 (RCC_RDDIV1_COMPDIV_DIV1 ) +#define RCC_COMPKERCLK_SYSBUSDIV2 (RCC_RDDIV1_COMPDIV_DIV2 ) +#define RCC_COMPKERCLK_SYSBUSDIV4 (RCC_RDDIV1_COMPDIV_DIV4 ) +#define RCC_COMPKERCLK_SYSBUSDIV8 (RCC_RDDIV1_COMPDIV_DIV8 ) +#define RCC_COMPKERCLK_SYSBUSDIV16 (RCC_RDDIV1_COMPDIV_DIV16) + +/** FEMC clock values **/ +#define RCC_FEMCM0CLK_SRC_MASK (~RCC_AXISEL2_FEMCM0SEL) +#define RCC_FEMCM1CLK_SRC_MASK (~RCC_AXISEL2_FEMCM1SEL) +#define RCC_FEMCCLK_SRC_AXIDIV (RCC_AXISEL2_FEMCM0SEL_AXIDIV) +#define RCC_FEMCCLK_SRC_PERIPH (RCC_AXISEL2_FEMCM0SEL_PERIPH) +#define RCC_FEMCCLK_SRC_PLL2C (RCC_AXISEL2_FEMCM0SEL_PLL2C ) +#define RCC_FEMCCLK_SRC_PLL3B (RCC_AXISEL2_FEMCM0SEL_PLL3B ) +#define RCC_FEMCCLK_SRC_PLL1B (RCC_AXISEL2_FEMCM0SEL_PLL1B ) + +#define RCC_FEMCM0CLK_AXIDIV_MASK (~RCC_AXIDIV2_FEMCM0AXIDIV ) +#define RCC_FEMCM1CLK_AXIDIV_MASK (~RCC_AXIDIV2_FEMCM1AXIDIV ) +#define RCC_FEMCCLK_AXIDIV1 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV1 ) +#define RCC_FEMCCLK_AXIDIV2 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV2 ) +#define RCC_FEMCCLK_AXIDIV3 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV3 ) +#define RCC_FEMCCLK_AXIDIV4 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV4 ) +#define RCC_FEMCCLK_AXIDIV5 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV5 ) +#define RCC_FEMCCLK_AXIDIV6 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV6 ) +#define RCC_FEMCCLK_AXIDIV7 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV7 ) +#define RCC_FEMCCLK_AXIDIV8 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV8 ) +#define RCC_FEMCCLK_AXIDIV9 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV9 ) +#define RCC_FEMCCLK_AXIDIV10 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV10) +#define RCC_FEMCCLK_AXIDIV11 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV11) +#define RCC_FEMCCLK_AXIDIV12 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV12) +#define RCC_FEMCCLK_AXIDIV13 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV13) +#define RCC_FEMCCLK_AXIDIV14 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV14) +#define RCC_FEMCCLK_AXIDIV15 (RCC_AXIDIV2_FEMCM0AXIDIV_DIV15) + +/** DSI clock values **/ +#define RCC_DSIREFCLK_HSE_DIV_MASK (~RCC_CFG5_DSIHSEDIV ) +#define RCC_DSIREFCLK_HSE_DIV1 (RCC_REG_BIT_MASK ) +#define RCC_DSIREFCLK_HSE_DIV2 (RCC_CFG5_DSIHSEDIV_0 ) + +#define RCC_DSIKERCLK_SRC_MASK (~RCC_AXISEL1_DSIKERSEL ) +#define RCC_DSIKERCLK_SRC_REF (RCC_REG_BIT_MASK ) +#define RCC_DSIKERCLK_SRC_PLL3C (RCC_AXISEL1_DSIKERSEL_0 ) + +#define RCC_DSIPPICLK_SRC_MASK (~RCC_AXISEL1_DSIPPITXSEL) +#define RCC_DSIPPICLK_SRC_REFDIV (RCC_AXISEL1_DSIPPITXSEL_REFDIV) +#define RCC_DSIPPICLK_SRC_PLL2B (RCC_AXISEL1_DSIPPITXSEL_PLL2B ) +#define RCC_DSIPPICLK_SRC_PERIPH (RCC_AXISEL1_DSIPPITXSEL_PERIPH) +#define RCC_DSIPPICLK_SRC_AXIDIV (RCC_AXISEL1_DSIPPITXSEL_AXIDIV) + +#define RCC_DSIPPICLK_REFDIV_MASK (~RCC_AXIDIV1_DSIREFDIV ) +#define RCC_DSIPPICLK_AXIDIV_MASK (~RCC_AXIDIV2_DSIAXIPPIDIV ) +#define RCC_DSIPPICLK_DIV1 (RCC_AXIDIV1_DSIREFDIV_DIV1 ) +#define RCC_DSIPPICLK_DIV2 (RCC_AXIDIV1_DSIREFDIV_DIV2 ) +#define RCC_DSIPPICLK_DIV4 (RCC_AXIDIV1_DSIREFDIV_DIV4 ) +#define RCC_DSIPPICLK_DIV8 (RCC_AXIDIV1_DSIREFDIV_DIV8 ) +#define RCC_DSIPPICLK_DIV16 (RCC_AXIDIV1_DSIREFDIV_DIV16 ) +#define RCC_DSIPPICLK_DIV32 (RCC_AXIDIV1_DSIREFDIV_DIV32 ) +#define RCC_DSIPPICLK_DIV64 (RCC_AXIDIV1_DSIREFDIV_DIV64 ) +#define RCC_DSIPPICLK_DIV128 (RCC_AXIDIV1_DSIREFDIV_DIV128) +#define RCC_DSIPPICLK_DIV256 (RCC_AXIDIV1_DSIREFDIV_DIV256) +#define RCC_DSIPPICLK_DIV512 (RCC_AXIDIV1_DSIREFDIV_DIV512) + +#define RCC_DSIULPSCLK_SRC_MASK (~RCC_AXISEL1_DSIULPSSEL ) +#define RCC_DSIULPSCLK_SRC_REFDIV (RCC_REG_BIT_MASK ) +#define RCC_DSIULPSCLK_SRC_PLL3C (RCC_AXISEL1_DSIULPSSEL_0 ) + +#define RCC_DSIULPSCLK_REFDIV_MASK (~RCC_AXIDIV2_DSIREFULPSDIV ) +#define RCC_DSIULPSCLK_REFDIV1 (RCC_AXIDIV2_DSIREFULPSDIV_DIV1 ) +#define RCC_DSIULPSCLK_REFDIV2 (RCC_AXIDIV2_DSIREFULPSDIV_DIV2 ) +#define RCC_DSIULPSCLK_REFDIV4 (RCC_AXIDIV2_DSIREFULPSDIV_DIV4 ) +#define RCC_DSIULPSCLK_REFDIV8 (RCC_AXIDIV2_DSIREFULPSDIV_DIV8 ) +#define RCC_DSIULPSCLK_REFDIV16 (RCC_AXIDIV2_DSIREFULPSDIV_DIV16 ) +#define RCC_DSIULPSCLK_REFDIV32 (RCC_AXIDIV2_DSIREFULPSDIV_DIV32 ) +#define RCC_DSIULPSCLK_REFDIV64 (RCC_AXIDIV2_DSIREFULPSDIV_DIV64 ) +#define RCC_DSIULPSCLK_REFDIV128 (RCC_AXIDIV2_DSIREFULPSDIV_DIV128) +#define RCC_DSIULPSCLK_REFDIV256 (RCC_AXIDIV2_DSIREFULPSDIV_DIV256) +#define RCC_DSIULPSCLK_REFDIV512 (RCC_AXIDIV2_DSIREFULPSDIV_DIV512) + +/** "axi_gated_bus_div_lcdc_clk" prescalar values **/ +#define RCC_LCDCPIXELCLK_SRC_MASK (~RCC_AXISEL1_LCDCKERSEL) +#define RCC_LCDCPIXELCLK_SRC_AXIDIV (RCC_AXISEL1_LCDCKERSEL_AXIDIV) +#define RCC_LCDCPIXELCLK_SRC_PERIPH (RCC_AXISEL1_LCDCKERSEL_PERIPH) +#define RCC_LCDCPIXELCLK_SRC_PLL2C (RCC_AXISEL1_LCDCKERSEL_PLL2C ) +#define RCC_LCDCPIXELCLK_SRC_PLL3B (RCC_AXISEL1_LCDCKERSEL_PLL3B ) + +#define RCC_LCDCPIXELCLK_AXIDIV_MASK (~RCC_AXIDIV1_LCDCAXIDIV ) +#define RCC_LCDCPIXELCLK_AXIDIV1 (RCC_AXIDIV1_LCDCAXIDIV_DIV1 ) +#define RCC_LCDCPIXELCLK_AXIDIV2 (RCC_AXIDIV1_LCDCAXIDIV_DIV2 ) +#define RCC_LCDCPIXELCLK_AXIDIV4 (RCC_AXIDIV1_LCDCAXIDIV_DIV4 ) +#define RCC_LCDCPIXELCLK_AXIDIV8 (RCC_AXIDIV1_LCDCAXIDIV_DIV8 ) +#define RCC_LCDCPIXELCLK_AXIDIV16 (RCC_AXIDIV1_LCDCAXIDIV_DIV16 ) +#define RCC_LCDCPIXELCLK_AXIDIV32 (RCC_AXIDIV1_LCDCAXIDIV_DIV32 ) +#define RCC_LCDCPIXELCLK_AXIDIV64 (RCC_AXIDIV1_LCDCAXIDIV_DIV64 ) +#define RCC_LCDCPIXELCLK_AXIDIV128 (RCC_AXIDIV1_LCDCAXIDIV_DIV128) +#define RCC_LCDCPIXELCLK_AXIDIV256 (RCC_AXIDIV1_LCDCAXIDIV_DIV256) +#define RCC_LCDCPIXELCLK_AXIDIV512 (RCC_AXIDIV1_LCDCAXIDIV_DIV512) + +/** DVP values **/ +#define RCC_DVP1MCLK_SRC_MASK (~RCC_AXISEL1_DVP1MSEL) +#define RCC_DVP2MCLK_SRC_MASK (~RCC_AXISEL1_DVP2MSEL) +#define RCC_DVPMCLK_SRC_AXIDIV (RCC_AXISEL1_DVP1MSEL_AXIDIV) +#define RCC_DVPMCLK_SRC_PERIPH (RCC_AXISEL1_DVP1MSEL_PERIPH) +#define RCC_DVPMCLK_SRC_PLL2C (RCC_AXISEL1_DVP1MSEL_PLL2C ) +#define RCC_DVPMCLK_SRC_PLL3A (RCC_AXISEL1_DVP1MSEL_PLL3A ) + +#define RCC_DVPMCLK_AXIDIV_MASK (~RCC_AXIDIV1_DVPMAXIDIV ) +#define RCC_DVPMCLK_AXIDIV1 (RCC_AXIDIV1_DVPMAXIDIV_DIV1 ) +#define RCC_DVPMCLK_AXIDIV2 (RCC_AXIDIV1_DVPMAXIDIV_DIV2 ) +#define RCC_DVPMCLK_AXIDIV4 (RCC_AXIDIV1_DVPMAXIDIV_DIV4 ) +#define RCC_DVPMCLK_AXIDIV8 (RCC_AXIDIV1_DVPMAXIDIV_DIV8 ) +#define RCC_DVPMCLK_AXIDIV16 (RCC_AXIDIV1_DVPMAXIDIV_DIV16 ) +#define RCC_DVPMCLK_AXIDIV32 (RCC_AXIDIV1_DVPMAXIDIV_DIV32 ) +#define RCC_DVPMCLK_AXIDIV64 (RCC_AXIDIV1_DVPMAXIDIV_DIV64 ) +#define RCC_DVPMCLK_AXIDIV128 (RCC_AXIDIV1_DVPMAXIDIV_DIV128) +#define RCC_DVPMCLK_AXIDIV256 (RCC_AXIDIV1_DVPMAXIDIV_DIV256) +#define RCC_DVPMCLK_AXIDIV512 (RCC_AXIDIV1_DVPMAXIDIV_DIV512) +/** XSPI values **/ +#define RCC_XSPI1SSICLK_SRC_MASK (~RCC_AXISEL1_XSPI1SSISEL ) +#define RCC_XSPI2SSICLK_SRC_MASK (~RCC_AXISEL1_XSPI2SSISEL ) +#define RCC_XSPISSICLK_SRC_AXI (RCC_AXISEL1_XSPI1SSISEL_AXI ) +#define RCC_XSPISSICLK_SRC_PLL3C (RCC_AXISEL1_XSPI1SSISEL_PLL3C) +#define RCC_XSPISSICLK_SRC_PLL1B (RCC_AXISEL1_XSPI1SSISEL_PLL1B) +#define RCC_XSPISSICLK_SRC_PLL2A (RCC_AXISEL1_XSPI1SSISEL_PLL2A) +#define RCC_XSPISSICLK_SRC_PLL2C (RCC_AXISEL1_XSPI1SSISEL_PLL2C) + +/** SDRAM values **/ +#define RCC_SDRAMMEMCLK_SRC_MASK (~RCC_AXISEL2_SDRAMMEMSEL) +#define RCC_SDRAMMEMCLK_SRC_AXIDIV (RCC_AXISEL2_SDRAMMEMSEL_AXIDIV) +#define RCC_SDRAMMEMCLK_SRC_PERIPH (RCC_AXISEL2_SDRAMMEMSEL_PERIPH) +#define RCC_SDRAMMEMCLK_SRC_PLL2A (RCC_AXISEL2_SDRAMMEMSEL_PLL2A ) +#define RCC_SDRAMMEMCLK_SRC_PLL3A (RCC_AXISEL2_SDRAMMEMSEL_PLL3A ) +#define RCC_SDRAMMEMCLK_SRC_PLL1B (RCC_AXISEL2_SDRAMMEMSEL_PLL1B ) + +#define RCC_SDRAMMEMCLK_AXIDIV_MASK (~RCC_AXIDIV2_SDRAMMEMDIV ) +#define RCC_SDRAMMEMCLK_AXIDIV1 (RCC_AXIDIV2_SDRAMMEMDIV_DIV1 ) +#define RCC_SDRAMMEMCLK_AXIDIV2 (RCC_AXIDIV2_SDRAMMEMDIV_DIV2 ) +#define RCC_SDRAMMEMCLK_AXIDIV4 (RCC_AXIDIV2_SDRAMMEMDIV_DIV4 ) +#define RCC_SDRAMMEMCLK_AXIDIV8 (RCC_AXIDIV2_SDRAMMEMDIV_DIV8 ) +#define RCC_SDRAMMEMCLK_AXIDIV16 (RCC_AXIDIV2_SDRAMMEMDIV_DIV16 ) +#define RCC_SDRAMMEMCLK_AXIDIV32 (RCC_AXIDIV2_SDRAMMEMDIV_DIV32 ) +#define RCC_SDRAMMEMCLK_AXIDIV64 (RCC_AXIDIV2_SDRAMMEMDIV_DIV64 ) +#define RCC_SDRAMMEMCLK_AXIDIV128 (RCC_AXIDIV2_SDRAMMEMDIV_DIV128) +#define RCC_SDRAMMEMCLK_AXIDIV256 (RCC_AXIDIV2_SDRAMMEMDIV_DIV256) +#define RCC_SDRAMMEMCLK_AXIDIV512 (RCC_AXIDIV2_SDRAMMEMDIV_DIV512) + +/** ETHERCAT values **/ +#define RCC_ESCKERCLK_SRC_MASK (~RCC_AHB9SEL1_ESCKERSEL) +#define RCC_ESCKERCLK_SRC_SYSBUSDIV (RCC_AHB9SEL1_ESCKERSEL_SYSBUSDIV) +#define RCC_ESCKERCLK_SRC_PLL2B (RCC_AHB9SEL1_ESCKERSEL_PLL2B ) +#define RCC_ESCKERCLK_SRC_PLL3A (RCC_AHB9SEL1_ESCKERSEL_PLL3A ) +#define RCC_ESCKERCLK_SRC_PLL3C (RCC_AHB9SEL1_ESCKERSEL_PLL3C ) +#define RCC_ESCKERCLK_SRC_PLL1B (RCC_AHB9SEL1_ESCKERSEL_PLL1B ) + +#define RCC_ESCKERCLK_SYSBUSDIV_MASK (~RCC_AHB9DIV1_ESCSYSDIV ) +#define RCC_ESCKERCLK_SYSBUSDIV1 (RCC_AHB9DIV1_ESCSYSDIV_DIV1 ) +#define RCC_ESCKERCLK_SYSBUSDIV2 (RCC_AHB9DIV1_ESCSYSDIV_DIV2 ) +#define RCC_ESCKERCLK_SYSBUSDIV4 (RCC_AHB9DIV1_ESCSYSDIV_DIV4 ) +#define RCC_ESCKERCLK_SYSBUSDIV8 (RCC_AHB9DIV1_ESCSYSDIV_DIV8 ) +#define RCC_ESCKERCLK_SYSBUSDIV16 (RCC_AHB9DIV1_ESCSYSDIV_DIV16 ) +#define RCC_ESCKERCLK_SYSBUSDIV32 (RCC_AHB9DIV1_ESCSYSDIV_DIV32 ) +#define RCC_ESCKERCLK_SYSBUSDIV64 (RCC_AHB9DIV1_ESCSYSDIV_DIV64 ) +#define RCC_ESCKERCLK_SYSBUSDIV128 (RCC_AHB9DIV1_ESCSYSDIV_DIV128) +#define RCC_ESCKERCLK_SYSBUSDIV256 (RCC_AHB9DIV1_ESCSYSDIV_DIV256) +#define RCC_ESCKERCLK_SYSBUSDIV512 (RCC_AHB9DIV1_ESCSYSDIV_DIV512) +/** SDPU system clock DIV values **/ +#define RCC_TRNG_ENABLE (RCC_CFG5_TRNGEN ) + +#define RCC_TRNGCLK_SRC_MASK (~RCC_CFG5_TRNGSEL ) +#define RCC_TRNGCLK_SRC_SYSBUSDIV (RCC_REG_BIT_MASK ) +#define RCC_TRNGCLK_SRC_HSI (RCC_CFG5_TRNGSEL ) + +#define RCC_TRNGCLK_SYSBUSDIV_MASK (~RCC_CFG5_TRNGDIV ) +#define RCC_TRNGCLK_SYSBUSDIV1 (RCC_CFG5_TRNGDIV_DIV1 ) +#define RCC_TRNGCLK_SYSBUSDIV2 (RCC_CFG5_TRNGDIV_DIV2 ) +#define RCC_TRNGCLK_SYSBUSDIV4 (RCC_CFG5_TRNGDIV_DIV4 ) +#define RCC_TRNGCLK_SYSBUSDIV8 (RCC_CFG5_TRNGDIV_DIV8 ) +#define RCC_TRNGCLK_SYSBUSDIV16 (RCC_CFG5_TRNGDIV_DIV16 ) +#define RCC_TRNGCLK_SYSBUSDIV32 (RCC_CFG5_TRNGDIV_DIV32 ) +#define RCC_TRNGCLK_SYSBUSDIV64 (RCC_CFG5_TRNGDIV_DIV64 ) +#define RCC_TRNGCLK_SYSBUSDIV128 (RCC_CFG5_TRNGDIV_DIV128) +#define RCC_TRNGCLK_SYSBUSDIV256 (RCC_CFG5_TRNGDIV_DIV256) +#define RCC_TRNGCLK_SYSBUSDIV512 (RCC_CFG5_TRNGDIV_DIV512) + + +/** MCO1 clock selection register **/ +#define RCC_MCO1_SRC_MASK (~RCC_CFG3_MCO1SEL ) +#define RCC_MCO1_SRC_LSI (RCC_CFG3_MCO1SEL_LSI ) +#define RCC_MCO1_SRC_HSI (RCC_CFG3_MCO1SEL_HSI ) +#define RCC_MCO1_SRC_MSI (RCC_CFG3_MCO1SEL_MSI ) +#define RCC_MCO1_SRC_LSE (RCC_CFG3_MCO1SEL_LSE ) +#define RCC_MCO1_SRC_HSE (RCC_CFG3_MCO1SEL_HSE ) +#define RCC_MCO1_SRC_PLL3B (RCC_CFG3_MCO1SEL_PLL3B) + +/** MCO1 clock prescalar values **/ +#define RCC_MCO1_DIV_MASK (~RCC_CFG3_MCO1DIV ) +#define RCC_MCO1_DIV1 (RCC_CFG3_MCO1DIV_DIV1 ) +#define RCC_MCO1_DIV2 (RCC_CFG3_MCO1DIV_DIV2 ) +#define RCC_MCO1_DIV4 (RCC_CFG3_MCO1DIV_DIV4 ) +#define RCC_MCO1_DIV8 (RCC_CFG3_MCO1DIV_DIV8 ) +#define RCC_MCO1_DIV16 (RCC_CFG3_MCO1DIV_DIV16 ) +#define RCC_MCO1_DIV32 (RCC_CFG3_MCO1DIV_DIV32 ) +#define RCC_MCO1_DIV64 (RCC_CFG3_MCO1DIV_DIV64 ) +#define RCC_MCO1_DIV128 (RCC_CFG3_MCO1DIV_DIV128) + +/** MCO2 clock selection register **/ +#define RCC_MCO2_SRC_MASK (~RCC_CFG3_MCO2SEL ) +#define RCC_MCO2_SRC_SYSCLK (RCC_CFG3_MCO2SEL_SYSCLK) +#define RCC_MCO2_SRC_PLL1A (RCC_CFG3_MCO2SEL_PLL1A) +#define RCC_MCO2_SRC_PLL2A (RCC_CFG3_MCO2SEL_PLL2A) +#define RCC_MCO2_SRC_PLL3A (RCC_CFG3_MCO2SEL_PLL3A) +#define RCC_MCO2_SRC_SHRPLL (RCC_CFG3_MCO2SEL_SHRPLL) +#define RCC_MCO2_SRC_LSE (RCC_CFG3_MCO2SEL_LSE) + + +/** MCO2 clock prescalar values **/ +#define RCC_MCO2_DIV_MASK (~RCC_CFG3_MCO2DIV ) +#define RCC_MCO2_DIV1 (RCC_CFG3_MCO2DIV_DIV1 ) +#define RCC_MCO2_DIV2 (RCC_CFG3_MCO2DIV_DIV2 ) +#define RCC_MCO2_DIV4 (RCC_CFG3_MCO2DIV_DIV4 ) +#define RCC_MCO2_DIV8 (RCC_CFG3_MCO2DIV_DIV8 ) +#define RCC_MCO2_DIV16 (RCC_CFG3_MCO2DIV_DIV16 ) +#define RCC_MCO2_DIV32 (RCC_CFG3_MCO2DIV_DIV32 ) +#define RCC_MCO2_DIV64 (RCC_CFG3_MCO2DIV_DIV64 ) +#define RCC_MCO2_DIV128 (RCC_CFG3_MCO2DIV_DIV128) + +#define RCC_STOPEN_FDCAN1 (RCC_APB1EN5_FDCAN1STPREQ) +#define RCC_STOPEN_FDCAN2 (RCC_APB1EN5_FDCAN2STPREQ) +#define RCC_STOPEN_FDCAN5 (RCC_APB1EN5_FDCAN5STPREQ) +#define RCC_STOPEN_FDCAN6 (RCC_APB1EN5_FDCAN6STPREQ) +#define RCC_STOPEN_FDCAN3 (RCC_APB2EN4_FDCAN3STPREQ) +#define RCC_STOPEN_FDCAN4 (RCC_APB2EN4_FDCAN4STPREQ) +#define RCC_STOPEN_FDCAN7 (RCC_APB2EN4_FDCAN7STPREQ) +#define RCC_STOPEN_FDCAN8 (RCC_APB2EN4_FDCAN8STPREQ) + +#define RCC_FLAG_STOPACK_FDCAN1 (RCC_APB1EN5_FDCAN1STPACK) +#define RCC_FLAG_STOPACK_FDCAN2 (RCC_APB1EN5_FDCAN2STPACK) +#define RCC_FLAG_STOPACK_FDCAN5 (RCC_APB1EN5_FDCAN5STPACK) +#define RCC_FLAG_STOPACK_FDCAN6 (RCC_APB1EN5_FDCAN6STPACK) +#define RCC_FLAG_STOPACK_FDCAN3 (RCC_APB2EN4_FDCAN3STPACK) +#define RCC_FLAG_STOPACK_FDCAN4 (RCC_APB2EN4_FDCAN4STPACK) +#define RCC_FLAG_STOPACK_FDCAN7 (RCC_APB2EN4_FDCAN7STPACK) +#define RCC_FLAG_STOPACK_FDCAN8 (RCC_APB2EN4_FDCAN8STPACK) + +#define RCC_INT_LSECSS (RCC_CLKINT1_LSECSSIF) +#define RCC_INT_HSECSS (RCC_CLKINT1_HSECSSIF) +#define RCC_INT_BOR (RCC_CLKINT1_BORIF) +#define RCC_INT_PLL1RD (RCC_CLKINT1_PLL1RDIF) +#define RCC_INT_PLL2RD (RCC_CLKINT1_PLL2RDIF) +#define RCC_INT_PLL3RD (RCC_CLKINT1_PLL3RDIF) +#define RCC_INT_SHRPLLRD (RCC_CLKINT1_SHRPLLRDIF) + +#define RCC_INT_HSERD (RCC_CLKINT2_HSERDIF) +#define RCC_INT_HSIRD (RCC_CLKINT2_HSIRDIF) +#define RCC_INT_MSIRD (RCC_CLKINT2_MSIRDIF) +#define RCC_INT_LSERD (RCC_CLKINT2_LSERDIF) +#define RCC_INT_LSIRD (RCC_CLKINT2_LSIRDIF) +#define RCC_INT_HSICALE (RCC_CLKINT2_HSICALEIF) +#define RCC_INT_MSICALE (RCC_CLKINT2_MSICALEIF) + +#define RCC_INT_PLL1LKF (RCC_CLKINT3_PLL1LKFIF) +#define RCC_INT_PLL2LKF (RCC_CLKINT3_PLL2LKFIF) +#define RCC_INT_PLL3LKF (RCC_CLKINT3_PLL3LKFIF) +#define RCC_INT_SHRPLLLKF (RCC_CLKINT3_SHRPLLLKFIF) +#define RCC_INT_LSIF (RCC_CLKINT3_LSIFIF) + +#define RCC_RSTEN_WWDG1 (RCC_CFG1_WWDG1RSTEN ) +#define RCC_RSTEN_WWDG2 (RCC_CFG1_WWDG2RSTEN ) +#define RCC_RSTEN_BOR (RCC_BDCTRL_BORRSTEN ) +#define RCC_RSTEN_C1LP (RCC_BDCTRL_C1LPRSTEN ) +#define RCC_RSTEN_C2LP (RCC_BDCTRL_C2LPRSTEN ) +#define RCC_RSTEN_BKPEMC (RCC_BDCTRL_BKPEMCRSTEN) +#define RCC_RSTEN_RETEMC (RCC_BDCTRL_RETEMCRSTEN) + +/** source values **/ +#define RCC_HSITRIM_MASK (~RCC_SRCCTRL3_HSITRIM) +#define RCC_MSITRIM_MASK (~RCC_SRCCTRL2_MSITRIM) +#define RCC_HSECSS_ENABLE (RCC_SRCCTRL1_HSECSSEN) + +#define RCC_LSI_SRCCTRL_BY_SOFTWARE (RCC_BDCTRL_LSIOVREN) +#define RCC_LSI_SRCCTRL_BY_HARDWARE (~RCC_BDCTRL_LSIOVREN) +#define RCC_LSICSS_ENABLE (RCC_BDCTRL_LSICSSEN) +#define RCC_LSI_FAILACK_ENABLE (RCC_BDCTRL_LSIPFACK) + +#define RCC_LSE_CALCNT_ENABLE (RCC_LSEOS_LSECALCNTEN) +#define RCC_LSE_CALCNT_MASK (RCC_LSEOS_LSECALCNT) + +#define RCC_FLAG_LSECSS_CALCNTRD (RCC_LSEOS_LSECALCNTF) +#define RCC_FLAG_LSECSS_OFFSET (RCC_LSEOS_LSEOSF) + +#define RCC_LSE_OFFSET_ENABLE (RCC_LSEOS_LSEOSEN) +#define RCC_LSEOSTHR_MASK (~RCC_LSEOS_LSEOSTHR) + +#define RCC_HSE_CALCNT_ENABLE (RCC_HSECAL_HSECALCNTEN) +#define RCC_HSE_CALCNT_MASK (RCC_HSECAL_HSECALCNT) + +#define RCC_FLAG_HSECSS_CALCNTRD (RCC_HSECAL_HSECALCNTF) +#define RCC_FLAG_HSECSS_OFFSET (RCC_HSEOS_HSEOSF) +#define RCC_FLAG_HSECSS_MAXPD (RCC_HSEOS_HSEMAXPDF) +#define RCC_FLAG_HSECSS_MINND (RCC_HSEOS_HSEMINNDF) + +#define RCC_HSECSS_OFFSET (RCC_HSEOS_HSEOSEN) +#define RCC_HSECSS_MAXPD (RCC_HSEOS_HSEMAXPDEN) +#define RCC_HSECSS_MINND (RCC_HSEOS_HSEMINNDEN) + +#define RCC_HSEOSTHR_MASK (~RCC_HSEOS_HSEOSTHR) +#define RCC_HSEMAXPDTHR_MASK (~RCC_HSEOS_HSEMAXPDTHR) +#define RCC_HSEMINNDTHR_MASK (~RCC_HSEOS_HSEMINNDTHR) + +#define RCC_FAIL_DETECT_EN_SHRPLL (RCC_PLLFD_SHRPLLFEN) +#define RCC_FAIL_DETECT_EN_PLL3 (RCC_PLLFD_PLL3FEN) +#define RCC_FAIL_DETECT_EN_PLL2 (RCC_PLLFD_PLL2FEN) +#define RCC_FAIL_DETECT_EN_PLL1 (RCC_PLLFD_PLL1FEN) + +/** LPTIM filter values **/ +#define RCC_LPTIM1FILT_ENABLE (RCC_RDCTRL1_LPTIM1FLTEN) +#define RCC_LPTIM1_FILTCLK_SRC_MSI (RCC_RDCTRL1_LPTIM1FLTSEL) +#define RCC_LPTIM1_FILTCLK_SRC_APB5 (~RCC_RDCTRL1_LPTIM1FLTSEL) +#define I2C_LPTIM1FLTDFC_MASK (~RCC_RDCTRL1_LPTIM1FLTDFC) + +#define RCC_LPTIM2FILT_ENABLE (RCC_RDCTRL1_LPTIM2FLTEN) +#define RCC_LPTIM2_FILTCLK_SRC_MSI (RCC_RDCTRL1_LPTIM2FLTSEL) +#define RCC_LPTIM2_FILTCLK_SRC_APB5 (~RCC_RDCTRL1_LPTIM2FLTSEL) +#define I2C_LPTIM2FLTDFC_MASK (~RCC_RDCTRL1_LPTIM2FLTDFC) + +#define RCC_LPTIM3FILT_ENABLE (RCC_RDCTRL2_LPTIM3FLTEN) +#define RCC_LPTIM3_FILTCLK_SRC_MSI (RCC_RDCTRL2_LPTIM3FLTSEL) +#define RCC_LPTIM3_FILTCLK_SRC_APB5 (~RCC_RDCTRL2_LPTIM3FLTSEL) +#define I2C_LPTIM3FLTDFC_MASK (~RCC_RDCTRL2_LPTIM3FLTDFC) + +#define RCC_LPTIM4FILT_ENABLE (RCC_RDCTRL2_LPTIM4FLTEN) +#define RCC_LPTIM4_FILTCLK_SRC_MSI (RCC_RDCTRL2_LPTIM4FLTSEL) +#define RCC_LPTIM4_FILTCLK_SRC_APB5 (~RCC_RDCTRL2_LPTIM4FLTSEL) +#define I2C_LPTIM4FLTDFC_MASK (~RCC_RDCTRL2_LPTIM4FLTDFC) + +#define RCC_LPTIM5FILT_ENABLE (RCC_RDCTRL3_LPTIM5FLTEN) +#define RCC_LPTIM5_FILTCLK_SRC_MSI (RCC_RDCTRL3_LPTIM5FLTSEL) +#define RCC_LPTIM5_FILTCLK_SRC_APB5 (~RCC_RDCTRL3_LPTIM5FLTSEL) +#define I2C_LPTIM5FLTDFC_MASK (~RCC_RDCTRL3_LPTIM5FLTDFC) + +#define RCC_WWDG1RSTDLCNT_MASK (~RCC_CFG1_WWDG1RSTDLCNT) +#define RCC_WWDG2RSTDLCNT_MASK (~RCC_CFG1_WWDG2RSTDLCNT) + +#define RCC_M7TRACECLK_DIV_MASK (~RCC_CFG1_M7TRACEDIV) +#define RCC_M4TRACECLK_DIV_MASK (~RCC_CFG1_M4TRACEDIV) +#define RCC_TRACECLK_DIV1 (RCC_CFG1_M7TRACEDIV_DIV1 ) +#define RCC_TRACECLK_DIV2 (RCC_CFG1_M7TRACEDIV_DIV2 ) +#define RCC_TRACECLK_DIV4 (RCC_CFG1_M7TRACEDIV_DIV4 ) +#define RCC_TRACECLK_DIV8 (RCC_CFG1_M7TRACEDIV_DIV8 ) +#define RCC_TRACECLK_DIV16 (RCC_CFG1_M7TRACEDIV_DIV16 ) +#define RCC_TRACECLK_DIV32 (RCC_CFG1_M7TRACEDIV_DIV32 ) +#define RCC_TRACECLK_DIV64 (RCC_CFG1_M7TRACEDIV_DIV64 ) +#define RCC_TRACECLK_DIV128 (RCC_CFG1_M7TRACEDIV_DIV128) +#define RCC_TRACECLK_DIV256 (RCC_CFG1_M7TRACEDIV_DIV256) +#define RCC_TRACECLK_DIV512 (RCC_CFG1_M7TRACEDIV_DIV512) + +#define RCC_M7STCLK_DIV_MASK (~RCC_CFG3_M7STCLKDIV) +#define RCC_M4STCLK_DIV_MASK (~RCC_CFG3_M4STCLKDIV) +#define RCC_STCLK_DIV1 (RCC_CFG3_M7STCLKDIV_DIV1 ) +#define RCC_STCLK_DIV2 (RCC_CFG3_M7STCLKDIV_DIV2 ) +#define RCC_STCLK_DIV4 (RCC_CFG3_M7STCLKDIV_DIV4 ) +#define RCC_STCLK_DIV8 (RCC_CFG3_M7STCLKDIV_DIV8 ) +#define RCC_STCLK_DIV16 (RCC_CFG3_M7STCLKDIV_DIV16 ) +#define RCC_STCLK_DIV32 (RCC_CFG3_M7STCLKDIV_DIV32 ) +#define RCC_STCLK_DIV64 (RCC_CFG3_M7STCLKDIV_DIV64 ) +#define RCC_STCLK_DIV128 (RCC_CFG3_M7STCLKDIV_DIV128) +#define RCC_STCLK_DIV256 (RCC_CFG3_M7STCLKDIV_DIV256) +#define RCC_STCLK_DIV512 (RCC_CFG3_M7STCLKDIV_DIV512) + +#define RCC_DUALCORE_DBG_ENABLE (RCC_CFG5_DCDCLKEN) + +#define RCC_RTCCLK_HSIDIV_MASK (~RCC_CFG5_RTCHSIDIV) +#define RCC_RTCCLK_HSIDIV1 (RCC_CFG5_RTCHSIDIV_DIV1 ) +#define RCC_RTCCLK_HSIDIV2 (RCC_CFG5_RTCHSIDIV_DIV2 ) +#define RCC_RTCCLK_HSIDIV4 (RCC_CFG5_RTCHSIDIV_DIV4 ) +#define RCC_RTCCLK_HSIDIV8 (RCC_CFG5_RTCHSIDIV_DIV8 ) +#define RCC_RTCCLK_HSIDIV16 (RCC_CFG5_RTCHSIDIV_DIV16 ) +#define RCC_RTCCLK_HSIDIV32 (RCC_CFG5_RTCHSIDIV_DIV32 ) +#define RCC_RTCCLK_HSIDIV64 (RCC_CFG5_RTCHSIDIV_DIV64 ) +#define RCC_RTCCLK_HSIDIV128 (RCC_CFG5_RTCHSIDIV_DIV128) +#define RCC_RTCCLK_HSIDIV256 (RCC_CFG5_RTCHSIDIV_DIV256) +#define RCC_RTCCLK_HSIDIV512 (RCC_CFG5_RTCHSIDIV_DIV512) + +#define RCC_SOFTLOCK_EN_SHRPLL (RCC_PLLSFTLK_SHRPLLSFTLK) +#define RCC_SOFTLOCK_EN_PLL3 (RCC_PLLSFTLK_PLL3SFTLK ) +#define RCC_SOFTLOCK_EN_PLL2 (RCC_PLLSFTLK_PLL2SFTLK ) +#define RCC_SOFTLOCK_EN_PLL1 (RCC_PLLSFTLK_PLL1SFTLK ) + +#define RCC_SHRTIMAFE_RESET_ENABLE (RCC_PLLSFTLK_SHRTIMAFERST ) +#define RCC_SDRAM_DELAY_ENABLE (RCC_PLLSFTLK_SDRAMDLEN ) + +#define RCC_SDRAM_DELAY_MASK (~RCC_PLLSFTLK_SDRAMDLSEL ) +#define RCC_SDRAM_DELAY_0_2NS (RCC_PLLSFTLK_SDRAMDLSEL_0_2NS) +#define RCC_SDRAM_DELAY_0_4NS (RCC_PLLSFTLK_SDRAMDLSEL_0_4NS) +#define RCC_SDRAM_DELAY_0_6NS (RCC_PLLSFTLK_SDRAMDLSEL_0_6NS) +#define RCC_SDRAM_DELAY_0_8NS (RCC_PLLSFTLK_SDRAMDLSEL_0_8NS) +#define RCC_SDRAM_DELAY_1_0NS (RCC_PLLSFTLK_SDRAMDLSEL_1_0NS) +#define RCC_SDRAM_DELAY_1_2NS (RCC_PLLSFTLK_SDRAMDLSEL_1_2NS) +#define RCC_SDRAM_DELAY_1_4NS (RCC_PLLSFTLK_SDRAMDLSEL_1_4NS) +#define RCC_SDRAM_DELAY_1_6NS (RCC_PLLSFTLK_SDRAMDLSEL_1_6NS) +#define RCC_SDRAM_DELAY_1_8NS (RCC_PLLSFTLK_SDRAMDLSEL_1_8NS) +#define RCC_SDRAM_DELAY_2_0NS (RCC_PLLSFTLK_SDRAMDLSEL_2_0NS) +#define RCC_SDRAM_DELAY_2_2NS (RCC_PLLSFTLK_SDRAMDLSEL_2_2NS) +#define RCC_SDRAM_DELAY_2_4NS (RCC_PLLSFTLK_SDRAMDLSEL_2_4NS) +#define RCC_SDRAM_DELAY_2_6NS (RCC_PLLSFTLK_SDRAMDLSEL_2_6NS) +#define RCC_SDRAM_DELAY_2_8NS (RCC_PLLSFTLK_SDRAMDLSEL_2_8NS) +#define RCC_SDRAM_DELAY_3_0NS (RCC_PLLSFTLK_SDRAMDLSEL_3_0NS) +#define RCC_SDRAM_DELAY_3_2NS (RCC_PLLSFTLK_SDRAMDLSEL_3_2NS) + +void RCC_DeInit(void); +void RCC_ConfigHse(uint32_t RCC_HSE); +void RCC_EnableHsi(FunctionalState Cmd); +void RCC_EnableMsi(FunctionalState Cmd); +void RCC_ConfigLse(uint32_t RCC_LSE); +void RCC_EnableLsi(FunctionalState Cmd); +void RCC_EnableSecondaryLsi(FunctionalState Cmd); +void RCC_ConfigSysclk(uint32_t sysclk_source); +uint32_t RCC_GetSysclkSrc(void); +void RCC_ConfigHSIclkDivider(uint32_t CLK_divider); +void RCC_ConfigMSIclkDivider(uint32_t CLK_divider); +void RCC_ConfigM7Clk(uint32_t CLK_source); +void RCC_ConfigAXIClk(uint32_t CLK_source); +void RCC_ConfigPLL1CDivider(uint32_t CLK_divider); +void RCC_ConfigPLL1BDivider(uint32_t CLK_divider); +void RCC_ConfigPLL1ADivider(uint32_t CLK_divider); +void RCC_ConfigPLL2CDivider(uint32_t CLK_divider); +void RCC_ConfigPLL2BDivider(uint32_t CLK_divider); +void RCC_ConfigPLL2ADivider(uint32_t CLK_divider); +void RCC_ConfigPLL3CDivider(uint32_t CLK_divider); +void RCC_ConfigPLL3BDivider(uint32_t CLK_divider); +void RCC_ConfigPLL3ADivider(uint32_t CLK_divider); +void RCC_ConfigAXIHyperDivider(uint32_t CLK_divider); +void RCC_ConfigM7HyperDivider(uint32_t CLK_divider); +void RCC_ConfigAXIclkDivider(uint32_t CLK_divider); +void RCC_ConfigSysbusDivider(uint32_t CLK_divider); +void RCC_ConfigSysclkDivider(uint32_t CLK_divider); +void RCC_ConfigAPBclkDivider(uint32_t APB1_divider, uint32_t APB2_divider, uint32_t APB5_divider, uint32_t APB6_divider); +void RCC_EnableAHB1PeriphReset1(uint32_t AHB_periph); +void RCC_EnableAHB1PeriphReset2(uint32_t AHB_periph); +void RCC_EnableAHB1PeriphReset3(uint32_t AHB_periph); +void RCC_EnableAHB1PeriphReset4(uint32_t AHB_periph); +void RCC_EnableAPB1PeriphReset1(uint32_t APB_periph); +void RCC_EnableAPB1PeriphReset2(uint32_t APB_periph); +void RCC_EnableAPB1PeriphReset3(uint32_t APB_periph); +void RCC_EnableAPB1PeriphReset4(uint32_t APB_periph); +void RCC_EnableAPB1PeriphReset5(uint32_t APB_periph); +void RCC_EnableAHB2PeriphReset1(uint32_t AHB_periph); +void RCC_EnableAPB2PeriphReset1(uint32_t APB_periph); +void RCC_EnableAPB2PeriphReset2(uint32_t APB_periph); +void RCC_EnableAPB2PeriphReset3(uint32_t APB_periph); +void RCC_EnableAPB2PeriphReset4(uint32_t APB_periph); +void RCC_EnableAHB5PeriphReset1(uint32_t AHB_periph); +void RCC_EnableAHB5PeriphReset2(uint32_t AHB_periph); +void RCC_EnableAPB5PeriphReset1(uint32_t APB_periph); +void RCC_EnableAPB5PeriphReset2(uint32_t APB_periph); +void RCC_EnableAXIPeriphReset1(uint32_t AXI_periph); +void RCC_EnableAXIPeriphReset2(uint32_t AXI_periph); +void RCC_EnableAXIPeriphReset3(uint32_t AXI_periph); +void RCC_EnableAXIPeriphReset4(uint32_t AXI_periph); +void RCC_EnableAHB9PeriphReset1(uint32_t AHB_periph); +void RCC_EnableRDPeriphReset1(uint32_t RD_periph); +void RCC_EnableRDPeriphReset2(uint32_t RD_periph); +void RCC_EnableAHB1PeriphClk1(uint32_t AHB_periph, FunctionalState Cmd); +void RCC_EnableAHB1PeriphClk2(uint32_t AHB_periph, FunctionalState Cmd); +void RCC_EnableAHB1PeriphClk3(uint32_t AHB_periph, FunctionalState Cmd); +void RCC_EnableAHB1PeriphClk4(uint32_t AHB_periph, FunctionalState Cmd); +void RCC_EnableAPB1PeriphClk1(uint32_t APB_periph, FunctionalState Cmd); +void RCC_EnableAPB1PeriphClk2(uint32_t APB_periph, FunctionalState Cmd); +void RCC_EnableAPB1PeriphClk3(uint32_t APB_periph, FunctionalState Cmd); +void RCC_EnableAPB1PeriphClk4(uint32_t APB_periph, FunctionalState Cmd); +void RCC_EnableAPB1PeriphClk5(uint32_t APB_periph, FunctionalState Cmd); +void RCC_EnableAHB2PeriphClk1(uint32_t AHB_periph, FunctionalState Cmd); +void RCC_EnableAHB2PeriphClk2(uint32_t AHB_periph, FunctionalState Cmd); +void RCC_EnableAPB2PeriphClk1(uint32_t APB_periph, FunctionalState Cmd); +void RCC_EnableAPB2PeriphClk2(uint32_t APB_periph, FunctionalState Cmd); +void RCC_EnableAPB2PeriphClk3(uint32_t APB_periph, FunctionalState Cmd); +void RCC_EnableAPB2PeriphClk4(uint32_t APB_periph, FunctionalState Cmd); +void RCC_EnableAHB5PeriphClk1(uint32_t AHB_periph, FunctionalState Cmd); +void RCC_EnableAHB5PeriphClk2(uint32_t AHB_periph, FunctionalState Cmd); +void RCC_EnableAPB5PeriphClk1(uint32_t APB_periph, FunctionalState Cmd); +void RCC_EnableAPB5PeriphClk2(uint32_t APB_periph, FunctionalState Cmd); +void RCC_EnableAHB9PeriphClk1(uint32_t AHB_periph, FunctionalState Cmd); +void RCC_EnableRDPeriphClk1(uint32_t RD_periph, FunctionalState Cmd); +void RCC_EnableRDPeriphClk2(uint32_t RD_periph, FunctionalState Cmd); +void RCC_EnableAXIPeriphClk1(uint32_t AXI_periph, FunctionalState Cmd); +void RCC_EnableAXIPeriphClk2(uint32_t AXI_periph, FunctionalState Cmd); +void RCC_EnableAXIPeriphClk3(uint32_t AXI_periph, FunctionalState Cmd); +void RCC_EnableAXIPeriphClk4(uint32_t AXI_periph, FunctionalState Cmd); +void RCC_ConfigETH2PtpClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigETH1PtpClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigETH1GMIITXClk(uint32_t CLK_source); +void RCC_ConfigSDMMC2KerClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigSDMMC1KerClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigDSMUKerClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigDSMUKerAClk(uint32_t CLK_source, uint32_t CLK_pinsel); +void RCC_ConfigUSBRefClk(uint32_t CLK_divider); +void RCC_ConfigAdc1PllClk(uint32_t CLK_source); +void RCC_ConfigAdc1SysClk(uint32_t CLK_divider); +void RCC_ConfigAdc2PllClk(uint32_t CLK_source); +void RCC_ConfigAdc2SysClk(uint32_t CLK_divider); +void RCC_ConfigAdc3PllClk(uint32_t CLK_source); +void RCC_ConfigAdc3SysClk(uint32_t CLK_divider); +void RCC_ConfigBTIMKerClk(uint32_t CLK_divider); +void RCC_ConfigGTIMA1_3_KerClk(uint32_t CLK_divider); +void RCC_ConfigGTIMA4_7_KerClk(uint32_t CLK_divider); +void RCC_ConfigGTIMB1_3_KerClk(uint32_t CLK_divider); +void RCC_ConfigATIM1_2_KerClk(uint32_t CLK_divider); +void RCC_ConfigATIM3_4_KerClk(uint32_t CLK_divider); +void RCC_ConfigUSARTPClk(uint32_t CLK_divider); +void RCC_ConfigI2S1KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2S2KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2S1_2_KerSysDivider(uint32_t CLK_divider); +void RCC_ConfigI2S3KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2S4KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2S3_4_KerSysDivider(uint32_t CLK_divider); +void RCC_ConfigI2C1KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2C2KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2C3KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2C1_3_KerSysDivider(uint32_t CLK_divider); +void RCC_ConfigI2C4KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2C5KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2C6KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2C4_6_KerSysDivider(uint32_t CLK_divider); +void RCC_ConfigI2C7KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2C8KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2C9KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2C10KerClkSource(uint32_t CLK_source); +void RCC_ConfigI2C7_10_KerSysDivider(uint32_t CLK_divider); +void RCC_ConfigFDCAN1KerClkSource(uint32_t CLK_source); +void RCC_ConfigFDCAN2KerClkSource(uint32_t CLK_source); +void RCC_ConfigFDCAN5KerClkSource(uint32_t CLK_source); +void RCC_ConfigFDCAN6KerClkSource(uint32_t CLK_source); +void RCC_ConfigFDCAN1_2_5_6_KerSysDivider(uint32_t CLK_divider); +void RCC_ConfigFDCAN3KerClkSource(uint32_t CLK_source); +void RCC_ConfigFDCAN4KerClkSource(uint32_t CLK_source); +void RCC_ConfigFDCAN7KerClkSource(uint32_t CLK_source); +void RCC_ConfigFDCAN8KerClkSource(uint32_t CLK_source); +void RCC_ConfigFDCAN3_4_7_8_KerSysDivider(uint32_t CLK_divider); +void RCC_ConfigEXTISysDivider(uint32_t CLK_divider); +void RCC_ConfigRtcClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_EnableRtcClk(FunctionalState Cmd); +void RCC_EnableBackupReset(void); +void RCC_EnableDCMUReset(void); +void RCC_ConfigLPTIM1Clk(uint32_t CLK_source); +void RCC_EnableLPTIM1CompGate(uint32_t COMP_sel, FunctionalState Cmd); +void RCC_ConfigLPTIM2Clk(uint32_t CLK_source); +void RCC_EnableLPTIM2CompGate(uint32_t COMP_sel, FunctionalState Cmd); +void RCC_ConfigLPTIM3Clk(uint32_t CLK_source); +void RCC_EnableLPTIM3CompGate(uint32_t COMP_sel, FunctionalState Cmd); +void RCC_ConfigLPTIM4Clk(uint32_t CLK_source); +void RCC_EnableLPTIM4CompGate(uint32_t COMP_sel, FunctionalState Cmd); +void RCC_ConfigLPTIM5Clk(uint32_t CLK_source); +void RCC_EnableLPTIM5CompGate(uint32_t COMP_sel, FunctionalState Cmd); +void RCC_ConfigLPUART1ClkSource(uint32_t CLK_source); +void RCC_ConfigLPUART2ClkSource(uint32_t CLK_source); +void RCC_ConfigLPUART1_2_ClkDivider(uint32_t CLK_divider); +void RCC_ConfigCOMPLsxClk(uint32_t CLK_source); +void RCC_ConfigCOMPKerClk(uint32_t CLK_divider); +void RCC_ConfigFEMCM0Clk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigFEMCM1Clk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigDSIRefClk(uint32_t CLK_divider); +void RCC_ConfigDSIKerClk(uint32_t CLK_source); +void RCC_ConfigDSIPpitxClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigDSIUlpsClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigLCDCPixelClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigDVP1MClkSource(uint32_t CLK_source); +void RCC_ConfigDVP2MClkSource(uint32_t CLK_source); +void RCC_ConfigDVP1_2_MClkDivider(uint32_t CLK_divider); +void RCC_ConfigXSPI1SSIClk(uint32_t CLK_source); +void RCC_ConfigXSPI2SSIClk(uint32_t CLK_source); +void RCC_ConfigSDRAMMemClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigETHERCATKerClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigTRNGClk(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_EnableTRNGClk(FunctionalState Cmd); +void RCC_EnableCFG2PeriphClk1(uint32_t CFG2_periph, FunctionalState Cmd); +void RCC_EnableCFG4PeriphClk1(uint32_t CFG4_periph, FunctionalState Cmd); +void RCC_EnableCFG5PeriphClk1(uint32_t CFG5_periph, FunctionalState Cmd); +void RCC_ConfigMco1(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_ConfigMco2(uint32_t CLK_source, uint32_t CLK_divider); +void RCC_EnableFDCANStopRequest1(uint32_t FDCAN_sel, FunctionalState Cmd); +void RCC_EnableFDCANStopRequest2(uint32_t FDCAN_sel, FunctionalState Cmd); +void RCC_ConfigPeriphClk(uint32_t CLK_source); +void RCC_EnableModuleResetRequest(uint32_t Module_sel, FunctionalState Cmd); +void RCC_ConfigInt1(uint32_t Interrupt, FunctionalState Cmd); +void RCC_ConfigInt2(uint32_t Interrupt, FunctionalState Cmd); +void RCC_ConfigInt3(uint32_t Interrupt, FunctionalState Cmd); +void RCC_ClrIntPendingBit1(uint32_t interrupt_clear); +void RCC_ClrIntPendingBit2(uint32_t interrupt_clear); +void RCC_ClrIntPendingBit3(uint32_t interrupt_clear); +void RCC_ClearResetFlag(void); +void RCC_EnableCM4(uint32_t CM4_BaseAddr); +void RCC_GetClocksFreqValue(RCC_ClocksTypeDef* RCC_Clocks); +ErrorStatus RCC_WaitHseStable(void); +ErrorStatus RCC_WaitHsiStable(void); +ErrorStatus RCC_WaitMsiStable(void); +ErrorStatus RCC_WaitLseStable(void); +ErrorStatus RCC_WaitLsiStable(void); +ErrorStatus RCC_WaitSecondaryLsiStable(void); +ErrorStatus RCC_CalculatePLLParam(uint64_t fin, uint64_t fout, uint32_t* nr, uint32_t* nf, uint32_t* wb); +ErrorStatus RCC_ConfigSHRPll(uint32_t PLL_source, uint64_t fin, uint64_t fout, FunctionalState Cmd); +ErrorStatus RCC_ConfigPll1(uint32_t PLL_source, uint64_t fin, uint64_t fout, FunctionalState Cmd); +ErrorStatus RCC_ConfigPll2(uint32_t PLL_source, uint64_t fin, uint64_t fout, FunctionalState Cmd); +ErrorStatus RCC_ConfigPll3(uint32_t PLL_source, uint64_t fin, uint64_t fout, FunctionalState Cmd); +ErrorStatus RCC_ConfigSHRPll_NoCalculate(uint32_t PLL_source, uint32_t nrtmp, uint32_t nftmp, uint32_t wbtmp, FunctionalState Cmd); +ErrorStatus RCC_ConfigPll1_NoCalculate(uint32_t PLL_source, uint32_t nrtmp, uint32_t nftmp, uint32_t wbtmp, FunctionalState Cmd); +ErrorStatus RCC_ConfigPll2_NoCalculate(uint32_t PLL_source, uint32_t nrtmp, uint32_t nftmp, uint32_t wbtmp, FunctionalState Cmd); +ErrorStatus RCC_ConfigPll3_NoCalculate(uint32_t PLL_source, uint32_t nrtmp, uint32_t nftmp, uint32_t wbtmp, FunctionalState Cmd); +FlagStatus RCC_GetFDCANStopAckFlag1(uint32_t RCC_flag); +FlagStatus RCC_GetFDCANStopAckFlag2(uint32_t RCC_flag); +FlagStatus RCC_GetFlagStatus(uint8_t RCC_flag); +INTStatus RCC_GetIntStatus1(uint32_t interrupt_flag); +INTStatus RCC_GetIntStatus2(uint32_t interrupt_flag); +INTStatus RCC_GetIntStatus3(uint32_t interrupt_flag); +void RCC_SetSysClkToMode0(void); +void RCC_SetSysClkToMode1(void); +void RCC_SetSysClkToMode2(void); +void RCC_SetHsiCalibValue(uint16_t calibration_value); +void RCC_SetMsiCalibValue(uint16_t calibration_value); +void RCC_EnableHSEClockSecuritySystem(FunctionalState Cmd); +void RCC_SelectLSISourceControl(uint32_t CLK_source); +void RCC_EnableLSIClockSecuritySystem(FunctionalState Cmd); +void RCC_EnableLSIFailAcknowledge(FunctionalState Cmd); +void RCC_EnableLSECalibrationCount(FunctionalState Cmd); +void RCC_EnableLSEOffsetDetection(FunctionalState Cmd); +void RCC_SetLSEOffsetThreshold(uint8_t threshold_value); +void RCC_EnableHSECalibrationCount(FunctionalState Cmd); +void RCC_EnableHSECSSCheck(uint32_t Chk_type, FunctionalState Cmd); +void RCC_SetHSEOffsetThreshold(uint8_t threshold_value); +void RCC_SetHSEPositiveDeviationMAXThreshold(uint8_t threshold_value); +void RCC_SetHSENegativeDeviationMINThreshold(uint8_t threshold_value); +void RCC_SetLSICSSDelayValue(uint32_t delay_value); +void RCC_SetLSEReadyDelayValue(uint32_t delay_value); +void RCC_SetMSIReadyDelayValue(uint32_t delay_value); +void RCC_SetHSEReadyDelayValue(uint32_t delay_value); +void RCC_EnablePLLFailDetection(uint32_t Chk_type, FunctionalState Cmd); +void RCC_EnableLPTIM1Filter(FunctionalState Cmd); +void RCC_SelectLPTIM1FilterSource(uint32_t CLK_source); +void RCC_ConfigLPTIM1FilterWidth(uint8_t width_value); +void RCC_EnableLPTIM2Filter(FunctionalState Cmd); +void RCC_SelectLPTIM2FilterSource(uint32_t CLK_source); +void RCC_ConfigLPTIM2FilterWidth(uint8_t width_value); +void RCC_EnableLPTIM3Filter(FunctionalState Cmd); +void RCC_SelectLPTIM3FilterSource(uint32_t CLK_source); +void RCC_ConfigLPTIM3FilterWidth(uint8_t width_value); +void RCC_EnableLPTIM4Filter(FunctionalState Cmd); +void RCC_SelectLPTIM4FilterSource(uint32_t CLK_source); +void RCC_ConfigLPTIM4FilterWidth(uint8_t width_value); +void RCC_EnableLPTIM5Filter(FunctionalState Cmd); +void RCC_SelectLPTIM5FilterSource(uint32_t CLK_source); +void RCC_ConfigLPTIM5FilterWidth(uint8_t width_value); +void RCC_SetWWDG1ResetDelayValue(uint8_t delay_value); +void RCC_SetWWDG2ResetDelayValue(uint8_t delay_value); +void RCC_ConfigM7TraceClkDivider(uint32_t CLK_divider); +void RCC_ConfigM4TraceClkDivider(uint32_t CLK_divider); +void RCC_ConfigM7SystickClkDivider(uint32_t CLK_divider); +void RCC_ConfigM4SystickClkDivider(uint32_t CLK_divider); +void RCC_EnableDualCoreDebugClk(FunctionalState Cmd); +void RCC_ConfigRTCHSIClkDivider(uint32_t CLK_divider); +void RCC_EnablePLLSoftwareLock(uint32_t lock_type, FunctionalState Cmd); +void RCC_EnableSHRTIMAFEReset(FunctionalState Cmd); +void RCC_EnableSDRAMDelayChain(FunctionalState Cmd); +void RCC_ConfigSDRAMDelay(uint32_t CLK_delay); +void RCC_ConfigHSEDriveStrength(uint32_t CLK_driver); +uint8_t RCC_GetLSECalibrationCount(void); +FlagStatus RCC_GetLSECSSFlag(uint32_t RCC_flag); +uint16_t RCC_GetHSECalibrationCount(void); +FlagStatus RCC_GetHSECSSFlag(uint32_t RCC_flag); + + + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_78X_RCC_H */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_rtc.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_rtc.h new file mode 100644 index 0000000000..b392e4dc3e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_rtc.h @@ -0,0 +1,455 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_rtc.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_RTC_H__ +#define __N32H76X_78X_RTC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/** RTC Init structure definition **/ +typedef struct +{ + uint32_t RTC_HourFormat; /* Specifies the RTC Hour Format. */ + + uint32_t RTC_AsynchPrediv; /* Specifies the RTC Asynchronous Predivider value */ + + uint32_t RTC_SynchPrediv; /* Specifies the RTC Synchronous Predivider value */ +} RTC_InitType; + + +/** RTC Time structure definition **/ +typedef struct +{ + uint8_t Hours; /* Specifies the RTC Time Hour */ + + uint8_t Minutes; /* Specifies the RTC Time Minutes */ + + uint8_t Seconds; /* Specifies the RTC Time Seconds */ + + uint8_t H12; /* Specifies the RTC AM/PM Time */ +} RTC_TimeType; + +/** RTC Date structure definition **/ +typedef struct +{ + uint8_t WeekDay; /* Specifies the RTC Date WeekDay */ + + uint8_t Month; /* Specifies the RTC Date Month (in BCD format) */ + + uint8_t Date; /* Specifies the RTC Date */ + + uint8_t Year; /* Specifies the RTC Date Year */ +} RTC_DateType; + +/** RTC Alarm structure definition **/ +typedef struct +{ + RTC_TimeType AlarmTime; /* Specifies the RTC Alarm Time members. */ + + uint32_t AlarmMask; /* Specifies the RTC Alarm Masks */ + + uint32_t DateWeekMode; /* Specifies the RTC Alarm is on Date or WeekDay */ + + uint8_t DateWeekValue; /* Specifies the RTC Alarm Date/WeekDay */ +} RTC_AlarmType; + + +#define RTC_REG_BIT_MASK ((uint32_t)0x00000000) + +/** RTC_Hour_Formats **/ +#define RTC_24HOUR_FORMAT (RTC_REG_BIT_MASK) +#define RTC_12HOUR_FORMAT (RTC_CTRL_HFMT) + +/** Masks Definition **/ +#define RTC_TR_RESERVED_MASK ((uint32_t)0x007F7F7FU) +#define RTC_DATE_RESERVED_MASK ((uint32_t)0x00FFFF3FU) + +#define RTC_RSF_MASK ((uint32_t)0xFFFFFFDFU) +#define RTC_FLAGS_MASK ((uint32_t)(0x1FFFF7F)) + +/** RTC_TIMEOUT_Definitions**/ +#define INITMODE_TIMEOUT ((uint32_t)0x00020000) +#define SYNCHRO_TIMEOUT ((uint32_t)0x00080000) +#define RECALPF_TIMEOUT ((uint32_t)0x00010000) +#define SHPF_TIMEOUT ((uint32_t)0x00020000) + +/** RTC_AM_PM_Definitions **/ +#define RTC_AM_H12 ((uint8_t)0x00) +#define RTC_PM_H12 (RTC_CTRL_HFMT) + +/** Coded in BCD format **/ +#define RTC_MONTH_JANUARY ((uint8_t)0x01) +#define RTC_MONTH_FEBRURY ((uint8_t)0x02) +#define RTC_MONTH_MARCH ((uint8_t)0x03) +#define RTC_MONTH_APRIL ((uint8_t)0x04) +#define RTC_MONTH_MAY ((uint8_t)0x05) +#define RTC_MONTH_JUNE ((uint8_t)0x06) +#define RTC_MONTH_JULY ((uint8_t)0x07) +#define RTC_MONTH_AUGUST ((uint8_t)0x08) +#define RTC_MONTH_SEPTEMBER ((uint8_t)0x09) +#define RTC_MONTH_OCTOBER ((uint8_t)0x10) +#define RTC_MONTH_NOVEMBER ((uint8_t)0x11) +#define RTC_MONTH_DECEMBER ((uint8_t)0x12) + +/** RTC_WeekDay_Definitions **/ +#define RTC_WEEKDAY_MONDAY ((uint8_t)0x01) +#define RTC_WEEKDAY_TUESDAY ((uint8_t)0x02) +#define RTC_WEEKDAY_WEDNESDAY ((uint8_t)0x03) +#define RTC_WEEKDAY_THURSDAY ((uint8_t)0x04) +#define RTC_WEEKDAY_FRIDAY ((uint8_t)0x05) +#define RTC_WEEKDAY_SATURDAY ((uint8_t)0x06) +#define RTC_WEEKDAY_SUNDAY ((uint8_t)0x07) + +/** RTC_AlarmDateWeekDay_Definitions **/ +#define RTC_ALARM_SEL_WEEKDAY_DATE (RTC_REG_BIT_MASK) +#define RTC_ALARM_SEL_WEEKDAY_WEEKDAY (RTC_ALARMA_WKDSEL) + +/** RTC_AlarmMask_Definitions **/ +#define RTC_ALARMMASK_NONE (RTC_REG_BIT_MASK) +#define RTC_ALARMMASK_WEEKDAY (RTC_ALARMA_MASK4) +#define RTC_ALARMMASK_HOURS (RTC_ALARMA_MASK3) +#define RTC_ALARMMASK_MINUTES (RTC_ALARMA_MASK2) +#define RTC_ALARMMASK_SECONDS (RTC_ALARMA_MASK1) +#define RTC_ALARMMASK_ALL (RTC_ALARMA_MASK4 | RTC_ALARMA_MASK3 | RTC_ALARMA_MASK2 | RTC_ALARMA_MASK1) + +/** RTC_Alarms_Definitions **/ +#define RTC_A_ALARM (RTC_CTRL_ALAEN) +#define RTC_B_ALARM (RTC_CTRL_ALBEN) + +/** RTC_Bypass_Definitions **/ +#define RTC_BYPASS_UPDATE (RTC_CTRL_BYPS) + +/* RTC_Alarm_Sub_Seconds_Masks_Definitions */ +#define RTC_SUBS_MASK_ALL (RTC_REG_BIT_MASK) /* All Alarm SS fields are masked There is no comparison on sub seconds for Alarm */ +#define RTC_SUBS_MASK_SS14_1 (RTC_ALRMASS_MASKSSB_0) /* SS[14:1] are don't care in Alarm comparison. Only SS[0] is compared */ +#define RTC_SUBS_MASK_SS14_2 (RTC_ALRMASS_MASKSSB_1) /* SS[14:2] are don't care in Alarm comparison. Only SS[1:0] are compared */ +#define RTC_SUBS_MASK_SS14_3 (RTC_ALRMASS_MASKSSB_0 | RTC_ALRMASS_MASKSSB_1) /* SS[14:3] are don't care in Alarm comparison. Only SS[2:0] are compared */ +#define RTC_SUBS_MASK_SS14_4 (RTC_ALRMASS_MASKSSB_2) /* SS[14:4] are don't care in Alarm comparison. Only SS[3:0] are compared */ +#define RTC_SUBS_MASK_SS14_5 (RTC_ALRMASS_MASKSSB_2 | RTC_ALRMASS_MASKSSB_0) /* SS[14:5] are don't care in Alarm comparison. Only SS[4:0] are compared */ +#define RTC_SUBS_MASK_SS14_6 (RTC_ALRMASS_MASKSSB_2 | RTC_ALRMASS_MASKSSB_1) /* SS[14:6] are don't care in Alarm comparison. Only SS[5:0] are compared */ +#define RTC_SUBS_MASK_SS14_7 (RTC_ALRMASS_MASKSSB_2 | RTC_ALRMASS_MASKSSB_1 | RTC_ALRMASS_MASKSSB_0) /* SS[14:7] are don't care in Alarm comparison. Only SS[6:0] are compared */ +#define RTC_SUBS_MASK_SS14_8 (RTC_ALRMASS_MASKSSB_3) /* SS[14:8] are don't care in Alarm comparison. Only SS[7:0] are compared */ +#define RTC_SUBS_MASK_SS14_9 (RTC_ALRMASS_MASKSSB_3 | RTC_ALRMASS_MASKSSB_0) /* SS[14:9] are don't care in Alarm comparison. Only SS[8:0] are compared */ +#define RTC_SUBS_MASK_SS14_10 (RTC_ALRMASS_MASKSSB_3 | RTC_ALRMASS_MASKSSB_1) /* SS[14:10] are don't care in Alarm comparison. Only SS[9:0] are compared */ +#define RTC_SUBS_MASK_SS14_11 (RTC_ALRMASS_MASKSSB_3 | RTC_ALRMASS_MASKSSB_1 | RTC_ALRMASS_MASKSSB_0) /* SS[14:11] are don't care in Alarm comparison. Only SS[10:0] are compared */ +#define RTC_SUBS_MASK_SS14_12 (RTC_ALRMASS_MASKSSB_3 | RTC_ALRMASS_MASKSSB_2) /* SS[14:12] are don't care in Alarm comparison.Only SS[11:0] are compared */ +#define RTC_SUBS_MASK_SS14_13 (RTC_ALRMASS_MASKSSB_3 | RTC_ALRMASS_MASKSSB_2 | RTC_ALRMASS_MASKSSB_0) /* SS[14:13] are don't care in Alarm comparison. Only SS[12:0] are compared */ +#define RTC_SUBS_MASK_SS14_14 (RTC_ALRMASS_MASKSSB_3 | RTC_ALRMASS_MASKSSB_2 | RTC_ALRMASS_MASKSSB_1) /* SS[14] is don't care in Alarm comparison.Only SS[13:0] are compared */ +#define RTC_SUBS_MASK_NONE (RTC_ALRMASS_MASKSSB_3 | RTC_ALRMASS_MASKSSB_2 | RTC_ALRMASS_MASKSSB_1 | RTC_ALRMASS_MASKSSB_0) /* SS[14:0] are compared and must match to activate alarm */ + + +typedef enum +{ + RTC_WKUPCLK_RTCCLK_DIV16 = (RTC_REG_BIT_MASK), + RTC_WKUPCLK_RTCCLK_DIV8 = (RTC_CTRL_WKUPSEL_0), + RTC_WKUPCLK_RTCCLK_DIV4 = (RTC_CTRL_WKUPSEL_1), + RTC_WKUPCLK_RTCCLK_DIV2 = (RTC_CTRL_WKUPSEL_0 | RTC_CTRL_WKUPSEL_1), + RTC_WKUPCLK_CK_SPRE_16BITS = (RTC_CTRL_WKUPSEL_2), + RTC_WKUPCLK_CK_SPRE_17BITS = (RTC_CTRL_WKUPSEL_1 | RTC_CTRL_WKUPSEL_2), +}RTC_WAKE_UP_CLOCK; + + +/** RTC_Time_Stamp_Edges_definitions **/ +#define RTC_TIMESTAMP_EDGE_RISING (RTC_REG_BIT_MASK) +#define RTC_TIMESTAMP_EDGE_FALLING (RTC_CTRL_TEDGE) + +/** RTC_Reference_Detection_definitions **/ +#define RTC_REFERENCE_DETECT_DISABLE (RTC_REG_BIT_MASK) +#define RTC_REFERENCE_DETECT_ENABLE (RTC_CTRL_REFCLKEN) + +/** RTC_Output_selection_Definitions **/ +#define RTC_OUTPUT_DIS (RTC_REG_BIT_MASK) +#define RTC_OUTPUT_ALA (RTC_CTRL_OUTSEL_0) +#define RTC_OUTPUT_ALB (RTC_CTRL_OUTSEL_1) +#define RTC_OUTPUT_WKUP (RTC_CTRL_OUTSEL_0 | RTC_CTRL_OUTSEL_1) + +#define RTC_OUTPUT_TAMP (RTC_CTRL_TAMPOE) +#define RTC_OUTPUT2_EN (RTC_CTRL_OUT2EN) + +/** RTC_Output_Polarity_Definitions **/ +#define RTC_OUTPOL_HIGH (RTC_REG_BIT_MASK) +#define RTC_OUTPOL_LOW (RTC_CTRL_OPOL) + +/** RTC_Calib_Output_selection_Definitions **/ +#define RTC_CALIB_OUTPUT_256HZ (RTC_REG_BIT_MASK) +#define RTC_CALIB_OUTPUT_1HZ (RTC_CTRL_CALOSEL) + +/** if RTCCLK = 32768 Hz, Smooth calibation period is 32s, else 2exp20 RTCCLK seconds **/ +#define SMOOTH_CALIB_32SEC (RTC_REG_BIT_MASK) + +/** if RTCCLK = 32768 Hz, Smooth calibation period is 16s, else 2exp19 RTCCLK seconds **/ +#define SMOOTH_CALIB_16SEC (RTC_CALIB_CW16) + +/** if RTCCLK = 32768 Hz, Smooth calibation period is 8s, else 2exp18 RTCCLK seconds **/ +#define SMOOTH_CALIB_8SEC (RTC_CALIB_CW8) + +/** The number of RTCCLK pulses added during a X -second window = Y - CALM[8:0] with Y = 512, 256, 128 when X = 32, 16, 8 **/ +#define RTC_SMOOTH_CALIB_PLUS_PULSES_SET (RTC_CALIB_CP) + +/** The number of RTCCLK pulses subbstited during a 32-second window = CALM[8:0] **/ +#define RTC_SMOOTH_CALIB_PLUS_PULSES_RESET (RTC_REG_BIT_MASK) + +/** RTC_DayLightSaving_Definitions **/ +#define RTC_DAYLIGHT_SAVING_SUB1H (RTC_CTRL_SU1H) +#define RTC_DAYLIGHT_SAVING_ADD1H (RTC_CTRL_AD1H) + +#define RTC_STORE_OPERATION_RESET (RTC_REG_BIT_MASK) +#define RTC_STORE_OPERATION_SET (RTC_CTRL_BAKP) + +/** RTC_Output_Type_ALARM_OUT **/ +#define RTC_OUTPUT_PUSHPULL (RTC_REG_BIT_MASK) +#define RTC_OUTPUT_OPENDRAIN (RTC_OPT_TYPE) + +/** RTC_PWR_SIGNAL_TYPE **/ +#define RTC_PWR_SIGNAL_PULSE (RTC_REG_BIT_MASK) +#define RTC_PWR_SIGNAL_LEVEL (RTC_OPT_PWREST) + +/** RTC_Output_Duty_Cycle **/ +#define RTC_Output_Duty_50 (RTC_REG_BIT_MASK) +#define RTC_Output_Duty_DIV (RTC_OPT_OPDC) + +/** RTC_Add_Fraction_Of_Second_Value **/ +#define RTC_SHIFT_SUB1S_DISABLE (RTC_REG_BIT_MASK) +#define RTC_SHIFT_SUB1S_ENABLE (RTC_SCTRL_AD1S) + +/** RTC_Input_parameter_format_definitions **/ +#define RTC_FORMAT_BIN (RTC_REG_BIT_MASK) //BIN format +#define RTC_FORMAT_BCD (0x00000001) //register format + +/** RTC_Flags_Definitions **/ +#define RTC_INT_FLAG_RESERVED_MASK ((uint32_t)0x01FFFFFF) + +#define RTC_FLAG_BPRAM_ERF (RTC_INITSTS_BKSRAMREF) +#define RTC_FLAG_ITISF (RTC_INITSTS_IETSF) +#define RTC_FLAG_CALOVF (RTC_INITSTS_CAOVF) +#define RTC_FLAG_TAMP8F (RTC_INITSTS_TAM8F) +#define RTC_FLAG_TAMP7F (RTC_INITSTS_TAM7F) +#define RTC_FLAG_TAMP6F (RTC_INITSTS_TAM6F) +#define RTC_FLAG_TAMP5F (RTC_INITSTS_TAM5F) +#define RTC_FLAG_TAMP4F (RTC_INITSTS_TAM4F) +#define RTC_FLAG_RECPF (RTC_INITSTS_RECPF) +#define RTC_FLAG_TAMP3F (RTC_INITSTS_TAM3F) +#define RTC_FLAG_TAMP2F (RTC_INITSTS_TAM2F) +#define RTC_FLAG_TAMP1F (RTC_INITSTS_TAM1F) +#define RTC_FLAG_TISOVF (RTC_INITSTS_TISOVF) +#define RTC_FLAG_TISF (RTC_INITSTS_TISF) +#define RTC_FLAG_WTF (RTC_INITSTS_WTF) +#define RTC_FLAG_ALBF (RTC_INITSTS_ALBF) +#define RTC_FLAG_ALAF (RTC_INITSTS_ALAF) +#define RTC_FLAG_INITM (RTC_INITSTS_INITM) +#define RTC_FLAG_INITF (RTC_INITSTS_INITF) +#define RTC_FLAG_RSYF (RTC_INITSTS_RSYF) +#define RTC_FLAG_INITSF (RTC_INITSTS_INITSF) +#define RTC_FLAG_SHOPF (RTC_INITSTS_SHOPF) +#define RTC_FLAG_WTWF (RTC_INITSTS_WTWF) +#define RTC_FLAG_ALBWF (RTC_INITSTS_ALBWF) +#define RTC_FLAG_ALAWF (RTC_INITSTS_ALAWF) + +/** RTC_Interrupts_Definitions **/ +#define RTC_INT_CAOV (RTC_CTRL_CAOVIEN) +#define RTC_INT_TAMP8 ((uint32_t)0x02000000) +#define RTC_INT_TAMP7 ((uint32_t)0x01000000) +#define RTC_INT_TAMP6 ((uint32_t)0x00800000) +#define RTC_INT_TAMP5 ((uint32_t)0x00400000) +#define RTC_INT_TAMP4 ((uint32_t)0x00200000) +#define RTC_INT_TAMP3 ((uint32_t)0x00080000) +#define RTC_INT_TAMP2 ((uint32_t)0x00040000) +#define RTC_INT_TAMP1 ((uint32_t)0x00020000) +#define RTC_INT_TS (RTC_CTRL_TSIEN) +#define RTC_INT_WUT (RTC_CTRL_WTIEN) +#define RTC_INT_ALRB (RTC_CTRL_ALBIEN) +#define RTC_INT_ALRA (RTC_CTRL_ALAIEN) + + +/** RTC_Tamper_Trigger_Definitions **/ +#define RTC_TamperTrigger_RisingEdge (RTC_REG_BIT_MASK) +#define RTC_TamperTrigger_FallingEdge ((uint32_t)0x00000002) +#define RTC_TamperTrigger_HighLevel (RTC_REG_BIT_MASK) +#define RTC_TamperTrigger_LowLevel ((uint32_t)0x00000002) + +/** RTC_Tamper_Filter_Definitions **/ +#define RTC_TamperFilter_Disable (RTC_REG_BIT_MASK) /* Tamper filter is disabled */ +#define RTC_TamperFilter_2Sample (RTC_TMPCFG_TPFLT_0) /* Tamper is activated after 2 consecutive samples at the active level */ +#define RTC_TamperFilter_4Sample (RTC_TMPCFG_TPFLT_1) /* Tamper is activated after 4 consecutive samples at the active level */ +#define RTC_TamperFilter_8Sample (RTC_TMPCFG_TPFLT_0 | RTC_TMPCFG_TPFLT_1) /* Tamper is activated after 8 consecutive samples at the active leve */ + +/** RTC_Tamper_Sampling_Frequencies_Definitions **/ +#define RTC_TamperSamplingFreq_RTCCLK_Div32768 (RTC_REG_BIT_MASK) /* Each of the tamper inputs are sampled with a frequency = RTCCLK / 32768 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div16384 (RTC_TMPCFG_TPFREQ_0) /* Each of the tamper inputs are sampled with a frequency = RTCCLK / 16384 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div8192 (RTC_TMPCFG_TPFREQ_1) /* Each of the tamper inputs are sampled with a frequency = RTCCLK / 8192 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div4096 (RTC_TMPCFG_TPFREQ_0 | RTC_TMPCFG_TPFREQ_1) /* Each of the tamper inputs are sampled with a frequency = RTCCLK / 4096 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div2048 (RTC_TMPCFG_TPFREQ_2) /* Each of the tamper inputs are sampled with a frequency = RTCCLK / 2048 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div1024 (RTC_TMPCFG_TPFREQ_0 | RTC_TMPCFG_TPFREQ_2) /* Each of the tamper inputs are sampled with a frequency = RTCCLK / 1024 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div512 (RTC_TMPCFG_TPFREQ_1 | RTC_TMPCFG_TPFREQ_2) /* Each of the tamper inputs are sampled with a frequency = RTCCLK / 512 */ +#define RTC_TamperSamplingFreq_RTCCLK_Div256 (RTC_TMPCFG_TPFREQ_0 | RTC_TMPCFG_TPFREQ_1 | RTC_TMPCFG_TPFREQ_2) /* Each of the tamper inputs are sampled with a frequency = RTCCLK / 256 */ +#define RTC_TAMPCR_TAMPFREQ (RTC_TMPCFG_TPFREQ_0 | RTC_TMPCFG_TPFREQ_1 | RTC_TMPCFG_TPFREQ_2) /* Clear TAMPFREQ[2:0] bits in the RTC_TAMPCR register */ + +/** RTC_Tamper_Pin_Precharge_Duration_Definitions **/ +#define RTC_TamperPrechargeDuration_1RTCCLK (RTC_REG_BIT_MASK) /* Tamper pins are pre-charged before sampling during 1 RTCCLK cycle */ +#define RTC_TamperPrechargeDuration_2RTCCLK (RTC_TMPCFG_TPPRCH_0) /* Tamper pins are pre-charged before sampling during 2 RTCCLK cycles */ +#define RTC_TamperPrechargeDuration_4RTCCLK (RTC_TMPCFG_TPPRCH_1) /* Tamper pins are pre-charged before sampling during 4 RTCCLK cycles */ +#define RTC_TamperPrechargeDuration_8RTCCLK (RTC_TMPCFG_TPPRCH_0 | RTC_TMPCFG_TPPRCH_1) /* Tamper pins are pre-charged before sampling during 8 RTCCLK cycles */ + +/** @defgroup RTC_Tamper_Pins_Definitions **/ +/** @defgroup RTC Tamper Source Definitions **/ +#define RTC_TAMPER_1 (0) /* Tamper 1 */ +#define RTC_TAMPER_2 (1) /* Tamper 2 */ +#define RTC_TAMPER_3 (2) /* Tamper 3 */ +#define RTC_TAMPER_4 (3) /* Tamper 4 */ +#define RTC_TAMPER_5 (4) /* Tamper 5 */ +#define RTC_TAMPER_6 (5) /* Tamper 6 */ +#define RTC_TAMPER_7 (6) /* Tamper 7 */ +#define RTC_TAMPER_8 (7) /* Tamper 8 */ + +/** Function used to set the RTC configuration to the default reset state **/ +ErrorStatus RTC_DeInit(void); + +/** Initialization and Configuration functions **/ +ErrorStatus RTC_Init(RTC_InitType* RTC_InitStruct); +void RTC_StructInit(RTC_InitType* RTC_InitStruct); +void RTC_EnableWriteProtection(FunctionalState Cmd); +ErrorStatus RTC_EnterInitMode(void); +void RTC_ExitInitMode(void); +ErrorStatus RTC_WaitForSynchro(void); +ErrorStatus RTC_EnableRefClock(FunctionalState Cmd); +void RTC_EnableBypassShadow(FunctionalState Cmd); + +/** Time and Date configuration functions **/ +void RTC_TimeStructInit(RTC_TimeType* RTC_TimeStruct); +ErrorStatus RTC_ConfigTime(uint32_t RTC_Format, RTC_TimeType* RTC_TimeStruct); +void RTC_GetTime(uint32_t RTC_Format, RTC_TimeType* RTC_TimeStruct); +uint32_t RTC_GetSubSecond(void); +void RTC_DateStructInit(RTC_DateType* RTC_DateStruct); +ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateType* RTC_DateStruct); +void RTC_GetDate(uint32_t RTC_Format, RTC_DateType* RTC_DateStruct); + +/** RTC output configuration **/ +void RTC_EnableOutput2(FunctionalState Cmd); +void RTC_ConfigOutputType(uint32_t RTC_OutputType); +void RTC_ConfigOutputDuty(uint32_t duty_cycle); +void RTC_ConfigOutputPullUp(FunctionalState Cmd); + +void RTC_ConfigPWREvtSig(uint32_t signal_type); + +/** Alarms (Alarm A and Alarm B) configuration functions **/ +void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmType* RTC_AlarmStruct); +void RTC_AlarmStructInit(RTC_AlarmType* RTC_AlarmStruct); +void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmType* RTC_AlarmStruct); +ErrorStatus RTC_EnableAlarm(uint32_t RTC_Alarm, FunctionalState Cmd); +void RTC_ConfigAlarmSubSecond(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, uint32_t RTC_AlarmSubSecondMask); +uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm); + +/** WakeUp Timer configuration functions **/ +void RTC_ConfigWakeUpClock(uint32_t RTC_WakeUpClock); +void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter); +uint32_t RTC_GetWakeUpCounter(void); +ErrorStatus RTC_EnableWakeUp(FunctionalState Cmd); + +/** Daylight Saving configuration functions **/ +void RTC_ConfigDayLightSaving(uint32_t RTC_DayLightSaving, uint32_t RTC_StoreOperation); +uint32_t RTC_GetStoreOperation(void); + +/** Output pin Configuration function **/ +void RTC_ConfigOutput(uint32_t RTC_Output, uint32_t RTC_OutputPolarity); +void RTC_EnableTampOutput(FunctionalState Cmd); + +/** Coarse and Smooth Calibration configuration functions **/ +void RTC_EnableCalibOutput(FunctionalState Cmd); +void RTC_ConfigCalibOutput(uint32_t RTC_CalibOutput); +ErrorStatus RTC_ConfigSmoothCalib(uint32_t RTC_SmoothCalibPeriod, + uint32_t RTC_SmoothCalibPlusPulses, + uint32_t RTC_SmouthCalibMinusPulsesValue); + +/** TimeStamp configuration functions **/ +void RTC_EnableTimeStamp(uint32_t RTC_TimeStampEdge, FunctionalState Cmd); +void RTC_GetTimeStamp(uint32_t RTC_Format, RTC_TimeType* RTC_StampTimeStruct, RTC_DateType* RTC_StampDateStruct); +uint32_t RTC_GetTimeStampSubSecond(void); + +void RTC_EnableInterEventTimeStamp(FunctionalState Cmd); + +/** RTC_Shift_control_synchonisation_functions **/ +ErrorStatus RTC_ConfigSynchroShift(uint32_t RTC_ShiftAdd1S, uint32_t RTC_ShiftSubFS); + +/** Interrupts and flags management functions **/ +void RTC_ConfigInt(uint32_t RTC_INT, FunctionalState Cmd); +FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG); +void RTC_ClrFlag(uint32_t RTC_FLAG); +INTStatus RTC_GetITStatus(uint32_t RTC_INT); +void RTC_ClrIntPendingBit(uint32_t RTC_INT); + +/** Tamper configuration functions **/ +void RTC_TamperTriggerConfig(uint32_t RTC_Tamper, uint32_t RTC_TamperTrigger); +void RTC_TamperCmd(uint32_t RTC_Tamper, FunctionalState NewState); +void RTC_TamperFilterConfig(uint32_t RTC_TamperFilter); +void RTC_TamperSamplingFreqConfig(uint32_t RTC_TamperSamplingFreq); +void RTC_TamperPinsPrechargeDuration(uint32_t RTC_TamperPrechargeDuration); +void RTC_TimeStampOnTamperDetectionCmd(FunctionalState NewState); +void RTC_TamperPullUpCmd(FunctionalState NewState); +void RTC_TamperMskCmd(uint32_t TAMPxMSK, FunctionalState NewState); +void RTC_TamperIECmd(uint32_t TAMPxIE, FunctionalState NewState); +void RTC_EnableTampErase(uint32_t RTC_Tamper_Erase, FunctionalState NewState); + +void RTC_BKUPRgWrite(uint8_t register_num, uint32_t Data); +uint32_t RTC_BKUPRgRead(uint8_t register_num); + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_78X_RTC_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_sdmmc.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_sdmmc.h new file mode 100644 index 0000000000..7a86e20325 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_sdmmc.h @@ -0,0 +1,851 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_sdmmc.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_SDMMC_H__ +#define __N32H76X_78X_SDMMC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + + +/** Function declaration **/ + +/** SDMMC Init Structure Definition **/ +typedef struct +{ + uint32_t MaxBlockLen; /* Maximum Block Length supported by the Core/Device */ + uint32_t SDBaseCLKFreq; /* xin_clk, Base Clock Frequency for SD Clock */ + uint32_t TimeOutUnit; /* the unit of base clock frequency used to detect Data Timeout Error */ + uint32_t TuningCNT; /* the number of delay taps that are supported for tuning the rxclk_in */ + uint32_t WKUPSignalMode; /* Wakeup Signal Generation Mode */ + uint32_t SPIBlockMode; /* SPI Block Mode */ + uint32_t SPIMode; /* SPI Mode Support */ + uint32_t DDR50; /* DDR50 Support */ + uint32_t SDR104; /* SDR104 Support */ + uint32_t SDR50; /* SDR50 Support */ + uint32_t SlotType; /* Slot Type */ + uint32_t AsyncInt; /* Asynchronous Interrupt Support */ + uint32_t Suspend_Resume; /* Suspend/Resume Support */ + uint32_t SDMA; /* SDMA Support */ + uint32_t HS; /* High Speed Support */ + uint32_t ADMA2; /* ADMA2 Support */ + uint32_t Embedded_8bit; /* 8-bit Support for Embedded Device */ + uint32_t UseTuningSDR50; /* Use Tuning for SDR50 */ + uint32_t DSSDCLKFreq; /* SDCLK Frequency Select Value for Default Speed */ + uint32_t INITSDCLKFreq; /* SDCLK Frequency Select Value for Initialization */ + uint32_t SDR12SDCLKFreq; /* SDCLK Frequency Select Value for SDR12 */ + uint32_t HSSDCLKFreq; /* SDCLK Frequency Select Value for High Speed */ + uint32_t SDR50SDCLKFreq; /* SDCLK Frequency Select Value for SDR50 */ + uint32_t SDR25SDCLKFreq; /* SDCLK Frequency Select Value for SDR25 */ + uint32_t SDR104SDCLKFreq; /* SDCLK Frequency Select Value for SDR104 */ + uint32_t DDR50SDCLKFreq; /* SDCLK Frequency Select Value for DDR50 */ +} SDMMC_WrapperType; + +/** SDHSOT capability Structure Definition **/ +typedef struct +{ + uint32_t MaxBlockLen; /* Maximum Block Length supported by the Core/Device */ + uint32_t SDBaseCLKFreq; /* xin_clk, Base Clock Frequency for SD Clock */ + uint32_t TimeOutUnit; /* the unit of base clock frequency used to detect Data Timeout Error */ + uint32_t SPIBlockMode; /* SPI Block Mode */ + uint32_t SPIMode; /* SPI Mode Support */ + uint32_t DDR50; /* DDR50 Support */ + uint32_t SDR104; /* SDR104 Support */ + uint32_t SDR50; /* SDR50 Support */ + uint32_t SlotType; /* Slot Type */ + uint32_t AsyncInt; /* Asynchronous Interrupt Support */ + uint32_t Suspend_Resume; /* Suspend/Resume Support */ + uint32_t SDMA; /* SDMA Support */ + uint32_t HS; /* High Speed Support */ + uint32_t ADMA2; /* ADMA2 Support */ + uint32_t Embedded_8bit; /* 8-bit Support for Embedded Device */ + uint32_t UseTuningSDR50; /* Use Tuning for SDR50 */ +} SDHOST_capability; + +/** SDHSOT preset value Structure Definition **/ +typedef struct +{ + uint32_t DSSDCLKFreq; /* SDCLK Frequency Select Value for Default Speed */ + uint32_t INITSDCLKFreq; /* SDCLK Frequency Select Value for Initialization */ + uint32_t SDR12SDCLKFreq; /* SDCLK Frequency Select Value for SDR12 */ + uint32_t HSSDCLKFreq; /* SDCLK Frequency Select Value for High Speed */ + uint32_t SDR50SDCLKFreq; /* SDCLK Frequency Select Value for SDR50 */ + uint32_t SDR25SDCLKFreq; /* SDCLK Frequency Select Value for SDR25 */ + uint32_t SDR104SDCLKFreq; /* SDCLK Frequency Select Value for SDR104 */ + uint32_t DDR50SDCLKFreq; /* SDCLK Frequency Select Value for DDR50 */ +} SDHOST_presetvalue; + + +/** SDMMC Status **/ +typedef enum +{ + SDMMC_BusyTransferring = 1, /* Transfer is on-going. */ + SDMMC_PrepareAdmaDescriptorFailed, /* Set DMA descriptor failed. */ + SDMMC_SendCommandFailed, /* Send command failed. */ + SDMMC_TransferDataFailed, /* Transfer data failed. */ + SDMMC_DMADataAddrNotAlign, /* Data address not aligned. */ + SDMMC_ReTuningRequest, /* Re-tuning request. */ + SDMMC_TuningError, /* Tuning error. */ + SDMMC_NotSupport, /* Not support. */ + SDMMC_TransferDataComplete, /* Transfer data complete. */ + SDMMC_SendCommandSuccess, /* Transfer command complete. */ + SDMMC_TransferDMAComplete, /* Transfer DMA complete. */ + SDMMC_SUCCESS, /* The code execution flow is normal. */ + SDMMC_ERROR, /* Code execution flow exception. */ + SDMMC_OutOfRange /* Out of range access. */ +} SDMMC_STS; + +/* SDMMC transfer flags */ +typedef enum +{ + SDMMC_CommandOnly = 1U, /* transfer command only */ + SDMMC_CommandAndTxData = 2U, /* transfer command and transmit data */ + SDMMC_CommandAndRxData = 4U, /* transfer command and receive data */ + SDMMC_DataWithAutoCmd12 = 8U, /* transfer data with auto cmd12 enabled */ + SDMMC_DataWithAutoCmd23 = 16U, /* transfer data with auto cmd23 enabled */ + SDMMC_BootData = 32U, /* transfer boot data */ + SDMMC_BootDataContinuous = 64U, /* transfer boot data continuous */ +} SDMMC_TRANSFlAG; + +/* Data transfer direction. */ +typedef enum +{ + SDMMC_TransferDirSend = 0U, /* transfer direction send. */ + SDMMC_TransferDirReceive = SDHOST_TMODE_DATDIR, /* transfer direction receive. */ +} SDMMC_TRANSDIR; + + +/* The command type */ +typedef enum +{ + CARD_CommandTypeNormal = 0U, /* Normal command */ + CARD_CommandTypeSuspend = 1U, /* Suspend command */ + CARD_CommandTypeResume = 2U, /* Resume command */ + CARD_CommandTypeAbort = 3U, /* Abort command */ + CARD_CommandTypeEmpty = 4U, /* Empty command */ +} SDMMC_CardCMDType; + +/* The command response type. + * Defines the command response type from card to host controller. + */ +typedef enum +{ + CARD_ResponseTypeNone = 0U, /* Response type: none */ + CARD_ResponseTypeR1 = 1U, /* Response type: R1 */ + CARD_ResponseTypeR1b = 2U, /* Response type: R1b */ + CARD_ResponseTypeR2 = 3U, /* Response type: R2 */ + CARD_ResponseTypeR3 = 4U, /* Response type: R3 */ + CARD_ResponseTypeR4 = 5U, /* Response type: R4 */ + CARD_ResponseTypeR5 = 6U, /* Response type: R5 */ + CARD_ResponseTypeR5b = 7U, /* Response type: R5b */ + CARD_ResponseTypeR6 = 8U, /* Response type: R6 */ + CARD_ResponseTypeR7 = 9U, /* Response type: R7 */ +} SDMMC_CardRspType; + + +/* Since every write operation to the TMODE register triggers the issuance of a CMD, + this struct is used to store some of the status bits of the TMODE register, + which are then written to the TMODE register collectively when issuing a CMD. */ +typedef struct +{ + uint32_t DMAE; /* DMA Enable. */ + uint32_t BCNTE; /* Block Count Enable. */ + uint32_t ACMDE; /* Auto CMD Enable. */ + uint32_t DATDIR; /* Data Transfer Direction Select. */ + uint32_t BLKSEL; /* Multi / Single Block Select. */ +} SDHOST_TMODE_struct; + +/* Card command descriptor. Defines card command-related attribute. */ +typedef struct +{ + uint32_t index; /* Command index. */ + uint32_t argument; /* Command argument. */ + SDMMC_CardCMDType type; /* Command type. */ + SDMMC_CardRspType responseType; /* Command response type. */ + uint32_t response[4U]; /* Response for this command. */ + uint32_t responseErrorFlags; /* Response error flag, which need to check the command reponse. */ + uint32_t flags; /* Cmd flags. */ +} SDMMC_CMD; + +/* Card data descriptor. + * + * Defines a structure to contain data-related attribute. The 'enableIgnoreError' is used when upper card + * driver wants to ignore the error event to read/write all the data and not to stop read/write immediately when an + * error event happens. For example, bus testing procedure for MMC card. + */ +typedef struct +{ + uint32_t AutoCommand12_23; /* Enable auto CMD12/CMD23. */ + FunctionalState enableIgnoreError; /* Enable to ignore error event to read/write all the data. */ + uint8_t dataType; /* this is used to distinguish the normal/tuning/boot data. */ + uint32_t blockSize; /* Block size. */ + uint32_t blockCount; /* Block count. */ + uint32_t *rxData; /* Buffer to save data read. */ + const uint32_t *txData; /* Data buffer to write. */ +} SDMMC_DATA; + +/* Transfer state. */ +typedef struct +{ + SDMMC_DATA data; /* Data to transfer. */ + SDMMC_CMD command; /* Command to send. */ +} SDMMC_Transfer; + +/* Data structure to configure the MMC boot feature. */ +typedef struct +{ + uint32_t ackTimeoutCount; /* Timeout value for the boot ACK. */ + uint32_t bootMode; /* Boot mode selection. */ + uint32_t blockCount; /* Block count */ + uint32_t blockSize; /* Block size. */ + uint32_t BootAck; /* Enable or disable boot ACK. */ +} SDHOST_boot_config; + +/* DMA mode */ +typedef enum +{ + DmaModeSimple = 0UL, /* SDMA is selected. */ + DmaModeAdma2 = SDHOST_CTRL1_DMASEL_1, /* ADMA2 is selected. */ +} SDHOST_DMAMODE; + +/* ADMA configuration. */ +typedef struct +{ + SDHOST_DMAMODE dmaMode; /* DMA mode. */ + uint32_t *admaTable; /* ADMA table address, can't be null if transfer way is ADMA2. */ + uint32_t admaTableWords; /* ADMA table length united as words, can't be 0 if transfer way is ADMA2. */ +} SDHOST_ADMAconfig; + + +/* Defines the ADMA2 descriptor structure. */ +typedef struct +{ + uint32_t attribute; /* The control and status field. */ + const uint32_t *address; /* The address field. */ +} SDHOST_ADMA2_descriptor; + +/* SDHOST Present status flag. */ +enum +{ + SDHOST_CommandInhibitFlag = SDHOST_PRESTS_CMDINHC, /* Command inhibit. */ + SDHOST_DataInhibitFlag = SDHOST_PRESTS_CMDINHD, /* Data inhibit. */ + SDHOST_DataLineActiveFlag = SDHOST_PRESTS_DLACT, /* Data line active. */ + SDHOST_ReTuningRequestFlag = SDHOST_PRESTS_RETUNREQ, /* Re-tuning request flag */ + SDHOST_WriteTransferActiveFlag = SDHOST_PRESTS_WTRANACT, /* Write transfer active. */ + SDHOST_ReadTransferActiveFlag = SDHOST_PRESTS_RTRANACT, /* Read transfer active. */ + SDHOST_BufferWriteEnableFlag = SDHOST_PRESTS_BUFW, /* Buffer write enable. */ + SDHOST_BufferReadEnableFlag = SDHOST_PRESTS_BUFR, /* Buffer read enable. */ + SDHOST_CardInsertedFlag = SDHOST_PRESTS_CINS, /* Card inserted. */ + SDHOST_CardStateStableFlag = SDHOST_PRESTS_CSTSL, /* Card State Stable. */ + SDHOST_CardDetectPinFlag = SDHOST_PRESTS_SDCDL, /* Card Detect Pin Level. */ + SDHOST_CardWPSwitchPinFlag = SDHOST_PRESTS_SDCDL, /* Write Protect Switch Pin Level. */ + + SDHOST_CommandLineLevelFlag = SDHOST_PRESTS_CMDL, /* Command line signal level. */ + SDHOST_Data0LineLevelFlag = SDHOST_PRESTS_DATLL_0, /* Data0 line signal level. */ + SDHOST_Data1LineLevelFlag = SDHOST_PRESTS_DATLL_1, /* Data1 line signal level. */ + SDHOST_Data2LineLevelFlag = SDHOST_PRESTS_DATLL_2, /* Data2 line signal level. */ + SDHOST_Data3LineLevelFlag = SDHOST_PRESTS_DATLL_3, /* Data3 line signal level. */ + SDHOST_Data4LineLevelFlag = SDHOST_PRESTS_DATLH_0, /* Data4 line signal level. */ + SDHOST_Data5LineLevelFlag = SDHOST_PRESTS_DATLH_1, /* Data5 line signal level. */ + SDHOST_Data6LineLevelFlag = SDHOST_PRESTS_DATLH_2, /* Data6 line signal level. */ + SDHOST_Data7LineLevelFlag = SDHOST_PRESTS_DATLH_3, /* Data7 line signal level. */ +}; + + +/* SDHOST interrupt status flag */ +enum +{ + SDHOST_CommandCompleteFlag = SDHOST_INTSTS_CMDC, /* Command complete. */ + SDHOST_DataCompleteFlag = SDHOST_INTSTS_TC, /* Data complete. */ + SDHOST_BlockGapEventFlag = SDHOST_INTSTS_BLKGAPE, /* Block gap event. */ + SDHOST_DmaCompleteFlag = SDHOST_INTSTS_DMAINT, /* DMA interrupt. */ + SDHOST_BufferWriteReadyFlag = SDHOST_INTSTS_BUFWRDY, /* Buffer write ready. */ + SDHOST_BufferReadReadyFlag = SDHOST_INTSTS_BUFRRDY, /* Buffer read ready. */ + SDHOST_CardInsertionFlag = SDHOST_INTSTS_CINS, /* Card inserted. */ + SDHOST_CardRemovalFlag = SDHOST_INTSTS_CRMV, /* Card removed. */ + SDHOST_CardInterruptFlag = SDHOST_INTSTS_CINT, /* Card interrupt. */ + SDHOST_ReTuningEventFlag = SDHOST_INTSTS_RETUNE, /* Re-Tuning event */ + SDHOST_BootACKRcvFlag = SDHOST_INTSTS_BOOTACKR, /* BOOT ACK receive */ + SDHOST_BootTerminateFlag = SDHOST_INTSTS_BOOTTER, /* Boot terminate */ + SDHOST_AllErrorFlag = SDHOST_INTSTS_ALLERR, /* Sum of all error flags below */ + SDHOST_CommandTimeoutFlag = SDHOST_INTSTS_CTERR, /* Command timeout error. */ + SDHOST_CommandCrcErrorFlag = SDHOST_INTSTS_CCRCERR, /* Command CRC error. */ + SDHOST_CommandEndBitErrorFlag = SDHOST_INTSTS_CENDBERR, /* Command end bit error. */ + SDHOST_CommandIndexErrorFlag = SDHOST_INTSTS_CINXERR, /* Command index error. */ + SDHOST_DataTimeoutFlag = SDHOST_INTSTS_DTERR, /* Data timeout error. */ + SDHOST_DataCrcErrorFlag = SDHOST_INTSTS_DCRCERR, /* Data CRC error. */ + SDHOST_DataEndBitErrorFlag = SDHOST_INTSTS_DENDERR, /* Data end bit error. */ + SDHOST_AutoCommand12ErrorFlag = SDHOST_INTSTS_ACMDERR, /* Auto CMD12 error. */ + SDHOST_DmaErrorFlag = SDHOST_INTSTS_ADMAERR, /* ADMA error. */ + SDHOST_TargetResErrorFlag = SDHOST_INTSTS_TRGRERR, /* Target Response error. */ + + SDHOST_CommandErrorFlag = (SDHOST_CommandTimeoutFlag | SDHOST_CommandCrcErrorFlag | SDHOST_CommandEndBitErrorFlag | + SDHOST_CommandIndexErrorFlag), /* Command error */ + SDHOST_DataErrorFlag = (SDHOST_DataTimeoutFlag | SDHOST_DataCrcErrorFlag | SDHOST_DataEndBitErrorFlag | + SDHOST_AutoCommand12ErrorFlag), /* Data error */ + SDHOST_ErrorFlag = (SDHOST_CommandErrorFlag | SDHOST_DataErrorFlag | SDHOST_DmaErrorFlag | + SDHOST_TargetResErrorFlag), /* All other error */ + + SDHOST_DataFlag = (SDHOST_DataCompleteFlag | SDHOST_BufferWriteReadyFlag | SDHOST_BufferReadReadyFlag | + SDHOST_DataErrorFlag), /* Data interrupts */ + + SDHOST_DataDMAFlag = (SDHOST_DataCompleteFlag | SDHOST_DataErrorFlag | SDHOST_DmaErrorFlag), /* Data interrupts */ + + SDHOST_CommandFlag = (SDHOST_CommandErrorFlag | SDHOST_CommandCompleteFlag), /* Command interrupts */ + SDHOST_CardDetectFlag = (SDHOST_CardInsertionFlag | SDHOST_CardRemovalFlag), /* Card detection interrupts */ + SDHOST_AllInterruptFlags = + (SDHOST_BlockGapEventFlag | SDHOST_CardInterruptFlag | SDHOST_CommandFlag | SDHOST_DataFlag | SDHOST_ErrorFlag | + SDHOST_ReTuningEventFlag | SDHOST_DmaCompleteFlag | SDHOST_BootTerminateFlag | SDHOST_BootACKRcvFlag | SDHOST_CardDetectFlag), /* All flags mask */ +}; + +/* Auto CMD12 error status flag. */ +enum +{ + SDHOST_AutoCommand12NotExecutedFlag = SDHOST_CTRLSTS_ACMD12NE, /* Not executed error. */ + SDHOST_AutoCommand12TimeoutFlag = SDHOST_CTRLSTS_ACMDTE, /* Timeout error. */ + SDHOST_AutoCommand12EndBitErrorFlag = SDHOST_CTRLSTS_ACMDEBE, /* End bit error. */ + SDHOST_AutoCommand12CrcErrorFlag = SDHOST_CTRLSTS_ACMDCRCE, /* CRC error. */ + SDHOST_AutoCommand12IndexErrorFlag = SDHOST_CTRLSTS_ACMDINXE, /* Index error. */ + SDHOST_AutoCommand12NotIssuedFlag = SDHOST_CTRLSTS_ACMD12E, /* Not issued error. */ +}; + +/* ADMA error status flag. */ +enum +{ + SDHOST_AdmaLenghMismatchFlag = SDHOST_ADMAESTS_ADMALME, /* ADMA Length Mismatch Error. */ +}; + + +/* AutoCommand12_23 type. */ +enum +{ + NoAutoCommand = 0U, /* No Auto command. */ + AutoCommand23 = 1U, /* AutoCommand23 enable. */ + AutoCommand12 = 2U, /* AutoCommand12 enable. */ +}; + +/* Tansfer data type definition. */ +enum +{ + SDHOST_TransferDataNormal = 0U, /* Transfer normal read/write data. */ + SDHOST_TransferDataTuning = 1U, /* Transfer tuning data. */ + SDHOST_TransferDataBoot = 2U, /* Transfer boot data. */ + SDHOST_TransferDataBootcontinous = 3U, /* Transfer boot data continuously. */ +}; + +/** SDMMC timeout constant define **/ +#define SDMMC_TIMEOUT_VALUE (600000U) /*10ms*/ + +/* Software Reset for DAT/CMD/ALL Line */ +#define SDHOST_SOFTWARE_DATALINE (SDHOST_CTRL2_SWRSTDL) /* Software Reset for DAT Line */ +#define SDHOST_SOFTWARE_CMDLINE (SDHOST_CTRL2_SWRSTCL) /* Software Reset for CMD Line */ +#define SDHOST_SOFTWARE_ALLLINE (SDHOST_CTRL2_SWRSTALL) /* Software Reset for ALL Line */ + +/* Maximum Block Length supported by the Core/Device */ +#define SDMMC_MAXBLOCKLEN_512B ((uint32_t)0x00000000U) /* 512 Bytes */ +#define SDMMC_MAXBLOCKLEN_1024B (SDMMC_CFG1_MBL_0) /* 1024 Bytes */ +#define SDMMC_MAXBLOCKLEN_2048B (SDMMC_CFG1_MBL_1) /* 2048 Bytes */ + +/* the unit of base clock frequency used to detect Data Timeout Error */ +#define SDMMC_TIMEOUTCLKUNIT_KHZ ((uint32_t)0x00000000U) /* KHz */ +#define SDMMC_TIMEOUTCLKUNIT_MHZ (SDMMC_CFG1_TCLKU) /* MHz */ + +/* Wakeup Signal Generation Mode */ +#define SDMMC_SYNCWKUP ((uint32_t)0x00000000U) /* wakeup event are syncrhonized with controller clock (xin_clk). */ +#define SDMMC_ASYNCWKUP (SDMMC_CFG1_WSGM) /* wakeup event are async with xin_clk */ + +/* SPI Block Mode */ +#define SDMMC_TIMEOUTCLKUNIT_KHZ ((uint32_t)0x00000000U) /* KHz */ +#define SDMMC_TIMEOUTCLKUNIT_MHZ (SDMMC_CFG1_TCLKU) /* MHz */ + +/* SPI Block Mode Support */ +#define SDMMC_SPIBLOCKMODESUPPORT (SDMMC_CFG2_SPIBMOD) /* SPI Block Mode support */ +#define SDMMC_SPIBLOCKMODEUNSUPPORT ((uint32_t)0x00000000U) /* SPI Block Mode not support */ + +/* SPI Mode Support */ +#define SDMMC_SPIMODESUPPORT (SDMMC_CFG2_SPIMOD) /* SPI Mode support */ +#define SDMMC_SPIMODEUNSUPPORT ((uint32_t)0x00000000U) /* SPI Mode not support */ + +/* DDR50 Mode Support */ +#define SDMMC_DDR50SUPPORT (SDMMC_CFG2_DDR50) /* DDR50 support */ +#define SDMMC_DDR50UNSUPPORT ((uint32_t)0x00000000U) /* DDR50 not support */ + +/* SDR104 Mode Support */ +#define SDMMC_SDR104SUPPORT (SDMMC_CFG2_SDR104) /* SDR104 support */ +#define SDMMC_SDR104UNSUPPORT ((uint32_t)0x00000000U) /* SDR104 not support */ + +/* SDR50 Mode Support */ +#define SDMMC_SDR50SUPPORT (SDMMC_CFG2_SDR50) /* SDR50 support */ +#define SDMMC_SDR50UNSUPPORT ((uint32_t)0x00000000U) /* SDR50 not support */ + +/* Slot Type */ +#define SDMMC_SDTYPE ((uint32_t)0x00000000U) /* SD/SDIO Device */ +#define SDMMC_EMMCTYPE (SDMMC_CFG2_STYP_0) /* emmc Device */ + +/* Asynchronous Interrupt Support */ +#define SDMMC_ASYNCINTSUPPORT (SDMMC_CFG2_ASYNCINT) /* Asynchronous Interrupt Support */ +#define SDMMC_ASYNCINTUNSUPPORT ((uint32_t)0x00000000U) /* Asynchronous Interrupt not Support */ + +/* Suspend/Resume Support */ +#define SDMMC_SUSRESSUPPORT (SDMMC_CFG2_SRS) /* Suspend/Resume Support */ +#define SDMMC_SUSRESUNSUPPORT ((uint32_t)0x00000000U) /* Suspend/Resume not Support */ + +/* SDMA Support */ +#define SDMMC_SDMASUPPORT (SDMMC_CFG2_SDMA) /* SDMA Support */ +#define SDMMC_SDMAUNSUPPORT ((uint32_t)0x00000000U) /* SDMA not Support */ + +/* High Speed Support */ +#define SDMMC_HSSUPPORT (SDMMC_CFG2_HS) /* High Speed Support */ +#define SDMMC_HSUNSUPPORT ((uint32_t)0x00000000U) /* High Speed not Support */ + +/* ADMA2 Support */ +#define SDMMC_ADMA2SUPPORT (SDMMC_CFG2_ADMA2) /* ADMA2 Support */ +#define SDMMC_ADMA2UNSUPPORT ((uint32_t)0x00000000U) /* ADMA2 not Support */ + +/* 8-bit Support for Embedded Device */ +#define SDMMC_EMBEDDEDSUPPORT (SDMMC_CFG2_EMBUS) /* 8-bit Support for Embedded Device */ +#define SDMMC_EMBEDDEDUNSUPPORT ((uint32_t)0x00000000U) /* 8-bit not Support for Embedded Device */ + +/* Use Tuning for SDR50 */ +#define SDMMC_SDR50TUNING (SDMMC_CFG3_UTFSDR50) /* Use Tuning for SDR50 */ +#define SDMMC_SDR50UNTUNING ((uint32_t)0x00000000U) /* Not use Tuning for SDR50 */ + +/* Manual tuning sdclk output */ +#define SDMMC_MANUALTUNOUT_EN (SDMMC_DLYCTRL_OTDE) /* Output tap Delay Enable */ +#define SDMMC_MANUALTUNOUT_DELAYMASK (SDMMC_DLYCTRL_OTDS) /* Output Tap Delay Select */ + +/* Manual tuning rclk input */ +#define SDMMC_MANUALTUNGATE_EN (SDMMC_DLYCTRL_ITCW) /* Input Tap Change Window */ +#define SDMMC_MANUALTUNIN_EN (SDMMC_DLYCTRL_ITDE) /* Input tap Delay Enable */ +#define SDMMC_MANUALTUNIN_DELAYMASK (SDMMC_DLYCTRL_ITDS) /* Input Tap Delay Select */ + +/* Sampling Clock Select */ +#define SDHOST_SAMPCLKSEL (SDHOST_CTRLSTS_SCS) /* Sampling Clock Select */ +#define SDHOST_AUTOTUNE (SDHOST_CTRLSTS_ETUN) /* Execute Tuning */ + + +/** SDMMC CFG1 register bit offset define **/ +#define SDMMC_CFG1_BCLKF_OFFSET (REG_BIT14_OFFSET ) /* Base Clock Frequency for SD Clock */ +#define SDMMC_CFG1_TCNT_OFFSET (REG_BIT1_OFFSET ) /* Tuning Count */ + +/** SDMMC PVxCTRL register bit offset define **/ +#define SDMMC_PV0CTRL_CLKFS_OFFSET (REG_BIT13_OFFSET ) /* SDCLK Frequency Select Value */ + +/********** SDHOST register ***********/ +/* Maximum block count can be set one time */ +#define SDHOST_MAX_BLOCK_COUNT (SDHOST_BLKCFG_CNT >> REG_BIT16_OFFSET) +#define SDHOST_BLOCK_COUNT_OFFSET (REG_BIT16_OFFSET ) + +/* SDHOST TMODE register */ +#define SDHOST_TMODE_DMADISABLE ((uint32_t)0x00000000U ) /* DMA Disable */ +#define SDHOST_TMODE_DMAENABLE (SDHOST_TMODE_DMAE ) /* DMA Enable */ + +#define SDHOST_TMODE_BLOCKCNTDISABLE ((uint32_t)0x00000000U ) /* DMA Disable */ +#define SDHOST_TMODE_BLOCKCNTENABLE (SDHOST_TMODE_BLOCKCNTE ) /* DMA Enable */ + +#define SDHOST_TMODE_NOACMDEN ((uint32_t)0x00000000U) /* No Auto CMD enable */ +#define SDHOST_TMODE_AC12EN (SDHOST_TMODE_AUTOCMDE_0) /* Auto CMD12 enable */ +#define SDHOST_TMODE_AC23EN (SDHOST_TMODE_AUTOCMDE_1) /* Auto CMD23 enable */ + +#define SDHOST_TMODE_DATDIR_WRITE ((uint32_t)0x00000000U ) /* Data Transfer Direction Select write */ +#define SDHOST_TMODE_DATDIR_READ (SDHOST_TMODE_DATDIR ) /* Data Transfer Direction Select read */ + +#define SDHOST_TMODE_SINGLEBLK ((uint32_t)0x00000000 ) /* Single Block Select */ +#define SDHOST_TMODE_MULTIBLK (SDHOST_TMODE_BLKSEL ) /* Multi Block Select */ + + +/* Transfer flag mask. */ +enum +{ + SDHOST_EnableDmaFlag = SDHOST_TMODE_DMAE, /* Enable DMA. */ + + SDHOST_CommandTypeSuspendFlag = SDHOST_TMODE_TYPE_0, /* Suspend command. */ + SDHOST_CommandTypeResumeFlag = SDHOST_TMODE_TYPE_1, /* Resume command. */ + SDHOST_CommandTypeAbortFlag = SDHOST_TMODE_TYPE, /* Abort command. */ + + SDHOST_EnableBlockCountFlag = SDHOST_TMODE_BLOCKCNTE, /* Enable block count. */ + SDHOST_EnableAutoCommand12Flag = SDHOST_TMODE_AUTOCMDE_0, /* Enable auto CMD12. */ + SDHOST_DataReadFlag = SDHOST_TMODE_DATDIR, /* Enable data read. */ + SDHOST_MultipleBlockFlag = SDHOST_TMODE_BLKSEL, /* Multiple block data read/write. */ + SDHOST_EnableAutoCommand23Flag = SDHOST_TMODE_AUTOCMDE_1, /* Enable auto CMD23. */ + + SDHOST_ResponseLength136Flag = SDHOST_TMODE_RTYPESEL_0, /* 136-bit response length. */ + SDHOST_ResponseLength48Flag = SDHOST_TMODE_RTYPESEL_1, /* 48-bit response length. */ + SDHOST_ResponseLength48BusyFlag = SDHOST_TMODE_RTYPESEL, /* 48-bit response length with busy status. */ + + SDHOST_EnableCrcCheckFlag = SDHOST_TMODE_CRCCK, /* Enable CRC check. */ + SDHOST_EnableIndexCheckFlag = SDHOST_TMODE_INDEXCK, /* Enable index check. */ + SDHOST_DataPresentFlag = SDHOST_TMODE_DPRESEL, /* Data present flag. */ +}; + +#define SDHOST_CMD_INDEX_OFFSET (REG_BIT24_OFFSET ) /* CMD index */ + +#define SDHOST_BOOTDUMMY ((uint32_t)0x5555AAAAU) /* dummy data */ + +/* SDHOST capability register */ +#define SDHOST_CAP0_SLOTTYPE_MASK (SDHOST_CAP0STS_STYP ) /* Slot Type */ +#define SDHOST_CAP0_SLOTTYPE_OFFSET (REG_BIT30_OFFSET ) /* Slot Type */ + +#define SDHOST_CAP0_ASYNCINT_MASK (SDHOST_CAP0STS_ASYNCINT ) /* Asynchronous Interrupt Support */ +#define SDHOST_CAP0_ASYNCINT_OFFSET (REG_BIT29_OFFSET ) /* Asynchronous Interrupt Support */ + +#define SDHOST_CAP0_VS33_MASK (SDHOST_CAP0STS_VS33 ) /* Voltage Support 3.3V */ +#define SDHOST_CAP0_VS33_OFFSET (REG_BIT24_OFFSET ) /* Voltage Support 3.3V */ + +#define SDHOST_CAP0_SRS_MASK (SDHOST_CAP0STS_SRS ) /* Suspend / Resume Support */ +#define SDHOST_CAP0_SRS_OFFSET (REG_BIT23_OFFSET ) /* Suspend / Resume Support */ + +#define SDHOST_CAP0_SDMA_MASK (SDHOST_CAP0STS_SDMA ) /* SDMA Support */ +#define SDHOST_CAP0_SDMA_OFFSET (REG_BIT22_OFFSET ) /* SDMA Support */ + +#define SDHOST_CAP0_HS_MASK (SDHOST_CAP0STS_HS ) /* High Speed Support */ +#define SDHOST_CAP0_HS_OFFSET (REG_BIT21_OFFSET ) /* High Speed Support */ + +#define SDHOST_CAP0_ADMA2_MASK (SDHOST_CAP0STS_ADMA2 ) /* ADMA2 Support */ +#define SDHOST_CAP0_ADMA2_OFFSET (REG_BIT19_OFFSET ) /* ADMA2 Support */ + +#define SDHOST_CAP0_EMBUS_MASK (SDHOST_CAP0STS_EMBUS ) /* Extended Media Bus Support */ +#define SDHOST_CAP0_EMBUS_OFFSET (REG_BIT18_OFFSET ) /* Extended Media Bus Support */ + +#define SDHOST_CAP0_MBL_MASK (SDHOST_CAP0STS_MBL ) /* Max Block Length */ +#define SDHOST_CAP0_MBL_OFFSET (REG_BIT16_OFFSET ) /* Max Block Length */ + +#define SDHOST_CAP0_BCLKF_MASK (SDHOST_CAP0STS_BCLKF ) /* Base Clock Frequency for SD Clock */ +#define SDHOST_CAP0_BCLKF_OFFSET (REG_BIT8_OFFSET ) /* Base Clock Frequency for SD Clock */ + +#define SDHOST_CAP0_TCLKU_MASK (SDHOST_CAP0STS_TCLKU ) /* Timeout Clock Unit */ +#define SDHOST_CAP0_TCLKU_OFFSET (REG_BIT7_OFFSET ) /* Timeout Clock Unit */ + +#define SDHOST_CAP1_SPIBMOD_MASK (SDHOST_CAP1STS_SPIBMOD ) /* SPI block mode */ +#define SDHOST_CAP1_SPIBMOD_OFFSET (REG_BIT25_OFFSET ) /* SPI block mode */ + +#define SDHOST_CAP1_SPIMOD_MASK (SDHOST_CAP1STS_SPIMOD ) /* SPI mode */ +#define SDHOST_CAP1_SPIMOD_OFFSET (REG_BIT24_OFFSET ) /* SPI mode */ + +#define SDHOST_CAP1_UTFSDR50_MASK (SDHOST_CAP1STS_UTFSDR50 ) /* Use Tuning for SDR50 */ +#define SDHOST_CAP1_UTFSDR50_OFFSET (REG_BIT13_OFFSET ) /* Use Tuning for SDR50 */ + +#define SDHOST_CAP1_DDR50_MASK (SDHOST_CAP1STS_DDR50 ) /* DDR50 Support */ +#define SDHOST_CAP1_DDR50_OFFSET (REG_BIT2_OFFSET ) /* DDR50 Support */ + +#define SDHOST_CAP1_SDR104_MASK (SDHOST_CAP1STS_SDR104 ) /* SDR104 Support */ +#define SDHOST_CAP1_SDR104_OFFSET (REG_BIT1_OFFSET ) /* SDR104 Support */ + +#define SDHOST_CAP1_SDR50_MASK (SDHOST_CAP1STS_SDR50 ) /* SDR50 Support */ + +/* SDHOST preset value register */ +#define SDHOST_PV0_DSCLKFS_MASK (SDHOST_PV0STS_CLKFS_DS ) /* SDCLK Frequency Select Value for Default Speed */ +#define SDHOST_PV0_DSCLKFS_OFFSET (REG_BIT16_OFFSET ) /* SDCLK Frequency Select Value for Default Speed */ + +#define SDHOST_PV0_INITCLKFS_MASK (SDHOST_PV0STS_CLKFS_INIT ) /* SDCLK Frequency Select Value for Initialization */ + +#define SDHOST_PV1_SDR12CLKFS_MASK (SDHOST_PV1STS_CLKFS_SDR12 ) /* SDCLK Frequency Select Value for SDR12*/ +#define SDHOST_PV1_SDR12CLKFS_OFFSET (REG_BIT16_OFFSET ) /* SDCLK Frequency Select Value for SDR12 */ + +#define SDHOST_PV1_HSCLKFS_MASK (SDHOST_PV1STS_CLKFS_HS ) /* SDCLK Frequency Select Value for High Speed */ + +#define SDHOST_PV2_SDR50CLKFS_MASK (SDHOST_PV2STS_CLKFS_SDR50 ) /* SDCLK Frequency Select Value for SDR50*/ +#define SDHOST_PV2_SDR50CLKFS_OFFSET (REG_BIT16_OFFSET ) /* SDCLK Frequency Select Value for SDR50 */ + +#define SDHOST_PV2_SDR25CLKFS_MASK (SDHOST_PV2STS_CLKFS_SDR25 ) /* SDCLK Frequency Select Value for SDR25 */ + +#define SDHOST_PV3_DDR50CLKFS_MASK (SDHOST_PV3STS_CLKFS_DDR50 ) /* SDCLK Frequency Select Value for DDR50*/ +#define SDHOST_PV3_DDR50CLKFS_OFFSET (REG_BIT16_OFFSET ) /* SDCLK Frequency Select Value for DDR50 */ + +#define SDHOST_PV3_SDR104CLKFS_MASK (SDHOST_PV3STS_CLKFS_SDR104 ) /* SDCLK Frequency Select Value for SDR104 */ + +/* boot config */ +#define SDHOST_BOOTMODENORMAL ((uint32_t)0x00000000U ) /* Normal boot */ +#define SDHOST_BOOTMODEALIERNATIVE (SDHOST_CTRL1_BOOTINALT ) /* Alternative boot */ + +#define SDHOST_BOOTNOACKCHECK ((uint32_t)0x00000000U ) /* Boot Ack Not Check */ +#define SDHOST_BOOTACKCHECK (SDHOST_CTRL1_BOOTACKC ) /* Boot Ack Check */ + + +/* ADMA2 Descriptor */ +/* The alignment size for ADDRESS field in ADMA2's descriptor. */ +#define SDHOST_ADMA2_ADDRESS_ALIGN (4U) +/* The alignment size for LENGTH filed in ADMA2's descriptor. */ +#define SDHOST_ADMA2_LENGTH_ALIGN (4U) + +/* ADMA2 descriptor table: + * |----------------|---------------|-------------|--------------------------| + * | Address field | Length | Reserved | Attribute | + * |----------------|---------------|-------------|--------------------------| + * |63 32|31 16|15 06|05 |04 |03|02 |01 |00 | + * |----------------|---------------|-------------|----|----|--|---|---|-----| + * | 32-bit address | 16-bit length | 0000000000 |Act2|Act1| 0|Int|End|Valid| + * |----------------|---------------|-------------|----|----|--|---|---|-----| + * + * ADMA2 action table: + * | Act2 | Act1 | Comment | Operation | + * |------|------|-----------------|-------------------------------------------------------------------| + * | 0 | 0 | No op | Don't care | + * |------|------|-----------------|-------------------------------------------------------------------| + * | 0 | 1 | Reserved | Read this line and go to next one | + * |------|------|-----------------|-------------------------------------------------------------------| + * | 1 | 0 | Transfer data | Transfer data with address and length set in this descriptor line | + * |------|------|-----------------|-------------------------------------------------------------------| + * | 1 | 1 | Link descriptor | Link to another descriptor | + * |------|------|-----------------|-------------------------------------------------------------------| + */ +/**********************************tables below are created only for Doxygen***********************************/ +/* The bit shift for LENGTH field in ADMA2's descriptor. + * + * + * + *
ADMA2 descriptor table
Address field Length Reserved Attribute + *
63 32 31 16 15 06 05 04 03 02 01 00 + *
32-bit address 16-bit length 0000000000 Act2 Act1 0 Int End Valid + *
+ * + * + * + *
ADMA2 action
Act2 Act1 Comment Operation + *
0 0 No op Don't care + *
0 1 Reserved Read this line and go to next one + *
1 0 Transfer data Transfer data with address and length set in this descriptor line + *
1 1 Link descriptor Link to another descriptor + *
+ */ +#define SDHOST_ADMA2_DESCRIPTOR_LENGTH_SHIFT (16U) +/* The bit mask for LENGTH field in ADMA2's descriptor. */ +#define SDHOST_ADMA2_DESCRIPTOR_LENGTH_MASK (0xFFFFU) +/* The maximum value of LENGTH field in ADMA2's descriptor. */ +#define SDHOST_ADMA2_DESCRIPTOR_MAX_LENGTH_PER_ENTRY (SDHOST_ADMA2_DESCRIPTOR_LENGTH_MASK - 3U) + +/* ADMA2 descriptor control and status mask. */ +enum +{ + SDHOST_Adma2DescriptorValidFlag = (1U << 0U), /* Valid flag. */ + SDHOST_Adma2DescriptorEndFlag = (1U << 1U), /* End flag. */ + SDHOST_Adma2DescriptorInterruptFlag = (1U << 2U), /* Interrupt flag. */ + SDHOST_Adma2DescriptorActivity1Flag = (1U << 4U), /* Activity 1 mask. */ + SDHOST_Adma2DescriptorActivity2Flag = (1U << 5U), /* Activity 2 mask. */ + + SDHOST_Adma2DescriptorTypeNop = (SDHOST_Adma2DescriptorValidFlag), /* No operation. */ + SDHOST_Adma2DescriptorTypeReserved = (SDHOST_Adma2DescriptorActivity1Flag | SDHOST_Adma2DescriptorValidFlag), + /* Reserved. */ + SDHOST_Adma2DescriptorTypeTransfer = (SDHOST_Adma2DescriptorActivity2Flag | SDHOST_Adma2DescriptorValidFlag), + /* Transfer type. */ + SDHOST_Adma2DescriptorTypeLink = (SDHOST_Adma2DescriptorActivity1Flag | SDHOST_Adma2DescriptorActivity2Flag | + SDHOST_Adma2DescriptorValidFlag), /* Link type. */ +}; + +/* ADMA descriptor configuration flag. */ +enum +{ + SDHOST_AdmaDescriptorSingleFlag = 0U, + /* Try to finish the transfer in a single ADMA descriptor. If transfer size is bigger than one + ADMA descriptor's ability, new another descriptor for data transfer. */ + SDHOST_AdmaDescriptorMultipleFlag = 1U, + /* Create multiple ADMA descriptors within the ADMA table, this is used for + mmc boot mode specifically, which need to modify the ADMA descriptor on the fly, + so the flag should be used combining with stop at block gap feature. */ +}; + + +/* Data transfer width. */ +typedef enum +{ + SDHOST_DataBusWidth1Bit = 0U, /* 1-bit mode */ + SDHOST_DataBusWidth4Bit = 1U, /* 4-bit mode */ + SDHOST_DataBusWidth8Bit = 2U, /* 8-bit mode */ +} SDHOST_BusWidth; + +/* Wakeup event. */ +enum +{ + SDHOST_WakeupEventOnCardInt = SDHOST_CTRL1_INTWKUP, /* Wakeup on card interrupt. */ + SDHOST_WakeupEventOnCardInsert = SDHOST_CTRL1_INSTWKUP, /* Wakeup on card insertion. */ + SDHOST_WakeupEventOnCardRemove = SDHOST_CTRL1_RMVWKUP, /* Wakeup on card removal. */ + SDHOST_WakeupEventsAll = + (SDHOST_WakeupEventOnCardInt | SDHOST_WakeupEventOnCardInsert | SDHOST_WakeupEventOnCardRemove), + /* All wakeup events */ +}; + +/* SDIO control flag. */ +enum +{ + SDHOST_StopAtBlockGapFlag = SDHOST_CTRL1_SABGREQ, /* Stop at block gap. */ + SDHOST_ReadWaitControlFlag = SDHOST_CTRL1_RWAITCTRL, /* Read wait control. */ + SDHOST_InterruptAtBlockGapFlag = SDHOST_CTRL1_INTATBG, /* Interrupt at block gap. */ +}; + + +/* Force event bit position. */ +enum +{ + SDHOST_ForceEventAutoCommand12NotExecuted = SDHOST_STSFE_ACMD12NE, /* Auto CMD12 not executed error. */ + SDHOST_ForceEventAutoCommand12Timeout = SDHOST_STSFE_ACMDTE, /* Auto CMD12 timeout error. */ + SDHOST_ForceEventAutoCommand12CrcError = SDHOST_STSFE_ACMDCRCE, /* Auto CMD12 CRC error. */ + SDHOST_ForceEventAutoCommandEndBitError = SDHOST_STSFE_ACMDEBE, /* Auto CMD end bit error. */ + SDHOST_ForceEventAutoCommand12IndexError = SDHOST_STSFE_ACMDINXE, /* Auto CMD12 index error. */ + SDHOST_ForceEventAutoCommand12NotIssued = SDHOST_STSFE_ACMD12E, /* Auto CMD12 not issued error. */ + SDHOST_ForceEventCommandTimeout = SDHOST_STSFE_CTE, /* Command timeout error. */ + SDHOST_ForceEventCommandCrcError = SDHOST_STSFE_CCRCE, /* Command CRC error. */ + SDHOST_ForceEventCommandEndBitError = SDHOST_STSFE_CEBE, /* Command end bit error. */ + SDHOST_ForceEventCommandIndexError = SDHOST_STSFE_CINXE, /* Command index error. */ + SDHOST_ForceEventDataTimeout = SDHOST_STSFE_DTE, /* Data timeout error. */ + SDHOST_ForceEventDataCrcError = SDHOST_STSFE_DCRCE, /* Data CRC error. */ + SDHOST_ForceEventDataEndBitError = SDHOST_STSFE_DEBE, /* Data end bit error. */ + SDHOST_ForceEventAutoCommand12Error = SDHOST_STSFE_ACMDE, /* Auto CMD12 error. */ + SDHOST_ForceEventAdmaError = SDHOST_STSFE_ADMAE, /* Adma error. */ +}; + + +/* Host SDMA Buffer Size. */ +typedef enum +{ + SDHOST_SDMABUFFERSIZE_4KB = ((uint32_t)0x00000000U), /* Detect A11. */ + SDHOST_SDMABUFFERSIZE_8KB = SDHOST_BLKCFG_HDBS_0, /* Detect A12. */ + SDHOST_SDMABUFFERSIZE_16KB = SDHOST_BLKCFG_HDBS_1, /* Detect A13. */ + SDHOST_SDMABUFFERSIZE_32KB = SDHOST_BLKCFG_HDBS_0 | SDHOST_BLKCFG_HDBS_1, /* Detect A14. */ + SDHOST_SDMABUFFERSIZE_64KB = SDHOST_BLKCFG_HDBS_2, /* Detect A15. */ + SDHOST_SDMABUFFERSIZE_128KB = SDHOST_BLKCFG_HDBS_2 | SDHOST_BLKCFG_HDBS_0, /* Detect A16. */ + SDHOST_SDMABUFFERSIZE_256KB = SDHOST_BLKCFG_HDBS_2 | SDHOST_BLKCFG_HDBS_1, /* Detect A17. */ + SDHOST_SDMABUFFERSIZE_512KB = SDHOST_BLKCFG_HDBS, /* NDetect A18. */ +}SDHOST_SDMA_Buffer_Size; + +/* card work mode */ +typedef enum +{ + SDMMC_DS = 0U, /* Default Speed */ + SDMMC_HS = 1U, /* High Speed */ + SDMMC_SDR12 = 2U, /* SDR12 */ + SDMMC_SDR25 = 3U, /* SDR25 */ + SDMMC_SDR50 = 4U, /* SDR50 */ + SDMMC_SDR104 = 5U, /* SDR104 */ + SDMMC_DDR50 = 6U, /* DDR50 */ + SDMMC_SPI = 7U, /* SPI mode */ +}SD_ModeConfig; + +/* Card detect signal source and test level */ +#define SDMMC_CARDDETECT_NORMAL ((uint32_t)0x00000000U) /* Select SDCD # (normal use)*/ +#define SDMMC_CARDDETECT_TEST (SDHOST_CTRL1_CDSD) /* Select card detection test level */ + +#define SDMMC_CARDTESTLEVEL_LOW ((uint32_t)0x00000000U) /* low level */ +#define SDMMC_CARDTESTLEVEL_HIGH (SDHOST_CTRL1_CDTL) /* high level */ + + +/* Private function */ +static SDMMC_STS SDMMC_TransferConfig(SDHOST_Module* SDHOSTx, uint32_t transferFlags, uint32_t blockSize, uint32_t blockCount,SDHOST_TMODE_struct *TMODE_struct); +static SDMMC_STS SDMMC_ReceiveCommandResponse(SDHOST_Module* SDHOSTx, SDMMC_CMD *command); +static uint32_t SDMMC_ReadDataPort(SDHOST_Module* SDHOSTx, SDMMC_DATA *data, uint32_t transferredWords); +static ErrorStatus SDMMC_ReadByDataPortBlocking(SDHOST_Module* SDHOSTx, SDMMC_DATA *data); +static uint32_t SDMMC_WriteDataPort(SDHOST_Module* SDHOSTx, SDMMC_DATA *data, uint32_t transferredWords); +static ErrorStatus SDMMC_WriteByDataPortBlocking(SDHOST_Module* SDHOSTx, SDMMC_DATA *data); +SDMMC_STS SDMMC_WaitCommandDone(SDHOST_Module* SDHOSTx, SDMMC_CMD *command, FunctionalState pollingCmdDone); +static SDMMC_STS SDMMC_TransferDataBlocking(SDHOST_Module* SDHOSTx, SDMMC_DATA *data, FunctionalState DMACmd); +void SDMMC_WriteData(SDHOST_Module* SDHOSTx, uint32_t data); +uint32_t SDMMC_ReadData(SDHOST_Module* SDHOSTx); + + +/* Public function */ +void SDMMC_DeInit(SDMMC_Module* SDMMCx); +ErrorStatus SDMMC_WrapperConfig(SDMMC_Module* SDMMCx, SDMMC_WrapperType *SDMMC_WrapperParam); +void SDMMC_StructWrapperInit(SDMMC_WrapperType *SDMMC_WrapperStruct); +ErrorStatus SDMMC_SoftWareReset(SDHOST_Module* SDHOSTx, uint32_t LineMask); +void SDMMC_SendCommand(SDHOST_Module* SDHOSTx, SDMMC_CMD *command,const SDHOST_TMODE_struct *TMODE_struct); +void SDMMC_GetCapability(SDHOST_Module* SDHOSTx, SDHOST_capability *capability); +void SDMMC_GetPresetvalue(SDHOST_Module* SDHOSTx, SDHOST_presetvalue *presetvalue); +void SDMMC_EnableSDCLK(SDHOST_Module* SDHOSTx, FunctionalState Cmd); +SDMMC_STS SDMMC_WaitSDCLKStable(SDHOST_Module* SDHOSTx); +SDMMC_STS SDMMC_SetSdClock(SDHOST_Module* SDHOSTx, FunctionalState PresetCmd, uint32_t SDClock_KHz); +void SDMMC_ConfigemmcBoot(SDHOST_Module* SDHOSTx, const SDHOST_boot_config *config); +static SDMMC_STS SDMMC_ConfigInternalDma(SDHOST_Module* SDHOSTx, SDHOST_ADMAconfig *dmaConfig, const uint32_t *dataAddr, + FunctionalState enAutoCmd23,SDHOST_TMODE_struct *TMODE_struct); +static SDMMC_STS SDMMC_SetAdmaTableConfig(SDHOST_Module* SDHOSTx,SDHOST_ADMAconfig *dmaConfig, + SDMMC_DATA *dataConfig, SDHOST_TMODE_struct *TMODE_struct); +SDMMC_STS SDMMC_TransferBlocking(SDHOST_Module* SDHOSTx, SDHOST_ADMAconfig *dmaConfig, SDMMC_Transfer *transfer,SDHOST_TMODE_struct *TMODE_struct); +void SDMMC_EnableManualTuningOut(SDMMC_Module* SDMMCx, uint32_t delay,FunctionalState cmd); +void SDMMC_EnableManualTuningIN(SDMMC_Module* SDMMCx, uint32_t delay,FunctionalState cmd); +void SDMMC_FixedSampleClock(SDHOST_Module* SDHOSTx); +void SDMMC_EnableAutoTuning(SDHOST_Module* SDHOSTx, FunctionalState cmd); +void SDMMC_ConfigInt(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag, FunctionalState Cmd); +void SDMMC_EnableFlagStatus(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag, FunctionalState Cmd); +FlagStatus SDMMC_GetEnableFlagStatus(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag); +FlagStatus SDMMC_GetFlagStatus(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag); +void SDMMC_ClrFlag(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag); +void SDMMC_EnableForceEvent(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag, FunctionalState Cmd); +FlagStatus SDMMC_GetPresentFlagStatus(SDHOST_Module* SDHOSTx, uint32_t SDHOST_PreFlag); +FlagStatus SDMMC_GetACMDErrorStatusFlag(SDHOST_Module* SDHOSTx, uint32_t SDHOST_ACMDFlag); +FlagStatus SDMMC_GetADMAErrorStatusFlag(SDHOST_Module* SDHOSTx, uint32_t SDHOST_ADMAFlag); +void SDMMC_EnableHWReset(SDHOST_Module* SDHOSTx, FunctionalState Cmd); +void SDMMC_ConfigWorkMode(SDHOST_Module* SDHOSTx, SD_ModeConfig mode); +void SDMMC_ConfigBusWidth(SDHOST_Module* SDHOSTx, SDHOST_BusWidth Width); +void SDMMC_EnableWakeupEvent(SDHOST_Module* SDHOSTx,uint32_t Wakeupevent, FunctionalState Cmd); +void SDMMC_EnableSdioControl(SDHOST_Module* SDHOSTx,uint32_t Sdioflag, FunctionalState Cmd); +void SDMMC_EnableContinueRequest(SDHOST_Module* SDHOSTx); +void SDMMC_EnableMmcBoot(SDHOST_Module* SDHOSTx, FunctionalState Cmd); +void SDMMC_EnableVolSwitch(SDHOST_Module* SDHOSTx, FunctionalState Cmd); +void SDMMC_EnablePower(SDHOST_Module* SDHOSTx, FunctionalState Cmd); +void SDMMC_ConfigSDMABufferSize(SDHOST_Module* SDHOSTx, SDHOST_SDMA_Buffer_Size Size); +void SDMMC_TModeStructInit(SDHOST_TMODE_struct *TMODE_struct); +void SDMMC_ConfigCardDetectSignal(SDHOST_Module* SDHOSTx, uint32_t Signalsource, uint32_t Signallevel); +void SDMMC_EnableLED(SDHOST_Module* SDHOSTx, FunctionalState Cmd); +void SDMMC_EnableAsyncInt(SDHOST_Module* SDHOSTx, FunctionalState Cmd); +void SDMMC_ConfigDATATimeoutValue(SDHOST_Module* SDHOSTx, uint32_t Count); + + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_78X_SDMMC_H__ */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_sdram.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_sdram.h new file mode 100644 index 0000000000..462a8e741e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_sdram.h @@ -0,0 +1,233 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_sdram.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_SDRAM_H__ +#define __N32H76X_78X_SDRAM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + + +/** SDRAM Timing parameters structure definition **/ +typedef struct +{ + uint32_t RowActiveTime; /* Defines the minimum Self Refresh period in number of memory clock cycles. + This parameter can be a value between Min_Data = 1 and Max_Data = 64 TRAS 1 */ + + uint32_t RowCycleTime; /* Defines the delay between the Refresh command and the Activate command + and the delay between two consecutive Refresh commands in number of + memory clock cycles. + This parameter can be a value between Min_Data = 1 and Max_Data = 64 TRC 2 */ + + uint32_t RowActToRowActDelay; /* Defines the delay between two active commands to different banks + in number of memory clock cycles. + This parameter can be a value between Min_Data = 1 and Max_Data = 64 TRRD 3 */ + + uint32_t PrechargeTime; /* Defines the delay between a Precharge Command and an other command + in number of memory clock cycles. + This parameter can be a value between Min_Data = 1 and Max_Data = 64 TRP 4 */ + + uint32_t WriteRecoveryTime; /* Defines the Write recovery Time in number of memory clock cycles. + This parameter can be a value between Min_Data = 1 and Max_Data = 64 TWR 5 */ + + uint32_t RefreshCycleTime; /* Defines the delay between any two consecutive commands in number + of memory clock cycles. + This parameter can be a value between Min_Data = 1 and Max_Data = 64 TRFC 6 */ + + uint32_t RAStoCASDelay; /* Defines the delay between the Activate Command and a Read/Write + command in number of memory clock cycles. + This parameter can be a value between Min_Data = 1 and Max_Data = 16 TRCD 7 */ + +} SDRAM_TimingType; + +/** Defines the number of SDRAM Devices **/ +typedef enum +{ + SDRAM_DEVICE_1 = 1, + SDRAM_DEVICE_2 +} SDRAM_DeviceType; + +/*** SDRAM Macro Definition Start ***/ +#define SDRAM_REG_BIT_MASK ((uint32_t)0x00000000U) +/** SDRAM Device Enable **/ +#define SDRAM_DEVICE_ENABLE (SDRAM_CFG_SDRAMEN) +#define SDRAM_DEVICE_DISABLE (~((uint32_t)SDRAM_CFG_SDRAMEN)) + +/** SDRAM Device Refresh Commands Enable **/ +#define SDRAM_DEVICE_REFRESH_ENABLE (SDRAM_CFG_REFRESHEN) +#define SDRAM_DEVICE_REFRESH_DISABLE (~((uint32_t)SDRAM_CFG_REFRESHEN)) + +/** SDRAM Device Auto Precharge Enable **/ +#define SDRAM_DEVICE_AUTOPRECHRG_ENABLE (SDRAM_CFG_AUTOPCHEN) +#define SDRAM_DEVICE_AUTOPRECHRG_DISABLE (~((uint32_t)SDRAM_CFG_AUTOPCHEN)) + +/** SDRAM Device Bus Width **/ +#define SDRAM_DEVICE_BUSWID_8BITS SDRAM_REG_BIT_MASK +#define SDRAM_DEVICE_BUSWID_16BITS (SDRAM_CFG_BUSWID_0) +#define SDRAM_DEVICE_BUSWID_32BITS (SDRAM_CFG_BUSWID_1) +#define SDRAM_DEVICE_BUSWID_MASK (~((uint32_t)(SDRAM_CFG_BUSWID))) + +/** SDRAM Device Burst Length **/ +#define SDRAM_DEVICE_BURSTLEN_1 SDRAM_REG_BIT_MASK +#define SDRAM_DEVICE_BURSTLEN_2 (SDRAM_CFG_BURSTLEN_0) +#define SDRAM_DEVICE_BURSTLEN_4 (SDRAM_CFG_BURSTLEN_0 | SDRAM_CFG_BURSTLEN_1) +#define SDRAM_DEVICE_BURSTLEN_8 (SDRAM_CFG_BURSTLEN_0 | SDRAM_CFG_BURSTLEN_1 | SDRAM_CFG_BURSTLEN_2) +#define SDRAM_DEVICE_BURSTLEN_MASK (~((uint32_t)(SDRAM_CFG_BURSTLEN))) + +/** SDRAM Device CAS Latency **/ +#define SDRAM_DEVICE_CASLTCY_0 SDRAM_REG_BIT_MASK +#define SDRAM_DEVICE_CASLTCY_1 (SDRAM_CFG_CASLATENCY_0) +#define SDRAM_DEVICE_CASLTCY_2 (SDRAM_CFG_CASLATENCY_1) +#define SDRAM_DEVICE_CASLTCY_3 (SDRAM_CFG_CASLATENCY_0 | SDRAM_CFG_CASLATENCY_1) +#define SDRAM_DEVICE_CASLTCY_MASK (~((uint32_t)(SDRAM_CFG_CASLATENCY))) + +/** SDRAM Device Prefetch Read Enable **/ +#define SDRAM_DEVICE_PREFETCHREAD_ENABLE (SDRAM_CFG_PREFCHRDEN) +#define SDRAM_DEVICE_PREFETCHREADG_DISABLE (~((uint32_t)SDRAM_CFG_PREFCHRDEN)) + +/** SDRAM Device Store On Miss Enable **/ +#define SDRAM_DEVICE_SOM_ENABLE (SDRAM_CFG_SOMEN) +#define SDRAM_DEVICE_SOM_DISABLE (~((uint32_t)SDRAM_CFG_SOMEN)) + +/** SDRAM Device Bank Interleaving Enable **/ +#define SDRAM_DEVICE_BANKIL_ENABLE (SDRAM_CFG_BANKINTRLEN) +#define SDRAM_DEVICE_BANKIL_DISABLE (~((uint32_t)SDRAM_CFG_BANKINTRLEN)) + +/** SDRAM Device Address Configration **/ +#define SDRAM_BANK4_ROW4096_COL256 SDRAM_REG_BIT_MASK +#define SDRAM_BANK4_ROW4096_COL512 (SDRAM_CFG_ADDCFG_0) +#define SDRAM_BANK4_ROW4096_COL1024 (SDRAM_CFG_ADDCFG_1) +#define SDRAM_BANK4_ROW4096_COL2048 (SDRAM_CFG_ADDCFG_0 | SDRAM_CFG_ADDCFG_1) + +#define SDRAM_BANK4_ROW8192_COL256 (SDRAM_CFG_ADDCFG_2) +#define SDRAM_BANK4_ROW8192_COL512 (SDRAM_CFG_ADDCFG_0 | SDRAM_CFG_ADDCFG_2) +#define SDRAM_BANK4_ROW8192_COL1024 (SDRAM_CFG_ADDCFG_1 | SDRAM_CFG_ADDCFG_2) +#define SDRAM_BANK4_ROW8192_COL2048 (SDRAM_CFG_ADDCFG_0 | SDRAM_CFG_ADDCFG_1 | SDRAM_CFG_ADDCFG_2) + +#define SDRAM_BANK4_ROW2048_COL256 (SDRAM_CFG_ADDCFG_3) +#define SDRAM_BANK4_ROW2048_COL512 (SDRAM_CFG_ADDCFG_0 | SDRAM_CFG_ADDCFG_3) +#define SDRAM_BANK4_ROW2048_COL1024 (SDRAM_CFG_ADDCFG_1 | SDRAM_CFG_ADDCFG_3) +#define SDRAM_BANK4_ROW2048_COL2048 (SDRAM_CFG_ADDCFG_0 | SDRAM_CFG_ADDCFG_1 | SDRAM_CFG_ADDCFG_3) + +#define SDRAM_DEVICE_ADDCFG_MASK (~((uint32_t)SDRAM_CFG_ADDCFG)) + +/** SDRAM Operatio Setup of Clock enable **/ +#define SDRAM_CLOCK_ENABLE (SDRAM_OS_CKEN) +#define SDRAM_CLOCK_DISABLE (~((uint32_t)SDRAM_OS_CKEN)) + +/** SDRAM Operatio Setup of Operation Code **/ +#define SDRAM_OPCODE_NONE SDRAM_REG_BIT_MASK +#define SDRAM_OPCODE_PRECHRG (SDRAM_OS_OPCODE_0) +#define SDRAM_OPCODE_REFRESH (SDRAM_OS_OPCODE_1) +#define SDRAM_OPCODE_LOADMODE (SDRAM_OS_OPCODE_0 | SDRAM_OS_OPCODE_1) +#define SDRAM_OPCODE_MASK (~((uint32_t)(SDRAM_OS_OPCODE))) + +/** SDRAM Operatio Setup of Chip Select **/ +#define SDRAM_CS_ALL SDRAM_REG_BIT_MASK +#define SDRAM_CS_SDRAM2_ONLY (SDRAM_OS_CS_0) +#define SDRAM_CS_SDRAM1_ONLY (SDRAM_OS_CS_1) +#define SDRAM_CS_NONE (SDRAM_OS_CS_0 | SDRAM_OS_CS_1) +#define SDRAM_CS_MASK (~((uint32_t)(SDRAM_OS_CS))) + +/** SDRAM Operatio Setup of Bank Address **/ +#define SDRAM_BANKADD_1 SDRAM_REG_BIT_MASK +#define SDRAM_BANKADD_2 (SDRAM_OS_BANKADD_0) +#define SDRAM_BANKADD_3 (SDRAM_OS_BANKADD_1) +#define SDRAM_BANKADD_4 (SDRAM_OS_BANKADD_0 | SDRAM_OS_BANKADD_1) +#define SDRAM_BANKADD_MASK (~((uint32_t)(SDRAM_OS_BANKADD))) + +/** SDRAM Operatio Setup of Address **/ +#define SDRAM_OS_ADDRESS_MASK (~((uint32_t)SDRAM_OS_ADD)) + +/** SDRAM Write Protection **/ +#define SDRAM_WP_SDRAM1_ENABLE (SDRAM_WP_WP1) +#define SDRAM_WP_SDRAM1_DISABLE (~((uint32_t)SDRAM_WP_WP1)) +#define SDRAM_WP_SDRAM2_ENABLE (SDRAM_WP_WP2) +#define SDRAM_WP_SDRAM2_DISABLE (~((uint32_t)SDRAM_WP_WP2)) + +#define SDRAM_REMAP_ENABLE (0x1U) +#define SDRAM_REMAP_DISABLE (0x0U) +/*** SDRAM Macro Definition End ***/ + +/** SDRAM Functions **/ +void SDRAM_DeInit(void); +void SDRAM_TimingInit(SDRAM_TimingType *Timing); +void SDRAM_RefreshIntervalInit(uint32_t RefreshIntervalTime); +void SDRAM_SetDeviceAddress(SDRAM_DeviceType DeviceNo, uint32_t BaseAddr, uint32_t AddrMask); +void SDRAM_EnableDevice(SDRAM_DeviceType DeviceNo, FunctionalState Cmd); +void SDRAM_EnableRefreshCMD(SDRAM_DeviceType DeviceNo, FunctionalState Cmd); +void SDRAM_EnableAutoPrecharge(SDRAM_DeviceType DeviceNo, FunctionalState Cmd); +void SDRAM_EnablePrefetchRead(SDRAM_DeviceType DeviceNo, FunctionalState Cmd); +void SDRAM_EnableSOM(SDRAM_DeviceType DeviceNo, FunctionalState Cmd); +void SDRAM_EnableBankInterleave(SDRAM_DeviceType DeviceNo, FunctionalState Cmd); +void SDRAM_ConfigBusWidth(SDRAM_DeviceType DeviceNo, uint32_t BusWidth); +void SDRAM_ConfigBurstLength(SDRAM_DeviceType DeviceNo, uint32_t BurstLength); +void SDRAM_ConfigCASLatency(SDRAM_DeviceType DeviceNo, uint32_t Latency); +void SDRAM_ConfigAddress(SDRAM_DeviceType DeviceNo, uint32_t Address); +void SDRAM_EnableClock(FunctionalState Cmd); +void SDRAM_SetOperationCode(uint32_t OperationCode); +void SDRAM_SetDeviceSelect(uint32_t ChipSelect); +void SDRAM_SetBank(uint32_t BankNo); +void SDRAM_SetAddress(uint32_t Address); +void SDRAM_EnableWriteProtection(SDRAM_DeviceType DeviceNo, FunctionalState Cmd); +void SDRAM_EnableAddressRemap(FunctionalState Cmd); + +#ifdef __cplusplus +} +#endif + +#endif /*__N32H76X_78X_SDRAM_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_shrtim.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_shrtim.h new file mode 100644 index 0000000000..1db51743f0 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_shrtim.h @@ -0,0 +1,2292 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_shrtim.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef N32H76X_78X_SHRTIM_H +#define N32H76X_78X_SHRTIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "n32h76x_78x.h" + +/*** SHRTIM structure definition start ***/ +static const uint16_t REG_OFFSET_TAB_TIMER[] = +{ + 0x00U, /* 0: MASTER */ + 0x80U, /* 1: TIMER A */ + 0x100U, /* 2: TIMER B */ + 0x180U, /* 3: TIMER C */ + 0x200U, /* 4: TIMER D */ + 0x280U, /* 5: TIMER E */ + 0x300U, /* 6: TIMER F */ +}; + +static const uint8_t REG_OFFSET_TAB_ADTGSRC[] = +{ + 0x00U, /* SHRTIM_ADCTRIG_1_GROUP1: SHRTIM_ADTG1SRC1 */ + 0x04U, /* SHRTIM_ADCTRIG_1_GROUP2: SHRTIM_ADTG1SRC2 */ + 0x08U, /* SHRTIM_ADCTRIG_2_GROUP1: SHRTIM_ADTG2SRC1 */ + 0x0CU, /* SHRTIM_ADCTRIG_2_GROUP2: SHRTIM_ADTG2SRC2 */ + 0x10U, /* SHRTIM_ADCTRIG_3_GROUP1: SHRTIM_ADTG3SRC1 */ + 0x14U, /* SHRTIM_ADCTRIG_3_GROUP2: SHRTIM_ADTG3SRC2 */ + 0x18U, /* SHRTIM_ADCTRIG_4_GROUP1: SHRTIM_ADTG4SRC1 */ + 0x1CU, /* SHRTIM_ADCTRIG_4_GROUP2: SHRTIM_ADTG4SRC2 */ + 0x50U, /* SHRTIM_ADCTRIG_5: SHRTIM_ADTGEX1 */ + 0x50U, /* SHRTIM_ADCTRIG_7: SHRTIM_ADTGEX1 */ + 0x50U, /* SHRTIM_ADCTRIG_9: SHRTIM_ADTGEX1 */ + 0x54U, /* SHRTIM_ADCTRIG_6: SHRTIM_ADTGEX2 */ + 0x54U, /* SHRTIM_ADCTRIG_8: SHRTIM_ADTGEX2 */ + 0x54U, /* SHRTIM_ADCTRIG_10: SHRTIM_ADTGEX2 */ +}; + +static const uint8_t REG_OFFSET_TAB_ADTGUPD[] = +{ + 0x00U, /* SHRTIM_ADCTRIG_1: SHRTIM_CTRL1 */ + 0x00U, /* SHRTIM_ADCTRIG_2: SHRTIM_CTRL1 */ + 0x00U, /* SHRTIM_ADCTRIG_3: SHRTIM_CTRL1 */ + 0x00U, /* SHRTIM_ADCTRIG_4: SHRTIM_CTRL1 */ + 0x98U, /* SHRTIM_ADCTRIG_5: SHRTIM_ADTGUPD */ + 0x98U, /* SHRTIM_ADCTRIG_6: SHRTIM_ADTGUPD */ + 0x98U, /* SHRTIM_ADCTRIG_7: SHRTIM_ADTGUPD */ + 0x98U, /* SHRTIM_ADCTRIG_8: SHRTIM_ADTGUPD */ + 0x98U, /* SHRTIM_ADCTRIG_9: SHRTIM_ADTGUPD */ + 0x98U, /* SHRTIM_ADCTRIG_10: SHRTIM_ADTGUPD */ +}; + +static const uint8_t REG_SHIFT_TAB_ADTGSRC[] = +{ + 0, /* SHRTIM_ADCTRIG1_SOURCE_GROUP1 */ + 0, /* SHRTIM_ADCTRIG1_SOURCE_GROUP2 */ + 0, /* SHRTIM_ADCTRIG2_SOURCE_GROUP1 */ + 0, /* SHRTIM_ADCTRIG2_SOURCE_GROUP2 */ + 0, /* SHRTIM_ADCTRIG3_SOURCE_GROUP1 */ + 0, /* SHRTIM_ADCTRIG3_SOURCE_GROUP2 */ + 0, /* SHRTIM_ADCTRIG4_SOURCE_GROUP1 */ + 0, /* SHRTIM_ADCTRIG4_SOURCE_GROUP2 */ + 0, /* SHRTIM_ADCTRIG_5 */ + 0, /* SHRTIM_ADCTRIG_6 */ + 8, /* SHRTIM_ADCTRIG_7 */ + 8, /* SHRTIM_ADCTRIG_8 */ + 16, /* SHRTIM_ADCTRIG_9 */ + 16, /* SHRTIM_ADCTRIG_10 */ +}; + +static const uint8_t REG_SHIFT_TAB_ADTGUPD[] = +{ + 16, /* SHRTIM_ADCTRIG_1 */ + 19, /* SHRTIM_ADCTRIG_2 */ + 22, /* SHRTIM_ADCTRIG_3 */ + 25, /* SHRTIM_ADCTRIG_4 */ + 0, /* SHRTIM_ADCTRIG_5 */ + 4, /* SHRTIM_ADCTRIG_6 */ + 8, /* SHRTIM_ADCTRIG_7 */ + 12, /* SHRTIM_ADCTRIG_8 */ + 16, /* SHRTIM_ADCTRIG_9 */ + 20 /* SHRTIM_ADCTRIG_10 */ +}; + +static const uint32_t REG_MASK_TAB_ADTGSRC[] = +{ + 0xFFFFFFFFU, /* SHRTIM_ADCTRIG1_SOURCE_GROUP1 */ + 0xFFFFFFFFU, /* SHRTIM_ADCTRIG1_SOURCE_GROUP2 */ + 0xFFFFFFFFU, /* SHRTIM_ADCTRIG2_SOURCE_GROUP1 */ + 0xFFFFFFFFU, /* SHRTIM_ADCTRIG2_SOURCE_GROUP2 */ + 0xFFFFFFFFU, /* SHRTIM_ADCTRIG3_SOURCE_GROUP1 */ + 0xFFFFFFFFU, /* SHRTIM_ADCTRIG3_SOURCE_GROUP2 */ + 0xFFFFFFFFU, /* SHRTIM_ADCTRIG4_SOURCE_GROUP1 */ + 0xFFFFFFFFU, /* SHRTIM_ADCTRIG4_SOURCE_GROUP2 */ + 0x0000003FU, /* SHRTIM_ADCTRIG_5 */ + 0x0000003FU, /* SHRTIM_ADCTRIG_6 */ + 0x00003F00U, /* SHRTIM_ADCTRIG_7 */ + 0x00003F00U, /* SHRTIM_ADCTRIG_8 */ + 0x003F0000U, /* SHRTIM_ADCTRIG_9 */ + 0x003F0000U, /* SHRTIM_ADCTRIG_10 */ +}; + +static const uint32_t REG_MASK_TAB_ADTGUPD[] = +{ + 0x00070000U, /* SHRTIM_ADCTRIG_1 */ + 0x00380000U, /* SHRTIM_ADCTRIG_2 */ + 0x01C00000U, /* SHRTIM_ADCTRIG_3 */ + 0x0E000000U, /* SHRTIM_ADCTRIG_4 */ + 0x00000007U, /* SHRTIM_ADCTRIG_5 */ + 0x00000070U, /* SHRTIM_ADCTRIG_6 */ + 0x00000700U, /* SHRTIM_ADCTRIG_7 */ + 0x00007000U, /* SHRTIM_ADCTRIG_8 */ + 0x00070000U, /* SHRTIM_ADCTRIG_9 */ + 0x00700000U /* SHRTIM_ADCTRIG_10 */ +}; + +static const uint8_t REG_OFFSET_TAB_ADCPSx[] = +{ + 0U, /* 0: SHRTIM_ADC1R */ + 6U, /* 1: SHRTIM_ADC2R */ + 12U, /* 2: SHRTIM_ADC3R */ + 18U, /* 3: SHRTIM_ADC4R */ + 24U, /* 4: SHRTIM_ADC5R */ + 32U, /* 5: SHRTIM_ADC6R */ + 38U, /* 6: SHRTIM_ADC7R */ + 44U, /* 7: SHRTIM_ADC8R */ + 50U, /* 8: SHRTIM_ADC9R */ + 56U /* 9: SHRTIM_ADC10R */ +}; + +static const uint16_t REG_OFFSET_TAB_TxSET[] = +{ + 0x00U, /* 0: TA1 */ + 0x08U, /* 1: TA2 */ + 0x80U, /* 2: TB1 */ + 0x88U, /* 3: TB2 */ + 0x100U, /* 4: TC1 */ + 0x108U, /* 5: TC2 */ + 0x180U, /* 6: TD1 */ + 0x188U, /* 7: TD2 */ + 0x200U, /* 8: TE1 */ + 0x208U, /* 9: TE2 */ + 0x280U, /* 10: TF1 */ + 0x288U /* 11: TF2 */ +}; + +static const uint16_t REG_OFFSET_TAB_TxOUT[] = +{ + 0x00U, /* 0: TA1 */ + 0x00U, /* 1: TA2 */ + 0x80U, /* 2: TB1 */ + 0x80U, /* 3: TB2 */ + 0x100U, /* 4: TC1 */ + 0x100U, /* 5: TC2 */ + 0x180U, /* 6: TD1 */ + 0x180U, /* 7: TD2 */ + 0x200U, /* 8: TE1 */ + 0x200U, /* 9: TE2 */ + 0x280U, /* 10: TF1 */ + 0x280U /* 11: TF2 */ +}; + +static const uint8_t REG_OFFSET_TAB_EXEVCTRL[] = +{ + 0x00U, /* SHRTIM_EVENT_1 */ + 0x00U, /* SHRTIM_EVENT_2 */ + 0x00U, /* SHRTIM_EVENT_3 */ + 0x00U, /* SHRTIM_EVENT_4 */ + 0x00U, /* SHRTIM_EVENT_5 */ + 0x04U, /* SHRTIM_EVENT_6 */ + 0x04U, /* SHRTIM_EVENT_7 */ + 0x04U, /* SHRTIM_EVENT_8 */ + 0x04U, /* SHRTIM_EVENT_9 */ + 0x04U /* SHRTIM_EVENT_10 */ +}; + +static const uint8_t REG_OFFSET_TAB_FALTIN[] = +{ + 0x00U, /* SHRTIM_FAULT_1 */ + 0x00U, /* SHRTIM_FAULT_2 */ + 0x00U, /* SHRTIM_FAULT_3 */ + 0x00U, /* SHRTIM_FAULT_4 */ + 0x04U, /* SHRTIM_FAULT_5 */ + 0x04U /* SHRTIM_FAULT_6 */ +}; + +static const uint32_t REG_MASK_TAB_UPDATETRIG[] = +{ + 0x20000000U, /* 0: MASTER */ + 0x01FF0000U, /* 1: TIMER A */ + 0x01FF0000U, /* 2: TIMER B */ + 0x01FF0000U, /* 3: TIMER C */ + 0x01FF0000U, /* 4: TIMER D */ + 0x01FF0000U, /* 5: TIMER E */ + 0x01FF0000U, /* 5: TIMER E */ + 0x01FF0000U /* 6: TIMER F */ +}; + +static const uint8_t REG_SHIFT_TAB_UPDATETRIG[] = +{ + 12U, /* 0: MASTER */ + 0U, /* 1: TIMER A */ + 0U, /* 2: TIMER B */ + 0U, /* 3: TIMER C */ + 0U, /* 4: TIMER D */ + 0U, /* 5: TIMER E */ + 0U /* 6: TIMER F */ +}; + +static const uint8_t REG_SHIFT_TAB_EXEVx[] = +{ + 0U, /* SHRTIM_EVENT_1 */ + 6U, /* SHRTIM_EVENT_2 */ + 12U, /* SHRTIM_EVENT_3 */ + 18U, /* SHRTIM_EVENT_4 */ + 24U, /* SHRTIM_EVENT_5 */ + 0U, /* SHRTIM_EVENT_6 */ + 6U, /* SHRTIM_EVENT_7 */ + 12U, /* SHRTIM_EVENT_8 */ + 18U, /* SHRTIM_EVENT_9 */ + 24U /* SHRTIM_EVENT_10 */ +}; + +static const uint8_t REG_SHIFT_TAB_EXEVxCSEL[] = +{ + 0U, /* SHRTIM_EVENT_1 */ + 3U, /* SHRTIM_EVENT_2 */ + 6U, /* SHRTIM_EVENT_3 */ + 9U, /* SHRTIM_EVENT_4 */ + 12U, /* SHRTIM_EVENT_5 */ + 15U, /* SHRTIM_EVENT_6 */ + 18U, /* SHRTIM_EVENT_7 */ + 21U, /* SHRTIM_EVENT_8 */ + 24U, /* SHRTIM_EVENT_9 */ + 27U /* SHRTIM_EVENT_10 */ +}; + +static const uint8_t REG_SHIFT_TAB_FALTxCSEL[] = +{ + 0U, /* SHRTIM_FAULT_1 */ + 4U, /* SHRTIM_FAULT_2 */ + 8U, /* SHRTIM_FAULT_3 */ + 12U, /* SHRTIM_FAULT_4 */ + 16U, /* SHRTIM_FAULT_5 */ + 20U, /* SHRTIM_FAULT_6 */ +}; + +static const uint32_t REG_MASK_TAB_UPDATEGATING[] = +{ + SHRTIM_MCTRL_BRSTDMA, /* 0: MASTER */ + SHRTIM_TXCTRL_UPDGAT, /* 1: TIMER A */ + SHRTIM_TXCTRL_UPDGAT, /* 2: TIMER B */ + SHRTIM_TXCTRL_UPDGAT, /* 3: TIMER C */ + SHRTIM_TXCTRL_UPDGAT, /* 4: TIMER D */ + SHRTIM_TXCTRL_UPDGAT, /* 5: TIMER E */ + SHRTIM_TXCTRL_UPDGAT /* 6: TIMER F */ +}; + +static const uint8_t REG_SHIFT_TAB_UPDATEGATING[] = +{ + 2U, /* 0: MASTER */ + 0U, /* 1: TIMER A */ + 0U, /* 2: TIMER B */ + 0U, /* 3: TIMER C */ + 0U, /* 4: TIMER D */ + 0U, /* 5: TIMER E */ + 0U /* 6: TIMER F */ +}; + +static const uint8_t REG_SHIFT_TAB_TxOUT[] = +{ + 0U, /* 0: TA1 */ + 16U, /* 1: TA2 */ + 0U, /* 2: TB1 */ + 16U, /* 3: TB2 */ + 0U, /* 4: TC1 */ + 16U, /* 5: TC2 */ + 0U, /* 6: TD1 */ + 16U, /* 7: TD2 */ + 0U, /* 8: TE1 */ + 16U, /* 9: TE2 */ + 0U, /* 10: TF1 */ + 16U /* 11: TF2 */ +}; + +static const uint8_t REG_SHIFT_TAB_OxSTS[] = +{ + 0U, /* 0: TA1 */ + 1U, /* 1: TA2 */ + 0U, /* 2: TB1 */ + 1U, /* 3: TB2 */ + 0U, /* 4: TC1 */ + 1U, /* 5: TC2 */ + 0U, /* 6: TD1 */ + 1U, /* 7: TD2 */ + 0U, /* 8: TE1 */ + 1U, /* 9: TE2 */ + 0U, /* 10: TF1 */ + 1U /* 11: TF2 */ +}; + +static const uint8_t REG_SHIFT_TAB_FALTxE[] = +{ + 0U, /* SHRTIM_FAULT_1 */ + 8U, /* SHRTIM_FAULT_2 */ + 16U, /* SHRTIM_FAULT_3 */ + 24U, /* SHRTIM_FAULT_4 */ + 0U, /* SHRTIM_FAULT_5 */ + 8U /* SHRTIM_FAULT_6 */ +}; + +static const uint8_t REG_SHIFT_TAB_FALTxF[] = +{ + 0U, /* SHRTIM_FAULT_1 */ + 8U, /* SHRTIM_FAULT_2 */ + 16U, /* SHRTIM_FAULT_3 */ + 24U, /* SHRTIM_FAULT_4 */ + 32U, /* SHRTIM_FAULT_5 */ + 40U /* SHRTIM_FAULT_6 */ +}; + +static const uint8_t REG_SHIFT_TAB_FALTx[] = +{ + 0, /* SHRTIM_FAULT_1 */ + 1, /* SHRTIM_FAULT_2 */ + 2, /* SHRTIM_FAULT_3 */ + 3, /* SHRTIM_FAULT_4 */ + 4, /* SHRTIM_FAULT_5 */ + 5 /* SHRTIM_FAULT_6 */ +}; + +static const uint8_t REG_SHIFT_TAB_ILV[] = +{ + 0U, /* 0: MASTER */ + 1U, /* 1: TIMER A */ + 1U, /* 2: TIMER B */ + 1U, /* 3: TIMER C */ + 1U, /* 4: TIMER D */ + 1U, /* 5: TIMER E */ + 1U, /* 6: TIMER F */ +}; + +static const uint32_t REG_MASK_TAB_ILV[] = +{ + 0x000000E0U, /* 0: MASTER */ + 0x000001A0U, /* 1: TIMER A */ + 0x000001A0U, /* 2: TIMER B */ + 0x000001A0U, /* 3: TIMER C */ + 0x000001A0U, /* 4: TIMER D */ + 0x000001A0U, /* 5: TIMER E */ + 0x000001A0U, /* 6: TIMER F */ +}; + +static const uint8_t REG_SHIFT_TAB_CPT[] = +{ + 12U, /* 1: TIMER A */ + 16U, /* 2: TIMER B */ + 20U, /* 3: TIMER C */ + 24U, /* 4: TIMER D */ + 28U, /* 5: TIMER E */ + 32U, /* 6: TIMER F */ +}; + +static const uint32_t REG_MASK_TAB_CPT[] = +{ + 0xFFFF0000U, /* 1: TIMER A */ + 0xFFF0F000U, /* 2: TIMER B */ + 0xFF0FF000U, /* 3: TIMER C */ + 0xF0FFF000U, /* 4: TIMER D */ + 0x0FFFF000U, /* 5: TIMER E */ + 0xFFFFF000U, /* 6: TIMER F */ +}; +/*** SHRTIM structure definition end ***/ + + + +/*** SHRTIM macro definitions start ***/ +#define SHRTIM_CTRL1_UDIS_MASK ((uint32_t)(SHRTIM_CTRL1_MUPDDIS |\ + SHRTIM_CTRL1_TAUPDDIS |\ + SHRTIM_CTRL1_TBUPDDIS |\ + SHRTIM_CTRL1_TCUPDDIS |\ + SHRTIM_CTRL1_TDUPDDIS |\ + SHRTIM_CTRL1_TEUPDDIS |\ + SHRTIM_CTRL1_TFUPDDIS)) + +#define SHRTIM_CTRL2_SWUPD_MASK ((uint32_t)(SHRTIM_CTRL2_MSWUPD |\ + SHRTIM_CTRL2_TASWUPD |\ + SHRTIM_CTRL2_TBSWUPD |\ + SHRTIM_CTRL2_TCSWUPD |\ + SHRTIM_CTRL2_TDSWUPD |\ + SHRTIM_CTRL2_TESWUPD |\ + SHRTIM_CTRL2_TFSWUPD)) + +#define SHRTIM_CTRL2_SWAP_MASK ((uint32_t)(SHRTIM_CTRL2_SWAPA |\ + SHRTIM_CTRL2_SWAPB |\ + SHRTIM_CTRL2_SWAPC |\ + SHRTIM_CTRL2_SWAPD |\ + SHRTIM_CTRL2_SWAPE |\ + SHRTIM_CTRL2_SWAPF)) + +#define SHRTIM_CTRL2_SWRST_MASK ((uint32_t)(SHRTIM_CTRL2_MSWCNTRST |\ + SHRTIM_CTRL2_TASWCNTRST |\ + SHRTIM_CTRL2_TBSWCNTRST |\ + SHRTIM_CTRL2_TCSWCNTRST |\ + SHRTIM_CTRL2_TDSWCNTRST |\ + SHRTIM_CTRL2_TESWCNTRST |\ + SHRTIM_CTRL2_TFSWCNTRST)) + +#define SHRTIM_OEN_OEN_MASK ((uint32_t)(SHRTIM_OEN_TA1OEN |\ + SHRTIM_OEN_TA2OEN |\ + SHRTIM_OEN_TB1OEN |\ + SHRTIM_OEN_TB2OEN |\ + SHRTIM_OEN_TC1OEN |\ + SHRTIM_OEN_TC2OEN |\ + SHRTIM_OEN_TD1OEN |\ + SHRTIM_OEN_TD2OEN |\ + SHRTIM_OEN_TE1OEN |\ + SHRTIM_OEN_TE2OEN |\ + SHRTIM_OEN_TF1OEN |\ + SHRTIM_OEN_TF2OEN)) + +#define SHRTIM_ODIS_ODIS_MASK ((uint32_t)(SHRTIM_ODIS_TA1ODIS |\ + SHRTIM_ODIS_TA2ODIS |\ + SHRTIM_ODIS_TB1ODIS |\ + SHRTIM_ODIS_TB2ODIS |\ + SHRTIM_ODIS_TC1ODIS |\ + SHRTIM_ODIS_TC2ODIS |\ + SHRTIM_ODIS_TD1ODIS |\ + SHRTIM_ODIS_TD2ODIS |\ + SHRTIM_ODIS_TE1ODIS |\ + SHRTIM_ODIS_TE2ODIS |\ + SHRTIM_ODIS_TF1ODIS |\ + SHRTIM_ODIS_TF2ODIS)) + +#define SHRTIM_OUT_CONFIG_MASK ((uint32_t)(SHRTIM_TXOUT_POL1 |\ + SHRTIM_TXOUT_IDLES1 |\ + SHRTIM_TXOUT_FALT1 |\ + SHRTIM_TXOUT_CHP1 |\ + SHRTIM_TXOUT_DIDL1)) + +#define SHRTIM_FALT_CONFIG_MASK ((uint32_t)(SHRTIM_FALTIN1_FALT1POL |\ + SHRTIM_FALTIN1_FALT1SRC0 )) + +#define SHRTIM_FALT_SRC_1_MASK ((uint32_t)(SHRTIM_FALTIN2_FALT6SRC1 |\ + SHRTIM_FALTIN2_FALT5SRC1 |\ + SHRTIM_FALTIN2_FALT4SRC1 |\ + SHRTIM_FALTIN2_FALT3SRC1 |\ + SHRTIM_FALTIN2_FALT2SRC1 |\ + SHRTIM_FALTIN2_FALT1SRC1)) + +#define SHRTIM_BM_CONFIG_MASK ((uint32_t)( SHRTIM_BMCTRL_BMPSC |\ + SHRTIM_BMCTRL_BMCK |\ + SHRTIM_BMCTRL_BMOM)) + +#define SHRTIM_FRZDIS_CONFIG_MASK ((uint32_t)(SHRTIM_FRZDIS_TFDBGEN |\ + SHRTIM_FRZDIS_TEDBGEN |\ + SHRTIM_FRZDIS_TDDBGEN |\ + SHRTIM_FRZDIS_TCDBGEN |\ + SHRTIM_FRZDIS_TBDBGEN |\ + SHRTIM_FRZDIS_TADBGEN |\ + SHRTIM_FRZDIS_MDBGEN)) + +#define SHRTIM_SFTDP_CONFIG_MASK ((uint32_t)(SHRTIM_SFTDP_SFTDPA1 |\ + SHRTIM_SFTDP_SFTDPA2 |\ + SHRTIM_SFTDP_SFTDPB1 |\ + SHRTIM_SFTDP_SFTDPB2 |\ + SHRTIM_SFTDP_SFTDPC1 |\ + SHRTIM_SFTDP_SFTDPC2 |\ + SHRTIM_SFTDP_SFTDPD1 |\ + SHRTIM_SFTDP_SFTDPD2 |\ + SHRTIM_SFTDP_SFTDPE1 |\ + SHRTIM_SFTDP_SFTDPE2 |\ + SHRTIM_SFTDP_SFTDPF1 |\ + SHRTIM_SFTDP_SFTDPF2)) + + +/** Flags defines which can be used with SHRTIM_ReadReg function **/ +#define SHRTIM_INTERRUPT_STATUS_FALT1ITF SHRTIM_INTSTS_FALT1ITF +#define SHRTIM_INTERRUPT_STATUS_FALT2ITF SHRTIM_INTSTS_FALT2ITF +#define SHRTIM_INTERRUPT_STATUS_FALT3ITF SHRTIM_INTSTS_FALT3ITF +#define SHRTIM_INTERRUPT_STATUS_FALT4ITF SHRTIM_INTSTS_FALT4ITF +#define SHRTIM_INTERRUPT_STATUS_FALT5ITF SHRTIM_INTSTS_FALT5ITF +#define SHRTIM_INTERRUPT_STATUS_FALT6ITF SHRTIM_INTSTS_FALT6ITF +#define SHRTIM_INTERRUPT_STATUS_SYSFALTITF SHRTIM_INTSTS_SYSFALTITF +#define SHRTIM_INTERRUPT_STATUS_BMPRDITF SHRTIM_INTSTS_BMPRDITF + +#define SHRTIM_MASTER_INTERRUPT_STATUS_MCMP1ITF SHRTIM_MINTSTS_MCMP1ITF +#define SHRTIM_MASTER_INTERRUPT_STATUS_MCMP2ITF SHRTIM_MINTSTS_MCMP2ITF +#define SHRTIM_MASTER_INTERRUPT_STATUS_MCMP3ITF SHRTIM_MINTSTS_MCMP3ITF +#define SHRTIM_MASTER_INTERRUPT_STATUS_MCMP4ITF SHRTIM_MINTSTS_MCMP4ITF +#define SHRTIM_MASTER_INTERRUPT_STATUS_MREPTITF SHRTIM_MINTSTS_MREPTITF +#define SHRTIM_MASTER_INTERRUPT_STATUS_SYNCINITF SHRTIM_MINTSTS_SYNCINITF +#define SHRTIM_MASTER_INTERRUPT_STATUS_MUPDITF SHRTIM_MINTSTS_MUPDITF + +#define SHRTIM_TX_INTERRUPT_STATUS_CMP1ITF SHRTIM_TXINTSTS_CMP1ITF +#define SHRTIM_TX_INTERRUPT_STATUS_CMP2ITF SHRTIM_TXINTSTS_CMP2ITF +#define SHRTIM_TX_INTERRUPT_STATUS_CMP3ITF SHRTIM_TXINTSTS_CMP3ITF +#define SHRTIM_TX_INTERRUPT_STATUS_CMP4ITF SHRTIM_TXINTSTS_CMP4ITF +#define SHRTIM_TX_INTERRUPT_STATUS_REPTITF SHRTIM_TXINTSTS_REPTITF +#define SHRTIM_TX_INTERRUPT_STATUS_UPDITF SHRTIM_TXINTSTS_UPDITF +#define SHRTIM_TX_INTERRUPT_STATUS_CPT1ITF SHRTIM_TXINTSTS_CPT1ITF +#define SHRTIM_TX_INTERRUPT_STATUS_CPT2ITF SHRTIM_TXINTSTS_CPT2ITF +#define SHRTIM_TX_INTERRUPT_STATUS_SET1ITF SHRTIM_TXINTSTS_SET1ITF +#define SHRTIM_TX_INTERRUPT_STATUS_RST1ITF SHRTIM_TXINTSTS_RST1ITF +#define SHRTIM_TX_INTERRUPT_STATUS_SET2ITF SHRTIM_TXINTSTS_SET2ITF +#define SHRTIM_TX_INTERRUPT_STATUS_RST2ITF SHRTIM_TXINTSTS_RST2ITF +#define SHRTIM_TX_INTERRUPT_STATUS_RSTROITF SHRTIM_TXINTSTS_RSTROITF +#define SHRTIM_TX_INTERRUPT_STATUS_DPITF SHRTIM_TXINTSTS_DPITF + +/** Defines which can be used with SHRTIM_ReadReg and SHRTIM_WriteReg functions **/ +#define SHRTIM_INTERRUPT_ENABLE_FALT1IEN SHRTIM_INTEN_FALT1IEN +#define SHRTIM_INTERRUPT_ENABLE_FALT2IEN SHRTIM_INTEN_FALT2IEN +#define SHRTIM_INTERRUPT_ENABLE_FALT3IEN SHRTIM_INTEN_FALT3IEN +#define SHRTIM_INTERRUPT_ENABLE_FALT4IEN SHRTIM_INTEN_FALT4IEN +#define SHRTIM_INTERRUPT_ENABLE_FALT5IEN SHRTIM_INTEN_FALT5IEN +#define SHRTIM_INTERRUPT_ENABLE_FALT6IEN SHRTIM_INTEN_FALT6IEN +#define SHRTIM_INTERRUPT_ENABLE_SYSFALTIEN SHRTIM_INTEN_SYSFALTIEN +#define SHRTIM_INTERRUPT_ENABLE_BMPRDIEN SHRTIM_INTEN_BMPRDIEN + +#define SHRTIM_MASTER_INTERRUPT_ENABLE_MCMP1IEN SHRTIM_MIDEN_MCMP1IEN +#define SHRTIM_MASTER_INTERRUPT_ENABLE_MCMP2IEN SHRTIM_MIDEN_MCMP2IEN +#define SHRTIM_MASTER_INTERRUPT_ENABLE_MCMP3IEN SHRTIM_MIDEN_MCMP3IEN +#define SHRTIM_MASTER_INTERRUPT_ENABLE_MCMP4IEN SHRTIM_MIDEN_MCMP4IEN +#define SHRTIM_MASTER_INTERRUPT_ENABLE_MREPTIEN SHRTIM_MIDEN_MREPTIEN +#define SHRTIM_MASTER_INTERRUPT_ENABLE_SYNCINIEN SHRTIM_MIDEN_SYNCINIEN +#define SHRTIM_MASTER_INTERRUPT_ENABLE_MUPDIEN SHRTIM_MIDEN_MUPDIEN + +#define SHRTIM_TX_INTERRUPT_ENABLE_CMP1IEN SHRTIM_TXIDEN_CMP1IEN +#define SHRTIM_TX_INTERRUPT_ENABLE_CMP2IEN SHRTIM_TXIDEN_CMP2IEN +#define SHRTIM_TX_INTERRUPT_ENABLE_CMP3IEN SHRTIM_TXIDEN_CMP3IEN +#define SHRTIM_TX_INTERRUPT_ENABLE_CMP4IEN SHRTIM_TXIDEN_CMP4IEN +#define SHRTIM_TX_INTERRUPT_ENABLE_REPTIEN SHRTIM_TXIDEN_REPTIEN +#define SHRTIM_TX_INTERRUPT_ENABLE_UPDIEN SHRTIM_TXIDEN_UPDIEN +#define SHRTIM_TX_INTERRUPT_ENABLE_CPT1IEN SHRTIM_TXIDEN_CPT1IEN +#define SHRTIM_TX_INTERRUPT_ENABLE_CPT2IEN SHRTIM_TXIDEN_CPT2IEN +#define SHRTIM_TX_INTERRUPT_ENABLE_SET1IEN SHRTIM_TXIDEN_SET1IEN +#define SHRTIM_TX_INTERRUPT_ENABLE_RST1IEN SHRTIM_TXIDEN_RST1IEN +#define SHRTIM_TX_INTERRUPT_ENABLE_SET2IEN SHRTIM_TXIDEN_SET2IEN +#define SHRTIM_TX_INTERRUPT_ENABLE_RST2IEN SHRTIM_TXIDEN_RST2IEN +#define SHRTIM_TX_INTERRUPT_ENABLE_RSTRODEN SHRTIM_TXIDEN_RSTRODEN +#define SHRTIM_TX_INTERRUPT_ENABLE_DPIEN SHRTIM_TXIDEN_DPIEN + + +/** Defining the synchronization input source. **/ +#define SHRTIM_SYNCIN_SRC_NONE 0x00000000U /* SHRTIM is not synchronized and runs in standalone mode */ +#define SHRTIM_SYNCIN_SRC_INTERNAL_EVENT_0 (SHRTIM_MCTRL_SYNCIN_0) /* The SHRTIM is synchronized with the on-chip timer, from ATIM1 trgo */ +#define SHRTIM_SYNCIN_SRC_INTERNAL_EVENT_1 (SHRTIM_MCTRL_SYNCIN_1) /* The SHRTIM is synchronized with the on-chip timer from ATIM2 trgo */ +#define SHRTIM_SYNCIN_SRC_INTERNAL_EVENT_2 (SHRTIM_MCTRL_SYNCIN_1 | SHRTIM_MCTRL_SYNCIN_0) /* The SHRTIM is synchronized with the on-chip timer, from ATIM3 trgo */ +#define SHRTIM_SYNCIN_SRC_EXTERNAL_EVENT_3 (SHRTIM_MCTRL_SYNCIN_2) /* A positive pulse on SYNCIN input triggers the SHRTIM */ +#define SHRTIM_SYNCIN_SRC_INTERNAL_EVENT_4 (SHRTIM_MCTRL_SYNCIN_2 | SHRTIM_MCTRL_SYNCIN_0) /* The SHRTIM is synchronized with the on-chip timer, from shrtim_out_sync2 of another SHRTIM */ + + +/** Defining the source and event to be sent on the synchronization output. */ +#define SHRTIM_SYNCOUT_SRC_MASTER_START 0x00000000U /* A pulse is sent on SHRTIM_SCOUT output and shrtim_out_sync2 upon master timer start event */ +#define SHRTIM_SYNCOUT_SRC_MASTER_CMP1 (SHRTIM_MCTRL_SYNCOSRC_0) /* A pulse is sent on SHRTIM_SCOUT output and shrtim_out_sync2 upon master timer compare 1 event */ +#define SHRTIM_SYNCOUT_SRC_TIMA_START (SHRTIM_MCTRL_SYNCOSRC_1) /* A pulse is sent on SHRTIM_SCOUT output and shrtim_out_sync2 upon timer A start or reset events */ +#define SHRTIM_SYNCOUT_SRC_TIMA_CMP1 (SHRTIM_MCTRL_SYNCOSRC_1 | SHRTIM_MCTRL_SYNCOSRC_0) /* A pulse is sent on SHRTIM_SCOUT output and shrtim_out_sync2 upon timer A compare 1 event */ + + +/** Defining the routing and conditioning of the synchronization output event. */ +#define SHRTIM_SYNCOUT_DISABLED 0x00000000U /* Synchronization output event is disabled */ +#define SHRTIM_SYNCOUT_POSITIVE_PULSE (SHRTIM_SYNCOUT_SYNCOUTPUS_1) /* Synchronization output has a low idle level and issues a positive pulse of 16 fSHRTIM clock cycles length for the synchronization */ +#define SHRTIM_SYNCOUT_NEGATIVE_PULSE (SHRTIM_SYNCOUT_SYNCOUTPUS_1 | SHRTIM_SYNCOUT_SYNCOUTPUS_0) /* Synchronization output has a high idle level and issues a negative pulse of 16 fSHRTIM clock cycles length for the synchronization */ + + +/** Identifying a timing unit. **/ +#define SHRTIM_TIMER_NONE 0U /* Master timer identifier */ +#define SHRTIM_TIMER_MASTER SHRTIM_MCTRL_MCNTEN /* Master timer identifier */ +#define SHRTIM_TIMER_A SHRTIM_MCTRL_TACNTEN /* Timer A identifier */ +#define SHRTIM_TIMER_B SHRTIM_MCTRL_TBCNTEN /* Timer B identifier */ +#define SHRTIM_TIMER_C SHRTIM_MCTRL_TCCNTEN /* Timer C identifier */ +#define SHRTIM_TIMER_D SHRTIM_MCTRL_TDCNTEN /* Timer D identifier */ +#define SHRTIM_TIMER_E SHRTIM_MCTRL_TECNTEN /* Timer E identifier */ +#define SHRTIM_TIMER_F SHRTIM_MCTRL_TFCNTEN /* Timer F identifier */ + +#define SHRTIM_TIMER_X (SHRTIM_MCTRL_TFCNTEN | SHRTIM_MCTRL_TACNTEN |\ + SHRTIM_MCTRL_TBCNTEN | SHRTIM_MCTRL_TCCNTEN |\ + SHRTIM_MCTRL_TDCNTEN | SHRTIM_MCTRL_TECNTEN ) +#define SHRTIM_TIMER_ALL (SHRTIM_TIMER_MASTER | SHRTIM_TIMER_X) + +/** Identifying an SHRTIM output. **/ +#define SHRTIM_OUTPUT_TA1 SHRTIM_OEN_TA1OEN /* Timer A - Output 1 identifier */ +#define SHRTIM_OUTPUT_TA2 SHRTIM_OEN_TA2OEN /* Timer A - Output 2 identifier */ +#define SHRTIM_OUTPUT_TB1 SHRTIM_OEN_TB1OEN /* Timer B - Output 1 identifier */ +#define SHRTIM_OUTPUT_TB2 SHRTIM_OEN_TB2OEN /* Timer B - Output 2 identifier */ +#define SHRTIM_OUTPUT_TC1 SHRTIM_OEN_TC1OEN /* Timer C - Output 1 identifier */ +#define SHRTIM_OUTPUT_TC2 SHRTIM_OEN_TC2OEN /* Timer C - Output 2 identifier */ +#define SHRTIM_OUTPUT_TD1 SHRTIM_OEN_TD1OEN /* Timer D - Output 1 identifier */ +#define SHRTIM_OUTPUT_TD2 SHRTIM_OEN_TD2OEN /* Timer D - Output 2 identifier */ +#define SHRTIM_OUTPUT_TE1 SHRTIM_OEN_TE1OEN /* Timer E - Output 1 identifier */ +#define SHRTIM_OUTPUT_TE2 SHRTIM_OEN_TE2OEN /* Timer E - Output 2 identifier */ +#define SHRTIM_OUTPUT_TF1 SHRTIM_OEN_TF1OEN /* Timer F - Output 1 identifier */ +#define SHRTIM_OUTPUT_TF2 SHRTIM_OEN_TF2OEN /* Timer F - Output 2 identifier */ + +/** Identifying a compare unit. **/ +#define SHRTIM_COMPAREUNIT_2 SHRTIM_TXCTRL_DELCMP2M /* Compare unit 2 identifier */ +#define SHRTIM_COMPAREUNIT_4 SHRTIM_TXCTRL_DELCMP4M /* Compare unit 4 identifier */ + + +/** Identifying a capture unit. **/ +#define SHRTIM_CAPTUREUNIT_1 0 /* Capture unit 1 identifier */ +#define SHRTIM_CAPTUREUNIT_2 1 /* Capture unit 2 identifier */ + + +/** Identifying a fault channel. **/ +#define SHRTIM_FAULT_1 SHRTIM_TXFALT_FALT1EN /* Fault channel 1 identifier */ +#define SHRTIM_FAULT_2 SHRTIM_TXFALT_FALT2EN /* Fault channel 2 identifier */ +#define SHRTIM_FAULT_3 SHRTIM_TXFALT_FALT3EN /* Fault channel 3 identifier */ +#define SHRTIM_FAULT_4 SHRTIM_TXFALT_FALT4EN /* Fault channel 4 identifier */ +#define SHRTIM_FAULT_5 SHRTIM_TXFALT_FALT5EN /* Fault channel 5 identifier */ +#define SHRTIM_FAULT_6 SHRTIM_TXFALT_FALT6EN /* Fault channel 6 identifier */ + + +/** Identifying an external event channel. **/ +#define SHRTIM_EVENT_1 ((uint32_t)0x00000001U) /* External event channel 1 identifier */ +#define SHRTIM_EVENT_2 ((uint32_t)0x00000002U) /* External event channel 2 identifier */ +#define SHRTIM_EVENT_3 ((uint32_t)0x00000004U) /* External event channel 3 identifier */ +#define SHRTIM_EVENT_4 ((uint32_t)0x00000008U) /* External event channel 4 identifier */ +#define SHRTIM_EVENT_5 ((uint32_t)0x00000010U) /* External event channel 5 identifier */ +#define SHRTIM_EVENT_6 ((uint32_t)0x00000020U) /* External event channel 6 identifier */ +#define SHRTIM_EVENT_7 ((uint32_t)0x00000040U) /* External event channel 7 identifier */ +#define SHRTIM_EVENT_8 ((uint32_t)0x00000080U) /* External event channel 8 identifier */ +#define SHRTIM_EVENT_9 ((uint32_t)0x00000100U) /* External event channel 9 identifier */ +#define SHRTIM_EVENT_10 ((uint32_t)0x00000200U) /* External event channel 10 identifier */ + +#define SHRTIM_EXEV_SOURCE_1 ((uint32_t)0x00000000U) /* Eternal event source is from GPIO */ +#define SHRTIM_EXEV_SOURCE_2 ((uint32_t)0x00000001U) /* Eternal event source is from Comparator */ +#define SHRTIM_EXEV_SOURCE_3 ((uint32_t)0x00000002U) /* Eternal event source is from timer */ +#define SHRTIM_EXEV_SOURCE_4 ((uint32_t)0x00000003U) /* Eternal event source is from adc analog watch dog */ +#define SHRTIM_EXEV_SOURCE_5 ((uint32_t)0x00000004U) /* Eternal event source is from CAN */ + +/** Defining the state of an SHRTIM output. **/ +#define SHRTIM_OUTPUTSTATE_IDLE ((uint32_t)0x00000001U) /* Main operating mode, where the output can take the active or inactive level as programmed in the crossbar unit */ +#define SHRTIM_OUTPUTSTATE_RUN ((uint32_t)0x00000002U) /* Default operating state (e.g. after an SHRTIM reset, when the outputs are disabled by software or during a burst mode operation) */ +#define SHRTIM_OUTPUTSTATE_FAULT ((uint32_t)0x00000003U) /* Safety state, entered in case of a shut-down request on FAULTx inputs */ + + +/** Identifying an ADC trigger source register. **/ +#define SHRTIM_ADCTRIG1_SOURCE_GROUP1 ((uint32_t)0x00000000U) /* ADC trigger 1's source group 1 identifier */ +#define SHRTIM_ADCTRIG1_SOURCE_GROUP2 ((uint32_t)0x00000001U) /* ADC trigger 1's source group 2 identifier */ +#define SHRTIM_ADCTRIG2_SOURCE_GROUP1 ((uint32_t)0x00000002U) /* ADC trigger 2's source group 1 identifier */ +#define SHRTIM_ADCTRIG2_SOURCE_GROUP2 ((uint32_t)0x00000003U) /* ADC trigger 2's source group 2 identifier */ +#define SHRTIM_ADCTRIG3_SOURCE_GROUP1 ((uint32_t)0x00000004U) /* ADC trigger 3's source group 1 identifier */ +#define SHRTIM_ADCTRIG3_SOURCE_GROUP2 ((uint32_t)0x00000005U) /* ADC trigger 3's source group 2 identifier */ +#define SHRTIM_ADCTRIG4_SOURCE_GROUP1 ((uint32_t)0x00000006U) /* ADC trigger 4's source group 1 identifier */ +#define SHRTIM_ADCTRIG4_SOURCE_GROUP2 ((uint32_t)0x00000007U) /* ADC trigger 4's source group 2 identifier */ +#define SHRTIM_ADCTRIG5_SOURCE ((uint32_t)0x00000008U) /* ADC trigger 5 identifier */ +#define SHRTIM_ADCTRIG6_SOURCE ((uint32_t)0x00000009U) /* ADC trigger 6 identifier */ +#define SHRTIM_ADCTRIG7_SOURCE ((uint32_t)0x0000000AU) /* ADC trigger 7 identifier */ +#define SHRTIM_ADCTRIG8_SOURCE ((uint32_t)0x0000000BU) /* ADC trigger 8 identifier */ +#define SHRTIM_ADCTRIG9_SOURCE ((uint32_t)0x0000000CU) /* ADC trigger 9 identifier */ +#define SHRTIM_ADCTRIG10_SOURCE ((uint32_t)0x0000000DU) /* ADC trigger 10 identifier */ + +/** Identifying the ADC trigger's **/ +#define SHRTIM_ADCTRIG_1 ((uint32_t)0x00000000U) /* ADC trigger 1's identifier */ +#define SHRTIM_ADCTRIG_2 ((uint32_t)0x00000001U) /* ADC trigger 2's identifier */ +#define SHRTIM_ADCTRIG_3 ((uint32_t)0x00000002U) /* ADC trigger 3's identifier */ +#define SHRTIM_ADCTRIG_4 ((uint32_t)0x00000003U) /* ADC trigger 4's identifier */ +#define SHRTIM_ADCTRIG_5 ((uint32_t)0x00000004U) /* ADC trigger 5's identifier */ +#define SHRTIM_ADCTRIG_6 ((uint32_t)0x00000005U) /* ADC trigger 6's identifier */ +#define SHRTIM_ADCTRIG_7 ((uint32_t)0x00000006U) /* ADC trigger 7's identifier */ +#define SHRTIM_ADCTRIG_8 ((uint32_t)0x00000007U) /* ADC trigger 8's identifier */ +#define SHRTIM_ADCTRIG_9 ((uint32_t)0x00000008U) /* ADC trigger 9's identifier */ +#define SHRTIM_ADCTRIG_10 ((uint32_t)0x00000009U) /* ADC trigger 10's identifier */ + +/** Defining the source triggering the update of the SHRTIM_ADCxR register (transfer from preload to active register). **/ +#define SHRTIM_ADCTRIG_UPDATE_MASTER 0x00000000U /* SHRTIM_ADCxR register update is triggered by the Master timer */ +#define SHRTIM_ADCTRIG_UPDATE_TIMER_A 0x00000001U /* SHRTIM_ADCxR register update is triggered by the Timer A */ +#define SHRTIM_ADCTRIG_UPDATE_TIMER_B 0x00000002U /* SHRTIM_ADCxR register update is triggered by the Timer B */ +#define SHRTIM_ADCTRIG_UPDATE_TIMER_C 0x00000003U /* SHRTIM_ADCxR register update is triggered by the Timer C */ +#define SHRTIM_ADCTRIG_UPDATE_TIMER_D 0x00000004U /* SHRTIM_ADCxR register update is triggered by the Timer D */ +#define SHRTIM_ADCTRIG_UPDATE_TIMER_E 0x00000005U /* SHRTIM_ADCxR register update is triggered by the Timer E */ +#define SHRTIM_ADCTRIG_UPDATE_TIMER_F 0x00000006U /* SHRTIM_ADCxR register update is triggered by the Timer F */ + +/** defining the events triggering ADC conversion for ADC Triggers 1 and 3. **/ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TCPRD SHRTIM_ADTG1SRC1_ADTG1TCPRD /* ADC trigger driven by timer C period event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP5 SHRTIM_ADTG1SRC1_ADTG1TCCMP5 /* ADC trigger driven by timer C compare 5 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP4 SHRTIM_ADTG1SRC1_ADTG1TCCMP4 /* ADC trigger driven by timer C compare 4 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP3 SHRTIM_ADTG1SRC1_ADTG1TCCMP3 /* ADC trigger driven by timer C compare 3 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP2 SHRTIM_ADTG1SRC1_ADTG1TCCMP2 /* ADC trigger driven by timer C compare 2 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP1 SHRTIM_ADTG1SRC1_ADTG1TCCMP1 /* ADC trigger driven by timer C compare 1 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TBRSTRO SHRTIM_ADTG1SRC1_ADTG1TBRSTRO /* ADC trigger driven by timer B reset and roll-over events */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TBPRD SHRTIM_ADTG1SRC1_ADTG1TBPRD /* ADC trigger driven by timer B period event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP5 SHRTIM_ADTG1SRC1_ADTG1TBCMP5 /* ADC trigger driven by timer B compare 5 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP4 SHRTIM_ADTG1SRC1_ADTG1TBCMP4 /* ADC trigger driven by timer B compare 4 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP3 SHRTIM_ADTG1SRC1_ADTG1TBCMP3 /* ADC trigger driven by timer B compare 3 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP2 SHRTIM_ADTG1SRC1_ADTG1TBCMP2 /* ADC trigger driven by timer B compare 2 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP1 SHRTIM_ADTG1SRC1_ADTG1TBCMP1 /* ADC trigger driven by timer B compare 1 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TARSTRO SHRTIM_ADTG1SRC1_ADTG1TARSTRO /* ADC trigger driven by timer A reset and roll-over events */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TAPRD SHRTIM_ADTG1SRC1_ADTG1TAPRD /* ADC trigger driven by timer A period event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TACMP5 SHRTIM_ADTG1SRC1_ADTG1TACMP5 /* ADC trigger driven by timer A compare 5 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TACMP4 SHRTIM_ADTG1SRC1_ADTG1TACMP4 /* ADC trigger driven by timer A compare 4 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TACMP3 SHRTIM_ADTG1SRC1_ADTG1TACMP3 /* ADC trigger driven by timer A compare 3 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TACMP2 SHRTIM_ADTG1SRC1_ADTG1TACMP2 /* ADC trigger driven by timer A compare 2 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_TACMP1 SHRTIM_ADTG1SRC1_ADTG1TACMP1 /* ADC trigger driven by timer A compare 1 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_MPRD SHRTIM_ADTG1SRC1_ADTG1MPRD /* ADC trigger driven by master period event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_MCMP4 SHRTIM_ADTG1SRC1_ADTG1MCMP4 /* ADC trigger driven by master compare 4 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_MCMP3 SHRTIM_ADTG1SRC1_ADTG1MCMP3 /* ADC trigger driven by master compare 3 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_MCMP2 SHRTIM_ADTG1SRC1_ADTG1MCMP2 /* ADC trigger driven by master compare 2 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP1_MCMP1 SHRTIM_ADTG1SRC1_ADTG1MCMP1 /* ADC trigger driven by master compare 1 event */ + +#define SHRTIM_ADTG13_SOURCE_GROUP2_EXEV5 SHRTIM_ADTG1SRC2_ADTG1EXEV5 /* ADC trigger driven by external event 5 */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_EXEV4 SHRTIM_ADTG1SRC2_ADTG1EXEV4 /* ADC trigger driven by external event 4 */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_EXEV3 SHRTIM_ADTG1SRC2_ADTG1EXEV3 /* ADC trigger driven by external event 3 */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_EXEV2 SHRTIM_ADTG1SRC2_ADTG1EXEV2 /* ADC trigger driven by external event 2 */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_EXEV1 SHRTIM_ADTG1SRC2_ADTG1EXEV1 /* ADC trigger driven by external event 1 */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TFRSTRO SHRTIM_ADTG1SRC2_ADTG1TFRSTRO /* ADC trigger driven by timer F reset and roll-over events */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TFPRD SHRTIM_ADTG1SRC2_ADTG1TFPRD /* ADC trigger driven by timer F period event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP5 SHRTIM_ADTG1SRC2_ADTG1TFCMP5 /* ADC trigger driven by timer F compare 5 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP4 SHRTIM_ADTG1SRC2_ADTG1TFCMP4 /* ADC trigger driven by timer F compare 4 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP3 SHRTIM_ADTG1SRC2_ADTG1TFCMP3 /* ADC trigger driven by timer F compare 3 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP2 SHRTIM_ADTG1SRC2_ADTG1TFCMP2 /* ADC trigger driven by timer F compare 2 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP1 SHRTIM_ADTG1SRC2_ADTG1TFCMP1 /* ADC trigger driven by timer F compare 1 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TEPRD SHRTIM_ADTG1SRC2_ADTG1TEPRD /* ADC trigger driven by timer E period event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TECMP5 SHRTIM_ADTG1SRC2_ADTG1TECMP5 /* ADC trigger driven by timer E compare 5 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TECMP4 SHRTIM_ADTG1SRC2_ADTG1TECMP4 /* ADC trigger driven by timer E compare 4 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TECMP3 SHRTIM_ADTG1SRC2_ADTG1TECMP3 /* ADC trigger driven by timer E compare 3 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TECMP2 SHRTIM_ADTG1SRC2_ADTG1TECMP2 /* ADC trigger driven by timer E compare 2 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TECMP1 SHRTIM_ADTG1SRC2_ADTG1TECMP1 /* ADC trigger driven by timer E compare 1 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TDPRD SHRTIM_ADTG1SRC2_ADTG1TDPRD /* ADC trigger driven by timer D period event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP5 SHRTIM_ADTG1SRC2_ADTG1TDCMP5 /* ADC trigger driven by timer D compare 5 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP4 SHRTIM_ADTG1SRC2_ADTG1TDCMP4 /* ADC trigger driven by timer D compare 4 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP3 SHRTIM_ADTG1SRC2_ADTG1TDCMP3 /* ADC trigger driven by timer D compare 3 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP2 SHRTIM_ADTG1SRC2_ADTG1TDCMP2 /* ADC trigger driven by timer D compare 2 event */ +#define SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP1 SHRTIM_ADTG1SRC2_ADTG1TDCMP1 /* ADC trigger driven by timer D compare 1 event */ + +/** defining the events triggering ADC conversion for ADC Triggers 2 and 4. **/ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TCRSTRO SHRTIM_ADTG2SRC1_ADTG2TCRSTRO /* ADC trigger driven by timer C reset and roll-over events */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TCPRD SHRTIM_ADTG2SRC1_ADTG2TCPRD /* ADC trigger driven by timer C period event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP5 SHRTIM_ADTG2SRC1_ADTG2TCCMP5 /* ADC trigger driven by timer C compare 5 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP4 SHRTIM_ADTG2SRC1_ADTG2TCCMP4 /* ADC trigger driven by timer C compare 4 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP3 SHRTIM_ADTG2SRC1_ADTG2TCCMP3 /* ADC trigger driven by timer C compare 3 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP2 SHRTIM_ADTG2SRC1_ADTG2TCCMP2 /* ADC trigger driven by timer C compare 2 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP1 SHRTIM_ADTG2SRC1_ADTG2TCCMP1 /* ADC trigger driven by timer C compare 1 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TBPRD SHRTIM_ADTG2SRC1_ADTG2TBPRD /* ADC trigger driven by timer B period event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP5 SHRTIM_ADTG2SRC1_ADTG2TBCMP5 /* ADC trigger driven by timer B compare 5 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP4 SHRTIM_ADTG2SRC1_ADTG2TBCMP4 /* ADC trigger driven by timer B compare 4 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP3 SHRTIM_ADTG2SRC1_ADTG2TBCMP3 /* ADC trigger driven by timer B compare 3 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP2 SHRTIM_ADTG2SRC1_ADTG2TBCMP2 /* ADC trigger driven by timer B compare 2 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP1 SHRTIM_ADTG2SRC1_ADTG2TBCMP1 /* ADC trigger driven by timer B compare 1 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TAPRD SHRTIM_ADTG2SRC1_ADTG2TAPRD /* ADC trigger driven by timer A period event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TACMP5 SHRTIM_ADTG2SRC1_ADTG2TACMP5 /* ADC trigger driven by timer A compare 5 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TACMP4 SHRTIM_ADTG2SRC1_ADTG2TACMP4 /* ADC trigger driven by timer A compare 4 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TACMP3 SHRTIM_ADTG2SRC1_ADTG2TACMP3 /* ADC trigger driven by timer A compare 3 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TACMP2 SHRTIM_ADTG2SRC1_ADTG2TACMP2 /* ADC trigger driven by timer A compare 2 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_TACMP1 SHRTIM_ADTG2SRC1_ADTG2TACMP1 /* ADC trigger driven by timer A compare 1 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_MPRD SHRTIM_ADTG2SRC1_ADTG2MPRD /* ADC trigger driven by master period event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_MCMP4 SHRTIM_ADTG2SRC1_ADTG2MCMP4 /* ADC trigger driven by master compare 4 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_MCMP3 SHRTIM_ADTG2SRC1_ADTG2MCMP3 /* ADC trigger driven by master compare 3 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_MCMP2 SHRTIM_ADTG2SRC1_ADTG2MCMP2 /* ADC trigger driven by master compare 2 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP1_MCMP1 SHRTIM_ADTG2SRC1_ADTG2MCMP1 /* ADC trigger driven by master compare 1 event */ + +#define SHRTIM_ADTG24_SOURCE_GROUP2_EXEV10 SHRTIM_ADTG2SRC2_ADTG2EXEV10 /* ADC trigger driven by external event 10 */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_EXEV9 SHRTIM_ADTG2SRC2_ADTG2EXEV9 /* ADC trigger driven by external event 9 */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_EXEV8 SHRTIM_ADTG2SRC2_ADTG2EXEV8 /* ADC trigger driven by external event 8 */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_EXEV7 SHRTIM_ADTG2SRC2_ADTG2EXEV7 /* ADC trigger driven by external event 7 */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_EXEV6 SHRTIM_ADTG2SRC2_ADTG2EXEV6 /* ADC trigger driven by external event 6 */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TFPRD SHRTIM_ADTG2SRC2_ADTG2TFPRD /* ADC trigger driven by timer F period event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP5 SHRTIM_ADTG2SRC2_ADTG2TFCMP5 /* ADC trigger driven by timer F compare 5 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP4 SHRTIM_ADTG2SRC2_ADTG2TFCMP4 /* ADC trigger driven by timer F compare 4 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP3 SHRTIM_ADTG2SRC2_ADTG2TFCMP3 /* ADC trigger driven by timer F compare 3 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP2 SHRTIM_ADTG2SRC2_ADTG2TFCMP2 /* ADC trigger driven by timer F compare 2 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP1 SHRTIM_ADTG2SRC2_ADTG2TFCMP1 /* ADC trigger driven by timer F compare 1 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TERSTRO SHRTIM_ADTG2SRC2_ADTG2TERSTRO /* ADC trigger driven by timer E reset and roll-over events */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TECMP5 SHRTIM_ADTG2SRC2_ADTG2TECMP5 /* ADC trigger driven by timer E compare 5 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TECMP4 SHRTIM_ADTG2SRC2_ADTG2TECMP4 /* ADC trigger driven by timer E compare 4 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TECMP3 SHRTIM_ADTG2SRC2_ADTG2TECMP3 /* ADC trigger driven by timer E compare 3 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TECMP2 SHRTIM_ADTG2SRC2_ADTG2TECMP2 /* ADC trigger driven by timer E compare 2 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TECMP1 SHRTIM_ADTG2SRC2_ADTG2TECMP1 /* ADC trigger driven by timer E compare 1 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TDRSTRO SHRTIM_ADTG2SRC2_ADTG2TDRSTRO /* ADC trigger driven by timer D reset and roll-over events */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TDPRD SHRTIM_ADTG2SRC2_ADTG2TDPRD /* ADC trigger driven by timer D period event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP5 SHRTIM_ADTG2SRC2_ADTG2TDCMP5 /* ADC trigger driven by timer D compare 5 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP4 SHRTIM_ADTG2SRC2_ADTG2TDCMP4 /* ADC trigger driven by timer D compare 4 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP3 SHRTIM_ADTG2SRC2_ADTG2TDCMP3 /* ADC trigger driven by timer D compare 3 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP2 SHRTIM_ADTG2SRC2_ADTG2TDCMP2 /* ADC trigger driven by timer D compare 2 event */ +#define SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP1 SHRTIM_ADTG2SRC2_ADTG2TDCMP1 /* ADC trigger driven by timer D compare 1 event */ + +/** defining the selection that can be used as ADC trigger source for extended ADC 5, 7 ,9 **/ +#define SHRTIM_ADTG579_MCMP1 (uint32_t)0x00 /* Trigger on master compare 1 */ +#define SHRTIM_ADTG579_MCMP2 (uint32_t)0x01 /* Trigger on master compare 2 */ +#define SHRTIM_ADTG579_MCMP3 (uint32_t)0x02 /* Trigger on master compare 3 */ +#define SHRTIM_ADTG579_MCMP4 (uint32_t)0x03 /* Trigger on master compare 4 */ +#define SHRTIM_ADTG579_MPRD (uint32_t)0x04 /* Trigger on master period */ +#define SHRTIM_ADTG579_EXEV1 (uint32_t)0x05 /* Trigger on external event 1 */ +#define SHRTIM_ADTG579_EXEV2 (uint32_t)0x06 /* Trigger on external event 2 */ +#define SHRTIM_ADTG579_EXEV3 (uint32_t)0x07 /* Trigger on external event 3 */ +#define SHRTIM_ADTG579_EXEV4 (uint32_t)0x08 /* Trigger on external event 4 */ +#define SHRTIM_ADTG579_EXEV5 (uint32_t)0x09 /* Trigger on external event 5 */ +#define SHRTIM_ADTG579_TACMP1 (uint32_t)0x0A /* Trigger on timer A compare 1 */ +#define SHRTIM_ADTG579_TACMP2 (uint32_t)0x0B /* Trigger on timer A compare 2 */ +#define SHRTIM_ADTG579_TACMP3 (uint32_t)0x0C /* Trigger on timer A compare 3 */ +#define SHRTIM_ADTG579_TACMP4 (uint32_t)0x0D /* Trigger on timer A compare 4 */ +#define SHRTIM_ADTG579_TACMP5 (uint32_t)0x0E /* Trigger on timer A compare 5 */ +#define SHRTIM_ADTG579_TAPRD (uint32_t)0x0F /* Trigger on timer A period */ +#define SHRTIM_ADTG579_TARSTRO (uint32_t)0x10 /* Trigger on timer A reset and counter roll-over */ +#define SHRTIM_ADTG579_TBCMP1 (uint32_t)0x11 /* Trigger on timer B compare 1 */ +#define SHRTIM_ADTG579_TBCMP2 (uint32_t)0x12 /* Trigger on timer B compare 2 */ +#define SHRTIM_ADTG579_TBCMP3 (uint32_t)0x13 /* Trigger on timer B compare 3 */ +#define SHRTIM_ADTG579_TBCMP4 (uint32_t)0x14 /* Trigger on timer B compare 4 */ +#define SHRTIM_ADTG579_TBCMP5 (uint32_t)0x15 /* Trigger on timer B compare 5 */ +#define SHRTIM_ADTG579_TBPRD (uint32_t)0x16 /* Trigger on timer B period */ +#define SHRTIM_ADTG579_TBRSTRO (uint32_t)0x17 /* Trigger on timer B reset and counter roll-over */ +#define SHRTIM_ADTG579_TCCMP1 (uint32_t)0x18 /* Trigger on timer C compare 1 */ +#define SHRTIM_ADTG579_TCCMP2 (uint32_t)0x19 /* Trigger on timer C compare 2 */ +#define SHRTIM_ADTG579_TCCMP3 (uint32_t)0x1A /* Trigger on timer C compare 3 */ +#define SHRTIM_ADTG579_TCCMP4 (uint32_t)0x1B /* Trigger on timer C compare 4 */ +#define SHRTIM_ADTG579_TCCMP5 (uint32_t)0x1C /* Trigger on timer C compare 5 */ +#define SHRTIM_ADTG579_TCPRD (uint32_t)0x1D /* Trigger on timer C period */ +#define SHRTIM_ADTG579_TDCMP1 (uint32_t)0x1E /* Trigger on timer D compare 1 */ +#define SHRTIM_ADTG579_TDCMP2 (uint32_t)0x1F /* Trigger on timer D compare 2 */ +#define SHRTIM_ADTG579_TDCMP3 (uint32_t)0x20 /* Trigger on timer D compare 3 */ +#define SHRTIM_ADTG579_TDCMP4 (uint32_t)0x21 /* Trigger on timer D compare 4 */ +#define SHRTIM_ADTG579_TDCMP5 (uint32_t)0x22 /* Trigger on timer D compare 5 */ +#define SHRTIM_ADTG579_TDPRD (uint32_t)0x23 /* Trigger on timer D period */ +#define SHRTIM_ADTG579_TECMP1 (uint32_t)0x24 /* Trigger on timer E compare 1 */ +#define SHRTIM_ADTG579_TECMP2 (uint32_t)0x25 /* Trigger on timer E compare 2 */ +#define SHRTIM_ADTG579_TECMP3 (uint32_t)0x26 /* Trigger on timer E compare 3 */ +#define SHRTIM_ADTG579_TECMP4 (uint32_t)0x27 /* Trigger on timer E compare 4 */ +#define SHRTIM_ADTG579_TECMP5 (uint32_t)0x28 /* Trigger on timer E compare 5 */ +#define SHRTIM_ADTG579_TEPRD (uint32_t)0x29 /* Trigger on timer E period */ +#define SHRTIM_ADTG579_TFCMP1 (uint32_t)0x2A /* Trigger on timer F compare 1 */ +#define SHRTIM_ADTG579_TFCMP2 (uint32_t)0x2B /* Trigger on timer F compare 2 */ +#define SHRTIM_ADTG579_TFCMP3 (uint32_t)0x2C /* Trigger on timer F compare 3 */ +#define SHRTIM_ADTG579_TFCMP4 (uint32_t)0x2D /* Trigger on timer F compare 4 */ +#define SHRTIM_ADTG579_TFCMP5 (uint32_t)0x2E /* Trigger on timer F compare 5 */ +#define SHRTIM_ADTG579_TFPRD (uint32_t)0x2F /* Trigger on timer F period */ +#define SHRTIM_ADTG579_TFRSTRO (uint32_t)0x30 /* Trigger on timer F reset and counter roll-over */ + +/** defining the selection that can be used as ADC trigger source for extended ADC 6, 8 ,10 **/ +#define SHRTIM_ADTG6810_MCMP1 (uint32_t)0x00 /* ADC extended trigger on master compare 1 */ +#define SHRTIM_ADTG6810_MCMP2 (uint32_t)0x01 /* ADC extended trigger on master compare 2 */ +#define SHRTIM_ADTG6810_MCMP3 (uint32_t)0x02 /* ADC extended trigger on master compare 3 */ +#define SHRTIM_ADTG6810_MCMP4 (uint32_t)0x03 /* ADC extended trigger on master compare 4 */ +#define SHRTIM_ADTG6810_MPRD (uint32_t)0x04 /* ADC extended trigger on master period */ +#define SHRTIM_ADTG6810_EXEV6 (uint32_t)0x05 /* ADC extended trigger on external event 6 */ +#define SHRTIM_ADTG6810_EXEV7 (uint32_t)0x06 /* ADC extended trigger on external event 7 */ +#define SHRTIM_ADTG6810_EXEV8 (uint32_t)0x07 /* ADC extended trigger on external event 8 */ +#define SHRTIM_ADTG6810_EXEV9 (uint32_t)0x08 /* ADC extended trigger on external event 9 */ +#define SHRTIM_ADTG6810_EXEV10 (uint32_t)0x09 /* ADC extended trigger on external event 10 */ +#define SHRTIM_ADTG6810_TACMP1 (uint32_t)0x0A /* ADC extended trigger on timer A compare 1 */ +#define SHRTIM_ADTG6810_TACMP2 (uint32_t)0x0B /* ADC extended trigger on timer A compare 2 */ +#define SHRTIM_ADTG6810_TACMP3 (uint32_t)0x0C /* ADC extended trigger on timer A compare 3 */ +#define SHRTIM_ADTG6810_TACMP4 (uint32_t)0x0D /* ADC extended trigger on timer A compare 4 */ +#define SHRTIM_ADTG6810_TACMP5 (uint32_t)0x0E /* ADC extended trigger on timer A compare 5 */ +#define SHRTIM_ADTG6810_TAPRD (uint32_t)0x0F /* ADC extended trigger on timer A period */ +#define SHRTIM_ADTG6810_TBCMP1 (uint32_t)0x10 /* ADC extended trigger on timer B compare 1 */ +#define SHRTIM_ADTG6810_TBCMP2 (uint32_t)0x11 /* ADC extended trigger on timer B compare 2 */ +#define SHRTIM_ADTG6810_TBCMP3 (uint32_t)0x12 /* ADC extended trigger on timer B compare 3 */ +#define SHRTIM_ADTG6810_TBCMP4 (uint32_t)0x13 /* ADC extended trigger on timer B compare 4 */ +#define SHRTIM_ADTG6810_TBCMP5 (uint32_t)0x14 /* ADC extended trigger on timer B compare 5 */ +#define SHRTIM_ADTG6810_TBPRD (uint32_t)0x15 /* ADC extended trigger on timer B period */ +#define SHRTIM_ADTG6810_TCCMP1 (uint32_t)0x16 /* ADC extended trigger on timer C compare 1 */ +#define SHRTIM_ADTG6810_TCCMP2 (uint32_t)0x17 /* ADC extended trigger on timer C compare 2 */ +#define SHRTIM_ADTG6810_TCCMP3 (uint32_t)0x18 /* ADC extended trigger on timer C compare 3 */ +#define SHRTIM_ADTG6810_TCCMP4 (uint32_t)0x19 /* ADC extended trigger on timer C compare 4 */ +#define SHRTIM_ADTG6810_TCCMP5 (uint32_t)0x1A /* ADC extended trigger on timer C compare 5 */ +#define SHRTIM_ADTG6810_TCPRD (uint32_t)0x1B /* ADC extended trigger on timer C period */ +#define SHRTIM_ADTG6810_TCRSTRO (uint32_t)0x1C /* ADC extended trigger on timer C reset and counter roll-over */ +#define SHRTIM_ADTG6810_TDCMP1 (uint32_t)0x1D /* ADC extended trigger on timer D compare 1 */ +#define SHRTIM_ADTG6810_TDCMP2 (uint32_t)0x1E /* ADC extended trigger on timer D compare 2 */ +#define SHRTIM_ADTG6810_TDCMP3 (uint32_t)0x1F /* ADC extended trigger on timer D compare 3 */ +#define SHRTIM_ADTG6810_TDCMP4 (uint32_t)0x20 /* ADC extended trigger on timer D compare 4 */ +#define SHRTIM_ADTG6810_TDCMP5 (uint32_t)0x21 /* ADC extended trigger on timer D compare 5 */ +#define SHRTIM_ADTG6810_TDPRD (uint32_t)0x22 /* ADC extended trigger on timer D period */ +#define SHRTIM_ADTG6810_TDRSTRO (uint32_t)0x23 /* ADC extended trigger on timer D reset and counter roll-over */ +#define SHRTIM_ADTG6810_TECMP1 (uint32_t)0x24 /* ADC extended trigger on timer E compare 1 */ +#define SHRTIM_ADTG6810_TECMP2 (uint32_t)0x25 /* ADC extended trigger on timer E compare 2 */ +#define SHRTIM_ADTG6810_TECMP3 (uint32_t)0x26 /* ADC extended trigger on timer E compare 3 */ +#define SHRTIM_ADTG6810_TECMP4 (uint32_t)0x27 /* ADC extended trigger on timer E compare 4 */ +#define SHRTIM_ADTG6810_TECMP5 (uint32_t)0x28 /* ADC extended trigger on timer E compare 5 */ +#define SHRTIM_ADTG6810_TERSTRO (uint32_t)0x29 /* ADC extended trigger on timer E reset and counter roll-over */ +#define SHRTIM_ADTG6810_TFCMP1 (uint32_t)0x2A /* ADC extended trigger on timer F compare 1 */ +#define SHRTIM_ADTG6810_TFCMP2 (uint32_t)0x2B /* ADC extended trigger on timer F compare 2 */ +#define SHRTIM_ADTG6810_TFCMP3 (uint32_t)0x2C /* ADC extended trigger on timer F compare 3 */ +#define SHRTIM_ADTG6810_TFCMP4 (uint32_t)0x2D /* ADC extended trigger on timer F compare 4 */ +#define SHRTIM_ADTG6810_TFCMP5 (uint32_t)0x2E /* ADC extended trigger on timer F compare 5 */ +#define SHRTIM_ADTG6810_TFPRD (uint32_t)0x2F /* ADC extended trigger on timer F period */ + +/** Defining timer high-resolution clock prescaler ratio. **/ +#define SHRTIM_PRESCALERRATIO_MUL32 0x00000000U /* fHRCK: fSHRTIM x 32 = 8 GHz - Resolution: 125 ps - Min PWM frequency: 122.1 kHz (fSHRTIM=250MHz) */ +#define SHRTIM_PRESCALERRATIO_MUL16 ((uint32_t)0x00000001U) /* fHRCK: fSHRTIM x 16 = 4 GHz - Resolution: 250 ps - Min PWM frequency: 61.0 KHz (fSHRTIM=250MHz) */ +#define SHRTIM_PRESCALERRATIO_MUL8 ((uint32_t)0x00000002U) /* fHRCK: fSHRTIM x 8 = 2 GHz - Resolution: 500 ps - Min PWM frequency: 30.5 kHz (fSHRTIM=250MHz) */ +#define SHRTIM_PRESCALERRATIO_MUL4 ((uint32_t)0x00000003U) /* fHRCK: fSHRTIM x 4 = 1 GHz - Resolution: 1 ns - Min PWM frequency: 15.3 kHz (fSHRTIM=250MHz) */ +#define SHRTIM_PRESCALERRATIO_MUL2 ((uint32_t)0x00000004U) /* fHRCK: fSHRTIM x 2 = 500 MHz - Resolution: 2 ns - Min PWM frequency: 7.63 kHz (fSHRTIM=250MHz) */ +#define SHRTIM_PRESCALERRATIO_DIV1 ((uint32_t)0x00000005U) /* fHRCK: fSHRTIM = 250 MHz - Resolution: 4 ns - Min PWM frequency: 3.81 kHz (fSHRTIM=250MHz) */ +#define SHRTIM_PRESCALERRATIO_DIV2 ((uint32_t)0x00000006U) /* fHRCK: fSHRTIM / 2 = 125 MHz - Resolution: 8 ns- Min PWM frequency: 1.91 kHz (fSHRTIM=250MHz) */ +#define SHRTIM_PRESCALERRATIO_DIV4 ((uint32_t)0x00000007U) /* fHRCK: fSHRTIM / 4 = 62.5 MHz - Resolution: 16 ns- Min PWM frequency: 0.95 Hz (fSHRTIM=250MHz) */ + +/** Defining timer counter operating mode. **/ +#define SHRTIM_MODE_CONTINUOUS ((uint32_t)0x00000008U) /* The timer operates in continuous (free-running) mode */ +#define SHRTIM_MODE_SINGLESHOT 0x00000000U /* The timer operates in non retriggerable single-shot mode */ +#define SHRTIM_MODE_RETRIGGERABLE ((uint32_t)0x00000010U) /* The timer operates in retriggerable single-shot mode */ + + +/** Defining on which output the DAC synchronization event is sent. **/ +#define SHRTIM_DACTRIG_NONE 0x00000000U /* No DAC synchronization event generated */ +#define SHRTIM_DACTRIG_DACTRIGOUT_1 (SHRTIM_MCTRL_DACTRIG_0) /* DAC synchronization event generated on DACTrigOut1 output upon timer update */ +#define SHRTIM_DACTRIG_DACTRIGOUT_2 (SHRTIM_MCTRL_DACTRIG_1) /* DAC synchronization event generated on DACTrigOut2 output upon timer update */ +#define SHRTIM_DACTRIG_DACTRIGOUT_3 (SHRTIM_MCTRL_DACTRIG_1 | SHRTIM_MCTRL_DACTRIG_0) /* DAC synchronization event generated on DACTrigOut3 output upon timer update */ + + +/** Defining whether the registers update is done synchronously with any other timer or master update. **/ +#define SHRTIM_UPDATETRIG_NONE 0x00000000U /* Register update is disabled */ +#define SHRTIM_UPDATETRIG_MASTER SHRTIM_TXCTRL_MUEN /* Register update is triggered by the master timer update */ +#define SHRTIM_UPDATETRIG_TIMER_A SHRTIM_TXCTRL_TAUEN /* Register update is triggered by the timer A update */ +#define SHRTIM_UPDATETRIG_TIMER_B SHRTIM_TXCTRL_TBUEN /* Register update is triggered by the timer B update */ +#define SHRTIM_UPDATETRIG_TIMER_C SHRTIM_TXCTRL_TCUEN /* Register update is triggered by the timer C update*/ +#define SHRTIM_UPDATETRIG_TIMER_D SHRTIM_TXCTRL_TDUEN /* Register update is triggered by the timer D update */ +#define SHRTIM_UPDATETRIG_TIMER_E SHRTIM_TXCTRL_TEUEN /* Register update is triggered by the timer E update */ +#define SHRTIM_UPDATETRIG_TIMER_F SHRTIM_TXCTRL_TFUEN /* Register update is triggered by the timer F update */ +#define SHRTIM_UPDATETRIG_REPETITION SHRTIM_TXCTRL_REPTUEN /* Register update is triggered when the counter rolls over and SHRTIM_TxREPT = 0*/ +#define SHRTIM_UPDATETRIG_RESET SHRTIM_TXCTRL_RSTROUEN /* Register update is triggered by counter reset or roll-over to 0 after reaching the period value in continuous mode */ + +/** Defining how the update occurs relatively to the burst DMA transaction and the + external update request on update enable inputs 1 to 3. **/ +#define SHRTIM_UPDATEGATING_INDEPENDENT 0x00000000U /* Update done independently from the DMA burst transfer completion */ +#define SHRTIM_UPDATEGATING_DMABURST (SHRTIM_TXCTRL_UPDGAT_0) /* Update done when the DMA burst transfer is completed */ +#define SHRTIM_UPDATEGATING_DMABURST_UPDATE (SHRTIM_TXCTRL_UPDGAT_1) /* Update done on timer roll-over following a DMA burst transfer completion*/ +#define SHRTIM_UPDATEGATING_UPDEN1 (SHRTIM_TXCTRL_UPDGAT_1 | SHRTIM_TXCTRL_UPDGAT_0) /* Slave timer only - Update done on a rising edge of SHRTIM update enable input 1 */ +#define SHRTIM_UPDATEGATING_UPDEN2 (SHRTIM_TXCTRL_UPDGAT_2) /* Slave timer only - Update done on a rising edge of SHRTIM update enable input 2 */ +#define SHRTIM_UPDATEGATING_UPDEN3 (SHRTIM_TXCTRL_UPDGAT_2 | SHRTIM_TXCTRL_UPDGAT_0) /* Slave timer only - Update done on a rising edge of SHRTIM update enable input 3 */ +#define SHRTIM_UPDATEGATING_UPDEN1_UPDATE (SHRTIM_TXCTRL_UPDGAT_2 | SHRTIM_TXCTRL_UPDGAT_1) /* Slave timer only - Update done on the update event following a rising edge of SHRTIM update enable input 1 */ +#define SHRTIM_UPDATEGATING_UPDEN2_UPDATE (SHRTIM_TXCTRL_UPDGAT_2 | SHRTIM_TXCTRL_UPDGAT_1 | SHRTIM_TXCTRL_UPDGAT_0) /* Slave timer only - Update done on the update event following a rising edge of SHRTIM update enable input 2 */ +#define SHRTIM_UPDATEGATING_UPDEN3_UPDATE (SHRTIM_TXCTRL_UPDGAT_3) /* Slave timer only - Update done on the update event following a rising edge of SHRTIM update enable input 3 */ + + +/** Defining whether the compare register is behaving in regular mode + (compare match issued as soon as counter equal compare) or in auto-delayed mode. **/ +#define SHRTIM_COMPAREMODE_REGULAR 0x00000000U /* standard compare mode */ +#define SHRTIM_COMPAREMODE_DELAY_NOTIMEOUT (SHRTIM_TXCTRL_DELCMP2M_0) /* Compare event generated only if a capture has occurred */ +#define SHRTIM_COMPAREMODE_DELAY_CMP1 (SHRTIM_TXCTRL_DELCMP2M_1) /* Compare event generated if a capture has occurred or after a Compare 1 match (timeout if capture event is missing) */ +#define SHRTIM_COMPAREMODE_DELAY_CMP3 (SHRTIM_TXCTRL_DELCMP2M_1 | SHRTIM_TXCTRL_DELCMP2M_0) /* Compare event generated if a capture has occurred or after a Compare 3 match (timeout if capture event is missing) */ + +/** Defining the events that can be selected to trigger the reset of the timer counter. **/ +#define SHRTIM_RESETTRIG_NONE 0x00000000U /* No counter reset trigger */ +#define SHRTIM_RESETTRIG_UPDATE SHRTIM_TACNTRST_UPD /* The timer counter is reset upon update event */ +#define SHRTIM_RESETTRIG_CMP2 SHRTIM_TACNTRST_CMP2 /* The timer counter is reset upon Timer Compare 2 event */ +#define SHRTIM_RESETTRIG_CMP4 SHRTIM_TACNTRST_CMP4 /* The timer counter is reset upon Timer Compare 4 event */ +#define SHRTIM_RESETTRIG_MASTER_PER SHRTIM_TACNTRST_MPRD /* The timer counter is reset upon master timer period event */ +#define SHRTIM_RESETTRIG_MASTER_CMP1 SHRTIM_TACNTRST_MCMP1 /* The timer counter is reset upon master timer Compare 1 event */ +#define SHRTIM_RESETTRIG_MASTER_CMP2 SHRTIM_TACNTRST_MCMP2 /* The timer counter is reset upon master timer Compare 2 event */ +#define SHRTIM_RESETTRIG_MASTER_CMP3 SHRTIM_TACNTRST_MCMP3 /* The timer counter is reset upon master timer Compare 3 event */ +#define SHRTIM_RESETTRIG_MASTER_CMP4 SHRTIM_TACNTRST_MCMP4 /* The timer counter is reset upon master timer Compare 4 event */ +#define SHRTIM_RESETTRIG_EXEV_1 SHRTIM_TACNTRST_EXEV1 /* The timer counter is reset upon external event 1 */ +#define SHRTIM_RESETTRIG_EXEV_2 SHRTIM_TACNTRST_EXEV2 /* The timer counter is reset upon external event 2 */ +#define SHRTIM_RESETTRIG_EXEV_3 SHRTIM_TACNTRST_EXEV3 /* The timer counter is reset upon external event 3 */ +#define SHRTIM_RESETTRIG_EXEV_4 SHRTIM_TACNTRST_EXEV4 /* The timer counter is reset upon external event 4 */ +#define SHRTIM_RESETTRIG_EXEV_5 SHRTIM_TACNTRST_EXEV5 /* The timer counter is reset upon external event 5 */ +#define SHRTIM_RESETTRIG_EXEV_6 SHRTIM_TACNTRST_EXEV6 /* The timer counter is reset upon external event 6 */ +#define SHRTIM_RESETTRIG_EXEV_7 SHRTIM_TACNTRST_EXEV7 /* The timer counter is reset upon external event 7 */ +#define SHRTIM_RESETTRIG_EXEV_8 SHRTIM_TACNTRST_EXEV8 /* The timer counter is reset upon external event 8 */ +#define SHRTIM_RESETTRIG_EXEV_9 SHRTIM_TACNTRST_EXEV9 /* The timer counter is reset upon external event 9 */ +#define SHRTIM_RESETTRIG_EXEV_10 SHRTIM_TACNTRST_EXEV10 /* The timer counter is reset upon external event 10 */ +#define SHRTIM_RESETTRIG_OTHER1_CMP1 SHRTIM_TACNTRST_TBCMP1 /* The timer counter is reset upon other timer Compare 1 event */ +#define SHRTIM_RESETTRIG_OTHER1_CMP2 SHRTIM_TACNTRST_TBCMP2 /* The timer counter is reset upon other timer Compare 2 event */ +#define SHRTIM_RESETTRIG_OTHER1_CMP4 SHRTIM_TACNTRST_TBCMP4 /* The timer counter is reset upon other timer Compare 4 event */ +#define SHRTIM_RESETTRIG_OTHER2_CMP1 SHRTIM_TACNTRST_TCCMP1 /* The timer counter is reset upon other timer Compare 1 event */ +#define SHRTIM_RESETTRIG_OTHER2_CMP2 SHRTIM_TACNTRST_TCCMP2 /* The timer counter is reset upon other timer Compare 2 event */ +#define SHRTIM_RESETTRIG_OTHER2_CMP4 SHRTIM_TACNTRST_TCCMP4 /* The timer counter is reset upon other timer Compare 4 event */ +#define SHRTIM_RESETTRIG_OTHER3_CMP1 SHRTIM_TACNTRST_TDCMP1 /* The timer counter is reset upon other timer Compare 1 event */ +#define SHRTIM_RESETTRIG_OTHER3_CMP2 SHRTIM_TACNTRST_TDCMP2 /* The timer counter is reset upon other timer Compare 2 event */ +#define SHRTIM_RESETTRIG_OTHER3_CMP4 SHRTIM_TACNTRST_TDCMP4 /* The timer counter is reset upon other timer Compare 4 event */ +#define SHRTIM_RESETTRIG_OTHER4_CMP1 SHRTIM_TACNTRST_TECMP1 /* The timer counter is reset upon other timer Compare 1 event */ +#define SHRTIM_RESETTRIG_OTHER4_CMP2 SHRTIM_TACNTRST_TECMP2 /* The timer counter is reset upon other timer Compare 2 event */ +#define SHRTIM_RESETTRIG_OTHER4_CMP4 SHRTIM_TACNTRST_TECMP4 /* The timer counter is reset upon other timer Compare 4 event */ +#define SHRTIM_RESETTRIG_OTHER5_CMP1 SHRTIM_TACNTRST_TFCMP1 /* The timer counter is reset upon other timer Compare 1 event */ +#define SHRTIM_RESETTRIG_OTHER5_CMP2 SHRTIM_TACNTRST_TFCMP2 /* The timer counter is reset upon other timer Compare 2 event */ + +/** Defining the events that can be selected to trigger the capture of the timing unit counter. **/ +#define SHRTIM_CAPTURETRIG_NONE (uint64_t)0 /* Capture trigger is disabled */ +#define SHRTIM_CAPTURETRIG_SW (uint64_t)SHRTIM_TACPT1CTRL_SW /* The sw event triggers the Capture */ +#define SHRTIM_CAPTURETRIG_UPDATE (uint64_t)SHRTIM_TACPT1CTRL_UPD /* The update event triggers the Capture */ +#define SHRTIM_CAPTURETRIG_EXEV_1 (uint64_t)SHRTIM_TACPT1CTRL_EXEV1 /* The External event 1 triggers the Capture */ +#define SHRTIM_CAPTURETRIG_EXEV_2 (uint64_t)SHRTIM_TACPT1CTRL_EXEV2 /* The External event 2 triggers the Capture */ +#define SHRTIM_CAPTURETRIG_EXEV_3 (uint64_t)SHRTIM_TACPT1CTRL_EXEV3 /* The External event 3 triggers the Capture */ +#define SHRTIM_CAPTURETRIG_EXEV_4 (uint64_t)SHRTIM_TACPT1CTRL_EXEV4 /* The External event 4 triggers the Capture */ +#define SHRTIM_CAPTURETRIG_EXEV_5 (uint64_t)SHRTIM_TACPT1CTRL_EXEV5 /* The External event 5 triggers the Capture */ +#define SHRTIM_CAPTURETRIG_EXEV_6 (uint64_t)SHRTIM_TACPT1CTRL_EXEV6 /* The External event 6 triggers the Capture */ +#define SHRTIM_CAPTURETRIG_EXEV_7 (uint64_t)SHRTIM_TACPT1CTRL_EXEV7 /* The External event 7 triggers the Capture */ +#define SHRTIM_CAPTURETRIG_EXEV_8 (uint64_t)SHRTIM_TACPT1CTRL_EXEV8 /* The External event 8 triggers the Capture */ +#define SHRTIM_CAPTURETRIG_EXEV_9 (uint64_t)SHRTIM_TACPT1CTRL_EXEV9 /* The External event 9 triggers the Capture */ +#define SHRTIM_CAPTURETRIG_EXEV_10 (uint64_t)SHRTIM_TACPT1CTRL_EXEV10 /* The External event 10 triggers the Capture */ +#define SHRTIM_CAPTURETRIG_TA1_SET (uint64_t)(12U) <<32 /* Capture is triggered by TA1 output inactive to active transition */ +#define SHRTIM_CAPTURETRIG_TA1_RESET (uint64_t)(13U) <<32 /* Capture is triggered by TA1 output active to inactive transition */ +#define SHRTIM_CAPTURETRIG_TIMA_CMP1 (uint64_t)(14U) <<32 /* Timer A Compare 1 triggers Capture */ +#define SHRTIM_CAPTURETRIG_TIMA_CMP2 (uint64_t)(15U) <<32 /* Timer A Compare 2 triggers Capture */ +#define SHRTIM_CAPTURETRIG_TB1_SET (uint64_t)(16U) <<32 /* Capture is triggered by TB1 output inactive to active transition */ +#define SHRTIM_CAPTURETRIG_TB1_RESET (uint64_t)(17U) <<32 /* Capture is triggered by TB1 output active to inactive transition */ +#define SHRTIM_CAPTURETRIG_TIMB_CMP1 (uint64_t)(18U) <<32 /* Timer B Compare 1 triggers Capture */ +#define SHRTIM_CAPTURETRIG_TIMB_CMP2 (uint64_t)(19U) <<32 /* Timer B Compare 2 triggers Capture */ +#define SHRTIM_CAPTURETRIG_TC1_SET (uint64_t)(20U) <<32 /* Capture is triggered by TC1 output inactive to active transition */ +#define SHRTIM_CAPTURETRIG_TC1_RESET (uint64_t)(21U) <<32 /* Capture is triggered by TC1 output active to inactive transition */ +#define SHRTIM_CAPTURETRIG_TIMC_CMP1 (uint64_t)(22U) <<32 /* Timer C Compare 1 triggers Capture */ +#define SHRTIM_CAPTURETRIG_TIMC_CMP2 (uint64_t)(23U) <<32 /* Timer C Compare 2 triggers Capture */ +#define SHRTIM_CAPTURETRIG_TD1_SET (uint64_t)(24U) <<32 /* Capture is triggered by TD1 output inactive to active transition */ +#define SHRTIM_CAPTURETRIG_TD1_RESET (uint64_t)(25U) <<32 /* Capture is triggered by TD1 output active to inactive transition */ +#define SHRTIM_CAPTURETRIG_TIMD_CMP1 (uint64_t)(26U) <<32 /* Timer D Compare 1 triggers Capture */ +#define SHRTIM_CAPTURETRIG_TIMD_CMP2 (uint64_t)(27U) <<32 /* Timer D Compare 2 triggers Capture */ +#define SHRTIM_CAPTURETRIG_TE1_SET (uint64_t)(28U) <<32 /* Capture is triggered by TE1 output inactive to active transition */ +#define SHRTIM_CAPTURETRIG_TE1_RESET (uint64_t)(29U) <<32 /* Capture is triggered by TE1 output active to inactive transition */ +#define SHRTIM_CAPTURETRIG_TIME_CMP1 (uint64_t)(30U) <<32 /* Timer E Compare 1 triggers Capture */ +#define SHRTIM_CAPTURETRIG_TIME_CMP2 (uint64_t)(31U) <<32 /* Timer E Compare 2 triggers Capture */ +#define SHRTIM_CAPTURETRIG_TF1_SET (uint64_t)(0U) <<32 /* Capture is triggered by TF1 output inactive to active transition */ +#define SHRTIM_CAPTURETRIG_TF1_RESET (uint64_t)(1U) <<32 /* Capture is triggered by TF1 output active to inactive transition */ +#define SHRTIM_CAPTURETRIG_TIMF_CMP1 (uint64_t)(2U) <<32 /* Timer F Compare 1 triggers Capture */ +#define SHRTIM_CAPTURETRIG_TIMF_CMP2 (uint64_t)(3U) <<32 /* Timer F Compare 2 triggers Capture */ + + +/** Defining all possible delayed protection modes for a timer + (also define the source and outputs on which the delayed protection schemes are applied). **/ +#define SHRTIM_DP_DELAYOUT1_EXEV6 0x00000000U /* Timers A, B, C: Output 1 delayed Idle on external Event 6 */ +#define SHRTIM_DP_DELAYOUT2_EXEV6 (SHRTIM_TXOUT_DP_0) /* Timers A, B, C: Output 2 delayed Idle on external Event 6 */ +#define SHRTIM_DP_DELAYBOTH_EXEV6 (SHRTIM_TXOUT_DP_1) /* Timers A, B, C: Output 1 and output 2 delayed Idle on external Event 6 */ +#define SHRTIM_DP_BALANCED_EXEV6 (SHRTIM_TXOUT_DP_1 | SHRTIM_TXOUT_DP_0) /* Timers A, B, C: Balanced Idle on external Event 6 */ +#define SHRTIM_DP_DELAYOUT1_EXEV7 (SHRTIM_TXOUT_DP_2) /* Timers A, B, C: Output 1 delayed Idle on external Event 7 */ +#define SHRTIM_DP_DELAYOUT2_EXEV7 (SHRTIM_TXOUT_DP_2 | SHRTIM_TXOUT_DP_0) /* Timers A, B, C: Output 2 delayed Idle on external Event 7 */ +#define SHRTIM_DP_DELAYBOTH_EXEV7 (SHRTIM_TXOUT_DP_2 | SHRTIM_TXOUT_DP_1) /* Timers A, B, C: Output 1 and output2 delayed Idle on external Event 7 */ +#define SHRTIM_DP_BALANCED_EXEV7 (SHRTIM_TXOUT_DP_2 | SHRTIM_TXOUT_DP_1 | SHRTIM_TXOUT_DP_0) /* Timers A, B, C: Balanced Idle on external Event 7 */ + +#define SHRTIM_DP_DELAYOUT1_EXEV8 0x00000000U /* Timers D, E: Output 1 delayed Idle on external Event 8 */ +#define SHRTIM_DP_DELAYOUT2_EXEV8 (SHRTIM_TXOUT_DP_0) /* Timers D, E: Output 2 delayed Idle on external Event 8 */ +#define SHRTIM_DP_DELAYBOTH_EXEV8 (SHRTIM_TXOUT_DP_1) /* Timers D, E: Output 1 and output 2 delayed Idle on external Event 8 */ +#define SHRTIM_DP_BALANCED_EXEV8 (SHRTIM_TXOUT_DP_1 | SHRTIM_TXOUT_DP_0) /* Timers D, E: Balanced Idle on external Event 8 */ +#define SHRTIM_DP_DELAYOUT1_EXEV9 (SHRTIM_TXOUT_DP_2) /* Timers D, E: Output 1 delayed Idle on external Event 9 */ +#define SHRTIM_DP_DELAYOUT2_EXEV9 (SHRTIM_TXOUT_DP_2 | SHRTIM_TXOUT_DP_0) /* Timers D, E: Output 2 delayed Idle on external Event 9 */ +#define SHRTIM_DP_DELAYBOTH_EXEV9 (SHRTIM_TXOUT_DP_2 | SHRTIM_TXOUT_DP_1) /* Timers D, E: Output 1 and output2 delayed Idle on external Event 9 */ +#define SHRTIM_DP_BALANCED_EXEV9 (SHRTIM_TXOUT_DP_2 | SHRTIM_TXOUT_DP_1 | SHRTIM_TXOUT_DP_0) /* Timers D, E: Balanced Idle on external Event 9 */ + +/** Identifying an software delay protection. **/ +#define SHRTIM_SOFT_DP_TA1 (SHRTIM_SFTDP_SFTDPA1) /* Timer A - channel 1 soft delay protection identifier */ +#define SHRTIM_SOFT_DP_TA2 (SHRTIM_SFTDP_SFTDPA2) /* Timer A - channel 2 soft delay protection identifier */ +#define SHRTIM_SOFT_DP_TB1 (SHRTIM_SFTDP_SFTDPB1) /* Timer B - channel 1 soft delay protection identifier */ +#define SHRTIM_SOFT_DP_TB2 (SHRTIM_SFTDP_SFTDPB2) /* Timer B - channel 2 soft delay protection identifier */ +#define SHRTIM_SOFT_DP_TC1 (SHRTIM_SFTDP_SFTDPC1) /* Timer C - channel 1 soft delay protection identifier */ +#define SHRTIM_SOFT_DP_TC2 (SHRTIM_SFTDP_SFTDPC2) /* Timer C - channel 2 soft delay protection identifier */ +#define SHRTIM_SOFT_DP_TD1 (SHRTIM_SFTDP_SFTDPD1) /* Timer D - channel 1 soft delay protection identifier */ +#define SHRTIM_SOFT_DP_TD2 (SHRTIM_SFTDP_SFTDPD2) /* Timer D - channel 2 soft delay protection identifier */ +#define SHRTIM_SOFT_DP_TE1 (SHRTIM_SFTDP_SFTDPE1) /* Timer E - channel 1 soft delay protection identifier */ +#define SHRTIM_SOFT_DP_TE2 (SHRTIM_SFTDP_SFTDPE2) /* Timer E - channel 2 soft delay protection identifier */ +#define SHRTIM_SOFT_DP_TF1 (SHRTIM_SFTDP_SFTDPF1) /* Timer F - channel 1 soft delay protection identifier */ +#define SHRTIM_SOFT_DP_TF2 (SHRTIM_SFTDP_SFTDPF2) /* Timer F - channel 2 soft delay protection identifier */ + +/** Defining how the timer behaves during a burst mode operation. **/ +#define SHRTIM_BURSTMODE_MAINTAINCLOCK (uint32_t)0x000000 /* Timer counter clock is maintained and the timer operates normally */ +#define SHRTIM_BURSTMODE_RESETCOUNTER (SHRTIM_BMCTRL_MBM) /* Timer counter clock is stopped and the counter is reset */ + +/** Defining the registers that can be written during a burst DMA operation. **/ +#define SHRTIM_BURSTDMA_NONE 0x00000000U /* No register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_MCTRL (SHRTIM_BDMTUPD_MCTRL) /* MCTRL register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_MINTCLR (SHRTIM_BDMTUPD_MINTCLR) /* MINTCLR register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_MIDEN (SHRTIM_BDMTUPD_MIDEN) /* MIDEN register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_MCNT (SHRTIM_BDMTUPD_MCNT) /* MCNT register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_MPRD (SHRTIM_BDMTUPD_MPRD) /* MPRD register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_MREPT (SHRTIM_BDMTUPD_MREPT) /* MREPT register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_MCMPDAT1 (SHRTIM_BDMTUPD_MCMPDAT1) /* MCMPDAT1 register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_MCMPDAT2 (SHRTIM_BDMTUPD_MCMPDAT2) /* MCMPDAT2 register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_MCMPDAT3 (SHRTIM_BDMTUPD_MCMPDAT3) /* MCMPDAT3 register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_MCMPDAT4 (SHRTIM_BDMTUPD_MCMPDAT4) /* MCMPDAT4 register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXCTRL (SHRTIM_BDTAUPD_TACTRL) /* TxCTRL register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXINTCLR (SHRTIM_BDTAUPD_TAINTCLR) /* TxINTCLR register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXIDEN (SHRTIM_BDTAUPD_TAIDEN) /* TxIDEN register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXCNT (SHRTIM_BDTAUPD_TACNT) /* TxCNT register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXPRD (SHRTIM_BDTAUPD_TAPRD) /* TxPRD register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXREPT (SHRTIM_BDTAUPD_TAREPT) /* TxREPT register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXCMP1DAT (SHRTIM_BDTAUPD_TACMP1DAT) /* TxCMP1DAT register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXCMP2DAT (SHRTIM_BDTAUPD_TACMP2DAT) /* TxCMP2DAT register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXCMP3DAT (SHRTIM_BDTAUPD_TACMP3DAT) /* TxCMP3DAT register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXCMP4DAT (SHRTIM_BDTAUPD_TACMP4DAT) /* TxCMP4DAT register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXDT (SHRTIM_BDTAUPD_TADT) /* TxDT register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXSET1 (SHRTIM_BDTAUPD_TASET1) /* TxSET1 register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXRST1 (SHRTIM_BDTAUPD_TARST1) /* TxRST1 register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXSET2 (SHRTIM_BDTAUPD_TASET2) /* TxSET2 register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXRST2 (SHRTIM_BDTAUPD_TARST2) /* TxRST2 register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXEXEVFLT1 (SHRTIM_BDTAUPD_TAEXEVFLT1) /* TxEXEVFLT1 register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXEXEVFLT2 (SHRTIM_BDTAUPD_TAEXEVFLT2) /* TxEXEVFLT2 register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXCNTRST (SHRTIM_BDTAUPD_TACNTRST) /* TxCNTRST register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXCHOP (SHRTIM_BDTAUPD_TACHOP) /* TxCHOP register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXOUT (SHRTIM_BDTAUPD_TAOUT) /* TxOUT register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXFALT (SHRTIM_BDTAUPD_TAFALT) /* TxFALT register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXCTRL2 (SHRTIM_BDTAUPD_TACTRL2) /* TxCTRL2 register is updated by Burst DMA accesses */ +#define SHRTIM_BURSTDMA_TXEXEVFLT3 (SHRTIM_BDTAUPD_TAEXEVFLT3) /* TxEXEVFLT3 register is updated by Burst DMA accesses */ + + +/** Defining on which output the signal is currently applied in push-pull mode. **/ +#define SHRTIM_CPPSTAT_OUTPUT1 ((uint32_t) 0x00000000U) /* Signal applied on output 1 and output 2 forced inactive */ +#define SHRTIM_CPPSTAT_OUTPUT2 (SHRTIM_TXINTSTS_CPPSTS) /* Signal applied on output 2 and output 1 forced inactive */ + + +/** Defining on which output the signal was applied, + in push-pull mode balanced fault mode or delayed idle mode, when the protection was triggered. **/ +#define SHRTIM_IPPSTAT_OUTPUT1 ((uint32_t) 0x00000000U) /* Protection occurred when the output 1 was active and output 2 forced inactive */ +#define SHRTIM_IPPSTAT_OUTPUT2 (SHRTIM_TXINTSTS_IPPSTS) /* Protection occurred when the output 2 was active and output 1 forced inactive */ + +/** Defining the event filtering applied to external events by a timer. **/ +#define SHRTIM_EXEVFLT_NONE (0x00000000U) +#define SHRTIM_EXEVFLT_BLANKINGCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from counter reset/roll-over to Compare 1U */ +#define SHRTIM_EXEVFLT_BLANKINGCMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from counter reset/roll-over to Compare 2U */ +#define SHRTIM_EXEVFLT_BLANKINGCMP3 (SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from counter reset/roll-over to Compare 3U */ +#define SHRTIM_EXEVFLT_BLANKINGCMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2) /* Blanking from counter reset/roll-over to Compare 4U */ +/* Blanking Filter for TIMER A */ +#define SHRTIM_EXEVFLT_BLANKING_TIMAEEF1_TIMBCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR1 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMAEEF2_TIMBCMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR2 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMAEEF3_TIMBOUT2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR3 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMAEEF4_TIMCCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3) /* Blanking from another timing unit: TIMFLTR4 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMAEEF5_TIMCCMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR5 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMAEEF6_TIMFCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR6 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMAEEF7_TIMDCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR7 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMAEEF8_TIMECMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_2) /* Blanking from another timing unit: TIMFLTR8 source */ +/* Blanking Filter for TIMER B */ +#define SHRTIM_EXEVFLT_BLANKING_TIMBEEF1_TIMACMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR1 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMBEEF2_TIMACMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR2 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMBEEF3_TIMAOUT2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR3 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMBEEF4_TIMCCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3) /* Blanking from another timing unit: TIMFLTR4 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMBEEF5_TIMCCMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR5 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMBEEF6_TIMFCMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR6 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMBEEF7_TIMDCMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR7 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMBEEF8_TIMECMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_2) /* Blanking from another timing unit: TIMFLTR8 source */ +/* Blanking Filter for TIMER C */ +#define SHRTIM_EXEVFLT_BLANKING_TIMCEEF1_TIMACMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR1 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMCEEF2_TIMBCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR2 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMCEEF3_TIMBCMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR3 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMCEEF4_TIMFCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3) /* Blanking from another timing unit: TIMFLTR4 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMCEEF5_TIMDCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR5 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMCEEF6_TIMDCMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR6 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMCEEF7_TIMDOUT2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR7 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMCEEF8_TIMECMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_2) /* Blanking from another timing unit: TIMFLTR8 source */ +/* Blanking Filter for TIMER D */ +#define SHRTIM_EXEVFLT_BLANKING_TIMDEEF1_TIMACMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR1 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMDEEF2_TIMBCMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR2 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMDEEF3_TIMCCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR3 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMDEEF4_TIMCCMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3) /* Blanking from another timing unit: TIMFLTR4 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMDEEF5_TIMCOUT2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR5 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMDEEF6_TIMECMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR6 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMDEEF7_TIMECMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR7 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMDEEF8_TIMFCMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_2) /* Blanking from another timing unit: TIMFLTR8 source */ +/* Blanking Filter for TIMER E */ +#define SHRTIM_EXEVFLT_BLANKING_TIMEEEF1_TIMACMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR1 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMEEEF2_TIMBCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR2 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMEEEF3_TIMCCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR3 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMEEEF4_TIMFCMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3) /* Blanking from another timing unit: TIMFLTR4 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMEEEF5_TIMFOUT2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR5 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMEEEF6_TIMDCMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR6 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMEEEF7_TIMDCMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR7 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMEEEF8_TIMDOUT2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_2) /* Blanking from another timing unit: TIMFLTR8 source */ +/* Blanking Filter for TIMER F */ +#define SHRTIM_EXEVFLT_BLANKING_TIMFEEF1_TIMACMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR1 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMFEEF2_TIMBCMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR2 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMFEEF3_TIMCCMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR3 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMFEEF4_TIMDCMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3) /* Blanking from another timing unit: TIMFLTR4 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMFEEF5_TIMDCMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR5 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMFEEF6_TIMECMP1 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Blanking from another timing unit: TIMFLTR6 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMFEEF7_TIMECMP4 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Blanking from another timing unit: TIMFLTR7 source */ +#define SHRTIM_EXEVFLT_BLANKING_TIMFEEF8_TIMEOUT2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_2) /* Blanking from another timing unit: TIMFLTR8 source */ + +#define SHRTIM_EXEVFLT_WINDOWINGCMP2 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Windowing from counter reset/roll-over to Compare 2U */ +#define SHRTIM_EXEVFLT_WINDOWINGCMP3 (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1) /* Windowing from counter reset/roll-over to Compare 3U */ +#define SHRTIM_EXEVFLT_WINDOWINGTIM (SHRTIM_TXEXEVFLT1_EXEV1FLT_3 | SHRTIM_TXEXEVFLT1_EXEV1FLT_2 | SHRTIM_TXEXEVFLT1_EXEV1FLT_1\ + | SHRTIM_TXEXEVFLT1_EXEV1FLT_0) /* Windowing from another timing unit: TIMWIN source */ + + +/** Defining whether or not the external event is memorized (latched) + and generated as soon as the blanking period is completed or the window ends. **/ +#define SHRTIM_EXEVLATCH_DISABLED 0x00000000U /* Event is ignored if it happens during a blank, or passed through during a window */ +#define SHRTIM_EXEVLATCH_ENABLED SHRTIM_TXEXEVFLT1_EXEV1LATCH /* Event is latched and delayed till the end of the blanking or windowing period */ + + +/** Defining division ratio between the timer clock frequency (fSHRTIM) + and the deadtime generator clock (fDTG). **/ +#define SHRTIM_DT_PRESCALER_MUL8 0x00000000U /* fDTG = fSHRTIM * 8 */ +#define SHRTIM_DT_PRESCALER_MUL4 (SHRTIM_TXDT_DTPSC_0) /* fDTG = fSHRTIM * 4 */ +#define SHRTIM_DT_PRESCALER_MUL2 (SHRTIM_TXDT_DTPSC_1) /* fDTG = fSHRTIM * 2 */ +#define SHRTIM_DT_PRESCALER_DIV1 (SHRTIM_TXDT_DTPSC_1 | SHRTIM_TXDT_DTPSC_0) /* fDTG = fSHRTIM */ +#define SHRTIM_DT_PRESCALER_DIV2 (SHRTIM_TXDT_DTPSC_2) /* fDTG = fSHRTIM / 2 */ +#define SHRTIM_DT_PRESCALER_DIV4 (SHRTIM_TXDT_DTPSC_2 | SHRTIM_TXDT_DTPSC_0) /* fDTG = fSHRTIM / 4 */ +#define SHRTIM_DT_PRESCALER_DIV8 (SHRTIM_TXDT_DTPSC_2 | SHRTIM_TXDT_DTPSC_1) /* fDTG = fSHRTIM / 8 */ +#define SHRTIM_DT_PRESCALER_DIV16 (SHRTIM_TXDT_DTPSC_2 | SHRTIM_TXDT_DTPSC_1 | SHRTIM_TXDT_DTPSC_0) /* fDTG = fSHRTIM / 16 */ + + +/** Defining whether the deadtime is positive or negative (overlapping signal) on rising edge. **/ +#define SHRTIM_DT_RISING_POSITIVE 0x00000000U /* Positive deadtime on rising edge */ +#define SHRTIM_DT_RISING_NEGATIVE (SHRTIM_TXDT_SDTR) /* Negative deadtime on rising edge */ + + +/** Defining whether the deadtime is positive or negative (overlapping signal) on falling edge. **/ +#define SHRTIM_DT_FALLING_POSITIVE 0x00000000U /* Positive deadtime on falling edge */ +#define SHRTIM_DT_FALLING_NEGATIVE (SHRTIM_TXDT_SDTF) /* Negative deadtime on falling edge */ + + +/** Defining the frequency of the generated high frequency carrier (fCHPFRQ). **/ +#define SHRTIM_CHP_PRESCALER_DIV16 0x00000000U /* fCHPFRQ = fSHRTIM / 16 */ +#define SHRTIM_CHP_PRESCALER_DIV32 (SHRTIM_TXCHOP_CARFRQ_0) /* fCHPFRQ = fSHRTIM / 32 */ +#define SHRTIM_CHP_PRESCALER_DIV48 (SHRTIM_TXCHOP_CARFRQ_1) /* fCHPFRQ = fSHRTIM / 48 */ +#define SHRTIM_CHP_PRESCALER_DIV64 (SHRTIM_TXCHOP_CARFRQ_1 | SHRTIM_TXCHOP_CARFRQ_0) /* fCHPFRQ = fSHRTIM / 64 */ +#define SHRTIM_CHP_PRESCALER_DIV80 (SHRTIM_TXCHOP_CARFRQ_2) /* fCHPFRQ = fSHRTIM / 80 */ +#define SHRTIM_CHP_PRESCALER_DIV96 (SHRTIM_TXCHOP_CARFRQ_2 | SHRTIM_TXCHOP_CARFRQ_0) /* fCHPFRQ = fSHRTIM / 96 */ +#define SHRTIM_CHP_PRESCALER_DIV112 (SHRTIM_TXCHOP_CARFRQ_2 | SHRTIM_TXCHOP_CARFRQ_1) /* fCHPFRQ = fSHRTIM / 112 */ +#define SHRTIM_CHP_PRESCALER_DIV128 (SHRTIM_TXCHOP_CARFRQ_2 | SHRTIM_TXCHOP_CARFRQ_1 | SHRTIM_TXCHOP_CARFRQ_0) /* fCHPFRQ = fSHRTIM / 128 */ +#define SHRTIM_CHP_PRESCALER_DIV144 (SHRTIM_TXCHOP_CARFRQ_3) /* fCHPFRQ = fSHRTIM / 144 */ +#define SHRTIM_CHP_PRESCALER_DIV160 (SHRTIM_TXCHOP_CARFRQ_3 | SHRTIM_TXCHOP_CARFRQ_0) /* fCHPFRQ = fSHRTIM / 160 */ +#define SHRTIM_CHP_PRESCALER_DIV176 (SHRTIM_TXCHOP_CARFRQ_3 | SHRTIM_TXCHOP_CARFRQ_1) /* fCHPFRQ = fSHRTIM / 176 */ +#define SHRTIM_CHP_PRESCALER_DIV192 (SHRTIM_TXCHOP_CARFRQ_3 | SHRTIM_TXCHOP_CARFRQ_1 | SHRTIM_TXCHOP_CARFRQ_0) /* fCHPFRQ = fSHRTIM / 192 */ +#define SHRTIM_CHP_PRESCALER_DIV208 (SHRTIM_TXCHOP_CARFRQ_3 | SHRTIM_TXCHOP_CARFRQ_2) /* fCHPFRQ = fSHRTIM / 208 */ +#define SHRTIM_CHP_PRESCALER_DIV224 (SHRTIM_TXCHOP_CARFRQ_3 | SHRTIM_TXCHOP_CARFRQ_2 | SHRTIM_TXCHOP_CARFRQ_0) /* fCHPFRQ = fSHRTIM / 224 */ +#define SHRTIM_CHP_PRESCALER_DIV240 (SHRTIM_TXCHOP_CARFRQ_3 | SHRTIM_TXCHOP_CARFRQ_2 | SHRTIM_TXCHOP_CARFRQ_1) /* fCHPFRQ = fSHRTIM / 240 */ +#define SHRTIM_CHP_PRESCALER_DIV256 (SHRTIM_TXCHOP_CARFRQ_3 | SHRTIM_TXCHOP_CARFRQ_2 | SHRTIM_TXCHOP_CARFRQ_1 | SHRTIM_TXCHOP_CARFRQ_0) /* fCHPFRQ = fSHRTIM / 256 */ + + +/** Defining the duty cycle of the generated high frequency carrier. + Duty cycle can be adjusted by 1/8 step (from 0/8 up to 7/8). **/ +#define SHRTIM_CHP_DUTYCYCLE_0 0x00000000U /* Only 1st pulse is present */ +#define SHRTIM_CHP_DUTYCYCLE_125 (SHRTIM_TXCHOP_CARDCY_0) /* Duty cycle of the carrier signal is 12.5 % */ +#define SHRTIM_CHP_DUTYCYCLE_250 (SHRTIM_TXCHOP_CARDCY_1) /* Duty cycle of the carrier signal is 25 % */ +#define SHRTIM_CHP_DUTYCYCLE_375 (SHRTIM_TXCHOP_CARDCY_1 | SHRTIM_TXCHOP_CARDCY_0) /* Duty cycle of the carrier signal is 37.5 % */ +#define SHRTIM_CHP_DUTYCYCLE_500 (SHRTIM_TXCHOP_CARDCY_2) /* Duty cycle of the carrier signal is 50 % */ +#define SHRTIM_CHP_DUTYCYCLE_625 (SHRTIM_TXCHOP_CARDCY_2 | SHRTIM_TXCHOP_CARDCY_0) /* Duty cycle of the carrier signal is 62.5 % */ +#define SHRTIM_CHP_DUTYCYCLE_750 (SHRTIM_TXCHOP_CARDCY_2 | SHRTIM_TXCHOP_CARDCY_1) /* Duty cycle of the carrier signal is 75 % */ +#define SHRTIM_CHP_DUTYCYCLE_875 (SHRTIM_TXCHOP_CARDCY_2 | SHRTIM_TXCHOP_CARDCY_1 | SHRTIM_TXCHOP_CARDCY_0) /* Duty cycle of the carrier signal is 87.5 % */ + + +/** Defining the pulse width of the first pulse of the generated high frequency carrier. **/ +#define SHRTIM_CHP_PULSEWIDTH_16 0x00000000U /* tSTPW = tHRTIM x 16 */ +#define SHRTIM_CHP_PULSEWIDTH_32 (SHRTIM_TXCHOP_STARTPW_0) /* tSTPW = tHRTIM x 32 */ +#define SHRTIM_CHP_PULSEWIDTH_48 (SHRTIM_TXCHOP_STARTPW_1) /* tSTPW = tHRTIM x 48 */ +#define SHRTIM_CHP_PULSEWIDTH_64 (SHRTIM_TXCHOP_STARTPW_1 | SHRTIM_TXCHOP_STARTPW_0) /* tSTPW = tHRTIM x 64 */ +#define SHRTIM_CHP_PULSEWIDTH_80 (SHRTIM_TXCHOP_STARTPW_2) /* tSTPW = tHRTIM x 80 */ +#define SHRTIM_CHP_PULSEWIDTH_96 (SHRTIM_TXCHOP_STARTPW_2 | SHRTIM_TXCHOP_STARTPW_0) /* tSTPW = tHRTIM x 96 */ +#define SHRTIM_CHP_PULSEWIDTH_112 (SHRTIM_TXCHOP_STARTPW_2 | SHRTIM_TXCHOP_STARTPW_1) /* tSTPW = tHRTIM x 112 */ +#define SHRTIM_CHP_PULSEWIDTH_128 (SHRTIM_TXCHOP_STARTPW_2 | SHRTIM_TXCHOP_STARTPW_1 | SHRTIM_TXCHOP_STARTPW_0) /* tSTPW = tHRTIM x 128 */ +#define SHRTIM_CHP_PULSEWIDTH_144 (SHRTIM_TXCHOP_STARTPW_3) /* tSTPW = tHRTIM x 144 */ +#define SHRTIM_CHP_PULSEWIDTH_160 (SHRTIM_TXCHOP_STARTPW_3 | SHRTIM_TXCHOP_STARTPW_0) /* tSTPW = tHRTIM x 160 */ +#define SHRTIM_CHP_PULSEWIDTH_176 (SHRTIM_TXCHOP_STARTPW_3 | SHRTIM_TXCHOP_STARTPW_1) /* tSTPW = tHRTIM x 176 */ +#define SHRTIM_CHP_PULSEWIDTH_192 (SHRTIM_TXCHOP_STARTPW_3 | SHRTIM_TXCHOP_STARTPW_1 | SHRTIM_TXCHOP_STARTPW_0) /* tSTPW = tHRTIM x 192 */ +#define SHRTIM_CHP_PULSEWIDTH_208 (SHRTIM_TXCHOP_STARTPW_3 | SHRTIM_TXCHOP_STARTPW_2) /* tSTPW = tHRTIM x 208 */ +#define SHRTIM_CHP_PULSEWIDTH_224 (SHRTIM_TXCHOP_STARTPW_3 | SHRTIM_TXCHOP_STARTPW_2 | SHRTIM_TXCHOP_STARTPW_0) /* tSTPW = tHRTIM x 224 */ +#define SHRTIM_CHP_PULSEWIDTH_240 (SHRTIM_TXCHOP_STARTPW_3 | SHRTIM_TXCHOP_STARTPW_2 | SHRTIM_TXCHOP_STARTPW_1) /* tSTPW = tHRTIM x 240 */ +#define SHRTIM_CHP_PULSEWIDTH_256 (SHRTIM_TXCHOP_STARTPW_3 | SHRTIM_TXCHOP_STARTPW_2 | SHRTIM_TXCHOP_STARTPW_1 | SHRTIM_TXCHOP_STARTPW_0) /* tSTPW = tHRTIM x 256 */ + +/** Defining the events that can be selected to configure the set/reset crossbar of a timer output. **/ +#define SHRTIM_OUTPUTSET_NONE 0x00000000U /* Reset the output set crossbar */ +#define SHRTIM_OUTPUTSET_RESYNC (SHRTIM_TXSET1_RSYNC) /* Timer reset event coming solely from software or SYNC input forces an output level transition */ +#define SHRTIM_OUTPUTSET_TIMPER (SHRTIM_TXSET1_PRD) /* Timer period event forces an output level transition */ +#define SHRTIM_OUTPUTSET_TIMCMP1 (SHRTIM_TXSET1_CMP1) /* Timer compare 1 event forces an output level transition */ +#define SHRTIM_OUTPUTSET_TIMCMP2 (SHRTIM_TXSET1_CMP2) /* Timer compare 2 event forces an output level transition */ +#define SHRTIM_OUTPUTSET_TIMCMP3 (SHRTIM_TXSET1_CMP3) /* Timer compare 3 event forces an output level transition */ +#define SHRTIM_OUTPUTSET_TIMCMP4 (SHRTIM_TXSET1_CMP4) /* Timer compare 4 event forces an output level transition */ +#define SHRTIM_OUTPUTSET_MASTERPER (SHRTIM_TXSET1_MPRD) /* The master timer period event forces an output level transition */ +#define SHRTIM_OUTPUTSET_MASTERCMP1 (SHRTIM_TXSET1_MCMP1) /* Master Timer compare 1 event forces an output level transition */ +#define SHRTIM_OUTPUTSET_MASTERCMP2 (SHRTIM_TXSET1_MCMP2) /* Master Timer compare 2 event forces an output level transition */ +#define SHRTIM_OUTPUTSET_MASTERCMP3 (SHRTIM_TXSET1_MCMP3) /* Master Timer compare 3 event forces an output level transition */ +#define SHRTIM_OUTPUTSET_MASTERCMP4 (SHRTIM_TXSET1_MCMP4) /* Master Timer compare 4 event forces an output level transition */ +/* Timer Events mapping for Timer A */ +#define SHRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 (SHRTIM_TXSET1_TIMEV1) /* Timer event 1 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 (SHRTIM_TXSET1_TIMEV2) /* Timer event 2 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 (SHRTIM_TXSET1_TIMEV3) /* Timer event 3 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 (SHRTIM_TXSET1_TIMEV4) /* Timer event 4 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 (SHRTIM_TXSET1_TIMEV5) /* Timer event 5 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 (SHRTIM_TXSET1_TIMEV6) /* Timer event 6 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 (SHRTIM_TXSET1_TIMEV7) /* Timer event 7 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 (SHRTIM_TXSET1_TIMEV8) /* Timer event 8 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 (SHRTIM_TXSET1_TIMEV9) /* Timer event 9 forces the output to its active state */ +/* Timer Events mapping for Timer B */ +#define SHRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 (SHRTIM_TXSET1_TIMEV1) /* Timer event 1 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 (SHRTIM_TXSET1_TIMEV2) /* Timer event 2 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 (SHRTIM_TXSET1_TIMEV3) /* Timer event 3 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 (SHRTIM_TXSET1_TIMEV4) /* Timer event 4 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 (SHRTIM_TXSET1_TIMEV5) /* Timer event 5 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 (SHRTIM_TXSET1_TIMEV6) /* Timer event 6 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 (SHRTIM_TXSET1_TIMEV7) /* Timer event 7 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 (SHRTIM_TXSET1_TIMEV8) /* Timer event 8 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 (SHRTIM_TXSET1_TIMEV9) /* Timer event 9 forces the output to its active state */ +/* Timer Events mapping for Timer C */ +#define SHRTIM_OUTPUTSET_TIMCEV1_TIMACMP2 (SHRTIM_TXSET1_TIMEV1) /* Timer event 1 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMCEV2_TIMACMP3 (SHRTIM_TXSET1_TIMEV2) /* Timer event 2 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 (SHRTIM_TXSET1_TIMEV3) /* Timer event 3 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 (SHRTIM_TXSET1_TIMEV4) /* Timer event 4 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 (SHRTIM_TXSET1_TIMEV5) /* Timer event 5 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 (SHRTIM_TXSET1_TIMEV6) /* Timer event 6 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 (SHRTIM_TXSET1_TIMEV7) /* Timer event 7 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 (SHRTIM_TXSET1_TIMEV8) /* Timer event 8 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 (SHRTIM_TXSET1_TIMEV9) /* Timer event 9 forces the output to its active state */ +/* Timer Events mapping for Timer D */ +#define SHRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 (SHRTIM_TXSET1_TIMEV1) /* Timer event 1 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 (SHRTIM_TXSET1_TIMEV2) /* Timer event 2 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 (SHRTIM_TXSET1_TIMEV3) /* Timer event 3 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 (SHRTIM_TXSET1_TIMEV4) /* Timer event 4 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 (SHRTIM_TXSET1_TIMEV5) /* Timer event 5 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 (SHRTIM_TXSET1_TIMEV6) /* Timer event 6 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 (SHRTIM_TXSET1_TIMEV7) /* Timer event 7 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 (SHRTIM_TXSET1_TIMEV8) /* Timer event 8 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 (SHRTIM_TXSET1_TIMEV9) /* Timer event 9 forces the output to its active state */ +/* Timer Events mapping for Timer E */ +#define SHRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 (SHRTIM_TXSET1_TIMEV1) /* Timer event 1 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 (SHRTIM_TXSET1_TIMEV2) /* Timer event 2 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 (SHRTIM_TXSET1_TIMEV3) /* Timer event 3 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 (SHRTIM_TXSET1_TIMEV4) /* Timer event 4 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMEEV5_TIMCCMP2 (SHRTIM_TXSET1_TIMEV5) /* Timer event 5 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 (SHRTIM_TXSET1_TIMEV6) /* Timer event 6 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 (SHRTIM_TXSET1_TIMEV7) /* Timer event 7 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 (SHRTIM_TXSET1_TIMEV8) /* Timer event 8 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 (SHRTIM_TXSET1_TIMEV9) /* Timer event 9 forces the output to its active state */ +/* Timer Events mapping for Timer F */ +#define SHRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 (SHRTIM_TXSET1_TIMEV1) /* Timer event 1 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 (SHRTIM_TXSET1_TIMEV2) /* Timer event 2 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 (SHRTIM_TXSET1_TIMEV3) /* Timer event 3 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 (SHRTIM_TXSET1_TIMEV4) /* Timer event 4 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 (SHRTIM_TXSET1_TIMEV5) /* Timer event 5 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 (SHRTIM_TXSET1_TIMEV6) /* Timer event 6 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 (SHRTIM_TXSET1_TIMEV7) /* Timer event 7 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 (SHRTIM_TXSET1_TIMEV8) /* Timer event 8 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 (SHRTIM_TXSET1_TIMEV9) /* Timer event 9 forces the output to its active state */ +#define SHRTIM_OUTPUTSET_EXEV_1 (SHRTIM_TXSET1_EXEV1) /* External event 1 forces an output level transition */ +#define SHRTIM_OUTPUTSET_EXEV_2 (SHRTIM_TXSET1_EXEV2) /* External event 2 forces an output level transition */ +#define SHRTIM_OUTPUTSET_EXEV_3 (SHRTIM_TXSET1_EXEV3) /* External event 3 forces an output level transition */ +#define SHRTIM_OUTPUTSET_EXEV_4 (SHRTIM_TXSET1_EXEV4) /* External event 4 forces an output level transition */ +#define SHRTIM_OUTPUTSET_EXEV_5 (SHRTIM_TXSET1_EXEV5) /* External event 5 forces an output level transition */ +#define SHRTIM_OUTPUTSET_EXEV_6 (SHRTIM_TXSET1_EXEV6) /* External event 6 forces an output level transition */ +#define SHRTIM_OUTPUTSET_EXEV_7 (SHRTIM_TXSET1_EXEV7) /* External event 7 forces an output level transition */ +#define SHRTIM_OUTPUTSET_EXEV_8 (SHRTIM_TXSET1_EXEV8) /* External event 8 forces an output level transition */ +#define SHRTIM_OUTPUTSET_EXEV_9 (SHRTIM_TXSET1_EXEV9) /* External event 9 forces an output level transition */ +#define SHRTIM_OUTPUTSET_EXEV_10 (SHRTIM_TXSET1_EXEV10) /* External event 10 forces an output level transition */ +#define SHRTIM_OUTPUTSET_UPDATE (SHRTIM_TXSET1_UPD) /* Timer register update event forces an output level transition */ + +/** Defining the events that can be selected to configure the set crossbar of a timer output **/ +#define SHRTIM_OUTPUTRESET_NONE 0x00000000U /* Reset the output reset crossbar */ +#define SHRTIM_OUTPUTRESET_RESYNC (SHRTIM_TXRST1_RSYNC) /* Timer reset event coming solely from software or SYNC input forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMPER (SHRTIM_TXRST1_PRD) /* Timer period event forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCMP1 (SHRTIM_TXRST1_CMP1) /* Timer compare 1 event forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCMP2 (SHRTIM_TXRST1_CMP2) /* Timer compare 2 event forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCMP3 (SHRTIM_TXRST1_CMP3) /* Timer compare 3 event forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCMP4 (SHRTIM_TXRST1_CMP4) /* Timer compare 4 event forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_MASTERPER (SHRTIM_TXRST1_MPRD) /* The master timer period event forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_MASTERCMP1 (SHRTIM_TXRST1_MCMP1) /* Master Timer compare 1 event forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_MASTERCMP2 (SHRTIM_TXRST1_MCMP2) /* Master Timer compare 2 event forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_MASTERCMP3 (SHRTIM_TXRST1_MCMP3) /* Master Timer compare 3 event forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_MASTERCMP4 (SHRTIM_TXRST1_MCMP4) /* Master Timer compare 4 event forces the output to its inactive state */ +/* Timer Events mapping for Timer A */ +#define SHRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 (SHRTIM_TXRST1_TIMEV1) /* Timer event 1 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 (SHRTIM_TXRST1_TIMEV2) /* Timer event 2 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 (SHRTIM_TXRST1_TIMEV3) /* Timer event 3 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 (SHRTIM_TXRST1_TIMEV4) /* Timer event 4 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 (SHRTIM_TXRST1_TIMEV5) /* Timer event 5 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 (SHRTIM_TXRST1_TIMEV6) /* Timer event 6 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 (SHRTIM_TXRST1_TIMEV7) /* Timer event 7 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 (SHRTIM_TXRST1_TIMEV8) /* Timer event 8 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 (SHRTIM_TXRST1_TIMEV9) /* Timer event 9 forces the output to its inactive state */ +/* Timer Events mapping for Timer B */ +#define SHRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 (SHRTIM_TXRST1_TIMEV1) /* Timer event 1 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 (SHRTIM_TXRST1_TIMEV2) /* Timer event 2 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 (SHRTIM_TXRST1_TIMEV3) /* Timer event 3 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 (SHRTIM_TXRST1_TIMEV4) /* Timer event 4 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 (SHRTIM_TXRST1_TIMEV5) /* Timer event 5 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 (SHRTIM_TXRST1_TIMEV6) /* Timer event 6 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 (SHRTIM_TXRST1_TIMEV7) /* Timer event 7 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 (SHRTIM_TXRST1_TIMEV8) /* Timer event 8 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 (SHRTIM_TXRST1_TIMEV9) /* Timer event 9 forces the output to its inactive state */ +/* Timer Events mapping for Timer C */ +#define SHRTIM_OUTPUTRESET_TIMCEV1_TIMACMP2 (SHRTIM_TXRST1_TIMEV1) /* Timer event 1 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCEV2_TIMACMP3 (SHRTIM_TXRST1_TIMEV2) /* Timer event 2 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 (SHRTIM_TXRST1_TIMEV3) /* Timer event 3 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 (SHRTIM_TXRST1_TIMEV4) /* Timer event 4 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 (SHRTIM_TXRST1_TIMEV5) /* Timer event 5 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 (SHRTIM_TXRST1_TIMEV6) /* Timer event 6 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 (SHRTIM_TXRST1_TIMEV7) /* Timer event 7 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 (SHRTIM_TXRST1_TIMEV8) /* Timer event 8 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 (SHRTIM_TXRST1_TIMEV9) /* Timer event 9 forces the output to its inactive state */ +/* Timer Events mapping for Timer D */ +#define SHRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 (SHRTIM_TXRST1_TIMEV1) /* Timer event 1 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 (SHRTIM_TXRST1_TIMEV2) /* Timer event 2 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 (SHRTIM_TXRST1_TIMEV3) /* Timer event 3 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 (SHRTIM_TXRST1_TIMEV4) /* Timer event 4 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 (SHRTIM_TXRST1_TIMEV5) /* Timer event 5 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 (SHRTIM_TXRST1_TIMEV6) /* Timer event 6 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 (SHRTIM_TXRST1_TIMEV7) /* Timer event 7 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 (SHRTIM_TXRST1_TIMEV8) /* Timer event 8 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 (SHRTIM_TXRST1_TIMEV9) /* Timer event 9 forces the output to its inactive state */ +/* Timer Events mapping for Timer E */ +#define SHRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 (SHRTIM_TXRST1_TIMEV1) /* Timer event 1 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 (SHRTIM_TXRST1_TIMEV2) /* Timer event 2 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 (SHRTIM_TXRST1_TIMEV3) /* Timer event 3 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 (SHRTIM_TXRST1_TIMEV4) /* Timer event 4 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMEEV5_TIMCCMP2 (SHRTIM_TXRST1_TIMEV5) /* Timer event 5 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 (SHRTIM_TXRST1_TIMEV6) /* Timer event 6 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 (SHRTIM_TXRST1_TIMEV7) /* Timer event 7 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 (SHRTIM_TXRST1_TIMEV8) /* Timer event 8 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 (SHRTIM_TXRST1_TIMEV9) /* Timer event 9 forces the output to its inactive state */ +/* Timer Events mapping for Timer F */ +#define SHRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 (SHRTIM_TXRST1_TIMEV1) /* Timer event 1 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 (SHRTIM_TXRST1_TIMEV2) /* Timer event 2 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 (SHRTIM_TXRST1_TIMEV3) /* Timer event 3 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 (SHRTIM_TXRST1_TIMEV4) /* Timer event 4 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 (SHRTIM_TXRST1_TIMEV5) /* Timer event 5 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 (SHRTIM_TXRST1_TIMEV6) /* Timer event 6 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 (SHRTIM_TXRST1_TIMEV7) /* Timer event 7 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 (SHRTIM_TXRST1_TIMEV8) /* Timer event 8 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 (SHRTIM_TXRST1_TIMEV9) /* Timer event 9 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_EXEV_1 (SHRTIM_TXRST1_EXEV1) /* External event 1 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_EXEV_2 (SHRTIM_TXRST1_EXEV2) /* External event 2 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_EXEV_3 (SHRTIM_TXRST1_EXEV3) /* External event 3 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_EXEV_4 (SHRTIM_TXRST1_EXEV4) /* External event 4 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_EXEV_5 (SHRTIM_TXRST1_EXEV5) /* External event 5 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_EXEV_6 (SHRTIM_TXRST1_EXEV6) /* External event 6 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_EXEV_7 (SHRTIM_TXRST1_EXEV7) /* External event 7 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_EXEV_8 (SHRTIM_TXRST1_EXEV8) /* External event 8 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_EXEV_9 (SHRTIM_TXRST1_EXEV9) /* External event 9 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_EXEV_10 (SHRTIM_TXRST1_EXEV10) /* External event 10 forces the output to its inactive state */ +#define SHRTIM_OUTPUTRESET_UPDATE (SHRTIM_TXRST1_UPD) /* Timer register update event forces the output to its inactive state */ + + +/** Defining the polarity of a timer output. **/ +#define SHRTIM_OUT_POSITIVE_POLARITY 0x00000000U /* Output is active HIGH */ +#define SHRTIM_OUT_NEGATIVE_POLARITY (SHRTIM_TXOUT_POL1) /* Output is active LOW */ + +/** Defining the interleaved mode of an SHRTIM Timer instance. + */ +#define SHRTIM_INTERLEAVED_MODE_DISABLED 0x000U /* SHRTIM interleaved Mode is disabled */ +#define SHRTIM_INTERLEAVED_MODE_DUAL SHRTIM_MCTRL_HLF /* SHRTIM interleaved Mode is Dual */ +#define SHRTIM_INTERLEAVED_MODE_TRIPLE SHRTIM_MCTRL_ILV_0 /* SHRTIM interleaved Mode is Triple */ +#define SHRTIM_INTERLEAVED_MODE_QUAD SHRTIM_MCTRL_ILV_1 /* SHRTIM interleaved Mode is Quad */ + +/** Defining the half mode of an SHRTIM Timer instance. **/ +#define SHRTIM_HALF_MODE_DISABLED 0x000U /* SHRTIM Half Mode is disabled */ +#define SHRTIM_HALF_MODE_ENABLE SHRTIM_MCTRL_HLF /* SHRTIM Half Mode is Half */ + +/** Defining the output level when output is in IDLE state **/ +#define SHRTIM_OUT_IDLELEVEL_INACTIVE 0x00000000U /* Output at inactive level when in IDLE state */ +#define SHRTIM_OUT_IDLELEVEL_ACTIVE (SHRTIM_TXOUT_IDLES1) /* Output at active level when in IDLE state */ + + +/** Defining the output level when output is in FAULT state. **/ +#define SHRTIM_OUT_FAULTSTATE_NO_ACTION 0x00000000U /* The output is not affected by the fault input */ +#define SHRTIM_OUT_FAULTSTATE_ACTIVE (SHRTIM_TXOUT_FALT1_0) /* Output at active level when in FAULT state */ +#define SHRTIM_OUT_FAULTSTATE_INACTIVE (SHRTIM_TXOUT_FALT1_1) /* Output at inactive level when in FAULT state */ +#define SHRTIM_OUT_FAULTSTATE_HIGHZ (SHRTIM_TXOUT_FALT1_1 | SHRTIM_TXOUT_FALT1_0) /* Output is tri-stated when in FAULT state */ + +/** Defining whether or not chopper mode is enabled for a timer output. **/ +#define SHRTIM_OUT_CHOPPERMODE_DISABLED 0x00000000U /* Output signal is not altered */ +#define SHRTIM_OUT_CHOPPERMODE_ENABLED (SHRTIM_TXOUT_CHP1) /* Output signal is chopped by a carrier signal */ + +/** Defining the idle state entry mode during a burst mode operation. + It is possible to delay the burst mode entry and force the output to an inactive state + during a programmable period before the output takes its idle state. **/ +#define SHRTIM_OUT_BM_ENTRYMODE_REGULAR 0x00000000U /* The programmed Idle state is applied immediately to the Output */ +#define SHRTIM_OUT_BM_ENTRYMODE_DELAYED (SHRTIM_TXOUT_DIDL1) /* Deadtime is inserted on output before entering the idle mode */ + +/** Defining the level of a timer output. + */ +#define SHRTIM_OUT_LEVEL_INACTIVE 0x00000000U /* Corresponds to a logic level 0 for a positive polarity (High) and to a logic level 1 for a negative polarity (Low) */ +#define SHRTIM_OUT_LEVEL_ACTIVE ((uint32_t)0x00000001) /* Corresponds to a logic level 1 for a positive polarity (High) and to a logic level 0 for a negative polarity (Low) */ + + +/** Defining available sources associated to external events. **/ +#define SHRTIM_EXEV1SRC_GPIO 0x00000000U /* External event source 1 for External Event 1 */ +#define SHRTIM_EXEV2SRC_GPIO 0x00000000U /* External event source 1 for External Event 2 */ +#define SHRTIM_EXEV3SRC_GPIO 0x00000000U /* External event source 1 for External Event 3 */ +#define SHRTIM_EXEV4SRC_GPIO 0x00000000U /* External event source 1 for External Event 4 */ +#define SHRTIM_EXEV5SRC_GPIO 0x00000000U /* External event source 1 for External Event 5 */ +#define SHRTIM_EXEV6SRC_GPIO 0x00000000U /* External event source 1 for External Event 6 */ +#define SHRTIM_EXEV7SRC_GPIO 0x00000000U /* External event source 1 for External Event 7 */ +#define SHRTIM_EXEV8SRC_GPIO 0x00000000U /* External event source 1 for External Event 8 */ +#define SHRTIM_EXEV9SRC_GPIO 0x00000000U /* External event source 1 for External Event 9 */ +#define SHRTIM_EXEV10SRC_GPIO 0x00000000U /* External event source 1 for External Event 10 */ +#define SHRTIM_EXEV1SRC_COMPx_OUT (SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 2 for External Event 1 */ +#define SHRTIM_EXEV2SRC_COMPx_OUT (SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 2 for External Event 2 */ +#define SHRTIM_EXEV3SRC_COMPx_OUT (SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 2 for External Event 3 */ +#define SHRTIM_EXEV4SRC_COMPx_OUT (SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 2 for External Event 4 */ +#define SHRTIM_EXEV5SRC_COMPx_OUT (SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 2 for External Event 5 */ +#define SHRTIM_EXEV6SRC_COMPx_OUT (SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 2 for External Event 6 */ +#define SHRTIM_EXEV7SRC_COMPx_OUT (SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 2 for External Event 7 */ +#define SHRTIM_EXEV8SRC_COMPx_OUT (SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 2 for External Event 8 */ +#define SHRTIM_EXEV9SRC_COMPx_OUT (SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 2 for External Event 9 */ +#define SHRTIM_EXEV10SRC_COMPx_OUT (SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 2 for External Event 10 */ +#define SHRTIM_EXEV1SRC_ATIM1_TRGO (SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 3 for External Event 1 */ +#define SHRTIM_EXEV2SRC_GTIMA1_TRGO (SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 3 for External Event 2 */ +#define SHRTIM_EXEV3SRC_GTIMA2_TRGO (SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 3 for External Event 3 */ +#define SHRTIM_EXEV4SRC_ATIM2_TRGO (SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 3 for External Event 4 */ +#define SHRTIM_EXEV5SRC_ATIM3_TRGO (SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 3 for External Event 5 */ +#define SHRTIM_EXEV6SRC_ATIM4_TRGO (SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 3 for External Event 6 */ +#define SHRTIM_EXEV7SRC_GTIMA6_TRGO (SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 3 for External Event 7 */ +#define SHRTIM_EXEV8SRC_GTIMA4_TRGO (SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 3 for External Event 8 */ +#define SHRTIM_EXEV9SRC_GTIMA7_TRGO (SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 3 for External Event 9 */ +#define SHRTIM_EXEV10SRC_GTIMA5_TRGO (SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 3 for External Event 10 */ +#define SHRTIM_EXEV1SRC_ADC1_AWD1 (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 4 for External Event 1 */ +#define SHRTIM_EXEV2SRC_ADC1_AWD2 (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 4 for External Event 2 */ +#define SHRTIM_EXEV3SRC_ADC1_AWD3 (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 4 for External Event 3 */ +#define SHRTIM_EXEV4SRC_ADC2_AWD1 (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 4 for External Event 4 */ +#define SHRTIM_EXEV5SRC_ADC2_AWD2 (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 4 for External Event 5 */ +#define SHRTIM_EXEV6SRC_ADC2_AWD3 (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 4 for External Event 6 */ +#define SHRTIM_EXEV7SRC_ADC3_AWD1 (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 4 for External Event 7 */ +#define SHRTIM_EXEV8SRC_ADC3_AWD2 (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 4 for External Event 8 */ +#define SHRTIM_EXEV9SRC_GTIMA3_TRGO (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 4 for External Event 9 */ +#define SHRTIM_EXEV10SRC_ADC3_AWD3 (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_0) /* External event source 4 for External Event 10 */ +#define SHRTIM1_EXEV1SRC_CAN2_RTP (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 1 */ +#define SHRTIM1_EXEV2SRC_CAN2_TMP (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 2 */ +#define SHRTIM1_EXEV3SRC_CAN2_SOC (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 3 */ +#define SHRTIM1_EXEV4SRC_CAN1_RTP (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 4 */ +#define SHRTIM1_EXEV5SRC_CAN1_TMP (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 5 */ +#define SHRTIM1_EXEV6SRC_CAN1_SOC (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 6 */ +#define SHRTIM2_EXEV1SRC_CAN4_RTP (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 1 */ +#define SHRTIM2_EXEV2SRC_CAN4_TMP (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 2 */ +#define SHRTIM2_EXEV3SRC_CAN4_SOC (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 3 */ +#define SHRTIM2_EXEV4SRC_CAN3_RTP (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 4 */ +#define SHRTIM2_EXEV5SRC_CAN3_TMP (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 5 */ +#define SHRTIM2_EXEV6SRC_CAN3_SOC (SHRTIM_EXEVCTRL1_EXEV1SRC_1 | SHRTIM_EXEVCTRL1_EXEV1SRC_1) /* External event source 4 for External Event 6 */ + + +/** Select the analog comparator of external event source 2 **/ +#define SHRTIM_EXEVXSRC2_COMP1_OUT 0x00000000U /* Compx is comp1 out*/ +#define SHRTIM_EXEVXSRC2_COMP2_OUT (SHRTIM_EXEVCTRL5_EXEV1CSEL_0) /* Compx is comp2 out */ +#define SHRTIM_EXEVXSRC2_COMP3_OUT (SHRTIM_EXEVCTRL5_EXEV1CSEL_1) /* Compx is comp3 out */ +#define SHRTIM_EXEVXSRC2_COMP4_OUT (SHRTIM_EXEVCTRL5_EXEV1CSEL_1 | SHRTIM_EXEVCTRL5_EXEV1CSEL_0) /* Compx is comp4 out */ +#define SHRTIM_EXEVXSRC2_COMP5_OUT (SHRTIM_EXEVCTRL5_EXEV1CSEL_2) /* Compx is comp5 out */ +#define SHRTIM_EXEVXSRC2_COMP6_OUT (SHRTIM_EXEVCTRL5_EXEV1CSEL_2 | SHRTIM_EXEVCTRL5_EXEV1CSEL_0) /* Compx is comp6 out */ +#define SHRTIM_EXEVXSRC2_COMP7_OUT (SHRTIM_EXEVCTRL5_EXEV1CSEL_2 | SHRTIM_EXEVCTRL5_EXEV1CSEL_1) /* Compx is comp7 out */ +#define SHRTIM_EXEVXSRC2_COMP_NONE (SHRTIM_EXEVCTRL5_EXEV1CSEL_2 | SHRTIM_EXEVCTRL5_EXEV1CSEL_1 | SHRTIM_EXEVCTRL5_EXEV1CSEL_0) /* No comparator */ + +/** Defining the polarity of an external event. **/ +#define SHRTIM_EXEV_POLARITY_HIGH 0x00000000U /* External event is active high */ +#define SHRTIM_EXEV_POLARITY_LOW (SHRTIM_EXEVCTRL1_EXEV1POL) /* External event is active low */ + + +/** Defining the sensitivity (level-sensitive or edge-sensitive) of an external event. **/ +#define SHRTIM_EXEV_SENSITIVITY_LEVEL 0x00000000U /* External event is active on level */ +#define SHRTIM_EXEV_SENSITIVITY_RISINGEDGE (SHRTIM_EXEVCTRL1_EXEV1SENS_0) /* External event is active on Rising edge */ +#define SHRTIM_EXEV_SENSITIVITY_FALLINGEDGE (SHRTIM_EXEVCTRL1_EXEV1SENS_1) /* External event is active on Falling edge */ +#define SHRTIM_EXEV_SENSITIVITY_BOTHEDGES (SHRTIM_EXEVCTRL1_EXEV1SENS_1 | SHRTIM_EXEVCTRL1_EXEV1SENS_0) /* External event is active on Rising and Falling edges */ + + +/** Defining whether or not an external event is programmed in fast mode. **/ +#define SHRTIM_EXEV_FASTMODE_DISABLE 0x00000000U /* External Event is re-synchronized by the SHRTIM logic before acting on outputs */ +#define SHRTIM_EXEV_FASTMODE_ENABLE (SHRTIM_EXEVCTRL3_EXEV1FM) /* External Event is acting asynchronously on outputs (low latency mode) */ + + +/** Defining the frequency used to sample an external event input (fSAMPLING) + and the length (N) of the digital filter applied. **/ +#define SHRTIM_EXEV_FILTER_NONE 0x00000000U /* Filter disabled */ +#define SHRTIM_EXEV_FILTER_1 (SHRTIM_EXEVCTRL3_EXEV1F_0) /* fSAMPLING = fSHRTIM, N=2 */ +#define SHRTIM_EXEV_FILTER_2 (SHRTIM_EXEVCTRL3_EXEV1F_1) /* fSAMPLING = fSHRTIM, N=4 */ +#define SHRTIM_EXEV_FILTER_3 (SHRTIM_EXEVCTRL3_EXEV1F_1 | SHRTIM_EXEVCTRL3_EXEV1F_0) /* fSAMPLING = fSHRTIM, N=8 */ +#define SHRTIM_EXEV_FILTER_4 (SHRTIM_EXEVCTRL3_EXEV1F_2) /* fSAMPLING = fEXEVS/2, N=6 */ +#define SHRTIM_EXEV_FILTER_5 (SHRTIM_EXEVCTRL3_EXEV1F_2 | SHRTIM_EXEVCTRL3_EXEV1F_0) /* fSAMPLING = fEXEVS/2, N=8 */ +#define SHRTIM_EXEV_FILTER_6 (SHRTIM_EXEVCTRL3_EXEV1F_2 | SHRTIM_EXEVCTRL3_EXEV1F_1) /* fSAMPLING = fEXEVS/4, N=6 */ +#define SHRTIM_EXEV_FILTER_7 (SHRTIM_EXEVCTRL3_EXEV1F_2 | SHRTIM_EXEVCTRL3_EXEV1F_1 | SHRTIM_EXEVCTRL3_EXEV1F_0) /* fSAMPLING = fEXEVS/4, N=8 */ +#define SHRTIM_EXEV_FILTER_8 (SHRTIM_EXEVCTRL3_EXEV1F_3) /* fSAMPLING = fEXEVS/8, N=6 */ +#define SHRTIM_EXEV_FILTER_9 (SHRTIM_EXEVCTRL3_EXEV1F_3 | SHRTIM_EXEVCTRL3_EXEV1F_0) /* fSAMPLING = fEXEVS/8, N=8 */ +#define SHRTIM_EXEV_FILTER_10 (SHRTIM_EXEVCTRL3_EXEV1F_3 | SHRTIM_EXEVCTRL3_EXEV1F_1) /* fSAMPLING = fEXEVS/16, N=5 */ +#define SHRTIM_EXEV_FILTER_11 (SHRTIM_EXEVCTRL3_EXEV1F_3 | SHRTIM_EXEVCTRL3_EXEV1F_1 | SHRTIM_EXEVCTRL3_EXEV1F_0) /* fSAMPLING = fEXEVS/16, N=6 */ +#define SHRTIM_EXEV_FILTER_12 (SHRTIM_EXEVCTRL3_EXEV1F_3 | SHRTIM_EXEVCTRL3_EXEV1F_2) /* fSAMPLING = fEXEVS/16, N=8 */ +#define SHRTIM_EXEV_FILTER_13 (SHRTIM_EXEVCTRL3_EXEV1F_3 | SHRTIM_EXEVCTRL3_EXEV1F_2 | SHRTIM_EXEVCTRL3_EXEV1F_0) /* fSAMPLING = fEXEVS/32, N=5 */ +#define SHRTIM_EXEV_FILTER_14 (SHRTIM_EXEVCTRL3_EXEV1F_3 | SHRTIM_EXEVCTRL3_EXEV1F_2 | SHRTIM_EXEVCTRL3_EXEV1F_1) /* fSAMPLING = fEXEVS/32, N=6 */ +#define SHRTIM_EXEV_FILTER_15 (SHRTIM_EXEVCTRL3_EXEV1F_3 | SHRTIM_EXEVCTRL3_EXEV1F_2 | SHRTIM_EXEVCTRL3_EXEV1F_1 | SHRTIM_EXEVCTRL3_EXEV1F_0) /* fSAMPLING = fEXEVS/32, N=8 */ + + +/** Defining division ratio between the timer clock frequency (fSHRTIM) and the external event signal sampling clock (fEXEVS) used by the digital filters. + */ +#define SHRTIM_EXEV_PRESCALER_DIV1 0x00000000U /* fEXEVS = fSHRTIM */ +#define SHRTIM_EXEV_PRESCALER_DIV2 (SHRTIM_EXEVCTRL4_EXEVSCD_0) /* fEXEVS = fSHRTIM / 2 */ +#define SHRTIM_EXEV_PRESCALER_DIV4 (SHRTIM_EXEVCTRL4_EXEVSCD_1) /* fEXEVS = fSHRTIM / 4 */ +#define SHRTIM_EXEV_PRESCALER_DIV8 (SHRTIM_EXEVCTRL4_EXEVSCD_1 | SHRTIM_EXEVCTRL4_EXEVSCD_0) /* fEXEVS = fSHRTIM / 8 */ + + +/** Defining the external event counter. **/ +#define SHRTIM_EXEV_COUNTER_A ((uint32_t)0U) /* External Event A Counter */ +#define SHRTIM_EXEV_COUNTER_B ((uint32_t)16U) /* External Event B Counter */ + + +/** Defining the external event reset mode. **/ +#define SHRTIM_EXEV_COUNTER_RSTMODE_UNCONDITIONAL ((uint32_t)0U) /* External Event counter is reset on each reset / roll-over event */ +#define SHRTIM_EXEV_COUNTER_RSTMODE_CONDITIONAL ((uint32_t)SHRTIM_TXEXEVFLT3_EXEVRSTM) /* External Event counter is reset on each reset / roll-over event only if no event occurs during last counting period */ + + +/** Defining whether a faults is be triggered by any external or internal fault source. **/ +#define SHRTIM_FALT_SRC_DIGITALINPUT 0x00000000U /* Fault source 1, Fault input is FLT input pin */ +#define SHRTIM_FALT_SRC_INTERNAL SHRTIM_FALTIN1_FALT1SRC0 /* Fault source 2, Fault input is FLT_Int signal (e.g. internal comparator) */ +#define SHRTIM_FALT_SRC_EXEVINPUT SHRTIM_FALTIN2_FALT1SRC1 /* Fault source 3, Fault input is external event pin */ +#define SHRTIM_FALT_SRC_DSMU SHRTIM_FALTIN2_FALT1SRC1 | SHRTIM_FALTIN2_FALT1SRC0/* Fault source 4, Fault input is DSMU */ + +/** Select the analog comparator of fault source 2. **/ +/** Select the analog comparator of external event source **/ +#define SHRTIM_FALTXSRC2_COMP1_OUT 0x00000000U /* Compx is comp1 out*/ +#define SHRTIM_FALTXSRC2_COMP2_OUT (SHRTIM_FALTIN5_FALT1CSEL_0) /* Compx is comp2 out */ +#define SHRTIM_FALTXSRC2_COMP3_OUT (SHRTIM_FALTIN5_FALT1CSEL_1) /* Compx is comp3 out */ +#define SHRTIM_FALTXSRC2_COMP4_OUT (SHRTIM_FALTIN5_FALT1CSEL_1 | SHRTIM_FALTIN5_FALT1CSEL_0) /* Compx is comp4 out */ +#define SHRTIM_FALTXSRC2_COMP5_OUT (SHRTIM_FALTIN5_FALT1CSEL_2) /* Compx is comp5 out */ +#define SHRTIM_FALTXSRC2_COMP6_OUT (SHRTIM_FALTIN5_FALT1CSEL_2 | SHRTIM_FALTIN5_FALT1CSEL_0) /* Compx is comp6 out */ +#define SHRTIM_FALTXSRC2_COMP7_OUT (SHRTIM_FALTIN5_FALT1CSEL_2 | SHRTIM_FALTIN5_FALT1CSEL_1) /* Compx is comp7 out */ +#define SHRTIM_FALTXSRC2_COMP_NONE (SHRTIM_FALTIN5_FALT1CSEL_2 | SHRTIM_FALTIN5_FALT1CSEL_1 | SHRTIM_FALTIN5_FALT1CSEL_0) /* No comparator */ + +/** Defining the polarity of a fault event. **/ +#define SHRTIM_FALT_POLARITY_LOW 0x00000000U /* Fault input is active low */ +#define SHRTIM_FALT_POLARITY_HIGH (SHRTIM_FALTIN1_FALT1POL) /* Fault input is active high */ + + +/** Defining the frequency used to sample the fault input (fSAMPLING) and the + length (N) of the digital filter applied. **/ +#define SHRTIM_FALT_FILTER_NONE 0x00000000U /* Filter disabled */ +#define SHRTIM_FALT_FILTER_1 (SHRTIM_FALTIN1_FALT1FLT_0) /* fSAMPLING= fSHRTIM, N=2 */ +#define SHRTIM_FALT_FILTER_2 (SHRTIM_FALTIN1_FALT1FLT_1) /* fSAMPLING= fSHRTIM, N=4 */ +#define SHRTIM_FALT_FILTER_3 (SHRTIM_FALTIN1_FALT1FLT_1 | SHRTIM_FALTIN1_FALT1FLT_0) /* fSAMPLING= fSHRTIM, N=8 */ +#define SHRTIM_FALT_FILTER_4 (SHRTIM_FALTIN1_FALT1FLT_2) /* fSAMPLING= fFALTS/2, N=6 */ +#define SHRTIM_FALT_FILTER_5 (SHRTIM_FALTIN1_FALT1FLT_2 | SHRTIM_FALTIN1_FALT1FLT_0) /* fSAMPLING= fFALTS/2, N=8 */ +#define SHRTIM_FALT_FILTER_6 (SHRTIM_FALTIN1_FALT1FLT_2 | SHRTIM_FALTIN1_FALT1FLT_1) /* fSAMPLING= fFALTS/4, N=6 */ +#define SHRTIM_FALT_FILTER_7 (SHRTIM_FALTIN1_FALT1FLT_2 | SHRTIM_FALTIN1_FALT1FLT_1 | SHRTIM_FALTIN1_FALT1FLT_0) /* fSAMPLING= fFALTS/4, N=8 */ +#define SHRTIM_FALT_FILTER_8 (SHRTIM_FALTIN1_FALT1FLT_3) /* fSAMPLING= fFALTS/8, N=6 */ +#define SHRTIM_FALT_FILTER_9 (SHRTIM_FALTIN1_FALT1FLT_3 | SHRTIM_FALTIN1_FALT1FLT_0) /* fSAMPLING= fFALTS/8, N=8 */ +#define SHRTIM_FALT_FILTER_10 (SHRTIM_FALTIN1_FALT1FLT_3 | SHRTIM_FALTIN1_FALT1FLT_1) /* fSAMPLING= fFALTS/16, N=5 */ +#define SHRTIM_FALT_FILTER_11 (SHRTIM_FALTIN1_FALT1FLT_3 | SHRTIM_FALTIN1_FALT1FLT_1 | SHRTIM_FALTIN1_FALT1FLT_0) /* fSAMPLING= fFALTS/16, N=6 */ +#define SHRTIM_FALT_FILTER_12 (SHRTIM_FALTIN1_FALT1FLT_3 | SHRTIM_FALTIN1_FALT1FLT_2) /* fSAMPLING= fFALTS/16, N=8 */ +#define SHRTIM_FALT_FILTER_13 (SHRTIM_FALTIN1_FALT1FLT_3 | SHRTIM_FALTIN1_FALT1FLT_2 | SHRTIM_FALTIN1_FALT1FLT_0) /* fSAMPLING= fFALTS/32, N=5 */ +#define SHRTIM_FALT_FILTER_14 (SHRTIM_FALTIN1_FALT1FLT_3 | SHRTIM_FALTIN1_FALT1FLT_2 | SHRTIM_FALTIN1_FALT1FLT_1) /* fSAMPLING= fFALTS/32, N=6 */ +#define SHRTIM_FALT_FILTER_15 (SHRTIM_FALTIN1_FALT1FLT_3 | SHRTIM_FALTIN1_FALT1FLT_2 | SHRTIM_FALTIN1_FALT1FLT_1 | SHRTIM_FALTIN1_FALT1FLT_0) /* fSAMPLING= fFALTS/32, N=8 */ + + +/** Defining the division ratio between the timer clock frequency (fSHRTIM) and the fault signal sampling clock (fFALTS) used by the digital filters. **/ +#define SHRTIM_FALT_PRESCALER_DIV1 0x00000000U /* fFALTS = fSHRTIM */ +#define SHRTIM_FALT_PRESCALER_DIV2 (SHRTIM_FALTIN2_FALTSCD_0) /* fFALTS = fSHRTIM / 2 */ +#define SHRTIM_FALT_PRESCALER_DIV4 (SHRTIM_FALTIN2_FALTSCD_1) /* fFALTS = fSHRTIM / 4 */ +#define SHRTIM_FALT_PRESCALER_DIV8 (SHRTIM_FALTIN2_FALTSCD_1 | SHRTIM_FALTIN2_FALTSCD_0) /* fFALTS = fSHRTIM / 8 */ + +/** Defining the Blanking Source of a fault event. **/ +#define SHRTIM_FALT_BLANKING_RSTALIGNED 0x00000000U /* Fault blanking source is Reset-aligned */ +#define SHRTIM_FALT_BLANKING_MOVING (SHRTIM_FALTIN3_FALT1BLKS) /* Fault blanking source is Moving window */ + +#define SHRTIM_SYSTEM_FAULT_SHRPLLLOCKFAULT SHRTIM_FALTIN2_SFALTSPLLEN /* The flash ECC double detection error as SHRTIM system fault input enable */ +#define SHRTIM_SYSTEM_FAULT_PVD SHRTIM_FALTIN2_SFALTPVDEN /* The PVD error as SHRTIM system fault input enable */ +#define SHRTIM_SYSTEM_FAULT_LOCKUP SHRTIM_FALTIN2_SFALTLOCKUPEN /* The core lockup as SHRTIM system fault input enable */ +#define SHRTIM_SYSTEM_FAULT_SRAMPARITY SHRTIM_FALTIN2_SFALTSMPAREN /* The sram parity error as SHRTIM system fault input enable */ +#define SHRTIM_SYSTEM_FAULT_SRAMECC SHRTIM_FALTIN2_SFALTSMECCEN /* The sram ECC error as SHRTIM system fault input enable */ +#define SHRTIM_SYSTEM_FAULT_CLOCKSECURITY SHRTIM_FALTIN2_SFALTCKSECEN /* The clock security system error as SHRTIM system fault input enable */ + +/** Defining the Counter Reset Mode of a fault event. **/ +#define SHRTIM_FALT_COUNTERRST_UNCONDITIONAL 0x00000000U /* Fault counter is reset on each reset / roll-over event */ +#define SHRTIM_FALT_COUNTERRST_CONDITIONAL (SHRTIM_FALTIN3_FALT1RSTM) /* Fault counter is reset on each reset / roll-over event only if no fault occurred during last counting period. */ + + +/** Defining if the burst mode is entered once or if it is continuously operating. **/ +#define SHRTIM_BM_MODE_SINGLESHOT 0x00000000U /* Burst mode operates in single shot mode */ +#define SHRTIM_BM_MODE_CONTINOUS (SHRTIM_BMCTRL_BMOM) /* Burst mode operates in continuous mode */ + + +/** Defining the clock source for the burst mode counter. **/ +#define SHRTIM_BM_CLKSRC_MASTER 0x00000000U /* Master timer counter reset/roll-over is used as clock source for the burst mode counter */ +#define SHRTIM_BM_CLKSRC_TIMER_A (SHRTIM_BMCTRL_BMCK_0) /* Timer A counter reset/roll-over is used as clock source for the burst mode counter */ +#define SHRTIM_BM_CLKSRC_TIMER_B (SHRTIM_BMCTRL_BMCK_1) /* Timer B counter reset/roll-over is used as clock source for the burst mode counter */ +#define SHRTIM_BM_CLKSRC_TIMER_C (SHRTIM_BMCTRL_BMCK_1 | SHRTIM_BMCTRL_BMCK_0) /* Timer C counter reset/roll-over is used as clock source for the burst mode counter */ +#define SHRTIM_BM_CLKSRC_TIMER_D (SHRTIM_BMCTRL_BMCK_2) /* Timer D counter reset/roll-over is used as clock source for the burst mode counter */ +#define SHRTIM_BM_CLKSRC_TIMER_E (SHRTIM_BMCTRL_BMCK_2 | SHRTIM_BMCTRL_BMCK_0) /* Timer E counter reset/roll-over is used as clock source for the burst mode counter */ +#define SHRTIM_BM_CLKSRC_TIMER_F (SHRTIM_BMCTRL_BMCK_3 | SHRTIM_BMCTRL_BMCK_1 | SHRTIM_BMCTRL_BMCK_0)/* Timer F counter reset/roll-over is used as clock source for the burst mode counter */ +#define SHRTIM_BM_CLKSRC_GTIMB1_OC1 (SHRTIM_BMCTRL_BMCK_2 | SHRTIM_BMCTRL_BMCK_1) /* On-chip Event 1 (BMClk[1]), acting as a burst mode counter clock */ +#define SHRTIM_BM_CLKSRC_GTIMB2_OC1 (SHRTIM_BMCTRL_BMCK_2 | SHRTIM_BMCTRL_BMCK_1 | SHRTIM_BMCTRL_BMCK_0)/* On-chip Event 2 (BMClk[2]), acting as a burst mode counter clock */ +#define SHRTIM_BM_CLKSRC_GTIMB3_OC1 (SHRTIM_BMCTRL_BMCK_3) /* On-chip Event 3 (BMClk[3]), acting as a burst mode counter clock */ +#define SHRTIM_BM_CLKSRC_BTIM1_TRGO (SHRTIM_BMCTRL_BMCK_3 | SHRTIM_BMCTRL_BMCK_0) /* On-chip Event 4 (BMClk[4]), acting as a burst mode counter clock */ +#define SHRTIM_BM_CLKSRC_FSHRTIM (SHRTIM_BMCTRL_BMCK_3 | SHRTIM_BMCTRL_BMCK_1) /* Prescaled fSHRTIM clock is used as clock source for the burst mode counter */ + + +/** Defining the prescaling ratio of the fSHRTIM clock for the burst mode controller (fBRST). **/ +#define SHRTIM_BM_PRESCALER_DIV1 0x00000000U /* fBRST = 1*/ +#define SHRTIM_BM_PRESCALER_DIV2 (SHRTIM_BMCTRL_BMPSC_0) /* fBRST = fSHRTIM/2*/ +#define SHRTIM_BM_PRESCALER_DIV4 (SHRTIM_BMCTRL_BMPSC_1) /* fBRST = fSHRTIM/4*/ +#define SHRTIM_BM_PRESCALER_DIV8 (SHRTIM_BMCTRL_BMPSC_1 | SHRTIM_BMCTRL_BMPSC_0) /* fBRST = fSHRTIM/8*/ +#define SHRTIM_BM_PRESCALER_DIV16 (SHRTIM_BMCTRL_BMPSC_2) /* fBRST = fSHRTIM/16*/ +#define SHRTIM_BM_PRESCALER_DIV32 (SHRTIM_BMCTRL_BMPSC_2 | SHRTIM_BMCTRL_BMPSC_0) /* fBRST = fSHRTIM/32*/ +#define SHRTIM_BM_PRESCALER_DIV64 (SHRTIM_BMCTRL_BMPSC_2 | SHRTIM_BMCTRL_BMPSC_1) /* fBRST = fSHRTIM/64*/ +#define SHRTIM_BM_PRESCALER_DIV128 (SHRTIM_BMCTRL_BMPSC_2 | SHRTIM_BMCTRL_BMPSC_1 | SHRTIM_BMCTRL_BMPSC_0) /* fBRST = fSHRTIM/128*/ +#define SHRTIM_BM_PRESCALER_DIV256 (SHRTIM_BMCTRL_BMPSC_3) /* fBRST = fSHRTIM/256*/ +#define SHRTIM_BM_PRESCALER_DIV512 (SHRTIM_BMCTRL_BMPSC_3 | SHRTIM_BMCTRL_BMPSC_0) /* fBRST = fSHRTIM/512*/ +#define SHRTIM_BM_PRESCALER_DIV1024 (SHRTIM_BMCTRL_BMPSC_3 | SHRTIM_BMCTRL_BMPSC_1) /* fBRST = fSHRTIM/1024*/ +#define SHRTIM_BM_PRESCALER_DIV2048 (SHRTIM_BMCTRL_BMPSC_3 | SHRTIM_BMCTRL_BMPSC_1 | SHRTIM_BMCTRL_BMPSC_0) /* fBRST = fSHRTIM/2048*/ +#define SHRTIM_BM_PRESCALER_DIV4096 (SHRTIM_BMCTRL_BMPSC_3 | SHRTIM_BMCTRL_BMPSC_2) /* fBRST = fSHRTIM/4096*/ +#define SHRTIM_BM_PRESCALER_DIV8192 (SHRTIM_BMCTRL_BMPSC_3 | SHRTIM_BMCTRL_BMPSC_2 | SHRTIM_BMCTRL_BMPSC_0) /* fBRST = fSHRTIM/8192*/ +#define SHRTIM_BM_PRESCALER_DIV16384 (SHRTIM_BMCTRL_BMPSC_3 | SHRTIM_BMCTRL_BMPSC_2 | SHRTIM_BMCTRL_BMPSC_1) /* fBRST = fSHRTIM/16384*/ +#define SHRTIM_BM_PRESCALER_DIV32768 (SHRTIM_BMCTRL_BMPSC_3 | SHRTIM_BMCTRL_BMPSC_2 | SHRTIM_BMCTRL_BMPSC_1 | SHRTIM_BMCTRL_BMPSC_0)/* fBRST = fSHRTIM/32768*/ + + +/** Defining the events that can be used to trig the burst mode operation. **/ +#define SHRTIM_BM_TRIG_NONE 0x00000000U /* No trigger */ +#define SHRTIM_BM_TRIG_MASTER_RESET (SHRTIM_BMTG_MRSTRO) /* Master timer reset event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_MASTER_REPETITION (SHRTIM_BMTG_MREPT) /* Master timer repetition event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_MASTER_CMP1 (SHRTIM_BMTG_MCMP1) /* Master timer compare 1 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_MASTER_CMP2 (SHRTIM_BMTG_MCMP2) /* Master timer compare 2 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_MASTER_CMP3 (SHRTIM_BMTG_MCMP3) /* Master timer compare 3 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_MASTER_CMP4 (SHRTIM_BMTG_MCMP4) /* Master timer compare 4 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMA_RESET (SHRTIM_BMTG_TARSTRO) /* Timer A reset event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMA_REPETITION (SHRTIM_BMTG_TAREPT) /* Timer A repetition event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMA_CMP1 (SHRTIM_BMTG_TACMP1) /* Timer A compare 1 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMA_CMP2 (SHRTIM_BMTG_TACMP2) /* Timer A compare 2 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMB_RESET (SHRTIM_BMTG_TBRSTRO) /* Timer B reset event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMB_REPETITION (SHRTIM_BMTG_TBREPT) /* Timer B repetition event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMB_CMP1 (SHRTIM_BMTG_TBCMP1) /* Timer B compare 1 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMB_CMP2 (SHRTIM_BMTG_TBCMP2) /* Timer B compare 2 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMC_RESET (SHRTIM_BMTG_TCRSTRO) /* Timer C resetevent is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMC_REPETITION (SHRTIM_BMTG_TCREPT) /* Timer C repetition event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMC_CMP1 (SHRTIM_BMTG_TCCMP1) /* Timer C compare 1 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMD_RESET (SHRTIM_BMTG_TDRSTRO) /* Timer D reset event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMD_REPETITION (SHRTIM_BMTG_TDREPT) /* Timer D repetition event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMD_CMP2 (SHRTIM_BMTG_TDCMP2) /* Timer D compare 2 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIME_REPETITION (SHRTIM_BMTG_TEREPT) /* Timer E repetition event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIME_CMP1 (SHRTIM_BMTG_TECMP1) /* Timer E compare 1 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIME_CMP2 (SHRTIM_BMTG_TECMP2) /* Timer E compare 2 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMF_RESET (SHRTIM_BMTG_TFRSTRO) /* Timer F reset event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMF_REPETITION (SHRTIM_BMTG_TFREPT) /* Timer F repetition event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMF_CMP1 (SHRTIM_BMTG_TFCMP1) /* Timer F compare 1 event is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMA_EVENT7 (SHRTIM_BMTG_TAPRDEXEV7) /* Timer A period following an external event 7 (conditioned by TIMA filters) is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_TIMD_EVENT8 (SHRTIM_BMTG_TDPRDEXEV8) /* Timer D period following an external event 8 (conditioned by TIMD filters) is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_EVENT_7 (SHRTIM_BMTG_EXEV7) /* External event 7 conditioned by TIMA filters is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_EVENT_8 (SHRTIM_BMTG_EXEV8) /* External event 8 conditioned by TIMD filters is starting the burst mode operation */ +#define SHRTIM_BM_TRIG_EVENT_ONCHIP (SHRTIM_BMTG_OCEV) /* A rising edge on an on-chip Event (for instance from GP timer or comparator) triggers the burst mode operation */ + + +/** Defining the operating state of the burst mode controller. **/ +#define SHRTIM_BM_STATUS_NORMAL 0x00000000U /* Normal operation */ +#define SHRTIM_BM_STATUS_BURST_ONGOING SHRTIM_BMCTRL_BMSTS /* Burst operation on-going */ + + +/** Defining the Counter Up Down Mode. **/ +#define SHRTIM_COUNTING_MODE_UP 0x00000000U /* counter is operating in up-counting mode */ +#define SHRTIM_COUNTING_MODE_UP_DOWN SHRTIM_TXCTRL2_UPDOWNM /* counter is operating in up-down counting mode */ + + +/** Defining the Roll-Over counter Mode. **/ +#define SHRTIM_ROLLOVER_MODE_PER 2U /* Event generated when counter reaches period value ('crest' mode) */ +#define SHRTIM_ROLLOVER_MODE_RST 1U /* Event generated when counter equals 0 ('valley' mode) */ +#define SHRTIM_ROLLOVER_MODE_BOTH 0U /* Event generated when counter reach both conditions (0 or SHRTIM_PERxR value) */ + + +/** Ddefining how the timer counter operates. **/ +#define SHRTIM_TRIGHALF_DISABLED 0x00000000U /* Timer Compare 2 register is behaving in standard mode */ +#define SHRTIM_TRIGHALF_ENABLED SHRTIM_TXCTRL2_TRGHLF /* Timer Compare 2 register is behaving in triggered-half mode */ + + +/** Defining the greater than compare 1 or 3 PWM Mode. **/ +#define SHRTIM_GTCMP1_EQUAL 0x00000000U /* event is generated when counter is equal to compare value */ +#define SHRTIM_GTCMP1_GREATER SHRTIM_TXCTRL2_GTCMP1 /* event is generated when counter is greater than compare value */ +#define SHRTIM_GTCMP3_EQUAL 0x00000000U /* event is generated when counter is equal to compare value */ +#define SHRTIM_GTCMP3_GREATER SHRTIM_TXCTRL2_GTCMP3 /* event is generated when counter is greater than compare value */ + + +/** Enabling the Dual DAC Reset trigger mechanism. **/ +#define SHRTIM_DUDACEN_DISABLED 0x00000000U /* Dual DAC trigger is generated on counter reset or roll-over event */ +#define SHRTIM_DUDACEN_ENABLED SHRTIM_TXCTRL2_DUDACEN /* Dual DAC trigger is generated on output 1 set event */ + + +/** Defining the Dual DAC Reset trigger. **/ +#define SHRTIM_DUDACRST_COUNTER 0x00000000U /* Dual DAC trigger is generated on counter reset or roll-over event */ +#define SHRTIM_DUDACRST_OUT1SET SHRTIM_TXCTRL2_DUDACRST /* Dual DAC trigger is generated on output 1 set event */ + + +/** Defining the Dual DAC Step trigger. **/ +#define SHRTIM_DUDACSTEP_CMP2 0x00000000U /* trigger is generated on compare 2 event */ +#define SHRTIM_DUDACSTEP_OUT1RST SHRTIM_TXCTRL2_DUDACSTEP /* trigger is generated on output 1 reset event */ + +#define SHRTIM_AUXOUTPUT_DEFAULT 0x00000000U /* Default Auxiliary output follows main outpput */ +#define SHRTIM_AUXOUTPUT_FOLLOW_CROSSBAR SHRTIM_EXTEND_AUXBYPA_1 /* Auxiliary output follows cross bar */ +#define SHRTIM_AUXOUTPUT_FOLLOW_MAINOUTPUT (SHRTIM_EXTEND_AUXBYPA_1 | SHRTIM_EXTEND_AUXBYPA_0)/* Auxiliary output follows main output */ +#define SHRITM_AUXOUTPUT_BYPASS SHRTIM_EXTEND_AUXBYPA /* Auxiliary output bypass */ + +/** Defining the some bit position **/ +#define SHRTIM_MCTRL_MCNTEN_Pos (16U) +#define SHRTIM_MCTRL_TACNTEN_Pos (17U) +#define SHRTIM_CTRL2_MSWCNTRST_Pos (8U) +#define SHRTIM_CTRL2_SWAPA_Pos (16U) +#define SHRTIM_TXCPT1_UDSTS1_Pos (16U) +#define SHRTIM_TXCPT2_UDSTS2_Pos (16U) +#define SHRTIM_TXCTRL2_ROM_Pos (6U) +#define SHRTIM_TXCTRL2_FEROM_Pos (14U) +#define SHRTIM_TXCTRL2_BMROM_Pos (12U) +#define SHRTIM_TXCTRL2_ADCROM_Pos (10U) +#define SHRTIM_TXCTRL2_OUTROM_Pos (8U) +#define SHRTIM_TXCTRL2_UPDOWNM_Pos (4U) +#define SHRTIM_TXEXEVFLT3_EXEVCNT_Pos (8U) +#define SHRTIM_TXEXEVFLT3_EXEVSEL_Pos (4U) +#define SHRTIM_TXDT_DTF_Pos (16U) +#define SHRTIM_TXINTSTS_O1DIPSTS_Pos (18U) +#define SHRTIM_TXINTSTS_O1BCKUP_Pos (20U) + + +/** +*\*\brief Write a value in SHRTIM register +*\*\param __INSTANCE__ SHRTIM Instance +*\*\param __REG__ Register to be written +*\*\param __VALUE__ Value to be written in the register +*\*\retval None + */ +#define SHRTIM_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** +*\*\brief Read a value in SHRTIM register +*\*\param __INSTANCE__ SHRTIM Instance +*\*\param __REG__ Register to be read +*\*\retval Register value + */ +#define SHRTIM_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) + +/**** Function declaration start ***/ +void SHRTIM_SetSyncInSrc(SHRTIM_Module *SHRTIMx, uint32_t SyncInSrc); +uint32_t SHRTIM_GetSyncInSrc(SHRTIM_Module *SHRTIMx); +void SHRTIM_ConfigSyncOut(SHRTIM_Module *SHRTIMx, uint32_t Config, uint32_t Src); +void SHRTIM_SetSyncOutConfig(SHRTIM_Module *SHRTIMx, uint32_t SyncOutConfig); +uint32_t SHRTIM_GetSyncOutConfig(SHRTIM_Module *SHRTIMx); +void SHRTIM_SetSyncOutSrc(SHRTIM_Module *SHRTIMx, uint32_t SyncOutSrc); +uint32_t SHRTIM_GetSyncOutSrc(SHRTIM_Module *SHRTIMx); +void SHRTIM_SuspendUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timers); +void SHRTIM_ResumeUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timers); +void SHRTIM_ForceUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timers); +void SHRTIM_CounterReset(SHRTIM_Module *SHRTIMx, uint32_t Timers); +void SHRTIM_EnableSwapOutputs(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableSwapOutputs(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledSwapOutputs(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableOutput(SHRTIM_Module *SHRTIMx, uint32_t Outputs); +void SHRTIM_DisableOutput(SHRTIM_Module *SHRTIMx, uint32_t Outputs); +uint32_t SHRTIM_IsEnabledOutput(SHRTIM_Module *SHRTIMx, uint32_t Output); +uint32_t SHRTIM_IsDisabledOutput(SHRTIM_Module *SHRTIMx, uint32_t Output); +void SHRTIM_ConfigADCTrig(SHRTIM_Module *SHRTIMx, uint32_t ADCTrigSrcReg, uint32_t ADCTrig, uint32_t Update, uint32_t Src); +void SHRTIM_SetADCTrigUpdate(SHRTIM_Module *SHRTIMx, uint32_t ADCTrig, uint32_t Update); +uint32_t SHRTIM_GetADCTrigUpdate(SHRTIM_Module *SHRTIMx, uint32_t ADCTrig); +void SHRTIM_SetADCTrigSrc(SHRTIM_Module *SHRTIMx, uint32_t ADCTrigSrcReg, uint32_t Src); +uint32_t SHRTIM_GetADCTrigSrc(SHRTIM_Module *SHRTIMx, uint32_t ADCTrigSrcReg); +void SHRTIM_SetADCPostScaler(SHRTIM_Module *SHRTIMx, uint32_t ADCTrig, uint32_t PostScaler); +uint32_t SHRTIM_GetADCPostScaler(SHRTIM_Module *SHRTIMx, uint32_t ADCTrig); +void SHRTIM_TIM_CounterEnable(SHRTIM_Module *SHRTIMx, uint32_t Timers); +void SHRTIM_TIM_CounterDisable(SHRTIM_Module *SHRTIMx, uint32_t Timers); +uint32_t SHRTIM_TIM_IsCounterEnabled(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Prescaler); +uint32_t SHRTIM_TIM_GetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetCounterMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetCounterMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_EnableHalfMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_DisableHalfMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_IsEnabledHalfMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_EnableResyncUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_DisableResyncUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_IsEnabledResyncUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetInterleavedMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetInterleavedMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_EnableStartOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_DisableStartOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_IsEnabledStartOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_EnableResetOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_DisableResetOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_IsEnabledResetOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetDACTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t DACTrig); +uint32_t SHRTIM_TIM_GetDACTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_EnablePreload(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_DisablePreload(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_IsEnabledPreload(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetUpdateTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t UpdateTrig); +uint32_t SHRTIM_TIM_GetUpdateTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetUpdateGating(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t UpdateGating); +uint32_t SHRTIM_TIM_GetUpdateGating(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_EnablePushPullMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_DisablePushPullMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_IsEnabledPushPullMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetCompareMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareUnit, + uint32_t Mode); +uint32_t SHRTIM_TIM_GetCompareMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareUnit); +void SHRTIM_TIM_SetCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Counter); +uint32_t SHRTIM_TIM_GetCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetPeriod(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Period); +uint32_t SHRTIM_TIM_GetPeriod(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetRepetition(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Repetition); +uint32_t SHRTIM_TIM_GetRepetition(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetCompare1(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareValue); +uint32_t SHRTIM_TIM_GetCompare1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetCompare2(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareValue); +uint32_t SHRTIM_TIM_GetCompare2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetCompare3(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareValue); +uint32_t SHRTIM_TIM_GetCompare3(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetCompare4(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareValue); +uint32_t SHRTIM_TIM_GetCompare4(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetCompare5(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareValue); +uint32_t SHRTIM_TIM_GetCompare5(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetResetTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t ResetTrig); +uint32_t SHRTIM_TIM_GetResetTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_GetCapture1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_GetCapture1Direction(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_GetCapture2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_GetCapture2Direction(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetCaptureTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CaptureUnit, + uint64_t CaptureTrig); +uint64_t SHRTIM_TIM_GetCaptureTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CaptureUnit); +void SHRTIM_TIM_EnableDeadTime(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_DisableDeadTime(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_IsEnabledDeadTime(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetDPMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t DPMode); +uint32_t SHRTIM_TIM_GetDPMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_EnableDP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_DisableDP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_IsEnabledDP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_EnableBIAR(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_DisableBIAR(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_IsEnabledBIAR(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_EnableSoftDP(SHRTIM_Module *SHRTIMx, uint32_t SoftDP); +uint32_t SHRTIM_TIM_IsEnabledSoftDP(SHRTIM_Module *SHRTIMx, uint32_t SoftDP); +void SHRTIM_TIM_EnableFault(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Faults); +void SHRTIM_TIM_DisableFault(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Faults); +uint32_t SHRTIM_TIM_IsEnabledFault(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Fault); +void SHRTIM_TIM_LockFault(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetBurstModeOption(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t BurtsModeOption); +uint32_t SHRTIM_TIM_GetBurstModeOption(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_ConfigBurstDMA(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Registers); +uint32_t SHRTIM_TIM_GetCurrentPushPullStatus(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_GetIdlePushPullStatus(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_EnableEventWindowSelection(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_DisbleEventWindowSelection(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetEventFilter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Event, uint32_t Filter); +uint32_t SHRTIM_TIM_GetEventFilter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Event); +void SHRTIM_TIM_SetEventLatchStatus(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Event, + uint32_t LatchStatus); +uint32_t SHRTIM_TIM_GetEventLatchStatus(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Event); +void SHRTIM_TIM_SetTriggeredHalfMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetTriggeredHalfMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetComp1Mode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetComp1Mode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetComp3Mode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetComp3Mode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetFaultEventRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetFaultEventRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetBMRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetBMRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetADCRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetADCRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetOutputRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetOutputRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetCountingMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetCountingMode(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetDualDacResetTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetDualDacResetTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetDualDacStepTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode); +uint32_t SHRTIM_TIM_GetDualDacStepTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_EnableDualDacTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_DisableDualDacTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_TIM_IsEnabledDualDacTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_TIM_SetEventCounterThreshold(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter, + uint32_t Threshold); +uint32_t SHRTIM_TIM_GetEventCounterThreshold(SHRTIM_Module *SHRTIMx, uint32_t Timer, + uint32_t EventCounter); +void SHRTIM_TIM_SetEventCounterSource(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter, + uint32_t Event); +uint32_t SHRTIM_TIM_GetEventCounterSource(SHRTIM_Module *SHRTIMx, uint32_t Timer, + uint32_t EventCounter); +void SHRTIM_TIM_SetEventCounterResetMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter, + uint32_t Mode); +uint32_t SHRTIM_TIM_GetEventCounterResetMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, + uint32_t EventCounter); +void SHRTIM_TIM_ResetEventCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter); +void SHRTIM_TIM_EnableEventCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter); +void SHRTIM_TIM_DisableEventCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter); +uint32_t SHRTIM_TIM_IsEnabledEventCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer, + uint32_t EventCounter); +void SHRTIM_DT_Config(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Configuration); +void SHRTIM_DT_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Prescaler); +uint32_t SHRTIM_DT_GetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DT_SetRisingValue(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t RisingValue); +uint32_t SHRTIM_DT_GetRisingValue(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DT_SetRisingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t RisingSign); +uint32_t SHRTIM_DT_GetRisingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DT_SetFallingValue(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t FallingValue); +uint32_t SHRTIM_DT_GetFallingValue(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DT_SetFallingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t FallingSign); +uint32_t SHRTIM_DT_GetFallingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DT_LockRising(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DT_LockRisingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DT_LockFalling(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DT_LockFallingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_CHP_Config(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Configuration); +void SHRTIM_CHP_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Prescaler); +uint32_t SHRTIM_CHP_GetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_CHP_SetDutyCycle(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t DutyCycle); +uint32_t SHRTIM_CHP_GetDutyCycle(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_CHP_SetPulseWidth(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t PulseWidth); +uint32_t SHRTIM_CHP_GetPulseWidth(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_OUT_SetOutputSetSrc(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t SetSrc); +uint32_t SHRTIM_OUT_GetOutputSetSrc(SHRTIM_Module *SHRTIMx, uint32_t Output); +void SHRTIM_OUT_SetOutputResetSrc(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t ResetSrc); +uint32_t SHRTIM_OUT_GetOutputResetSrc(SHRTIM_Module *SHRTIMx, uint32_t Output); +void SHRTIM_OUT_Config(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t Configuration); +void SHRTIM_OUT_SetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t Polarity); +uint32_t SHRTIM_OUT_GetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Output); +void SHRTIM_OUT_SetIdleLevel(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t IdleLevel); +uint32_t SHRTIM_OUT_GetIdleLevel(SHRTIM_Module *SHRTIMx, uint32_t Output); +void SHRTIM_OUT_SetFaultState(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t FaultState); +uint32_t SHRTIM_OUT_GetFaultState(SHRTIM_Module *SHRTIMx, uint32_t Output); +void SHRTIM_OUT_SetChopperMode(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t ChopperMode); +uint32_t SHRTIM_OUT_GetChopperMode(SHRTIM_Module *SHRTIMx, uint32_t Output); +void SHRTIM_OUT_SetBMEntryMode(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t BMEntryMode); +uint32_t SHRTIM_OUT_GetBMEntryMode(SHRTIM_Module *SHRTIMx, uint32_t Output); +uint32_t SHRTIM_OUT_GetDPOutStatus(SHRTIM_Module *SHRTIMx, uint32_t Output); +void SHRTIM_OUT_ForceLevel(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t OutputLevel); +uint32_t SHRTIM_OUT_GetLevel(SHRTIM_Module *SHRTIMx, uint32_t Output); +void SHRTIM_EXEV_Config(SHRTIM_Module *SHRTIMx, uint32_t Event, + uint32_t Src, uint32_t SrcCompSel, uint32_t Polarity, + uint32_t Sensitivity, uint32_t FastMode, uint32_t Filter, uint32_t Prescaler); +void SHRTIM_EXEV_SetSrc(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t Src); +uint32_t SHRTIM_EXEV_GetSrc(SHRTIM_Module *SHRTIMx, uint32_t Event); +void SHRTIM_EXEV_SetSrcCompSel(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t SrcCompSel); +uint32_t SHRTIM_EXEV_GetSrcCompSel(SHRTIM_Module *SHRTIMx, uint32_t Event); +void SHRTIM_EXEV_SetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t Polarity); +uint32_t SHRTIM_EXEV_GetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Event); +void SHRTIM_EXEV_SetSensitivity(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t Sensitivity); +uint32_t SHRTIM_EXEV_GetSensitivity(SHRTIM_Module *SHRTIMx, uint32_t Event); +void SHRTIM_EXEV_SetFastMode(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t FastMode); +uint32_t SHRTIM_EXEV_GetFastMode(SHRTIM_Module *SHRTIMx, uint32_t Event); +void SHRTIM_EXEV_SetFilter(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t Filter); +uint32_t SHRTIM_EXEV_GetFilter(SHRTIM_Module *SHRTIMx, uint32_t Event); +void SHRTIM_EXEV_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Prescaler); +uint32_t SHRTIM_EXEV_GetPrescaler(SHRTIM_Module *SHRTIMx); +void SHRTIM_FALT_Config(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Configuration, uint32_t SrcCompSel); +void SHRTIM_FALT_SetSrc(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Src); +uint32_t SHRTIM_FALT_GetSrc(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_SetSrcCompSel(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t SrcCompSel); +uint32_t SHRTIM_FALT_GetSrcCompSel(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_SetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Polarity); +uint32_t SHRTIM_FALT_GetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_SetFilter(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Filter); +uint32_t SHRTIM_FALT_GetFilter(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Prescaler); +uint32_t SHRTIM_FALT_GetPrescaler(SHRTIM_Module *SHRTIMx); +void SHRTIM_FALT_Lock(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_Enable(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_Disable(SHRTIM_Module *SHRTIMx, uint32_t Fault); +uint32_t SHRTIM_FALT_IsEnabled(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_EnableSysFault(SHRTIM_Module *SHRTIMx, uint32_t SysFault); +uint32_t SHRTIM_FALT_IsEnabledSysFault(SHRTIM_Module *SHRTIMx, uint32_t SysFault); +void SHRTIM_FALT_EnableBlanking(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_DisableBlanking(SHRTIM_Module *SHRTIMx, uint32_t Fault); +uint32_t SHRTIM_FALT_IsEnabledBlanking(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_SetBlankingSrc(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Source); +uint32_t SHRTIM_FALT_GetBlankingSrc(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_SetCounterThreshold(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Threshold); +uint32_t SHRTIM_FALT_GetCounterThreshold(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_EnableSoftFault(SHRTIM_Module *SHRTIMx, uint32_t Fault); +uint32_t SHRTIM_FALT_IsEnabledSoftFault(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_SetResetMode(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Mode); +uint32_t SHRTIM_FALT_GetResetMode(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_FALT_ResetCounter(SHRTIM_Module *SHRTIMx, uint32_t Fault); +void SHRTIM_BM_Config(SHRTIM_Module *SHRTIMx, uint32_t Configuration); +void SHRTIM_BM_SetMode(SHRTIM_Module *SHRTIMx, uint32_t Mode); +uint32_t SHRTIM_BM_GetMode(SHRTIM_Module *SHRTIMx); +void SHRTIM_BM_SetClockSrc(SHRTIM_Module *SHRTIMx, uint32_t ClockSrc); +uint32_t SHRTIM_BM_GetClockSrc(SHRTIM_Module *SHRTIMx); +void SHRTIM_BM_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Prescaler); +uint32_t SHRTIM_BM_GetPrescaler(SHRTIM_Module *SHRTIMx); +void SHRTIM_BM_EnablePreload(SHRTIM_Module *SHRTIMx); +void SHRTIM_BM_DisablePreload(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_BM_IsEnabledPreload(SHRTIM_Module *SHRTIMx); +void SHRTIM_BM_SetTrig(SHRTIM_Module *SHRTIMx, uint32_t Trig); +uint32_t SHRTIM_BM_GetTrig(SHRTIM_Module *SHRTIMx); +void SHRTIM_BM_SetCompare(SHRTIM_Module *SHRTIMx, uint32_t CompareValue); +uint32_t SHRTIM_BM_GetCompare(SHRTIM_Module *SHRTIMx); +void SHRTIM_BM_SetPeriod(SHRTIM_Module *SHRTIMx, uint32_t Period); +uint32_t SHRTIM_BM_GetPeriod(SHRTIM_Module *SHRTIMx); +void SHRTIM_BM_Enable(SHRTIM_Module *SHRTIMx); +void SHRTIM_BM_Disable(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_BM_IsEnabled(SHRTIM_Module *SHRTIMx); +void SHRTIM_BM_Start(SHRTIM_Module *SHRTIMx); +void SHRTIM_BM_Stop(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_BM_GetStatus(SHRTIM_Module *SHRTIMx); +void SHRTIM_ClearFlag_FALT1(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsActiveFlag_FALT1(SHRTIM_Module *SHRTIMx); +void SHRTIM_ClearFlag_FALT2(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsActiveFlag_FALT2(SHRTIM_Module *SHRTIMx); +void SHRTIM_ClearFlag_FALT3(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsActiveFlag_FALT3(SHRTIM_Module *SHRTIMx); +void SHRTIM_ClearFlag_FALT4(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsActiveFlag_FALT4(SHRTIM_Module *SHRTIMx); +void SHRTIM_ClearFlag_FALT5(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsActiveFlag_FALT5(SHRTIM_Module *SHRTIMx); +void SHRTIM_ClearFlag_FALT6(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsActiveFlag_FALT6(SHRTIM_Module *SHRTIMx); +void SHRTIM_ClearFlag_SYSFALT(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsActiveFlag_SYSFALT(SHRTIM_Module *SHRTIMx); +void SHRTIM_ClearFlag_BMPRD(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsActiveFlag_BMPRD(SHRTIM_Module *SHRTIMx); +void SHRTIM_ClearFlag_SYNC(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsActiveFlag_SYNC(SHRTIM_Module *SHRTIMx); +void SHRTIM_ClearFlag_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_CMP5(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_CMP5(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_ClearFlag_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsActiveFlag_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_FALT1(SHRTIM_Module *SHRTIMx); +void SHRTIM_DisableIT_FALT1(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsEnabledIT_FALT1(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableIT_FALT2(SHRTIM_Module *SHRTIMx); +void SHRTIM_DisableIT_FALT2(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsEnabledIT_FALT2(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableIT_FALT3(SHRTIM_Module *SHRTIMx); +void SHRTIM_DisableIT_FALT3(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsEnabledIT_FALT3(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableIT_FALT4(SHRTIM_Module *SHRTIMx); +void SHRTIM_DisableIT_FALT4(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsEnabledIT_FALT4(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableIT_FALT5(SHRTIM_Module *SHRTIMx); +void SHRTIM_DisableIT_FALT5(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsEnabledIT_FALT5(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableIT_FALT6(SHRTIM_Module *SHRTIMx); +void SHRTIM_DisableIT_FALT6(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsEnabledIT_FALT6(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableIT_SYSFALT(SHRTIM_Module *SHRTIMx); +void SHRTIM_DisableIT_SYSFALT(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsEnabledIT_SYSFALT(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableIT_BMPRD(SHRTIM_Module *SHRTIMx); +void SHRTIM_DisableIT_BMPRD(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsEnabledIT_BMPRD(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableIT_SYNC(SHRTIM_Module *SHRTIMx); +void SHRTIM_DisableIT_SYNC(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsEnabledIT_SYNC(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableIT_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableIT_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableIT_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledIT_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_SYNC(SHRTIM_Module *SHRTIMx); +void SHRTIM_DisableDMAReq_SYNC(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsEnabledDMAReq_SYNC(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableDMAReq_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_EnableDMAReq_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDMAReq_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDMAReq_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDebugHaltAllTimers(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableDebugHaltAllTimers(SHRTIM_Module *SHRTIMx); +uint32_t SHRTIM_IsEnabledDebugHaltAllTimers(SHRTIM_Module *SHRTIMx); +void SHRTIM_EnableDebugHaltTimer(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_DisableDebugHaltTimer(SHRTIM_Module *SHRTIMx, uint32_t Timer); +uint32_t SHRTIM_IsEnabledDebugHaltTimer(SHRTIM_Module *SHRTIMx, uint32_t Timer); +void SHRTIM_SetAuxliaryBypass(SHRTIM_Module *SHRTIMx, uint32_t AuxBypa); +uint32_t SHRTIM_GetAuxliaryBypass(SHRTIM_Module *SHRTIMx); +/**** Function declaration end ***/ + +#ifdef __cplusplus +} +#endif + +#endif /* N32H76X_78X_SHRTIM_H */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_smu.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_smu.h new file mode 100644 index 0000000000..515b575421 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_smu.h @@ -0,0 +1,93 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_smu.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_SMU_H__ +#define __N32H76X_78X_SMU_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/** n32h76x_78x_StdPeriph_Driver **/ + +/** SMU_Exported_Constants **/ + +/** USART Macro Definition Start **/ +#define FLASH_SUCCESS 0 +#define FLASH_FAILED 1 + +#define SMU_SUCCESS 0x1000 +#define SMU_ERR 0x101B + +#define GET_M4ADDR (0x1ff00601) +#define SET_M4ADDR (0x1ff00631) +#define GET_M7ADDR (0x1ff005c1) +#define SET_M7ADDR (0x1ff00501) +#define WR_FLASH (0x1fff7b81) +#define ER_FLASH (0x1fff7c81) + +uint32_t SMU_GetM4BootAddr( void ); +uint32_t SMU_SetM4BootAddr( uint32_t addr ); +uint32_t SMU_GetM7BootAddr( void ); +uint32_t SMU_SetM7BootAddr( uint32_t addr ); +uint32_t SMU_EraseFlash(uint32_t StrAddr); +uint32_t SMU_WriteFlash(uint32_t StrAddr, uint8_t *SrcBuf, uint32_t Len); + +#ifdef __cplusplus +} +#endif + +#endif /*__N32H76X_78X_SMU_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_spi.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_spi.h new file mode 100644 index 0000000000..480cf442f4 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_spi.h @@ -0,0 +1,359 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_spi.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __n32h76x_78x_SPI_H__ +#define __n32h76x_78x_SPI_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + + +/** SPI Init structure definition */ + +typedef struct +{ + uint16_t DataDirection; /*!< Specifies the SPI unidirectional or bidirectional data mode. + This parameter can be a value of @ref SPI_data_direction */ + + uint16_t SpiMode; /*!< Specifies the SPI operating mode. + This parameter can be a value of @ref SPI_mode */ + + uint16_t DataLen; /*!< Specifies the SPI data size. + This parameter can be a value of @ref SPI_data_size */ + + uint16_t CLKPOL; /*!< Specifies the serial clock steady state. + This parameter can be a value of @ref SPI_Clock_Polarity */ + + uint16_t CLKPHA; /*!< Specifies the clock active edge for the bit capture. + This parameter can be a value of @ref SPI_Clock_Phase */ + + uint16_t NSS; /*!< Specifies whether the NSS signal is managed by + hardware (NSS pin) or by software using the SSI bit. + This parameter can be a value of @ref SPI_Slave_Select_management */ + + uint16_t BaudRatePres; /*!< Specifies the Baud Rate prescaler value which will be + used to configure the transmit and receive SCK clock. + This parameter can be a value of @ref SPI_BaudRate_Prescaler. + @note The communication clock is derived from the master + clock. The slave clock does not need to be set. */ + + uint16_t FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. + This parameter can be a value of @ref SPI_MSB_LSB_transmission */ + + uint16_t CRCPoly; /*!< Specifies the polynomial used for the CRC calculation. */ +} SPI_InitType; + +/** SPI_Exported_Constants **/ + +#define IS_SPI_PERIPH(PERIPH) (((PERIPH) == SPI1) || \ + ((PERIPH) == SPI2) || \ + ((PERIPH) == SPI3) || \ + ((PERIPH) == SPI4) || \ + ((PERIPH) == SPI5) || \ + ((PERIPH) == SPI6) || \ + ((PERIPH) == SPI7)) + +#define IS_SPI_2OR3_PERIPH(PERIPH) (((PERIPH) == SPI2) || ((PERIPH) == SPI3)) + +/** SPI_data_direction **/ +#define SPI_DIR_MASK ((uint16_t)0x1FFFU) +#define SPI_DIR_DOUBLELINE_FULLDUPLEX ((uint16_t)0x0000U) +#define SPI_DIR_DOUBLELINE_RONLY ((uint16_t)0x2000U) +#define SPI_DIR_DOUBLELINE_TONLY ((uint16_t)0x4000U) +#define SPI_DIR_SINGLELINE_RX ((uint16_t)0x8000U) +#define SPI_DIR_SINGLELINE_TX ((uint16_t)0xC000U) +#define IS_SPI_DIR_MODE(MODE) \ + (((MODE) == SPI_DIR_DOUBLELINE_FULLDUPLEX) || ((MODE) == SPI_DIR_DOUBLELINE_RONLY) \ + ((MODE) == SPI_DIR_DOUBLELINE_TONLY) || ((MODE) == SPI_DIR_SINGLELINE_RX) \ + || ((MODE) == SPI_DIR_SINGLELINE_TX)) + +/** SPI_mode **/ + +#define SPI_MODE_MASTER ((uint16_t)0x0840U) +#define SPI_MODE_SLAVE ((uint16_t)0x0000U) +#define IS_SPI_MODE(MODE) (((MODE) == SPI_MODE_MASTER) || ((MODE) == SPI_MODE_SLAVE)) + + +/** SPI_data_size **/ + +#define SPI_DATA_SIZE_16BITS ((uint16_t)0x0100U) +#define SPI_DATA_SIZE_8BITS ((uint16_t)0x0000U) +#define IS_SPI_DATASIZE(DATASIZE) (((DATASIZE) == SPI_DATA_SIZE_16BITS) || ((DATASIZE) == SPI_DATA_SIZE_8BITS)) + + +/** SPI_Clock_Polarity **/ + +#define SPI_CLKPOL_LOW ((uint16_t)0x0000U) +#define SPI_CLKPOL_HIGH ((uint16_t)0x0010U) +#define IS_SPI_CLKPOL(CPOL) (((CPOL) == SPI_CLKPOL_LOW) || ((CPOL) == SPI_CLKPOL_HIGH)) + + +/** SPI_Clock_Phase **/ + +#define SPI_CLKPHA_FIRST_EDGE ((uint16_t)0x0000U) +#define SPI_CLKPHA_SECOND_EDGE ((uint16_t)0x0020U) +#define IS_SPI_CLKPHA(CPHA) (((CPHA) == SPI_CLKPHA_FIRST_EDGE) || ((CPHA) == SPI_CLKPHA_SECOND_EDGE)) + +/** SPI_Slave_Select_management **/ + +#define SPI_NSS_SOFT ((uint16_t)0x1000U) +#define SPI_NSS_HARD ((uint16_t)0x0000U) +#define IS_SPI_NSS(NSS) (((NSS) == SPI_NSS_SOFT) || ((NSS) == SPI_NSS_HARD)) + + +/** SPI_BaudRate_Prescaler **/ + +#define SPI_BR_PRESCALER_2 ((uint16_t)0x0000U) +#define SPI_BR_PRESCALER_4 ((uint16_t)0x0001U) +#define SPI_BR_PRESCALER_8 ((uint16_t)0x0002U) +#define SPI_BR_PRESCALER_16 ((uint16_t)0x0003U) +#define SPI_BR_PRESCALER_32 ((uint16_t)0x0004U) +#define SPI_BR_PRESCALER_64 ((uint16_t)0x0005U) +#define SPI_BR_PRESCALER_128 ((uint16_t)0x0006U) +#define SPI_BR_PRESCALER_256 ((uint16_t)0x0007U) +#define IS_SPI_BR_PRESCALER(PRESCALER) \ + (((PRESCALER) == SPI_BR_PRESCALER_2) || ((PRESCALER) == SPI_BR_PRESCALER_4) \ + || ((PRESCALER) == SPI_BR_PRESCALER_8) || ((PRESCALER) == SPI_BR_PRESCALER_16) \ + || ((PRESCALER) == SPI_BR_PRESCALER_32) || ((PRESCALER) == SPI_BR_PRESCALER_64) \ + || ((PRESCALER) == SPI_BR_PRESCALER_128) || ((PRESCALER) == SPI_BR_PRESCALER_256)) \ + +/** SPI_MSB_LSB_transmission **/ + +#define SPI_FB_MSB ((uint16_t)0x0000U) +#define SPI_FB_LSB ((uint16_t)0x0080U) +#define IS_SPI_FIRST_BIT(BIT) (((BIT) == SPI_FB_MSB) || ((BIT) == SPI_FB_LSB)) + + +/** @defgroup SPI_CRC_Calculation SPI CRC Calculation + * @{ + */ +#define SPI_CRCCALCULATION_DISABLE ((uint16_t)0x0000U) +#define SPI_CRCCALCULATION_ENABLE SPI_CTRL2_CRCEN +#define IS_SPI_CRC_CALCULATION(CALCULATION) (((CALCULATION) == SPI_CRCCALCULATION_DISABLE) || \ + ((CALCULATION) == SPI_CRCCALCULATION_ENABLE)) + +/** SPI_I2S_DMA_transfer_requests **/ +#define SPI_I2S_DMA_TX ((uint16_t)0x0004U) +#define SPI_I2S_DMA_RX ((uint16_t)0x0002U) +#define IS_SPI_I2S_DMA(DMAREQ) ((((DMAREQ) & (uint16_t)0xFFFCU) == 0x00) && ((DMAREQ) != 0x00)) + + +/** SPI_NSS_internal_software_management **/ + +#define SPI_NSS_HIGH ((uint16_t)0x0800U) +#define SPI_NSS_LOW ((uint16_t)0x0000U) +#define IS_SPI_NSS_LEVEL(INTERNAL) (((INTERNAL) == SPI_NSS_HIGH) || ((INTERNAL) == SPI_NSS_LOW)) + + +/** SPI_CRC_Transmit_Receive **/ + +#define SPI_CRC_TX ((uint8_t)0x00U) +#define SPI_CRC_RX ((uint8_t)0x01U) +#define IS_SPI_CRC(CRC) (((CRC) == SPI_CRC_TX) || ((CRC) == SPI_CRC_RX)) + + +/** SPI_direction_transmit_receive **/ + +#define SPI_BIDIRECTION_RX ((uint16_t)0xBFFFU) +#define SPI_BIDIRECTION_TX ((uint16_t)0x4000U) +#define IS_SPI_BIDIRECTION(DIRECTION) (((DIRECTION) == SPI_BIDIRECTION_RX) || ((DIRECTION) == SPI_BIDIRECTION_TX)) + + +/** SPI_I2S_interrupts_definition **/ + +#define SPI_I2S_INT_TE ((uint8_t)0x40) +#define SPI_I2S_INT_RNE ((uint8_t)0x51) +#define SPI_I2S_INT_ERR ((uint8_t)0x60) +#define SPI_I2S_INT_RXONLYC ((uint8_t)0xEC) +#define SPI_I2S_INT_RXFIFOF ((uint8_t)0xCB) +#define SPI_I2S_INT_RXFIFOHF ((uint8_t)0xB9) +#define SPI_I2S_INT_TXFIFOHE ((uint8_t)0xA8) +#define SPI_I2S_INT_MODERR ((uint8_t)0x64) +#define SPI_I2S_INT_CRCERR ((uint8_t)0x63) +#define SPI_I2S_INT_OVERERR ((uint8_t)0x65) +#define SPI_I2S_INT_UNDER ((uint8_t)0x66) +#define IS_SPI_I2S_CONFIG_INT(IT) (((IT) == SPI_I2S_INT_TE) || ((IT) == SPI_I2S_INT_RNE) || \ + ((IT) == SPI_I2S_INT_RXFIFOF) || ((IT) == SPI_I2S_INT_RXFIFOHF)|| \ + ((IT) == SPI_I2S_INT_TXFIFOHE)|| ((IT) == SPI_I2S_INT_RXONLYC) || \ + ((IT) == SPI_I2S_INT_ERR)) + + +#define IS_SPI_I2S_GET_INT(IT) (((IT) == SPI_I2S_INT_RNE) || ((IT) == SPI_I2S_INT_TE) || \ + ((IT) == I2S_I2S_INT_UNDER) || ((IT) == SPI_I2S_INT_CRCERR) || \ + ((IT) == SPI_I2S_INT_MODERR) || ((IT) == SPI_I2S_INT_OVERERR)) + +/** SPI_I2S_flags_definition **/ +#define SPI_I2S_TE_FLAG ((uint16_t)0x0001U) +#define SPI_I2S_RNE_FLAG ((uint16_t)0x0002U) +#define SPI_I2S_BUSY_FLAG ((uint16_t)0x0004U) +#define SPI_CRCERR_FLAG ((uint16_t)0x0008U) +#define SPI_MODERR_FLAG ((uint16_t)0x0010U) +#define SPI_I2S_OVER_FLAG ((uint16_t)0x0020U) +#define I2S_UNDER_FLAG ((uint16_t)0x0040U) +#define I2S_CHSIDE_FLAG ((uint16_t)0x0080U) +#define SPI_I2S_TXFIFOHE_FLAG ((uint16_t)0x0100U) +#define SPI_I2S_RXFIFOHF_FLAG ((uint16_t)0x0200U) +#define SPI_I2S_TXFIFOE_FLAG ((uint16_t)0x0400U) +#define SPI_I2S_RXFIFOF_FLAG ((uint16_t)0x0800U) +#define SPI_I2S_RXONLYC_FLAG ((uint16_t)0x1000U) + +#define IS_SPI_I2S_CLR_FLAG(FLAG) (((FLAG) == SPI_CRCERR_FLAG)) +#define IS_SPI_I2S_GET_FLAG(FLAG) ( \ + ((FLAG) == SPI_I2S_BUSY_FLAG) || ((FLAG) == SPI_I2S_OVER_FLAG) || \ + ((FLAG) == SPI_MODERR_FLAG) || ((FLAG) == SPI_CRCERR_FLAG) || \ + ((FLAG) == I2S_UNDER_FLAG) || ((FLAG) == I2S_CHSIDE_FLAG) || \ + ((FLAG) == SPI_I2S_TE_FLAG) || ((FLAG) == SPI_I2S_RNE_FLAG) || \ + ((FLAG) == SPI_I2S_RXONLYC_FLAG ) || ((FLAG) == SPI_I2S_RXFIFOF_FLAG) || \ + ((FLAG) == SPI_I2S_TXFIFOE_FLAG) || ((FLAG) == SPI_I2S_RXFIFOHF_FLAG) || \ + ((FLAG) == SPI_I2S_TXFIFOHE_FLAG)) + +/** SPI_I2S_FIFO_Ctrl_definition **/ + +#define SPI_I2S_FIFO_CLR ((uint16_t)0x0200U) +#define SPI_I2S_FIFO_Enable ((uint16_t)0x0100U) +#define SPI_I2S_FIFO_Disable ((uint16_t)0xFEFFU) +#define IS_SPI_I2S_FIFO_CTRL(CTRL) (((CTRL) == SPI_I2S_FIFO_CLR) || ((CTRL) == SPI_I2S_FIFO_Enable) || \ + ((CTRL) == SPI_I2S_FIFO_Disable)) + +/** SPI_RX_FIFO_Level **/ + +#define SPI_RX_FIF0NUM_7 ((uint16_t)0x0070U) +#define SPI_RX_FIF0NUM_6 ((uint16_t)0x0060U) +#define SPI_RX_FIF0NUM_5 ((uint16_t)0x0050U) +#define SPI_RX_FIF0NUM_4 ((uint16_t)0x0040U) +#define SPI_RX_FIF0NUM_3 ((uint16_t)0x0030U) +#define SPI_RX_FIF0NUM_2 ((uint16_t)0x0020U) +#define SPI_RX_FIF0NUM_1 ((uint16_t)0x0010U) +#define SPI_RX_FIF0NUM_0 ((uint16_t)0x0000U) +#define IS_SPI_RX_FIFO_NUM(NUM) (((NSS) == SPI_RX_FIF0NUM_0) || \ + ((NSS) == SPI_RX_FIF0NUM_1) || \ + ((NSS) == SPI_RX_FIF0NUM_2) || \ + ((NSS) == SPI_RX_FIF0NUM_3) || \ + ((NSS) == SPI_RX_FIF0NUM_4) || \ + ((NSS) == SPI_RX_FIF0NUM_5) || \ + ((NSS) == SPI_RX_FIF0NUM_6) || \ + ((NSS) == SPI_RX_FIF0NUM_7)) + +/** SPI_TX_FIFO_Level **/ + +#define SPI_TX_FIF0NUM_7 ((uint16_t)0x0007U) +#define SPI_TX_FIF0NUM_6 ((uint16_t)0x0006U) +#define SPI_TX_FIF0NUM_5 ((uint16_t)0x0005U) +#define SPI_TX_FIF0NUM_4 ((uint16_t)0x0004U) +#define SPI_TX_FIF0NUM_3 ((uint16_t)0x0003U) +#define SPI_TX_FIF0NUM_2 ((uint16_t)0x0002U) +#define SPI_TX_FIF0NUM_1 ((uint16_t)0x0001U) +#define SPI_TX_FIF0NUM_0 ((uint16_t)0x0000U) +#define IS_SPI_TX_FIFO_NUM(NUM) (((NSS) == SPI_TX_FIF0NUM_0) || \ + ((NSS) == SPI_TX_FIF0NUM_1) || \ + ((NSS) == SPI_TX_FIF0NUM_2) || \ + ((NSS) == SPI_TX_FIF0NUM_3) || \ + ((NSS) == SPI_TX_FIF0NUM_4) || \ + ((NSS) == SPI_TX_FIF0NUM_5) || \ + ((NSS) == SPI_TX_FIF0NUM_6) || \ + ((NSS) == SPI_TX_FIF0NUM_7)) + + +/** SPI_CRC_polynomial **/ + +#define IS_SPI_CRC_POLYNOMIAL(POLYNOMIAL) ((POLYNOMIAL) >= 0x1) + + +/** SPI_Exported_Functions **/ + +void SPI_I2S_DeInit(const SPI_Module* SPIx); +void SPI_Init(SPI_Module* SPIx,const SPI_InitType* SPI_InitStruct); +void SPI_InitStruct(SPI_InitType* SPI_InitStruct); +void SPI_Enable(SPI_Module* SPIx, FunctionalState Cmd); +void SPI_I2S_EnableInt(SPI_Module* SPIx, uint8_t SPI_I2S_IT, FunctionalState Cmd); +void SPI_I2S_EnableDma(SPI_Module* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState Cmd); +void SPI_I2S_TransmitData(SPI_Module* SPIx, uint16_t Data); +uint16_t SPI_I2S_ReceiveData(const SPI_Module* SPIx); +void SPI_SetNssLevel(SPI_Module* SPIx, uint16_t SPI_NSSInternalSoft); +void SPI_SSOutputEnable(SPI_Module* SPIx, FunctionalState Cmd); +void SPI_ConfigDataLen(SPI_Module* SPIx, uint16_t DataLen); +void SPI_TransmitCrcNext(SPI_Module* SPIx, FunctionalState Cmd); +void SPI_EnableCalculateCrc(SPI_Module* SPIx, FunctionalState Cmd); +uint16_t SPI_GetCRCDat(const SPI_Module* SPIx, uint8_t SPI_CRC); +uint16_t SPI_GetCRCPoly(const SPI_Module* SPIx); +void SPI_ConfigBidirectionalMode(SPI_Module* SPIx, uint16_t DataDirection); +FlagStatus SPI_I2S_GetStatus(const SPI_Module* SPIx, uint16_t SPI_I2S_FLAG); +void SPI_I2S_ClrCRCErrFlag(SPI_Module* SPIx, uint16_t SPI_I2S_FLAG); +INTStatus SPI_I2S_GetIntStatus(const SPI_Module* SPIx, uint8_t SPI_I2S_IT); +void SPI_I2S_ClrITPendingBit(SPI_Module* SPIx, uint8_t SPI_I2S_IT); +void SPI_I2S_FIFO_Cmd(SPI_Module* SPIx, FunctionalState NewState); +void SPI_I2S_ClearFIFOBit(SPI_Module* SPIx, uint16_t SPI_I2S_FIFO_Clear); +void SPI_RxFIFOSizeConfig(SPI_Module* SPIx, uint16_t SPI_FIFOSize); +void SPI_TxFIFOSizeConfig(SPI_Module* SPIx, uint16_t SPI_FIFOSize); +uint16_t SPI_GetFIFOLevel(SPI_Module* SPIx); +uint16_t SPI_RX_FIFO_CNT_GET(const SPI_Module* SPIx); +uint16_t SPI_TX_FIFO_CNT_GET(const SPI_Module* SPIx); +void SPI_TRANSNUM_SET(SPI_Module* SPIx, uint16_t Data); +uint16_t SPI_TRANSNUM_GET(const SPI_Module* SPIx); +void SPI_DELAYTIME_SET(SPI_Module* SPIx, uint16_t Data); +uint16_t SPI_DELAYTIME_GET(const SPI_Module* SPIx); +void SPI_RX_FIFO_SET(SPI_Module* SPIx, uint16_t Data); +uint16_t SPI_RX_FIFO_GET(const SPI_Module* SPIx); +void SPI_SetCRCPoly(SPI_Module* SPIx, uint16_t SpiCrcPoly); +void SPIModeSelect(SPI_Module* SPIx); +void SPI_SetDataDirection(SPI_Module* SPIx, uint16_t DataDirection); +#ifdef __cplusplus +} +#endif + +#endif /*__n32h76x_78x_SPI_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_tim.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_tim.h new file mode 100644 index 0000000000..3e2975c0ce --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_tim.h @@ -0,0 +1,946 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_tim.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76x_78x_TIM_H +#define __N32H76x_78x_TIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/*** TIM Structure Definition Start ***/ + +/** TIM Init structure definition is used with ATIM and GPTIM. **/ +typedef struct +{ + uint32_t Prescaler; /* Specifies the prescaler value used to divide the TIM clock. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint32_t CounterMode; /* Specifies the counter mode. + This parameter can be a value of TIM_Counter_Mode */ + + uint32_t Period; /* Specifies the period value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter must be a number between 0x0000 and 0xFFFF. */ + + uint32_t ClkDiv; /* Specifies the clock division. + This parameter can be a value of TIM_Clock_Division_CKD */ + + uint32_t RepetCnt; /* Specifies the repetition counter value. Each time the RCR downcounter + reaches zero, an update event is generated and counting restarts + from the RCR value (N). + This means in PWM mode that (N+1) corresponds to: + - the number of PWM periods in edge-aligned mode + - the number of half PWM period in center-aligned mode + This parameter must be a number between 0x00 and 0xFF. + This parameter is valid only for ATIM. */ + + uint32_t CapCh1Sel; /* Channel 1 select capture in */ + + uint32_t CapCh2Sel; /* Channel 2 select capture in */ + + uint32_t CapCh3Sel; /* Channel 3 select capture in */ + + uint32_t CapCh4Sel; /* Channel 4 select capture in */ + + uint32_t EtrOrClr; /* ETR or CLR select as ocrefclear source */ + + uint32_t CapEtrClrSel; /* ocrefclear(ETR/CLR) select capture in */ +} TIM_TimeBaseInitType; + +/** TIM Output Compare Init structure definition **/ +typedef struct +{ + uint32_t OCMode; /* Specifies the TIM mode. + This parameter can be a value of TIM_Output_Compare_and_PWM_modes */ + + uint32_t OutputState; /* Specifies the TIM Output Compare state. + This parameter can be a value of TIM_Output_Compare_state */ + + uint32_t OutputNState; /* Specifies the TIM complementary Output Compare state. + This parameter can be a value of TIM_Output_Compare_N_state + This parameter is valid for ATIM and GTIMB1-10. */ + + uint32_t Pulse; /* Specifies the pulse value to be loaded into the Capture_Compare_Register. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint32_t OCPolarity; /* Specifies the output polarity. + This parameter can be a value of TIM_Output_Compare_Polarity */ + + uint32_t OCNPolarity; /* Specifies the complementary output polarity. + This parameter can be a value of TIM_Output_Compare_N_Polarity + This parameter is valid for ATIM and GTIMB1-10. */ + + uint32_t OCIdleState; /* Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of TIM_Output_Compare_Idle_State + This parameter is valid for ATIM and GTIMB1-10. */ + + uint32_t OCNIdleState; /* Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of TIM_Output_Compare_N_Idle_State + This parameter is valid for ATIM and GTIMB1-10. */ +} OCInitType; + +/** TIM Input Capture Init structure definition **/ +typedef struct +{ + + uint32_t Channel; /* Specifies the TIM channel. + This parameter can be a value of TIM_Channel */ + + uint32_t ICPolarity; /* Specifies the active edge of the input signal. + This parameter can be a value of TIM_Input_Capture_Polarity */ + + uint32_t ICSelection; /* Specifies the input. + This parameter can be a value of TIM_Input_Capture_Selection */ + + uint32_t ICPrescaler; /* Specifies the Input Capture Prescaler. + This parameter can be a value of TIM_Input_Capture_Prescaler */ + + uint32_t ICFilter; /* Specifies the input capture filter. + This parameter can be a number between 0x0 and 0xF */ +} TIM_ICInitType; + +/** BDTR structure definition is used only with TIM1 **/ +typedef struct +{ + + uint32_t OSSRState; /* Specifies the Off-State selection used in Run mode. + This parameter can be a value of OSSR_Off_State_Selection_for_Run_mode_state */ + + uint32_t OSSIState; /* Specifies the Off-State used in Idle state. + This parameter can be a value of OSSI_Off_State_Selection_for_Idle_mode_state */ + + uint32_t LOCKLevel; /* Specifies the LOCK level parameters. + This parameter can be a value of Lock_level */ + + uint32_t DeadTime; /* Specifies the delay time between the switching-off and the + switching-on of the outputs. + This parameter can be a number between 0x00 and 0xFF */ + + uint32_t Break; /* Specifies whether the TIM Break input is enabled or not. + This parameter can be a value of Break_Input_enable_disable */ + + uint32_t BreakPolarity; /* Specifies the TIM Break Input pin polarity. + This parameter can be a value of Break_Polarity */ + + uint32_t AutomaticOutput; /* Specifies whether the TIM Automatic Output feature is enabled or not. + This parameter can be a value of TIM_AOE_Bit_Set_Reset */ + + uint32_t Bidirection; /* Specifies whether the bidirectional break input enabled or disabled. + This parameter can be a value of Enable or disable */ + + uint32_t Break2; /* Specifies whether the TIM Break2 input is enabled or not. + This parameter can be a value of Break2_Input_enable_disable */ + + uint32_t Break2Polarity; /* Specifies the TIM Break2 Input pin polarity. + This parameter can be a value of Break2_Polarity */ + + uint32_t Bidirection2; /* Specifies whether the bidirectional break2 input enabled or disabled. + This parameter can be a value of Enable or disable */ + +} TIM_BDTRInitType; + +/** Filter structure definition **/ +typedef struct +{ + uint32_t ThreshHold; /* Specifies the threshold value of filter, the range is [0, 64]. */ + + uint32_t WindowSize; /* Specifies the window size value of filter, the range is [0, 63]. */ + + uint32_t Prescaler; /* Specifies the prescaler value of filter, the range is [0, 65535] */ +}TIM_FiltInitType; + +/*** TIM Structure Definition End ***/ + +/*** TIM Macro Definition Start ***/ + +/** TIM register bit mask definition **/ +#define TIM_REG_BIT_MASK ((uint32_t)0x00000000) + +/** Whether it is an ATIM1-3 device **/ +#define IS_ATIM1_4_DEVICE(DEVICE) (((DEVICE) == ATIM1) || \ + ((DEVICE) == ATIM2) || \ + ((DEVICE) == ATIM3) || \ + ((DEVICE) == ATIM4)) + +/** Whether it is an GTIMA1-7 device **/ +#define IS_GTIMA1_7_DEVICE(DEVICE) (((DEVICE) == GTIMA1) || \ + ((DEVICE) == GTIMA2) || \ + ((DEVICE) == GTIMA3) || \ + ((DEVICE) == GTIMA4) || \ + ((DEVICE) == GTIMA5) || \ + ((DEVICE) == GTIMA6) || \ + ((DEVICE) == GTIMA7)) + +/** Whether it is an GTIMB1-10 device **/ +#define IS_GTIMB1_3_DEVICE(DEVICE) (((DEVICE) == GTIMB1) || \ + ((DEVICE) == GTIMB2) || \ + ((DEVICE) == GTIMB3)) +/** Whether it is an BTIM1-2 device **/ +#define IS_BTIM1_2_DEVICE(DEVICE) (((DEVICE) == BTIM1) || \ + ((DEVICE) == BTIM2)) + +/** TIM_External_Trigger_Prescaler **/ +#define TIM_EXT_TRG_PSC_OFF (TIM_REG_BIT_MASK) +#define TIM_EXT_TRG_PSC_DIV2 (TIM_SMCTRL_EXTPS_0) +#define TIM_EXT_TRG_PSC_DIV4 (TIM_SMCTRL_EXTPS_1) +#define TIM_EXT_TRG_PSC_DIV8 (TIM_SMCTRL_EXTPS) + +/** TIM_External_Trigger_Polarity **/ +#define TIM_EXT_TRIG_POLARITY_INVERTED (TIM_SMCTRL_EXTP) +#define TIM_EXT_TRIG_POLARITY_NONINVERTED (TIM_REG_BIT_MASK) + + +/** TIM_Counter_Mode **/ +#define TIM_CNT_MODE_UP (TIM_REG_BIT_MASK) +#define TIM_CNT_MODE_DOWN (TIM_CTRL1_DIR) +#define TIM_CNT_MODE_CENTER_ALIGN1 (TIM_CTRL1_CAMSEL_0) +#define TIM_CNT_MODE_CENTER_ALIGN2 (TIM_CTRL1_CAMSEL_1) +#define TIM_CNT_MODE_CENTER_ALIGN3 (TIM_CTRL1_CAMSEL) + +/** TIM_Clock_Division_CKD **/ +#define TIM_CLK_DIV1 (TIM_REG_BIT_MASK) +#define TIM_CLK_DIV2 (TIM_CTRL1_CLKD_0) +#define TIM_CLK_DIV4 (TIM_CTRL1_CLKD_1) + +/** TIM_Prescaler_Reload_Mode **/ +#define TIM_PSC_RELOAD_MODE_UPDATE (TIM_REG_BIT_MASK) +#define TIM_PSC_RELOAD_MODE_IMMEDIATE (TIM_EVTGEN_UDGN) + +/** Channel 1/2/3/4 & OCxclr select capture in **/ +#define TIM_CAPCH1SEL_0 (TIM_REG_BIT_MASK) +#define TIM_CAPCH1SEL_1 (TIM_INSEL_TI1S_0) +#define TIM_CAPCH1SEL_2 (TIM_INSEL_TI1S_1) +#define TIM_CAPCH1SEL_3 (TIM_INSEL_TI1S_0 | TIM_INSEL_TI1S_1) +#define TIM_CAPCH1SEL_4 (TIM_INSEL_TI1S_2) +#define TIM_CAPCH1SEL_5 (TIM_INSEL_TI1S_0 | TIM_INSEL_TI1S_2) +#define TIM_CAPCH1SEL_6 (TIM_INSEL_TI1S_1 | TIM_INSEL_TI1S_2) +#define TIM_CAPCH1SEL_7 (TIM_INSEL_TI1S_0 | TIM_INSEL_TI1S_1 | TIM_INSEL_TI1S_2) + +#define TIM_CAPCH2SEL_0 (TIM_REG_BIT_MASK) +#define TIM_CAPCH2SEL_1 (TIM_INSEL_TI2S_0) +#define TIM_CAPCH2SEL_2 (TIM_INSEL_TI2S_1) +#define TIM_CAPCH2SEL_3 (TIM_INSEL_TI2S_0 | TIM_INSEL_TI2S_1) +#define TIM_CAPCH2SEL_4 (TIM_INSEL_TI2S_2) +#define TIM_CAPCH2SEL_TIMXCAPLSE (TIM_CTRL1_C2SEL) + +#define TIM_CAPCH3SEL_0 (TIM_REG_BIT_MASK) +#define TIM_CAPCH3SEL_1 (TIM_INSEL_TI3S_0) +#define TIM_CAPCH3SEL_TIMXCAPLSI (TIM_CTRL1_C3SEL) + +#define TIM_CAPCH4SEL_0 (TIM_REG_BIT_MASK) +#define TIM_CAPCH4SEL_1 (TIM_INSEL_TI4S_0) +#define TIM_CAPCH4SEL_2 (TIM_INSEL_TI4S_1) +#define TIM_CAPCH4SEL_TIMXCAPHSEDIV128 (TIM_CTRL1_C4SEL) + +#define TIM_CAPETRSEL_0 (TIM_REG_BIT_MASK) +#define TIM_CAPETRSEL_1 (TIM_INSEL_ETRS_0) +#define TIM_CAPETRSEL_2 (TIM_INSEL_ETRS_1) +#define TIM_CAPETRSEL_3 (TIM_INSEL_ETRS_0 | TIM_INSEL_ETRS_1) +#define TIM_CAPETRSEL_4 (TIM_INSEL_ETRS_2) +#define TIM_CAPETRSEL_5 (TIM_INSEL_ETRS_0 | TIM_INSEL_ETRS_2) +#define TIM_CAPETRSEL_6 (TIM_INSEL_ETRS_1 | TIM_INSEL_ETRS_2) +#define TIM_CAPETRSEL_7 (TIM_INSEL_ETRS_0 | TIM_INSEL_ETRS_1 | TIM_INSEL_ETRS_2) +#define TIM_CAPETRSEL_8 (TIM_INSEL_ETRS_3) +#define TIM_CAPETRSEL_9 (TIM_INSEL_ETRS_0 | TIM_INSEL_ETRS_3) +#define TIM_CAPETRSEL_10 (TIM_INSEL_ETRS_1 | TIM_INSEL_ETRS_3) +#define TIM_CAPETRSEL_11 (TIM_INSEL_ETRS_0 | TIM_INSEL_ETRS_1 | TIM_INSEL_ETRS_3) +#define TIM_CAPETRSEL_12 (TIM_INSEL_ETRS_2 | TIM_INSEL_ETRS_3) +#define TIM_CAPETRSEL_13 (TIM_INSEL_ETRS_0 | TIM_INSEL_ETRS_2 | TIM_INSEL_ETRS_3) + +#define TIM_OCCLRSEL_0 (TIM_REG_BIT_MASK) +#define TIM_OCCLRSEL_1 (TIM_INSEL_CLRS_0) +#define TIM_OCCLRSEL_2 (TIM_INSEL_CLRS_1) +#define TIM_OCCLRSEL_3 (TIM_INSEL_CLRS_0 | TIM_INSEL_CLRS_1) +#define TIM_OCCLRSEL_4 (TIM_INSEL_CLRS_2) +#define TIM_OCCLRSEL_5 (TIM_INSEL_CLRS_0 | TIM_INSEL_CLRS_2) +#define TIM_OCCLRSEL_6 (TIM_INSEL_CLRS_1 | TIM_INSEL_CLRS_2) +#define TIM_OCCLRSEL_7 (TIM_INSEL_CLRS_0 | TIM_INSEL_CLRS_1 | TIM_INSEL_CLRS_2) +#define TIM_OCCLRSEL_COMP (TIM_CTRL1_CLRSEL) + +/** ETR input selection **/ +#define TIM_ETRSEL (TIM_REG_BIT_MASK) +#define TIM_CLRSEL (TIM_CTRL1_CLRSEL) + +/** ITR input selection **/ +#define TIM_TRIG_SEL_IN_TR0 (TIM_REG_BIT_MASK) +#define TIM_TRIG_SEL_IN_TR1 (TIM_INSEL_ITRS_0) +#define TIM_TRIG_SEL_IN_TR2 (TIM_INSEL_ITRS_1) +#define TIM_TRIG_SEL_IN_TR3 (TIM_INSEL_ITRS_0 | TIM_INSEL_ITRS_1) +#define TIM_TRIG_SEL_IN_TR4 (TIM_INSEL_ITRS_2) +#define TIM_TRIG_SEL_IN_TR5 (TIM_INSEL_ITRS_0 | TIM_INSEL_ITRS_2) +#define TIM_TRIG_SEL_IN_TR6 (TIM_INSEL_ITRS_1 | TIM_INSEL_ITRS_2) +#define TIM_TRIG_SEL_IN_TR7 (TIM_INSEL_ITRS_0 | TIM_INSEL_ITRS_1 | TIM_INSEL_ITRS_2) +#define TIM_TRIG_SEL_IN_TR8 (TIM_INSEL_ITRS_3) +#define TIM_TRIG_SEL_IN_TR9 (TIM_INSEL_ITRS_0 | TIM_INSEL_ITRS_3) +#define TIM_TRIG_SEL_IN_TR10 (TIM_INSEL_ITRS_1 | TIM_INSEL_ITRS_3) +#define TIM_TRIG_SEL_IN_TR11 (TIM_INSEL_ITRS_0 | TIM_INSEL_ITRS_1 | TIM_INSEL_ITRS_3) +#define TIM_TRIG_SEL_IN_TR12 (TIM_INSEL_ITRS_2 | TIM_INSEL_ITRS_3) +#define TIM_TRIG_SEL_IN_TR13 (TIM_INSEL_ITRS_0 | TIM_INSEL_ITRS_2 | TIM_INSEL_ITRS_3) +#define TIM_TRIG_SEL_IN_TR14 (TIM_INSEL_ITRS_1 | TIM_INSEL_ITRS_2 | TIM_INSEL_ITRS_3) + +/** OCCLR input selection **/ +#define IS_ITR_SEL(IMPORT) (((IMPORT) == TIM_TRIG_SEL_IN_TR0) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR1) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR2) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR3) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR4) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR5) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR6) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR7) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR8) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR9) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR10) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR11) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR12) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR13) || \ + ((IMPORT) == TIM_TRIG_SEL_IN_TR14)) + +/** TIM_Trigger_Selection **/ +#define TIM_TRIG_SEL_IN_TR (TIM_SMCTRL_TSEL_0) +#define TIM_TRIG_SEL_TI1F_ED (TIM_SMCTRL_TSEL_2) +#define TIM_TRIG_SEL_TI1FP1 (TIM_SMCTRL_TSEL_0 | TIM_SMCTRL_TSEL_2) +#define TIM_TRIG_SEL_TI2FP2 (TIM_SMCTRL_TSEL_1 | TIM_SMCTRL_TSEL_2) +#define TIM_TRIG_SEL_ETRF (TIM_SMCTRL_TSEL_0 | TIM_SMCTRL_TSEL_1 | TIM_SMCTRL_TSEL_2) + +/** TIM_Output_Compare_and_PWM_modes **/ +#define TIM_OCMODE_TIMING (TIM_REG_BIT_MASK) +#define TIM_OCMODE_ACTIVE (TIM_CCMOD1_OC1MD_0) +#define TIM_OCMODE_INACTIVE (TIM_CCMOD1_OC1MD_1) +#define TIM_OCMODE_TOGGLE (TIM_CCMOD1_OC1MD_0 | TIM_CCMOD1_OC1MD_1) +#define TIM_FORCED_ACTION_INACTIVE (TIM_CCMOD1_OC1MD_2) +#define TIM_FORCED_ACTION_ACTIVE (TIM_CCMOD1_OC1MD_0 | TIM_CCMOD1_OC1MD_2) +#define TIM_OCMODE_PWM1 (TIM_CCMOD1_OC1MD_1 | TIM_CCMOD1_OC1MD_2) +#define TIM_OCMODE_PWM2 (TIM_CCMOD1_OC1MD_0 | TIM_CCMOD1_OC1MD_1 | TIM_CCMOD1_OC1MD_2) +#define TIM_OCMODE_OPMOD_RETRIG1 (TIM_CCMOD1_OC1MD_3) +#define TIM_OCMODE_OPMOD_RETRIG2 (TIM_CCMOD1_OC1MD_0 | TIM_CCMOD1_OC1MD_3) +#define TIM_OCMODE_COMBI_PWM1 (TIM_CCMOD1_OC1MD_1 | TIM_CCMOD1_OC1MD_2 | TIM_CCMOD1_OC1MD_3) +#define TIM_OCMODE_COMBI_PWM2 (TIM_CCMOD1_OC1MD_0 | TIM_CCMOD1_OC1MD_1 | TIM_CCMOD1_OC1MD_2 | TIM_CCMOD1_OC1MD_3) + +/** TIM_Output_Compare_state **/ +#define TIM_OUTPUT_STATE_DISABLE (TIM_REG_BIT_MASK) +#define TIM_OUTPUT_STATE_ENABLE (TIM_CCEN_CC1EN) + +/** TIM_Output_Compare_N_state **/ +#define TIM_OUTPUT_NSTATE_DISABLE (TIM_REG_BIT_MASK) +#define TIM_OUTPUT_NSTATE_ENABLE (TIM_CCEN_CC1NEN) + +/** TIM_Output_Compare_Polarity **/ +#define TIM_OC_POLARITY_HIGH (TIM_REG_BIT_MASK) +#define TIM_OC_POLARITY_LOW (TIM_CCEN_CC1P) + +/** TIM_Output_Compare_N_Polarity **/ +#define TIM_OCN_POLARITY_HIGH (TIM_REG_BIT_MASK) +#define TIM_OCN_POLARITY_LOW (TIM_CCEN_CC1NP) + +/** TIM_Output_Compare_Idle_State **/ +#define TIM_OC_IDLE_STATE_SET (TIM_CTRL2_OI1) +#define TIM_OC_IDLE_STATE_RESET (TIM_REG_BIT_MASK) + +/** TIM_Output_Compare_N_Idle_State **/ +#define TIM_OCN_IDLE_STATE_SET (TIM_CTRL2_OI1N) +#define TIM_OCN_IDLE_STATE_RESET (TIM_REG_BIT_MASK) + +/** TIM_Channel **/ +#define TIM_CH_1 ((uint32_t)0x00000000) +#define TIM_CH_2 ((uint32_t)0x00000004) +#define TIM_CH_3 ((uint32_t)0x00000008) +#define TIM_CH_4 ((uint32_t)0x0000000C) +#define TIM_CH_5 ((uint32_t)0x00000010) +#define TIM_CH_6 ((uint32_t)0x00000014) + +/** TIM_Iutput_Capture_Polarity **/ +#define TIM_IC_POLARITY_RISING (TIM_REG_BIT_MASK) +#define TIM_IC_POLARITY_FALLING (TIM_CCEN_CC1P) + +/** TIM_Input_Capture_Selection **/ +#define TIM_IC_SELECTION_DIRECTTI (TIM_CCMOD1_CC1SEL_0) /* TIM Input 1, 2, 3 or 4 is selected to be + connected to IC1, IC2, IC3 or IC4, respectively */ +#define TIM_IC_SELECTION_INDIRECTTI (TIM_CCMOD1_CC1SEL_1) /* TIM Input 1, 2, 3 or 4 is selected to be + connected to IC2, IC1, IC4 or IC3, respectively. */ +#define TIM_IC_SELECTION_TRC (TIM_CCMOD1_CC1SEL) /* TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */ + +/** TIM_Input_Capture_Prescaler **/ +#define TIM_IC_PSC_DIV1 (TIM_REG_BIT_MASK) /* Capture performed each time an edge is detected on the capture input. */ +#define TIM_IC_PSC_DIV2 (TIM_CCMOD1_IC1PSC_0) /* Capture performed once every 2 events. */ +#define TIM_IC_PSC_DIV4 (TIM_CCMOD1_IC1PSC_1) /* Capture performed once every 4 events. */ +#define TIM_IC_PSC_DIV8 (TIM_CCMOD1_IC1PSC) /* Capture performed once every 8 events. */ + +/** OSSR_Off_State_Selection_for_Run_mode_state **/ +#define TIM_OSSR_STATE_ENABLE (TIM_BKDT_OSSR) +#define TIM_OSSR_STATE_DISABLE (TIM_REG_BIT_MASK) + +/** OSSI_Off_State_Selection_for_Idle_mode_state **/ +#define TIM_OSSI_STATE_ENABLE (TIM_BKDT_OSSI) +#define TIM_OSSI_STATE_DISABLE (TIM_REG_BIT_MASK) + +/** Lock_level **/ +#define TIM_LOCK_LEVEL_OFF (TIM_REG_BIT_MASK) +#define TIM_LOCK_LEVEL_1 (TIM_BKDT_LCKCFG_0) +#define TIM_LOCK_LEVEL_2 (TIM_BKDT_LCKCFG_1) +#define TIM_LOCK_LEVEL_3 (TIM_BKDT_LCKCFG) + +/** Break_Input_enable_disable **/ +#define TIM_BREAK_IN_ENABLE (TIM_BKDT_BKEN) +#define TIM_BREAK_IN_DISABLE (TIM_REG_BIT_MASK) +#define TIM_BREAK2_IN_ENABLE (TIM_BKDT_BK2EN) +#define TIM_BREAK2_IN_DISABLE (TIM_REG_BIT_MASK) + +/** Break_Polarity **/ +#define TIM_BREAK_POLARITY_LOW (TIM_REG_BIT_MASK) +#define TIM_BREAK_POLARITY_HIGH (TIM_BKDT_BKP) +#define TIM_BREAK2_POLARITY_LOW (TIM_REG_BIT_MASK) +#define TIM_BREAK2_POLARITY_HIGH (TIM_BKDT_BK2P) + +/** TIM_AOEN_Bit_Set_Reset **/ +#define TIM_AUTO_OUTPUT_ENABLE (TIM_BKDT_AOEN) +#define TIM_AUTO_OUTPUT_DISABLE (TIM_REG_BIT_MASK) + +/** Bidirectional break input enabled or disabled **/ +#define TIM_BREAK_BID_ENABLE (TIM_BKDT_BRKBID) +#define TIM_BREAK_BID_DISABLE (TIM_REG_BIT_MASK) + +/** Bidirectional break2 input enabled or disabled **/ +#define TIM_BREAK2_BID_ENABLE (TIM_BKDT_BRK2BID) +#define TIM_BREAK2_BID_DISABLE (TIM_REG_BIT_MASK) + +/** Break1 input source **/ +#define TIM_BREAK_LOCKUP (TIM_CTRL1_LBKPEN) +#define TIM_BREAK_PVD (TIM_CTRL1_PBKPEN) +#define TIM_BREAK_SMPAR (TIM_CTRL1_SMPARERREN) +#define TIM_BREAK_SMECC (TIM_CTRL1_SMECCERREN) +#define TIM_BREAK_IOM (TIM_AF1_IOMBRKEN) +#define TIM_BREAK_COMP1 (TIM_AF1_COMP1BRKEN) +#define TIM_BREAK_COMP2 (TIM_AF1_COMP2BRKEN) +#define TIM_BREAK_COMP3 (TIM_AF1_COMP3BRKEN) +#define TIM_BREAK_COMP4 (TIM_AF1_COMP4BRKEN) +#define TIM_BREAK_DSMU0 (TIM_AF1_DSMU0BRKEN) +#define TIM_BREAK_DSMU1 (TIM_AF1_DSMU1BRKEN) +#define TIM_BREAK_DSMU2 (TIM_AF1_DSMU2BRKEN) +#define TIM_BREAK_DSMU3 (TIM_AF1_DSMU3BRKEN) + +/** System break input **/ +#define IS_SYS_BREAK(SOURCE) (((SOURCE) == TIM_BREAK_LOCKUP) || \ + ((SOURCE) == TIM_BREAK_PVD) || \ + ((SOURCE) == TIM_BREAK_SMPAR) || \ + ((SOURCE) == TIM_BREAK_SMECC)) + + /** Polarity of break input from IOM **/ +#define TIM_BREAK_SOURCE_POLARITY_INVERT (TIM_AF1_IOMBRKP | TIM_AF1_COMP1BRKP | TIM_AF1_COMP2BRKP | TIM_AF1_COMP3BRKP | TIM_AF1_COMP4BRKP ) +#define TIM_BREAK_SOURCE_POLARITY_NONINVERT (TIM_REG_BIT_MASK) + +/** IOM as break2 input **/ +#define TIM_BREAK2_IOM (TIM_AF2_IOMBRK2EN) +#define TIM_BREAK2_COMP1 (TIM_AF2_COMP1BRK2EN) +#define TIM_BREAK2_COMP2 (TIM_AF2_COMP2BRK2EN) +#define TIM_BREAK2_COMP3 (TIM_AF2_COMP3BRK2EN) +#define TIM_BREAK2_COMP4 (TIM_AF2_COMP4BRK2EN) +#define TIM_BREAK2_DSMU0 (TIM_AF2_DSMU0BRK2EN) +#define TIM_BREAK2_DSMU1 (TIM_AF2_DSMU1BRK2EN) +#define TIM_BREAK2_DSMU2 (TIM_AF2_DSMU2BRK2EN) +#define TIM_BREAK2_DSMU3 (TIM_AF2_DSMU3BRK2EN) + + /** Polarity of break2 input from IOM **/ +#define TIM_BREAK2_SOURCE_POLARITY_INVERT (TIM_AF2_IOMBRK2P | TIM_AF2_COMP1BRK2P | TIM_AF2_COMP2BRK2P | TIM_AF2_COMP3BRK2P | TIM_AF2_COMP4BRK2P) +#define TIM_BREAK2_SOURCE_POLARITY_NONINVERT (TIM_REG_BIT_MASK) + +/** TIM_interrupt_sources **/ +#define TIM_INT_CC1 (TIM_DINTEN_CC1IEN) +#define TIM_INT_CC2 (TIM_DINTEN_CC2IEN) +#define TIM_INT_CC3 (TIM_DINTEN_CC3IEN) +#define TIM_INT_CC4 (TIM_DINTEN_CC4IEN) +#define TIM_INT_CC5 (TIM_DINTEN_CC5IEN) +#define TIM_INT_CC6 (TIM_DINTEN_CC6IEN) +#define TIM_INT_CC7 (TIM_DINTEN_CC7IEN) +#define TIM_INT_CC8 (TIM_DINTEN_CC8IEN) +#define TIM_INT_CC9 (TIM_DINTEN_CC9IEN) +#define TIM_INT_UPDATE (TIM_DINTEN_UIEN) +#define TIM_INT_TRIG (TIM_DINTEN_TIEN) +#define TIM_INT_BREAK (TIM_DINTEN_BIEN) +#define TIM_INT_COM (TIM_DINTEN_COMIEN) + +/** TIM_interrupt extra flag **/ +#define TIM_INT_BREAK2 (TIM_STS_BITF2) +#define TIM_INT_SYS_BREAK (TIM_STS_SBITF) + +/** TIM_Event_Source **/ +#define TIM_EVT_SRC_CC1 (TIM_EVTGEN_CC1GN) +#define TIM_EVT_SRC_CC2 (TIM_EVTGEN_CC2GN) +#define TIM_EVT_SRC_CC3 (TIM_EVTGEN_CC3GN) +#define TIM_EVT_SRC_CC4 (TIM_EVTGEN_CC4GN) +#define TIM_EVT_SRC_UPDATE (TIM_EVTGEN_UDGN) +#define TIM_EVT_SRC_COM (TIM_EVTGEN_CCUDGN) +#define TIM_EVT_SRC_TRIG (TIM_EVTGEN_TGN) +#define TIM_EVT_SRC_BREAK (TIM_EVTGEN_BGN) +#define TIM_EVT_SRC_BREAK2 (TIM_EVTGEN_BGN2) + +/** TIM_DMA_Base_address **/ +#define TIM_DMABASE_CTRL1 (TIM_REG_BIT_MASK) +#define TIM_DMABASE_CTRL2 (TIM_DCTRL_DBADDR_0) +#define TIM_DMABASE_STS (TIM_DCTRL_DBADDR_1) +#define TIM_DMABASE_EVTGEN (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_1) +#define TIM_DMABASE_SMCTRL (TIM_DCTRL_DBADDR_2) +#define TIM_DMABASE_DMAINTEN (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_2) +#define TIM_DMABASE_CAPCMPMOD1 (TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_2) +#define TIM_DMABASE_CAPCMPMOD2 (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_2) +#define TIM_DMABASE_CAPCMPMOD3 (TIM_DCTRL_DBADDR_3) +#define TIM_DMABASE_CAPCMPEN (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_3) +#define TIM_DMABASE_CAPCMPDAT1 (TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_3) +#define TIM_DMABASE_CAPCMPDAT2 (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_3) +#define TIM_DMABASE_CAPCMPDAT3 (TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_3) +#define TIM_DMABASE_CAPCMPDAT4 (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_3) +#define TIM_DMABASE_CAPCMPDAT5 (TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_3) +#define TIM_DMABASE_CAPCMPDAT6 (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_3) +#define TIM_DMABASE_PSC (TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_AR (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_CNT (TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_REPCNT (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_BKDT (TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_CAPCMPDAT7 (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_CAPCMPDAT8 (TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_CAPCMPDAT9 (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_BKFR (TIM_DCTRL_DBADDR_3 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_C1FILT (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_3 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_C2FILT (TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_3 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_C3FILT (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_3 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_C4FILT (TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_3 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_FILTO (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_3 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_INSEL (TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_3 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_AF1 (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_2 | TIM_DCTRL_DBADDR_3 | TIM_DCTRL_DBADDR_4) +#define TIM_DMABASE_AF2 (TIM_DCTRL_DBADDR_5) +#define TIM_DMABASE_BKFR2 (TIM_DCTRL_DBADDR_0 | TIM_DCTRL_DBADDR_5) +#define TIM_DMABASE_SLIDFPSC (TIM_DCTRL_DBADDR_1 | TIM_DCTRL_DBADDR_5) + +/** TIM_DMA_Burst_Length **/ +#define TIM_DMABURST_LENGTH_1TRANSFER (TIM_REG_BIT_MASK) +#define TIM_DMABURST_LENGTH_2TRANSFERS (TIM_DCTRL_DBLEN_0) +#define TIM_DMABURST_LENGTH_3TRANSFERS (TIM_DCTRL_DBLEN_1) +#define TIM_DMABURST_LENGTH_4TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_1) +#define TIM_DMABURST_LENGTH_5TRANSFERS (TIM_DCTRL_DBLEN_2) +#define TIM_DMABURST_LENGTH_6TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_2) +#define TIM_DMABURST_LENGTH_7TRANSFERS (TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_2) +#define TIM_DMABURST_LENGTH_8TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_2) +#define TIM_DMABURST_LENGTH_9TRANSFERS (TIM_DCTRL_DBLEN_3) +#define TIM_DMABURST_LENGTH_10TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_3) +#define TIM_DMABURST_LENGTH_11TRANSFERS (TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_3) +#define TIM_DMABURST_LENGTH_12TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_3) +#define TIM_DMABURST_LENGTH_13TRANSFERS (TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_3) +#define TIM_DMABURST_LENGTH_14TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_3) +#define TIM_DMABURST_LENGTH_15TRANSFERS (TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_3) +#define TIM_DMABURST_LENGTH_16TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_3) +#define TIM_DMABURST_LENGTH_17TRANSFERS (TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_18TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_19TRANSFERS (TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_20TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_21TRANSFERS (TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_22TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_23TRANSFERS (TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_24TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_25TRANSFERS (TIM_DCTRL_DBLEN_3 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_26TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_3 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_27TRANSFERS (TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_3 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_28TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_3 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_29TRANSFERS (TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_3 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_30TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_3 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_31TRANSFERS (TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_3 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_32TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_2 | TIM_DCTRL_DBLEN_3 | TIM_DCTRL_DBLEN_4) +#define TIM_DMABURST_LENGTH_33TRANSFERS (TIM_DCTRL_DBLEN_5) +#define TIM_DMABURST_LENGTH_34TRANSFERS (TIM_DCTRL_DBLEN_0 | TIM_DCTRL_DBLEN_5) +#define TIM_DMABURST_LENGTH_35TRANSFERS (TIM_DCTRL_DBLEN_1 | TIM_DCTRL_DBLEN_5) + +/** TIM_DMA_sources **/ +#define TIM_DMA_CC1 (TIM_DINTEN_CC1DEN) +#define TIM_DMA_CC2 (TIM_DINTEN_CC2DEN) +#define TIM_DMA_CC3 (TIM_DINTEN_CC3DEN) +#define TIM_DMA_CC4 (TIM_DINTEN_CC4DEN) +#define TIM_DMA_UPDATE (TIM_DINTEN_UDEN) +#define TIM_DMA_COM (TIM_DINTEN_COMDEN) +#define TIM_DMA_TRIG (TIM_DINTEN_TDEN) + +/** TIM_Slave_Mode **/ +#define TIM_SLAVE_MODE_DISABLE (TIM_REG_BIT_MASK) +#define TIM_SLAVE_MODE_RESET (TIM_SMCTRL_SMSEL_2) +#define TIM_SLAVE_MODE_GATED (TIM_SMCTRL_SMSEL_0 | TIM_SMCTRL_SMSEL_2) +#define TIM_SLAVE_MODE_TRIG (TIM_SMCTRL_SMSEL_1 | TIM_SMCTRL_SMSEL_2) +#define TIM_SLAVE_MODE_EXT1 (TIM_SMCTRL_SMSEL_0 | TIM_SMCTRL_SMSEL_1 | TIM_SMCTRL_SMSEL_2) +#define TIM_SLAVE_MODE_GATED_RESET (TIM_SMCTRL_SMSEL_0 | TIM_SMCTRL_SMSEL_2 | TIM_SMCTRL_SMSEL_3) +#define TIM_SLAVE_MODE_TRIG_RESET (TIM_SMCTRL_SMSEL_1 | TIM_SMCTRL_SMSEL_2 | TIM_SMCTRL_SMSEL_3) + +/** TIM_EncoderMode **/ +#define TIM_ENCODE_QUA_MODE_TI1 (TIM_SMCTRL_SMSEL_0) +#define TIM_ENCODE_QUA_MODE_TI2 (TIM_SMCTRL_SMSEL_1) +#define TIM_ENCODE_QUA_MODE_TI12 (TIM_SMCTRL_SMSEL_0 | TIM_SMCTRL_SMSEL_1) +#define TIM_ENCODE_QUA_MODE_SINGLE_TI1 (TIM_SMCTRL_SMSEL_0 | TIM_SMCTRL_SMSEL_3) +#define TIM_ENCODE_QUA_MODE_SINGLE_TI2 (TIM_SMCTRL_SMSEL_1 | TIM_SMCTRL_SMSEL_3) +#define TIM_ENCODE_DUL_CLKPLUS_MODE1 (TIM_SMCTRL_SMSEL_0 | TIM_SMCTRL_SMSEL_1 | TIM_SMCTRL_SMSEL_2 | TIM_SMCTRL_SMSEL_3) +#define TIM_ENCODE_DUL_CLKPLUS_MODE2 (TIM_SMCTRL_SMSEL_3) +#define TIM_ENCODE_SINGLE_CLKPLUS_MODE1 (TIM_SMCTRL_SMSEL_2 | TIM_SMCTRL_SMSEL_3) +#define TIM_ENCODE_SINGLE_CLKPLUS_MODE2 (TIM_SMCTRL_SMSEL_0 | TIM_SMCTRL_SMSEL_1 | TIM_SMCTRL_SMSEL_3) + +/** TIM_Output_Compare_Preload_State **/ +#define TIM_OC_PRE_LOAD_ENABLE (TIM_CCMOD1_OC1PEN) +#define TIM_OC_PRE_LOAD_DISABLE (TIM_REG_BIT_MASK) + +/** TIM_Output_Compare_Fast_State **/ +#define TIM_OC_FAST_ENABLE (TIM_CCMOD1_OC1FEN) +#define TIM_OC_FAST_DISABLE (TIM_REG_BIT_MASK) + +/** TIM_Output_Compare_Clear_State **/ +#define TIM_OC_CLR_ENABLE (TIM_CCMOD1_OC1CEN) +#define TIM_OC_CLR_DISABLE (TIM_REG_BIT_MASK) + +/** Capture compare enable **/ +#define CAPCMPEN_CCE_SET (TIM_CCEN_CC1EN) +#define CAPCMPEN_CCNE_SET (TIM_CCEN_CC1NEN) + +/** TIM_Capture_Compare_state **/ +#define TIM_CAP_CMP_ENABLE (TIM_CCEN_CC1EN) +#define TIM_CAP_CMP_DISABLE (TIM_REG_BIT_MASK) + +/** TIM_Capture_Compare_N_state **/ +#define TIM_CAP_CMP_N_ENABLE (TIM_CCEN_CC1NEN) +#define TIM_CAP_CMP_N_DISABLE (TIM_REG_BIT_MASK) + +/** TIMx_CCOMD1 register address offset **/ +#define CAPCMPMOD_OFFSET ((uint32_t)0x00000018) + +/** TIM_Update_Source **/ +#define TIM_UPDATE_SRC_GLOBAL (TIM_REG_BIT_MASK) /* Source of update is the counter overflow/underflow \ + or the setting of UG bit, or an update generation \ + through the slave mode controller. */ +#define TIM_UPDATE_SRC_REGULAR (TIM_CTRL1_UPRS) /* Source of update is counter overflow/underflow. */ + +/** TIM_One_Pulse_Mode **/ +#define TIM_OPMODE_SINGLE (TIM_CTRL1_ONEPM) +#define TIM_OPMODE_REPET (TIM_REG_BIT_MASK) + +/** TIM_Trigger_Output_Source **/ +#define TIM_TRGO_SRC_RESET (TIM_REG_BIT_MASK) +#define TIM_TRGO_SRC_ENABLE (TIM_CTRL2_MMSEL_0) +#define TIM_TRGO_SRC_UPDATE (TIM_CTRL2_MMSEL_1) +#define TIM_TRGO_SRC_OC1 (TIM_CTRL2_MMSEL_0 | TIM_CTRL2_MMSEL_1) +#define TIM_TRGO_SRC_OC1REF (TIM_CTRL2_MMSEL_2) +#define TIM_TRGO_SRC_OC2REF (TIM_CTRL2_MMSEL_0 | TIM_CTRL2_MMSEL_2) +#define TIM_TRGO_SRC_OC3REF (TIM_CTRL2_MMSEL_1 | TIM_CTRL2_MMSEL_2) +#define TIM_TRGO_SRC_OC4REF (TIM_CTRL2_MMSEL_0 | TIM_CTRL2_MMSEL_1 | TIM_CTRL2_MMSEL_2) +#define TIM_TRGO_SRC_OC4_7_8_9REF (TIM_CTRL2_MMSEL_3) + +/** TIM_Trigger_Output2_Source **/ +#define TIM_TRGO2_SRC_RESET (TIM_REG_BIT_MASK) +#define TIM_TRGO2_SRC_ENABLE (TIM_CTRL2_MMSEL2_0) +#define TIM_TRGO2_SRC_UPDATE (TIM_CTRL2_MMSEL2_1) +#define TIM_TRGO2_SRC_OC1 (TIM_CTRL2_MMSEL2_0 | TIM_CTRL2_MMSEL2_1) +#define TIM_TRGO2_SRC_OC1REF (TIM_CTRL2_MMSEL2_2) +#define TIM_TRGO2_SRC_OC2REF (TIM_CTRL2_MMSEL2_0 | TIM_CTRL2_MMSEL2_2) +#define TIM_TRGO2_SRC_OC3REF (TIM_CTRL2_MMSEL2_1 | TIM_CTRL2_MMSEL2_2) +#define TIM_TRGO2_SRC_OC4REF (TIM_CTRL2_MMSEL2_0 | TIM_CTRL2_MMSEL2_1 | TIM_CTRL2_MMSEL2_2) +#define TIM_TRGO2_SRC_OC5REF (TIM_CTRL2_MMSEL2_3) +#define TIM_TRGO2_SRC_OC6REF (TIM_CTRL2_MMSEL2_0 | TIM_CTRL2_MMSEL2_3) +#define LL_TIM_TRGO2_OC4_RISINGFALLING (TIM_CTRL2_MMSEL2_1 | TIM_CTRL2_MMSEL2_3) +#define LL_TIM_TRGO2_OC6_RISINGFALLING (TIM_CTRL2_MMSEL2_0 | TIM_CTRL2_MMSEL2_1 | TIM_CTRL2_MMSEL2_3) +#define LL_TIM_TRGO2_OC4_RISING_OC6_RISING (TIM_CTRL2_MMSEL2_2 | TIM_CTRL2_MMSEL2_3) +#define LL_TIM_TRGO2_OC4_RISING_OC6_FALLING (TIM_CTRL2_MMSEL2_0 | TIM_CTRL2_MMSEL2_2 | TIM_CTRL2_MMSEL2_3) +#define LL_TIM_TRGO2_OC5_RISING_OC6_RISING (TIM_CTRL2_MMSEL2_1 | TIM_CTRL2_MMSEL2_2 | TIM_CTRL2_MMSEL2_3) +#define LL_TIM_TRGO2_OC5_RISING_OC6_FALLING (TIM_CTRL2_MMSEL2_0 | TIM_CTRL2_MMSEL2_1 | TIM_CTRL2_MMSEL2_2 | TIM_CTRL2_MMSEL2_3) + + + +/** TIM_Master_Slave_Mode **/ +#define TIM_MASTER_SLAVE_MODE_ENABLE (TIM_SMCTRL_MSMD) +#define TIM_MASTER_SLAVE_MODE_DISABLE (TIM_REG_BIT_MASK) + +/** TIM_Legacy **/ +#define TIM_CC1EN (TIM_CCEN_CC1EN) +#define TIM_CC1NEN (TIM_CCEN_CC1NEN) +#define TIM_CC2EN (TIM_CCEN_CC2EN) +#define TIM_CC2NEN (TIM_CCEN_CC2NEN) +#define TIM_CC3EN (TIM_CCEN_CC3EN) +#define TIM_CC3NEN (TIM_CCEN_CC3NEN) +#define TIM_CC4EN (TIM_CCEN_CC4EN) +#define TIM_CC4NEN (TIM_CCEN_CC4NEN) +#define TIM_CC5EN (TIM_CCEN_CC5EN) +#define TIM_CC6EN (TIM_CCEN_CC6EN) + +/** TIM_Flags **/ +#define TIM_FLAG_UPDATE (TIM_STS_UDITF) +#define TIM_FLAG_CC1 (TIM_STS_CC1ITF) +#define TIM_FLAG_CC2 (TIM_STS_CC2ITF) +#define TIM_FLAG_CC3 (TIM_STS_CC3ITF) +#define TIM_FLAG_CC4 (TIM_STS_CC4ITF) +#define TIM_FLAG_CC5 (TIM_STS_CC5ITF) +#define TIM_FLAG_CC6 (TIM_STS_CC6ITF) +#define TIM_FLAG_CC7 (TIM_STS_CC7ITF) +#define TIM_FLAG_CC8 (TIM_STS_CC8ITF) +#define TIM_FLAG_CC9 (TIM_STS_CC9ITF) +#define TIM_FLAG_COM (TIM_STS_COMITF) +#define TIM_FLAG_TRIG (TIM_STS_TITF) +#define TIM_FLAG_BREAK (TIM_STS_BITF) +#define TIM_FLAG_BREAK2 (TIM_STS_BITF2) +#define TIM_FLAG_SYS_BREAK (TIM_STS_SBITF) +#define TIM_FLAG_CC1OF (TIM_STS_CC1OCF) +#define TIM_FLAG_CC2OF (TIM_STS_CC2OCF) +#define TIM_FLAG_CC3OF (TIM_STS_CC3OCF) +#define TIM_FLAG_CC4OF (TIM_STS_CC4OCF) + +/* TIM_CenterAlignTriggerSource */ +#define TIM_UP_COUNTING (TIM_REG_BIT_MASK) +#define TIM_DOWN_COUNTING (TIM_CTRL1_CMODE_0) +#define TIM_UP_DOWN_COUNTING (TIM_CTRL1_CMODE_1) + +/** TIM_Flags **/ +#define TIM_C1FILTO (TIM_FILTO_C1FILTO) +#define TIM_C2FILTO (TIM_FILTO_C2FILTO) +#define TIM_C3FILTO (TIM_FILTO_C3FILTO) +#define TIM_C4FILTO (TIM_FILTO_C4FILTO) + +/*** TIM Macro Definition End ***/ + + +/** TIM_Exported_Functions Start **/ + +void TIM_DeInit(TIM_Module* TIMx); +void TIM_InitTimeBase(TIM_Module* TIMx, TIM_TimeBaseInitType* TIM_TimeBaseInitStruct); +void TIM_InitOc1(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct); +void TIM_InitOc2(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct); +void TIM_InitOc3(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct); +void TIM_InitOc4(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct); +void TIM_InitOc5(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct); +void TIM_InitOc6(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct); +void TIM_ICInit(TIM_Module* TIMx, TIM_ICInitType* TIM_ICInitStruct); +void TIM_ConfigPwmIc(TIM_Module* TIMx, TIM_ICInitType* TIM_ICInitStruct); +void TIM_ConfigBkdt(TIM_Module* TIMx, TIM_BDTRInitType* TIM_BDTRInitStruct); +void TIM_BreakFiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct); +void TIM_BreakFiltEnable(TIM_Module* TIMx,FunctionalState Cmd); +void TIM_Break2FiltEnable(TIM_Module* TIMx,FunctionalState Cmd); +void TIM_Break2FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct); +void TIM_BreakInputSourceEnable(TIM_Module* TIMx, uint32_t Source, uint32_t Polarity, FunctionalState Cmd); +void TIM_Break2InputSourceEnable(TIM_Module* TIMx, uint32_t Source, uint32_t Polarity, FunctionalState Cmd); +void TIM_BidirectionDisarm(TIM_Module* TIMx); +void TIM_BidirectionRearm(TIM_Module* TIMx); +void TIM_Bidirection2Disarm(TIM_Module* TIMx); +void TIM_Bidirection2Rearm(TIM_Module* TIMx); +void TIM_InitTimBaseStruct(TIM_TimeBaseInitType* TIM_TimeBaseInitStruct); +void TIM_InitOcStruct(OCInitType* TIM_OCInitStruct); +void TIM_InitIcStruct(TIM_ICInitType* TIM_ICInitStruct); +void TIM_InitBkdtStruct(TIM_BDTRInitType* TIM_BDTRInitStruct); +void TIM_Enable(TIM_Module* TIMx, FunctionalState Cmd); +void TIM_EnableCtrlPwmOutputs(TIM_Module* TIMx, FunctionalState Cmd); +void TIM_ConfigInt(TIM_Module* TIMx, uint32_t TIM_IT, FunctionalState Cmd); +void TIM_GenerateEvent(TIM_Module* TIMx, uint32_t TIM_EventSource); +void TIM_ConfigDma(TIM_Module* TIMx, uint32_t TIM_DMABase, uint32_t TIM_DMABurstLength); +void TIM_EnableDma(TIM_Module* TIMx, uint32_t TIM_DMASource, FunctionalState Cmd); +void TIM_ConfigInternalClk(TIM_Module* TIMx); +void TIM_ConfigInternalTrigToExt(TIM_Module* TIMx, uint32_t TIM_InputTriggerSource); +void TIM_ConfigExtTrigAsClk(TIM_Module* TIMx, uint32_t TIM_TIxExternalCLKSource, uint32_t IcPolarity, uint32_t ICFilter); +void TIM_ConfigExtClkMode1(TIM_Module* TIMx,uint32_t TIM_ETRInputSource,uint32_t TIM_ExtTRGPrescaler,uint32_t TIM_ExtTRGPolarity,uint32_t ExtTRGFilter); +void TIM_ConfigExtClkMode2(TIM_Module* TIMx,uint32_t TIM_ETRInputSource,uint32_t TIM_ExtTRGPrescaler,uint32_t TIM_ExtTRGPolarity,uint32_t ExtTRGFilter); +void TIM_ConfigPrescaler(TIM_Module* TIMx, uint32_t Prescaler, uint32_t TIM_PSCReloadMode); +void TIM_ConfigCntMode(TIM_Module* TIMx, uint32_t CntMode); +void TIM_ConfigEncoderInterface(TIM_Module* TIMx,uint32_t TIM_EncoderMode,uint32_t TIM_IC1Polarity,uint32_t TIM_IC2Polarity); +void TIM_ConfigForcedOc1(TIM_Module* TIMx, uint32_t TIM_ForcedAction); +void TIM_ConfigForcedOc2(TIM_Module* TIMx, uint32_t TIM_ForcedAction); +void TIM_ConfigForcedOc3(TIM_Module* TIMx, uint32_t TIM_ForcedAction); +void TIM_ConfigForcedOc4(TIM_Module* TIMx, uint32_t TIM_ForcedAction); +void TIM_ConfigForcedOc5(TIM_Module* TIMx, uint32_t TIM_ForcedAction); +void TIM_ConfigForcedOc6(TIM_Module* TIMx, uint32_t TIM_ForcedAction); +void TIM_ConfigArPreload(TIM_Module* TIMx, FunctionalState Cmd); +void TIM_SelectComEvt(TIM_Module* TIMx, FunctionalState Cmd); +void TIM_SelectCapCmpDmaSrc(TIM_Module* TIMx, FunctionalState Cmd); +void TIM_EnableCapCmpPreloadControl(TIM_Module* TIMx, FunctionalState Cmd); +void TIM_ConfigOc1Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload); +void TIM_ConfigOc2Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload); +void TIM_ConfigOc3Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload); +void TIM_ConfigOc4Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload); +void TIM_ConfigOc5Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload); +void TIM_ConfigOc6Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload); +void TIM_ConfigOc7Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload); +void TIM_ConfigOc8Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload); +void TIM_ConfigOc9Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload); +void TIM_ConfigOc1Fast(TIM_Module* TIMx, uint32_t TIM_OCFast); +void TIM_ConfigOc2Fast(TIM_Module* TIMx, uint32_t TIM_OCFast); +void TIM_ConfigOc3Fast(TIM_Module* TIMx, uint32_t TIM_OCFast); +void TIM_ConfigOc4Fast(TIM_Module* TIMx, uint32_t TIM_OCFast); +void TIM_ConfigOc5Fast(TIM_Module* TIMx, uint32_t TIM_OCFast); +void TIM_ConfigOc6Fast(TIM_Module* TIMx, uint32_t TIM_OCFast); +void TIM_ClrOc1Ref(TIM_Module* TIMx, uint32_t TIM_OCClear); +void TIM_ClrOc2Ref(TIM_Module* TIMx, uint32_t TIM_OCClear); +void TIM_ClrOc3Ref(TIM_Module* TIMx, uint32_t TIM_OCClear); +void TIM_ClrOc4Ref(TIM_Module* TIMx, uint32_t TIM_OCClear); +void TIM_ClrOc5Ref(TIM_Module* TIMx, uint32_t TIM_OCClear); +void TIM_ClrOc6Ref(TIM_Module* TIMx, uint32_t TIM_OCClear); +void TIM_ClrOcRefInputSource(TIM_Module* TIMx, uint32_t OCRefClearInputSelect,uint32_t OCRefClearInputSource); +void TIM_ConfigOc1Polarity(TIM_Module* TIMx, uint32_t OcPolarity); +void TIM_ConfigOc1NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity); +void TIM_ConfigOc2Polarity(TIM_Module* TIMx, uint32_t OcPolarity); +void TIM_ConfigOc2NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity); +void TIM_ConfigOc3Polarity(TIM_Module* TIMx, uint32_t OcPolarity); +void TIM_ConfigOc3NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity); +void TIM_ConfigOc4Polarity(TIM_Module* TIMx, uint32_t OcPolarity); +void TIM_ConfigOc4NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity); +void TIM_ConfigOc5Polarity(TIM_Module* TIMx, uint32_t OcPolarity); +void TIM_ConfigOc6Polarity(TIM_Module* TIMx, uint32_t OcPolarity); +void TIM_EnableCapCmpCh(TIM_Module* TIMx, uint32_t Channel, uint32_t TIM_CCx); +void TIM_EnableCapCmpChN(TIM_Module* TIMx, uint32_t Channel, uint32_t TIM_CCxN); +void TIM_SelectOcMode(TIM_Module* TIMx, uint32_t Channel, uint32_t OcMode); +void TIM_EnableUpdateEvt(TIM_Module* TIMx, FunctionalState Cmd); +void TIM_ConfigUpdateRequestIntSrc(TIM_Module* TIMx, uint32_t TIM_UpdateSource); +void TIM_SelectHallSensor(TIM_Module* TIMx, FunctionalState Cmd); +void TIM_SelectOnePulseMode(TIM_Module* TIMx, uint32_t TIM_OPMode); +void TIM_SelectOutputTrig(TIM_Module* TIMx, uint32_t TIM_TRGOSource); +void TIM_SelectOutputTrig2(TIM_Module* TIMx, uint32_t TIM_TRGO2Source); +void TIM_SelectSlaveMode(TIM_Module* TIMx, uint32_t TIM_SlaveMode); +void TIM_SelectMasterSlaveMode(TIM_Module* TIMx, uint32_t TIM_MasterSlaveMode); +void TIM_SetCnt(TIM_Module* TIMx, uint32_t Counter); +void TIM_SetAutoReload(TIM_Module* TIMx, uint32_t Autoreload); +void TIM_SetCmp1(TIM_Module* TIMx, uint16_t Compare1); +void TIM_SetCmp2(TIM_Module* TIMx, uint16_t Compare2); +void TIM_SetCmp3(TIM_Module* TIMx, uint16_t Compare3); +void TIM_SetCmp4(TIM_Module* TIMx, uint16_t Compare4); +void TIM_SetCmp5(TIM_Module* TIMx, uint16_t Compare5); +void TIM_SetCmp6(TIM_Module* TIMx, uint16_t Compare6); +void TIM_SetCmp7(TIM_Module* TIMx, uint16_t Compare7); +void TIM_SetCmp8(TIM_Module* TIMx, uint16_t Compare8); +void TIM_SetCmp9(TIM_Module* TIMx, uint16_t Compare9); +void TIM_SetCmp1D(TIM_Module* TIMx, uint16_t compare1D); +void TIM_SetCmp2D(TIM_Module* TIMx, uint16_t compare2D); +void TIM_SetCmp3D(TIM_Module* TIMx, uint16_t compare3D); +void TIM_SetCmp4D(TIM_Module* TIMx, uint16_t compare4D); +void ConfigTI1(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter); +void ConfigTI2(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter); +void ConfigTI3(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter); +void ConfigTI4(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter); +void TIM_SetInCap1Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler); +void TIM_SetInCap2Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler); +void TIM_SetInCap3Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler); +void TIM_SetInCap4Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler); +void TIM_SelectInputTrig(TIM_Module* TIMx, uint32_t TIM_InputTriggerSource); +void TIM_ConfigExtTrig(TIM_Module* TIMx,uint32_t TIM_ExtTRGPrescaler,uint32_t TIM_ExtTRGPolarity,uint32_t ExtTRGFilter); +void TIM_SelectETRInputSource(TIM_Module* TIMx, uint32_t TIM_ETRInputSource); +void TIM_SetClkDiv(TIM_Module* TIMx, uint32_t TIM_CKD); +uint16_t TIM_GetCap1(TIM_Module* TIMx); +uint16_t TIM_GetCap2(TIM_Module* TIMx); +uint16_t TIM_GetCap3(TIM_Module* TIMx); +uint16_t TIM_GetCap4(TIM_Module* TIMx); +uint16_t TIM_GetCap5(TIM_Module* TIMx); +uint16_t TIM_GetCap6(TIM_Module* TIMx); +uint16_t TIM_GetCap7(TIM_Module* TIMx); +uint16_t TIM_GetCap8(TIM_Module* TIMx); +uint16_t TIM_GetCap9(TIM_Module* TIMx); +uint16_t TIM_GetCap1D(TIM_Module* TIMx); +uint16_t TIM_GetCap2D(TIM_Module* TIMx); +uint16_t TIM_GetCap3D(TIM_Module* TIMx); +uint16_t TIM_GetCap4D(TIM_Module* TIMx); +uint32_t TIM_GetCnt(TIM_Module* TIMx); +uint16_t TIM_GetPrescaler(TIM_Module* TIMx); +uint32_t TIM_GetAutoReload(TIM_Module* TIMx); +FlagStatus TIM_GetCCENStatus(TIM_Module* TIMx, uint32_t TIM_CCEN); +FlagStatus TIM_GetFlagStatus(TIM_Module* TIMx, uint32_t TIM_FLAG); +void TIM_ClearFlag(TIM_Module* TIMx, uint32_t TIM_FLAG); +INTStatus TIM_GetIntStatus(TIM_Module* TIMx, uint32_t TIM_IT); +void TIM_ClrIntPendingBit(TIM_Module* TIMx, uint32_t TIM_IT); +void TIM_SelectCenterAlignTrig(TIM_Module* TIMx, uint32_t TIM_CenterAlignTriggerSource); +void TIM_AsymmetricEnable(TIM_Module* TIMx, FunctionalState Cmd); +void TIM_OCxRefTriggerADC(TIM_Module* TIMx, uint32_t OCxRef, FunctionalState Cmd); +void TIM_IC1FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct); +void TIM_IC2FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct); +void TIM_IC3FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct); +void TIM_IC4FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct); +void TIM_IC1FiltEnable(TIM_Module* TIMx,FunctionalState Cmd); +void TIM_IC2FiltEnable(TIM_Module* TIMx,FunctionalState Cmd); +void TIM_IC3FiltEnable(TIM_Module* TIMx,FunctionalState Cmd); +void TIM_IC4FiltEnable(TIM_Module* TIMx,FunctionalState Cmd); +FlagStatus TIM_GetFiltStatus(TIM_Module* TIMx, uint32_t TIM_FiltFlag); + +/** TIM_Exported_Functions End **/ + +#ifdef __cplusplus +} + +#endif + +#endif /*__N32H76x_78x_TIM_H */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_usart.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_usart.h new file mode 100644 index 0000000000..4bf8d470be --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_usart.h @@ -0,0 +1,366 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_usart.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_USART_H__ +#define __N32H76X_78X_USART_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/** USART Init Structure definition **/ + +typedef struct +{ + uint32_t BaudRate; /* This member configures the USART communication baud rate. + The baud rate is computed using the following formula: + - IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->BaudRate))) + - FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */ + + uint32_t WordLength; /* Specifies the number of data bits transmitted or received in a frame. */ + + uint32_t StopBits; /* Specifies the number of stop bits transmitted. */ + + uint32_t Parity; /* Specifies the parity mode. */ + + uint32_t Mode; /* Specifies wether the Receive or Transmit mode is enabled or disabled. */ + + uint32_t HardwareFlowControl; /* Specifies wether the hardware flow control mode is enabled or disabled. */ + + uint32_t OverSampling; /* Specifies whether USART oversampling mode is 16 or 8. */ +} USART_InitType; + +/** USART Clock Init Structure definition **/ + +typedef struct +{ + uint32_t Clock; /* Specifies whether the USART clock is enabled or disabled. */ + + uint32_t Polarity; /* Specifies the steady state value of the serial clock. */ + + uint32_t Phase; /* Specifies the clock transition on which the bit capture is made. */ + + uint32_t LastBit; /* Specifies whether the clock pulse corresponding to the last transmitted + data bit (MSB) has to be output on the SCLK pin in synchronous mode. */ +} USART_ClockInitType; + +/*** USART Structure Definition End ***/ + +/*** USART Macro Definition Start ***/ + +#define USART_REG_BIT_MASK (uint32_t)0x00000000U + +/* USART CTRL1 Mask */ +#define USART_CTRL1_CLR_MASK ((uint32_t)(~(USART_CTRL1_RXEN \ + |USART_CTRL1_TXEN \ + |USART_CTRL1_PSEL \ + |USART_CTRL1_PCEN \ + |USART_8OVER \ + |USART_CTRL1_WL))) + +/** Configures the word length of USART **/ +#define USART_WL_8B ((uint32_t)USART_REG_BIT_MASK) /* 8 bits */ +#define USART_WL_9B ((uint32_t)USART_CTRL1_WL) /* 9 bits */ + +/** USART STOP bits **/ +#define CTRL2_STPB_CLR_MASK ((uint32_t)(~USART_CTRL2_STPB)) /* USART CTRL2 STOP Bits Mask */ +#define USART_STPB_1 ((uint32_t)USART_REG_BIT_MASK) /* 1 STOP bit */ +#define USART_STPB_0_5 ((uint32_t)USART_CTRL2_STPB_0) /* 0.5 STOP bit */ +#define USART_STPB_2 ((uint32_t)USART_CTRL2_STPB_1) /* 2 STOP bits */ +#define USART_STPB_1_5 ((uint32_t)(USART_CTRL2_STPB_1|USART_CTRL2_STPB_0)) /* 1.5 STOP bits */ + +/** USART parity selection **/ +#define USART_PE_NO (USART_REG_BIT_MASK) /* USART parity disable */ +#define USART_PE_EVEN ((uint32_t)USART_CTRL1_PCEN) /* Even parity */ +#define USART_PE_ODD ((uint32_t)(USART_CTRL1_PCEN | USART_CTRL1_PSEL)) /* Odd parity */ + +/** USART is configured as RX or TX **/ +#define USART_MODE_RX ((uint32_t)USART_CTRL1_RXEN) /* Transmitter enable */ +#define USART_MODE_TX ((uint32_t)USART_CTRL1_TXEN) /* Receiver enable */ + +/** USART Hardware Flow Control **/ +#define CTRL3_CLR_MASK ((uint32_t)(~USART_HFCTRL_RTS_CTS)) /* USART CTRL3 Mask */ +#define USART_HFCTRL_NONE ((uint32_t)USART_REG_BIT_MASK) +#define USART_HFCTRL_RTS ((uint32_t)USART_CTRL3_RTSEN) +#define USART_HFCTRL_CTS ((uint32_t)USART_CTRL3_CTSEN) +#define USART_HFCTRL_RTS_CTS ((uint32_t)(USART_CTRL3_RTSEN | USART_CTRL3_CTSEN)) + +/** USART oversampling configure **/ +#define USART_8OVER ((uint32_t)USART_CTRL1_OSPM) +#define USART_16OVER ((uint32_t)USART_REG_BIT_MASK) + +/* USART CTRL2 Clock Mask */ +#define CTRL2_CLOCK_CLR_MASK ((uint32_t)(~(USART_CLK_ENABLE \ + | USART_CTRL2_CLKPOL \ + | USART_CTRL2_CLKPHA \ + | USART_CTRL2_LBCLK))) +/** Clock **/ +#define USART_CLK_DISABLE ((uint32_t)USART_REG_BIT_MASK) +#define USART_CLK_ENABLE ((uint32_t)USART_CTRL2_CLKEN) + +/** USART_Clock_Polarity **/ +#define USART_CLKPOL_LOW ((uint32_t)USART_REG_BIT_MASK) +#define USART_CLKPOL_HIGH ((uint32_t)USART_CTRL2_CLKPOL) + +/** USART_Clock_Phase **/ +#define USART_CLKPHA_1EDGE ((uint32_t)USART_REG_BIT_MASK) +#define USART_CLKPHA_2EDGE ((uint32_t)USART_CTRL2_CLKPHA) + +/** USART_Last_Bit **/ +#define USART_CLKLB_DISABLE ((uint32_t)USART_REG_BIT_MASK) +#define USART_CLKLB_ENABLE ((uint32_t)USART_CTRL2_LBCLK) + + +#define CTRL1_UEN_SET ((uint32_t)USART_CTRL1_UEN) /* USART Enable Mask */ +#define CTRL1_UEN_RESET ((uint32_t)(~USART_CTRL1_UEN)) /* USART Disable Mask */ + +#define CTRL1_IFCEN_ENABLE ((uint32_t)USART_CTRL1_IFCEN) /* USART Idle frame Enable */ +#define CTRL1_IFCEN_DISABLE ((uint32_t)(~USART_CTRL1_IFCEN)) /* USART Idle frame Disable */ + +#define CTRL1_SWAP_ENABLE ((uint32_t)USART_CTRL1_SWAP) /* USART Idle frame Enable */ +#define CTRL1_SWAP_DISABLE ((uint32_t)(~USART_CTRL1_SWAP)) /* USART Idle frame Disable */ + +#define CTRL1_DEP_ENABLE ((uint32_t)USART_CTRL1_DEP) /* USART DE signal active high */ +#define CTRL1_DEP_DISABLE ((uint32_t)(~USART_CTRL1_DEP)) /* USART DE signal active low */ + +/* USART Driver enable mode */ +#define CTRL1_DEM_ENABLE ((uint32_t)USART_CTRL1_DEM) +#define CTRL1_DEM_DISABLE ((uint32_t)(~USART_CTRL1_DEM)) + +/* USART FEF Data Discard Enable */ +#define CTRL2_FEFLOSE_ENABLE ((uint32_t)USART_CTRL2_FEFLOSE) +#define CTRL2_FEFLOSE_DISABLE ((uint32_t)(~USART_CTRL2_FEFLOSE)) + +/* USART NEF Data Discard Enable */ +#define CTRL2_NEFLOSE_ENABLE ((uint32_t)USART_CTRL2_NEFLOSE) +#define CTRL2_NEFLOSE_DISABLE ((uint32_t)(~USART_CTRL2_NEFLOSE)) + +/* USART PEF Data Discard Enable */ +#define CTRL2_PEFLOSE_ENABLE ((uint32_t)USART_CTRL2_PEFLOSE) +#define CTRL2_PEFLOSE_DISABLE ((uint32_t)(~USART_CTRL2_PEFLOSE)) + +/* Receiver timeout enable */ +#define CTRL2_RTO_ENABLE ((uint32_t)USART_CTRL2_RTOEN) +#define CTRL2_RTO_DISABLE ((uint32_t)(~USART_CTRL2_RTOEN)) + + +/** USART_Interrupt_definition **/ +#define USART_INT_MASK ((uint32_t)0x0FFFFFFFU) /* USART Interrupt Mask */ +#define USART_CTRL1_INTMASK ((uint32_t)0x10000000U) +#define USART_CTRL2_INTMASK ((uint32_t)0x20000000U) +#define USART_CTRL3_INTMASK ((uint32_t)0x40000000U) +#define USART_FIFO_INTMASK ((uint32_t)0x80000000U) + +#define USART_INT_PEF ((uint32_t)(USART_CTRL1_INTMASK | USART_CTRL1_PEIEN)) +#define USART_INT_TXC ((uint32_t)(USART_CTRL1_INTMASK | USART_CTRL1_TXCIEN)) +#define USART_INT_TXDE ((uint32_t)(USART_CTRL1_INTMASK | USART_CTRL1_TXDEIEN)) +#define USART_INT_RXDNE ((uint32_t)(USART_CTRL1_INTMASK | USART_CTRL1_RXDNEIEN)) +#define USART_INT_IDLEF ((uint32_t)(USART_CTRL1_INTMASK | USART_CTRL1_IDLEIEN)) +#define USART_INT_RTOE ((uint32_t)(USART_CTRL2_INTMASK | USART_CTRL2_RTOIEN)) +#define USART_INT_LINBD ((uint32_t)(USART_CTRL2_INTMASK | USART_CTRL2_LINBDIEN)) +#define USART_INT_ERRF ((uint32_t)(USART_CTRL3_INTMASK | USART_CTRL3_ERRIEN)) +#define USART_INT_CTSF ((uint32_t)(USART_CTRL3_INTMASK | USART_CTRL3_CTSIEN)) + +#define USART_INT_TXFTE ((uint32_t)(USART_FIFO_INTMASK | USART_FIFO_TXFTIEN)) +#define USART_INT_RXFTE ((uint32_t)(USART_FIFO_INTMASK | USART_FIFO_RXFTIEN)) +#define USART_INT_RXFEE ((uint32_t)(USART_FIFO_INTMASK | USART_FIFO_RXFEIEN)) +#define USART_INT_TXFEE ((uint32_t)(USART_FIFO_INTMASK | USART_FIFO_TXFEIEN)) +#define USART_INT_RXFFE ((uint32_t)(USART_FIFO_INTMASK | USART_FIFO_RXFFIEN)) +#define USART_INT_TXFFE ((uint32_t)(USART_FIFO_INTMASK | USART_FIFO_TXFFIEN)) + + +#define CTRL2_ADDR_MASK ((uint32_t)(~USART_CTRL2_ADDR)) + +/** USART_DMA_Requests **/ +#define USART_DMAREQ_TX ((uint32_t)USART_CTRL3_DMATXEN) +#define USART_DMAREQ_RX ((uint32_t)USART_CTRL3_DMARXEN) + +/** USART_WakeUp_methods **/ +#define CTRL1_WUM_MASK ((uint32_t)(~USART_CTRL1_WUM)) +#define USART_WUM_IDLELINE ((uint32_t)USART_REG_BIT_MASK) +#define USART_WUM_ADDRMASK ((uint32_t)USART_CTRL1_WUM) + +/* USART mute mode */ +#define CTRL1_RCVWU_SET ((uint32_t)USART_CTRL1_RCVWU) +#define CTRL1_RCVWU_RESET ((uint32_t)(~USART_CTRL1_RCVWU)) + +/** USART_LIN_Break_Detection_Length **/ +#define CTRL2_LINBDL_MASK ((uint32_t)(~USART_CTRL2_LINBDL)) +#define USART_LINBDL_10B ((uint32_t)USART_REG_BIT_MASK) +#define USART_LINBDL_11B ((uint32_t)USART_CTRL2_LINBDL) + +/* USART LIN */ +#define CTRL2_LINMEN_SET ((uint32_t)USART_CTRL2_LINMEN) +#define CTRL2_LINMEN_RESET ((uint32_t)(~USART_CTRL2_LINMEN)) + +/* USART Break Character send Mask */ +#define CTRL1_SDBRK_SET ((uint32_t)USART_CTRL1_SDBRK) + +/* Guard Time Register */ +#define GTP_LSB_MASK ((uint32_t)(~USART_GTP_GTV)) +#define GTP_MSB_MASK ((uint32_t)(~USART_GTP_PSCV)) + +/* USART SCMEN Mask */ +#define CTRL3_SCMEN_SET ((uint32_t)USART_CTRL3_SCMEN) +#define CTRL3_SCMEN_RESET ((uint32_t)(~USART_CTRL3_SCMEN)) + +/* USART SC NACK Mask */ +#define CTRL3_SCNACK_SET ((uint32_t)USART_CTRL3_SCNACK) +#define CTRL3_SCNACK_RESET ((uint32_t)(~USART_CTRL3_SCNACK)) + +/* USART Half-Duplex Mask */ +#define CTRL3_HDMEN_SET ((uint32_t)USART_CTRL3_HDMEN) +#define CTRL3_HDMEN_RESET ((uint32_t)(~USART_CTRL3_HDMEN)) + +/** USART_IrDA_Low_Power **/ +#define CTRL3_IRDALP_MASK ((uint32_t)(~USART_CTRL3_IRDALP)) +#define USART_IRDAMODE_LOWPPWER ((uint32_t)USART_CTRL3_IRDALP) +#define USART_IRDAMODE_NORMAL ((uint32_t)USART_REG_BIT_MASK) + + /* USART IrDA Mask */ +#define CTRL3_IRDAMEN_SET ((uint32_t)USART_CTRL3_IRDAMEN) +#define CTRL3_IRDAMEN_RESET ((uint32_t)(~USART_CTRL3_IRDAMEN)) + +/** USART_Flags **/ +#define USART_FLAG_LOSEMASK ((uint32_t)USART_STS_FELOSEF | USART_STS_NELOSEF | USART_STS_PELOSEF) +#define USART_FLAG_FELOSE ((uint32_t)USART_STS_FELOSEF) +#define USART_FLAG_NELOSE ((uint32_t)USART_STS_NELOSEF) +#define USART_FLAG_PELOSE ((uint32_t)USART_STS_PELOSEF) +#define USART_FLAG_RTO ((uint32_t)USART_STS_RTOF) +#define USART_FLAG_FEF ((uint32_t)USART_STS_FEF) +#define USART_FLAG_NEF ((uint32_t)USART_STS_NEF) +#define USART_FLAG_OREF ((uint32_t)USART_STS_OREF) +#define USART_FLAG_PEF ((uint32_t)USART_STS_PEF) +#define USART_FLAG_LINBD ((uint32_t)USART_STS_LINBDF) +#define USART_FLAG_CTSF ((uint32_t)USART_STS_CTSF) +#define USART_FLAG_RXDNE ((uint32_t)USART_STS_RXDNE) +#define USART_FLAG_TXC ((uint32_t)USART_STS_TXC) +#define USART_FLAG_TXDE ((uint32_t)USART_STS_TXDE) +#define USART_FLAG_IDLEF ((uint32_t)USART_STS_IDLEF) +#define USART_FLAG_TXFT ((uint32_t)USART_STS_TXFT) +#define USART_FLAG_RXFT ((uint32_t)USART_STS_RXFT) +#define USART_FLAG_RXFE ((uint32_t)USART_STS_RXFE) +#define USART_FLAG_TXFE ((uint32_t)USART_STS_TXFE) +#define USART_FLAG_RXFF ((uint32_t)USART_STS_RXFF) +#define USART_FLAG_TXFF ((uint32_t)USART_STS_TXFF) + +/* FIFO depth*/ +#define USART_FIFO_DEEP1 ((uint32_t)0x00000000U) +#define USART_FIFO_DEEP2 ((uint32_t)0x00000001U) +#define USART_FIFO_DEEP4 ((uint32_t)0x00000002U) +#define USART_FIFO_DEEP6 ((uint32_t)0x00000003U) +#define USART_FIFO_DEEP7 ((uint32_t)0x00000004U) +#define USART_FIFO_DEEP8 ((uint32_t)0x00000005U) + +#define USART_CLEAR_FIFO ((uint32_t)USART_FIFO_CLR) + +/* Receiver timeout enable */ +#define USART_FIFO_ENABLE ((uint32_t)USART_FIFO_EN) +#define USART_FIFO_DISABLE ((uint32_t)(~USART_FIFO_EN)) + + +void USART_DeInit(USART_Module* USARTx); +void USART_Init(USART_Module* USARTx, USART_InitType* USART_InitStruct); +void USART_StructInit(USART_InitType* USART_InitStruct); +void USART_ClockInit(USART_Module* USARTx, USART_ClockInitType* USART_ClockInitStruct); +void USART_ClockStructInit(USART_ClockInitType* USART_ClockInitStruct); +void USART_Enable(USART_Module* USARTx, FunctionalState Cmd); +void USART_ConfigInt(USART_Module* USARTx, uint32_t USART_INT, FunctionalState Cmd); +void USART_EnableDMA(USART_Module* USARTx, uint32_t USART_DMAReq, FunctionalState Cmd); +void USART_SetAddr(USART_Module* USARTx, uint8_t USART_Addr); +void USART_ConfigWakeUpMode(USART_Module* USARTx, uint32_t USART_WakeUpMode); +void USART_EnableRcvWakeUp(USART_Module* USARTx, FunctionalState Cmd); +void USART_ConfigLINBreakDetectLength(USART_Module* USARTx, uint32_t USART_LINBreakDetectLength); +void USART_EnableLIN(USART_Module* USARTx, FunctionalState Cmd); +void USART_SendData(USART_Module* USARTx, uint32_t Data); +uint32_t USART_ReceiveData(USART_Module* USARTx); +void USART_SendBreak(USART_Module* USARTx); +void USART_SetGuardTime(USART_Module* USARTx, uint8_t USART_GuardTime); +void USART_SetPrescaler(USART_Module* USARTx, uint8_t USART_Prescaler); +void USART_EnableSmartCard(USART_Module* USARTx, FunctionalState Cmd); +void USART_SetSmartCardNACK(USART_Module* USARTx, FunctionalState Cmd); +void USART_EnableHalfDuplex(USART_Module* USARTx, FunctionalState Cmd); +void USART_ConfigIrDAMode(USART_Module* USARTx, uint32_t USART_IrDAMode); +void USART_EnableIrDA(USART_Module* USARTx, FunctionalState Cmd); +FlagStatus USART_GetFlagStatus(USART_Module* USARTx, uint32_t USART_FLAG); +void USART_ClrFlag(USART_Module* USARTx, uint32_t USART_FLAG); +void USART_ClrRTOFlag(USART_Module* USARTx); +INTStatus USART_GetIntStatus(USART_Module* USARTx, uint32_t USART_INT); +void USART_IdleFrameSet(USART_Module* USARTx,FunctionalState Cmd); +void USART_PinSwapSet(USART_Module* USARTx,FunctionalState Cmd); +void USART_CfgDriverAssertTime(USART_Module* USARTx,uint32_t Time); +void USART_CfgDriverdeassertTime(USART_Module* USARTx,uint32_t Time); +void USART_DriverPolaritySet(USART_Module* USARTx,FunctionalState Cmd); +void USART_DriverModeSet(USART_Module* USARTx,FunctionalState Cmd); +void USART_FEFDiscardSet(USART_Module* USARTx,FunctionalState Cmd); +void USART_NEFDiscardSet(USART_Module* USARTx,FunctionalState Cmd); +void USART_PEFDiscardSet(USART_Module* USARTx,FunctionalState Cmd); +void USART_RTOSet(USART_Module* USARTx,FunctionalState Cmd); +uint32_t USART_GetTxFIFO_Num(USART_Module* USARTx); +uint32_t USART_GetRxFIFO_Num(USART_Module* USARTx); +void USART_CfgRxFIFOThreshold(USART_Module* USARTx,uint32_t threshold); +void USART_CfgTxFIFOThreshold(USART_Module* USARTx,uint32_t threshold); +void USART_ClrFIFO(USART_Module* USARTx); +void USART_FIFOModeSet(USART_Module* USARTx,FunctionalState Cmd); +void USART_IdleFrameWidthSet(USART_Module* USARTx,uint32_t Width); +void USART_CfgRTOWidth(USART_Module* USARTx,uint32_t Width); + + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H76X_USART_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_vrefbuf.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_vrefbuf.h new file mode 100644 index 0000000000..6d6a3f043f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_vrefbuf.h @@ -0,0 +1,111 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_vrefbuf.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __N32H76X_78X_VREFBUF_H__ +#define __N32H76X_78X_VREFBUF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +/** VREFBUF Register list**/ +#define VREFBUF_STS_REG_ADDR ((uint32_t)AFEC_BASE + 0x34U) +#define VREFBUF_CTRL1_REG_ADDR ((uint32_t)AFEC_BASE + 0x48U) +#define VREFBUF_CTRL2_REG_ADDR ((uint32_t)AFEC_BASE + 0xDCU) +#define VREFBUF_TRIM1_REG_ADDR ((uint32_t)AFEC_BASE + 0x28U) +#define VREFBUF_TRIM2_REG_ADDR ((uint32_t)AFEC_BASE + 0xE8U) + +#define VREFBUF_EN_CTRL ((uint32_t)AFEC_BASE + 0x3CU) + +/** VREFBUF_Exported_Constants **/ +#define VREFBUF_EN_MASK (VREFBUF_CTRL1_EN) +#define VREFBUF_HIM_EN_MASK (VREFBUF_CTRL1_HIM) + +#define VREFBUF_VOLTAGE_SCALE_MASK (VREFBUF_CTRL2_VLSEL) +#define VREFBUF_VOLTAGE_SCALE_2_5V ((uint32_t)0x00000000U) +#define VREFBUF_VOLTAGE_SCALE_2_048V (VREFBUF_CTRL2_VLSEL_0) +#define VREFBUF_VOLTAGE_SCALE_1_8V (VREFBUF_CTRL2_VLSEL_1) +#define VREFBUF_VOLTAGE_SCALE_1_5V (VREFBUF_CTRL2_VLSEL_1 | VREFBUF_CTRL2_VLSEL_0) + +#define VREFBUF_READY_MASK (VREFBUF_STS_RDY) + +/** VREFBUF_Trimming_Constants **/ +#define VREFBUF_TRIMING_2_5V_POS ((uint8_t)16U) +#define VREFBUF_TRIMING_2_5V_MASK (VREFBUF_TRIM1_2_5V_MASK) +#define VREFBUF_TRIMING_2_0V_POS ((uint8_t)22U) +#define VREFBUF_TRIMING_2_0V_MASK (VREFBUF_TRIM1_2_048V_MASK) +#define VREFBUF_TRIMING_1_8V_POS ((uint8_t)0U) +#define VREFBUF_TRIMING_1_8V_MASK (VREFBUF_TRIM1_1_8V_MASK) +#define VREFBUF_TRIMING_1_5V_POS ((uint8_t)8U) +#define VREFBUF_TRIMING_1_5V_MASK (VREFBUF_TRIM1_1_5V_MASK) +/** VREFBUF_Exported_Functions **/ + +void VREFBUF_Enable(FunctionalState Cmd); +void VREFBUF_EnableHIM(FunctionalState Cmd); +void VREFBUF_SetVoltageScale(uint32_t Scale); +uint32_t VREFBUF_GetVoltageScale(void); +FlagStatus VREFBUF_IsVREFReady(void); + + +void VREFBUF_SetTrimming(uint32_t Value); + +#ifdef __cplusplus +} +#endif + +#endif /*__N32H76X_78X_VREFBUF_H__ */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_wwdg.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_wwdg.h new file mode 100644 index 0000000000..bbd4461c69 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_wwdg.h @@ -0,0 +1,107 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_wwdg.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __N32H76X_78X_WWDG_H__ +#define __N32H76X_78X_WWDG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" + +#define WWDG_PRESCALER_DIV1 ((uint32_t)0x00000000) +#define WWDG_PRESCALER_DIV2 ((uint32_t)WWDG_CFG_TIMERB0) +#define WWDG_PRESCALER_DIV4 ((uint32_t)WWDG_CFG_TIMERB1) +#define WWDG_PRESCALER_DIV8 ((uint32_t)(WWDG_CFG_TIMERB1 | WWDG_CFG_TIMERB0)) + + +/** EWINT bit **/ +#define EARLY_WAKEUP_INT (WWDG_CFG_EWINT) +#define EARLY_WAKEUP_FLAG (WWDG_STS_EWINTF) + +/** CTRL register bit mask **/ +#define CTRL_ACTB_SET ((uint32_t)WWDG_CTRL_ACTB) + +/* CFG register bit mask **/ +#define CFG_TIMERB_MASK ((uint32_t)0xFFFF3FFFU) +#define CFG_W_MASK ((uint32_t)0xFFFFC000U) +#define BIT_MASK ((uint16_t)0x3FFF) + + +void WWDG_DeInit(WWDG_Module* WWDGx); +void WWDG_SetPrescalerDiv(WWDG_Module* WWDGx,uint32_t WWDG_Prescaler); +void WWDG_SetWValue(WWDG_Module* WWDGx,uint16_t WindowValue); +void WWDG_EnableInt(WWDG_Module* WWDGx); +void WWDG_SetCnt(WWDG_Module* WWDGx,uint16_t Counter); +void WWDG_Enable(WWDG_Module* WWDGx,uint16_t Counter); +FlagStatus WWDG_GetEWINTF(WWDG_Module* WWDGx); +void WWDG_ClrEWINTF(WWDG_Module* WWDGx); + +#ifdef __cplusplus +} +#endif + +#endif /* __N32H78X__WWDG_H */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_xspi.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_xspi.h new file mode 100644 index 0000000000..c4642cdc52 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc/n32h76x_78x_xspi.h @@ -0,0 +1,505 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_xspi.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __n32h76x_78x_XSPI_H__ +#define __n32h76x_78x_XSPI_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "n32h76x_78x.h" +#include +#include "n32h76x_78x_rcc.h" +#include "n32h76x_78x_gpio.h" + +/** n32h76x_78x_StdPeriph_Driver **/ + +/** XSPI driver modules **/ + +#define XSPI_CTRLRO_SPI_MASK ((uint32_t)0x00001000) +#define XSPI_CTRLRO_XIP_MASK + +#define XSPI_WAITCYCLES_MASK ((uint32_t)~0x0000f800U) +#define XSPI_SPIFRF_MASK ((uint32_t)~0x00c00000U) +#define XSPI_TRANSTYPE_MASK ((uint32_t)~0x00000003U) +#define XSPI_DFS_MASK ((uint32_t)~0x0000001fU) +#define XSPI_ADDRL_MASK ((uint32_t)~0x0000003cU) +#define XSPI_INST_L_MASK ((uint32_t)~0x00000300U) +#define XSPI_NDF_MASK ((uint32_t)~0x0000ffffU) +#define XSPI_TMOD_MASK ((uint32_t)~0x00000c00U) +#define XSPI_RXFTLR_MASK ((uint32_t)~0x0000001fU) +#define XSPI_TXFTLR_MASK ((uint32_t)~0x001f0000U) +#define XSPI_TXFTLITR_MASK ((uint32_t)~0x0000001fU) +#define XSPI_TXFT_MASK ((uint32_t)~0x001f001fU) + +#define STANDRD_SPI_FORMAT XSPI_CTRL0_SPIFRF_STANDARD_FORMAT //((uint32_t)0x00000000) +#define DUAL_SPI_FORMAT XSPI_CTRL0_SPIFRF_DUAL_FORMAT //((uint32_t)0x00400000) +#define QUAD_SPI_FORMAT XSPI_CTRL0_SPIFRF_QUAD_FORMAT //((uint32_t)0x00800000) +#define OCTAL_SPI_FORMAT XSPI_CTRL0_SPIFRF_OCTAL_FORMAT //((uint32_t)0x00C00000) +#define IS_XSPI_DATA_FORMAT(FORMAT) (((FORMAT) == STANDRD_SPI_FORMAT) || \ + ((FORMAT) == DUAL_SPI_FORMAT) || \ + ((FORMAT) == QUAD_SPI_FORMAT) || \ + ((FORMAT) == OCTAL_SPI_FORMAT)) + +//////////////////////////////////////////////////////////////////////////////////////////////////// +#define XSPI_TIME_OUT_CNT 200 + +/** XSPI_mode: XSPI_CTRL0 **/ +#define XSPI_Mode_Master XSPI_CTRL0_MST_MASTER //((uint32_t)0x80000000U) +#define XSPI_Mode_Slave XSPI_CTRL0_MST_SLAVE //((uint32_t)0x00000000U) +#define IS_XSPI_MODE(MODE) (((MODE) == QSPI_Mode_Master) || \ + ((MODE) == QSPI_Mode_Slave)) + + +/** @defgroup XSPI_data_direction + * @{ + */ + +#define TX_AND_RX XSPI_CTRL0_TMOD_TX_AND_RX // ((uint32_t)0x00000000) +#define TX_ONLY XSPI_CTRL0_TMOD_TX_ONLY // ((uint32_t)0x00000400) +#define RX_ONLY XSPI_CTRL0_TMOD_RX_ONLY // ((uint32_t)0x00000800) +#define EEPROM_READ XSPI_CTRL0_TMOD_EEPROM_READ // ((uint32_t)0x00000c00) +#define IS_XSPI_DIRECTION_MODE(MODE) (((MODE) == TX_AND_RX) || \ + ((MODE) == TX_ONLY) || \ + ((MODE) == RX_ONLY) || \ + ((MODE) == EEPROM_READ)) + +/** XSPI_Address_instruction_transfer_format.: XSPI_ENH_CTRL0 **/ +#define TRANS_TYPE_STANDRD XSPI_ENH_CTRL0_TRANSTYPE_STANDARD //((uint32_t)0x00000000) +#define TRANS_TYPE_STANDRD_FRF XSPI_ENH_CTRL0_TRANSTYPE_0 //((uint32_t)0x00000001) +#define TRANS_TYPE_FRF XSPI_ENH_CTRL0_TRANSTYPE_1 //((uint32_t)0x00000002) +#define IS_QSPI_ADDRINSTDFS(SIZE) (((SIZE) == ENSPI_INST_L_NONE) || \ + ((SIZE) == ENSPI_INST_L_04BIT) || \ + ((SIZE) == ENSPI_INST_L_08BIT) || \ + ((SIZE) == ENSPI_INST_L_16BIT)) + + +/** @defgroup QSPI_Address_length + * @{ + */ +#define ENSPI_ADDR_NONE ((uint32_t)0x00000000) +#define ENSPI_ADDR_04BIT ((uint32_t)0x00000004) +#define ENSPI_ADDR_08BIT ((uint32_t)0x00000008) +#define ENSPI_ADDR_16BIT ((uint32_t)0x00000010) +#define ENSPI_ADDR_24BIT ((uint32_t)0x00000018) +#define ENSPI_ADDR_28BIT ((uint32_t)0x0000001c) +#define ENSPI_ADDR_32BIT ((uint32_t)0x00000020) +#define ENSPI_ADDR_40BIT ((uint32_t)0x00000028) +#define ENSPI_ADDR_48BIT ((uint32_t)0x00000030) +#define ENSPI_ADDR_52BIT ((uint32_t)0x00000034) +#define ENSPI_ADDR_56BIT ((uint32_t)0x00000038) +#define ENSPI_ADDR_60BIT ((uint32_t)0x0000003C) +#define IS_QSPI_ADDRSIZE(SIZE) (((SIZE) == ENSPI_INST_L_NONE) || \ + ((SIZE) == ENSPI_INST_L_04BIT) || \ + ((SIZE) == ENSPI_INST_L_08BIT) || \ + ((SIZE) == ENSPI_INST_L_16BIT)) + + +/** @defgroup QSPI_instruction_length + * @{ + */ +#define ENSPI_INST_L_NONE ((uint32_t)0x00000000) +#define ENSPI_INST_L_04BIT ((uint32_t)0x00000100) +#define ENSPI_INST_L_08BIT ((uint32_t)0x00000200) +#define ENSPI_INST_L_16BIT ((uint32_t)0x00000300) +#define IS_QSPI_INSTSIZE(SIZE) (((SIZE) == ENSPI_INST_L_NONE) || \ + ((SIZE) == ENSPI_INST_L_04BIT) || \ + ((SIZE) == ENSPI_INST_L_08BIT) || \ + ((SIZE) == ENSPI_INST_L_16BIT)) + +/** QSPI_data_size : XSPI_CTRL0:DFS **/ +#define DFS_04_BIT XSPI_CTRL0_DFS_4_BIT //((uint32_t)0x00000003U) +#define DFS_08_BIT XSPI_CTRL0_DFS_8_BIT //((uint32_t)0x00000007U) +#define DFS_16_BIT XSPI_CTRL0_DFS_16_BIT //((uint32_t)0x0000000fU) +#define DFS_24_BIT XSPI_CTRL0_DFS_24_BIT //((uint32_t)0x00000017U) +#define DFS_32_BIT XSPI_CTRL0_DFS_32_BIT //((uint32_t)0x0000001fU) +#define IS_XSPI_DATASIZE(DATASIZE) (((DATASIZE) == DFS_04_BIT) || \ + ((DATASIZE) == DFS_08_BIT) || \ + ((DATASIZE) == DFS_16_BIT) || \ + ((DATASIZE) == DFS_24_BIT) || \ + ((DATASIZE) == DFS_32_BIT)) + + +/** @defgroup QSPI_Slave_Select_Toggle_Enable + * @{ + */ +#define SSTE_BIT1 XSPI_CTRL0_SSTE_EN //((uint32_t)0x00004000) +#define SSTE_BIT0 XSPI_CTRL0_SSTE_DISABLE //((uint32_t)0x00000000) +#define IS_XSPI_SSTE_BIT(BIT) (((BIT) == SSTE_BIT1) || \ + ((BIT) == SSTE_BIT0)) + + +/** @defgroup QSPI_Clock_Polarity + * @{ + */ +#define SCPOL_LOW XSPI_CTRL0_SCPOL_LOW //((uint32_t)0x00000000) +#define SCPOL_HIGH XSPI_CTRL0_SCPOL_HIGH //((uint32_t)0x00000200) +#define IS_XSPI_CPOL(CPOL) (((CPOL) == SCPOL_LOW) || \ + ((CPOL) == SCPOL_HIGH)) + +/** @defgroup QSPI_Clock_Phase + * @{ + */ + +#define START_BIT XSPI_CTRL0_SCPH_FIRST_EDGE //((uint32_t)0x00000000) +#define MIDDLE_BIT XSPI_CTRL0_SCPH_SECOND_EDGE //((uint32_t)0x00000100) +#define IS_XSPI_CPHA(CPHA) (((CPHA) == START_BIT) || \ + ((CPHA) == MIDDLE_BIT)) + + +/** @defgroup QSPI_flags_definition + * @{ + */ + +#define XSPI_FLAG_BUSY ((uint32_t)XSPI_STS_BUSY) /* Bit[0] BUSY (Transfer Busy Flag) */ +#define XSPI_FLAG_TFNF ((uint32_t)XSPI_STS_TXFNF) /* Bit[1] TXFNF (Transmit FIFO not Full)*/ +#define XSPI_FLAG_TFE ((uint32_t)XSPI_STS_TXFE) /* Bit[2] TXFE (Transmit FIFO not Empty)*/ +#define XSPI_FLAG_RFNE ((uint32_t)XSPI_STS_RXFNE) /* Bit[3] RXFNE (Receive FIFO not Empty)*/ +#define XSPI_FLAG_RFF ((uint32_t)XSPI_STS_RXFF) /* Bit[4] RXFF (Receive FIFO not Full)*/ +#define XSPI_FLAG_TXE ((uint32_t)XSPI_STS_TXE) /* Bit[5] TXE (Transmit FIFO error)*/ +#define XSPI_FLAG_DCOL ((uint32_t)XSPI_STS_DCERR) /* Bit[6] DCERR (Data Conflict Error)*/ + +#define IS_XSPI_GET_FLAG(FLAG) (((FLAG) == XSPI_FLAG_BUSY) || ((FLAG) == XSPI_FLAG_TFNF) || \ + ((FLAG) == XSPI_FLAG_TFE) || ((FLAG) == XSPI_FLAG_RFNE) || \ + ((FLAG) == XSPI_FLAG_RFF) || ((FLAG) == XSPI_FLAG_TXE) || \ + ((FLAG) == XSPI_FLAG_DCOL)) + + +/** @defgroup QSPI_clock_stretching_capability + * @{ + */ +#define CLK_STRETCH_EN ((uint32_t)XSPI_ENH_CTRL0_CLKSTREN)//Enables clock stretching capability in SPI transfers. +#define CLK_STRETCH_DISABLE ((uint32_t)0x00000000)//Enables clock stretching capability in SPI transfers. +#define IS_XSPI_CLK_SC(SIZE) (((SIZE) == CLK_STRETCH_EN) || \ + ((SIZE) == CLK_STRETCH_DISABLE)) +#define XSPI_DMAReq_Tx 0x02 +#define XSPI_DMAReq_Rx 0x01 +#define IS_XSPI_DMAREQ(REQ) (((REQ) == XSPI_DMAReq_Tx) || \ + ((REQ) == XSPI_DMAReq_Rx)) + + +#define XSPI_DMAATW_1BYTE ((uint32_t)0x00000000) +#define XSPI_DMAATW_2BYTE ((uint32_t)0x00000008) +#define XSPI_DMAATW_4BYTE ((uint32_t)0x00000010) +#define XSPI_DMAATW_8BYTE ((uint32_t)0x00000018) +#define IS_XSPI_DMAATW(ATW) (((ATW) == XSPI_DMAATW_1BYTE) || ((ATW) == XSPI_DMAATW_2BYTE)\ + ((ATW) == XSPI_DMAATW_4BYTE) || ((ATW) == XSPI_DMAATW_8BYTE)) +#define DMA_ADDR_INC ((uint32_t)0x00000040) +#define DMA_ADDR_NINC ((uint32_t)0x00000000) + +#define XSPI_SLV_OUT_DISABLED ((uint32_t)0x1000) //Slave Output is disabled +#define XSPI_SLV_OUT_EN ((uint32_t)0x0000) // Slave Output is enabled + +/** sets the number of data frames to be continuously received by the XSPI :XSPI_CTRL1**/ +#define CTRL1_NDF_CNT 1024 +#define CTRL1_NDF_0 0 +#define CTRL1_NDF_1 1 +#define CTRL1_NDF_8 8 +#define CTRL1_NDF_16 16 +#define CTRL1_NDF_63 63 +#define CTRL1_NDF_127 127 +#define CTRL1_NDF_255 255 +#define IS_XSPI_NDF(NDF) (((NDF) <= 0xFFFF)) + +/** SPI_BaudRate_Prescaler **/ +//Fsclk_out = Fssi_clk/BAUD,BAUD = {SCKDV*2} +#define CLOCK_DIVI_MAX 0XFFFE +#define CLOCK_DIVIDER 0X1f +#define XSPI_SCLKOUT_DISABLE ((uint32_t)0x00000000U) + +#define XSPI_IT_FLAG_TYPE_M ((uint8_t)0x01U) +#define XSPI_IT_FLAG_TYPE_S ((uint8_t)0x02U) +#define XSPI_IT_FLAG_TYPE_R ((uint8_t)0x03U) + +#define XSPI_IT_DONEM ((uint16_t)0X00B5U) +#define XSPI_IT_SPITEM ((uint16_t)0X00A5U) +#define XSPI_IT_AXIEM ((uint16_t)0X0085U) +#define XSPI_IT_TXUIM ((uint16_t)0X0071U) +#define XSPI_IT_XRXOIM ((uint16_t)0X0066U) +#define XSPI_IT_MMCIM ((uint16_t)0X0054U) +#define XSPI_IT_RXFFIM ((uint16_t)0X0045U) +#define XSPI_IT_RXFOIM ((uint16_t)0X0032U) +#define XSPI_IT_RXFUIM ((uint16_t)0X0023U) +#define XSPI_IT_TXFOIM ((uint16_t)0X0011U) +#define XSPI_IT_TXFEIM ((uint16_t)0X0005U) + +#define XSPI_DMAREQ_TX ((uint16_t)0x0002U) +#define XSPI_DMAREQ_RX ((uint16_t)0x0001U) + +#define IS_XSPI_CONFIG_CLEAR_IT(IT) (((IT) == XSPI_IT_DONEM) || ((IT) == XSPI_IT_SPITEM) || \ + ((IT) == XSPI_IT_AXIEM) || ((IT) == XSPI_IT_TXUIM || \ + ((IT) == XSPI_IT_XRXOIM || ((IT) == XSPI_IT_MSTIM) || \ + ((IT) == XSPI_IT_RXFIM || ((IT) == XSPI_IT_RXOIM) || \ + ((IT) == XSPI_IT_RXUIM || ((IT) == XSPI_IT_TXOIM) || \ + ((IT) == XSPI_IT_TXEIM)) + + +/** @defgroup SPI_wati_cycle + * @{ + */ +#define WAIT_CYCLES(X) ((uint32_t)X<<11) +#define ENSPI_WAIT_8CYCLES ((uint32_t)0x00004000) //WAIT_CYCLES +#define ENSPI_WAIT_4CYCLES ((uint32_t)0x00002000) +#define ENSPI_WAIT_2CYCLES ((uint32_t)0x00001000) + +#define NSS_SLECT (0X0F) //(0X01)//Ƭѡ + +/******** Bit definition for XIP_CTRL register ********/ +#define XIPR_PREFETCH_EN ((uint32_t)0x20000000) +#define CONT_XFER_EN ((uint32_t)0x00800000) +#define INST_EN ((uint32_t)0x00400000) +#define DFS_HC_ENABLE ((uint32_t)0x00040000) +#define DFS_HC_DISABLE ((uint32_t)0x00000000) +#define MD_BITS_EN ((uint32_t)0x00001000) + +//xip���ú궨�� +#define XIPR_ADDR_24BIT ((uint32_t)0x00000060) +#define XIPR_ADDR_32BIT ((uint32_t)0x00000080) +#define XIPR_ADDR_48BIT ((uint32_t)0x000000c0) + +#define XIPR_INST_16BIT ((uint32_t)0x00000600) +#define XIPR_INST_8BIT ((uint32_t)0x00000400) +#define XIPR_INST_4BIT ((uint32_t)0x00000200) +#define XIPR_INST_NONE ((uint32_t)0x00000000) + +#define XIPW_ADDR_24BIT ((uint32_t)0x00000060) +#define XIPW_ADDR_32BIT ((uint32_t)0x00000080) +#define XIPW_ADDR_48BIT ((uint32_t)0x000000c0) + +#define XIPW_INST_16BIT ((uint32_t)0x00000300) +#define XIPW_INST_8BIT ((uint32_t)0x00000200) +#define XIPW_INST_4BIT ((uint32_t)0x00000100) +#define XIPW_INST_NONE ((uint32_t)0x00000000) + +#define XIP_WAIT_CYCLES_20 ((uint32_t)0x00028000) +#define XIP_WAIT_CYCLES_8 ((uint32_t)0x00010000) +#define XIP_WAIT_CYCLES_6 ((uint32_t)0x0000c000) + +#define XIPR_TRANS_TYPE_STANDRD ((uint32_t)0x00000000) +#define XIPR_TRANS_TYPE_STANDRD_FRF ((uint32_t)0x00000004) +#define XIPR_TRANS_TYPE_FRF ((uint32_t)0x00000008) + +#define XIPW_TRANS_TYPE_STANDRD ((uint32_t)0x00000000) +#define XIPW_TRANS_TYPE_STANDRD_FRF ((uint32_t)0x00000004) +#define XIPW_TRANS_TYPE_FRF ((uint32_t)0x00000008) + +#define XIPR_DUAL_SPI_FORMAT ((uint32_t)0x00000001) +#define XIPR_QUAD_SPI_FORMAT ((uint32_t)0x00000002) +#define XIPR_OCTAL_SPI_FORMAT ((uint32_t)0x00000003) + +#define XIPW_DUAL_SPI_FORMAT ((uint32_t)0x00000001) +#define XIPW_QUAD_SPI_FORMAT ((uint32_t)0x00000002) +#define XIPW_OCTAL_SPI_FORMAT ((uint32_t)0x00000003) + +#define XIP_MBL_2 ((uint32_t)0x00000000)//XIP mode bit width +#define XIP_MBL_4 ((uint32_t)0x04000000)//XIP mode bit width +#define XIP_MBL_8 ((uint32_t)0x08000000)//XIP mode bit width +#define XIP_MBL_16 ((uint32_t)0x0C000000)//XIP mode bit width + +typedef enum +{ + XSPI_NULL = 0, + XSPI_SUCCESS, +} XSPI_STATUS; +//////////////////////////////////////////////////////////////////////////////////////////////////// +typedef struct +{ + /*XSPI_CTRL0*/ + uint32_t MST; + uint32_t DFS; + uint32_t FRF; //Frame Format Bits[7:6] + uint32_t SCPH; + uint32_t SCPOL; + uint32_t TMOD; + uint32_t SSTE; + uint32_t CFS; + uint32_t SPIFRF; //SPI Frame Format Bits[23:22] + uint32_t WAITCYCLES; + uint32_t INST_L; + uint32_t ADDR_L; + + /*XSPI_CTRL1*/ + uint32_t NDF; + + /*XSPI_MW_CTRL*/ + uint32_t MWMOD; + uint32_t MCDIR; + uint32_t MHSEN; + + /*XSPI_SLAVE_EN*/ + uint32_t SEN; + + /*XSPI_BAUD*/ + uint32_t CLKDIV; + + /*XSPI_TXFT*/ + //uint32_t TXFT; + uint32_t TXFTST; + uint32_t TXFTTEI; + + /*XSPI_RXFT*/ + uint32_t RXFT; + + /*XSPI_RS_DELAY*/ + uint32_t SDCN; + uint32_t SES; + + /*XSPI_ENH_CTRL0*/ + uint32_t ENHANCED_TRANSTYPE; + uint32_t ENHANCED_ADDR_L; + uint32_t ENHANCED_INST_L; + uint32_t ENHANCED_WAITCYCLES; + uint32_t ENHANCED_WRSPIDDREN; + uint32_t ENHANCED_WRINDDREN; + uint32_t ENHANCED_CLKSTREN; + + /*XSPI_DDR_TXDE*/ + uint32_t TXDE; + + /*XSPI_XIP_MODE*/ + uint32_t XIPMDBITS; + + /*XSPI_XIP_INCR_TOC*/ + uint32_t ITOC; + + /*XSPI_XIP_WRAP_TOC*/ + uint32_t WTOC; + + /*XSPI_XIP_CTRL*/ + uint32_t XIP_FRF; + uint32_t XIP_TRANSTYPE; + uint32_t XIP_ADDRL; + uint32_t XIP_INST_L; + uint32_t XIPMDBITS_EN; + uint32_t XIP_WAITCYCLES; + uint32_t XIPDFSHC; + uint32_t XIP_DDREN; + uint32_t XIP_WRINDDREN; + uint32_t XIPINSTEN; + uint32_t XIPCTEN; + uint32_t XIPMBL; + uint32_t XIPPREEN; + + /*XSPI_XIP_TOUT*/ + uint32_t XTOUT; + +} XSPI_InitType; + +enum DDR_SET_TYPE +{ + XSPI_INST_DDR_EN =0,// + XSPI_SPI_DDR_EN =1, + XSPI_INSTANDSPI_DDR_EN, + XIP_READ_INST_DDR_EN, + XIP_READ_IDDR_EN, + XIP_READ_INSTANDSPI_DDR_EN, + XIP_WRITE_INST_DDR_EN, + XIP_WRITE_IDDR_EN, + XIP_WRITE_INSTANDSPI_DDR_EN, +}; + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +void XSPI_DeInit(XSPI_Module* xSPIx); +void XSPI_Init(XSPI_Module* xSPIx, XSPI_InitType* XSPI_InitStruct); +void XSPI_StructInit(XSPI_InitType* XSPI_InitStruct); +void XSPI_Cmd(XSPI_Module* xSPIx, FunctionalState cmd); +void XSPI_XIP_Cmd(XSPI_Module* xSPIx, FunctionalState cmd); +void XSPI_SetTransType(XSPI_Module* xSPIx, uint32_t TransType); +void XSPI_SetWaitCycles(XSPI_Module* xSPIx, uint32_t WAITCYCLES); +void XSPI_SetRXFIFOLevel(XSPI_Module* xSPIx, uint32_t fifo_len); +void XSPI_SetTXFIFOLevel(XSPI_Module* xSPIx, uint32_t fifo_len); +void XSPI_SetTXFIFOStartLevel(XSPI_Module* xSPIx, uint32_t fifo_len); +uint8_t XSPI_GetRXFIFOLevel(XSPI_Module* xSPIx); +uint8_t XSPI_GetTXFIFOLevel(XSPI_Module* xSPIx); +uint32_t XSPI_GetDataPointer(XSPI_Module* xSPIx); +void XSPI_SetTxFifoStartTransferLevel(XSPI_Module* xSPIx,uint16_t Level); +uint32_t XSPI_ReadRxFifoNum(XSPI_Module* xSPIx); +uint32_t XSPI_ReadTxFifoNum(XSPI_Module* xSPIx); +void XSPI_SendData(XSPI_Module* xSPIx, uint32_t SendData); +uint32_t XSPI_ReceiveData(XSPI_Module* xSPIx); +FlagStatus XSPI_GetFlagStatus(XSPI_Module* xSPIx, uint32_t XSPI_FLAG); +uint16_t XSPI_GetINTStatus(XSPI_Module* xSPIx, uint16_t FLAG); +void XSPI_ClearITBit(XSPI_Module* xSPIx, uint16_t XSPI_IT); +void XSPI_ConfigInt(XSPI_Module* xSPIx, uint16_t XSPI_IT, FunctionalState Cmd); +void XSPI_ConfigDMATxLevel(XSPI_Module* xSPIx, uint32_t TxDataLevel); +void XSPI_ConfigDMARxLevel(XSPI_Module* xSPIx, uint32_t RxDataLevel); +void XSPI_EnableDMA(XSPI_Module* xSPIx, uint32_t XSPI_DMAReq, FunctionalState Cmd); +FlagStatus XSPI_GetBusyStatus(XSPI_Module* xSPIx); +FlagStatus XSPI_GetTxDataBusyStatus(XSPI_Module* xSPIx); +FlagStatus XSPI_GetTxDataEmptyStatus(XSPI_Module* xSPIx); +FlagStatus XSPI_GetRxHaveDataStatus(XSPI_Module* xSPIx); +FlagStatus XSPI_GetRxDataFullStatus(XSPI_Module* xSPIx); +FlagStatus XSPI_GetDataConflictErrorStatus(XSPI_Module* xSPIx); +void XSPI_ClrFifo(XSPI_Module* xSPIx); +uint32_t XSPI_GetFifoData(XSPI_Module* xSPIx, uint32_t* pData, uint32_t Len); +void XSPI_SendAndGetWords(XSPI_Module* xSPIx, uint32_t* pSrcData, uint32_t* pDstData, uint32_t cnt); +uint32_t XSPI_SendWordAndGetWords(XSPI_Module* xSPIx, uint32_t WrData, uint32_t* pRdData, uint8_t LastRd); +void XSPI_Slave_Enable(XSPI_Module* xSPIx, uint8_t cmdData); +//================ +uint8_t xSPI_Wait_Flag(XSPI_Module* xSPIx,uint32_t flag,uint8_t sta,uint64_t wtime); +uint8_t xSPI_Wait_TransferComplete(XSPI_Module* xSPIx,uint64_t wtime); +void xSPI_TXFifoLevel(XSPI_Module* xSPIx,u16 FifoLevel); +void xSPI_BaudRateSelect(XSPI_Module* xSPIx,uint32_t BAUDR_Value); +void xSPI_RXSampleDelay(XSPI_Module* xSPIx,uint32_t Sampling_Edge,uint32_t SampleDelay); +void SetXspi_InstAddrWaitcycle_phase(XSPI_Module* xSPIx, u32 inst_l, u32 addr_l, u32 wait_cycle); +void SetXspi_TransType(XSPI_Module* xSPIx, u32 type); +void Set_xSPI_DDR(XSPI_Module* xSPIx, u32 set_type); +void xSPI_Clear_RXFIFO(XSPI_Module* xSPIx); +#ifdef __cplusplus +} +#endif + +#endif /*__n32h76x_78x_XSPI_H__ */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/misc.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/misc.c new file mode 100644 index 0000000000..401992ebba --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/misc.c @@ -0,0 +1,431 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file misc.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "misc.h" + + +/** +*\*\name NVIC_PriorityGroupConfig +*\*\fun Configures the priority grouping: pre-emption priority and subpriority. +*\*\param NVIC_PriorityGroup : +*\*\ - NVIC_PriorityGroup_0 0 bits for pre-emption priority 4 bits for subpriority +*\*\ - NVIC_PriorityGroup_1 1 bits for pre-emption priority 3 bits for subpriority +*\*\ - NVIC_PriorityGroup_2 2 bits for pre-emption priority 2 bits for subpriority +*\*\ - NVIC_PriorityGroup_3 3 bits for pre-emption priority 1 bits for subpriority +*\*\ - NVIC_PriorityGroup_4 4 bits for pre-emption priority 0 bits for subpriority +*\*\return none +**/ +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) +{ + /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */ + SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup; +} + +/** +*\*\name NVIC_Init +*\*\fun Initializes the NVIC peripheral according to the specified parameters in the NVIC_structure_initializes. +*\*\param NVIC_InitStruct : +*\*\ - NVIC_IRQChannel : +*\*\ - IRQn_Type Interrupt Number Definition +*\*\ if NVIC_PriorityGroup is NVIC_PriorityGroup_0 : +*\*\ - NVIC_IRQChannelPreemptionPriority : +*\*\ - NVIC_PRE_PRIORITY_0 +*\*\ - NVIC_IRQChannelSubPriority : +*\*\ - NVIC_SUB_PRIORITY_0 +*\*\ - NVIC_SUB_PRIORITY_1 +*\*\ - NVIC_SUB_PRIORITY_2 +*\*\ - NVIC_SUB_PRIORITY_3 +*\*\ - NVIC_SUB_PRIORITY_4 +*\*\ - NVIC_SUB_PRIORITY_5 +*\*\ - NVIC_SUB_PRIORITY_6 +*\*\ - NVIC_SUB_PRIORITY_7 +*\*\ - NVIC_SUB_PRIORITY_8 +*\*\ - NVIC_SUB_PRIORITY_9 +*\*\ - NVIC_SUB_PRIORITY_10 +*\*\ - NVIC_SUB_PRIORITY_11 +*\*\ - NVIC_SUB_PRIORITY_12 +*\*\ - NVIC_SUB_PRIORITY_13 +*\*\ - NVIC_SUB_PRIORITY_14 +*\*\ - NVIC_SUB_PRIORITY_15 +*\*\ if NVIC_PriorityGroup is NVIC_PriorityGroup_1 : +*\*\ - NVIC_IRQChannelPreemptionPriority : +*\*\ - NVIC_PRE_PRIORITY_0 +*\*\ - NVIC_PRE_PRIORITY_1 +*\*\ - NVIC_IRQChannelSubPriority : +*\*\ - NVIC_SUB_PRIORITY_0 to NVIC_SUB_PRIORITY_7 +*\*\ if NVIC_PriorityGroup is NVIC_PriorityGroup_2 : +*\*\ - NVIC_IRQChannelPreemptionPriority : +*\*\ - NVIC_PRE_PRIORITY_0 to NVIC_PRE_PRIORITY_3 +*\*\ - NVIC_IRQChannelSubPriority : +*\*\ - NVIC_SUB_PRIORITY_0 to NVIC_SUB_PRIORITY_3 +*\*\ if NVIC_PriorityGroup is NVIC_PriorityGroup_3 : +*\*\ - NVIC_IRQChannelPreemptionPriority : +*\*\ - NVIC_PRE_PRIORITY_0 to NVIC_PRE_PRIORITY_7 +*\*\ - NVIC_IRQChannelSubPriority : +*\*\ - NVIC_SUB_PRIORITY_0 +*\*\ - NVIC_SUB_PRIORITY_1 +*\*\ if NVIC_PriorityGroup is NVIC_PriorityGroup_4 : +*\*\ - NVIC_IRQChannelPreemptionPriority : +*\*\ - NVIC_PRE_PRIORITY_0 +*\*\ - NVIC_PRE_PRIORITY_1 +*\*\ - NVIC_PRE_PRIORITY_2 +*\*\ - NVIC_PRE_PRIORITY_3 +*\*\ - NVIC_PRE_PRIORITY_4 +*\*\ - NVIC_PRE_PRIORITY_5 +*\*\ - NVIC_PRE_PRIORITY_6 +*\*\ - NVIC_PRE_PRIORITY_7 +*\*\ - NVIC_PRE_PRIORITY_8 +*\*\ - NVIC_PRE_PRIORITY_9 +*\*\ - NVIC_PRE_PRIORITY_10 +*\*\ - NVIC_PRE_PRIORITY_11 +*\*\ - NVIC_PRE_PRIORITY_12 +*\*\ - NVIC_PRE_PRIORITY_13 +*\*\ - NVIC_PRE_PRIORITY_14 +*\*\ - NVIC_PRE_PRIORITY_15 +*\*\ - NVIC_IRQChannelSubPriority : +*\*\ - NVIC_SUB_PRIORITY_0 +*\*\ - NVIC_IRQChannelCmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void NVIC_Init(NVIC_InitType* NVIC_InitStruct) +{ + uint32_t tmppriority; + uint32_t tmppre; + uint32_t tmpsub = 0x0FU; + + if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) + { + /* Compute the Corresponding IRQ Priority --------------------------------*/ + tmppriority = (0x700U - ((SCB->AIRCR) & (uint32_t)0x700U)) >> 0x08U; + tmppre = (0x4U - tmppriority) & ((uint32_t)0x07U); + tmpsub = tmpsub >> tmppriority; + + tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre; + tmppriority |= NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub; + tmppriority = tmppriority << 0x04; + + NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = (uint8_t)tmppriority; + + /* Enable the Selected IRQ Channels --------------------------------------*/ + NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05U] = (uint32_t)0x01U + << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1FU); + } + else + { + /* Disable the Selected IRQ Channels -------------------------------------*/ + NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = (uint32_t)0x01 + << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); + } +} + +/** +*\*\name NVIC_SetVectorTable +*\*\fun Sets the vector table location and Offset. +*\*\param NVIC_vecter_table specifies if the vector table is in RAM or FLASH memory. +*\*\ This parameter can be one of the following values: +*\*\ - NVIC_VectTab_RAM +*\*\ - NVIC_VectTab_FLASH +*\*\param offset Vector Table base offset field. This value must be a multiple of 0x200. +*\*\return none +**/ +void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) +{ + SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80U); +} + + +/** +*\*\name NVIC_SystemLPConfig +*\*\fun Selects the condition for the system to enter low power mode. +*\*\param LowPowerMode Specifies the new mode for the system to enter low power mode. +*\*\ This parameter can be one of the following values: +*\*\ - NVIC_LP_SEVONPEND +*\*\ - NVIC_LP_SLEEPDEEP +*\*\ - NVIC_LP_SLEEPONEXIT +*\*\param - Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + SCB->SCR |= LowPowerMode; + } + else + { + SCB->SCR &= (uint32_t)(~(uint32_t)LowPowerMode); + } +} + +/** +*\*\name SysTick_CLKSourceConfig +*\*\fun Configures the SysTick clock source. +*\*\param SysTick_CLKSource : +*\*\ - SysTick_CLKSource_HCLK_Div8 External clock selected as SysTick clock source. +*\*\ - SysTick_CLKSource_HCLK AHB clock selected as SysTick clock source. +*\*\return none +**/ +void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) +{ + if (SysTick_CLKSource == SysTick_CLKSource_HCLK) + { + SysTick->CTRL |= SysTick_CLKSource_HCLK; + } + else + { + SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; + } +} + + + +#if (__MPU_PRESENT == 1) + + +/** +*\*\name MPU_Disable +*\*\fun Disables the MPU. +*\*\return none +**/ +void MPU_Disable(void) +{ + /* Make sure outstanding transfers are done */ + __DMB(); + + /* Disable fault exceptions */ + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; + + /* Disable the MPU and clear the control register*/ + MPU->CTRL = 0; +} + + +/** +*\*\name MPU_Enable +*\*\fun Enables the MPU. +*\*\param MPU_Control : + * - MPU_HFNMI_PRIVDEF_NONE + * - MPU_HARDFAULT_NMI + * - MPU_PRIVILEGED_DEFAULT + * - MPU_HFNMI_PRIVDEF +*\*\return none +**/ +void MPU_Enable(uint32_t MPU_Control) +{ + /* Enable the MPU */ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; + + /* Enable fault exceptions */ + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; + + /* Ensure MPU setting take effects */ + __DSB(); + __ISB(); +} + + +/** +*\*\name MPU_ConfigRegion +*\*\fun Initializes and configures the Region and the memory to be protected. +*\*\param MPU_Init : +*\*\ - DisableExec +*\*\ - MPU_INSTRUCTION_ACCESS_ENABLE +*\*\ - MPU_INSTRUCTION_ACCESS_DISABLE +*\*\ - AccessPermission +*\*\ - MPU_REGION_NO_ACCESS +*\*\ - MPU_REGION_PRIV_RW +*\*\ - MPU_REGION_PRIV_RW_URO +*\*\ - MPU_REGION_FULL_ACCESS +*\*\ - MPU_REGION_PRIV_RO +*\*\ - MPU_REGION_PRIV_RO_URO +*\*\ - TypeExtField +*\*\ - MPU_TEX_LEVEL0 +*\*\ - MPU_TEX_LEVEL1 +*\*\ - MPU_TEX_LEVEL2 +*\*\ - IsShareable +*\*\ - MPU_ACCESS_SHAREABLE +*\*\ - MPU_ACCESS_NOT_SHAREABLE +*\*\ - IsCacheable +*\*\ - MPU_ACCESS_CACHEABLE +*\*\ - MPU_ACCESS_NOT_CACHEABLE +*\*\ - IsBufferable +*\*\ - MPU_ACCESS_BUFFERABLE +*\*\ - MPU_ACCESS_NOT_BUFFERABLE +*\*\ - SubRegionDisable : +*\*\ - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF +*\*\ - SubRegionDisable +*\*\ - MPU_REGION_SIZE_32B +*\*\ - MPU_REGION_SIZE_64B +*\*\ - MPU_REGION_SIZE_128B +*\*\ - MPU_REGION_SIZE_256B +*\*\ - MPU_REGION_SIZE_512B +*\*\ - MPU_REGION_SIZE_1KB +*\*\ - MPU_REGION_SIZE_2KB +*\*\ - MPU_REGION_SIZE_4KB +*\*\ - MPU_REGION_SIZE_8KB +*\*\ - MPU_REGION_SIZE_16KB +*\*\ - MPU_REGION_SIZE_32KB +*\*\ - MPU_REGION_SIZE_64KB +*\*\ - MPU_REGION_SIZE_128KB +*\*\ - MPU_REGION_SIZE_256KB +*\*\ - MPU_REGION_SIZE_512KB +*\*\ - MPU_REGION_SIZE_1MB +*\*\ - MPU_REGION_SIZE_2MB +*\*\ - MPU_REGION_SIZE_4MB +*\*\ - MPU_REGION_SIZE_8MB +*\*\ - MPU_REGION_SIZE_16MB +*\*\ - MPU_REGION_SIZE_32MB +*\*\ - MPU_REGION_SIZE_64MB +*\*\ - MPU_REGION_SIZE_128MB +*\*\ - MPU_REGION_SIZE_256MB +*\*\ - MPU_REGION_SIZE_512MB +*\*\ - MPU_REGION_SIZE_1GB +*\*\ - MPU_REGION_SIZE_2GB +*\*\ - MPU_REGION_SIZE_4GB +*\*\return none +**/ +void MPU_ConfigRegion(MPU_Region_InitType *MPU_Init) +{ + /* Set the Region number */ + MPU->RNR = MPU_Init->Number; + + if ((MPU_Init->Enable) != 0UL) + { + MPU->RBAR = MPU_Init->BaseAddress; + MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) | + ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) | + ((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) | + ((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) | + ((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) | + ((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) | + ((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) | + ((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) | + ((uint32_t)MPU_Init->Enable << MPU_RASR_ENABLE_Pos); + } + else + { + MPU->RBAR = 0x00; + MPU->RASR = 0x00; + } +} + +#endif + + +/** +*\*\name CopyVectTable. +*\*\fun Copy the vector table from flash to TCM. +*\*\param SrcAddr none +*\*\param SrcAddr none +*\*\param size : the size of VECTABLE +*\*\return none +**/ +void CopyVectTable(uint32_t SrcAddr, uint32_t DesAddr, uint32_t size) +{ + uint32_t i; + volatile uint32_t* pSrcVect = (uint32_t*)(SrcAddr); + volatile uint32_t* pDestVect = (uint32_t*)(DesAddr); + uint32_t numVECT = (size / 4); + for(i = 0; i < numVECT; i++) + { + pDestVect[i] = pSrcVect[i]; + } + #ifndef CORE_CM4 + pDestVect[15] = pSrcVect[250]; + #endif + + SCB->VTOR = DesAddr; + __ISB(); + __DSB(); +} + + +#if defined(DUAL_CORE) +/** +*\*\name Get_CurrentCPU +*\*\fun Returns the current CPU. +*\*\param none +*\*\return CPU ID +**/ +uint32_t Get_CurrentCPU(void) +{ + if (((SCB->CPUID & 0x000000F0U) >> 4 )== 0x7U) + { + return CM7_CPU; + } + else + { + return CM4_CPU; + } +} +#else +/** +*\*\name Get_CurrentCPU +*\*\fun Returns the current CPU. +*\*\param none +*\*\return CPU ID +**/ +uint32_t Get_CurrentCPU(void) +{ + return CM7_CPU; +} + +#endif /*DUAL_CORE*/ + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_adc.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_adc.c new file mode 100644 index 0000000000..35c523d132 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_adc.c @@ -0,0 +1,2669 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_adc.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_adc.h" +#include "n32h76x_78x_rcc.h" + + +/* bit data handler */ +#define BIT_JUDGE_AND_HANDLER(IS_ENABLE, BIT_MASK) (((IS_ENABLE) != DISABLE ) ? (BIT_MASK) : (0x00000000U)) + +#define CTRL1_CLR_MASK ((uint32_t)0x0000F801U) +#define CTRL2_CLR_MASK ((uint32_t)0xFF000872U) +#define CTRL3_CLR_MASK ((uint32_t)0x00000002U) +#define RSEQ1_CLR_MASK ((uint32_t)0x00007C00U) + +#define ALL_ADC_ENALBE_MASK ((uint32_t)0x00001E00U) +#define ADCBUF_CTRL ((uint32_t)0x40010000U + 0x4C) + +///** ADC Driving Functions Declaration **/ +//static ErrorStatus ADC_WriteDataIntoInternalReg(ADC_Module* ADCx, uint8_t Addr, uint8_t Data); +//static ErrorStatus ADC_ReadDataFromInternalReg(ADC_Module* ADCx, uint8_t Addr, uint16_t *ReadOutData); + + + +/** +*\*\name ADC_DeInit. +*\*\fun Reset the ADC registers. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return none +**/ +void ADC_DeInit(ADC_Module* ADCx) +{ + if (ADCx == ADC1) + { + RCC_EnableAHB1PeriphReset1(RCC_AHB1_PERIPHRST_ADC1); + } + else if (ADCx == ADC2) + { + RCC_EnableAHB1PeriphReset4(RCC_AHB1_PERIPHRST_ADC2); + } + else if (ADCx == ADC3) + { + RCC_EnableAHB1PeriphReset4(RCC_AHB1_PERIPHRST_ADC3); + } + else + { + /*no process*/ + } +} + +/** +*\*\name ADC_Init. +*\*\fun Initializes the ADCx peripheral according to the specified parameters in the ADC_InitStruct. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_InitStruct : +*\*\ - WorkMode +*\*\ - ADC_WORKMODE_INDEPENDENT +*\*\ - ADC_WORKMODE_DUAL_REG_INJECT_SIMULT +*\*\ - ADC_WORKMODE_DUAL_REG_SIMULT_ALTER_TRIG +*\*\ - ADC_WORKMODE_DUAL_INJ_SIMULT_INTERL +*\*\ - ADC_WORKMODE_DUAL_INJ_SIMULT +*\*\ - ADC_WORKMODE_DUAL_REG_SIMULT +*\*\ - ADC_WORKMODE_DUAL_INTERL +*\*\ - ADC_WORKMODE_DUAL_ALTER_TRIG +*\*\ - ADC_WORKMODE_TRIPPLE_REG_INJECT_SIMULT +*\*\ - ADC_WORKMODE_TRIPPLE_REG_SIMULT_ALTER_TRIG +*\*\ - ADC_WORKMODE_TRIPPLE_INJ_SIMULT_INTERL +*\*\ - ADC_WORKMODE_TRIPPLE_INJ_SIMULT +*\*\ - ADC_WORKMODE_TRIPPLE_REG_SIMULT +*\*\ - ADC_WORKMODE_TRIPPLE_INTERL +*\*\ - ADC_WORKMODE_TRIPPLE_ALTER_TRIG +*\*\ - MultiChEn +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - ContinueConvEn +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - ExtTrigSelect +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_CC1 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_CC2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_CC3 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_CC4 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM2_CC1 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM2_CC2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM2_CC3 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_CC1 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_CC2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_CC3 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_CC4 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM4_TRGO2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_TRGO2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM4_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB1_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB2_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB3_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMA1_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB1_CC2 +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB2_CC4 +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB3_CC2 +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMA1_CC4 +*\*\ - ADC_EXT_TRIG_REG_CONV_SHRTIM1_TRGO1 +*\*\ - ADC_EXT_TRIG_REG_CONV_SHRTIM1_TRGO3 +*\*\ - ADC_EXT_TRIG_REG_CONV_SHRTIM2_TRGO1 +*\*\ - ADC_EXT_TRIG_REG_CONV_SHRTIM2_TRGO3 +*\*\ - ADC_EXT_TRIG_REG_CONV_EXT_INT0_15 +*\*\ - ADC_EXT_TRIG_REG_CONV_SOFTWARE +*\*\ - DataTransferMode +*\*\ - ADC_REG_DR_TRANSFER +*\*\ - ADC_REG_DSMU_TRANSFER +*\*\ - ADC_REG_DMA_TRANSFER +*\*\ - DatAlign +*\*\ - ADC_DAT_ALIGN_R +*\*\ - ADC_DAT_ALIGN_L +*\*\ - Resolution +*\*\ - ADC_DATA_RES_12BIT +*\*\ - ADC_DATA_RES_10BIT +*\*\ - ChsNumber: This parameter must be between 1 to 20. +*\*\return none +**/ +void ADC_Init(ADC_Module* ADCx, ADC_InitType* ADC_InitStruct) +{ + uint32_t tempreg1; + uint8_t tempreg2; + /*---------------------------- ADCx CTRL1 Configuration -----------------*/ + /* Get the ADCx CTRL1 value */ + tempreg1 = ADCx->CTRL1; + /* Clear MUTIMODE and SCANMD bits */ + tempreg1 &= (~CTRL1_CLR_MASK); + /* Configure ADCx: Muti mode and scan conversion mode */ + /* Set MUTIMOD bits according to WorkMode value */ + /* Set SCANMD bit according to MultiChEn value */ + tempreg1 |= (uint32_t)(ADC_InitStruct->WorkMode | (uint32_t)ADC_InitStruct->MultiChEn ); + /* Write to ADCx CTRL1 */ + ADCx->CTRL1 = tempreg1; + + /*---------------------------- ADCx CTRL2 Configuration -----------------*/ + /* Get the ADCx CTRL2 value */ + tempreg1 = ADCx->CTRL2; + /* Clear CTU, ALIG ,DMNGT, EXTPRSEL and EXTRSEL bits */ + tempreg1 &= (~CTRL2_CLR_MASK); + /* Set ALIGN bit according to DatAlign value */ + /* Set EXTSEL and EXTPRSEL bits according to ExtTrigSelect value */ + /* Set CTU bit according to ContinueConvEn value */ + /* Set DMNGT and MDSMU bit according to DataTransferMode value */ + tempreg1 |= (uint32_t)(ADC_InitStruct->DatAlign | ADC_InitStruct->ExtTrigSelect + | ((uint32_t)ADC_InitStruct->ContinueConvEn << 1) | ADC_InitStruct->DataTransferMode); + /* Write to ADCx CTRL2 */ + ADCx->CTRL2 = tempreg1; + + /*---------------------------- ADCx CTRL3 Configuration -----------------*/ + /* Get the ADCx CTRL3 value */ + tempreg1 = ADCx->CTRL3; + /* Clear RES bits */ + tempreg1 &= (~CTRL3_CLR_MASK); + /* Configure ADCx resolution */ + /* Set RES bits according to Resolution value */ + tempreg1 |= ADC_InitStruct->Resolution; + /* Write to ADCx CTRL3 */ + ADCx->CTRL3 = tempreg1; + + /*---------------------------- ADCx RSEQ1 Configuration -----------------*/ + /* Get the ADCx RSEQ1 value */ + tempreg1 = ADCx->RSEQ1; + /* Clear L bits */ + tempreg1 &= (~RSEQ1_CLR_MASK); + /* Configure ADCx: regular channel sequence length */ + /* Set LEN bits according to ChsNumber value */ + tempreg2 = (uint8_t)(ADC_InitStruct->ChsNumber - 1U); + tempreg1 |= (uint32_t)tempreg2 << 10U; + /* Write to ADCx RSEQ1 */ + ADCx->RSEQ1 = tempreg1; +} + +/** +*\*\name ADC_InitStruct. +*\*\fun Fills all ADC_InitStruct member with default value. +*\*\param ADC_InitStruct : +*\*\ - WorkMode +*\*\ - MultiChEn +*\*\ - ContinueConvEn +*\*\ - ExtTrigSelect +*\*\ - DatAlign +*\*\ - ChsNumber +*\*\ - Resolution +*\*\return none +**/ +void ADC_InitStruct(ADC_InitType* ADC_InitStruct) +{ + /* Reset ADC init structure parameters values */ + /* Initialize the WorkMode member */ + ADC_InitStruct->WorkMode = ADC_WORKMODE_INDEPENDENT; + /* initialize the MultiChEn member */ + ADC_InitStruct->MultiChEn = DISABLE; + /* Initialize the ContinueConvEn member */ + ADC_InitStruct->ContinueConvEn = DISABLE; + /* Initialize the ExtTrigSelect member */ + ADC_InitStruct->ExtTrigSelect = ADC_EXT_TRIG_REG_CONV_ATIM1_CC1; + /* Initialize the DataTransferMode member */ + ADC_InitStruct->DataTransferMode = ADC_REG_DR_TRANSFER; + /* Initialize the DatAlign member */ + ADC_InitStruct->DatAlign = ADC_DAT_ALIGN_R; + /* Initialize the ChsNumber member */ + ADC_InitStruct->ChsNumber = 1; + /* Initialize the Resolution member */ + ADC_InitStruct->Resolution = ADC_DATA_RES_12BIT; +} + + +/** +*\*\name ADC_Enable. +*\*\fun Configures the specified ADC enable or disable. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_Enable(ADC_Module* ADCx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Set the AD_ON bit to wake up the ADC from power down mode */ + ADCx->CTRL2 |= ADC_ON_EN_MASK; + } + else + { + /* Disable the selected ADC peripheral */ + ADCx->CTRL2 &= (~ADC_ON_EN_MASK); + } +} +/** +*\*\name ADC_SetDMATransferMode. +*\*\fun Select the DMA mode for data transmission in multi-channels conversion. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param DMAMode : +*\*\ - ADC_MULTI_REG_DMA_DISABLE :DMA Mode 0 +*\*\ - ADC_MULTI_REG_DMA_EACH_ADC :DMA Mode 1 +*\*\ - ADC_MULTI_REG_DMA_LIMIT_RES12_10B :DMA Mode 2 +*\*\return none +**/ +void ADC_SetDMATransferMode(ADC_Module *ADCx, uint32_t DMAMode) +{ + __IO uint32_t tempreg; + /* Get the old register value */ + tempreg = ADCx->CTRL2; + /* Clear the old DMA mode value */ + tempreg &= (~ADC_MULTI_REG_DMA_MODE_MASK); + /* Set the DMA mode */ + tempreg |= DMAMode; + /* Store the new register value */ + ADCx->CTRL2 = tempreg; +} +/** +*\*\name ADC_EnableMutiAdcDSMU. +*\*\fun Configures Multi-adc DSMU mode for the specified ADC enable or disable. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_EnableMutiAdcDSMU(ADC_Module *ADCx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable multi-adc DSMU mode */ + ADCx->CTRL2 |= ADC_MUTI_ADC_DSMU_MASK; + } + else + { + /* Disable multi-adc DSMU mode */ + ADCx->CTRL2 &= (~ADC_MUTI_ADC_DSMU_MASK); + } +} +/** +*\*\name ADC_CalibrationOperation. +*\*\fun Starts the selected ADC differential or signal mode calibration process. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return none +**/ +void ADC_CalibrationOperation(ADC_Module* ADCx) +{ + /* Set the flag of starting of calibration */ + ADCx->CTRL2 |= ADC_CALI_EN_MASK; +} + + +/** +*\*\name ADC_GetCalibrationStatus. +*\*\fun Gets the selected ADC calibration status. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return FlagStatus: +*\*\ - RESET : ADCx calibration is finished; +*\*\ - SET : ADCx calibration is not finished; +**/ +FlagStatus ADC_GetCalibrationStatus(ADC_Module* ADCx) +{ + FlagStatus bitstatus; + + /* Check the status of CAL bit */ + if ((ADCx->CTRL2 & ADC_CALI_EN_MASK) != (uint32_t)RESET) + { + /* CAL bit is set: calibration on going */ + bitstatus = SET; + } + else + { + /* CAL bit is reset: end of calibration */ + bitstatus = RESET; + } + + /* Return the CAL bit status */ + return bitstatus; +} +/** +*\*\name ADC_SetMultiTwoSamplingDelay. +*\*\fun Set ADC multimode delay between 2 sampling phases. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param MultiTwoSamplingDelay +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_1 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_2 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_3 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_4 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_5 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_6 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_7 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_8 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_9 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_10 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_11 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_12 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_13 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_14 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_15 +*\*\ - ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_16 +*\*\return none +*\*\note 1.When ADC resolution is 12, the maximum of the parameter 'MultiTwoSamplingDelay' \ +*\*\ can be set ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_12. +*\*\ 2.When ADC resolution is 10, the maximum of the parameter 'MultiTwoSamplingDelay' \ +*\*\ can be set ADC_ADC_MULTI_TWOSMP_DELAY_CYCLE_10. +**/ +void ADC_SetMultiTwoSamplingDelay(ADC_Module* ADCx, uint32_t MultiTwoSamplingDelay) +{ + __IO uint32_t tempreg; + /* Get the old register value */ + tempreg = ADCx->DLYSMP; + /* Clear the old delay number */ + tempreg &= (~ADC_ADC_MULTI_TWOSMP_DELAY_MASK); + /* Set the delay number */ + tempreg |= MultiTwoSamplingDelay; + /* Store the new register value */ + ADCx->DLYSMP = tempreg; +} +/** +*\*\name ADC_SetIndenpentSamplingDelay. +*\*\fun Set ADC delay sampling phases in indenpent mode. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param MultiTwoSamplingDelay +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_1 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_2 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_3 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_4 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_5 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_6 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_7 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_8 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_9 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_10 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_11 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_12 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_13 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_14 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_15 +*\*\ - ADC_INDENPENT_TWOSMP_DELAY_CYCLE_16 +*\*\return none +**/ +void ADC_SetIndenpentSamplingDelay(ADC_Module* ADCx, uint32_t IndenpentSamplingDelay) +{ + uint32_t tempreg; + /* Get the old register value */ + tempreg = ADCx->DLYSMP; + /* Clear the old delay number */ + tempreg &= (~ADC_INDENPENT_TWOSMP_DELAY_MASK); + /* Set the delay number */ + tempreg |= IndenpentSamplingDelay; + /* Store the new register value */ + ADCx->DLYSMP = tempreg; +} +/** +*\*\name ADC_ConfigDiscModeChannelCount. +*\*\fun Configures the discontinuous numbers for the selected ADC regular +*\*\ group channels. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Number : specifies the discontinuous mode regular channel + * count value. This number must be range form 1 to 8. +*\*\return none +**/ +void ADC_ConfigDiscModeChannelCount(ADC_Module* ADCx, uint8_t Number) +{ + __IO uint32_t tempreg; + /* Get the old register value */ + tempreg = ADCx->CTRL1; + /* Clear the old discontinuous mode channel count */ + tempreg &= (~ADC_DISC_NUM_MASK); + /* Set the discontinuous mode channel count */ + tempreg |= (((uint32_t)Number - 1UL) << 8U); + /* Store the new register value */ + ADCx->CTRL1 = tempreg; +} + +/** +*\*\name ADC_EnableAutoInjectedConv. +*\*\fun Enables or disables the selected ADC automatic injected group +*\*\ conversion after regular one +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_EnableAutoInjectedConv(ADC_Module* ADCx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ADC automatic injected group conversion */ + ADCx->CTRL1 |= ADC_JAUTO_EN_MASK; + } + else + { + /* Disable the selected ADC automatic injected group conversion */ + ADCx->CTRL1 &= (~ADC_JAUTO_EN_MASK); + } +} + +/** +*\*\name ADC_EnableDiscMode. +*\*\fun Enables or disables the discontinuous mode on regular group +*\* channel for the specified ADC. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_EnableDiscMode(ADC_Module* ADCx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ADC regular discontinuous mode */ + ADCx->CTRL1 |= ADC_DISC_REG_EN_MASK; + } + else + { + /* Disable the selected ADC regular discontinuous mode */ + ADCx->CTRL1 &= (~ADC_DISC_REG_EN_MASK); + } +} + +/** +*\*\name ADC_EnableInjectedDiscMode. +*\*\fun Enables or disables the discontinuous mode on injected group +*\* channel for the specified ADC. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_EnableInjectedDiscMode(ADC_Module* ADCx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ADC injected discontinuous mode */ + ADCx->CTRL1 |= ADC_DISC_INJ_EN_MASK; + } + else + { + /* Disable the selected ADC injected discontinuous mode */ + ADCx->CTRL1 &= (~ADC_DISC_INJ_EN_MASK); + } +} + +/** +*\*\name ADC_ConfigRegularChannel. +*\*\fun Configures for the selected ADC regular channel its corresponding +*\*\ rank in the sequencer and its sample time. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_Channel : +*\*\ - ADC_CH_0 : ADC Channel0 selected +*\*\ - ADC_CH_1 : ADC Channel1 selected +*\*\ - ADC_CH_2 : ADC Channel2 selected +*\*\ - ADC_CH_3 : ADC Channel3 selected +*\*\ - ADC_CH_4 : ADC Channel4 selected +*\*\ - ADC_CH_5 : ADC Channel5 selected +*\*\ - ADC_CH_6 : ADC Channel6 selected +*\*\ - ADC_CH_7 : ADC Channel7 selected +*\*\ - ADC_CH_8 : ADC Channel8 selected +*\*\ - ADC_CH_9 : ADC Channel9 selected +*\*\ - ADC_CH_10 : ADC Channel10 selected +*\*\ - ADC_CH_11 : ADC Channel11 selected +*\*\ - ADC_CH_12 : ADC Channel12 selected +*\*\ - ADC_CH_13 : ADC Channel13 selected +*\*\ - ADC_CH_14 : ADC Channel14 selected +*\*\ - ADC_CH_15 : ADC Channel15 selected +*\*\ - ADC_CH_16 : ADC Channel16 selected +*\*\ - ADC_CH_17 : ADC Channel17 selected +*\*\ - ADC_CH_18 : ADC Channel18 selected +*\*\ - ADC_CH_19 : ADC Channel19 selected +*\*\param Rank : The rank in the regular group sequencer. This parameter must be between 1 to 20. +*\*\param ADC_SampleTime : The sample time value to be set for the selected channel. +*\*\ - ADC_SAMP_TIME_CYCLES_1 +*\*\ - ADC_SAMP_TIME_CYCLES_2 +*\*\ - ADC_SAMP_TIME_CYCLES_3 +*\*\ - ADC_SAMP_TIME_CYCLES_4 +*\*\ - ADC_SAMP_TIME_CYCLES_5 +*\*\ - ADC_SAMP_TIME_CYCLES_6 +*\*\ - ADC_SAMP_TIME_CYCLES_7 +*\*\ - ADC_SAMP_TIME_CYCLES_10 +*\*\ - ADC_SAMP_TIME_CYCLES_13 +*\*\ - ADC_SAMP_TIME_CYCLES_17 +*\*\ - ADC_SAMP_TIME_CYCLES_24 +*\*\ - ADC_SAMP_TIME_CYCLES_32 +*\*\ - ADC_SAMP_TIME_CYCLES_83 +*\*\ - ADC_SAMP_TIME_CYCLES_93 +*\*\ - ADC_SAMP_TIME_CYCLES_215 +*\*\ - ADC_SAMP_TIME_CYCLES_397 +*\*\return none +**/ +void ADC_ConfigRegularChannel(ADC_Module* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tempreg1, tempreg2; + __IO uint16_t index; + + if (ADC_Channel > ADC_CH_15) /* if ADC_CH_16 ... ADC_CH_19 is selected */ + { + /* Get the old register value */ + tempreg1 = ADCx->SAMPT3; + /* Calculate the mask to clear */ + tempreg2 = ADC_SAMP_TIME_CYCLES_MASK << (4U * (ADC_Channel - 16U)); + /* Clear the old channel sample time */ + tempreg1 &= ~tempreg2; + /* Calculate the mask to set */ + tempreg2 = ((uint32_t)ADC_SampleTime) << (4U * (ADC_Channel - 16U)); + /* Set the new channel sample time */ + tempreg1 |= tempreg2; + /* Store the new register value */ + ADCx->SAMPT3 = tempreg1; + } + else if (ADC_Channel > ADC_CH_7) /* if ADC_CH_8 ... ADC_CH_15 is selected */ + { + /* Get the old register value */ + tempreg1 = ADCx->SAMPT2; + /* Calculate the mask to clear */ + tempreg2 = ADC_SAMP_TIME_CYCLES_MASK << (4U * (ADC_Channel - 8U)); + /* Clear the old channel sample time */ + tempreg1 &= ~tempreg2; + /* Calculate the mask to set */ + tempreg2 = ((uint32_t)ADC_SampleTime) << (4U * (ADC_Channel - 8U)); + /* Set the new channel sample time */ + tempreg1 |= tempreg2; + /* Store the new register value */ + ADCx->SAMPT2 = tempreg1; + } + else /* if ADC_CH_0 ... ADC_CH_7 is selected */ + { + /* Get the old register value */ + tempreg1 = ADCx->SAMPT1; + /* Calculate the mask to clear */ + tempreg2 = ADC_SAMP_TIME_CYCLES_MASK << (4U * (ADC_Channel)); + /* Clear the old channel sample time */ + tempreg1 &= ~tempreg2; + /* Calculate the mask to set */ + tempreg2 = ((uint32_t)ADC_SampleTime) << (4U * (ADC_Channel)); + /* Set the new channel sample time */ + tempreg1 |= tempreg2; + /* Store the new register value */ + ADCx->SAMPT1 = tempreg1; + } + + if (Rank < 7U) /* For Rank 1 to 6 */ + { + /* Get the old register value */ + tempreg1 = ADCx->RSEQ4; + /* Calculate the mask to clear */ + tempreg2 = ADC_RESQ_SEQ_MASK << (5U * (Rank - 1U)); + /* Clear the old SQx bits for the selected rank */ + tempreg1 &= ~tempreg2; + /* Calculate the mask to set */ + tempreg2 = (uint32_t)ADC_Channel << (5U * (Rank - 1U)); + /* Set the SQx bits for the selected rank */ + tempreg1 |= tempreg2; + /* Store the new register value */ + ADCx->RSEQ4 = tempreg1; + } + else if (Rank < 13U) /* For Rank 7 to 12 */ + { + /* Get the old register value */ + tempreg1 = ADCx->RSEQ3; + /* Calculate the mask to clear */ + tempreg2 = ADC_RESQ_SEQ_MASK << (5U * (Rank - 7U)); + /* Clear the old SQx bits for the selected rank */ + tempreg1 &= ~tempreg2; + /* Calculate the mask to set */ + tempreg2 = (uint32_t)ADC_Channel << (5U * (Rank - 7U)); + /* Set the SQx bits for the selected rank */ + tempreg1 |= tempreg2; + /* Store the new register value */ + ADCx->RSEQ3 = tempreg1; + } + else if (Rank < 19U) /* For Rank 13 to 18 */ + { + /* Get the old register value */ + tempreg1 = ADCx->RSEQ2; + /* Calculate the mask to clear */ + tempreg2 = ADC_RESQ_SEQ_MASK << (5U * (Rank - 13U)); + /* Clear the old SQx bits for the selected rank */ + tempreg1 &= ~tempreg2; + /* Calculate the mask to set */ + tempreg2 = (uint32_t)ADC_Channel << (5U * (Rank - 13U)); + /* Set the SQx bits for the selected rank */ + tempreg1 |= tempreg2; + /* Store the new register value */ + ADCx->RSEQ2 = tempreg1; + } + else /* For Rank 19 to 20 */ + { + /* Get the old register value */ + tempreg1 = ADCx->RSEQ1; + /* Calculate the mask to clear */ + tempreg2 = ADC_RESQ_SEQ_MASK << (5U * (Rank - 19U)); + /* Clear the old SQx bits for the selected rank */ + tempreg1 &= ~tempreg2; + /* Calculate the mask to set */ + tempreg2 = (uint32_t)ADC_Channel << (5U * (Rank - 19U)); + /* Set the SQx bits for the selected rank */ + tempreg1 |= tempreg2; + /* Store the new register value */ + ADCx->RSEQ1 = tempreg1; + } + /*delay 4*ADC_CLK at least for synchronizing*/ + for(index = 0;index<24;index++) + { + __NOP(); + } +} + +/** +*\*\name ADC_GetDat. +*\*\fun Get the last ADCx conversion result data for regular channel +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return The Data conversion value. +**/ +uint16_t ADC_GetDat(ADC_Module* ADCx) +{ + /* Return the selected ADC conversion value */ + return (uint16_t)ADCx->DAT; +} + +/** +*\*\name ADC_GetMutiModeConversionDat. +*\*\fun Get the last ADC conversion result data in dual-ADC or tripple-ADC mode. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return The Data conversion value in dual-ADC or tripple-ADC mode. +**/ +uint32_t ADC_GetMutiModeConversionDat(ADC_Module* ADCx) +{ + return (uint32_t)ADC1->DAT; +} +/** +*\*\name ADC_SetRegularTriggerEdge. +*\*\fun Set ADCx group regular conversion trigger polarity. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ExternalRegularTriggerEdge : +*\*\ - ADC_REG_TRIG_EXT_SOFTWARE +*\*\ - ADC_REG_TRIG_EXT_RISING +*\*\ - ADC_REG_TRIG_EXT_FALLING +*\*\ - ADC_REG_TRIG_EXT_RISINGFALLING +*\*\return none +**/ +void ADC_SetRegularTriggerEdge(ADC_Module* ADCx, uint32_t ExternalRegularTriggerEdge) +{ + uint32_t tempreg; + /* Get the old register value */ + tempreg = ADCx->CTRL2; + /* Clear the old external trigger polarity selection for regular group */ + tempreg &= (~ADC_REG_TRIG_EXT_MASK); + /* Set the external trigger polarity selection for regular group */ + tempreg |= ExternalRegularTriggerEdge; + /* Store the new register value */ + ADCx->CTRL2 = tempreg; +} +/** +*\*\name ADC_SetInjectTriggerEdge. +*\*\fun Set ADCx group injected conversion trigger polarity. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ExternalInjectTriggerEdge : +*\*\ - ADC_INJ_TRIG_EXT_SOFTWARE +*\*\ - ADC_INJ_TRIG_EXT_RISING +*\*\ - ADC_INJ_TRIG_EXT_FALLING +*\*\ - ADC_INJ_TRIG_EXT_RISINGFALLING +*\*\return none +**/ +void ADC_SetInjectTriggerEdge(ADC_Module* ADCx, uint32_t ExternalInjectTriggerEdge) +{ + uint32_t tempreg; + /* Get the old register value */ + tempreg = ADCx->CTRL2; + /* Clear the old external trigger polarity selection for injected group */ + tempreg &= (~ADC_INJ_TRIG_EXT_MASK); + /* Set the external trigger polarity selection for injected group */ + tempreg |= ExternalInjectTriggerEdge; + /* Store the new register value */ + ADCx->CTRL2 = tempreg; +} +/** +*\*\name ADC_ConfigExternalTrigRegularConv. +*\*\fun Configures the ADCx external trigger source for regular channels conversion. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_ExternalTrigRegularConv : +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_CC1 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_CC2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_CC3 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_CC4 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM2_CC1 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM2_CC2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM2_CC3 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM1_TRGO2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_CC1 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_CC2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_CC3 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_CC4 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM2_TRGO2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM4_TRGO2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM3_TRGO2 +*\*\ - ADC_EXT_TRIG_REG_CONV_ATIM4_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB1_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB2_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB3_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMA1_TRGO +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB1_CC2 +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB2_CC4 +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMB3_CC2 +*\*\ - ADC_EXT_TRIG_REG_CONV_GTIMA1_CC4 +*\*\ - ADC_EXT_TRIG_REG_CONV_SHRTIM1_TRGO1 +*\*\ - ADC_EXT_TRIG_REG_CONV_SHRTIM1_TRGO3 +*\*\ - ADC_EXT_TRIG_REG_CONV_SHRTIM2_TRGO1 +*\*\ - ADC_EXT_TRIG_REG_CONV_SHRTIM2_TRGO3 +*\*\ - ADC_EXT_TRIG_REG_CONV_EXT_INT0_15 +*\*\ - ADC_EXT_TRIG_REG_CONV_SOFTWARE +*\*\return none +**/ +void ADC_ConfigExternalTrigRegularConv(ADC_Module* ADCx, uint32_t ADC_ExternalTrigRegularConv) +{ + uint32_t tempreg; + + /* Get the old register value */ + tempreg = ADCx->CTRL2; + /* Clear the old external event selection for regular group */ + tempreg &= (~ADC_EXT_TRIG_REG_CONV_MASK); + /* Set the external event selection for regular group */ + tempreg |= ADC_ExternalTrigRegularConv; + /* Store the new register value */ + ADCx->CTRL2 = tempreg; +} +/** +*\*\name ADC_ConfigExternalTrigInjectedConv. +*\*\fun Configures the ADCx external trigger source for injected channels conversion. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_ExternalTrigInjecConv : +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM1_CC1 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM1_CC2 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM1_CC3 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM1_CC4 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM1_TRGO +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM2_CC1 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM2_CC2 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM2_CC3 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM1_TRGO2 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM2_TRGO +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM3_CC1 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM3_CC2 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM3_CC3 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM3_CC4 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM2_TRGO2 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM3_TRGO +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM4_TRGO2 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM3_TRGO2 +*\*\ - ADC_EXT_TRIG_INJ_CONV_ATIM4_TRGO +*\*\ - ADC_EXT_TRIG_INJ_CONV_GTIMB1_TRGO +*\*\ - ADC_EXT_TRIG_INJ_CONV_GTIMB2_TRGO +*\*\ - ADC_EXT_TRIG_INJ_CONV_GTIMB3_TRGO +*\*\ - ADC_EXT_TRIG_INJ_CONV_GTIMA1_TRGO +*\*\ - ADC_EXT_TRIG_INJ_CONV_GTIMB1_CC1 +*\*\ - ADC_EXT_TRIG_INJ_CONV_GTIMB2_CC4 +*\*\ - ADC_EXT_TRIG_INJ_CONV_GTIMB3_CC1 +*\*\ - ADC_EXT_TRIG_INJ_CONV_GTIMA1_CC3 +*\*\ - ADC_EXT_TRIG_INJ_CONV_SHRTIM1_TRGO2 +*\*\ - ADC_EXT_TRIG_INJ_CONV_SHRTIM1_TRGO4 +*\*\ - ADC_EXT_TRIG_INJ_CONV_SHRTIM2_TRGO2 +*\*\ - ADC_EXT_TRIG_INJ_CONV_SHRTIM2_TRGO4 +*\*\ - ADC_EXT_TRIG_INJ_CONV_EXT_INT0_15 +*\*\ - ADC_EXT_TRIG_INJ_CONV_SOFTWARE +*\*\return none +**/ +void ADC_ConfigExternalTrigInjectedConv(ADC_Module* ADCx, uint32_t ADC_ExternalTrigInjecConv) +{ + uint32_t tempreg; + + /* Get the old register value */ + tempreg = ADCx->CTRL2; + /* Clear the old external event selection for injected group */ + tempreg &= (~ADC_EXT_TRIG_INJ_CONV_MASK); + /* Set the external event selection for injected group */ + tempreg |= ADC_ExternalTrigInjecConv; + /* Store the new register value */ + ADCx->CTRL2 = tempreg; +} + +/** +*\*\name ADC_StartInjectedConv. +*\*\fun Enables or disables the selected ADC software start ADC group injected conversion. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return none +*\*\note setting of this feature is conditioned to ADC state: +*\*\ 1. ADC must be enabled without conversion on going on group injected, +*\*\ 2. without conversion stop command on going on group injected, +*\*\ 3. without ADC disable command on going. +**/ +void ADC_StartInjectedConv(ADC_Module *ADCx) +{ + /* Enable the selected ADC to start ADC group injected conversion */ + ADCx->CTRL3 |= ADC_INJ_START_MASK; +} + +/** +*\*\name ADC_StartRegularConv. +*\*\fun Enables or disables the selected ADC software start ADC group regular conversion. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return none +*\*\note setting of this feature is conditioned to ADC state: +*\*\ 1. ADC must be enabled without conversion on going on group regular, +*\*\ 2. without conversion stop command on going on group regular, +*\*\ 3. without ADC disable command on going. +**/ +void ADC_StartRegularConv(ADC_Module *ADCx) +{ + /* Enable the selected ADC to start ADC group regular conversion */ + ADCx->CTRL3 |= ADC_REG_START_MASK; +} + +/** +*\*\name ADC_EnableSoftwareStartConv. +*\*\fun Enables or disables the selected ADC software start conversion .. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_EnableSoftwareStartConv(ADC_Module* ADCx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ADC conversion on external event and start the selected + ADC conversion */ + ADCx->CTRL2 |= ADC_REG_SWSTART_MASK; + } + else + { + /* Disable the selected ADC conversion on external event and stop the selected + ADC conversion */ + ADCx->CTRL2 &= (~ADC_REG_SWSTART_MASK); + } +} +/** +*\*\name ADC_GetSoftwareStartConvStatus. +*\*\fun Gets the selected ADC Software start conversion Status. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return The new state of ADC software start conversion (SET or RESET). +**/ +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_Module* ADCx) +{ + FlagStatus bitstatus ; + + if ((ADCx->CTRL2 & ADC_REG_SWSTART_MASK) != (uint32_t)RESET) + { + /* SOFT_START bit is set */ + bitstatus = SET; + } + else + { + /* SOFT_START bit is reset */ + bitstatus = RESET; + } + + return bitstatus; +} +/** +*\*\name ADC_EnableSoftwareStartInjectedConv. +*\*\fun Enables or disables the selected ADC start of the injected channels conversion. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_EnableSoftwareStartInjectedConv(ADC_Module* ADCx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ADC conversion for injected group on external event and start the selected + ADC injected conversion */ + ADCx->CTRL2 |= ADC_INJ_SWSTART_MASK; + } + else + { + /* Disable the selected ADC conversion on external event for injected group and stop the selected + ADC injected conversion */ + ADCx->CTRL2 &= (~ADC_INJ_SWSTART_MASK); + } +} +/** +*\*\name ADC_GetSoftwareStartInjectedConvCmdStatus. +*\*\fun Gets the selected ADC Software start injected conversion Status. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return The new state of ADC software start injected conversion (SET or RESET). +**/ +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_Module* ADCx) +{ + FlagStatus bitstatus ; + + /* Check the status of INJ_SWSTART bit */ + if ((ADCx->CTRL2 & ADC_INJ_SWSTART_MASK) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name ADC_StopInjectedConv. +*\*\fun Stop ADC group injected channels conversion. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return none +**/ +void ADC_StopInjectedConv(ADC_Module* ADCx) +{ + ADCx->CTRL3 |= ADC_INJ_SWSTOP_MASK; +} +/** +*\*\name ADC_StopRegularConv. +*\*\fun Stop ADC group regular channels conversion. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return none +**/ +void ADC_StopRegularConv(ADC_Module* ADCx) +{ + ADCx->CTRL3 |= ADC_REG_SWSTOP_MASK; +} + +/** +*\*\name ADC_SetRegularDataTransferMode. +*\*\fun Set ADC data transfer mode. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param DataTransferMode : Select Data Management configuration +*\*\ - ADC_REG_DR_TRANSFER +*\*\ - ADC_REG_DSMU_TRANSFER +*\*\ - ADC_REG_DMA_TRANSFER +*\*\return none +**/ +void ADC_SetRegularDataTransferMode(ADC_Module *ADCx, uint32_t DataTransferMode) +{ + uint32_t tempreg; + + /* Get the old register value */ + tempreg = ADCx->CTRL2; + /* Clear the old external event selection */ + tempreg &= (~ADC_DATA_TRANS_Mode_MASK); + /* Set the external event selection */ + tempreg |= DataTransferMode; + /* Store the new register value */ + ADCx->CTRL2 = tempreg; +} + +/** +*\*\name ADC_GetGainCompensationCmdStatus. +*\*\fun Gets the selected ADC gain compensation status. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return The new state of gain compensation (SET or RESET). +**/ +FlagStatus ADC_GetGainCompensationCmdStatus(ADC_Module* ADCx) +{ + FlagStatus bitstatus ; + + /* Check the status of GCOMPEN bit */ + if ((ADCx->CTRL3 & ADC_GAIN_COMPENSATION_EN_MASK) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name ADC_EnableTempSensor. +*\*\fun Enables or disables the temperature sensor +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_EnableTempSensor(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* connect ADC3_CH18 with the temperature sensor */ + AFIO->ADCSW_CFG |= AFIO_ADCSW_CFG_SW_TEMP; + /* Enable the temperature sensor */ + ADC1->CTRL2 |= ADC_TS_EN_MASK; + } + else + { + /* Disconnect with the temperature sensor */ + AFIO->ADCSW_CFG &= (~AFIO_ADCSW_CFG_SW_TEMP); + /* Disable the temperature sensor */ + ADC1->CTRL2 &= (~ADC_TS_EN_MASK); + } +} + +/** +*\*\name ADC_EnableVrefint. +*\*\fun Enables or disables the Vrefint channel +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_EnableVrefint(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Let ADC3_CH19 connected with the Vrefint */ + AFIO->ADCSW_CFG |= AFIO_ADCSW_CFG_VREF; + /* Enable the Vrefint channel*/ + ADC1->CTRL3 |= ADC_VREFINT_EN_MASK; + } + else + { + /* let ADC3_CH19 channel disconnected with the Vrefint */ + AFIO->ADCSW_CFG &= (~AFIO_ADCSW_CFG_VREF); + /* Disable the Vrefint channel*/ + ADC1->CTRL3 &= (~ADC_VREFINT_EN_MASK); + } +} + +/** +*\*\name ADC_ConfigInjectedChannel. +*\*\fun Configures for the selected ADC injected channel its corresponding +*\*\ rank in the sequencer and its sample time. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_Channel : +*\*\ - ADC_CH_0 : ADC Channel0 selected +*\*\ - ADC_CH_1 : ADC Channel1 selected +*\*\ - ADC_CH_2 : ADC Channel2 selected +*\*\ - ADC_CH_3 : ADC Channel3 selected +*\*\ - ADC_CH_4 : ADC Channel4 selected +*\*\ - ADC_CH_5 : ADC Channel5 selected +*\*\ - ADC_CH_6 : ADC Channel6 selected +*\*\ - ADC_CH_7 : ADC Channel7 selected +*\*\ - ADC_CH_8 : ADC Channel8 selected +*\*\ - ADC_CH_9 : ADC Channel9 selected +*\*\ - ADC_CH_10 : ADC Channel10 selected +*\*\ - ADC_CH_11 : ADC Channel11 selected +*\*\ - ADC_CH_12 : ADC Channel12 selected +*\*\ - ADC_CH_13 : ADC Channel13 selected +*\*\ - ADC_CH_14 : ADC Channel14 selected +*\*\ - ADC_CH_15 : ADC Channel15 selected +*\*\ - ADC_CH_16 : ADC Channel16 selected +*\*\ - ADC_CH_17 : ADC Channel17 selected +*\*\ - ADC_CH_18 : ADC Channel18 selected +*\*\ - ADC_CH_19 : ADC Channel19 selected +*\*\param Rank : The rank in the injected group sequencer. This parameter must be between 1 to 4. +*\*\param ADC_SampleTime : The sample time value to be set for the selected channel. +*\*\ - ADC_SAMP_TIME_CYCLES_1 +*\*\ - ADC_SAMP_TIME_CYCLES_2 +*\*\ - ADC_SAMP_TIME_CYCLES_3 +*\*\ - ADC_SAMP_TIME_CYCLES_4 +*\*\ - ADC_SAMP_TIME_CYCLES_5 +*\*\ - ADC_SAMP_TIME_CYCLES_6 +*\*\ - ADC_SAMP_TIME_CYCLES_7 +*\*\ - ADC_SAMP_TIME_CYCLES_10 +*\*\ - ADC_SAMP_TIME_CYCLES_13 +*\*\ - ADC_SAMP_TIME_CYCLES_17 +*\*\ - ADC_SAMP_TIME_CYCLES_24 +*\*\ - ADC_SAMP_TIME_CYCLES_32 +*\*\ - ADC_SAMP_TIME_CYCLES_83 +*\*\ - ADC_SAMP_TIME_CYCLES_93 +*\*\ - ADC_SAMP_TIME_CYCLES_215 +*\*\ - ADC_SAMP_TIME_CYCLES_397 +*\*\return none +**/ +void ADC_ConfigInjectedChannel(ADC_Module* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tempreg1, tempreg2, tempreg3; + __IO uint16_t index; + + if (ADC_Channel > ADC_CH_15) /* if ADC_CH_16 ... ADC_CH_19 is selected */ + { + /* Get the old register value */ + tempreg1 = ADCx->SAMPT3; + /* Calculate the mask to clear */ + tempreg2 = ADC_SAMP_TIME_CYCLES_MASK << (4U * (ADC_Channel - 16U)); + /* Clear the old channel sample time */ + tempreg1 &= ~tempreg2; + /* Calculate the mask to set */ + tempreg2 = ((uint32_t)ADC_SampleTime) << (4U * (ADC_Channel - 16U)); + /* Set the new channel sample time */ + tempreg1 |= tempreg2; + /* Store the new register value */ + ADCx->SAMPT3 = tempreg1; + } + else if (ADC_Channel > ADC_CH_7) /* if ADC_CH_8 ... ADC_CH_15 is selected */ + { + /* Get the old register value */ + tempreg1 = ADCx->SAMPT2; + /* Calculate the mask to clear */ + tempreg2 = ADC_SAMP_TIME_CYCLES_MASK << (4U * (ADC_Channel - 8U)); + /* Clear the old channel sample time */ + tempreg1 &= ~tempreg2; + /* Calculate the mask to set */ + tempreg2 = ((uint32_t)ADC_SampleTime) << (4U * (ADC_Channel - 8U)); + /* Set the new channel sample time */ + tempreg1 |= tempreg2; + /* Store the new register value */ + ADCx->SAMPT2 = tempreg1; + } + else /* if ADC_CH_0 ... ADC_CH_7 is selected */ + { + /* Get the old register value */ + tempreg1 = ADCx->SAMPT1; + /* Calculate the mask to clear */ + tempreg2 = ADC_SAMP_TIME_CYCLES_MASK << (4U * ADC_Channel); + /* Clear the old channel sample time */ + tempreg1 &= ~tempreg2; + /* Calculate the mask to set */ + tempreg2 = ((uint32_t)ADC_SampleTime) << (4U * ADC_Channel); + /* Set the new channel sample time */ + tempreg1 |= tempreg2; + /* Store the new register value */ + ADCx->SAMPT1 = tempreg1; + } + + /* Rank configuration */ + /* Get the old register value */ + tempreg1 = ADCx->JSEQ; + /* Get JLEN value: Number = JLEN+1 */ + tempreg3 = (tempreg1 & ADC_JESQ_LEN_MASK) >> 25U; + /* Calculate the mask to clear: ((Rank-1)+(4-JLEN-1)) */ + tempreg2 = ADC_JESQ_SEQ_MASK << (5U * (((uint32_t)Rank + 3U) - (tempreg3 + 1U))); + /* Clear the old JSEQx bits for the selected rank */ + tempreg1 &= ~tempreg2; + /* Calculate the mask to set: ((Rank-1)+(4-JLEN-1)) */ + tempreg2 = (uint32_t)ADC_Channel << (5U * (((uint32_t)Rank + 3U) - (tempreg3 + 1U))); + /* Set the JSEQx bits for the selected rank */ + tempreg1 |= tempreg2; + /* Store the new register value */ + ADCx->JSEQ = tempreg1; + /*delay 4*ADC_CLK at least for synchronizing*/ + for(index = 0;index<24;index++) + { + __NOP(); + } +} + +/** +*\*\name ADC_ConfigInjectedSequencerLength. +*\*\fun Configures the sequencer length for injected channels +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Length : The sequencer length. This parameter must be a number between 1 to 4. +**/ +void ADC_ConfigInjectedSequencerLength(ADC_Module* ADCx, uint8_t Length) +{ + uint32_t tempreg1, tempreg2; + + /* Get the old register value */ + tempreg1 = ADCx->JSEQ; + /* Clear the old injected sequnence lenght JLEN bits */ + tempreg1 &= (~ADC_JESQ_LEN_MASK); + /* Set the injected sequnence lenght JLEN bits */ + tempreg2 = (uint32_t)Length - 1U; + tempreg1 |= tempreg2 << 25U; + /* Store the new register value */ + ADCx->JSEQ = tempreg1; +} + +/** +*\*\name ADC_SetOffsetConfig. +*\*\fun Set the specified channel conversion offset configuration. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_Offset : +*\*\ - ADC_REGESTER_OFFSET_1 +*\*\ - ADC_REGESTER_OFFSET_2 +*\*\ - ADC_REGESTER_OFFSET_3 +*\*\ - ADC_REGESTER_OFFSET_4 +*\*\param ADC_OffsetStruct : +*\*\ - OffsetData : Set the selected channel data offset .This parameter must be range from 0 to 0xfff. +*\*\ - OffsetChannel : Set the selected channel .This parameter must be range from 0 to 0x13. means CH0 - CH19. +*\*\ - OffsetDirPositiveEn : Enable or disable the selected channel offset positive direction. +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - OffsetSatenEn : Enable or disable the selected channel offset saturation . +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - OffsetEn : Enable or disable the selected channel offset. +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_SetOffsetConfig(ADC_Module* ADCx, uint8_t ADC_Offset, ADC_OffsetType* ADC_OffsetStruct) +{ + uint32_t tempreg, temp; + + tempreg = (uint32_t)ADCx; + tempreg += ADC_Offset; + /* Get register value */ + temp = *(__IO uint32_t*)tempreg; + temp &= (~(ADC_OFFSET_DATA_MASK | ADC_OFFSET_EN_MASK | ADC_OFFSET_CH_MASK | ADC_OFFSET_SATEN_EN_MASK | ADC_OFFSET_DIR_MASK )); + /* Set the selected channel offset direction and channel */ + temp |= ((uint32_t)ADC_OffsetStruct->OffsetData | (((uint32_t)ADC_OffsetStruct->OffsetChannel) << 26)); + + /* Set the selected channel offset direction, saturation, enable or disable*/ + temp |= (BIT_JUDGE_AND_HANDLER(ADC_OffsetStruct->OffsetDirPositiveEn, ADC_OFFSET_DIR_MASK) | \ + BIT_JUDGE_AND_HANDLER(ADC_OffsetStruct->OffsetSatenEn, ADC_OFFSET_SATEN_EN_MASK) | \ + BIT_JUDGE_AND_HANDLER(ADC_OffsetStruct->OffsetEn, ADC_OFFSET_EN_MASK)); + + *(__IO uint32_t*)tempreg = temp; +} +/** +*\*\name ADC_GetOffsetConfig. +*\*\fun Get the specified channel conversion offset configuration. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_Offset : +*\*\ - ADC_REGESTER_OFFSET_1 +*\*\ - ADC_REGESTER_OFFSET_2 +*\*\ - ADC_REGESTER_OFFSET_3 +*\*\ - ADC_REGESTER_OFFSET_4 +*\*\param ADC_OffsetStruct : +*\*\ - OffsetData : Set the selected channel data offset .This parameter must be range from 0 to 0xfff. +*\*\ - OffsetChannel : Set the selected channel .This parameter must be range from 0 to 0x13. means CH0 - CH19. +*\*\ - OffsetDirPositiveEn : Enable or disable the selected channel offset positive direction. +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - OffsetSatenEn : Enable or disable the selected channel offset saturation . +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - OffsetEn : Enable or disable the selected channel offset. +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_GetOffsetConfig(ADC_Module* ADCx, uint8_t ADC_Offset, ADC_OffsetType* ADC_OffsetStruct) +{ + uint32_t tempreg, temp; + + tempreg = (uint32_t)ADCx; + tempreg += ADC_Offset; + /* Get register value */ + temp = *(__IO uint32_t*)tempreg; + ADC_OffsetStruct->OffsetEn = ((temp & ADC_OFFSET_EN_MASK) != 0U) ? ENABLE : DISABLE; + ADC_OffsetStruct->OffsetSatenEn = ((temp & ADC_OFFSET_SATEN_EN_MASK) != 0U) ? ENABLE : DISABLE; + ADC_OffsetStruct->OffsetDirPositiveEn = ((temp & ADC_OFFSET_DIR_MASK) != 0U) ? ENABLE : DISABLE; + + ADC_OffsetStruct->OffsetChannel = (uint8_t)((temp & ADC_OFFSET_CH_MASK) >> 26); + ADC_OffsetStruct->OffsetData = (uint16_t)(temp & ADC_OFFSET_DATA_MASK); +} +/** +*\*\name ADC_EnableAnalogWatchdogEventToTim. +*\*\fun Enables or disables the selected ADC watch dog event output to TIM. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Awdg : +*\*\ - ADC_AWDG1 +*\*\ - ADC_AWDG2 +*\*\ - ADC_AWDG3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_EnableAnalogWatchdogEventToTIM(ADC_Module* ADCx, ADC_AWDG Awdg, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable ADC watch dog event output to TIM */ + ADCx->AWDCTRL |= ((uint32_t)0x1u << (uint8_t)Awdg); + } + else + { + /* Disable ADC watch dog event output to TIM */ + ADCx->AWDCTRL &= ~(((uint32_t)0x1u << (uint8_t)Awdg)); + } +} +/** +*\*\name ADC_ConfigAnalogWatchdogThresholds. +*\*\fun Configures the high and low thresholds of the analog watchdog 1/2/3. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Awdg : +*\*\ - ADC_AWDG1 +*\*\ - ADC_AWDG2 +*\*\ - ADC_AWDG3 +*\*\param HighThreshold : the ADC analog watchdog 1/2/3 high threshold value. +*\*\ - This parameter must be a 12bit value. +*\*\param LowThreshold : the ADC analog watchdog 1/2/3 low threshold value. +*\*\ - This parameter must be a 12bit value. +*\*\return none +**/ +void ADC_ConfigAnalogWatchdogThresholds(ADC_Module* ADCx, ADC_AWDG Awdg, uint16_t HighThreshold, uint16_t LowThreshold) +{ + if(Awdg == ADC_AWDG1) + { + /* Set the ADCx high threshold of AWDG1 */ + ADCx->AWD1HIGH = HighThreshold; + /* Set the ADCx low threshold of AWDG1 */ + ADCx->AWD1LOW = LowThreshold; + } + else if(Awdg == ADC_AWDG2) + { + /* Set the ADCx high threshold of AWDG2 */ + ADCx->AWD2HIGH = HighThreshold; + /* Set the ADCx low threshold of AWDG2 */ + ADCx->AWD2LOW = LowThreshold; + } + else if(Awdg == ADC_AWDG3) + { + /* Set the ADCx high threshold of AWDG3 */ + ADCx->AWD3HIGH = HighThreshold; + /* Set the ADCx low threshold of AWDG3 */ + ADCx->AWD3LOW = LowThreshold; + } + else + { + /*no process */ + } +} +/** +*\*\name ADC_GetInjectedConversionDat. +*\*\fun Get the ADC injected channel conversion result. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_InjectedChannelOffset : +*\*\ - ADC_INJECT_DATA_OFFSET_1 +*\*\ - ADC_INJECT_DATA_OFFSET_2 +*\*\ - ADC_INJECT_DATA_OFFSET_3 +*\*\ - ADC_INJECT_DATA_OFFSET_4 +*\*\return The data conversion value. this date is range 0 - 0xFFFF. +**/ +uint16_t ADC_GetInjectedConversionDat(ADC_Module* ADCx, uint8_t ADC_InjectedChannelOffset) +{ + uint32_t tempreg; + + tempreg = (uint32_t)ADCx; + tempreg += ADC_InjectedChannelOffset; + + /* Returns the selected injected channel conversion data value */ + return (uint16_t)(*(__IO uint32_t*)tempreg); +} + +/** +*\*\name ADC_ConfigAnalogWatchdog1WorkChannelType. +*\*\fun Enables or disables the analog watchdog 1 on single/all regular or injected channels. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_AnalogWatchdog : +*\*\ - ADC_ANALOG_WTDG_NONE +*\*\ - ADC_ANALOG_WTDG_SINGLEREG_ENABLE +*\*\ - ADC_ANALOG_WTDG_SINGLEINJEC_ENABLE +*\*\ - ADC_ANALOG_WTDG_SINGLEREG_OR_INJEC_ENABLE +*\*\ - ADC_ANALOG_WTDG_ALLREG_ENABLE +*\*\ - ADC_ANALOG_WTDG_ALLINJEC_ENABLE +*\*\ - ADC_ANALOG_WTDG_ALLREG_ALLINJEC_ENABLE +*\*\return none. +**/ +void ADC_ConfigAnalogWatchdog1WorkChannelType(ADC_Module* ADCx, uint32_t ADC_AnalogWatchdog) +{ + uint32_t tempreg; + + /* Get the old register value */ + tempreg = ADCx->CTRL1; + /* Clear AWD1EJCH, AWD1ERCH and AWD1SGLEN bits */ + tempreg &= (~(ADC_CTRL1_AWD1ERCH | ADC_CTRL1_AWD1SGLEN | ADC_CTRL1_AWD1EJCH)); + /* Set the analog watchdog enable mode */ + tempreg |= ADC_AnalogWatchdog; + /* Store the new register value */ + ADCx->CTRL1 = tempreg; +} +/** +*\*\name ADC_SetAWDG1FilteringConfig. +*\*\fun Set ADC analog watchdog filtering configuration. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param FilteringCount : +*\*\ - ADC_AWDG1_FILTERING_NONE +*\*\ - ADC_AWDG1_FILTERING_2SAMPLES +*\*\ - ADC_AWDG1_FILTERING_3SAMPLES +*\*\ - ADC_AWDG1_FILTERING_4SAMPLES +*\*\ - ADC_AWDG1_FILTERING_5SAMPLES +*\*\ - ADC_AWDG1_FILTERING_6SAMPLES +*\*\ - ADC_AWDG1_FILTERING_7SAMPLES +*\*\ - ADC_AWDG1_FILTERING_8SAMPLES +*\*\return none. +**/ +void ADC_SetAWDG1FilteringConfig(ADC_Module *ADCx, uint32_t FilteringCount) +{ + uint32_t tempreg; + + /* Get the old register value */ + tempreg = ADCx->AWD1LOW; + /* Clear AWDFIL bits */ + tempreg &= (~ADC_AWDG1_FILTERING_MASK); + /* Set the AWDFIL bit */ + tempreg |= FilteringCount; + /* Store the new register value */ + ADCx->AWD1LOW = tempreg; +} +/** +*\*\name ADC_ConfigAnalogWatchdog1SingleChannel. +*\*\fun Configures the analog watchdog 1 guarded on single channel. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_AnalogWatchdog : +*\*\ - ADC_CH_0 : ADC Channel0 selected +*\*\ - ADC_CH_1 : ADC Channel1 selected +*\*\ - ADC_CH_2 : ADC Channel2 selected +*\*\ - ADC_CH_3 : ADC Channel3 selected +*\*\ - ADC_CH_4 : ADC Channel4 selected +*\*\ - ADC_CH_5 : ADC Channel5 selected +*\*\ - ADC_CH_6 : ADC Channel6 selected +*\*\ - ADC_CH_7 : ADC Channel7 selected +*\*\ - ADC_CH_8 : ADC Channel8 selected +*\*\ - ADC_CH_9 : ADC Channel9 selected +*\*\ - ADC_CH_10 : ADC Channel10 selected +*\*\ - ADC_CH_11 : ADC Channel11 selected +*\*\ - ADC_CH_12 : ADC Channel12 selected +*\*\ - ADC_CH_13 : ADC Channel13 selected +*\*\ - ADC_CH_14 : ADC Channel14 selected +*\*\ - ADC_CH_15 : ADC Channel15 selected +*\*\ - ADC_CH_16 : ADC Channel16 selected +*\*\ - ADC_CH_17 : ADC Channel17 selected +*\*\ - ADC_CH_18 : ADC Channel18 selected +*\*\ - ADC_CH_19 : ADC Channel19 selected +*\*\return none. +**/ +void ADC_ConfigAnalogWatchdog1SingleChannel(ADC_Module* ADCx, uint8_t ADC_Channel) +{ + uint32_t tempreg; + + /* Get the old register value */ + tempreg = ADCx->CTRL1; + /* Clear the Analog watchdog 1 channel select bits */ + tempreg &= (~ADC_AWD1CH_MASK); + /* Set the Analog watchdog channel */ + tempreg |= ((uint32_t)ADC_Channel) << 16; + /* Store the new register value */ + ADCx->CTRL1 = tempreg; +} +/** +*\*\name ADC_SetAnalogWatchdog23MonitChannels. +*\*\fun Set ADC analog watchdog 2/3 monitored channels: a single channel, multiple channels or all channels. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param AWDG_RegEnOffset : +*\*\ - ADC_AWDG2_EN_OFFSET : config analog watchdog 2. +*\*\ - ADC_AWDG3_EN_OFFSET : config analog watchdog 3. +*\*\param AWDG_ChannelGroup : channels monitored: flexible on channels monitored, selection is +*\*\ channel wise, from from 1 to all channels. Specificity of this analog watchdog: +*\*\ Multiple channels can be selected.eg : 0x00000005 mean CH0 and CH2 are monitored. +*\*\ 0x00000000 mean this analog watchdog disable. +*\*\return none. +**/ +void ADC_SetAnalogWatchdog23MonitChannels(ADC_Module* ADCx, uint8_t AWDG_RegEnOffset, uint32_t AWDG_ChannelGroup) +{ + uint32_t tempreg, temp; + /* Get the old register value */ + tempreg = (uint32_t)ADCx; + tempreg += AWDG_RegEnOffset; + temp = *(__IO uint32_t*)tempreg; + /* Clear the Analog watchdog 2/3 channel select bits */ + temp &= (~ADC_AWDG23_EN_MASK); + /* Set the Analog watchdog channel */ + temp |= AWDG_ChannelGroup; + /* Store the new register value */ + *(__IO uint32_t*)tempreg = temp; +} +/** +*\*\name ADC_GetAnalogWatchdog23MonitChannels. +*\*\fun Get ADC analog watchdog 2/3 monitored channels. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param AWDG_RegEnOffset : +*\*\ - ADC_AWDG2_EN_OFFSET : analog watchdog 2. +*\*\ - ADC_AWDG3_EN_OFFSET : analog watchdog 3. +*\*\return channels monitored by this analog watchdog2/3. +**/ +uint32_t ADC_GetAnalogWatchdog23MonitChannels(ADC_Module* ADCx, uint8_t AWDG_RegEnOffset) +{ + uint32_t tempreg; + + tempreg = (uint32_t)ADCx; + tempreg += AWDG_RegEnOffset; + return ((*(__IO uint32_t*)tempreg) & ADC_AWDG23_EN_MASK); +} +/** +*\*\name ADC_SetAnalogWatchdog23IntConfig. +*\*\fun Enable or disable ADC analog watchdog 2/3 monitored channels interrupt. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param AWDG_RegIntEnOffset : +*\*\ - ADC_AWDG2_INTEN_OFFSET : config analog watchdog 2. +*\*\ - ADC_AWDG3_INTEN_OFFSET : config analog watchdog 3. +*\*\param AWDG_ChannelEn : channels monitored: flexible on channels monitored, selection is +*\*\ channel wise, from from 1 to all channels. Specificity of this analog watchdog: +*\*\ Multiple channels can be selected.eg : 0x00000005 mean CH0 and CH2 monitored enable interrupt. +*\*\ 0x00000000 mean this analog watchdog disable the interrupt. +*\*\return none. +**/ +void ADC_SetAnalogWatchdog23IntConfig(ADC_Module* ADCx, uint8_t AWDG_RegIntEnOffset, uint32_t AWDG_ChannelEn) +{ + uint32_t tempreg, temp; + + tempreg = (uint32_t)ADCx; + tempreg += AWDG_RegIntEnOffset; + temp = *(__IO uint32_t*)tempreg; + /* Clear the Analog watchdog 2/3 channel select bits */ + temp &= (~ADC_AWDG23_INTEN_MASK); + /* Set the Analog watchdog channel */ + temp |= AWDG_ChannelEn; + /* Store the new register value */ + *(__IO uint32_t*)tempreg = temp; +} + +/** +*\*\name ADC_GetAnalogWatchdog23MonitChannels. +*\*\fun Get ADC analog watchdog 2/3 monitored channels. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param AWDG_RegEnOffset : +*\*\ - ADC_AWDG2_EN_OFFSET : analog watchdog 2. +*\*\ - ADC_AWDG3_EN_OFFSET : analog watchdog 3. +*\*\return channels monitored by this analog watchdog2/3 enable the interrupt or not. +**/ +uint32_t ADC_GetAnalogWatchdog23IntConfig(ADC_Module* ADCx, uint8_t AWDG_RegEnOffset) +{ + uint32_t tempreg; + + tempreg = (uint32_t)ADCx; + tempreg += AWDG_RegEnOffset; + return ((*(__IO uint32_t*)tempreg) & ADC_AWDG23_INTEN_MASK); +} + +/** +*\*\name ADC_GetAnalogWatchdog23StatusFlag. +*\*\fun Get ADC analog watchdog 2/3 monitored channels status flag. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param AWDG_RegSTSOffset : +*\*\ - ADC_AWDG2_STS_OFFSET : analog watchdog 2. +*\*\ - ADC_AWDG3_STS_OFFSET : analog watchdog 3. +*\*\return channels monitored by this analog watchdog2/3 indicates outside the programmed +*\*\ thresholds or not. +**/ +uint32_t ADC_GetAnalogWatchdog23StatusFlag(ADC_Module* ADCx, uint8_t AWDG_RegSTSOffset) +{ + uint32_t tempreg; + + tempreg = (uint32_t)ADCx; + tempreg += AWDG_RegSTSOffset; + + return ((*(__IO uint32_t*)tempreg) & ADC_AWDG23_STATUS_MASK); +} + +/** +*\*\name ADC_ClearAnalogWatchdog23StatusFlag. +*\*\fun Clear ADC analog watchdog 2/3 monitored channels status flag. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param AWDG_RegSTSOffset : +*\*\ - ADC_AWDG2_STS_OFFSET : analog watchdog 2. +*\*\ - ADC_AWDG3_STS_OFFSET : analog watchdog 3. +*\*\param AWDG_ChannelFlag : channels monitored flag wil l be cleared. +*\*\ eg : 0x00000005 mean CH0 and CH2 status flag will be cleared. +*\*\return none. +**/ +void ADC_ClearAnalogWatchdog23StatusFlag(ADC_Module* ADCx, uint8_t AWDG_RegSTSOffset, uint32_t AWDG_ChannelFlag) +{ + uint32_t tempreg; + + tempreg = (uint32_t)ADCx; + tempreg += AWDG_RegSTSOffset; + + /* Clear the Analog watchdog channel flag */ + *(__IO uint32_t*)tempreg = AWDG_ChannelFlag; +} + + +/** +*\*\name ADC_GetFlagStatus. +*\*\fun Checks whether the specified ADC flag is set or not. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_FLAG : +*\*\ - ADC_FLAG_ENDC +*\*\ - ADC_FLAG_EOC_ANY +*\*\ - ADC_FLAG_JSTR +*\*\ - ADC_FLAG_JENDC +*\*\ - ADC_FLAG_JEOC_ANY +*\*\ - ADC_FLAG_STR +*\*\ - ADC_FLAG_AWDG1 +*\*\ - ADC_FLAG_RDY +*\*\ - ADC_FLAG_PDRDY +*\*\ - ADC_FLAG_EOSAMP +*\*\ - ADC_FLAG_ROSOVF +*\*\ - ADC_FLAG_JOSOVF +*\*\ - ADC_FLAG_ROSOVFDSMU +*\*\ - ADC_FLAG_REFLAG +*\*\ - ADC_FLAG_WEFLAG +*\*\return The new state of ADC_FLAG (SET or RESET). +**/ +FlagStatus ADC_GetFlagStatus(ADC_Module* ADCx, uint32_t ADC_FLAG) +{ + FlagStatus bitstatus ; + + /* Check the status of the specified ADC flag */ + if ((ADCx->STS & ((uint32_t)ADC_FLAG)) != (uint8_t)RESET) + { + /* ADC_FLAG is set */ + bitstatus = SET; + } + else + { + /* ADC_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the ADC_FLAG status */ + return bitstatus; +} + +/** +*\*\name ADC_ClearFlag. +*\*\fun Clears pending flags of the specified ADC. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_FLAG : +*\*\ - ADC_FLAG_ENDC +*\*\ - ADC_FLAG_EOC_ANY +*\*\ - ADC_FLAG_JSTR +*\*\ - ADC_FLAG_JENDC +*\*\ - ADC_FLAG_JEOC_ANY +*\*\ - ADC_FLAG_STR +*\*\ - ADC_FLAG_AWDG1 +*\*\ - ADC_FLAG_RDY +*\*\ - ADC_FLAG_PDRDY +*\*\ - ADC_FLAG_EOSAMP +*\*\ - ADC_FLAG_ROSOVF +*\*\ - ADC_FLAG_JOSOVF +*\*\ - ADC_FLAG_ROSOVFDSMU +*\*\ - ADC_FLAG_REFLAG +*\*\ - ADC_FLAG_WEFLAG +*\*\return none. +**/ +void ADC_ClearFlag(ADC_Module* ADCx, uint32_t ADC_FLAG) +{ + /* Clear the selected ADC flags */ + ADCx->STS = ((uint32_t)ADC_FLAG & ADC_FLAG_ALL_MASK) ; +} + +/** +*\*\name ADC_ConfigInt. +*\*\fun Enables or disables the specified ADC interrupts. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_IT : +*\*\ - ADC_INT_ENDC +*\*\ - ADC_INT_ENDCA +*\*\ - ADC_INT_JENDC +*\*\ - ADC_INT_JENDCA +*\*\ - ADC_INT_AWD1 +*\*\ - ADC_INT_EOSAMP +*\*\ - ADC_INT_PDRDY +*\*\ - ADC_INT_RDY +*\*\ - ADC_INT_WRITEERR +*\*\ - ADC_INT_READERR +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void ADC_ConfigInt(ADC_Module* ADCx, uint32_t ADC_IT, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ADC interrupts */ + ADCx->CTRL1 |= (ADC_IT & ADC_INT_CONTROL_MASK); + } + else + { + /* Disable the selected ADC interrupts */ + ADCx->CTRL1 &= ~(ADC_IT & ADC_INT_CONTROL_MASK); + } +} +/** +*\*\name ADC_GetIntStatus. +*\*\fun Checks whether the specified ADC interrupt has occurred or not. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_IT : specifies the ADC interrupt source to check. +*\*\ - ADC_INT_ENDC +*\*\ - ADC_INT_ENDCA +*\*\ - ADC_INT_JENDC +*\*\ - ADC_INT_JENDCA +*\*\ - ADC_INT_AWD1 +*\*\ - ADC_INT_EOSAMP +*\*\ - ADC_INT_PDRDY +*\*\ - ADC_INT_RDY +*\*\ - ADC_INT_WRITEERR +*\*\ - ADC_INT_READERR +*\*\return The new state of ADC_IT (SET or RESET). +**/ +INTStatus ADC_GetIntStatus(ADC_Module* ADCx, uint32_t ADC_IT) +{ + INTStatus bitstatus; + uint32_t enablestatus; + uint32_t status; + + /* Get the ADC_IT enable bit status */ + enablestatus = (ADCx->CTRL1 & ADC_IT); + status = ((ADC_IT >> 8)& ADC_FLAG_ALL_MASK); + + /* Check the status of the specified ADC interrupt */ + if(((ADCx->STS & status) != 0U) && (enablestatus != 0U)) + { + /* ADC_IT is set */ + bitstatus = SET; + } + else + { + /* ADC_IT is reset */ + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name ADC_ClearIntPendingBit. +*\*\fun Clears interrupt pending bits of the specified ADC. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_IT : +*\*\ - ADC_INT_ENDC +*\*\ - ADC_INT_ENDCA +*\*\ - ADC_INT_JENDC +*\*\ - ADC_INT_JENDCA +*\*\ - ADC_INT_AWD1 +*\*\ - ADC_INT_EOSAMP +*\*\ - ADC_INT_PDRDY +*\*\ - ADC_INT_RDY +*\*\ - ADC_INT_WRITEERR +*\*\ - ADC_INT_READERR +*\*\return none. +**/ +void ADC_ClearIntPendingBit(ADC_Module* ADCx, uint32_t ADC_IT) +{ + /* Clear the selected ADC interrupt pending bits */ + ADCx->STS = ((ADC_IT >> 8)& ADC_FLAG_ALL_MASK) ; +} + + +/** +*\*\name ADC_SetChannelSingleDiff. +*\*\fun Set mode single-ended or differential input of the selected ADC channel. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Channel : +*\*\ - ADC_CH_1 +*\*\ - ADC_CH_2 +*\*\ - ADC_CH_3 +*\*\ - ADC_CH_4 +*\*\ - ADC_CH_5 +*\*\ - ADC_CH_6 +*\*\ - ADC_CH_7 +*\*\ - ADC_CH_8 +*\*\ - ADC_CH_9 +*\*\ - ADC_CH_10 +*\*\ - ADC_CH_11 +*\*\ - ADC_CH_12 +*\*\ - ADC_CH_13 +*\*\ - ADC_CH_14 +*\*\ - ADC_CH_15 +*\*\ - ADC_CH_16 +*\*\ - ADC_CH_17 +*\*\ - ADC_CH_18 +*\*\ - ADC_CH_19 +*\*\param SingleDiff : +*\*\ - ADC_SINGLE_ENDED +*\*\ - ADC_DIFFERENTIAL_ENDED +*\*\return none. +*\*\note Some channels are internally fixed to single-ended inputs: please refer to ADC chapter of user manual. +**/ +void ADC_SetChannelSingleDiff(ADC_Module* ADCx, uint32_t Channel, uint32_t SingleDiff) +{ + if (SingleDiff == ADC_DIFFERENTIAL_ENDED) + { + ADCx->DIFSEL |= ((uint32_t)0x01 << Channel); + } + else + { + ADCx->DIFSEL &= (~((uint32_t)0x01 << Channel)); + } +} + +/** +*\*\name ADC_SetGainCompensation. +*\*\fun Set ADC gain compensation. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param GainCompensationMode : +*\*\ - ADC_GAIN_COMPENSATION_MODE0 : Saturation range is max 0x0-0xFFF (12-bit) +*\*\ - ADC_GAIN_COMPENSATION_MODE1 : Saturation range is max 0x0-0x3FFF (14-bit) +*\*\param GainCompensationValue : +*\*\ when this value is 0, it means gain compensation will be disabled and value set to 0. +*\*\ when this value is 1 ~ 16383, gain compensation will be enabled with specified value. +*\*\return none. +**/ +void ADC_SetGainCompensation(ADC_Module *ADCx, uint32_t GainCompensationMode, uint32_t GainCompensationValue) +{ + uint32_t tempreg; + /* Get the old register value */ + tempreg = ADCx->CTRL3; + /* Clear saturaion and gain compensation enable select bits */ + tempreg &= (~ADC_GAIN_COMPENSATION_MODE_MASK); + + if(GainCompensationValue != 0U) + { + /*Enables the selected ADCx gain compensation mode**/ + tempreg |= GainCompensationMode; + } + else + { + /*no process*/ + } + + /* Store the new register value */ + ADCx->CTRL3 = tempreg; + ADCx->GCOMP = (GainCompensationValue & ADC_GAIN_COMPENSATION_VALUE_MASK); +} + +/** +*\*\name ADC_SetConvResultBitNum. +*\*\fun Set ADC resolution including 12bit,10bit . +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ResultBitNum : +*\*\ - ADC_DATA_RES_12BIT +*\*\ - ADC_DATA_RES_10BIT +*\*\return none. +**/ +void ADC_SetConvResultBitNum(ADC_Module* ADCx, uint32_t ResultBitNum) +{ + if(ResultBitNum == ADC_DATA_RES_12BIT) + { + /* Set ADC resolution */ + ADCx->CTRL3 |= ADC_DATA_RES_12BIT; + } + else + { + /* Clear resolution select bits */ + ADCx->CTRL3 &= (~ADC_DATA_RES_12BIT); + } +} + +/** +*\*\name ADC_SelectClockMode. +*\*\fun Set Adc Clock mode from AHB or PLL. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ClockMode : +*\*\ - ADC_CLOCK_MODE_PLL +*\*\ - ADC_CLOCK_MODE_AHB +*\*\return none. +**/ +void ADC_SelectClockMode(ADC_Module* ADCx, uint32_t ClockMode) +{ + if(ClockMode == ADC_CLOCK_MODE_PLL) + { + ADCx->CTRL3 |= ADC_CLOCK_MODE_PLL; + } + else + { + ADCx->CTRL3 &= (~ADC_CLOCK_MODE_PLL); + } +} +/** +*\*\name ADC_SetBypassCalibration. +*\*\fun Enable or disable ADC calibration bypass mode. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void ADC_SetBypassCalibration(ADC_Module* ADCx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + ADCx->CTRL3 |= ADC_BYPASS_CAL_MASK; + } + else + { + ADCx->CTRL3 &= (~ADC_BYPASS_CAL_MASK); + } +} + +/** +*\*\name ADC_EnableBatteryVoltageMonitor. +*\*\fun Enables or disables the specified ADC battery voltage monitor. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note if users wants to measure the VBAT/4, they should set this bit first. +**/ +void ADC_EnableBatteryVoltageMonitor(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Let ADC3_CH17 connected with the battery voltage */ + AFIO->ADCSW_CFG |= AFIO_ADCSW_CFG_VBAT; + /* Enable the selected ADC battery voltage monitor */ + ADC1->CTRL3 |= ADC_VOLT_MONITOR_EN_MASK; + } + else + { + /* let ADC3_CH17 channel disconnected with the battery voltage */ + AFIO->ADCSW_CFG &= (~AFIO_ADCSW_CFG_VBAT); + /* Disable the selected ADC battery voltage monitor */ + ADC1->CTRL3 &= (~ADC_VOLT_MONITOR_EN_MASK); + } +} + +/** +*\*\name ADC_ConfigOverSamplingRatioAndShift. +*\*\fun Set ADC oversampling rate times and shift bit. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Ratio : ADC oversampling ratio times +*\*\ - ADC_OVERSAMPE_RATE_TIMES_1 +*\*\ - ADC_OVERSAMPE_RATE_TIMES_2 +*\*\ - ADC_OVERSAMPE_RATE_TIMES_4 +*\*\ - ADC_OVERSAMPE_RATE_TIMES_8 +*\*\ - ADC_OVERSAMPE_RATE_TIMES_16 +*\*\ - ADC_OVERSAMPE_RATE_TIMES_32 +*\*\ - ADC_OVERSAMPE_RATE_TIMES_64 +*\*\ - ADC_OVERSAMPE_RATE_TIMES_128 +*\*\ - ADC_OVERSAMPE_RATE_TIMES_256 +*\*\ - ADC_OVERSAMPE_RATE_TIMES_512 +*\*\ - ADC_OVERSAMPE_RATE_TIMES_1024 +*\*\param Shift : ADC oversampling data right shift +*\*\ - ADC_OVERSAMPE_DATA_SHIFT_0 +*\*\ - ADC_OVERSAMPE_DATA_SHIFT_1 +*\*\ - ADC_OVERSAMPE_DATA_SHIFT_2 +*\*\ - ADC_OVERSAMPE_DATA_SHIFT_3 +*\*\ - ADC_OVERSAMPE_DATA_SHIFT_4 +*\*\ - ADC_OVERSAMPE_DATA_SHIFT_5 +*\*\ - ADC_OVERSAMPE_DATA_SHIFT_6 +*\*\ - ADC_OVERSAMPE_DATA_SHIFT_7 +*\*\ - ADC_OVERSAMPE_DATA_SHIFT_8 +*\*\ - ADC_OVERSAMPE_DATA_SHIFT_9 +*\*\ - ADC_OVERSAMPE_DATA_SHIFT_10 +*\*\return none +**/ +void ADC_ConfigOverSamplingRatioAndShift(ADC_Module *ADCx, uint32_t Ratio, uint32_t Shift) +{ + uint32_t tempreg; + /* Get the old register value */ + tempreg = ADCx->OSCFG; + /* Clear oversampling ratio and shift select bits */ + tempreg &= (~(ADC_OVERSAMPE_RATE_TIMES_MASK | ADC_OVERSAMPE_DATA_SHIFT_MASK)); + /* Set ADC oversampling ratio and shift bit */ + tempreg |= (Ratio | Shift); + /* Store the new register value */ + ADCx->OSCFG = tempreg; +} + +/** +*\*\name ADC_SetOverSamplingScope. +*\*\fun Set ADC oversampling scope. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param OversampleScope :This parameter can be one of the following values +*\*\ - ADC_OVERSAMPE_DISABLE +*\*\ - ADC_OVERSAMPE_REGULAR_CONTINUED +*\*\ - ADC_OVERSAMPE_REGULAR_RESUMED +*\*\ - ADC_OVERSAMPE_INJECTED +*\*\ - ADC_OVERSAMPE_REGULAR_INJECTED +*\*\return none +**/ +void ADC_SetOverSamplingScope(ADC_Module *ADCx, uint32_t OversampleScope) +{ + uint32_t tempreg; + /* Get the old register value */ + tempreg = ADCx->OSCFG; + /* Clear oversampling select bits */ + tempreg &= (~(ADC_OVERSAMPE_REG_EN_MASK | ADC_OVERSAMPE_INJ_EN_MASK | ADC_OVERSAMPE_MODE_MASK)); + /* Set ADC oversampling select bits */ + tempreg |= (OversampleScope); + /* Store the new register value */ + ADCx->OSCFG = tempreg; +} + +/** +*\*\name ADC_SetOverSamplingDiscont. +*\*\fun Set ADC oversampling discontinuous mode (triggered mode). +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ADC_EnableOverSamplingDiscont(ADC_Module *ADCx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + ADCx->OSCFG |= ADC_OVERSAMPE_TRIG_REG_MASK; + } + else + { + ADCx->OSCFG &= (~ADC_OVERSAMPE_TRIG_REG_MASK); + } +} + +/** +*\*\name ADC_EnableFIFO. +*\*\fun Enables or disables the specified ADC FIFO. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void ADC_EnableFIFO(ADC_Module* ADCx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ADC FIFO */ + ADCx->FIFOCFG |= ADC_FIFO_EN_MASK; + } + else + { + /* Disable the selected ADC FIFO */ + ADCx->FIFOCFG &= (~ADC_FIFO_EN_MASK); + } +} +/** +*\*\name ADC_ClearFIFO. +*\*\fun Clear the specified ADC FIFO. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return none. +**/ +void ADC_ClearFIFO(ADC_Module* ADCx) +{ + /* Clear the selected ADC FIFO */ + ADCx->FIFOCFG |= ADC_FIFO_CLR_MASK; +} + +/** +*\*\name ADC_ConfigFIFOWaterLevel. +*\*\fun Configures the specified ADC FIFO water level . +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param FIFO_Level : This parameter must be between 1 to 16. +*\*\return none. +**/ +void ADC_ConfigFIFOWaterLevel(ADC_Module* ADCx, uint32_t FIFO_Level) +{ + uint32_t tempreg; + /* Get the old register value */ + tempreg = ADCx->FIFOCFG; + /* Clear WL(water level) select bits */ + tempreg &= (~ADC_FIFO_WATER_LEVEL_MASK); + /* Set ADC WL(water level) select bits */ + tempreg |= ((FIFO_Level - 1U) << 6U); + /* Store the new register value */ + ADCx->FIFOCFG = tempreg; +} +/** +*\*\name ADC_GetFIFOInvalidedDataCount. +*\*\fun Get the total counts of invalided data . +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\return The the total counts of invalided data .This value is between 0 to 16. +**/ +uint8_t ADC_GetFIFOInvalidedDataCount(ADC_Module* ADCx) +{ + return (uint8_t)((ADCx->FIFOSTS & (ADC_FIFO_INVALIED_DATA_COUNT_MASK)) >> 5); +} +/** +*\*\name ADC_GetFIFOFlagStatus. +*\*\fun Checks whether the specified ADC flag in fifo mode is set or not. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_FIFOFLAG : +*\*\ - ADC_FIFO_FLAG_FULL +*\*\ - ADC_FIFO_FLAG_EMPTY +*\*\ - ADC_FIFO_FLAG_HALF_FULL +*\*\ - ADC_FIFO_FLAG_NOT_EMPTY +*\*\return The new state of ADC_FIFOFLAG (SET or RESET). +**/ +FlagStatus ADC_GetFIFOFlagStatus(ADC_Module* ADCx, uint16_t ADC_FIFOFLAG) +{ + FlagStatus bitstatus ; + + /* Check the status of the specified ADC flag */ + if ((ADCx->FIFOSTS & ((uint32_t)ADC_FIFOFLAG)) != (uint8_t)RESET) + { + /* ADC_FIFOFLAG is set */ + bitstatus = SET; + } + else + { + /* ADC_FIFOFLAG is reset */ + bitstatus = RESET; + } + + /* Return the ADC_FIFOFLAG status */ + return bitstatus; +} +/** +*\*\name ADC_ClearFIFOFlag. +*\*\fun Clears FIFO status bit of the specified ADC. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_FIFO_FLAG : +*\*\ - ADC_FIFO_FLAG_FULL +*\*\ - ADC_FIFO_FLAG_EMPTY +*\*\ - ADC_FIFO_FLAG_HALF_FULL +*\*\ - ADC_FIFO_FLAG_NOT_EMPTY +*\*\return none. +**/ +void ADC_ClearFIFOFlag(ADC_Module* ADCx, uint16_t ADC_FIFO_FLAG) +{ + /* Clear the selected ADC FIFO interrupt pending bits */ + ADCx->FIFOSTS = ((uint32_t)ADC_FIFO_FLAG) ; +} +/** +*\*\name ADC_ConfigFIFOInt. +*\*\fun Enables or disables the specified ADC interrupts in FIFO mode. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_FIFO_IT : +*\*\ - ADC_FIFO_INT_FULL +*\*\ - ADC_FIFO_INT_EMPTY +*\*\ - ADC_FIFO_INT_HALF_FULL +*\*\ - ADC_FIFO_INT_NOT_EMPTY +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void ADC_ConfigFIFOInt(ADC_Module* ADCx, uint16_t ADC_FIFO_IT, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ADC FIFO interrupts */ + ADCx->FIFOCFG |= (uint32_t)ADC_FIFO_IT; + } + else + { + /* Disable the selected ADC FIFO interrupts */ + ADCx->FIFOCFG &= (~(uint32_t)ADC_FIFO_IT); + } +} +/** +*\*\name ADC_ClearFIFOIntPendingBit. +*\*\fun Clears FIFO interrupt pending bits of the specified ADC. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_FIFO_IT : +*\*\ - ADC_FIFO_INT_FULL +*\*\ - ADC_FIFO_INT_EMPTY +*\*\ - ADC_FIFO_INT_HALF_FULL +*\*\ - ADC_FIFO_INT_NOT_EMPTY +*\*\return none. +**/ +void ADC_ClearFIFOIntPendingBit(ADC_Module* ADCx, uint16_t ADC_FIFO_IT) +{ + /* Clear the selected ADC FIFO interrupt pending bits */ + ADCx->FIFOSTS |= ((uint32_t)ADC_FIFO_IT) ; +} + +//** +//*\*\name ADC_WriteDataIntoInternalReg. +//*\*\fun Write data into internal register of specified the address. +//*\*\param ADCx : +//*\*\ - ADC1 +//*\*\ - ADC2 +//*\*\ - ADC3 +//*\*\param Addr : The value is range of 0 - 7; +//*\*\param Data : The value is range of 0 - 255; +//*\*\return ErrorStatus. +//*\*\ - SUCCESS +//*\*\ - ERROR +//**/ +//static ErrorStatus ADC_WriteDataIntoInternalReg(ADC_Module* ADCx, uint8_t Addr, uint8_t Data) +//{ +// uint32_t tempreg; +// ErrorStatus status = SUCCESS; +// __IO uint32_t timeout = ADC_WRITE_READ_TIMEOUT_CYCLE; +// /* Get the old register value */ +// tempreg = ADCx->INTLRCFG; +// /* Clear WDATA[7:0], WEN, RWSTART and ADDR[2:0] select bits */ +// tempreg &= (~ADC_WRITE_REG_MASK); +// /* Set ADC WEN and ADDR[2:0] select bits */ +// tempreg |= (ADC_INTLRCFG_WEN | ((uint32_t)Addr <<27) | ((uint32_t)Data <<18) ); +// /* Store the new register value */ +// ADCx->INTLRCFG = tempreg; + +// /* Start write internal register */ +// ADCx->INTLRCFG |= ADC_WRITE_READ_START; +// /* Wait write internal register finishing */ +// while((ADCx->INTLRCFG & ADC_WRITE_READ_RDY) == (uint8_t)RESET) +// { +// timeout--; +// if (timeout == 0UL) +// { +// /* Time-out error */ +// status = ERROR; +// break; +// } +// } +// return status; +//} +///** +//*\*\name ADC_ReadDataFromInternalReg. +//*\*\fun Read data from internal register according to the address. +//*\*\param ADCx : +//*\*\ - ADC1 +//*\*\ - ADC2 +//*\*\ - ADC3 +//*\*\param Addr : The value is range of 0 - 7; +//*\*\param ReadOutData : The value is range of 0 - 255; 0xFFFFU is invalid data. +//*\*\return ErrorStatus. +//*\*\ - SUCCESS +//*\*\ - ERROR +//**/ +//static ErrorStatus ADC_ReadDataFromInternalReg(ADC_Module* ADCx, uint8_t Addr, uint16_t *ReadOutData) +//{ +// uint32_t tempreg; +// ErrorStatus status = SUCCESS; +// __IO uint32_t timeout = ADC_WRITE_READ_TIMEOUT_CYCLE; +// /* Get the old register value */ +// tempreg = ADCx->INTLRCFG; +// /* Clear WEN, RWSTART and ADDR[2:0] select bits */ +// tempreg &= (~ADC_READ_REG_MASK); +// /* Set ADC WEN and ADDR[2:0] select bits */ +// tempreg |= (((uint32_t)Addr <<27) ); +// /* Store the new register value */ +// ADCx->INTLRCFG = tempreg; + +// /* Start read internal register */ +// ADCx->INTLRCFG |= ADC_WRITE_READ_START; +// /* Wait read internal register finishing */ +// while((ADCx->INTLRCFG & ADC_WRITE_READ_RDY) == (uint8_t)RESET) +// { +// timeout--; +// if (timeout == 0UL) +// { +// /* Time-out error */ +// status = ERROR; +// *ReadOutData = 0xFF; +// break; +// } +// } +// if(status != ERROR) +// { +// /* Return valid data */ +// *ReadOutData = (uint16_t)((ADCx->INTLRCFG & ADC_RDATA_MASK) >> 13) ; +// } +// else +// { +// /* Return invalid data */ +// *ReadOutData = 0xFFFF; +// } +// return status; +//} + +/** +*\*\name ADC_ConfigClk. +*\*\fun Configures the ADC prescaler. +*\*\param ADCx : +*\*\ - ADC1 +*\*\ - ADC2 +*\*\ - ADC3 +*\*\param ADC_ClkMode : +*\*\ - ADC_CTRL3_CKMOD_AHB +*\*\ - ADC_CTRL3_CKMOD_PLL +*\*\param Pll_CLK_source : +*\*\ - RCC_ADCPLLCLK_SRC_PLL2B +*\*\ - RCC_ADCPLLCLK_SRC_PLL1B +*\*\ - RCC_ADCPLLCLK_SRC_PLL3B +*\*\ - RCC_ADCPLLCLK_SRC_PLL3C +*\*\param RCC_ADCPrescaler : specifies the ADC prescaler. +*\*\param CLK_divider(ADCSYSCLK prescaler): +*\*\ - RCC_ADCSYSCLK_DIV1 +*\*\ - RCC_ADCSYSCLK_DIV2 +*\*\ - RCC_ADCSYSCLK_DIV3 +*\*\ - RCC_ADCSYSCLK_DIV4 +*\*\ - RCC_ADCSYSCLK_DIV5 +*\*\ - RCC_ADCSYSCLK_DIV6 +*\*\ - RCC_ADCSYSCLK_DIV7 +*\*\ - RCC_ADCSYSCLK_DIV8 +*\*\ - RCC_ADCSYSCLK_DIV9 +*\*\ - RCC_ADCSYSCLK_DIV10 +*\*\ - RCC_ADCSYSCLK_DIV11 +*\*\ - RCC_ADCSYSCLK_DIV12 +*\*\ - RCC_ADCSYSCLK_DIV13 +*\*\ - RCC_ADCSYSCLK_DIV14 +*\*\ - RCC_ADCSYSCLK_DIV15 +*\*\ - RCC_ADCSYSCLK_DIV16 +*\*\ - RCC_ADCSYSCLK_DIV17 +*\*\ - RCC_ADCSYSCLK_DIV18 +*\*\ - RCC_ADCSYSCLK_DIV19 +*\*\ - RCC_ADCSYSCLK_DIV20 +*\*\ - RCC_ADCSYSCLK_DIV21 +*\*\ - RCC_ADCSYSCLK_DIV22 +*\*\ - RCC_ADCSYSCLK_DIV23 +*\*\ - RCC_ADCSYSCLK_DIV24 +*\*\ - RCC_ADCSYSCLK_DIV25 +*\*\ - RCC_ADCSYSCLK_DIV26 +*\*\ - RCC_ADCSYSCLK_DIV27 +*\*\ - RCC_ADCSYSCLK_DIV28 +*\*\ - RCC_ADCSYSCLK_DIV29 +*\*\ - RCC_ADCSYSCLK_DIV30 +*\*\ - RCC_ADCSYSCLK_DIV31 +*\*\ - RCC_ADCSYSCLK_DIV32 +*\*\ - RCC_ADCSYSCLK_DIV33 +*\*\ - RCC_ADCSYSCLK_DIV34 +*\*\ - RCC_ADCSYSCLK_DIV35 +*\*\ - RCC_ADCSYSCLK_DIV36 +*\*\ - RCC_ADCSYSCLK_DIV37 +*\*\ - RCC_ADCSYSCLK_DIV38 +*\*\ - RCC_ADCSYSCLK_DIV39 +*\*\ - RCC_ADCSYSCLK_DIV40 +*\*\ - RCC_ADCSYSCLK_DIV41 +*\*\ - RCC_ADCSYSCLK_DIV42 +*\*\ - RCC_ADCSYSCLK_DIV43 +*\*\ - RCC_ADCSYSCLK_DIV44 +*\*\ - RCC_ADCSYSCLK_DIV45 +*\*\ - RCC_ADCSYSCLK_DIV46 +*\*\ - RCC_ADCSYSCLK_DIV47 +*\*\ - RCC_ADCSYSCLK_DIV48 +*\*\ - RCC_ADCSYSCLK_DIV49 +*\*\ - RCC_ADCSYSCLK_DIV50 +*\*\ - RCC_ADCSYSCLK_DIV51 +*\*\ - RCC_ADCSYSCLK_DIV52 +*\*\ - RCC_ADCSYSCLK_DIV53 +*\*\ - RCC_ADCSYSCLK_DIV54 +*\*\ - RCC_ADCSYSCLK_DIV55 +*\*\ - RCC_ADCSYSCLK_DIV56 +*\*\ - RCC_ADCSYSCLK_DIV57 +*\*\ - RCC_ADCSYSCLK_DIV58 +*\*\ - RCC_ADCSYSCLK_DIV59 +*\*\ - RCC_ADCSYSCLK_DIV60 +*\*\ - RCC_ADCSYSCLK_DIV61 +*\*\ - RCC_ADCSYSCLK_DIV62 +*\*\ - RCC_ADCSYSCLK_DIV63 +*\*\return none. +**/ +void ADC_ConfigClk(ADC_Module* ADCx, ADC_CTRL3_CKMOD ADC_ClkMode, uint32_t Pll_CLK_source, uint32_t RCC_ADCPrescaler) +{ + if(ADC_ClkMode == ADC_CTRL3_CKMOD_AHB) + { + ADC_SelectClockMode(ADCx, (uint32_t)ADC_CTRL3_CKMOD_AHB); + } + else + { + ADC_SelectClockMode(ADCx, (uint32_t)ADC_CLOCK_MODE_PLL); + /* Enable ADC1 PLL clocks */ + RCC_EnableAHB1PeriphClk1(RCC_AHB1_PERIPHEN_M7_ADC1PLL, ENABLE); + + if(ADCx == ADC1) + { + RCC_ConfigAdc1PllClk(Pll_CLK_source); + } + else if(ADCx == ADC2) + { + RCC_ConfigAdc2PllClk(Pll_CLK_source); + } + else if(ADCx == ADC3) + { + RCC_ConfigAdc3PllClk(Pll_CLK_source); + } + else + { + /*no process*/ + } + } + + if(ADCx == ADC1) + { + RCC_ConfigAdc1SysClk(RCC_ADCPrescaler); + } + else if(ADCx == ADC2) + { + RCC_ConfigAdc2SysClk(RCC_ADCPrescaler); + } + else if(ADCx == ADC3) + { + RCC_ConfigAdc3SysClk(RCC_ADCPrescaler); + } + else + { + /*no process*/ + } +} + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_comp.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_comp.c new file mode 100644 index 0000000000..2f2c35379b --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_comp.c @@ -0,0 +1,785 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_comp.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_comp.h" +#include "n32h76x_78x_rcc.h" + + + +#define COMP3_4_FUNCTION_ENABLE_MASK (0x00010000u) + +/** COMP Driving Functions Declaration **/ + +/** +*\*\name COMP_DeInit. +*\*\fun Reset the COMP registers. +*\*\return none +**/ +void COMP_DeInit(void) +{ + RCC_EnableRDPeriphReset2(RCC_RD_PERIPHRST_COMP); + /*Disable COMP3/4 Function*/ + AFEC->TRIMR6 &= (~COMP3_4_FUNCTION_ENABLE_MASK); +} +/** +*\*\name COMP_StructInit. +*\*\fun Fills all COMP_initstruct member with default value. +*\*\param COMP_initstruct : +*\*\ - Blking +*\*\ - Hyst +*\*\ - PolRev +*\*\ - InpSel +*\*\ - InmSel +*\*\ - FilterEn +*\*\ - ClkPsc +*\*\ - SampWindow +*\*\ - Threshold +*\*\ - En +*\*\return none +**/ +void COMP_StructInit(COMP_InitType* COMP_InitStruct) +{ + /* Initialize the Blking */ + COMP_InitStruct->Blking = COMP_CTRL_BLKING_NO; + /* Initialize the Hyst */ + COMP_InitStruct->Hyst = COMP_CTRL_HYST_NO; + /* Initialize the PolRev */ + COMP_InitStruct->PolRev = DISABLE; + /* Initialize the InpSel */ + COMP_InitStruct->InpSel = COMPX_CTRL_INPSEL_RES; + /* Initialize the InmSel */ + COMP_InitStruct->InmSel = COMPX_CTRL_INMSEL_RES; + /* Initialize the FilterEn */ + COMP_InitStruct->FilterEn = DISABLE; + /* Initialize the ClkPsc */ + COMP_InitStruct->ClkPsc = 0; + /* Initialize the SampWindow */ + COMP_InitStruct->SampWindow = 0; + /* Initialize the Threshold */ + COMP_InitStruct->Threshold = 0; + /* Initialize the En */ + COMP_InitStruct->En = DISABLE; +} +/** +*\*\name COMP_Initializes. +*\*\fun Initializes the COMPx according to COMP_initstruct. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\ - COMP3 +*\*\ - COMP4 +*\*\param COMP_initstruct : +*\*\ - Blking +*\*\ - COMP_CTRL_BLKING_NO +*\*\ - COMP_CTRL_BLKING_ATIM1_OC5 +*\*\ - COMP_CTRL_BLKING_GTIMB1_OC5 +*\*\ - COMP_CTRL_BLKING_GTIMB2_OC5 +*\*\ - COMP_CTRL_BLKING_ATIM2_OC5 +*\*\ - COMP_CTRL_BLKING_ATIM3_OC5 +*\*\ - COMP_CTRL_BLKING_ATIM4_OC1 +*\*\ - COMP_CTRL_BLKING_GTIMB3_OC5 +*\*\ - COMP_CTRL_BLKING_GTIMA4_OC5 +*\*\ - COMP_CTRL_BLKING_GTIMA2_OC3 +*\*\ - COMP_CTRL_BLKING_GTIMA1_OC3 +*\*\ - COMP_CTRL_BLKING_GTIMA3_OC3 +*\*\ - COMP_CTRL_BLKING_GTIMA5_OC3 +*\*\ - COMP_CTRL_BLKING_GTIMA6_OC3 +*\*\ - COMP_CTRL_BLKING_GTIMA7_OC3 +*\*\ - Hyst +*\*\ - COMP_CTRL_HYST_NO +*\*\ - COMP_CTRL_HYST_LOW: +*\*\ - COMP_CTRL_HYST_MID: +*\*\ - COMP_CTRL_HYST_HIGH: +*\*\ - PolRev +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - vpsel +*\*\ comp1 inp sel +*\*\ - COMP1_CTRL_INPSEL_PB0 +*\*\ - COMP1_CTRL_INPSEL_PB2 +*\*\ - COMP1_CTRL_INPSEL_DAC1_IOUT +*\*\ - COMP1_CTRL_INPSEL_DAC2_IOUT +*\*\ - COMP1_CTRL_INPSEL_DAC3_IOUT +*\*\ - COMP1_CTRL_INPSEL_DAC4_IOUT +*\*\ - COMP1_CTRL_INPSEL_DAC5_IOUT +*\*\ - COMP1_CTRL_INPSEL_DAC6_IOUT +*\*\ - COMP1_CTRL_INPSEL_VREF1 +*\*\ - COMP1_CTRL_INPSEL_PF5 +*\*\ comp2 inp sel +*\*\ - COMP2_CTRL_INPSEL_PE9 +*\*\ - COMP2_CTRL_INPSEL_PE11 +*\*\ - COMP2_CTRL_INPSEL_DAC1_IOUT +*\*\ - COMP2_CTRL_INPSEL_DAC2_IOUT +*\*\ - COMP2_CTRL_INPSEL_DAC3_IOUT +*\*\ - COMP2_CTRL_INPSEL_DAC4_IOUT +*\*\ - COMP2_CTRL_INPSEL_DAC5_IOUT +*\*\ - COMP2_CTRL_INPSEL_DAC6_IOUT +*\*\ - COMP2_CTRL_INPSEL_VREF2 +*\*\ - COMP2_CTRL_INPSEL_PB2 +*\*\ - COMP2_CTRL_INPSEL_PF7 +*\*\ comp3 inp sel +*\*\ - COMP3_CTRL_INPSEL_PF2 +*\*\ - COMP3_CTRL_INPSEL_PF15 +*\*\ - COMP3_CTRL_INPSEL_DAC1_IOUT +*\*\ - COMP3_CTRL_INPSEL_DAC2_IOUT +*\*\ - COMP3_CTRL_INPSEL_DAC3_IOUT +*\*\ - COMP3_CTRL_INPSEL_DAC4_IOUT +*\*\ - COMP3_CTRL_INPSEL_DAC5_IOUT +*\*\ - COMP3_CTRL_INPSEL_DAC6_IOUT +*\*\ comp4 inp sel +*\*\ - COMP4_CTRL_INPSEL_PH10 +*\*\ - COMP4_CTRL_INPSEL_PH7 +*\*\ - COMP4_CTRL_INPSEL_DAC1_IOUT +*\*\ - COMP4_CTRL_INPSEL_DAC2_IOUT +*\*\ - COMP4_CTRL_INPSEL_DAC3_IOUT +*\*\ - COMP4_CTRL_INPSEL_DAC4_IOUT +*\*\ - COMP4_CTRL_INPSEL_DAC5_IOUT +*\*\ - COMP4_CTRL_INPSEL_DAC6_IOUT +*\*\ - COMP4_CTRL_INPSEL_PF15 +*\*\ - COMP4_CTRL_INPSEL_PF10 +*\*\ - InmSel +*\*\ comp1 inm sel +*\*\ - COMP1_CTRL_INMSEL_PB1 +*\*\ - COMP1_CTRL_INMSEL_PC4 +*\*\ - COMP1_CTRL_INMSEL_DAC1_IOUT +*\*\ - COMP1_CTRL_INMSEL_DAC2_IOUT +*\*\ - COMP1_CTRL_INMSEL_DAC3_IOUT +*\*\ - COMP1_CTRL_INMSEL_DAC4_IOUT +*\*\ - COMP1_CTRL_INMSEL_DAC5_IOUT +*\*\ - COMP1_CTRL_INMSEL_DAC6_IOUT +*\*\ - COMP1_CTRL_INMSEL_VREF1 +*\*\ - COMP1_CTRL_INMSEL_PF3 +*\*\ comp2 inm sel +*\*\ - COMP2_CTRL_INMSEL_PE7 +*\*\ - COMP2_CTRL_INMSEL_PE10 +*\*\ - COMP2_CTRL_INMSEL_DAC1_IOUT +*\*\ - COMP2_CTRL_INMSEL_DAC2_IOUT +*\*\ - COMP2_CTRL_INMSEL_DAC3_IOUT +*\*\ - COMP2_CTRL_INMSEL_DAC4_IOUT +*\*\ - COMP2_CTRL_INMSEL_DAC5_IOUT +*\*\ - COMP2_CTRL_INMSEL_DAC6_IOUT +*\*\ - COMP2_CTRL_INMSEL_VREF2 +*\*\ - COMP2_CTRL_INMSEL_PF6 +*\*\ comp3 inm sel +*\*\ - COMP3_CTRL_INMSEL_PF1 +*\*\ - COMP3_CTRL_INMSEL_PF14 +*\*\ - COMP3_CTRL_INMSEL_DAC1_IOUT +*\*\ - COMP3_CTRL_INMSEL_DAC2_IOUT +*\*\ - COMP3_CTRL_INMSEL_DAC3_IOUT +*\*\ - COMP3_CTRL_INMSEL_DAC4_IOUT +*\*\ - COMP3_CTRL_INMSEL_DAC5_IOUT +*\*\ - COMP3_CTRL_INMSEL_DAC6_IOUT +*\*\ comp4 inm sel +*\*\ - COMP4_CTRL_INMSEL_PH9 +*\*\ - COMP4_CTRL_INMSEL_PH6 +*\*\ - COMP4_CTRL_INMSEL_DAC1_IOUT +*\*\ - COMP4_CTRL_INMSEL_DAC2_IOUT +*\*\ - COMP4_CTRL_INMSEL_DAC3_IOUT +*\*\ - COMP4_CTRL_INMSEL_DAC4_IOUT +*\*\ - COMP4_CTRL_INMSEL_DAC5_IOUT +*\*\ - COMP4_CTRL_INMSEL_DAC6_IOUT +*\*\ - COMP4_CTRL_INMSEL_PH8 +*\*\ - En +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - SampWindow +*\*\ - SampWindow Value ranges from 0~31. +*\*\ - Threshold +*\*\ - Threshold Value need > SampWindow/2. +*\*\ - FilterEn +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - ClkPsc +*\*\ - ClkPsc Value ranges from 0~65535. +*\*\return none +**/ +void COMP_Init(COMPX COMPx, COMP_InitType* COMP_InitStruct) +{ + COMP_SingleType* pCS = &COMP->Cmp[COMPx]; + __IO uint32_t temp = 0; + + /* Get the old value from COMPx_FILC register*/ + temp = pCS->FILC; + /* Set SAMPW[4:0] select bits */ + temp = ( ((uint32_t)COMP_InitStruct->SampWindow) << 6 ) & COMP_FILC_SAMPW_MASK; + /* Set THRESH[4:0] select bits */ + temp += ( ((uint32_t)COMP_InitStruct->Threshold) << 1 ) & COMP_FILC_THRESH_MASK; + /* Set FILEN select bits */ + temp += ( (uint32_t)COMP_InitStruct->FilterEn )& COMP_FILC_FILEN_MASK; + /* Store the new register value */ + pCS->FILC = temp; + /* Set CLKPSC[15:0] select bits from COMPx_FILP register*/ + pCS->FILP = COMP_InitStruct->ClkPsc; + + /* Get the old value from COMPx_CTRL register*/ + temp = pCS->CTRL; + /* Clear BLKING[3:0], BLKINGEN, POL, INMSEL[3:0], INPSEL[3:0] select bits */ + temp &= (~(COMP_CTRL_BLKING_MASK | COMP_CTRL_HYST_MASK | COMP_POL_MASK | COMP_CTRL_INPSEL_MASK | COMP_CTRL_INMSEL_MASK | COMP_CTRL_EN_MASK)); + /* Set BLKING[3:0], BLKINGEN, POL, INMSEL[3:0], INPSEL[3:0] select bits */ + temp |= ((uint32_t)COMP_InitStruct->Blking | (uint32_t)COMP_InitStruct->Hyst | \ + (uint32_t)COMP_InitStruct->InpSel | (uint32_t)COMP_InitStruct->InmSel); + + if(COMP_InitStruct->PolRev != DISABLE) + { + temp |= COMP_OUTPOL_FLIP ; + } + else + { + temp &= (~COMP_OUTPOL_FLIP); + } + + if(COMP_InitStruct->En != DISABLE) + { + temp |= COMP_CTRL_EN_MASK ; + } + else + { + temp &= (~COMP_CTRL_EN_MASK); + } + + /* Store the new register value */ + pCS->CTRL = temp; +} +/** +*\*\name COMP_Enable. +*\*\fun Configures COMPx enable or disable. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\ - COMP3 +*\*\ - COMP4 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void COMP_Enable(COMPX COMPx, FunctionalState Cmd) +{ + if(Cmd != DISABLE) + { + if( (COMPx == COMP3) || (COMPx == COMP4)) + { + /*Enable COMP3/4 Function*/ + AFEC->TRIMR6 |= COMP3_4_FUNCTION_ENABLE_MASK; + } + else + { + /* no process */ + } + + COMP->Cmp[COMPx].CTRL |= COMP_CTRL_EN_MASK; + } + else + { + COMP->Cmp[COMPx].CTRL &= (~COMP_CTRL_EN_MASK); + } +} +/** +*\*\name COMP_SetInpSel. +*\*\fun Select COMPx Non-inverting input. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\ - COMP3 +*\*\ - COMP4 +*\*\param vpsel : +*\*\ comp1 inp sel +*\*\ - COMP1_CTRL_INPSEL_PB0 +*\*\ - COMP1_CTRL_INPSEL_PB2 +*\*\ - COMP1_CTRL_INPSEL_DAC1_IOUT +*\*\ - COMP1_CTRL_INPSEL_DAC2_IOUT +*\*\ - COMP1_CTRL_INPSEL_DAC3_IOUT +*\*\ - COMP1_CTRL_INPSEL_DAC4_IOUT +*\*\ - COMP1_CTRL_INPSEL_DAC5_IOUT +*\*\ - COMP1_CTRL_INPSEL_DAC6_IOUT +*\*\ - COMP1_CTRL_INPSEL_VREF1 +*\*\ - COMP1_CTRL_INPSEL_PF5 +*\*\ comp2 inp sel +*\*\ - COMP2_CTRL_INPSEL_PE9 +*\*\ - COMP2_CTRL_INPSEL_PE11 +*\*\ - COMP2_CTRL_INPSEL_DAC1_IOUT +*\*\ - COMP2_CTRL_INPSEL_DAC2_IOUT +*\*\ - COMP2_CTRL_INPSEL_DAC3_IOUT +*\*\ - COMP2_CTRL_INPSEL_DAC4_IOUT +*\*\ - COMP2_CTRL_INPSEL_DAC5_IOUT +*\*\ - COMP2_CTRL_INPSEL_DAC6_IOUT +*\*\ - COMP2_CTRL_INPSEL_VREF2 +*\*\ - COMP2_CTRL_INPSEL_PB2 +*\*\ - COMP2_CTRL_INPSEL_PF7 +*\*\ comp3 inp sel +*\*\ - COMP3_CTRL_INPSEL_PF2 +*\*\ - COMP3_CTRL_INPSEL_PF15 +*\*\ - COMP3_CTRL_INPSEL_DAC1_IOUT +*\*\ - COMP3_CTRL_INPSEL_DAC2_IOUT +*\*\ - COMP3_CTRL_INPSEL_DAC3_IOUT +*\*\ - COMP3_CTRL_INPSEL_DAC4_IOUT +*\*\ - COMP3_CTRL_INPSEL_DAC5_IOUT +*\*\ - COMP3_CTRL_INPSEL_DAC6_IOUT +*\*\ comp4 inp sel +*\*\ - COMP4_CTRL_INPSEL_PH10 +*\*\ - COMP4_CTRL_INPSEL_PH7 +*\*\ - COMP4_CTRL_INPSEL_DAC1_IOUT +*\*\ - COMP4_CTRL_INPSEL_DAC2_IOUT +*\*\ - COMP4_CTRL_INPSEL_DAC3_IOUT +*\*\ - COMP4_CTRL_INPSEL_DAC4_IOUT +*\*\ - COMP4_CTRL_INPSEL_DAC5_IOUT +*\*\ - COMP4_CTRL_INPSEL_DAC6_IOUT +*\*\ - COMP4_CTRL_INPSEL_PF15 +*\*\ - COMP4_CTRL_INPSEL_PF10 +*\*\return none +**/ +void COMP_SetInpSel(COMPX COMPx, COMP_CTRL_INPSEL VpSel) +{ + __IO uint32_t tmp ; + /* Get the old value from COMPx_CTRL register*/ + tmp = COMP->Cmp[COMPx].CTRL; + /* Clear INPSEL[3:0] select bits */ + tmp &= (~COMP_CTRL_INPSEL_MASK); + /* Set INPSEL[3:0] select bits */ + tmp |= (uint32_t)VpSel; + /* Store the new register value */ + COMP->Cmp[COMPx].CTRL = tmp; +} +/** +*\*\name COMP_SetInmSel. +*\*\fun Select COMPx inverting input. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\ - COMP3 +*\*\ - COMP4 +*\*\param vmsel : +*\*\ comp1 inm sel +*\*\ - COMP1_CTRL_INMSEL_PB1 +*\*\ - COMP1_CTRL_INMSEL_PC4 +*\*\ - COMP1_CTRL_INMSEL_DAC1_IOUT +*\*\ - COMP1_CTRL_INMSEL_DAC2_IOUT +*\*\ - COMP1_CTRL_INMSEL_DAC3_IOUT +*\*\ - COMP1_CTRL_INMSEL_DAC4_IOUT +*\*\ - COMP1_CTRL_INMSEL_DAC5_IOUT +*\*\ - COMP1_CTRL_INMSEL_DAC6_IOUT +*\*\ - COMP1_CTRL_INMSEL_VREF1 +*\*\ - COMP1_CTRL_INMSEL_PF3 +*\*\ comp2 inm sel +*\*\ - COMP2_CTRL_INMSEL_PE7 +*\*\ - COMP2_CTRL_INMSEL_PE10 +*\*\ - COMP2_CTRL_INMSEL_DAC1_IOUT +*\*\ - COMP2_CTRL_INMSEL_DAC2_IOUT +*\*\ - COMP2_CTRL_INMSEL_DAC3_IOUT +*\*\ - COMP2_CTRL_INMSEL_DAC4_IOUT +*\*\ - COMP2_CTRL_INMSEL_DAC5_IOUT +*\*\ - COMP2_CTRL_INMSEL_DAC6_IOUT +*\*\ - COMP2_CTRL_INMSEL_VREF2 +*\*\ - COMP2_CTRL_INMSEL_PF6 +*\*\ comp3 inm sel +*\*\ - COMP3_CTRL_INMSEL_PF1 +*\*\ - COMP3_CTRL_INMSEL_PF14 +*\*\ - COMP3_CTRL_INMSEL_DAC1_IOUT +*\*\ - COMP3_CTRL_INMSEL_DAC2_IOUT +*\*\ - COMP3_CTRL_INMSEL_DAC3_IOUT +*\*\ - COMP3_CTRL_INMSEL_DAC4_IOUT +*\*\ - COMP3_CTRL_INMSEL_DAC5_IOUT +*\*\ - COMP3_CTRL_INMSEL_DAC6_IOUT +*\*\ comp4 inm sel +*\*\ - COMP4_CTRL_INMSEL_PH9 +*\*\ - COMP4_CTRL_INMSEL_PH6 +*\*\ - COMP4_CTRL_INMSEL_DAC1_IOUT +*\*\ - COMP4_CTRL_INMSEL_DAC2_IOUT +*\*\ - COMP4_CTRL_INMSEL_DAC3_IOUT +*\*\ - COMP4_CTRL_INMSEL_DAC4_IOUT +*\*\ - COMP4_CTRL_INMSEL_DAC5_IOUT +*\*\ - COMP4_CTRL_INMSEL_DAC6_IOUT +*\*\ - COMP4_CTRL_INMSEL_PH8 +*\*\return none +**/ +void COMP_SetInmSel(COMPX COMPx, COMP_CTRL_INMSEL VmSel) +{ + __IO uint32_t tmp ; + /* Get the old value from COMPx_CTRL register*/ + tmp = COMP->Cmp[COMPx].CTRL; + /* Clear INMSEL[3:0] select bits */ + tmp &= (~COMP_CTRL_INMSEL_MASK); + /* Set INMSEL[3:0] select bits */ + tmp |= (uint32_t)VmSel; + /* Store the new register value */ + COMP->Cmp[COMPx].CTRL = tmp; +} + +/** +*\*\name COMP_SetLowPowerMode. +*\*\fun Enables or disables working in low power mode for COMP. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void COMP_SetLowPowerMode(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable low power mode */ + COMP->LPR |= (uint32_t)COMP_LPMODE_LP_EN_MASK; + } + else + { + /* Disable low power mode */ + COMP->LPR &= (~(uint32_t)COMP_LPMODE_LP_EN_MASK); + } +} + +/** +*\*\name COMP_SetLock. +*\*\fun Configures which COMPx will be Locked. +*\*\param Lock : +*\*\ - COMP1_LOCK +*\*\ - COMP2_LOCK +*\*\ - COMP3_LOCK +*\*\ - COMP4_LOCK +*\*\return none +**/ +void COMP_SetLock(uint32_t Lock) +{ + COMP->LOCK = Lock; +} + +/** +*\*\name COMP_SetIntEn. +*\*\fun Configures COMPx interrupt enable or disable. +*\*\param IntEn : +*\*\ - COMP1_INTEN +*\*\ - COMP2_INTEN +*\*\ - COMP3_INTEN +*\*\ - COMP4_INTEN +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void COMP_SetIntEn(uint32_t IntEn, FunctionalState Cmd) +{ + if(Cmd != DISABLE) + { + COMP->INTEN |= IntEn; + } + else + { + COMP->INTEN &= ~IntEn; + } +} + +/** +*\*\name COMP_WindowModeEnable. +*\*\fun Configures COMPx window mode enable or disable. +*\*\param WinModeEn : +*\*\ - COMP_WINMODE_CMP12MD +*\*\ - COMP_WINMODE_CMP34MD +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void COMP_WindowModeEnable(uint32_t WinModeEn, FunctionalState Cmd) +{ + if(Cmd != DISABLE) + { + COMP->WINMODE |= WinModeEn; + } + else + { + COMP->WINMODE &= (~WinModeEn); + } +} +/** +*\*\name COMP_SetRefScl. +*\*\fun Configures the COMP reference voltage. +*\*\param Vv2Trim : +*\*\ - Value can be set from 0 to 63. +*\*\param Vv2En : +*\*\ - false +*\*\ - true +*\*\param Vv1Trim : +*\*\ - Value can be set from 0 to 63. +*\*\param Vv1En : +*\*\ - false +*\*\ - true +*\*\return none +**/ +void COMP_SetRefScl( uint8_t Vv2Trim, bool Vv2En, uint8_t Vv1Trim, bool Vv1En) +{ + __IO uint32_t temp = 0; + /* Get the old value from COMP1_CTRL register*/ + temp = COMP->Cmp[COMP1].CTRL; + /* Clear VV1EN, VV1TRM[5:0] select bits */ + temp &= (~(COMP_VREFSCL_VVEN_MSK | COMP_VREFSCL_VVTRM_MSK ) ); + /* Set VV1EN, VV1TRM[5:0] select bits */ + temp |= ((uint32_t)(Vv1En ? (1UL << 22U) : 0) + ((uint32_t)Vv1Trim << 23U )) ; + /* Store the new register value */ + COMP->Cmp[COMP1].CTRL = temp; + + /* Get the old value from COMP2_CTRL register*/ + temp = COMP->Cmp[COMP2].CTRL; + /* Clear VV2EN, VV2TRM[5:0] select bits */ + temp &= (~(COMP_VREFSCL_VVEN_MSK | COMP_VREFSCL_VVTRM_MSK ) ); + /* Set VV2EN, VV2TRM[5:0] select bits */ + temp |= ((uint32_t)(Vv2En ? (1UL << 22U) : 0) + ((uint32_t)Vv2Trim << 23U )) ; + /* Store the new register value */ + COMP->Cmp[COMP2].CTRL = temp; +} +/** +*\*\name COMP_GetOutStatus. +*\*\fun Get COMPx output status. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\ - COMP3 +*\*\ - COMP4 +*\*\return FlagStatus: +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus COMP_GetOutStatus(COMPX COMPx) +{ + return ((COMP->Cmp[COMPx].CTRL & COMP_CTRL_OUT_MASK) != 0U) ? SET : RESET; +} + +/** +*\*\name COMP_GetIntStsOneComp. +*\*\fun Get COMPx interrupt Status. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\ - COMP3 +*\*\ - COMP4 +*\*\return +*\*\ - RESET : COMPx Interrupt status is reset; +*\*\ - SET : COMPx Interrupt status is set; +**/ +FlagStatus COMP_GetIntStsOneComp(COMPX COMPx) +{ + return ((COMP->INTSTS & ((uint32_t)0x01U << COMPx)) != 0U) ? SET : RESET; +} + +/** +*\*\name COMP_ClearIntStsOneComp. +*\*\fun Clear COMPx interrupt Status. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\ - COMP3 +*\*\ - COMP4 +*\*\return none +**/ +void COMP_ClearIntStsOneComp(COMPX COMPx) +{ + COMP->INTSTS &= ((~(0x01U << COMPx ))); +} + +/** +*\*\name COMP_OutToTimEnable. +*\*\fun Enable or disable the output channel to timer . +*\*\param TimEn : +*\*\ - COMP1_TIM_EN +*\*\ - COMP2_TIM_EN +*\*\ - COMP3_TIM_EN +*\*\ - COMP4_TIM_EN +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void COMP_OutToTimEnable(uint32_t TimEn, FunctionalState Cmd) +{ + if(Cmd != DISABLE) + { + COMP->OTIMEN |= TimEn; + } + else + { + COMP->OTIMEN &= (~TimEn); + } +} + +/** +*\*\name COMP_SetFilterPrescaler. +*\*\fun Set the COMP filter clock Prescaler value. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\ - COMP3 +*\*\ - COMP4 +*\*\param FilPreVal : +*\*\ - Value can be set from 0 to 65535. +*\*\return none +**/ +void COMP_SetFilterPrescaler(COMPX COMPx, uint16_t FilPreVal) +{ + COMP->Cmp[COMPx].FILP = FilPreVal; +} + +/** +*\*\name COMP_SetFilterControl. +*\*\fun Configures the COMP filter control value. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\ - COMP3 +*\*\ - COMP4 +*\*\param FilEn : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\param TheresNum : +*\*\ - Threshold Value need > SampWindow/2. +*\*\param SampPW : +*\*\ - Value can be set from 0 to 31. +*\*\return none +**/ +void COMP_SetFilterControl(COMPX COMPx, uint8_t FilEn, uint8_t TheresNum, uint8_t SampPW) +{ + COMP->Cmp[COMPx].FILC = (uint32_t)(FilEn & COMP_FILC_FILEN_MASK) + (((uint32_t)TheresNum << 1)&COMP_FILC_THRESH_MASK) + (((uint32_t)SampPW << 6)& COMP_FILC_SAMPW_MASK); +} + +/** +*\*\name COMP_SetVflagEnable. +*\*\fun Enable or disable using DAC stable value as Comparator's positive or negetive inputs. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\param InputMode : +*\*\ - COMP_VFLAG_P +*\*\ - COMP_VFLAG_N +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note COMP3 and COMP4 couldn't using this fuction. +**/ +void COMP_EnableVflag(COMPX COMPx, uint32_t InputMode, FunctionalState Cmd) +{ + if(Cmd != DISABLE) + { + COMP->Cmp[COMPx].FILC |= InputMode; + } + else + { + COMP->Cmp[COMPx].FILC &= (~InputMode); + } +} + + +/** +*\*\name COMP_SetHyst. +*\*\fun Configures COMPx hysteresis level. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\ - COMP3 +*\*\ - COMP4 +*\*\param HYST : +*\*\ - COMP_CTRL_HYST_NO +*\*\ - COMP_CTRL_HYST_LOW +*\*\ - COMP_CTRL_HYST_MID +*\*\ - COMP_CTRL_HYST_HIGH +*\*\return none +**/ +void COMP_SetHyst(COMPX COMPx, COMP_CTRL_HYST HYST) +{ + uint32_t temp; + /* Get the old value from COMPx_CTRL register*/ + temp = COMP->Cmp[COMPx].CTRL; + /* Clear HYST[1:0] select bits */ + temp &= (~COMP_CTRL_HYST_MASK); + /* Set HYST[1:0] select bits */ + temp |= (uint32_t)HYST; + /* Store the new register value */ + COMP->Cmp[COMPx].CTRL = temp; +} + +/** +*\*\name COMP_SetBlanking. +*\*\fun Configures which TIMx output signal to control COMPx Blking. +*\*\param COMPx : +*\*\ - COMP1 +*\*\ - COMP2 +*\*\ - COMP3 +*\*\ - COMP4 +*\*\param BLK : +*\*\ - COMP_CTRL_BLKING_NO +*\*\ - COMP_CTRL_BLKING_ATIM1_OC5 +*\*\ - COMP_CTRL_BLKING_GTIMB1_OC5 +*\*\ - COMP_CTRL_BLKING_GTIMB2_OC5 +*\*\ - COMP_CTRL_BLKING_ATIM2_OC5 +*\*\ - COMP_CTRL_BLKING_ATIM3_OC5 +*\*\ - COMP_CTRL_BLKING_ATIM4_OC1 +*\*\ - COMP_CTRL_BLKING_GTIMB3_OC5 +*\*\ - COMP_CTRL_BLKING_GTIMA4_OC5 +*\*\ - COMP_CTRL_BLKING_GTIMA2_OC3 +*\*\ - COMP_CTRL_BLKING_GTIMA1_OC3 +*\*\ - COMP_CTRL_BLKING_GTIMA3_OC3 +*\*\ - COMP_CTRL_BLKING_GTIMA5_OC3 +*\*\ - COMP_CTRL_BLKING_GTIMA6_OC3 +*\*\ - COMP_CTRL_BLKING_GTIMA7_OC3 +*\*\return none +**/ +void COMP_SetBlanking(COMPX COMPx, COMP_CTRL_BLKING BLK) +{ + uint32_t temp; + /* Get the old value from COMPx_CTRL register*/ + temp = COMP->Cmp[COMPx].CTRL; + /* Clear HYST[3:0] select bits */ + temp &= (~COMP_CTRL_BLKING_MASK); + /* Set HYST[3:0] select bits */ + temp |= (uint32_t)BLK; + /* Store the new register value */ + COMP->Cmp[COMPx].CTRL = temp; +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_cordic.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_cordic.c new file mode 100644 index 0000000000..e2cc0d27c8 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_cordic.c @@ -0,0 +1,392 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_cordic.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_cordic.h" +#include "n32h76x_78x_rcc.h" + +/** CORDIC Private Defines **/ + +#define CORDIC_CTRLSTS_MASK ((uint32_t)0x07F807FFU) + + +/** CORDIC Driving Functions Declaration **/ + +/** +*\*\name CORDIC_DeInit. +*\*\fun DeInitializes the CORDIC peripheral. +*\*\param none +*\*\return none +**/ +void CORDIC_DeInit(void) +{ + /* CORDIC peripheral reset */ + RCC_EnableAHB2PeriphReset1(RCC_AHB2_PERIPHRST_CORDIC); +} + +/** +*\*\name CORDIC_Init. +*\*\fun Initialize the CORDIC module with CORDIC_InitParam of type CORDIC_InitType. +*\*\param CORDIC_InitParam : +*\*\ - Function +*\*\ - CORDIC_FUNCTION_COSINE +*\*\ - CORDIC_FUNCTION_SINE +*\*\ - CORDIC_FUNCTION_PHASE +*\*\ - CORDIC_FUNCTION_MODULUS +*\*\ - CORDIC_FUNCTION_ARCTANGENT +*\*\ - CORDIC_FUNCTION_HCOSINE +*\*\ - CORDIC_FUNCTION_HSINE +*\*\ - CORDIC_FUNCTION_HARCTANGENT +*\*\ - CORDIC_FUNCTION_NATURALLOG +*\*\ - CORDIC_FUNCTION_SQUAREROOT +*\*\ - Precision +*\*\ - CORDIC_PRECISION_1CYCLE +*\*\ - CORDIC_PRECISION_2CYCLES +*\*\ - CORDIC_PRECISION_3CYCLES +*\*\ - CORDIC_PRECISION_4CYCLES +*\*\ - CORDIC_PRECISION_5CYCLES +*\*\ - CORDIC_PRECISION_6CYCLES +*\*\ - CORDIC_PRECISION_7CYCLES +*\*\ - CORDIC_PRECISION_8CYCLES +*\*\ - CORDIC_PRECISION_9CYCLES +*\*\ - CORDIC_PRECISION_10CYCLES +*\*\ - CORDIC_PRECISION_11CYCLES +*\*\ - CORDIC_PRECISION_12CYCLES +*\*\ - CORDIC_PRECISION_13CYCLES +*\*\ - CORDIC_PRECISION_14CYCLES +*\*\ - CORDIC_PRECISION_15CYCLES +*\*\ - Scale +*\*\ - CORDIC_SCALE_0 +*\*\ - CORDIC_SCALE_1 +*\*\ - CORDIC_SCALE_2 +*\*\ - CORDIC_SCALE_3 +*\*\ - CORDIC_SCALE_4 +*\*\ - CORDIC_SCALE_5 +*\*\ - CORDIC_SCALE_6 +*\*\ - CORDIC_SCALE_7 +*\*\ - NbWrite +*\*\ - CORDIC_NBWRITE_1 +*\*\ - CORDIC_NBWRITE_2 +*\*\ - NbRead +*\*\ - CORDIC_NBREAD_1 +*\*\ - CORDIC_NBREAD_2 +*\*\ - InSize +*\*\ - CORDIC_INSIZE_16BITS +*\*\ - CORDIC_INSIZE_32BITS +*\*\ - OutSize +*\*\ - CORDIC_OUTSIZE_16BITS +*\*\ - CORDIC_OUTSIZE_32BITS +*\*\ - InSelect +*\*\ - CORDIC_INPUT_FIX +*\*\ - CORDIC_INPUT_FLOAT +*\*\ - OutSelect +*\*\ - CORDIC_OUTPUT_FIX +*\*\ - CORDIC_OUTPUT_FLOAT +*\*\ - CodinLimit +*\*\ - CORDIC_CODIN_LIMIT_DISABLE +*\*\ - CORDIC_CODIN_LIMIT_ENABLE +*\*\ - PhaseLimit +*\*\ - CORDIC_PHASE_LIMIT_DISABLE +*\*\ - CORDIC_PHASE_LIMIT_ENABLE +*\*\return none +**/ +void CORDIC_Init(CORDIC_InitType* CORDIC_InitParam) +{ + uint32_t TempValue; + + /* Configure the CORDIC_CTRLSTS register, including setting CODINLIMIT, PHASELIMIT, + FLOATOUT, FLOATIN, INSIZE, OUTSIZE, NUMWRITE, NUMREAD, SCALE[2:0], PRECISION[3:0], + FUNC[3:0] bits */ + TempValue = ((CORDIC_InitParam->Function) | (CORDIC_InitParam->Precision) + | (CORDIC_InitParam->Scale) | (CORDIC_InitParam->NbWrite) + | (CORDIC_InitParam->NbRead) | (CORDIC_InitParam->InSize) + | (CORDIC_InitParam->OutSize) | (CORDIC_InitParam->InSelect) + | (CORDIC_InitParam->OutSelect) | (CORDIC_InitParam->CodinLimit) + | (CORDIC_InitParam->PhaseLimit)); + + /* Write to CORDIC_CTRLSTS */ + MODIFY_REG(CORDIC->CTRLSTS, CORDIC_CTRLSTS_MASK, TempValue); +} + +/** +*\*\name CORDIC_StructInit. +*\*\fun Initializes the structure parameter of type CORDIC_InitType used to +*\*\ initialize CORDIC. This function is usually called before initializing +*\*\ a parameter of type CORDIC_InitType. +*\*\param CORDIC_InitParam : +*\*\ - Function +*\*\ - Precision +*\*\ - Scale +*\*\ - NbWrite +*\*\ - NbRead +*\*\ - InSize +*\*\ - OutSize +*\*\ - InSelect +*\*\ - OutSelect +*\*\ - CodinLimit +*\*\ - PhaseLimit +*\*\return none +**/ +void CORDIC_StructInit(CORDIC_InitType* CORDIC_InitParam) +{ + /** Set the default configuration **/ + + /* Default Select the function: cosine */ + CORDIC_InitParam->Function = CORDIC_FUNCTION_COSINE; + /* Default Set the number of iterations: 5 */ + CORDIC_InitParam->Precision = CORDIC_PRECISION_5CYCLES; + /* Default Select the Scaling Factor: 0 */ + CORDIC_InitParam->Scale = CORDIC_SCALE_0; + /* Default Select the number of CORDIC_WDAT register to write: 1 */ + CORDIC_InitParam->NbWrite = CORDIC_NBWRITE_1; + /* Default Select the number of CORDIC_RDAT register to read: 1 */ + CORDIC_InitParam->NbRead = CORDIC_NBREAD_1; + /* Default Select the input data width: 32bit */ + CORDIC_InitParam->InSize = CORDIC_INSIZE_32BITS; + /* Default Select the output data width: 32bit */ + CORDIC_InitParam->OutSize = CORDIC_OUTSIZE_32BITS; + /* Default Select the fixed-point input */ + CORDIC_InitParam->InSelect = CORDIC_INPUT_FIX; + /* Default Select the fixed-point output */ + CORDIC_InitParam->OutSelect = CORDIC_OUTPUT_FIX; + /* Default Disable Coordinate Limit function */ + CORDIC_InitParam->CodinLimit = CORDIC_CODIN_LIMIT_DISABLE; + /* Default Disable Phase Limit function */ + CORDIC_InitParam->PhaseLimit = CORDIC_PHASE_LIMIT_DISABLE; +} + +/** +*\*\name CORDIC_InterruptCmd. +*\*\fun Enables or disables the specified CORDIC interrupts. +*\*\param Interrupt: +*\*\ - CORDIC_INT +*\*\ - CORDIC_INT_INOVERFLOW +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void CORDIC_InterruptCmd(uint32_t Interrupt, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected CORDIC interrupt */ + SET_BIT(CORDIC->CTRLSTS, Interrupt); + } + else + { + /* Disable the selected CORDIC interrupt */ + CLEAR_BIT(CORDIC->CTRLSTS, Interrupt); + } +} + +/** +*\*\name CORDIC_DMAReadRequestCmd. +*\*\fun Enables or disables the CORDIC DMA read request. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void CORDIC_DMAReadRequestCmd(FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable CORDIC DMA read request */ + SET_BIT(CORDIC->CTRLSTS, CORDIC_CTRLSTS_DMAREN); + } + else + { + /* Disable CORDIC DMA read request */ + CLEAR_BIT(CORDIC->CTRLSTS, CORDIC_CTRLSTS_DMAREN); + } +} + +/** +*\*\name CORDIC_DMAWriteRequestCmd. +*\*\fun Enables or disables the CORDIC DMA write request. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void CORDIC_DMAWriteRequestCmd(FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable CORDIC DMA write request */ + SET_BIT(CORDIC->CTRLSTS, CORDIC_CTRLSTS_DMAWEN); + } + else + { + /* Disable CORDIC DMA write request */ + CLEAR_BIT(CORDIC->CTRLSTS, CORDIC_CTRLSTS_DMAWEN); + } +} + +/** +*\*\name CORDIC_GetRegisterAddr. +*\*\fun Get the CORDIC data register address used for DMA transfer. +*\*\param Direction: +*\*\ - CORDIC_AS_DMA_SRCADDR +*\*\ - CORDIC_AS_DMA_DSTADDR +*\*\return Address of data register. +**/ +uint32_t CORDIC_GetRegisterAddr(uint32_t Direction) +{ + uint32_t Address; + + /* Check the direction of transmission */ + if (Direction == CORDIC_AS_DMA_DSTADDR) + { + /* Get address of WDAT register */ + Address = (uint32_t) & (CORDIC->WDAT); + } + else + { + /* Get address of RDAT register */ + Address = (uint32_t) & (CORDIC->RDAT); + } + + /* Return address value */ + return Address; +} + +/** +*\*\name CORDIC_WriteData. +*\*\fun Write 32-bit input data for the CORDIC processing. +*\*\param pInData : +*\*\ - Points to the address of input data +*\*\return none +**/ +void CORDIC_WriteData(uint32_t *pInData) +{ + /* Write WDAT register */ + WRITE_REG(CORDIC->WDAT, *pInData); +} + +/** +*\*\name CORDIC_ReadData. +*\*\fun Return 32-bit output data of CORDIC processing. +*\*\param pOutData : +*\*\ - Points to the address where the output data is stored +*\*\return none. +**/ +void CORDIC_ReadData(uint32_t *pOutData) +{ + /* Read RDAT register */ + *pOutData = READ_REG(CORDIC->RDAT); +} + +/** +*\*\name CORDIC_GetFlagStatus. +*\*\fun Checks whether the specified CORDIC flag is set or not. +*\*\param Flag: +*\*\ - CORDIC_FLAG_RRF +*\*\ - CORDIC_FLAG_INOVF +*\*\ - CORDIC_FLAG_DMAWENF +*\*\ - CORDIC_FLAG_DMARENF +*\*\ - CORDIC_FLAG_INTENF +*\*\ - CORDIC_FLAG_INOVINTENF +*\*\return FlagStatus: +*\*\ - RESET : Corresponding flag bit is reset +*\*\ - SET : Corresponding flag bit is set +**/ +FlagStatus CORDIC_GetFlagStatus(uint32_t Flag) +{ + FlagStatus Status; + + /* Read and return the status of the corresponding flag bits */ + if(READ_BIT(CORDIC->CTRLSTS, Flag) != (uint32_t)RESET) + { + /* Flag is set */ + Status = SET; + } + else + { + /* Flag is reset */ + Status = RESET; + } + + /* Return flag status */ + return Status; +} + +/** +*\*\name CORDIC_ClearStatusFlag. +*\*\fun Clears the pending flag for the CORDIC. +*\*\param Flag : +*\*\ - CORDIC_FLAG_INOVF +*\*\ - CORDIC_FLAG_DMAWENF +*\*\ - CORDIC_FLAG_DMARENF +*\*\ - CORDIC_FLAG_INTENF +*\*\ - CORDIC_FLAG_INOVINTENF +*\*\return none +*\*\note The RRF flag cannot be cleared by a call to this function; +*\*\ the RRF flag is cleared by hardware when reading the data +*\*\ register is complete. +**/ +void CORDIC_ClearStatusFlag(uint32_t Flag) +{ + if (Flag == CORDIC_FLAG_INOVF) + { + /* Clear the input parameter overflow flag */ + SET_BIT(CORDIC->CTRLSTS, Flag); + } + else + { + /* Clear other flags except RRF */ + CLEAR_BIT(CORDIC->CTRLSTS, Flag); + } +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_crc.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_crc.c new file mode 100644 index 0000000000..ebe92fd5c4 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_crc.c @@ -0,0 +1,469 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_crc.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_crc.h" +#include "n32h76x_78x_rcc.h" + +/** +*\*\name CRC_ResetCalculation. +*\*\fun Reset the CRC calculation unit. +*\*\param none +*\*\return none +*\*\note It also set the Data Register to the value stored in the CRC_INIT register. +**/ +void CRC_ResetCalculation(void) +{ + CRC->CTRL |= CRC_CTRL_RESET; + + while((CRC->CTRL & CRC_CTRL_RESET) != 0U) + { + } +} + + +/** +*\*\name CRC_DeInit. +*\*\fun Reset the CRC registers to their default values. +*\*\param none +*\*\return none +**/ +void CRC_DeInit(void) +{ + RCC_EnableAHB5PeriphReset2(RCC_AHB5_PERIPHRST_CRC); +} + + +/** +*\*\name CRC_SetInputByteOrder. +*\*\fun Configure the reversal of the byte order of the input data. +*\*\param ReverseMode This parameter can be one of the following values: +*\*\ - CRC_INDATA_BYTE_REVERSE_NONE +*\*\ - CRC_INDATA_BYTE_REVERSE_HALFWORD +*\*\ - CRC_INDATA_BYTE_REVERSE_WORD +*\*\return None +**/ +void CRC_SetInputByteOrder(uint32_t ReverseMode) +{ + CRC->CTRL = ((CRC->CTRL & (~CRC_CTRL_BYTEENDIAN)) | ReverseMode); +} + +/** +*\*\name CRC_SetInputBitOrder. +*\*\fun Configure the reversal of the bit order of the input data +*\*\param ReverseMode This parameter can be one of the following values: +*\*\ - CRC_INDATA_BIT_REVERSE_NONE +*\*\ - CRC_INDATA_BIT_REVERSE_BYTE +*\*\ - CRC_INDATA_BIT_REVERSE_HALFWORD +*\*\ - CRC_INDATA_BIT_REVERSE_WORD +*\*\return None +**/ +void CRC_SetInputBitOrder(uint32_t ReverseMode) +{ + CRC->CTRL = ((CRC->CTRL & (~CRC_CTRL_REVIN)) | ReverseMode); +} + +/** +*\*\name CRC_SetOutputBitOrder. +*\*\fun Configure the reversal of the bit order of the Output data +*\*\param ReverseMode This parameter can be one of the following values: +*\*\ - CRC_OUTDATA_REVERSE_NONE +*\*\ - CRC_OUTDATA_REVERSE_BIT +*\*\return None +**/ +void CRC_SetOutputBitOrder(uint32_t ReverseMode) +{ + CRC->CTRL = ((CRC->CTRL & (~CRC_CTRL_REVOUT)) | ReverseMode); +} + +/** +*\*\name CRC_SetInputDataXor. +*\*\fun Configure the CRC_DAT XOR calculation value before CRC calculation. +*\*\param xor_value: 32-bit data to be writting into CRC_INXORDAT register. +*\*\return None +**/ +void CRC_SetInputDataXor(uint32_t xor_value) +{ + CRC->INXORDAT = xor_value; +} + +/** +*\*\name CRC_SetOutputDataXor. +*\*\fun Configure the CRC_DAT XOR calculation value after CRC calculation. +*\*\param xor_value: 32-bit data to be writting into CRC_OUTXORDAT register +*\*\return None +**/ +void CRC_SetOutputDataXor(uint32_t xor_value) +{ + CRC->OUTXORDAT = xor_value; +} + +/** +*\*\name CRC_SetInitialData. +*\*\fun Initialize the Programmable initial CRC value. +*\*\param InitCrc: 32-bit data to be writting into CRC_INIT register +*\*\return None +**/ +void CRC_SetInitialData(uint32_t InitCrc) +{ + CRC->INIT = InitCrc; +} + +/** +*\*\name CRC_SetPolynomialCoef. +*\*\fun Initialize the Programmable polynomial value +*\*\ (coefficients of the polynomial to be used for CRC calculation). +*\*\param PolynomCoef Value to be writting into CRC_POL register +*\*\return None +**/ +void CRC_SetPolynomialCoef(uint32_t PolynomCoef) +{ + CRC->POL = PolynomCoef; +} + +/** +*\*\name CRC_SetPolynomialSize. +*\*\fun Configure size of the polynomial. +*\*\param PolySize This parameter can be one of the following values: +*\*\ - CRC_POLYLENGTH_32B +*\*\ - CRC_POLYLENGTH_16B +*\*\ - CRC_POLYLENGTH_8B +*\*\ - CRC_POLYLENGTH_7B +*\*\return None +**/ +void CRC_SetPolynomialSize(uint32_t PolySize) +{ + CRC->CTRL = ((CRC->CTRL & (~CRC_CTRL_POLYSIZE)) | PolySize); +} + +/** +*\*\name CRC_GetLRC. +*\*\fun Return the computed LRC value. +*\*\param None +*\*\return The computed LRC value + */ +uint32_t CRC_GetLRC(void) +{ + uint32_t temp; + + temp = CRC->LRC; + return temp; +} + +/** +*\*\name CRC_GetIDAT. +*\*\fun Return the data in independent data register. +*\*\param None +*\*\return Data in independent data register. +**/ +uint32_t CRC_GetIDAT(void) +{ + uint32_t temp; + + temp = CRC->IDAT; + return temp; +} + +/** +*\*\name CRC_WriteIDAT. +*\*\fun Write independent data register. +*\*\param Idat : Value to be programmed in independent register +*\*\return None +**/ +void CRC_WriteIDAT(uint32_t Idat) +{ + CRC->IDAT = Idat; +} + +/** +*\*\name CRC_Init. +*\*\fun Initialize the CRC according to the specified parameters in the CRC_InitType. +*\*\param CRC_InitStruct : +*\*\ - GeneratingPolynomial: The coefficients of the polynomial. +*\*\ - CRCLength +*\*\ - CRC_POLYLENGTH_32B +*\*\ - CRC_POLYLENGTH_16B +*\*\ - CRC_POLYLENGTH_8B +*\*\ - CRC_POLYLENGTH_7B +*\*\ - InitValue: 32-bit data +*\*\ - InputDataByteInversionMode +*\*\ - CRC_INDATA_BYTE_REVERSE_NONE +*\*\ - CRC_INDATA_BYTE_REVERSE_HALFWORD +*\*\ - CRC_INDATA_BYTE_REVERSE_WORD +*\*\ - InputDataBitInversionMode +*\*\ - CRC_INDATA_BIT_REVERSE_NONE +*\*\ - CRC_INDATA_BIT_REVERSE_BYTE +*\*\ - CRC_INDATA_BIT_REVERSE_HALFWORD +*\*\ - CRC_INDATA_BIT_REVERSE_WORD +*\*\ - OutputDataInversionMode +*\*\ - CRC_OUTPUTDATA_INVERSION_DISABLE +*\*\ - CRC_OUTPUTDATA_INVERSION_ENABLE +*\*\ - InputDataXor: 32-bit data +*\*\ - OutputDataXor: 32-bit data +*\*\return none +**/ +void CRC_Init(CRC_InitType *CRC_InitStruct) +{ + /* Set generating polynomial defined by user */ + CRC_SetPolynomialSize(CRC_InitStruct->CRCLength); + CRC_SetPolynomialCoef(CRC_InitStruct->GeneratingPolynomial); + + /* Set initial value defined by user */ + CRC_SetInitialData(CRC_InitStruct->InitValue); + + /* Set input data byte inversion mode */ + CRC_SetInputByteOrder(CRC_InitStruct->InputDataByteInversionMode); + /* Set input data bit inversion mode */ + CRC_SetInputBitOrder(CRC_InitStruct->InputDataBitInversionMode); + /* Set output data inversion mode */ + CRC_SetOutputBitOrder(CRC_InitStruct->OutputDataInversionMode); + + /* Set input data xor mode */ + CRC_SetInputDataXor(CRC_InitStruct->InputDataXor); + /* Set output data xor mode */ + CRC_SetOutputDataXor(CRC_InitStruct->OutputDataXor); +} + +/** +*\*\name CRC_StructInit. +*\*\fun Initialize the CRC structure +*\*\param CRC_InitStruct +*\*\ - GeneratingPolynomial +*\*\ - CRCLength +*\*\ - InitValue +*\*\ - InputDataByteInversionMode +*\*\ - InputDataBitInversionMode +*\*\ - OutputDataInversionMode +*\*\ - InputDataXor +*\*\ - OutputDataXor +*\*\return none +**/ +void CRC_StructInit(CRC_InitType *CRC_InitStruct) +{ + CRC_InitStruct->CRCLength = CRC_POLYLENGTH_32B; + CRC_InitStruct->GeneratingPolynomial = DEFAULT_CRC32_POLY; + CRC_InitStruct->InitValue = DEFAULT_CRC_INITVALUE; + CRC_InitStruct->InputDataByteInversionMode = CRC_INDATA_BYTE_REVERSE_NONE; + CRC_InitStruct->InputDataBitInversionMode = CRC_INDATA_BIT_REVERSE_NONE; + CRC_InitStruct->OutputDataInversionMode = CRC_OUTDATA_REVERSE_NONE; + CRC_InitStruct->InputDataXor = 0x00000000; + CRC_InitStruct->OutputDataXor = 0x00000000; +} + + +/** +*\*\name CRC_Handle_8 +*\*\fun Enter 8-bit input data to the CRC calculator. +*\*\param pBuffer pointer to the input data buffer +*\*\param BufferLength input data buffer length,count in Bytes +*\*\return 32-bit CRC result +*\*\note If CRC length is shorter than 32-bits,LSBs is used. +**/ +static uint32_t CRC_Handle_8( uint8_t *pBuffer, uint32_t BufferLength) +{ + uint32_t i; + uint16_t data; + __IO uint16_t *pReg; + + /* Processing time optimization: 4 bytes are entered in a row with a single word write, + * last bytes must be carefully fed to the CRC calculator to ensure a correct type + * handling by the peripheral */ + for (i = 0U; i < (BufferLength / 4U); i++) + { + CRC->DAT = ((uint32_t)pBuffer[4U * i] << 24U) | \ + ((uint32_t)pBuffer[(4U * i) + 1U] << 16U) | \ + ((uint32_t)pBuffer[(4U * i) + 2U] << 8U) | \ + (uint32_t)pBuffer[(4U * i) + 3U]; + } + + /* last bytes specific handling */ + if ((BufferLength % 4U) != 0U) + { + if ((BufferLength % 4U) == 1U) + { + *(__IO uint8_t *)(__IO void *)(&CRC->DAT) = pBuffer[4U * i]; /* Derogation MisraC2012 R.11.5 */ + } + + if ((BufferLength % 4U) == 2U) + { + data = ((uint16_t)(pBuffer[4U * i]) << 8U) | (uint16_t)pBuffer[(4U * i) + 1U]; + pReg = (__IO uint16_t *)(__IO void *)(&CRC->DAT); /* Derogation MisraC2012 R.11.5 */ + *pReg = data; + } + + if ((BufferLength % 4U) == 3U) + { + data = ((uint16_t)(pBuffer[4U * i]) << 8U) | (uint16_t)pBuffer[(4U * i) + 1U]; + pReg = (__IO uint16_t *)(__IO void *)(&CRC->DAT); /* Derogation MisraC2012 R.11.5 */ + *pReg = data; + + *(__IO uint8_t *)(__IO void *)(&CRC->DAT) = pBuffer[(4U * i) + 2U]; /* Derogation MisraC2012 R.11.5 */ + } + } + + /* Return the CRC computed value */ + return CRC->DAT; +} + +/** +*\*\name CRC_Handle_16 +*\*\fun Enter 16-bit input data to the CRC calculator. +*\*\param pBuffer pointer to the input data buffer +*\*\param BufferLength input data buffer length,count in Half-words +*\*\return 32-bit CRC result +*\*\note If CRC length is shorter than 32-bits,LSBS is used. +**/ +static uint32_t CRC_Handle_16(uint16_t *pBuffer, uint32_t BufferLength) +{ + uint32_t i; /* input data buffer index */ + __IO uint16_t *pReg; + + /* Processing time optimization: 2 HalfWords are entered in a row with a single word write, + * in case of odd length, last HalfWord must be carefully fed to the CRC calculator to ensure + * a correct type handling by the peripheral */ + for (i = 0U; i < (BufferLength / 2U); i++) + { + CRC->DAT = ((uint32_t)pBuffer[2U * i] << 16U) | (uint32_t)pBuffer[(2U * i) + 1U]; + } + + if ((BufferLength % 2U) != 0U) + { + pReg = (__IO uint16_t *)(__IO void *)(&CRC->DAT); /* Derogation MisraC2012 R.11.5 */ + *pReg = pBuffer[2U * i]; + } + + /* Return the CRC computed value */ + return CRC->DAT; +} + +/** +*\*\name CRC_Accumulate +*\*\fun Compute the 7, 8, 16 or 32-bit CRC value of an 8, 16 or 32-bit data buffer +*\*\ starting with the previously computed CRC result as initialization value. +*\*\param InputDataFormat +*\*\ - CRC_INPUTDATA_FORMAT_WORDS +*\*\ - CRC_INPUTDATA_FORMAT_BYTES +*\*\ - CRC_INPUTDATA_FORMAT_HALFWORDS +*\*\param pBuffer pointer to the input data buffer, exact input data format is +*\*\ provided by InputDataFormat. +*\*\param BufferLength input data buffer length,and: +*\*\ - if InputDataFormat is CRC_INPUTDATA_FORMAT_WORDS,count in words(32bit) +*\*\ - if InputDataFormat is CRC_INPUTDATA_FORMAT_BYTES,count in bytes(8bit) +*\*\ - if InputDataFormat is CRC_INPUTDATA_FORMAT_HALFWORDS,count in half-words(16bit) +*\*\return 32-bit CRC result +*\*\note If the length of CRC result is shorter than 32-bits,only LSB is used. +**/ +uint32_t CRC_Accumulate(uint32_t InputDataFormat, void *pBuffer, uint32_t BufferLength) +{ + uint32_t i; + uint32_t temp = 0U; + uint32_t *pWord; + + switch (InputDataFormat) + { + case CRC_INPUTDATA_FORMAT_WORDS: + pWord = (uint32_t *)pBuffer; + + /* Enter 32-bit input data to the CRC calculator */ + for (i = 0U; i < BufferLength; i++) + { + CRC->DAT = pWord[i]; + } + + temp = CRC->DAT; + break; + + case CRC_INPUTDATA_FORMAT_BYTES: + /* Specific 8-bit input data handling */ + temp = CRC_Handle_8((uint8_t *)pBuffer, BufferLength); + break; + + case CRC_INPUTDATA_FORMAT_HALFWORDS: + /* Specific 16-bit input data handling */ + temp = CRC_Handle_16( (uint16_t *)(void *)pBuffer, BufferLength); /* Derogation MisraC2012 R.11.5 */ + break; + + default: + break; + } + + /* Return the CRC computed value */ + return temp; +} + +/** +*\*\name CRC_Calculate +*\*\fun Compute the 7, 8, 16 or 32-bit CRC value of an 8, 16 or 32-bit data buffer +*\*\ starting with CRC_INIT as initialization value. +*\*\param InputDataFormat +*\*\ - CRC_INPUTDATA_FORMAT_WORDS +*\*\ - CRC_INPUTDATA_FORMAT_BYTES +*\*\ - CRC_INPUTDATA_FORMAT_HALFWORDS +*\*\param pBuffer pointer to the input data buffer, exact input data format is +*\*\ provided by InputDataFormat. +*\*\param BufferLength input data buffer length,and: +*\*\ - if InputDataFormat is CRC_INPUTDATA_FORMAT_WORDS,count in words(32bit) +*\*\ - if InputDataFormat is CRC_INPUTDATA_FORMAT_BYTES,count in bytes(8bit) +*\*\ - if InputDataFormat is CRC_INPUTDATA_FORMAT_HALFWORDS,count in half-words(16bit) +*\*\return 32-bit CRC result +*\*\note If the length of CRC result is shorter than 32-bits,only LSB is used. +**/ +uint32_t CRC_Calculate(uint32_t InputDataFormat, void *pBuffer, uint32_t BufferLength) +{ + /* Reset CRC Calculation Unit (CRC_INIT is written in CRC_DAT) */ + CRC_ResetCalculation(); + + /* Return the CRC computed value */ + return (CRC_Accumulate(InputDataFormat, pBuffer, BufferLength)); +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dac.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dac.c new file mode 100644 index 0000000000..191bac6c28 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dac.c @@ -0,0 +1,1340 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dac.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "string.h" +#include "n32h76x_78x_dac.h" +#include "n32h76x_78x_rcc.h" + + +/** DAC_Private_Types Definitions **/ + + +/* DCH registers offsets */ +#define DR8DACx_OFFSET ((uint32_t)0x00000010U) +#define DR8DACy_OFFSET ((uint32_t)0x0000001CU) +#define DR8D_OFFSET ((uint32_t)0x00000028U) + +/* DATO register offset */ +#define DATOx_OFFSET ((uint32_t)0x00000008U) +#define DATOy_OFFSET ((uint32_t)0x0000000CU) + + +/* bit data handler */ +#define BIT_JUDGE_AND_HANDLER(IS_ENABLE, BIT_MASK) (((IS_ENABLE) != DISABLE ) ? (BIT_MASK) : (0x00000000U)) + + +/** DAC Driving Functions Declaration **/ + +/** +*\*\name DAC_DeInit. +*\*\fun Reset the DAC registers. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\return none +**/ +void DAC_DeInit(DACX DACx) +{ + if(IS_DAC12(DACx)) + { + RCC_EnableAPB1PeriphReset2(RCC_APB1_PERIPHRST_DAC12); + } + else if(IS_DAC34(DACx)) + { + RCC_EnableAHB2PeriphReset1(RCC_AHB2_PERIPHRST_DAC34); + } + else if(IS_DAC56(DACx)) + { + RCC_EnableAHB2PeriphReset1(RCC_AHB2_PERIPHRST_DAC56); + } + else + { + /*no process */ + } +} + +/** +*\*\name DAC_StructInit. +*\*\fun Fills all DAC_StructInit member with default value. +*\*\param DAC_StructInit : +*\*\ - DAC_Trigger +*\*\ - DAC_Trigger2 +*\*\ - DAC_WaveGeneration +*\*\ - DAC_LFSRUnmask_TriangleAmplitude +*\*\ - DAC_OutputBuffer +*\*\ - DAC_TriggerEnable +*\*\ - DAC_DMADoubleDataMode +*\*\ - DAC_SignedFormat +*\*\ - DAC_ConnectOnChipPeripheral +*\*\ - DAC_ConnectExternalPin +*\*\return none +**/ +void DAC_StructInit(DAC_InitType* DAC_InitStruct) +{ + /* Initialize the DAC_Trigger member */ + DAC_InitStruct->DAC_Trigger = DAC_Trigger_Software; + /* Initialize the DAC_Trigger2 member */ + DAC_InitStruct->DAC_Trigger2 = DAC_Trigger2_Software; + /* Initialize the DAC_WaveGeneration member */ + DAC_InitStruct->DAC_WaveGeneration = DAC_WaveGeneration_None; + /* Initialize the DAC_LFSRUnmask_TriangleAmplitude member */ + DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; + /* Initialize the DAC_OutputBuffer member */ + DAC_InitStruct->DAC_OutputBuffer = DISABLE; + /* Initialize the DAC_TriggerEnable member */ + DAC_InitStruct->DAC_TriggerEnable = DISABLE; + /* Initialize the DAC_DMADoubleDataMode member */ + DAC_InitStruct->DAC_DMADoubleDataMode = DISABLE; + /* Initialize the DAC_SignedFormat member */ + DAC_InitStruct->DAC_SignedFormat = DISABLE; + /* Initialize the DAC_ConnectOnChipPeripheral member */ + DAC_InitStruct->DAC_ConnectOnChipPeripheral = DISABLE; + /* Initialize the DAC_ConnectExternalPin member */ + DAC_InitStruct->DAC_ConnectExternalPin = DISABLE; +} + +/** +*\*\name DAC_BaseAddrGet. +*\*\fun Get the specified DAC base address. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\return DAC_Module* : +*\*\ - DAC12 +*\*\ - DAC34 +*\*\ - DAC56 +**/ +static DAC_Module* DAC_BaseAddrGet(DACX DACx) +{ + DAC_Module* DAC_TEMP = NULL; + + if(IS_DAC12(DACx)) + { + DAC_TEMP = (DAC_Module*)DAC12; + } + else if(IS_DAC34(DACx)) + { + DAC_TEMP = (DAC_Module*)DAC34; + } + else if(IS_DAC56(DACx)) + { + DAC_TEMP = (DAC_Module*)DAC56; + } + else + { + /* no process */ + } + + return DAC_TEMP; +} +/** +*\*\name DAC_Init. +*\*\fun Enables or disables the specified DAC. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param DAC_InitStruct : +*\*\ - DAC_Trigger +*\*\ - DAC_Trigger_Software +*\*\ - DAC_Trigger_ATIM1_TRGO +*\*\ - DAC_Trigger_ATIM2_TRGO +*\*\ - DAC_Trigger_ATIM3_TRGO +*\*\ - DAC_Trigger_ATIM4_TRGO +*\*\ - DAC_Trigger_GTIMA1_TRGO +*\*\ - DAC_Trigger_GTIMA2_TRGO +*\*\ - DAC_Trigger_GTIMA3_TRGO +*\*\ - DAC_Trigger_GTIMA4_TRGO +*\*\ - DAC_Trigger_GTIMA5_TRGO +*\*\ - DAC_Trigger_GTIMA6_TRGO +*\*\ - DAC_Trigger_GTIMA7_TRGO +*\*\ - DAC_Trigger_GTIMB1_TRGO +*\*\ - DAC_Trigger_GTIMB2_TRGO +*\*\ - DAC_Trigger_GTIMB3_TRGO +*\*\ - DAC_Trigger_EXTI5 +*\*\ - DAC_Trigger_EXTI7 +*\*\ - DAC_Trigger_EXTI9 +*\*\ - DAC_Trigger_SHRTIM1_RST_TRG1 +*\*\ - DAC_Trigger_SHRTIM1_RST_TRG2 +*\*\ - DAC_Trigger_SHRTIM1_RST_TRG3 +*\*\ - DAC_Trigger_SHRTIM1_RST_TRG4 +*\*\ - DAC_Trigger_SHRTIM1_RST_TRG5 +*\*\ - DAC_Trigger_SHRTIM1_RST_TRG6 +*\*\ - DAC_Trigger_SHRTIM1_RST_TRGO123 +*\*\ - DAC_Trigger_SHRTIM2_RST_TRG1 +*\*\ - DAC_Trigger_SHRTIM2_RST_TRG2 +*\*\ - DAC_Trigger_SHRTIM2_RST_TRG3 +*\*\ - DAC_Trigger_SHRTIM2_RST_TRG4 +*\*\ - DAC_Trigger_SHRTIM2_RST_TRG5 +*\*\ - DAC_Trigger_SHRTIM2_RST_TRG6 +*\*\ - DAC_Trigger_SHRTIM2_RST_TRGO123 +*\*\ - DAC_Trigger2 +*\*\ - DAC_Trigger2_Software +*\*\ - DAC_Trigger2_ATIM1_TRGO +*\*\ - DAC_Trigger2_ATIM2_TRGO +*\*\ - DAC_Trigger2_ATIM3_TRGO +*\*\ - DAC_Trigger2_ATIM4_TRGO +*\*\ - DAC_Trigger2_GTIMA1_TRGO +*\*\ - DAC_Trigger2_GTIMA2_TRGO +*\*\ - DAC_Trigger2_GTIMA3_TRGO +*\*\ - DAC_Trigger2_GTIMA4_TRGO +*\*\ - DAC_Trigger2_GTIMA5_TRGO +*\*\ - DAC_Trigger2_GTIMA6_TRGO +*\*\ - DAC_Trigger2_GTIMA7_TRGO +*\*\ - DAC_Trigger2_GTIMB1_TRGO +*\*\ - DAC_Trigger2_GTIMB2_TRGO +*\*\ - DAC_Trigger2_GTIMB3_TRGO +*\*\ - DAC_Trigger2_EXTI6 +*\*\ - DAC_Trigger2_EXTI8 +*\*\ - DAC_Trigger2_EXTI10 +*\*\ - DAC_Trigger2_SHRTIM1_STEP_TRG1 +*\*\ - DAC_Trigger2_SHRTIM1_STEP_TRG2 +*\*\ - DAC_Trigger2_SHRTIM1_STEP_TRG3 +*\*\ - DAC_Trigger2_SHRTIM1_STEP_TRG4 +*\*\ - DAC_Trigger2_SHRTIM1_STEP_TRG5 +*\*\ - DAC_Trigger2_SHRTIM1_STEP_TRG6 +*\*\ - DAC_Trigger2_SHRTIM2_STEP_TRG1 +*\*\ - DAC_Trigger2_SHRTIM2_STEP_TRG2 +*\*\ - DAC_Trigger2_SHRTIM2_STEP_TRG3 +*\*\ - DAC_Trigger2_SHRTIM2_STEP_TRG4 +*\*\ - DAC_Trigger2_SHRTIM2_STEP_TRG5 +*\*\ - DAC_Trigger2_SHRTIM2_STEP_TRG6 +*\*\ - DAC_LFSRUnmask_TriangleAmplitude +*\*\ - DAC_LFSRUnmask_Bit0 +*\*\ - DAC_LFSRUnmask_Bits1_0 +*\*\ - DAC_LFSRUnmask_Bits2_0 +*\*\ - DAC_LFSRUnmask_Bits3_0 +*\*\ - DAC_LFSRUnmask_Bits4_0 +*\*\ - DAC_LFSRUnmask_Bits5_0 +*\*\ - DAC_LFSRUnmask_Bits6_0 +*\*\ - DAC_LFSRUnmask_Bits7_0 +*\*\ - DAC_LFSRUnmask_Bits8_0 +*\*\ - DAC_LFSRUnmask_Bits9_0 +*\*\ - DAC_LFSRUnmask_Bits10_0 +*\*\ - DAC_LFSRUnmask_Bits11_0 +*\*\ - DAC_TriangleAmplitude_1 +*\*\ - DAC_TriangleAmplitude_3 +*\*\ - DAC_TriangleAmplitude_7 +*\*\ - DAC_TriangleAmplitude_15 +*\*\ - DAC_TriangleAmplitude_31 +*\*\ - DAC_TriangleAmplitude_63 +*\*\ - DAC_TriangleAmplitude_127 +*\*\ - DAC_TriangleAmplitude_255 +*\*\ - DAC_TriangleAmplitude_511 +*\*\ - DAC_TriangleAmplitude_1023 +*\*\ - DAC_TriangleAmplitude_2047 +*\*\ - DAC_TriangleAmplitude_4095 +*\*\ - DAC_WaveGeneration +*\*\ - DAC_WaveGeneration_None +*\*\ - DAC_WaveGeneration_Noise +*\*\ - DAC_WaveGeneration_Triangle +*\*\ - DAC_WaveGeneration_SAWTOOTH_INC +*\*\ - DAC_WaveGeneration_SAWTOOTH_DEC +*\*\ - DAC_OutputBuffer +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - DAC_TriggerEnable +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - DAC_DMADoubleDataMode +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - DAC_SignedFormat +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - DAC_ConnectOnChipPeripheral +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - DAC_ConnectExternalPin +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note when DACx is DAC3/DAC4/DAC5/DAC6, DAC_OutputBuffer,the params of DAC_ConnectOnChipPeripheral,DAC_ConnectExternalPin will be ignored. +**/ +void DAC_Init(DACX DACx, DAC_InitType* DAC_InitStruct) +{ + __IO uint32_t tmpreg1; + uint8_t shift_bit; + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + /* Operate DAC_SELCTRL Regersiter */ + tmpreg1 = DAC_Base->SELCTRL; + + if(IS_DAC135(DACx)) + { + shift_bit = 0U; + tmpreg1 &= ~(DACx_SELCTRL_SINCSEL_MASK | DACx_SELCTRL_MAxSEL_MASK | DACx_SELCTRL_TxSEL_MASK); + } + else + { + shift_bit = 16U; + tmpreg1 &= ~(DACy_SELCTRL_SINCSEL_MASK | DACy_SELCTRL_MAySEL_MASK | DACy_SELCTRL_TySEL_MASK); + } + + /*mask/amplitude,DAC_Trigger,DAC_Trigger2 */ + tmpreg1 |= ((DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude << shift_bit) | (DAC_InitStruct->DAC_Trigger << shift_bit) | (DAC_InitStruct->DAC_Trigger2 << shift_bit) ); + DAC_Base->SELCTRL = tmpreg1; + + /* Operate DAC_GCTRL Regersiter */ + tmpreg1 = DAC_Base->GCTRL; + tmpreg1 &= (~DAC_GCTRL_FREQ_MODE_MASK); + tmpreg1 |= DAC_HIGH_FREQ_MODE_BELOW_80M; + DAC_Base->GCTRL = tmpreg1; + + /* Operate DAC_CTRL Regersiter */ + tmpreg1 = DAC_Base->CTRL; + + if(IS_DAC12(DACx)) + { + if(IS_DAC13(DACx)) + { + shift_bit = 0; + tmpreg1 &= ~(DACx_CTRL_BUFF_EN_MASK | DACx_CTRL_TRIGGER_EN_MASK | DACx_CTRL_DMADOUBLEMODE_EN_MASK | DACx_CTRL_SINGFORMAT_EN_MASK | \ + DACx_CTRL_WAVE_TYPE_MASK | DACx_CTRL_OUTPUT_TO_ONCHAIP_EN_MASK | DACx_CTRL_OUTPUT_TO_EXTPIN_EN_MASK ); + } + else + { + shift_bit = 16; + tmpreg1 &= ~(DACy_CTRL_BUFF_EN_MASK | DACy_CTRL_TRIGGER_EN_MASK | DACy_CTRL_DMADOUBLEMODE_EN_MASK | DACy_CTRL_SINGFORMAT_EN_MASK | \ + DACy_CTRL_WAVE_TYPE_MASK | DACy_CTRL_OUTPUT_TO_ONCHAIP_EN_MASK | DACy_CTRL_OUTPUT_TO_EXTPIN_EN_MASK ); + } + + tmpreg1 |= ((BIT_JUDGE_AND_HANDLER(DAC_InitStruct->DAC_OutputBuffer, DACx_CTRL_BUFF_EN_MASK) << shift_bit) | \ + (BIT_JUDGE_AND_HANDLER(DAC_InitStruct->DAC_TriggerEnable, DACx_CTRL_TRIGGER_EN_MASK) << shift_bit) | \ + (BIT_JUDGE_AND_HANDLER(DAC_InitStruct->DAC_DMADoubleDataMode, DACx_CTRL_DMADOUBLEMODE_EN_MASK) << shift_bit) | \ + (BIT_JUDGE_AND_HANDLER(DAC_InitStruct->DAC_SignedFormat, DACx_CTRL_SINGFORMAT_EN_MASK) << shift_bit) | \ + (DAC_InitStruct->DAC_WaveGeneration << (shift_bit)) | \ + (BIT_JUDGE_AND_HANDLER(DAC_InitStruct->DAC_ConnectOnChipPeripheral, DACx_CTRL_OUTPUT_TO_ONCHAIP_EN_MASK) << shift_bit) | \ + (BIT_JUDGE_AND_HANDLER(DAC_InitStruct->DAC_ConnectExternalPin, DACx_CTRL_OUTPUT_TO_EXTPIN_EN_MASK) << shift_bit) ); + } + else + { + if(IS_DAC135(DACx)) + { + shift_bit = 0; + tmpreg1 &= ~(DACx_CTRL_TRIGGER_EN_MASK | DACx_CTRL_DMADOUBLEMODE_EN_MASK | DACx_CTRL_SINGFORMAT_EN_MASK | \ + DACx_CTRL_WAVE_TYPE_MASK ); + } + else + { + shift_bit = 16; + tmpreg1 &= ~( DACy_CTRL_TRIGGER_EN_MASK | DACy_CTRL_DMADOUBLEMODE_EN_MASK | DACy_CTRL_SINGFORMAT_EN_MASK | DACy_CTRL_WAVE_TYPE_MASK ); + } + + tmpreg1 |= ((BIT_JUDGE_AND_HANDLER(DAC_InitStruct->DAC_TriggerEnable, DACx_CTRL_TRIGGER_EN_MASK) << shift_bit) | \ + (BIT_JUDGE_AND_HANDLER(DAC_InitStruct->DAC_DMADoubleDataMode, DACx_CTRL_DMADOUBLEMODE_EN_MASK) << shift_bit) | \ + (BIT_JUDGE_AND_HANDLER(DAC_InitStruct->DAC_SignedFormat, DACx_CTRL_SINGFORMAT_EN_MASK) << shift_bit) | \ + (DAC_InitStruct->DAC_WaveGeneration << (shift_bit)) ); + } + + DAC_Base->CTRL = tmpreg1; +} + + +/** +*\*\name DAC_Enable. +*\*\fun Enables or disables the specified DAC. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DAC_Enable(DACX DACx, FunctionalState Cmd) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACx_CTRL_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACx_CTRL_EN_MASK); + } + } + else + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACy_CTRL_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACy_CTRL_EN_MASK); + } + } +} + +/** +*\*\name DAC_DmaEnable. +*\*\fun Enables or disables the specified DAC DMA request. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DAC_DmaEnable(DACX DACx, FunctionalState Cmd) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACx_CTRL_DMA_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACx_CTRL_DMA_EN_MASK); + } + } + else + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACy_CTRL_DMA_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACy_CTRL_DMA_EN_MASK); + } + } +} + +/** +*\*\name DAC_SoftTrgEnable. +*\*\fun Enables or disables software trigger of the selected DAC. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DAC_SoftTrgEnable(DACX DACx, FunctionalState Cmd) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + if (Cmd != DISABLE) + { + DAC_Base->SOTTR |= (DACx_CTRL_TRIGxEN_MASK); + } + else + { + DAC_Base->SOTTR &= ~(DACx_CTRL_TRIGxEN_MASK); + } + } + else + { + if (Cmd != DISABLE) + { + DAC_Base->SOTTR |= (DACy_CTRL_TRIGyEN_MASK); + } + else + { + DAC_Base->SOTTR &= ~(DACy_CTRL_TRIGyEN_MASK); + } + } +} +/** +*\*\name DAC_SoftTrgSawStepEnable. +*\*\fun Enables or disables software trigger step signal of the selected DAC sawtooth wave . +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DAC_SoftTrgSawStepEnable(DACX DACx, FunctionalState Cmd) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + if (Cmd != DISABLE) + { + DAC_Base->SOTTR |= (DACx_CTRL_TRIGxSTEPEN_MASK); + } + else + { + DAC_Base->SOTTR &= ~(DACx_CTRL_TRIGxSTEPEN_MASK); + } + } + else + { + if (Cmd != DISABLE) + { + DAC_Base->SOTTR |= (DACy_CTRL_TRIGySTEPEN_MASK); + } + else + { + DAC_Base->SOTTR &= ~(DACy_CTRL_TRIGySTEPEN_MASK); + } + } +} + +/** +*\*\name DAC_DualSoftwareTrgEnable. +*\*\fun Enables or disables simultaneously the two DAC software triggers. +*\*\param DACx : +*\*\ - DAC12 +*\*\ - DAC34 +*\*\ - DAC56 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DAC_DualSoftwareTrgEnable(DAC_Module *Dual_DACx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable software trigger for both DAC channels */ + Dual_DACx->SOTTR |= DACx_CTRL_TRIGALLEN_MASK; + } + else + { + /* Disable software trigger for both DAC channels */ + Dual_DACx->SOTTR &= (~DACx_CTRL_TRIGALLEN_MASK); + } +} +/** +*\*\name DAC_DualSoftwareTrgEnable. +*\*\fun Enables or disables software trigger step signal of simultaneously two DACs sawtooth wave . +*\*\param DACx : +*\*\ - DAC12 +*\*\ - DAC34 +*\*\ - DAC56 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DAC_DualSoftwareTrgSawStepEnable(DAC_Module *Dual_DACx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable software trigger sawtooth step sign for both DAC channels */ + Dual_DACx->SOTTR |= DACy_CTRL_TRIGALLSTEPEN_MASK; + } + else + { + /* Disable software trigger sawtooth step sign for both DAC channels */ + Dual_DACx->SOTTR &= (~DACy_CTRL_TRIGALLSTEPEN_MASK); + } +} + +/** +*\*\name DAC_WaveGenerationConfig. +*\*\fun Configure the selected DAC wave generation. . +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param DAC_Wave : +*\*\ - DAC_WaveGeneration_None +*\*\ - DAC_WaveGeneration_Noise +*\*\ - DAC_WaveGeneration_Triangle +*\*\ - DAC_WaveGeneration_SAWTOOTH_INC +*\*\ - DAC_WaveGeneration_SAWTOOTH_DEC +*\*\return none +**/ +void DAC_WaveGenerationConfig(DACX DACx, uint32_t DAC_Wave) +{ + __IO uint32_t tempreg; + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + tempreg = DAC_Base->CTRL; + + if(IS_DAC135(DACx)) + { + tempreg &= ~(DACx_CTRL_WAVE_TYPE_MASK); + tempreg |= (DAC_Wave); + } + else + { + tempreg &= ~(DACy_CTRL_WAVE_TYPE_MASK); + tempreg |= (DAC_Wave << 16); + } + + DAC_Base->CTRL = tempreg; +} + +/** +*\*\name DAC_SetData. +*\*\fun Set the data holding register value for the specified DAC. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param DAC_Align : +*\*\ - DAC_ALIGN_R_8BIT +*\*\ - DAC_ALIGN_L_12BIT +*\*\ - DAC_ALIGN_R_12BIT +*\*\param Data : Data to be loaded in the selected data holding register. +*\*\return none +**/ +void DAC_SetData(DACX DACx, uint32_t DAC_Align, uint16_t Data) +{ + __IO uint32_t tempreg; + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + tempreg = (uint32_t)DAC_Base; + + if(IS_DAC135(DACx)) + { + tempreg += DR8DACx_OFFSET; + } + else + { + tempreg += DR8DACy_OFFSET; + } + + tempreg += DAC_Align; + + /* Set the DACx selected data holding register */ + *(__IO uint32_t*)tempreg = Data; +} + +/** +*\*\name DAC_SetDualChData. +*\*\fun Set the data holding register value for the specified dual-DAC. +*\*\param DACx : +*\*\ - DAC12 +*\*\ - DAC34 +*\*\ - DAC56 +*\*\param DAC_Align : +*\*\ - DAC_ALIGN_R_8BIT +*\*\ - DAC_ALIGN_L_12BIT +*\*\ - DAC_ALIGN_R_12BIT +*\*\param Data2 : Data to be loaded in the selected DACy data holding register. +*\*\param Data1 : Data to be loaded in the selected DACx data holding register. +*\*\return none +**/ +void DAC_SetDualChData(DAC_Module *Dual_DACx, uint32_t DAC_Align, uint16_t Data2, uint16_t Data1) +{ + __IO uint32_t tempreg; + uint32_t data; + + /* Calculate and set dual DAC data holding register value */ + if (DAC_Align == DAC_ALIGN_R_8BIT) + { + data = ((uint32_t)Data2 << 8) | Data1; + } + else + { + data = ((uint32_t)Data2 << 16) | Data1; + } + + tempreg = (uint32_t)Dual_DACx; + tempreg += DR8D_OFFSET + DAC_Align; + + /* Set the dual DAC selected data holding register */ + *(__IO uint32_t*)tempreg = data; +} + +/** +*\*\name DAC_GetOutputDataVal. +*\*\fun Get the last data output value of the selected DAC . +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\return The selected DAC data output value. +**/ +uint16_t DAC_GetOutputDataVal(DACX DACx) +{ + uint32_t tempreg; + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + tempreg = (uint32_t)DAC_Base; + + if(IS_DAC135(DACx)) + { + tempreg += DATOx_OFFSET; + } + else + { + tempreg += DATOy_OFFSET; + } + + /* Returns the DACx data output register value */ + return (uint16_t)(*(__IO uint32_t*)tempreg); +} +/** +*\*\name DAC_SetSawtoothResetValue. +*\*\fun Set the swatooth waveform generation reset data. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param ResetValue: +*\*\ - the value is range from 0- 0xfff; +*\*\return none +**/ +void DAC_SetSawtoothResetValue(DACX DACx, uint16_t ResetValue) +{ + __IO uint32_t tempreg; + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + tempreg = DAC_Base->STRST; + + if(IS_DAC135(DACx)) + { + tempreg &= (~DAC_STRST_STRSTDATAx_MASK); + tempreg |= (uint32_t)ResetValue; + } + else + { + tempreg &= (~DAC_STRST_STRSTDATAy_MASK); + tempreg |= ((uint32_t)ResetValue << 16); + } + + DAC_Base->STRST = tempreg; +} +/** +*\*\name DAC_SetSawtoothStepValue. +*\*\fun Set the swatooth waveform generation step data. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param StepData: +*\*\ - the value is range from 0- 0xfff; +*\*\return none +**/ +void DAC_SetSawtoothStepValue(DACX DACx, uint16_t StepData) +{ + __IO uint32_t tempreg; + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + tempreg = DAC_Base->STINC; + + if(IS_DAC135(DACx)) + { + tempreg &= (~DAC_STINC_STINCDATAx_MASK); + tempreg |= (uint32_t)StepData; + } + else + { + tempreg &= (~DAC_STINC_STINCDATAy_MASK); + tempreg |= ((uint32_t)StepData << 16); + } + + DAC_Base->STINC = tempreg; +} + +/** +*\*\name DAC_CaliEnable. +*\*\fun Enables or disables the specified DACx calibration function. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\note only DACx enable buffer function and the function couldn't be used in DAC3/4/5/6. +*\*\return none +**/ +void DAC_CaliEnable(DACX DACx, FunctionalState Cmd) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACx_CTRL_CALIBATE_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACx_CTRL_CALIBATE_EN_MASK); + } + } + else + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACy_CTRL_CALIBATE_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACy_CTRL_CALIBATE_EN_MASK); + } + } +} +/** +*\*\name DAC_ConnetToOnChipEnable. +*\*\fun Enables or disables the DACx output connected to on the chip. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\note The function couldn't be used in DAC3/4/5/6. +*\*\return none +**/ +void DAC_ConnetToOnChipEnable(DACX DACx, FunctionalState Cmd) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACx_CTRL_OUTPUT_TO_ONCHAIP_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACx_CTRL_OUTPUT_TO_ONCHAIP_EN_MASK); + } + } + else + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACy_CTRL_OUTPUT_TO_ONCHAIP_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACy_CTRL_OUTPUT_TO_ONCHAIP_EN_MASK); + } + } +} +/** +*\*\name DAC_ConnetToExternalPinEnable. +*\*\fun Enables or disables the DACx output connected to external pin. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\note The function couldn't be used in DAC3/4/5/6. +*\*\return none +**/ +void DAC_ConnetToExternalPinEnable(DACX DACx, FunctionalState Cmd) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACx_CTRL_OUTPUT_TO_EXTPIN_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACx_CTRL_OUTPUT_TO_EXTPIN_EN_MASK); + } + } + else + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACy_CTRL_OUTPUT_TO_EXTPIN_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACy_CTRL_OUTPUT_TO_EXTPIN_EN_MASK); + } + } +} +/** +*\*\name DAC_DMADoubleDataModeEnable. +*\*\fun Enables or disables the DACx DMA double data mode. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DAC_DMADoubleDataModeEnable(DACX DACx, FunctionalState Cmd) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACx_CTRL_DMADOUBLEMODE_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACx_CTRL_DMADOUBLEMODE_EN_MASK); + } + } + else + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACy_CTRL_DMADOUBLEMODE_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACy_CTRL_DMADOUBLEMODE_EN_MASK); + } + } +} +/** +*\*\name DAC_SignFormatModeEnable. +*\*\fun Enables or disables the DACx signed format mode. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DAC_SignFormatModeEnable(DACX DACx, FunctionalState Cmd) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACx_CTRL_SINGFORMAT_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACx_CTRL_SINGFORMAT_EN_MASK); + } + } + else + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACy_CTRL_SINGFORMAT_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACy_CTRL_SINGFORMAT_EN_MASK); + } + } +} +/** +*\*\name DAC_HighDriveAbilityEnable. +*\*\fun Enables or disables the DACx high driver ability output. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note The function couldn't be used in DAC3/4/5/6. +**/ +void DAC_HighDriveAbilityEnable(DACX DACx, FunctionalState Cmd) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACx_CTRL_HIGH_DRIVER_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACx_CTRL_HIGH_DRIVER_EN_MASK); + } + } + else + { + if(Cmd != DISABLE) + { + DAC_Base->CTRL |= DACy_CTRL_HIGH_DRIVER_EN_MASK; + } + else + { + DAC_Base->CTRL &= ~(DACy_CTRL_HIGH_DRIVER_EN_MASK); + } + } +} + +/** +*\*\name DAC_GetFlagSts. +*\*\fun Get the specified DAC status flag. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param DAC_FLAG: +*\*\ When DACx == DAC1/2, DAC_FLAG can be as follow: +*\*\ - DAC_FLAG_DMAUDR +*\*\ - DAC_FLAG_CALCOMPLETE +*\*\ - DAC_FLAG_DORSTAT +*\*\ - DAC_FLAG_TROVC +*\*\ When DACx == DAC3/4/5/6, DAC_FLAG can be as follow: +*\*\ - DAC_FLAG_DMAUDR +*\*\ - DAC_FLAG_DORSTAT +*\*\ - DAC_FLAG_TROVC +*\*\ - DAC_FLAG_VFLAGCOMP +*\*\return FlagStatus : +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus DAC_GetFlagSts(DACX DACx, uint32_t DAC_FLAG) +{ + __IO uint32_t tempreg; + FlagStatus status ; + + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + tempreg = DAC_Base->STS; + + if(IS_DAC135(DACx)) + { + status = ((tempreg & DAC_FLAG) != 0) ? SET : RESET; + } + else + { + status = ((tempreg & (DAC_FLAG << 16)) != 0) ? SET : RESET; + } + + return status; +} +/** +*\*\name DAC_ClearFlag. +*\*\fun Clear the specified DAC status flag. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param DAC_FLAG: +*\*\ - DAC_FLAG_DMAUDR +*\*\ - DAC_FLAG_TROVC +*\*\return none +**/ +void DAC_ClearFlag(DACX DACx, uint32_t DAC_FLAG) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + DAC_Base->STS = DAC_FLAG; + } + else + { + DAC_Base->STS = (DAC_FLAG << 16u); + } +} +/** +*\*\name DAC_ConfigInt. +*\*\fun Enables or disables the specified DAC interrupts. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param DAC_IT: +*\*\ - DAC_INT_DMAUDRIEN +*\*\ - DAC_INT_TROVIEN +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DAC_ConfigInt(DACX DACx, uint32_t DAC_IT, FunctionalState Cmd) +{ + __IO uint32_t tempreg; + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + tempreg = DAC_Base->CTRL; + + if(IS_DAC135(DACx)) + { + if(Cmd != DISABLE) + { + tempreg |= DAC_IT; + } + else + { + tempreg &= (~DAC_IT); + } + } + else + { + if(Cmd != DISABLE) + { + tempreg |= (DAC_IT << 16u); + } + else + { + tempreg &= (~(DAC_IT << 16u) ); + } + } + + DAC_Base->CTRL = tempreg; +} +/** +*\*\name DAC_GetIntSts. +*\*\fun Get the specified DAC interrupts flag. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param DAC_IT: +*\*\ - DAC_INTFLAG_DMAUDR +*\*\ - DAC_INTFLAG_TROVC +*\*\return FlagStatus : +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus DAC_GetIntSts(DACX DACx, uint32_t DAC_IT) +{ + __IO uint32_t tempreg; + FlagStatus status ; + + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + tempreg = DAC_Base->STS; + + if(IS_DAC135(DACx)) + { + status = ((tempreg & DAC_IT) != 0u) ? SET : RESET; + } + else + { + status = ((tempreg & (DAC_IT << 16u) ) != 0u) ? SET : RESET; + } + + return status; +} +/** +*\*\name DAC_ClearITPendingBit. +*\*\fun Clears the DACx interrupt pending bit. +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\ - DAC3 +*\*\ - DAC4 +*\*\ - DAC5 +*\*\ - DAC6 +*\*\param DAC_IT: +*\*\ - DAC_INTFLAG_DMAUDR +*\*\ - DAC_INTFLAG_TROVC +*\*\return FlagStatus : +*\*\ - SET +*\*\ - RESET +**/ +void DAC_ClearITPendingBit(DACX DACx, uint32_t DAC_IT) +{ + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + + if(IS_DAC135(DACx)) + { + DAC_Base->STS = DAC_IT; + } + else + { + DAC_Base->STS = (DAC_IT << 16u); + } +} + + +/** +*\*\name DAC_ConfigClkPrescaler. +*\*\fun Configures the DAC_CLK prescaler. +*\*\param DACx : +*\*\ - DAC12 +*\*\ - DAC34 +*\*\ - DAC56 +*\*\param Prescaler: +*\*\ - when DACx is DAC12 , the value range from 1 - 0xff +*\*\ - when DACx is DAC34 or DAC56 ,the value range from 1 - 0x1f +*\*\return none +**/ +void DAC_ConfigClkPrescaler(DAC_Module* DACx, uint8_t Prescaler) +{ + if(DACx == DAC12) + { + DACx->GCTRL &= (~DAC12_GCTRL_PCS_MASK); + } + else + { + DACx->GCTRL &= (~DAC3456_GCTRL_PCS_MASK); + } + + DACx->GCTRL |= (((uint32_t)Prescaler - 1u) << 16u); +} + + +/** +*\*\name DAC_SetHighFrequencyMode. +*\*\fun Configures the high frequency interface mode for the selected DAC. +*\*\param DACx : +*\*\ - DAC12 +*\*\param mode: +*\*\ - DAC_HIGH_FREQ_MODE_DISABLE +*\*\ - DAC_HIGH_FREQ_MODE_BELOW_80M +*\*\ - DAC_HIGH_FREQ_MODE_BELOW_160M +*\*\ - DAC_HIGH_FREQ_MODE_ABOVE_160M +*\*\return none +**/ +void DAC_SetHighFrequencyMode(DAC_Module* DACx, uint32_t mode) +{ + uint32_t tempreg; + tempreg = DACx->GCTRL; + + tempreg &= (~DAC_GCTRL_FREQ_MODE_MASK); + tempreg |= mode; + + DACx->GCTRL = tempreg; +} + +/** +*\*\name DAC_SetUserTrimming. +*\*\fun Config the offset trimming value for the selected DAC . +*\*\param DACx : +*\*\ - DAC1 +*\*\ - DAC2 +*\*\param TrimmingValue: DAC new trimming value +*\*\ - the data is range from 0 - 31 +*\*\return none +*\*\note The function couldn't be used in DAC3/4/5/6. +**/ +void DAC_SetUserTrimming(DACX DACx, uint8_t TrimmingValue) +{ + __IO uint32_t tempreg; + DAC_Module* DAC_Base = DAC_BaseAddrGet(DACx); + tempreg = DAC_Base->CALC; + + if(IS_DAC135(DACx)) + { + tempreg &= (~DAC_CALC_OTRIMxVALUE_MASK); + tempreg |= (uint32_t)TrimmingValue; + } + else + { + tempreg &= (~DAC_CALC_OTRIMyVALUE_MASK); + tempreg |= (((uint32_t)TrimmingValue) << 16u); + } + + DAC_Base->CALC = tempreg ; +} + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dbg.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dbg.c new file mode 100644 index 0000000000..bacd674966 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dbg.c @@ -0,0 +1,276 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dbg.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ + +#include "n32h76x_78x_dbg.h" + + +/** +*\*\name DBG_GetRevNum. +*\*\fun get the revision number. +*\*\param none +*\*\return revision number +**/ +uint32_t DBG_GetRevNum(void) +{ + return (uint32_t)((DBG->ID & DBG_REV_NUM_MASK) >> 24); +} + +/** +*\*\name DBG_GetDevNum. +*\*\fun get the device identifer. +*\*\param none +*\*\return Device identifier +*\*\ - 0x760 : N32H760 Series +*\*\ - 0x762 : N32H762 Series +*\*\ - 0x765 : N32H765 Series +*\*\ - 0x785 : N32H785 Series +*\*\ - 0x787 : N32H787 Series +*\*\ - 0x788 : N32H788 Series +**/ +uint32_t DBG_GetDevNum(void) +{ + return (uint32_t)((DBG->ID & DBG_DEV_NUM_MASK) >> 12); +} + + +/** +*\*\name DBG_SetExternalTriggerPinDirection. +*\*\fun Set the direction of the bi-directional trigger pin TRGIO. +*\*\param PinDirection : + - DBG_TRGIO_INPUT_DIRECTION + - DBG_TRGIO_OUTPUT_DIRECTION +*\*\return none +**/ +void DBG_SetExternalTriggerPinDirection(uint32_t PinDirection) +{ + if(PinDirection == DBG_TRGIO_OUTPUT_DIRECTION) + { + DBG->CTRL |= DBG_TRGIO_OUTPUT_DIRECTION; + } + else + { + DBG->CTRL &= (~DBG_TRGIO_OUTPUT_DIRECTION) ; + } +} + +/** +*\*\name DBG_M7ConfigPeriph. +*\*\fun Configures the specified peripheral run or stop when the M7 MCU under Debug mode. +*\*\param DBG_Periph : + - DBG_M7SLEEP * Keep debugger connection during M7 SLEEP mode * + - DBG_M7STOP * Keep debugger connection during M7 STOP mode * + - DBG_M7STANDBY * Keep debugger connection during M7 STANDBY mode * + - DBG_WWDG1_STOP * WWDG1 stopped when Core is halted. * + - DBG_WWDG2_STOP * WWDG2 stopped when Core is halted. * + - DBG_ATIM3_STOP * ATIM3 counter stopped when core is halted * + - DBG_ATIM4_STOP * ATIM4 counter stopped when core is halted * + - DBG_I2C7SMBUS_TIMEOUT * I2C7 counter stopped when core is halted * + - DBG_I2C8SMBUS_TIMEOUT * I2C8 counter stopped when core is halted * + - DBG_I2C9SMBUS_TIMEOUT * I2C9 counter stopped when core is halted * + - DBG_I2C10SMBUS_TIMEOUT * I2C10 counter stopped when core is halted * + - DBG_IWDG1_STOP * IWDG1 counter stopped when core is halted * + - DBG_IWDG2_STOP * IWDG2 counter stopped when core is halted * + - DBG_LPTIM1_STOP * LPTIM1 counter stopped when core is halted * + - DBG_LPTIM2_STOP * LPTIM2 counter stopped when core is halted * + - DBG_LPTIM3_STOP * LPTIM3 counter stopped when core is halted * + - DBG_LPTIM4_STOP * LPTIM4 counter stopped when core is halted * + - DBG_LPTIM5_STOP * LPTIM5 counter stopped when core is halted * + - DBG_RTC_STOP * RTC counter stopped when core is halted * + - DBG_CANFD3_STOP * CANFD3 counter stopped when core is halted * + - DBG_CANFD4_STOP * CANFD4 counter stopped when core is halted * + - DBG_CANFD7_STOP * CANFD7 counter stopped when core is halted * + - DBG_CANFD8_STOP * CANFD8 counter stopped when core is halted * + - DBG_I2C4SMBUS_TIMEOUT * I2C4 counter stopped when core is halted * + - DBG_I2C5SMBUS_TIMEOUT * I2C5 counter stopped when core is halted * + - DBG_I2C6SMBUS_TIMEOUT * I2C6 counter stopped when core is halted * + - DBG_ATIM1_STOP * ATIM1 counter stopped when core is halted * + - DBG_ATIM2_STOP * ATIM2 counter stopped when core is halted * + - DBG_GTIMA1_STOP * GTIMA1 counter stopped when core is halted * + - DBG_GTIMA2_STOP * GTIMA2 counter stopped when core is halted * + - DBG_GTIMA3_STOP * GTIMA3 counter stopped when core is halted * + - DBG_SHRTIM1_STOP * SHRTIM1 counter stopped when core is halted * + - DBG_SHRTIM2_STOP * SHRTIM2 counter stopped when core is halted * + - DBG_BTIM1_STOP * BTIM1 counter stopped when core is halted * + - DBG_BTIM2_STOP * BTIM2 counter stopped when core is halted * + - DBG_BTIM3_STOP * BTIM3 counter stopped when core is halted * + - DBG_BTIM4_STOP * BTIM4 counter stopped when core is halted * + - DBG_GTIMA4_STOP * GTIMA4 counter stopped when core is halted * + - DBG_GTIMA5_STOP * GTIMA5 counter stopped when core is halted * + - DBG_GTIMA6_STOP * GTIMA6 counter stopped when core is halted * + - DBG_GTIMA7_STOP * GTIMA7 counter stopped when core is halted * + - DBG_GTIMB1_STOP * GTIMB1 counter stopped when core is halted * + - DBG_GTIMB2_STOP * GTIMB2 counter stopped when core is halted * + - DBG_GTIMB3_STOP * GTIMB3 counter stopped when core is halted * + - DBG_I2C1SMBUS_TIMEOUT * I2C1 counter stopped when core is halted * + - DBG_I2C2SMBUS_TIMEOUT * I2C2 counter stopped when core is halted * + - DBG_I2C3SMBUS_TIMEOUT * I2C3 counter stopped when core is halted * + - DBG_CANFD1_STOP * CANFD1 counter stopped when core is halted * + - DBG_CANFD2_STOP * CANFD2 counter stopped when core is halted * + - DBG_CANFD5_STOP * CANFD5 counter stopped when core is halted * + - DBG_CANFD6_STOP * CANFD6 counter stopped when core is halted * +*\*\return none +**/ +void DBG_M7ConfigPeriph(uint32_t DBG_Periph, FunctionalState Cmd) +{ + uint32_t Offset = ( (DBG_Periph & REGISTER_OFFSET_MASK) >> REGISTER_OFFSET_POS); + __IO uint32_t Register_Base = DBGMCU_BASE; + + Register_Base += Offset; + + if (Cmd != DISABLE) + { + *(uint32_t *)Register_Base |= DBG_Periph; + } + else + { + *(uint32_t *)Register_Base &= ~DBG_Periph; + } +} + +/** +*\*\name DBG_M4ConfigPeriph. +*\*\fun Configures the specified peripheral run or stop when the M4 MCU under Debug mode. +*\*\param DBG_Periph : + - DBG_M4SLEEP * Keep debugger connection during M4 SLEEP mode * + - DBG_M4STOP * Keep debugger connection during M4 STOP mode * + - DBG_M4STANDBY * Keep debugger connection during M4 STANDBY mode * + - DBG_WWDG1_STOP * WWDG1 stopped when Core is halted. * + - DBG_WWDG2_STOP * WWDG2 stopped when Core is halted. * + - DBG_ATIM3_STOP * ATIM3 counter stopped when core is halted * + - DBG_ATIM4_STOP * ATIM4 counter stopped when core is halted * + - DBG_I2C7SMBUS_TIMEOUT * I2C7 counter stopped when core is halted * + - DBG_I2C8SMBUS_TIMEOUT * I2C8 counter stopped when core is halted * + - DBG_I2C9SMBUS_TIMEOUT * I2C9 counter stopped when core is halted * + - DBG_I2C10SMBUS_TIMEOUT * I2C10 counter stopped when core is halted * + - DBG_IWDG1_STOP * IWDG1 counter stopped when core is halted * + - DBG_IWDG2_STOP * IWDG2 counter stopped when core is halted * + - DBG_LPTIM1_STOP * LPTIM1 counter stopped when core is halted * + - DBG_LPTIM2_STOP * LPTIM2 counter stopped when core is halted * + - DBG_LPTIM3_STOP * LPTIM3 counter stopped when core is halted * + - DBG_LPTIM4_STOP * LPTIM4 counter stopped when core is halted * + - DBG_LPTIM5_STOP * LPTIM5 counter stopped when core is halted * + - DBG_RTC_STOP * RTC counter stopped when core is halted * + - DBG_CANFD3_STOP * CANFD3 counter stopped when core is halted * + - DBG_CANFD4_STOP * CANFD4 counter stopped when core is halted * + - DBG_CANFD7_STOP * CANFD7 counter stopped when core is halted * + - DBG_CANFD8_STOP * CANFD8 counter stopped when core is halted * + - DBG_I2C4SMBUS_TIMEOUT * I2C4 counter stopped when core is halted * + - DBG_I2C5SMBUS_TIMEOUT * I2C5 counter stopped when core is halted * + - DBG_I2C6SMBUS_TIMEOUT * I2C6 counter stopped when core is halted * + - DBG_ATIM1_STOP * ATIM1 counter stopped when core is halted * + - DBG_ATIM2_STOP * ATIM2 counter stopped when core is halted * + - DBG_GTIMA1_STOP * GTIMA1 counter stopped when core is halted * + - DBG_GTIMA2_STOP * GTIMA2 counter stopped when core is halted * + - DBG_GTIMA3_STOP * GTIMA3 counter stopped when core is halted * + - DBG_SHRTIM1_STOP * SHRTIM1 counter stopped when core is halted * + - DBG_SHRTIM2_STOP * SHRTIM2 counter stopped when core is halted * + - DBG_BTIM1_STOP * BTIM1 counter stopped when core is halted * + - DBG_BTIM2_STOP * BTIM2 counter stopped when core is halted * + - DBG_BTIM3_STOP * BTIM3 counter stopped when core is halted * + - DBG_BTIM4_STOP * BTIM4 counter stopped when core is halted * + - DBG_GTIMA4_STOP * GTIMA4 counter stopped when core is halted * + - DBG_GTIMA5_STOP * GTIMA5 counter stopped when core is halted * + - DBG_GTIMA6_STOP * GTIMA6 counter stopped when core is halted * + - DBG_GTIMA7_STOP * GTIMA7 counter stopped when core is halted * + - DBG_GTIMB1_STOP * GTIMB1 counter stopped when core is halted * + - DBG_GTIMB2_STOP * GTIMB2 counter stopped when core is halted * + - DBG_GTIMB3_STOP * GTIMB3 counter stopped when core is halted * + - DBG_I2C1SMBUS_TIMEOUT * I2C1 counter stopped when core is halted * + - DBG_I2C2SMBUS_TIMEOUT * I2C2 counter stopped when core is halted * + - DBG_I2C3SMBUS_TIMEOUT * I2C3 counter stopped when core is halted * + - DBG_CANFD1_STOP * CANFD1 counter stopped when core is halted * + - DBG_CANFD2_STOP * CANFD2 counter stopped when core is halted * + - DBG_CANFD5_STOP * CANFD5 counter stopped when core is halted * + - DBG_CANFD6_STOP * CANFD6 counter stopped when core is halted * +*\*\return none +**/ +void DBG_M4ConfigPeriph(uint32_t DBG_Periph, FunctionalState Cmd) +{ + uint32_t Offset = ( (DBG_Periph & REGISTER_OFFSET_MASK) >> REGISTER_OFFSET_POS); + __IO uint32_t Register_Base = DBGMCU_BASE; + + Register_Base += (Offset + 0x04u); + + if (Cmd != DISABLE) + { + *(uint32_t *)Register_Base |= DBG_Periph; + } + else + { + *(uint32_t *)Register_Base &= ~DBG_Periph; + } +} +/** +*\*\name DBG_GetFlashSize. +*\*\fun Get FLASH size of this chip. +*\*\param none +*\*\return FLASH size in bytes. +**/ +uint32_t DBG_GetFlashSize(void) +{ + uint32_t Flash_size = (DBG->ID & DBG_FLASH_SIZE_MASK); + + if(Flash_size != DBG_FLASH_SIZE_MASK) + { + Flash_size = (uint32_t)(Flash_size << 15); + } + else + { + Flash_size = 0; + } + + return Flash_size; +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dcmu.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dcmu.c new file mode 100644 index 0000000000..1df55b4c97 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dcmu.c @@ -0,0 +1,314 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dcmu.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + *///mayan+ +#include "n32h76x_78x_dcmu.h" +#include "n32h76x_78x_rcc.h" + +/* DCMU Driving Functions Declaration */ + + +/* DCMU_Private_Defines */ +/** +*\*\name DCMU_Reset. +*\*\fun Resets the DCMUx peripheral +*\*\param none +*\*\return none +**/ +void DCMU_DeInit( void ) +{ + RCC_EnableDCMUReset(); +} + +#if defined(CORE_CM7) +/** +*\*\name DCMU_SelfReset. +*\*\fun Self-resets the DCMUx peripheral by CM7 or CM4 +*\*\param none +*\*\return none +**/ +void DCMU_SelfReset( void ) +{ + DCMU->CTRL |= DCMU_CTRL_RST_MASK; + __NOP(); + __NOP(); + + /* Wait for CPU reset bit in DCMU status register is completed */ + while( 0U != (DCMU->STS & DCMU_STS_RSTF_MASK) ) + { + __NOP(); + } +} +#endif + +/** +*\*\name DCMU_TransmitMsg. +*\*\fun Transmit Message through Blocking or NonBlocking Mode to counterpart MCU +*\*\param TxIdx : +*\*\ - TXMSG_IDX0 +*\*\ - TXMSG_IDX1 +*\*\ - TXMSG_IDX2 +*\*\ - TXMSG_IDX3 +*\*\param TxMsgData : +*\*\ - 32bit unsigned integer message data payload [0x00000000U--0xFFFFFFFFU] +*\*\param Mode : +*\*\ - NON_BLOCKING +*\*\ - BLOCKING +*\*\return none +**/ +void DCMU_TransmitMsg( uint8_t TxIdx, uint32_t TxMsgData, dcmu_wait_mode_t Mode) +{ + /* Wait until transmit message register is empty in blocking receive mode */ + if( BLOCKING == Mode) + { + while( 0u == (DCMU->STS & (1U << (DCMU_STS_TEF3_Pos + 3U - TxIdx)))) + { + __NOP(); + } + } + + /* NonBlocking and Blocking common code */ + DCMU->TXMSG[TxIdx] = TxMsgData; +} + +/** +*\*\name DCMU_ReceiveMsg. +*\*\fun Receive Message through Blocking or NonBlocking Mode from counterpart mcu +*\*\param RcvIdx : +*\*\ - RCVMSG_IDX0 +*\*\ - RCVMSG_IDX1 +*\*\ - RCVMSG_IDX2 +*\*\ - RCVMSG_IDX3 +*\*\param Mode : +*\*\ - NON_BLOCKING +*\*\ - BLOCKING +*\*\return uint32_t message data from counterpart mcu +**/ +uint32_t DCMU_ReceiveMsg( uint8_t RcvIdx, dcmu_wait_mode_t Mode) +{ + /* Wait until receive message register is full in blocking receive mode */ + if( BLOCKING == Mode) + { + while( 0u == (DCMU->STS & (1U << (DCMU_STS_RFF3_Pos + 3U - RcvIdx)))) + { + __NOP(); + } + } + + /* NonBlocking and Blocking mode common code */ + return DCMU->RCVMSG[RcvIdx]; +} + +/** +*\*\name DCMU_Set3BitFlagNumbers. +*\*\fun Set three bits flag number in order to transmit to counterpart +*\*\param FlagData : +*\*\ - 3 bits flag number data [0x0U - 0x7U] +*\*\param Mode : +*\*\ - NON_BLOCKING +*\*\ - BLOCKING +*\*\return none +**/ +void DCMU_Set3BitFlagNumbers( uint8_t FlagData, dcmu_wait_mode_t Mode) +{ + __IO uint32_t tempreg; + + /* Wait until receive flag is pending in case of blocking receive mode */ + if( BLOCKING == Mode) + { + while( 0u != (DCMU->STS & DCMU_STS_FUPF_MASK )) + { + __NOP(); + } + } + + /* NonBlocking and Blocking mode common code */ + tempreg = DCMU->CTRL; + tempreg &= ~(uint32_t)(DCMU_CTRL_TXFN_ALL_MASK); + tempreg |= (uint32_t)FlagData; + DCMU->CTRL = tempreg; + +} + +/** +*\*\name DCMU_Get3BitFlagNumbers. +*\*\fun Get three bits flag number received from counterpart +*\*\param none +*\*\return uint8_t received 3bits flag number data from counterpart mcu [0x00U-0x07U] +**/ +uint8_t DCMU_Get3BitFlagNumbers( void) +{ + return (uint8_t)(DCMU->STS & (uint32_t)( DCMU_STS_RCVFN_ALL_MASK)); +} + +/** +*\*\name DCMU_GetStatusFlags. +*\*\fun Get status flags from status register, only FUPF, EPF and RSTF flags are captured +*\*\param StatusMask : +*\*\ - DCMU_STS_EPF_MASK +*\*\ - DCMU_STS_FUPF_MASK +*\*\ - DCMU_STS_RSTF_MASK +*\*\return uint32_t the existing status flags +**/ +uint32_t DCMU_GetStatusFlags( uint32_t StatusMask) +{ + DCMU_Module *DCMUx = DCMU; + return DCMUx->STS & (uint32_t)(( DCMU_STS_EPF_MASK | DCMU_STS_RSTF_MASK | DCMU_STS_FUPF_MASK) & StatusMask); +} + +/** +*\*\name DCMU_GetIntPendingFlags. +*\*\fun Get interrupt pendding flags from status register and GPIF, TEIF and RFIF flags are captured +*\*\param IntPendingMask : +*\*\ - DCMU_STS_GPIF0_MASK +*\*\ - DCMU_STS_GPIF1_MASK +*\*\ - DCMU_STS_GPIF2_MASK +*\*\ - DCMU_STS_GPIF3_MASK +*\*\ - DCMU_STS_RFF0_MASK +*\*\ - DCMU_STS_RFF1_MASK +*\*\ - DCMU_STS_RFF2_MASK +*\*\ - DCMU_STS_RFF3_MASK +*\*\ - DCMU_STS_TEF0_MASK +*\*\ - DCMU_STS_TEF1_MASK +*\*\ - DCMU_STS_TEF2_MASK +*\*\ - DCMU_STS_TEF3_MASK +*\*\return uint32_t the existing interrupt pending flags which are in range of IntPendingMask +**/ +uint32_t DCMU_GetIntPendingFlags( uint32_t IntPendingMask) +{ + + return DCMU->STS & (uint32_t)( IntPendingMask & \ + ( DCMU_STS_GPIF_ALL_MASK | \ + DCMU_STS_TEF_ALL_MASK | \ + DCMU_STS_RFF_ALL_MASK ) ); +} + +/** +*\*\name GPIntPendingMask. +*\*\fun Clear general purpose interrupt pending as GPIF +*\*\param GPIntPendingMask : +*\*\ - DCMU_STS_GPIF0_MASK +*\*\ - DCMU_STS_GPIF1_MASK +*\*\ - DCMU_STS_GPIF2_MASK +*\*\ - DCMU_STS_GPIF3_MASK +*\*\return none +**/ +void DCMU_ClearIntPendingFlags( uint32_t GPIntPendingMask) +{ + __IO uint32_t tempreg; + + tempreg = DCMU->STS; + tempreg &= ~(uint32_t)(DCMU_STS_GPIF_ALL_MASK); + tempreg |= (uint32_t)(GPIntPendingMask & (uint32_t)(DCMU_STS_GPIF_ALL_MASK)); + DCMU->STS = tempreg; +} + +/** +*\*\name DCMU_ConfigInt. +*\*\fun Configure individual interrupts as enable or disabled +*\*\param IntMask : +*\*\ - DCMU_CTRL_GPIE0_MASK +*\*\ - DCMU_CTRL_GPIE1_MASK +*\*\ - DCMU_CTRL_GPIE2_MASK +*\*\ - DCMU_CTRL_GPIE3_MASK +*\*\ - DCMU_CTRL_RFIE0_MASK +*\*\ - DCMU_CTRL_RFIE1_MASK +*\*\ - DCMU_CTRL_RFIE2_MASK +*\*\ - DCMU_CTRL_RFIE3_MASK +*\*\ - DCMU_CTRL_TEIE0_MASK +*\*\ - DCMU_CTRL_TEIE1_MASK +*\*\ - DCMU_CTRL_TEIE2_MASK +*\*\ - DCMU_CTRL_TEIE3_MASK +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DCMU_ConfigInt( uint32_t IntMask, FunctionalState Cmd) +{ + __IO uint32_t tempreg; + + tempreg = DCMU->CTRL; + + if( ENABLE == Cmd) + { + tempreg |= (uint32_t)(IntMask & DCMU_CTRL_ALL_IE_MASK); + } + else + { + tempreg &= ~(uint32_t)IntMask; + } + + DCMU->CTRL = tempreg; +} + +/** +*\*\name DCMU_RequestGPInt. +*\*\fun Send request general purpose interrupt to counterpart mcu +*\*\param ReqGPIntMask : +*\*\ - DCMU_CTRL_GPIR0_MASK +*\*\ - DCMU_CTRL_GPIR1_MASK +*\*\ - DCMU_CTRL_GPIR2_MASK +*\*\ - DCMU_CTRL_GPIR3_MASK +*\*\return none +**/ +void DCMU_RequestGPInt( uint32_t ReqGPIntMask) +{ + __IO uint32_t tempreg; + + tempreg = DCMU->CTRL; + tempreg &= (~DCMU_CTRL_GPIR_ALL_MASK ); + tempreg |= ReqGPIntMask ; + + DCMU->CTRL = tempreg; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dma.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dma.c new file mode 100644 index 0000000000..a9d1bc707e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dma.c @@ -0,0 +1,1266 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dma.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_dma.h" + + +#define DMA_EVENT_MAX (5U) + + +/** +*\*\name DMA_ControllerCmd. +*\*\fun Enable or disable DMA Controller peripheral. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DMA_ControllerCmd(DMA_Module *const DMAy, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the DMA Controller */ + SET_BIT(DMAy->CFG, DMA_CFG_EN); + } + else + { + /* Disable the DMA Controller */ + CLEAR_BIT(DMAy->CFG, DMA_CFG_EN); + } +} + +/** +*\*\name DMA_ControllerIsEnabled. +*\*\fun Check DMA Controller peripheral is enabled. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\return true or false +**/ +bool DMA_ControllerIsEnabled(DMA_Module *const DMAy) +{ + bool ret; + ret = READ_BIT(DMAy->CFG, DMA_CFG_EN) ? true : false; + return ret; +} + +/** +*\*\name DMA_ChannelCmd. +*\*\fun Enable or disable a DMA channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DMA_ChannelCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the DMA channel */ + WRITE_REG(DMAy->CHEN, (DMA_CH_ENABLE << ChNum)); + } + else + { + /* Disable the DMA channel */ + WRITE_REG(DMAy->CHEN, (DMA_CH_DISABLE << ChNum)); + + while (READ_BIT((uint8_t)DMAy->CHEN, ((uint8_t)0x1U << ChNum)) != 0U) + { + /* Wait until channel is disabled */ + } + } +} + +/** +*\*\name DMA_ChannelIsEnabled. +*\*\fun Check whether a DMA channel enabled. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\return true or false +**/ +bool DMA_ChannelIsEnabled(DMA_Module *const DMAy, DMA_ChNumType ChNum) +{ + bool ret; + ret = READ_BIT((uint8_t)DMAy->CHEN, ((uint8_t)0x1U << ChNum)) ? true : false; + return ret; +} + +/** +*\*\name DMA_ChannelInit. +*\*\fun Initialize a DMA channel with provided channel configuration. +*\*\ The function sets up the following channel configuration parameters for +*\*\ a DMA channel specified paramters like: +*\*\ Source and Destination addresses (and linked list address if required). +*\*\ Source and Destination handshake method as software/hardware selection. +*\*\ Scatter/gather configuration and transfer flow and transfer type. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param DMA_ChInitParam : +*\*\ - Pointer to the DMA_ChInitType structure which will be initialized. +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\return One of DMA_ChStatusType. +**/ +DMA_ChStatusType DMA_ChannelInit(DMA_Module *const DMAy, DMA_ChInitType *const DMA_ChInitParam, DMA_ChNumType ChNum) +{ + uint32_t TempValue; + DMA_ChStatusType RetStatus; + + /* Check whether the specified DMA controller is enabled */ + if (DMA_ControllerIsEnabled(DMAy) == ENABLE) + { + /* Checks whether the specified DMA channel is disabled */ + if (DMA_ChannelIsEnabled(DMAy, ChNum) == DISABLE) + { + /* Sets channel n source address register */ + WRITE_REG(DMAy->CH[ChNum].SA, DMA_ChInitParam->SrcAddr); + /* Sets channel n destination address register */ + WRITE_REG(DMAy->CH[ChNum].DA, DMA_ChInitParam->DstAddr); + /* Sets channel n linked list pointer register */ + WRITE_REG(DMAy->CH[ChNum].LLP, (uint32_t)DMA_ChInitParam->pLinkListItem); + /* Sets channel n control register */ + WRITE_REG(DMAy->CH[ChNum].CTRL, DMA_ChInitParam->ChCtrl); + + /* Sets channel n priority */ + MODIFY_REG(DMAy->CH[ChNum].CFG, DMA_CHNCFG_CHPRIOR, ((uint64_t)DMA_ChInitParam->ChannelPriority << 0x5U)); + /* Sets channel n source handshaking interface polarity */ + MODIFY_REG(DMAy->CH[ChNum].CFG, DMA_CHNCFG_SRCHSPOL, ((uint64_t)DMA_ChInitParam->SrcHsInterfacePol << 0x13U)); + /* Sets channel n destination handshaking interface polarity */ + MODIFY_REG(DMAy->CH[ChNum].CFG, DMA_CHNCFG_DSTHSPOL, ((uint64_t)DMA_ChInitParam->DstHsInterfacePol << 0x12U)); + + /* Configure scatter and gather */ + if (DMA_ChInitParam->SrcGatherEn) + { + /* Write the DMA_CHnSG register */ + WRITE_REG(DMAy->CH[ChNum].SG, DMA_ChInitParam->SrcGatherCtrl); + } + + if (DMA_ChInitParam->DstScatterEn) + { + /* Write the DMA_CHnDS register */ + WRITE_REG(DMAy->CH[ChNum].DS, DMA_ChInitParam->DstScatterCtrl); + } + + /* Configure source handshaking hardware mode */ + if (DMA_ChInitParam->SrcHandshaking == DMA_CH_SRC_HANDSHAKING_HARDWARE) + { + if ((DMA_ChInitParam->TfrTypeFlowCtrl == DMA_CH_TRANSFER_FLOW_P2M_DMA) || \ + (DMA_ChInitParam->TfrTypeFlowCtrl == DMA_CH_TRANSFER_FLOW_P2P_DMA)) + { + TempValue = ((uint32_t)DMA_ChInitParam->SrcHsInterface & 0x7U); + /* Select hardware handshake I/F [0-7] */ + MODIFY_REG(DMAy->CH[ChNum].CFG, DMA_CHNCFG_SRCPER, ((uint64_t)TempValue << 0x27U)); + + /* Enable hardware handshake to source peripheral */ + CLEAR_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_HSSELSRC); + } + } + + /* Configure destination handshaking hardware mode */ + if (DMA_ChInitParam->DstHandshaking == DMA_CH_DST_HANDSHAKING_HARDWARE) + { + /* Hardware handshaking interface configuration */ + if ((DMA_ChInitParam->TfrTypeFlowCtrl == DMA_CH_TRANSFER_FLOW_M2P_DMA) || \ + (DMA_ChInitParam->TfrTypeFlowCtrl == DMA_CH_TRANSFER_FLOW_P2P_DMA)) + { + TempValue = ((uint32_t)DMA_ChInitParam->DstHsInterface & 0x7U); + /* Select hardware handshake I/F [0-7] */ + MODIFY_REG(DMAy->CH[ChNum].CFG, DMA_CHNCFG_DSTPER, ((uint64_t)TempValue << 0x2BU)); + + /* Enable hardware handshake to destionation peripheral */ + CLEAR_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_HSSELDST); + } + } + + /* Clear interrupt event status */ + DMA_ClearChannelEventStatus(DMAy, ChNum, (uint32_t)((uint32_t)DMA_CH_EVENT_TRANSFER_COMPLETE | \ + (uint32_t)DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE | \ + (uint32_t)DMA_CH_EVENT_SRC_TRANSACTION_COMPLETE | \ + (uint32_t)DMA_CH_EVENT_DST_TRANSACTION_COMPLETE | \ + (uint32_t)DMA_CH_EVENT_ERROR)); + + /* Configure the block tranfer type according to settings */ + switch (DMA_ChInitParam->TfrType) + { + case DMA_CH_TRANSFER_TYPE_SINGLE_BLOCK: + break; + + case DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_CONTIGUOUS_DSTADR_RELOAD: + SET_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_ADR); + break; + + case DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_RELOAD_DSTADR_CONTIGUOUS: + SET_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_ASR); + break; + + case DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_RELOAD_DSTADR_RELOAD: + SET_BIT(DMAy->CH[ChNum].CFG, (DMA_CHNCFG_ADR | DMA_CHNCFG_ASR)); + break; + + case DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_CONTIGUOUS_DSTADR_LINKED: + SET_BIT(DMAy->CH[ChNum].CTRL, DMA_CHNCTRL_LLPDSTEN); + break; + + case DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_RELOAD_DSTADR_LINKED: + SET_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_ASR); + SET_BIT(DMAy->CH[ChNum].CTRL, DMA_CHNCTRL_LLPDSTEN); + break; + + case DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_LINKED_DSTADR_CONTIGUOUS: + SET_BIT(DMAy->CH[ChNum].CTRL, DMA_CHNCTRL_LLPSRCEN); + break; + + case DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_LINKED_DSTADR_RELOAD: + SET_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_ADR); + SET_BIT(DMAy->CH[ChNum].CTRL, DMA_CHNCTRL_LLPSRCEN); + break; + + case DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_LINKED_DSTADR_LINKED: + SET_BIT(DMAy->CH[ChNum].CTRL, (DMA_CHNCTRL_LLPSRCEN | DMA_CHNCTRL_LLPDSTEN)); + break; + + default: + break; + } + + RetStatus = DMA_CH_STS_OK; + } + else + { + RetStatus = DMA_CH_STS_BUSY; + } + } + else + { + RetStatus = DMA_CH_STS_ERROR; + } + + return RetStatus; +} + +/** +*\*\name DMA_ChannelStructInit. +*\*\fun Initializes the structure parameter of type DMA_ChInitType used to +*\*\ initialize DMA. This function is usually called before initializing +*\*\ a parameter of type DMA_ChInitType. +*\*\param DMA_ChInitParam : +*\*\ - Pointer to the DMA_ChInitType structure which will be initialized. +*\*\return none +**/ +void DMA_ChannelStructInit(DMA_ChInitType *const DMA_ChInitParam) +{ + DMA_ChInitParam->IntEn = true; + DMA_ChInitParam->DstTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + DMA_ChInitParam->SrcTfrWidth = DMA_CH_TRANSFER_WIDTH_8; + DMA_ChInitParam->DstAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_INCREMENT; + DMA_ChInitParam->SrcAddrCountMode = DMA_CH_ADDRESS_COUNT_MODE_INCREMENT; + DMA_ChInitParam->DstBurstLen = DMA_CH_BURST_LENGTH_4; + DMA_ChInitParam->SrcBurstLen = DMA_CH_BURST_LENGTH_4; + DMA_ChInitParam->SrcGatherEn = false; + DMA_ChInitParam->DstScatterEn = false; + DMA_ChInitParam->DstMasterSelect = DMA_CH_AHB_MASTER_1; + DMA_ChInitParam->SrcMasterSelect = DMA_CH_AHB_MASTER_1; + DMA_ChInitParam->TfrTypeFlowCtrl = DMA_CH_TRANSFER_FLOW_P2P_DMA; + DMA_ChInitParam->BlkTfrSize = 0x2U; + DMA_ChInitParam->SrcAddr = 0x0U; + DMA_ChInitParam->DstAddr = 0x0U; + DMA_ChInitParam->pLinkListItem = NULL; + DMA_ChInitParam->SrcGatherInterval = 0x0U; + DMA_ChInitParam->SrcGatherCount = 0x0U; + DMA_ChInitParam->DstScatterInterval = 0x0U; + DMA_ChInitParam->DstScatterCount = 0x0U; + DMA_ChInitParam->TfrType = DMA_CH_TRANSFER_TYPE_SINGLE_BLOCK; + DMA_ChInitParam->ChannelPriority = DMA_CH_PRIORITY_0; + DMA_ChInitParam->SrcHandshaking = DMA_CH_SRC_HANDSHAKING_SOFTWARE; + DMA_ChInitParam->SrcHsInterface = DMA_CH_HARDWARE_HANDSHAKING_IF_0; + DMA_ChInitParam->SrcHsInterfacePol = DMA_CH_HANDSHAKING_IF_POL_H; + DMA_ChInitParam->DstHandshaking = DMA_CH_DST_HANDSHAKING_SOFTWARE; + DMA_ChInitParam->DstHsInterface = DMA_CH_HARDWARE_HANDSHAKING_IF_0; + DMA_ChInitParam->DstHsInterfacePol = DMA_CH_HANDSHAKING_IF_POL_H; +} + +/** +*\*\name DMA_ChannelSuspend. +*\*\fun Suspend a DMA channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\return none +**/ +void DMA_ChannelSuspend(DMA_Module *const DMAy, DMA_ChNumType ChNum) +{ + /* Sets the CHSUSP bit of the CHnCFG register */ + SET_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_CHSUSP); +} + +/** +*\*\name DMA_ChannelIsSuspended. +*\*\fun Check whether a DMA channel suspended. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\return true or false +**/ +bool DMA_ChannelIsSuspended(DMA_Module *const DMAy, DMA_ChNumType ChNum) +{ + bool ret; + ret = READ_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_CHSUSP) ? true : false; + return ret; +} + +/** +*\*\name DMA_ChannelResume. +*\*\fun Resume a DMA channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\return none +**/ +void DMA_ChannelResume(DMA_Module *const DMAy, DMA_ChNumType ChNum) +{ + /* Clear the CHSUSP bit of the CHnCFG register */ + CLEAR_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_CHSUSP); +} + +/** +*\*\name DMA_ChannelEventCmd. +*\*\fun Enable or disable a DMA event. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Event (The input parameter must be one or more of the following values (logical OR)): +*\*\ - DMA_CH_EVENT_TRANSFER_COMPLETE +*\*\ - DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE +*\*\ - DMA_CH_EVENT_SRC_TRANSACTION_COMPLETE +*\*\ - DMA_CH_EVENT_DST_TRANSACTION_COMPLETE +*\*\ - DMA_CH_EVENT_ERROR +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DMA_ChannelEventCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t Event, FunctionalStatus Cmd) +{ + uint32_t TempIndex; + __IO uint32_t *pIntMaskRegBase = &DMAy->TCINTMSK; + + if (Cmd != DISABLE) + { + /* Enable the DMA Channel Interrupt Event */ + for (TempIndex = 0U; TempIndex < DMA_EVENT_MAX; TempIndex++) + { + if (Event & ((uint32_t)0x1U << TempIndex)) + { + WRITE_REG(*(pIntMaskRegBase + (TempIndex * 2U)), ((uint32_t)DMA_INT_UNMASK << ChNum)); + } + } + } + else + { + /* Disable the DMA Channel Interrupt Event */ + for (TempIndex = 0U; TempIndex < DMA_EVENT_MAX; TempIndex++) + { + if (Event & ((uint32_t)0x1U << TempIndex)) + { + WRITE_REG(*(pIntMaskRegBase + (TempIndex * 2U)), ((uint32_t)DMA_INT_MASK << ChNum)); + } + } + } +} + +/** +*\*\name DMA_ClearChannelEventStatus. +*\*\fun Clear a DMA channel event status. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Event (The input parameter must be one or more of the following values (logical OR)): +*\*\ - DMA_CH_EVENT_TRANSFER_COMPLETE +*\*\ - DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE +*\*\ - DMA_CH_EVENT_SRC_TRANSACTION_COMPLETE +*\*\ - DMA_CH_EVENT_DST_TRANSACTION_COMPLETE +*\*\ - DMA_CH_EVENT_ERROR +*\*\return none +**/ +void DMA_ClearChannelEventStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t Event) +{ + uint32_t TempIndex; + __IO uint32_t *pIntClearRegBase = &DMAy->TCINTCLR; + + /* Clear the DMA Channel Interrupt Event */ + for (TempIndex = 0U; TempIndex < DMA_EVENT_MAX; TempIndex++) + { + if (Event & ((uint32_t)0x1U << TempIndex)) + { + WRITE_REG(*(pIntClearRegBase + (TempIndex * 2U)), ((uint32_t)0x1U << ChNum)); + } + } +} + +/** +*\*\name DMA_GetCombinedStatus. +*\*\fun Get a DMA combined interrupt status. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\return DMA_INTCBESTS register value +**/ +uint8_t DMA_GetCombinedStatus(DMA_Module *const DMAy) +{ + return (uint8_t)(READ_REG(DMAy->INTCBESTS) & 0x1FU); +} + +/** +*\*\name DMA_GetChannelIntTfrStatus. +*\*\fun Gets the IntTfr interrupt event status for the specified channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\return SET or RESET +**/ +INTStatus DMA_GetChannelIntTfrStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum) +{ + INTStatus RetStatus = RESET; + + /* Read the interrupt status of the corresponding register */ + if (READ_BIT(DMAy->TCINTSTS, (DMA_EVENT_TRANSFER_COMPLETE << ChNum)) != (uint32_t)RESET) + { + /* This status of the channel is SET */ + RetStatus = SET; + } + else + { + /* This status of the channel is RESET */ + RetStatus = RESET; + } + + /* Return status */ + return RetStatus; +} + +/** +*\*\name DMA_GetChannelIntBlockStatus. +*\*\fun Gets the IntBlock interrupt event status for the specified channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\return SET or RESET +**/ +INTStatus DMA_GetChannelIntBlockStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum) +{ + INTStatus RetStatus = RESET; + + /* Read the interrupt status of the corresponding register */ + if (READ_BIT(DMAy->BTCINTSTS, (DMA_EVENT_BLOCK_TRANSFER_COMPLETE << ChNum)) != (uint32_t)RESET) + { + /* This status of the channel is SET */ + RetStatus = SET; + } + else + { + /* This status of the channel is RESET */ + RetStatus = RESET; + } + + /* Return status */ + return RetStatus; +} + +/** +*\*\name DMA_GetChannelIntSrcTranStatus. +*\*\fun Gets the IntSrcTran interrupt event status for the specified channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\return SET or RESET +**/ +INTStatus DMA_GetChannelIntSrcTranStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum) +{ + INTStatus RetStatus = RESET; + + /* Read the interrupt status of the corresponding register */ + if (READ_BIT(DMAy->STCINTSTS, (DMA_EVENT_SRC_TRANSACTION_COMPLETE << ChNum)) != (uint32_t)RESET) + { + /* This status of the channel is SET */ + RetStatus = SET; + } + else + { + /* This status of the channel is RESET */ + RetStatus = RESET; + } + + /* Return status */ + return RetStatus; +} + +/** +*\*\name DMA_GetChannelIntDstTranStatus. +*\*\fun Gets the IntDstTran interrupt event status for the specified channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\return SET or RESET +**/ +INTStatus DMA_GetChannelIntDstTranStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum) +{ + INTStatus RetStatus = RESET; + + /* Read the interrupt status of the corresponding register */ + if (READ_BIT(DMAy->DTCINTSTS, (DMA_EVENT_DST_TRANSACTION_COMPLETE << ChNum)) != (uint32_t)RESET) + { + /* This status of the channel is SET */ + RetStatus = SET; + } + else + { + /* This status of the channel is RESET */ + RetStatus = RESET; + } + + /* Return status */ + return RetStatus; +} + +/** +*\*\name DMA_GetChannelIntErrStatus. +*\*\fun Gets the IntErr interrupt event status for the specified channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\return SET or RESET +**/ +INTStatus DMA_GetChannelIntErrStatus(DMA_Module *const DMAy, DMA_ChNumType ChNum) +{ + INTStatus RetStatus = RESET; + + /* Read the interrupt status of the corresponding register */ + if (READ_BIT(DMAy->ERRINTSTS, (DMA_EVENT_ERROR << ChNum)) != (uint32_t)RESET) + { + /* This status of the channel is SET */ + RetStatus = SET; + } + else + { + /* This status of the channel is RESET */ + RetStatus = RESET; + } + + /* Return status */ + return RetStatus; +} + +/** +*\*\name DMA_ChannelSourceGatherCmd. +*\*\fun Enable or disable a DMA Channel source gather. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DMA_ChannelSourceGatherCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the Source gather */ + SET_BIT(DMAy->CH[ChNum].CTRL, DMA_CHNCTRL_SRCGATEN); + } + else + { + /* Disable the Source gather */ + CLEAR_BIT(DMAy->CH[ChNum].CTRL, DMA_CHNCTRL_SRCGATEN); + } +} + +/** +*\*\name DMA_SetChannelSourceGather. +*\*\fun Sets the source gather interval and count of the specified channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Interval: +*\*\ - Source Gather Interval (0~0xFFFFF) +*\*\param Count: +*\*\ - Source contiguous transfer count between successive gather boundaries (0~0x1FF) +*\*\return none +**/ +void DMA_SetChannelSourceGather(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t Interval, uint16_t Count) +{ + WRITE_REG(DMAy->CH[ChNum].SG, (Interval | (Count << 20U))); +} + +/** +*\*\name DMA_ChannelDestinationScatterCmd. +*\*\fun Enable or disable a DMA Channel destination scatter. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DMA_ChannelDestinationScatterCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the destination scatter */ + SET_BIT(DMAy->CH[ChNum].CTRL, DMA_CHNCTRL_DSTSCAEN); + } + else + { + /* Disable the destination scatter */ + CLEAR_BIT(DMAy->CH[ChNum].CTRL, DMA_CHNCTRL_DSTSCAEN); + } +} + +/** +*\*\name DMA_SetChannelDestinationScatter. +*\*\fun Sets the destination scatter interval and count of the specified channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Interval: +*\*\ - Destination scatter Interval (0~0xFFFFF) +*\*\param Count: +*\*\ - Destination contiguous transfer count between successive scatter boundaries (0~0x1FF) +*\*\return none +**/ +void DMA_SetChannelDestinationScatter(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t Interval, uint16_t Count) +{ + WRITE_REG(DMAy->CH[ChNum].DS, (Interval | (Count << 20U))); +} + +/** +*\*\name DMA_SetChannelSourceAddress. +*\*\fun Sets the source address of the specified channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param pAddr: +*\*\ - Pointer to source address +*\*\return none +**/ +void DMA_SetChannelSourceAddress(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t *pAddr) +{ + WRITE_REG(DMAy->CH[ChNum].SA, (uint32_t)pAddr); +} + +/** +*\*\name DMA_SetChannelDestinationAddress. +*\*\fun Sets the destination address of the specified channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param pAddr: +*\*\ - Pointer to destination address +*\*\return none +**/ +void DMA_SetChannelDestinationAddress(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t *pAddr) +{ + WRITE_REG(DMAy->CH[ChNum].DA, (uint32_t)pAddr); +} + +/** +*\*\name DMA_SetChannelBlockSize. +*\*\fun Sets the block transfer size of the specified channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Size: +*\*\ - The transferred size +*\*\return none +**/ +void DMA_SetChannelBlockSize(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint32_t Size) +{ + MODIFY_REG(DMAy->CH[ChNum].CTRL, DMA_CHNCTRL_BTS, ((uint64_t)Size << 32U)); +} + +/** +*\*\name DMA_GetTransferredNumber. +*\*\fun Gets the number of data that has been transmitted by the current channel. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\return Number of data sent +**/ +uint16_t DMA_GetTransferredNumber(DMA_Module *const DMAy, DMA_ChNumType ChNum) +{ + return (uint16_t)(READ_BIT(DMAy->CH[ChNum].CTRL, DMA_CHNCTRL_BTS) >> 32U); +} + +/** +*\*\name DMA_SetChannelLinkedListPointer. +*\*\fun Sets linked list pointer function. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param pStr: +*\*\ - Pointer to DMA linked list item structure +*\*\return none +**/ +void DMA_SetChannelLinkedListPointer(DMA_Module *const DMAy, DMA_ChNumType ChNum, DMA_LinkListItemType* pStr) +{ + WRITE_REG(DMAy->CH[ChNum].LLP, (uint32_t)pStr); +} + +/** +*\*\name DMA_TriggerSourceRequest. +*\*\fun Trigger a software source handshake request. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Type (The input parameters must be the following values): +*\*\ - DMA_CH_TRANSACTION_TYPE_SINGLE +*\*\ - DMA_CH_TRANSACTION_TYPE_BURST +*\*\param isLast: +*\*\ - true or false +*\*\return none +**/ +void DMA_TriggerSourceRequest(DMA_Module *const DMAy, DMA_ChNumType ChNum, DMA_ChTransacType Type, bool isLast) +{ + if (Type == DMA_CH_TRANSACTION_TYPE_SINGLE) + { + /* Enable Channel n Source Single Transaction Request */ + WRITE_REG(DMAy->SRCSGTREQ, (DMA_SSTR_ENABLE << ChNum)); + } + + if (isLast == true) + { + /* Enable Channel n Source Last Transaction Request */ + WRITE_REG(DMAy->SRCLTREQ, (DMA_SLTR_ENABLE << ChNum)); + } + + /* Enable Channel n Source Transaction Request */ + WRITE_REG(DMAy->SRCSWTREQ, (DMA_STR_ENABLE << ChNum)); +} + +/** +*\*\name DMA_TriggerDestinationRequest. +*\*\fun Trigger a software Destination handshake request. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Type (The input parameters must be the following values): +*\*\ - DMA_CH_TRANSACTION_TYPE_SINGLE +*\*\ - DMA_CH_TRANSACTION_TYPE_BURST +*\*\param isLast: +*\*\ - true or false +*\*\return none +**/ +void DMA_TriggerDestinationRequest(DMA_Module *const DMAy, DMA_ChNumType ChNum, DMA_ChTransacType Type, bool isLast) +{ + if (Type == DMA_CH_TRANSACTION_TYPE_SINGLE) + { + /* Enable Channel n Destination Single Transaction Request */ + WRITE_REG(DMAy->DSTSGTREQ, (DMA_DSTR_ENABLE << ChNum)); + } + + if (isLast == true) + { + /* Enable Channel n Destination Last Transaction Request */ + WRITE_REG(DMAy->DSTLTREQ, (DMA_DLTR_ENABLE << ChNum)); + } + + /* Enable Channel n Destination Transaction Request */ + WRITE_REG(DMAy->DSTSWTREQ, (DMA_DTR_ENABLE << ChNum)); +} + +/** +*\*\name DMA_ChannelSourceAddressReloadCmd. +*\*\fun Enable or disable a DMA Channel source address reload. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DMA_ChannelSourceAddressReloadCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the Automatic Source Reload */ + SET_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_ASR); + } + else + { + /* Disable the Automatic Source Reload */ + CLEAR_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_ASR); + } +} + +/** +*\*\name DMA_ChannelDestinationAddressReloadCmd. +*\*\fun Enable or disable a DMA Channel destination address reload. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DMA_ChannelDestinationAddressReloadCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the Automatic Destination Reload */ + SET_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_ADR); + } + else + { + /* Disable the Automatic Destination Reload */ + CLEAR_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_ADR); + } +} + +/** +*\*\name DMA_ChannelBusLockCmd. +*\*\fun Enable or disable a DMA Channel bus lock. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DMA_ChannelBusLockCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the DMA Channel bus lock */ + SET_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_LOCKB); + } + else + { + /* Disable the DMA Channel bus lock */ + CLEAR_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_LOCKB); + } +} + +/** +*\*\name DMA_ChannelLockCmd. +*\*\fun Enable or disable a DMA Channel lock. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DMA_ChannelLockCmd(DMA_Module *const DMAy, DMA_ChNumType ChNum, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the DMA Channel lock */ + SET_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_LOCKCH); + } + else + { + /* Disable the DMA Channel lock */ + CLEAR_BIT(DMAy->CH[ChNum].CFG, DMA_CHNCFG_LOCKCH); + } +} + +/** +*\*\name DMA_SetChannelBusLockLevel. +*\*\fun Set DMA Channel bus lock level. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Level (The input parameters must be the following values): +*\*\ - DMA_CH_BUS_LOCK_LEVEL_OCDMATFR +*\*\ - DMA_CH_BUS_LOCK_LEVEL_OCDMABLKTFR +*\*\ - DMA_CH_BUS_LOCK_LEVEL_OCDMATRAN +*\*\return none +**/ +void DMA_SetChannelBusLockLevel(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint64_t Level) +{ + /* Set the DMA Channel bus lock level */ + MODIFY_REG(DMAy->CH[ChNum].CFG, DMA_CHNCFG_LOCKBL, Level); +} + +/** +*\*\name DMA_SetChannelLockLevel. +*\*\fun Set DMA Channel lock level. +*\*\param DMAy (The input parameters must be the following values): +*\*\ - DMA1 +*\*\ - DMA2 +*\*\ - DMA3 +*\*\param ChNum (The input parameters must be the following values): +*\*\ - DMA_CHANNEL_0 +*\*\ - DMA_CHANNEL_1 +*\*\ - DMA_CHANNEL_2 +*\*\ - DMA_CHANNEL_3 +*\*\ - DMA_CHANNEL_4 +*\*\ - DMA_CHANNEL_5 +*\*\ - DMA_CHANNEL_6 +*\*\ - DMA_CHANNEL_7 +*\*\param Level (The input parameters must be the following values): +*\*\ - DMA_CH_LOCK_LEVEL_OCDMATFR +*\*\ - DMA_CH_LOCK_LEVEL_OCDMABLKTFR +*\*\ - DMA_CH_LOCK_LEVEL_OCDMATRAN +*\*\return none +**/ +void DMA_SetChannelLockLevel(DMA_Module *const DMAy, DMA_ChNumType ChNum, uint64_t Level) +{ + /* Set the DMA Channel lock level */ + MODIFY_REG(DMAy->CH[ChNum].CFG, DMA_CHNCFG_LOCKCHL, Level); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dmamux.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dmamux.c new file mode 100644 index 0000000000..180ba1e311 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dmamux.c @@ -0,0 +1,1899 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dmamux.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_dmamux.h" +#include "n32h76x_78x_rcc.h" + +/** +*\*\name DMAMUX_DeInit. +*\*\fun Reset the DMAMUX registers. +*\*\param DMAMUXx : +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\return none +**/ +void DMAMUX_DeInit(DMAMUX_ID DMAMUXx) +{ + if (DMAMUXx == DMAMUX1_ID) + { + RCC_EnableAHB1PeriphReset1(RCC_AHB1_PERIPHRST_DMAMUX1); + } + else if (DMAMUXx == DMAMUX2_ID) + { + RCC_EnableAXIPeriphReset1(RCC_AXI_PERIPHRST_DMAMUX2); + } + else + { + /*no process*/ + } +} + +/** +*\*\name DMAMUX_SetRequestID. +*\*\fun Set DMAMUX request ID for DMAMUX Channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\param Request (The input parameters must be the following values): +*\*\ - DMAMUX1_REQUEST_GENERATOR0 +*\*\ - DMAMUX1_REQUEST_GENERATOR1 +*\*\ - DMAMUX1_REQUEST_GENERATOR2 +*\*\ - DMAMUX1_REQUEST_GENERATOR3 +*\*\ - DMAMUX1_REQUEST_GENERATOR4 +*\*\ - DMAMUX1_REQUEST_GENERATOR5 +*\*\ - DMAMUX1_REQUEST_GENERATOR6 +*\*\ - DMAMUX1_REQUEST_GENERATOR7 +*\*\ - DMAMUX1_REQUEST_ADC1 +*\*\ - DMAMUX1_REQUEST_ADC2 +*\*\ - DMAMUX1_REQUEST_ADC3 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA0 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA1 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA2 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA3 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA4 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA5 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA6 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA0 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA1 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA2 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA3 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA4 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA5 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA6 +*\*\ - DMAMUX1_REQUEST_ATIM1_UP +*\*\ - DMAMUX1_REQUEST_ATIM1_CH1 +*\*\ - DMAMUX1_REQUEST_ATIM1_CH2 +*\*\ - DMAMUX1_REQUEST_ATIM1_CH3 +*\*\ - DMAMUX1_REQUEST_ATIM1_CH4 +*\*\ - DMAMUX1_REQUEST_ATIM1_TRIG +*\*\ - DMAMUX1_REQUEST_ATIM1_COM +*\*\ - DMAMUX1_REQUEST_ATIM2_UP +*\*\ - DMAMUX1_REQUEST_ATIM2_CH1 +*\*\ - DMAMUX1_REQUEST_ATIM2_CH2 +*\*\ - DMAMUX1_REQUEST_ATIM2_CH3 +*\*\ - DMAMUX1_REQUEST_ATIM2_CH4 +*\*\ - DMAMUX1_REQUEST_ATIM2_TRIG +*\*\ - DMAMUX1_REQUEST_ATIM2_COM +*\*\ - DMAMUX1_REQUEST_ATIM3_UP +*\*\ - DMAMUX1_REQUEST_ATIM3_CH1 +*\*\ - DMAMUX1_REQUEST_ATIM3_CH2 +*\*\ - DMAMUX1_REQUEST_ATIM3_CH3 +*\*\ - DMAMUX1_REQUEST_ATIM3_CH4 +*\*\ - DMAMUX1_REQUEST_ATIM3_TRIG +*\*\ - DMAMUX1_REQUEST_ATIM3_COM +*\*\ - DMAMUX1_REQUEST_ATIM4_UP +*\*\ - DMAMUX1_REQUEST_ATIM4_CH1 +*\*\ - DMAMUX1_REQUEST_ATIM4_CH2 +*\*\ - DMAMUX1_REQUEST_ATIM4_CH3 +*\*\ - DMAMUX1_REQUEST_ATIM4_CH4 +*\*\ - DMAMUX1_REQUEST_ATIM4_TRIG +*\*\ - DMAMUX1_REQUEST_ATIM4_COM +*\*\ - DMAMUX1_REQUEST_GTIMA1_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA1_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA1_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA1_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA1_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA1_UP +*\*\ - DMAMUX1_REQUEST_GTIMA2_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA2_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA2_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA2_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA2_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA2_UP +*\*\ - DMAMUX1_REQUEST_GTIMA3_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA3_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA3_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA3_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA3_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA3_UP +*\*\ - DMAMUX1_REQUEST_GTIMA4_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA4_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA4_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA4_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA4_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA4_UP +*\*\ - DMAMUX1_REQUEST_GTIMA5_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA5_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA5_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA5_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA5_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA5_UP +*\*\ - DMAMUX1_REQUEST_GTIMA6_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA6_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA6_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA6_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA6_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA6_UP +*\*\ - DMAMUX1_REQUEST_GTIMA7_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA7_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA7_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA7_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA7_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA7_UP +*\*\ - DMAMUX1_REQUEST_GTIMB1_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMB1_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMB1_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMB1_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMB1_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMB1_UP +*\*\ - DMAMUX1_REQUEST_GTIMB2_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMB2_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMB2_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMB2_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMB2_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMB2_UP +*\*\ - DMAMUX1_REQUEST_GTIMB3_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMB3_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMB3_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMB3_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMB3_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMB3_UP +*\*\ - DMAMUX1_REQUEST_I2C1_RX +*\*\ - DMAMUX1_REQUEST_I2C1_TX +*\*\ - DMAMUX1_REQUEST_I2C2_RX +*\*\ - DMAMUX1_REQUEST_I2C2_TX +*\*\ - DMAMUX1_REQUEST_I2C3_RX +*\*\ - DMAMUX1_REQUEST_I2C3_TX +*\*\ - DMAMUX1_REQUEST_I2C4_RX +*\*\ - DMAMUX1_REQUEST_I2C4_TX +*\*\ - DMAMUX1_REQUEST_I2C5_RX +*\*\ - DMAMUX1_REQUEST_I2C5_TX +*\*\ - DMAMUX1_REQUEST_I2C6_RX +*\*\ - DMAMUX1_REQUEST_I2C6_TX +*\*\ - DMAMUX1_REQUEST_I2C7_RX +*\*\ - DMAMUX1_REQUEST_I2C7_TX +*\*\ - DMAMUX1_REQUEST_I2C8_RX +*\*\ - DMAMUX1_REQUEST_I2C8_TX +*\*\ - DMAMUX1_REQUEST_I2C9_RX +*\*\ - DMAMUX1_REQUEST_I2C9_TX +*\*\ - DMAMUX1_REQUEST_I2C10_RX +*\*\ - DMAMUX1_REQUEST_I2C10_TX +*\*\ - DMAMUX1_REQUEST_USART1_RX +*\*\ - DMAMUX1_REQUEST_USART1_TX +*\*\ - DMAMUX1_REQUEST_USART2_RX +*\*\ - DMAMUX1_REQUEST_USART2_TX +*\*\ - DMAMUX1_REQUEST_USART3_RX +*\*\ - DMAMUX1_REQUEST_USART3_TX +*\*\ - DMAMUX1_REQUEST_USART4_RX +*\*\ - DMAMUX1_REQUEST_USART4_TX +*\*\ - DMAMUX1_REQUEST_USART5_RX +*\*\ - DMAMUX1_REQUEST_USART5_TX +*\*\ - DMAMUX1_REQUEST_USART6_RX +*\*\ - DMAMUX1_REQUEST_USART6_TX +*\*\ - DMAMUX1_REQUEST_USART7_RX +*\*\ - DMAMUX1_REQUEST_USART7_TX +*\*\ - DMAMUX1_REQUEST_USART8_RX +*\*\ - DMAMUX1_REQUEST_USART8_TX +*\*\ - DMAMUX1_REQUEST_UART9_RX +*\*\ - DMAMUX1_REQUEST_UART9_TX +*\*\ - DMAMUX1_REQUEST_UART10_RX +*\*\ - DMAMUX1_REQUEST_UART10_TX +*\*\ - DMAMUX1_REQUEST_UART11_RX +*\*\ - DMAMUX1_REQUEST_UART11_TX +*\*\ - DMAMUX1_REQUEST_UART12_RX +*\*\ - DMAMUX1_REQUEST_UART12_TX +*\*\ - DMAMUX1_REQUEST_UART13_RX +*\*\ - DMAMUX1_REQUEST_UART13_TX +*\*\ - DMAMUX1_REQUEST_UART14_RX +*\*\ - DMAMUX1_REQUEST_UART14_TX +*\*\ - DMAMUX1_REQUEST_UART15_RX +*\*\ - DMAMUX1_REQUEST_UART15_TX +*\*\ - DMAMUX1_REQUEST_SPI1_RX +*\*\ - DMAMUX1_REQUEST_SPI1_TX +*\*\ - DMAMUX1_REQUEST_SPI2_RX +*\*\ - DMAMUX1_REQUEST_SPI2_TX +*\*\ - DMAMUX1_REQUEST_SPI3_RX +*\*\ - DMAMUX1_REQUEST_SPI3_TX +*\*\ - DMAMUX1_REQUEST_SPI4_RX +*\*\ - DMAMUX1_REQUEST_SPI4_TX +*\*\ - DMAMUX1_REQUEST_SPI5_RX +*\*\ - DMAMUX1_REQUEST_SPI5_TX +*\*\ - DMAMUX1_REQUEST_SPI6_RX +*\*\ - DMAMUX1_REQUEST_SPI6_TX +*\*\ - DMAMUX1_REQUEST_SPI7_RX +*\*\ - DMAMUX1_REQUEST_SPI7_TX +*\*\ - DMAMUX1_REQUEST_I2S1_RX +*\*\ - DMAMUX1_REQUEST_I2S1_TX +*\*\ - DMAMUX1_REQUEST_I2S2_RX +*\*\ - DMAMUX1_REQUEST_I2S2_TX +*\*\ - DMAMUX1_REQUEST_I2S3_RX +*\*\ - DMAMUX1_REQUEST_I2S3_TX +*\*\ - DMAMUX1_REQUEST_I2S4_RX +*\*\ - DMAMUX1_REQUEST_I2S4_TX +*\*\ - DMAMUX1_REQUEST_LPUART1_RX +*\*\ - DMAMUX1_REQUEST_LPUART1_TX +*\*\ - DMAMUX1_REQUEST_LPUART2_RX +*\*\ - DMAMUX1_REQUEST_LPUART2_TX +*\*\ - DMAMUX1_REQUEST_DAC1 +*\*\ - DMAMUX1_REQUEST_DAC2 +*\*\ - DMAMUX1_REQUEST_DSMU_CH1 +*\*\ - DMAMUX1_REQUEST_DSMU_CH2 +*\*\ - DMAMUX1_REQUEST_DSMU_CH3 +*\*\ - DMAMUX1_REQUEST_DSMU_CH4 +*\*\ - DMAMUX1_REQUEST_CANFD1 +*\*\ - DMAMUX1_REQUEST_CANFD2 +*\*\ - DMAMUX1_REQUEST_CANFD3 +*\*\ - DMAMUX1_REQUEST_CANFD4 +*\*\ - DMAMUX1_REQUEST_CANFD5 +*\*\ - DMAMUX1_REQUEST_CANFD6 +*\*\ - DMAMUX1_REQUEST_CANFD7 +*\*\ - DMAMUX1_REQUEST_CANFD8 +*\*\ - DMAMUX1_REQUEST_CORDIC_READ +*\*\ - DMAMUX1_REQUEST_CORDIC_WRITE +*\*\ - DMAMUX1_REQUEST_FMAC_READ +*\*\ - DMAMUX1_REQUEST_FMAC_WRITE +*\*\ - DMAMUX1_REQUEST_BTIM1 +*\*\ - DMAMUX1_REQUEST_BTIM2 +*\*\ - DMAMUX1_REQUEST_BTIM3 +*\*\ - DMAMUX1_REQUEST_BTIM4 +*\*\ - DMAMUX1_REQUEST_GTIMB1_COM +*\*\ - DMAMUX1_REQUEST_GTIMB2_COM +*\*\ - DMAMUX1_REQUEST_GTIMB3_COM +*\*\ - DMAMUX1_REQUEST_DAC3 +*\*\ - DMAMUX1_REQUEST_DAC4 +*\*\ - DMAMUX1_REQUEST_DAC5 +*\*\ - DMAMUX1_REQUEST_DAC6 +*\*\ - DMAMUX2_REQUEST_GENERATOR0 +*\*\ - DMAMUX2_REQUEST_GENERATOR1 +*\*\ - DMAMUX2_REQUEST_GENERATOR2 +*\*\ - DMAMUX2_REQUEST_GENERATOR3 +*\*\ - DMAMUX2_REQUEST_GENERATOR4 +*\*\ - DMAMUX2_REQUEST_GENERATOR5 +*\*\ - DMAMUX2_REQUEST_GENERATOR6 +*\*\ - DMAMUX2_REQUEST_GENERATOR7 +*\*\ - DMAMUX2_REQUEST_GENERATOR8 +*\*\ - DMAMUX2_REQUEST_GENERATOR9 +*\*\ - DMAMUX2_REQUEST_GENERATOR10 +*\*\ - DMAMUX2_REQUEST_GENERATOR11 +*\*\ - DMAMUX2_REQUEST_GENERATOR12 +*\*\ - DMAMUX2_REQUEST_GENERATOR13 +*\*\ - DMAMUX2_REQUEST_GENERATOR14 +*\*\ - DMAMUX2_REQUEST_GENERATOR15 +*\*\ - DMAMUX2_REQUEST_REQ_XSPI1_RX +*\*\ - DMAMUX2_REQUEST_REQ_XSPI1_TX +*\*\ - DMAMUX2_REQUEST_REQ_XSPI2_RX +*\*\ - DMAMUX2_REQUEST_REQ_XSPI2_TX +*\*\note DMAMUX1 channel 0 to 7 are mapped to DMA1 channel 0 to 7. +*\*\ DMAMUX1 channel 8 to 15 are mapped to DMA2 channel 0 to 7. +*\*\ DMAMUX1 channel 16 to 23 are mapped to DMA3 channel 0 to 7. +*\*\ DMAMUX2 channel 0 to 15 are mapped to MDMA channel 0 to 15. +*\*\return none +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +void DMAMUX_SetRequestID(DMAMUX_ID DMAMUXx, uint32_t Channel, uint32_t Request) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + tempreg &= (~DMAMUX_REQUEST_ID_MASK); + tempreg |= (Request); + ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL = tempreg; + } + else + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + tempreg &= (~DMAMUX_REQUEST_ID_MASK); + tempreg |= (Request); + ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL = tempreg; + } +} + +/** +*\*\name DMAMUX_GetRequestID. +*\*\fun Get DMAMUX request ID for DMAMUX Channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\return (Returned value can be one of the following values); +*\*\ - DMAMUX1_REQUEST_GENERATOR0 +*\*\ - DMAMUX1_REQUEST_GENERATOR1 +*\*\ - DMAMUX1_REQUEST_GENERATOR2 +*\*\ - DMAMUX1_REQUEST_GENERATOR3 +*\*\ - DMAMUX1_REQUEST_GENERATOR4 +*\*\ - DMAMUX1_REQUEST_GENERATOR5 +*\*\ - DMAMUX1_REQUEST_GENERATOR6 +*\*\ - DMAMUX1_REQUEST_GENERATOR7 +*\*\ - DMAMUX1_REQUEST_ADC1 +*\*\ - DMAMUX1_REQUEST_ADC2 +*\*\ - DMAMUX1_REQUEST_ADC3 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA0 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA1 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA2 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA3 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA4 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA5 +*\*\ - DMAMUX1_REQUEST_SHRTIM1_DMA6 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA0 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA1 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA2 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA3 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA4 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA5 +*\*\ - DMAMUX1_REQUEST_SHRTIM2_DMA6 +*\*\ - DMAMUX1_REQUEST_ATIM1_UP +*\*\ - DMAMUX1_REQUEST_ATIM1_CH1 +*\*\ - DMAMUX1_REQUEST_ATIM1_CH2 +*\*\ - DMAMUX1_REQUEST_ATIM1_CH3 +*\*\ - DMAMUX1_REQUEST_ATIM1_CH4 +*\*\ - DMAMUX1_REQUEST_ATIM1_TRIG +*\*\ - DMAMUX1_REQUEST_ATIM1_COM +*\*\ - DMAMUX1_REQUEST_ATIM2_UP +*\*\ - DMAMUX1_REQUEST_ATIM2_CH1 +*\*\ - DMAMUX1_REQUEST_ATIM2_CH2 +*\*\ - DMAMUX1_REQUEST_ATIM2_CH3 +*\*\ - DMAMUX1_REQUEST_ATIM2_CH4 +*\*\ - DMAMUX1_REQUEST_ATIM2_TRIG +*\*\ - DMAMUX1_REQUEST_ATIM2_COM +*\*\ - DMAMUX1_REQUEST_ATIM3_UP +*\*\ - DMAMUX1_REQUEST_ATIM3_CH1 +*\*\ - DMAMUX1_REQUEST_ATIM3_CH2 +*\*\ - DMAMUX1_REQUEST_ATIM3_CH3 +*\*\ - DMAMUX1_REQUEST_ATIM3_CH4 +*\*\ - DMAMUX1_REQUEST_ATIM3_TRIG +*\*\ - DMAMUX1_REQUEST_ATIM3_COM +*\*\ - DMAMUX1_REQUEST_ATIM4_UP +*\*\ - DMAMUX1_REQUEST_ATIM4_CH1 +*\*\ - DMAMUX1_REQUEST_ATIM4_CH2 +*\*\ - DMAMUX1_REQUEST_ATIM4_CH3 +*\*\ - DMAMUX1_REQUEST_ATIM4_CH4 +*\*\ - DMAMUX1_REQUEST_ATIM4_TRIG +*\*\ - DMAMUX1_REQUEST_ATIM4_COM +*\*\ - DMAMUX1_REQUEST_GTIMA1_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA1_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA1_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA1_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA1_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA1_UP +*\*\ - DMAMUX1_REQUEST_GTIMA2_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA2_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA2_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA2_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA2_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA2_UP +*\*\ - DMAMUX1_REQUEST_GTIMA3_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA3_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA3_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA3_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA3_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA3_UP +*\*\ - DMAMUX1_REQUEST_GTIMA4_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA4_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA4_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA4_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA4_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA4_UP +*\*\ - DMAMUX1_REQUEST_GTIMA5_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA5_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA5_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA5_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA5_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA5_UP +*\*\ - DMAMUX1_REQUEST_GTIMA6_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA6_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA6_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA6_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA6_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA6_UP +*\*\ - DMAMUX1_REQUEST_GTIMA7_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMA7_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMA7_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMA7_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMA7_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMA7_UP +*\*\ - DMAMUX1_REQUEST_GTIMB1_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMB1_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMB1_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMB1_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMB1_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMB1_UP +*\*\ - DMAMUX1_REQUEST_GTIMB2_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMB2_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMB2_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMB2_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMB2_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMB2_UP +*\*\ - DMAMUX1_REQUEST_GTIMB3_CH1 +*\*\ - DMAMUX1_REQUEST_GTIMB3_CH2 +*\*\ - DMAMUX1_REQUEST_GTIMB3_CH3 +*\*\ - DMAMUX1_REQUEST_GTIMB3_CH4 +*\*\ - DMAMUX1_REQUEST_GTIMB3_TRIG +*\*\ - DMAMUX1_REQUEST_GTIMB3_UP +*\*\ - DMAMUX1_REQUEST_I2C1_RX +*\*\ - DMAMUX1_REQUEST_I2C1_TX +*\*\ - DMAMUX1_REQUEST_I2C2_RX +*\*\ - DMAMUX1_REQUEST_I2C2_TX +*\*\ - DMAMUX1_REQUEST_I2C3_RX +*\*\ - DMAMUX1_REQUEST_I2C3_TX +*\*\ - DMAMUX1_REQUEST_I2C4_RX +*\*\ - DMAMUX1_REQUEST_I2C4_TX +*\*\ - DMAMUX1_REQUEST_I2C5_RX +*\*\ - DMAMUX1_REQUEST_I2C5_TX +*\*\ - DMAMUX1_REQUEST_I2C6_RX +*\*\ - DMAMUX1_REQUEST_I2C6_TX +*\*\ - DMAMUX1_REQUEST_I2C7_RX +*\*\ - DMAMUX1_REQUEST_I2C7_TX +*\*\ - DMAMUX1_REQUEST_I2C8_RX +*\*\ - DMAMUX1_REQUEST_I2C8_TX +*\*\ - DMAMUX1_REQUEST_I2C9_RX +*\*\ - DMAMUX1_REQUEST_I2C9_TX +*\*\ - DMAMUX1_REQUEST_I2C10_RX +*\*\ - DMAMUX1_REQUEST_I2C10_TX +*\*\ - DMAMUX1_REQUEST_USART1_RX +*\*\ - DMAMUX1_REQUEST_USART1_TX +*\*\ - DMAMUX1_REQUEST_USART2_RX +*\*\ - DMAMUX1_REQUEST_USART2_TX +*\*\ - DMAMUX1_REQUEST_USART3_RX +*\*\ - DMAMUX1_REQUEST_USART3_TX +*\*\ - DMAMUX1_REQUEST_USART4_RX +*\*\ - DMAMUX1_REQUEST_USART4_TX +*\*\ - DMAMUX1_REQUEST_USART5_RX +*\*\ - DMAMUX1_REQUEST_USART5_TX +*\*\ - DMAMUX1_REQUEST_USART6_RX +*\*\ - DMAMUX1_REQUEST_USART6_TX +*\*\ - DMAMUX1_REQUEST_USART7_RX +*\*\ - DMAMUX1_REQUEST_USART7_TX +*\*\ - DMAMUX1_REQUEST_USART8_RX +*\*\ - DMAMUX1_REQUEST_USART8_TX +*\*\ - DMAMUX1_REQUEST_UART9_RX +*\*\ - DMAMUX1_REQUEST_UART9_TX +*\*\ - DMAMUX1_REQUEST_UART10_RX +*\*\ - DMAMUX1_REQUEST_UART10_TX +*\*\ - DMAMUX1_REQUEST_UART11_RX +*\*\ - DMAMUX1_REQUEST_UART11_TX +*\*\ - DMAMUX1_REQUEST_UART12_RX +*\*\ - DMAMUX1_REQUEST_UART12_TX +*\*\ - DMAMUX1_REQUEST_UART13_RX +*\*\ - DMAMUX1_REQUEST_UART13_TX +*\*\ - DMAMUX1_REQUEST_UART14_RX +*\*\ - DMAMUX1_REQUEST_UART14_TX +*\*\ - DMAMUX1_REQUEST_UART15_RX +*\*\ - DMAMUX1_REQUEST_UART15_TX +*\*\ - DMAMUX1_REQUEST_SPI1_RX +*\*\ - DMAMUX1_REQUEST_SPI1_TX +*\*\ - DMAMUX1_REQUEST_SPI2_RX +*\*\ - DMAMUX1_REQUEST_SPI2_TX +*\*\ - DMAMUX1_REQUEST_SPI3_RX +*\*\ - DMAMUX1_REQUEST_SPI3_TX +*\*\ - DMAMUX1_REQUEST_SPI4_RX +*\*\ - DMAMUX1_REQUEST_SPI4_TX +*\*\ - DMAMUX1_REQUEST_SPI5_RX +*\*\ - DMAMUX1_REQUEST_SPI5_TX +*\*\ - DMAMUX1_REQUEST_SPI6_RX +*\*\ - DMAMUX1_REQUEST_SPI6_TX +*\*\ - DMAMUX1_REQUEST_SPI7_RX +*\*\ - DMAMUX1_REQUEST_SPI7_TX +*\*\ - DMAMUX1_REQUEST_I2S1_RX +*\*\ - DMAMUX1_REQUEST_I2S1_TX +*\*\ - DMAMUX1_REQUEST_I2S2_RX +*\*\ - DMAMUX1_REQUEST_I2S2_TX +*\*\ - DMAMUX1_REQUEST_I2S3_RX +*\*\ - DMAMUX1_REQUEST_I2S3_TX +*\*\ - DMAMUX1_REQUEST_I2S4_RX +*\*\ - DMAMUX1_REQUEST_I2S4_TX +*\*\ - DMAMUX1_REQUEST_LPUART1_RX +*\*\ - DMAMUX1_REQUEST_LPUART1_TX +*\*\ - DMAMUX1_REQUEST_LPUART2_RX +*\*\ - DMAMUX1_REQUEST_LPUART2_TX +*\*\ - DMAMUX1_REQUEST_DAC1 +*\*\ - DMAMUX1_REQUEST_DAC2 +*\*\ - DMAMUX1_REQUEST_DSMU_CH1 +*\*\ - DMAMUX1_REQUEST_DSMU_CH2 +*\*\ - DMAMUX1_REQUEST_DSMU_CH3 +*\*\ - DMAMUX1_REQUEST_DSMU_CH4 +*\*\ - DMAMUX1_REQUEST_CANFD1 +*\*\ - DMAMUX1_REQUEST_CANFD2 +*\*\ - DMAMUX1_REQUEST_CANFD3 +*\*\ - DMAMUX1_REQUEST_CANFD4 +*\*\ - DMAMUX1_REQUEST_CANFD5 +*\*\ - DMAMUX1_REQUEST_CANFD6 +*\*\ - DMAMUX1_REQUEST_CANFD7 +*\*\ - DMAMUX1_REQUEST_CANFD8 +*\*\ - DMAMUX1_REQUEST_CORDIC_READ +*\*\ - DMAMUX1_REQUEST_CORDIC_WRITE +*\*\ - DMAMUX1_REQUEST_FMAC_READ +*\*\ - DMAMUX1_REQUEST_FMAC_WRITE +*\*\ - DMAMUX1_REQUEST_BTIM1 +*\*\ - DMAMUX1_REQUEST_BTIM2 +*\*\ - DMAMUX1_REQUEST_BTIM3 +*\*\ - DMAMUX1_REQUEST_BTIM4 +*\*\ - DMAMUX1_REQUEST_GTIMB1_COM +*\*\ - DMAMUX1_REQUEST_GTIMB2_COM +*\*\ - DMAMUX1_REQUEST_GTIMB3_COM +*\*\ - DMAMUX1_REQUEST_DAC3 +*\*\ - DMAMUX1_REQUEST_DAC4 +*\*\ - DMAMUX1_REQUEST_DAC5 +*\*\ - DMAMUX1_REQUEST_DAC6 +*\*\ - DMAMUX2_REQUEST_GENERATOR0 +*\*\ - DMAMUX2_REQUEST_GENERATOR1 +*\*\ - DMAMUX2_REQUEST_GENERATOR2 +*\*\ - DMAMUX2_REQUEST_GENERATOR3 +*\*\ - DMAMUX2_REQUEST_GENERATOR4 +*\*\ - DMAMUX2_REQUEST_GENERATOR5 +*\*\ - DMAMUX2_REQUEST_GENERATOR6 +*\*\ - DMAMUX2_REQUEST_GENERATOR7 +*\*\ - DMAMUX2_REQUEST_GENERATOR8 +*\*\ - DMAMUX2_REQUEST_GENERATOR9 +*\*\ - DMAMUX2_REQUEST_GENERATOR10 +*\*\ - DMAMUX2_REQUEST_GENERATOR11 +*\*\ - DMAMUX2_REQUEST_GENERATOR12 +*\*\ - DMAMUX2_REQUEST_GENERATOR13 +*\*\ - DMAMUX2_REQUEST_GENERATOR14 +*\*\ - DMAMUX2_REQUEST_GENERATOR15 +*\*\ - DMAMUX2_REQUEST_REQ_XSPI1_RX +*\*\ - DMAMUX2_REQUEST_REQ_XSPI1_TX +*\*\ - DMAMUX2_REQUEST_REQ_XSPI2_RX +*\*\ - DMAMUX2_REQUEST_REQ_XSPI2_TX +*\*\note DMAMUX1 channel 0 to 7 are mapped to DMA1 channel 0 to 7. +*\*\ DMAMUX1 channel 8 to 15 are mapped to DMA2 channel 0 to 7. +*\*\ DMAMUX1 channel 16 to 23 are mapped to DMA3 channel 0 to 7. +*\*\ DMAMUX2 channel 0 to 15 are mapped to MDMA channel 0 to 15. +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +uint32_t DMAMUX_GetRequestID(DMAMUX_ID DMAMUXx, uint32_t Channel) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + } + else + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + } + + return (uint32_t)(tempreg & DMAMUX_REQUEST_ID_MASK); +} + +/** +*\*\name DMAMUX_SetSyncID. +*\*\fun Set DMAMUX synchronization ID on DMAMUX Channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\param SyncID (The input parameters must be the following values): +*\*\ - DMAMUX1_SYNC_DMAMUX1_EVT0_7 +*\*\ - DMAMUX1_SYNC_DMAMUX1_EVT8_15 +*\*\ - DMAMUX1_SYNC_DMAMUX1_EVT16_23 +*\*\ - DMAMUX1_SYNC_LPTIM5_OUT +*\*\ - DMAMUX1_SYNC_LPTIM4_OUT +*\*\ - DMAMUX1_SYNC_LPTIM3_OUT +*\*\ - DMAMUX1_SYNC_LPTIM2_OUT +*\*\ - DMAMUX1_SYNC_LPTIM1_OUT +*\*\ - DMAMUX1_SYNC_EXTI0 +*\*\ - DMAMUX2_SYNC_INTERNAL_USED +*\*\return none +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +void DMAMUX_SetSyncID(DMAMUX_ID DMAMUXx, uint32_t Channel, uint32_t SyncID) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + tempreg &= (~DMAMUX_SYNC_ID_MASK); + tempreg |= (SyncID); + ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL = tempreg; + } + else + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + tempreg &= (~DMAMUX_SYNC_ID_MASK); + tempreg |= (SyncID); + ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL = tempreg; + } +} + +/** +*\*\name DMAMUX_GetSyncID. +*\*\fun Get DMAMUX synchronization ID on DMAMUX Channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\return (Returned value can be one of the following values): +*\*\ - DMAMUX1_SYNC_DMAMUX1_EVT0_7 +*\*\ - DMAMUX1_SYNC_DMAMUX1_EVT8_15 +*\*\ - DMAMUX1_SYNC_DMAMUX1_EVT16_23 +*\*\ - DMAMUX1_SYNC_LPTIM5_OUT +*\*\ - DMAMUX1_SYNC_LPTIM4_OUT +*\*\ - DMAMUX1_SYNC_LPTIM3_OUT +*\*\ - DMAMUX1_SYNC_LPTIM2_OUT +*\*\ - DMAMUX1_SYNC_LPTIM1_OUT +*\*\ - DMAMUX1_SYNC_EXTI0 +*\*\ - DMAMUX2_SYNC_INTERNAL_USED +*\*\return none +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +uint32_t DMAMUX_GetSyncID(DMAMUX_ID DMAMUXx, uint32_t Channel) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + } + else + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + } + + return (uint32_t)(tempreg & DMAMUX_SYNC_ID_MASK); +} + +/** +*\*\name DMAMUX_SetSyncRequestNumber. +*\*\fun Set the number of DMA request that will be autorized after a synchronization event and/or the number of DMA request needed to generate an event. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\param RequestNumber This parameter must be a value between Min_Data = 1 and Max_Data = 32. +*\*\return none +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +void DMAMUX_SetSyncRequestNumber(DMAMUX_ID DMAMUXx, uint32_t Channel, uint32_t RequestNumber) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + tempreg &= (~DMAMUX_REQ_NUMBER_MASK); + tempreg |= ((RequestNumber - 1) << DMAMUX_REQ_NUMBER_Pos); + ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL = tempreg; + } + else + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + tempreg &= (~DMAMUX_REQ_NUMBER_MASK); + tempreg |= ((RequestNumber - 1) << DMAMUX_REQ_NUMBER_Pos); + ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL = tempreg; + } +} + +/** +*\*\name DMAMUX_GetSyncRequestNumber. +*\*\fun Get the number of DMA request that will be autorized after a synchronization event and/or the number of DMA request needed to generate an event. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\return Between Min_Data = 1 and Max_Data = 32 +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +uint32_t DMAMUX_GetSyncRequestNumber(DMAMUX_ID DMAMUXx, uint32_t Channel) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + } + else + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + } + + return (uint32_t)(((tempreg & DMAMUX_REQ_NUMBER_MASK) >> DMAMUX_REQ_NUMBER_Pos) + 1); +} + +/** +*\*\name DMAMUX_SetSyncPolarity. +*\*\fun Set the polarity of the signal on which the DMA request is synchronized. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\param Polarity (The input parameters must be the following values). +*\*\ - DMAMUX_SYNC_NO_EVENT +*\*\ - DMAMUX_SYNC_POL_RISING +*\*\ - DMAMUX_SYNC_POL_FALLING +*\*\ - DMAMUX_SYNC_POL_RISING_FALLING +*\*\return none +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +void DMAMUX_SetSyncPolarity(DMAMUX_ID DMAMUXx, uint32_t Channel, uint32_t Polarity) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + tempreg &= (~DMAMUX_SYNC_POL_MASK); + tempreg |= (Polarity); + ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL = tempreg; + } + else + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + tempreg &= (~DMAMUX_SYNC_POL_MASK); + tempreg |= (Polarity); + ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL = tempreg; + } +} + +/** +*\*\name DMAMUX_GetSyncPolarity. +*\*\fun Get the polarity of the signal on which the DMA request is synchronized. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\return Returned value can be one of the following values: +*\*\ - DMAMUX_SYNC_NO_EVENT +*\*\ - DMAMUX_SYNC_POL_RISING +*\*\ - DMAMUX_SYNC_POL_FALLING +*\*\ - DMAMUX_SYNC_POL_RISING_FALLING +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +uint32_t DMAMUX_GetSyncPolarity(DMAMUX_ID DMAMUXx, uint32_t Channel) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + } + else + { + tempreg = ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL; + } + + return (uint32_t)(tempreg & DMAMUX_SYNC_POL_MASK); +} + +/** +*\*\name DMAMUX_EnableEventGeneration. +*\*\fun Enable or disable the Event Generation on DMAMUX channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +void DMAMUX_EnableEventGeneration(DMAMUX_ID DMAMUXx, uint32_t Channel, FunctionalState Cmd) +{ + if(DMAMUXx == DMAMUX1_ID) + { + if(Cmd == ENABLE) + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL |= DMAMUX_EVENT_GEN_MASK; + } + else + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL &= (~DMAMUX_EVENT_GEN_MASK); + } + } + else + { + if(Cmd == ENABLE) + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL |= DMAMUX_EVENT_GEN_MASK; + } + else + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL &= (~DMAMUX_EVENT_GEN_MASK); + } + } +} + +/** +*\*\name DMAMUX_EnableSync. +*\*\fun Enable or disable the synchronization mode on DMAMUX channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +void DMAMUX_EnableSync(DMAMUX_ID DMAMUXx, uint32_t Channel, FunctionalState Cmd) +{ + if(DMAMUXx == DMAMUX1_ID) + { + if(Cmd == ENABLE) + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL |= DMAMUX_SYN_ENABLE_MASK; + } + else + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL &= (~DMAMUX_SYN_ENABLE_MASK); + } + } + else + { + if(Cmd == ENABLE) + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL |= DMAMUX_SYN_ENABLE_MASK; + } + else + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL &= (~DMAMUX_SYN_ENABLE_MASK); + } + } +} + +/** +*\*\name DMAMUX_EnableRequestGen. +*\*\fun Enable or disable the Request Generator. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param RequestGenChannel (The input parameters must be the following values): +*\*\ - DMAMUX_REQ_GEN_0 +*\*\ - DMAMUX_REQ_GEN_1 +*\*\ - DMAMUX_REQ_GEN_2 +*\*\ - DMAMUX_REQ_GEN_3 +*\*\ - DMAMUX_REQ_GEN_4 +*\*\ - DMAMUX_REQ_GEN_5 +*\*\ - DMAMUX_REQ_GEN_6 +*\*\ - DMAMUX_REQ_GEN_7 +*\*\ - DMAMUX_REQ_GEN_8 +*\*\ - DMAMUX_REQ_GEN_9 +*\*\ - DMAMUX_REQ_GEN_10 +*\*\ - DMAMUX_REQ_GEN_11 +*\*\ - DMAMUX_REQ_GEN_12 +*\*\ - DMAMUX_REQ_GEN_13 +*\*\ - DMAMUX_REQ_GEN_14 +*\*\ - DMAMUX_REQ_GEN_15 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note If DMAMUXx is DMAMUX1_ID, the maximum value of the RequestGenChannel is DMAMUX_REQ_GEN_7 +**/ +void DMAMUX_EnableRequestGen(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel, FunctionalState Cmd) +{ + if(DMAMUXx == DMAMUX1_ID) + { + if(Cmd == ENABLE) + { + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG |= DMAMUX_GEN_ENABLE_MASK; + } + else + { + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG &= (~DMAMUX_GEN_ENABLE_MASK); + } + } + else + { + if(Cmd == ENABLE) + { + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG |= DMAMUX_GEN_ENABLE_MASK; + } + else + { + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG &= (~DMAMUX_GEN_ENABLE_MASK); + } + } +} + +/** +*\*\name DMAMUX_SetRequestGenPolarity. +*\*\fun Set the polarity of the signal on which the DMA request is generated. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param RequestGenChannel (The input parameters must be the following values): +*\*\ - DMAMUX_REQ_GEN_0 +*\*\ - DMAMUX_REQ_GEN_1 +*\*\ - DMAMUX_REQ_GEN_2 +*\*\ - DMAMUX_REQ_GEN_3 +*\*\ - DMAMUX_REQ_GEN_4 +*\*\ - DMAMUX_REQ_GEN_5 +*\*\ - DMAMUX_REQ_GEN_6 +*\*\ - DMAMUX_REQ_GEN_7 +*\*\ - DMAMUX_REQ_GEN_8 +*\*\ - DMAMUX_REQ_GEN_9 +*\*\ - DMAMUX_REQ_GEN_10 +*\*\ - DMAMUX_REQ_GEN_11 +*\*\ - DMAMUX_REQ_GEN_12 +*\*\ - DMAMUX_REQ_GEN_13 +*\*\ - DMAMUX_REQ_GEN_14 +*\*\ - DMAMUX_REQ_GEN_15 +*\*\param Polarity : +*\*\ - DMAMUX_REQ_GEN_NO_EVENT +*\*\ - DMAMUX_REQ_GEN_POL_RISING +*\*\ - DMAMUX_REQ_GEN_POL_FALLING +*\*\ - DMAMUX_REQ_GEN_POL_RISING_FALLING +*\*\return none +*\*\note If DMAMUXx is DMAMUX1_ID, the maximum value of the RequestGenChannel is DMAMUX_REQ_GEN_7 +**/ +void DMAMUX_SetRequestGenPolarity(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel, uint32_t Polarity) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG; + tempreg &= (~DMAMUX_REQ_GEN_POL_MASK); + tempreg |= (Polarity); + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG = tempreg; + } + else + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG; + tempreg &= (~DMAMUX_REQ_GEN_POL_MASK); + tempreg |= (Polarity); + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG = tempreg; + } +} + +/** +*\*\name DMAMUX_GetRequestGenPolarity. +*\*\fun Get the polarity of the signal on which the DMA request is generated.. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param RequestGenChannel (The input parameters must be the following values): +*\*\ - DMAMUX_REQ_GEN_0 +*\*\ - DMAMUX_REQ_GEN_1 +*\*\ - DMAMUX_REQ_GEN_2 +*\*\ - DMAMUX_REQ_GEN_3 +*\*\ - DMAMUX_REQ_GEN_4 +*\*\ - DMAMUX_REQ_GEN_5 +*\*\ - DMAMUX_REQ_GEN_6 +*\*\ - DMAMUX_REQ_GEN_7 +*\*\ - DMAMUX_REQ_GEN_8 +*\*\ - DMAMUX_REQ_GEN_9 +*\*\ - DMAMUX_REQ_GEN_10 +*\*\ - DMAMUX_REQ_GEN_11 +*\*\ - DMAMUX_REQ_GEN_12 +*\*\ - DMAMUX_REQ_GEN_13 +*\*\ - DMAMUX_REQ_GEN_14 +*\*\ - DMAMUX_REQ_GEN_15 +*\*\return Returned value can be one of the following values: +*\*\ - DMAMUX_REQ_GEN_NO_EVENT +*\*\ - DMAMUX_REQ_GEN_POL_RISING +*\*\ - DMAMUX_REQ_GEN_POL_FALLING +*\*\ - DMAMUX_REQ_GEN_POL_RISING_FALLING +*\*\note If DMAMUXx is DMAMUX1_ID, the maximum value of the RequestGenChannel is DMAMUX_REQ_GEN_7 +**/ +uint32_t DMAMUX_GetRequestGenPolarity(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG; + } + else + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG; + } + + return (uint32_t)(tempreg & DMAMUX_REQ_GEN_POL_MASK); +} + +/** +*\*\name DMAMUX_SetGenRequestNumber. +*\*\fun Set the number of DMA request that will be autorized after a generation event. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param RequestGenChannel (The input parameters must be the following values): +*\*\ - DMAMUX_REQ_GEN_0 +*\*\ - DMAMUX_REQ_GEN_1 +*\*\ - DMAMUX_REQ_GEN_2 +*\*\ - DMAMUX_REQ_GEN_3 +*\*\ - DMAMUX_REQ_GEN_4 +*\*\ - DMAMUX_REQ_GEN_5 +*\*\ - DMAMUX_REQ_GEN_6 +*\*\ - DMAMUX_REQ_GEN_7 +*\*\ - DMAMUX_REQ_GEN_8 +*\*\ - DMAMUX_REQ_GEN_9 +*\*\ - DMAMUX_REQ_GEN_10 +*\*\ - DMAMUX_REQ_GEN_11 +*\*\ - DMAMUX_REQ_GEN_12 +*\*\ - DMAMUX_REQ_GEN_13 +*\*\ - DMAMUX_REQ_GEN_14 +*\*\ - DMAMUX_REQ_GEN_15 +*\*\param RequestNumber This parameter must be a value between Min_Data = 1 and Max_Data = 32: +*\*\return none +*\*\note If DMAMUXx is DMAMUX1_ID, the maximum value of the RequestGenChannel is DMAMUX_REQ_GEN_7 +**/ +void DMAMUX_SetGenRequestNumber(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel, uint32_t RequestNumber) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * RequestGenChannel)))->CHCFG; + tempreg &= (~DMAMUX_REQ_GEN_NUMBER_MASK); + tempreg |= ((RequestNumber - 1) << DMAMUX_REQ_GEN_NUMBER_Pos); + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * RequestGenChannel)))->CHCFG = tempreg; + } + else + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * RequestGenChannel)))->CHCFG; + tempreg &= (~DMAMUX_REQ_GEN_NUMBER_MASK); + tempreg |= ((RequestNumber - 1) << DMAMUX_REQ_GEN_NUMBER_Pos); + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * RequestGenChannel)))->CHCFG = tempreg; + } +} + +/** +*\*\name DMAMUX_GetGenRequestNumber. +*\*\fun Get the number of DMA request that will be autorized after a generation event. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param RequestGenChannel (The input parameters must be the following values): +*\*\ - DMAMUX_REQ_GEN_0 +*\*\ - DMAMUX_REQ_GEN_1 +*\*\ - DMAMUX_REQ_GEN_2 +*\*\ - DMAMUX_REQ_GEN_3 +*\*\ - DMAMUX_REQ_GEN_4 +*\*\ - DMAMUX_REQ_GEN_5 +*\*\ - DMAMUX_REQ_GEN_6 +*\*\ - DMAMUX_REQ_GEN_7 +*\*\ - DMAMUX_REQ_GEN_8 +*\*\ - DMAMUX_REQ_GEN_9 +*\*\ - DMAMUX_REQ_GEN_10 +*\*\ - DMAMUX_REQ_GEN_11 +*\*\ - DMAMUX_REQ_GEN_12 +*\*\ - DMAMUX_REQ_GEN_13 +*\*\ - DMAMUX_REQ_GEN_14 +*\*\ - DMAMUX_REQ_GEN_15 +*\*\return Between Min_Data = 1 and Max_Data = 32 +*\*\note If DMAMUXx is DMAMUX1_ID, the maximum value of the RequestGenChannel is DMAMUX_REQ_GEN_7 +**/ +uint32_t DMAMUX_GetGenRequestNumber(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * RequestGenChannel)))->CHCFG; + } + else + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * RequestGenChannel)))->CHCFG; + } + + return (uint32_t)(((tempreg & DMAMUX_REQ_GEN_NUMBER_MASK) >> DMAMUX_REQ_GEN_NUMBER_Pos) + 1); +} + +/** +*\*\name DMAMUX_SetRequestSignalID. +*\*\fun Set DMAMUX external Request Signal ID on DMAMUX Request Generation Trigger Event Channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param RequestGenChannel (The input parameters must be the following values): +*\*\ - DMAMUX_REQ_GEN_0 +*\*\ - DMAMUX_REQ_GEN_1 +*\*\ - DMAMUX_REQ_GEN_2 +*\*\ - DMAMUX_REQ_GEN_3 +*\*\ - DMAMUX_REQ_GEN_4 +*\*\ - DMAMUX_REQ_GEN_5 +*\*\ - DMAMUX_REQ_GEN_6 +*\*\ - DMAMUX_REQ_GEN_7 +*\*\ - DMAMUX_REQ_GEN_8 +*\*\ - DMAMUX_REQ_GEN_9 +*\*\ - DMAMUX_REQ_GEN_10 +*\*\ - DMAMUX_REQ_GEN_11 +*\*\ - DMAMUX_REQ_GEN_12 +*\*\ - DMAMUX_REQ_GEN_13 +*\*\ - DMAMUX_REQ_GEN_14 +*\*\ - DMAMUX_REQ_GEN_15 +*\*\param RequestSignalID (The input parameters must be the following values): +*\*\ - DMAMUX1_REQ_GEN_DMAMUX1_EVT0_EVT7 +*\*\ - DMAMUX1_REQ_GEN_DMAMUX1_EVT8_EVT5 +*\*\ - DMAMUX1_REQ_GEN_DMAMUX1_EVT16_EVT23 +*\*\ - DMAMUX1_REQ_GEN_LPTIM4_OUT +*\*\ - DMAMUX1_REQ_GEN_LPTIM3_OUT +*\*\ - DMAMUX1_REQ_GEN_LPTIM2_OUT +*\*\ - DMAMUX1_REQ_GEN_LPTIM1_OUT +*\*\ - DMAMUX1_REQ_GEN_EXTI0 +*\*\ - DMAMUX1_REQ_GEN_CANFD1_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD2_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD3_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD4_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD5_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD6_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD7_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD8_INT0 +*\*\ - DMAMUX1_REQ_GEN_LPTIM5_OUT +*\*\ - DMAMUX1_REQ_GEN_ESC_INT +*\*\ - DMAMUX1_REQ_GEN_CANFD1_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD2_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD3_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD4_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD5_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD6_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD7_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD8_INT1 +*\*\ - DMAMUX2_DMA1_CH0_TC_INT +*\*\ - DMAMUX2_DMA1_CH1_TC_INT +*\*\ - DMAMUX2_DMA1_CH2_TC_INT +*\*\ - DMAMUX2_DMA1_CH3_TC_INT +*\*\ - DMAMUX2_DMA1_CH4_TC_INT +*\*\ - DMAMUX2_DMA1_CH5_TC_INT +*\*\ - DMAMUX2_DMA1_CH6_TC_INT +*\*\ - DMAMUX2_DMA1_CH7_TC_INT +*\*\ - DMAMUX2_DMA2_CH0_TC_INT +*\*\ - DMAMUX2_DMA2_CH1_TC_INT +*\*\ - DMAMUX2_DMA2_CH2_TC_INT +*\*\ - DMAMUX2_DMA2_CH3_TC_INT +*\*\ - DMAMUX2_DMA2_CH4_TC_INT +*\*\ - DMAMUX2_DMA2_CH5_TC_INT +*\*\ - DMAMUX2_DMA2_CH6_TC_INT +*\*\ - DMAMUX2_DMA2_CH7_TC_INT +*\*\ - DMAMUX2_DMA3_CH0_TC_INT +*\*\ - DMAMUX2_DMA3_CH1_TC_INT +*\*\ - DMAMUX2_DMA3_CH2_TC_INT +*\*\ - DMAMUX2_DMA3_CH3_TC_INT +*\*\ - DMAMUX2_DMA3_CH4_TC_INT +*\*\ - DMAMUX2_DMA3_CH5_TC_INT +*\*\ - DMAMUX2_DMA3_CH6_TC_INT +*\*\ - DMAMUX2_DMA3_CH7_TC_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_LCDC_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_GPU_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_JEPG_SGDMA_H2P_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_JEPG_SGDMA_P2H_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_MIPI_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_USB1_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_USB2_INT +*\*\ - DMAMUX2_REQ_GEN_SDMMC1_INT +*\*\ - DMAMUX2_REQ_GEN_SDMMC2_INT +*\*\ - DMAMUX2_REQ_GEN_DVP1_INT +*\*\ - DMAMUX2_REQ_GEN_DVP2_INT +*\*\ - DMAMUX2_REQ_GEN_EHT1_INT +*\*\ - DMAMUX2_REQ_GEN_EHT2_INT +*\*\ - DMAMUX2_REQ_GEN_SDPU_INT +*\*\return none +*\*\note If DMAMUXx is DMAMUX1_ID, the maximum value of the RequestGenChannel is DMAMUX_REQ_GEN_7 +**/ +void DMAMUX_SetRequestSignalID(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel, uint32_t RequestSignalID) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG; + tempreg &= (~DMAMUX_REQ_GEN_SIG_ID_MASK); + tempreg |= (RequestSignalID); + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG = tempreg; + } + else + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG; + tempreg &= (~DMAMUX_REQ_GEN_SIG_ID_MASK); + tempreg |= (RequestSignalID); + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG = tempreg; + } +} + +/** +*\*\name DMAMUX_GetRequestSignalID. +*\*\fun Get DMAMUX external Request Signal ID set on DMAMUX Channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param RequestGenChannel (The input parameters must be the following values): +*\*\ - DMAMUX_REQ_GEN_0 +*\*\ - DMAMUX_REQ_GEN_1 +*\*\ - DMAMUX_REQ_GEN_2 +*\*\ - DMAMUX_REQ_GEN_3 +*\*\ - DMAMUX_REQ_GEN_4 +*\*\ - DMAMUX_REQ_GEN_5 +*\*\ - DMAMUX_REQ_GEN_6 +*\*\ - DMAMUX_REQ_GEN_7 +*\*\ - DMAMUX_REQ_GEN_8 +*\*\ - DMAMUX_REQ_GEN_9 +*\*\ - DMAMUX_REQ_GEN_10 +*\*\ - DMAMUX_REQ_GEN_11 +*\*\ - DMAMUX_REQ_GEN_12 +*\*\ - DMAMUX_REQ_GEN_13 +*\*\ - DMAMUX_REQ_GEN_14 +*\*\ - DMAMUX_REQ_GEN_15 +*\*\return Returned value can be one of the following values: +*\*\ - DMAMUX1_REQ_GEN_DMAMUX1_EVT0_EVT7 +*\*\ - DMAMUX1_REQ_GEN_DMAMUX1_EVT8_EVT5 +*\*\ - DMAMUX1_REQ_GEN_DMAMUX1_EVT16_EVT23 +*\*\ - DMAMUX1_REQ_GEN_LPTIM4_OUT +*\*\ - DMAMUX1_REQ_GEN_LPTIM3_OUT +*\*\ - DMAMUX1_REQ_GEN_LPTIM2_OUT +*\*\ - DMAMUX1_REQ_GEN_LPTIM1_OUT +*\*\ - DMAMUX1_REQ_GEN_EXTI0 +*\*\ - DMAMUX1_REQ_GEN_CANFD1_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD2_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD3_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD4_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD5_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD6_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD7_INT0 +*\*\ - DMAMUX1_REQ_GEN_CANFD8_INT0 +*\*\ - DMAMUX1_REQ_GEN_LPTIM5_OUT +*\*\ - DMAMUX1_REQ_GEN_ESC_INT +*\*\ - DMAMUX1_REQ_GEN_CANFD1_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD2_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD3_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD4_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD5_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD6_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD7_INT1 +*\*\ - DMAMUX1_REQ_GEN_CANFD8_INT1 +*\*\ - DMAMUX2_DMA1_CH0_TC_INT +*\*\ - DMAMUX2_DMA1_CH1_TC_INT +*\*\ - DMAMUX2_DMA1_CH2_TC_INT +*\*\ - DMAMUX2_DMA1_CH3_TC_INT +*\*\ - DMAMUX2_DMA1_CH4_TC_INT +*\*\ - DMAMUX2_DMA1_CH5_TC_INT +*\*\ - DMAMUX2_DMA1_CH6_TC_INT +*\*\ - DMAMUX2_DMA1_CH7_TC_INT +*\*\ - DMAMUX2_DMA2_CH0_TC_INT +*\*\ - DMAMUX2_DMA2_CH1_TC_INT +*\*\ - DMAMUX2_DMA2_CH2_TC_INT +*\*\ - DMAMUX2_DMA2_CH3_TC_INT +*\*\ - DMAMUX2_DMA2_CH4_TC_INT +*\*\ - DMAMUX2_DMA2_CH5_TC_INT +*\*\ - DMAMUX2_DMA2_CH6_TC_INT +*\*\ - DMAMUX2_DMA2_CH7_TC_INT +*\*\ - DMAMUX2_DMA3_CH0_TC_INT +*\*\ - DMAMUX2_DMA3_CH1_TC_INT +*\*\ - DMAMUX2_DMA3_CH2_TC_INT +*\*\ - DMAMUX2_DMA3_CH3_TC_INT +*\*\ - DMAMUX2_DMA3_CH4_TC_INT +*\*\ - DMAMUX2_DMA3_CH5_TC_INT +*\*\ - DMAMUX2_DMA3_CH6_TC_INT +*\*\ - DMAMUX2_DMA3_CH7_TC_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_LCDC_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_GPU_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_JEPG_SGDMA_H2P_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_JEPG_SGDMA_P2H_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_MIPI_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_USB1_INT +*\*\ - DMAMUX2_REQ_GEN_DMAMUX2_USB2_INT +*\*\ - DMAMUX2_REQ_GEN_SDMMC1_INT +*\*\ - DMAMUX2_REQ_GEN_SDMMC2_INT +*\*\ - DMAMUX2_REQ_GEN_DVP1_INT +*\*\ - DMAMUX2_REQ_GEN_DVP2_INT +*\*\ - DMAMUX2_REQ_GEN_EHT1_INT +*\*\ - DMAMUX2_REQ_GEN_EHT2_INT +*\*\ - DMAMUX2_REQ_GEN_SDPU_INT +*\*\note If DMAMUXx is DMAMUX1_ID, the maximum value of the RequestGenChannel is DMAMUX_REQ_GEN_7 +**/ +uint32_t DMAMUX_GetRequestSignalID(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG; + } + else + { + tempreg = ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG; + } + + return (uint32_t)(tempreg & DMAMUX_REQ_GEN_SIG_ID_MASK); +} + +/** +*\*\name DMAMUX_GetSynOverrunStatus. +*\*\fun Get Synchronization Event Overrun Flag of Channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\return FlagStatus: +*\*\ - SET +*\*\ - RESET +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +FlagStatus DMAMUX_GetSynOverrunStatus(DMAMUX_ID DMAMUXx, uint32_t Channel) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_ChannelStatus_TypeDef *)(DMAMUX1_BASE + DMAMUX_CH_STATUS_OFFSET + (DMAMUX_CHCTRL_SIZE * (Channel))))->STS; + } + else + { + tempreg = ((DMAMUX_ChannelStatus_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_CH_STATUS_OFFSET + (DMAMUX_CHCTRL_SIZE * (Channel))))->STS; + } + + return ((tempreg & (1 << Channel)) != 0U) ? SET : RESET; +} + + +/** +*\*\name DMAMUX_GetTrigOverrunStatus. +*\*\fun Get Request Generator x Trigger Event Overrun Flag. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param RequestGenChannel (The input parameters must be the following values): +*\*\ - DMAMUX_REQ_GEN_0 +*\*\ - DMAMUX_REQ_GEN_1 +*\*\ - DMAMUX_REQ_GEN_2 +*\*\ - DMAMUX_REQ_GEN_3 +*\*\ - DMAMUX_REQ_GEN_4 +*\*\ - DMAMUX_REQ_GEN_5 +*\*\ - DMAMUX_REQ_GEN_6 +*\*\ - DMAMUX_REQ_GEN_7 +*\*\ - DMAMUX_REQ_GEN_8 +*\*\ - DMAMUX_REQ_GEN_9 +*\*\ - DMAMUX_REQ_GEN_10 +*\*\ - DMAMUX_REQ_GEN_11 +*\*\ - DMAMUX_REQ_GEN_12 +*\*\ - DMAMUX_REQ_GEN_13 +*\*\ - DMAMUX_REQ_GEN_14 +*\*\ - DMAMUX_REQ_GEN_15 +*\*\return FlagStatus: +*\*\ - SET +*\*\ - RESET +*\*\note If DMAMUXx is DMAMUX1_ID, the maximum value of the RequestGenChannel is DMAMUX_REQ_GEN_7 +**/ +FlagStatus DMAMUX_GetTrigOverrunStatus(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel) +{ + uint32_t tempreg; + + if(DMAMUXx == DMAMUX1_ID) + { + tempreg = ((DMAMUX_RequestGenStatus_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_STATUS_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->RGSTS; + } + else + { + tempreg = ((DMAMUX_RequestGenStatus_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_STATUS_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->RGSTS; + } + + return ((tempreg & (1 << RequestGenChannel)) != 0U) ? SET : RESET; +} + + +/** +*\*\name DMAMUX_ClearSynOverrunStatus. +*\*\fun Clear Synchronization Event Overrun Flag of Channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\return none +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +void DMAMUX_ClearSynOverrunStatus(DMAMUX_ID DMAMUXx, uint32_t Channel) +{ + if(DMAMUXx == DMAMUX1_ID) + { + ((DMAMUX_ChannelStatus_TypeDef *)(DMAMUX1_BASE + DMAMUX_CH_STATUS_OFFSET + (DMAMUX_CHCTRL_SIZE * (Channel))))->STS |= (uint32_t)(1 << Channel); + } + else + { + ((DMAMUX_ChannelStatus_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_CH_STATUS_OFFSET + (DMAMUX_CHCTRL_SIZE * (Channel))))->STS |= (uint32_t)(1 << Channel);; + } +} + + +/** +*\*\name DMAMUX_ClearTrigOverrunStatus. +*\*\fun Clear Request Generator x Trigger Event Overrun Flag. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param RequestGenChannel (The input parameters must be the following values): +*\*\ - DMAMUX_REQ_GEN_0 +*\*\ - DMAMUX_REQ_GEN_1 +*\*\ - DMAMUX_REQ_GEN_2 +*\*\ - DMAMUX_REQ_GEN_3 +*\*\ - DMAMUX_REQ_GEN_4 +*\*\ - DMAMUX_REQ_GEN_5 +*\*\ - DMAMUX_REQ_GEN_6 +*\*\ - DMAMUX_REQ_GEN_7 +*\*\ - DMAMUX_REQ_GEN_8 +*\*\ - DMAMUX_REQ_GEN_9 +*\*\ - DMAMUX_REQ_GEN_10 +*\*\ - DMAMUX_REQ_GEN_11 +*\*\ - DMAMUX_REQ_GEN_12 +*\*\ - DMAMUX_REQ_GEN_13 +*\*\ - DMAMUX_REQ_GEN_14 +*\*\ - DMAMUX_REQ_GEN_15 +*\*\return none: +*\*\note If DMAMUXx is DMAMUX1_ID, the maximum value of the RequestGenChannel is DMAMUX_REQ_GEN_7 +**/ +void DMAMUX_ClearTrigOverrunStatus(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel) +{ + if(DMAMUXx == DMAMUX1_ID) + { + ((DMAMUX_RequestGenStatus_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_STATUS_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->RGCLR |= (uint32_t)(1 << RequestGenChannel); + } + else + { + ((DMAMUX_RequestGenStatus_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_STATUS_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->RGCLR |= (uint32_t)(1 << RequestGenChannel);; + } +} + + +/** +*\*\name DMAMUX_EnableSynEventOverrunInt. +*\*\fun Enable or disable the Synchronization Event Overrun Interrupt on DMAMUX channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param Channel (The input parameters must be the following values): +*\*\ - DMAMUX_CHANNEL_0 +*\*\ - DMAMUX_CHANNEL_1 +*\*\ - DMAMUX_CHANNEL_2 +*\*\ - DMAMUX_CHANNEL_3 +*\*\ - DMAMUX_CHANNEL_4 +*\*\ - DMAMUX_CHANNEL_5 +*\*\ - DMAMUX_CHANNEL_6 +*\*\ - DMAMUX_CHANNEL_7 +*\*\ - DMAMUX_CHANNEL_8 +*\*\ - DMAMUX_CHANNEL_9 +*\*\ - DMAMUX_CHANNEL_10 +*\*\ - DMAMUX_CHANNEL_11 +*\*\ - DMAMUX_CHANNEL_12 +*\*\ - DMAMUX_CHANNEL_13 +*\*\ - DMAMUX_CHANNEL_14 +*\*\ - DMAMUX_CHANNEL_15 +*\*\ - DMAMUX_CHANNEL_16 +*\*\ - DMAMUX_CHANNEL_17 +*\*\ - DMAMUX_CHANNEL_18 +*\*\ - DMAMUX_CHANNEL_19 +*\*\ - DMAMUX_CHANNEL_20 +*\*\ - DMAMUX_CHANNEL_21 +*\*\ - DMAMUX_CHANNEL_22 +*\*\ - DMAMUX_CHANNEL_23 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note If DMAMUXx is DMAMUX2_ID, the maximum value of the Channel is DMAMUX_CHANNEL_15 +**/ +void DMAMUX_EnableSynEventOverrunInt(DMAMUX_ID DMAMUXx, uint32_t Channel, FunctionalState Cmd) +{ + if(DMAMUXx == DMAMUX1_ID) + { + if(Cmd == ENABLE) + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL |= DMAMUX_SYNOVERRUN_INTEN_MASK; + } + else + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX1_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL &= (~DMAMUX_SYNOVERRUN_INTEN_MASK); + } + } + else + { + if(Cmd == ENABLE) + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL |= DMAMUX_SYNOVERRUN_INTEN_MASK; + } + else + { + ((DMAMUX_Channel_TypeDef *)(DMAMUX2_MDMA_BASE + (DMAMUX_CHCTRL_SIZE * (Channel))))->CHCTRL &= (~DMAMUX_SYNOVERRUN_INTEN_MASK); + } + } +} + +/** +*\*\name DMAMUX_EnableTrigOverrunInt. +*\*\fun Enable or disable the Request Generation Trigger Event Overrun Interrupt on DMAMUX channel x. +*\*\param DMAMUXx (The input parameters must be the following values): +*\*\ - DMAMUX1_ID +*\*\ - DMAMUX2_ID +*\*\param RequestGenChannel (The input parameters must be the following values): +*\*\ - DMAMUX_REQ_GEN_0 +*\*\ - DMAMUX_REQ_GEN_1 +*\*\ - DMAMUX_REQ_GEN_2 +*\*\ - DMAMUX_REQ_GEN_3 +*\*\ - DMAMUX_REQ_GEN_4 +*\*\ - DMAMUX_REQ_GEN_5 +*\*\ - DMAMUX_REQ_GEN_6 +*\*\ - DMAMUX_REQ_GEN_7 +*\*\ - DMAMUX_REQ_GEN_8 +*\*\ - DMAMUX_REQ_GEN_9 +*\*\ - DMAMUX_REQ_GEN_10 +*\*\ - DMAMUX_REQ_GEN_11 +*\*\ - DMAMUX_REQ_GEN_12 +*\*\ - DMAMUX_REQ_GEN_13 +*\*\ - DMAMUX_REQ_GEN_14 +*\*\ - DMAMUX_REQ_GEN_15 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note If DMAMUXx is DMAMUX1_ID, the maximum value of the RequestGenChannel is DMAMUX_REQ_GEN_7 +**/ +void DMAMUX_EnableTrigOverrunInt(DMAMUX_ID DMAMUXx, uint32_t RequestGenChannel, FunctionalState Cmd) +{ + if(DMAMUXx == DMAMUX1_ID) + { + if(Cmd == ENABLE) + { + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG |= DMAMUX_TRIGOVERRUN_INTEN_MASK; + } + else + { + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX1_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG &= (~DMAMUX_TRIGOVERRUN_INTEN_MASK); + } + } + else + { + if(Cmd == ENABLE) + { + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG |= DMAMUX_TRIGOVERRUN_INTEN_MASK; + } + else + { + ((DMAMUX_RequestGen_TypeDef *)(DMAMUX2_MDMA_BASE + DMAMUX_REQ_GEN_OFFSET + (DMAMUX_CHCTRL_SIZE * (RequestGenChannel))))->CHCFG &= (~DMAMUX_TRIGOVERRUN_INTEN_MASK); + } + } +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dsi.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dsi.c new file mode 100644 index 0000000000..2b89310822 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dsi.c @@ -0,0 +1,1620 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dsi.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_dsi.h" +#include "stdio.h" + + +static DSI_StateTypeDef DSI_ShortWrite(DSI_HandleTypeDef *hdsi, DSI_PKTCtrlTypeDef PacketCtrl); + +/** +*\*\name DSI_EnableWrapper. +*\*\fun Enable DSI Wrapper. +*\*\param hdsi: dsi host instance. +*\*\param cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return None. +**/ +void DSI_EnableWrapper(DSI_HandleTypeDef *hdsi, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + hdsi->InstanceWrap->DSI_WRPCTRL &= ~DSI_WRPCTRL_TRIGREQ; + } + else + { + hdsi->InstanceWrap->DSI_WRPCTRL |= DSI_WRPCTRL_TRIGREQ; + } +} + +/** +*\*\name DSI_Disable. +*\*\fun Disable DSI. +*\*\param hdsi: dsi host instance. +*\*\return None. +**/ +void DSI_Disable(DSI_HandleTypeDef *hdsi) +{ + hdsi->Instance->DSI_NUMLANES = DSI_REGISTER_MASK; +} + +/** +*\*\name DSI_EnableClockLane. +*\*\fun Enable or Disable DSI clock lane. +*\*\param hdsi: dsi host instance. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return None. +**/ +void DSI_EnableClockLane(DSI_HandleTypeDef *hdsi, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + hdsi->Instance->DSI_CLKLANEN = DSI_CLKLANEN_CLKLANEN; + } + else + { + hdsi->Instance->DSI_CLKLANEN &= ~DSI_CLKLANEN_CLKLANEN; + } +} + +/** +*\*\name DSI_EnableDataLane. +*\*\fun Configure DSI data lane number. +*\*\param hdsi: dsi host instance. +*\*\param datalinenum : +*\*\ - DSI_ONE_DATALANE_ENABLE +*\*\ - DSI_TWO_DATALANES_ENABLE +*\*\ - DSI_THREE_DATALANES_ENABLE +*\*\ - DSI_FOUR_DATALANES_ENABLE +*\*\return None. +**/ +void DSI_ConfigDataLaneNum(DSI_HandleTypeDef *hdsi, uint32_t datalinenum) +{ + hdsi->Instance->DSI_DATLANEN = datalinenum; +} + +/** +*\*\name DSI_SetVCID. +*\*\fun Configure DSI virtual channel ID. +*\*\param hdsi: dsi host instance. +*\*\param channel : +*\*\return None. +**/ +void DSI_SetVCID(DSI_HandleTypeDef *hdsi, uint32_t channel) +{ + hdsi->Instance->VID_VC = channel; +} + +/** +*\*\name DSI_CofigWrapULPSDL. +*\*\fun Configure DSI wrapper data lane number. +*\*\param hdsi: dsi host instance. +*\*\param datalinenum : +*\*\ - DSI_ULPS_ONE_DATA_LANE +*\*\ - DSI_ULPS_TWO_DATA_LANES +*\*\ - DSI_ULPS_THREE_DATA_LANES +*\*\ - DSI_ULPS_FOUR_DATA_LANES +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return None. +**/ +void DSI_CofigWrapULPSDL(DSI_HandleTypeDef *hdsi, uint32_t datalinenum, FunctionalState Cmd) +{ + uint32_t temp; + temp = hdsi->InstanceWrap->DSI_WRPCTRL; + temp &= ~DSI_WRPCTRL_ULPSDLEN; + if(Cmd != DISABLE) + { + temp |= datalinenum << DSI_WRPCTRL_ULPSDLEN_POS; + hdsi->InstanceWrap->DSI_WRPCTRL = temp; + } + else + { + hdsi->InstanceWrap->DSI_WRPCTRL = temp; + } +} + +/** +*\*\name DSI_EnableWrapULPSDL. +*\*\fun Configure DSI wrapper data lane number. +*\*\param hdsi: dsi host instance. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return None. +**/ +void DSI_EnableWrapULPSCL(DSI_HandleTypeDef *hdsi, FunctionalState Cmd) +{ + uint32_t temp; + + temp = hdsi->InstanceWrap->DSI_WRPCTRL; + temp &= ~DSI_WRPCTRL_ULPSCLEN; + if(Cmd != DISABLE) + { + temp |= DSI_WRPCTRL_ULPSCLEN; + hdsi->InstanceWrap->DSI_WRPCTRL = temp; + } + else + { + hdsi->InstanceWrap->DSI_WRPCTRL = temp; + } +} + +/** +*\*\name DSI_DisableSkewCal. +*\*\fun Disable DSI skew calibration . +*\*\param hdsi: dsi host instance. +*\*\return None. +**/ +void DSI_DisableSkewCal(DSI_HandleTypeDef *hdsi) +{ + hdsi->Instance->DSI_SKEWCALINE = DSI_REGISTER_MASK; +} + +/** +*\*\name DSI_DeInit. +*\*\fun De-initializes the DSI peripheral registers to their default reset +*\*\param hdsi: dsi host instance. +*\*\return None. +**/ +DSI_StateTypeDef DSI_DeInit(DSI_HandleTypeDef *hdsi) +{ + /* Check the DSI handle allocation */ + if (hdsi == NULL) + { + return DSI_ERROR; + } + + /* Change DSI peripheral state */ + hdsi->State = DSI_BUSY; + + /* Disable the DSI wrapper: write bit9 = 0 NEED TBD */ + DSI_EnableWrapper(hdsi, ENABLE); + + /* Disable the DSI host */ + DSI_Disable(hdsi); + + /* D-PHY clock lane and data lane disable */ + DSI_EnableClockLane(hdsi, DISABLE); + + /* Disable the skewcal*/ + DSI_DisableSkewCal(hdsi); + + /* Initialize the error code */ + hdsi->ErrorCode = DSI_NO_ERRORS; + + /* Initialize the DSI state*/ + hdsi->State = DSI_RESET; + + /* Release Lock */ + hdsi->Lock = DSI_UNLOCKED; + + return DSI_OK; +} + +/** +*\*\name DSI_InitHostWrap. +*\*\fun Initialize DSI host and wrapper . +*\*\param hdsi: dsi host instance. +*\*\return None. +**/ +void DSI_InitHostWrap(DSI_HandleTypeDef *hdsi) +{ + /* Base address of DSI Host/Wrapper registers to be set before calling De-Init */ + hdsi->Instance = DSI_HOST; + hdsi->InstanceWrap = DSI_HOST_WRAPPER; +} + +/** +*\*\name DSI_GetPHYStatus. +*\*\fun Get DSI PHY status. +*\*\param hdsi: dsi host instance. +*\*\return SET or RESET. +**/ +FlagStatus DSI_GetPHYStatus(DSI_HandleTypeDef *hdsi) +{ + FlagStatus bitstatus = RESET; + + hdsi->InstanceWrap->DSIPHY_PLLSTS = 1; + + if ((hdsi->InstanceWrap->DSIPHY_PLLSTS & DSIPHY_PLLSTS_PHYREADY) != DSIPHY_PLLSTS_PHYREADY) + { + bitstatus = RESET; + } + else + { + bitstatus = SET; + } + /* Return the flag status */ + return bitstatus; +} + +/** +*\*\name DSI_InitHostWrap. +*\*\fun Initialize DSI PHY . +*\*\param hdsi: dsi host instance. +*\*\return DSI_StateTypeDef. +**/ +void DSI_InitPHY(DSI_HandleTypeDef *hdsi, DSI_PHY_InitTypeDef *PHY_InitParams) +{ + uint32_t tmp1 = 0; + uint32_t tmp2 = 0; + uint32_t tmp3 = 0; + uint32_t tmp4 = 0; + uint32_t tmp5 = 0; + uint32_t tmp6 = 0; + uint32_t tmp7 = 0; + + // config wrap register 0x08: CFG_LN_SWAP_SEL + hdsi->InstanceWrap->DSIPHY_CTRL1 &= ~(DSIPHY_CTRL1_REFCKSEL | DSIPHY_CTRL1_EXTDCYCEL | DSIPHY_CTRL1_L4SEL | DSIPHY_CTRL1_L3SEL | DSIPHY_CTRL1_L2SEL | DSIPHY_CTRL1_L1SEL | DSIPHY_CTRL1_L0SEL); + tmp1 = ( PHY_InitParams->L4_Swap_Sel_Value << DSIPHY_CTRL1_L4SEL_POS); + tmp2 = ( PHY_InitParams->L3_Swap_Sel_Value << DSIPHY_CTRL1_L3SEL_POS); + tmp3 = ( PHY_InitParams->L2_Swap_Sel_Value << DSIPHY_CTRL1_L2SEL_POS); + tmp4 = ( PHY_InitParams->L1_Swap_Sel_Value << DSIPHY_CTRL1_L1SEL_POS); + tmp5 = ( PHY_InitParams->L0_Swap_Sel_Value << DSIPHY_CTRL1_L0SEL_POS); + + // config wrap register 0x08 + tmp6 = ( PHY_InitParams->RefCLK_In_Sel << DSIPHY_CTRL1_REFCKSEL_POS); + tmp7 = ( PHY_InitParams->EXTD_CYCLE_SEL << DSIPHY_CTRL1_EXTDCYCEL_POS); + hdsi->InstanceWrap->DSIPHY_CTRL1 |= (tmp1 | tmp2 | tmp3 | tmp4 | tmp5 | tmp6 | tmp7); + + // config wrap register 0x0c + tmp1 = ( PHY_InitParams->DLANE_HS_PER_TIME << DSIPHY_CTRL2_DLPRET_POS); + tmp2 = ( PHY_InitParams->DLANE_HS_ZERO_TIME << DSIPHY_CTRL2_DLZEROT_POS); + tmp3 = ( PHY_InitParams->DLANE_HS_TRAIL_TIME << DSIPHY_CTRL2_DLTRAT_POS); + tmp4 = ( PHY_InitParams->CLANE_HS_PER_TIME << DSIPHY_CTRL2_CLPRET_POS); + hdsi->InstanceWrap->DSIPHY_CTRL2 = (tmp1 | tmp2 | tmp3 | tmp4); + + // config wrap register 0x10 + tmp1 = ( PHY_InitParams->CLANE_HS_ZERO_TIME << DSIPHY_CTRL3_CLZEROT_POS); + tmp2 = ( PHY_InitParams->CLANE_HS_TRAIL_TIME << DSIPHY_CTRL3_CLTRLT_POS); + tmp3 = ( PHY_InitParams->CLANE_HS_CLK_PRE_TIME << DSIPHY_CTRL3_CLCLKPRET_POS); + tmp4 = ( PHY_InitParams->CLANE_HS_CLK_POST_TIME << DSIPHY_CTRL3_CLCLKPOST_POS); + hdsi->InstanceWrap->DSIPHY_CTRL3 = (tmp1 | tmp2 | tmp3 | tmp4); + + // config wrap register 0x64 + tmp1 = ( PHY_InitParams->PLL_FBK_FRA7_0 << 0); + tmp2 = ( PHY_InitParams->PLL_FBK_FRA15_8 << 8); + tmp3 = ( PHY_InitParams->PLL_FBK_FRA23_16 << 16); + hdsi->InstanceWrap->DSIPHY_PLLCTRL1 = (tmp1 | tmp2 | tmp3 ); + + // config wrap register 0x68 + tmp1 = ( PHY_InitParams->PLL_SSC_DELTA7_0 << DSIPHY_PLLCTRL2_SSCAMPOP_POS ); + tmp2 = ( PHY_InitParams->PLL_SSC_DELTA15_8 << 20 ); + tmp3 = ( PHY_InitParams->PLL_SSC_DELTA17_16 << 28 ); + hdsi->InstanceWrap->DSIPHY_PLLCTRL2 = (tmp1 | tmp2 | tmp3 |(PHY_InitParams->PLL_PRE_DIV << DSIPHY_PLLCTRL2_PREDIV_POS) | (PHY_InitParams->PLL_FBK_INT << DSIPHY_PLLCTRL2_FBKINT_POS)); + + // config wrap register 0x6c + tmp1 = ( PHY_InitParams->PLL_SSC_DELTA_INIT7_0 << 0 ); + tmp2 = ( PHY_InitParams->PLL_SSC_DELTA_INIT15_8 << 8 ); + tmp3 = ( PHY_InitParams->PLL_SSC_DELTA_INIT17_16 << 16 ); + tmp4 = ( PHY_InitParams->PLL_SSC_PRD7_0 << DSIPHY_PLLCTRL3_SSCPRD_POS ); + tmp5 = ( PHY_InitParams->PLL_SSC_PRD9_8 << 26 ); + hdsi->InstanceWrap->DSIPHY_PLLCTRL3 = (tmp5 | tmp4 | tmp3 | tmp2 | tmp1 ); + + // config wrap register 0x70 and 0x74, added default lane impedance, only for high speed TX, LPDT does not use HS TX + hdsi->InstanceWrap->DSIPHY_PLLCTRL4 |= 0x21084210; + hdsi->InstanceWrap->DSIPHY_PLLCTRL5 |= 0x84210; +} + +/** +*\*\name DSI_Start. +*\*\fun Initialize DSI PHY . +*\*\param hdsi: dsi host instance. +*\*\return DSI_StateTypeDef. +**/ +DSI_StateTypeDef DSI_Start(DSI_HandleTypeDef *hdsi) +{ + uint32_t temp; + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + /* Enable the DSI host */ + // enable clock lane + DSI_EnableClockLane(hdsi, ENABLE); + + /* Request on Data Lanes */ + if(hdsi->HostInit.NumOfLanes == DSI_ONE_DATA_LANE) + { + temp = DSI_ONE_DATALANE_ENABLE; + } + else if(hdsi->HostInit.NumOfLanes == DSI_TWO_DATA_LANES) + { + temp = DSI_TWO_DATALANES_ENABLE; + } + else if(hdsi->HostInit.NumOfLanes == DSI_THREE_DATA_LANES) + { + temp = DSI_THREE_DATALANES_ENABLE; + } + else if(hdsi->HostInit.NumOfLanes == DSI_FOUR_DATA_LANES) + { + temp = DSI_FOUR_DATALANES_ENABLE; + } + // enable data lane + DSI_ConfigDataLaneNum(hdsi, temp); + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + return DSI_OK; +} + +/** +*\*\name DSI_EnterULPSData. +*\*\fun Enter the ULPM (Ultra Low Power Mode) with the D-PHY PLL running(only data lanes are in ULPM) +*\*\param hdsi: dsi host instance. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return DSI_StateTypeDef. +**/ +DSI_StateTypeDef DSI_EnterULPSData(DSI_HandleTypeDef *hdsi, FunctionalState Cmd) +{ + uint32_t temp; + uint32_t timeout = DSI_TIME_OUT_VALUE; + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + /* ULPS Request on Data Lanes */ + if(hdsi->HostInit.NumOfLanes == DSI_ONE_DATA_LANE) + { + temp = DSI_ULPS_ONE_DATA_LANE; + } + else if(hdsi->HostInit.NumOfLanes == DSI_TWO_DATA_LANES) + { + temp = DSI_ULPS_TWO_DATA_LANE; + } + else if(hdsi->HostInit.NumOfLanes == DSI_THREE_DATA_LANES) + { + temp = DSI_ULPS_THREE_DATA_LANE; + } + else if(hdsi->HostInit.NumOfLanes == DSI_FOUR_DATA_LANES) + { + temp = DSI_ULPS_FOUR_DATA_LANE; + } + DSI_CofigWrapULPSDL(hdsi, temp, ENABLE); + // wait data lane enter ULPS + while(((hdsi->InstanceWrap->DSI_WRPSTS & DSI_WRPCTRL_ULPSDLEN) != temp) && timeout--) + { + } + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + if(timeout == 0xFFFFFFFF) + { + return DSI_TIMEOUT; + } + return DSI_OK; +} + +/** +*\*\name DSI_EnterULPSClock. +*\*\fun Enter the ULPM (Ultra Low Power Mode) with the C-PHY PLL running (only clock lanes are in ULPM) +*\*\param hdsi: dsi host instance. +*\*\return DSI_StateTypeDef. +**/ +DSI_StateTypeDef DSI_EnterULPSClock(DSI_HandleTypeDef *hdsi) +{ + uint32_t timeout = DSI_TIME_OUT_VALUE; + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + /* ULPS Request on Clock Lanes */ + DSI_EnableWrapULPSCL(hdsi, ENABLE); + + // wait clock lane enter ULPS + while(((hdsi->InstanceWrap->DSI_WRPSTS & DSI_WRPCTRL_ULPSCLEN) != DSI_WRPCTRL_ULPSCLEN) && timeout--) + { + } + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + if(timeout == 0xFFFFFFFF) + { + return DSI_TIMEOUT; + } + return DSI_OK; +} + +/** +*\*\name DSI_ExitULPSClock. +*\*\fun Exit the ULPM (Ultra Low Power Mode) with the C-PHY PLL running (only clock lanes are in ULPM) +*\*\param hdsi: dsi host instance. +*\*\return DSI_StateTypeDef. +**/ +DSI_StateTypeDef DSI_ExitULPSClock(DSI_HandleTypeDef *hdsi) +{ + uint32_t timeout = DSI_TIME_OUT_VALUE; + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + /* Exit ULPS on Clock Lanes */ + DSI_EnableWrapULPSCL(hdsi, DISABLE); + + // wait clock lane enter ULPS + while(((hdsi->InstanceWrap->DSI_WRPSTS & DSI_WRPCTRL_ULPSCLEN) != 0) && timeout--) + { + } + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + if(timeout == 0xFFFFFFFF) + { + return DSI_TIMEOUT; + } + return DSI_OK; +} + +/** +*\*\name DSI_EnterULPS. +*\*\fun Enter the ULPM (Ultra Low Power Mode)(both data and clock lanes are in ULPM) +*\*\param hdsi: dsi host instance. +*\*\return DSI_StateTypeDef. +**/ +DSI_StateTypeDef DSI_EnterULPS(DSI_HandleTypeDef *hdsi) +{ + DSI_StateTypeDef result; + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + /* ULPS Request on Clock Lanes */ + result = DSI_EnterULPSClock(hdsi); + + if(result != DSI_OK) + { + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + return result; + } + + /* ULPS Request on Data Lanes */ + result = DSI_EnterULPSData(hdsi, ENABLE); + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return result; +} + +/** +*\*\name DSI_ExitULPS. +*\*\fun Exit the ULPM (Ultra Low Power Mode)(both data and clock lanes are in ULPM) +*\*\param hdsi: dsi host instance. +*\*\return DSI_StateTypeDef. +**/ +DSI_StateTypeDef DSI_ExitULPS(DSI_HandleTypeDef *hdsi) +{ + DSI_StateTypeDef result; + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + /* Exit ULPS on Data Lanes */ + result = DSI_EnterULPSData(hdsi, DISABLE); + if(result != DSI_OK) + { + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + return result; + } + + /* Exit ULPS on Clock Lanes */ + result = DSI_ExitULPSClock(hdsi); + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return DSI_OK; +} + +/** +*\*\name DSI_EnableWrapperISkewCal. +*\*\fun Enable or disable Wrapper Initial skew calibration. +*\*\param hdsi: dsi host instance. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return None. +**/ +void DSI_EnableWrapperISkewCal(DSI_HandleTypeDef *hdsi, FunctionalState Cmd) +{ + uint32_t temp; + temp = hdsi->InstanceWrap->DSI_WRPCTRL; + if(Cmd != DISABLE) + { + temp |= DSI_WRPCTRL_ISKEWCAL; + hdsi->InstanceWrap->DSI_WRPCTRL = temp; + } + else + { + temp &= ~DSI_WRPCTRL_ISKEWCAL; + hdsi->InstanceWrap->DSI_WRPCTRL = temp; + } +} + +/** +*\*\name DSI_EnableWrapperPSkewCal. +*\*\fun Enable or disable Wrapper Period skew calibration. +*\*\param hdsi: dsi host instance. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return None. +**/ +void DSI_EnableWrapperPSkewCal(DSI_HandleTypeDef *hdsi, FunctionalState Cmd) +{ + uint32_t temp; + temp = hdsi->InstanceWrap->DSI_WRPCTRL; + if(Cmd != DISABLE) + { + temp |= DSI_WRPCTRL_PSKEWCAL; + hdsi->InstanceWrap->DSI_WRPCTRL = temp; + } + else + { + temp &= ~DSI_WRPCTRL_PSKEWCAL; + hdsi->InstanceWrap->DSI_WRPCTRL = temp; + } +} + +/** +*\*\name DSI_EnableInitialSkewCali. +*\*\fun Enable Wrapper Initialize skew calibration. +*\*\param hdsi: dsi host instance. +*\*\return None. +**/ +DSI_StateTypeDef DSI_EnableInitialSkewCalib(DSI_HandleTypeDef *hdsi) +{ + uint32_t timeout = DSI_TIME_OUT_VALUE; + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + // enable initial skew + DSI_EnableWrapperISkewCal(hdsi, ENABLE); + + // wait for status + while((((hdsi->InstanceWrap->DSI_WRPSTS) & DSI_WRPCTRL_ISKEWCAL) == 0) && timeout--) + { + } + // clear status : write 1 + hdsi->InstanceWrap->DSI_WRPSTS |= (DSI_WRPSTS_ISKEWCALDN); + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + if(timeout == 0xFFFFFFFF) + { + return DSI_TIMEOUT; + } + + return DSI_OK; +} + +/** +*\*\name DSI_EnableInitialSkewCali. +*\*\fun Enable Wrapper Period skew calibration. +*\*\param hdsi: dsi host instance. +*\*\return None. +**/ +DSI_StateTypeDef DSI_EnablePeriodSkewCali(DSI_HandleTypeDef *hdsi) +{ + uint32_t timeout = DSI_TIME_OUT_VALUE; + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + // enable period skew + DSI_EnableWrapperPSkewCal(hdsi, ENABLE); + + // wait for status + while((((hdsi->InstanceWrap->DSI_WRPSTS) & DSI_WRPSTS_PSKEWCALDN) == 0) && timeout--) + { + } + + // clear status: write 1 + hdsi->InstanceWrap->DSI_WRPSTS |= (DSI_WRPSTS_PSKEWCALDN); + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + if(timeout == 0xFFFFFFFF) + { + return DSI_TIMEOUT; + } + + return DSI_OK; + +} + +/** +*\*\name DSI_EnableInitialSkewCali. +*\*\fun Enable Wrapper reset trigger. +*\*\param hdsi: dsi host instance. +*\*\return None. +**/ +DSI_StateTypeDef DSI_EnableResetTrigger(DSI_HandleTypeDef *hdsi) +{ + uint32_t timeout = DSI_TIME_OUT_VALUE; + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + // set reset trigger and enable reset trigger send + hdsi->InstanceWrap->DSI_WRPCTRL &= ~DSI_WRPCTRL_TRIGSEND; + hdsi->InstanceWrap->DSI_WRPCTRL |= DSI_WRPCTRL_TRIGREQ; + + // wait for status + while((((hdsi->InstanceWrap->DSI_WRPSTS) & DSI_WRPSTS_TRIGACK) == 0) && timeout--) + { + } + // clear status: write 1 + hdsi->InstanceWrap->DSI_WRPSTS |= (DSI_WRPSTS_TRIGACK); + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + if(timeout == 0xFFFFFFFF) + { + return DSI_TIMEOUT; + } + + return DSI_OK; +} + +/** +*\*\name DSI_Wrapper_ConfigInt +*\*\fun Enables or disables the specified DSI Wrapper's interrupts. +*\*\param hdsi: dsi host instance. +*\*\param DSI_IT +*\*\ - DSI_WRAPPER_INT_BLKERRIEN +*\*\ - DSI_WRAPPER_INT_SPERRIEN +*\*\ - DSI_WRAPPER_INT_OVERRIEN +*\*\ - DSI_WRAPPER_INT_UNDERRIEN +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DSI_Wrapper_ConfigInt(DSI_HandleTypeDef *hdsi, uint32_t DSI_IT, FunctionalState Cmd) +{ + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + if (Cmd != DISABLE) + { + /* Enable the Interrupt sources */ + hdsi->InstanceWrap->DSI_WRPCTRL |= (uint32_t)DSI_IT; + } + else + { + /* Disable the Interrupt sources */ + hdsi->InstanceWrap->DSI_WRPCTRL &= (uint32_t)(~DSI_IT); + } + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; +} + + +/** +*\*\name DSI_Wrapper_GetFlagStatus +*\*\fun Checks whether the specified LCDC flag is set or not. +*\*\param hdsi: dsi host instance. +*\*\param DSI_FLAG +*\*\ - DSI_WRAPPER_FLAG_ISKEWCALDN +*\*\ - DSI_WRAPPER_FLAG_PSKEWCALDN +*\*\ - DSI_WRAPPER_FLAG_TRIGACK +*\*\ - DSI_WRAPPER_FLAG_BLKERRIEN +*\*\ - DSI_WRAPPER_FLAG_SPERRIEN +*\*\ - DSI_WRAPPER_FLAG_OVERRIEN +*\*\ - DSI_WRAPPER_FLAG_UNDERRIEN +*\*\return The new state of DSI Wrapper FLAG (SET or RESET). +**/ +FlagStatus DSI_Wrapper_GetFlagStatus(DSI_HandleTypeDef *hdsi, uint32_t DSI_FLAG) +{ + FlagStatus bitstatus; + + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + if ((hdsi->InstanceWrap->DSI_WRPSTS & DSI_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return bitstatus; +} + +/** +*\*\name DSI_Wrapper_ClearFlag +*\*\fun Clears the DSI Wrapper's pending flags. +*\*\param hdsi: dsi host instance. +*\*\param DSI_FLAG +*\*\ - DSI_WRAPPER_FLAG_ISKEWCALDN +*\*\ - DSI_WRAPPER_FLAG_PSKEWCALDN +*\*\ - DSI_WRAPPER_FLAG_TRIGACK +*\*\ - DSI_WRAPPER_FLAG_BLKERRIEN +*\*\ - DSI_WRAPPER_FLAG_SPERRIEN +*\*\ - DSI_WRAPPER_FLAG_OVERRIEN +*\*\ - DSI_WRAPPER_FLAG_UNDERRIEN +*\*\return none. +**/ +void DSI_Wrapper_ClearFlag(DSI_HandleTypeDef *hdsi, uint32_t DSI_FLAG) +{ + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + /* Clear the flags */ + hdsi->InstanceWrap->DSI_WRPSTS |= (uint32_t)(DSI_FLAG); + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; +} + +/** +*\*\name DSI_Wrapper_GetIntStatus +*\*\fun Checks whether the specified DSI Wrapper's interrupt has occurred or not. +*\*\param hdsi: dsi host instance. +*\*\param DSI_IT +*\*\ - DSI_WRAPPER_INT_BLKERRIEN +*\*\ - DSI_WRAPPER_INT_SPERRIEN +*\*\ - DSI_WRAPPER_INT_OVERRIEN +*\*\ - DSI_WRAPPER_INT_UNDERRIEN +*\*\return The new state of DSI_IT (SET or RESET). +**/ +INTStatus DSI_Wrapper_GetIntStatus(DSI_HandleTypeDef *hdsi, uint32_t DSI_IT) +{ + INTStatus bitstatus; + + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + if ((hdsi->InstanceWrap->DSI_WRPCTRL & DSI_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + if ((bitstatus != (uint32_t)RESET) && ((hdsi->InstanceWrap->DSI_WRPSTS & (DSI_IT >> 2)) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return bitstatus; +} + + +/** +*\*\name DSI_Init. +*\*\fun Initialize the dsi host according to the specified parameters in the DSI_HandleTypeDef. +*\*\param hdsi: dsi host instance. +*\*\return DSI_OK or DSI_ERROR. +**/ +DSI_StateTypeDef DSI_Init(DSI_HandleTypeDef *hdsi) +{ + uint32_t temp; + /* Check the LCDC peripheral state */ + if(hdsi == NULL) + { + return DSI_ERROR; + } + + /* Change CDC peripheral state */ + hdsi->State = DSI_BUSY; + + /************************ Set the DSI HOST BASE parameter ************************/ + temp = hdsi->Instance->DSI_DISBST; + temp &= ~(DSI_DISBST_DISBST); + temp |= hdsi->HostInit.BurstSel; + hdsi->Instance->DSI_DISBST = temp; + + temp = hdsi->Instance->DSI_AUTOINSERT_EOTP; + temp &= ~(DSI_AUTOINSERT_EOTP_AUTOINSEOTP); + temp |= hdsi->HostInit.AutoInsertEOTP; + hdsi->Instance->DSI_AUTOINSERT_EOTP = temp; + + temp = hdsi->Instance->DSI_DISRXCRCCHK; + temp &= ~(DSI_DISRXCRCCHK_DISRXCRCCHK); + temp |= hdsi->HostInit.DisRXCRC; + hdsi->Instance->DSI_DISRXCRCCHK = temp; + + temp = hdsi->Instance->DSI_TPRE; + temp &= ~(DSI_TPRE_TPRE<ClockInit.ClockBeforeHS << DSI_TPRE_TPRE_POS); + hdsi->Instance->DSI_TPRE = temp; + + temp = hdsi->Instance->DSI_TPOST; + temp &= ~(DSI_TPOST_TPOST<ClockInit.ClockHS2LP << DSI_TPOST_TPOST_POS); + hdsi->Instance->DSI_TPOST = temp; + + temp = hdsi->Instance->DSI_TXGAP; + temp &= ~(DSI_TXGAP_TXGAP<ClockInit.ClockLP2HS << DSI_TXGAP_TXGAP_POS); + hdsi->Instance->DSI_TXGAP = temp; + + temp = hdsi->Instance->DSI_TWAKEUP; + temp &= ~(DSI_TWAKEUP_TWAKEUP<ClockInit.ClockExitULPS << DSI_TWAKEUP_TWAKEUP_POS); + hdsi->Instance->DSI_TWAKEUP = temp; + + temp = hdsi->Instance->DSI_CONTHSCLK; + temp &= ~(DSI_CONTHSCLK_CONTHSCLK << DSI_CONTHSCLK_CONTHSCLK_POS); + temp |= (hdsi->ClockInit.ContinuousHSCLK << DSI_CONTHSCLK_CONTHSCLK_POS); + hdsi->Instance->DSI_CONTHSCLK = temp; + + /************************ Set DSI HOST SKEWCAL Parameter ************************/ + temp = hdsi->Instance->DSI_SKEWCALTIMI; + temp &= ~(DSI_SKEWCALTIMI_SKEWVALTIMI << DSI_SKEWCALTIMI_SKEWVALTIMI_POS); + temp |= (hdsi->SkewcalInit.ClockInitialSkewcal << DSI_SKEWCALTIMI_SKEWVALTIMI_POS); + hdsi->Instance->DSI_SKEWCALTIMI = temp; + + temp = hdsi->Instance->DSI_SKEWCALTIMP; + temp &= ~(DSI_SKEWCALTIMP_SKEWVALTIMP << DSI_SKEWCALTIMP_SKEWVALTIMP_POS); + temp |= (hdsi->SkewcalInit.ClockPeriodicSkewcal << DSI_SKEWCALTIMP_SKEWVALTIMP_POS); + hdsi->Instance->DSI_SKEWCALTIMP = temp; + + temp = hdsi->Instance->DSI_ALTCALTIM; + temp &= ~(DSI_ALTCALTIM_ALTCALTIM << DSI_ALTCALTIM_ALTCALTIM_POS); + temp |= (hdsi->SkewcalInit.ClockAlternateCal << DSI_ALTCALTIM_ALTCALTIM_POS); + hdsi->Instance->DSI_ALTCALTIM = temp; + + temp = hdsi->Instance->DSI_SKEWCALINE; + temp &= ~(DSI_SKEWCALINE_SKEWCALINE << DSI_SKEWCALINE_SKEWCALINE_POS); + temp |= (hdsi->SkewcalInit.LinePeriodicSkewcal << DSI_SKEWCALINE_SKEWCALINE_POS); + hdsi->Instance->DSI_SKEWCALINE = temp; + + /* Config the num_lanes to enable the host controller */ + temp = hdsi->Instance->DSI_NUMLANES; + temp &= ~(DSI_NUMLANES_NUMLANES << DSI_NUMLANES_NUMLANES_POS); + temp |= (hdsi->HostInit.NumOfLanes << DSI_NUMLANES_NUMLANES_POS); + hdsi->Instance->DSI_NUMLANES = temp; + + /* Initialize the error code */ + hdsi->ErrorCode = DSI_NO_ERRORS; + + /* Initialize the LCDC state*/ + hdsi->State = DSI_READY; + + return DSI_OK; +} + +/** +*\*\name DSI_ConfigVideoMode. +*\*\fun Select video mode and configure the corresponding parameters +*\*\param hdsi: dsi host instance. +*\*\param VidCfg: pointer to a DSI_VidCfgTypeDef structure that contains the DSI video mode configuration parameters +*\*\return DSI_OK or DSI_ERROR. +**/ +DSI_StateTypeDef DSI_ConfigVideoMode(DSI_HandleTypeDef *hdsi, DSI_VidCfgTypeDef *VidCfg) +{ + uint32_t temp; + + /* Check the LCDC peripheral state */ + if(hdsi == NULL || VidCfg == NULL) + { + return DSI_ERROR; + } + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + /************************ Set DSI HOST VID IF ************************/ + temp = hdsi->Instance->VID_PIXPERPKT; + temp &= ~(VID_PIXPERPKT_PIXPERPKT << VID_PIXPERPKT_PIXPERPKT_POS); + temp |= (VidCfg->PixelsPerPacket << VID_PIXPERPKT_PIXPERPKT_POS); + hdsi->Instance->VID_PIXPERPKT = temp; + + temp = hdsi->Instance->VID_PIXPLDSIZ; + temp &= ~(VID_PIXPLDSIZ_PIXPLDSIZ << VID_PIXPLDSIZ_PIXPLDSIZ_POS); + temp |= (VidCfg->PixelPayloadSize << VID_PIXPLDSIZ_PIXPLDSIZ_POS); + hdsi->Instance->VID_PIXPLDSIZ = temp; + + temp = hdsi->Instance->VID_PIXALIGN; + temp &= ~(VID_PIXALIGN_PIXALIGN << VID_PIXALIGN_PIXALIGN_POS); + temp |= (VidCfg->PixelAlignment << VID_PIXALIGN_PIXALIGN_POS); + hdsi->Instance->VID_PIXALIGN = temp; + + temp = hdsi->Instance->VID_PIXFMT; + temp &= ~(VID_PIXFMT_PIXFMT << VID_PIXFMT_PIXFMT_POS); + temp |= (VidCfg->PixelFormat << VID_PIXFMT_PIXFMT_POS); + hdsi->Instance->VID_PIXFMT = temp; + + temp = hdsi->Instance->VID_VSYNCPOL; + temp &= ~(VID_VSYNCPOL_VSYNCPOL << VID_VSYNCPOL_VSYNCPOL_POS); + temp |= (VidCfg->VSPolarity << VID_VSYNCPOL_VSYNCPOL_POS); + hdsi->Instance->VID_VSYNCPOL = temp; + + temp = hdsi->Instance->VID_HSYNCPOL; + temp &= ~(VID_HSYNCPOL_HSYNCPOL << VID_HSYNCPOL_HSYNCPOL_POS); + temp |= (VidCfg->HSPolarity << VID_HSYNCPOL_HSYNCPOL_POS); + hdsi->Instance->VID_HSYNCPOL = temp; + + temp = hdsi->Instance->VID_VIDEOMOD; + temp &= ~(VID_VIDEOMOD_VIDEOMOD << VID_VIDEOMOD_VIDEOMOD_POS); + temp |= (VidCfg->Mode << VID_VIDEOMOD_VIDEOMOD_POS); + hdsi->Instance->VID_VIDEOMOD = temp; + + temp = hdsi->Instance->VID_OVERIDE; + temp &= ~(VID_OVERIDE_OVERIDE << VID_OVERIDE_OVERIDE_POS); + temp |= (VidCfg->Override << VID_OVERIDE_OVERIDE_POS); + hdsi->Instance->VID_OVERIDE = temp; + + /* Only Override = 1 need to program timing register, Otherwise, the reset value is maintained */ + if (VidCfg->Override == VID_OVERIDE_OVERIDE) + { + temp = hdsi->Instance->VID_HSA; + temp &= ~(VID_HSA_HSA << VID_HSA_HSA_POS); + temp |= (VidCfg->HorizontalSyncActive << VID_HSA_HSA_POS); + hdsi->Instance->VID_HSA = temp; + + temp = hdsi->Instance->VID_HBP; + temp &= ~(VID_HBP_HBP << VID_HBP_HBP_POS); + temp |= (VidCfg->HorizontalBackPorch << VID_HBP_HBP_POS); + hdsi->Instance->VID_HBP = temp; + + temp = hdsi->Instance->VID_HFP; + temp &= ~(VID_HFP_HFP << VID_HFP_HFP_POS); + temp |= (VidCfg->HorizontalFrontPorch << VID_HFP_HFP_POS); + hdsi->Instance->VID_HFP = temp; + + temp = hdsi->Instance->VID_VBP; + temp &= ~(VID_VBP_VBP << VID_VBP_VBP_POS); + temp |= (VidCfg->VerticalBackPorch << VID_VBP_VBP_POS); + hdsi->Instance->VID_VBP = temp; + + temp = hdsi->Instance->VID_VFP; + temp &= ~(VID_VFP_VFP << VID_VFP_VFP_POS); + temp |= (VidCfg->VerticalFrontPorch << VID_VFP_VFP_POS); + hdsi->Instance->VID_VFP = temp; + + temp = hdsi->Instance->VID_VACT; + temp &= ~(VID_VACT_VACT << VID_VACT_VACT_POS); + temp |= (VidCfg->VerticalActive << VID_VACT_VACT_POS); + hdsi->Instance->VID_VACT = temp; + } + + temp = hdsi->Instance->VID_STD; + temp &= ~(VID_STD_STD << VID_STD_STD_POS); + temp |= (VidCfg->DelayFromStart << VID_STD_STD_POS); + hdsi->Instance->VID_STD = temp; + + temp = hdsi->Instance->VID_PKTPERLINE; + temp &= ~(VID_PKTPERLINE_PKTPERLINE << VID_PKTPERLINE_PKTPERLINE_POS); + temp |= (VidCfg->PacketsPerLine << VID_PKTPERLINE_PKTPERLINE_POS); + hdsi->Instance->VID_PKTPERLINE = temp; + + temp = hdsi->Instance->VID_BLLPMOD; + temp &= ~(VID_BLLPMOD_BLLPMOD << VID_BLLPMOD_BLLPMOD_POS); + temp |= (VidCfg->BLLPMode << VID_BLLPMOD_BLLPMOD_POS); + hdsi->Instance->VID_BLLPMOD = temp; + + temp = hdsi->Instance->VID_NULLPKTBLLP; + temp &= ~(VID_NULLPKTBLLP_NULLPKTBLLP << VID_NULLPKTBLLP_NULLPKTBLLP_POS); + temp |= (VidCfg->NULLPacketInBLLP << VID_NULLPKTBLLP_NULLPKTBLLP_POS); + hdsi->Instance->VID_NULLPKTBLLP = temp; + + temp = hdsi->Instance->VID_VC; + temp &= ~(VID_VC_VC << VID_VC_VC_POS); + temp |= (VidCfg->VirtualChannel << VID_VC_VC_POS); + hdsi->Instance->VID_VC = temp; + + temp = hdsi->Instance->VID_EXTPKTEN; + temp &= ~(VID_EXTPKTEN_EXTPKTEN << VID_EXTPKTEN_EXTPKTEN_POS); + temp |= (VidCfg->ExternalPacket << VID_EXTPKTEN_EXTPKTEN_POS); + hdsi->Instance->VID_EXTPKTEN = temp; + + temp = hdsi->Instance->VID_VSSPLD; + temp &= ~(VID_VSSPLD_VSSPLD << VID_VSSPLD_VSSPLD_POS); + temp |= (VidCfg->VerticalSyncStartPayload << VID_VSSPLD_VSSPLD_POS); + hdsi->Instance->VID_VSSPLD = temp; + + temp = hdsi->Instance->VID_PLDPERPKT; + temp &= ~(VID_PLDPERPKT_PLLPERPKT << VID_PLDPERPKT_PLLPERPKT_POS); + temp |= (VidCfg->PayloadPerPacket << VID_PLDPERPKT_PLLPERPKT_POS); + hdsi->Instance->VID_PLDPERPKT = temp; + + hdsi->Instance->VID_EN |= VID_EN_EN; + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return DSI_OK; +} + +/** +*\*\name DSI_ConfigTimeout. +*\*\fun Configure DSI host timeout parameters. +*\*\param hdsi: dsi host instance. +*\*\param hstxcnt: 0~0xFFFFFF, Hight speed TX timeout count. +*\*\param lprxcnt: 0~0xFFFFFF, Low power RX timeout count. +*\*\param btacnt: 0~0xFFFFFF, Bus turn around timeout count. +*\*\return DSI_OK. +**/ +DSI_StateTypeDef DSI_ConfigTimeout(DSI_HandleTypeDef *hdsi, uint32_t hstxcnt, uint32_t lprxcnt, uint32_t btacnt) +{ + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + hdsi->Instance->DSI_HSTXTOCNT = hstxcnt; + hdsi->Instance->DSI_LRXTOCNT = lprxcnt; + hdsi->Instance->DSI_BTATOCNT = btacnt; + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return DSI_OK; +} + +/** +*\*\name DSI_APBPKT_ShortWrite. +*\*\fun write short DCS or short Generic command. +*\*\param hdsi: dsi host instance. +*\*\param ChannelID: Virtual channel ID. +*\*\param Mode: DSI short packet data type. +*\*\ - DSI_DCS_SHORT_PKT_WRITE_P0 +*\*\ - DSI_DCS_SHORT_PKT_WRITE_P1 +*\*\ - DSI_GEN_SHORT_PKT_WRITE_P0 +*\*\ - DSI_GEN_SHORT_PKT_WRITE_P1 +*\*\ - DSI_GEN_SHORT_PKT_WRITE_P2 +*\*\param Speed: DSI short packet speed. +*\*\ - DSI_MODE_LPDT +*\*\ - DSI_MODE_HSDT +*\*\param Param1: DSC command or first generic parameter. +*\*\param Param2: DSC parameter or second generic parameter. +*\*\return none +**/ +DSI_StateTypeDef DSI_APBPKT_ShortWrite(DSI_HandleTypeDef *hdsi, uint32_t ChannelID, uint32_t Mode, uint32_t Speed, uint32_t Param1, uint32_t Param2) +{ + DSI_StateTypeDef status; + DSI_PKTCtrlTypeDef PacketCtrl; + + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + PacketCtrl.IsBTAEnable = 0; + PacketCtrl.IsBTAOnly = 0; + PacketCtrl.CmdType = Speed; + PacketCtrl.Header.ChannelID = ChannelID; + PacketCtrl.Header.DataType = Mode; + PacketCtrl.Header.WordCount = (Param2 << 8U | (Param1 & 0xff)); + + status = DSI_ShortWrite(hdsi, PacketCtrl); + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return status; +} + +/** +*\*\name DSI_ShortWrite. +*\*\fun write short DCS or short Generic command. +*\*\param hdsi: dsi host instance. +*\*\param PacketCtrl: Pointer to parameter DSI_PKTCtrlType struct. +*\*\return DSI_State +**/ +static DSI_StateTypeDef DSI_ShortWrite(DSI_HandleTypeDef *hdsi, DSI_PKTCtrlTypeDef PacketCtrl) +{ + uint32_t timeout = DSI_TIME_OUT_VALUE; + // wait for DPHY direction is tx + while(((hdsi->Instance->DSI_PKTSTS & DSI_PKTSTS_DPHYDIR) == DSI_PKTSTS_DPHYDIR) && timeout--); + + if(timeout == 0xFFFFFFFF) + { + return DSI_TIMEOUT; + } + /* Configure the packet to send a short DCS command with 0 or 1 parameter */ + /* Update the DSI packet header with new information */ + // write the TX packet header values into the register + hdsi->Instance->DSI_PKTCTRL = ((PacketCtrl.IsBTAOnly << 26U) | (PacketCtrl.IsBTAEnable << 25U) | (PacketCtrl.CmdType << 24U) | \ + (PacketCtrl.Header.DataType << 18U) | (PacketCtrl.Header.ChannelID << 16U) | (PacketCtrl.Header.WordCount)); + + // set TX send enable + hdsi->Instance->DSI_SENDPKT = DSI_SENDPKT_SENDPKT; + + timeout = DSI_TIME_OUT_VALUE; + // wait until tx done + if(PacketCtrl.IsBTAEnable == 0) + { + // write wait for not idle + while(((hdsi->Instance->DSI_PKTSTS & DSI_PKTSTS_NIDLE) == DSI_PKTSTS_NIDLE) && timeout--) + { + } + if(timeout == 0xFFFFFFFF) + { + return DSI_TIMEOUT; + } + } + return DSI_OK; +} + +/** +*\*\name DSI_APBPKT_LongWrite. +*\*\fun write long DCS or long Generic command +*\*\param hdsi: dsi host instance. +*\*\param ChannelID: Virtual channel ID. +*\*\param Mode: DSI short packet data type. +*\*\ - DSI_DCS_LONG_PKT_WRITE +*\*\ - DSI_GEN_LONG_PKT_WRITE +*\*\param Speed: DSI short packet speed. +*\*\ - DSI_MODE_LPDT +*\*\ - DSI_MODE_HSDT +*\*\param ParametersTable: Pointer to parameter values table. +*\*\param NbParams: Number of parameters. +*\*\return DSI_State +**/ +DSI_StateTypeDef DSI_APBPKT_LongWrite(DSI_HandleTypeDef *hdsi, uint32_t ChannelID, uint32_t Mode, uint32_t Speed, uint8_t *ParametersTable, uint32_t NbParams) +{ + DSI_StateTypeDef status; + DSI_PKTCtrlTypeDef PacketCtrl; + + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + PacketCtrl.IsBTAEnable = 0; + PacketCtrl.IsBTAOnly = 0; + PacketCtrl.CmdType = Speed; + + PacketCtrl.Header.ChannelID = ChannelID; + PacketCtrl.Header.DataType = Mode; + PacketCtrl.Header.WordCount = NbParams; + + status = DSI_LongWrite(hdsi, PacketCtrl, ParametersTable); + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return status; +} + +/** +*\*\name DSI_LongWrite. +*\*\fun write long DCS or long Generic command +*\*\param hdsi: dsi host instance. +*\*\param PacketCtrl: Pointer to parameter DSI_PKTCtrlType struct. +*\*\param ParametersTable: Pointer to parameter values table. +*\*\return DSI_State +**/ +DSI_StateTypeDef DSI_LongWrite(DSI_HandleTypeDef *hdsi, DSI_PKTCtrlTypeDef PacketCtrl, uint8_t *ParametersTable) +{ + uint32_t uicounter; + uint32_t indexBytes; + uint32_t count; + uint32_t fifoword; + uint8_t *pparams = ParametersTable; + uint32_t timeout = DSI_TIME_OUT_VALUE; + uint8_t longpacket_byte[100] = {0}; + uint32_t longpacket_fifo[100] = {0}; + + // wait for DPHY direction is tx + while(((hdsi->Instance->DSI_PKTSTS & DSI_PKTSTS_DPHYDIR) == DSI_PKTSTS_DPHYDIR) && timeout--); + + if(timeout == 0xFFFFFFFF) + { + return DSI_TIMEOUT; + } + /* Configure the packet to send a long DCS command */ + // write the TX packet header values into the register + hdsi->Instance->DSI_PKTCTRL = ((PacketCtrl.IsBTAOnly << 26U) | (PacketCtrl.IsBTAEnable << 25U) | (PacketCtrl.CmdType << 24U) | \ + (PacketCtrl.Header.DataType << 18U) | (PacketCtrl.Header.ChannelID << 16U) | (PacketCtrl.Header.WordCount)); + + for(uint16_t i = 0; i < PacketCtrl.Header.WordCount; i++ ) + { + longpacket_byte[i] = *pparams; + pparams += 4; + } + // write the payload data + uicounter = (PacketCtrl.Header.WordCount + 3) / 4; + for (count = 0U; count < uicounter ; ++count) + { + indexBytes = count * 4; + fifoword = 0; + if(indexBytes < PacketCtrl.Header.WordCount) + { + fifoword |= (uint32_t)(longpacket_byte[indexBytes]) << 0; + } + if((indexBytes + 1) < PacketCtrl.Header.WordCount) + { + fifoword |= ((uint32_t)(longpacket_byte[indexBytes + 1]) << 8); + } + if((indexBytes + 2) < PacketCtrl.Header.WordCount) + { + fifoword |= ((uint32_t)(longpacket_byte[indexBytes + 2]) << 16); + } + if((indexBytes + 3) < PacketCtrl.Header.WordCount) + { + fifoword |= ((uint32_t)(longpacket_byte[indexBytes + 3]) << 24); + } + + longpacket_fifo[count] = fifoword; + } + for(uint16_t i = 0; i < uicounter; i++) + { + hdsi->Instance->DSI_TXPLD = longpacket_fifo[i]; + } + // set TX send enable + hdsi->Instance->DSI_SENDPKT = DSI_SENDPKT_SENDPKT; + + timeout = DSI_TIME_OUT_VALUE; + // wait until tx done + while(((hdsi->Instance->DSI_PKTSTS & DSI_PKTSTS_TXD) == DSI_PKTSTS_TXD) && timeout--) + { + } + if(timeout == 0xFFFFFFFF) + { + return DSI_TIMEOUT; + } + return DSI_OK; +} + +/** +*\*\name DSI_APBPKT_Read. +*\*\fun Read command (DCS or generic) +*\*\param hdsi: dsi host instance. +*\*\param ChannelNbr: Virtual channel ID. +*\*\param Array: Array pointer to a buffer to store the payload of a read back operation. +*\*\param Size: Data size to be read (in byte). +*\*\param Mode: DSI short packet data type. +*\*\ - DSI_DCS_SHORT_PKT_READ +*\*\ - DSI_GEN_SHORT_PKT_READ_P0 +*\*\ - DSI_GEN_SHORT_PKT_READ_P1 +*\*\ - DSI_GEN_SHORT_PKT_READ_P2 +*\*\param DCSCmd: DCS get/read command. +*\*\param ParametersTable: Pointer to parameter values table. +*\*\return DSI_State +**/ +DSI_StateTypeDef DSI_APBPKT_Read(DSI_HandleTypeDef *hdsi, uint32_t ChannelNbr, uint8_t *Array, uint32_t Size, uint32_t Mode, uint32_t DCSCmd, uint8_t *ParametersTable) +{ + uint32_t datasize = Size; + + DSI_PKTCtrlTypeDef PacketCtrl; + DSI_StateTypeDef status; + + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + /* Check the parameters */ + assert_param(IS_DSI_READ_PACKET_TYPE(Mode)); + + if (datasize > 2U) + { + /* step1: set max return packet size */ + if (DSI_APBPKT_ShortWrite(hdsi, ChannelNbr, DSI_MAX_RETURN_PKT_SIZE, DSI_MODE_LPDT, ((datasize) & 0xFFU), (((datasize) >> 8U) & 0xFFU)) != DSI_OK) + { + /* Process Unlocked */ + hdsi->Lock = DSI_UNLOCKED; + return DSI_ERROR; + } + } + + /* step2: send read cmd */ + PacketCtrl.IsBTAEnable = 1; + PacketCtrl.IsBTAOnly = 0; + PacketCtrl.CmdType = DSI_MODE_LPDT; + + PacketCtrl.Header.ChannelID = ChannelNbr; + PacketCtrl.Header.DataType = Mode; + + /* step3: dsi rx secondly*/ + if (Mode == DSI_DCS_SHORT_PKT_READ) + { + //levan, cmd need to be in the data 0 + PacketCtrl.Header.WordCount = (0x0 << 8U | (DCSCmd & 0xff)); + status = DSI_ShortWrite(hdsi, PacketCtrl); + } + else if (Mode == DSI_GEN_SHORT_PKT_READ_P0) + { + PacketCtrl.Header.WordCount = 0; + status = DSI_ShortWrite(hdsi, PacketCtrl); + } + else if (Mode == DSI_GEN_SHORT_PKT_READ_P1) + { + PacketCtrl.Header.WordCount = DCSCmd << 8U; + status = DSI_ShortWrite(hdsi, PacketCtrl); + PacketCtrl.Header.DataType = DSI_EOTP; + PacketCtrl.Header.WordCount = (0x0f << 8U | 0x0f); + PacketCtrl.IsBTAEnable = 1; + status = DSI_ShortWrite(hdsi, PacketCtrl); + } + else if (Mode == DSI_GEN_SHORT_PKT_READ_P2) + { + PacketCtrl.Header.WordCount = (DCSCmd << 8U | ParametersTable[0U]); + status = DSI_ShortWrite(hdsi, PacketCtrl); + } + else + { + /* Process Unlocked */ + hdsi->Lock = DSI_UNLOCKED; + return DSI_ERROR; + } + /* step4: dsi rx */ + status = DSI_Read(hdsi, (uint8_t *)Array, Size); + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return status; +} + +/** +*\*\name DSI_APBPKT_Read_BTA. +*\*\fun Read command (DCS or generic) +*\*\param hdsi: dsi host instance. +*\*\param ChannelNbr: Virtual channel ID. +*\*\param Array: Array pointer to a buffer to store the payload of a read back operation. +*\*\param Size: Data size to be read (in byte). +*\*\param Mode: DSI short packet data type. +*\*\ - DSI_DCS_SHORT_PKT_READ +*\*\ - DSI_GEN_SHORT_PKT_READ_P0 +*\*\ - DSI_GEN_SHORT_PKT_READ_P1 +*\*\ - DSI_GEN_SHORT_PKT_READ_P2 +*\*\return DSI_State +**/ +DSI_StateTypeDef DSI_APBPKT_Read_BTA(DSI_HandleTypeDef *hdsi, uint32_t ChannelNbr, uint8_t *Array, uint32_t Size, uint32_t Mode) +{ + uint32_t datasize = Size; + + DSI_PKTCtrlTypeDef PacketCtrl; + DSI_StateTypeDef status; + + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + if (datasize > 2U) + { + /* step1: set max return packet size */ + if (DSI_APBPKT_ShortWrite(hdsi, ChannelNbr, DSI_MAX_RETURN_PKT_SIZE, DSI_MODE_LPDT, ((datasize) & 0xFFU), (((datasize) >> 8U) & 0xFFU)) != DSI_OK) + { + /* Process Unlocked */ + hdsi->Lock = DSI_UNLOCKED; + return DSI_ERROR; + } + } + + /* step2: send read cmd */ + PacketCtrl.IsBTAEnable = 0; + PacketCtrl.IsBTAOnly = 1; + PacketCtrl.CmdType = DSI_MODE_LPDT; + + PacketCtrl.Header.ChannelID = ChannelNbr; + PacketCtrl.Header.DataType = Mode; + + /* step3: dsi rx secondly*/ + PacketCtrl.Header.WordCount = 0; + status = DSI_ShortWrite(hdsi, PacketCtrl); + + /* step4: dsi rx */ + status = DSI_Read(hdsi, (uint8_t *)Array, Size); + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return status; +} + +/** +*\*\name DSI_Read. +*\*\fun DSI Read data +*\*\param hdsi: dsi host instance. +*\*\param RxArray: Array pointer to a buffer to store the payload of a read back operation. +*\*\param RxSize: Data size to be read (in byte). +*\*\return DSI_State +**/ +DSI_StateTypeDef DSI_Read(DSI_HandleTypeDef *hdsi, uint8_t *RxArray, uint32_t RxSize) +{ + uint8_t *pdata = RxArray; + uint32_t timeout = DSI_TIME_OUT_VALUE; + DSI_PKTHeaderTypeDef RxPKTHeader; + + //levan, wait until packet header has been received + while(((hdsi->Instance->DSI_PKTSTS & DSI_PKTSTS_RXPKTD) != DSI_PKTSTS_RXPKTD) && timeout--) + {} + if(timeout == 0xFFFFFFFF) + { + return DSI_TIMEOUT; + } + //then proceed with + // read rx packet header + RxPKTHeader.WordCount = hdsi->Instance->DSI_PKTRXHDR & 0x0000ffff; + RxPKTHeader.DataType = (hdsi->Instance->DSI_PKTRXHDR >> 16) & 0x3f; + RxPKTHeader.ChannelID = (hdsi->Instance->DSI_PKTRXHDR >> 22) & 0x03; + //levan added, for short packet, TODO for long packet + *pdata = (uint8_t) RxPKTHeader.WordCount & 0x00ff; + pdata++; + *pdata = (uint8_t) RxPKTHeader.WordCount>>8 & 0x00ff; + return DSI_OK; +} + + + +/** +*\*\name DSI_GetSTS +*\*\fun Get DSI flag status. +*\*\param hdsi: dsi host instance. +*\*\param DSI_FLAG (The input parameters must be the following values): +*\*\ - DSI_FLAG_SOT_ERROR +*\*\ - DSI_FLAG_SOTSYNC_ERROR +*\*\ - DSI_FLAG_EOTSYNC_ERROR +*\*\ - DSI_FLAG_ESCMOD_ERROR +*\*\ - DSI_FLAG_LPTXSYNC_ERROR +*\*\ - DSI_FLAG_TO_ERROR +*\*\ - DSI_FLAG_FCTRL_ERROR +*\*\ - DSI_FLAG_COTDET_ERROR +*\*\ - DSI_FLAG_ECCSB_ERROR +*\*\ - DSI_FLAG_ECCML_ERROR +*\*\ - DSI_FLAG_CRC_ERROR +*\*\ - DSI_FLAG_DATATYPE_ERROR +*\*\ - DSI_FLAG_VCIDINVLID_ERROR +*\*\ - DSI_FLAG_INVLID_TXLEN_ERROR +*\*\ - DSI_FLAG_PROVILT_ERROR +*\*\ - DSI_FLAG_BIT0_ERROR +*\*\ - DSI_FLAG_BIT1_ERROR +*\*\ - DSI_FLAG_BIT2_ERROR +*\*\ - DSI_FLAG_BIT3_ERROR +*\*\return bitstatus +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus DSI_GetSTS(DSI_HandleTypeDef *hdsi, uint32_t DSI_FLAG) +{ + FlagStatus bitstatus; + + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + if ((hdsi->Instance->DSI_STS & DSI_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return bitstatus; +} + +/** +*\*\name DSI_GetERRSTS +*\*\fun Get DSI error flag status. +*\*\param hdsi: dsi host instance. +*\*\param DSI_FLAG (The input parameters must be the following values): +*\*\ - DSI_ERROR_FLAG_ECCSB +*\*\ - DSI_ERROR_FLAG_ECCML +*\*\ - DSI_ERROR_FLAG_CRC +*\*\ - DSI_ERROR_FLAG_HTXTO +*\*\ - DSI_ERROR_FLAG_LRXTO +*\*\ - DSI_ERROR_FLAG_BATTO +*\*\return bitstatus +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus DSI_GetERRSTS(DSI_HandleTypeDef *hdsi, uint32_t DSI_FLAG) +{ + FlagStatus bitstatus; + + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + if ((hdsi->Instance->DSI_ERRSTS & DSI_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return bitstatus; +} + +/** +*\*\name DSI_GetPKTSTS +*\*\fun Get DSI packet flag status. +*\*\param hdsi: dsi host instance. +*\*\param DSI_FLAG (The input parameters must be the following values): +*\*\ - DSI_PKT_FLAG_NIDLE +*\*\ - DSI_PKT_FLAG_TXD +*\*\ - DSI_PKT_FLAG_DPHYDIR +*\*\ - DSI_PKT_FLAG_TXFOVER +*\*\ - DSI_PKT_FLAG_TXFUNDER +*\*\ - DSI_PKT_FLAG_RXFOVER +*\*\ - DSI_PKT_FLAG_RXFUNDER +*\*\ - DSI_PKT_FLAG_RXPKTD +*\*\ - DSI_PKT_FLAG_ALLRXPKTD +*\*\return bitstatus +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus DSI_GetPKTSTS(DSI_HandleTypeDef *hdsi, uint32_t DSI_FLAG) +{ + FlagStatus bitstatus; + + /* Process locked */ + hdsi->Lock = DSI_LOCKED; + + if ((hdsi->Instance->DSI_STS & DSI_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Process unlocked */ + hdsi->Lock = DSI_UNLOCKED; + + return bitstatus; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dsmu.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dsmu.c new file mode 100644 index 0000000000..bfead8b08f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dsmu.c @@ -0,0 +1,1574 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dsmu.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_dsmu.h" +#include "n32h76x_78x_rcc.h" + +#ifndef NULL + #define NULL 0 +#endif + +/** DSMU Private variables **/ +static __IO uint32_t gDSMU_ChannelInitStatus = 0U; + +/** DSMU_Private_Functions DSMU Private Functions **/ +static uint32_t DSMU_GetChannelNumber(const DSMU_Channel_Submodule *DSMU_Channely); + +/** +*\*\name DSMU_DeInit. +*\*\fun Deinitialize the DSMU. +*\*\param none. +*\*\return none. +**/ +void DSMU_DeInit(void) +{ + /* Reset DSMU by RCC*/ + RCC_EnableAPB2PeriphReset2(RCC_APB2_PERIPHRST_DSMU); + + /* Reset initial status of all channels */ + gDSMU_ChannelInitStatus = 0U; +} + +/** +*\*\name DSMU_ChannelInit. +*\*\fun Initialize the DSMU channel according to the specified parameters +*\*\param DSMU_Channely +*\*\ - DSMU_Channel0 +*\*\ - DSMU_Channel1 +*\*\ - DSMU_Channel2 +*\*\ - DSMU_Channel3 +*\*\ - DSMU_Channel4 +*\*\ - DSMU_Channel5 +*\*\ - DSMU_Channel6 +*\*\ - DSMU_Channel7 +*\*\param DSMU_ChannelyInitStruct +*\*\ - OutputClock: +*\*\ - Activation: +*\*\ - DISABLE +*\*\ - ENABLE +*\*\ - Selection: +*\*\ - DSMU_CHANNEL_OUTPUT_CLOCK_SYSTEM +*\*\ - DSMU_CHANNEL_OUTPUT_CLOCK_AUDIO +*\*\ - Divider: +*\*\ - This parameter must be a number between Min_Data = 2 and Max_Data = 256. +*\*\ - Input: +*\*\ - Multiplexer: +*\*\ - DSMU_CHANNEL_EXTERNAL_INPUTS +*\*\ - DSMU_CHANNEL_ADC_OUTPUT +*\*\ - DSMU_CHANNEL_INTERNAL_REGISTER +*\*\ - DataPacking: +*\*\ - DSMU_CHANNEL_STANDARD_MODE +*\*\ - DSMU_CHANNEL_INTERLEAVED_MODE +*\*\ - DSMU_CHANNEL_DUAL_MODE +*\*\ - Pins: +*\*\ - DSMU_CHANNEL_SAME_CHANNEL_PINS +*\*\ - DSMU_CHANNEL_FOLLOWING_CHANNEL_PINS +*\*\ - SerialInterface: +*\*\ - Type: +*\*\ - DSMU_CHANNEL_SPI_RISING +*\*\ - DSMU_CHANNEL_SPI_FALLING +*\*\ - DSMU_CHANNEL_MANCHESTER_RISING +*\*\ - DSMU_CHANNEL_MANCHESTER_FALLING +*\*\ - SpiClock: +*\*\ - DSMU_CHANNEL_SPI_CLOCK_EXTERNAL +*\*\ - DSMU_CHANNEL_SPI_CLOCK_INTERNAL +*\*\ - DSMU_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING +*\*\ - DSMU_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING +*\*\ - Awd: +*\*\ - FilterOrder: +*\*\ - DSMU_AWD_FASTSINC_ORDER +*\*\ - DSMU_AWD_SINC1_ORDER +*\*\ - DSMU_AWD_SINC2_ORDER +*\*\ - DSMU_AWD_SINC3_ORDER +*\*\ - Oversampling: +*\*\ - This parameter must be a number between Min_Data = 1 and Max_Data = 32. +*\*\ - Offset: +*\*\ - This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607. +*\*\ - RightBitShift: +*\*\ - This parameter must be a number between Min_Data = 0 and Max_Data = 31. +*\*\return ErrorStatus: +*\*\ - SUCCESS +*\*\ - ERROR +**/ +ErrorStatus DSMU_ChannelInit(DSMU_Channel_Submodule* DSMU_Channely, DSMU_Channel_InitType* DSMU_ChannelInitStruct) +{ + uint32_t tReg; + ErrorStatus status = SUCCESS; + + /* Check DSMU Channel handle */ + if(DSMU_ChannelInitStruct == NULL) + { + status = ERROR; + } + else + { + /* Configure output serial clock and enable global DSMU interface only for first channel */ + if(0U == gDSMU_ChannelInitStatus) + { + /* Disable the DSMU global interface */ + DSMU_Channel0->CHCFG1 &= ~(DSMU_CHYCFG1_DSMUEN); + + /* Reset clock source and divider */ + tReg = DSMU_Channel0->CHCFG1; + tReg &= ~(DSMU_CHYCFG1_CLKOUTSRC | DSMU_CHYCFG1_CLKOUTDIV); + + /* Set the output serial clock source */ + tReg |= DSMU_ChannelInitStruct->OutputClock.Selection; + + if(DSMU_ChannelInitStruct->OutputClock.Activation != DISABLE) + { + /* Set the output clock divider */ + tReg |= ((DSMU_ChannelInitStruct->OutputClock.Divider - 1U) << REG_BIT16_OFFSET); + } + + /* Write register */ + DSMU_Channel0->CHCFG1 = tReg; + + /* Enable the DSMU global interface */ + DSMU_Channel0->CHCFG1 |= DSMU_CHYCFG1_DSMUEN; + } + + /* Disable current channel */ + DSMU_Channely->CHCFG1 &= ~(DSMU_CHYCFG1_CHEN); + + /* Config register DSMU_CHCFG1 */ + tReg = DSMU_Channely->CHCFG1; + tReg &= ~( DSMU_CHYCFG1_DATPACK \ + | DSMU_CHYCFG1_DATMUX \ + | DSMU_CHYCFG1_CHINSEL \ + | DSMU_CHYCFG1_SITP \ + | DSMU_CHYCFG1_SPICLKSEL ); + + /* Set channel input parameters */ + tReg |= ( DSMU_ChannelInitStruct->Input.Multiplexer \ + | DSMU_ChannelInitStruct->Input.DataPacking \ + | DSMU_ChannelInitStruct->Input.Pins ); + + /* Set serial interface parameters */ + tReg |= ( DSMU_ChannelInitStruct->SerialInterface.Type \ + | DSMU_ChannelInitStruct->SerialInterface.SpiClock ); + + /* Write register */ + DSMU_Channely->CHCFG1 = tReg; + + /* Set analog watchdog parameters */ + tReg = DSMU_Channely->CHAWDSCDET; + tReg &= ~(DSMU_CHYAWDSCDET_AWDFORD | DSMU_CHYAWDSCDET_AWDFOSR); + tReg |= ( DSMU_ChannelInitStruct->Awd.FilterOrder \ + | ((DSMU_ChannelInitStruct->Awd.Oversampling - 1U) << REG_BIT16_OFFSET)); + DSMU_Channely->CHAWDSCDET = tReg; + + /* Set channel offset and right bit shift */ + tReg = DSMU_Channely->CHCFG2; + tReg &= ~(DSMU_CHYCFG2_CALOFFSET | DSMU_CHYCFG2_DATRBS); + tReg |= (((uint32_t) DSMU_ChannelInitStruct->Offset << REG_BIT8_OFFSET) \ + | (DSMU_ChannelInitStruct->RightBitShift << REG_BIT3_OFFSET)); + DSMU_Channely->CHCFG2 = tReg; + + /* Enable DSMU channel */ + DSMU_Channely->CHCFG1 |= DSMU_CHYCFG1_CHEN; + + /* Set channel initialize status */ + gDSMU_ChannelInitStatus |= 1UL << DSMU_GetChannelNumber(DSMU_Channely); + } + + return status; +} + +/** +*\*\name DSMU_InitChannelStruct. +*\*\fun Set the initialize structure of DSMU channel to default value. +*\*\param DSMU_ChannelyInitStruct +*\*\ - OutputClock: +*\*\ - Activation +*\*\ - Selection +*\*\ - Divider +*\*\ - Input: +*\*\ - Multiplexer +*\*\ - DataPacking +*\*\ - Pins +*\*\ - SerialInterface +*\*\ - Type +*\*\ - SpiClock +*\*\ - Awd: +*\*\ - FilterOrder +*\*\ - Oversampling +*\*\ - Offset +*\*\ - RightBitShift +*\*\return none. +**/ +void DSMU_InitChannelStruct(DSMU_Channel_InitType* DSMU_ChannelInitStruct) +{ + DSMU_ChannelInitStruct->OutputClock.Activation = DISABLE; + DSMU_ChannelInitStruct->OutputClock.Selection = DSMU_CHANNEL_OUTPUT_CLOCK_SYSTEM; + DSMU_ChannelInitStruct->OutputClock.Divider = 2U; + + DSMU_ChannelInitStruct->Input.Multiplexer = DSMU_CHANNEL_EXTERNAL_INPUTS; + DSMU_ChannelInitStruct->Input.DataPacking = DSMU_CHANNEL_STANDARD_MODE; + DSMU_ChannelInitStruct->Input.Pins = DSMU_CHANNEL_SAME_CHANNEL_PINS; + + DSMU_ChannelInitStruct->SerialInterface.Type = DSMU_CHANNEL_SPI_RISING; + DSMU_ChannelInitStruct->SerialInterface.SpiClock = DSMU_CHANNEL_SPI_CLOCK_EXTERNAL; + + DSMU_ChannelInitStruct->Awd.FilterOrder = DSMU_AWD_FASTSINC_ORDER; + DSMU_ChannelInitStruct->Awd.Oversampling = 1U; + + DSMU_ChannelInitStruct->Offset = 0; + DSMU_ChannelInitStruct->RightBitShift = 0U; +} + +/** +*\*\name DSMU_ChannelDeInit. +*\*\fun Deinitialize the DSMU channel +*\*\param DSMU_Channely +*\*\ - DSMU_Channel0 +*\*\ - DSMU_Channel1 +*\*\ - DSMU_Channel2 +*\*\ - DSMU_Channel3 +*\*\ - DSMU_Channel4 +*\*\ - DSMU_Channel5 +*\*\ - DSMU_Channel6 +*\*\ - DSMU_Channel7 +*\*\return None. +**/ +void DSMU_ChannelDeInit(DSMU_Channel_Submodule* DSMU_Channely) +{ + /* Disable the DSMU channel */ + DSMU_Channely->CHCFG1 &= ~(DSMU_CHYCFG1_CHEN); + + /* Clear channel initialize status */ + gDSMU_ChannelInitStatus &= ~(1U << DSMU_GetChannelNumber(DSMU_Channely)); + + /* Disable global DSMU at deinit of last channel */ + if(0U == gDSMU_ChannelInitStatus) + { + DSMU_Channel0->CHCFG1 &= ~(DSMU_CHYCFG1_DSMUEN); + } +} + +/** +*\*\name DSMU_ChannelCkAbEnable. +*\*\fun Enable clock absence detection +*\*\param DSMU_Channely +*\*\ - DSMU_Channel0 +*\*\ - DSMU_Channel1 +*\*\ - DSMU_Channel2 +*\*\ - DSMU_Channel3 +*\*\ - DSMU_Channel4 +*\*\ - DSMU_Channel5 +*\*\ - DSMU_Channel6 +*\*\ - DSMU_Channel7 +*\*\return none +**/ +void DSMU_ChannelCkAbEnable(DSMU_Channel_Submodule* DSMU_Channely) +{ + /* Enable clock absence detection */ + DSMU_Channely->CHCFG1 |= DSMU_CHYCFG1_CLKABEN; +} + +/** +*\*\name DSMU_ChannelCkAbDisable. +*\*\fun Disable clock absence detection +*\*\param DSMU_Channely +*\*\ - DSMU_Channel0 +*\*\ - DSMU_Channel1 +*\*\ - DSMU_Channel2 +*\*\ - DSMU_Channel3 +*\*\ - DSMU_Channel4 +*\*\ - DSMU_Channel5 +*\*\ - DSMU_Channel6 +*\*\ - DSMU_Channel7 +*\*\return none +**/ +void DSMU_ChannelCkAbDisable(DSMU_Channel_Submodule* DSMU_Channely) +{ + uint32_t channel; + + /* Disable clock absence detection */ + DSMU_Channely->CHCFG1 &= ~DSMU_CHYCFG1_CLKABEN; + + /* Clear clock absence flag */ + channel = DSMU_GetChannelNumber(DSMU_Channely); + DSMU_Filter0->FLTINTCLR = (1UL << (REG_BIT16_OFFSET + channel)); +} + +/** +*\*\name DSMU_ChannelScdStart. +*\*\fun This function allows to start short circuit detection and assignment break signal. +*\*\param DSMU_Channely +*\*\ - DSMU_Channel0 +*\*\ - DSMU_Channel1 +*\*\ - DSMU_Channel2 +*\*\ - DSMU_Channel3 +*\*\ - DSMU_Channel4 +*\*\ - DSMU_Channel5 +*\*\ - DSMU_Channel6 +*\*\ - DSMU_Channel7 +*\*\param Threshold Short circuit detector threshold. + - This parameter must be a number between Min_Data = 0 and Max_Data = 255. +*\*\param BreakSignal Break signals assigned to short circuit event. +*\*\ - DSMU_NO_BREAK_SIGNAL +*\*\ - DSMU_BREAK_SIGNAL_0 +*\*\ - DSMU_BREAK_SIGNAL_1 +*\*\ - DSMU_BREAK_SIGNAL_2 +*\*\ - DSMU_BREAK_SIGNAL_3 +*\*\return none +*\*\note Same mode has to be used for all channels +**/ +void DSMU_ChannelScdStart(DSMU_Channel_Submodule* DSMU_Channely, + uint32_t Threshold, uint32_t BreakSignal) +{ + uint32_t tReg; + + /* Configure threshold and break signals */ + tReg = DSMU_Channely->CHAWDSCDET; + tReg &= ~(DSMU_CHYAWDSCDET_BKSCDET | DSMU_CHYAWDSCDET_SCDETTH); + tReg |= ((BreakSignal << REG_BIT12_OFFSET) | Threshold); + DSMU_Channely->CHAWDSCDET = tReg; + + /* Start short circuit detection */ + DSMU_Channely->CHCFG1 |= DSMU_CHYCFG1_SCDETEN; +} + +/** +*\*\name DSMU_ChannelScdStop. +*\*\fun This function allows to stop short circuit detection. +*\*\param DSMU_Channely +*\*\ - DSMU_Channel0 +*\*\ - DSMU_Channel1 +*\*\ - DSMU_Channel2 +*\*\ - DSMU_Channel3 +*\*\ - DSMU_Channel4 +*\*\ - DSMU_Channel5 +*\*\ - DSMU_Channel6 +*\*\ - DSMU_Channel7 +*\*\return none +**/ +void DSMU_ChannelScdStop(DSMU_Channel_Submodule* DSMU_Channely) +{ + uint32_t channel; + + /* Stop short circuit detection */ + DSMU_Channely->CHCFG1 &= ~(DSMU_CHYCFG1_SCDETEN); + + /* Clear short circuit detection flag */ + channel = DSMU_GetChannelNumber(DSMU_Channely); + DSMU_Filter0->FLTINTCLR = (1UL << (REG_BIT24_OFFSET + channel)); +} + +/** +*\*\name DSMU_ChannelGetAwdValue. +*\*\fun This function allows to get analog watchdog value for current channel. +*\*\param DSMU_Channely +*\*\ - DSMU_Channel0 +*\*\ - DSMU_Channel1 +*\*\ - DSMU_Channel2 +*\*\ - DSMU_Channel3 +*\*\ - DSMU_Channel4 +*\*\ - DSMU_Channel5 +*\*\ - DSMU_Channel6 +*\*\ - DSMU_Channel7 +*\*\return Channel analog watchdog value. +**/ +int16_t DSMU_ChannelGetAwdValue(const DSMU_Channel_Submodule* DSMU_Channely) +{ + return (int16_t)(DSMU_Channely->CHAWDDAT); +} + +/** +*\*\name DSMU_ChannelModifyOffset. +*\*\fun This function allows to modify channel offset value. +*\*\param DSMU_Channely +*\*\ - DSMU_Channel0 +*\*\ - DSMU_Channel1 +*\*\ - DSMU_Channel2 +*\*\ - DSMU_Channel3 +*\*\ - DSMU_Channel4 +*\*\ - DSMU_Channel5 +*\*\ - DSMU_Channel6 +*\*\ - DSMU_Channel7 +*\*\param Offset DFSDM channel offset. + - This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607. +*\*\return none. +**/ +void DSMU_ChannelModifyOffset(DSMU_Channel_Submodule* DSMU_Channely, int32_t Offset) +{ + uint32_t tReg; + + tReg = DSMU_Channely->CHCFG2; + tReg &= (~(DSMU_CHYCFG2_CALOFFSET)); + tReg |= ((uint32_t) Offset << REG_BIT8_OFFSET); + DSMU_Channely->CHCFG2 = tReg; +} + +/** +*\*\name DSMU_ChannelWriteData. +*\*\fun This function allows to write data into input data register. +*\*\param DSMU_Channely +*\*\ - DSMU_Channel0 +*\*\ - DSMU_Channel1 +*\*\ - DSMU_Channel2 +*\*\ - DSMU_Channel3 +*\*\ - DSMU_Channel4 +*\*\ - DSMU_Channel5 +*\*\ - DSMU_Channel6 +*\*\ - DSMU_Channel7 +*\*\param data New data write by CPU. +*\*\return none. +**/ +void DSMU_ChannelWriteData(DSMU_Channel_Submodule* DSMU_Channely, uint32_t data) +{ + DSMU_Channely->CHDATIN = data; +} + +/** +*\*\name DSMU_FilterInit. +*\*\fun Initialize the DSMU filter according to the specified parameters +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param DSMU_FilterInitStruct +*\*\ - RegularParam: +*\*\ - DmaMode: +*\*\ - DISABLE +*\*\ - ENABLE +*\*\ - FastMode: +*\*\ - DISABLE +*\*\ - ENABLE +*\*\ - Trigger: +*\*\ - DSMU_FILTER_SW_TRIGGER +*\*\ - DSMU_FILTER_SYNC_TRIGGER +*\*\ - InjectedParam: +*\*\ - ScanMode: +*\*\ - DISABLE +*\*\ - ENABLE +*\*\ - DmaMode: +*\*\ - DISABLE +*\*\ - ENABLE +*\*\ - Trigger: +*\*\ - DSMU_FILTER_SW_TRIGGER +*\*\ - DSMU_FILTER_SYNC_TRIGGER +*\*\ - DSMU_FILTER_EXT_TRIGGER +*\*\ - ExtTrigger: +*\*\ - DSMU_FILTER_EXT_TRIG_ATIM1_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_ATIM2_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_ATIM3_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_ATIM4_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_GTIMB1_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_GTIMB2_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_GTIMB3_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_GTIMA1_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_GTIMA2_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_GTIMA3_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_GTIMA4_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_GTIMA5_TRGO +*\*\ - DSMU_FILTER_EXT_TRIG_ATIM1_TRGO2 +*\*\ - DSMU_FILTER_EXT_TRIG_ATIM3_TRGO2 +*\*\ - DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG1 +*\*\ - DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG2 +*\*\ - DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG3 +*\*\ - DSMU_FILTER_EXT_TRIG_SHRTIM1_ADC_TRG4 +*\*\ - DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG1 +*\*\ - DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG2 +*\*\ - DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG3 +*\*\ - DSMU_FILTER_EXT_TRIG_SHRTIM2_ADC_TRG4 +*\*\ - DSMU_FILTER_EXT_TRIG_EXTI6 +*\*\ - DSMU_FILTER_EXT_TRIG_EXTI7 +*\*\ - DSMU_FILTER_EXT_TRIG_EXTI8 +*\*\ - DSMU_FILTER_EXT_TRIG_EXTI9 +*\*\ - DSMU_FILTER_EXT_TRIG_EXTI10 +*\*\ - DSMU_FILTER_EXT_TRIG_EXTI11 +*\*\ - DSMU_FILTER_EXT_TRIG_EXTI12 +*\*\ - DSMU_FILTER_EXT_TRIG_EXTI13 +*\*\ - DSMU_FILTER_EXT_TRIG_EXTI14 +*\*\ - DSMU_FILTER_EXT_TRIG_EXTI15 +*\*\ - FilterParam: +*\*\ - SincOrder: +*\*\ - DSMU_FILTER_FASTSINC_ORDER +*\*\ - DSMU_FILTER_SINC1_ORDER +*\*\ - DSMU_FILTER_SINC2_ORDER +*\*\ - DSMU_FILTER_SINC3_ORDER +*\*\ - DSMU_FILTER_SINC4_ORDER +*\*\ - DSMU_FILTER_SINC5_ORDER +*\*\ - Oversampling: +*\*\ - This parameter must be a number between Min_Data = 1 and Max_Data = 1024. +*\*\ - IntOversampling: +*\*\ - This parameter must be a number between Min_Data = 1 and Max_Data = 256. +*\*\return ErrorStatus. +*\*\ - SUCCESS +*\*\ - ERROR +**/ +ErrorStatus DSMU_FilterInit(DSMU_Filter_Submodule* DSMU_Filterx, + DSMU_Filter_InitType* DSMU_FilterInitStruct) +{ + uint32_t tReg; + ErrorStatus status = SUCCESS; + + /* Check parameters compatibility */ + if ((DSMU_Filterx == DSMU_Filter0) && + ((DSMU_FilterInitStruct->RegularParam.Trigger == DSMU_FILTER_SYNC_TRIGGER) || + (DSMU_FilterInitStruct->InjectedParam.Trigger == DSMU_FILTER_SYNC_TRIGGER))) + { + status = ERROR; + } + else + { + /* Disable the filter */ + DSMU_Filterx->FLTCTRL1 &= ~(DSMU_FLTXCTRL1_DFLTEN); + + /* Config FLTCTRL1 register */ + tReg = DSMU_Filterx->FLTCTRL1; + tReg &= ~( DSMU_FLTXCTRL1_FAST \ + | DSMU_FLTXCTRL1_RDMAEN \ + | DSMU_FLTXCTRL1_RSYNC \ + | DSMU_FLTXCTRL1_JEXTEN \ + | DSMU_FLTXCTRL1_JEXTSEL \ + | DSMU_FLTXCTRL1_JDMAEN \ + | DSMU_FLTXCTRL1_JSCAN \ + | DSMU_FLTXCTRL1_JSYNC ); + + /* Set regular parameters */ + if(DSMU_FilterInitStruct->RegularParam.FastMode != DISABLE) + { + tReg |= DSMU_FLTXCTRL1_FAST; + } + + if(DSMU_FilterInitStruct->RegularParam.DmaMode != DISABLE) + { + tReg |= DSMU_FLTXCTRL1_RDMAEN; + } + + /* Set injected parameters */ + if(DSMU_FilterInitStruct->InjectedParam.Trigger == DSMU_FILTER_EXT_TRIGGER) + { + tReg |= DSMU_FilterInitStruct->InjectedParam.ExtTrigger; + } + + if(DSMU_FilterInitStruct->InjectedParam.ScanMode != DISABLE) + { + tReg |= DSMU_FLTXCTRL1_JSCAN; + } + + if(DSMU_FilterInitStruct->InjectedParam.DmaMode != DISABLE) + { + tReg |= DSMU_FLTXCTRL1_JDMAEN; + } + + /* Write register */ + DSMU_Filterx->FLTCTRL1 = tReg; + + /* Set filter parameters */ + tReg = DSMU_Filterx->FLTFCTRL; + tReg &= ~(DSMU_FLTXFCTRL_FORD | DSMU_FLTXFCTRL_FOSR | DSMU_FLTXFCTRL_IOSR); + tReg |= ( DSMU_FilterInitStruct->FilterParam.SincOrder \ + | ((DSMU_FilterInitStruct->FilterParam.Oversampling - 1U) << REG_BIT16_OFFSET) \ + | (DSMU_FilterInitStruct->FilterParam.IntOversampling - 1U)); + DSMU_Filterx->FLTFCTRL = tReg; + + /* Enable DSMU filter */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_DFLTEN; + } + + return status; +} + +/** +*\*\name DSMU_InitFilterStruct. +*\*\fun Set the initialize structure of DSMU filter to default value. +*\*\param DSMU_FilterInitStruct +*\*\ - RegularParam: +*\*\ - DmaMode +*\*\ - FastMode +*\*\ - Trigger +*\*\ - InjectedParam: +*\*\ - ScanMode +*\*\ - DmaMode +*\*\ - Trigger +*\*\ - ExtTrigger +*\*\ - FilterParam: +*\*\ - SincOrder +*\*\ - Oversampling +*\*\ - IntOversampling +*\*\return none. +**/ +void DSMU_InitFilterStruct(DSMU_Filter_InitType* DSMU_FilterInitStruct) +{ + DSMU_FilterInitStruct->RegularParam.Trigger = DSMU_FILTER_SW_TRIGGER; + DSMU_FilterInitStruct->RegularParam.FastMode = DISABLE; + DSMU_FilterInitStruct->RegularParam.DmaMode = DISABLE; + + DSMU_FilterInitStruct->InjectedParam.Trigger = DSMU_FILTER_SW_TRIGGER; + DSMU_FilterInitStruct->InjectedParam.ScanMode = DISABLE; + DSMU_FilterInitStruct->InjectedParam.DmaMode = DISABLE; + DSMU_FilterInitStruct->InjectedParam.ExtTrigger = DSMU_FILTER_EXT_TRIG_ATIM1_TRGO; + + DSMU_FilterInitStruct->FilterParam.SincOrder = DSMU_FILTER_FASTSINC_ORDER; + DSMU_FilterInitStruct->FilterParam.Oversampling = 1U; + DSMU_FilterInitStruct->FilterParam.IntOversampling = 1U; +} + +/** +*\*\name DSMU_FilterEnable. +*\*\fun Enable or Disable the DSMU filter. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return None. +**/ +void DSMU_FilterEnable(DSMU_Filter_Submodule* DSMU_Filterx, FunctionalState Cmd) +{ + if( Cmd != DISABLE) + { + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_DFLTEN; + } + else + { + DSMU_Filterx->FLTCTRL1 &= ~(DSMU_FLTXCTRL1_DFLTEN); + } +} + +/** +*\*\name DSMU_FilterConfigRegChannel. +*\*\fun This function allows to select regular channel and +*\*\ config continuous mode for regular conversion. +*\*\param DSMU_Filterx: +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param ChannelSelect: +*\*\ - DSMU_CHANNEL_SELECT_0 +*\*\ - DSMU_CHANNEL_SELECT_1 +*\*\ - DSMU_CHANNEL_SELECT_2 +*\*\ - DSMU_CHANNEL_SELECT_3 +*\*\ - DSMU_CHANNEL_SELECT_4 +*\*\ - DSMU_CHANNEL_SELECT_5 +*\*\ - DSMU_CHANNEL_SELECT_6 +*\*\ - DSMU_CHANNEL_SELECT_7 +*\*\param ContinuousMode Enable/disable continuous mode for regular conversion. +*\*\ - DSMU_CONTINUOUS_CONV_OFF +*\*\ - DSMU_CONTINUOUS_CONV_ON +*\*\return none +**/ +void DSMU_FilterConfigRegChannel(DSMU_Filter_Submodule* DSMU_Filterx, + uint32_t ChannelSelect, + uint32_t ContinuousMode) +{ + /* Configure channel and continuous mode for regular conversion */ + DSMU_Filterx->FLTCTRL1 &= ~(DSMU_FLTXCTRL1_RCH | DSMU_FLTXCTRL1_RCONT); + DSMU_Filterx->FLTCTRL1 |= ((ChannelSelect & DSMU_FLTXCTRL1_RCH) | ContinuousMode); +} + +/** +*\*\name DSMU_FilterConfigInjChannel. +*\*\fun This function allows to select channels for injected conversion. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param ChannelSelect: +*\*\ - DSMU_CHANNEL_SELECT_0 +*\*\ - DSMU_CHANNEL_SELECT_1 +*\*\ - DSMU_CHANNEL_SELECT_2 +*\*\ - DSMU_CHANNEL_SELECT_3 +*\*\ - DSMU_CHANNEL_SELECT_4 +*\*\ - DSMU_CHANNEL_SELECT_5 +*\*\ - DSMU_CHANNEL_SELECT_6 +*\*\ - DSMU_CHANNEL_SELECT_7 +*\*\return none +**/ +void DSMU_FilterConfigInjChannel(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t ChannelSelect) +{ + /* Configure channel for injected conversion */ + DSMU_Filterx->FLTJCHG = (ChannelSelect & DSMU_FLTXJCHG_JCHG); +} + +/** +*\*\name DSMU_FilterGetRegularValue. +*\*\fun This function allows to get regular conversion value. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param Channel Corresponding channel number of regular conversion. +*\*\return Regular conversion value +**/ +int32_t DSMU_FilterGetRegularValue(const DSMU_Filter_Submodule* DSMU_Filterx, + uint32_t* Channel) +{ + uint32_t reg; + int32_t value; + + /* Get value of data register for regular channel */ + reg = DSMU_Filterx->FLTRDATA; + + /* Extract channel and regular conversion value */ + *Channel = (reg & DSMU_FLTXRDAT_RDATCH); + + /* Regular conversion value is a signed value located on 24 MSB of register */ + /* So after applying a mask on these bits we have to perform a division by 256 (2 raised to the power of 8) */ + reg &= DSMU_FLTXRDAT_RDAT; + value = ((int32_t)reg) / 256; + + /* return regular conversion value */ + return value; +} + +/** +*\*\name DSMU_FilterGetInjectedValue. +*\*\fun This function allows to get injected conversion value. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param Channel Corresponding channel number of injected conversion. +*\*\return Injected conversion value +**/ +int32_t DSMU_FilterGetInjectedValue(const DSMU_Filter_Submodule* DSMU_Filterx, + uint32_t* Channel) +{ + uint32_t reg; + int32_t value; + + /* Get value of data register for injected channel */ + reg = DSMU_Filterx->FLTJDATA; + + /* Extract channel and injected conversion value */ + *Channel = (reg & DSMU_FLTXJDAT_JDATCH); + + /* Injected conversion value is a signed value located on 24 MSB of register */ + /* So after applying a mask on these bits we have to perform a division by 256 (2 raised to the power of 8) */ + reg &= DSMU_FLTXJDAT_JDAT; + value = ((int32_t)reg) / 256; + + /* return regular conversion value */ + return value; +} + +/** +*\*\name DSMU_FilterAwdStart. +*\*\fun This function allows to start filter analog watchdog. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param awdParam DSMU filter analog watchdog parameters. +*\*\ - DataSource: +*\*\ - DSMU_FILTER_AWD_FILTER_DATA +*\*\ - DSMU_FILTER_AWD_CHANNEL_DATA +*\*\ - ChannelSelect: +*\*\ - DSMU_CHANNEL_SELECT_0 +*\*\ - DSMU_CHANNEL_SELECT_1 +*\*\ - DSMU_CHANNEL_SELECT_2 +*\*\ - DSMU_CHANNEL_SELECT_3 +*\*\ - DSMU_CHANNEL_SELECT_4 +*\*\ - DSMU_CHANNEL_SELECT_5 +*\*\ - DSMU_CHANNEL_SELECT_6 +*\*\ - DSMU_CHANNEL_SELECT_7 +*\*\ - HighThreshold: +*\*\ - This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607. +*\*\ - LowThreshold: +*\*\ - This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607. +*\*\ - HighBreakSignal: +*\*\ - DSMU_NO_BREAK_SIGNAL +*\*\ - DSMU_BREAK_SIGNAL_0 +*\*\ - DSMU_BREAK_SIGNAL_1 +*\*\ - DSMU_BREAK_SIGNAL_2 +*\*\ - DSMU_BREAK_SIGNAL_3 +*\*\ - LowBreakSignal: +*\*\ - DSMU_NO_BREAK_SIGNAL +*\*\ - DSMU_BREAK_SIGNAL_0 +*\*\ - DSMU_BREAK_SIGNAL_1 +*\*\ - DSMU_BREAK_SIGNAL_2 +*\*\ - DSMU_BREAK_SIGNAL_3 +*\*\return none +**/ +void DSMU_FilterAwdStart(DSMU_Filter_Submodule* DSMU_Filterx, + DSMU_Filter_AwdParamType* awdParam) +{ + uint32_t tReg; + + /* Set analog watchdog data source */ + tReg = DSMU_Filterx->FLTCTRL1; + tReg &= ~(DSMU_FLTXCTRL1_AWDFSEL); + tReg |= awdParam->DataSource; + DSMU_Filterx->FLTCTRL1 = tReg; + + /* Set thresholds and break signals */ + tReg = DSMU_Filterx->FLTAWDHT; + tReg &= ~(DSMU_FLTXAWDHT_AWDHT | DSMU_FLTXAWDHT_BKAWDHT); + tReg |= (((uint32_t) awdParam->HighThreshold << REG_BIT8_OFFSET) \ + | awdParam->HighBreakSignal ); + DSMU_Filterx->FLTAWDHT = tReg; + + tReg = DSMU_Filterx->FLTAWDLT; + tReg &= ~(DSMU_FLTXAWDLT_AWDLT | DSMU_FLTXAWDLT_BKAWDLT); + tReg |= (((uint32_t) awdParam->LowThreshold << REG_BIT8_OFFSET) \ + | awdParam->LowBreakSignal ); + DSMU_Filterx->FLTAWDLT = tReg; + + /* Set channels and interrupt for analog watchdog */ + tReg = DSMU_Filterx->FLTCTRL2; + tReg &= ~(DSMU_FLTXCTRL2_AWDCH); + tReg |= (awdParam->ChannelSelect & DSMU_FLTXCTRL2_AWDCH); + DSMU_Filterx->FLTCTRL2 = tReg; +} + +/** +*\*\name DSMU_FilterAwdStop. +*\*\fun This function allows to stop filter analog watchdog. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\return none +**/ +void DSMU_FilterAwdStop(DSMU_Filter_Submodule* DSMU_Filterx) +{ + /* Reset channels for analog watchdog and deactivate interrupt */ + DSMU_Filterx->FLTCTRL2 &= ~(DSMU_FLTXCTRL2_AWDCH); + + /* Clear all analog watchdog flags */ + DSMU_Filterx->FLTAWDCLR = (DSMU_FLTXAWDCLR_CLRAWDHTF | DSMU_FLTXAWDCLR_CLRAWDLTF); + + /* Reset thresholds and break signals */ + DSMU_Filterx->FLTAWDHT &= ~(DSMU_FLTXAWDHT_AWDHT | DSMU_FLTXAWDHT_BKAWDHT); + DSMU_Filterx->FLTAWDLT &= ~(DSMU_FLTXAWDLT_AWDLT | DSMU_FLTXAWDLT_BKAWDLT); + + /* Reset analog watchdog data source */ + DSMU_Filterx->FLTCTRL1 &= ~(DSMU_FLTXCTRL1_AWDFSEL); +} + +/** +*\*\name DSMU_FilterExdStart. +*\*\fun This function allows to start extreme detector feature. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param ChannelSelect: +*\*\ - DSMU_CHANNEL_SELECT_0 +*\*\ - DSMU_CHANNEL_SELECT_1 +*\*\ - DSMU_CHANNEL_SELECT_2 +*\*\ - DSMU_CHANNEL_SELECT_3 +*\*\ - DSMU_CHANNEL_SELECT_4 +*\*\ - DSMU_CHANNEL_SELECT_5 +*\*\ - DSMU_CHANNEL_SELECT_6 +*\*\ - DSMU_CHANNEL_SELECT_7 +*\*\return none +**/ +void DSMU_FilterExdStart(DSMU_Filter_Submodule* DSMU_Filterx, + uint32_t ChannelSelect) +{ + uint32_t tReg; + + /* Set channels for extreme detector */ + tReg = DSMU_Filterx->FLTCTRL2; + tReg &= ~(DSMU_FLTXCTRL2_EXDETCH); + tReg |= (ChannelSelect & DSMU_FLTXCTRL2_EXDETCH); + DSMU_Filterx->FLTCTRL2 = tReg; +} + +/** +*\*\name DSMU_FilterExdStop. +*\*\fun This function allows to stop extreme detector feature. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\return none +**/ +void DSMU_FilterExdStop(DSMU_Filter_Submodule* DSMU_Filterx) +{ + __IO uint32_t reg1; + __IO uint32_t reg2; + + /* Reset channels for extreme detector */ + DSMU_Filterx->FLTCTRL2 &= ~(DSMU_FLTXCTRL2_EXDETCH); + + /* Clear extreme detector values */ + reg1 = DSMU_Filterx->FLTEXDETMAX; + reg2 = DSMU_Filterx->FLTEXDETMIN; + (void)(reg1); /* To avoid GCC warning */ + (void)(reg2); /* To avoid GCC warning */ +} + +/** +*\*\name DSMU_FilterGetExdMaxValue. +*\*\fun This function allows to get extreme detector maximum value. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param Channel Corresponding channel. +*\*\return Extreme detector maximum value +*\*\ - This value is between Min_Data = -8388608 and Max_Data = 8388607. +**/ +int32_t DSMU_FilterGetExdMaxValue(const DSMU_Filter_Submodule* DSMU_Filterx, + uint32_t* Channel) +{ + uint32_t reg; + int32_t value; + + /* Get value of extreme detector maximum register */ + reg = DSMU_Filterx->FLTEXDETMAX; + + /* Extract channel and extreme detector maximum value */ + *Channel = (reg & DSMU_FLTXEXDETMAX_EXDETMAXCH); + + /* Extreme detector maximum value is a signed value located on 24 MSB of register */ + /* So after applying a mask on these bits we have to perform a division by 256 (2 raised to the power of 8) */ + reg &= DSMU_FLTXEXDETMAX_EXDETMAX; + value = ((int32_t)reg) / 256; + + /* return extreme detector maximum value */ + return value; +} + +/** +*\*\name DSMU_FilterGetExdMinValue. +*\*\fun This function allows to get extreme detector minimum value. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param Channel Corresponding channel. +*\*\return Extreme detector minimum value +*\*\ - This value is between Min_Data = -8388608 and Max_Data = 8388607. +**/ +int32_t DSMU_FilterGetExdMinValue(const DSMU_Filter_Submodule* DSMU_Filterx, + uint32_t* Channel) +{ + uint32_t reg; + int32_t value; + + /* Get value of extreme detector minimum register */ + reg = DSMU_Filterx->FLTEXDETMIN; + + /* Extract channel and extreme detector minimum value */ + *Channel = (reg & DSMU_FLTXEXDETMIN_EXDETMINCH); + + /* Extreme detector minimum value is a signed value located on 24 MSB of register */ + /* So after applying a mask on these bits we have to perform a division by 256 (2 raised to the power of 8) */ + reg &= DSMU_FLTXEXDETMIN_EXDETMIN; + value = ((int32_t)reg) / 256; + + /* return extreme detector minimum value */ + return value; +} + +/** +*\*\name DSMU_FilterGetConvTimeValue. +*\*\fun This function allows to get conversion time value. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\return Conversion time value +*\*\note To get time in second, this value has to be divided by DSMU clock frequency. +**/ +uint32_t DSMU_FilterGetConvTimeValue(const DSMU_Filter_Submodule* DSMU_Filterx) +{ + uint32_t reg; + uint32_t value; + + /* Get value of conversion timer register */ + reg = DSMU_Filterx->FLTCOVTIM; + + /* Extract conversion time value */ + value = ((reg & DSMU_FLTXCOVTIM_COVCNT) >> REG_BIT4_OFFSET); + + /* return extreme detector minimum value */ + return value; +} + +/** +*\*\name DSMU_RegConvStart. +*\*\fun This function allows to really start regular conversion. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param Trigger +*\*\ - DSMU_FILTER_SW_TRIGGER +*\*\ - DSMU_FILTER_SYNC_TRIGGER +*\*\return None +**/ +void DSMU_RegConvStart(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger) +{ + /* Check regular trigger */ + if(Trigger == DSMU_FILTER_SYNC_TRIGGER) /* Synchronous with DSMU_FLT0 */ + { + /* DSMU filter0 can not be start with synchronous triger */ + if(DSMU_Filterx != DSMU_Filter0) + { + /* Disable DSMU filter */ + DSMU_Filterx->FLTCTRL1 &= ~(DSMU_FLTXCTRL1_DFLTEN); + + /* Set RSYNC bit in DSMU_FLTXCTRL1 register */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_RSYNC; + + /* Enable DSMU filter */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_DFLTEN; + } + } + else /* Software trigger */ + { + /* Enable DSMU filter */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_DFLTEN; + + /* Software start of regular conversion */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_RSWSTART; + } +} + +/** +*\*\name DSMU_RegConvStop. +*\*\fun This function allows to really stop regular conversion. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param Trigger +*\*\ - DSMU_FILTER_SW_TRIGGER +*\*\ - DSMU_FILTER_SYNC_TRIGGER +*\*\return None +**/ +void DSMU_RegConvStop(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger) +{ + /* Disable DSMU filter */ + DSMU_Filterx->FLTCTRL1 &= ~(DSMU_FLTXCTRL1_DFLTEN); + + /* If regular trigger was synchronous, reset RSYNC bit in DSMU_FLTXCTRL1 register */ + if(Trigger == DSMU_FILTER_SYNC_TRIGGER) + { + DSMU_Filterx->FLTCTRL1 &= ~(DSMU_FLTXCTRL1_RSYNC); + } + + /* Enable DSMU filter */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_DFLTEN; +} + +/** +*\*\name DSMU_InjConvStart. +*\*\fun This function allows to really start injected conversion. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param Trigger +*\*\ - DSMU_FILTER_SW_TRIGGER +*\*\ - DSMU_FILTER_SYNC_TRIGGER +*\*\ - DSMU_FILTER_EXT_TRIGGER +*\*\param TiggerEdge +*\*\ - DSMU_FILTER_EXT_TRIG_DISABLE +*\*\ - DSMU_FILTER_EXT_TRIG_RISING_EDGE +*\*\ - DSMU_FILTER_EXT_TRIG_FALLING_EDGE +*\*\ - DSMU_FILTER_EXT_TRIG_BOTH_EDGES +*\*\return None +**/ +void DSMU_InjConvStart(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger, uint32_t TiggerEdge) +{ + uint32_t tReg; + + /* Check injected trigger */ + if(Trigger == DSMU_FILTER_SW_TRIGGER) + { + /* Enable DSMU filter */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_DFLTEN; + + /* Software start of injected conversion */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_JSWSTART; + } + else /* external or synchronous trigger */ + { + /* Disable DSMU filter */ + DSMU_Filterx->FLTCTRL1 &= ~(DSMU_FLTXCTRL1_DFLTEN); + + /* Get current register value*/ + tReg = DSMU_Filterx->FLTCTRL1; + + /* Clear JSYNC and JEXTEN[1:0] bits first */ + tReg &= ~(DSMU_FLTXCTRL1_JEXTEN | DSMU_FLTXCTRL1_JSYNC); + + /* Config JSYNC and JEXTEN[1:0] as expected */ + if(Trigger == DSMU_FILTER_SYNC_TRIGGER) + { + /* Set JSYNC bit in DSMU_FLTXCTRL1 register */ + tReg |= DSMU_FLTXCTRL1_JSYNC; + } + else /* external trigger */ + { + /* Set JEXTEN[1:0] bits in DSMU_FLTXCTRL1 register */ + tReg |= TiggerEdge; + } + + /* Write back */ + DSMU_Filterx->FLTCTRL1 = tReg; + + /* Enable DSMU filter */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_DFLTEN; + } +} + +/** +*\*\name DSMU_InjConvStop. +*\*\fun This function allows to really stop injected conversion. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param Trigger +*\*\ - DSMU_FILTER_SW_TRIGGER +*\*\ - DSMU_FILTER_SYNC_TRIGGER +*\*\ - DSMU_FILTER_EXT_TRIGGER +*\*\return None +**/ +void DSMU_InjConvStop(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t Trigger) +{ + /* Disable DSMU filter */ + DSMU_Filterx->FLTCTRL1 &= ~(DSMU_FLTXCTRL1_DFLTEN); + + /* If injected trigger was synchronous, reset JSYNC bit in DSMU_FLTXCTRL1 register */ + if(Trigger == DSMU_FILTER_SYNC_TRIGGER) + { + DSMU_Filterx->FLTCTRL1 &= ~(DSMU_FLTXCTRL1_JSYNC); + } + else if(Trigger == DSMU_FILTER_EXT_TRIGGER) + { + /* Reset JEXTEN[1:0] bits in DSMU_FLTXCTRL1 register */ + DSMU_Filterx->FLTCTRL1 &= ~(DSMU_FLTXCTRL1_JEXTEN); + } + else + { + /* Nothing to do */ + } + + /* Enable DSMU filter */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_DFLTEN; +} + +/** +*\*\name DSMU_GetFlagStatus. +*\*\fun Checks whether the DSMU flag has set or not. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param DSMU_Flag: +*\*\ This parameter must be one of the following: +*\*\ - DSMU_FLAG_SHORT_CIRCUIT_CH0 +*\*\ - DSMU_FLAG_SHORT_CIRCUIT_CH1 +*\*\ - DSMU_FLAG_SHORT_CIRCUIT_CH2 +*\*\ - DSMU_FLAG_SHORT_CIRCUIT_CH3 +*\*\ - DSMU_FLAG_SHORT_CIRCUIT_CH4 +*\*\ - DSMU_FLAG_SHORT_CIRCUIT_CH5 +*\*\ - DSMU_FLAG_SHORT_CIRCUIT_CH6 +*\*\ - DSMU_FLAG_SHORT_CIRCUIT_CH7 +*\*\ - DSMU_FLAG_CLOCK_ABSENCE_CH0 +*\*\ - DSMU_FLAG_CLOCK_ABSENCE_CH1 +*\*\ - DSMU_FLAG_CLOCK_ABSENCE_CH2 +*\*\ - DSMU_FLAG_CLOCK_ABSENCE_CH3 +*\*\ - DSMU_FLAG_CLOCK_ABSENCE_CH4 +*\*\ - DSMU_FLAG_CLOCK_ABSENCE_CH5 +*\*\ - DSMU_FLAG_CLOCK_ABSENCE_CH6 +*\*\ - DSMU_FLAG_CLOCK_ABSENCE_CH7 +*\*\ - DSMU_FLAG_REGULAR_ACTIVE +*\*\ - DSMU_FLAG_INJECT_ACTIVE +*\*\ - DSMU_FLAG_ANALOG_WATCHDOG +*\*\ - DSMU_FLAG_REGULAR_OVERRUN +*\*\ - DSMU_FLAG_INJECT_OVERRUN +*\*\ - DSMU_FLAG_REGULAR_END +*\*\ - DSMU_FLAG_INJECT_END +*\*\return FlagStatus: +*\*\ - SET +*\*\ - RESET +*\*\note: DSMU_FLAG_SHORT_CIRCUIT_CH0~7 and DSMU_FLAG_CLOCK_ABSENCE_CH0~7 only exist in DSMU_Filter0->FLTSTS. +**/ +FlagStatus DSMU_GetFlagStatus(DSMU_Filter_Submodule* DSMU_Filterx, + uint32_t DSMU_Flag) +{ + FlagStatus bitstatus; + uint32_t tFLTSTS; + + if(DSMU_Flag > DSMU_FLAG_REGULAR_ACTIVE) + { + tFLTSTS = DSMU_Filter0->FLTSTS; + } + else + { + tFLTSTS = DSMU_Filterx->FLTSTS; + } + + if ((tFLTSTS & DSMU_Flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** +*\*\name DSMU_ClearFlag. +*\*\fun Clears flags of the specified DSMU. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param DSMU_FlagClear : +*\*\ This parameter must be one of the following: +*\*\ - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH0 +*\*\ - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH1 +*\*\ - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH2 +*\*\ - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH3 +*\*\ - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH4 +*\*\ - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH5 +*\*\ - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH6 +*\*\ - DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH7 +*\*\ - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH0 +*\*\ - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH1 +*\*\ - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH2 +*\*\ - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH3 +*\*\ - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH4 +*\*\ - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH5 +*\*\ - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH6 +*\*\ - DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH7 +*\*\ - DSMU_CLEAR_FLAG_REGULAR_OVERRUN +*\*\ - DSMU_CLEAR_FLAG_INJECT_OVERRUN +*\*\return none. +*\*\note: DSMU_CLEAR_FLAG_SHORT_CIRCUIT_CH0~7 and DSMU_CLEAR_FLAG_CLOCK_ABSENCE_CH0~7 only exist in DSMU_Filter0->FLTINTCLR. +**/ +void DSMU_ClearFlag(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_FlagClear) +{ + __IO uint32_t *pINTCLR; + + if(DSMU_FlagClear > DSMU_CLEAR_FLAG_REGULAR_OVERRUN) + { + pINTCLR = &(DSMU_Filter0->FLTINTCLR); + } + else + { + pINTCLR = &(DSMU_Filterx->FLTINTCLR); + } + + /* Clear the selected DSMU flags */ + *pINTCLR = (DSMU_FlagClear & DSMU_CLEAR_FLAG_ALL); +} + +/** +*\*\name DSMU_GetAwdFlagStatus. +*\*\fun Checks whether the DSMU analog watchdog flag has set or not. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param DSMU_AwdFlag : +*\*\ - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH0 +*\*\ - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH1 +*\*\ - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH2 +*\*\ - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH3 +*\*\ - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH4 +*\*\ - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH5 +*\*\ - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH6 +*\*\ - DSMU_AWD_FLAG_HIGH_THRESHLOD_CH7 +*\*\ - DSMU_AWD_FLAG_LOW_THRESHOLD_CH0 +*\*\ - DSMU_AWD_FLAG_LOW_THRESHOLD_CH1 +*\*\ - DSMU_AWD_FLAG_LOW_THRESHOLD_CH2 +*\*\ - DSMU_AWD_FLAG_LOW_THRESHOLD_CH3 +*\*\ - DSMU_AWD_FLAG_LOW_THRESHOLD_CH4 +*\*\ - DSMU_AWD_FLAG_LOW_THRESHOLD_CH5 +*\*\ - DSMU_AWD_FLAG_LOW_THRESHOLD_CH6 +*\*\ - DSMU_AWD_FLAG_LOW_THRESHOLD_CH7 +*\*\return FlagStatus: +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus DSMU_GetAwdFlagStatus(DSMU_Filter_Submodule* DSMU_Filterx, + uint32_t DSMU_AwdFlag) +{ + FlagStatus bitstatus; + + if ((DSMU_Filterx->FLTAWDSTS & DSMU_AwdFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name DSMU_ClearAwdFlag. +*\*\fun Clears analog watch dog flag of the specified DSMU. +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param DSMU_AwdFlagClear : +*\*\ - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH0 +*\*\ - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH1 +*\*\ - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH2 +*\*\ - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH3 +*\*\ - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH4 +*\*\ - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH5 +*\*\ - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH6 +*\*\ - DSMU_CLEAR_AWD_FLAG_HIGH_THRESHLOD_CH7 +*\*\ - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH0 +*\*\ - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH1 +*\*\ - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH2 +*\*\ - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH3 +*\*\ - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH4 +*\*\ - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH5 +*\*\ - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH6 +*\*\ - DSMU_CLEAR_AWD_FLAG_LOW_THRESHOLD_CH7 +*\*\return none. +**/ +void DSMU_ClearAwdFlag(DSMU_Filter_Submodule* DSMU_Filterx, uint32_t DSMU_AwdFlagClear) +{ + /* Clear the selected DSMU watch dog flag */ + DSMU_Filterx->FLTAWDCLR = (DSMU_AwdFlagClear & DSMU_CLEAR_AWD_FLAG_ALL); +} + +/** +*\*\name DSMU_ConfigInt +*\*\fun Enables or disables interrupt +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param DSMU_Int: +*\*\ This parameter must be one of the following: +*\*\ - DSMU_INT_CLOCK_ABSENCE +*\*\ - DSMU_INT_SHORT_CIRCUIT +*\*\ - DSMU_INT_ANALOG_WATCHDOG +*\*\ - DSMU_INT_REGULAR_OVERRUN +*\*\ - DSMU_INT_INJECT_OVERRUN +*\*\ - DSMU_INT_REGULAR_END +*\*\ - DSMU_INT_INJECT_END +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note: DSMU_INT_CLOCK_ABSENCE and DSMU_INT_SHORT_CIRCUIT only exist in DSMU_Filter0->FLTCTRL2. +**/ +void DSMU_ConfigInt(DSMU_Filter_Submodule* DSMU_Filterx, + uint32_t DSMU_Int, FunctionalState Cmd) +{ + __IO uint32_t *pCTRL2; + + if(DSMU_Int > DSMU_INT_ANALOG_WATCHDOG) + { + pCTRL2 = &(DSMU_Filter0->FLTCTRL2); + } + else + { + pCTRL2 = &(DSMU_Filterx->FLTCTRL2); + } + + if (Cmd != DISABLE) + { + /* Enable the Interrupt sources */ + *pCTRL2 |= DSMU_Int; + } + else + { + /* Disable the Interrupt sources */ + *pCTRL2 &= (~DSMU_Int); + } +} + +/** +*\*\name DSMU_ConfigRegChDMA +*\*\fun Enables or disables regular channel DMA +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DSMU_ConfigRegChDMA(DSMU_Filter_Submodule* DSMU_Filterx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the Interrupt sources */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_RDMAEN; + } + else + { + /* Disable the Interrupt sources */ + DSMU_Filterx->FLTCTRL1 &= (~DSMU_FLTXCTRL1_RDMAEN); + } +} + +/** +*\*\name DSMU_ConfigInjChDMA +*\*\fun Enables or disables injected channel DMA +*\*\param DSMU_Filterx +*\*\ - DSMU_Filter0 +*\*\ - DSMU_Filter1 +*\*\ - DSMU_Filter2 +*\*\ - DSMU_Filter3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DSMU_ConfigInjChDMA(DSMU_Filter_Submodule* DSMU_Filterx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the Interrupt sources */ + DSMU_Filterx->FLTCTRL1 |= DSMU_FLTXCTRL1_JDMAEN; + } + else + { + /* Disable the Interrupt sources */ + DSMU_Filterx->FLTCTRL1 &= (~DSMU_FLTXCTRL1_JDMAEN); + } +} + +/** +*\*\fun This function allows to get the channel number from channel instance. +*\*\param DSMU_Channely +*\*\ - DSMU_Channel0 +*\*\ - DSMU_Channel1 +*\*\ - DSMU_Channel2 +*\*\ - DSMU_Channel3 +*\*\ - DSMU_Channel4 +*\*\ - DSMU_Channel5 +*\*\ - DSMU_Channel6 +*\*\ - DSMU_Channel7 +*\*\return Channel number. +**/ +static uint32_t DSMU_GetChannelNumber(const DSMU_Channel_Submodule* DSMU_Channely) +{ + uint32_t ChannelNum; + + /* Get channel from instance */ + if(DSMU_Channely == DSMU_Channel0) + { + ChannelNum = 0; + } + else if(DSMU_Channely == DSMU_Channel1) + { + ChannelNum = 1; + } + else if(DSMU_Channely == DSMU_Channel2) + { + ChannelNum = 2; + } + else if(DSMU_Channely == DSMU_Channel3) + { + ChannelNum = 3; + } + else if(DSMU_Channely == DSMU_Channel4) + { + ChannelNum = 4; + } + else if(DSMU_Channely == DSMU_Channel5) + { + ChannelNum = 5; + } + else if(DSMU_Channely == DSMU_Channel6) + { + ChannelNum = 6; + } + else /* DSMU_Channel7 */ + { + ChannelNum = 7; + } + + return ChannelNum; +} + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dvp.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dvp.c new file mode 100644 index 0000000000..327f58fd85 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_dvp.c @@ -0,0 +1,1169 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_dvp.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_dvp.h" +#include "n32h76x_78x_rcc.h" + +/** +*\*\name DVP_DeInit. +*\*\fun Deinitializes the DVP peripheral registers to their default reset values. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\return none +**/ +void DVP_DeInit(DVP_Module *DVPx) +{ + if(DVPx == DVP1) + { + RCC_EnableAXIPeriphReset2(RCC_AXI_PERIPHRST_DVP1); + } + else + { + RCC_EnableAXIPeriphReset2(RCC_AXI_PERIPHRST_DVP2); + } +} + +/** +*\*\name DVP_Init. +*\*\fun Initializes the DVP peripheral according to the specified +*\*\ parameters in the DVP_InitParam . +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param DVP_InitParam (The input parameters must be the following values): +*\*\ - CaptureMode +*\*\ - DVP_CAPTURE_MODE_CONTINUE +*\*\ - DVP_CAPTURE_MODE_SINGLE +*\*\ - CropMode +*\*\ - DVP_NORMAL_MODE +*\*\ - DVP_CROP_MODE +*\*\ - SynchroMode +*\*\ - DVP_SYNC_MODE_SOFTWARE +*\*\ - DVP_SYNC_MODE_HARDWARE +*\*\ - CropStartX +*\*\ - CropStartY +*\*\ - CropEndX +*\*\ - CropEndY +*\*\ - BFilter +*\*\ - PixelClkPolarity +*\*\ - DVP_PIXEL_POLARITY_RISING +*\*\ - DVP_PIXEL_POLARITY_FALLING +*\*\ - HsyncPolarity +*\*\ - DVP_HSYNC_POLARITY_HIGH +*\*\ - DVP_HSYNC_POLARITY_LOW +*\*\ - VsyncPolarity +*\*\ - DVP_VSYNC_POLARITY_HIGH +*\*\ - DVP_VSYNC_POLARITY_LOW +*\*\ - DataInvert +*\*\ - DVP_DATA_INVERT +*\*\ - DVP_DATA_NOTINVERT +*\*\ - DataReverse +*\*\ - DVP_DATA_REVERSE +*\*\ - DVP_DATA_NOTREVERSE +*\*\ - DataMode +*\*\ - DVP_DATA_MODE1 +*\*\ - DVP_DATA_MODE2 +*\*\ - DVP_DATA_MODE3 +*\*\ - DVP_DATA_MODE4 +*\*\ - DVP_DATA_MODE5 +*\*\ - DVP_DATA_MODE6 +*\*\ - DVP_DATA_MODE7 +*\*\ - DVP_DATA_MODE8 +*\*\ - PixelByte +*\*\ - DVP_PIXEL_BYTE1 +*\*\ - DVP_PIXEL_BYTE2 +*\*\return none +**/ +void DVP_Init(DVP_Module *DVPx, DVP_InitType* DVP_InitParam) +{ + uint32_t tmpregister; + uint32_t tmp; + + if(DVP_InitParam->CropMode == DVP_CROP_MODE) + { + /*---------------------------- DVP_CSXY Configuration -----------------------*/ + tmp = ((uint32_t)DVP_InitParam->CropStartY << 16) | DVP_InitParam->CropStartX; + DVPx->CSXY = tmp; + /*---------------------------- DVP_CEXY Configuration -----------------------*/ + tmp = ((uint32_t)DVP_InitParam->CropEndY << 16) | DVP_InitParam->CropEndX; + DVPx->CEXY = tmp; + } + + /*---------------------------- DVP_CTRL Configuration -----------------------*/ + tmpregister = DVPx->CTRL; + tmpregister = tmpregister & DVP_VBFLT_MASK & DVP_CAPTURE_MODE_MASK & DVP_CROP_MODE_MASK; + tmpregister |= ((uint32_t)DVP_InitParam->VBFilter << 28) | DVP_InitParam->CaptureMode | DVP_InitParam->CropMode; + DVPx->CTRL = tmpregister; + + /*---------------------------- DVP_PORTCFG Configuration -----------------------*/ + tmp = DVPx->PORTCFG; + tmp |= DVP_InitParam->PixelClkPolarity | DVP_InitParam->HsyncPolarity + | DVP_InitParam->VsyncPolarity | DVP_InitParam->DataInvert + | DVP_InitParam->DataReverse | DVP_InitParam->DataMode + | DVP_InitParam->SynchroMode; + + if(DVP_InitParam->CropMode == DVP_CROP_MODE) + { + tmp |= DVP_InitParam->PixelByte; + } + + DVPx->PORTCFG = tmp; + +} + +/** +*\*\name DVP_StructInit. +*\*\fun Initializes the structure parameter of type DVP_InitType used to +*\*\ initialize DVP. This function is usually called before initializing +*\*\ a parameter of type DVP_InitType. +*\*\param DVP_InitParam : +*\*\ - Pointer to the DVP_InitType structure which will be initialized. +*\*\return none +**/ +void DVP_StructInit(DVP_InitType* DVP_InitParam) +{ + /* DVP_InitParam members default value */ + DVP_InitParam->CaptureMode = DVP_CAPTURE_MODE_CONTINUE; + DVP_InitParam->CropMode = DVP_NORMAL_MODE; + DVP_InitParam->SynchroMode = DVP_SYNC_MODE_HARDWARE; + DVP_InitParam->CropStartX = 0; + DVP_InitParam->CropStartY = 0; + DVP_InitParam->CropEndX = 0; + DVP_InitParam->CropEndY = 0; + DVP_InitParam->VBFilter = 8; + DVP_InitParam->PixelClkPolarity = DVP_PIXEL_POLARITY_RISING; + DVP_InitParam->HsyncPolarity = DVP_HSYNC_POLARITY_HIGH; + DVP_InitParam->VsyncPolarity = DVP_VSYNC_POLARITY_LOW; + DVP_InitParam->DataInvert = DVP_DATA_NOTINVERT; + DVP_InitParam->DataReverse = DVP_DATA_NOTREVERSE; + DVP_InitParam->DataMode = DVP_DATA_MODE1; + DVP_InitParam->PixelByte = DVP_PIXEL_BYTE1; + +} + +/** +*\*\name DVP_ConfigDma. +*\*\fun Initializes the structure parameter of type DVP_DMAInitType used to +*\*\ initialize DVP DMA. This function is usually called before initializing +*\*\ a parameter of type DVP_DMAInitType. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param DVP_DMAInitType : +*\*\ - FrameBufferNum +*\*\ - FrameBufferAddress1 +*\*\ - FrameBufferAddress2 +*\*\ - DisplayStatus +*\*\ - DVP_DISPLAY_ADDRESS +*\*\ - DVP_DISPLAY_NUMBER +*\*\ - BurstSize +*\*\ - DVP_BURST_SIZE_BYTE_8 +*\*\ - DVP_BURST_SIZE_BYTE_16 +*\*\ - DVP_BURST_SIZE_BYTE_24 +*\*\ - DVP_BURST_SIZE_BYTE_32 +*\*\ - DVP_BURST_SIZE_BYTE_40 +*\*\ - DVP_BURST_SIZE_BYTE_48 +*\*\ - DVP_BURST_SIZE_BYTE_56 +*\*\ - DVP_BURST_SIZE_BYTE_64 +*\*\ - FifoThreshold +*\*\ - DVP_FIFO_THRSEHOLD_BYTE_8 +*\*\ - DVP_FIFO_THRSEHOLD_BYTE_16 +*\*\ - DVP_FIFO_THRSEHOLD_BYTE_32 +*\*\ - DVP_FIFO_THRSEHOLD_BYTE_64 +*\*\ - DVP_FIFO_THRSEHOLD_BYTE_128 +*\*\ - DVP_FIFO_THRSEHOLD_BYTE_256 +*\*\ - DVP_FIFO_THRSEHOLD_BYTE_512 +*\*\ - DVP_FIFO_THRSEHOLD_BYTE_1024 +*\*\ - FrameBufferSize +*\*\return none +**/ +void DVP_ConfigDma(DVP_Module *DVPx, DVP_DMAInitType* DVP_DMAInitParam) +{ + uint32_t tmpregister; + + /*---------------------------- DVP_FIFOCFG Configuration -----------------------*/ + tmpregister = DVPx->FIFOCFG; + tmpregister &= DVP_DISPLAY_STATUS_MASK & DVP_FIFO_THRSEHOLD_MASK & DVP_BURST_SIZE_MASK; + + tmpregister |= DVP_DMAInitParam->DisplayStatus | DVP_DMAInitParam->FifoThreshold | DVP_DMAInitParam->BurstSize; + DVPx->FIFOCFG = tmpregister; + + /*---------------------------- DVP_FBS Configuration -----------------------*/ + DVPx->FBS = (uint32_t)DVP_DMAInitParam->FrameBufferSize; + + /*---------------------------- DVP_SMADDRx Configuration -----------------------*/ + if(DVP_DMAInitParam->FrameBufferNum == 2u) + { + DVPx->SMADDR1 = DVP_DMAInitParam->FrameBufferAddress1; + DVPx->SMADDR2 = DVP_DMAInitParam->FrameBufferAddress2; + } + else + { + DVPx->SMADDR1 = DVP_DMAInitParam->FrameBufferAddress1; + } + +} + +/** +*\*\name DVP_DMAStructInit. +*\*\fun Initializes the structure parameter of type DVP_DMAInitType used to +*\*\ initialize DVP. This function is usually called before initializing +*\*\ a parameter of type DVP_DMAInitType. +*\*\param DVP_DMAInitParam : +*\*\ - Pointer to the DVP_DMAInitType structure which will be initialized. +*\*\return none +**/ +void DVP_DMAStructInit(DVP_DMAInitType* DVP_DMAInitParam) +{ + + /* DVP_DMAInitParam members default value */ + DVP_DMAInitParam->FrameBufferNum = 1; + DVP_DMAInitParam->FrameBufferAddress1 = 0; + DVP_DMAInitParam->FrameBufferAddress2 = 0; + DVP_DMAInitParam->DisplayStatus = DVP_DISPLAY_NUMBER; + DVP_DMAInitParam->BurstSize = DVP_BURST_SIZE_BYTE_8; + DVP_DMAInitParam->FifoThreshold = DVP_FIFO_THRSEHOLD_BYTE_8; + DVP_DMAInitParam->FrameBufferSize = 32; + +} + + +/** +*\*\name DVP_EnablePort. +*\*\fun DVP interface enable. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DVP_EnablePort(DVP_Module *DVPx, FunctionalState Cmd) +{ + + if (Cmd != DISABLE) + { + /* Enable the DVP by setting ENABLE bit */ + DVPx->CTRL |= DVP_ENABLE; + } + else + { + /* Disable the DVP by clearing ENABLE bit */ + DVPx->INTSTS |= DVP_DISABLE; + } + +} + +/** +*\*\name DVP_EnableCrop. +*\*\fun DVP crop feature enable. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DVP_EnableCrop(DVP_Module *DVPx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the DVP Crop feature */ + DVPx->CTRL |= DVP_CROP_MODE; + } + else + { + /* Disable the DVP Crop feature */ + DVPx->CTRL &= DVP_CROP_MODE_MASK; + } +} + +/** +*\*\name DVP_ConfigVBFLT. +*\*\fun VSYNC blanking glitch filtering control. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Filt:(The input parameters must be the following values) +*\*\ - 0~0xF +*\*\return none +**/ +void DVP_ConfigVBlankFilter(DVP_Module *DVPx, uint8_t Filt) +{ + + uint32_t tmpregister; + tmpregister = DVPx->CTRL; + tmpregister = (uint32_t)(tmpregister & (uint32_t)DVP_VBFLT_MASK); + tmpregister |= (uint32_t)Filt << 28u; + DVPx->CTRL = tmpregister; + +} + +/** +*\*\name DVP_ConfigInt. +*\*\fun DVP interrupts enable. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param DVPInt (The input parameters must be the following values): +*\*\ - DVP_INT_M1S +*\*\ - DVP_INT_M2S +*\*\ - DVP_INT_M1TC +*\*\ - DVP_INT_M2TC +*\*\ - DVP_INT_FO +*\*\ - DVP_INT_AHBERR +*\*\ - DVP_INT_MO +*\*\ - DVP_INT_SKIP +*\*\ - DVP_INT_CERR +*\*\ - DVP_INT_SERR +*\*\ - DVP_INT_FMS +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DVP_ConfigInt(DVP_Module *DVPx, uint32_t DVPInt, FunctionalState Cmd) +{ + + if (Cmd != DISABLE) + { + /* Enable the Interrupt sources */ + DVPx->INTEN |= DVPInt; + } + else + { + /* Disable the Interrupt sources */ + DVPx->INTEN &= ~DVPInt; + } + +} + +/** +*\*\name DVP_GetFlagStatus. +*\*\fun Get DVP flag status. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param DVP_Flag (The input parameters must be the following values): +*\*\ - DVP_FLAG_M1S +*\*\ - DVP_FLAG_M2S +*\*\ - DVP_FLAG_M1TC +*\*\ - DVP_FLAG_M2TC +*\*\ - DVP_FLAG_M1FO +*\*\ - DVP_FLAG_M2FO +*\*\ - DVP_FLAG_AHBERR1 +*\*\ - DVP_FLAG_AHBERR2 +*\*\ - DVP_FLAG_M1O +*\*\ - DVP_FLAG_M2O +*\*\ - DVP_FLAG_SKIP +*\*\ - DVP_FLAG_CERR +*\*\ - DVP_FLAG_SERR +*\*\ - DVP_FLAG_FMS +*\*\return SET or RESET. +**/ +FlagStatus DVP_GetFlagStatus(DVP_Module *DVPx, uint32_t DVP_Flag) +{ + + FlagStatus bitstatus; + uint32_t tmpregister; + + tmpregister = DVPx->INTSTS; + + if ((tmpregister & DVP_Flag) != (uint32_t)RESET ) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Return the DVP_Flag status */ + return bitstatus; + +} + + +/** +*\*\name DVP_ClearFlag. +*\*\fun Clears DVP flag status. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param DVP_Flag (The input parameters must be the following values): +*\*\ - DVP_FLAG_M1S +*\*\ - DVP_FLAG_M2S +*\*\ - DVP_FLAG_M1TC +*\*\ - DVP_FLAG_M2TC +*\*\ - DVP_FLAG_M1FO +*\*\ - DVP_FLAG_M2FO +*\*\ - DVP_FLAG_AHBERR1 +*\*\ - DVP_FLAG_AHBERR2 +*\*\ - DVP_FLAG_M1O +*\*\ - DVP_FLAG_M2O +*\*\ - DVP_FLAG_SKIP +*\*\ - DVP_FLAG_CERR +*\*\ - DVP_FLAG_SERR +*\*\ - DVP_FLAG_FMS +*\*\return none. +**/ +void DVP_ClearFlag(DVP_Module *DVPx, uint32_t DVP_Flag) +{ + + DVPx->INTSTS = DVP_Flag; + +} + +/** +*\*\name DVP_GetIntStatus. +*\*\fun Get DVP interrupt status. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param DVP_Int (The input parameters must be the following values): +*\*\ - DVP_INT_M1S +*\*\ - DVP_INT_M2S +*\*\ - DVP_INT_M1TC +*\*\ - DVP_INT_M2TC +*\*\ - DVP_INT_FO +*\*\ - DVP_INT_AHBERR +*\*\ - DVP_INT_MO +*\*\ - DVP_INT_SKIP +*\*\ - DVP_INT_CERR +*\*\ - DVP_INT_SERR +*\*\ - DVP_INT_FMS +*\*\return SET or RESET. +**/ +INTStatus DVP_GetIntStatus(DVP_Module *DVPx, uint32_t DVP_Int) +{ + + INTStatus bitstatus; + uint32_t intstatus, enablestatus; + + if(DVP_Int == DVP_INT_FO) + { + enablestatus = DVPx->INTEN & DVP_Int; + intstatus = DVPx->INTSTS & (DVP_FLAG_M1FO | DVP_FLAG_M2FO); + } + else if(DVP_Int == DVP_INT_AHBERR) + { + enablestatus = DVPx->INTEN & DVP_Int; + intstatus = DVPx->INTSTS & (DVP_FLAG_AHBERR1 | DVP_FLAG_AHBERR2); + } + else if(DVP_Int == DVP_INT_MO) + { + enablestatus = DVPx->INTEN & DVP_Int; + intstatus = DVPx->INTSTS & (DVP_FLAG_M1O | DVP_FLAG_M2O); + } + else + { + enablestatus = DVPx->INTEN & DVP_Int; + intstatus = DVPx->INTSTS & DVP_Int; + } + + if ((intstatus != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; + +} + +/** +*\*\name DVP_ClrIntPendingBit. +*\*\fun Clear DVP interrupt status bits. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param DVP_Int (The input parameters must be the following values): +*\*\ - DVP_INT_M1S +*\*\ - DVP_INT_M2S +*\*\ - DVP_INT_M1TC +*\*\ - DVP_INT_M2TC +*\*\ - DVP_INT_FO +*\*\ - DVP_INT_AHBERR +*\*\ - DVP_INT_MO +*\*\ - DVP_INT_SKIP +*\*\ - DVP_INT_CERR +*\*\ - DVP_INT_SERR +*\*\ - DVP_INT_FMS +*\*\return none. +**/ +void DVP_ClrIntPendingBit(DVP_Module *DVPx, uint32_t DVP_Int) +{ + + if(DVP_Int == DVP_INT_FO) + { + DVPx->INTSTS = (DVP_FLAG_M1FO | DVP_FLAG_M2FO); + } + else if(DVP_Int == DVP_INT_AHBERR) + { + DVPx->INTSTS = (DVP_FLAG_AHBERR1 | DVP_FLAG_AHBERR2); + } + else if(DVP_Int == DVP_INT_MO) + { + DVPx->INTSTS = (DVP_FLAG_M1O | DVP_FLAG_M2O); + } + else + { + DVPx->INTSTS = DVP_Int; + } + +} + +/** +*\*\name DVP_ConfigPixelClockPolarity. +*\*\fun DVP port pixel clock polarity control. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param PLCK_POL (The input parameters must be the following values): +*\*\ - DVP_PIXEL_POLARITY_RISING +*\*\ - DVP_PIXEL_POLARITY_FALLING +*\*\return none. +**/ +void DVP_ConfigPixelClockPolarity(DVP_Module *DVPx, uint32_t PLCK_POL) +{ + + uint32_t tmpregister; + tmpregister = DVPx->PORTCFG; + tmpregister &= DVP_PIXEL_POLARITY_MASK; + tmpregister |= PLCK_POL; + DVPx->PORTCFG = (uint32_t)tmpregister; + +} + +/** +*\*\name DVP_ConfigHSyncPolarity. +*\*\fun DVP HSYNC polarity control. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param HSYNC_POL (The input parameters must be the following values): +*\*\ - DVP_HSYNC_POLARITY_HIGH +*\*\ - DVP_HSYNC_POLARITY_LOW +*\*\return none. +**/ +void DVP_ConfigHSyncPolarity(DVP_Module *DVPx, uint32_t HSYNC_POL) +{ + + uint32_t tmpregister; + tmpregister = DVPx->PORTCFG; + tmpregister &= DVP_HSYNC_POLARITY_MASK; + tmpregister |= HSYNC_POL; + DVPx->PORTCFG = (uint32_t)tmpregister; + +} + +/** +*\*\name DVP_ConfigVSyncPolarity. +*\*\fun DVP VSYNC polarity control. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param VSYNC_POL (The input parameters must be the following values): +*\*\ - DVP_VSYNC_POLARITY_HIGH +*\*\ - DVP_VSYNC_POLARITY_LOW +*\*\return none. +**/ +void DVP_ConfigVSyncPolarity(DVP_Module *DVPx, uint32_t VSYNC_POL) +{ + + uint32_t tmpregister; + tmpregister = DVPx->PORTCFG; + tmpregister &= DVP_VSYNC_POLARITY_MASK; + tmpregister |= VSYNC_POL; + DVPx->PORTCFG = (uint32_t)tmpregister; + +} + +/** +*\*\name DVP_EnableDataInvert. +*\*\fun DVP data inversion enable. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DVP_EnableDataInvert(DVP_Module *DVPx, FunctionalState Cmd) +{ + + if (Cmd != DISABLE) + { + DVPx->PORTCFG |= (uint32_t)DVP_DATA_INVERT; + } + else + { + DVPx->PORTCFG &= DVP_DATA_INVERT_MASK; + } + +} + +/** +*\*\name DVP_EnableDataReverse. +*\*\fun DVP data Reverse enable. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DVP_EnableDataReverse(DVP_Module *DVPx, FunctionalState Cmd) +{ + + + if (Cmd != DISABLE) + { + DVPx->PORTCFG |= DVP_DATA_REVERSE; + } + else + { + DVPx->PORTCFG &= DVP_DATA_REVERSE_MASK; + } +} + + +/** +*\*\name DVP_ConfigEmbSyncPos. +*\*\fun Embedded Synchronization Code Position. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param SYNC_Pos (The input parameters must be the following values): +*\*\ - DVP_EMBSYNC_LSB +*\*\ - DVP_EMBSYNC_MSB +*\*\return none. +**/ +void DVP_ConfigEmbSyncPos(DVP_Module *DVPx, uint32_t SYNC_Pos) +{ + + uint32_t tmpregister; + tmpregister = DVPx->PORTCFG; + tmpregister &= DVP_EMBSYNC_POS_MASK; + tmpregister |= SYNC_Pos; + DVPx->PORTCFG = (uint32_t)tmpregister; + +} + +/** +*\*\name DVP_ConfigEmbSyncData. +*\*\fun Embedded Synchronization Code Position. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param FrameStartValue/FrameEndValue/LineStartValue/LineEndValue (The input parameters must be the following values): +*\*\ - 0x00 ~ 0xFF +*\*\return none. +**/ +void DVP_ConfigEmbSyncData(DVP_Module *DVPx, uint8_t FrameStartValue, uint8_t FrameEndValue, uint8_t LineStartValue, uint8_t LineEndValue) +{ + + uint32_t temp_value; + temp_value = ((uint32_t)FrameStartValue | ((uint32_t)FrameEndValue << 8) + | ((uint32_t)LineStartValue << 16) | ((uint32_t)LineEndValue << 24)); + DVPx->EMSC |= temp_value; + +} + +/** +*\*\name DVP_ConfigEmbSyncDataMask. +*\*\fun Embedded Synchronization Code Position. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param FrameStartMask/FrameEndMask/LineStartMask/LineEndMask (The input parameters must be the following values): +*\*\ - 0x00 ~ 0xFF +*\*\return none. +**/ +void DVP_ConfigEmbSyncDataMask(DVP_Module *DVPx, uint8_t FrameStartMask, uint8_t FrameEndMask, uint8_t LineStartMask, uint8_t LineEndMask) +{ + + uint32_t temp_value; + temp_value = ((uint32_t)FrameStartMask | ((uint32_t)FrameEndMask << 8) + | ((uint32_t)LineStartMask << 16) | ((uint32_t)LineEndMask << 24)); + DVPx->EMSCM |= temp_value; + +} + +/** +*\*\name DVP_EnableEmbSyncMode. +*\*\fun Embedded Synchronization Mode enable bit. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DVP_EnableEmbSyncMode(DVP_Module *DVPx, FunctionalState Cmd) +{ + + if (Cmd != DISABLE) + { + DVPx->PORTCFG |= DVP_SYNC_MODE_SOFTWARE; + } + else + { + DVPx->PORTCFG &= DVP_EMBSYNC_MASK; + } + +} + +/** +*\*\name DVP_ConfigDataMode. +*\*\fun Config DVP data port mode. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Mode (The input parameters must be the following values): +*\*\ - DVP_DATA_MODE1 +*\*\ - DVP_DATA_MODE2 +*\*\ - DVP_DATA_MODE3 +*\*\ - DVP_DATA_MODE4 +*\*\ - DVP_DATA_MODE5 +*\*\ - DVP_DATA_MODE6 +*\*\ - DVP_DATA_MODE7 +*\*\ - DVP_DATA_MODE8 +*\*\return none. +**/ +void DVP_ConfigDataMode(DVP_Module *DVPx, uint32_t Mode) +{ + + uint32_t tmpregister; + tmpregister = DVPx->PORTCFG; + tmpregister &= DVP_DATA_MODE_MASK; + tmpregister |= Mode; + DVPx->PORTCFG = (uint32_t)tmpregister; + +} + +/** +*\*\name DVP_ConfigPixelByte. +*\*\fun Config DVP pixel bytes. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Pixel_Byte (The input parameters must be the following values): +*\*\ - DVP_PIXEL_BYTE1 +*\*\ - DVP_PIXEL_BYTE2 +*\*\return none. +**/ +void DVP_ConfigPixelByte(DVP_Module *DVPx, uint32_t Pixel_Byte) +{ + + uint32_t tmpregister; + tmpregister = DVPx->PORTCFG; + tmpregister &= DVP_PIXEL_BYTE_MASK; + tmpregister |= Pixel_Byte; + DVPx->PORTCFG = (uint32_t)tmpregister; + +} + +/** +*\*\name DVP_ConfigDATAByteOrder. +*\*\fun Config DVP DATA order. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Byte0 (The input parameters must be the following values): +*\*\ - DVP_BYTE0_ORDER1 +*\*\ - DVP_BYTE0_ORDER2 +*\*\ - DVP_BYTE0_ORDER3 +*\*\ - DVP_BYTE0_ORDER4 +*\*\param Byte1 (The input parameters must be the following values): +*\*\ - DVP_BYTE1_ORDER1 +*\*\ - DVP_BYTE1_ORDER2 +*\*\ - DVP_BYTE1_ORDER3 +*\*\ - DVP_BYTE1_ORDER4 +*\*\param Byte2 (The input parameters must be the following values): +*\*\ - DVP_BYTE2_ORDER1 +*\*\ - DVP_BYTE2_ORDER2 +*\*\ - DVP_BYTE2_ORDER3 +*\*\ - DVP_BYTE2_ORDER4 +*\*\param Byte3 (The input parameters must be the following values): +*\*\ - DVP_BYTE3_ORDER1 +*\*\ - DVP_BYTE3_ORDER2 +*\*\ - DVP_BYTE3_ORDER3 +*\*\ - DVP_BYTE3_ORDER4 +*\*\return none. +**/ +void DVP_ConfigDATAByteOrder(DVP_Module *DVPx, uint32_t Byte0, uint32_t Byte1, uint32_t Byte2, uint32_t Byte3) +{ + + uint32_t temp_value; + temp_value = (Byte0 | Byte1 | Byte2 | Byte3); + DVPx->PORTCFG &= DVP_BYTE_ORDER_MASK; + DVPx->PORTCFG |= temp_value; + +} + +/** +*\*\name DVP_ConfigInitSKIP. +*\*\fun Config Initial Frame Line Skip . +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Line (The input parameters must be the following values): +*\*\ - DVP_SKIP_LINE1 +*\*\ - DVP_SKIP_LINE2 +*\*\ - DVP_SKIP_LINE3 +*\*\ - DVP_SKIP_LINE4 +*\*\ - DVP_SKIP_LINE5 +*\*\ - DVP_SKIP_LINE6 +*\*\ - DVP_SKIP_LINE7 +*\*\ - DVP_SKIP_LINE8 +*\*\ - DVP_SKIP_LINE9 +*\*\ - DVP_SKIP_LINE10 +*\*\ - DVP_SKIP_LINE11 +*\*\ - DVP_SKIP_LINE12 +*\*\ - DVP_SKIP_LINE13 +*\*\ - DVP_SKIP_LINE14 +*\*\ - DVP_SKIP_LINE15 +*\*\return none. +**/ +void DVP_ConfigInitSKIP(DVP_Module *DVPx, uint32_t Line) +{ + + uint32_t temp_value; + temp_value = (uint32_t)(Line << 24); + DVPx->PORTCFG &= DVP_ISKIP_MASK; + DVPx->PORTCFG |= temp_value; + +} + +/** +*\*\name DVP_ConfigRepeatSKIP. +*\*\fun Config Repeat Frame Line Skip . +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Line (The input parameters must be the following values): +*\*\ - DVP_SKIP_LINE1 +*\*\ - DVP_SKIP_LINE2 +*\*\ - DVP_SKIP_LINE3 +*\*\ - DVP_SKIP_LINE4 +*\*\ - DVP_SKIP_LINE5 +*\*\ - DVP_SKIP_LINE6 +*\*\ - DVP_SKIP_LINE7 +*\*\ - DVP_SKIP_LINE8 +*\*\ - DVP_SKIP_LINE9 +*\*\ - DVP_SKIP_LINE10 +*\*\ - DVP_SKIP_LINE11 +*\*\ - DVP_SKIP_LINE12 +*\*\ - DVP_SKIP_LINE13 +*\*\ - DVP_ODD_LINE +*\*\ - DVP_EVEN_LINE +*\*\return none. +**/ +void DVP_ConfigRepeatSKIP(DVP_Module *DVPx, uint32_t Line) +{ + + uint32_t temp_value; + temp_value = (uint32_t)(Line << 28); + DVPx->PORTCFG &= DVP_RSKIP_MASK; + DVPx->PORTCFG |= temp_value; + +} + +/** +*\*\name DVP_EnableBuffer1. +*\*\fun Frame Buffer 1 enable. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DVP_EnableBuffer1(DVP_Module *DVPx, FunctionalState Cmd) +{ + + if (Cmd != DISABLE) + { + DVPx->FIFOCFG |= DVP_BUFFER1; + } + else + { + DVPx->FIFOCFG &= DVP_BUFFER1_MASK; + } + +} + +/** +*\*\name DVP_SetBuffer1Address. +*\*\fun Set Frame Buffer 1 Start Address. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Addres:(The input parameters must be the following values) +*\*\ - 0x00000000~0xFFFFFFFF +*\*\return none +**/ +void DVP_SetBuffer1Address(DVP_Module *DVPx, uint32_t Addres) +{ + + DVPx->SMADDR1 = (uint32_t)Addres; + +} + +/** +*\*\name DVP_EnableBuffer2. +*\*\fun Frame Buffer 2 enable. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DVP_EnableBuffer2(DVP_Module *DVPx, FunctionalState Cmd) +{ + + if (Cmd != DISABLE) + { + DVPx->FIFOCFG |= DVP_BUFFER2; + } + else + { + DVPx->FIFOCFG &= DVP_BUFFER2_MASK; + } + +} + +/** +*\*\name DVP_SetBuffer2Address. +*\*\fun Set Frame Buffer 2 Start Address. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Addres:(The input parameters must be the following values) +*\*\ - 0x00000000~0xFFFFFFFF +*\*\return none +**/ +void DVP_SetBuffer2Address(DVP_Module *DVPx, uint32_t Addres) +{ + + DVPx->SMADDR2 = (uint32_t)Addres; + +} + +/** +*\*\name DVP_SetBufferSize. +*\*\fun Set Frame Buffer Size. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Size:(The input parameters must be the following values) +*\*\ - 0 ~ 4194303 +*\*\return none +**/ +void DVP_SetBufferSize(DVP_Module *DVPx, uint32_t Size) +{ + + DVPx->FBS = (uint32_t)Size; + +} + +/** +*\*\name DVP_SetDisplayBufferStatus. +*\*\fun Set show current frame buffer status. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param State_Mode:(The input parameters must be the following values) +*\*\ - DVP_DISPLAY_ADDRESS +*\*\ - DVP_DISPLAY_NUMBER +*\*\return none +**/ +void DVP_SetDisplayBufferStatus(DVP_Module *DVPx, uint32_t State_Mode) +{ + + uint32_t tmpregister; + tmpregister = DVPx->FIFOCFG; + tmpregister &= DVP_DISPLAY_STATUS_MASK; + tmpregister |= State_Mode; + DVPx->FIFOCFG = (uint32_t)tmpregister; + +} + +/** +*\*\name DVP_GetDisplayBufferStatus1. +*\*\fun Get current frame buffer 1 status. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\return Frame Buffer 1 address or Number of data bytes +**/ +uint32_t DVP_GetDisplayBufferStatus1(DVP_Module *DVPx) +{ + + return DVPx->FPBC1; + +} + +/** +*\*\name DVP_GetDisplayBufferStatus2. +*\*\fun Get current frame buffer 2 status. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\return Frame Buffer 2 address or Number of data bytes +**/ +uint32_t DVP_GetDisplayBufferStatus2(DVP_Module *DVPx) +{ + + return DVPx->FPBC2; + +} + +/** +*\*\name DVP_EnableAcross1KBoundary. +*\*\fun Increamental bursting across 1K boundary is allowed/enabled +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void DVP_EnableAcross1KBoundary(DVP_Module *DVPx, FunctionalState Cmd) +{ + + if (Cmd != DISABLE) + { + DVPx->FIFOCFG |= DVP_1K_BOUNDARY_ENABLE; + } + else + { + DVPx->FIFOCFG &= DVP_1K_BOUNDARY_MASK; + } + +} + +/** +*\*\name DVP_ConfigCROPStart. +*\*\fun Config Y-coordinate and X-coordinate of crop image start point. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param (X,Y):(The input parameters must be the following values) +*\*\ - (0,0) ~ (2047,2047) +*\*\return none +**/ +void DVP_ConfigCROPStart(DVP_Module *DVPx, uint16_t X, uint16_t Y) +{ + + DVPx->CSXY = DVP_REG_BIT_FIELD_MASK; + DVPx->CSXY |= X; + DVPx->CSXY |= ((uint32_t)Y << 16); + +} + +/** +*\*\name DVP_ConfigCROPEnd. +*\*\fun Config Y-coordinate and X-coordinate of crop image end point. +*\*\param DVPx: +*\*\ - DVP1 +*\*\ - DVP2 +*\*\param (X,Y):(The input parameters must be the following values) +*\*\ - (0,0) ~ (2047,2047) +*\*\return none +**/ +void DVP_ConfigCROPEnd(DVP_Module *DVPx, uint16_t X, uint16_t Y) +{ + + DVPx->CEXY = DVP_REG_BIT_FIELD_MASK; + DVPx->CEXY |= X; + DVPx->CEXY |= ((uint32_t)Y << 16); + +} + + + + + + + + + + + + + + + + + + + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_eccmon.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_eccmon.c new file mode 100644 index 0000000000..86b83dce89 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_eccmon.c @@ -0,0 +1,869 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_eccmon.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_eccmon.h" + +/** +*\*\brief Get ECCMON Monitor Type +*\*\param ECCON_OneMemType ECCMON One Memory Type ,can'T |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\return ECCMON_MonitorType Monitor Unit and Index for the MemType +**/ +static ECCMON_MonitorType ECCMON_GetMonitorType(uint32_t ECCON_OneMemType) +{ + ECCMON_MonitorType oneMonitor; + + switch (ECCON_OneMemType) + { + case ECCMON_AXI_SRAM1: + oneMonitor.MonitorUnit = ECCMON1P1; + oneMonitor.MonitorIndex = 1; + break; + + case ECCMON_AXI_SRAM2: + oneMonitor.MonitorUnit = ECCMON1P2; + oneMonitor.MonitorIndex = 0; + break; + + case ECCMON_AXI_SRAM3: + oneMonitor.MonitorUnit = ECCMON1P2; + oneMonitor.MonitorIndex = 1; + break; + + case ECCMON_ITCM: + oneMonitor.MonitorUnit = ECCMON1P3; + oneMonitor.MonitorIndex = 0; + break; + + case ECCMON_D0TCM: + oneMonitor.MonitorUnit = ECCMON1P4; + oneMonitor.MonitorIndex = 0; + break; + + case ECCMON_D1TCM: + oneMonitor.MonitorUnit = ECCMON1P4; + oneMonitor.MonitorIndex = 1; + break; + + case ECCMON_AHB_SRAM1: + oneMonitor.MonitorUnit = ECCMON2; + oneMonitor.MonitorIndex = 0; + break; + + case ECCMON_AHB_SRAM2: + oneMonitor.MonitorUnit = ECCMON2; + oneMonitor.MonitorIndex = 1; + break; + + case ECCMON_AHB_SRAM3: + oneMonitor.MonitorUnit = ECCMON2; + oneMonitor.MonitorIndex = 2; + break; + + case ECCMON_AHB_SRAM4: + oneMonitor.MonitorUnit = ECCMON2; + oneMonitor.MonitorIndex = 3; + break; + + case ECCMON_AHB_SRAM5_BANK1: + oneMonitor.MonitorUnit = ECCMON2; + oneMonitor.MonitorIndex = 4; + break; + + case ECCMON_AHB_SRAM5_BANK2: + oneMonitor.MonitorUnit = ECCMON2; + oneMonitor.MonitorIndex = 5; + break; + + case ECCMON_BACKUP_SRAM: + oneMonitor.MonitorUnit = ECCMON3; + oneMonitor.MonitorIndex = 0; + break; + + default: + break; + } + + return oneMonitor; +} + +/** +*\*\brief Initialize the ECCMON structure +*\*\param ECCMON_InitStruct ECCMON handle +*\*\ -MemType +*\*\ -CaptureSelect +*\*\ -ErrFlagOut +*\*\return none +**/ +void ECCMON_StructInit(ECCMON_InitType* ECCMON_InitStruct) +{ + ECCMON_InitStruct->MemType = ECCMON_NONE_SRAM; + ECCMON_InitStruct->CaptureSelect = ECCMON_CAPTURE_1_2BIT_ERROR; + ECCMON_InitStruct->ErrFlagOut = ECCMON_NO_ERROR_FLAG_OUT; +} + +/** +*\*\brief Initialize the ECCMON according to the specified parameters in the ECCMON_InitType. +*\*\param ECCMON_InitStruct ECCMON handle +*\*\ -MemType +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\ -CaptureSelect +*\*\ -ECCMON_CAPTURE_1_2BIT_ERROR +*\*\ -ECCMON_CAPTURE_1BIT_ERROR +*\*\ -ECCMON_CAPTURE_2BIT_ERROR +*\*\ -ECCMON_CAPTURE_NONE_ERROR +*\*\ -ErrFlagOut +*\*\ -ECCMON_NO_ERROR_FLAG_OUT +*\*\ -ECCMON_1BIT_ERROR_FLAG_OUT +*\*\ -ECCMON_2BIT_ERROR_FLAG_OUT +*\*\ -ECCMON_1_2BIT_ERROR_FLAG_OUT +*\*\return none +**/ +void ECCMON_Init(ECCMON_InitType* ECCMON_InitStruct) +{ + ECCMON_MonitorType oneMonitorType; + + for (uint8_t index = 0; index < 14U; index++) + { + if ((ECCMON_InitStruct->MemType & (1UL << index)) != 0x00UL) + { + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_InitStruct->MemType & (1UL << index)); + //set capture select + oneMonitorType.MonitorUnit->EINJ &= ~(ECCMON_CAPTURE_NONE_ERROR << (oneMonitorType.MonitorIndex * 2UL)); + oneMonitorType.MonitorUnit->EINJ |= ECCMON_InitStruct->CaptureSelect << (oneMonitorType.MonitorIndex * 2UL); + + //set eror flag out to FLAG_EN_OT + if ((ECCMON_InitStruct->ErrFlagOut & 0x01UL) != 0x00UL) + { + oneMonitorType.MonitorUnit->CTRL2 |= ECCMON_CTRL2_E1FOEN1 << oneMonitorType.MonitorIndex; + } + else + { + oneMonitorType.MonitorUnit->CTRL2 &= ~(ECCMON_CTRL2_E1FOEN1 << oneMonitorType.MonitorIndex); + } + + if ((ECCMON_InitStruct->ErrFlagOut & 0x02UL) != 0x00UL) + { + oneMonitorType.MonitorUnit->CTRL2 |= ECCMON_CTRL2_E2FOEN1 << oneMonitorType.MonitorIndex; + } + else + { + oneMonitorType.MonitorUnit->CTRL2 &= ~(ECCMON_CTRL2_E2FOEN1 << oneMonitorType.MonitorIndex); + } + } + + } + +} +/** +*\*\brief Initialize the ECCMON interrupt +*\*\param ECCMON_MemType ECCMON Memory Type ,can |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\param ECCMON_IntType ECCMON intertupt Type +*\*\ -ECCMON_1BIT_ERROR_INT +*\*\ -ECCMON_2BIT_ERROR_INT +*\*\ -ECCMON_1_2BIT_ERROR_INT +*\*\return none +**/ +void ECCMON_ConfigInt(uint32_t ECCMON_MemType, uint32_t ECCMON_IntType) +{ + ECCMON_MonitorType oneMonitorType; + + for (uint8_t index = 0; index < 14U; index++) + { + if ((ECCMON_MemType & (1UL << index)) != 0x00UL) + { + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType & (1UL << index)); + + //set eror interrupt + if ((ECCMON_IntType & 0x01UL) != 0x00UL) + { + oneMonitorType.MonitorUnit->CTRL1 |= ECCMON_CTRL1_E1INTEN1 << oneMonitorType.MonitorIndex; + } + else + { + oneMonitorType.MonitorUnit->CTRL1 &= ~(ECCMON_CTRL1_E1INTEN1 << oneMonitorType.MonitorIndex); + } + + if ((ECCMON_IntType & 0x02UL) != 0x00UL) + { + oneMonitorType.MonitorUnit->CTRL1 |= ECCMON_CTRL1_E2INTEN1 << oneMonitorType.MonitorIndex; + } + else + { + oneMonitorType.MonitorUnit->CTRL1 &= ~(ECCMON_CTRL1_E2INTEN1 << oneMonitorType.MonitorIndex); + } + + } + + } +} + +/** +*\*\brief Inject Error for test +*\*\param ECCMON_MemType ECCMON Memory Type ,can |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\param ECCMON_InjectType ECCMON Inject Type +*\*\ -ECCMON_NO_INJECT +*\*\ -ECCMON_INJECT_1BIT +*\*\ -ECCMON_INJECT_2BIT +*\*\return none +**/ +void ECCMON_InjectError(uint32_t ECCMON_MemType, uint32_t ECCMON_InjectType) +{ + ECCMON_MonitorType oneMonitorType; + + for (uint8_t index = 0; index < 14U; index++) + { + if ((ECCMON_MemType & (1UL << index)) != 0x00UL) + { + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType & (1UL << index)); + + //set eror inject + oneMonitorType.MonitorUnit->EINJ &= ~(ECCMON_INJECT_MASK << (2UL * oneMonitorType.MonitorIndex)); + oneMonitorType.MonitorUnit->EINJ |= ECCMON_InjectType << (2UL * oneMonitorType.MonitorIndex); + } + + } +} +/** +*\*\brief set Temporary data register bypass +*\*\ temporary data register is used to temporarily store read-modify-write data on partial write access +*\*\ the temporary data register is bypassed, the read-modify-write data is written back the memory +*\*\param ECCMON_MemType ECCMON Memory Type ,can |(or) operation +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\param FunctionalState Cmd +*\*\ -DISABLE +*\*\ -ENABLE +*\*\return none +**/ +void ECCMON_SetBypassTempRegister(uint32_t ECCMON_MemType, FunctionalState Cmd) +{ + ECCMON_MonitorType oneMonitorType; + + for (uint8_t index = 0; index < 14U; index++) + { + if ((ECCMON_MemType & (1UL << index)) != 0x00UL) + { + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType & (1UL << index)); + + if (Cmd != DISABLE) + { + //set bypass + oneMonitorType.MonitorUnit->CTRL1 |= ECCMON_CTRL1_TDRBYP1 << oneMonitorType.MonitorIndex; + } + else + { + oneMonitorType.MonitorUnit->CTRL1 &= ~(ECCMON_CTRL1_TDRBYP1 << oneMonitorType.MonitorIndex); + } + } + + } + +} + +/** +*\*\brief set Partial write on ECC 2-bit enable or disable +*\*\ allow or don't allow partial write to perform read-modify-write to the memory while ECC 2-bit error is detected. +*\*\param ECCMON_MemType ECCMON Memory Type ,can |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\param FunctionalState Cmd +*\*\ -DISABLE +*\*\ -ENABLE +*\*\return none +**/ +void ECCMON_SetWriteOn2Bit(uint32_t ECCMON_MemType, FunctionalState Cmd) +{ + ECCMON_MonitorType oneMonitorType; + + for (uint8_t index = 0; index < 14U; index++) + { + if ((ECCMON_MemType & (1UL << index)) != 0x00UL) + { + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType & (1UL << index)); + + if (Cmd != DISABLE) + { + //set write on ECC 2-bit enable + oneMonitorType.MonitorUnit->CTRL2 |= ECCMON_CTRL2_WROE2EN1 << oneMonitorType.MonitorIndex; + } + else + { + oneMonitorType.MonitorUnit->CTRL2 &= ~(ECCMON_CTRL2_WROE2EN1 << oneMonitorType.MonitorIndex); + } + } + + } + +} +/** +*\*\brief set enable ECCMON +*\*\param ECCMON_MemType ECCMON Memory Type ,can |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ECCMON_Enable(uint32_t ECCMON_MemType, FunctionalState Cmd) +{ + ECCMON_MonitorType oneMonitorType; + + for (uint8_t index = 0; index < 14U; index++) + { + if ((ECCMON_MemType & (1UL << index)) != 0x00UL) + { + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType & (1UL << index)); + + if (Cmd != DISABLE) + { + //set ECC enable + oneMonitorType.MonitorUnit->CTRL1 |= ECCMON_CTRL1_ECCEN1 << oneMonitorType.MonitorIndex; + } + else + { + //set ECC enable + oneMonitorType.MonitorUnit->CTRL1 &= ~(ECCMON_CTRL1_ECCEN1 << oneMonitorType.MonitorIndex); + } + } + + } +} +/** +*\*\brief set enable ECCMON CLOCK +*\*\param none +*\*\return none +**/ +void ECCMON_EnableClk(void) +{ + /**note:No matter which ECCMON you want to use, you need to enable the three ECCMON clocks***/ + RCC_EnableAXIPeriphClk1(RCC_AXI_PERIPHEN_M7_ECCM1 | RCC_AXI_PERIPHEN_M4_ECCM1, ENABLE); + RCC_EnableAHB2PeriphClk1(RCC_AHB2_PERIPHEN_M7_ECCM2 | RCC_AHB2_PERIPHEN_M4_ECCM2, ENABLE); + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M7_ECCM3 | RCC_AHB5_PERIPHEN_M4_ECCM3, ENABLE); + +} +/** +*\*\brief Get the ECCMON Fail Address +*\*\param ECCMON_MemType ECCMON Memory Type ,can not |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\return FailAddress +**/ +uint32_t ECCMON_GetFailAddress(uint32_t ECCMON_MemType) +{ + uint32_t readAddr, FailAddress ; + ECCMON_MonitorType oneMonitorType; + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType); + + /* read Fail Address */ + readAddr = (*((&oneMonitorType.MonitorUnit->FEADR1) + (ECCMON_GROUP_REG_ADDR_GAP * oneMonitorType.MonitorIndex))) & 0xFFFFFFFUL; + + //shift left by 2 bit for 32-bit memory, and shift left by 3 bit for 64-bit memory + switch (ECCMON_MemType) + { + case ECCMON_AXI_SRAM1://64 bit data + FailAddress = AXI_SRAM1_BASE_ADDR + (readAddr << 3); + break; + + case ECCMON_AXI_SRAM2://64 bit data + FailAddress = AXI_SRAM2_BASE_ADDR + (readAddr << 3); + break; + + case ECCMON_AXI_SRAM3://64 bit data + FailAddress = AXI_SRAM3_BASE_ADDR + (readAddr << 3); + break; + + case ECCMON_ITCM://64 bit data + FailAddress = ITCM_BASE_ADDR + (readAddr << 3); + break; + + case ECCMON_D0TCM://32 bit data + FailAddress = DTCM_BASE_ADDR + (readAddr << 2); + break; + + case ECCMON_D1TCM://32 bit data + FailAddress = DTCM_BASE_ADDR + (readAddr << 2); + break; + + case ECCMON_AHB_SRAM1://32 bit data + FailAddress = AHB_SRAM1_BASE_ADDR + (readAddr << 2); + break; + + case ECCMON_AHB_SRAM2://32 bit data + FailAddress = AHB_SRAM2_BASE_ADDR + (readAddr << 2); + break; + + case ECCMON_AHB_SRAM3://32 bit data + FailAddress = AHB_SRAM3_BASE_ADDR + (readAddr << 2); + break; + + case ECCMON_AHB_SRAM4://32 bit data + FailAddress = AHB_SRAM4_BASE_ADDR + (readAddr << 2); + break; + + case ECCMON_AHB_SRAM5_BANK1://32 bit data + FailAddress = AHB_SRAM5_BANK1_BASE_ADDR + (readAddr << 2); + break; + + case ECCMON_AHB_SRAM5_BANK2://32 bit data + FailAddress = AHB_SRAM5_BANK2_BASE_ADDR + (readAddr << 2); + break; + + case ECCMON_BACKUP_SRAM://32 bit data + FailAddress = BACKUP_SRAM_BASE_ADDR + (readAddr << 2); + break; + + default: + FailAddress = readAddr; + break; + } + + return FailAddress; +} +/** +*\*\brief Get the ECCMON Fail Data Low +*\*\param ECCMON_MemType ECCMON Memory Type ,can not |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\return Fail Data Low +**/ +uint32_t ECCMON_GetFailDataLow(uint32_t ECCMON_MemType) +{ + ECCMON_MonitorType oneMonitorType; + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType); + /* Return Fail Address */ + return (uint32_t) * ((&oneMonitorType.MonitorUnit->FEDATL1) + (ECCMON_GROUP_REG_ADDR_GAP * oneMonitorType.MonitorIndex)); +} + +/** +*\*\brief Get the ECCMON Fail Data High +*\*\param ECCMON_MemType ECCMON Memory Type ,can not |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\return Fail Data High +**/ +uint32_t ECCMON_GetFailDataHigh(uint32_t ECCMON_MemType) +{ + ECCMON_MonitorType oneMonitorType; + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType); + /* Return Fail Address */ + return (uint32_t) * ((&oneMonitorType.MonitorUnit->FEDATH1) + (ECCMON_GROUP_REG_ADDR_GAP * oneMonitorType.MonitorIndex)); +} + +/** +*\*\brief Get the ECCMON Fail ECC code +*\*\param ECCMON_MemType ECCMON Memory Type ,can not |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\return Fail ECC code +**/ +uint32_t ECCMON_GetFailErrorCode(uint32_t ECCMON_MemType) +{ + ECCMON_MonitorType oneMonitorType; + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType); + /* Return Fail Address */ + return (uint32_t) * ((&oneMonitorType.MonitorUnit->FECOD1) + (ECCMON_GROUP_REG_ADDR_GAP * oneMonitorType.MonitorIndex)); +} + +/** +*\*\brief Get the ECCMON error context Flag +*\*\param ECCMON_MemType ECCMON Memory Type ,can not |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\param ECCMON_ERR_CONTEXT_FLAG +*\*\ -ECCMON_ERR_CONTEXT_FLAG_E1EAD +*\*\ -ECCMON_ERR_CONTEXT_FLAG_E2EAD +*\*\return Fail ECC code +**/ +FlagStatus ECCMON_GetErrorContextFlagStatus(uint32_t ECCMON_MemType, uint32_t ECCMON_ERR_CONTEXT_FLAG) +{ + FlagStatus bitstatus; + ECCMON_MonitorType oneMonitorType; + uint32_t registerFlag; + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType); + + registerFlag = (uint32_t) * ((&oneMonitorType.MonitorUnit->FEADR1) + (ECCMON_GROUP_REG_ADDR_GAP * oneMonitorType.MonitorIndex)); + + if ((registerFlag & ECCMON_ERR_CONTEXT_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\brief Clear ECCMON error context Flag +*\*\param ECCMON_MemType ECCMON Memory Type ,can not |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\param ECCMON_ERR_CONTEXT_FLAG +*\*\ -ECCMON_ERR_CONTEXT_FLAG_E1EAD +*\*\ -ECCMON_ERR_CONTEXT_FLAG_E2EAD +*\*\return Fail ECC code +**/ +void ECCMON_ClrErrorContextFlag(uint32_t ECCMON_MemType, uint32_t ECCMON_ERR_CONTEXT_FLAG) +{ + ECCMON_MonitorType oneMonitorType; + __IO uint32_t *oneRegister; + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType); + //get ECCMON_INTFx, x=oneMonitorType.MonitorIndex + oneRegister = (__IO uint32_t *)(&oneMonitorType.MonitorUnit->FEADR1) + (ECCMON_GROUP_REG_ADDR_GAP * oneMonitorType.MonitorIndex); + + *oneRegister |= ECCMON_ERR_CONTEXT_FLAG; + +} + + +/** +*\*\brief Get the ECCMON Interrupt Flag +*\*\param ECCMON_MemType ECCMON Memory Type ,can not |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\param ECCMON_FLAG +*\*\ -ECCMON_FLAG_E1DCIFW +*\*\ -ECCMON_FLAG_E2DCIFW +*\*\ -ECCMON_FLAG_E1DCIFR +*\*\ -ECCMON_FLAG_E2DCIFR +*\*\return Fail ECC code +**/ +FlagStatus ECCMON_GetFlagStatus(uint32_t ECCMON_MemType, uint32_t ECCMON_FLAG) +{ + FlagStatus bitstatus; + ECCMON_MonitorType oneMonitorType; + uint32_t registerFlag; + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType); + //get ECCMON_INTFx, x=oneMonitorType.MonitorIndex + registerFlag = (uint32_t) * ((&oneMonitorType.MonitorUnit->INTF1) + (ECCMON_GROUP_REG_ADDR_GAP * oneMonitorType.MonitorIndex)); + + if ((registerFlag & ECCMON_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\brief Clear the ECCMON Interrupt Flag +*\*\param ECCMON_MemType ECCMON Memory Type ,can not |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\param ECCMON_FLAG +*\*\ -ECCMON_FLAG_E1DCIFW +*\*\ -ECCMON_FLAG_E2DCIFW +*\*\ -ECCMON_FLAG_E1DCIFR +*\*\ -ECCMON_FLAG_E2DCIFR +*\*\return Fail ECC code +**/ +void ECCMON_ClrFlag(uint32_t ECCMON_MemType, uint32_t ECCMON_FLAG) +{ + ECCMON_MonitorType oneMonitorType; + __IO uint32_t *oneRegister; + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType); + //get ECCMON_INTFx, x=oneMonitorType.MonitorIndex + oneRegister = (__IO uint32_t *)(&oneMonitorType.MonitorUnit->INTF1) + (ECCMON_GROUP_REG_ADDR_GAP * oneMonitorType.MonitorIndex); + + *oneRegister = ECCMON_FLAG; + +} +/** +*\*\brief Get the ECCMON Interrupt Flag +*\*\param ECCMON_MemType ECCMON Memory Type ,can not |(or) operation +*\*\ -ECCMON_AXI_SRAM1 +*\*\ -ECCMON_AXI_SRAM2 +*\*\ -ECCMON_AXI_SRAM3 +*\*\ -ECCMON_ITCM +*\*\ -ECCMON_D0TCM +*\*\ -ECCMON_D1TCM +*\*\ -ECCMON_AHB_SRAM1 +*\*\ -ECCMON_AHB_SRAM2 +*\*\ -ECCMON_AHB_SRAM3 +*\*\ -ECCMON_AHB_SRAM4 +*\*\ -ECCMON_AHB_SRAM5_BANK1 +*\*\ -ECCMON_AHB_SRAM5_BANK2 +*\*\ -ECCMON_BACKUP_SRAM +*\*\param ECCMON_INT +*\*\ -ECCMON_INT_E1DCIFW +*\*\ -ECCMON_INT_E2DCIFW +*\*\ -ECCMON_INT_E1DCIFR +*\*\ -ECCMON_INT_E2DCIFR +*\*\return Fail ECC code +**/ +INTStatus ECCMON_GetIntStatus(uint32_t ECCMON_MemType, uint32_t ECCMON_INT) +{ + FlagStatus bitstatus = RESET; + ECCMON_MonitorType oneMonitorType; + uint32_t registerFlag; + //Get ECCMON Monitor unit and index + oneMonitorType = ECCMON_GetMonitorType(ECCMON_MemType); + //get ECCMON_INTFx, x=oneMonitorType.MonitorIndex + registerFlag = (uint32_t) * ((&oneMonitorType.MonitorUnit->INTF1) + (ECCMON_GROUP_REG_ADDR_GAP * oneMonitorType.MonitorIndex)); + + //judge ECCMON_INT_E1DCIFW|ECCMON_INT_E1DCIFR and ECC 1-bit Error interrupt enable or disable + if (((ECCMON_INT & (ECCMON_INT_E1DCIFW | ECCMON_INT_E1DCIFR)) != 0x00UL) && + ((oneMonitorType.MonitorUnit->CTRL1 & (ECCMON_CTRL1_E1INTEN1 << oneMonitorType.MonitorIndex)) != 0x00UL)) + { + if ((registerFlag & ECCMON_INT) != 0x00UL) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + + //judge ECCMON_INT_E2DCIFW|ECCMON_INT_E2DCIFR and ECC 2-bit Error interrupt enable or disable + if (((ECCMON_INT & (ECCMON_INT_E2DCIFW | ECCMON_INT_E2DCIFR)) != 0x00UL) && + ((oneMonitorType.MonitorUnit->CTRL1 & (ECCMON_CTRL1_E2INTEN1 << oneMonitorType.MonitorIndex)) != 0x00UL)) + { + if ((registerFlag & ECCMON_INT) != 0x00UL) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + + return bitstatus; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_eth.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_eth.c new file mode 100644 index 0000000000..69f3e97a54 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_eth.c @@ -0,0 +1,4988 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_eth.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_eth.h" + +/** ETH Private Defines **/ + +/* ETH Register MASK macro definition */ +#define ETH1_MACCFG_MASK ((uint32_t)0xFFFFFF7CU) +#define ETH2_MACCFG_MASK ((uint32_t)0xFFFB7F7CU) +#define ETH_MACEXTCFG_MASK ((uint32_t)0x7F073FFFU) +#define ETH_MACPFLT_MASK ((uint32_t)0x803107FFU) +#define ETH_MACWDGTO_MASK ((uint32_t)0x0000010FU) +#define ETH_MACTXFLWCTRL_MASK ((uint32_t)0xFFFF00F2U) +#define ETH_MACRXFLWCTRL_MASK ((uint32_t)0x00000003U) +#define ETH_MTLTXQOPMOD_MASK ((uint32_t)0x00000072U) +#define ETH_MTLRXQOPMOD_MASK ((uint32_t)0x0000007BU) +#define ETH_DMAMODE_MASK ((uint32_t)0x00087802U) +#define ETH_DMASBMODE_MASK ((uint32_t)0x0000D001U) +#define ETH_DMACH0CTRL_MASK ((uint32_t)0x001D3FFFU) +#define ETH_DMACH0TXCTRL_MASK ((uint32_t)0x007F1010U) +#define ETH_DMACH0RXCTRL_MASK ((uint32_t)0x807F0000U) +#define ETH_MACVLANTAG_MASK ((uint32_t)0x037FFFFFU) + +#define ETH_RXBUFFERSIZE_MASK ((uint32_t)0x00007FFEU) + +/* ETH MAC CSR Clock Frequency macro definition */ +#define ETH_MACCSR_CLOCK_FREQ_20M ((uint32_t)20000000U) +#define ETH_MACCSR_CLOCK_FREQ_35M ((uint32_t)35000000U) +#define ETH_MACCSR_CLOCK_FREQ_60M ((uint32_t)60000000U) +#define ETH_MACCSR_CLOCK_FREQ_100M ((uint32_t)100000000U) +#define ETH_MACCSR_CLOCK_FREQ_150M ((uint32_t)150000000U) +#define ETH_MACCSR_CLOCK_FREQ_250M ((uint32_t)250000000U) +#define ETH_MACCSR_CLOCK_FREQ_300M ((uint32_t)300000000U) +#define ETH_MACCSR_CLOCK_FREQ_500M ((uint32_t)500000000U) +#define ETH_MACCSR_CLOCK_FREQ_800M ((uint32_t)800000000U) + + +/* ETH Timeout values macro definition */ +#define ETH_SWRESET_TIMEOUT ((uint32_t)0xF0000000U) +#define ETH_MDIO_BUS_TIMEOUT ((uint32_t)0xF0000000U) +#define ETH_PHY_LINKED_TIMEOUT ((uint32_t)0xF0000000U) +#define ETH_PHY_AUTONEGO_COMPLETED_TIMEOUT ((uint32_t)0xF0000000U) + +/* ETH Remote Wake-up Filter register length definition */ +#define ETH_WAKEUP_REGISTER_LEN ((uint32_t)8U) + +/* ETH Delay between consecutive write registers */ +#define ETH_WRITE_REG_DELAY ((uint32_t)5000U) + +/* ETH External PHY Configuration Delay */ +#define ETH_PHY_CONFIG_DELAY ((uint32_t)5000U) + +/* ETH tx descriptor index increment */ +#define __ETH_TXDESC_INDEX_INCR(Index, Offset) do { \ + (Index) += (Offset); \ + if ((Index) >= ETH_TX_DESC_NUMBER) \ + { \ + (Index) = ((Index) - ETH_TX_DESC_NUMBER); \ + } \ + } while (0) +/* ETH rx descriptor index increment */ +#define __ETH_RXDESC_INDEX_INCR(Index, Offset) do { \ + (Index) += (Offset); \ + if ((Index) >= ETH_RX_DESC_NUMBER) \ + { \ + (Index) = ((Index) - ETH_RX_DESC_NUMBER); \ + } \ + } while (0) + +/* ETH Tick&Delay through the DWT module */ +#define __ETH_TICK_START() CPU_DELAY_INTI() +#define __ETH_GET_TICK DWT_CYCCNT +#define __ETH_TICK_STOP() CPU_DELAY_DISABLE() +#define __ETH_DELAY(Cnt) do{ \ + /* Check that DWT is enabled or not */ \ + if ((DEM_CR & DEM_CR_TRCENA) == (uint32_t)RESET) \ + { \ + /* Enable and initialize DWT */ \ + __ETH_TICK_START(); \ + } \ + Cnt += __ETH_GET_TICK; \ + while (__ETH_GET_TICK < Cnt){}; \ + __ETH_TICK_STOP(); \ + } while (0) + +/* ETH MAC μs tick */ +#define ETH_MAC_US_TICK ((uint32_t)1000000U) + + +/** ETH Driving Functions Declaration **/ + +/** +*\*\name ETH_DeInit. +*\*\fun DeInitializes the ETH peripheral. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +void ETH_DeInit(ETH_Module* ETHx) +{ + /* Check the ETHx parameter */ + if (ETHx == ETH1) + { + /* ETH1 peripheral reset */ + RCC_EnableAHB2PeriphReset1(RCC_AHB2_PERIPHRST_ETH1); + } + else if (ETHx == ETH2) + { + /* ETH2 peripheral reset */ + RCC_EnableAHB1PeriphReset2(RCC_AHB1_PERIPHRST_ETH2); + } + else + { + /* Do nothing */ + } +} + +/** +*\*\name ETH_StructInit. +*\*\fun Initializes the structure parameter of type ETH_InitType used to +*\*\ initialize ETH. This function is usually called before initializing +*\*\ a parameter of type ETH_InitType. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param ETH_InitParam : +*\*\ - Pointer to the ETH_InitType structure which will be initialized. +*\*\return none +**/ +void ETH_StructInit(ETH_Module* ETHx, ETH_InitType* ETH_InitParam) +{ + /** Set the default configuration **/ + + /* Default 7-byte preamble length */ + ETH_InitParam->TxPreambleLen = ETH_PREAMBLE_LEN_7BYTES; + /* Default Disable deferral check function in the half-duplex mode */ + ETH_InitParam->DeferralCheck = DISABLE; + /* Default Back-off time_limit = 10 slot times in the half-duplex mode */ + ETH_InitParam->BackOffLimit = ETH_BACK_OFF_LIMIT_10; + /* Default Enable MAC retry transmission in the half-duplex mode */ + ETH_InitParam->DisTxRetry = DISABLE; + /* Default Enable Carrier Sense During Transmission in the half-duplex mode */ + ETH_InitParam->DisCSDuringTransmit = DISABLE; + /* Default Enable Receive Own in the half-duplex mode */ + ETH_InitParam->DisRxOwn = DISABLE; + /* Default Disable Carrier Sense Before Transmission in the full-duplex mode */ + ETH_InitParam->CSBeforeTransmit = DISABLE; + /* Default Disable Loopback Mode */ + ETH_InitParam->Loopback = DISABLE; + /* Default Half-duplex mode */ + ETH_InitParam->Duplex = ETH_HALF_DUPLEX_MODE; + /* Set the default speed for ETH1/ETH2 */ + if (ETHx == ETH1) + { + /* Default Selects the speed mode: 1000Mbps */ + ETH_InitParam->SpeedSelect = ETH_SPEED_1000M; + } + else + { + /* Default Selects the speed mode: 10Mbps */ + ETH_InitParam->SpeedSelect = ETH_SPEED_10M; + } + /* Default Disable Jumbo Packet */ + ETH_InitParam->JumboPacket = DISABLE; + /* Default Enable Jabber timer on Tx path */ + ETH_InitParam->DisTxJabber = DISABLE; + /* Default Disable Packet Burst, Only ETH1 supports */ + ETH_InitParam->PacketBurst = DISABLE; + /* Default Enable Watchdog timer on Rx path */ + ETH_InitParam->DisRxWatchdog = DISABLE; + /* Default Disable Automatic Pad or CRC Stripping function */ + ETH_InitParam->AutoPadCRCStrip = DISABLE; + /* Default Disable CRC stripping for Type packets function */ + ETH_InitParam->CRCStripTypePacket = DISABLE; + /* Default Disable IEEE 802.3as Support for 2K Packets function */ + ETH_InitParam->Support2KPacket = DISABLE; + /* Default Disable Giant Packet Size Limit Control */ + ETH_InitParam->GiantPacketSizeLimitCtrl = DISABLE; + /* Default 96-bit Inter-Packet Gap */ + ETH_InitParam->InterPacketGapVal = ETH_INTER_PACKET_GAP_96BIT; + /* Default Disable Checksum Offload function */ + ETH_InitParam->ChecksumOffload = DISABLE; + /* Default Internal Signal Control Source Address Field */ + ETH_InitParam->SrcAddrCtrl = ETH_SRC_ADDR_CTRL_INTERNAL_SIGNALS; + /* Default Disable ARP Offload function */ + ETH_InitParam->ARPOffload = DISABLE; + + /* Default Set Giant Packet Size Limit value: 0 */ + ETH_InitParam->GiantPacketSizeLimit = 0U; + /* Default Enable CRC Checking for Rx Packets */ + ETH_InitParam->DisRxPacketCRCCheck = DISABLE; + /* Default Disable Slow Protocol Detection */ + ETH_InitParam->SPDetect = DISABLE; + /* Default Disable Unicast Slow Protocol Packet Detect */ + ETH_InitParam->USPPacketDetect = DISABLE; + /* Default Disable Extended Inter-Packet Gap */ + ETH_InitParam->ExtInterPacketGap = DISABLE; + /* Default Set the minimum Inter-Packet Gap value: 0 */ + ETH_InitParam->ExtInterPacketGapVal = 0U; + /* Default Disable ARP Packet Drop */ + ETH_InitParam->DropARPPacket = DISABLE; + + /* Default Disable Promiscuous Mode */ + ETH_InitParam->Promiscuous = DISABLE; + /* Default Disable Hash Unicast Filtering Mode */ + ETH_InitParam->HashUnicast = DISABLE; + /* Default Disable Hash Multicast Filtering Mode */ + ETH_InitParam->HashMulticast = DISABLE; + /* Default Disable DA Inverse Filtering Mode */ + ETH_InitParam->DAInverseFiltering = DISABLE; + /* Default Disable Pass All Multicast Mode */ + ETH_InitParam->PassAllMulticast = DISABLE; + /* Default Enable Broadcast Packets */ + ETH_InitParam->DisBroadcastPackets = DISABLE; + /* Default Set the control packets: Filter out all */ + ETH_InitParam->PassControlPackets = ETH_CTRL_PACKETS_FLTR_ALL; + /* Default Disable SA Inverse Filtering Mode */ + ETH_InitParam->SAInverseFiltering = DISABLE; + /* Default Disable SA Filter */ + ETH_InitParam->SAFilter = DISABLE; + /* Default Disable Hash or Perfect Filter */ + ETH_InitParam->HashOrPerfectFilter = DISABLE; + /* Default Disable VLAN Tag Filter */ + ETH_InitParam->VLANTagFilter = DISABLE; + /* Default Disable Layer 3 and Layer 4 Filter */ + ETH_InitParam->Layer3Layer4Filter = DISABLE; + /* Default Forward Non-TCP/UDP over IP Packets */ + ETH_InitParam->DropNonTcpUdpPackets = DISABLE; + /* Default Disable Receive All mode */ + ETH_InitParam->ReceiveAll = DISABLE; + + /* Default Set Watchdog Timeout value: 2K bytes */ + ETH_InitParam->WatchdogTimeout = ETH_WDG_TIMEOUT_2KBYTES; + /* Default Disable Programmable Watchdog function */ + ETH_InitParam->ProgramWatchdog = DISABLE; + + /* Default Disable Transmit Flow Control function */ + ETH_InitParam->TxFlowControl = DISABLE; + /* Default Set Pause Low Threshold value: Minus 4 time slots */ + ETH_InitParam->PauseLowThreshold = ETH_PAUSE_LOW_THRESHOLD_PT4; + /* Default Enable Zero-Quanta Pause function */ + ETH_InitParam->DisZeroQuantaPause = DISABLE; + /* Default Set Pause Time field value: 0 */ + ETH_InitParam->PauseTime = 0U; + /* Default Disable Receive Flow Control function */ + ETH_InitParam->RxFlowControl = DISABLE; + /* Default Disable Unicast Pause Packet Detect */ + ETH_InitParam->UPPacketDetect = DISABLE; + + /* Default Set TX Queue Operation Mode: Store and Forward Mode */ + ETH_InitParam->TxQueueOperateMode = ETH_TXQUEUE_OPERATE_STOREFORWARD; + /* Default Set RX Queue Operation Mode: Store and Forward Mode */ + ETH_InitParam->RxQueueOperateMode = ETH_RXQUEUE_OPERATE_STOREFORWARD; + /* Default Disable Forward Undersized Good Packets function */ + ETH_InitParam->ForwardUSGoodPacket = DISABLE; + /* Default Disable Forward Error Packets function */ + ETH_InitParam->ForwardErrorPacket = DISABLE; + /* Default Enable Dropping of TCP/IP Checksum Error Packets */ + ETH_InitParam->DisDropTCPIPCSErrorPacket = DISABLE; + + /* Default Set DMA Tx/Rx Arbitration Scheme: Rx:Tx = 1:1 */ + ETH_InitParam->TxRxArbitration = ETH_DMA_ARBITRA_WRR_RX1_TX1; + /* Default Disable Descriptor Cache function */ + ETH_InitParam->DescriptorCache = DISABLE; + /* Default Set AHB Master interface burst: Unspecified length (INCR) or SINGLE transfers */ + ETH_InitParam->BurstMode = ETH_BURST_MODE_UNFIXED; + /* Default Disable AHB Master interface address-aligned burst transfers on Read and Write channels */ + ETH_InitParam->AddrAlignedBeats = DISABLE; + /* Default Disable AHB Master to rebuild the pending beats of any initiated burst transfer with INCRx and SINGLE transfers */ + ETH_InitParam->RebuildINCRxBurst = DISABLE; + /* Default Set the maximum segment size: 0 */ + ETH_InitParam->MaxSegmentSize = 0U; + /* Default Disable PBL multiplication by eigh mode */ + ETH_InitParam->PBLx8mode = DISABLE; + /* Default Set the Word number to skip between two unchained descriptors: 0-bit */ + ETH_InitParam->DescriptorSkipLen = ETH_DESC_SKIP_LEN_0BIT; + /* Default Disable Operate on Second Packet mode */ + ETH_InitParam->OperateSecondPacket = DISABLE; + /* Default Disable TCP Segmentation function */ + ETH_InitParam->TCPSegment = DISABLE; + /* Default Set the maximum number of beats to be transferred in one DMA block data transfer: 1 */ + ETH_InitParam->TxBurstLength = ETH_TX_PROGRAM_BURST_LEN_1; + /* Default Disable Early Transmit Interrupt function */ + ETH_InitParam->EarlyTxInterruptCtrl = DISABLE; + /* Default Set the maximum number of beats to be transferred in one DMA block data transfer: 1 */ + ETH_InitParam->RxBurstLength = ETH_RX_PROGRAM_BURST_LEN_1; + /* Default Disable Early Receive Interrupt function */ + ETH_InitParam->EarlyRxInterruptCtrl = DISABLE; + /* Default Disable Rx Packet Flush function */ + ETH_InitParam->RxPacketFlush = DISABLE; +} + +/** +*\*\name ETH_DMATxDescListInit. +*\*\fun Initialize the ETH DMA transmit descriptor. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\return none +**/ +void ETH_DMATxDescListInit(ETH_Module* ETHx, ETH_InfoType* pInfo) +{ + uint32_t TempIndex; + ETH_DMADescType* pTxDescriptor = NULL; + + /* Fill each DMATxDesc descriptor with the right values */ + for (TempIndex = 0U; TempIndex < ETH_TX_DESC_NUMBER; TempIndex++) + { + /* Get the descriptor address */ + pTxDescriptor = (pInfo->pTxDesc + TempIndex); + + pTxDescriptor->DESC0 = 0U; + pTxDescriptor->DESC1 = 0U; + pTxDescriptor->DESC2 = 0U; + pTxDescriptor->DESC3 = 0U; + /* Save Tx descritors adresses */ + pInfo->TxDescList.TxDesc[TempIndex] = (uint32_t)pTxDescriptor; + } + /* Set the current descriptor index to 0 */ + pInfo->TxDescList.CurTxDesc = 0U; + + /* Set Tx Descriptor Ring Length, The value written to the ETH_DMACH0TXDRLEN + register must be the number of descriptors - 1 */ + WRITE_REG(ETHx->DMACH0TXDRLEN, (ETH_TX_DESC_NUMBER -1U)); + + /* Set Tx Descriptor List Address */ + WRITE_REG(ETHx->DMACH0TXDLA, (uint32_t)pInfo->pTxDesc); + + /* Set Tx Descriptor Tail pointer */ + WRITE_REG(ETHx->DMACH0TXDTP, (uint32_t)pInfo->pTxDesc); +} + +/** +*\*\name ETH_DMARxDescListInit. +*\*\fun Initialize the ETH DMA Receive descriptor. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\return none +**/ +void ETH_DMARxDescListInit(ETH_Module* ETHx, ETH_InfoType* pInfo) +{ + uint32_t TempIndex; + ETH_DMADescType* pRxDescriptor = NULL; + + /* Fill each DMATxDesc descriptor with the right values */ + for (TempIndex = 0U; TempIndex < ETH_RX_DESC_NUMBER; TempIndex++) + { + /* Get the descriptor address */ + pRxDescriptor = (pInfo->pRxDesc + TempIndex); + + pRxDescriptor->DESC0 = 0U; + pRxDescriptor->DESC1 = 0U; + pRxDescriptor->DESC2 = 0U; + pRxDescriptor->DESC3 = 0U; + pRxDescriptor->Buf1Addr = 0U; + pRxDescriptor->Buf2Addr = 0U; + /* Save Rx descritors adresses */ + pInfo->RxDescList.RxDesc[TempIndex] = (uint32_t)pRxDescriptor; + } + /* Set the current descriptor index to 0 */ + pInfo->RxDescList.CurRxDesc = 0U; + /* Set the first descriptor to 0 */ + pInfo->RxDescList.FirstAppDesc = 0U; + /* Set the number of descriptors for the last packet to 0 */ + pInfo->RxDescList.AppDescNbr = 0U; + /* Set to not generate a receive completion interrupt */ + pInfo->RxDescList.ItMode = 0U; + /* Set to a non-context descriptor */ + pInfo->RxDescList.AppContextDesc = 0U; + + /* Set Rx Descriptor Ring Length, The value written to the ETH_DMACH0RXCTRL2 + register must be the number of descriptors - 1 */ + WRITE_REG(ETHx->DMACH0RXCTRL2, (ETH_RX_DESC_NUMBER - 1U)); + + /* Set Rx Descriptor List Address */ + WRITE_REG(ETHx->DMACH0RXDLA, (uint32_t)pInfo->pRxDesc); + + /* Set Rx Descriptor Tail pointer */ + WRITE_REG(ETHx->DMACH0RXDTP, (uint32_t)(pInfo->pRxDesc + ((ETH_RX_DESC_NUMBER - 1U) * sizeof(ETH_DMADescType)))); +} + +/** +*\*\name ETH_ConfigMDCNormalClock. +*\*\fun Configure the normal clock frequency (1.0MHz ≤ MDC clock ≤ 2.5MHz) of the +*\*\ MDC based on the CSR clock frequency(HclkFreq), +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pClk: +*\*\ - pointer to a RCC_ClocksTypeDef structure which will hold the clocks frequencies. +*\*\return none +**/ +void ETH_ConfigMDCNormalClock(ETH_Module* ETHx, RCC_ClocksTypeDef* pClk) +{ + uint32_t HclkFreq; + + if (ETHx == ETH1) + { + /* CSR clock of ETH1 is the AHB2 clock */ + HclkFreq = pClk->AHB2ClkFreq; + } + else + { + /* CSR clock of ETH2 is the AHB1 clock */ + HclkFreq = pClk->AHB1ClkFreq; + } + + /* Set CR[3:0] bits by HclkFreq */ + if((HclkFreq >= ETH_MACCSR_CLOCK_FREQ_20M) && (HclkFreq < ETH_MACCSR_CLOCK_FREQ_35M)) + { + /* CSR Clock Range between 20-35 MHz */ + MODIFY_REG(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_CR_MASK, ETH_MDCNCLK_CRSCLK_DIV16); + } + else if((HclkFreq >= ETH_MACCSR_CLOCK_FREQ_35M) && (HclkFreq < ETH_MACCSR_CLOCK_FREQ_60M)) + { + /* CSR Clock Range between 35-60 MHz */ + MODIFY_REG(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_CR_MASK, ETH_MDCNCLK_CRSCLK_DIV26); + } + else if((HclkFreq >= ETH_MACCSR_CLOCK_FREQ_60M) && (HclkFreq < ETH_MACCSR_CLOCK_FREQ_100M)) + { + /* CSR Clock Range between 60-100 MHz */ + MODIFY_REG(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_CR_MASK, ETH_MDCNCLK_CRSCLK_DIV42); + } + else if((HclkFreq >= ETH_MACCSR_CLOCK_FREQ_100M) && (HclkFreq < ETH_MACCSR_CLOCK_FREQ_150M)) + { + /* CSR Clock Range between 100-150 MHz */ + MODIFY_REG(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_CR_MASK, ETH_MDCNCLK_CRSCLK_DIV62); + } + else if((HclkFreq >= ETH_MACCSR_CLOCK_FREQ_150M) && (HclkFreq <= ETH_MACCSR_CLOCK_FREQ_250M)) + { + /* CSR Clock Range between 150-250 MHz */ + MODIFY_REG(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_CR_MASK, ETH_MDCNCLK_CRSCLK_DIV102); + } + else if((HclkFreq >= ETH_MACCSR_CLOCK_FREQ_250M) && (HclkFreq < ETH_MACCSR_CLOCK_FREQ_300M)) + { + /* CSR Clock Range between 250-300 MHz */ + MODIFY_REG(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_CR_MASK, ETH_MDCNCLK_CRSCLK_DIV124); + } + else if((HclkFreq >= ETH_MACCSR_CLOCK_FREQ_300M) && (HclkFreq <= ETH_MACCSR_CLOCK_FREQ_500M)) + { + /* CSR Clock Range between 300-500 MHz */ + MODIFY_REG(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_CR_MASK, ETH_MDCNCLK_CRSCLK_DIV204); + } + else /* (HclkFreq >= ETH_MACCSR_CLOCK_FREQ_500M) && (HclkFreq <= ETH_MACCSR_CLOCK_FREQ_800M) */ + { + /* CSR Clock Range between 500-800 MHz */ + MODIFY_REG(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_CR_MASK, ETH_MDCNCLK_CRSCLK_DIV324); + } +} + +/** +*\*\name ETH_ConfigMDCFastClock. +*\*\fun Configure the fast clock frequency (MDC clock > 2.5MHz) of the MDC based +*\*\ on the CSR clock frequency(HclkFreq), +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param DivValue (The input parameters must be the following values): +*\*\ - ETH_MDCFCLK_CRSCLK_DIV4 +*\*\ - ETH_MDCFCLK_CRSCLK_DIV6 +*\*\ - ETH_MDCFCLK_CRSCLK_DIV8 +*\*\ - ETH_MDCFCLK_CRSCLK_DIV10 +*\*\ - ETH_MDCFCLK_CRSCLK_DIV12 +*\*\ - ETH_MDCFCLK_CRSCLK_DIV14 +*\*\ - ETH_MDCFCLK_CRSCLK_DIV16 +*\*\ - ETH_MDCFCLK_CRSCLK_DIV18 +*\*\return none +*\*\note Configure for fast clocks is only supported if the interface chip supports +*\*\ faster MDC clocks. +**/ +void ETH_ConfigMDCFastClock(ETH_Module* ETHx, uint32_t DivValue) +{ + /* Set CR[3:0] bits */ + MODIFY_REG(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_CR_MASK, DivValue); +} + +/** +*\*\name ETH_ReadPHYRegister. +*\*\fun Read a PHY register. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param PHYAddr : +*\*\ - PHY port address, must be a value from 0 to 31. +*\*\param PHYReg : +*\*\ - PHY register address, must be a value from 0 to 31. +*\*\param pRegValue : +*\*\ - Points to the address where the read PHY register value is stored. +*\*\return 0 or 1. +**/ +uint32_t ETH_ReadPHYRegister(ETH_Module* ETHx, uint32_t PHYAddr, uint32_t PHYReg, uint32_t* pRegValue) +{ + uint32_t TempReg; + uint32_t timeout = ETH_MDIO_BUS_TIMEOUT; + + /* Check for the Busy flag */ + if (READ_BIT(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_GB) != 0U) + { + /* PHY interface is busy, directly return 0 */ + return 0U; + } + + /* Get the ETH_MACMDIOADDR register value */ + TempReg = READ_REG(ETHx->MACMDIOADDR); + /* Set the PHY port address */ + MODIFY_REG(TempReg, ETH_MACMDIOADDR_PA, (PHYAddr << 21U)); + /* Set the PHY register address */ + MODIFY_REG(TempReg, ETH_MACMDIOADDR_RDA, (PHYReg << 16U)); + /* Set the read operation mode */ + MODIFY_REG(TempReg, ETH_MACMDIOADDR_GOC, (ETH_MACMDIOADDR_GOC0 | ETH_MACMDIOADDR_GOC1)); + + /* Set the MII Busy bit */ + SET_BIT(TempReg, ETH_MACMDIOADDR_GB); + + /* Write the set value into the MDII Address register */ + WRITE_REG(ETHx->MACMDIOADDR, TempReg); + + /* Wait for the Busy flag to clear */ + while (READ_BIT(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_GB) != 0U) + { + if (timeout == 0U) + { + /* Timeout, directly return 0 */ + return 0U; + } + + timeout--; + } + + /* Get MACMIIDR value */ + *pRegValue = READ_REG(ETHx->MACMDIODATA); + + /* Success, return 1 */ + return 1U; +} + +/** +*\*\name ETH_WritePHYRegister. +*\*\fun Write a PHY register. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param PHYAddr : +*\*\ - PHY port address, must be a value from 0 to 31. +*\*\param PHYReg : +*\*\ - PHY register address, must be a value from 0 to 31. +*\*\param PHYRegValue : +*\*\ - The value to write. +*\*\return 0 or 1. +**/ +uint32_t ETH_WritePHYRegister(ETH_Module* ETHx, uint32_t PHYAddr, uint32_t PHYReg, uint32_t PHYRegValue) +{ + uint32_t TempReg; + uint32_t timeout = ETH_MDIO_BUS_TIMEOUT; + + /* Check for the Busy flag */ + if (READ_BIT(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_GB) != 0U) + { + /* PHY interface is busy, directly return 0 */ + return 0U; + } + + /* Get the ETH_MACMDIOADDR register value */ + TempReg = READ_REG(ETHx->MACMDIOADDR); + /* Set the PHY port address */ + MODIFY_REG(TempReg, ETH_MACMDIOADDR_PA, (PHYAddr << 21U)); + /* Set the PHY register address */ + MODIFY_REG(TempReg, ETH_MACMDIOADDR_RDA, (PHYReg << 16U)); + /* Set the write operation mode */ + MODIFY_REG(TempReg, ETH_MACMDIOADDR_GOC, ETH_MACMDIOADDR_GOC0); + + /* Set the MII Busy bit */ + SET_BIT(TempReg, ETH_MACMDIOADDR_GB); + + /* Write the value to the MDIO data register */ + WRITE_REG(ETHx->MACMDIODATA, (uint16_t)PHYRegValue); + + /* Write the set value into the MDII Address register */ + WRITE_REG(ETHx->MACMDIOADDR, TempReg); + + /* Wait for the Busy flag to clear */ + while (READ_BIT(ETHx->MACMDIOADDR, ETH_MACMDIOADDR_GB) != 0U) + { + if (timeout == 0U) + { + /* Timeout, directly return 0 */ + return 0U; + } + + timeout--; + } + + /* Success, return 1 */ + return 1U; +} + +/** +*\*\name ETH_ExternalPHYInit. +*\*\fun Initialize the external PHY, including settings related to whether or +*\*\ not to enable the PHY auto-negotiation function. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\param ETH_InitParam : +*\*\ - Pointer to the ETH_InitType structure which will be initialized. +*\*\return One of EthFuncStatusType. +**/ +EthFuncStatusType ETH_ExternalPHYInit(ETH_Module* ETHx, ETH_InfoType* pInfo, ETH_InitType* ETH_InitParam) +{ + uint32_t TickStart; + uint32_t rPHYRegVlaue; + uint32_t wPHYRegVlaue; + uint32_t TempDelay = ETH_PHY_CONFIG_DELAY; + + /* Put the PHY in reset mode */ + if (!(ETH_WritePHYRegister(ETHx, (uint32_t)pInfo->PHYInfo.phyAddr, + (uint32_t)pInfo->PHYInfo.bcRegAddr, + (uint32_t)pInfo->PHYInfo.phyReset))) + { + /* Return ERROR */ + return ETH_ERROR_WPHY; + } + + /* Delay to assure PHY reset */ + __ETH_DELAY(TempDelay); + + /* Check that DWT is enabled or not */ + if ((DEM_CR & DEM_CR_TRCENA) == (uint32_t)RESET) + { + /* Enable and initialize DWT */ + __ETH_TICK_START(); + } + + /* Get tick */ + TickStart = __ETH_GET_TICK; + /* Wait for linked status */ + do + { + /* Read the PHY register */ + if (!(ETH_ReadPHYRegister(ETHx, (uint32_t)pInfo->PHYInfo.phyAddr, + (uint32_t)pInfo->PHYInfo.bsRegAddr, + &rPHYRegVlaue))) + { + /* Return ERROR */ + return ETH_ERROR_RPHY; + } + + if ((__ETH_GET_TICK - TickStart) > ETH_PHY_LINKED_TIMEOUT) + { + /* Disable tick */ + __ETH_TICK_STOP(); + /* Return timeout */ + return ETH_ERROR_TIMEOUT; + } + } while ((rPHYRegVlaue & pInfo->PHYInfo.phyLinkOK) != pInfo->PHYInfo.phyLinkOK); + + /* Read the PHY register */ + if (!(ETH_ReadPHYRegister(ETHx, (uint32_t)pInfo->PHYInfo.phyAddr, + (uint32_t)pInfo->PHYInfo.bcRegAddr, + &rPHYRegVlaue))) + { + /* Return ERROR */ + return ETH_ERROR_RPHY; + } + + /* Check whether to enable AutoNegotiation */ + if (pInfo->AutoNegCmd != DISABLE) + { + wPHYRegVlaue = rPHYRegVlaue; + /* Enable PHY auto-negotiation */ + wPHYRegVlaue |= pInfo->PHYInfo.phyAutoNeg; + + /* Write the PHY register */ + if (!(ETH_WritePHYRegister(ETHx, (uint32_t)pInfo->PHYInfo.phyAddr, + (uint32_t)pInfo->PHYInfo.bcRegAddr, + wPHYRegVlaue))) + { + /* Return ERROR */ + return ETH_ERROR_WPHY; + } + + /* Delay to assure PHY set */ + __ETH_DELAY(TempDelay); + + /* Get tick */ + TickStart = __ETH_GET_TICK; + /* Wait until the auto-negotiation will be completed */ + do + { + /* Read the PHY register */ + if (!(ETH_ReadPHYRegister(ETHx, (uint32_t)pInfo->PHYInfo.phyAddr, + (uint32_t)pInfo->PHYInfo.bsRegAddr, + &rPHYRegVlaue))) + { + /* Return ERROR */ + return ETH_ERROR_RPHY; + } + + if ((__ETH_GET_TICK - TickStart) > ETH_PHY_AUTONEGO_COMPLETED_TIMEOUT) + { + /* Disable tick */ + __ETH_TICK_STOP(); + /* Return timeout */ + return ETH_ERROR_TIMEOUT; + } + } while ((rPHYRegVlaue & pInfo->PHYInfo.phyAutoNegOK) != pInfo->PHYInfo.phyAutoNegOK); + + /* Set the MAC speed and duplex mode parameters by the read link status */ + switch (pInfo->PHYInfo.phyGetLinkStatus(pInfo->PHYInfo.phyAddr, pInfo->PHYInfo.sdRegAddr)) + { + case ETH_LINK_10FULL: + /* 10M */ + ETH_InitParam->SpeedSelect = ETH_SPEED_10M; + /* Full-duplex */ + ETH_InitParam->Duplex = ETH_FULL_DUPLEX_MODE; + break; + case ETH_LINK_10HALF: + /* 10M */ + ETH_InitParam->SpeedSelect = ETH_SPEED_10M; + /* Half-duplex */ + ETH_InitParam->Duplex = ETH_HALF_DUPLEX_MODE; + break; + case ETH_LINK_100FULL: + /* 100M */ + ETH_InitParam->SpeedSelect = ETH_SPEED_100M; + /* Full-duplex */ + ETH_InitParam->Duplex = ETH_FULL_DUPLEX_MODE; + break; + case ETH_LINK_100HALF: + /* 100M */ + ETH_InitParam->SpeedSelect = ETH_SPEED_100M; + /* Half-duplex */ + ETH_InitParam->Duplex = ETH_HALF_DUPLEX_MODE; + break; + case ETH_LINK_1000FULL: + /* 1000M */ + ETH_InitParam->SpeedSelect = ETH_SPEED_1000M; + /* Full-duplex */ + ETH_InitParam->Duplex = ETH_FULL_DUPLEX_MODE; + break; + case ETH_LINK_1000HALF: + /* 1000M */ + ETH_InitParam->SpeedSelect = ETH_SPEED_1000M; + /* Half-duplex */ + ETH_InitParam->Duplex = ETH_HALF_DUPLEX_MODE; + break; + default: + /* Return ERROR */ + return ETH_ERROR_PARAM; + } + } + else + { + wPHYRegVlaue = rPHYRegVlaue; + /* Disable PHY auto-negotiation */ + wPHYRegVlaue &= pInfo->PHYInfo.phyAutoNeg; + /* Clear the PHY speed bit */ + wPHYRegVlaue &= pInfo->PHYInfo.phySpeedMask; + /* Clear the PHY duplex bit */ + wPHYRegVlaue &= pInfo->PHYInfo.phyDuplexMask; + /* Set PHY speed, duplex mode */ + wPHYRegVlaue |= pInfo->PHYInfo.phyMode; + + /* Write the PHY register */ + if (!(ETH_WritePHYRegister(ETHx, (uint32_t)pInfo->PHYInfo.phyAddr, + (uint32_t)pInfo->PHYInfo.bcRegAddr, + wPHYRegVlaue))) + { + /* Return ERROR */ + return ETH_ERROR_WPHY; + } + + /* Delay to assure PHY set */ + __ETH_DELAY(TempDelay); + } + + /* Disable tick */ + __ETH_TICK_STOP(); + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** +*\*\name ETH_Init. +*\*\fun Initialize the ETH module with ETH_InitParam of type ETH_InitType, including +*\*\ ETH MAC initialization, MTL initialization, ETH DMA initialization, etc. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\param ETH_InitParam : +*\*\ - Pointer to the ETH_InitType structure which will be initialized. +*\*\return One of EthFuncStatusType. +**/ +EthFuncStatusType ETH_Init(ETH_Module* ETHx, ETH_InfoType* pInfo, ETH_InitType* ETH_InitParam) +{ + uint32_t TickStart; + uint32_t TempValue; + RCC_ClocksTypeDef Clk; + EthFuncStatusType TempStatus; + + /* Check the pInfo and ETH_InitParam parameter */ + if ((pInfo == NULL) || (ETH_InitParam == NULL)) + { + /* Return ERROR */ + return ETH_ERROR_PARAM; + } + + /* Enable AFIO Clock */ +#ifdef CORE_CM4 + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M4_AFIO, ENABLE); +#else /* CORE_CM7 */ + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M7_AFIO, ENABLE); +#endif + /* Check whether the media interface is GMII or MII or RMII */ + if (ETHx == ETH1) + { + /* ETH1 supports GMII, MII and RMII */ + if (pInfo->MediaInterface == ETH_GMII_MODE) + { + /* Enable GMII configuration in the AFIO register */ + AFIO_ConfigETH1Mode(ETH1_GMII_SEL); + } + else if (pInfo->MediaInterface == ETH_MII_MODE) + { + /* Enable MII configuration in the AFIO register */ + AFIO_ConfigETH1Mode(ETH1_MII_SEL); + } + else + { + /* Enable RMII configuration in the AFIO register */ + AFIO_ConfigETH1Mode(ETH1_RMII_SEL); + } + } + else + { + /* ETH2 supports MII and RMII */ + if (pInfo->MediaInterface == ETH_MII_MODE) + { + /* Enable MII configuration in the AFIO register */ + AFIO_ConfigETH2Mode(ETH2_MII_SEL); + } + else if (pInfo->MediaInterface == ETH_RMII_MODE) + { + /* Enable RMII configuration in the AFIO register */ + AFIO_ConfigETH2Mode(ETH2_RMII_SEL); + } + else + { + /* Returns ERROR if GMII is selected */ + return ETH_ERROR_MIF; + } + } + + /* Ethernet Software reset */ + /* Set the SWR bit: resets all MAC subsystem internal registers and logic */ + /* After reset all the registers holds their respective reset values */ + SET_BIT(ETHx->DMAMODE, ETH_DMAMODE_SWR); + + /* Check that DWT is enabled or not */ + if ((DEM_CR & DEM_CR_TRCENA) == (uint32_t)RESET) + { + /* Enable and initialize DWT */ + __ETH_TICK_START(); + } + + /* Get tick */ + TickStart = __ETH_GET_TICK; + /* Wait for software reset */ + while (READ_BIT(ETHx->DMAMODE, ETH_DMAMODE_SWR) != (uint32_t)RESET) + { + if ((__ETH_GET_TICK - TickStart) > ETH_SWRESET_TIMEOUT) + { + /* Disable tick */ + __ETH_TICK_STOP(); + + /* Return timeout */ + return ETH_ERROR_TIMEOUT; + } + } + + /* Disable tick */ + __ETH_TICK_STOP(); + + /* Get clock frequency value */ + RCC_GetClocksFreqValue(&Clk); + /* Check MDC clock mode */ + if (pInfo->MDCClockMode == ETH_MDCCLK_NORMAL) + { + /* Configure normal MDC clock */ + ETH_ConfigMDCNormalClock(ETHx, &Clk); + } + else + { + /* Configure Fast MDC Clock */ + ETH_ConfigMDCFastClock(ETHx, pInfo->CSRClkDiv); + } + + /* initialization the external PHY */ + TempStatus = ETH_ExternalPHYInit(ETHx, pInfo, ETH_InitParam); + /* Check if it has been successfully initialized */ + if (TempStatus != ETH_SUCCESS) + { + /* Return ERROR */ + return TempStatus; + } + + /** ETH MAC initialization configuration **/ + + /* Configure the ETH_MACCFG register, including setting PRELEN[1:0], DC, + BL[1:0], DR, DCRS, DO, ECRSFD, LM, DM, FES, PS, JE, JD, BE, WD, ACS, CST, + S2KP, GPSLCE, IPG[2:0], CSO, SARC[2:0], ARPOE bits */ + if (ETHx == ETH1) + { + /* ETH1 supports 10M/100M/1000M and packet bursting */ + TempValue = ((ETH_InitParam->TxPreambleLen) | (ETH_InitParam->DeferralCheck) + | (ETH_InitParam->BackOffLimit) | (ETH_InitParam->DisTxRetry) + | (ETH_InitParam->DisCSDuringTransmit) | (ETH_InitParam->DisRxOwn) + | (ETH_InitParam->CSBeforeTransmit) | (ETH_InitParam->Loopback) + | (ETH_InitParam->Duplex) | (ETH_InitParam->SpeedSelect) + | (ETH_InitParam->JumboPacket) | (ETH_InitParam->DisTxJabber) + | (ETH_InitParam->PacketBurst) + | (ETH_InitParam->DisRxWatchdog) | (ETH_InitParam->AutoPadCRCStrip) + | (ETH_InitParam->CRCStripTypePacket) | (ETH_InitParam->Support2KPacket) + | (ETH_InitParam->GiantPacketSizeLimitCtrl) + | (ETH_InitParam->InterPacketGapVal) | (ETH_InitParam->ChecksumOffload) + | (ETH_InitParam->SrcAddrCtrl) | (ETH_InitParam->ARPOffload)); + /* Write to ETH_MACCFG */ + MODIFY_REG(ETHx->MACCFG, ETH1_MACCFG_MASK, TempValue); + } + else + { + /* ETH2 supports 10M/100M and does not support packet bursting */ + TempValue = ((ETH_InitParam->TxPreambleLen) | (ETH_InitParam->DeferralCheck) + | (ETH_InitParam->BackOffLimit) | (ETH_InitParam->DisTxRetry) + | (ETH_InitParam->DisCSDuringTransmit) | (ETH_InitParam->DisRxOwn) + | (ETH_InitParam->CSBeforeTransmit) | (ETH_InitParam->Loopback) + | (ETH_InitParam->Duplex) | (ETH_InitParam->SpeedSelect) + | (ETH_InitParam->JumboPacket) | (ETH_InitParam->DisTxJabber) + | (ETH_InitParam->DisRxWatchdog) | (ETH_InitParam->AutoPadCRCStrip) + | (ETH_InitParam->CRCStripTypePacket) | (ETH_InitParam->Support2KPacket) + | (ETH_InitParam->GiantPacketSizeLimitCtrl) + | (ETH_InitParam->InterPacketGapVal) | (ETH_InitParam->ChecksumOffload) + | (ETH_InitParam->SrcAddrCtrl) | (ETH_InitParam->ARPOffload)); + /* Write to ETH_MACCFG */ + MODIFY_REG(ETHx->MACCFG, ETH2_MACCFG_MASK, TempValue); + } + + /* Configure the ETH_MACEXTCFG register, including setting GPSL, DCRCC, SPEN, + USP, EIPGEN, EIPG[4:0], APDIM bits */ + TempValue = ((ETH_InitParam->GiantPacketSizeLimit) | (ETH_InitParam->DisRxPacketCRCCheck) + | (ETH_InitParam->SPDetect) | (ETH_InitParam->USPPacketDetect) + | (ETH_InitParam->ExtInterPacketGap) | (ETH_InitParam->ExtInterPacketGapVal) + | (ETH_InitParam->DropARPPacket)); + /* Write to ETH_MACEXTCFG */ + MODIFY_REG(ETHx->MACEXTCFG, ETH_MACEXTCFG_MASK, TempValue); + + /* Configure the ETH_MACPFLT register, including setting PR, HUC, HMC, DAIF, + PM, DBF, PCF[1:0], SAIF, SAF, HPF, VTFE, IPFE, DNTU, RA bits */ + TempValue = ((ETH_InitParam->Promiscuous) | (ETH_InitParam->HashUnicast) + | (ETH_InitParam->HashMulticast) | (ETH_InitParam->DAInverseFiltering) + | (ETH_InitParam->PassAllMulticast) | (ETH_InitParam->DisBroadcastPackets) + | (ETH_InitParam->PassControlPackets) | (ETH_InitParam->SAInverseFiltering) + | (ETH_InitParam->SAFilter) | (ETH_InitParam->HashOrPerfectFilter) + | (ETH_InitParam->VLANTagFilter) | (ETH_InitParam->Layer3Layer4Filter) + | (ETH_InitParam->DropNonTcpUdpPackets)| (ETH_InitParam->ReceiveAll)); + /* Write to ETH_MACPFLT */ + MODIFY_REG(ETHx->MACPFLT, ETH_MACPFLT_MASK, TempValue); + + /* Configure the ETH_MACWDGTO register, including setting WTO[3:0], PWE bits */ + TempValue = ((ETH_InitParam->WatchdogTimeout) | (ETH_InitParam->ProgramWatchdog)); + /* Write to ETH_MACWDGTO */ + MODIFY_REG(ETHx->MACWDGTO, ETH_MACWDGTO_MASK, TempValue); + + /* Configure the ETH_MACTXFLWCTRL register, including setting TFE, PLT[2:0], + DZPQ, PT bits */ + TempValue = ((ETH_InitParam->TxFlowControl) | (ETH_InitParam->PauseLowThreshold) + | (ETH_InitParam->DisZeroQuantaPause) | (ETH_InitParam->PauseTime)); + /* Write to ETH_MACTXFLWCTRL */ + MODIFY_REG(ETHx->MACTXFLWCTRL, ETH_MACTXFLWCTRL_MASK, TempValue); + + /* Configure the ETH_MACRXFLWCTRL register, including setting RFE, UP bits */ + TempValue = ((ETH_InitParam->RxFlowControl) | (ETH_InitParam->UPPacketDetect)); + /* Write to ETH_MACRXFLWCTRL */ + MODIFY_REG(ETHx->MACRXFLWCTRL, ETH_MACRXFLWCTRL_MASK, TempValue); + + /** ETH MTL initialization configuration **/ + + /* Configure the ETH_MTLTXQOPMOD register, including setting TSF, TTC[2:0] bits */ + TempValue = (ETH_InitParam->TxQueueOperateMode); + /* Write to ETH_MTLTXQOPMOD */ + MODIFY_REG(ETHx->MTLTXQOPMOD, ETH_MTLTXQOPMOD_MASK, TempValue); + + /* Configure the ETH_MTLRXQOPMOD register, including setting RTC[1:0], FUP, FEP, + RSF, DISTCPEF bits */ + TempValue = ((ETH_InitParam->RxQueueOperateMode) | (ETH_InitParam->ForwardUSGoodPacket) + | (ETH_InitParam->ForwardErrorPacket) | (ETH_InitParam->DisDropTCPIPCSErrorPacket)); + /* Write to ETH_MTLRXQOPMOD */ + MODIFY_REG(ETHx->MTLRXQOPMOD, ETH_MTLRXQOPMOD_MASK, TempValue); + + /** ETH DMA initialization configuration **/ + + /* Configure the ETH_DMAMODE register, including setting DA, TXPR, PR[2:0], DCHE bits */ + TempValue = (ETH_InitParam->TxRxArbitration | (ETH_InitParam->DescriptorCache)); + /* Write to ETH_DMAMODE */ + MODIFY_REG(ETHx->DMAMODE, ETH_DMAMODE_MASK, TempValue); + + /* Configure the ETH_DMASBMODE register, including setting FB, AAL, MB, RB bits */ + TempValue = ((ETH_InitParam->BurstMode) | (ETH_InitParam->AddrAlignedBeats) + | (ETH_InitParam->RebuildINCRxBurst)); + /* Write to ETH_DMASBMODE */ + MODIFY_REG(ETHx->DMASBMODE, ETH_DMASBMODE_MASK, TempValue); + + /* Configure the ETH_DMACH0CTRL register, including setting MSS[13:0] PBLx8, DSL[2:0] bits */ + TempValue = ((ETH_InitParam->MaxSegmentSize) | (ETH_InitParam->PBLx8mode) + | (ETH_InitParam->DescriptorSkipLen)); + /* Write to ETH_DMACH0CTRL */ + MODIFY_REG(ETHx->DMACH0CTRL, ETH_DMACH0CTRL_MASK, TempValue); + + /* Configure the ETH_DMACH0TXCTRL register, including setting OSF, TSE, TxPBL[5:0], ETIC bits */ + TempValue = ((ETH_InitParam->OperateSecondPacket) | (ETH_InitParam->TCPSegment) + | (ETH_InitParam->TxBurstLength) | (ETH_InitParam->EarlyTxInterruptCtrl)); + /* Write to ETH_DMACH0TXCTRL */ + MODIFY_REG(ETHx->DMACH0TXCTRL, ETH_DMACH0TXCTRL_MASK, TempValue); + + /* Configure the ETH_DMACH0RXCTRL register, including setting RxPBL[5:0], ERIC, RPF bits */ + TempValue = ((ETH_InitParam->RxBurstLength) | (ETH_InitParam->EarlyRxInterruptCtrl) + | (ETH_InitParam->RxPacketFlush)); + /* Write to ETH_DMACH0RXCTRL */ + MODIFY_REG(ETHx->DMACH0RXCTRL, ETH_DMACH0RXCTRL_MASK, TempValue); + + /* Set Receive Buffers Length (must be a multiple of 4) */ + if ((pInfo->RxBuffLen % 4U) != 0U) + { + /* Return Error */ + return ETH_ERROR_PARAM; + } + else + { + /* Write to ETH_DMACH0RXCTRL */ + MODIFY_REG(ETHx->DMACH0RXCTRL, ETH_RXBUFFERSIZE_MASK, (pInfo->RxBuffLen << 1U)); + } + + /* Initialize transmit DMA descriptor */ + ETH_DMATxDescListInit(ETHx, pInfo); + /* Initialize receive DMA descriptor */ + ETH_DMARxDescListInit(ETHx, pInfo); + + /* Set MAC address high 16 bits */ + WRITE_REG(ETHx->MACADDR0H, ((uint32_t)(pInfo->pMACAddr[5U] << 8U) | (uint32_t)(pInfo->pMACAddr[4U]))); + /* Set MAC address low 32 bits */ + WRITE_REG(ETHx->MACADDR0L, ((uint32_t)(pInfo->pMACAddr[3U] << 24U) | (uint32_t)(pInfo->pMACAddr[2U] << 16U) + | (uint32_t)(pInfo->pMACAddr[1U] << 8U) | (uint32_t)(pInfo->pMACAddr[0U]))); + + /* Set 1 μs tick counter, used to update certain EEE-related counters */ + if (ETHx == ETH1) + { + /* CSR clock of ETH1 is the AHB2 clock */ + WRITE_REG(ETHx->MAC1USTICCNT, (((uint32_t)Clk.AHB2ClkFreq / ETH_MAC_US_TICK) - 1U)); + } + else + { + /* CSR clock of ETH1 is the AHB2 clock */ + WRITE_REG(ETHx->MAC1USTICCNT, (((uint32_t)Clk.AHB1ClkFreq / ETH_MAC_US_TICK) - 1U)); + } + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** +*\*\name ETH_TxMACCmd. +*\*\fun Enables or disables the MAC transmission. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_TxMACCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MAC transmission */ + SET_BIT(ETHx->MACCFG, ETH_MACCFG_TE); + } + else + { + /* Disable the MAC transmission */ + CLEAR_BIT(ETHx->MACCFG, ETH_MACCFG_TE); + } +} + +/** +*\*\name ETH_RxMACCmd. +*\*\fun Enables or disables the MAC reception. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_RxMACCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MAC reception */ + SET_BIT(ETHx->MACCFG, ETH_MACCFG_RE); + } + else + { + /* Disable the MAC reception */ + CLEAR_BIT(ETHx->MACCFG, ETH_MACCFG_RE); + } +} + +/** +*\*\name ETH_SetHashTable. +*\*\fun Set the ETH Hash Table Value. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pHashTable : +*\*\ - Pointer to a table of two 32 bit values, that contains the 64 +*\*\ bits of the hash table. +*\*\return none +**/ +void ETH_SetHashTable(ETH_Module* ETHx, uint32_t *pHashTable) +{ + /* Set the [31:0] bits of the hash table */ + WRITE_REG(ETHx->MACHASHTR0, pHashTable[0]); + /* Set the [63:32] bits of the hash table */ + WRITE_REG(ETHx->MACHASHTR1, pHashTable[1]); +} + +/** +*\*\name ETH_RxVLANTagStructInit. +*\*\fun Initializes the structure parameter of type ETH_RxVLANTagInitType used to +*\*\ initialize VLAN tag. This function is usually called before initializing +*\*\ a parameter of type ETH_RxVLANTagInitType. +*\*\param ETH_InitParam : +*\*\ - Pointer to the ETH_RxVLANTagInitType structure which will be initialized. +*\*\return none +**/ +void ETH_RxVLANTagStructInit(ETH_RxVLANTagInitType* ETH_RxVTInitParam) +{ + /** Set the default configuration **/ + + /* Default Disable VLAN Tag Hash Table Match */ + ETH_RxVTInitParam->VLANTagHashTableMatch = DISABLE; + /* Default Disable VLAN Tag in Rx status */ + ETH_RxVTInitParam->VLANTagInStatus = DISABLE; + /* Default Set the VLAN Tag Stripping on Receive: NONE */ + ETH_RxVTInitParam->StripVLANTag = ETH_VLANTAGRXSTRIPPING_NONE; + /* Default Set VLAN Type Check: DISABLE Check */ + ETH_RxVTInitParam->VLANTypeCheck = ETH_VLANTYPECHECK_DISABLE; + /* Default Disable VLAN Tag Inverse Match */ + ETH_RxVTInitParam->VLANTagInverceMatch = DISABLE; + /* Default Disable 12-Bit VLAN Tag Comparison */ + ETH_RxVTInitParam->VLANTagComparison12Bit = DISABLE; +} + +/** +*\*\name ETH_RxVLANTagInit. +*\*\fun Initialize VLAN tag processing on the receive path. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param ETH_RxVTInitParam : +*\*\ - Pointer to the ETH_RxVLANTagInitType structure which will be initialized. +*\*\return none +**/ +void ETH_RxVLANTagInit(ETH_Module* ETHx, ETH_RxVLANTagInitType* ETH_RxVTInitParam) +{ + uint32_t TempValue; + + /* Configure the ETH_MACVLANTAG register, including setting VTHM, EVLRXS, EVLS, DOVLTC, + ERSVLM, ESVL, VTIM, ETV, VL[15:0] bits */ + TempValue = ((ETH_RxVTInitParam->VLANTagInStatus) | (ETH_RxVTInitParam->VLANTagHashTableMatch) + | (ETH_RxVTInitParam->StripVLANTag) | (ETH_RxVTInitParam->VLANTypeCheck) + | (ETH_RxVTInitParam->VLANTagInverceMatch) | (ETH_RxVTInitParam->VLANTagComparison12Bit)); + /* Write to ETH_MACVLANTAG */ + MODIFY_REG(ETHx->MACVLANTAG, ETH_MACVLANTAG_MASK, TempValue); +} + +/** +*\*\name ETH_SetVLANHashTable. +*\*\fun Set the ETH VLAN Hash Table Value. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param HashTable : +*\*\ - VLAN hash table 16 bit value. +*\*\return none +**/ +void ETH_SetVLANHashTable(ETH_Module* ETHx, uint16_t HashTable) +{ + /* Set the [16:0] bits of the VLAN hash table */ + WRITE_REG(ETHx->MACVHASHT, HashTable); +} + +/** +*\*\name ETH_SetRxVLANIdentifier. +*\*\fun Set the VLAN Identifier for Rx packets. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param VLANIdentifier : +*\*\ - VLAN Identifier value. +*\*\return none +**/ +void ETH_SetRxVLANIdentifier(ETH_Module* ETHx, uint32_t VLANIdentifier) +{ + /* Check if 12-bit compare is enabled */ + if (READ_BIT(ETHx->MACVLANTAG, ETH_MACVLANTAG_ETV) != (uint32_t)RESET) + { + /* Write 12-bit Identifier */ + MODIFY_REG(ETHx->MACVLANTAG, ETH_MACVLANTAG_VL_VID, VLANIdentifier); + } + else + { + /* Write 16-bit Identifier */ + MODIFY_REG(ETHx->MACVLANTAG, ETH_MACVLANTAG_VL, VLANIdentifier); + } +} + +/** +*\*\name ETH_InitiatePauseControlPacket. +*\*\fun Initiates a pause control packet transmission during TX flow control +*\*\ operation. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +*\*\note The pause packet function is only valid when the MAC is configured +*\*\ in full-duplex mode. +*\*\note During control packet transmission, this bit remains set to 1 to +*\*\ indicate that packet transmission is in progress. When pause packet +*\*\ transmission is complete, the MAC resets this bit to 0. No write +*\*\ operations should be performed to this register until this bit is +*\*\ cleared. +**/ +void ETH_InitiatePauseControlPacket(ETH_Module* ETHx) +{ + /* Initiates pause control packet */ + SET_BIT(ETHx->MACTXFLWCTRL, ETH_MACTXFLWCTRL_FCB); +} + +/** +*\*\name ETH_ActivateBackpressure. +*\*\fun Activate backpressure function during TX flow control operation. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +*\*\note Activate backpressure function is only valid when the MAC is configured +*\*\ in half-duplex mode. +*\*\note during backpressure, when the MAC receives a new frame, the transmitter +*\*\ starts sending a JAM pattern resulting in a collision. +*\*\note BPA is automatically disabled when the MAC is configured in full-duplex +*\*\ mode. +**/ +void ETH_ActivateBackpressure(ETH_Module* ETHx) +{ + /* Activate the MAC BackPressure operation */ + SET_BIT(ETHx->MACTXFLWCTRL, ETH_MACTXFLWCTRL_BPA); +} + +/** +*\*\name ETH_PowerDownCmd. +*\*\fun Enables or disables the ETH Power Down mode. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_PowerDownCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MAC Power Down */ + /* This puts the MAC in power down mode */ + SET_BIT(ETHx->MACPMTCTRLSTS, ETH_MACPMTCTRLSTS_PWRDWN); + } + else + { + /* Disable the MAC Power Down */ + CLEAR_BIT(ETHx->MACPMTCTRLSTS, ETH_MACPMTCTRLSTS_PWRDWN); + } +} + +/** +*\*\name ETH_MagicPacketDetectionCmd. +*\*\fun Enables or disables the MAC Magic Packet Detection. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MagicPacketDetectionCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MAC Magic Packet Detection */ + SET_BIT(ETHx->MACPMTCTRLSTS, ETH_MACPMTCTRLSTS_MGKPKTEN); + } + else + { + /* Disable the MAC Magic Packet Detection */ + CLEAR_BIT(ETHx->MACPMTCTRLSTS, ETH_MACPMTCTRLSTS_MGKPKTEN); + } +} + +/** +*\*\name ETH_WakeUpPacketDetectionCmd. +*\*\fun Enables or disables the MAC Remote Wake-Up Packet Detection. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_WakeUpPacketDetectionCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MAC Remote Wake-Up Packet Detection */ + SET_BIT(ETHx->MACPMTCTRLSTS, ETH_MACPMTCTRLSTS_RWKPKTEN); + } + else + { + /* Disable the MAC Remote Wake-Up Packet Detection */ + CLEAR_BIT(ETHx->MACPMTCTRLSTS, ETH_MACPMTCTRLSTS_RWKPKTEN); + } +} + +/** +*\*\name ETH_GlobalUnicastWakeUpCmd. +*\*\fun Enables or disables any unicast packet filtered by the MAC +*\*\ address recognition to be a wake-up packet. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_GlobalUnicastWakeUpCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MAC Remote Wake-Up Packet Detection */ + SET_BIT(ETHx->MACPMTCTRLSTS, ETH_MACPMTCTRLSTS_GLBLUCAST); + } + else + { + /* Disable the MAC Remote Wake-Up Packet Detection */ + CLEAR_BIT(ETHx->MACPMTCTRLSTS, ETH_MACPMTCTRLSTS_GLBLUCAST); + } +} + +/** +*\*\name ETH_ResetWakeUpPacketFilterRegPointer. +*\*\fun Reset Wakeup packet filter register pointer. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +void ETH_ResetWakeUpPacketFilterRegPointer(ETH_Module* ETHx) +{ + /* Resets the Remote Wake-up packet Filter register pointer to 0x0000 */ + SET_BIT(ETHx->MACPMTCTRLSTS, ETH_MACPMTCTRLSTS_RWKFILTRST); +} + +/** +*\*\name ETH_SetWakeUpPacketFilterRegister. +*\*\fun Populates the remote wakeup packet registers. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pBuffer : +*\*\ - Pointer on remote WakeUp Packet Filter Register buffer data (8 words). +*\*\return none +*\*\note When MAC RWK Packet Filter register is written, the content is transferred +*\*\ from CSR clock domain to PHY receive clock domain after the write operation, +*\*\ there should not be any further write to the MAC RWK Packet Filter register +*\*\ until the first write is updated in PHY receive clock domain. Otherwise, the +*\*\ second write operation does not get updated to the PHY receive clock domain. +*\*\ Therefore, the delay between two writes to the MAC RWK Packet Filter register +*\*\ should be at least 4 cycles of the PHY receive clock. +**/ +void ETH_SetWakeUpPacketFilterRegister(ETH_Module* ETHx, uint32_t *pBuffer) +{ + uint32_t TempIndex; + uint32_t TempDelay = ETH_WRITE_REG_DELAY; + + for (TempIndex = 0; TempIndex < ETH_WAKEUP_REGISTER_LEN; TempIndex++) + { + /* Write each time to the same register */ + WRITE_REG(ETHx->MACRWUPFLT, pBuffer[TempIndex]); + + /* Must be delayed at least 4 cycles of the PHY receive clock */ + __ETH_DELAY(TempDelay); + } +} + +/** +*\*\name ETH_CSRRegisterWrite1ClearCmd. +*\*\fun Enables or disables Write 1 clear mode for some CSR registers. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_CSRRegisterWrite1ClearCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enables Write 1 clear mode for some CSR registers */ + /* The application needs to set the corresponding bit to 1 to clear it */ + SET_BIT(ETHx->MACCSRSWCTRL, ETH_MACCSRSWCTRL_RCWE); + } + else + { + /* Disable Write 1 clear mode for some CSR registers */ + /* The access mode for these register fields remains "read clear" */ + CLEAR_BIT(ETHx->MACCSRSWCTRL, ETH_MACCSRSWCTRL_RCWE); + } +} + +/** +*\*\name ETH_SetMACAddress. +*\*\fun Set MAC address by application layer setting. Support configuring +*\*\ MAC address registers 0~3. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Offset (The input parameters must be the following values): +*\*\ - ETH_MAC_ADDR0_OFFSET +*\*\ - ETH_MAC_ADDR1_OFFSET +*\*\ - ETH_MAC_ADDR2_OFFSET +*\*\ - ETH_MAC_ADDR3_OFFSET +*\*\param pAddr: +*\*\ - Pointer on MAC address buffer +*\*\return none +**/ +void ETH_SetMACAddress(ETH_Module* ETHx, EthMacAddr0123Type Offset, uint8_t* pAddr) +{ + uint32_t TempValue; + uint32_t macAddrRegBaseH; + uint32_t macAddrRegBaseL; + + /* Get the MAC address high register base address */ + macAddrRegBaseH = (uint32_t)&(ETHx->MACADDR0H); + + /* Get the MAC address low register base address */ + macAddrRegBaseL = (uint32_t)&(ETHx->MACADDR0L); + + /* Set MAC addr high bits (32~47) */ + TempValue = (((uint32_t)(pAddr[5]) << 8) | (uint32_t)pAddr[4]); + (*(__IO uint32_t *) (macAddrRegBaseH + Offset)) = TempValue; + + /* Set MAC addr low bits (0~31) */ + TempValue = (((uint32_t)(pAddr[3]) << 24) | ((uint32_t)(pAddr[2]) << 16) | + ((uint32_t)(pAddr[1]) << 8) | (uint32_t)pAddr[0]); + (*(__IO uint32_t *) (macAddrRegBaseL + Offset)) = TempValue; +} + +/** +*\*\name ETH_GetMACAddress. +*\*\fun Get MAC address by application layer setting. Support get MAC address +*\*\ registers 0~3. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Offset (The input parameters must be the following values): +*\*\ - ETH_MAC_ADDR0_OFFSET +*\*\ - ETH_MAC_ADDR1_OFFSET +*\*\ - ETH_MAC_ADDR2_OFFSET +*\*\ - ETH_MAC_ADDR3_OFFSET +*\*\param pAddr: +*\*\ - Pointer on MAC address buffer +*\*\return none +**/ +void ETH_GetMACAddress(ETH_Module* ETHx, EthMacAddr0123Type Offset, uint8_t* pAddr) +{ + uint32_t TempValue; + uint32_t macAddrRegBaseH; + uint32_t macAddrRegBaseL; + + /* Get the MAC address high register base address */ + macAddrRegBaseH = (uint32_t)&(ETHx->MACADDR0H); + + /* Get the MAC address low register base address */ + macAddrRegBaseL = (uint32_t)&(ETHx->MACADDR0L); + + /* Get the MAC address high register value */ + TempValue = *(__IO uint32_t *) (macAddrRegBaseH + Offset); + /* Save MAC addr high bits (32~47) */ + pAddr[5] = ((TempValue >> 8) & (uint8_t)0xFF); + pAddr[4] = (TempValue & (uint8_t)0xFF); + + /* Get the MAC address low register value */ + TempValue = *(__IO uint32_t *) (macAddrRegBaseL + Offset); + /* Save MAC addr low bits (0~31) */ + pAddr[3] = ((TempValue >> 24) & (uint8_t)0xFF); + pAddr[2] = ((TempValue >> 16) & (uint8_t)0xFF); + pAddr[1] = ((TempValue >> 8) & (uint8_t)0xFF); + pAddr[0] = (TempValue & (uint8_t)0xFF); +} + +/** +*\*\name ETH_MACAddressPerfectFilterCmd. +*\*\fun Enables or disables the Address filter module uses the specified ETH +*\*\ MAC address (MAC address 1 ~ MAC address 3) for perfect filtering. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Offset (The input parameters must be the following values): +*\*\ - ETH_MACADDR1_OFFSET +*\*\ - ETH_MACADDR2_OFFSET +*\*\ - ETH_MACADDR3_OFFSET +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MACAddressPerfectFilterCmd(ETH_Module* ETHx, EthMacAddr123Type Offset, FunctionalStatus Cmd) +{ + uint32_t macAddrRegBaseH; + + /* Get the MAC address high register base address */ + macAddrRegBaseH = (uint32_t)&(ETHx->MACADDR0H); + + if (Cmd != DISABLE) + { + /* Enable the selected ETH MAC address (1~3) for perfect filtering */ + (*(__IO uint32_t *) (macAddrRegBaseH + Offset)) |= ETH_MACADDR1H_AE; + } + else + { + /* Disable the selected ETH MAC address (1~3) for perfect filtering */ + (*(__IO uint32_t *) (macAddrRegBaseH + Offset)) &= (~ETH_MACADDR1H_AE); + } +} + +/** +*\*\name ETH_SetMACAddressFilter. +*\*\fun Set the filter type for the specified ETH MAC address (MAC address 1 ~ +*\*\ MAC address 3). +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Offset (The input parameters must be the following values): +*\*\ - ETH_MACADDR1_OFFSET +*\*\ - ETH_MACADDR2_OFFSET +*\*\ - ETH_MACADDR3_OFFSET +*\*\param Filter (The input parameters must be the following values): +*\*\ - ETH_MACADDR_FILTER_SA +*\*\ - ETH_MACADDR_FILTER_DA +*\*\return none +**/ +void ETH_SetMACAddressFilter(ETH_Module* ETHx, EthMacAddr123Type Offset, EthMacAddrFilterType Filter) +{ + uint32_t macAddrRegBaseH; + + /* Get the MAC address high register base address */ + macAddrRegBaseH = (uint32_t)&(ETHx->MACADDR0H); + + if (Filter != ETH_MACADDR_FILTER_DA) + { + /* The selected ETH MAC address is used to compare with the SA fields of the + received frame */ + (*(__IO uint32_t *) (macAddrRegBaseH + Offset)) |= ETH_MACADDR1H_SA; + } + else + { + /* The selected ETH MAC address is used to compare with the DA fields of the + received frame */ + (*(__IO uint32_t *) (macAddrRegBaseH + Offset)) &= (~ETH_MACADDR1H_SA); + } +} + +/** +*\*\name ETH_SetMACAddressFilterMaskBytes. +*\*\fun Set the filter mask bytes for the specified ETH MAC address (MAC address 1 ~ +*\*\ MAC address 3). +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Offset (The input parameters must be the following values): +*\*\ - ETH_MACADDR1_OFFSET +*\*\ - ETH_MACADDR2_OFFSET +*\*\ - ETH_MACADDR3_OFFSET +*\*\param MaskByte (The input parameters must be the following values): +*\*\ - ETH_MACADDR_MASK_BYTE6 +*\*\ - ETH_MACADDR_MASK_BYTE5 +*\*\ - ETH_MACADDR_MASK_BYTE4 +*\*\ - ETH_MACADDR_MASK_BYTE3 +*\*\ - ETH_MACADDR_MASK_BYTE2 +*\*\ - ETH_MACADDR_MASK_BYTE1 +*\*\return none +**/ +void ETH_SetMACAddressFilterMaskBytes(ETH_Module* ETHx, EthMacAddr123Type Offset, uint32_t MaskByte) +{ + uint32_t macAddrRegBaseH; + + /* Get the MAC address high register base address */ + macAddrRegBaseH = (uint32_t)&(ETHx->MACADDR0H); + + /* Clear MBC bits in the selected MAC address high register */ + (*(__IO uint32_t*)(macAddrRegBaseH + Offset)) &= (~ETH_MACADDR_MASK_MBC); + + /* Set the selected Filetr mask bytes */ + (*(__IO uint32_t*)(macAddrRegBaseH + Offset)) |= MaskByte; +} + +/** +*\*\name ETH_MMCCountersReset. +*\*\fun Resets the MMC Counters. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +void ETH_MMCCountersReset(ETH_Module* ETHx) +{ + /* Resets the MMC Counters */ + SET_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_CNTRST); +} + +/** +*\*\name ETH_MMCCounterStopRolloverCmd. +*\*\fun Enables or disables the MMC Counter Stop Rollover. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MMCCounterStopRolloverCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MMC Counter Stop Rollover */ + /* The counter does not rollover to 0 after reaching the maximum value */ + SET_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_CNTSTOPRO); + } + else + { + /* Disable the MMC Counter Stop Rollover */ + CLEAR_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_CNTSTOPRO); + } +} + +/** +*\*\name ETH_MMCResetOnReadCmd. +*\*\fun Enables or disables the MMC Reset On Read. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MMCResetOnReadCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MMC Counter reset on read */ + SET_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_RSTONRD); + } + else + { + /* Disable the MMC Counter reset on read */ + CLEAR_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_RSTONRD); + } +} + +/** +*\*\name ETH_MMCCounterFreezeCmd. +*\*\fun Enables or disables the MMC Counter Freeze. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MMCCounterFreezeCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MMC Counter Freeze */ + SET_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_CNTFREEZ); + } + else + { + /* Disable the MMC Counter Freeze */ + CLEAR_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_CNTFREEZ); + } +} + +/** +*\*\name ETH_MMCCounterHalfPreset. +*\*\fun Preset and Initialize the MMC counters to almost-half value: +*\*\ 0x7FFF_FFF0. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +void ETH_MMCCounterHalfPreset(ETH_Module* ETHx) +{ + /* Preset and Initialize the MMC counters to almost-half value */ + CLEAR_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_CNTPRSTLVL); + + /* Enable counter preset function */ + SET_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_CNTPRST); +} + +/** +*\*\name ETH_MMCCounterFullPreset. +*\*\fun Preset and Initialize the MMC counters to almost-full value: +*\*\ 0xFFFF_FFF0. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +void ETH_MMCCounterFullPreset(ETH_Module* ETHx) +{ + /* Preset and Initialize the MMC counters to almost-full value */ + SET_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_CNTPRSTLVL); + + /* Enable counter preset function */ + SET_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_CNTPRST); +} + +/** +*\*\name ETH_MMCCounterUpdateForDropBCPacketCmd. +*\*\fun Enables or disables the Update MMC Counters for Dropped Broadcast +*\*\ Packets. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MMCCounterUpdateForDropBCPacketCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable Update MMC Counters for Dropped Broadcast Packets */ + SET_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_UCDBC); + } + else + { + /* Disable Update MMC Counters for Dropped Broadcast Packets */ + CLEAR_BIT(ETHx->MMCCTRL, ETH_MMCCTRL_UCDBC); + } +} + +/** +*\*\name ETH_GetMMCCounterValue. +*\*\fun Get the specified ETH MMC counter value. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Offset (The input parameters must be the following values): +*\*\ - ETH_MMC_SCGP_OFFSET +*\*\ - ETH_MMC_MCGP_OFFSET +*\*\ - ETH_MMC_PCG_OFFSET +*\*\ - ETH_MMC_BPG_OFFSET +*\*\ - ETH_MMC_MPG_OFFSET +*\*\ - ETH_MMC_CRCEP_OFFSET +*\*\ - ETH_MMC_AEP_OFFSET +*\*\ - ETH_MMC_UPG_OFFSET +*\*\return Corresponding counter value. +**/ +uint32_t ETH_GetMMCCounterValue(ETH_Module* ETHx, EthMmcAddrType Offset) +{ + uint32_t mmcRegBaseAddr; + + /* Get the ETH MMC register base address */ + mmcRegBaseAddr = (uint32_t)&(ETHx->MMCCTRL); + + /* Return the selected counter register value */ + return (*(__IO uint32_t *)(mmcRegBaseAddr + Offset)); +} + +/** +*\*\name ETH_MACTimeStampCmd. +*\*\fun Enables or disables the MAC timestamp. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MACTimeStampCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the time stamp for transmit and receive frames */ + SET_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSENA); + } + else + { + /* Disable the time stamp for transmit and receive frames */ + CLEAR_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSENA); + } +} + +/** +*\*\name ETH_SetTimeStampUpdateMethod. +*\*\fun Selects the MAC timestamp Update method. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Method (The input parameters must be the following values): +*\*\ - ETH_MACTS_FINE_UPDATE +*\*\ - ETH_MACTS_COARSE_UPDATE +*\*\return none +**/ +void ETH_SetTimeStampUpdateMethod(ETH_Module* ETHx, uint32_t Method) +{ + if (Method == ETH_MACTS_FINE_UPDATE) + { + /* Selects the Fine Update method */ + SET_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSCFUPDT); + } + else + { + /* Selects the Coarse Update method */ + CLEAR_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSCFUPDT); + } +} + +/** +*\*\name ETH_MACTimeStampInit. +*\*\fun Initialize the MAC timestamp. The system time is initialized +*\*\ (overwritten) with the values specified in the MAC System Time Seconds +*\*\ Update Register and the MAC System Time Nanoseconds Update Register. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +void ETH_MACTimeStampInit(ETH_Module* ETHx) +{ + /* Initialize the MAC Time Stamp */ + SET_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSINIT); +} + +/** +*\*\name ETH_MACTimeStampUpdate. +*\*\fun Update the MAC timestamp. The system time is updated (added or +*\*\ subtracted) with the values specified in the MAC System Time Seconds +*\*\ Update Register and the MAC System Time Nanoseconds Update Register. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +void ETH_MACTimeStampUpdate(ETH_Module* ETHx) +{ + /* Update the MAC Time Stamp */ + SET_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSUPDT); +} + +/** +*\*\name ETH_EnableTimeStampIntTrigger. +*\*\fun Enable the MAC TimeStamp interrupt trigger. the timestamp interrupt is +*\*\ generated when the System Time becomes greater than the value written +*\*\ in the Target Time register. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +// void ETH_EnableTimeStampIntTrigger(ETH_Module* ETHx) +// { +// /* Enable the MAC Time Stamp interrupt trigger */ +// SET_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TTSTRIG); +// } + +/** +*\*\name ETH_MACTimeStampAddendRegUpdate. +*\*\fun Update the MAC timestamp addend register. the content of the Timestamp +*\*\ Addend register is updated in the PTP block for fine correction. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +void ETH_MACTimeStampAddendRegUpdate(ETH_Module* ETHx) +{ + /* Update the MAC Time Stamp addend register */ + SET_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSADDREG); +} + +/** +*\*\name ETH_MACTimeStampAllPacketsCmd. +*\*\fun Enables or disables the MAC timestamp for All Packets. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MACTimeStampAllPacketsCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable Timestamp for All Packets */ + SET_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSENALL); + } + else + { + /* Disable Timestamp for all packets */ + CLEAR_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSENALL); + } +} + +/** +*\*\name ETH_MACTimeStampDigBinRolloverCmd. +*\*\fun Enables or disables the MAC timestamp Rollover for Digital or Binary. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MACTimeStampDigBinRolloverCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable Timestamp Digital or Binary Rollover */ + SET_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSCTRLSSR); + } + else + { + /* Disables Timestamp Digital or Binary Rollover */ + CLEAR_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSCTRLSSR); + } +} + +/** +*\*\name ETH_PTPTypePacketProcesCmd. +*\*\fun Enables or disables the processing for selected PTP packet type. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param PacketType (The input parameters must be the following values): +*\*\ - ETH_MACPTP_TYPE_VERSION2 +*\*\ - ETH_MACPTP_TYPE_ETHERNET +*\*\ - ETH_MACPTP_TYPE_IPV6UDP +*\*\ - ETH_MACPTP_TYPE_IPV4UDP (default) +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_PTPTypePacketProcesCmd(ETH_Module* ETHx, uint32_t PacketType, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable processing for selected PTP packet types */ + SET_BIT(ETHx->MACTSCTRL, PacketType); + } + else + { + /* Disable processing for selected PTP packet types */ + CLEAR_BIT(ETHx->MACTSCTRL, PacketType); + } +} + +/** +*\*\name ETH_MACAddrPTPPacketFilterCmd. +*\*\fun Enables or disables the MAC address for PTP packet filtering. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MACAddrPTPPacketFilterCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable MAC address for PTP packet filtering */ + SET_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSENMACADDR); + } + else + { + /* Disable MAC address for PTP packet filtering */ + CLEAR_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TSENMACADDR); + } +} + +/** +*\*\name ETH_MACTxTimeStampStatusModeCmd. +*\*\fun Enables or disables the MAC TX timestamp status mode. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MACTxTimeStampStatusModeCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable MAC TX timestamp status mode */ + SET_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TXTSSTSM); + } + else + { + /* Disable MAC TX timestamp status mode */ + CLEAR_BIT(ETHx->MACTSCTRL, ETH_MACTSCTRL_TXTSSTSM); + } +} + +/** +*\*\name ETH_SetSubSecondIncrementValue. +*\*\fun Sets the system time Sub-Second Increment value. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IncValue : +*\*\ - 0~0xFF +*\*\return none +**/ +void ETH_SetSubSecondIncrementValue(ETH_Module* ETHx, uint8_t IncValue) +{ + /* Set the Sub-Second Increment Register */ + WRITE_REG(ETHx->MACSUBSINC, ((uint32_t)IncValue << 16)); +} + +/** +*\*\name ETH_SetTimeStampUpdateValue. +*\*\fun Sets the Time Stamp update value. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param CalMode (The input parameters must be the following values): +*\*\ - ETH_MACTS_CALMODE_SUB +*\*\ - ETH_MACTS_CALMODE_ADD +*\*\param SecondValue : +*\*\ - 0~0xFFFFFFFF +*\*\param SubSecondValue : +*\*\ - 0~0x7FFFFFFF +*\*\return none +*\*\note When CalMode is set to ETH_MACTS_CALMODE_SUB, the seconds field +*\*\ and nanosecond field must be programmed with the complement of +*\*\ the corresponding part of the update value. +**/ +void ETH_SetTimeStampUpdateValue(ETH_Module* ETHx, uint32_t CalMode, uint32_t SecondValue, uint32_t SubSecondValue) +{ + /* Set MAC System Time Seconds Update Register */ + WRITE_REG(ETHx->MACSYSTSUP, SecondValue); + /* Set MAC System Time Nanosecond Update Register */ + WRITE_REG(ETHx->MACSYSTNSUP, (CalMode | SubSecondValue)); +} + +/** +*\*\name ETH_SetTimeStampAddendValue. +*\*\fun Sets the Time Stamp addend value. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param AddValue : +*\*\ - 0~0xFFFFFFFF +*\*\return none +**/ +void ETH_SetTimeStampAddendValue(ETH_Module* ETHx, uint32_t AddValue) +{ + /* Set the MAC Timestamp Add Register */ + WRITE_REG(ETHx->MACTSADD, AddValue); +} + +/** +*\*\name ETH_GetTimeStampRegValue. +*\*\fun Gets the specified ETH MAC TimeStamp register value. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Offset (The input parameters must be the following values): +*\*\ - ETH_MACTS_SSIR_OFFSET +*\*\ - ETH_MACTS_STSR_OFFSET +*\*\ - ETH_MACTS_STNSR_OFFSET +*\*\ - ETH_MACTS_STSUR_OFFSET +*\*\ - ETH_MACTS_STNSUR_OFFSET +*\*\ - ETH_MACTS_TAR_OFFSET +*\*\ - ETH_MACTS_TTSNSR_OFFSET +*\*\ - ETH_MACTS_TTSSR_OFFSET +*\*\ - ETH_MACTS_TICNSR_OFFSET +*\*\ - ETH_MACTS_TECNSR_OFFSET +*\*\ - ETH_MACTS_TILR_OFFSET +*\*\ - ETH_MACTS_TELR_OFFSET +*\*\ - ETH_MACTS_PTTSR_OFFSET +*\*\ - ETH_MACTS_PTTNSR_OFFSET +*\*\return Corresponding MAC TimeStamp value. +**/ +uint32_t ETH_GetTimeStampRegValue(ETH_Module* ETHx, EthTsAddrType Offset) +{ + uint32_t tsRegBaseAddr; + + /* Get the ETH MAC TimeStamp register base address */ + tsRegBaseAddr = (uint32_t)&(ETHx->MACTSCTRL); + + /* Return the selected MAC TimeStamp register value */ + return (*(__IO uint32_t *)(tsRegBaseAddr + Offset)); +} + +/** +*\*\name ETH_ConfigPPSOutput. +*\*\fun Configure the PPS output, e.g. configure the output frequency, +*\*\ which defaults to one pulse per second. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param OutputFreq (The input parameters must be the following values): +*\*\ - ETH_MACPPS_FREQCTRL_B2D1 +*\*\ - ETH_MACPPS_FREQCTRL_B4D2 +*\*\ - ETH_MACPPS_FREQCTRL_B8D4 +*\*\ - ETH_MACPPS_FREQCTRL_B16D8 +*\*\ - ETH_MACPPS_FREQCTRL_B32D16 +*\*\ - ETH_MACPPS_FREQCTRL_B64D32 +*\*\ - ETH_MACPPS_FREQCTRL_B128D64 +*\*\ - ETH_MACPPS_FREQCTRL_B256D128 +*\*\ - ETH_MACPPS_FREQCTRL_B512D256 +*\*\ - ETH_MACPPS_FREQCTRL_B1024D512 +*\*\ - ETH_MACPPS_FREQCTRL_B2048D1024 +*\*\ - ETH_MACPPS_FREQCTRL_B4096D2048 +*\*\ - ETH_MACPPS_FREQCTRL_B8192D4096 +*\*\ - ETH_MACPPS_FREQCTRL_B16384D8192 +*\*\ - ETH_MACPPS_FREQCTRL_B32768D16384 +*\*\return none +**/ +void ETH_ConfigPPSOutput(ETH_Module* ETHx, uint32_t OutputFreq) +{ + /* Set PPS Output Frequency Control field */ + MODIFY_REG(ETHx->MACPPSCTRL, ETH_MACPPSCTRL_PPSCTRL, OutputFreq); +} + +/** +*\*\name ETH_SetPPSTargetTimeValue. +*\*\fun Sets the PPS target time value with seconds field and nanosecond field. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param SecondValue : +*\*\ - 0~0xFFFFFFFF +*\*\param SubSecondValue : +*\*\ - 0~0x7FFFFFFF +*\*\return none +**/ +void ETH_SetPPSTargetTimeValue(ETH_Module* ETHx, uint32_t SecondValue, uint32_t SubSecondValue) +{ + /* Set MAC PPS Target Time Seconds Register */ + WRITE_REG(ETHx->MACPPSTTS, SecondValue); + /* Set MAC PPS Target Time Nanosecond Register */ + WRITE_REG(ETHx->MACPPSTTNS, SubSecondValue); +} + + + +/** +*\*\name ETH_MTLDropTxStatusCmd. +*\*\fun Enables or disables the Drop Transmit Status. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_MTLDropTxStatusCmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Tx packet status received from the MAC is dropped in the MTL */ + SET_BIT(ETHx->MTLOPMOD, ETH_MTLOPMOD_DTXSTS); + } + else + { + /* Tx packet status received from the MAC is forwarded to the application */ + CLEAR_BIT(ETHx->MTLOPMOD, ETH_MTLOPMOD_DTXSTS); + } +} + +/** +*\*\name ETH_MTLCounterPreset. +*\*\fun Preset and Initialize the MTL counters to value: 0x7F0. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +void ETH_MTLCounterPreset(ETH_Module* ETHx) +{ + /* Set the CNTPRST bit */ + SET_BIT(ETHx->MTLOPMOD, ETH_MTLOPMOD_CNTPRST); +} + +/** +*\*\name ETH_MTLCounterReset. +*\*\fun Reset all counters of MTL. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +*\*\note The counter reset control bit is automatically cleared after 1 clock +*\*\ cycle. +**/ +void ETH_MTLCounterReset(ETH_Module* ETHx) +{ + /* Set the CNTCLR bit */ + SET_BIT(ETHx->MTLOPMOD, ETH_MTLOPMOD_CNTCLR); +} + +/** +*\*\name ETH_FlushTransmitQueue. +*\*\fun Clears the ETH transmit FIFO. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +*\*\note The MTL Transmit Queue Operation Mode Register (ETH_MTLTXQOPMOD) +*\*\ should not be written until the flush operation is complete. +*\*\ This function causes all data in the Tx FIFO to be lost or flushed. +*\*\ However, data that has been accepted by the MAC transmitter will not +*\*\ be flushed. It will be scheduled for transmission and will result in +*\*\ underflow and short packets being sent. +**/ +void ETH_FlushTransmitQueue(ETH_Module* ETHx) +{ + /* Set the FTQ bit */ + SET_BIT(ETHx->MTLTXQOPMOD, ETH_MTLTXQOPMOD_FTQ); +} + +/** +*\*\name ETH_GetMTLUnderflowPacketCounter. +*\*\fun Get the number of packets aborted by the controller due to Tx queue +*\*\ underflow. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return Counter value: 0~0x7FF. +**/ +uint16_t ETH_GetMTLUnderflowPacketCounter(ETH_Module* ETHx) +{ + /* Return the value of the Underflow Packet Counter */ + return ((uint16_t)READ_BIT(ETHx->MTLTXQUDF, ETH_MTLTXQUDF_UFFRMCNT)); +} + +/** +*\*\name ETH_GetMTLOverflowPacketCounter. +*\*\fun Gets the number of packets discarded due to Rx queue overflow. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return Counter value: 0~0x7FF. +**/ +uint16_t ETH_GetMTLOverflowPacketCounter(ETH_Module* ETHx) +{ + /* Return the value of the Overflow Packet Counter */ + return ((uint16_t)READ_BIT(ETHx->MTLRXQMPOFCNT, ETH_MTLRXQMPOFCNT_OVFPKTCNT)); +} + +/** +*\*\name ETH_GetMTLMissedPacketCounter. +*\*\fun Gets the number of packets lost due to the application performing +*\*\ packet refresh requests against this queue. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return Counter value: 0~0x7FF. +**/ +uint16_t ETH_GetMTLMissedPacketCounter(ETH_Module* ETHx) +{ + /* Return the value of the Missed Packet Counter */ + return ((uint16_t)READ_BIT(ETHx->MTLRXQMPOFCNT, ETH_MTLRXQMPOFCNT_MISPKTCNT)); +} + + + +/** +*\*\name ETH_SoftwareReset. +*\*\fun ETH software reset, the MAC and the DMA controller reset the logic +*\*\ and all internal registers of the DMA, MTL, and MAC. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +*\*\note 1. The software reset status bit (SWR) is automatically cleared after +*\*\ the reset operation is completed. +*\*\ 2. Before reprogramming any ETH register, a value of zero should be +*\*\ read in SWR bit. +*\*\ 3. The SWR bit must be read at least 4 CSR clock cycles after it is +*\*\ written to 1. +**/ +void ETH_SoftwareReset(ETH_Module* ETHx) +{ + /* Set the SWR bit */ + SET_BIT(ETHx->DMAMODE, ETH_DMAMODE_SWR); +} + +/** +*\*\name ETH_TxDMACmd. +*\*\fun Enables or disables the DMA transmission. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_TxDMACmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the DMA transmission */ + SET_BIT(ETHx->DMACH0TXCTRL, ETH_DMACH0TXCTRL_ST); + } + else + { + /* Disable the DMA transmission */ + CLEAR_BIT(ETHx->DMACH0TXCTRL, ETH_DMACH0TXCTRL_ST); + } +} + +/** +*\*\name ETH_RxDMACmd. +*\*\fun Enables or disables the DMA reception. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_RxDMACmd(ETH_Module* ETHx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the DMA reception */ + SET_BIT(ETHx->DMACH0RXCTRL, ETH_DMACH0RXCTRL_SR); + } + else + { + /* Disable the DMA reception */ + CLEAR_BIT(ETHx->DMACH0RXCTRL, ETH_DMACH0RXCTRL_SR); + } +} + +/** +*\*\name ETH_ResumeDMATransmission. +*\*\fun Resume TX DMA by writing any value to transmit descriptor tail pointer +*\*\ register when TX DMA enters suspend mode. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +*\*\note This function is only applicable when the DMA enters suspend mode. +**/ +void ETH_ResumeDMATransmission(ETH_Module* ETHx) +{ + /* Write ETH_DMACH0TXDTP register */ + WRITE_REG(ETHx->DMACH0TXDTP, 0U); +} + +/** +*\*\name ETH_ResumeDMAReception. +*\*\fun Resume RX DMA by writing any value to receive descriptor tail pointer +*\*\ register when RX DMA enters suspend mode. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +*\*\note This function is only applicable when the DMA enters suspend mode. +**/ +void ETH_ResumeDMAReception(ETH_Module* ETHx) +{ + /* Write ETH_DMACH0RXDTP register */ + WRITE_REG(ETHx->DMACH0RXDTP, 0U); +} + +/** +*\*\name ETH_SetRxInterruptWatchdogTimer. +*\*\fun Set the watchdog timer for the DMA receive interrupt. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param CntUnit (The input parameters must be the following values): +*\*\ - ETH_DMARXINT_WDGTIM_CNTUNIT_256 +*\*\ - ETH_DMARXINT_WDGTIM_CNTUNIT_512 +*\*\ - ETH_DMARXINT_WDGTIM_CNTUNIT_1024 +*\*\ - ETH_DMARXINT_WDGTIM_CNTUNIT_2048 +*\*\param CntValue : +*\*\ - Count value: 0~0x000000FF. +*\*\return none +*\*\note Timer cycles = count unit * count value (CntUnit * CntValue) system +*\*\ clock cycles. +**/ +void ETH_SetRxInterruptWatchdogTimer(ETH_Module* ETHx, uint32_t CntUnit, uint32_t CntValue) +{ + /* Set the RWTU bit and RWT bit */ + MODIFY_REG(ETHx->DMACH0RXINTWT, (ETH_DMACH0RXINTWT_RWTU | ETH_DMACH0RXINTWT_RWT), (CntUnit | CntValue)); +} + +/** +*\*\name ETH_GetCurrentTxDescriptorAddress. +*\*\fun Gets the address of the current application transmit descriptor read +*\*\ by the DMA. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return The value of the current Tx descriptor address. +**/ +uint32_t ETH_GetCurrentTxDescriptorAddress(ETH_Module* ETHx) +{ + /* Return the value of ETH_DMACH0CATXD */ + return (READ_REG(ETHx->DMACH0CATXD)); +} + +/** +*\*\name ETH_GetCurrentRxDescriptorAddress. +*\*\fun Gets the address of the current application receive descriptor read +*\*\ by the DMA. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return The value of the current Rx descriptor address. +**/ +uint32_t ETH_GetCurrentRxDescriptorAddress(ETH_Module* ETHx) +{ + /* Return the value of ETH_DMACH0CARXD */ + return (READ_REG(ETHx->DMACH0CARXD)); +} + +/** +*\*\name ETH_GetCurrentTxBufferAddress. +*\*\fun Gets the address of the current application transmit buffer read +*\*\ by the DMA. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return The value of the current Tx buffer address. +**/ +uint32_t ETH_GetCurrentTxBufferAddress(ETH_Module* ETHx) +{ + /* Return the value of ETH_DMACH0CATXB */ + return (READ_REG(ETHx->DMACH0CATXB)); +} + +/** +*\*\name ETH_GetCurrentRxBufferAddress. +*\*\fun Gets the address of the current application receive buffer read +*\*\ by the DMA. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return The value of the current Rx buffer address. +**/ +uint32_t ETH_GetCurrentRxBufferAddress(ETH_Module* ETHx) +{ + /* Return the value of ETH_DMACH0CARXB */ + return (READ_REG(ETHx->DMACH0CARXB)); +} + +/** +*\*\name ETH_GetTxDMAErrorType. +*\*\fun Get the type of TX DMA error that caused the fatal bus error. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return TX DMA Error Bits[2:0] Value: +*\*\ - bit[0]: +*\*\ - 1: Error during read transfer +*\*\ - 0: Error during write transfer +*\*\ - bit[1]: +*\*\ - 1: Error during descriptor access +*\*\ - 0: Error during data buffer access +*\*\ - bit[2]: +*\*\ - 1: Error during data transfer by Tx DMA +*\*\ - 0: No Error during data transfer by Tx DMA +*\*\ Invalid value: +*\*\ - 0xFF +*\*\note This function returns a valid value only if a fatal bus error occurs +*\*\ (FBE set to 1). And these error types do not generate interrupts. +**/ +uint8_t ETH_GetTxDMAErrorType(ETH_Module* ETHx) +{ + uint8_t ReturnValue; + + /* Check if a fatal bus error has occurred */ + if (READ_BIT(ETHx->DMACH0STS, ETH_DMACH0STS_FBE) != (uint32_t)RESET) + { + /* Return the value of the TX DMA error bits */ + ReturnValue = (uint8_t)(READ_BIT(ETHx->DMACH0STS, ETH_DMACH0STS_TEB) >> 16); + } + else + { + /* Return invalid value 0xFF */ + ReturnValue = (uint8_t)(0xFFU); + } + + return ReturnValue; +} + +/** +*\*\name ETH_GetRxDMAErrorType. +*\*\fun Get the type of RX DMA error that caused the fatal bus error. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return RX DMA Error Bits[2:0] Value: +*\*\ - bit[0]: +*\*\ - 1: Error during read transfer +*\*\ - 0: Error during write transfer +*\*\ - bit[1]: +*\*\ - 1: Error during descriptor access +*\*\ - 0: Error during data buffer access +*\*\ - bit[2]: +*\*\ - 1: Error during data transfer by Rx DMA +*\*\ - 0: No Error during data transfer by Rx DMA +*\*\ Invalid value: +*\*\ - 0xFF +*\*\note This function returns a valid value only if a fatal bus error occurs +*\*\ (FBE set to 1). And these error types do not generate interrupts. +**/ +uint8_t ETH_GetRxDMAErrorType(ETH_Module* ETHx) +{ + uint8_t ReturnValue; + + /* Check if a fatal bus error has occurred */ + if (READ_BIT(ETHx->DMACH0STS, ETH_DMACH0STS_FBE) != (uint32_t)RESET) + { + /* Return the value of the RX DMA error bits */ + ReturnValue = (uint8_t)(READ_BIT(ETHx->DMACH0STS, ETH_DMACH0STS_REB) >> 19); + } + else + { + /* Return invalid value 0xFF */ + ReturnValue = (uint8_t)(0xFFU); + } + + return ReturnValue; +} + +/** +*\*\name ETH_GetDMACh0DroppedPacketCounter. +*\*\fun Get the number of packet counters dropped by the DMA due to bus errors +*\*\ or programming the RPF field in the DMA Channel 0 Rx Control Register. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return Counter value: 0~0x7FF. +**/ +uint16_t ETH_GetDMACh0DroppedPacketCounter(ETH_Module* ETHx) +{ + /* Return the value of the Dropped Packet Counter */ + return ((uint16_t)READ_BIT(ETHx->DMACH0DPCNT, ETH_DMACH0DPCNT_DPC)); +} + +/** +*\*\name ETH_GetDMACh0ERICounter. +*\*\fun Get the number of counts for the number of times an ERI (Early Receive +*\*\ Interrupt) is valid. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return Counter value: 0~0xFFF. +**/ +uint16_t ETH_GetDMACh0ERICounter(ETH_Module* ETHx) +{ + /* Return the value of the ERI Counter */ + return ((uint16_t)READ_BIT(ETHx->DMACH0RXERICNT, ETH_DMACH0RXERICNT_ECNT)); +} + + + +/** +*\*\name ETH_RxDescAssignMemory. +*\*\fun Assign memory buffers to a DMA Rx descriptor. +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\param Index : +*\*\ - Index of the DMA Rx descriptor. +*\*\param pBuffer1 : +*\*\ - Points to Buffer1 address. +*\*\param pBuffer2 : +*\*\ - Points to Buffer2 address, if available. +*\*\return One of EthFuncStatusType. +**/ +EthFuncStatusType ETH_RxDescAssignMemory(ETH_InfoType* pInfo, uint32_t Index, uint8_t* pBuffer1, uint8_t* pBuffer2) +{ + ETH_DMADescType* pRxDescriptor = NULL; + /* Get the descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pInfo->RxDescList.RxDesc[Index]; + + /* Check the parameter */ + if ((pBuffer1 == NULL) || (Index >= ETH_RX_DESC_NUMBER)) + { + /* Return ERROR */ + return ETH_ERROR_PARAM; + } + + /* Write buffer1 address to RDES0 */ + pRxDescriptor->DESC0 = (uint32_t)pBuffer1; + /* Backup buffer1 address */ + pRxDescriptor->Buf1Addr = (uint32_t)pBuffer1; + /* Set buffer1 address valid bit to RDES3 */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_BUF1V); + + if (pBuffer2 != NULL) + { + /* Write buffer2 address to RDES2 */ + pRxDescriptor->DESC2 = (uint32_t)pBuffer2; + /* Backup buffer2 address */ + pRxDescriptor->Buf2Addr = (uint32_t)pBuffer2; + /* Set buffer2 address valid bit to RDES3 */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_BUF2V); + } + + /* Set OWN bit to RDES3 */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_OWN); + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** +*\*\name ETH_BuildRxDescriptors. +*\*\fun This function gives back Rx Desc of the last received Packet to the DMA, +*\*\ so ETH DMA will be able to use these descriptors to receive next Packets. +*\*\ It should be called after processing the received Packet. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\return One of EthFuncStatusType. +**/ +EthFuncStatusType ETH_BuildRxDescriptors(ETH_Module* ETHx, ETH_InfoType* pInfo) +{ + uint32_t TempIndex; + uint32_t DescIndex; + uint32_t TotalAppDescNbr; + ETH_DMADescType* pRxDescriptor = NULL; + ETH_RxDescListType* pRxDescList = NULL; + + pRxDescList = &pInfo->RxDescList; + DescIndex = pRxDescList->FirstAppDesc; + TotalAppDescNbr = pRxDescList->AppDescNbr; + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + + if (pRxDescList->AppDescNbr == 0U) + { + /* No Rx descriptors to build */ + return NO_DESC_TO_BUILD; + } + + if (pRxDescList->AppContextDesc != 0U) + { + /* A context descriptor is available */ + TotalAppDescNbr += 1U; + } + + for (TempIndex = 0; TempIndex < TotalAppDescNbr; TempIndex++) + { + /* Set Buffer1 address */ + WRITE_REG(pRxDescriptor->DESC0, pRxDescriptor->Buf1Addr); + /* Set Buffer1 valid bit */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_BUF1V); + + /* Check if Buffer2 is valid */ + if (pRxDescriptor->Buf2Addr != 0U) + { + /* Set Buffer2 address */ + WRITE_REG(pRxDescriptor->DESC2, pRxDescriptor->Buf2Addr); + /* Set Buffer2 valid bit */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_BUF2V); + } + + /* Set OWN bit */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_OWN); + + /* Check if interrupt mode */ + if (pRxDescList->ItMode != 0U) + { + /* Set IOC bit */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_IOC); + } + + if (TempIndex < (pRxDescList->AppDescNbr - 1U)) + { + /* Increment current rx descriptor index */ + __ETH_RXDESC_INDEX_INCR(DescIndex, 1U); + /* Get current descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + } + } + + /* Set the Tail pointer address to the last rx descriptor hold by the app */ + WRITE_REG(ETHx->DMACH0RXDTP, (uint32_t)pRxDescriptor); + + /* Reset the Application desc number */ + pRxDescList->AppDescNbr = 0U; + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** +*\*\name ETH_PrepareTxDescriptors. +*\*\fun Prepare Tx DMA descriptor before transmission. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\param pTxPacket : +*\*\ - Points to the TX packet, containing some configuration information +*\*\param ItMode : +*\*\ - Mode Selection: 1 indicates to interrupt mode, 0 indicates to polling mode. +*\*\return One of EthFuncStatusType. +**/ +EthFuncStatusType ETH_PrepareTxDescriptors(ETH_Module* ETHx, ETH_InfoType* pInfo, ETH_TxPacketType* pTxPacket, uint32_t ItMode) +{ + uint32_t TempIndex; + uint32_t DescIndex; + uint32_t DescCnt = 0; + uint32_t FirstDescIndex; + ETH_BufferType* pTxBuf = NULL; + ETH_DMADescType* pTxDescriptor = NULL; + ETH_TxDescListType* pTxDescList = NULL; + + pTxDescList = &pInfo->TxDescList; + pTxBuf = pTxPacket->pTxBuffer; + DescIndex = pTxDescList->CurTxDesc; + FirstDescIndex = pTxDescList->CurTxDesc; + pTxDescriptor = (ETH_DMADescType*)(pTxDescList->TxDesc[DescIndex]); + + /* Check if the current TX descriptor is owned by the application */ + if ((pTxDescriptor->DESC3 & ETH_DMATXND3RF_OWN) == ETH_DMATXND3RF_OWN) + { + /* Returns directly when the current TX descriptor is owned by the DMA */ + return DESC_OWNED_BY_DMA; + } + + /* Starting to configure TX context descriptors */ + /* If VLAN tag is enabled for this packet */ + if ((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET) + { + // N32H487 does not support VLAN insertion or replacemen + + /* If inner VLAN is enabled for this packet */ + if ((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_INNERVLANTAG) != (uint32_t)RESET) + { + // N32H487 does not support double VLAN processing + } + } + + /* If tcp segementation is enabled for this packet */ + if ((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET) + { + // N32H487 does not support TCP segementation + } + + /* If One-Step Timestamp Correction is enabled for this packet */ + if ((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_OSTC) != (uint32_t)RESET) + { + /* Set One-Step Timestamp Correction Enable bit */ + SET_BIT(pTxDescriptor->DESC3, ETH_DMATXCD3_OSTC); + /* Set One-Step Timestamp Correction Input Valid bit */ + SET_BIT(pTxDescriptor->DESC3, ETH_DMATXCD3_TCMSSV); + } + + if(((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET) + || ((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET) + || ((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_OSTC) != (uint32_t)RESET)) + { + /* Set as context descriptor */ + SET_BIT(pTxDescriptor->DESC3, ETH_DMATXCD3_CTXT); + /* Set own bit */ + SET_BIT(pTxDescriptor->DESC3, ETH_DMATXCD3_OWN); + /* Increment current tx descriptor index */ + __ETH_TXDESC_INDEX_INCR(DescIndex, 1U); + /* Get current descriptor address */ + pTxDescriptor = (ETH_DMADescType*)(pTxDescList->TxDesc[DescIndex]); + + /* Incremental Descriptor Count */ + DescCnt += 1U; + + /* Check if the current TX descriptor is owned by the application */ + if ((pTxDescriptor->DESC3 & ETH_DMATXCD3_OWN) == ETH_DMATXCD3_OWN) + { + /* Get the first TX descriptor address */ + pTxDescriptor = (ETH_DMADescType*)(pTxDescList->TxDesc[FirstDescIndex]); + /* Clear the OWN bit of first Descriptor */ + CLEAR_BIT(pTxDescriptor->DESC3, ETH_DMATXCD3_OWN); + /* Returns directly when the current TX descriptor is owned by the DMA */ + return DESC_OWNED_BY_DMA; + } + } + + /* Starting to configure TX Normal descriptor */ + /* Set header or buffer 1 address */ + WRITE_REG(pTxDescriptor->DESC0, (uint32_t)pTxBuf->pBuf); + /* Set header or buffer 1 Length */ + MODIFY_REG(pTxDescriptor->DESC2, ETH_DMATXND2RF_B1L, pTxBuf->Len); + + /* If the next buffer exists */ + if (pTxBuf->pNext != NULL) + { + /* Get buffer address */ + pTxBuf = pTxBuf->pNext; + /* Set buffer 2 address */ + WRITE_REG(pTxDescriptor->DESC1, (uint32_t)pTxBuf->pBuf); + /* Set buffer 2 Length */ + MODIFY_REG(pTxDescriptor->DESC2, ETH_DMATXND2RF_B2L, (pTxBuf->Len << 16)); + } + else + { + /* Set buffer 2 address field to 0 */ + WRITE_REG(pTxDescriptor->DESC1, 0x0U); + /* Set buffer 2 Length field to 0 */ + MODIFY_REG(pTxDescriptor->DESC2, ETH_DMATXND2RF_B2L, 0); + } + + /* If tcp segementation is enabled for this packet */ + if ((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET) + { + // N32H487 does not support TCP segementation + } + else + { + /* Set Frame Length */ + MODIFY_REG(pTxDescriptor->DESC3, ETH_DMATXND3RF_FL, pTxPacket->Length); + + /* If Checksum is enabled for this packet */ + if ((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_CSUM) != (uint32_t)RESET) + { + /* Set Checksum Insertion Control bits */ + MODIFY_REG(pTxDescriptor->DESC3, ETH_DMATXND3RF_CIC, pTxPacket->ChecksumCtrl); + } + } + + /* If CRC Pad Control is enabled for this packet */ + if ((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_CRCPAD) != (uint32_t)RESET) + { + /* Set CRC Pad Control bits */ + MODIFY_REG(pTxDescriptor->DESC3, ETH_DMATXND3RF_CPC, pTxPacket->CRCPadCtrl); + } + + /* If VLAN Tag Control is enabled for this packet */ + if ((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET) + { + // N32H487 does not support SA and VLAN Insertion on Tx option + } + + /* If Source Address Control is enabled for this packet */ + if ((pTxPacket->Attributes & ETH_TX_PACKETS_FEATURES_SAIC) != (uint32_t)RESET) + { + // N32H487 does not support SA and VLAN Insertion on Tx option + } + + /* Set as First Descriptor */ + SET_BIT(pTxDescriptor->DESC3, ETH_DMATXND3RF_FD); + /* Set as NORMAL descriptor */ + CLEAR_BIT(pTxDescriptor->DESC3, ETH_DMATXND3RF_CTXT); + /* Set own bit of First descriptor */ + SET_BIT(pTxDescriptor->DESC3, ETH_DMATXND3RF_OWN); + + /* Only if the packet is splitted into more than one descriptors > 1 */ + while (pTxBuf->pNext != NULL) + { + /* Clear the LD bit of previous descriptor */ + CLEAR_BIT(pTxDescriptor->DESC3, ETH_DMATXND3RF_LD); + + /* Increment current tx descriptor index */ + __ETH_TXDESC_INDEX_INCR(DescIndex, 1); + /* Get current descriptor address */ + pTxDescriptor = (ETH_DMADescType*)(pTxDescList->TxDesc[DescIndex]); + + /* Incremental Descriptor Count */ + DescCnt += 1U; + + /* Clear the FD bit of new Descriptor */ + CLEAR_BIT(pTxDescriptor->DESC3, ETH_DMATXND3RF_FD); + + /* Check if the current TX descriptor is owned by the application */ + if ((pTxDescriptor->DESC3 & ETH_DMATXND3RF_OWN) == ETH_DMATXND3RF_OWN) + { + DescIndex = FirstDescIndex; + /* Get the first TX descriptor address */ + pTxDescriptor = (ETH_DMADescType*)(pTxDescList->TxDesc[DescIndex]); + + /* Clear the OWN bit of all previous descriptors */ + for (TempIndex = 0; TempIndex < DescCnt; TempIndex++) + { + /* Clear the OWN bit of new Descriptor */ + CLEAR_BIT(pTxDescriptor->DESC3, ETH_DMATXND3RF_OWN); + /* Increment current tx descriptor index */ + __ETH_TXDESC_INDEX_INCR(DescIndex, 1); + /* Get current descriptor address */ + pTxDescriptor = (ETH_DMADescType*)(pTxDescList->TxDesc[DescIndex]); + } + + /* Returns directly when the current TX descriptor is owned by the DMA */ + return DESC_OWNED_BY_DMA; + } + + /* Get the next Tx buffer in the list */ + pTxBuf = pTxBuf->pNext; + + /* Set header or buffer 1 address */ + WRITE_REG(pTxDescriptor->DESC0, (uint32_t)pTxBuf->pBuf); + /* Set header or buffer 1 Length */ + MODIFY_REG(pTxDescriptor->DESC2, ETH_DMATXND2RF_B1L, pTxBuf->Len); + + /* If the next buffer exists */ + if (pTxBuf->pNext != NULL) + { + /* Get buffer address */ + pTxBuf = pTxBuf->pNext; + /* Set buffer 2 address */ + WRITE_REG(pTxDescriptor->DESC1, (uint32_t)pTxBuf->pBuf); + /* Set buffer 2 Length */ + MODIFY_REG(pTxDescriptor->DESC2, ETH_DMATXND2RF_B2L, (pTxBuf->Len << 16)); + } + else + { + /* Set buffer 2 address field to 0 */ + WRITE_REG(pTxDescriptor->DESC1, 0x0U); + /* Set buffer 2 Length field to 0 */ + MODIFY_REG(pTxDescriptor->DESC2, ETH_DMATXND2RF_B2L, 0); + } + + /* Set Frame Length */ + MODIFY_REG(pTxDescriptor->DESC3, ETH_DMATXND3RF_FL, pTxPacket->Length); + + /* Set as NORMAL descriptor */ + CLEAR_BIT(pTxDescriptor->DESC3, ETH_DMATXND3RF_CTXT); + /* Set own bit of this descriptor */ + SET_BIT(pTxDescriptor->DESC3, ETH_DMATXND3RF_OWN); + } + + /* + Note: + The LD bit is 0 and the Early Transmit Interrupt (ETIC) is turned on, + which controls the ETI; the LD bit is 1, which controls the Transmit + Interrupt (TI). + The ETI is generated after completing a data transfer from the buffer + of the descriptor for which the IOC is set, and the TI is generated + only after a complete packet is transferred to the TxFIFO. + */ + if (ItMode) + { + /* Set Interrupt on Completion bit */ + SET_BIT(pTxDescriptor->DESC2, ETH_DMATXND2RF_IOC); + } + else + { + /* Clear Interrupt on Completion bit */ + CLEAR_BIT(pTxDescriptor->DESC2, ETH_DMATXND2RF_IOC); + } + + /* Set as Last Descriptor */ + SET_BIT(pTxDescriptor->DESC3, ETH_DMATXND3RF_LD); + + /* Update current Tx descriptor index */ + pTxDescList->CurTxDesc = DescIndex; + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** +*\*\name ETH_Transmit. +*\*\fun Send packets via polling mode. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\param pTxPacket : +*\*\ - Points to the TX packet, containing some configuration information +*\*\param Timeout : +*\*\ - timeout value +*\*\return One of EthFuncStatusType. +**/ +EthFuncStatusType ETH_Transmit(ETH_Module* ETHx, ETH_InfoType* pInfo, ETH_TxPacketType* pTxPacket, uint32_t Timeout) +{ + uint32_t TickStart; + EthFuncStatusType TempStatus; + const ETH_DMADescType* pTxDescriptor; + + /* Check the pTxPacket parameter */ + if (pTxPacket == NULL) + { + /* Return ERROR */ + return ETH_ERROR_PARAM; + } + + /* Config DMA Tx descriptor by Tx Packet info */ + TempStatus = ETH_PrepareTxDescriptors(ETHx, pInfo, pTxPacket, 0); + + /* Check if it has been successfully configured */ + if (TempStatus != ETH_SUCCESS) + { + /* Return ERROR */ + return TempStatus; + } + + /* Get the descriptor address */ + pTxDescriptor = (ETH_DMADescType*)(&pInfo->TxDescList)->TxDesc[pInfo->TxDescList.CurTxDesc]; + /* Increment current tx descriptor index */ + __ETH_TXDESC_INDEX_INCR(pInfo->TxDescList.CurTxDesc, 1U); + /* Send a polling command to the TX DMA by writing the address of the next idle + descriptor to the ETH_DMACH0TXDTP register, and then start the transfer */ + WRITE_REG(ETHx->DMACH0TXDTP, (uint32_t)pInfo->TxDescList.TxDesc[pInfo->TxDescList.CurTxDesc]); + + /* Check that DWT is enabled or not */ + if ((DEM_CR & DEM_CR_TRCENA) == (uint32_t)RESET) + { + /* Enable and initialize DWT */ + __ETH_TICK_START(); + } + + /* Get tick */ + TickStart = __ETH_GET_TICK; + + /* Wait for data to be transmitted or timeout occured */ + while ((pTxDescriptor->DESC3 & ETH_DMATXND3WBF_OWN) != (uint32_t)RESET) + { + /* Check for fatal bus error */ + if ((ETHx->DMACH0STS & ETH_DMACH0STS_FBE) != (uint32_t)RESET) + { + /* Return ERROR */ + return FATAL_BUS_ERROR; + } + + /* Check for the Timeout */ + if (((__ETH_GET_TICK - TickStart) > Timeout) || (Timeout == 0U)) + { + /* Disable tick */ + __ETH_TICK_STOP(); + + /* Return timeout */ + return ETH_ERROR_TIMEOUT; + } + } + + /* Disable tick */ + __ETH_TICK_STOP(); + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** +*\*\name ETH_TransmitIT. +*\*\fun Send packets via interrupt mode. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\param pTxPacket : +*\*\ - Points to the TX packet, containing some configuration information +*\*\return One of EthFuncStatusType. +**/ +EthFuncStatusType ETH_TransmitIT(ETH_Module* ETHx, ETH_InfoType* pInfo, ETH_TxPacketType* pTxPacket) +{ + EthFuncStatusType TempStatus; + + /* Check the pTxPacket parameter */ + if (pTxPacket == NULL) + { + /* Return ERROR */ + return ETH_ERROR_PARAM; + } + + /* Config DMA Tx descriptor by Tx Packet info */ + TempStatus = ETH_PrepareTxDescriptors(ETHx, pInfo, pTxPacket, 1); + + /* Check if it has been successfully configured */ + if (TempStatus != ETH_SUCCESS) + { + /* Return ERROR */ + return TempStatus; + } + + /* Increment current tx descriptor index */ + __ETH_TXDESC_INDEX_INCR(pInfo->TxDescList.CurTxDesc, 1U); + /* Send a polling command to the TX DMA by writing the address of the next idle + descriptor to the ETH_DMACH0TXDTP register, and then start the transfer */ + WRITE_REG(ETHx->DMACH0TXDTP, (uint32_t)pInfo->TxDescList.TxDesc[pInfo->TxDescList.CurTxDesc]); + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** +*\*\name ETH_IsRxDataAvailable. +*\*\fun Checks the data of received packets. +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\return 1 or 0. +**/ +uint8_t ETH_IsRxDataAvailable(ETH_InfoType* pInfo) +{ + uint32_t DescIndex; + uint32_t DescCnt = 0; + uint32_t AppDescCnt = 0; + uint32_t AppFirstDescIndex = 0; + ETH_DMADescType* pRxDescriptor = NULL; + ETH_RxDescListType* pRxDescList = NULL; + + pRxDescList = &pInfo->RxDescList; + DescIndex = pRxDescList->CurRxDesc; + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + + /* Check the number of descriptors */ + if (pRxDescList->AppDescNbr != 0) + { + /* Data already received by not yet processed */ + return 0; + } + + /* Check if descriptor is not owned by DMA */ + while (((pRxDescriptor->DESC3 & ETH_DMARXND3WBF_OWN) == (uint32_t)RESET) && (DescCnt < ETH_RX_DESC_NUMBER)) + { + /* Incremental Descriptor Count */ + DescCnt += 1U; + + /* Check if last descriptor */ + if ((pRxDescriptor->DESC3 & ETH_DMARXND3WBF_LD) != (uint32_t)RESET) + { + /* Increment the number of descriptors to be passed to the application */ + AppDescCnt += 1U; + + /* If the first descriptor */ + if (AppDescCnt == 1U) + { + /* Record the index corresponding to the first descriptor */ + AppFirstDescIndex = DescIndex; + } + + /* Increment current rx descriptor index */ + __ETH_RXDESC_INDEX_INCR(DescIndex, 1U); + /* Get current descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + + /* Check if descriptor is not owned by DMA */ + if ((pRxDescriptor->DESC3 & ETH_DMARXND3WBF_OWN) == (uint32_t)RESET) + { + /* Check for Context descriptor */ + if ((pRxDescriptor->DESC3 & ETH_DMARXND3WBF_CTXT) != (uint32_t)RESET) + { + /* Indicated as a context descriptor */ + pRxDescList->AppContextDesc = 1; + /* Increment current rx descriptor index */ + __ETH_RXDESC_INDEX_INCR(DescIndex, 1U); + } + } + /* Saves the current descriptor index */ + pRxDescList->CurRxDesc = DescIndex; + /* Saves the first descriptor subscript */ + pRxDescList->FirstAppDesc = AppFirstDescIndex; + /* Saves the number of descriptors */ + pRxDescList->AppDescNbr = AppDescCnt; + + /* Packets received, return 1 */ + return 1; + } + /* Check if first descriptor */ + else if ((pRxDescriptor->DESC3 & ETH_DMARXND3WBF_FD) != (uint32_t)RESET) + { + /* Record the index corresponding to the first descriptor */ + AppFirstDescIndex = DescIndex; + /* Increment the number of descriptors to be passed to the application */ + AppDescCnt = 1U; + + /* Increment current rx descriptor index */ + __ETH_RXDESC_INDEX_INCR(DescIndex, 1U); + /* Get current descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + } + /* It should be an intermediate descriptor */ + else + { + /* Increment the number of descriptors to be passed to the application */ + AppDescCnt += 1U; + + /* Increment current rx descriptor index */ + __ETH_RXDESC_INDEX_INCR(DescIndex, 1U); + /* Get current descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + } + } + + /* Build Descriptors if an incomplete Packet is received */ + if (AppDescCnt > 0U) + { + /* Get the first descriptor */ + DescIndex = AppFirstDescIndex; + /* Get current descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + + for (DescCnt = 0; DescCnt < AppDescCnt; DescCnt++) + { + /* Write buffer1 address to RDES0 */ + pRxDescriptor->DESC0 = pRxDescriptor->Buf1Addr; + /* Set buffer1 address valid bit to RDES3 */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_BUF1V); + + if (pRxDescriptor->Buf2Addr != (uint32_t)RESET) + { + /* Write buffer2 address to RDES2 */ + pRxDescriptor->DESC2 = pRxDescriptor->Buf2Addr; + /* Set buffer2 address valid bit to RDES3 */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_BUF2V); + } + + /* Set OWN bit */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_OWN); + + if (pRxDescList->ItMode != (uint32_t)RESET) + { + /* Set IOC bit */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_IOC); + } + + /* Increment current rx descriptor index */ + __ETH_RXDESC_INDEX_INCR(DescIndex, 1U); + /* Get current descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + } + } + + /* No received Packet */ + pRxDescList->AppDescNbr = 0U; + + /* No received Packet, return 0 */ + return 0; +} + +/** +*\*\name ETH_GetRxDataBuffer. +*\*\fun Used to fetch the data buffer when processing the received Packet. +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\param pRxBuffer : +*\*\ - Points to the RX buffer, ETH_BufferType structure. +*\*\return One of EthFuncStatusType. +**/ +EthFuncStatusType ETH_GetRxDataBuffer(ETH_InfoType* pInfo, ETH_BufferType* pRxBuffer) +{ + uint32_t TempIndex; + uint32_t DescIndex; + uint32_t LastDescLen; + uint32_t AccumulatedLen = 0; + + ETH_BufferType* pRxBuf = NULL; + ETH_DMADescType* pRxDescriptor = NULL; + ETH_RxDescListType* pRxDescList = NULL; + + pRxBuf = pRxBuffer; + pRxDescList = &pInfo->RxDescList; + DescIndex = pRxDescList->FirstAppDesc; + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + + /* Check the pRxBuffer parameter */ + if (pRxBuf == NULL) + { + /* Return ERROR */ + return ETH_ERROR_PARAM; + } + + if (pRxDescList->AppDescNbr == 0U) + { + /* Check for data received */ + if (ETH_IsRxDataAvailable(pInfo) == 0U) + { + /* No data to be transferred to the application */ + return NO_DATA_TRANSFER; + } + else + { + /* Update the current descriptor index */ + DescIndex = pRxDescList->FirstAppDesc; + /* Get current descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + } + } + + /* Get intermediate descriptors buffers: in case of the Packet is splitted into multi descriptors */ + for (TempIndex = 0; TempIndex < (pRxDescList->AppDescNbr - 1); TempIndex++) + { + /* Get Address of the first buffer address */ + pRxBuf->pBuf = (uint8_t*)pRxDescriptor->Buf1Addr; + /* Get length of the first buffer address */ + pRxBuf->Len = pInfo->RxBuffLen; + + /* Check if the second buffer address of this descriptor is valid */ + if (pRxDescriptor->Buf2Addr != 0U) + { + /* Point to next buffer */ + pRxBuf = pRxBuf->pNext; + /* Get Address of the second buffer address */ + pRxBuf->pBuf = (uint8_t*)pRxDescriptor->Buf2Addr; + /* Get length of the second buffer address */ + pRxBuf->Len = pInfo->RxBuffLen; + } + + /* Get accumulated length until this descriptor */ + AccumulatedLen = READ_BIT(pRxDescriptor->DESC3, ETH_DMARXND3WBF_PL); + + /* Increment current rx descriptor index */ + __ETH_RXDESC_INDEX_INCR(DescIndex, 1U); + /* Get current descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + + /* Point to next buffer */ + pRxBuf = pRxBuf->pNext; + } + + /* Get last descriptor data length */ + LastDescLen = READ_BIT(pRxDescriptor->DESC3, ETH_DMARXND3WBF_PL) - AccumulatedLen; + + /* Get Address of the first buffer address */ + pRxBuf->pBuf = (uint8_t*)pRxDescriptor->Buf1Addr; + + /* Data is in only one buffer */ + if (LastDescLen <= pInfo->RxBuffLen) + { + /* Record buffer length */ + pRxBuf->Len = LastDescLen; + } + /* Data is in two buffers */ + else if (pRxDescriptor->Buf2Addr != 0U) + { + /* Get the Length of the first buffer address */ + pRxBuf->Len = pInfo->RxBuffLen; + /* Point to next buffer */ + pRxBuf = pRxBuf->pNext; + /* Get the Address of the second buffer address */ + pRxBuf->pBuf = (uint8_t*)pRxDescriptor->Buf2Addr; + /* Get the Length of the second buffer address */ + pRxBuf->Len = LastDescLen - (pInfo->RxBuffLen); + } + else + { + /* Return ERROR */ + return ETH_ERROR_PARAM; + } + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** +*\*\name ETH_GetRxDataLength. +*\*\fun Used to fetch the data length of last received Packet when processing the +*\*\ received Packet. +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\return NO_DATA_TRANSFER or length of last received Packet. +**/ +uint32_t ETH_GetRxDataLength(ETH_InfoType* pInfo) +{ + uint32_t DescIndex; + ETH_DMADescType* pRxDescriptor = NULL; + ETH_RxDescListType* pRxDescList = NULL; + + pRxDescList = &pInfo->RxDescList; + DescIndex = pRxDescList->FirstAppDesc; + + if (pRxDescList->AppDescNbr == 0U) + { + /* Check for data received */ + if (ETH_IsRxDataAvailable(pInfo) == 0U) + { + /* No data to be transferred to the application */ + return (uint32_t)NO_DATA_TRANSFER; + } + } + + /* Get index of last descriptor */ + __ETH_RXDESC_INDEX_INCR(DescIndex, (pRxDescList->AppDescNbr - 1U)); + /* Point to last descriptor */ + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + + /* Return the length of last received Packet */ + return READ_BIT(pRxDescriptor->DESC3, ETH_DMARXND3WBF_PL); +} + +/** +*\*\name ETH_GetRxPacketInfo. +*\*\fun Get the Rx Packet info (Packet type, VLAN tag, Filters status, ...). +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\param pRxPacket : +*\*\ - Points to the RX packet, containing some packet information. +*\*\return One of EthFuncStatusType. +**/ +EthFuncStatusType ETH_GetRxPacketInfo(ETH_InfoType* pInfo, ETH_RxPacketType* pRxPacket) +{ + uint32_t DescIndex; + ETH_DMADescType* pRxDescriptor = NULL; + ETH_RxDescListType* pRxDescList = NULL; + + pRxDescList = &pInfo->RxDescList; + DescIndex = pRxDescList->FirstAppDesc; + + if (pRxDescList->AppDescNbr == 0U) + { + /* Check for data received */ + if (ETH_IsRxDataAvailable(pInfo) == 0U) + { + /* No data to be transferred to the application */ + return NO_DATA_TRANSFER; + } + } + + /* Get index of last descriptor */ + __ETH_RXDESC_INDEX_INCR(DescIndex, (pRxDescList->AppDescNbr - 1U)); + /* Point to last descriptor */ + pRxDescriptor = (ETH_DMADescType*)pRxDescList->RxDesc[DescIndex]; + + if ((pRxDescriptor->DESC3 & ETH_DMARXND3WBF_ES) != (uint32_t)RESET) + { + /* Get packet error status from RDES3 */ + pRxPacket->ErrorCode = READ_BIT(pRxDescriptor->DESC3, (ETH_DMARXND3WBF_DE + | ETH_DMARXND3WBF_RE + | ETH_DMARXND3WBF_OE + | ETH_DMARXND3WBF_RWT + | ETH_DMARXND3WBF_GP + | ETH_DMARXND3WBF_CE)); + } + else + { + if ((pRxDescriptor->DESC3 & ETH_DMARXND3WBF_RS0V) != (uint32_t)RESET) + { + /* Check for Double VLAN packet types */ + if ((pRxDescriptor->DESC3 & ETH_DMARXND3WBF_LT) == ETH_DMARXND3WBF_LT_DVLAN) + { + // N32H487 does not support Double VLAN Tag + } + else + { + /* Get Outer VLAN Tag */ + pRxPacket->VlanTag = READ_BIT(pRxDescriptor->DESC0, ETH_DMARXND0WBF_OVT); + } + } + + if ((pRxDescriptor->DESC3 & ETH_DMARXND3WBF_RS1V) != (uint32_t)RESET) + { + /* Get Payload type */ + pRxPacket->PayloadType = READ_BIT(pRxDescriptor->DESC1, ETH_DMARXND1WBF_PT); + /* Get Header type */ + pRxPacket->PayloadType = READ_BIT(pRxDescriptor->DESC1, (ETH_DMARXND1WBF_IPV4 + | ETH_DMARXND1WBF_IPV6)); + /* Get Checksum status */ + pRxPacket->PayloadType = READ_BIT(pRxDescriptor->DESC1, (ETH_DMARXND1WBF_IPHE + | ETH_DMARXND1WBF_IPCB + | ETH_DMARXND1WBF_IPCE)); + } + + if ((pRxDescriptor->DESC3 & ETH_DMARXND3WBF_RS2V) != (uint32_t)RESET) + { + /* Get MAC Filtering Status */ + pRxPacket->MACFilterStatus = READ_BIT(pRxDescriptor->DESC2, (ETH_DMARXND2WBF_VFS + | ETH_DMARXND2WBF_SAF + | ETH_DMARXND2WBF_DAF + | ETH_DMARXND2WBF_HF)); + } + } + + /* Get the Rx Descriptors count */ + pRxPacket->DescriptorCnt = pRxDescList->AppDescNbr; + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** +*\*\name ETH_Start. +*\*\fun Turn on ETH via polling mode, including turning on TX and RX DMA engines, +*\*\ turning on TX and RX MAC controllers, etc. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none. +**/ +void ETH_Start(ETH_Module* ETHx) +{ + /* Start the MAC Transmitter */ + SET_BIT(ETHx->MACCFG, ETH_MACCFG_TE); + + /* Start the MAC Receiver */ + SET_BIT(ETHx->MACCFG, ETH_MACCFG_RE); + + /* Set the Flush Transmit Queue bit */ + SET_BIT(ETHx->MTLTXQOPMOD, ETH_MTLTXQOPMOD_FTQ); + + /* Start the DMA Transmitter */ + SET_BIT(ETHx->DMACH0TXCTRL, ETH_DMACH0TXCTRL_ST); + + /* Start the DMA Receiver */ + SET_BIT(ETHx->DMACH0RXCTRL, ETH_DMACH0RXCTRL_SR); + + /* Clear Tx and Rx process stopped flags */ + SET_BIT(ETHx->DMACH0STS, (ETH_DMACH0STS_TPS | ETH_DMACH0STS_RPS)); +} + +/** +*\*\name ETH_StartIT. +*\*\fun Turn on ETH via interrupt mode, including turning on TX and RX DMA engines, +*\*\ turning on TX and RX MAC controllers, etc. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\return none. +**/ +void ETH_StartIT(ETH_Module* ETHx, ETH_InfoType* pInfo) +{ + uint32_t TempIndex, DescIndex = 0; + ETH_DMADescType* pRxDescriptor = NULL; + + /* Get the descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pInfo->RxDescList.RxDesc[DescIndex]; + + /* Set IOC bit to all Rx descriptors */ + for (TempIndex = 0; TempIndex < ETH_RX_DESC_NUMBER; TempIndex++) + { + /* Set Interrupt on Completion bit */ + SET_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_IOC); + /* Increment rx descriptor index */ + __ETH_RXDESC_INDEX_INCR(DescIndex, 1U); + /* Get the descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pInfo->RxDescList.RxDesc[DescIndex]; + } + + /* Enable ETH DMA Transmit Interrupt, Receive Interrupt, Fatal Bus Error Interrupt, + Abnormal Interrupt Summary, Normal Interrupt Summary*/ + SET_BIT(ETHx->DMACH0INTEN, (ETH_DMACH0INTEN_TIE | ETH_DMACH0INTEN_RIE + | ETH_DMACH0INTEN_NIE | ETH_DMACH0INTEN_AIE + | ETH_DMACH0INTEN_FBEE)); + + /* Start the MAC Transmitter */ + SET_BIT(ETHx->MACCFG, ETH_MACCFG_TE); + + /* Start the MAC Receiver */ + SET_BIT(ETHx->MACCFG, ETH_MACCFG_RE); + + /* Set the Flush Transmit Queue bit */ + SET_BIT(ETHx->MTLTXQOPMOD, ETH_MTLTXQOPMOD_FTQ); + + /* Start the DMA Transmitter */ + SET_BIT(ETHx->DMACH0TXCTRL, ETH_DMACH0TXCTRL_ST); + + /* Start the DMA Receiver */ + SET_BIT(ETHx->DMACH0RXCTRL, ETH_DMACH0RXCTRL_SR); + + /* Clear Tx and Rx process stopped flags */ + SET_BIT(ETHx->DMACH0STS, (ETH_DMACH0STS_TPS | ETH_DMACH0STS_RPS)); + + /* Save IT mode */ + pInfo->RxDescList.ItMode = 1U; +} + +/** +*\*\name ETH_Stop. +*\*\fun Turn off ETH in polling mode, including turning off TX and RX DMA engines, +*\*\ turning off TX and RX MAC controllers, etc. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none. +**/ +void ETH_Stop(ETH_Module* ETHx) +{ + /* Stop the DMA Transmitter */ + CLEAR_BIT(ETHx->DMACH0TXCTRL, ETH_DMACH0TXCTRL_ST); + + /* Wait for any previous frame transmissions to complete */ + while (((ETHx->MTLTXQDBG & ETH_TRCSTS_MASK) == ETH_MTLTXQSTS_READ) + && ((ETHx->MTLTXQDBG & ETH_MTLTXQSTS_NOT_EMPTY) == ETH_MTLTXQSTS_NOT_EMPTY)) + { + } + + /* Stop the MAC Transmitter */ + CLEAR_BIT(ETHx->MACCFG, ETH_MACCFG_TE); + + /* Stop the MAC Receiver */ + CLEAR_BIT(ETHx->MACCFG, ETH_MACCFG_RE); + + /* Wait for all data to be transferred to system memory */ + while (((ETHx->MTLRXQDBG & ETH_RXQSTS_MASK) != ETH_MTLRXQSTS_EMPTY) + && ((ETHx->MTLRXQDBG & ETH_MTLRXQSTS_PACK_NBR) != (uint32_t)RESET)) + { + } + + /* Stop the DMA Receiver */ + CLEAR_BIT(ETHx->DMACH0RXCTRL, ETH_DMACH0RXCTRL_SR); + + /* Set the Flush Transmit Queue bit */ + SET_BIT(ETHx->MTLTXQOPMOD, ETH_MTLTXQOPMOD_FTQ); +} + +/** +*\*\name ETH_StopIT. +*\*\fun Turn off ETH in interrupt mode, including turning off TX and RX DMA engines, +*\*\ turning off TX and RX MAC controllers, etc. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param pInfo : +*\*\ - Pointer to an ETH_InfoType structure parameter containing various +*\*\ information about the operation of the ETH module. +*\*\return none. +**/ +void ETH_StopIT(ETH_Module* ETHx, ETH_InfoType* pInfo) +{ + uint32_t TempIndex, DescIndex = 0; + ETH_DMADescType* pRxDescriptor = NULL; + + /* Get the descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pInfo->RxDescList.RxDesc[DescIndex]; + + /* Disable ETH DMA Transmit Interrupt, Receive Interrupt, Fatal Bus Error Interrupt, + Abnormal Interrupt Summary, Normal Interrupt Summary*/ + CLEAR_BIT(ETHx->DMACH0INTEN, (ETH_DMACH0INTEN_TIE | ETH_DMACH0INTEN_RIE + | ETH_DMACH0INTEN_NIE | ETH_DMACH0INTEN_AIE + | ETH_DMACH0INTEN_FBEE)); + + /* Stop the DMA Transmitter */ + CLEAR_BIT(ETHx->DMACH0TXCTRL, ETH_DMACH0TXCTRL_ST); + + /* Wait for any previous frame transmissions to complete */ + while (((ETHx->MTLTXQDBG & ETH_TRCSTS_MASK) == ETH_MTLTXQSTS_READ) + && ((ETHx->MTLTXQDBG & ETH_MTLTXQSTS_NOT_EMPTY) == ETH_MTLTXQSTS_NOT_EMPTY)) + { + } + + /* Stop the MAC Transmitter */ + CLEAR_BIT(ETHx->MACCFG, ETH_MACCFG_TE); + + /* Stop the MAC Receiver */ + CLEAR_BIT(ETHx->MACCFG, ETH_MACCFG_RE); + + /* Wait for all data to be transferred to system memory */ + while (((ETHx->MTLRXQDBG & ETH_RXQSTS_MASK) != ETH_MTLRXQSTS_EMPTY) + && ((ETHx->MTLRXQDBG & ETH_MTLRXQSTS_PACK_NBR) != (uint32_t)RESET)) + { + } + + /* Stop the DMA Receiver */ + CLEAR_BIT(ETHx->DMACH0RXCTRL, ETH_DMACH0RXCTRL_SR); + + /* Set the Flush Transmit Queue bit */ + SET_BIT(ETHx->MTLTXQOPMOD, ETH_MTLTXQOPMOD_FTQ); + + /* Clear IOC bit to all Rx descriptors */ + for (TempIndex = 0; TempIndex < ETH_RX_DESC_NUMBER; TempIndex++) + { + /* Clear Interrupt on Completion bit */ + CLEAR_BIT(pRxDescriptor->DESC3, ETH_DMARXND3RF_IOC); + /* Increment rx descriptor index */ + __ETH_RXDESC_INDEX_INCR(DescIndex, 1U); + /* Get the descriptor address */ + pRxDescriptor = (ETH_DMADescType*)pInfo->RxDescList.RxDesc[DescIndex]; + } + + /* Clear IT mode to */ + pInfo->RxDescList.ItMode = 0U; +} + + + +/** +*\*\name ETH_GetTxDescFlagStatus. +*\*\fun Checks whether the specified ETH DMA Tx Descriptor status flag +*\*\ bits is set or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_DMATXDESC_FLAG_IHE +*\*\ - ETH_DMATXDESC_FLAG_DB +*\*\ - ETH_DMATXDESC_FLAG_UF +*\*\ - ETH_DMATXDESC_FLAG_ED +*\*\ - ETH_DMATXDESC_FLAG_CC +*\*\ - ETH_DMATXDESC_FLAG_EC +*\*\ - ETH_DMATXDESC_FLAG_LC +*\*\ - ETH_DMATXDESC_FLAG_NC +*\*\ - ETH_DMATXDESC_FLAG_LOC +*\*\ - ETH_DMATXDESC_FLAG_PCE +*\*\ - ETH_DMATXDESC_FLAG_PF +*\*\ - ETH_DMATXDESC_FLAG_JT +*\*\ - ETH_DMATXDESC_FLAG_ES +*\*\ - ETH_DMATXDESC_FLAG_TTSS +*\*\ - ETH_DMATXDESC_FLAG_DE +*\*\ - ETH_DMATXDESC_FLAG_LD +*\*\ - ETH_DMATXDESC_FLAG_FD +*\*\return SET or RESET +**/ +FlagStatus ETH_GetTxDescFlagStatus(ETH_DMADescType* pTxDescriptor, uint32_t Flag) +{ + FlagStatus TempStatus; + + /* Read the status of the corresponding flag bits */ + if(READ_BIT(pTxDescriptor->DESC3, Flag) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetRxDescExtendedFlagStatus. +*\*\fun Checks whether the specified ETH DMA Rx Descriptor Extended status +*\*\ flag bits is set or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_DMARXDESC_EXTFLAG_PT_NONE +*\*\ - ETH_DMARXDESC_EXTFLAG_PT_NUDP +*\*\ - ETH_DMARXDESC_EXTFLAG_PT_TCP +*\*\ - ETH_DMARXDESC_EXTFLAG_PT_ICNP +*\*\ - ETH_DMARXDESC_EXTFLAG_IPHE +*\*\ - ETH_DMARXDESC_EXTFLAG_IPV4 +*\*\ - ETH_DMARXDESC_EXTFLAG_IPV6 +*\*\ - ETH_DMARXDESC_EXTFLAG_IPCB +*\*\ - ETH_DMARXDESC_EXTFLAG_IPCE +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_NONE +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_SYNC +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_FU +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_DREQ +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_DRESP +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_PDREQ +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_PDRESP +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_PRFU +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_ANN +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_MAN +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_SIG +*\*\ - ETH_DMARXDESC_EXTFLAG_PMT_PRT +*\*\ - ETH_DMARXDESC_EXTFLAG_PFT +*\*\ - ETH_DMARXDESC_EXTFLAG_PV +*\*\ - ETH_DMARXDESC_EXTFLAG_TSA +*\*\ - ETH_DMARXDESC_EXTFLAG_TD +*\*\return SET or RESET +**/ +FlagStatus ETH_GetRxDescExtendedFlagStatus(ETH_DMADescType* pRxDescriptor, uint32_t Flag) +{ + FlagStatus TempStatus; + + /* Read the status of the corresponding flag bits */ + if(READ_BIT(pRxDescriptor->DESC1, Flag) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetRxDescFilterFlagStatus. +*\*\fun Checks whether the specified ETH DMA Rx Descriptor Filter status flag +*\*\ bits is set or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_DMARXDESC_FLTFLAG_VFS +*\*\ - ETH_DMARXDESC_FLTFLAG_SAF +*\*\ - ETH_DMARXDESC_FLTFLAG_DAF +*\*\ - ETH_DMARXDESC_FLTFLAG_HF +*\*\return SET or RESET +**/ +FlagStatus ETH_GetRxDescFilterFlagStatus(ETH_DMADescType* pRxDescriptor, uint32_t Flag) +{ + FlagStatus TempStatus; + + /* Read the status of the corresponding flag bits */ + if(READ_BIT(pRxDescriptor->DESC2, Flag) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetRxDescFlagStatus. +*\*\fun Checks whether the specified ETH DMA Rx Descriptor status flag bits +*\*\ is set or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_DMARXDESC_FLAG_ES +*\*\ - ETH_DMARXDESC_FLAG_LT_LP +*\*\ - ETH_DMARXDESC_FLAG_LT_TP +*\*\ - ETH_DMARXDESC_FLAG_LT_ARP +*\*\ - ETH_DMARXDESC_FLAG_LT_VLAN +*\*\ - ETH_DMARXDESC_FLAG_LT_DVLAN +*\*\ - ETH_DMARXDESC_FLAG_LT_MAC +*\*\ - ETH_DMARXDESC_FLAG_LT_OAM +*\*\ - ETH_DMARXDESC_FLAG_DE +*\*\ - ETH_DMARXDESC_FLAG_RE +*\*\ - ETH_DMARXDESC_FLAG_OE +*\*\ - ETH_DMARXDESC_FLAG_RWT +*\*\ - ETH_DMARXDESC_FLAG_GP +*\*\ - ETH_DMARXDESC_FLAG_CE +*\*\ - ETH_DMARXDESC_FLAG_RS0V +*\*\ - ETH_DMARXDESC_FLAG_RS1V +*\*\ - ETH_DMARXDESC_FLAG_RS2V +*\*\ - ETH_DMARXDESC_FLAG_LD +*\*\ - ETH_DMARXDESC_FLAG_FD +*\*\return SET or RESET +**/ +FlagStatus ETH_GetRxDescFlagStatus(ETH_DMADescType* pRxDescriptor, uint32_t Flag) +{ + FlagStatus TempStatus; + + /* Read the status of the corresponding flag bits */ + if(READ_BIT(pRxDescriptor->DESC3, Flag) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetFlowControlBusyStatus. +*\*\fun Checks whether the ETH flow control busy bit is set or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return SET or RESET +*\*\note The Flow Control register should not be written to until this bit +*\*\ is cleared. +**/ +FlagStatus ETH_GetFlowControlBusyStatus(ETH_Module* ETHx) +{ + FlagStatus TempStatus; + + /* Read the status of the FCB bit */ + if(READ_BIT(ETHx->MACTXFLWCTRL, ETH_MACTXFLWCTRL_FCB) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetMACInterruptStatus. +*\*\fun Checks whether the specified ETH MAC Interrupt flag is set or +*\*\ not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - ETH_MAC_INT_FLAG_PHY +*\*\ - ETH_MAC_INT_FLAG_PMT +*\*\ - ETH_MAC_INT_FLAG_MMCRX +*\*\ - ETH_MAC_INT_FLAG_MMCTX +*\*\ - ETH_MAC_INT_FLAG_TS +*\*\ - ETH_MAC_INT_FLAG_TX +*\*\ - ETH_MAC_INT_FLAG_RX +*\*\ - ETH_MAC_INT_FLAG_MDIO +*\*\return SET or RESET +**/ +INTStatus ETH_GetMACInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag) +{ + INTStatus TempStatus; + + /* Read the status of the corresponding INT bits */ + if(READ_BIT(ETHx->MACINTSTS, IntFlag) != (uint32_t)RESET) + { + /* This Interrupt is SET */ + TempStatus = SET; + } + else + { + /* This Interrupt is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetMACTxRxFlagStatus. +*\*\fun Checks whether the specified ETH MAC transmit-receive status +*\*\ flag bits is set or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_MACTX_FLAG_TJT +*\*\ - ETH_MACTX_FLAG_NCARR +*\*\ - ETH_MACTX_FLAG_LCARR +*\*\ - ETH_MACTX_FLAG_EXDEF +*\*\ - ETH_MACTX_FLAG_LCOL +*\*\ - ETH_MACTX_FLAG_EXCOL +*\*\ - ETH_MACRX_FLAG_RWT +*\*\return SET or RESET +**/ +FlagStatus ETH_GetMACTxRxFlagStatus(ETH_Module* ETHx, uint32_t Flag) +{ + FlagStatus TempStatus; + + /* Read the status of the corresponding flag bits */ + if(READ_BIT(ETHx->MACRXTXSTS, Flag) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetPMTFlagStatus. +*\*\fun Checks whether the specified ETH PMT status flag bits is set or +*\*\ not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_PMT_FLAG_WUPFRPR +*\*\ - ETH_PMT_FLAG_WUPR +*\*\ - ETH_PMT_FLAG_MPR +*\*\return SET or RESET +**/ +FlagStatus ETH_GetPMTFlagStatus(ETH_Module* ETHx, uint32_t Flag) +{ + FlagStatus TempStatus; + + /* Read the status of the corresponding flag bits */ + if(READ_BIT(ETHx->MACPMTCTRLSTS, Flag) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetMMCRxInterruptStatus. +*\*\fun Checks whether the specified ETH MMC RX Interrupt flag is set or +*\*\ not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - ETH_MMCRX_INT_FLAG_BCGPIS +*\*\ - ETH_MMCRX_INT_FLAG_MCGPIS +*\*\ - ETH_MMCRX_INT_FLAG_CRCERPIS +*\*\ - ETH_MMCRX_INT_FLAG_ALGNERPIS +*\*\ - ETH_MMCRX_INT_FLAG_UCGPIS +*\*\return SET or RESET +**/ +INTStatus ETH_GetMMCRxInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag) +{ + INTStatus TempStatus; + + /* Read the status of the corresponding INT bits */ + if(READ_BIT(ETHx->MMCRXINT, IntFlag) != (uint32_t)RESET) + { + /* This Interrupt is SET */ + TempStatus = SET; + } + else + { + /* This Interrupt is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetMMCTxInterruptStatus. +*\*\fun Checks whether the specified ETH MMC TX Interrupt flag is set or +*\*\ not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - ETH_MMCTX_INT_FLAG_SCOLGPIS +*\*\ - ETH_MMCTX_INT_FLAG_MCOLGPIS +*\*\ - ETH_MMCTX_INT_FLAG_GPKTIS +*\*\return SET or RESET +**/ +INTStatus ETH_GetMMCTxInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag) +{ + INTStatus TempStatus; + + /* Read the status of the corresponding INT bits */ + if(READ_BIT(ETHx->MMCTXINT, IntFlag) != (uint32_t)RESET) + { + /* This Interrupt is SET */ + TempStatus = SET; + } + else + { + /* This Interrupt is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetMACTimeStampFlagStatus. +*\*\fun Checks whether the specified ETH MAC Time Stamp flag is set or +*\*\ not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_MACTS_FLAG_SOVF +*\*\ - ETH_MACTS_FLAG_TARGT0 +*\*\ - ETH_MACTS_FLAG_TRGTERR0 +*\*\ - ETH_MACTS_FLAG_TXTSSIS +*\*\return SET or RESET +**/ +FlagStatus ETH_GetMACTimeStampFlagStatus(ETH_Module* ETHx, uint32_t Flag) +{ + FlagStatus TempStatus; + + /* Read the status of the corresponding flag bits */ + if(READ_BIT(ETHx->MACTSSTS, Flag) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetFlushTransmitQueueStatus. +*\*\fun Checks whether the ETH Flush Transmit Queue bit is cleared or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return SET or RESET +*\*\note The MTL Transmit Queue Operation Mode Register (ETH_MTLTXQOPMOD) +*\*\ should not be written until the Flush Transmit Queue bit is reset. +**/ +FlagStatus ETH_GetFlushTransmitQueueStatus(ETH_Module* ETHx) +{ + FlagStatus TempStatus; + + /* Read the status of the Flush Transmit Queue */ + if(READ_BIT(ETHx->MTLTXQOPMOD, ETH_MTLTXQOPMOD_FTQ) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetMTLInterruptStatus. +*\*\fun Checks whether the specified ETH MTL Interrupt flag is set or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - ETH_MTL_INT_FLAG_Q0IS +*\*\return SET or RESET +**/ +INTStatus ETH_GetMTLInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag) +{ + INTStatus TempStatus; + + /* Read the status of the corresponding INT bits */ + if(READ_BIT(ETHx->MTLINTSTS, IntFlag) != (uint32_t)RESET) + { + /* This Interrupt is SET */ + TempStatus = SET; + } + else + { + /* This Interrupt is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetMTLQueueInterruptStatus. +*\*\fun Checks whether the specified ETH MTL queue Interrupt flag is set or +*\*\ not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - ETH_MTLTXQUEUE_INT_FLAG_UNFIS +*\*\ - ETH_MTLRXQUEUE_INT_FLAG_OVFIS +*\*\return SET or RESET +**/ +INTStatus ETH_GetMTLQueueInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag) +{ + INTStatus TempStatus; + + /* Read the status of the corresponding INT bits */ + if(READ_BIT(ETHx->MTLQINTCTRLSTS, IntFlag) != (uint32_t)RESET) + { + /* This Interrupt is SET */ + TempStatus = SET; + } + else + { + /* This Interrupt is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetMTLCounterFlagStatus. +*\*\fun Checks whether the specified ETH MTL Counter flag is set or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_MTLCOUNTER_FLAG_UFCNTOVF +*\*\ - ETH_MTLCOUNTER_FLAG_OVFCNTOVF +*\*\ - ETH_MTLCOUNTER_FLAG_MISCNTOVF +*\*\return SET or RESET +**/ +FlagStatus ETH_GetMTLCounterFlagStatus(ETH_Module* ETHx, uint32_t Flag) +{ + FlagStatus TempStatus; + + if (Flag == ETH_MTLCOUNTER_FLAG_UFCNTOVF) + { + /* Read the status of the corresponding flag bits */ + if(READ_BIT(ETHx->MTLTXQUDF, Flag) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + } + else + { + /* Read the status of the corresponding flag bits */ + if(READ_BIT(ETHx->MTLRXQMPOFCNT, Flag) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetSoftwareResetStatus. +*\*\fun Checks whether the ETH software reset bit (SWR) is set or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return SET or RESET +*\*\note 1. Before reprogramming any ETH register, a value of zero should be +*\*\ read in SWR bit. +*\*\ 2. The SWR bit must be read at least 4 CSR clock cycles after it is +*\*\ written to 1. +**/ +FlagStatus ETH_GetSoftwareResetStatus(ETH_Module* ETHx) +{ + FlagStatus TempStatus; + + /* Read the status of the ETH software reset */ + if(READ_BIT(ETHx->DMAMODE, ETH_DMAMODE_SWR) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetDMAInterruptStatus. +*\*\fun Checks whether the specified ETH DMA Interrupt flag is set or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - ETH_DMA_INT_FLAG_DMACH0 +*\*\ - ETH_DMA_INT_FLAG_MTL +*\*\ - ETH_DMA_INT_FLAG_MAC +*\*\return SET or RESET +**/ +INTStatus ETH_GetDMAInterruptStatus(ETH_Module* ETHx, uint32_t IntFlag) +{ + INTStatus TempStatus; + + /* Read the status of the corresponding INT bits */ + if(READ_BIT(ETHx->DMAINTSTS, IntFlag) != (uint32_t)RESET) + { + /* This Interrupt is SET */ + TempStatus = SET; + } + else + { + /* This Interrupt is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetDMACh0TxProcessStatus. +*\*\fun Returns the ETH DMA Transmit Process Status. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return One of the following values: +*\*\ - ETH_DMACH0_TXPRO_FLAG_STOP +*\*\ - ETH_DMACH0_TXPRO_FLAG_RUN_FTTD +*\*\ - ETH_DMACH0_TXPRO_FLAG_RUN_WS +*\*\ - ETH_DMACH0_TXPRO_FLAG_RUN_RDS +*\*\ - ETH_DMACH0_TXPRO_FLAG_TSTMP_WS +*\*\ - ETH_DMACH0_TXPRO_FLAG_SUSPND +*\*\ - ETH_DMACH0_TXPRO_FLAG_RUN_CTD +**/ +uint32_t ETH_GetDMACh0TxProcessStatus(ETH_Module* ETHx) +{ + /* Return The new ETH DMA Transmit Process Status */ + return (READ_BIT(ETHx->DMADBGSTS, ETH_DMADBGSTS_TPS0)); +} + +/** +*\*\name ETH_GetDMACh0RxProcessStatus. +*\*\fun Returns the ETH DMA Receive Process Status. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return One of the following values: +*\*\ - ETH_DMACH0_RXPRO_FLAG_STOP +*\*\ - ETH_DMACH0_RXPRO_FLAG_RUN_FTTD +*\*\ - ETH_DMACH0_RXPRO_FLAG_RUN_WRP +*\*\ - ETH_DMACH0_RXPRO_FLAG_SUSPND +*\*\ - ETH_DMACH0_RXPRO_FLAG_RUN_CRD +*\*\ - ETH_DMACH0_RXPRO_FLAG_TSTMP +*\*\ - ETH_DMACH0_RXPRO_FLAG_RUN_TRP +**/ +uint32_t ETH_GetDMACh0RxProcessStatus(ETH_Module* ETHx) +{ + /* Return The new ETH DMA Receive Process Status */ + return (READ_BIT(ETHx->DMADBGSTS, ETH_DMADBGSTS_RPS0)); +} + +/** +*\*\name ETH_GetDMACh0FlagStatus. +*\*\fun Checks whether the specified ETH DMA-CH0 flag is set or not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_DMACH0_FLAG_TI +*\*\ - ETH_DMACH0_FLAG_TPS +*\*\ - ETH_DMACH0_FLAG_TBU +*\*\ - ETH_DMACH0_FLAG_RI +*\*\ - ETH_DMACH0_FLAG_RBU +*\*\ - ETH_DMACH0_FLAG_RPS +*\*\ - ETH_DMACH0_FLAG_RWT +*\*\ - ETH_DMACH0_FLAG_ETI +*\*\ - ETH_DMACH0_FLAG_ERI +*\*\ - ETH_DMACH0_FLAG_FBE +*\*\ - ETH_DMACH0_FLAG_CDE +*\*\ - ETH_DMACH0_FLAG_AIS +*\*\ - ETH_DMACH0_FLAG_NIS +*\*\return SET or RESET +**/ +FlagStatus ETH_GetDMACh0FlagStatus(ETH_Module* ETHx, uint32_t Flag) +{ + FlagStatus TempStatus; + + /* Read the status of the corresponding flag bits */ + if(READ_BIT(ETHx->DMACH0STS, Flag) != (uint32_t)RESET) + { + /* This flag is SET */ + TempStatus = SET; + } + else + { + /* This flag is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + +/** +*\*\name ETH_GetDMACh0InterruptStatus. +*\*\fun Checks whether the specified ETH DMA-CH0 Interrupt flag is set or +*\*\ not. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - ETH_DMACH0_INT_FLAG_TI +*\*\ - ETH_DMACH0_INT_FLAG_TPS +*\*\ - ETH_DMACH0_INT_FLAG_TBU +*\*\ - ETH_DMACH0_INT_FLAG_RI +*\*\ - ETH_DMACH0_INT_FLAG_RBU +*\*\ - ETH_DMACH0_INT_FLAG_RPS +*\*\ - ETH_DMACH0_INT_FLAG_RWT +*\*\ - ETH_DMACH0_INT_FLAG_ETI +*\*\ - ETH_DMACH0_INT_FLAG_ERI +*\*\ - ETH_DMACH0_INT_FLAG_FBE +*\*\ - ETH_DMACH0_INT_FLAG_CDE +*\*\ - ETH_DMACH0_INT_FLAG_AIS +*\*\ - ETH_DMACH0_INT_FLAG_NIS +*\*\return SET or RESET +**/ +INTStatus ETH_GetDMACh0InterruptStatus(ETH_Module* ETHx, uint32_t IntFlag) +{ + INTStatus TempStatus; + + /* Read the status of the corresponding INT bits */ + if(READ_BIT(ETHx->DMACH0STS, IntFlag) != (uint32_t)RESET) + { + /* This Interrupt is SET */ + TempStatus = SET; + } + else + { + /* This Interrupt is RESET */ + TempStatus = RESET; + } + + /* Return status */ + return TempStatus; +} + + + +/** +*\*\name ETH_ClearMACPHYInterruptFlag. +*\*\fun Clears the MAC PHY Interrupt pending flag for the ETH. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +void ETH_ClearMACPHYInterruptFlag(ETH_Module* ETHx) +{ + /* Check whether register write 1 clear is enabled or not */ + if (READ_BIT(ETHx->MACCSRSWCTRL, ETH_MACCSRSWCTRL_RCWE) != (uint32_t)RESET) + { + /* Clear the ETH PHY Interrupt flag by write 1 */ + SET_BIT(ETHx->MACINTSTS, ETH_MACINTSTS_PHYIS); + } + else + { + /* Clear the ETH PHY Interrupt flag by read */ + READ_BIT(ETHx->MACINTSTS, ETH_MACINTSTS_PHYIS); + } +} + +/** +*\*\name ETH_ClearPMTFlag. +*\*\fun Clears the MAC PMT pending flag for the ETH. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_PMT_FLAG_WUPR +*\*\ - ETH_PMT_FLAG_MPR +*\*\return none +**/ +void ETH_ClearPMTFlag(ETH_Module* ETHx, uint32_t Flag) +{ + /* Check whether register write 1 clear is enabled or not */ + if (READ_BIT(ETHx->MACCSRSWCTRL, ETH_MACCSRSWCTRL_RCWE) != (uint32_t)RESET) + { + if (Flag == ETH_PMT_FLAG_WUPR) + { + /* Clear the ETH PMT flag by write 1 */ + SET_BIT(ETHx->MACPMTCTRLSTS, ETH_PMT_FLAG_WUPR); + } + else + { + /* Clear the ETH PMT flag by write 1 */ + SET_BIT(ETHx->MACPMTCTRLSTS, ETH_PMT_FLAG_MPR); + } + } + else + { + /* Clear the ETH PMT flag by read */ + READ_REG(ETHx->MACPMTCTRLSTS); + } +} + +/** +*\*\name ETH_ClearMMCRxInterruptFlag. +*\*\fun Clears the MMC RX Interrupt pending flag for the ETH. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - ETH_MMCRX_INT_FLAG_BCGPIS +*\*\ - ETH_MMCRX_INT_FLAG_MCGPIS +*\*\ - ETH_MMCRX_INT_FLAG_CRCERPIS +*\*\ - ETH_MMCRX_INT_FLAG_ALGNERPIS +*\*\ - ETH_MMCRX_INT_FLAG_UCGPIS +*\*\return none +**/ +void ETH_ClearMMCRxInterruptFlag(ETH_Module* ETHx, uint32_t IntFlag) +{ + /* Clear the ETH MMC RX Interrupt flag by read */ + READ_BIT(ETHx->MMCRXINT, IntFlag); +} + +/** +*\*\name ETH_ClearMMCTxInterruptFlag. +*\*\fun Clears the MMC TX Interrupt pending flag for the ETH. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - ETH_MMCTX_INT_FLAG_SCOLGPIS +*\*\ - ETH_MMCTX_INT_FLAG_MCOLGPIS +*\*\ - ETH_MMCTX_INT_FLAG_GPKTIS +*\*\return none +**/ +void ETH_ClearMMCTxInterruptFlag(ETH_Module* ETHx, uint32_t IntFlag) +{ + /* Clear the ETH MMC TX Interrupt flag by read */ + READ_BIT(ETHx->MMCTXINT, IntFlag); +} + +/** +*\*\name ETH_ClearMACTimeStampFlag. +*\*\fun Clears the MAC Time Stamp pending flag for the ETH. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_MACTS_FLAG_SOVF +*\*\ - ETH_MACTS_FLAG_TARGT0 +*\*\ - ETH_MACTS_FLAG_TRGTERR0 +*\*\ - ETH_MACTS_FLAG_TXTSSIS +*\*\return none +**/ +void ETH_ClearMACTimeStampFlag(ETH_Module* ETHx, uint32_t Flag) +{ + /* Check whether register write 1 clear is enabled or not */ + if (READ_BIT(ETHx->MACCSRSWCTRL, ETH_MACCSRSWCTRL_RCWE) != (uint32_t)RESET) + { + if (Flag == ETH_MACTS_FLAG_TXTSSIS) + { + /* Clear the MAC Time Stamp flag by write register */ + WRITE_REG(ETHx->MACTXTSSTSS, 1U); + } + else + { + /* Clear the MAC Time Stamp flag by write 1 */ + SET_BIT(ETHx->MACTSSTS, Flag); + } + } + else + { + if (Flag == ETH_MACTS_FLAG_TXTSSIS) + { + /* Clear the MAC Time Stamp flag by read register */ + READ_REG(ETHx->MACTXTSSTSS); + } + else + { + /* Clear the MAC Time Stamp flag by read */ + READ_BIT(ETHx->MACTSSTS, Flag); + } + } +} + +/** +*\*\name ETH_ClearMACTxRxFlag. +*\*\fun Clears the MAC TX RX pending flag for the ETH. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_MACTX_FLAG_TJT +*\*\ - ETH_MACTX_FLAG_NCARR +*\*\ - ETH_MACTX_FLAG_LCARR +*\*\ - ETH_MACTX_FLAG_EXDEF +*\*\ - ETH_MACTX_FLAG_LCOL +*\*\ - ETH_MACTX_FLAG_EXCOL +*\*\ - ETH_MACRX_FLAG_RWT +*\*\return none +**/ +void ETH_ClearMACTxRxFlag(ETH_Module* ETHx, uint32_t Flag) +{ + /* Check whether register write 1 clear is enabled or not */ + if (READ_BIT(ETHx->MACCSRSWCTRL, ETH_MACCSRSWCTRL_RCWE) != (uint32_t)RESET) + { + /* Clear the ETH MAC TX RX Interrupt flag by write 1 */ + SET_BIT(ETHx->MACRXTXSTS, Flag); + } + else + { + /* Clear the ETH MAC TX RX Interrupt flag by read */ + READ_BIT(ETHx->MACRXTXSTS, Flag); + } +} + +/** +*\*\name ETH_ClearMACMDIOInterruptFlag. +*\*\fun Clears the MAC MDIO Interrupt pending flag for the ETH. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\return none +**/ +void ETH_ClearMACMDIOInterruptFlag(ETH_Module* ETHx) +{ + /* Check whether register write 1 clear is enabled or not */ + if (READ_BIT(ETHx->MACCSRSWCTRL, ETH_MACCSRSWCTRL_RCWE) != (uint32_t)RESET) + { + /* Clear the ETH MDIO Interrupt flag by write 1 */ + SET_BIT(ETHx->MACINTSTS, ETH_MACINTSTS_MDIOIS); + } + else + { + /* Clear the ETH MDIO Interrupt flag by read */ + READ_BIT(ETHx->MACINTSTS, ETH_MACINTSTS_MDIOIS); + } +} + +/** +*\*\name ETH_ClearMTLQueueInterruptFlag. +*\*\fun Clears the MTL Queue Interrupt pending flag for the ETH. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - ETH_MTLTXQUEUE_INT_FLAG_UNFIS +*\*\ - ETH_MTLRXQUEUE_INT_FLAG_OVFIS +*\*\return none +**/ +void ETH_ClearMTLQueueInterruptFlag(ETH_Module* ETHx, uint32_t IntFlag) +{ + /* Clear the selected ETH MTL Queue Interrupt flag */ + SET_BIT(ETHx->MTLQINTCTRLSTS, IntFlag); +} + +/** +*\*\name ETH_ClearDMACh0Flag. +*\*\fun Clears the DMA Channel 0 pending flag for the ETH. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Flag (The input parameters must be the following values): +*\*\ - ETH_DMACH0_FLAG_TI +*\*\ - ETH_DMACH0_FLAG_TPS +*\*\ - ETH_DMACH0_FLAG_TBU +*\*\ - ETH_DMACH0_FLAG_RI +*\*\ - ETH_DMACH0_FLAG_RBU +*\*\ - ETH_DMACH0_FLAG_RPS +*\*\ - ETH_DMACH0_FLAG_RWT +*\*\ - ETH_DMACH0_FLAG_ETI +*\*\ - ETH_DMACH0_FLAG_ERI +*\*\ - ETH_DMACH0_FLAG_FBE +*\*\ - ETH_DMACH0_FLAG_CDE +*\*\ - ETH_DMACH0_FLAG_AIS +*\*\ - ETH_DMACH0_FLAG_NIS +*\*\return none +**/ +void ETH_ClearDMACh0Flag(ETH_Module* ETHx, uint32_t Flag) +{ + /* Clear the selected ETH DMA Channel 0 flag */ + SET_BIT(ETHx->DMACH0STS, Flag); +} + +/** +*\*\name ETH_ClearDMACh0InterruptFlag. +*\*\fun Clears the DMA Channel 0 Interrupt pending flag for the ETH. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - ETH_DMACH0_INT_FLAG_TI +*\*\ - ETH_DMACH0_INT_FLAG_TPS +*\*\ - ETH_DMACH0_INT_FLAG_TBU +*\*\ - ETH_DMACH0_INT_FLAG_RI +*\*\ - ETH_DMACH0_INT_FLAG_RBU +*\*\ - ETH_DMACH0_INT_FLAG_RPS +*\*\ - ETH_DMACH0_INT_FLAG_RWT +*\*\ - ETH_DMACH0_INT_FLAG_ETI +*\*\ - ETH_DMACH0_INT_FLAG_ERI +*\*\ - ETH_DMACH0_INT_FLAG_FBE +*\*\ - ETH_DMACH0_INT_FLAG_CDE +*\*\ - ETH_DMACH0_INT_FLAG_AIS +*\*\ - ETH_DMACH0_INT_FLAG_NIS +*\*\return none +**/ +void ETH_ClearDMACh0InterruptFlag(ETH_Module* ETHx, uint32_t IntFlag) +{ + /* Clear the selected ETH DMA Channel 0 Interrupt flag */ + SET_BIT(ETHx->DMACH0STS, IntFlag); +} + + + +/** +*\*\name ETH_ConfigMACInterrupt. +*\*\fun Enables or disables the specified ETH MAC interrupts. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Interrupt (The input parameters must be the following values): +*\*\ - ETH_MAC_INT_PHY +*\*\ - ETH_MAC_INT_PMT +*\*\ - ETH_MAC_INT_TS +*\*\ - ETH_MAC_INT_TX +*\*\ - ETH_MAC_INT_RX +*\*\ - ETH_MAC_INT_MDIO +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_ConfigMACInterrupt(ETH_Module* ETHx, uint32_t Interrupt, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ETH MAC interrupts */ + SET_BIT(ETHx->MACINTEN, Interrupt); + } + else + { + /* Disable the selected ETH MAC interrupts */ + CLEAR_BIT(ETHx->MACINTEN, Interrupt); + } +} + +/** +*\*\name ETH_ConfigMMCRxInterrupt. +*\*\fun Enables or disables the specified ETH MMC RX interrupts. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Interrupt (The input parameters must be the following values): +*\*\ - ETH_MMCRX_INT_BCGPIM +*\*\ - ETH_MMCRX_INT_MCGPIM +*\*\ - ETH_MMCRX_INT_CRCERPIM +*\*\ - ETH_MMCRX_INT_ALGNERPIM +*\*\ - ETH_MMCRX_INT_UCGPIM +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_ConfigMMCRxInterrupt(ETH_Module* ETHx, uint32_t Interrupt, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ETH MMC RX interrupts */ + CLEAR_BIT(ETHx->MMCRXINTMSK, Interrupt); + } + else + { + /* Disable the selected ETH MMC RX interrupts */ + SET_BIT(ETHx->MMCRXINTMSK, Interrupt); + } +} + +/** +*\*\name ETH_ConfigMMCTxInterrupt. +*\*\fun Enables or disables the specified ETH MMC TX interrupts. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Interrupt (The input parameters must be the following values): +*\*\ - ETH_MMCTX_INT_SCOLGPIM +*\*\ - ETH_MMCTX_INT_MCOLGPIM +*\*\ - ETH_MMCTX_INT_GPKTIM +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_ConfigMMCTxInterrupt(ETH_Module* ETHx, uint32_t Interrupt, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ETH MMC TX interrupts */ + CLEAR_BIT(ETHx->MMCTXINTMSK, Interrupt); + } + else + { + /* Disable the selected ETH MMC TX interrupts */ + SET_BIT(ETHx->MMCTXINTMSK, Interrupt); + } +} + +/** +*\*\name ETH_ConfigMTLQueueInterrupt. +*\*\fun Enables or disables the specified ETH MTL Queue interrupts. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Interrupt (The input parameters must be the following values): +*\*\ - ETH_MTLTXQUEUE_INT_UIE +*\*\ - ETH_MTLRXQUEUE_INT_OIE +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_ConfigMTLQueueInterrupt(ETH_Module* ETHx, uint32_t Interrupt, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ETH MTL Queue interrupts */ + SET_BIT(ETHx->MTLQINTCTRLSTS, Interrupt); + } + else + { + /* Disable the selected ETH MTL Queue interrupts */ + CLEAR_BIT(ETHx->MTLQINTCTRLSTS, Interrupt); + } +} + +/** +*\*\name ETH_ConfigDMACh0Interrupt. +*\*\fun Enables or disables the specified ETH DMA Channel 0 interrupts. +*\*\param ETHx (The input parameters must be the following values): +*\*\ - ETH1 +*\*\ - ETH2 +*\*\param Interrupt (The input parameters must be the following values): +*\*\ - ETH_DMACH0_INT_TI +*\*\ - ETH_DMACH0_INT_TPS +*\*\ - ETH_DMACH0_INT_TBU +*\*\ - ETH_DMACH0_INT_RI +*\*\ - ETH_DMACH0_INT_RBU +*\*\ - ETH_DMACH0_INT_RPS +*\*\ - ETH_DMACH0_INT_RWT +*\*\ - ETH_DMACH0_INT_ETI +*\*\ - ETH_DMACH0_INT_ERI +*\*\ - ETH_DMACH0_INT_FBE +*\*\ - ETH_DMACH0_INT_CDE +*\*\ - ETH_DMACH0_INT_AIS +*\*\ - ETH_DMACH0_INT_NIS +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void ETH_ConfigDMACh0Interrupt(ETH_Module* ETHx, uint32_t Interrupt, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected ETH DMA Channel 0 interrupts */ + SET_BIT(ETHx->DMACH0INTEN, Interrupt); + } + else + { + /* Disable the selected ETH DMA Channel 0 interrupts */ + CLEAR_BIT(ETHx->DMACH0INTEN, Interrupt); + } +} + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_exti.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_exti.c new file mode 100644 index 0000000000..838895faa5 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_exti.c @@ -0,0 +1,702 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_exti.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_exti.h" +#include "misc.h" + +/** +*\*\name EXTI_DeInit. +*\*\fun Reset the EXTI registers. +*\*\param Core_Type (The input parameters must be the following values): +*\*\ - CORE_M7 +*\*\ - CORE_M4 +*\*\return none +**/ +void EXTI_DeInit(void) +{ + EXTI->RT_CFG[0] = 0x00000000; + EXTI->RT_CFG[1] = 0x00000000; + EXTI->FT_CFG[0] = 0x00000000; + EXTI->FT_CFG[1] = 0x00000000; + EXTI->TSSEL = 0x00000000; + + if(Get_CurrentCPU() != CM7_CPU) + { + EXTI->M4IMASK[0] = 0x00000000; + EXTI->M4IMASK[1] = 0x00000000; + + EXTI->M7EMASK[0] = 0x00000000; + EXTI->M7EMASK[1] = 0x00000000; + + EXTI->M4PEND[0] = 0xFFFFFFFF; + EXTI->M4PEND[1] = 0x0000FFFF; + + EXTI->M4IMASK_DRC[0] = 0x00000000; + EXTI->M4IMASK_DRC[1] = 0x00000000; + + EXTI->M4EMASK_DRC[0] = 0x00000000; + EXTI->M4EMASK_DRC[1] = 0x00000000; + } + else + { + EXTI->M7IMASK[0] = 0x00000000; + EXTI->M7IMASK[1] = 0x00000000; + + EXTI->M7EMASK[0] = 0x00000000; + EXTI->M7EMASK[1] = 0x00000000; + + EXTI->M7PEND[0] = 0xFFFFFFFF; + EXTI->M7PEND[1] = 0x0000FFFF; + + EXTI->M7IMASK_DRC[0] = 0x00000000; + EXTI->M7IMASK_DRC[1] = 0x00000000; + + EXTI->M7EMASK_DRC[0] = 0x00000000; + EXTI->M7EMASK_DRC[1] = 0x00000000; + } +} + +/** +*\*\name EXTI_InitPeripheral. +*\*\fun Initializes the EXTI according to EXTI_InitStruct. +*\*\param EXTI_InitStruct(The input parameters must be the following values) : +*\*\param EXTI_Line +*\*\ - EXTI_LINE0 +*\*\ - EXTI_LINE1 +*\*\ - EXTI_LINE2 +*\*\ - EXTI_LINE3 +*\*\ - EXTI_LINE4 +*\*\ - EXTI_LINE5 +*\*\ - EXTI_LINE6 +*\*\ - EXTI_LINE7 +*\*\ - EXTI_LINE8 +*\*\ - EXTI_LINE9 +*\*\ - EXTI_LINE10 +*\*\ - EXTI_LINE11 +*\*\ - EXTI_LINE12 +*\*\ - EXTI_LINE13 +*\*\ - EXTI_LINE14 +*\*\ - EXTI_LINE15 +*\*\ - EXTI_LINE16 +*\*\ - EXTI_LINE17 +*\*\ - EXTI_LINE18 +*\*\ - EXTI_LINE19 +*\*\ - EXTI_LINE20 +*\*\ - EXTI_LINE21 +*\*\ - EXTI_LINE22 +*\*\ - EXTI_LINE23 +*\*\ - EXTI_LINE24 +*\*\ - EXTI_LINE25 +*\*\ - EXTI_LINE49 +*\*\ - EXTI_LINE51 +*\*\ - EXTI_LINE52 +*\*\ - EXTI_LINE54 +*\*\ - EXTI_LINE55 +*\*\ - EXTI_LINE56 +*\*\ - EXTI_LINE62 +*\*\ - EXTI_LINE63 +*\*\ - EXTI_LINE64 +*\*\ - EXTI_LINE65 +*\*\ - EXTI_LINE66 +*\*\ - EXTI_LINE67 +*\*\ - EXTI_LINE68 +*\*\ - EXTI_LINE69 +*\*\ - EXTI_LINE70 +*\*\ - EXTI_LINE71 +*\*\ - EXTI_LINE72 +*\*\ - EXTI_LINE73 +*\*\ - EXTI_LINE74 +*\*\ - EXTI_LINE75 +*\*\ - EXTI_LINE76 +*\*\ - EXTI_LINE77 +*\*\ - EXTI_LINE78 +*\*\ - EXTI_LINE79 +*\*\ - EXTI_LINE80 +*\*\ - EXTI_LINE81 +*\*\ - EXTI_LINE82 +*\*\ - EXTI_LINE83 +*\*\ - EXTI_LINE84 +*\*\ - EXTI_LINE85 +*\*\ - EXTI_LINE86 +*\*\ - EXTI_LINE87 +*\*\ - EXTI_LINE88 +*\*\ - EXTI_LINE89 +*\*\ - EXTI_Mode +*\*\ - EXTI_Mode_Interrupt +*\*\ - EXTI_Mode_Event +*\*\ - EXTI_Trigger +*\*\ - EXTI_Trigger_Falling +*\*\ - EXTI_Trigger_Rising +*\*\ - EXTI_Trigger_Rising_Falling +*\*\ - EXTI_LineCmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void EXTI_InitPeripheral(EXTI_InitType* EXTI_InitStruct) +{ + uint32_t tmpregister; + uint32_t temp; + uint32_t exti_index; + uint32_t cpu_offset = 0; + uint8_t temp_index; + + if(Get_CurrentCPU() != CM7_CPU) + { + cpu_offset = 0x20; + } + + if(EXTI_InitStruct->EXTI_Line >= 100) + { + cpu_offset += 0xC0; + EXTI_InitStruct->EXTI_Line -= 100; + } + + temp_index = EXTI_InitStruct->EXTI_Line / 32; + exti_index = (uint32_t)0x00000001 << (EXTI_InitStruct->EXTI_Line % 32); + + tmpregister = (uint32_t)EXTI_BASE + (uint32_t)EXTI_InitStruct->EXTI_Mode + cpu_offset + 4 * temp_index; + + if (EXTI_InitStruct->EXTI_LineCmd != DISABLE) + { + /* Clear EXTI line interrupt/event configuration */ + *(__IO uint32_t*)tmpregister &= ~exti_index; + + if(EXTI_InitStruct->EXTI_Mode == EXTI_Mode_Interrupt) + { + temp = tmpregister + 0x40; + } + else + { + temp = tmpregister - 0x40; + } + + /* Clear EXTI line interrupt/event configuration */ + *(__IO uint32_t*)temp &= ~exti_index; + + if(cpu_offset < 0xC0) + { + /* Select the trigger for the selected external interrupts */ + if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) + { + /* Rising Falling edge */ + EXTI->RT_CFG[temp_index] |= exti_index; + EXTI->FT_CFG[temp_index] |= exti_index; + } + else + { + /* Clear Rising Falling edge configuration */ + EXTI->RT_CFG[temp_index] &= ~exti_index; + EXTI->FT_CFG[temp_index] &= ~exti_index; + + temp = (uint32_t)EXTI_BASE + (uint32_t)EXTI_InitStruct->EXTI_Trigger + 4 * temp_index; + + /* Clear EXTI line event/interrupt configuration */ + *(__IO uint32_t*)temp |= exti_index; + } + } + + /* Enable EXTI line event configuration */ + *(__IO uint32_t*)tmpregister |= exti_index; + } + else + { + /* Disable the selected external lines */ + *(__IO uint32_t*)tmpregister &= ~(exti_index); + } + +} + + +/** +*\*\name EXTI_InitStruct. +*\*\fun Fills each EXTI_InitStruct member with its default value. +*\*\param InitStruct : +*\*\ - - Pointer to the EXTI_InitType structure which will be initialized. +*\*\return none +**/ +void EXTI_InitStruct(EXTI_InitType* EXTI_InitStruct ) +{ + EXTI_InitStruct->EXTI_Line = EXTI_LINE0; + EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling; + EXTI_InitStruct->EXTI_LineCmd = DISABLE; +} + +/** +*\*\name EXTI_TriggerSWInt. +*\*\fun Generates a Software interrupt. +*\*\param EXTI_Line +*\*\ - EXTI_LINE0 +*\*\ - EXTI_LINE1 +*\*\ - EXTI_LINE2 +*\*\ - EXTI_LINE3 +*\*\ - EXTI_LINE4 +*\*\ - EXTI_LINE5 +*\*\ - EXTI_LINE6 +*\*\ - EXTI_LINE7 +*\*\ - EXTI_LINE8 +*\*\ - EXTI_LINE9 +*\*\ - EXTI_LINE10 +*\*\ - EXTI_LINE11 +*\*\ - EXTI_LINE12 +*\*\ - EXTI_LINE13 +*\*\ - EXTI_LINE14 +*\*\ - EXTI_LINE15 +*\*\ - EXTI_LINE16 +*\*\ - EXTI_LINE17 +*\*\ - EXTI_LINE18 +*\*\ - EXTI_LINE19 +*\*\ - EXTI_LINE20 +*\*\ - EXTI_LINE21 +*\*\ - EXTI_LINE22 +*\*\ - EXTI_LINE23 +*\*\ - EXTI_LINE49 +*\*\ - EXTI_LINE52 +*\*\ - EXTI_LINE62 +*\*\ - EXTI_LINE63 +*\*\ - EXTI_LINE64 +*\*\ - EXTI_LINE65 +*\*\ - EXTI_LINE66 +*\*\ - EXTI_LINE67 +*\*\ - EXTI_LINE68 +*\*\ - EXTI_LINE69 +*\*\ - EXTI_LINE70 +*\*\ - EXTI_LINE71 +*\*\ - EXTI_LINE72 +*\*\ - EXTI_LINE73 +*\*\ - EXTI_LINE74 +*\*\ - EXTI_LINE75 +*\*\ - EXTI_LINE81 +*\*\ - EXTI_LINE82 +*\*\ - EXTI_LINE86 +*\*\ - EXTI_LINE87 +*\*\ - EXTI_LINE88 +*\*\ - EXTI_LINE89 +*\*\return none +**/ +void EXTI_TriggerSWInt(uint32_t EXTI_Line) +{ + if(EXTI_Line < 100) + { + EXTI->SWIE[EXTI_Line / 32] |= (uint32_t)0x00000001 << (EXTI_Line % 32); + } +} + +/** +*\*\name EXTI_Flag_Status_Get. +*\*\fun Get EXTI line flag status. +*\*\param EXTI_Line +*\*\ - EXTI_LINE0 +*\*\ - EXTI_LINE1 +*\*\ - EXTI_LINE2 +*\*\ - EXTI_LINE3 +*\*\ - EXTI_LINE4 +*\*\ - EXTI_LINE5 +*\*\ - EXTI_LINE6 +*\*\ - EXTI_LINE7 +*\*\ - EXTI_LINE8 +*\*\ - EXTI_LINE9 +*\*\ - EXTI_LINE10 +*\*\ - EXTI_LINE11 +*\*\ - EXTI_LINE12 +*\*\ - EXTI_LINE13 +*\*\ - EXTI_LINE14 +*\*\ - EXTI_LINE15 +*\*\ - EXTI_LINE16 +*\*\ - EXTI_LINE17 +*\*\ - EXTI_LINE18 +*\*\ - EXTI_LINE19 +*\*\ - EXTI_LINE20 +*\*\ - EXTI_LINE21 +*\*\ - EXTI_LINE22 +*\*\ - EXTI_LINE23 +*\*\ - EXTI_LINE49 +*\*\ - EXTI_LINE52 +*\*\ - EXTI_LINE62 +*\*\ - EXTI_LINE63 +*\*\ - EXTI_LINE64 +*\*\ - EXTI_LINE65 +*\*\ - EXTI_LINE66 +*\*\ - EXTI_LINE67 +*\*\ - EXTI_LINE68 +*\*\ - EXTI_LINE69 +*\*\ - EXTI_LINE70 +*\*\ - EXTI_LINE71 +*\*\ - EXTI_LINE72 +*\*\ - EXTI_LINE73 +*\*\ - EXTI_LINE74 +*\*\ - EXTI_LINE75 +*\*\ - EXTI_LINE81 +*\*\ - EXTI_LINE82 +*\*\ - EXTI_LINE86 +*\*\ - EXTI_LINE87 +*\*\ - EXTI_LINE88 +*\*\ - EXTI_LINE89 +*\*\return SET or RESET +**/ +FlagStatus EXTI_GetStatusFlag(uint32_t EXTI_Line) +{ + FlagStatus bitstatus = RESET; + uint32_t line_index; + + if(EXTI_Line < 100) + { + line_index = (uint32_t)0x00000001 << (EXTI_Line % 32); + + if (Get_CurrentCPU() != CM7_CPU) + { + if (( EXTI->M4PEND[EXTI_Line / 32] & line_index ) != ( uint32_t )RESET ) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; + } + else + { + if (( EXTI->M7PEND[EXTI_Line / 32] & line_index ) != ( uint32_t )RESET ) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; + } + } + + return bitstatus; +} + +/** +*\*\name EXTI_ClrStatusFlag. +*\*\fun Clear EXTI line flag status. +*\*\param EXTI_Line: +*\*\ - EXTI_LINE0 +*\*\ - EXTI_LINE1 +*\*\ - EXTI_LINE2 +*\*\ - EXTI_LINE3 +*\*\ - EXTI_LINE4 +*\*\ - EXTI_LINE5 +*\*\ - EXTI_LINE6 +*\*\ - EXTI_LINE7 +*\*\ - EXTI_LINE8 +*\*\ - EXTI_LINE9 +*\*\ - EXTI_LINE10 +*\*\ - EXTI_LINE11 +*\*\ - EXTI_LINE12 +*\*\ - EXTI_LINE13 +*\*\ - EXTI_LINE14 +*\*\ - EXTI_LINE15 +*\*\ - EXTI_LINE16 +*\*\ - EXTI_LINE17 +*\*\ - EXTI_LINE18 +*\*\ - EXTI_LINE19 +*\*\ - EXTI_LINE20 +*\*\ - EXTI_LINE21 +*\*\ - EXTI_LINE22 +*\*\ - EXTI_LINE23 +*\*\ - EXTI_LINE49 +*\*\ - EXTI_LINE52 +*\*\ - EXTI_LINE62 +*\*\ - EXTI_LINE63 +*\*\ - EXTI_LINE64 +*\*\ - EXTI_LINE65 +*\*\ - EXTI_LINE66 +*\*\ - EXTI_LINE67 +*\*\ - EXTI_LINE68 +*\*\ - EXTI_LINE69 +*\*\ - EXTI_LINE70 +*\*\ - EXTI_LINE71 +*\*\ - EXTI_LINE72 +*\*\ - EXTI_LINE73 +*\*\ - EXTI_LINE74 +*\*\ - EXTI_LINE75 +*\*\ - EXTI_LINE81 +*\*\ - EXTI_LINE82 +*\*\ - EXTI_LINE86 +*\*\ - EXTI_LINE87 +*\*\ - EXTI_LINE88 +*\*\ - EXTI_LINE89 +*\*\return none +**/ +void EXTI_ClrStatusFlag(uint32_t EXTI_Line) +{ + uint32_t line_index; + + if(EXTI_Line < 100) + { + line_index = (uint32_t)0x00000001 << (EXTI_Line % 32); + + if (Get_CurrentCPU() != CM7_CPU) + { + EXTI->M4PEND[EXTI_Line / 32] = line_index; + } + else + { + EXTI->M7PEND[EXTI_Line / 32] = line_index; + } + } +} + +/** +*\*\name EXTI_GetITStatus. +*\*\fun GET EXTI line interrupt status. +*\*\param EXTI_Line +*\*\ - EXTI_LINE0 +*\*\ - EXTI_LINE1 +*\*\ - EXTI_LINE2 +*\*\ - EXTI_LINE3 +*\*\ - EXTI_LINE4 +*\*\ - EXTI_LINE5 +*\*\ - EXTI_LINE6 +*\*\ - EXTI_LINE7 +*\*\ - EXTI_LINE8 +*\*\ - EXTI_LINE9 +*\*\ - EXTI_LINE10 +*\*\ - EXTI_LINE11 +*\*\ - EXTI_LINE12 +*\*\ - EXTI_LINE13 +*\*\ - EXTI_LINE14 +*\*\ - EXTI_LINE15 +*\*\ - EXTI_LINE16 +*\*\ - EXTI_LINE17 +*\*\ - EXTI_LINE18 +*\*\ - EXTI_LINE19 +*\*\ - EXTI_LINE20 +*\*\ - EXTI_LINE21 +*\*\ - EXTI_LINE22 +*\*\ - EXTI_LINE23 +*\*\ - EXTI_LINE49 +*\*\ - EXTI_LINE52 +*\*\ - EXTI_LINE62 +*\*\ - EXTI_LINE63 +*\*\ - EXTI_LINE64 +*\*\ - EXTI_LINE65 +*\*\ - EXTI_LINE66 +*\*\ - EXTI_LINE67 +*\*\ - EXTI_LINE68 +*\*\ - EXTI_LINE69 +*\*\ - EXTI_LINE70 +*\*\ - EXTI_LINE71 +*\*\ - EXTI_LINE72 +*\*\ - EXTI_LINE73 +*\*\ - EXTI_LINE74 +*\*\ - EXTI_LINE75 +*\*\ - EXTI_LINE81 +*\*\ - EXTI_LINE82 +*\*\ - EXTI_LINE86 +*\*\ - EXTI_LINE87 +*\*\ - EXTI_LINE88 +*\*\ - EXTI_LINE89 +*\*\return SET or RESET +**/ +ITStatus EXTI_GetITStatus( uint32_t EXTI_Line) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + uint32_t line_index; + uint8_t temp_index; + + if(EXTI_Line < 100) + { + temp_index = EXTI_Line / 32; + line_index = (uint32_t)0x00000001 << (EXTI_Line % 32); + + if (Get_CurrentCPU() != CM7_CPU) + { + enablestatus = EXTI->M4IMASK[temp_index] & line_index; + + if ((( EXTI->M4PEND[temp_index] & line_index ) != ( uint32_t )RESET) && ( enablestatus != ( uint32_t )RESET )) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; + } + else + { + enablestatus = EXTI->M7IMASK[temp_index] & line_index; + + if ((( EXTI->M7PEND[temp_index] & line_index ) != ( uint32_t )RESET) && ( enablestatus != ( uint32_t )RESET )) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; + } + } + + return bitstatus; +} + +/** +*\*\name EXTI_ClrITPendBit. +*\*\fun Clear EXTI line interrupt pend bit. +*\*\param EXTI_Line +*\*\ - EXTI_LINE0 +*\*\ - EXTI_LINE1 +*\*\ - EXTI_LINE2 +*\*\ - EXTI_LINE3 +*\*\ - EXTI_LINE4 +*\*\ - EXTI_LINE5 +*\*\ - EXTI_LINE6 +*\*\ - EXTI_LINE7 +*\*\ - EXTI_LINE8 +*\*\ - EXTI_LINE9 +*\*\ - EXTI_LINE10 +*\*\ - EXTI_LINE11 +*\*\ - EXTI_LINE12 +*\*\ - EXTI_LINE13 +*\*\ - EXTI_LINE14 +*\*\ - EXTI_LINE15 +*\*\ - EXTI_LINE16 +*\*\ - EXTI_LINE17 +*\*\ - EXTI_LINE18 +*\*\ - EXTI_LINE19 +*\*\ - EXTI_LINE20 +*\*\ - EXTI_LINE21 +*\*\ - EXTI_LINE22 +*\*\ - EXTI_LINE23 +*\*\ - EXTI_LINE49 +*\*\ - EXTI_LINE52 +*\*\ - EXTI_LINE62 +*\*\ - EXTI_LINE63 +*\*\ - EXTI_LINE64 +*\*\ - EXTI_LINE65 +*\*\ - EXTI_LINE66 +*\*\ - EXTI_LINE67 +*\*\ - EXTI_LINE68 +*\*\ - EXTI_LINE69 +*\*\ - EXTI_LINE70 +*\*\ - EXTI_LINE71 +*\*\ - EXTI_LINE72 +*\*\ - EXTI_LINE73 +*\*\ - EXTI_LINE74 +*\*\ - EXTI_LINE75 +*\*\ - EXTI_LINE81 +*\*\ - EXTI_LINE82 +*\*\ - EXTI_LINE86 +*\*\ - EXTI_LINE87 +*\*\ - EXTI_LINE88 +*\*\ - EXTI_LINE89 +*\*\return none +**/ +void EXTI_ClrITPendBit( uint32_t EXTI_Line) +{ + uint32_t line_index; + + if(EXTI_Line < 100) + { + line_index = (uint32_t)0x00000001 << EXTI_Line % 32; + + if (Get_CurrentCPU() != CM7_CPU) + { + EXTI->M4PEND[EXTI_Line / 32] = line_index; + } + else + { + EXTI->M7PEND[EXTI_Line / 32] = line_index; + } + } +} + +/** +*\*\name EXTI_RTCTimeStampSel. +*\*\fun Select the input of TimeStamp event. +*\*\param EXTI_TSSEL_Line : +*\*\ - EXTI_TSSEL_LINE0 +*\*\ - EXTI_TSSEL_LINE1 +*\*\ - EXTI_TSSEL_LINE2 +*\*\ - EXTI_TSSEL_LINE3 +*\*\ - EXTI_TSSEL_LINE4 +*\*\ - EXTI_TSSEL_LINE5 +*\*\ - EXTI_TSSEL_LINE6 +*\*\ - EXTI_TSSEL_LINE7 +*\*\ - EXTI_TSSEL_LINE8 +*\*\ - EXTI_TSSEL_LINE9 +*\*\ - EXTI_TSSEL_LINE10 +*\*\ - EXTI_TSSEL_LINE11 +*\*\ - EXTI_TSSEL_LINE12 +*\*\ - EXTI_TSSEL_LINE13 +*\*\ - EXTI_TSSEL_LINE14 +*\*\ - EXTI_TSSEL_LINE15 +*\*\return none +**/ +void EXTI_RTCTimeStampSel(uint32_t EXTI_TSSEL_Line) +{ + uint32_t tempReg; + + tempReg = EXTI->TSSEL; + + tempReg &= ~EXTI_TSSEL_LINE_MASK; + tempReg |= EXTI_TSSEL_Line; + + EXTI->TSSEL = tempReg; +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_fdcan.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_fdcan.c new file mode 100644 index 0000000000..eecb9475a2 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_fdcan.c @@ -0,0 +1,4885 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_fdcan.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_fdcan.h" +#include "n32h76x_78x_rcc.h" + +static FDCAN_MsgRamType *pMsgRam[8]; + +/* Get bytes of data according to the DLC value */ +static const uint8_t DLCtoBytes[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64}; + +/* Private function */ +static ErrorStatus FDCAN_InitMsgRam(FDCAN_Module* FDCANx, FDCAN_InitType *FDCAN_InitParam); +static void FDCAN_CopyMsgToRAM(FDCAN_Module *FDCANx, FDCAN_TxHeaderType *pTxHeader, uint8_t *pTxData, uint32_t BufferIndex); +static uint8_t FDCAN_Get_Index(FDCAN_Module *FDCANx); + +/** + *\*\name FDCAN_DeInit. + *\*\fun Reset the FDCANx peripheral registers to their default reset values. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_DeInit(FDCAN_Module* FDCANx) +{ + if (FDCANx == FDCAN1) + { + RCC_EnableAPB1PeriphReset5(RCC_APB1_PERIPHRST_FDCAN1); + } + else if (FDCANx == FDCAN2) + { + RCC_EnableAPB1PeriphReset5(RCC_APB1_PERIPHRST_FDCAN2); + } + else if (FDCANx == FDCAN3) + { + RCC_EnableAPB2PeriphReset4(RCC_APB2_PERIPHRST_FDCAN3); + } + else if (FDCANx == FDCAN4) + { + RCC_EnableAPB2PeriphReset4(RCC_APB2_PERIPHRST_FDCAN4); + } + else if (FDCANx == FDCAN5) + { + RCC_EnableAPB1PeriphReset5(RCC_APB1_PERIPHRST_FDCAN5); + } + else if (FDCANx == FDCAN6) + { + RCC_EnableAPB1PeriphReset5(RCC_APB1_PERIPHRST_FDCAN6); + } + else if (FDCANx == FDCAN7) + { + RCC_EnableAPB2PeriphReset4(RCC_APB2_PERIPHRST_FDCAN7); + } + else if (FDCANx == FDCAN8) + { + RCC_EnableAPB2PeriphReset4(RCC_APB2_PERIPHRST_FDCAN8); + } + else + { + /* no process*/ + } +} + +/** + *\*\name FDCAN_Init. + *\*\fun Initializes the FDCAN peripheral according to the specified + *\*\ parameters in the FDCAN_InitParam.. + *\*\param FDCANx pointer to specified FDCAN,must be one of the following value: + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param FDCAN_InitParam: pointer to a FDCAN_InitType structure. + *\*\ - FrameFormat: + *\*\ - FDCAN_FRAME_CLASSIC + *\*\ - FDCAN_FRAME_FD_NO_BRS + *\*\ - FDCAN_FRAME_FD_BRS + *\*\ - Mode: + *\*\ - FDCAN_MODE_NORMAL + *\*\ - FDCAN_MODE_RESTRICTED_OPERATION + *\*\ - FDCAN_MODE_BUS_MONITORING + *\*\ - FDCAN_MODE_INTERNAL_LOOPBACK + *\*\ - FDCAN_MODE_EXTERNAL_LOOPBACK + *\*\ - Prescaler: Must be a value between 1 and 512. + *\*\ - SyncJumpWidth: Must be a value between 1 and 128. + *\*\ - TimeSeg1: Must be a value between 2 and 256. + *\*\ - TimeSeg2: Must be a value between 2 and 128. + *\*\ - DataPrescaler: Must be a value between 1 and 32. + *\*\ - DataSyncJumpWidth: Must be a value between 1 and 16. + *\*\ - DataTimeSeg1: Must be a value between 1 and 32. + *\*\ - DataTimeSeg2: Must be a value between 1 and 16. + *\*\ - MsgRamStrAddr: + *\*\ - FDCAN_START_ADDRESS_SRAM5BANK1 , 0x30050000 as FDCAN base address. + *\*\ - FDCAN_START_ADDRESS_SRAM5BANK2 , 0x30054000 as FDCAN base address. + *\*\ - MsgRamOffset: Must be a value between 0 and 0x1000. + *\*\ - StdFilterSize: Must be a value between 0 and 128. + *\*\ - ExtFilterSize: Must be a value between 0 and 64. + *\*\ - RxFifo0Size: Must be a value between 0 and 64. + *\*\ - RxFifo1Size: Must be a value between 0 and 64. + *\*\ - RxBufferSize: Must be a value between 0 and 64. + *\*\ - TxEventSize: Must be a value between 0 and 32. + *\*\ - TxBufferSize: Must be a value between 0 and 32. + *\*\ - RxFifo0DataSize: + *\*\ - FDCAN_DATA_BYTES_8 + *\*\ - FDCAN_DATA_BYTES_12 + *\*\ - FDCAN_DATA_BYTES_16 + *\*\ - FDCAN_DATA_BYTES_20 + *\*\ - FDCAN_DATA_BYTES_24 + *\*\ - FDCAN_DATA_BYTES_32 + *\*\ - FDCAN_DATA_BYTES_48 + *\*\ - FDCAN_DATA_BYTES_64 + *\*\ - RxFifo1DataSize: + *\*\ - FDCAN_DATA_BYTES_8 + *\*\ - FDCAN_DATA_BYTES_12 + *\*\ - FDCAN_DATA_BYTES_16 + *\*\ - FDCAN_DATA_BYTES_20 + *\*\ - FDCAN_DATA_BYTES_24 + *\*\ - FDCAN_DATA_BYTES_32 + *\*\ - FDCAN_DATA_BYTES_48 + *\*\ - FDCAN_DATA_BYTES_64 + *\*\ - RxBufferDataSize: + *\*\ - FDCAN_DATA_BYTES_8 + *\*\ - FDCAN_DATA_BYTES_12 + *\*\ - FDCAN_DATA_BYTES_16 + *\*\ - FDCAN_DATA_BYTES_20 + *\*\ - FDCAN_DATA_BYTES_24 + *\*\ - FDCAN_DATA_BYTES_32 + *\*\ - FDCAN_DATA_BYTES_48 + *\*\ - FDCAN_DATA_BYTES_64 + *\*\ - TxBufferDataSize: + *\*\ - FDCAN_DATA_BYTES_8 + *\*\ - FDCAN_DATA_BYTES_12 + *\*\ - FDCAN_DATA_BYTES_16 + *\*\ - FDCAN_DATA_BYTES_20 + *\*\ - FDCAN_DATA_BYTES_24 + *\*\ - FDCAN_DATA_BYTES_32 + *\*\ - FDCAN_DATA_BYTES_48 + *\*\ - FDCAN_DATA_BYTES_64 + *\*\ - TxFifoQueueMode: + *\*\ - FDCAN_TX_FIFO_MODE + *\*\ - FDCAN_TX_QUEUE_MODE + *\*\ - TxFifoQueueSize: Must be a value between 0 and 32. + *\*\ - AutoRetransmission: + *\*\ - ENABLE + *\*\ - DISABLE + *\*\ - TransmitPause: + *\*\ - ENABLE + *\*\ - DISABLE + *\*\ - ProtocolException: + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_Init(FDCAN_Module* FDCANx, FDCAN_InitType *FDCAN_InitParam) +{ + uint32_t timeout; + uint32_t tempReg; + const uint8_t SizeToReg[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 5, 0, 0, 0, 6, 0, 0, 0, 7}; + + /* Exit from Sleep mode */ + FDCANx->CCCR &= ~FDCAN_CCCR_CSR; + + /* Check Sleep mode acknowledge */ + timeout = 0; + + while ((FDCANx->CCCR & FDCAN_CCCR_CSA) == FDCAN_CCCR_CSA) + { + if (timeout > FDCAN_TIMEOUT_VALUE) + { + return ERROR; + } + + timeout++; + } + + /* Request initialisation */ + FDCANx->CCCR |= FDCAN_CCCR_INIT; + + /* Wait until the INIT bit into CCCR register is set */ + timeout = 0; + + while ((FDCANx->CCCR & FDCAN_CCCR_INIT) == 0U) + { + if (timeout > FDCAN_TIMEOUT_VALUE) + { + return ERROR; + } + + timeout++; + } + + /* Enable configuration change */ + FDCANx->CCCR |= FDCAN_CCCR_CCE; + + /* Configuration the CCCR register */ + tempReg = FDCANx->CCCR; + + /* Set the no automatic retransmission */ + if (FDCAN_InitParam->AutoRetransmission == ENABLE) + { + tempReg &= ~FDCAN_CCCR_DAR; + } + else + { + tempReg |= FDCAN_CCCR_DAR; + } + + /* Set the transmit pause feature */ + if (FDCAN_InitParam->TransmitPause == ENABLE) + { + tempReg |= FDCAN_CCCR_TXP; + } + else + { + tempReg &= ~FDCAN_CCCR_TXP; + } + + /* Set the Protocol Exception Handling */ + if (FDCAN_InitParam->ProtocolException == ENABLE) + { + tempReg &= ~FDCAN_CCCR_PXHD; + } + else + { + tempReg |= FDCAN_CCCR_PXHD; + } + + /* Set FDCAN Frame Format */ + tempReg &= ~(FDCAN_CCCR_BRSE | FDCAN_CCCR_FDOE); + tempReg |= FDCAN_InitParam->FrameFormat; + + /* Set FDCAN Operating Mode: + | Normal | Restricted | Bus | Internal | External + | | Operation | Monitoring | LoopBack | LoopBack + CCCR.TEST | 0 | 0 | 0 | 1 | 1 + CCCR.MON | 0 | 0 | 1 | 1 | 0 + TEST.LBCK | 0 | 0 | 0 | 1 | 1 + CCCR.ASM | 0 | 1 | 0 | 0 | 0 + */ + tempReg &= ~(FDCAN_CCCR_TEST | FDCAN_CCCR_MON | FDCAN_CCCR_ASM); + tempReg |= FDCAN_InitParam->Mode; + FDCANx->CCCR = tempReg; + + if ((FDCAN_InitParam->Mode & FDCAN_CCCR_TEST) == FDCAN_CCCR_TEST) + { + FDCANx->TEST |= FDCAN_TEST_LBCK; + } + else + { + FDCANx->TEST &= ~FDCAN_TEST_LBCK; + } + + /* Set the nominal bit timing register */ + FDCANx->NBTP = ( ((FDCAN_InitParam->SyncJumpWidth - 1UL) << FDCAN_NBTP_NSJW_OFFSET) \ + | ((FDCAN_InitParam->TimeSeg1 - 1UL) << FDCAN_NBTP_NTSEG1_OFFSET) \ + | ((FDCAN_InitParam->TimeSeg2 - 1UL) << FDCAN_NBTP_NTSEG2_OFFSET) \ + | ((FDCAN_InitParam->Prescaler - 1UL) << FDCAN_NBTP_NBRP_OFFSET) ); + + /* If FD operation with BRS is selected, set the data bit timing register */ + if (FDCAN_InitParam->FrameFormat == FDCAN_FRAME_FD_BRS) + { + FDCANx->DBTP = ( ((FDCAN_InitParam->DataSyncJumpWidth - 1UL) << FDCAN_DBTP_DSJW_OFFSET) \ + | ((FDCAN_InitParam->DataTimeSeg1 - 1UL) << FDCAN_DBTP_DTSEG1_OFFSET) \ + | ((FDCAN_InitParam->DataTimeSeg2 - 1UL) << FDCAN_DBTP_DTSEG2_OFFSET) \ + | ((FDCAN_InitParam->DataPrescaler - 1UL) << FDCAN_DBTP_DBRP_OFFSET) ); + } + + /* Select between Tx FIFO and Tx Queue operation modes */ + tempReg = FDCANx->TXBC & (~FDCAN_TXBC_TFQM); + + if (FDCAN_InitParam->TxFifoQueueSize > 0UL) + { + tempReg |= FDCAN_InitParam->TxFifoQueueMode; + } + + FDCANx->TXBC = tempReg; + + /* Configure Tx element size */ + if ((FDCAN_InitParam->TxBufferSize + FDCAN_InitParam->TxFifoQueueSize) > 0UL) + { + FDCANx->TXESC = (uint32_t)(SizeToReg[FDCAN_InitParam->TxBufferDataSize]); + } + else + { + FDCANx->TXESC = 0; + } + + tempReg = 0; + + /* Configure Rx FIFO 0 element size */ + if (FDCAN_InitParam->RxFifo0Size > 0U) + { + tempReg |= (uint32_t)(SizeToReg[FDCAN_InitParam->RxFifo0DataSize]) << FDCAN_RXESC_F0DS_OFFSET; + } + + /* Configure Rx FIFO 1 element size */ + if (FDCAN_InitParam->RxFifo1Size > 0U) + { + tempReg |= (uint32_t)(SizeToReg[FDCAN_InitParam->RxFifo1DataSize]) << FDCAN_RXESC_F1DS_OFFSET; + } + + /* Configure Rx buffer element size */ + if (FDCAN_InitParam->RxBufferSize > 0U) + { + tempReg |= (uint32_t)(SizeToReg[FDCAN_InitParam->RxBufferDataSize]) << FDCAN_RXESC_RBDS_OFFSET; + } + + FDCANx->RXESC = tempReg; + + /* By default operation mode is set to Event-driven communication. + If Time-triggered communication is needed, user should call the + FDCAN_TT_Init function just after the FDCAN_Init */ + if (FDCAN_Get_Index(FDCANx) <= 4) + { + FDCANx->TTOCF &= ~FDCAN_TTOCF_OM; + } + + /* Calculate each RAM block address and Return function status */ + return (FDCAN_InitMsgRam(FDCANx, FDCAN_InitParam)); +} + +/** + *\*\name FDCAN_EnterSleep. + *\*\fun Enter sleep mode. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_EnterSleep(FDCAN_Module *FDCANx) +{ + uint32_t timeout; + + /* Request clock stop */ + FDCANx->CCCR |= FDCAN_CCCR_CSR; + + timeout = 0; + + /* Wait until FDCAN is ready for power down */ + while ((FDCANx->CCCR & FDCAN_CCCR_CSA) == 0U) + { + if (timeout > FDCAN_TIMEOUT_VALUE) + { + return ERROR; + } + + timeout++; + } + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_ExitSleep. + *\*\fun Exit sleep mode + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_ExitSleep(FDCAN_Module *FDCANx) +{ + uint32_t timeout; + + /* Reset clock stop request */ + FDCANx->CCCR &= ~FDCAN_CCCR_CSR; + + timeout = 0; + + /* Wait until FDCAN exits sleep mode */ + while ((FDCANx->CCCR & FDCAN_CCCR_CSA) == FDCAN_CCCR_CSA) + { + if (timeout > FDCAN_TIMEOUT_VALUE) + { + return ERROR; + } + + timeout++; + } + + /* Enter normal operation */ + FDCANx->CCCR &= ~FDCAN_CCCR_INIT; + + timeout = 0; + + /* Wait until FDCAN exits sleep mode */ + while ((FDCANx->CCCR & FDCAN_CCCR_INIT) == FDCAN_CCCR_INIT) + { + if (timeout > FDCAN_TIMEOUT_COUNT) + { + return ERROR; + } + + timeout++; + } + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_ConfigFilter. + *\*\fun Configure the FDCAN reception filter according to the specified + *\*\ parameters in the FDCAN_FilterType structure. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param sFilterConfig pointer to an FDCAN_FilterTypeDef structure + *\*\ - IdType + *\*\ - FDCAN_STANDARD_ID + *\*\ - FDCAN_EXTENDED_ID + *\*\ - FilterIndex + *\*\ This parameter must be a value between: + *\*\ - 0 and 127, if IdType is FDCAN_STANDARD_ID + *\*\ - 0 and 63, if IdType is FDCAN_EXTENDED_ID + *\*\ - FilterType + *\*\ - FDCAN_FILTER_RANGE + *\*\ - FDCAN_FILTER_DUAL + *\*\ - FDCAN_FILTER_MASK + *\*\ - FDCAN_FILTER_RANGE_NO_EIDM + *\*\ - FilterConfig + *\*\ -FDCAN_FILTER_DISABLE + *\*\ -FDCAN_FILTER_TO_RXFIFO0 + *\*\ -FDCAN_FILTER_TO_RXFIFO1 + *\*\ -FDCAN_FILTER_REJECT + *\*\ -FDCAN_FILTER_HP + *\*\ -FDCAN_FILTER_TO_RXFIFO0_HP + *\*\ -FDCAN_FILTER_TO_RXFIFO1_HP + *\*\ -FDCAN_FILTER_TO_RXBUFFER + *\*\ - FilterID1 + *\*\ This parameter must be a value between: + *\*\ - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + *\*\ - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID + *\*\ - FilterID2 + *\*\ This parameter must be a value between: + *\*\ - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + *\*\ - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID + *\*\ This parameter is ignored if FilterConfig is set to FDCAN_FILTER_TO_RXBUFFER + *\*\ - RxBufferIndex + *\*\ This parameter must be a value between 0 and 63. + *\*\ And it is ignored if FilterConfig is not FDCAN_FILTER_TO_RXBUFFER + *\*\return none + */ +void FDCAN_ConfigFilter(FDCAN_Module *FDCANx, FDCAN_FilterType *sFilterConfig) +{ + uint32_t *FilterAddress; + FDCAN_MsgRamType *pMsg; + + pMsg = pMsgRam[FDCAN_Get_Index(FDCANx)]; + + if (sFilterConfig->IdType == FDCAN_STANDARD_ID) + { + /* Calculate filter address */ + FilterAddress = (uint32_t *)(pMsg->StdFilterStrAddr + (sFilterConfig->FilterIndex * 4UL)); + + /* Build filter element */ + if (sFilterConfig->FilterConfig == FDCAN_FILTER_TO_RXBUFFER) + { + *FilterAddress = ( (sFilterConfig->FilterType) | + (sFilterConfig->FilterConfig << FDCAN_ELEMENT_SFEC_OFFSET) | + (sFilterConfig->FilterID1 << FDCAN_ELEMENT_ID1_OFFSET) | + sFilterConfig->RxBufferIndex ); + } + else + { + *FilterAddress = ( (sFilterConfig->FilterType ) | + (sFilterConfig->FilterConfig << FDCAN_ELEMENT_SFEC_OFFSET) | + (sFilterConfig->FilterID1 << FDCAN_ELEMENT_ID1_OFFSET) | + sFilterConfig->FilterID2 ); + } + } + else /* sFilterConfig->IdType == FDCAN_EXTENDED_ID */ + { + /* Calculate filter address */ + FilterAddress = (uint32_t *)(pMsg->ExtFilterStrAddr + (sFilterConfig->FilterIndex * FDCAN_EXT_FILTER_WORDS * 4UL)); + + /* Build first word of filter element */ + *FilterAddress = ((sFilterConfig->FilterConfig << FDCAN_ELEMENT_EFEC_OFFSET) | sFilterConfig->FilterID1); + + /* Increment FilterAddress pointer to second word of filter element */ + FilterAddress++; + + /* Build second word of filter element */ + if (sFilterConfig->FilterConfig == FDCAN_FILTER_TO_RXBUFFER) + { + *FilterAddress = (sFilterConfig->FilterType | sFilterConfig->RxBufferIndex); + } + else + { + *FilterAddress = (sFilterConfig->FilterType | sFilterConfig->FilterID2); + } + } +} + +/** + *\*\name FDCAN_ConfigGlobalFilter. + *\*\fun Configure the FDCAN global filter. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param NonMatchingStd : + *\*\ - FDCAN_ACCEPT_STD_IN_RX_FIFO0 + *\*\ - FDCAN_ACCEPT_STD_IN_RX_FIFO1 + *\*\ - FDCAN_REJECT_STD + *\*\param NonMatchingExt : + *\*\ - FDCAN_ACCEPT_EXT_IN_RX_FIFO0 + *\*\ - FDCAN_ACCEPT_EXT_IN_RX_FIFO1 + *\*\ - FDCAN_REJECT_EXT + *\*\param RejectRemoteStd : + *\*\ - FDCAN_FILTER_STD_REMOTE + *\*\ - FDCAN_REJECT_STD_REMOTE + *\*\param RejectRemoteExt : + *\*\ - FDCAN_FILTER_EXT_REMOTE + *\*\ - FDCAN_REJECT_EXT_REMOTE + *\*\return + */ +void FDCAN_ConfigGlobalFilter(FDCAN_Module *FDCANx, + uint32_t NonMatchingStd, + uint32_t NonMatchingExt, + uint32_t RejectRemoteStd, + uint32_t RejectRemoteExt) +{ + /* Configure global filter */ + FDCANx->GFC = NonMatchingStd | NonMatchingExt | RejectRemoteStd | RejectRemoteExt; +} + +/** + *\*\name FDCAN_ConfigExtIdMask. + *\*\fun CConfigure the extended ID mask. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Mask :Extended ID Mask. + *\*\ This parameter must be a number between 0 and 0x1FFFFFFF + *\*\return none + */ +void FDCAN_ConfigExtIdMask(FDCAN_Module *FDCANx, uint32_t Mask) +{ + FDCANx->XIDAM = Mask; +} + +/** + *\*\name FDCAN_ConfigRxFifoMode. + *\*\fun Configure the Rx FIFO operation mode. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param RxFifo + *\*\ - FDCAN_RX_FIFO0 + *\*\ - FDCAN_RX_FIFO1 + *\*\param Mode + *\*\ - FDCAN_RX_FIFO_BLOCKING + *\*\ - FDCAN_RX_FIFO_OVERWRITE + *\*\return none + */ +void FDCAN_ConfigRxFifoMode(FDCAN_Module *FDCANx, uint32_t RxFifo, uint32_t Mode) +{ + __IO uint32_t *pReg; + + if (RxFifo == FDCAN_RX_FIFO0) + { + /* Select FIFO 0 Operation Mode */ + pReg = &(FDCANx->RXF0C); + } + else /* RxFifo == FDCAN_RX_FIFO1 */ + { + /* Select FIFO 1 Operation Mode */ + pReg = &(FDCANx->RXF1C); + } + + if(Mode == FDCAN_RX_FIFO_OVERWRITE) + { + *pReg |= FDCAN_RX_FIFO_OVERWRITE; + } + else /* Mode == FDCAN_RX_FIFO_BLOCKING */ + { + *pReg &= ~FDCAN_RX_FIFO_OVERWRITE; + } +} + +/** + *\*\name FDCAN_ConfigFifoWatermark. + *\*\fun Configure the Tx/RX FIFO watermark. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param FIFO + *\*\ - FDCAN_RX_FIFO0 + *\*\ - FDCAN_RX_FIFO1 + *\*\ - FDCAN_TX_EVENT_FIFO + *\*\param Watermark level for FIFO watermark interrupt. + *\*\ This parameter must be a number between: + *\*\ - 0 and 32, if FIFO is FDCAN_TX_EVENT_FIFO + *\*\ - 0 and 64, if FIFO is FDCAN_RX_FIFO0 or FDCAN_RX_FIFO1 + *\*\return none + */ +void FDCAN_ConfigFifoWatermark(FDCAN_Module *FDCANx, uint32_t FIFO, uint32_t Watermark) +{ + __IO uint32_t *pReg; + uint32_t tempReg; + + /* Set the level for FIFO watermark interrupt */ + if (FIFO == FDCAN_TX_EVENT_FIFO) + { + pReg = &(FDCANx->TXEFC); + tempReg = *pReg & (~FDCAN_TXEFC_EFWM); + } + else if (FIFO == FDCAN_RX_FIFO0) + { + pReg = &(FDCANx->RXF0C); + tempReg = *pReg & (~FDCAN_RXF0C_F0WM); + } + else /* FIFO == FDCAN_RX_FIFO1 */ + { + pReg = &(FDCANx->RXF1C); + tempReg = *pReg & (~FDCAN_RXF1C_F1WM); + } + + tempReg |= Watermark << FDCAN_RXFXC_FXWM_OFFSET; + *pReg = tempReg; +} + +/** + *\*\name FDCAN_ConfigRamWatchdog. + *\*\fun Configure the RAM watchdog. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Value Start value of the Message RAM Watchdog Counter. + *\*\ This parameter must be a number between 0x00 and 0xFF + *\*\return none + */ +void FDCAN_ConfigRamWatchdog(FDCAN_Module *FDCANx, uint32_t Value) +{ + uint32_t tempReg; + + /* Configure the RAM watchdog counter start value */ + tempReg = FDCANx->RWD & (~FDCAN_RWD_WDC); + tempReg |= Value; + FDCANx->RWD = tempReg; +} + +/** + *\*\name FDCAN_ConfigTSPrescaler. + *\*\fun Configure the timestamp counter Prescaler. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Prescaler + *\*\ - FDCAN_TIMESTAMP_PRESC_1 + *\*\ - FDCAN_TIMESTAMP_PRESC_2 + *\*\ - FDCAN_TIMESTAMP_PRESC_3 + *\*\ - FDCAN_TIMESTAMP_PRESC_4 + *\*\ - FDCAN_TIMESTAMP_PRESC_5 + *\*\ - FDCAN_TIMESTAMP_PRESC_6 + *\*\ - FDCAN_TIMESTAMP_PRESC_7 + *\*\ - FDCAN_TIMESTAMP_PRESC_8 + *\*\ - FDCAN_TIMESTAMP_PRESC_9 + *\*\ - FDCAN_TIMESTAMP_PRESC_10 + *\*\ - FDCAN_TIMESTAMP_PRESC_11 + *\*\ - FDCAN_TIMESTAMP_PRESC_12 + *\*\ - FDCAN_TIMESTAMP_PRESC_13 + *\*\ - FDCAN_TIMESTAMP_PRESC_14 + *\*\ - FDCAN_TIMESTAMP_PRESC_15 + *\*\ - FDCAN_TIMESTAMP_PRESC_16 + *\*\return none + */ +void FDCAN_ConfigTSPrescaler(FDCAN_Module *FDCANx, uint32_t Prescaler) +{ + uint32_t tempReg; + + tempReg = FDCANx->TSCC & (~FDCAN_TSCC_TCP); + tempReg |= Prescaler; + FDCANx->TSCC = tempReg; +} + +/** + *\*\name FDCAN_Config_TS. + *\*\fun Config the timestamp mode. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Select + *\*\ - FDCAN_TIMESTAMP_DISABLE + *\*\ - FDCAN_TIMESTAMP_INTERNAL + *\*\ - FDCAN_TIMESTAMP_EXTERNAL + *\*\return none + */ +void FDCAN_Config_TS(FDCAN_Module *FDCANx, uint32_t Select) +{ + uint32_t tempReg; + + tempReg = FDCANx->TSCC & (~FDCAN_TSCC_TSS); + tempReg |= Select; + FDCANx->TSCC = tempReg; +} + +/** + *\*\name FDCAN_Get_TS. + *\*\fun Get the timestamp counter value. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return Value Timestamp counter value + */ +uint16_t FDCAN_Get_TS(FDCAN_Module *FDCANx) +{ + return (uint16_t)(FDCANx->TSCV); +} + +/** + *\*\name FDCAN_Reset_TS. + *\*\fun Reset the internal timestamp counter to zero. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_Reset_TS(FDCAN_Module *FDCANx) +{ + if ((FDCANx->TSCC & FDCAN_TSCC_TSS) != FDCAN_TIMESTAMP_EXTERNAL) + { + /* Reset timestamp counter. + Actually any write operation to TSCV clears the counter */ + FDCANx->TSCV = 0; + } +} + +/** + *\*\name FDCAN_ConfigTimeoutCounter. + *\*\fun Configure the timeout counter. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param TimeoutSelect : + *\*\ - FDCAN_TIMEOUT_CONTINUOUS + *\*\ - FDCAN_TIMEOUT_TX_EVENT_FIFO + *\*\ - FDCAN_TIMEOUT_RX_FIFO0 + *\*\ - FDCAN_TIMEOUT_RX_FIFO1 + *\*\param TimeoutPeriod :Start value of the timeout down-counter. + *\*\ This parameter must be a number between 0x0000 and 0xFFFF + *\*\return none + */ +void FDCAN_ConfigTimeoutCounter(FDCAN_Module *FDCANx, uint32_t TimeoutSelect, uint32_t TimeoutPeriod) +{ + uint32_t tempReg; + + tempReg = FDCANx->TOCC & (~(FDCAN_TOCC_TOS | FDCAN_TOCC_TOP)); + tempReg |= TimeoutSelect; + tempReg |= TimeoutPeriod << FDCAN_TOCC_TOP_OFFSET; + FDCANx->TOCC = tempReg; +} + +/** + *\*\name FDCAN_EnableTimeoutCounter. + *\*\fun Enable the timeout counter. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_EnableTimeoutCounter(FDCAN_Module *FDCANx) +{ + /* Enable timeout counter */ + FDCANx->TOCC |= FDCAN_TOCC_ETOC; +} + +/** + *\*\name FDCAN_DisableTimeoutCounter. + *\*\fun Disable the timeout counter. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_DisableTimeoutCounter(FDCAN_Module *FDCANx) +{ + /* Enable timeout counter */ + FDCANx->TOCC &= ~FDCAN_TOCC_ETOC; +} + +/** + *\*\name FDCAN_GetTimeoutCounter. + *\*\fun Get the timeout counter value. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return Timeout counter value + */ +uint16_t FDCAN_GetTimeoutCounter(FDCAN_Module *FDCANx) +{ + return (uint16_t)(FDCANx->TOCV); +} + +/** + *\*\name FDCAN_ResetTimeoutCounter. + *\*\fun Reset the timeout counter to its start value. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_ResetTimeoutCounter(FDCAN_Module *FDCANx) +{ + FDCANx->TOCV = 0; +} + +/** + *\*\name FDCAN_ConfigTxDelayCompensation. + *\*\fun Configure the transmitter delay compensation. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Offset :Transmitter Delay Compensation Offset. + *\*\ This parameter must be a number between 0x00 and 0x7F. + *\*\param Filter :Transmitter Delay Compensation Filter Window Length. + *\*\ This parameter must be a number between 0x00 and 0x7F. + *\*\return none + */ +void FDCAN_ConfigTxDelayCompensation(FDCAN_Module *FDCANx, uint32_t Offset, uint32_t Filter) +{ + uint32_t tempReg; + + tempReg = FDCANx->TDCR & (~(FDCAN_TDCR_TDCO | FDCAN_TDCR_TDCF)); + tempReg |= Offset << FDCAN_TDCR_TDCO_OFFSET; + tempReg |= Filter; + FDCANx->TDCR = tempReg; +} + +/** + *\*\name FDCAN_EnableTxDelayCompensation. + *\*\fun Enable the transmitter delay compensation. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_EnableTxDelayCompensation(FDCAN_Module *FDCANx) +{ + FDCANx->DBTP |= FDCAN_DBTP_TDC; +} + +/** + *\*\name FDCAN_DisableTxDelayCompensation. + *\*\fun Disable the transmitter delay compensation. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_DisableTxDelayCompensation(FDCAN_Module *FDCANx) +{ + FDCANx->DBTP &= ~FDCAN_DBTP_TDC; +} + +/** + *\*\name FDCAN_EnableISOMode. + *\*\fun Enable ISO 11898-1 protocol mode. + *\*\ CAN FD frame format is according to ISO 11898-1 standard. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_EnableISOMode(FDCAN_Module *FDCANx) +{ + /* Disable Non ISO protocol mode */ + FDCANx->CCCR &= ~FDCAN_CCCR_NISO; +} + +/** + *\*\name FDCAN_DisableISOMode. + *\*\fun Disable ISO 11898-1 protocol mode. + *\*\ CAN FD frame format is according to Bosch CAN FD specification V1.0. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_DisableISOMode(FDCAN_Module *FDCANx) +{ + /* Enable Non ISO protocol mode */ + FDCANx->CCCR |= FDCAN_CCCR_NISO; +} + +/** + *\*\name FDCAN_EnableEdgeFilter. + *\*\fun Enable edge filtering during bus integration. + *\*\ Two consecutive dominant tq are required to detect an edge for hard synchronization. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_EnableEdgeFilter(FDCAN_Module *FDCANx) +{ + /* Enable edge filtering */ + FDCANx->CCCR |= FDCAN_CCCR_EFBI; +} + +/** + *\*\name FDCAN_DisableEdgeFilter. + *\*\fun Disable edge filtering during bus integration. + *\*\ One dominant tq is required to detect an edge for hard synchronization. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_DisableEdgeFilter(FDCAN_Module *FDCANx) +{ + /* Disable edge filtering */ + FDCANx->CCCR &= ~FDCAN_CCCR_EFBI; +} + +/** + *\*\name FDCAN_Start. + *\*\fun Start the FDCAN module. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_Start(FDCAN_Module *FDCANx) +{ + /* Request leave initialisation */ + FDCANx->CCCR &= ~FDCAN_CCCR_INIT; +} + +/** + *\*\name FDCAN_Stop. + *\*\fun Stop the FDCAN module and enable access to configuration registers. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_Stop(FDCAN_Module *FDCANx) +{ + uint32_t timeout; + FDCAN_MsgRamType *pMsg; + + pMsg = pMsgRam[FDCAN_Get_Index(FDCANx)]; + + /* Request initialisation */ + FDCANx->CCCR |= FDCAN_CCCR_INIT; + + /* Wait until the INIT bit into CCCR register is set */ + timeout = 0; + + while ((FDCANx->CCCR & FDCAN_CCCR_INIT) == 0U) + { + if (timeout > FDCAN_TIMEOUT_COUNT) + { + return ERROR; + } + + timeout++; + } + + /* Exit from Sleep mode */ + FDCANx->CCCR &= ~FDCAN_CCCR_CSR; + + timeout = 0; + + /* Wait until FDCAN exits sleep mode */ + while ((FDCANx->CCCR & FDCAN_CCCR_CSA) == FDCAN_CCCR_CSA) + { + if (timeout > FDCAN_TIMEOUT_COUNT) + { + return ERROR; + } + + timeout++; + } + + /* Enable configuration change */ + FDCANx->CCCR |= FDCAN_CCCR_CCE; + + /* Reset Latest Tx FIFO/Queue Request Buffer Index */ + pMsg->LastTxFifoQReqBuf = 0; + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_AddMsgToTxFifoQ. + *\*\fun Add a message to the Tx FIFO/Queue and activate the corresponding transmission request + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param pTxHeader :pointer to a FDCAN_TxHeaderType structure. + *\*\ - IdType + *\*\ - FDCAN_STANDARD_ID + *\*\ - FDCAN_EXTENDED_ID + *\*\ - ID + *\*\ This parameter must be a value between: + *\*\ - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + *\*\ - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID + *\*\ - TxFrameType + *\*\ - FDCAN_DATA_FRAME + *\*\ - FDCAN_REMOTE_FRAME + *\*\ - DataLength + *\*\ - FDCAN_DLC_BYTES_0 + *\*\ - FDCAN_DLC_BYTES_1 + *\*\ - FDCAN_DLC_BYTES_2 + *\*\ - FDCAN_DLC_BYTES_3 + *\*\ - FDCAN_DLC_BYTES_4 + *\*\ - FDCAN_DLC_BYTES_5 + *\*\ - FDCAN_DLC_BYTES_6 + *\*\ - FDCAN_DLC_BYTES_7 + *\*\ - FDCAN_DLC_BYTES_8 + *\*\ - FDCAN_DLC_BYTES_12 + *\*\ - FDCAN_DLC_BYTES_16 + *\*\ - FDCAN_DLC_BYTES_20 + *\*\ - FDCAN_DLC_BYTES_24 + *\*\ - FDCAN_DLC_BYTES_32 + *\*\ - FDCAN_DLC_BYTES_48 + *\*\ - FDCAN_DLC_BYTES_64 + *\*\ - ErrorState + *\*\ - FDCAN_ESI_ACTIVE + *\*\ - FDCAN_ESI_PASSIVE + *\*\ - BitRateSwitch + *\*\ - FDCAN_BRS_OFF + *\*\ - FDCAN_BRS_ON + *\*\ - FDFormat + *\*\ - FDCAN_CLASSIC_CAN + *\*\ - FDCAN_FD_CAN + *\*\ - TxEventFifo + *\*\ - FDCAN_NO_TX_EVENTS + *\*\ - FDCAN_STORE_TX_EVENTS + *\*\ - MsgMarker + *\*\ This parameter must be a value between 0 and 0xFF + *\*\param pTxData :pointer to a buffer containing the payload of the Tx frame. + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_AddMsgToTxFifoQ(FDCAN_Module *FDCANx, FDCAN_TxHeaderType *pTxHeader, uint8_t *pTxData) +{ + uint32_t PutIndex; + FDCAN_MsgRamType *pMsg; + + pMsg = pMsgRam[FDCAN_Get_Index(FDCANx)]; + + /* Check that the Tx FIFO/Queue has an allocated area into the RAM */ + if ((FDCANx->TXBC & FDCAN_TXBC_TFQS) == 0U) + { + return ERROR; + } + + /* Check that the Tx FIFO/Queue is not full */ + if ((FDCANx->TXFQS & FDCAN_TXFQS_TFQF) != 0U) + { + return ERROR; + } + + /* Get the Tx FIFO PutIndex */ + PutIndex = ((FDCANx->TXFQS & FDCAN_TXFQS_TFQPI) >> FDCAN_TXFQS_TFQPI_OFFSET); + + /* Add the message to the Tx FIFO/Queue */ + FDCAN_CopyMsgToRAM(FDCANx, pTxHeader, pTxData, PutIndex); + + /* Activate the corresponding transmission request */ + FDCANx->TXBAR = (0x1UL << PutIndex); + + /* Store the Latest Tx FIFO/Queue Request Buffer Index */ + pMsg->LastTxFifoQReqBuf = (0x1UL << PutIndex); + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_AddMsgToTxBuffer. + *\*\fun Add a message to a dedicated Tx buffer + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param pTxHeader :pointer to a FDCAN_TxHeaderType structure. + *\*\ - IdType + *\*\ - FDCAN_STANDARD_ID + *\*\ - FDCAN_EXTENDED_ID + *\*\ - ID + *\*\ This parameter must be a value between: + *\*\ - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + *\*\ - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID + *\*\ - TxFrameType + *\*\ - FDCAN_DATA_FRAME + *\*\ - FDCAN_REMOTE_FRAME + *\*\ - DataLength + *\*\ - FDCAN_DLC_BYTES_0 + *\*\ - FDCAN_DLC_BYTES_1 + *\*\ - FDCAN_DLC_BYTES_2 + *\*\ - FDCAN_DLC_BYTES_3 + *\*\ - FDCAN_DLC_BYTES_4 + *\*\ - FDCAN_DLC_BYTES_5 + *\*\ - FDCAN_DLC_BYTES_6 + *\*\ - FDCAN_DLC_BYTES_7 + *\*\ - FDCAN_DLC_BYTES_8 + *\*\ - FDCAN_DLC_BYTES_12 + *\*\ - FDCAN_DLC_BYTES_16 + *\*\ - FDCAN_DLC_BYTES_20 + *\*\ - FDCAN_DLC_BYTES_24 + *\*\ - FDCAN_DLC_BYTES_32 + *\*\ - FDCAN_DLC_BYTES_48 + *\*\ - FDCAN_DLC_BYTES_64 + *\*\ - ErrorState + *\*\ - FDCAN_ESI_ACTIVE + *\*\ - FDCAN_ESI_PASSIVE + *\*\ - BitRateSwitch + *\*\ - FDCAN_BRS_OFF + *\*\ - FDCAN_BRS_ON + *\*\ - FDFormat + *\*\ - FDCAN_CLASSIC_CAN + *\*\ - FDCAN_FD_CAN + *\*\ - TxEventFifo + *\*\ - FDCAN_NO_TX_EVENTS + *\*\ - FDCAN_STORE_TX_EVENTS + *\*\ - MsgMarker + *\*\ This parameter must be a value between 0 and 0xFF + *\*\param pTxData :pointer to a buffer containing the payload of the Tx frame. + *\*\param BufferIndex : + *\*\ - FDCAN_TX_BUFFER0 + *\*\ - FDCAN_TX_BUFFER1 + *\*\ - FDCAN_TX_BUFFER2 + *\*\ - FDCAN_TX_BUFFER3 + *\*\ - FDCAN_TX_BUFFER4 + *\*\ - FDCAN_TX_BUFFER5 + *\*\ - FDCAN_TX_BUFFER6 + *\*\ - FDCAN_TX_BUFFER7 + *\*\ - FDCAN_TX_BUFFER8 + *\*\ - FDCAN_TX_BUFFER9 + *\*\ - FDCAN_TX_BUFFER10 + *\*\ - FDCAN_TX_BUFFER11 + *\*\ - FDCAN_TX_BUFFER12 + *\*\ - FDCAN_TX_BUFFER13 + *\*\ - FDCAN_TX_BUFFER14 + *\*\ - FDCAN_TX_BUFFER15 + *\*\ - FDCAN_TX_BUFFER16 + *\*\ - FDCAN_TX_BUFFER17 + *\*\ - FDCAN_TX_BUFFER18 + *\*\ - FDCAN_TX_BUFFER19 + *\*\ - FDCAN_TX_BUFFER20 + *\*\ - FDCAN_TX_BUFFER21 + *\*\ - FDCAN_TX_BUFFER22 + *\*\ - FDCAN_TX_BUFFER23 + *\*\ - FDCAN_TX_BUFFER24 + *\*\ - FDCAN_TX_BUFFER25 + *\*\ - FDCAN_TX_BUFFER26 + *\*\ - FDCAN_TX_BUFFER27 + *\*\ - FDCAN_TX_BUFFER28 + *\*\ - FDCAN_TX_BUFFER29 + *\*\ - FDCAN_TX_BUFFER30 + *\*\ - FDCAN_TX_BUFFER31 + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_AddMsgToTxBuffer(FDCAN_Module *FDCANx, FDCAN_TxHeaderType *pTxHeader, uint8_t *pTxData, uint32_t BufferIndex) +{ + /* Check that the selected buffer has an allocated area into the RAM */ + if (POSITION_VAL(BufferIndex) >= ((FDCANx->TXBC & FDCAN_TXBC_NDTB) >> FDCAN_TXBC_NDTB_OFFSET)) + { + return ERROR; + } + + /* Check if there is also transmission request pending for the selected buffer */ + if ((FDCANx->TXBRP & BufferIndex) != 0U) + { + return ERROR; + } + + /* Add the message to the Tx buffer */ + FDCAN_CopyMsgToRAM(FDCANx, pTxHeader, pTxData, POSITION_VAL(BufferIndex)); + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_EnableTxBufferRequest. + *\*\fun Enable transmission request. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param BufferIndex : + *\*\ - FDCAN_TX_BUFFER0 + *\*\ - FDCAN_TX_BUFFER1 + *\*\ - FDCAN_TX_BUFFER2 + *\*\ - FDCAN_TX_BUFFER3 + *\*\ - FDCAN_TX_BUFFER4 + *\*\ - FDCAN_TX_BUFFER5 + *\*\ - FDCAN_TX_BUFFER6 + *\*\ - FDCAN_TX_BUFFER7 + *\*\ - FDCAN_TX_BUFFER8 + *\*\ - FDCAN_TX_BUFFER9 + *\*\ - FDCAN_TX_BUFFER10 + *\*\ - FDCAN_TX_BUFFER11 + *\*\ - FDCAN_TX_BUFFER12 + *\*\ - FDCAN_TX_BUFFER13 + *\*\ - FDCAN_TX_BUFFER14 + *\*\ - FDCAN_TX_BUFFER15 + *\*\ - FDCAN_TX_BUFFER16 + *\*\ - FDCAN_TX_BUFFER17 + *\*\ - FDCAN_TX_BUFFER18 + *\*\ - FDCAN_TX_BUFFER19 + *\*\ - FDCAN_TX_BUFFER20 + *\*\ - FDCAN_TX_BUFFER21 + *\*\ - FDCAN_TX_BUFFER22 + *\*\ - FDCAN_TX_BUFFER23 + *\*\ - FDCAN_TX_BUFFER24 + *\*\ - FDCAN_TX_BUFFER25 + *\*\ - FDCAN_TX_BUFFER26 + *\*\ - FDCAN_TX_BUFFER27 + *\*\ - FDCAN_TX_BUFFER28 + *\*\ - FDCAN_TX_BUFFER29 + *\*\ - FDCAN_TX_BUFFER30 + *\*\ - FDCAN_TX_BUFFER31 + *\*\return none + */ +void FDCAN_EnableTxBufferRequest(FDCAN_Module *FDCANx, uint32_t BufferIndex) +{ + /* Add transmission request */ + FDCANx->TXBAR = BufferIndex; +} + +/** + *\*\name FDCAN_GetLastTxFifoQReqBuf. + *\*\fun Get Tx buffer index of latest Tx FIFO/Queue request. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return Tx buffer index of last Tx FIFO/Queue request + *\*\ - 0: no Tx FIFO/Queue request have been submitted + *\*\ - FDCAN_TX_BUFFER0 + *\*\ - FDCAN_TX_BUFFER1 + *\*\ - FDCAN_TX_BUFFER2 + *\*\ - FDCAN_TX_BUFFER3 + *\*\ - FDCAN_TX_BUFFER4 + *\*\ - FDCAN_TX_BUFFER5 + *\*\ - FDCAN_TX_BUFFER6 + *\*\ - FDCAN_TX_BUFFER7 + *\*\ - FDCAN_TX_BUFFER8 + *\*\ - FDCAN_TX_BUFFER9 + *\*\ - FDCAN_TX_BUFFER10 + *\*\ - FDCAN_TX_BUFFER11 + *\*\ - FDCAN_TX_BUFFER12 + *\*\ - FDCAN_TX_BUFFER13 + *\*\ - FDCAN_TX_BUFFER14 + *\*\ - FDCAN_TX_BUFFER15 + *\*\ - FDCAN_TX_BUFFER16 + *\*\ - FDCAN_TX_BUFFER17 + *\*\ - FDCAN_TX_BUFFER18 + *\*\ - FDCAN_TX_BUFFER19 + *\*\ - FDCAN_TX_BUFFER20 + *\*\ - FDCAN_TX_BUFFER21 + *\*\ - FDCAN_TX_BUFFER22 + *\*\ - FDCAN_TX_BUFFER23 + *\*\ - FDCAN_TX_BUFFER24 + *\*\ - FDCAN_TX_BUFFER25 + *\*\ - FDCAN_TX_BUFFER26 + *\*\ - FDCAN_TX_BUFFER27 + *\*\ - FDCAN_TX_BUFFER28 + *\*\ - FDCAN_TX_BUFFER29 + *\*\ - FDCAN_TX_BUFFER30 + *\*\ - FDCAN_TX_BUFFER31 + */ +uint32_t FDCAN_GetLastTxFifoQReqBuf(FDCAN_Module *FDCANx) +{ + FDCAN_MsgRamType *pMsg; + + pMsg = pMsgRam[FDCAN_Get_Index(FDCANx)]; + + /* Return Last Tx FIFO/Queue Request Buffer */ + return (pMsg->LastTxFifoQReqBuf); +} + +/** + *\*\name FDCAN_AbortTxRequest. + *\*\fun Abort transmission request. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param BufferIndex : + *\*\ - FDCAN_TX_BUFFER0 + *\*\ - FDCAN_TX_BUFFER1 + *\*\ - FDCAN_TX_BUFFER2 + *\*\ - FDCAN_TX_BUFFER3 + *\*\ - FDCAN_TX_BUFFER4 + *\*\ - FDCAN_TX_BUFFER5 + *\*\ - FDCAN_TX_BUFFER6 + *\*\ - FDCAN_TX_BUFFER7 + *\*\ - FDCAN_TX_BUFFER8 + *\*\ - FDCAN_TX_BUFFER9 + *\*\ - FDCAN_TX_BUFFER10 + *\*\ - FDCAN_TX_BUFFER11 + *\*\ - FDCAN_TX_BUFFER12 + *\*\ - FDCAN_TX_BUFFER13 + *\*\ - FDCAN_TX_BUFFER14 + *\*\ - FDCAN_TX_BUFFER15 + *\*\ - FDCAN_TX_BUFFER16 + *\*\ - FDCAN_TX_BUFFER17 + *\*\ - FDCAN_TX_BUFFER18 + *\*\ - FDCAN_TX_BUFFER19 + *\*\ - FDCAN_TX_BUFFER20 + *\*\ - FDCAN_TX_BUFFER21 + *\*\ - FDCAN_TX_BUFFER22 + *\*\ - FDCAN_TX_BUFFER23 + *\*\ - FDCAN_TX_BUFFER24 + *\*\ - FDCAN_TX_BUFFER25 + *\*\ - FDCAN_TX_BUFFER26 + *\*\ - FDCAN_TX_BUFFER27 + *\*\ - FDCAN_TX_BUFFER28 + *\*\ - FDCAN_TX_BUFFER29 + *\*\ - FDCAN_TX_BUFFER30 + *\*\ - FDCAN_TX_BUFFER31 + *\*\return none + */ +void FDCAN_AbortTxRequest(FDCAN_Module *FDCANx, uint32_t BufferIndex) +{ + /* Add cancellation request */ + FDCANx->TXBCR = BufferIndex; +} + +/** + *\*\name FDCAN_GetRxMsg. + *\*\fun Get an FDCAN frame from the Rx Buffer/FIFO zone into the message RAM. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param RxLocation : + *\*\ - FDCAN_RX_FIFO0 + *\*\ - FDCAN_RX_FIFO1 + *\*\ - FDCAN_RX_BUFFER0 + *\*\ - FDCAN_RX_BUFFER1 + *\*\ - FDCAN_RX_BUFFER2 + *\*\ - FDCAN_RX_BUFFER3 + *\*\ - FDCAN_RX_BUFFER4 + *\*\ - FDCAN_RX_BUFFER5 + *\*\ - FDCAN_RX_BUFFER6 + *\*\ - FDCAN_RX_BUFFER7 + *\*\ - FDCAN_RX_BUFFER8 + *\*\ - FDCAN_RX_BUFFER9 + *\*\ - FDCAN_RX_BUFFER10 + *\*\ - FDCAN_RX_BUFFER11 + *\*\ - FDCAN_RX_BUFFER12 + *\*\ - FDCAN_RX_BUFFER13 + *\*\ - FDCAN_RX_BUFFER14 + *\*\ - FDCAN_RX_BUFFER15 + *\*\ - FDCAN_RX_BUFFER16 + *\*\ - FDCAN_RX_BUFFER17 + *\*\ - FDCAN_RX_BUFFER18 + *\*\ - FDCAN_RX_BUFFER19 + *\*\ - FDCAN_RX_BUFFER20 + *\*\ - FDCAN_RX_BUFFER21 + *\*\ - FDCAN_RX_BUFFER22 + *\*\ - FDCAN_RX_BUFFER23 + *\*\ - FDCAN_RX_BUFFER24 + *\*\ - FDCAN_RX_BUFFER25 + *\*\ - FDCAN_RX_BUFFER26 + *\*\ - FDCAN_RX_BUFFER27 + *\*\ - FDCAN_RX_BUFFER28 + *\*\ - FDCAN_RX_BUFFER29 + *\*\ - FDCAN_RX_BUFFER30 + *\*\ - FDCAN_RX_BUFFER31 + *\*\ - FDCAN_RX_BUFFER32 + *\*\ - FDCAN_RX_BUFFER33 + *\*\ - FDCAN_RX_BUFFER34 + *\*\ - FDCAN_RX_BUFFER35 + *\*\ - FDCAN_RX_BUFFER36 + *\*\ - FDCAN_RX_BUFFER37 + *\*\ - FDCAN_RX_BUFFER38 + *\*\ - FDCAN_RX_BUFFER39 + *\*\ - FDCAN_RX_BUFFER40 + *\*\ - FDCAN_RX_BUFFER41 + *\*\ - FDCAN_RX_BUFFER42 + *\*\ - FDCAN_RX_BUFFER43 + *\*\ - FDCAN_RX_BUFFER44 + *\*\ - FDCAN_RX_BUFFER45 + *\*\ - FDCAN_RX_BUFFER46 + *\*\ - FDCAN_RX_BUFFER47 + *\*\ - FDCAN_RX_BUFFER48 + *\*\ - FDCAN_RX_BUFFER49 + *\*\ - FDCAN_RX_BUFFER50 + *\*\ - FDCAN_RX_BUFFER51 + *\*\ - FDCAN_RX_BUFFER52 + *\*\ - FDCAN_RX_BUFFER53 + *\*\ - FDCAN_RX_BUFFER54 + *\*\ - FDCAN_RX_BUFFER55 + *\*\ - FDCAN_RX_BUFFER56 + *\*\ - FDCAN_RX_BUFFER57 + *\*\ - FDCAN_RX_BUFFER58 + *\*\ - FDCAN_RX_BUFFER59 + *\*\ - FDCAN_RX_BUFFER60 + *\*\ - FDCAN_RX_BUFFER61 + *\*\ - FDCAN_RX_BUFFER62 + *\*\ - FDCAN_RX_BUFFER63 + *\*\param pRxHeader :pointer to a FDCAN_RxHeaderType structure. + *\*\ - IdType + *\*\ - FDCAN_STANDARD_ID + *\*\ - FDCAN_EXTENDED_ID + *\*\ - ID + *\*\ This parameter must be a value between: + *\*\ - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + *\*\ - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID + *\*\ - RxFrameType + *\*\ - FDCAN_DATA_FRAME + *\*\ - FDCAN_REMOTE_FRAME + *\*\ - DataLength + *\*\ - FDCAN_DLC_BYTES_0 + *\*\ - FDCAN_DLC_BYTES_1 + *\*\ - FDCAN_DLC_BYTES_2 + *\*\ - FDCAN_DLC_BYTES_3 + *\*\ - FDCAN_DLC_BYTES_4 + *\*\ - FDCAN_DLC_BYTES_5 + *\*\ - FDCAN_DLC_BYTES_6 + *\*\ - FDCAN_DLC_BYTES_7 + *\*\ - FDCAN_DLC_BYTES_8 + *\*\ - FDCAN_DLC_BYTES_12 + *\*\ - FDCAN_DLC_BYTES_16 + *\*\ - FDCAN_DLC_BYTES_20 + *\*\ - FDCAN_DLC_BYTES_24 + *\*\ - FDCAN_DLC_BYTES_32 + *\*\ - FDCAN_DLC_BYTES_48 + *\*\ - FDCAN_DLC_BYTES_64 + *\*\ - ErrorState + *\*\ - FDCAN_ESI_ACTIVE + *\*\ - FDCAN_ESI_PASSIVE + *\*\ - BitRateSwitch + *\*\ - FDCAN_BRS_OFF + *\*\ - FDCAN_BRS_ON + *\*\ - FDFormat + *\*\ - FDCAN_CLASSIC_CAN + *\*\ - FDCAN_FD_CAN + *\*\ - RxTimestamp + *\*\ This parameter must be a value between 0 and 0xFFFF + *\*\ - FilterIndex + *\*\ This parameter must be a value between: + *\*\ - 0 and 127, if IdType is FDCAN_STANDARD_ID + *\*\ - 0 and 63, if IdType is FDCAN_EXTENDED_ID + *\*\ - Matching + *\*\ - FDCAN_ACCEPT_MACHING_FIDX + *\*\ - FDCAN_ACCEPT_NON_MATCHING + *\*\param pRxData :pointer to a buffer containing the payload of the Rx frame. + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_GetRxMsg(FDCAN_Module *FDCANx, uint32_t RxLocation, FDCAN_RxHeaderType *pRxHeader, uint8_t *pRxData) +{ + uint32_t *RxAddress; + uint8_t *pData; + uint32_t Cnt; + uint32_t GetIndex; + FDCAN_MsgRamType *pMsg; + + pMsg = pMsgRam[FDCAN_Get_Index(FDCANx)]; + GetIndex = 0; + + if (RxLocation == FDCAN_RX_FIFO0) /* Rx element is assigned to the Rx FIFO 0 */ + { + /* Check that the Rx FIFO 0 has an allocated area into the RAM */ + if ((FDCANx->RXF0C & FDCAN_RXF0C_F0S) == 0UL) + { + return ERROR; + } + + /* Check that the Rx FIFO 0 is not empty */ + if ((FDCANx->RXF0S & FDCAN_RXF0S_F0FL) == 0UL) + { + return ERROR; + } + + /* Calculate Rx FIFO 0 element get index*/ + GetIndex = ((FDCANx->RXF0S & FDCAN_RXF0S_F0GI) >> FDCAN_RXFXS_FXGI_OFFSET); + + /* Check that the Rx FIFO 0 is full & overwrite mode is on*/ + if(FDCAN_RXF0S_F0F == (FDCANx->RXF0S & FDCAN_RXF0S_F0F)) + { + if(FDCAN_RX_FIFO_OVERWRITE == (FDCANx->RXF0C & FDCAN_RXF0C_F0OM)) + { + /* When overwrite status is on discard first message in FIFO */ + if(GetIndex >= (pMsg->RxFifo0Size - 1UL)) + { + GetIndex = 0; + } + else + { + GetIndex++; + } + } + } + + /* Calculate Rx FIFO 0 element address */ + RxAddress = (uint32_t *)(pMsg->RxFIFO0StrAddr + (GetIndex * pMsg->RxFifo0DataSize * 4UL)); + } + else if (RxLocation == FDCAN_RX_FIFO1) /* Rx element is assigned to the Rx FIFO 1 */ + { + /* Check that the Rx FIFO 1 has an allocated area into the RAM */ + if ((FDCANx->RXF1C & FDCAN_RXF1C_F1S) == 0U) + { + return ERROR; + } + + /* Check that the Rx FIFO 0 is not empty */ + if ((FDCANx->RXF1S & FDCAN_RXF1S_F1FL) == 0U) + { + return ERROR; + } + + /* Calculate Rx FIFO 1 element index*/ + GetIndex = ((FDCANx->RXF1S & FDCAN_RXF1S_F1GI) >> FDCAN_RXFXS_FXGI_OFFSET); + + /* Check that the Rx FIFO 1 is full & overwrite mode is on*/ + if(FDCAN_RXF1S_F1F == (FDCANx->RXF1S & FDCAN_RXF1S_F1F) ) + { + if(FDCAN_RX_FIFO_OVERWRITE == (FDCANx->RXF1C & FDCAN_RXF1C_F1OM)) + { + /* When overwrite status is on discard first message in FIFO */ + if(GetIndex >= (pMsg->RxFifo1Size - 1UL)) + { + GetIndex = 0; + } + else + { + GetIndex++; + } + } + } + + /* Calculate Rx FIFO 1 element address */ + RxAddress = (uint32_t *)(pMsg->RxFIFO1StrAddr + (GetIndex * pMsg->RxFifo1DataSize * 4UL)); + } + else /* Rx element is assigned to a dedicated Rx buffer */ + { + /* Check that the selected buffer has an allocated area into the RAM */ + if (RxLocation >= pMsg->RxBufferSize) + { + return ERROR; + } + + /* Calculate Rx buffer address */ + RxAddress = (uint32_t *)(pMsg->RxBufferStrAddr + (RxLocation * pMsg->RxBufferDataSize * 4U)); + } + + /* First word of Rx FIFO element */ + /* Retrieve IdType */ + pRxHeader->IdType = *RxAddress & FDCAN_ELEMENT_XTD; + + /* Retrieve Identifier */ + if (pRxHeader->IdType == FDCAN_STANDARD_ID) /* Standard ID element */ + { + pRxHeader->ID = ((*RxAddress & FDCAN_ELEMENT_STDID) >> FDCAN_ELEMENT_STDID_OFFSET); + } + else /* Extended ID element */ + { + pRxHeader->ID = (*RxAddress & FDCAN_ELEMENT_EXTID); + } + + /* Retrieve RxFrameType */ + pRxHeader->RxFrameType = (*RxAddress & FDCAN_ELEMENT_RTR); + + /* Retrieve ErrorStateIndicator */ + pRxHeader->ErrorState = (*RxAddress & FDCAN_ELEMENT_ESI); + + /* Increment RxAddress pointer to second word of Rx FIFO element */ + RxAddress++; + + /* Retrieve RxTimestamp */ + pRxHeader->RxTimestamp = (*RxAddress & FDCAN_ELEMENT_TS); + + /* Retrieve DataLength */ + pRxHeader->DataLength = (*RxAddress & FDCAN_ELEMENT_DLC); + + /* Retrieve BitRateSwitch */ + pRxHeader->BitRateSwitch = (*RxAddress & FDCAN_ELEMENT_BRS); + + /* Retrieve FDFormat */ + pRxHeader->FDFormat = (*RxAddress & FDCAN_ELEMENT_FDF); + + /* Retrieve FilterIndex */ + pRxHeader->FilterIndex = ((*RxAddress & FDCAN_ELEMENT_FIDX) >> FDCAN_ELEMENT_FIDX_OFFSET); + + /* Retrieve NonMatchingFrame */ + pRxHeader->Matching = (*RxAddress & FDCAN_ELEMENT_ANMF); + + /* Increment RxAddress pointer to payload of Rx FIFO element */ + RxAddress++; + + /* Retrieve Rx payload */ + pData = (uint8_t *)RxAddress; + + for (Cnt = 0; Cnt < DLCtoBytes[pRxHeader->DataLength >> FDCAN_ELEMENT_DLC_OFFSET]; Cnt++) + { + pRxData[Cnt] = pData[Cnt]; + } + + if (RxLocation == FDCAN_RX_FIFO0) /* Rx element is assigned to the Rx FIFO 0 */ + { + /* Acknowledge the Rx FIFO 0 that the oldest element is read so that it increments the GetIndex */ + FDCANx->RXF0A = GetIndex; + } + else if (RxLocation == FDCAN_RX_FIFO1) /* Rx element is assigned to the Rx FIFO 1 */ + { + /* Acknowledge the Rx FIFO 1 that the oldest element is read so that it increments the GetIndex */ + FDCANx->RXF1A = GetIndex; + } + else /* Rx element is assigned to a dedicated Rx buffer */ + { + /* Clear the New Data flag of the current Rx buffer */ + if (RxLocation < FDCAN_RX_BUFFER32) + { + FDCANx->NDAT1 = (1UL << RxLocation); + } + else /* FDCAN_RX_BUFFER32 <= RxLocation <= FDCAN_RX_BUFFER63 */ + { + FDCANx->NDAT2 = (1UL << (RxLocation & 0x1FUL)); + } + } + + return SUCCESS; +} + +/** + *\*\name FDCAN_GetTxEvent. + *\*\fun Get an FDCAN Tx event from the Tx Event FIFO zone into the message RAM. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param pTxEvent pointer to a FDCAN_TxEventFifoType structure. + *\*\ - IdType + *\*\ - FDCAN_STANDARD_ID + *\*\ - FDCAN_EXTENDED_ID + *\*\ - ID + *\*\ This parameter must be a value between: + *\*\ - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + *\*\ - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID + *\*\ - TxFrameType + *\*\ - FDCAN_DATA_FRAME + *\*\ - FDCAN_REMOTE_FRAME + *\*\ - DataLength + *\*\ - FDCAN_DLC_BYTES_0 + *\*\ - FDCAN_DLC_BYTES_1 + *\*\ - FDCAN_DLC_BYTES_2 + *\*\ - FDCAN_DLC_BYTES_3 + *\*\ - FDCAN_DLC_BYTES_4 + *\*\ - FDCAN_DLC_BYTES_5 + *\*\ - FDCAN_DLC_BYTES_6 + *\*\ - FDCAN_DLC_BYTES_7 + *\*\ - FDCAN_DLC_BYTES_8 + *\*\ - FDCAN_DLC_BYTES_12 + *\*\ - FDCAN_DLC_BYTES_16 + *\*\ - FDCAN_DLC_BYTES_20 + *\*\ - FDCAN_DLC_BYTES_24 + *\*\ - FDCAN_DLC_BYTES_32 + *\*\ - FDCAN_DLC_BYTES_48 + *\*\ - FDCAN_DLC_BYTES_64 + *\*\ - ErrorState + *\*\ - FDCAN_ESI_ACTIVE + *\*\ - FDCAN_ESI_PASSIVE + *\*\ - BitRateSwitch; + *\*\ - FDCAN_BRS_OFF + *\*\ - FDCAN_BRS_ON + *\*\ - FDFormat; + *\*\ - FDCAN_CLASSIC_CAN + *\*\ - FDCAN_FD_CAN + *\*\ - TxTimestamp; + *\*\ This parameter must be a value between 0 and 0xFFFF + *\*\ - MsgMarker; + *\*\ This parameter must be a value between 0 and 0xFF + *\*\ - EventType; + *\*\ - FDCAN_TX_EVENT + *\*\ - FDCAN_TX_IN_SPITE_OF_ABORT + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_GetTxEvent(FDCAN_Module *FDCANx, FDCAN_TxEventFifoType *pTxEvent) +{ + uint32_t *TxEventAddress; + uint32_t GetIndex; + FDCAN_MsgRamType *pMsg; + + pMsg = pMsgRam[FDCAN_Get_Index(FDCANx)]; + + /* Check that the Tx Event FIFO has an allocated area into the RAM */ + if ((FDCANx->TXEFC & FDCAN_TXEFC_EFS) == 0UL) + { + return ERROR; + } + + /* Check that the Tx event FIFO is not empty */ + if ((FDCANx->TXEFS & FDCAN_TXEFS_EFFL) == 0UL) + { + return ERROR; + } + + /* Calculate Tx event FIFO element address */ + GetIndex = ((FDCANx->TXEFS & FDCAN_TXEFS_EFGI) >> FDCAN_TXEFS_EFGI_OFFSET); + TxEventAddress = (uint32_t *)(pMsg->TxEventFIFOStrAddr + (GetIndex * FDCAN_TX_EVENT_FIFO_WORDS * 4UL)); + + /* First word of Tx Event FIFO element */ + /* Retrieve IdType */ + pTxEvent->IdType = *TxEventAddress & FDCAN_ELEMENT_XTD; + + /* Retrieve Identifier */ + if (pTxEvent->IdType == FDCAN_STANDARD_ID) /* Standard ID element */ + { + pTxEvent->ID = ((*TxEventAddress & FDCAN_ELEMENT_STDID) >> FDCAN_ELEMENT_STDID_OFFSET); + } + else /* Extended ID element */ + { + pTxEvent->ID = (*TxEventAddress & FDCAN_ELEMENT_EXTID); + } + + /* Retrieve TxFrameType */ + pTxEvent->TxFrameType = (*TxEventAddress & FDCAN_ELEMENT_RTR); + + /* Retrieve ErrorStateIndicator */ + pTxEvent->ErrorState = (*TxEventAddress & FDCAN_ELEMENT_ESI); + + /* Increment TxEventAddress pointer to second word of Tx Event FIFO element */ + TxEventAddress++; + + /* Retrieve TxTimestamp */ + pTxEvent->TxTimestamp = (*TxEventAddress & FDCAN_ELEMENT_TS); + + /* Retrieve DataLength */ + pTxEvent->DataLength = (*TxEventAddress & FDCAN_ELEMENT_DLC); + + /* Retrieve BitRateSwitch */ + pTxEvent->BitRateSwitch = (*TxEventAddress & FDCAN_ELEMENT_BRS); + + /* Retrieve FDFormat */ + pTxEvent->FDFormat = (*TxEventAddress & FDCAN_ELEMENT_FDF); + + /* Retrieve EventType */ + pTxEvent->EventType = (*TxEventAddress & FDCAN_ELEMENT_ET); + + /* Retrieve MessageMarker */ + pTxEvent->MsgMarker = ((*TxEventAddress & FDCAN_ELEMENT_MM) >> FDCAN_ELEMENT_MM_OFFSET); + + /* Acknowledge the Tx Event FIFO that the oldest element is read so that it increments the GetIndex */ + FDCANx->TXEFA = GetIndex; + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_GetHpMsgStatus. + *\*\fun Get high priority message status. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param HpMsgStatus pointer to an FDCAN_HpMsgStatus structure. + *\*\ - FilterList + *\*\ - FDCAN_HP_STANDARD_FILTER_LIST + *\*\ - FDCAN_HP_EXTENDED_FILTER_LIST + *\*\ - FilterIndex + *\*\ This parameter can be a value between: + *\*\ - 0 and 127, if FilterList is FDCAN_HP_STANDARD_FILTER_LIST + *\*\ - 0 and 63, if FilterList is FDCAN_HP_EXTENDED_FILTER_LIST + *\*\ - MsgStore + *\*\ - FDCAN_HP_STORAGE_NO_FIFO + *\*\ - FDCAN_HP_STORAGE_MSG_LOST + *\*\ - FDCAN_HP_STORAGE_RXFIFO0 + *\*\ - FDCAN_HP_STORAGE_RXFIFO1 + *\*\ - MsgIndex + *\*\ - FDCAN_HP_STORAGE_RXFIFO0 + *\*\ - FDCAN_HP_STORAGE_RXFIFO1 + *\*\return none + */ +void FDCAN_GetHpMsgStatus(FDCAN_Module *FDCANx, FDCAN_HpMsgStatus *HpMsgStatus) +{ + HpMsgStatus->FilterList = (FDCANx->HPMS & FDCAN_HPMS_FLST); + HpMsgStatus->FilterIndex = ((FDCANx->HPMS & FDCAN_HPMS_FIDX) >> FDCAN_HPMS_FIDX_OFFSET); + HpMsgStatus->MsgStore = (FDCANx->HPMS & FDCAN_HPMS_MSI); + HpMsgStatus->MsgIndex = (FDCANx->HPMS & FDCAN_HPMS_BIDX); +} + +/** + *\*\name FDCAN_GetProtocolStatus. + *\*\fun Get protocol status. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param ProtocolStatus pointer to an FDCAN_ProtocolStatus structure. + *\*\ - uint32_t LastError + *\*\ - FDCAN_LAST_ERROR_NONE + *\*\ - FDCAN_LAST_ERROR_STUFF + *\*\ - FDCAN_LAST_ERROR_FORM + *\*\ - FDCAN_LAST_ERROR_ACK + *\*\ - FDCAN_LAST_ERROR_BIT1 + *\*\ - FDCAN_LAST_ERROR_BIT0 + *\*\ - FDCAN_LAST_ERROR_CRC + *\*\ - FDCAN_LAST_ERROR_NO_CHANGE + *\*\ - uint32_t LastDataError + *\*\ - FDCAN_LAST_DATA_ERROR_NONE + *\*\ - FDCAN_LAST_DATA_ERROR_STUFF + *\*\ - FDCAN_LAST_DATA_ERROR_FORM + *\*\ - FDCAN_LAST_DATA_ERROR_ACK + *\*\ - FDCAN_LAST_DATA_ERROR_BIT1 + *\*\ - FDCAN_LAST_DATA_ERROR_BIT0 + *\*\ - FDCAN_LAST_DATA_ERROR_CRC + *\*\ - FDCAN_LAST_DATA_ERROR_NO_CHANGE + *\*\ - uint32_t Activity + *\*\ - FDCAN_COM_STATE_SYNC + *\*\ - FDCAN_COM_STATE_IDLE + *\*\ - FDCAN_COM_STATE_RX + *\*\ - FDCAN_COM_STATE_TX + *\*\ - uint32_t Error + *\*\ - FDCAN_ERROR_ACTIVE + *\*\ - FDCAN_ERROR_PASSIVE + *\*\ - uint32_t Warning + *\*\ - FDCAN_WARNING_BELOW_96 + *\*\ - FDCAN_WARNING_REACH_96 + *\*\ - uint32_t BusOff + *\*\ - FDCAN_BUS_ON + *\*\ - FDCAN_BUS_OFF + *\*\ - uint32_t RxESIflag + *\*\ - FDCAN_ESI_NOT_SET + *\*\ - FDCAN_ESI_SET + *\*\ - uint32_t RxBRSflag + *\*\ - FDCAN_BRS_NOT_SET + *\*\ - FDCAN_BRS_SET + *\*\ - uint32_t RxFDFflag + *\*\ - FDCAN_FDMSG_NOT_RECEIVED + *\*\ - FDCAN_FDMSG_RECEIVED + *\*\ - uint32_t Exception + *\*\ - FDCAN_NO_EXCEPTION + *\*\ - FDCAN_HAVE_EXCEPTION + *\*\ - uint32_t TDCvalue + *\*\ This parameter can be a value between 0 and 127 + *\*\return none + */ +void FDCAN_GetProtocolStatus(FDCAN_Module *FDCANx, FDCAN_ProtocolStatus *ProtocolStatus) +{ + uint32_t StatusReg; + + /* Read the protocol status register */ + StatusReg = FDCANx->PSR; + + /* Fill the protocol status structure */ + ProtocolStatus->LastError = (StatusReg & FDCAN_PSR_LEC); + ProtocolStatus->LastDataError = (StatusReg & FDCAN_PSR_DLEC); + ProtocolStatus->Activity = (StatusReg & FDCAN_PSR_ACT); + ProtocolStatus->Error = (StatusReg & FDCAN_PSR_EP); + ProtocolStatus->Warning = (StatusReg & FDCAN_PSR_EW); + ProtocolStatus->BusOff = (StatusReg & FDCAN_PSR_BO); + ProtocolStatus->RxESIflag = (StatusReg & FDCAN_PSR_RESI); + ProtocolStatus->RxBRSflag = (StatusReg & FDCAN_PSR_RBRS); + ProtocolStatus->RxFDFflag = (StatusReg & FDCAN_PSR_RFDF); + ProtocolStatus->Exception = (StatusReg & FDCAN_PSR_PXE); + ProtocolStatus->TDCvalue = ((StatusReg & FDCAN_PSR_TDCV) >> FDCAN_PSR_TDCV_OFFSET); +} + +/** + *\*\name FDCAN_GetErrorCounters. + *\*\fun Get error counter values. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param ErrorCounters pointer to an FDCAN_ErrorCounters structure. + *\*\ - TxErrorCnt + *\*\ This parameter can be a value between 0 and 255 + *\*\ - RxErrorCnt + *\*\ This parameter can be a value between 0 and 127 + *\*\ - RxErrorPassive + *\*\ - FDCAN_RX_ERROR_BELOW_128 + *\*\ - FDCAN_RX_ERROR_REACH_128 + *\*\ - ErrorLogging + *\*\ This parameter can be a value between 0 and 255. + *\*\return none + */ +void FDCAN_GetErrorCounters(FDCAN_Module *FDCANx, FDCAN_ErrorCounters *ErrorCounters) +{ + uint32_t CountersReg; + + /* Read the error counters register */ + CountersReg = FDCANx->ECR; + + /* Fill the error counters structure */ + ErrorCounters->TxErrorCnt = (CountersReg & FDCAN_ECR_TEC); + ErrorCounters->RxErrorCnt = ((CountersReg & FDCAN_ECR_REC) >> FDCAN_ECR_REC_OFFSET); + ErrorCounters->RxErrorPassive = (CountersReg & FDCAN_ECR_RP); + ErrorCounters->ErrorLogging = ((CountersReg & FDCAN_ECR_CEL) >> FDCAN_ECR_CEL_OFFSET); +} + +/** + *\*\name FDCAN_CheckNewRxBufMsg. + *\*\fun Check if a new message is received in the selected Rx buffer. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Index Rx buffer index. + *\*\ - FDCAN_RX_BUFFER0 + *\*\ - FDCAN_RX_BUFFER1 + *\*\ - FDCAN_RX_BUFFER2 + *\*\ - FDCAN_RX_BUFFER3 + *\*\ - FDCAN_RX_BUFFER4 + *\*\ - FDCAN_RX_BUFFER5 + *\*\ - FDCAN_RX_BUFFER6 + *\*\ - FDCAN_RX_BUFFER7 + *\*\ - FDCAN_RX_BUFFER8 + *\*\ - FDCAN_RX_BUFFER9 + *\*\ - FDCAN_RX_BUFFER10 + *\*\ - FDCAN_RX_BUFFER11 + *\*\ - FDCAN_RX_BUFFER12 + *\*\ - FDCAN_RX_BUFFER13 + *\*\ - FDCAN_RX_BUFFER14 + *\*\ - FDCAN_RX_BUFFER15 + *\*\ - FDCAN_RX_BUFFER16 + *\*\ - FDCAN_RX_BUFFER17 + *\*\ - FDCAN_RX_BUFFER18 + *\*\ - FDCAN_RX_BUFFER19 + *\*\ - FDCAN_RX_BUFFER20 + *\*\ - FDCAN_RX_BUFFER21 + *\*\ - FDCAN_RX_BUFFER22 + *\*\ - FDCAN_RX_BUFFER23 + *\*\ - FDCAN_RX_BUFFER24 + *\*\ - FDCAN_RX_BUFFER25 + *\*\ - FDCAN_RX_BUFFER26 + *\*\ - FDCAN_RX_BUFFER27 + *\*\ - FDCAN_RX_BUFFER28 + *\*\ - FDCAN_RX_BUFFER29 + *\*\ - FDCAN_RX_BUFFER30 + *\*\ - FDCAN_RX_BUFFER31 + *\*\ - FDCAN_RX_BUFFER32 + *\*\ - FDCAN_RX_BUFFER33 + *\*\ - FDCAN_RX_BUFFER34 + *\*\ - FDCAN_RX_BUFFER35 + *\*\ - FDCAN_RX_BUFFER36 + *\*\ - FDCAN_RX_BUFFER37 + *\*\ - FDCAN_RX_BUFFER38 + *\*\ - FDCAN_RX_BUFFER39 + *\*\ - FDCAN_RX_BUFFER40 + *\*\ - FDCAN_RX_BUFFER41 + *\*\ - FDCAN_RX_BUFFER42 + *\*\ - FDCAN_RX_BUFFER43 + *\*\ - FDCAN_RX_BUFFER44 + *\*\ - FDCAN_RX_BUFFER45 + *\*\ - FDCAN_RX_BUFFER46 + *\*\ - FDCAN_RX_BUFFER47 + *\*\ - FDCAN_RX_BUFFER48 + *\*\ - FDCAN_RX_BUFFER49 + *\*\ - FDCAN_RX_BUFFER50 + *\*\ - FDCAN_RX_BUFFER51 + *\*\ - FDCAN_RX_BUFFER52 + *\*\ - FDCAN_RX_BUFFER53 + *\*\ - FDCAN_RX_BUFFER54 + *\*\ - FDCAN_RX_BUFFER55 + *\*\ - FDCAN_RX_BUFFER56 + *\*\ - FDCAN_RX_BUFFER57 + *\*\ - FDCAN_RX_BUFFER58 + *\*\ - FDCAN_RX_BUFFER59 + *\*\ - FDCAN_RX_BUFFER60 + *\*\ - FDCAN_RX_BUFFER61 + *\*\ - FDCAN_RX_BUFFER62 + *\*\ - FDCAN_RX_BUFFER63 + *\*\return ErrorStatus + *\*\ - ERROR : No new message on RxBufferIndex. + *\*\ - SUCCESS : New message received on RxBufferIndex. + */ +ErrorStatus FDCAN_CheckNewRxBufMsg(FDCAN_Module *FDCANx, uint32_t Index) +{ + __IO uint32_t *pReg; + uint32_t IndexBit; + + /* Get new data register point according to the Rx Buffer Index */ + if(Index < FDCAN_RX_BUFFER32) + { + pReg = &(FDCANx->NDAT1); + } + else /* FDCAN_RX_BUFFER32 <= Index <= FDCAN_RX_BUFFER63 */ + { + pReg = &(FDCANx->NDAT2); + } + + /* Check if the new data flag is set or not. */ + IndexBit = (0x1UL) << (Index & 0x1FUL); + + if(0UL == (*pReg & IndexBit)) + { + return ERROR; + } + + /* Clear the new data flag. */ + *pReg = IndexBit; + + return SUCCESS; +} + +/** + *\*\name FDCAN_CheckTxBufRequest. + *\*\fun Check if a transmission request is pending on the selected Tx buffer. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param IndexBit Rx buffer index bit. + *\*\ - FDCAN_TX_BUFFER0 + *\*\ - FDCAN_TX_BUFFER1 + *\*\ - FDCAN_TX_BUFFER2 + *\*\ - FDCAN_TX_BUFFER3 + *\*\ - FDCAN_TX_BUFFER4 + *\*\ - FDCAN_TX_BUFFER5 + *\*\ - FDCAN_TX_BUFFER6 + *\*\ - FDCAN_TX_BUFFER7 + *\*\ - FDCAN_TX_BUFFER8 + *\*\ - FDCAN_TX_BUFFER9 + *\*\ - FDCAN_TX_BUFFER10 + *\*\ - FDCAN_TX_BUFFER11 + *\*\ - FDCAN_TX_BUFFER12 + *\*\ - FDCAN_TX_BUFFER13 + *\*\ - FDCAN_TX_BUFFER14 + *\*\ - FDCAN_TX_BUFFER15 + *\*\ - FDCAN_TX_BUFFER16 + *\*\ - FDCAN_TX_BUFFER17 + *\*\ - FDCAN_TX_BUFFER18 + *\*\ - FDCAN_TX_BUFFER19 + *\*\ - FDCAN_TX_BUFFER20 + *\*\ - FDCAN_TX_BUFFER21 + *\*\ - FDCAN_TX_BUFFER22 + *\*\ - FDCAN_TX_BUFFER23 + *\*\ - FDCAN_TX_BUFFER24 + *\*\ - FDCAN_TX_BUFFER25 + *\*\ - FDCAN_TX_BUFFER26 + *\*\ - FDCAN_TX_BUFFER27 + *\*\ - FDCAN_TX_BUFFER28 + *\*\ - FDCAN_TX_BUFFER29 + *\*\ - FDCAN_TX_BUFFER30 + *\*\ - FDCAN_TX_BUFFER31 + *\*\return Status + *\*\ - ERROR : No request pending on TxBufferIndex. + *\*\ - SUCCESS : Have request pending on RxBufferIndex. + */ +FlagStatus FDCAN_CheckTxBufRequest(FDCAN_Module *FDCANx, uint32_t IndexBit) +{ + FlagStatus status_value; + + /* Check pending transmission request on the selected buffer */ + if (0UL == (FDCANx->TXBRP & IndexBit)) + { + status_value = RESET; + } + else + { + status_value = SET; + } + + return status_value; +} + +/** + *\*\name FDCAN_CheckBufTxResult. + *\*\fun Check if a transmission is sent or not. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param IndexBit Rx buffer index bit. + *\*\ - FDCAN_TX_BUFFER0 + *\*\ - FDCAN_TX_BUFFER1 + *\*\ - FDCAN_TX_BUFFER2 + *\*\ - FDCAN_TX_BUFFER3 + *\*\ - FDCAN_TX_BUFFER4 + *\*\ - FDCAN_TX_BUFFER5 + *\*\ - FDCAN_TX_BUFFER6 + *\*\ - FDCAN_TX_BUFFER7 + *\*\ - FDCAN_TX_BUFFER8 + *\*\ - FDCAN_TX_BUFFER9 + *\*\ - FDCAN_TX_BUFFER10 + *\*\ - FDCAN_TX_BUFFER11 + *\*\ - FDCAN_TX_BUFFER12 + *\*\ - FDCAN_TX_BUFFER13 + *\*\ - FDCAN_TX_BUFFER14 + *\*\ - FDCAN_TX_BUFFER15 + *\*\ - FDCAN_TX_BUFFER16 + *\*\ - FDCAN_TX_BUFFER17 + *\*\ - FDCAN_TX_BUFFER18 + *\*\ - FDCAN_TX_BUFFER19 + *\*\ - FDCAN_TX_BUFFER20 + *\*\ - FDCAN_TX_BUFFER21 + *\*\ - FDCAN_TX_BUFFER22 + *\*\ - FDCAN_TX_BUFFER23 + *\*\ - FDCAN_TX_BUFFER24 + *\*\ - FDCAN_TX_BUFFER25 + *\*\ - FDCAN_TX_BUFFER26 + *\*\ - FDCAN_TX_BUFFER27 + *\*\ - FDCAN_TX_BUFFER28 + *\*\ - FDCAN_TX_BUFFER29 + *\*\ - FDCAN_TX_BUFFER30 + *\*\ - FDCAN_TX_BUFFER31 + *\*\return Status + *\*\ - ERROR : Transmission is not finished or cacelled. + *\*\ - SUCCESS : Transmission is finished. + */ +FlagStatus FDCAN_CheckBufTxResult(FDCAN_Module *FDCANx, uint32_t IndexBit) +{ + FlagStatus status_value; + + /* Check pending transmission request on the selected buffer */ + if (0UL == (FDCANx->TXBTO & IndexBit)) + { + status_value = RESET; + } + else + { + status_value = SET; + } + + return status_value; +} + +/** + *\*\name FDCAN_CheckBufTxCancel. + *\*\fun Check if a transmission is cancelled. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param IndexBit Rx buffer index bit. + *\*\ - FDCAN_TX_BUFFER0 + *\*\ - FDCAN_TX_BUFFER1 + *\*\ - FDCAN_TX_BUFFER2 + *\*\ - FDCAN_TX_BUFFER3 + *\*\ - FDCAN_TX_BUFFER4 + *\*\ - FDCAN_TX_BUFFER5 + *\*\ - FDCAN_TX_BUFFER6 + *\*\ - FDCAN_TX_BUFFER7 + *\*\ - FDCAN_TX_BUFFER8 + *\*\ - FDCAN_TX_BUFFER9 + *\*\ - FDCAN_TX_BUFFER10 + *\*\ - FDCAN_TX_BUFFER11 + *\*\ - FDCAN_TX_BUFFER12 + *\*\ - FDCAN_TX_BUFFER13 + *\*\ - FDCAN_TX_BUFFER14 + *\*\ - FDCAN_TX_BUFFER15 + *\*\ - FDCAN_TX_BUFFER16 + *\*\ - FDCAN_TX_BUFFER17 + *\*\ - FDCAN_TX_BUFFER18 + *\*\ - FDCAN_TX_BUFFER19 + *\*\ - FDCAN_TX_BUFFER20 + *\*\ - FDCAN_TX_BUFFER21 + *\*\ - FDCAN_TX_BUFFER22 + *\*\ - FDCAN_TX_BUFFER23 + *\*\ - FDCAN_TX_BUFFER24 + *\*\ - FDCAN_TX_BUFFER25 + *\*\ - FDCAN_TX_BUFFER26 + *\*\ - FDCAN_TX_BUFFER27 + *\*\ - FDCAN_TX_BUFFER28 + *\*\ - FDCAN_TX_BUFFER29 + *\*\ - FDCAN_TX_BUFFER30 + *\*\ - FDCAN_TX_BUFFER31 + *\*\return Status + *\*\ - ERROR : Transmission is not cacelled. + *\*\ - SUCCESS : Transmission is cacelled. + */ +FlagStatus FDCAN_CheckBufTxCancel(FDCAN_Module *FDCANx, uint32_t IndexBit) +{ + FlagStatus status_value; + + /* Check pending transmission request on the selected buffer */ + if (0UL == (FDCANx->TXBCF & IndexBit)) + { + status_value = RESET; + } + else + { + status_value = SET; + } + + return status_value; +} + +/** + *\*\name FDCAN_GetRxFifoFillLevel. + *\*\fun Return Rx FIFO fill level. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param RxFifo : + *\*\ - FDCAN_RX_FIFO0 + *\*\ - FDCAN_RX_FIFO1 + *\*\return Rx FIFO fill level. + */ +uint32_t FDCAN_GetRxFifoFillLevel(FDCAN_Module *FDCANx, uint32_t RxFifo) +{ + uint32_t FillLevel; + + if (RxFifo == FDCAN_RX_FIFO0) + { + FillLevel = FDCANx->RXF0S & FDCAN_RXF0S_F0FL; + } + else /* RxFifo == FDCAN_RX_FIFO1 */ + { + FillLevel = FDCANx->RXF1S & FDCAN_RXF1S_F1FL; + } + + /* Return Rx FIFO fill level */ + return FillLevel; +} + +/** + *\*\name FDCAN_GetTxFifoFreeLevel. + *\*\fun Return Tx FIFO free level: number of consecutive free Tx FIFO. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return Tx FIFO free level. + */ +uint32_t FDCAN_GetTxFifoFreeLevel(FDCAN_Module *FDCANx) +{ + uint32_t FreeLevel; + + FreeLevel = FDCANx->TXFQS & FDCAN_TXFQS_TFFL; + + /* Return Tx FIFO free level */ + return FreeLevel; +} + +/** + *\*\name FDCAN_CheckRestrictedMode. + *\*\fun Check if the FDCAN peripheral entered Restricted Operation Mode. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return Status + *\*\ - FDCAN_MODE_NORMAL : Normal FDCAN operation. + *\*\ - FDCAN_MODE_RESTRICTED_OPERATION : Restricted Operation Mode active. + */ +uint32_t FDCAN_CheckRestrictedMode(FDCAN_Module *FDCANx) +{ + uint32_t OperationMode; + + /* Get Operation Mode */ + OperationMode = (FDCANx->CCCR & FDCAN_CCCR_ASM); + + return OperationMode; +} + +/** + *\*\name FDCAN_ExitRestrictedMode. + *\*\fun Exit Restricted Operation Mode. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +void FDCAN_ExitRestrictedMode(FDCAN_Module *FDCANx) +{ + /* Exit Restricted Operation mode */ + FDCANx->CCCR &= ~FDCAN_CCCR_ASM; +} + +/** + *\*\name FDCAN_ConfigIntLine. + *\*\fun Assign interrupts to either Interrupt line 0 or 1. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Int : + *\*\ - FDCAN_INT_RX_FIFO0_NEW_MESSAGE + *\*\ - FDCAN_INT_RX_FIFO0_WATERMARK + *\*\ - FDCAN_INT_RX_FIFO0_FULL + *\*\ - FDCAN_INT_RX_FIFO0_MESSAGE_LOST + *\*\ - FDCAN_INT_RX_FIFO1_NEW_MESSAGE + *\*\ - FDCAN_INT_RX_FIFO1_WATERMARK + *\*\ - FDCAN_INT_RX_FIFO1_FULL + *\*\ - FDCAN_INT_RX_FIFO1_MESSAGE_LOST + *\*\ - FDCAN_INT_RX_HIGH_PRIORITY_MSG + *\*\ - FDCAN_INT_TX_COMPLETE + *\*\ - FDCAN_INT_TX_ABORT_COMPLETE + *\*\ - FDCAN_INT_TX_FIFO_EMPTY + *\*\ - FDCAN_INT_TX_EVT_FIFO_NEW_DATA + *\*\ - FDCAN_INT_TX_EVT_FIFO_WATERMARK + *\*\ - FDCAN_INT_TX_EVT_FIFO_FULL + *\*\ - FDCAN_INT_TX_EVT_FIFO_ELT_LOST + *\*\ - FDCAN_INT_TIMESTAMP_WRAPAROUND + *\*\ - FDCAN_INT_RAM_ACCESS_FAILURE + *\*\ - FDCAN_INT_TIMEOUT_OCCURRED + *\*\ - FDCAN_INT_RX_BUFFER_NEW_MESSAGE + *\*\ - FDCAN_INT_BITERROR_CORRECTED + *\*\ - FDCAN_INT_BITERROR_UNCORRECTED + *\*\ - FDCAN_INT_ERROR_LOGGING_OVERFLOW + *\*\ - FDCAN_INT_ERROR_PASSIVE + *\*\ - FDCAN_INT_ERROR_WARNING + *\*\ - FDCAN_INT_BUS_OFF + *\*\ - FDCAN_INT_RAM_WATCHDOG + *\*\ - FDCAN_INT_ARB_PROTOCOL_ERROR + *\*\ - FDCAN_INT_DATA_PROTOCOL_ERROR + *\*\ - FDCAN_INT_RESERVED_ADDRESS_ACCESS + *\*\param IntLine : + *\*\ - FDCAN_INTERRUPT_LINE0 + *\*\ - FDCAN_INTERRUPT_LINE1 + *\*\return none + */ +void FDCAN_ConfigIntLine(FDCAN_Module *FDCANx, uint32_t Int, uint32_t IntLine) +{ + /* Assign list of interrupts to the selected line */ + if (IntLine == FDCAN_INTERRUPT_LINE0) + { + FDCANx->ILS &= (~Int); + } + else /* IntLine == FDCAN_INTERRUPT_LINE1 */ + { + FDCANx->ILS |= Int; + } +} + +/** + *\*\name FDCAN_EnableInt. + *\*\fun Enable the specified FDCAN interrupts. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Int : + *\*\ - FDCAN_INT_RX_FIFO0_NEW_MESSAGE + *\*\ - FDCAN_INT_RX_FIFO0_WATERMARK + *\*\ - FDCAN_INT_RX_FIFO0_FULL + *\*\ - FDCAN_INT_RX_FIFO0_MESSAGE_LOST + *\*\ - FDCAN_INT_RX_FIFO1_NEW_MESSAGE + *\*\ - FDCAN_INT_RX_FIFO1_WATERMARK + *\*\ - FDCAN_INT_RX_FIFO1_FULL + *\*\ - FDCAN_INT_RX_FIFO1_MESSAGE_LOST + *\*\ - FDCAN_INT_RX_HIGH_PRIORITY_MSG + *\*\ - FDCAN_INT_TX_COMPLETE + *\*\ - FDCAN_INT_TX_ABORT_COMPLETE + *\*\ - FDCAN_INT_TX_FIFO_EMPTY + *\*\ - FDCAN_INT_TX_EVT_FIFO_NEW_DATA + *\*\ - FDCAN_INT_TX_EVT_FIFO_WATERMARK + *\*\ - FDCAN_INT_TX_EVT_FIFO_FULL + *\*\ - FDCAN_INT_TX_EVT_FIFO_ELT_LOST + *\*\ - FDCAN_INT_TIMESTAMP_WRAPAROUND + *\*\ - FDCAN_INT_RAM_ACCESS_FAILURE + *\*\ - FDCAN_INT_TIMEOUT_OCCURRED + *\*\ - FDCAN_INT_RX_BUFFER_NEW_MESSAGE + *\*\ - FDCAN_INT_BITERROR_CORRECTED + *\*\ - FDCAN_INT_BITERROR_UNCORRECTED + *\*\ - FDCAN_INT_ERROR_LOGGING_OVERFLOW + *\*\ - FDCAN_INT_ERROR_PASSIVE + *\*\ - FDCAN_INT_ERROR_WARNING + *\*\ - FDCAN_INT_BUS_OFF + *\*\ - FDCAN_INT_RAM_WATCHDOG + *\*\ - FDCAN_INT_ARB_PROTOCOL_ERROR + *\*\ - FDCAN_INT_DATA_PROTOCOL_ERROR + *\*\ - FDCAN_INT_RESERVED_ADDRESS_ACCESS + *\*\return none + */ +void FDCAN_EnableInt(FDCAN_Module *FDCANx, uint32_t Int) +{ + FDCANx->IE |= Int; +} + +/** + *\*\name FDCAN_DisableInt. + *\*\fun Disable the specified FDCAN interrupts. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Int : + *\*\ - FDCAN_INT_RX_FIFO0_NEW_MESSAGE + *\*\ - FDCAN_INT_RX_FIFO0_WATERMARK + *\*\ - FDCAN_INT_RX_FIFO0_FULL + *\*\ - FDCAN_INT_RX_FIFO0_MESSAGE_LOST + *\*\ - FDCAN_INT_RX_FIFO1_NEW_MESSAGE + *\*\ - FDCAN_INT_RX_FIFO1_WATERMARK + *\*\ - FDCAN_INT_RX_FIFO1_FULL + *\*\ - FDCAN_INT_RX_FIFO1_MESSAGE_LOST + *\*\ - FDCAN_INT_RX_HIGH_PRIORITY_MSG + *\*\ - FDCAN_INT_TX_COMPLETE + *\*\ - FDCAN_INT_TX_ABORT_COMPLETE + *\*\ - FDCAN_INT_TX_FIFO_EMPTY + *\*\ - FDCAN_INT_TX_EVT_FIFO_NEW_DATA + *\*\ - FDCAN_INT_TX_EVT_FIFO_WATERMARK + *\*\ - FDCAN_INT_TX_EVT_FIFO_FULL + *\*\ - FDCAN_INT_TX_EVT_FIFO_ELT_LOST + *\*\ - FDCAN_INT_TIMESTAMP_WRAPAROUND + *\*\ - FDCAN_INT_RAM_ACCESS_FAILURE + *\*\ - FDCAN_INT_TIMEOUT_OCCURRED + *\*\ - FDCAN_INT_RX_BUFFER_NEW_MESSAGE + *\*\ - FDCAN_INT_BITERROR_CORRECTED + *\*\ - FDCAN_INT_BITERROR_UNCORRECTED + *\*\ - FDCAN_INT_ERROR_LOGGING_OVERFLOW + *\*\ - FDCAN_INT_ERROR_PASSIVE + *\*\ - FDCAN_INT_ERROR_WARNING + *\*\ - FDCAN_INT_BUS_OFF + *\*\ - FDCAN_INT_RAM_WATCHDOG + *\*\ - FDCAN_INT_ARB_PROTOCOL_ERROR + *\*\ - FDCAN_INT_DATA_PROTOCOL_ERROR + *\*\ - FDCAN_INT_RESERVED_ADDRESS_ACCESS + *\*\return none + */ +void FDCAN_DisableInt(FDCAN_Module *FDCANx, uint32_t Int) +{ + FDCANx->IE &= (~Int); +} + +/** + *\*\name FDCAN_GetIntFlag. + *\*\fun Check whether the specified FDCAN interrupt is set or not. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Flag : + *\*\ - FDCAN_FLAG_RESERVED_ADDRESS_ACCESS + *\*\ - FDCAN_FLAG_DATA_PROTOCOL_ERROR + *\*\ - FDCAN_FLAG_ARB_PROTOCOL_ERROR + *\*\ - FDCAN_FLAG_RAM_WATCHDOG + *\*\ - FDCAN_FLAG_BUS_OFF + *\*\ - FDCAN_FLAG_ERROR_WARNING + *\*\ - FDCAN_FLAG_ERROR_PASSIVE + *\*\ - FDCAN_FLAG_ERROR_LOGGING_OVERFLOW + *\*\ - FDCAN_FLAG_BITERROR_UNCORRECTED + *\*\ - FDCAN_FLAG_BITERROR_CORRECTED + *\*\ - FDCAN_FLAG_RX_BUFFER_NEW_MESSAGE + *\*\ - FDCAN_FLAG_TIMEOUT_OCCURRED + *\*\ - FDCAN_FLAG_RAM_ACCESS_FAILURE + *\*\ - FDCAN_FLAG_TIMESTAMP_WRAPAROUND + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_ELT_LOST + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_FULL + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_WATERMARK + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_NEW_DATA + *\*\ - FDCAN_FLAG_TX_FIFO_EMPTY + *\*\ - FDCAN_FLAG_TX_ABORT_COMPLETE + *\*\ - FDCAN_FLAG_TX_COMPLETE + *\*\ - FDCAN_FLAG_RX_HIGH_PRIORITY_MSG + *\*\ - FDCAN_FLAG_RX_FIFO1_MESSAGE_LOST + *\*\ - FDCAN_FLAG_RX_FIFO1_FULL + *\*\ - FDCAN_FLAG_RX_FIFO1_WATERMARK + *\*\ - FDCAN_FLAG_RX_FIFO1_NEW_MESSAGE + *\*\ - FDCAN_FLAG_RX_FIFO0_MESSAGE_LOST + *\*\ - FDCAN_FLAG_RX_FIFO0_FULL + *\*\ - FDCAN_FLAG_RX_FIFO0_WATERMARK + *\*\ - FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE + *\*\return FlagStatus + *\*\ - RESET + *\*\ - SET + */ +FlagStatus FDCAN_GetIntFlag(FDCAN_Module *FDCANx, uint32_t Flag) +{ + FlagStatus status_value = SET; + + /* Check whether the specified FDCAN interrupt is enable or not. */ + if((FDCANx->IE & Flag) != Flag ) + { + status_value = RESET; + } + + /* Check whether the specified FDCAN interrupt flag is set or not. */ + if((FDCANx->IR & Flag) != Flag ) + { + status_value = RESET; + } + + return status_value; +} + +/** + *\*\name FDCAN_GetFlag. + *\*\fun Check whether the specified FDCAN flag is set or not. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Flag : + *\*\ - FDCAN_FLAG_RESERVED_ADDRESS_ACCESS + *\*\ - FDCAN_FLAG_DATA_PROTOCOL_ERROR + *\*\ - FDCAN_FLAG_ARB_PROTOCOL_ERROR + *\*\ - FDCAN_FLAG_RAM_WATCHDOG + *\*\ - FDCAN_FLAG_BUS_OFF + *\*\ - FDCAN_FLAG_ERROR_WARNING + *\*\ - FDCAN_FLAG_ERROR_PASSIVE + *\*\ - FDCAN_FLAG_ERROR_LOGGING_OVERFLOW + *\*\ - FDCAN_FLAG_BITERROR_UNCORRECTED + *\*\ - FDCAN_FLAG_BITERROR_CORRECTED + *\*\ - FDCAN_FLAG_RX_BUFFER_NEW_MESSAGE + *\*\ - FDCAN_FLAG_TIMEOUT_OCCURRED + *\*\ - FDCAN_FLAG_RAM_ACCESS_FAILURE + *\*\ - FDCAN_FLAG_TIMESTAMP_WRAPAROUND + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_ELT_LOST + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_FULL + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_WATERMARK + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_NEW_DATA + *\*\ - FDCAN_FLAG_TX_FIFO_EMPTY + *\*\ - FDCAN_FLAG_TX_ABORT_COMPLETE + *\*\ - FDCAN_FLAG_TX_COMPLETE + *\*\ - FDCAN_FLAG_RX_HIGH_PRIORITY_MSG + *\*\ - FDCAN_FLAG_RX_FIFO1_MESSAGE_LOST + *\*\ - FDCAN_FLAG_RX_FIFO1_FULL + *\*\ - FDCAN_FLAG_RX_FIFO1_WATERMARK + *\*\ - FDCAN_FLAG_RX_FIFO1_NEW_MESSAGE + *\*\ - FDCAN_FLAG_RX_FIFO0_MESSAGE_LOST + *\*\ - FDCAN_FLAG_RX_FIFO0_FULL + *\*\ - FDCAN_FLAG_RX_FIFO0_WATERMARK + *\*\ - FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE + *\*\return FlagStatus + *\*\ - RESET + *\*\ - SET + */ +FlagStatus FDCAN_GetFlag(FDCAN_Module *FDCANx, uint32_t Flag) +{ + FlagStatus status_value; + + if((FDCANx->IR & Flag) == Flag ) + { + status_value = SET; + } + else + { + status_value = RESET; + } + + return status_value; +} + +/** + *\*\name FDCAN_ClearFlag. + *\*\fun Clear the specified FDCAN flags. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Flag : + *\*\ - FDCAN_FLAG_RESERVED_ADDRESS_ACCESS + *\*\ - FDCAN_FLAG_DATA_PROTOCOL_ERROR + *\*\ - FDCAN_FLAG_ARB_PROTOCOL_ERROR + *\*\ - FDCAN_FLAG_RAM_WATCHDOG + *\*\ - FDCAN_FLAG_BUS_OFF + *\*\ - FDCAN_FLAG_ERROR_WARNING + *\*\ - FDCAN_FLAG_ERROR_PASSIVE + *\*\ - FDCAN_FLAG_ERROR_LOGGING_OVERFLOW + *\*\ - FDCAN_FLAG_BITERROR_UNCORRECTED + *\*\ - FDCAN_FLAG_BITERROR_CORRECTED + *\*\ - FDCAN_FLAG_RX_BUFFER_NEW_MESSAGE + *\*\ - FDCAN_FLAG_TIMEOUT_OCCURRED + *\*\ - FDCAN_FLAG_RAM_ACCESS_FAILURE + *\*\ - FDCAN_FLAG_TIMESTAMP_WRAPAROUND + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_ELT_LOST + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_FULL + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_WATERMARK + *\*\ - FDCAN_FLAG_TX_EVT_FIFO_NEW_DATA + *\*\ - FDCAN_FLAG_TX_FIFO_EMPTY + *\*\ - FDCAN_FLAG_TX_ABORT_COMPLETE + *\*\ - FDCAN_FLAG_TX_COMPLETE + *\*\ - FDCAN_FLAG_RX_HIGH_PRIORITY_MSG + *\*\ - FDCAN_FLAG_RX_FIFO1_MESSAGE_LOST + *\*\ - FDCAN_FLAG_RX_FIFO1_FULL + *\*\ - FDCAN_FLAG_RX_FIFO1_WATERMARK + *\*\ - FDCAN_FLAG_RX_FIFO1_NEW_MESSAGE + *\*\ - FDCAN_FLAG_RX_FIFO0_MESSAGE_LOST + *\*\ - FDCAN_FLAG_RX_FIFO0_FULL + *\*\ - FDCAN_FLAG_RX_FIFO0_WATERMARK + *\*\ - FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE + *\*\return none + */ +void FDCAN_ClearFlag(FDCAN_Module *FDCANx, uint32_t Flag) +{ + FDCANx->IR = Flag; +} + +/** + *\*\name FDCAN_ActivateInt. + *\*\fun Activate the specified FDCAN interrupts. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Int : + *\*\ - FDCAN_INT_RX_FIFO0_NEW_MESSAGE + *\*\ - FDCAN_INT_RX_FIFO0_WATERMARK + *\*\ - FDCAN_INT_RX_FIFO0_FULL + *\*\ - FDCAN_INT_RX_FIFO0_MESSAGE_LOST + *\*\ - FDCAN_INT_RX_FIFO1_NEW_MESSAGE + *\*\ - FDCAN_INT_RX_FIFO1_WATERMARK + *\*\ - FDCAN_INT_RX_FIFO1_FULL + *\*\ - FDCAN_INT_RX_FIFO1_MESSAGE_LOST + *\*\ - FDCAN_INT_RX_HIGH_PRIORITY_MSG + *\*\ - FDCAN_INT_TX_COMPLETE + *\*\ - FDCAN_INT_TX_ABORT_COMPLETE + *\*\ - FDCAN_INT_TX_FIFO_EMPTY + *\*\ - FDCAN_INT_TX_EVT_FIFO_NEW_DATA + *\*\ - FDCAN_INT_TX_EVT_FIFO_WATERMARK + *\*\ - FDCAN_INT_TX_EVT_FIFO_FULL + *\*\ - FDCAN_INT_TX_EVT_FIFO_ELT_LOST + *\*\ - FDCAN_INT_TIMESTAMP_WRAPAROUND + *\*\ - FDCAN_INT_RAM_ACCESS_FAILURE + *\*\ - FDCAN_INT_TIMEOUT_OCCURRED + *\*\ - FDCAN_INT_RX_BUFFER_NEW_MESSAGE + *\*\ - FDCAN_INT_BITERROR_CORRECTED + *\*\ - FDCAN_INT_BITERROR_UNCORRECTED + *\*\ - FDCAN_INT_ERROR_LOGGING_OVERFLOW + *\*\ - FDCAN_INT_ERROR_PASSIVE + *\*\ - FDCAN_INT_ERROR_WARNING + *\*\ - FDCAN_INT_BUS_OFF + *\*\ - FDCAN_INT_RAM_WATCHDOG + *\*\ - FDCAN_INT_ARB_PROTOCOL_ERROR + *\*\ - FDCAN_INT_DATA_PROTOCOL_ERROR + *\*\ - FDCAN_INT_RESERVED_ADDRESS_ACCESS + *\*\param BufferIndexes : + *\*\ - FDCAN_TX_BUFFER0 + *\*\ - FDCAN_TX_BUFFER1 + *\*\ - FDCAN_TX_BUFFER2 + *\*\ - FDCAN_TX_BUFFER3 + *\*\ - FDCAN_TX_BUFFER4 + *\*\ - FDCAN_TX_BUFFER5 + *\*\ - FDCAN_TX_BUFFER6 + *\*\ - FDCAN_TX_BUFFER7 + *\*\ - FDCAN_TX_BUFFER8 + *\*\ - FDCAN_TX_BUFFER9 + *\*\ - FDCAN_TX_BUFFER10 + *\*\ - FDCAN_TX_BUFFER11 + *\*\ - FDCAN_TX_BUFFER12 + *\*\ - FDCAN_TX_BUFFER13 + *\*\ - FDCAN_TX_BUFFER14 + *\*\ - FDCAN_TX_BUFFER15 + *\*\ - FDCAN_TX_BUFFER16 + *\*\ - FDCAN_TX_BUFFER17 + *\*\ - FDCAN_TX_BUFFER18 + *\*\ - FDCAN_TX_BUFFER19 + *\*\ - FDCAN_TX_BUFFER20 + *\*\ - FDCAN_TX_BUFFER21 + *\*\ - FDCAN_TX_BUFFER22 + *\*\ - FDCAN_TX_BUFFER23 + *\*\ - FDCAN_TX_BUFFER24 + *\*\ - FDCAN_TX_BUFFER25 + *\*\ - FDCAN_TX_BUFFER26 + *\*\ - FDCAN_TX_BUFFER27 + *\*\ - FDCAN_TX_BUFFER28 + *\*\ - FDCAN_TX_BUFFER29 + *\*\ - FDCAN_TX_BUFFER30 + *\*\ - FDCAN_TX_BUFFER31 + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_ActivateInt(FDCAN_Module *FDCANx, uint32_t Int, uint32_t BufferIndexes) +{ + /* Check ActiveITs */ + if((Int & FDCAN_INT_MASK) == 0UL) + { + return ERROR; + } + + /* Enable Interrupt lines */ + if ((Int & FDCANx->ILS) == 0UL) + { + /* Enable Interrupt line 0 */ + FDCANx->ILE |= FDCAN_INTERRUPT_LINE0; + } + else if ((Int & FDCANx->ILS) == Int) + { + /* Enable Interrupt line 1 */ + FDCANx->ILE |= FDCAN_INTERRUPT_LINE1; + } + else + { + /* Enable Interrupt lines 0 and 1 */ + FDCANx->ILE = (FDCAN_INTERRUPT_LINE0 | FDCAN_INTERRUPT_LINE1); + } + + if ((Int & FDCAN_INT_TX_COMPLETE) != 0U) + { + /* Enable Tx Buffer Transmission Interrupt to set TC flag in IR register, + but interrupt will only occur if TC is enabled in IE register */ + FDCANx->TXBTIE |= BufferIndexes; + } + + if ((Int & FDCAN_INT_TX_ABORT_COMPLETE) != 0U) + { + /* Enable Tx Buffer Cancellation Finished Interrupt to set TCF flag in IR register, + but interrupt will only occur if TCF is enabled in IE register */ + FDCANx->TXBCIE |= BufferIndexes; + } + + /* Enable the selected interrupts */ + FDCAN_EnableInt(FDCANx, Int); + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_DeactivateInt. + *\*\fun Deactivate the specified FDCAN interrupts. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Int : + *\*\ - FDCAN_INT_RX_FIFO0_NEW_MESSAGE + *\*\ - FDCAN_INT_RX_FIFO0_WATERMARK + *\*\ - FDCAN_INT_RX_FIFO0_FULL + *\*\ - FDCAN_INT_RX_FIFO0_MESSAGE_LOST + *\*\ - FDCAN_INT_RX_FIFO1_NEW_MESSAGE + *\*\ - FDCAN_INT_RX_FIFO1_WATERMARK + *\*\ - FDCAN_INT_RX_FIFO1_FULL + *\*\ - FDCAN_INT_RX_FIFO1_MESSAGE_LOST + *\*\ - FDCAN_INT_RX_HIGH_PRIORITY_MSG + *\*\ - FDCAN_INT_TX_COMPLETE + *\*\ - FDCAN_INT_TX_ABORT_COMPLETE + *\*\ - FDCAN_INT_TX_FIFO_EMPTY + *\*\ - FDCAN_INT_TX_EVT_FIFO_NEW_DATA + *\*\ - FDCAN_INT_TX_EVT_FIFO_WATERMARK + *\*\ - FDCAN_INT_TX_EVT_FIFO_FULL + *\*\ - FDCAN_INT_TX_EVT_FIFO_ELT_LOST + *\*\ - FDCAN_INT_TIMESTAMP_WRAPAROUND + *\*\ - FDCAN_INT_RAM_ACCESS_FAILURE + *\*\ - FDCAN_INT_TIMEOUT_OCCURRED + *\*\ - FDCAN_INT_RX_BUFFER_NEW_MESSAGE + *\*\ - FDCAN_INT_BITERROR_CORRECTED + *\*\ - FDCAN_INT_BITERROR_UNCORRECTED + *\*\ - FDCAN_INT_ERROR_LOGGING_OVERFLOW + *\*\ - FDCAN_INT_ERROR_PASSIVE + *\*\ - FDCAN_INT_ERROR_WARNING + *\*\ - FDCAN_INT_BUS_OFF + *\*\ - FDCAN_INT_RAM_WATCHDOG + *\*\ - FDCAN_INT_ARB_PROTOCOL_ERROR + *\*\ - FDCAN_INT_DATA_PROTOCOL_ERROR + *\*\ - FDCAN_INT_RESERVED_ADDRESS_ACCESS + *\*\return none + */ +void FDCAN_DeactivateInt(FDCAN_Module *FDCANx, uint32_t Int) +{ + uint32_t IntLine; + uint32_t tempReg; + + /* Disable the selected interrupts */ + FDCAN_DisableInt(FDCANx, Int); + + if ((Int & FDCAN_INT_TX_COMPLETE) != 0U) + { + /* Disable Tx Buffer Transmission Interrupts */ + FDCANx->TXBTIE = 0; + } + + if ((Int & FDCAN_INT_TX_ABORT_COMPLETE) != 0U) + { + /* Disable Tx Buffer Cancellation Finished Interrupt */ + FDCANx->TXBCIE = 0; + } + + IntLine = FDCANx->ILS; + tempReg = FDCANx->ILE; + + if ((FDCANx->IE | IntLine) == IntLine) + { + /* Disable Interrupt line 0 */ + tempReg &= (~FDCAN_INTERRUPT_LINE0); + } + + if ((FDCANx->IE & IntLine) == 0U) + { + /* Disable Interrupt line 1 */ + tempReg &= (~FDCAN_INTERRUPT_LINE1); + } + + FDCANx->ILE = tempReg; +} + + + +/** + *\*\name FDCAN_TT_Init. + *\*\fun Initialize TT operation parameters. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param pTTParams pointer to a FDCAN_TT_InitType structure. + *\*\ - uint32_t OperationMode + *\*\ - FDCAN_TT_COMMUNICATION_LEVEL1 + *\*\ - FDCAN_TT_COMMUNICATION_LEVEL2 + *\*\ - FDCAN_TT_COMMUNICATION_LEVEL0 + *\*\ - uint32_t GapEnable + *\*\ - FDCAN_STRICTLY_TT_OPERATION + *\*\ - FDCAN_EXT_EVT_SYNC_TT_OPERATION + *\*\ - uint32_t TimeMaster + *\*\ - FDCAN_TT_SLAVE + *\*\ - FDCAN_TT_POTENTIAL_MASTER + *\*\ - uint32_t SyncDevLimit + *\*\ This parameter must be a value between 0 and 7 + *\*\ - uint32_t InitRefTrigOffset + *\*\ This parameter must be a value between 0 and 127 + *\*\ - uint32_t ExternalClkSync + *\*\ - FDCAN_TT_EXT_CLK_SYNC_DISABLE + *\*\ - FDCAN_TT_EXT_CLK_SYNC_ENABLE + *\*\ This parameter is ignored if OperationMode is FDCAN_TT_COMMUNICATION_LEVEL1 + *\*\ - uint32_t AppWdgLimit + *\*\ This parameter must be a value between 0 and 255. + *\*\ This parameter is ignored if OperationMode is FDCAN_TT_COMMUNICATION_LEVEL0 + *\*\ - uint32_t GlobalTimeFilter + *\*\ - FDCAN_TT_GLOB_TIME_FILT_DISABLE + *\*\ - FDCAN_TT_GLOB_TIME_FILT_ENABLE + *\*\ This parameter is ignored if OperationMode is set to FDCAN_TT_COMMUNICATION_LEVEL1 + *\*\ - uint32_t ClockCalibration + *\*\ - FDCAN_TT_AUTO_CLK_CALIB_DISABLE + *\*\ - FDCAN_TT_AUTO_CLK_CALIB_ENABLE + *\*\ This parameter is ignored if OperationMode is set to FDCAN_TT_COMMUNICATION_LEVEL1 + *\*\ - uint32_t EvtTrigPolarity + *\*\ - FDCAN_TT_EVT_TRIG_POL_RISING + *\*\ - FDCAN_TT_EVT_TRIG_POL_FALLING + *\*\ This parameter is ignored if OperationMode is set to FDCAN_TT_COMMUNICATION_LEVEL0 + *\*\ - uint32_t BasicCycles + *\*\ - FDCAN_TT_CYCLES_PER_MATRIX_1 + *\*\ - FDCAN_TT_CYCLES_PER_MATRIX_2 + *\*\ - FDCAN_TT_CYCLES_PER_MATRIX_4 + *\*\ - FDCAN_TT_CYCLES_PER_MATRIX_8 + *\*\ - FDCAN_TT_CYCLES_PER_MATRIX_16 + *\*\ - FDCAN_TT_CYCLES_PER_MATRIX_32 + *\*\ - FDCAN_TT_CYCLES_PER_MATRIX_64 + *\*\ - uint32_t CycleStartSync + *\*\ - FDCAN_TT_NO_SYNC_PULSE + *\*\ - FDCAN_TT_SYNC_BASIC_CYCLE_START + *\*\ - FDCAN_TT_SYNC_MATRIX_START + *\*\ - uint32_t TxEnableWindow + *\*\ This parameter must be a value between 1 and 16 + *\*\ - uint32_t ExpTxTrigSize + *\*\ This parameter must be a value between 0 and 4095 + *\*\ - uint32_t TURNumerator + *\*\ This parameter must be a value between 0x10000 and 0x1FFFF + *\*\ - uint32_t TURDenominator + *\*\ This parameter must be a value between 0x0001 and 0x3FFF + *\*\ - uint32_t TrigMemorySize + *\*\ This parameter must be a value between 0 and 64 + *\*\ - uint32_t StopWatchTrigSel + *\*\ - FDCAN_TT_STOP_WATCH_TRIGGER_0 + *\*\ - FDCAN_TT_STOP_WATCH_TRIGGER_1 + *\*\ - FDCAN_TT_STOP_WATCH_TRIGGER_2 + *\*\ - FDCAN_TT_STOP_WATCH_TRIGGER_3 + *\*\ - uint32_t EventTrigSel + *\*\ - FDCAN_TT_EVENT_TRIGGER_0 + *\*\ - FDCAN_TT_EVENT_TRIGGER_1 + *\*\ - FDCAN_TT_EVENT_TRIGGER_2 + *\*\ - FDCAN_TT_EVENT_TRIGGER_3 + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_Init(FDCAN_Module *FDCANx, FDCAN_TT_InitType *pTTParams) +{ + uint32_t RAMcounter; + uint32_t OffsetAddress; + uint32_t StartAddress; + uint32_t timeout; + uint32_t tempReg; + FDCAN_MsgRamType *pMsg; + + pMsg = pMsgRam[FDCAN_Get_Index(FDCANx)]; + + /* Stop local time in order to enable write access to the other bits of TURCF register */ + FDCANx->TURCF &= ~FDCAN_TURCF_ELT; + + /* Wait until the ELT bit into TURCF register is reset */ + timeout = 0; + + while ((FDCANx->TURCF & FDCAN_TURCF_ELT) != 0U) + { + if (timeout > FDCAN_TIMEOUT_VALUE) + { + return ERROR; + } + + timeout++; + } + + /* Configure TUR (Time Unit Ratio) */ + FDCANx->TURCF = (pTTParams->TURNumerator - 0x10000UL) \ + | (pTTParams->TURDenominator << FDCAN_TURCF_DC_OFFSET); + + /* Enable local time */ + FDCANx->TURCF |= FDCAN_TURCF_ELT; + + /* Configure TT operation */ + tempReg = (pTTParams->OperationMode) \ + | (pTTParams->TimeMaster) \ + | (pTTParams->SyncDevLimit << FDCAN_TTOCF_LDSDL_OFFSET) \ + | (pTTParams->InitRefTrigOffset << FDCAN_TTOCF_IRTO_OFFSET); + + if (pTTParams->OperationMode != FDCAN_TT_COMMUNICATION_LEVEL0) + { + tempReg |= (pTTParams->GapEnable) \ + | (pTTParams->AppWdgLimit << FDCAN_TTOCF_AWL_OFFSET) \ + | (pTTParams->EvtTrigPolarity); + } + + if (pTTParams->OperationMode != FDCAN_TT_COMMUNICATION_LEVEL1) + { + tempReg |= (pTTParams->ExternalClkSync) \ + | (pTTParams->GlobalTimeFilter) \ + | (pTTParams->ClockCalibration); + } + + FDCANx->TTOCF = tempReg; + + /* Configure system matrix limits */ + tempReg = pTTParams->CycleStartSync; + + if (pTTParams->OperationMode != FDCAN_TT_COMMUNICATION_LEVEL0) + { + tempReg |= ((pTTParams->TxEnableWindow - 1UL) << FDCAN_TTMLM_TXEW_OFFSET); + tempReg |= (pTTParams->ExpTxTrigSize << FDCAN_TTMLM_ENIT_OFFSET); + } + + if (pTTParams->TimeMaster == FDCAN_TT_POTENTIAL_MASTER) + { + tempReg |= pTTParams->BasicCycles; + } + + FDCANx->TTMLM = tempReg; + + /* Configure input triggers: Stop watch and Event */ + tempReg = FDCANx->TTSS; + tempReg &= (~(FDCAN_TTSS_SSWT | FDCAN_TTSS_SEVT)); + tempReg |= (pTTParams->StopWatchTrigSel | pTTParams->EventTrigSel); + FDCANx->TTSS = tempReg; + + /* Configure trigger memory start address and elements number */ + if((FDCANx->TTSS & FDCAN_START_ADDRESS_RAMSEL) == FDCAN_START_ADDRESS_RAMSEL) + { + OffsetAddress = (pMsg->EndAddress - FDCAN_START_ADDRESS_SRAM5BANK2) / 4UL; + StartAddress = FDCAN_START_ADDRESS_SRAM5BANK2; + } + else + { + OffsetAddress = (pMsg->EndAddress - FDCAN_START_ADDRESS_SRAM5BANK1) / 4UL; + StartAddress = FDCAN_START_ADDRESS_SRAM5BANK1; + } + + FDCANx->TTTMC = (OffsetAddress << FDCAN_START_ADDRESS_OFFSET) | \ + (pTTParams->TrigMemorySize << FDCAN_SIZE_NUMBER_OFFSET); + + /* Recalculate End Address */ + pMsg->TTMemoryStrAddr = pMsg->EndAddress; + pMsg->EndAddress += (pTTParams->TrigMemorySize * FDCAN_TT_MEMORY_WORDS * 4UL); + + /* Check end address of the Message RAM */ + if (pMsg->EndAddress > (StartAddress + FDCAN_MESSAGE_RAM_SIZE) ) + { + return ERROR; + } + + /* Flush the allocated Message RAM area */ + for (RAMcounter = pMsg->TTMemoryStrAddr; RAMcounter < pMsg->EndAddress; RAMcounter += 4UL) + { + *(uint32_t *)(RAMcounter) = 0UL; + } + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_TT_ConfigRefMsg. + *\*\fun Configure the reference message. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param IdType : + *\*\ - FDCAN_STANDARD_ID + *\*\ - FDCAN_EXTENDED_ID + *\*\param ID Reference Identifier. + *\*\ This parameter must be a number between: + *\*\ - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + *\*\ - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID + *\*\param Payload Enable or disable the additional payload. + *\*\ - FDCAN_TT_REF_MSG_NO_PAYLOAD + *\*\ - FDCAN_TT_REF_MSG_ADD_PAYLOAD + *\*\return none + */ +void FDCAN_TT_ConfigRefMsg(FDCAN_Module *FDCANx, uint32_t IdType, uint32_t ID, uint32_t Payload) +{ + uint32_t id_temp; + uint32_t tempReg; + + /* Configure reference message identifier type, identifier and payload */ + if (IdType == FDCAN_STANDARD_ID) + { + id_temp = ID << FDCAN_TTRMC_STD_ID_OFFSET; + } + else + { + id_temp = ID; + } + + tempReg = FDCANx->TTRMC & (~(FDCAN_TTRMC_RID | FDCAN_TTRMC_XTD | FDCAN_TTRMC_RMPS)); + tempReg |= (id_temp | IdType | Payload); + FDCANx->TTRMC = tempReg; +} + +/** + *\*\name FDCAN_TT_ConfigTrigger. + *\*\fun Configure the FDCAN trigger according to the specified parameters + *\*\ in the FDCAN_TriggerType structure. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param sTriggerConfig :pointer to an FDCAN_TriggerType structure + *\*\ - TriggerIndex + *\*\ This parameter must be a number between 0 and 63 + *\*\ - TimeMark + *\*\ This parameter must be a number between 0 and 0xFFFF + *\*\ - RepeatFactor + *\*\ - FDCAN_TT_REPEAT_EVERY_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_2ND_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_4TH_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_8TH_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_16TH_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_32ND_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_64TH_CYCLE + *\*\ - StartCycle + *\*\ This parameter must be a value between 0 and RepeatFactor. + *\*\ This parameter is ignored if RepeatFactor is set to FDCAN_TT_REPEAT_EVERY_CYCLE. + *\*\ - TmEventInt + *\*\ - FDCAN_TT_TM_NO_INTERNAL_EVENT + *\*\ - FDCAN_TT_TM_GEN_INTERNAL_EVENT + *\*\ - TmEventExt + *\*\ - FDCAN_TT_TM_NO_EXTERNAL_EVENT + *\*\ - FDCAN_TT_TM_GEN_EXTERNAL_EVENT + *\*\ - TriggerType; + *\*\ - FDCAN_TT_TX_REF_TRIGGER + *\*\ - FDCAN_TT_TX_REF_TRIGGER_GAP + *\*\ - FDCAN_TT_TX_TRIGGER_SINGLE + *\*\ - FDCAN_TT_TX_TRIGGER_CONTINUOUS + *\*\ - FDCAN_TT_TX_TRIGGER_ARBITRATION + *\*\ - FDCAN_TT_TX_TRIGGER_MERGED + *\*\ - FDCAN_TT_WATCH_TRIGGER + *\*\ - FDCAN_TT_WATCH_TRIGGER_GAP + *\*\ - FDCAN_TT_RX_TRIGGER + *\*\ - FDCAN_TT_TIME_BASE_TRIGGER + *\*\ - FDCAN_TT_END_OF_LIST + *\*\ - FilterType + *\*\ - FDCAN_STANDARD_ID + *\*\ - FDCAN_EXTENDED_ID + *\*\ - TxBufferIndex + *\*\ - FDCAN_TX_BUFFER0 + *\*\ - FDCAN_TX_BUFFER1 + *\*\ - FDCAN_TX_BUFFER2 + *\*\ - FDCAN_TX_BUFFER3 + *\*\ - FDCAN_TX_BUFFER4 + *\*\ - FDCAN_TX_BUFFER5 + *\*\ - FDCAN_TX_BUFFER6 + *\*\ - FDCAN_TX_BUFFER7 + *\*\ - FDCAN_TX_BUFFER8 + *\*\ - FDCAN_TX_BUFFER9 + *\*\ - FDCAN_TX_BUFFER10 + *\*\ - FDCAN_TX_BUFFER11 + *\*\ - FDCAN_TX_BUFFER12 + *\*\ - FDCAN_TX_BUFFER13 + *\*\ - FDCAN_TX_BUFFER14 + *\*\ - FDCAN_TX_BUFFER15 + *\*\ - FDCAN_TX_BUFFER16 + *\*\ - FDCAN_TX_BUFFER17 + *\*\ - FDCAN_TX_BUFFER18 + *\*\ - FDCAN_TX_BUFFER19 + *\*\ - FDCAN_TX_BUFFER20 + *\*\ - FDCAN_TX_BUFFER21 + *\*\ - FDCAN_TX_BUFFER22 + *\*\ - FDCAN_TX_BUFFER23 + *\*\ - FDCAN_TX_BUFFER24 + *\*\ - FDCAN_TX_BUFFER25 + *\*\ - FDCAN_TX_BUFFER26 + *\*\ - FDCAN_TX_BUFFER27 + *\*\ - FDCAN_TX_BUFFER28 + *\*\ - FDCAN_TX_BUFFER29 + *\*\ - FDCAN_TX_BUFFER30 + *\*\ - FDCAN_TX_BUFFER31 + *\*\ - FilterIndex + *\*\ This parameter must be a number between: + *\*\ - 0 and 127, if FilterType is FDCAN_STANDARD_ID + *\*\ - 0 and 63, if FilterType is FDCAN_EXTENDED_ID + *\*\return none + */ +void FDCAN_TT_ConfigTrigger(FDCAN_Module *FDCANx, FDCAN_TriggerType *sTriggerConfig) +{ + uint32_t CycleCode; + uint32_t MsgNumber; + uint32_t *TriggerAddress; + FDCAN_MsgRamType *pMsg; + + pMsg = pMsgRam[FDCAN_Get_Index(FDCANx)]; + + /* Calculate trigger address */ + TriggerAddress = (uint32_t *)(pMsg->TTMemoryStrAddr + (sTriggerConfig->TriggerIndex * FDCAN_TT_MEMORY_WORDS * 4UL)); + + /* Calculate cycle code */ + if (sTriggerConfig->RepeatFactor == FDCAN_TT_REPEAT_EVERY_CYCLE) + { + CycleCode = FDCAN_TT_REPEAT_EVERY_CYCLE; + } + else /* sTriggerConfig->RepeatFactor != FDCAN_TT_REPEAT_EVERY_CYCLE */ + { + CycleCode = sTriggerConfig->RepeatFactor + sTriggerConfig->StartCycle; + } + + /* Write first word of trigger element to the message RAM */ + *TriggerAddress = ( (sTriggerConfig->TimeMark << FDCAN_ELEMENT_TM_OFFSET) \ + | (CycleCode << FDCAN_ELEMENT_CC_OFFSET) \ + | (sTriggerConfig->TmEventInt ) \ + | (sTriggerConfig->TmEventExt ) \ + | (sTriggerConfig->TriggerType) ); + + /* Increment TriggerAddress pointer to second word of trigger element */ + TriggerAddress++; + + /* Select message number depending on trigger type (transmission or reception) */ + if (sTriggerConfig->TriggerType == FDCAN_TT_RX_TRIGGER) + { + MsgNumber = sTriggerConfig->FilterIndex; + } + else if ((sTriggerConfig->TriggerType == FDCAN_TT_TX_TRIGGER_SINGLE) || + (sTriggerConfig->TriggerType == FDCAN_TT_TX_TRIGGER_CONTINUOUS) || + (sTriggerConfig->TriggerType == FDCAN_TT_TX_TRIGGER_ARBITRATION) || + (sTriggerConfig->TriggerType == FDCAN_TT_TX_TRIGGER_MERGED)) + { + MsgNumber = POSITION_VAL(sTriggerConfig->TxBufferIndex); + } + else + { + MsgNumber = 0; + } + + /* Write second word of trigger element to the message RAM */ + *TriggerAddress = (sTriggerConfig->FilterType >> 7U) | (MsgNumber << FDCAN_ELEMENT_MNR_OFFSET); +} + +/** + *\*\name FDCAN_TT_WaitLCKCReset. + *\*\fun Wait until the LCKC bit into TTOCN register is reset. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\return ErrorStatus + *\*\ - SUCCESS: Register is unlock + *\*\ - ERROR : Register is locked + */ +static ErrorStatus FDCAN_TT_WaitLCKCReset(FDCAN_Module *FDCANx) +{ + uint32_t timeout; + + /* Wait until the LCKC bit into TTOCN register is reset */ + timeout = 0; + + while ((FDCANx->TTOCN & FDCAN_TTOCN_LCKC) != 0U) + { + /* Check for the Timeout */ + if (timeout > FDCAN_TIMEOUT_COUNT) + { + return ERROR; + } + + timeout++; + } + + return SUCCESS; +} + + +/** + *\*\name FDCAN_TT_SetGlobalTime. + *\*\fun Schedule global time adjustment for the next reference message. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param TimePreset :time preset value. + *\*\ This parameter must be a number between: + *\*\ - 0x0000 and 0x7FFF, Next_Master_Ref_Mark = Current_Master_Ref_Mark + TimePreset + *\*\ or + *\*\ - 0x8001 and 0xFFFF, Next_Master_Ref_Mark = Current_Master_Ref_Mark - (0x10000 - TimePreset) + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_SetGlobalTime(FDCAN_Module *FDCANx, uint32_t TimePreset) +{ + uint32_t tempReg; + + /* Check that the external clock synchronization is enabled */ + if ((FDCANx->TTOCF & FDCAN_TTOCF_EECS) != FDCAN_TTOCF_EECS) + { + return ERROR; + } + + /* Check that no global time preset is pending */ + if ((FDCANx->TTOST & FDCAN_TTOST_WGTD) == FDCAN_TTOST_WGTD) + { + return ERROR; + } + + /* Configure time preset */ + tempReg = FDCANx->TTGTP & (~(FDCAN_TTGTP_TP)); + tempReg |= TimePreset; + FDCANx->TTGTP = tempReg; + + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + /* Schedule time preset to take effect by the next reference message */ + FDCANx->TTOCN |= FDCAN_TTOCN_SGT; + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_TT_SetClockSync. + *\*\fun Schedule TUR numerator update for the next reference message. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param NewTURNumerator :new value of the TUR numerator. + *\*\ This parameter must be a number between 0x10000 and 0x1FFFF. + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_SetClockSync(FDCAN_Module *FDCANx, uint32_t NewTURNumerator) +{ + uint32_t tempReg; + + /* Check that the external clock synchronization is enabled */ + if ((FDCANx->TTOCF & FDCAN_TTOCF_EECS) != FDCAN_TTOCF_EECS) + { + return ERROR; + } + + /* Check that no external clock synchronization is pending */ + if ((FDCANx->TTOST & FDCAN_TTOST_WECS) == FDCAN_TTOST_WECS) + { + return ERROR; + } + + /* Configure new TUR numerator */ + tempReg = FDCANx->TURCF & (~FDCAN_TURCF_NCL); + tempReg |= (NewTURNumerator - 0x10000UL); + FDCANx->TURCF = tempReg; + + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + /* Schedule TUR numerator update by the next reference message */ + FDCANx->TTOCN |= FDCAN_TTOCN_ECS; + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_TT_ConfigStopWatch. + *\*\fun Configure stop watch source and polarity. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param Source : + *\*\ - FDCAN_TT_STOP_WATCH_DISABLED + *\*\ - FDCAN_TT_STOP_WATCH_CYCLE_TIME + *\*\ - FDCAN_TT_STOP_WATCH_LOCAL_TIME + *\*\ - FDCAN_TT_STOP_WATCH_GLOBAL_TIME + *\*\param Polarity : + *\*\ - FDCAN_TT_STOP_WATCH_RISING + *\*\ - FDCAN_TT_STOP_WATCH_FALLING + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_ConfigStopWatch(FDCAN_Module *FDCANx, uint32_t Source, uint32_t Polarity) +{ + uint32_t tempReg; + + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + /* Select stop watch source and polarity */ + tempReg = FDCANx->TTOCN & (~(FDCAN_TTOCN_SWS | FDCAN_TTOCN_SWP)); + tempReg |= (Source | Polarity); + FDCANx->TTOCN = tempReg; + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_TT_ConfigRegTimeMark. + *\*\fun Configure register time mark pulse generation. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param TimeMarkSource : + *\*\ - FDCAN_TT_REG_TIMEMARK_DIABLED + *\*\ - FDCAN_TT_REG_TIMEMARK_CYCLE_TIME + *\*\ - FDCAN_TT_REG_TIMEMARK_LOCAL_TIME + *\*\ - FDCAN_TT_REG_TIMEMARK_GLOBAL_TIME + *\*\param TimeMarkValue :time mark value (reference). + *\*\ This parameter must be a number between 0 and 0xFFFF. + *\*\param RepeatFactor : + *\*\ - FDCAN_TT_REPEAT_EVERY_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_2ND_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_4TH_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_8TH_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_16TH_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_32ND_CYCLE + *\*\ - FDCAN_TT_REPEAT_EVERY_64TH_CYCLE + *\*\param StartCycle :index of the first cycle in which the time mark becomes valid. + *\*\ This parameter is ignored if RepeatFactor is set to FDCAN_TT_REPEAT_EVERY_CYCLE. + *\*\ This parameter must be a number between 0 and RepeatFactor. + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_ConfigRegTimeMark(FDCAN_Module *FDCANx, + uint32_t TimeMarkSource, uint32_t TimeMarkValue, + uint32_t RepeatFactor, uint32_t StartCycle) +{ + uint32_t timeout; + uint32_t tempReg; + uint32_t CycleCode; + + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + /* Disable the time mark compare function */ + FDCANx->TTOCN &= ~FDCAN_TTOCN_TMC; + + if (TimeMarkSource == FDCAN_TT_REG_TIMEMARK_DIABLED) + { + return SUCCESS; + } + + /* Calculate cycle code */ + if (RepeatFactor == FDCAN_TT_REPEAT_EVERY_CYCLE) + { + CycleCode = FDCAN_TT_REPEAT_EVERY_CYCLE; + } + else /* RepeatFactor != FDCAN_TT_REPEAT_EVERY_CYCLE */ + { + CycleCode = RepeatFactor + StartCycle; + } + + /* Wait until the LCKM bit into TTTMK register is reset */ + timeout = 0; + + while ((FDCANx->TTTMK & FDCAN_TTTMK_LCKM) != 0U) + { + /* Check for the Timeout */ + if (timeout > FDCAN_TIMEOUT_COUNT) + { + return ERROR; + } + + timeout++; + } + + /* Configure time mark value and cycle code */ + FDCANx->TTTMK = ((TimeMarkValue) | (CycleCode << FDCAN_TTTMK_TICC_OFFSET)); + + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + /* Update the register time mark compare source */ + tempReg = FDCANx->TTOCN & (~FDCAN_TTOCN_TMC); + tempReg |= TimeMarkSource; + FDCANx->TTOCN = tempReg; + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_TT_EnableRegTMPulse. + *\*\fun Enables or disables register time mark pulse generation. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_EnableRegTMPulse(FDCAN_Module *FDCANx, FunctionalState Cmd) +{ + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + if(Cmd == ENABLE) + { + /* Enable Register Time Mark Interrupt output on fdcan_rtp */ + FDCANx->TTOCN |= FDCAN_TTOCN_RTIE; + } + else + { + /* Disable Register Time Mark Interrupt output on fdcan_rtp */ + FDCANx->TTOCN &= (~FDCAN_TTOCN_RTIE); + } + + + /* Return function status */ + return SUCCESS; +} + + +/** + *\*\name FDCAN_TT_EnableTrigTMPulse. + *\*\fun Enables or disables trigger time mark pulse generation. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_EnableTrigTMPulse(FDCAN_Module *FDCANx, FunctionalState Cmd) +{ + if ((FDCANx->TTOCF & FDCAN_TTOCF_OM) == FDCAN_TT_COMMUNICATION_LEVEL0) + { + /* Feature not supported for TT Level 0 */ + return ERROR; + } + + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + if(Cmd == ENABLE) + { + /* Enable Trigger Time Mark Interrupt output on fdcan_tmp */ + FDCANx->TTOCN |= FDCAN_TTOCN_TTIE; + } + else + { + /* Disable Trigger Time Mark Interrupt output on fdcan_rtp */ + FDCANx->TTOCN &= (~FDCAN_TTOCN_TTIE); + } + + /* Return function status */ + return SUCCESS; +} + + +/** + *\*\name FDCAN_TT_EnableGapPinCtrl. + *\*\fun Enables or disables gap control by input pin fdcan_evt. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_EnableGapPinCtrl(FDCAN_Module *FDCANx, FunctionalState Cmd) +{ + if ((FDCANx->TTOCF & FDCAN_TTOCF_OM) == FDCAN_TT_COMMUNICATION_LEVEL0) + { + /* Feature not supported for TT Level 0 */ + return ERROR; + } + + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + if(Cmd == ENABLE) + { + /* Enable gap control by pin fdcan_evt */ + FDCANx->TTOCN |= FDCAN_TTOCN_GCS; + } + else + { + /* Disable gap control by pin fdcan_evt */ + FDCANx->TTOCN &= (~FDCAN_TTOCN_GCS); + } + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_TT_EnableTMGapCtrl. + *\*\fun Enables or disables gap control (finish only) by register time mark interrupt. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_EnableTMGapCtrl(FDCAN_Module *FDCANx, FunctionalState Cmd) +{ + if ((FDCANx->TTOCF & FDCAN_TTOCF_OM) == FDCAN_TT_COMMUNICATION_LEVEL0) + { + /* Feature not supported for TT Level 0 */ + return ERROR; + } + + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + if(Cmd == ENABLE) + { + /* Enable gap control by register time mark interrupt */ + FDCANx->TTOCN |= FDCAN_TTOCN_TMG; + } + else + { + /* Disable gap control by register time mark interrupt */ + FDCANx->TTOCN &= (~FDCAN_TTOCN_TMG); + } + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_TT_SetNextIsGap. + *\*\fun Transmit next reference message with Next_is_Gap = "1". + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_SetNextIsGap(FDCAN_Module *FDCANx) +{ + /* Check that the node is configured for external event-synchronized TT operation */ + if ((FDCANx->TTOCF & FDCAN_TTOCF_GEN) != FDCAN_TTOCF_GEN) + { + return ERROR; + } + + if ((FDCANx->TTOCF & FDCAN_TTOCF_OM) == FDCAN_TT_COMMUNICATION_LEVEL0) + { + /* Feature not supported for TT Level 0 */ + return ERROR; + } + + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + /* Set Next is Gap */ + FDCANx->TTOCN |= FDCAN_TTOCN_NIG; + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_TT_SetEndOfGap. + *\*\fun Finish a Gap by requesting start of reference message. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_SetEndOfGap(FDCAN_Module *FDCANx) +{ + /* Check that the node is configured for external event-synchronized TT operation */ + if ((FDCANx->TTOCF & FDCAN_TTOCF_GEN) != FDCAN_TTOCF_GEN) + { + return ERROR; + } + + if ((FDCANx->TTOCF & FDCAN_TTOCF_OM) == FDCAN_TT_COMMUNICATION_LEVEL0) + { + /* Feature not supported for TT Level 0 */ + return ERROR; + } + + + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + /* Set Finish Gap */ + FDCANx->TTOCN |= FDCAN_TTOCN_FGP; + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_TT_ConfigExtSyncPhase. + *\*\fun Configure target phase used for external synchronization by event + *\*\ trigger input pin. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param TargetPhase :defines target value of cycle time when a rising edge + *\*\ of fdcan_evt is expected. + *\*\ This parameter must be a number between 0 and 0xFFFF. + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_ConfigExtSyncPhase(FDCAN_Module *FDCANx, uint32_t TargetPhase) +{ + uint32_t tempReg; + + /* Check that no external schedule synchronization is pending */ + if ((FDCANx->TTOCN & FDCAN_TTOCN_ESCN) == FDCAN_TTOCN_ESCN) + { + return ERROR; + } + + /* Configure cycle time target phase */ + tempReg = FDCANx->TTGTP & (~FDCAN_TTGTP_CTP); + tempReg |= TargetPhase << FDCAN_TTGTP_CTP_OFFSET; + FDCANx->TTGTP = tempReg; + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_TT_EnableExtSync. + *\*\fun Enable or disable external schedule synchronization. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_EnableExtSync(FDCAN_Module *FDCANx, FunctionalState Cmd) +{ + /* Wait until the LCKC bit into TTOCN register is reset */ + if(FDCAN_TT_WaitLCKCReset(FDCANx) != SUCCESS) + { + return ERROR; + } + + if(Cmd == ENABLE) + { + /* Enable external synchronization */ + FDCANx->TTOCN |= FDCAN_TTOCN_ESCN; + } + else + { + /* Disable external synchronization */ + FDCANx->TTOCN &= (~FDCAN_TTOCN_ESCN); + } + + /* Return function status */ + return SUCCESS; +} + + +/** + *\*\name FDCAN_TT_GetStatus. + *\*\fun Get TT operation status. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param TTStatus pointer to an FDCAN_TT_Status structure. + *\*\ - ErrorLevel + *\*\ - FDCAN_TT_NO_ERROR + *\*\ - FDCAN_TT_WARNING + *\*\ - FDCAN_TT_ERROR + *\*\ - FDCAN_TT_SEVERE_ERROR + *\*\ - MasterState + *\*\ - FDCAN_TT_MASTER_OFF + *\*\ - FDCAN_TT_TIME_SLAVE + *\*\ - FDCAN_TT_BACKUP_TIME_MASTER + *\*\ - FDCAN_TT_CURRENT_TIME_MASTER + *\*\ - SyncState + *\*\ - FDCAN_TT_OUT_OF_SYNC + *\*\ - FDCAN_TT_SYNCHRONIZING + *\*\ - FDCAN_TT_IN_GAP + *\*\ - FDCAN_TT_IN_SCHEDULE + *\*\ - GTimeQuality + *\*\ - FDCAN_TT_GTIME_NOT_VALID + *\*\ - FDCAN_TT_GTIME_IN_MASTER_PHASE + *\*\ - ClockQuality + *\*\ - FDCAN_TT_LOCAL_CLOCK_NOT_SYNC + *\*\ - FDCAN_TT_SYNC_DEV_LESS_THAN_SDL + *\*\ - RefTrigOffset + *\*\ This parameter can be a number between 0 and 0xFF + *\*\ - GTimeDiscPending + *\*\ - FDCAN_TT_NO_GTIME_PENDING + *\*\ - FDCAN_TT_WATI_GTIMESYNC_PRESENT + *\*\ - GapFinished + *\*\ - FDCAN_TT_GAP_RESET + *\*\ - FDCAN_TT_GAP_FINISHED + *\*\ - MasterPriority + *\*\ This parameter can be a number between 0 and 0x7 + *\*\ - GapStarted + *\*\ - FDCAN_TT_NO_GAP + *\*\ - FDCAN_TT_GAP_STARTED + *\*\ - WaitForEvt + *\*\ - FDCAN_TT_GAP_NOT_ANNOUNCED + *\*\ - FDCAN_TT_REF_MSG_RECEIVED + *\*\ - AppWdgEvt + *\*\ - FDCAN_TT_WATCHDOG_VALID + *\*\ - FDCAN_TT_WATCHDOG_INVALID + *\*\ - ECSPending + *\*\ - FDCAN_TT_NO_EXT_CLOCK_SYNC + *\*\ - FDCAN_TT_WAIT_EXT_CLOCK_SYNC + *\*\ - PhaseLock + *\*\ - FDCAN_TT_PHASE_OUT_OF_RANGE + *\*\ - FDCAN_TT_PHASE_IN_RANGE + *\*\return none + */ +void FDCAN_TT_GetStatus(FDCAN_Module *FDCANx, FDCAN_TT_Status *TTStatus) +{ + uint32_t tempReg; + + /* Read the TT operation status register */ + tempReg = FDCANx->TTOST; + + /* Fill the TT operation status structure */ + TTStatus->ErrorLevel = (tempReg & FDCAN_TTOST_EL); + TTStatus->MasterState = (tempReg & FDCAN_TTOST_MS); + TTStatus->SyncState = (tempReg & FDCAN_TTOST_SYS); + TTStatus->GTimeQuality = (tempReg & FDCAN_TTOST_QGTP); + TTStatus->ClockQuality = (tempReg & FDCAN_TTOST_QCS); + TTStatus->RefTrigOffset = ((tempReg & FDCAN_TTOST_RTO) >> FDCAN_TTOST_RTO_OFFSET); + TTStatus->GTimeDiscPending = (tempReg & FDCAN_TTOST_WGTD); + TTStatus->GapFinished = (tempReg & FDCAN_TTOST_GFI); + TTStatus->MasterPriority = ((tempReg & FDCAN_TTOST_TMP) >> FDCAN_TTOST_TMP_OFFSET); + TTStatus->GapStarted = (tempReg & FDCAN_TTOST_GSI); + TTStatus->WaitForEvt = (tempReg & FDCAN_TTOST_WFE); + TTStatus->AppWdgEvt = (tempReg & FDCAN_TTOST_AWE); + TTStatus->ECSPending = (tempReg & FDCAN_TTOST_WECS); + TTStatus->PhaseLock = (tempReg & FDCAN_TTOST_SPL); +} + +/** + *\*\name FDCAN_TT_ConfigIntLine. + *\*\fun Assign TT interrupts to either Interrupt line 0 or 1. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param TT_Int : + *\*\ - FDCAN_TT_INT_BASIC_CYCLE_START + *\*\ - FDCAN_TT_INT_MATRIX_CYCLE_START + *\*\ - FDCAN_TT_INT_SYNC_MODE_CHANGE + *\*\ - FDCAN_TT_INT_START_OF_GAP + *\*\ - FDCAN_TT_INT_REG_TIME_MARK + *\*\ - FDCAN_TT_INT_TRIG_TIME_MARK + *\*\ - FDCAN_TT_INT_STOP_WATCH + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_WRAP + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_DISC + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_ERROR + *\*\ - FDCAN_TT_INT_TX_COUNT_UNDERFLOW + *\*\ - FDCAN_TT_INT_TX_COUNT_OVERFLOW + *\*\ - FDCAN_TT_INT_SCHEDULING_ERROR_1 + *\*\ - FDCAN_TT_INT_SCHEDULING_ERROR_2 + *\*\ - FDCAN_TT_INT_ERROR_LEVEL_CHANGE + *\*\ - FDCAN_TT_INT_INIT_WATCH_TRIGGER + *\*\ - FDCAN_TT_INT_WATCH_TRIGGER + *\*\ - FDCAN_TT_INT_APPLICATION_WATCHDOG + *\*\ - FDCAN_TT_INT_CONFIG_ERROR + *\*\param IntLine : + *\*\ - FDCAN_INTERRUPT_LINE0 + *\*\ - FDCAN_INTERRUPT_LINE1 + *\*\return none + */ +void FDCAN_TT_ConfigIntLine(FDCAN_Module *FDCANx, uint32_t TT_Int, uint32_t IntLine) +{ + /* Assign list of interrupts to the selected line */ + if (IntLine == FDCAN_INTERRUPT_LINE0) + { + FDCANx->TTILS &= (~TT_Int); + } + else /* IntLine == FDCAN_INTERRUPT_LINE1 */ + { + FDCANx->TTILS |= TT_Int; + } +} + +/** + *\*\name FDCAN_TT_EnableInt. + *\*\fun Enable or disable the specified FDCAN TT interrupts. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param TT_Int : + *\*\ - FDCAN_TT_INT_BASIC_CYCLE_START + *\*\ - FDCAN_TT_INT_MATRIX_CYCLE_START + *\*\ - FDCAN_TT_INT_SYNC_MODE_CHANGE + *\*\ - FDCAN_TT_INT_START_OF_GAP + *\*\ - FDCAN_TT_INT_REG_TIME_MARK + *\*\ - FDCAN_TT_INT_TRIG_TIME_MARK + *\*\ - FDCAN_TT_INT_STOP_WATCH + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_WRAP + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_DISC + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_ERROR + *\*\ - FDCAN_TT_INT_TX_COUNT_UNDERFLOW + *\*\ - FDCAN_TT_INT_TX_COUNT_OVERFLOW + *\*\ - FDCAN_TT_INT_SCHEDULING_ERROR_1 + *\*\ - FDCAN_TT_INT_SCHEDULING_ERROR_2 + *\*\ - FDCAN_TT_INT_ERROR_LEVEL_CHANGE + *\*\ - FDCAN_TT_INT_INIT_WATCH_TRIGGER + *\*\ - FDCAN_TT_INT_WATCH_TRIGGER + *\*\ - FDCAN_TT_INT_APPLICATION_WATCHDOG + *\*\ - FDCAN_TT_INT_CONFIG_ERROR + *\*\return none + */ +void FDCAN_TT_EnableInt(FDCAN_Module *FDCANx, uint32_t TT_Int, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + FDCANx->TTIE |= TT_Int; + } + else + { + FDCANx->TTIE &= (~TT_Int); + } +} + + +/** + *\*\name FDCAN_TT_GetIntFlag. + *\*\fun Check whether the specified FDCAN TT interrupt is set or not. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param TT_Flag : + *\*\ - FDCAN_TT_FLAG_BASIC_CYCLE_START + *\*\ - FDCAN_TT_FLAG_MATRIX_CYCLE_START + *\*\ - FDCAN_TT_FLAG_SYNC_MODE_CHANGE + *\*\ - FDCAN_TT_FLAG_START_OF_GAP + *\*\ - FDCAN_TT_FLAG_REG_TIME_MARK + *\*\ - FDCAN_TT_FLAG_TRIG_TIME_MARK + *\*\ - FDCAN_TT_FLAG_STOP_WATCH + *\*\ - FDCAN_TT_FLAG_GLOBAL_TIME_WRAP + *\*\ - FDCAN_TT_FLAG_GLOBAL_TIME_DISC + *\*\ - FDCAN_TT_FLAG_GLOBAL_TIME_ERROR + *\*\ - FDCAN_TT_FLAG_TX_COUNT_UNDERFLOW + *\*\ - FDCAN_TT_FLAG_TX_COUNT_OVERFLOW + *\*\ - FDCAN_TT_FLAG_SCHEDULING_ERROR_1 + *\*\ - FDCAN_TT_FLAG_SCHEDULING_ERROR_2 + *\*\ - FDCAN_TT_FLAG_ERROR_LEVEL_CHANGE + *\*\ - FDCAN_TT_FLAG_INIT_WATCH_TRIGGER + *\*\ - FDCAN_TT_FLAG_WATCH_TRIGGER + *\*\ - FDCAN_TT_FLAG_APPLICATION_WATCHDOG + *\*\ - FDCAN_TT_FLAG_CONFIG_ERROR + *\*\return FlagStatus + *\*\ - RESET + *\*\ - SET + */ +FlagStatus FDCAN_TT_GetIntFlag(FDCAN_Module *FDCANx, uint32_t TT_Flag) +{ + /* Check whether the specified FDCAN TT interrupt is enable or not. */ + if((FDCANx->TTIE & TT_Flag) != TT_Flag ) + { + return RESET; + } + + /* Check whether the specified FDCAN TT interrupt flag is set or not. */ + if((FDCANx->TTIR & TT_Flag) != TT_Flag ) + { + return RESET; + } + + return SET; +} + +/** + *\*\name FDCAN_TT_GetFlag. + *\*\fun Check whether the specified FDCAN TT flag is set or not. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param TT_Flag : + *\*\ - FDCAN_TT_FLAG_BASIC_CYCLE_START + *\*\ - FDCAN_TT_FLAG_MATRIX_CYCLE_START + *\*\ - FDCAN_TT_FLAG_SYNC_MODE_CHANGE + *\*\ - FDCAN_TT_FLAG_START_OF_GAP + *\*\ - FDCAN_TT_FLAG_REG_TIME_MARK + *\*\ - FDCAN_TT_FLAG_TRIG_TIME_MARK + *\*\ - FDCAN_TT_FLAG_STOP_WATCH + *\*\ - FDCAN_TT_FLAG_GLOBAL_TIME_WRAP + *\*\ - FDCAN_TT_FLAG_GLOBAL_TIME_DISC + *\*\ - FDCAN_TT_FLAG_GLOBAL_TIME_ERROR + *\*\ - FDCAN_TT_FLAG_TX_COUNT_UNDERFLOW + *\*\ - FDCAN_TT_FLAG_TX_COUNT_OVERFLOW + *\*\ - FDCAN_TT_FLAG_SCHEDULING_ERROR_1 + *\*\ - FDCAN_TT_FLAG_SCHEDULING_ERROR_2 + *\*\ - FDCAN_TT_FLAG_ERROR_LEVEL_CHANGE + *\*\ - FDCAN_TT_FLAG_INIT_WATCH_TRIGGER + *\*\ - FDCAN_TT_FLAG_WATCH_TRIGGER + *\*\ - FDCAN_TT_FLAG_APPLICATION_WATCHDOG + *\*\ - FDCAN_TT_FLAG_CONFIG_ERROR + *\*\return FlagStatus + *\*\ - RESET + *\*\ - SET + */ +FlagStatus FDCAN_TT_GetFlag(FDCAN_Module *FDCANx, uint32_t TT_Flag) +{ + /* Check whether the specified FDCAN TT interrupt flag is set or not. */ + if((FDCANx->TTIR & TT_Flag) != TT_Flag ) + { + return RESET; + } + else + { + return SET; + } +} + +/** + *\*\name FDCAN_TT_ClearFlag. + *\*\fun Clear the specified FDCAN TT flag. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param TT_Flag : + *\*\ - FDCAN_TT_FLAG_BASIC_CYCLE_START + *\*\ - FDCAN_TT_FLAG_MATRIX_CYCLE_START + *\*\ - FDCAN_TT_FLAG_SYNC_MODE_CHANGE + *\*\ - FDCAN_TT_FLAG_START_OF_GAP + *\*\ - FDCAN_TT_FLAG_REG_TIME_MARK + *\*\ - FDCAN_TT_FLAG_TRIG_TIME_MARK + *\*\ - FDCAN_TT_FLAG_STOP_WATCH + *\*\ - FDCAN_TT_FLAG_GLOBAL_TIME_WRAP + *\*\ - FDCAN_TT_FLAG_GLOBAL_TIME_DISC + *\*\ - FDCAN_TT_FLAG_GLOBAL_TIME_ERROR + *\*\ - FDCAN_TT_FLAG_TX_COUNT_UNDERFLOW + *\*\ - FDCAN_TT_FLAG_TX_COUNT_OVERFLOW + *\*\ - FDCAN_TT_FLAG_SCHEDULING_ERROR_1 + *\*\ - FDCAN_TT_FLAG_SCHEDULING_ERROR_2 + *\*\ - FDCAN_TT_FLAG_ERROR_LEVEL_CHANGE + *\*\ - FDCAN_TT_FLAG_INIT_WATCH_TRIGGER + *\*\ - FDCAN_TT_FLAG_WATCH_TRIGGER + *\*\ - FDCAN_TT_FLAG_APPLICATION_WATCHDOG + *\*\ - FDCAN_TT_FLAG_CONFIG_ERROR + *\*\return none + */ +void FDCAN_TT_ClearFlag(FDCAN_Module *FDCANx, uint32_t TT_Flag) +{ + FDCANx->TTIR = TT_Flag; +} + +/** + *\*\name FDCAN_TT_ActivateInt. + *\*\fun Activate the specified FDCAN TT interrupts. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param TT_Int : + *\*\ - FDCAN_TT_INT_BASIC_CYCLE_START + *\*\ - FDCAN_TT_INT_MATRIX_CYCLE_START + *\*\ - FDCAN_TT_INT_SYNC_MODE_CHANGE + *\*\ - FDCAN_TT_INT_START_OF_GAP + *\*\ - FDCAN_TT_INT_REG_TIME_MARK + *\*\ - FDCAN_TT_INT_TRIG_TIME_MARK + *\*\ - FDCAN_TT_INT_STOP_WATCH + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_WRAP + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_DISC + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_ERROR + *\*\ - FDCAN_TT_INT_TX_COUNT_UNDERFLOW + *\*\ - FDCAN_TT_INT_TX_COUNT_OVERFLOW + *\*\ - FDCAN_TT_INT_SCHEDULING_ERROR_1 + *\*\ - FDCAN_TT_INT_SCHEDULING_ERROR_2 + *\*\ - FDCAN_TT_INT_ERROR_LEVEL_CHANGE + *\*\ - FDCAN_TT_INT_INIT_WATCH_TRIGGER + *\*\ - FDCAN_TT_INT_WATCH_TRIGGER + *\*\ - FDCAN_TT_INT_APPLICATION_WATCHDOG + *\*\ - FDCAN_TT_INT_CONFIG_ERROR + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus FDCAN_TT_ActivateInt(FDCAN_Module *FDCANx, uint32_t TT_Int) +{ + /* Check ActiveITs */ + if((TT_Int & FDCAN_TT_INT_MASK) == 0UL) + { + return ERROR; + } + + /* Enable Interrupt lines */ + if ((TT_Int & FDCANx->TTILS) == 0UL) + { + /* Enable Interrupt line 0 */ + FDCANx->ILE |= FDCAN_INTERRUPT_LINE0; + } + else if ((TT_Int & FDCANx->TTILS) == TT_Int) + { + /* Enable Interrupt line 1 */ + FDCANx->ILE |= FDCAN_INTERRUPT_LINE1; + } + else + { + /* Enable Interrupt lines 0 and 1 */ + FDCANx->ILE = (FDCAN_INTERRUPT_LINE0 | FDCAN_INTERRUPT_LINE1); + } + + /* Enable the selected TT interrupts */ + FDCAN_TT_EnableInt(FDCANx, TT_Int, ENABLE); + + return SUCCESS; +} + +/** + *\*\name FDCAN_TT_DeactivateInt. + *\*\fun Deactivate the specified FDCAN TT interrupts. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\param TT_Int : + *\*\ - FDCAN_TT_INT_BASIC_CYCLE_START + *\*\ - FDCAN_TT_INT_MATRIX_CYCLE_START + *\*\ - FDCAN_TT_INT_SYNC_MODE_CHANGE + *\*\ - FDCAN_TT_INT_START_OF_GAP + *\*\ - FDCAN_TT_INT_REG_TIME_MARK + *\*\ - FDCAN_TT_INT_TRIG_TIME_MARK + *\*\ - FDCAN_TT_INT_STOP_WATCH + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_WRAP + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_DISC + *\*\ - FDCAN_TT_INT_GLOBAL_TIME_ERROR + *\*\ - FDCAN_TT_INT_TX_COUNT_UNDERFLOW + *\*\ - FDCAN_TT_INT_TX_COUNT_OVERFLOW + *\*\ - FDCAN_TT_INT_SCHEDULING_ERROR_1 + *\*\ - FDCAN_TT_INT_SCHEDULING_ERROR_2 + *\*\ - FDCAN_TT_INT_ERROR_LEVEL_CHANGE + *\*\ - FDCAN_TT_INT_INIT_WATCH_TRIGGER + *\*\ - FDCAN_TT_INT_WATCH_TRIGGER + *\*\ - FDCAN_TT_INT_APPLICATION_WATCHDOG + *\*\ - FDCAN_TT_INT_CONFIG_ERROR + *\*\return none + */ +void FDCAN_TT_DeactivateInt(FDCAN_Module *FDCANx, uint32_t TT_Int) +{ + uint32_t IntLine; + uint32_t tempReg; + + /* Disable the selected TT interrupts */ + FDCAN_TT_EnableInt(FDCANx, TT_Int, DISABLE); + + IntLine = FDCANx->TTILS; + tempReg = FDCANx->ILE; + + if ((FDCANx->TTIE | IntLine) == IntLine) + { + /* Disable Interrupt line 0 */ + tempReg &= (~FDCAN_INTERRUPT_LINE0); + } + + if ((FDCANx->TTIE & IntLine) == 0U) + { + /* Disable Interrupt line 1 */ + tempReg &= (~FDCAN_INTERRUPT_LINE1); + } + + FDCANx->ILE = tempReg; +} + +/** + *\*\name FDCAN_InitMsgRam. + *\*\fun Calculate each RAM block start address and size, + *\*\ and also initialize global infomation parameter. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param FDCAN_InitParam:pointer to a FDCAN_InitType structure. + *\*\return ErrorStatus + *\*\ - ERROR + *\*\ - SUCCESS + */ +static ErrorStatus FDCAN_InitMsgRam(FDCAN_Module* FDCANx, FDCAN_InitType *FDCAN_InitParam) +{ + uint32_t ram; + uint32_t WordOffset; + uint32_t StartAddress; + uint32_t tempReg; + FDCAN_MsgRamType *pMsg; + + /* Config Message Ram base address,this address is shared by FDCAN1~8 */ + if(FDCAN_InitParam->MsgRamStrAddr == FDCAN_START_ADDRESS_SRAM5BANK1) + { + FDCANx->TTSS &= (~FDCAN_START_ADDRESS_RAMSEL); + StartAddress = FDCAN_START_ADDRESS_SRAM5BANK1; + } + else + { + FDCANx->TTSS |= FDCAN_START_ADDRESS_RAMSEL; + StartAddress = FDCAN_START_ADDRESS_SRAM5BANK2; + } + + FDCAN_ClearFlag(FDCANx, FDCAN_FLAG_RESERVED_ADDRESS_ACCESS); + + /* Config the message block for current FDCANx */ + pMsgRam[FDCAN_Get_Index(FDCANx)] = FDCAN_InitParam->pMsgInfo; + + pMsg = FDCAN_InitParam->pMsgInfo; + pMsg->RxFifo0Size = FDCAN_InitParam->RxFifo0Size; + pMsg->RxFifo1Size = FDCAN_InitParam->RxFifo1Size; + pMsg->RxBufferSize = FDCAN_InitParam->RxBufferSize; + pMsg->TxBufferSize = FDCAN_InitParam->TxBufferSize; + pMsg->RxFifo0DataSize = FDCAN_InitParam->RxFifo0DataSize; + pMsg->RxFifo1DataSize = FDCAN_InitParam->RxFifo1DataSize; + pMsg->RxBufferDataSize = FDCAN_InitParam->RxBufferDataSize; + pMsg->TxBufferDataSize = FDCAN_InitParam->TxBufferDataSize; + pMsg->LastTxFifoQReqBuf = 0; + + /* Config the registers raelated to Message Ram and global Message Ram paramter. + All address in register are actually the address offset, and counted in words. + Global Message Ram paramter counted in bytes */ + + /* Standard filter list start address */ + WordOffset = FDCAN_InitParam->MsgRamOffset; + tempReg = WordOffset << FDCAN_START_ADDRESS_OFFSET; + /* Standard filter elements number */ + tempReg |= FDCAN_InitParam->StdFilterSize << FDCAN_SIZE_NUMBER_OFFSET; + FDCANx->SIDFC = tempReg; + pMsg->StdFilterStrAddr = StartAddress + (WordOffset * 4UL); + + /* Extended filter list start address */ + WordOffset += FDCAN_InitParam->StdFilterSize; + tempReg = WordOffset << FDCAN_START_ADDRESS_OFFSET; + /* Extended filter elements number */ + tempReg |= FDCAN_InitParam->ExtFilterSize << FDCAN_SIZE_NUMBER_OFFSET; + FDCANx->XIDFC = tempReg; + pMsg->ExtFilterStrAddr = StartAddress + (WordOffset * 4UL); + + /* Rx FIFO 0 start address */ + WordOffset += (FDCAN_InitParam->ExtFilterSize * FDCAN_EXT_FILTER_WORDS); + tempReg = FDCANx->RXF0C & (~(FDCAN_RXF0C_F0SA | FDCAN_RXF0C_F0S)); + tempReg |= WordOffset << FDCAN_START_ADDRESS_OFFSET; + /* Rx FIFO 0 elements number */ + tempReg |= FDCAN_InitParam->RxFifo0Size << FDCAN_SIZE_NUMBER_OFFSET; + FDCANx->RXF0C = tempReg; + pMsg->RxFIFO0StrAddr = StartAddress + (WordOffset * 4UL); + + /* Rx FIFO 1 start address */ + WordOffset += (FDCAN_InitParam->RxFifo0Size * FDCAN_InitParam->RxFifo0DataSize); + tempReg = FDCANx->RXF1C & (~(FDCAN_RXF1C_F1SA | FDCAN_RXF1C_F1S)); + tempReg |= WordOffset << FDCAN_START_ADDRESS_OFFSET; + /* Rx FIFO 1 elements number */ + tempReg |= FDCAN_InitParam->RxFifo1Size << FDCAN_SIZE_NUMBER_OFFSET; + FDCANx->RXF1C = tempReg; + pMsg->RxFIFO1StrAddr = StartAddress + (WordOffset * 4UL); + + /* Rx buffer list start address */ + WordOffset += (FDCAN_InitParam->RxFifo1Size * FDCAN_InitParam->RxFifo1DataSize); + FDCANx->RXBC = WordOffset << FDCAN_START_ADDRESS_OFFSET; + pMsg->RxBufferStrAddr = StartAddress + (WordOffset * 4UL); + + /* Tx event FIFO start address */ + WordOffset += (FDCAN_InitParam->RxBufferSize * FDCAN_InitParam->RxBufferDataSize); + tempReg = FDCANx->TXEFC & (~(FDCAN_TXEFC_EFSA | FDCAN_TXEFC_EFS)); + tempReg |= WordOffset << FDCAN_START_ADDRESS_OFFSET; + /* Tx event FIFO elements number */ + tempReg |= FDCAN_InitParam->TxEventSize << FDCAN_SIZE_NUMBER_OFFSET; + FDCANx->TXEFC = tempReg; + pMsg->TxEventFIFOStrAddr = StartAddress + (WordOffset * 4UL); + + /* Tx buffer list start address */ + WordOffset += (FDCAN_InitParam->TxEventSize * FDCAN_TX_EVENT_FIFO_WORDS); + tempReg = FDCANx->TXBC & (~(FDCAN_TXBC_TBSA | FDCAN_TXBC_NDTB | FDCAN_TXBC_TFQS)); + tempReg |= WordOffset << FDCAN_START_ADDRESS_OFFSET; + /* Dedicated Tx buffers number */ + tempReg |= FDCAN_InitParam->TxBufferSize << FDCAN_SIZE_NUMBER_OFFSET; + pMsg->TxBufferStrAddr = StartAddress + (WordOffset * 4UL); + + /* Tx FIFO/queue elements number */ + tempReg |= FDCAN_InitParam->TxFifoQueueSize << FDCAN_TXBC_TFQS_OFFSET; + FDCANx->TXBC = tempReg; + WordOffset += (FDCAN_InitParam->TxBufferSize * FDCAN_InitParam->TxBufferDataSize); + pMsg->TxFIFOQueueStrAddr = StartAddress + (WordOffset * 4UL); + + WordOffset += (FDCAN_InitParam->TxFifoQueueSize * FDCAN_InitParam->TxBufferDataSize); + pMsg->EndAddress = StartAddress + (WordOffset * 4UL); + + /* Check last address of the Message RAM */ + if (pMsg->EndAddress > (StartAddress + FDCAN_MESSAGE_RAM_SIZE)) + { + return ERROR; + } + + /* Flush the allocated Message RAM area */ + for (ram = pMsg->StdFilterStrAddr; ram < pMsg->EndAddress; ram += 4UL) + { + *(uint32_t *)(ram) = 0UL; + } + + /* Return function status */ + return SUCCESS; +} + +/** + *\*\name FDCAN_CopyMsgToRAM. + *\*\fun Copy Tx message to the message RAM. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param pTxHeader :pointer to a FDCAN_TxHeaderType structure. + *\*\ - IdType + *\*\ - FDCAN_STANDARD_ID + *\*\ - FDCAN_EXTENDED_ID + *\*\ - ID + *\*\ This parameter must be a value between: + *\*\ - 0 and 0x7FF, if IdType is FDCAN_STANDARD_ID + *\*\ - 0 and 0x1FFFFFFF, if IdType is FDCAN_EXTENDED_ID + *\*\ - TxFrameType + *\*\ - FDCAN_DATA_FRAME + *\*\ - FDCAN_REMOTE_FRAME + *\*\ - DataLength + *\*\ - FDCAN_DLC_BYTES_0 + *\*\ - FDCAN_DLC_BYTES_1 + *\*\ - FDCAN_DLC_BYTES_2 + *\*\ - FDCAN_DLC_BYTES_3 + *\*\ - FDCAN_DLC_BYTES_4 + *\*\ - FDCAN_DLC_BYTES_5 + *\*\ - FDCAN_DLC_BYTES_6 + *\*\ - FDCAN_DLC_BYTES_7 + *\*\ - FDCAN_DLC_BYTES_8 + *\*\ - FDCAN_DLC_BYTES_12 + *\*\ - FDCAN_DLC_BYTES_16 + *\*\ - FDCAN_DLC_BYTES_20 + *\*\ - FDCAN_DLC_BYTES_24 + *\*\ - FDCAN_DLC_BYTES_32 + *\*\ - FDCAN_DLC_BYTES_48 + *\*\ - FDCAN_DLC_BYTES_64 + *\*\ - ErrorState + *\*\ - FDCAN_ESI_ACTIVE + *\*\ - FDCAN_ESI_PASSIVE + *\*\ - BitRateSwitch + *\*\ - FDCAN_BRS_OFF + *\*\ - FDCAN_BRS_ON + *\*\ - FDFormat + *\*\ - FDCAN_CLASSIC_CAN + *\*\ - FDCAN_FD_CAN + *\*\ - TxEventFifo + *\*\ - FDCAN_NO_TX_EVENTS + *\*\ - FDCAN_STORE_TX_EVENTS + *\*\ - MsgMarker + *\*\ This parameter must be a value between 0 and 0xFF + *\*\param pTxData pointer to a buffer containing the payload of the Tx frame. + *\*\param BufferIndex index of the buffer to be configured. + *\*\return none + */ +static void FDCAN_CopyMsgToRAM(FDCAN_Module *FDCANx, FDCAN_TxHeaderType *pTxHeader, uint8_t *pTxData, uint32_t BufferIndex) +{ + uint32_t *TxAddress; + uint32_t Cnt; + uint8_t *pRam; + FDCAN_MsgRamType *pMsg; + + pMsg = pMsgRam[FDCAN_Get_Index(FDCANx)]; + + /* Calculate Tx element address */ + TxAddress = (uint32_t *)(pMsg->TxBufferStrAddr + (BufferIndex * pMsg->TxBufferDataSize * 4UL)); + + /* Build and write first word of Tx header element to ram */ + if (pTxHeader->IdType == FDCAN_STANDARD_ID) + { + *TxAddress = ( pTxHeader->ErrorState \ + | FDCAN_STANDARD_ID \ + | pTxHeader->TxFrameType \ + | (pTxHeader->ID << FDCAN_ELEMENT_STDID_OFFSET) ); + } + else /* pTxHeader->IdType == FDCAN_EXTENDED_ID */ + { + *TxAddress = ( pTxHeader->ErrorState \ + | FDCAN_EXTENDED_ID \ + | pTxHeader->TxFrameType \ + | pTxHeader->ID ); + } + + /* Increment TxAddress pointer to second word of Tx header element */ + TxAddress++; + + /* Build and write second word of Tx header element to ram */ + *TxAddress = ( (pTxHeader->MsgMarker << FDCAN_ELEMENT_MM_OFFSET) \ + | pTxHeader->TxEventFifo \ + | pTxHeader->FDFormat \ + | pTxHeader->BitRateSwitch \ + | pTxHeader->DataLength); + + /* Increment TxAddress pointer to Tx data */ + TxAddress++; + pRam = (uint8_t *)TxAddress; + + /* Write Tx payload to the message RAM */ + for (Cnt = 0; Cnt < DLCtoBytes[pTxHeader->DataLength >> FDCAN_ELEMENT_DLC_OFFSET]; Cnt++) + { + pRam[Cnt] = pTxData[Cnt]; + } +} + +/** + *\*\name FDCAN_ConfigExtTSDivider. + *\*\fun Config the clock diveder of external timestamp clock. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Div : + *\*\ - FDCAN_EXT_TIMESTAMP_DIV_4 + *\*\ - FDCAN_EXT_TIMESTAMP_DIV_8 + *\*\ - FDCAN_EXT_TIMESTAMP_DIV_16 + *\*\ - FDCAN_EXT_TIMESTAMP_DIV_32 + *\*\ - FDCAN_EXT_TIMESTAMP_DIV_64 + *\*\ - FDCAN_EXT_TIMESTAMP_DIV_128 + *\*\ - FDCAN_EXT_TIMESTAMP_DIV_256 + *\*\ - FDCAN_EXT_TIMESTAMP_DIV_512 + *\*\return none + */ +void FDCAN_ConfigExtTSDivider(FDCAN_Module *FDCANx, uint32_t Div) +{ + uint32_t tempReg; + + tempReg = FDCANx->TTSS & (~FDCAN_TTSS_TS_SEL); + tempReg |= Div; + FDCANx->TTSS = tempReg; +} + +/** + *\*\name FDCAN_EnableExtTS. + *\*\fun Enalbe or disable the external timestamp. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\param Cmd : + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none + */ +void FDCAN_EnableExtTS(FDCAN_Module *FDCANx, FunctionalState Cmd) +{ + uint32_t tempReg; + + tempReg = FDCANx->TTSS & (~FDCAN_TTSS_TS_EN); + + if(Cmd != DISABLE) + { + tempReg |= FDCAN_EXT_TIMESTAMP_ENABLE; + } + + FDCANx->TTSS = tempReg; +} + + +/** + *\*\name FDCAN_Get_Index. + *\*\fun Get the index number of FDCANx. + *\*\param FDCANx : + *\*\ - FDCAN1 + *\*\ - FDCAN2 + *\*\ - FDCAN3 + *\*\ - FDCAN4 + *\*\ - FDCAN5 + *\*\ - FDCAN6 + *\*\ - FDCAN7 + *\*\ - FDCAN8 + *\*\return none + */ +static uint8_t FDCAN_Get_Index(FDCAN_Module *FDCANx) +{ + uint32_t FDCANIndex; + + if(FDCANx == FDCAN1) + { + FDCANIndex = 0; + } + else if(FDCANx == FDCAN2) + { + FDCANIndex = 1; + } + else if(FDCANx == FDCAN3) + { + FDCANIndex = 2; + } + else if(FDCANx == FDCAN4) + { + FDCANIndex = 3; + } + else if(FDCANx == FDCAN5) + { + FDCANIndex = 4; + } + else if(FDCANx == FDCAN6) + { + FDCANIndex = 5; + } + else if(FDCANx == FDCAN7) + { + FDCANIndex = 6; + } + else + { + FDCANIndex = 7; + } + + return (uint8_t)FDCANIndex; +} + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_femc.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_femc.c new file mode 100644 index 0000000000..6f08c95723 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_femc.c @@ -0,0 +1,951 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_femc.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_femc.h" +#include "n32h76x_78x_rcc.h" +#include "stdio.h" + + +/** +*\*\name FEMC_Init. +*\*\fun Initializes the FEMC according to the specified parameters in the FEMC_InitStruct. +*\*\param FEMC_InitStruct : pointer to a FEMC_InitType +*\*\ structure that contains the configuration information for +*\*\ the FEMC specified Bank or Blocks. +*\*\return none +**/ +void FEMC_Init(FEMC_InitType *FEMC_InitStruct) +{ + /* Set FEMC timing.*/ + FEMC->FEMC_TCFG = ((( FEMC_InitStruct->TimingCfg.Trc << (0)) | \ + (FEMC_InitStruct->TimingCfg.Twc << (4)) | \ + (FEMC_InitStruct->TimingCfg.Tcere << (8)) | \ + (FEMC_InitStruct->TimingCfg.Twp << (11)) | \ + (FEMC_InitStruct->TimingCfg.Tpcclr << (14)) | \ + (FEMC_InitStruct->TimingCfg.Ttrar << (17)) | \ + (FEMC_InitStruct->TimingCfg.Twerr << (20))) & \ + (0x00FFFFFF)); + + /* Set FEMC chip configuration.*/ + FEMC->FEMC_OMCFG = ((FEMC_InitStruct->ChipCfg.ReadSyncMode | \ + FEMC_InitStruct->ChipCfg.ReadBurstLen | \ + FEMC_InitStruct->ChipCfg.WriteSyncMode | \ + FEMC_InitStruct->ChipCfg.WriteBurstLen | \ + FEMC_InitStruct->ChipCfg.MemWidth | \ + FEMC_InitStruct->ChipCfg.BAA | \ + FEMC_InitStruct->ChipCfg.ADV | \ + FEMC_InitStruct->ChipCfg.BLSS | \ + FEMC_InitStruct->ChipCfg.BurstAlign) & + (0x0000FFFF)); +} + +/** +*\*\name FEMC_InitStruct. +*\*\fun Fills each FEMC_InitStruct member with its default value. +*\*\param FEMC_InitStruct pointer to a FEMC_InitType structure which will be initialized. +*\*\return none +**/ +void FEMC_InitStruct(FEMC_InitType* FEMC_InitStruct) +{ + /* Reset NOR/SRAM Init structure parameters values */ + FEMC_InitStruct->TimingCfg.Trc = 0; + FEMC_InitStruct->TimingCfg.Twc = 0; + FEMC_InitStruct->TimingCfg.Tcere = 0; + FEMC_InitStruct->TimingCfg.Twp = 0; + FEMC_InitStruct->TimingCfg.Tpcclr = 0; + FEMC_InitStruct->TimingCfg.Ttrar = 0; + FEMC_InitStruct->TimingCfg.Twerr = 0; + + FEMC_InitStruct->ChipCfg.ReadSyncMode = FEMC_MEM_READ_ASYNC; + FEMC_InitStruct->ChipCfg.ReadBurstLen = FEMC_MEM_READ_BURST_1; + FEMC_InitStruct->ChipCfg.WriteSyncMode = FEMC_MEM_WRITE_ASYNC; + FEMC_InitStruct->ChipCfg.WriteBurstLen = FEMC_MEM_WRITE_BURST_1; + FEMC_InitStruct->ChipCfg.MemWidth = FEMC_MEMORY_WIDTH_16BIT; + FEMC_InitStruct->ChipCfg.BAA = FEMC_BAA_PORT_DISABLE; + FEMC_InitStruct->ChipCfg.ADV = FEMC_ADV_PORT_DISABLE; + FEMC_InitStruct->ChipCfg.BLSS = FEMC_BLS_SYNC_CS; + FEMC_InitStruct->ChipCfg.BurstAlign = FEMC_BURST_SPLIT_ON_256; +} + +/** +*\*\name FEMC_EnableNorSram. +*\*\fun Enables or disables the specified NOR/SRAM Memory Bank. +*\*\param Chip: The chip number. +*\*\ - SRAM_NOR_CHIP_1: SRAM Chip 1 +*\*\ - SRAM_NOR_CHIP_2: SRAM Chip 2 +*\*\ - SRAM_NOR_CHIP_3: SRAM Chip 3 +*\*\ - SRAM_NOR_CHIP_4: SRAM Chip 4 +*\*\ - NAND_CHIP_1: NAND Chip 1 +*\*\ - NAND_CHIP_2: NAND Chip 2 +*\*\param Cmd: The command +*\*\ - FEMC_CMD_UPDATEREGS_AND_AXI: +*\*\ - FEMC_CMD_MDREGCONFIG: Configure mode register +*\*\ - FEMC_CMD_UPDATEREGS: Update mode register +*\*\ - FEMC_CMD_MDREGCONFIG_AND_UPDATEREGS: Configure mode register and update +*\*\param CrePolarity : +*\*\ - FEMC_CRE_POLARITY_LOW: CRE is LOW +*\*\ - FEMC_CRE_POLARITY_HIGH: CRE is HIGH when ModeReg write occurs +*\*\param Address: 0~0x000FFFFF +*\*\ The address parameter is valid when CMD type is MdRegConfig or MdRegConfig and UpdateRegs only. +*\*\return none +**/ +void FEMC_SetCommand(uint32_t Chip, uint32_t Cmd, uint32_t CrePolarity, uint32_t Address) +{ + /* Set FEMC_CTRL register for FEMC.*/ + FEMC->FEMC_CTRL = (Address | CrePolarity | Cmd | (Chip << 23)); +} + +/** +*\*\name FEMC_CheckChipStatus. +*\*\fun Check FEMC chip status register value. +*\*\param Chip: The chip number. +*\*\ - SRAM_NOR_CHIP_1: SRAM Chip 1 +*\*\ - SRAM_NOR_CHIP_2: SRAM Chip 2 +*\*\ - SRAM_NOR_CHIP_3: SRAM Chip 3 +*\*\ - SRAM_NOR_CHIP_4: SRAM Chip 4 +*\*\ - NAND_CHIP_1: NAND Chip 1 +*\*\ - NAND_CHIP_2: NAND Chip 2 +*\*\param ChipCfg: Pointer to a FEMC_ChipInitType structure +*\*\return SUCCESS or ERROR +**/ +ErrorStatus FEMC_CheckChipStatus(uint32_t Chip, FEMC_ChipInitType *ChipCfg) +{ + uint32_t temp_value; + uint32_t FEMC_OPMODE_Value = 0; + + temp_value = ((ChipCfg->ReadSyncMode | \ + ChipCfg->ReadBurstLen | \ + ChipCfg->WriteSyncMode | \ + ChipCfg->WriteBurstLen | \ + ChipCfg->MemWidth | \ + ChipCfg->BAA | \ + ChipCfg->ADV | \ + ChipCfg->BLSS | \ + ChipCfg->BurstAlign) & (0x0000FFFF)) ; + + switch(Chip) + { + case SRAM_NOR_CHIP_1: + FEMC_OPMODE_Value = FEMC->block1.FEMC_SNOMSTS; + temp_value |= (FEMC->FEMC_SNADD1 & (0xFFFF0000)); + break; + + case SRAM_NOR_CHIP_2: + FEMC_OPMODE_Value = FEMC->block2.FEMC_SNOMSTS; + temp_value |= (FEMC->FEMC_SNADD2 & (0xFFFF0000)); + break; + + case SRAM_NOR_CHIP_3: + FEMC_OPMODE_Value = FEMC->block3.FEMC_SNOMSTS; + temp_value |= (FEMC->FEMC_SNADD3 & (0xFFFF0000)); + break; + + case SRAM_NOR_CHIP_4: + FEMC_OPMODE_Value = FEMC->block4.FEMC_SNOMSTS; + temp_value |= (FEMC->FEMC_SNADD4 & (0xFFFF0000)); + break; + + case NAND_CHIP_1: + FEMC_OPMODE_Value = FEMC->bank1.FEMC_NOMSTS; + temp_value |= (FEMC->FEMC_NADD1 & (0xFFFF0000)); + break; + + case NAND_CHIP_2: + FEMC_OPMODE_Value = FEMC->bank2.FEMC_NOMSTS; + temp_value |= (FEMC->FEMC_NADD2 & (0xFFFF0000)); + break; + + default: + break; + } + + return (temp_value == FEMC_OPMODE_Value) ? SUCCESS : ERROR; +} + +/** +*\*\name FEMC_CheckTimingStatus. +*\*\fun Check FEMC timing status register value. +*\*\param Chip: The chip number. +*\*\ - SRAM_NOR_CHIP_1: SRAM Chip 1 +*\*\ - SRAM_NOR_CHIP_2: SRAM Chip 2 +*\*\ - SRAM_NOR_CHIP_3: SRAM Chip 3 +*\*\ - SRAM_NOR_CHIP_4: SRAM Chip 4 +*\*\ - NAND_CHIP_1: NAND Chip 1 +*\*\ - NAND_CHIP_2: NAND Chip 2 +*\*\param ChipCfg: Pointer to a FEMC_ChipInitType structure +*\*\return SUCCESS or ERROR +**/ +ErrorStatus FEMC_CheckTimingStatus(uint32_t Chip, FEMC_TimingInitType *TimingCfg) +{ + uint32_t temp_value; + uint32_t FEMC_Timing_Value = 0; + + temp_value = ((TimingCfg->Trc << (0)) | \ + (TimingCfg->Twc << (4)) | \ + (TimingCfg->Tcere << (8)) | \ + (TimingCfg->Twp << (11)) | \ + (TimingCfg->Tpcclr << (14)) | \ + (TimingCfg->Ttrar << (17)) | \ + (TimingCfg->Twerr << (20))) & (0x00FFFFFF); + + switch(Chip) + { + case SRAM_NOR_CHIP_1: + FEMC_Timing_Value = FEMC->block1.FEMC_SNTSTS; + break; + + case SRAM_NOR_CHIP_2: + FEMC_Timing_Value = FEMC->block2.FEMC_SNTSTS; + break; + + case SRAM_NOR_CHIP_3: + FEMC_Timing_Value = FEMC->block3.FEMC_SNTSTS; + break; + + case SRAM_NOR_CHIP_4: + FEMC_Timing_Value = FEMC->block4.FEMC_SNTSTS; + break; + + case NAND_CHIP_1: + FEMC_Timing_Value = FEMC->bank1.FEMC_NTSTS; + break; + + case NAND_CHIP_2: + FEMC_Timing_Value = FEMC->bank2.FEMC_NTSTS; + break; + + default: + break; + } + + return (temp_value == FEMC_Timing_Value) ? SUCCESS : ERROR; +} + +/** +*\*\name FEMC_SetRefreshPeriod. +*\*\fun Set FEMC refresh period value. +*\*\param PeriodVal: 0~0x0F The FEMC refresh period value +*\*\return none +**/ +void FEMC_SetRefreshPeriod(uint32_t PeriodVal) +{ + FEMC->FEMC_RPE = PeriodVal; +} + +/** +*\*\name FEMC_GetRefreshPeriod. +*\*\fun Get FEMC refresh period value. +*\*\param +*\*\return The FEMC refresh period value +**/ +uint32_t FEMC_GetRefreshPeriod(void) +{ + return (FEMC->FEMC_RPE & 0x0F); +} + +/** +*\*\name FEMC_SetAddressmatch. +*\*\fun Set address and mask value for specific chip region. +*\*\param Chip: The chip number. +*\*\ - SRAM_NOR_CHIP_1: SRAM Chip 1 +*\*\ - SRAM_NOR_CHIP_2: SRAM Chip 2 +*\*\ - SRAM_NOR_CHIP_3: SRAM Chip 3 +*\*\ - SRAM_NOR_CHIP_4: SRAM Chip 4 +*\*\ - NAND_CHIP_1: NAND Chip 1 +*\*\ - NAND_CHIP_2: NAND Chip 2 +*\*\param Address_Match_Value: 0, 0X00010000~ 0xFFFF0000 The address and mask value for specific chip region +*\*\return SUCCESS or ERROR +**/ +void FEMC_SetAddressmatch(uint32_t Chip, uint32_t Address_Match_Value) +{ + switch(Chip) + { + case SRAM_NOR_CHIP_1: + FEMC->FEMC_SNADD1 = Address_Match_Value; + break; + + case SRAM_NOR_CHIP_2: + FEMC->FEMC_SNADD2 = Address_Match_Value; + break; + + case SRAM_NOR_CHIP_3: + FEMC->FEMC_SNADD3 = Address_Match_Value; + break; + + case SRAM_NOR_CHIP_4: + FEMC->FEMC_SNADD4 = Address_Match_Value; + break; + + case NAND_CHIP_1: + FEMC->FEMC_NADD1 = Address_Match_Value; + break; + + case NAND_CHIP_2: + FEMC->FEMC_NADD2 = Address_Match_Value; + break; + + default: + break; + } + +} + +/** +*\*\name SRAM_MuxModeEnable. +*\*\fun Enable or disable the SRAM interface multiplexed mode. +*\*\param NewState: new state of the multiplexed mode. +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FEMC_SRAMMuxModeEnable(FunctionalState NewState) +{ + if(NewState == ENABLE) + { + FEMC->FEMC_SNMOD |= FEMC_SNMOD_MUXEN; + } + else + { + FEMC->FEMC_SNMOD &= ~FEMC_SNMOD_MUXEN; + } +} + +/** +*\*\name FEMC_SRAMAGTMEnable. +*\*\fun Enable or disable aclk faster than SRAM clock. +*\*\param NewState: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FEMC_SRAMAGTMEnable(FunctionalState NewState) +{ + if(NewState == ENABLE) + { + FEMC->FEMC_SNMOD |= FEMC_SNMOD_AGTM; + } + else + { + FEMC->FEMC_SNMOD &= ~FEMC_SNMOD_AGTM; + } +} + +/** +*\*\name FEMC_SRAMSYNCEnable. +*\*\fun Enable or disable the SRAM clock synchronous to aclk. +*\*\param NewState: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FEMC_SRAMSYNCEnable(FunctionalState NewState) +{ + if(NewState == ENABLE) + { + FEMC->FEMC_SNMOD |= FEMC_SNMOD_SYNC; + } + else + { + FEMC->FEMC_SNMOD &= ~FEMC_SNMOD_SYNC; + } +} + +/** +*\*\name FEMC_NANDCSLEnable. +*\*\fun Enable or disable NAND chip select remains asserted between the address phase and data phase. +*\*\param NewState: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FEMC_NANDCSLEnable(FunctionalState NewState) +{ + if(NewState == ENABLE) + { + FEMC->FEMC_NMOD |= FEMC_NMOD_CSL; + } + else + { + FEMC->FEMC_NMOD &= ~FEMC_NMOD_CSL; + } +} + + +/** +*\*\name FEMC_NANDAGTMEnable. +*\*\fun Enable or disable aclk faster than NAND clock. +*\*\param NewState: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FEMC_NANDAGTMEnable(FunctionalState NewState) +{ + if(NewState == ENABLE) + { + FEMC->FEMC_NMOD |= FEMC_NMOD_AGTM; + } + else + { + FEMC->FEMC_NMOD &= ~FEMC_NMOD_AGTM; + } +} + +/** +*\*\name FEMC_NANDSYNCEnable. +*\*\fun Enable or disable the NAND clock synchronous to aclk. +*\*\param NewState: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FEMC_NANDSYNCEnable(FunctionalState NewState) +{ + if(NewState == ENABLE) + { + FEMC->FEMC_NMOD |= FEMC_NMOD_SYNC; + } + else + { + FEMC->FEMC_NMOD &= ~FEMC_NMOD_SYNC; + } +} + +/** +*\*\name FEMC_RemapEnable. +*\*\fun Enable or disable the FEMC SRAM interface remap to SDRAM. +*\*\param NewState: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FEMC_RemapEnable(FunctionalState NewState) +{ + if(NewState == ENABLE) + { + FEMC->FEMC_REMAP |= FEMC_REMAP_REMAP; + } + else + { + FEMC->FEMC_REMAP &= ~FEMC_REMAP_REMAP; + } +} + +/** +*\*\name FEMC_ClrFlag. +*\*\fun Clears the FEMC's flags. +*\*\param FEMC_FLAG: +*\*\ - FEMC_SRAM_FLAG_CLEAR +*\*\ - FEMC_NAND_FLAG_CLEAR +*\*\return none +**/ +void FEMC_ClrFlag(uint32_t FEMC_FLAG) +{ + FEMC->FEMC_CCFG |= FEMC_FLAG; +} + +/** +*\*\name FEMC_GetFlag. +*\*\fun Checks whether the specified flag is set or not. +*\*\param FEMC_FLAG +*\*\ - FEMC_SRAM_FLAG +*\*\ - FEMC_NAND_FLAG +*\*\ - FEMC_ECC_FLAG +*\*\ - FEMC_SRAM_EN_FLAG +*\*\ - FEMC_NAND_EN_FLAG +*\*\ - FEMC_ECC_EN_FLAG +*\*\return FlagStatus +*\*\ - SET : the flag is set +*\*\ - RESET : the flag is reset +**/ +FlagStatus FEMC_GetFlag(uint32_t FEMC_FLAG) +{ + FlagStatus bitstatus; + + /* Check the status of the specified I2C flag */ + if ((FEMC->FEMC_STS & FEMC_FLAG) != (uint32_t)RESET) + { + /* FEMC_IT is set */ + bitstatus = SET; + } + else + { + /* FEMC_IT is reset */ + bitstatus = RESET; + } + + /* Return the FEMC_IT status */ + return bitstatus; +} + +/** +*\*\name FEMC_ITConfig. +*\*\fun Enables or disables the specified FEMC interrupts. +*\*\param FEMC_IT: +*\*\ - FEMC_IT_SRAM_EN +*\*\ - FEMC_IT_NAND_EN +*\*\ - FEMC_IT_ECC_EN +*\*\param NewState: new state of the multiplexed mode. +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FEMC_ITConfig(uint32_t FEMC_IT, FunctionalState NewState) +{ + if (NewState != DISABLE) + { + /* Enable the selected FEMC interrupts */ + FEMC->FEMC_CFG |= FEMC_IT; + } + else + { + /* Disable the selected FEMC interrupts */ + FEMC->FEMC_CCFG |= FEMC_IT; + } +} + +/** +*\*\name FEMC_ClrITFlag. +*\*\fun Clears the FEMC's interrupt pending flags. +*\*\param FEMC_FLAG: +*\*\ - FEMC_IT_SRAM_FLAG_CLEAR +*\*\ - FEMC_IT_NAND_FLAG_CLEAR +*\*\return none +**/ +void FEMC_ClrITFlag(uint32_t FEMC_FLAG) +{ + FEMC->FEMC_CCFG |= FEMC_FLAG; +} + +/** +*\*\name FEMC_GetITFlag. +*\*\fun Checks whether the specified interrupt flag is set or not. +*\*\param FEMC_IT_FLAG +*\*\ - FEMC_IT_SRAM_FLAG +*\*\ - FEMC_IT_NAND_FLAG +*\*\ - FEMC_IT_ECC_FLAG +*\*\return ITStatus +*\*\ - SET : the interrupt flag is set +*\*\ - RESET : the interrupt flag is reset +**/ +ITStatus FEMC_GetITFlag(uint32_t FEMC_IT_FLAG) +{ + ITStatus bitstatus; + + /* Check the status of the specified I2C flag */ + if ((FEMC->FEMC_STS & FEMC_IT_FLAG) != (uint32_t)RESET) + { + /* FEMC_IT is set */ + bitstatus = SET; + } + else + { + /* FEMC_IT is reset */ + bitstatus = RESET; + } + + /* Return the FEMC_IT status */ + return bitstatus; +} + +/** +*\*\name FEMC_AsyncADVConfig. +*\*\fun Enables or disables the ADC singal same as multiplexed mode in asynchronous mode. +*\*\param NewState: new state of the multiplexed mode. +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FEMC_AsyncADVConfig(FunctionalState NewState) +{ + if (NewState != DISABLE) + { + /* Enable the selected FEMC interrupts */ + FEMC->FEMC_CFG |= FEMC_CFG_ASYNCADV; + } + else + { + /* Disable the selected FEMC interrupts */ + FEMC->FEMC_CCFG |= FEMC_CFG_ASYNCADV; + } +} + +/** +*\*\name FEMC_GetSRAMType. +*\*\fun Get FEMC SRAM interface type. +*\*\return none +**/ +uint32_t FEMC_GetSRAMType(void) +{ + uint32_t status; + /* Enable the selected FEMC interrupts */ + status = FEMC->FEMC_STS1 & 0x03; + + return status; +} + +/** +*\*\name FEMC_ECC_Init. +*\*\fun Initialize FEMC ECC function. +*\*\param ECCInitType Pointer to a FEMC_ECCInitType structure +*\*\return none +**/ +void FEMC_ECC_Init(const FEMC_ECCInitType *ECCInitType) +{ + uint32_t temp_value; + + /* Check the pointer pstcInit */ + + temp_value = (( ECCInitType->BLKNum | \ + ECCInitType->Mode | \ + ECCInitType->ReadMode | \ + ECCInitType->JUMP | \ + ECCInitType->A8OUTMSK | \ + ECCInitType->ReadINT | \ + ECCInitType->ABTINT | \ + ECCInitType->EXTBLKEN | \ + ECCInitType->EXTBLKSize) & (0x00001FFF)); + FEMC->FEMC_ECCCFG = temp_value; + FEMC->FEMC_ECCMD0 = ECCInitType->CMD0; + FEMC->FEMC_ECCMD1 = ECCInitType->CMD1; +} + +/** +*\*\name FEMC_SetECCAddr. +*\*\fun Set the FEMC ECC data start address. +*\*\param address0: FEMC ECC data start address 0. +*\*\param address0: FEMC ECC data start address 1. +*\*\return none +**/ +void FEMC_SetECCAddr(uint32_t address0, uint32_t address1) +{ + FEMC->FEMC_ECCADDR0 = address0; + FEMC->FEMC_ECCADDR1 = address1; +} + +/** +*\*\name FEMC_GetECCFlag. +*\*\fun Get the FEMC ECC flag status. +*\*\param FEMC_ECC_Flag_Index +*\*\ - FEMC_ECC_FLAG_VALUE_VALID +*\*\ - FEMC_ECC_FLAG_FAIL +*\*\ - FEMC_ECC_FLAG_CAN_CORRECT +*\*\ - FEMC_ECC_FLAG_READ +*\*\param ECC_Block_Index +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX0 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX1 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX2 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX3 +*\*\ - FEMC_ECC_PAGE_BLOCK_EXTRA +*\*\return FlagStatus +*\*\ - SET : The state of specific flag is set +*\*\ - RESET : The state of specific flag is reset +**/ +FlagStatus FEMC_GetECCFlag(uint32_t FEMC_ECC_Flag_Index, uint32_t ECC_Block_Index) +{ + FlagStatus status = RESET; + + if(FEMC->FEMC_ECCSTS & (FEMC_ECC_Flag_Index << ECC_Block_Index)) + { + status = SET; + } + else + { + status = RESET; + } + + return status; +} + +/** +*\*\name FEMC_GetECCITFlag. +*\*\fun Get the FEMC ECC interrupt status. +*\*\param ECC_Block_Index +*\*\ - FEMC_ECC_INT_FLAG_PAGE_BLOCK0 +*\*\ - FEMC_ECC_INT_FLAG_PAGE_BLOCK1 +*\*\ - FEMC_ECC_INT_FLAG_PAGE_BLOCK2 +*\*\ - FEMC_ECC_INT_FLAG_PAGE_BLOCK3 +*\*\ - FEMC_ECC_INT_FLAG_PAGE_EXTRA +*\*\ - FEMC_ECC_INT_FLAG_ABORT +*\*\return FlagStatus +*\*\ - SET : the flag is set +*\*\ - RESET : the flag is reset +**/ +FlagStatus FEMC_GetECCITFlag(uint32_t ECC_Block_Index) +{ + FlagStatus status = RESET; + + if(FEMC->FEMC_ECCSTS & ECC_Block_Index) + { + status = SET; + } + else + { + status = RESET; + } + + return status; +} + +/** +*\*\name FEMC_ECCClrFlag. +*\*\fun Clear the FEMC ECC interrupt. +*\*\param ECC_Block_Index +*\*\ - FEMC_ECC_INT_FLAG_PAGE_BLOCK0 +*\*\ - FEMC_ECC_INT_FLAG_PAGE_BLOCK1 +*\*\ - FEMC_ECC_INT_FLAG_PAGE_BLOCK2 +*\*\ - FEMC_ECC_INT_FLAG_PAGE_BLOCK3 +*\*\ - FEMC_ECC_INT_FLAG_PAGE_EXTRA +*\*\ - FEMC_ECC_INT_FLAG_ABORT +*\*\return none +**/ +void FEMC_ECCClrFlag(uint32_t ECC_Block_Index) +{ + FEMC->FEMC_ECCSTS = ECC_Block_Index; +} + +/** +*\*\name FEMC_GetECCStatus. +*\*\fun Get the FEMC ECC status. +*\*\param none +*\*\return FlagStatus +*\*\ - SET : the ecc status is busy +*\*\ - RESET : the ecc status is idle +**/ +FlagStatus FEMC_GetECCBusyFlag(void) +{ + FlagStatus status = RESET; + + if(FEMC->FEMC_ECCSTS & FEMC_ECCSTS_BUSY) + { + status = SET; + } + else + { + status = RESET; + } + + return status; +} + +/** +*\*\name FEMC_GetECCLastStatus. +*\*\fun Get the FEMC Last ECC status. +*\*\param none +*\*\return ECC_Last_Stats +*\*\ - Completed_Success +*\*\ - Unaligned_Range +*\*\ - Data_Stop +*\*\ - Data_Stop_No_Read +**/ +ECC_Last_Stats FEMC_GetECCLastSTS(void) +{ + ECC_Last_Stats status = COMPLETE; + + if((FEMC->FEMC_ECCSTS & FEMC_ECCSTS_LASTS) == FEMC_ECC_LAST_STATUS_COMPLETE) + { + status = COMPLETE; + } + else if((FEMC->FEMC_ECCSTS & FEMC_ECCSTS_LASTS) == FEMC_ECC_LAST_STATUS_UNALIGNADDR) + { + status = UNALIGNADDR; + } + else if((FEMC->FEMC_ECCSTS & FEMC_ECCSTS_LASTS) == FEMC_ECC_LAST_STATUS_DATASTOP) + { + status = DATASTOP; + } + else if((FEMC->FEMC_ECCSTS & FEMC_ECCSTS_LASTS) == FEMC_ECC_LAST_STATUS_DATASTOP_NOREAD) + { + status = DATASTOP_NOREAD; + } + + return status; +} + +/** +*\*\name FEMC_GetECCRWSTS. +*\*\fun Get the FEMC ECC write or read status. +*\*\param none +*\*\return FlagStatus +*\*\ - SET : the ecc is read status +*\*\ - RESET : the ecc is write status +**/ +FlagStatus FEMC_GetECCRWFlag(void) +{ + FlagStatus status = SET; + + if(FEMC->FEMC_ECCSTS & FEMC_ECCSTS_WRF) + { + status = SET; + } + else + { + status = RESET; + } + + return status; +} + +/** +*\*\name FEMC_GetECCBlockSTS. +*\*\fun Get the FEMC ECC page block status. +*\*\param ECC_Block_Index +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX0 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX1 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX2 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX3 +*\*\ - FEMC_ECC_PAGE_BLOCK_EXTRA +*\*\param FEMC_Block_Flag_Index: specifies which flag status to get. +*\*\ - FEMC_ECC_BLOCK_FLAG_CAN_CORRECT: Indicates if the detected error is correctablea: 0 = not correctable,1 = correctable. +*\*\ - FEMC_ECC_BLOCK_FLAG_FAIL: Pass, fail flag for each ECC block:0 = pass,1 = fail. +*\*\ - FEMC_ECC_BLOCK_FLAG_READ: Read flags for ECC blocks:0 = not read,1 = read. +*\*\ - FEMC_ECC_BLOCK_FLAG_VALUE_VALID: Valid flag for each ECC block:0 = not valid,1 = valid. +*\*\ - FEMC_ECC_BLOCK_FLAG_INTERRUPT: Interrupt flag:0 = not set,1 = set. +*\*\return SET or RESET +**/ +FlagStatus FEMC_GetECCBlockSTS(uint32_t ECC_Block_Index, uint32_t FEMC_Block_Flag_Index) +{ + FlagStatus status = RESET; + + + if(ECC_Block_Index != FEMC_ECC_PAGE_BLOCK_EXTRA) + { + if(FEMC->FEMC_ECCBLK[ECC_Block_Index] & ((uint32_t)((FEMC_Block_Flag_Index) << 27))) + { + status = SET; + } + else + { + status = RESET; + } + } + else if(ECC_Block_Index == FEMC_ECC_PAGE_BLOCK_EXTRA) + { + if(FEMC->FEMC_ECCEBLK & ((uint32_t)((FEMC_Block_Flag_Index) << 27))) + { + status = SET; + } + else + { + status = RESET; + } + } + + return status; +} + +/** +*\*\name FEMC_GetECCBlockSTS. +*\*\fun Clear the FEMC ECC page block status. +*\*\param ECC_Block_Index +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX0 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX1 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX2 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX3 +*\*\ - FEMC_ECC_PAGE_BLOCK_EXTRA +*\*\param FEMC_Block_Flag_Index: specifies which flag status to get. +*\*\ - FEMC_ECC_BLOCK_FLAG_CAN_CORRECT: Indicates if the detected error is correctablea: 0 = not correctable,1 = correctable. +*\*\ - FEMC_ECC_BLOCK_FLAG_FAIL: Pass, fail flag for each ECC block:0 = pass,1 = fail. +*\*\ - FEMC_ECC_BLOCK_FLAG_READ: Read flags for ECC blocks:0 = not read,1 = read. +*\*\ - FEMC_ECC_BLOCK_FLAG_VALUE_VALID: Valid flag for each ECC block:0 = not valid,1 = valid. +*\*\ - FEMC_ECC_BLOCK_FLAG_INTERRUPT: Interrupt flag:0 = not set,1 = set. +*\*\return None +**/ +void FEMC_ClrECCBlockSTS(uint32_t ECC_Block_Index, uint32_t FEMC_Block_Flag_Index) +{ + uint32_t temp; + + if(ECC_Block_Index != FEMC_ECC_PAGE_BLOCK_EXTRA) + { + temp = FEMC->FEMC_ECCBLK[ECC_Block_Index]; + temp &= !((uint32_t)((FEMC_Block_Flag_Index) << 27)); + FEMC->FEMC_ECCBLK[ECC_Block_Index] = temp; + } + else if(ECC_Block_Index == FEMC_ECC_PAGE_BLOCK_EXTRA) + { + temp = FEMC->FEMC_ECCEBLK; + temp &= !((uint32_t)((FEMC_Block_Flag_Index) << 27)); + FEMC->FEMC_ECCEBLK = temp; + } +} + + + +/** +*\*\name FEMC_GetECCvalue. +*\*\fun Get the FEMC ECC value or result of each page frame. +*\*\param ECC_Block_Index +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX0 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX1 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX2 +*\*\ - FEMC_ECC_PAGE_BLOCK_INDEX3 +*\*\ - FEMC_ECC_PAGE_BLOCK_EXTRA +*\*\return The ecc value of specific page frame. +**/ +uint32_t FEMC_GetECCvalue(uint32_t ECC_Block_Index) +{ + uint32_t temp_value = 0; + + if(ECC_Block_Index != FEMC_ECC_PAGE_BLOCK_EXTRA) + { + temp_value = FEMC->FEMC_ECCBLK[ECC_Block_Index] & (FEMC_ECCBLK_VAL); + } + else if(ECC_Block_Index == FEMC_ECC_PAGE_BLOCK_EXTRA) + { + temp_value = FEMC->FEMC_ECCEBLK & (FEMC_ECCBLK_VAL); + } + + return temp_value; +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_fmac.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_fmac.c new file mode 100644 index 0000000000..08a0fa13ab --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_fmac.c @@ -0,0 +1,712 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_fmac.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_fmac.h" +#include "n32h76x_78x_rcc.h" + +#ifndef NULL + #define NULL 0 +#endif + +/** +*\*\name FMAC_DeInit. +*\*\fun Deinitializes the FMAC peripheral registers to their default reset values +*\*\param none +*\*\return none +**/ +void FMAC_DeInit(void) +{ + /* Enable FMAC reset state */ + RCC_EnableAHB2PeriphReset1(RCC_AHB2_PERIPHRST_FMAC); +} + +/** +*\*\name FMAC_Init. +*\*\fun Initialize the FMAC peripheral +*\*\param FMAC_InitStruct : +*\*\ - InputBufBaseAddress +*\*\ - 0...255 +*\*\ - InputBufSize +*\*\ - 0...255 +*\*\ - InputBufThreshold +*\*\ - FMAC_THRESHOLD1 +*\*\ - FMAC_THRESHOLD2 +*\*\ - FMAC_THRESHOLD4 +*\*\ - FMAC_THRESHOLD8 +*\*\ - CoeffBufBaseAddress +*\*\ - 0...255 +*\*\ - CoeffBufSize +*\*\ - 0...255 +*\*\ - OutBufBaseAddress +*\*\ - 0...255 +*\*\ - OutBufSize +*\*\ - 0...255 +*\*\ - OutBufThreshold +*\*\ - FMAC_THRESHOLD1 +*\*\ - FMAC_THRESHOLD2 +*\*\ - FMAC_THRESHOLD4 +*\*\ - FMAC_THRESHOLD8 +*\*\ - Limit +*\*\ - FMAC_LIMIT_ENABLE +*\*\ - FMAC_LIMIT_DISABLE +*\*\ - Func +*\*\ - FMAC_FUNC_LOADX1 +*\*\ - FMAC_FUNC_LOADX2 +*\*\ - FMAC_FUNC_LOADY +*\*\ - FMAC_FUNC_CONVO_FIR +*\*\ - FMAC_FUNC_IIR_DIRECT_FORM_1 +*\*\ - P. +*\*\ - 0...255 +*\*\ - Q. +*\*\ - 0...255 +*\*\ - R. +*\*\ - 0...255 +*\*\return none +**/ +void FMAC_Init(FMAC_InitType * FMAC_InitStruct) +{ + /* configure the input buffer parameter */ + FMAC->X1BUFCFG = ((((uint32_t)FMAC_InitStruct->InputBufBaseAddress) & FMAC_X1BUFCFG_X1BASE) \ + | ((((uint32_t)FMAC_InitStruct->InputBufSize) << REG_BIT8_OFFSET) & FMAC_X1BUFCFG_X1BUFSIZE) \ + | (FMAC_InitStruct->InputBufThreshold & FMAC_X1BUFCFG_X1BUFWM) ); + + /* configure the coefficient parameter */ + FMAC->X2BUFCFG = ((((uint32_t)FMAC_InitStruct->CoeffBufBaseAddress) & FMAC_X2BUFCFG_X2BASE) \ + | ((((uint32_t)FMAC_InitStruct->CoeffBufSize) << REG_BIT8_OFFSET) & FMAC_X2BUFCFG_X2BUFSIZE)); + + /* configure the output buffer parameter */ + FMAC->YBUFCFG = ((((uint32_t)FMAC_InitStruct->OutBufBaseAddress) & FMAC_YBUFCFG_YBASE) \ + | ((((uint32_t)FMAC_InitStruct->OutBufSize) << REG_BIT8_OFFSET) & FMAC_YBUFCFG_YBUFSIZE) \ + | (FMAC_InitStruct->OutBufThreshold & FMAC_YBUFCFG_YBUFWM) ); + + /* configure the state of limit */ + if(FMAC_InitStruct->Limit == FMAC_LIMIT_ENABLE) + { + FMAC->CTRL |= FMAC_CTRL_LIMITEN; + } + else + { + FMAC->CTRL &= ~FMAC_CTRL_LIMITEN; + } +} + +/** +*\*\name FMAC_StructInit. +*\*\fun Initialize the FMAC filter parameter struct with the default values +*\*\param FMAC_InitStruct : +*\*\ - InputBufBaseAddress +*\*\ - InputBufSize +*\*\ - InputBufThreshold +*\*\ - CoeffBufBaseAddress +*\*\ - CoeffBufSize +*\*\ - OutBufBaseAddress +*\*\ - OutBufSize +*\*\ - OutBufThreshold +*\*\ - Limit +*\*\ - Func +*\*\ - P +*\*\ - Q +*\*\ - R +*\*\return none +**/ +void FMAC_StructInit(FMAC_InitType * FMAC_InitStruct) +{ + FMAC_InitStruct->InputBufBaseAddress = 0U; + FMAC_InitStruct->InputBufSize = 0U; + FMAC_InitStruct->InputBufThreshold = 0U; + FMAC_InitStruct->CoeffBufBaseAddress = 0U; + FMAC_InitStruct->CoeffBufSize = 0U; + FMAC_InitStruct->OutBufBaseAddress = 0U; + FMAC_InitStruct->OutBufSize = 0U; + FMAC_InitStruct->OutBufThreshold = 0U; + FMAC_InitStruct->Limit = 0U; + FMAC_InitStruct->Func = 0U; + FMAC_InitStruct->P = 0U; + FMAC_InitStruct->Q = 0U; + FMAC_InitStruct->R = 0U; +} + +/** +*\*\name FMAC_PreLoadData. +*\*\fun Preload data +*\*\param size : +*\*\ - 0~255 size of data +*\*\param array[]: +*\*\ - pointer to the buffer containing the data to be loaded +*\*\return none +**/ +void FMAC_PreLoadData(uint32_t size, int16_t array[]) +{ + uint32_t i; + + for(i = 0U; i < size; i++) + { + FMAC->WDAT = (uint32_t)array[i] & FMAC_WDAT_WDAT; + } +} + +/** +*\*\name FMAC_PreloadBufferData. +*\*\fun Preload three buffer data +*\*\param FMAC_PreloadStruct : +*\*\ - pInputData : +*\*\ - pointer to the input buffer containing the data to be computed +*\*\ - InputDataSize : +*\*\ - 0..255 +*\*\ - pCoeffA : +*\*\ - pointer to the buffer containing the data to be computed +*\*\ - CoeffASize : +*\*\ - 0..255 +*\*\ - pCoeffB : +*\*\ - pointer to the buffer containing the data to be computed +*\*\ - CoeffBSize : +*\*\ - 0..255 +*\*\ - pOutputData : +*\*\ - pointer to the output buffer containing the data to be computed +*\*\ - OutputDataSize : +*\*\ - 0..255 +*\*\return ErrorStatus: +*\*\ - SUCCESS FMAC preload success +*\*\ - ERROR FMAC preload timeout +**/ +ErrorStatus FMAC_PreloadBufferData(FMAC_PreLoadType * FMAC_PreloadStruct) +{ + uint32_t timeout; + ErrorStatus status = SUCCESS; + + if((NULL != FMAC_PreloadStruct->pInputData) && (0U != FMAC_PreloadStruct->InputDataSize)) + { + /* configure parameter of filter preload */ + FMAC->PARAMCFG = ((uint32_t)(FMAC_PreloadStruct->InputDataSize) & FMAC_PARAMCFG_P) \ + | FMAC_FUNC_LOADX1 \ + | FMAC_PARAMCFG_START; + + /* load the X1 buffer for input data */ + FMAC_PreLoadData(FMAC_PreloadStruct->InputDataSize, FMAC_PreloadStruct->pInputData); + + timeout = FMAC_TIMEOUT; + + while((FMAC->PARAMCFG & FMAC_PARAMCFG_START) != 0U) + { + if(0U == timeout) + { + status = ERROR; + break; + } + + timeout--; + } + } + + if(ERROR == status) + { + } + else if((NULL != FMAC_PreloadStruct->pCoeffB) && (0U != FMAC_PreloadStruct->CoeffBSize)) + { + /* configure parameter of filter preload */ + FMAC->PARAMCFG = (((uint32_t)FMAC_PreloadStruct->CoeffBSize) & FMAC_PARAMCFG_P) \ + | ((((uint32_t)FMAC_PreloadStruct->CoeffASize) << REG_BIT8_OFFSET) & FMAC_PARAMCFG_Q) \ + | FMAC_FUNC_LOADX2 \ + | FMAC_PARAMCFG_START; + /* load the X2 buffer for cofficientB */ + FMAC_PreLoadData(FMAC_PreloadStruct->CoeffBSize, FMAC_PreloadStruct->pCoeffB); + + + /* load the x2 buffer for cofficientA */ + if((NULL != FMAC_PreloadStruct->pCoeffA) && (0U != FMAC_PreloadStruct->CoeffASize)) + { + /* Load the buffer into the internal memory */ + FMAC_PreLoadData(FMAC_PreloadStruct->CoeffASize, FMAC_PreloadStruct->pCoeffA); + } + + timeout = FMAC_TIMEOUT; + + while((FMAC->PARAMCFG & FMAC_PARAMCFG_START) != 0U) + { + if(0U == timeout) + { + status = ERROR; + break; + } + + timeout--; + } + } + else + { + } + + if(ERROR == status) + { + } + else if((NULL != FMAC_PreloadStruct->pOutputData) && (0U != FMAC_PreloadStruct->OutputDataSize)) /* configure to preload output buffer */ + { + FMAC->PARAMCFG = ((uint32_t)FMAC_PreloadStruct->OutputDataSize & FMAC_PARAMCFG_P) \ + | FMAC_FUNC_LOADY \ + | FMAC_PARAMCFG_START; + + /* load the Y buffer for input data */ + FMAC_PreLoadData(FMAC_PreloadStruct->OutputDataSize, FMAC_PreloadStruct->pOutputData); + + timeout = FMAC_TIMEOUT; + + while((FMAC->PARAMCFG & FMAC_PARAMCFG_START) != 0U) + { + if(0U == timeout) + { + status = ERROR; + break; + } + + timeout--; + } + } + else + { + + } + + return status; +} + +/** +*\*\name FMAC_PreLoadStructInit. +*\*\fun Initialize the FMAC Preload struct with the default values +*\*\param FMAC_PreloadStruct : +*\*\ - pInputData +*\*\ - InputDataSize +*\*\ - pCoeffA +*\*\ - CoeffASize +*\*\ - pCoeffB +*\*\ - CoeffBSize +*\*\ - pOutputData +*\*\ - OutputDataSize +*\*\return none +**/ +void FMAC_PreLoadStructInit(FMAC_PreLoadType * FMAC_PreloadStruct) +{ + FMAC_PreloadStruct->pInputData = 0U; + FMAC_PreloadStruct->InputDataSize = 0U; + FMAC_PreloadStruct->pCoeffA = 0U; + FMAC_PreloadStruct->CoeffASize = 0U; + FMAC_PreloadStruct->pCoeffB = 0U; + FMAC_PreloadStruct->CoeffBSize = 0U; + FMAC_PreloadStruct->pOutputData = 0U; + FMAC_PreloadStruct->OutputDataSize = 0U; +} + +/** +*\*\name FMAC_ConfigParam. +*\*\fun Configure FMAC parameter +*\*\param FMAC_ParamStruct : +*\*\ - Func +*\*\ - FMAC_FUNC_LOADX1 +*\*\ - FMAC_FUNC_LOADX2 +*\*\ - FMAC_FUNC_LOADY +*\*\ - FMAC_FUNC_CONVO_FIR +*\*\ - FMAC_FUNC_IIR_DIRECT_FORM_1 +*\*\ - P +*\*\ - 0..255 +*\*\ - Q +*\*\ - 0..255 +*\*\ - R +*\*\ - 0..7 +*\*\return none +**/ +void FMAC_ConfigParam(FMAC_InitType* FMAC_ParamStruct) +{ + /* Stop execution */ + FMAC->PARAMCFG &= (~FMAC_PARAMCFG_START); + + /* Set filter parameter */ + FMAC->PARAMCFG = FMAC_ParamStruct->Func \ + | ((uint32_t)FMAC_ParamStruct->P) \ + | (((uint32_t)FMAC_ParamStruct->Q) << REG_BIT8_OFFSET) \ + | (((uint32_t)FMAC_ParamStruct->R) << REG_BIT16_OFFSET); +} + +/** +*\*\name FMAC_FilterStart. +*\*\fun Configure FMAC parameter and start filter +*\*\param FMAC_ParamStruct : +*\*\ - Func +*\*\ - FMAC_FUNC_LOADX1 +*\*\ - FMAC_FUNC_LOADX2 +*\*\ - FMAC_FUNC_LOADY +*\*\ - FMAC_FUNC_CONVO_FIR +*\*\ - FMAC_FUNC_IIR_DIRECT_FORM_1 +*\*\ - P +*\*\ - 0..255 +*\*\ - Q +*\*\ - 0..255 +*\*\ - R +*\*\ - 0..7 +*\*\return none +**/ +void FMAC_FilterStart(FMAC_InitType* FMAC_ParamStruct) +{ + /* Stop execution */ + FMAC->PARAMCFG &= (~FMAC_PARAMCFG_START); + + /* Set filter parameter and start execution */ + FMAC->PARAMCFG = FMAC_PARAMCFG_START \ + | FMAC_ParamStruct->Func \ + | ((uint32_t)FMAC_ParamStruct->P) \ + | (((uint32_t)FMAC_ParamStruct->Q) << REG_BIT8_OFFSET) \ + | (((uint32_t)FMAC_ParamStruct->R) << REG_BIT16_OFFSET); +} + +/** +*\*\name FMAC_Reset. +*\*\fun Reset FMAC, The write and read pointers, internal control logic,FAC_STS and FAC_PARAMCFG register is set to default value. +*\*\param none +*\*\return ErrorStatus: +*\*\ - SUCCESS FMAC reset done +*\*\ - ERROR FMAC reset timeout +**/ +ErrorStatus FMAC_Reset(void) +{ + uint32_t timeout = FMAC_RESET_TIMEOUT_VALUE; + ErrorStatus status = SUCCESS; + + /* Reset FMAC peripheral */ + FMAC->CTRL |= FMAC_CTRL_RESET; + + while((FMAC->CTRL & FMAC_CTRL_RESET) != 0U) + { + if(0U == timeout) + { + status = ERROR; + break; + } + + timeout--; + } + + return status; +} + +/** +*\*\name FMAC_Enable. +*\*\fun Enable or disable FMAC start execution. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FMAC_Enable(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected FMAC peripheral */ + FMAC->PARAMCFG |= FMAC_PARAMCFG_START; + } + else + { + /* Disable the selected FMAC peripheral */ + FMAC->PARAMCFG &= ~FMAC_PARAMCFG_START; + } +} + +/** +*\*\name FMAC_ConfigX1. +*\*\fun Configuration X1 paramer. +*\*\param Baseaddr +*\*\ - 0...255 +*\*\param Bufsize +*\*\ - 0...255 +*\*\param Threshold +*\*\ - FMAC_THRESHOLD1 +*\*\ - FMAC_THRESHOLD2 +*\*\ - FMAC_THRESHOLD4 +*\*\ - FMAC_THRESHOLD8 +*\*\return none +**/ +void FMAC_ConfigX1(uint8_t Baseaddr, uint8_t Bufsize, uint32_t Threshold) +{ + FMAC->X1BUFCFG = (uint32_t)Baseaddr | Threshold | ((uint32_t)Bufsize << REG_BIT8_OFFSET); +} + +/** +*\*\name FMAC_ConfigX2. +*\*\fun Configuration X2 paramer. +*\*\param Baseaddr +*\*\ - 0...255 +*\*\param Bufsize +*\*\ - 0...255 +*\*\return none +**/ +void FMAC_ConfigX2(uint8_t Baseaddr, uint8_t Bufsize) +{ + FMAC->X2BUFCFG = (uint32_t)Baseaddr | ((uint32_t)Bufsize << REG_BIT8_OFFSET); +} + +/** +*\*\name FMAC_ConfigY. +*\*\fun Configuration Y paramer. +*\*\param Baseaddr +*\*\ - 0...255 +*\*\param Bufsize +*\*\ - 0...255 +*\*\param Threshold +*\*\ - FMAC_THRESHOLD1 +*\*\ - FMAC_THRESHOLD2 +*\*\ - FMAC_THRESHOLD4 +*\*\ - FMAC_THRESHOLD8 +*\*\return none +**/ +void FMAC_ConfigY(uint8_t Baseaddr, uint8_t Bufsize, uint32_t Threshold) +{ + FMAC->YBUFCFG = (uint32_t)Baseaddr | Threshold | ((uint32_t)Bufsize << REG_BIT8_OFFSET); +} + +/** +*\*\name FMAC_WriteData +*\*\fun Write data +*\*\param none +*\*\return 16-bit data +**/ +void FMAC_WriteData(int16_t data) +{ + FMAC->WDAT = (uint32_t)data; +} + +/** +*\*\name FMAC_ReadData +*\*\fun Read output data +*\*\param none +*\*\return 16-bit data +**/ +int16_t FMAC_ReadData(void) +{ + int16_t value; + value = (int16_t)FMAC->RDAT; + return value; +} + +/** +*\*\name FMAC_EnableLimit +*\*\fun Enable or disable fmac limit +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FMAC_EnableLimit(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + FMAC->CTRL |= FMAC_LIMIT_ENABLE; + } + else + { + FMAC->CTRL &= ~FMAC_LIMIT_ENABLE; + } +} + +/** +*\*\name FMAC_EnableDma +*\*\fun Enable or disable fmac dma +*\*\param dma_req : +*\*\ - FMAC_DMA_READ: read buffer dma +*\*\ - FMAC_DMA_WRITE: write buffer dma +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FMAC_EnableDMA(uint32_t dma_req, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + FMAC->CTRL |= dma_req; + } + else + { + FMAC->CTRL &= ~dma_req; + } +} + +/** +*\*\name FMAC_ConfigInt +*\*\fun Enable or disable fmac interrupt +*\*\param interrupt : +*\*\ - FMAC_INT_READ: Read buffer interrupt +*\*\ - FMAC_INT_WRITE: Write buffer interrupt +*\*\ - FMAC_INT_OV: Overflow error interrupt +*\*\ - FMAC_INT_UN: Underflow error interrupt +*\*\ - FMAC_INT_SAT: Saturation error interrupt +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void FMAC_ConfigInt(uint32_t interrupt, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + FMAC->CTRL |= interrupt; + } + else + { + FMAC->CTRL &= ~interrupt; + } +} + +/** +*\*\name FMAC_FinishCalculate. +*\*\fun finish the filter calculate +*\*\param none +*\*\return none +**/ +ErrorStatus FMAC_FinishCalculate(void) +{ + ErrorStatus err; + + /* clear start */ + FMAC->PARAMCFG &= ~FMAC_PARAMCFG_START; + + /* disable read and write interrupt */ + CLEAR_BIT(FMAC->CTRL, FMAC_INT_READ | FMAC_INT_WRITE | FMAC_DMA_READ | FMAC_DMA_WRITE); + + /* reset register and pointer */ + if(FMAC_Reset() != SUCCESS) + { + err = ERROR; + } + else + { + err = SUCCESS; + } + + return err; +} + +/** +*\*\name FMAC_GetIntStatus +*\*\fun FMAC interrupt flag status +*\*\param IntFlag : +*\*\ - FMAC_INT_FLAG_YBUFEF: Read buffer interrupt +*\*\ - FMAC_INT_FLAG_X1BUFFF: Write buffer interrupt +*\*\ - FMAC_INT_FLAG_OVF: Overflow error interrupt +*\*\ - FMAC_INT_FLAG_UNF: Underflow error interrupt +*\*\ - FMAC_INT_FLAG_SATF: Saturation error interrupt +*\*\return none +**/ +FlagStatus FMAC_GetIntStatus(uint32_t IntFlag) +{ + FlagStatus bitstatus; + uint32_t tReg; + + if( (FMAC_INT_FLAG_YBUFEF == IntFlag) \ + || (FMAC_INT_FLAG_X1BUFFF == IntFlag) ) + { + tReg = ~(FMAC->STS); + } + else + { + tReg = FMAC->STS; + } + + tReg &= (IntFlag & FMAC_INT_FLAG_MASK); + + if(tReg == 0U) + { + bitstatus = RESET; + } + else if((FMAC->CTRL & ((IntFlag >> 16U) & FMAC_INT_FLAG_MASK)) == 0U) + { + bitstatus = RESET; + } + else + { + bitstatus = SET; + } + + return bitstatus; +} + +/** +*\*\name FMAC_GetFlagStatus +*\*\fun Get FMAC flag status +*\*\param Flag : +*\*\ - FMAC_FLAG_YBUFEF: Read buffer interrupt +*\*\ - FMAC_FLAG_X1BUFFF: Write buffer interrupt +*\*\ - FMAC_FLAG_OVF: Overflow error interrupt +*\*\ - FMAC_FLAG_UNF: Underflow error interrupt +*\*\ - FMAC_FLAG_SATF: Saturation error interrupt +*\*\return FlagStatus: +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus FMAC_GetFlagStatus(uint32_t Flag) +{ + FlagStatus bitstatus; + + if ((FMAC->STS & Flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_gpio.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_gpio.c new file mode 100644 index 0000000000..a23cece13b --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_gpio.c @@ -0,0 +1,2390 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_gpio.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +/* Includes ------------------------------------------------------------------*/ +#include "n32h76x_78x_gpio.h" +#include "n32h76x_78x_rcc.h" + + +#define GPIO_MODE ((uint32_t)0x00000003) +//#define EXTI_MODE ((uint32_t)0x10000000) +//#define GPIO_MODE_IT ((uint32_t)0x00010000) +//#define GPIO_MODE_EVT ((uint32_t)0x00020000) +//#define RISING_EDGE ((uint32_t)0x00100000) +//#define FALLING_EDGE ((uint32_t)0x00200000) +#define GPIO_OUTPUT_TYPE ((uint32_t)0x00000010) +//#define GPIO_NUMBER ((uint32_t)16) +#define GPIO_FILT_STEGE_MASK ((uint32_t)0x0000001F) + + +/** +*\*\name GPIO_DeInit. +*\*\fun Reset the GPIOx peripheral registers to their default reset values. +*\*\param GPIOx : +*\*\ - GPIOA +*\*\ - GPIOB +*\*\ - GPIOC +*\*\ - GPIOD +*\*\ - GPIOE +*\*\ - GPIOF +*\*\ - GPIOG +*\*\ - GPIOH +*\*\ - GPIOI +*\*\ - GPIOJ +*\*\ - GPIOK +*\*\return none +*/ +void GPIO_DeInit(GPIO_Module* GPIOx) +{ + /* Configure the port pins */ + /*------------------------- GPIO Mode Configuration --------------------*/ + if (GPIOx == GPIOA) + { + RCC_EnableAHB5PeriphReset1(RCC_AHB5_PERIPHRST_GPIOA); + } + else if (GPIOx == GPIOB) + { + RCC_EnableAHB5PeriphReset1(RCC_AHB5_PERIPHRST_GPIOB); + } + else if (GPIOx == GPIOC) + { + RCC_EnableAHB5PeriphReset1(RCC_AHB5_PERIPHRST_GPIOC); + } + else if (GPIOx == GPIOD) + { + RCC_EnableAHB5PeriphReset1(RCC_AHB5_PERIPHRST_GPIOD); + } + else if (GPIOx == GPIOE) + { + RCC_EnableAHB5PeriphReset1(RCC_AHB5_PERIPHRST_GPIOE); + } + else if (GPIOx == GPIOF) + { + RCC_EnableAHB5PeriphReset1(RCC_AHB5_PERIPHRST_GPIOF); + } + else if (GPIOx == GPIOG) + { + RCC_EnableAHB5PeriphReset1(RCC_AHB5_PERIPHRST_GPIOG); + } + else if (GPIOx == GPIOH) + { + RCC_EnableAHB5PeriphReset1(RCC_AHB5_PERIPHRST_GPIOH); + } + else if (GPIOx == GPIOI) + { + RCC_EnableAHB5PeriphReset2(RCC_AHB5_PERIPHRST_GPIOI); + } + else if (GPIOx == GPIOJ) + { + RCC_EnableAHB5PeriphReset2(RCC_AHB5_PERIPHRST_GPIOJ); + } + else if (GPIOx == GPIOK) + { + RCC_EnableAHB5PeriphReset2(RCC_AHB5_PERIPHRST_GPIOK); + } + else + { + return; + } +} + + +/** +*\*\name GPIO_InitPeripheral. +*\*\fun Initialize the GPIOx peripheral with the value of the GPIO_InitStruct structure. +*\*\param GPIOx : +*\*\ - GPIOA +*\*\ - GPIOB +*\*\ - GPIOC +*\*\ - GPIOD +*\*\ - GPIOE +*\*\ - GPIOF +*\*\ - GPIOG +*\*\ - GPIOH +*\*\ - GPIOI +*\*\ - GPIOJ +*\*\ - GPIOK +*\*\param GPIO_InitStructure : +*\*\ - Pin +*\*\ - GPIO_PIN_0 +*\*\ - GPIO_PIN_1 +*\*\ - GPIO_PIN_2 +*\*\ - GPIO_PIN_3 +*\*\ - GPIO_PIN_4 +*\*\ - GPIO_PIN_5 +*\*\ - GPIO_PIN_6 +*\*\ - GPIO_PIN_7 +*\*\ - GPIO_PIN_8 +*\*\ - GPIO_PIN_9 +*\*\ - GPIO_PIN_10 +*\*\ - GPIO_PIN_11 +*\*\ - GPIO_PIN_12 +*\*\ - GPIO_PIN_13 +*\*\ - GPIO_PIN_14 +*\*\ - GPIO_PIN_15 +*\*\ - GPIO_PIN_ALL +*\*\ - GPIO_Mode +*\*\ - GPIO_MODE_INPUT +*\*\ - GPIO_MODE_OUTPUT_PP +*\*\ - GPIO_MODE_OUTPUT_OD +*\*\ - GPIO_MODE_AF_PP +*\*\ - GPIO_MODE_AF_OD +*\*\ - GPIO_MODE_ANALOG +*\*\ - GPIO_Pull +*\*\ - GPIO_NO_PULL +*\*\ - GPIO_PULL_UP +*\*\ - GPIO_PULL_DOWN +*\*\ - GPIO_Slew_Rate +*\*\ - GPIO_SLEW_RATE_FAST +*\*\ - GPIO_SLEW_RATE_SLOW +*\*\ - GPIO_Current +*\*\ - GPIO_DC_2mA +*\*\ - GPIO_DC_4mA +*\*\ - GPIO_DC_8mA +*\*\ - GPIO_DC_12mA +*\*\ - GPIO_5VTOL_DC_1mA +*\*\ - GPIO_5VTOL_DC_2mA +*\*\ - GPIO_5VTOL_DC_4mA +*\*\ - GPIO_5VTOL_DC_6mA +*\*\ - GPIO_SDRAM_DC_1mA +*\*\ - GPIO_SDRAM_DC_2mA +*\*\ - GPIO_SDRAM_DC_4mA +*\*\ - GPIO_SDRAM_DC_5mA +*\*\ - GPIO_SDRAM_DC_8mA +*\*\ - GPIO_SDRAM_DC_12mA +*\*\ - GPIO_Alternate +*\*\ - GPIO_AF0 +*\*\ - GPIO_AF1 +*\*\ - GPIO_AF2 +*\*\ - GPIO_AF3 +*\*\ - GPIO_AF4 +*\*\ - GPIO_AF5 +*\*\ - GPIO_AF6 +*\*\ - GPIO_AF7 +*\*\ - GPIO_AF8 +*\*\ - GPIO_AF9 +*\*\ - GPIO_AF10 +*\*\ - GPIO_AF11 +*\*\ - GPIO_AF12 +*\*\ - GPIO_AF13 +*\*\ - GPIO_AF14 +*\*\ - GPIO_AF15 +*\*\ - GPIO_NO_AF +*\*\return none +**/ +void GPIO_InitPeripheral( GPIO_Module* GPIOx, GPIO_InitType* GPIO_InitStruct ) +{ + uint32_t position = 0x00U; + uint32_t iocurrent = 0x00U; + uint32_t temp = 0x00U; + + /* Configure the port pins */ + + while ((( GPIO_InitStruct->Pin ) >> position ) != 0 ) + { + /* Get the IO position */ + iocurrent = ( GPIO_InitStruct->Pin ) & ( 1U << position ); + + if ( iocurrent ) + { + /*--------------------- GPIO Mode Configuration ------------------------*/ + /* In case of Alternate function mode selection */ + if (( GPIO_InitStruct->GPIO_Mode == GPIO_MODE_AF_PP) || (GPIO_InitStruct->GPIO_Mode == GPIO_MODE_AF_OD ) || + (GPIO_InitStruct->GPIO_Mode == GPIO_MODE_INPUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_MODE_ANALOG)) + { + /* Configure Alternate function mapped with the current IO */ + if(position & 0x08) + { + temp = GPIOx->AFH; + temp &= ~(( uint32_t )0xFU << (( uint32_t )( position & ( uint32_t )0x07U ) * 4U ) ) ; + temp |= (( uint32_t )( GPIO_InitStruct->GPIO_Alternate ) << ((( uint32_t )position & ( uint32_t )0x07U ) * 4U ) ) ; + GPIOx->AFH = temp; + } + else + { + temp = GPIOx->AFL; + temp &= ~(( uint32_t )0xFU << (( uint32_t )( position & ( uint32_t )0x07U ) * 4U ) ) ; + temp |= (( uint32_t )( GPIO_InitStruct->GPIO_Alternate ) << ((( uint32_t )position & ( uint32_t )0x07U ) * 4U ) ) ; + GPIOx->AFL = temp; + } + } + + /* In case of Output or Alternate function mode selection */ + if (( GPIO_InitStruct->GPIO_Mode == GPIO_MODE_OUTPUT_PP ) || ( GPIO_InitStruct->GPIO_Mode == GPIO_MODE_AF_PP ) || + ( GPIO_InitStruct->GPIO_Mode == GPIO_MODE_OUTPUT_OD ) || ( GPIO_InitStruct->GPIO_Mode == GPIO_MODE_AF_OD ) ) + { + /* Configure the IO Output Type */ + temp = GPIOx->POTYPE; + temp &= ~( GPIO_POTYPE_POT0 << position ) ; + temp |= ((( GPIO_InitStruct->GPIO_Mode & GPIO_OUTPUT_TYPE ) >> 4U ) << position ); + GPIOx->POTYPE = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->PMODE; + + temp &= ~( GPIO_PMODE_PMODE0 << ( position * 2U ) ); + + temp |= (( GPIO_InitStruct->GPIO_Mode & GPIO_MODE ) << ( position * 2U ) ); + + GPIOx->PMODE = temp; + + /* Activate the Pull-up or Pull down resistor for the current IO */ + temp = GPIOx->PUPD; + + temp &= ~( GPIO_PUPD_PUPD0 << ( position * 2U ) ); + + temp |= (( GPIO_InitStruct->GPIO_Pull ) << ( position * 2U ) ); + + GPIOx->PUPD = temp; + + /* Configure slew rate */ + temp = GPIOx->SR; + + temp &= ~(GPIO_SR_BIT_MASK << position); + + temp |= (GPIO_InitStruct->GPIO_Slew_Rate << position); + + GPIOx->SR = temp; + + /* Configure driver current */ + temp = GPIOx->DS; + + temp &= ~(GPIO_DS_BIT_MASK << ( position * 2U )); + + temp |= (GPIO_InitStruct->GPIO_Current << ( position * 2U )); + + GPIOx->DS = temp; + } + + position++; + } +} +/** + *\*\name GPIO_AFIOInitDefault. + *\*\fun Reset the AFIO peripheral registers to their default reset values. + *\*\param none + *\*\return none + */ +void GPIO_AFIOInitDefault(void) +{ + RCC_EnableAHB5PeriphReset2(RCC_AHB5_PERIPHRST_AFIO); +} +/** + *\*\name GPIO_InitStruct. + *\*\fun Assign default values to each InitStruct member. + *\*\param InitStruct : + *\*\ pointer to GPIO_InitType structure. + *\*\return none + */ +void GPIO_InitStruct(GPIO_InitType* InitStruct) +{ + /* Reset GPIO structure member */ + InitStruct->Pin = GPIO_PIN_NONE; + InitStruct->GPIO_Mode = GPIO_MODE_INPUT; + InitStruct->GPIO_Pull = GPIO_NO_PULL; + InitStruct->GPIO_Slew_Rate = GPIO_SLEW_RATE_SLOW; + InitStruct->GPIO_Current = GPIO_DC_2mA; + InitStruct->GPIO_Alternate = GPIO_NO_AF; +} + +/** + *\*\name GPIO_ReadInputDataBit. + *\*\fun Get the pin status on the specified input pin. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\ - GPIOJ + *\*\ - GPIOK + *\*\param Pin : + *\*\ - GPIO_PIN_0 + *\*\ - GPIO_PIN_1 + *\*\ - GPIO_PIN_2 + *\*\ - GPIO_PIN_3 + *\*\ - GPIO_PIN_4 + *\*\ - GPIO_PIN_5 + *\*\ - GPIO_PIN_6 + *\*\ - GPIO_PIN_7 + *\*\ - GPIO_PIN_8 + *\*\ - GPIO_PIN_9 + *\*\ - GPIO_PIN_10 + *\*\ - GPIO_PIN_11 + *\*\ - GPIO_PIN_12 + *\*\ - GPIO_PIN_13 + *\*\ - GPIO_PIN_14 + *\*\ - GPIO_PIN_15 + *\*\return the state on the input pin + */ +uint8_t GPIO_ReadInputDataBit( GPIO_Module* GPIOx, uint16_t GPIO_Pin ) +{ + uint8_t bitstatus = 0x00; + + if (( GPIOx->PID & GPIO_Pin ) != ( uint32_t )Bit_RESET ) + { + bitstatus = ( uint8_t )Bit_SET; + } + else + { + bitstatus = ( uint8_t )Bit_RESET; + } + + return bitstatus; +} + +/** + *\*\name GPIO_ReadInputData. + *\*\fun Get the input data on the designated GPIO port. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\ - GPIOJ + *\*\ - GPIOK + *\*\return the data value on the GPIO input port. + */ +uint16_t GPIO_ReadInputData( GPIO_Module* GPIOx ) +{ + return (( uint16_t )GPIOx->PID ); +} + +/** + *\*\name GPIO_ReadOutputDataBit. + *\*\fun Get the pin status on the specified input pin. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\ - GPIOJ + *\*\ - GPIOK + *\*\param Pin : + *\*\ - GPIO_PIN_0 + *\*\ - GPIO_PIN_1 + *\*\ - GPIO_PIN_2 + *\*\ - GPIO_PIN_3 + *\*\ - GPIO_PIN_4 + *\*\ - GPIO_PIN_5 + *\*\ - GPIO_PIN_6 + *\*\ - GPIO_PIN_7 + *\*\ - GPIO_PIN_8 + *\*\ - GPIO_PIN_9 + *\*\ - GPIO_PIN_10 + *\*\ - GPIO_PIN_11 + *\*\ - GPIO_PIN_12 + *\*\ - GPIO_PIN_13 + *\*\ - GPIO_PIN_14 + *\*\ - GPIO_PIN_15 + *\*\return the state on the input pin + */ +uint8_t GPIO_ReadOutputDataBit( GPIO_Module* GPIOx, uint16_t GPIO_Pin ) +{ + uint8_t bitstatus = 0x00; + + if (( GPIOx->POD & GPIO_Pin ) != ( uint32_t )Bit_RESET ) + { + bitstatus = ( uint8_t )Bit_SET; + } + else + { + bitstatus = ( uint8_t )Bit_RESET; + } + + return bitstatus; +} + + +/** + *\*\name GPIO_ReadOutputData. + *\*\fun Get the output data on the designated GPIO port. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\ - GPIOJ + *\*\ - GPIOK + *\*\return the data value on the GPIO output port. + */ +uint16_t GPIO_ReadOutputData( GPIO_Module* GPIOx ) +{ + return (( uint16_t )GPIOx->POD ); +} + +/** + *\*\name GPIO_SetBits. + *\*\fun Get the pin status on the specified input pin. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\ - GPIOJ + *\*\ - GPIOK + *\*\param Pin : + *\*\ - GPIO_PIN_0 + *\*\ - GPIO_PIN_1 + *\*\ - GPIO_PIN_2 + *\*\ - GPIO_PIN_3 + *\*\ - GPIO_PIN_4 + *\*\ - GPIO_PIN_5 + *\*\ - GPIO_PIN_6 + *\*\ - GPIO_PIN_7 + *\*\ - GPIO_PIN_8 + *\*\ - GPIO_PIN_9 + *\*\ - GPIO_PIN_10 + *\*\ - GPIO_PIN_11 + *\*\ - GPIO_PIN_12 + *\*\ - GPIO_PIN_13 + *\*\ - GPIO_PIN_14 + *\*\ - GPIO_PIN_15 + *\*\return the state on the input pin + */ +void GPIO_SetBits( GPIO_Module* GPIOx, uint16_t GPIO_Pin ) +{ + GPIOx->PBSC = GPIO_Pin; +} + +/** + *\*\name GPIO_ResetBits. + *\*\fun Reset the selected data port bits. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\ - GPIOJ + *\*\ - GPIOK + *\*\param Pin : + *\*\ - GPIO_PIN_0 + *\*\ - GPIO_PIN_1 + *\*\ - GPIO_PIN_2 + *\*\ - GPIO_PIN_3 + *\*\ - GPIO_PIN_4 + *\*\ - GPIO_PIN_5 + *\*\ - GPIO_PIN_6 + *\*\ - GPIO_PIN_7 + *\*\ - GPIO_PIN_8 + *\*\ - GPIO_PIN_9 + *\*\ - GPIO_PIN_10 + *\*\ - GPIO_PIN_11 + *\*\ - GPIO_PIN_12 + *\*\ - GPIO_PIN_13 + *\*\ - GPIO_PIN_14 + *\*\ - GPIO_PIN_15 + *\*\return none + */ +void GPIO_ResetBits( GPIO_Module* GPIOx, uint16_t GPIO_Pin ) +{ + GPIOx->PBC = GPIO_Pin; +} + + +/** + *\*\name GPIO_WriteBit. + *\*\fun Reset the selected data port bits. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\ - GPIOJ + *\*\ - GPIOK + *\*\param Pin : + *\*\ - GPIO_PIN_0 + *\*\ - GPIO_PIN_1 + *\*\ - GPIO_PIN_2 + *\*\ - GPIO_PIN_3 + *\*\ - GPIO_PIN_4 + *\*\ - GPIO_PIN_5 + *\*\ - GPIO_PIN_6 + *\*\ - GPIO_PIN_7 + *\*\ - GPIO_PIN_8 + *\*\ - GPIO_PIN_9 + *\*\ - GPIO_PIN_10 + *\*\ - GPIO_PIN_11 + *\*\ - GPIO_PIN_12 + *\*\ - GPIO_PIN_13 + *\*\ - GPIO_PIN_14 + *\*\ - GPIO_PIN_15 + *\*\param BitVal : + *\*\ - Bit_RESET + *\*\ - Bit_SET + *\*\return none + */ +void GPIO_WriteBit( GPIO_Module* GPIOx, uint16_t GPIO_Pin, Bit_OperateType BitVal ) +{ + if ( BitVal != Bit_RESET ) + { + GPIOx->PBSC = GPIO_Pin; + } + else + { + GPIOx->PBC = GPIO_Pin; + } +} + +/** + *\*\name GPIO_Write. + *\*\fun Write data on the designated GPIO data port. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\ - GPIOJ + *\*\ - GPIOK + *\*\param data_value : + *\*\ the value to be written to the port output data register. + *\*\ - 0~0xFFFF + *\*\return none + */ +void GPIO_Write( GPIO_Module* GPIOx, uint16_t data_value) +{ + GPIOx->POD = data_value; +} + +/** + *\*\name GPIO_Pin_Toggle. + *\*\fun Toggle the specified port pin level. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\ - GPIOJ + *\*\ - GPIOK + *\*\param Pin : + *\*\ - GPIO_PIN_0 + *\*\ - GPIO_PIN_1 + *\*\ - GPIO_PIN_2 + *\*\ - GPIO_PIN_3 + *\*\ - GPIO_PIN_4 + *\*\ - GPIO_PIN_5 + *\*\ - GPIO_PIN_6 + *\*\ - GPIO_PIN_7 + *\*\ - GPIO_PIN_8 + *\*\ - GPIO_PIN_9 + *\*\ - GPIO_PIN_10 + *\*\ - GPIO_PIN_11 + *\*\ - GPIO_PIN_12 + *\*\ - GPIO_PIN_13 + *\*\ - GPIO_PIN_14 + *\*\ - GPIO_PIN_15 + *\*\return none + */ +void GPIO_TogglePin(GPIO_Module *GPIOx, uint16_t Pin) +{ + GPIOx->POD ^= Pin; +} + + +/** + *\*\name GPIO_ConfigPinLock. + *\*\fun Toggle the specified port pin level. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\ - GPIOJ + *\*\ - GPIOK + *\*\param Pin : + *\*\ - GPIO_PIN_0 + *\*\ - GPIO_PIN_1 + *\*\ - GPIO_PIN_2 + *\*\ - GPIO_PIN_3 + *\*\ - GPIO_PIN_4 + *\*\ - GPIO_PIN_5 + *\*\ - GPIO_PIN_6 + *\*\ - GPIO_PIN_7 + *\*\ - GPIO_PIN_8 + *\*\ - GPIO_PIN_9 + *\*\ - GPIO_PIN_10 + *\*\ - GPIO_PIN_11 + *\*\ - GPIO_PIN_12 + *\*\ - GPIO_PIN_13 + *\*\ - GPIO_PIN_14 + *\*\ - GPIO_PIN_15 + *\*\return none + */ +void GPIO_ConfigPinLock(GPIO_Module* GPIOx, uint16_t Pin) +{ + __IO uint32_t tmp = GPIO_PLOCK_PLOCKK; + + if(GPIOx == GPIOK) + { + tmp = GPIO_PLOCK_PLOCKK >> 8; + } + + tmp |= Pin; + /* Set PLOCKK bit */ + GPIOx->PLOCK = tmp; + /* Reset PLOCKK bit */ + GPIOx->PLOCK = Pin; + /* Set PLOCKK bit */ + GPIOx->PLOCK = tmp; + /* Read PLOCKK bit*/ + tmp = GPIOx->PLOCK; + /* Read PLOCKK bit*/ + tmp = GPIOx->PLOCK; +} + + +/** +*\*\name GPIO_EXTILineConfig. +*\*\fun Selects the GPIO pin used as EXTI Line. +*\*\param EXTI_Line + - EXTI_LINE0 + - EXTI_LINE1 + - ...... + - EXTI_LINE15 +*\*\param GPIO_PinSource + - EXTI_GPIOA_Pin_0 + - ...... + - EXTI_GPIOA_Pin_15 + - EXTI_GPIOB_Pin_0 + - ...... + - EXTI_GPIOB_Pin_15 + - ...... + - EXTI_GPIOJ_Pin_0 + - ...... + - EXTI_GPIOJ_Pin_15 +*\*\return none +*/ +void GPIO_ConfigEXTILine(uint8_t EXTI_Line, uint8_t GPIO_PinSource) +{ + AFIO->EXTI_CFG[EXTI_Line / 4] |= GPIO_PinSource << (8 * (EXTI_Line % 4)); +} + +/** + *\*\name AFIO_ConfigSIPFLASHSEL. + *\*\fun Configure the SIP FLASH MODE SEL. + *\*\param AFIO_FLASH : + *\*\ - AFIO_FLASH0 + *\*\ - AFIO_FLASH1 + *\*\ - AFIO_FLASH2 + *\*\ - AFIO_FLASH3 + *\*\ - AFIO_FLASH4 + *\*\ - AFIO_DISFLASH + *\*\return none + */ +void AFIO_ConfigSIPFLASHSEL(uint32_t AFIO_FLASH) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG; + tempReg &= ~AFIO_RMP_CFG_SIP_FLASHSEL; + tempReg |= AFIO_FLASH; + + AFIO->RMP_CFG = tempReg; +} + +/** + *\*\name AFIO_ConfigSPINSSMode. + *\*\fun Configure the SPIx NSS mode during idle. + *\*\param AFIO_SPIx_NSS : + *\*\ - AFIO_SPI1_NSS + *\*\ - AFIO_SPI2_NSS + *\*\ - AFIO_SPI3_NSS + *\*\ - AFIO_SPI4_NSS + *\*\ - AFIO_SPI5_NSS + *\*\ - AFIO_SPI6_NSS + *\*\ - AFIO_SPI7_NSS + *\*\param NSS_Mode : + *\*\ - AFIO_SPI_NSS_HIGH_IMPEDANCE + *\*\ - AFIO_SPI_NSS_HIGH_LEVEL + *\*\return none + */ +void AFIO_ConfigSPINSSMode(uint32_t AFIO_SPIx_NSS, uint32_t NSS_Mode) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG; + + if(NSS_Mode != AFIO_SPI_NSS_HIGH_IMPEDANCE) + { + tempReg |= AFIO_SPIx_NSS; + } + else + { + tempReg &= ~AFIO_SPIx_NSS; + } + + AFIO->RMP_CFG = tempReg; +} + +/** + *\*\name AFIO_Config_EXTI_Filter. + *\*\fun Enable or disable EXTI analog filter. + *\*\param EXTI_Filter : + *\*\ - AFIO_EXTI_FILTER_ENABLE + *\*\ - AFIO_EXTI_FILTER_DISABLE + *\*\return none + */ +void AFIO_ConfigEXTIFilter(uint32_t EXTI_Filter) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG ; + + if(EXTI_Filter != AFIO_EXTI_FILTER_ENABLE) + { + tempReg |= AFIO_EXTI_FILTER_DISABLE; + } + else + { + tempReg &= ~AFIO_EXTI_FILTER_DISABLE; + } + + AFIO->RMP_CFG = tempReg; +} + +/** +*\*\name AFIO_ConfigSIPSDRAMPrior. +*\*\fun Configure SIP SDRAM prority. +*\*\param priority : +*\*\ - AFIO_SIP_SDRAM_PRIORITY_HIGH +*\*\ - AFIO_SIP_SDRAM_PRIORITY_LOW +*\*\return none +**/ +void AFIO_ConfigSIPSDRAMPrior(uint32_t priority) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG; + + if(priority != AFIO_SIP_SDRAM_PRIORITY_LOW) + { + tempReg |= AFIO_SIP_SDRAM_PRIORITY_HIGH; + } + else + { + tempReg &= ~AFIO_SIP_SDRAM_PRIORITY_HIGH; + } + + AFIO->RMP_CFG = tempReg; +} + +/** + *\*\name AFIO_ConfigSPII2SMode. + *\*\fun SEL only for pads sharing SPI/I2S. + *\*\param AFIO_SPIx_I2Sx : + *\*\ - AFIO_SELECT_SPI1 + *\*\ - AFIO_SELECT_SPI2 + *\*\ - AFIO_SELECT_SPI3 + *\*\ - AFIO_SELECT_SPI4 + *\*\param PADS_Mode : + *\*\ - SPI_MODE + *\*\ - I2S_MODE + *\*\return none + */ +void AFIO_ConfigSPII2SMode(uint32_t AFIO_SPIx_I2Sx, uint32_t PADS_Mode) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG; + + if(PADS_Mode != I2S_MODE) + { + tempReg |= AFIO_SPIx_I2Sx; + } + else + { + tempReg &= ~AFIO_SPIx_I2Sx; + } + + AFIO->RMP_CFG = tempReg; +} + +/** + *\*\name AFIO_SDMMCClkSel. + *\*\fun SDMMC clk external or feedback clk input. + *\*\param AFIO_clk_sel : + *\*\ - SDMMC1_CLKFB + *\*\ - SDMMC2_CLKFB + *\*\param cmd : + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none + */ +void AFIO_SDMMCClkSel(uint32_t AFIO_clk_sel, FunctionalState cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG; + + if(cmd != DISABLE) + { + tempReg |= AFIO_clk_sel; + } + else + { + tempReg &= ~AFIO_clk_sel; + } + + AFIO->RMP_CFG = tempReg; +} + + +/** + *\*\name AFIO_I2SFullpuplexSel. + *\*\fun To enable full duplex mode for I2S1-4 + *\*\param AFIO_I2S_sel : + *\*\ - I2S1_FULLDUPLEX + *\*\ - I2S2_FULLDUPLEX + *\*\ - I2S3_FULLDUPLEX + *\*\ - I2S4_FULLDUPLEX + *\*\return none + */ +void AFIO_I2SFullpuplexSel(uint32_t AFIO_clk_sel) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG; + + tempReg &= ~AFIO_RMP_CFG_I2S_FDUP; + tempReg |= AFIO_clk_sel; + + AFIO->RMP_CFG = tempReg; +} + +/** + *\*\name AFIO_ConfigXSPIBigEndian. + *\*\fun Enable or disable the big endian for XSPI XIP mode. + *\*\param AFIO_BigEndian_sel : + *\*\ - XSPI1_ENDIAN + *\*\ - XSPI2_ENDIAN + *\*\param Endian : + *\*\ - XSPI_LITTLE_ENDIAN + *\*\ - XSPI_BIG_ENDIAN + *\*\return none + */ +void AFIO_ConfigXSPIBigEndian(uint32_t xspi_endian, uint32_t Endian) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG ; + + if(Endian != XSPI_LITTLE_ENDIAN) + { + tempReg |= xspi_endian; + } + else + { + tempReg &= ~xspi_endian; + } + + AFIO->RMP_CFG = tempReg; +} + +/** + *\*\name AFIO_ConfigFEMCNANDSRAM. + *\*\fun To select between Nand and Sram. + *\*\param Nand_Sram_sel : + *\*\ - FEMC_NAND_SEL + *\*\ - FEMC_SRAM_SEL + *\*\return none + */ +void AFIO_ConfigFEMCNANDSRAM(uint32_t Nand_Sram_sel) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG ; + + if(Nand_Sram_sel == FEMC_NAND_SEL) + { + tempReg |= FEMC_NAND_SEL; + } + else + { + tempReg &= ~FEMC_NAND_SEL; + } + + AFIO->RMP_CFG = tempReg; +} + + +/** + *\*\name AFIO_FEMCNOByteStrobe. + *\*\fun ANDed of NBLs for Flashes do or not support byte strobes. + *\*\param Byte_Strobes_sel : + *\*\ - NO_BYTE_STROBE + *\*\ - BYTE_STROBE + *\*\return none + */ +void AFIO_FEMCNOByteStrobe(uint32_t Byte_Strobes_sel) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG ; + + if(Byte_Strobes_sel == NO_BYTE_STROBE) + { + tempReg |= NO_BYTE_STROBE; + } + else + { + tempReg &= ~NO_BYTE_STROBE; + } + + AFIO->RMP_CFG = tempReg; +} + +/** + *\*\name AFIO_ConfigETH1Mode. + *\*\fun For the ETH1 PHY selection. + *\*\param ETH1_PHY_sel : + *\*\ ETH1_GMII_SEL + *\*\ ETH1_RGMII_SEL + *\*\ ETH1_RMII_SEL + *\*\ ETH1_MII_SEL + *\*\return none + */ +void AFIO_ConfigETH1Mode(uint32_t ETH1_PHY_sel) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG; + + tempReg &= ~AFIO_RMP_CFG_ETH1_PHY; + + tempReg |= ETH1_PHY_sel; + + AFIO->RMP_CFG = tempReg; +} + +/** + *\*\name AFIO_ConfigETH2Mode. + *\*\fun For the ETH2 PHY selection. + *\*\param ETH2_PHY_sel : + *\*\ - ETH2_RMII_SEL + *\*\ - ETH2_MII_SEL + *\*\return none + */ +void AFIO_ConfigETH2Mode(uint32_t ETH2_PHY_sel) +{ + uint32_t tempReg; + + tempReg = AFIO->RMP_CFG ; + + if(ETH2_PHY_sel == ETH2_RMII_SEL) + { + tempReg |= ETH2_RMII_SEL; + } + else + { + tempReg &= ~ETH2_RMII_SEL; + } + + AFIO->RMP_CFG = tempReg; +} + +/** +*\*\name AFIO_ConfigSHRT1FALTPin. +*\*\fun SHRTIM1 GPIO FAULT PIN Config +*\*\param channel_pin : +*\*\ - SHRT1_FAULT_CHANNEL_PA15 +*\*\ - SHRT1_FAULT_CHANNEL_PB3 +*\*\ - SHRT1_FAULT_CHANNEL_PC11 +*\*\ - SHRT1_FAULT_CHANNEL_PD4 +*\*\ - SHRT1_FAULT_CHANNEL_PE4 +*\*\ - SHRT1_FAULT_CHANNEL_PG9 +*\*\ - SHRT1_FAULT_CHANNEL_PG10 +*\*\ - SHRT1_FAULT_CHANNEL_PI6 +*\*\ - SHRT1_FAULT_CHANNEL_PI15 +*\*\ - SHRT1_FAULT_CHANNEL_PK2 +*\*\param channel_num : +*\*\ - SHRT_FAULT_CHANNEL_1 +*\*\ - SHRT_FAULT_CHANNEL_2 +*\*\ - SHRT_FAULT_CHANNEL_3 +*\*\ - SHRT_FAULT_CHANNEL_4 +*\*\ - SHRT_FAULT_CHANNEL_5 +*\*\ - SHRT_FAULT_CHANNEL_6 +*\*\return none +**/ +void AFIO_ConfigSHRT1FALTPin(SHRT1_FAULT_CHANNEL channel_pin, SHRT_FAULT_CHANNEL_NUM channel_num) +{ + uint32_t tempReg; + + tempReg = AFIO->SHRT1_FALT_CFG; + tempReg &= ~(AFIO_SHRT1_FALT_CFG_SHRT_FALT1 << ((channel_num) * 4)); + tempReg |= channel_pin << (channel_num * 4); + AFIO->SHRT1_FALT_CFG = tempReg; +} + +/** +*\*\name AFIO_ConfigSHRT2FALTPin. +*\*\fun SHRTIM2 GPIO FAULT PIN Config +*\*\param channel_pin : +*\*\ - SHRT2_FAULT_CHANNEL_PC5 +*\*\ - SHRT2_FAULT_CHANNEL_PD1 +*\*\ - SHRT2_FAULT_CHANNEL_PD15 +*\*\ - SHRT2_FAULT_CHANNEL_PF9 +*\*\ - SHRT2_FAULT_CHANNEL_PF13 +*\*\ - SHRT2_FAULT_CHANNEL_PG1 +*\*\ - SHRT2_FAULT_CHANNEL_PI0 +*\*\ - SHRT2_FAULT_CHANNEL_PI9 +*\*\ - SHRT2_FAULT_CHANNEL_PI13 +*\*\ - SHRT2_FAULT_CHANNEL_PJ0 +*\*\ - SHRT2_FAULT_CHANNEL_PK1 +*\*\ - SHRT2_FAULT_CHANNEL_PK6 +*\*\param channel_num : +*\*\ - SHRT_FAULT_CHANNEL_1 +*\*\ - SHRT_FAULT_CHANNEL_2 +*\*\ - SHRT_FAULT_CHANNEL_3 +*\*\ - SHRT_FAULT_CHANNEL_4 +*\*\ - SHRT_FAULT_CHANNEL_5 +*\*\ - SHRT_FAULT_CHANNEL_6 +*\*\return none +**/ +void AFIO_ConfigSHRT2FALTPin(SHRT2_FAULT_CHANNEL channel_pin, SHRT_FAULT_CHANNEL_NUM channel_num) +{ + uint32_t tempReg; + + tempReg = AFIO->SHRT2_FALT_CFG; + tempReg &= ~(AFIO_SHRT2_FALT_CFG_SHRT_FALT1 << ((channel_num) * 4)); + tempReg |= channel_pin << (channel_num * 4); + AFIO->SHRT2_FALT_CFG = tempReg; +} + +/** +*\*\name AFIO_ConfigSHRT1EXEVPin. +*\*\fun SHRTIM1 external event pin Config +*\*\param channel_pin : +*\*\ - SHRT1_EXEV_CHANNEL_PB4 +*\*\ - SHRT1_EXEV_CHANNEL_PB5 +*\*\ - SHRT1_EXEV_CHANNEL_PB6 +*\*\ - SHRT1_EXEV_CHANNEL_PB7 +*\*\ - SHRT1_EXEV_CHANNEL_PC10 +*\*\ - SHRT1_EXEV_CHANNEL_PC12 +*\*\ - SHRT1_EXEV_CHANNEL_PD5 +*\*\ - SHRT1_EXEV_CHANNEL_PD8 +*\*\ - SHRT1_EXEV_CHANNEL_PD9 +*\*\ - SHRT1_EXEV_CHANNEL_PE6 +*\*\ - SHRT1_EXEV_CHANNEL_PG0 +*\*\ - SHRT1_EXEV_CHANNEL_PG11 +*\*\ - SHRT1_EXEV_CHANNEL_PG12 +*\*\ - SHRT1_EXEV_CHANNEL_PG13 +*\*\ - SHRT1_EXEV_CHANNEL_PI14 +*\*\ - SHRT1_EXEV_CHANNEL_PJ5 +*\*\ - SHRT1_EXEV_CHANNEL_PK3 +*\*\ - SHRT1_EXEV_CHANNEL_PK4 +*\*\param channel_num : +*\*\ - SHRT_EXEV_CHANNEL_1 +*\*\ - SHRT_EXEV_CHANNEL_2 +*\*\ - SHRT_EXEV_CHANNEL_3 +*\*\ - SHRT_EXEV_CHANNEL_4 +*\*\ - SHRT_EXEV_CHANNEL_5 +*\*\ - SHRT_EXEV_CHANNEL_6 +*\*\ - SHRT_EXEV_CHANNEL_7 +*\*\ - SHRT_EXEV_CHANNEL_8 +*\*\ - SHRT_EXEV_CHANNEL_9 +*\*\ - SHRT_EXEV_CHANNEL_10 +*\*\return none +**/ +void AFIO_ConfigSHRT1EXEVPin(SHRT1_EXEV_CHANNEL channel_pin, SHRT_EXEV_CHANNEL_NUM channel_num) +{ + uint32_t tempReg; + uint32_t temp_index; + + temp_index = channel_num / 5; + + tempReg = AFIO->SHRT1_EXEV_CFG[temp_index]; + + tempReg &= ~(AFIO_SHRT1_EXEV_CFG1_SHRT_EXEV1 << ((channel_num % 5) * 5)); + + tempReg |= channel_pin << ((channel_num % 5) * 5); + + AFIO->SHRT1_EXEV_CFG[temp_index] = tempReg; +} + +/** +*\*\name AFIO_ConfigSHRT2EXEVPin. +*\*\fun SHRTIM2 external event pin Config +*\*\param channel_pin : +*\*\ - SHRT2_EXEV_CHANNEL_PA2 +*\*\ - SHRT2_EXEV_CHANNEL_PC4 +*\*\ - SHRT2_EXEV_CHANNEL_PD0 +*\*\ - SHRT2_EXEV_CHANNEL_PD11 +*\*\ - SHRT2_EXEV_CHANNEL_PE3 +*\*\ - SHRT2_EXEV_CHANNEL_PE14 +*\*\ - SHRT2_EXEV_CHANNEL_PF10 +*\*\ - SHRT2_EXEV_CHANNEL_PG8 +*\*\ - SHRT2_EXEV_CHANNEL_PG15 +*\*\ - SHRT2_EXEV_CHANNEL_PH7 +*\*\ - SHRT2_EXEV_CHANNEL_PH8 +*\*\ - SHRT2_EXEV_CHANNEL_PH10 +*\*\ - SHRT2_EXEV_CHANNEL_PH11 +*\*\ - SHRT2_EXEV_CHANNEL_PH12 +*\*\ - SHRT2_EXEV_CHANNEL_PI11 +*\*\ - SHRT2_EXEV_CHANNEL_PJ2 +*\*\ - SHRT2_EXEV_CHANNEL_J14 +*\*\ - SHRT2_EXEV_CHANNEL_PK0 +*\*\param channel_num : +*\*\ - SHRT_EXEV_CHANNEL_1 +*\*\ - SHRT_EXEV_CHANNEL_2 +*\*\ - SHRT_EXEV_CHANNEL_3 +*\*\ - SHRT_EXEV_CHANNEL_4 +*\*\ - SHRT_EXEV_CHANNEL_5 +*\*\ - SHRT_EXEV_CHANNEL_6 +*\*\ - SHRT_EXEV_CHANNEL_7 +*\*\ - SHRT_EXEV_CHANNEL_8 +*\*\ - SHRT_EXEV_CHANNEL_9 +*\*\ - SHRT_EXEV_CHANNEL_10 +*\*\return none +**/ +void AFIO_ConfigSHRT2EXEVPin(SHRT2_EXEV_CHANNEL channel_pin, SHRT_EXEV_CHANNEL_NUM channel_num) +{ + uint32_t tempReg; + uint32_t temp_index; + + temp_index = channel_num / 5; + + tempReg = AFIO->SHRT2_EXEV_CFG[temp_index]; + + tempReg &= ~(AFIO_SHRT2_EXEV_CFG1_SHRT_EXEV1 << ((channel_num % 5) * 5)); + + tempReg |= channel_pin << ((channel_num % 5) * 5); + + AFIO->SHRT2_EXEV_CFG[temp_index] = tempReg; +} + +/** +*\*\name AFIO_ConfigPinTol5VGPIOA. +*\*\fun Enable or disable the PA_5V tolerance. +*\*\param Pin : +*\*\ - AFIO_TOL5V_PA0 +*\*\ - AFIO_TOL5V_PA0_C +*\*\ - AFIO_TOL5V_PA1 +*\*\ - AFIO_TOL5V_PA1_C +*\*\ - AFIO_TOL5V_PA2 +*\*\ - AFIO_TOL5V_PA3 +*\*\ - AFIO_TOL5V_PA4 +*\*\ - AFIO_TOL5V_PA5 +*\*\ - AFIO_TOL5V_PA6 +*\*\ - AFIO_TOL5V_PA7 +*\*\param cmd : +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void AFIO_ConfigPinTol5VGPIOA(uint32_t Pin, FunctionalState cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->TOL5V_CFG1; + + if(cmd != DISABLE) + { + tempReg |= Pin; + } + else + { + tempReg &= ~(Pin); + } + + AFIO->TOL5V_CFG1 = tempReg; +} + +/** +*\*\name AFIO_ConfigPinTol5VGPIOB. +*\*\fun Enable or disable the PB_5V tolerance. +*\*\param Pin : +*\*\ - AFIO_TOL5V_PB0 +*\*\ - AFIO_TOL5V_PB1 +*\*\param cmd : +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void AFIO_ConfigPinTol5VGPIOB(uint32_t Pin, FunctionalState cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->TOL5V_CFG2; + + if(cmd != DISABLE) + { + tempReg |= Pin; + } + else + { + tempReg &= ~(Pin); + } + + AFIO->TOL5V_CFG2 = tempReg; +} +/** +*\*\name AFIO_ConfigPinTol5VGPIOC. +*\*\fun Enable or disable the PC_5V tolerance. +*\*\param Pin : +*\*\ - AFIO_TOL5V_PC0 +*\*\ - AFIO_TOL5V_PC1 +*\*\ - AFIO_TOL5V_PC2 +*\*\ - AFIO_TOL5V_PC2_C +*\*\ - AFIO_TOL5V_PC3 +*\*\ - AFIO_TOL5V_PC3_C +*\*\ - AFIO_TOL5V_PC4 +*\*\ - AFIO_TOL5V_PC5 +*\*\ - AFIO_TOL5V_PC6 +*\*\ - AFIO_TOL5V_PC8 +*\*\ - AFIO_TOL5V_PC13 +*\*\param cmd : +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void AFIO_ConfigPinTol5VGPIOC(uint32_t Pin, FunctionalState cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->TOL5V_CFG3; + + if(cmd != DISABLE) + { + tempReg |= Pin; + } + else + { + tempReg &= ~(Pin); + } + + AFIO->TOL5V_CFG3 = tempReg; +} + +/** +*\*\name AFIO_ConfigPinTol5VGPIOF. +*\*\fun Enable or disable the PF_5V tolerance. +*\*\param Pin : +*\*\ - AFIO_TOL5V_PF3 +*\*\ - AFIO_TOL5V_PF4 +*\*\ - AFIO_TOL5V_PF5 +*\*\ - AFIO_TOL5V_PF6 +*\*\ - AFIO_TOL5V_PF7 +*\*\ - AFIO_TOL5V_PF8 +*\*\ - AFIO_TOL5V_PF9 +*\*\ - AFIO_TOL5V_PF10 +*\*\ - AFIO_TOL5V_PF11 +*\*\ - AFIO_TOL5V_PF12 +*\*\ - AFIO_TOL5V_PF13 +*\*\ - AFIO_TOL5V_PF14 +*\*\param cmd : +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void AFIO_ConfigPinTol5VGPIOF( uint32_t Pin, FunctionalState cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->TOL5V_CFG4; + + if(cmd != DISABLE) + { + tempReg |= Pin; + } + else + { + tempReg &= ~(Pin); + } + + AFIO->TOL5V_CFG4 = tempReg; +} + +/** +*\*\name AFIO_ConfigPinTol5VGPIOH. +*\*\fun Enable or disable the PH_5V tolerance. +*\*\param Pin : +*\*\ - AFIO_TOL5V_PH2 +*\*\ - AFIO_TOL5V_PH3 +*\*\ - AFIO_TOL5V_PH4 +*\*\ - AFIO_TOL5V_PH5 +*\*\param cmd : +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void AFIO_ConfigPinTol5VGPIOH( uint32_t Pin, FunctionalState cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->TOL5V_CFG5; + + if(cmd != DISABLE) + { + tempReg |= Pin; + } + else + { + tempReg &= ~(Pin); + } + + AFIO->TOL5V_CFG5 = tempReg; +} + +/** +*\*\name AFIO_ConfigPinTol5VGPIOI. +*\*\fun Enable or disable the PI_5V tolerance. +*\*\param Pin : +*\*\ - AFIO_TOL5V_PI8 +*\*\ - AFIO_TOL5V_PI15 +*\*\param cmd : +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void AFIO_ConfigPinTol5VGPIOI( uint32_t Pin, FunctionalState cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->TOL5V_CFG6; + + if(cmd != DISABLE) + { + tempReg |= Pin; + } + else + { + tempReg &= ~(Pin); + } + + AFIO->TOL5V_CFG6 = tempReg; +} + +/** +*\*\name AFIO_ConfigPinTol5VGPIOJ. +*\*\fun Enable or disable the PJ_5V tolerance. +*\*\param Pin : +*\*\ - AFIO_TOL5V_PJ0 +*\*\ - AFIO_TOL5V_PJ3 +*\*\ - AFIO_TOL5V_PJ4 +*\*\ - AFIO_TOL5V_PJ5 +*\*\ - AFIO_TOL5V_PJ6 +*\*\ - AFIO_TOL5V_PJ7 +*\*\param cmd : +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void AFIO_ConfigPinTol5VGPIOJ( uint32_t Pin, FunctionalState cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->TOL5V_CFG7; + + if(cmd != DISABLE) + { + tempReg |= Pin; + } + else + { + tempReg &= ~(Pin); + } + + AFIO->TOL5V_CFG7 = tempReg; +} + +/** + *\*\name AFIO_SIPInitPeripheral. + *\*\fun Configure the Sip Pin Pull up or down + *\*\param sip_index : + *\*\ - AFIO_SIP_DAT7 + *\*\ - AFIO_SIP_DAT6 + *\*\ - AFIO_SIP_DAT5 + *\*\ - AFIO_SIP_DAT4 + *\*\ - AFIO_SIP_DAT3 + *\*\ - AFIO_SIP_DAT2 + *\*\ - AFIO_SIP_DAT1 + *\*\ - AFIO_SIP_DAT0 + *\*\param pupd : + *\*\ - AFIO_SIP_Mode_NO_PULL + *\*\ - AFIO_SIP_Mode_PULL_UP + *\*\ - AFIO_SIP_Mode_PULL_DOWN + *\*\param slew_rate : + *\*\ - SIP_Mode_FAST + *\*\ - SIP_Mode_SLOW + *\*\param driver_stength : + *\*\ - SIP_DC_2mA + *\*\ - SIP_DC_4mA + *\*\ - SIP_DC_8mA + *\*\ - SIP_DC_12mA + *\*\return none + */ +void AFIO_SIPInitPeripheral(uint8_t sip_index, uint32_t pupd, uint32_t slew_rate, uint32_t driver_stength) +{ + uint32_t temp = 0x00U; + + temp = AFIO->SIP_PUPD; + + temp &= ~(AFIO_SIP_MASK << (2 * sip_index)); + + temp |= (pupd << (2 * sip_index)); + + AFIO->SIP_PUPD = temp; + + + temp = AFIO->SIPSR; + + temp &= ~(GPIO_SR_BIT_MASK << (sip_index)); + + temp |= (slew_rate << ( sip_index)); + + AFIO->SIPSR = temp; + + temp = AFIO->SIPDS; + + temp &= ~(GPIO_DS_BIT_MASK << (2 * sip_index)); + + temp |= (driver_stength << (2 * sip_index)); + + AFIO->SIPDS = temp; +} + +/** + * @brief Configur ADC external trigger. + * @param ADCETRType choose whether to configure rule conversion or injection conversion . + * This parameter can be AFIO_ADC_ETRI and AFIO_ADC_ETRR. + * @param ADCTrigRemap specifies the external trigger line be configured. + * This parameter can be AFIO_ADC_TRIG_EXTI_x where x can be (0..15) or AFIO_ADC_TRIG_TIM8_CHy where y can be(3..4). + */ + +/** +*\*\name AFIO_ConfigADCExtLineTrigSource. +*\*\fun Configurate ADC external line trigger. +*\*\param ADC_num : +*\*\ - AFIO_ADC_1 +*\*\ - AFIO_ADC_2 +*\*\ - AFIO_ADC_3 +*\*\param ADCETRType : +*\*\ - AFIO_ADC_ETRI +*\*\ - AFIO_ADC_ETRR +*\*\param ADC_trigger : +*\*\ - AFIO_ADC_TRIG_EXTI_0 +*\*\ - AFIO_ADC_TRIG_EXTI_1 +*\*\ - AFIO_ADC_TRIG_EXTI_2 +*\*\ - AFIO_ADC_TRIG_EXTI_3 +*\*\ - AFIO_ADC_TRIG_EXTI_4 +*\*\ - AFIO_ADC_TRIG_EXTI_5 +*\*\ - AFIO_ADC_TRIG_EXTI_6 +*\*\ - AFIO_ADC_TRIG_EXTI_7 +*\*\ - AFIO_ADC_TRIG_EXTI_8 +*\*\ - AFIO_ADC_TRIG_EXTI_9 +*\*\ - AFIO_ADC_TRIG_EXTI_10 +*\*\ - AFIO_ADC_TRIG_EXTI_11 +*\*\ - AFIO_ADC_TRIG_EXTI_12 +*\*\ - AFIO_ADC_TRIG_EXTI_13 +*\*\ - AFIO_ADC_TRIG_EXTI_14 +*\*\ - AFIO_ADC_TRIG_EXTI_15 +*\*\return none +**/ +void AFIO_ConfigADCExtLineTrigSource(AFIO_ADC_NUM ADC_num, AFIO_ADC_ETRType ADCETRType, AFIO_ADC_Trig_RemapType ADCTrigRemap) +{ + uint32_t tmpregister = 0x00; + + /* Check the parameters */ + tmpregister = AFIO->ADCRMP_CFG; + + /* clear AFIO_ADCRMP_CFG register bit*/ + tmpregister &= (~(AFIO_ADCRMP_CFG_ADC3_EXTIRRSEL << (ADC_num * 8 + ADCETRType * 4))); + + /* select which external line is connected*/ + tmpregister |= ADCTrigRemap << (ADC_num * 8 + ADCETRType * 4); + + AFIO->ADCRMP_CFG = tmpregister; +} + +/** +*\*\name AFIO_ConfigADCSWPA0_C. +*\*\fun Config ADC PA0_C channel. +*\*\param ADCsw +*\*\ - ADC_SW_PA0_C_ADC2_INP0 +*\*\ - ADC_SW_PA0_C_ADC2_INP1 +*\*\ - ADC_SW_PA0_C_ADC1_INP0 +*\*\ - ADC_SW_PA0_C_ADC1_INP1 +*\*\ - ADC_SW_PA0_C_CLOSE +*\*\return none +**/ +void AFIO_ConfigADCSWPA0_C(uint32_t ADCsw) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + tempReg &= ~ADC_SW_PA0_C_MSK; + tempReg |= ADCsw; + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ConfigADCSWPC2_C. +*\*\fun Config ADC PC2_C channel +*\*\param ADCsw +*\*\ - ADC_SW_PC2_C_ADC2_INP0 +*\*\ - ADC_SW_PC2_C_ADC2_INP1 +*\*\ - ADC_SW_PC2_C_ADC3_INP0 +*\*\ - ADC_SW_PC2_C_ADC3_INP1 +*\*\ - ADC_SW_PC2_C_CLOSE +*\*\return none +**/ +void AFIO_ConfigADCSWPC2_C(uint32_t ADCsw) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + tempReg &= ~ADC_SW_PC2_C_MSK; + tempReg |= ADCsw; + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ConfigADCSWPC3_C. +*\*\fun Config ADC PC3_C channel +*\*\param ADCsw +*\*\ - ADC_SW_PC3_C_ADC2_INP1 +*\*\ - ADC_SW_PC3_C_ADC3_INP2 +*\*\ - ADC_SW_PC3_C_CLOSE +*\*\return none +**/ +void AFIO_ConfigADCSWPC3_C(uint32_t ADCsw) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + tempReg &= ~ADC_SW_PC3_C_MSK; + tempReg |= ADCsw; + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ConfigADCSWPA1_C. +*\*\fun Config ADC PA1_C channel +*\*\param ADCsw +*\*\ - ADC_SW_PA1_C_ADC2_INP1 +*\*\ - ADC_SW_PA1_C_ADC1_INP1 +*\*\ - ADC_SW_PA1_C_CLOSE +*\*\return none +**/ +void AFIO_ConfigADCSWPA1_C(uint32_t ADCsw) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + tempReg &= ~ADC_SW_PA1_C_MSK; + tempReg |= ADCsw; + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ConfigADCSWPI15. +*\*\fun Config ADC PI15 channel +*\*\param ADCsw +*\*\ - ADC_SW_PI15_ADC2_INP17 +*\*\ - ADC_SW_PI15_ADC3_INP17 +*\*\ - ADC_SW_PI15_CLOSE +*\*\return none +**/ +void AFIO_ConfigADCSWPI15(uint32_t ADCsw) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + tempReg &= ~ADC_SW_PI15_MSK; + tempReg |= ADCsw; + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ADCSWVBATEnable. +*\*\fun Enable or disable ADC VBAT channel +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void AFIO_ADCSWVBATEnable(FunctionalState Cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + + if (Cmd != DISABLE) + { + tempReg |= ADC_SW_VBAT_ADC3_INP17; + } + else + { + tempReg &= ~ADC_SW_VBAT_ADC3_INP17; + } + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ADCSWPJ0Enable. +*\*\fun Enable or disable ADC PJ0 channel +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void AFIO_ADCSWPJ0Enable(FunctionalState Cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + + if (Cmd != DISABLE) + { + tempReg |= ADC_SW_PJ0_ADC2_INP16; + } + else + { + tempReg &= ~ADC_SW_PJ0_ADC2_INP16; + } + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ADCSWPJ3Enable. +*\*\fun Enable or disable ADC PJ3 channel +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void AFIO_ADCSWPJ3Enable(FunctionalState Cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + + if (Cmd != DISABLE) + { + tempReg |= ADC_SW_PJ3_ADC3_INP18; + } + else + { + tempReg &= ~ADC_SW_PJ3_ADC3_INP18; + } + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ADCSWTEMPEnable. +*\*\fun Enable or disable ADC TEMP channel +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void AFIO_ADCSWTEMPEnable(FunctionalState Cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + + if (Cmd != DISABLE) + { + tempReg |= ADC_SW_TEMP_ADC3_INP18; + } + else + { + tempReg &= ~ADC_SW_TEMP_ADC3_INP18; + } + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ADCSWPJ4Enable. +*\*\fun Enable or disable ADC PJ4 channel +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void AFIO_ADCSWPJ4Enable(FunctionalState Cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + + if (Cmd != DISABLE) + { + tempReg |= ADC_SW_PJ4_ADC3_INP19; + } + else + { + tempReg &= ~ADC_SW_PJ4_ADC3_INP19; + } + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ADCSWPJ5Enable. +*\*\fun Enable or disable ADC PJ5 channel +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void AFIO_ADCSWPJ5Enable(FunctionalState Cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + + if (Cmd != DISABLE) + { + tempReg |= ADC_SW_PJ5_ADC2_INP16; + } + else + { + tempReg &= ~ADC_SW_PJ5_ADC2_INP16; + } + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ADCSWPJ6Enable. +*\*\fun Enable or disable ADC PJ6 channel +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void AFIO_ADCSWPJ6Enable(FunctionalState Cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + + if (Cmd != DISABLE) + { + tempReg |= ADC_SW_PJ6_ADC3_INP18; + } + else + { + tempReg &= ~ADC_SW_PJ6_ADC3_INP18; + } + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ADCSWPJ7Enable. +*\*\fun Enable or disable ADC PJ7 channel +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void AFIO_ADCSWPJ7Enable(FunctionalState Cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + + if (Cmd != DISABLE) + { + tempReg |= ADC_SW_PJ7_ADC3_INP19; + } + else + { + tempReg &= ~ADC_SW_PJ7_ADC3_INP19; + } + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ADCSWVREFEnable. +*\*\fun Enable or disable ADC VREF channel +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void AFIO_ADCSWVREFEnable(FunctionalState Cmd) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + + if (Cmd != DISABLE) + { + tempReg |= ADC_SW_VREF_ADC3_INP19; + } + else + { + tempReg &= ~ADC_SW_VREF_ADC3_INP19; + } + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ConfigADCSWDAC246OUT. +*\*\fun Config ADC DAC2/4/6_OUT channel +*\*\param ADCsw +*\*\ - ADC_SW_DAC2_OUT_ADC2_INP17 +*\*\ - ADC_SW_DAC4_OUT_ADC2_INP17 +*\*\ - ADC_SW_DAC6_OUT_ADC2_INP17 +*\*\ - ADC_SW_DAC246_OUT_ADC2_DISABLE +*\*\return none +**/ +void AFIO_ConfigADCSWDAC246OUT(uint32_t ADCsw) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + tempReg &= ~ADC_SW_DAC246_OUT_MSK; + tempReg |= ADCsw; + + AFIO->ADCSW_CFG = tempReg; +} + +/** +*\*\name AFIO_ConfigADCSWDAC135OUT. +*\*\fun Config ADC DAC1/3/5_OUT channel +*\*\param ADCsw +*\*\ - ADC_SW_DAC1_OUT_ADC2_INP16 +*\*\ - ADC_SW_DAC3_OUT_ADC2_INP16 +*\*\ - ADC_SW_DAC5_OUT_ADC2_INP16 +*\*\ - ADC_SW_DAC135_OUT_ADC2_DISABLE +*\*\return none +**/ +void AFIO_ConfigADCSWDAC135OUT(uint32_t ADCsw) +{ + uint32_t tempReg; + + tempReg = AFIO->ADCSW_CFG; + tempReg &= ~ADC_SW_DAC135_OUT_MSK; + tempReg |= ADCsw; + + AFIO->ADCSW_CFG = tempReg; +} + +/** + *\*\name AFIO_ConfigIOFilter. + *\*\fun Configure IO filter cycle which is counted in AHB clock. + *\*\param Filter_Cycle : + *\*\ - 0~127 + *\*\return none + */ +void AFIO_ConfigIOFilter(uint8_t Filter_Cycle) +{ + uint32_t tempReg; + + tempReg = AFIO->FILTER_CFG; + tempReg &= ~AFIO_FILTER_CFG_IOFLTCFG; + tempReg |= Filter_Cycle; + AFIO->FILTER_CFG = tempReg; +} + +/** + *\*\name AFIO_ConfigPinFilter. + *\*\fun Enable or disable the analog filter function for GPIOx pin. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\ - GPIOJ + *\*\ - GPIOK + *\*\param Pin : + *\*\ - GPIO_Pin_0 + *\*\ - GPIO_Pin_1 + *\*\ - GPIO_Pin_2 + *\*\ - GPIO_Pin_3 + *\*\ - GPIO_Pin_4 + *\*\ - GPIO_Pin_5 + *\*\ - GPIO_Pin_6 + *\*\ - GPIO_Pin_7 + *\*\ - GPIO_Pin_8 + *\*\ - GPIO_Pin_9 + *\*\ - GPIO_Pin_10 + *\*\ - GPIO_Pin_11 + *\*\ - GPIO_Pin_12 + *\*\ - GPIO_Pin_13 + *\*\ - GPIO_Pin_14 + *\*\ - GPIO_Pin_15 + *\*\ - GPIO_Pin_ALL + *\*\param cmd : + *\*\ - DISABLE + *\*\ - ENABLE + *\*\return none + */ +void AFIO_ConfigPinAnFilter(GPIO_Module* GPIOx, uint32_t Pin, FunctionalState cmd) +{ + uint32_t tempReg; + uint32_t RegNum; + uint32_t BitMask; + uint32_t GPIO_Index; + + GPIO_Index = (uint32_t)GPIOx; + GPIO_Index = GPIO_GET_INDEX(GPIO_Index); + + RegNum = GPIO_Index / 2UL; + + if(GPIO_Index == 8 || GPIO_Index == 9) //GPIOI, GPIOJ + { + BitMask = Pin << (16UL * ((GPIO_Index + 1) & 0x1UL)); + } + else + { + BitMask = Pin << (16UL * (GPIO_Index & 0x1UL)); + } + + tempReg = AFIO->EFT_CFG[RegNum]; + + if(cmd != DISABLE) + { + tempReg |= BitMask; + } + else + { + tempReg &= ~(BitMask); + } + + AFIO->EFT_CFG[RegNum] = tempReg; +} +/** +*\*\name AFIO_ConfigDigitalPinFilter. +*\*\fun Enable or disable the digital filter function for GPIOx pin. +*\*\param GPIOx : +*\*\ - GPIOA +*\*\ - GPIOB +*\*\ - GPIOC +*\*\ - GPIOD +*\*\ - GPIOE +*\*\ - GPIOF +*\*\ - GPIOG +*\*\ - GPIOH +*\*\ - GPIOI +*\*\ - GPIOJ +*\*\ - GPIOK +*\*\param Pin : +*\*\ - GPIO_Pin_0 +*\*\ - GPIO_Pin_1 +*\*\ - GPIO_Pin_2 +*\*\ - GPIO_Pin_3 +*\*\ - GPIO_Pin_4 +*\*\ - GPIO_Pin_5 +*\*\ - GPIO_Pin_6 +*\*\ - GPIO_Pin_7 +*\*\ - GPIO_Pin_8 +*\*\ - GPIO_Pin_9 +*\*\ - GPIO_Pin_10 +*\*\ - GPIO_Pin_11 +*\*\ - GPIO_Pin_12 +*\*\ - GPIO_Pin_13 +*\*\ - GPIO_Pin_14 +*\*\ - GPIO_Pin_15 +*\*\ - GPIO_Pin_ALL +*\*\param cmd : +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void AFIO_ConfigPinFilter(GPIO_Module* GPIOx, uint32_t Pin, FunctionalState cmd) +{ + uint32_t tempReg; + uint32_t RegNum; + uint32_t BitMask; + uint32_t GPIO_Index; + + GPIO_Index = (uint32_t)GPIOx; + GPIO_Index = GPIO_GET_INDEX(GPIO_Index); + + RegNum = GPIO_Index / 2UL; + + if(GPIO_Index == 8 || GPIO_Index == 9) //GPIOI, GPIOJ + { + BitMask = Pin << (16UL * ((GPIO_Index + 1) & 0x1UL)); + } + else + { + BitMask = Pin << (16UL * (GPIO_Index & 0x1UL)); + } + + tempReg = AFIO->DIGEFT_CFG[RegNum]; + + if(cmd != DISABLE) + { + tempReg |= BitMask; + } + else + { + tempReg &= ~(BitMask); + } + + AFIO->DIGEFT_CFG[RegNum] = tempReg; +} + +/** + *\*\name AFIO_ConfigHSMODE. + *\*\fun Enable or disable HS_EN pad interface connection for SDRAM PAD model. + *\*\param GPIOx : + *\*\ - GPIOA + *\*\ - GPIOB + *\*\ - GPIOC + *\*\ - GPIOD + *\*\ - GPIOE + *\*\ - GPIOF + *\*\ - GPIOG + *\*\ - GPIOH + *\*\ - GPIOI + *\*\param Pin : + *\*\ - GPIO_Pin_0 + *\*\ - GPIO_Pin_1 + *\*\ - GPIO_Pin_2 + *\*\ - GPIO_Pin_3 + *\*\ - GPIO_Pin_4 + *\*\ - GPIO_Pin_5 + *\*\ - GPIO_Pin_6 + *\*\ - GPIO_Pin_7 + *\*\ - GPIO_Pin_8 + *\*\ - GPIO_Pin_9 + *\*\ - GPIO_Pin_10 + *\*\ - GPIO_Pin_11 + *\*\ - GPIO_Pin_12 + *\*\ - GPIO_Pin_13 + *\*\ - GPIO_Pin_14 + *\*\ - GPIO_Pin_15 + *\*\ - GPIO_Pin_ALL + *\*\param cmd : + *\*\ - DISABLE + *\*\ - ENABLE + *\*\note Most of pins support ,but some pins don't support. + *\*\return none + */ +void AFIO_ConfigHSMODE(GPIO_Module* GPIOx, uint32_t Pin, FunctionalState cmd) +{ + uint32_t tempReg; + uint32_t RegNum; + uint32_t BitMask; + uint32_t GPIO_Index; + + GPIO_Index = (uint32_t)GPIOx; + GPIO_Index = GPIO_GET_INDEX(GPIO_Index); + + RegNum = GPIO_Index / 2UL; + BitMask = Pin << (16UL * ((GPIO_Index + 1) & 0x1UL)); + tempReg = AFIO->HSMODE_CFG[RegNum]; + + if(cmd != DISABLE) + { + tempReg |= BitMask; + } + else + { + tempReg &= ~(BitMask); + } + + AFIO->HSMODE_CFG[RegNum] = tempReg; +} + +/** +*\*\name AFIO_ConfigXSPIDecNonce. +*\*\fun Set the XSPI DEC NONCE counter value. +*\*\param nonce_num +*\*\ - 0 +*\*\ - 1 +*\*\ - 2 +*\*\param data: 0x00000000~ 0xFFFFFFFF +*\*\return none +**/ +void AFIO_ConfigXSPIDecNonce(uint8_t nonce_num, u32 data) +{ + if(nonce_num == 0x00) + { + AFIO->XSPI1_NONCE0 = data; + } + else if(nonce_num == 0x01) + { + AFIO->XSPI1_NONCE1 = data; + } + else if(nonce_num == 0x02) + { + AFIO->XSPI1_NONCE2 = data; + } +} + +/** +*\*\name AFIO_ConfigSDRAMVREFRemap. +*\*\fun Config SDRAM VREF counter value. +*\*\param pin +*\*\ - AFIO_SDRAM_PIN_PA4 +*\*\ - AFIO_SDRAM_PIN_PA5 +*\*\ - AFIO_SDRAM_PIN_PA7 +*\*\ - AFIO_SDRAM_PIN_PB5 +*\*\ - AFIO_SDRAM_PIN_PB6 +*\*\ - ... +*\*\ - AFIO_SDRAM_PIN_PI7 +*\*\ - AFIO_SDRAM_PIN_PI9 +*\*\ - AFIO_SDRAM_PIN_PI10 +*\*\param cmd : +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void AFIO_ConfigSDRAMVREFRemap(AFIO_SDRAM_PIN pin, FunctionalState cmd) +{ + uint8_t temp; + uint32_t temp_reg; + + temp = pin / 32; + temp_reg = AFIO->SDRAM_VREF_EN[temp]; + + if(cmd != DISABLE) + { + temp_reg |= (uint32_t)(0x00000001) << (pin % 32); + } + else + { + temp_reg &= ~(uint32_t)(0x00000001) << (pin % 32); + } + + AFIO->SDRAM_VREF_EN[temp] = temp_reg; +} + +/** +*\*\name AFIO_ConfigSDRAMVREFData. +*\*\fun Config SDRAM VREF counter value. +*\*\param reg_index: +*\*\ - 0 +*\*\ - 1 +*\*\ - 2 +*\*\param data: when reg_index = 0 or 1, data range 0~0xFFFFFFFF, when reg_index = 2, data range 0~0x1FF +*\*\return none +**/ +void AFIO_ConfigSDRAMVREFData(uint8_t reg_index, uint32_t data) +{ + AFIO->SDRAM_VREF_EN[reg_index] = data; +} + + +/** +*\*\name AFIO_ConfigSDRAMDSNRemap. +*\*\fun Config SDRAM DSN counter value. +*\*\param pin +*\*\ - AFIO_SDRAM_PIN_PA4 +*\*\ - AFIO_SDRAM_PIN_PA5 +*\*\ - AFIO_SDRAM_PIN_PA7 +*\*\ - AFIO_SDRAM_PIN_PB5 +*\*\ - AFIO_SDRAM_PIN_PB6 +*\*\ - ... +*\*\ - AFIO_SDRAM_PIN_PI7 +*\*\ - AFIO_SDRAM_PIN_PI9 +*\*\ - AFIO_SDRAM_PIN_PI10 +*\*\param cmd : +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void AFIO_ConfigSDRAMDSNRemap(AFIO_SDRAM_PIN pin, FunctionalState cmd) +{ + uint8_t temp; + uint32_t temp_reg; + + temp = pin / 32; + temp_reg = AFIO->SDRAMDSN_CFG[temp]; + + if(cmd != DISABLE) + { + temp_reg |= (uint32_t)(0x00000001) << (pin % 32); + } + else + { + temp_reg &= ~(uint32_t)(0x00000001) << (pin % 32); + } + + AFIO->SDRAMDSN_CFG[temp] = temp_reg; +} + +/** +*\*\name AFIO_ConfigSDRAMDSNData. +*\*\fun Config SDRAM DSN counter value. +*\*\param reg_index: +*\*\ - 0 +*\*\ - 1 +*\*\ - 2 +*\*\param data: when reg_index = 0 or 1, data range 0~0xFFFFFFFF, when reg_index = 2, data range 0~0x1FF +*\*\return none +**/ +void AFIO_ConfigSDRAMDSNData(uint8_t reg_index, uint32_t data) +{ + AFIO->SDRAMDSN_CFG[reg_index] = data; +} + +/** +*\*\name AFIO_ConfigSDRAMDSPRemap. +*\*\fun Config SDRAM DSP counter value. +*\*\param pin +*\*\ - AFIO_SDRAM_PIN_PA4 +*\*\ - AFIO_SDRAM_PIN_PA5 +*\*\ - AFIO_SDRAM_PIN_PA7 +*\*\ - AFIO_SDRAM_PIN_PB5 +*\*\ - AFIO_SDRAM_PIN_PB6 +*\*\ - ... +*\*\ - AFIO_SDRAM_PIN_PI7 +*\*\ - AFIO_SDRAM_PIN_PI9 +*\*\ - AFIO_SDRAM_PIN_PI10 +*\*\param cmd : +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void AFIO_ConfigSDRAMDSPRemap(AFIO_SDRAM_PIN pin, FunctionalState cmd) +{ + uint8_t temp; + uint32_t temp_reg; + + temp = pin / 32; + temp_reg = AFIO->SDRAMDSP_CFG[temp]; + + if(cmd != DISABLE) + { + temp_reg |= (uint32_t)(0x00000001) << (pin % 32); + } + else + { + temp_reg &= ~(uint32_t)(0x00000001) << (pin % 32); + } + + AFIO->SDRAMDSP_CFG[temp] = temp_reg; +} + +/** +*\*\name AFIO_ConfigSDRAMDSPData. +*\*\fun Config SDRAM DSP counter value. +*\*\param reg_index: +*\*\ - 0 +*\*\ - 1 +*\*\ - 2 +*\*\param data: when reg_index = 0 or 1, data range 0~0xFFFFFFFF, when reg_index = 2, data range 0~0x1FF +*\*\return none +**/ +void AFIO_ConfigSDRAMDSPData(uint8_t reg_index, uint32_t data) +{ + AFIO->SDRAMDSP_CFG[reg_index] = data; +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_i2c.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_i2c.c new file mode 100644 index 0000000000..7f271ee44e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_i2c.c @@ -0,0 +1,1733 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_i2c.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_i2c.h" +#include "n32h76x_78x_rcc.h" + +/** +*\*\name I2C_DeInit. +*\*\fun Deinitializes the I2Cx peripheral registers to their default reset values. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\return None +**/ +void I2C_DeInit(I2C_Module* I2Cx) +{ + if (I2Cx == I2C1) + { + /* Enable I2C1 reset state */ + RCC_EnableAPB1PeriphReset4(RCC_APB1_PERIPHRST_I2C1); + } + else if (I2Cx == I2C2) + { + /* Enable I2C2 reset state */ + RCC_EnableAPB1PeriphReset4(RCC_APB1_PERIPHRST_I2C2); + } + else if (I2Cx == I2C3) + { + /* Enable I2C3 reset state */ + RCC_EnableAPB1PeriphReset4(RCC_APB1_PERIPHRST_I2C3); + } + else if (I2Cx == I2C4) + { + /* Enable I2C4 reset state */ + RCC_EnableAPB2PeriphReset2(RCC_APB2_PERIPHRST_I2C4); + } + else if (I2Cx == I2C5) + { + /* Enable I2C5 reset state */ + RCC_EnableAPB2PeriphReset2(RCC_APB2_PERIPHRST_I2C5); + } + else if (I2Cx == I2C6) + { + /* Enable I2C6 reset state */ + RCC_EnableAPB2PeriphReset2(RCC_APB2_PERIPHRST_I2C6);; + } + else if (I2Cx == I2C7) + { + /* Enable I2C7 reset state */ + RCC_EnableAPB5PeriphReset2(RCC_APB5_PERIPHRST_I2C7); + } + else if (I2Cx == I2C8) + { + /* Enable I2C8 reset state */ + RCC_EnableAPB5PeriphReset2(RCC_APB5_PERIPHRST_I2C8); + } + else if (I2Cx == I2C9) + { + /* Enable I2C9 reset state */ + RCC_EnableAPB5PeriphReset2(RCC_APB5_PERIPHRST_I2C9); + } + else + { + /* Enable I2C10 reset state */ + RCC_EnableAPB5PeriphReset2(RCC_APB5_PERIPHRST_I2C10); + } + +} + + + +/** +*\*\name I2C_Init. +*\*\fun Initializes the I2C peripheral according to the specified parameters in the I2C_InitStruct. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param I2C_InitStruct (The input parameters must be the following values): +*\*\ - Timing +*\*\ - HSTiming +*\*\ - OwnAddress1: +*\*\ - between 0 to 0x3FF +*\*\ - AddressingMode(only for Address1): +*\*\ - I2C_ADDRESSINGMODE_7BIT +*\*\ - I2C_ADDRESSINGMODE_10BIT +*\*\ - DualAddressMode: +*\*\ - I2C_DUALADDRESS_DISABLE +*\*\ - I2C_DUALADDRESS_ENABLE +*\*\ - OwnAddress2: +*\*\ - between 0 to 0xFF +*\*\ - OwnAddress2Masks: +*\*\ - I2C_ADDRESS2MASK_NONE AD2[7:1] are compared. +*\*\ - I2C_ADDRESS2MASK_1 AD2[1] dont care. Only AD2[7:2] are compared. +*\*\ - I2C_ADDRESS2MASK_2_1 AD2[2:1] dont care. Only AD2[7:3] are compared. +*\*\ - I2C_ADDRESS2MASK_3_1 AD2[3:1] dont care. Only AD2[7:4] are compared. +*\*\ - I2C_ADDRESS2MASK_4_1 AD2[4:1] dont care. Only AD2[7:5] are compared. +*\*\ - I2C_ADDRESS2MASK_5_1 AD2[5:1] dont care. Only AD2[7:6] are compared. +*\*\ - I2C_ADDRESS2MASK_6_1 AD2[6:1] dont care. Only AD2[7] is compared. +*\*\ - I2C_ADDRESS2MASK_7_1 AD2[7:1] dont care. No comparison is done. +*\*\ - GeneralCallMode: +*\*\ - I2C_GENERALCALL_DISABLE +*\*\ - I2C_GENERALCALL_ENABLE +*\*\ - NoStretchMode: +*\*\ - I2C_NOSTRCH_DISABLE +*\*\ - I2C_NOSTRCH_ENABLE +*\*\return Status +**/ +void I2C_Init(I2C_Module* I2Cx, I2C_InitType* I2C_InitStruct) +{ + uint32_t temp_value; + + /* Disable the selected I2C peripheral */ + I2C_Enable(I2Cx, DISABLE); + + /*---------------------------- I2Cx BUSTIM Configuration ------------------*/ + /* Configure I2Cx: Frequency range */ + I2Cx->BUSTIM = I2C_InitStruct->Timing & TIMING_CLEAR_MASK; + I2Cx->HSBUSTM = I2C_InitStruct->HSTiming & TIMING_CLEAR_MASK; + + /*---------------------------- I2Cx ADR1 Configuration ---------------------*/ + /* Disable Own Address1 before set the Own Address1 configuration */ + I2Cx->ADR1 &= (~I2C_ADR1_AD1EN); + + /* Configure I2Cx: Own Address1 and ack own address1 mode */ + if (I2C_InitStruct->AddressingMode == I2C_ADDRESSINGMODE_7BIT) + { + I2Cx->ADR1 = (I2C_ADR1_AD1EN | I2C_InitStruct->OwnAddress1); + } + else /* I2C_ADDRESSINGMODE_10BIT */ + { + I2Cx->ADR1 = (I2C_ADR1_AD1EN | I2C_ADR1_AD1MODE | I2C_InitStruct->OwnAddress1); + } + + /*---------------------------- I2Cx CTRL2 Configuration ----------------------*/ + /* Configure I2Cx: Addressing Master mode */ + if (I2C_InitStruct->AddressingMode == I2C_ADDRESSINGMODE_10BIT) + { + I2Cx->CTRL2 |= (I2C_CTRL2_ADR10); + } + + /*---------------------------- I2Cx ADR2 Configuration ---------------------*/ + /* Disable Own Address2 before set the Own Address2 configuration */ + I2Cx->ADR2 &= (~I2C_DUALADDRESS_ENABLE); + /* Configure I2Cx: Dual mode and Own Address2 */ + I2Cx->ADR2 = (I2C_InitStruct->DualAddressMode | I2C_InitStruct->OwnAddress2 | I2C_InitStruct->OwnAddress2Masks); + + /*---------------------------- I2Cx CTRL1 Configuration ----------------------*/ + temp_value = I2Cx->CTRL1; + temp_value &= CTRL1_CLEAR_MASK; + /* Configure I2Cx: Generalcall and NoStretch mode */ + temp_value |= (I2C_InitStruct->GeneralCallMode | I2C_InitStruct->NoStretchMode); + I2Cx->CTRL1 = temp_value; + + /*--------------------------------------------------------------------------------*/ + /* Enable the selected I2C peripheral */ + I2C_Enable(I2Cx, ENABLE); + +} + +/** +*\*\name I2C_Initializes_Structure. +*\*\fun Fills each I2C_InitStruct member with its default value. +*\*\param (The input parameters must be the following values): +*\*\ - Timing +*\*\ - HSTiming +*\*\ - OwnAddress1 +*\*\ - AddressingMode +*\*\ - DualAddressMode +*\*\ - OwnAddress2 +*\*\ - OwnAddress2Masks +*\*\ - GeneralCallMode +*\*\ - NoStretchMode +*\*\return none +**/ +void I2C_InitStruct(I2C_InitType* I2C_StructInit) +{ + /*Reset I2C init structure parameters values */ + I2C_StructInit->Timing = 0x50012526; + I2C_StructInit->HSTiming = 0x0; + I2C_StructInit->OwnAddress1 = 0x0; + I2C_StructInit->AddressingMode = I2C_ADDRESSINGMODE_7BIT; + I2C_StructInit->DualAddressMode = I2C_DUALADDRESS_DISABLE; + I2C_StructInit->OwnAddress2 = 0x0; + I2C_StructInit->OwnAddress2Masks = I2C_ADDRESS2MASK_NONE; + I2C_StructInit->GeneralCallMode = I2C_GENERALCALL_DISABLE; + I2C_StructInit->NoStretchMode = I2C_NOSTRCH_DISABLE; + +} + +/** +*\*\name I2C_Enable. +*\*\fun Enables or disables the specified I2C peripheral. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_Enable(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected I2C peripheral */ + I2Cx->CTRL1 |= CTRL1_SPEN_SET; + } + else + { + /* Disable the selected I2C peripheral */ + I2Cx->CTRL1 &= CTRL1_SPEN_RESET; + } +} + +/** +*\*\name I2C_ConfigSendAddress. +*\*\fun Configure slave address and transfer direction in master mode. +*\*\param I2Cx (The input parameters must be the following values): +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param address (The input parameters must be the following values) +*\*\ - 0 to 0x3FF +*\*\param mode (The input parameters must be the following values): +*\*\ - I2C_DIRECTION_SEND Transmitter mode +*\*\ - I2C_DIRECTION_RECV Receiver mode +*\*\return none +**/ +void I2C_ConfigSendAddress(I2C_Module* I2Cx, uint32_t address, uint32_t direction) +{ + uint32_t temp_value; + + temp_value = I2Cx->CTRL2; + temp_value &= I2C_SADR_RWN_MASK; + /* Test on the direction to set/reset the read/write bit */ + temp_value |= ((address & I2C_SADR_MASK) | direction); + + I2Cx->CTRL2 = temp_value; +} + +/** +*\*\name I2C_Enable10bitAddressHeader. +*\*\fun 10-bit address header executes complete sequence in master receive mode. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_Enable10bitAddressHeader(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Generate a START condition */ + I2Cx->CTRL2 |= CTRL2_HDR10_ENABLE; + } + else + { + /* Disable the START condition generation */ + I2Cx->CTRL2 &= CTRL2_HDR10_DISABLE; + } +} + +/** +*\*\name I2C_EnableAutomaticEnd. +*\*\fun Enable I2C automatic end mode in master mode. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableAutomaticEnd(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Generate a START condition */ + I2Cx->CTRL2 |= CTRL2_AUTO_STOP; + } + else + { + /* Disable the START condition generation */ + I2Cx->CTRL2 &= CTRL2_SOFTWARE_STOP; + } +} + +/** +*\*\name I2C_EnableReload. +*\*\fun Enable I2C reload mode. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableReload(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Generate a START condition */ + I2Cx->CTRL2 |= CTRL2_REFILL_ENABLE; + } + else + { + /* Disable the START condition generation */ + I2Cx->CTRL2 &= CTRL2_REFILL_DISABLE; + } +} + + +/** +*\*\name I2C_GenerateStart. +*\*\fun Generates I2Cx communication START condition. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_GenerateStart(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Generate a START condition */ + I2Cx->CTRL2 |= CTRL2_START_ENABLE; + } + else + { + /* Disable the START condition generation */ + I2Cx->CTRL2 &= CTRL2_START_DISABLE; + } +} + +/** +*\*\name I2C_GenerateStop. +*\*\fun Generates I2Cx communication STOP condition. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_GenerateStop(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Generate a STOP condition */ + I2Cx->CTRL2 |= CTRL2_STOP_ENABLE; + } + else + { + /* Disable the STOP condition generation */ + I2Cx->CTRL2 &= CTRL2_STOP_DISABLE; + } +} + + +/** +*\*\name I2C_ConfigAck. +*\*\fun Enables or disables the specified I2C acknowledge feature. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_ConfigAck(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the acknowledgement */ + I2Cx->CTRL2 &= CTRL2_ACK; + } + else + { + /* Disable the acknowledgement */ + I2Cx->CTRL2 |= CTRL2_NACK; + } +} + + +/** +*\*\name I2C_ConfigOwnAddr2. +*\*\fun Configures the specified I2C own address2. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Address +*\*\ - 7bit I2C own address2 +*\*\return none +**/ +void I2C_ConfigOwnAddr2(I2C_Module* I2Cx, uint8_t Address) +{ + uint32_t tmpregister; + + /* Get the old register value */ + tmpregister = I2Cx->ADR2; + + /* Reset I2Cx Own address2 bit [7:1] */ + tmpregister &= ADR2_AD2_RESET; + + /* Set I2Cx Own address2 */ + tmpregister |= (uint16_t)((uint16_t)Address & ADR2_AD2_SET); + + /* Store the new register value */ + I2Cx->ADR2 = tmpregister; +} + + +/** +*\*\name I2C_EnableDualAddr. +*\*\fun Enables or disables the specified I2C dual addressing mode. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableDualAddr(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable dual addressing mode */ + I2Cx->ADR2 |= ADR2_ENABLE; + } + else + { + /* Disable dual addressing mode */ + I2Cx->ADR2 &= ADR2_DISABLE; + } +} + + +/** +*\*\name I2C_EnableGeneralCall. +*\*\fun Enables or disables the specified I2C general call feature. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableGeneralCall(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable generall call */ + I2Cx->CTRL1 |= CTRL1_GENC_SET; + } + else + { + /* Disable generall call */ + I2Cx->CTRL1 &= CTRL1_GENC_RESET; + } +} + +/** +*\*\name I2C_EnableSlaveByteControl. +*\*\fun Enables or disables slave byte control. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableSlaveByteControl(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable slave byte control */ + I2Cx->CTRL1 |= CTRL1_SBCTL_SET; + } + else + { + /* Disable slave byte control */ + I2Cx->CTRL1 &= CTRL1_SBCTL_RESET; + } +} + +/** +*\*\name I2C_EnableSMBusAlert. +*\*\fun Enables or disables SMBus alert. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableSMBusAlert(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable slave byte control */ + I2Cx->CTRL1 |= CTRL1_ALRTEN_SET; + } + else + { + /* Disable slave byte control */ + I2Cx->CTRL1 &= CTRL1_ALRTEN_RESET; + } +} + +/** +*\*\name I2C_EnableSMBusDefaultAddr. +*\*\fun Enables or disables SMBus device default address. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableSMBusDefaultAddr(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable slave byte control */ + I2Cx->CTRL1 |= CTRL1_SMBD_SET; + } + else + { + /* Disable slave byte control */ + I2Cx->CTRL1 &= CTRL1_SMBD_RESET; + } +} + +/** +*\*\name I2C_EnableSMBusHostAddr. +*\*\fun Enables or disables SMBus host address. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableSMBusHostAddr(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable slave byte control */ + I2Cx->CTRL1 |= CTRL1_SMBH_SET; + } + else + { + /* Disable slave byte control */ + I2Cx->CTRL1 &= CTRL1_SMBH_RESET; + } +} + +/** +*\*\name I2C_SendData. +*\*\fun Sends a data byte through the I2Cx peripheral. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Data +*\*\return none +**/ +void I2C_SendData(I2C_Module* I2Cx, uint8_t Data) +{ + /* Write in the DAT register the data to be sent */ + I2Cx->WDR = Data; +} + +/** +*\*\name I2C_RecvData. +*\*\fun Returns the most recent received data by the I2Cx peripheral. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\return The value of the received data +**/ +uint8_t I2C_RecvData(I2C_Module* I2Cx) +{ + /* Return the data in the DAT register */ + return (uint8_t)I2Cx->RDR; +} + + +/** +*\*\name I2C_SendCRC. +*\*\fun Enables or disables the specified I2C CRC transfer. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_SendCRC(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected I2C CRC transmission */ + I2Cx->CTRL2 |= CTRL2_CRCBYTE_ENABLE; + } + else + { + /* Disable the selected I2C CRC transmission */ + I2Cx->CTRL2 &= CTRL2_CRCBYTE_DISABLE; + } +} + +/** +*\*\name I2C_EnableCRC. +*\*\fun Enables or disables the CRC value calculation of the transferred bytes. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableCRC(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected I2C PEC calculation */ + I2Cx->CTRL1 |= CTRL1_CRCEN_SET; + } + else + { + /* Disable the selected I2C PEC calculation */ + I2Cx->CTRL1 &= CTRL1_CRCEN_RESET; + } +} + + + +/** +*\*\name I2C_EnableQuickCommand. +*\*\fun Enables or disables Quick Command(For Master or Slave mode). +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableQuickCommand(I2C_Module* I2Cx, FunctionalState Cmd) +{ + + if( Cmd == DISABLE) + { + I2Cx->QCMD &= QCMD_DISABLE; + } + else + { + I2Cx->QCMD |= QCMD_ENABLE; + } +} + +/** +*\*\name I2C_ConfigQuickCommandAddr. +*\*\fun Configures SMB Quick command address(For Slave mode only). +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Address +*\*\ - 7bit own address +*\*\return none +**/ +void I2C_ConfigQuickCommandAddr(I2C_Module* I2Cx, uint8_t Address) +{ + uint32_t tmpregister; + + /* Get the old register value */ + tmpregister = I2Cx->QCMD; + + /* Reset address bit [6:1] */ + tmpregister &= QCMDAD_MASK; + + /* Set address */ + tmpregister |= Address; + + /* Store the new register value */ + I2Cx->QCMD = tmpregister; +} + +/** +*\*\name I2C_EnableTXFIFO. +*\*\fun Enables or disables the TX FIFO. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableTXFIFO(I2C_Module* I2Cx, FunctionalState Cmd) +{ + + if( Cmd == DISABLE) + { + I2Cx->FIFOCSR &= TFE_DISABLE; + } + else + { + I2Cx->FIFOCSR |= TFE_ENABLE; + } +} + +/** +*\*\name I2C_EnableRXFIFO. +*\*\fun Enables or disables the RX FIFO. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableRXFIFO(I2C_Module* I2Cx, FunctionalState Cmd) +{ + + if( Cmd == DISABLE) + { + I2Cx->FIFOCSR &= RFE_DISABLE; + } + else + { + I2Cx->FIFOCSR |= RFE_ENABLE; + } +} + +/** +*\*\name I2C_EnableTXDMA. +*\*\fun Enables or disables the TX DMA request. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableTXDMA(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if( Cmd == DISABLE) + { + I2Cx->CTRL1 &= CTRL1_DMAWREN_TRANSMISSION_RESET; + } + else + { + I2Cx->CTRL1 |= CTRL1_DMAWREN_TRANSMISSION_SET; + } +} + +/** +*\*\name I2C_EnableRXDMA. +*\*\fun Enables or disables the RX DMA request. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableRXDMA(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if( Cmd == DISABLE) + { + I2Cx->CTRL1 &= CTRL1_DMARDEN_RECEPTION_RESET; + } + else + { + I2Cx->CTRL1 |= CTRL1_DMARDEN_RECEPTION_SET; + } +} + + +/** +*\*\name I2C_SetTransferByteNumber. +*\*\fun Set the number of data bytes that will be transferred of I2C peripheral. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Number_Of_bytes: +*\*\ - 0 ~ 255 +*\*\return none +*\*\note The number of bytes is greater than or equal to 2. +**/ +void I2C_SetTransferByteNumber(I2C_Module* I2Cx, uint8_t Number_Of_bytes) +{ + uint32_t temp_value; + + temp_value = I2Cx->CTRL2; + temp_value &= (BYTENUM_Mask); + temp_value |= ((uint32_t)Number_Of_bytes << 16); + I2Cx->CTRL2 = temp_value; + +} + + +/** +*\*\name I2C_SetTXFIFO_ILEVEL. +*\*\fun Config TX FIFO empty level. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param TX_ILEVEL: +*\*\ - 0 ~ 15 +*\*\return none +**/ +void I2C_SetTXFIFO_ILEVEL(I2C_Module* I2Cx, uint8_t TX_ILEVEL) +{ + uint32_t temp_value; + + /* Config TX FIFO emptly level */ + temp_value = I2Cx->FIFOCSR; + temp_value &= (FIFO_TX_ILEVEL_Mask); + temp_value |= (((uint32_t)TX_ILEVEL & 0xF) << 24); + I2Cx->FIFOCSR = temp_value; +} + +/** +*\*\name I2C_SetRXFIFO_ILEVEL. +*\*\fun Config RX FIFO level to generate interrupt. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param RX_ILEVEL: +*\*\ - 0 ~ 15 +*\*\return none +**/ +void I2C_SetRXFIFO_ILEVEL(I2C_Module* I2Cx, uint8_t RX_ILEVEL) +{ + uint32_t temp_value; + + /* Config RX FIFO emptly level */ + temp_value = I2Cx->FIFOCSR; + temp_value &= (FIFO_RX_ILEVEL_Mask); + temp_value |= (((uint32_t)RX_ILEVEL & 0xF) << 16); + I2Cx->FIFOCSR = temp_value; +} + +/** +*\*\name I2C_GetTXFIFO_FLEVEL. +*\*\fun Returns TX FIFO data number. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\return FIFO data. +**/ +uint8_t I2C_GetTXFIFO_FLEVEL(I2C_Module* I2Cx) +{ + uint32_t tmpregister; + + /* Return the data in the FIFODAT register */ + tmpregister = ((I2Cx->FIFOCSR & FIFO_TX_FLEVEL_Mask) >> 8); + + return (uint8_t)tmpregister; +} + +/** +*\*\name I2C_GetRXFIFO_FLEVEL. +*\*\fun Returns RX FIFO data number. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\return FIFO data. +**/ +uint8_t I2C_GetRXFIFO_FLEVEL(I2C_Module* I2Cx) +{ + uint32_t tmpregister; + + /* Return the data in the FIFODAT register */ + tmpregister = (I2Cx->FIFOCSR & FIFO_RX_FLEVEL_Mask); + + return (uint8_t)tmpregister; +} + +/** +*\*\name I2C_EnableSCLTimeoutDetection. +*\*\fun Enable or disable clk timeout. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableSCLTimeoutDetection(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if( Cmd == DISABLE) + { + I2Cx->TMOUTR &= ~TMOUTEN_ENABLE; + } + else + { + I2Cx->TMOUTR |= TMOUTEN_ENABLE; + } +} + +/** +*\*\name I2C_EnableExtenClkTimeout. +*\*\fun Enable or disable extended clk timeout. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableExtenClkTimeout(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if( Cmd == DISABLE) + { + I2Cx->TMOUTR &= ~TMEXTEN_ENABLE; + } + else + { + I2Cx->TMOUTR |= TMEXTEN_ENABLE; + } +} + +/** +*\*\name I2C_SetBusTimeoutA. +*\*\fun Configure bus timeout A. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param bus_timeout +*\*\ - 0x0 ~ 0xFFF +*\*\return none +**/ +void I2C_SetBusTimeoutA(I2C_Module* I2Cx, uint32_t bus_timeout) +{ + uint32_t temp_value; + + temp_value = I2Cx->TMOUTR; + temp_value &= I2C_TMOUTA_MASK; + temp_value |= (bus_timeout & 0xFFFU); + I2Cx->TMOUTR = temp_value; +} + +/** +*\*\name I2C_SetBusTimeoutB. +*\*\fun Configure bus timeout B. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param bus_timeout +*\*\ - 0x0 ~ 0xFFF +*\*\return none +**/ +void I2C_SetBusTimeoutB(I2C_Module* I2Cx, uint32_t bus_timeout) +{ + uint32_t temp_value; + + temp_value = I2Cx->TMOUTR; + temp_value &= I2C_TMOUTB_MASK; + temp_value |= ((bus_timeout << 16) & 0xFFF0000U); + I2Cx->TMOUTR = temp_value; +} + +/** +*\*\name I2C_ConfigIdleClockTimeout. +*\*\fun Configure idle clock timeout detection. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param bus_timeout +*\*\ - I2C_TMOUTA_DETECT_SCL_LOW +*\*\ - I2C_TMOUTA_DETECT_BUS_IDLE +*\*\return none +**/ +void I2C_ConfigIdleClockTimeout(I2C_Module* I2Cx, uint32_t bus_timeout) +{ + uint32_t temp_value; + + temp_value = I2Cx->TMOUTR; + temp_value &= (~I2C_TMOUTA_DETECT_BUS_IDLE); + temp_value |= bus_timeout; + I2Cx->TMOUTR = temp_value; +} + +/** +*\*\name I2C_EnableAnalogFilter. +*\*\fun Enables or disables Analog Filter. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableAnalogFilter(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if( Cmd == DISABLE) + { + I2Cx->CTRL1 |= CTRL1_AF_SET; + } + else + { + I2Cx->CTRL1 &= CTRL1_AF_RESET; + } +} +/** +*\*\name I2C_Enable_SDA_Analog_Filter. +*\*\fun Enables or disables SDA Analog Filter. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableSDAAnalogFilter(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if( Cmd == DISABLE) + { + I2Cx->GFLTRCTRL |= SDAAFENN_ENABLE; + + } + else + { + I2Cx->GFLTRCTRL &= SDAAFENN_DISABLE ; + } +} + +/** +*\*\name I2C_EnableSCLAnalogFilter. +*\*\fun Enables or disables SCL Analog Filter. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_EnableSCLAnalogFilter(I2C_Module* I2Cx, FunctionalState Cmd) +{ + if( Cmd == DISABLE) + { + I2Cx->GFLTRCTRL |= SCLAFENN_ENABLE; + } + else + { + + I2Cx->GFLTRCTRL &= SCLAFENN_DISABLE ; + } +} + + +/** +*\*\name I2C_SetSCLAnalogFilterWidth. +*\*\fun SCL analog filter width selection. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param width : +*\*\ - I2C_ANALOG_FILTER_WIDTH_5NS +*\*\ - I2C_ANALOG_FILTER_WIDTH_15NS +*\*\ - I2C_ANALOG_FILTER_WIDTH_25NS +*\*\ - I2C_ANALOG_FILTER_WIDTH_35NS +*\*\return none +**/ +void I2C_SetSCLAnalogFilterWidth(I2C_Module* I2Cx, uint32_t width) +{ + uint32_t temp_value; + + temp_value = I2Cx->GFLTRCTRL; + /* Clear SCLAFW[1:0] bits */ + temp_value &= I2C_SCLAFW_MASK; + /* Set SCLAFW[1:0] bits according to width value */ + temp_value |= (width << 4); + /* Store the new value */ + I2Cx->GFLTRCTRL = temp_value; + +} + + +/** +*\*\name I2C_SetSDAAnalogFilterWidth. +*\*\fun SDA analog filter width selection. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param width : +*\*\ - I2C_ANALOG_FILTER_WIDTH_5NS +*\*\ - I2C_ANALOG_FILTER_WIDTH_15NS +*\*\ - I2C_ANALOG_FILTER_WIDTH_25NS +*\*\ - I2C_ANALOG_FILTER_WIDTH_35NS +*\*\return none +**/ +void I2C_SetSDAAnalogFilterWidth(I2C_Module* I2Cx, uint32_t width) +{ + uint32_t temp_value; + + temp_value = I2Cx->GFLTRCTRL; + /* Clear SDAAFW[1:0] bits */ + temp_value &= I2C_SDAAFW_MASK; + /* Set SDAAFW[1:0] bits according to width value */ + temp_value |= width; + /* Store the new value */ + I2Cx->GFLTRCTRL = temp_value; + +} + + +/** +*\*\name I2C_SetDigitalFilterWidth. +*\*\fun SCL digital filter width selection. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param width : +*\*\ - 0x00 Disable the digital filter. +*\*\ - 0x001 ~ 0x3FF The numbers which filters spikes with a length of up to DF10{DFX,DF} *tI2CCLK. + Details pls check I2C user manual. +*\*\return none +**/ +void I2C_SetDigitalFilterWidth(I2C_Module* I2Cx, uint32_t width) +{ + uint32_t temp_value; + + temp_value = I2Cx->CTRL1; + /* Clear DFX[29:24] bits and DF[11:8] bits */ + temp_value &= (CTRL1_DF10_RESET); + + /* Set DFX[29:24] bits and DF[11:8] bits according to width value */ + temp_value |= (((width & 0xF) << 8) | ((width & 0x3F0) << 20)); + /* Store the new value */ + I2Cx->CTRL1 = temp_value; + +} + +/** +*\*\name I2C_ClrFlag. +*\*\fun Clears the I2Cx's pending flags. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param I2C_FLAG : +*\*\ - I2C_FLAG_ADR Address matched(Slave mode) +*\*\ - I2C_FLAG_NAKF NACK flag received +*\*\ - I2C_FLAG_STOPF STOP detection flag +*\*\ - I2C_FLAG_BSER BUS Error flag +*\*\ - I2C_FLAG_ABLO Arbitration lost flag +*\*\ - I2C_FLAG_OVF Overrun/Underrun flag(Slave mode) +*\*\ - I2C_FLAG_CRCERR CRC Error flag in reception +*\*\ - I2C_FLAG_TMOUT Timeout or tLOW detection flag +*\*\ - I2C_FLAG_ALRT SMBUS alert flag +*\*\return none +**/ +void I2C_ClrFlag(I2C_Module* I2Cx, uint32_t I2C_FLAG) +{ + /* Clear the selected I2C flag */ + I2Cx->INTCLR |= I2C_FLAG; +} + + +/** +*\*\name I2C_ConfigInt. +*\*\fun Enables or disables the specified I2C interrupts. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param I2C_IT : +*\*\ - I2C_INT_WDR TX interrupt enable +*\*\ - I2C_INT_RDR RX interrupt enable +*\*\ - I2C_INT_ADR Address match interrupt enable +*\*\ - I2C_INT_NACK Not acknowledge received Interrupt enable +*\*\ - I2C_INT_STOP Stop detection interrupt enable +*\*\ - I2C_INT_TFC Transfer complete interrupt enable +*\*\ - I2C_INT_ERR Error interrupt enable +*\*\ - I2C_INT_RXFIFO FIFO RX interrupt enable +*\*\ - I2C_INT_TXFIFO FIFO TX interrupt enable +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2C_ConfigInt(I2C_Module* I2Cx, uint32_t I2C_IT, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected I2C interrupts */ + I2Cx->CTRL1 |= I2C_IT; + } + else + { + /* Disable the selected I2C interrupts */ + I2Cx->CTRL1 &= (uint32_t)~I2C_IT; + } +} + +/** +*\*\name I2C_GetCRC. +*\*\fun Get the PEC value for the specified I2C. +*\*\param I2Cx (The input parameters must be the following values): +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\return The PEC value +**/ +uint8_t I2C_GetCRC(I2C_Module* I2Cx) +{ + /* Return the selected I2C PEC value */ + return (uint8_t)(I2Cx->CRCR); +} + +/** +*\*\name I2C_GetReceiveAddress. +*\*\fun Get the received address value for the specified I2C. +*\*\param I2Cx (The input parameters must be the following values): +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\return The received address value +**/ +uint8_t I2C_GetReceiveAddress(I2C_Module* I2Cx) +{ + /* Return the selected I2C PEC value */ + return (uint8_t)((I2Cx->STSINT & STSINT_ADRRCV_MASK) >> 17); +} + +/** +*\*\name I2C_GetFlag. +*\*\fun Checks whether the specified I2C flag is set or not. +*\*\param I2Cx : +*\*\ - I2C1 +*\*\ - I2C2 +*\*\ - I2C3 +*\*\ - I2C4 +*\*\ - I2C5 +*\*\ - I2C6 +*\*\ - I2C7 +*\*\ - I2C8 +*\*\ - I2C9 +*\*\ - I2C10 +*\*\param I2C_FLAG : +*\*\ - I2C_FLAG_WRE Write data register empty +*\*\ - I2C_FLAG_WRAVL Write availabe +*\*\ - I2C_FLAG_RDAVL Receive data availabe +*\*\ - I2C_FLAG_ADR Address matched(Slave mode) +*\*\ - I2C_FLAG_NAKF NACK flag received +*\*\ - I2C_FLAG_STOPF STOP detection flag +*\*\ - I2C_FLAG_TFC Transfer Complete(Master mode) +*\*\ - I2C_FLAG_TFCR Transfer Complete Refill +*\*\ - I2C_FLAG_BSER BUS Error flag +*\*\ - I2C_FLAG_ABLO Arbitration lost flag +*\*\ - I2C_FLAG_OVF Overrun/Underrun flag(Slave mode) +*\*\ - I2C_FLAG_CRCERR CRC Error flag in reception +*\*\ - I2C_FLAG_TMOUT Timeout or tLOW detection flag +*\*\ - I2C_FLAG_ALRT SMBUS alert flag +*\*\ - I2C_FLAG_QADR Quick command address matched +*\*\ - I2C_FLAG_BUSY BUS busy flag +*\*\ - I2C_FLAG_DIR Transfer direction +*\*\ - I2C_FLAG_FRXNE Receive FIFO not empty flag +*\*\ - I2C_FLAG_FTXIS Transmit FIFO empty flag +*\*\return SET or RESET +*\*\note none. +**/ +FlagStatus I2C_GetFlag(I2C_Module* I2Cx, uint32_t I2C_FLAG) +{ + FlagStatus bitstatus; + + if ((I2Cx->STSINT & I2C_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_i2s.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_i2s.c new file mode 100644 index 0000000000..d1d259c33f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_i2s.c @@ -0,0 +1,1159 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_i2s.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_i2s.h" +#include "n32h76x_78x_spi.h" +#include "n32h76x_78x.h" + + +/* SPI registers Masks */ +#define CTRL1_CLR_MASK ((uint16_t)0xF9F7U) +#define I2SCFG_CLR_MASK ((uint16_t)0x05FCU) +#define I2SPR_CLEAR_Mask ((uint16_t)0x0FFFU) + +/* SPI or I2S mode selection masks */ +#define SPI_MODE_ENABLE ((uint16_t)0xFFFDU) +#define I2S_MODE_ENABLE ((uint16_t)0x0002U) + +/* I2S I2SE mask */ +#define I2SCFG_I2SEN_ENABLE ((uint16_t)0x0001U) +#define I2SCFG_I2SEN_DISABLE ((uint16_t)0xFFFEU) + + + +/** +*\*\name I2S_InitStruct. +*\*\fun Fills each I2S_InitStruct member with its default value. +*\*\param I2S_InitStruct : +*\*\ - I2sMode +*\*\ - Standard +*\*\ - DataFormat +*\*\ - MCLKEnable +*\*\ - AudioFrequency +*\*\ - CLKPOL +*\*\return none +**/ +void I2S_InitStruct(I2S_InitType* I2S_InitStruct) +{ + /*--------------- Reset I2S init structure parameters values -----------------*/ + /* Initialize the I2sMode member */ + I2S_InitStruct->I2sMode = I2S_MODE_SlAVE_TX; + + /* Initialize the Standard member */ + I2S_InitStruct->Standard = I2S_STD_PHILLIPS; + + /* Initialize the DataFormat member */ + I2S_InitStruct->DataFormat = I2S_DATA_FMT_16BITS; + + /* Initialize the MCLKEnable member */ + I2S_InitStruct->MCLKEnable = I2S_MCLK_DISABLE; + + /* Initialize the AudioFrequency member */ + I2S_InitStruct->ClkSrcFrequency = I2S_AUDIO_FREQ_DEFAULT; + + /* Initialize the CLKPOL member */ + I2S_InitStruct->CLKPOL = I2S_CLKPOL_LOW; +} + + +/** +*\*\name I2S_Mode_Select. +*\*\fun Select working on SPI mode or I2S mode. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\param Mode : +*\*\ - SEL_SPI_Mode +*\*\ - SEL_I2S_Mode +*\*\return none +*\*\note Must be used with I2S or SPI OFF. +**/ +void I2S_SPIModeSelect(I2S_Module* I2Sx, uint16_t Mode) +{ + /* Clear MODSEL bit */ + I2Sx->I2SCFGR &= I2S_MODE_MASK; + /* Select the mode */ + I2Sx->I2SCFGR |= Mode; +} + +/** +*\*\name I2S_Mode_Config. +*\*\fun Config the I2s I2sMode. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\param I2sMode : +*\*\ - I2S_MODE_SlAVE_TX +*\*\ - I2S_MODE_SlAVE_RX +*\*\ - I2S_MODE_MASTER_TX +*\*\ - I2S_MODE_MASTER_RX +*\*\return none +*\*\note Must be used with I2S OFF. +**/ +void I2S_ModeConfig(I2S_Module* I2Sx, uint16_t I2sMode) +{ + /* Clear SPI_I2SCFGR MODCFG bits */ + I2Sx->I2SCFGR &= I2S_MODE_MASK; + /* Set SPI_I2SCFGR MODCFG bits */ + I2Sx->I2SCFGR |= I2sMode; +} + +/** +*\*\name I2S_Standard_Config. +*\*\fun Config the I2s Standard. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\param I2sMode : +*\*\ - I2S_STD_PHILLIPS +*\*\ - I2S_STD_MSB_ALIGN +*\*\ - I2S_STD_LSB_ALIGN +*\*\ - I2S_STD_PCM_SHORTFRAME +*\*\ - I2S_STD_PCM_LONGFRAME +*\*\return none +**/ +void I2S_StandardConfig(I2S_Module* I2Sx, uint16_t Standard) +{ + /* Clear SPI_I2SCFGR STDSEL and PCMFSYNC bit */ + I2Sx->I2SCFGR &= I2S_STANDARD_MASK; + /* Set SPI_I2SCFGR STDSEL and PCMFSYNC bit */ + I2Sx->I2SCFGR |= Standard; +} + +/** +*\*\name I2S_DataFormat_Config. +*\*\fun Config the I2s DataFormat. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\param DataFormat : +*\*\ - I2S_DATA_FMT_16BITS +*\*\ - I2S_DATA_FMT_16BITS_EXTENDED +*\*\ - I2S_DATA_FMT_24BITS +*\*\ - I2S_DATA_FMT_32BITS +*\*\return none +**/ +void I2S_DataFormatConfig(I2S_Module* I2Sx, uint16_t DataFormat) +{ + /* Clear SPI_I2SCFGR CHBITS and TDATLEN bit */ + I2Sx->I2SCFGR &= I2S_DATA_FORMAT_MASK; + /* Set SPI_I2SCFGR CHBITS and TDATLEN bit */ + I2Sx->I2SCFGR |= DataFormat; +} + +/** +*\*\name I2S_MCLK_Enable. +*\*\fun Enable the I2s MCLK. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2S_MclkEnable(I2S_Module* I2Sx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Set SPI_I2SPREDIV MCLKOEN bit */ + I2Sx->I2SPR |= I2S_MCLK_ENABLE; + } + else + { + /* Clear SPI_I2SPREDIV MCLKOEN bit */ + I2Sx->I2SPR &= I2S_MCLK_DISABLE; + } +} + +/** +*\*\name I2S_Config_MCLKEnable_And_AudioFrequency. +*\*\fun Config the I2s MCLKEnable and AudioFrequency. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\param AudioFrequency : +*\*\ - I2S_AUDIO_FREQ_192K +*\*\ - I2S_AUDIO_FREQ_96K +*\*\ - I2S_AUDIO_FREQ_48K +*\*\ - I2S_AUDIO_FREQ_44K +*\*\ - I2S_AUDIO_FREQ_32K +*\*\ - I2S_AUDIO_FREQ_22K +*\*\ - I2S_AUDIO_FREQ_16K +*\*\ - I2S_AUDIO_FREQ_11K +*\*\ - I2S_AUDIO_FREQ_8K +*\*\ - I2S_AUDIO_FREQ_DEFAULT +*\*\return none +**/ +void I2S_AudioFrequencyConfig(I2S_Module* I2Sx, uint32_t AudioFrequency) +{ + uint16_t i2sdiv = 2, i2sodd = 0, packetlength = 1; + uint32_t tmp = 0;/// + RCC_ClocksTypeDef RCC_Clocks; + uint32_t sourceclock = 0; + + /* If the default value has to be written, reinitialize i2sdiv and i2sodd*/ + if (AudioFrequency == I2S_AUDIO_FREQ_DEFAULT) + { + i2sodd = (uint16_t)0; + i2sdiv = (uint16_t)2; + } + else + { + /* Check the frame length (For the SPI_I2SCFGR CHBITSbit) */ + if (I2Sx->I2SCFGR & SPI_I2SCFG_CHLEN) + { + /* Packet length is 32 bits */ + packetlength = 2; + } + else + { + /* Packet length is 16 bits */ + packetlength = 1; + } + + /* I2S Clock source is System clock: Get System Clock frequency */ + RCC_GetClocksFreqValue(&RCC_Clocks); + + /* Get the source clock value: based on System Clock value */ + sourceclock = RCC_Clocks.SysClkFreq; + + /* Compute the Real divider depending on the MCLK output state with a floating point */ + /* Get the I2Sx->I2SPREDIV MCLKOEN bit state */ + if (I2Sx->I2SPR & I2S_MCLK_ENABLE) + { + /* MCLK output is enabled */ + tmp = (uint16_t)(((((sourceclock / 256) * 10) / AudioFrequency)) + 5); + } + else + { + /* MCLK output is disabled */ + tmp = (uint16_t)(((((sourceclock / (32 * packetlength)) * 10) / AudioFrequency)) + 5); + } + + /* Remove the floating point */ + tmp = tmp / 10; + + /* Check the parity of the divider */ + i2sodd = (uint16_t)(tmp & (uint16_t)0x0001); + + /* Compute the i2sdiv prescaler */ + i2sdiv = (uint16_t)((tmp - i2sodd) / 2); + + /* Get the Mask for the Odd bit (SPI_I2SPREDIV[8]) register */ + i2sodd = (uint16_t)(i2sodd << 8); + } + + /* Test if the divider is 1 or 0 or greater than 0xFF */ + if ((i2sdiv < 2) || (i2sdiv > 0xFF)) + { + /* Set the default values */ + i2sdiv = 2; + i2sodd = 0; + } + + /* Write to I2Sx I2SPREDIV register the computed value */ + I2Sx->I2SPR = (uint16_t)(i2sdiv | (uint16_t)(i2sodd | (I2Sx->I2SPR & I2S_MCLK_ENABLE))); +} + +/** +*\*\name I2S_CLKPOL_Config. +*\*\fun Config the I2s CLKPOL. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\param CLKPOL : +*\*\ - I2S_CLKPOL_LOW +*\*\ - I2S_CLKPOL_HIGH +*\*\return none +**/ +void I2S_ClkPolConfig(I2S_Module* I2Sx, uint16_t CLKPOL) +{ + /* Clear SPI_I2SPREDIV CLKPOL bit */ + I2Sx->I2SCFGR &= I2S_CLKPOL_MASK; + /* Set SPI_I2SPREDIV CLKPOL bit */ + I2Sx->I2SCFGR |= CLKPOL; +} + + +/** +*\*\name SPI_I2S_EnableInt. +*\*\fun Enables or disables the specified SPI/I2S interrupts. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_IT : +*\*\ - SPI_I2S_INT_TE +*\*\ - SPI_I2S_INT_RNE +*\*\ - SPI_I2S_INT_ERR +*\*\ - SPI_I2S_INT_RXONLYC +*\*\ - SPI_I2S_INT_RXFIFOF +*\*\ - SPI_I2S_INT_RXFIFOHF +*\*\ - SPI_I2S_INT_TXFIFOHE +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2S_EnableInt(I2S_Module* I2Sx, uint8_t I2S_IT, FunctionalState Cmd) +{ + uint16_t itpos, itmask; + + /* Get the SPI/I2S IT index */ + itpos = I2S_IT >> 4; + + /* Set the IT mask */ + itmask = (uint16_t)1 << (uint16_t)itpos; + + if (Cmd != DISABLE) + { + /* Enable the selected SPI/I2S interrupt */ + I2Sx->CR2 |= itmask; + } + else + { + /* Disable the selected SPI/I2S interrupt */ + I2Sx->CR2 &= (uint16_t)~itmask; + } +} + +/** +*\*\name I2S_Data_Transmit. +*\*\fun Transmits a Data through the I2Sx/I2Sx peripheral. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\param Data \* Data to be transmitted *\ +*\*\return none +**/ +void I2S_TransmitData(I2S_Module* I2Sx, uint16_t Data) +{ + /* Write in the SPI_DAT register the data to be sent */ + I2Sx->DR = Data; +} + +/** +*\*\name I2S_DataFifoTransmit. +*\*\fun Transmits a Data using FIFO through the I2Sx/I2Sx peripheral. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\param Data \* Data to be transmitted *\ +*\*\return none +**/ +void I2S_DataFifoTransmit(I2S_Module* I2Sx, uint16_t Data) +{ + /* Write in the SPI_DAT register the data to be sent */ + I2Sx->DR = Data; +} + +/** +*\*\name I2S_ReceiveData. +*\*\fun Get SPI/I2S data from SPI_DAT register. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\return The data in the SPI_DAT register +**/ +uint16_t I2S_ReceiveData(I2S_Module* I2Sx) +{ + /* Return the data in the SPI_DAT register */ + return I2Sx->DR; +} + +/** +*\*\name I2S_DataFifoGet. +*\*\fun Get SPI/I2S data from RXFIFO register. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\return The data in the SPI_DAT register +**/ +uint16_t I2S_DataFifoGet(I2S_Module* I2Sx) +{ + /* Return the data in the SPI_DAT register */ + return I2Sx->RXFIFO; +} + +/** +*\*\name I2S_Rx_Fifo_Num_Get. +*\*\fun Get I2S Receive Data Counter in FIFO. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\return The RX FIFO Data Count +**/ +uint16_t I2S_Rx_Fifo_Num_Get(I2S_Module* I2Sx) +{ + /* Return The RX Data Count in FIFO*/ + return ((I2Sx->FIFOCNT & I2S_FIFO_NUM_RX_CNT) >> 4); +} + +/** +*\*\name I2S_Tx_Fifo_Num_Get. +*\*\fun Get I2S Send Data Counter in FIFO. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\return The TX Data Count in FIFO +**/ +uint16_t I2S_Tx_Fifo_Num_Get(I2S_Module* I2Sx) +{ + /* Return The TX Data Count in FIFO */ + return ((I2Sx->FIFOCNT & I2S_FIFO_NUM_TX_CNT)); +} + +/** +*\*\name I2S_Tx_Fifo_Half_Full_Threshold_Cfg. +*\*\fun Configure TX FIFO Half Empty Threshold Value. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\return None +**/ +void I2S_Tx_Fifo_Half_Full_Threshold_Cfg(I2S_Module* I2Sx, uint8_t threshold) +{ + /* Configure TX FIFO Half Empty Threshold Value */ + I2Sx->FIFONUM |= (threshold & I2S_FIFO_BURST_NUM_TX); +} + +/** +*\*\name I2S_Rx_Fifo_Half_Full_Threshold_Cfg. +*\*\fun Configure RX FIFO Half Empty Threshold Value. +*\*\param I2Sx : +*\*\ - I2S1 +*\*\ - I2S2 +*\*\ - I2S3 +*\*\ - I2S4 +*\*\return None +**/ +void I2S_Rx_Fifo_Half_Full_Threshold_Cfg(I2S_Module* I2Sx, uint8_t threshold) +{ + /* Configure RX FIFO Half Empty Threshold Value */ + I2Sx->FIFONUM |= ((threshold >> 4) & I2S_FIFO_BURST_NUM_RX); +} + +/** +*\*\name SPI_I2S_GetStatus. +*\*\fun Checks whether the specified SPI/I2S flag is set or not. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_FLAG : +*\*\ - SPI_I2S_BUSY_FLAG +*\*\ - SPI_I2S_OVER_FLAG +*\*\ - SPI_MODERR_FLAG +*\*\ - SPI_CRCERR_FLAG +*\*\ - I2S_UNDER_FLAG +*\*\ - I2S_CHSIDE_FLAG +*\*\ - SPI_I2S_TE_FLAG +*\*\ - SPI_I2S_RNE_FLAG +*\*\ - SPI_I2S_RXONLYC_FLAG +*\*\ - SPI_I2S_RXFIFOF_FLAG +*\*\ - SPI_I2S_TXFIFOE_FLAG +*\*\ - SPI_I2S_RXFIFOHF_FLAG +*\*\ - SPI_I2S_TXFIFOHE_FLAG +*\*\return The new state of SPI_I2S_FLAG (SET or RESET). +**/ +FlagStatus I2S_GetStatus(I2S_Module* I2Sx, uint8_t i2s_flag) +{ + FlagStatus bitstatus; + + /* Check the status of the specified SPI/I2S flag */ + if ((I2Sx->SR & i2s_flag) != (uint16_t)RESET) + { + /* SPI_I2S_FLAG is set */ + bitstatus = SET; + } + else + { + /* SPI_I2S_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the SPI_I2S_FLAG status */ + return bitstatus; +} + +/** +*\*\name I2S_GetIntStatus. +*\*\fun Checks whether the specified SPI/I2S interrupt has occurred or not. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_IT : +*\*\ - SPI_I2S_INT_TE +*\*\ - SPI_I2S_INT_RNE +*\*\ - SPI_I2S_INT_RXONLYC +*\*\ - SPI_I2S_INT_RXFIFOF +*\*\ - SPI_I2S_INT_RXFIFOHF +*\*\ - SPI_I2S_INT_TXFIFOHE +*\*\ - SPI_I2S_INT_CRCERR +*\*\ - SPI_I2S_INT_MODERR +*\*\ - SPI_I2S_INT_OVERERR +*\*\ - I2S_I2S_INT_UNDER +*\*\return The new state of SPI_I2S_IT (SET or RESET). +**/ + +INTStatus I2S_GetIntStatus(const I2S_Module* I2sx, uint8_t I2S_IT) +{ + INTStatus bitstatus = RESET; + uint16_t itpos = 0, itmask = 0, enablestatus = 0; + + /* Get the SPI/I2S IT index */ + itpos = 0x01 << (I2S_IT & 0x0F); + + /* Get the SPI/I2S IT mask */ + itmask = I2S_IT >> 4; + + /* Set the IT mask */ + itmask = 0x01 << itmask; + + /* Get the SPI_I2S_IT enable bit status */ + enablestatus = (I2sx->CR2 & itmask); + + /* Check the status of the specified SPI/I2S interrupt */ + if (((I2sx->SR & itpos) != (uint16_t)RESET) && enablestatus) + { + /* SPI_I2S_IT is set */ + bitstatus = SET; + } + else + { + /* SPI_I2S_IT is reset */ + bitstatus = RESET; + } + + /* Return the SPI_I2S_IT status */ + return bitstatus; +} + + +/** +*\*\name I2S_ClrITPendingBit. +*\*\fun Clears the SPIx CRC Error (CRCERR) interrupt pending bit. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_IT : +*\*\ - SPI_INT_CRCERR +*\*\return none. +**/ +void I2S_ClrITPendingBit(I2S_Module* I2Sx, uint8_t I2S_IT) +{ + uint16_t itpos; + + /* Get the SPI IT index */ + itpos = 0x0001 << (I2S_IT & 0x0F); + + /* Clear the selected SPI CRC Error (CRCERR) interrupt pending bit */ + I2Sx->SR = (uint16_t)~itpos; +} + + +void I2S_Reset(I2S_Module* I2Sx) +{ + if (I2Sx == I2S1) + { + RCC_EnableAPB2PeriphReset2(RCC_APB2_PERIPHRST_I2S1); + } + + else if (I2Sx == I2S2) + { + RCC_EnableAPB2PeriphReset2(RCC_APB2_PERIPHRST_I2S2); + } + + else if (I2Sx == I2S3) + { + RCC_EnableAPB1PeriphReset4(RCC_APB1_PERIPHRST_I2S3); + } + + else if (I2Sx == I2S4) + { + RCC_EnableAPB1PeriphReset4(RCC_APB1_PERIPHRST_I2S4); + } +} + +/** +*\*\name I2S_Init. +*\*\fun Initializes the SPIx peripheral according to the specified parameters in the I2S_InitStruct. +*\*\param SPIx : +*\*\ - SPI2 +*\*\ - SPI3 +*\*\param I2S_InitStruct : +*\*\ - I2sMode +*\*\ - I2S_MODE_SlAVE_TX +*\*\ - I2S_MODE_SlAVE_RX +*\*\ - I2S_MODE_MASTER_TX +*\*\ - I2S_MODE_MASTER_RX +*\*\ - Standard +*\*\ - I2S_STD_PHILLIPS +*\*\ - I2S_STD_MSB_ALIGN +*\*\ - I2S_STD_LSB_ALIGN +*\*\ - I2S_STD_PCM_SHORTFRAME +*\*\ - I2S_STD_PCM_LONGFRAME +*\*\ - DataFormat +*\*\ - I2S_DATA_FMT_16BITS +*\*\ - I2S_DATA_FMT_16BITS_EXTENDED +*\*\ - I2S_DATA_FMT_24BITS +*\*\ - I2S_DATA_FMT_32BITS +*\*\ - MCLKEnable +*\*\ - I2S_MCLK_ENABLE +*\*\ - I2S_MCLK_DISABLE +*\*\ - AudioFrequency +*\*\ - I2S_AUDIO_FREQ_192K +*\*\ - I2S_AUDIO_FREQ_96K +*\*\ - I2S_AUDIO_FREQ_48K +*\*\ - I2S_AUDIO_FREQ_44K +*\*\ - I2S_AUDIO_FREQ_32K +*\*\ - I2S_AUDIO_FREQ_22K +*\*\ - I2S_AUDIO_FREQ_16K +*\*\ - I2S_AUDIO_FREQ_11K +*\*\ - I2S_AUDIO_FREQ_8K +*\*\ - I2S_AUDIO_FREQ_DEFAULT +*\*\ - CLKPOL +*\*\ - I2S_CLKPOL_LOW +*\*\ - I2S_CLKPOL_HIGH +*\*\ - ClkSrcFrequency +*\*\ - RCC_Clocks.SysclkFreq +*\*\ - RCC_Clocks.HclkFreq +*\*\ - RCC_Clocks.Pclk1Freq +*\*\ - RCC_Clocks.Pclk2Freq +*\*\ - RCC_Clocks.AdcPllClkFreq +*\*\ - RCC_Clocks.AdcHclkFreq +*\*\ - RCC_Clocks.ShrtpllFreq +*\*\ - user defined +**/ +void I2S_Init(I2S_Module* I2Sx, const I2S_InitType* I2S_InitStruct) +{ + uint16_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1; + uint32_t tmp = 0; +// RCC_ClocksTypeDef RCC_Clocks; + uint32_t sourceclock = 0; + + + /*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/ + /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ + I2Sx->I2SCFGR &= I2SCFG_CLR_MASK; + I2Sx->I2SPR = 0x0002; + + /* Get the I2SCFGR register value */ + tmpreg = I2Sx->I2SCFGR; + + /* If the default value has to be written, reinitialize i2sdiv and i2sodd*/ + + if (I2S_InitStruct->AudioFrequency == I2S_AUDIO_FREQ_DEFAULT) + { + i2sodd = ( uint16_t )0; + i2sdiv = ( uint16_t )2; + } + + /* If the requested audio frequency is not the default, compute the prescaler */ + else + { + /* Check the frame length (For the Prescaler computing) */ + if ( I2S_InitStruct->DataFormat == I2S_DATA_FMT_16BITS ) + { + /* Packet length is 16 bits */ + packetlength = 1; + } + else + { + /* Packet length is 32 bits */ + packetlength = 2; + } + + /* Get the source clock value: based on System Clock value */ + sourceclock = I2S_InitStruct->ClkSrcFrequency; + + /* Compute the Real divider depending on the MCLK output state with a floating point */ + if ( I2S_InitStruct->MCLKEnable == I2S_MCLK_ENABLE ) + { + /* MCLK output is enabled */ + tmp = ( uint16_t )((((( sourceclock / 256 ) * 10 ) / I2S_InitStruct->AudioFrequency ) ) + 5 ); + } + else + { + /* MCLK output is disabled */ + tmp = ( uint16_t )((((( sourceclock / ( 32 * packetlength ) ) * 10 ) / I2S_InitStruct->AudioFrequency ) ) + 5 ); + } + + /* Remove the floating point */ + tmp = tmp / 10; + + /* Check the parity of the divider */ + i2sodd = ( uint16_t )( tmp & ( uint16_t )0x0001 ); + + /* Compute the i2sdiv prescaler */ + i2sdiv = ( uint16_t )(( tmp - i2sodd ) / 2 ); + + /* Get the Mask for the Odd bit (SPI_I2SPR[10]) register */ + i2sodd = ( uint16_t )( i2sodd << 10 ); + } + + /* Test if the divider is 1 or 0 or greater than 0xFF */ + if (( i2sdiv < 2 ) || ( i2sdiv > 0x3FF ) ) + { + /* Set the default values */ + i2sdiv = 2; + i2sodd = 0; + } + + /* Write to SPIx I2SPR register the computed value */ + I2Sx->I2SPR = ( uint16_t )( i2sdiv | ( uint16_t )( i2sodd | ( uint16_t )I2S_InitStruct->MCLKEnable ) ); + + /* Configure the I2S with the SPI_InitStruct values */ + tmpreg |= ( uint16_t )( I2S_MODE_ENABLE | ( uint16_t )( I2S_InitStruct->I2sMode | \ + ( uint16_t )( I2S_InitStruct->Standard | ( uint16_t )( I2S_InitStruct->DataFormat | \ + ( uint16_t )I2S_InitStruct->CLKPOL ) ) ) ); + + /* Write to SPIx I2SCFGR */ + I2Sx->I2SCFGR = tmpreg; +} + +/** +*\*\name I2S_Enable. +*\*\fun Enables or disables the specified SPI peripheral (in I2S mode). +*\*\param SPIx : +*\*\ - SPI2 +*\*\ - SPI3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2S_Enable(I2S_Module* I2Sx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SPI peripheral (in I2S mode) */ + I2Sx->I2SCFGR |= I2SCFG_I2SEN_ENABLE; + } + else + { + /* Disable the selected SPI peripheral (in I2S mode) */ + I2Sx->I2SCFGR &= I2SCFG_I2SEN_DISABLE; + } +} + +/* I2S_EXT */ +/** +*\*\name I2S_EXTInit. +*\*\fun Initializes the I2Sx_EXT peripheral according to the specified parameters in the I2S_EXT_InitStruct. +*\*\param I2Sx_EXT : +*\*\ - I2S2_EXT +*\*\ - I2S3_EXT +*\*\param I2S_InitStruct: +*\*\ - I2sMode +*\*\ - I2S_MODE_SlAVE_TX +*\*\ - I2S_MODE_SlAVE_RX +*\*\ - I2S_MODE_MASTER_TX +*\*\ - I2S_MODE_MASTER_RX +*\*\ - Standard +*\*\ - I2S_STD_PHILLIPS +*\*\ - I2S_STD_MSB_ALIGN +*\*\ - I2S_STD_LSB_ALIGN +*\*\ - I2S_STD_PCM_SHORTFRAME +*\*\ - I2S_STD_PCM_LONGFRAME +*\*\ - DataFormat +*\*\ - I2S_DATA_FMT_16BITS +*\*\ - I2S_DATA_FMT_16BITS_EXTENDED +*\*\ - I2S_DATA_FMT_24BITS +*\*\ - I2S_DATA_FMT_32BITS +*\*\ - CLKPOL +*\*\ - I2S_CLKPOL_LOW +*\*\ - I2S_CLKPOL_HIGH +*\*\return none +**/ +void I2S_EXTInit(I2S_EXT_Module* I2Sx_EXT, const I2S_InitType* I2S_EXT_InitStruct) +{ + uint16_t tmpregister; + RCC_ClocksTypeDef RCC_Clocks; + + /*----------------------- I2Sx_EXT I2S_CFGR Configuration -----------------*/ + /* Clear I2SMOD, I2SE, MODCFG, PCMSYNC, STDSEL, CLKPOL, TDATLEN and CHLEN bits */ + I2Sx_EXT->I2S_CFGR &= I2SCFG_CLR_MASK; + + /* Get the SPI_I2S_CFGR register value */ + tmpregister = I2Sx_EXT->I2S_CFGR; + + + + /* I2S Clock source is System clock: Get System Clock frequency */ + RCC_GetClocksFreqValue(&RCC_Clocks); + + + + /* Configure the I2S with the SPI_InitStruct values */ + tmpregister |= (uint16_t)( + I2S_MODE_ENABLE + | (uint16_t)(I2S_EXT_InitStruct->I2sMode + | (uint16_t)(I2S_EXT_InitStruct->Standard + | (uint16_t)(I2S_EXT_InitStruct->DataFormat | (uint16_t)I2S_EXT_InitStruct->CLKPOL)))); + + /* Write to I2Sx_EXT SPI_I2S_CFGR */ + I2Sx_EXT->I2S_CFGR = tmpregister; +} + + +/** +*\*\name I2S_EXT_InitStruct. +*\*\fun Fills each I2S_EXT_InitStruct member with its default value. +*\*\param I2S_EXT_InitStruct : +*\*\ - I2sMode +*\*\ - Standard +*\*\ - DataFormat +*\*\ - CLKPOL +*\*\return none +**/ +void I2S_EXTInitStruct(I2S_InitType* I2S_EXT_InitStruct) +{ + /*--------------- Reset I2S init structure parameters values -----------------*/ + /* Initialize the I2sMode member */ + I2S_EXT_InitStruct->I2sMode = I2S_MODE_SlAVE_TX; + + /* Initialize the Standard member */ + I2S_EXT_InitStruct->Standard = I2S_STD_PHILLIPS; + + /* Initialize the DataFormat member */ + I2S_EXT_InitStruct->DataFormat = I2S_DATA_FMT_16BITS; + + /* Initialize the CLKPOL member */ + I2S_EXT_InitStruct->CLKPOL = I2S_CLKPOL_LOW; +} + +/** +*\*\name I2S_EXTEnable. +*\*\fun Enables or disables the specified I2S EXT peripheral. +*\*\param I2Sx_EXT : +*\*\ - I2S2_EXT +*\*\ - I2S3_EXT +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2S_EXTEnable(I2S_EXT_Module* I2Sx_EXT, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected I2S_EXT peripheral */ + I2Sx_EXT->I2S_CFGR |= I2SCFG_I2SEN_ENABLE; + } + else + { + /* Disable the selected I2S_EXT peripheral */ + I2Sx_EXT->I2S_CFGR &= I2SCFG_I2SEN_DISABLE; + } +} + +/** +*\*\name I2S_EXT_TransmitData. +*\*\fun Transmits a Data through the I2Sx_EXT peripheral. +*\*\param I2Sx : +*\*\ - I2S2_EXT +*\*\ - I2S3_EXT +*\*\param Data \* Data to be transmitted *\ +*\*\return none +**/ +void I2S_EXTTransmitData(I2S_EXT_Module* I2Sx, uint16_t Data) +{ + /* Write in the DAT register the data to be sent */ + I2Sx->I2S_DAT = Data; +} + + +/** +*\*\name I2S_EXTReceiveData. +*\*\fun Returns the most recent received data by the I2Sx_EXT peripheral. +*\*\param I2Sx : +*\*\ - I2S1_EXT +*\*\ - I2S2_EXT +*\*\ - I2S3_EXT +*\*\ - I2S4_EXT +*\*\return The data in the I2S_DAT register. +**/ +uint16_t I2S_EXTReceiveData(const I2S_EXT_Module* I2Sx) +{ + /* Return the data in the DAT register */ + return I2Sx->I2S_DAT; +} + + +/** +*\*\name I2S_EXTEnableDma. +*\*\fun Enables or disables the I2Sx DMA interface. +*\*\param I2Sx : +*\*\ - I2S1_EXT +*\*\ - I2S2_EXT +*\*\ - I2S3_EXT +*\*\ - I2S4_EXT +*\*\param I2S_EXT_DMAReq : +*\*\ - I2S_EXT_DMA_TX +*\*\ - I2S_EXT_DMA_RX +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2S_EXTEnableDma(I2S_EXT_Module* I2Sx, uint16_t I2S_EXT_DMAReq, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected I2S_EXT DMA requests */ + I2Sx->I2S_CTRL2 |= I2S_EXT_DMAReq; + } + else + { + /* Disable the selected I2S_EXT DMA requests */ + I2Sx->I2S_CTRL2 &= (uint16_t)~I2S_EXT_DMAReq; + } +} + +/** +*\*\name I2S_EXTEnableInt. +*\*\fun Enables or disables the specified I2S_EXT interrupts. +*\*\param I2Sx : +*\*\ - I2S1_EXT +*\*\ - I2S2_EXT +*\*\ - I2S3_EXT +*\*\ - I2S4_EXT +*\*\param I2S_EXT_IT : +*\*\ - I2S_EXT_INT_TEINTEN +*\*\ - I2S_EXT_INT_RNEINTEN +*\*\ - I2S_EXT_INT_ERRINTEN +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2S_EXTEnableInt(I2S_EXT_Module* I2Sx, uint8_t I2S_EXT_IT, FunctionalState Cmd) +{ + uint16_t itmask; + + /* Set the IT mask */ + itmask = I2S_EXT_IT; + + if (Cmd != DISABLE) + { + /* Enable the selected I2S interrupt */ + I2Sx->I2S_CTRL2 |= itmask; + } + else + { + /* Disable the selected I2S interrupt */ + I2Sx->I2S_CTRL2 &= (uint16_t)~itmask; + } +} + +/** +*\*\name I2S_EXT_GetStatus. +*\*\fun Checks whether the specified I2S_EXT flag is set or not. +*\*\param I2Sx : +*\*\ - I2S2_EXT +*\*\ - I2S3_EXT +*\*\param I2S_EXT_FLAG : +*\*\ - I2S_EXT_BUSY_FLAG +*\*\ - I2S_EXT_OVER_FLAG +*\*\ - I2S_EXT_UNDER_FLAG +*\*\ - I2S_EXT_CHSIDE_FLAG +*\*\ - I2S_EXT_TE_FLAG +*\*\ - I2S_EXT_RNE_FLAG +*\*\return The new state of I2S_EXT_FLAG (SET or RESET). +**/ +FlagStatus I2S_EXTGetStatus(const I2S_EXT_Module* I2Sx, uint16_t I2S_EXT_FLAG) +{ + FlagStatus bitstatus; + + /* Check the status of the specified I2S_EXT flag */ + if ((I2Sx->I2S_STS & I2S_EXT_FLAG) != (uint16_t)RESET) + { + /* I2S_EXT_FLAG is set */ + bitstatus = SET; + } + else + { + /* I2S_EXT_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the I2S_EXT_FLAG status */ + return bitstatus; +} + +/** +*\*\name I2S_EXTGetIntStatus. +*\*\fun Checks whether the specified I2S_EXT interrupt has occurred or not. +*\*\param I2Sx : +*\*\ - I2S2_EXT +*\*\ - I2S3_EXT +*\*\param I2S_EXT_IT : +*\*\ - I2S_EXT_TE_FLAG +*\*\ - I2S_EXT_RNE_FLAG +*\*\ - I2S_EXT_BUSY_FLAG +*\*\ - I2S_EXT_OVER_FLAG +*\*\ - I2S_EXT_UNDER_FLAG +*\*\ - I2S_EXT_CHSIDE_FLAG +*\*\return The new state of I2S_EXT_IT (SET or RESET). +**/ + +INTStatus I2S_EXTGetIntStatus(const I2S_EXT_Module* I2Sx, uint8_t I2S_EXT_IT) +{ + INTStatus bitstatus = RESET; + uint16_t itpos = 0, itmask = 0, enablestatus = 0; + + /* Get the SPI/I2S IT index */ + itpos = 0x01 << (I2S_EXT_IT & 0x0F); + + /* Get the SPI/I2S IT mask */ + itmask = I2S_EXT_IT >> 4; + + /* Set the IT mask */ + itmask = 0x01 << itmask; + + /* Get the SPI_I2S_IT enable bit status */ + enablestatus = (I2Sx->I2S_CTRL2 & itmask); + + /* Check the status of the specified SPI/I2S interrupt */ + if (((I2Sx->I2S_STS & itpos) != (uint16_t)RESET) && enablestatus) + { + /* SPI_I2S_IT is set */ + bitstatus = SET; + } + else + { + /* SPI_I2S_IT is reset */ + bitstatus = RESET; + } + + /* Return the SPI_I2S_IT status */ + return bitstatus; + +} + +/** +*\*\name I2S_EXTClrITPendingBit. +*\*\fun Clears the SPI_EXTx CRC Error (CRCERR) interrupt pending bit. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_IT : +*\*\ - SPI_INT_CRCERR +*\*\return none. +**/ +void I2S_EXTClrITPendingBit(I2S_EXT_Module* I2Sx, uint8_t I2S_EXT_IT) +{ + uint16_t itpos; + + /* Get the SPI IT index */ + itpos = 0x0001 << (I2S_EXT_IT & 0x0F); + + /* Clear the selected SPI CRC Error (CRCERR) interrupt pending bit */ + I2Sx->I2S_STS = (uint16_t)~itpos; +} + +/** +*\*\name SPI_I2S_EnableDma. +*\*\fun Enables or disables the SPIx/I2Sx DMA interface. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_DMAReq : +*\*\ - SPI_I2S_DMA_TX +*\*\ - SPI_I2S_DMA_RX +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void I2S_EnableDma(I2S_Module* I2Sx, uint16_t I2S_DMAReq, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SPI/I2S DMA requests */ + I2Sx->CR2 |= I2S_DMAReq; + } + else + { + /* Disable the selected SPI/I2S DMA requests */ + I2Sx->CR2 &= (uint16_t)~I2S_DMAReq; + } +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_iwdg.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_iwdg.c new file mode 100644 index 0000000000..2da6c3f7d7 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_iwdg.c @@ -0,0 +1,193 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_iwdg.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_iwdg.h" + +/** +*\*\name IWDG_WriteConfig. +*\*\fun Enables or disables write protection to IWDG_PREDIV and IWDG_RELV registers. +*\*\param IWDGx (The input parameters must be the following values): +*\*\ - IWDG1 +*\*\ - IWDG2 +*\*\param IWDG_WriteAccess +*\*\ - IWDG_WRITE_ENABLE +*\*\ - IWDG_WRITE_DISABLE +*\*\return none +**/ +void IWDG_WriteConfig(IWDG_Module* IWDGx, IWDOG_WRITE_CONFIG IWDG_WriteAccess) +{ + /* Check the parameters */ + IWDGx->KEY = (uint32_t)IWDG_WriteAccess; +} + +/** +*\*\name IWDG_SetPrescalerDiv. +*\*\fun IWDG_Prescaler specifies the IWDG prescaler value. +*\*\param IWDGx (The input parameters must be the following values): +*\*\ - IWDG1 +*\*\ - IWDG2 +*\*\param IWDG_Prescaler : +*\*\ - IWDG_PRESCALER_DIV4 +*\*\ - IWDG_PRESCALER_DIV8 +*\*\ - IWDG_PRESCALER_DIV16 +*\*\ - IWDG_PRESCALER_DIV32 +*\*\ - IWDG_PRESCALER_DIV64 +*\*\ - IWDG_PRESCALER_DIV128 +*\*\ - IWDG_PRESCALER_DIV256 +*\*\return none +**/ +void IWDG_SetPrescalerDiv(IWDG_Module* IWDGx, uint8_t IWDG_Prescaler) +{ + IWDGx->PREDIV = IWDG_Prescaler; +} + + +/** +*\*\name IWDG_CntReload. +*\*\fun Sets IWDG reload value. +*\*\param IWDGx (The input parameters must be the following values): +*\*\ - IWDG1 +*\*\ - IWDG2 +*\*\param Reload : +*\*\ -0x000 ~ 0xFFF +*\*\return none +**/ +void IWDG_CntReload(IWDG_Module* IWDGx, uint16_t Reload) +{ + IWDGx->RELV = Reload; +} + + +/** +*\*\name IWDG_ReloadKey. +*\*\fun Reload IWDG counter with value defined in IWDG_RELV register. +*\*\param IWDGx (The input parameters must be the following values): +*\*\ - IWDG1 +*\*\ - IWDG2 +*\*\param none +*\*\return none +**/ +void IWDG_ReloadKey(IWDG_Module* IWDGx) +{ + IWDGx->KEY = KEY_ReloadKey; +} + + +/** +*\*\name IWDG_Enable. +*\*\fun Start watch dog counter. +*\*\param IWDGx (The input parameters must be the following values): +*\*\ - IWDG1 +*\*\ - IWDG2 +*\*\param none +*\*\return none +**/ +void IWDG_Enable(IWDG_Module* IWDGx) +{ + IWDGx->KEY = KEY_EnableKey; +} + +/** +*\*\name IWDG_Freeze_Enable. +*\*\fun Freeze or unfreeze IWDG while IWDG is running in run mode. +*\*\param IWDGx (The input parameters must be the following values): +*\*\ - IWDG1 +*\*\ - IWDG2 + *\*\param Cmd : + *\*\ - ENABLE + *\*\ - DISABLE +*\*\return none +**/ +void IWDG_Freeze_Enable(IWDG_Module* IWDGx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + IWDGx->KEY = IWDG_FREEZE; + } + else + { + IWDGx->KEY = IWDG_UNFREEZE; + } + +} + +/** +*\*\name IWDG_GetStatus. +*\*\fun Checks whether the specified IWDG flag is set or not. +*\*\param IWDGx (The input parameters must be the following values): +*\*\ - IWDG1 +*\*\ - IWDG2 +*\*\param IWDG_FLAG : +*\*\ - IWDG_PVU_FLAG +*\*\ - IWDG_CRVU_FLAG +*\*\ - IWDG_FRZF_FLAG +*\*\return FlagStatus : +*\*\ - RESET +*\*\ - SET +**/ +FlagStatus IWDG_GetStatus(IWDG_Module* IWDGx, IWDG_STATUS_FLAG IWDG_FLAG) +{ + FlagStatus bitstatus; + + if ((IWDGx->STS & (uint32_t)IWDG_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Return the flag status */ + return bitstatus; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_jpeg.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_jpeg.c new file mode 100644 index 0000000000..039cee120e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_jpeg.c @@ -0,0 +1,1617 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_jpeg.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ + +#include "n32h76x_78x_jpeg.h" + +/***** JPEG CTRL module ****/ + +/** +*\*\name JPEG_ConfigType. +*\*\fun Choose JPEG operation type. +*\*\param Type +*\*\ - JPEG_ENCODE +*\*\ - JPEG_DECODE +*\*\return none. +**/ +void JPEG_ConfigType(uint32_t Type) +{ + if(Type == JPEG_DECODE) + { + JPEG_CTRL->CTRL &= (~(JPEG_ENCODE)); + } + else + { + JPEG_CTRL->CTRL |= JPEG_ENCODE; + } +} + +/** +*\*\name JPEG_ConfigSwap. +*\*\fun Swap Data for YCbCr 4:2:2 Format in BRC. +*\*\param Type +*\*\ - JPEG_SWAP +*\*\ - JPEG_NOSWAP +*\*\return none. +**/ +void JPEG_ConfigSwap(uint32_t Type) +{ + if(Type == JPEG_NOSWAP) + { + JPEG_CTRL->CTRL &= (~(JPEG_SWAP)); + } + else + { + JPEG_CTRL->CTRL |= JPEG_SWAP; + } +} + + +/***** JPEG SGDMA module ****/ + +/** +*\*\name SGDMA_Reset. +*\*\fun Reset the SGDMA P2H/H2P module. +*\*\param SGDMAx : +*\*\ - JPEG_SGDMA_P2H +*\*\ - JPEG_SGDMA_H2P +*\*\return none +**/ +void SGDMA_Reset(JPEG_SGDMA_Module *SGDMAx) +{ + /* Module soft reset */ + if((SGDMAx->STS & JPEGDMA_STS_BUSY) == JPEGDMA_STS_BUSY) + { + SGDMAx->CTRL |= JPEGDMA_CTRL_HARDRST; + } + else + { + SGDMAx->CTRL |= JPEGDMA_CTRL_CLR; + } +} + +/** +*\*\name SGDMA_H2P_Init. +*\*\fun Initializes the SGDMA_H2P peripheral according to SGDMA_H2P_InitStruct. +*\*\param SGDMA_H2P_InitStruct +*\*\ - h2p_desc +*\*\ - desc_flags : Descriptor flag bits +*\*\ - linkenable: Link Enable +*\*\ - BITEQ0 : 0 +*\*\ - BITEQ1 : 1 +*\*\ - startframe: Start of Frame +*\*\ - BITEQ0 : 0 +*\*\ - BITEQ1 : 1 +*\*\ - endframe: End of Frame +*\*\ - BITEQ0 : 0 +*\*\ - BITEQ1 : 1 +*\*\ - desccons: Descriptor Consumed +*\*\ - BITEQ0 : 0 +*\*\ - BITEQ1 : 1 +*\*\ - blk_size : Block_Size +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - blk_used : Block_Used +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - blk_addr_low : The starting address of the data block [31:0] +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - blk_addr_high : The starting address of the data block [63:32] +*\*\ - 0x00000000 +*\*\ - link_addr_low : Link to the next descriptor. Used when Link Enable = 1 +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - link_addr_high : Link to the next descriptor. Used when Link Enable = 1 +*\*\ - 0x00000000 +*\*\ - max_burstsize : Maximum allowed size for an AXI4 MM burst +*\*\ - 0x00000000 ~ 0x00000100 +*\*\ - SGlist_size : Scatter-Gather List Size +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - SGlist_Head : Scatter-Gather List Head index pointer +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - SGlist_Tail : Scatter-Gather List Tail index pointer +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - SGlist_Threshold : Almost Out Of Descriptors Threshold +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - desclist_type : The descriptor list structure type +*\*\ - SGDMA_DESCLIST_LIST +*\*\ - SGDMA_DESCLIST_RING +*\*\ - descstored_type : The descriptor storage location +*\*\ - SGDMA_DESC_CSR +*\*\ - SGDMA_DESC_MEMORY +*\*\ - DMA_EOF_type : DMA operation mode on EOF +*\*\ - SGDMA_EOF_PAUSEDMA +*\*\ - SGDMA_EOF_RESUMEDMA +*\*\ - DMA_burst_type : DMA burst type +*\*\ - SGDMA_BURST_FIXED +*\*\ - SGDMA_BURST_INCR +*\*\return none. +**/ +void SGDMA_H2P_Init(SGDMA_H2P_InitType* SGDMA_H2P_InitStruct) +{ + uint32_t resg_temp; + + SGDMA_Reset(JPEG_SGDMA_H2P); + /* Module enable */ + JPEG_SGDMA_H2P->CTRL |= JPEGDMA_CTRL_EN; + + /* Maximum allowed size for an AXI4 MM burst */ + JPEG_SGDMA_H2P->MBSIZE = SGDMA_H2P_InitStruct->max_burstsize; + + /* H2P DMA initial configuration */ + resg_temp = JPEG_SGDMA_H2P->CTRL; + resg_temp &= (~(JPEGDMA_CTRL_MMODE | JPEGDMA_CTRL_OPMODE)); + resg_temp |= SGDMA_H2P_InitStruct->desclist_type; + resg_temp |= SGDMA_H2P_InitStruct->descstored_type; + resg_temp |= SGDMA_H2P_InitStruct->DMA_burst_type; + resg_temp |= SGDMA_H2P_InitStruct->DMA_EOF_type; + JPEG_SGDMA_H2P->CTRL = resg_temp; + + /* Determine descriptor location */ + if(SGDMA_H2P_InitStruct->descstored_type == SGDMA_DESC_MEMORY) + { + /* Set base address of the SG List */ + JPEG_SGDMA_H2P->SGLPL = (uint32_t)&SGDMA_H2P_InitStruct->h2p_desc; + } + else + { + JPEG_SGDMA_H2P->DESCF = *(uint32_t*)(&SGDMA_H2P_InitStruct->h2p_desc); + JPEG_SGDMA_H2P->DESC_MBADDL = SGDMA_H2P_InitStruct->h2p_desc.blk_addr_low; + JPEG_SGDMA_H2P->DESC_MBADDH = SGDMA_H2P_InitStruct->h2p_desc.blk_addr_high; + JPEG_SGDMA_H2P->DESC_MBSIZE = SGDMA_H2P_InitStruct->h2p_desc.blk_size; + JPEG_SGDMA_H2P->DESC_MUS = SGDMA_H2P_InitStruct->h2p_desc.blk_used; + /* Determine if linkenable is enabled */ + if(SGDMA_H2P_InitStruct->h2p_desc.desc_flags.bits.linkenable != DISABLE) + { + JPEG_SGDMA_H2P->DESC_LINKL = SGDMA_H2P_InitStruct->h2p_desc.link_addr_low; + JPEG_SGDMA_H2P->DESC_LINKH = SGDMA_H2P_InitStruct->h2p_desc.link_addr_high; + } + else + { + /* no process */ + } + } + + /* Set size of the SG List */ + JPEG_SGDMA_H2P->SGL_SIZE = SGDMA_H2P_InitStruct->SGlist_size; + JPEG_SGDMA_H2P->SGL_HEAD = SGDMA_H2P_InitStruct->SGlist_Head; + JPEG_SGDMA_H2P->SGL_TAIL = SGDMA_H2P_InitStruct->SGlist_Tail; + JPEG_SGDMA_H2P->AOODT = SGDMA_H2P_InitStruct->SGlist_Threshold; +} + + +/** +*\*\name SGDMA_P2H_Init. +*\*\fun Initializes the SGDMA_H2P peripheral according to SGDMA_H2P_InitStruct. +*\*\param SGDMA_P2H_InitStruct +*\*\ - p2h_desc +*\*\ - desc_flags : Descriptor flag bits +*\*\ - linkenable: Link Enable +*\*\ - 0 : DISABLE +*\*\ - 1 : ENABLE +*\*\ - startframe: Start of Frame +*\*\ - 0 : DISABLE +*\*\ - 1 : ENABLE +*\*\ - endframe: End of Frame +*\*\ - 0 : DISABLE +*\*\ - 1 : ENABLE +*\*\ - desccons: Descriptor Consumed +*\*\ - 0 : DISABLE +*\*\ - 1 : ENABLE +*\*\ - blk_size : Block_Size +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - blk_used : Block_Used +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - blk_addr_low : The starting address of the data block [31:0] +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - blk_addr_high : The starting address of the data block [63:32] +*\*\ - 0x00000000 +*\*\ - link_addr_low : Link to the next descriptor. Used when Link Enable = 1 +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - link_addr_high : Link to the next descriptor. Used when Link Enable = 1 +*\*\ - 0x00000000 +*\*\ - max_burstsize : Maximum allowed size for an AXI4 MM burst +*\*\ - 0x00000000 ~ 0x00000100 +*\*\ - SGlist_size : Scatter-Gather List Size +*\*\ - 0x00000000 ~ 0x0000FFFF +*\*\ - desclist_type : The descriptor list structure type +*\*\ - SGDMA_DESCLIST_LIST +*\*\ - SGDMA_DESCLIST_RING +*\*\ - descstored_type : The descriptor storage location +*\*\ - SGDMA_DESC_CSR +*\*\ - SGDMA_DESC_MEMORY +*\*\ - DMA_EOF_type : DMA operation mode on EOF +*\*\ - SGDMA_EOF_PAUSEDMA +*\*\ - SGDMA_EOF_RESUMEDMA +*\*\ - DMA_burst_type : DMA burst type +*\*\ - SGDMA_BURST_FIXED +*\*\ - SGDMA_BURST_INCR +*\*\return none. +**/ +void SGDMA_P2H_Init(SGDMA_P2H_InitType* SGDMA_P2H_InitStruct) +{ + uint32_t resg_temp; + + SGDMA_Reset(JPEG_SGDMA_P2H); + /* Module enable */ + JPEG_SGDMA_P2H->CTRL |= JPEGDMA_CTRL_EN; + + /* Maximum allowed size for an AXI4 MM burst */ + JPEG_SGDMA_P2H->MBSIZE = SGDMA_P2H_InitStruct->max_burstsize; + + /* H2P DMA initial configuration */ + resg_temp = JPEG_SGDMA_P2H->CTRL; + resg_temp &= (~(JPEGDMA_CTRL_MMODE | JPEGDMA_CTRL_OPMODE)); + resg_temp |= SGDMA_P2H_InitStruct->desclist_type; + resg_temp |= SGDMA_P2H_InitStruct->descstored_type; + resg_temp |= SGDMA_P2H_InitStruct->DMA_burst_type; + resg_temp |= SGDMA_P2H_InitStruct->DMA_EOF_type; + JPEG_SGDMA_P2H->CTRL = resg_temp; + + /* Determine descriptor location */ + if(SGDMA_P2H_InitStruct->descstored_type == SGDMA_DESC_MEMORY) + { + /* Set base address of the SG List */ + JPEG_SGDMA_P2H->SGLPL = (uint32_t)&SGDMA_P2H_InitStruct->p2h_desc; + } + else + { + JPEG_SGDMA_P2H->DESCF = *(uint32_t*)(&SGDMA_P2H_InitStruct->p2h_desc); + JPEG_SGDMA_P2H->DESC_MBADDL = SGDMA_P2H_InitStruct->p2h_desc.blk_addr_low; + JPEG_SGDMA_P2H->DESC_MBADDH = SGDMA_P2H_InitStruct->p2h_desc.blk_addr_high; + JPEG_SGDMA_P2H->DESC_MBSIZE = SGDMA_P2H_InitStruct->p2h_desc.blk_size; + JPEG_SGDMA_P2H->DESC_MUS = SGDMA_P2H_InitStruct->p2h_desc.blk_used; + /* Determine if linkenable is enabled */ + if(SGDMA_P2H_InitStruct->p2h_desc.desc_flags.bits.linkenable != DISABLE) + { + JPEG_SGDMA_P2H->DESC_LINKL = SGDMA_P2H_InitStruct->p2h_desc.link_addr_low; + JPEG_SGDMA_P2H->DESC_LINKH = SGDMA_P2H_InitStruct->p2h_desc.link_addr_high; + } + else + { + /* no process */ + } + } + + /* Set size of the SG List */ + JPEG_SGDMA_P2H->SGL_SIZE = SGDMA_P2H_InitStruct->SGlist_size; + JPEG_SGDMA_P2H->SGL_HEAD = SGDMA_P2H_InitStruct->SGlist_Head; + JPEG_SGDMA_P2H->SGL_TAIL = SGDMA_P2H_InitStruct->SGlist_Tail; + JPEG_SGDMA_P2H->AOODT = SGDMA_P2H_InitStruct->SGlist_Threshold; +} + +/** +*\*\name SGDMA_Start. +*\*\fun Start the SGDMA P2H/H2P module. +*\*\param SGDMAx : +*\*\ - JPEG_SGDMA_P2H +*\*\ - JPEG_SGDMA_H2P +*\*\return none +**/ +void SGDMA_Start(JPEG_SGDMA_Module *SGDMAx) +{ + /* DMA start */ + SGDMAx->CTRL |= JPEGDMA_CTRL_START; +} + +/** +*\*\name SGDMA_ConfigInt +*\*\fun Enables or disables the specified SGDMA interrupts. +*\*\param SGDMAx (The input parameters must be the following values): +*\*\ - JPEG_SGDMA_P2H +*\*\ - JPEG_SGDMA_H2P +*\*\param SGDMA_INT (The input parameters must be the following values): +*\*\ - SGDMA_INTSTS_WDATAERREN AXI MM Write Error when writing data +*\*\ - SGDMA_INTSTS_RDATAERR AXI MM Read Error when reading data +*\*\ - SGDMA_INTSTS_WDESCERR AXI MM Write Error when writing a descriptor +*\*\ - SGDMA_INTSTS_RDESCERR AXI MM Read Error when reading a descriptor +*\*\ - SGDMA_INTSTS_EOD End-Of-Descriptor +*\*\ - SGDMA_INTSTS_AOOD Channel is Almost Out of Descriptors +*\*\ - SGDMA_INTSTS_OOD Out Of Descriptors +*\*\ - SGDMA_INTSTS_EOFIN End-Of-Frame sampled at the input of the channel +*\*\ - SGDMA_INTSTS_EOFOUT End-Of-Frame sampled at the output of the channel +*\*\ - SGDMA_INTSTS_GINT Global interrupt status bit for the Channel +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SGDMA_ConfigInt(JPEG_SGDMA_Module* SGDMAx, uint32_t SGDMA_INT, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + SGDMAx->IE |= SGDMA_INT; + } + else + { + SGDMAx->IE &= (~SGDMA_INT); + } +} + + +/** +*\*\name SGDMAx_GetFlagStatus. +*\*\fun Check whether the specified SGDMA flag is set or not. +*\*\param SGDMAx : +*\*\ - JPEG_SGDMA_P2H +*\*\ - JPEG_SGDMA_H2P +*\*\param Flag : +*\*\ - SGDMA_INTSTS_WDATAERREN AXI MM Write Error when writing data +*\*\ - SGDMA_INTSTS_RDATAERR AXI MM Read Error when reading data +*\*\ - SGDMA_INTSTS_WDESCERR AXI MM Write Error when writing a descriptor +*\*\ - SGDMA_INTSTS_RDESCERR AXI MM Read Error when reading a descriptor +*\*\ - SGDMA_INTSTS_EOD End-Of-Descriptor +*\*\ - SGDMA_INTSTS_AOOD Channel is Almost Out of Descriptors +*\*\ - SGDMA_INTSTS_OOD Out Of Descriptors +*\*\ - SGDMA_INTSTS_EOFIN End-Of-Frame sampled at the input of the channel +*\*\ - SGDMA_INTSTS_EOFOUT End-Of-Frame sampled at the output of the channel +*\*\ - SGDMA_INTSTS_GINT Global interrupt status bit for the Channel +*\*\ - SGDMA_INTSTS_BUSY H2P/P2H is processing a transfer +*\*\return FlagStatus +*\*\ - RESET +*\*\ - SET +**/ +FlagStatus SGDMAx_GetFlagStatus(JPEG_SGDMA_Module* SGDMAx, uint32_t Flag) +{ + FlagStatus status_value; + if((SGDMAx->STS & Flag) == Flag ) + { + status_value = SET; + } + else + { + status_value = RESET; + } + return status_value; +} + + +/** +*\*\name SGDMAx_GetIntStatus. +*\*\fun Check whether the specified SGDMA interrupt is set or not. +*\*\param SGDMAx : +*\*\ - JPEG_SGDMA_P2H +*\*\ - JPEG_SGDMA_H2P +*\*\param Flag : +*\*\ - SGDMA_INTSTS_WDATAERREN AXI MM Write Error when writing data +*\*\ - SGDMA_INTSTS_RDATAERR AXI MM Read Error when reading data +*\*\ - SGDMA_INTSTS_WDESCERR AXI MM Write Error when writing a descriptor +*\*\ - SGDMA_INTSTS_RDESCERR AXI MM Read Error when reading a descriptor +*\*\ - SGDMA_INTSTS_EOD End-Of-Descriptor +*\*\ - SGDMA_INTSTS_AOOD Channel is Almost Out of Descriptors +*\*\ - SGDMA_INTSTS_OOD Out Of Descriptors +*\*\ - SGDMA_INTSTS_EOFIN End-Of-Frame sampled at the input of the channel +*\*\ - SGDMA_INTSTS_EOFOUT End-Of-Frame sampled at the output of the channel +*\*\ - SGDMA_INTSTS_GINT Global interrupt status bit for the Channel +*\*\return FlagStatus +*\*\ - RESET +*\*\ - SET +**/ +FlagStatus SGDMAx_GetIntStatus(JPEG_SGDMA_Module* SGDMAx, uint32_t Flag) +{ + FlagStatus status_value; + if((SGDMAx->INTSTS & Flag) == Flag ) + { + status_value = SET; + } + else + { + status_value = RESET; + } + return status_value; +} + +/** +*\*\name SGDMAx_GetFlagStatus. +*\*\fun Clears the SGDMAx's pending flags.. +*\*\param SGDMAx : +*\*\ - JPEG_SGDMA_P2H +*\*\ - JPEG_SGDMA_H2P +*\*\param Flag : +*\*\ - SGDMA_INTSTS_EOD End-Of-Descriptor +*\*\ - SGDMA_INTSTS_AOOD Channel is Almost Out of Descriptors +*\*\ - SGDMA_INTSTS_OOD Out Of Descriptors +*\*\ - SGDMA_INTSTS_EOFIN End-Of-Frame sampled at the input of the channel +*\*\ - SGDMA_INTSTS_EOFOUT End-Of-Frame sampled at the output of the channel +*\*\return none +**/ +void SGDMAx_ClrFlag(JPEG_SGDMA_Module* SGDMAx, uint32_t Flag) +{ + SGDMAx->STS = Flag; +} + + +/***** JPEG BRC module ****/ +/** +*\*\name JPEGBRC_Init. +*\*\fun Initializes the JPEG BRC peripheral according to JPEGBRC_InitStruct. +*\*\param JPEGBRC_InitStruct +*\*\ - buffer_addr +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - buffer_size +*\*\ - 0x0000 ~ 0xFFFF +*\*\ - upsample_mode +*\*\ - 0x00 ~ 0x03 +*\*\return FlagStatus +*\*\ - ERROR +*\*\ - SUCCESS +**/ +ErrorStatus JPEGBRC_Init(JPEGBRC_InitType* JPEGBRC_InitStruct) +{ + ErrorStatus status_value; + uint32_t timeout_value = 0x10000; + + /* BRC module init*/ + JPEG_BRC->INIT |= JPEGBRC_INIT_INIT; + while(timeout_value--) + { + if((JPEG_BRC->INIT & JPEGBRC_INIT_INITF) == JPEGBRC_INIT_INITF) + { + JPEG_BRC->INIT &= (~JPEGBRC_INIT_INIT); + break; + } + } + + if(timeout_value == 0) + { + status_value = ERROR; + } + else + { + status_value = SUCCESS; + } + + if(status_value == SUCCESS) + { + JPEG_BRC->BUFBADDR = JPEGBRC_InitStruct->buffer_addr; + JPEG_BRC->BUFSIZE = JPEGBRC_InitStruct->buffer_size; + JPEG_BRC->USMODE = JPEGBRC_InitStruct->upsample_mode; + } + return status_value; +} + +/** +*\*\name JPEGBRC_Enable +*\*\fun Enables or disables the specified JPEGBRC peripheral. +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void JPEGBRC_Enable(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable JPEGBRC modelu */ + JPEG_BRC->EN |= JPEGBRC_EN_EN; + } + else + { + /* Disable JPEGBRC modelu */ + JPEG_BRC->EN &= (~JPEGBRC_EN_EN); + } +} + + +/***** JPEG RBC module ****/ +/** +*\*\name JPEGRBC_Init. +*\*\fun Initializes the JPEG BRC peripheral according to JPEGRBC_InitStruct. +*\*\param JPEGRBC_InitStruct +*\*\ - pixel_format +*\*\ - JPEGRBC_4_4_4_NONINTERLEAVED +*\*\ - JPEGRBC_4_2_2_NONINTERLEAVED +*\*\ - JPEGRBC_4_2_0_NONINTERLEAVED +*\*\ - JPEGRBC_MONOCHROME +*\*\ - JPEGRBC_4_4_4_INTERLEAVED +*\*\ - JPEGRBC_4_2_2_INTERLEAVED +*\*\ - JPEGRBC_4_2_0_INTERLEAVED +*\*\ - sample_order +*\*\ - JPEGRBC_MSBSAMPLE +*\*\ - JPEGRBC_LSBSAMPLE +*\*\ - frame_width +*\*\ - 0x0000 ~ 0xFFFF +*\*\ - frame_height +*\*\ - 0x0001 ~ 0x10000 +*\*\ - component0names +*\*\ - 0x00 ~ 0xFF +*\*\ - component1names +*\*\ - 0x00 ~ 0xFF +*\*\ - component2names +*\*\ - 0x00 ~ 0xFF +*\*\ - C0startaddress +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\ - C0buffersize +*\*\ - 0x001 ~ 0x400 +*\*\return FlagStatus +*\*\ - ERROR +*\*\ - SUCCESS +**/ +ErrorStatus JPEGRBC_Init(JPEGRBC_InitType* JPEGRBC_InitStruct) +{ + ErrorStatus status_value = SUCCESS; + uint32_t timeout_value = 0x10000; + uint32_t width_mcus; + uint32_t height_mcus; + + JPEG_RBC->PFORM = JPEGRBC_InitStruct->pixel_format; + JPEG_RBC->CNAME = (JPEGRBC_InitStruct->component0names | \ + (JPEGRBC_InitStruct->component1names << REG_BIT8_OFFSET) | \ + (JPEGRBC_InitStruct->component2names << REG_BIT16_OFFSET)); + JPEG_RBC->C0SADD = JPEGRBC_InitStruct->C0startaddress; + JPEG_RBC->C0EADD = JPEGRBC_InitStruct->C0buffersize; + JPEG_RBC->FRMH = JPEGRBC_InitStruct->frame_height - 1; + JPEG_RBC->HHALF = ((JPEGRBC_InitStruct->frame_height + 1U) >> REG_BIT1_OFFSET) - 1; + + if(JPEGRBC_InitStruct->pixel_format == JPEGRBC_4_4_4_NONINTERLEAVED) + { + JPEG_RBC->FRMW = JPEGRBC_InitStruct->frame_width; + /* Round up by multiples of 8 */ + width_mcus = (JPEGRBC_InitStruct->frame_width + 7U) >> (REG_BIT3_OFFSET); + /* Round up by multiples of 8 */ + height_mcus = (JPEGRBC_InitStruct->frame_height + 7U) >> (REG_BIT3_OFFSET); + JPEG_RBC->BPS0 = (width_mcus * height_mcus - 1U); + JPEG_RBC->BPS12 = (width_mcus * height_mcus - 1U); + + JPEG_RBC->ROWS0 = height_mcus - 1U; + JPEG_RBC->ROWS12 = height_mcus - 1U; + + JPEG_RBC->BLSS0 = width_mcus * 8U; + JPEG_RBC->BLSS12 = width_mcus * 8U; + + JPEG_RBC->BPRS0 = (width_mcus - 1U); + JPEG_RBC->BPRS12 = (width_mcus - 1U); + + } + else if(JPEGRBC_InitStruct->pixel_format == JPEGRBC_4_2_2_NONINTERLEAVED) + { + JPEG_RBC->FRMW = JPEGRBC_InitStruct->frame_width; + /* Round up by multiples of 8 */ + width_mcus = (JPEGRBC_InitStruct->frame_width + 7U) >> (REG_BIT3_OFFSET); + /* Round up by multiples of 8 */ + height_mcus = (JPEGRBC_InitStruct->frame_height + 7U) >> (REG_BIT3_OFFSET); + JPEG_RBC->BPS0 = (width_mcus * height_mcus - 1U); + + JPEG_RBC->BLSS0 = width_mcus * 8U; + + JPEG_RBC->BPRS0 = (width_mcus - 1U); + /* Round up by multiples of 16 */ + width_mcus = (JPEGRBC_InitStruct->frame_width + 15U) >> (REG_BIT4_OFFSET); + JPEG_RBC->BPS12 = (width_mcus * height_mcus - 1U); + + JPEG_RBC->ROWS0 = height_mcus - 1U; + JPEG_RBC->ROWS12 = height_mcus - 1U; + + JPEG_RBC->BLSS12 = width_mcus * 8U; + + JPEG_RBC->BPRS12 = (width_mcus - 1U); + } + else if(JPEGRBC_InitStruct->pixel_format == JPEGRBC_4_2_0_NONINTERLEAVED) + { + JPEG_RBC->FRMW = JPEGRBC_InitStruct->frame_width; + /* Round up by multiples of 8 */ + width_mcus = (JPEGRBC_InitStruct->frame_width + 7U) >> (REG_BIT3_OFFSET); + /* Round up by multiples of 8 */ + height_mcus = (JPEGRBC_InitStruct->frame_height + 7U) >> (REG_BIT3_OFFSET); + JPEG_RBC->BPS0 = (width_mcus * height_mcus - 1U); + + JPEG_RBC->ROWS0 = height_mcus - 1U; + + JPEG_RBC->BLSS0 = width_mcus * 8U; + + JPEG_RBC->BPRS0 = (width_mcus - 1U); + + /* Round up by multiples of 16 */ + width_mcus = (JPEGRBC_InitStruct->frame_width + 15U) >> (REG_BIT4_OFFSET); + /* Round up by multiples of 16 */ + height_mcus = (JPEGRBC_InitStruct->frame_height + 15U) >> (REG_BIT4_OFFSET); + JPEG_RBC->BPS12 = (width_mcus * height_mcus - 1U); + + JPEG_RBC->ROWS12 = height_mcus - 1U; + + JPEG_RBC->BLSS12 = width_mcus * 8U; + + JPEG_RBC->BPRS12 = (width_mcus - 1U); + } + else if(JPEGRBC_InitStruct->pixel_format == JPEGRBC_MONOCHROME) + { + JPEG_RBC->FRMW = JPEGRBC_InitStruct->frame_width; + /* Round up by multiples of 8 */ + width_mcus = (JPEGRBC_InitStruct->frame_width + 7U) >> (REG_BIT3_OFFSET); + /* Round up by multiples of 8 */ + height_mcus = (JPEGRBC_InitStruct->frame_height + 7U) >> (REG_BIT3_OFFSET); + JPEG_RBC->BPS0 = (width_mcus * height_mcus - 1U); + JPEG_RBC->BPS12 = (width_mcus * height_mcus - 1U); + + JPEG_RBC->ROWS0 = height_mcus - 1U; + JPEG_RBC->ROWS12 = height_mcus - 1U; + + JPEG_RBC->BPRS0 = (width_mcus - 1U); + JPEG_RBC->BPRS12 = (width_mcus - 1U); + + JPEG_RBC->BLSS0 = width_mcus * 8U; + JPEG_RBC->BLSS12 = width_mcus * 8U; + } + else if(JPEGRBC_InitStruct->pixel_format == JPEGRBC_4_4_4_INTERLEAVED) + { + JPEG_RBC->FRMW = JPEGRBC_InitStruct->frame_width * 3U; + /* Round up by multiples of 8 */ + width_mcus = (JPEGRBC_InitStruct->frame_width + 7U) >> (REG_BIT3_OFFSET); + /* Round up by multiples of 8 */ + height_mcus = (JPEGRBC_InitStruct->frame_height + 7U) >> (REG_BIT3_OFFSET); + JPEG_RBC->BPS0 = (width_mcus * height_mcus *3U - 1U); + JPEG_RBC->BPS12 = (width_mcus * height_mcus *3U - 1U); + + JPEG_RBC->ROWS0 = height_mcus - 1U; + JPEG_RBC->ROWS12 = height_mcus - 1U; + + JPEG_RBC->BLSS0 = width_mcus * 8U * 3U; + JPEG_RBC->BLSS12 = width_mcus * 8U * 3U; + + JPEG_RBC->BPRS0 = (width_mcus * 3U - 1U); + JPEG_RBC->BPRS12 = (width_mcus * 3U - 1U); + } + else if(JPEGRBC_InitStruct->pixel_format == JPEGRBC_4_2_2_INTERLEAVED) + { + JPEG_RBC->FRMW = JPEGRBC_InitStruct->frame_width * 2U; + /* Round up by multiples of 16 */ + width_mcus = (JPEGRBC_InitStruct->frame_width + 15U) >> (REG_BIT4_OFFSET); + /* Round up by multiples of 8 */ + height_mcus = (JPEGRBC_InitStruct->frame_height + 7U) >> (REG_BIT3_OFFSET); + JPEG_RBC->BPS0 = (width_mcus * height_mcus *4U - 1U); + JPEG_RBC->BPS12 = (width_mcus * height_mcus *4U - 1U); + + JPEG_RBC->ROWS0 = height_mcus - 1U; + JPEG_RBC->ROWS12 = height_mcus - 1U; + + JPEG_RBC->BLSS0 = width_mcus * 8 * 4U; + JPEG_RBC->BLSS12 = width_mcus * 8 * 4U; + + JPEG_RBC->BPRS0 = (width_mcus * 4U - 1U); + JPEG_RBC->BPRS12 = (width_mcus * 4U - 1U); + } + else if(JPEGRBC_InitStruct->pixel_format == JPEGRBC_4_2_0_INTERLEAVED) + { + JPEG_RBC->FRMW = JPEGRBC_InitStruct->frame_width * 3U; + /* Round up by multiples of 16 */ + width_mcus = (JPEGRBC_InitStruct->frame_width + 15U) >> (REG_BIT4_OFFSET); + /* Round up by multiples of 16 */ + height_mcus = (JPEGRBC_InitStruct->frame_height + 15U) >> (REG_BIT4_OFFSET); + JPEG_RBC->BPS0 = (width_mcus * height_mcus *6U - 1U); + JPEG_RBC->BPS12 = (width_mcus * height_mcus *6U - 1U); + + JPEG_RBC->ROWS0 = height_mcus - 1U; + JPEG_RBC->ROWS12 = height_mcus - 1U; + + JPEG_RBC->BLSS0 = width_mcus * 8U * 6U; + JPEG_RBC->BLSS12 = width_mcus * 8U * 6U; + + JPEG_RBC->BPRS0 = (width_mcus * 6U - 1U); + JPEG_RBC->BPRS12 = (width_mcus * 6U - 1U); + } + else + { + /* no process */ + } + + /* RBC module init*/ + JPEG_RBC->INIT |= JPEGRBC_INIT_INIT; + while((JPEG_RBC->INIT & JPEGRBC_INIT_INITF) != JPEGRBC_INIT_INITF) + { + timeout_value--; + if(timeout_value == 0U) + { + status_value = ERROR; + break; + } + } + JPEG_RBC->INIT &= (~JPEGRBC_INIT_INIT); + + return status_value; +} + + +/** +*\*\name JPEGRBC_Enable +*\*\fun Enables or disables the specified JPEGRBC peripheral. +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void JPEGRBC_Enable(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable JPEGRBC module */ + JPEG_RBC->EN |= JPEGRBC_EN_EN; + } + else + { + /* Disable JPEGRBC module */ + JPEG_RBC->EN &= (~JPEGRBC_EN_EN); + } +} + +/***** JPEG DEC module ****/ + +/** +*\*\name JPEGDEC_Enable +*\*\fun Enables or disables the specified JPEGDEC peripheral. +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void JPEGDEC_Enable(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable JPEGDEC modelu */ + JPEG_DEC->MODE |= JPEGDEC_MODE_EN; + } + else + { + /* Disable JPEGDEC modelu */ + JPEG_DEC->MODE &= (~JPEGDEC_MODE_EN); + } +} + + +/** +*\*\name JPEGDEC_GetFlagStatus. +*\*\fun Check whether the specified JPEGDEC flag is set or not. +*\*\param Flag : +*\*\ - JPEGDEC_ERROR_HTERR A Huffman table referenced in a scan (SOS header) is invalid +*\*\ - JPEGDEC_ERROR_QTERR A Quantisation table referenced in a component referenced in a scan (SOS header) selected an invalid Quantisation table +*\*\ - JPEGDEC_ERROR_CERR A component referenced in the scan header (SOS) was not defined in the previous frame header (SOF) +*\*\ - JPEGDEC_ERROR_HUF Huffman decode error detected +*\*\ - JPEGDEC_ERROR_UNEXP Unexpected marker detected +*\*\ - JPEGDEC_ERROR_UNK Unknown marker detected +*\*\return FlagStatus +*\*\ - RESET +*\*\ - SET +**/ +FlagStatus JPEGDEC_GetFlagStatus(uint32_t Flag) +{ + FlagStatus status_value; + if((JPEG_DEC->ERROR & Flag) == Flag ) + { + status_value = SET; + } + else + { + status_value = RESET; + } + return status_value; +} + + +/** +*\*\name JPEGDEC_GetUNKErrorAddress. +*\*\fun Get Unknown marker error address. +*\*\param none +*\*\return address +*\*\ - 0x00000000~0xFFFFFFFF +**/ +uint32_t JPEGDEC_GetUNKErrorAddress(void) +{ + return JPEG_DEC->UNLOC; +} + +/** +*\*\name JPEGDEC_GetUNEXPErrorAddress. +*\*\fun Get Unexpected marker error address. +*\*\param none +*\*\return address +*\*\ - 0x00000000~0xFFFFFFFF +**/ +uint32_t JPEGDEC_GetUNEXPErrorAddress(void) +{ + return JPEG_DEC->UELOC; +} + +/** +*\*\name JPEGDEC_GetHESYMErrorAddress. +*\*\fun Get the Huffman symbol that is in error. +*\*\param none +*\*\return address +*\*\ - 0x0000~0xFFFF +**/ +uint16_t JPEGDEC_GetHESYMErrorAddress(void) +{ + return ((uint16_t)JPEG_DEC->HESYM & JPEGDEC_HESYM_HESYM); +} + +/** +*\*\name JPEGDEC_GetHESYMECSErrorAddress. +*\*\fun Get Huffman ECS Number Symbol. +*\*\param none +*\*\return address +*\*\ - 0x00000000~0xFFFFFFFF +**/ +uint32_t JPEGDEC_GetHESYMECSErrorAddress(void) +{ + return JPEG_DEC->HESYMECS; +} + +/** +*\*\name JPEGDEC_GetHUFSErrorAddress. +*\*\fun Get Unexpected marker error address. +*\*\param none +*\*\return address +*\*\ - 0x00000000~0xFFFFFFFF +**/ +uint32_t JPEGDEC_GetHUFSErrorAddress(void) +{ + return JPEG_DEC->HUF_SELOC; +} + + +/** +*\*\name JPEGDEC_TableAccessRequest. +*\*\fun JPEG DEC Table Access Request. +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return status +*\*\ - ERROR +*\*\ - SUCCESS +**/ +ErrorStatus JPEGDEC_TableAccessRequest(FunctionalState Cmd) +{ + ErrorStatus status = SUCCESS; + uint32_t count_value = 0; + + if(Cmd == DISABLE) + { + JPEG_DEC->TAB_ACCREQ &= (~JPEGDEC_TAB_ACCREQ_AQEQ); + } + else + { + JPEG_DEC->TAB_ACCREQ |= JPEGDEC_TAB_ACCREQ_AQEQ; + + while((JPEG_DEC->TAB_ACCREQ & JPEGDEC_TAB_ACCREQ_AOK) != JPEGDEC_TAB_ACCREQ_AOK) + { + count_value++; + if(count_value > 0x1000) + { + status = ERROR; + break; + } + } + } + + return status; +} + +/** +*\*\name JPEGDEC_GetHUFSErrorAddress. +*\*\fun Get Unexpected marker error address. +*\*\param TableAddress +*\*\ - JPEGDEC_EOB0_ADDRESS +*\*\ - JPEGDEC_EOB1_ADDRESS +*\*\ - JPEGDEC_EOB2_ADDRESS +*\*\ - JPEGDEC_EOB3_ADDRESS +*\*\param EOBSymbol +*\*\ - 0x0000~0xFFFF +*\*\param EOBSymbolMask +*\*\ - 0x0000~0xFFFF +*\*\return none +**/ +void JPEGDEC_SetHUFTable_EOB(uint32_t TableAddress,uint32_t EOBSymbol,uint32_t EOBSymbolMask) +{ + *(uint32_t*)(JPEG_DEC_BASE + TableAddress) = (EOBSymbol | (EOBSymbolMask << REG_BIT16_OFFSET)); +} + + +/** +*\*\name JPEGDEC_SetHuffTable. +*\*\fun Set Huffman table parameters. +*\*\param TableType +*\*\ - JPEGDEC_HUFFTABLE +*\*\ - JPEGDEC_DVECTORTABLE +*\*\ - JPEGDEC_IVECTORTABLE +*\*\ - JPEGDEC_HUFFACCTABLE +*\*\param Tableselector +*\*\ - JPEGDEC_DCTABLE +*\*\ - JPEGDEC_ACTABLE +*\*\param TableNum +*\*\ - JPEGDEC_HUFFTABLE_0 +*\*\ - JPEGDEC_HUFFTABLE_1 +*\*\ - JPEGDEC_HUFFTABLE_2 +*\*\ - JPEGDEC_HUFFTABLE_3 +*\*\param &Value +*\*\ - 0x00000000~0xFFFFFFFF +*\*\param Count +*\*\ - 0x00000000~0xFFFFFFFF +*\*\return status +*\*\ - ERROR +*\*\ - SUCCESS +**/ +ErrorStatus JPEGDEC_SetHuffTable(uint32_t TableType,uint32_t Tableselector,uint32_t TableNum,uint32_t* Value,uint32_t Count) +{ + ErrorStatus status = SUCCESS; + uint32_t regtemp = 0U; + + regtemp = (TableType | Tableselector | TableNum); + JPEG_DEC->HUF_ADDR = regtemp; + + if(Count > JPEG_DEC->HUF_REM) + { + status = ERROR; + } + else + { + /* no process */ + } + + for(regtemp = 0;regtempHUF_DATA = Value[regtemp]; + } + + return status; +} + + +/** +*\*\name JPEGDEC_SetQuantiTable. +*\*\fun Set Quantisation table parameters. +*\*\param TableAddress +*\*\ - JPEGDEC_QT0_ADDRESS +*\*\ - JPEGDEC_QT1_ADDRESS +*\*\ - JPEGDEC_QT2_ADDRESS +*\*\ - JPEGDEC_QT3_ADDRESS +*\*\param &Value +*\*\ - 0x00000000~0xFFFFFFFF +*\*\param Count +*\*\ - 0x00~0x40 +*\*\return none +**/ +void JPEGDEC_SetQuantiTable(uint32_t TableAddress,uint8_t* Value,uint32_t Count) +{ + uint32_t num; + + for(num = 0;numheader_size + 3U)/4U) + \ + ((JPEGENC_InitStruct->hufftab0_header_size + 3U)/4U) + \ + ((JPEGENC_InitStruct->hufftab1_header_size + 3U)/4U) + \ + ((JPEGENC_InitStruct->hufftab2_header_size + 3U)/4U) + \ + ((JPEGENC_InitStruct->hufftab3_header_size + 3U)/4U) + \ + ((JPEGENC_InitStruct->footer_size + 3U)/4U); + + /* Total size exceeds limit, error returned */ + if(size_word > 0x200U) + { + return ERROR; + } + + /* Huffman tables0 */ + if(JPEGENC_InitStruct->HuffmanTable0.DCcode_offset != NULL) + { + for(cnt_value = 0U;cnt_value < 12U;cnt_value++) + { + JPEG_ENC->HT0.DCOL[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable0.DCcode_offset[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable0.ACcode_offset != NULL) + { + for(cnt_value = 0U;cnt_value < 160U;cnt_value++) + { + JPEG_ENC->HT0.ACOL[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable0.ACcode_offset[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable0.DCcode_start != NULL) + { + for(cnt_value = 0U;cnt_value < 16U;cnt_value++) + { + JPEG_ENC->HT0.DCCODE[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable0.DCcode_start[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable0.ACcode_start != NULL) + { + for(cnt_value = 0U;cnt_value < 16U;cnt_value++) + { + JPEG_ENC->HT0.ACCODE[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable0.ACcode_start[cnt_value]; + } + } + else + { + /* no process */ + } + + JPEG_ENC->HT0.EOBS = JPEGENC_InitStruct->HuffmanTable0.EOBS; + JPEG_ENC->HT0.ZRLS = JPEGENC_InitStruct->HuffmanTable0.ZRLS; + + /* Huffman tables1 */ + if(JPEGENC_InitStruct->HuffmanTable1.DCcode_offset != NULL) + { + for(cnt_value = 0U;cnt_value < 12U;cnt_value++) + { + JPEG_ENC->HT1.DCOL[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable1.DCcode_offset[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable1.ACcode_offset != NULL) + { + for(cnt_value = 0U;cnt_value < 160U;cnt_value++) + { + JPEG_ENC->HT1.ACOL[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable1.ACcode_offset[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable1.DCcode_start != NULL) + { + for(cnt_value = 0U;cnt_value < 16U;cnt_value++) + { + JPEG_ENC->HT1.DCCODE[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable1.DCcode_start[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable1.ACcode_start != NULL) + { + for(cnt_value = 0U;cnt_value < 16U;cnt_value++) + { + JPEG_ENC->HT1.ACCODE[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable1.ACcode_start[cnt_value]; + } + } + else + { + /* no process */ + } + + JPEG_ENC->HT1.EOBS = JPEGENC_InitStruct->HuffmanTable1.EOBS; + JPEG_ENC->HT1.ZRLS = JPEGENC_InitStruct->HuffmanTable1.ZRLS; + + /* Huffman tables2 */ + if(JPEGENC_InitStruct->HuffmanTable2.DCcode_offset != NULL) + { + for(cnt_value = 0U;cnt_value < 12U;cnt_value++) + { + JPEG_ENC->HT2.DCOL[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable2.DCcode_offset[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable2.ACcode_offset != NULL) + { + for(cnt_value = 0U;cnt_value < 160U;cnt_value++) + { + JPEG_ENC->HT2.ACOL[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable2.ACcode_offset[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable2.DCcode_start != NULL) + { + for(cnt_value = 0U;cnt_value < 16U;cnt_value++) + { + JPEG_ENC->HT2.DCCODE[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable2.DCcode_start[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable2.ACcode_start != NULL) + { + for(cnt_value = 0U;cnt_value < 16U;cnt_value++) + { + JPEG_ENC->HT2.ACCODE[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable2.ACcode_start[cnt_value]; + } + } + else + { + /* no process */ + } + + JPEG_ENC->HT2.EOBS = JPEGENC_InitStruct->HuffmanTable2.EOBS; + JPEG_ENC->HT2.ZRLS = JPEGENC_InitStruct->HuffmanTable2.ZRLS; + + /* Huffman tables3 */ + if(JPEGENC_InitStruct->HuffmanTable3.DCcode_offset != NULL) + { + for(cnt_value = 0U;cnt_value < 12U;cnt_value++) + { + JPEG_ENC->HT3.DCOL[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable3.DCcode_offset[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable3.ACcode_offset != NULL) + { + for(cnt_value = 0U;cnt_value < 160U;cnt_value++) + { + JPEG_ENC->HT3.ACOL[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable3.ACcode_offset[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable3.DCcode_start != NULL) + { + for(cnt_value = 0U;cnt_value < 16U;cnt_value++) + { + JPEG_ENC->HT3.DCCODE[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable3.DCcode_start[cnt_value]; + } + } + else + { + /* no process */ + } + + if(JPEGENC_InitStruct->HuffmanTable3.ACcode_start != NULL) + { + for(cnt_value = 0U;cnt_value < 16U;cnt_value++) + { + JPEG_ENC->HT3.ACCODE[cnt_value] = (uint32_t)JPEGENC_InitStruct->HuffmanTable3.ACcode_start[cnt_value]; + } + } + else + { + /* no process */ + } + + JPEG_ENC->HT3.EOBS = JPEGENC_InitStruct->HuffmanTable3.EOBS; + JPEG_ENC->HT3.ZRLS = JPEGENC_InitStruct->HuffmanTable3.ZRLS; + + /* File frame header */ + if(JPEGENC_InitStruct->header_address != NULL) + { + size_word = ((JPEGENC_InitStruct->header_size + 3U)/4U); + + pbuffer = (uint32_t*)JPEGENC_InitStruct->header_address; + + for(cnt_value = 0; cnt_value< size_word;cnt_value++) + { + JPEG_ENC->HFBUFFER[cnt_value] = pbuffer[cnt_value]; + } + + JPEG_ENC->HEADD = JPEGENC_InitStruct->header_size - 1; + position_temp = size_word; + } + else + { + JPEG_ENC->HEADD = 0x00U; + } + + /* Huffman table0 frame header */ + if(JPEGENC_InitStruct->hufftab0_header_address != NULL) + { + size_word = ((JPEGENC_InitStruct->hufftab0_header_size + 3U)/4U); + + pbuffer = (uint32_t*)JPEGENC_InitStruct->hufftab0_header_address; + + for(cnt_value = 0; cnt_value< size_word;cnt_value++) + { + JPEG_ENC->HFBUFFER[cnt_value + position_temp] = pbuffer[cnt_value]; + } + + JPEG_ENC->HUFTAB0E = position_temp * 4U + JPEGENC_InitStruct->hufftab0_header_size - 1; + position_temp = position_temp + size_word; + } + else + { + JPEG_ENC->HUFTAB0E = 0x00U; + } + + /* Huffman table1 frame header */ + if(JPEGENC_InitStruct->hufftab1_header_address != NULL) + { + size_word = ((JPEGENC_InitStruct->hufftab1_header_size + 3U)/4U); + + pbuffer = (uint32_t*)JPEGENC_InitStruct->hufftab1_header_address; + + for(cnt_value = 0; cnt_value< size_word;cnt_value++) + { + JPEG_ENC->HFBUFFER[cnt_value + position_temp] = pbuffer[cnt_value]; + } + + JPEG_ENC->HUFTAB1E = position_temp * 4U + JPEGENC_InitStruct->hufftab1_header_size - 1; + position_temp = position_temp + size_word; + } + else + { + JPEG_ENC->HUFTAB1E = 0x00U; + } + + /* Huffman table2 frame header */ + if(JPEGENC_InitStruct->hufftab2_header_address != NULL) + { + size_word = ((JPEGENC_InitStruct->hufftab2_header_size + 3U)/4U); + + pbuffer = (uint32_t*)JPEGENC_InitStruct->hufftab2_header_address; + + for(cnt_value = 0; cnt_value< size_word;cnt_value++) + { + JPEG_ENC->HFBUFFER[cnt_value + position_temp] = pbuffer[cnt_value]; + } + + JPEG_ENC->HUFTAB2E = position_temp * 4U + JPEGENC_InitStruct->hufftab2_header_size - 1; + position_temp = position_temp + size_word; + } + else + { + JPEG_ENC->HUFTAB2E = 0x00U; + } + + /* Huffman table3 frame header */ + if(JPEGENC_InitStruct->hufftab3_header_address != NULL) + { + size_word = ((JPEGENC_InitStruct->hufftab3_header_size + 3U)/4U); + + pbuffer = (uint32_t*)JPEGENC_InitStruct->hufftab3_header_address; + + for(cnt_value = 0; cnt_value< size_word;cnt_value++) + { + JPEG_ENC->HFBUFFER[cnt_value + position_temp] = pbuffer[cnt_value]; + } + + JPEG_ENC->HUFTAB0E = position_temp * 4U + JPEGENC_InitStruct->hufftab3_header_size - 1; + position_temp = position_temp + size_word; + } + else + { + JPEG_ENC->HUFTAB3E = 0x00U; + } + + /* File frame footer */ + if(JPEGENC_InitStruct->footer_address != NULL) + { + size_word = ((JPEGENC_InitStruct->footer_size + 3U)/4U); + + pbuffer = (uint32_t*)JPEGENC_InitStruct->footer_address; + + for(cnt_value = 0; cnt_value< size_word;cnt_value++) + { + JPEG_ENC->HFBUFFER[cnt_value + position_temp] = pbuffer[cnt_value]; + } + + JPEG_ENC->FEADD = position_temp * 4U + JPEGENC_InitStruct->footer_size - 1; + } + else + { + JPEG_ENC->FEADD = 0x00U; + } + + /* Header parts out select */ + JPEG_ENC->HSEL = JPEGENC_InitStruct->output_select; + + /* Quantisation table 0 */ + if(JPEGENC_InitStruct->QT0_address != NULL) + { + for(cnt_value = 0; cnt_value< 64U;cnt_value++) + { + JPEG_ENC->QT0[cnt_value] = (uint32_t)JPEGENC_InitStruct->QT0_address[cnt_value]; + } + } + else + { + /* no process */ + } + + /* Quantisation table 1 */ + if(JPEGENC_InitStruct->QT1_address != NULL) + { + for(cnt_value = 0; cnt_value< 64U;cnt_value++) + { + JPEG_ENC->QT1[cnt_value] = (uint32_t)JPEGENC_InitStruct->QT1_address[cnt_value]; + } + } + else + { + /* no process */ + } + + /* Quantisation table 2 */ + if(JPEGENC_InitStruct->QT2_address != NULL) + { + for(cnt_value = 0; cnt_value< 64U;cnt_value++) + { + JPEG_ENC->QT2[cnt_value] = (uint32_t)JPEGENC_InitStruct->QT2_address[cnt_value]; + } + } + else + { + /* no process */ + } + + /* Quantisation table 3 */ + if(JPEGENC_InitStruct->QT3_address != NULL) + { + for(cnt_value = 0; cnt_value< 64U;cnt_value++) + { + JPEG_ENC->QT3[cnt_value] = (uint32_t)JPEGENC_InitStruct->QT3_address[cnt_value]; + } + } + else + { + /* no process */ + } + + /* restart interval configure */ + JPEG_ENC->RICTRL = (JPEGENC_InitStruct->restart_interval | (JPEGENC_InitStruct->interval_num - 1U)); + + /* JPEG ENC CTRL register */ + JPEG_ENC->CTRL = ((JPEGENC_InitStruct->Corereset << REG_BIT1_OFFSET) |\ + (JPEGENC_InitStruct->C0HT_select << REG_BIT4_OFFSET) |\ + (JPEGENC_InitStruct->C1HT_select << REG_BIT6_OFFSET) |\ + (JPEGENC_InitStruct->C2HT_select << REG_BIT8_OFFSET) |\ + (JPEGENC_InitStruct->C3HT_select << REG_BIT10_OFFSET) |\ + (JPEGENC_InitStruct->C0QT_select << REG_BIT12_OFFSET) |\ + (JPEGENC_InitStruct->C1QT_select << REG_BIT14_OFFSET) |\ + (JPEGENC_InitStruct->C2QT_select << REG_BIT16_OFFSET) |\ + (JPEGENC_InitStruct->C3QT_select << REG_BIT18_OFFSET)); + + return status; +} + + +/** +*\*\name JPEGENC_Enable +*\*\fun Enables or disables table output in output stream. +*\*\param outputsel (The input parameters must be the following values): +*\*\ - JPEGENC_OUTPUT_QT0 +*\*\ - JPEGENC_OUTPUT_QT1 +*\*\ - JPEGENC_OUTPUT_QT2 +*\*\ - JPEGENC_OUTPUT_QT3 +*\*\ - JPEGENC_OUTPUT_HT0 +*\*\ - JPEGENC_OUTPUT_HT1 +*\*\ - JPEGENC_OUTPUT_HT2 +*\*\ - JPEGENC_OUTPUT_HT3 +*\*\ - JPEGENC_OUTPUT_ONLY +*\*\ - JPEGENC_OUTPUT_NOECS +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void JPEGENC_OutputEnable(uint32_t outputsel,FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + JPEG_ENC->HSEL |= outputsel; + } + else + { + JPEG_ENC->HSEL &= (~outputsel); + } +} + + +/** +*\*\name JPEGENC_Enable +*\*\fun Enables or disables the specified JPEGENC peripheral. +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void JPEGENC_Enable(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable JPEGENC module */ + JPEG_ENC->CTRL |= JPEGENC_CTRL_EN; + } + else + { + /* Disable JPEGENC module */ + JPEG_ENC->HSEL &= (~JPEGENC_CTRL_EN); + } +} + + +/** +*\*\name JPEGENC_DynamicAdjustEnable +*\*\fun Enables or disables dynamic adjustment. +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void JPEGENC_DynamicAdjustEnable(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + JPEG_ENC->DYNRCFG |= JPEGENC_DYNRCFG_DYNEN; + } + else + { + JPEG_ENC->DYNRCFG &= JPEGENC_DYNRCFG_DYNEN; + } +} + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lcdc.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lcdc.c new file mode 100644 index 0000000000..7fc3595537 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lcdc.c @@ -0,0 +1,1160 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_lcdc.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ + +#include "n32h76x_78x_lcdc.h" +#include "n32h76x_78x_rcc.h" + +/** +*\*\name LCDC_DeInit +*\*\fun Deinitializes the LCDC registers. +*\*\param none +*\*\return none +**/ +void LCDC_DeInit(void) +{ + RCC_EnableAXIPeriphReset2(RCC_AXI_PERIPHRST_LCDC); +} + +/** +*\*\name LCDC_Init +*\*\fun Initializes the LCDC. +*\*\param LCDC_InitStruct: refer to the definition of LCDC_InitType +*\*\ - LCDC_HSPolarity +*\*\ * LCDC_HSPolarity_LOW +*\*\ * LCDC_HSPolarity_HIGH +*\*\ - LCDC_VSPolarity +*\*\ * LCDC_VSPolarity_LOW +*\*\ * LCDC_VSPolarity_HIGH +*\*\ - LCDC_DEPolarity +*\*\ * LCDC_DEPolarity_LOW +*\*\ * LCDC_DEPolarity_HIGH +*\*\ - LCDC_PCPolarity +*\*\ * LCDC_PCPolarity_IPC +*\*\ * LCDC_PCPolarity_IIPC +*\*\ - LCDC_HorizontalSync +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_VerticalSync +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_AccumulatedHBP +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_AccumulatedVBP +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_AccumulatedActiveW +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_AccumulatedActiveH +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_TotalWidth +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_TotalHeight +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_BackgroundRedValue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_BackgroundGreenValue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_BackgroundBlueValue +*\*\ * 0x00 ~ 0xFF +*\*\return none +**/ +void LCDC_Init(LCDC_InitType* LCDC_InitStruct) +{ + uint32_t tmpgctrl; + uint32_t tmpbgcctrl; + + /* Configure the HS, VS, DE and PC polarity */ + /* Get the LCDC_GCTRL register value */ + tmpgctrl = LCDC->GCTRL; + /* Clear PCLKPOL/DEPOL/VSPOL/HSPOL bits */ + tmpgctrl &= ~(LCDC_GCTRL_HSPOL | LCDC_GCTRL_VSPOL | LCDC_GCTRL_DEPOL | LCDC_GCTRL_PCLKPOL); + /* Set PCLKPOL/DEPOL/VSPOL/HSPOL bits */ + tmpgctrl |= (uint32_t)(LCDC_InitStruct->LCDC_HSPolarity | LCDC_InitStruct->LCDC_VSPolarity | LCDC_InitStruct->LCDC_DEPolarity | LCDC_InitStruct->LCDC_PCPolarity); + /* Write to LCDC_GCTRL */ + LCDC->GCTRL = (uint32_t)tmpgctrl; + + /* Set Synchronization size */ + LCDC->SYNCCTRL = (uint32_t)((LCDC_InitStruct->LCDC_HorizontalSync << 16) | LCDC_InitStruct->LCDC_VerticalSync); + + /* Set Accumulated Back porch */ + LCDC->BPCTRL = (uint32_t)((LCDC_InitStruct->LCDC_AccumulatedHBP << 16) | LCDC_InitStruct->LCDC_AccumulatedVBP); + + /* Set Accumulated Active Width */ + LCDC->AWCTRL = (uint32_t)((LCDC_InitStruct->LCDC_AccumulatedActiveW << 16) | LCDC_InitStruct->LCDC_AccumulatedActiveH); + + /* Set Total Width */ + LCDC->TWCTRL = (uint32_t)((LCDC_InitStruct->LCDC_TotalWidth << 16) | LCDC_InitStruct->LCDC_TotalHeight); + + /* Configure the background color value */ + /* Get the LCDC_BGCCTRL register value */ + tmpbgcctrl = LCDC->BGCCTRL; + /* Clear BCR/BCG/BCB bits */ + tmpbgcctrl &= ~(LCDC_BGCCTRL_BCR | LCDC_BGCCTRL_BCG | LCDC_BGCCTRL_BCB); + /* Set BCR/BCG/BCB bits */ + tmpbgcctrl |= (uint32_t)((LCDC_InitStruct->LCDC_BackgroundRedValue << 16) | (LCDC_InitStruct->LCDC_BackgroundGreenValue << 8) | LCDC_InitStruct->LCDC_BackgroundBlueValue); + /* Write to LCDC_BGCCTRL */ + LCDC->BGCCTRL = (uint32_t)tmpbgcctrl; +} + +/** +*\*\name LCDC_StructInit +*\*\fun Fills each LCDC_InitStruct member with its default value. +*\*\param LCDC_InitStruct: refer to the definition of LCDC_InitType +*\*\ - LCDC_HSPolarity +*\*\ * LCDC_HSPolarity_LOW +*\*\ * LCDC_HSPolarity_HIGH +*\*\ - LCDC_VSPolarity +*\*\ * LCDC_VSPolarity_LOW +*\*\ * LCDC_VSPolarity_HIGH +*\*\ - LCDC_DEPolarity +*\*\ * LCDC_DEPolarity_LOW +*\*\ * LCDC_DEPolarity_HIGH +*\*\ - LCDC_PCPolarity +*\*\ * LCDC_PCPolarity_LOW +*\*\ * LCDC_PCPolarity_HIGH +*\*\ - LCDC_HorizontalSync +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_VerticalSync +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_AccumulatedHBP +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_AccumulatedVBP +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_AccumulatedActiveW +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_AccumulatedActiveH +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_TotalWidth +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_TotalHeight +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_BackgroundRedValue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_BackgroundGreenValue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_BackgroundBlueValue +*\*\ * 0x00 ~ 0xFF +*\*\return none +**/ +void LCDC_StructInit(LCDC_InitType* LCDC_InitStruct) +{ + /* Set the default configuration */ + LCDC_InitStruct->LCDC_HSPolarity = LCDC_HSPolarity_LOW; + LCDC_InitStruct->LCDC_VSPolarity = LCDC_VSPolarity_LOW; + LCDC_InitStruct->LCDC_DEPolarity = LCDC_DEPolarity_LOW; + LCDC_InitStruct->LCDC_PCPolarity = LCDC_PCPolarity_IPC; + LCDC_InitStruct->LCDC_HorizontalSync = 0x00; + LCDC_InitStruct->LCDC_VerticalSync = 0x00; + LCDC_InitStruct->LCDC_AccumulatedHBP = 0x00; + LCDC_InitStruct->LCDC_AccumulatedVBP = 0x00; + LCDC_InitStruct->LCDC_AccumulatedActiveW = 0x00; + LCDC_InitStruct->LCDC_AccumulatedActiveH = 0x00; + LCDC_InitStruct->LCDC_TotalWidth = 0x00; + LCDC_InitStruct->LCDC_TotalHeight = 0x00; + LCDC_InitStruct->LCDC_BackgroundRedValue = 0x00; + LCDC_InitStruct->LCDC_BackgroundGreenValue = 0x00; + LCDC_InitStruct->LCDC_BackgroundBlueValue = 0x00; +} + +/** +*\*\name LCDC_Enable +*\*\fun Enables or disables the specified LCDC peripheral. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void LCDC_Enable(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the LCDC */ + LCDC->GCTRL |= (uint32_t)LCDC_GCTRL_EN; + } + else + { + /* Disable the LCDC */ + LCDC->GCTRL &= (uint32_t)(~LCDC_GCTRL_EN); + } +} + +/** +*\*\name LCDC_DitherEnable +*\*\fun Enables or disables the dither. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void LCDC_DitherEnable(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the dither */ + LCDC->GCTRL |= (uint32_t)LCDC_GCTRL_DEN; + } + else + { + /* Disable the dither */ + LCDC->GCTRL &= (uint32_t)(~LCDC_GCTRL_DEN); + } + +} + +/** +*\*\name LCDC_GetDitherWidth +*\*\fun Get the dither RGB width. +*\*\param none +*\*\return LCDC_RGBType: +*\*\ - LCDC_Blue Dither blue width +*\*\ - LCDC_Green Dither green width +*\*\ - LCDC_Red Dither red width +**/ +LCDC_RGBType LCDC_GetDitherWidth(void) +{ + LCDC_RGBType LCDC_RGB_DitherStruct; + + LCDC->GCTRL &= ~(LCDC_GCTRL_DBW | LCDC_GCTRL_DGW | LCDC_GCTRL_DRW); + + LCDC_RGB_DitherStruct.LCDC_Blue = (uint32_t)((LCDC->GCTRL >> 4) & 0x7); + LCDC_RGB_DitherStruct.LCDC_Green = (uint32_t)((LCDC->GCTRL >> 8) & 0x7); + LCDC_RGB_DitherStruct.LCDC_Red = (uint32_t)((LCDC->GCTRL >> 12) & 0x7); + + return LCDC_RGB_DitherStruct; +} + +/** +*\*\name LCDC_DitherStructInit +*\*\fun Fills each LCDC_RGB_DitherStruct member with its default value. +*\*\param LCDC_RGB_DitherStruct +*\*\ - LCDC_Blue Dither blue width +*\*\ - LCDC_Green Dither green width +*\*\ - LCDC_Red Dither red width +*\*\return none +**/ +void LCDC_DitherStructInit(LCDC_RGBType* LCDC_RGB_DitherStruct) +{ + LCDC_RGB_DitherStruct->LCDC_Blue = 0x02; + LCDC_RGB_DitherStruct->LCDC_Green = 0x02; + LCDC_RGB_DitherStruct->LCDC_Red = 0x02; +} + +/** +*\*\name LCDC_LINTPConfig +*\*\fun Define the position of the line interrupt. +*\*\param LCDC_LINTPosition +*\*\ - 0x0000 ~ 0xFFFF +*\*\return none +**/ +void LCDC_LINTPConfig(uint32_t LCDC_LINTPosition) +{ + /* Sets the Line Interrupt position */ + LCDC->LINTPCTRL = LCDC_LINTPosition; +} + +/** +*\*\name LCDC_ReloadConfig +*\*\fun Reload registers with new parameters. +*\*\param LCDC_Reload +*\*\ - LCDC_IMReload +*\*\ - LCDC_VBReload +*\*\return none +**/ +void LCDC_ReloadConfig(uint32_t LCDC_Reload) +{ + /* Sets the Reload type */ + LCDC->SRCTRL = (uint32_t)LCDC_Reload; +} + +/** +*\*\name LCDC_LayerReloadConfig +*\*\fun Reload layers registers with new parameters. +*\*\param LCDC_Reload +*\*\ - LCDC_LayerIMReload +*\*\ - LCDC_LayerVBReload +*\*\ - LCDC_LayerMGReload +*\*\return none +**/ +void LCDC_LayerReloadConfig(LCDC_Layer_Module* LCDC_Layerx, uint32_t LCDC_LayerReload) +{ + /* Sets the reload type */ + LCDC_Layerx->LSRCTRL = (uint32_t)LCDC_LayerReload; +} + +/** +*\*\name LCDC_LayerInit +*\*\fun Initializes the LCDC Layer according to the specified parameters in the LCDC_Layer_InitStruct. +*\*\param LCDC_Layerx: refer to the definition of LCDC_Layer_Module +*\*\ - LCDC_Layer1 +*\*\ - LCDC_Layer2 +*\*\ - LCDC_Layer3 +*\*\ - LCDC_Layer4 +*\*\param LCDC_Layer_InitStruct: refer to the definition of LCDC_Layer_InitType +*\*\ - LCDC_HorizontalStart +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_HorizontalStop +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_HorizontalScalerStop + +*\*\ - LCDC_VerticalStart +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_VerticalStop +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_VerticalScalerStop + +*\*\ - LCDC_PixelFormat +*\*\ * LCDC_Pixel_Format_ARGB8888 +*\*\ * LCDC_Pixel_Format_ABGR8888 +*\*\ * LCDC_Pixel_Format_RGBA8888 +*\*\ * LCDC_Pixel_Format_BGRA8888 +*\*\ * LCDC_Pixel_Format_RGB565 +*\*\ * LCDC_Pixel_Format_BGR565 +*\*\ * LCDC_Pixel_Format_RGB888 +*\*\ * LCDC_Pixel_Format_Custom +*\*\ - LCDC_ConstantAlpha +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_DefaultAlpha +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_BlendingFactor1 +*\*\ * LCDC_BlendingFactor1_CA +*\*\ * LCDC_BlendingFactor1_PAxCA +*\*\ - LCDC_BlendingFactor2 +*\*\ * LCDC_BlendingFactor2_CA +*\*\ * LCDC_BlendingFactor2_PAxCA +*\*\ - LCDC_CFBStartAdress +*\*\ * 0x00000000 ~ 0xFFFFFFFF +*\*\ - LCDC_AFB0StartAdress + +*\*\ - LCDC_AFB1StartAdress + +*\*\ - LCDC_CFBLineLength +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_CFBPitch +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_CFBLineNumber +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_DefaultColorBlue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_DefaultColorGreen +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_DefaultColorRed +*\*\ * 0x00 ~ 0xFF +*\*\return none +**/ +void LCDC_LayerInit(LCDC_Layer_Module* LCDC_Layerx, LCDC_Layer_InitType* LCDC_Layer_InitStruct) +{ + uint32_t tmpwhpctrl; + uint32_t tmpwvpctrl; + uint32_t tmppfctrl; + uint32_t tmpdcctrl; + uint32_t tmpcactrl; + uint32_t tmpbfctrl; + uint32_t tmpcfbaddr; + uint32_t tmpcfblen; + uint32_t tmpcfblnum; + /* Configures the horizontal start and stop position */ + /* Get the LCDC_WHPCTRL register value */ + tmpwhpctrl = LCDC_Layerx->WHPCTRL; + /* Clear WHSTPOS/WHSPPOS bits */ + tmpwhpctrl &= ~(LCDC_WHPCTRL_WHSTPOS | LCDC_WHPCTRL_WHSPPOS); + /* Set WHSTPOS/WHSPPOS bits */ + tmpwhpctrl |= (uint32_t)((LCDC_Layer_InitStruct->LCDC_HorizontalStop << 16) | (LCDC_Layer_InitStruct->LCDC_HorizontalStart)); + /* Write to LCDC_WHPCTRL */ + LCDC_Layerx->WHPCTRL = (uint32_t)tmpwhpctrl; + + /* Configures the vertical start and stop position */ + /* Get the LCDC_WVPCTRL register value */ + tmpwvpctrl = LCDC_Layerx->WVPCTRL; + /* Clear WVSTPOS/WVSPPOS bits */ + tmpwvpctrl &= ~(LCDC_WVPCTRL_WVSTPOS | LCDC_WVPCTRL_WVSPPOS); + /* Set WVSTPOS/WVSPPOS bits */ + tmpwvpctrl |= (uint32_t)((LCDC_Layer_InitStruct->LCDC_VerticalStop << 16) | (LCDC_Layer_InitStruct->LCDC_VerticalStart)); + /* Write to LCDC_WVPCTRL */ + LCDC_Layerx->WVPCTRL = (uint32_t)tmpwvpctrl; + + /* Specifies the pixel format */ + /* Get the LCDC_PFCTRL register value */ + tmppfctrl = LCDC_Layerx->PFCTRL; + /* Clear PF bits */ + tmppfctrl &= ~LCDC_PFCTRL_PF; + /* Set PF bits */ + tmppfctrl |= (uint32_t)(LCDC_Layer_InitStruct->LCDC_PixelFormat); + /* Write to LCDC_PFCTRL */ + LCDC_Layerx->PFCTRL = (uint32_t)tmppfctrl; + + /* Configures the default color values */ + /* Get the LCDC_DCCTRL register value */ + tmpdcctrl = LCDC_Layerx->DCCTRL; + /* Clear DCA/DCR/DCG/DCB bits */ + tmpdcctrl &= ~(LCDC_DCCTRL_DCA | LCDC_DCCTRL_DCR | LCDC_DCCTRL_DCG | LCDC_DCCTRL_DCB); + /* Set DCA/DCR/DCG/DCB bits */ + tmpdcctrl |= (uint32_t)((LCDC_Layer_InitStruct->LCDC_DefaultAlpha << 24) | (LCDC_Layer_InitStruct->LCDC_DefaultColorRed << 16) | \ + (LCDC_Layer_InitStruct->LCDC_DefaultColorGreen << 8) | (LCDC_Layer_InitStruct->LCDC_DefaultColorBlue)); + /* Write to LCDC_DCCTRL */ + LCDC_Layerx->DCCTRL = (uint32_t)tmpdcctrl; + + /* Specifies the constant alpha value */ + /* Get the LCDC_CACTRL register value */ + tmpcactrl = LCDC_Layerx->CACTRL; + /* Clear CA bits */ + tmpcactrl &= ~LCDC_CACTRL_CA; + /* Set CA bits */ + tmpcactrl |= (uint32_t)(LCDC_Layer_InitStruct->LCDC_ConstantAlpha); + /* Write to LCDC_CACTRL */ + LCDC_Layerx->CACTRL = (uint32_t)tmpcactrl; + + /* Specifies the blending factors */ + /* Get the LCDC_BFCTRL register value */ + tmpbfctrl = LCDC_Layerx->BFCTRL; + /* Clear BF1/BF2 bits */ + tmpbfctrl &= ~(LCDC_BFCTRL_BF1 | LCDC_BFCTRL_BF2); + /* Set BF1/BF2 bits */ + tmpbfctrl |= (uint32_t)((LCDC_Layer_InitStruct->LCDC_BlendingFactor1) | (LCDC_Layer_InitStruct->LCDC_BlendingFactor2)); + /* Write to LCDC_BFCTRL */ + LCDC_Layerx->BFCTRL = (uint32_t)tmpbfctrl; + + /* Configures the color frame buffer start address */ + /* Get the LCDC_CFBADDR register value */ + tmpcfbaddr = LCDC_Layerx->CFBADDR; + /* Clear CFBADDR bits */ + tmpcfbaddr &= ~(LCDC_CFBADDR_CFBADDR); + /* Set CFBADDR bits */ + tmpcfbaddr |= (uint32_t)(LCDC_Layer_InitStruct->LCDC_CFBStartAdress); + /* Write to LCDC_CFBADDR */ + LCDC_Layerx->CFBADDR = (uint32_t)tmpcfbaddr; + + /* Configures the color frame buffer pitch in byte */ + /* Get the LCDC_CFBLEN register value */ + tmpcfblen = LCDC_Layerx->CFBLEN; + /* Clear CFBLLEN/CFBP bits */ + tmpcfblen &= ~(LCDC_CFBLEN_CFBLLEN | LCDC_CFBLEN_CFBP); + /* Set CFBLLEN/CFBP bits */ + tmpcfblen |= (uint32_t)((LCDC_Layer_InitStruct->LCDC_CFBPitch << 16) | (LCDC_Layer_InitStruct->LCDC_CFBLineLength)); + /* Write to LCDC_CFBLEN */ + LCDC_Layerx->CFBLEN = (uint32_t)tmpcfblen; + + /* Configures the frame buffer line number */ + /* Get the LCDC_CFBLNUM register value */ + tmpcfblnum = LCDC_Layerx->CFBLNUM; + /* Clear CFBLNUM bits */ + tmpcfblnum &= ~(LCDC_CFBLNUM_CFBLNUM); + /* Set CFBLNUM bits */ + tmpcfblnum |= (uint32_t)(LCDC_Layer_InitStruct->LCDC_CFBLineNumber); + /* Write to LCDC_CFBLNUM */ + LCDC_Layerx->CFBLNUM = (uint32_t)tmpcfblnum; + +} + +/** +*\*\name LCDC_LayerStructInit +*\*\fun Fills each LCDC_Layer_InitStruct member with its default value. +*\*\param LCDC_Layer_InitStruct: refer to the definition of LCDC_Layer_InitType +*\*\ - LCDC_HorizontalStart +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_HorizontalStop +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_HorizontalScalerStop + +*\*\ - LCDC_VerticalStart +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_VerticalStop +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_VerticalScalerStop + +*\*\ - LCDC_PixelFormat +*\*\ * LCDC_Pixel_Format_ARGB8888 +*\*\ * LCDC_Pixel_Format_ABGR8888 +*\*\ * LCDC_Pixel_Format_RGBA8888 +*\*\ * LCDC_Pixel_Format_BGRA8888 +*\*\ * LCDC_Pixel_Format_RGB565 +*\*\ * LCDC_Pixel_Format_BGR565 +*\*\ * LCDC_Pixel_Format_RGB888 +*\*\ * LCDC_Pixel_Format_Custom +*\*\ - LCDC_ConstantAlpha +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_DefaultAlpha +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_BlendingFactor1 +*\*\ * LCDC_BlendingFactor1_CA +*\*\ * LCDC_BlendingFactor1_PAxCA +*\*\ - LCDC_BlendingFactor2 +*\*\ * LCDC_BlendingFactor2_CA +*\*\ * LCDC_BlendingFactor2_PAxCA +*\*\ - LCDC_CFBStartAdress +*\*\ * 0x00000000 ~ 0xFFFFFFFF +*\*\ - LCDC_AFB0StartAdress + +*\*\ - LCDC_AFB1StartAdress + +*\*\ - LCDC_CFBLineLength +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_CFBPitch +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_CFBLineNumber +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - LCDC_DefaultColorBlue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_DefaultColorGreen +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_DefaultColorRed +*\*\ * 0x00 ~ 0xFF +*\*\return none +**/ +void LCDC_LayerStructInit(LCDC_Layer_InitType* LCDC_Layer_InitStruct) +{ + /* Set the default configuration */ + LCDC_Layer_InitStruct->LCDC_HorizontalStart = 0x00; + LCDC_Layer_InitStruct->LCDC_HorizontalStop = 0x00; + LCDC_Layer_InitStruct->LCDC_HorizontalScalerStop = 0x00; + LCDC_Layer_InitStruct->LCDC_VerticalStart = 0x00; + LCDC_Layer_InitStruct->LCDC_VerticalStop = 0x00; + LCDC_Layer_InitStruct->LCDC_VerticalScalerStop = 0x00; + LCDC_Layer_InitStruct->LCDC_PixelFormat = LCDC_Pixel_Format_ARGB8888; + LCDC_Layer_InitStruct->LCDC_ConstantAlpha = 0xFF; + LCDC_Layer_InitStruct->LCDC_DefaultAlpha = 0x00; + LCDC_Layer_InitStruct->LCDC_BlendingFactor1 = LCDC_BlendingFactor1_PAxCA; + LCDC_Layer_InitStruct->LCDC_BlendingFactor2 = LCDC_BlendingFactor2_PAxCA; + LCDC_Layer_InitStruct->LCDC_CFBStartAdress = 0x00; + LCDC_Layer_InitStruct->LCDC_AFB0StartAdress = 0x00; + LCDC_Layer_InitStruct->LCDC_AFB1StartAdress = 0x00; + LCDC_Layer_InitStruct->LCDC_CFBLineLength = 0x00; + LCDC_Layer_InitStruct->LCDC_CFBLineNumber = 0x00; + LCDC_Layer_InitStruct->LCDC_CFBPitch = 0x00; + LCDC_Layer_InitStruct->LCDC_DefaultColorBlue = 0x00; + LCDC_Layer_InitStruct->LCDC_DefaultColorGreen = 0x00; + LCDC_Layer_InitStruct->LCDC_DefaultColorRed = 0x00; +} + +void LCDC_LayerEnable(LCDC_Layer_Module* LCDC_Layerx , FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the LCDC layer */ + LCDC_Layerx->LCTRL |= (uint32_t)LCDC_LCTRL_LEN; + } + else + { + /* Disable the LCDC layer */ + LCDC_Layerx->LCTRL &= (uint32_t)(~LCDC_LCTRL_LEN); + } +} + +LCDC_PosType LCDC_GetPosStatus(void) +{ + LCDC_PosType LCDC_Pos_InitStruct; + + LCDC->CPSTS &= ~(LCDC_CPSTS_CYPOS | LCDC_CPSTS_CXPOS); + + LCDC_Pos_InitStruct.LCDC_POSX = (uint32_t)(LCDC->CPSTS >> 16); + LCDC_Pos_InitStruct.LCDC_POSY = (uint32_t)(LCDC->CPSTS & 0xFFFF); + + return LCDC_Pos_InitStruct; +} + +void LCDC_PosStructInit(LCDC_PosType* LCDC_Pos_InitStruct) +{ + LCDC_Pos_InitStruct->LCDC_POSX = 0x00; + LCDC_Pos_InitStruct->LCDC_POSY = 0x00; +} + +FlagStatus LCDC_GetCDStatus(uint32_t LCDC_CD) +{ + FlagStatus bitstatus; + + if ((LCDC->CDSTS & LCDC_CD) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name LCDC_ColorKeyingConfig +*\*\fun Set and configure the color keying. +*\*\param LCDC_Layerx: refer to the definition of LCDC_Layer_Module +*\*\ - LCDC_Layer1 +*\*\ - LCDC_Layer2 +*\*\ - LCDC_Layer3 +*\*\ - LCDC_Layer4 +*\*\param LCDC_ColorKeying_InitStruct: refer to the definition of LCDC_ColorKeying_InitType +*\*\ - LCDC_ColorKeyBlue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_ColorKeyGreen +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_ColorKeyRed +*\*\ * 0x00 ~ 0xFF +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void LCDC_ColorKeyingConfig(LCDC_Layer_Module* LCDC_Layerx, LCDC_ColorKeying_InitType* LCDC_ColorKeying_InitStruct, FunctionalState Cmd) +{ + uint32_t tmpckctrl; + + if (Cmd != DISABLE) + { + /* Enable LCDC color keying by setting COLKEN bit */ + LCDC_Layerx->LCTRL |= (uint32_t)LCDC_LCTRL_CKEN; + + /* Sets the color keying values */ + tmpckctrl = LCDC_Layerx ->CKCTRL; + tmpckctrl &= (LCDC_CKCTRL_CKR | LCDC_CKCTRL_CKG | LCDC_CKCTRL_CKB); + tmpckctrl |= ((LCDC_ColorKeying_InitStruct->LCDC_ColorKeyRed << 16) | (LCDC_ColorKeying_InitStruct->LCDC_ColorKeyGreen << 8) | (LCDC_ColorKeying_InitStruct->LCDC_ColorKeyBlue)); + LCDC_Layerx->LCTRL = (uint32_t)tmpckctrl; + } + else + { + /* Disable LCDC color keying by clearing COLKEN bit */ + LCDC_Layerx->LCTRL &= (uint32_t)(~LCDC_LCTRL_CKEN); + } + + /* Reload shadow register */ + LCDC->SRCTRL = (uint32_t)LCDC_IMReload; +} + +/** +*\*\name LCDC_ColorKeyingStructInit +*\*\fun Fills each LCDC_ColorKeying_InitStruct member with its default value. +*\*\param LCDC_ColorKeying_InitStruct: refer to the definition of LCDC_ColorKeying_InitType +*\*\ - LCDC_ColorKeyBlue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_ColorKeyGreen +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_ColorKeyRed +*\*\ * 0x00 ~ 0xFF +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void LCDC_ColorKeyingStructInit(LCDC_ColorKeying_InitType* LCDC_ColorKeying_InitStruct) +{ + /* Initialize the color keying values */ + LCDC_ColorKeying_InitStruct->LCDC_ColorKeyBlue = 0x00; + LCDC_ColorKeying_InitStruct->LCDC_ColorKeyGreen = 0x00; + LCDC_ColorKeying_InitStruct->LCDC_ColorKeyRed = 0x00; +} + +/** +*\*\name LCDC_CLUTEnable +*\*\fun Enables or disables CLUT. +*\*\param LCDC_Layerx: refer to the definition of LCDC_Layer_Module +*\*\ - LCDC_Layer1 +*\*\ - LCDC_Layer2 +*\*\ - LCDC_Layer3 +*\*\ - LCDC_Layer4 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void LCDC_CLUTEnable(LCDC_Layer_Module* LCDC_Layerx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable CLUT by setting CLUTEN bit */ + LCDC_Layerx->LCTRL |= (uint32_t)LCDC_LCTRL_CLUTEN; + } + else + { + /* Disable CLUT by clearing CLUTEN bit */ + LCDC_Layerx->LCTRL &= (uint32_t)(~LCDC_LCTRL_CLUTEN); + } + + /* Reload shadow register */ + LCDC->SRCTRL = (uint32_t)LCDC_IMReload; +} + +/** +*\*\name LCDC_CLUTInit +*\*\fun Configure the CLUT. +*\*\param LCDC_Layerx: refer to the definition of LCDC_Layer_Module +*\*\ - LCDC_Layer1 +*\*\ - LCDC_Layer2 +*\*\ - LCDC_Layer3 +*\*\ - LCDC_Layer4 +*\*\param LCDC_CLUT_InitStruct: refer to the definition of LCDC_CLUT_InitType +*\*\ - LCDC_CLUTAdress +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_RedValue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_GreenValue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_BlueValue +*\*\ * 0x00 ~ 0xFF +*\*\return none +**/ +void LCDC_CLUTInit(LCDC_Layer_Module* LCDC_Layerx, LCDC_CLUT_InitType* LCDC_CLUT_InitStruct) +{ + uint32_t tmpclutwr; + + /* Set the CLUT address and RGB value */ + tmpclutwr = LCDC_Layerx ->CLUTWR; + tmpclutwr &= (LCDC_CLUTWR_CLUTADDR | LCDC_CLUTWR_CLUTR | LCDC_CLUTWR_CLUTG | LCDC_CLUTWR_CLUTB); + tmpclutwr |= ((LCDC_CLUT_InitStruct->LCDC_CLUTAdress << 24) | (LCDC_CLUT_InitStruct->LCDC_RedValue << 16) | \ + (LCDC_CLUT_InitStruct->LCDC_GreenValue << 8) | (LCDC_CLUT_InitStruct->LCDC_BlueValue)); + + LCDC_Layerx->CLUTWR = (uint32_t)tmpclutwr; +} + +/** +*\*\name LCDC_CLUTStructInit +*\*\fun Fills each LCDC_CLUT_InitStruct member with its default value. +*\*\param LCDC_CLUT_InitStruct: refer to the definition of LCDC_CLUT_InitType +*\*\ - LCDC_CLUTAdress +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_RedValue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_GreenValue +*\*\ * 0x00 ~ 0xFF +*\*\ - LCDC_BlueValue +*\*\ * 0x00 ~ 0xFF +*\*\return none +**/ +void LCDC_CLUTStructInit(LCDC_CLUT_InitType* LCDC_CLUT_InitStruct) +{ + /* Initialize the CLUT address and RGB values */ + LCDC_CLUT_InitStruct->LCDC_CLUTAdress = 0x00; + LCDC_CLUT_InitStruct->LCDC_RedValue = 0x00; + LCDC_CLUT_InitStruct->LCDC_GreenValue = 0x00; + LCDC_CLUT_InitStruct->LCDC_BlueValue = 0x00; +} + + +/** +*\*\name LCDC_LayerPosition +*\*\fun Reconfigure the layer position. +*\*\param LCDC_Layerx: refer to the definition of LCDC_Layer_Module +*\*\ - LCDC_Layer1 +*\*\ - LCDC_Layer2 +*\*\ - LCDC_Layer3 +*\*\ - LCDC_Layer4 +*\*\param OffsetX +*\*\ - 0x0000 ~ 0xFFFF +*\*\param OffsetY +*\*\ - 0x0000 ~ 0xFFFF +*\*\return none +**/ +void LCDC_LayerPosition(LCDC_Layer_Module* LCDC_Layerx, uint16_t OffsetX, uint16_t OffsetY) +{ + uint32_t tmpbpctrl; + uint32_t tmppfctrl; + uint32_t tmpcfblen; + uint32_t tmpcfblnum; + uint32_t horizontal_start; + uint32_t horizontal_stop; + uint32_t vertical_start; + uint32_t vertical_stop; + uint8_t tmp; + + LCDC_Layerx->WHPCTRL &= ~(LCDC_WHPCTRL_WHSTPOS | LCDC_WHPCTRL_WHSPPOS); + LCDC_Layerx->WVPCTRL &= ~(LCDC_WVPCTRL_WVSTPOS | LCDC_WVPCTRL_WVSPPOS); + + /* Reconfigures the horizontal and vertical start position */ + tmpbpctrl = LCDC->BPCTRL; + horizontal_start = (tmpbpctrl >> 16) + 1 + OffsetX; + vertical_start = (tmpbpctrl & 0xFFFF) + 1 + OffsetY; + + tmppfctrl = LCDC_Layerx ->PFCTRL; + + if((tmppfctrl == LCDC_Pixel_Format_ARGB8888) | (tmppfctrl == LCDC_Pixel_Format_ABGR8888) | (tmppfctrl == LCDC_Pixel_Format_RGBA8888) | (tmppfctrl == LCDC_Pixel_Format_BGRA8888)) + { + tmp = 4; + } + else if(tmppfctrl == LCDC_Pixel_Format_RGB888) + { + tmp = 3; + } + else if((tmppfctrl == LCDC_Pixel_Format_RGB565) | (tmppfctrl == LCDC_Pixel_Format_BGR565)) + { + tmp = 2; + } + else + { + + } + + tmpcfblen = LCDC_Layerx->CFBLEN; + horizontal_stop = (((tmpcfblen & 0xFFFF) - 3) / tmp) + horizontal_start - 1; + + tmpcfblnum = LCDC_Layerx->CFBLNUM; + vertical_stop = (tmpcfblnum & 0xFFFF) + vertical_start - 1; + + LCDC_Layerx->WHPCTRL = horizontal_start | (horizontal_stop << 16); + LCDC_Layerx->WVPCTRL = vertical_start | (vertical_stop << 16); +} + +/** +*\*\name LCDC_LayerAlpha +*\*\fun Reconfigure constant alpha. +*\*\param LCDC_Layerx: refer to the definition of LCDC_Layer_Module +*\*\ - LCDC_Layer1 +*\*\ - LCDC_Layer2 +*\*\ - LCDC_Layer3 +*\*\ - LCDC_Layer4 +*\*\param ConstantAlpha +*\*\ - 0x00 ~ 0xFF +*\*\return none +**/ +void LCDC_LayerAlpha(LCDC_Layer_Module* LCDC_Layerx, uint8_t ConstantAlpha) +{ + LCDC_Layerx -> CACTRL = ConstantAlpha; +} + +/** +*\*\name LCDC_LayerAddress +*\*\fun Reconfigure layer address. +*\*\param LCDC_Layerx: refer to the definition of LCDC_Layer_Module +*\*\ - LCDC_Layer1 +*\*\ - LCDC_Layer2 +*\*\ - LCDC_Layer3 +*\*\ - LCDC_Layer4 +*\*\param Address +*\*\ - 0x00000000 ~ 0xFFFFFFFF +*\*\return none +**/ +void LCDC_LayerAddress(LCDC_Layer_Module* LCDC_Layerx, uint32_t Address) +{ + LCDC_Layerx -> CFBADDR = Address; +} + +/** +*\*\name LCDC_LayerSize +*\*\fun Reconfigure layer size. +*\*\param LCDC_Layerx: refer to the definition of LCDC_Layer_Module +*\*\ - LCDC_Layer1 +*\*\ - LCDC_Layer2 +*\*\ - LCDC_Layer3 +*\*\ - LCDC_Layer4 +*\*\param Width +*\*\ - layer window width +*\*\param Height +*\*\ - layer window height +*\*\return none +**/ +void LCDC_LayerSize(LCDC_Layer_Module* LCDC_Layerx, uint32_t Width, uint32_t Height) +{ + uint8_t tmp; + uint32_t tmppfctrl; + uint32_t tmpwhpctrl; + uint32_t tmpwvpctrl; + uint32_t horizontal_start; + uint32_t horizontal_stop; + uint32_t vertical_start; + uint32_t vertical_stop; + + tmppfctrl = LCDC_Layerx ->PFCTRL; + + if((tmppfctrl == LCDC_Pixel_Format_ARGB8888) | (tmppfctrl == LCDC_Pixel_Format_ABGR8888) | (tmppfctrl == LCDC_Pixel_Format_RGBA8888) | (tmppfctrl == LCDC_Pixel_Format_BGRA8888)) + { + tmp = 4; + } + else if(tmppfctrl == LCDC_Pixel_Format_RGB888) + { + tmp = 3; + } + else if((tmppfctrl == LCDC_Pixel_Format_RGB565) | (tmppfctrl == LCDC_Pixel_Format_BGR565)) + { + tmp = 2; + } + else + { + + } + + /* update horizontal and vertical stop */ + tmpwhpctrl = LCDC_Layerx->WHPCTRL; + horizontal_start = (tmpwhpctrl & 0xFFFF); + horizontal_stop = Width + horizontal_start - 1; + + tmpwvpctrl = LCDC_Layerx->WVPCTRL; + vertical_start = (tmpwvpctrl & 0xFFFF); + vertical_stop = Height + vertical_start - 1; + + LCDC_Layerx->WHPCTRL = horizontal_start | (horizontal_stop << 16); + LCDC_Layerx->WVPCTRL = vertical_start | (vertical_stop << 16); + + /* Reconfigures the color frame buffer pitch in byte */ + LCDC_Layerx->CFBLEN = ((Width * tmp) << 16) | ((Width * tmp) + 3); + + /* Reconfigures the frame buffer line number */ + LCDC_Layerx->CFBLNUM = Height; +} + +/** +*\*\name LCDC_LayerPixelFormat +*\*\fun Reconfigure layer pixel format. +*\*\param LCDC_Layerx: refer to the definition of LCDC_Layer_Module +*\*\ - LCDC_Layer1 +*\*\ - LCDC_Layer2 +*\*\ - LCDC_Layer3 +*\*\ - LCDC_Layer4 +*\*\param PixelFormat +*\*\ - LCDC_Pixel_Format_ARGB8888 +*\*\ - LCDC_Pixel_Format_ABGR8888 +*\*\ - LCDC_Pixel_Format_RGBA8888 +*\*\ - LCDC_Pixel_Format_BGRA8888 +*\*\ - LCDC_Pixel_Format_RGB565 +*\*\ - LCDC_Pixel_Format_BGR565 +*\*\ - LCDC_Pixel_Format_RGB888 +*\*\return none +**/ +void LCDC_LayerPixelFormat(LCDC_Layer_Module* LCDC_Layerx, uint32_t PixelFormat) +{ + uint8_t tmp; + uint32_t tmppfctrl; + uint32_t tmpcfblen; + + tmppfctrl = LCDC_Layerx ->PFCTRL; + + if((tmppfctrl == LCDC_Pixel_Format_ARGB8888) | (tmppfctrl == LCDC_Pixel_Format_ABGR8888) | (tmppfctrl == LCDC_Pixel_Format_RGBA8888) | (tmppfctrl == LCDC_Pixel_Format_BGRA8888)) + { + tmp = 4; + } + else if(tmppfctrl == LCDC_Pixel_Format_RGB888) + { + tmp = 3; + } + else if((tmppfctrl == LCDC_Pixel_Format_RGB565) | (tmppfctrl == LCDC_Pixel_Format_BGR565)) + { + tmp = 2; + } + else + { + + } + + tmpcfblen = (LCDC_Layerx->CFBLEN >> 16); + tmpcfblen = (tmpcfblen / tmp); + + if((PixelFormat == LCDC_Pixel_Format_ARGB8888) | (PixelFormat == LCDC_Pixel_Format_ABGR8888) | (PixelFormat == LCDC_Pixel_Format_RGBA8888) | (PixelFormat == LCDC_Pixel_Format_BGRA8888)) + { + tmp = 4; + } + else if(PixelFormat == LCDC_Pixel_Format_RGB888) + { + tmp = 3; + } + else if((PixelFormat == LCDC_Pixel_Format_RGB565) | (PixelFormat == LCDC_Pixel_Format_BGR565)) + { + tmp = 2; + } + else + { + + } + + /* Reconfigures the color frame buffer pitch in byte */ + LCDC_Layerx->CFBLEN = ((tmpcfblen * tmp) << 16) | ((tmpcfblen * tmp) + 3); + + /* Reconfigures the color frame buffer start address */ + LCDC_Layerx->PFCTRL = PixelFormat; +} + +/** +*\*\name LCDC_ConfigInt +*\*\fun Enables or disables the specified LCDC's interrupts. +*\*\param LCDC_IT +*\*\ - LCDC_INT_LIEN +*\*\ - LCDC_INT_FUIEN +*\*\ - LCDC_INT_BEIEN +*\*\ - LCDC_INT_RRIEN +*\*\ - LCDC_INT_STNSIGIEN +*\*\ - LCDC_INT_STNSYNCIEN +*\*\ - LCDC_INT_FUKIEN +*\*\ - LCDC_INT_CRCIEN +*\*\ - LCDC_INT_RFEIEN +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void LCDC_ConfigInt(uint32_t LCDC_IT, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the Interrupt sources */ + LCDC->INTEN |= (uint32_t)LCDC_IT; + } + else + { + /* Disable the Interrupt sources */ + LCDC->INTEN &= (uint32_t)(~LCDC_IT); + } +} + +/** +*\*\name LCDC_GetFlagStatus +*\*\fun Checks whether the specified LCDC flag is set or not. +*\*\param LCDC_FLAG +*\*\ - LCDC_FLAG_L +*\*\ - LCDC_FLAG_FU +*\*\ - LCDC_FLAG_BE +*\*\ - LCDC_FLAG_RR +*\*\ - LCDC_FLAG_STNSIG +*\*\ - LCDC_FLAG_STNSYNC +*\*\ - LCDC_FLAG_CRC +*\*\ - LCDC_FLAG_RFE +*\*\return The new state of LCDC_FLAG (SET or RESET). +**/ +FlagStatus LCDC_GetFlagStatus(uint32_t LCDC_FLAG) +{ + FlagStatus bitstatus; + + if ((LCDC->INTSTS & LCDC_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name LCDC_ClearFlag +*\*\fun Clears the LCDC's pending flags. +*\*\param LCDC_FLAG +*\*\ - LCDC_FLAG_L +*\*\ - LCDC_FLAG_FU +*\*\ - LCDC_FLAG_BE +*\*\ - LCDC_FLAG_RR +*\*\ - LCDC_FLAG_STNSIG +*\*\ - LCDC_FLAG_STNSYNC +*\*\ - LCDC_FLAG_CRC +*\*\ - LCDC_FLAG_RFE +*\*\return none. +**/ +void LCDC_ClearFlag(uint32_t LCDC_FLAG) +{ + /* Clear the flags */ + LCDC->INTCLR = LCDC_FLAG; +} + +/** +*\*\name LCDC_GetIntStatus +*\*\fun Checks whether the specified LCDC's interrupt has occurred or not. +*\*\param LCDC_IT +*\*\ - LCDC_INT_LIEN +*\*\ - LCDC_INT_FUIEN +*\*\ - LCDC_INT_BEIEN +*\*\ - LCDC_INT_RRIEN +*\*\ - LCDC_INT_STNSIGIEN +*\*\ - LCDC_INT_STNSYNCIEN +*\*\ - LCDC_INT_FUKIEN +*\*\ - LCDC_INT_CRCIEN +*\*\ - LCDC_INT_RFEIEN +*\*\return The new state of LCDC_IT (SET or RESET). +**/ +INTStatus LCDC_GetIntStatus(uint32_t LCDC_IT) +{ + INTStatus bitstatus; + + if ((LCDC->INTSTS & LCDC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + if (((LCDC->INTEN & LCDC_IT) != (uint32_t)RESET) && (bitstatus != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name LCDC_ClrIntPendingBit +*\*\fun Clears the LCDC's interrupt pending bits. +*\*\param LCDC_IT +*\*\ - LCDC_INT_LIEN +*\*\ - LCDC_INT_FUIEN +*\*\ - LCDC_INT_BEIEN +*\*\ - LCDC_INT_RRIEN +*\*\ - LCDC_INT_STNSIGIEN +*\*\ - LCDC_INT_STNSYNCIEN +*\*\ - LCDC_INT_FUKIEN +*\*\ - LCDC_INT_CRCIEN +*\*\ - LCDC_INT_RFEIEN +*\*\return none. +**/ +void LCDC_ClrIntPendingBit(uint32_t LCDC_IT) +{ + /* Clear the IT pending Bit */ + LCDC->INTCLR = LCDC_IT; +} + + + + + + + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lptim.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lptim.c new file mode 100644 index 0000000000..8c8745df75 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lptim.c @@ -0,0 +1,1220 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_lptim.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_lptim.h" + +/** +*\*\name LPTIM_DeInit. +*\*\fun Set LPTIMx registers to their reset values. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return none +**/ +void LPTIM_DeInit(LPTIM_Module* LPTIMx) +{ + if (LPTIMx == LPTIM1) + { + /* Reset LPTIM1 */ + RCC_EnableRDPeriphReset1(RCC_RD_PERIPHRST_LPTIM1); + } + else if (LPTIMx == LPTIM2) + { + /* Reset LPTIM2 */ + RCC_EnableRDPeriphReset1(RCC_RD_PERIPHRST_LPTIM2); + } + else if (LPTIMx == LPTIM3) + { + /* Reset LPTIM3 */ + RCC_EnableRDPeriphReset1(RCC_RD_PERIPHRST_LPTIM3); + } + else if (LPTIMx == LPTIM4) + { + /* Reset LPTIM4 */ + RCC_EnableRDPeriphReset1(RCC_RD_PERIPHRST_LPTIM4); + } + else if (LPTIMx == LPTIM5) + { + /* Reset LPTIM5 */ + RCC_EnableRDPeriphReset1(RCC_RD_PERIPHRST_LPTIM5); + } + else + { + + } +} + +/** +*\*\name LPTIM_StructInit. +*\*\fun Set each fields of the LPTIM_InitStruct structure to its default value. +*\*\param LPTIM_InitStruct: +*\*\ - Pointer to the LPTIM_InitType structure which will be initialized. +*\*\return none +**/ +void LPTIM_StructInit(LPTIM_InitType* LPTIM_InitStruct) +{ + /* Set the default configuration */ + LPTIM_InitStruct->ClockSource = LPTIM_CLK_SOURCE_INTERNAL; + LPTIM_InitStruct->Prescaler = LPTIM_PRESCALER_DIV1; + LPTIM_InitStruct->Waveform = LPTIM_OUTPUT_WAVEFORM_PWM; + LPTIM_InitStruct->Polarity = LPTIM_OUTPUT_POLARITY_REGULAR; +} + +/** +*\*\name LPTIM_Init. +*\*\fun Configure the LPTIMx peripheral according to the specified parameters. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param LPTIM_InitStruct: +*\*\ - Pointer to a LPTIM_InitType structure. +*\*\return SUCCESS or ERROR. +**/ +ErrorStatus LPTIM_Init(LPTIM_Module* LPTIMx, LPTIM_InitType* LPTIM_InitStruct) +{ + ErrorStatus result = SUCCESS; + + /* The LPTIMx_CFG register must only be modified when the LPTIM is disabled + (ENABLE bit is reset to 0). + */ + if (LPTIM_IsEnabled(LPTIMx) == 1UL) + { + result = ERROR; + } + else + { + /* Set CLKSEL bitfield according to ClockSource value */ + /* Set CLKPRE bitfield according to Prescaler value */ + /* Set WAVE bitfield according to Waveform value */ + /* Set WAVEPOL bitfield according to Polarity value */ + MODIFY_REG(LPTIMx->CFG, + (LPTIM_CFG_CLKSEL | LPTIM_CFG_CLKPRE | LPTIM_CFG_WAVE | LPTIM_CFG_WAVEPOL), + LPTIM_InitStruct->ClockSource | \ + LPTIM_InitStruct->Prescaler | \ + LPTIM_InitStruct->Waveform | \ + LPTIM_InitStruct->Polarity); + } + + return result; +} + +/** +*\*\name LPTIM_Cmd. +*\*\fun Enables or disables the specified LPTIM instance. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void LPTIM_Cmd(LPTIM_Module* LPTIMx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected LPTIM instance */ + SET_BIT(LPTIMx->CTRL, LPTIM_CTRL_LPTIMEN); + } + else + { + /* Disable the selected LPTIM instance */ + CLEAR_BIT(LPTIMx->CTRL, LPTIM_CTRL_LPTIMEN); + } +} + +/** +*\*\name LPTIM_IsEnabled. +*\*\fun Indicates whether the LPTIM instance is enabled. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return 1 or 0 +**/ +uint32_t LPTIM_IsEnabled(LPTIM_Module* LPTIMx) +{ + uint32_t Temp; + + /* Read the corresponding bit, set 1 to return 1, otherwise, return 0 */ + Temp = (((READ_BIT(LPTIMx->CTRL, LPTIM_CTRL_LPTIMEN) == LPTIM_CTRL_LPTIMEN) ? 1UL : 0UL)); + + return Temp; +} + +/** +*\*\name LPTIM_StartCounter. +*\*\fun Starts the LPTIM counter in the desired mode. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param OperatingMode (The input parameters must be the following values): +*\*\ - LPTIM_OPERATING_MODE_CONTINUOUS +*\*\ - LPTIM_OPERATING_MODE_ONESHOT +*\*\return none +*\*\note LPTIM instance must be enabled before starting the counter. +**/ +void LPTIM_StartCounter(LPTIM_Module* LPTIMx, uint32_t OperatingMode) +{ + MODIFY_REG(LPTIMx->CTRL, LPTIM_CTRL_TSTCM | LPTIM_CTRL_SNGMST, OperatingMode); +} + +/** +*\*\name LPTIM_SetUpdateMode. +*\*\fun Set the LPTIM registers update mode (enable/disable register preload). +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param UpdateMode (The input parameters must be the following values): +*\*\ - LPTIM_UPDATE_MODE_IMMEDIATE +*\*\ - LPTIM_UPDATE_MODE_ENDOFPERIOD +*\*\return none +*\*\note This function must be called when the LPTIM instance is disabled. +**/ +void LPTIM_SetUpdateMode(LPTIM_Module* LPTIMx, uint32_t UpdateMode) +{ + MODIFY_REG(LPTIMx->CFG, LPTIM_CFG_RELOAD, UpdateMode); +} + +/** +*\*\name LPTIM_GetUpdateMode. +*\*\fun Get the LPTIM registers update mode. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return LPTIM_UPDATE_MODE_IMMEDIATE or LPTIM_UPDATE_MODE_ENDOFPERIOD +**/ +uint32_t LPTIM_GetUpdateMode(LPTIM_Module* LPTIMx) +{ + uint32_t Mode; + + /* Read the corresponding bit */ + Mode = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_RELOAD)); + + return Mode; +} + +/** +*\*\name LPTIM_SetAutoReloadValue. +*\*\fun Set the auto reload value. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param AutoReload: +*\*\ - Value between Min_Data=0x00 and Max_Data=0xFFFF +*\*\return none +*\*\note The LPTIMx_ARR register content must only be modified when the LPTIM +*\*\ is enabled. +*\*\note After a write to the LPTIMx_ARR register a new write operation to the +*\*\ same register can only be performed when the previous write operation +*\*\ is completed. Any successive write before the ARRUPD flag be set, will +*\*\ lead to unpredictable results. +**/ +void LPTIM_SetAutoReloadValue(LPTIM_Module* LPTIMx, uint32_t AutoReload) +{ + MODIFY_REG(LPTIMx->ARR, LPTIM_ARR_ARRVAL, AutoReload); +} + +/** +*\*\name LPTIM_GetAutoReloadValue. +*\*\fun Get actual auto reload value. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return AutoReload Value between Min_Data=0x00 and Max_Data=0xFFFF +**/ +uint32_t LPTIM_GetAutoReloadValue(LPTIM_Module* LPTIMx) +{ + uint32_t Value; + + /* Read the corresponding bit */ + Value = (uint32_t)(READ_BIT(LPTIMx->ARR, LPTIM_ARR_ARRVAL)); + + return Value; +} + +/** +*\*\name LPTIM_SetCompareValue. +*\*\fun Set the compare value. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param CompareValue: +*\*\ - Value between Min_Data=0x00 and Max_Data=0xFFFF +*\*\return none +*\*\note After a write to the LPTIMx_CMP register a new write operation to the +*\*\ same register can only be performed when the previous write operation +*\*\ is completed. Any successive write before the CMPUPD flag be set, will +*\*\ lead to unpredictable results. +**/ +void LPTIM_SetCompareValue(LPTIM_Module* LPTIMx, uint32_t CompareValue) +{ + MODIFY_REG(LPTIMx->CMP, LPTIM_CMP_CMPVAL, CompareValue); +} + +/** +*\*\name LPTIM_GetCompareValue. +*\*\fun Get actual compare value. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return CompareValue Value between Min_Data=0x00 and Max_Data=0xFFFF +**/ +uint32_t LPTIM_GetCompareValue(LPTIM_Module* LPTIMx) +{ + uint32_t Value; + + /* Read the corresponding bit */ + Value = (uint32_t)(READ_BIT(LPTIMx->CMP, LPTIM_CMP_CMPVAL)); + + return Value; +} + +/** +*\*\name LPTIM_GetCounterValue. +*\*\fun Get actual counter value. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return Counter value +*\*\note When the LPTIM instance is running with an asynchronous clock, reading +*\*\ the LPTIMx_CNT register may return unreliable values. So in this case it +*\*\ is necessary to perform two consecutive read accesses and verify that the +*\*\ two returned values are identical. +**/ +uint32_t LPTIM_GetCounterValue(LPTIM_Module* LPTIMx) +{ + uint32_t Value; + + /* Read the corresponding bit */ + Value = (uint32_t)(READ_BIT(LPTIMx->CNT, LPTIM_CNT_CNTVAL)); + + return Value; +} + +/** +*\*\name LPTIM_SetCounterMode. +*\*\fun Set the counter mode (selection of the LPTIM counter clock source). +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param CounterMode (The input parameters must be the following values): +*\*\ - LPTIM_COUNTER_MODE_INTERNAL +*\*\ - LPTIM_COUNTER_MODE_EXTERNAL +*\*\return none +*\*\note The counter mode can be set only when the LPTIM instance is disabled. +**/ +void LPTIM_SetCounterMode(LPTIM_Module* LPTIMx, uint32_t CounterMode) +{ + MODIFY_REG(LPTIMx->CFG, LPTIM_CFG_CNTMEN, CounterMode); +} + +/** +*\*\name LPTIM_GetCounterMode. +*\*\fun Get the counter mode. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return LPTIM_COUNTER_MODE_INTERNAL or LPTIM_COUNTER_MODE_EXTERNAL +**/ +uint32_t LPTIM_GetCounterMode(LPTIM_Module* LPTIMx) +{ + uint32_t Mode; + + /* Read the corresponding bit */ + Mode = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_CNTMEN)); + + return Mode; +} + +/** +*\*\name LPTIM_ConfigOutput. +*\*\fun Configure the LPTIM instance output. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param Waveform (The input parameters must be the following values): +*\*\ - LPTIM_OUTPUT_WAVEFORM_PWM +*\*\ - LPTIM_OUTPUT_WAVEFORM_SETONCE +*\*\param Polarity (The input parameters must be the following values): +*\*\ - LPTIM_OUTPUT_POLARITY_REGULAR +*\*\ - LPTIM_OUTPUT_POLARITY_INVERSE +*\*\return none +*\*\note This function must be called when the LPTIM instance is disabled. +*\*\note Regarding the LPTIM output polarity the change takes effect immediately, +*\*\ so the output default value will change immediately after the polarity +*\*\ is re-configured, even before the timer is enabled. +**/ +void LPTIM_ConfigOutput(LPTIM_Module* LPTIMx, uint32_t Waveform, uint32_t Polarity) +{ + MODIFY_REG(LPTIMx->CFG, LPTIM_CFG_WAVE | LPTIM_CFG_WAVEPOL, Waveform | Polarity); +} + +/** +*\*\name LPTIM_SetWaveform. +*\*\fun Set waveform shape. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param Waveform (The input parameters must be the following values): +*\*\ - LPTIM_OUTPUT_WAVEFORM_PWM +*\*\ - LPTIM_OUTPUT_WAVEFORM_SETONCE +*\*\return none +**/ +void LPTIM_SetWaveform(LPTIM_Module* LPTIMx, uint32_t Waveform) +{ + MODIFY_REG(LPTIMx->CFG, LPTIM_CFG_WAVE, Waveform); +} + +/** +*\*\name LPTIM_GetWaveform. +*\*\fun Get actual waveform shape. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return LPTIM_OUTPUT_WAVEFORM_PWM or LPTIM_OUTPUT_WAVEFORM_SETONCE +**/ +uint32_t LPTIM_GetWaveform(LPTIM_Module* LPTIMx) +{ + uint32_t Waveform; + + /* Read the corresponding bit */ + Waveform = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_WAVE)); + + return Waveform; +} + +/** +*\*\name LPTIM_SetPolarity. +*\*\fun Set output polarity. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param Polarity (The input parameters must be the following values): +*\*\ - LPTIM_OUTPUT_POLARITY_REGULAR +*\*\ - LPTIM_OUTPUT_POLARITY_INVERSE +*\*\return none +**/ +void LPTIM_SetPolarity(LPTIM_Module* LPTIMx, uint32_t Polarity) +{ + MODIFY_REG(LPTIMx->CFG, LPTIM_CFG_WAVEPOL, Polarity); +} + +/** +*\*\name LPTIM_GetPolarity. +*\*\fun Get actual output polarity. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return LPTIM_OUTPUT_POLARITY_REGULAR or LPTIM_OUTPUT_POLARITY_INVERSE +**/ +uint32_t LPTIM_GetPolarity(LPTIM_Module* LPTIMx) +{ + uint32_t Polarity; + + /* Read the corresponding bit */ + Polarity = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_WAVEPOL)); + + return Polarity; +} + +/** +*\*\name LPTIM_SetPrescaler. +*\*\fun Set actual prescaler division ratio. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param Prescaler (The input parameters must be the following values): +*\*\ - LPTIM_PRESCALER_DIV1 +*\*\ - LPTIM_PRESCALER_DIV2 +*\*\ - LPTIM_PRESCALER_DIV4 +*\*\ - LPTIM_PRESCALER_DIV8 +*\*\ - LPTIM_PRESCALER_DIV16 +*\*\ - LPTIM_PRESCALER_DIV32 +*\*\ - LPTIM_PRESCALER_DIV64 +*\*\ - LPTIM_PRESCALER_DIV128 +*\*\return none +*\*\note This function must be called when the LPTIM instance is disabled. +*\*\note When the LPTIM is configured to be clocked by an internal clock +*\*\ source and the LPTIM counter is configured to be updated by active +*\*\ edges detected on the LPTIM external Input1, the internal clock +*\*\ provided to the LPTIM must not be prescaled. +**/ +void LPTIM_SetPrescaler(LPTIM_Module* LPTIMx, uint32_t Prescaler) +{ + MODIFY_REG(LPTIMx->CFG, LPTIM_CFG_CLKPRE, Prescaler); +} + +/** +*\*\name LPTIM_GetPrescaler. +*\*\fun Get actual prescaler division ratio. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return Returned value can be one of the following values: +*\*\ - LPTIM_PRESCALER_DIV1 +*\*\ - LPTIM_PRESCALER_DIV2 +*\*\ - LPTIM_PRESCALER_DIV4 +*\*\ - LPTIM_PRESCALER_DIV8 +*\*\ - LPTIM_PRESCALER_DIV16 +*\*\ - LPTIM_PRESCALER_DIV32 +*\*\ - LPTIM_PRESCALER_DIV64 +*\*\ - LPTIM_PRESCALER_DIV128 +**/ +uint32_t LPTIM_GetPrescaler(LPTIM_Module* LPTIMx) +{ + uint32_t Prescaler; + + /* Read the corresponding bit */ + Prescaler = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_CLKPRE)); + + return Prescaler; +} + +/** +*\*\name LPTIM_TimeoutCmd. +*\*\fun Enables or disables the LPTIM timeout function. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note This function must be called when the LPTIM instance is disabled. +*\*\note The first trigger event will start the timer, any successive trigger +*\*\ event will reset the counter and the timer will restart. +*\*\note The timeout value corresponds to the compare value; if no trigger +*\*\ occurs within the expected time frame, the MCU is waked-up by the +*\*\ compare match event. +*\*\note A trigger event arriving when the timer is already started will be +*\*\ ignored. +**/ +void LPTIM_TimeoutCmd(LPTIM_Module* LPTIMx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the LPTIM timeout function */ + SET_BIT(LPTIMx->CFG, LPTIM_CFG_TIMOUTEN); + } + else + { + /* Disable the LPTIM timeout function */ + CLEAR_BIT(LPTIMx->CFG, LPTIM_CFG_TIMOUTEN); + } +} + +/** +*\*\name LPTIM_IsEnabledTimeout. +*\*\fun Indicate whether the timeout function is enabled. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return 1 or 0 +**/ +uint32_t LPTIM_IsEnabledTimeout(LPTIM_Module* LPTIMx) +{ + uint32_t Temp; + + /* Read the corresponding bit, set 1 to return 1, otherwise, return 0 */ + Temp = (((READ_BIT(LPTIMx->CFG, LPTIM_CFG_TIMOUTEN) == LPTIM_CFG_TIMOUTEN) ? 1UL : 0UL)); + + return Temp; +} + +/** +*\*\name LPTIM_SoftwareTrigger. +*\*\fun Configure the Software trigger. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return none +**/ +void LPTIM_SoftwareTrigger(LPTIM_Module* LPTIMx) +{ + CLEAR_BIT(LPTIMx->CFG, LPTIM_CFG_TRGEN); +} + +/** +*\*\name LPTIM_ConfigTrigger. +*\*\fun Configure the external trigger used as a trigger event for the LPTIM. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param Source (The input parameters must be the following values): +*\*\ - LPTIM_TRIG_SOURCE_GPIO +*\*\ - LPTIM_TRIG_SOURCE_RTCALARMA +*\*\ - LPTIM_TRIG_SOURCE_RTCALARMB +*\*\ - LPTIM_TRIG_SOURCE_RTCTAMP1 +*\*\ - LPTIM_TRIG_SOURCE_RTCTAMP2 +*\*\ - LPTIM_TRIG_SOURCE_RTCTAMP3 +*\*\ - LPTIM_TRIG_SOURCE_COMP1 +*\*\ - LPTIM_TRIG_SOURCE_COMP2 +*\*\ - LPTIM_TRIG_SOURCE_COMP3 +*\*\ - LPTIM_TRIG_SOURCE_COMP4 +*\*\param Filter (The input parameters must be the following values): +*\*\ - LPTIM_TRIG_FILTER_NONE +*\*\ - LPTIM_TRIG_FILTER_2 +*\*\ - LPTIM_TRIG_FILTER_4 +*\*\ - LPTIM_TRIG_FILTER_8 +*\*\param Polarity (The input parameters must be the following values): +*\*\ - LPTIM_TRIG_POLARITY_RISING +*\*\ - LPTIM_TRIG_POLARITY_FALLING +*\*\ - LPTIM_TRIG_POLARITY_RISING_FALLING +*\*\return none +*\*\note This function must be called when the LPTIM instance is disabled. +*\*\note An internal clock source must be present when a digital filter is +*\*\ required for the trigger. +**/ +void LPTIM_ConfigTrigger(LPTIM_Module* LPTIMx, uint32_t Source, uint32_t Filter, uint32_t Polarity) +{ + MODIFY_REG(LPTIMx->CFG, LPTIM_CFG_TRGSEL | LPTIM_CFG_TRIGFLT | LPTIM_CFG_TRGEN, Source | Filter | Polarity); +} + +/** +*\*\name LPTIM_GetTriggerSource. +*\*\fun Get actual external trigger source. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return Returned value can be one of the following values: +*\*\ - LPTIM_TRIG_SOURCE_GPIO +*\*\ - LPTIM_TRIG_SOURCE_RTCALARMA +*\*\ - LPTIM_TRIG_SOURCE_RTCALARMB +*\*\ - LPTIM_TRIG_SOURCE_RTCTAMP1 +*\*\ - LPTIM_TRIG_SOURCE_RTCTAMP2 +*\*\ - LPTIM_TRIG_SOURCE_RTCTAMP3 +*\*\ - LPTIM_TRIG_SOURCE_COMP1 +*\*\ - LPTIM_TRIG_SOURCE_COMP2 +*\*\ - LPTIM_TRIG_SOURCE_COMP3 +*\*\ - LPTIM_TRIG_SOURCE_COMP4 +**/ +uint32_t LPTIM_GetTriggerSource(LPTIM_Module* LPTIMx) +{ + uint32_t Source; + + /* Read the corresponding bit */ + Source = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_TRGSEL)); + + return Source; +} + +/** +*\*\name LPTIM_GetTriggerFilter. +*\*\fun Get actual external trigger filter. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return Returned value can be one of the following values: +*\*\ - LPTIM_TRIG_FILTER_NONE +*\*\ - LPTIM_TRIG_FILTER_2 +*\*\ - LPTIM_TRIG_FILTER_4 +*\*\ - LPTIM_TRIG_FILTER_8 +**/ +uint32_t LPTIM_GetTriggerFilter(LPTIM_Module* LPTIMx) +{ + uint32_t Filter; + + /* Read the corresponding bit */ + Filter = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_TRIGFLT)); + + return Filter; +} + +/** +*\*\name LPTIM_GetTriggerPolarity. +*\*\fun Get actual external trigger polarity. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return Returned value can be one of the following values: +*\*\ - LPTIM_TRIG_POLARITY_RISING +*\*\ - LPTIM_TRIG_POLARITY_FALLING +*\*\ - LPTIM_TRIG_POLARITY_RISING_FALLING +**/ +uint32_t LPTIM_GetTriggerPolarity(LPTIM_Module* LPTIMx) +{ + uint32_t Polarity; + + /* Read the corresponding bit */ + Polarity = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_TRGEN)); + + return Polarity; +} + +/** +*\*\name LPTIM_SetClockSource. +*\*\fun Set the source of the clock used by the LPTIM instance. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param ClockSource (The input parameters must be the following values): +*\*\ - LPTIM_CLK_SOURCE_INTERNAL +*\*\ - LPTIM_CLK_SOURCE_EXTERNAL +*\*\return none +*\*\note This function must be called when the LPTIM instance is disabled. +**/ +void LPTIM_SetClockSource(LPTIM_Module* LPTIMx, uint32_t ClockSource) +{ + MODIFY_REG(LPTIMx->CFG, LPTIM_CFG_CLKSEL, ClockSource); +} + +/** +*\*\name LPTIM_GetClockSource. +*\*\fun Get actual LPTIM instance clock source. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return Returned value can be one of the following values: +*\*\ - LPTIM_CLK_SOURCE_INTERNAL +*\*\ - LPTIM_CLK_SOURCE_EXTERNAL +**/ +uint32_t LPTIM_GetClockSource(LPTIM_Module* LPTIMx) +{ + uint32_t Source; + + /* Read the corresponding bit */ + Source = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_CLKSEL)); + + return Source; +} + +/** +*\*\name LPTIM_ConfigClock. +*\*\fun Configure the active edge or edges used by the counter when the +*\*\ LPTIM is clocked by an external clock source. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param ClockFilter (The input parameters must be the following values): +*\*\ - LPTIM_CLK_FILTER_NONE +*\*\ - LPTIM_CLK_FILTER_2 +*\*\ - LPTIM_CLK_FILTER_4 +*\*\ - LPTIM_CLK_FILTER_8 +*\*\param ClockPolarity (The input parameters must be the following values): +*\*\ - LPTIM_CLK_POLARITY_RISING +*\*\ - LPTIM_CLK_POLARITY_FALLING +*\*\ - LPTIM_CLK_POLARITY_RISING_FALLING +*\*\ - LPTIM_CLK_POLARITY_RISING_FALLING_NO +*\*\return none +*\*\note This function must be called when the LPTIM instance is disabled. +*\*\note When both external clock signal edges are considered active ones, +*\*\ the LPTIM must also be clocked by an internal clock source with a +*\*\ frequency equal to at least four times the external clock frequency. +*\*\note An internal clock source must be present when a digital filter is +*\*\ required for external clock. +**/ +void LPTIM_ConfigClock(LPTIM_Module* LPTIMx, uint32_t ClockFilter, uint32_t ClockPolarity) +{ + MODIFY_REG(LPTIMx->CFG, LPTIM_CFG_CLKFLT | LPTIM_CFG_CLKPOL, ClockFilter | ClockPolarity); +} + +/** +*\*\name LPTIM_GetClockPolarity. +*\*\fun Get actual clock polarity. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return Returned value can be one of the following values: +*\*\ - LPTIM_CLK_POLARITY_RISING +*\*\ - LPTIM_CLK_POLARITY_FALLING +*\*\ - LPTIM_CLK_POLARITY_RISING_FALLING +*\*\ - LPTIM_CLK_POLARITY_RISING_FALLING_NO +**/ +uint32_t LPTIM_GetClockPolarity(LPTIM_Module* LPTIMx) +{ + uint32_t Polarity; + + /* Read the corresponding bit */ + Polarity = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_CLKPOL)); + + return Polarity; +} + +/** +*\*\name LPTIM_GetClockFilter. +*\*\fun Get actual clock digital filter. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return Returned value can be one of the following values: +*\*\ - LPTIM_CLK_FILTER_NONE +*\*\ - LPTIM_CLK_FILTER_2 +*\*\ - LPTIM_CLK_FILTER_4 +*\*\ - LPTIM_CLK_FILTER_8 +**/ +uint32_t LPTIM_GetClockFilter(LPTIM_Module* LPTIMx) +{ + uint32_t Filter; + + /* Read the corresponding bit */ + Filter = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_CLKFLT)); + + return Filter; +} + +/** +*\*\name LPTIM_SetEncoderModeClockPolarity. +*\*\fun Configure clock polarity in encoder mode. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param ClockPolarity (The input parameters must be the following values): +*\*\ - LPTIM_ENCODER_MODE_RISING +*\*\ - LPTIM_ENCODER_MODE_FALLING +*\*\ - LPTIM_ENCODER_MODE_RISING_FALLING +*\*\return none +*\*\note This function must be called when the LPTIM instance is disabled. +**/ +void LPTIM_SetEncoderModeClockPolarity(LPTIM_Module* LPTIMx, uint32_t ClockPolarity) +{ + MODIFY_REG(LPTIMx->CFG, LPTIM_CFG_CLKPOL, ClockPolarity); +} + +/** +*\*\name LPTIM_GetEncoderModeClockPolarity. +*\*\fun Get clock polarity in encoder mode. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return Returned value can be one of the following values: +*\*\ - LPTIM_ENCODER_MODE_RISING +*\*\ - LPTIM_ENCODER_MODE_FALLING +*\*\ - LPTIM_ENCODER_MODE_RISING_FALLING +**/ +uint32_t LPTIM_GetEncoderModeClockPolarity(LPTIM_Module* LPTIMx) +{ + uint32_t Mode; + + /* Read the corresponding bit */ + Mode = (uint32_t)(READ_BIT(LPTIMx->CFG, LPTIM_CFG_CLKPOL)); + + return Mode; +} + +/** +*\*\name LPTIM_EncoderModeCmd. +*\*\fun Enables or disables the encoder mode. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note This function must be called when the LPTIM instance is disabled. +*\*\note In this mode the LPTIM instance must be clocked by an internal clock +*\*\ source. Also, the prescaler division ratio must be equal to 1. +*\*\note LPTIM instance must be configured in continuous mode prior enabling +*\*\ the encoder mode. +**/ +void LPTIM_EncoderModeCmd(LPTIM_Module* LPTIMx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the encoder mode */ + SET_BIT(LPTIMx->CFG, LPTIM_CFG_ENC); + } + else + { + /* Disable the encoder mode */ + CLEAR_BIT(LPTIMx->CFG, LPTIM_CFG_ENC); + } +} + +/** +*\*\name LPTIM_NoEncoderModeCmd. +*\*\fun Enables or disables the Non-encoder mode. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note This function must be called when the LPTIM instance is disabled. +*\*\note In this mode the LPTIM instance must be clocked by an internal clock +*\*\ source. Also, the prescaler division ratio must be equal to 1. +*\*\note LPTIM instance must be configured in continuous mode prior enabling +*\*\ the encoder mode. +**/ +void LPTIM_NoEncoderModeCmd(LPTIM_Module* LPTIMx, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the Non-encoder mode */ + SET_BIT(LPTIMx->CFG, LPTIM_CFG_NENC); + } + else + { + /* Disable the Non-encoder mode */ + CLEAR_BIT(LPTIMx->CFG, LPTIM_CFG_NENC); + } +} + +/** +*\*\name LPTIM_IsEnabledEncoderMode. +*\*\fun Indicates whether the LPTIM operates in encoder mode. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return 1 or 0 +**/ +uint32_t LPTIM_IsEnabledEncoderMode(LPTIM_Module* LPTIMx) +{ + uint32_t Temp; + + /* Read the corresponding bit, set 1 to return 1, otherwise, return 0 */ + Temp = (((READ_BIT(LPTIMx->CFG, LPTIM_CFG_ENC) == LPTIM_CFG_ENC) ? 1UL : 0UL)); + + return Temp; +} + +/** +*\*\name LPTIM_IsEnabledNoEncoderMode. +*\*\fun Indicates whether the LPTIM operates in Non-encoder mode. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\return 1 or 0 +**/ +uint32_t LPTIM_IsEnabledNoEncoderMode(LPTIM_Module* LPTIMx) +{ + uint32_t Temp; + + /* Read the corresponding bit, set 1 to return 1, otherwise, return 0 */ + Temp = (((READ_BIT(LPTIMx->CFG, LPTIM_CFG_NENC) == LPTIM_CFG_NENC) ? 1UL : 0UL)); + + return Temp; +} + +/** +*\*\name LPTIM_ClearIntFlag. +*\*\fun Clear the specified LPTIM Interrupt status flags. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param IntFlag (The input parameters must be the following values): +*\*\ - LPTIM_COMP_MATCH_FLAG +*\*\ - LPTIM_AUTO_RELOAD_FLAG +*\*\ - LPTIM_EXT_TRIG_EDGE_EVENT_FLAG +*\*\ - LPTIM_COMP_UPDATE_FLAG +*\*\ - LPTIM_AUTO_RELOAD_UPDATE_FLAG +*\*\ - LPTIM_COUNTER_DIR_UP_FLAG +*\*\ - LPTIM_COUNTER_DIR_DOWN_FLAG +*\*\return none +**/ +void LPTIM_ClearIntFlag(LPTIM_Module* LPTIMx, uint32_t IntFlag) +{ + SET_BIT(LPTIMx->INTCLR, IntFlag); +} + +/** +*\*\name LPTIM_IsActiveIntStatus. +*\*\fun Inform application whether the specified LPTIM interrupt has occurred. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param IntSts (The input parameters must be the following values): +*\*\ - LPTIM_COMP_MATCH_STATUS +*\*\ - LPTIM_AUTO_RELOAD_STATUS +*\*\ - LPTIM_EXT_TRIG_EDGE_EVENT_STATUS +*\*\ - LPTIM_COMP_UPDATE_STATUS +*\*\ - LPTIM_AUTO_RELOAD_UPDATE_STATUS +*\*\ - LPTIM_COUNTER_DIR_UP_STATUS +*\*\ - LPTIM_COUNTER_DIR_DOWN_STATUS +*\*\return 1 or 0 +**/ +uint32_t LPTIM_IsActiveIntStatus(LPTIM_Module* LPTIMx, uint32_t IntSts) +{ + uint32_t Temp; + + /* Read the corresponding bit, set 1 to return 1, otherwise, return 0 */ + Temp = (((READ_BIT(LPTIMx->INTSTS, IntSts) == IntSts) ? 1UL : 0UL)); + + return Temp; +} + +/** +*\*\name LPTIM_ConfigInt. +*\*\fun Enables or disables the specified LPTIM interrupts. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param Interrupt (The input parameters must be the following values): +*\*\ - LPTIM_COMP_MATCH_INT +*\*\ - LPTIM_AUTO_RELOAD_INT +*\*\ - LPTIM_EXT_TRIG_EDGE_EVENT_INT +*\*\ - LPTIM_COMP_UPDATE_INT +*\*\ - LPTIM_AUTO_RELOAD_UPDATE_INT +*\*\ - LPTIM_COUNTER_DIR_UP_INT +*\*\ - LPTIM_COUNTER_DIR_DOWN_INT +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note This function must be called when the LPTIM instance is disabled. +**/ +void LPTIM_ConfigInt(LPTIM_Module* LPTIMx, uint32_t Interrupt, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + SET_BIT(LPTIMx->INTEN, Interrupt); + } + else + { + CLEAR_BIT(LPTIMx->INTEN, Interrupt); + } +} + +/** +*\*\name LPTIM_IsEnabledInt. +*\*\fun Indicates whether the specified LPTIM interrupts is enabled. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param Interrupt (The input parameters must be the following values): +*\*\ - LPTIM_COMP_MATCH_INT +*\*\ - LPTIM_AUTO_RELOAD_INT +*\*\ - LPTIM_EXT_TRIG_EDGE_EVENT_INT +*\*\ - LPTIM_COMP_UPDATE_INT +*\*\ - LPTIM_AUTO_RELOAD_UPDATE_INT +*\*\ - LPTIM_COUNTER_DIR_UP_INT +*\*\ - LPTIM_COUNTER_DIR_DOWN_INT +*\*\return 1 or 0 +**/ +uint32_t LPTIM_IsEnabledInt(LPTIM_Module* LPTIMx, uint32_t Interrupt) +{ + uint32_t Temp; + + /* Read the corresponding bit, set 1 to return 1, otherwise, return 0 */ + Temp = (((READ_BIT(LPTIMx->INTEN, Interrupt) == Interrupt) ? 1UL : 0UL)); + + return Temp; +} + +/** +*\*\name LPTIM_ConfigInput1. +*\*\fun Select the connection for Input1 of LPTIM. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param ConnectSelect (The input parameters must be the following values): +*\*\ - LPTIM_INPUT1_CONNECT_GPIO +*\*\ - LPTIM_INPUT1_CONNECT_COMP1 +*\*\ - LPTIM_INPUT1_CONNECT_COMP2 +*\*\ - LPTIM_INPUT1_CONNECT_COMP3 +*\*\ - LPTIM_INPUT1_CONNECT_COMP4 +*\*\return none +**/ +void LPTIM_ConfigInput1(LPTIM_Module* LPTIMx, uint32_t ConnectSelect) +{ + MODIFY_REG(LPTIMx->OPT, LPTIM_OPT_OPT1, ConnectSelect); +} + +/** +*\*\name LPTIM_ConfigInput2. +*\*\fun Select the connection for Input2 of LPTIM. +*\*\param LPTIMx (The input parameters must be the following values): +*\*\ - LPTIM1 +*\*\ - LPTIM2 +*\*\ - LPTIM3 +*\*\ - LPTIM4 +*\*\ - LPTIM5 +*\*\param ConnectSelect (The input parameters must be the following values): +*\*\ - LPTIM_INPUT2_CONNECT_GPIO +*\*\ - LPTIM_INPUT2_CONNECT_COMP1 +*\*\ - LPTIM_INPUT2_CONNECT_COMP2 +*\*\ - LPTIM_INPUT2_CONNECT_COMP3 +*\*\ - LPTIM_INPUT2_CONNECT_COMP4 +*\*\return none +**/ +void LPTIM_ConfigInput2(LPTIM_Module* LPTIMx, uint32_t ConnectSelect) +{ + MODIFY_REG(LPTIMx->OPT, LPTIM_OPT_OPT2, ConnectSelect); +} + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lpuart.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lpuart.c new file mode 100644 index 0000000000..9e6e4b84aa --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_lpuart.c @@ -0,0 +1,675 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_lpuart.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_lpuart.h" +#include "n32h76x_78x_rcc.h" + + +/** +*\*\name LPUART_DeInit. +*\*\fun Deinitializes the LPUART peripheral registers to their default reset values +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\return none +*/ + +void LPUART_DeInit(LPUART_Module* LPUARTx) +{ + if (LPUARTx == LPUART1) + { + RCC_EnableRDPeriphReset1(RCC_RD_PERIPHRST_LPUART1); + } + else + { + if(LPUARTx == LPUART2) + { + RCC_EnableRDPeriphReset1(RCC_RD_PERIPHRST_LPUART2); + } + + } + +} + +/** +*\*\name LPUART_Init. +*\*\fun Initializes the LPUART peripheral according to the specified parameters in the LPUART_InitStruct. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param LPUART_InitStruct pointer to a LPUART_InitType structure +*\*\ that contains the configuration information for the specified LPUART peripheral . +*\*\return none +*/ + +void LPUART_Init(LPUART_Module* LPUARTx, LPUART_InitType* LPUART_InitStruct) +{ + uint32_t tmpregister = 0x00, clocksrc = 0x00, apbclock = 0x00; + uint32_t integerdivider = 0x00; + uint32_t fractionaldivider = 0x00; + uint32_t tmpdivider = 0x00, lastdivider = 0x00, i = 0x00; + uint32_t lpuartdiv = 0x00; + RCC_ClocksTypeDef RCC_ClocksStatus; + const uint8_t ApbPresTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + + /*---------------------------- LPUART BRCFG1 & 2 Configuration -----------------------*/ + /* Configure the LPUART Baud Rate -------------------------------------------*/ + + if (LPUARTx == LPUART1) + { + clocksrc = ((uint32_t)(RCC->RDSEL1 & RCC_RDSEL1_LPUART1SEL)); + } + else + { + if(LPUARTx == LPUART2) + { + clocksrc = ((uint32_t)(RCC->RDSEL1 & RCC_RDSEL1_LPUART2SEL)) << 4; + } + } + + if (clocksrc == RCC_LPUARTCLK_SRC_LSE) + { + apbclock = 0x8000; // 32.768kHz + } + else if (clocksrc == RCC_LPUARTCLK_SRC_HSI) + { + apbclock = HSI_VALUE; + } + else if (clocksrc == RCC_LPUARTCLK_SRC_MSI) + { + apbclock = MSI_VALUE; // 16MHz + } + else if (clocksrc == RCC_LPUARTCLK_SRC_SYSBUSDIV) + { + lpuartdiv = ((uint32_t)((RCC->RDDIV1 & RCC_RDDIV1_LPUARTDIV) >> 24)); + RCC_GetClocksFreqValue(&RCC_ClocksStatus); + apbclock = (RCC_ClocksStatus.SysBusDivClkFreq) >> (ApbPresTable[lpuartdiv]); + } + else //(clocksrc ==RCC_LPUARTCLK_SRC_HSE) + { + apbclock = HSE_VALUE; + } + + /* Determine the integer part */ + integerdivider = apbclock / (LPUART_InitStruct->BaudRate); + + /* Configure sampling method */ + if(integerdivider <= 10) + { + LPUART_ConfigSamplingMethod(LPUARTx, LPUART_SMPCNT_1B); + } + else + { + LPUART_ConfigSamplingMethod(LPUARTx, LPUART_SMPCNT_3B); + } + + /* Write to LPUART BRCFG1 */ + LPUARTx->BRCFG1 = (uint32_t)integerdivider; + + /* Determine the fractional part */ + fractionaldivider = ((apbclock % (LPUART_InitStruct->BaudRate)) * 10000) / (LPUART_InitStruct->BaudRate); + + tmpregister = 0x00; + tmpdivider = fractionaldivider; + + /* Implement the fractional part in the register */ + for( i = 0; i < 8; i++) + { + lastdivider = tmpdivider; + tmpdivider = lastdivider + fractionaldivider; + + if((tmpdivider / 10000) ^ (lastdivider / 10000)) + { + tmpregister |= (0x01 << i); + } + } + + /* Write to LPUART BRCFG2 */ + LPUARTx->BRCFG2 = (uint32_t)tmpregister; + + // /*---------------------------- LPUART CTRL Configuration -----------------------*/ + tmpregister = LPUARTx->CTRL; + /* Clear RXEN, TXEN, RTST[1:0], PC, RTSEN,CTSEN and PEN bits */ + tmpregister &= CTRL_CLR_MASK; + /* Configure the LPUART Parity, Mode, RtsThrehold and HardwareFlowControl ----------------------- */ + /* Set PC and PEN bits according to Parity value */ + /* Set the RXEN and TXEN bit according to Mode */ + /* Set RTST[1:0] bits according to RtsThrehold */ + /* Set RTSEN and CTSEN bits according to HardwareFlowControl */ + tmpregister |= (uint32_t)LPUART_InitStruct->Parity | LPUART_InitStruct->Mode | LPUART_InitStruct->RtsThreshold | LPUART_InitStruct->HardwareFlowControl; + /* Write to LPUART CTRL */ + LPUARTx->CTRL = (uint32_t)tmpregister; +} + +/** +*\*\name LPUART_StructInit. +*\*\fun Fills each LPUART_InitStruct member with its default value. +*\*\param LPUART_InitStruct pointer to a LPUART_InitType structure +*\*\ which will be initialized. +*\*\return none +*/ + +void LPUART_StructInit(LPUART_InitType* LPUART_InitStruct) +{ + /* LPUART_InitStruct members default value */ + LPUART_InitStruct->BaudRate = 9600; + LPUART_InitStruct->Parity = LPUART_PE_NO; + LPUART_InitStruct->Mode = LPUART_MODE_RX | LPUART_MODE_TX; + LPUART_InitStruct->RtsThreshold = LPUART_RTSTH_FIFOFU; + LPUART_InitStruct->HardwareFlowControl = LPUART_HFCTRL_NONE; +} + +/** +*\*\name LPUART_FlushRxFifo. +*\*\fun Flushes Receiver FIFO. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\return none +*/ + +void LPUART_FlushRxFifo(LPUART_Module* LPUARTx) +{ + /* Clear LPUART Flush Receiver FIFO */ + LPUARTx->CTRL |= LPUART_FLUSHRXF_ENABLE; + + while(LPUART_GetFlagStatus(LPUARTx, LPUART_FLAG_RXFIFO_NE) != RESET) + { + } + + LPUARTx->CTRL &= LPUART_FLUSHRXF_DISABLE; +} + +/** +*\*\name LPUART_FlushTxFifo. +*\*\fun Flushes transmit FIFO. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\return none +*/ +void LPUART_FlushTxFifo(LPUART_Module* LPUARTx) +{ + /* Clear LPUART Flush transmit FIFO */ + LPUARTx->CTRL |= LPUART_FLUSHTXF_ENABLE; + + while(LPUART_GetFlagStatus(LPUARTx, LPUART_FLAG_TXFIFO_NE) != RESET) + { + } + + LPUARTx->CTRL &= LPUART_FLUSHTXF_DISABLE; +} + +/** +*\*\name LPUART_ConfigInt. +*\*\fun Enables or disables the specified LPUART interrupts. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param LPUART_INT specifies the LPUART interrupt sources to be enabled or disabled. +*\*\ This parameter can be one of the following values: +*\*\ - LPUART_INT_TXFIFO_NE TX FIFO Non-Empty Interrupt +*\*\ - LPUART_INT_TXFIFO_HF TX FIFO Half Full Interrupt +*\*\ - LPUART_INT_TXFIFO_QF TX FIFO 1/4 Interrupt +*\*\ - LPUART_INT_TXFIFO_FU TX FIFO Full Interrupt Enable +*\*\ - LPUART_INT_TXFIFO_OV TX FIFO Overflow Interrupt +*\*\ - LPUART_INT_WUF Wake-Up Interrupt +*\*\ - LPUART_INT_RXFIFO_NE RX FIFO Non-Empty Interrupt +*\*\ - LPUART_INT_RXFIFO_HF RX FIFO Half Full Interrupt +*\*\ - LPUART_INT_RXFIFO_FU RX FIFO Full Interrupt Enable +*\*\ - LPUART_INT_RXFIFO_OV RX FIFO Overflow Interrupt +*\*\ - LPUART_INT_TXC TX Complete Interrupt +*\*\ - LPUART_INT_PE Parity Check Error Interrupt +*\*\ - LPUART_INT_IDLEF IDLE_FRAMEIE Interrupt +*\*\ - LPUART_INT_FE FRAME_ERROR Interrupt +*\*\ - LPUART_INT_TXFIFO_EM TX FIFO Empty Interrupt +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*/ + +void LPUART_ConfigInt(LPUART_Module* LPUARTx, uint32_t LPUART_INT, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + LPUARTx->INTEN |= LPUART_INT; + } + else + { + LPUARTx->INTEN &= (~LPUART_INT); + } +} + +/** +*\*\name LPUART_EnableDMA. +*\*\fun Enables or disables the LPUART's DMA interface. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param LPUART_DMAReq specifies the DMA request. +*\*\ This parameter can be one of the following values: +*\*\ - LPUART_DMAREQ_TX LPUART DMA transmit request +*\*\ - LPUART_DMAREQ_RX LPUART DMA receive request +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*/ + +void LPUART_EnableDMA(LPUART_Module* LPUARTx, uint32_t LPUART_DMAReq, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the DMA transfer by setting the DMA_RXEN and/or DMA_TXEN bits in the LPUART_CTRL register */ + LPUARTx->CTRL |= LPUART_DMAReq; + } + else + { + /* Disable the DMA transfer by clearing the DMA_RXEN and/or DMA_TXEN bits in the LPUART_CTRL register */ + LPUARTx->CTRL &= (uint32_t)(~LPUART_DMAReq); + } +} + +/** +*\*\name LPUART_ConfigWakeUpMethod. +*\*\fun Selects the LPUART WakeUp method. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param LPUART_WakeUpMethod specifies the LPUART wakeup method. +*\*\ This parameter can be one of the following values: +*\*\ - LPUART_WUSTP_STARTBIT WakeUp by Start Bit Detection +*\*\ - LPUART_WUSTP_RXNE WakeUp by RXNE Detection +*\*\ - LPUART_WUSTP_BYTE WakeUp by A Configurable Received Byte +*\*\ - LPUART_WUSTP_FRAME_2 WakeUp by A Programmed 2-Byte Frame +*\*\ - LPUART_WUSTP_FRAME_3 WakeUp by A Programmed 3-Byte Frame +*\*\ - LPUART_WUSTP_FRAME_4 WakeUp by A Programmed 4-Byte Frame +*\*\ - LPUART_WUSTP_FRAME_5 WakeUp by A Programmed 5-Byte Frame +*\*\ - LPUART_WUSTP_FRAME_6 WakeUp by A Programmed 6-Byte Frame +*\*\ - LPUART_WUSTP_FRAME_7 WakeUp by A Programmed 7-Byte Frame +*\*\ - LPUART_WUSTP_FRAME_8 WakeUp by A Programmed 8-Byte Frame +*\*\ - LPUART_WUSTP_FRAME_MANY WakeUp by A Programmed MANY-Byte Frame +*\*\return none +*/ + +void LPUART_ConfigWakeUpMethod(LPUART_Module* LPUARTx, uint32_t LPUART_WakeUpMethod) +{ + LPUARTx->CTRL &= CTRL_WUSTP_MASK; + LPUARTx->CTRL |= LPUART_WakeUpMethod; +} + +/** +*\*\name LPUART_EnableWakeUpStop. +*\*\fun Enables or disables LPUART Wakeup in STOP2 mode. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*/ +void LPUART_EnableWakeUpStop(LPUART_Module* LPUARTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable Wakeup in STOP2 mode by setting the WUSTP bit in the CTRL register */ + LPUARTx->CTRL |= LPUART_WUSTP_ON; + } + else + { + /* Disable Wakeup in STOP2 mode by clearing the WUSTP bit in the CTRL register */ + LPUARTx->CTRL &= (~LPUART_WUSTP_ON); + } +} + +/** +*\*\name LPUART_ConfigSamplingMethod. +*\*\fun Selects the LPUART Sampling method. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param LPUART_SamplingMethod specifies the LPAURT sampling method. +*\*\ This parameter can be one of the following values: +*\*\ - LPUART_SMPCNT_3B 3 Sample bit +*\*\ - LPUART_SMPCNT_1B 1 Sample bit +*\*\return none +*/ +void LPUART_ConfigSamplingMethod(LPUART_Module* LPUARTx, uint32_t LPUART_SamplingMethod) +{ + + LPUARTx->CTRL &= CTRL_SMPCNT_MASK; + LPUARTx->CTRL |= LPUART_SamplingMethod; +} + +/** +*\*\name LPUART_EnableLoopBack. +*\*\fun Enables or disables LPUART Loop Back Self-Test. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*/ +void LPUART_EnableLoopBack(LPUART_Module* LPUARTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable LPUART Loop Back Self-Test by setting the LOOKBACK bit in the CTRL register */ + LPUARTx->CTRL |= LPUART_LOOPBACK_ENABLE; + } + else + { + /* Disable LPUART Loop Back Self-Test by clearing the LOOKBACK bit in the CTRL register */ + LPUARTx->CTRL &= LPUART_LOOPBACK_DISABLE; + } +} + +/** +*\*\name LPUART_SendData. +*\*\fun Transmits single data through the LPUART peripheral. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param Data the data to transmit. +*\*\return none +*/ + +void LPUART_SendData(LPUART_Module* LPUARTx, uint8_t Data) +{ + /* Transmit Data */ + LPUARTx->TXDAT = (Data & (uint8_t)0xFF); +} + +/** +*\*\name LPUART_ReceiveData. +*\*\fun Returns the most recent received data by the LPUART peripheral. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\return The received data. +*/ + +uint8_t LPUART_ReceiveData(LPUART_Module* LPUARTx) +{ + /* Receive Data */ + return (uint8_t)(LPUARTx->RXDAT & (uint8_t)0xFF); +} + +/** +*\*\name LPUART_ConfigWakeUpData. +*\*\fun SConfigures LPUART detected byte or frame match for wakeup CPU from STOPS mode. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param LPUART_WakeUpData specifies the LPUART detected byte or frame match for wakeup CPU from STOP2 mode. +*\*\return none +*/ + +void LPUART_ConfigWakeUpData(LPUART_Module* LPUARTx, uint32_t LPUART_WakeUpData1, uint32_t LPUART_WakeUpData2) +{ + LPUARTx->WUDAT1 = LPUART_WakeUpData1; + LPUARTx->WUDAT2 = LPUART_WakeUpData2; +} + +/** +*\*\name LPUART_GetFlagStatus. +*\*\fun Checks whether the specified LPUART flag is set or not. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param LPUART_FLAG specifies the flag to check. +*\*\ This parameter can be one of the following values: +*\*\ - LPUART_FLAG_PEF Parity Check Error Flag. +*\*\ - LPUART_FLAG_TXC TX Complete Flag. +*\*\ - LPUART_FLAG_RXFIFO_OV RX FIFO Overflow Flag. +*\*\ - LPUART_FLAG_RXFIFO_FU RX FIFO Full Flag. +*\*\ - LPUART_FLAG_RXFIFO_HF RX FIFO Half Full Flag. +*\*\ - LPUART_FLAG_RXFIFO_NE RX FIFO Non-Empty Flag. +*\*\ - LPUART_FLAG_CTS CTS Change(Hardware Flow Control) Flag. +*\*\ - LPUART_FLAG_WUF from STOP2 mode Flag. +*\*\ - LPUART_FLAG_NEF Noise Detection Flag. +*\*\ - LPUART_FLAG_TXFIFO_OV TX FIFO Overflow Flag. +*\*\ - LPUART_FLAG_TXFIFO_FU TX FIFO Full Flag. +*\*\ - LPUART_FLAG_TXFIFO_QF TX FIFO 1/4 Full Flag. +*\*\ - LPUART_FLAG_TXFIFO_HF TX FIFO Half Full Flag. +*\*\ - LPUART_FLAG_TXFIFO_NE TX FIFO Non-Empty Flag. +*\*\ - LPUART_FLAG_IDLEF IDLE frame detected. +*\*\ - LPUART_FLAG_FRAME_ER frame error detected. +*\*\ - LPUART_FLAG_TXFIFO_EM TX FIFO Empty Flag. +*\*\return bitstatus +*\*\ - SET +*\*\ - RESET +*/ + +FlagStatus LPUART_GetFlagStatus(LPUART_Module* LPUARTx, uint32_t LPUART_FLAG) +{ + FlagStatus bitstatus = RESET; + + if ((LPUARTx->STS & LPUART_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name LPUART_ClrFlag. +*\*\fun Clears the LPUART's pending flags. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param LPUART_FLAG specifies the flag to clear. +*\*\ This parameter can be one of the following values: +*\*\ - LPUART_FLAG_PEF Parity Check Error Flag. +*\*\ - LPUART_FLAG_TXC TX Complete Flag. +*\*\ - LPUART_FLAG_RXFIFO_OV RX FIFO Overflow Flag. +*\*\ - LPUART_FLAG_RXFIFO_FU RX FIFO Full Flag. +*\*\ - LPUART_FLAG_RXFIFO_HF RX FIFO Half Full Flag. +*\*\ - LPUART_FLAG_RXFIFO_NE RX FIFO Non-Empty Flag. +*\*\ - LPUART_FLAG_WUF from STOP2 mode Flag. +*\*\ - LPUART_FLAG_NEF Noise Detection Flag. +*\*\ - LPUART_FLAG_TXFIFO_OV TX FIFO Overflow Flag. +*\*\ - LPUART_FLAG_TXFIFO_FU TX FIFO Full Flag. +*\*\ - LPUART_FLAG_TXFIFO_QF TX FIFO 1/4 Full Flag. +*\*\ - LPUART_FLAG_TXFIFO_HF TX FIFO Half Full Flag. +*\*\ - LPUART_FLAG_TXFIFO_NE TX FIFO Non-Empty Flag. +*\*\ - LPUART_FLAG_IDLEF IDLE frame detected. +*\*\ - LPUART_FLAG_FRAME_ER frame error detected. +*\*\return none +*/ +void LPUART_ClrFlag(LPUART_Module* LPUARTx, uint32_t LPUART_FLAG) +{ + LPUARTx->STS = (uint32_t)LPUART_FLAG; +} + +/** +*\*\name LPUART_GetIntStatus. +*\*\fun Checks whether the specified LPUART interrupt has set or not. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param LPUART_INT (The input parameters must be the following values): +*\*\ - LPUART_INT_TXFIFO_NE TX FIFO Non-Empty Interrupt +*\*\ - LPUART_INT_TXFIFO_HF TX FIFO Half Full Interrupt +*\*\ - LPUART_INT_TXFIFO_QF TX FIFO 1/4 Interrupt +*\*\ - LPUART_INT_TXFIFO_FU TX FIFO Full Interrupt Enable +*\*\ - LPUART_INT_TXFIFO_OV TX FIFO Overflow Interrupt +*\*\ - LPUART_INT_WUF Wake-Up Interrupt +*\*\ - LPUART_INT_RXFIFO_NE RX FIFO Non-Empty Interrupt +*\*\ - LPUART_INT_RXFIFO_HF RX FIFO Half Full Interrupt +*\*\ - LPUART_INT_RXFIFO_FU RX FIFO Full Interrupt Enable +*\*\ - LPUART_INT_RXFIFO_OV RX FIFO Overflow Interrupt +*\*\ - LPUART_INT_TXC TX Complete Interrupt +*\*\ - LPUART_INT_PE Parity Check Error Interrupt +*\*\ - LPUART_INT_IDLEF IDLE_FRAMEIE Interrupt +*\*\ - LPUART_INT_FE FRAME_ERROR Interrupt +*\*\ - LPUART_INT_TXFIFO_EM TX FIFO Empty Interrupt +*\*\return bitstatus +*\*\ - SET +*\*\ - RESET +*/ + +INTStatus LPUART_GetIntStatus(LPUART_Module* LPUARTx, uint32_t LPUART_INT) +{ + uint32_t itmask = 0x00; + INTStatus bitstatus = RESET; + + /* Get the interrupt position */ + itmask = LPUART_INT & LPUART_INT_MASK; + itmask &= LPUARTx->INTEN; + + if (itmask != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name LPUART_ClrIntPendingBit. +*\*\fun Clears the LPUART's interrupt pending bits. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param LPUART_INT (The input parameters must be the following values): +*\*\ - LPUART_INT_TXFIFO_NE TX FIFO Non-Empty Interrupt +*\*\ - LPUART_INT_TXFIFO_HF TX FIFO Half Full Interrupt +*\*\ - LPUART_INT_TXFIFO_QF TX FIFO 1/4 Interrupt +*\*\ - LPUART_INT_TXFIFO_FU TX FIFO Full Interrupt Enable +*\*\ - LPUART_INT_TXFIFO_OV TX FIFO Overflow Interrupt +*\*\ - LPUART_INT_WUF Wake-Up Interrupt +*\*\ - LPUART_INT_RXFIFO_NE RX FIFO Non-Empty Interrupt +*\*\ - LPUART_INT_RXFIFO_HF RX FIFO Half Full Interrupt +*\*\ - LPUART_INT_RXFIFO_FU RX FIFO Full Interrupt Enable +*\*\ - LPUART_INT_RXFIFO_OV RX FIFO Overflow Interrupt +*\*\ - LPUART_INT_TXC TX Complete Interrupt +*\*\ - LPUART_INT_PE Parity Check Error Interrupt +*\*\ - LPUART_INT_IDLEF IDLE_FRAMEIE Interrupt +*\*\ - LPUART_INT_FE FRAME_ERROR Interrupt +*\*\ - LPUART_INT_TXFIFO_EM TX FIFO Empty Interrupt +*\*\return none +*/ + +void LPUART_ClrIntPendingBit(LPUART_Module* LPUARTx, uint32_t LPUART_INT) +{ + uint32_t itmask = 0x00; + + itmask = LPUART_INT & LPUART_INT_MASK; + + if(LPUART_INT == LPUART_INT_WUF) + { + itmask = (itmask << 0x01); + } + else if (LPUART_INT > LPUART_INT_WUF) + { + itmask = (itmask << 0x02); + } + + LPUARTx->STS = itmask; +} + +/** +*\*\name LPUART_IdleFrameSet. +*\*\fun Idle frame controllable enable or disable. +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*/ +void LPUART_IdleFrameSet(LPUART_Module* LPUARTx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + LPUARTx->CTRL |= LPUART_IDLEF_ENABLE; + } + else + { + LPUARTx->CTRL &= LPUART_IDLEF_DISABLE; + } +} + +/** +*\*\name LPUART_ConfigRXByte. +*\*\fun A configuration byte can be configured to receive how many bytes of data to wake +*\*\param LPUARTx (The input parameters must be the following values): +*\*\ - LPUART1 +*\*\ - LPUART2 +*\*\param Cmd:LPUART_RXNUMWU +*\*\return none +*/ + +void LPUART_ConfigRXByte(LPUART_Module* LPUARTx, uint8_t LPUART_RXNUMWU) +{ + uint32_t tmp = 0x00; + tmp = ((uint32_t)(LPUART_RXNUMWU & 0x1F)) << 19; + LPUARTx->CTRL |= tmp; +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_mdma.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_mdma.c new file mode 100644 index 0000000000..287ae865e5 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_mdma.c @@ -0,0 +1,1289 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_mdma.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_mdma.h" + + +/** +*\*\name MDMA_ControllerCmd. +*\*\fun Enable or disable MDMA Controller peripheral. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void MDMA_ControllerCmd(MDMA_Module *const MDMAy, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MDMA Controller */ + SET_BIT(MDMAy->CFG, MDMA_CFG_EN); + } + else + { + /* Disable the MDMA Controller */ + CLEAR_BIT(MDMAy->CFG, MDMA_CFG_EN); + } +} + +/** +*\*\name MDMA_ControllerIsEnabled. +*\*\fun Check MDMA Controller peripheral is enabled. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\return true or false +**/ +bool MDMA_ControllerIsEnabled(MDMA_Module *const MDMAy) +{ + bool ret; + ret = READ_BIT(MDMAy->CFG, MDMA_CFG_EN) ? true : false; + return ret; +} + +/** +*\*\name MDMA_ControllerSoftReset. +*\*\fun Software Reset MDMA Controller. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\return none +**/ +void MDMA_ControllerSoftReset(MDMA_Module *const MDMAy) +{ + /* Sets MDMA reset request bit */ + SET_BIT(MDMAy->SWRST, MDMA_SWRST_RSTREQ); + + /* Wait until reset request bit is 0 */ + while ((READ_BIT(MDMAy->SWRST, MDMA_SWRST_RSTREQ))) + { + /* Wait for reset to complete */ + } +} + +/** +*\*\name MDMA_ChannelCmd. +*\*\fun Enable or disable a MDMA channel. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void MDMA_ChannelCmd(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MDMA channel */ + WRITE_REG(MDMAy->CHEN, (MDMA_CH_ENABLE << ChNum)); + } + else + { + /* Disable the MDMA channel */ + WRITE_REG(MDMAy->CHEN, (MDMA_CH_DISABLE << ChNum)); + + while (READ_BIT((uint16_t)MDMAy->CHEN, ((uint16_t)0x1U << ChNum)) != 0U) + { + /* Wait until channel is disabled */ + } + } +} + +/** +*\*\name MDMA_ChannelIsEnabled. +*\*\fun Check whether a MDMA channel enabled. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\return true or false +**/ +bool MDMA_ChannelIsEnabled(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum) +{ + bool ret; + ret = READ_BIT((uint16_t)MDMAy->CHEN, ((uint16_t)0x1U << ChNum)) ? true : false; + return ret; +} + +/** +*\*\name MDMA_ChannelInit. +*\*\fun Initialize a MDMA channel with provided channel configuration +*\*\ The function sets up the following channel configuration parameters for +*\*\ a MDMA channel specified paramters like: +*\*\ Source and Destination addresses ( and linked list address if required) +*\*\ Source and Destination handshake method as software/hardware selection +*\*\ and transfer flow and transfer type +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param MDMA_ChInitParam : +*\*\ - Pointer to the MDMA_ChInitType structure which will be initialized. +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\return One of MDMA_ChStatusType. +**/ +MDMA_ChStatusType MDMA_ChannelInit(MDMA_Module *const MDMAy, MDMA_ChInitType *const MDMA_ChInitParam, MDMA_ChNumType ChNum) +{ + uint32_t TempValue; + MDMA_ChStatusType RetStatus; + + /* Check whether the specified MDMA controller is enabled */ + if (MDMA_ControllerIsEnabled(MDMAy) == ENABLE) + { + /* Checks whether the specified MDMA channel is disabled */ + if (MDMA_ChannelIsEnabled(MDMAy, ChNum) == DISABLE) + { + /* Sets channel n source multi-block transfer type */ + MODIFY_REG(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_SMBTT, ((uint64_t)MDMA_ChInitParam->SrcMultBlkTfrType << 0x00U)); + /* Sets channel n destination multi-block transfer type */ + MODIFY_REG(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_DMBTT, ((uint64_t)MDMA_ChInitParam->DstMultBlkTfrType << 0x02U)); + + /* Sets channel n transfer type and flow control */ + MODIFY_REG(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_TTFC, ((uint64_t)MDMA_ChInitParam->TfrTypeFlowCtrl << 0x20U)); + /* Sets channel n priority */ + MODIFY_REG(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_CHPRIOR, ((uint64_t)MDMA_ChInitParam->ChannelPriority << 0x2FU)); + + /* Configure source handshaking hardware mode */ + if (MDMA_ChInitParam->SrcHandshaking == MDMA_CH_SRC_HANDSHAKING_HARDWARE) + { + TempValue = ((uint32_t)MDMA_ChInitParam->SrcHsInterface & 0xFU); + /* Select hardware handshake I/F [0-15] */ + MODIFY_REG(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_SRCPER, ((uint64_t)TempValue << 0x4U)); + + /* Sets source hardware handshaking interface polarity */ + MODIFY_REG(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_SRCHHIPOL, ((uint64_t)MDMA_ChInitParam->SrcHsInterfacePol << 0x25U)); + + /* Enable hardware handshake to source peripheral */ + CLEAR_BIT(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_HSSELSRC); + } + + /* Configure destination handshaking hardware mode */ + if (MDMA_ChInitParam->DstHandshaking == MDMA_CH_DST_HANDSHAKING_HARDWARE) + { + TempValue = ((uint32_t)MDMA_ChInitParam->DstHsInterface & 0xFU); + /* Select hardware handshake I/F [0-15] */ + MODIFY_REG(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_DSTPER, ((uint64_t)TempValue << 0xBU)); + + /* Sets destination hardware handshaking interface polarity */ + MODIFY_REG(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_DSTHHIPOL, ((uint64_t)MDMA_ChInitParam->DstHsInterfacePol << 0x26U)); + + /* Enable hardware handshake to destionation peripheral */ + CLEAR_BIT(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_HSSELDST); + } + + /* Sets channel n source address register */ + WRITE_REG(MDMAy->CH[ChNum].SA, MDMA_ChInitParam->SrcAddr); + /* Sets channel n destination address register */ + WRITE_REG(MDMAy->CH[ChNum].DA, MDMA_ChInitParam->DstAddr); + /* Sets channel n linked list pointer register */ + WRITE_REG(MDMAy->CH[ChNum].LLP, (uint32_t)MDMA_ChInitParam->pLinkListItem); + /* Sets channel n block transfer size register */ + WRITE_REG(MDMAy->CH[ChNum].BTS, MDMA_ChInitParam->BlkSize); + /* Sets channel n control register */ + WRITE_REG(MDMAy->CH[ChNum].CTRL, MDMA_ChInitParam->ChCtrl); + + /* Clear the MDMA all common register interrupt status */ + WRITE_REG(MDMAy->CRINTCLR, MDMA_COMMON_INT_CLEAR); + /* Clear the all interrupt status for the specified MDMA channel */ + WRITE_REG(MDMAy->CH[ChNum].INTCLR, MDMA_CH_INT_CLEAR); + + /* Disable common register interrupt status */ + CLEAR_BIT(MDMAy->CRINTSTSEN, MDMA_COMMON_INT_STS_MASK); + /* Disable common register interrupt signal */ + CLEAR_BIT(MDMAy->CRINTSGLEN, MDMA_COMMON_INT_SGL_MASK); + /* Disable Channel n interrupt status */ + CLEAR_BIT(MDMAy->CH[ChNum].INTSTSEN, MDMA_CH_INT_STS_MASK); + /* Disable Channel n interrupt signal */ + CLEAR_BIT(MDMAy->CH[ChNum].INTSGLEN, MDMA_CH_INT_SGL_MASK); + + RetStatus = MDMA_CH_STS_OK; + } + else + { + RetStatus = MDMA_CH_STS_BUSY; + } + } + else + { + RetStatus = MDMA_CH_STS_ERROR; + } + + return RetStatus; +} + +/** +*\*\name MDMA_ChannelStructInit. +*\*\fun Initializes the structure parameter of type MDMA_ChInitType used to +*\*\ initialize MDMA. This function is usually called before initializing +*\*\ a parameter of type MDMA_ChInitType. +*\*\param MDMA_ChInitParam : +*\*\ - Pointer to the MDMA_ChInitType structure which will be initialized. +*\*\return none +**/ +void MDMA_ChannelStructInit(MDMA_ChInitType *const MDMA_ChInitParam) +{ + MDMA_ChInitParam->SrcMasterSel = MDMA_CH_MASTER_1; + MDMA_ChInitParam->DstMasterSel = MDMA_CH_MASTER_1; + MDMA_ChInitParam->SrcAddrInc = MDMA_CH_ADDRESS_COUNT_MODE_INCREMENT; + MDMA_ChInitParam->DstAddrInc = MDMA_CH_ADDRESS_COUNT_MODE_INCREMENT; + MDMA_ChInitParam->SrcTfrWidth = MDMA_CH_TRANSFER_WIDTH_32; + MDMA_ChInitParam->DstTfrWidth = MDMA_CH_TRANSFER_WIDTH_32; + MDMA_ChInitParam->SrcBurstTranLen = MDMA_CH_BURST_TRAN_LEN_1; + MDMA_ChInitParam->DstBurstTranLen = MDMA_CH_BURST_TRAN_LEN_1; + MDMA_ChInitParam->NonPosLastWriteEn = false; + MDMA_ChInitParam->SrcBurstLenEn = false; + MDMA_ChInitParam->SrcBurstLen = 0x0U; + MDMA_ChInitParam->DstBurstLenEn = false; + MDMA_ChInitParam->DstBurstLen = 0x0U; + MDMA_ChInitParam->IocBlkTfr = false; + MDMA_ChInitParam->SdwLlILast = false; + MDMA_ChInitParam->SdwLlIValid = false; + + MDMA_ChInitParam->SrcAddr = 0x0U; + MDMA_ChInitParam->DstAddr = 0x0U; + MDMA_ChInitParam->pLinkListItem = NULL; + MDMA_ChInitParam->BlkSize = 0x0U; + + MDMA_ChInitParam->ChannelPriority = MDMA_CH_PRIORITY_15; + MDMA_ChInitParam->SrcHandshaking = MDMA_CH_SRC_HANDSHAKING_SOFTWARE; + MDMA_ChInitParam->SrcHsInterface = MDMA_CH_HARDWARE_HANDSHAKING_IF_0; + MDMA_ChInitParam->SrcHsInterfacePol = MDMA_CH_HARDWARE_HANDSHAKING_IF_POL_H; + MDMA_ChInitParam->DstHandshaking = MDMA_CH_DST_HANDSHAKING_SOFTWARE; + MDMA_ChInitParam->DstHsInterface = MDMA_CH_HARDWARE_HANDSHAKING_IF_0; + MDMA_ChInitParam->DstHsInterfacePol = MDMA_CH_HARDWARE_HANDSHAKING_IF_POL_H; + + MDMA_ChInitParam->TfrTypeFlowCtrl = MDMA_CH_TRANSFER_FLOW_P2P_MDMA; + MDMA_ChInitParam->SrcMultBlkTfrType = MDMA_CH_MULTI_BLOCK_CONTIGUOUS; + MDMA_ChInitParam->DstMultBlkTfrType = MDMA_CH_MULTI_BLOCK_CONTIGUOUS; +} + +/** +*\*\name MDMA_ChannelSuspend. +*\*\fun Suspend a MDMA channel. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\return none +**/ +void MDMA_ChannelSuspend(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum) +{ + /* Suspend the MDMA channel */ + WRITE_REG(MDMAy->CHSUSP, (MDMA_CH_SUSPEND << ChNum)); +} + +/** +*\*\name MDMA_ChannelIsSuspended. +*\*\fun Check whether a MDMA channel suspended. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\return true or false +**/ +bool MDMA_ChannelIsSuspended(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum) +{ + bool ret; + ret = READ_BIT((uint16_t)MDMAy->CHSUSP, ((uint16_t)0x1U << ChNum)) ? true : false; + return ret; +} + +/** +*\*\name MDMA_ChannelResume. +*\*\fun Resume a MDMA channel. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\return none +**/ +void MDMA_ChannelResume(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum) +{ + /* Resume the MDMA channel */ + WRITE_REG(MDMAy->CHSUSP, (MDMA_CH_RESUME << ChNum)); +} + +/** +*\*\name MDMA_GlobalInterruptCmd. +*\*\fun Enable or disable MDMA globally interrupt. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void MDMA_GlobalInterruptCmd(MDMA_Module *const MDMAy, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MDMA global interrupt */ + SET_BIT(MDMAy->CFG, MDMA_CFG_GLBINTEN); + } + else + { + /* Disable the MDMA global interrupt */ + CLEAR_BIT(MDMAy->CFG, MDMA_CFG_GLBINTEN); + } +} + +/** +*\*\name MDMA_CommonInterruptStatusCmd. +*\*\fun Enable or disable MDMA common register interrupt status. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param Interrupt (The input parameter must be one or more of the following values (logical OR)): +*\*\ - MDMA_COMMON_INT_SIURDEI +*\*\ - MDMA_COMMON_INT_SICRWOHEI +*\*\ - MDMA_COMMON_INT_SICRR2WOEI +*\*\ - MDMA_COMMON_INT_SICRW2ROEI +*\*\ - MDMA_COMMON_INT_SICRDEI +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void MDMA_CommonInterruptStatusCmd(MDMA_Module *const MDMAy, uint32_t Interrupt, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MDMA corresponding common register interrupt status */ + SET_BIT(MDMAy->CRINTSTSEN, Interrupt); + } + else + { + /* Disable the MDMA corresponding common register interrupt status */ + CLEAR_BIT(MDMAy->CRINTSTSEN, Interrupt); + } +} + +/** +*\*\name MDMA_CommonInterruptSignalCmd. +*\*\fun Enable or disable MDMA common register interrupt signal. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param Interrupt (The input parameter must be one or more of the following values (logical OR)): +*\*\ - MDMA_COMMON_INT_SIURDEI +*\*\ - MDMA_COMMON_INT_SICRWOHEI +*\*\ - MDMA_COMMON_INT_SICRR2WOEI +*\*\ - MDMA_COMMON_INT_SICRW2ROEI +*\*\ - MDMA_COMMON_INT_SICRDEI +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void MDMA_CommonInterruptSignalCmd(MDMA_Module *const MDMAy, uint32_t Interrupt, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the MDMA corresponding common register interrupt signal */ + SET_BIT(MDMAy->CRINTSGLEN, Interrupt); + } + else + { + /* Disable the MDMA corresponding common register interrupt signal */ + CLEAR_BIT(MDMAy->CRINTSGLEN, Interrupt); + } +} + +/** +*\*\name MDMA_ClearCommonInterruptStatus. +*\*\fun Clear MDMA common register interrupt status. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param Interrupt (The input parameter must be one or more of the following values (logical OR)): +*\*\ - MDMA_COMMON_INT_SIURDEI +*\*\ - MDMA_COMMON_INT_SICRWOHEI +*\*\ - MDMA_COMMON_INT_SICRR2WOEI +*\*\ - MDMA_COMMON_INT_SICRW2ROEI +*\*\ - MDMA_COMMON_INT_SICRDEI +*\*\return none +**/ +void MDMA_ClearCommonInterruptStatus(MDMA_Module *const MDMAy, uint32_t Interrupt) +{ + /* Clear the MDMA corresponding common register interrupt status */ + WRITE_REG(MDMAy->CRINTCLR, Interrupt); +} + +/** +*\*\name MDMA_GetCombinedStatus. +*\*\fun Get the MDMA combined interrupt status. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\return MDMA_INTSTS register value +**/ +uint64_t MDMA_GetCombinedStatus(MDMA_Module *const MDMAy) +{ + return (uint64_t)(READ_REG(MDMAy->INTSTS) & 0x10000FFFFUL); +} + +/** +*\*\name MDMA_GetCommonInterruptStatus. +*\*\fun Get MDMA common register interrupt status. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param Interrupt (The input parameters must be the following values): +*\*\ - MDMA_COMMON_INT_SIURDEI +*\*\ - MDMA_COMMON_INT_SICRWOHEI +*\*\ - MDMA_COMMON_INT_SICRR2WOEI +*\*\ - MDMA_COMMON_INT_SICRW2ROEI +*\*\ - MDMA_COMMON_INT_SICRDEI +*\*\return SET or RESET +**/ +INTStatus MDMA_GetCommonInterruptStatus(MDMA_Module *const MDMAy, uint32_t Interrupt) +{ + INTStatus RetStatus = RESET; + + /* Read the status of the corresponding interrupt */ + if (READ_BIT(MDMAy->CRINTSTS, Interrupt) != (uint32_t)RESET) + { + /* This status of the interrupt is SET */ + RetStatus = SET; + } + else + { + /* This status of the interrupt is RESET */ + RetStatus = RESET; + } + + /* Return status */ + return RetStatus; +} + +/** +*\*\name MDMA_ChannelInterruptStatusCmd. +*\*\fun Enable or disable a MDMA channel interrupt status. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Interrupt (The input parameter must be one or more of the following values (logical OR)): +*\*\ - MDMA_CH_INT_CH_ABORTED +*\*\ - MDMA_CH_INT_CH_DISABLED +*\*\ - MDMA_CH_INT_CH_SUSPENDED +*\*\ - MDMA_CH_INT_CH_SRC_SUSPENDED +*\*\ - MDMA_CH_INT_CH_LOCK_CLEARED +*\*\ - MDMA_CH_INT_SLV_IF_W_ON_HOLD_ERR +*\*\ - MDMA_CH_INT_SLV_IF_W_ON_CH_EN_ERR +*\*\ - MDMA_CH_INT_SLV_IF_R2WO_ERR +*\*\ - MDMA_CH_INT_SLV_IF_W2RO_ERR +*\*\ - MDMA_CH_INT_SLV_IF_DEC_ERR +*\*\ - MDMA_CH_INT_SLV_IF_MULTI_BLK_TYPE_ERR +*\*\ - MDMA_CH_INT_SDW_REG_LLI_INVALID_ERR +*\*\ - MDMA_CH_INT_LLI_W_SLV_ERR +*\*\ - MDMA_CH_INT_LLI_R_SLV_ERR +*\*\ - MDMA_CH_INT_LLI_W_DEC_ERR +*\*\ - MDMA_CH_INT_LLI_R_DEC_ERR +*\*\ - MDMA_CH_INT_DST_SLV_ERR +*\*\ - MDMA_CH_INT_SRC_SLV_ERR +*\*\ - MDMA_CH_INT_DST_DEC_ERR +*\*\ - MDMA_CH_INT_SRC_DEC_ERR +*\*\ - MDMA_CH_INT_DST_TRAN_COMPLE +*\*\ - MDMA_CH_INT_SRC_TRAN_COMPLE +*\*\ - MDMA_CH_INT_DMA_TRF_DONE +*\*\ - MDMA_CH_INT_BLK_TRF_DONE +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void MDMA_ChannelInterruptStatusCmd(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint32_t Interrupt, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the corresponding interrupt status for the specified MDMA channel */ + SET_BIT(MDMAy->CH[ChNum].INTSTSEN, Interrupt); + } + else + { + /* Disable the corresponding interrupt status for the specified MDMA channel */ + CLEAR_BIT(MDMAy->CH[ChNum].INTSTSEN, Interrupt); + } +} + +/** +*\*\name MDMA_ChannelInterruptSignalCmd. +*\*\fun Enable or disable a MDMA channel interrupt signal. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Interrupt (The input parameter must be one or more of the following values (logical OR)): +*\*\ - MDMA_CH_INT_CH_ABORTED +*\*\ - MDMA_CH_INT_CH_DISABLED +*\*\ - MDMA_CH_INT_CH_SUSPENDED +*\*\ - MDMA_CH_INT_CH_SRC_SUSPENDED +*\*\ - MDMA_CH_INT_CH_LOCK_CLEARED +*\*\ - MDMA_CH_INT_SLV_IF_W_ON_HOLD_ERR +*\*\ - MDMA_CH_INT_SLV_IF_W_ON_CH_EN_ERR +*\*\ - MDMA_CH_INT_SLV_IF_R2WO_ERR +*\*\ - MDMA_CH_INT_SLV_IF_W2RO_ERR +*\*\ - MDMA_CH_INT_SLV_IF_DEC_ERR +*\*\ - MDMA_CH_INT_SLV_IF_MULTI_BLK_TYPE_ERR +*\*\ - MDMA_CH_INT_SDW_REG_LLI_INVALID_ERR +*\*\ - MDMA_CH_INT_LLI_W_SLV_ERR +*\*\ - MDMA_CH_INT_LLI_R_SLV_ERR +*\*\ - MDMA_CH_INT_LLI_W_DEC_ERR +*\*\ - MDMA_CH_INT_LLI_R_DEC_ERR +*\*\ - MDMA_CH_INT_DST_SLV_ERR +*\*\ - MDMA_CH_INT_SRC_SLV_ERR +*\*\ - MDMA_CH_INT_DST_DEC_ERR +*\*\ - MDMA_CH_INT_SRC_DEC_ERR +*\*\ - MDMA_CH_INT_DST_TRAN_COMPLE +*\*\ - MDMA_CH_INT_SRC_TRAN_COMPLE +*\*\ - MDMA_CH_INT_DMA_TRF_DONE +*\*\ - MDMA_CH_INT_BLK_TRF_DONE +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void MDMA_ChannelInterruptSignalCmd(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint32_t Interrupt, FunctionalStatus Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the corresponding interrupt signal for the specified MDMA channel */ + SET_BIT(MDMAy->CH[ChNum].INTSGLEN, Interrupt); + } + else + { + /* Disable the corresponding interrupt signal for the specified MDMA channel */ + CLEAR_BIT(MDMAy->CH[ChNum].INTSGLEN, Interrupt); + } +} + +/** +*\*\name MDMA_ClearChannelInterruptStatus. +*\*\fun Clear MDMA Channel interrupt status. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Interrupt (The input parameter must be one or more of the following values (logical OR)): +*\*\ - MDMA_CH_INT_CH_ABORTED +*\*\ - MDMA_CH_INT_CH_DISABLED +*\*\ - MDMA_CH_INT_CH_SUSPENDED +*\*\ - MDMA_CH_INT_CH_SRC_SUSPENDED +*\*\ - MDMA_CH_INT_CH_LOCK_CLEARED +*\*\ - MDMA_CH_INT_SLV_IF_W_ON_HOLD_ERR +*\*\ - MDMA_CH_INT_SLV_IF_W_ON_CH_EN_ERR +*\*\ - MDMA_CH_INT_SLV_IF_R2WO_ERR +*\*\ - MDMA_CH_INT_SLV_IF_W2RO_ERR +*\*\ - MDMA_CH_INT_SLV_IF_DEC_ERR +*\*\ - MDMA_CH_INT_SLV_IF_MULTI_BLK_TYPE_ERR +*\*\ - MDMA_CH_INT_SDW_REG_LLI_INVALID_ERR +*\*\ - MDMA_CH_INT_LLI_W_SLV_ERR +*\*\ - MDMA_CH_INT_LLI_R_SLV_ERR +*\*\ - MDMA_CH_INT_LLI_W_DEC_ERR +*\*\ - MDMA_CH_INT_LLI_R_DEC_ERR +*\*\ - MDMA_CH_INT_DST_SLV_ERR +*\*\ - MDMA_CH_INT_SRC_SLV_ERR +*\*\ - MDMA_CH_INT_DST_DEC_ERR +*\*\ - MDMA_CH_INT_SRC_DEC_ERR +*\*\ - MDMA_CH_INT_DST_TRAN_COMPLE +*\*\ - MDMA_CH_INT_SRC_TRAN_COMPLE +*\*\ - MDMA_CH_INT_DMA_TRF_DONE +*\*\ - MDMA_CH_INT_BLK_TRF_DONE +*\*\return none +**/ +void MDMA_ClearChannelInterruptStatus(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint32_t Interrupt) +{ + /* Clear the corresponding interrupt for the specified MDMA channel */ + WRITE_REG(MDMAy->CH[ChNum].INTCLR, Interrupt); +} + +/** +*\*\name MDMA_GetChannelInterruptStatus. +*\*\fun Get MDMA Channel interrupt status. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Interrupt (The input parameters must be the following values): +*\*\ - MDMA_CH_INT_CH_ABORTED +*\*\ - MDMA_CH_INT_CH_DISABLED +*\*\ - MDMA_CH_INT_CH_SUSPENDED +*\*\ - MDMA_CH_INT_CH_SRC_SUSPENDED +*\*\ - MDMA_CH_INT_CH_LOCK_CLEARED +*\*\ - MDMA_CH_INT_SLV_IF_W_ON_HOLD_ERR +*\*\ - MDMA_CH_INT_SLV_IF_W_ON_CH_EN_ERR +*\*\ - MDMA_CH_INT_SLV_IF_R2WO_ERR +*\*\ - MDMA_CH_INT_SLV_IF_W2RO_ERR +*\*\ - MDMA_CH_INT_SLV_IF_DEC_ERR +*\*\ - MDMA_CH_INT_SLV_IF_MULTI_BLK_TYPE_ERR +*\*\ - MDMA_CH_INT_SDW_REG_LLI_INVALID_ERR +*\*\ - MDMA_CH_INT_LLI_W_SLV_ERR +*\*\ - MDMA_CH_INT_LLI_R_SLV_ERR +*\*\ - MDMA_CH_INT_LLI_W_DEC_ERR +*\*\ - MDMA_CH_INT_LLI_R_DEC_ERR +*\*\ - MDMA_CH_INT_DST_SLV_ERR +*\*\ - MDMA_CH_INT_SRC_SLV_ERR +*\*\ - MDMA_CH_INT_DST_DEC_ERR +*\*\ - MDMA_CH_INT_SRC_DEC_ERR +*\*\ - MDMA_CH_INT_DST_TRAN_COMPLE +*\*\ - MDMA_CH_INT_SRC_TRAN_COMPLE +*\*\ - MDMA_CH_INT_DMA_TRF_DONE +*\*\ - MDMA_CH_INT_BLK_TRF_DONE +*\*\return SET or RESET +**/ +INTStatus MDMA_GetChannelInterruptStatus(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint32_t Interrupt) +{ + INTStatus RetStatus = RESET; + + /* Read the status of the corresponding interrupt */ + if (READ_BIT(MDMAy->CH[ChNum].INTSTS, Interrupt) != (uint32_t)RESET) + { + /* This status of the interrupt is SET */ + RetStatus = SET; + } + else + { + /* This status of the interrupt is RESET */ + RetStatus = RESET; + } + + /* Return status */ + return RetStatus; +} + +/** +*\*\name MDMA_SetChannelSourceAddress. +*\*\fun Sets the source address of the specified channel. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Addr: +*\*\ - Source address +*\*\return none +**/ +void MDMA_SetChannelSourceAddress(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint64_t Addr) +{ + WRITE_REG(MDMAy->CH[ChNum].SA, Addr); +} + +/** +*\*\name MDMA_SetChannelDestinationAddress. +*\*\fun Sets the destination address of the specified channel. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Addr: +*\*\ - Destination address +*\*\return none +**/ +void MDMA_SetChannelDestinationAddress(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint64_t Addr) +{ + WRITE_REG(MDMAy->CH[ChNum].DA, Addr); +} + +/** +*\*\name MDMA_SetChannelBlockSize. +*\*\fun Sets block size lenght for specific channel. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Size: +*\*\ - Block tranfer size for tranfering +*\*\return none +**/ +void MDMA_SetChannelBlockSize(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint32_t Size) +{ + WRITE_REG(MDMAy->CH[ChNum].BTS, Size); +} + +/** +*\*\name MDMA_GetTransferredNumber. +*\*\fun Gets the number of data that has been transmitted by the current channel. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\return Number of data sent +**/ +uint32_t MDMA_GetTransferredNumber(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum) +{ + return READ_REG(MDMAy->CH[ChNum].BTS); +} + +/** +*\*\name MDMA_SetChannelLinkedListPointer. +*\*\fun Sets linked list pointer function. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param StrAddr: +*\*\ - MDMA linked list item structure address +*\*\return none +**/ +void MDMA_SetChannelLinkedListPointer(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, uint64_t StrAddr) +{ + WRITE_REG(MDMAy->CH[ChNum].LLP, StrAddr); +} + +/** +*\*\name MDMA_SetChannelSrcMultiBlockType. +*\*\fun Sets channel source multi block transfer type. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Type (The input parameters must be the following values): +*\*\ - MDMA_CH_MULTI_BLOCK_CONTIGUOUS +*\*\ - MDMA_CH_MULTI_BLOCK_RELOAD +*\*\ - MDMA_CH_MULTI_BLOCK_LINKED_LIST +*\*\return none +**/ +void MDMA_SetChannelSrcMultiBlockType(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, MDMA_ChMultBlkTfrType Type) +{ + MODIFY_REG(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_SMBTT, ((uint64_t)Type << 0U)); +} + +/** +*\*\name MDMA_SetChannelDstMultiBlockType. +*\*\fun Sets channel destination multi block transfer type. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Type (The input parameters must be the following values): +*\*\ - MDMA_CH_MULTI_BLOCK_CONTIGUOUS +*\*\ - MDMA_CH_MULTI_BLOCK_RELOAD +*\*\ - MDMA_CH_MULTI_BLOCK_LINKED_LIST +*\*\return none +**/ +void MDMA_SetChannelDstMultiBlockType(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, MDMA_ChMultBlkTfrType Type) +{ + MODIFY_REG(MDMAy->CH[ChNum].CFG, MDMA_CHNCFG_DMBTT, ((uint64_t)Type << 2U)); +} + +/** +*\*\name MDMA_TriggerSourceRequest. +*\*\fun Trigger a software source handshake request. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Type (The input parameters must be the following values): +*\*\ - MDMA_CH_SOFTWARE_HANDSHAKING_TFR_SINGLE +*\*\ - MDMA_CH_SOFTWARE_HANDSHAKING_TFR_BURST +*\*\param isLast: +*\*\ - true or false +*\*\return none +**/ +void MDMA_TriggerSourceRequest(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, MDMA_ChSwHsTfrType Type, bool isLast) +{ + if (Type == MDMA_CH_SOFTWARE_HANDSHAKING_TFR_SINGLE) + { + /* Enable Channel n Source peripheral request for a single dma transfer */ + WRITE_REG(MDMAy->CH[ChNum].SHSRC, (MDMA_CHNSHSRC_SHSRWE | MDMA_CHNSHSRC_SHSR)); + } + else + { + /* Enable Channel n Source peripheral request for a burst dma transfer */ + WRITE_REG(MDMAy->CH[ChNum].SHSRC, (MDMA_CHNSHSRC_SHRWE | MDMA_CHNSHSRC_SHR)); + } + + if (isLast == true) + { + /* Indication that the curent transfer is the last transfer */ + WRITE_REG(MDMAy->CH[ChNum].SHSRC, (MDMA_CHNSHSRC_SHLRWE | MDMA_CHNSHSRC_SHLR)); + } +} + +/** +*\*\name MDMA_TriggerDestinationRequest. +*\*\fun Trigger a software Destination handshake request. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\param Type (The input parameters must be the following values): +*\*\ - MDMA_CH_SOFTWARE_HANDSHAKING_TFR_SINGLE +*\*\ - MDMA_CH_SOFTWARE_HANDSHAKING_TFR_BURST +*\*\param isLast: +*\*\ - true or false +*\*\return none +**/ +void MDMA_TriggerDestinationRequest(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum, MDMA_ChSwHsTfrType Type, bool isLast) +{ + if (Type == MDMA_CH_SOFTWARE_HANDSHAKING_TFR_SINGLE) + { + /* Enable Channel n Destination peripheral request for a single dma transfer */ + WRITE_REG(MDMAy->CH[ChNum].SHDST, (MDMA_CHNSHDST_SHSRWE | MDMA_CHNSHDST_SHSR)); + } + else + { + /* Enable Channel n Destination peripheral request for a burst dma transfer */ + WRITE_REG(MDMAy->CH[ChNum].SHDST, (MDMA_CHNSHDST_SHRWE | MDMA_CHNSHDST_SHR)); + } + + if (isLast == true) + { + /* Indication that the curent transfer is the last transfer */ + WRITE_REG(MDMAy->CH[ChNum].SHDST, (MDMA_CHNSHDST_SHLRWE | MDMA_CHNSHDST_SHLR)); + } +} + +/** +*\*\name MDMA_BlockTransferResumeRequest. +*\*\fun Requests for resumption of block transfer during Linked-List-based +*\*\ multi-block transfer. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\return none +**/ +void MDMA_BlockTransferResumeRequest(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum) +{ + /* Request for resuming the block transfer */ + WRITE_REG(MDMAy->CH[ChNum].BTRR, MDMA_CHNBTRR_RESREQ); +} + +/** +*\*\name MDMA_SetChannelLinkedListItemValid. +*\*\fun Set the MDMA channel LLI valid. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\return none +**/ +void MDMA_SetChannelLinkedListItemValid(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum) +{ + SET_BIT(MDMAy->CH[ChNum].CTRL, MDMA_CHNCTRL_SRLLI); +} + +/** +*\*\name MDMA_ChannelLinkedListItemIsValid. +*\*\fun Check whether a MDMA channel LLI valid. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\return true or false +**/ +bool MDMA_ChannelLinkedListItemIsValid(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum) +{ + bool ret; + ret = READ_BIT(MDMAy->CH[ChNum].CTRL, MDMA_CHNCTRL_SRLLI) ? true : false; + return ret; +} + +/** +*\*\name MDMA_SetChannelLastLinkedListItem. +*\*\fun Set the current LLI to the last LLI. +*\*\param MDMAy (The input parameters must be the following values): +*\*\ - MDMA +*\*\param ChNum (The input parameters must be the following values): +*\*\ - MDMA_CHANNEL_0 +*\*\ - MDMA_CHANNEL_1 +*\*\ - MDMA_CHANNEL_2 +*\*\ - MDMA_CHANNEL_3 +*\*\ - MDMA_CHANNEL_4 +*\*\ - MDMA_CHANNEL_5 +*\*\ - MDMA_CHANNEL_6 +*\*\ - MDMA_CHANNEL_7 +*\*\ - MDMA_CHANNEL_8 +*\*\ - MDMA_CHANNEL_9 +*\*\ - MDMA_CHANNEL_10 +*\*\ - MDMA_CHANNEL_11 +*\*\ - MDMA_CHANNEL_12 +*\*\ - MDMA_CHANNEL_13 +*\*\ - MDMA_CHANNEL_14 +*\*\ - MDMA_CHANNEL_15 +*\*\return none +**/ +void MDMA_SetChannelLastLinkedListItem(MDMA_Module *const MDMAy, MDMA_ChNumType ChNum) +{ + SET_BIT(MDMAy->CH[ChNum].CTRL, MDMA_CHNCTRL_LSRLLI); +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_mmu.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_mmu.c new file mode 100644 index 0000000000..daf8da9f11 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_mmu.c @@ -0,0 +1,598 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_mmu.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_mmu.h" + +/** +*\*\name MMU_ConfigReset. +*\*\fun This function Config MMU reset . +*\*\param Cmd: +*\*\ - ENABLE : Enable the Interrupt +*\*\ - DISABLE : Disable the Interrupt +*\*\return none +**/ +void MMU_ConfigReset(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + MMU->CTRL |= MMU_RESET; + } + else + { + MMU->CTRL &= (~MMU_RESET); + } +} + +/** +*\*\name MMU_ConfigInt. +*\*\fun This function Config MMU Interrupt . +*\*\param Cmd: +*\*\ - ENABLE : Enable the Interrupt +*\*\ - DISABLE : Disable the Interrupt +*\*\return none +**/ +void MMU_ConfigInt(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + MMU->CTRL |= MMU_INT_EN; + } + else + { + MMU->CTRL &= (~MMU_INT_EN); + } +} + +/** +*\*\name MMU_GetFlagStatus. +*\*\fun Checks whether the specified MMU flag is set or not. +*\*\param MMU_FLAG: (The input parameters must be the following values): +*\*\ - MMU_XSPI_LOCK_FLAG +*\*\ - MMU_ITCM_RERR_FLAG +*\*\ - MMU_ITCM_WERR_FLAG +*\*\ - MMU_BKSRAM_RERR_FLAG +*\*\ - MMU_BKSRAM_WERR_FLAG +*\*\ - MMU_AHBSRAM5_RERR_FLAG +*\*\ - MMU_AHBSRAM5_WERR_FLAG +*\*\ - MMU_AHBSRAM4_RERR_FLAG +*\*\ - MMU_AHBSRAM4_WERR_FLAG +*\*\ - MMU_AHBSRAM3_RERR_FLAG +*\*\ - MMU_AHBSRAM3_WERR_FLAG +*\*\ - MMU_AHBSRAM2_RERR_FLAG +*\*\ - MMU_AHBSRAM2_WERR_FLAG +*\*\ - MMU_AHBSRAM1_RERR_FLAG +*\*\ - MMU_AHBSRAM1_WERR_FLAG +*\*\ - MMU_AXISRAM3_RERR_FLAG +*\*\ - MMU_AXISRAM3_WERR_FLAG +*\*\ - MMU_AXISRAM2_RERR_FLAG +*\*\ - MMU_AXISRAM2_WERR_FLAG +*\*\ - MMU_AXISRAM1_RERR_FLAG +*\*\ - MMU_AXISRAM1_WERR_FLAG +*\*\ - MMU_OB_LOCK_FLAG +*\*\ - MMU_FLASH_LOCK_FLAG +*\*\ - MMU_XSPI_RERR_FLAG +*\*\return bitstatus +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus MMU_GetFlagStatus(uint32_t MMU_FLAG) +{ + FlagStatus bitstatus; + + if ((MMU->STS & MMU_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** +*\*\name MMU_ClrFlag. +*\*\fun Clears the MMU's pending flags. +*\*\param MMU_FLAG: (The input parameters must be the following values): +*\*\ - MMU_ITCM_RERR_FLAG +*\*\ - MMU_ITCM_WERR_FLAG +*\*\ - MMU_BKSRAM_RERR_FLAG +*\*\ - MMU_BKSRAM_WERR_FLAG +*\*\ - MMU_AHBSRAM5_RERR_FLAG +*\*\ - MMU_AHBSRAM5_WERR_FLAG +*\*\ - MMU_AHBSRAM4_RERR_FLAG +*\*\ - MMU_AHBSRAM4_WERR_FLAG +*\*\ - MMU_AHBSRAM3_RERR_FLAG +*\*\ - MMU_AHBSRAM3_WERR_FLAG +*\*\ - MMU_AHBSRAM2_RERR_FLAG +*\*\ - MMU_AHBSRAM2_WERR_FLAG +*\*\ - MMU_AHBSRAM1_RERR_FLAG +*\*\ - MMU_AHBSRAM1_WERR_FLAG +*\*\ - MMU_AXISRAM3_RERR_FLAG +*\*\ - MMU_AXISRAM3_WERR_FLAG +*\*\ - MMU_AXISRAM2_RERR_FLAG +*\*\ - MMU_AXISRAM2_WERR_FLAG +*\*\ - MMU_AXISRAM1_RERR_FLAG +*\*\ - MMU_AXISRAM1_WERR_FLAG +*\*\ - MMU_XSPI_RERR_FLAG +*\*\return none +**/ +void MMU_ClrFlag(uint32_t MMU_FLAG) +{ + MMU->STS &= (~MMU_FLAG); +} + + +/** +*\*\name MMU_EnableRTAD. +*\*\fun This function Enable RTADx. +*\*\param RTADx : +*\*\ - MMU_RTAD1 +*\*\ - MMU_RTAD2 +*\*\ - MMU_RTAD3 +*\*\ - MMU_RTAD4 +*\*\param Cmd : +*\*\ - ENABLE Enable the RTADx +*\*\ - DISABLE Disable the RTADx +*\*\return none +**/ +void MMU_EnableRTAD(uint32_t RTADx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + *(uint32_t *)(MMU_BASE + (MMU_RTAD_ADDRESS_OFFSET + ((RTADx - 1UL) * 4UL))) |= MMU_RTAD_ENABLE; + } + else + { + *(uint32_t *)(MMU_BASE + (MMU_RTAD_ADDRESS_OFFSET + ((RTADx - 1UL) * 4UL))) &= (~MMU_RTAD_ENABLE); + } +} + +/** +*\*\name MMU_GetRTADRegionKey. +*\*\fun RTAD Partial Area KEY Configuration. +*\*\param region_key : +*\*\ - MMU_RTAD_REGION1_PART0_KEY MMU Region1 Part0 Key Register Offset Address +*\*\ - MMU_RTAD_REGION1_PART1_KEY MMU Region1 Part1 Key Register Offset Address +*\*\ - MMU_RTAD_REGION1_PART2_KEY MMU Region1 Part2 Key Register Offset Address +*\*\ - MMU_RTAD_REGION1_PART3_KEY MMU Region1 Part3 Key Register Offset Address +*\*\ - MMU_RTAD_REGION2_PART0_KEY MMU Region2 Part0 Key Register Offset Address +*\*\ - MMU_RTAD_REGION2_PART1_KEY MMU Region2 Part1 Key Register Offset Address +*\*\ - MMU_RTAD_REGION2_PART2_KEY MMU Region2 Part2 Key Register Offset Address +*\*\ - MMU_RTAD_REGION2_PART3_KEY MMU Region2 Part3 Key Register Offset Address +*\*\ - MMU_RTAD_REGION3_PART0_KEY MMU Region3 Part0 Key Register Offset Address +*\*\ - MMU_RTAD_REGION3_PART1_KEY MMU Region3 Part1 Key Register Offset Address +*\*\ - MMU_RTAD_REGION3_PART2_KEY MMU Region3 Part2 Key Register Offset Address +*\*\ - MMU_RTAD_REGION3_PART3_KEY MMU Region3 Part3 Key Register Offset Address +*\*\ - MMU_RTAD_REGION4_PART0_KEY MMU Region4 Part0 Key Register Offset Address +*\*\ - MMU_RTAD_REGION4_PART1_KEY MMU Region4 Part1 Key Register Offset Address +*\*\ - MMU_RTAD_REGION4_PART2_KEY MMU Region4 Part2 Key Register Offset Address +*\*\ - MMU_RTAD_REGION4_PART3_KEY MMU Region4 Part3 Key Register Offset Address +*\*\param key : The Key to Config +*\*\return none +**/ +uint32_t MMU_GetRTADRegionKey(uint32_t region) +{ + uint32_t key_temp; + key_temp = *(uint32_t *)(MMU_BASE + region); + return key_temp; +} + +/** +*\*\name MMU_ConfigRTADCFGLock. +*\*\fun This function Config RTADx Config Key Lock / Unlock. +*\*\param RTADx : +*\*\ - MMU_RTAD1 +*\*\ - MMU_RTAD2 +*\*\ - MMU_RTAD3 +*\*\ - MMU_RTAD4 +*\*\param Cmd : +*\*\ - ENABLE Enable the RTADx +*\*\ - DISABLE Disable the RTADx +*\*\return none +**/ +void MMU_ConfigRTADCFGLock(uint32_t RTADx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + *(uint32_t *)(MMU_BASE + (MMU_RTAD_ADDRESS_OFFSET + ((RTADx - 1UL) * 4UL))) |= MMU_RTAD_CFG_LOCK; + } + else + { + *(uint32_t *)(MMU_BASE + (MMU_RTAD_ADDRESS_OFFSET + ((RTADx - 1UL) * 4UL))) &= (~MMU_RTAD_CFG_LOCK); + } +} + +/** +*\*\name MMU_ConfigRTADKeyLock. +*\*\fun This function Config RTADx Key Lock / Unlock. +*\*\param RTADx : +*\*\ - MMU_RTAD1 +*\*\ - MMU_RTAD2 +*\*\ - MMU_RTAD3 +*\*\ - MMU_RTAD4 +*\*\param Cmd : +*\*\ - ENABLE Enable the RTADx +*\*\ - DISABLE Disable the RTADx +*\*\return none +**/ +void MMU_ConfigRTADKeyLock(uint32_t RTADx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + *(uint32_t *)(MMU_BASE + MMU_RTAD_ADDRESS_OFFSET + ((RTADx - 1UL) * 4UL)) |= MMU_RTAD_KEY_LOCK; + } + else + { + *(uint32_t *)(MMU_BASE + MMU_RTAD_ADDRESS_OFFSET + ((RTADx - 1UL) * 4UL)) &= (~MMU_RTAD_KEY_LOCK); + } +} + +/** +*\*\name MMU_ConfigRTADMode. +*\*\fun This function Config RTADx Work Mode. +*\*\param RTADx : +*\*\ - MMU_RTAD1 +*\*\ - MMU_RTAD2 +*\*\ - MMU_RTAD3 +*\*\ - MMU_RTAD4 +*\*\param mode : +*\*\ - MMU_RTAD_MODE_DEC_INST RTAD Work as Decryption Instruction +*\*\ - MMU_RTAD_MODE_DEC_DATA RTAD Work as Decryption Data / Literal +*\*\ - MMU_RTAD_MODE_DEC_ALL RTAD Work as Decryption Instruction and Data / Literal +*\*\return none +**/ +void MMU_ConfigRTADMode(uint32_t RTADx, uint32_t mode) +{ + /* Clear the Mode Field */ + *(uint32_t *)(MMU_BASE + MMU_RTAD_ADDRESS_OFFSET + ((RTADx - 1UL) * 4UL)) &= (~MMU_RTAD_MODE_MASK); + + /* Config the Mode */ + *(uint32_t *)(MMU_BASE + MMU_RTAD_ADDRESS_OFFSET + ((RTADx - 1UL) * 4UL)) |= (mode); +} + +/** +*\*\name MMU_ConfigRTADProperty. +*\*\fun This function Config RTADx Property. +*\*\param RTADx : +*\*\ - MMU_RTAD1 +*\*\ - MMU_RTAD2 +*\*\ - MMU_RTAD3 +*\*\ - MMU_RTAD4 +*\*\param property : +*\*\ - MMU_RTAD_PROPERTY_INST Instruction Can Fetch this Region +*\*\ - MMU_RTAD_PROPERTY_DATA Data Can Fetch this Region +*\*\ - MMU_RTAD_PROPERTY_ALL Instruction and Data Can Fetch this Region +*\*\return none +**/ +void MMU_ConfigRTADProperty(uint32_t RTADx, uint32_t property) +{ + /* Clear the Mode Field */ + *(uint32_t *)(MMU_BASE + MMU_RTAD_ADDRESS_OFFSET + ((RTADx - 1UL) * 4UL)) &= (~MMU_RTAD_PROPERTY_MASK); + + /* Config the Mode */ + *(uint32_t *)(MMU_BASE + MMU_RTAD_ADDRESS_OFFSET + ((RTADx - 1UL) * 4UL)) |= (property); +} + +/** +*\*\name MMU_ConfigRTADRegionAddress. +*\*\fun This function Config the Region Address. +*\*\param region : +*\*\ - MMU_RTAD_REGION1 +*\*\ - MMU_RTAD_REGION2 +*\*\ - MMU_RTAD_REGION3 +*\*\ - MMU_RTAD_REGION4 +*\*\param begin_addr : 0x0000~0x1FFF, The Region begin Address,Granularity size 4KB +*\*\param end_addr : 0x0000~0x1FFF, The Region end Address,Granularity size 4KB +*\*\return none +**/ +void MMU_ConfigRTADRegionAddress(uint32_t region, uint32_t begin_addr, uint32_t end_addr) +{ + *(uint32_t *)(MMU_BASE + MMU_RTR_ADDRESS_OFFSET + ((region - 1UL) * 4UL)) = (begin_addr | (end_addr << MMU_RTR_ENDADDR_OFFSET)); +} + +/** +*\*\name MMU_GetRTADCRC. +*\*\fun This function Return RTADx CRC Value. +*\*\param none +*\*\return uint32_t : The RTAD CRC +**/ +uint32_t MMU_GetRTADCRC(void) +{ + return ((uint32_t) MMU->RTCRC); +} + +/** +*\*\name MMU_EnableModuleMemory. +*\*\fun This function Config the Module Memory Enable / Disable. +*\*\param RTADx : +*\*\ - MMU_MEMORY_ETH1 Enable ETH1 Memory +*\*\ - MMU_MEMORY_ETH2 Enable ETH2 Memory +*\*\ - MMU_MEMORY_USB1 Enable USB1 Memory +*\*\ - MMU_MEMORY_USB2 Enable USB2 Memory +*\*\ - MMU_MEMORY_SDMMC1 Enable SDMMC1 Memory +*\*\ - MMU_MEMORY_SDMMC2 Enable SDMMC2 Memory +*\*\ - MMU_MEMORY_DVP1 Enable DVP1 Memory +*\*\ - MMU_MEMORY_DVP2 Enable DVP2 Memory +*\*\ - MMU_MEMORY_DMA1 Enable DMA1 Memory +*\*\ - MMU_MEMORY_DMA2 Enable DMA2 Memory +*\*\ - MMU_MEMORY_DMA3 Enable DMA3 Memory +*\*\ - MMU_MEMORY_MDMA Enable MDMA Memory +*\*\ - MMU_MEMORY_JPEG Enable JPEG Memory +*\*\ - MMU_MEMORY_LCDC Enable LCDC Memory +*\*\ - MMU_MEMORY_GPU Enable GPU Memory +*\*\ - MMU_MEMORY_SDPU Enable SDPU Memory +*\*\param Cmd : +*\*\ ENABLE Enable the Memory +*\*\ DISABLE Disable the Memory +*\*\return none +**/ +void MMU_EnableModuleMemory(uint32_t module, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + *(uint32_t *)(MMU_BASE + MMU_MEMORY_ADDRESS_OFFSET + ((module - 1UL) * 4UL)) |= MMU_MEMORY_EN; + } + else + { + *(uint32_t *)(MMU_BASE + MMU_MEMORY_ADDRESS_OFFSET + ((module - 1UL) * 4UL)) &= (~MMU_MEMORY_EN); + } +} + +/** +*\*\name MMU_GetModuleUserID. +*\*\fun This function Get Module User ID +*\*\param RTADx : +*\*\ - MMU_MEMORY_ETH1 Enable ETH1 Memory +*\*\ - MMU_MEMORY_ETH2 Enable ETH2 Memory +*\*\ - MMU_MEMORY_USB1 Enable USB1 Memory +*\*\ - MMU_MEMORY_USB2 Enable USB2 Memory +*\*\ - MMU_MEMORY_SDMMC1 Enable SDMMC1 Memory +*\*\ - MMU_MEMORY_SDMMC2 Enable SDMMC2 Memory +*\*\ - MMU_MEMORY_DVP1 Enable DVP1 Memory +*\*\ - MMU_MEMORY_DVP2 Enable DVP2 Memory +*\*\ - MMU_MEMORY_DMA1 Enable DMA1 Memory +*\*\ - MMU_MEMORY_DMA2 Enable DMA2 Memory +*\*\ - MMU_MEMORY_DMA3 Enable DMA3 Memory +*\*\ - MMU_MEMORY_MDMA Enable MDMA Memory +*\*\ - MMU_MEMORY_JPEG Enable JPEG Memory +*\*\ - MMU_MEMORY_LCDC Enable LCDC Memory +*\*\ - MMU_MEMORY_GPU Enable GPU Memory +*\*\ - MMU_MEMORY_SDPU Enable SDPU Memory +*\*\return UID: The corresponding bit set to 1 indicates that it is enabled by the corresponding user. +*\*\ - [0]:other_id(SDRAM,external SRAM,etc), [1]: nonsec_tcm/sram, [2]: sec_tcm/sram, [3]:non_sec_flash, +*\*\ - [4] pfoer_flash, [5]: sec_flash, [6]: bootrom_api, [7]:sec_bootrom +**/ +uint8_t MMU_GetModuleUserID(uint32_t module) +{ + uint32_t UID_temp; + UID_temp = *(uint32_t *)(MMU_BASE + MMU_MEMORY_ADDRESS_OFFSET + ((module - 1UL) * 4UL)); + return ((uint8_t) (UID_temp >> MMU_MEMORY_UID_OFFSET)); +} + +/** +*\*\name MMU_GetModuleMasterID. +*\*\fun This function Get the Module Master ID. +*\*\param RTADx : +*\*\ - MMU_MEMORY_ETH1 Enable ETH1 Memory +*\*\ - MMU_MEMORY_ETH2 Enable ETH2 Memory +*\*\ - MMU_MEMORY_USB1 Enable USB1 Memory +*\*\ - MMU_MEMORY_USB2 Enable USB2 Memory +*\*\ - MMU_MEMORY_SDMMC1 Enable SDMMC1 Memory +*\*\ - MMU_MEMORY_SDMMC2 Enable SDMMC2 Memory +*\*\ - MMU_MEMORY_DVP1 Enable DVP1 Memory +*\*\ - MMU_MEMORY_DVP2 Enable DVP2 Memory +*\*\ - MMU_MEMORY_DMA1 Enable DMA1 Memory +*\*\ - MMU_MEMORY_DMA2 Enable DMA2 Memory +*\*\ - MMU_MEMORY_DMA3 Enable DMA3 Memory +*\*\ - MMU_MEMORY_MDMA Enable MDMA Memory +*\*\ - MMU_MEMORY_JPEG Enable JPEG Memory +*\*\ - MMU_MEMORY_LCDC Enable LCDC Memory +*\*\ - MMU_MEMORY_GPU Enable GPU Memory +*\*\ - MMU_MEMORY_SDPU Enable SDPU Memory +*\*\return MID: The corresponding bit set to 1 indicates that it is enabled by the corresponding master. +*\*\ - [0]: CM7,[1]: CM4,[2]: DEBUG +**/ +uint8_t MMU_GetModuleMasterID(uint32_t module) +{ + uint32_t MID_temp; + MID_temp = *(uint32_t *)(MMU_BASE + MMU_MEMORY_ADDRESS_OFFSET + ((module - 1UL) * 4UL)); + return ((uint8_t) (MID_temp >> MMU_MEMORY_MID_OFFSET)); +} + +/** +*\*\name MMU_GetReadErrorAddress. +*\*\fun This function Get the Read Error Address. +*\*\param readerroraddr : The Read Error Register Offset Address +*\*\ - MMU_XRAD_ADDR_OFFSET XSPI read error address +*\*\ - MMU_X1RAD_ADDR_OFFSET AXI SRAM1 read error address +*\*\ - MMU_X2RAD_ADDR_OFFSET AXI SRAM2 read error address +*\*\ - MMU_X3RAD_ADDR_OFFSET AXI SRAM3 read error address +*\*\ - MMU_H1RAD_ADDR_OFFSET AHB SRAM1 read error address +*\*\ - MMU_H2RAD_ADDR_OFFSET AHB SRAM2 read error address +*\*\ - MMU_H3RAD_ADDR_OFFSET AHB SRAM3 read error address +*\*\ - MMU_H4RAD_ADDR_OFFSET AHB SRAM4 read error address +*\*\ - MMU_H5RAD_ADDR_OFFSET AHB SRAM5 read error address +*\*\ - MMU_BKRAD_ADDR_OFFSET Backup SRAM read error address +*\*\ - MMU_ITRAD_ADDR_OFFSET ITCM SRAM read error address +*\*\return uint32_t error address +**/ +uint32_t MMU_GetReadErrorAddress(uint32_t readerroraddr) +{ + return ((uint32_t) (*(uint32_t *)(MMU_BASE + readerroraddr))); +} + +/** +*\*\name MMU_GetWriteErrorAddress. +*\*\fun This function Get the Write Error Address. +*\*\param writeerroraddr : The Write Error Register Offset Address +*\*\ - MMU_X1WAD_ADDR_OFFSET AXI SRAM1 read error address +*\*\ - MMU_X2WAD_ADDR_OFFSET AXI SRAM2 read error address +*\*\ - MMU_X3WAD_ADDR_OFFSET AXI SRAM3 read error address +*\*\ - MMU_H1WAD_ADDR_OFFSET AHB SRAM1 read error address +*\*\ - MMU_H2WAD_ADDR_OFFSET AHB SRAM2 read error address +*\*\ - MMU_H3WAD_ADDR_OFFSET AHB SRAM3 read error address +*\*\ - MMU_H4WAD_ADDR_OFFSET AHB SRAM4 read error address +*\*\ - MMU_H5WAD_ADDR_OFFSET AHB SRAM5 read error address +*\*\ - MMU_BKWAD_ADDR_OFFSET Backup SRAM read error address +*\*\ - MMU_ITWAD_ADDR_OFFSET ITCM SRAM read error address +*\*\return uint32_t error address +**/ +uint32_t MMU_GetWriteErrorAddress(uint32_t writeerroraddr) +{ + return ((uint32_t) (*(uint32_t *)(MMU_BASE + writeerroraddr))); +} + +/** +*\*\name MMU_GetWriteErrorMasterID. +*\*\fun This function Get Write Error Master ID. +*\*\param writeerrordebug: The Write Error ID Register Offset Address +*\*\ - MMU_X1WD_ADDR_OFFSET AXI SRAM1 read error debug +*\*\ - MMU_X2WD_ADDR_OFFSET AXI SRAM2 read error debug +*\*\ - MMU_X3WD_ADDR_OFFSET AXI SRAM3 read error debug +*\*\ - MMU_H1WD_ADDR_OFFSET AHB SRAM1 read error debug +*\*\ - MMU_H2WD_ADDR_OFFSET AHB SRAM2 read error debug +*\*\ - MMU_H3WD_ADDR_OFFSET AHB SRAM3 read error debug +*\*\ - MMU_H4WD_ADDR_OFFSET AHB SRAM4 read error debug +*\*\ - MMU_H5WD_ADDR_OFFSET AHB SRAM5 read error debug +*\*\ - MMU_BKWD_ADDR_OFFSET Backup SRAM read error debug +*\*\ - MMU_ITWD_ADDR_OFFSET ITCM SRAM read error debug +*\*\return MID: The corresponding bit set to 1 indicates that it is enabled by the corresponding master. +*\*\ - [0]: DEBUG,[1]: other non-cpu master(ETH/USB/etc),[2]: CM7,[3]: CM4 +**/ +uint32_t MMU_GetWriteErrorMasterID(uint32_t writeerrordebug) +{ + uint32_t MID_temp; + MID_temp = *(uint32_t *)(MMU_BASE + writeerrordebug); + return ((uint8_t) (MID_temp >> MMU_WERRDEBUG_MID_OFFSET)); +} + +/** +*\*\name MMU_GetWriteErrorUserID. +*\*\fun This function Get Write Error User ID. +*\*\param writeerrordebug : The Write Error ID Register Offset Address +*\*\ - MMU_X1WD_ADDR_OFFSET AXI SRAM1 read error debug +*\*\ - MMU_X2WD_ADDR_OFFSET AXI SRAM2 read error debug +*\*\ - MMU_X3WD_ADDR_OFFSET AXI SRAM3 read error debug +*\*\ - MMU_H1WD_ADDR_OFFSET AHB SRAM1 read error debug +*\*\ - MMU_H2WD_ADDR_OFFSET AHB SRAM2 read error debug +*\*\ - MMU_H3WD_ADDR_OFFSET AHB SRAM3 read error debug +*\*\ - MMU_H4WD_ADDR_OFFSET AHB SRAM4 read error debug +*\*\ - MMU_H5WD_ADDR_OFFSET AHB SRAM5 read error debug +*\*\ - MMU_BKWD_ADDR_OFFSET Backup SRAM read error debug +*\*\ - MMU_ITWD_ADDR_OFFSET ITCM SRAM read error debug +*\*\return UID: The corresponding bit set to 1 indicates that it is enabled by the corresponding user. +*\*\ - [0]:other_id(SDRAM,external SRAM,etc), [1]: nonsec_tcm/sram, [2]: sec_tcm/sram, [3]:non_sec_flash, +*\*\ - [4] pfoer_flash, [5]: sec_flash, [6]: bootrom_api, [7]:sec_bootrom +**/ +uint32_t MMU_GetWriteErrorUserID(uint32_t writeerrordebug) +{ + uint32_t UID_temp; + UID_temp = *(uint32_t *)(MMU_BASE + writeerrordebug); + return ((uint8_t) UID_temp); +} + +/** +*\*\name MMU_GetReadErrorMasterID. +*\*\fun This function Get Read Error Master ID. +*\*\param readerrordebug : The Read Error ID Register Offset Address +*\*\ - MMU_XRD_ADDR_OFFSET XSPI read error debug +*\*\ - MMU_X1RD_ADDR_OFFSET AXI SRAM1 read error debug +*\*\ - MMU_X2RD_ADDR_OFFSET AXI SRAM2 read error debug +*\*\ - MMU_X3RD_ADDR_OFFSET AXI SRAM3 read error debug +*\*\ - MMU_H1RD_ADDR_OFFSET AHB SRAM1 read error debug +*\*\ - MMU_H2RD_ADDR_OFFSET AHB SRAM2 read error debug +*\*\ - MMU_H3RD_ADDR_OFFSET AHB SRAM3 read error debug +*\*\ - MMU_H4RD_ADDR_OFFSET AHB SRAM4 read error debug +*\*\ - MMU_H5RD_ADDR_OFFSET AHB SRAM5 read error debug +*\*\ - MMU_BKRD_ADDR_OFFSET Backup SRAM read error debug +*\*\ - MMU_ITRD_ADDR_OFFSET ITCM SRAM read error debug +*\*\return MID: The corresponding bit set to 1 indicates that it is enabled by the corresponding master. +*\*\ - [0]: DEBUG,[1]: other non-cpu master(ETH/USB/etc),[2]: CM7,[3]: CM4 +**/ +uint32_t MMU_GetReadErrorMasterID(uint32_t readerrordebug) +{ + uint32_t MID_temp; + MID_temp = *(uint32_t *)(MMU_BASE + readerrordebug); + return ((uint8_t) (MID_temp >> MMU_WERRDEBUG_MID_OFFSET)); +} + +/** +*\*\name MMU_GetReadErrorUserID. +*\*\fun This function Get Read Error User ID. +*\*\param readerrordebug : The Read Error ID Register Offset Address +*\*\ - MMU_XRD_ADDR_OFFSET XSPI read error debug +*\*\ - MMU_X1RD_ADDR_OFFSET AXI SRAM1 read error debug +*\*\ - MMU_X2RD_ADDR_OFFSET AXI SRAM2 read error debug +*\*\ - MMU_X3RD_ADDR_OFFSET AXI SRAM3 read error debug +*\*\ - MMU_H1RD_ADDR_OFFSET AHB SRAM1 read error debug +*\*\ - MMU_H2RD_ADDR_OFFSET AHB SRAM2 read error debug +*\*\ - MMU_H3RD_ADDR_OFFSET AHB SRAM3 read error debug +*\*\ - MMU_H4RD_ADDR_OFFSET AHB SRAM4 read error debug +*\*\ - MMU_H5RD_ADDR_OFFSET AHB SRAM5 read error debug +*\*\ - MMU_BKRD_ADDR_OFFSET Backup SRAM read error debug +*\*\ - MMU_ITRD_ADDR_OFFSET ITCM SRAM read error debug +*\*\return UID: The corresponding bit set to 1 indicates that it is enabled by the corresponding user. +*\*\ - [0]:other_id(SDRAM,external SRAM,etc), [1]: nonsec_tcm/sram, [2]: sec_tcm/sram, [3]:non_sec_flash, +*\*\ - [4] pfoer_flash, [5]: sec_flash, [6]: bootrom_api, [7]:sec_bootrom +**/ +uint32_t MMU_GetReadErrorUserID(uint32_t readerrordebug) +{ + uint32_t UID_temp; + UID_temp = *(uint32_t *)(MMU_BASE + readerrordebug); + return ((uint8_t) UID_temp); +} + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_otpc.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_otpc.c new file mode 100644 index 0000000000..d3eb6d9e4a --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_otpc.c @@ -0,0 +1,555 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_otpc.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_otpc.h" + +/** +*\*\name OTPC_Unlock. +*\*\fun This function Unlock the CTRL Register. +*\*\param none +*\*\return none +**/ +void OTPC_Unlock(void) +{ + /* Unlock the OTPC_CTRL */ + OTPC->KEY = OTPC_KEY1; + OTPC->KEY = OTPC_KEY2; +} + +/** +*\*\name OTPC_Lock. +*\*\fun This function Lock the CTRL Register. +*\*\param none +*\*\return none +**/ +void OTPC_Lock(void) +{ + /* Lock the OTPC_CTRL */ + OTPC->CTRL |= OTPC_CMD_LOCK; +} + +/** +*\*\name OTPC_GetLockStatus. +*\*\fun This function return the Unlock status. +*\*\param none +*\*\return FlagStatus: +*\*\ SET OTPC_CTRL is Locked +*\*\ RESET OTPC_CTRL is Unlock +**/ +FlagStatus OTPC_GetLockStatus(void) +{ + FlagStatus bitstatus; + + /* Return the Lock status */ + if ((OTPC->CTRL & OTPC_CMD_LOCK) == OTPC_CMD_LOCK) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} +/** +*\*\name OTPC_SetUsCount. +*\*\fun This function Sets the us Conter. +*\*\param us_count : 0x00000000 - 0x000001FF +*\*\return none +**/ +void OTPC_SetUsCount(uint32_t us_count) +{ + /* Set the us Counter */ + OTPC->USC = (OTPC_USC_MASK & us_count); +} +/** +*\*\name OTPC_GetFlagStatus. +*\*\fun This function return the Flag status. +*\*\param optc_flag +*\*\ - OTPC_FLAG_BE Busy Error Flag +*\*\ - OTPC_FLAG_OORE Read / Write out of Range Error Flag +*\*\ - OTPC_FLAG_RDPE Read Protection Error Flag +*\*\ - OTPC_FLAG_WRPE Write Protection Error Flag +*\*\ - OTPC_FLAG_PGE Program Error Flag +*\*\ - OTPC_FLAG_KEYE Key Error Flag +*\*\ - OTPC_FLAG_BUSY Busy Flag +*\*\return FlagStatus +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus OTPC_GetFlagStatus(uint32_t optc_flag) +{ + FlagStatus bitstatus; + + if ((OTPC->STS & optc_flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name OTPC_ClearFlag. +*\*\fun This function Clear the Flag status. +*\*\param optc_flag +*\*\ - OTPC_FLAG_BE Busy Error Flag +*\*\ - OTPC_FLAG_OORE Read / Write out of Range Error Flag +*\*\ - OTPC_FLAG_RDPE Read Protection Error Flag +*\*\ - OTPC_FLAG_WRPE Write Protection Error Flag +*\*\ - OTPC_FLAG_PGE Program Error Flag +*\*\return none +**/ +void OTPC_ClearFlag(uint32_t optc_flag) +{ + /* Write 1 Clear the Flags */ + OTPC->STS = optc_flag; +} + +/** +*\*\name OTPC_ConfigInterrupt. +*\*\fun This function Enable the OTPC Interrupt. +*\*\param otpc_int: +*\*\ - OTPC_INT_BE Busy Error Interrupt Enable +*\*\ - OTPC_INT_OORE Read / Write out of Range Error Interrupt Enable +*\*\ - OTPC_INT_RDPE Read Protection Error Interrupt Enable +*\*\ - OTPC_INT_WRPE Write Protection Error Interrupt Enable +*\*\ - OTPC_INT_PGE Program Error Interrupt Enable +*\*\ FunctionalState: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void OTPC_ConfigInterrupt(uint32_t otpc_int, FunctionalState cmd) +{ + if(cmd == ENABLE) + { + OTPC->CTRL |= otpc_int; + } + else + { + OTPC->CTRL &= (~otpc_int); + } +} + +/** +*\*\name OTPC_ClearFlag. +*\*\fun This function Check the Error Flag. +*\*\param none +*\*\return FlagStatus +*\*\ - RESET No Error Occur +*\*\ - SET Has Error Occur +**/ +FlagStatus OTPC_CheckError(void) +{ + FlagStatus bitstatus; + + /* Check the Error Flag */ + if((OTPC->STS & OTPC_ALLERROR_STS) == RESET) + { + bitstatus = RESET; + } + else + { + /* Has Error Occur */ + bitstatus = SET; + } + + return bitstatus; +} + +/** +*\*\name OTPC_WaitForLastOperation. +*\*\fun This function Wait For the Last Operation is Complete. +*\*\param none +*\*\return OTPC_STS +*\*\ - OTPC_ERR_TIMEOUT Last Operation TimeOut Error Occur +*\*\ - OTPC_COMPLETE Last Operation Complete without any Errors +*\*\ - OTPC_UNCOMPLETE Last Operation has Error Occur +**/ +OTPC_STS OTPC_WaitForLastOperation(void) +{ + FlagStatus flag_status = SET; + OTPC_STS status_temp; + uint32_t time_out = OTPC_TIME_OUT; + + while((flag_status != RESET) && (time_out != 0)) + { + /* Get Busy Flag */ + flag_status = OTPC_GetFlagStatus(OTPC_FLAG_BUSY); + time_out--; + } + + if(time_out == 0) + { + status_temp = OTPC_ERR_TIMEOUT; + } + else if(OTPC_CheckError() == SET) + { + status_temp = OTPC_UNCOMPLETE; + } + else + { + status_temp = OTPC_COMPLETE; + } + + return status_temp; +} + +/** +*\*\name OTPC_WriteEnable. +*\*\fun This function Enable the OTPC Operation as Write. +*\*\param none +*\*\return none +**/ +void OTPC_WriteEnable(void) +{ + OTPC->CTRL |= OTPC_CMD_WRITE; +} + +/** +*\*\name OTPC_ReadEnable. +*\*\fun This function Enable the OTPC Operation as Read. +*\*\param none +*\*\return none +**/ +void OTPC_ReadEnable(void) +{ + OTPC->CTRL &= OTPC_CMD_READ; +} + +/** +*\*\name OTPC_ConfigAddr. +*\*\fun This function Set the Operate Address. +*\*\param addr : 0x00000500 - 0x000005FF +*\*\return none +**/ +void OTPC_SetAddr(uint32_t addr) +{ + OTPC->ADDR = addr; +} + +/** +*\*\name OTPC_SetWriteData. +*\*\fun This function Set the Write data. +*\*\param data : The data need to be Programed +*\*\return none +**/ +void OTPC_SetWriteData(uint32_t data) +{ + OTPC->WDATA = data; +} + +/** +*\*\name OTPC_ProgramWord. +*\*\fun This function Program data at addr. +*\*\param addr : 0x00000500 - 0x000005FF +*\*\ data : The data need to be Programed +*\*\return OTPC_STS +*\*\ - OTPC_ERR_TIMEOUT Last Operation TimeOut Error Occur +*\*\ - OTPC_COMPLETE Last Operation Complete without any Error +*\*\ - OTPC_UNCOMPLETE Last Operation has Error Occur +*\*\note During the write operation, NRST cannot be reset +**/ +OTPC_STS OTPC_ProgramWord(uint32_t addr, uint32_t data) +{ + OTPC_STS otpc_status; + OTPC_ClearFlag(OTPC_ERROR_STS); + /* Get Last Operation Status */ + otpc_status = OTPC_WaitForLastOperation(); + + /* Last Operation Not Complete and Errors Occur */ + if(otpc_status == OTPC_COMPLETE) + { + OTPC_WriteEnable(); + OTPC_SetWriteData(data); + OTPC_SetAddr(addr); + /* Get Last Operation Status */ + otpc_status = OTPC_WaitForLastOperation(); + } + + return otpc_status; +} + +/** +*\*\name OTPC_ReadWord. +*\*\fun This function Read data at addr. +*\*\param addr : 0x00000300 - 0x000003CF,0x00000500 - 0x000005FF +*\*\ *data : The Point of the data need to be Read; +*\*\return OTPC_STS +*\*\ - OTPC_ERR_TIMEOUT Last Operation TimeOut Error Occur +*\*\ - OTPC_COMPLETE Last Operation Complete without any Error +*\*\ - OTPC_UNCOMPLETE Last Operation has Error Occur +**/ +OTPC_STS OTPC_ReadWord(uint32_t addr, uint32_t *data) +{ + /* Get Last Operation Status */ + OTPC_STS otpc_status = OTPC_WaitForLastOperation(); + + /* Last Operation Not Complete and Errors Occur */ + if(otpc_status != OTPC_COMPLETE) + { + /* no process */ + } + else + { + OTPC_ReadEnable(); + OTPC_SetAddr(addr); + otpc_status = OTPC_WaitForLastOperation(); + } + + if(otpc_status != OTPC_COMPLETE) + { + /* no process */ + } + else + { + *data = OTPC->RDATA; + } + + return otpc_status; +} + +/** +*\*\name OTPC_GetUserCfgVaildNum. +*\*\fun This function Check the 16 Copies region is programble. +*\*\param ConfigUser +*\*\ - OTPC_SEC_JTAG_REG +*\*\ - OTPC_SEC_MODE_REG +*\*\ - OTPC_RDP2_REG +*\*\ - OTPC_BTM_REG +*\*\ - OTPC_BOR_REG +*\*\ - OTPC_IWDG_REG +*\*\ - OTPC_TCM_SIZE_REG +*\*\ - OTPC_JTAG_KEY_REG +*\*\ - OTPC_REK_UNIT1_REG +*\*\ - OTPC_REK_UNIT2_REG +*\*\ - OTPC_REK_UNIT3_REG +*\*\ - OTPC_REK_UNIT4_REG +*\*\ - OTPC_IDK_UNIT1_REG +*\*\ - OTPC_IDK_UNIT2_REG +*\*\ - OTPC_IDK_UNIT3_REG +*\*\ - OTPC_IDK_UNIT4_REG +*\*\return value_temp : The quantity containing 1 in the lower 16 bits indicates the remaining programmable quantity +**/ +uint32_t OTPC_GetUserCfgVaildNum(uint32_t ConfigUser) +{ + uint32_t value_temp; + value_temp = *(uint32_t*)(OTPC_BASE + ConfigUser); + value_temp &= OTPC_VARIOUS_REG_MASK; + return value_temp; +} + +/** +*\*\name OTPC_CheckUserMemoryUnused. +*\*\fun This function Check the User Memory Unused region is programble. +*\*\param addr : 0x0500 ~ 0x05FF +*\*\return FlagStatus : +*\*\ - SET The Check Address is Programble +*\*\ - RESET The Check Address is not Programble +**/ +FlagStatus OTPC_CheckUserMemoryUnused(uint32_t addr) +{ + FlagStatus value_stauts; + uint32_t base_addr; + uint32_t vaild_bit; + + /* Get the register address corresponding to the address FLAG */ + base_addr = OTPC_BASE + OTPC_UMUU_BASE_REG + (((addr - OTPC_UNUSE_STARTADDRESS) / OTPC_UNUSE_PAGESIZE) * 4U); + /* Get the register bit corresponding to the address FLAG */ + vaild_bit = (addr - OTPC_UNUSE_STARTADDRESS) % OTPC_UNUSE_PAGESIZE; + + if(((*(uint32_t*)base_addr) & (0x01UL << vaild_bit)) == RESET) + { + value_stauts = RESET; + } + else + { + value_stauts = SET; + } + + return value_stauts; +} + + +/** +*\*\name OTPC_GetReload. +*\*\fun This function Return the OTPC_CFG_RELOAD Values. +*\*\param DBGReloadValue pointer to an OTPC_DBGReloadValue structure. +*\*\ - NRST_IWDG_OTPValue +*\*\ - bit13: nRST_STOP_C_M7; When entering STOP0/STOP2 mode, the system will automatically reset +*\*\ - 0: Reset +*\*\ - 1: No reset +*\*\ - bit12: nRST_STOP_C_M4; When entering STOP0/STOP2 mode, the system will automatically reset +*\*\ - 0: Reset +*\*\ - 1: No reset +*\*\ - bit11: nRST_STDBY_C_M7; When entering Standby mode, the system will automatically reset +*\*\ - 0: Reset +*\*\ - 1: No reset +*\*\ - bit10: nRST_STDBY_C_M4; When entering Standby mode, the system will automatically reset +*\*\ - 0: Reset +*\*\ - 1: No reset +*\*\ - bit9 : IWDG_SW_M7; iwdg control selection +*\*\ - 0: hardware +*\*\ - 1: software +*\*\ - bit8 : IWDG_SW_M4; iwdg control selection +*\*\ - 0: hardware +*\*\ - 1: software +*\*\ - bit7 : IWDG_STOP0_M7; IWDG's activity status in STOP0 mode +*\*\ - 0: Freeze +*\*\ - 1: Active +*\*\ - bit6 : IWDG_STOP0_M4; IWDG's activity status in STOP0 mode +*\*\ - 0: Freeze +*\*\ - 1: Active +*\*\ - bit5 : IWDG_STOP2_M7; IWDG's activity status in STOP2 mode +*\*\ - 0: Freeze +*\*\ - 1: Active +*\*\ - bit4 : IWDG_STOP2_M4; IWDG's activity status in STOP2 mode +*\*\ - 0: Freeze +*\*\ - 1: Active +*\*\ - bit3 : IWDG_STANDBY_M7; IWDG's activity status in STANDBY mode +*\*\ - 0: Freeze +*\*\ - 1: Active +*\*\ - bit2 : IWDG_STANDBY_M4; IWDG's activity status in STANDBY mode +*\*\ - 0: Freeze +*\*\ - 1: Active +*\*\ - bit1 : IWDG_SLEEP_M7; IWDG's activity status in SLEEP mode +*\*\ - 0: Freeze +*\*\ - 1: Active +*\*\ - bit0 : IWDG_SLEEP_M4; IWDG's activity status in SLEEP mode +*\*\ - 0: Freeze +*\*\ - 1: Active +*\*\ - BOR_OTPValue +*\*\ - 0x00~0x07 +*\*\ - SEC_JTAG_OTPValue +*\*\ - 0x0F/0x09: JTAG/SWD Enable +*\*\ - others: JTAG/SWD Disable +*\*\ - L2MODE +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - L1MODE +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - L0MODE +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - ROOTMODE +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - INITMODE +*\*\ - ENABLE +*\*\ - DISABLE +*\*\ - TCM_SIZE_OTPValue +*\*\ - 0x00~0x3F,For detailed description, please refer to the System Security section of the User Manual, OTP Options byte +*\*\return none +**/ +void OTPC_GetReload(OTPC_DBGReloadValue* DBGReloadValue) +{ + DBGReloadValue->NRST_IWDG_OTPValue = ((OTPC->CRLD1) & OTPC_CRLD1_NRIWDG) >> OTPC_CRLD1_NRIWDG_OFFSET; + DBGReloadValue->BOR_OTPValue = ((OTPC->CRLD1) & OTPC_CRLD1_BOR) >> OTPC_CRLD1_BOR_OFFSET; + DBGReloadValue->SEC_JTAG_OTPValue = ((OTPC->CRLD1) & OTPC_CRLD1_SJAG); + + if((OTPC->CRLD2 & OTPC_CRLD2_L2MD) == RESET) + { + DBGReloadValue->L2MODE = RESET; + } + else + { + DBGReloadValue->L2MODE = SET; + } + + if((OTPC->CRLD2 & OTPC_CRLD2_L1MD) == RESET) + { + DBGReloadValue->L1MODE = RESET; + } + else + { + DBGReloadValue->L1MODE = SET; + } + + if((OTPC->CRLD2 & OTPC_CRLD2_L0MD) == RESET) + { + DBGReloadValue->L0MODE = RESET; + } + else + { + DBGReloadValue->L0MODE = SET; + } + + if((OTPC->CRLD2 & OTPC_CRLD2_ROOTMD) == RESET) + { + DBGReloadValue->ROOTMODE = RESET; + } + else + { + DBGReloadValue->ROOTMODE = SET; + } + + if((OTPC->CRLD2 & OTPC_CRLD2_INITMD) == RESET) + { + DBGReloadValue->INITMODE = RESET; + } + else + { + DBGReloadValue->INITMODE = SET; + } + + DBGReloadValue->TCM_SIZE_OTPValue = ((OTPC->CRLD2) & OTPC_CRLD2_TCMSZ); +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_pwr.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_pwr.c new file mode 100644 index 0000000000..582ed609dd --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_pwr.c @@ -0,0 +1,1580 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_pwr.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_pwr.h" +#include "n32h76x_78x_rcc.h" +#include "misc.h" + +#define GRAPHIC_MODULE_MASK ((uint32_t)0x0000001FU) +#define HSC1_MODULE_MASK ((uint32_t)0x00000700U) +#define HSC2_MODULE_MASK ((uint32_t)0x000000E0U) +/** +*\*\name PWR_DeInit. +*\*\fun Deinitializes the PWR peripheral registers to their default reset values. +*\*\param none +*\*\return none +**/ +void PWR_DeInit(void) +{ + RCC_EnableAHB5PeriphReset2(RCC_AHB5_PERIPHRST_PWR); +} + +/** +*\*\name PWR_BackupAccessEnable. +*\*\fun Enables or disables access to the RTC and backup registers. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_BackupAccessEnable(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + PWR->SYSCTRL1 |= PWR_DBKPEN; + } + else + { + PWR->SYSCTRL1 &= ~PWR_DBKPEN; + } +} + +/** +*\*\name PWR_PvdEnable. +*\*\fun Enables or disables the Power Voltage Detector(PVD). +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_PvdEnable(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + PWR->SYSCTRL1 |= PWR_PVDEN; + } + else + { + PWR->SYSCTRL1 &= ~PWR_PVDEN; + } +} + +/** +*\*\name PWR_AvdEnable. +*\*\fun Enables or disables the Power Analog Voltage Detector(AVD). +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_AvdEnable(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + PWR->SYSCTRL1 |= PWR_AVDEN; + } + else + { + PWR->SYSCTRL1 &= ~PWR_AVDEN; + } +} + +/** +*\*\name PWR_EnableMRInStandby. +*\*\fun Enables or disables the MR power when the system enters into standby mode . +*\*\param Cmd: +*\*\ - ENABLE : MR is on when system enters into Standby mode. +*\*\ - DISABLE : MR is off when system enters into Standby mode. +*\*\return none +**/ +void PWR_EnableMRInStandby(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + PWR->SYSCTRL2 &= ~PWR_MROFF_IN_STANDBY; + } + else + { + PWR->SYSCTRL2 |= PWR_MROFF_IN_STANDBY; + } +} + + +/** +*\*\name PWR_ConfigDigitalFilterOnNRST. +*\*\fun Config the digital glitch filtered pulse width on NRST . +*\*\param cycle_cnt(The input parameters must be the following values): +*\*\ - 0x000U - 0xFFFU . +*\*\param Cmd: +*\*\ - ENABLE . +*\*\ - DISABLE. +*\*\return none +**/ +void PWR_ConfigDigitalFilterOnNRST(uint32_t cycle_cnt, FunctionalState Cmd) +{ + __IO uint32_t tempreg; + /* Get the old register value */ + tempreg = PWR->SYSCTRL1; + if(Cmd == ENABLE) + { + tempreg &= ~(PWR_NRST_DGF_BP | PWR_NRST_DGF_CNT_MASK); + tempreg |= (cycle_cnt << PWR_NRST_DGF_CNT_BIT_OFFSET); + } + else + { + tempreg |= PWR_NRST_DGF_BP; + } + /* Set new configuration */ + PWR->SYSCTRL1 = tempreg; +} + +/** +*\*\name PWR_EnableBKPLDO. +*\*\fun Enables or disables the backup LDO. +*\*\param Cmd: +*\*\ - ENABLE : Enable the backup LDO. +*\*\ - DISABLE : Disable the backup LDO. +*\*\return none +**/ +void PWR_EnableBKPLDO(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + PWR->SYSCTRL1 |= ~PWR_BKPLDOEN; + } + else + { + PWR->SYSCTRL1 &= PWR_BKPLDOEN; + } +} + + +/** +*\*\name PWR_PVDLevelConfig. +*\*\fun Configures the voltage threshold detected by the Power Voltage Detector(PVD). +*\*\param level (The input parameters must be the following values): +*\*\ - PWR_PVD_LEVEL_2V28 PVD level is 2.28V +*\*\ - PWR_PVD_LEVEL_2V38 PVD level is 2.38V +*\*\ - PWR_PVD_LEVEL_2V48 PVD level is 2.48V +*\*\ - PWR_PVD_LEVEL_2V58 PVD level is 2.58V +*\*\ - PWR_PVD_LEVEL_2V68 PVD level is 2.68V +*\*\ - PWR_PVD_LEVEL_2V78 PVD level is 2.78V +*\*\ - PWR_PVD_LEVEL_2V88 PVD level is 2.88V +*\*\ - PWR_PVD_LEVEL_3V28 PVD level is 3.28V +*\*\ - PWR_PVD_LEVEL_3V38 PVD level is 3.38V +*\*\ - PWR_PVD_LEVEL_3V48 PVD level is 3.48V +*\*\ - PWR_PVD_LEVEL_3V58 PVD level is 3.58V +*\*\return none +**/ +void PWR_PVDLevelConfig(uint32_t level) +{ + uint32_t temp_value; + + temp_value = *(__IO uint32_t *)PVD_ContrlBaseAddress; + /* Clear MSB and PLS[2:0] bits bit */ + temp_value &= PWR_PVD_LEVEL_MASK; + /* Set PLS[3:0] bits according to level value */ + temp_value |= level; + /* Store the new value */ + *(__IO uint32_t *)PVD_ContrlBaseAddress = temp_value; +} + +/** +*\*\name PWR_AVDLevelConfig. +*\*\fun Configure the voltage threshold to be detected by the Analog Power Voltage Detector(AVD). +*\*\param level (The input parameters must be the following values): +*\*\ - PWR_AVD_LEVEL_2V28 AVD level is 2.28V +*\*\ - PWR_AVD_LEVEL_2V38 AVD level is 2.38V +*\*\ - PWR_AVD_LEVEL_2V48 AVD level is 2.48V +*\*\ - PWR_AVD_LEVEL_2V58 AVD level is 2.58V +*\*\ - PWR_AVD_LEVEL_2V68 AVD level is 2.68V +*\*\ - PWR_AVD_LEVEL_2V78 AVD level is 2.78V +*\*\ - PWR_AVD_LEVEL_2V88 AVD level is 2.88V +*\*\ - PWR_AVD_LEVEL_3V28 AVD level is 3.28V +*\*\ - PWR_AVD_LEVEL_3V38 AVD level is 3.38V +*\*\ - PWR_AVD_LEVEL_3V48 AVD level is 3.48V +*\*\ - PWR_AVD_LEVEL_3V58 AVD level is 3.58V +*\*\return none +**/ +void PWR_AVDLevelConfig(uint32_t level) +{ + uint32_t temp_value; + + temp_value = *(__IO uint32_t *)AVD_ContrlBaseAddress; + /* Clear ALS[3:0] bits bit */ + temp_value &= PWR_AVD_LEVEL_MASK; + /* Set ALS[3:0] bits according to level value */ + temp_value |= level; + /* Store the new value */ + *(__IO uint32_t *)AVD_ContrlBaseAddress = temp_value; +} + +/** +*\*\name PWR_VDDDPORLevelConfig. +*\*\fun Configure the voltage Power-on reset (POR) / power-down reset (PDR) of VDDD. +*\*\param mode (The input parameters must be the following values): +*\*\ - SYSTEM_RUN_MODE +*\*\ - SYSTEM_LOW_POWER_MODE +*\*\param level (The input parameters must be the following values): +*\*\ - PWR_VDDD_POR_Level_0V70 POR level is 0.70V, PDR level is 0.65V +*\*\ - PWR_VDDD_POR_Level_0V75 POR level is 0.75V, PDR level is 0.70V +*\*\ - PWR_VDDD_POR_Level_0V80 POR level is 0.80V, PDR level is 0.75V +*\*\return none +**/ +void PWR_VDDDPORLevelConfig(SYSTEM_POWER_TYPE mode, uint32_t level) +{ + __IO uint32_t temp_value; + uint32_t bitoffset ; + + temp_value = PWR->SYSCTRL4; + if(mode == SYSTEM_RUN_MODE) + { + bitoffset = PWR_VDDD_POR_LEVEL_OFFSET; + } + else + { + bitoffset = PWR_VDDD_LPPOR_LEVEL_OFFSET; + } + /* Clear ALS[3:0] bits bit */ + temp_value &= ~(PWR_VDDD_POR_Level_MASK << bitoffset); + /* Set ALS[3:0] bits according to level value */ + temp_value |= (level << bitoffset); + /* Store the new value */ + PWR->SYSCTRL4 = temp_value; +} + +/** +*\*\name PWR_DCDCPORLevelConfig. +*\*\fun Configure the voltage Power-on reset (POR) / power-down reset (PDR) of DCDC. +*\*\param mode (The input parameters must be the following values): +*\*\ - SYSTEM_RUN_MODE +*\*\ - SYSTEM_LOW_POWER_MODE +*\*\param level (The input parameters must be the following values): +*\*\ - PWR_DCDC_POR_Level_0V80 POR level is 0.80V, PDR level is 0.75V +*\*\ - PWR_DCDC_POR_Level_0V85 POR level is 0.85V, PDR level is 0.80V +*\*\ - PWR_DCDC_POR_Level_0V90 POR level is 0.90V, PDR level is 0.85V +*\*\return none +**/ +void PWR_DCDCPORLevelConfig(SYSTEM_POWER_TYPE mode, uint32_t level) +{ + __IO uint32_t* ControlRegAddr; + __IO uint32_t temp_value; + uint32_t bitoffset ; + + if(mode == SYSTEM_RUN_MODE) + { + bitoffset = PWR_DCDC_POR_LEVEL_OFFSET; + temp_value = *(__IO uint32_t *)DCDC_ContrlBaseAddress; + ControlRegAddr = (__IO uint32_t*)DCDC_ContrlBaseAddress; + } + else + { + bitoffset = PWR_DCDC_LPPOR_LEVEL_OFFSET; + ControlRegAddr = &PWR->SYSCTRL4; + temp_value = PWR->SYSCTRL4; + } + /* Clear ALS[3:0] bits bit */ + temp_value &= ~(PWR_DCDC_POR_Level_MASK << bitoffset); + /* Set ALS[3:0] bits according to level value */ + temp_value |= (level << bitoffset); + /* Store the new value */ + *ControlRegAddr = temp_value; +} + +/** +*\*\name PWR_MLDOOutputVoltageConfig. +*\*\fun Configure the voltage output of LDO. +*\*\param mode (The input parameters must be the following values): +*\*\ - SYSTEM_RUN_MODE +*\*\ - SYSTEM_LOW_POWER_MODE +*\*\param level (The input parameters must be the following values): +*\*\ - PWR_MLDO_VOLTAGE_OUTPUT_LEVEL_0V80 LDO level is 0.80V +*\*\ - PWR_MLDO_VOLTAGE_OUTPUT_LEVEL_0V85 LDO level is 0.85V +*\*\ - PWR_MLDO_VOLTAGE_OUTPUT_LEVEL_0V90 LDO level is 0.90V +*\*\return none +**/ +void PWR_MLDOOutputVoltageConfig(SYSTEM_POWER_TYPE mode, uint32_t level) +{ + __IO uint32_t temp_value; + uint32_t bitoffset ; + /* Get the old register value */ + temp_value = PWR->SYSCTRL4; + if(mode == SYSTEM_RUN_MODE) + { + bitoffset = PWR_MLDO_VOLT_OUTPUT_LEVEL_OFFSET; + } + else + { + bitoffset = PWR_MLDO_LP_VOLT_OUTPUT_LEVEL_OFFSET; + } + /* Clear ALS[3:0] bits bit */ + temp_value &= ~(PWR_MLDO_VOLTAGE_OUTPUT_LEVEL_MASK << bitoffset); + /* Set ALS[3:0] bits according to level value */ + temp_value |= (level << bitoffset); + /* Store the new value */ + PWR->SYSCTRL4 = temp_value; +} + +/** +*\*\name PWR_DCDCOutputVoltageConfig. +*\*\fun Configure the voltage output of DCDC. +*\*\param mode (The input parameters must be the following values): +*\*\ - SYSTEM_RUN_MODE +*\*\ - SYSTEM_LOW_POWER_MODE +*\*\param level (The input parameters must be the following values): +*\*\ - PWR_DCDC_VOLTAGE_OUTPUT_LEVEL_0V80 DCDC level is 0.80V +*\*\ - PWR_DCDC_VOLTAGE_OUTPUT_LEVEL_0V85 DCDC level is 0.85V +*\*\ - PWR_DCDC_VOLTAGE_OUTPUT_LEVEL_0V90 DCDC level is 0.90V +*\*\return none +**/ +void PWR_DCDCOutputVoltageConfig(SYSTEM_POWER_TYPE mode, uint32_t level) +{ + __IO uint32_t* ControlRegAddr; + __IO uint32_t temp_value; + uint32_t bitoffset ; + + if(mode == SYSTEM_RUN_MODE) + { + bitoffset = PWR_DCDC_VOLT_OUTPUT_LEVEL_OFFSET; + temp_value = *(__IO uint32_t *)DCDC_ContrlBaseAddress; + ControlRegAddr = (__IO uint32_t*)DCDC_ContrlBaseAddress; + } + else + { + bitoffset = PWR_DCDC_LP_VOLT_OUTPUT_LEVEL_OFFSET; + ControlRegAddr = &PWR->SYSCTRL4; + temp_value = PWR->SYSCTRL4; + } + /* Clear ALS[3:0] bits bit */ + temp_value &= ~(PWR_DCDC_VOLTAGE_OUTPUT_LEVEL_MASK << bitoffset); + /* Set ALS[3:0] bits according to level value */ + temp_value |= (level << bitoffset); + /* Store the new value */ + *ControlRegAddr = temp_value; +} + +/** +*\*\name PWR_BKPLDOOutputVoltageConfig. +*\*\fun Configure the voltage output of BKPLDO. +*\*\param mode (The input parameters must be the following values): +*\*\ - SYSTEM_RUN_MODE +*\*\ - SYSTEM_LOW_POWER_MODE +*\*\param level (The input parameters must be the following values): +*\*\ - PWR_BKPLDO_VOLTAGE_OUTPUT_LEVEL_0V80 BKPLDO level is 0.80V +*\*\ - PWR_BKPLDO_VOLTAGE_OUTPUT_LEVEL_0V90 BKPLDO level is 0.90V +*\*\return none +**/ +void PWR_BKPLDOOutputVoltageConfig(SYSTEM_POWER_TYPE mode, uint32_t level) +{ + __IO uint32_t temp_value; + uint32_t bitoffset ; + /* Get the old register value */ + temp_value = PWR->SYSCTRL4; + if(mode == SYSTEM_RUN_MODE) + { + bitoffset = PWR_BKPLDO_VOLT_OUTPUT_LEVEL_OFFSET; + } + else + { + bitoffset = PWR_BKPLDO_LP_VOLT_OUTPUT_LEVEL_OFFSET; + } + /* Clear bits bit */ + temp_value &= ~(PWR_BKPLDO_VOLTAGE_OUTPUT_LEVEL_MASK << bitoffset); + /* Set bits according to level value */ + temp_value |= (level << bitoffset); + /* Store the new value */ + PWR->SYSCTRL4 = temp_value; +} + +/** +*\*\name PWR_EnableLPMRVoltageOutput. +*\*\fun Enables or disables the Voltage scaling of MR in Low power mode. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_EnableLPMRVoltageOutput(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + PWR->SYSCTRL4 |= PWR_MR_LPVSELEN; + } + else + { + PWR->SYSCTRL4 &= ~PWR_MR_LPVSELEN; + } +} +/** +*\*\name PWR_EnableOPTC_LPMode. +*\*\fun Configure the OPTC PWR Mode. +*\*\param ChipStatus (The input parameters must be the following values): +*\*\ - PWR_SYSTEM_RUN +*\*\ - PWR_SYSTEM_STOP0 +*\*\ - PWR_SYSTEM_STOP2 +*\*\param OPTC_Mode : +*\*\ - OPTC_POWER_ENTER_STANDBY_MODE +*\*\ - OPTC_POWER_ENTER_DEEPSTANDBY_MODE +*\*\ - OPTC_POWER_ENTER_RUN_MODE +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_EnableOPTC_LPMode(SYSTEM_OPTC_STATUS ChipStatus, uint32_t OPTC_Mode, FunctionalState Cmd) +{ + __IO uint32_t tempreg; + /* Get the old register value */ + tempreg = PWR->SYSCTRL2; + if(Cmd == ENABLE) + { + if(ChipStatus == PWR_SYSTEM_RUN) + { + /* Clear the old value */ + tempreg &= (~(OPTC_POWER_ENTER_MODE_MASK<<22U)); + /* Set the new values */ + tempreg |= (OPTC_Mode << 22U); + } + else if(ChipStatus == PWR_SYSTEM_STOP0) + { + /* Clear the old value */ + tempreg &= (~(OPTC_POWER_ENTER_MODE_MASK<<20U)); + /* Set the new values */ + tempreg |= (OPTC_Mode << 20U); + } + else + { + /* Clear the old value */ + tempreg &= (~(OPTC_POWER_ENTER_MODE_MASK<<18U)); + /* Set the new values */ + tempreg |= (OPTC_Mode << 18U); + } + } + else + { + if(ChipStatus == PWR_SYSTEM_RUN) + { + /* Clear the old value */ + tempreg &= (~(OPTC_POWER_ENTER_MODE_MASK<<22U)); + } + else if(ChipStatus == PWR_SYSTEM_STOP0) + { + /* Clear the old value */ + tempreg &= (~(OPTC_POWER_ENTER_MODE_MASK<<20U)); + } + else + { + /* Clear the old value */ + tempreg &= (~(OPTC_POWER_ENTER_MODE_MASK<<18U)); + } + } + /* Set the power supply configuration */ + PWR->SYSCTRL2 = tempreg; +} + +/** +*\*\name PWR_EnableTCMPiece. +*\*\fun Enable the TCM Piece PWR. +*\*\param PieceIndex (The input parameters must be the following values): +*\*\ - 0-63 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_EnableTCMPiece(uint32_t PieceIndex, FunctionalState Cmd) +{ + __IO uint32_t* ControlRegAddr; + __IO uint32_t* ReadyRegAddr; + if(Cmd == ENABLE) + { + if(PieceIndex < 32U ) + { + ReadyRegAddr = &PWR->M7TCMPRDY0; + if(*ReadyRegAddr & (1U<< PieceIndex)) + { + return; + } + ControlRegAddr = &PWR->M7TCMPG0; + } + else + { + PieceIndex = PieceIndex - 32U; + ReadyRegAddr = &PWR->M7TCMPRDY1; + if(*ReadyRegAddr & (1UL<< PieceIndex)) + { + return; + } + ControlRegAddr = &PWR->M7TCMPG1; + } + /* Enable TCM Piece Bit */ + *ControlRegAddr &= ~(1UL<< PieceIndex); + /* Wait TCM Piece Power on Ready */ + while((*ReadyRegAddr & (1UL<< PieceIndex)) != (1UL<< PieceIndex)); + } + else + { + if(PieceIndex < 32U ) + { + ReadyRegAddr = &PWR->M7TCMPRDY0; + if((*ReadyRegAddr & (1UL<< PieceIndex)) == RESET ) + { + return; + } + ControlRegAddr = &PWR->M7TCMPG0; + } + else + { + PieceIndex = PieceIndex-32U; + ReadyRegAddr = &PWR->M7TCMPRDY1; + if((*ReadyRegAddr & (1UL<< PieceIndex)) == RESET ) + { + return; + } + ControlRegAddr = &PWR->M7TCMPG1; + } + /* Disable TCM Piece Bit */ + *ControlRegAddr |= (1UL<< PieceIndex); + /* Wait TCM Piece Power down Ready */ + while((*ReadyRegAddr & (1UL<< PieceIndex)) == (1UL<< PieceIndex)) ; + } +} +/** +*\*\name PWR_TCMModeSelInSTOP2. +*\*\fun Config TCM memory the low power mode when the system enter into STOP2 Enable the. +*\*\param PieceIndex (The input parameters must be the following values): +*\*\ - 0-63 +*\*\param Mode : +*\*\ - SYSTEM_MEMORY_STATUS_PD +*\*\ - SYSTEM_MEMORY_STATUS_RETENTION_1 +*\*\ - SYSTEM_MEMORY_STATUS_RETENTION_2 +*\*\return none +**/ +void PWR_TCMModeSelInSTOP2(uint32_t PieceIndex, uint32_t Mode) +{ + __IO uint32_t* ControlRegAddrLow; + __IO uint32_t* ControlRegAddrHigh; + if(PieceIndex < 32U ) + { + ControlRegAddrLow = &PWR->M7TCMRET1N0; + ControlRegAddrHigh = &PWR->M7TCMRET2N0; + } + else + { + PieceIndex = PieceIndex - 32U; + ControlRegAddrLow = &PWR->M7TCMRET1N1; + ControlRegAddrHigh = &PWR->M7TCMRET2N1; + } + if(Mode == SYSTEM_MEMORY_STATUS_PD) + { + /* Set [M7TCMRET2Nx M7TCMRET1Nx] = [00]*/ + *ControlRegAddrLow &= ~(1UL<< PieceIndex); + *ControlRegAddrHigh &= ~(1UL<< PieceIndex); + } + else if(Mode == SYSTEM_MEMORY_STATUS_RETENTION_1) + { + /* Set [M7TCMRET2Nx M7TCMRET1Nx] = [11]*/ + *ControlRegAddrLow |= (1UL<< PieceIndex); + *ControlRegAddrHigh |= (1UL<< PieceIndex); + } + else if(Mode == SYSTEM_MEMORY_STATUS_RETENTION_2) + { + /* Set [M7TCMRET2Nx M7TCMRET1Nx] = [10]*/ + *ControlRegAddrLow &= ~(1UL<< PieceIndex); + *ControlRegAddrHigh |= (1UL<< PieceIndex); + } + else + { + /* no process*/ + } +} +/** +*\*\name PWR_SystemMemoryModeSelInSTOP2. +*\*\fun Config system memory the low power mode when the system enter into STOP2. +*\*\param SysMemoryType (The input parameters must be the following values): +*\*\ - SYSTEM_MEMORY_AXISRAM +*\*\ - SYSTEM_MEMORY_AHBSRAM1 +*\*\ - SYSTEM_MEMORY_AHBSRAM2 +*\*\ - SYSTEM_MEMORY_AHBSRAM3 +*\*\ - SYSTEM_MEMORY_AHBSRAM4 +*\*\ - SYSTEM_MEMORY_AHBSRAM5S1 +*\*\ - SYSTEM_MEMORY_AHBSRAM5S2 +*\*\param Mode : +*\*\ - SYSTEM_MEMORY_STATUS_PD +*\*\ - SYSTEM_MEMORY_STATUS_RETENTION_1 +*\*\ - SYSTEM_MEMORY_STATUS_RETENTION_2 +*\*\return none +**/ +void PWR_SystemMemoryModeSelInSTOP2(SYSTEM_MEMORY_TYPE SysMemoryType, uint32_t Mode) +{ + __IO uint32_t tempreg; + uint32_t bitoffset ; + + bitoffset = SYSTEM_MEMORY_AXISRAM_BITOFFSET; + bitoffset += 2u*((uint32_t)SysMemoryType); + + /* Get the old register value */ + tempreg = PWR->SYSMEMLPCTRL; + /* Clear the old value */ + tempreg &= (~(SYSTEM_MEMORY_STATUS_MASK<< bitoffset)); + /* Set the new values */ + tempreg |= (Mode << bitoffset); + /* Store the new values */ + PWR->SYSMEMLPCTRL = tempreg; +} + +/** +*\*\name PWR_SystemMemoryModeSelInSTOP0. +*\*\fun Config system memory the low power mode when the system enter into STOP0. +*\*\param Mode (The input parameters must be the following values): +*\*\ - ALL_SYSTEM_MEMORY_STATUS_CHIP_DISABLE +*\*\ - ALL_SYSTEM_MEMORY_STATUS_PRECHARGE +*\*\ - ALL_SYSTEM_MEMORY_STATUS_RETENTION_1 +*\*\return none +**/ +void PWR_SystemMemoryModeSelInSTOP0(uint32_t Mode) +{ + __IO uint32_t tempreg; + + /* Get the old register value */ + tempreg = PWR->SYSMEMLPCTRL; + /* Clear the old value */ + tempreg &= (~ALL_SYSTEM_MEMORY_STATUS_MASK); + /* Set the new values */ + tempreg |= Mode; + /* Store the new values */ + PWR->SYSMEMLPCTRL = tempreg; +} + +/** +*\*\name PWR_EnableSystemMemory. +*\*\fun Enable or disable system memory power when the system in SYSTEM_RUN mode. +*\*\param SysMemoryType (The input parameters must be the following values): +*\*\ - SYSTEM_MEMORY_AXISRAM +*\*\ - SYSTEM_MEMORY_AHBSRAM1 +*\*\ - SYSTEM_MEMORY_AHBSRAM2 +*\*\ - SYSTEM_MEMORY_AHBSRAM3 +*\*\ - SYSTEM_MEMORY_AHBSRAM4 +*\*\ - SYSTEM_MEMORY_AHBSRAM5S1 +*\*\ - SYSTEM_MEMORY_AHBSRAM5S2 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_EnableSystemMemory(SYSTEM_MEMORY_TYPE SysMemoryType, FunctionalState Cmd) +{ + uint8_t bitoffset ; + + bitoffset = (uint8_t)SysMemoryType; + if(Cmd == ENABLE) + { + /* Enable system memory power */ + PWR->SYSMEMLPCTRL &= (~((uint32_t)0x01u << bitoffset)); + } + else + { + /* Disable system memory power */ + PWR->SYSMEMLPCTRL |= ((uint32_t)0x01u << bitoffset); + } +} +/** +*\*\name PWR_HSC1_HSC2_GRAPHIC_DomainEnable. +*\*\fun Enables or disables HSC1/HSC2/Grpahic Domain power. +*\*\param DOMAIN_Type: +*\*\ - HSC1_Domain +*\*\ - HSC2_Domain +*\*\ - GRAPHIC_Domain +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +static void PWR_HSC1_HSC2_GRAPHIC_DomainEnable(DOMAIN_Type DomainType, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + /*Select the switcher mode */ + PWR->SYSCTRL3 |= (PWR_SYSCTRL3_GRC_PSWACK1<< DomainType); + /*Enable the domain power */ + PWR->SYSCTRL3 |= (PWR_SYSCTRL3_GRC_PWREN<< DomainType); + /*wait power on ready flag */ + while( (PWR->SYSCTRL3& (PWR_SYSCTRL3_GRC_PWRRDY<< DomainType)) != (PWR_SYSCTRL3_GRC_PWRRDY<< DomainType)); + /*Set domain out of reset state*/ + PWR->SYSCTRL3 |= (PWR_SYSCTRL3_GRC_FUCEN<< DomainType); + /* remove isolation on domain output signals*/ + PWR->SYSCTRL3 |= (PWR_SYSCTRL3_GRC_ISNEN<< DomainType); + } + else + { + /* Apply isolation on domain domain output signals*/ + PWR->SYSCTRL3 &= ~(PWR_SYSCTRL3_GRC_ISNEN<< DomainType); + /*Set domain domain reset state*/ + PWR->SYSCTRL3 &= ~(PWR_SYSCTRL3_GRC_FUCEN<< DomainType); + /*Disable the domain power */ + PWR->SYSCTRL3 &= ~(PWR_SYSCTRL3_GRC_PWREN<< DomainType); + + /*wait the power down ready flag */ + while((PWR->SYSCTRL3& (PWR_SYSCTRL3_GRC_PWRRDY<< DomainType)) == (PWR_SYSCTRL3_GRC_PWRRDY<< DomainType)); + } +} + + +/** +*\*\name PWR_ESC_DomainEnable. +*\*\fun Enables or disables ESC Domain power. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +static void PWR_ESC_DomainEnable(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + /*Select the switcher mode */ + PWR->ESCCTRL |= (ESC_PSWACK1); + /*Enable the ESC power */ + PWR->ESCCTRL |= (ESC_POWER_ENABLE); + /*wait power on ready flag */ + while((PWR->ESCCTRL& (ESC_POWER_RDY)) != ESC_POWER_RDY); + /*Set ESC out of reset state*/ + PWR->ESCCTRL |= (ESC_FUNCTION_ENABLE); + /* remove isolation on ESC output signals*/ + PWR->ESCCTRL |= (ESC_ISOLATION_ENABLE); + } + else + { + /* Apply isolation on ESC output signals*/ + PWR->ESCCTRL &= ~(ESC_ISOLATION_ENABLE); + /*Set ESC reset state*/ + PWR->ESCCTRL &= ~(ESC_FUNCTION_ENABLE); + /*Disable the ESC power */ + PWR->ESCCTRL &= ~(ESC_POWER_ENABLE); + + /*wait the power down ready flag */ + while((PWR->ESCCTRL& ESC_POWER_RDY) == ESC_POWER_RDY); + } +} + +/** +*\*\name PWR_MDMA_DomainEnable. +*\*\fun Enables or disables MDMA power. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_MDMA_DomainEnable(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + /*Select the switcher mode */ + PWR->MDMACTRL |= (MDMA_PSWACK1); + /*Enable the MDMA power */ + PWR->MDMACTRL |= (MDMA_POWER_ENABLE); + /*wait power on ready flag */ + while((PWR->MDMACTRL& (MDMA_POWER_RDY)) != MDMA_POWER_RDY); + /*Set MDMA out of reset state*/ + PWR->MDMACTRL |= (MDMA_FUNCTION_ENABLE); + /* remove isolation on MDMA output signals*/ + PWR->MDMACTRL |= (MDMA_ISOLATION_ENABLE); + } + else + { + /* Apply isolation on MDMA output signals*/ + PWR->MDMACTRL &= ~(MDMA_ISOLATION_ENABLE); + /*Set MDMA reset state*/ + PWR->MDMACTRL &= ~(MDMA_FUNCTION_ENABLE); + /*Disable the MDMA power */ + PWR->MDMACTRL &= ~(MDMA_POWER_ENABLE); + + /*wait the power down ready flag */ + while((PWR->MDMACTRL& MDMA_POWER_RDY) == MDMA_POWER_RDY); + } +} + +/** +*\*\name PWR_SHRTIM_DomainEnable. +*\*\fun Enables or disables shrtimx power. +*\*\param shrtimx : +*\*\ - Power_SHRTIM1 +*\*\ - Power_SHRTIM2 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_SHRTIM_DomainEnable(SHRTIM_PowerType shrtimx, FunctionalState Cmd) //test +{ + if(Cmd == ENABLE) + { + if((PWR->SHRTIMCTRL& SHRTIMA_POWER_RDY) != SHRTIMA_POWER_RDY) + { + /*Power on SHRTIM AFE First */ + /*Select the switcher mode */ + PWR->SHRTIMCTRL |= (SHRTIMA_PSWACK1); + /*Enable the SHRTIM AFE power */ + PWR->SHRTIMCTRL |= (SHRTIMA_POWER_ENABLE); + /*wait power on ready flag */ + while((PWR->SHRTIMCTRL& SHRTIMA_POWER_RDY) != SHRTIMA_POWER_RDY); + /*Set SHRTIM AFE out of reset state*/ + PWR->SHRTIMCTRL |= (SHRTIMA_FUNCTION_ENABLE); + /* remove isolation on SHRTIM AFE output signals*/ + PWR->SHRTIMCTRL |= (SHRTIMA_ISOLATION_ENABLE); + } + else + { + /*no process*/ + } + + /*Then power on SHRTIM1 or SHRTIM2 */ + /*Select the switcher mode */ + PWR->SHRTIMCTRL |= (SHRTIM1_PSWACK1<<(8U*(uint32_t)shrtimx)); + /*Enable the SHRTIM AFE power */ + PWR->SHRTIMCTRL |= (SHRTIM1_POWER_ENABLE<<(8U*(uint32_t)shrtimx)); + /*wait power on ready flag */ + while((PWR->SHRTIMCTRL& (SHRTIM1_POWER_RDY<<(8U*(uint32_t)shrtimx))) != (SHRTIM1_POWER_RDY<< (8U*(uint32_t)shrtimx))); + /*Set SHRTIM AFE out of reset state*/ + PWR->SHRTIMCTRL |= (SHRTIM1_FUNCTION_ENABLE<<(8U*(uint32_t)shrtimx)); + /* remove isolation on SHRTIM AFE output signals*/ + PWR->SHRTIMCTRL |= (SHRTIM1_ISOLATION_ENABLE<<(8U*(uint32_t)shrtimx)); + } + else + { + /*Power off SHRTIM1 or SHRTIM2 First */ + /* Apply isolation on SHRTIM AFE output signals*/ + PWR->SHRTIMCTRL &= ~(SHRTIM1_ISOLATION_ENABLE<<(8U*(uint32_t)shrtimx)); + /*Set SHRTIM AFE reset state*/ + PWR->SHRTIMCTRL &= ~(SHRTIM1_FUNCTION_ENABLE<<(8U*(uint32_t)shrtimx)); + /*Disable the SHRTIM AFE power */ + PWR->SHRTIMCTRL &= ~(SHRTIM1_POWER_ENABLE<<(8U*(uint32_t)shrtimx)); + + /*wait the power down ready flag */ + while((PWR->SHRTIMCTRL& (SHRTIM1_POWER_RDY<<(8U*(uint32_t)shrtimx))) == (SHRTIM1_POWER_RDY<<(8U*(uint32_t)shrtimx))); + + /*if Both SHRTIM1 and SHRTIM2 off, then power off SHRTIM AFE */ + if( (((PWR->SHRTIMCTRL&SHRTIM2_POWER_RDY) != SHRTIM2_POWER_RDY )&&(shrtimx == Power_SHRTIM1)) + ||(((PWR->SHRTIMCTRL&SHRTIM1_POWER_RDY) != SHRTIM1_POWER_RDY )&&(shrtimx == Power_SHRTIM2)) ) + { + /* Apply isolation on SHRTIM AFE output signals*/ + PWR->SHRTIMCTRL &= ~(SHRTIMA_ISOLATION_ENABLE); + /*Set SHRTIM AFE reset state*/ + PWR->SHRTIMCTRL &= ~(SHRTIMA_FUNCTION_ENABLE); + /*Disable the SHRTIM AFE power */ + PWR->SHRTIMCTRL &= ~(SHRTIMA_POWER_ENABLE); + + /*wait the power down ready flag */ + while((PWR->SHRTIMCTRL& SHRTIMA_POWER_RDY) == SHRTIMA_POWER_RDY); + } + else + { + /*no process*/ + } + } +} + +/** +*\*\name PWR_MoudlePowerEnable. +*\*\fun Enables or disables the specified module power. +*\*\param module : +*\*\ - GRAPHIC_GPU_PWRCTRL +*\*\ - GRAPHIC_LCDC_PWRCTRL +*\*\ - GRAPHIC_JPEG_PWRCTRL +*\*\ - GRAPHIC_DSI_PWRCTRL +*\*\ - GRAPHIC_DVP_PWRCTRL +*\*\ - HSC2_ETH2_PWRCTRL +*\*\ - HSC2_USB2_PWRCTRL +*\*\ - HSC2_SDMMC2_PWRCTRL +*\*\ - HSC1_ETH1_PWRCTRL +*\*\ - HSC1_USB1_PWRCTRL +*\*\ - HSC1_SDMMC1_PWRCTRL +*\*\ - FMAC_PWRCTRL +*\*\ - ESC_PWRCTRL +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_MoudlePowerEnable(uint32_t module, FunctionalState Cmd) +{ + if( (module == GRAPHIC_GPU_PWRCTRL) ||(module == GRAPHIC_LCDC_PWRCTRL)|| \ + (module == GRAPHIC_JPEG_PWRCTRL)||(module == GRAPHIC_DSI_PWRCTRL) || (module == GRAPHIC_DVP_PWRCTRL)) + { + if(Cmd == ENABLE) + { + PWR->IPMEMCTRL &= (~module); + while((PWR->IPMEMCTRLSTS & module ) != module); + if( (PWR->SYSCTRL3&PWR_SYSCTRL3_GRC_PWRRDY) != PWR_SYSCTRL3_GRC_PWRRDY) + { + PWR_HSC1_HSC2_GRAPHIC_DomainEnable(GRAPHIC_Domain, ENABLE); + } + else + { + /*no process*/ + } + } + else + { + if((PWR->IPMEMCTRLSTS&GRAPHIC_MODULE_MASK) == module) + { + PWR_HSC1_HSC2_GRAPHIC_DomainEnable(GRAPHIC_Domain, DISABLE); + } + else + { + /*no process*/ + } + PWR->IPMEMCTRL |= module; + while((PWR->IPMEMCTRLSTS & module ) == module); + } + } + else if((module == HSC2_ETH2_PWRCTRL) ||(module == HSC2_USB2_PWRCTRL)||(module == HSC2_SDMMC2_PWRCTRL)) + { + if(Cmd == ENABLE) + { + PWR->IPMEMCTRL &= (~module); + while((PWR->IPMEMCTRLSTS & module ) != module); + if( (PWR->SYSCTRL3&PWR_SYSCTRL3_HSC2_PWRRDY) != PWR_SYSCTRL3_HSC2_PWRRDY) + { + PWR_HSC1_HSC2_GRAPHIC_DomainEnable(HSC2_Domain, ENABLE); + } + else + { + /*no process*/ + } + } + else + { + if((PWR->IPMEMCTRLSTS&HSC2_MODULE_MASK) == module) + { + PWR_HSC1_HSC2_GRAPHIC_DomainEnable(HSC2_Domain, DISABLE); + } + else + { + /*no process*/ + } + PWR->IPMEMCTRL |= module; + while((PWR->IPMEMCTRLSTS & module ) == module); + } + } + else if((module == HSC1_ETH1_PWRCTRL) ||(module == HSC1_USB1_PWRCTRL)||(module == HSC1_SDMMC1_PWRCTRL)) + { + if(Cmd == ENABLE) + { + PWR->IPMEMCTRL &= (~module); + while((PWR->IPMEMCTRLSTS & module ) != module); + if( (PWR->SYSCTRL3&PWR_SYSCTRL3_HSC1_PWRRDY) != PWR_SYSCTRL3_HSC1_PWRRDY) + { + PWR_HSC1_HSC2_GRAPHIC_DomainEnable(HSC1_Domain, ENABLE); + } + else + { + /*no process*/ + } + } + else + { + if((PWR->IPMEMCTRLSTS&HSC1_MODULE_MASK) == module) + { + PWR_HSC1_HSC2_GRAPHIC_DomainEnable(HSC1_Domain, DISABLE); + } + else + { + /*no process*/ + } + PWR->IPMEMCTRL |= module; + while((PWR->IPMEMCTRLSTS & module ) == module); + } + } + else if(module == ESC_PWRCTRL) + { + if(Cmd == ENABLE) + { + PWR->IPMEMCTRL &= (~ESC_PWRCTRL); + while((PWR->IPMEMCTRLSTS & ESC_PWRRDY_FLAG ) != ESC_PWRRDY_FLAG); + PWR_ESC_DomainEnable(ENABLE); + } + else + { + PWR_ESC_DomainEnable(DISABLE); + PWR->IPMEMCTRL |= ESC_PWRCTRL; + while((PWR->IPMEMCTRLSTS & ESC_PWRRDY_FLAG) == ESC_PWRRDY_FLAG); + } + } + else if(module == FMAC_PWRCTRL) + { + if(Cmd == ENABLE) + { + PWR->IPMEMCTRL &= (~FMAC_PWRCTRL); + while((PWR->IPMEMCTRLSTS & FMAC_PWRRDY_FLAG ) != FMAC_PWRRDY_FLAG); + } + else + { + PWR->IPMEMCTRL |= FMAC_PWRCTRL; + while((PWR->IPMEMCTRLSTS & FMAC_PWRRDY_FLAG) == FMAC_PWRRDY_FLAG); + } + } + else + { + /*no process */ + } +} + +/** +*\*\name PWR_EnableBKPSRAMRetainInStandbyMode. +*\*\fun Enable or disable BKP SRAM retain in standby mode. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void PWR_EnableBKPSRAMRetainInStandbyMode(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + /* Set BSRSTBRET bit */ + //*ControlRegAddr |= PWR_STBRET_ENABLE; + PWR->M4CTRL2 |= PWR_STBRET_ENABLE; + PWR->M7CTRL2 |= PWR_STBRET_ENABLE; + } + else + { + /* Reset BSRSTBRET bit */ + //*ControlRegAddr &= (~PWR_STBRET_ENABLE); + PWR->M4CTRL2 &= (~PWR_STBRET_ENABLE); + PWR->M7CTRL2 &= (~PWR_STBRET_ENABLE); + } +} + + +/** +*\*\name PWR_EnableBKPSRAMRetainInVbatMode. +*\*\fun Enable or disable BKP SRAM retain in Vbat mode. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void PWR_EnableBKPSRAMRetainInVbatMode(FunctionalState Cmd) +{ + __IO uint32_t* ControlRegAddr; + /*Get contrl register address*/ + if(Get_CurrentCPU() == CM7_CPU) + { + ControlRegAddr = &PWR->M7CTRL2; + } + else + { + ControlRegAddr = &PWR->M4CTRL2; + } + if(Cmd == ENABLE) + { + /* Set BSRVBRET bit */ + *ControlRegAddr |= PWR_VBATRET_ENABLE; + } + else + { + /* Reset BSRVBRET bit */ + *ControlRegAddr &= (~PWR_VBATRET_ENABLE); + } +} + +/** +*\*\name PWR_WakeUpPinEnable. +*\*\fun Enables the Wakeup Pin functionality. +*\*\param pin (The input parameters must be the following values): +*\*\ - WAKEUP_PIN0EN WKUP0(PA0) +*\*\ - WAKEUP_PIN1EN WKUP1(PA2) +*\*\ - WAKEUP_PIN2EN WKUP2(PC13) +*\*\ - WAKEUP_PIN3EN WKUP3(PI8) +*\*\ - WAKEUP_PIN4EN WKUP4(PI11) +*\*\ - WAKEUP_PIN5EN WKUP5(PC1) +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_WakeUpPinEnable(uint32_t pin, FunctionalState Cmd) +{ + __IO uint32_t* ControlRegAddr; + /*Get contrl register address*/ + if(Get_CurrentCPU() == CM7_CPU) + { + ControlRegAddr = &PWR->M7CTRLSTS; + } + else + { + ControlRegAddr = &PWR->M4CTRLSTS; + } + + if(Cmd == ENABLE) + { + /* Set WKUPxEN bit */ + *ControlRegAddr |= pin; + } + else + { + /* Clear WKUPxEN bit*/ + *ControlRegAddr &= (~pin); + } +} + +/** +*\*\name PWR_WakeUpPinPolarity. +*\*\fun Enables the Wakeup Pin polarity. +*\*\param pin (The input parameters must be the following values): +*\*\ - WAKEUP_PIN0POL WKUP0(PA0) +*\*\ - WAKEUP_PIN1POL WKUP1(PA2) +*\*\ - WAKEUP_PIN2POL WKUP2(PC13) +*\*\ - WAKEUP_PIN3POL WKUP3(PI8) +*\*\ - WAKEUP_PIN4POL WKUP4(PI11) +*\*\ - WAKEUP_PIN5POL WKUP5(PC1) +*\*\param polarity (The input parameters must be the following values): +*\*\ - POL_HIGH +*\*\ - POL_LOW +*\*\return none +**/ +void PWR_WakeUpPinPolarity(uint32_t pin, WAKEUP_PIN_POL polarity) +{ + __IO uint32_t* ControlRegAddr; + + /*Get contrl register address*/ + if(Get_CurrentCPU() == CM7_CPU) + { + ControlRegAddr = &PWR->M7CTRLSTS; + } + else + { + ControlRegAddr = &PWR->M4CTRLSTS; + } + + if(polarity == POL_LOW) + { + /* Set WKUPxPOL bit */ + *ControlRegAddr |= pin; + } + else + { + /* Clear WKUPxPOL bit*/ + *ControlRegAddr &= (~pin); + } +} + + +/** +*\*\name PWR_GetFlagStatus. +*\*\fun Checks whether the specified PWR flag is set or not. +*\*\param PWR_FLAG (specifies the flag to check): +*\*\ This parameter can be one of the following values: +*\*\ - PWR_FLAG_WKUP0 PA0 Wake Up flag +*\*\ - PWR_FLAG_WKUP1 PA2 Wake Up flag +*\*\ - PWR_FLAG_WKUP2 PC13 Wake Up flag +*\*\ - PWR_FLAG_WKUP3 PI8 Wake Up flag +*\*\ - PWR_FLAG_WKUP4 PI11 Wake Up flag +*\*\ - PWR_FLAG_WKUP5 PC1 Wake Up flag +*\*\ - PWR_FLAG_WKUPP RTC Wake Up flag +*\*\ - PWR_FLAG_STANDBY StandBy mode flag +*\*\ - PWR_FLAG_VBAT VBAT mode flag +*\*\return The new state of PWR_FLAG +*\*\ - SET +*\*\ - RESET + */ +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG) +{ + FlagStatus bitstatus; + __IO uint32_t* ControlRegAddr; + + /*Get contrl register address*/ + if(Get_CurrentCPU() == CM7_CPU) + { + ControlRegAddr = &PWR->M7CTRLSTS; + } + else + { + ControlRegAddr = &PWR->M4CTRLSTS; + } + /* Check the parameters */ + if (((*ControlRegAddr) & PWR_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** +*\*\name PWR_GetSystemFlagStatus. +*\*\fun Checks whether the specified System PWR flag is set or not. +*\*\param PWR_FLAG (specifies the flag to check): +*\*\ This parameter can be one of the following values: +*\*\ - PWR_SYSFLAG_PVDO +*\*\ - PWR_SYSFLAG_AVDO +*\*\ - PWR_SYSFLAG_OTPRDY +*\*\ - PWR_FLAG_DCDCBP +*\*\return The new state of PWR_FLAG +*\*\ - SET +*\*\ - RESET + */ +FlagStatus PWR_GetSystemFlagStatus(uint32_t PWR_FLAG) +{ + FlagStatus bitstatus; + + /* Check the parameters */ + if ((PWR->SYSCTRLSTS & PWR_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} +/** +*\*\name PWR_ClearFlag. +*\*\fun Clears the PWR's pending flags. +*\*\param PWR_FLAG (specifies the flag to clear): +*\*\ This parameter can be one of the following values: +*\*\ - PWR_CLR_WKUPx PA0/PA2/PC13/PI8/PI11/PC1/RTC Wake Up flag +*\*\ - PWR_CLR_STANDBY StandBy mode flag +*\*\ - PWR_CLR_VBAT VBAT mode flag +*\*\return none + */ +void PWR_ClearFlag(uint32_t PWR_FLAG) +{ + __IO uint32_t* ControlRegAddr; + + /*Get contrl register address*/ + if(Get_CurrentCPU() == CM7_CPU) + { + ControlRegAddr = &PWR->M7CTRL1; + } + else + { + ControlRegAddr = &PWR->M4CTRL1; + } + /* Clear PWR_CLR_WKUPx or PWR_CLR_STANDBY PWR_CLR_VBAT bit */ + *ControlRegAddr |= PWR_FLAG; +} + + +/** +*\*\name PWR_WakeUpRTCEnable. +*\*\fun Enables the Wakeup RTC functionality. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_WakeUpRTCEnable(FunctionalState Cmd) +{ + __IO uint32_t* ControlRegAddr; + + /*Get contrl register address*/ + if(Get_CurrentCPU() == CM7_CPU) + { + ControlRegAddr = &PWR->M7CTRL2; + } + else + { + ControlRegAddr = &PWR->M4CTRL2; + } + if(Cmd == ENABLE) + { + *ControlRegAddr |= WAKEUP_RTCEN; + } + else + { + *ControlRegAddr &= ~WAKEUP_RTCEN; + } +} + +/** +*\*\name PWR_WakeUpNRSTEnable. +*\*\fun Enable or Disable NRST Wakeup functionality in standby mode. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void PWR_WakeUpNRSTEnable(FunctionalState Cmd) +{ + __IO uint32_t* ControlRegAddr; + + /*Get contrl register address*/ + if(Get_CurrentCPU() == CM7_CPU) + { + ControlRegAddr = &PWR->M7CTRL2; + } + else + { + ControlRegAddr = &PWR->M4CTRL2; + } + if(Cmd == ENABLE) + { + *ControlRegAddr |= WAKEUP_NRSTEN; + } + else + { + *ControlRegAddr &= ~WAKEUP_NRSTEN; + } +} + + +/** +*\*\name PWR_EnterSLEEPMode. +*\*\fun System Enters SLEEP mode. +*\*\param SLEEPONEXIT (The input parameters must be the following values): +*\*\ - PWR_SLEEP_ON_EXIT +*\*\ - PWR_SLEEP_NOW +*\*\param PWR_STOPEntry (The input parameters must be the following values): +*\*\ - PWR_SLEEPENTRY_WFI enter SLEEP mode with WFI instruction +*\*\ - PWR_SLEEPENTRY_WFE enter SLEEP mode with WFE instruction +*\*\return none +**/ +void PWR_EnterSLEEPMode(uint8_t SLEEPONEXIT, uint8_t PWR_SLEEPEntry) +{ + __IO uint32_t* ControlRegAddr; + + /*Get contrl register address*/ + if(Get_CurrentCPU() == CM7_CPU) + { + ControlRegAddr = &PWR->M7CTRL2; + } + else + { + ControlRegAddr = &PWR->M4CTRL2; + } + /* Clear STOP2S bits */ + *ControlRegAddr &= ~PWR_STOP2EN; + + /* CLEAR SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= ~((uint32_t)SCB_SCR_SLEEPDEEP); + + /* Select SLEEPONEXIT mode entry ------------------------------------------*/ + if(SLEEPONEXIT == 1) + { + /* the MCU enters Sleep mode as soon as it exits the lowest priority ISR */ + SCB->SCR |= SCB_SCR_SLEEPONEXIT; + } + else if(SLEEPONEXIT == 0) + { + /* Sleep-now */ + SCB->SCR &= (uint32_t)(~(uint32_t)SCB_SCR_SLEEPONEXIT); + } + else + { + /* no process */ + } + + /* Select SLEEP mode entry ------------------------------------------------*/ + if(PWR_SLEEPEntry == PWR_SLEEPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } +} + + +/** +*\*\name PWR_EnterSTOP0Mode. +*\*\fun System Enters STOP0 mode. +*\*\param PWR_STOPEntry (The input parameters must be the following values): +*\*\ - PWR_STOPENTRY_WFI enter STOP mode with WFI instruction +*\*\ - PWR_STOPENTRY_WFE enter STOP mode with WFE instruction +*\*\return none +**/ +void PWR_EnterSTOP0Mode(uint8_t PWR_STOPEntry) +{ + __IO uint32_t* ControlRegAddr1; + __IO uint32_t* ControlRegAddr2; + /*Get contrl register address*/ + if(Get_CurrentCPU() == CM7_CPU) + { + ControlRegAddr1 = &PWR->M7CTRL1; + ControlRegAddr2 = &PWR->M7CTRL2; + } + else + { + ControlRegAddr1 = &PWR->M4CTRL1; + ControlRegAddr2 = &PWR->M4CTRL2; + } + /* Clear PDDS */ + *ControlRegAddr1 &= ~PWR_PDSEN; + /* Clear STOP2S bits */ + *ControlRegAddr2 &= ~PWR_STOP2EN; + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP; + + /* Select STOP mode entry -----------------------------*/ + if (PWR_STOPEntry == PWR_STOPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } + + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)(~(uint32_t)SCB_SCR_SLEEPDEEP); +} + + +/** +*\*\name PWR_EnterSTOP2Mode. +*\*\fun System Enters STOP2 mode. +*\*\param PWR_STOPEntry (The input parameters must be the following values): +*\*\ - PWR_STOPENTRY_WFI enter STOP mode with WFI instruction +*\*\ - PWR_STOPENTRY_WFE enter STOP mode with WFE instruction +*\*\return none +**/ +void PWR_EnterSTOP2Mode(uint8_t PWR_STOPEntry) +{ + __IO uint32_t* ControlRegAddr1; + __IO uint32_t* ControlRegAddr2; + /*Get contrl register address*/ + if(Get_CurrentCPU() == CM7_CPU) + { + ControlRegAddr1 = &PWR->M7CTRL1; + ControlRegAddr2 = &PWR->M7CTRL2; + } + else + { + ControlRegAddr1 = &PWR->M4CTRL1; + ControlRegAddr2 = &PWR->M4CTRL2; + } + /* Clear PDDS */ + *ControlRegAddr1 &= ~PWR_PDSEN; + /* Clear STOP2S bits */ + *ControlRegAddr2 |= PWR_STOP2EN; + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP; + + /* Select STOP mode entry -----------------------------*/ + if (PWR_STOPEntry == PWR_STOPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } + + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)(~(uint32_t)SCB_SCR_SLEEPDEEP); +} + +/** +*\*\name PWR_EnterSTANDBYMode. +*\*\fun System Enters STANDBY mode. +*\*\param none +*\*\return none +**/ +void PWR_EnterSTANDBYMode(void) +{ + __IO uint32_t* ControlRegAddr1; + __IO uint32_t* ControlRegAddr2; + /*Get contrl register address*/ + if(Get_CurrentCPU() == CM7_CPU) + { + ControlRegAddr1 = &PWR->M7CTRL1; + ControlRegAddr2 = &PWR->M7CTRL2; + } + else + { + ControlRegAddr1 = &PWR->M4CTRL1; + ControlRegAddr2 = &PWR->M4CTRL2; + } + /* Clear Wake-up flag */ + *ControlRegAddr1 |= PWR_CLR_WKUPx; + /* Clear STOP2S bits */ + *ControlRegAddr2 &= ~PWR_STOP2EN; + /* Set PDDS bit to select STANDBY mode */ + *ControlRegAddr1 |= PWR_PDSEN; + /*Off BG , 1A version ,1B version will remove this*/ + PWR->SYSCTRL2 &= ~0x400U; + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP; + +/* This option is used to ensure that store operations are completed */ +#if defined(__CC_ARM) + __force_stores(); +#endif + /* Request Wait For Interrupt */ + __WFI(); + +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_rcc.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_rcc.c new file mode 100644 index 0000000000..0fba98007e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_rcc.c @@ -0,0 +1,9078 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_rcc.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_rcc.h" +#include + +/** RCC Private Defines **/ +#define __RCC_DELAY_US(usec) do{ \ + uint32_t delay_end; \ + CPU_DELAY_INTI(); \ + /* Delay*/ \ + delay_end = DWT_CYCCNT + (usec * (600000000/1000000)); \ + while(DWT_CYCCNT < delay_end){}; \ + CPU_DELAY_DISABLE(); \ + }while(0) + + +/** RCC Driving Functions Declaration **/ +/** + *\*\name RCC_Reset + *\*\fun Resets the RCC clock configuration to the default reset state. + *\*\param None + *\*\return None + */ +void RCC_DeInit(void) +{ + + /* Set HSIEN bit */ + RCC->SRCCTRL1 |= (uint32_t)0x00000001U; + + /* Reset SCLKSW, MSIEN ,HSEBP, HSEEN bits */ + RCC->SRCCTRL1 &= (uint32_t)0xFCFFFFABU; + + /* Reset M7HYPSEL,AXIHYPSEL*/ + RCC->SRCCTRL2 &= (uint32_t)0xFFFCFFFFU; + + /* Reset SYSBUSDIV1, SYSBUSDIV2 */ + RCC->SYSBUSDIV1 = RCC_REG_BIT_MASK; + RCC->SYSBUSDIV2 = RCC_REG_BIT_MASK; + + /* Reset PLL1CTRL1 */ + RCC->PLL1CTRL1 = (uint32_t)0x19030004U; + + /* Reset PLL2CTRL1 */ + RCC->PLL2CTRL1 &= (uint32_t)0x19030005U; + + /* Reset PLL3CTRL1 */ + RCC->PLL3CTRL1 &= (uint32_t)0x19030005U; + + /* Reset CFG2 register */ + RCC->CFG2 = 0x55ACCCCCU; + + /* Reset CFG3 register */ + RCC->CFG3 = 0x00000044U; + + /* Reset CFG4 register */ + RCC->CFG4 = 0xFFFFFDFEU; + + /* Reset CFG5 register */ + RCC->CFG5 = 0x02C10000U; + + /* Disable all interrupts and clear pending bits */ + RCC->CLKINT1 = RCC_REG_BIT_MASK; + RCC->CLKINT2 = RCC_REG_BIT_MASK; + RCC->CLKINT3 = RCC_REG_BIT_MASK; +} + +/** +*\*\name RCC_ConfigHse. +*\*\fun Configures the External High Speed oscillator (HSE). +*\*\param RCC_HSE : +*\*\ - RCC_HSE_DISABLE HSE oscillator OFF +*\*\ - RCC_HSE_ENABLE HSE oscillator ON +*\*\ - RCC_HSE_BYPASS HSE oscillator bypassed with external clock +*\*\return none: +*\*\note HSE can not be stopped if it is used directly or through the PLL as system clock +**/ +void RCC_ConfigHse(uint32_t RCC_HSE) +{ + if(RCC_HSE == RCC_HSE_DISABLE) + { + /* Reset HSEEN bit */ + RCC->SRCCTRL1 &= (~(RCC_HSE_ENABLE | RCC_HSE_BYPASS)); + } + else + { + /* Reset HSERDCNTEN bit */ + RCC->SRCCTRL1 &= (~RCC_HSE_RDCNTEN); + + if (RCC_HSE == RCC_HSE_BYPASS) + { + if((RCC->SRCCTRL1 & RCC_HSE_ENABLE) == RCC_HSE_ENABLE) + { + /* Reset HSEEN bit */ + RCC->SRCCTRL1 &= (~RCC_HSE_ENABLE); + } + + /* Set HSEBP bits */ + RCC->SRCCTRL1 |= RCC_HSE_BYPASS; + } + + /* Set HSEEN bit */ + RCC->SRCCTRL1 |= RCC_HSE_ENABLE; + __RCC_DELAY_US(50); + /* Set HSERDCNTEN bit */ + RCC->SRCCTRL1 |= (RCC_HSE_RDCNTEN); + + } +} + +/** +*\*\name RCC_WaitHseStable. +*\*\fun Waits for HSE start-up. +*\*\param none +*\*\return ErrorStatus: + *\*\ - SUCCESS HSE oscillator is stable and ready to use + *\*\ - ERROR HSE oscillator not yet ready +**/ +ErrorStatus RCC_WaitHseStable(void) +{ + __IO uint32_t counter_value = 0; + uint32_t timeout_value; + uint32_t status_value; + RCC_ClocksTypeDef sysclk_value; + ErrorStatus bitstatus; + + RCC_GetClocksFreqValue(&sysclk_value); + timeout_value = (HSE_STARTUP_TIMEOUT / ((uint32_t)600000000 / sysclk_value.SysClkFreq)); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + status_value = (RCC->SRCCTRL1 & RCC_HSE_STABLE_FLAG); + counter_value++; + } + while ((counter_value != timeout_value) && (status_value != RCC_HSE_STABLE_FLAG)); + + if ((RCC->SRCCTRL1 & RCC_HSE_STABLE_FLAG) == RCC_HSE_STABLE_FLAG) + { + bitstatus = SUCCESS; + } + else + { + bitstatus = ERROR; + } + + return bitstatus; +} + +/** +*\*\name RCC_EnableHsi. +*\*\fun Enables the Internal High Speed oscillator (HSI). +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note HSI can not be stopped if it is used directly or through the PLL as system clock. +**/ +void RCC_EnableHsi(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + /* Set HSIEN bit */ + RCC->SRCCTRL1 |= RCC_HSI_ENABLE; + } + else + { + /* Reset HSIEN bit */ + RCC->SRCCTRL1 &= (~RCC_HSI_ENABLE); + } +} + +/** +*\*\name RCC_WaitHsiStable. +*\*\fun Waits for HSI start-up. +*\*\param none +*\*\return ErrorStatus: + *\*\ - SUCCESS HSI oscillator is stable and ready to use + *\*\ - ERROR HSI oscillator not yet ready +**/ +ErrorStatus RCC_WaitHsiStable(void) +{ + __IO uint32_t counter_value = 0; + uint32_t timeout_value; + uint32_t status_value; + RCC_ClocksTypeDef sysclk_value; + ErrorStatus bitstatus; + + RCC_GetClocksFreqValue(&sysclk_value); + timeout_value = (HSI_STARTUP_TIMEOUT / ((uint32_t)600000000 / sysclk_value.SysClkFreq)); + + /* Wait till HSI is ready and if Time out is reached exit */ + do + { + status_value = (RCC->SRCCTRL1 & RCC_HSI_STABLE_FLAG); + counter_value++; + } + while ((counter_value != timeout_value) && (status_value != RCC_HSI_STABLE_FLAG)); + + if ((RCC->SRCCTRL1 & RCC_HSI_STABLE_FLAG) == RCC_HSI_STABLE_FLAG) + { + bitstatus = SUCCESS; + } + else + { + bitstatus = ERROR; + } + + return bitstatus; +} + +/** +*\*\name RCC_EnableMsi. +*\*\fun Enables the Internal High Speed oscillator (MSI). +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note MSI can not be stopped if it is used directly or through the PLL as system clock. +**/ +void RCC_EnableMsi(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + /* Set MSIEN bit */ + RCC->SRCCTRL1 |= RCC_MSI_ENABLE; + } + else + { + /* Reset MSIEN bit */ + RCC->SRCCTRL1 &= (~RCC_MSI_ENABLE); + } +} + +/** +*\*\name RCC_WaitMsiStable. +*\*\fun Waits for MSI start-up. +*\*\param none +*\*\return ErrorStatus: + *\*\ - SUCCESS MSI oscillator is stable and ready to use + *\*\ - ERROR MSI oscillator not yet ready +**/ +ErrorStatus RCC_WaitMsiStable(void) +{ + __IO uint32_t counter_value = 0; + uint32_t timeout_value; + uint32_t status_value; + RCC_ClocksTypeDef sysclk_value; + ErrorStatus bitstatus; + + RCC_GetClocksFreqValue(&sysclk_value); + timeout_value = (MSI_STARTUP_TIMEOUT / ((uint32_t)600000000 / sysclk_value.SysClkFreq)); + + /* Wait till MSI is ready and if Time out is reached exit */ + do + { + status_value = (RCC->SRCCTRL1 & RCC_MSI_STABLE_FLAG); + counter_value++; + } + while ((counter_value != timeout_value) && (status_value != RCC_MSI_STABLE_FLAG)); + + if ((RCC->SRCCTRL1 & RCC_MSI_STABLE_FLAG) == RCC_MSI_STABLE_FLAG) + { + bitstatus = SUCCESS; + } + else + { + bitstatus = ERROR; + } + + return bitstatus; +} + +/** +*\*\name RCC_ConfigLse. +*\*\fun Configures the External High Speed oscillator (LSE). +*\*\param RCC_LSE : +*\*\ - RCC_LSE_DISABLE LSE oscillator OFF +*\*\ - RCC_LSE_ENABLE LSE oscillator ON +*\*\ - RCC_LSE_BYPASS LSE oscillator bypassed with external clock +*\*\return none: +*\*\note BDCTRL is protected, you need to enable the PWR clock first, +*\*\ then configure PWR_SYSCTRL1.DBKP to 1 to change it. +**/ +void RCC_ConfigLse(uint32_t RCC_LSE) +{ + + if(RCC_LSE == RCC_LSE_DISABLE) + { + RCC->BDCTRL &= (~(RCC_LSE_ENABLE | RCC_LSERDY_ENABLE)); + + while((RCC->BDCTRL & RCC_BDCTRL_LSERDF) == RCC_BDCTRL_LSERDF) + {} + + __RCC_DELAY_US(10); + RCC->BDCTRL &= (~(RCC_LSE_BYPASS | RCC_LSE_LSELDO)); + + } + else + { + if (RCC_LSE == RCC_LSE_BYPASS) + { + if((RCC->BDCTRL & RCC_LSE_ENABLE) == RCC_LSE_ENABLE) + { + RCC->BDCTRL &= (~RCC_LSE_ENABLE); + } + + /* Set LSEBP bits */ + RCC->BDCTRL |= RCC_LSE_BYPASS; + } + else + { + /* Reset LSEBP bits */ + RCC->BDCTRL &= (~RCC_LSE_BYPASS); + } + + /* Reset LSERDCNTEN bit */ + RCC->BDCTRL &= (~RCC_LSE_RDCNTEN); + /* Set LSEEN bit */ + RCC->BDCTRL |= RCC_LSE_LSELDO; + __RCC_DELAY_US(60); + if (RCC_LSE == RCC_LSE_ENABLE) + { + /* Set da_lse_agcopt bits */ + AFEC->TRIMR7 |= 0x00400000; + } + /* Set LSEEN bit */ + RCC->BDCTRL |= (RCC_LSE_ENABLE | RCC_LSERDY_ENABLE); + __RCC_DELAY_US(10); + /* Set LSERDCNTEN bit */ + RCC->BDCTRL |= (RCC_LSE_RDCNTEN); + } + +} + +/** +*\*\name RCC_WaitLseStable. +*\*\fun Waits for LSE start-up. +*\*\param none +*\*\return ErrorStatus: + *\*\ - SUCCESS LSE oscillator is stable and ready to use + *\*\ - ERROR LSE oscillator not yet ready +**/ +ErrorStatus RCC_WaitLseStable(void) +{ + __IO uint32_t counter_value = 0; + uint32_t timeout_value; + uint32_t status_value; + RCC_ClocksTypeDef sysclk_value; + ErrorStatus bitstatus; + + RCC_GetClocksFreqValue(&sysclk_value); + timeout_value = (LSE_STARTUP_TIMEOUT / ((uint32_t)600000000 / sysclk_value.SysClkFreq)); + + /* Wait till LSE is ready and if Time out is reached exit */ + do + { + status_value = (RCC->BDCTRL & RCC_LSE_STABLE_FLAG); + counter_value++; + } + while ((counter_value != timeout_value) && (status_value != RCC_LSE_STABLE_FLAG)); + + if ((RCC->BDCTRL & RCC_LSE_STABLE_FLAG) == RCC_LSE_STABLE_FLAG) + { + bitstatus = SUCCESS; + } + else + { + bitstatus = ERROR; + } + + return bitstatus; +} + +/** +*\*\name RCC_EnableLsi. +*\*\fun Enables the Internal Low Speed oscillator (LSI). +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note BDCTRL is protected, you need to enable the PWR clock first, +*\*\ then configure PWR_SYSCTRL1.DBKP to 1 to change it. +**/ +void RCC_EnableLsi(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + /* Set LSIEN bit */ + RCC->BDCTRL |= (RCC_LSI_ENABLE | RCC_LSIRDY_ENABLE); + } + else + { + /* Reset PLLEN bit */ + RCC->BDCTRL &= (~(RCC_LSI_ENABLE | RCC_LSIRDY_ENABLE)); + } + +} + +/** +*\*\name RCC_WaitLsiStable. +*\*\fun Waits for LSI start-up. +*\*\param none +*\*\return ErrorStatus: + *\*\ - SUCCESS LSI oscillator is stable and ready to use + *\*\ - ERROR LSI oscillator not yet ready +**/ +ErrorStatus RCC_WaitLsiStable(void) +{ + __IO uint32_t counter_value = 0; + uint32_t timeout_value; + uint32_t status_value; + RCC_ClocksTypeDef sysclk_value; + ErrorStatus bitstatus; + + RCC_GetClocksFreqValue(&sysclk_value); + timeout_value = (LSI_STARTUP_TIMEOUT / ((uint32_t)600000000 / sysclk_value.SysClkFreq)); + + /* Wait till LSI is ready and if Time out is reached exit */ + do + { + status_value = (RCC->BDCTRL & RCC_LSI_STABLE_FLAG); + counter_value++; + } + while ((counter_value != timeout_value) && (status_value != RCC_LSI_STABLE_FLAG)); + + if ((RCC->BDCTRL & RCC_LSI_STABLE_FLAG) == RCC_LSI_STABLE_FLAG) + { + bitstatus = SUCCESS; + } + else + { + bitstatus = ERROR; + } + + return bitstatus; +} + +/** +*\*\name RCC_EnableSecondaryLsi. +*\*\fun Enables the Secondary Internal Low Speed oscillator (LSI). +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note BDCTRL is protected, you need to enable the PWR clock first, +*\*\ then configure PWR_SYSCTRL1.DBKP to 1 to change it. +**/ +void RCC_EnableSecondaryLsi(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + /* Set LSIEN bit */ + RCC->BDCTRL |= RCC_SECLSI_ENABLE; + } + else + { + /* Reset PLLEN bit */ + RCC->BDCTRL &= (~RCC_SECLSI_ENABLE); + } + +} + +/** +*\*\name RCC_WaitSecondaryLsiStable. +*\*\fun Waits for SECLSI start-up. +*\*\param none +*\*\return ErrorStatus: + *\*\ - SUCCESS SECLSI oscillator is stable and ready to use + *\*\ - ERROR SECLSI oscillator not yet ready +**/ +ErrorStatus RCC_WaitSecondaryLsiStable(void) +{ + __IO uint32_t counter_value = 0; + uint32_t timeout_value; + uint32_t status_value; + RCC_ClocksTypeDef sysclk_value; + ErrorStatus bitstatus; + + RCC_GetClocksFreqValue(&sysclk_value); + timeout_value = (SECLSI_STARTUP_TIMEOUT / ((uint32_t)600000000 / sysclk_value.SysClkFreq)); + + /* Wait till SECLSI is ready and if Time out is reached exit */ + do + { + status_value = (RCC->BDCTRL & RCC_SECLSI_STABLE_FLAG); + counter_value++; + } + while ((counter_value != timeout_value) && (status_value != RCC_SECLSI_STABLE_FLAG)); + + if ((RCC->BDCTRL & RCC_SECLSI_STABLE_FLAG) == RCC_SECLSI_STABLE_FLAG) + { + bitstatus = SUCCESS; + } + else + { + bitstatus = ERROR; + } + + return bitstatus; +} + +/** +*\*\name RCC_ConfigSysclk. +*\*\fun Configures the system clock (SYSCLK). +*\*\param sysclk_source(clock source used as system clock): +*\*\ - RCC_SYSCLK_SRC_HSI HSI selected as system clock +*\*\ - RCC_SYSCLK_SRC_MSI HSI selected as system clock +*\*\ - RCC_SYSCLK_SRC_HSE HSE selected as system clock +*\*\ - RCC_SYSCLK_SRC_PLL1A PLL1A selected as system clock +*\*\return none +**/ +void RCC_ConfigSysclk(uint32_t sysclk_source) +{ + uint32_t reg_value; + + reg_value = RCC->SRCCTRL1; + /* Clear SCLKSW bits */ + reg_value &= RCC_SYSCLK_SRC_MASK; + /* Set SCLKSW bits */ + reg_value |= sysclk_source; + /* Store the new value */ + RCC->SRCCTRL1 = reg_value; + +} + +/** +*\*\name RCC_GetSysclkSrc. +*\*\fun Returns the clock source used as system clock. +*\*\param none +*\*\return (The clock source used as system clock): +*\*\ - RCC_SYSCLK_STS_HSI HSI used as system clock +*\*\ - RCC_SYSCLK_STS_MSI HSI used as system clock +*\*\ - RCC_SYSCLK_STS_HSE HSE used as system clock +*\*\ - RCC_SYSCLK_STS_PLL1A PLL1A used as system clock +**/ +uint32_t RCC_GetSysclkSrc(void) +{ + return ((uint32_t)(RCC->SRCCTRL1 & RCC_SYSCLK_STS_MASK)); +} + + +/** +*\*\name RCC_ConfigHSIclkDivider . +*\*\fun Obtained by dividing the HSI 64M clk. +*\*\param CLK_divider +*\*\ - RCC_HSICLK_DIV1 +*\*\ - RCC_HSICLK_DIV2 +*\*\ - RCC_HSICLK_DIV4 +*\*\ - RCC_HSICLK_DIV8 +*\*\ - RCC_HSICLK_DIV16 +*\*\ - RCC_HSICLK_DIV32 +*\*\ - RCC_HSICLK_DIV64 +*\*\ - RCC_HSICLK_DIV128 +*\*\ - RCC_HSICLK_DIV256 +*\*\ - RCC_HSICLK_DIV512 +*\*\return none. +*\*\note All HSI are divided clocks except PLL clock sources +**/ +void RCC_ConfigHSIclkDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->SYSBUSDIV1; + /* Clear HSIDIV bits */ + reg_value &= RCC_HSICLK_DIV_MASK; + /* Set the HSIDIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->SYSBUSDIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigMSIclkDivider . +*\*\fun Obtained by dividing the MSI 64M clk. +*\*\param CLK_divider +*\*\ - RCC_MSICLK_DIV1 +*\*\ - RCC_MSICLK_DIV2 +*\*\ - RCC_MSICLK_DIV4 +*\*\ - RCC_MSICLK_DIV8 +*\*\ - RCC_MSICLK_DIV16 +*\*\ - RCC_MSICLK_DIV32 +*\*\ - RCC_MSICLK_DIV64 +*\*\ - RCC_MSICLK_DIV128 +*\*\ - RCC_MSICLK_DIV256 +*\*\ - RCC_MSICLK_DIV512 +*\*\return none. +*\*\note All MSI are divided clocks except PLL clock sources +**/ +void RCC_ConfigMSIclkDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->SYSBUSDIV1; + /* Clear MSIDIV bits */ + reg_value &= RCC_MSICLK_DIV_MASK; + /* Set the MSIDIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->SYSBUSDIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigM7Clk. +*\*\fun Config the M7 clock source selection. +*\*\param CLK_source: +*\*\ - RCC_M7HYPERCLK_SRC_PLL1A +*\*\ - RCC_M7HYPERCLK_SRC_PLL2A +*\*\return none +*\*\note none +**/ +void RCC_ConfigM7Clk(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->SRCCTRL2; + /* Clear M7HYPSEL bits */ + reg_value &= RCC_M7HYPERCLK_SRC_MASK; + /* Set the M7HYPSEL bits */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->SRCCTRL2 = reg_value; + +} + +/** +*\*\name RCC_ConfigAXIClk. +*\*\fun Config the AXI clock source selection. +*\*\param CLK_source: +*\*\ - RCC_AXIHYPERCLK_SRC_PLL1A +*\*\ - RCC_AXIHYPERCLK_SRC_PLL2A +*\*\return none +*\*\note none +**/ +void RCC_ConfigAXIClk(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->SRCCTRL2; + /* Clear AXIHYPSEL bits */ + reg_value &= RCC_AXIHYPERCLK_SRC_MASK; + /* Set the AXIHYPSEL bits */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->SRCCTRL2 = reg_value; + +} + +/** +*\*\name RCC_CalculatePLLParam. +*\*\fun Configures the SHRTPLL clock source and multiplication factor. +*\*\param fin(SHRTPLL input frequency): +*\*\ 1000000 ~ 64000000 (Hz) +*\*\param fout(SHRTPLL output frequency): +*\*\ 75000000 ~ 1250000000 (Hz) +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return ErrorStatus: +*\*\ - SUCCESS +*\*\ - ERROR +*\*\note fout = fin*(CLKF[25:0]/16384)/(CLKR[5:0] +1) +**/ +ErrorStatus RCC_CalculatePLLParam(uint64_t fin, uint64_t fout, uint32_t* nr, uint32_t* nf, uint32_t* wb) +{ + ErrorStatus status; + uint64_t err_t; + uint32_t nr_t; + uint32_t nf_all; + uint32_t nf_int; + uint64_t err = (uint64_t)0xFFFFFFFFU; + + /* get NR NF WB parameter */ + if ((fin > REF_MAX) || (fin < REF_MIN) || (fout > VCO_MAX) || (fout < VCO_MIN)) + { + status = ERROR; + } + else + { + for ( nr_t = NR_MAX; nr_t >= NR_MIN; nr_t--) + { + nf_all = (uint32_t)floor(fout * nr_t * 256 / fin); + nf_int = nf_all / 256; + + if ((nf_int > NF_MAX) || (nf_int < NF_MIN)) + { + continue; + } + + if((fin * nf_all / nr_t / 256) > fout) + { + err_t = ((fin * nf_all / nr_t / 256) - fout); + } + else + { + err_t = (fout - (fin * nf_all / nr_t / 256)); + } + + if (err_t <= err) + { + err = err_t; + *nr = nr_t; + *nf = nf_all; + } + else + { + /* In other cases, the cycle continues*/ + } + } + + *wb = (uint32_t)floor((*nf / 2 / 256) - 1); + + if(*wb > 2047) + { + *wb = 2047; + } + + *nr = *nr - 1; + *nf = *nf * 64; + status = SUCCESS; + } + + return status; +} + +/** +*\*\name RCC_ConfigSHRPll. +*\*\fun Configures the SHRPLL clock source and multiplication factor. +*\*\param PLL_source(SHRPLL entry clock source): +*\*\ - RCC_PLL_SRC_HSI HSI oscillator clock selected as SHRPLL clock entry +*\*\ - RCC_PLL_SRC_MSI MSI oscillator clock selected as SHRPLL clock entry +*\*\ - RCC_PLL_SRC_HSE HSE oscillator clock selected as SHRPLL clock entry +*\*\param fin(SHRPLL input frequency): +*\*\ 4000000 ~ 50000000 (Hz) +*\*\param fout(SHRPLL output frequency): +*\*\ 100000000 ~ 312500000 (Hz) +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return ErrorStatus: + *\*\ - SUCCESS + *\*\ - ERROR +*\*\note fout = fin*(CLKF[25:0]/16384)/(CLKR[5:0] +1)/4 +**/ +ErrorStatus RCC_ConfigSHRPll(uint32_t PLL_source, uint64_t fin, uint64_t fout, FunctionalState Cmd) +{ + uint32_t temp_value1, temp_value2; + ErrorStatus status; + uint32_t nrtmp = 0; + uint32_t nftmp = 0; + uint32_t wbtmp = 0; + + if(Cmd == DISABLE) + { + /* Disable PLL */ + RCC->SHRPLLCTRL1 &= (~RCC_PLL_ENABLE); + /* Enable PLL reset */ + RCC->SHRPLLCTRL1 |= RCC_PLL_RESET_ENABLE; + + while((RCC->SHRPLLCTRL1 & RCC_PLL_LOCK_FLAG) != RCC_REG_BIT_MASK) + {} + + /* Disable power to analog circuitry in PLL */ + RCC->SHRPLLCTRL1 |= RCC_PLL_POWER_DOWN; + /* Disable PLL module power */ + RCC->SHRPLLCTRL1 &= (~RCC_PLL_LDO_ENABLE); + status = SUCCESS; + } + else + { + /* get NR NF WB parameter */ + fout = fout * 4; + + if(RCC_CalculatePLLParam(fin, fout, &nrtmp, &nftmp, &wbtmp) == SUCCESS) + { + /* get the register value */ + temp_value1 = RCC->SHRPLLCTRL1; + temp_value2 = RCC->SHRPLLCTRL2; + + /* Clear BWAJ[11:0] bits */ + temp_value1 &= RCC_PLL_BWAJ_MASK; + /* Clear CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 &= RCC_PLL_CLKR_CLKF_MASK; + + /* Set BWAJ[11:0] bits */ + temp_value1 |= (uint32_t)(wbtmp & 0xFFF); + /* Set CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 |= (uint32_t)((nrtmp << 26) | (nftmp & 0x3FFFFFF)); + + /* Store the new value */ + RCC->SHRPLLCTRL1 = temp_value1; + RCC->SHRPLLCTRL2 = temp_value2; + + /* Enable PLL module power */ + RCC->SHRPLLCTRL1 |= RCC_PLL_LDO_ENABLE; + __RCC_DELAY_US(10); + + /* Enable power to analog circuitry in PLL */ + RCC->SHRPLLCTRL1 &= (~RCC_PLL_POWER_DOWN); + + /* Select Clock Source */ + temp_value1 = RCC->SHRPLLCTRL1; + temp_value1 &= RCC_PLL_SRC_MASK; + temp_value1 |= PLL_source; + RCC->SHRPLLCTRL1 = temp_value1; + __RCC_DELAY_US(10); + + /* Clear PLL reset */ + RCC->SHRPLLCTRL1 &= (~RCC_PLL_RESET_ENABLE); + + while((RCC->SHRPLLCTRL1 & RCC_PLL_LOCK_FLAG) != RCC_PLL_LOCK_FLAG) + {} + + /* Enable PLL */ + RCC->SHRPLLCTRL1 |= RCC_PLL_ENABLE; + status = SUCCESS; + } + else + { + status = ERROR; + } + + } + + return status; +} + +/** +*\*\name RCC_ConfigPll1. +*\*\fun Configures the PLL1 clock source and multiplication factor. +*\*\param PLL_source(PLL1 entry clock source): +*\*\ - RCC_PLL_SRC_HSI HSI oscillator clock selected as PLL1 clock entry +*\*\ - RCC_PLL_SRC_MSI MSI oscillator clock selected as PLL1 clock entry +*\*\ - RCC_PLL_SRC_HSE HSE oscillator clock selected as PLL1 clock entry +*\*\param fin(PLL1 input frequency): +*\*\ 1000000 ~ 64000000 (Hz) +*\*\param fout(PLL1 output frequency): +*\*\ 400000000 ~ 8000000000 (Hz) +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return ErrorStatus: + *\*\ - SUCCESS + *\*\ - ERROR +*\*\note fout = fin*(CLKF[25:0]/16384)/(CLKR[5:0] +1) +**/ +ErrorStatus RCC_ConfigPll1(uint32_t PLL_source, uint64_t fin, uint64_t fout, FunctionalState Cmd) +{ + uint32_t temp_value1, temp_value2; + ErrorStatus status; + uint32_t nrtmp = 0; + uint32_t nftmp = 0; + uint32_t wbtmp = 0; + + if(Cmd == DISABLE) + { + /* Disable PLL */ + RCC->PLL1CTRL1 &= (~RCC_PLL_ENABLE); + /* Enable PLL reset */ + RCC->PLL1CTRL1 |= RCC_PLL_RESET_ENABLE; + + while((RCC->PLL1CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_REG_BIT_MASK) + {} + + /* Disable power to analog circuitry in PLL */ + RCC->PLL1CTRL1 |= RCC_PLL_POWER_DOWN; + /* Disable PLL module power */ + RCC->PLL1CTRL1 &= (~RCC_PLL_LDO_ENABLE); + status = SUCCESS; + } + else + { + /* get NR NF WB parameter */ + if(RCC_CalculatePLLParam(fin, fout, &nrtmp, &nftmp, &wbtmp) == SUCCESS) + { + /* get the register value */ + temp_value1 = RCC->PLL1CTRL1; + temp_value2 = RCC->PLL1CTRL2; + + /* Clear BWAJ[11:0] bits */ + temp_value1 &= RCC_PLL_BWAJ_MASK; + /* Clear CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 &= RCC_PLL_CLKR_CLKF_MASK; + + /* Set BWAJ[11:0] bits */ + temp_value1 |= (uint32_t)(wbtmp & 0xFFF); + /* Set CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 |= (uint32_t)((nrtmp << 26) | (nftmp & 0x3FFFFFF)); + + /* Store the new value */ + RCC->PLL1CTRL1 = temp_value1; + RCC->PLL1CTRL2 = temp_value2; + + /* Enable PLL module power */ + RCC->PLL1CTRL1 |= RCC_PLL_LDO_ENABLE; + __RCC_DELAY_US(10); + + /* Enable power to analog circuitry in PLL */ + RCC->PLL1CTRL1 &= (~RCC_PLL_POWER_DOWN); + + /* Select Clock Source */ + temp_value1 = RCC->PLL1CTRL1; + temp_value1 &= RCC_PLL_SRC_MASK; + temp_value1 |= PLL_source; + RCC->PLL1CTRL1 = temp_value1; + __RCC_DELAY_US(10); + + /* Clear PLL reset */ + RCC->PLL1CTRL1 &= (~RCC_PLL_RESET_ENABLE); + + while((RCC->PLL1CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_PLL_LOCK_FLAG) + {} + + /* Enable PLL */ + RCC->PLL1CTRL1 |= RCC_PLL_ENABLE; + status = SUCCESS; + } + else + { + status = ERROR; + } + + } + + return status; +} + +/** +*\*\name RCC_ConfigPll2. +*\*\fun Configures the PLL2 clock source and multiplication factor. +*\*\param PLL_source(PLL2 entry clock source): +*\*\ - RCC_PLL_SRC_HSI HSI oscillator clock selected as PLL2 clock entry +*\*\ - RCC_PLL_SRC_MSI MSI oscillator clock selected as PLL2 clock entry +*\*\ - RCC_PLL_SRC_HSE HSE oscillator clock selected as PLL2 clock entry +*\*\param fin(PLL2 input frequency): +*\*\ 1000000 ~ 64000000 (Hz) +*\*\param fout(PLL2 output frequency): +*\*\ 400000000 ~ 800000000 (Hz) +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return ErrorStatus: + *\*\ - SUCCESS + *\*\ - ERROR +*\*\note fout = fin*(CLKF[25:0]/16384)/(CLKR[5:0] +1) +**/ +ErrorStatus RCC_ConfigPll2(uint32_t PLL_source, uint64_t fin, uint64_t fout, FunctionalState Cmd) +{ + uint32_t temp_value1, temp_value2; + ErrorStatus status; + uint32_t nrtmp = 0; + uint32_t nftmp = 0; + uint32_t wbtmp = 0; + + if(Cmd == DISABLE) + { + /* Disable PLL */ + RCC->PLL2CTRL1 &= (~RCC_PLL_ENABLE); + /* Enable PLL reset */ + RCC->PLL2CTRL1 |= RCC_PLL_RESET_ENABLE; + + while((RCC->PLL2CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_REG_BIT_MASK) + {} + + /* Disable power to analog circuitry in PLL */ + RCC->PLL2CTRL1 |= RCC_PLL_POWER_DOWN; + /* Disable PLL module power */ + //RCC->PLL2CTRL1 &= (~RCC_PLL_LDO_ENABLE); + RCC->PLL3CTRL1 &= (~RCC_PLL_LDO_ENABLE); + status = SUCCESS; + } + else + { + /* get NR NF WB parameter */ + if(RCC_CalculatePLLParam(fin, fout, &nrtmp, &nftmp, &wbtmp) == SUCCESS) + { + /* get the register value */ + temp_value1 = RCC->PLL2CTRL1; + temp_value2 = RCC->PLL2CTRL2; + + /* Clear BWAJ[11:0] bits */ + temp_value1 &= RCC_PLL_BWAJ_MASK; + /* Clear CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 &= RCC_PLL_CLKR_CLKF_MASK; + + /* Set BWAJ[11:0] bits */ + temp_value1 |= (uint32_t)(wbtmp & 0xFFF); + /* Set CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 |= (uint32_t)((nrtmp << 26) | (nftmp & 0x3FFFFFF)); + + /* Store the new value */ + RCC->PLL2CTRL1 = temp_value1; + RCC->PLL2CTRL2 = temp_value2; + + /* Enable PLL module power */ + //RCC->PLL2CTRL1 |= RCC_PLL_LDO_ENABLE; + RCC->PLL3CTRL1 |= RCC_PLL_LDO_ENABLE; + __RCC_DELAY_US(10); + + /* Enable power to analog circuitry in PLL */ + RCC->PLL2CTRL1 &= (~RCC_PLL_POWER_DOWN); + + /* Select Clock Source */ + temp_value1 = RCC->PLL2CTRL1; + temp_value1 &= RCC_PLL_SRC_MASK; + temp_value1 |= PLL_source; + RCC->PLL2CTRL1 = temp_value1; + __RCC_DELAY_US(10); + + /* Clear PLL reset */ + RCC->PLL2CTRL1 &= (~RCC_PLL_RESET_ENABLE); + + while((RCC->PLL2CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_PLL_LOCK_FLAG) + {} + + /* Enable PLL */ + RCC->PLL2CTRL1 |= RCC_PLL_ENABLE; + status = SUCCESS; + } + else + { + status = ERROR; + } + + } + + return status; +} + +/** +*\*\name RCC_ConfigPll3. +*\*\fun Configures the PLL3 clock source and multiplication factor. +*\*\param PLL_source(PLL3 entry clock source): +*\*\ - RCC_PLL_SRC_HSI HSI oscillator clock selected as PLL3 clock entry +*\*\ - RCC_PLL_SRC_MSI MSI oscillator clock selected as PLL3 clock entry +*\*\ - RCC_PLL_SRC_HSE HSE oscillator clock selected as PLL3 clock entry +*\*\param fin(PLL3 input frequency): +*\*\ 1000000 ~ 64000000 (Hz) +*\*\param fout(PLL3 output frequency): +*\*\ 400000000 ~ 800000000 (Hz) +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return ErrorStatus: + *\*\ - SUCCESS + *\*\ - ERROR +*\*\note fout = fin*(CLKF[25:0]/16384)/(CLKR[5:0] +1) +**/ +ErrorStatus RCC_ConfigPll3(uint32_t PLL_source, uint64_t fin, uint64_t fout, FunctionalState Cmd) +{ + uint32_t temp_value1, temp_value2; + ErrorStatus status; + uint32_t nrtmp = 0; + uint32_t nftmp = 0; + uint32_t wbtmp = 0; + + if(Cmd == DISABLE) + { + /* Disable PLL */ + RCC->PLL3CTRL1 &= (~RCC_PLL_ENABLE); + /* Enable PLL reset */ + RCC->PLL3CTRL1 |= RCC_PLL_RESET_ENABLE; + + while((RCC->PLL3CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_REG_BIT_MASK) + {} + + /* Disable power to analog circuitry in PLL */ + RCC->PLL3CTRL1 |= RCC_PLL_POWER_DOWN; + /* Disable PLL module power */ + //RCC->PLL3CTRL1 &= (~RCC_PLL_LDO_ENABLE); + RCC->PLL2CTRL1 &= (~RCC_PLL_LDO_ENABLE); + status = SUCCESS; + } + else + { + /* get NR NF WB parameter */ + if(RCC_CalculatePLLParam(fin, fout, &nrtmp, &nftmp, &wbtmp) == SUCCESS) + { + /* get the register value */ + temp_value1 = RCC->PLL3CTRL1; + temp_value2 = RCC->PLL3CTRL2; + + /* Clear BWAJ[11:0] bits */ + temp_value1 &= RCC_PLL_BWAJ_MASK; + /* Clear CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 &= RCC_PLL_CLKR_CLKF_MASK; + + /* Set BWAJ[11:0] bits */ + temp_value1 |= (uint32_t)(wbtmp & 0xFFF); + /* Set CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 |= (uint32_t)((nrtmp << 26) | (nftmp & 0x3FFFFFF)); + + /* Store the new value */ + RCC->PLL3CTRL1 = temp_value1; + RCC->PLL3CTRL2 = temp_value2; + + /* Enable PLL module power */ + //RCC->PLL3CTRL1 |= RCC_PLL_LDO_ENABLE; + RCC->PLL2CTRL1 |= RCC_PLL_LDO_ENABLE; + __RCC_DELAY_US(10); + + /* Enable power to analog circuitry in PLL */ + RCC->PLL3CTRL1 &= (~RCC_PLL_POWER_DOWN); + + /* Select Clock Source */ + temp_value1 = RCC->PLL3CTRL1; + temp_value1 &= RCC_PLL_SRC_MASK; + temp_value1 |= PLL_source; + RCC->PLL3CTRL1 = temp_value1; + __RCC_DELAY_US(10); + + /* Clear PLL reset */ + RCC->PLL3CTRL1 &= (~RCC_PLL_RESET_ENABLE); + + while((RCC->PLL3CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_PLL_LOCK_FLAG) + {} + + /* Enable PLL */ + RCC->PLL3CTRL1 |= RCC_PLL_ENABLE; + status = SUCCESS; + } + else + { + status = ERROR; + } + + } + + return status; +} + +/** +*\*\name RCC_ConfigSHRPll. +*\*\fun Configures the SHRPLL clock source and multiplication factor. +*\*\param PLL_source(SHRPLL entry clock source): +*\*\ - RCC_PLL_SRC_HSI HSI oscillator clock selected as SHRPLL clock entry +*\*\ - RCC_PLL_SRC_MSI MSI oscillator clock selected as SHRPLL clock entry +*\*\ - RCC_PLL_SRC_HSE HSE oscillator clock selected as SHRPLL clock entry +*\*\param nrtmp(SHRPLLCLKR parameter) +*\*\param nftmp(SHRPLLCLKF parameter) +*\*\param wbtmp(SHRPLLBWAJ parameter) +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return ErrorStatus: + *\*\ - SUCCESS + *\*\ - ERROR +*\*\note Directly enter the nrtmp, nrtmp and wbtmp configuration parameters without spending a long time calculating the results +**/ +ErrorStatus RCC_ConfigSHRPll_NoCalculate(uint32_t PLL_source, uint32_t nrtmp, uint32_t nftmp, uint32_t wbtmp, FunctionalState Cmd) +{ + uint32_t temp_value1, temp_value2; + ErrorStatus status; + + if(Cmd == DISABLE) + { + /* Disable PLL */ + RCC->SHRPLLCTRL1 &= (~RCC_PLL_ENABLE); + /* Enable PLL reset */ + RCC->SHRPLLCTRL1 |= RCC_PLL_RESET_ENABLE; + + while((RCC->SHRPLLCTRL1 & RCC_PLL_LOCK_FLAG) != RCC_REG_BIT_MASK) + {} + + /* Disable power to analog circuitry in PLL */ + RCC->SHRPLLCTRL1 |= RCC_PLL_POWER_DOWN; + /* Disable PLL module power */ + RCC->SHRPLLCTRL1 &= (~RCC_PLL_LDO_ENABLE); + status = SUCCESS; + } + else + { + /* get NR NF WB parameter */ + /* get the register value */ + temp_value1 = RCC->SHRPLLCTRL1; + temp_value2 = RCC->SHRPLLCTRL2; + + /* Clear BWAJ[11:0] bits */ + temp_value1 &= RCC_PLL_BWAJ_MASK; + /* Clear CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 &= RCC_PLL_CLKR_CLKF_MASK; + + /* Set BWAJ[11:0] bits */ + temp_value1 |= (uint32_t)(wbtmp & 0xFFF); + /* Set CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 |= (uint32_t)((nrtmp << 26) | (nftmp & 0x3FFFFFF)); + + /* Store the new value */ + RCC->SHRPLLCTRL1 = temp_value1; + RCC->SHRPLLCTRL2 = temp_value2; + + /* Enable PLL module power */ + RCC->SHRPLLCTRL1 |= RCC_PLL_LDO_ENABLE; + __RCC_DELAY_US(10); + + /* Enable power to analog circuitry in PLL */ + RCC->SHRPLLCTRL1 &= (~RCC_PLL_POWER_DOWN); + + /* Select Clock Source */ + temp_value1 = RCC->SHRPLLCTRL1; + temp_value1 &= RCC_PLL_SRC_MASK; + temp_value1 |= PLL_source; + RCC->SHRPLLCTRL1 = temp_value1; + __RCC_DELAY_US(10); + + /* Clear PLL reset */ + RCC->SHRPLLCTRL1 &= (~RCC_PLL_RESET_ENABLE); + + while((RCC->SHRPLLCTRL1 & RCC_PLL_LOCK_FLAG) != RCC_PLL_LOCK_FLAG) + {} + + /* Enable PLL */ + RCC->SHRPLLCTRL1 |= RCC_PLL_ENABLE; + status = SUCCESS; + } + + return status; +} + +/** +*\*\name RCC_ConfigPll1. +*\*\fun Configures the PLL1 clock source and multiplication factor. +*\*\param PLL_source(PLL1 entry clock source): +*\*\ - RCC_PLL_SRC_HSI HSI oscillator clock selected as PLL1 clock entry +*\*\ - RCC_PLL_SRC_MSI MSI oscillator clock selected as PLL1 clock entry +*\*\ - RCC_PLL_SRC_HSE HSE oscillator clock selected as PLL1 clock entry +*\*\param nrtmp(PLL1CLKR parameter) +*\*\param nftmp(PLL1CLKF parameter) +*\*\param wbtmp(PLL1BWAJ parameter) +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return ErrorStatus: + *\*\ - SUCCESS + *\*\ - ERROR +*\*\note Directly enter the nrtmp, nrtmp and wbtmp configuration parameters without spending a long time calculating the results +**/ +ErrorStatus RCC_ConfigPll1_NoCalculate(uint32_t PLL_source, uint32_t nrtmp, uint32_t nftmp, uint32_t wbtmp, FunctionalState Cmd) +{ + uint32_t temp_value1, temp_value2; + ErrorStatus status; + + if(Cmd == DISABLE) + { + /* Disable PLL */ + RCC->PLL1CTRL1 &= (~RCC_PLL_ENABLE); + /* Enable PLL reset */ + RCC->PLL1CTRL1 |= RCC_PLL_RESET_ENABLE; + + while((RCC->PLL1CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_REG_BIT_MASK) + {} + + /* Disable power to analog circuitry in PLL */ + RCC->PLL1CTRL1 |= RCC_PLL_POWER_DOWN; + /* Disable PLL module power */ + RCC->PLL1CTRL1 &= (~RCC_PLL_LDO_ENABLE); + status = SUCCESS; + } + else + { + /* get the register value */ + temp_value1 = RCC->PLL1CTRL1; + temp_value2 = RCC->PLL1CTRL2; + + /* Clear BWAJ[11:0] bits */ + temp_value1 &= RCC_PLL_BWAJ_MASK; + /* Clear CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 &= RCC_PLL_CLKR_CLKF_MASK; + + /* Set BWAJ[11:0] bits */ + temp_value1 |= (uint32_t)(wbtmp & 0xFFF); + /* Set CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 |= (uint32_t)((nrtmp << 26) | (nftmp & 0x3FFFFFF)); + + /* Store the new value */ + RCC->PLL1CTRL1 = temp_value1; + RCC->PLL1CTRL2 = temp_value2; + + /* Enable PLL module power */ + RCC->PLL1CTRL1 |= RCC_PLL_LDO_ENABLE; + __RCC_DELAY_US(10); + + /* Enable power to analog circuitry in PLL */ + RCC->PLL1CTRL1 &= (~RCC_PLL_POWER_DOWN); + + /* Select Clock Source */ + temp_value1 = RCC->PLL1CTRL1; + temp_value1 &= RCC_PLL_SRC_MASK; + temp_value1 |= PLL_source; + RCC->PLL1CTRL1 = temp_value1; + __RCC_DELAY_US(10); + + /* Clear PLL reset */ + RCC->PLL1CTRL1 &= (~RCC_PLL_RESET_ENABLE); + + while((RCC->PLL1CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_PLL_LOCK_FLAG) + {} + + /* Enable PLL */ + RCC->PLL1CTRL1 |= RCC_PLL_ENABLE; + status = SUCCESS; + + + } + + return status; +} + +/** +*\*\name RCC_ConfigPll2. +*\*\fun Configures the PLL2 clock source and multiplication factor. +*\*\param PLL_source(PLL2 entry clock source): +*\*\ - RCC_PLL_SRC_HSI HSI oscillator clock selected as PLL2 clock entry +*\*\ - RCC_PLL_SRC_MSI MSI oscillator clock selected as PLL2 clock entry +*\*\ - RCC_PLL_SRC_HSE HSE oscillator clock selected as PLL2 clock entry +*\*\param nrtmp(PLL2CLKR parameter) +*\*\param nftmp(PLL2CLKF parameter) +*\*\param wbtmp(PLL2BWAJ parameter) +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return ErrorStatus: + *\*\ - SUCCESS + *\*\ - ERROR +*\*\note Directly enter the nrtmp, nrtmp and wbtmp configuration parameters without spending a long time calculating the results +**/ +ErrorStatus RCC_ConfigPll2_NoCalculate(uint32_t PLL_source, uint32_t nrtmp, uint32_t nftmp, uint32_t wbtmp, FunctionalState Cmd) +{ + uint32_t temp_value1, temp_value2; + ErrorStatus status; + + if(Cmd == DISABLE) + { + /* Disable PLL */ + RCC->PLL2CTRL1 &= (~RCC_PLL_ENABLE); + /* Enable PLL reset */ + RCC->PLL2CTRL1 |= RCC_PLL_RESET_ENABLE; + + while((RCC->PLL2CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_REG_BIT_MASK) + {} + + /* Disable power to analog circuitry in PLL */ + RCC->PLL2CTRL1 |= RCC_PLL_POWER_DOWN; + /* Disable PLL module power */ + //RCC->PLL2CTRL1 &= (~RCC_PLL_LDO_ENABLE); + RCC->PLL3CTRL1 &= (~RCC_PLL_LDO_ENABLE); + status = SUCCESS; + } + else + { + /* get the register value */ + temp_value1 = RCC->PLL2CTRL1; + temp_value2 = RCC->PLL2CTRL2; + + /* Clear BWAJ[11:0] bits */ + temp_value1 &= RCC_PLL_BWAJ_MASK; + /* Clear CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 &= RCC_PLL_CLKR_CLKF_MASK; + + /* Set BWAJ[11:0] bits */ + temp_value1 |= (uint32_t)(wbtmp & 0xFFF); + /* Set CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 |= (uint32_t)((nrtmp << 26) | (nftmp & 0x3FFFFFF)); + + /* Store the new value */ + RCC->PLL2CTRL1 = temp_value1; + RCC->PLL2CTRL2 = temp_value2; + + /* Enable PLL module power */ + //RCC->PLL2CTRL1 |= RCC_PLL_LDO_ENABLE; + RCC->PLL3CTRL1 |= RCC_PLL_LDO_ENABLE; + __RCC_DELAY_US(10); + + /* Enable power to analog circuitry in PLL */ + RCC->PLL2CTRL1 &= (~RCC_PLL_POWER_DOWN); + + /* Select Clock Source */ + temp_value1 = RCC->PLL2CTRL1; + temp_value1 &= RCC_PLL_SRC_MASK; + temp_value1 |= PLL_source; + RCC->PLL2CTRL1 = temp_value1; + __RCC_DELAY_US(10); + + /* Clear PLL reset */ + RCC->PLL2CTRL1 &= (~RCC_PLL_RESET_ENABLE); + + while((RCC->PLL2CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_PLL_LOCK_FLAG) + {} + + /* Enable PLL */ + RCC->PLL2CTRL1 |= RCC_PLL_ENABLE; + status = SUCCESS; + + } + + return status; +} + +/** +*\*\name RCC_ConfigPll3. +*\*\fun Configures the PLL3 clock source and multiplication factor. +*\*\param PLL_source(PLL3 entry clock source): +*\*\ - RCC_PLL_SRC_HSI HSI oscillator clock selected as PLL3 clock entry +*\*\ - RCC_PLL_SRC_MSI MSI oscillator clock selected as PLL3 clock entry +*\*\ - RCC_PLL_SRC_HSE HSE oscillator clock selected as PLL3 clock entry +*\*\param nrtmp(PLL3CLKR parameter) +*\*\param nftmp(PLL3CLKF parameter) +*\*\param wbtmp(PLL3BWAJ parameter) +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return ErrorStatus: + *\*\ - SUCCESS + *\*\ - ERROR +*\*\note Directly enter the nrtmp, nrtmp and wbtmp configuration parameters without spending a long time calculating the results +**/ +ErrorStatus RCC_ConfigPll3_NoCalculate(uint32_t PLL_source, uint32_t nrtmp, uint32_t nftmp, uint32_t wbtmp, FunctionalState Cmd) +{ + uint32_t temp_value1, temp_value2; + ErrorStatus status; + + if(Cmd == DISABLE) + { + /* Disable PLL */ + RCC->PLL3CTRL1 &= (~RCC_PLL_ENABLE); + /* Enable PLL reset */ + RCC->PLL3CTRL1 |= RCC_PLL_RESET_ENABLE; + + while((RCC->PLL3CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_REG_BIT_MASK) + {} + + /* Disable power to analog circuitry in PLL */ + RCC->PLL3CTRL1 |= RCC_PLL_POWER_DOWN; + /* Disable PLL module power */ + //RCC->PLL3CTRL1 &= (~RCC_PLL_LDO_ENABLE); + RCC->PLL2CTRL1 &= (~RCC_PLL_LDO_ENABLE); + status = SUCCESS; + } + else + { + /* get the register value */ + temp_value1 = RCC->PLL3CTRL1; + temp_value2 = RCC->PLL3CTRL2; + + /* Clear BWAJ[11:0] bits */ + temp_value1 &= RCC_PLL_BWAJ_MASK; + /* Clear CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 &= RCC_PLL_CLKR_CLKF_MASK; + + /* Set BWAJ[11:0] bits */ + temp_value1 |= (uint32_t)(wbtmp & 0xFFF); + /* Set CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 |= (uint32_t)((nrtmp << 26) | (nftmp & 0x3FFFFFF)); + + /* Store the new value */ + RCC->PLL3CTRL1 = temp_value1; + RCC->PLL3CTRL2 = temp_value2; + + /* Enable PLL module power */ + //RCC->PLL3CTRL1 |= RCC_PLL_LDO_ENABLE; + RCC->PLL2CTRL1 |= RCC_PLL_LDO_ENABLE; + __RCC_DELAY_US(10); + + /* Enable power to analog circuitry in PLL */ + RCC->PLL3CTRL1 &= (~RCC_PLL_POWER_DOWN); + + /* Select Clock Source */ + temp_value1 = RCC->PLL3CTRL1; + temp_value1 &= RCC_PLL_SRC_MASK; + temp_value1 |= PLL_source; + RCC->PLL3CTRL1 = temp_value1; + __RCC_DELAY_US(10); + + /* Clear PLL reset */ + RCC->PLL3CTRL1 &= (~RCC_PLL_RESET_ENABLE); + + while((RCC->PLL3CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_PLL_LOCK_FLAG) + {} + + /* Enable PLL */ + RCC->PLL3CTRL1 |= RCC_PLL_ENABLE; + status = SUCCESS; + + } + + return status; +} + +/** +*\*\name RCC_ConfigPLL1CDivider . +*\*\fun Configure PLL1 prescaler value to PLL1C. +*\*\param CLK_divider +*\*\ - RCC_PLLC_DIV1 +*\*\ - RCC_PLLC_DIV2 +*\*\ - RCC_PLLC_DIV3 +*\*\ - RCC_PLLC_DIV4 +*\*\ - RCC_PLLC_DIV5 +*\*\ - RCC_PLLC_DIV6 +*\*\ - RCC_PLLC_DIV7 +*\*\ - RCC_PLLC_DIV8 +*\*\ - RCC_PLLC_DIV9 +*\*\ - RCC_PLLC_DIV10 +*\*\ - RCC_PLLC_DIV11 +*\*\ - RCC_PLLC_DIV12 +*\*\ - RCC_PLLC_DIV13 +*\*\ - RCC_PLLC_DIV14 +*\*\ - RCC_PLLC_DIV15 +*\*\ - RCC_PLLC_DIV16 +*\*\ - RCC_PLLC_DIV17 +*\*\ - RCC_PLLC_DIV18 +*\*\ - RCC_PLLC_DIV19 +*\*\ - RCC_PLLC_DIV20 +*\*\ - RCC_PLLC_DIV21 +*\*\ - RCC_PLLC_DIV22 +*\*\ - RCC_PLLC_DIV23 +*\*\ - RCC_PLLC_DIV24 +*\*\ - RCC_PLLC_DIV25 +*\*\ - RCC_PLLC_DIV26 +*\*\ - RCC_PLLC_DIV27 +*\*\ - RCC_PLLC_DIV28 +*\*\ - RCC_PLLC_DIV29 +*\*\ - RCC_PLLC_DIV30 +*\*\ - RCC_PLLC_DIV31 +*\*\ - RCC_PLLC_DIV32 +*\*\ - RCC_PLLC_DIV33 +*\*\ - RCC_PLLC_DIV34 +*\*\ - RCC_PLLC_DIV35 +*\*\ - RCC_PLLC_DIV36 +*\*\ - RCC_PLLC_DIV37 +*\*\ - RCC_PLLC_DIV38 +*\*\ - RCC_PLLC_DIV39 +*\*\ - RCC_PLLC_DIV40 +*\*\ - RCC_PLLC_DIV41 +*\*\ - RCC_PLLC_DIV42 +*\*\ - RCC_PLLC_DIV43 +*\*\ - RCC_PLLC_DIV44 +*\*\ - RCC_PLLC_DIV45 +*\*\ - RCC_PLLC_DIV46 +*\*\ - RCC_PLLC_DIV47 +*\*\ - RCC_PLLC_DIV48 +*\*\ - RCC_PLLC_DIV49 +*\*\ - RCC_PLLC_DIV50 +*\*\ - RCC_PLLC_DIV51 +*\*\ - RCC_PLLC_DIV52 +*\*\ - RCC_PLLC_DIV53 +*\*\ - RCC_PLLC_DIV54 +*\*\ - RCC_PLLC_DIV55 +*\*\ - RCC_PLLC_DIV56 +*\*\ - RCC_PLLC_DIV57 +*\*\ - RCC_PLLC_DIV58 +*\*\ - RCC_PLLC_DIV59 +*\*\ - RCC_PLLC_DIV60 +*\*\ - RCC_PLLC_DIV61 +*\*\ - RCC_PLLC_DIV62 +*\*\ - RCC_PLLC_DIV63 +*\*\return none. +**/ +void RCC_ConfigPLL1CDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->PLL1DIV; + /* Clear RCC_PLL1C_DIV bits */ + reg_value &= RCC_PLLC_DIV_MASK; + /* Set the DIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->PLL1DIV = reg_value; +} + +/** +*\*\name RCC_ConfigPLL1BDivider . +*\*\fun Configure PLL1 divider value to PLL1B. +*\*\param CLK_divider +*\*\ - RCC_PLLB_DIV1 +*\*\ - RCC_PLLB_DIV2 +*\*\ - RCC_PLLB_DIV3 +*\*\ - RCC_PLLB_DIV4 +*\*\ - RCC_PLLB_DIV5 +*\*\ - RCC_PLLB_DIV6 +*\*\ - RCC_PLLB_DIV7 +*\*\ - RCC_PLLB_DIV8 +*\*\ - RCC_PLLB_DIV9 +*\*\ - RCC_PLLB_DIV10 +*\*\ - RCC_PLLB_DIV11 +*\*\ - RCC_PLLB_DIV12 +*\*\ - RCC_PLLB_DIV13 +*\*\ - RCC_PLLB_DIV14 +*\*\ - RCC_PLLB_DIV15 +*\*\ - RCC_PLLB_DIV16 +*\*\ - RCC_PLLB_DIV17 +*\*\ - RCC_PLLB_DIV18 +*\*\ - RCC_PLLB_DIV19 +*\*\ - RCC_PLLB_DIV20 +*\*\ - RCC_PLLB_DIV21 +*\*\ - RCC_PLLB_DIV22 +*\*\ - RCC_PLLB_DIV23 +*\*\ - RCC_PLLB_DIV24 +*\*\ - RCC_PLLB_DIV25 +*\*\ - RCC_PLLB_DIV26 +*\*\ - RCC_PLLB_DIV27 +*\*\ - RCC_PLLB_DIV28 +*\*\ - RCC_PLLB_DIV29 +*\*\ - RCC_PLLB_DIV30 +*\*\ - RCC_PLLB_DIV31 +*\*\ - RCC_PLLB_DIV32 +*\*\ - RCC_PLLB_DIV33 +*\*\ - RCC_PLLB_DIV34 +*\*\ - RCC_PLLB_DIV35 +*\*\ - RCC_PLLB_DIV36 +*\*\ - RCC_PLLB_DIV37 +*\*\ - RCC_PLLB_DIV38 +*\*\ - RCC_PLLB_DIV39 +*\*\ - RCC_PLLB_DIV40 +*\*\ - RCC_PLLB_DIV41 +*\*\ - RCC_PLLB_DIV42 +*\*\ - RCC_PLLB_DIV43 +*\*\ - RCC_PLLB_DIV44 +*\*\ - RCC_PLLB_DIV45 +*\*\ - RCC_PLLB_DIV46 +*\*\ - RCC_PLLB_DIV47 +*\*\ - RCC_PLLB_DIV48 +*\*\ - RCC_PLLB_DIV49 +*\*\ - RCC_PLLB_DIV50 +*\*\ - RCC_PLLB_DIV51 +*\*\ - RCC_PLLB_DIV52 +*\*\ - RCC_PLLB_DIV53 +*\*\ - RCC_PLLB_DIV54 +*\*\ - RCC_PLLB_DIV55 +*\*\ - RCC_PLLB_DIV56 +*\*\ - RCC_PLLB_DIV57 +*\*\ - RCC_PLLB_DIV58 +*\*\ - RCC_PLLB_DIV59 +*\*\ - RCC_PLLB_DIV60 +*\*\ - RCC_PLLB_DIV61 +*\*\ - RCC_PLLB_DIV62 +*\*\ - RCC_PLLB_DIV63 +*\*\return none. +**/ +void RCC_ConfigPLL1BDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->PLL1DIV; + /* Clear RCC_PLL1B_DIV bits */ + reg_value &= RCC_PLLB_DIV_MASK; + /* Set the DIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->PLL1DIV = reg_value; +} + +/** +*\*\name RCC_ConfigPLL1ADivider . +*\*\fun Configure PLL1 divider value to PLL1A. +*\*\param CLK_divider +*\*\ - RCC_PLLA_DIV1 +*\*\ - RCC_PLLA_DIV2 +*\*\ - RCC_PLLA_DIV3 +*\*\ - RCC_PLLA_DIV4 +*\*\ - RCC_PLLA_DIV5 +*\*\ - RCC_PLLA_DIV6 +*\*\ - RCC_PLLA_DIV7 +*\*\ - RCC_PLLA_DIV8 +*\*\ - RCC_PLLA_DIV9 +*\*\ - RCC_PLLA_DIV10 +*\*\ - RCC_PLLA_DIV11 +*\*\ - RCC_PLLA_DIV12 +*\*\ - RCC_PLLA_DIV13 +*\*\ - RCC_PLLA_DIV14 +*\*\ - RCC_PLLA_DIV15 +*\*\ - RCC_PLLA_DIV16 +*\*\ - RCC_PLLA_DIV17 +*\*\ - RCC_PLLA_DIV18 +*\*\ - RCC_PLLA_DIV19 +*\*\ - RCC_PLLA_DIV20 +*\*\ - RCC_PLLA_DIV21 +*\*\ - RCC_PLLA_DIV22 +*\*\ - RCC_PLLA_DIV23 +*\*\ - RCC_PLLA_DIV24 +*\*\ - RCC_PLLA_DIV25 +*\*\ - RCC_PLLA_DIV26 +*\*\ - RCC_PLLA_DIV27 +*\*\ - RCC_PLLA_DIV28 +*\*\ - RCC_PLLA_DIV29 +*\*\ - RCC_PLLA_DIV30 +*\*\ - RCC_PLLA_DIV31 +*\*\ - RCC_PLLA_DIV32 +*\*\ - RCC_PLLA_DIV33 +*\*\ - RCC_PLLA_DIV34 +*\*\ - RCC_PLLA_DIV35 +*\*\ - RCC_PLLA_DIV36 +*\*\ - RCC_PLLA_DIV37 +*\*\ - RCC_PLLA_DIV38 +*\*\ - RCC_PLLA_DIV39 +*\*\ - RCC_PLLA_DIV40 +*\*\ - RCC_PLLA_DIV41 +*\*\ - RCC_PLLA_DIV42 +*\*\ - RCC_PLLA_DIV43 +*\*\ - RCC_PLLA_DIV44 +*\*\ - RCC_PLLA_DIV45 +*\*\ - RCC_PLLA_DIV46 +*\*\ - RCC_PLLA_DIV47 +*\*\ - RCC_PLLA_DIV48 +*\*\ - RCC_PLLA_DIV49 +*\*\ - RCC_PLLA_DIV50 +*\*\ - RCC_PLLA_DIV51 +*\*\ - RCC_PLLA_DIV52 +*\*\ - RCC_PLLA_DIV53 +*\*\ - RCC_PLLA_DIV54 +*\*\ - RCC_PLLA_DIV55 +*\*\ - RCC_PLLA_DIV56 +*\*\ - RCC_PLLA_DIV57 +*\*\ - RCC_PLLA_DIV58 +*\*\ - RCC_PLLA_DIV59 +*\*\ - RCC_PLLA_DIV60 +*\*\ - RCC_PLLA_DIV61 +*\*\ - RCC_PLLA_DIV62 +*\*\ - RCC_PLLA_DIV63 +*\*\return none. +**/ +void RCC_ConfigPLL1ADivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->PLL1DIV; + /* Clear RCC_PLL1A_DIV bits */ + reg_value &= RCC_PLLA_DIV_MASK; + /* Set the DIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->PLL1DIV = reg_value; +} + +/** +*\*\name RCC_ConfigPLL2CDivider . +*\*\fun Configure PLL2 divider value to PLL2C. +*\*\param CLK_divider +*\*\ - RCC_PLLC_DIV1 +*\*\ - RCC_PLLC_DIV2 +*\*\ - RCC_PLLC_DIV3 +*\*\ - RCC_PLLC_DIV4 +*\*\ - RCC_PLLC_DIV5 +*\*\ - RCC_PLLC_DIV6 +*\*\ - RCC_PLLC_DIV7 +*\*\ - RCC_PLLC_DIV8 +*\*\ - RCC_PLLC_DIV9 +*\*\ - RCC_PLLC_DIV10 +*\*\ - RCC_PLLC_DIV11 +*\*\ - RCC_PLLC_DIV12 +*\*\ - RCC_PLLC_DIV13 +*\*\ - RCC_PLLC_DIV14 +*\*\ - RCC_PLLC_DIV15 +*\*\ - RCC_PLLC_DIV16 +*\*\ - RCC_PLLC_DIV17 +*\*\ - RCC_PLLC_DIV18 +*\*\ - RCC_PLLC_DIV19 +*\*\ - RCC_PLLC_DIV20 +*\*\ - RCC_PLLC_DIV21 +*\*\ - RCC_PLLC_DIV22 +*\*\ - RCC_PLLC_DIV23 +*\*\ - RCC_PLLC_DIV24 +*\*\ - RCC_PLLC_DIV25 +*\*\ - RCC_PLLC_DIV26 +*\*\ - RCC_PLLC_DIV27 +*\*\ - RCC_PLLC_DIV28 +*\*\ - RCC_PLLC_DIV29 +*\*\ - RCC_PLLC_DIV30 +*\*\ - RCC_PLLC_DIV31 +*\*\ - RCC_PLLC_DIV32 +*\*\ - RCC_PLLC_DIV33 +*\*\ - RCC_PLLC_DIV34 +*\*\ - RCC_PLLC_DIV35 +*\*\ - RCC_PLLC_DIV36 +*\*\ - RCC_PLLC_DIV37 +*\*\ - RCC_PLLC_DIV38 +*\*\ - RCC_PLLC_DIV39 +*\*\ - RCC_PLLC_DIV40 +*\*\ - RCC_PLLC_DIV41 +*\*\ - RCC_PLLC_DIV42 +*\*\ - RCC_PLLC_DIV43 +*\*\ - RCC_PLLC_DIV44 +*\*\ - RCC_PLLC_DIV45 +*\*\ - RCC_PLLC_DIV46 +*\*\ - RCC_PLLC_DIV47 +*\*\ - RCC_PLLC_DIV48 +*\*\ - RCC_PLLC_DIV49 +*\*\ - RCC_PLLC_DIV50 +*\*\ - RCC_PLLC_DIV51 +*\*\ - RCC_PLLC_DIV52 +*\*\ - RCC_PLLC_DIV53 +*\*\ - RCC_PLLC_DIV54 +*\*\ - RCC_PLLC_DIV55 +*\*\ - RCC_PLLC_DIV56 +*\*\ - RCC_PLLC_DIV57 +*\*\ - RCC_PLLC_DIV58 +*\*\ - RCC_PLLC_DIV59 +*\*\ - RCC_PLLC_DIV60 +*\*\ - RCC_PLLC_DIV61 +*\*\ - RCC_PLLC_DIV62 +*\*\ - RCC_PLLC_DIV63 +*\*\return none. +**/ +void RCC_ConfigPLL2CDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->PLL2DIV; + /* Clear RCC_PLL2C_DIV bits */ + reg_value &= RCC_PLLC_DIV_MASK; + /* Set the DIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->PLL2DIV = reg_value; +} + +/** +*\*\name RCC_ConfigPLL2BDivider . +*\*\fun Configure PLL2 divider value to PLL2B. +*\*\param CLK_divider +*\*\ - RCC_PLLB_DIV1 +*\*\ - RCC_PLLB_DIV2 +*\*\ - RCC_PLLB_DIV3 +*\*\ - RCC_PLLB_DIV4 +*\*\ - RCC_PLLB_DIV5 +*\*\ - RCC_PLLB_DIV6 +*\*\ - RCC_PLLB_DIV7 +*\*\ - RCC_PLLB_DIV8 +*\*\ - RCC_PLLB_DIV9 +*\*\ - RCC_PLLB_DIV10 +*\*\ - RCC_PLLB_DIV11 +*\*\ - RCC_PLLB_DIV12 +*\*\ - RCC_PLLB_DIV13 +*\*\ - RCC_PLLB_DIV14 +*\*\ - RCC_PLLB_DIV15 +*\*\ - RCC_PLLB_DIV16 +*\*\ - RCC_PLLB_DIV17 +*\*\ - RCC_PLLB_DIV18 +*\*\ - RCC_PLLB_DIV19 +*\*\ - RCC_PLLB_DIV20 +*\*\ - RCC_PLLB_DIV21 +*\*\ - RCC_PLLB_DIV22 +*\*\ - RCC_PLLB_DIV23 +*\*\ - RCC_PLLB_DIV24 +*\*\ - RCC_PLLB_DIV25 +*\*\ - RCC_PLLB_DIV26 +*\*\ - RCC_PLLB_DIV27 +*\*\ - RCC_PLLB_DIV28 +*\*\ - RCC_PLLB_DIV29 +*\*\ - RCC_PLLB_DIV30 +*\*\ - RCC_PLLB_DIV31 +*\*\ - RCC_PLLB_DIV32 +*\*\ - RCC_PLLB_DIV33 +*\*\ - RCC_PLLB_DIV34 +*\*\ - RCC_PLLB_DIV35 +*\*\ - RCC_PLLB_DIV36 +*\*\ - RCC_PLLB_DIV37 +*\*\ - RCC_PLLB_DIV38 +*\*\ - RCC_PLLB_DIV39 +*\*\ - RCC_PLLB_DIV40 +*\*\ - RCC_PLLB_DIV41 +*\*\ - RCC_PLLB_DIV42 +*\*\ - RCC_PLLB_DIV43 +*\*\ - RCC_PLLB_DIV44 +*\*\ - RCC_PLLB_DIV45 +*\*\ - RCC_PLLB_DIV46 +*\*\ - RCC_PLLB_DIV47 +*\*\ - RCC_PLLB_DIV48 +*\*\ - RCC_PLLB_DIV49 +*\*\ - RCC_PLLB_DIV50 +*\*\ - RCC_PLLB_DIV51 +*\*\ - RCC_PLLB_DIV52 +*\*\ - RCC_PLLB_DIV53 +*\*\ - RCC_PLLB_DIV54 +*\*\ - RCC_PLLB_DIV55 +*\*\ - RCC_PLLB_DIV56 +*\*\ - RCC_PLLB_DIV57 +*\*\ - RCC_PLLB_DIV58 +*\*\ - RCC_PLLB_DIV59 +*\*\ - RCC_PLLB_DIV60 +*\*\ - RCC_PLLB_DIV61 +*\*\ - RCC_PLLB_DIV62 +*\*\ - RCC_PLLB_DIV63 +*\*\return none. +**/ +void RCC_ConfigPLL2BDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->PLL2DIV; + /* Clear RCC_PLL2B_DIV bits */ + reg_value &= RCC_PLLB_DIV_MASK; + /* Set the DIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->PLL2DIV = reg_value; +} + +/** +*\*\name RCC_ConfigPLL2ADivider . +*\*\fun Configure PLL2 divider value to PLL2A. +*\*\param CLK_divider +*\*\ - RCC_PLLA_DIV1 +*\*\ - RCC_PLLA_DIV2 +*\*\ - RCC_PLLA_DIV3 +*\*\ - RCC_PLLA_DIV4 +*\*\ - RCC_PLLA_DIV5 +*\*\ - RCC_PLLA_DIV6 +*\*\ - RCC_PLLA_DIV7 +*\*\ - RCC_PLLA_DIV8 +*\*\ - RCC_PLLA_DIV9 +*\*\ - RCC_PLLA_DIV10 +*\*\ - RCC_PLLA_DIV11 +*\*\ - RCC_PLLA_DIV12 +*\*\ - RCC_PLLA_DIV13 +*\*\ - RCC_PLLA_DIV14 +*\*\ - RCC_PLLA_DIV15 +*\*\ - RCC_PLLA_DIV16 +*\*\ - RCC_PLLA_DIV17 +*\*\ - RCC_PLLA_DIV18 +*\*\ - RCC_PLLA_DIV19 +*\*\ - RCC_PLLA_DIV20 +*\*\ - RCC_PLLA_DIV21 +*\*\ - RCC_PLLA_DIV22 +*\*\ - RCC_PLLA_DIV23 +*\*\ - RCC_PLLA_DIV24 +*\*\ - RCC_PLLA_DIV25 +*\*\ - RCC_PLLA_DIV26 +*\*\ - RCC_PLLA_DIV27 +*\*\ - RCC_PLLA_DIV28 +*\*\ - RCC_PLLA_DIV29 +*\*\ - RCC_PLLA_DIV30 +*\*\ - RCC_PLLA_DIV31 +*\*\ - RCC_PLLA_DIV32 +*\*\ - RCC_PLLA_DIV33 +*\*\ - RCC_PLLA_DIV34 +*\*\ - RCC_PLLA_DIV35 +*\*\ - RCC_PLLA_DIV36 +*\*\ - RCC_PLLA_DIV37 +*\*\ - RCC_PLLA_DIV38 +*\*\ - RCC_PLLA_DIV39 +*\*\ - RCC_PLLA_DIV40 +*\*\ - RCC_PLLA_DIV41 +*\*\ - RCC_PLLA_DIV42 +*\*\ - RCC_PLLA_DIV43 +*\*\ - RCC_PLLA_DIV44 +*\*\ - RCC_PLLA_DIV45 +*\*\ - RCC_PLLA_DIV46 +*\*\ - RCC_PLLA_DIV47 +*\*\ - RCC_PLLA_DIV48 +*\*\ - RCC_PLLA_DIV49 +*\*\ - RCC_PLLA_DIV50 +*\*\ - RCC_PLLA_DIV51 +*\*\ - RCC_PLLA_DIV52 +*\*\ - RCC_PLLA_DIV53 +*\*\ - RCC_PLLA_DIV54 +*\*\ - RCC_PLLA_DIV55 +*\*\ - RCC_PLLA_DIV56 +*\*\ - RCC_PLLA_DIV57 +*\*\ - RCC_PLLA_DIV58 +*\*\ - RCC_PLLA_DIV59 +*\*\ - RCC_PLLA_DIV60 +*\*\ - RCC_PLLA_DIV61 +*\*\ - RCC_PLLA_DIV62 +*\*\ - RCC_PLLA_DIV63 +*\*\return none. +**/ +void RCC_ConfigPLL2ADivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->PLL2DIV; + /* Clear RCC_PLL2A_DIV bits */ + reg_value &= RCC_PLLA_DIV_MASK; + /* Set the DIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->PLL2DIV = reg_value; +} + +/** +*\*\name RCC_ConfigPLL3CDivider . +*\*\fun Configure PLL3 divider value to PLL3C. +*\*\param CLK_divider +*\*\ - RCC_PLLC_DIV1 +*\*\ - RCC_PLLC_DIV2 +*\*\ - RCC_PLLC_DIV3 +*\*\ - RCC_PLLC_DIV4 +*\*\ - RCC_PLLC_DIV5 +*\*\ - RCC_PLLC_DIV6 +*\*\ - RCC_PLLC_DIV7 +*\*\ - RCC_PLLC_DIV8 +*\*\ - RCC_PLLC_DIV9 +*\*\ - RCC_PLLC_DIV10 +*\*\ - RCC_PLLC_DIV11 +*\*\ - RCC_PLLC_DIV12 +*\*\ - RCC_PLLC_DIV13 +*\*\ - RCC_PLLC_DIV14 +*\*\ - RCC_PLLC_DIV15 +*\*\ - RCC_PLLC_DIV16 +*\*\ - RCC_PLLC_DIV17 +*\*\ - RCC_PLLC_DIV18 +*\*\ - RCC_PLLC_DIV19 +*\*\ - RCC_PLLC_DIV20 +*\*\ - RCC_PLLC_DIV21 +*\*\ - RCC_PLLC_DIV22 +*\*\ - RCC_PLLC_DIV23 +*\*\ - RCC_PLLC_DIV24 +*\*\ - RCC_PLLC_DIV25 +*\*\ - RCC_PLLC_DIV26 +*\*\ - RCC_PLLC_DIV27 +*\*\ - RCC_PLLC_DIV28 +*\*\ - RCC_PLLC_DIV29 +*\*\ - RCC_PLLC_DIV30 +*\*\ - RCC_PLLC_DIV31 +*\*\ - RCC_PLLC_DIV32 +*\*\ - RCC_PLLC_DIV33 +*\*\ - RCC_PLLC_DIV34 +*\*\ - RCC_PLLC_DIV35 +*\*\ - RCC_PLLC_DIV36 +*\*\ - RCC_PLLC_DIV37 +*\*\ - RCC_PLLC_DIV38 +*\*\ - RCC_PLLC_DIV39 +*\*\ - RCC_PLLC_DIV40 +*\*\ - RCC_PLLC_DIV41 +*\*\ - RCC_PLLC_DIV42 +*\*\ - RCC_PLLC_DIV43 +*\*\ - RCC_PLLC_DIV44 +*\*\ - RCC_PLLC_DIV45 +*\*\ - RCC_PLLC_DIV46 +*\*\ - RCC_PLLC_DIV47 +*\*\ - RCC_PLLC_DIV48 +*\*\ - RCC_PLLC_DIV49 +*\*\ - RCC_PLLC_DIV50 +*\*\ - RCC_PLLC_DIV51 +*\*\ - RCC_PLLC_DIV52 +*\*\ - RCC_PLLC_DIV53 +*\*\ - RCC_PLLC_DIV54 +*\*\ - RCC_PLLC_DIV55 +*\*\ - RCC_PLLC_DIV56 +*\*\ - RCC_PLLC_DIV57 +*\*\ - RCC_PLLC_DIV58 +*\*\ - RCC_PLLC_DIV59 +*\*\ - RCC_PLLC_DIV60 +*\*\ - RCC_PLLC_DIV61 +*\*\ - RCC_PLLC_DIV62 +*\*\ - RCC_PLLC_DIV63 +*\*\return none. +**/ +void RCC_ConfigPLL3CDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->PLL3DIV; + /* Clear RCC_PLL3C_DIV bits */ + reg_value &= RCC_PLLC_DIV_MASK; + /* Set the DIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->PLL3DIV = reg_value; +} + +/** +*\*\name RCC_ConfigPLL3BDivider . +*\*\fun Configure PLL3 divider value to PLL3B. +*\*\param CLK_divider +*\*\ - RCC_PLLB_DIV1 +*\*\ - RCC_PLLB_DIV2 +*\*\ - RCC_PLLB_DIV3 +*\*\ - RCC_PLLB_DIV4 +*\*\ - RCC_PLLB_DIV5 +*\*\ - RCC_PLLB_DIV6 +*\*\ - RCC_PLLB_DIV7 +*\*\ - RCC_PLLB_DIV8 +*\*\ - RCC_PLLB_DIV9 +*\*\ - RCC_PLLB_DIV10 +*\*\ - RCC_PLLB_DIV11 +*\*\ - RCC_PLLB_DIV12 +*\*\ - RCC_PLLB_DIV13 +*\*\ - RCC_PLLB_DIV14 +*\*\ - RCC_PLLB_DIV15 +*\*\ - RCC_PLLB_DIV16 +*\*\ - RCC_PLLB_DIV17 +*\*\ - RCC_PLLB_DIV18 +*\*\ - RCC_PLLB_DIV19 +*\*\ - RCC_PLLB_DIV20 +*\*\ - RCC_PLLB_DIV21 +*\*\ - RCC_PLLB_DIV22 +*\*\ - RCC_PLLB_DIV23 +*\*\ - RCC_PLLB_DIV24 +*\*\ - RCC_PLLB_DIV25 +*\*\ - RCC_PLLB_DIV26 +*\*\ - RCC_PLLB_DIV27 +*\*\ - RCC_PLLB_DIV28 +*\*\ - RCC_PLLB_DIV29 +*\*\ - RCC_PLLB_DIV30 +*\*\ - RCC_PLLB_DIV31 +*\*\ - RCC_PLLB_DIV32 +*\*\ - RCC_PLLB_DIV33 +*\*\ - RCC_PLLB_DIV34 +*\*\ - RCC_PLLB_DIV35 +*\*\ - RCC_PLLB_DIV36 +*\*\ - RCC_PLLB_DIV37 +*\*\ - RCC_PLLB_DIV38 +*\*\ - RCC_PLLB_DIV39 +*\*\ - RCC_PLLB_DIV40 +*\*\ - RCC_PLLB_DIV41 +*\*\ - RCC_PLLB_DIV42 +*\*\ - RCC_PLLB_DIV43 +*\*\ - RCC_PLLB_DIV44 +*\*\ - RCC_PLLB_DIV45 +*\*\ - RCC_PLLB_DIV46 +*\*\ - RCC_PLLB_DIV47 +*\*\ - RCC_PLLB_DIV48 +*\*\ - RCC_PLLB_DIV49 +*\*\ - RCC_PLLB_DIV50 +*\*\ - RCC_PLLB_DIV51 +*\*\ - RCC_PLLB_DIV52 +*\*\ - RCC_PLLB_DIV53 +*\*\ - RCC_PLLB_DIV54 +*\*\ - RCC_PLLB_DIV55 +*\*\ - RCC_PLLB_DIV56 +*\*\ - RCC_PLLB_DIV57 +*\*\ - RCC_PLLB_DIV58 +*\*\ - RCC_PLLB_DIV59 +*\*\ - RCC_PLLB_DIV60 +*\*\ - RCC_PLLB_DIV61 +*\*\ - RCC_PLLB_DIV62 +*\*\ - RCC_PLLB_DIV63 +*\*\return none. +**/ +void RCC_ConfigPLL3BDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->PLL3DIV; + /* Clear RCC_PLL3B_DIV bits */ + reg_value &= RCC_PLLB_DIV_MASK; + /* Set the DIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->PLL3DIV = reg_value; +} + +/** +*\*\name RCC_ConfigPLL3ADivider . +*\*\fun Configure PLL3 divider value to PLL3A. +*\*\param CLK_divider +*\*\ - RCC_PLLA_DIV1 +*\*\ - RCC_PLLA_DIV2 +*\*\ - RCC_PLLA_DIV3 +*\*\ - RCC_PLLA_DIV4 +*\*\ - RCC_PLLA_DIV5 +*\*\ - RCC_PLLA_DIV6 +*\*\ - RCC_PLLA_DIV7 +*\*\ - RCC_PLLA_DIV8 +*\*\ - RCC_PLLA_DIV9 +*\*\ - RCC_PLLA_DIV10 +*\*\ - RCC_PLLA_DIV11 +*\*\ - RCC_PLLA_DIV12 +*\*\ - RCC_PLLA_DIV13 +*\*\ - RCC_PLLA_DIV14 +*\*\ - RCC_PLLA_DIV15 +*\*\ - RCC_PLLA_DIV16 +*\*\ - RCC_PLLA_DIV17 +*\*\ - RCC_PLLA_DIV18 +*\*\ - RCC_PLLA_DIV19 +*\*\ - RCC_PLLA_DIV20 +*\*\ - RCC_PLLA_DIV21 +*\*\ - RCC_PLLA_DIV22 +*\*\ - RCC_PLLA_DIV23 +*\*\ - RCC_PLLA_DIV24 +*\*\ - RCC_PLLA_DIV25 +*\*\ - RCC_PLLA_DIV26 +*\*\ - RCC_PLLA_DIV27 +*\*\ - RCC_PLLA_DIV28 +*\*\ - RCC_PLLA_DIV29 +*\*\ - RCC_PLLA_DIV30 +*\*\ - RCC_PLLA_DIV31 +*\*\ - RCC_PLLA_DIV32 +*\*\ - RCC_PLLA_DIV33 +*\*\ - RCC_PLLA_DIV34 +*\*\ - RCC_PLLA_DIV35 +*\*\ - RCC_PLLA_DIV36 +*\*\ - RCC_PLLA_DIV37 +*\*\ - RCC_PLLA_DIV38 +*\*\ - RCC_PLLA_DIV39 +*\*\ - RCC_PLLA_DIV40 +*\*\ - RCC_PLLA_DIV41 +*\*\ - RCC_PLLA_DIV42 +*\*\ - RCC_PLLA_DIV43 +*\*\ - RCC_PLLA_DIV44 +*\*\ - RCC_PLLA_DIV45 +*\*\ - RCC_PLLA_DIV46 +*\*\ - RCC_PLLA_DIV47 +*\*\ - RCC_PLLA_DIV48 +*\*\ - RCC_PLLA_DIV49 +*\*\ - RCC_PLLA_DIV50 +*\*\ - RCC_PLLA_DIV51 +*\*\ - RCC_PLLA_DIV52 +*\*\ - RCC_PLLA_DIV53 +*\*\ - RCC_PLLA_DIV54 +*\*\ - RCC_PLLA_DIV55 +*\*\ - RCC_PLLA_DIV56 +*\*\ - RCC_PLLA_DIV57 +*\*\ - RCC_PLLA_DIV58 +*\*\ - RCC_PLLA_DIV59 +*\*\ - RCC_PLLA_DIV60 +*\*\ - RCC_PLLA_DIV61 +*\*\ - RCC_PLLA_DIV62 +*\*\ - RCC_PLLA_DIV63 +*\*\return none. +**/ +void RCC_ConfigPLL3ADivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->PLL3DIV; + /* Clear RCC_PLL3A_DIV bits */ + reg_value &= RCC_PLLA_DIV_MASK; + /* Set the DIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->PLL3DIV = reg_value; +} + +/** +*\*\name RCC_ConfigAXIHyperDivider. +*\*\fun Obtained by dividing the m7_hyp_div_clk. +*\*\param CLK_divider +*\*\ - RCC_AXICLK_HYP_DIV1 +*\*\ - RCC_AXICLK_HYP_DIV2 +*\*\ - RCC_AXICLK_HYP_DIV4 +*\*\ - RCC_AXICLK_HYP_DIV8 +*\*\ - RCC_AXICLK_HYP_DIV16 +*\*\ - RCC_AXICLK_HYP_DIV32 +*\*\ - RCC_AXICLK_HYP_DIV64 +*\*\ - RCC_AXICLK_HYP_DIV128 +*\*\ - RCC_AXICLK_HYP_DIV256 +*\*\ - RCC_AXICLK_HYP_DIV512 +*\*\return none. +**/ +void RCC_ConfigAXIHyperDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->SYSBUSDIV1; + /* Clear AXIHYPDIV bits */ + reg_value &= RCC_AXICLK_HYP_DIV_MASK; + /* Set the AXIHYPDIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->SYSBUSDIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigM7HyperDivider . +*\*\fun Configure PLL2A divider value to m7_hyp_div_clk. +*\*\param CLK_divider +*\*\ - RCC_M7CLK_HYP_DIV1 +*\*\ - RCC_M7CLK_HYP_DIV2 +*\*\ - RCC_M7CLK_HYP_DIV4 +*\*\ - RCC_M7CLK_HYP_DIV8 +*\*\ - RCC_M7CLK_HYP_DIV16 +*\*\ - RCC_M7CLK_HYP_DIV32 +*\*\ - RCC_M7CLK_HYP_DIV64 +*\*\ - RCC_M7CLK_HYP_DIV128 +*\*\ - RCC_M7CLK_HYP_DIV256 +*\*\ - RCC_M7CLK_HYP_DIV512 +*\*\return none. +**/ +void RCC_ConfigM7HyperDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->SYSBUSDIV1; + /* Clear M7HYPDIV bits */ + reg_value &= RCC_M7CLK_HYP_DIV_MASK; + /* Set the M7HYPDIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->SYSBUSDIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigAXIclkDivider . +*\*\fun Obtained by dividing the sys_div_clk. +*\*\param CLK_divider +*\*\ - RCC_AXICLK_DIV1 +*\*\ - RCC_AXICLK_DIV2 +*\*\ - RCC_AXICLK_DIV4 +*\*\ - RCC_AXICLK_DIV8 +*\*\ - RCC_AXICLK_DIV16 +*\*\ - RCC_AXICLK_DIV32 +*\*\ - RCC_AXICLK_DIV64 +*\*\ - RCC_AXICLK_DIV128 +*\*\ - RCC_AXICLK_DIV256 +*\*\ - RCC_AXICLK_DIV512 +*\*\return none. +**/ +void RCC_ConfigAXIclkDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->SYSBUSDIV1; + /* Clear AXIDIV bits */ + reg_value &= RCC_AXICLK_DIV_MASK; + /* Set the AXIDIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->SYSBUSDIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigSysbusDivider . +*\*\fun Configure sys_div_clk divider value to sys_bus_div_clk. +*\*\param CLK_divider +*\*\ - RCC_BUSCLK_DIV1 +*\*\ - RCC_BUSCLK_DIV2 +*\*\ - RCC_BUSCLK_DIV4 +*\*\ - RCC_BUSCLK_DIV8 +*\*\ - RCC_BUSCLK_DIV16 +*\*\ - RCC_BUSCLK_DIV32 +*\*\ - RCC_BUSCLK_DIV64 +*\*\ - RCC_BUSCLK_DIV128 +*\*\ - RCC_BUSCLK_DIV256 +*\*\ - RCC_BUSCLK_DIV512 +*\*\return none. +**/ +void RCC_ConfigSysbusDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->SYSBUSDIV1; + /* Clear BUSDIV bits */ + reg_value &= RCC_BUSCLK_DIV_MASK; + /* Set the BUSDIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->SYSBUSDIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigSysclkDivider . +*\*\fun Configure sys_clk divider value to sys_div_clk. +*\*\param CLK_divider +*\*\ - RCC_SYSCLK_DIV1 +*\*\ - RCC_SYSCLK_DIV2 +*\*\ - RCC_SYSCLK_DIV4 +*\*\ - RCC_SYSCLK_DIV8 +*\*\ - RCC_SYSCLK_DIV16 +*\*\ - RCC_SYSCLK_DIV32 +*\*\ - RCC_SYSCLK_DIV64 +*\*\ - RCC_SYSCLK_DIV128 +*\*\ - RCC_SYSCLK_DIV256 +*\*\ - RCC_SYSCLK_DIV512 +*\*\return none. +**/ +void RCC_ConfigSysclkDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->SYSBUSDIV1; + /* Clear SCLKDIV bits */ + reg_value &= RCC_SYSCLK_DIV_MASK; + /* Set the SCLKDIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->SYSBUSDIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigAPBclkDivider . +*\*\fun Configure AHB1 clock divider value to APB1 clock. +*\*\param APB1_divider +*\*\ - RCC_APB1CLK_DIV1 +*\*\ - RCC_APB1CLK_DIV2 +*\*\ - RCC_APB1CLK_DIV4 +*\*\ - RCC_APB1CLK_DIV8 +*\*\ - RCC_APB1CLK_DIV16 +*\*\param APB2_divider +*\*\ - RCC_APB2CLK_DIV1 +*\*\ - RCC_APB2CLK_DIV2 +*\*\ - RCC_APB2CLK_DIV4 +*\*\ - RCC_APB2CLK_DIV8 +*\*\ - RCC_APB2CLK_DIV16 +*\*\param APB5_divider +*\*\ - RCC_APB5CLK_DIV1 +*\*\ - RCC_APB5CLK_DIV2 +*\*\ - RCC_APB5CLK_DIV4 +*\*\ - RCC_APB5CLK_DIV8 +*\*\ - RCC_APB5CLK_DIV16 +*\*\param APB6_divider +*\*\ - RCC_APB6CLK_DIV1 +*\*\ - RCC_APB6CLK_DIV2 +*\*\ - RCC_APB6CLK_DIV4 +*\*\ - RCC_APB6CLK_DIV8 +*\*\ - RCC_APB6CLK_DIV16 +*\*\return none. +**/ +void RCC_ConfigAPBclkDivider(uint32_t APB1_divider, uint32_t APB2_divider, uint32_t APB5_divider, uint32_t APB6_divider) +{ + uint32_t reg_value; + + reg_value = RCC->SYSBUSDIV2; + /* Clear APB1DIV bits */ + reg_value &= RCC_APBCLK_DIV_MASK; + /* Set the APB1DIV bits */ + reg_value |= (APB1_divider | APB2_divider | APB5_divider | APB6_divider); + /* Store the new value */ + RCC->SYSBUSDIV2 = reg_value; +} + + +/** +*\*\name RCC_EnableAHB1PeriphReset1. +*\*\fun AHB1 peripheral reset. +*\*\param AHB_periph specifies the AHB peripheral to reset. +*\*\ - RCC_AHB1_PERIPHRST_SDMMC2 +*\*\ - RCC_AHB1_PERIPHRST_SDHOST2 +*\*\ - RCC_AHB1_PERIPHRST_USB2WRAP +*\*\ - RCC_AHB1_PERIPHRST_USB2POR +*\*\ - RCC_AHB1_PERIPHRST_USB2 +*\*\ - RCC_AHB1_PERIPHRST_DMAMUX1 +*\*\ - RCC_AHB1_PERIPHRST_ADC1 +*\*\return none. +**/ +void RCC_EnableAHB1PeriphReset1(uint32_t AHB_periph) +{ + RCC->AHB1RST1 |= AHB_periph; + RCC->AHB1RST1 &= ~AHB_periph; +} + +/** +*\*\name RCC_EnableAHB1PeriphReset2. +*\*\fun AHB1 peripheral reset. +*\*\param AHB_periph specifies the AHB peripheral to reset. +*\*\ - RCC_AHB1_PERIPHRST_ETH2 +*\*\return none. +**/ +void RCC_EnableAHB1PeriphReset2(uint32_t AHB_periph) +{ + RCC->AHB1RST2 |= AHB_periph; + RCC->AHB1RST2 &= ~AHB_periph; +} + +/** +*\*\name RCC_EnableAHB1PeriphReset3. +*\*\fun AHB1 peripheral reset. +*\*\param AHB_periph specifies the AHB peripheral to reset. +*\*\ - RCC_AHB1_PERIPHRST_ECCMAC +*\*\ - RCC_AHB1_PERIPHRST_DMA1 +*\*\ - RCC_AHB1_PERIPHRST_DMA2 +*\*\ - RCC_AHB1_PERIPHRST_DMA3 +*\*\return none. +**/ +void RCC_EnableAHB1PeriphReset3(uint32_t AHB_periph) +{ + RCC->AHB1RST3 |= AHB_periph; + RCC->AHB1RST3 &= ~AHB_periph; +} + +/** +*\*\name RCC_EnableAHB1PeriphReset4. +*\*\fun AHB1 peripheral reset. +*\*\param AHB_periph specifies the AHB peripheral to reset. +*\*\ - RCC_AHB1_PERIPHRST_ADC2 +*\*\ - RCC_AHB1_PERIPHRST_ADC3 +*\*\return none. +**/ +void RCC_EnableAHB1PeriphReset4(uint32_t AHB_periph) +{ + RCC->AHB1RST4 |= AHB_periph; + RCC->AHB1RST4 &= ~AHB_periph; +} + +/** +*\*\name RCC_EnableAPB1PeriphReset1. +*\*\fun APB1 peripheral reset. +*\*\param APB_periph specifies the APB peripheral to reset. +*\*\ - RCC_APB1_PERIPHRST_BTIM1 +*\*\ - RCC_APB1_PERIPHRST_BTIM2 +*\*\ - RCC_APB1_PERIPHRST_BTIM3 +*\*\ - RCC_APB1_PERIPHRST_BTIM4 +*\*\ - RCC_APB1_PERIPHRST_GTIMB1 +*\*\ - RCC_APB1_PERIPHRST_GTIMB2 +*\*\ - RCC_APB1_PERIPHRST_GTIMB3 +*\*\ - RCC_APB1_PERIPHRST_GTIMA4 +*\*\return none. +**/ +void RCC_EnableAPB1PeriphReset1(uint32_t APB_periph) +{ + RCC->APB1RST1 |= APB_periph; + RCC->APB1RST1 &= ~APB_periph; +} + +/** +*\*\name RCC_EnableAPB1PeriphReset2. +*\*\fun APB1 peripheral reset. +*\*\param APB_periph specifies the APB peripheral to reset. +*\*\ - RCC_APB1_PERIPHRST_GTIMA5 +*\*\ - RCC_APB1_PERIPHRST_GTIMA6 +*\*\ - RCC_APB1_PERIPHRST_GTIMA7 +*\*\ - RCC_APB1_PERIPHRST_SPI3 +*\*\ - RCC_APB1_PERIPHRST_DAC12 +*\*\ - RCC_APB1_PERIPHRST_WWDG2 +*\*\return none. +**/ +void RCC_EnableAPB1PeriphReset2(uint32_t APB_periph) +{ + RCC->APB1RST2 |= APB_periph; + RCC->APB1RST2 &= ~APB_periph; +} + +/** +*\*\name RCC_EnableAPB1PeriphReset3. +*\*\fun APB1 peripheral reset. +*\*\param APB_periph specifies the APB peripheral to reset. +*\*\ - RCC_APB1_PERIPHRST_USART1 +*\*\ - RCC_APB1_PERIPHRST_USART2 +*\*\ - RCC_APB1_PERIPHRST_USART3 +*\*\ - RCC_APB1_PERIPHRST_USART4 +*\*\ - RCC_APB1_PERIPHRST_UART9 +*\*\ - RCC_APB1_PERIPHRST_UART10 +*\*\ - RCC_APB1_PERIPHRST_UART11 +*\*\ - RCC_APB1_PERIPHRST_UART12 +*\*\return none. +**/ +void RCC_EnableAPB1PeriphReset3(uint32_t APB_periph) +{ + RCC->APB1RST3 |= APB_periph; + RCC->APB1RST3 &= ~APB_periph; +} + +/** +*\*\name RCC_EnableAPB1PeriphReset4. +*\*\fun APB1 peripheral reset. +*\*\param APB_periph specifies the APB peripheral to reset. +*\*\ - RCC_APB1_PERIPHRST_I2S3 +*\*\ - RCC_APB1_PERIPHRST_I2S4 +*\*\ - RCC_APB1_PERIPHRST_I2C1 +*\*\ - RCC_APB1_PERIPHRST_I2C2 +*\*\ - RCC_APB1_PERIPHRST_I2C3 +*\*\return none. +**/ +void RCC_EnableAPB1PeriphReset4(uint32_t APB_periph) +{ + RCC->APB1RST4 |= APB_periph; + RCC->APB1RST4 &= ~APB_periph; +} + +/** +*\*\name RCC_EnableAPB1PeriphReset5. +*\*\fun APB1 peripheral reset. +*\*\param APB_periph specifies the APB peripheral to reset. +*\*\ - RCC_APB1_PERIPHRST_FDCAN1 +*\*\ - RCC_APB1_PERIPHRST_FDCAN2 +*\*\ - RCC_APB1_PERIPHRST_FDCAN5 +*\*\ - RCC_APB1_PERIPHRST_FDCAN6 +*\*\ - RCC_APB1_PERIPHRST_CAHI +*\*\ - RCC_APB1_PERIPHRST_CAHD +*\*\return none. +**/ +void RCC_EnableAPB1PeriphReset5(uint32_t APB_periph) +{ + RCC->APB1RST5 |= APB_periph; + RCC->APB1RST5 &= ~APB_periph; +} + +/** +*\*\name RCC_EnableAHB2PeriphReset1. +*\*\fun AHB2 peripheral reset. +*\*\param AHB_periph specifies the AHB peripheral to reset. +*\*\ - RCC_AHB2_PERIPHRST_DAC56 +*\*\ - RCC_AHB2_PERIPHRST_DAC34 +*\*\ - RCC_AHB2_PERIPHRST_USB1WRAP +*\*\ - RCC_AHB2_PERIPHRST_USB1POR +*\*\ - RCC_AHB2_PERIPHRST_USB1 +*\*\ - RCC_AHB2_PERIPHRST_ETH1 +*\*\ - RCC_AHB2_PERIPHRST_ECCM2 +*\*\ - RCC_AHB2_PERIPHRST_CORDIC +*\*\ - RCC_AHB2_PERIPHRST_SDPU +*\*\ - RCC_AHB2_PERIPHRST_FMAC +*\*\return none. +**/ +void RCC_EnableAHB2PeriphReset1(uint32_t AHB_periph) +{ + RCC->AHB2RST1 |= AHB_periph; + RCC->AHB2RST1 &= ~AHB_periph; +} + +/** +*\*\name RCC_EnableAPB2PeriphReset1. +*\*\fun APB2 peripheral reset. +*\*\param APB_periph specifies the APB peripheral to reset. +*\*\ - RCC_APB2_PERIPHRST_ATIM1 +*\*\ - RCC_APB2_PERIPHRST_ATIM2 +*\*\ - RCC_APB2_PERIPHRST_GTIMA1 +*\*\ - RCC_APB2_PERIPHRST_GTIMA2 +*\*\ - RCC_APB2_PERIPHRST_GTIMA3 +*\*\ - RCC_APB2_PERIPHRST_SHRTIM1 +*\*\ - RCC_APB2_PERIPHRST_SHRTIM2 +*\*\return none. +**/ +void RCC_EnableAPB2PeriphReset1(uint32_t APB_periph) +{ + RCC->APB2RST1 |= APB_periph; + RCC->APB2RST1 &= ~APB_periph; +} + +/** +*\*\name RCC_EnableAPB2PeriphReset2. +*\*\fun APB2 peripheral reset. +*\*\param APB_periph specifies the APB peripheral to reset. +*\*\ - RCC_APB2_PERIPHRST_I2S1 +*\*\ - RCC_APB2_PERIPHRST_I2S2 +*\*\ - RCC_APB2_PERIPHRST_SPI1 +*\*\ - RCC_APB2_PERIPHRST_SPI2 +*\*\ - RCC_APB2_PERIPHRST_DSMU +*\*\ - RCC_APB2_PERIPHRST_I2C4 +*\*\ - RCC_APB2_PERIPHRST_I2C5 +*\*\ - RCC_APB2_PERIPHRST_I2C6 +*\*\return none. +**/ +void RCC_EnableAPB2PeriphReset2(uint32_t APB_periph) +{ + RCC->APB2RST2 |= APB_periph; + RCC->APB2RST2 &= ~APB_periph; +} + +/** +*\*\name RCC_EnableAPB2PeriphReset3. +*\*\fun APB2 peripheral reset. +*\*\param APB_periph specifies the APB peripheral to reset. +*\*\ - RCC_APB2_PERIPHRST_USART5 +*\*\ - RCC_APB2_PERIPHRST_USART6 +*\*\ - RCC_APB2_PERIPHRST_USART7 +*\*\ - RCC_APB2_PERIPHRST_USART8 +*\*\ - RCC_APB2_PERIPHRST_UART13 +*\*\ - RCC_APB2_PERIPHRST_UART14 +*\*\ - RCC_APB2_PERIPHRST_UART15 +*\*\return none. +**/ +void RCC_EnableAPB2PeriphReset3(uint32_t APB_periph) +{ + RCC->APB2RST3 |= APB_periph; + RCC->APB2RST3 &= ~APB_periph; +} + +/** +*\*\name RCC_EnableAPB2PeriphReset4. +*\*\fun APB2 peripheral reset. +*\*\param APB_periph specifies the APB peripheral to reset. +*\*\ - RCC_APB2_PERIPHRST_FDCAN3 +*\*\ - RCC_APB2_PERIPHRST_FDCAN4 +*\*\ - RCC_APB2_PERIPHRST_FDCAN7 +*\*\ - RCC_APB2_PERIPHRST_FDCAN8 +*\*\return none. +**/ +void RCC_EnableAPB2PeriphReset4(uint32_t APB_periph) +{ + RCC->APB2RST4 |= APB_periph; + RCC->APB2RST4 &= ~APB_periph; +} + +/** +*\*\name RCC_EnableAHB5PeriphReset1. +*\*\fun AHB5 peripheral reset. +*\*\param AHB_periph specifies the AHB peripheral to reset. +*\*\ - RCC_AHB5_PERIPHRST_GPIOA +*\*\ - RCC_AHB5_PERIPHRST_GPIOB +*\*\ - RCC_AHB5_PERIPHRST_GPIOC +*\*\ - RCC_AHB5_PERIPHRST_GPIOD +*\*\ - RCC_AHB5_PERIPHRST_GPIOE +*\*\ - RCC_AHB5_PERIPHRST_GPIOF +*\*\ - RCC_AHB5_PERIPHRST_GPIOG +*\*\ - RCC_AHB5_PERIPHRST_GPIOH +*\*\return none. +**/ +void RCC_EnableAHB5PeriphReset1(uint32_t AHB_periph) +{ + RCC->AHB5RST1 |= AHB_periph; + RCC->AHB5RST1 &= ~AHB_periph; +} + +/** +*\*\name RCC_EnableAHB5PeriphReset2. +*\*\fun AHB5 peripheral reset. +*\*\param AHB_periph specifies the AHB peripheral to reset. +*\*\ - RCC_AHB5_PERIPHRST_GPIOI +*\*\ - RCC_AHB5_PERIPHRST_GPIOJ +*\*\ - RCC_AHB5_PERIPHRST_GPIOK +*\*\ - RCC_AHB5_PERIPHRST_ECCM3 +*\*\ - RCC_AHB5_PERIPHRST_PWR +*\*\ - RCC_AHB5_PERIPHRST_CRC +*\*\ - RCC_AHB5_PERIPHRST_SEMA4 +*\*\ - RCC_AHB5_PERIPHRST_AFIO +*\*\return none. +**/ +void RCC_EnableAHB5PeriphReset2(uint32_t AHB_periph) +{ + RCC->AHB5RST2 |= AHB_periph; + RCC->AHB5RST2 &= ~AHB_periph; +} + +/** +*\*\name RCC_EnableAPB5PeriphReset1. +*\*\fun APB5 peripheral reset. +*\*\param APB_periph specifies the APB peripheral to reset. +*\*\ - RCC_APB5_PERIPHRST_ATIM3 +*\*\ - RCC_APB5_PERIPHRST_ATIM4 +*\*\ - RCC_APB5_PERIPHRST_SPI4 +*\*\ - RCC_APB5_PERIPHRST_SPI5 +*\*\ - RCC_APB5_PERIPHRST_SPI6 +*\*\ - RCC_APB5_PERIPHRST_SPI7 +*\*\return none. +**/ +void RCC_EnableAPB5PeriphReset1(uint32_t APB_periph) +{ + RCC->APB5RST1 |= APB_periph; + RCC->APB5RST1 &= ~APB_periph; +} + +/** +*\*\name RCC_EnableAPB5PeriphReset2. +*\*\fun APB5 peripheral reset. +*\*\param APB_periph specifies the APB peripheral to reset. +*\*\ - RCC_APB5_PERIPHRST_I2C7 +*\*\ - RCC_APB5_PERIPHRST_I2C8 +*\*\ - RCC_APB5_PERIPHRST_I2C9 +*\*\ - RCC_APB5_PERIPHRST_I2C10 +*\*\return none. +**/ +void RCC_EnableAPB5PeriphReset2(uint32_t APB_periph) +{ + RCC->APB5RST2 |= APB_periph; + RCC->APB5RST2 &= ~APB_periph; +} + +/** +*\*\name RCC_EnableAXIPeriphReset1. +*\*\fun AXI/AHB6/APB6 peripheral reset. +*\*\param AXI_periph specifies the AXI/AHB6/APB6 peripheral to reset. +*\*\ - RCC_AXI_PERIPHRST_JPEGD +*\*\ - RCC_AXI_PERIPHRST_JPEGE +*\*\ - RCC_AXI_PERIPHRST_DMAMUX2 +*\*\ - RCC_AXI_PERIPHRST_MDMA +*\*\ - RCC_AXI_PERIPHRST_SDMMC1 +*\*\ - RCC_AXI_PERIPHRST_SDHOST1 +*\*\ - RCC_AXI_PERIPHRST_ECCM1 +*\*\ - RCC_AXI_PERIPHRST_OTPC +*\*\return none. +**/ +void RCC_EnableAXIPeriphReset1(uint32_t AXI_periph) +{ + RCC->AXIRST1 |= AXI_periph; + RCC->AXIRST1 &= ~AXI_periph; +} + +/** +*\*\name RCC_EnableAXIPeriphReset2. +*\*\fun AXI/AHB6/APB6 peripheral reset. +*\*\param AXI_periph specifies the AXI/AHB6/APB6 peripheral to reset. +*\*\ - RCC_AXI_PERIPHRST_DSICFG +*\*\ - RCC_AXI_PERIPHRST_DSI +*\*\ - RCC_AXI_PERIPHRST_LCDC +*\*\ - RCC_AXI_PERIPHRST_DVP1 +*\*\ - RCC_AXI_PERIPHRST_DVP2 +*\*\ - RCC_AXI_PERIPHRST_WWDG1 +*\*\return none. +**/ +void RCC_EnableAXIPeriphReset2(uint32_t AXI_periph) +{ + RCC->AXIRST2 |= AXI_periph; + RCC->AXIRST2 &= ~AXI_periph; +} + +/** +*\*\name RCC_EnableAXIPeriphReset3. +*\*\fun AXI/AHB6/APB6 peripheral reset. +*\*\param AXI_periph specifies the AXI/AHB6/APB6 peripheral to reset. +*\*\ - RCC_AXI_PERIPHRST_GPU +*\*\return none. +**/ +void RCC_EnableAXIPeriphReset3(uint32_t AXI_periph) +{ + RCC->AXIRST3 |= AXI_periph; + RCC->AXIRST3 &= ~AXI_periph; +} + +/** +*\*\name RCC_EnableAXIPeriphReset4. +*\*\fun AXI/AHB6/APB6 peripheral reset. +*\*\param AXI_periph specifies the AXI/AHB6/APB6 peripheral to reset. +*\*\ - RCC_AXI_PERIPHRST_XSPI1 +*\*\ - RCC_AXI_PERIPHRST_XSPI2 +*\*\ - RCC_AXI_PERIPHRST_FEMCCFG +*\*\ - RCC_AXI_PERIPHRST_FEMC +*\*\ - RCC_AXI_PERIPHRST_SDRAM +*\*\return none. +**/ +void RCC_EnableAXIPeriphReset4(uint32_t AXI_periph) +{ + RCC->AXIRST4 |= AXI_periph; + RCC->AXIRST4 &= ~AXI_periph; +} + +/** +*\*\name RCC_EnableAHB9PeriphReset1. +*\*\fun AHB9 peripheral reset. +*\*\param AHB_periph specifies the AHB9 peripheral to reset. +*\*\ - RCC_AHB9_PERIPHRST_ESC +*\*\return none. +**/ +void RCC_EnableAHB9PeriphReset1(uint32_t AHB_periph) +{ + RCC->AHB9RST1 |= AHB_periph; + RCC->AHB9RST1 &= ~AHB_periph; +} + +/** +*\*\name RCC_EnableRDPeriphReset1. +*\*\fun Retention domain peripheral reset. +*\*\param RD_periph specifies the Retention domain peripheral to reset. +*\*\ - RCC_RD_PERIPHRST_LPTIM1 +*\*\ - RCC_RD_PERIPHRST_LPTIM2 +*\*\ - RCC_RD_PERIPHRST_LPTIM3 +*\*\ - RCC_RD_PERIPHRST_LPTIM4 +*\*\ - RCC_RD_PERIPHRST_LPTIM5 +*\*\ - RCC_RD_PERIPHRST_LPUART1 +*\*\ - RCC_RD_PERIPHRST_LPUART2 +*\*\return none. +**/ +void RCC_EnableRDPeriphReset1(uint32_t RD_periph) +{ + RCC->RDRST1 |= RD_periph; + RCC->RDRST1 &= ~RD_periph; +} + +/** +*\*\name RCC_EnableRDPeriphReset2. +*\*\fun Retention domain peripheral reset. +*\*\param RD_periph specifies the Retention domain peripheral to reset. +*\*\ - RCC_RD_PERIPHRST_COMP +*\*\return none. +**/ +void RCC_EnableRDPeriphReset2(uint32_t RD_periph) +{ + RCC->RDRST2 |= RD_periph; + RCC->RDRST2 &= ~RD_periph; +} + +/** +*\*\name RCC_EnableAHB1PeriphClk1. +*\*\fun Enables the AHB1 peripheral clock. +*\*\param AHB_periph (AHB peripheral to gates its clock): +*\*\ - RCC_AHB1_PERIPHEN_M7_SDMMC2 +*\*\ - RCC_AHB1_PERIPHEN_M4_SDMMC2 +*\*\ - RCC_AHB1_PERIPHEN_M7_SDMMC2LP +*\*\ - RCC_AHB1_PERIPHEN_M4_SDMMC2LP +*\*\ - RCC_AHB1_PERIPHEN_M7_USB2 +*\*\ - RCC_AHB1_PERIPHEN_M4_USB2 +*\*\ - RCC_AHB1_PERIPHEN_M7_USB2LP +*\*\ - RCC_AHB1_PERIPHEN_M4_USB2LP +*\*\ - RCC_AHB1_PERIPHEN_M7_DMAMUX1 +*\*\ - RCC_AHB1_PERIPHEN_M4_DMAMUX1 +*\*\ - RCC_AHB1_PERIPHEN_M7_DMAMUX1LP +*\*\ - RCC_AHB1_PERIPHEN_M4_DMAMUX1LP +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC1PLL +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC1PLL +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC1PLLLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC1PLLLP +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC1SYS +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC1SYS +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC1SYSLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC1SYSLP +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC1BUS +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC1BUS +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC1BUSLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC1BUSLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAHB1PeriphClk1(uint32_t AHB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AHB1EN1 |= AHB_periph; + } + else + { + RCC->AHB1EN1 &= ~AHB_periph; + } +} + +/** +*\*\name RCC_EnableAHB1PeriphClk2. +*\*\fun Enables the AHB1 peripheral clock. +*\*\param AHB_periph (AHB peripheral to gates its clock): +*\*\ - RCC_AHB1_PERIPHEN_M7_ETH2TX +*\*\ - RCC_AHB1_PERIPHEN_M4_ETH2TX +*\*\ - RCC_AHB1_PERIPHEN_M7_ETH2TXLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ETH2TXLP +*\*\ - RCC_AHB1_PERIPHEN_M7_ETH2RX +*\*\ - RCC_AHB1_PERIPHEN_M4_ETH2RX +*\*\ - RCC_AHB1_PERIPHEN_M7_ETH2RXLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ETH2RXLP +*\*\ - RCC_AHB1_PERIPHEN_M7_ETH2MAC +*\*\ - RCC_AHB1_PERIPHEN_M4_ETH2MAC +*\*\ - RCC_AHB1_PERIPHEN_M7_ETH2MACLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ETH2MACLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAHB1PeriphClk2(uint32_t AHB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AHB1EN2 |= AHB_periph; + } + else + { + RCC->AHB1EN2 &= ~AHB_periph; + } +} + +/** +*\*\name RCC_EnableAHB1PeriphClk3. +*\*\fun Enables the AHB1 peripheral clock. +*\*\param AHB_periph (AHB peripheral to gates its clock): +*\*\ - RCC_AHB1_PERIPHEN_M7_ECCMAC +*\*\ - RCC_AHB1_PERIPHEN_M4_ECCMAC +*\*\ - RCC_AHB1_PERIPHEN_M7_ECCMACLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ECCMACLP +*\*\ - RCC_AHB1_PERIPHEN_M7_DMA1 +*\*\ - RCC_AHB1_PERIPHEN_M4_DMA1 +*\*\ - RCC_AHB1_PERIPHEN_M7_DMA1LP +*\*\ - RCC_AHB1_PERIPHEN_M4_DMA1LP +*\*\ - RCC_AHB1_PERIPHEN_M7_DMA2 +*\*\ - RCC_AHB1_PERIPHEN_M4_DMA2 +*\*\ - RCC_AHB1_PERIPHEN_M7_DMA2LP +*\*\ - RCC_AHB1_PERIPHEN_M4_DMA2LP +*\*\ - RCC_AHB1_PERIPHEN_M7_DMA3 +*\*\ - RCC_AHB1_PERIPHEN_M4_DMA3 +*\*\ - RCC_AHB1_PERIPHEN_M7_DMA3LP +*\*\ - RCC_AHB1_PERIPHEN_M4_DMA3LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAHB1PeriphClk3(uint32_t AHB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AHB1EN3 |= AHB_periph; + } + else + { + RCC->AHB1EN3 &= ~AHB_periph; + } +} + +/** +*\*\name RCC_EnableAHB1PeriphClk4. +*\*\fun Enables the AHB1 peripheral clock. +*\*\param AHB_periph (AHB peripheral to gates its clock): +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC2PLL +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC2PLL +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC2PLLLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC2PLLLP +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC2SYS +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC2SYS +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC2SYSLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC2SYSLP +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC2BUS +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC2BUS +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC2BUSLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC2BUSLP +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC3PLL +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC3PLL +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC3PLLLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC3PLLLP +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC3SYS +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC3SYS +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC3SYSLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC3SYSLP +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC3BUS +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC3BUS +*\*\ - RCC_AHB1_PERIPHEN_M7_ADC3BUSLP +*\*\ - RCC_AHB1_PERIPHEN_M4_ADC3BUSLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAHB1PeriphClk4(uint32_t AHB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AHB1EN4 |= AHB_periph; + } + else + { + RCC->AHB1EN4 &= ~AHB_periph; + } +} + +/** +*\*\name RCC_EnableAPB1PeriphClk1. +*\*\fun Enables the APB1 peripheral clock. +*\*\param APB_periph (APB peripheral to gates its clock): +*\*\ - RCC_APB1_PERIPHEN_M7_BTIM1 +*\*\ - RCC_APB1_PERIPHEN_M4_BTIM1 +*\*\ - RCC_APB1_PERIPHEN_M7_BTIM1LP +*\*\ - RCC_APB1_PERIPHEN_M4_BTIM1LP +*\*\ - RCC_APB1_PERIPHEN_M7_BTIM2 +*\*\ - RCC_APB1_PERIPHEN_M4_BTIM2 +*\*\ - RCC_APB1_PERIPHEN_M7_BTIM2LP +*\*\ - RCC_APB1_PERIPHEN_M4_BTIM2LP +*\*\ - RCC_APB1_PERIPHEN_M7_BTIM3 +*\*\ - RCC_APB1_PERIPHEN_M4_BTIM3 +*\*\ - RCC_APB1_PERIPHEN_M7_BTIM3LP +*\*\ - RCC_APB1_PERIPHEN_M4_BTIM3LP +*\*\ - RCC_APB1_PERIPHEN_M7_BTIM4 +*\*\ - RCC_APB1_PERIPHEN_M4_BTIM4 +*\*\ - RCC_APB1_PERIPHEN_M7_BTIM4LP +*\*\ - RCC_APB1_PERIPHEN_M4_BTIM4LP +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMB1 +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMB1 +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMB1LP +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMB1LP +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMB2 +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMB2 +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMB2LP +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMB2LP +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMB3 +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMB3 +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMB3LP +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMB3LP +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMA4 +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMA4 +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMA4LP +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMA4LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAPB1PeriphClk1(uint32_t APB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB1EN1 |= APB_periph; + } + else + { + RCC->APB1EN1 &= ~APB_periph; + } +} + +/** +*\*\name RCC_EnableAPB1PeriphClk2. +*\*\fun Enables the APB1 peripheral clock. +*\*\param APB_periph (APB peripheral to gates its clock): +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMA5 +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMA5 +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMA5LP +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMA5LP +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMA6 +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMA6 +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMA6LP +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMA6LP +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMA7 +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMA7 +*\*\ - RCC_APB1_PERIPHEN_M7_GTIMA7LP +*\*\ - RCC_APB1_PERIPHEN_M4_GTIMA7LP +*\*\ - RCC_APB1_PERIPHEN_M7_SPI3 +*\*\ - RCC_APB1_PERIPHEN_M4_SPI3 +*\*\ - RCC_APB1_PERIPHEN_M7_SPI3LP +*\*\ - RCC_APB1_PERIPHEN_M4_SPI3LP +*\*\ - RCC_APB1_PERIPHEN_M7_DAC12 +*\*\ - RCC_APB1_PERIPHEN_M4_DAC12 +*\*\ - RCC_APB1_PERIPHEN_M7_DAC12LP +*\*\ - RCC_APB1_PERIPHEN_M4_DAC12LP +*\*\ - RCC_APB1_PERIPHEN_M7_WWDG2 +*\*\ - RCC_APB1_PERIPHEN_M4_WWDG2 +*\*\ - RCC_APB1_PERIPHEN_M7_WWDG2LP +*\*\ - RCC_APB1_PERIPHEN_M4_WWDG2LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAPB1PeriphClk2(uint32_t APB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB1EN2 |= APB_periph; + } + else + { + RCC->APB1EN2 &= ~APB_periph; + } +} + +/** +*\*\name RCC_EnableAPB1PeriphClk3. +*\*\fun Enables the APB1 peripheral clock. +*\*\param APB_periph (APB peripheral to gates its clock): +*\*\ - RCC_APB1_PERIPHEN_M7_USART1 +*\*\ - RCC_APB1_PERIPHEN_M4_USART1 +*\*\ - RCC_APB1_PERIPHEN_M7_USART1LP +*\*\ - RCC_APB1_PERIPHEN_M4_USART1LP +*\*\ - RCC_APB1_PERIPHEN_M7_USART2 +*\*\ - RCC_APB1_PERIPHEN_M4_USART2 +*\*\ - RCC_APB1_PERIPHEN_M7_USART2LP +*\*\ - RCC_APB1_PERIPHEN_M4_USART2LP +*\*\ - RCC_APB1_PERIPHEN_M7_USART3 +*\*\ - RCC_APB1_PERIPHEN_M4_USART3 +*\*\ - RCC_APB1_PERIPHEN_M7_USART3LP +*\*\ - RCC_APB1_PERIPHEN_M4_USART3LP +*\*\ - RCC_APB1_PERIPHEN_M7_USART4 +*\*\ - RCC_APB1_PERIPHEN_M4_USART4 +*\*\ - RCC_APB1_PERIPHEN_M7_USART4LP +*\*\ - RCC_APB1_PERIPHEN_M4_USART4LP +*\*\ - RCC_APB1_PERIPHEN_M7_UART9 +*\*\ - RCC_APB1_PERIPHEN_M4_UART9 +*\*\ - RCC_APB1_PERIPHEN_M7_UART9LP +*\*\ - RCC_APB1_PERIPHEN_M4_UART9LP +*\*\ - RCC_APB1_PERIPHEN_M7_UART10 +*\*\ - RCC_APB1_PERIPHEN_M4_UART10 +*\*\ - RCC_APB1_PERIPHEN_M7_UART10LP +*\*\ - RCC_APB1_PERIPHEN_M4_UART10LP +*\*\ - RCC_APB1_PERIPHEN_M7_UART11 +*\*\ - RCC_APB1_PERIPHEN_M4_UART11 +*\*\ - RCC_APB1_PERIPHEN_M7_UART11LP +*\*\ - RCC_APB1_PERIPHEN_M4_UART11LP +*\*\ - RCC_APB1_PERIPHEN_M7_UART12 +*\*\ - RCC_APB1_PERIPHEN_M4_UART12 +*\*\ - RCC_APB1_PERIPHEN_M7_UART12LP +*\*\ - RCC_APB1_PERIPHEN_M4_UART12LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAPB1PeriphClk3(uint32_t APB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB1EN3 |= APB_periph; + } + else + { + RCC->APB1EN3 &= ~APB_periph; + } +} + +/** +*\*\name RCC_EnableAPB1PeriphClk4. +*\*\fun Enables the APB1 peripheral clock. +*\*\param APB_periph (APB peripheral to gates its clock): +*\*\ - RCC_APB1_PERIPHEN_M7_I2S3 +*\*\ - RCC_APB1_PERIPHEN_M4_I2S3 +*\*\ - RCC_APB1_PERIPHEN_M7_I2S3LP +*\*\ - RCC_APB1_PERIPHEN_M4_I2S3LP +*\*\ - RCC_APB1_PERIPHEN_M7_I2S4 +*\*\ - RCC_APB1_PERIPHEN_M4_I2S4 +*\*\ - RCC_APB1_PERIPHEN_M7_I2S4LP +*\*\ - RCC_APB1_PERIPHEN_M4_I2S4LP +*\*\ - RCC_APB1_PERIPHEN_M7_I2C1 +*\*\ - RCC_APB1_PERIPHEN_M4_I2C1 +*\*\ - RCC_APB1_PERIPHEN_M7_I2C1LP +*\*\ - RCC_APB1_PERIPHEN_M4_I2C1LP +*\*\ - RCC_APB1_PERIPHEN_M7_I2C2 +*\*\ - RCC_APB1_PERIPHEN_M4_I2C2 +*\*\ - RCC_APB1_PERIPHEN_M7_I2C2LP +*\*\ - RCC_APB1_PERIPHEN_M4_I2C2LP +*\*\ - RCC_APB1_PERIPHEN_M7_I2C3 +*\*\ - RCC_APB1_PERIPHEN_M4_I2C3 +*\*\ - RCC_APB1_PERIPHEN_M7_I2C3LP +*\*\ - RCC_APB1_PERIPHEN_M4_I2C3LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAPB1PeriphClk4(uint32_t APB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB1EN4 |= APB_periph; + } + else + { + RCC->APB1EN4 &= ~APB_periph; + } +} + +/** +*\*\name RCC_EnableAPB1PeriphClk5. +*\*\fun Enables the APB1 peripheral clock. +*\*\param APB_periph (APB peripheral to gates its clock): +*\*\ - RCC_APB1_PERIPHEN_M7_FDCAN1 +*\*\ - RCC_APB1_PERIPHEN_M4_FDCAN1 +*\*\ - RCC_APB1_PERIPHEN_M7_FDCAN1LP +*\*\ - RCC_APB1_PERIPHEN_M4_FDCAN1LP +*\*\ - RCC_APB1_PERIPHEN_M7_FDCAN2 +*\*\ - RCC_APB1_PERIPHEN_M4_FDCAN2 +*\*\ - RCC_APB1_PERIPHEN_M7_FDCAN2LP +*\*\ - RCC_APB1_PERIPHEN_M4_FDCAN2LP +*\*\ - RCC_APB1_PERIPHEN_M7_FDCAN5 +*\*\ - RCC_APB1_PERIPHEN_M4_FDCAN5 +*\*\ - RCC_APB1_PERIPHEN_M7_FDCAN5LP +*\*\ - RCC_APB1_PERIPHEN_M4_FDCAN5LP +*\*\ - RCC_APB1_PERIPHEN_M7_FDCAN6 +*\*\ - RCC_APB1_PERIPHEN_M4_FDCAN6 +*\*\ - RCC_APB1_PERIPHEN_M7_FDCAN6LP +*\*\ - RCC_APB1_PERIPHEN_M4_FDCAN6LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAPB1PeriphClk5(uint32_t APB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB1EN5 |= APB_periph; + } + else + { + RCC->APB1EN5 &= ~APB_periph; + } +} + +/** +*\*\name RCC_EnableAHB2PeriphClk1. +*\*\fun Enables the AHB2 peripheral clock. +*\*\param AHB_periph (AHB peripheral to gates its clock): +*\*\ - RCC_AHB2_PERIPHEN_M7_USB1 +*\*\ - RCC_AHB2_PERIPHEN_M4_USB1 +*\*\ - RCC_AHB2_PERIPHEN_M7_USB1LP +*\*\ - RCC_AHB2_PERIPHEN_M4_USB1LP +*\*\ - RCC_AHB2_PERIPHEN_M7_ECCM2 +*\*\ - RCC_AHB2_PERIPHEN_M4_ECCM2 +*\*\ - RCC_AHB2_PERIPHEN_M7_ECCM2LP +*\*\ - RCC_AHB2_PERIPHEN_M4_ECCM2LP +*\*\ - RCC_AHB2_PERIPHEN_M7_CORDIC +*\*\ - RCC_AHB2_PERIPHEN_M4_CORDIC +*\*\ - RCC_AHB2_PERIPHEN_M7_CORDICLP +*\*\ - RCC_AHB2_PERIPHEN_M4_CORDICLP +*\*\ - RCC_AHB2_PERIPHEN_M7_SDPU +*\*\ - RCC_AHB2_PERIPHEN_M4_SDPU +*\*\ - RCC_AHB2_PERIPHEN_M7_SDPULP +*\*\ - RCC_AHB2_PERIPHEN_M4_SDPULP +*\*\ - RCC_AHB2_PERIPHEN_M7_FMAC +*\*\ - RCC_AHB2_PERIPHEN_M4_FMAC +*\*\ - RCC_AHB2_PERIPHEN_M7_FMACLP +*\*\ - RCC_AHB2_PERIPHEN_M4_FMACLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAHB2PeriphClk1(uint32_t AHB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AHB2EN1 |= AHB_periph; + } + else + { + RCC->AHB2EN1 &= ~AHB_periph; + } +} + +/** +*\*\name RCC_EnableAHB2PeriphClk2. +*\*\fun Enables the AHB2 peripheral clock. +*\*\param AHB_periph (AHB peripheral to gates its clock): +*\*\ - RCC_AHB2_PERIPHEN_M7_DAC56 +*\*\ - RCC_AHB2_PERIPHEN_M4_DAC56 +*\*\ - RCC_AHB2_PERIPHEN_M7_DAC56LP +*\*\ - RCC_AHB2_PERIPHEN_M4_DAC56LP +*\*\ - RCC_AHB2_PERIPHEN_M7_DAC34 +*\*\ - RCC_AHB2_PERIPHEN_M4_DAC34 +*\*\ - RCC_AHB2_PERIPHEN_M7_DAC34LP +*\*\ - RCC_AHB2_PERIPHEN_M4_DAC34LP +*\*\ - RCC_AHB2_PERIPHEN_M7_ETH1TX +*\*\ - RCC_AHB2_PERIPHEN_M4_ETH1TX +*\*\ - RCC_AHB2_PERIPHEN_M7_ETH1TXLP +*\*\ - RCC_AHB2_PERIPHEN_M4_ETH1TXLP +*\*\ - RCC_AHB2_PERIPHEN_M7_ETH1RX +*\*\ - RCC_AHB2_PERIPHEN_M4_ETH1RX +*\*\ - RCC_AHB2_PERIPHEN_M7_ETH1RXLP +*\*\ - RCC_AHB2_PERIPHEN_M4_ETH1RXLP +*\*\ - RCC_AHB2_PERIPHEN_M7_ETH1MAC +*\*\ - RCC_AHB2_PERIPHEN_M4_ETH1MAC +*\*\ - RCC_AHB2_PERIPHEN_M7_ETH1MACLP +*\*\ - RCC_AHB2_PERIPHEN_M4_ETH1MACLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAHB2PeriphClk2(uint32_t AHB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AHB2EN2 |= AHB_periph; + } + else + { + RCC->AHB2EN2 &= ~AHB_periph; + } +} + +/** +*\*\name RCC_EnableAPB2PeriphClk1. +*\*\fun Enables the APB2 peripheral clock. +*\*\param APB_periph (APB peripheral to gates its clock): +*\*\ - RCC_APB2_PERIPHEN_M7_ATIM1 +*\*\ - RCC_APB2_PERIPHEN_M4_ATIM1 +*\*\ - RCC_APB2_PERIPHEN_M7_ATIM1LP +*\*\ - RCC_APB2_PERIPHEN_M4_ATIM1LP +*\*\ - RCC_APB2_PERIPHEN_M7_ATIM2 +*\*\ - RCC_APB2_PERIPHEN_M4_ATIM2 +*\*\ - RCC_APB2_PERIPHEN_M7_ATIM2LP +*\*\ - RCC_APB2_PERIPHEN_M4_ATIM2LP +*\*\ - RCC_APB2_PERIPHEN_M7_GTIMA1 +*\*\ - RCC_APB2_PERIPHEN_M4_GTIMA1 +*\*\ - RCC_APB2_PERIPHEN_M7_GTIMA1LP +*\*\ - RCC_APB2_PERIPHEN_M4_GTIMA1LP +*\*\ - RCC_APB2_PERIPHEN_M7_GTIMA2 +*\*\ - RCC_APB2_PERIPHEN_M4_GTIMA2 +*\*\ - RCC_APB2_PERIPHEN_M7_GTIMA2LP +*\*\ - RCC_APB2_PERIPHEN_M4_GTIMA2LP +*\*\ - RCC_APB2_PERIPHEN_M7_GTIMA3 +*\*\ - RCC_APB2_PERIPHEN_M4_GTIMA3 +*\*\ - RCC_APB2_PERIPHEN_M7_GTIMA3LP +*\*\ - RCC_APB2_PERIPHEN_M4_GTIMA3LP +*\*\ - RCC_APB2_PERIPHEN_M7_SHRTIM1 +*\*\ - RCC_APB2_PERIPHEN_M4_SHRTIM1 +*\*\ - RCC_APB2_PERIPHEN_M7_SHRTIM1LP +*\*\ - RCC_APB2_PERIPHEN_M4_SHRTIM1LP +*\*\ - RCC_APB2_PERIPHEN_M7_SHRTIM2 +*\*\ - RCC_APB2_PERIPHEN_M4_SHRTIM2 +*\*\ - RCC_APB2_PERIPHEN_M7_SHRTIM2LP +*\*\ - RCC_APB2_PERIPHEN_M4_SHRTIM2LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAPB2PeriphClk1(uint32_t APB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB2EN1 |= APB_periph; + } + else + { + RCC->APB2EN1 &= ~APB_periph; + } +} + +/** +*\*\name RCC_EnableAPB2PeriphClk2. +*\*\fun Enables the APB2 peripheral clock. +*\*\param APB_periph (APB peripheral to gates its clock): +*\*\ - RCC_APB2_PERIPHEN_M7_I2S1 +*\*\ - RCC_APB2_PERIPHEN_M4_I2S1 +*\*\ - RCC_APB2_PERIPHEN_M7_I2S1LP +*\*\ - RCC_APB2_PERIPHEN_M4_I2S1LP +*\*\ - RCC_APB2_PERIPHEN_M7_I2S2 +*\*\ - RCC_APB2_PERIPHEN_M4_I2S2 +*\*\ - RCC_APB2_PERIPHEN_M7_I2S2LP +*\*\ - RCC_APB2_PERIPHEN_M4_I2S2LP +*\*\ - RCC_APB2_PERIPHEN_M7_SPI1 +*\*\ - RCC_APB2_PERIPHEN_M4_SPI1 +*\*\ - RCC_APB2_PERIPHEN_M7_SPI1LP +*\*\ - RCC_APB2_PERIPHEN_M4_SPI1LP +*\*\ - RCC_APB2_PERIPHEN_M7_SPI2 +*\*\ - RCC_APB2_PERIPHEN_M4_SPI2 +*\*\ - RCC_APB2_PERIPHEN_M7_SPI2LP +*\*\ - RCC_APB2_PERIPHEN_M4_SPI2LP +*\*\ - RCC_APB2_PERIPHEN_M7_DSMU +*\*\ - RCC_APB2_PERIPHEN_M4_DSMU +*\*\ - RCC_APB2_PERIPHEN_M7_DSMULP +*\*\ - RCC_APB2_PERIPHEN_M4_DSMULP +*\*\ - RCC_APB2_PERIPHEN_M7_I2C4 +*\*\ - RCC_APB2_PERIPHEN_M4_I2C4 +*\*\ - RCC_APB2_PERIPHEN_M7_I2C4LP +*\*\ - RCC_APB2_PERIPHEN_M4_I2C4LP +*\*\ - RCC_APB2_PERIPHEN_M7_I2C5 +*\*\ - RCC_APB2_PERIPHEN_M4_I2C5 +*\*\ - RCC_APB2_PERIPHEN_M7_I2C5LP +*\*\ - RCC_APB2_PERIPHEN_M4_I2C5LP +*\*\ - RCC_APB2_PERIPHEN_M7_I2C6 +*\*\ - RCC_APB2_PERIPHEN_M4_I2C6 +*\*\ - RCC_APB2_PERIPHEN_M7_I2C6LP +*\*\ - RCC_APB2_PERIPHEN_M4_I2C6LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAPB2PeriphClk2(uint32_t APB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB2EN2 |= APB_periph; + } + else + { + RCC->APB2EN2 &= ~APB_periph; + } +} + +/** +*\*\name RCC_EnableAPB2PeriphClk3. +*\*\fun Enables the APB2 peripheral clock. +*\*\param APB_periph (APB peripheral to gates its clock): +*\*\ - RCC_APB2_PERIPHEN_M7_USART5 +*\*\ - RCC_APB2_PERIPHEN_M4_USART5 +*\*\ - RCC_APB2_PERIPHEN_M7_USART5LP +*\*\ - RCC_APB2_PERIPHEN_M4_USART5LP +*\*\ - RCC_APB2_PERIPHEN_M7_USART6 +*\*\ - RCC_APB2_PERIPHEN_M4_USART6 +*\*\ - RCC_APB2_PERIPHEN_M7_USART6LP +*\*\ - RCC_APB2_PERIPHEN_M4_USART6LP +*\*\ - RCC_APB2_PERIPHEN_M7_USART7 +*\*\ - RCC_APB2_PERIPHEN_M4_USART7 +*\*\ - RCC_APB2_PERIPHEN_M7_USART7LP +*\*\ - RCC_APB2_PERIPHEN_M4_USART7LP +*\*\ - RCC_APB2_PERIPHEN_M7_USART8 +*\*\ - RCC_APB2_PERIPHEN_M4_USART8 +*\*\ - RCC_APB2_PERIPHEN_M7_USART8LP +*\*\ - RCC_APB2_PERIPHEN_M4_USART8LP +*\*\ - RCC_APB2_PERIPHEN_M7_UART13 +*\*\ - RCC_APB2_PERIPHEN_M4_UART13 +*\*\ - RCC_APB2_PERIPHEN_M7_UART13LP +*\*\ - RCC_APB2_PERIPHEN_M4_UART13LP +*\*\ - RCC_APB2_PERIPHEN_M7_UART14 +*\*\ - RCC_APB2_PERIPHEN_M4_UART14 +*\*\ - RCC_APB2_PERIPHEN_M7_UART14LP +*\*\ - RCC_APB2_PERIPHEN_M4_UART14LP +*\*\ - RCC_APB2_PERIPHEN_M7_UART15 +*\*\ - RCC_APB2_PERIPHEN_M4_UART15 +*\*\ - RCC_APB2_PERIPHEN_M7_UART15LP +*\*\ - RCC_APB2_PERIPHEN_M4_UART15LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAPB2PeriphClk3(uint32_t APB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB2EN3 |= APB_periph; + } + else + { + RCC->APB2EN3 &= ~APB_periph; + } +} + +/** +*\*\name RCC_EnableAPB2PeriphClk4. +*\*\fun Enables the APB2 peripheral clock. +*\*\param APB_periph (APB peripheral to gates its clock): +*\*\ - RCC_APB2_PERIPHEN_M7_FDCAN3 +*\*\ - RCC_APB2_PERIPHEN_M4_FDCAN3 +*\*\ - RCC_APB2_PERIPHEN_M7_FDCAN3LP +*\*\ - RCC_APB2_PERIPHEN_M4_FDCAN3LP +*\*\ - RCC_APB2_PERIPHEN_M7_FDCAN4 +*\*\ - RCC_APB2_PERIPHEN_M4_FDCAN4 +*\*\ - RCC_APB2_PERIPHEN_M7_FDCAN4LP +*\*\ - RCC_APB2_PERIPHEN_M4_FDCAN4LP +*\*\ - RCC_APB2_PERIPHEN_M7_FDCAN7 +*\*\ - RCC_APB2_PERIPHEN_M4_FDCAN7 +*\*\ - RCC_APB2_PERIPHEN_M7_FDCAN7LP +*\*\ - RCC_APB2_PERIPHEN_M4_FDCAN7LP +*\*\ - RCC_APB2_PERIPHEN_M7_FDCAN8 +*\*\ - RCC_APB2_PERIPHEN_M4_FDCAN8 +*\*\ - RCC_APB2_PERIPHEN_M7_FDCAN8LP +*\*\ - RCC_APB2_PERIPHEN_M4_FDCAN8LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAPB2PeriphClk4(uint32_t APB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB2EN4 |= APB_periph; + } + else + { + RCC->APB2EN4 &= ~APB_periph; + } +} + +/** +*\*\name RCC_EnableAHB5PeriphClk1. +*\*\fun Enables the AHB5 peripheral clock. +*\*\param AHB_periph (AHB peripheral to gates its clock): +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOA +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOA +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOALP +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOALP +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOB +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOB +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOBLP +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOBLP +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOC +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOC +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOCLP +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOCLP +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOD +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOD +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIODLP +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIODLP +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOE +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOE +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOELP +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOELP +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOF +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOF +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOFLP +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOFLP +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOG +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOG +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOGLP +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOGLP +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOH +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOH +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOHLP +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOHLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAHB5PeriphClk1(uint32_t AHB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AHB5EN1 |= AHB_periph; + } + else + { + RCC->AHB5EN1 &= ~AHB_periph; + } +} + +/** +*\*\name RCC_EnableAHB5PeriphClk2. +*\*\fun Enables the AHB5 peripheral clock. +*\*\param AHB_periph (AHB peripheral to gates its clock): +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOI +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOI +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOILP +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOILP +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOJ +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOJ +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOJLP +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOJLP +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOK +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOK +*\*\ - RCC_AHB5_PERIPHEN_M7_GPIOKLP +*\*\ - RCC_AHB5_PERIPHEN_M4_GPIOKLP +*\*\ - RCC_AHB5_PERIPHEN_M7_ECCM3 +*\*\ - RCC_AHB5_PERIPHEN_M4_ECCM3 +*\*\ - RCC_AHB5_PERIPHEN_M7_ECCM3LP +*\*\ - RCC_AHB5_PERIPHEN_M4_ECCM3LP +*\*\ - RCC_AHB5_PERIPHEN_PWR +*\*\ - RCC_AHB5_PERIPHEN_PWRLP +*\*\ - RCC_AHB5_PERIPHEN_M7_CRC +*\*\ - RCC_AHB5_PERIPHEN_M4_CRC +*\*\ - RCC_AHB5_PERIPHEN_M7_CRCLP +*\*\ - RCC_AHB5_PERIPHEN_M4_CRCLP +*\*\ - RCC_AHB5_PERIPHEN_M7_SEMA4 +*\*\ - RCC_AHB5_PERIPHEN_M4_SEMA4 +*\*\ - RCC_AHB5_PERIPHEN_M7_SEMA4LP +*\*\ - RCC_AHB5_PERIPHEN_M4_SEMA4LP +*\*\ - RCC_AHB5_PERIPHEN_M7_AFIO +*\*\ - RCC_AHB5_PERIPHEN_M4_AFIO +*\*\ - RCC_AHB5_PERIPHEN_M7_AFIOLP +*\*\ - RCC_AHB5_PERIPHEN_M4_AFIOLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAHB5PeriphClk2(uint32_t AHB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AHB5EN2 |= AHB_periph; + } + else + { + RCC->AHB5EN2 &= ~AHB_periph; + } +} + +/** +*\*\name RCC_EnableAPB5PeriphClk1. +*\*\fun Enables the APB5 peripheral clock. +*\*\param APB_periph (APB peripheral to gates its clock): +*\*\ - RCC_APB5_PERIPHEN_M7_ATIM3 +*\*\ - RCC_APB5_PERIPHEN_M4_ATIM3 +*\*\ - RCC_APB5_PERIPHEN_M7_ATIM3LP +*\*\ - RCC_APB5_PERIPHEN_M4_ATIM3LP +*\*\ - RCC_APB5_PERIPHEN_M7_ATIM4 +*\*\ - RCC_APB5_PERIPHEN_M4_ATIM4 +*\*\ - RCC_APB5_PERIPHEN_M7_ATIM4LP +*\*\ - RCC_APB5_PERIPHEN_M4_ATIM4LP +*\*\ - RCC_APB5_PERIPHEN_M7_AFEC +*\*\ - RCC_APB5_PERIPHEN_M4_AFEC +*\*\ - RCC_APB5_PERIPHEN_M7_AFECLP +*\*\ - RCC_APB5_PERIPHEN_M4_AFECLP +*\*\ - RCC_APB5_PERIPHEN_M7_SPI4 +*\*\ - RCC_APB5_PERIPHEN_M4_SPI4 +*\*\ - RCC_APB5_PERIPHEN_M7_SPI4LP +*\*\ - RCC_APB5_PERIPHEN_M4_SPI4LP +*\*\ - RCC_APB5_PERIPHEN_M7_SPI5 +*\*\ - RCC_APB5_PERIPHEN_M4_SPI5 +*\*\ - RCC_APB5_PERIPHEN_M7_SPI5LP +*\*\ - RCC_APB5_PERIPHEN_M4_SPI5LP +*\*\ - RCC_APB5_PERIPHEN_M7_SPI6 +*\*\ - RCC_APB5_PERIPHEN_M4_SPI6 +*\*\ - RCC_APB5_PERIPHEN_M7_SPI6LP +*\*\ - RCC_APB5_PERIPHEN_M4_SPI6LP +*\*\ - RCC_APB5_PERIPHEN_M7_SPI7 +*\*\ - RCC_APB5_PERIPHEN_M4_SPI7 +*\*\ - RCC_APB5_PERIPHEN_M7_SPI7LP +*\*\ - RCC_APB5_PERIPHEN_M4_SPI7LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAPB5PeriphClk1(uint32_t APB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB5EN1 |= APB_periph; + } + else + { + RCC->APB5EN1 &= ~APB_periph; + } +} + +/** +*\*\name RCC_EnableAPB5PeriphClk2. +*\*\fun Enables the APB5 peripheral clock. +*\*\param APB_periph (APB peripheral to gates its clock): +*\*\ - RCC_APB5_PERIPHEN_M7_I2C7 +*\*\ - RCC_APB5_PERIPHEN_M4_I2C7 +*\*\ - RCC_APB5_PERIPHEN_M7_I2C7LP +*\*\ - RCC_APB5_PERIPHEN_M4_I2C7LP +*\*\ - RCC_APB5_PERIPHEN_M7_I2C8 +*\*\ - RCC_APB5_PERIPHEN_M4_I2C8 +*\*\ - RCC_APB5_PERIPHEN_M7_I2C8LP +*\*\ - RCC_APB5_PERIPHEN_M4_I2C8LP +*\*\ - RCC_APB5_PERIPHEN_M7_I2C9 +*\*\ - RCC_APB5_PERIPHEN_M4_I2C9 +*\*\ - RCC_APB5_PERIPHEN_M7_I2C9LP +*\*\ - RCC_APB5_PERIPHEN_M4_I2C9LP +*\*\ - RCC_APB5_PERIPHEN_M7_I2C10 +*\*\ - RCC_APB5_PERIPHEN_M4_I2C10 +*\*\ - RCC_APB5_PERIPHEN_M7_I2C10LP +*\*\ - RCC_APB5_PERIPHEN_M4_I2C10LP +*\*\ - RCC_APB5_PERIPHEN_EXTI +*\*\ - RCC_APB5_PERIPHEN_EXTILP +*\*\ - RCC_APB5_PERIPHEN_M7_RTCPCLK +*\*\ - RCC_APB5_PERIPHEN_M4_RTCPCLK +*\*\ - RCC_APB5_PERIPHEN_M7_RTCPCLKLP +*\*\ - RCC_APB5_PERIPHEN_M4_RTCPCLKLP +*\*\ - RCC_APB5_PERIPHEN_IWDG1PCLK +*\*\ - RCC_APB5_PERIPHEN_IWDG1PCLKLP +*\*\ - RCC_APB5_PERIPHEN_IWDG2PCLK +*\*\ - RCC_APB5_PERIPHEN_IWDG2PCLKLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAPB5PeriphClk2(uint32_t APB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB5EN2 |= APB_periph; + } + else + { + RCC->APB5EN2 &= ~APB_periph; + } +} + +/** +*\*\name RCC_EnableAHB9PeriphClk1. +*\*\fun Enables the AHB9 peripheral clock. +*\*\param AHB_periph (AHB peripheral to gates its clock): +*\*\ - RCC_AHB9_PERIPHEN_M7_ESC +*\*\ - RCC_AHB9_PERIPHEN_M4_ESC +*\*\ - RCC_AHB9_PERIPHEN_M7_ESCLP +*\*\ - RCC_AHB9_PERIPHEN_M4_ESCLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAHB9PeriphClk1(uint32_t AHB_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AHB9EN1 |= AHB_periph; + } + else + { + RCC->AHB9EN1 &= ~AHB_periph; + } +} + +/** +*\*\name RCC_EnableRDPeriphClk1. +*\*\fun Enables the Retention domain peripheral clock. +*\*\param RD_periph (RD peripheral to gates its clock): +*\*\ - RCC_RD_PERIPHEN_M7_LPTIM1 +*\*\ - RCC_RD_PERIPHEN_M4_LPTIM1 +*\*\ - RCC_RD_PERIPHEN_M7_LPTIM1LP +*\*\ - RCC_RD_PERIPHEN_M4_LPTIM1LP +*\*\ - RCC_RD_PERIPHEN_M7_LPTIM2 +*\*\ - RCC_RD_PERIPHEN_M4_LPTIM2 +*\*\ - RCC_RD_PERIPHEN_M7_LPTIM2LP +*\*\ - RCC_RD_PERIPHEN_M4_LPTIM2LP +*\*\ - RCC_RD_PERIPHEN_M7_LPTIM3 +*\*\ - RCC_RD_PERIPHEN_M4_LPTIM3 +*\*\ - RCC_RD_PERIPHEN_M7_LPTIM3LP +*\*\ - RCC_RD_PERIPHEN_M4_LPTIM3LP +*\*\ - RCC_RD_PERIPHEN_M7_LPTIM4 +*\*\ - RCC_RD_PERIPHEN_M4_LPTIM4 +*\*\ - RCC_RD_PERIPHEN_M7_LPTIM4LP +*\*\ - RCC_RD_PERIPHEN_M4_LPTIM4LP +*\*\ - RCC_RD_PERIPHEN_M7_LPTIM5 +*\*\ - RCC_RD_PERIPHEN_M4_LPTIM5 +*\*\ - RCC_RD_PERIPHEN_M7_LPTIM5LP +*\*\ - RCC_RD_PERIPHEN_M4_LPTIM5LP +*\*\ - RCC_RD_PERIPHEN_M7_LPUART1 +*\*\ - RCC_RD_PERIPHEN_M4_LPUART1 +*\*\ - RCC_RD_PERIPHEN_M7_LPUART1LP +*\*\ - RCC_RD_PERIPHEN_M4_LPUART1LP +*\*\ - RCC_RD_PERIPHEN_M7_LPUART2 +*\*\ - RCC_RD_PERIPHEN_M4_LPUART2 +*\*\ - RCC_RD_PERIPHEN_M7_LPUART2LP +*\*\ - RCC_RD_PERIPHEN_M4_LPUART2LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableRDPeriphClk1(uint32_t RD_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDEN1 |= RD_periph; + } + else + { + RCC->RDEN1 &= ~RD_periph; + } +} + +/** +*\*\name RCC_EnableRDPeriphClk2. +*\*\fun Enables the Retention domain peripheral clock. +*\*\param RD_periph (RD peripheral to gates its clock): +*\*\ - RCC_RD_PERIPHEN_M7_COMP +*\*\ - RCC_RD_PERIPHEN_M4_COMP +*\*\ - RCC_RD_PERIPHEN_M7_COMPLP +*\*\ - RCC_RD_PERIPHEN_M4_COMPLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableRDPeriphClk2(uint32_t RD_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDEN2 |= RD_periph; + } + else + { + RCC->RDEN2 &= ~RD_periph; + } +} + +/** +*\*\name RCC_EnableAXIPeriphClk1. +*\*\fun Enables the AXI peripheral clock. +*\*\param AXI_periph (AXI peripheral to gates its clock): +*\*\ - RCC_AXI_PERIPHEN_M7_JPEGD +*\*\ - RCC_AXI_PERIPHEN_M4_JPEGD +*\*\ - RCC_AXI_PERIPHEN_M7_JPEGDLP +*\*\ - RCC_AXI_PERIPHEN_M4_JPEGDLP +*\*\ - RCC_AXI_PERIPHEN_M7_JPEGE +*\*\ - RCC_AXI_PERIPHEN_M4_JPEGE +*\*\ - RCC_AXI_PERIPHEN_M7_JPEGELP +*\*\ - RCC_AXI_PERIPHEN_M4_JPEGELP +*\*\ - RCC_AXI_PERIPHEN_M7_DMAMUX2 +*\*\ - RCC_AXI_PERIPHEN_M4_DMAMUX2 +*\*\ - RCC_AXI_PERIPHEN_M7_DMAMUX2LP +*\*\ - RCC_AXI_PERIPHEN_M4_DMAMUX2LP +*\*\ - RCC_AXI_PERIPHEN_M7_MDMA +*\*\ - RCC_AXI_PERIPHEN_M4_MDMA +*\*\ - RCC_AXI_PERIPHEN_M7_MDMALP +*\*\ - RCC_AXI_PERIPHEN_M4_MDMALP +*\*\ - RCC_AXI_PERIPHEN_M7_SDMMC1 +*\*\ - RCC_AXI_PERIPHEN_M4_SDMMC1 +*\*\ - RCC_AXI_PERIPHEN_M7_SDMMC1LP +*\*\ - RCC_AXI_PERIPHEN_M4_SDMMC1LP +*\*\ - RCC_AXI_PERIPHEN_M7_ECCM1 +*\*\ - RCC_AXI_PERIPHEN_M4_ECCM1 +*\*\ - RCC_AXI_PERIPHEN_M7_ECCM1LP +*\*\ - RCC_AXI_PERIPHEN_M4_ECCM1LP +*\*\ - RCC_AXI_PERIPHEN_M7_OTPC +*\*\ - RCC_AXI_PERIPHEN_M4_OTPC +*\*\ - RCC_AXI_PERIPHEN_M7_OTPCLP +*\*\ - RCC_AXI_PERIPHEN_M4_OTPCLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAXIPeriphClk1(uint32_t AXI_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AXIEN1 |= AXI_periph; + } + else + { + RCC->AXIEN1 &= ~AXI_periph; + } +} + +/** +*\*\name RCC_EnableAXIPeriphClk2. +*\*\fun Enables the AXI peripheral clock. +*\*\param AXI_periph (AXI peripheral to gates its clock): +*\*\ - RCC_AXI_PERIPHEN_M7_DSI +*\*\ - RCC_AXI_PERIPHEN_M4_DSI +*\*\ - RCC_AXI_PERIPHEN_M7_DSILP +*\*\ - RCC_AXI_PERIPHEN_M4_DSILP +*\*\ - RCC_AXI_PERIPHEN_M7_LCDC +*\*\ - RCC_AXI_PERIPHEN_M4_LCDC +*\*\ - RCC_AXI_PERIPHEN_M7_LCDCLP +*\*\ - RCC_AXI_PERIPHEN_M4_LCDCLP +*\*\ - RCC_AXI_PERIPHEN_M7_LCDCAPB +*\*\ - RCC_AXI_PERIPHEN_M4_LCDCAPB +*\*\ - RCC_AXI_PERIPHEN_M7_LCDCAPBLP +*\*\ - RCC_AXI_PERIPHEN_M4_LCDCAPBLP +*\*\ - RCC_AXI_PERIPHEN_M7_DVP1 +*\*\ - RCC_AXI_PERIPHEN_M4_DVP1 +*\*\ - RCC_AXI_PERIPHEN_M7_DVP1LP +*\*\ - RCC_AXI_PERIPHEN_M4_DVP1LP +*\*\ - RCC_AXI_PERIPHEN_M7_DVP1APB +*\*\ - RCC_AXI_PERIPHEN_M4_DVP1APB +*\*\ - RCC_AXI_PERIPHEN_M7_DVP1APBLP +*\*\ - RCC_AXI_PERIPHEN_M4_DVP1APBLP +*\*\ - RCC_AXI_PERIPHEN_M7_DVP2 +*\*\ - RCC_AXI_PERIPHEN_M4_DVP2 +*\*\ - RCC_AXI_PERIPHEN_M7_DVP2LP +*\*\ - RCC_AXI_PERIPHEN_M4_DVP2LP +*\*\ - RCC_AXI_PERIPHEN_M7_DVP2APB +*\*\ - RCC_AXI_PERIPHEN_M4_DVP2APB +*\*\ - RCC_AXI_PERIPHEN_M7_DVP2APBLP +*\*\ - RCC_AXI_PERIPHEN_M4_DVP2APBLP +*\*\ - RCC_AXI_PERIPHEN_M7_WWDG1 +*\*\ - RCC_AXI_PERIPHEN_M4_WWDG1 +*\*\ - RCC_AXI_PERIPHEN_M7_WWDG1LP +*\*\ - RCC_AXI_PERIPHEN_M4_WWDG1LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAXIPeriphClk2(uint32_t AXI_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AXIEN2 |= AXI_periph; + } + else + { + RCC->AXIEN2 &= ~AXI_periph; + } +} + + +/** +*\*\name RCC_EnableAXIPeriphClk3. +*\*\fun Enables the AXI peripheral clock. +*\*\param AXI_periph (AXI peripheral to gates its clock): +*\*\ - RCC_AXI_PERIPHEN_M7_TASRAM2 +*\*\ - RCC_AXI_PERIPHEN_M4_TASRAM2 +*\*\ - RCC_AXI_PERIPHEN_M7_TASRAM2LP +*\*\ - RCC_AXI_PERIPHEN_M4_TASRAM2LP +*\*\ - RCC_AXI_PERIPHEN_M7_TASRAM3 +*\*\ - RCC_AXI_PERIPHEN_M4_TASRAM3 +*\*\ - RCC_AXI_PERIPHEN_M7_TASRAM3LP +*\*\ - RCC_AXI_PERIPHEN_M4_TASRAM3LP +*\*\ - RCC_AXI_PERIPHEN_M7_TCM +*\*\ - RCC_AXI_PERIPHEN_M4_TCM +*\*\ - RCC_AXI_PERIPHEN_M7_TCMLP +*\*\ - RCC_AXI_PERIPHEN_M4_TCMLP +*\*\ - RCC_AXI_PERIPHEN_M7_TCMAXI +*\*\ - RCC_AXI_PERIPHEN_M4_TCMAXI +*\*\ - RCC_AXI_PERIPHEN_M7_TCMAXILP +*\*\ - RCC_AXI_PERIPHEN_M4_TCMAXILP +*\*\ - RCC_AXI_PERIPHEN_M7_TCMAPB +*\*\ - RCC_AXI_PERIPHEN_M4_TCMAPB +*\*\ - RCC_AXI_PERIPHEN_M7_TCMAPBLP +*\*\ - RCC_AXI_PERIPHEN_M4_TCMAPBLP +*\*\ - RCC_AXI_PERIPHEN_M7_ASRAM1 +*\*\ - RCC_AXI_PERIPHEN_M4_ASRAM1 +*\*\ - RCC_AXI_PERIPHEN_M7_ASRAM1LP +*\*\ - RCC_AXI_PERIPHEN_M4_ASRAM1LP +*\*\ - RCC_AXI_PERIPHEN_M7_AXIROM +*\*\ - RCC_AXI_PERIPHEN_M4_AXIROM +*\*\ - RCC_AXI_PERIPHEN_M7_AXIROMLP +*\*\ - RCC_AXI_PERIPHEN_M4_AXIROMLP +*\*\ - RCC_AXI_PERIPHEN_M7_GPU +*\*\ - RCC_AXI_PERIPHEN_M4_GPU +*\*\ - RCC_AXI_PERIPHEN_M7_GPULP +*\*\ - RCC_AXI_PERIPHEN_M4_GPULP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAXIPeriphClk3(uint32_t AXI_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AXIEN3 |= AXI_periph; + } + else + { + RCC->AXIEN3 &= ~AXI_periph; + } +} + +/** +*\*\name RCC_EnableAXIPeriphClk4. +*\*\fun Enables the AXI peripheral clock. +*\*\param AXI_periph (AXI peripheral to gates its clock): +*\*\ - RCC_AXI_PERIPHEN_M7_XSPI1 +*\*\ - RCC_AXI_PERIPHEN_M4_XSPI1 +*\*\ - RCC_AXI_PERIPHEN_M7_XSPI1LP +*\*\ - RCC_AXI_PERIPHEN_M4_XSPI1LP +*\*\ - RCC_AXI_PERIPHEN_M7_XSPI2 +*\*\ - RCC_AXI_PERIPHEN_M4_XSPI2 +*\*\ - RCC_AXI_PERIPHEN_M7_XSPI2LP +*\*\ - RCC_AXI_PERIPHEN_M4_XSPI2LP +*\*\ - RCC_AXI_PERIPHEN_M7_FEMC +*\*\ - RCC_AXI_PERIPHEN_M4_FEMC +*\*\ - RCC_AXI_PERIPHEN_M7_FEMCLP +*\*\ - RCC_AXI_PERIPHEN_M4_FEMCLP +*\*\ - RCC_AXI_PERIPHEN_M7_SDRAM +*\*\ - RCC_AXI_PERIPHEN_M4_SDRAM +*\*\ - RCC_AXI_PERIPHEN_M7_SDRAMLP +*\*\ - RCC_AXI_PERIPHEN_M4_SDRAMLP +*\*\ - RCC_AXI_PERIPHEN_M7_DSIULPS +*\*\ - RCC_AXI_PERIPHEN_M4_DSIULPS +*\*\ - RCC_AXI_PERIPHEN_M7_DSIULPSLP +*\*\ - RCC_AXI_PERIPHEN_M4_DSIULPSLP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableAXIPeriphClk4(uint32_t AXI_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->AXIEN4 |= AXI_periph; + } + else + { + RCC->AXIEN4 &= ~AXI_periph; + } +} + +/** +*\*\name RCC_ConfigETH2PtpClk. +*\*\fun Config the Ethernet2 PTP clock. +*\*\param CLK_source(Ethernet2 PTP clock source): +*\*\ - RCC_ETHPTPCLK_SRC_SYSBUSDIV +*\*\ - RCC_ETHPTPCLK_SRC_PERIPH +*\*\ - RCC_ETHPTPCLK_SRC_PLL2C +*\*\ - RCC_ETHPTPCLK_SRC_PLL3A +*\*\param CLK_divider(Ethernet2 PTP clock source (sys_bus_div_clk) divider) +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV1 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV2 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV4 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV8 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV16 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV32 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV64 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV128 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV256 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV512 +*\*\return none +*\*\note if select RCC_ETHPTPCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by ETH2SYSDIV[3:0] +**/ +void RCC_ConfigETH2PtpClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->AHB1SEL1; + /* Clear ETH2PTPSEL[1:0] bits */ + reg_value &= RCC_ETHPTPCLK_SRC_MASK; + /* Set ETH2PTPSEL[1:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AHB1SEL1 = reg_value; + + if(CLK_source == RCC_ETHPTPCLK_SRC_SYSBUSDIV) + { + reg_value1 = RCC->AHB1DIV1; + /* Clear ETH2SYSDIV[3:0] bits */ + reg_value1 &= RCC_ETHPTPCLK_SYSBUSDIV_MASK; + /* Set the ETH2SYSDIV[3:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->AHB1DIV1 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigETH1PtpClk. +*\*\fun Config the Ethernet1 PTP clock. +*\*\param CLK_source(Ethernet1 PTP clock source): +*\*\ - RCC_ETHPTPCLK_SRC_SYSBUSDIV +*\*\ - RCC_ETHPTPCLK_SRC_PERIPH +*\*\ - RCC_ETHPTPCLK_SRC_PLL2C +*\*\ - RCC_ETHPTPCLK_SRC_PLL3A +*\*\param CLK_divider(Ethernet1 PTP clock source (sys_bus_div_clk) divider) +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV1 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV2 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV4 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV8 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV16 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV32 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV64 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV128 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV256 +*\*\ - RCC_ETHPTPCLK_SYSBUSDIV512 +*\*\return none +*\*\note if select RCC_ETHPTPCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by ETH1SYSDIV[3:0] +**/ +void RCC_ConfigETH1PtpClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->AHB2SEL1; + /* Clear ETH1PTPSEL[1:0] bits */ + reg_value &= RCC_ETHPTPCLK_SRC_MASK; + /* Set ETH1PTPSEL[1:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AHB2SEL1 = reg_value; + + if(CLK_source == RCC_ETHPTPCLK_SRC_SYSBUSDIV) + { + reg_value1 = RCC->AHB2DIV1; + /* Clear ETH1SYSDIV[3:0] bits */ + reg_value1 &= RCC_ETHPTPCLK_SYSBUSDIV_MASK; + /* Set the ETH1SYSDIV[3:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->AHB2DIV1 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigETH1GMIITXClk. +*\*\fun Configures ETH1 125 MHz GMII TX clock source. +*\*\param CLK_source: +*\*\ - RCC_ETH1GMIITXCLK_SRC_PLL3A +*\*\ - RCC_ETH1GMIITXCLK_SRC_PLL2B +*\*\ - RCC_ETH1GMIITXCLK_SRC_IOM +*\*\ - RCC_ETH1GMIITXCLK_SRC_PLL1C +*\*\return none +**/ +void RCC_ConfigETH1GMIITXClk(uint32_t CLK_source) +{ + uint32_t temp_value; + + temp_value = RCC->AHB2SEL1; + + /* Clear ETH1GMIITXSEL[1:0] bits */ + temp_value &= RCC_ETH1GMIITXCLK_SRC_MASK; + /* Set ETH1GMIITXSEL[1:0] bits according to CLK_source value*/ + temp_value |= CLK_source; + + /* Store the new value */ + RCC->AHB2SEL1 = temp_value; + +} + +/** +*\*\name RCC_ConfigSDMMC2KerClk. +*\*\fun Config the SDMMC2 kernel clock. +*\*\param CLK_source(SDMMC2 kernel clock source): +*\*\ - RCC_SDMMC2KERCLK_SRC_SYSBUSDIV +*\*\ - RCC_SDMMC2KERCLK_SRC_PERIPH +*\*\ - RCC_SDMMC2KERCLK_SRC_PLL2A +*\*\ - RCC_SDMMC2KERCLK_SRC_PLL3A +*\*\ - RCC_SDMMC2KERCLK_SRC_PLL1B +*\*\param CLK_divider(SDMMC2 kernel clock source (sys_bus_div_clk) divider) +*\*\ - RCC_SDMMC2KERCLK_SYSBUSDIV1 +*\*\ - RCC_SDMMC2KERCLK_SYSBUSDIV2 +*\*\ - RCC_SDMMC2KERCLK_SYSBUSDIV4 +*\*\ - RCC_SDMMC2KERCLK_SYSBUSDIV8 +*\*\ - RCC_SDMMC2KERCLK_SYSBUSDIV16 +*\*\ - RCC_SDMMC2KERCLK_SYSBUSDIV32 +*\*\ - RCC_SDMMC2KERCLK_SYSBUSDIV64 +*\*\ - RCC_SDMMC2KERCLK_SYSBUSDIV128 +*\*\ - RCC_SDMMC2KERCLK_SYSBUSDIV256 +*\*\ - RCC_SDMMC2KERCLK_SYSBUSDIV512 +*\*\return none +*\*\note if select RCC_SDMMC2KERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by SDMMC2SYSDIV[3:0] +**/ +void RCC_ConfigSDMMC2KerClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->AHB1SEL1; + /* Clear SDMMC2KERSEL[2:0] bits */ + reg_value &= RCC_SDMMC2KERCLK_SRC_MASK; + /* Set SDMMC2KERSEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AHB1SEL1 = reg_value; + + if(CLK_source == RCC_SDMMC2KERCLK_SRC_SYSBUSDIV) + { + reg_value1 = RCC->AHB1DIV1; + /* Clear SDMMC2SYSDIV[3:0] bits */ + reg_value1 &= RCC_SDMMC2KERCLK_SYSBUSDIV_MASK; + /* Set the SDMMC2SYSDIV[3:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->AHB1DIV1 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigSDMMC1KerClk. +*\*\fun Config the SDMMC1 kernel clock. +*\*\param CLK_source(SDMMC1 kernel clock source): +*\*\ - RCC_SDMMC1KERCLK_SRC_AXIDIV +*\*\ - RCC_SDMMC1KERCLK_SRC_PERIPH +*\*\ - RCC_SDMMC1KERCLK_SRC_PLL2A +*\*\ - RCC_SDMMC1KERCLK_SRC_PLL3A +*\*\ - RCC_SDMMC1KERCLK_SRC_PLL1B +*\*\param CLK_divider(SDMMC1 kernel clock source (axi_bus_clk) divider) +*\*\ - RCC_SDMMC1KERCLK_AXIDIV1 +*\*\ - RCC_SDMMC1KERCLK_AXIDIV2 +*\*\ - RCC_SDMMC1KERCLK_AXIDIV4 +*\*\ - RCC_SDMMC1KERCLK_AXIDIV8 +*\*\ - RCC_SDMMC1KERCLK_AXIDIV16 +*\*\ - RCC_SDMMC1KERCLK_AXIDIV32 +*\*\ - RCC_SDMMC1KERCLK_AXIDIV64 +*\*\ - RCC_SDMMC1KERCLK_AXIDIV128 +*\*\ - RCC_SDMMC1KERCLK_AXIDIV256 +*\*\ - RCC_SDMMC1KERCLK_AXIDIV512 +*\*\return none +*\*\note if select RCC_SDMMC1KERCLK_SRC_AXIDIV then set the AXI clock divider by SDMMC1AXIDIV[3:0] +**/ +void RCC_ConfigSDMMC1KerClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->AXISEL1; + /* Clear SDMMC1KERSEL[2:0] bits */ + reg_value &= RCC_SDMMC1KERCLK_SRC_MASK; + /* Set SDMMC1KERSEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AXISEL1 = reg_value; + + if(CLK_source == RCC_SDMMC1KERCLK_SRC_AXIDIV) + { + reg_value1 = RCC->AXIDIV1; + /* Clear SDMMC1AXIDIV[3:0] bits */ + reg_value1 &= RCC_SDMMC1KERCLK_AXIDIV_MASK; + /* Set the SDMMC1AXIDIV[3:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->AXIDIV1 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigDSMUKerClk. +*\*\fun Config the DSMU kernel clock. +*\*\param CLK_source(DSMU kernel clock source): +*\*\ - RCC_DSMUKERCLK_SRC_APB2 +*\*\ - RCC_DSMUKERCLK_SRC_SYSBUSDIV +*\*\param CLK_divider(DSMU kernel clock source (sys_bus_div_clk) divider) +*\*\ - RCC_DSMUKERCLK_SYSBUSDIV1 +*\*\ - RCC_DSMUKERCLK_SYSBUSDIV2 +*\*\ - RCC_DSMUKERCLK_SYSBUSDIV4 +*\*\ - RCC_DSMUKERCLK_SYSBUSDIV8 +*\*\ - RCC_DSMUKERCLK_SYSBUSDIV16 +*\*\return none +*\*\note if select RCC_DSMUKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB2DSMUDIV[2:0] +**/ +void RCC_ConfigDSMUKerClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->APB2SEL1; + /* Clear DSMUKERSEL bits */ + reg_value &= RCC_DSMUKERCLK_SRC_MASK; + /* Set DSMUKERSEL bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->APB2SEL1 = reg_value; + + if(CLK_source == RCC_DSMUKERCLK_SRC_SYSBUSDIV) + { + reg_value1 = RCC->APB2DIV1; + /* Clear APB2DSMUDIV[2:0] bits */ + reg_value1 &= RCC_DSMUKERCLK_SYSBUSDIV_MASK; + /* Set the APB2DSMUDIV[2:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->APB2DIV1 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigDSMUKerAClk. +*\*\fun Config the DSMU kernel A clock. +*\*\param CLK_source(DSMU kernel A clock source): +*\*\ - RCC_DSMUKERACLK_SRC_APB2 +*\*\ - RCC_DSMUKERACLK_SRC_PLL1B +*\*\ - RCC_DSMUKERACLK_SRC_PLL2B +*\*\ - RCC_DSMUKERACLK_SRC_PLL3A +*\*\ - RCC_DSMUKERACLK_SRC_CKIN +*\*\ - RCC_DSMUKERACLK_SRC_PERIPH +*\*\param CLK_pinsel(DSMU kernel A clock source CKIN pin select) +*\*\ - RCC_DSMUKERACLK_CKIN_I2S1 +*\*\ - RCC_DSMUKERACLK_CKIN_I2S2 +*\*\ - RCC_DSMUKERACLK_CKIN_I2S3 +*\*\ - RCC_DSMUKERACLK_CKIN_I2S4 +*\*\return none +*\*\note if select RCC_DSMUKERACLK_SRC_CKIN then set the I2S CKIN pin by I2SSEL[1:0] +**/ +void RCC_ConfigDSMUKerAClk(uint32_t CLK_source, uint32_t CLK_pinsel) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->APB2SEL1; + /* Clear DSMUKERASEL[2:0] bits */ + reg_value &= RCC_DSMUKERACLK_SRC_MASK; + /* Set DSMUKERASEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->APB2SEL1 = reg_value; + + if(CLK_source == RCC_DSMUKERACLK_SRC_CKIN) + { + reg_value1 = RCC->CFG3; + /* Clear I2SSEL[1:0] bits */ + reg_value1 &= RCC_DSMUKERACLK_CKIN_MASK; + /* Set the I2SSEL[1:0] bits */ + reg_value1 |= CLK_pinsel; + /* Store the new value */ + RCC->CFG3 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigUSBRefClk. +*\*\fun Config the USB1/2 reference clock divider from HSE. +*\*\param CLK_divider(USB reference clock divider) +*\*\ - RCC_USBREFCLK_HSE_DIV1 +*\*\ - RCC_USBREFCLK_HSE_DIV2 +*\*\return none +*\*\note none +**/ +void RCC_ConfigUSBRefClk(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->AHB2DIV1; + /* Clear USBHSEDIV[3:0] bits */ + reg_value &= RCC_USBREFCLK_HSE_DIV_MASK; + /* Set the USBHSEDIV[3:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->AHB2DIV1 = reg_value; + +} + +/** +*\*\name RCC_ConfigAdc1PllClk. +*\*\fun Configures the ADC PLL clock source. +*\*\param CLK_source(ADC PLL clock source): +*\*\ - RCC_ADCPLLCLK_SRC_PLL2B +*\*\ - RCC_ADCPLLCLK_SRC_PLL1B +*\*\ - RCC_ADCPLLCLK_SRC_PLL3B +*\*\ - RCC_ADCPLLCLK_SRC_PLL3C +*\*\return none +**/ +void RCC_ConfigAdc1PllClk(uint32_t CLK_source) +{ + uint32_t temp_value; + + temp_value = RCC->AHB1SEL1; + + /* Clear ADC1PLLSEL[1:0] bits */ + temp_value &= RCC_ADC1PLLCLK_SRC_MASK; + /* Set ADC1PLLSEL[1:0] bits according to CLK_source value*/ + temp_value |= CLK_source; + + /* Store the new value */ + RCC->AHB1SEL1 = temp_value; + +} + +/** +*\*\name RCC_ConfigAdc1SysClk. +*\*\fun Configures the prescaler from sys_bus_div_clk. +*\*\param CLK_divider: +*\*\ - RCC_ADCSYSCLK_DIV1 +*\*\ - RCC_ADCSYSCLK_DIV2 +*\*\ - RCC_ADCSYSCLK_DIV3 +*\*\ - RCC_ADCSYSCLK_DIV4 +*\*\ - RCC_ADCSYSCLK_DIV5 +*\*\ - RCC_ADCSYSCLK_DIV6 +*\*\ - RCC_ADCSYSCLK_DIV7 +*\*\ - RCC_ADCSYSCLK_DIV8 +*\*\ - RCC_ADCSYSCLK_DIV9 +*\*\ - RCC_ADCSYSCLK_DIV10 +*\*\ - RCC_ADCSYSCLK_DIV11 +*\*\ - RCC_ADCSYSCLK_DIV12 +*\*\ - RCC_ADCSYSCLK_DIV13 +*\*\ - RCC_ADCSYSCLK_DIV14 +*\*\ - RCC_ADCSYSCLK_DIV15 +*\*\ - RCC_ADCSYSCLK_DIV16 +*\*\ - RCC_ADCSYSCLK_DIV17 +*\*\ - RCC_ADCSYSCLK_DIV18 +*\*\ - RCC_ADCSYSCLK_DIV19 +*\*\ - RCC_ADCSYSCLK_DIV20 +*\*\ - RCC_ADCSYSCLK_DIV21 +*\*\ - RCC_ADCSYSCLK_DIV22 +*\*\ - RCC_ADCSYSCLK_DIV23 +*\*\ - RCC_ADCSYSCLK_DIV24 +*\*\ - RCC_ADCSYSCLK_DIV25 +*\*\ - RCC_ADCSYSCLK_DIV26 +*\*\ - RCC_ADCSYSCLK_DIV27 +*\*\ - RCC_ADCSYSCLK_DIV28 +*\*\ - RCC_ADCSYSCLK_DIV29 +*\*\ - RCC_ADCSYSCLK_DIV30 +*\*\ - RCC_ADCSYSCLK_DIV31 +*\*\ - RCC_ADCSYSCLK_DIV32 +*\*\ - RCC_ADCSYSCLK_DIV33 +*\*\ - RCC_ADCSYSCLK_DIV34 +*\*\ - RCC_ADCSYSCLK_DIV35 +*\*\ - RCC_ADCSYSCLK_DIV36 +*\*\ - RCC_ADCSYSCLK_DIV37 +*\*\ - RCC_ADCSYSCLK_DIV38 +*\*\ - RCC_ADCSYSCLK_DIV39 +*\*\ - RCC_ADCSYSCLK_DIV40 +*\*\ - RCC_ADCSYSCLK_DIV41 +*\*\ - RCC_ADCSYSCLK_DIV42 +*\*\ - RCC_ADCSYSCLK_DIV43 +*\*\ - RCC_ADCSYSCLK_DIV44 +*\*\ - RCC_ADCSYSCLK_DIV45 +*\*\ - RCC_ADCSYSCLK_DIV46 +*\*\ - RCC_ADCSYSCLK_DIV47 +*\*\ - RCC_ADCSYSCLK_DIV48 +*\*\ - RCC_ADCSYSCLK_DIV49 +*\*\ - RCC_ADCSYSCLK_DIV50 +*\*\ - RCC_ADCSYSCLK_DIV51 +*\*\ - RCC_ADCSYSCLK_DIV52 +*\*\ - RCC_ADCSYSCLK_DIV53 +*\*\ - RCC_ADCSYSCLK_DIV54 +*\*\ - RCC_ADCSYSCLK_DIV55 +*\*\ - RCC_ADCSYSCLK_DIV56 +*\*\ - RCC_ADCSYSCLK_DIV57 +*\*\ - RCC_ADCSYSCLK_DIV58 +*\*\ - RCC_ADCSYSCLK_DIV59 +*\*\ - RCC_ADCSYSCLK_DIV60 +*\*\ - RCC_ADCSYSCLK_DIV61 +*\*\ - RCC_ADCSYSCLK_DIV62 +*\*\ - RCC_ADCSYSCLK_DIV63 +*\*\return none +**/ +void RCC_ConfigAdc1SysClk(uint32_t CLK_divider) +{ + uint32_t temp_value; + + temp_value = RCC->AHB1DIV2; + /* Clear ADC1SYSDIV[5:0] bits */ + temp_value &= RCC_ADC1SYSCLK_DIV_MASK; + /* Set ADC1SYSDIV[5:0] bits according to CLK_divider value */ + temp_value |= CLK_divider; + + /* Store the new value */ + RCC->AHB1DIV2 = temp_value; +} + +/** +*\*\name RCC_ConfigAdc2PllClk. +*\*\fun Configures the ADC PLL clock source. +*\*\param CLK_source(ADC PLL clock source): +*\*\ - RCC_ADCPLLCLK_SRC_PLL2B +*\*\ - RCC_ADCPLLCLK_SRC_PLL1B +*\*\ - RCC_ADCPLLCLK_SRC_PLL3B +*\*\ - RCC_ADCPLLCLK_SRC_PLL3C +*\*\return none +**/ +void RCC_ConfigAdc2PllClk(uint32_t CLK_source) +{ + uint32_t temp_value; + + temp_value = RCC->AHB1SEL1; + + /* Clear ADC2PLLSEL[1:0] bits */ + temp_value &= RCC_ADC2PLLCLK_SRC_MASK; + /* Set ADC2PLLSEL[1:0] bits according to CLK_source value*/ + temp_value |= (CLK_source << 4); + + /* Store the new value */ + RCC->AHB1SEL1 = temp_value; + +} + +/** +*\*\name RCC_ConfigAdc2SysClk. +*\*\fun Configures the ADCSYSCLK prescaler. +*\*\param CLK_divider(ADCSYSCLK prescaler): +*\*\ - RCC_ADCSYSCLK_DIV1 +*\*\ - RCC_ADCSYSCLK_DIV2 +*\*\ - RCC_ADCSYSCLK_DIV3 +*\*\ - RCC_ADCSYSCLK_DIV4 +*\*\ - RCC_ADCSYSCLK_DIV5 +*\*\ - RCC_ADCSYSCLK_DIV6 +*\*\ - RCC_ADCSYSCLK_DIV7 +*\*\ - RCC_ADCSYSCLK_DIV8 +*\*\ - RCC_ADCSYSCLK_DIV9 +*\*\ - RCC_ADCSYSCLK_DIV10 +*\*\ - RCC_ADCSYSCLK_DIV11 +*\*\ - RCC_ADCSYSCLK_DIV12 +*\*\ - RCC_ADCSYSCLK_DIV13 +*\*\ - RCC_ADCSYSCLK_DIV14 +*\*\ - RCC_ADCSYSCLK_DIV15 +*\*\ - RCC_ADCSYSCLK_DIV16 +*\*\ - RCC_ADCSYSCLK_DIV17 +*\*\ - RCC_ADCSYSCLK_DIV18 +*\*\ - RCC_ADCSYSCLK_DIV19 +*\*\ - RCC_ADCSYSCLK_DIV20 +*\*\ - RCC_ADCSYSCLK_DIV21 +*\*\ - RCC_ADCSYSCLK_DIV22 +*\*\ - RCC_ADCSYSCLK_DIV23 +*\*\ - RCC_ADCSYSCLK_DIV24 +*\*\ - RCC_ADCSYSCLK_DIV25 +*\*\ - RCC_ADCSYSCLK_DIV26 +*\*\ - RCC_ADCSYSCLK_DIV27 +*\*\ - RCC_ADCSYSCLK_DIV28 +*\*\ - RCC_ADCSYSCLK_DIV29 +*\*\ - RCC_ADCSYSCLK_DIV30 +*\*\ - RCC_ADCSYSCLK_DIV31 +*\*\ - RCC_ADCSYSCLK_DIV32 +*\*\ - RCC_ADCSYSCLK_DIV33 +*\*\ - RCC_ADCSYSCLK_DIV34 +*\*\ - RCC_ADCSYSCLK_DIV35 +*\*\ - RCC_ADCSYSCLK_DIV36 +*\*\ - RCC_ADCSYSCLK_DIV37 +*\*\ - RCC_ADCSYSCLK_DIV38 +*\*\ - RCC_ADCSYSCLK_DIV39 +*\*\ - RCC_ADCSYSCLK_DIV40 +*\*\ - RCC_ADCSYSCLK_DIV41 +*\*\ - RCC_ADCSYSCLK_DIV42 +*\*\ - RCC_ADCSYSCLK_DIV43 +*\*\ - RCC_ADCSYSCLK_DIV44 +*\*\ - RCC_ADCSYSCLK_DIV45 +*\*\ - RCC_ADCSYSCLK_DIV46 +*\*\ - RCC_ADCSYSCLK_DIV47 +*\*\ - RCC_ADCSYSCLK_DIV48 +*\*\ - RCC_ADCSYSCLK_DIV49 +*\*\ - RCC_ADCSYSCLK_DIV50 +*\*\ - RCC_ADCSYSCLK_DIV51 +*\*\ - RCC_ADCSYSCLK_DIV52 +*\*\ - RCC_ADCSYSCLK_DIV53 +*\*\ - RCC_ADCSYSCLK_DIV54 +*\*\ - RCC_ADCSYSCLK_DIV55 +*\*\ - RCC_ADCSYSCLK_DIV56 +*\*\ - RCC_ADCSYSCLK_DIV57 +*\*\ - RCC_ADCSYSCLK_DIV58 +*\*\ - RCC_ADCSYSCLK_DIV59 +*\*\ - RCC_ADCSYSCLK_DIV60 +*\*\ - RCC_ADCSYSCLK_DIV61 +*\*\ - RCC_ADCSYSCLK_DIV62 +*\*\ - RCC_ADCSYSCLK_DIV63 +*\*\return none +**/ +void RCC_ConfigAdc2SysClk(uint32_t CLK_divider) +{ + uint32_t temp_value; + + temp_value = RCC->AHB1DIV2; + /* Clear ADC2SYSDIV[5:0] bits */ + temp_value &= RCC_ADC2SYSCLK_DIV_MASK; + /* Set ADC2SYSDIV[5:0] bits according to CLK_divider value */ + temp_value |= (CLK_divider << 8); + + /* Store the new value */ + RCC->AHB1DIV2 = temp_value; +} + +/** +*\*\name RCC_ConfigAdc3PllClk. +*\*\fun Configures the ADC PLL clock source. +*\*\param CLK_source(ADC PLL clock source): +*\*\ - RCC_ADCPLLCLK_SRC_PLL2B +*\*\ - RCC_ADCPLLCLK_SRC_PLL1B +*\*\ - RCC_ADCPLLCLK_SRC_PLL3B +*\*\ - RCC_ADCPLLCLK_SRC_PLL3C +*\*\return none +**/ +void RCC_ConfigAdc3PllClk(uint32_t CLK_source) +{ + uint32_t temp_value; + + temp_value = RCC->AHB1SEL1; + + /* Clear ADC3PLLSEL[1:0] bits */ + temp_value &= RCC_ADC3PLLCLK_SRC_MASK; + /* Set ADC3PLLSEL[1:0] bits according to CLK_source value*/ + temp_value |= (CLK_source << 8); + + /* Store the new value */ + RCC->AHB1SEL1 = temp_value; + +} + +/** +*\*\name RCC_ConfigAdc3SysClk. +*\*\fun Configures the ADCSYSCLK prescaler. +*\*\param CLK_divider(ADCSYSCLK prescaler): +*\*\ - RCC_ADCSYSCLK_DIV1 +*\*\ - RCC_ADCSYSCLK_DIV2 +*\*\ - RCC_ADCSYSCLK_DIV3 +*\*\ - RCC_ADCSYSCLK_DIV4 +*\*\ - RCC_ADCSYSCLK_DIV5 +*\*\ - RCC_ADCSYSCLK_DIV6 +*\*\ - RCC_ADCSYSCLK_DIV7 +*\*\ - RCC_ADCSYSCLK_DIV8 +*\*\ - RCC_ADCSYSCLK_DIV9 +*\*\ - RCC_ADCSYSCLK_DIV10 +*\*\ - RCC_ADCSYSCLK_DIV11 +*\*\ - RCC_ADCSYSCLK_DIV12 +*\*\ - RCC_ADCSYSCLK_DIV13 +*\*\ - RCC_ADCSYSCLK_DIV14 +*\*\ - RCC_ADCSYSCLK_DIV15 +*\*\ - RCC_ADCSYSCLK_DIV16 +*\*\ - RCC_ADCSYSCLK_DIV17 +*\*\ - RCC_ADCSYSCLK_DIV18 +*\*\ - RCC_ADCSYSCLK_DIV19 +*\*\ - RCC_ADCSYSCLK_DIV20 +*\*\ - RCC_ADCSYSCLK_DIV21 +*\*\ - RCC_ADCSYSCLK_DIV22 +*\*\ - RCC_ADCSYSCLK_DIV23 +*\*\ - RCC_ADCSYSCLK_DIV24 +*\*\ - RCC_ADCSYSCLK_DIV25 +*\*\ - RCC_ADCSYSCLK_DIV26 +*\*\ - RCC_ADCSYSCLK_DIV27 +*\*\ - RCC_ADCSYSCLK_DIV28 +*\*\ - RCC_ADCSYSCLK_DIV29 +*\*\ - RCC_ADCSYSCLK_DIV30 +*\*\ - RCC_ADCSYSCLK_DIV31 +*\*\ - RCC_ADCSYSCLK_DIV32 +*\*\ - RCC_ADCSYSCLK_DIV33 +*\*\ - RCC_ADCSYSCLK_DIV34 +*\*\ - RCC_ADCSYSCLK_DIV35 +*\*\ - RCC_ADCSYSCLK_DIV36 +*\*\ - RCC_ADCSYSCLK_DIV37 +*\*\ - RCC_ADCSYSCLK_DIV38 +*\*\ - RCC_ADCSYSCLK_DIV39 +*\*\ - RCC_ADCSYSCLK_DIV40 +*\*\ - RCC_ADCSYSCLK_DIV41 +*\*\ - RCC_ADCSYSCLK_DIV42 +*\*\ - RCC_ADCSYSCLK_DIV43 +*\*\ - RCC_ADCSYSCLK_DIV44 +*\*\ - RCC_ADCSYSCLK_DIV45 +*\*\ - RCC_ADCSYSCLK_DIV46 +*\*\ - RCC_ADCSYSCLK_DIV47 +*\*\ - RCC_ADCSYSCLK_DIV48 +*\*\ - RCC_ADCSYSCLK_DIV49 +*\*\ - RCC_ADCSYSCLK_DIV50 +*\*\ - RCC_ADCSYSCLK_DIV51 +*\*\ - RCC_ADCSYSCLK_DIV52 +*\*\ - RCC_ADCSYSCLK_DIV53 +*\*\ - RCC_ADCSYSCLK_DIV54 +*\*\ - RCC_ADCSYSCLK_DIV55 +*\*\ - RCC_ADCSYSCLK_DIV56 +*\*\ - RCC_ADCSYSCLK_DIV57 +*\*\ - RCC_ADCSYSCLK_DIV58 +*\*\ - RCC_ADCSYSCLK_DIV59 +*\*\ - RCC_ADCSYSCLK_DIV60 +*\*\ - RCC_ADCSYSCLK_DIV61 +*\*\ - RCC_ADCSYSCLK_DIV62 +*\*\ - RCC_ADCSYSCLK_DIV63 +*\*\return none +**/ +void RCC_ConfigAdc3SysClk(uint32_t CLK_divider) +{ + uint32_t temp_value; + + temp_value = RCC->AHB1DIV2; + /* Clear ADC3SYSDIV[5:0] bits */ + temp_value &= RCC_ADC3SYSCLK_DIV_MASK; + /* Set ADC3SYSDIV[5:0] bits according to CLK_divider value */ + temp_value |= (CLK_divider << 16); + + /* Store the new value */ + RCC->AHB1DIV2 = temp_value; +} + + +/** +*\*\name RCC_ConfigBTIMKerClk. +*\*\fun Config the BTIM1/2/3/4 kernel clock divider from ahb1. +*\*\param CLK_divider +*\*\ - RCC_BTIMKERCLK_AHB1_DIV1 +*\*\ - RCC_BTIMKERCLK_AHB1_DIV2 +*\*\ - RCC_BTIMKERCLK_AHB1_DIV4 +*\*\ - RCC_BTIMKERCLK_AHB1_DIV8 +*\*\ - RCC_BTIMKERCLK_AHB1_DIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigBTIMKerClk(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB1DIV1; + /* Clear APB1BTIMDIV[2:0] bits */ + reg_value &= RCC_BTIMKERCLK_AHB1_DIV_MASK; + /* Set the APB1BTIMDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB1DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigGTIMA1_3_KerClk. +*\*\fun Config the GTIMA1/2/3 kernel clock divider from ahb2. +*\*\param CLK_divider +*\*\ - RCC_GTIMKERCLK_AHB2_DIV1 +*\*\ - RCC_GTIMKERCLK_AHB2_DIV2 +*\*\ - RCC_GTIMKERCLK_AHB2_DIV4 +*\*\ - RCC_GTIMKERCLK_AHB2_DIV8 +*\*\ - RCC_GTIMKERCLK_AHB2_DIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigGTIMA1_3_KerClk(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB2DIV1; + /* Clear APB2GTIMDIV[2:0] bits */ + reg_value &= RCC_GTIMKERCLK_AHB2_DIV_MASK; + /* Set the APB2GTIMDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB2DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigGTIMA4_7_KerClk. +*\*\fun Config the GTIMA4/5/6/7 kernel clock divider from ahb1. +*\*\param CLK_divider +*\*\ - RCC_GTIMKERCLK_AHB1_DIV1 +*\*\ - RCC_GTIMKERCLK_AHB1_DIV2 +*\*\ - RCC_GTIMKERCLK_AHB1_DIV4 +*\*\ - RCC_GTIMKERCLK_AHB1_DIV8 +*\*\ - RCC_GTIMKERCLK_AHB1_DIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigGTIMA4_7_KerClk(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB1DIV1; + /* Clear APB1GTIMDIV[2:0] bits */ + reg_value &= RCC_GTIMKERCLK_AHB1_DIV_MASK; + /* Set the APB1GTIMDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB1DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigGTIMB1_3_KerClk. +*\*\fun Config the GTIMB1/2/3 kernel clock divider from ahb1. +*\*\param CLK_divider +*\*\ - RCC_GTIMKERCLK_AHB1_DIV1 +*\*\ - RCC_GTIMKERCLK_AHB1_DIV2 +*\*\ - RCC_GTIMKERCLK_AHB1_DIV4 +*\*\ - RCC_GTIMKERCLK_AHB1_DIV8 +*\*\ - RCC_GTIMKERCLK_AHB1_DIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigGTIMB1_3_KerClk(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB1DIV1; + /* Clear APB1GTIMDIV[2:0] bits */ + reg_value &= RCC_GTIMKERCLK_AHB1_DIV_MASK; + /* Set the APB1GTIMDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB1DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigATIM1_2_KerClk. +*\*\fun Config the ATIM1/2 kernel clock divider from ahb2. +*\*\param CLK_divider +*\*\ - RCC_ATIMKERCLK_AHB2_DIV1 +*\*\ - RCC_ATIMKERCLK_AHB2_DIV2 +*\*\ - RCC_ATIMKERCLK_AHB2_DIV4 +*\*\ - RCC_ATIMKERCLK_AHB2_DIV8 +*\*\ - RCC_ATIMKERCLK_AHB2_DIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigATIM1_2_KerClk(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB2DIV1; + /* Clear APB2ATIMDIV[2:0] bits */ + reg_value &= RCC_ATIMKERCLK_AHB2_DIV_MASK; + /* Set the APB2ATIMDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB2DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigATIM3_4_KerClk. +*\*\fun Config the ATIM3/4 kernel clock divider from ahb5. +*\*\param CLK_divider +*\*\ - RCC_ATIMKERCLK_AHB5_DIV1 +*\*\ - RCC_ATIMKERCLK_AHB5_DIV2 +*\*\ - RCC_ATIMKERCLK_AHB5_DIV4 +*\*\ - RCC_ATIMKERCLK_AHB5_DIV8 +*\*\ - RCC_ATIMKERCLK_AHB5_DIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigATIM3_4_KerClk(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB5DIV1; + /* Clear APB5ATIMDIV[2:0] bits */ + reg_value &= RCC_ATIMKERCLK_AHB5_DIV_MASK; + /* Set the APB5ATIMDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB5DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigUSARTPClk. +*\*\fun Config the USART1/2 PCLK divider from ahb1. +*\*\param CLK_divider +*\*\ - RCC_USARTPCLK_AHB1_DIV1 +*\*\ - RCC_USARTPCLK_AHB1_DIV2 +*\*\ - RCC_USARTPCLK_AHB1_DIV4 +*\*\ - RCC_USARTPCLK_AHB1_DIV8 +*\*\ - RCC_USARTPCLK_AHB1_DIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigUSARTPClk(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB1DIV1; + /* Clear APB1USARTDIV[2:0] bits */ + reg_value &= RCC_USARTPCLK_AHB1_DIV_MASK; + /* Set the APB1USARTDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB1DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigI2S1KerClkSource. +*\*\fun Config the I2S1 kernel clock source. +*\*\param CLK_source(I2S kernel clock source): +*\*\ - RCC_I2SKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2SKERCLK_SRC_PLL3B +*\*\ - RCC_I2SKERCLK_SRC_HSI +*\*\ - RCC_I2SKERCLK_SRC_CLKIN +*\*\return none +*\*\note if select RCC_I2SKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB2I2SDIV[2:0] +**/ +void RCC_ConfigI2S1KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB2SEL1; + /* Clear I2S1KERSEL[1:0] bits */ + reg_value &= RCC_I2S1KERCLK_SRC_MASK; + /* Set I2S1KERSEL[1:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->APB2SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2S2KerClkSource. +*\*\fun Config the I2S2 kernel clock source. +*\*\param CLK_source(I2S kernel clock source): +*\*\ - RCC_I2SKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2SKERCLK_SRC_PLL3B +*\*\ - RCC_I2SKERCLK_SRC_HSI +*\*\ - RCC_I2SKERCLK_SRC_CLKIN +*\*\return none +*\*\note if select RCC_I2SKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB2I2SDIV[2:0] +**/ +void RCC_ConfigI2S2KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB2SEL1; + /* Clear I2S2KERSEL[1:0] bits */ + reg_value &= RCC_I2S2KERCLK_SRC_MASK; + /* Set I2S2KERSEL[1:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 2); + /* Store the new value */ + RCC->APB2SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2S1_2_KerSysDivider. +*\*\fun Config the I2S1/2 kernel clock source (sys_bus_div_clk) divider. +*\*\param CLK_divider +*\*\ - RCC_I2SKERCLK_SYSBUSDIV1 +*\*\ - RCC_I2SKERCLK_SYSBUSDIV2 +*\*\ - RCC_I2SKERCLK_SYSBUSDIV4 +*\*\ - RCC_I2SKERCLK_SYSBUSDIV8 +*\*\ - RCC_I2SKERCLK_SYSBUSDIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigI2S1_2_KerSysDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB2DIV1; + /* Clear APB2I2SDIV[2:0] bits */ + reg_value &= RCC_I2S1_2_KERCLK_SYSBUSDIV_MASK; + /* Set the APB2I2SDIV[2:0] bits */ + reg_value |= (CLK_divider << 8); + /* Store the new value */ + RCC->APB2DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigI2S3KerClkSource. +*\*\fun Config the I2S3 kernel clock source. +*\*\param CLK_source(I2S kernel clock source): +*\*\ - RCC_I2SKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2SKERCLK_SRC_PLL3B +*\*\ - RCC_I2SKERCLK_SRC_HSI +*\*\ - RCC_I2SKERCLK_SRC_CLKIN +*\*\return none +*\*\note if select RCC_I2SKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB1I2SDIV[2:0] +**/ +void RCC_ConfigI2S3KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB1SEL1; + /* Clear I2S3KERSEL[1:0] bits */ + reg_value &= RCC_I2S3KERCLK_SRC_MASK; + /* Set I2S3KERSEL[1:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->APB1SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2S4KerClkSource. +*\*\fun Config the I2S4 kernel clock source. +*\*\param CLK_source(I2S kernel clock source): +*\*\ - RCC_I2SKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2SKERCLK_SRC_PLL3B +*\*\ - RCC_I2SKERCLK_SRC_HSI +*\*\ - RCC_I2SKERCLK_SRC_CLKIN +*\*\return none +*\*\note if select RCC_I2SKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB1I2SDIV[2:0] +**/ +void RCC_ConfigI2S4KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB1SEL1; + /* Clear I2S4KERSEL[1:0] bits */ + reg_value &= RCC_I2S4KERCLK_SRC_MASK; + /* Set I2S4KERSEL[1:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 2); + /* Store the new value */ + RCC->APB1SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2S3_4_KerSysDivider. +*\*\fun Config the I2S3/4 kernel clock source (sys_bus_div_clk) divider. +*\*\param CLK_divider +*\*\ - RCC_I2SKERCLK_SYSBUSDIV1 +*\*\ - RCC_I2SKERCLK_SYSBUSDIV2 +*\*\ - RCC_I2SKERCLK_SYSBUSDIV4 +*\*\ - RCC_I2SKERCLK_SYSBUSDIV8 +*\*\ - RCC_I2SKERCLK_SYSBUSDIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigI2S3_4_KerSysDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB1DIV1; + /* Clear APB1I2SDIV[2:0] bits */ + reg_value &= RCC_I2S3_4_KERCLK_SYSBUSDIV_MASK; + /* Set the APB1I2SDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB1DIV1 = reg_value; +} + + + +/** +*\*\name RCC_ConfigI2C1KerClkSource. +*\*\fun Config the I2C1 kernel clock source. +*\*\param CLK_source(I2C kernel clock source): +*\*\ - RCC_I2CKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2CKERCLK_SRC_PLL3C +*\*\ - RCC_I2CKERCLK_SRC_HSI +*\*\ - RCC_I2CKERCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_I2CKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB1I2CDIV[2:0] +**/ +void RCC_ConfigI2C1KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB1SEL1; + /* Clear I2C1KERSEL[2:0] bits */ + reg_value &= RCC_I2C1KERCLK_SRC_MASK; + /* Set I2C1KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 8); + /* Store the new value */ + RCC->APB1SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2C2KerClkSource. +*\*\fun Config the I2C2 kernel clock source. +*\*\param CLK_source(I2C kernel clock source): +*\*\ - RCC_I2CKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2CKERCLK_SRC_PLL3C +*\*\ - RCC_I2CKERCLK_SRC_HSI +*\*\ - RCC_I2CKERCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_I2CKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB1I2CDIV[2:0] +**/ +void RCC_ConfigI2C2KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB1SEL1; + /* Clear I2C2KERSEL[2:0] bits */ + reg_value &= RCC_I2C2KERCLK_SRC_MASK; + /* Set I2C2KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 4); + /* Store the new value */ + RCC->APB1SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2C3KerClkSource. +*\*\fun Config the I2C3 kernel clock source. +*\*\param CLK_source(I2C kernel clock source): +*\*\ - RCC_I2CKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2CKERCLK_SRC_PLL3C +*\*\ - RCC_I2CKERCLK_SRC_HSI +*\*\ - RCC_I2CKERCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_I2CKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB1I2CDIV[2:0] +**/ +void RCC_ConfigI2C3KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB1SEL1; + /* Clear I2C3KERSEL[2:0] bits */ + reg_value &= RCC_I2C3KERCLK_SRC_MASK; + /* Set I2C3KERSEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->APB1SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2C1_3_KerSysDivider. +*\*\fun Config the I2C1/2/3 kernel clock source (sys_bus_div_clk) divider. +*\*\param CLK_divider +*\*\ - RCC_I2CKERCLK_SYSBUSDIV1 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV2 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV4 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV8 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigI2C1_3_KerSysDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB1DIV1; + /* Clear APB1I2CDIV[2:0] bits */ + reg_value &= RCC_I2C1_3_KERCLK_SYSBUSDIV_MASK; + /* Set the APB1I2CDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB1DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigI2C4KerClkSource. +*\*\fun Config the I2C4 kernel clock source. +*\*\param CLK_source(I2C kernel clock source): +*\*\ - RCC_I2CKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2CKERCLK_SRC_PLL3C +*\*\ - RCC_I2CKERCLK_SRC_HSI +*\*\ - RCC_I2CKERCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_I2CKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB2I2CDIV[2:0] +**/ +void RCC_ConfigI2C4KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB2SEL1; + /* Clear I2C4KERSEL[2:0] bits */ + reg_value &= RCC_I2C4KERCLK_SRC_MASK; + /* Set I2C4KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 8); + /* Store the new value */ + RCC->APB2SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2C5KerClkSource. +*\*\fun Config the I2C5 kernel clock source. +*\*\param CLK_source(I2C kernel clock source): +*\*\ - RCC_I2CKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2CKERCLK_SRC_PLL3C +*\*\ - RCC_I2CKERCLK_SRC_HSI +*\*\ - RCC_I2CKERCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_I2CKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB2I2CDIV[2:0] +**/ +void RCC_ConfigI2C5KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB2SEL1; + /* Clear I2C5KERSEL[2:0] bits */ + reg_value &= RCC_I2C5KERCLK_SRC_MASK; + /* Set I2C5KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 12); + /* Store the new value */ + RCC->APB2SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2C6KerClkSource. +*\*\fun Config the I2C6 kernel clock source. +*\*\param CLK_source(I2C kernel clock source): +*\*\ - RCC_I2CKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2CKERCLK_SRC_PLL3C +*\*\ - RCC_I2CKERCLK_SRC_HSI +*\*\ - RCC_I2CKERCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_I2CKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB2I2CDIV[2:0] +**/ +void RCC_ConfigI2C6KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB2SEL1; + /* Clear I2C6KERSEL[2:0] bits */ + reg_value &= RCC_I2C6KERCLK_SRC_MASK; + /* Set I2C6KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 16); + /* Store the new value */ + RCC->APB2SEL1 = reg_value; + +} + + +/** +*\*\name RCC_ConfigI2C4_6_KerSysDivider. +*\*\fun Config the I2C4/5/6 kernel clock source (sys_bus_div_clk) divider. +*\*\param CLK_divider +*\*\ - RCC_I2CKERCLK_SYSBUSDIV1 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV2 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV4 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV8 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigI2C4_6_KerSysDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB2DIV1; + /* Clear APB2I2CDIV[2:0] bits */ + reg_value &= RCC_I2C4_6_KERCLK_SYSBUSDIV_MASK; + /* Set the APB2I2CDIV[2:0] bits */ + reg_value |= (CLK_divider << 8); + /* Store the new value */ + RCC->APB2DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigI2C7KerClkSource. +*\*\fun Config the I2C7 kernel clock source. +*\*\param CLK_source(I2C kernel clock source): +*\*\ - RCC_I2CKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2CKERCLK_SRC_PLL3C +*\*\ - RCC_I2CKERCLK_SRC_HSI +*\*\ - RCC_I2CKERCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_I2CKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB5I2CDIV[2:0] +**/ +void RCC_ConfigI2C7KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB5SEL1; + /* Clear I2C7KERSEL[2:0] bits */ + reg_value &= RCC_I2C7KERCLK_SRC_MASK; + /* Set I2C7KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 8); + /* Store the new value */ + RCC->APB5SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2C8KerClkSource. +*\*\fun Config the I2C8 kernel clock source. +*\*\param CLK_source(I2C kernel clock source): +*\*\ - RCC_I2CKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2CKERCLK_SRC_PLL3C +*\*\ - RCC_I2CKERCLK_SRC_HSI +*\*\ - RCC_I2CKERCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_I2CKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB5I2CDIV[2:0] +**/ +void RCC_ConfigI2C8KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB5SEL1; + /* Clear I2C8KERSEL[2:0] bits */ + reg_value &= RCC_I2C8KERCLK_SRC_MASK; + /* Set I2C8KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 4); + /* Store the new value */ + RCC->APB5SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2C9KerClkSource. +*\*\fun Config the I2C9 kernel clock source. +*\*\param CLK_source(I2C kernel clock source): +*\*\ - RCC_I2CKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2CKERCLK_SRC_PLL3C +*\*\ - RCC_I2CKERCLK_SRC_HSI +*\*\ - RCC_I2CKERCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_I2CKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB5I2CDIV[2:0] +**/ +void RCC_ConfigI2C9KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB5SEL1; + /* Clear I2C9KERSEL[2:0] bits */ + reg_value &= RCC_I2C9KERCLK_SRC_MASK; + /* Set I2C9KERSEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->APB5SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigI2C10KerClkSource. +*\*\fun Config the I2C10 kernel clock source. +*\*\param CLK_source(I2C kernel clock source): +*\*\ - RCC_I2CKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_I2CKERCLK_SRC_PLL3C +*\*\ - RCC_I2CKERCLK_SRC_HSI +*\*\ - RCC_I2CKERCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_I2CKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB5I2CDIV[2:0] +**/ +void RCC_ConfigI2C10KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB5SEL1; + /* Clear I2C10KERSEL[2:0] bits */ + reg_value &= RCC_I2C10KERCLK_SRC_MASK; + /* Set I2C10KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 4); + /* Store the new value */ + RCC->APB5SEL1 = reg_value; + +} + + +/** +*\*\name RCC_ConfigI2C7_10_KerSysDivider. +*\*\fun Config the I2C7/8/9/10 kernel clock source (sys_bus_div_clk) divider. +*\*\param CLK_divider +*\*\ - RCC_I2CKERCLK_SYSBUSDIV1 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV2 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV4 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV8 +*\*\ - RCC_I2CKERCLK_SYSBUSDIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigI2C7_10_KerSysDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB5DIV1; + /* Clear APB5I2CDIV[2:0] bits */ + reg_value &= RCC_I2C7_10_KERCLK_SYSBUSDIV_MASK; + /* Set the APB5I2CDIV[2:0] bits */ + reg_value |= (CLK_divider << 24); + /* Store the new value */ + RCC->APB5DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigFDCAN1KerClkSource. +*\*\fun Config the FDCAN1 kernel clock source. +*\*\param CLK_source(FDCAN kernel clock source): +*\*\ - RCC_FDCANKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_FDCANKERCLK_SRC_PLL1C +*\*\ - RCC_FDCANKERCLK_SRC_PLL2C +*\*\ - RCC_FDCANKERCLK_SRC_PLL3B +*\*\ - RCC_FDCANKERCLK_SRC_PERIPH +*\*\return none +*\*\note if select RCC_FDCANKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB1FDCANDIV[2:0] +**/ +void RCC_ConfigFDCAN1KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB1SEL1; + /* Clear FDCAN1KERSEL[2:0] bits */ + reg_value &= RCC_FDCAN1KERCLK_SRC_MASK; + /* Set FDCAN1KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 8); + /* Store the new value */ + RCC->APB1SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigFDCAN2KerClkSource. +*\*\fun Config the FDCAN2 kernel clock source. +*\*\param CLK_source(FDCAN kernel clock source): +*\*\ - RCC_FDCANKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_FDCANKERCLK_SRC_PLL1C +*\*\ - RCC_FDCANKERCLK_SRC_PLL2C +*\*\ - RCC_FDCANKERCLK_SRC_PLL3B +*\*\ - RCC_FDCANKERCLK_SRC_PERIPH +*\*\return none +*\*\note if select RCC_FDCANKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB1FDCANDIV[2:0] +**/ +void RCC_ConfigFDCAN2KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB1SEL1; + /* Clear FDCAN2KERSEL[2:0] bits */ + reg_value &= RCC_FDCAN2KERCLK_SRC_MASK; + /* Set FDCAN2KERSEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->APB1SEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigFDCAN5KerClkSource. +*\*\fun Config the FDCAN5 kernel clock source. +*\*\param CLK_source(FDCAN kernel clock source): +*\*\ - RCC_FDCANKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_FDCANKERCLK_SRC_PLL1C +*\*\ - RCC_FDCANKERCLK_SRC_PLL2C +*\*\ - RCC_FDCANKERCLK_SRC_PLL3B +*\*\ - RCC_FDCANKERCLK_SRC_PERIPH +*\*\return none +*\*\note if select RCC_FDCANKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB1FDCANDIV[2:0] +**/ +void RCC_ConfigFDCAN5KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB1SEL2; + /* Clear FDCAN5KERSEL[2:0] bits */ + reg_value &= RCC_FDCAN5KERCLK_SRC_MASK; + /* Set FDCAN5KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 20); + /* Store the new value */ + RCC->APB1SEL2 = reg_value; + +} + +/** +*\*\name RCC_ConfigFDCAN6KerClkSource. +*\*\fun Config the FDCAN6 kernel clock source. +*\*\param CLK_source(FDCAN kernel clock source): +*\*\ - RCC_FDCANKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_FDCANKERCLK_SRC_PLL1C +*\*\ - RCC_FDCANKERCLK_SRC_PLL2C +*\*\ - RCC_FDCANKERCLK_SRC_PLL3B +*\*\ - RCC_FDCANKERCLK_SRC_PERIPH +*\*\return none +*\*\note if select RCC_FDCANKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB1FDCANDIV[2:0] +**/ +void RCC_ConfigFDCAN6KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB1SEL2; + /* Clear FDCAN6KERSEL[2:0] bits */ + reg_value &= RCC_FDCAN6KERCLK_SRC_MASK; + /* Set FDCAN6KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 12); + /* Store the new value */ + RCC->APB1SEL2 = reg_value; + +} + +/** +*\*\name RCC_ConfigFDCAN1_2_5_6_KerSysDivider. +*\*\fun Config the FDCAN1/2/5/6 kernel clock source (sys_bus_div_clk) divider. +*\*\param CLK_divider +*\*\ - RCC_FDCANKERCLK_SYSBUSDIV1 +*\*\ - RCC_FDCANKERCLK_SYSBUSDIV2 +*\*\ - RCC_FDCANKERCLK_SYSBUSDIV4 +*\*\ - RCC_FDCANKERCLK_SYSBUSDIV8 +*\*\ - RCC_FDCANKERCLK_SYSBUSDIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigFDCAN1_2_5_6_KerSysDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB1DIV1; + /* Clear APB1FDCANDIV[2:0] bits */ + reg_value &= RCC_FDCAN1_2_5_6_KERCLK_SYSBUSDIV_MASK; + /* Set the APB1FDCANDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB1DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigFDCAN3KerClkSource. +*\*\fun Config the FDCAN3 kernel clock source. +*\*\param CLK_source(FDCAN kernel clock source): +*\*\ - RCC_FDCANKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_FDCANKERCLK_SRC_PLL1C +*\*\ - RCC_FDCANKERCLK_SRC_PLL2C +*\*\ - RCC_FDCANKERCLK_SRC_PLL3B +*\*\ - RCC_FDCANKERCLK_SRC_PERIPH +*\*\return none +*\*\note if select RCC_FDCANKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB2FDCANDIV[2:0] +**/ +void RCC_ConfigFDCAN3KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB2SEL2; + /* Clear FDCAN3KERSEL[2:0] bits */ + reg_value &= RCC_FDCAN3KERCLK_SRC_MASK; + /* Set FDCAN3KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 20); + /* Store the new value */ + RCC->APB2SEL2 = reg_value; + +} + +/** +*\*\name RCC_ConfigFDCAN4KerClkSource. +*\*\fun Config the FDCAN4 kernel clock source. +*\*\param CLK_source(FDCAN kernel clock source): +*\*\ - RCC_FDCANKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_FDCANKERCLK_SRC_PLL1C +*\*\ - RCC_FDCANKERCLK_SRC_PLL2C +*\*\ - RCC_FDCANKERCLK_SRC_PLL3B +*\*\ - RCC_FDCANKERCLK_SRC_PERIPH +*\*\return none +*\*\note if select RCC_FDCANKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB2FDCANDIV[2:0] +**/ +void RCC_ConfigFDCAN4KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB2SEL2; + /* Clear FDCAN4KERSEL[2:0] bits */ + reg_value &= RCC_FDCAN4KERCLK_SRC_MASK; + /* Set FDCAN4KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 12); + /* Store the new value */ + RCC->APB2SEL2 = reg_value; + +} + +/** +*\*\name RCC_ConfigFDCAN7KerClkSource. +*\*\fun Config the FDCAN7 kernel clock source. +*\*\param CLK_source(FDCAN kernel clock source): +*\*\ - RCC_FDCANKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_FDCANKERCLK_SRC_PLL1C +*\*\ - RCC_FDCANKERCLK_SRC_PLL2C +*\*\ - RCC_FDCANKERCLK_SRC_PLL3B +*\*\ - RCC_FDCANKERCLK_SRC_PERIPH +*\*\return none +*\*\note if select RCC_FDCANKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB2FDCANDIV[2:0] +**/ +void RCC_ConfigFDCAN7KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB2SEL2; + /* Clear FDCAN7KERSEL[2:0] bits */ + reg_value &= RCC_FDCAN7KERCLK_SRC_MASK; + /* Set FDCAN7KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 4); + /* Store the new value */ + RCC->APB2SEL2 = reg_value; + +} + +/** +*\*\name RCC_ConfigFDCAN8KerClkSource. +*\*\fun Config the FDCAN8 kernel clock source. +*\*\param CLK_source(FDCAN kernel clock source): +*\*\ - RCC_FDCANKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_FDCANKERCLK_SRC_PLL1C +*\*\ - RCC_FDCANKERCLK_SRC_PLL2C +*\*\ - RCC_FDCANKERCLK_SRC_PLL3B +*\*\ - RCC_FDCANKERCLK_SRC_PERIPH +*\*\return none +*\*\note if select RCC_FDCANKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by APB2FDCANDIV[2:0] +**/ +void RCC_ConfigFDCAN8KerClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->APB2SEL2; + /* Clear FDCAN8KERSEL[2:0] bits */ + reg_value &= RCC_FDCAN8KERCLK_SRC_MASK; + /* Set FDCAN8KERSEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 4); + /* Store the new value */ + RCC->APB2SEL2 = reg_value; + +} + +/** +*\*\name RCC_ConfigFDCAN3_4_7_8_KerSysDivider. +*\*\fun Config the FDCAN3/4/7/8 kernel clock source (sys_bus_div_clk) divider. +*\*\param CLK_divider +*\*\ - RCC_FDCANKERCLK_SYSBUSDIV1 +*\*\ - RCC_FDCANKERCLK_SYSBUSDIV2 +*\*\ - RCC_FDCANKERCLK_SYSBUSDIV4 +*\*\ - RCC_FDCANKERCLK_SYSBUSDIV8 +*\*\ - RCC_FDCANKERCLK_SYSBUSDIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigFDCAN3_4_7_8_KerSysDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB2DIV1; + /* Clear APB2FDCANDIV[2:0] bits */ + reg_value &= RCC_FDCAN3_4_7_8_KERCLK_SYSBUSDIV_MASK; + /* Set the APB2FDCANDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB2DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigEXTISysDivider. +*\*\fun Config the EXTI (sys_bus_div_clk) divider. +*\*\param CLK_divider +*\*\ - RCC_EXTICLK_SYSBUSDIV1 +*\*\ - RCC_EXTICLK_SYSBUSDIV2 +*\*\ - RCC_EXTICLK_SYSBUSDIV4 +*\*\ - RCC_EXTICLK_SYSBUSDIV8 +*\*\ - RCC_EXTICLK_SYSBUSDIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigEXTISysDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->APB5DIV1; + /* Clear APB5EXTIDIV[2:0] bits */ + reg_value &= RCC_EXTI_SYSBUSDIV_MASK; + /* Set the APB5EXTIDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->APB5DIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigRtcClk. +*\*\fun Config the RTC clock. +*\*\param CLK_source: +*\*\ - RCC_RTCCLK_SRC_LSE +*\*\ - RCC_RTCCLK_SRC_LSI +*\*\ - RCC_RTCCLK_SRC_HSEDIV +*\*\param CLK_divider: +*\*\ - RCC_RTCCLK_HSEDIV1 +*\*\ - RCC_RTCCLK_HSEDIV2 +*\*\ - RCC_RTCCLK_HSEDIV3 +*\*\ - RCC_RTCCLK_HSEDIV4 +*\*\ - RCC_RTCCLK_HSEDIV5 +*\*\ - RCC_RTCCLK_HSEDIV6 +*\*\ - RCC_RTCCLK_HSEDIV7 +*\*\ - RCC_RTCCLK_HSEDIV8 +*\*\ - RCC_RTCCLK_HSEDIV9 +*\*\ - RCC_RTCCLK_HSEDIV10 +*\*\ - RCC_RTCCLK_HSEDIV11 +*\*\ - RCC_RTCCLK_HSEDIV12 +*\*\ - RCC_RTCCLK_HSEDIV13 +*\*\ - RCC_RTCCLK_HSEDIV14 +*\*\ - RCC_RTCCLK_HSEDIV15 +*\*\ - RCC_RTCCLK_HSEDIV16 +*\*\ - RCC_RTCCLK_HSEDIV17 +*\*\ - RCC_RTCCLK_HSEDIV18 +*\*\ - RCC_RTCCLK_HSEDIV19 +*\*\ - RCC_RTCCLK_HSEDIV20 +*\*\ - RCC_RTCCLK_HSEDIV21 +*\*\ - RCC_RTCCLK_HSEDIV22 +*\*\ - RCC_RTCCLK_HSEDIV23 +*\*\ - RCC_RTCCLK_HSEDIV24 +*\*\ - RCC_RTCCLK_HSEDIV25 +*\*\ - RCC_RTCCLK_HSEDIV26 +*\*\ - RCC_RTCCLK_HSEDIV27 +*\*\ - RCC_RTCCLK_HSEDIV28 +*\*\ - RCC_RTCCLK_HSEDIV29 +*\*\ - RCC_RTCCLK_HSEDIV30 +*\*\ - RCC_RTCCLK_HSEDIV31 +*\*\ - RCC_RTCCLK_HSEDIV32 +*\*\ - RCC_RTCCLK_HSEDIV33 +*\*\ - RCC_RTCCLK_HSEDIV34 +*\*\ - RCC_RTCCLK_HSEDIV35 +*\*\ - RCC_RTCCLK_HSEDIV36 +*\*\ - RCC_RTCCLK_HSEDIV37 +*\*\ - RCC_RTCCLK_HSEDIV38 +*\*\ - RCC_RTCCLK_HSEDIV39 +*\*\ - RCC_RTCCLK_HSEDIV40 +*\*\ - RCC_RTCCLK_HSEDIV41 +*\*\ - RCC_RTCCLK_HSEDIV42 +*\*\ - RCC_RTCCLK_HSEDIV43 +*\*\ - RCC_RTCCLK_HSEDIV44 +*\*\ - RCC_RTCCLK_HSEDIV45 +*\*\ - RCC_RTCCLK_HSEDIV46 +*\*\ - RCC_RTCCLK_HSEDIV47 +*\*\ - RCC_RTCCLK_HSEDIV48 +*\*\ - RCC_RTCCLK_HSEDIV49 +*\*\ - RCC_RTCCLK_HSEDIV50 +*\*\ - RCC_RTCCLK_HSEDIV51 +*\*\ - RCC_RTCCLK_HSEDIV52 +*\*\ - RCC_RTCCLK_HSEDIV53 +*\*\ - RCC_RTCCLK_HSEDIV54 +*\*\ - RCC_RTCCLK_HSEDIV55 +*\*\ - RCC_RTCCLK_HSEDIV56 +*\*\ - RCC_RTCCLK_HSEDIV57 +*\*\ - RCC_RTCCLK_HSEDIV58 +*\*\ - RCC_RTCCLK_HSEDIV59 +*\*\ - RCC_RTCCLK_HSEDIV60 +*\*\ - RCC_RTCCLK_HSEDIV61 +*\*\ - RCC_RTCCLK_HSEDIV62 +*\*\ - RCC_RTCCLK_HSEDIV63 +*\*\return none +*\*\note if select RCC_RTCCLK_SRC_HSEDIV then set the HSE divider by RTCHSEDIV[5:0] +*\*\note BDCTRL is protected, you need to enable the PWR clock first, +*\*\ then configure PWR_SYSCTRL1.DBKP to 1 to change it. +**/ +void RCC_ConfigRtcClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->BDCTRL; + /* Clear RTCSEL[2:0] bits */ + reg_value &= RCC_RTCCLK_SRC_MASK; + /* Set RTCSEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->BDCTRL = reg_value; + + if(CLK_source == RCC_RTCCLK_SRC_HSEDIV) + { + reg_value1 = RCC->CFG5; + /* Clear RTCHSEDIV[5:0] bits */ + reg_value1 &= RCC_RTCCLK_HSEDIV_MASK; + /* Set the RTCHSEDIV[5:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->CFG5 = reg_value1; + } + +} + +/** +*\*\name RCC_EnableRtcClk. +*\*\fun Enables the RTC clock. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note This function must be used only after the RTC clock was selected +*\*\ using the RCC_ConfigRtcClk function. +*\*\note BDCTRL is protected, you need to enable the PWR clock first, +*\*\ then configure PWR_SYSCTRL1.DBKP to 1 to change it. +**/ +void RCC_EnableRtcClk(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + RCC->BDCTRL |= RCC_RTC_ENABLE; + } + else + { + RCC->BDCTRL &= (~RCC_RTC_ENABLE); + } +} + +/** +*\*\name RCC_EnableBackupReset. +*\*\fun Reset Backup domain . +*\*\param none +*\*\return none. +*\*\note BDCTRL is protected, you need to enable the PWR clock first, +*\*\ then configure PWR_SYSCTRL1.DBKP to 1 to change it. +**/ +void RCC_EnableBackupReset(void) +{ + RCC->BDCTRL |= (RCC_BKUP_RESET); + RCC->BDCTRL &= (~RCC_BKUP_RESET); +} + +/** +*\*\name RCC_EnableDCMUReset. +*\*\fun Reset DCMU. +*\*\param none +*\*\return none. +**/ +void RCC_EnableDCMUReset(void) +{ + RCC->CFG4 |= (RCC_DCMU_RESET); + RCC->CFG4 &= (~RCC_DCMU_RESET); +} + +/** +*\*\name RCC_ConfigLPTIM1Clk. +*\*\fun Config the LPTIM1 clock source. +*\*\param CLK_source: +*\*\ - RCC_LPTIMCLK_SRC_APB5 +*\*\ - RCC_LPTIMCLK_SRC_LSI +*\*\ - RCC_LPTIMCLK_SRC_LSE +*\*\ - RCC_LPTIMCLK_SRC_HSE +*\*\ - RCC_LPTIMCLK_SRC_HSI +*\*\ - RCC_LPTIMCLK_SRC_MSI +*\*\ - RCC_LPTIMCLK_SRC_COMP1 +*\*\ - RCC_LPTIMCLK_SRC_COMP2 +*\*\ - RCC_LPTIMCLK_SRC_COMP3 +*\*\ - RCC_LPTIMCLK_SRC_COMP4 +*\*\return none +*\*\note none +**/ +void RCC_ConfigLPTIM1Clk(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->RDSEL1; + /* Clear LPTIM1SEL[3:0] bits */ + reg_value &= RCC_LPTIM1CLK_SRC_MASK; + /* Set LPTIM1SEL[3:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->RDSEL1 = reg_value; + +} + +/** +*\*\name RCC_EnableLPTIM1CompGate. +*\*\fun Enable gate signal from COMPx to LPTIM1. +*\*\param COMP_sel(select one COMPx) : +*\*\ -RCC_GATEEN_LPTIM1_COMP1 +*\*\ -RCC_GATEEN_LPTIM1_COMP2 +*\*\ -RCC_GATEEN_LPTIM1_COMP3 +*\*\ -RCC_GATEEN_LPTIM1_COMP4 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note If the LPTIM clock source is COMP, you need to enable this gate +**/ +void RCC_EnableLPTIM1CompGate(uint32_t COMP_sel, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDCTRL1 |= COMP_sel; + } + else + { + RCC->RDCTRL1 &= ~COMP_sel; + } + +} + +/** +*\*\name RCC_ConfigLPTIM2Clk. +*\*\fun Config the LPTIM2 clock source. +*\*\param CLK_source: +*\*\ - RCC_LPTIMCLK_SRC_APB5 +*\*\ - RCC_LPTIMCLK_SRC_LSI +*\*\ - RCC_LPTIMCLK_SRC_LSE +*\*\ - RCC_LPTIMCLK_SRC_HSE +*\*\ - RCC_LPTIMCLK_SRC_HSI +*\*\ - RCC_LPTIMCLK_SRC_MSI +*\*\ - RCC_LPTIMCLK_SRC_COMP1 +*\*\ - RCC_LPTIMCLK_SRC_COMP2 +*\*\ - RCC_LPTIMCLK_SRC_COMP3 +*\*\ - RCC_LPTIMCLK_SRC_COMP4 +*\*\return none +*\*\note none +**/ +void RCC_ConfigLPTIM2Clk(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->RDSEL1; + /* Clear LPTIM2SEL[3:0] bits */ + reg_value &= RCC_LPTIM2CLK_SRC_MASK; + /* Set LPTIM2SEL[3:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 4); + /* Store the new value */ + RCC->RDSEL1 = reg_value; + +} + +/** +*\*\name RCC_EnableLPTIM2CompGate. +*\*\fun Enable gate signal from COMPx to LPTIM2. +*\*\param COMP_sel(select one COMPx) : +*\*\ -RCC_GATEEN_LPTIM2_COMP1 +*\*\ -RCC_GATEEN_LPTIM2_COMP2 +*\*\ -RCC_GATEEN_LPTIM2_COMP3 +*\*\ -RCC_GATEEN_LPTIM2_COMP4 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note If the LPTIM clock source is COMP, you need to enable this gate +**/ +void RCC_EnableLPTIM2CompGate(uint32_t COMP_sel, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDCTRL1 |= COMP_sel; + } + else + { + RCC->RDCTRL1 &= ~COMP_sel; + } + +} + +/** +*\*\name RCC_ConfigLPTIM3Clk. +*\*\fun Config the LPTIM3 clock source. +*\*\param CLK_source: +*\*\ - RCC_LPTIMCLK_SRC_APB5 +*\*\ - RCC_LPTIMCLK_SRC_LSI +*\*\ - RCC_LPTIMCLK_SRC_LSE +*\*\ - RCC_LPTIMCLK_SRC_HSE +*\*\ - RCC_LPTIMCLK_SRC_HSI +*\*\ - RCC_LPTIMCLK_SRC_MSI +*\*\ - RCC_LPTIMCLK_SRC_COMP1 +*\*\ - RCC_LPTIMCLK_SRC_COMP2 +*\*\ - RCC_LPTIMCLK_SRC_COMP3 +*\*\ - RCC_LPTIMCLK_SRC_COMP4 +*\*\return none +*\*\note none +**/ +void RCC_ConfigLPTIM3Clk(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->RDSEL1; + /* Clear LPTIM3SEL[3:0] bits */ + reg_value &= RCC_LPTIM3CLK_SRC_MASK; + /* Set LPTIM3SEL[3:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 8); + /* Store the new value */ + RCC->RDSEL1 = reg_value; + +} + +/** +*\*\name RCC_EnableLPTIM3CompGate. +*\*\fun Enable gate signal from COMPx to LPTIM3. +*\*\param COMP_sel(select one COMPx) : +*\*\ -RCC_GATEEN_LPTIM3_COMP1 +*\*\ -RCC_GATEEN_LPTIM3_COMP2 +*\*\ -RCC_GATEEN_LPTIM3_COMP3 +*\*\ -RCC_GATEEN_LPTIM3_COMP4 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note If the LPTIM clock source is COMP, you need to enable this gate +**/ +void RCC_EnableLPTIM3CompGate(uint32_t COMP_sel, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDCTRL2 |= COMP_sel; + } + else + { + RCC->RDCTRL2 &= ~COMP_sel; + } + +} + +/** +*\*\name RCC_ConfigLPTIM4Clk. +*\*\fun Config the LPTIM4 clock source. +*\*\param CLK_source: +*\*\ - RCC_LPTIMCLK_SRC_APB5 +*\*\ - RCC_LPTIMCLK_SRC_LSI +*\*\ - RCC_LPTIMCLK_SRC_LSE +*\*\ - RCC_LPTIMCLK_SRC_HSE +*\*\ - RCC_LPTIMCLK_SRC_HSI +*\*\ - RCC_LPTIMCLK_SRC_MSI +*\*\ - RCC_LPTIMCLK_SRC_COMP1 +*\*\ - RCC_LPTIMCLK_SRC_COMP2 +*\*\ - RCC_LPTIMCLK_SRC_COMP3 +*\*\ - RCC_LPTIMCLK_SRC_COMP4 +*\*\return none +*\*\note none +**/ +void RCC_ConfigLPTIM4Clk(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->RDSEL1; + /* Clear LPTIM4SEL[3:0] bits */ + reg_value &= RCC_LPTIM4CLK_SRC_MASK; + /* Set LPTIM4SEL[3:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 12); + /* Store the new value */ + RCC->RDSEL1 = reg_value; + +} + +/** +*\*\name RCC_EnableLPTIM4CompGate. +*\*\fun Enable gate signal from COMPx to LPTIM4. +*\*\param COMP_sel(select one COMPx) : +*\*\ -RCC_GATEEN_LPTIM4_COMP1 +*\*\ -RCC_GATEEN_LPTIM4_COMP2 +*\*\ -RCC_GATEEN_LPTIM4_COMP3 +*\*\ -RCC_GATEEN_LPTIM4_COMP4 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note If the LPTIM clock source is COMP, you need to enable this gate +**/ +void RCC_EnableLPTIM4CompGate(uint32_t COMP_sel, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDCTRL2 |= COMP_sel; + } + else + { + RCC->RDCTRL2 &= ~COMP_sel; + } + +} + +/** +*\*\name RCC_ConfigLPTIM5Clk. +*\*\fun Config the LPTIM5 clock source. +*\*\param CLK_source: +*\*\ - RCC_LPTIMCLK_SRC_APB5 +*\*\ - RCC_LPTIMCLK_SRC_LSI +*\*\ - RCC_LPTIMCLK_SRC_LSE +*\*\ - RCC_LPTIMCLK_SRC_HSE +*\*\ - RCC_LPTIMCLK_SRC_HSI +*\*\ - RCC_LPTIMCLK_SRC_MSI +*\*\ - RCC_LPTIMCLK_SRC_COMP1 +*\*\ - RCC_LPTIMCLK_SRC_COMP2 +*\*\ - RCC_LPTIMCLK_SRC_COMP3 +*\*\ - RCC_LPTIMCLK_SRC_COMP4 +*\*\return none +*\*\note none +**/ +void RCC_ConfigLPTIM5Clk(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->RDSEL1; + /* Clear LPTIM5SEL[3:0] bits */ + reg_value &= RCC_LPTIM5CLK_SRC_MASK; + /* Set LPTIM5SEL[3:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 16); + /* Store the new value */ + RCC->RDSEL1 = reg_value; + +} + +/** +*\*\name RCC_EnableLPTIM5CompGate. +*\*\fun Enable gate signal from COMPx to LPTIM5. +*\*\param COMP_sel(select one COMPx) : +*\*\ -RCC_GATEEN_LPTIM5_COMP1 +*\*\ -RCC_GATEEN_LPTIM5_COMP2 +*\*\ -RCC_GATEEN_LPTIM5_COMP3 +*\*\ -RCC_GATEEN_LPTIM5_COMP4 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note If the LPTIM clock source is COMP, you need to enable this gate +**/ +void RCC_EnableLPTIM5CompGate(uint32_t COMP_sel, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDCTRL3 |= COMP_sel; + } + else + { + RCC->RDCTRL3 &= ~COMP_sel; + } + +} + +/** +*\*\name RCC_ConfigLPUART1ClkSource. +*\*\fun Config the LPUART1 kernel clock Source. +*\*\param CLK_source: +*\*\ - RCC_LPUARTCLK_SRC_SYSBUSDIV +*\*\ - RCC_LPUARTCLK_SRC_HSI +*\*\ - RCC_LPUARTCLK_SRC_LSE +*\*\ - RCC_LPUARTCLK_SRC_HSE +*\*\ - RCC_LPUARTCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_LPUARTCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by LPUARTDIV[2:0] +**/ +void RCC_ConfigLPUART1ClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->RDSEL1; + /* Clear LPUART1SEL[2:0] bits */ + reg_value &= RCC_LPUART1CLK_SRC_MASK; + /* Set LPUART1SEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->RDSEL1 = reg_value; +} + +/** +*\*\name RCC_ConfigLPUART2ClkSource. +*\*\fun Config the LPUART2 kernel clock Source. +*\*\param CLK_source: +*\*\ - RCC_LPUARTCLK_SRC_SYSBUSDIV +*\*\ - RCC_LPUARTCLK_SRC_HSI +*\*\ - RCC_LPUARTCLK_SRC_LSE +*\*\ - RCC_LPUARTCLK_SRC_HSE +*\*\ - RCC_LPUARTCLK_SRC_MSI +*\*\return none +*\*\note if select RCC_LPUARTCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by LPUARTDIV[2:0] +**/ +void RCC_ConfigLPUART2ClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->RDSEL1; + /* Clear LPUART2SEL[2:0] bits */ + reg_value &= RCC_LPUART2CLK_SRC_MASK; + /* Set LPUART2SEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 4); + /* Store the new value */ + RCC->RDSEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigLPUART1_2_ClkDivider. +*\*\fun Config the LPUART1/2 kernel clock system divider. +*\*\param CLK_divider: +*\*\ - RCC_LPUARTCLK_SYSBUSDIV1 +*\*\ - RCC_LPUARTCLK_SYSBUSDIV2 +*\*\ - RCC_LPUARTCLK_SYSBUSDIV4 +*\*\ - RCC_LPUARTCLK_SYSBUSDIV8 +*\*\ - RCC_LPUARTCLK_SYSBUSDIV16 +*\*\return none +*\*\note if select RCC_LPUARTCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by LPUARTDIV[2:0] +**/ +void RCC_ConfigLPUART1_2_ClkDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->RDDIV1; + /* Clear LPUARTDIV[2:0] bits */ + reg_value &= RCC_LPUARTCLK_SYSBUSDIV_MASK; + /* Set the LPUARTDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->RDDIV1 = reg_value; + +} + + +/** +*\*\name RCC_ConfigCOMPLsxClk. +*\*\fun Config the COMP low speed clock source. +*\*\param CLK_source: +*\*\ - RCC_COMPLSXCLK_SRC_LSI +*\*\ - RCC_COMPLSXCLK_SRC_LSE +*\*\return none +*\*\note none +**/ +void RCC_ConfigCOMPLsxClk(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->RDSEL1; + /* Clear COMPSEL bits */ + reg_value &= RCC_COMPLSXCLK_SRC_MASK; + /* Set COMPSEL bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->RDSEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigCOMPKerClk. +*\*\fun Config the COMP kernel clock divider from sys_bus_div_clk. +*\*\param CLK_divider +*\*\ - RCC_COMPKERCLK_SYSBUSDIV1 +*\*\ - RCC_COMPKERCLK_SYSBUSDIV2 +*\*\ - RCC_COMPKERCLK_SYSBUSDIV4 +*\*\ - RCC_COMPKERCLK_SYSBUSDIV8 +*\*\ - RCC_COMPKERCLK_SYSBUSDIV16 +*\*\return none +*\*\note none +**/ +void RCC_ConfigCOMPKerClk(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->RDDIV1; + /* Clear COMPDIV[2:0] bits */ + reg_value &= RCC_COMPKERCLK_SYSBUSDIV_MASK; + /* Set the COMPDIV[2:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->RDDIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigFEMCM0Clk. +*\*\fun Config the FEMC M0 clock. +*\*\param CLK_source: +*\*\ - RCC_FEMCCLK_SRC_AXIDIV +*\*\ - RCC_FEMCCLK_SRC_PERIPH +*\*\ - RCC_FEMCCLK_SRC_PLL2C +*\*\ - RCC_FEMCCLK_SRC_PLL3B +*\*\ - RCC_FEMCCLK_SRC_PLL1B +*\*\param CLK_divider: +*\*\ - RCC_FEMCCLK_AXIDIV1 +*\*\ - RCC_FEMCCLK_AXIDIV2 +*\*\ - RCC_FEMCCLK_AXIDIV3 +*\*\ - RCC_FEMCCLK_AXIDIV4 +*\*\ - RCC_FEMCCLK_AXIDIV5 +*\*\ - RCC_FEMCCLK_AXIDIV6 +*\*\ - RCC_FEMCCLK_AXIDIV7 +*\*\ - RCC_FEMCCLK_AXIDIV8 +*\*\ - RCC_FEMCCLK_AXIDIV9 +*\*\ - RCC_FEMCCLK_AXIDIV10 +*\*\ - RCC_FEMCCLK_AXIDIV11 +*\*\ - RCC_FEMCCLK_AXIDIV12 +*\*\ - RCC_FEMCCLK_AXIDIV13 +*\*\ - RCC_FEMCCLK_AXIDIV14 +*\*\ - RCC_FEMCCLK_AXIDIV15 +*\*\return none +*\*\note if select RCC_FEMCCLK_SRC_AXIDIV then set the AXI clock divider by FEMCM0SYSDIV[3:0] +**/ +void RCC_ConfigFEMCM0Clk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->AXISEL2; + /* Clear FEMCM0SEL[2:0] bits */ + reg_value &= RCC_FEMCM0CLK_SRC_MASK; + /* Set FEMCM0SEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AXISEL2 = reg_value; + + if(CLK_source == RCC_FEMCCLK_SRC_AXIDIV) + { + reg_value1 = RCC->AXIDIV2; + /* Clear FEMCM0AXIDIV[3:0] bits */ + reg_value1 &= RCC_FEMCM0CLK_AXIDIV_MASK; + /* Set the FEMCM0AXIDIV[3:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->AXIDIV2 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigFEMCM1Clk. +*\*\fun Config the FEMC M1 clock. +*\*\param CLK_source: +*\*\ - RCC_FEMCCLK_SRC_AXIDIV +*\*\ - RCC_FEMCCLK_SRC_PERIPH +*\*\ - RCC_FEMCCLK_SRC_PLL2C +*\*\ - RCC_FEMCCLK_SRC_PLL3B +*\*\ - RCC_FEMCCLK_SRC_PLL1B +*\*\param CLK_divider: +*\*\ - RCC_FEMCCLK_AXIDIV1 +*\*\ - RCC_FEMCCLK_AXIDIV2 +*\*\ - RCC_FEMCCLK_AXIDIV3 +*\*\ - RCC_FEMCCLK_AXIDIV4 +*\*\ - RCC_FEMCCLK_AXIDIV5 +*\*\ - RCC_FEMCCLK_AXIDIV6 +*\*\ - RCC_FEMCCLK_AXIDIV7 +*\*\ - RCC_FEMCCLK_AXIDIV8 +*\*\ - RCC_FEMCCLK_AXIDIV9 +*\*\ - RCC_FEMCCLK_AXIDIV10 +*\*\ - RCC_FEMCCLK_AXIDIV11 +*\*\ - RCC_FEMCCLK_AXIDIV12 +*\*\ - RCC_FEMCCLK_AXIDIV13 +*\*\ - RCC_FEMCCLK_AXIDIV14 +*\*\ - RCC_FEMCCLK_AXIDIV15 +*\*\return none +*\*\note if select RCC_FEMCCLK_SRC_AXIDIV then set the AXI clock divider by FEMCM1SYSDIV[3:0] +**/ +void RCC_ConfigFEMCM1Clk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->AXISEL2; + /* Clear FEMCM1SEL[2:0] bits */ + reg_value &= RCC_FEMCM1CLK_SRC_MASK; + /* Set FEMCM1SEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source << 4); + /* Store the new value */ + RCC->AXISEL2 = reg_value; + + if(CLK_source == RCC_FEMCCLK_SRC_AXIDIV) + { + reg_value1 = RCC->AXIDIV2; + /* Clear FEMCM1AXIDIV[3:0] bits */ + reg_value1 &= RCC_FEMCM1CLK_AXIDIV_MASK; + /* Set the FEMCM1AXIDIV[3:0] bits */ + reg_value1 |= (CLK_divider << 4); + /* Store the new value */ + RCC->AXIDIV2 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigDSIRefClk. +*\*\fun Config the DSI reference clock divider from HSE. +*\*\param CLK_divider: +*\*\ - RCC_DSIREFCLK_HSE_DIV1 +*\*\ - RCC_DSIREFCLK_HSE_DIV2 +*\*\return none +*\*\note none +**/ +void RCC_ConfigDSIRefClk(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->CFG5; + /* Clear DSIHSEDIV[3:0] bits */ + reg_value &= RCC_DSIREFCLK_HSE_DIV_MASK; + /* Set the DSIHSEDIV[3:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->CFG5 = reg_value; + +} + +/** +*\*\name RCC_ConfigDSIKerClk. +*\*\fun Config the DSI kernel clock divider from HSE. +*\*\param CLK_source: +*\*\ - RCC_DSIKERCLK_SRC_REF +*\*\ - RCC_DSIKERCLK_SRC_PLL3C +*\*\return none +*\*\note none +**/ +void RCC_ConfigDSIKerClk(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->AXISEL1; + /* Clear DSIKERSEL[1:0] bits */ + reg_value &= RCC_DSIKERCLK_SRC_MASK; + /* Set the DSIKERSEL[1:0] bits */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AXISEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigDSIPpitxClk. +*\*\fun Config the DSI PPI TXCLKESC clock. +*\*\param CLK_source: +*\*\ - RCC_DSIPPICLK_SRC_REFDIV +*\*\ - RCC_DSIPPICLK_SRC_PLL2B +*\*\ - RCC_DSIPPICLK_SRC_PERIPH +*\*\ - RCC_DSIPPICLK_SRC_AXIDIV +*\*\param CLK_divider: +*\*\ - RCC_DSIPPICLK_DIV1 +*\*\ - RCC_DSIPPICLK_DIV2 +*\*\ - RCC_DSIPPICLK_DIV4 +*\*\ - RCC_DSIPPICLK_DIV8 +*\*\ - RCC_DSIPPICLK_DIV16 +*\*\ - RCC_DSIPPICLK_DIV32 +*\*\ - RCC_DSIPPICLK_DIV64 +*\*\ - RCC_DSIPPICLK_DIV128 +*\*\ - RCC_DSIPPICLK_DIV256 +*\*\ - RCC_DSIPPICLK_DIV512 +*\*\return none +*\*\note if select RCC_DSIPPICLK_SRC_REFDIV then set the REF clock divider by DSIREFDIV[3:0], +*\*\ if select RCC_DSIPPICLK_SRC_AXIDIV then set the AXI clock divider by DSIAXIPPIDIV[3:0] +**/ +void RCC_ConfigDSIPpitxClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->AXISEL1; + /* Clear DSIPPITXSEL[1:0] bits */ + reg_value &= RCC_DSIPPICLK_SRC_MASK; + /* Set DSIPPITXSEL[1:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AXISEL1 = reg_value; + + if(CLK_source == RCC_DSIPPICLK_SRC_REFDIV) + { + reg_value1 = RCC->AXIDIV1; + /* Clear DSIREFDIV[3:0] bits */ + reg_value1 &= RCC_DSIPPICLK_REFDIV_MASK; + /* Set the DSIREFDIV[3:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->AXIDIV1 = reg_value1; + } + else if(CLK_source == RCC_DSIPPICLK_SRC_AXIDIV) + { + reg_value1 = RCC->AXIDIV2; + /* Clear DSIAXIPPIDIV[3:0] bits */ + reg_value1 &= RCC_DSIPPICLK_AXIDIV_MASK; + /* Set the DSIAXIPPIDIV[3:0] bits */ + reg_value1 |= (CLK_divider << 4); + /* Store the new value */ + RCC->AXIDIV2 = reg_value1; + } + else + { + /* no process */ + } + +} + +/** +*\*\name RCC_ConfigDSIUlpsClk. +*\*\fun Config the DSI ULPS TXCLKESC clock. +*\*\param CLK_source: +*\*\ - RCC_DSIULPSCLK_SRC_REFDIV +*\*\ - RCC_DSIULPSCLK_SRC_PLL3C +*\*\param CLK_divider: +*\*\ - RCC_DSIULPSCLK_REFDIV1 +*\*\ - RCC_DSIULPSCLK_REFDIV2 +*\*\ - RCC_DSIULPSCLK_REFDIV4 +*\*\ - RCC_DSIULPSCLK_REFDIV8 +*\*\ - RCC_DSIULPSCLK_REFDIV16 +*\*\ - RCC_DSIULPSCLK_REFDIV32 +*\*\ - RCC_DSIULPSCLK_REFDIV64 +*\*\ - RCC_DSIULPSCLK_REFDIV128 +*\*\ - RCC_DSIULPSCLK_REFDIV256 +*\*\ - RCC_DSIULPSCLK_REFDIV512 +*\*\return none +*\*\note if select RCC_DSIULPSCLK_SRC_REFDIV then set the REF clock divider by DSIREFULPSDIV[3:0] +**/ +void RCC_ConfigDSIUlpsClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->AXISEL1; + /* Clear DSIULPSSEL[1:0] bits */ + reg_value &= RCC_DSIULPSCLK_SRC_MASK; + /* Set DSIULPSSEL[1:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AXISEL1 = reg_value; + + if(CLK_source == RCC_DSIULPSCLK_SRC_REFDIV) + { + reg_value1 = RCC->AXIDIV2; + /* Clear DSIREFULPSDIV[3:0] bits */ + reg_value1 &= RCC_DSIULPSCLK_REFDIV_MASK; + /* Set the DSIREFULPSDIV[3:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->AXIDIV2 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigLCDCPixelClk. +*\*\fun Config the LCDC pixel clock. +*\*\param CLK_source: +*\*\ - RCC_LCDCPIXELCLK_SRC_AXIDIV +*\*\ - RCC_LCDCPIXELCLK_SRC_PERIPH +*\*\ - RCC_LCDCPIXELCLK_SRC_PLL2C +*\*\ - RCC_LCDCPIXELCLK_SRC_PLL3B +*\*\param CLK_divider: +*\*\ - RCC_LCDCPIXELCLK_AXIDIV1 +*\*\ - RCC_LCDCPIXELCLK_AXIDIV2 +*\*\ - RCC_LCDCPIXELCLK_AXIDIV4 +*\*\ - RCC_LCDCPIXELCLK_AXIDIV8 +*\*\ - RCC_LCDCPIXELCLK_AXIDIV16 +*\*\ - RCC_LCDCPIXELCLK_AXIDIV32 +*\*\ - RCC_LCDCPIXELCLK_AXIDIV64 +*\*\ - RCC_LCDCPIXELCLK_AXIDIV128 +*\*\ - RCC_LCDCPIXELCLK_AXIDIV256 +*\*\ - RCC_LCDCPIXELCLK_AXIDIV512 +*\*\return none +*\*\note if select RCC_LCDCPIXELCLK_SRC_AXIDIV then set the AXI clock divider by LCDCAXIDIV[3:0] +**/ +void RCC_ConfigLCDCPixelClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->AXISEL1; + /* Clear LCDCKERSEL[1:0] bits */ + reg_value &= RCC_LCDCPIXELCLK_SRC_MASK; + /* Set LCDCKERSEL[1:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AXISEL1 = reg_value; + + if(CLK_source == RCC_LCDCPIXELCLK_SRC_AXIDIV) + { + reg_value1 = RCC->AXIDIV1; + /* Clear LCDCAXIDIV[3:0] bits */ + reg_value1 &= RCC_LCDCPIXELCLK_AXIDIV_MASK; + /* Set the LCDCAXIDIV[3:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->AXIDIV1 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigDVP1MClkSource. +*\*\fun Config the DVP1 M clock source. +*\*\param CLK_source: +*\*\ - RCC_DVPMCLK_SRC_AXIDIV +*\*\ - RCC_DVPMCLK_SRC_PERIPH +*\*\ - RCC_DVPMCLK_SRC_PLL2C +*\*\ - RCC_DVPMCLK_SRC_PLL3A +*\*\return none +*\*\note if select RCC_DVPMCLK_SRC_AXIDIV then set the AXI clock divider by DVPMAXIDIV[3:0] +**/ +void RCC_ConfigDVP1MClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->AXISEL1; + /* Clear DVP1MSEL[1:0] bits */ + reg_value &= RCC_DVP1MCLK_SRC_MASK; + /* Set DVP1MSEL[1:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AXISEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigDVP2MClkSource. +*\*\fun Config the DVP2 M clock source. +*\*\param CLK_source: +*\*\ - RCC_DVPMCLK_SRC_AXIDIV +*\*\ - RCC_DVPMCLK_SRC_PERIPH +*\*\ - RCC_DVPMCLK_SRC_PLL2C +*\*\ - RCC_DVPMCLK_SRC_PLL3A +*\*\return none +*\*\note if select RCC_DVPMCLK_SRC_AXIDIV then set the AXI clock divider by DVPMAXIDIV[3:0] +**/ +void RCC_ConfigDVP2MClkSource(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->AXISEL1; + /* Clear DVP2MSEL[1:0] bits */ + reg_value &= RCC_DVP2MCLK_SRC_MASK; + /* Set DVP2MSEL[1:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 2); + /* Store the new value */ + RCC->AXISEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigDVP1_2_MClkDivider. +*\*\fun Config the DVP1/2 M clock AXI divider. +*\*\param CLK_divider: +*\*\ - RCC_DVPMCLK_AXIDIV1 +*\*\ - RCC_DVPMCLK_AXIDIV2 +*\*\ - RCC_DVPMCLK_AXIDIV4 +*\*\ - RCC_DVPMCLK_AXIDIV8 +*\*\ - RCC_DVPMCLK_AXIDIV16 +*\*\ - RCC_DVPMCLK_AXIDIV32 +*\*\ - RCC_DVPMCLK_AXIDIV64 +*\*\ - RCC_DVPMCLK_AXIDIV128 +*\*\ - RCC_DVPMCLK_AXIDIV256 +*\*\ - RCC_DVPMCLK_AXIDIV512 +*\*\return none +**/ +void RCC_ConfigDVP1_2_MClkDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->AXIDIV1; + /* Clear DVPMAXIDIV[3:0] bits */ + reg_value &= RCC_DVPMCLK_AXIDIV_MASK; + /* Set the DVPMAXIDIV[3:0] bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->AXIDIV1 = reg_value; +} + +/** +*\*\name RCC_ConfigXSPI1SSIClk. +*\*\fun Config the XSPI1 SSI clock. +*\*\param CLK_source: +*\*\ - RCC_XSPISSICLK_SRC_AXI +*\*\ - RCC_XSPISSICLK_SRC_PLL3C +*\*\ - RCC_XSPISSICLK_SRC_PLL1B +*\*\ - RCC_XSPISSICLK_SRC_PLL2A +*\*\ - RCC_XSPISSICLK_SRC_PLL2C +*\*\return none +**/ +void RCC_ConfigXSPI1SSIClk(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->AXISEL1; + /* Clear XSPI1SSISEL[2:0] bits */ + reg_value &= RCC_XSPI1SSICLK_SRC_MASK; + /* Set XSPI1SSISEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AXISEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigXSPI2SSIClk. +*\*\fun Config the XSPI2 SSI clock. +*\*\param CLK_source: +*\*\ - RCC_XSPISSICLK_SRC_AXI +*\*\ - RCC_XSPISSICLK_SRC_PLL3C +*\*\ - RCC_XSPISSICLK_SRC_PLL1B +*\*\ - RCC_XSPISSICLK_SRC_PLL2A +*\*\ - RCC_XSPISSICLK_SRC_PLL2C +*\*\return none +**/ +void RCC_ConfigXSPI2SSIClk(uint32_t CLK_source) +{ + uint32_t reg_value; + + reg_value = RCC->AXISEL1; + /* Clear XSPI2SSISEL[2:0] bits */ + reg_value &= RCC_XSPI2SSICLK_SRC_MASK; + /* Set XSPI2SSISEL[2:0] bits according to CLK_source value */ + reg_value |= (CLK_source >> 4); + /* Store the new value */ + RCC->AXISEL1 = reg_value; + +} + +/** +*\*\name RCC_ConfigSDRAMMemClk. +*\*\fun Config the SDRAM memory clock. +*\*\param CLK_source: +*\*\ - RCC_SDRAMMEMCLK_SRC_AXIDIV +*\*\ - RCC_SDRAMMEMCLK_SRC_PERIPH +*\*\ - RCC_SDRAMMEMCLK_SRC_PLL2A +*\*\ - RCC_SDRAMMEMCLK_SRC_PLL3A +*\*\ - RCC_SDRAMMEMCLK_SRC_PLL1B +*\*\param CLK_divider: +*\*\ - RCC_SDRAMMEMCLK_AXIDIV1 +*\*\ - RCC_SDRAMMEMCLK_AXIDIV2 +*\*\ - RCC_SDRAMMEMCLK_AXIDIV4 +*\*\ - RCC_SDRAMMEMCLK_AXIDIV8 +*\*\ - RCC_SDRAMMEMCLK_AXIDIV16 +*\*\ - RCC_SDRAMMEMCLK_AXIDIV32 +*\*\ - RCC_SDRAMMEMCLK_AXIDIV64 +*\*\ - RCC_SDRAMMEMCLK_AXIDIV128 +*\*\ - RCC_SDRAMMEMCLK_AXIDIV256 +*\*\ - RCC_SDRAMMEMCLK_AXIDIV512 +*\*\return none +*\*\note if select RCC_SDRAMMEMCLK_SRC_AXIDIV then set the AXI clock divider by SDRAMMEMDIV[3:0] +**/ +void RCC_ConfigSDRAMMemClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->AXISEL2; + /* Clear SDRAMMEMSEL[2:0] bits */ + reg_value &= RCC_SDRAMMEMCLK_SRC_MASK; + /* Set SDRAMMEMSEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AXISEL2 = reg_value; + + if(CLK_source == RCC_SDRAMMEMCLK_SRC_AXIDIV) + { + reg_value1 = RCC->AXIDIV2; + /* Clear SDRAMMEMDIV[3:0] bits */ + reg_value1 &= RCC_SDRAMMEMCLK_AXIDIV_MASK; + /* Set the SDRAMMEMDIV[3:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->AXIDIV2 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigETHERCATKerClk. +*\*\fun Config the ETHERCAT kernel clock. +*\*\param CLK_source: +*\*\ - RCC_ESCKERCLK_SRC_SYSBUSDIV +*\*\ - RCC_ESCKERCLK_SRC_PLL2B +*\*\ - RCC_ESCKERCLK_SRC_PLL3A +*\*\ - RCC_ESCKERCLK_SRC_PLL3C +*\*\ - RCC_ESCKERCLK_SRC_PLL1B +*\*\param CLK_divider: +*\*\ - RCC_ESCKERCLK_SYSBUSDIV1 +*\*\ - RCC_ESCKERCLK_SYSBUSDIV2 +*\*\ - RCC_ESCKERCLK_SYSBUSDIV4 +*\*\ - RCC_ESCKERCLK_SYSBUSDIV8 +*\*\ - RCC_ESCKERCLK_SYSBUSDIV16 +*\*\ - RCC_ESCKERCLK_SYSBUSDIV32 +*\*\ - RCC_ESCKERCLK_SYSBUSDIV64 +*\*\ - RCC_ESCKERCLK_SYSBUSDIV128 +*\*\ - RCC_ESCKERCLK_SYSBUSDIV256 +*\*\ - RCC_ESCKERCLK_SYSBUSDIV512 +*\*\return none +*\*\note if select RCC_ESCKERCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by ESCSYSDIV[3:0] +*\*\note You need to make sure that the ETHERCAT kernel clock frequency is 100MHz +**/ +void RCC_ConfigETHERCATKerClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->AHB9SEL1; + /* Clear ESCKERSEL[2:0] bits */ + reg_value &= RCC_ESCKERCLK_SRC_MASK; + /* Set ESCKERSEL[2:0] bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->AHB9SEL1 = reg_value; + + if(CLK_source == RCC_ESCKERCLK_SRC_SYSBUSDIV) + { + reg_value1 = RCC->AHB9DIV1; + /* Clear ESCSYSDIV[3:0] bits */ + reg_value1 &= RCC_ESCKERCLK_SYSBUSDIV_MASK; + /* Set the ESCSYSDIV[3:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->AHB9DIV1 = reg_value1; + } + +} + +/** +*\*\name RCC_ConfigTRNGClk. +*\*\fun Config the TRNG clock. +*\*\param CLK_source: +*\*\ - RCC_TRNGCLK_SRC_SYSBUSDIV +*\*\ - RCC_TRNGCLK_SRC_HSI +*\*\param CLK_divider: +*\*\ - RCC_TRNGCLK_SYSBUSDIV1 +*\*\ - RCC_TRNGCLK_SYSBUSDIV2 +*\*\ - RCC_TRNGCLK_SYSBUSDIV4 +*\*\ - RCC_TRNGCLK_SYSBUSDIV8 +*\*\ - RCC_TRNGCLK_SYSBUSDIV16 +*\*\ - RCC_TRNGCLK_SYSBUSDIV32 +*\*\ - RCC_TRNGCLK_SYSBUSDIV64 +*\*\ - RCC_TRNGCLK_SYSBUSDIV128 +*\*\ - RCC_TRNGCLK_SYSBUSDIV256 +*\*\ - RCC_TRNGCLK_SYSBUSDIV512 +*\*\return none +*\*\note if select RCC_TRNGCLK_SRC_SYSBUSDIV then set the (sys_bus_div_clk) divider by TRNGDIV[3:0] +**/ +void RCC_ConfigTRNGClk(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t reg_value; + uint32_t reg_value1; + + reg_value = RCC->CFG5; + /* Clear TRNGSEL bits */ + reg_value &= RCC_TRNGCLK_SRC_MASK; + /* Set TRNGSEL bits according to CLK_source value */ + reg_value |= CLK_source; + /* Store the new value */ + RCC->CFG5 = reg_value; + + if(CLK_source == RCC_TRNGCLK_SRC_SYSBUSDIV) + { + reg_value1 = RCC->CFG5; + /* Clear TRNGDIV[3:0] bits */ + reg_value1 &= RCC_TRNGCLK_SYSBUSDIV_MASK; + /* Set the TRNGDIV[3:0] bits */ + reg_value1 |= CLK_divider; + /* Store the new value */ + RCC->CFG5 = reg_value1; + } + +} + +/** +*\*\name RCC_EnableTRNGClk. +*\*\fun Enables the TRNG clock. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableTRNGClk(FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + RCC->CFG5 |= RCC_TRNG_ENABLE; + } + else + { + RCC->CFG5 &= (~RCC_TRNG_ENABLE); + } +} + +/** +*\*\name RCC_EnableCFG2PeriphClk1. +*\*\fun Enables the CFG2 register peripheral clock. +*\*\param CFG2_periph (CFG2 peripheral to gates its clock): +*\*\ - RCC_CFG2_PERIPHEN_M4_CAHI +*\*\ - RCC_CFG2_PERIPHEN_M4_CAHIPCLK +*\*\ - RCC_CFG2_PERIPHEN_M4_CAHD +*\*\ - RCC_CFG2_PERIPHEN_M4_CAHDPCLK +*\*\ - RCC_CFG2_PERIPHEN_M7_MMU +*\*\ - RCC_CFG2_PERIPHEN_M7_MMULP +*\*\ - RCC_CFG2_PERIPHEN_M4_MMU +*\*\ - RCC_CFG2_PERIPHEN_M4_MMULP +*\*\ - RCC_CFG2_PERIPHEN_M7_SRAMBKP +*\*\ - RCC_CFG2_PERIPHEN_M4_SRAMBKP +*\*\ - RCC_CFG2_PERIPHEN_M7_SRAMBKPLP +*\*\ - RCC_CFG2_PERIPHEN_M4_SRAMBKPLP +*\*\ - RCC_CFG2_PERIPHEN_M7_SRAM1 +*\*\ - RCC_CFG2_PERIPHEN_M4_SRAM1 +*\*\ - RCC_CFG2_PERIPHEN_M7_SRAM1LP +*\*\ - RCC_CFG2_PERIPHEN_M4_SRAM1LP +*\*\ - RCC_CFG2_PERIPHEN_M7_SRAM2 +*\*\ - RCC_CFG2_PERIPHEN_M4_SRAM2 +*\*\ - RCC_CFG2_PERIPHEN_M7_SRAM2LP +*\*\ - RCC_CFG2_PERIPHEN_M4_SRAM2LP +*\*\ - RCC_CFG2_PERIPHEN_M7_SRAM3 +*\*\ - RCC_CFG2_PERIPHEN_M4_SRAM3 +*\*\ - RCC_CFG2_PERIPHEN_M7_SRAM3LP +*\*\ - RCC_CFG2_PERIPHEN_M4_SRAM3LP +*\*\ - RCC_CFG2_PERIPHEN_M7_SRAM4 +*\*\ - RCC_CFG2_PERIPHEN_M4_SRAM4 +*\*\ - RCC_CFG2_PERIPHEN_M7_SRAM4LP +*\*\ - RCC_CFG2_PERIPHEN_M4_SRAM4LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableCFG2PeriphClk1(uint32_t CFG2_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->CFG2 |= CFG2_periph; + } + else + { + RCC->CFG2 &= ~CFG2_periph; + } +} + + +/** +*\*\name RCC_EnableCFG4PeriphClk1. +*\*\fun Enables the CFG4 register peripheral clock. +*\*\param CFG4_periph (CFG4 peripheral to gates its clock): +*\*\ - RCC_CFG4_PERIPHEN_AHB1BUS +*\*\ - RCC_CFG4_PERIPHEN_AHB2BUS +*\*\ - RCC_CFG4_PERIPHEN_AHB5BUS +*\*\ - RCC_CFG4_PERIPHEN_AHB6BUS +*\*\ - RCC_CFG4_PERIPHEN_AXIBUS +*\*\ - RCC_CFG4_PERIPHEN_APB1BUS +*\*\ - RCC_CFG4_PERIPHEN_APB2BUS +*\*\ - RCC_CFG4_PERIPHEN_APB5BUS +*\*\ - RCC_CFG4_PERIPHEN_APB6BUS +*\*\ - RCC_CFG4_PERIPHEN_AHB9BUS +*\*\ - RCC_CFG4_PERIPHEN_M7AXIMATRIX_GPV +*\*\ - RCC_CFG4_PERIPHEN_M4AXIMATRIX_GPV +*\*\ - RCC_CFG4_PERIPHEN_HSICG +*\*\ - RCC_CFG4_PERIPHEN_HSIKERCG +*\*\ - RCC_CFG4_PERIPHEN_HSECG +*\*\ - RCC_CFG4_PERIPHEN_HSEKERCG +*\*\ - RCC_CFG4_PERIPHEN_MSICG +*\*\ - RCC_CFG4_PERIPHEN_MSIKERCG +*\*\ - RCC_CFG4_PERIPHEN_M7AXIMATRIX +*\*\ - RCC_CFG4_PERIPHEN_AXIGGPV +*\*\ - RCC_CFG4_PERIPHEN_M4AXIMATRIX +*\*\ - RCC_CFG4_PERIPHEN_M7DCMUCLK +*\*\ - RCC_CFG4_PERIPHEN_M4DCMUCLK +*\*\ - RCC_CFG4_PERIPHEN_AHBMATRIX1 +*\*\ - RCC_CFG4_PERIPHEN_AHBMATRIX2 +*\*\ - RCC_CFG4_PERIPHEN_AHBMATRIX3 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableCFG4PeriphClk1(uint32_t CFG4_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->CFG4 |= CFG4_periph; + } + else + { + RCC->CFG4 &= ~CFG4_periph; + } +} + +/** +*\*\name RCC_EnableCFG5PeriphClk1. +*\*\fun Enables the CFG5 register peripheral clock. +*\*\param CFG5_periph (CFG5 peripheral to gates its clock): +*\*\ - RCC_CFG5_PERIPHEN_M7_SRAM5 +*\*\ - RCC_CFG5_PERIPHEN_M4_SRAM5 +*\*\ - RCC_CFG5_PERIPHEN_M7_SRAM5LP +*\*\ - RCC_CFG5_PERIPHEN_M4_SRAM5LP +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_EnableCFG5PeriphClk1(uint32_t CFG5_periph, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->CFG5 |= CFG5_periph; + } + else + { + RCC->CFG5 &= ~CFG5_periph; + } +} + +/** +*\*\name RCC_ConfigMco1. +*\*\fun Configures the MCO1 clock source and divider. +*\*\param CLK_source: +*\*\ - RCC_MCO1_SRC_LSI +*\*\ - RCC_MCO1_SRC_HSI +*\*\ - RCC_MCO1_SRC_MSI +*\*\ - RCC_MCO1_SRC_LSE +*\*\ - RCC_MCO1_SRC_HSE +*\*\ - RCC_MCO1_SRC_PLL3B +*\*\param CLK_divider: +*\*\ - RCC_MCO1_DIV1 +*\*\ - RCC_MCO1_DIV2 +*\*\ - RCC_MCO1_DIV4 +*\*\ - RCC_MCO1_DIV8 +*\*\ - RCC_MCO1_DIV16 +*\*\ - RCC_MCO1_DIV32 +*\*\ - RCC_MCO1_DIV64 +*\*\ - RCC_MCO1_DIV128 +*\*\return none +*\*\return none +**/ +void RCC_ConfigMco1(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t temp_value; + + temp_value = RCC->CFG3; + /* Clear MCO1SEL[3:0] and MCO1DIV[3:0] bits */ + temp_value &= RCC_MCO1_SRC_MASK; + temp_value &= RCC_MCO1_DIV_MASK; + /* Set MCO1SEL[3:0] bits according to CLK_source value */ + temp_value |= CLK_source; + /* Set MCO1DIV[3:0] bits according to CLK_divider value */ + temp_value |= CLK_divider; + + /* Store the new value */ + RCC->CFG3 = temp_value; +} + +/** +*\*\name RCC_ConfigMco2. +*\*\fun Configures the MCO2 clock source and divider. +*\*\param CLK_source: +*\*\ - RCC_MCO2_SRC_SYSCLK +*\*\ - RCC_MCO2_SRC_PLL1A +*\*\ - RCC_MCO2_SRC_PLL2A +*\*\ - RCC_MCO2_SRC_PLL3A +*\*\ - RCC_MCO2_SRC_SHRPLL +*\*\ - RCC_MCO2_SRC_LSE +*\*\param CLK_divider: +*\*\ - RCC_MCO2_DIV1 +*\*\ - RCC_MCO2_DIV2 +*\*\ - RCC_MCO2_DIV4 +*\*\ - RCC_MCO2_DIV8 +*\*\ - RCC_MCO2_DIV16 +*\*\ - RCC_MCO2_DIV32 +*\*\ - RCC_MCO2_DIV64 +*\*\ - RCC_MCO2_DIV128 +*\*\return none +**/ +void RCC_ConfigMco2(uint32_t CLK_source, uint32_t CLK_divider) +{ + uint32_t temp_value; + + temp_value = RCC->CFG3; + /* Clear MCO2SEL[3:0] and MCO2DIV[3:0] bits */ + temp_value &= RCC_MCO2_SRC_MASK; + temp_value &= RCC_MCO2_DIV_MASK; + /* Set MCO2SEL[3:0] bits according to CLK_source value */ + temp_value |= CLK_source; + /* Set MCO2DIV[3:0] bits according to CLK_divider value */ + temp_value |= CLK_divider; + + /* Store the new value */ + RCC->CFG3 = temp_value; +} + +/** +*\*\name RCC_EnableFDCANStopRequest1. +*\*\fun Sending a stop request to the FDCAN module when enabled. +*\*\param FDCAN_sel(select FDCANx) : +*\*\ -RCC_STOPEN_FDCAN1 +*\*\ -RCC_STOPEN_FDCAN2 +*\*\ -RCC_STOPEN_FDCAN5 +*\*\ -RCC_STOPEN_FDCAN6 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note Hardware clears this bit after receiving a shutdown answer from the CAN module +**/ +void RCC_EnableFDCANStopRequest1(uint32_t FDCAN_sel, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB1EN5 |= FDCAN_sel; + } + else + { + RCC->APB1EN5 &= ~FDCAN_sel; + } + +} + +/** +*\*\name RCC_GetFDCANStopAckFlag1 +*\*\fun Checks whether the specified FDCAN Stop Ack flag is set or not. +*\*\param RCC_flag (The input parameters must be the following values): +*\*\ -RCC_FLAG_STOPACK_FDCAN1 +*\*\ -RCC_FLAG_STOPACK_FDCAN2 +*\*\ -RCC_FLAG_STOPACK_FDCAN5 +*\*\ -RCC_FLAG_STOPACK_FDCAN6 +*\*\return FlagStatus +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus RCC_GetFDCANStopAckFlag1(uint32_t RCC_flag) +{ + FlagStatus bitstatus; + + if ((RCC->APB1EN5 & RCC_flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name RCC_EnableFDCANStopRequest2. +*\*\fun Sending a stop request to the FDCAN module when enabled. +*\*\param FDCAN_sel(select FDCANx) : +*\*\ -RCC_STOPEN_FDCAN3 +*\*\ -RCC_STOPEN_FDCAN4 +*\*\ -RCC_STOPEN_FDCAN7 +*\*\ -RCC_STOPEN_FDCAN8 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note Hardware clears this bit after receiving a shutdown answer from the CAN module +**/ +void RCC_EnableFDCANStopRequest2(uint32_t FDCAN_sel, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->APB2EN4 |= FDCAN_sel; + } + else + { + RCC->APB2EN4 &= ~FDCAN_sel; + } + +} + +/** +*\*\name RCC_GetFDCANStopAckFlag2 +*\*\fun Checks whether the specified FDCAN Stop Ack flag is set or not. +*\*\param RCC_flag (The input parameters must be the following values): +*\*\ -RCC_FLAG_STOPACK_FDCAN3 +*\*\ -RCC_FLAG_STOPACK_FDCAN4 +*\*\ -RCC_FLAG_STOPACK_FDCAN7 +*\*\ -RCC_FLAG_STOPACK_FDCAN8 +*\*\return FlagStatus +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus RCC_GetFDCANStopAckFlag2(uint32_t RCC_flag) +{ + FlagStatus bitstatus; + + if ((RCC->APB2EN4 & RCC_flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** +*\*\name RCC_ConfigPeriphClk. +*\*\fun Configures the Periph clock source. +*\*\param CLK_source(Periph clock source): +*\*\ - RCC_PERIPHCLK_SRC_HSI +*\*\ - RCC_PERIPHCLK_SRC_MSI +*\*\ - RCC_PERIPHCLK_SRC_HSE +*\*\return none +*\*\note If the module clock source is selected as periph, then needs to config PERSW[1:0] +**/ +void RCC_ConfigPeriphClk(uint32_t CLK_source) +{ + uint32_t temp_value; + + temp_value = RCC->CFG3; + + /* Clear PERSW[1:0] bits */ + temp_value &= RCC_PERIPHCLK_SRC_MASK; + /* Set PERSW[1:0] bits according to CLK_source value*/ + temp_value |= CLK_source; + + /* Store the new value */ + RCC->CFG3 = temp_value; + +} + +/** +*\*\name RCC_EnableModuleResetRequest. +*\*\fun Configure whether to generate a reset request when the corresponding module event occurs. +*\*\param Module_sel(select module) : +*\*\ -RCC_RSTEN_WWDG1 +*\*\ -RCC_RSTEN_WWDG2 +*\*\ -RCC_RSTEN_BOR +*\*\ -RCC_RSTEN_C1LP +*\*\ -RCC_RSTEN_C2LP +*\*\ -RCC_RSTEN_BKPEMC +*\*\ -RCC_RSTEN_RETEMC +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note BDCTRL is protected, you need to enable the PWR clock first, +*\*\ then configure PWR_SYSCTRL1.DBKP to 1 to change it. +**/ +void RCC_EnableModuleResetRequest(uint32_t Module_sel, FunctionalState Cmd) +{ + if(Module_sel <= RCC_RSTEN_WWDG2) + { + if (Cmd != DISABLE) + { + RCC->CFG1 |= Module_sel; + } + else + { + RCC->CFG1 &= ~Module_sel; + } + } + else + { + if (Cmd != DISABLE) + { + RCC->BDCTRL |= Module_sel; + } + else + { + RCC->BDCTRL &= ~Module_sel; + } + } + + +} + +/** +*\*\name RCC_ConfigInt1. +*\*\fun Enables the specified RCC interrupts. +*\*\param Interrupt(the RCC interrupt sources to be enabled): +*\*\ - RCC_INT_LSECSS +*\*\ - RCC_INT_BOR +*\*\ - RCC_INT_PLL1RD +*\*\ - RCC_INT_PLL2RD +*\*\ - RCC_INT_PLL3RD +*\*\ - RCC_INT_SHRPLLRD +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_ConfigInt1(uint32_t Interrupt, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->CLKINT1 |= (((uint32_t)Interrupt) << 1); + } + else + { + RCC->CLKINT1 &= (~(((uint32_t)Interrupt) << 1)); + } + +} + +/** +*\*\name RCC_ConfigInt2. +*\*\fun Enables the specified RCC interrupts. +*\*\param Interrupt(the RCC interrupt sources to be enabled): +*\*\ - RCC_INT_HSERD +*\*\ - RCC_INT_HSIRD +*\*\ - RCC_INT_MSIRD +*\*\ - RCC_INT_LSERD +*\*\ - RCC_INT_LSIRD +*\*\ - RCC_INT_HSICALE +*\*\ - RCC_INT_MSICALE +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_ConfigInt2(uint32_t Interrupt, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->CLKINT2 |= (((uint32_t)Interrupt) << 1); + } + else + { + RCC->CLKINT2 &= (~(((uint32_t)Interrupt) << 1)); + } + +} + +/** +*\*\name RCC_ConfigInt3. +*\*\fun Enables the specified RCC interrupts. +*\*\param Interrupt(the RCC interrupt sources to be enabled): +*\*\ - RCC_INT_PLL1LKF +*\*\ - RCC_INT_PLL2LKF +*\*\ - RCC_INT_PLL3LKF +*\*\ - RCC_INT_SHRPLLLKF +*\*\ - RCC_INT_LSIF +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RCC_ConfigInt3(uint32_t Interrupt, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->CLKINT3 |= (((uint32_t)Interrupt) << 1); + } + else + { + RCC->CLKINT3 &= (~(((uint32_t)Interrupt) << 1)); + } + +} + +/** +*\*\name RCC_GetIntStatus1. +*\*\fun Checks whether the specified RCC interrupt has occurred or not. +*\*\param interrupt_flag(RCC interrupt source to check): +*\*\ - RCC_INT_LSECSS +*\*\ - RCC_INT_HSECSS +*\*\ - RCC_INT_BOR +*\*\ - RCC_INT_PLL1RD +*\*\ - RCC_INT_PLL2RD +*\*\ - RCC_INT_PLL3RD +*\*\ - RCC_INT_SHRPLLRD +*\*\return The new state of interrupt_flag +*\*\ - SET +*\*\ - RESET +**/ +INTStatus RCC_GetIntStatus1(uint32_t interrupt_flag) +{ + INTStatus bitstatus; + + /* Check the status of the specified RCC interrupt */ + if ((RCC->CLKINT1 & interrupt_flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name RCC_GetIntStatus2. +*\*\fun Checks whether the specified RCC interrupt has occurred or not. +*\*\param interrupt_flag(RCC interrupt source to check): +*\*\ - RCC_INT_HSERD +*\*\ - RCC_INT_HSIRD +*\*\ - RCC_INT_MSIRD +*\*\ - RCC_INT_LSERD +*\*\ - RCC_INT_LSIRD +*\*\ - RCC_INT_HSICALE +*\*\ - RCC_INT_MSICALE +*\*\return The new state of interrupt_flag +*\*\ - SET +*\*\ - RESET +**/ +INTStatus RCC_GetIntStatus2(uint32_t interrupt_flag) +{ + INTStatus bitstatus; + + /* Check the status of the specified RCC interrupt */ + if ((RCC->CLKINT2 & interrupt_flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name RCC_GetIntStatus3. +*\*\fun Checks whether the specified RCC interrupt has occurred or not. +*\*\param interrupt_flag(RCC interrupt source to check): +*\*\ - RCC_INT_PLL1LKF +*\*\ - RCC_INT_PLL2LKF +*\*\ - RCC_INT_PLL3LKF +*\*\ - RCC_INT_SHRPLLLKF +*\*\ - RCC_INT_LSIF +*\*\return The new state of interrupt_flag +*\*\ - SET +*\*\ - RESET +**/ +INTStatus RCC_GetIntStatus3(uint32_t interrupt_flag) +{ + INTStatus bitstatus; + + /* Check the status of the specified RCC interrupt */ + if ((RCC->CLKINT3 & interrupt_flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** +*\*\name RCC_ClrIntPendingBit1. +*\*\fun Clears the RCC's interrupt pending bits. +*\*\param interrupt_clear(interrupt pending bit to clear): +*\*\ - RCC_INT_LSECSS +*\*\ - RCC_INT_HSECSS +*\*\ - RCC_INT_BOR +*\*\ - RCC_INT_PLL1RD +*\*\ - RCC_INT_PLL2RD +*\*\ - RCC_INT_PLL3RD +*\*\ - RCC_INT_SHRPLLRD +*\*\return none +**/ +void RCC_ClrIntPendingBit1(uint32_t interrupt_clear) +{ + /* Software set this bit to clear INT flag. */ + RCC->CLKINT1 |= (((uint32_t)interrupt_clear) >> 1);; +} + +/** +*\*\name RCC_ClrIntPendingBit2. +*\*\fun Clears the RCC's interrupt pending bits. +*\*\param interrupt_clear(interrupt pending bit to clear): +*\*\ - RCC_INT_HSERD +*\*\ - RCC_INT_HSIRD +*\*\ - RCC_INT_MSIRD +*\*\ - RCC_INT_LSERD +*\*\ - RCC_INT_LSIRD +*\*\ - RCC_INT_HSICALE +*\*\ - RCC_INT_MSICALE +*\*\return none +**/ +void RCC_ClrIntPendingBit2(uint32_t interrupt_clear) +{ + /* Software set this bit to clear INT flag. */ + RCC->CLKINT2 |= (((uint32_t)interrupt_clear) >> 1);; +} + +/** +*\*\name RCC_ClrIntPendingBit3. +*\*\fun Clears the RCC's interrupt pending bits. +*\*\param interrupt_clear(interrupt pending bit to clear): +*\*\ - RCC_INT_PLL1LKF +*\*\ - RCC_INT_PLL2LKF +*\*\ - RCC_INT_PLL3LKF +*\*\ - RCC_INT_SHRPLLLKF +*\*\ - RCC_INT_LSIF +*\*\return none +**/ +void RCC_ClrIntPendingBit3(uint32_t interrupt_clear) +{ + /* Software set this bit to clear INT flag. */ + RCC->CLKINT3 |= (((uint32_t)interrupt_clear) >> 1);; +} + +/** +*\*\name RCC_GetFlagStatus. +*\*\fun Checks whether the specified RCC flag is set or not. +*\*\param RCC_flag: +*\*\ - RCC_FLAG_HSIRD HSI clock ready +*\*\ - RCC_FLAG_HSERD HSE clock ready +*\*\ - RCC_FLAG_MSIRD MSI clock ready +*\*\ - RCC_FLAG_AFEHSIRD AFE HSI clock ready +*\*\ - RCC_FLAG_AFEMSIRD AFE MSI clock ready +*\*\ - RCC_FLAG_MSICALE MSI calibration error status flag +*\*\ - RCC_FLAG_HSICALE HSI calibration error status flag +*\*\ - RCC_FLAG_BOR BOR status flag +*\*\ - RCC_FLAG_LSIRD LSI clock ready +*\*\ - RCC_FLAG_LSERD LSE clock ready +*\*\ - RCC_FLAG_LSECSS LSE Clock Safety System flag +*\*\ - RCC_FLAG_LSISECRD Secondary LSI clock ready +*\*\ - RCC_FLAG_RTCHSFSW RTC HSE source fail status +*\*\ - RCC_FLAG_RTCLSFSW RTC LSE source fail status +*\*\ - RCC_FLAG_LSIPF LSI primary failure status +*\*\ - RCC_FLAG_AFELSIRD AFE LSI clock ready +*\*\ - RCC_FLAG_AFELSERD AFE LSE clock ready +*\*\ - RCC_FLAG_PINRST PIN reset flag +*\*\ - RCC_FLAG_PORRST POR/PDR reset flag +*\*\ - RCC_FLAG_CM7SFTRST M7 Software reset flag +*\*\ - RCC_FLAG_CM4SFTRST M4 Software reset flag +*\*\ - RCC_FLAG_IWDG2RST IWDG2 reset flag +*\*\ - RCC_FLAG_IWDG1RST IWDG1 reset flag +*\*\ - RCC_FLAG_WWDG2RST WWDG2 reset flag +*\*\ - RCC_FLAG_WWDG1RST WWDG1 reset flag +*\*\ - RCC_FLAG_MMURST MMU reset flag +*\*\ - RCC_FLAG_BORRST BOR reset flag +*\*\ - RCC_FLAG_BKPEMCRST Backup EMC reset flag +*\*\ - RCC_FLAG_RETEMCRST VDDDRET EMC reset flag +*\*\ - RCC_FLAG_C2LPRST C2 Low-power reset flag +*\*\ - RCC_FLAG_C1LPRST C1 Low-power reset flag +*\*\ - RCC_FLAG_SHRPLLG SHRPLL clock gate flag +*\*\ - RCC_FLAG_PLL3G PLL3 clock gate flag +*\*\ - RCC_FLAG_PLL2G PLL2 clock gate flag +*\*\ - RCC_FLAG_PLL1G PLL1 clock gate flag +*\*\ - RCC_FLAG_SHRPLLF SHRPLL fail state flag +*\*\ - RCC_FLAG_PLL3F PLL3 fail state flag +*\*\ - RCC_FLAG_PLL2F PLL2 fail state flag +*\*\ - RCC_FLAG_PLL1F PLL1 fail state flag +*\*\return FlagStatus: +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus RCC_GetFlagStatus(uint8_t RCC_flag) +{ + uint32_t temp_value; + uint32_t reg_value; + FlagStatus bitstatus; + + /* Get the RCC register index */ + temp_value = (uint32_t)RCC_flag >> RCC_FLAG_OFFSET; + + switch(temp_value) + { + case 1: /* The flag to check is in SRCCTRL1 register */ + reg_value = RCC->SRCCTRL1; + break; + + case 2: /* The flag to check is in SRCCTRL2 register */ + reg_value = RCC->SRCCTRL2; + break; + + case 3:/* The flag to check is in BDCTRL register */ + reg_value = RCC->BDCTRL; + break; + + case 4:/* The flag to check is in CTRLSTS register */ + reg_value = RCC->CTRLSTS; + break; + + default:/* The flag to check is in PLLFD register */ + reg_value = RCC->PLLFD; + break; + } + + /* Get the flag position */ + temp_value = (uint32_t)RCC_flag & RCC_FLAG_MASK; + + if ((reg_value & ((uint32_t)1 << temp_value)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name RCC_ClearResetFlag. +*\*\fun Clears the RCC reset flags. +*\*\param none +*\*\return none +*\*\note Clear the following flags: +*\*\ - RCC_FLAG_PINRST PIN reset flag +*\*\ - RCC_FLAG_PORRST POR/PDR reset flag +*\*\ - RCC_FLAG_CM7SFTRST M7 Software reset flag +*\*\ - RCC_FLAG_CM4SFTRST M4 Software reset flag +*\*\ - RCC_FLAG_IWDG2RST IWDG2 reset flag +*\*\ - RCC_FLAG_IWDG1RST IWDG1 reset flag +*\*\ - RCC_FLAG_WWDG2RST WWDG2 reset flag +*\*\ - RCC_FLAG_WWDG1RST WWDG1 reset flag +*\*\ - RCC_FLAG_MMURST MMU reset flag +*\*\ - RCC_FLAG_BORRST BOR reset flag +*\*\ - RCC_FLAG_BKPEMCRST Backup EMC reset flag +*\*\ - RCC_FLAG_RETEMCRST VDDDRET EMC reset flag +*\*\ - RCC_FLAG_C2LPRST C2 Low-power reset flag +*\*\ - RCC_FLAG_C1LPRST C1 Low-power reset flag +**/ +void RCC_ClearResetFlag(void) +{ + /* Set RMRSTF bit to clear the reset flags */ + RCC->CTRLSTS |= RCC_REMOVE_RESET_FLAG; + /* RMRSTF bit should be reset */ + RCC->CTRLSTS &= ~RCC_REMOVE_RESET_FLAG; +} + +/** + *\*\name RCC_EnableCM4. + *\*\fun Enable CM4 core reset and startup. + *\*\param CM4_BaseAddr: the Vector Table location add offset address of CM4 core; + *\*\return none + */ +void RCC_EnableCM4(uint32_t CM4_BaseAddr) +{ + /*Config CM4 vector address in MMU register*/ + *(uint32_t*)0x511050ac = CM4_BaseAddr; + /*Enable CM7 reset CM4 Reset bit*/ + RCC->M4RSTREL |= RCC_RSTEN_M4REL ; +} + +/** +*\*\name RCC_GetClocksFreq. +*\*\fun Returns the frequencies of different on chip clocks. +*\*\param RCC_Clocks: +*\*\ pointer to a RCC_ClocksTypeDef structure which will hold the clocks frequencies. +*\*\return none +*\*\note The result of this function could be not correct when using +*\*\ fractional value for HSE crystal. +**/ +void RCC_GetClocksFreqValue(RCC_ClocksTypeDef* RCC_Clocks) +{ + uint32_t hsi_value, msi_value; + uint32_t pll_value, temp_value, temp_value1, sysdiv_value, hyper_value; + const uint8_t SysPresTable[16] = {0, 1, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9}; + const uint8_t ApbPresTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + + + + temp_value = RCC->PLL1CTRL1 & RCC_PLL1CTRL1_PLL1SRC; + + if(temp_value == RCC_PLL_SRC_HSE) + { + pll_value = HSE_VALUE; + } + else if(temp_value == RCC_PLL_SRC_MSI) + { + pll_value = MSI_VALUE; + } + else + { + pll_value = HSI_VALUE; + } + + temp_value = (((RCC->PLL1CTRL2 & RCC_PLL1CTRL2_PLL1CLKR) >> 26) + 1); + temp_value1 = (RCC->PLL1CTRL2 & RCC_PLL1CTRL2_PLL1CLKF); + pll_value = (uint32_t)((((uint64_t)pll_value * (uint64_t)temp_value1) >> 14) / temp_value); + + temp_value = (RCC->PLL1DIV & RCC_PLL1DIV_PLL1ADIV); + + if(temp_value > 0) + { + RCC_Clocks->PLL1AClkFreq = pll_value / temp_value; + } + + temp_value = ((RCC->PLL1DIV & RCC_PLL1DIV_PLL1BDIV) >> 8); + + if(temp_value > 0) + { + RCC_Clocks->PLL1BClkFreq = pll_value / temp_value; + } + + temp_value = ((RCC->PLL1DIV & RCC_PLL1DIV_PLL1CDIV) >> 16); + + if(temp_value > 0) + { + RCC_Clocks->PLL1CClkFreq = pll_value / temp_value; + } + + temp_value = RCC->PLL2CTRL1 & RCC_PLL2CTRL1_PLL2SRC; + + if(temp_value == RCC_PLL_SRC_HSE) + { + pll_value = HSE_VALUE; + } + else if(temp_value == RCC_PLL_SRC_MSI) + { + pll_value = MSI_VALUE; + } + else + { + pll_value = HSI_VALUE; + } + + temp_value = (((RCC->PLL2CTRL2 & RCC_PLL2CTRL2_PLL2CLKR) >> 26) + 1); + temp_value1 = (RCC->PLL2CTRL2 & RCC_PLL2CTRL2_PLL2CLKF); + pll_value = (uint32_t)((((uint64_t)pll_value * (uint64_t)temp_value1) >> 14) / temp_value); + + temp_value = (RCC->PLL2DIV & RCC_PLL2DIV_PLL2ADIV); + + if( temp_value > 0) + { + RCC_Clocks->PLL2AClkFreq = pll_value / temp_value; + } + + temp_value = ((RCC->PLL2DIV & RCC_PLL2DIV_PLL2BDIV) >> 8); + + if(temp_value > 0) + { + RCC_Clocks->PLL2BClkFreq = pll_value / temp_value; + } + + temp_value = ((RCC->PLL2DIV & RCC_PLL2DIV_PLL2CDIV) >> 16); + + if(temp_value > 0) + { + RCC_Clocks->PLL2CClkFreq = pll_value / temp_value; + } + + temp_value = RCC->PLL3CTRL1 & RCC_PLL3CTRL1_PLL3SRC; + + if(temp_value == RCC_PLL_SRC_HSE) + { + pll_value = HSE_VALUE; + } + else if(temp_value == RCC_PLL_SRC_MSI) + { + pll_value = MSI_VALUE; + } + else + { + pll_value = HSI_VALUE; + } + + temp_value = (((RCC->PLL3CTRL2 & RCC_PLL3CTRL2_PLL3CLKR) >> 26) + 1); + temp_value1 = (RCC->PLL3CTRL2 & RCC_PLL3CTRL2_PLL3CLKF); + pll_value = (uint32_t)((((uint64_t)pll_value * (uint64_t)temp_value1) >> 14) / temp_value); + + temp_value = (RCC->PLL3DIV & RCC_PLL3DIV_PLL3ADIV); + + if(temp_value > 0) + { + RCC_Clocks->PLL3AClkFreq = pll_value / temp_value; + } + + temp_value = ((RCC->PLL3DIV & RCC_PLL3DIV_PLL3BDIV) >> 8); + + if(temp_value > 0) + { + RCC_Clocks->PLL3BClkFreq = pll_value / temp_value; + } + + temp_value = ((RCC->PLL3DIV & RCC_PLL3DIV_PLL3CDIV) >> 16); + + if(temp_value > 0) + { + RCC_Clocks->PLL3CClkFreq = pll_value / temp_value; + } + + hsi_value = HSI_VALUE >> (SysPresTable[(RCC->SYSBUSDIV1 & RCC_SYSBUSDIV1_HSIDIV) >> 20]); + msi_value = MSI_VALUE >> (SysPresTable[(RCC->SYSBUSDIV1 & RCC_SYSBUSDIV1_MSIDIV) >> 4]); + + temp_value = RCC->SRCCTRL1 & RCC_SRCCTRL1_SCLKSTS; + + if(temp_value == RCC_SYSCLK_STS_HSE) + { + RCC_Clocks->SysClkFreq = HSE_VALUE; + } + else if(temp_value == RCC_SYSCLK_STS_MSI) + { + RCC_Clocks->SysClkFreq = msi_value; + } + else if(temp_value == RCC_SYSCLK_STS_PLL1A) + { + RCC_Clocks->SysClkFreq = RCC_Clocks->PLL1AClkFreq; + } + else + { + RCC_Clocks->SysClkFreq = hsi_value; + } + + sysdiv_value = RCC_Clocks->SysClkFreq >> (SysPresTable[RCC->SYSBUSDIV1 & RCC_SYSBUSDIV1_SCLKDIV]); + hyper_value = RCC_Clocks->PLL2AClkFreq >> (SysPresTable[(RCC->SYSBUSDIV1 & RCC_SYSBUSDIV1_M7HYPDIV) >> 16]); + + RCC_Clocks->SysBusDivClkFreq = sysdiv_value >> (SysPresTable[(RCC->SYSBUSDIV1 & RCC_SYSBUSDIV1_BUSDIV) >> 8]); + RCC_Clocks->M4ClkFreq = RCC_Clocks->SysBusDivClkFreq; + + if((RCC->SRCCTRL2 & RCC_SRCCTRL2_M7HYPSEL) == RCC_M7HYPERCLK_SRC_PLL2A) + { + RCC_Clocks->M7ClkFreq = hyper_value; + } + else + { + RCC_Clocks->M7ClkFreq = sysdiv_value; + } + + if((RCC->SRCCTRL2 & RCC_SRCCTRL2_AXIHYPSEL) == RCC_AXIHYPERCLK_SRC_PLL2A) + { + RCC_Clocks->AXIClkFreq = hyper_value >> (SysPresTable[(RCC->SYSBUSDIV1 & RCC_SYSBUSDIV1_AXIHYPDIV) >> 24]); + } + else + { + RCC_Clocks->AXIClkFreq = sysdiv_value >> (SysPresTable[(RCC->SYSBUSDIV1 & RCC_SYSBUSDIV1_AXIDIV) >> 12]); + } + + RCC_Clocks->AHB1ClkFreq = RCC_Clocks->SysBusDivClkFreq; + RCC_Clocks->AHB2ClkFreq = RCC_Clocks->SysBusDivClkFreq; + RCC_Clocks->AHB5ClkFreq = RCC_Clocks->SysBusDivClkFreq; + RCC_Clocks->AHB6ClkFreq = RCC_Clocks->AXIClkFreq; + RCC_Clocks->AHB9ClkFreq = RCC_Clocks->SysBusDivClkFreq; + + RCC_Clocks->APB1ClkFreq = RCC_Clocks->AHB1ClkFreq >> (ApbPresTable[RCC->SYSBUSDIV2 & RCC_SYSBUSDIV2_APB1DIV]); + RCC_Clocks->APB2ClkFreq = RCC_Clocks->AHB2ClkFreq >> (ApbPresTable[(RCC->SYSBUSDIV2 & RCC_SYSBUSDIV2_APB2DIV) >> 8]); + RCC_Clocks->APB5ClkFreq = RCC_Clocks->AHB5ClkFreq >> (ApbPresTable[(RCC->SYSBUSDIV2 & RCC_SYSBUSDIV2_APB5DIV) >> 16]); + RCC_Clocks->APB6ClkFreq = RCC_Clocks->AHB6ClkFreq >> (ApbPresTable[(RCC->SYSBUSDIV2 & RCC_SYSBUSDIV2_APB6DIV) >> 24]); + + temp_value = RCC->CFG3 & RCC_CFG3_PERSW; + + if(temp_value == RCC_PERIPHCLK_SRC_HSE) + { + RCC_Clocks->PeriphClkFreq = HSE_VALUE; + } + else if(temp_value == RCC_PERIPHCLK_SRC_MSI) + { + RCC_Clocks->PeriphClkFreq = msi_value; + } + else + { + RCC_Clocks->PeriphClkFreq = hsi_value; + } + +} + +/** +*\*\name RCC_SetSysClkToMode0. +*\*\fun Configure the M7 clock is 600MHz, +*\*\ M4, AXI, AHB(1,2,5,6,9) clock is 300MHz, +*\*\ APB(1,2,5,6) clock is 150MHz. +*\*\param none +*\*\return none +*\*\note M7 from PLL1A, AXI from PLL1A, M4 from PLL1A. +**/ +void RCC_SetSysClkToMode0(void) +{ + uint32_t temp_value1, temp_value2; + + /* Configure sys_div_clk is sys_clk(PLL1A) = 600M = M7 clock*/ + RCC_ConfigSysclkDivider(RCC_SYSCLK_DIV1); + /* Configure sys_bus_div_clk is sys_div_clk/2 = 300M = M4 clock = AHB1\2\5\9*/ + RCC_ConfigSysbusDivider(RCC_BUSCLK_DIV2); + /* Configure AXI clock is sys_div_clk/2 = 300M = AHB6*/ + RCC_ConfigAXIclkDivider(RCC_AXICLK_DIV2); + RCC_ConfigAXIHyperDivider(RCC_AXICLK_HYP_DIV2); + + __RCC_DELAY_US(1); + /* Configure APB1 clock is AHB1/2 = 150M */ + /* Configure APB2 clock is AHB2/2 = 150M */ + /* Configure APB5 clock is AHB5/2 = 150M */ + /* Configure APB6 clock is AHB6/2 = 150M */ + RCC_ConfigAPBclkDivider(RCC_APB1CLK_DIV2, RCC_APB2CLK_DIV2, RCC_APB5CLK_DIV2, RCC_APB6CLK_DIV2); + + /* configure PLL1 source is HSI, frequency is 600M */ + //RCC_ConfigPll1(RCC_PLL_SRC_HSI,64000000,600000000,ENABLE); + /* get the register value */ + temp_value1 = RCC->PLL1CTRL1; + temp_value2 = RCC->PLL1CTRL2; + + /* Clear BWAJ[11:0] bits */ + temp_value1 &= RCC_PLL_BWAJ_MASK; + /* Clear CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 &= RCC_PLL_CLKR_CLKF_MASK; + + /* Set BWAJ[11:0] bits - 600M */ + temp_value1 |= 0x3U; + /* Set CLKF[25:0] and CLKR[5:0] bits */ + temp_value2 |= 0x25800U; + + /* Store the new value */ + RCC->PLL1CTRL1 = temp_value1; + RCC->PLL1CTRL2 = temp_value2; + + /* Enable PLL module power */ + RCC->PLL1CTRL1 |= RCC_PLL_LDO_ENABLE; + __RCC_DELAY_US(10); + + /* Enable power to analog circuitry in PLL */ + RCC->PLL1CTRL1 &= (~RCC_PLL_POWER_DOWN); + + /* Select Clock Source */ + temp_value1 = RCC->PLL1CTRL1; + temp_value1 &= RCC_PLL_SRC_MASK; + temp_value1 |= RCC_PLL_SRC_HSI; + RCC->PLL1CTRL1 = temp_value1; + __RCC_DELAY_US(10); + + /* Clear PLL reset */ + RCC->PLL1CTRL1 &= (~RCC_PLL_RESET_ENABLE); + + while((RCC->PLL1CTRL1 & RCC_PLL_LOCK_FLAG) != RCC_PLL_LOCK_FLAG) + {} + + /* Enable PLL */ + RCC->PLL1CTRL1 |= RCC_PLL_ENABLE; + /* configure PLL1 source is HSI, frequency is 600M end*/ + + __RCC_DELAY_US(1); + + /* configure PLL1A is 600M */ + RCC_ConfigPLL1ADivider(RCC_PLLA_DIV1);//600M + + /* configure sys_clk source is PLL1A */ + RCC_ConfigSysclk(RCC_SYSCLK_SRC_PLL1A); + + /* Check if sys_clk source is PLL1A */ + while(RCC_GetSysclkSrc() != RCC_SYSCLK_STS_PLL1A) + {} + +} + +/** +*\*\name RCC_SetSysClkToMode1. +*\*\fun Configure the M7 clock is 600MHz, +*\*\ M4, AXI, AHB(1,2,5,6,9) clock is 300MHz, +*\*\ APB(1,2,5,6) clock is 150MHz. +*\*\param none +*\*\return none +*\*\note M7 from PLL2A, AXI from PLL2A, M4 from PLL1A. +**/ +void RCC_SetSysClkToMode1(void) +{ + /* Configure sys_div_clk is sys_clk(PLL1A) = 600M = M7 clock*/ + RCC_ConfigSysclkDivider(RCC_SYSCLK_DIV1); + /* Configure sys_bus_div_clk is sys_div_clk/2 = 300M = M4 clock = AHB1\2\5\9*/ + RCC_ConfigSysbusDivider(RCC_BUSCLK_DIV2); + RCC_ConfigAXIclkDivider(RCC_AXICLK_DIV2); + + /* Configure m7_hyp_div_clk is PLL2A = 600M*/ + RCC_ConfigM7HyperDivider(RCC_M7CLK_HYP_DIV1); + /* Configure AXI clock is m7_hyp_div_clk/2 = 300M = AHB6*/ + RCC_ConfigAXIHyperDivider(RCC_AXICLK_HYP_DIV2); + + __RCC_DELAY_US(1); + /* Configure APB1 clock is AHB1/2 = 150M */ + /* Configure APB2 clock is AHB2/2 = 150M */ + /* Configure APB5 clock is AHB5/2 = 150M */ + /* Configure APB6 clock is AHB6/2 = 150M */ + RCC_ConfigAPBclkDivider(RCC_APB1CLK_DIV2, RCC_APB2CLK_DIV2, RCC_APB5CLK_DIV2, RCC_APB6CLK_DIV2); + + /* configure PLL1 source is HSI, frequency is 600M */ + RCC_ConfigPll1(RCC_PLL_SRC_HSI, 64000000, 600000000, ENABLE); + __RCC_DELAY_US(1); + + /* configure PLL1A is 600M */ + RCC_ConfigPLL1ADivider(RCC_PLLA_DIV1); + + /* configure sys_clk source is PLL1A */ + RCC_ConfigSysclk(RCC_SYSCLK_SRC_PLL1A); + + /* Check if sys_clk source is PLL1A */ + while(RCC_GetSysclkSrc() != RCC_SYSCLK_STS_PLL1A) + {} + + /* configure PLL2 source is HSI, frequency is 600M */ + RCC_ConfigPll2(RCC_PLL_SRC_HSI, 64000000, 600000000, ENABLE); + __RCC_DELAY_US(1); + + /* configure PLL2A is 600M */ + RCC_ConfigPLL2ADivider(RCC_PLLA_DIV1); + /* configure AXI clock source is PLL2A */ + RCC_ConfigAXIClk(RCC_AXIHYPERCLK_SRC_PLL2A); + /* configure M7 clock source is PLL2A */ + RCC_ConfigM7Clk(RCC_M7HYPERCLK_SRC_PLL2A); + +} + +/** +*\*\name RCC_SetSysClkToMode2. +*\*\fun Configure the M7 clock is 600MHz, +*\*\ M4, AXI, AHB(1,2,5,6,9) clock is 300MHz, +*\*\ APB(1,2,5,6) clock is 150MHz. +*\*\param none +*\*\return none +*\*\note M7 from PLL2A, AXI from PLL1A, M4 from PLL1A. +**/ +void RCC_SetSysClkToMode2(void) +{ + /* Configure sys_div_clk is sys_clk(PLL1A) = 600M = M7 clock*/ + RCC_ConfigSysclkDivider(RCC_SYSCLK_DIV1); + /* Configure sys_bus_div_clk is sys_div_clk/2 = 300M = M4 clock = AHB1\2\5\9*/ + RCC_ConfigSysbusDivider(RCC_BUSCLK_DIV2); + /* Configure AXI clock is sys_div_clk/2 = 300M = AHB6*/ + RCC_ConfigAXIclkDivider(RCC_AXICLK_DIV2); + RCC_ConfigAXIHyperDivider(RCC_AXICLK_HYP_DIV2); + /* Configure m7_hyp_div_clk is PLL2A = 600M*/ + RCC_ConfigM7HyperDivider(RCC_M7CLK_HYP_DIV1); + + __RCC_DELAY_US(1); + /* Configure APB1 clock is AHB1/2 = 150M */ + /* Configure APB2 clock is AHB2/2 = 150M */ + /* Configure APB5 clock is AHB5/2 = 150M */ + /* Configure APB6 clock is AHB6/2 = 150M */ + RCC_ConfigAPBclkDivider(RCC_APB1CLK_DIV2, RCC_APB2CLK_DIV2, RCC_APB5CLK_DIV2, RCC_APB6CLK_DIV2); + + /* configure PLL1 source is HSI, frequency is 600M */ + RCC_ConfigPll1(RCC_PLL_SRC_HSI, 64000000, 600000000, ENABLE); + __RCC_DELAY_US(1); + + /* configure PLL1A is 600M */ + RCC_ConfigPLL1ADivider(RCC_PLLA_DIV1); + + /* configure sys_clk source is PLL1A */ + RCC_ConfigSysclk(RCC_SYSCLK_SRC_PLL1A); + + /* Check if sys_clk source is PLL1A */ + while(RCC_GetSysclkSrc() != RCC_SYSCLK_STS_PLL1A) + {} + + /* configure PLL2 source is HSI, frequency is 600M */ + RCC_ConfigPll2(RCC_PLL_SRC_HSI, 64000000, 600000000, ENABLE); + __RCC_DELAY_US(1); + + /* configure PLL2A is 600M */ + RCC_ConfigPLL2ADivider(RCC_PLLA_DIV1); + /* configure M7 clock source is PLL2A */ + RCC_ConfigM7Clk(RCC_M7HYPERCLK_SRC_PLL2A); + +} + +/** +*\*\name RCC_SetHsiCalibValue. +*\*\fun Adjusts the HSI calibration value. +*\*\param calibration_value(the calibration trimming value): +*\*\ This parameter must be a number between 0 and 0x1FF +*\*\return none +**/ +void RCC_SetHsiCalibValue(uint16_t calibration_value) +{ + uint32_t temp_value; + + temp_value = RCC->SRCCTRL3; + /* Clear HSITRIM[8:0] bits */ + temp_value &= RCC_HSITRIM_MASK; + /* Set the HSITRIM[8:0] bits according to calibration_value value */ + temp_value |= ((uint32_t)calibration_value & 0x1FFU); + /* Store the new value */ + RCC->SRCCTRL3 = temp_value; +} + + +/** +*\*\name RCC_SetMsiCalibValue. +*\*\fun Adjusts the MSI calibration value. +*\*\param calibration_value(the calibration trimming value): +*\*\ This parameter must be a number between 0 and 0x1F +*\*\return none +**/ +void RCC_SetMsiCalibValue(uint16_t calibration_value) +{ + uint32_t temp_value; + + temp_value = RCC->SRCCTRL2; + /* Clear MSITRIM[8:0] bits */ + temp_value &= RCC_MSITRIM_MASK; + /* Set the MSITRIM[8:0] bits according to calibration_value value */ + temp_value |= ((uint32_t)calibration_value & 0x1FU); + /* Store the new value */ + RCC->SRCCTRL2 = temp_value; +} + +/** +*\*\name RCC_EnableHSEClockSecuritySystem. +*\*\fun Enables the HSE Clock Security System. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableHSEClockSecuritySystem(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->SRCCTRL1 |= RCC_HSECSS_ENABLE; + } + else + { + RCC->SRCCTRL1 &= (~RCC_HSECSS_ENABLE); + } +} + +/** +*\*\name RCC_SelectLSISourceControl. +*\*\fun Selection of LSI clock source control. +*\*\param CLK_source: +*\*\ - RCC_LSI_SRCCTRL_BY_HARDWARE +*\*\ - RCC_LSI_SRCCTRL_BY_SOFTWARE +*\*\return none. +*\*\note If RCC_LSI_SRCCTRL_BY_SOFTWARE is selected, the clock source is switched by enabling the LSICSSEN. +*\*\note BDCTRL is protected, you need to enable the PWR clock first, +*\*\ then configure PWR_SYSCTRL1.DBKP to 1 to change it. +**/ +void RCC_SelectLSISourceControl(uint32_t CLK_source) +{ + if (CLK_source == RCC_LSI_SRCCTRL_BY_SOFTWARE) + { + RCC->BDCTRL |= CLK_source; + } + else + { + RCC->BDCTRL &= CLK_source; + } +} + +/** +*\*\name RCC_EnableLSIClockSecuritySystem. +*\*\fun Enables the LSI Clock Security System. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +*\*\note BDCTRL is protected, you need to enable the PWR clock first, +*\*\ then configure PWR_SYSCTRL1.DBKP to 1 to change it. +**/ +void RCC_EnableLSIClockSecuritySystem(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->BDCTRL |= RCC_LSICSS_ENABLE; + } + else + { + RCC->BDCTRL &= (~RCC_LSICSS_ENABLE); + } +} + +/** +*\*\name RCC_EnableLSIClockSecuritySystem. +*\*\fun Set by software to acknowledge the failure of LSI. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +*\*\note BDCTRL is protected, you need to enable the PWR clock first, +*\*\ then configure PWR_SYSCTRL1.DBKP to 1 to change it. +**/ +void RCC_EnableLSIFailAcknowledge(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->BDCTRL |= RCC_LSI_FAILACK_ENABLE; + } + else + { + RCC->BDCTRL &= (~RCC_LSI_FAILACK_ENABLE); + } +} + +/** +*\*\name RCC_EnableLSECalibrationCount. +*\*\fun LSE calibration count enable. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableLSECalibrationCount(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->LSEOS |= RCC_LSE_CALCNT_ENABLE; + } + else + { + RCC->LSEOS &= (~RCC_LSE_CALCNT_ENABLE); + } +} + +/** +*\*\name RCC_GetLSECalibrationCount +*\*\fun Get number of LSI clock counts in half cycle of LSE/128 clock. +*\*\param none +*\*\return Calibration Count +**/ +uint8_t RCC_GetLSECalibrationCount(void) +{ + return (uint8_t)((RCC->LSEOS & RCC_LSE_CALCNT_MASK) >> 16); +} + +/** +*\*\name RCC_GetLSECSSFlag +*\*\fun Checks whether the specified LSE CSS flag is set or not. +*\*\param RCC_flag (The input parameters must be the following values): +*\*\ -RCC_FLAG_LSECSS_CALCNTRD +*\*\ -RCC_FLAG_LSECSS_OFFSET +*\*\return FlagStatus +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus RCC_GetLSECSSFlag(uint32_t RCC_flag) +{ + FlagStatus bitstatus; + + if ((RCC->LSEOS & RCC_flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name RCC_EnableLSEOffsetDetection. +*\*\fun Enable frequency offset detection in LSE clock. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableLSEOffsetDetection(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->LSEOS |= RCC_LSE_OFFSET_ENABLE; + } + else + { + RCC->LSEOS &= (~RCC_LSE_OFFSET_ENABLE); + } +} + +/** +*\*\name RCC_SetLSEOffsetThreshold. +*\*\fun Threshold value for detection of frequency offset greater than 10% in LSE clock. +*\*\param threshold_value: +*\*\ This parameter must be a number between 0 and 0xFF +*\*\return none +**/ +void RCC_SetLSEOffsetThreshold(uint8_t threshold_value) +{ + uint32_t temp_value; + + temp_value = RCC->LSEOS; + /* Clear LSEOSTHR[7:0] bits */ + temp_value &= RCC_LSEOSTHR_MASK; + /* Set the LSEOSTHR[7:0] bits according to threshold_value */ + temp_value |= (uint32_t)threshold_value; + /* Store the new value */ + RCC->LSEOS = temp_value; +} + +/** +*\*\name RCC_EnableHSECalibrationCount. +*\*\fun HSE calibration count enable. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableHSECalibrationCount(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->HSECAL |= RCC_HSE_CALCNT_ENABLE; + } + else + { + RCC->HSECAL &= (~RCC_HSE_CALCNT_ENABLE); + } +} + +/** +*\*\name RCC_GetHSECalibrationCount +*\*\fun Get number of HSI clock counts in half cycle of HSE/128 clock. +*\*\param none +*\*\return Calibration Count +**/ +uint16_t RCC_GetHSECalibrationCount(void) +{ + return (uint16_t)(RCC->HSECAL & RCC_HSE_CALCNT_MASK); +} + +/** +*\*\name RCC_GetHSECSSFlag +*\*\fun Checks whether the specified HSE CSS flag is set or not. +*\*\param RCC_flag (The input parameters must be the following values): +*\*\ -RCC_FLAG_HSECSS_CALCNTRD +*\*\ -RCC_FLAG_HSECSS_OFFSET +*\*\ -RCC_FLAG_HSECSS_MAXPD +*\*\ -RCC_FLAG_HSECSS_MINND +*\*\return FlagStatus +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus RCC_GetHSECSSFlag(uint32_t RCC_flag) +{ + FlagStatus bitstatus; + uint32_t reg_value; + + if(RCC_flag == RCC_FLAG_HSECSS_CALCNTRD) + { + reg_value = RCC->HSECAL; + } + else + { + reg_value = RCC->HSEOS; + } + + if ((reg_value & RCC_flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name RCC_EnableHSECSSCheck. +*\*\fun Enable different HSE CSS detection type . +*\*\param Chk_type : +*\*\ - RCC_HSECSS_OFFSET enable frequency offset detection +*\*\ - RCC_HSECSS_MAXPD enable detection of positive deviation +*\*\ - RCC_HSECSS_MINND enable detection of negative deviation +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableHSECSSCheck(uint32_t Chk_type, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->HSEOS |= Chk_type; + } + else + { + RCC->HSEOS &= ~Chk_type; + } + +} + +/** +*\*\name RCC_SetHSEOffsetThreshold. +*\*\fun Threshold value for detection of frequency offset greater than 5% in HSE clock. +*\*\param threshold_value: +*\*\ This parameter must be a number between 0 and 0xFF +*\*\return none +**/ +void RCC_SetHSEOffsetThreshold(uint8_t threshold_value) +{ + uint32_t temp_value; + + temp_value = RCC->HSEOS; + /* Clear HSEOSTHR[7:0] bits */ + temp_value &= RCC_HSEOSTHR_MASK; + /* Set the HSEOSTHR[7:0] bits according to threshold_value */ + temp_value |= ((uint32_t)threshold_value << 8); + /* Store the new value */ + RCC->HSEOS = temp_value; +} + +/** +*\*\name RCC_SetHSEPositiveDeviationMAXThreshold. +*\*\fun Threshold value for detection of positive deviation in HSE clock at maximum frequency. +*\*\param threshold_value: +*\*\ This parameter must be a number between 0 and 0xFF +*\*\return none +**/ +void RCC_SetHSEPositiveDeviationMAXThreshold(uint8_t threshold_value) +{ + uint32_t temp_value; + + temp_value = RCC->HSEOS; + /* Clear HSEMAXPDTHR[7:0] bits */ + temp_value &= RCC_HSEMAXPDTHR_MASK; + /* Set the HSEMAXPDTHR[7:0] bits according to threshold_value */ + temp_value |= ((uint32_t)threshold_value << 24); + /* Store the new value */ + RCC->HSEOS = temp_value; +} + +/** +*\*\name RCC_SetHSENegativeDeviationMINThreshold. +*\*\fun Threshold value for detection of negative deviation in HSE clock at minimum frequency. +*\*\param threshold_value: +*\*\ This parameter must be a number between 0 and 0xFF +*\*\return none +**/ +void RCC_SetHSENegativeDeviationMINThreshold(uint8_t threshold_value) +{ + uint32_t temp_value; + + temp_value = RCC->HSEOS; + /* Clear HSEMINNDTHR[7:0] bits */ + temp_value &= RCC_HSEMINNDTHR_MASK; + /* Set the HSEMINNDTHR[7:0] bits according to threshold_value */ + temp_value |= ((uint32_t)threshold_value << 16); + /* Store the new value */ + RCC->HSEOS = temp_value; +} + + +/** +*\*\name RCC_SetLSICSSDelayValue. +*\*\fun This delay represents the estimated time required for the primary +*\*\ LSI clock to be stable during chip power up. +*\*\param delay_value: +*\*\ This parameter must be a number between 0 and 0xFFFFFFFF +*\*\return none +**/ +void RCC_SetLSICSSDelayValue(uint32_t delay_value) +{ + /* Store the new value */ + RCC->LSICSSDL = delay_value; +} + +/** +*\*\name RCC_SetLSEReadyDelayValue. +*\*\fun Config counter delay of LSE clock ready signal. +*\*\param delay_value: +*\*\ This parameter must be a number between 0 and 0xFFFFFFFF +*\*\return none +**/ +void RCC_SetLSEReadyDelayValue(uint32_t delay_value) +{ + /* Store the new value */ + RCC->LSERDDL = delay_value; +} + +/** +*\*\name RCC_SetMSIReadyDelayValue. +*\*\fun Config counter delay of MSI clock ready signal. +*\*\param delay_value: +*\*\ This parameter must be a number between 0 and 0xFFFFFFFF +*\*\return none +**/ +void RCC_SetMSIReadyDelayValue(uint32_t delay_value) +{ + /* Store the new value */ + RCC->MSIRDDL = delay_value; +} + +/** +*\*\name RCC_SetHSEReadyDelayValue. +*\*\fun Config counter delay of HSE clock ready signal. +*\*\param delay_value: +*\*\ This parameter must be a number between 0 and 0xFFFFFFFF +*\*\return none +**/ +void RCC_SetHSEReadyDelayValue(uint32_t delay_value) +{ + /* Store the new value */ + RCC->HSERDDL = delay_value; +} + + +/** +*\*\name RCC_EnablePLLFailDetection. +*\*\fun Enable different pll fail detection. +*\*\param Chk_type : +*\*\ - RCC_FAIL_DETECT_EN_SHRPLL +*\*\ - RCC_FAIL_DETECT_EN_PLL3 +*\*\ - RCC_FAIL_DETECT_EN_PLL2 +*\*\ - RCC_FAIL_DETECT_EN_PLL1 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnablePLLFailDetection(uint32_t Chk_type, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->PLLFD |= Chk_type; + } + else + { + RCC->PLLFD &= ~Chk_type; + } + +} + + +/** +*\*\name RCC_EnableLPTIM1Filter. +*\*\fun Control signal to select filtered or non-filtered LPTIM1 comparator clock source. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableLPTIM1Filter(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDCTRL1 |= RCC_LPTIM1FILT_ENABLE; + } + else + { + RCC->RDCTRL1 &= (~RCC_LPTIM1FILT_ENABLE); + } +} + +/** +*\*\name RCC_SelectLPTIM1FilterSource. +*\*\fun Control signal to select the sample clock for the digital filter used at LPTIM1. +*\*\param CLK_source: +*\*\ - RCC_LPTIM1_FILTCLK_SRC_APB5 +*\*\ - RCC_LPTIM1_FILTCLK_SRC_MSI +*\*\return none. +**/ +void RCC_SelectLPTIM1FilterSource(uint32_t CLK_source) +{ + if (CLK_source == RCC_LPTIM1_FILTCLK_SRC_MSI) + { + RCC->RDCTRL1 |= CLK_source; + } + else + { + RCC->RDCTRL1 &= CLK_source; + } +} + +/** +*\*\name RCC_ConfigLPTIM1FilterWidth. +*\*\fun Config LPTIM1 counter value indicating minimum pulse width in terms of APB5 or MSI clock cycles. +*\*\param width_value : +*\*\ - 0x00 Disable the digital filter. +*\*\ - 0x01 ~ 0x1F The numbers of APB5 or MSI cycles. +*\*\return none +**/ +void RCC_ConfigLPTIM1FilterWidth(uint8_t width_value) +{ + uint32_t temp_value; + + temp_value = RCC->RDCTRL1; + /* Clear LPTIM1FLTDFC[4:0] bits */ + temp_value &= I2C_LPTIM1FLTDFC_MASK; + /* Set LPTIM1FLTDFC[4:0] bits according to width value */ + temp_value |= ((uint32_t)width_value & 0x1FU); + /* Store the new value */ + RCC->RDCTRL1 = temp_value; +} + +/** +*\*\name RCC_EnableLPTIM2Filter. +*\*\fun Control signal to select filtered or non-filtered LPTIM2 comparator clock source. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableLPTIM2Filter(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDCTRL1 |= RCC_LPTIM2FILT_ENABLE; + } + else + { + RCC->RDCTRL1 &= (~RCC_LPTIM2FILT_ENABLE); + } +} + +/** +*\*\name RCC_SelectLPTIM2FilterSource. +*\*\fun Control signal to select the sample clock for the digital filter used at LPTIM2. +*\*\param CLK_source: +*\*\ - RCC_LPTIM2_FILTCLK_SRC_APB5 +*\*\ - RCC_LPTIM2_FILTCLK_SRC_MSI +*\*\return none. +**/ +void RCC_SelectLPTIM2FilterSource(uint32_t CLK_source) +{ + if (CLK_source == RCC_LPTIM2_FILTCLK_SRC_MSI) + { + RCC->RDCTRL1 |= CLK_source; + } + else + { + RCC->RDCTRL1 &= CLK_source; + } +} + +/** +*\*\name RCC_ConfigLPTIM2FilterWidth. +*\*\fun Config LPTIM2 counter value indicating minimum pulse width in terms of APB5 or MSI clock cycles. +*\*\param width_value : +*\*\ - 0x00 Disable the digital filter. +*\*\ - 0x01 ~ 0x1F The numbers of APB5 or MSI cycles. +*\*\return none +**/ +void RCC_ConfigLPTIM2FilterWidth(uint8_t width_value) +{ + uint32_t temp_value; + + temp_value = RCC->RDCTRL1; + /* Clear LPTIM2FLTDFC[4:0] bits */ + temp_value &= I2C_LPTIM2FLTDFC_MASK; + /* Set LPTIM2FLTDFC[4:0] bits according to width value */ + temp_value |= (((uint32_t)width_value & 0x1FU) << 16); + /* Store the new value */ + RCC->RDCTRL1 = temp_value; +} + +/** +*\*\name RCC_EnableLPTIM3Filter. +*\*\fun Control signal to select filtered or non-filtered LPTIM3 comparator clock source. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableLPTIM3Filter(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDCTRL2 |= RCC_LPTIM3FILT_ENABLE; + } + else + { + RCC->RDCTRL2 &= (~RCC_LPTIM3FILT_ENABLE); + } +} + +/** +*\*\name RCC_SelectLPTIM3FilterSource. +*\*\fun Control signal to select the sample clock for the digital filter used at LPTIM3. +*\*\param CLK_source: +*\*\ - RCC_LPTIM3_FILTCLK_SRC_APB5 +*\*\ - RCC_LPTIM3_FILTCLK_SRC_MSI +*\*\return none. +**/ +void RCC_SelectLPTIM3FilterSource(uint32_t CLK_source) +{ + if (CLK_source == RCC_LPTIM3_FILTCLK_SRC_MSI) + { + RCC->RDCTRL2 |= CLK_source; + } + else + { + RCC->RDCTRL2 &= CLK_source; + } +} + +/** +*\*\name RCC_ConfigLPTIM3FilterWidth. +*\*\fun Config LPTIM3 counter value indicating minimum pulse width in terms of APB5 or MSI clock cycles. +*\*\param width_value : +*\*\ - 0x00 Disable the digital filter. +*\*\ - 0x01 ~ 0x1F The numbers of APB5 or MSI cycles. +*\*\return none +**/ +void RCC_ConfigLPTIM3FilterWidth(uint8_t width_value) +{ + uint32_t temp_value; + + temp_value = RCC->RDCTRL2; + /* Clear LPTIM3FLTDFC[4:0] bits */ + temp_value &= I2C_LPTIM3FLTDFC_MASK; + /* Set LPTIM3FLTDFC[4:0] bits according to width value */ + temp_value |= ((uint32_t)width_value & 0x1FU); + /* Store the new value */ + RCC->RDCTRL2 = temp_value; +} + +/** +*\*\name RCC_EnableLPTIM4Filter. +*\*\fun Control signal to select filtered or non-filtered LPTIM4 comparator clock source. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableLPTIM4Filter(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDCTRL2 |= RCC_LPTIM4FILT_ENABLE; + } + else + { + RCC->RDCTRL2 &= (~RCC_LPTIM4FILT_ENABLE); + } +} + +/** +*\*\name RCC_SelectLPTIM4FilterSource. +*\*\fun Control signal to select the sample clock for the digital filter used at LPTIM4. +*\*\param CLK_source: +*\*\ - RCC_LPTIM4_FILTCLK_SRC_APB5 +*\*\ - RCC_LPTIM4_FILTCLK_SRC_MSI +*\*\return none. +**/ +void RCC_SelectLPTIM4FilterSource(uint32_t CLK_source) +{ + if (CLK_source == RCC_LPTIM4_FILTCLK_SRC_MSI) + { + RCC->RDCTRL2 |= CLK_source; + } + else + { + RCC->RDCTRL2 &= CLK_source; + } +} + +/** +*\*\name RCC_ConfigLPTIM4FilterWidth. +*\*\fun Config LPTIM4 counter value indicating minimum pulse width in terms of APB5 or MSI clock cycles. +*\*\param width_value : +*\*\ - 0x00 Disable the digital filter. +*\*\ - 0x01 ~ 0x1F The numbers of APB5 or MSI cycles. +*\*\return none +**/ +void RCC_ConfigLPTIM4FilterWidth(uint8_t width_value) +{ + uint32_t temp_value; + + temp_value = RCC->RDCTRL2; + /* Clear LPTIM4FLTDFC[4:0] bits */ + temp_value &= I2C_LPTIM4FLTDFC_MASK; + /* Set LPTIM4FLTDFC[4:0] bits according to width value */ + temp_value |= (((uint32_t)width_value & 0x1FU) << 16); + /* Store the new value */ + RCC->RDCTRL2 = temp_value; +} + +/** +*\*\name RCC_EnableLPTIM5Filter. +*\*\fun Control signal to select filtered or non-filtered LPTIM5 comparator clock source. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableLPTIM5Filter(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->RDCTRL3 |= RCC_LPTIM5FILT_ENABLE; + } + else + { + RCC->RDCTRL3 &= (~RCC_LPTIM5FILT_ENABLE); + } +} + +/** +*\*\name RCC_SelectLPTIM5FilterSource. +*\*\fun Control signal to select the sample clock for the digital filter used at LPTIM5. +*\*\param CLK_source: +*\*\ - RCC_LPTIM5_FILTCLK_SRC_APB5 +*\*\ - RCC_LPTIM5_FILTCLK_SRC_MSI +*\*\return none. +**/ +void RCC_SelectLPTIM5FilterSource(uint32_t CLK_source) +{ + if (CLK_source == RCC_LPTIM5_FILTCLK_SRC_MSI) + { + RCC->RDCTRL3 |= CLK_source; + } + else + { + RCC->RDCTRL3 &= CLK_source; + } +} + +/** +*\*\name RCC_ConfigLPTIM5FilterWidth. +*\*\fun Config LPTIM5 counter value indicating minimum pulse width in terms of APB5 or MSI clock cycles. +*\*\param width_value : +*\*\ - 0x00 Disable the digital filter. +*\*\ - 0x01 ~ 0x1F The numbers of APB5 or MSI cycles. +*\*\return none +**/ +void RCC_ConfigLPTIM5FilterWidth(uint8_t width_value) +{ + uint32_t temp_value; + + temp_value = RCC->RDCTRL3; + /* Clear LPTIM5FLTDFC[4:0] bits */ + temp_value &= I2C_LPTIM5FLTDFC_MASK; + /* Set LPTIM5FLTDFC[4:0] bits according to width value */ + temp_value |= ((uint32_t)width_value & 0x1FU); + /* Store the new value */ + RCC->RDCTRL3 = temp_value; +} + +/** +*\*\name RCC_SetWWDG1ResetDelayValue. +*\*\fun Counter threshold used to delay the assertion of WWDG1 reset when WWDG1 reset request event occurs. +*\*\param delay_value: +*\*\ This parameter must be a number between 0 and 0xF +*\*\return none +**/ +void RCC_SetWWDG1ResetDelayValue(uint8_t delay_value) +{ + uint32_t temp_value; + + temp_value = RCC->CFG1; + /* Clear WWDG1RSTDLCNT[3:0] bits */ + temp_value &= RCC_WWDG1RSTDLCNT_MASK; + /* Set the WWDG1RSTDLCNT[3:0] bits according to delay_value */ + temp_value |= (((uint32_t)delay_value & 0xFU) << 16); + /* Store the new value */ + RCC->CFG1 = temp_value; +} + +/** +*\*\name RCC_SetWWDG2ResetDelayValue. +*\*\fun Counter threshold used to delay the assertion of WWDG2 reset when WWDG2 reset request event occurs. +*\*\param delay_value: +*\*\ This parameter must be a number between 0 and 0xF +*\*\return none +**/ +void RCC_SetWWDG2ResetDelayValue(uint8_t delay_value) +{ + uint32_t temp_value; + + temp_value = RCC->CFG1; + /* Clear WWDG2RSTDLCNT[3:0] bits */ + temp_value &= RCC_WWDG2RSTDLCNT_MASK; + /* Set the WWDG2RSTDLCNT[3:0] bits according to delay_value */ + temp_value |= (((uint32_t)delay_value & 0xFU) << 20); + /* Store the new value */ + RCC->CFG1 = temp_value; +} + +/** +*\*\name RCC_ConfigM7TraceClkDivider . +*\*\fun Configure M7 trace clock prescalar values. +*\*\param CLK_divider +*\*\ - RCC_TRACECLK_DIV1 +*\*\ - RCC_TRACECLK_DIV2 +*\*\ - RCC_TRACECLK_DIV4 +*\*\ - RCC_TRACECLK_DIV8 +*\*\ - RCC_TRACECLK_DIV16 +*\*\ - RCC_TRACECLK_DIV32 +*\*\ - RCC_TRACECLK_DIV64 +*\*\ - RCC_TRACECLK_DIV128 +*\*\ - RCC_TRACECLK_DIV256 +*\*\ - RCC_TRACECLK_DIV512 +*\*\return none. +**/ +void RCC_ConfigM7TraceClkDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->CFG1; + /* Clear M7TRACEDIV bits */ + reg_value &= RCC_M7TRACECLK_DIV_MASK; + /* Set the M7TRACEDIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->CFG1 = reg_value; +} + +/** +*\*\name RCC_ConfigM4TraceClkDivider . +*\*\fun Configure M4 trace clock prescalar values. +*\*\param CLK_divider +*\*\ - RCC_TRACECLK_DIV1 +*\*\ - RCC_TRACECLK_DIV2 +*\*\ - RCC_TRACECLK_DIV4 +*\*\ - RCC_TRACECLK_DIV8 +*\*\ - RCC_TRACECLK_DIV16 +*\*\ - RCC_TRACECLK_DIV32 +*\*\ - RCC_TRACECLK_DIV64 +*\*\ - RCC_TRACECLK_DIV128 +*\*\ - RCC_TRACECLK_DIV256 +*\*\ - RCC_TRACECLK_DIV512 +*\*\return none. +**/ +void RCC_ConfigM4TraceClkDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->CFG1; + /* Clear M4TRACEDIV bits */ + reg_value &= RCC_M4TRACECLK_DIV_MASK; + /* Set the M4TRACEDIV bits */ + reg_value |= (CLK_divider >> 4); + /* Store the new value */ + RCC->CFG1 = reg_value; +} + + +/** +*\*\name RCC_ConfigM7SystickClkDivider . +*\*\fun Configure M7 systick prescalar values from fclk. +*\*\param CLK_divider +*\*\ - RCC_STCLK_DIV1 +*\*\ - RCC_STCLK_DIV2 +*\*\ - RCC_STCLK_DIV4 +*\*\ - RCC_STCLK_DIV8 +*\*\ - RCC_STCLK_DIV16 +*\*\ - RCC_STCLK_DIV32 +*\*\ - RCC_STCLK_DIV64 +*\*\ - RCC_STCLK_DIV128 +*\*\ - RCC_STCLK_DIV256 +*\*\ - RCC_STCLK_DIV512 +*\*\return none. +**/ +void RCC_ConfigM7SystickClkDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->CFG3; + /* Clear M7STCLKDIV bits */ + reg_value &= RCC_M7STCLK_DIV_MASK; + /* Set the M7STCLKDIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->CFG3 = reg_value; +} + +/** +*\*\name RCC_ConfigM4SystickClkDivider . +*\*\fun Configure M4 systick prescalar values from fclk. +*\*\param CLK_divider +*\*\ - RCC_STCLK_DIV2 +*\*\ - RCC_STCLK_DIV4 +*\*\ - RCC_STCLK_DIV8 +*\*\ - RCC_STCLK_DIV16 +*\*\ - RCC_STCLK_DIV32 +*\*\ - RCC_STCLK_DIV64 +*\*\ - RCC_STCLK_DIV128 +*\*\ - RCC_STCLK_DIV256 +*\*\ - RCC_STCLK_DIV512 +*\*\return none. +*\*\note DIV1 is not supported +**/ +void RCC_ConfigM4SystickClkDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->CFG3; + /* Clear M4STCLKDIV bits */ + reg_value &= RCC_M4STCLK_DIV_MASK; + /* Set the M4STCLKDIV bits */ + reg_value |= (CLK_divider >> 4); + /* Store the new value */ + RCC->CFG3 = reg_value; +} + +/** +*\*\name RCC_EnableDualCoreDebugClk. +*\*\fun Dual core debug clock enable. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableDualCoreDebugClk(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->CFG5 |= RCC_DUALCORE_DBG_ENABLE; + } + else + { + RCC->CFG5 &= (~RCC_DUALCORE_DBG_ENABLE); + } +} + +/** +*\*\name RCC_ConfigRTCHSIClkDivider . +*\*\fun RTC HSI clock prescalar values. +*\*\param CLK_divider +*\*\ - RCC_RTCCLK_HSIDIV1 +*\*\ - RCC_RTCCLK_HSIDIV2 +*\*\ - RCC_RTCCLK_HSIDIV4 +*\*\ - RCC_RTCCLK_HSIDIV8 +*\*\ - RCC_RTCCLK_HSIDIV16 +*\*\ - RCC_RTCCLK_HSIDIV32 +*\*\ - RCC_RTCCLK_HSIDIV64 +*\*\ - RCC_RTCCLK_HSIDIV128 +*\*\ - RCC_RTCCLK_HSIDIV256 +*\*\ - RCC_RTCCLK_HSIDIV512 +*\*\return none. +**/ +void RCC_ConfigRTCHSIClkDivider(uint32_t CLK_divider) +{ + uint32_t reg_value; + + reg_value = RCC->CFG5; + /* Clear RTCHSIDIV bits */ + reg_value &= RCC_RTCCLK_HSIDIV_MASK; + /* Set the RTCHSIDIV bits */ + reg_value |= CLK_divider; + /* Store the new value */ + RCC->CFG5 = reg_value; +} + +/** +*\*\name RCC_EnablePLLSoftwareLock. +*\*\fun Enable this bit if hardware PLL lock fail. +*\*\param lock_type : +*\*\ - RCC_SOFTLOCK_EN_SHRPLL +*\*\ - RCC_SOFTLOCK_EN_PLL3 +*\*\ - RCC_SOFTLOCK_EN_PLL2 +*\*\ - RCC_SOFTLOCK_EN_PLL1 +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnablePLLSoftwareLock(uint32_t lock_type, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->PLLSFTLK |= lock_type; + } + else + { + RCC->PLLSFTLK &= ~lock_type; + } + +} + +/** +*\*\name RCC_EnableSHRTIMAFEReset. +*\*\fun Used to assert POR reset to SHRTIM AFE. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableSHRTIMAFEReset(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->PLLSFTLK &= (~RCC_SHRTIMAFE_RESET_ENABLE); + } + else + { + RCC->PLLSFTLK |= RCC_SHRTIMAFE_RESET_ENABLE; + } +} + +/** +*\*\name RCC_EnableSDRAMDelayChain. +*\*\fun SDRAM Delay chain enable. +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void RCC_EnableSDRAMDelayChain(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + RCC->PLLSFTLK |= RCC_SDRAM_DELAY_ENABLE; + } + else + { + RCC->PLLSFTLK &= (~RCC_SDRAM_DELAY_ENABLE); + } +} + +/** +*\*\name RCC_ConfigSDRAMDelay . +*\*\fun Increase SDRAM clock latency. +*\*\param CLK_delay +*\*\ - RCC_SDRAM_DELAY_0_2NS Increase SDRAM clock latency by 0.2ns +*\*\ - RCC_SDRAM_DELAY_0_4NS Increase SDRAM clock latency by 0.4ns +*\*\ - RCC_SDRAM_DELAY_0_6NS Increase SDRAM clock latency by 0.6ns +*\*\ - RCC_SDRAM_DELAY_0_8NS Increase SDRAM clock latency by 0.8ns +*\*\ - RCC_SDRAM_DELAY_1_0NS Increase SDRAM clock latency by 1.0ns +*\*\ - RCC_SDRAM_DELAY_1_2NS Increase SDRAM clock latency by 1.2ns +*\*\ - RCC_SDRAM_DELAY_1_4NS Increase SDRAM clock latency by 1.4ns +*\*\ - RCC_SDRAM_DELAY_1_6NS Increase SDRAM clock latency by 1.6ns +*\*\ - RCC_SDRAM_DELAY_1_8NS Increase SDRAM clock latency by 1.8ns +*\*\ - RCC_SDRAM_DELAY_2_0NS Increase SDRAM clock latency by 2.0ns +*\*\ - RCC_SDRAM_DELAY_2_2NS Increase SDRAM clock latency by 2.2ns +*\*\ - RCC_SDRAM_DELAY_2_4NS Increase SDRAM clock latency by 2.4ns +*\*\ - RCC_SDRAM_DELAY_2_6NS Increase SDRAM clock latency by 2.6ns +*\*\ - RCC_SDRAM_DELAY_2_8NS Increase SDRAM clock latency by 2.8ns +*\*\ - RCC_SDRAM_DELAY_3_0NS Increase SDRAM clock latency by 3.0ns +*\*\ - RCC_SDRAM_DELAY_3_2NS Increase SDRAM clock latency by 3.2ns +*\*\return none. +**/ +void RCC_ConfigSDRAMDelay(uint32_t CLK_delay) +{ + uint32_t reg_value; + + reg_value = RCC->PLLSFTLK; + /* Clear SDRAMDLSEL bits */ + reg_value &= RCC_SDRAM_DELAY_MASK; + /* Set the SDRAMDLSEL bits */ + reg_value |= CLK_delay; + /* Store the new value */ + RCC->PLLSFTLK = reg_value; +} + +/** +*\*\name RCC_ConfigHSEDriveStrength . +*\*\fun Config HSE drive strength. +*\*\param CLK_driver +*\*\ - 0x0 ~ 0x7 (min drive strength ~ max drive strength) +*\*\ - default value: 0x4 +*\*\return none. +**/ +void RCC_ConfigHSEDriveStrength(uint32_t CLK_driver) +{ + uint32_t reg_value; + + reg_value = AFEC->TRIMR1; + /* Clear SDRAMDLSEL bits */ + reg_value &= 0xFFF1FFFFU; + /* Set the SDRAMDLSEL bits */ + reg_value |= (CLK_driver << 17U); + /* Store the new value */ + AFEC->TRIMR1 = reg_value; +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_rtc.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_rtc.c new file mode 100644 index 0000000000..45667f3915 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_rtc.c @@ -0,0 +1,2412 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_rtc.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_rtc.h" + +static uint8_t RTC_ByteToBcd2(uint8_t Value); +static uint8_t RTC_Bcd2ToByte(uint8_t Value); + +/** +*\*\name RTC_DeInit. +*\*\fun Deinitializes the RTC registers to their default reset values. +*\*\param none +*\*\return ErrorStatus +*\*\ - SUCCESS: RTC registers are deinitialized +*\*\ - ERROR: RTC registers are not deinitialized +*\*\ +**/ +ErrorStatus RTC_DeInit(void) +{ + __IO uint32_t wutcounter = 0x00; + uint32_t wutwfstatus; + ErrorStatus status; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + /* Reset TSH, DAT and CTRL registers */ + RTC->TSH = (uint32_t)0x00000000; + RTC->DATE = (uint32_t)0x00002101; + + /* Reset All CTRL bits except CTRL[2:0] */ + RTC->CTRL &= (uint32_t)0x00000007; + + /* Wait till RTC WTWF flag is set and if Time out is reached exit */ + do + { + wutwfstatus = RTC->INITSTS & RTC_INITSTS_WTWF; + wutcounter++; + } + while ((wutcounter != INITMODE_TIMEOUT) && (wutwfstatus == 0x00)); + + if ((RTC->INITSTS & RTC_INITSTS_WTWF) == RESET) + { + status = ERROR; + } + else + { + /* Reset all RTC CTRL register bits */ + RTC->CTRL &= (uint32_t)0x00000000; + RTC->WKUPT = (uint32_t)0x0000FFFF; + RTC->PRE = (uint32_t)0x007F00FF; + RTC->ALARMA = (uint32_t)0x00000000; + RTC->ALARMB = (uint32_t)0x00000000; + RTC->CALIB = (uint32_t)0x00000000; + RTC->ALRMASS = (uint32_t)0x00000000; + RTC->ALRMBSS = (uint32_t)0x00000000; + + /* Reset INTSTS register and exit initialization mode */ + RTC->INITSTS = (uint32_t)0x00000000; + + RTC->OPT = (uint32_t)0x00000000; + + + /* Wait till the RTC RSYF flag is set */ + if (RTC_WaitForSynchro() == ERROR) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + + return status; +} + +/** +*\*\name RTC_Init. +*\*\fun RTC_InitStruct pointer to a RTC_InitType structure that contains +*\*\ the configuration information for the RTC peripheral +*\*\param RTC_InitStruct +*\*\ - RTC_HourFormat +*\*\ - RTC_24HOUR_FORMAT +*\*\ - RTC_12HOUR_FORMAT +*\*\ - RTC_AsynchPrediv the value is selected in the 1-0x7F range +*\*\ - RTC_SynchPrediv the value must lower than 0x7FFF +*\*\return ErrorStatus +*\*\ - SUCCESS: RTC registers are deinitialized +*\*\ - ERROR: RTC registers are not deinitialized +*\*\ +**/ +ErrorStatus RTC_Init(RTC_InitType* RTC_InitStruct) +{ + ErrorStatus status; + uint16_t i; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + /* Clear RTC CTRL HFMT Bit */ + RTC->CTRL &= ((uint32_t) ~(RTC_CTRL_HFMT)); + /* Set RTC_CTRL register */ + RTC->CTRL |= ((uint32_t)(RTC_InitStruct->RTC_HourFormat)); + + /* Configure the RTC PRE */ + RTC->PRE = (uint32_t)(RTC_InitStruct->RTC_SynchPrediv); + RTC->PRE |= (uint32_t)(RTC_InitStruct->RTC_AsynchPrediv << 16); + + /* Exit Initialization mode */ + RTC_ExitInitMode(); + + status = SUCCESS; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + + /* Delay for the RTC prescale effect */ + for(i = 0; i < 0x2FF; i++) + { + /* NOP */ + }; + + return status; +} + +/** +*\*\name RTC_StructInit. +*\*\fun Fills each RTC_InitStruct member with its default value. +*\*\param RTC_InitStruct : RTC_InitStruct pointer to a RTC_InitType structure which will beinitialized. +*\*\ - RTC_HourFormat +*\*\ - RTC_24HOUR_FORMAT +*\*\ - RTC_12HOUR_FORMAT +*\*\ - RTC_AsynchPrediv the value is selected in the 1-0x7F range +*\*\ - RTC_SynchPrediv the value must lower than 0x7FFF +*\*\return none +**/ +void RTC_StructInit(RTC_InitType* RTC_InitStruct) +{ + /* Initialize the RTC_HourFormat member */ + RTC_InitStruct->RTC_HourFormat = RTC_24HOUR_FORMAT; + + /* Initialize the RTC_AsynchPrediv member */ + RTC_InitStruct->RTC_AsynchPrediv = (uint32_t)0x7F; + + /* Initialize the RTC_SynchPrediv member */ + RTC_InitStruct->RTC_SynchPrediv = (uint32_t)0xFF; +} + +/** +*\*\name RTC_EnableWriteProtection. +*\*\fun Enable or disable the RTC registers write protection. + *\*\param Cmd : + *\*\ - ENABLE + *\*\ - DISABLE +*\*\return none +**/ +void RTC_EnableWriteProtection(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + } + else + { + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + } +} + +/** +*\*\name RTC_EnterInitMode. +*\*\fun Enters the RTC Initialization mode. +*\*\param none +*\*\return ErrorStatus +*\*\ - SUCCESS: RTC is in Init mode +*\*\ - ERROR: RTC is not in Init mode +**/ +ErrorStatus RTC_EnterInitMode(void) +{ + __IO uint32_t initcounter = 0x00; + ErrorStatus status; + uint32_t initstatus; + + /* Check if the Initialization mode is set */ + if ((RTC->INITSTS & RTC_INITSTS_INITF) == (uint32_t)RESET) + { + /* Set the Initialization mode */ + RTC->INITSTS = (uint32_t)RTC_INITSTS_INITM; + + /* Wait till RTC is in INIT state and if Time out is reached exit */ + do + { + initstatus = RTC->INITSTS & RTC_INITSTS_INITF; + initcounter++; + } + while ((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00)); + + if ((RTC->INITSTS & RTC_INITSTS_INITF) != RESET) + { + status = SUCCESS; + } + else + { + status = ERROR; + } + } + else + { + status = SUCCESS; + } + + return (status); +} + +/** +*\*\name RTC_ExitInitMode. +*\*\fun When the initialization sequence is complete, the calendar restarts counting after 4 RTCCLK cycles. +*\*\param none +*\*\return none +**/ +void RTC_ExitInitMode(void) +{ + /* Exit Initialization mode */ + RTC->INITSTS &= (uint32_t)~RTC_INITSTS_INITM; +} + +/** +*\*\name RTC_WaitForSynchro. +*\*\fun Waits until the RTC Time and Date registers (RTC_TSH and RTC_DATE) are synchronized with RTC APB clock. +*\*\param none +*\*\return ErrorStatus : +*\*\ - SUCCESS: RTC registers are synchronised +*\*\ - ERROR: RTC registers are not synchronised +**/ +ErrorStatus RTC_WaitForSynchro(void) +{ + __IO uint32_t synchrocounter = 0; + ErrorStatus status; + uint32_t synchrostatus; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Clear RSYF flag */ + RTC->INITSTS &= (uint32_t)RTC_RSF_MASK; + + /* Wait the registers to be synchronised and 5500ms timeout */ + do + { + synchrostatus = RTC->INITSTS & RTC_INITSTS_RSYF; + synchrocounter++; + } + while ((synchrocounter < SYNCHRO_TIMEOUT) && (synchrostatus == 0x00U)); + + if ((RTC->INITSTS & RTC_INITSTS_RSYF) != RESET) + { + status = SUCCESS; + } + else + { + status = ERROR; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + + return (status); +} + + +/** +*\*\name RTC_EnableRefClock. +*\*\fun Enables or disables the RTC reference clock detection. + *\*\param Cmd : + *\*\ - ENABLE + *\*\ - DISABLE +*\*\return none +**/ +ErrorStatus RTC_EnableRefClock(FunctionalState Cmd) +{ + ErrorStatus status; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + if (Cmd != DISABLE) + { + /* Enable the RTC reference clock detection */ + RTC->CTRL |= RTC_CTRL_REFCLKEN; + } + else + { + /* Disable the RTC reference clock detection */ + RTC->CTRL &= ~RTC_CTRL_REFCLKEN; + } + + /* Exit Initialization mode */ + RTC_ExitInitMode(); + + status = SUCCESS; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + + return status; +} + + +/** +*\*\name RTC_EnableBypassShadow. +*\*\fun When the Bypass Shadow is enabled the calendar value are taken directly from the Calendar counter + *\*\param Cmd : + *\*\ - ENABLE + *\*\ - DISABLE +*\*\return none +**/ +void RTC_EnableBypassShadow(FunctionalState Cmd) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (Cmd != DISABLE) + { + /* Set the BYPS bit */ + RTC->CTRL |= (uint8_t)RTC_CTRL_BYPS; + } + else + { + /* Reset the BYPS bit */ + RTC->CTRL &= (uint8_t)~RTC_CTRL_BYPS; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_ConfigTime. +*\*\fun Calendar value read from Shadow register. + *\*\param RTC_Format : + *\*\ - RTC_FORMAT_BIN + *\*\ - RTC_FORMAT_BCD +*\*\param RTC_TimeStruct : RTC_TimeStruct pointer to a RTC_TimeType structure that contains +*\*\ the time configuration information for the RTC.When the user does not need to configure this +*\*\ parameter, note that NULL can be passed in. +*\*\ - Hours +*\*\ - if RTC_AM_H12 is select the value in the 0-23 range +*\*\ - if RTC_PM_H12 is select the value in the 1-12 range +*\*\ - Minutes the value set in the 0-59 range +*\*\ - Seconds the value set in the 0-59 range +*\*\ - H12 +*\*\ - RTC_AM_H12 +*\*\ - RTC_PM_H12 +*\*\return none +**/ +ErrorStatus RTC_ConfigTime(uint32_t RTC_Format, RTC_TimeType* RTC_TimeStruct) +{ + uint32_t tmpregister; + ErrorStatus status; + + /* Check the input parameters format */ + if (RTC_Format != RTC_FORMAT_BIN) + { + tmpregister = (((uint32_t)(RTC_TimeStruct->Hours) << 16) | ((uint32_t)(RTC_TimeStruct->Minutes) << 8) + | ((uint32_t)RTC_TimeStruct->Seconds) | ((uint32_t)(RTC_TimeStruct->H12) << 16)); + } + else + { + tmpregister = + (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->Hours) << 16) + | ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->Minutes) << 8) + | ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->Seconds)) | (((uint32_t)RTC_TimeStruct->H12) << 16)); + } + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + /* Set the RTC_TSH register */ + RTC->TSH = (uint32_t)(tmpregister & RTC_TR_RESERVED_MASK); + + /* Exit Initialization mode */ + RTC_ExitInitMode(); + + /* If RTC_CTRL_BYPS bit = 0, wait for synchro else this check is not needed */ + if ((RTC->CTRL & RTC_CTRL_BYPS) == RESET) + { + if (RTC_WaitForSynchro() == ERROR) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + else + { + status = SUCCESS; + } + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + + /* Waits until the RTC Time and Date registers + (RTC_TSH and RTC_DATE) are synchronized with RTC APB clock. */ + if(status != ERROR) + { + status = RTC_WaitForSynchro(); + } + + return status; +} + +/** +*\*\name RTC_TimeStructInit. +*\*\fun Fills each RTC_TimeStruct member with its default value +*\*\ (Time = 00h:00 min:00sec). +*\*\param RTC_TimeStruct : RTC_TimeStruct pointer to a RTC_TimeType structure that contains +*\*\ the time configuration information for the RTC. +*\*\ - Hours +*\*\ - if RTC_AM_H12 is select the value in the 0-23 range +*\*\ - if RTC_PM_H12 is select the value in the 1-12 range +*\*\ - Minutes the value set in the 0-59 range +*\*\ - Seconds the value set in the 0-59 range +*\*\ - H12 +*\*\ - RTC_AM_H12 +*\*\ - RTC_PM_H12 +*\*\return none +**/ +void RTC_TimeStructInit(RTC_TimeType* RTC_TimeStruct) +{ + /* Time = 00h:00min:00sec */ + RTC_TimeStruct->H12 = RTC_AM_H12; + RTC_TimeStruct->Hours = 0; + RTC_TimeStruct->Minutes = 0; + RTC_TimeStruct->Seconds = 0; +} + +/** +*\*\name RTC_GetTime. +*\*\fun Get the RTC current Time. +*\*\param RTC_Format : specifies the format of the returned parameters. +*\*\ - RTC_FORMAT_BIN +*\*\ - RTC_FORMAT_BCD +*\*\param RTC_TimeStruct : RTC_TimeStruct pointer to a RTC_TimeType structure. +*\*\return none +**/ +void RTC_GetTime(uint32_t RTC_Format, RTC_TimeType* RTC_TimeStruct) +{ + uint32_t tmpregister; + + /* Get the RTC_TSH register */ + tmpregister = (uint32_t)(RTC->TSH & RTC_TR_RESERVED_MASK); + + /* Fill the structure fields with the read parameters */ + RTC_TimeStruct->Hours = (uint8_t)((tmpregister & (RTC_TSH_HOT | RTC_TSH_HOU)) >> 16); + RTC_TimeStruct->Minutes = (uint8_t)((tmpregister & (RTC_TSH_MIT | RTC_TSH_MIU)) >> 8); + RTC_TimeStruct->Seconds = (uint8_t)(tmpregister & (RTC_TSH_SCT | RTC_TSH_SCU)); + RTC_TimeStruct->H12 = (uint8_t)((tmpregister & (RTC_TSH_APM)) >> 16); + + /* Check the input parameters format */ + if (RTC_Format == RTC_FORMAT_BIN) + { + /* Convert the structure parameters to Binary format */ + RTC_TimeStruct->Hours = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->Hours); + RTC_TimeStruct->Minutes = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->Minutes); + RTC_TimeStruct->Seconds = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->Seconds); + } +} + +/** +*\*\name RTC_GetSubSecond. +*\*\fun Gets the RTC current Calendar Subseconds value. +*\*\return RTC current Calendar Subseconds value. +**/ +uint32_t RTC_GetSubSecond(void) +{ + uint32_t tmpregister; + + /* Get subseconds values from the correspondent registers*/ + tmpregister = (uint32_t)(RTC->SUBS); + + return (tmpregister); +} + +/** +*\*\name RTC_SetDate. +*\*\fun Set RTC Calendar current date. +*\*\param RTC_Format : specifies the format of the returned parameters. +*\*\ - RTC_FORMAT_BIN +*\*\ - RTC_FORMAT_BCD +*\*\param RTC_DateStruct : RTC_DateStruct pointer to a RTC_DateType structure that contains +*\*\ the date configuration information for the RTC,note that NULL can be passed in. +*\*\ - WeekDay +*\*\ - RTC_WEEKDAY_MONDAY +*\*\ - RTC_WEEKDAY_TUESDAY +*\*\ - RTC_WEEKDAY_WEDNESDAY +*\*\ - RTC_WEEKDAY_THURSDAY +*\*\ - RTC_WEEKDAY_FRIDAY +*\*\ - RTC_WEEKDAY_SATURDAY +*\*\ - RTC_WEEKDAY_SUNDAY +*\*\ - Month +*\*\ - RTC_MONTH_JANUARY +*\*\ - RTC_MONTH_FEBRURY +*\*\ - RTC_MONTH_MARCH +*\*\ - RTC_MONTH_APRIL +*\*\ - RTC_MONTH_MAY +*\*\ - RTC_MONTH_JUNE +*\*\ - RTC_MONTH_JULY +*\*\ - RTC_MONTH_AUGUST +*\*\ - RTC_MONTH_SEPTEMBER +*\*\ - RTC_MONTH_OCTOBER +*\*\ - RTC_MONTH_NOVEMBER +*\*\ - RTC_MONTH_DECEMBER +*\*\ - Date the value in the 1-31 range +*\*\ - Year the value in the 0-99 range +*\*\return ErrorStatus +*\*\ - SUCCESS: RTC Date register is configured +*\*\ - ERROR: RTCDate register is not configured +**/ +ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateType* RTC_DateStruct) +{ + uint32_t tmpregister; + ErrorStatus status; + + if ((RTC_Format == RTC_FORMAT_BIN) && ((RTC_DateStruct->Month & (uint8_t)0x10) == (uint8_t)0x10)) + { + RTC_DateStruct->Month = (RTC_DateStruct->Month & (uint8_t)0xEF) + (uint8_t)0x0A; + } + + /* Check the input parameters format */ + if (RTC_Format != RTC_FORMAT_BIN) + { + tmpregister = ((((uint32_t)RTC_DateStruct->Year) << 16) | (((uint32_t)RTC_DateStruct->Month) << 8) + | ((uint32_t)RTC_DateStruct->Date) | (((uint32_t)RTC_DateStruct->WeekDay) << 13)); + } + else + { + tmpregister = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->Year) << 16) + | ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->Month) << 8) + | ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->Date)) | ((uint32_t)RTC_DateStruct->WeekDay << 13)); + } + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Set Initialization mode */ + if (RTC_EnterInitMode() == ERROR) + { + status = ERROR; + } + else + { + /* Set the RTC_DATE register */ + RTC->DATE = (uint32_t)(tmpregister & RTC_DATE_RESERVED_MASK); + + /* Exit Initialization mode */ + RTC_ExitInitMode(); + + /* If RTC_CTRL_BYPS bit = 0, wait for synchro else this check is not needed */ + if ((RTC->CTRL & RTC_CTRL_BYPS) == RESET) + { + if (RTC_WaitForSynchro() == ERROR) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + else + { + status = SUCCESS; + } + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + + /* Waits until the RTC Time and Date registers + (RTC_TSH and RTC_DATE) are synchronized with RTC APB clock. */ + if(ERROR != status) + { + status = RTC_WaitForSynchro(); + } + + return status; +} + + +/** +*\*\name RTC_DateStructInit. +*\*\fun Fills each RTC_DateStruct member with its default value (Monday, January 01 xx00). +*\*\param RTC_DateStruct : RTC_DateStruct pointer to a RTC_DateType structure that contains +*\*\ the date configuration information for the RTC. +*\*\ - WeekDay +*\*\ - RTC_WEEKDAY_MONDAY +*\*\ - RTC_WEEKDAY_TUESDAY +*\*\ - RTC_WEEKDAY_WEDNESDAY +*\*\ - RTC_WEEKDAY_THURSDAY +*\*\ - RTC_WEEKDAY_FRIDAY +*\*\ - RTC_WEEKDAY_SATURDAY +*\*\ - RTC_WEEKDAY_SUNDAY +*\*\ - Month +*\*\ - RTC_MONTH_JANUARY +*\*\ - RTC_MONTH_FEBRURY +*\*\ - RTC_MONTH_MARCH +*\*\ - RTC_MONTH_APRIL +*\*\ - RTC_MONTH_MAY +*\*\ - RTC_MONTH_JUNE +*\*\ - RTC_MONTH_JULY +*\*\ - RTC_MONTH_AUGUST +*\*\ - RTC_MONTH_SEPTEMBER +*\*\ - RTC_MONTH_OCTOBER +*\*\ - RTC_MONTH_NOVEMBER +*\*\ - RTC_MONTH_DECEMBER +*\*\ - Date the value in the 1-31 range +*\*\ - Year the value in the 0-99 range +*\*\return none +**/ +void RTC_DateStructInit(RTC_DateType* RTC_DateStruct) +{ + /* Monday, January 01 xx00 */ + RTC_DateStruct->WeekDay = RTC_WEEKDAY_MONDAY; + RTC_DateStruct->Date = 1; + RTC_DateStruct->Month = RTC_MONTH_JANUARY; + RTC_DateStruct->Year = 0; +} +/** +*\*\name RTC_GetDate. +*\*\fun Get the RTC current date. +*\*\param RTC_Format : specifies the format of the returned parameters. +*\*\ - RTC_FORMAT_BIN +*\*\ - RTC_FORMAT_BCD +*\*\param RTC_DateType : RTC_DateStruct pointer to a RTC_DateType structure that will +*\*\ contain the returned current date configuration. +*\*\return none +**/ +void RTC_GetDate(uint32_t RTC_Format, RTC_DateType* RTC_DateStruct) +{ + uint32_t tmpregister; + + /* Get the RTC_TSH register */ + tmpregister = (uint32_t)(RTC->DATE & RTC_DATE_RESERVED_MASK); + + /* Fill the structure fields with the read parameters */ + RTC_DateStruct->Year = (uint8_t)((tmpregister & (RTC_DATE_YRT | RTC_DATE_YRU)) >> 16); + RTC_DateStruct->Month = (uint8_t)((tmpregister & (RTC_DATE_MOT | RTC_DATE_MOU)) >> 8); + RTC_DateStruct->Date = (uint8_t)(tmpregister & (RTC_DATE_DAT | RTC_DATE_DAU)); + RTC_DateStruct->WeekDay = (uint8_t)((tmpregister & (RTC_DATE_WDU)) >> 13); + + /* Check the input parameters format */ + if (RTC_Format == RTC_FORMAT_BIN) + { + /* Convert the structure parameters to Binary format */ + RTC_DateStruct->Year = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->Year); + RTC_DateStruct->Month = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->Month); + RTC_DateStruct->Date = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->Date); + } +} + +/** +*\*\name RTC_SetAlarm. +*\*\fun Set the specified RTC Alarm. +*\*\param RTC_Format : specifies the format of the returned parameters. +*\*\ - RTC_FORMAT_BIN +*\*\ - RTC_FORMAT_BCD +*\*\param RTC_Alarm : RTC_Alarm specifies the alarm to be configured. +*\*\ - RTC_A_ALARM +*\*\ - RTC_B_ALARM +*\*\param RTC_AlarmStruct : RTC_AlarmStruct pointer to a RTC_AlarmType structure that +*\*\ contains the alarm configuration parameters. +*\*\ - AlarmTime RTC_TimeStruct pointer to a RTC_TimeType structure that contains +*\*\ the time configuration information for the RTC. +*\*\ - Hours +*\*\ - if RTC_AM_H12 is select the value in the 0-23 range +*\*\ - if RTC_PM_H12 is select the value in the 1-12 range +*\*\ - Minutes the value set in the 0-59 range +*\*\ - Seconds the value set in the 0-59 range +*\*\ - H12 +*\*\ - RTC_AM_H12 +*\*\ - RTC_PM_H12 +*\*\ - AlarmMask +*\*\ - RTC_ALARMMASK_NONE +*\*\ - RTC_ALARMMASK_WEEKDAY +*\*\ - RTC_ALARMMASK_HOURS +*\*\ - RTC_ALARMMASK_MINUTES +*\*\ - RTC_ALARMMASK_SECONDS +*\*\ - RTC_ALARMMASK_ALL +*\*\ - DateWeekMode +*\*\ - RTC_ALARM_SEL_WEEKDAY_DATE +*\*\ - RTC_ALARM_SEL_WEEKDAY_WEEKDAY +*\*\ - DateWeekValue +*\*\ - RTC_WEEKDAY_MONDAY +*\*\ - RTC_WEEKDAY_TUESDAY +*\*\ - RTC_WEEKDAY_WEDNESDAY +*\*\ - RTC_WEEKDAY_THURSDAY +*\*\ - RTC_WEEKDAY_FRIDAY +*\*\ - RTC_WEEKDAY_SATURDAY +*\*\ - RTC_WEEKDAY_SUNDAY +*\*\return none +**/ +void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmType* RTC_AlarmStruct) +{ + uint32_t tmpregister; + + /* Check the input parameters format */ + if (RTC_Format != RTC_FORMAT_BIN) + { + tmpregister = + (((uint32_t)(RTC_AlarmStruct->AlarmTime.Hours) << 16) + | ((uint32_t)(RTC_AlarmStruct->AlarmTime.Minutes) << 8) | ((uint32_t)RTC_AlarmStruct->AlarmTime.Seconds) + | ((uint32_t)(RTC_AlarmStruct->AlarmTime.H12) << 16) | ((uint32_t)(RTC_AlarmStruct->DateWeekValue) << 24) + | ((uint32_t)RTC_AlarmStruct->DateWeekMode) | ((uint32_t)RTC_AlarmStruct->AlarmMask)); + } + else + { + tmpregister = (((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->AlarmTime.Hours) << 16) + | ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->AlarmTime.Minutes) << 8) + | ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->AlarmTime.Seconds)) + | ((uint32_t)(RTC_AlarmStruct->AlarmTime.H12) << 16) + | ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->DateWeekValue) << 24) + | ((uint32_t)RTC_AlarmStruct->DateWeekMode) | ((uint32_t)RTC_AlarmStruct->AlarmMask)); + } + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Configure the Alarm register */ + if (RTC_Alarm == RTC_A_ALARM) + { + RTC->ALARMA = (uint32_t)tmpregister; + } + else + { + RTC->ALARMB = (uint32_t)tmpregister; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_AlarmStructInit. +*\*\fun Fills each RTC_AlarmStruct member with its default value +*\*\ (Time = 00h:00mn:00sec / Date = 1st day of the month/Mask = +*\*\ all fields are masked). +*\*\param RTC_AlarmStruct : RTC_AlarmStruct pointer to a RTC_AlarmType structure that +*\*\ contains the alarm configuration parameters. +*\*\ - AlarmTime RTC_TimeStruct pointer to a RTC_TimeType structure that contains +*\*\ the time configuration information for the RTC. +*\*\ - Hours +*\*\ - if RTC_AM_H12 is select the value in the 0-23 range +*\*\ - if RTC_PM_H12 is select the value in the 1-12 range +*\*\ - Minutes the value set in the 0-59 range +*\*\ - Seconds the value set in the 0-59 range +*\*\ - H12 +*\*\ - RTC_AM_H12 +*\*\ - RTC_PM_H12 +*\*\ - AlarmMask +*\*\ - RTC_ALARMMASK_NONE +*\*\ - RTC_ALARMMASK_WEEKDAY +*\*\ - RTC_ALARMMASK_HOURS +*\*\ - RTC_ALARMMASK_MINUTES +*\*\ - RTC_ALARMMASK_SECONDS +*\*\ - RTC_ALARMMASK_ALL +*\*\ - DateWeekMode +*\*\ - RTC_ALARM_SEL_WEEKDAY_DATE +*\*\ - RTC_ALARM_SEL_WEEKDAY_WEEKDAY +*\*\ - DateWeekValue +*\*\ - RTC_WEEKDAY_MONDAY +*\*\ - RTC_WEEKDAY_TUESDAY +*\*\ - RTC_WEEKDAY_WEDNESDAY +*\*\ - RTC_WEEKDAY_THURSDAY +*\*\ - RTC_WEEKDAY_FRIDAY +*\*\ - RTC_WEEKDAY_SATURDAY +*\*\ - RTC_WEEKDAY_SUNDAY +*\*\return none +**/ +void RTC_AlarmStructInit(RTC_AlarmType* RTC_AlarmStruct) +{ + /* Alarm Time Settings : Time = 00h:00mn:00sec */ + RTC_AlarmStruct->AlarmTime.H12 = RTC_AM_H12; + RTC_AlarmStruct->AlarmTime.Hours = 0; + RTC_AlarmStruct->AlarmTime.Minutes = 0; + RTC_AlarmStruct->AlarmTime.Seconds = 0; + + /* Alarm Date Settings : Date = 1st day of the month */ + RTC_AlarmStruct->DateWeekMode = RTC_ALARM_SEL_WEEKDAY_DATE; + RTC_AlarmStruct->DateWeekValue = 1; + + /* Alarm Masks Settings : Mask = all fields are not masked */ + RTC_AlarmStruct->AlarmMask = RTC_ALARMMASK_NONE; +} + +/** +*\*\name RTC_GetAlarm. +*\*\fun Get the RTC Alarm value and masks. +*\*\param RTC_Format : specifies the format of the output parameters. +*\*\ - RTC_FORMAT_BIN +*\*\ - RTC_FORMAT_BCD +*\*\param RTC_Alarm : specifies the alarm to be read. +*\*\ - RTC_A_ALARM +*\*\ - RTC_B_ALARM +*\*\param RTC_AlarmStruct : pointer to a RTC_AlarmType structure that will +*\*\ contains the output alarm configuration values. +*\*\ +*\*\return none +**/ +void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmType* RTC_AlarmStruct) +{ + uint32_t tmpregister; + + /* Get the RTC_ALARMx register */ + if (RTC_Alarm == RTC_A_ALARM) + { + tmpregister = (uint32_t)(RTC->ALARMA); + } + else + { + tmpregister = (uint32_t)(RTC->ALARMB); + } + + /* Fill the structure with the read parameters */ + RTC_AlarmStruct->AlarmTime.Hours = (uint8_t)((tmpregister & (RTC_ALARMA_HOT | RTC_ALARMA_HOU)) >> 16); + RTC_AlarmStruct->AlarmTime.Minutes = (uint8_t)((tmpregister & (RTC_ALARMA_MIT | RTC_ALARMA_MIU)) >> 8); + RTC_AlarmStruct->AlarmTime.Seconds = (uint8_t)(tmpregister & (RTC_ALARMA_SET | RTC_ALARMA_SEU)); + RTC_AlarmStruct->AlarmTime.H12 = (uint8_t)((tmpregister & RTC_ALARMA_APM) >> 16); + RTC_AlarmStruct->DateWeekValue = (uint8_t)((tmpregister & (RTC_ALARMA_DTT | RTC_ALARMA_DTU)) >> 24); + RTC_AlarmStruct->DateWeekMode = (uint32_t)(tmpregister & RTC_ALARMA_WKDSEL); + RTC_AlarmStruct->AlarmMask = (uint32_t)(tmpregister & RTC_ALARMMASK_ALL); + + if (RTC_Format == RTC_FORMAT_BIN) + { + RTC_AlarmStruct->AlarmTime.Hours = RTC_Bcd2ToByte(RTC_AlarmStruct->AlarmTime.Hours); + RTC_AlarmStruct->AlarmTime.Minutes = RTC_Bcd2ToByte(RTC_AlarmStruct->AlarmTime.Minutes); + RTC_AlarmStruct->AlarmTime.Seconds = RTC_Bcd2ToByte(RTC_AlarmStruct->AlarmTime.Seconds); + RTC_AlarmStruct->DateWeekValue = RTC_Bcd2ToByte(RTC_AlarmStruct->DateWeekValue); + } +} + +/** +*\*\name RTC_EnableAlarm. +*\*\fun Enables or disables the specified RTC Alarm. +*\*\param RTC_Alarm : specifies the alarm to be configured. +*\*\ - RTC_A_ALARM +*\*\ - RTC_B_ALARM + *\*\param Cmd : + *\*\ - ENABLE + *\*\ - DISABLE +*\*\return ErrorStatus : +*\*\ - SUCCESS: RTC Alarm set succeed +*\*\ - ERROR: RTC Alarm set failed +**/ +ErrorStatus RTC_EnableAlarm(uint32_t RTC_Alarm, FunctionalState Cmd) +{ + __IO uint32_t alarmcounter = 0x00; + uint32_t alarmstatus; + ErrorStatus status; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Configure the Alarm state */ + if (Cmd != DISABLE) + { + RTC->CTRL |= (uint32_t)RTC_Alarm; + + status = SUCCESS; + } + else + { + /* Disable the Alarm in RTC_CTRL register */ + RTC->CTRL &= (uint32_t)~RTC_Alarm; + + /* Wait till RTC ALxWF flag is set and if Time out is reached exit */ + do + { + alarmstatus = RTC->INITSTS & (RTC_Alarm >> 8); + alarmcounter++; + } + while ((alarmcounter != INITMODE_TIMEOUT) && (alarmstatus == 0x00)); + + if ((RTC->INITSTS & (RTC_Alarm >> 8)) == RESET) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + + return status; +} + +/** +*\*\name RTC_ConfigAlarmSubSecond. +*\*\fun Configure the RTC AlarmA/B Subseconds value and mask +*\*\param RTC_Alarm : specifies the alarm to be configured. +*\*\ - RTC_A_ALARM : select Alarm A. +*\*\ - RTC_B_ALARM : select Alarm B. +*\*\param RTC_AlarmSubSecondValue : specifies the Subseconds value, the value in the 0-0x00007FFF range +*\*\param RTC_AlarmSubSecondMask : specifies the Subseconds Mask. +*\*\ - RTC_SUBS_MASK_ALL : Alarm SS fields are masked There is no comparison on sub seconds for Alarm. +*\*\ - RTC_SUBS_MASK_SS14_1 : SS[14:1] are don't care in Alarm comparison Only SS[0] is compared +*\*\ - RTC_SUBS_MASK_SS14_2 : SS[14:2] are don't care in Alarm comparison Only SS[1:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_3 : SS[14:3] are don't care in Alarm comparison Only SS[2:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_4 : SS[14:4] are don't care in Alarm comparison Only SS[3:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_5 : SS[14:5] are don't care in Alarm comparison Only SS[4:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_6 : SS[14:6] are don't care in Alarm comparison Only SS[5:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_7 : SS[14:7] are don't care in Alarm comparison Only SS[6:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_8 : SS[14:8] are don't care in Alarm comparison Only SS[7:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_9 : SS[14:9] are don't care in Alarm comparison Only SS[8:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_10 : SS[14:10] are don't care in Alarm comparison Only SS[9:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_11 : SS[14:11] are don't care in Alarm comparison Only SS[10:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_12 : SS[14:12] are don't care in Alarm comparison Only SS[11:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_13 : SS[14:13] are don't care in Alarm comparison Only SS[12:0] are compared +*\*\ - RTC_SUBS_MASK_SS14_14 : SS[14] is don't care in Alarm comparison Only SS[13:0] are compared. +*\*\ - RTC_SUBS_MASK_NONE : SS[14:0] are compared and must match to activate alarm. +*\*\return None +**/ +void RTC_ConfigAlarmSubSecond(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, uint32_t RTC_AlarmSubSecondMask) +{ + uint32_t tmpregister; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Configure the Alarm A or Alarm B SubSecond registers */ + tmpregister = (uint32_t)(uint32_t)(RTC_AlarmSubSecondValue) | (uint32_t)(RTC_AlarmSubSecondMask); + + if (RTC_Alarm == RTC_A_ALARM) + { + /* Configure the AlarmA SubSecond register */ + RTC->ALRMASS = tmpregister; + } + else + { + /* Configure the Alarm B SubSecond register */ + RTC->ALRMBSS = tmpregister; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + + +/** +*\*\name RTC_GetAlarmSubSecond. +*\*\fun Gets the RTC Alarm Subseconds value. +*\*\param RTC_Alarm : specifies the alarm to be read. +*\*\ - RTC_A_ALARM : select Alarm A. +*\*\ - RTC_B_ALARM : select Alarm B. +*\*\return RTC Alarm Subseconds value. +**/ +uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm) +{ + uint32_t tmpregister; + + /* Get the RTC_ALARMx register */ + if (RTC_Alarm == RTC_A_ALARM) + { + tmpregister = (uint32_t)((RTC->ALRMASS) & RTC_ALRMASS_SSV); + } + else + { + tmpregister = (uint32_t)((RTC->ALRMBSS) & RTC_ALRMBSS_SSV); + } + + return (tmpregister); +} + + + +/** +*\*\name RTC_ConfigWakeUpClock. +*\*\fun Configures the RTC Wakeup clock source. +*\*\param RTC_WakeUpClock : RTC_WakeUpClock Wakeup Clock source. +*\*\ - RTC_WKUPCLK_RTCCLK_DIV16 : RTC Wakeup Counter Clock = RTCCLK/16. +*\*\ - RTC_WKUPCLK_RTCCLK_DIV8 : RTC Wakeup Counter Clock = RTCCLK/8. +*\*\ - RTC_WKUPCLK_RTCCLK_DIV4 : RTC Wakeup Counter Clock = RTCCLK/4. +*\*\ - RTC_WKUPCLK_RTCCLK_DIV2 : RTC Wakeup Counter Clock = RTCCLK/2. +*\*\ - RTC_WKUPCLK_CK_SPRE_16BITS : RTC Wakeup Counter Clock = CK_SPRE. +*\*\ - RTC_WKUPCLK_CK_SPRE_17BITS : RTC Wakeup Counter Clock = CK_SPRE,and wakeup timer count is 2^16. +*\*\return none +**/ +void RTC_ConfigWakeUpClock(uint32_t RTC_WakeUpClock) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Clear the Wakeup Timer clock source bits in CTRL register */ + RTC->CTRL &= (uint32_t)~RTC_CTRL_WKUPSEL; + + /* Configure the clock source */ + RTC->CTRL |= (uint32_t)RTC_WakeUpClock; + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_SetWakeUpCounter. +*\*\fun Configures the RTC Wakeup counter. +*\*\param RTC_WakeUpCounter : specifies the WakeUp counter, the value in the 0-0xFFFF range +*\*\return none +**/ +void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Configure the Wakeup Timer counter */ + RTC->WKUPT = (uint32_t)RTC_WakeUpCounter; + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_GetWakeUpCounter. +*\*\fun Returns the RTC WakeUp timer counter value. +*\*\param none +*\*\return The RTC WakeUp Counter value. +**/ +uint32_t RTC_GetWakeUpCounter(void) +{ + /* Get the counter value */ + return ((uint32_t)(RTC->WKUPT & RTC_WKUPT_WKUPT)); +} + +/** +*\*\name RTC_EnableWakeUp +*\*\fun Enables or disables the RTC WakeUp timer. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return ErrorStatus : +*\*\ - SUCCESS: RTC wakeup configured succeed +*\*\ - ERROR: RTC wakeup configured failed +**/ +ErrorStatus RTC_EnableWakeUp(FunctionalState Cmd) +{ + __IO uint32_t wutcounter = 0x00; + uint32_t wutwfstatus; + ErrorStatus status; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (Cmd != DISABLE) + { + /* Enable the Wakeup Timer */ + RTC->CTRL |= (uint32_t)RTC_CTRL_WTEN; + status = SUCCESS; + } + else + { + /* Disable the Wakeup Timer */ + RTC->CTRL &= (uint32_t)~RTC_CTRL_WTEN; + + /* Wait till RTC WTWF flag is set and if Time out is reached exit */ + do + { + wutwfstatus = RTC->INITSTS & RTC_INITSTS_WTWF; + wutcounter++; + } + while ((wutcounter != INITMODE_TIMEOUT) && (wutwfstatus == 0x00)); + + if ((RTC->INITSTS & RTC_INITSTS_WTWF) == RESET) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + + return status; +} + +/** +*\*\name RTC_ConfigDayLightSaving +*\*\fun Adds or substract one hour from the current time. +*\*\param RTC_DayLightSaving : the value of hour adjustment. +*\*\ - RTC_DAYLIGHT_SAVING_SUB1H : Substract one hour (winter time). +*\*\ - RTC_DAYLIGHT_SAVING_ADD1H : Add one hour (summer time). +*\*\param RTC_StoreOperation : Specifies the value to be written in the BCK bit +*\*\ in CTRL register to store the operation. +*\*\ - RTC_STORE_OPERATION_RESET : BCK Bit Reset. +*\*\ - RTC_STORE_OPERATION_SET : BCK Bit Set. +*\*\return none +**/ +void RTC_ConfigDayLightSaving(uint32_t RTC_DayLightSaving, uint32_t RTC_StoreOperation) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Clear the bits to be configured */ + RTC->CTRL &= (uint32_t) ~(RTC_CTRL_BAKP); + /* Clear the SU1H and AD1H bits to be configured */ + RTC->CTRL &= (uint32_t) ~(RTC_CTRL_SU1H & RTC_CTRL_AD1H); + /* Configure the RTC_CTRL register */ + RTC->CTRL |= (uint32_t)(RTC_DayLightSaving | RTC_StoreOperation); + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_GetStoreOperation +*\*\fun Returns the RTC Day Light Saving stored operation. +*\*\return RTC Day Light Saving stored operation. +*\*\ - RTC_STORE_OPERATION_RESET +*\*\ - RTC_STORE_OPERATION_SET +**/ +uint32_t RTC_GetStoreOperation(void) +{ + return (RTC->CTRL & RTC_CTRL_BAKP); +} + +/** +*\*\name RTC_EnableCalOVDetect +*\*\fun Enable the RTC calendar overflow detection mechanism. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_EnableCalOVDetect(FunctionalState Cmd) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (Cmd != DISABLE) + { + /* Set the CAOVEN bit */ + RTC->CTRL |= (uint8_t)RTC_CTRL_CAOVEN; + } + else + { + /* Reset the CAOVEN bit */ + RTC->CTRL &= (uint8_t)~RTC_CTRL_CAOVEN; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_ConfigOutput +*\*\fun Configures the RTC output source. +*\*\param RTC_Output : RTC_Output Specifies which signal will be routed to the RTC output. +*\*\ - RTC_OUTPUT_DIS : No output selected +*\*\ - RTC_OUTPUT_ALA : signal of AlarmA mapped to output. +*\*\ - RTC_OUTPUT_ALB : signal of AlarmB mapped to output. +*\*\ - RTC_OUTPUT_WKUP: signal of WakeUp mapped to output. +*\*\param RTC_OutputPolarity : Specifies the polarity of the output signal. +*\*\ - RTC_OUTPOL_HIGH: The output pin is high when the ALRAF/ALRBF/WUTF is high (depending on OSEL). +*\*\ - RTC_OUTPOL_LOW : The output pin is low when the ALRAF/ALRBF/WUTF is high (depending on OSEL). +*\*\return none +**/ +void RTC_ConfigOutput(uint32_t RTC_Output, uint32_t RTC_OutputPolarity) +{ + __IO uint32_t temp = 0; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Clear the bits to be configured */ + RTC->CTRL &= (uint32_t) ~(RTC_CTRL_OUTSEL | RTC_CTRL_OPOL); + + /* Configure the output selection and polarity */ + RTC->CTRL |= (uint32_t)(RTC_Output | RTC_OutputPolarity); + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_EnableTampOutput +*\*\fun Enable or disable the RTC tamper output . +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_EnableTampOutput(FunctionalState Cmd) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (Cmd != DISABLE) + { + /* Enable the RTC tamper output */ + RTC->CTRL |= (uint32_t)RTC_CTRL_TAMPOE; + } + else + { + /* Disable the RTC tamper output */ + RTC->CTRL &= (uint32_t)~RTC_CTRL_TAMPOE; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_EnableCalibOutput +*\*\fun Enable or disable the RTC calibration clock to be output through the relative pin. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_EnableCalibOutput(FunctionalState Cmd) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (Cmd != DISABLE) + { + /* Enable the RTC clock output */ + RTC->CTRL |= (uint32_t)RTC_CTRL_COEN; + } + else + { + /* Disable the RTC clock output */ + RTC->CTRL &= (uint32_t)~RTC_CTRL_COEN; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_ConfigCalibOutput +*\*\fun Configure the Calibration Pinout (RTC_CALIB) Selection (1Hz or 256Hz). +*\*\param RTC_CalibOutput Select the Calibration output Selection . +*\*\ - RTC_CALIB_OUTPUT_256HZ : A signal has a regular waveform at 256Hz. +*\*\ - RTC_CALIB_OUTPUT_1HZ : A signal has a regular waveform at 1Hz. +*\*\return none +**/ +void RTC_ConfigCalibOutput(uint32_t RTC_CalibOutput) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /*clear flags before config*/ + RTC->CTRL &= (uint32_t) ~(RTC_CTRL_CALOSEL); + + /* Configure the RTC_CTRL register */ + RTC->CTRL |= (uint32_t)RTC_CalibOutput; + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_ConfigSmoothCalib +*\*\fun Configures the Smooth Calibration Settings. +*\*\param RTC_SmoothCalibPeriod : RTC_SmoothCalibPeriod Select the Smooth Calibration Period. +*\*\ - SMOOTH_CALIB_32SEC : The smooth calibration periode is 32s. +*\*\ - SMOOTH_CALIB_16SEC : The smooth calibration periode is 16s. +*\*\ - SMOOTH_CALIB_8SEC : The smooth calibartion periode is 8s. +*\*\param RTC_SmoothCalibPlusPulses : Set or reset the CALP bit. +*\*\ - RTC_SMOOTH_CALIB_PLUS_PULSES_SET : Add one RTCCLK puls every 2**11 pulses. +*\*\ - RTC_SMOOTH_CALIB_PLUS_PULSES_RESET : No RTCCLK pulses are added. +*\*\param RTC_SmouthCalibMinusPulsesValue : Set the value of CALM[8:0] bits, the value in the 0-0x000001FF range +*\*\return ErrorStatus +*\*\ - SUCCESS : RTC Calib registers are configured +*\*\ - ERROR : RTC Calib registers are not configured +**/ +ErrorStatus RTC_ConfigSmoothCalib(uint32_t RTC_SmoothCalibPeriod, + uint32_t RTC_SmoothCalibPlusPulses, + uint32_t RTC_SmouthCalibMinusPulsesValue) +{ + ErrorStatus status; + uint32_t recalpfcount = 0; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* check if a calibration is pending*/ + if ((RTC->INITSTS & RTC_INITSTS_RECPF) != RESET) + { + /* wait until the Calibration is completed*/ + while (((RTC->INITSTS & RTC_INITSTS_RECPF) != RESET) && (recalpfcount != RECALPF_TIMEOUT)) + { + recalpfcount++; + } + } + + /* check if the calibration pending is completed or if there is no calibration operation at all*/ + if ((RTC->INITSTS & RTC_INITSTS_RECPF) == RESET) + { + /* Configure the Smooth calibration settings */ + RTC->CALIB = (uint32_t)((uint32_t)RTC_SmoothCalibPeriod | (uint32_t)RTC_SmoothCalibPlusPulses + | (uint32_t)RTC_SmouthCalibMinusPulsesValue); + + status = SUCCESS; + } + else + { + status = ERROR; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + + return (ErrorStatus)(status); +} + +/** +*\*\name RTC_EnableInterEventTimeStamp +*\*\fun Enables or disables the RTC internal event trigger TimeStamp functionality. + *\*\param Cmd : + *\*\ - ENABLE + *\*\ - DISABLE +*\*\return none +**/ +void RTC_EnableInterEventTimeStamp(FunctionalState Cmd) +{ + uint32_t tmpregister; + + /* Get the RTC_CTRL register and clear the bits to be configured */ + tmpregister = (uint32_t)(RTC->CTRL & (uint32_t) ~(RTC_CTRL_IETSEN)); + + /* Get the new configuration */ + if (Cmd != DISABLE) + { + tmpregister |= (uint32_t)(RTC_CTRL_IETSEN); + } + else + { + tmpregister &= ~(uint32_t)(RTC_CTRL_IETSEN); + } + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Configure the Time Stamp TSEDGE and Enable bits */ + RTC->CTRL = (uint32_t)tmpregister; + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_EnableTimeStamp +*\*\fun Enables or disables the RTC TimeStamp functionality with the specified time stamp pin stimulating edge. +*\*\param RTC_TimeStampEdge : Specifies the pin edge on which the TimeStamp is activated. +*\*\ - RTC_TIMESTAMP_EDGE_RISING : the Time stamp event occurs on the rising edge of the related pin. +*\*\ - RTC_TIMESTAMP_EDGE_FALLING : the Time stamp event occurs on the falling edge of the related pin. + *\*\param Cmd : + *\*\ - ENABLE + *\*\ - DISABLE +*\*\return none +**/ +void RTC_EnableTimeStamp(uint32_t RTC_TimeStampEdge, FunctionalState Cmd) +{ + uint32_t tmpregister; + + /* Get the RTC_CTRL register and clear the bits to be configured */ + tmpregister = (uint32_t)(RTC->CTRL & (uint32_t) ~(RTC_CTRL_TEDGE | RTC_CTRL_TSEN)); + + /* Get the new configuration */ + if (Cmd != DISABLE) + { + tmpregister |= (uint32_t)(RTC_TimeStampEdge | RTC_CTRL_TSEN); + } + else + { + tmpregister |= (uint32_t)(RTC_TimeStampEdge); + } + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Configure the Time Stamp TSEDGE and Enable bits */ + RTC->CTRL = (uint32_t)tmpregister; + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_GetTimeStamp +*\*\fun Get the RTC TimeStamp value and masks. +*\*\param RTC_Format : specifies the format of the output parameters. +*\*\ - RTC_FORMAT_BIN : Binary data format +*\*\ - RTC_FORMAT_BCD : BCD data format +*\*\param RTC_StampTimeStruct : pointer to a RTC_TimeType structure that will +*\*\ contains the TimeStamp time values. +*\*\param RTC_StampDateStruct : pointer to a RTC_DateType structure that will +*\*\ contains the TimeStamp date values. +*\*\return none +**/ +void RTC_GetTimeStamp(uint32_t RTC_Format, RTC_TimeType* RTC_StampTimeStruct, RTC_DateType* RTC_StampDateStruct) +{ + uint32_t tmptime, tmpdate; + + /* Get the TimeStamp time and date registers values */ + tmptime = (uint32_t)(RTC->TST & RTC_TR_RESERVED_MASK); + tmpdate = (uint32_t)(RTC->TSD & RTC_DATE_RESERVED_MASK); + + /* Fill the Time structure fields with the read parameters */ + RTC_StampTimeStruct->Hours = (uint8_t)((tmptime & (RTC_TST_HOT | RTC_TST_HOU)) >> 16); + RTC_StampTimeStruct->Minutes = (uint8_t)((tmptime & (RTC_TST_MIT | RTC_TST_MIU)) >> 8); + RTC_StampTimeStruct->Seconds = (uint8_t)(tmptime & (RTC_TST_SET | RTC_TST_SEU)); + RTC_StampTimeStruct->H12 = (uint8_t)((tmptime & (RTC_TST_APM)) >> 16); + + /* Fill the Date structure fields with the read parameters */ + RTC_StampDateStruct->Month = (uint8_t)((tmpdate & (RTC_DATE_MOT | RTC_DATE_MOU)) >> 8); + RTC_StampDateStruct->Date = (uint8_t)(tmpdate & (RTC_DATE_DAT | RTC_DATE_DAU)); + RTC_StampDateStruct->WeekDay = (uint8_t)((tmpdate & (RTC_DATE_WDU)) >> 13); + + /* Check the input parameters format */ + if (RTC_Format == RTC_FORMAT_BIN) + { + /* Convert the Time structure parameters to Binary format */ + RTC_StampTimeStruct->Hours = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->Hours); + RTC_StampTimeStruct->Minutes = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->Minutes); + RTC_StampTimeStruct->Seconds = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->Seconds); + + /* Convert the Date structure parameters to Binary format */ + RTC_StampDateStruct->Month = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->Month); + RTC_StampDateStruct->Date = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->Date); + RTC_StampDateStruct->WeekDay = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->WeekDay); + } +} + +/** +*\*\name RTC_GetTimeStampSubSecond +*\*\fun Get the RTC timestamp Subseconds value. +*\*\param none +*\*\return RTC current timestamp Subseconds value. +**/ +uint32_t RTC_GetTimeStampSubSecond(void) +{ + /* Get timestamp subseconds values from the correspondent registers */ + return (uint32_t)(RTC->TSSS); +} + + +/** +*\*\name RTC_ConfigOutputType +*\*\fun Configures the RTC Output Pin mode. +*\*\param RTC_OutputType : specifies the RTC Output (PC13) pin mode. +*\*\ - RTC_OUTPUT_OPENDRAIN : RTC Output (PC13) is configured in Open Drain mode. +*\*\ - RTC_OUTPUT_PUSHPULL : RTC Output (PC13) is configured in Push Pull mode. +*\*\return none +**/ +void RTC_ConfigOutputType(uint32_t RTC_OutputType) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + RTC->OPT &= (uint32_t) ~(RTC_OPT_TYPE); + RTC->OPT |= (uint32_t)(RTC_OutputType); + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_ConfigPWREvtSig +*\*\fun Configures the RTC PWR event signal type. +*\*\param signal_type : +*\*\ - RTC_PWR_SIGNAL_PULSE +*\*\ - RTC_PWR_SIGNAL_LEVEL +*\*\return none +**/ +void RTC_ConfigPWREvtSig(uint32_t signal_type) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + RTC->OPT &= (uint32_t) ~(RTC_OPT_PWREST); + + RTC->OPT |= (uint32_t)(signal_type); + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_ConfigOutputPullUp +*\*\fun Configures the RTC Output PullUp . +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_ConfigOutputPullUp(FunctionalState Cmd) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + RTC->OPT &= (uint32_t) ~(RTC_OPT_OUTPU); + + if(Cmd != DISABLE) + { + RTC->OPT |= (uint32_t)(RTC_OPT_OUTPU); + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_EnableOutput2 +*\*\fun Enable or disable the RTC output2 . +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_EnableOutput2(FunctionalState Cmd) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (Cmd != DISABLE) + { + /* Enable the RTC output2 */ + RTC->OPT |= (uint32_t)RTC_OPT_OUTMAP; + } + else + { + /* Disable the RTC output2 */ + RTC->OPT &= (uint32_t)~RTC_OPT_OUTMAP; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_ConfigOutputDuty +*\*\fun Configures the RTC Output duty cycle. +*\*\param Cmd : +*\*\ - RTC_Output_Duty_50 +*\*\ - RTC_Output_Duty_DIV +*\*\return none +**/ +void RTC_ConfigOutputDuty(uint32_t duty_cycle) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + RTC->OPT &= (uint32_t) ~(RTC_Output_Duty_DIV); + + RTC->OPT |= (uint32_t)(duty_cycle); + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + + +/** +*\*\name RTC_ConfigSynchroShift +*\*\fun Configures the Synchronization Shift Control Settings. +*\*\param RTC_ShiftAdd1S : Select to add or not 1 second to the time Calendar. +*\*\ - RTC_SHIFT_SUB1S_DISABLE : Add one second to the clock calendar. +*\*\ - RTC_SHIFT_SUB1S_ENABLE : No effect. +*\*\param RTC_ShiftSubFS : Select the number of Second Fractions to Substitute. +*\*\ This parameter can be one any value from 0 to 0x7FFF. +*\*\return ErrorStatus : +*\*\ - SUCCESS : RTC Shift registers are configured +*\*\ - ERROR : RTC Shift registers are not configured +**/ +ErrorStatus RTC_ConfigSynchroShift(uint32_t RTC_ShiftAdd1S, uint32_t RTC_ShiftSubFS) +{ + ErrorStatus status; + uint32_t shpfcount = 0; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Check if a Shift is pending*/ + if ((RTC->INITSTS & RTC_INITSTS_SHOPF) != RESET) + { + /* Wait until the shift is completed*/ + while (((RTC->INITSTS & RTC_INITSTS_SHOPF) != RESET) && (shpfcount != SHPF_TIMEOUT)) + { + shpfcount++; + } + } + + /* Check if the Shift pending is completed or if there is no Shift operation at all*/ + if ((RTC->INITSTS & RTC_INITSTS_SHOPF) == RESET) + { + /* check if the reference clock detection is disabled */ + if ((RTC->CTRL & RTC_CTRL_REFCLKEN) == RESET) + { + /* Configure the Shift settings */ + RTC->SCTRL = (uint32_t)(uint32_t)(RTC_ShiftSubFS) | (uint32_t)(RTC_ShiftAdd1S); + + if (RTC_WaitForSynchro() == ERROR) + { + status = ERROR; + } + else + { + status = SUCCESS; + } + } + else + { + status = ERROR; + } + } + else + { + status = ERROR; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + + return (ErrorStatus)(status); +} + + +/** +*\*\name RTC_ConfigInt +*\*\fun Enables or disables the specified RTC interrupts. +*\*\param RTC_INT : specifies the RTC interrupt sources to be enabled . +*\*\ - RTC_INT_TS : TimeStamp interrupt mask. +*\*\ - RTC_INT_WUT : WakeUp Timer interrupt mask. +*\*\ - RTC_INT_ALRB : Alarm B interrupt mask. +*\*\ - RTC_INT_ALRA : Alarm A interrupt mask. +*\*\ - RTC_INT_CAOV : Calendar overflow interrupt mask. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_ConfigInt(uint32_t RTC_INT, FunctionalState Cmd) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (Cmd != DISABLE) + { + /* Configure the Interrupts in the RTC_CTRL register */ + RTC->CTRL |= (uint32_t)RTC_INT; + } + else + { + /* Configure the Interrupts in the RTC_CTRL register */ + RTC->CTRL &= (uint32_t) ~(RTC_INT); + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_GetFlagStatus +*\*\fun Checks whether the specified RTC flag is set or not. +*\*\param RTC_FLAG : specifies the flag to check. +*\*\ - RTC_FLAG_BPRAM_ERFRF : BKP_SRAM erase operation is in progress flag +*\*\ - RTC_FLAG_ITISF : Internal Time Stamp event flag. +*\*\ - RTC_FLAG_CALOVF : Calendar Overflow flag. +*\*\ - RTC_FLAG_TAMP8F : Tamp8 detect flag. +*\*\ - RTC_FLAG_TAMP7F : Tamp7 detect flag. +*\*\ - RTC_FLAG_TAMP6F : Tamp6 detect flag. +*\*\ - RTC_FLAG_TAMP5F : Tamp5 detect flag. +*\*\ - RTC_FLAG_TAMP4F : Tamp4 detect flag. +*\*\ - RTC_FLAG_RECPF : RECALPF event flag. +*\*\ - RTC_FLAG_TAMP3F : Tamp3 detect flag. +*\*\ - RTC_FLAG_TAMP2F : Tamp2 detect flag. +*\*\ - RTC_FLAG_TAMP1F : Tamp1 detect flag. +*\*\ - RTC_FLAG_TISOVF : Time Stamp OverFlow flag. +*\*\ - RTC_FLAG_TISF : Time Stamp event flag. +*\*\ - RTC_FLAG_WTF : WakeUp Timer flag. +*\*\ - RTC_FLAG_ALBF : Alarm B flag. +*\*\ - RTC_FLAG_ALAF : Alarm A flag. +*\*\ - RTC_FLAG_INITF : Initialization mode flag. +*\*\ - RTC_FLAG_RSYF : Registers Synchronized flag. +*\*\ - RTC_FLAG_INITSF : Registers Configured flag. +*\*\ - RTC_FLAG_SHOPF : Shift operation pending flag. +*\*\ - RTC_FLAG_WTWF : WakeUp Timer Write flag. +*\*\ - RTC_FLAG_ALBWF : Alarm B Write flag. +*\*\ - RTC_FLAG_ALAWF : Alarm A write flag. +*\*\return FlagStatus +*\*\ - SET : the flag is set +*\*\ - RESET : the flag is reset +**/ +FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG) +{ + FlagStatus bitstatus; + uint32_t tmpregister; + + /* Get all the flags */ + tmpregister = (uint32_t)(RTC->INITSTS & RTC_FLAGS_MASK); + + /* Return the status of the flag */ + if ((tmpregister & RTC_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name RTC_ClrFlag +*\*\fun Clears the RTC's flags. +*\*\param RTC_FLAG : RTC_FLAG specifies the RTC flag to clear. +*\*\ - RTC_FLAG_ITISF : Internal Time Stamp event flag. +*\*\ - RTC_FLAG_CALOVF : Calendar Overflow flag. +*\*\ - RTC_FLAG_TAMP8F : Tamp8 detect flag. +*\*\ - RTC_FLAG_TAMP7F : Tamp7 detect flag. +*\*\ - RTC_FLAG_TAMP6F : Tamp6 detect flag. +*\*\ - RTC_FLAG_TAMP5F : Tamp5 detect flag. +*\*\ - RTC_FLAG_TAMP4F : Tamp4 detect flag. +*\*\ - RTC_FLAG_TAMP3F : Tamp3 detect flag. +*\*\ - RTC_FLAG_TAMP2F : Tamp2 detect flag. +*\*\ - RTC_FLAG_TAMP1F : Tamp1 detect flag. +*\*\ - RTC_FLAG_TISOVF : Time Stamp Overflow flag. +*\*\ - RTC_FLAG_TISF : Time Stamp event flag. +*\*\ - RTC_FLAG_WTF : WakeUp Timer flag +*\*\ - RTC_FLAG_ALBF : Alarm B flag. +*\*\ - RTC_FLAG_ALAF : Alarm A flag. +*\*\ - RTC_FLAG_RSYF : Registers Synchronized flag. +*\*\return none +**/ +void RTC_ClrFlag(uint32_t RTC_FLAG) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Clear the Flags in the RTC_INITSTS register */ + RTC->INITSTS = (uint32_t)((uint32_t)(~((RTC_FLAG | RTC_INITSTS_INITM) & (uint32_t)0x00FFFFFF) | + (uint32_t)(RTC->INITSTS & RTC_INITSTS_INITM))); + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_GetITStatus +*\*\fun Checks whether the specified RTC interrupt has occurred or not. +*\*\param RTC_INT : specifies the RTC interrupt source to check. +*\*\ - RTC_INT_CAOV : Calendar overflow interrupt. +*\*\ - RTC_INT_TAMP8 : Tamper8 interrupt. +*\*\ - RTC_INT_TAMP7 : Tamper7 interrupt. +*\*\ - RTC_INT_TAMP6 : Tamper6 interrupt. +*\*\ - RTC_INT_TAMP5 : Tamper5 interrupt. +*\*\ - RTC_INT_TAMP4 : Tamper4 interrupt. +*\*\ - RTC_INT_TAMP3 : Tamper3 interrupt. +*\*\ - RTC_INT_TAMP2 : Tamper2 interrupt. +*\*\ - RTC_INT_TAMP1 : Tamper1 interrupt. +*\*\ - RTC_INT_TS : Timestamp interrupt. +*\*\ - RTC_INT_WUT : WakeUp Timer interrupt. +*\*\ - RTC_INT_ALRB : Alarm B interrupt. +*\*\ - RTC_INT_ALRA : Alarm A interrupt. +*\*\return INTStatus +*\*\ - SET : the flag is set +*\*\ - RESET : the flag is reset +**/ +INTStatus RTC_GetITStatus(uint32_t RTC_INT) +{ + INTStatus bitstatus; + uint32_t tmpregister, enablestatus = 0; + uint32_t tamperEnable; + uint32_t tampernum; + uint8_t i; + + /* Get the Interrupt enable Status */ + if ((RTC_INT == RTC_INT_TAMP1) || (RTC_INT == RTC_INT_TAMP2) || (RTC_INT == RTC_INT_TAMP3) || + (RTC_INT == RTC_INT_TAMP4) || (RTC_INT == RTC_INT_TAMP5) || (RTC_INT == RTC_INT_TAMP6) || + (RTC_INT == RTC_INT_TAMP7) || (RTC_INT == RTC_INT_TAMP8)) + { + for(i = 0; i < 9; i++) + { + if((RTC_INT >> (i + 17)) & (uint32_t)0x01) + { + if(i < 3) + { + tampernum = i; + break; + } + else if(i > 3) + { + tampernum = i - 1; + break; + } + } + } + + tamperEnable = RTC->TMPCTRL[tampernum] & RTC_TMPCTRL_TPINTEN; + + if (tamperEnable != (uint32_t)RESET) + { + enablestatus = (uint32_t)0x00000001; + } + } + else + { + enablestatus = (uint32_t)((RTC->CTRL & RTC_INT)); + } + + if(RTC_INT == RTC_INT_CAOV) + { + /* Get the Interrupt pending bit */ + tmpregister = (uint32_t)((RTC->INITSTS & (uint32_t)(RTC_INT >> 5))); + } + else + { + /* Get the Interrupt pending bit */ + tmpregister = (uint32_t)((RTC->INITSTS & (uint32_t)(RTC_INT >> 4))); + } + + /* Get the status of the Interrupt */ + if ((enablestatus != (uint32_t)RESET) && ((tmpregister & (uint32_t)0x001FFFFF) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name RTC_ClrIntPendingBit +*\*\fun Clears the RTC's interrupt pending bits. +*\*\param RTC_INT : specifies the RTC interrupt pending bit to clear. +*\*\ - RTC_INT_CAOV : Calendar overflow interrupt. +*\*\ - RTC_INT_TAMP8 : Tamper8 interrupt. +*\*\ - RTC_INT_TAMP7 : Tamper7 interrupt. +*\*\ - RTC_INT_TAMP6 : Tamper6 interrupt. +*\*\ - RTC_INT_TAMP5 : Tamper5 interrupt. +*\*\ - RTC_INT_TAMP4 : Tamper4 interrupt. +*\*\ - RTC_INT_TAMP3 : Tamper3 interrupt. +*\*\ - RTC_INT_TAMP2 : Tamper2 interrupt. +*\*\ - RTC_INT_TAMP1 : Tamper1 interrupt. +*\*\ - RTC_INT_TS : Timestamp interrupt. +*\*\ - RTC_INT_WUT : WakeUp Timer interrupt +*\*\ - RTC_INT_ALRB : Alarm B interrupt +*\*\ - RTC_INT_ALRA : Alarm A interrupt +*\*\return none +**/ +void RTC_ClrIntPendingBit(uint32_t RTC_INT) +{ + uint32_t tmpregister; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Get the RTC_INITSTS Interrupt pending bits mask */ + tmpregister = (uint32_t)(RTC_INT >> 4); + + /* Clear the interrupt pending bits in the RTC_INITSTS register */ + RTC->INITSTS = (uint32_t)((uint32_t)(~((tmpregister | RTC_INITSTS_INITM) & (uint32_t)0x01FFFFFF) | + (uint32_t)(RTC->INITSTS & RTC_INITSTS_INITM))); + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_TamperTriggerConfig +*\*\fun Configures the select Tamper pin edge. +*\*\param RTC_Tamper: Selected tamper pin. +*\*\ - RTC_TAMPER_1: Select Tamper 1. +*\*\ - RTC_TAMPER_2: Select Tamper 2. +*\*\ - RTC_TAMPER_3: Select Tamper 3. +*\*\ - RTC_TAMPER_4: Select Tamper 4. +*\*\ - RTC_TAMPER_5: Select Tamper 5. +*\*\ - RTC_TAMPER_6: Select Tamper 6. +*\*\ - RTC_TAMPER_7: Select Tamper 7. +*\*\ - RTC_TAMPER_8: Select Tamper 8. +*\*\param RTC_TamperTrigger: Specifies the trigger on the tamper pin that stimulates tamper event. +*\*\ - RTC_TamperTrigger_RisingEdge: Rising Edge of the tamper pin causes tamper event. +*\*\ - RTC_TamperTrigger_FallingEdge: Falling Edge of the tamper pin causes tamper event. +*\*\ - RTC_TamperTrigger_LowLevel: Low Level of the tamper pin causes tamper event. +*\*\ - RTC_TamperTrigger_HighLevel: High Level of the tamper pin causes tamper event. +*\*\return none +**/ +void RTC_TamperTriggerConfig(uint32_t RTC_Tamper, uint32_t RTC_TamperTrigger) +{ + uint32_t tmaper_trigger = RTC_TamperTrigger; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + RTC->TMPCTRL[RTC_Tamper] &= (uint32_t)(~RTC_TMPCTRL_TPTRG); + + /* Configure the RTC_TAMPCTRL register */ + RTC->TMPCTRL[RTC_Tamper] |= tmaper_trigger; + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; + +} + +/** +*\*\name RTC_TamperCmd +*\*\fun Enables or disables the specified Tamper detection. +*\*\param RTC_Tamper: Selected tamper pin. +*\*\ - RTC_TAMPER_1: Select Tamper 1. +*\*\ - RTC_TAMPER_2: Select Tamper 2. +*\*\ - RTC_TAMPER_3: Select Tamper 3. +*\*\ - RTC_TAMPER_4: Select Tamper 4. +*\*\ - RTC_TAMPER_5: Select Tamper 5. +*\*\ - RTC_TAMPER_6: Select Tamper 6. +*\*\ - RTC_TAMPER_7: Select Tamper 7. +*\*\ - RTC_TAMPER_8: Select Tamper 8. +*\*\param NewState : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_TamperCmd(uint32_t RTC_Tamper, FunctionalState NewState) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (NewState != DISABLE) + { + /* Enable the selected Tamper pin */ + RTC->TMPCTRL[RTC_Tamper] |= (uint32_t)RTC_TMPCTRL_TPEN; + } + else + { + /* Disable the selected Tamper pin */ + RTC->TMPCTRL[RTC_Tamper] &= (uint32_t)~RTC_TMPCTRL_TPEN; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_TamperFilterConfig +*\*\fun Configures the Tampers Filter. +*\*\param RTC_TamperFilter: Selected tamper pin. +*\*\ - RTC_TamperFilter_Disable: Tamper filter is disabled. +*\*\ - RTC_TamperFilter_2Sample: Tamper is activated after 2 consecutive samples at the active level. +*\*\ - RTC_TamperFilter_4Sample: Tamper is activated after 4 consecutive samples at the active level. +*\*\ - RTC_TamperFilter_8Sample: Tamper is activated after 8 consecutive samples at the active level. +*\*\return none +**/ +void RTC_TamperFilterConfig(uint32_t RTC_TamperFilter) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Clear TAMPFLT[1:0] bits in the RTC_TAMPCR register */ + RTC->TMPCFG &= (uint32_t)~(RTC_TMPCFG_TPFLT); + + /* Configure the RTC_TAMPCR register */ + RTC->TMPCFG |= (uint32_t)RTC_TamperFilter; + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_TamperSamplingFreqConfig +*\*\fun Configures the Tampers Sampling Frequency. +*\*\param RTC_TamperSamplingFreq: Selected tamper pin. +*\*\ - RTC_TamperSamplingFreq_RTCCLK_Div32768 +*\*\ - RTC_TamperSamplingFreq_RTCCLK_Div16384 +*\*\ - RTC_TamperSamplingFreq_RTCCLK_Div8192 +*\*\ - RTC_TamperSamplingFreq_RTCCLK_Div4096 +*\*\ - RTC_TamperSamplingFreq_RTCCLK_Div2048 +*\*\ - RTC_TamperSamplingFreq_RTCCLK_Div1024 +*\*\ - RTC_TamperSamplingFreq_RTCCLK_Div512 +*\*\ - RTC_TamperSamplingFreq_RTCCLK_Div256 +*\*\return none +**/ +void RTC_TamperSamplingFreqConfig(uint32_t RTC_TamperSamplingFreq) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Clear TAMPFREQ[2:0] bits in the RTC_TAMPCR register */ + RTC->TMPCFG &= (uint32_t)~(RTC_TAMPCR_TAMPFREQ); + + /* Configure the RTC_TAMPCR register */ + RTC->TMPCFG |= (uint32_t)RTC_TamperSamplingFreq; + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_TamperPinsPrechargeDuration +*\*\fun Configures the Tampers Pins input Precharge Duration. +*\*\param RTC_TamperPrechargeDuration: Selected tamper pin. +*\*\ - RTC_TamperPrechargeDuration_1RTCCLK +*\*\ - RTC_TamperPrechargeDuration_2RTCCLK +*\*\ - RTC_TamperPrechargeDuration_4RTCCLK +*\*\ - RTC_TamperPrechargeDuration_8RTCCLK +*\*\return none +**/ +void RTC_TamperPinsPrechargeDuration(uint32_t RTC_TamperPrechargeDuration) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + /* Clear TAMPPRCH[1:0] bits in the RTC_TAMPCR register */ + RTC->TMPCFG &= (uint32_t)~(RTC_TMPCFG_TPPRCH); + + /* Configure the RTC_TAMPCR register */ + RTC->TMPCFG |= (uint32_t)RTC_TamperPrechargeDuration; + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + + +/** +*\*\name RTC_TimeStampOnTamperDetectionCmd +*\*\fun The timestamp is valid or invalid even the TSEN bit in tamper control register is reset. +*\*\param NewState : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_TimeStampOnTamperDetectionCmd(FunctionalState NewState) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (NewState != DISABLE) + { + /* Save timestamp on tamper detection event */ + RTC->TMPCFG |= (uint32_t)RTC_TMPCFG_TPTS; + } + else + { + /* Tamper detection does not cause a timestamp to be saved */ + RTC->TMPCFG &= (uint32_t)~RTC_TMPCFG_TPTS; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_TamperPullUpCmd +*\*\fun Enables or disables the Precharge of Tamper pin. +*\*\param NewState : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_TamperPullUpCmd(FunctionalState NewState) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (NewState != DISABLE) + { + /* Enable precharge of the selected Tamper pin */ + RTC->TMPCFG &= (uint32_t)~RTC_TMPCFG_TPPUDIS; + } + else + { + /* Disable precharge of the selected Tamper pin */ + RTC->TMPCFG |= (uint32_t)RTC_TMPCFG_TPPUDIS; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_EnableTampErase +*\*\fun Enables or disables the tamper event erase backup register. +*\*\param RTC_Tamper: Selected tamper event. +*\*\ - RTC_TAMPER_1: Select Tamper 1 erase backup register. +*\*\ - RTC_TAMPER_2: Select Tamper 2 erase backup register. +*\*\ - RTC_TAMPER_3: Select Tamper 3 erase backup register. +*\*\ - RTC_TAMPER_4: Select Tamper 4 erase backup register. +*\*\ - RTC_TAMPER_5: Select Tamper 5 erase backup register. +*\*\ - RTC_TAMPER_6: Select Tamper 6 erase backup register. +*\*\ - RTC_TAMPER_7: Select Tamper 7 erase backup register. +*\*\ - RTC_TAMPER_8: Select Tamper 8 erase backup register. +*\*\param NewState : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_EnableTampErase(uint32_t RTC_Tamper, FunctionalState NewState) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (NewState != DISABLE) + { + /* Enable tamper event erase backup register */ + RTC->TMPCTRL[RTC_Tamper] &= (uint32_t)~RTC_TMPCTRL_TPNOE; + } + else + { + /* Disable tamper event erase backup register */ + RTC->TMPCTRL[RTC_Tamper] |= (uint32_t)RTC_TMPCTRL_TPNOE; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_TamperAllIECmd +*\*\fun Enables or disables all Tamper interrupt. +*\*\param RTC_Tamper: Selected tamper pin. +*\*\ - RTC_TAMPER_1: Select Tamper 1. +*\*\ - RTC_TAMPER_2: Select Tamper 2. +*\*\ - RTC_TAMPER_3: Select Tamper 3. +*\*\ - RTC_TAMPER_4: Select Tamper 4. +*\*\ - RTC_TAMPER_5: Select Tamper 5. +*\*\ - RTC_TAMPER_6: Select Tamper 6. +*\*\ - RTC_TAMPER_7: Select Tamper 7. +*\*\ - RTC_TAMPER_8: Select Tamper 8. +*\*\param NewState : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_TamperMskCmd(uint32_t RTC_Tamper, FunctionalState NewState) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (NewState != DISABLE) + { + /* Enable the selected Tamper mask */ + RTC->TMPCTRL[RTC_Tamper] |= (uint32_t)RTC_TMPCTRL_TPMF; + } + else + { + /* Disable the selected Tamper mask */ + RTC->TMPCTRL[RTC_Tamper] &= (uint32_t)~RTC_TMPCTRL_TPMF; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + + +/** +*\*\name RTC_TamperIECmd +*\*\fun Enables or disables the Tamper interrupt. +*\*\param RTC_Tamper: Selected tamper pin. +*\*\ - RTC_TAMPER_1: Select Tamper 1. +*\*\ - RTC_TAMPER_2: Select Tamper 2. +*\*\ - RTC_TAMPER_3: Select Tamper 3. +*\*\ - RTC_TAMPER_4: Select Tamper 4. +*\*\ - RTC_TAMPER_5: Select Tamper 5. +*\*\ - RTC_TAMPER_6: Select Tamper 6. +*\*\ - RTC_TAMPER_7: Select Tamper 7. +*\*\ - RTC_TAMPER_8: Select Tamper 8. +*\*\param NewState : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void RTC_TamperIECmd(uint32_t RTC_Tamper, FunctionalState NewState) +{ + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + if (NewState != DISABLE) + { + /* Enable the selected Tamper pin */ + RTC->TMPCTRL[RTC_Tamper] |= (uint32_t)RTC_TMPCTRL_TPINTEN; + } + else + { + /* Disable the selected Tamper pin */ + RTC->TMPCTRL[RTC_Tamper] &= (uint32_t)~RTC_TMPCTRL_TPINTEN; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_BKUPRgWrite +*\*\fun Write data to backup register. +*\*\param register_num: register_num value can be from 1 to 32 +*\*\param Data : Data write to backup register +*\*\return none +**/ +void RTC_BKUPRgWrite(uint8_t register_num, uint32_t Data) +{ + uint32_t tmpregister; + + /* Disable the write protection for RTC registers */ + RTC->WRP = 0xCA; + RTC->WRP = 0x53; + + tmpregister = (uint32_t) & (RTC->BKP1); + + if(register_num > 0 && register_num <= 32) + { + tmpregister += (((uint32_t)register_num - 1) * 4); + /* Write data to specified register */ + *(__IO uint32_t *)tmpregister = Data; + } + + /* Enable the write protection for RTC registers */ + RTC->WRP = 0xFF; +} + +/** +*\*\name RTC_BKUPRgRead +*\*\fun Read data from backup register. +*\*\param register_num: register_num value can be from 1 to 32 +*\*\param Data : Data write to backup register +*\*\return none +**/ +uint32_t RTC_BKUPRgRead(uint8_t register_num) +{ + uint32_t tmpregister, value = 0; + + tmpregister = (uint32_t) & (RTC->BKP1); + + if(register_num > 0 && register_num <= 32) + { + tmpregister += (((uint32_t)register_num - 1) * 4); + value = *(__IO uint32_t *)tmpregister; + } + + return value; +} + +/** +*\*\name RTC_ByteToBcd2 +*\*\fun Converts a 2 digit decimal to BCD format. +*\*\param value : Value Byte to be converted. +*\*\return Converted byte +**/ +static uint8_t RTC_ByteToBcd2(uint8_t Value) +{ + uint8_t bcdhigh = 0; + uint8_t temp_value = Value; + + while (temp_value >= 10) + { + bcdhigh++; + temp_value -= 10; + } + + return ((uint8_t)(bcdhigh << 4) | temp_value); +} + +/** +*\*\name RTC_Bcd2ToByte +*\*\fun Convert from 2 digit BCD to Binary. +*\*\param Value : Value BCD value to be converted. +*\*\return Converted byte +**/ +static uint8_t RTC_Bcd2ToByte(uint8_t Value) +{ + uint8_t tmp; + tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10; + return (tmp + (Value & (uint8_t)0x0F)); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_sdmmc.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_sdmmc.c new file mode 100644 index 0000000000..191cbd9ca7 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_sdmmc.c @@ -0,0 +1,2879 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_sdmmc.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_sdmmc.h" +#include "n32h76x_78x_rcc.h" + +/** + *\*\name SDMMC_DeInit. + *\*\fun Reset the SDMMCx peripheral registers to their default reset values. + *\*\param SDMMCx : + *\*\ - SDMMC1 + *\*\ - SDMMC2 + *\*\return none + */ +void SDMMC_DeInit(SDMMC_Module* SDMMCx) +{ + if (SDMMCx == SDMMC1) + { + RCC_EnableAXIPeriphReset1(RCC_AXI_PERIPHRST_SDMMC1); + RCC_EnableAXIPeriphReset1(RCC_AXI_PERIPHRST_SDHOST1); + } + else if (SDMMCx == SDMMC2) + { + RCC_EnableAHB1PeriphReset1(RCC_AHB1_PERIPHRST_SDMMC2); + RCC_EnableAHB1PeriphReset1(RCC_AHB1_PERIPHRST_SDHOST2); + } + else + { + /* no process */ + } +} + + +/** + *\*\name SDMMC_WrapperConfig. + *\*\fun Initializes the SDMMC peripheral according to the specified + *\*\ parameters in the SDMMC_WrapperParam. + *\*\fun Configure SDMMC wrapper register values. + *\*\param SDMMCx pointer to specified SDMMC,must be one of the following value: + *\*\ - SDMMC1 + *\*\ - SDMMC2 + *\*\param SDMMC_WrapperParam: pointer to a SDMMC_WrapperType structure. + *\*\ - MaxBlockLen : Maximum Block Length supported by the Core/Device + *\*\ - SDMMC_MAXBLOCKLEN_512B + *\*\ - SDMMC_MAXBLOCKLEN_1024B + *\*\ - SDMMC_MAXBLOCKLEN_2048B + *\*\ - SDBaseCLKFreq : xin_clk, Base Clock Frequency for SD Clock + *\*\ - 0x0A~0x68,Unit MHz + *\*\ - TimeOutUnit : the unit of base clock frequency used to detect Data Timeout Error + *\*\ - SDMMC_TIMEOUTCLKUNIT_KHZ + *\*\ - SDMMC_TIMEOUTCLKUNIT_MHZ + *\*\ - TuningCNT : the number of delay taps that are supported for tuning the rxclk_in + *\*\ - 0x00~0x20 + *\*\ - WKUPSignalMode : Wakeup Signal Generation Mode + *\*\ - SDMMC_SYNCWKUP + *\*\ - SDMMC_ASYNCWKUP + *\*\ - SPIBlockMode : SPI Block Mode + *\*\ - SDMMC_SPIBLOCKMODESUPPORT + *\*\ - SDMMC_SPIBLOCKMODEUNSUPPORT + *\*\ - SPIMode : SPI Mode Support + *\*\ - SDMMC_SPIMODESUPPORT + *\*\ - SDMMC_SPIMODEUNSUPPORT + *\*\ - DDR50 : DDR50 Support + *\*\ - SDMMC_DDR50SUPPORT + *\*\ - SDMMC_DDR50UNSUPPORT + *\*\ - SDR104 : SDR104 Support + *\*\ - SDMMC_SDR104SUPPORT + *\*\ - SDMMC_SDR104UNSUPPORT + *\*\ - SDR50 : SDR50 Support + *\*\ - SDMMC_SDR50SUPPORT + *\*\ - SDMMC_SDR50UNSUPPORT + *\*\ - SlotType : Slot Type + *\*\ - SDMMC_SDTYPE + *\*\ - SDMMC_EMMCTYPE + *\*\ - AsyncInt : Asynchronous Interrupt Support + *\*\ - SDMMC_ASYNCINTSUPPORT + *\*\ - SDMMC_ASYNCINTUNSUPPORT + *\*\ - Suspend_Resume : Suspend/Resume Support + *\*\ - SDMMC_SUSRESSUPPORT + *\*\ - SDMMC_SUSRESUNSUPPORT + *\*\ - SDMA : SDMA Support + *\*\ - SDMMC_SDMASUPPORT + *\*\ - SDMMC_SDMAUNSUPPORT + *\*\ - HS : High Speed Support + *\*\ - SDMMC_HSSUPPORT + *\*\ - SDMMC_HSUNSUPPORT + *\*\ - ADMA2 : ADMA2 Support + *\*\ - SDMMC_ADMA2SUPPORT + *\*\ - SDMMC_ADMA2UNSUPPORT + *\*\ - Embedded_8bit : 8-bit Support for Embedded Device + *\*\ - SDMMC_EMBEDDEDSUPPORT + *\*\ - SDMMC_EMBEDDEDUNSUPPORT + *\*\ - UseTuningSDR50 : Use Tuning for SDR50 + *\*\ - SDMMC_SDR50TUNING + *\*\ - SDMMC_SDR50UNTUNING + *\*\ - DSSDCLKFreq : SDCLK Frequency Select Value for Default Speed + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - INITSDCLKFreq :SDCLK Frequency Select Value for Initialization + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - SDR12SDCLKFreq : SDCLK Frequency Select Value for SDR12 + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - HSSDCLKFreq : SDCLK Frequency Select Value for High Speed + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - SDR50SDCLKFreq : SDCLK Frequency Select Value for SDR50 + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - SDR25SDCLKFreq : SDCLK Frequency Select Value for SDR25 + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - SDR104SDCLKFreq : SDCLK Frequency Select Value for SDR104 + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - DDR50SDCLKFreq : SDCLK Frequency Select Value for DDR50 + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + *\*\note This function can only be used when SDMMC is not working. + *\* Call configuration support function before SD initialization. + */ +ErrorStatus SDMMC_WrapperConfig(SDMMC_Module* SDMMCx, SDMMC_WrapperType *SDMMC_WrapperParam) +{ + uint32_t tempReg; + SDHOST_Module* SDHOSTx; + + if(SDMMCx == SDMMC1) + { + SDHOSTx = SDHOST1; + } + else + { + SDHOSTx = SDHOST2; + } + + /* The SDMMC registers can only be configured when SDMMC is not operational */ + if((SDHOSTx->PRESTS & (SDHOST_PRESTS_RTRANACT | SDHOST_PRESTS_WTRANACT)) != RESET) + { + return ERROR; + } + + /* Configure SDMMC_CFG1, including block length, xin_clk size,Timeout Clock Unit, + Tuning Count, Wakeup Signal Generation Mode */ + tempReg = SDMMCx->CFG1; + tempReg &= (~(SDMMC_CFG1_MBL | SDMMC_CFG1_BCLKF | SDMMC_CFG1_TCLKU | SDMMC_CFG1_TCNT | SDMMC_CFG1_WSGM)); + tempReg |= (SDMMC_WrapperParam->MaxBlockLen | (SDMMC_WrapperParam->SDBaseCLKFreq << SDMMC_CFG1_BCLKF_OFFSET) | SDMMC_WrapperParam->TimeOutUnit \ + | (SDMMC_WrapperParam->TuningCNT << SDMMC_CFG1_TCNT_OFFSET) | SDMMC_WrapperParam->WKUPSignalMode); + SDMMCx->CFG1 = tempReg; + + /* Configure SDMMC_CFG2, including SPI block mode, SPI mode,DDR50,SDR104,SDR50,Slot Type, + Asynchronous Interrupt,Suspend/Resume Support,SDMA,HS,ADMA2,8-bit Support for Embedded Device */ + tempReg = SDMMCx->CFG2; + tempReg &= (~(SDMMC_CFG2_SPIBMOD | SDMMC_CFG2_SPIMOD | SDMMC_CFG2_DDR50 | SDMMC_CFG2_SDR104 | SDMMC_CFG2_SDR50 \ + | SDMMC_CFG2_STYP | SDMMC_CFG2_ASYNCINT | SDMMC_CFG2_SDMA | SDMMC_CFG2_HS | SDMMC_CFG2_ADMA2 | SDMMC_CFG2_EMBUS)); + tempReg |= (SDMMC_WrapperParam->SPIBlockMode | SDMMC_WrapperParam->SPIMode | SDMMC_WrapperParam->DDR50 \ + | SDMMC_WrapperParam->SDR104 | SDMMC_WrapperParam->SDR50 | SDMMC_WrapperParam->SlotType \ + | SDMMC_WrapperParam->AsyncInt | SDMMC_WrapperParam->Suspend_Resume | SDMMC_WrapperParam->SDMA \ + | SDMMC_WrapperParam->HS | SDMMC_WrapperParam->ADMA2 | SDMMC_WrapperParam->Embedded_8bit); + SDMMCx->CFG2 = tempReg; + + /* Configure SDMMC_CFG3, including Use Tuning for SDR50 */ + tempReg = SDMMCx->CFG3; + tempReg &= (~SDMMC_CFG3_UTFSDR50); + tempReg |= SDMMC_WrapperParam->UseTuningSDR50; + SDMMCx->CFG3 = tempReg; + + /* Configure SDMMC_PV0CTRL, including SDCLK Frequency Select Value for Default Speed and Initialization */ + tempReg = SDMMCx->PV0CTRL; + tempReg &= (~(SDMMC_PV0CTRL_CLKFS_DS | SDMMC_PV0CTRL_CLKFS_INIT)); + tempReg |= ((SDMMC_WrapperParam->DSSDCLKFreq << SDMMC_PV0CTRL_CLKFS_OFFSET) | SDMMC_WrapperParam->INITSDCLKFreq); + SDMMCx->PV0CTRL = tempReg; + + /* Configure SDMMC_PV1CTRL, including SDCLK Frequency Select Value for SDR12 and HS */ + tempReg = SDMMCx->PV1CTRL; + tempReg &= (~(SDMMC_PV1CTRL_CLKFS_SDR12 | SDMMC_PV1CTRL_CLKFS_HS)); + tempReg |= ((SDMMC_WrapperParam->SDR12SDCLKFreq << SDMMC_PV0CTRL_CLKFS_OFFSET) | SDMMC_WrapperParam->HSSDCLKFreq); + SDMMCx->PV1CTRL = tempReg; + + /* Configure SDMMC_PV2CTRL, including SDCLK Frequency Select Value for SDR50 and SDR25 */ + tempReg = SDMMCx->PV2CTRL; + tempReg &= (~(SDMMC_PV2CTRL_CLKFS_SDR50 | SDMMC_PV2CTRL_CLKFS_SDR25)); + tempReg |= ((SDMMC_WrapperParam->SDR50SDCLKFreq << SDMMC_PV0CTRL_CLKFS_OFFSET) | SDMMC_WrapperParam->SDR25SDCLKFreq); + SDMMCx->PV2CTRL = tempReg; + + /* Configure SDMMC_PV3CTRL, including SDCLK Frequency Select Value for DDR50 and SDR104 */ + tempReg = SDMMCx->PV3CTRL; + tempReg &= (~(SDMMC_PV3CTRL_CLKFS_SDR104 | SDMMC_PV3CTRL_CLKFS_DDR50)); + tempReg |= ((SDMMC_WrapperParam->SDR104SDCLKFreq << SDMMC_PV0CTRL_CLKFS_OFFSET) | SDMMC_WrapperParam->DDR50SDCLKFreq); + SDMMCx->PV3CTRL = tempReg; + + return SUCCESS; +} + + +/** + *\*\name SDMMC_StructWrapperInit. + *\*\fun Fills each SDMMC_WrapperStruct member with its default value. + *\*\param SDMMC_WrapperStruct: pointer to a SDMMC_WrapperType structure. + *\*\ - MaxBlockLen + *\*\ - SDBaseCLKFreq + *\*\ - TimeOutUnit + *\*\ - TuningCNT + *\*\ - WKUPSignalMode + *\*\ - SPIBlockMode + *\*\ - SPIMode + *\*\ - DDR50 + *\*\ - SDR104 + *\*\ - SDR50 + *\*\ - SlotType + *\*\ - AsyncInt + *\*\ - Suspend_Resume + *\*\ - SDMA + *\*\ - HS + *\*\ - ADMA2 + *\*\ - Embedded_8bit + *\*\ - UseTuningSDR50 + *\*\ - DSSDCLKFreq + *\*\ - INITSDCLKFreq + *\*\ - SDR12SDCLKFreq + *\*\ - HSSDCLKFreq + *\*\ - SDR50SDCLKFreq + *\*\ - SDR25SDCLKFreq + *\*\ - SDR104SDCLKFreq + *\*\ - DDR50SDCLKFreq + *\*\return none + */ +void SDMMC_StructWrapperInit(SDMMC_WrapperType *SDMMC_WrapperStruct) +{ + /* SDMMC_WrapperStruct members default value */ + SDMMC_WrapperStruct->MaxBlockLen = SDMMC_MAXBLOCKLEN_512B; + SDMMC_WrapperStruct->SDBaseCLKFreq = 0x68; + SDMMC_WrapperStruct->TimeOutUnit = SDMMC_TIMEOUTCLKUNIT_KHZ; + SDMMC_WrapperStruct->TuningCNT = 0x20; + SDMMC_WrapperStruct->WKUPSignalMode = SDMMC_ASYNCWKUP; + SDMMC_WrapperStruct->SPIBlockMode = SDMMC_SPIBLOCKMODEUNSUPPORT; + SDMMC_WrapperStruct->SPIMode = SDMMC_SPIMODEUNSUPPORT; + SDMMC_WrapperStruct->DDR50 = SDMMC_DDR50SUPPORT; + SDMMC_WrapperStruct->SDR104 = SDMMC_SDR104SUPPORT; + SDMMC_WrapperStruct->SDR50 = SDMMC_SDR50SUPPORT; + SDMMC_WrapperStruct->SlotType = SDMMC_SDTYPE; + SDMMC_WrapperStruct->AsyncInt = SDMMC_ASYNCINTSUPPORT; + SDMMC_WrapperStruct->Suspend_Resume = SDMMC_SUSRESUNSUPPORT; + SDMMC_WrapperStruct->SDMA = SDMMC_SDMASUPPORT; + SDMMC_WrapperStruct->HS = SDMMC_HSSUPPORT; + SDMMC_WrapperStruct->ADMA2 = SDMMC_ADMA2SUPPORT; + SDMMC_WrapperStruct->Embedded_8bit = SDMMC_EMBEDDEDUNSUPPORT; + SDMMC_WrapperStruct->UseTuningSDR50 = SDMMC_SDR50TUNING; + SDMMC_WrapperStruct->DSSDCLKFreq = 0x04; + SDMMC_WrapperStruct->INITSDCLKFreq = 0x00; + SDMMC_WrapperStruct->SDR12SDCLKFreq = 0x04; + SDMMC_WrapperStruct->HSSDCLKFreq = 0x02; + SDMMC_WrapperStruct->SDR50SDCLKFreq = 0x01; + SDMMC_WrapperStruct->SDR25SDCLKFreq = 0x02; + SDMMC_WrapperStruct->SDR104SDCLKFreq = 0x00; + SDMMC_WrapperStruct->DDR50SDCLKFreq = 0x02; +} + + +/** + *\*\name SDMMC_SoftWareReset. + *\*\fun Software Reset for DAT/CMD/ALL Line. + *\*\param SDHOSTx pointer to specified SDHOST,must be one of the following value: + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param LineMask: + *\*\ - SDHOST_SOFTWARE_DATALINE + *\*\ - SDHOST_SOFTWARE_CMDLINE + *\*\ - SDHOST_SOFTWARE_ALLLINE + *\*\return ErrorStatus + *\*\ - SUCCESS + *\*\ - ERROR + */ +ErrorStatus SDMMC_SoftWareReset(SDHOST_Module* SDHOSTx, uint32_t LineMask) +{ + ErrorStatus stauts_value; + uint32_t timeout = 0; + /* Reset ALL SDHOST. */ + SDHOSTx->CTRL2 |= LineMask; + + while((SDHOSTx->CTRL2 & LineMask) != RESET) + { + timeout++; + + if(timeout >= SDMMC_TIMEOUT_VALUE) + { + break; + } + } + + if(timeout >= SDMMC_TIMEOUT_VALUE) + { + stauts_value = ERROR; + } + else + { + stauts_value = SUCCESS; + } + + return stauts_value; +} + + +/** + *\*\name SDMMC_TransferConfig. + *\*\fun Start transfer according to current transfer state. + *\*\param SDHOSTx pointer to specified SDHOST,must be one of the following value: + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param transferFlags: transfer flags + *\*\ - SDMMC_CommandOnly + *\*\ - SDMMC_CommandAndTxData + *\*\ - SDMMC_CommandAndRxData + *\*\ - SDMMC_DataWithAutoCmd12 + *\*\ - SDMMC_DataWithAutoCmd23 + *\*\ - SDMMC_BootData + *\*\ - SDMMC_BootDataContinuous + *\*\param blockCount : + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\param blockSize : + *\*\ - The available range is 0 ~ 0x0800. + *\*\param TMODE_struct: pointer to a SDHOST_TMODE_struct structure. + *\*\ - DMAE + *\*\ - SDHOST_TMODE_DMADISABLE + *\*\ - SDHOST_TMODE_DMAENABLE + *\*\ - BCNTE + *\*\ - SDHOST_TMODE_BLOCKCNTDISABLE + *\*\ - SDHOST_TMODE_BLOCKCNTENABLE + *\*\ - ACMDE + *\*\ - SDHOST_TMODE_NOACMDEN + *\*\ - SDHOST_TMODE_AC12EN + *\*\ - SDHOST_TMODE_AC23EN + *\*\ - DATDIR + *\*\ - SDHOST_TMODE_DATDIR_WRITE + *\*\ - SDHOST_TMODE_DATDIR_READ + *\*\ - BLKSEL + *\*\ - SDHOST_TMODE_SINGLEBLK + *\*\ - SDHOST_TMODE_MULTIBLK + *\*\return SDMMC_STS + *\*\ - SDMMC_BusyTransferring + *\*\ - SDMMC_SUCCESS + *\*\ - SDMMC_ERROR + */ +static SDMMC_STS SDMMC_TransferConfig(SDHOST_Module* SDHOSTx, uint32_t transferFlags, uint32_t blockSize, + uint32_t blockCount, SDHOST_TMODE_struct *TMODE_struct) +{ + uint32_t tempReg_BLK; + + if((transferFlags & ((uint32_t)SDMMC_CommandOnly)) != 0U) + { + /* clear data flags */ + TMODE_struct->DATDIR = SDHOST_TMODE_DATDIR_WRITE; + TMODE_struct->BCNTE = SDHOST_TMODE_BLOCKCNTDISABLE; + TMODE_struct->ACMDE = SDHOST_TMODE_NOACMDEN; + TMODE_struct->BLKSEL = SDHOST_TMODE_SINGLEBLK; + + if((SDHOSTx->PRESTS & SDHOST_PRESTS_CMDINHC) == SDHOST_PRESTS_CMDINHC) + { + return SDMMC_BusyTransferring; + } + } + else + { + /* if transfer boot continous, only need set the CONTREQ bit, leave others as it is */ + if((transferFlags & ((uint32_t)SDMMC_BootDataContinuous)) != 0U) + { + /* clear stop at block gap request */ + SDHOSTx->CTRL1 &= ~SDHOST_CTRL1_SABGREQ; + /* continous transfer data */ + SDHOSTx->CTRL1 |= SDHOST_CTRL1_CONTREQ; + return SDMMC_SUCCESS; + } + + /* check data inhibit flag */ + if((SDHOSTx->PRESTS & SDHOST_PRESTS_CMDINHD) == SDHOST_PRESTS_CMDINHD) + { + return SDMMC_BusyTransferring; + } + + /* check transfer block count */ + if ((blockCount > SDHOST_MAX_BLOCK_COUNT)) + { + return SDMMC_ERROR; + } + + /* config mix parameter */ + TMODE_struct->DATDIR = SDHOST_TMODE_DATDIR_WRITE; + TMODE_struct->BCNTE = SDHOST_TMODE_BLOCKCNTDISABLE; + TMODE_struct->ACMDE = SDHOST_TMODE_NOACMDEN; + TMODE_struct->BLKSEL = SDHOST_TMODE_SINGLEBLK; + + if((transferFlags & ((uint32_t)SDMMC_CommandAndRxData)) != 0U) + { + TMODE_struct->DATDIR = SDHOST_TMODE_DATDIR_READ; + } + + if(blockCount > 1U) + { + TMODE_struct->BCNTE = SDHOST_TMODE_BLOCKCNTENABLE; + TMODE_struct->BLKSEL = SDHOST_TMODE_MULTIBLK; + + /* auto command 12 */ + if((transferFlags & ((uint32_t)SDMMC_DataWithAutoCmd12)) != 0U) + { + TMODE_struct->ACMDE = SDHOST_TMODE_AC12EN; + } + } + + /* auto command 23, auto send set block count cmd before multiple read/write */ + if ((transferFlags & ((uint32_t)SDMMC_DataWithAutoCmd23)) != 0U) + { + TMODE_struct->ACMDE = SDHOST_TMODE_AC23EN; + /* config the block count to DS_ADDR */ + SDHOSTx->DSADD = blockCount; + } + + /* if transfer boot data, leave the block count to SDMMC_SetMmcBootConfig function */ + if ((transferFlags & ((uint32_t)SDMMC_BootData)) == 0U) + { + /* config data block size/block count */ + tempReg_BLK = SDHOSTx->BLKCFG; + tempReg_BLK &= (~(SDHOST_BLKCFG_CNT | SDHOST_BLKCFG_SIZE)); + tempReg_BLK |= ((blockCount << SDHOST_BLOCK_COUNT_OFFSET) | blockSize); + SDHOSTx->BLKCFG = tempReg_BLK; + } + else + { + TMODE_struct->BCNTE = SDHOST_TMODE_BLOCKCNTENABLE; + TMODE_struct->BLKSEL = SDHOST_TMODE_MULTIBLK; + } + } + + return SDMMC_SUCCESS; +} + + +/** + *\*\name SDMMC_ReceiveCommandResponse. + *\*\fun Receive command response. + *\*\param SDHOSTx pointer to specified SDHOST,must be one of the following value: + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param command: Command to be sent + *\*\ - index + *\*\ - 0~63 + *\*\ - argument + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - type + *\*\ - CARD_CommandTypeNormal + *\*\ - CARD_CommandTypeSuspend + *\*\ - CARD_CommandTypeResume + *\*\ - CARD_CommandTypeAbort + *\*\ - CARD_CommandTypeEmpty + *\*\ - responseType + *\*\ - CARD_ResponseTypeNone + *\*\ - CARD_ResponseTypeR1 + *\*\ - CARD_ResponseTypeR1b + *\*\ - CARD_ResponseTypeR2 + *\*\ - CARD_ResponseTypeR3 + *\*\ - CARD_ResponseTypeR4 + *\*\ - CARD_ResponseTypeR5 + *\*\ - CARD_ResponseTypeR5b + *\*\ - CARD_ResponseTypeR6 + *\*\ - CARD_ResponseTypeR7 + *\*\ - response[4U]: Response for this command. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - responseErrorFlags: Response error flag, which need to check the command reponse. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - flags: Cmd flags. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\return SDMMC_STS + *\*\ - SDMMC_SendCommandFailed + *\*\ - SDMMC_SUCCESS + */ +static SDMMC_STS SDMMC_ReceiveCommandResponse(SDHOST_Module* SDHOSTx, SDMMC_CMD *command) +{ + uint32_t response0 = SDHOSTx->CMDRSP0; + uint32_t response1 = SDHOSTx->CMDRSP1; + uint32_t response2 = SDHOSTx->CMDRSP2; + + if (command->responseType != CARD_ResponseTypeNone) + { + command->response[0U] = response0; + + if (command->responseType == CARD_ResponseTypeR2) + { + /* R3-R2-R1-R0(lowest 8 bit is invalid bit) has the same format as R2 format in SD specification document + after removed internal CRC7 and end bit. */ + command->response[0U] <<= 8U; + command->response[1U] = (response1 << 8U) | ((response0 & 0xFF000000U) >> 24U); + command->response[2U] = (response2 << 8U) | ((response1 & 0xFF000000U) >> 24U); + command->response[3U] = (SDHOSTx->CMDRSP3 << 8U) | ((response2 & 0xFF000000U) >> 24U); + } + } + + /* check response error flag */ + if ((command->responseErrorFlags != 0U) && + ((command->responseType == CARD_ResponseTypeR1) || (command->responseType == CARD_ResponseTypeR1b) || + (command->responseType == CARD_ResponseTypeR6) || (command->responseType == CARD_ResponseTypeR5))) + { + if (((command->responseErrorFlags) & (command->response[0U])) != 0U) + { + return SDMMC_SendCommandFailed; + } + } + + return SDMMC_SUCCESS; +} + + +/** + *\*\name SDMMC_ReadDataPort. + *\*\fun Read DATAPORT when buffer enable bit is set. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param data Data descriptor. + *\*\ - AutoCommand12_23. + *\*\ - AutoCommand12 + *\*\ - AutoCommand23 + *\*\ - NoAutoCommand + *\*\ - enableIgnoreError. + *\*\ - ENABLE + *\*\ - DISABLE + *\*\ - dataType. + *\*\ - SDHOST_TransferDataNormal + *\*\ - SDHOST_TransferDataTuning + *\*\ - SDHOST_TransferDataBoot + *\*\ - SDHOST_TransferDataBootcontinous + *\*\ - blockCount : + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\ - blockSize : + *\*\ - The available range is 0 ~ 0x0800. + *\*\ - rxData : Buffer to save data read. + *\*\ - txData : Data buffer to write. + *\*\param transferredWords The number of data words have been transferred last time transaction. + *\*\ - The available range is 0 ~ 0xFFFFFFFF. + *\*\return transferredWords : The number of total data words have been transferred after this time transaction. + */ +static uint32_t SDMMC_ReadDataPort(SDHOST_Module* SDHOSTx, SDMMC_DATA *data, uint32_t transferredWords) +{ + uint32_t i; + uint32_t blockWords; + uint32_t transferredWordsvalue = transferredWords; + + /* If DMA is enable, do not need to polling data port */ + if ((SDHOSTx->TMODE & SDHOST_TMODE_DMAE) == 0U) + { + /* + * Add non aligned access support ,user need make sure your buffer size is big + * enough to hold the data,in other words,user need make sure the buffer size + * is 4 byte aligned + */ + if ((data->blockSize % 4U) != 0U) + { + data->blockSize += (4U - (data->blockSize % 4U)); /* make the block size as word-aligned */ + } + + blockWords = data->blockSize / 4U; + + i = 0U; + + while (i < blockWords) + { + data->rxData[transferredWordsvalue] = SDMMC_ReadData(SDHOSTx); + transferredWordsvalue++; + i++; + } + } + + return transferredWordsvalue; +} + +/** + *\*\name SDMMC_ReadByDataPortBlocking. + *\*\fun Read data by using DATAPORT polling way. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param data Data descriptor. + *\*\ - AutoCommand12_23. + *\*\ - AutoCommand12 + *\*\ - AutoCommand23 + *\*\ - NoAutoCommand + *\*\ - enableIgnoreError. + *\*\ - ENABLE + *\*\ - DISABLE + *\*\ - dataType. + *\*\ - SDHOST_TransferDataNormal + *\*\ - SDHOST_TransferDataTuning + *\*\ - SDHOST_TransferDataBoot + *\*\ - SDHOST_TransferDataBootcontinous + *\*\ - blockCount : + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\ - blockSize : + *\*\ - The available range is 0 ~ 0x0800. + *\*\ - rxData : Buffer to save data read. + *\*\ - txData : Data buffer to write. + *\*\return error_status. + *\*\ - SUCCESS + *\*\ - ERROR + */ +static ErrorStatus SDMMC_ReadByDataPortBlocking(SDHOST_Module* SDHOSTx, SDMMC_DATA *data) +{ + uint32_t totalWords; + uint32_t transferredWords = 0U, interruptStatus = 0U; + ErrorStatus error_status = SUCCESS; + uint32_t timeout = 0xFFFFFF; + + /* + * Add non aligned access support ,user need make sure your buffer size is big + * enough to hold the data,in other words,user need make sure the buffer size + * is 4 byte aligned + */ + if ((data->blockSize % 4U) != 0U) + { + data->blockSize += (4U - (data->blockSize % 4U)); /* make the block size as word-aligned */ + } + + totalWords = (data->blockCount * data->blockSize) / 4U; + + while ((error_status == SUCCESS) && (transferredWords < totalWords)) + { + timeout = 0xFFFFFF; + while((interruptStatus & (((uint32_t)SDHOST_BufferReadReadyFlag | (uint32_t)SDHOST_DataErrorFlag))) == 0) + { + interruptStatus = SDHOSTx->INTSTS; + timeout--; + + if(timeout < 2) + { + break; + } + } + + /* during std tuning process, software do not need to read data, but wait BRR is enough */ + if ((data->dataType == (uint32_t)SDHOST_TransferDataTuning) && + ((interruptStatus & ((uint32_t)SDHOST_BufferReadReadyFlag)) != 0)) + { + SDMMC_ClrFlag(SDHOSTx, (uint32_t)SDHOST_BufferReadReadyFlag); + return SUCCESS; + } + else if ((interruptStatus & ((uint32_t)SDHOST_DataErrorFlag)) != 0) + { + if (data->enableIgnoreError == ENABLE) + { + error_status = ERROR; + } + + /* clear data error flag */ + SDMMC_ClrFlag(SDHOSTx, (uint32_t)SDHOST_DataErrorFlag); + } + else + { + /* Intentional empty */ + } + + if (error_status == SUCCESS) + { + /* clear buffer read ready */ + SDMMC_ClrFlag(SDHOSTx, (uint32_t)SDHOST_BufferReadReadyFlag); + interruptStatus = 0U; + transferredWords = SDMMC_ReadDataPort(SDHOSTx, data, transferredWords); + } + } + + timeout = 0xFFFFFF; + while((interruptStatus & ((uint32_t)SDHOST_DataCompleteFlag)) == 0) + { + interruptStatus = SDHOSTx->INTSTS; + timeout--; + + if(timeout < 2) + { + break; + } + } + /* Clear data complete flag after the last read operation. */ + SDMMC_ClrFlag(SDHOSTx, (uint32_t)SDHOST_DataCompleteFlag); + + return error_status; +} + + +/** + *\*\name SDMMC_WriteDataPort. + *\*\fun Write DATAPORT when buffer enable bit is set. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param data Data descriptor. + *\*\ - AutoCommand12_23. + *\*\ - AutoCommand12 + *\*\ - AutoCommand23 + *\*\ - NoAutoCommand + *\*\ - enableIgnoreError. + *\*\ - ENABLE + *\*\ - DISABLE + *\*\ - dataType. + *\*\ - SDHOST_TransferDataNormal + *\*\ - SDHOST_TransferDataTuning + *\*\ - SDHOST_TransferDataBoot + *\*\ - SDHOST_TransferDataBootcontinous + *\*\ - blockCount : + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\ - blockSize : + *\*\ - The available range is 0 ~ 0x0800. + *\*\ - rxData : Buffer to save data read. + *\*\ - txData : Data buffer to write. + *\*\param transferredWords The number of data words have been transferred last time transaction. + *\*\ - The available range is 0 ~ 0xFFFFFFFF. + *\*\return transferredWords : The number of total data words have been transferred after this time transaction. + */ +static uint32_t SDMMC_WriteDataPort(SDHOST_Module* SDHOSTx, SDMMC_DATA *data, uint32_t transferredWords) +{ + uint32_t i; + uint32_t blockWords; + uint32_t transferredWordsvalue = transferredWords; + + /* If DMA is enable, do not need to polling data port */ + if ((SDHOSTx->TMODE & SDHOST_TMODE_DMAE) == 0U) + { + /* + * Add non aligned access support ,user need make sure your buffer size is big + * enough to hold the data,in other words,user need make sure the buffer size + * is 4 byte aligned + */ + if ((data->blockSize % sizeof(uint32_t)) != 0U) + { + data->blockSize += + sizeof(uint32_t) - (data->blockSize % sizeof(uint32_t)); /* make the block size as word-aligned */ + } + + blockWords = data->blockSize / sizeof(uint32_t); + + i = 0U; + + while (i < blockWords) + { + SDMMC_WriteData(SDHOSTx, data->txData[transferredWordsvalue]); + transferredWordsvalue++; + i++; + } + } + + return transferredWordsvalue; +} + + +/** + *\*\name SDMMC_ReadByDataPortBlocking. + *\*\fun Write data by using DATAPORT polling way. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param data Data descriptor. + *\*\ - AutoCommand12_23. + *\*\ - AutoCommand12 + *\*\ - AutoCommand23 + *\*\ - NoAutoCommand + *\*\ - enableIgnoreError. + *\*\ - ENABLE + *\*\ - DISABLE + *\*\ - dataType. + *\*\ - SDHOST_TransferDataNormal + *\*\ - SDHOST_TransferDataTuning + *\*\ - SDHOST_TransferDataBoot + *\*\ - SDHOST_TransferDataBootcontinous + *\*\ - blockCount : + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\ - blockSize : + *\*\ - The available range is 0 ~ 0x0800. + *\*\ - rxData : Buffer to save data read. + *\*\ - txData : Data buffer to write. + *\*\return error_status. + *\*\ - SUCCESS + *\*\ - ERROR + */ +static ErrorStatus SDMMC_WriteByDataPortBlocking(SDHOST_Module* SDHOSTx, SDMMC_DATA *data) +{ + uint32_t totalWords; + + uint32_t transferredWords = 0U, interruptStatus = 0U; + ErrorStatus error_status = SUCCESS; + + /* + * Add non aligned access support ,user need make sure your buffer size is big + * enough to hold the data,in other words,user need make sure the buffer size + * is 4 byte aligned + */ + if ((data->blockSize % sizeof(uint32_t)) != 0U) + { + data->blockSize += + sizeof(uint32_t) - (data->blockSize % sizeof(uint32_t)); /* make the block size as word-aligned */ + } + + totalWords = (data->blockCount * data->blockSize) / sizeof(uint32_t); + + while ((error_status == SUCCESS) && (transferredWords < totalWords)) + { + while((interruptStatus & (((uint32_t)SDHOST_BufferWriteReadyFlag | (uint32_t)SDHOST_DataErrorFlag))) == 0) + { + interruptStatus = SDHOSTx->INTSTS; + } + + if((interruptStatus & ((uint32_t)SDHOST_DataErrorFlag)) != 0) + { + if (data->enableIgnoreError == ENABLE) + { + error_status = ERROR; + } + + /* clear data error flag */ + SDMMC_ClrFlag(SDHOSTx, (uint32_t)SDHOST_DataErrorFlag); + } + else + { + /* Intentional empty */ + } + + if (error_status == SUCCESS) + { + /* clear buffer write ready */ + SDMMC_ClrFlag(SDHOSTx, (uint32_t)SDHOST_BufferWriteReadyFlag); + interruptStatus = 0U; + transferredWords = SDMMC_WriteDataPort(SDHOSTx, data, transferredWords); + } + } + + /* Wait write data complete or data transfer error after the last writing operation. */ + while((interruptStatus & (((uint32_t)SDHOST_DataCompleteFlag | (uint32_t)SDHOST_DataErrorFlag))) == 0) + { + interruptStatus = SDHOSTx->INTSTS; + } + + if ((interruptStatus & ((uint32_t)SDHOST_DataErrorFlag)) != 0UL) + { + if (data->enableIgnoreError == ENABLE) + { + error_status = ERROR; + } + } + + SDMMC_ClrFlag(SDHOSTx, (((uint32_t)SDHOST_DataCompleteFlag | (uint32_t)SDHOST_DataErrorFlag))); + + return error_status; +} + + +/** + *\*\name SDMMC_SendCommand. + *\*\fun send command function. + *\*\param SDHOSTx pointer to specified SDHOST,must be one of the following value: + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param command: command configuration + *\*\ - index + *\*\ - 0~63 + *\*\ - argument + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - type + *\*\ - CARD_CommandTypeNormal + *\*\ - CARD_CommandTypeSuspend + *\*\ - CARD_CommandTypeResume + *\*\ - CARD_CommandTypeAbort + *\*\ - CARD_CommandTypeEmpty + *\*\ - responseType + *\*\ - CARD_ResponseTypeNone + *\*\ - CARD_ResponseTypeR1 + *\*\ - CARD_ResponseTypeR1b + *\*\ - CARD_ResponseTypeR2 + *\*\ - CARD_ResponseTypeR3 + *\*\ - CARD_ResponseTypeR4 + *\*\ - CARD_ResponseTypeR5 + *\*\ - CARD_ResponseTypeR5b + *\*\ - CARD_ResponseTypeR6 + *\*\ - CARD_ResponseTypeR7 + *\*\ - response[4U]: Response for this command. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - responseErrorFlags: Response error flag, which need to check the command reponse. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - flags: Cmd flags. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\param TMODE_struct: pointer to a SDHOST_TMODE_struct structure. + *\*\ - DMAE + *\*\ - SDHOST_TMODE_DMADISABLE + *\*\ - SDHOST_TMODE_DMAENABLE + *\*\ - BCNTE + *\*\ - SDHOST_TMODE_BLOCKCNTDISABLE + *\*\ - SDHOST_TMODE_BLOCKCNTENABLE + *\*\ - ACMDE + *\*\ - SDHOST_TMODE_NOACMDEN + *\*\ - SDHOST_TMODE_AC12EN + *\*\ - SDHOST_TMODE_AC23EN + *\*\ - DATDIR + *\*\ - SDHOST_TMODE_DATDIR_WRITE + *\*\ - SDHOST_TMODE_DATDIR_READ + *\*\ - BLKSEL + *\*\ - SDHOST_TMODE_SINGLEBLK + *\*\ - SDHOST_TMODE_MULTIBLK + *\*\return none + */ +void SDMMC_SendCommand(SDHOST_Module* SDHOSTx, SDMMC_CMD *command, const SDHOST_TMODE_struct *TMODE_struct) +{ + uint32_t xferType; + uint32_t flags; + flags = command->flags; + + if (((SDHOSTx->PRESTS & ((uint32_t)SDHOST_CommandInhibitFlag)) == 0UL) && (command->type != CARD_CommandTypeEmpty)) + { + if ((command->responseType == CARD_ResponseTypeR1) || (command->responseType == CARD_ResponseTypeR5) || + (command->responseType == CARD_ResponseTypeR6) || (command->responseType == CARD_ResponseTypeR7)) + { + flags |= ((uint32_t)SDHOST_ResponseLength48Flag | (uint32_t)SDHOST_EnableCrcCheckFlag | + (uint32_t)SDHOST_EnableIndexCheckFlag); + } + else if ((command->responseType == CARD_ResponseTypeR1b) || (command->responseType == CARD_ResponseTypeR5b)) + { + flags |= ((uint32_t)SDHOST_ResponseLength48BusyFlag | (uint32_t)SDHOST_EnableCrcCheckFlag | + (uint32_t)SDHOST_EnableIndexCheckFlag); + } + else if (command->responseType == CARD_ResponseTypeR2) + { + flags |= ((uint32_t)SDHOST_ResponseLength136Flag | (uint32_t)SDHOST_EnableCrcCheckFlag); + } + else if ((command->responseType == CARD_ResponseTypeR3) || (command->responseType == CARD_ResponseTypeR4)) + { + flags |= ((uint32_t)SDHOST_ResponseLength48Flag); + } + else + { + /* Intentional empty */ + } + + if (command->type == CARD_CommandTypeAbort) + { + flags |= (uint32_t)SDHOST_CommandTypeAbortFlag; + } + + /* config cmd index */ + xferType = 0x00000000U; + + xferType |= + (((command->index << SDHOST_CMD_INDEX_OFFSET) & SDHOST_TMODE_INDEX) | + ((flags) & (SDHOST_TMODE_TYPE | SDHOST_TMODE_INDEXCK | SDHOST_TMODE_CRCCK | + SDHOST_TMODE_RTYPESEL | SDHOST_TMODE_DPRESEL))); + + xferType |= TMODE_struct->DMAE; + xferType |= TMODE_struct->BCNTE; + xferType |= TMODE_struct->ACMDE; + xferType |= TMODE_struct->DATDIR; + xferType |= TMODE_struct->BLKSEL; + + /* config the command xfertype and argument */ + SDHOSTx->CMDARG1 = command->argument; + SDHOSTx->TMODE = xferType; + } + + if (command->type == CARD_CommandTypeEmpty) + { + /* disable CMD done interrupt for empty command */ + SDHOSTx->ISE &= ~SDHOST_ISE_CMDCSE; + } +} + + +/** + *\*\name SDMMC_WaitCommandDone. + *\*\fun wait command done. + *\*\param SDHOSTx pointer to specified SDHOST,must be one of the following value: + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param command: command configuration + *\*\ - index + *\*\ - 0~63 + *\*\ - argument + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - type + *\*\ - CARD_CommandTypeNormal + *\*\ - CARD_CommandTypeSuspend + *\*\ - CARD_CommandTypeResume + *\*\ - CARD_CommandTypeAbort + *\*\ - CARD_CommandTypeEmpty + *\*\ - responseType + *\*\ - CARD_ResponseTypeNone + *\*\ - CARD_ResponseTypeR1 + *\*\ - CARD_ResponseTypeR1b + *\*\ - CARD_ResponseTypeR2 + *\*\ - CARD_ResponseTypeR3 + *\*\ - CARD_ResponseTypeR4 + *\*\ - CARD_ResponseTypeR5 + *\*\ - CARD_ResponseTypeR5b + *\*\ - CARD_ResponseTypeR6 + *\*\ - CARD_ResponseTypeR7 + *\*\ - response[4U]: Response for this command. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - responseErrorFlags: Response error flag, which need to check the command reponse. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - flags: Cmd flags. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\param pollingCmdDone: polling command done flag + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return SDMMC_STS + *\*\ - SDMMC_ERROR + *\*\ - SDMMC_SUCCESS + *\*\ - SDMMC_SendCommandFailed + */ +SDMMC_STS SDMMC_WaitCommandDone(SDHOST_Module* SDHOSTx, SDMMC_CMD *command, FunctionalState pollingCmdDone) +{ + SDMMC_STS error = SDMMC_SUCCESS; + uint32_t interruptStatus = 0U; + uint32_t timeout_value = 0x20000; + + /* check if need polling command done or not */ + if (pollingCmdDone == ENABLE) + { + /* Wait command complete or SDMMC encounters error. */ + while(((interruptStatus & ((uint32_t)SDHOST_CommandFlag)) == 0) && (timeout_value > 0)) + { + interruptStatus = SDHOSTx->INTSTS; + timeout_value--; + } + + if(timeout_value == 0) + { + interruptStatus = (uint32_t)SDHOST_CommandTimeoutFlag; + } + + if ((interruptStatus & ((uint32_t)SDHOST_CommandErrorFlag)) != 0UL) + { + error = SDMMC_ERROR; + } + + /* Receive response when command completes successfully. */ + if (error == SDMMC_SUCCESS) + { + error = SDMMC_ReceiveCommandResponse(SDHOSTx, command); + } + + SDMMC_ClrFlag(SDHOSTx, (uint32_t)SDHOST_CommandFlag); + } + + return error; +} + + +/** + *\*\name SDMMC_TransferDataBlocking. + *\*\fun Transfer data by polling way. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param data Data descriptor. + *\*\ - AutoCommand12_23. + *\*\ - AutoCommand12 + *\*\ - AutoCommand23 + *\*\ - NoAutoCommand + *\*\ - enableIgnoreError. + *\*\ - ENABLE + *\*\ - DISABLE + *\*\ - dataType. + *\*\ - SDHOST_TransferDataNormal + *\*\ - SDHOST_TransferDataTuning + *\*\ - SDHOST_TransferDataBoot + *\*\ - SDHOST_TransferDataBootcontinous + *\*\ - blockCount : + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\ - blockSize : + *\*\ - The available range is 0 ~ 0x0800. + *\*\ - rxData : Buffer to save data read. + *\*\ - txData : Data buffer to write. + *\*\param DMACmd: DMA flag + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return error. + *\*\ - SDMMC_ERROR + *\*\ - SDMMC_SUCCESS + *\*\ - SDMMC_TransferDataFailed + */ +static SDMMC_STS SDMMC_TransferDataBlocking(SDHOST_Module* SDHOSTx, SDMMC_DATA *data, FunctionalState DMACmd) +{ + SDMMC_STS error = SDMMC_SUCCESS; + ErrorStatus error_status; + uint32_t interruptStatus = 0U; + uint32_t SDMA_address; + + if (DMACmd == ENABLE) + { + /* Wait data complete or SDMMC encounters error. */ + while((interruptStatus & ((uint32_t)SDHOST_DataDMAFlag)) == 0) + { + interruptStatus = SDHOSTx->INTSTS; + + if((interruptStatus & ((uint32_t)SDHOST_DmaCompleteFlag)) == ((uint32_t)SDHOST_DmaCompleteFlag)) + { + SDMMC_ClrFlag(SDHOSTx, (uint32_t)SDHOST_DmaCompleteFlag); + SDMA_address = SDHOSTx->DSADD; + SDHOSTx->DSADD = SDMA_address; + } + } + + if((interruptStatus & (((uint32_t)SDHOST_DataErrorFlag | (uint32_t)SDHOST_DmaErrorFlag))) != 0) + { + if (((data->enableIgnoreError == ENABLE)) || ((interruptStatus & ((uint32_t)SDHOST_DataTimeoutFlag)) != 0)) + { + error = SDMMC_TransferDataFailed; + } + } + else + { + /* Intentional empty */ + } + + /* load dummy data */ + if ((data->dataType == SDHOST_TransferDataBootcontinous) && (error == SDMMC_SUCCESS)) + { + *(data->rxData) = SDHOST_BOOTDUMMY; + } + + SDMMC_ClrFlag(SDHOSTx, (uint32_t)SDHOST_DataDMAFlag); + } + else + { + if (data->rxData != NULL) + { + error_status = SDMMC_ReadByDataPortBlocking(SDHOSTx, data); + + if (error_status != SUCCESS) + { + return SDMMC_ERROR; + } + } + else + { + error_status = SDMMC_WriteByDataPortBlocking(SDHOSTx, data); + + if (error_status != SUCCESS) + { + return SDMMC_ERROR; + } + } + } + + return error; +} + + +/** + *\*\name SDMMC_GetCapability. + *\*\fun Get SDHSOT capability structure value. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param capability: pointer to a SDHOST_capability structure. + *\*\ - MaxBlockLen : Maximum Block Length supported by the Core/Device + *\*\ - SDMMC_MAXBLOCKLEN_512B + *\*\ - SDMMC_MAXBLOCKLEN_1024B + *\*\ - SDMMC_MAXBLOCKLEN_2048B + *\*\ - SDBaseCLKFreq : xin_clk, Base Clock Frequency for SD Clock + *\*\ - 0x0A~0x68,Unit MHz + *\*\ - TimeOutUnit : the unit of base clock frequency used to detect Data Timeout Error + *\*\ - SDMMC_TIMEOUTCLKUNIT_KHZ + *\*\ - SDMMC_TIMEOUTCLKUNIT_MHZ + *\*\ - SPIBlockMode : SPI Block Mode + *\*\ - SDMMC_SPIBLOCKMODESUPPORT + *\*\ - SDMMC_SPIBLOCKMODEUNSUPPORT + *\*\ - SPIMode : SPI Mode Support + *\*\ - SDMMC_SPIMODESUPPORT + *\*\ - SDMMC_SPIMODEUNSUPPORT + *\*\ - DDR50 : DDR50 Support + *\*\ - SDMMC_DDR50SUPPORT + *\*\ - SDMMC_DDR50UNSUPPORT + *\*\ - SDR104 : SDR104 Support + *\*\ - SDMMC_SDR104SUPPORT + *\*\ - SDMMC_SDR104UNSUPPORT + *\*\ - SDR50 : SDR50 Support + *\*\ - SDMMC_SDR50SUPPORT + *\*\ - SDMMC_SDR50UNSUPPORT + *\*\ - SlotType : Slot Type + *\*\ - SDMMC_SDTYPE + *\*\ - SDMMC_EMMCTYPE + *\*\ - AsyncInt : Asynchronous Interrupt Support + *\*\ - SDMMC_ASYNCINTSUPPORT + *\*\ - SDMMC_ASYNCINTUNSUPPORT + *\*\ - Suspend_Resume : Suspend/Resume Support + *\*\ - SDMMC_SUSRESSUPPORT + *\*\ - SDMMC_SUSRESUNSUPPORT + *\*\ - SDMA : SDMA Support + *\*\ - SDMMC_SDMASUPPORT + *\*\ - SDMMC_SDMAUNSUPPORT + *\*\ - HS : High Speed Support + *\*\ - SDMMC_HSSUPPORT + *\*\ - SDMMC_HSUNSUPPORT + *\*\ - ADMA2 : ADMA2 Support + *\*\ - SDMMC_ADMA2SUPPORT + *\*\ - SDMMC_ADMA2UNSUPPORT + *\*\ - Embedded_8bit : 8-bit Support for Embedded Device + *\*\ - SDMMC_EMBEDDEDSUPPORT + *\*\ - SDMMC_EMBEDDEDUNSUPPORT + *\*\ - UseTuningSDR50 : Use Tuning for SDR50 + *\*\ - SDMMC_SDR50TUNING + *\*\ - SDMMC_SDR50UNTUNING + *\*\return none + */ +void SDMMC_GetCapability(SDHOST_Module* SDHOSTx, SDHOST_capability *capability) +{ + if((SDHOSTx->CAP0STS & SDHOST_CAP0_ADMA2_MASK) == SDHOST_CAP0_ADMA2_MASK) + { + capability->ADMA2 = SDMMC_ADMA2SUPPORT; + } + else + { + capability->ADMA2 = SDMMC_ADMA2UNSUPPORT; + } + + if((SDHOSTx->CAP0STS & SDHOST_CAP0_ASYNCINT_MASK) == SDHOST_CAP0_ASYNCINT_MASK) + { + capability->AsyncInt = SDMMC_ASYNCINTSUPPORT; + } + else + { + capability->AsyncInt = SDMMC_ASYNCINTUNSUPPORT; + } + + if((SDHOSTx->CAP1STS & SDHOST_CAP1_DDR50_MASK) == SDHOST_CAP1_DDR50_MASK) + { + capability->DDR50 = SDMMC_DDR50SUPPORT; + } + else + { + capability->DDR50 = SDMMC_DDR50UNSUPPORT; + } + + if((SDHOSTx->CAP0STS & SDHOST_CAP0_EMBUS_MASK) == SDHOST_CAP0_EMBUS_MASK) + { + capability->Embedded_8bit = SDMMC_EMBEDDEDSUPPORT; + } + else + { + capability->Embedded_8bit = SDMMC_EMBEDDEDUNSUPPORT; + } + + if((SDHOSTx->CAP0STS & SDHOST_CAP0_HS_MASK) == SDHOST_CAP0_HS_MASK) + { + capability->HS = SDMMC_HSSUPPORT; + } + else + { + capability->HS = SDMMC_HSUNSUPPORT; + } + + if((SDHOSTx->CAP0STS & SDHOST_CAP0_MBL_MASK) == SDMMC_MAXBLOCKLEN_512B) + { + capability->MaxBlockLen = SDMMC_MAXBLOCKLEN_512B; + } + else if((SDHOSTx->CAP0STS & SDHOST_CAP0_MBL_MASK) == SDHOST_CAP0STS_MBL_0) + { + capability->MaxBlockLen = SDMMC_MAXBLOCKLEN_1024B; + } + else + { + capability->MaxBlockLen = SDMMC_MAXBLOCKLEN_2048B; + } + + capability->SDBaseCLKFreq = ((SDHOSTx->CAP0STS & SDHOST_CAP0_BCLKF_MASK) >> SDHOST_CAP0_BCLKF_OFFSET); + + if((SDHOSTx->CAP0STS & SDHOST_CAP0_SDMA_MASK) == SDHOST_CAP0_SDMA_MASK) + { + capability->SDMA = SDMMC_SDMASUPPORT; + } + else + { + capability->SDMA = SDMMC_SDMAUNSUPPORT; + } + + if((SDHOSTx->CAP1STS & SDHOST_CAP1_SDR104_MASK) == SDHOST_CAP1_SDR104_MASK) + { + capability->SDR104 = SDMMC_SDR104SUPPORT; + } + else + { + capability->SDR104 = SDMMC_SDR104UNSUPPORT; + } + + if((SDHOSTx->CAP1STS & SDHOST_CAP1_SDR50_MASK) == SDHOST_CAP1_SDR50_MASK) + { + capability->SDR50 = SDMMC_SDR50SUPPORT; + } + else + { + capability->SDR50 = SDMMC_SDR50UNSUPPORT; + } + + if((SDHOSTx->CAP0STS & SDHOST_CAP0_SLOTTYPE_MASK) == SDHOST_CAP0STS_STYP_0) + { + capability->SlotType = SDMMC_EMMCTYPE; + } + else + { + capability->SlotType = SDMMC_SDTYPE; + } + + if((SDHOSTx->CAP1STS & SDHOST_CAP1_SPIBMOD_MASK) == SDHOST_CAP1_SPIBMOD_MASK) + { + capability->SPIBlockMode = SDMMC_SPIBLOCKMODESUPPORT; + } + else + { + capability->SPIBlockMode = SDMMC_SPIBLOCKMODEUNSUPPORT; + } + + if((SDHOSTx->CAP1STS & SDHOST_CAP1_SPIMOD_MASK) == SDHOST_CAP1_SPIMOD_MASK) + { + capability->SPIMode = SDMMC_SPIMODESUPPORT; + } + else + { + capability->SPIMode = SDMMC_SPIMODEUNSUPPORT; + } + + if((SDHOSTx->CAP0STS & SDHOST_CAP0_SRS_MASK) == SDHOST_CAP0_SRS_MASK) + { + capability->Suspend_Resume = SDMMC_SUSRESSUPPORT; + } + else + { + capability->Suspend_Resume = SDMMC_SUSRESUNSUPPORT; + } + + if((SDHOSTx->CAP0STS & SDHOST_CAP0_TCLKU_MASK) == SDHOST_CAP0_TCLKU_MASK) + { + capability->TimeOutUnit = SDMMC_TIMEOUTCLKUNIT_MHZ; + } + else + { + capability->TimeOutUnit = SDMMC_TIMEOUTCLKUNIT_KHZ; + } + + if((SDHOSTx->CAP1STS & SDHOST_CAP1_UTFSDR50_MASK) == SDHOST_CAP1_UTFSDR50_MASK) + { + capability->UseTuningSDR50 = SDMMC_SDR50TUNING; + } + else + { + capability->UseTuningSDR50 = SDMMC_SDR50UNTUNING; + } +} + + +/** + *\*\name SDMMC_GetPresetvalue. + *\*\fun Get SDHSOT presetvalue structure value. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param presetvalue: pointer to a SDHOST_presetvalue structure. + *\*\ - DSSDCLKFreq : SDCLK Frequency Select Value for Default Speed + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - INITSDCLKFreq :SDCLK Frequency Select Value for Initialization + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - SDR12SDCLKFreq : SDCLK Frequency Select Value for SDR12 + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - HSSDCLKFreq : SDCLK Frequency Select Value for High Speed + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - SDR50SDCLKFreq : SDCLK Frequency Select Value for SDR50 + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - SDR25SDCLKFreq : SDCLK Frequency Select Value for SDR25 + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - SDR104SDCLKFreq : SDCLK Frequency Select Value for SDR104 + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\ - DDR50SDCLKFreq : SDCLK Frequency Select Value for DDR50 + *\*\ - 0x00~0x3FF ; 2N frequency division + *\*\return none + */ +void SDMMC_GetPresetvalue(SDHOST_Module* SDHOSTx, SDHOST_presetvalue *presetvalue) +{ + presetvalue->DSSDCLKFreq = ((SDHOSTx->PV0STS & SDHOST_PV0_DSCLKFS_MASK) >> SDHOST_PV0_DSCLKFS_OFFSET); + presetvalue->INITSDCLKFreq = (SDHOSTx->PV0STS & SDHOST_PV0_INITCLKFS_MASK); + presetvalue->SDR12SDCLKFreq = ((SDHOSTx->PV1STS & SDHOST_PV1_SDR12CLKFS_MASK) >> SDHOST_PV1_SDR12CLKFS_OFFSET); + presetvalue->HSSDCLKFreq = (SDHOSTx->PV1STS & SDHOST_PV1_HSCLKFS_MASK); + presetvalue->SDR50SDCLKFreq = ((SDHOSTx->PV2STS & SDHOST_PV2_SDR50CLKFS_MASK) >> SDHOST_PV2_SDR50CLKFS_OFFSET); + presetvalue->SDR25SDCLKFreq = (SDHOSTx->PV2STS & SDHOST_PV2_SDR25CLKFS_MASK); + presetvalue->DDR50SDCLKFreq = ((SDHOSTx->PV3STS & SDHOST_PV3_DDR50CLKFS_MASK) >> SDHOST_PV3_DDR50CLKFS_OFFSET); + presetvalue->SDR104SDCLKFreq = (SDHOSTx->PV3STS & SDHOST_PV3_SDR104CLKFS_MASK); +} + + +/** + *\*\name SDMMC_EnableSDCLK + *\*\fun Enables or disables SD Clock. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none + */ +void SDMMC_EnableSDCLK(SDHOST_Module* SDHOSTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + SDHOSTx->CTRL2 |= (SDHOST_CTRL2_SDCLKE | SDHOST_CTRL2_INCLKE); + } + else + { + SDHOSTx->CTRL2 &= (~(SDHOST_CTRL2_SDCLKE | SDHOST_CTRL2_INCLKE)); + } +} + +/** + *\*\name SDMMC_WaitSDCLKStable + *\*\fun Waiting for SD clock to stabilize. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return status_value + *\*\ - SDMMC_ERROR + *\*\ - SDMMC_SUCCESS + */ +SDMMC_STS SDMMC_WaitSDCLKStable(SDHOST_Module* SDHOSTx) +{ + SDMMC_STS status_value; + uint32_t timeout = 0xFFFFUL; + + /* Wait until the SD clock is stable. */ + while ((SDHOSTx->CTRL2 & SDHOST_CTRL2_INCLKSTS) != SDHOST_CTRL2_INCLKSTS) + { + timeout--; + + if(timeout < 2) + { + break; + } + } + + if(timeout < 2 ) + { + status_value = SDMMC_ERROR; + } + else + { + status_value = SDMMC_SUCCESS; + } + + return status_value; +} + + +/** + *\*\name SDMMC_SetSdClock. + *\*\fun Sets the SD bus clock frequency. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param PresetCmd: Whether to use preset value settings. + *\*\ - ENABLE + *\*\ - DISABLE + *\*\param prescaler: SD bus clock prescaler value. + *\*\ - 0~0x3FF 1/2N frequency division + *\*\return status_value + *\*\ - SDMMC_ERROR + *\*\ - SDMMC_SUCCESS + */ +SDMMC_STS SDMMC_SetSdClock(SDHOST_Module* SDHOSTx, FunctionalState PresetCmd, uint32_t prescaler) +{ + SDMMC_STS status_value; + uint32_t temp_value; + + SDMMC_EnableSDCLK(SDHOSTx, DISABLE); + + if(PresetCmd == ENABLE) + { + /* Use preset values */ + SDHOSTx->CTRLSTS |= SDHOST_CTRLSTS_PREVE; + } + else + { + /* Use HD config values */ + SDHOSTx->CTRLSTS &= (~SDHOST_CTRLSTS_PREVE); + + /* set prescaler value */ + temp_value = SDHOSTx->CTRL2; + temp_value &= (~SDHOST_CTRL2_SDCLKSEL); + temp_value |= (((prescaler & 0xFFUL) << REG_BIT8_OFFSET) | ((prescaler >> REG_BIT8_OFFSET) << REG_BIT6_OFFSET)); + SDHOSTx->CTRL2 = temp_value; + } + + SDMMC_EnableSDCLK(SDHOSTx, ENABLE); + + status_value = SDMMC_WaitSDCLKStable(SDHOSTx); + return status_value; +} + + +/** + *\*\name SDMMC_ConfigemmcBoot. + *\*\fun Configures the MMC boot feature. + *\*\param SDHOSTx pointer to specified SDHOST,must be one of the following value: + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param config: pointer to a SDHOST_boot_config structure. + *\*\ - ackTimeoutCount : Timeout value for the boot ACK + *\*\ - The available range is 0 ~ 0xFFFFFFFF. unit sd clock. + *\*\ - bootMode : Boot mode selection + *\*\ - SDHOST_BOOTMODENORMAL Normal boot + *\*\ - SDHOST_BOOTMODEALIERNATIVE Alternative boot + *\*\ - blockCount : + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\ - blockSize : + *\*\ - The available range is 0 ~ 0x0800. + *\*\ - BootAck : + *\*\ - SDHOST_BOOTACKCHECK + *\*\ - SDHOST_BOOTNOACKCHECK + *\*\return none + */ +void SDMMC_ConfigemmcBoot(SDHOST_Module* SDHOSTx, const SDHOST_boot_config *config) +{ + uint32_t temp_value; + SDHOSTx->BOOTTCTRL = config->ackTimeoutCount; + + temp_value = SDHOSTx->CTRL1; + temp_value &= (~(SDHOST_BOOTMODEALIERNATIVE | SDHOST_BOOTACKCHECK)); + temp_value |= (config->BootAck | config->bootMode); + SDHOSTx->CTRL1 = temp_value; + + temp_value = SDHOSTx->BLKCFG; + temp_value &= (~(SDHOST_BLKCFG_CNT | SDHOST_BLKCFG_SIZE)); + temp_value |= ((config->blockCount << 16) | config->blockSize); + SDHOSTx->BLKCFG = temp_value; +} + +/** + *\*\name SDMMC_ConfigInternalDma. + *\*\fun Use to config the Internal DMA related registers. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param dmaConfig + *\*\ - dmaMode. + *\*\ - DmaModeSimple + *\*\ - DmaModeAdma2 + *\*\ - admaTable Adma table address. + *\*\ - The available range is 0 ~ 0xFFFFFFFF. + *\*\ - admaTableWords Adma table length. + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\param dataAddr transfer data address, a simple DMA parameter, if ADMA is used, leave it to NULL. + *\*\ - The available range is 0 ~ 0xFFFFFFFF. + *\*\param enAutoCmd23 flag to indicate Auto CMD23 is enable or not, a simple DMA parameter,if ADMA is used, leave it to DISABLE. + *\*\ - ENABLE + *\*\ - DISABLE + *\*\param TMODE_struct: pointer to a SDHOST_TMODE_struct structure. + *\*\ - DMAE + *\*\ - SDHOST_TMODE_DMADISABLE + *\*\ - SDHOST_TMODE_DMAENABLE + *\*\ - BCNTE + *\*\ - SDHOST_TMODE_BLOCKCNTDISABLE + *\*\ - SDHOST_TMODE_BLOCKCNTENABLE + *\*\ - ACMDE + *\*\ - SDHOST_TMODE_NOACMDEN + *\*\ - SDHOST_TMODE_AC12EN + *\*\ - SDHOST_TMODE_AC23EN + *\*\ - DATDIR + *\*\ - SDHOST_TMODE_DATDIR_WRITE + *\*\ - SDHOST_TMODE_DATDIR_READ + *\*\ - BLKSEL + *\*\ - SDHOST_TMODE_SINGLEBLK + *\*\ - SDHOST_TMODE_MULTIBLK + *\*\return SDMMC_STS + *\*\ - SDMMC_DMADataAddrNotAlign + *\*\ - SDMMC_SUCCESS + */ +static SDMMC_STS SDMMC_ConfigInternalDma(SDHOST_Module* SDHOSTx, SDHOST_ADMAconfig *dmaConfig, const uint32_t *dataAddr, + FunctionalState enAutoCmd23, SDHOST_TMODE_struct *TMODE_struct) +{ + if (dmaConfig->dmaMode == DmaModeSimple) + { + /* check DMA data buffer address align or not */ + if (((uint32_t)dataAddr % SDHOST_ADMA2_ADDRESS_ALIGN) != 0UL) + { + return SDMMC_DMADataAddrNotAlign; + } + + /* in simple DMA mode if use auto CMD23, address should load to ADMA addr, + and block count should load to DS_ADD*/ + if (enAutoCmd23 == ENABLE) + { + SDHOSTx->ASADD0 = ((uint32_t)dataAddr); + } + else + { + SDHOSTx->DSADD = ((uint32_t)dataAddr); + } + } + else + { + /* When use ADMA, disable simple DMA */ + SDHOSTx->DSADD = 0UL; + SDHOSTx->ASADD0 = ((uint32_t)(dmaConfig->admaTable)); + } + + /* select DMA mode */ + SDHOSTx->CTRL1 &= (~SDHOST_CTRL1_DMASEL); + SDHOSTx->CTRL1 |= (uint32_t)(dmaConfig->dmaMode); + + /* enable DMA */ + TMODE_struct->DMAE = SDHOST_TMODE_DMAENABLE; + return SDMMC_SUCCESS; +} + +/** + *\*\name SDMMC_SetAdmaTableConfig. + *\*\fun Sets the DMA descriptor table configuration. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param dmaConfig + *\*\ - dmaMode. + *\*\ - DmaModeSimple + *\*\ - DmaModeAdma2 + *\*\ - admaTable Adma table address. + *\*\ - The available range is 0 ~ 0xFFFFFFFF. + *\*\ - admaTableWords Adma table length. + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\param dataConfig Data descriptor. + *\*\ - AutoCommand12_23. + *\*\ - AutoCommand12 + *\*\ - AutoCommand23 + *\*\ - NoAutoCommand + *\*\ - enableIgnoreError. + *\*\ - ENABLE + *\*\ - DISABLE + *\*\ - dataType. + *\*\ - SDHOST_TransferDataNormal + *\*\ - SDHOST_TransferDataTuning + *\*\ - SDHOST_TransferDataBoot + *\*\ - SDHOST_TransferDataBootcontinous + *\*\ - blockCount : + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\ - blockSize : + *\*\ - The available range is 0 ~ 0x0800. + *\*\ - rxData : Buffer to save data read. + *\*\ - txData : Data buffer to write. + *\*\param flags ADAM descriptor flag, used to indicate to create multiple or single descriptor. + *\*\ - SDHOST_AdmaDescriptorSingleFlag. + *\*\ - SDHOST_AdmaDescriptorMultipleFlag. + *\*\param TMODE_struct: pointer to a SDHOST_TMODE_struct structure. + *\*\ - DMAE + *\*\ - SDHOST_TMODE_DMADISABLE + *\*\ - SDHOST_TMODE_DMAENABLE + *\*\ - BCNTE + *\*\ - SDHOST_TMODE_BLOCKCNTDISABLE + *\*\ - SDHOST_TMODE_BLOCKCNTENABLE + *\*\ - ACMDE + *\*\ - SDHOST_TMODE_NOACMDEN + *\*\ - SDHOST_TMODE_AC12EN + *\*\ - SDHOST_TMODE_AC23EN + *\*\ - DATDIR + *\*\ - SDHOST_TMODE_DATDIR_WRITE + *\*\ - SDHOST_TMODE_DATDIR_READ + *\*\ - BLKSEL + *\*\ - SDHOST_TMODE_SINGLEBLK + *\*\ - SDHOST_TMODE_MULTIBLK + *\*\return SDMMC_STS + *\*\ - SDMMC_ERROR. + *\*\ - SDMMC_SUCCESS. + *\*\ - SDMMC_DMADataAddrNotAlign + *\*\ - SDMMC_OutOfRange + */ +static SDMMC_STS SDMMC_SetAdmaTableConfig(SDHOST_Module* SDHOSTx, SDHOST_ADMAconfig *dmaConfig, + SDMMC_DATA *dataConfig, SDHOST_TMODE_struct *TMODE_struct) +{ + SDMMC_STS status_value = SDMMC_SUCCESS; + FunctionalState enAutoCmd23; + uint32_t bootDummyOffset = + (dataConfig->dataType == (uint32_t)SDHOST_TransferDataBootcontinous) ? sizeof(uint32_t) : 0UL; + const uint32_t *data = (const uint32_t *)((uint32_t)( + (uint32_t)((dataConfig->rxData == NULL) ? dataConfig->txData : dataConfig->rxData) + bootDummyOffset)); + + /* for internal dma, internal DMA configurations should not update the configurations when continous transfer the + * boot data, only the DMA descriptor need update */ + if ((status_value == SDMMC_SUCCESS) && (dataConfig->dataType != SDHOST_TransferDataBootcontinous)) + { + if(dataConfig->AutoCommand12_23 == AutoCommand23) + { + enAutoCmd23 = ENABLE; + } + else + { + enAutoCmd23 = DISABLE; + } + + status_value = SDMMC_ConfigInternalDma(SDHOSTx, dmaConfig, data, enAutoCmd23, TMODE_struct); + } + + return status_value; +} + + +/** + *\*\name SDMMC_TransferBlocking. + *\*\fun Transfers the command/data using a blocking method. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param dmaConfig + *\*\ - dmaMode. + *\*\ - DmaModeSimple + *\*\ - DmaModeAdma2 + *\*\ - admaTable Adma table address. + *\*\ - The available range is 0 ~ 0xFFFFFFFF. + *\*\ - admaTableWords Adma table length. + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\param transfer + *\*\ - data Data descriptor. + *\*\ - AutoCommand12_23. + *\*\ - AutoCommand12 + *\*\ - AutoCommand23 + *\*\ - NoAutoCommand + *\*\ - enableIgnoreError. + *\*\ - ENABLE + *\*\ - DISABLE + *\*\ - dataType. + *\*\ - SDHOST_TransferDataNormal + *\*\ - SDHOST_TransferDataTuning + *\*\ - SDHOST_TransferDataBoot + *\*\ - SDHOST_TransferDataBootcontinous + *\*\ - blockCount : + *\*\ - The available range is 0 ~ 0xFFFF. + *\*\ - blockSize : + *\*\ - The available range is 0 ~ 0x0800. + *\*\ - rxData : Buffer to save data read. + *\*\ - txData : Data buffer to write. + *\*\ - command: command configuration + *\*\ - index + *\*\ - 0~63 + *\*\ - argument + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - type + *\*\ - CARD_CommandTypeNormal + *\*\ - CARD_CommandTypeSuspend + *\*\ - CARD_CommandTypeResume + *\*\ - CARD_CommandTypeAbort + *\*\ - CARD_CommandTypeEmpty + *\*\ - responseType + *\*\ - CARD_ResponseTypeNone + *\*\ - CARD_ResponseTypeR1 + *\*\ - CARD_ResponseTypeR1b + *\*\ - CARD_ResponseTypeR2 + *\*\ - CARD_ResponseTypeR3 + *\*\ - CARD_ResponseTypeR4 + *\*\ - CARD_ResponseTypeR5 + *\*\ - CARD_ResponseTypeR5b + *\*\ - CARD_ResponseTypeR6 + *\*\ - CARD_ResponseTypeR7 + *\*\ - response[4U]: Response for this command. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - responseErrorFlags: Response error flag, which need to check the command reponse. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\ - flags: Cmd flags. + *\*\ - 0x00000000~0xFFFFFFFF + *\*\param TMODE_struct: pointer to a SDHOST_TMODE_struct structure. + *\*\ - DMAE + *\*\ - SDHOST_TMODE_DMADISABLE + *\*\ - SDHOST_TMODE_DMAENABLE + *\*\ - BCNTE + *\*\ - SDHOST_TMODE_BLOCKCNTDISABLE + *\*\ - SDHOST_TMODE_BLOCKCNTENABLE + *\*\ - ACMDE + *\*\ - SDHOST_TMODE_NOACMDEN + *\*\ - SDHOST_TMODE_AC12EN + *\*\ - SDHOST_TMODE_AC23EN + *\*\ - DATDIR + *\*\ - SDHOST_TMODE_DATDIR_WRITE + *\*\ - SDHOST_TMODE_DATDIR_READ + *\*\ - BLKSEL + *\*\ - SDHOST_TMODE_SINGLEBLK + *\*\ - SDHOST_TMODE_MULTIBLK + *\*\return SDMMC_STS + *\*\ - SDMMC_ReTuningRequest + *\*\ - SDMMC_ERROR. + *\*\ - SDMMC_SUCCESS. + *\*\ - SDMMC_DMADataAddrNotAlign + *\*\ - SDMMC_OutOfRange + *\*\ - SDMMC_BusyTransferring + *\*\ - SDMMC_SendCommandFailed + *\*\ - SDMMC_TransferDataFailed + */ +SDMMC_STS SDMMC_TransferBlocking(SDHOST_Module* SDHOSTx, SDHOST_ADMAconfig *dmaConfig, SDMMC_Transfer *transfer, SDHOST_TMODE_struct *TMODE_struct) +{ + SDMMC_STS status_value = SDMMC_ERROR; + SDMMC_CMD *command = &transfer->command; + SDMMC_DATA *data = &transfer->data; + FunctionalState enDMA = ENABLE; + FunctionalState CMDdone; + bool executeTuning = ((data == NULL) ? false : (data->dataType == (uint32_t)SDHOST_TransferDataTuning)); + uint32_t transferFlags = (uint32_t)SDMMC_CommandOnly; + uint32_t blockSize = 0U; + uint32_t blockCount = 0U; + SDHOST_capability Capability; + + SDMMC_GetCapability(SDHOSTx, &Capability); + + if(Capability.SDR50 == SDHOST_CAP1_SDR50_MASK) + { + /*check re-tuning request*/ + if ((SDMMC_GetFlagStatus(SDHOSTx, (uint32_t)SDHOST_ReTuningEventFlag)) != RESET) + { + SDMMC_ClrFlag(SDHOSTx, (uint32_t)SDHOST_ReTuningEventFlag); + return SDMMC_ReTuningRequest; + } + else + { + /* no process */ + } + } + else + { + /* no process */ + } + + if (data != NULL) + { + /* Update ADMA descriptor table according to different DMA mode(SDMA, ADMA2).*/ + if ((dmaConfig != NULL) && (!executeTuning)) + { + status_value = SDMMC_SetAdmaTableConfig(SDHOSTx, dmaConfig, data, TMODE_struct); + } + + blockSize = data->blockSize; + blockCount = data->blockCount; + + if(data->AutoCommand12_23 == AutoCommand12) + { + transferFlags = (uint32_t)SDMMC_DataWithAutoCmd12; + } + else if(data->AutoCommand12_23 == AutoCommand23) + { + transferFlags = (uint32_t)SDMMC_DataWithAutoCmd23; + } + else + { + transferFlags = 0; + } + + transferFlags |= ((data->txData != NULL) ? (uint32_t)SDMMC_CommandAndTxData : (uint32_t)SDMMC_CommandAndRxData); + transferFlags |= ((data->dataType == (uint8_t)SDHOST_TransferDataBoot) ? (uint32_t)SDMMC_BootData : 0U); + transferFlags |= + ((data->dataType == (uint8_t)SDHOST_TransferDataBootcontinous) ? (uint32_t)SDMMC_BootDataContinuous : 0U); + + command->flags |= (uint32_t)SDHOST_DataPresentFlag; + } + + /* if the DMA desciptor configure fail or not needed , disable it */ + if (status_value != SDMMC_SUCCESS) + { + enDMA = DISABLE; + /* disable DMA, using polling mode in this situation */ + TMODE_struct->DMAE = SDHOST_TMODE_DMADISABLE; + } + + /* config the data transfer parameter */ + status_value = SDMMC_TransferConfig(SDHOSTx, transferFlags, blockSize, blockCount, TMODE_struct); + + if (status_value != SDMMC_SUCCESS) + { + return status_value; + } + + /* send command first */ + SDMMC_SendCommand(SDHOSTx, command, TMODE_struct); + + /* wait command done */ + if(data->dataType == (uint32_t)SDHOST_TransferDataNormal) + { + CMDdone = ENABLE; + } + else + { + CMDdone = DISABLE; + } + + status_value = SDMMC_WaitCommandDone(SDHOSTx, command, CMDdone); + + if (SDMMC_SUCCESS != status_value) + { + return SDMMC_SendCommandFailed; + } + + /* wait transfer data finsih */ + if (data != NULL) + { + status_value = SDMMC_TransferDataBlocking(SDHOSTx, data, enDMA); + + if (SDMMC_SUCCESS != status_value) + { + return status_value; + } + } + + return SDMMC_SUCCESS; +} + + + +/** + *\*\name SDMMC_EnableManualTuning. + *\*\fun Manually adjust SDCLK output delay. + *\*\param SDMMCx : + *\*\ - SDMMC1 + *\*\ - SDMMC2 + *\*\param delay : + *\*\ - 0x00~0x0F 1~16 delay tap + *\*\param cmd : + *\*\ - ENABLE + *\*\ - DISABLE + *\*\note When manually adjusting, SDHOST should not be in working state (transmission state). + *\*\note After executing this function, it is necessary to call the enable parameter of SDMMC_SampleClockSet API. + */ +void SDMMC_EnableManualTuningOut(SDMMC_Module* SDMMCx, uint32_t delay, FunctionalState cmd) +{ + SDMMCx->DLYCTRL &= (~SDMMC_MANUALTUNOUT_DELAYMASK); + SDMMCx->DLYCTRL |= (delay << REG_BIT7_OFFSET); + + if (cmd == ENABLE) + { + SDMMCx->DLYCTRL |= SDMMC_MANUALTUNOUT_EN; + } + else + { + SDMMCx->DLYCTRL &= (~SDMMC_MANUALTUNOUT_EN); + } +} + + +/** + *\*\name SDMMC_EnableManualTuningIN. + *\*\fun Manually adjust rxclk input delay. + *\*\param SDMMCx : + *\*\ - SDMMC1 + *\*\ - SDMMC2 + *\*\param delay : + *\*\ - 0x00~0x1F 1~32 delay tap + *\*\param cmd : + *\*\ - ENABLE + *\*\ - DISABLE + *\*\note When manually adjusting, SDHOST should not be in working state (transmission state). + *\*\note After executing this function, it is necessary to call the enable parameter of SDMMC_SampleClockSet API. + */ +void SDMMC_EnableManualTuningIN(SDMMC_Module* SDMMCx, uint32_t delay, FunctionalState cmd) +{ + SDMMCx->DLYCTRL &= (~SDMMC_MANUALTUNGATE_EN); + + SDMMCx->DLYCTRL &= (~SDMMC_MANUALTUNIN_DELAYMASK); + SDMMCx->DLYCTRL |= delay; + + if (cmd == ENABLE) + { + SDMMCx->DLYCTRL |= SDMMC_MANUALTUNIN_EN; + SDMMCx->DLYCTRL |= SDMMC_MANUALTUNGATE_EN; + } + else + { + SDMMCx->DLYCTRL &= (~SDMMC_MANUALTUNIN_EN); + } +} + +/** + *\*\name SDMMC_FixedSampleClock. + *\*\fun Fixed clock for data sampling. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\return none. + */ +void SDMMC_FixedSampleClock(SDHOST_Module* SDHOSTx) +{ + SDHOSTx->CTRLSTS &= (~SDHOST_SAMPCLKSEL); +} + +/** + *\*\name SDMMC_EnableAutoTuning. + *\*\fun the auto tuning enbale for CMD/DATA line. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param cmd : + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none. + */ +void SDMMC_EnableAutoTuning(SDHOST_Module* SDHOSTx, FunctionalState cmd) +{ + if (cmd == ENABLE) + { + SDHOSTx->CTRLSTS |= SDHOST_AUTOTUNE; + } + else + { + SDHOSTx->CTRLSTS &= (~SDHOST_AUTOTUNE); + } +} + + +/** + *\*\name SDMMC_ConfigInt. + *\*\fun Enables or disables the interrupt signal corresponding to the interrupt status flag. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param SDHOST_Flag : + *\*\ - SDHOST_CommandCompleteFlag + *\*\ - SDHOST_DataCompleteFlag + *\*\ - SDHOST_BlockGapEventFlag + *\*\ - SDHOST_DmaCompleteFlag + *\*\ - SDHOST_BufferWriteReadyFlag + *\*\ - SDHOST_BufferReadReadyFlag + *\*\ - SDHOST_CardInsertionFlag + *\*\ - SDHOST_CardRemovalFlag + *\*\ - SDHOST_CardInterruptFlag + *\*\ - SDHOST_ReTuningEventFlag + *\*\ - SDHOST_BootACKRcvFlag + *\*\ - SDHOST_BootTerminateFlag + *\*\ - SDHOST_CommandTimeoutFlag + *\*\ - SDHOST_CommandCrcErrorFlag + *\*\ - SDHOST_CommandEndBitErrorFlag + *\*\ - SDHOST_CommandIndexErrorFlag + *\*\ - SDHOST_DataTimeoutFlag + *\*\ - SDHOST_DataCrcErrorFlag + *\*\ - SDHOST_DataEndBitErrorFlag + *\*\ - SDHOST_AutoCommand12ErrorFlag + *\*\ - SDHOST_DmaErrorFlag + *\*\ - SDHOST_TargetResErrorFlag + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none. + */ +void SDMMC_ConfigInt(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + SDHOSTx->ISE |= SDHOST_Flag; + } + else + { + SDHOSTx->ISE &= (~SDHOST_Flag); + } +} + + +/** + *\*\name SDMMC_EnableFlagStatus. + *\*\fun Can the enable/disable interrupt status be displayed. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param SDHOST_Flag : + *\*\ - SDHOST_CommandCompleteFlag + *\*\ - SDHOST_DataCompleteFlag + *\*\ - SDHOST_BlockGapEventFlag + *\*\ - SDHOST_DmaCompleteFlag + *\*\ - SDHOST_BufferWriteReadyFlag + *\*\ - SDHOST_BufferReadReadyFlag + *\*\ - SDHOST_CardInsertionFlag + *\*\ - SDHOST_CardRemovalFlag + *\*\ - SDHOST_CardInterruptFlag + *\*\ - SDHOST_ReTuningEventFlag + *\*\ - SDHOST_BootACKRcvFlag + *\*\ - SDHOST_BootTerminateFlag + *\*\ - SDHOST_CommandTimeoutFlag + *\*\ - SDHOST_CommandCrcErrorFlag + *\*\ - SDHOST_CommandEndBitErrorFlag + *\*\ - SDHOST_CommandIndexErrorFlag + *\*\ - SDHOST_DataTimeoutFlag + *\*\ - SDHOST_DataCrcErrorFlag + *\*\ - SDHOST_DataEndBitErrorFlag + *\*\ - SDHOST_AutoCommand12ErrorFlag + *\*\ - SDHOST_DmaErrorFlag + *\*\ - SDHOST_TargetResErrorFlag + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none. + */ +void SDMMC_EnableFlagStatus(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + SDHOSTx->IE |= SDHOST_Flag; + } + else + { + SDHOSTx->IE &= (~SDHOST_Flag); + } +} + +/** + *\*\name SDMMC_GetEnableFlagStatus. + *\*\fun Gets the enabled interrupt status. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param SDHOST_Flag : + *\*\ - SDHOST_CommandCompleteFlag + *\*\ - SDHOST_DataCompleteFlag + *\*\ - SDHOST_BlockGapEventFlag + *\*\ - SDHOST_DmaCompleteFlag + *\*\ - SDHOST_BufferWriteReadyFlag + *\*\ - SDHOST_BufferReadReadyFlag + *\*\ - SDHOST_CardInsertionFlag + *\*\ - SDHOST_CardRemovalFlag + *\*\ - SDHOST_CardInterruptFlag + *\*\ - SDHOST_ReTuningEventFlag + *\*\ - SDHOST_BootACKRcvFlag + *\*\ - SDHOST_BootTerminateFlag + *\*\ - SDHOST_CommandTimeoutFlag + *\*\ - SDHOST_CommandCrcErrorFlag + *\*\ - SDHOST_CommandEndBitErrorFlag + *\*\ - SDHOST_CommandIndexErrorFlag + *\*\ - SDHOST_DataTimeoutFlag + *\*\ - SDHOST_DataCrcErrorFlag + *\*\ - SDHOST_DataEndBitErrorFlag + *\*\ - SDHOST_AutoCommand12ErrorFlag + *\*\ - SDHOST_DmaErrorFlag + *\*\ - SDHOST_TargetResErrorFlag + *\*\return none. + */ +FlagStatus SDMMC_GetEnableFlagStatus(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag) +{ + FlagStatus bitstatus; + + if ((SDHOSTx->IE & SDHOST_Flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** + *\*\name SDMMC_GetFlagStatus. + *\*\fun Checks whether the specified SDHOST flag is set or not. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param SDHOST_Flag : + *\*\ - SDHOST_CommandCompleteFlag + *\*\ - SDHOST_DataCompleteFlag + *\*\ - SDHOST_BlockGapEventFlag + *\*\ - SDHOST_DmaCompleteFlag + *\*\ - SDHOST_BufferWriteReadyFlag + *\*\ - SDHOST_BufferReadReadyFlag + *\*\ - SDHOST_CardInsertionFlag + *\*\ - SDHOST_CardRemovalFlag + *\*\ - SDHOST_CardInterruptFlag + *\*\ - SDHOST_ReTuningEventFlag + *\*\ - SDHOST_BootACKRcvFlag + *\*\ - SDHOST_BootTerminateFlag + *\*\ - SDHOST_AllErrorFlag + *\*\ - SDHOST_CommandTimeoutFlag + *\*\ - SDHOST_CommandCrcErrorFlag + *\*\ - SDHOST_CommandEndBitErrorFlag + *\*\ - SDHOST_CommandIndexErrorFlag + *\*\ - SDHOST_DataTimeoutFlag + *\*\ - SDHOST_DataCrcErrorFlag + *\*\ - SDHOST_DataEndBitErrorFlag + *\*\ - SDHOST_AutoCommand12ErrorFlag + *\*\ - SDHOST_DmaErrorFlag + *\*\ - SDHOST_TargetResErrorFlag + *\*\return bitstatus. + *\*\ - SET + *\*\ - RESET + */ +FlagStatus SDMMC_GetFlagStatus(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag) +{ + FlagStatus bitstatus; + + if ((SDHOSTx->INTSTS & SDHOST_Flag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** + *\*\name SDMMC_ClrFlag. + *\*\fun This function is used to clear a specified interrupt status. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param SDHOST_Flag : + *\*\ - SDHOST_CommandCompleteFlag + *\*\ - SDHOST_DataCompleteFlag + *\*\ - SDHOST_BlockGapEventFlag + *\*\ - SDHOST_DmaCompleteFlag + *\*\ - SDHOST_BufferWriteReadyFlag + *\*\ - SDHOST_BufferReadReadyFlag + *\*\ - SDHOST_CardInsertionFlag + *\*\ - SDHOST_CardRemovalFlag + *\*\ - SDHOST_ReTuningEventFlag + *\*\ - SDHOST_BootACKRcvFlag + *\*\ - SDHOST_BootTerminateFlag + *\*\ - SDHOST_CommandTimeoutFlag + *\*\ - SDHOST_CommandCrcErrorFlag + *\*\ - SDHOST_CommandEndBitErrorFlag + *\*\ - SDHOST_CommandIndexErrorFlag + *\*\ - SDHOST_DataTimeoutFlag + *\*\ - SDHOST_DataCrcErrorFlag + *\*\ - SDHOST_DataEndBitErrorFlag + *\*\ - SDHOST_AutoCommand12ErrorFlag + *\*\ - SDHOST_DmaErrorFlag + *\*\ - SDHOST_TargetResErrorFlag + *\*\return none. + */ +void SDMMC_ClrFlag(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag) +{ + SDHOSTx->INTSTS = SDHOST_Flag; +} + + +/** + *\*\name SDMMC_EnableForceEvent. + *\*\fun Forces generating events according to the given mask. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param SDHOST_Flag : + *\*\ - SDHOST_ForceEventAutoCommand12NotExecuted + *\*\ - SDHOST_ForceEventAutoCommand12Timeout + *\*\ - SDHOST_ForceEventAutoCommand12CrcError + *\*\ - SDHOST_ForceEventAutoCommandEndBitError + *\*\ - SDHOST_ForceEventAutoCommand12IndexError + *\*\ - SDHOST_ForceEventAutoCommand12NotIssued + *\*\ - SDHOST_ForceEventCommandTimeout + *\*\ - SDHOST_ForceEventCommandCrcError + *\*\ - SDHOST_ForceEventCommandEndBitError + *\*\ - SDHOST_ForceEventCommandIndexError + *\*\ - SDHOST_ForceEventDataTimeout + *\*\ - SDHOST_ForceEventDataCrcError + *\*\ - SDHOST_ForceEventDataEndBitError + *\*\ - SDHOST_ForceEventAutoCommand12Error + *\*\ - SDHOST_ForceEventAdmaError + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none. + */ +void SDMMC_EnableForceEvent(SDHOST_Module* SDHOSTx, uint32_t SDHOST_Flag, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + SDHOSTx->STSFE |= SDHOST_Flag; + } + else + { + SDHOSTx->STSFE &= (~SDHOST_Flag); + } +} + + +/** + *\*\name SDMMC_GetPresentFlagStatus. + *\*\fun Checks whether the specified SDHOST Present flag is set or not. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param SDHOST_PreFlag : + *\*\ - SDHOST_CommandInhibitFlag + *\*\ - SDHOST_DataInhibitFlag + *\*\ - SDHOST_DataLineActiveFlag + *\*\ - SDHOST_ReTuningRequestFlag + *\*\ - SDHOST_WriteTransferActiveFlag + *\*\ - SDHOST_ReadTransferActiveFlag + *\*\ - SDHOST_BufferWriteEnableFlag + *\*\ - SDHOST_BufferReadEnableFlag + *\*\ - SDHOST_CardInsertedFlag + *\*\ - SDHOST_CardStateStableFlag + *\*\ - SDHOST_CardDetectPinFlag + *\*\ - SDHOST_CardWPSwitchPinFlag + *\*\ - SDHOST_CommandLineLevelFlag + *\*\ - SDHOST_Data0LineLevelFlag + *\*\ - SDHOST_Data1LineLevelFlag + *\*\ - SDHOST_Data2LineLevelFlag + *\*\ - SDHOST_Data3LineLevelFlag + *\*\ - SDHOST_Data4LineLevelFlag + *\*\ - SDHOST_Data5LineLevelFlag + *\*\ - SDHOST_Data6LineLevelFlag + *\*\ - SDHOST_Data7LineLevelFlag + *\*\return bitstatus. + *\*\ - SET + *\*\ - RESET + *\*\return none. + */ +FlagStatus SDMMC_GetPresentFlagStatus(SDHOST_Module* SDHOSTx, uint32_t SDHOST_PreFlag) +{ + FlagStatus bitstatus; + + if ((SDHOSTx->PRESTS & SDHOST_PreFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** + *\*\name SDMMC_GetACMDErrorStatusFlag. + *\*\fun Gets the status of auto command 12/23 error. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param SDHOST_PreFlag : + *\*\ - SDHOST_AutoCommand12NotExecutedFlag + *\*\ - SDHOST_AutoCommand12TimeoutFlag + *\*\ - SDHOST_AutoCommand12EndBitErrorFlag + *\*\ - SDHOST_AutoCommand12CrcErrorFlag + *\*\ - SDHOST_AutoCommand12IndexErrorFlag + *\*\ - SDHOST_AutoCommand12NotIssuedFlag + *\*\return bitstatus. + *\*\ - SET + *\*\ - RESET + *\*\return none. + */ +FlagStatus SDMMC_GetACMDErrorStatusFlag(SDHOST_Module* SDHOSTx, uint32_t SDHOST_ACMDFlag) +{ + FlagStatus bitstatus; + + if ((SDHOSTx->CTRLSTS & SDHOST_ACMDFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** + *\*\name SDMMC_GetADMAErrorStatusFlag. + *\*\fun Gets the status of ADMA error. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param SDHOST_PreFlag : + *\*\ - SDHOST_AdmaLenghMismatchFlag + *\*\return bitstatus. + *\*\ - SET + *\*\ - RESET + *\*\return none. + */ +FlagStatus SDMMC_GetADMAErrorStatusFlag(SDHOST_Module* SDHOSTx, uint32_t SDHOST_ADMAFlag) +{ + FlagStatus bitstatus; + + if ((SDHOSTx->ADMAESTS & SDHOST_ADMAFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** + *\*\name SDMMC_EnableHWReset + *\*\fun Triggers a hardware reset. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none + */ +void SDMMC_EnableHWReset(SDHOST_Module* SDHOSTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_HWRST; + } + else + { + SDHOSTx->CTRL1 &= (~SDHOST_CTRL1_HWRST); + } +} + + +/** + *\*\name SDMMC_ConfigWorkMode + *\*\fun Configure working mode. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param mode (The input parameters must be the following values): + *\*\ - SDMMC_DS + *\*\ - SDMMC_HS + *\*\ - SDMMC_SDR12 + *\*\ - SDMMC_SDR25 + *\*\ - SDMMC_SDR50 + *\*\ - SDMMC_SDR104 + *\*\ - SDMMC_DDR50 + *\*\ - SDMMC_SPI + *\*\return none + */ +void SDMMC_ConfigWorkMode(SDHOST_Module* SDHOSTx, SD_ModeConfig mode) +{ + if(mode == SDMMC_SPI) + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_SPIMODE; + } + else + { + SDHOSTx->CTRL1 &= (~SDHOST_CTRL1_SPIMODE); + + if (mode == SDMMC_DS) + { + SDHOSTx->CTRL1 &= (~SDHOST_CTRL1_HSEN); + } + else if (mode == SDMMC_HS) + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_HSEN; + } + else if(mode == SDMMC_SDR12) + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_HSEN; + SDHOSTx->CTRLSTS &= (~SDHOST_CTRLSTS_UHSMOD); + } + else if(mode == SDMMC_SDR25) + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_HSEN; + SDHOSTx->CTRLSTS &= (~SDHOST_CTRLSTS_UHSMOD); + SDHOSTx->CTRLSTS |= SDHOST_CTRLSTS_UHSMOD_0; + } + else if(mode == SDMMC_SDR50) + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_HSEN; + SDHOSTx->CTRLSTS &= (~SDHOST_CTRLSTS_UHSMOD); + SDHOSTx->CTRLSTS |= SDHOST_CTRLSTS_UHSMOD_1; + } + else if(mode == SDMMC_SDR104) + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_HSEN; + SDHOSTx->CTRLSTS &= (~SDHOST_CTRLSTS_UHSMOD); + SDHOSTx->CTRLSTS |= (SDHOST_CTRLSTS_UHSMOD_0 | SDHOST_CTRLSTS_UHSMOD_1); + } + else + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_HSEN; + SDHOSTx->CTRLSTS &= (~SDHOST_CTRLSTS_UHSMOD); + SDHOSTx->CTRLSTS |= SDHOST_CTRLSTS_UHSMOD_2; + } + } +} + + +/** + *\*\name SDMMC_ConfigBusWidth + *\*\fun Sets the data transfer width. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Width (The input parameters must be the following values): + *\*\ - SDHOST_DataBusWidth1Bit + *\*\ - SDHOST_DataBusWidth4Bit + *\*\ - SDHOST_DataBusWidth8Bit + *\*\return none + */ +void SDMMC_ConfigBusWidth(SDHOST_Module* SDHOSTx, SDHOST_BusWidth Width) +{ + if (Width != SDHOST_DataBusWidth8Bit) + { + SDHOSTx->CTRL1 &= (~SDHOST_CTRL1_EDTWIDTH); + + if (Width != SDHOST_DataBusWidth4Bit) + { + SDHOSTx->CTRL1 &= (~SDHOST_CTRL1_DTWIDTH); + } + else + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_DTWIDTH; + } + } + else + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_EDTWIDTH; + } +} + + +/** + *\*\name SDMMC_WriteData. + *\*\fun This function is used to implement the data transfer by Data Port instead of DMA. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\return none. + */ +void SDMMC_WriteData(SDHOST_Module* SDHOSTx, uint32_t data) +{ + SDHOSTx->BUFDAT = data; +} + +/** + *\*\name SDMMC_ReadData. + *\*\fun This function is used to implement the data transfer by Data Port instead of DMA. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\return The data has been read. + */ +uint32_t SDMMC_ReadData(SDHOST_Module* SDHOSTx) +{ + return SDHOSTx->BUFDAT; +} + + +/** + *\*\name SDMMC_EnableWakeupEvent + *\*\fun Enables or disables a wakeup event. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Wakeupevent : + *\*\ - SDHOST_WakeupEventOnCardInt + *\*\ - SDHOST_WakeupEventOnCardInsert + *\*\ - SDHOST_WakeupEventOnCardRemove + *\*\ - SDHOST_WakeupEventsAll + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none + */ +void SDMMC_EnableWakeupEvent(SDHOST_Module* SDHOSTx, uint32_t Wakeupevent, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + SDHOSTx->CTRL1 |= Wakeupevent; + } + else + { + SDHOSTx->CTRL1 &= (~Wakeupevent); + } +} + + +/** + *\*\name SDMMC_EnableSdioControl + *\*\fun Enables or disables the SDIO card control. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Wakeupevent : + *\*\ - SDHOST_StopAtBlockGapFlag + *\*\ - SDHOST_ReadWaitControlFlag + *\*\ - SDHOST_InterruptAtBlockGapFlag + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none + */ +void SDMMC_EnableSdioControl(SDHOST_Module* SDHOSTx, uint32_t Sdioflag, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + SDHOSTx->CTRL1 |= Sdioflag; + } + else + { + SDHOSTx->CTRL1 &= (~Sdioflag); + } +} + + +/** + *\*\name SDMMC_EnableContinueRequest + *\*\fun Restarts a transaction which has stopped at the block GAP for the SDIO card. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\return none + */ +void SDMMC_EnableContinueRequest(SDHOST_Module* SDHOSTx) +{ + SDHOSTx->CTRL1 |= SDHOST_CTRL1_CONTREQ; +} + + +/** + *\*\name SDMMC_EnableMmcBoot + *\*\fun Enables or disables the mmc boot mode. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none + */ +void SDMMC_EnableMmcBoot(SDHOST_Module* SDHOSTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_BOOTEN; + } + else + { + SDHOSTx->CTRL1 &= (~SDHOST_CTRL1_BOOTEN); + } +} + + +/** + *\*\name SDMMC_EnableVolSwitch + *\*\fun Enables or disables voltage switching, signal voltage will change from 3.3V to 1.8V. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none + */ +void SDMMC_EnableVolSwitch(SDHOST_Module* SDHOSTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + SDHOSTx->CTRLSTS |= SDHOST_CTRLSTS_V18SE; + } + else + { + SDHOSTx->CTRLSTS &= (~SDHOST_CTRLSTS_V18SE); + } +} + + +/** + *\*\name SDMMC_EnablePower + *\*\fun Enables or disables SD Bus Power. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none + */ +void SDMMC_EnablePower(SDHOST_Module* SDHOSTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_SDBVSEL; + SDHOSTx->CTRL1 |= SDHOST_CTRL1_SDPWR; + } + else + { + SDHOSTx->CTRL1 &= (~SDHOST_CTRL1_SDPWR); + } +} + + +/** + *\*\name SDMMC_ConfigSDMABufferSize + *\*\fun Config Host SDMA Buffer Size. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Size (The input parameters must be the following values): + *\*\ - SDHOST_SDMABUFFERSIZE_4KB + *\*\ - SDHOST_SDMABUFFERSIZE_8KB + *\*\ - SDHOST_SDMABUFFERSIZE_16KB + *\*\ - SDHOST_SDMABUFFERSIZE_32KB + *\*\ - SDHOST_SDMABUFFERSIZE_64KB + *\*\ - SDHOST_SDMABUFFERSIZE_128KB + *\*\ - SDHOST_SDMABUFFERSIZE_256KB + *\*\ - SDHOST_SDMABUFFERSIZE_512KB + *\*\return none + */ +void SDMMC_ConfigSDMABufferSize(SDHOST_Module* SDHOSTx, SDHOST_SDMA_Buffer_Size Size) +{ + SDHOSTx->BLKCFG &= (~SDHOST_BLKCFG_HDBS); + SDHOSTx->BLKCFG |= (uint32_t)Size; +} + + +/** + *\*\name SDMMC_TModeStructInit. + *\*\fun Fills each TMODE_struct member with its default value.. + *\*\param TMODE_struct: pointer to a SDHOST_TMODE_struct structure. + *\*\ - DMAE + *\*\ - SDHOST_TMODE_DMADISABLE + *\*\ - SDHOST_TMODE_DMAENABLE + *\*\ - BCNTE + *\*\ - SDHOST_TMODE_BLOCKCNTDISABLE + *\*\ - SDHOST_TMODE_BLOCKCNTENABLE + *\*\ - ACMDE + *\*\ - SDHOST_TMODE_NOACMDEN + *\*\ - SDHOST_TMODE_AC12EN + *\*\ - SDHOST_TMODE_AC23EN + *\*\ - DATDIR + *\*\ - SDHOST_TMODE_DATDIR_WRITE + *\*\ - SDHOST_TMODE_DATDIR_READ + *\*\ - BLKSEL + *\*\ - SDHOST_TMODE_SINGLEBLK + *\*\ - SDHOST_TMODE_MULTIBLK + *\*\return none + */ +void SDMMC_TModeStructInit(SDHOST_TMODE_struct *TMODE_struct) +{ + /* TMODE_struct members default value */ + TMODE_struct->DMAE = SDHOST_TMODE_DMADISABLE; + TMODE_struct->BCNTE = SDHOST_TMODE_BLOCKCNTDISABLE; + TMODE_struct->ACMDE = SDHOST_TMODE_NOACMDEN; + TMODE_struct->DATDIR = SDHOST_TMODE_DATDIR_WRITE; + TMODE_struct->BLKSEL = SDHOST_TMODE_SINGLEBLK; +} + + +/** + *\*\name SDMMC_ConfigCardDetectSignal + *\*\fun Config card detect signal source and test level. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Signalsource (The input parameters must be the following values): + *\*\ - SDMMC_CARDDETECT_NORMAL + *\*\ - SDMMC_CARDDETECT_TEST + *\*\param Signallevel (The input parameters must be the following values): + *\*\ - SDMMC_CARDTESTLEVEL_LOW + *\*\ - SDMMC_CARDTESTLEVEL_HIGH + *\*\return none + */ +void SDMMC_ConfigCardDetectSignal(SDHOST_Module* SDHOSTx, uint32_t Signalsource, uint32_t Signallevel) +{ + SDHOSTx->CTRL1 &= (~(SDMMC_CARDDETECT_TEST | SDMMC_CARDTESTLEVEL_HIGH)); + SDHOSTx->CTRL1 |= (Signalsource | Signallevel); +} + + +/** + *\*\name SDMMC_EnableLED + *\*\fun Enables or disables LED. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none + */ +void SDMMC_EnableLED(SDHOST_Module* SDHOSTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + SDHOSTx->CTRL1 |= SDHOST_CTRL1_LEDCTRL; + } + else + { + SDHOSTx->CTRL1 &= (~SDHOST_CTRL1_LEDCTRL); + } +} + + +/** + *\*\name SDMMC_EnableAsyncInt + *\*\fun Enables or disables Asynchronous Interrupt. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Cmd (The input parameters must be the following values): + *\*\ - ENABLE + *\*\ - DISABLE + *\*\return none + */ +void SDMMC_EnableAsyncInt(SDHOST_Module* SDHOSTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + SDHOSTx->CTRLSTS |= SDHOST_CTRLSTS_ASYNCIE; + } + else + { + SDHOSTx->CTRLSTS &= (~SDHOST_CTRLSTS_ASYNCIE); + } +} + + +/** + *\*\name SDMMC_ConfigDATATimeoutValue + *\*\fun Config Data Level Timeout Counter Value. + *\*\param SDHOSTx : + *\*\ - SDHOST1 + *\*\ - SDHOST2 + *\*\param Count (The input parameters must be the following values): + *\*\ - 0x0~0xF , The corresponding actual delay value is (1/TMCLK * 2^(Count + 13)) + *\*\return none + */ +void SDMMC_ConfigDATATimeoutValue(SDHOST_Module* SDHOSTx, uint32_t Count) +{ + SDHOSTx->CTRL2 &= (~SDHOST_CTRL2_DTCNT); + SDHOSTx->CTRL2 |= (Count << REG_BIT16_OFFSET); +} + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_sdram.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_sdram.c new file mode 100644 index 0000000000..0f91816f70 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_sdram.c @@ -0,0 +1,694 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_sdram.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_sdram.h" +#include "n32h76x_78x_rcc.h" + +/** +*\*\name SDRAM_DeInit. +*\*\fun Deinitializes the SDRAM module to their default reset values. +*\*\param none +*\*\return none +**/ +void SDRAM_DeInit(void) +{ + /* SDRAM soft reset */ + RCC_EnableAXIPeriphReset4(RCC_AXI_PERIPHRST_SDRAM); +} + +/** +*\*\name SDRAM_TimingInit. +*\*\fun SDRAM Timing Registers Configuration. +*\*\param Timing: The parameter range is as follows +*\*\ - RowActiveTime : from 1 to 64 +*\*\ - RowCycleTime : from 1 to 64 +*\*\ - RowActToRowActDelay : from 1 to 64 +*\*\ - PrechargeTime : from 1 to 64 +*\*\ - WriteRecoveryTime : from 1 to 64 +*\*\ - RefreshCycleTime : from 1 to 64 +*\*\ - RAStoCASDelay : from 1 to 16 +*\*\return none +**/ +void SDRAM_TimingInit(SDRAM_TimingType *Timing) +{ + SDRAM->RAT = Timing->RowActiveTime; + SDRAM->RCT = Timing->RowCycleTime; + SDRAM->RRDLY = Timing->RowActToRowActDelay; + SDRAM->PT = Timing->PrechargeTime; + SDRAM->WRT = Timing->WriteRecoveryTime; + SDRAM->RFCT = Timing->RefreshCycleTime; + SDRAM->RCDLY = Timing->RAStoCASDelay; +} + +/** +*\*\name SDRAM_RefreshIntervalInit. +*\*\fun Configure the refresh interval parameter. +*\*\param The input parameters must be the following values: +*\*\ - RefreshIntervalTime: from 1 to 16777216 +*\*\return none +**/ +void SDRAM_RefreshIntervalInit(uint32_t RefreshIntervalTime) +{ + SDRAM->RI = RefreshIntervalTime; +} + +/** +*\*\name SDRAM_SetAddress. +*\*\fun SDRAM set Base Address and mask address. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - BaseAddr +*\*\ - 0xC0000000 Default value for SDRAM1 +*\*\ - 0xD0000000 Default value for SDRAM2 +*\*\ - AddrMask +*\*\ - (0xFFFFFFFF-(SDRAM SIZE-1)) +*\*\return none +**/ +void SDRAM_SetDeviceAddress(SDRAM_DeviceType DeviceNo, uint32_t BaseAddr, uint32_t AddrMask) +{ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->BADD1 = BaseAddr; + SDRAM->ADDMASK1 = AddrMask; + } + else + { + SDRAM->BADD2 = BaseAddr; + SDRAM->ADDMASK2 = AddrMask; + } +} + +/** +*\*\name SDRAM_EnableDevice. +*\*\fun SDRAM Device enable. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SDRAM_EnableDevice(SDRAM_DeviceType DeviceNo, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SDRAM Device*/ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 |= SDRAM_DEVICE_ENABLE; + } + else + { + SDRAM->CFG2 |= SDRAM_DEVICE_ENABLE; + } + } + else + { + /* Disable the selected SDRAM Device */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 &= SDRAM_DEVICE_DISABLE; + } + else + { + SDRAM->CFG2 &= SDRAM_DEVICE_DISABLE; + } + } +} + +/** +*\*\name SDRAM_EnableRefreshCMD. +*\*\fun SDRAM Refresh enable of the selected device. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SDRAM_EnableRefreshCMD(SDRAM_DeviceType DeviceNo, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SDRAM Refresh */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 |= SDRAM_DEVICE_REFRESH_ENABLE; + } + else + { + SDRAM->CFG2 |= SDRAM_DEVICE_REFRESH_ENABLE; + } + } + else + { + /* Disable the selected SDRAM Refresh */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 &= SDRAM_DEVICE_REFRESH_DISABLE; + } + else + { + SDRAM->CFG2 &= SDRAM_DEVICE_REFRESH_DISABLE; + } + } +} + +/** +*\*\name SDRAM_EnableAutoPrecharge. +*\*\fun SDRAM Auto Precharge enable of the selected device. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SDRAM_EnableAutoPrecharge(SDRAM_DeviceType DeviceNo, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SDRAM Auto Precharge */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 |= SDRAM_DEVICE_AUTOPRECHRG_ENABLE; + } + else + { + SDRAM->CFG2 |= SDRAM_DEVICE_AUTOPRECHRG_ENABLE; + } + } + else + { + /* Disable the selected SDRAM Auto Precharge */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 &= SDRAM_DEVICE_AUTOPRECHRG_DISABLE; + } + else + { + SDRAM->CFG2 &= SDRAM_DEVICE_AUTOPRECHRG_DISABLE; + } + } +} + +/** +*\*\name SDRAM_EnablePrefetchRead. +*\*\fun SDRAM Prefetch Read enable of the selected device. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SDRAM_EnablePrefetchRead(SDRAM_DeviceType DeviceNo, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SDRAM Prefetch Read */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 |= SDRAM_DEVICE_PREFETCHREAD_ENABLE; + } + else + { + SDRAM->CFG2 |= SDRAM_DEVICE_PREFETCHREAD_ENABLE; + } + } + else + { + /* Disable the selected SDRAM Prefetch Read */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 &= SDRAM_DEVICE_PREFETCHREADG_DISABLE; + } + else + { + SDRAM->CFG2 &= SDRAM_DEVICE_PREFETCHREADG_DISABLE; + } + } +} + +/** +*\*\name SDRAM_EnableSOM. +*\*\fun SDRAM Store On Miss(SOM) enable of the selected device. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SDRAM_EnableSOM(SDRAM_DeviceType DeviceNo, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SDRAM Store On Miss(SOM) */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 |= SDRAM_DEVICE_SOM_ENABLE; + } + else + { + SDRAM->CFG2 |= SDRAM_DEVICE_SOM_ENABLE; + } + } + else + { + /* Disable the selected SDRAM Store On Miss(SOM) */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 &= SDRAM_DEVICE_SOM_DISABLE; + } + else + { + SDRAM->CFG2 &= SDRAM_DEVICE_SOM_DISABLE; + } + } +} + +/** +*\*\name SDRAM_EnableBankInterleave. +*\*\fun SDRAM BankInterleave enable of the selected device. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SDRAM_EnableBankInterleave(SDRAM_DeviceType DeviceNo, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SDRAM BankInter leave */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 |= SDRAM_DEVICE_BANKIL_ENABLE; + } + else + { + SDRAM->CFG2 |= SDRAM_DEVICE_BANKIL_ENABLE; + } + } + else + { + /* Disable the selected SDRAM Bank Interleave */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->CFG1 &= SDRAM_DEVICE_BANKIL_DISABLE; + } + else + { + SDRAM->CFG2 &= SDRAM_DEVICE_BANKIL_DISABLE; + } + } +} + +/** +*\*\name SDRAM_ConfigBusWidth. +*\*\fun Configures the SDRAM Bus Width of the selected device. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - BusWidth: +*\*\ - SDRAM_DEVICE_BUSWID_8BITS +*\*\ - SDRAM_DEVICE_BUSWID_16BITS +*\*\ - SDRAM_DEVICE_BUSWID_32BITS +*\*\return none +**/ +void SDRAM_ConfigBusWidth(SDRAM_DeviceType DeviceNo, uint32_t BusWidth) +{ + uint32_t reg_value; + + /* Configures the selected SDRAM Bus Width */ + if(DeviceNo == SDRAM_DEVICE_1) + { + reg_value = SDRAM->CFG1; + reg_value &= SDRAM_DEVICE_BUSWID_MASK; + reg_value |= BusWidth; + SDRAM->CFG1 = reg_value; + } + else + { + reg_value = SDRAM->CFG2; + reg_value &= SDRAM_DEVICE_BUSWID_MASK; + reg_value |= BusWidth; + SDRAM->CFG2 = reg_value; + } +} + +/** +*\*\name SDRAM_ConfigBurstLength. +*\*\fun Configures the SDRAM Burst Length of the selected device. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - BurstLength: +*\*\ - SDRAM_DEVICE_BURSTLEN_1 +*\*\ - SDRAM_DEVICE_BURSTLEN_2 +*\*\ - SDRAM_DEVICE_BURSTLEN_4 +*\*\ - SDRAM_DEVICE_BURSTLEN_8 +*\*\return none +**/ +void SDRAM_ConfigBurstLength(SDRAM_DeviceType DeviceNo, uint32_t BurstLength) +{ + uint32_t reg_value; + + /* Configures the selected SDRAM Burst Length */ + if(DeviceNo == SDRAM_DEVICE_1) + { + reg_value = SDRAM->CFG1; + reg_value &= SDRAM_DEVICE_BURSTLEN_MASK; + reg_value |= BurstLength; + SDRAM->CFG1 = reg_value; + } + else + { + reg_value = SDRAM->CFG2; + reg_value &= SDRAM_DEVICE_BURSTLEN_MASK; + reg_value |= BurstLength; + SDRAM->CFG2 = reg_value; + } +} + +/** +*\*\name SDRAM_ConfigCASLatency. +*\*\fun Configures the SDRAM CAS Latency of the selected device. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - CASLatency: +*\*\ - SDRAM_DEVICE_CASLTCY_0 +*\*\ - SDRAM_DEVICE_CASLTCY_1 +*\*\ - SDRAM_DEVICE_CASLTCY_2 +*\*\ - SDRAM_DEVICE_CASLTCY_3 +*\*\return none +**/ +void SDRAM_ConfigCASLatency(SDRAM_DeviceType DeviceNo, uint32_t Latency) +{ + uint32_t reg_value; + + /* Configures the selected SDRAM CAS Latency */ + if(DeviceNo == SDRAM_DEVICE_1) + { + reg_value = SDRAM->CFG1; + reg_value &= SDRAM_DEVICE_CASLTCY_MASK; + reg_value |= Latency; + SDRAM->CFG1 = reg_value; + } + else + { + reg_value = SDRAM->CFG2; + reg_value &= SDRAM_DEVICE_CASLTCY_MASK; + reg_value |= Latency; + SDRAM->CFG2 = reg_value; + } +} + +/** +*\*\name SDRAM_ConfigAddress. +*\*\fun Configures the SDRAM Address of the selected device. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - Address: +*\*\ - SDRAM_BANK4_ROW4096_COL256 +*\*\ - SDRAM_BANK4_ROW4096_COL512 +*\*\ - SDRAM_BANK4_ROW4096_COL1024 +*\*\ - SDRAM_BANK4_ROW4096_COL2048 +*\*\ - SDRAM_BANK4_ROW8192_COL256 +*\*\ - SDRAM_BANK4_ROW8192_COL512 +*\*\ - SDRAM_BANK4_ROW8192_COL1024 +*\*\ - SDRAM_BANK4_ROW8192_COL2048 +*\*\ - SDRAM_BANK4_ROW2048_COL256 +*\*\ - SDRAM_BANK4_ROW2048_COL512 +*\*\ - SDRAM_BANK4_ROW2048_COL1024 +*\*\ - SDRAM_BANK4_ROW2048_COL2048 +*\*\return none +**/ +void SDRAM_ConfigAddress(SDRAM_DeviceType DeviceNo, uint32_t Address) +{ + uint32_t reg_value; + + /* Configures the selected SDRAM Address */ + if(DeviceNo == SDRAM_DEVICE_1) + { + reg_value = SDRAM->CFG1; + reg_value &= SDRAM_DEVICE_ADDCFG_MASK; + reg_value |= Address; + SDRAM->CFG1 = reg_value; + } + else + { + reg_value = SDRAM->CFG2; + reg_value &= SDRAM_DEVICE_ADDCFG_MASK; + reg_value |= Address; + SDRAM->CFG2 = reg_value; + } +} + +/** +*\*\name SDRAM_EnableClock. +*\*\fun SDRAM Clock enable. +*\*\param The input parameters must be the following values: +*\*\ - Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SDRAM_EnableClock(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the SDRAM Clock */ + SDRAM->OS |= SDRAM_CLOCK_ENABLE; + } + else + { + /* Disable the SDRAM Clock */ + SDRAM->OS &= SDRAM_CLOCK_DISABLE; + } +} + +/** +*\*\name SDRAM_SetOperationCode. +*\*\fun Set the SDRAM Operation Code. +*\*\param The input parameters must be the following values: +*\*\ - OperationCode: +*\*\ - SDRAM_OPCODE_NONE +*\*\ - SDRAM_OPCODE_PRECHRG +*\*\ - SDRAM_OPCODE_REFRESH +*\*\ - SDRAM_OPCODE_LOADMODE +*\*\return none +**/ +void SDRAM_SetOperationCode(uint32_t OperationCode) +{ + uint32_t reg_value; + + reg_value = SDRAM->OS; + /* Clear the SDRAM Operation Code */ + reg_value &= SDRAM_OPCODE_MASK; + /* Set the SDRAM Operation Code */ + reg_value |= OperationCode; + SDRAM->OS = reg_value; +} + +/** +*\*\name SDRAM_SetDeviceSelect. +*\*\fun Set the SDRAM Device. +*\*\param The input parameters must be the following values: +*\*\ - ChipSelect: +*\*\ - SDRAM_CS_ALL +*\*\ - SDRAM_CS_SDRAM2_ONLY +*\*\ - SDRAM_CS_SDRAM1_ONLY +*\*\ - SDRAM_CS_NONE +*\*\return none +**/ +void SDRAM_SetDeviceSelect(uint32_t ChipSelect) +{ + uint32_t reg_value; + + reg_value = SDRAM->OS; + /* Clear the SDRAM Device */ + reg_value &= SDRAM_CS_MASK; + /* Set the SDRAM Device */ + reg_value |= ChipSelect; + SDRAM->OS = reg_value; +} + +/** +*\*\name SDRAM_SetBank. +*\*\fun Set the SDRAM Bank. +*\*\param The input parameters must be the following values: +*\*\ - BankNo: +*\*\ - SDRAM_BANKADD_1 +*\*\ - SDRAM_BANKADD_2 +*\*\ - SDRAM_BANKADD_3 +*\*\ - SDRAM_BANKADD_4 +*\*\return none +**/ +void SDRAM_SetBank(uint32_t BankNo) +{ + uint32_t reg_value; + + reg_value = SDRAM->OS; + /* Clear the SDRAM Bank */ + reg_value &= SDRAM_BANKADD_MASK; + /* Set the SDRAM Bank */ + reg_value |= BankNo; + SDRAM->OS = reg_value; +} + +/** +*\*\name SDRAM_SetAddress. +*\*\fun Set the SDRAM Bank. +*\*\param The input parameters must be the following values: +*\*\ - Address: +*\*\return none +**/ +void SDRAM_SetAddress(uint32_t Address) +{ + uint32_t reg_value; + + reg_value = SDRAM->OS; + /* Clear the SDRAM Address */ + reg_value &= SDRAM_OS_ADDRESS_MASK; + /* Set the SDRAM Address */ + reg_value |= (Address & SDRAM_OS_ADD); + SDRAM->OS = reg_value; +} + +/** +*\*\name SDRAM_EnableWriteProtection. +*\*\fun Write protection enable of the selected device. +*\*\param The input parameters must be the following values: +*\*\ - DeviceNo: +*\*\ - SDRAM_DEVICE_1 +*\*\ - SDRAM_DEVICE_2 +*\*\ - Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SDRAM_EnableWriteProtection(SDRAM_DeviceType DeviceNo, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the Write protection of selected SDRAM Device*/ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->WP |= SDRAM_WP_SDRAM1_ENABLE; + } + else + { + SDRAM->WP |= SDRAM_WP_SDRAM2_ENABLE; + } + } + else + { + /* Disable the Write protection of selected SDRAM Device */ + if(DeviceNo == SDRAM_DEVICE_1) + { + SDRAM->WP &= SDRAM_WP_SDRAM1_DISABLE; + } + else + { + SDRAM->WP &= SDRAM_WP_SDRAM2_DISABLE; + } + } +} + +/** +*\*\name SDRAM_EnableAddressRemap. +*\*\fun SDRAM1 address remapped from 0xC0000000 to 0x60000000. +*\*\param The input parameters must be the following values: +*\*\ - Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SDRAM_EnableAddressRemap(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + FEMC->FEMC_REMAP = SDRAM_REMAP_ENABLE; + } + else + { + FEMC->FEMC_REMAP = SDRAM_REMAP_DISABLE; + } +} + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_shrtim.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_shrtim.c new file mode 100644 index 0000000000..af183608e2 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_shrtim.c @@ -0,0 +1,10593 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_shrtim.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_shrtim.h" + +/** +*\*\fun Select the SHRTIM synchronization input source. +*\*\note This function must not be called when the concerned timer(s) is (are) enabled . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param SyncInSrc This parameter can be one of the following values: +*\*\ - SHRTIM_SYNCIN_SRC_INTERNAL_EVENT_0 from ATIM1 trgo +*\*\ - SHRTIM_SYNCIN_SRC_INTERNAL_EVENT_1 from ATIM2 trgo +*\*\ - SHRTIM_SYNCIN_SRC_INTERNAL_EVENT_2 from ATIM3 trgo +*\*\ - SHRTIM_SYNCIN_SRC_EXTERNAL_EVENT_3 from IOM +*\*\ - SHRRIM_SYNCIN_SRC_INTERNAL_EVENT_4 from shrtim_out_sync2 of another SHRTIM +*\*\return None +**/ +void SHRTIM_SetSyncInSrc(SHRTIM_Module *SHRTIMx, uint32_t SyncInSrc) +{ + MODIFY_REG(SHRTIMx->sMasterRegs.MCTRL, SHRTIM_MCTRL_SYNCIN, SyncInSrc); +} + +/** +*\*\fun Get actual SHRTIM synchronization input source. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return SyncInSrc Returned value can be one of the following values: +*\*\ - SHRTIM_SYNCIN_SRC_INTERNAL_EVENT_0 from ATIM1 trgo +*\*\ - SHRTIM_SYNCIN_SRC_INTERNAL_EVENT_1 from ATIM2 trgo +*\*\ - SHRTIM_SYNCIN_SRC_INTERNAL_EVENT_2 from ATIM3 trgo +*\*\ - SHRTIM_SYNCIN_SRC_EXTERNAL_EVENT_3 from IOM +*\*\ - SHRRIM_SYNCIN_SRC_EXTERNAL_EVENT_4 from shrtim_out_sync2 of another SHRTIM +**/ +uint32_t SHRTIM_GetSyncInSrc(SHRTIM_Module *SHRTIMx) +{ + return (READ_BIT(SHRTIMx->sMasterRegs.MCTRL, SHRTIM_MCTRL_SYNCIN)); +} + +/** +*\*\fun Configure the SHRTIM synchronization output. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Config This parameter can be one of the following values: +*\*\ - SHRTIM_SYNCOUT_DISABLED +*\*\ - SHRTIM_SYNCOUT_POSITIVE_PULSE +*\*\ - SHRTIM_SYNCOUT_NEGATIVE_PULSE +*\*\param Src This parameter can be one of the following values: +*\*\ - SHRTIM_SYNCOUT_SRC_MASTER_START +*\*\ - SHRTIM_SYNCOUT_SRC_MASTER_CMP1 +*\*\ - SHRTIM_SYNCOUT_SRC_TIMA_START +*\*\ - SHRTIM_SYNCOUT_SRC_TIMA_CMP1 +*\*\return None +**/ +void SHRTIM_ConfigSyncOut(SHRTIM_Module *SHRTIMx, uint32_t Config, uint32_t Src) +{ + MODIFY_REG(SHRTIMx->sMasterRegs.MCTRL, SHRTIM_MCTRL_SYNCOSRC, Src); + MODIFY_REG(SHRTIMx->sMasterRegs.SYNCOUT, SHRTIM_SYNCOUT_SYNCOUTPUS, Config); +} + +/** +*\*\fun Set the routing and conditioning of the syncout event. +*\*\note This function can be called only when the master timer is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param SyncOutConfig This parameter can be one of the following values: +*\*\ - SHRTIM_SYNCOUT_DISABLED +*\*\ - SHRTIM_SYNCOUT_POSITIVE_PULSE +*\*\ - SHRTIM_SYNCOUT_NEGATIVE_PULSE +*\*\return None +**/ +void SHRTIM_SetSyncOutConfig(SHRTIM_Module *SHRTIMx, uint32_t SyncOutConfig) +{ + MODIFY_REG(SHRTIMx->sMasterRegs.SYNCOUT, SHRTIM_SYNCOUT_SYNCOUTPUS, SyncOutConfig); +} + +/** +*\*\fun Get actual routing and conditioning of the syncout event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return SyncOutConfig Returned value can be one of the following values: +*\*\ - SHRTIM_SYNCOUT_DISABLED +*\*\ - SHRTIM_SYNCOUT_POSITIVE_PULSE +*\*\ - SHRTIM_SYNCOUT_NEGATIVE_PULSE +**/ +uint32_t SHRTIM_GetSyncOutConfig(SHRTIM_Module *SHRTIMx) +{ + return (READ_BIT(SHRTIMx->sMasterRegs.SYNCOUT, SHRTIM_SYNCOUT_SYNCOUTPUS)); +} + +/** +*\*\fun Set the source and event to be sent on the SHRTIM synchronization output. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param SyncOutSrc This parameter can be one of the following values: +*\*\ - SHRTIM_SYNCOUT_SRC_MASTER_START +*\*\ - SHRTIM_SYNCOUT_SRC_MASTER_CMP1 +*\*\ - SHRTIM_SYNCOUT_SRC_TIMA_START +*\*\ - SHRTIM_SYNCOUT_SRC_TIMA_CMP1 +*\*\return None +**/ +void SHRTIM_SetSyncOutSrc(SHRTIM_Module *SHRTIMx, uint32_t SyncOutSrc) +{ + MODIFY_REG(SHRTIMx->sMasterRegs.MCTRL, SHRTIM_MCTRL_SYNCOSRC, SyncOutSrc); +} + +/** +*\*\fun Get actual source and event sent on the SHRTIM synchronization output. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return SyncOutSrc Returned value can be one of the following values: +*\*\ - SHRTIM_SYNCOUT_SRC_MASTER_START +*\*\ - SHRTIM_SYNCOUT_SRC_MASTER_CMP1 +*\*\ - SHRTIM_SYNCOUT_SRC_TIMA_START +*\*\ - SHRTIM_SYNCOUT_SRC_TIMA_CMP1 +**/ +uint32_t SHRTIM_GetSyncOutSrc(SHRTIM_Module *SHRTIMx) +{ + return (READ_BIT(SHRTIMx->sMasterRegs.MCTRL, SHRTIM_MCTRL_SYNCOSRC)); +} + +/** +*\*\fun Disable (temporarily) update event generation. +*\*\note Allow to temporarily disable the transfer from preload to active +*\*\ registers, whatever the selected update event. This allows to modify +*\*\ several registers in multiple timers. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timers This parameter can be a combination of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_SuspendUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timers) +{ + /* clear register before applying the new value */ + CLEAR_BIT(SHRTIMx->sCommonRegs.CTRL1, ((SHRTIM_TIMER_ALL >> SHRTIM_MCTRL_MCNTEN_Pos) & SHRTIM_CTRL1_UDIS_MASK)); + SET_BIT(SHRTIMx->sCommonRegs.CTRL1, ((Timers >> SHRTIM_MCTRL_MCNTEN_Pos) & SHRTIM_CTRL1_UDIS_MASK)); +} + +/** +*\*\fun Enable update event generation. +*\*\note The regular update event takes place. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timers This parameter can be a combination of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ResumeUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timers) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.CTRL1, ((Timers >> SHRTIM_MCTRL_MCNTEN_Pos) & SHRTIM_CTRL1_UDIS_MASK)); +} + +/** +*\*\fun Force an immediate transfer from the preload to the active register . +*\*\note Any pending update request is cancelled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timers This parameter can be a combination of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ForceUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timers) +{ + SET_BIT(SHRTIMx->sCommonRegs.CTRL2, ((Timers >> SHRTIM_MCTRL_MCNTEN_Pos) & SHRTIM_CTRL2_SWUPD_MASK)); +} + +/** +*\*\fun Reset the SHRTIM timer(s) counter. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timers This parameter can be a combination of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_CounterReset(SHRTIM_Module *SHRTIMx, uint32_t Timers) +{ + SET_BIT(SHRTIMx->sCommonRegs.CTRL2, (((Timers >> SHRTIM_MCTRL_MCNTEN_Pos) << SHRTIM_CTRL2_MSWCNTRST_Pos) & SHRTIM_CTRL2_SWRST_MASK)); +} + +/** +*\*\fun enable the swap of the Timer Output. +*\*\note the SHRTIM_TASET1 and SHRTIM_TARST1 are coding for the output A2, +*\*\ and the SHRTIM_TASET2 and SHRTIM_TARST2 are coding for the output A1 +*\*\note This bit is not significant when the Push-pull mode is enabled (PP = 1) +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableSwapOutputs(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + + SET_BIT(SHRTIMx->sCommonRegs.CTRL2, (uint32_t)(SHRTIM_CTRL2_SWAPA) << iTimer); +} + +/** +*\*\fun disable the swap of the Timer Output. +*\*\note the SHRTIM_TASET1 and SHRTIM_TARST1 are coding for the output A1, +*\*\ and the SHRTIM_TASET2 and SHRTIM_TARST2 are coding for the output A2 +*\*\note This bit is not significant when the Push-pull mode is enabled (PP = 1) +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableSwapOutputs(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + + CLEAR_BIT(SHRTIMx->sCommonRegs.CTRL2, (SHRTIM_CTRL2_SWAPA << iTimer)); +} + +/** +*\*\fun reports the Timer Outputs swap position. +*\*\note This bit is not significant when the Push-pull mode is enabled (PP = 1) +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return +*\*\ 1: SHRTIM_TASET1 and SHRTIM_TARST1 are coding for the output A2, +*\*\ SHRTIM_TASET2 and SHRTIM_TARST2 are coding for the output A1 +*\*\ 0: SHRTIM_TASET1 and SHRTIM_TARST1 are coding for the output A1, +*\*\ SHRTIM_TASET2 and SHRTIM_TARST2 are coding for the output A2 +**/ +uint32_t SHRTIM_IsEnabledSwapOutputs(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)((POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos) & 0x1FU); + + return (READ_BIT(SHRTIMx->sCommonRegs.CTRL2, (uint32_t)(SHRTIM_CTRL2_SWAPA) << iTimer) >> ((SHRTIM_CTRL2_SWAPA_Pos + iTimer))); +} + +/** +*\*\fun Enable the SHRTIM timer(s) output(s) . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Outputs This parameter can be a combination of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return None +**/ +void SHRTIM_EnableOutput(SHRTIM_Module *SHRTIMx, uint32_t Outputs) +{ + SET_BIT(SHRTIMx->sCommonRegs.OEN, (Outputs & SHRTIM_OEN_OEN_MASK)); +} + +/** +*\*\fun Disable the SHRTIM timer(s) output(s) . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Outputs This parameter can be a combination of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return None +**/ +void SHRTIM_DisableOutput(SHRTIM_Module *SHRTIMx, uint32_t Outputs) +{ + SET_BIT(SHRTIMx->sCommonRegs.ODIS, (Outputs & SHRTIM_ODIS_ODIS_MASK)); +} + +/** +*\*\fun Indicates whether the SHRTIM timer output is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return State of TxyOEN bit in SHRTIM_OEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledOutput(SHRTIM_Module *SHRTIMx, uint32_t Output) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.OEN, Output) == Output) ? 1UL : 0UL); +} + +/** +*\*\fun Indicates whether the SHRTIM timer output is disabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return State of TxyODIS bit in SHRTIM_OEN register (1 or 0). +**/ +uint32_t SHRTIM_IsDisabledOutput(SHRTIM_Module *SHRTIMx, uint32_t Output) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.OEN, Output) == 0U) ? 1UL : 0UL); +} + +/** +*\*\fun Configure an ADC trigger. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param ADCTrigSrcReg This parameter can be one of the following values: +*\*\ - SHRTIM_ADCTRIG1_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG1_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG2_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG2_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG3_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG3_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG4_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG4_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG5_SOURCE +*\*\ - SHRTIM_ADCTRIG6_SOURCE +*\*\ - SHRTIM_ADCTRIG7_SOURCE +*\*\ - SHRTIM_ADCTRIG8_SOURCE +*\*\ - SHRTIM_ADCTRIG9_SOURCE +*\*\ - SHRTIM_ADCTRIG10_SOURCE +*\*\param ADCTrig This parameter can be one of the following values: +*\*\ - SHRTIM_ADCTRIG_1 +*\*\ - SHRTIM_ADCTRIG_2 +*\*\ - SHRTIM_ADCTRIG_3 +*\*\ - SHRTIM_ADCTRIG_4 +*\*\ - SHRTIM_ADCTRIG_5 +*\*\ - SHRTIM_ADCTRIG_6 +*\*\ - SHRTIM_ADCTRIG_7 +*\*\ - SHRTIM_ADCTRIG_8 +*\*\ - SHRTIM_ADCTRIG_9 +*\*\ - SHRTIM_ADCTRIG_10 +*\*\param Update This parameter can be one of the following values: +*\*\ - SHRTIM_ADCTRIG_UPDATE_MASTER +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_A +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_B +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_C +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_D +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_E +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_F +*\*\param Src This parameter can be a combination of the following values: +*\*\ For ADC trigger 1 group 1 and ADC trigger 3 group 1: +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBRSTRO +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TARSTRO +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TAPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP1 +*\*\ For ADC trigger 1 group 2 and ADC trigger 3 group 2: +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFRSTRO +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TEPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP1 +*\*\ For ADC trigger 2 group 1 and ADC trigger 4 group 1: +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCRSTRO +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TAPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP1 +*\*\ For ADC trigger 2 group 2 and ADC trigger 4 group 2: +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV10 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV9 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV8 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV7 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV6 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TERSTRO +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDRSTRO +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP1 +*\*\ For ADC trigger 5, ADC trigger 7 and ADC trigger 9 this parameter +*\*\ can be one of the following values: +*\*\ - SHRTIM_ADTG579_MCMP1 +*\*\ - SHRTIM_ADTG579_MCMP2 +*\*\ - SHRTIM_ADTG579_MCMP3 +*\*\ - SHRTIM_ADTG579_MCMP4 +*\*\ - SHRTIM_ADTG579_MPRD +*\*\ - SHRTIM_ADTG579_EXEV1 +*\*\ - SHRTIM_ADTG579_EXEV2 +*\*\ - SHRTIM_ADTG579_EXEV3 +*\*\ - SHRTIM_ADTG579_EXEV4 +*\*\ - SHRTIM_ADTG579_EXEV5 +*\*\ - SHRTIM_ADTG579_TACMP1 +*\*\ - SHRTIM_ADTG579_TACMP2 +*\*\ - SHRTIM_ADTG579_TACMP3 +*\*\ - SHRTIM_ADTG579_TACMP4 +*\*\ - SHRTIM_ADTG579_TACMP5 +*\*\ - SHRTIM_ADTG579_TAPRD +*\*\ - SHRTIM_ADTG579_TARSTRO +*\*\ - SHRTIM_ADTG579_TBCMP1 +*\*\ - SHRTIM_ADTG579_TBCMP2 +*\*\ - SHRTIM_ADTG579_TBCMP3 +*\*\ - SHRTIM_ADTG579_TBCMP4 +*\*\ - SHRTIM_ADTG579_TBCMP5 +*\*\ - SHRTIM_ADTG579_TBPRD +*\*\ - SHRTIM_ADTG579_TBRSTRO +*\*\ - SHRTIM_ADTG579_TCCMP1 +*\*\ - SHRTIM_ADTG579_TCCMP2 +*\*\ - SHRTIM_ADTG579_TCCMP3 +*\*\ - SHRTIM_ADTG579_TCCMP4 +*\*\ - SHRTIM_ADTG579_TCCMP5 +*\*\ - SHRTIM_ADTG579_TCPRD +*\*\ - SHRTIM_ADTG579_TDCMP1 +*\*\ - SHRTIM_ADTG579_TDCMP2 +*\*\ - SHRTIM_ADTG579_TDCMP3 +*\*\ - SHRTIM_ADTG579_TDCMP4 +*\*\ - SHRTIM_ADTG579_TDCMP5 +*\*\ - SHRTIM_ADTG579_TDPRD +*\*\ - SHRTIM_ADTG579_TECMP1 +*\*\ - SHRTIM_ADTG579_TECMP2 +*\*\ - SHRTIM_ADTG579_TECMP3 +*\*\ - SHRTIM_ADTG579_TECMP4 +*\*\ - SHRTIM_ADTG579_TECMP5 +*\*\ - SHRTIM_ADTG579_TEPRD +*\*\ - SHRTIM_ADTG579_TFCMP1 +*\*\ - SHRTIM_ADTG579_TFCMP2 +*\*\ - SHRTIM_ADTG579_TFCMP3 +*\*\ - SHRTIM_ADTG579_TFCMP4 +*\*\ - SHRTIM_ADTG579_TFCMP5 +*\*\ - SHRTIM_ADTG579_TFPRD +*\*\ - SHRTIM_ADTG579_TFRSTRO +*\*\ For ADC trigger 6, ADC trigger 8 and ADC trigger 10 this parameter +*\*\ can be one of the following values: +*\*\ - SHRTIM_ADTG6810_MCMP1 +*\*\ - SHRTIM_ADTG6810_MCMP2 +*\*\ - SHRTIM_ADTG6810_MCMP3 +*\*\ - SHRTIM_ADTG6810_MCMP4 +*\*\ - SHRTIM_ADTG6810_MPRD +*\*\ - SHRTIM_ADTG6810_EXEV6 +*\*\ - SHRTIM_ADTG6810_EXEV7 +*\*\ - SHRTIM_ADTG6810_EXEV8 +*\*\ - SHRTIM_ADTG6810_EXEV9 +*\*\ - SHRTIM_ADTG6810_EXEV10 +*\*\ - SHRTIM_ADTG6810_TACMP1 +*\*\ - SHRTIM_ADTG6810_TACMP2 +*\*\ - SHRTIM_ADTG6810_TACMP3 +*\*\ - SHRTIM_ADTG6810_TACMP4 +*\*\ - SHRTIM_ADTG6810_TACMP5 +*\*\ - SHRTIM_ADTG6810_TAPRD +*\*\ - SHRTIM_ADTG6810_TBCMP1 +*\*\ - SHRTIM_ADTG6810_TBCMP2 +*\*\ - SHRTIM_ADTG6810_TBCMP3 +*\*\ - SHRTIM_ADTG6810_TBCMP4 +*\*\ - SHRTIM_ADTG6810_TBCMP5 +*\*\ - SHRTIM_ADTG6810_TBPRD +*\*\ - SHRTIM_ADTG6810_TCCMP1 +*\*\ - SHRTIM_ADTG6810_TCCMP2 +*\*\ - SHRTIM_ADTG6810_TCCMP3 +*\*\ - SHRTIM_ADTG6810_TCCMP4 +*\*\ - SHRTIM_ADTG6810_TCCMP5 +*\*\ - SHRTIM_ADTG6810_TCPRD +*\*\ - SHRTIM_ADTG6810_TCRSTRO +*\*\ - SHRTIM_ADTG6810_TDCMP1 +*\*\ - SHRTIM_ADTG6810_TDCMP2 +*\*\ - SHRTIM_ADTG6810_TDCMP3 +*\*\ - SHRTIM_ADTG6810_TDCMP4 +*\*\ - SHRTIM_ADTG6810_TDCMP5 +*\*\ - SHRTIM_ADTG6810_TDPRD +*\*\ - SHRTIM_ADTG6810_TDRSTRO +*\*\ - SHRTIM_ADTG6810_TECMP1 +*\*\ - SHRTIM_ADTG6810_TECMP2 +*\*\ - SHRTIM_ADTG6810_TECMP3 +*\*\ - SHRTIM_ADTG6810_TECMP4 +*\*\ - SHRTIM_ADTG6810_TECMP5 +*\*\ - SHRTIM_ADTG6810_TERSTRO +*\*\ - SHRTIM_ADTG6810_TFCMP1 +*\*\ - SHRTIM_ADTG6810_TFCMP2 +*\*\ - SHRTIM_ADTG6810_TFCMP3 +*\*\ - SHRTIM_ADTG6810_TFCMP4 +*\*\ - SHRTIM_ADTG6810_TFCMP5 +*\*\ - SHRTIM_ADTG6810_TFPRD +*\*\return None +**/ + +void SHRTIM_ConfigADCTrig(SHRTIM_Module *SHRTIMx, uint32_t ADCTrigSrcReg, uint32_t ADCTrig, uint32_t Update, uint32_t Src) +{ + __IO uint32_t *padcur = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.CTRL1) + + REG_OFFSET_TAB_ADTGUPD[ADCTrig])); + __IO uint32_t *padcer = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.ADTG1SRC1) + + REG_OFFSET_TAB_ADTGSRC[ADCTrigSrcReg])); + MODIFY_REG(*padcur, REG_MASK_TAB_ADTGUPD[ADCTrig], (Update << REG_SHIFT_TAB_ADTGUPD[ADCTrig])); + MODIFY_REG(*padcer, REG_MASK_TAB_ADTGSRC[ADCTrigSrcReg], (Src << REG_SHIFT_TAB_ADTGSRC[ADCTrigSrcReg])); +} + +/** +*\*\fun Associate the ADCx trigger to a timer triggering the update of the SHRTIM_ADTGxSRCy register. +*\*\note When the preload is disabled in the source timer, the SHRTIM_ADTGxSRCy + * registers are not preloaded either: a write access will result in an + * immediate update of the trigger source. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param ADCTrig This parameter can be one of the following values: +*\*\ - SHRTIM_ADCTRIG_1 +*\*\ - SHRTIM_ADCTRIG_2 +*\*\ - SHRTIM_ADCTRIG_3 +*\*\ - SHRTIM_ADCTRIG_4 +*\*\ - SHRTIM_ADCTRIG_5 +*\*\ - SHRTIM_ADCTRIG_6 +*\*\ - SHRTIM_ADCTRIG_7 +*\*\ - SHRTIM_ADCTRIG_8 +*\*\ - SHRTIM_ADCTRIG_9 +*\*\ - SHRTIM_ADCTRIG_10 +*\*\param Update This parameter can be one of the following values: +*\*\ - SHRTIM_ADCTRIG_UPDATE_MASTER +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_A +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_B +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_C +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_D +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_E +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_F +*\*\return None +**/ +void SHRTIM_SetADCTrigUpdate(SHRTIM_Module *SHRTIMx, uint32_t ADCTrig, uint32_t Update) +{ + __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.CTRL1) + + REG_OFFSET_TAB_ADTGUPD[ADCTrig])); + MODIFY_REG(*preg, REG_MASK_TAB_ADTGUPD[ADCTrig], (Update << REG_SHIFT_TAB_ADTGUPD[ADCTrig])); +} + +/** +*\*\fun Get the source timer triggering the update of the SHRTIM_ADTGxSRCy register. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param ADCTrig This parameter can be one of the following values: +*\*\ - SHRTIM_ADCTRIG_1 +*\*\ - SHRTIM_ADCTRIG_2 +*\*\ - SHRTIM_ADCTRIG_3 +*\*\ - SHRTIM_ADCTRIG_4 +*\*\ - SHRTIM_ADCTRIG_5 +*\*\ - SHRTIM_ADCTRIG_6 +*\*\ - SHRTIM_ADCTRIG_7 +*\*\ - SHRTIM_ADCTRIG_8 +*\*\ - SHRTIM_ADCTRIG_9 +*\*\ - SHRTIM_ADCTRIG_10 +*\*\return Update Returned value can be one of the following values: +*\*\ - SHRTIM_ADCTRIG_UPDATE_MASTER +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_A +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_B +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_C +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_D +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_E +*\*\ - SHRTIM_ADCTRIG_UPDATE_TIMER_F +**/ +uint32_t SHRTIM_GetADCTrigUpdate(SHRTIM_Module *SHRTIMx, uint32_t ADCTrig) +{ + const __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.CTRL1) + + REG_OFFSET_TAB_ADTGUPD[ADCTrig])); + return (READ_BIT(*preg, (REG_MASK_TAB_ADTGUPD[ADCTrig])) >> REG_SHIFT_TAB_ADTGUPD[ADCTrig]); +} + +/** +*\*\fun Specify which events (timer events and/or external events) are used as triggers for ADC conversion. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param ADCTrigSrcReg This parameter can be one of the following values: +*\*\ - SHRTIM_ADCTRIG1_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG1_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG2_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG2_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG3_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG3_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG4_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG4_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG5_SOURCE +*\*\ - SHRTIM_ADCTRIG6_SOURCE +*\*\ - SHRTIM_ADCTRIG7_SOURCE +*\*\ - SHRTIM_ADCTRIG8_SOURCE +*\*\ - SHRTIM_ADCTRIG9_SOURCE +*\*\ - SHRTIM_ADCTRIG10_SOURCE +*\*\param Src This parameter can be a combination of the following values: +*\*\ For ADC trigger 1 (include group 1 and group2) and ADC trigger 3 (include group 1 and group2): +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBRSTRO +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TARSTRO +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TAPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFRSTRO +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TEPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP1 +*\*\ For ADC trigger 2(include group 1 and group2) and ADC trigger 4 (include group 1 and group2): +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCRSTRO +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TAPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV10 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV9 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV8 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV7 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV6 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TERSTRO +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDRSTRO +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP1 +*\*\ For ADC trigger 5, ADC trigger 7 and ADC trigger 9 this parameter +*\*\ can be one of the following values: +*\*\ - SHRTIM_ADTG579_MCMP1 +*\*\ - SHRTIM_ADTG579_MCMP2 +*\*\ - SHRTIM_ADTG579_MCMP3 +*\*\ - SHRTIM_ADTG579_MCMP4 +*\*\ - SHRTIM_ADTG579_MPRD +*\*\ - SHRTIM_ADTG579_EXEV1 +*\*\ - SHRTIM_ADTG579_EXEV2 +*\*\ - SHRTIM_ADTG579_EXEV3 +*\*\ - SHRTIM_ADTG579_EXEV4 +*\*\ - SHRTIM_ADTG579_EXEV5 +*\*\ - SHRTIM_ADTG579_TACMP1 +*\*\ - SHRTIM_ADTG579_TACMP2 +*\*\ - SHRTIM_ADTG579_TACMP3 +*\*\ - SHRTIM_ADTG579_TACMP4 +*\*\ - SHRTIM_ADTG579_TACMP5 +*\*\ - SHRTIM_ADTG579_TAPRD +*\*\ - SHRTIM_ADTG579_TARSTRO +*\*\ - SHRTIM_ADTG579_TBCMP1 +*\*\ - SHRTIM_ADTG579_TBCMP2 +*\*\ - SHRTIM_ADTG579_TBCMP3 +*\*\ - SHRTIM_ADTG579_TBCMP4 +*\*\ - SHRTIM_ADTG579_TBCMP5 +*\*\ - SHRTIM_ADTG579_TBPRD +*\*\ - SHRTIM_ADTG579_TBRSTRO +*\*\ - SHRTIM_ADTG579_TCCMP1 +*\*\ - SHRTIM_ADTG579_TCCMP2 +*\*\ - SHRTIM_ADTG579_TCCMP3 +*\*\ - SHRTIM_ADTG579_TCCMP4 +*\*\ - SHRTIM_ADTG579_TCCMP5 +*\*\ - SHRTIM_ADTG579_TCPRD +*\*\ - SHRTIM_ADTG579_TDCMP1 +*\*\ - SHRTIM_ADTG579_TDCMP2 +*\*\ - SHRTIM_ADTG579_TDCMP3 +*\*\ - SHRTIM_ADTG579_TDCMP4 +*\*\ - SHRTIM_ADTG579_TDCMP5 +*\*\ - SHRTIM_ADTG579_TDPRD +*\*\ - SHRTIM_ADTG579_TECMP1 +*\*\ - SHRTIM_ADTG579_TECMP2 +*\*\ - SHRTIM_ADTG579_TECMP3 +*\*\ - SHRTIM_ADTG579_TECMP4 +*\*\ - SHRTIM_ADTG579_TECMP5 +*\*\ - SHRTIM_ADTG579_TEPRD +*\*\ - SHRTIM_ADTG579_TFCMP1 +*\*\ - SHRTIM_ADTG579_TFCMP2 +*\*\ - SHRTIM_ADTG579_TFCMP3 +*\*\ - SHRTIM_ADTG579_TFCMP4 +*\*\ - SHRTIM_ADTG579_TFCMP5 +*\*\ - SHRTIM_ADTG579_TFPRD +*\*\ - SHRTIM_ADTG579_TFRSTRO +*\*\ For ADC trigger 6, ADC trigger 8 and ADC trigger 10 this parameter +*\*\ can be one of the following values: +*\*\ - SHRTIM_ADTG6810_MCMP1 +*\*\ - SHRTIM_ADTG6810_MCMP2 +*\*\ - SHRTIM_ADTG6810_MCMP3 +*\*\ - SHRTIM_ADTG6810_MCMP4 +*\*\ - SHRTIM_ADTG6810_MPRD +*\*\ - SHRTIM_ADTG6810_EXEV6 +*\*\ - SHRTIM_ADTG6810_EXEV7 +*\*\ - SHRTIM_ADTG6810_EXEV8 +*\*\ - SHRTIM_ADTG6810_EXEV9 +*\*\ - SHRTIM_ADTG6810_EXEV10 +*\*\ - SHRTIM_ADTG6810_TACMP1 +*\*\ - SHRTIM_ADTG6810_TACMP2 +*\*\ - SHRTIM_ADTG6810_TACMP3 +*\*\ - SHRTIM_ADTG6810_TACMP4 +*\*\ - SHRTIM_ADTG6810_TACMP5 +*\*\ - SHRTIM_ADTG6810_TAPRD +*\*\ - SHRTIM_ADTG6810_TBCMP1 +*\*\ - SHRTIM_ADTG6810_TBCMP2 +*\*\ - SHRTIM_ADTG6810_TBCMP3 +*\*\ - SHRTIM_ADTG6810_TBCMP4 +*\*\ - SHRTIM_ADTG6810_TBCMP5 +*\*\ - SHRTIM_ADTG6810_TBPRD +*\*\ - SHRTIM_ADTG6810_TCCMP1 +*\*\ - SHRTIM_ADTG6810_TCCMP2 +*\*\ - SHRTIM_ADTG6810_TCCMP3 +*\*\ - SHRTIM_ADTG6810_TCCMP4 +*\*\ - SHRTIM_ADTG6810_TCCMP5 +*\*\ - SHRTIM_ADTG6810_TCPRD +*\*\ - SHRTIM_ADTG6810_TCRSTRO +*\*\ - SHRTIM_ADTG6810_TDCMP1 +*\*\ - SHRTIM_ADTG6810_TDCMP2 +*\*\ - SHRTIM_ADTG6810_TDCMP3 +*\*\ - SHRTIM_ADTG6810_TDCMP4 +*\*\ - SHRTIM_ADTG6810_TDCMP5 +*\*\ - SHRTIM_ADTG6810_TDPRD +*\*\ - SHRTIM_ADTG6810_TDRSTRO +*\*\ - SHRTIM_ADTG6810_TECMP1 +*\*\ - SHRTIM_ADTG6810_TECMP2 +*\*\ - SHRTIM_ADTG6810_TECMP3 +*\*\ - SHRTIM_ADTG6810_TECMP4 +*\*\ - SHRTIM_ADTG6810_TECMP5 +*\*\ - SHRTIM_ADTG6810_TERSTRO +*\*\ - SHRTIM_ADTG6810_TFCMP1 +*\*\ - SHRTIM_ADTG6810_TFCMP2 +*\*\ - SHRTIM_ADTG6810_TFCMP3 +*\*\ - SHRTIM_ADTG6810_TFCMP4 +*\*\ - SHRTIM_ADTG6810_TFCMP5 +*\*\ - SHRTIM_ADTG6810_TFPRD +*\*\return None +**/ +void SHRTIM_SetADCTrigSrc(SHRTIM_Module *SHRTIMx, uint32_t ADCTrigSrcReg, uint32_t Src) +{ + __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.ADTG1SRC1) + + REG_OFFSET_TAB_ADTGSRC[ADCTrigSrcReg])); + MODIFY_REG(*preg, REG_MASK_TAB_ADTGSRC[ADCTrigSrcReg], (Src << REG_SHIFT_TAB_ADTGSRC[ADCTrigSrcReg])); +} + +/** +*\*\fun Indicate which events (timer events and/or external events) are currently used as triggers for ADC conversion. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param ADCTrigSrcReg This parameter can be one of the following values: +*\*\ - SHRTIM_ADCTRIG1_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG1_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG2_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG2_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG3_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG3_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG4_SOURCE_GROUP1 +*\*\ - SHRTIM_ADCTRIG4_SOURCE_GROUP2 +*\*\ - SHRTIM_ADCTRIG5_SOURCE +*\*\ - SHRTIM_ADCTRIG6_SOURCE +*\*\ - SHRTIM_ADCTRIG7_SOURCE +*\*\ - SHRTIM_ADCTRIG8_SOURCE +*\*\ - SHRTIM_ADCTRIG9_SOURCE +*\*\ - SHRTIM_ADCTRIG10_SOURCE +*\*\return +*\*\ For ADC trigger 1 (include group 1 and group2) and ADC trigger 3 (include group 1 and group2): +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TCCMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBRSTRO +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TBCMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TARSTRO +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TAPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_TACMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP1_MCMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_EXEV1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFRSTRO +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TFCMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TEPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TECMP1 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDPRD +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP5 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP4 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP3 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP2 +*\*\ - SHRTIM_ADTG13_SOURCE_GROUP2_TDCMP1 +*\*\ For ADC trigger 2(include group 1 and group2) and ADC trigger 4 (include group 1 and group2): +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCRSTRO +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TCCMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TBCMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TAPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_TACMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP1_MCMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV10 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV9 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV8 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV7 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_EXEV6 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TFCMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TERSTRO +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TECMP1 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDRSTRO +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDPRD +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP5 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP4 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP3 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP2 +*\*\ - SHRTIM_ADTG24_SOURCE_GROUP2_TDCMP1 +*\*\ For ADC trigger 5, ADC trigger 7 and ADC trigger 9 +*\*\ can be one of the following values: +*\*\ - SHRTIM_ADTG579_MCMP1 +*\*\ - SHRTIM_ADTG579_MCMP2 +*\*\ - SHRTIM_ADTG579_MCMP3 +*\*\ - SHRTIM_ADTG579_MCMP4 +*\*\ - SHRTIM_ADTG579_MPRD +*\*\ - SHRTIM_ADTG579_EXEV1 +*\*\ - SHRTIM_ADTG579_EXEV2 +*\*\ - SHRTIM_ADTG579_EXEV3 +*\*\ - SHRTIM_ADTG579_EXEV4 +*\*\ - SHRTIM_ADTG579_EXEV5 +*\*\ - SHRTIM_ADTG579_TACMP1 +*\*\ - SHRTIM_ADTG579_TACMP2 +*\*\ - SHRTIM_ADTG579_TACMP3 +*\*\ - SHRTIM_ADTG579_TACMP4 +*\*\ - SHRTIM_ADTG579_TACMP5 +*\*\ - SHRTIM_ADTG579_TAPRD +*\*\ - SHRTIM_ADTG579_TARSTRO +*\*\ - SHRTIM_ADTG579_TBCMP1 +*\*\ - SHRTIM_ADTG579_TBCMP2 +*\*\ - SHRTIM_ADTG579_TBCMP3 +*\*\ - SHRTIM_ADTG579_TBCMP4 +*\*\ - SHRTIM_ADTG579_TBCMP5 +*\*\ - SHRTIM_ADTG579_TBPRD +*\*\ - SHRTIM_ADTG579_TBRSTRO +*\*\ - SHRTIM_ADTG579_TCCMP1 +*\*\ - SHRTIM_ADTG579_TCCMP2 +*\*\ - SHRTIM_ADTG579_TCCMP3 +*\*\ - SHRTIM_ADTG579_TCCMP4 +*\*\ - SHRTIM_ADTG579_TCCMP5 +*\*\ - SHRTIM_ADTG579_TCPRD +*\*\ - SHRTIM_ADTG579_TDCMP1 +*\*\ - SHRTIM_ADTG579_TDCMP2 +*\*\ - SHRTIM_ADTG579_TDCMP3 +*\*\ - SHRTIM_ADTG579_TDCMP4 +*\*\ - SHRTIM_ADTG579_TDCMP5 +*\*\ - SHRTIM_ADTG579_TDPRD +*\*\ - SHRTIM_ADTG579_TECMP1 +*\*\ - SHRTIM_ADTG579_TECMP2 +*\*\ - SHRTIM_ADTG579_TECMP3 +*\*\ - SHRTIM_ADTG579_TECMP4 +*\*\ - SHRTIM_ADTG579_TECMP5 +*\*\ - SHRTIM_ADTG579_TEPRD +*\*\ - SHRTIM_ADTG579_TFCMP1 +*\*\ - SHRTIM_ADTG579_TFCMP2 +*\*\ - SHRTIM_ADTG579_TFCMP3 +*\*\ - SHRTIM_ADTG579_TFCMP4 +*\*\ - SHRTIM_ADTG579_TFCMP5 +*\*\ - SHRTIM_ADTG579_TFPRD +*\*\ - SHRTIM_ADTG579_TFRSTRO +*\*\ For ADC trigger 6, ADC trigger 8 and ADC trigger 10 +*\*\ can be one of the following values: +*\*\ - SHRTIM_ADTG6810_MCMP1 +*\*\ - SHRTIM_ADTG6810_MCMP2 +*\*\ - SHRTIM_ADTG6810_MCMP3 +*\*\ - SHRTIM_ADTG6810_MCMP4 +*\*\ - SHRTIM_ADTG6810_MPRD +*\*\ - SHRTIM_ADTG6810_EXEV6 +*\*\ - SHRTIM_ADTG6810_EXEV7 +*\*\ - SHRTIM_ADTG6810_EXEV8 +*\*\ - SHRTIM_ADTG6810_EXEV9 +*\*\ - SHRTIM_ADTG6810_EXEV10 +*\*\ - SHRTIM_ADTG6810_TACMP1 +*\*\ - SHRTIM_ADTG6810_TACMP2 +*\*\ - SHRTIM_ADTG6810_TACMP3 +*\*\ - SHRTIM_ADTG6810_TACMP4 +*\*\ - SHRTIM_ADTG6810_TACMP5 +*\*\ - SHRTIM_ADTG6810_TAPRD +*\*\ - SHRTIM_ADTG6810_TBCMP1 +*\*\ - SHRTIM_ADTG6810_TBCMP2 +*\*\ - SHRTIM_ADTG6810_TBCMP3 +*\*\ - SHRTIM_ADTG6810_TBCMP4 +*\*\ - SHRTIM_ADTG6810_TBCMP5 +*\*\ - SHRTIM_ADTG6810_TBPRD +*\*\ - SHRTIM_ADTG6810_TCCMP1 +*\*\ - SHRTIM_ADTG6810_TCCMP2 +*\*\ - SHRTIM_ADTG6810_TCCMP3 +*\*\ - SHRTIM_ADTG6810_TCCMP4 +*\*\ - SHRTIM_ADTG6810_TCCMP5 +*\*\ - SHRTIM_ADTG6810_TCPRD +*\*\ - SHRTIM_ADTG6810_TCRSTRO +*\*\ - SHRTIM_ADTG6810_TDCMP1 +*\*\ - SHRTIM_ADTG6810_TDCMP2 +*\*\ - SHRTIM_ADTG6810_TDCMP3 +*\*\ - SHRTIM_ADTG6810_TDCMP4 +*\*\ - SHRTIM_ADTG6810_TDCMP5 +*\*\ - SHRTIM_ADTG6810_TDPRD +*\*\ - SHRTIM_ADTG6810_TDRSTRO +*\*\ - SHRTIM_ADTG6810_TECMP1 +*\*\ - SHRTIM_ADTG6810_TECMP2 +*\*\ - SHRTIM_ADTG6810_TECMP3 +*\*\ - SHRTIM_ADTG6810_TECMP4 +*\*\ - SHRTIM_ADTG6810_TECMP5 +*\*\ - SHRTIM_ADTG6810_TERSTRO +*\*\ - SHRTIM_ADTG6810_TFCMP1 +*\*\ - SHRTIM_ADTG6810_TFCMP2 +*\*\ - SHRTIM_ADTG6810_TFCMP3 +*\*\ - SHRTIM_ADTG6810_TFCMP4 +*\*\ - SHRTIM_ADTG6810_TFCMP5 +*\*\ - SHRTIM_ADTG6810_TFPRD +**/ +uint32_t SHRTIM_GetADCTrigSrc(SHRTIM_Module *SHRTIMx, uint32_t ADCTrigSrcReg) +{ + const __IO uint32_t *preg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.ADTG1SRC1) + + REG_OFFSET_TAB_ADTGSRC[ADCTrigSrcReg])); + return (READ_BIT(*preg, (REG_MASK_TAB_ADTGSRC[ADCTrigSrcReg])) >> REG_SHIFT_TAB_ADTGSRC[ADCTrigSrcReg]); +} + +/** +*\*\fun Select the ADC post scaler. +*\*\note This function allows to adjust each ADC trigger rate individually. +*\*\note In center-aligned mode, the ADC trigger rate is also dependent on + * ADCROM[1:0] bitfield, programmed in the source timer + * (see function SHRTIM_TIM_SetADCRollOverMode) +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param ADCTrig This parameter can be one of the following values: +*\*\ - SHRTIM_ADCTRIG_1 +*\*\ - SHRTIM_ADCTRIG_2 +*\*\ - SHRTIM_ADCTRIG_3 +*\*\ - SHRTIM_ADCTRIG_4 +*\*\ - SHRTIM_ADCTRIG_5 +*\*\ - SHRTIM_ADCTRIG_6 +*\*\ - SHRTIM_ADCTRIG_7 +*\*\ - SHRTIM_ADCTRIG_8 +*\*\ - SHRTIM_ADCTRIG_9 +*\*\ - SHRTIM_ADCTRIG_10 +*\*\param PostScaler This parameter can be a number between Min_Data=0 and Max_Data=31 +*\*\return None +**/ +void SHRTIM_SetADCPostScaler(SHRTIM_Module *SHRTIMx, uint32_t ADCTrig, uint32_t PostScaler) +{ + uint64_t mask = (uint64_t)(SHRTIM_ADCPSC1_ADC1PSC) << (REG_OFFSET_TAB_ADCPSx[ADCTrig]); + uint64_t ratio = (uint64_t)(PostScaler) << (REG_OFFSET_TAB_ADCPSx[ADCTrig]); + + MODIFY_REG(SHRTIMx->sCommonRegs.ADCPSC1, (uint32_t)mask, (uint32_t)ratio); + MODIFY_REG(SHRTIMx->sCommonRegs.ADCPSC2, (uint32_t)(mask >> 32U), (uint32_t)(ratio >> 32U)); +} + +/** +*\*\fun Get the selected ADC post scaler. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param ADCTrig This parameter can be one of the following values: +*\*\ - SHRTIM_ADCTRIG_1 +*\*\ - SHRTIM_ADCTRIG_2 +*\*\ - SHRTIM_ADCTRIG_3 +*\*\ - SHRTIM_ADCTRIG_4 +*\*\ - SHRTIM_ADCTRIG_5 +*\*\ - SHRTIM_ADCTRIG_6 +*\*\ - SHRTIM_ADCTRIG_7 +*\*\ - SHRTIM_ADCTRIG_8 +*\*\ - SHRTIM_ADCTRIG_9 +*\*\ - SHRTIM_ADCTRIG_10 +*\*\return PostScaler This parameter can be a number between Min_Data=0 and Max_Data=31 +**/ +uint32_t SHRTIM_GetADCPostScaler(SHRTIM_Module *SHRTIMx, uint32_t ADCTrig) +{ + + uint32_t reg1 = READ_REG(SHRTIMx->sCommonRegs.ADCPSC1); + uint32_t reg2 = READ_REG(SHRTIMx->sCommonRegs.ADCPSC2); + + uint64_t mask = (uint64_t)(SHRTIM_ADCPSC1_ADC1PSC) << (REG_OFFSET_TAB_ADCPSx[ADCTrig]); + uint64_t ratio = (uint64_t)(reg1) | ((uint64_t)(reg2) << 32U); + + return (uint32_t)((ratio & mask) >> (REG_OFFSET_TAB_ADCPSx[ADCTrig])); +} + +/** +*\*\fun Enable timer(s) counter. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timers This parameter can be a combination of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_CounterEnable(SHRTIM_Module *SHRTIMx, uint32_t Timers) +{ + SET_BIT(SHRTIMx->sMasterRegs.MCTRL, Timers); +} + +/** +*\*\fun Disable timer(s) counter. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timers This parameter can be a combination of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_CounterDisable(SHRTIM_Module *SHRTIMx, uint32_t Timers) +{ + CLEAR_BIT(SHRTIMx->sMasterRegs.MCTRL, Timers); +} + +/** +*\*\fun Indicate whether the timer counter is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCNTEN or TxCNTEN bit SHRTIM_MCTRL register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsCounterEnabled(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + return ((READ_BIT(SHRTIMx->sMasterRegs.MCTRL, Timer) == (Timer)) ? 1UL : 0UL); +} + +/** +*\*\fun Set the timer clock prescaler ratio. +*\*\note The counter clock equivalent frequency (CK_CNT) is equal to fHRCK / 2^CKPSC[2:0]. +*\*\note The prescaling ratio cannot be modified once the timer counter is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_PRESCALERRATIO_MUL32 +*\*\ - SHRTIM_PRESCALERRATIO_MUL16 +*\*\ - SHRTIM_PRESCALERRATIO_MUL8 +*\*\ - SHRTIM_PRESCALERRATIO_MUL4 +*\*\ - SHRTIM_PRESCALERRATIO_MUL2 +*\*\ - SHRTIM_PRESCALERRATIO_DIV1 +*\*\ - SHRTIM_PRESCALERRATIO_DIV2 +*\*\ - SHRTIM_PRESCALERRATIO_DIV4 +*\*\return None +**/ +void SHRTIM_TIM_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Prescaler) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_MCTRL_CKPSC, Prescaler); +} + +/** +*\*\fun Get the timer clock prescaler ratio +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Prescaler Returned value can be one of the following values: +*\*\ - SHRTIM_PRESCALERRATIO_MUL32 +*\*\ - SHRTIM_PRESCALERRATIO_MUL16 +*\*\ - SHRTIM_PRESCALERRATIO_MUL8 +*\*\ - SHRTIM_PRESCALERRATIO_MUL4 +*\*\ - SHRTIM_PRESCALERRATIO_MUL2 +*\*\ - SHRTIM_PRESCALERRATIO_DIV1 +*\*\ - SHRTIM_PRESCALERRATIO_DIV2 +*\*\ - SHRTIM_PRESCALERRATIO_DIV4 +**/ +uint32_t SHRTIM_TIM_GetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_MCTRL_CKPSC)); +} + +/** +*\*\fun Set the counter operating mode mode (single-shot, continuous or re-triggerable). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_MODE_CONTINUOUS +*\*\ - SHRTIM_MODE_SINGLESHOT +*\*\ - SHRTIM_MODE_RETRIGGERABLE +*\*\return None +**/ +void SHRTIM_TIM_SetCounterMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, (SHRTIM_TXCTRL_RTG | SHRTIM_MCTRL_CONT), Mode); +} + +/** +*\*\fun Get the counter operating mode mode +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Mode Returned value can be one of the following values: +*\*\ - SHRTIM_MODE_CONTINUOUS +*\*\ - SHRTIM_MODE_SINGLESHOT +*\*\ - SHRTIM_MODE_RETRIGGERABLE +**/ +uint32_t SHRTIM_TIM_GetCounterMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, (SHRTIM_MCTRL_RTG | SHRTIM_MCTRL_CONT))); +} + +/** +*\*\fun Enable the half duty-cycle mode. +*\*\note When the half mode is enabled, SHRTIM_MCMP1DAT (or SHRTIM_TXCMP1xDAT) + * active register is automatically updated with SHRTIM_MPRD/2 + * (or SHRTIM_TXPRD/2) value when SHRTIM_MPRD (or SHRTIM_TXPRD) register is written. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_EnableHalfMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MCTRL_HLF); +} + +/** +*\*\fun Disable the half duty-cycle mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_DisableHalfMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MCTRL_HLF); + CLEAR_BIT(*pReg, SHRTIM_MCTRL_ILV << REG_SHIFT_TAB_ILV[iTimer]); +} + +/** +*\*\fun Indicate whether half duty-cycle mode is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of HLF bit to 1 in SHRTIM_MCTRL or SHRTIM_TxCTRL register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledHalfMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MCTRL_HLF) == (SHRTIM_MCTRL_HLF)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the Re-Syncronisation Update. +*\*\note The update coming from adjacent timers (when MUEN, TAUEN, TBUEN, TCUEN, TDUEN, TEUEN, TFUEN bit is set) +*\*\ or from a software update (TxSWUPD bit) is taken into account on the following reset/roll-over. +*\*\note SHRTIM_ForceUpdate must be called prior programming the syncrhonization mode to force +*\*\ immediate update of the slave timer registers. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_EnableResyncUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXCTRL_RSYNCUPD); + /* This bit is significant only when UPDGAT[3:0] = 0000, it is ignored otherwise */ +} + +/** +*\*\fun Disable the Re-Syncronisation Update. +*\*\note The update coming from adjacent timers (when MUEN, TAUEN, TBUEN, TCUEN, TDUEN, TEUEN, TFUEN bit is set) +*\*\ or from a software update (TxSWUPD bit) is taken into account immediately. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_DisableResyncUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL) + + REG_OFFSET_TAB_TIMER[iTimer])); + + CLEAR_BIT(*pReg, SHRTIM_TXCTRL_RSYNCUPD); + /* This bit is significant only when UPDGAT[3:0] = 0000, it is ignored otherwise */ +} + +/** +*\*\fun Indicate whether the Re-Syncronisation Update is enabled. +*\*\note This bit specifies whether update source coming outside +*\*\ from the timing unit must be synchronized +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of RSYNCUPD in SHRTIM_TxCTRL register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledResyncUpdate(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXCTRL_RSYNCUPD) == (SHRTIM_TXCTRL_RSYNCUPD)) ? 1UL : 0UL); + /* This bit is significant only when UPDGAT[3:0] = 0000, it is ignored otherwise */ +} + +/** +*\*\note Interleaved mode complements the Half mode and helps the implementation of interleaved topologies. +*\*\note When interleaved mode is enabled, the content of the compare registers is overridden. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_INTERLEAVED_MODE_DISABLED +*\*\ - SHRTIM_INTERLEAVED_MODE_DUAL +*\*\ - SHRTIM_INTERLEAVED_MODE_TRIPLE +*\*\ - SHRTIM_INTERLEAVED_MODE_QUAD +*\*\return None +**/ +void SHRTIM_TIM_SetInterleavedMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + + MODIFY_REG(*pReg, REG_MASK_TAB_ILV[iTimer], + ((Mode & SHRTIM_MCTRL_HLF) | ((Mode & SHRTIM_MCTRL_ILV) << REG_SHIFT_TAB_ILV[iTimer]))); +} + +/** +*\*\fun get the Interleaved configuration. +*\*\note The interleaved Mode is Triple or Quad if HLF bit is disabled +*\*\ the interleaved Mode is dual if HLF bit is set, + +*\*\ SHRTIM_MCMP1DAT (or SHRTIM_TXCMP1xDAT) active register is automatically updated +*\*\ with SHRTIM_MPRD/2 or SHRTIM_MPRD/4 + * (or SHRTIM_TXPRD/2) value when SHRTIM_MPRD (or SHRTIM_TXPRD) register is written. + +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return This parameter can be one of the following values: +*\*\ - SHRTIM_INTERLEAVED_MODE_DISABLED +*\*\ - SHRTIM_INTERLEAVED_MODE_DUAL +*\*\ - SHRTIM_INTERLEAVED_MODE_TRIPLE +*\*\ - SHRTIM_INTERLEAVED_MODE_QUAD +**/ +uint32_t SHRTIM_TIM_GetInterleavedMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + + uint32_t Mode = READ_BIT(*pReg, (REG_MASK_TAB_ILV[iTimer])); + return ((Mode & SHRTIM_MCTRL_HLF) | ((Mode >> REG_SHIFT_TAB_ILV[iTimer]) & SHRTIM_MCTRL_ILV)); +} + +/** +*\*\fun Enable the timer start when receiving a synchronization input event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_EnableStartOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + + if (Timer == SHRTIM_TIMER_MASTER) + { + SET_BIT(*pReg, SHRTIM_MCTRL_SYNCSTRT); + } + else + { + SET_BIT(*pReg, SHRTIM_TXCTRL_SYNCSTRT); + } +} + +/** +*\*\fun Disable the timer start when receiving a synchronization input event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_DisableStartOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + + if (Timer == SHRTIM_TIMER_MASTER) + { + CLEAR_BIT(*pReg, SHRTIM_MCTRL_SYNCSTRT); + } + else + { + CLEAR_BIT(*pReg, SHRTIM_TXCTRL_SYNCSTRT); + } +} + +/** +*\*\fun Indicate whether the timer start when receiving a synchronization input event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of SYNCSTRT bit in SHRTIM_MCTRL or SHRTIM_TxCTRL register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledStartOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + + if (Timer == SHRTIM_TIMER_MASTER) + { + return ((READ_BIT(*pReg, SHRTIM_MCTRL_SYNCSTRT) == (SHRTIM_MCTRL_SYNCSTRT)) ? 1UL : 0UL); + } + else + { + return ((READ_BIT(*pReg, SHRTIM_TXCTRL_SYNCSTRT) == (SHRTIM_TXCTRL_SYNCSTRT)) ? 1UL : 0UL); + } +} + +/** +*\*\fun Enable the timer reset when receiving a synchronization input event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_EnableResetOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + + if (Timer == SHRTIM_TIMER_MASTER) + { + SET_BIT(*pReg, SHRTIM_MCTRL_SYNCRST); + } + else + { + SET_BIT(*pReg, SHRTIM_TXCTRL_SYNCRST); + } +} + +/** +*\*\fun Disable the timer reset when receiving a synchronization input event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_DisableResetOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + + if (Timer == SHRTIM_TIMER_MASTER) + { + CLEAR_BIT(*pReg, SHRTIM_MCTRL_SYNCRST); + } + else + { + CLEAR_BIT(*pReg, SHRTIM_TXCTRL_SYNCRST); + } +} + +/** +*\*\fun Indicate whether the timer reset when receiving a synchronization input event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +uint32_t SHRTIM_TIM_IsEnabledResetOnSync(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + + if (Timer == SHRTIM_TIMER_MASTER) + { + return ((READ_BIT(*pReg, SHRTIM_MCTRL_SYNCRST) == (SHRTIM_MCTRL_SYNCRST)) ? 1UL : 0UL); + } + else + { + return ((READ_BIT(*pReg, SHRTIM_TXCTRL_SYNCRST) == (SHRTIM_TXCTRL_SYNCRST)) ? 1UL : 0UL); + } +} + +/** +*\*\fun Set the SHRTIM output the DAC synchronization event is generated on (DACtrigOutx). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param DACTrig This parameter can be one of the following values: +*\*\ - SHRTIM_DACTRIG_NONE +*\*\ - SHRTIM_DACTRIG_DACTRIGOUT_1 +*\*\ - SHRTIM_DACTRIG_DACTRIGOUT_2 +*\*\ - SHRTIM_DACTRIG_DACTRIGOUT_3 +*\*\return None +**/ +void SHRTIM_TIM_SetDACTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t DACTrig) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_MCTRL_DACTRIG, DACTrig); +} + +/** +*\*\fun Get the SHRTIM output the DAC synchronization event is generated on (DACtrigOutx). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return DACTrig Returned value can be one of the following values: +*\*\ - SHRTIM_DACTRIG_NONE +*\*\ - SHRTIM_DACTRIG_DACTRIGOUT_1 +*\*\ - SHRTIM_DACTRIG_DACTRIGOUT_2 +*\*\ - SHRTIM_DACTRIG_DACTRIGOUT_3 +**/ +uint32_t SHRTIM_TIM_GetDACTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_MCTRL_DACTRIG)); +} + +/** +*\*\fun Enable the timer registers preload mechanism. +*\*\note When the preload mode is enabled, accessed registers are shadow registers. + * Their content is transferred into the active register after an update request, + * either software or synchronized with an event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_EnablePreload(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MCTRL_PLEN); +} + +/** +*\*\fun Disable the timer registers preload mechanism. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_DisablePreload(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MCTRL_PLEN); +} + +/** +*\*\fun Indicate whether the timer registers preload mechanism is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of PLEN bit in SHRTIM_MCTRL or SHRTIM_TxCTRL register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledPreload(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MCTRL_PLEN) == (SHRTIM_MCTRL_PLEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Set the timer register update trigger. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param UpdateTrig This parameter can be one of the following values: +*\*\ For the master timer this parameter can be one of the following values: +*\*\ - SHRTIM_UPDATETRIG_NONE +*\*\ - SHRTIM_UPDATETRIG_REPETITION +*\*\ For timer A..F this parameter can be: +*\*\ - SHRTIM_UPDATETRIG_NONE +*\*\ or a combination of the following values: +*\*\ - SHRTIM_UPDATETRIG_MASTER +*\*\ - SHRTIM_UPDATETRIG_TIMER_A +*\*\ - SHRTIM_UPDATETRIG_TIMER_B +*\*\ - SHRTIM_UPDATETRIG_TIMER_C +*\*\ - SHRTIM_UPDATETRIG_TIMER_D +*\*\ - SHRTIM_UPDATETRIG_TIMER_E +*\*\ - SHRTIM_UPDATETRIG_TIMER_F +*\*\ - SHRTIM_UPDATETRIG_REPETITION +*\*\ - SHRTIM_UPDATETRIG_RESET +*\*\return None +**/ +void SHRTIM_TIM_SetUpdateTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t UpdateTrig) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, REG_MASK_TAB_UPDATETRIG[iTimer], UpdateTrig << REG_SHIFT_TAB_UPDATETRIG[iTimer]); +} + +/** +*\*\fun Get the timer register update trigger. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return UpdateTrig Returned value can be one of the following values: + * +*\*\ For the master timer this parameter can be one of the following values: +*\*\ - SHRTIM_UPDATETRIG_NONE +*\*\ - SHRTIM_UPDATETRIG_MASTER_REPETITION + * +*\*\ For timer A..F this parameter can be: +*\*\ - SHRTIM_UPDATETRIG_NONE +*\*\ or a combination of the following values: +*\*\ - SHRTIM_UPDATETRIG_MASTER +*\*\ - SHRTIM_UPDATETRIG_TIMER_A +*\*\ - SHRTIM_UPDATETRIG_TIMER_B +*\*\ - SHRTIM_UPDATETRIG_TIMER_C +*\*\ - SHRTIM_UPDATETRIG_TIMER_D +*\*\ - SHRTIM_UPDATETRIG_TIMER_E +*\*\ - SHRTIM_UPDATETRIG_TIMER_F +*\*\ - SHRTIM_UPDATETRIG_REPETITION +*\*\ - SHRTIM_UPDATETRIG_RESET +**/ +uint32_t SHRTIM_TIM_GetUpdateTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, REG_MASK_TAB_UPDATETRIG[iTimer]) >> REG_SHIFT_TAB_UPDATETRIG[iTimer]); +} + +/** +*\*\fun Set the timer registers update condition (how the registers update occurs relatively to the burst DMA transaction or an external update request received on one of the update enable inputs (UPD_EN[3:1])). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param UpdateGating This parameter can be one of the following values: + * +*\*\ For the master timer this parameter can be one of the following values: +*\*\ - SHRTIM_UPDATEGATING_INDEPENDENT +*\*\ - SHRTIM_UPDATEGATING_DMABURST +*\*\ - SHRTIM_UPDATEGATING_DMABURST_UPDATE + * +*\*\ For the timer A..F this parameter can be one of the following values: +*\*\ - SHRTIM_UPDATEGATING_INDEPENDENT +*\*\ - SHRTIM_UPDATEGATING_DMABURST +*\*\ - SHRTIM_UPDATEGATING_DMABURST_UPDATE +*\*\ - SHRTIM_UPDATEGATING_UPDEN1 +*\*\ - SHRTIM_UPDATEGATING_UPDEN2 +*\*\ - SHRTIM_UPDATEGATING_UPDEN3 +*\*\ - SHRTIM_UPDATEGATING_UPDEN1_UPDATE +*\*\ - SHRTIM_UPDATEGATING_UPDEN2_UPDATE +*\*\ - SHRTIM_UPDATEGATING_UPDEN3_UPDATE +*\*\return None +**/ +void SHRTIM_TIM_SetUpdateGating(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t UpdateGating) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, REG_MASK_TAB_UPDATEGATING[iTimer], (UpdateGating << REG_SHIFT_TAB_UPDATEGATING[iTimer])); +} + +/** +*\*\fun Get the timer registers update condition. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return UpdateGating Returned value can be one of the following values: + * +*\*\ For the master timer this parameter can be one of the following values: +*\*\ - SHRTIM_UPDATEGATING_INDEPENDENT +*\*\ - SHRTIM_UPDATEGATING_DMABURST +*\*\ - SHRTIM_UPDATEGATING_DMABURST_UPDATE + * +*\*\ For the timer A..F this parameter can be one of the following values: +*\*\ - SHRTIM_UPDATEGATING_INDEPENDENT +*\*\ - SHRTIM_UPDATEGATING_DMABURST +*\*\ - SHRTIM_UPDATEGATING_DMABURST_UPDATE +*\*\ - SHRTIM_UPDATEGATING_UPDEN1 +*\*\ - SHRTIM_UPDATEGATING_UPDEN2 +*\*\ - SHRTIM_UPDATEGATING_UPDEN3 +*\*\ - SHRTIM_UPDATEGATING_UPDEN1_UPDATE +*\*\ - SHRTIM_UPDATEGATING_UPDEN2_UPDATE +*\*\ - SHRTIM_UPDATEGATING_UPDEN3_UPDATE +**/ +uint32_t SHRTIM_TIM_GetUpdateGating(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCTRL) + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, REG_MASK_TAB_UPDATEGATING[iTimer]) >> REG_SHIFT_TAB_UPDATEGATING[iTimer]); +} + +/** +*\*\fun Enable the push-pull mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_EnablePushPullMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXCTRL_PP); +} + +/** +*\*\fun Disable the push-pull mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_DisablePushPullMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXCTRL_PP); +} + +/** +*\*\fun Indicate whether the push-pull mode is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of PP bit in SHRTIM_TxCTRL register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledPushPullMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL) + + REG_OFFSET_TAB_TIMER[iTimer])); + return ((READ_BIT(*pReg, SHRTIM_TXCTRL_PP) == (SHRTIM_TXCTRL_PP)) ? 1UL : 0UL); +} + +/** +*\*\fun Set the functioning mode of the compare unit (CMP2 or CMP4 can operate in standard mode or in auto delayed mode). +*\*\note In auto-delayed mode the compare match occurs independently from the timer counter value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param CompareUnit This parameter can be one of the following values: +*\*\ - SHRTIM_COMPAREUNIT_2 +*\*\ - SHRTIM_COMPAREUNIT_4 +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_COMPAREMODE_REGULAR +*\*\ - SHRTIM_COMPAREMODE_DELAY_NOTIMEOUT +*\*\ - SHRTIM_COMPAREMODE_DELAY_CMP1 +*\*\ - SHRTIM_COMPAREMODE_DELAY_CMP3 +*\*\return None +**/ +void SHRTIM_TIM_SetCompareMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareUnit, + uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL) + + REG_OFFSET_TAB_TIMER[iTimer])); + uint32_t shift = (((uint32_t)POSITION_VAL(CompareUnit) - (uint32_t)POSITION_VAL(SHRTIM_COMPAREUNIT_2)) & 0x1FU); + MODIFY_REG(*pReg, (SHRTIM_TXCTRL_DELCMP2M << shift), (Mode << shift)); +} + +/** +*\*\fun Get the functioning mode of the compare unit. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param CompareUnit This parameter can be one of the following values: +*\*\ - SHRTIM_COMPAREUNIT_2 +*\*\ - SHRTIM_COMPAREUNIT_4 +*\*\return Mode Returned value can be one of the following values: +*\*\ - SHRTIM_COMPAREMODE_REGULAR +*\*\ - SHRTIM_COMPAREMODE_DELAY_NOTIMEOUT +*\*\ - SHRTIM_COMPAREMODE_DELAY_CMP1 +*\*\ - SHRTIM_COMPAREMODE_DELAY_CMP3 +**/ +uint32_t SHRTIM_TIM_GetCompareMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareUnit) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL) + + REG_OFFSET_TAB_TIMER[iTimer])); + uint32_t shift = (((uint32_t)POSITION_VAL(CompareUnit) - (uint32_t)POSITION_VAL(SHRTIM_COMPAREUNIT_2)) & 0x1FU); + return (READ_BIT(*pReg, (SHRTIM_TXCTRL_DELCMP2M << shift)) >> shift); +} + +/** +*\*\fun Set the timer counter value. +*\*\note This function can only be called when the timer is stopped. +*\*\note For HR clock prescaling ratio below 32 (CKPSC[2:0] < 5), the least + * significant bits of the counter are not significant. They cannot be + * written and return 0 when read. +*\*\note The timer behavior is not guaranteed if the counter value is set above + * the period. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Counter Value between 0 and 0xFFFF +*\*\return None +**/ +void SHRTIM_TIM_SetCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Counter) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCNT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_MCNT_MCOUNT, Counter); +} + +/** +*\*\fun Get actual timer counter value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Counter Value between 0 and 0xFFFF +**/ +uint32_t SHRTIM_TIM_GetCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCNT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_MCNT_MCOUNT)); +} + +/** +*\*\fun Set the timer period value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Period Value between 0 and 0xFFFF +*\*\return None +**/ +void SHRTIM_TIM_SetPeriod(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Period) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MPRD) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_MPRD_MPRD, Period); +} + +/** +*\*\fun Get actual timer period value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Period Value between 0 and 0xFFFF +**/ +uint32_t SHRTIM_TIM_GetPeriod(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MPRD) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_MPRD_MPRD)); +} + +/** +*\*\fun Set the timer repetition period value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Repetition Value between 0 and 0xFF +*\*\return None +**/ +void SHRTIM_TIM_SetRepetition(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Repetition) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MREPT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_MREPT_MREPT, Repetition); +} + +/** +*\*\fun Get actual timer repetition period value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Repetition Value between 0 and 0xFF +**/ +uint32_t SHRTIM_TIM_GetRepetition(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MREPT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_MREPT_MREPT)); +} + +/** +*\*\fun Set the compare value of the compare unit 1. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param CompareValue Compare value must be above or equal to 3 +*\*\ periods of the fSHRTIM clock, that is 0x60 if CKPSC[2:0] = 0, +*\*\ 0x30 if CKPSC[2:0] = 1, 0x18 if CKPSC[2:0] = 2,... +*\*\return None +**/ +void SHRTIM_TIM_SetCompare1(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareValue) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCMP1DAT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_MCMP1DAT_MCMP1DAT, CompareValue); +} + +/** +*\*\fun Get actual compare value of the compare unit 1. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return CompareValue Compare value must be above or equal to 3 +*\*\ periods of the fSHRTIM clock, that is 0x60 if CKPSC[2:0] = 0, +*\*\ 0x30 if CKPSC[2:0] = 1, 0x18 if CKPSC[2:0] = 2,... +**/ +uint32_t SHRTIM_TIM_GetCompare1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCMP1DAT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_MCMP1DAT_MCMP1DAT)); +} + +/** +*\*\fun Set the compare value of the compare unit 2. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param CompareValue Compare value must be above or equal to 3 +*\*\ periods of the fSHRTIM clock, that is 0x60 if CKPSC[2:0] = 0, +*\*\ 0x30 if CKPSC[2:0] = 1, 0x18 if CKPSC[2:0] = 2,... +*\*\return None +**/ +void SHRTIM_TIM_SetCompare2(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareValue) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCMP2DAT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_MCMP2DAT_MCMP2DAT, CompareValue); +} + +/** +*\*\fun Get actual compare value of the compare unit 2. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return CompareValue Compare value must be above or equal to 3 +*\*\ periods of the fSHRTIM clock, that is 0x60 if CKPSC[2:0] = 0, +*\*\ 0x30 if CKPSC[2:0] = 1, 0x18 if CKPSC[2:0] = 2,... +**/ +uint32_t SHRTIM_TIM_GetCompare2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCMP2DAT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_MCMP2DAT_MCMP2DAT)); +} + +/** +*\*\fun Set the compare value of the compare unit 3. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param CompareValue Compare value must be above or equal to 3 +*\*\ periods of the fSHRTIM clock, that is 0x60 if CKPSC[2:0] = 0, +*\*\ 0x30 if CKPSC[2:0] = 1, 0x18 if CKPSC[2:0] = 2,... +*\*\return None +**/ +void SHRTIM_TIM_SetCompare3(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareValue) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCMP3DAT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_MCMP3DAT_MCMP3DAT, CompareValue); +} + +/** +*\*\fun Get actual compare value of the compare unit 3. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return CompareValue Compare value must be above or equal to 3 +*\*\ periods of the fSHRTIM clock, that is 0x60 if CKPSC[2:0] = 0, +*\*\ 0x30 if CKPSC[2:0] = 1, 0x18 if CKPSC[2:0] = 2,... +**/ +uint32_t SHRTIM_TIM_GetCompare3(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCMP3DAT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_MCMP3DAT_MCMP3DAT)); +} + +/** +*\*\fun Set the compare value of the compare unit 4. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param CompareValue Compare value must be above or equal to 3 +*\*\ periods of the fSHRTIM clock, that is 0x60 if CKPSC[2:0] = 0, +*\*\ 0x30 if CKPSC[2:0] = 1, 0x18 if CKPSC[2:0] = 2,... +*\*\return None +**/ +void SHRTIM_TIM_SetCompare4(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareValue) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCMP4DAT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_MCMP4DAT_MCMP4DAT, CompareValue); +} + +/** +*\*\fun Get actual compare value of the compare unit 4. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return CompareValue Compare value must be above or equal to 3 +*\*\ periods of the fSHRTIM clock, that is 0x60 if CKPSC[2:0] = 0, +*\*\ 0x30 if CKPSC[2:0] = 1, 0x18 if CKPSC[2:0] = 2,... +**/ +uint32_t SHRTIM_TIM_GetCompare4(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MCMP4DAT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_MCMP4DAT_MCMP4DAT)); +} + +/** +*\*\fun Set the compare value of the compare unit 5. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param CompareValue Compare value is regular resolution, not high resolution +*\*\return None +**/ +void SHRTIM_TIM_SetCompare5(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CompareValue) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCMP5DAT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCMP5DAT_CMP5DAT, CompareValue); +} + +/** +*\*\fun Get actual compare value of the compare unit 5. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return CompareValue Compare value is regular resolution, not high resolution +**/ +uint32_t SHRTIM_TIM_GetCompare5(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCMP5DAT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCMP5DAT_CMP5DAT)); +} + +/** +*\*\fun Set the reset trigger of a timer counter. +*\*\note The reset of the timer counter can be triggered by up to 30 events + * that can be selected among the following sources: +*\*\ - The timing unit: Compare 2, Compare 4 and Update (3 events). +*\*\ - The master timer: Reset and Compare 1..4 (5 events). +*\*\ - The external events EXTEVNT1..10 (10 events). +*\*\ - All other timing units (e.g. Timer B..F for timer A): Compare 1, 2 and 4 (12 events). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param ResetTrig This parameter can be a combination of the following values: +*\*\ - SHRTIM_RESETTRIG_NONE +*\*\ - SHRTIM_RESETTRIG_UPDATE +*\*\ - SHRTIM_RESETTRIG_CMP2 +*\*\ - SHRTIM_RESETTRIG_CMP4 +*\*\ - SHRTIM_RESETTRIG_MASTER_PER +*\*\ - SHRTIM_RESETTRIG_MASTER_CMP1 +*\*\ - SHRTIM_RESETTRIG_MASTER_CMP2 +*\*\ - SHRTIM_RESETTRIG_MASTER_CMP3 +*\*\ - SHRTIM_RESETTRIG_MASTER_CMP4 +*\*\ - SHRTIM_RESETTRIG_EXEV_1 +*\*\ - SHRTIM_RESETTRIG_EXEV_2 +*\*\ - SHRTIM_RESETTRIG_EXEV_3 +*\*\ - SHRTIM_RESETTRIG_EXEV_4 +*\*\ - SHRTIM_RESETTRIG_EXEV_5 +*\*\ - SHRTIM_RESETTRIG_EXEV_6 +*\*\ - SHRTIM_RESETTRIG_EXEV_7 +*\*\ - SHRTIM_RESETTRIG_EXEV_8 +*\*\ - SHRTIM_RESETTRIG_EXEV_9 +*\*\ - SHRTIM_RESETTRIG_EXEV_10 +*\*\ - SHRTIM_RESETTRIG_OTHER1_CMP1 +*\*\ - SHRTIM_RESETTRIG_OTHER1_CMP2 +*\*\ - SHRTIM_RESETTRIG_OTHER1_CMP4 +*\*\ - SHRTIM_RESETTRIG_OTHER2_CMP1 +*\*\ - SHRTIM_RESETTRIG_OTHER2_CMP2 +*\*\ - SHRTIM_RESETTRIG_OTHER2_CMP4 +*\*\ - SHRTIM_RESETTRIG_OTHER3_CMP1 +*\*\ - SHRTIM_RESETTRIG_OTHER3_CMP2 +*\*\ - SHRTIM_RESETTRIG_OTHER3_CMP4 +*\*\ - SHRTIM_RESETTRIG_OTHER4_CMP1 +*\*\ - SHRTIM_RESETTRIG_OTHER4_CMP2 +*\*\ - SHRTIM_RESETTRIG_OTHER4_CMP4 +*\*\ - SHRTIM_RESETTRIG_OTHER5_CMP1 +*\*\ - SHRTIM_RESETTRIG_OTHER5_CMP2 +*\*\return None +**/ +void SHRTIM_TIM_SetResetTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t ResetTrig) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCNTRST) + + REG_OFFSET_TAB_TIMER[iTimer])); + WRITE_REG(*pReg, ResetTrig); +} + +/** +*\*\fun Get actual reset trigger of a timer counter. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return ResetTrig Returned value can be one of the following values: +*\*\ - SHRTIM_RESETTRIG_NONE +*\*\ - SHRTIM_RESETTRIG_UPDATE +*\*\ - SHRTIM_RESETTRIG_CMP2 +*\*\ - SHRTIM_RESETTRIG_CMP4 +*\*\ - SHRTIM_RESETTRIG_MASTER_PER +*\*\ - SHRTIM_RESETTRIG_MASTER_CMP1 +*\*\ - SHRTIM_RESETTRIG_MASTER_CMP2 +*\*\ - SHRTIM_RESETTRIG_MASTER_CMP3 +*\*\ - SHRTIM_RESETTRIG_MASTER_CMP4 +*\*\ - SHRTIM_RESETTRIG_EXEV_1 +*\*\ - SHRTIM_RESETTRIG_EXEV_2 +*\*\ - SHRTIM_RESETTRIG_EXEV_3 +*\*\ - SHRTIM_RESETTRIG_EXEV_4 +*\*\ - SHRTIM_RESETTRIG_EXEV_5 +*\*\ - SHRTIM_RESETTRIG_EXEV_6 +*\*\ - SHRTIM_RESETTRIG_EXEV_7 +*\*\ - SHRTIM_RESETTRIG_EXEV_8 +*\*\ - SHRTIM_RESETTRIG_EXEV_9 +*\*\ - SHRTIM_RESETTRIG_EXEV_10 +*\*\ - SHRTIM_RESETTRIG_OTHER1_CMP1 +*\*\ - SHRTIM_RESETTRIG_OTHER1_CMP2 +*\*\ - SHRTIM_RESETTRIG_OTHER1_CMP4 +*\*\ - SHRTIM_RESETTRIG_OTHER2_CMP1 +*\*\ - SHRTIM_RESETTRIG_OTHER2_CMP2 +*\*\ - SHRTIM_RESETTRIG_OTHER2_CMP4 +*\*\ - SHRTIM_RESETTRIG_OTHER3_CMP1 +*\*\ - SHRTIM_RESETTRIG_OTHER3_CMP2 +*\*\ - SHRTIM_RESETTRIG_OTHER3_CMP4 +*\*\ - SHRTIM_RESETTRIG_OTHER4_CMP1 +*\*\ - SHRTIM_RESETTRIG_OTHER4_CMP2 +*\*\ - SHRTIM_RESETTRIG_OTHER4_CMP4 +*\*\ - SHRTIM_RESETTRIG_OTHER5_CMP1 +*\*\ - SHRTIM_RESETTRIG_OTHER5_CMP2 +**/ +uint32_t SHRTIM_TIM_GetResetTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxRST1) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_REG(*pReg)); +} + +/** +*\*\fun Get captured value for capture unit 1. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Captured value +**/ +uint32_t SHRTIM_TIM_GetCapture1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCPT1) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_REG(*pReg)); +} + +/** +*\*\fun Get the counting direction when capture 1 event occurred. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Filter This parameter can be one of the following values: +*\*\ - SHRTIM_COUNTING_MODE_UP +*\*\ - SHRTIM_COUNTING_MODE_UP_DOWN +**/ +uint32_t SHRTIM_TIM_GetCapture1Direction(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCPT1) + + REG_OFFSET_TAB_TIMER[iTimer])); + return ((READ_BIT(*pReg, SHRTIM_TXCPT1_UDSTS1) >> SHRTIM_TXCPT1_UDSTS1_Pos) << SHRTIM_TXCTRL2_UPDOWNM_Pos); +} + +/** +*\*\fun Get captured value for capture unit 2. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Captured value +**/ +uint32_t SHRTIM_TIM_GetCapture2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCPT2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_REG(*pReg)); +} + +/** +*\*\fun Get the counting direction when capture 2 event occurred. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Filter This parameter can be one of the following values: +*\*\ - SHRTIM_COUNTING_MODE_UP +*\*\ - SHRTIM_COUNTING_MODE_UP_DOWN +**/ +uint32_t SHRTIM_TIM_GetCapture2Direction(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCPT2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return ((READ_BIT(*pReg, SHRTIM_TXCPT2_UDSTS2) >> SHRTIM_TXCPT2_UDSTS2_Pos) << SHRTIM_TXCTRL2_UPDOWNM_Pos); +} + +/** +*\*\fun Set the trigger of a capture unit for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param CaptureUnit This parameter can be one of the following values: +*\*\ - SHRTIM_CAPTUREUNIT_1 +*\*\ - SHRTIM_CAPTUREUNIT_2 +*\*\param CaptureTrig This parameter can be a combination of the following values: +*\*\ - SHRTIM_CAPTURETRIG_NONE +*\*\ - SHRTIM_CAPTURETRIG_SW +*\*\ - SHRTIM_CAPTURETRIG_UPDATE +*\*\ - SHRTIM_CAPTURETRIG_EXEV_1 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_2 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_3 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_4 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_5 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_6 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_7 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_8 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_9 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_10 +*\*\ - SHRTIM_CAPTURETRIG_TA1_SET +*\*\ - SHRTIM_CAPTURETRIG_TA1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIMA_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIMA_CMP2 +*\*\ - SHRTIM_CAPTURETRIG_TB1_SET +*\*\ - SHRTIM_CAPTURETRIG_TB1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIMB_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIMB_CMP2 +*\*\ - SHRTIM_CAPTURETRIG_TC1_SET +*\*\ - SHRTIM_CAPTURETRIG_TC1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIMC_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIMC_CMP2 +*\*\ - SHRTIM_CAPTURETRIG_TD1_SET +*\*\ - SHRTIM_CAPTURETRIG_TD1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIMD_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIMD_CMP2 +*\*\ - SHRTIM_CAPTURETRIG_TE1_SET +*\*\ - SHRTIM_CAPTURETRIG_TE1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIME_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIME_CMP2 +*\*\ - SHRTIM_CAPTURETRIG_TF1_SET +*\*\ - SHRTIM_CAPTURETRIG_TF1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIMF_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIMF_CMP2 +*\*\return None +**/ +void SHRTIM_TIM_SetCaptureTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CaptureUnit, + uint64_t CaptureTrig) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0U].TxCPT1CTRL) + + REG_OFFSET_TAB_TIMER[iTimer] + (CaptureUnit * 4U))); + + uint32_t cfg1 = (uint32_t)(CaptureTrig & 0x0000000000000FFFU); + uint32_t cfg2 = (uint32_t)((CaptureTrig & 0xFFFFF00F00000000U) >> 32U); + + cfg2 = (cfg2 & REG_MASK_TAB_CPT[iTimer]) | ((cfg2 & 0x0000000FU) << (REG_SHIFT_TAB_CPT[iTimer])); + + WRITE_REG(*pReg, (cfg1 | cfg2)); +} + +/** +*\*\fun Get actual trigger of a capture unit for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param CaptureUnit This parameter can be one of the following values: +*\*\ - SHRTIM_CAPTUREUNIT_1 +*\*\ - SHRTIM_CAPTUREUNIT_2 +*\*\return CaptureTrig This parameter can be a combination of the following values: +*\*\ - SHRTIM_CAPTURETRIG_NONE +*\*\ - SHRTIM_CAPTURETRIG_SW +*\*\ - SHRTIM_CAPTURETRIG_UPDATE +*\*\ - SHRTIM_CAPTURETRIG_EXEV_1 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_2 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_3 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_4 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_5 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_6 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_7 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_8 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_9 +*\*\ - SHRTIM_CAPTURETRIG_EXEV_10 +*\*\ - SHRTIM_CAPTURETRIG_TA1_SET +*\*\ - SHRTIM_CAPTURETRIG_TA1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIMA_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIMA_CMP2 +*\*\ - SHRTIM_CAPTURETRIG_TB1_SET +*\*\ - SHRTIM_CAPTURETRIG_TB1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIMB_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIMB_CMP2 +*\*\ - SHRTIM_CAPTURETRIG_TC1_SET +*\*\ - SHRTIM_CAPTURETRIG_TC1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIMC_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIMC_CMP2 +*\*\ - SHRTIM_CAPTURETRIG_TD1_SET +*\*\ - SHRTIM_CAPTURETRIG_TD1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIMD_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIMD_CMP2 +*\*\ - SHRTIM_CAPTURETRIG_TE1_SET +*\*\ - SHRTIM_CAPTURETRIG_TE1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIME_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIME_CMP2 +*\*\ - SHRTIM_CAPTURETRIG_TF1_SET +*\*\ - SHRTIM_CAPTURETRIG_TF1_RESET +*\*\ - SHRTIM_CAPTURETRIG_TIMF_CMP1 +*\*\ - SHRTIM_CAPTURETRIG_TIMF_CMP2 +**/ +uint64_t SHRTIM_TIM_GetCaptureTrig(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t CaptureUnit) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0U].TxCPT1CTRL) + + (uint32_t)REG_OFFSET_TAB_TIMER[iTimer & 0x7U] + (CaptureUnit * 4U))); + + uint64_t cfg; + uint32_t CaptureTrig = READ_REG(*pReg); + + cfg = (uint64_t)(uint32_t)(((CaptureTrig & 0xFFFFF000U) & (uint32_t)REG_MASK_TAB_CPT[iTimer]) | (((CaptureTrig & 0xFFFFF000U) & (uint32_t)~REG_MASK_TAB_CPT[iTimer]) >> (REG_SHIFT_TAB_CPT[iTimer]))); + + return ((uint64_t)(((uint64_t)CaptureTrig & (uint64_t)0x00000FFFU) | (uint64_t)((cfg) << 32U))); +} + +/** +*\*\fun Enable deadtime insertion for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_EnableDeadTime(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXOUT_DTEN); +} + +/** +*\*\fun Disable deadtime insertion for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_DisableDeadTime(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXOUT_DTEN); +} + +/** +*\*\fun Indicate whether deadtime insertion is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of DTEN bit in SHRTIM_TxOUT register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledDeadTime(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXOUT_DTEN) == (SHRTIM_TXOUT_DTEN)) ? 1UL : 0UL); +} + + +/** +*\*\fun Set the delayed protection (DP) mode. +*\*\note This function must be called prior enabling the delayed protection +*\*\note Balanced Idle mode is only available in push-pull mode +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param DPMode Delayed protection (DP) mode + * +*\*\ For timers A, B and C this parameter can be one of the following values: +*\*\ - SHRTIM_DP_DELAYOUT1_EXEV6 +*\*\ - SHRTIM_DP_DELAYOUT2_EXEV6 +*\*\ - SHRTIM_DP_DELAYBOTH_EXEV6 +*\*\ - SHRTIM_DP_DELAYOUT1_EXEV7 +*\*\ - SHRTIM_DP_DELAYOUT2_EXEV7 +*\*\ - SHRTIM_DP_DELAYBOTH_EXEV7 + * +*\*\ For timers D, E and F this parameter can be one of the following values: +*\*\ - SHRTIM_DP_DELAYOUT1_EXEV8 +*\*\ - SHRTIM_DP_DELAYOUT2_EXEV8 +*\*\ - SHRTIM_DP_DELAYBOTH_EXEV8 +*\*\ - SHRTIM_DP_DELAYOUT1_EXEV9 +*\*\ - SHRTIM_DP_DELAYOUT2_EXEV9 +*\*\ - SHRTIM_DP_DELAYBOTH_EXEV9 +*\*\return None +**/ +void SHRTIM_TIM_SetDPMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t DPMode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXOUT_DP, DPMode); +} + +/** +*\*\fun Get the delayed protection (DP) mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return DPMode Delayed protection (DP) mode + * +*\*\ For timers A, B and C this parameter can be one of the following values: +*\*\ - SHRTIM_DP_DELAYOUT1_EXEV6 +*\*\ - SHRTIM_DP_DELAYOUT2_EXEV6 +*\*\ - SHRTIM_DP_DELAYBOTH_EXEV6 +*\*\ - SHRTIM_DP_DELAYOUT1_EXEV7 +*\*\ - SHRTIM_DP_DELAYOUT2_EXEV7 +*\*\ - SHRTIM_DP_DELAYBOTH_EXEV7 + * +*\*\ For timers D, E and F this parameter can be one of the following values: +*\*\ - SHRTIM_DP_DELAYOUT1_EXEV8 +*\*\ - SHRTIM_DP_DELAYOUT2_EXEV8 +*\*\ - SHRTIM_DP_DELAYBOTH_EXEV8 +*\*\ - SHRTIM_DP_DELAYOUT1_EXEV9 +*\*\ - SHRTIM_DP_DELAYOUT2_EXEV9 +*\*\ - SHRTIM_DP_DELAYBOTH_EXEV9 +**/ +uint32_t SHRTIM_TIM_GetDPMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXOUT_DP)); +} + +/** +*\*\fun Enable delayed protection (DP) for a given timer. +*\*\note This function must not be called once the concerned timer is enabled +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_EnableDP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXOUT_DPEN); +} + +/** +*\*\fun Disable delayed protection (DP) for a given timer. +*\*\note This function must not be called once the concerned timer is enabled +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_DisableDP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXOUT_DPEN); +} + +/** +*\*\fun Indicate whether delayed protection (DP) is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of DPEN bit in SHRTIM_TxOUT register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledDP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return ((READ_BIT(*pReg, SHRTIM_TXOUT_DPEN) == (SHRTIM_TXOUT_DPEN)) ? 1UL : 0UL); +} + +/** +*\*\param Enable the Balanced Idle Automatic Resume (BIAR) for a given timer. +*\*\param This function must not be called once the concerned timer is enabled +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_EnableBIAR(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXOUT_BIAR); +} + +/** +*\*\param Disable the Balanced Idle Automatic Resume (BIAR) for a given timer. +*\*\param This function must not be called once the concerned timer is enabled +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_DisableBIAR(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0U].TxOUT) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXOUT_BIAR); +} + +/** +*\*\param Indicate whether the Balanced Idle Automatic Resume (BIAR) is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of DPEN bit in SHRTIM_TxOUT register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledBIAR(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXOUT_BIAR) == (SHRTIM_TXOUT_BIAR)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the software delay protection +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param SoftDP This parameter can be a combination of the following values: +*\*\ - SHRTIM_SOFT_DP_TA1 +*\*\ - SHRTIM_SOFT_DP_TA2 +*\*\ - SHRTIM_SOFT_DP_TB1 +*\*\ - SHRTIM_SOFT_DP_TB2 +*\*\ - SHRTIM_SOFT_DP_TC1 +*\*\ - SHRTIM_SOFT_DP_TC2 +*\*\ - SHRTIM_SOFT_DP_TD1 +*\*\ - SHRTIM_SOFT_DP_TD2 +*\*\ - SHRTIM_SOFT_DP_TE1 +*\*\ - SHRTIM_SOFT_DP_TE2 +*\*\ - SHRTIM_SOFT_DP_TF1 +*\*\ - SHRTIM_SOFT_DP_TF2 +*\*\return None +**/ +void SHRTIM_TIM_EnableSoftDP(SHRTIM_Module *SHRTIMx, uint32_t SoftDP) +{ + SET_BIT(SHRTIMx->sCommonRegs.SFTDP, (SoftDP & SHRTIM_SFTDP_CONFIG_MASK)); +} + +/** +*\*\fun Indicate whether the soft delay protection is enabled for a given channel. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param SoftDP This parameter can be a combination of the following values: +*\*\ - SHRTIM_SOFT_DP_TA1 +*\*\ - SHRTIM_SOFT_DP_TA2 +*\*\ - SHRTIM_SOFT_DP_TB1 +*\*\ - SHRTIM_SOFT_DP_TB2 +*\*\ - SHRTIM_SOFT_DP_TC1 +*\*\ - SHRTIM_SOFT_DP_TC2 +*\*\ - SHRTIM_SOFT_DP_TD1 +*\*\ - SHRTIM_SOFT_DP_TD2 +*\*\ - SHRTIM_SOFT_DP_TE1 +*\*\ - SHRTIM_SOFT_DP_TE2 +*\*\ - SHRTIM_SOFT_DP_TF1 +*\*\ - SHRTIM_SOFT_DP_TF2 +*\*\return State of SFTDPxy bit in SHRTIM_SFTDP register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledSoftDP(SHRTIM_Module *SHRTIMx, uint32_t SoftDP) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.SFTDP, SoftDP) == (SoftDP)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the fault channel(s) for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Faults This parameter can be a combination of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return None +**/ +void SHRTIM_TIM_EnableFault(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Faults) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxFALT) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, Faults); +} + +/** +*\*\fun Disable the fault channel(s) for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Faults This parameter can be a combination of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return None +**/ +void SHRTIM_TIM_DisableFault(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Faults) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxFALT) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, Faults); +} + +/** +*\*\fun Indicate whether the fault channel is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return State of FALTxEN bit in SHRTIM_TxFALT register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledFault(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Fault) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxFALT) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, Fault) == (Fault)) ? 1UL : 0UL); +} + +/** +*\*\fun Lock the fault conditioning set-up for a given timer. +*\*\note Timer fault-related set-up is frozen until the next SHRTIM or system reset +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_LockFault(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxFALT) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXFALT_FALTLCK); +} + +/** +*\*\fun Define how the timer behaves during a burst mode operation. +*\*\note This function must not be called when the burst mode is enabled +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param BurtsModeOption This parameter can be one of the following values: +*\*\ - SHRTIM_BURSTMODE_MAINTAINCLOCK +*\*\ - SHRTIM_BURSTMODE_RESETCOUNTER +*\*\return None +**/ +void SHRTIM_TIM_SetBurstModeOption(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t BurtsModeOption) +{ + uint32_t iTimer = (uint8_t)((POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos) & 0x1FU); + MODIFY_REG(SHRTIMx->sCommonRegs.BMCTRL, Timer, BurtsModeOption << iTimer); +} + +/** +*\*\fun Retrieve how the timer behaves during a burst mode operation. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return BurtsMode This parameter can be one of the following values: +*\*\ - SHRTIM_BURSTMODE_MAINTAINCLOCK +*\*\ - SHRTIM_BURSTMODE_RESETCOUNTER +**/ +uint32_t SHRTIM_TIM_GetBurstModeOption(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)((POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos) & 0x1FU); + return (READ_BIT(SHRTIMx->sCommonRegs.BMCTRL, Timer) >> iTimer); +} + +/** +*\*\fun Program which registers are to be written by Burst DMA transfers. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Registers Registers to be updated by the DMA request +*\*\ For Master timer this parameter can be can be a combination of the following values: +*\*\ - SHRTIM_BURSTDMA_NONE +*\*\ - SHRTIM_BURSTDMA_MCTRL +*\*\ - SHRTIM_BURSTDMA_MINTCLR +*\*\ - SHRTIM_BURSTDMA_MIDEN +*\*\ - SHRTIM_BURSTDMA_MCNT +*\*\ - SHRTIM_BURSTDMA_MPRD +*\*\ - SHRTIM_BURSTDMA_MREPT +*\*\ - SHRTIM_BURSTDMA_MCMPDAT1 +*\*\ - SHRTIM_BURSTDMA_MCMPDAT2 +*\*\ - SHRTIM_BURSTDMA_MCMPDAT3 +*\*\ - SHRTIM_BURSTDMA_MCMPDAT4 +*\*\ For Timers A..F this parameter can be can be a combination of the following values: +*\*\ - SHRTIM_BURSTDMA_TXCTRL +*\*\ - SHRTIM_BURSTDMA_TXINTCLR +*\*\ - SHRTIM_BURSTDMA_TXIDEN +*\*\ - SHRTIM_BURSTDMA_TXCNT +*\*\ - SHRTIM_BURSTDMA_TXPRD +*\*\ - SHRTIM_BURSTDMA_TXREPT +*\*\ - SHRTIM_BURSTDMA_TXCMP1DAT +*\*\ - SHRTIM_BURSTDMA_TXCMP2DAT +*\*\ - SHRTIM_BURSTDMA_TXCMP3DAT +*\*\ - SHRTIM_BURSTDMA_TXCMP4DAT +*\*\ - SHRTIM_BURSTDMA_TXDT +*\*\ - SHRTIM_BURSTDMA_TXSET1 +*\*\ - SHRTIM_BURSTDMA_TXRST1 +*\*\ - SHRTIM_BURSTDMA_TXSET2 +*\*\ - SHRTIM_BURSTDMA_TXRST2 +*\*\ - SHRTIM_BURSTDMA_TXEXEVFLT1 +*\*\ - SHRTIM_BURSTDMA_TXEXEVFLT2 +*\*\ - SHRTIM_BURSTDMA_TXCNTRST +*\*\ - SHRTIM_BURSTDMA_TXCHOP +*\*\ - SHRTIM_BURSTDMA_TXOUT +*\*\ - SHRTIM_BURSTDMA_TXFALT +*\*\ - SHRTIM_BURSTDMA_TXCTRL2 +*\*\ - SHRTIM_BURSTDMA_TXEXEVFLT3 +*\*\return None +**/ +void SHRTIM_TIM_ConfigBurstDMA(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Registers) +{ + const uint8_t REG_OFFSET_TAB_BDTUPR[] = + { + 0x00U, /* BDMUPR ; offset = 0x000 */ + 0x04U, /* BDAUPR ; offset = 0x05C */ + 0x08U, /* BDBUPR ; offset = 0x060 */ + 0x0CU, /* BDCUPR ; offset = 0x064 */ + 0x10U, /* BDDUPR ; offset = 0x068 */ + 0x14U, /* BDEUPR ; offset = 0x06C */ + 0x1CU /* BDFUPR ; offset = 0x074 */ + }; + + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.BDMTUPD) + REG_OFFSET_TAB_BDTUPR[iTimer])); + WRITE_REG(*pReg, Registers); +} + +/** +*\*\fun Indicate on which output the signal is currently applied. +*\*\note Only significant when the timer operates in push-pull mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return CPPSTAT This parameter can be one of the following values: +*\*\ - SHRTIM_CPPSTAT_OUTPUT1 +*\*\ - SHRTIM_CPPSTAT_OUTPUT2 +**/ +uint32_t SHRTIM_TIM_GetCurrentPushPullStatus(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXINTSTS_CPPSTS)); +} + +/** +*\*\fun Indicate on which output the signal was applied, in push-pull mode, balanced fault mode or delayed idle mode, when the protection was triggered. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return IPPSTAT This parameter can be one of the following values: +*\*\ - SHRTIM_IPPSTAT_OUTPUT1 +*\*\ - SHRTIM_IPPSTAT_OUTPUT2 +**/ +uint32_t SHRTIM_TIM_GetIdlePushPullStatus(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXINTSTS_IPPSTS)); +} + +/** +*\*\fun Window selection when EXEVxFLT = 0b'1111. +In up-down counting mode (SHRTIM_TxCTRL2.UPDOWNM bit set): windowing from compare 2 +during the up-counting phase to compare 3 during the down-counting phase. +If EXEVWINSEL = 0, compare 2 is from another timer unit(refer to Table 9-19); +if EXEVWINSEL = 1, compare 2 is from timer unit itself. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_EnableEventWindowSelection(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxEXEVFLT1) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXEXEVFLT1_EXEVWINSEL); +} + +/** +*\*\fun Window selection when EXEVxFLT = 0b'1111. +In up-down counting mode (SHRTIM_TxCTRL2.UPDOWNM bit set): windowing from compare 2 +during the up-counting phase to compare 3 during the down-counting phase. +If EXEVWINSEL = 0, compare 2 is from another timer unit(refer to Table 9-19); +if EXEVWINSEL = 1, compare 2 is from timer unit itself. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_DisbleEventWindowSelection(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxEXEVFLT1) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXEXEVFLT1_EXEVWINSEL); +} + +/** +*\*\fun Set the event filter for a given timer. +*\*\note This function must not be called when the timer counter is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\param Filter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEVFLT_NONE +*\*\ - SHRTIM_EXEVFLT_BLANKINGCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKINGCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKINGCMP3 +*\*\ - SHRTIM_EXEVFLT_BLANKINGCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF1_TIMBCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF2_TIMBCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF3_TIMBOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF4_TIMCCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF5_TIMCCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF6_TIMFCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF7_TIMDCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF8_TIMECMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF1_TIMACMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF2_TIMACMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF3_TIMAOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF4_TIMCCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF5_TIMCCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF6_TIMFCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF7_TIMDCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF8_TIMECMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF1_TIMACMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF2_TIMBCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF3_TIMBCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF4_TIMFCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF5_TIMDCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF6_TIMDCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF7_TIMDOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF8_TIMECMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF1_TIMACMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF2_TIMBCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF3_TIMCCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF4_TIMCCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF5_TIMCOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF6_TIMECMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF7_TIMECMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF8_TIMFCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF1_TIMACMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF2_TIMBCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF3_TIMCCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF4_TIMFCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF5_TIMFOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF6_TIMDCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF7_TIMDCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF8_TIMDOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF1_TIMACMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF2_TIMBCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF3_TIMCCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF4_TIMDCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF5_TIMDCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF6_TIMECMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF7_TIMECMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF8_TIMEOUT2 +*\*\ - SHRTIM_EXEVFLT_WINDOWINGCMP2 +*\*\ - SHRTIM_EXEVFLT_WINDOWINGCMP3 +*\*\ - SHRTIM_EXEVFLT_WINDOWINGTIM +*\*\return None +**/ +void SHRTIM_TIM_SetEventFilter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Event, uint32_t Filter) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxEXEVFLT1) + + REG_OFFSET_TAB_TIMER[iTimer] + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + __IO uint32_t *pRegWinSelBypass = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxEXEVFLT1) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, (SHRTIM_TXEXEVFLT1_EXEV1FLT << REG_SHIFT_TAB_EXEVx[iEvent]), (Filter << REG_SHIFT_TAB_EXEVx[iEvent])); + SET_BIT(*pRegWinSelBypass, SHRTIM_TXEXEVFLT1_EXEVWINSEL); +} + +/** +*\*\fun Get actual event filter settings for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\return Filter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEVFLT_NONE +*\*\ - SHRTIM_EXEVFLT_BLANKINGCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKINGCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKINGCMP3 +*\*\ - SHRTIM_EXEVFLT_BLANKINGCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF1_TIMBCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF2_TIMBCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF3_TIMBOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF4_TIMCCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF5_TIMCCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF6_TIMFCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF7_TIMDCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMAEEF8_TIMECMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF1_TIMACMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF2_TIMACMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF3_TIMAOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF4_TIMCCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF5_TIMCCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF6_TIMFCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF7_TIMDCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMBEEF8_TIMECMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF1_TIMACMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF2_TIMBCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF3_TIMBCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF4_TIMFCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF5_TIMDCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF6_TIMDCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF7_TIMDOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMCEEF8_TIMECMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF1_TIMACMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF2_TIMBCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF3_TIMCCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF4_TIMCCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF5_TIMCOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF6_TIMECMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF7_TIMECMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMDEEF8_TIMFCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF1_TIMACMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF2_TIMBCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF3_TIMCCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF4_TIMFCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF5_TIMFOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF6_TIMDCMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF7_TIMDCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMEEEF8_TIMDOUT2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF1_TIMACMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF2_TIMBCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF3_TIMCCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF4_TIMDCMP2 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF5_TIMDCMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF6_TIMECMP1 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF7_TIMECMP4 +*\*\ - SHRTIM_EXEVFLT_BLANKING_TIMFEEF8_TIMEOUT2 +*\*\ - SHRTIM_EXEVFLT_WINDOWINGCMP2 +*\*\ - SHRTIM_EXEVFLT_WINDOWINGCMP3 +*\*\ - SHRTIM_EXEVFLT_WINDOWINGTIM +**/ +uint32_t SHRTIM_TIM_GetEventFilter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Event) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxEXEVFLT1) + + REG_OFFSET_TAB_TIMER[iTimer] + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_TXEXEVFLT1_EXEV1FLT) << (REG_SHIFT_TAB_EXEVx[iEvent])) >> (REG_SHIFT_TAB_EXEVx[iEvent])); +} + +/** +*\*\fun Enable or disable event latch mechanism for a given timer. +*\*\note This function must not be called when the timer counter is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\param LatchStatus This parameter can be one of the following values: +*\*\ - SHRTIM_EXEVLATCH_DISABLED +*\*\ - SHRTIM_EXEVLATCH_ENABLED +*\*\return None +**/ +void SHRTIM_TIM_SetEventLatchStatus(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Event, + uint32_t LatchStatus) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxEXEVFLT1) + + REG_OFFSET_TAB_TIMER[iTimer] + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + MODIFY_REG(*pReg, (SHRTIM_TXEXEVFLT1_EXEV1LATCH << REG_SHIFT_TAB_EXEVx[iEvent]), (LatchStatus << REG_SHIFT_TAB_EXEVx[iEvent])); +} + +/** +*\*\fun Get actual event latch status for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\return LatchStatus This parameter can be one of the following values: +*\*\ - SHRTIM_EXEVLATCH_DISABLED +*\*\ - SHRTIM_EXEVLATCH_ENABLED +**/ +uint32_t SHRTIM_TIM_GetEventLatchStatus(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Event) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxEXEVFLT1) + + REG_OFFSET_TAB_TIMER[iTimer] + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_TXEXEVFLT1_EXEV1LATCH) << REG_SHIFT_TAB_EXEVx[iEvent]) >> (REG_SHIFT_TAB_EXEVx[iEvent])); +} + +/** +*\*\fun Select the Trigger-Half operating mode for a given timer. +*\*\note This bitfield defines whether the compare 2 register +*\*\note is behaving in standard mode (compare match issued as soon as counter equal compare) +*\*\note or in triggered-half mode +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_TRIGHALF_ENABLED +*\*\ - SHRTIM_TRIGHALF_DISABLED +*\*\return None +**/ +void SHRTIM_TIM_SetTriggeredHalfMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCTRL2_TRGHLF, Mode); +} + +/** +*\*\fun Get the Trigger-Half operating mode for a given timer. +*\*\note This bitfield reports whether the compare 2 register +*\*\note is behaving in standard mode (compare match issued as soon as counter equal compare) +*\*\note or in triggered-half mode +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Mode This parameter can be one of the following values: +*\*\ - SHRTIM_TRIGHALF_ENABLED +*\*\ - SHRTIM_TRIGHALF_DISABLED +**/ +uint32_t SHRTIM_TIM_GetTriggeredHalfMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCTRL2_TRGHLF)); +} + +/** +*\*\fun Select the compare 1 operating mode. +*\*\note This bit defines the compare 1 operating mode: +*\*\note 0: the compare 1 event is generated when the counter is equal to the compare value +*\*\note 1: the compare 1 event is generated when the counter is greater than the compare value +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_GTCMP1_EQUAL +*\*\ - SHRTIM_GTCMP1_GREATER +*\*\return None +**/ +void SHRTIM_TIM_SetComp1Mode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCTRL2_GTCMP1, Mode); +} + +/** +*\*\fun Get the selected compare 1 operating mode. +*\*\note This bit reports the compare 1 operating mode: +*\*\note 0: the compare 1 event is generated when the counter is equal to the compare value +*\*\note 1: the compare 1 event is generated when the counter is greater than the compare value +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Mode This parameter can be one of the following values: +*\*\ - SHRTIM_GTCMP1_EQUAL +*\*\ - SHRTIM_GTCMP1_GREATER +**/ +uint32_t SHRTIM_TIM_GetComp1Mode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCTRL2_GTCMP1)); +} + +/** +*\*\fun Select the compare 3 operating mode. +*\*\note This bit defines the compare 3 operating mode: +*\*\note 0: the compare 3 event is generated when the counter is equal to the compare value +*\*\note 1: the compare 3 event is generated when the counter is greater than the compare value +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_GTCMP3_EQUAL +*\*\ - SHRTIM_GTCMP3_GREATER +*\*\return None +**/ +void SHRTIM_TIM_SetComp3Mode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCTRL2_GTCMP3, (Mode)); +} + +/** +*\*\fun Get the selected compare 3 operating mode. +*\*\note This bit reports the compare 3 operating mode: +*\*\note 0: the compare 3 event is generated when the counter is equal to the compare value +*\*\note 1: the compare 3 event is generated when the counter is greater than the compare value +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Mode This parameter can be one of the following values: +*\*\ - SHRTIM_GTCMP3_EQUAL +*\*\ - SHRTIM_GTCMP3_GREATER +**/ +uint32_t SHRTIM_TIM_GetComp3Mode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0U].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCTRL2_GTCMP3)); +} + +/** +*\*\fun Select the roll-over mode. +*\*\note Only significant in up-down counting mode (see function SHRTIM_TIM_SetCountingMode()). +*\*\note Only concerns the Roll-over event with the following destinations: Update trigger, IRQ + * and DMA requests, repetition counter decrement and External Event filtering. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_ROLLOVER_MODE_PER +*\*\ - SHRTIM_ROLLOVER_MODE_RST +*\*\ - SHRTIM_ROLLOVER_MODE_BOTH +*\*\return None +**/ +void SHRTIM_TIM_SetRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCTRL2_ROM, (Mode << SHRTIM_TXCTRL2_ROM_Pos)); +} + +/** +*\*\fun Get selected the roll-over mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Mode returned value can be one of the following values: +*\*\ - SHRTIM_ROLLOVER_MODE_PER +*\*\ - SHRTIM_ROLLOVER_MODE_RST +*\*\ - SHRTIM_ROLLOVER_MODE_BOTH +**/ +uint32_t SHRTIM_TIM_GetRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCTRL2_ROM) >> SHRTIM_TXCTRL2_ROM_Pos); +} + +/** +*\*\fun Select Fault and Event roll-over mode. +*\*\note Only significant in up-down counting mode (see function SHRTIM_TIM_SetCountingMode()). +*\*\note only concerns the Roll-over event used by the Fault and Event counters. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_ROLLOVER_MODE_PER +*\*\ - SHRTIM_ROLLOVER_MODE_RST +*\*\ - SHRTIM_ROLLOVER_MODE_BOTH +*\*\return None +**/ +void SHRTIM_TIM_SetFaultEventRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCTRL2_FEROM, (Mode << SHRTIM_TXCTRL2_FEROM_Pos)); +} + +/** +*\*\fun Get selected Fault and Event role-over mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Mode returned value can be one of the following values: +*\*\ - SHRTIM_ROLLOVER_MODE_PER +*\*\ - SHRTIM_ROLLOVER_MODE_RST +*\*\ - SHRTIM_ROLLOVER_MODE_BOTH +**/ +uint32_t SHRTIM_TIM_GetFaultEventRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCTRL2_FEROM) >> SHRTIM_TXCTRL2_FEROM_Pos); +} + +/** +*\*\fun Select the Burst mode roll-over mode. +*\*\note Only significant in up-down counting mode (see function SHRTIM_TIM_SetCountingMode()). +*\*\note Only concerns the Roll-over event used in the Burst mode controller, as clock as as burst mode trigger. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_ROLLOVER_MODE_PER +*\*\ - SHRTIM_ROLLOVER_MODE_RST +*\*\ - SHRTIM_ROLLOVER_MODE_BOTH +*\*\return None +**/ +void SHRTIM_TIM_SetBMRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCTRL2_BMROM, (Mode << SHRTIM_TXCTRL2_BMROM_Pos)); +} + +/** +*\*\fun Get selected Burst mode roll-over mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Mode returned value can be one of the following values: +*\*\ - SHRTIM_ROLLOVER_MODE_PER +*\*\ - SHRTIM_ROLLOVER_MODE_RST +*\*\ - SHRTIM_ROLLOVER_MODE_BOTH +**/ +uint32_t SHRTIM_TIM_GetBMRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCTRL2_BMROM) >> SHRTIM_TXCTRL2_BMROM_Pos); +} + +/** +*\*\fun Select the ADC roll-over mode. +*\*\note Only significant in up-down counting mode (see function SHRTIM_TIM_SetCountingMode()). +*\*\note Only concerns the Roll-over event used to trigger the ADC. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_ROLLOVER_MODE_PER +*\*\ - SHRTIM_ROLLOVER_MODE_RST +*\*\ - SHRTIM_ROLLOVER_MODE_BOTH +*\*\return None +**/ +void SHRTIM_TIM_SetADCRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCTRL2_ADCROM, (Mode << SHRTIM_TXCTRL2_ADCROM_Pos)); +} + +/** +*\*\fun Get selected ADC roll-over mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Mode returned value can be one of the following values: +*\*\ - SHRTIM_ROLLOVER_MODE_PER +*\*\ - SHRTIM_ROLLOVER_MODE_RST +*\*\ - SHRTIM_ROLLOVER_MODE_BOTH +**/ +uint32_t SHRTIM_TIM_GetADCRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCTRL2_ADCROM) >> SHRTIM_TXCTRL2_ADCROM_Pos); +} + +/** +*\*\fun Select the ADC roll-over mode. +*\*\note Only significant in up-down counting mode (see function SHRTIM_TIM_SetCountingMode()). +*\*\note Only concerns concerns the Roll-over event which sets and/or resets the outputs, + * as per SHRTIM_SETxyR and SHRTIM_RSTxyR settings (see function SHRTIM_OUT_SetOutputSetSrc() + * and function SHRTIM_OUT_SetOutputResetSrc() respectively). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_ROLLOVER_MODE_PER +*\*\ - SHRTIM_ROLLOVER_MODE_RST +*\*\ - SHRTIM_ROLLOVER_MODE_BOTH +*\*\return None +**/ +void SHRTIM_TIM_SetOutputRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCTRL2_OUTROM, (Mode << SHRTIM_TXCTRL2_OUTROM_Pos)); +} + +/** +*\*\fun Get selected ADC roll-over mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Mode returned value can be one of the following values: +*\*\ - SHRTIM_ROLLOVER_MODE_PER +*\*\ - SHRTIM_ROLLOVER_MODE_RST +*\*\ - SHRTIM_ROLLOVER_MODE_BOTH +**/ +uint32_t SHRTIM_TIM_GetOutputRollOverMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCTRL2_OUTROM) >> SHRTIM_TXCTRL2_OUTROM_Pos); +} + +/** +*\*\fun Select the counting mode. +*\*\note The up-down counting mode is available for both continuous and single-shot + * (retriggerable and nonretriggerable) operating modes + * (see function SHRTIM_TIM_SetCounterMode()). +*\*\note The counter roll-over event is defined differently in-up-down counting mode to + * support various operating condition. + * See SHRTIM_TIM_SetCounterMode() +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_COUNTING_MODE_UP +*\*\ - SHRTIM_COUNTING_MODE_UP_DOWN +*\*\return None +**/ +void SHRTIM_TIM_SetCountingMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCTRL2_UPDOWNM, Mode); +} + +/** +*\*\fun Get selected counting mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Mode returned value can be one of the following values: +*\*\ - SHRTIM_COUNTING_MODE_UP +*\*\ - SHRTIM_COUNTING_MODE_UP_DOWN +*\*\return None +**/ +uint32_t SHRTIM_TIM_GetCountingMode(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCTRL2_UPDOWNM)); +} + +/** +*\*\fun Select Dual DAC Reset trigger. +*\*\note Significant only when Dual DAC trigger is enabled + * (see function SHRTIM_TIM_EnableDualDacTrigger()). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_DUDACRST_COUNTER +*\*\ - SHRTIM_DUDACRST_OUT1SET +*\*\return None +**/ +void SHRTIM_TIM_SetDualDacResetTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCTRL2_DUDACRST, Mode); +} + +/** +*\*\fun Get selected Dual DAC Reset trigger. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Trigger returned value can be one of the following values: +*\*\ - SHRTIM_DUDACRST_COUNTER +*\*\ - SHRTIM_DUDACRST_OUT1SET +**/ +uint32_t SHRTIM_TIM_GetDualDacResetTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCTRL2_DUDACRST)); +} + +/** +*\*\fun Select Dual DAC Step trigger. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_DUDACSTEP_CMP2 +*\*\ - SHRTIM_DUDACSTEP_OUT1RST +*\*\return None +**/ +void SHRTIM_TIM_SetDualDacStepTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCTRL2_DUDACSTEP, Mode); +} + +/** +*\*\fun Get selected Dual DAC Step trigger. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Trigger returned value can be one of the following values: +*\*\ - SHRTIM_DUDACSTEP_CMP2 +*\*\ - SHRTIM_DUDACSTEP_OUT1RST +**/ +uint32_t SHRTIM_TIM_GetDualDacStepTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCTRL2_DUDACSTEP)); +} + +/** +*\*\fun Enable Dual DAC trigger. +*\*\note Only significant when balanced Idle mode is enabled (see function SHRTIM_TIM_SetDPMode()). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_EnableDualDacTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXCTRL2_DUDACEN); +} + +/** +*\*\fun Disable Dual DAC trigger. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_TIM_DisableDualDacTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXCTRL2_DUDACEN); +} + +/** +*\*\fun Indicate whether Dual DAC trigger is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of DUDACEN bit in SHRTIM_TxCTRL2 register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledDualDacTrigger(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCTRL2) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXCTRL2_DUDACEN) == (SHRTIM_TXCTRL2_DUDACEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Set the external event counter threshold. +*\*\note The external event is propagated to the timer only if the number + * of active edges is greater than the external event counter threshold. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param EventCounter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_A +*\*\ - SHRTIM_EXEV_COUNTER_B +*\*\param Threshold This parameter can be a number between Min_Data=0 and Max_Data=63 +*\*\return None +**/ +void SHRTIM_TIM_SetEventCounterThreshold(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter, + uint32_t Threshold) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[iTimer].TxEXEVFLT3))); + + MODIFY_REG(*pReg, (SHRTIM_TXEXEVFLT3_EXEVCNT << EventCounter), Threshold << (SHRTIM_TXEXEVFLT3_EXEVCNT_Pos + EventCounter)); +} + +/** +*\*\fun Get the programmed external event counter threshold. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param EventCounter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_A +*\*\ - SHRTIM_EXEV_COUNTER_B +*\*\return Threshold Value between Min_Data=0 and Max_Data=63 +**/ +uint32_t SHRTIM_TIM_GetEventCounterThreshold(SHRTIM_Module *SHRTIMx, uint32_t Timer, + uint32_t EventCounter) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[iTimer].TxEXEVFLT3))); + + return ((READ_BIT(*pReg, (uint32_t)(SHRTIM_TXEXEVFLT3_EXEVCNT) << EventCounter)) >> ((SHRTIM_TXEXEVFLT3_EXEVCNT_Pos + EventCounter))); +} + +/** +*\*\fun Select the external event counter source. +*\*\note External event counting is only valid for edge-sensitive + * external events (See function SHRTIM_EXEV_Config() and function + * SHRTIM_EXEV_SetSensitivity()). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param EventCounter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_A +*\*\ - SHRTIM_EXEV_COUNTER_B +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\return None +**/ +void SHRTIM_TIM_SetEventCounterSource(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter, + uint32_t Event) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[iTimer].TxEXEVFLT3))); + uint32_t iEvent = (uint32_t)(POSITION_VAL(Event)); + + /* register SEL value is 0 if SHRTIM_EVENT_1, 1 if SHRTIM_EVENT_1, etc + and 9 if SHRTIM_EVENT_10 */ + MODIFY_REG(*pReg, (SHRTIM_TXEXEVFLT3_EXEVSEL << EventCounter), iEvent << (SHRTIM_TXEXEVFLT3_EXEVSEL_Pos + EventCounter)); +} + +/** +*\*\fun get the selected external event counter source. + * SHRTIM_EXEV_SetSensitivity()). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param EventCounter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_A +*\*\ - SHRTIM_EXEV_COUNTER_B +*\*\return Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +**/ +uint32_t SHRTIM_TIM_GetEventCounterSource(SHRTIM_Module *SHRTIMx, uint32_t Timer, + uint32_t EventCounter) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[iTimer].TxEXEVFLT3))); + + uint32_t iEvent = (READ_BIT(*pReg, (uint32_t)(SHRTIM_TXEXEVFLT3_EXEVSEL) << (EventCounter))) >> ((SHRTIM_TXEXEVFLT3_EXEVSEL_Pos + EventCounter)); + + /* returned value is 0 if SEL is SHRTIM_EVENT_1, 1 if SEL is SHRTIM_EVENT_1, etc + and 9 if SEL is SHRTIM_EVENT_10 */ + return ((uint32_t)0x1U << iEvent); +} + +/** +*\*\fun Select the external event counter reset mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param EventCounter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_A +*\*\ - SHRTIM_EXEV_COUNTER_B +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_RSTMODE_UNCONDITIONAL +*\*\ - SHRTIM_EXEV_COUNTER_RSTMODE_CONDITIONAL +*\*\return None +**/ +void SHRTIM_TIM_SetEventCounterResetMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter, + uint32_t Mode) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[iTimer].TxEXEVFLT3))); + + MODIFY_REG(*pReg, (SHRTIM_TXEXEVFLT3_EXEVRSTM << (EventCounter)), Mode << (EventCounter)); +} + +/** +*\*\fun Get selected external event counter reset mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param EventCounter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_A +*\*\ - SHRTIM_EXEV_COUNTER_B +*\*\return Mode This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_RSTMODE_UNCONDITIONAL +*\*\ - SHRTIM_EXEV_COUNTER_RSTMODE_CONDITIONAL +**/ +uint32_t SHRTIM_TIM_GetEventCounterResetMode(SHRTIM_Module *SHRTIMx, uint32_t Timer, + uint32_t EventCounter) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[iTimer].TxEXEVFLT3))); + + return ((READ_BIT(*pReg, (uint32_t)(SHRTIM_TXEXEVFLT3_EXEVRSTM) << (EventCounter))) >> (EventCounter)); +} + +/** +*\*\fun Reset the external event counter. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param EventCounter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_A +*\*\ - SHRTIM_EXEV_COUNTER_B +*\*\return None +**/ +void SHRTIM_TIM_ResetEventCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[iTimer].TxEXEVFLT3))); + + SET_BIT(*pReg, (uint32_t)(SHRTIM_TXEXEVFLT3_EXEVCNTRST) << EventCounter); +} + +/** +*\*\fun Enable the external event counter. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param EventCounter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_A +*\*\ - SHRTIM_EXEV_COUNTER_B +*\*\return None +**/ +void SHRTIM_TIM_EnableEventCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[iTimer].TxEXEVFLT3))); + + SET_BIT(*pReg, (uint32_t)(SHRTIM_TXEXEVFLT3_EXEVCNTEN) << EventCounter); +} + +/** +*\*\fun Disable the external event counter. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param EventCounter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_A +*\*\ - SHRTIM_EXEV_COUNTER_B +*\*\return None +**/ +void SHRTIM_TIM_DisableEventCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t EventCounter) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[iTimer].TxEXEVFLT3))); + + CLEAR_BIT(*pReg, (SHRTIM_TXEXEVFLT3_EXEVCNTEN << EventCounter)); +} + +/** +*\*\fun Indicate whether the external event counter is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param EventCounter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_COUNTER_A +*\*\ - SHRTIM_EXEV_COUNTER_B +*\*\return State of EXEVCNTEN bit in SHRTIM_TxEXEVFLT3 register (1 or 0). +**/ +uint32_t SHRTIM_TIM_IsEnabledEventCounter(SHRTIM_Module *SHRTIMx, uint32_t Timer, + uint32_t EventCounter) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - POSITION_VAL(SHRTIM_TIMER_A)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[iTimer].TxEXEVFLT3))); + + uint32_t temp; /* MINTSTSAC-2012 compliance */ + temp = READ_BIT(*pReg, (uint32_t)(SHRTIM_TXEXEVFLT3_EXEVCNTEN) << EventCounter); + + return ((temp == ((uint32_t)(SHRTIM_TXEXEVFLT3_EXEVCNTEN) << EventCounter)) ? 1UL : 0UL); +} + +/** @defgroup SHRTIM_EF_Dead_Time_Configuration Dead_Time_Configuration +*\*\{ +**/ + +/** +*\*\fun Configure the dead time insertion feature for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Configuration This parameter must be a combination of all the following values: +*\*\ - SHRTIM_DT_PRESCALER_MUL8 or ... or SHRTIM_DT_PRESCALER_DIV16 +*\*\ - SHRTIM_DT_RISING_POSITIVE or SHRTIM_DT_RISING_NEGATIVE +*\*\ - SHRTIM_DT_FALLING_POSITIVE or SHRTIM_DT_FALLING_NEGATIVE +*\*\return None +**/ +void SHRTIM_DT_Config(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Configuration) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXDT_SDTF | SHRTIM_TXDT_DTPSC | SHRTIM_TXDT_SDTR, Configuration); +} + +/** +*\*\fun Set the deadtime prescaler value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_DT_PRESCALER_MUL8 +*\*\ - SHRTIM_DT_PRESCALER_MUL4 +*\*\ - SHRTIM_DT_PRESCALER_MUL2 +*\*\ - SHRTIM_DT_PRESCALER_DIV1 +*\*\ - SHRTIM_DT_PRESCALER_DIV2 +*\*\ - SHRTIM_DT_PRESCALER_DIV4 +*\*\ - SHRTIM_DT_PRESCALER_DIV8 +*\*\ - SHRTIM_DT_PRESCALER_DIV16 +*\*\return None +**/ +void SHRTIM_DT_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Prescaler) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXDT_DTPSC, Prescaler); +} + +/** +*\*\fun Get actual deadtime prescaler value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_DT_PRESCALER_MUL8 +*\*\ - SHRTIM_DT_PRESCALER_MUL4 +*\*\ - SHRTIM_DT_PRESCALER_MUL2 +*\*\ - SHRTIM_DT_PRESCALER_DIV1 +*\*\ - SHRTIM_DT_PRESCALER_DIV2 +*\*\ - SHRTIM_DT_PRESCALER_DIV4 +*\*\ - SHRTIM_DT_PRESCALER_DIV8 +*\*\ - SHRTIM_DT_PRESCALER_DIV16 +**/ +uint32_t SHRTIM_DT_GetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXDT_DTPSC)); +} + +/** +*\*\fun Set the deadtime rising value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param RisingValue Value between 0 and 0x1FF +*\*\return None +**/ +void SHRTIM_DT_SetRisingValue(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t RisingValue) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXDT_DTR, RisingValue); +} + +/** +*\*\fun Get actual deadtime rising value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return RisingValue Value between 0 and 0x1FF +**/ +uint32_t SHRTIM_DT_GetRisingValue(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXDT_DTR)); +} + +/** +*\*\fun Set the deadtime sign on rising edge. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param RisingSign This parameter can be one of the following values: +*\*\ - SHRTIM_DT_RISING_POSITIVE +*\*\ - SHRTIM_DT_RISING_NEGATIVE +*\*\return None +**/ +void SHRTIM_DT_SetRisingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t RisingSign) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXDT_SDTR, RisingSign); +} + +/** +*\*\fun Get actual deadtime sign on rising edge. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return RisingSign This parameter can be one of the following values: +*\*\ - SHRTIM_DT_RISING_POSITIVE +*\*\ - SHRTIM_DT_RISING_NEGATIVE +**/ +uint32_t SHRTIM_DT_GetRisingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXDT_SDTR)); +} + +/** +*\*\fun Set the deadime falling value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param FallingValue Value between 0 and 0x1FF +*\*\return None +**/ +void SHRTIM_DT_SetFallingValue(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t FallingValue) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXDT_DTF, FallingValue << SHRTIM_TXDT_DTF_Pos); +} + +/** +*\*\fun Get actual deadtime falling value +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return FallingValue Value between 0 and 0x1FF +**/ +uint32_t SHRTIM_DT_GetFallingValue(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return ((READ_BIT(*pReg, SHRTIM_TXDT_DTF)) >> SHRTIM_TXDT_DTF_Pos); +} + +/** +*\*\fun Set the deadtime sign on falling edge. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param FallingSign This parameter can be one of the following values: +*\*\ - SHRTIM_DT_FALLING_POSITIVE +*\*\ - SHRTIM_DT_FALLING_NEGATIVE +*\*\return None +**/ +void SHRTIM_DT_SetFallingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t FallingSign) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXDT_SDTF, FallingSign); +} + +/** +*\*\fun Get actual deadtime sign on falling edge. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return FallingSign This parameter can be one of the following values: +*\*\ - SHRTIM_DT_FALLING_POSITIVE +*\*\ - SHRTIM_DT_FALLING_NEGATIVE +**/ +uint32_t SHRTIM_DT_GetFallingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXDT_SDTF)); +} + +/** +*\*\fun Lock the deadtime value and sign on rising edge. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DT_LockRising(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXDT_DTRLCK); +} + +/** +*\*\fun Lock the deadtime sign on rising edge. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DT_LockRisingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXDT_DTRSLCK); +} + +/** +*\*\fun Lock the deadtime value and sign on falling edge. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DT_LockFalling(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXDT_DTFLCK); +} + +/** +*\*\fun Lock the deadtime sign on falling edge. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DT_LockFallingSign(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxDT) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXDT_DTFSLCK); +} + +/** @defgroup SHRTIM_EF_Chopper_Mode_Configuration Chopper_Mode_Configuration +*\*\{ +**/ + +/** +*\*\fun Configure the chopper stage for a given timer. +*\*\note This function must not be called if the chopper mode is already + * enabled for one of the timer outputs. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Configuration This parameter must be a combination of all the following values: +*\*\ - SHRTIM_CHP_PRESCALER_DIV16 or ... or SHRTIM_CHP_PRESCALER_DIV256 +*\*\ - SHRTIM_CHP_DUTYCYCLE_0 or ... or SHRTIM_CHP_DUTYCYCLE_875 +*\*\ - SHRTIM_CHP_PULSEWIDTH_16 or ... or SHRTIM_CHP_PULSEWIDTH_256 +*\*\return None +**/ +void SHRTIM_CHP_Config(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Configuration) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCHOP) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCHOP_STARTPW | SHRTIM_TXCHOP_CARDCY | SHRTIM_TXCHOP_CARFRQ, Configuration); +} + +/** +*\*\fun Set prescaler determining the carrier frequency to be added on top +*\*\ of the timer output signals when chopper mode is enabled. +*\*\note This function must not be called if the chopper mode is already + * enabled for one of the timer outputs. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_CHP_PRESCALER_DIV16 +*\*\ - SHRTIM_CHP_PRESCALER_DIV32 +*\*\ - SHRTIM_CHP_PRESCALER_DIV48 +*\*\ - SHRTIM_CHP_PRESCALER_DIV64 +*\*\ - SHRTIM_CHP_PRESCALER_DIV80 +*\*\ - SHRTIM_CHP_PRESCALER_DIV96 +*\*\ - SHRTIM_CHP_PRESCALER_DIV112 +*\*\ - SHRTIM_CHP_PRESCALER_DIV128 +*\*\ - SHRTIM_CHP_PRESCALER_DIV144 +*\*\ - SHRTIM_CHP_PRESCALER_DIV160 +*\*\ - SHRTIM_CHP_PRESCALER_DIV176 +*\*\ - SHRTIM_CHP_PRESCALER_DIV192 +*\*\ - SHRTIM_CHP_PRESCALER_DIV208 +*\*\ - SHRTIM_CHP_PRESCALER_DIV224 +*\*\ - SHRTIM_CHP_PRESCALER_DIV240 +*\*\ - SHRTIM_CHP_PRESCALER_DIV256 +*\*\return None +**/ +void SHRTIM_CHP_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t Prescaler) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCHOP) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCHOP_CARFRQ, Prescaler); +} + +/** +*\*\fun Get actual chopper stage prescaler value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_CHP_PRESCALER_DIV16 +*\*\ - SHRTIM_CHP_PRESCALER_DIV32 +*\*\ - SHRTIM_CHP_PRESCALER_DIV48 +*\*\ - SHRTIM_CHP_PRESCALER_DIV64 +*\*\ - SHRTIM_CHP_PRESCALER_DIV80 +*\*\ - SHRTIM_CHP_PRESCALER_DIV96 +*\*\ - SHRTIM_CHP_PRESCALER_DIV112 +*\*\ - SHRTIM_CHP_PRESCALER_DIV128 +*\*\ - SHRTIM_CHP_PRESCALER_DIV144 +*\*\ - SHRTIM_CHP_PRESCALER_DIV160 +*\*\ - SHRTIM_CHP_PRESCALER_DIV176 +*\*\ - SHRTIM_CHP_PRESCALER_DIV192 +*\*\ - SHRTIM_CHP_PRESCALER_DIV208 +*\*\ - SHRTIM_CHP_PRESCALER_DIV224 +*\*\ - SHRTIM_CHP_PRESCALER_DIV240 +*\*\ - SHRTIM_CHP_PRESCALER_DIV256 +**/ +uint32_t SHRTIM_CHP_GetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCHOP) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCHOP_CARFRQ)); +} + +/** +*\*\fun Set the chopper duty cycle. +*\*\note Duty cycle can be adjusted by 1/8 step (from 0/8 up to 7/8) +*\*\note This function must not be called if the chopper mode is already + * enabled for one of the timer outputs. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param DutyCycle This parameter can be one of the following values: +*\*\ - SHRTIM_CHP_DUTYCYCLE_0 +*\*\ - SHRTIM_CHP_DUTYCYCLE_125 +*\*\ - SHRTIM_CHP_DUTYCYCLE_250 +*\*\ - SHRTIM_CHP_DUTYCYCLE_375 +*\*\ - SHRTIM_CHP_DUTYCYCLE_500 +*\*\ - SHRTIM_CHP_DUTYCYCLE_625 +*\*\ - SHRTIM_CHP_DUTYCYCLE_750 +*\*\ - SHRTIM_CHP_DUTYCYCLE_875 +*\*\return None +**/ +void SHRTIM_CHP_SetDutyCycle(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t DutyCycle) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCHOP) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCHOP_CARDCY, DutyCycle); +} + +/** +*\*\fun Get actual chopper duty cycle. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return DutyCycle This parameter can be one of the following values: +*\*\ - SHRTIM_CHP_DUTYCYCLE_0 +*\*\ - SHRTIM_CHP_DUTYCYCLE_125 +*\*\ - SHRTIM_CHP_DUTYCYCLE_250 +*\*\ - SHRTIM_CHP_DUTYCYCLE_375 +*\*\ - SHRTIM_CHP_DUTYCYCLE_500 +*\*\ - SHRTIM_CHP_DUTYCYCLE_625 +*\*\ - SHRTIM_CHP_DUTYCYCLE_750 +*\*\ - SHRTIM_CHP_DUTYCYCLE_875 +**/ +uint32_t SHRTIM_CHP_GetDutyCycle(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCHOP) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCHOP_CARDCY)); +} + +/** +*\*\fun Set the start pulse width. +*\*\note This function must not be called if the chopper mode is already + * enabled for one of the timer outputs. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\param PulseWidth This parameter can be one of the following values: +*\*\ - SHRTIM_CHP_PULSEWIDTH_16 +*\*\ - SHRTIM_CHP_PULSEWIDTH_32 +*\*\ - SHRTIM_CHP_PULSEWIDTH_48 +*\*\ - SHRTIM_CHP_PULSEWIDTH_64 +*\*\ - SHRTIM_CHP_PULSEWIDTH_80 +*\*\ - SHRTIM_CHP_PULSEWIDTH_96 +*\*\ - SHRTIM_CHP_PULSEWIDTH_112 +*\*\ - SHRTIM_CHP_PULSEWIDTH_128 +*\*\ - SHRTIM_CHP_PULSEWIDTH_144 +*\*\ - SHRTIM_CHP_PULSEWIDTH_160 +*\*\ - SHRTIM_CHP_PULSEWIDTH_176 +*\*\ - SHRTIM_CHP_PULSEWIDTH_192 +*\*\ - SHRTIM_CHP_PULSEWIDTH_208 +*\*\ - SHRTIM_CHP_PULSEWIDTH_224 +*\*\ - SHRTIM_CHP_PULSEWIDTH_240 +*\*\ - SHRTIM_CHP_PULSEWIDTH_256 +*\*\return None +**/ +void SHRTIM_CHP_SetPulseWidth(SHRTIM_Module *SHRTIMx, uint32_t Timer, uint32_t PulseWidth) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCHOP) + + REG_OFFSET_TAB_TIMER[iTimer])); + MODIFY_REG(*pReg, SHRTIM_TXCHOP_STARTPW, PulseWidth); +} + +/** +*\*\fun Get actual start pulse width. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return PulseWidth This parameter can be one of the following values: +*\*\ - SHRTIM_CHP_PULSEWIDTH_16 +*\*\ - SHRTIM_CHP_PULSEWIDTH_32 +*\*\ - SHRTIM_CHP_PULSEWIDTH_48 +*\*\ - SHRTIM_CHP_PULSEWIDTH_64 +*\*\ - SHRTIM_CHP_PULSEWIDTH_80 +*\*\ - SHRTIM_CHP_PULSEWIDTH_96 +*\*\ - SHRTIM_CHP_PULSEWIDTH_112 +*\*\ - SHRTIM_CHP_PULSEWIDTH_128 +*\*\ - SHRTIM_CHP_PULSEWIDTH_144 +*\*\ - SHRTIM_CHP_PULSEWIDTH_160 +*\*\ - SHRTIM_CHP_PULSEWIDTH_176 +*\*\ - SHRTIM_CHP_PULSEWIDTH_192 +*\*\ - SHRTIM_CHP_PULSEWIDTH_208 +*\*\ - SHRTIM_CHP_PULSEWIDTH_224 +*\*\ - SHRTIM_CHP_PULSEWIDTH_240 +*\*\ - SHRTIM_CHP_PULSEWIDTH_256 +**/ +uint32_t SHRTIM_CHP_GetPulseWidth(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxCHOP) + + REG_OFFSET_TAB_TIMER[iTimer])); + return (READ_BIT(*pReg, SHRTIM_TXCHOP_STARTPW)); +} + +/** @defgroup SHRTIM_EF_Output_Management Output_Management +*\*\{ +**/ + +/** +*\*\fun Set the timer output set source. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\param SetSrc This parameter can be a combination of the following values: +*\*\ - SHRTIM_OUTPUTSET_NONE +*\*\ - SHRTIM_OUTPUTSET_RESYNC +*\*\ - SHRTIM_OUTPUTSET_TIMPRD +*\*\ - SHRTIM_OUTPUTSET_TIMCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMCMP4 +*\*\ - SHRTIM_OUTPUTSET_MASTERPER +*\*\ - SHRTIM_OUTPUTSET_MASTERCMP1 +*\*\ - SHRTIM_OUTPUTSET_MASTERCMP2 +*\*\ - SHRTIM_OUTPUTSET_MASTERCMP3 +*\*\ - SHRTIM_OUTPUTSET_MASTERCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV1_TIMACMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV2_TIMACMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV5_TIMCCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 +*\*\ - SHRTIM_OUTPUTSET_EXEV_1 +*\*\ - SHRTIM_OUTPUTSET_EXEV_2 +*\*\ - SHRTIM_OUTPUTSET_EXEV_3 +*\*\ - SHRTIM_OUTPUTSET_EXEV_4 +*\*\ - SHRTIM_OUTPUTSET_EXEV_5 +*\*\ - SHRTIM_OUTPUTSET_EXEV_6 +*\*\ - SHRTIM_OUTPUTSET_EXEV_7 +*\*\ - SHRTIM_OUTPUTSET_EXEV_8 +*\*\ - SHRTIM_OUTPUTSET_EXEV_9 +*\*\ - SHRTIM_OUTPUTSET_EXEV_10 +*\*\ - SHRTIM_OUTPUTSET_UPDATE +*\*\ (source = TIMy and destination = TIMx, Compare Unit = CMPz). +*\*\return None +**/ +void SHRTIM_OUT_SetOutputSetSrc(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t SetSrc) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxSET1) + + REG_OFFSET_TAB_TxSET[iOutput])); + WRITE_REG(*pReg, SetSrc); +} + +/** +*\*\fun Get the timer output set source. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return SetSrc This parameter can be a combination of the following values: +*\*\ - SHRTIM_OUTPUTSET_NONE +*\*\ - SHRTIM_OUTPUTSET_RESYNC +*\*\ - SHRTIM_OUTPUTSET_TIMPRD +*\*\ - SHRTIM_OUTPUTSET_TIMCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMCMP4 +*\*\ - SHRTIM_OUTPUTSET_MASTERPER +*\*\ - SHRTIM_OUTPUTSET_MASTERCMP1 +*\*\ - SHRTIM_OUTPUTSET_MASTERCMP2 +*\*\ - SHRTIM_OUTPUTSET_MASTERCMP3 +*\*\ - SHRTIM_OUTPUTSET_MASTERCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV1_TIMACMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV2_TIMACMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV5_TIMCCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 +*\*\ - SHRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 +*\*\ - SHRTIM_OUTPUTSET_EXEV_1 +*\*\ - SHRTIM_OUTPUTSET_EXEV_2 +*\*\ - SHRTIM_OUTPUTSET_EXEV_3 +*\*\ - SHRTIM_OUTPUTSET_EXEV_4 +*\*\ - SHRTIM_OUTPUTSET_EXEV_5 +*\*\ - SHRTIM_OUTPUTSET_EXEV_6 +*\*\ - SHRTIM_OUTPUTSET_EXEV_7 +*\*\ - SHRTIM_OUTPUTSET_EXEV_8 +*\*\ - SHRTIM_OUTPUTSET_EXEV_9 +*\*\ - SHRTIM_OUTPUTSET_EXEV_10 +*\*\ - SHRTIM_OUTPUTSET_UPDATE +*\*\ (source = TIMy and destination = TIMx, Compare Unit = CMPz). +**/ +uint32_t SHRTIM_OUT_GetOutputSetSrc(SHRTIM_Module *SHRTIMx, uint32_t Output) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxSET1) + + REG_OFFSET_TAB_TxSET[iOutput])); + return (uint32_t)READ_REG(*pReg); +} + +/** +*\*\fun Set the timer output reset source. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\param ResetSrc This parameter can be a combination of the following values: +*\*\ - SHRTIM_OUTPUTRESET_NONE +*\*\ - SHRTIM_OUTPUTRESET_RESYNC +*\*\ - SHRTIM_OUTPUTRESET_TIMPRD +*\*\ - SHRTIM_OUTPUTRESET_TIMCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMCMP4 +*\*\ - SHRTIM_OUTPUTRESET_MASTERPER +*\*\ - SHRTIM_OUTPUTRESET_MASTERCMP1 +*\*\ - SHRTIM_OUTPUTRESET_MASTERCMP2 +*\*\ - SHRTIM_OUTPUTRESET_MASTERCMP3 +*\*\ - SHRTIM_OUTPUTRESET_MASTERCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV1_TIMACMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV2_TIMACMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV5_TIMCCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_1 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_2 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_3 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_4 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_5 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_6 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_7 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_8 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_9 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_10 +*\*\ - SHRTIM_OUTPUTRESET_UPDATE +*\*\ (source = TIMy and destination = TIMx, Compare Unit = CMPz). +*\*\return None +**/ +void SHRTIM_OUT_SetOutputResetSrc(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t ResetSrc) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxRST1) + + REG_OFFSET_TAB_TxSET[iOutput])); + WRITE_REG(*pReg, ResetSrc); +} + +/** +*\*\fun Get the timer output set source. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return ResetSrc This parameter can be a combination of the following values: +*\*\ - SHRTIM_OUTPUTRESET_NONE +*\*\ - SHRTIM_OUTPUTRESET_RESYNC +*\*\ - SHRTIM_OUTPUTRESET_TIMPRD +*\*\ - SHRTIM_OUTPUTRESET_TIMCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMCMP4 +*\*\ - SHRTIM_OUTPUTRESET_MASTERPER +*\*\ - SHRTIM_OUTPUTRESET_MASTERCMP1 +*\*\ - SHRTIM_OUTPUTRESET_MASTERCMP2 +*\*\ - SHRTIM_OUTPUTRESET_MASTERCMP3 +*\*\ - SHRTIM_OUTPUTRESET_MASTERCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV1_TIMACMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV2_TIMACMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV5_TIMCCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 +*\*\ - SHRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_1 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_2 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_3 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_4 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_5 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_6 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_7 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_8 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_9 +*\*\ - SHRTIM_OUTPUTRESET_EXEV_10 +*\*\ - SHRTIM_OUTPUTRESET_UPDATE +*\*\ (source = TIMy and destination = TIMx, Compare Unit = CMPz). +**/ +uint32_t SHRTIM_OUT_GetOutputResetSrc(SHRTIM_Module *SHRTIMx, uint32_t Output) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxRST1) + + REG_OFFSET_TAB_TxSET[iOutput])); + return (uint32_t)READ_REG(*pReg); +} + +/** +*\*\fun Configure a timer output. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\param Configuration This parameter must be a combination of all the following values: +*\*\ - SHRTIM_OUT_POSITIVE_POLARITY or SHRTIM_OUT_NEGATIVE_POLARITY +*\*\ - SHRTIM_OUT_IDLELEVEL_INACTIVE or SHRTIM_OUT_IDLELEVEL_ACTIVE +*\*\ - SHRTIM_OUT_FAULTSTATE_NO_ACTION or SHRTIM_OUT_FAULTSTATE_ACTIVE or SHRTIM_OUT_FAULTSTATE_INACTIVE or SHRTIM_OUT_FAULTSTATE_HIGHZ +*\*\ - SHRTIM_OUT_CHOPPERMODE_DISABLED or SHRTIM_OUT_CHOPPERMODE_ENABLED +*\*\ - SHRTIM_OUT_BM_ENTRYMODE_REGULAR or SHRTIM_OUT_BM_ENTRYMODE_DELAYED +*\*\return None +**/ +void SHRTIM_OUT_Config(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t Configuration) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TxOUT[iOutput])); + MODIFY_REG(*pReg, (SHRTIM_OUT_CONFIG_MASK << REG_SHIFT_TAB_TxOUT[iOutput]), + (Configuration << REG_SHIFT_TAB_TxOUT[iOutput])); +} + +/** +*\*\fun Set the polarity of a timer output. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\param Polarity This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_POSITIVE_POLARITY +*\*\ - SHRTIM_OUT_NEGATIVE_POLARITY +*\*\return None +**/ +void SHRTIM_OUT_SetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t Polarity) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TxOUT[iOutput])); + MODIFY_REG(*pReg, (SHRTIM_TXOUT_POL1 << REG_SHIFT_TAB_TxOUT[iOutput]), (Polarity << REG_SHIFT_TAB_TxOUT[iOutput])); +} + +/** +*\*\fun Get actual polarity of the timer output. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return Polarity This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_POSITIVE_POLARITY +*\*\ - SHRTIM_OUT_NEGATIVE_POLARITY +**/ +uint32_t SHRTIM_OUT_GetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Output) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TxOUT[iOutput])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_TXOUT_POL1) << REG_SHIFT_TAB_TxOUT[iOutput]) >> REG_SHIFT_TAB_TxOUT[iOutput]); +} + +/** +*\*\fun Set the output IDLE level. +*\*\note This function must be called prior enabling the timer. +*\*\note Idle level isn't relevant when the output idle mode is set to SHRTIM_OUT_NO_IDLE. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\param IdleLevel This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_IDLELEVEL_INACTIVE +*\*\ - SHRTIM_OUT_IDLELEVEL_ACTIVE +*\*\return None +**/ +void SHRTIM_OUT_SetIdleLevel(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t IdleLevel) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TxOUT[iOutput])); + MODIFY_REG(*pReg, (SHRTIM_TXOUT_IDLES1 << REG_SHIFT_TAB_TxOUT[iOutput]), (IdleLevel << REG_SHIFT_TAB_TxOUT[iOutput])); +} + +/** +*\*\fun Get actual output IDLE level. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return IdleLevel This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_IDLELEVEL_INACTIVE +*\*\ - SHRTIM_OUT_IDLELEVEL_ACTIVE +**/ +uint32_t SHRTIM_OUT_GetIdleLevel(SHRTIM_Module *SHRTIMx, uint32_t Output) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TxOUT[iOutput])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_TXOUT_IDLES1) << REG_SHIFT_TAB_TxOUT[iOutput]) >> REG_SHIFT_TAB_TxOUT[iOutput]); +} + +/** +*\*\fun Set the output FAULT state. +*\*\note This function must not called when the timer is enabled and a fault + * channel is enabled at timer level. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\param FaultState This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_FAULTSTATE_NO_ACTION +*\*\ - SHRTIM_OUT_FAULTSTATE_ACTIVE +*\*\ - SHRTIM_OUT_FAULTSTATE_INACTIVE +*\*\ - SHRTIM_OUT_FAULTSTATE_HIGHZ +*\*\return None +**/ +void SHRTIM_OUT_SetFaultState(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t FaultState) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TxOUT[iOutput])); + MODIFY_REG(*pReg, (SHRTIM_TXOUT_FALT1 << REG_SHIFT_TAB_TxOUT[iOutput]), (FaultState << REG_SHIFT_TAB_TxOUT[iOutput])); +} + +/** +*\*\fun Get actual FAULT state. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return FaultState This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_FAULTSTATE_NO_ACTION +*\*\ - SHRTIM_OUT_FAULTSTATE_ACTIVE +*\*\ - SHRTIM_OUT_FAULTSTATE_INACTIVE +*\*\ - SHRTIM_OUT_FAULTSTATE_HIGHZ +**/ +uint32_t SHRTIM_OUT_GetFaultState(SHRTIM_Module *SHRTIMx, uint32_t Output) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TxOUT[iOutput])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_TXOUT_FALT1) << REG_SHIFT_TAB_TxOUT[iOutput]) >> REG_SHIFT_TAB_TxOUT[iOutput]); +} + +/** +*\*\fun Set the output chopper mode. +*\*\note This function must not called when the timer is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\param ChopperMode This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_CHOPPERMODE_DISABLED +*\*\ - SHRTIM_OUT_CHOPPERMODE_ENABLED +*\*\return None +**/ +void SHRTIM_OUT_SetChopperMode(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t ChopperMode) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TxOUT[iOutput])); + MODIFY_REG(*pReg, (SHRTIM_TXOUT_CHP1 << REG_SHIFT_TAB_TxOUT[iOutput]), (ChopperMode << REG_SHIFT_TAB_TxOUT[iOutput])); +} + +/** +*\*\fun Get actual output chopper mode +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return ChopperMode This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_CHOPPERMODE_DISABLED +*\*\ - SHRTIM_OUT_CHOPPERMODE_ENABLED +**/ +uint32_t SHRTIM_OUT_GetChopperMode(SHRTIM_Module *SHRTIMx, uint32_t Output) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TxOUT[iOutput])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_TXOUT_CHP1) << REG_SHIFT_TAB_TxOUT[iOutput]) >> REG_SHIFT_TAB_TxOUT[iOutput]); +} + +/** +*\*\fun Set the output burst mode entry mode. +*\*\note This function must not called when the timer is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\param BMEntryMode This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_BM_ENTRYMODE_REGULAR +*\*\ - SHRTIM_OUT_BM_ENTRYMODE_DELAYED +*\*\return None +**/ +void SHRTIM_OUT_SetBMEntryMode(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t BMEntryMode) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TxOUT[iOutput])); + MODIFY_REG(*pReg, (SHRTIM_TXOUT_DIDL1 << REG_SHIFT_TAB_TxOUT[iOutput]), (BMEntryMode << REG_SHIFT_TAB_TxOUT[iOutput])); +} + +/** +*\*\fun Get actual output burst mode entry mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return BMEntryMode This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_BM_ENTRYMODE_REGULAR +*\*\ - SHRTIM_OUT_BM_ENTRYMODE_DELAYED +**/ +uint32_t SHRTIM_OUT_GetBMEntryMode(SHRTIM_Module *SHRTIMx, uint32_t Output) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxOUT) + + REG_OFFSET_TAB_TxOUT[iOutput])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_TXOUT_DIDL1) << REG_SHIFT_TAB_TxOUT[iOutput]) >> REG_SHIFT_TAB_TxOUT[iOutput]); +} + +/** +*\*\fun Get the level (active or inactive) of the designated output when the +*\*\ delayed protection was triggered. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return OutputLevel This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_LEVEL_INACTIVE +*\*\ - SHRTIM_OUT_LEVEL_ACTIVE +**/ +uint32_t SHRTIM_OUT_GetDPOutStatus(SHRTIM_Module *SHRTIMx, uint32_t Output) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxINTSTS) + + REG_OFFSET_TAB_TxOUT[iOutput])); + return ((READ_BIT(*pReg, (uint32_t)(SHRTIM_TXINTSTS_O1DIPSTS) << REG_SHIFT_TAB_OxSTS[iOutput]) >> REG_SHIFT_TAB_OxSTS[iOutput]) >> + SHRTIM_TXINTSTS_O1DIPSTS_Pos); +} + +/** +*\*\fun Force the timer output to its active or inactive level. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\param OutputLevel This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_LEVEL_INACTIVE +*\*\ - SHRTIM_OUT_LEVEL_ACTIVE +*\*\return None +**/ +void SHRTIM_OUT_ForceLevel(SHRTIM_Module *SHRTIMx, uint32_t Output, uint32_t OutputLevel) +{ + const uint8_t REG_OFFSET_TAB_OUT_LEVEL[] = + { + 0x04U, /* 0: SHRTIM_OUT_LEVEL_INACTIVE**/ + 0x00U /* 1: SHRTIM_OUT_LEVEL_ACTIVE**/ + }; + + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxSET1) + + REG_OFFSET_TAB_TxSET[iOutput] + REG_OFFSET_TAB_OUT_LEVEL[OutputLevel])); + SET_BIT(*pReg, SHRTIM_TXSET1_SWT); +} + +/** +*\*\fun Get actual output level, before the output stage (chopper, polarity). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Output This parameter can be one of the following values: +*\*\ - SHRTIM_OUTPUT_TA1 +*\*\ - SHRTIM_OUTPUT_TA2 +*\*\ - SHRTIM_OUTPUT_TB1 +*\*\ - SHRTIM_OUTPUT_TB2 +*\*\ - SHRTIM_OUTPUT_TC1 +*\*\ - SHRTIM_OUTPUT_TC2 +*\*\ - SHRTIM_OUTPUT_TD1 +*\*\ - SHRTIM_OUTPUT_TD2 +*\*\ - SHRTIM_OUTPUT_TE1 +*\*\ - SHRTIM_OUTPUT_TE2 +*\*\ - SHRTIM_OUTPUT_TF1 +*\*\ - SHRTIM_OUTPUT_TF2 +*\*\return OutputLevel This parameter can be one of the following values: +*\*\ - SHRTIM_OUT_LEVEL_INACTIVE +*\*\ - SHRTIM_OUT_LEVEL_ACTIVE +**/ +uint32_t SHRTIM_OUT_GetLevel(SHRTIM_Module *SHRTIMx, uint32_t Output) +{ + uint32_t iOutput = (uint8_t)(POSITION_VAL(Output) - POSITION_VAL(SHRTIM_OUTPUT_TA1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxINTSTS) + + REG_OFFSET_TAB_TxOUT[iOutput])); + return ((READ_BIT(*pReg, (uint32_t)(SHRTIM_TXINTSTS_O1BCKUP) << REG_SHIFT_TAB_OxSTS[iOutput]) >> REG_SHIFT_TAB_OxSTS[iOutput]) >> + SHRTIM_TXINTSTS_O1BCKUP_Pos); +} + + +/** +*\*\fun Configure external event conditioning. +*\*\note This function must not be called when the timer counter is enabled. +*\*\note Event source (EXEVxSRC0..EXEVxSRC10) mapping depends on configured event channel. +*\*\note Fast mode is available for SHRTIM_EVENT_1..10. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\param Src This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_SOURCE_1 +*\*\ - SHRTIM_EXEV_SOURCE_2 +*\*\ - SHRTIM_EXEV_SOURCE_3 +*\*\ - SHRTIM_EXEV_SOURCE_4 +*\*\ - SHRTIM_EXEV_SOURCE_5 +*\*\param SrcCompSel This parameter can be one of the following values: +*\*\ - SHRTIM_EXEVXSRC2_COMP1_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP2_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP3_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP4_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP5_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP6_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP7_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP_NONE +*\*\param Polarity This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_POLARITY_HIGH +*\*\ - SHRTIM_EXEV_POLARITY_LOW +*\*\param Sensitivity This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_SENSITIVITY_LEVEL +*\*\ - SHRTIM_EXEV_SENSITIVITY_RISINGEDGE +*\*\ - SHRTIM_EXEV_SENSITIVITY_FALLINGEDGE +*\*\ - SHRTIM_EXEV_SENSITIVITY_BOTHEDGES +*\*\param FastMode This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_FASTMODE_DISABLE +*\*\ - SHRTIM_EXEV_FASTMODE_ENABLE +*\*\param Filter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_FILTER_NONE +*\*\ - SHRTIM_EXEV_FILTER_1 +*\*\ - SHRTIM_EXEV_FILTER_2 +*\*\ - SHRTIM_EXEV_FILTER_3 +*\*\ - SHRTIM_EXEV_FILTER_4 +*\*\ - SHRTIM_EXEV_FILTER_5 +*\*\ - SHRTIM_EXEV_FILTER_6 +*\*\ - SHRTIM_EXEV_FILTER_7 +*\*\ - SHRTIM_EXEV_FILTER_8 +*\*\ - SHRTIM_EXEV_FILTER_9 +*\*\ - SHRTIM_EXEV_FILTER_10 +*\*\ - SHRTIM_EXEV_FILTER_11 +*\*\ - SHRTIM_EXEV_FILTER_12 +*\*\ - SHRTIM_EXEV_FILTER_13 +*\*\ - SHRTIM_EXEV_FILTER_14 +*\*\ - SHRTIM_EXEV_FILTER_15 +*\*\param Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_PRESCALER_DIV1 +*\*\ - SHRTIM_EXEV_PRESCALER_DIV2 +*\*\ - SHRTIM_EXEV_PRESCALER_DIV4 +*\*\ - SHRTIM_EXEV_PRESCALER_DIV8 +*\*\return None +*\*\note Polarity configuration is only valid if sensitivity is SHRTIM_EXEV_SENSITIVITY_LEVEL +**/ +void SHRTIM_EXEV_Config(SHRTIM_Module *SHRTIMx, uint32_t Event, + uint32_t Src, uint32_t SrcCompSel, uint32_t Polarity, + uint32_t Sensitivity, uint32_t FastMode, + uint32_t Filter, uint32_t Prescaler) +{ + SHRTIM_EXEV_SetSrc(SHRTIMx, Event, Src); + SHRTIM_EXEV_SetSrcCompSel(SHRTIMx, Event, SrcCompSel); + SHRTIM_EXEV_SetPolarity(SHRTIMx, Event, Polarity); + SHRTIM_EXEV_SetSensitivity(SHRTIMx, Event, Sensitivity); + SHRTIM_EXEV_SetFastMode(SHRTIMx, Event, FastMode); + SHRTIM_EXEV_SetFilter(SHRTIMx, Event, Filter); + SHRTIM_EXEV_SetPrescaler(SHRTIMx, Prescaler); +} + +/** +*\*\fun Set the external event source. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\param Src This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_SOURCE_1 +*\*\ - SHRTIM_EXEV_SOURCE_2 +*\*\ - SHRTIM_EXEV_SOURCE_3 +*\*\ - SHRTIM_EXEV_SOURCE_4 +*\*\ - SHRTIM_EXEV_SOURCE_5 +*\*\return None +**/ +void SHRTIM_EXEV_SetSrc(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t Src) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL1) + + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + MODIFY_REG(*pReg, (SHRTIM_EXEVCTRL1_EXEV1SRC << REG_SHIFT_TAB_EXEVx[iEvent]), (Src << REG_SHIFT_TAB_EXEVx[iEvent])); +} + +/** +*\*\fun Get actual external event source. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\return EventSrc This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_SOURCE_1 +*\*\ - SHRTIM_EXEV_SOURCE_2 +*\*\ - SHRTIM_EXEV_SOURCE_3 +*\*\ - SHRTIM_EXEV_SOURCE_4 +*\*\ - SHRTIM_EXEV_SOURCE_5 +**/ +uint32_t SHRTIM_EXEV_GetSrc(SHRTIM_Module *SHRTIMx, uint32_t Event) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL1) + + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_EXEVCTRL1_EXEV1SRC) << REG_SHIFT_TAB_EXEVx[iEvent]) >> REG_SHIFT_TAB_EXEVx[iEvent]); +} + +/** +*\*\fun Select the analog comparator of SHRTIM_EXEV_SOURCE_2. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\param SrcCompSel This parameter can be one of the following values: +*\*\ - SHRTIM_EXEVXSRC2_COMP1_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP2_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP3_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP4_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP5_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP6_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP7_OUT +*\*\ - SHRTIM_EXEVXSRC2_COMP_NONE +*\*\return None +**/ +void SHRTIM_EXEV_SetSrcCompSel(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t SrcCompSel) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL5)); + MODIFY_REG(*pReg, (SHRTIM_EXEVCTRL5_EXEV1CSEL << REG_SHIFT_TAB_EXEVxCSEL[iEvent]), (SrcCompSel << REG_SHIFT_TAB_EXEVxCSEL[iEvent])); +} + +/** +*\*\fun Get the the selection of analog comparator of external event source. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\return SrcCompSel This parameter can be one of the following values: +*\*\ - 3'b000: cmp1 out +*\*\ - 3'b001: cmp2 out +*\*\ - 3'b010: cmp3 out +*\*\ - 3'b011: cmp4 out +*\*\ - 3'b100: cmp5 out +*\*\ - 3'b101: cmp6 out +*\*\ - 3'b110: cmp7 out +**/ +uint32_t SHRTIM_EXEV_GetSrcCompSel(SHRTIM_Module *SHRTIMx, uint32_t Event) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL5)); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_EXEVCTRL5_EXEV1CSEL) << REG_SHIFT_TAB_EXEVxCSEL[iEvent]) >> REG_SHIFT_TAB_EXEVxCSEL[iEvent]); +} + +/** +*\*\fun Set the polarity of an external event. +*\*\note This function must not be called when the timer counter is enabled. +*\*\note Event polarity is only significant when event detection is level-sensitive. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\param Polarity This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_POLARITY_HIGH +*\*\ - SHRTIM_EXEV_POLARITY_LOW +*\*\return None +**/ +void SHRTIM_EXEV_SetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t Polarity) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL1) + + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + MODIFY_REG(*pReg, (SHRTIM_EXEVCTRL1_EXEV1POL << REG_SHIFT_TAB_EXEVx[iEvent]), (Polarity << REG_SHIFT_TAB_EXEVx[iEvent])); +} + +/** +*\*\fun Get actual polarity setting of an external event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\return Polarity This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_POLARITY_HIGH +*\*\ - SHRTIM_EXEV_POLARITY_LOW +**/ +uint32_t SHRTIM_EXEV_GetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Event) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL1) + + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_EXEVCTRL1_EXEV1POL) << REG_SHIFT_TAB_EXEVx[iEvent]) >> REG_SHIFT_TAB_EXEVx[iEvent]); +} + +/** +*\*\fun Set the sensitivity of an external event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\param Sensitivity This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_SENSITIVITY_LEVEL +*\*\ - SHRTIM_EXEV_SENSITIVITY_RISINGEDGE +*\*\ - SHRTIM_EXEV_SENSITIVITY_FALLINGEDGE +*\*\ - SHRTIM_EXEV_SENSITIVITY_BOTHEDGES +*\*\return None +**/ + +void SHRTIM_EXEV_SetSensitivity(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t Sensitivity) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL1) + + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + MODIFY_REG(*pReg, (SHRTIM_EXEVCTRL1_EXEV1SENS << REG_SHIFT_TAB_EXEVx[iEvent]), (Sensitivity << REG_SHIFT_TAB_EXEVx[iEvent])); +} + +/** +*\*\fun Get actual sensitivity setting of an external event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\return Polarity This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_SENSITIVITY_LEVEL +*\*\ - SHRTIM_EXEV_SENSITIVITY_RISINGEDGE +*\*\ - SHRTIM_EXEV_SENSITIVITY_FALLINGEDGE +*\*\ - SHRTIM_EXEV_SENSITIVITY_BOTHEDGES +**/ +uint32_t SHRTIM_EXEV_GetSensitivity(SHRTIM_Module *SHRTIMx, uint32_t Event) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL1) + + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_EXEVCTRL1_EXEV1SENS) << REG_SHIFT_TAB_EXEVx[iEvent]) >> REG_SHIFT_TAB_EXEVx[iEvent]); +} + +/** +*\*\fun Set the fast mode of an external event. +*\*\note This function must not be called when the timer counter is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\param FastMode This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_FASTMODE_DISABLE +*\*\ - SHRTIM_EXEV_FASTMODE_ENABLE +*\*\return None +**/ +void SHRTIM_EXEV_SetFastMode(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t FastMode) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL3) + + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + MODIFY_REG(*pReg, (SHRTIM_EXEVCTRL3_EXEV1FM << REG_SHIFT_TAB_EXEVx[iEvent]), (FastMode << REG_SHIFT_TAB_EXEVx[iEvent])); +} + +/** +*\*\fun Get actual fast mode setting of an external event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\return FastMode This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_FASTMODE_DISABLE +*\*\ - SHRTIM_EXEV_FASTMODE_ENABLE +**/ +uint32_t SHRTIM_EXEV_GetFastMode(SHRTIM_Module *SHRTIMx, uint32_t Event) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL3) + + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_EXEVCTRL3_EXEV1FM) << REG_SHIFT_TAB_EXEVx[iEvent]) >> REG_SHIFT_TAB_EXEVx[iEvent]); +} + +/** +*\*\fun Set the digital noise filter of a external event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\param Filter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_FILTER_NONE +*\*\ - SHRTIM_EXEV_FILTER_1 +*\*\ - SHRTIM_EXEV_FILTER_2 +*\*\ - SHRTIM_EXEV_FILTER_3 +*\*\ - SHRTIM_EXEV_FILTER_4 +*\*\ - SHRTIM_EXEV_FILTER_5 +*\*\ - SHRTIM_EXEV_FILTER_6 +*\*\ - SHRTIM_EXEV_FILTER_7 +*\*\ - SHRTIM_EXEV_FILTER_8 +*\*\ - SHRTIM_EXEV_FILTER_9 +*\*\ - SHRTIM_EXEV_FILTER_10 +*\*\ - SHRTIM_EXEV_FILTER_11 +*\*\ - SHRTIM_EXEV_FILTER_12 +*\*\ - SHRTIM_EXEV_FILTER_13 +*\*\ - SHRTIM_EXEV_FILTER_14 +*\*\ - SHRTIM_EXEV_FILTER_15 +*\*\return None +**/ +void SHRTIM_EXEV_SetFilter(SHRTIM_Module *SHRTIMx, uint32_t Event, uint32_t Filter) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL3) + + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + MODIFY_REG(*pReg, (SHRTIM_EXEVCTRL3_EXEV1F << REG_SHIFT_TAB_EXEVx[iEvent]), (Filter << REG_SHIFT_TAB_EXEVx[iEvent])); +} + +/** +*\*\fun Get actual digital noise filter setting of a external event. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Event This parameter can be one of the following values: +*\*\ - SHRTIM_EVENT_1 +*\*\ - SHRTIM_EVENT_2 +*\*\ - SHRTIM_EVENT_3 +*\*\ - SHRTIM_EVENT_4 +*\*\ - SHRTIM_EVENT_5 +*\*\ - SHRTIM_EVENT_6 +*\*\ - SHRTIM_EVENT_7 +*\*\ - SHRTIM_EVENT_8 +*\*\ - SHRTIM_EVENT_9 +*\*\ - SHRTIM_EVENT_10 +*\*\return Filter This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_FILTER_NONE +*\*\ - SHRTIM_EXEV_FILTER_1 +*\*\ - SHRTIM_EXEV_FILTER_2 +*\*\ - SHRTIM_EXEV_FILTER_3 +*\*\ - SHRTIM_EXEV_FILTER_4 +*\*\ - SHRTIM_EXEV_FILTER_5 +*\*\ - SHRTIM_EXEV_FILTER_6 +*\*\ - SHRTIM_EXEV_FILTER_7 +*\*\ - SHRTIM_EXEV_FILTER_8 +*\*\ - SHRTIM_EXEV_FILTER_9 +*\*\ - SHRTIM_EXEV_FILTER_10 +*\*\ - SHRTIM_EXEV_FILTER_11 +*\*\ - SHRTIM_EXEV_FILTER_12 +*\*\ - SHRTIM_EXEV_FILTER_13 +*\*\ - SHRTIM_EXEV_FILTER_14 +*\*\ - SHRTIM_EXEV_FILTER_15 +**/ +uint32_t SHRTIM_EXEV_GetFilter(SHRTIM_Module *SHRTIMx, uint32_t Event) +{ + uint32_t iEvent = (uint8_t)(POSITION_VAL(Event) - POSITION_VAL(SHRTIM_EVENT_1)); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.EXEVCTRL3) + + REG_OFFSET_TAB_EXEVCTRL[iEvent])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_EXEVCTRL3_EXEV1F) << REG_SHIFT_TAB_EXEVx[iEvent]) >> REG_SHIFT_TAB_EXEVx[iEvent]); +} + +/** +*\*\fun Set the external event prescaler. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_PRESCALER_DIV1 +*\*\ - SHRTIM_EXEV_PRESCALER_DIV2 +*\*\ - SHRTIM_EXEV_PRESCALER_DIV4 +*\*\ - SHRTIM_EXEV_PRESCALER_DIV8 +*\*\return None +**/ +void SHRTIM_EXEV_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Prescaler) +{ + MODIFY_REG(SHRTIMx->sCommonRegs.EXEVCTRL4, SHRTIM_EXEVCTRL4_EXEVSCD, Prescaler); +} + +/** +*\*\fun Get actual external event prescaler setting. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_EXEV_PRESCALER_DIV1 +*\*\ - SHRTIM_EXEV_PRESCALER_DIV2 +*\*\ - SHRTIM_EXEV_PRESCALER_DIV4 +*\*\ - SHRTIM_EXEV_PRESCALER_DIV8 +**/ + +uint32_t SHRTIM_EXEV_GetPrescaler(SHRTIM_Module *SHRTIMx) +{ + return (READ_BIT(SHRTIMx->sCommonRegs.EXEVCTRL4, SHRTIM_EXEVCTRL4_EXEVSCD)); +} + +/** +*\*\fun Configure fault signal conditioning Polarity and Source. +*\*\note This function must not be called when the fault channel is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\param Configuration This parameter must be a combination of all the following values: +*\*\ - SHRTIM_FALT_SRC_DIGITALINPUT..SHRTIM_FALT_SRC_INTERNAL..SHRTIM_FALT_SRC_EXEVINPUT..SHRTIM_FALT_SRC_DSMU +*\*\ - SHRTIM_FALT_POLARITY_LOW..SHRTIM_FALT_POLARITY_HIGH +*\*\param SrcCompSel This parameter can be one of the following values: +*\*\ - SHRTIM_FALTXSRC2_COMP1_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP2_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP3_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP4_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP5_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP6_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP7_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP_NONE +*\*\return None +**/ +void SHRTIM_FALT_Config(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Configuration, uint32_t SrcCompSel) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg1 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN1))); + __IO uint32_t *pReg2 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN2))); + + uint64_t cfg; + uint64_t mask; + + cfg = ((uint64_t)((uint64_t)Configuration & (uint64_t)SHRTIM_FALT_CONFIG_MASK) << REG_SHIFT_TAB_FALTxF[iFault]) | /* this for Source 0 and polarity bits */ + (((uint64_t)((uint64_t)Configuration & (uint64_t)SHRTIM_FALT_SRC_1_MASK) << REG_SHIFT_TAB_FALTx[iFault]) << 32U); /* this for Source 1 bit**/ + + mask = ((uint64_t)(SHRTIM_FALTIN1_FALT1POL | SHRTIM_FALTIN1_FALT1SRC0) << REG_SHIFT_TAB_FALTxF[iFault]) | /* this for Source 0 and polarity bits */ + ((uint64_t)(SHRTIM_FALT_SRC_1_MASK) << 32U); /* this for Source bit 1 */ + + MODIFY_REG(*pReg1, (uint32_t)(mask), (uint32_t)(cfg)); + MODIFY_REG(*pReg2, (uint32_t)(mask >> 32U), (uint32_t)(cfg >> 32U)); + + SHRTIM_FALT_SetSrcCompSel(SHRTIMx, Fault, SrcCompSel); +} + +/** +*\*\fun Set the source of a fault signal. +*\*\note This function must not be called when the fault channel is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\param Src This parameter can be one of the following values: +*\*\ - SHRTIM_FALT_SRC_DIGITALINPUT +*\*\ - SHRTIM_FALT_SRC_INTERNAL +*\*\ - SHRTIM_FALT_SRC_EXEVINPUT +*\*\ - SHRTIM_FALT_SRC_DSMU +*\*\return None +**/ +void SHRTIM_FALT_SetSrc(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Src) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg1 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN1))); + __IO uint32_t *pReg2 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN2))); + + uint64_t cfg = ((uint64_t)((uint64_t)Src & (uint64_t)SHRTIM_FALTIN1_FALT1SRC0) << REG_SHIFT_TAB_FALTxF[iFault]) | /* this for Source 0 bit */ + (((uint64_t)((uint64_t)Src & (uint64_t)SHRTIM_FALT_SRC_1_MASK) << REG_SHIFT_TAB_FALTx[iFault]) << 32U); /* this for Source 1 bit */ + uint64_t mask = ((uint64_t)(SHRTIM_FALTIN1_FALT1SRC0) << REG_SHIFT_TAB_FALTxF[iFault]) | /* this for Source bit 0 */ + (((uint64_t)(SHRTIM_FALTIN2_FALT1SRC1) << REG_SHIFT_TAB_FALTx[iFault]) << 32U); /* this for Source bit 1 */ + + MODIFY_REG(*pReg1, (uint32_t)(mask), (uint32_t)(cfg)); + MODIFY_REG(*pReg2, (uint32_t)(mask >> 32U), (uint32_t)(cfg >> 32U)); +} + +/** +*\*\fun Get actual source of a fault signal. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return Source This parameter can be one of the following values: +*\*\ - SHRTIM_FALT_SRC_DIGITALINPUT +*\*\ - SHRTIM_FALT_SRC_INTERNAL +*\*\ - SHRTIM_FALT_SRC_EXEVINPUT +*\*\ - SHRTIM_FALT_SRC_DSMU +**/ +uint32_t SHRTIM_FALT_GetSrc(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg1 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN1))); + __IO uint32_t *pReg2 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN2))); + + uint64_t Src0; + uint32_t Src1; + uint32_t temp1, temp2; /* temp variables used for MINTSTSA-C **/ + + /* this for Source bit 1 */ + Src1 = READ_BIT(*pReg2, SHRTIM_FALT_SRC_1_MASK) >> REG_SHIFT_TAB_FALTx[iFault]; + temp1 = READ_BIT(*pReg2, (uint32_t)(SHRTIM_FALTIN2_FALT5SRC0 | SHRTIM_FALTIN2_FALT6SRC0)); + temp2 = READ_BIT(*pReg1, (uint32_t)(SHRTIM_FALTIN1_FALT1SRC0 | SHRTIM_FALTIN1_FALT2SRC0 | SHRTIM_FALTIN1_FALT3SRC0 | SHRTIM_FALTIN1_FALT4SRC0)); + + /* this for Source bit 0 */ + Src0 = (uint64_t)temp1 << 32U; + Src0 |= (uint64_t)temp2; + Src0 = (Src0 >> REG_SHIFT_TAB_FALTxF[iFault]); + + return ((uint32_t)(Src0 | Src1)); +} + +/** +*\*\fun Select the analog comparator of fault source 2. +*\*\note This function must not be called when the fault channel is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\param SrcCompSel This parameter can be one of the following values: +*\*\ - SHRTIM_FALTXSRC2_COMP1_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP2_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP3_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP4_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP5_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP6_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP7_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP_NONE +**/ +void SHRTIM_FALT_SetSrcCompSel(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t SrcCompSel) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN5)); + MODIFY_REG(*pReg, (SHRTIM_FALTIN5_FALT1CSEL << REG_SHIFT_TAB_FALTxCSEL[iFault]), (SrcCompSel << REG_SHIFT_TAB_FALTxCSEL[iFault])); +} + +/** +*\*\fun Get the selection the analog comparator of fault source 2. +*\*\note This function must not be called when the fault channel is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return SrcCompSel This parameter can be one of the following values: +*\*\ - SHRTIM_FALTXSRC2_COMP1_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP2_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP3_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP4_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP5_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP6_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP7_OUT +*\*\ - SHRTIM_FALTXSRC2_COMP_NONE +**/ +uint32_t SHRTIM_FALT_GetSrcCompSel(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN5)); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_FALTIN5_FALT1CSEL) << REG_SHIFT_TAB_FALTxCSEL[iFault]) >> REG_SHIFT_TAB_FALTxCSEL[iFault]); +} + +/** +*\*\fun Set the polarity of a fault signal. +*\*\note This function must not be called when the fault channel is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\param Polarity This parameter can be one of the following values: +*\*\ - SHRTIM_FALT_POLARITY_LOW +*\*\ - SHRTIM_FALT_POLARITY_HIGH +*\*\return None +**/ +void SHRTIM_FALT_SetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Polarity) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg1 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN1))); + __IO uint32_t *pReg2 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN2))); + + uint64_t cfg = (uint64_t)((uint64_t)Polarity & (uint64_t)(SHRTIM_FALTIN1_FALT1POL)) << REG_SHIFT_TAB_FALTxF[iFault]; /* this for Polarity bit */ + uint64_t mask = (uint64_t)(SHRTIM_FALTIN1_FALT1POL) << REG_SHIFT_TAB_FALTxF[iFault]; /* this for Polarity bit */ + + /* for Polarity bit */ + MODIFY_REG(*pReg1, (uint32_t)(mask), (uint32_t)(cfg)); + MODIFY_REG(*pReg2, (uint32_t)(mask >> 32U), (uint32_t)(cfg >> 32U)); +} + +/** +*\*\fun Get actual polarity of a fault signal. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return Polarity This parameter can be one of the following values: +*\*\ - SHRTIM_FALT_POLARITY_LOW +*\*\ - SHRTIM_FALT_POLARITY_HIGH +**/ +uint32_t SHRTIM_FALT_GetPolarity(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg1 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN1))); + __IO uint32_t *pReg2 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN2))); + uint32_t temp1, temp2; /* temp variables used for MINTSTSA-C**/ + uint64_t cfg; + + temp1 = READ_BIT(*pReg2, (uint32_t)(SHRTIM_FALTIN2_FALT5POL | SHRTIM_FALTIN2_FALT6POL)); + temp2 = READ_BIT(*pReg1, (uint32_t)(SHRTIM_FALTIN1_FALT1POL | SHRTIM_FALTIN1_FALT2POL | SHRTIM_FALTIN1_FALT3POL | SHRTIM_FALTIN1_FALT4POL)); + + cfg = (uint64_t)temp1 << 32; + cfg |= (uint64_t)temp2; + cfg = (cfg >> REG_SHIFT_TAB_FALTxF[iFault]); + + return (uint32_t)(cfg); +} + +/** +*\*\fun Set the digital noise filter of a fault signal. +*\*\note This function must not be called when the fault channel is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\param Filter This parameter can be one of the following values: +*\*\ - SHRTIM_FALT_FILTER_NONE +*\*\ - SHRTIM_FALT_FILTER_1 +*\*\ - SHRTIM_FALT_FILTER_2 +*\*\ - SHRTIM_FALT_FILTER_3 +*\*\ - SHRTIM_FALT_FILTER_4 +*\*\ - SHRTIM_FALT_FILTER_5 +*\*\ - SHRTIM_FALT_FILTER_6 +*\*\ - SHRTIM_FALT_FILTER_7 +*\*\ - SHRTIM_FALT_FILTER_8 +*\*\ - SHRTIM_FALT_FILTER_9 +*\*\ - SHRTIM_FALT_FILTER_10 +*\*\ - SHRTIM_FALT_FILTER_11 +*\*\ - SHRTIM_FALT_FILTER_12 +*\*\ - SHRTIM_FALT_FILTER_13 +*\*\ - SHRTIM_FALT_FILTER_14 +*\*\ - SHRTIM_FALT_FILTER_15 +*\*\return None +**/ +void SHRTIM_FALT_SetFilter(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Filter) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg1 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN1))); + __IO uint32_t *pReg2 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN2))); + + uint64_t flt = (uint64_t)((uint64_t)Filter & (uint64_t)SHRTIM_FALTIN1_FALT1FLT) << REG_SHIFT_TAB_FALTxF[iFault]; /* this for filter bits */ + uint64_t mask = (uint64_t)(SHRTIM_FALTIN1_FALT1FLT) << REG_SHIFT_TAB_FALTxF[iFault]; /* this for Polarity bit */ + + MODIFY_REG(*pReg1, (uint32_t)(mask), (uint32_t)(flt)); + MODIFY_REG(*pReg2, (uint32_t)(mask >> 32U), (uint32_t)(flt >> 32U)); +} + +/** +*\*\fun Get actual digital noise filter setting of a fault signal. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return Filter This parameter can be one of the following values: +*\*\ - SHRTIM_FALT_FILTER_NONE +*\*\ - SHRTIM_FALT_FILTER_1 +*\*\ - SHRTIM_FALT_FILTER_2 +*\*\ - SHRTIM_FALT_FILTER_3 +*\*\ - SHRTIM_FALT_FILTER_4 +*\*\ - SHRTIM_FALT_FILTER_5 +*\*\ - SHRTIM_FALT_FILTER_6 +*\*\ - SHRTIM_FALT_FILTER_7 +*\*\ - SHRTIM_FALT_FILTER_8 +*\*\ - SHRTIM_FALT_FILTER_9 +*\*\ - SHRTIM_FALT_FILTER_10 +*\*\ - SHRTIM_FALT_FILTER_11 +*\*\ - SHRTIM_FALT_FILTER_12 +*\*\ - SHRTIM_FALT_FILTER_13 +*\*\ - SHRTIM_FALT_FILTER_14 +*\*\ - SHRTIM_FALT_FILTER_15 +**/ +uint32_t SHRTIM_FALT_GetFilter(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg1 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN1))); + __IO uint32_t *pReg2 = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN2))); + uint32_t temp1, temp2; /* temp variables used for MINTSTSA-C**/ + uint64_t flt; + temp1 = READ_BIT(*pReg2, (uint32_t)(SHRTIM_FALTIN2_FALT5FLT | SHRTIM_FALTIN2_FALT6FLT)); + temp2 = READ_BIT(*pReg1, (uint32_t)(SHRTIM_FALTIN1_FALT1FLT | SHRTIM_FALTIN1_FALT2FLT | SHRTIM_FALTIN1_FALT3FLT | SHRTIM_FALTIN1_FALT4FLT)); + + flt = (uint64_t)temp1 << 32U; + flt |= (uint64_t)temp2; + flt = (flt >> REG_SHIFT_TAB_FALTxF[iFault]); + + return (uint32_t)(flt); +} + +/** +*\*\fun Set the fault circuitry prescaler. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_FALT_PRESCALER_DIV1 +*\*\ - SHRTIM_FALT_PRESCALER_DIV2 +*\*\ - SHRTIM_FALT_PRESCALER_DIV4 +*\*\ - SHRTIM_FALT_PRESCALER_DIV8 +*\*\return None +**/ +void SHRTIM_FALT_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Prescaler) +{ + MODIFY_REG(SHRTIMx->sCommonRegs.FALTIN2, SHRTIM_FALTIN2_FALTSCD, Prescaler); +} + +/** +*\*\fun Get actual fault circuitry prescaler setting. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_FALT_PRESCALER_DIV1 +*\*\ - SHRTIM_FALT_PRESCALER_DIV2 +*\*\ - SHRTIM_FALT_PRESCALER_DIV4 +*\*\ - SHRTIM_FALT_PRESCALER_DIV8 +**/ +uint32_t SHRTIM_FALT_GetPrescaler(SHRTIM_Module *SHRTIMx) +{ + return (READ_BIT(SHRTIMx->sCommonRegs.FALTIN2, SHRTIM_FALTIN2_FALTSCD)); +} + +/** +*\*\fun Lock the fault signal conditioning settings. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return None +**/ +void SHRTIM_FALT_Lock(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN1) + + REG_OFFSET_TAB_FALTIN[iFault])); + SET_BIT(*pReg, (SHRTIM_FALTIN1_FALT1LCK << REG_SHIFT_TAB_FALTxE[iFault])); +} + +/** +*\*\fun Enable the fault circuitry for the designated fault input. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return None +**/ +void SHRTIM_FALT_Enable(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN1) + + REG_OFFSET_TAB_FALTIN[iFault])); + SET_BIT(*pReg, (SHRTIM_FALTIN1_FALT1E << REG_SHIFT_TAB_FALTxE[iFault])); +} + +/** +*\*\fun Disable the fault circuitry for for the designated fault input. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return None +**/ +void SHRTIM_FALT_Disable(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN1) + + REG_OFFSET_TAB_FALTIN[iFault])); + CLEAR_BIT(*pReg, (SHRTIM_FALTIN1_FALT1E << REG_SHIFT_TAB_FALTxE[iFault])); +} + +/** +*\*\fun Indicate whether the fault circuitry is enabled for a given fault input. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return State of FALTxE bit in SHRTIM_FALTINx register (1 or 0). +**/ +uint32_t SHRTIM_FALT_IsEnabled(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN1) + + REG_OFFSET_TAB_FALTIN[iFault])); + return (((READ_BIT(*pReg, (SHRTIM_FALTIN1_FALT1E << REG_SHIFT_TAB_FALTxE[iFault])) >> REG_SHIFT_TAB_FALTxE[iFault]) == + (SHRTIM_FALTIN1_FALT1E)) + ? 1UL + : 0UL); +} + +/** +*\*\fun Enable the system fault +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param SysFault This parameter can be one of the following values: +*\*\ - SHRTIM_SYSTEM_FAULT_SHRPLLLOCKFAULT +*\*\ - SHRTIM_SYSTEM_FAULT_PVD +*\*\ - SHRTIM_SYSTEM_FAULT_LOCKUP +*\*\ - SHRTIM_SYSTEM_FAULT_SRAMPARITY +*\*\ - SHRTIM_SYSTEM_FAULT_SRAMECC +*\*\ - SHRTIM_SYSTEM_FAULT_CLOCKSECURITY +*\*\return None +**/ +void SHRTIM_FALT_EnableSysFault(SHRTIM_Module *SHRTIMx, uint32_t SysFault) +{ + SET_BIT(SHRTIMx->sCommonRegs.FALTIN2, SysFault); +} + +/** +*\*\fun Indicate whether the system fault is enabled for a given system fault. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param SysFault This parameter can be one of the following values: +*\*\ - SHRTIM_SYSTEM_FAULT_SHRPLLLOCKFAULT +*\*\ - SHRTIM_SYSTEM_FAULT_PVD +*\*\ - SHRTIM_SYSTEM_FAULT_LOCKUP +*\*\ - SHRTIM_SYSTEM_FAULT_SRAMPARITY +*\*\ - SHRTIM_SYSTEM_FAULT_SRAMECC +*\*\ - SHRTIM_SYSTEM_FAULT_CLOCKSECURITY +*\*\return State of system fault enable in SHRTIM_FALTIN2 register +**/ +uint32_t SHRTIM_FALT_IsEnabledSysFault(SHRTIM_Module *SHRTIMx, uint32_t SysFault) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.FALTIN2, SysFault) == (SysFault)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the Blanking of the fault circuitry for the designated fault input. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return None +**/ +void SHRTIM_FALT_EnableBlanking(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN3) + + REG_OFFSET_TAB_FALTIN[iFault])); + SET_BIT(*pReg, (uint32_t)(SHRTIM_FALTIN3_FALT1BLKEN) << REG_SHIFT_TAB_FALTxE[iFault]); +} + +/** +*\*\fun Disable the Blanking of the fault circuitry for the designated fault input. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return None +**/ +void SHRTIM_FALT_DisableBlanking(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN3) + + REG_OFFSET_TAB_FALTIN[iFault])); + CLEAR_BIT(*pReg, (SHRTIM_FALTIN3_FALT1BLKEN << REG_SHIFT_TAB_FALTxE[iFault])); +} + +/** +*\*\fun Indicate whether the Blanking of the fault circuitry is enabled for a given fault input. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return State of FALTxBLKEN bit in SHRTIM_FALTINx register (1 or 0). +**/ +uint32_t SHRTIM_FALT_IsEnabledBlanking(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN3) + + REG_OFFSET_TAB_FALTIN[iFault])); + uint32_t temp; /* MINTSTSAC-2012 compliance */ + temp = READ_BIT(*pReg, (uint32_t)(SHRTIM_FALTIN3_FALT1BLKEN) << REG_SHIFT_TAB_FALTxE[iFault]) >> REG_SHIFT_TAB_FALTxE[iFault]; + + return ((temp == (SHRTIM_FALTIN3_FALT1BLKEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Set the Blanking Source of the fault circuitry for a given fault input. +*\*\note Fault inputs can be temporary disabled to blank spurious fault events. +*\*\note This function allows for selection amongst 2 possible blanking sources. +*\*\note Events triggering blanking window start and blanking window end depend + * on both the selected blanking source and the fault input. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\param Source parameter can be one of the following values: +*\*\ - SHRTIM_FALT_BLANKING_RSTALIGNED +*\*\ - SHRTIM_FALT_BLANKING_MOVING +*\*\return None +**/ +void SHRTIM_FALT_SetBlankingSrc(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Source) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN3) + + REG_OFFSET_TAB_FALTIN[iFault])); + MODIFY_REG(*pReg, (SHRTIM_FALTIN3_FALT1BLKS << REG_SHIFT_TAB_FALTxE[iFault]), (Source << REG_SHIFT_TAB_FALTxE[iFault])); +} + +/** +*\*\fun Get the Blanking Source of the fault circuitry is enabled for a given fault input. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +**/ +uint32_t SHRTIM_FALT_GetBlankingSrc(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN3) + + REG_OFFSET_TAB_FALTIN[iFault])); + return ((READ_BIT(*pReg, (uint32_t)(SHRTIM_FALTIN3_FALT1BLKS) << REG_SHIFT_TAB_FALTxE[iFault]) >> REG_SHIFT_TAB_FALTxE[iFault])); +} + +/** +*\*\fun Set the Counter threshold value of a fault counter. +*\*\note This function must not be called when the fault channel is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\param Threshold This parameter can be a number between Min_Data=0 and Max_Data=15 +*\*\return None +**/ +void SHRTIM_FALT_SetCounterThreshold(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Threshold) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN3) + + REG_OFFSET_TAB_FALTIN[iFault])); + MODIFY_REG(*pReg, (SHRTIM_FALTIN3_FALT1CNT << REG_SHIFT_TAB_FALTxE[iFault]), (Threshold << REG_SHIFT_TAB_FALTxE[iFault])); +} + +/** +*\*\fun Get actual the Counter threshold value of a fault counter. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return Threshold This parameter can be a number between Min_Data=0 and Max_Data=15 +**/ +uint32_t SHRTIM_FALT_GetCounterThreshold(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN3) + + REG_OFFSET_TAB_FALTIN[iFault])); + return (READ_BIT(*pReg, (uint32_t)(SHRTIM_FALTIN3_FALT1CNT) << REG_SHIFT_TAB_FALTxE[iFault]) >> REG_SHIFT_TAB_FALTxE[iFault]); +} + +/** +*\*\fun Enable soft fault for given fault +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return None +**/ +void SHRTIM_FALT_EnableSoftFault(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + SET_BIT(SHRTIMx->sCommonRegs.SFTFALT, Fault); +} + +/** +*\*\fun Indicate whether the soft fault is enabled +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return State of SFTFALTx bit in SHRTIM_SFTFALT register (1 or 0). +**/ +uint32_t SHRTIM_FALT_IsEnabledSoftFault(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.SFTFALT, Fault) == (Fault)) ? 1UL : 0UL); +} + +/** +*\*\fun Set the mode of reset of a fault counter to 'always reset'. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_FALT_COUNTERRST_UNCONDITIONAL +*\*\ - SHRTIM_FALT_COUNTERRST_CONDITIONAL +*\*\return None +**/ +void SHRTIM_FALT_SetResetMode(SHRTIM_Module *SHRTIMx, uint32_t Fault, uint32_t Mode) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN3) + + REG_OFFSET_TAB_FALTIN[iFault])); + MODIFY_REG(*pReg, (SHRTIM_FALTIN3_FALT1RSTM << REG_SHIFT_TAB_FALTxE[iFault]), Mode << REG_SHIFT_TAB_FALTxE[iFault]); +} + +/** +*\*\fun Get the mode of reset of a fault counter to 'reset on event'. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return Mode This parameter can be one of the following values: +*\*\ - SHRTIM_FALT_COUNTERRST_UNCONDITIONAL +*\*\ - SHRTIM_FALT_COUNTERRST_CONDITIONAL +**/ +uint32_t SHRTIM_FALT_GetResetMode(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN3) + + REG_OFFSET_TAB_FALTIN[iFault])); + return READ_BIT(*pReg, (uint32_t)(SHRTIM_FALTIN3_FALT1RSTM) << REG_SHIFT_TAB_FALTxE[iFault]); +} + +/** +*\*\fun Reset the fault counter for a fault circuitry +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Fault This parameter can be one of the following values: +*\*\ - SHRTIM_FAULT_1 +*\*\ - SHRTIM_FAULT_2 +*\*\ - SHRTIM_FAULT_3 +*\*\ - SHRTIM_FAULT_4 +*\*\ - SHRTIM_FAULT_5 +*\*\ - SHRTIM_FAULT_6 +*\*\return None +**/ +void SHRTIM_FALT_ResetCounter(SHRTIM_Module *SHRTIMx, uint32_t Fault) +{ + uint32_t iFault = (uint8_t)POSITION_VAL(Fault); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sCommonRegs.FALTIN3) + + REG_OFFSET_TAB_FALTIN[iFault])); + SET_BIT(*pReg, (uint32_t)(SHRTIM_FALTIN3_FALT1CRST) << REG_SHIFT_TAB_FALTxE[iFault]); +} + +/** +*\*\fun Configure the burst mode controller. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Configuration This parameter must be a combination of all the following values: +*\*\ - SHRTIM_BM_MODE_SINGLESHOT or SHRTIM_BM_MODE_CONTINOUS +*\*\ - SHRTIM_BM_CLKSRC_MASTER or ... or SHRTIM_BM_CLKSRC_FSHRTIM +*\*\ - SHRTIM_BM_PRESCALER_DIV1 or ... SHRTIM_BM_PRESCALER_DIV32768 +*\*\return None +**/ +void SHRTIM_BM_Config(SHRTIM_Module *SHRTIMx, uint32_t Configuration) +{ + MODIFY_REG(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BM_CONFIG_MASK, Configuration); +} + +/** +*\*\fun Set the burst mode controller operating mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Mode This parameter can be one of the following values: +*\*\ - SHRTIM_BM_MODE_SINGLESHOT +*\*\ - SHRTIM_BM_MODE_CONTINOUS +*\*\return None +**/ +void SHRTIM_BM_SetMode(SHRTIM_Module *SHRTIMx, uint32_t Mode) +{ + MODIFY_REG(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMOM, Mode); +} + +/** +*\*\fun Get actual burst mode controller operating mode. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return Mode This parameter can be one of the following values: +*\*\ - SHRTIM_BM_MODE_SINGLESHOT +*\*\ - SHRTIM_BM_MODE_CONTINOUS +**/ +uint32_t SHRTIM_BM_GetMode(SHRTIM_Module *SHRTIMx) +{ + return (uint32_t)READ_BIT(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMOM); +} + +/** +*\*\fun Set the burst mode controller clock source. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param ClockSrc This parameter can be one of the following values: +*\*\ - SHRTIM_BM_CLKSRC_MASTER +*\*\ - SHRTIM_BM_CLKSRC_TIMER_A +*\*\ - SHRTIM_BM_CLKSRC_TIMER_B +*\*\ - SHRTIM_BM_CLKSRC_TIMER_C +*\*\ - SHRTIM_BM_CLKSRC_TIMER_D +*\*\ - SHRTIM_BM_CLKSRC_TIMER_E +*\*\ - SHRTIM_BM_CLKSRC_TIMER_F +*\*\ - SHRTIM_BM_CLKSRC_GTIMB1_OC1 +*\*\ - SHRTIM_BM_CLKSRC_GTIMB2_OC1 +*\*\ - SHRTIM_BM_CLKSRC_GTIMB3_OC1 +*\*\ - SHRTIM_BM_CLKSRC_BTIM1_TRGO +*\*\ - SHRTIM_BM_CLKSRC_FSHRTIM +*\*\return None +**/ +void SHRTIM_BM_SetClockSrc(SHRTIM_Module *SHRTIMx, uint32_t ClockSrc) +{ + MODIFY_REG(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMCK, ClockSrc); +} + +/** +*\*\fun Get actual burst mode controller clock source. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return ClockSrc This parameter can be one of the following values: +*\*\ - SHRTIM_BM_CLKSRC_MASTER +*\*\ - SHRTIM_BM_CLKSRC_TIMER_A +*\*\ - SHRTIM_BM_CLKSRC_TIMER_B +*\*\ - SHRTIM_BM_CLKSRC_TIMER_C +*\*\ - SHRTIM_BM_CLKSRC_TIMER_D +*\*\ - SHRTIM_BM_CLKSRC_TIMER_E +*\*\ - SHRTIM_BM_CLKSRC_TIMER_F +*\*\ - SHRTIM_BM_CLKSRC_GTIMB1_OC1 +*\*\ - SHRTIM_BM_CLKSRC_GTIMB2_OC1 +*\*\ - SHRTIM_BM_CLKSRC_GTIMB3_OC1 +*\*\ - SHRTIM_BM_CLKSRC_BTIM1_TRGO +*\*\ - SHRTIM_BM_CLKSRC_FSHRTIM +**/ +uint32_t SHRTIM_BM_GetClockSrc(SHRTIM_Module *SHRTIMx) +{ + return (uint32_t)READ_BIT(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMCK); +} + +/** +*\*\fun Set the burst mode controller prescaler. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_BM_PRESCALER_DIV1 +*\*\ - SHRTIM_BM_PRESCALER_DIV2 +*\*\ - SHRTIM_BM_PRESCALER_DIV4 +*\*\ - SHRTIM_BM_PRESCALER_DIV8 +*\*\ - SHRTIM_BM_PRESCALER_DIV16 +*\*\ - SHRTIM_BM_PRESCALER_DIV32 +*\*\ - SHRTIM_BM_PRESCALER_DIV64 +*\*\ - SHRTIM_BM_PRESCALER_DIV128 +*\*\ - SHRTIM_BM_PRESCALER_DIV256 +*\*\ - SHRTIM_BM_PRESCALER_DIV512 +*\*\ - SHRTIM_BM_PRESCALER_DIV1024 +*\*\ - SHRTIM_BM_PRESCALER_DIV2048 +*\*\ - SHRTIM_BM_PRESCALER_DIV4096 +*\*\ - SHRTIM_BM_PRESCALER_DIV8192 +*\*\ - SHRTIM_BM_PRESCALER_DIV16384 +*\*\ - SHRTIM_BM_PRESCALER_DIV32768 +*\*\return None +**/ +void SHRTIM_BM_SetPrescaler(SHRTIM_Module *SHRTIMx, uint32_t Prescaler) +{ + MODIFY_REG(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMPSC, Prescaler); +} + +/** +*\*\fun Get actual burst mode controller prescaler setting. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return Prescaler This parameter can be one of the following values: +*\*\ - SHRTIM_BM_PRESCALER_DIV1 +*\*\ - SHRTIM_BM_PRESCALER_DIV2 +*\*\ - SHRTIM_BM_PRESCALER_DIV4 +*\*\ - SHRTIM_BM_PRESCALER_DIV8 +*\*\ - SHRTIM_BM_PRESCALER_DIV16 +*\*\ - SHRTIM_BM_PRESCALER_DIV32 +*\*\ - SHRTIM_BM_PRESCALER_DIV64 +*\*\ - SHRTIM_BM_PRESCALER_DIV128 +*\*\ - SHRTIM_BM_PRESCALER_DIV256 +*\*\ - SHRTIM_BM_PRESCALER_DIV512 +*\*\ - SHRTIM_BM_PRESCALER_DIV1024 +*\*\ - SHRTIM_BM_PRESCALER_DIV2048 +*\*\ - SHRTIM_BM_PRESCALER_DIV4096 +*\*\ - SHRTIM_BM_PRESCALER_DIV8192 +*\*\ - SHRTIM_BM_PRESCALER_DIV16384 +*\*\ - SHRTIM_BM_PRESCALER_DIV32768 +**/ +uint32_t SHRTIM_BM_GetPrescaler(SHRTIM_Module *SHRTIMx) +{ + return (uint32_t)READ_BIT(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMPSC); +} + +/** +*\*\fun Enable burst mode compare and period registers preload. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_BM_EnablePreload(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMPLEN); +} + +/** +*\*\fun Disable burst mode compare and period registers preload. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_BM_DisablePreload(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMPLEN); +} + +/** +*\*\fun Indicate whether burst mode compare and period registers are preloaded. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of BMPLEN bit in SHRTIM_BMCTRL register (1 or 0). +**/ +uint32_t SHRTIM_BM_IsEnabledPreload(SHRTIM_Module *SHRTIMx) +{ + uint32_t temp; /* MINTSTSAC-2012 compliance */ + temp = READ_BIT(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMPLEN); + + return ((temp == (SHRTIM_BMCTRL_BMPLEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Set the burst mode controller trigger +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Trig This parameter can be a combination of the following values: +*\*\ - SHRTIM_BM_TRIG_NONE +*\*\ - SHRTIM_BM_TRIG_MASTER_RESET +*\*\ - SHRTIM_BM_TRIG_MASTER_REPETITION +*\*\ - SHRTIM_BM_TRIG_MASTER_CMP1 +*\*\ - SHRTIM_BM_TRIG_MASTER_CMP2 +*\*\ - SHRTIM_BM_TRIG_MASTER_CMP3 +*\*\ - SHRTIM_BM_TRIG_MASTER_CMP4 +*\*\ - SHRTIM_BM_TRIG_TIMA_RESET +*\*\ - SHRTIM_BM_TRIG_TIMA_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIMA_CMP1 +*\*\ - SHRTIM_BM_TRIG_TIMA_CMP2 +*\*\ - SHRTIM_BM_TRIG_TIMB_RESET +*\*\ - SHRTIM_BM_TRIG_TIMB_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIMB_CMP1 +*\*\ - SHRTIM_BM_TRIG_TIMB_CMP2 +*\*\ - SHRTIM_BM_TRIG_TIMC_RESET +*\*\ - SHRTIM_BM_TRIG_TIMC_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIMC_CMP1 +*\*\ - SHRTIM_BM_TRIG_TIMD_RESET +*\*\ - SHRTIM_BM_TRIG_TIMD_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIMD_CMP2 +*\*\ - SHRTIM_BM_TRIG_TIME_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIME_CMP1 +*\*\ - SHRTIM_BM_TRIG_TIME_CMP2 +*\*\ - SHRTIM_BM_TRIG_TIMF_RESET +*\*\ - SHRTIM_BM_TRIG_TIMF_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIMF_CMP1 +*\*\ - SHRTIM_BM_TRIG_TIMA_EVENT7 +*\*\ - SHRTIM_BM_TRIG_TIMD_EVENT8 +*\*\ - SHRTIM_BM_TRIG_EVENT_7 +*\*\ - SHRTIM_BM_TRIG_EVENT_8 +*\*\ - SHRTIM_BM_TRIG_EVENT_ONCHIP +*\*\return None +**/ +void SHRTIM_BM_SetTrig(SHRTIM_Module *SHRTIMx, uint32_t Trig) +{ + WRITE_REG(SHRTIMx->sCommonRegs.BMTG, Trig); +} + +/** +*\*\fun Get actual burst mode controller trigger. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return Trig This parameter can be a combination of the following values: +*\*\ - SHRTIM_BM_TRIG_NONE +*\*\ - SHRTIM_BM_TRIG_MASTER_RESET +*\*\ - SHRTIM_BM_TRIG_MASTER_REPETITION +*\*\ - SHRTIM_BM_TRIG_MASTER_CMP1 +*\*\ - SHRTIM_BM_TRIG_MASTER_CMP2 +*\*\ - SHRTIM_BM_TRIG_MASTER_CMP3 +*\*\ - SHRTIM_BM_TRIG_MASTER_CMP4 +*\*\ - SHRTIM_BM_TRIG_TIMA_RESET +*\*\ - SHRTIM_BM_TRIG_TIMA_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIMA_CMP1 +*\*\ - SHRTIM_BM_TRIG_TIMA_CMP2 +*\*\ - SHRTIM_BM_TRIG_TIMB_RESET +*\*\ - SHRTIM_BM_TRIG_TIMB_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIMB_CMP1 +*\*\ - SHRTIM_BM_TRIG_TIMB_CMP2 +*\*\ - SHRTIM_BM_TRIG_TIMC_RESET +*\*\ - SHRTIM_BM_TRIG_TIMC_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIMC_CMP1 +*\*\ - SHRTIM_BM_TRIG_TIMD_RESET +*\*\ - SHRTIM_BM_TRIG_TIMD_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIMD_CMP2 +*\*\ - SHRTIM_BM_TRIG_TIME_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIME_CMP1 +*\*\ - SHRTIM_BM_TRIG_TIME_CMP2 +*\*\ - SHRTIM_BM_TRIG_TIMF_RESET +*\*\ - SHRTIM_BM_TRIG_TIMF_REPETITION +*\*\ - SHRTIM_BM_TRIG_TIMF_CMP1 +*\*\ - SHRTIM_BM_TRIG_TIMA_EVENT7 +*\*\ - SHRTIM_BM_TRIG_TIMD_EVENT8 +*\*\ - SHRTIM_BM_TRIG_EVENT_7 +*\*\ - SHRTIM_BM_TRIG_EVENT_8 +*\*\ - SHRTIM_BM_TRIG_EVENT_ONCHIP +**/ +uint32_t SHRTIM_BM_GetTrig(SHRTIM_Module *SHRTIMx) +{ + return (uint32_t)READ_REG(SHRTIMx->sCommonRegs.BMTG); +} + +/** +*\*\fun Set the burst mode controller compare value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param CompareValue +*\*\return None +**/ +void SHRTIM_BM_SetCompare(SHRTIM_Module *SHRTIMx, uint32_t CompareValue) +{ + WRITE_REG(SHRTIMx->sCommonRegs.BMCMP, CompareValue); +} + +/** +*\*\fun Get actual burst mode controller compare value. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return CompareValue +*\*\note The IDLE time in burst mode must greater than the period of PWM output +**/ +uint32_t SHRTIM_BM_GetCompare(SHRTIM_Module *SHRTIMx) +{ + return (uint32_t)READ_REG(SHRTIMx->sCommonRegs.BMCMP); +} + +/** +*\*\fun Set the burst mode controller period. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Period +*\*\return None +*\*\note The RUN time in burst mode must greater than the period of PWM output +**/ +void SHRTIM_BM_SetPeriod(SHRTIM_Module *SHRTIMx, uint32_t Period) +{ + WRITE_REG(SHRTIMx->sCommonRegs.BMPRD, Period); +} + +/** +*\*\fun Get actual burst mode controller period. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return period +**/ +uint32_t SHRTIM_BM_GetPeriod(SHRTIM_Module *SHRTIMx) +{ + return (uint32_t)READ_REG(SHRTIMx->sCommonRegs.BMPRD); +} + +/** +*\*\fun Enable the burst mode controller +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_BM_Enable(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMEN); +} + +/** +*\*\fun Disable the burst mode controller +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_BM_Disable(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMEN); +} + +/** +*\*\fun Indicate whether the burst mode controller is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of BMEN bit in SHRTIM_BMCTRL register (1 or 0). +**/ +uint32_t SHRTIM_BM_IsEnabled(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMEN) == (SHRTIM_BMCTRL_BMEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Trigger the burst operation (software trigger) +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_BM_Start(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.BMTG, SHRTIM_BMTG_SWSTRT); +} + +/** +*\*\fun Stop the burst mode operation. +*\*\note Causes a burst mode early termination. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_BM_Stop(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMSTS); +} + +/** +*\*\fun Get actual burst mode status +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return Status This parameter can be one of the following values: +*\*\ - SHRTIM_BM_STATUS_NORMAL +*\*\ - SHRTIM_BM_STATUS_BURST_ONGOING +**/ +uint32_t SHRTIM_BM_GetStatus(SHRTIM_Module *SHRTIMx) +{ + return (READ_BIT(SHRTIMx->sCommonRegs.BMCTRL, SHRTIM_BMCTRL_BMSTS)); +} + +/** +*\*\fun Clear the Fault 1 interrupt flag. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_ClearFlag_FALT1(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTCLR, SHRTIM_INTCLR_FALT1IC); +} + +/** +*\*\fun Indicate whether Fault 1 interrupt occurred. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT1ITF bit in SHRTIM_INTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_FALT1(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTSTS, SHRTIM_INTSTS_FALT1ITF) == (SHRTIM_INTSTS_FALT1ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the Fault 2 interrupt flag. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_ClearFlag_FALT2(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTCLR, SHRTIM_INTCLR_FALT2IC); +} + +/** +*\*\fun Indicate whether Fault 2 interrupt occurred. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT2ITF bit in SHRTIM_INTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_FALT2(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTSTS, SHRTIM_INTSTS_FALT2ITF) == (SHRTIM_INTSTS_FALT2ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the Fault 3 interrupt flag. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_ClearFlag_FALT3(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTCLR, SHRTIM_INTCLR_FALT3IC); +} + +/** +*\*\fun Indicate whether Fault 3 interrupt occurred. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT3ITF bit in SHRTIM_INTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_FALT3(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTSTS, SHRTIM_INTSTS_FALT3ITF) == (SHRTIM_INTSTS_FALT3ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the Fault 4 interrupt flag. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_ClearFlag_FALT4(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTCLR, SHRTIM_INTCLR_FALT4IC); +} + +/** +*\*\fun Indicate whether Fault 4 interrupt occurred. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT4ITF bit in SHRTIM_INTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_FALT4(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTSTS, SHRTIM_INTSTS_FALT4ITF) == (SHRTIM_INTSTS_FALT4ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the Fault 5 interrupt flag. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_ClearFlag_FALT5(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTCLR, SHRTIM_INTCLR_FALT5IC); +} + +/** +*\*\fun Indicate whether Fault 5 interrupt occurred. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT5ITF bit in SHRTIM_INTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_FALT5(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTSTS, SHRTIM_INTSTS_FALT5ITF) == (SHRTIM_INTSTS_FALT5ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the Fault 6 interrupt flag. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_ClearFlag_FALT6(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTCLR, SHRTIM_INTCLR_FALT6IC); +} + +/** +*\*\fun Indicate whether Fault 6 interrupt occurred. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT6ITF bit in SHRTIM_INTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_FALT6(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTSTS, SHRTIM_INTSTS_FALT6ITF) == (SHRTIM_INTSTS_FALT6ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the System Fault interrupt flag. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_ClearFlag_SYSFALT(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTCLR, SHRTIM_INTCLR_SYSFALTIC); +} + +/** +*\*\fun Indicate whether System Fault interrupt occurred. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of SYSFALTITF bit in SHRTIM_INTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_SYSFALT(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTSTS, SHRTIM_INTSTS_SYSFALTITF) == (SHRTIM_INTSTS_SYSFALTITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the Burst Mode period interrupt flag. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_ClearFlag_BMPRD(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTCLR, SHRTIM_INTCLR_BMPRDIC); +} + +/** +*\*\fun Indicate whether Burst Mode period interrupt occurred. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of BMPRDITF bit in SHRTIM_INTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_BMPRD(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTSTS, SHRTIM_INTSTS_BMPRDITF) == (SHRTIM_INTSTS_BMPRDITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the Synchronization Input interrupt flag. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_ClearFlag_SYNC(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sMasterRegs.MINTCLR, SHRTIM_MINTCLR_SYNCINIC); +} + +/** +*\*\fun Indicate whether the Synchronization Input interrupt occurred. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of SYNCINITF bit in SHRTIM_MINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_SYNC(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sMasterRegs.MINTSTS, SHRTIM_MINTSTS_SYNCINITF) == (SHRTIM_MINTSTS_SYNCINITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the update interrupt flag for a given timer (including the master timer) . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MINTCLR_MUPDIC); +} + +/** +*\*\fun Indicate whether the update interrupt has occurred for a given timer (including the master timer) . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MUPDITF/UPDITF bit in SHRTIM_MINTSTS/SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MINTSTS_MUPDITF) == (SHRTIM_MINTSTS_MUPDITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the repetition interrupt flag for a given timer (including the master timer) . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +*\*\note For master timer, repetition interrupt enabled bit is bit4, for TA~TF, is bit5 +**/ +void SHRTIM_ClearFlag_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer; + __IO uint32_t *pReg; + + if(Timer != SHRTIM_TIMER_MASTER) + { + iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXINTCLR_REPTIC); + } + else + { + pReg = (__IO uint32_t *)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR)); + SET_BIT(*pReg, SHRTIM_MINTCLR_MREPTIC); + } +} + +/** +*\*\fun Indicate whether the repetition interrupt has occurred for a given timer (including the master timer) . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MREPTITF/REPTITF bit in SHRTIM_MINTSTS/SHRTIM_TxINTSTS register (1 or 0). +*\*\note For master timer, repetition interrupt enabled bit is bit4, for TA~TF, is bit5 +**/ +uint32_t SHRTIM_IsActiveFlag_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer; + __IO uint32_t *pReg; + + if(Timer != SHRTIM_TIMER_MASTER) + { + iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + return ((READ_BIT(*pReg, SHRTIM_TXINTSTS_REPTITF) == (SHRTIM_TXINTSTS_REPTITF)) ? 1UL : 0UL); + } + else + { + pReg = (__IO uint32_t *)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS)); + return ((READ_BIT(*pReg, SHRTIM_MINTSTS_MREPTITF) == (SHRTIM_MINTSTS_MREPTITF)) ? 1UL : 0UL); + } +} + +/** +*\*\fun Clear the compare 1 match interrupt for a given timer (including the master timer). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MINTCLR_MCMP1IC); +} + +/** +*\*\fun Indicate whether the compare match 1 interrupt has occurred for a given timer (including the master timer) . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP1ITF/CMP1ITF bit in SHRTIM_MINTSTS/SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MINTSTS_MCMP1ITF) == (SHRTIM_MINTSTS_MCMP1ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the compare 2 match interrupt for a given timer (including the master timer). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MINTCLR_MCMP2IC); +} + +/** +*\*\fun Indicate whether the compare match 2 interrupt has occurred for a given timer (including the master timer) . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP2ITF/CMP2ITF bit in SHRTIM_MINTSTS/SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MINTSTS_MCMP2ITF) == (SHRTIM_MINTSTS_MCMP2ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the compare 3 match interrupt for a given timer (including the master timer). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MINTCLR_MCMP3IC); +} + +/** +*\*\fun Indicate whether the compare match 3 interrupt has occurred for a given timer (including the master timer) . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP3ITF/CMP3ITF bit in SHRTIM_MINTSTS/SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MINTSTS_MCMP3ITF) == (SHRTIM_MINTSTS_MCMP3ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the compare 4 match interrupt for a given timer (including the master timer). +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MINTCLR_MCMP4IC); +} + +/** +*\*\fun Indicate whether the compare match 4 interrupt has occurred for a given timer (including the master timer) . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP4ITF/CMP4ITF bit in SHRTIM_MINTSTS/SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MINTSTS_MCMP4ITF) == (SHRTIM_MINTSTS_MCMP4ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the compare 5 match for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_CMP5(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXINTCLR_CMP5IC); +} + +/** +*\*\fun Indicate whether the compare match 5 has occurred for a given timer . +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of CMP5ITF bit in SHRTIM_TXINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_CMP5(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXINTSTS_CMP5ITF) == (SHRTIM_TXINTSTS_CMP5ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the capture 1 interrupt flag for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXINTCLR_CPT1IC); +} + +/** +*\*\fun Indicate whether the capture 1 interrupt occurred for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of CPT1ITF bit in SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXINTSTS_CPT1ITF) == (SHRTIM_TXINTSTS_CPT1ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the capture 2 interrupt flag for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXINTCLR_CPT2IC); +} + +/** +*\*\fun Indicate whether the capture 2 interrupt occurred for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of CPT2ITF bit in SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXINTSTS_CPT2ITF) == (SHRTIM_TXINTSTS_CPT2ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the output 1 set interrupt flag for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXINTCLR_SET1IC); +} + +/** +*\*\fun Indicate whether the output 1 set interrupt occurred for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of SET1ITF bit in SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXINTSTS_SET1ITF) == (SHRTIM_TXINTSTS_SET1ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the output 1 reset interrupt flag for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXINTCLR_RST1IC); +} + +/** +*\*\fun Indicate whether the output 1 reset interrupt occurred for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of RST1ITF bit in SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXINTSTS_RST1ITF) == (SHRTIM_TXINTSTS_RST1ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the output 2 set interrupt flag for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXINTCLR_SET2IC); +} + +/** +*\*\fun Indicate whether the output 2 set interrupt occurred for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of SET2ITF bit in SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXINTSTS_SET2ITF) == (SHRTIM_TXINTSTS_SET2ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the output 2reset interrupt flag for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXINTCLR_RST2IC); +} + +/** +*\*\fun Indicate whether the output 2 reset interrupt occurred for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of RST2ITF bit in SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXINTSTS_RST2ITF) == (SHRTIM_TXINTSTS_RST2ITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the reset and/or roll-over interrupt flag for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXINTCLR_RSTROIC); +} + +/** +*\*\fun Indicate whether the reset and/or roll-over interrupt occurred for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of RSTROITF bit in SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXINTSTS_RSTROITF) == (SHRTIM_TXINTSTS_RSTROITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Clear the delayed protection interrupt flag for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_ClearFlag_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTCLR) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXINTCLR_DPIC); +} + +/** +*\*\fun Indicate whether the delayed protection interrupt occurred for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of DPITF bit in SHRTIM_TxINTSTS register (1 or 0). +**/ +uint32_t SHRTIM_IsActiveFlag_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MINTSTS) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXINTSTS_DPITF) == (SHRTIM_TXINTSTS_DPITF)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the fault 1 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_EnableIT_FALT1(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT1IEN); +} + +/** +*\*\fun Disable the fault 1 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_DisableIT_FALT1(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT1IEN); +} + +/** +*\*\fun Indicate whether the fault 1 interrupt is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT1IEN bit in SHRTIM_INTEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_FALT1(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT1IEN) == (SHRTIM_INTEN_FALT1IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the fault 2 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_EnableIT_FALT2(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT2IEN); +} + +/** +*\*\fun Disable the fault 2 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_DisableIT_FALT2(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT2IEN); +} + +/** +*\*\fun Indicate whether the fault 2 interrupt is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT2IEN bit in SHRTIM_INTEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_FALT2(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT2IEN) == (SHRTIM_INTEN_FALT2IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the fault 3 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_EnableIT_FALT3(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT3IEN); +} + +/** +*\*\fun Disable the fault 3 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_DisableIT_FALT3(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT3IEN); +} + +/** +*\*\fun Indicate whether the fault 3 interrupt is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT3IEN bit in SHRTIM_INTEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_FALT3(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT3IEN) == (SHRTIM_INTEN_FALT3IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the fault 4 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_EnableIT_FALT4(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT4IEN); +} + +/** +*\*\fun Disable the fault 4 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_DisableIT_FALT4(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT4IEN); +} + +/** +*\*\fun Indicate whether the fault 4 interrupt is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT4IEN bit in SHRTIM_INTEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_FALT4(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT4IEN) == (SHRTIM_INTEN_FALT4IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the fault 5 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_EnableIT_FALT5(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT5IEN); +} + +/** +*\*\fun Disable the fault 5 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_DisableIT_FALT5(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT5IEN); +} + +/** +*\*\fun Indicate whether the fault 5 interrupt is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT5IEN bit in SHRTIM_INTEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_FALT5(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT5IEN) == (SHRTIM_INTEN_FALT5IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the fault 6 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_EnableIT_FALT6(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT6IEN); +} + +/** +*\*\fun Disable the fault 6 interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_DisableIT_FALT6(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT6IEN); +} + +/** +*\*\fun Indicate whether the fault 6 interrupt is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of FALT6IEN bit in SHRTIM_INTEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_FALT6(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_FALT6IEN) == (SHRTIM_INTEN_FALT6IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the system fault interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_EnableIT_SYSFALT(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_SYSFALTIEN); +} + +/** +*\*\fun Disable the system fault interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_DisableIT_SYSFALT(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_SYSFALTIEN); +} + +/** +*\*\fun Indicate whether the system fault interrupt is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of SYSFALTIEN bit in SHRTIM_INTEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_SYSFALT(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_SYSFALTIEN) == (SHRTIM_INTEN_SYSFALTIEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the burst mode period interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_EnableIT_BMPRD(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_BMPRDIEN); +} + +/** +*\*\fun Disable the burst mode period interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_DisableIT_BMPRD(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_BMPRDIEN); +} + +/** +*\*\fun Indicate whether the burst mode period interrupt is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of BMPRDIEN bit in SHRTIM_INTEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_BMPRD(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sCommonRegs.INTEN, SHRTIM_INTEN_BMPRDIEN) == (SHRTIM_INTEN_BMPRDIEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the synchronization input interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_EnableIT_SYNC(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sMasterRegs.MIDEN, SHRTIM_MIDEN_SYNCINIEN); +} + +/** +*\*\fun Disable the synchronization input interrupt. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_DisableIT_SYNC(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sMasterRegs.MIDEN, SHRTIM_MIDEN_SYNCINIEN); +} + +/** +*\*\fun Indicate whether the synchronization input interrupt is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of SYNCINIEN bit in SHRTIM_MIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_SYNC(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sMasterRegs.MIDEN, SHRTIM_MIDEN_SYNCINIEN) == (SHRTIM_MIDEN_SYNCINIEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the update interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MIDEN_MUPDIEN); +} + +/** +*\*\fun Disable the update interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MUPDIEN); +} + +/** +*\*\fun Indicate whether the update interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MUPDIEN/UPDIEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MUPDIEN) == (SHRTIM_MIDEN_MUPDIEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the repetition interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +*\*\note For master timer, repetition interrupt enabled bit is bit4, for TA~TF, is bit5 +**/ +void SHRTIM_EnableIT_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer; + __IO uint32_t *pReg; + + if(Timer != SHRTIM_TIMER_MASTER) + { + iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_REPTIEN); + } + else + { + pReg = (__IO uint32_t *)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN)); + SET_BIT(*pReg, SHRTIM_MIDEN_MREPTIEN); + } +} + +/** +*\*\fun Disable the repetition interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +*\*\note For master timer, repetition interrupt enabled bit is bit4, for TA~TF, is bit5 +**/ +void SHRTIM_DisableIT_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer; + __IO uint32_t *pReg; + + if(Timer != SHRTIM_TIMER_MASTER) + { + iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_REPTIEN); + } + else + { + pReg = (__IO uint32_t *)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN)); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MREPTIEN); + } +} + +/** +*\*\fun Indicate whether the repetition interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MREPTIEN/REPTIEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer; + __IO uint32_t *pReg; + + if(Timer != SHRTIM_TIMER_MASTER) + { + iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_TACNTEN_Pos); + pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sTimerxRegs[0].TxIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_REPTIEN) == (SHRTIM_TXIDEN_REPTIEN)) ? 1UL : 0UL); + } + else + { + pReg = (__IO uint32_t *)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN)); + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MREPTIEN) == (SHRTIM_MIDEN_MREPTIEN)) ? 1UL : 0UL); + } +} + +/** +*\*\fun Enable the compare 1 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MIDEN_MCMP1IEN); +} + +/** +*\*\fun Disable the compare 1 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MCMP1IEN); +} + +/** +*\*\fun Indicate whether the compare 1 interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP1IEN/CMP1IEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MCMP1IEN) == (SHRTIM_MIDEN_MCMP1IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the compare 2 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MIDEN_MCMP2IEN); +} + +/** +*\*\fun Disable the compare 2 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MCMP2IEN); +} + +/** +*\*\fun Indicate whether the compare 2 interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP2IEN/CMP2IEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MCMP2IEN) == (SHRTIM_MIDEN_MCMP2IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the compare 3 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MIDEN_MCMP3IEN); +} + +/** +*\*\fun Disable the compare 3 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MCMP3IEN); +} + +/** +*\*\fun Indicate whether the compare 3 interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP3IEN/CMP3IEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MCMP3IEN) == (SHRTIM_MIDEN_MCMP3IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the compare 4 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MIDEN_MCMP4IEN); +} + +/** +*\*\fun Disable the compare 4 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MCMP4IEN); +} + +/** +*\*\fun Indicate whether the compare 4 interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP4IEN/CMP4IEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MCMP4IEN) == (SHRTIM_MIDEN_MCMP4IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the capture 1 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_CPT1IEN); +} + +/** +*\*\fun Enable the capture 1 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_CPT1IEN); +} + +/** +*\*\fun Indicate whether the capture 1 interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of CPT1IEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_CPT1IEN) == (SHRTIM_TXIDEN_CPT1IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the capture 2 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_CPT2IEN); +} + +/** +*\*\fun Enable the capture 2 interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_CPT2IEN); +} + +/** +*\*\fun Indicate whether the capture 2 interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of CPT2IEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_CPT2IEN) == (SHRTIM_TXIDEN_CPT2IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the output 1 set interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_SET1IEN); +} + +/** +*\*\fun Disable the output 1 set interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_SET1IEN); +} + +/** +*\*\fun Indicate whether the output 1 set interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of SET1IEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_SET1IEN) == (SHRTIM_TXIDEN_SET1IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the output 1 reset interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_RST1IEN); +} + +/** +*\*\fun Disable the output 1 reset interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_RST1IEN); +} + +/** +*\*\fun Indicate whether the output 1 reset interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of RST1IEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_RST1IEN) == (SHRTIM_TXIDEN_RST1IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the output 2 set interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_SET2IEN); +} + +/** +*\*\fun Disable the output 2 set interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_SET2IEN); +} + +/** +*\*\fun Indicate whether the output 2 set interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of SET2IEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_SET2IEN) == (SHRTIM_TXIDEN_SET2IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the output 2 reset interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_RST2IEN); +} + +/** +*\*\fun Disable the output 2 reset interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_RST2IEN); +} + +/** +*\*\fun Indicate whether the output 2 reset SHRTIM_IsEnabledIT_RST2 is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of RST2IEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_RST2IEN) == (SHRTIM_TXIDEN_RST2IEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the reset/roll-over interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_RSTROIEN); +} + +/** +*\*\fun Disable the reset/roll-over interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_RSTROIEN); +} + +/** +*\*\fun Indicate whether the reset/roll-over interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of RSTROIEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_RSTROIEN) == (SHRTIM_TXIDEN_RSTROIEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the delayed protection interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableIT_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_DPIEN); +} + +/** +*\*\fun Disable the delayed protection interrupt for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableIT_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_DPIEN); +} + +/** +*\*\fun Indicate whether the delayed protection interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of DPIEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledIT_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_DPIEN) == (SHRTIM_TXIDEN_DPIEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the synchronization input DMA request. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_EnableDMAReq_SYNC(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sMasterRegs.MIDEN, SHRTIM_MIDEN_SYNCINDEN); +} + +/** +*\*\fun Disable the synchronization input DMA request +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_DisableDMAReq_SYNC(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sMasterRegs.MIDEN, SHRTIM_MIDEN_SYNCINDEN); +} + +/** +*\*\fun Indicate whether the synchronization input DMA request is enabled. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return State of SYNCINDEN bit in SHRTIM_MIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_SYNC(SHRTIM_Module *SHRTIMx) +{ + return ((READ_BIT(SHRTIMx->sMasterRegs.MIDEN, SHRTIM_MIDEN_SYNCINDEN) == (SHRTIM_MIDEN_SYNCINDEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the update DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MIDEN_MUPDDEN); +} + +/** +*\*\fun Disable the update DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MUPDDEN); +} + +/** +*\*\fun Indicate whether the update DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MUPDDEN/UPDDEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_UPDATE(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MUPDDEN) == (SHRTIM_MIDEN_MUPDDEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the repetition DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MIDEN_MREPTDEN); +} + +/** +*\*\fun Disable the repetition DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MREPTDEN); +} + +/** +*\*\fun Indicate whether the repetition DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MREPTDEN/REPTDEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_REP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MREPTDEN) == (SHRTIM_MIDEN_MREPTDEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the compare 1 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MIDEN_MCMP1DEN); +} + +/** +*\*\fun Disable the compare 1 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MCMP1DEN); +} + +/** +*\*\fun Indicate whether the compare 1 DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP1DEN/CMP1DEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_CMP1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MCMP1DEN) == (SHRTIM_MIDEN_MCMP1DEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the compare 2 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MIDEN_MCMP2DEN); +} + +/** +*\*\fun Disable the compare 2 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MCMP2DEN); +} + +/** +*\*\fun Indicate whether the compare 2 DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP2DEN/CMP2DEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_CMP2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MCMP2DEN) == (SHRTIM_MIDEN_MCMP2DEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the compare 3 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MIDEN_MCMP3DEN); +} + +/** +*\*\fun Disable the compare 3 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MCMP3DEN); +} + +/** +*\*\fun Indicate whether the compare 3 DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP3DEN/CMP3DEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_CMP3(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MCMP3DEN) == (SHRTIM_MIDEN_MCMP3DEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the compare 4 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_MIDEN_MCMP4DEN); +} + +/** +*\*\fun Disable the compare 4 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_MIDEN_MCMP4DEN); +} + +/** +*\*\fun Indicate whether the compare 4 DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of MCMP4DEN/CMP4DEN bit in SHRTIM_MIDEN/SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_CMP4(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_MIDEN_MCMP4DEN) == (SHRTIM_MIDEN_MCMP4DEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the capture 1 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_CPT1DEN); +} + +/** +*\*\fun Disable the capture 1 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_CPT1DEN); +} + +/** +*\*\fun Indicate whether the capture 1 DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of CPT1DEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_CPT1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_CPT1DEN) == (SHRTIM_TXIDEN_CPT1DEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the capture 2 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_CPT2DEN); +} + +/** +*\*\fun Disable the capture 2 DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_CPT2DEN); +} + +/** +*\*\fun Indicate whether the capture 2 DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of CPT2DEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_CPT2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_CPT2DEN) == (SHRTIM_TXIDEN_CPT2DEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the output 1 set DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_SET1DEN); +} + +/** +*\*\fun Disable the output 1 set DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_SET1DEN); +} + +/** +*\*\fun Indicate whether the output 1 set DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of SET1DEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_SET1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_SET1DEN) == (SHRTIM_TXIDEN_SET1DEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the output 1 reset DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_RST1DEN); +} + +/** +*\*\fun Disable the output 1 reset DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_RST1DEN); +} + +/** +*\*\fun Indicate whether the output 1 reset interrupt is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of RST1DEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_RST1(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_RST1DEN) == (SHRTIM_TXIDEN_RST1DEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the output 2 set DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_SET2DEN); +} + +/** +*\*\fun Disable the output 2 set DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_SET2DEN); +} + +/** +*\*\fun Indicate whether the output 2 set DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of SET2DEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_SET2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_SET2DEN) == (SHRTIM_TXIDEN_SET2DEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the output 2 reset DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_RST2DEN); +} + +/** +*\*\fun Disable the output 2 reset DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_RST2DEN); +} + +/** +*\*\fun Indicate whether the output 2 reset DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of RST2DEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_RST2(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_RST2DEN) == (SHRTIM_TXIDEN_RST2DEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the reset/roll-over DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_RSTRODEN); +} + +/** +*\*\fun Disable the reset/roll-over DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_RSTRODEN); +} + +/** +*\*\fun Indicate whether the reset/roll-over DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of RSTRODEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_RST(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_RSTRODEN) == (SHRTIM_TXIDEN_RSTRODEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Enable the delayed protection DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDMAReq_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + SET_BIT(*pReg, SHRTIM_TXIDEN_DPDEN); +} + +/** +*\*\fun Disable the delayed protection DMA request for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDMAReq_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + CLEAR_BIT(*pReg, SHRTIM_TXIDEN_DPDEN); +} + +/** +*\*\fun Indicate whether the delayed protection DMA request is enabled for a given timer. +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return State of DPDEN bit in SHRTIM_TxIDEN register (1 or 0). +**/ +uint32_t SHRTIM_IsEnabledDMAReq_DP(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + uint32_t iTimer = (uint8_t)(POSITION_VAL(Timer) - SHRTIM_MCTRL_MCNTEN_Pos); + const __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&SHRTIMx->sMasterRegs.MIDEN) + + REG_OFFSET_TAB_TIMER[iTimer])); + + return ((READ_BIT(*pReg, SHRTIM_TXIDEN_DPDEN) == (SHRTIM_TXIDEN_DPDEN)) ? 1UL : 0UL); +} + +/** +*\*\fun Disable halt all timers counter(master + slave) while in debug mode +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_DisableDebugHaltAllTimers(SHRTIM_Module *SHRTIMx) +{ + SET_BIT(SHRTIMx->sMasterRegs.FRZDIS, SHRTIM_FRZDIS_ALLTIMDBGEN); +} + +/** +*\*\fun Enable halt all timers counter(master + slave) while in debug mode +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +void SHRTIM_EnableDebugHaltAllTimers(SHRTIM_Module *SHRTIMx) +{ + CLEAR_BIT(SHRTIMx->sMasterRegs.FRZDIS, SHRTIM_FRZDIS_ALLTIMDBGEN); +} + +/** +*\*\fun Is all timers counter(master + slave) be halted while in debug mode +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return None +**/ +uint32_t SHRTIM_IsEnabledDebugHaltAllTimers(SHRTIM_Module *SHRTIMx) +{ + return (READ_BIT(SHRTIMx->sMasterRegs.FRZDIS, SHRTIM_FRZDIS_ALLTIMDBGEN) == 0UL) ? 1UL : 0UL; +} +/** +*\*\fun Enable halt a given timer counter while in debug mode +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_EnableDebugHaltTimer(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + CLEAR_BIT(SHRTIMx->sMasterRegs.FRZDIS, ((Timer >> SHRTIM_MCTRL_MCNTEN_Pos) & SHRTIM_FRZDIS_CONFIG_MASK)); +} + +/** +*\*\fun Disable halt a given timer counter while in debug mode +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +void SHRTIM_DisableDebugHaltTimer(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + SET_BIT(SHRTIMx->sMasterRegs.FRZDIS, ((Timer >> SHRTIM_MCTRL_MCNTEN_Pos) & SHRTIM_FRZDIS_CONFIG_MASK)); +} + +/** +*\*\fun Is a given timer counter halted while in debug mode +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param Timer This parameter can be one of the following values: +*\*\ - SHRTIM_TIMER_MASTER +*\*\ - SHRTIM_TIMER_A +*\*\ - SHRTIM_TIMER_B +*\*\ - SHRTIM_TIMER_C +*\*\ - SHRTIM_TIMER_D +*\*\ - SHRTIM_TIMER_E +*\*\ - SHRTIM_TIMER_F +*\*\return None +**/ +uint32_t SHRTIM_IsEnabledDebugHaltTimer(SHRTIM_Module *SHRTIMx, uint32_t Timer) +{ + return (READ_BIT(SHRTIMx->sMasterRegs.FRZDIS, ((Timer >> SHRTIM_MCTRL_MCNTEN_Pos) & SHRTIM_FRZDIS_CONFIG_MASK)) == 0UL) ? 1UL : 0UL; +} + +/** +*\*\fun Set Auxilira output bypass +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\param AuxBypa This parameter can be one of the following values: +*\*\ - SHRTIM_AUXOUTPUT_DEFAULT aunxiliary output signals is follow main output +*\*\ - SHRTIM_AUXOUTPUT_FOLLOW_CROSSBAR aunxiliary output signals is follow crossbar +*\*\ - SHRTIM_AUXOUTPUT_FOLLOW_MAINOUTPUT aunxiliary output signals is follow main output +*\*\return None +**/ +void SHRTIM_SetAuxliaryBypass(SHRTIM_Module *SHRTIMx, uint32_t AuxBypa) +{ + SET_BIT(SHRTIMx->sCommonRegs.EXTEND, AuxBypa); +} + +/** +*\*\fun get Auxilira output bypass +*\*\param SHRTIMx Super High Resolution Timer instance +*\*\return +*\*\ - SHRTIM_AUXOUTPUT_DEFAULT aunxiliary output signals is follow main output +*\*\ - SHRTIM_AUXOUTPUT_FOLLOW_CROSSBAR aunxiliary output signals is follow crossbar +*\*\ - SHRTIM_AUXOUTPUT_FOLLOW_MAINOUTPUT aunxiliary output signals is follow main output +**/ +uint32_t SHRTIM_GetAuxliaryBypass(SHRTIM_Module *SHRTIMx) +{ + return READ_BIT(SHRTIMx->sCommonRegs.EXTEND, SHRITM_AUXOUTPUT_BYPASS); +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_smu.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_smu.c new file mode 100644 index 0000000000..1a1c2e01e9 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_smu.c @@ -0,0 +1,136 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_smu.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_smu.h" + +/* SMU Driving Functions Declaration */ + +/* SMU_Private_Defines */ + +/** +*\*\name SMU_GetM4BootAddr. +*\*\fun Read boot address of CM4 +*\*\param none +*\*\return CM4 boot address +**/ +uint32_t SMU_GetM4BootAddr( void ) +{ + return (*(uint32_t (*)(void))GET_M4ADDR)(); +} + +/** +*\*\name SMU_SetM4BootAddr. +*\*\fun Setting boot address of CM4 +*\*\param CM4 boot address +*\*\return Status flag +*\*\ -SMU_SUCCESS +*\*\ -SMU_ERR +**/ +uint32_t SMU_SetM4BootAddr( uint32_t addr ) +{ + return (*(uint32_t (*)(uint32_t))(SET_M4ADDR))( addr ); +} + +/** +*\*\name SMU_GetM7BootAddr. +*\*\fun Read boot address of CM7 +*\*\param none +*\*\return CM7 boot address +**/ +uint32_t SMU_GetM7BootAddr( void ) +{ + return (*(uint32_t (*)(void))GET_M7ADDR)(); +} + +/** +*\*\name SMU_SetM4BootAddr. +*\*\fun Setting boot address of CM7 +*\*\param CM7 boot address +*\*\return Status flag +*\*\ -SMU_SUCCESS +*\*\ -SMU_ERR +**/ +uint32_t SMU_SetM7BootAddr( uint32_t addr ) +{ + return (*(uint32_t (*)(uint32_t))(SET_M7ADDR))( addr ); +} + +/** +*\*\name SMU_EraseFlash. +*\*\fun Flash erase +*\*\param Flash start address, erase the 4KB sector where the start address is located +*\*\return Error flag +*\*\ -FLASH_SUCCESS +*\*\ -FLASH_FAILED +*\*\note Erase in 4KB units +**/ +uint32_t SMU_EraseFlash(uint32_t StrAddr) +{ + return (*(uint32_t (*)(uint32_t))(ER_FLASH))( StrAddr ); +} + +/** +*\*\name SMU_WriteFlash. +*\*\fun Write data to internal xSPI flash +*\*\param Flash start address +*\*\param The pointer of data buffer +*\*\param Data lenght +*\*\return Error flag +*\*\ -FLASH_SUCCESS +*\*\ -FLASH_FAILED +**/ +uint32_t SMU_WriteFlash(uint32_t StrAddr, uint8_t *SrcBuf, uint32_t Len) +{ + return (*(uint32_t (*)(uint32_t, uint8_t*, uint32_t))(WR_FLASH))( StrAddr, SrcBuf, Len ); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_spi.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_spi.c new file mode 100644 index 0000000000..5f7dfa4f5a --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_spi.c @@ -0,0 +1,962 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_spi.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_spi.h" +#include "n32h76x_78x_rcc.h" + +/* SPI Driving Functions Declaration */ + +/* SPI_Private_Defines */ + +/* SPI SPE mask */ +#define CTRL2_SPIEN_ENABLE ((uint16_t)0x0001U) +#define CTRL2_SPIEN_DISABLE ((uint16_t)0xFFFEU) + +/* SPI CRCNext mask */ +#define CTRL1_CRCNEXT_ENABLE ((uint16_t)0x0200U) + +/* SPI CRCEN mask */ +#define CTRL2_CRCEN_ENABLE ((uint16_t)0x0008U) +#define CTRL2_CRCEN_DISABLE ((uint16_t)0xFFF7U) + +/* SPI SSOE mask */ +#define CTRL1_SSOEN_ENABLE ((uint16_t)0x0400U) +#define CTRL1_SSOEN_DISABLE ((uint16_t)0xFBFFU) + +/* SPI registers Masks */ +#define CTRL1_CLR_MASK ((uint16_t)0xF9F7U) +#define I2SCFG_CLR_MASK ((uint16_t)0x05FCU) +#define I2SPR_CLEAR_Mask ((uint16_t)0x0FFFU) + +/* SPI or I2S mode selection masks */ +#define SPI_MODE_ENABLE ((uint16_t)0xFFFDU) +#define I2S_MODE_ENABLE ((uint16_t)0x0002U) + +/** +*\*\name SPI_I2S_DeInit. +*\*\fun Deinitializes the SPIx peripheral registers to their default reset values (Affects also the I2Ss) +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\return none +**/ +void SPI_I2S_DeInit(const SPI_Module* SPIx) +{ + + if (SPIx == SPI1) + { + /* Enable SPI1 reset state */ + RCC_EnableAPB2PeriphReset2(RCC_APB2_PERIPHRST_SPI1); + } + else if (SPIx == SPI2) + { + /* Enable SPI2 reset state */ + RCC_EnableAPB2PeriphReset2(RCC_APB2_PERIPHRST_SPI2); + } + else if(SPIx == SPI3) + { + /* Enable SPI3 reset state */ + RCC_EnableAPB1PeriphReset2(RCC_APB1_PERIPHRST_SPI3); + } + else if (SPIx == SPI4) + { + /* Enable SPI4 reset state */ + RCC_EnableAPB5PeriphReset1(RCC_APB5_PERIPHRST_SPI4); + } + else if (SPIx == SPI5) + { + /* Enable SPI5 reset state */ + RCC_EnableAPB5PeriphReset1(RCC_APB5_PERIPHRST_SPI5); + } + else if (SPIx == SPI6) + { + /* Enable SPI6 reset state */ + RCC_EnableAPB5PeriphReset1(RCC_APB5_PERIPHRST_SPI6); + } + else if (SPIx == SPI7) + { + /* Enable SPI7 reset state */ + RCC_EnableAPB5PeriphReset1(RCC_APB5_PERIPHRST_SPI7); + } + else {} +} + + +/** +*\*\name SPI_Init. +*\*\fun Initializes the SPIx peripheral according to the specified parameters in the SPI_InitStruct. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\param SPI_InitStruct : +*\*\ - DataDirection +*\*\ - SPI_DIR_DOUBLELINE_FULLDUPLEX +*\*\ - SPI_DIR_DOUBLELINE_RONLY +*\*\ - SPI_DIR_SINGLELINE_RX +*\*\ - SPI_DIR_SINGLELINE_TX +*\*\ - SpiMode +*\*\ - SPI_MODE_MASTER +*\*\ - SPI_MODE_SLAVE +*\*\ - DataLen +*\*\ - SPI_DATA_SIZE_16BITS +*\*\ - SPI_DATA_SIZE_8BITS +*\*\ - CLKPOL +*\*\ - SPI_CLKPOL_LOW +*\*\ - SPI_CLKPOL_HIGH +*\*\ - CLKPHA +*\*\ - SPI_CLKPHA_FIRST_EDGE +*\*\ - SPI_CLKPHA_SECOND_EDGE +*\*\ - NSS +*\*\ - SPI_NSS_SOFT +*\*\ - SPI_NSS_HARD +*\*\ - BaudRatePres +*\*\ - SPI_BR_PRESCALER_2 +*\*\ - SPI_BR_PRESCALER_4 +*\*\ - SPI_BR_PRESCALER_8 +*\*\ - SPI_BR_PRESCALER_16 +*\*\ - SPI_BR_PRESCALER_32 +*\*\ - SPI_BR_PRESCALER_64 +*\*\ - SPI_BR_PRESCALER_128 +*\*\ - SPI_BR_PRESCALER_256 +*\*\ - FirstBit +*\*\ - SPI_FB_MSB +*\*\ - SPI_FB_LSB +*\*\ - CRCPoly default 0x0007, max 0xffff +*\*\return none +**/ +void SPI_Init(SPI_Module* SPIx, const SPI_InitType* SPI_InitStruct) +{ + uint16_t tmpregister; + + /*---------------------------- SPIx CTRL1 Configuration ------------------------*/ + /* Get the SPIx CTRL1 value */ + tmpregister = SPIx->CTRL1; + /* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, MSTR, CPOL and CPHA bits */ + tmpregister &= CTRL1_CLR_MASK; + /* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler + master/salve mode, CPOL and CPHA */ + /* Set BIDImode, BIDIOE and RxONLY bits according to DataDirection value */ + /* Set SSM, SSI and MSTR bits according to SpiMode and NSS values */ + /* Set LSBFirst bit according to FirstBit value */ + /* Set BR bits according to BaudRatePres value */ + /* Set CPOL bit according to CLKPOL value */ + /* Set CPHA bit according to CLKPHA value */ + tmpregister |= (uint16_t)((uint32_t)SPI_InitStruct->DataDirection | SPI_InitStruct->SpiMode + | SPI_InitStruct->DataLen | SPI_InitStruct->CLKPOL | SPI_InitStruct->CLKPHA + | SPI_InitStruct->NSS | SPI_InitStruct->BaudRatePres | SPI_InitStruct->FirstBit); + /* Write to SPIx CTRL1 */ + SPIx->CTRL1 = tmpregister; + + /* Activate the SPI mode (Reset I2SMOD bit in SPI_I2S_CFGR register) */ + SPIx->SPI_I2S_CFGR &= SPI_MODE_ENABLE; + + /*---------------------------- SPIx CRCPOLY Configuration --------------------*/ + /* Write to SPIx CRCPOLY */ + SPIx->CRCPOLY = SPI_InitStruct->CRCPoly; +} + +/** +*\*\name SPI_InitStruct. +*\*\fun Fills each SPI_InitStruct member with its default value. +*\*\param SPI_InitStruct : +*\*\ - DataDirection +*\*\ - SpiMode +*\*\ - DataLen +*\*\ - CLKPOL +*\*\ - CLKPHA +*\*\ - NSS +*\*\ - BaudRatePres +*\*\ - FirstBit +*\*\ - CRCPoly +*\*\return none +**/ +void SPI_InitStruct(SPI_InitType* SPI_InitStruct) +{ + /*--------------- Reset SPI init structure parameters values -----------------*/ + /* Initialize the DataDirection member */ + SPI_InitStruct->DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX; + /* initialize the SpiMode member */ + SPI_InitStruct->SpiMode = SPI_MODE_SLAVE; + /* initialize the DataLen member */ + SPI_InitStruct->DataLen = SPI_DATA_SIZE_8BITS; + /* Initialize the CLKPOL member */ + SPI_InitStruct->CLKPOL = SPI_CLKPOL_LOW; + /* Initialize the CLKPHA member */ + SPI_InitStruct->CLKPHA = SPI_CLKPHA_FIRST_EDGE; + /* Initialize the NSS member */ + SPI_InitStruct->NSS = SPI_NSS_HARD; + /* Initialize the BaudRatePres member */ + SPI_InitStruct->BaudRatePres = SPI_BR_PRESCALER_2; + /* Initialize the FirstBit member */ + SPI_InitStruct->FirstBit = SPI_FB_MSB; + /* Initialize the CRCPoly member */ + SPI_InitStruct->CRCPoly = 7; +} + + +/** +*\*\name SPI_Enable. +*\*\fun Enables or disables the specified SPI peripheral. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SPI_Enable(SPI_Module* SPIx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SPI peripheral */ + SPIx->CTRL2 |= CTRL2_SPIEN_ENABLE; + } + else + { + /* Disable the selected SPI peripheral */ + SPIx->CTRL2 &= CTRL2_SPIEN_DISABLE; + } +} + +/** +*\*\name SPI_I2S_EnableInt. +*\*\fun Enables or disables the specified SPI/I2S interrupts. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_IT : +*\*\ - SPI_I2S_INT_TE +*\*\ - SPI_I2S_INT_RNE +*\*\ - SPI_I2S_INT_ERR +*\*\ - SPI_I2S_INT_RXONLYC +*\*\ - SPI_I2S_INT_RXFIFOF +*\*\ - SPI_I2S_INT_RXFIFOHF +*\*\ - SPI_I2S_INT_TXFIFOHE +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SPI_I2S_EnableInt(SPI_Module* SPIx, uint8_t SPI_I2S_IT, FunctionalState Cmd) +{ + uint16_t itpos, itmask; + + /* Get the SPI/I2S IT index */ + itpos = SPI_I2S_IT >> 4; + + /* Set the IT mask */ + itmask = (uint16_t)1 << (uint16_t)itpos; + + if (Cmd != DISABLE) + { + /* Enable the selected SPI/I2S interrupt */ + SPIx->CTRL2 |= itmask; + } + else + { + /* Disable the selected SPI/I2S interrupt */ + SPIx->CTRL2 &= (uint16_t)~itmask; + } +} + + +/** +*\*\name SPI_I2S_EnableDma. +*\*\fun Enables or disables the SPIx/I2Sx DMA interface. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_DMAReq : +*\*\ - SPI_I2S_DMA_TX +*\*\ - SPI_I2S_DMA_RX +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SPI_I2S_EnableDma(SPI_Module* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SPI/I2S DMA requests */ + SPIx->CTRL2 |= SPI_I2S_DMAReq; + } + else + { + /* Disable the selected SPI/I2S DMA requests */ + SPIx->CTRL2 &= (uint16_t)~SPI_I2S_DMAReq; + } +} + + +/** +*\*\name SPI_I2S_TransmitData. +*\*\fun Transmits a Data through the SPIx/I2Sx peripheral. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param Data \* Data to be transmitted *\ +*\*\return none +**/ +void SPI_I2S_TransmitData(SPI_Module* SPIx, uint16_t Data) +{ + /* Write in the DAT register the data to be sent */ + SPIx->DAT = Data; +} + + +/** +*\*\name SPI_I2S_ReceiveData. +*\*\fun Returns the most recent received data by the SPIx/I2Sx peripheral. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\return The data in the SPI_DAT register. +**/ +uint16_t SPI_I2S_ReceiveData(const SPI_Module* SPIx) +{ + /* Return the data in the DAT register */ + return SPIx->DAT; +} + + +/** +*\*\name SPI_SetNssLevel. +*\*\fun Configures internally by software the NSS pin for the selected SPI. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\param SPI_NSSInternalSoft : +*\*\ - SPI_NSS_HIGH +*\*\ - SPI_NSS_LOW +*\*\return none +**/ +void SPI_SetNssLevel(SPI_Module* SPIx, uint16_t SPI_NSSInternalSoft) +{ + if (SPI_NSSInternalSoft != SPI_NSS_LOW) + { + /* Set NSS pin internally by software */ + SPIx->CTRL1 |= SPI_NSS_HIGH; + } + else + { + /* Reset NSS pin internally by software */ + SPIx->CTRL1 &= SPI_NSS_LOW; + } +} + + +/** +*\*\name SPI_SSOutputEnable. +*\*\fun Enables or disables the SS output for the selected SPI. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SPI_SSOutputEnable(SPI_Module* SPIx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SPI SS output */ + SPIx->CTRL1 |= CTRL1_SSOEN_ENABLE; + } + else + { + /* Disable the selected SPI SS output */ + SPIx->CTRL1 &= CTRL1_SSOEN_DISABLE; + } +} + +/** +*\*\name SPI_ConfigDataLen. +*\*\fun Configures the data size for the selected SPI. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\param DataLen : +*\*\ - SPI_DATA_SIZE_16BITS +*\*\ - SPI_DATA_SIZE_8BITS +*\*\return none +**/ +void SPI_ConfigDataLen(SPI_Module* SPIx, uint16_t DataLen) +{ + /* Clear DFF bit */ + SPIx->CTRL1 &= (uint16_t)~SPI_DATA_SIZE_16BITS; + /* Set new DFF bit value */ + SPIx->CTRL1 |= DataLen; +} + + +/** +*\*\name SPI_TransmitCrcNext. +*\*\fun Transmit the SPIx CRC value. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SPI_TransmitCrcNext(SPI_Module* SPIx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SPI CRC transmission */ + SPIx->CTRL1 |= CTRL1_CRCNEXT_ENABLE; + } + else + { + /* Disable the selected SPI CRC transmission */ + SPIx->CTRL1 &= (~CTRL1_CRCNEXT_ENABLE); + } +} + + +/** +*\*\name SPI_EnableCalculateCrc. +*\*\fun Enables or disables the CRC value calculation of the transferred bytes. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void SPI_EnableCalculateCrc(SPI_Module* SPIx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected SPI CRC calculation */ + SPIx->CTRL2 |= CTRL2_CRCEN_ENABLE; + } + else + { + /* Disable the selected SPI CRC calculation */ + SPIx->CTRL2 &= CTRL2_CRCEN_DISABLE; + } +} + +/** +*\*\name SPI_GetCRCDat. +*\*\fun Returns the transmit or the receive CRC register value for the specified SPI. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\param Cmd : +*\*\ - SPI_CRC_TX +*\*\ - SPI_CRC_RX +*\*\return Tx/Rx CRC register value. +**/ +uint16_t SPI_GetCRCDat(const SPI_Module* SPIx, uint8_t SPI_CRC) +{ + uint16_t crcreg; + + if (SPI_CRC != SPI_CRC_RX) + { + /* Get the Tx CRC register */ + crcreg = SPIx->CRCTDAT; + } + else + { + /* Get the Rx CRC register */ + crcreg = SPIx->CRCRDAT; + } + + /* Return the selected CRC register */ + return crcreg; +} + +/** +*\*\name SPI_GetCRCPoly. +*\*\fun Returns the CRC Polynomial register value for the specified SPI. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\return The CRC Polynomial register value. +**/ +uint16_t SPI_GetCRCPoly(const SPI_Module* SPIx) +{ + /* Return the CRC polynomial register */ + return SPIx->CRCPOLY; +} + +/** +*\*\name SPI_SetCRCPoly. +*\*\fun Set the CRC Polynomial register value for the specified SPI. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\return The CRC Polynomial register value. +**/ +void SPI_SetCRCPoly(SPI_Module* SPIx, uint16_t SpiCrcPoly) +{ + /* Write to SPIx CRCPOLY */ + SPIx->CRCPOLY = SpiCrcPoly; + return; +} + +/** +*\*\name SPI_ConfigBidirectionalMode. +*\*\fun Selects the data transfer direction in bi-directional mode for the specified SPI. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\param DataDirection : +*\*\ - SPI_BIDIRECTION_TX +*\*\ - SPI_BIDIRECTION_RX +*\*\return none. +**/ +void SPI_ConfigBidirectionalMode(SPI_Module* SPIx, uint16_t DataDirection) +{ + if (DataDirection == SPI_BIDIRECTION_TX) + { + /* Set the Tx only mode */ + SPIx->CTRL1 |= SPI_BIDIRECTION_TX; + } + else + { + /* Set the Rx only mode */ + SPIx->CTRL1 &= SPI_BIDIRECTION_RX; + } +} + + +/** +*\*\name SPI_SetDataDirection. +*\*\fun Selects the data transfer direction in bi-directional mode for the specified SPI. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\param DataDirection : +*\*\ - SPI_DIR_DOUBLELINE_FULLDUPLEX +*\*\ - SPI_DIR_DOUBLELINE_RONLY +*\*\ - SPI_DIR_DOUBLELINE_TONLY +*\*\ - SPI_DIR_SINGLELINE_RX +*\*\ - SPI_DIR_SINGLELINE_TX +*\*\return none. +**/ +void SPI_SetDataDirection(SPI_Module* SPIx, uint16_t DataDirection) +{ + uint16_t tmpregister; + /* Get the SPIx CTRL1 value */ + tmpregister = SPIx->CTRL1; + /* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, MSTR, CPOL and CPHA bits */ + tmpregister &= SPI_DIR_MASK; + tmpregister |= DataDirection; + SPIx->CTRL1 = tmpregister; +} + +/** +*\*\name SPI_I2S_GetStatus. +*\*\fun Checks whether the specified SPI/I2S flag is set or not. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_FLAG : +*\*\ - SPI_I2S_BUSY_FLAG +*\*\ - SPI_I2S_OVER_FLAG +*\*\ - SPI_MODERR_FLAG +*\*\ - SPI_CRCERR_FLAG +*\*\ - I2S_UNDER_FLAG +*\*\ - I2S_CHSIDE_FLAG +*\*\ - SPI_I2S_TE_FLAG +*\*\ - SPI_I2S_RNE_FLAG +*\*\ - SPI_I2S_RXONLYC_FLAG +*\*\ - SPI_I2S_RXFIFOF_FLAG +*\*\ - SPI_I2S_TXFIFOE_FLAG +*\*\ - SPI_I2S_RXFIFOHF_FLAG +*\*\ - SPI_I2S_TXFIFOHE_FLAG +*\*\return The new state of SPI_I2S_FLAG (SET or RESET). +**/ +FlagStatus SPI_I2S_GetStatus(const SPI_Module* SPIx, uint16_t SPI_I2S_FLAG) +{ + FlagStatus bitstatus; + + /* Check the status of the specified SPI/I2S flag */ + if ((SPIx->STS & SPI_I2S_FLAG) != (uint16_t)RESET) + { + /* SPI_I2S_FLAG is set */ + bitstatus = SET; + } + else + { + /* SPI_I2S_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the SPI_I2S_FLAG status */ + return bitstatus; +} + +/** +*\*\name SPI_I2S_ClrCRCErrFlag. +*\*\fun Clears the SPIx CRC Error (CRCERR) flag. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 +*\*\param SPI_I2S_FLAG : +*\*\ - SPI_CRCERR_FLAG +*\*\return none. +**/ +void SPI_I2S_ClrCRCErrFlag(SPI_Module* SPIx, uint16_t SPI_I2S_FLAG) +{ + /* Clear the selected SPI CRC Error (CRCERR) flag */ + SPIx->STS = (uint16_t)~SPI_I2S_FLAG; +} + +/** +*\*\name SPI_I2S_GetIntStatus. +*\*\fun Checks whether the specified SPI/I2S interrupt has occurred or not. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_IT : +*\*\ - SPI_I2S_INT_TE +*\*\ - SPI_I2S_INT_RNE +*\*\ - SPI_I2S_INT_RXONLYC +*\*\ - SPI_I2S_INT_RXFIFOF +*\*\ - SPI_I2S_INT_RXFIFOHF +*\*\ - SPI_I2S_INT_TXFIFOHE +*\*\ - SPI_I2S_INT_CRCERR +*\*\ - SPI_I2S_INT_MODERR +*\*\ - SPI_I2S_INT_OVERERR +*\*\ - I2S_I2S_INT_UNDER +*\*\return The new state of SPI_I2S_IT (SET or RESET). +**/ + +INTStatus SPI_I2S_GetIntStatus(const SPI_Module* SPIx, uint8_t SPI_I2S_IT) +{ + INTStatus bitstatus = RESET; + uint16_t itpos = 0, itmask = 0, enablestatus = 0; + + /* Get the SPI/I2S IT index */ + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + + /* Get the SPI/I2S IT mask */ + itmask = SPI_I2S_IT >> 4; + + /* Set the IT mask */ + itmask = 0x01 << itmask; + + /* Get the SPI_I2S_IT enable bit status */ + enablestatus = (SPIx->CTRL2 & itmask); + + /* Check the status of the specified SPI/I2S interrupt */ + if (((SPIx->STS & itpos) != (uint16_t)RESET) && enablestatus) + { + /* SPI_I2S_IT is set */ + bitstatus = SET; + } + else + { + /* SPI_I2S_IT is reset */ + bitstatus = RESET; + } + + /* Return the SPI_I2S_IT status */ + return bitstatus; +} + +/** +*\*\name SPI_I2S_ClrITPendingBit. +*\*\fun Clears the SPIx CRC Error (CRCERR) interrupt pending bit. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_IT : +*\*\ - SPI_I2S_INT_TE +*\*\ - SPI_I2S_INT_RNE +*\*\ - SPI_I2S_INT_ERR +*\*\ - SPI_I2S_INT_RXONLYC +*\*\ - SPI_I2S_INT_RXFIFOF +*\*\ - SPI_I2S_INT_RXFIFOHF +*\*\ - SPI_I2S_INT_TXFIFOHE +*\*\ - SPI_I2S_INT_MODERR +*\*\ - SPI_I2S_INT_CRCERR +*\*\ - SPI_I2S_INT_OVERERR +*\*\ - SPI_I2S_INT_UNDER +*\*\return none. +**/ +void SPI_I2S_ClrITPendingBit(SPI_Module* SPIx, uint8_t SPI_I2S_IT) +{ + uint16_t itpos; + + /* Get the SPI IT index */ + itpos = 0x0001 << (SPI_I2S_IT & 0x0F); + + /* Clear the selected SPI CRC Error (CRCERR) interrupt pending bit */ + SPIx->STS = (uint16_t)~itpos; +} + +/** +*\*\name SPI_I2S_FIFO_Cmd. +*\*\fun Enables or disables the FIFO (in SPI/I2S mode). +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void SPI_I2S_FIFO_Cmd(SPI_Module* SPIx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the FIFO (in SPI/I2S mode) */ + SPIx->CTRL2 |= SPI_I2S_FIFO_Enable; + } + else + { + /* Disable the FIFO (in SPI/I2S mode) */ + SPIx->CTRL2 &= SPI_I2S_FIFO_Disable; + } +} + +/** +*\*\name SPI_I2S_ClearFIFOBit. +*\*\fun Clears the SPIx FIFO bit. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_I2S_FIFO_Clear : +*\*\ - SPI_I2S_FIFO_CLR +*\*\return none. +**/ +void SPI_I2S_ClearFIFOBit(SPI_Module* SPIx, uint16_t SPI_I2S_FIFO_Clear) +{ + /* Clear the FIFO bit */ + SPIx->CTRL2 |= SPI_I2S_FIFO_Clear; + SPIx->CTRL2 &= ~SPI_I2S_FIFO_Clear; +} + +/** +*\*\name SPI_RxFIFOSizeConfig. +*\*\fun Configures the Rx FIFO size for the selected SPI. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_FIFOSize : +*\*\ - SPI_RX_FIF0NUM_7 +*\*\ - SPI_RX_FIF0NUM_6 +*\*\ - SPI_RX_FIF0NUM_5 +*\*\ - SPI_RX_FIF0NUM_4 +*\*\ - SPI_RX_FIF0NUM_3 +*\*\ - SPI_RX_FIF0NUM_2 +*\*\ - SPI_RX_FIF0NUM_1 +*\*\ - SPI_RX_FIF0NUM_0 +*\*\return none. +**/ +void SPI_RxFIFOSizeConfig(SPI_Module* SPIx, uint16_t SPI_FIFOSize) +{ + /* Clear DFF bit */ + SPIx->FIFONUM &= (uint16_t)~SPI_RX_FIF0NUM_7; + /* Set new DFF bit value */ + SPIx->FIFONUM |= SPI_FIFOSize; +} + +/** +*\*\name SPI_TxFIFOSizeConfig. +*\*\fun Configures the Tx FIFO size for the selected SPI. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param SPI_FIFOSize : +*\*\ - SPI_TX_FIF0NUM_7 +*\*\ - SPI_TX_FIF0NUM_6 +*\*\ - SPI_TX_FIF0NUM_5 +*\*\ - SPI_TX_FIF0NUM_4 +*\*\ - SPI_TX_FIF0NUM_3 +*\*\ - SPI_TX_FIF0NUM_2 +*\*\ - SPI_TX_FIF0NUM_1 +*\*\ - SPI_TX_FIF0NUM_0 +*\*\return none. +**/ +void SPI_TxFIFOSizeConfig(SPI_Module* SPIx, uint16_t SPI_FIFOSize) +{ + /* Clear DFF bit */ + SPIx->FIFONUM &= (uint16_t)~SPI_TX_FIF0NUM_7; + /* Set new DFF bit value */ + SPIx->FIFONUM |= SPI_FIFOSize; +} + +uint16_t SPI_GetFIFOLevel(SPI_Module* SPIx) +{ + return SPIx->FIFONUM; +} +/** +*\*\name SPI_RX_FIFO_SET. +*\*\fun In FIFIO mode, write the data in the receiving FIFO. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param Data \* Data to be transmitted *\ +*\*\return none. +**/ +void SPI_RX_FIFO_SET(SPI_Module* SPIx, uint16_t Data) +{ + /* Write in the RX_FIFO register the data to be sent */ + SPIx->RX_FIFO = Data; +} + +/** +*\*\name SPI_RX_FIFO_GET. +*\*\fun In FIFIO mode, read the data in the receiving FIFO. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\return Receive data in FIFO. +**/ +uint16_t SPI_RX_FIFO_GET(const SPI_Module* SPIx) +{ + /* Return the data in the receive FIFO */ + return SPIx->RX_FIFO; +} + +/** +*\*\name SPI_RX_FIFO_CNT_GET. +*\*\fun In FIFO mode, the current number of valid FIFOs. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\return Current effective number of FIFOs. +**/ +uint16_t SPI_RX_FIFO_CNT_GET(const SPI_Module* SPIx) +{ + /* Return The RX Data Count in FIFO*/ + return ((uint8_t)((SPIx->FIFOCNT & 0x00F0U) >> 4)); +} + +/** +*\*\name SPI_TX_FIFO_CNT_GET. +*\*\fun In FIFO mode, the current number of valid FIFOs. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\return Current effective number of FIFOs. +**/ +uint16_t SPI_TX_FIFO_CNT_GET(const SPI_Module* SPIx) +{ + /* Return the TX Data Count in FIFO*/ + return ((uint8_t)(SPIx->FIFOCNT & 0x000FU)); +} + +/** +*\*\name SPI_TRANSNUM_SET. +*\*\fun When in FIFO mode with CRC function, +*\*\ the user needs to write the number of data to be transmitted in advance. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\param Data \* Data to be transmitted *\ +*\*\return none. +**/ +void SPI_TRANSNUM_SET(SPI_Module* SPIx, uint16_t Data) +{ + /* Write in the TRANSNUM register the data to be sent */ + SPIx->TRANSNUM = Data; +} + +/** +*\*\name SPI_TRANSNUM_GET. +*\*\fun When in FIFO mode with CRC function, +*\*\ the user write the number of data to be transmitted in advance. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\ - 2 or 3 in I2S mode +*\*\return The number of data transferred. +**/ +uint16_t SPI_TRANSNUM_GET(const SPI_Module* SPIx) +{ + /* Return the number of data transferred. */ + return SPIx->TRANSNUM; +} + +/** +*\*\name SPI_DELAYTIME_SET. +*\*\fun SPI master clock delay time configuration. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\param Data \* Data to be transmitted *\ +*\*\return none. +**/ +void SPI_DELAYTIME_SET(SPI_Module* SPIx, uint16_t Data) +{ + /* Write in the CR3 register the data to be sent */ + SPIx->CR3 = Data; +} + +/** +*\*\name SPI_DELAYTIME_GET. +*\*\fun Get SPI master clock delay time. +*\*\param SPIx : +*\*\ - 1, 2, 3, 4, 5 or 6 in SPI mode +*\*\return The clock delay time. +**/ +uint16_t SPI_DELAYTIME_GET(const SPI_Module* SPIx) +{ + /* Return clock delay time. */ + return SPIx->CR3; +} + + +/** +*\*\name SPI_Mode_Select. +*\*\fun Select working on SPI mode or I2S mode. +*\*\param SPIx : +*\*\ - SPI1 +*\*\ - SPI2 +*\*\ - SPI3 +*\*\ - SPI4 +*\*\return none +*\*\note Must be used with I2S or SPI OFF. +**/ +void SPIModeSelect(SPI_Module* SPIx) +{ + /* Select the mode */ + SPIx->SPI_I2S_CFGR &= (~SPI_I2SCFG_I2SMOD); +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_tim.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_tim.c new file mode 100644 index 0000000000..94d31ff528 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_tim.c @@ -0,0 +1,6437 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_tim.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ + +#include "n32h76x_78x_tim.h" +#include "n32h76x_78x_rcc.h" + +/** +*\*\name TIM_DeInit +*\*\fun Deinitializes the TIMx registers. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\return none +**/ +void TIM_DeInit(TIM_Module* TIMx) +{ + if (TIMx == ATIM1) + { + RCC_EnableAPB2PeriphReset1(RCC_APB2_PERIPHRST_ATIM1); + } + else if (TIMx == ATIM2) + { + RCC_EnableAPB2PeriphReset1(RCC_APB2_PERIPHRST_ATIM2); + } + else if (TIMx == ATIM3) + { + RCC_EnableAPB5PeriphReset1(RCC_APB5_PERIPHRST_ATIM3); + } + else if (TIMx == ATIM4) + { + RCC_EnableAPB5PeriphReset1(RCC_APB5_PERIPHRST_ATIM4); + } + else if (TIMx == GTIMA1) + { + RCC_EnableAPB2PeriphReset1(RCC_APB2_PERIPHRST_GTIMA1); + } + else if (TIMx == GTIMA2) + { + RCC_EnableAPB2PeriphReset1(RCC_APB2_PERIPHRST_GTIMA2); + } + else if (TIMx == GTIMA3) + { + RCC_EnableAPB2PeriphReset1(RCC_APB2_PERIPHRST_GTIMA3); + } + else if (TIMx == GTIMA4) + { + RCC_EnableAPB1PeriphReset1(RCC_APB1_PERIPHRST_GTIMA4); + } + else if (TIMx == GTIMA5) + { + RCC_EnableAPB1PeriphReset2(RCC_APB1_PERIPHRST_GTIMA5); + } + else if (TIMx == GTIMA6) + { + RCC_EnableAPB1PeriphReset2(RCC_APB1_PERIPHRST_GTIMA6); + } + else if (TIMx == GTIMA7) + { + RCC_EnableAPB1PeriphReset2(RCC_APB1_PERIPHRST_GTIMA7); + } + else if (TIMx == GTIMB1) + { + RCC_EnableAPB1PeriphReset1(RCC_APB1_PERIPHRST_GTIMB1); + } + else if (TIMx == GTIMB2) + { + RCC_EnableAPB1PeriphReset1(RCC_APB1_PERIPHRST_GTIMB2); + } + else if (TIMx == GTIMB3) + { + RCC_EnableAPB1PeriphReset1(RCC_APB1_PERIPHRST_GTIMB3); + } + else if (TIMx == BTIM1) + { + RCC_EnableAPB1PeriphReset1(RCC_APB1_PERIPHRST_BTIM1); + } + else if (TIMx == BTIM2) + { + RCC_EnableAPB1PeriphReset1(RCC_APB1_PERIPHRST_BTIM2); + } + else if (TIMx == BTIM3) + { + RCC_EnableAPB1PeriphReset1(RCC_APB1_PERIPHRST_BTIM3); + } + else if (TIMx == BTIM4) + { + RCC_EnableAPB1PeriphReset1(RCC_APB1_PERIPHRST_BTIM4); + } + else + { + + } +} + +/** +*\*\name TIM_InitTimeBase +*\*\fun Initializes the TIMx time base unit. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param TIM_TimeBaseInitStruct: refer to the definition of TIM_TimeBaseInitType +*\*\ - Prescaler +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - CounterMode +*\*\ * TIM_CNT_MODE_UP +*\*\ * TIM_CNT_MODE_DOWN +*\*\ * TIM_CNT_MODE_CENTER_ALIGN1 +*\*\ * TIM_CNT_MODE_CENTER_ALIGN2 +*\*\ * TIM_CNT_MODE_CENTER_ALIGN3 +*\*\ - Period +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - ClkDiv +*\*\ * TIM_CLK_DIV1 +*\*\ * TIM_CLK_DIV2 +*\*\ * TIM_CLK_DIV4 +*\*\ - RepetCnt +*\*\ * 0x00 ~ 0xFF +*\*\ - CapCh1Sel +*\*\ * TIM_CAPCH1SEL_0 +*\*\ * TIM_CAPCH1SEL_1 +*\*\ * TIM_CAPCH1SEL_2 +*\*\ * TIM_CAPCH1SEL_3 +*\*\ * TIM_CAPCH1SEL_4 +*\*\ * TIM_CAPCH1SEL_5 +*\*\ * TIM_CAPCH1SEL_6 +*\*\ * TIM_CAPCH1SEL_7 +*\*\ - CapCh2Sel +*\*\ * TIM_CAPCH2SEL_0 +*\*\ * TIM_CAPCH2SEL_1 +*\*\ * TIM_CAPCH2SEL_2 +*\*\ * TIM_CAPCH2SEL_3 +*\*\ * TIM_CAPCH2SEL_4 +*\*\ * TIM_CAPCH2SEL_TIMXCAPLSE +*\*\ - CapCh3Sel +*\*\ * TIM_CAPCH3SEL_0 +*\*\ * TIM_CAPCH3SEL_1 +*\*\ * TIM_CAPCH3SEL_TIMXCAPLSI +*\*\ - CapCh4Sel +*\*\ * TIM_CAPCH4SEL_0 +*\*\ * TIM_CAPCH4SEL_1 +*\*\ * TIM_CAPCH4SEL_2 +*\*\ * TIM_CAPCH4SEL_TIMXCAPHSEDIV128 +*\*\ - EtrOrClr +*\*\ * TIM_ETRSEL +*\*\ * TIM_CLRSEL +*\*\ - CapEtrClrSel +*\*\ * TIM_CAPETRSEL_0 +*\*\ * TIM_CAPETRSEL_1 +*\*\ * TIM_CAPETRSEL_2 +*\*\ * TIM_CAPETRSEL_3 +*\*\ * TIM_CAPETRSEL_4 +*\*\ * TIM_CAPETRSEL_5 +*\*\ * TIM_CAPETRSEL_6 +*\*\ * TIM_CAPETRSEL_7 +*\*\ * TIM_CAPETRSEL_8 +*\*\ * TIM_CAPETRSEL_10 +*\*\ * TIM_CAPETRSEL_11 +*\*\ * TIM_CAPETRSEL_12 +*\*\ * TIM_CAPETRSEL_13 +*\*\ * TIM_OCCLRSEL_0 +*\*\ * TIM_OCCLRSEL_1 +*\*\ * TIM_OCCLRSEL_2 +*\*\ * TIM_OCCLRSEL_3 +*\*\ * TIM_OCCLRSEL_4 +*\*\ * TIM_OCCLRSEL_5 +*\*\ * TIM_OCCLRSEL_6 +*\*\ * TIM_OCCLRSEL_7 +*\*\return none +**/ +void TIM_InitTimeBase(TIM_Module* TIMx, TIM_TimeBaseInitType* TIM_TimeBaseInitStruct) +{ + uint32_t tmpctrl1, tmpinsel; + tmpctrl1 = TIMx->CTRL1; + + if ((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + /* Select the Counter Mode */ + tmpctrl1 &= (uint32_t)(~(TIM_CTRL1_DIR | TIM_CTRL1_CAMSEL)); + tmpctrl1 |= (uint32_t)TIM_TimeBaseInitStruct->CounterMode; + } + + if ((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + /* Set the clock division */ + tmpctrl1 &= (uint32_t)(~TIM_CTRL1_CLKD); + tmpctrl1 |= (uint32_t)TIM_TimeBaseInitStruct->ClkDiv; + } + + TIMx->CTRL1 = tmpctrl1; + + /* Set the Autoreload value */ + TIMx->AR = TIM_TimeBaseInitStruct->Period ; + + /* Set the Prescaler value */ + TIMx->PSC = TIM_TimeBaseInitStruct->Prescaler; + + if ((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + /* Set the Repetition Counter value */ + TIMx->REPCNT = TIM_TimeBaseInitStruct->RepetCnt; + } + + /* Generate an update event to reload the Prescaler and the Repetition counter + values immediately */ + TIMx->EVTGEN = TIM_PSC_RELOAD_MODE_IMMEDIATE; + + /* Channel 1/2/3/4 & OCxclr select capture in */ + tmpctrl1 = TIMx->CTRL1; + tmpinsel = TIMx->INSEL; + + /* Channel 1 select capture in */ + if (((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) && (TIMx != GTIMA1)) + { + /* Channel 1 select capture in */ + tmpinsel &= (uint32_t)(~TIM_INSEL_TI1S); + tmpinsel |= (uint32_t)TIM_TimeBaseInitStruct->CapCh1Sel; + } + else if (TIMx == GTIMA1) + { + /* Channel 1 select capture in */ + tmpctrl1 &= (uint32_t)(~TIM_CTRL1_C1SEL); + tmpinsel &= (uint32_t)(~TIM_INSEL_TI1S); + tmpinsel |= (uint32_t)TIM_TimeBaseInitStruct->CapCh1Sel; + } + else + { + } + + /* Channel 2 select capture in */ + if (((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) && (TIMx != GTIMA1)) + { + /* Channel 2 select capture in */ + tmpinsel &= (uint32_t)(~TIM_INSEL_TI2S); + tmpinsel |= (uint32_t)TIM_TimeBaseInitStruct->CapCh2Sel; + } + else if (TIMx == GTIMA1) + { + /* Channel 2 select capture in */ + tmpctrl1 &= (uint32_t)(~TIM_CTRL1_C2SEL); + tmpinsel &= (uint32_t)(~TIM_INSEL_TI2S); + + if ((TIM_TimeBaseInitStruct->CapCh2Sel != TIM_CAPCH2SEL_TIMXCAPLSE)) + { + tmpinsel |= (uint32_t)TIM_TimeBaseInitStruct->CapCh2Sel; + } + else /* TIM_CAPCH2SEL_TIMXCAPLSE */ + { + tmpctrl1 |= (uint32_t)TIM_TimeBaseInitStruct->CapCh2Sel; + } + } + else + { + } + + /* Channel 3 select capture in */ + if (((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) && (TIMx != GTIMA1)) + { + /* Channel 3 select capture in */ + tmpinsel &= (uint32_t)(~TIM_INSEL_TI3S); + tmpinsel |= (uint32_t)TIM_TimeBaseInitStruct->CapCh3Sel; + } + else if (TIMx == GTIMA1) + { + /* Channel 3 select capture in */ + tmpctrl1 &= (uint32_t)(~TIM_CTRL1_C3SEL); + tmpinsel &= (uint32_t)(~TIM_INSEL_TI3S); + + if ((TIM_TimeBaseInitStruct->CapCh3Sel != TIM_CAPCH3SEL_TIMXCAPLSI)) + { + tmpinsel |= (uint32_t)TIM_TimeBaseInitStruct->CapCh3Sel; + } + else /* TIM_CAPCH3SEL_TIMXCAPLSI */ + { + tmpctrl1 |= (uint32_t)TIM_TimeBaseInitStruct->CapCh3Sel; + } + } + else + { + } + + /* Channel 4 select capture in */ + if (((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) && (TIMx != GTIMA1)) + { + /* Channel 4 select capture in */ + tmpinsel &= (uint32_t)(~TIM_INSEL_TI4S); + tmpinsel |= (uint32_t)TIM_TimeBaseInitStruct->CapCh4Sel; + } + else if (TIMx == GTIMA1) + { + /* Channel 4 select capture in */ + tmpctrl1 &= (uint32_t)(~TIM_CTRL1_C4SEL); + tmpinsel &= (uint32_t)(~TIM_INSEL_TI4S); + + if ((TIM_TimeBaseInitStruct->CapCh4Sel != TIM_CAPCH4SEL_TIMXCAPHSEDIV128)) + { + tmpinsel |= (uint32_t)TIM_TimeBaseInitStruct->CapCh4Sel; + } + else /* TIM_CAPCH4SEL_TIMXCAPHSEDIV128 */ + { + tmpctrl1 |= (uint32_t)TIM_TimeBaseInitStruct->CapCh4Sel; + } + } + else + { + } + + /* CLR or ETR select capture in */ + if ((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + tmpctrl1 &= (uint32_t)(~TIM_CTRL1_CLRSEL); + tmpinsel &= (uint32_t)(~TIM_INSEL_ETRS); + tmpinsel &= (uint32_t)(~TIM_INSEL_CLRS); + + if ((TIM_TimeBaseInitStruct->EtrOrClr) == 0) + { + /* ETR select capture in */ + tmpinsel |= (uint32_t)TIM_TimeBaseInitStruct->CapEtrClrSel; + } + else + { + /* CLR select capture in */ + tmpctrl1 |= (uint32_t)TIM_CTRL1_CLRSEL; + tmpinsel |= (uint32_t)TIM_TimeBaseInitStruct->CapEtrClrSel; + } + } + + TIMx->CTRL1 = tmpctrl1; + TIMx->INSEL = tmpinsel; + +} + +/** +*\*\name TIM_InitOc1 +*\*\fun Initializes the TIMx Channel 1. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCInitStruct: refer to the definition of OCInitType +*\*\ - OCMode +*\*\ * TIM_OCMODE_TIMING +*\*\ * TIM_OCMODE_ACTIVE +*\*\ * TIM_OCMODE_INACTIVE +*\*\ * TIM_OCMODE_TOGGLE +*\*\ * TIM_FORCED_ACTION_INACTIVE +*\*\ * TIM_FORCED_ACTION_ACTIVE +*\*\ * TIM_OCMODE_PWM1 +*\*\ * TIM_OCMODE_PWM2 +*\*\ * TIM_OCMODE_OPMOD_RETRIG1 +*\*\ * TIM_OCMODE_OPMOD_RETRIG2 +*\*\ * TIM_OCMODE_COMBI_PWM1 +*\*\ * TIM_OCMODE_COMBI_PWM2 +*\*\ - OutputState +*\*\ * TIM_OUTPUT_STATE_DISABLE +*\*\ * TIM_OUTPUT_STATE_ENABLE +*\*\ - OutputNState +*\*\ * TIM_OUTPUT_NSTATE_DISABLE +*\*\ * TIM_OUTPUT_NSTATE_ENABLE +*\*\ - Pulse +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - OCPolarity +*\*\ * TIM_OC_POLARITY_HIGH +*\*\ * TIM_OC_POLARITY_LOW +*\*\ - OCNPolarity +*\*\ * TIM_OCN_POLARITY_HIGH +*\*\ * TIM_OCN_POLARITY_LOW +*\*\ - OCIdleState +*\*\ * TIM_OC_IDLE_STATE_SET +*\*\ * TIM_OC_IDLE_STATE_RESET +*\*\ - OCNIdleState +*\*\ * TIM_OCN_IDLE_STATE_SET +*\*\ * TIM_OCN_IDLE_STATE_RESET +*\*\return none +**/ +void TIM_InitOc1(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct) +{ + uint32_t tmpccmodx; + uint32_t tmpccen, tmpctrl2; + + /* Disable the Channel 1: Reset the CC1EN Bit */ + TIMx->CCEN &= (uint32_t)(~TIM_CCEN_CC1EN); + /* Get the TIMx_CCEN register value */ + tmpccen = TIMx->CCEN; + /* Get the TIMx_CTRL2 register value */ + tmpctrl2 = TIMx->CTRL2; + /* Get the TIMx_CCMOD1 register value */ + tmpccmodx = TIMx->CCMOD1; + + /* Reset the Output Compare Mode Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC1MD); + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC1MD_3); + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_CC1SEL); + /* Select the Output Compare Mode */ + tmpccmodx |= (uint32_t)(TIM_OCInitStruct->OCMode); + + /* Reset the Output Polarity level */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC1P); + /* Set the Output Compare Polarity */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OCPolarity); + /* Set the Output State */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OutputState); + + if ((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + /* Reset the Output N Polarity level */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC1NP); + /* Set the Output N Polarity */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OCNPolarity); + /* Reset the Output N State */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC1NEN); + /* Set the Output N State */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OutputNState); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI1); + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI1N); + /* Set the Output Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCIdleState); + /* Set the Output N Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCNIdleState); + } + + /* Write to TIMx_CTRL2 */ + TIMx->CTRL2 = tmpctrl2; + + /* Write to TIMx_CCMOD1 */ + TIMx->CCMOD1 = tmpccmodx; + + /* Set the Capture Compare Register value */ + TIMx->CCDAT1 = TIM_OCInitStruct->Pulse; + + /* Write to TIMx_CCEN */ + TIMx->CCEN = tmpccen; + +} + +/** +*\*\name TIM_InitOc2 +*\*\fun Initializes the TIMx Channel 2. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCInitStruct: refer to the definition of OCInitType +*\*\ - OCMode +*\*\ * TIM_OCMODE_TIMING +*\*\ * TIM_OCMODE_ACTIVE +*\*\ * TIM_OCMODE_INACTIVE +*\*\ * TIM_OCMODE_TOGGLE +*\*\ * TIM_FORCED_ACTION_INACTIVE +*\*\ * TIM_FORCED_ACTION_ACTIVE +*\*\ * TIM_OCMODE_PWM1 +*\*\ * TIM_OCMODE_PWM2 +*\*\ * TIM_OCMODE_OPMOD_RETRIG1 +*\*\ * TIM_OCMODE_OPMOD_RETRIG2 +*\*\ * TIM_OCMODE_COMBI_PWM1 +*\*\ * TIM_OCMODE_COMBI_PWM2 +*\*\ - OutputState +*\*\ * TIM_OUTPUT_STATE_DISABLE +*\*\ * TIM_OUTPUT_STATE_ENABLE +*\*\ - OutputNState +*\*\ * TIM_OUTPUT_NSTATE_DISABLE +*\*\ * TIM_OUTPUT_NSTATE_ENABLE +*\*\ - Pulse +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - OCPolarity +*\*\ * TIM_OC_POLARITY_HIGH +*\*\ * TIM_OC_POLARITY_LOW +*\*\ - OCNPolarity +*\*\ * TIM_OCN_POLARITY_HIGH +*\*\ * TIM_OCN_POLARITY_LOW +*\*\ - OCIdleState +*\*\ * TIM_OC_IDLE_STATE_SET +*\*\ * TIM_OC_IDLE_STATE_RESET +*\*\ - OCNIdleState +*\*\ * TIM_OCN_IDLE_STATE_SET +*\*\ * TIM_OCN_IDLE_STATE_RESET +*\*\return none +**/ +void TIM_InitOc2(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct) +{ + uint32_t tmpccmodx ; + uint32_t tmpccen, tmpctrl2; + + /* Disable the Channel 2: Reset the CC2EN Bit */ + TIMx->CCEN &= (uint32_t)(~TIM_CCEN_CC2EN); + + /* Get the TIMx_CCEN register value */ + tmpccen = TIMx->CCEN; + /* Get the TIMx_CTRL2 register value */ + tmpctrl2 = TIMx->CTRL2; + + /* Get the TIMx_CCMOD1 register value */ + tmpccmodx = TIMx->CCMOD1; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC2MD); + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC2MD_3); + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_CC2SEL); + + if (((TIM_OCInitStruct->OCMode) == TIM_OCMODE_OPMOD_RETRIG1) || ((TIM_OCInitStruct->OCMode) == TIM_OCMODE_OPMOD_RETRIG2) || \ + ((TIM_OCInitStruct->OCMode) == TIM_OCMODE_COMBI_PWM1) || ((TIM_OCInitStruct->OCMode) == TIM_OCMODE_COMBI_PWM2)) + { + /* Select the Output Compare Mode */ + tmpccmodx |= (uint32_t)(TIM_OCInitStruct->OCMode << 8); + tmpccmodx |= (uint32_t)TIM_CCMOD1_OC2MD_3; + } + else + { + /* Select the Output Compare Mode */ + tmpccmodx |= (uint32_t)(TIM_OCInitStruct->OCMode << 8); + } + + /* Reset the Output Polarity level */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC2P); + /* Set the Output Compare Polarity */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OCPolarity << 4); + /* Set the Output State */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OutputState << 4); + + if (IS_ATIM1_4_DEVICE(TIMx)) + { + /* Reset the Output N Polarity level */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC2NP); + /* Set the Output N Polarity */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OCNPolarity << 4); + /* Reset the Output N State */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC2NEN); + /* Set the Output N State */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OutputNState << 4); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI2); + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI2N); + /* Set the Output Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCIdleState << 2); + /* Set the Output N Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCNIdleState << 2); + } + + if (IS_GTIMB1_3_DEVICE(TIMx)) + { + /* Reset the Output Compare IDLE State */ + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI2); + /* Set the Output Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCIdleState << 2); + } + + /* Write to TIMx_CTRL2 */ + TIMx->CTRL2 = tmpctrl2; + + /* Write to TIMx_CCMOD1 */ + TIMx->CCMOD1 = tmpccmodx; + + /* Set the Capture Compare Register value */ + TIMx->CCDAT2 = TIM_OCInitStruct->Pulse; + + /* Write to TIMx_CCEN */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_InitOc3 +*\*\fun Initializes the TIMx Channel 3. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCInitStruct: refer to the definition of OCInitType +*\*\ - OCMode +*\*\ * TIM_OCMODE_TIMING +*\*\ * TIM_OCMODE_ACTIVE +*\*\ * TIM_OCMODE_INACTIVE +*\*\ * TIM_OCMODE_TOGGLE +*\*\ * TIM_FORCED_ACTION_INACTIVE +*\*\ * TIM_FORCED_ACTION_ACTIVE +*\*\ * TIM_OCMODE_PWM1 +*\*\ * TIM_OCMODE_PWM2 +*\*\ * TIM_OCMODE_OPMOD_RETRIG1 +*\*\ * TIM_OCMODE_OPMOD_RETRIG2 +*\*\ * TIM_OCMODE_COMBI_PWM1 +*\*\ * TIM_OCMODE_COMBI_PWM2 +*\*\ - OutputState +*\*\ * TIM_OUTPUT_STATE_DISABLE +*\*\ * TIM_OUTPUT_STATE_ENABLE +*\*\ - OutputNState +*\*\ * TIM_OUTPUT_NSTATE_DISABLE +*\*\ * TIM_OUTPUT_NSTATE_ENABLE +*\*\ - Pulse +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - OCPolarity +*\*\ * TIM_OC_POLARITY_HIGH +*\*\ * TIM_OC_POLARITY_LOW +*\*\ - OCNPolarity +*\*\ * TIM_OCN_POLARITY_HIGH +*\*\ * TIM_OCN_POLARITY_LOW +*\*\ - OCIdleState +*\*\ * TIM_OC_IDLE_STATE_SET +*\*\ * TIM_OC_IDLE_STATE_RESET +*\*\ - OCNIdleState +*\*\ * TIM_OCN_IDLE_STATE_SET +*\*\ * TIM_OCN_IDLE_STATE_RESET +*\*\return none +**/ +void TIM_InitOc3(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct) +{ + uint32_t tmpccmodx ; + uint32_t tmpccen, tmpctrl2 ; + + /* Disable the Channel 3: Reset the CC3EN Bit */ + TIMx->CCEN &= (uint32_t)(~TIM_CCEN_CC3EN); + + /* Get the TIMx_CCEN register value */ + tmpccen = TIMx->CCEN; + + /* Get the TIMx_CTRL2 register value */ + tmpctrl2 = TIMx->CTRL2; + + /* Get the TIMx_CCMOD2 register value */ + tmpccmodx = TIMx->CCMOD2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC3MD); + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC3MD_3); + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_CC3SEL); + /* Select the Output Compare Mode */ + tmpccmodx |= (uint32_t)(TIM_OCInitStruct->OCMode); + + /* Reset the Output Polarity level */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC3P); + /* Set the Output Compare Polarity */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OCPolarity << 8); + /* Set the Output State */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OutputState << 8); + + if (IS_ATIM1_4_DEVICE(TIMx)) + { + /* Reset the Output N Polarity level */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC3NP); + /* Set the Output N Polarity */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OCNPolarity << 8); + /* Reset the Output N State */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC3NEN); + /* Set the Output N State */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OutputNState << 8); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI3); + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI3N); + /* Set the Output Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCIdleState << 4); + /* Set the Output N Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCNIdleState << 4); + } + + if (IS_GTIMB1_3_DEVICE(TIMx)) + { + /* Reset the Output Compare IDLE State */ + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI3); + /* Set the Output Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCIdleState << 4); + } + + /* Write to TIMx_CTRL2 */ + TIMx->CTRL2 = tmpctrl2; + + /* Write to TIMx_CCMOD2 */ + TIMx->CCMOD2 = tmpccmodx; + + /* Set the Capture Compare Register value */ + TIMx->CCDAT3 = TIM_OCInitStruct->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_InitOc4 +*\*\fun Initializes the TIMx Channel 4. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCInitStruct: refer to the definition of OCInitType +*\*\ - OCMode +*\*\ * TIM_OCMODE_TIMING +*\*\ * TIM_OCMODE_ACTIVE +*\*\ * TIM_OCMODE_INACTIVE +*\*\ * TIM_OCMODE_TOGGLE +*\*\ * TIM_FORCED_ACTION_INACTIVE +*\*\ * TIM_FORCED_ACTION_ACTIVE +*\*\ * TIM_OCMODE_PWM1 +*\*\ * TIM_OCMODE_PWM2 +*\*\ * TIM_OCMODE_OPMOD_RETRIG1 +*\*\ * TIM_OCMODE_OPMOD_RETRIG2 +*\*\ * TIM_OCMODE_COMBI_PWM1 +*\*\ * TIM_OCMODE_COMBI_PWM2 +*\*\ - OutputState +*\*\ * TIM_OUTPUT_STATE_DISABLE +*\*\ * TIM_OUTPUT_STATE_ENABLE +*\*\ - OutputNState +*\*\ * TIM_OUTPUT_NSTATE_DISABLE +*\*\ * TIM_OUTPUT_NSTATE_ENABLE +*\*\ - Pulse +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - OCPolarity +*\*\ * TIM_OC_POLARITY_HIGH +*\*\ * TIM_OC_POLARITY_LOW +*\*\ - OCNPolarity +*\*\ * TIM_OCN_POLARITY_HIGH +*\*\ * TIM_OCN_POLARITY_LOW +*\*\ - OCIdleState +*\*\ * TIM_OC_IDLE_STATE_SET +*\*\ * TIM_OC_IDLE_STATE_RESET +*\*\ - OCNIdleState +*\*\ * TIM_OCN_IDLE_STATE_SET +*\*\ * TIM_OCN_IDLE_STATE_RESET +*\*\return none +**/ +void TIM_InitOc4(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct) +{ + uint32_t tmpccmodx ; + uint32_t tmpccen, tmpctrl2 ; + + /* Disable the Channel 2: Reset the CC4E Bit */ + TIMx->CCEN &= (uint32_t)(~TIM_CCEN_CC4EN); + + /* Get the TIMx_CCEN register value */ + tmpccen = TIMx->CCEN; + + /* Get the TIMx_CTRL2 register value */ + tmpctrl2 = TIMx->CTRL2; + + /* Get the TIMx_CCMOD2 register value */ + tmpccmodx = TIMx->CCMOD2; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC4MD); + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC4MD_3); + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_CC4SEL); + + if (((TIM_OCInitStruct->OCMode) == TIM_OCMODE_OPMOD_RETRIG1) || ((TIM_OCInitStruct->OCMode) == TIM_OCMODE_OPMOD_RETRIG2) || \ + ((TIM_OCInitStruct->OCMode) == TIM_OCMODE_COMBI_PWM1) || ((TIM_OCInitStruct->OCMode) == TIM_OCMODE_COMBI_PWM2)) + { + /* Select the Output Compare Mode */ + tmpccmodx |= (uint32_t)(TIM_OCInitStruct->OCMode << 8); + tmpccmodx |= (uint32_t)TIM_CCMOD2_OC4MD_3; + } + else + { + tmpccmodx |= (uint32_t)(TIM_OCInitStruct->OCMode << 8); + } + + /* Reset the Output Polarity level */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC4P); + /* Set the Output Compare Polarity */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OCPolarity << 12); + /* Set the Output State */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OutputState << 12); + + if ((IS_ATIM1_4_DEVICE(TIMx))) + { + /* Reset the Output N Polarity level */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC4NP) ; + /* Set the Output N Polarity */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OCNPolarity << 12); + /* Reset the Output N State */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC4NEN); + /* Set the Output N State */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OutputNState << 12); + + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI4); + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI4N); + /* Set the Output Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCIdleState << 6); + /* Set the Output N Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCNIdleState << 6); + } + + if (IS_GTIMB1_3_DEVICE(TIMx)) + { + /* Reset the Output Compare and Output Compare N IDLE State */ + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI4); + /* Set the Output Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCIdleState << 6); + } + + /* Write to TIMx_CTRL2 */ + TIMx->CTRL2 = tmpctrl2; + + /* Write to TIMx_CCMOD2 */ + TIMx->CCMOD2 = tmpccmodx; + + /* Set the Capture Compare Register value */ + TIMx->CCDAT4 = TIM_OCInitStruct->Pulse; + + /* Write to TIMx_CCEN */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_InitOc5 +*\*\fun Initializes the TIMx Channel 5. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCInitStruct: refer to the definition of OCInitType +*\*\ - OCMode +*\*\ * TIM_OCMODE_TIMING +*\*\ * TIM_OCMODE_ACTIVE +*\*\ * TIM_OCMODE_INACTIVE +*\*\ * TIM_OCMODE_TOGGLE +*\*\ * TIM_FORCED_ACTION_INACTIVE +*\*\ * TIM_FORCED_ACTION_ACTIVE +*\*\ * TIM_OCMODE_PWM1 +*\*\ * TIM_OCMODE_PWM2 +*\*\ - OutputState +*\*\ * TIM_OUTPUT_STATE_DISABLE +*\*\ * TIM_OUTPUT_STATE_ENABLE +*\*\ - OutputNState +*\*\ * TIM_OUTPUT_NSTATE_DISABLE +*\*\ * TIM_OUTPUT_NSTATE_ENABLE +*\*\ - Pulse +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - OCPolarity +*\*\ * TIM_OC_POLARITY_HIGH +*\*\ * TIM_OC_POLARITY_LOW +*\*\ - OCNPolarity +*\*\ * TIM_OCN_POLARITY_HIGH +*\*\ * TIM_OCN_POLARITY_LOW +*\*\ - OCIdleState +*\*\ * TIM_OC_IDLE_STATE_SET +*\*\ * TIM_OC_IDLE_STATE_RESET +*\*\ - OCNIdleState +*\*\ * TIM_OCN_IDLE_STATE_SET +*\*\ * TIM_OCN_IDLE_STATE_RESET +*\*\return none +**/ +void TIM_InitOc5(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct) +{ + uint32_t tmpccmodx ; + uint32_t tmpccen, tmpctrl2 ; + + /* Disable the Channel 5: Reset the CC5EN Bit */ + TIMx->CCEN &= (uint32_t)(~TIM_CCEN_CC5EN); + + /* Get the TIMx_CCEN register value */ + tmpccen = TIMx->CCEN; + + /* Get the TIMx_CTRL2 register value */ + tmpctrl2 = TIMx->CTRL2; + + /* Get the TIMx_CCMOD3 register value */ + tmpccmodx = TIMx->CCMOD3; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC5MD); + /* Select the Output Compare Mode */ + tmpccmodx |= (uint32_t)(TIM_OCInitStruct->OCMode); + + /* Reset the Output Polarity level */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC5P); + /* Set the Output Compare Polarity */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OCPolarity << 16); + /* Set the Output State */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OutputState << 16); + + /* Reset the Output Compare IDLE State */ + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI5); + /* Set the Output Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCIdleState << 8); + + /* Write to TIMx CR2 */ + TIMx->CTRL2 = tmpctrl2; + + /* Write to TIMx_CCMOD3 */ + TIMx->CCMOD3 = tmpccmodx; + + /* Set the Capture Compare Register value */ + TIMx->CCDAT5 = TIM_OCInitStruct->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_InitOc6 +*\*\fun Initializes the TIMx Channel 6. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_OCInitStruct: refer to the definition of OCInitType +*\*\ - OCMode +*\*\ * TIM_OCMODE_TIMING +*\*\ * TIM_OCMODE_ACTIVE +*\*\ * TIM_OCMODE_INACTIVE +*\*\ * TIM_OCMODE_TOGGLE +*\*\ * TIM_FORCED_ACTION_INACTIVE +*\*\ * TIM_FORCED_ACTION_ACTIVE +*\*\ * TIM_OCMODE_PWM1 +*\*\ * TIM_OCMODE_PWM2 +*\*\ - OutputState +*\*\ * TIM_OUTPUT_STATE_DISABLE +*\*\ * TIM_OUTPUT_STATE_ENABLE +*\*\ - OutputNState +*\*\ * TIM_OUTPUT_NSTATE_DISABLE +*\*\ * TIM_OUTPUT_NSTATE_ENABLE +*\*\ - Pulse +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - OCPolarity +*\*\ * TIM_OC_POLARITY_HIGH +*\*\ * TIM_OC_POLARITY_LOW +*\*\ - OCNPolarity +*\*\ * TIM_OCN_POLARITY_HIGH +*\*\ * TIM_OCN_POLARITY_LOW +*\*\ - OCIdleState +*\*\ * TIM_OC_IDLE_STATE_SET +*\*\ * TIM_OC_IDLE_STATE_RESET +*\*\ - OCNIdleState +*\*\ * TIM_OCN_IDLE_STATE_SET +*\*\ * TIM_OCN_IDLE_STATE_RESET +*\*\return none +**/ +void TIM_InitOc6(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct) +{ + uint32_t tmpccmodx ; + uint32_t tmpccen, tmpctrl2 ; + + /* Disable the Channel 6: Reset the CC6EN Bit */ + TIMx->CCEN &= (uint32_t)(~TIM_CCEN_CC6EN); + + /* Get the TIMx_CCEN register value */ + tmpccen = TIMx->CCEN; + + /* Get the TIMx_CTRL2 register value */ + tmpctrl2 = TIMx->CTRL2; + + /* Get the TIMx_CCMOD3 register value */ + tmpccmodx = TIMx->CCMOD3; + + /* Reset the Output Compare mode and Capture/Compare selection Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC6MD); + /* Select the Output Compare Mode */ + tmpccmodx |= (uint32_t)(TIM_OCInitStruct->OCMode << 8); + + /* Reset the Output Polarity level */ + tmpccen &= (uint32_t)(~TIM_CCEN_CC6P); + /* Set the Output Compare Polarity */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OCPolarity << 20); + /* Set the Output State */ + tmpccen |= (uint32_t)(TIM_OCInitStruct->OutputState << 20); + + /* Reset the Output Compare IDLE State */ + tmpctrl2 &= (uint32_t)(~TIM_CTRL2_OI6); + /* Set the Output Idle state */ + tmpctrl2 |= (uint32_t)(TIM_OCInitStruct->OCIdleState << 10); + + /* Write to TIMx CR2 */ + TIMx->CTRL2 = tmpctrl2; + + /* Write to TIMx_CCMOD3 */ + TIMx->CCMOD3 = tmpccmodx; + + /* Set the Capture Compare Register value */ + TIMx->CCDAT6 = TIM_OCInitStruct->Pulse; + + /* Write to TIMx CCER */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_ICInit +*\*\fun Initializes the TIM peripheral according to the specified +*\*\ parameters in the TIM_ICInitStruct. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_ICInitStruct: refer to the definition of TIM_ICInitType +*\*\ - Channel +*\*\ * TIM_CH_1 +*\*\ * TIM_CH_2 +*\*\ * TIM_CH_3 +*\*\ * TIM_CH_4 +*\*\ - ICPolarity +*\*\ * TIM_IC_POLARITY_RISING +*\*\ * TIM_IC_POLARITY_FALLING +*\*\ - ICSelection +*\*\ * TIM_IC_SELECTION_DIRECTTI +*\*\ * TIM_IC_SELECTION_INDIRECTTI +*\*\ * TIM_IC_SELECTION_TRC +*\*\ - ICPrescaler +*\*\ * TIM_IC_PSC_DIV1 +*\*\ * TIM_IC_PSC_DIV2 +*\*\ * TIM_IC_PSC_DIV4 +*\*\ * TIM_IC_PSC_DIV8 +*\*\ - ICFilter +*\*\ * ICFilter can be a number between 0x0 and 0xF +*\*\return none +**/ +void TIM_ICInit(TIM_Module* TIMx, TIM_ICInitType* TIM_ICInitStruct) +{ + if (TIM_ICInitStruct->Channel == TIM_CH_1) + { + /* TI1 Configuration */ + ConfigTI1(TIMx, TIM_ICInitStruct->ICPolarity, TIM_ICInitStruct->ICSelection, TIM_ICInitStruct->ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetInCap1Prescaler(TIMx, TIM_ICInitStruct->ICPrescaler); + } + else if (TIM_ICInitStruct->Channel == TIM_CH_2) + { + /* TI2 Configuration */ + ConfigTI2(TIMx, TIM_ICInitStruct->ICPolarity, TIM_ICInitStruct->ICSelection, TIM_ICInitStruct->ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetInCap2Prescaler(TIMx, TIM_ICInitStruct->ICPrescaler); + } + else if (TIM_ICInitStruct->Channel == TIM_CH_3) + { + /* TI3 Configuration */ + ConfigTI3(TIMx, TIM_ICInitStruct->ICPolarity, TIM_ICInitStruct->ICSelection, TIM_ICInitStruct->ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetInCap3Prescaler(TIMx, TIM_ICInitStruct->ICPrescaler); + } + else if (TIM_ICInitStruct->Channel == TIM_CH_4) + { + /* TI4 Configuration */ + ConfigTI4(TIMx, TIM_ICInitStruct->ICPolarity, TIM_ICInitStruct->ICSelection, TIM_ICInitStruct->ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetInCap4Prescaler(TIMx, TIM_ICInitStruct->ICPrescaler); + } + else + { + } +} + +/** +*\*\name TIM_ConfigPwmIc +*\*\fun Configures the TIM peripheral according to the specified +*\*\ parameters in the TIM_ICInitStruct to measure an external PWM signal. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_ICInitStruct: refer to the definition of TIM_ICInitType +*\*\ - Channel +*\*\ * TIM_CH_1 +*\*\ * TIM_CH_2 +*\*\ - ICPolarity +*\*\ * TIM_IC_POLARITY_RISING +*\*\ * TIM_IC_POLARITY_FALLING +*\*\ - ICSelection +*\*\ * TIM_IC_SELECTION_DIRECTTI +*\*\ * TIM_IC_SELECTION_INDIRECTTI +*\*\ - ICPrescaler +*\*\ * TIM_IC_PSC_DIV1 +*\*\ * TIM_IC_PSC_DIV2 +*\*\ * TIM_IC_PSC_DIV4 +*\*\ * TIM_IC_PSC_DIV8 +*\*\ - ICFilter +*\*\ * ICFilter can be a number between 0x0 and 0xF +*\*\return none +**/ +void TIM_ConfigPwmIc(TIM_Module* TIMx, TIM_ICInitType* TIM_ICInitStruct) +{ + uint32_t icoppositepolarity ; + uint32_t icoppositeselection ; + + /* Select the Opposite Input Polarity */ + if (TIM_ICInitStruct->ICPolarity == TIM_IC_POLARITY_RISING) + { + icoppositepolarity = TIM_IC_POLARITY_FALLING; + } + else + { + icoppositepolarity = TIM_IC_POLARITY_RISING; + } + + /* Select the Opposite Input */ + if (TIM_ICInitStruct->ICSelection == TIM_IC_SELECTION_DIRECTTI) + { + icoppositeselection = TIM_IC_SELECTION_INDIRECTTI; + } + else + { + icoppositeselection = TIM_IC_SELECTION_DIRECTTI; + } + + if (TIM_ICInitStruct->Channel == TIM_CH_1) + { + /* TI1 Configuration */ + ConfigTI1(TIMx, TIM_ICInitStruct->ICPolarity, TIM_ICInitStruct->ICSelection, TIM_ICInitStruct->ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetInCap1Prescaler(TIMx, TIM_ICInitStruct->ICPrescaler); + /* TI2 Configuration */ + ConfigTI2(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetInCap2Prescaler(TIMx, TIM_ICInitStruct->ICPrescaler); + } + else + { + /* TI2 Configuration */ + ConfigTI2(TIMx, TIM_ICInitStruct->ICPolarity, TIM_ICInitStruct->ICSelection, TIM_ICInitStruct->ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetInCap2Prescaler(TIMx, TIM_ICInitStruct->ICPrescaler); + /* TI1 Configuration */ + ConfigTI1(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->ICFilter); + /* Set the Input Capture Prescaler value */ + TIM_SetInCap1Prescaler(TIMx, TIM_ICInitStruct->ICPrescaler); + } +} + +/** +*\*\name TIM_ConfigBkdt +*\*\fun Configures the: Break feature, dead time, Lock level, the OSSI, +*\*\ the OSSR State and the AOE(automatic output enable). +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_BDTRInitStruct: refer to the definition of TIM_BDTRInitType +*\*\ - OSSRState +*\*\ * TIM_OSSR_STATE_ENABLE +*\*\ * TIM_OSSR_STATE_DISABLE +*\*\ - OSSIState +*\*\ * TIM_OSSI_STATE_ENABLE +*\*\ * TIM_OSSI_STATE_DISABLE +*\*\ - LOCKLevel +*\*\ * TIM_LOCK_LEVEL_OFF +*\*\ * TIM_LOCK_LEVEL_1 +*\*\ * TIM_LOCK_LEVEL_2 +*\*\ * TIM_LOCK_LEVEL_3 +*\*\ - DeadTime +*\*\ * DeadTime can be a number between 0x00 and 0xFF +*\*\ - Break +*\*\ * TIM_BREAK_IN_ENABLE +*\*\ * TIM_BREAK_IN_DISABLE +*\*\ - BreakPolarity +*\*\ * TIM_BREAK_POLARITY_LOW +*\*\ * TIM_BREAK_POLARITY_HIGH +*\*\ - Bidirection +*\*\ * TIM_BREAK_BID_ENABLE +*\*\ * TIM_BREAK_BID_DISABLE +*\*\ - AutomaticOutput +*\*\ * TIM_AUTO_OUTPUT_ENABLE +*\*\ * TIM_AUTO_OUTPUT_DISABLE +*\*\ - Break2 +*\*\ * TIM_BREAK2_IN_ENABLE +*\*\ * TIM_BREAK2_IN_DISABLE +*\*\ - Break2Polarity +*\*\ * TIM_BREAK2_POLARITY_LOW +*\*\ * TIM_BREAK2_POLARITY_HIGH +*\*\ - Bidirection2 +*\*\ * TIM_BREAK2_BID_ENABLE +*\*\ * TIM_BREAK2_BID_DISABLE +*\*\return none +**/ +void TIM_ConfigBkdt(TIM_Module* TIMx, TIM_BDTRInitType* TIM_BDTRInitStruct) +{ + uint32_t tmpbkdt; + + /* Set the Lock level, the OSSR State, the OSSI State, + the dead time value and the Automatic Output Enable Bit */ + tmpbkdt = TIMx->BKDT; + tmpbkdt &= (uint32_t)(~(TIM_BKDT_OSSR | TIM_BKDT_OSSI | TIM_BKDT_LCKCFG | TIM_BKDT_DTGN | TIM_BKDT_AOEN)); + tmpbkdt |= (uint32_t)(TIM_BDTRInitStruct->OSSRState | TIM_BDTRInitStruct->OSSIState | TIM_BDTRInitStruct->LOCKLevel | \ + TIM_BDTRInitStruct->DeadTime | TIM_BDTRInitStruct->AutomaticOutput); + + /* Set the Break enable Bit and the Ploarity */ + if ((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + tmpbkdt &= (uint32_t)(~(TIM_BKDT_BKEN | TIM_BKDT_BKP | TIM_BKDT_BRKBID)); + tmpbkdt |= (uint32_t)(TIM_BDTRInitStruct->Break | TIM_BDTRInitStruct->BreakPolarity | TIM_BDTRInitStruct->Bidirection); + } + + /* Set the Break2 enable Bit and the Ploarity */ + if (IS_ATIM1_4_DEVICE(TIMx)) + { + tmpbkdt &= (uint32_t)(~(TIM_BKDT_BK2EN | TIM_BKDT_BK2P | TIM_BKDT_BRK2BID)); + tmpbkdt |= (uint32_t)(TIM_BDTRInitStruct->Break2 | TIM_BDTRInitStruct->Break2Polarity | TIM_BDTRInitStruct->Bidirection2); + } + + TIMx->BKDT = tmpbkdt; +} + +/** +*\*\name TIM_BreakFiltConfig +*\*\fun Config the filter of break input. +*\*\param TIMx: +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_FiltInitStruct: +*\*\ - refer to the definition of TIM_FiltInitType +*\*\return none +**/ +void TIM_BreakFiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct) +{ + uint32_t tempbkfr; + + tempbkfr = TIMx->BKFR; + + tempbkfr &= (uint32_t)(((uint32_t) ~((uint32_t)TIM_BKFR_THRESH)) & + ((uint32_t) ~((uint32_t)TIM_BKFR_WSIZE)) & + ((uint32_t) ~((uint32_t)TIM_BKFR_SFPSC))); + + tempbkfr |= (uint32_t)((TIM_FiltInitStruct->ThreshHold << (uint32_t)(0x18)) | + (TIM_FiltInitStruct->WindowSize << (uint32_t)(0x11)) | + (TIM_FiltInitStruct->Prescaler)); + TIMx->BKFR = tempbkfr; + + +} + +/** +*\*\name TIM_Break2FiltConfig +*\*\fun Config the filter of break2 input. +*\*\param TIMx: +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_FiltInitStruct: +*\*\ - refer to the definition of TIM_FiltInitType +*\*\return none +**/ +void TIM_Break2FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct) +{ + uint32_t tempbkfr2; + + tempbkfr2 = TIMx->BKFR2; + + tempbkfr2 &= (uint32_t)(((uint32_t) ~((uint32_t)TIM_BKFR2_THRESH)) & + ((uint32_t) ~((uint32_t)TIM_BKFR2_WSIZE)) & + ((uint32_t) ~((uint32_t)TIM_BKFR2_SFPSC))); + + tempbkfr2 |= (uint32_t)((TIM_FiltInitStruct->ThreshHold << (uint32_t)(0x18)) | + (TIM_FiltInitStruct->WindowSize << (uint32_t)(0x11)) | + (TIM_FiltInitStruct->Prescaler)); + TIMx->BKFR2 = tempbkfr2; + +} + +/** +*\*\name TIM_BreakFiltEnable +*\*\fun Enable or disable the filter of break input. +*\*\param TIMx: +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_BreakFiltEnable(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the filter of break input */ + TIMx->BKFR |= (uint32_t)TIM_BKFR_FILTEN; + } + else + { + /* Disable the filter of break input */ + TIMx->BKFR &= (uint32_t)(~TIM_BKFR_FILTEN); + } +} + +/** +*\*\name TIM_Break2FiltEnable +*\*\fun Enable or disable the filter of break2 input. +*\*\param TIMx: +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_Break2FiltEnable(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the filter of break2 input */ + TIMx->BKFR2 |= (uint32_t)TIM_BKFR2_FILTEN; + } + else + { + /* Disable the filter of break2 input */ + TIMx->BKFR2 &= (uint32_t)(~TIM_BKFR2_FILTEN); + } +} + +/** +*\*\name TIM_BreakInputSourceEnable +*\*\fun Enable or disable the break input source , and set the polarity of the break input source. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Source +*\*\ - TIM_BREAK_LOCKUP +*\*\ - TIM_BREAK_PVD +*\*\ - TIM_BREAK_SMPAR +*\*\ - TIM_BREAK_FLECC +*\*\ - TIM_BREAK_SMECC +*\*\ - TIM_BREAK_IOM +*\*\ - TIM_BREAK_COMP1 +*\*\ - TIM_BREAK_COMP2 +*\*\ - TIM_BREAK_COMP3 +*\*\ - TIM_BREAK_DSMU0 +*\*\ - TIM_BREAK_DSMU1 +*\*\ - TIM_BREAK_DSMU2 +*\*\ - TIM_BREAK_DSMU3 +*\*\param Polarity +*\*\ - TIM_BREAK_SOURCE_POLARITY_INVERT +*\*\ - TIM_BREAK_SOURCE_POLARITY_NONINVERT +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_BreakInputSourceEnable(TIM_Module* TIMx, uint32_t Source, uint32_t Polarity, FunctionalState Cmd) +{ + uint32_t tempctrl1; + uint32_t tempaf1; + tempctrl1 = TIMx->CTRL1; + tempaf1 = TIMx->AF1; + + if (Cmd != DISABLE) + { + if (IS_SYS_BREAK(Source)) + { + tempctrl1 |= (uint32_t)(Source); + } + else + { + /* Enable break input source */ + tempaf1 |= (uint32_t)(Source); + /* Set break input source polarity */ + tempaf1 &= (uint32_t)(~((Source & 0x1F) << 9)); + tempaf1 |= (uint32_t)(Polarity & ((Source & 0x1F) << 9)); + } + + } + else + { + if (IS_SYS_BREAK(Source)) + { + tempctrl1 &= (uint32_t)(~Source); + } + else + { + /* Disable break input source */ + tempaf1 &= (uint32_t)(~Source); + /* Set break input source polarity */ + tempaf1 &= (uint32_t)(~((Source & 0x1F) << 9)); + tempaf1 |= (uint32_t)(Polarity & ((Source & 0x1F) << 9)); + } + } + + TIMx->CTRL1 = tempctrl1; + TIMx->AF1 = tempaf1; +} + +/** +*\*\name TIM_Break2InputSourceEnable +*\*\fun Enable or disable the break2 input source , and set the polarity of the break2 input source. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param Source +*\*\ - TIM_BREAK2_IOM +*\*\ - TIM_BREAK2_COMP1 +*\*\ - TIM_BREAK2_COMP2 +*\*\ - TIM_BREAK2_COMP3 +*\*\ - TIM_BREAK2_COMP4 +*\*\ - TIM_BREAK2_DSMU0 +*\*\ - TIM_BREAK2_DSMU1 +*\*\ - TIM_BREAK2_DSMU2 +*\*\ - TIM_BREAK2_DSMU3 +*\*\param Polarity +*\*\ - TIM_BREAK2_SOURCE_POLARITY_INVERT +*\*\ - TIM_BREAK2_SOURCE_POLARITY_NONINVERT +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_Break2InputSourceEnable(TIM_Module* TIMx, uint32_t Source, uint32_t Polarity, FunctionalState Cmd) +{ + uint32_t tempaf2; + tempaf2 = TIMx->AF2; + + if (Cmd != DISABLE) + { + /* Enable break2 input source */ + tempaf2 |= (uint32_t)(Source); + /* Set break2 input source polarity */ + tempaf2 &= (uint32_t)(~((Source & 0x1F) << 9)); + tempaf2 |= (uint32_t)(Polarity & ((Source & 0x1F) << 9)); + } + else + { + /* Disable break2 input source */ + tempaf2 &= (uint32_t)(~Source); + /* Set break2 input source polarity */ + tempaf2 &= (uint32_t)(~((Source & 0x1F) << 9)); + tempaf2 |= (uint32_t)(Polarity & ((Source & 0x1F) << 9)); + } + + TIMx->AF2 = tempaf2; +} + +/** +*\*\name TIM_BidirectionDisarm +*\*\fun Disarm bidirection of break. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\return none +**/ +void TIM_BidirectionDisarm(TIM_Module* TIMx) +{ + TIMx->BKDT |= (uint32_t)TIM_BKDT_BRKDSRM; +} + +/** +*\*\name TIM_BidirectionRearm +*\*\fun Rearm bidirection of break. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\return none +**/ +void TIM_BidirectionRearm(TIM_Module* TIMx) +{ + TIMx->BKDT &= (uint32_t)(~TIM_BKDT_BRKDSRM); +} + +/** +*\*\name TIM_Bidirection2Disarm +*\*\fun Disarm bidirection of break2. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\return none +**/ +void TIM_Bidirection2Disarm(TIM_Module* TIMx) +{ + TIMx->BKDT |= (uint32_t)TIM_BKDT_BRK2DSRM; +} + +/** +*\*\name TIM_Bidirection2Rearm +*\*\fun Rearm bidirection of break2. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\return none +**/ +void TIM_Bidirection2Rearm(TIM_Module* TIMx) +{ + TIMx->BKDT &= (uint32_t)(~TIM_BKDT_BRK2DSRM); +} + +/** +*\*\name TIM_InitTimBaseStruct +*\*\fun Fills each TIM_TimeBaseInitStruct member with its default value. +*\*\param TIM_TimeBaseInitStruct: refer to the definition of TIM_TimeBaseInitType +*\*\ - Prescaler +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - CounterMode +*\*\ * TIM_CNT_MODE_UP +*\*\ * TIM_CNT_MODE_DOWN +*\*\ * TIM_CNT_MODE_CENTER_ALIGN1 +*\*\ * TIM_CNT_MODE_CENTER_ALIGN2 +*\*\ * TIM_CNT_MODE_CENTER_ALIGN3 +*\*\ - Period +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - ClkDiv +*\*\ * TIM_CLK_DIV1 +*\*\ * TIM_CLK_DIV2 +*\*\ * TIM_CLK_DIV4 +*\*\ - RepetCnt +*\*\ * 0x00 ~ 0xFF +*\*\ - CapCh1Sel +*\*\ * TIM_CAPCH1SEL_0 +*\*\ * TIM_CAPCH1SEL_1 +*\*\ * TIM_CAPCH1SEL_2 +*\*\ * TIM_CAPCH1SEL_3 +*\*\ * TIM_CAPCH1SEL_4 +*\*\ * TIM_CAPCH1SEL_5 +*\*\ * TIM_CAPCH1SEL_6 +*\*\ * TIM_CAPCH1SEL_7 +*\*\ - CapCh2Sel +*\*\ * TIM_CAPCH2SEL_0 +*\*\ * TIM_CAPCH2SEL_1 +*\*\ * TIM_CAPCH2SEL_2 +*\*\ * TIM_CAPCH2SEL_3 +*\*\ * TIM_CAPCH2SEL_4 +*\*\ * TIM_CAPCH2SEL_TIMXCAPLSE +*\*\ - CapCh3Sel +*\*\ * TIM_CAPCH3SEL_0 +*\*\ * TIM_CAPCH3SEL_1 +*\*\ * TIM_CAPCH3SEL_TIMXCAPLSI +*\*\ - CapCh4Sel +*\*\ * TIM_CAPCH4SEL_0 +*\*\ * TIM_CAPCH4SEL_1 +*\*\ * TIM_CAPCH4SEL_2 +*\*\ * TIM_CAPCH4SEL_TIMXCAPHSEDIV128 +*\*\ - CapEtrClrSel +*\*\ * TIM_CAPETRSEL_0 +*\*\ * TIM_CAPETRSEL_1 +*\*\ * TIM_CAPETRSEL_2 +*\*\ * TIM_CAPETRSEL_3 +*\*\ * TIM_CAPETRSEL_4 +*\*\ * TIM_CAPETRSEL_5 +*\*\ * TIM_CAPETRSEL_6 +*\*\ * TIM_CAPETRSEL_7 +*\*\ * TIM_CAPETRSEL_8 +*\*\ * TIM_CAPETRSEL_10 +*\*\ * TIM_CAPETRSEL_11 +*\*\ * TIM_CAPETRSEL_12 +*\*\ * TIM_CAPETRSEL_13 +*\*\return none +**/ +void TIM_InitTimBaseStruct(TIM_TimeBaseInitType* TIM_TimeBaseInitStruct) +{ + /* Set the default configuration */ + TIM_TimeBaseInitStruct->Prescaler = 0x00000000; + TIM_TimeBaseInitStruct->CounterMode = TIM_CNT_MODE_UP; + TIM_TimeBaseInitStruct->Period = 0x0000FFFF; + TIM_TimeBaseInitStruct->ClkDiv = TIM_CLK_DIV1; + TIM_TimeBaseInitStruct->RepetCnt = 0x00000000; + + /* CH1/CH2/CH3/CH4/ETR from IOM */ + TIM_TimeBaseInitStruct->CapCh1Sel = TIM_CAPCH1SEL_0; + TIM_TimeBaseInitStruct->CapCh2Sel = TIM_CAPCH2SEL_0; + TIM_TimeBaseInitStruct->CapCh3Sel = TIM_CAPCH3SEL_0; + TIM_TimeBaseInitStruct->CapCh4Sel = TIM_CAPCH4SEL_0; + TIM_TimeBaseInitStruct->CapEtrClrSel = TIM_CAPETRSEL_0; +} + +/** +*\*\name TIM_InitOcStruct +*\*\fun Fills each TIM_OCInitStruct member with its default value. +*\*\param TIM_OCInitStruct: refer to the definition of OCInitType +*\*\ - OCMode +*\*\ * TIM_OCMODE_TIMING +*\*\ * TIM_OCMODE_ACTIVE +*\*\ * TIM_OCMODE_INACTIVE +*\*\ * TIM_OCMODE_TOGGLE +*\*\ * TIM_FORCED_ACTION_INACTIVE +*\*\ * TIM_FORCED_ACTION_ACTIVE +*\*\ * TIM_OCMODE_PWM1 +*\*\ * TIM_OCMODE_PWM2 +*\*\ * TIM_OCMODE_OPMOD_RETRIG1 +*\*\ * TIM_OCMODE_OPMOD_RETRIG2 +*\*\ * TIM_OCMODE_COMBI_PWM1 +*\*\ * TIM_OCMODE_COMBI_PWM2 +*\*\ - OutputState +*\*\ * TIM_OUTPUT_STATE_DISABLE +*\*\ * TIM_OUTPUT_STATE_ENABLE +*\*\ - OutputNState +*\*\ * TIM_OUTPUT_NSTATE_DISABLE +*\*\ * TIM_OUTPUT_NSTATE_ENABLE +*\*\ - Pulse +*\*\ * 0x0000 ~ 0xFFFF +*\*\ - OCPolarity +*\*\ * TIM_OC_POLARITY_HIGH +*\*\ * TIM_OC_POLARITY_LOW +*\*\ - OCNPolarity +*\*\ * TIM_OCN_POLARITY_HIGH +*\*\ * TIM_OCN_POLARITY_LOW +*\*\ - OCIdleState +*\*\ * TIM_OC_IDLE_STATE_SET +*\*\ * TIM_OC_IDLE_STATE_RESET +*\*\ - OCNIdleState +*\*\ * TIM_OCN_IDLE_STATE_SET +*\*\ * TIM_OCN_IDLE_STATE_RESET +*\*\return none +**/ +void TIM_InitOcStruct(OCInitType* TIM_OCInitStruct) +{ + /* Set the default configuration */ + TIM_OCInitStruct->OCMode = TIM_OCMODE_TIMING; + TIM_OCInitStruct->OutputState = TIM_OUTPUT_STATE_DISABLE; + TIM_OCInitStruct->OutputNState = TIM_OUTPUT_NSTATE_DISABLE; + TIM_OCInitStruct->Pulse = 0x00000000; + TIM_OCInitStruct->OCPolarity = TIM_OC_POLARITY_HIGH; + TIM_OCInitStruct->OCNPolarity = TIM_OCN_POLARITY_HIGH; + TIM_OCInitStruct->OCIdleState = TIM_OC_IDLE_STATE_RESET; + TIM_OCInitStruct->OCNIdleState = TIM_OCN_IDLE_STATE_RESET; +} + +/** +*\*\name TIM_InitIcStruct +*\*\fun Fills each TIM_ICInitStruct member with its default value. +*\*\param TIM_ICInitStruct: refer to the definition of TIM_ICInitType +*\*\ - Channel +*\*\ * TIM_CH_1 +*\*\ * TIM_CH_2 +*\*\ * TIM_CH_3 +*\*\ * TIM_CH_4 +*\*\ - ICPolarity +*\*\ * TIM_IC_POLARITY_RISING +*\*\ * TIM_IC_POLARITY_FALLING +*\*\ - ICSelection +*\*\ * TIM_IC_SELECTION_DIRECTTI +*\*\ * TIM_IC_SELECTION_INDIRECTTI +*\*\ * TIM_IC_SELECTION_TRC +*\*\ - ICPrescaler +*\*\ * TIM_IC_PSC_DIV1 +*\*\ * TIM_IC_PSC_DIV2 +*\*\ * TIM_IC_PSC_DIV4 +*\*\ * TIM_IC_PSC_DIV8 +*\*\ - ICFilter +*\*\ * ICFilter can be a number between 0x0 and 0xF +*\*\return none +**/ +void TIM_InitIcStruct(TIM_ICInitType* TIM_ICInitStruct) +{ + /* Set the default configuration */ + TIM_ICInitStruct->Channel = TIM_CH_1; + TIM_ICInitStruct->ICPolarity = TIM_IC_POLARITY_RISING; + TIM_ICInitStruct->ICSelection = TIM_IC_SELECTION_DIRECTTI; + TIM_ICInitStruct->ICPrescaler = TIM_IC_PSC_DIV1; + TIM_ICInitStruct->ICFilter = 0x00000000; +} + +/** +*\*\name TIM_InitBkdtStruct +*\*\fun Fills each TIM_BDTRInitStruct member with its default value. +*\*\param TIM_BDTRInitStruct: refer to the definition of TIM_BDTRInitType +*\*\ - OSSRState +*\*\ * TIM_OSSR_STATE_ENABLE +*\*\ * TIM_OSSR_STATE_DISABLE +*\*\ - OSSIState +*\*\ * TIM_OSSI_STATE_ENABLE +*\*\ * TIM_OSSI_STATE_DISABLE +*\*\ - LOCKLevel +*\*\ * TIM_LOCK_LEVEL_OFF +*\*\ * TIM_LOCK_LEVEL_1 +*\*\ * TIM_LOCK_LEVEL_2 +*\*\ * TIM_LOCK_LEVEL_3 +*\*\ - DeadTime +*\*\ * DeadTime can be a number between 0x00 and 0xFF +*\*\ - Break +*\*\ * TIM_BREAK_IN_ENABLE +*\*\ * TIM_BREAK_BID_DISABLE +*\*\ - BreakPolarity +*\*\ * TIM_BREAK_POLARITY_LOW +*\*\ * TIM_BREAK_POLARITY_HIGH +*\*\ - Bidirection +*\*\ * TIM_BREAK_BID_ENABLE +*\*\ * TIM_BREAK_BID_DISABLE +*\*\ - AutomaticOutput +*\*\ * TIM_AUTO_OUTPUT_ENABLE +*\*\ * TIM_AUTO_OUTPUT_DISABLE +*\*\ - Break2 +*\*\ * TIM_BREAK2_IN_ENABLE +*\*\ * TIM_BREAK2_IN_DISABLE +*\*\ - Break2Polarity +*\*\ * TIM_BREAK2_POLARITY_LOW +*\*\ * TIM_BREAK2_POLARITY_HIGH +*\*\ - Bidirection2 +*\*\ * TIM_BREAK2_BID_ENABLE +*\*\ * TIM_BREAK2_BID_DISABLE +*\*\return none +**/ +void TIM_InitBkdtStruct(TIM_BDTRInitType* TIM_BDTRInitStruct) +{ + /* Set the default configuration */ + TIM_BDTRInitStruct->OSSRState = TIM_OSSR_STATE_DISABLE; + TIM_BDTRInitStruct->OSSIState = TIM_OSSI_STATE_DISABLE; + TIM_BDTRInitStruct->LOCKLevel = TIM_LOCK_LEVEL_OFF; + TIM_BDTRInitStruct->DeadTime = 0x00000000; + TIM_BDTRInitStruct->Break = TIM_BREAK_IN_DISABLE; + TIM_BDTRInitStruct->BreakPolarity = TIM_BREAK_POLARITY_LOW; + TIM_BDTRInitStruct->Bidirection = TIM_BREAK_BID_DISABLE; + TIM_BDTRInitStruct->AutomaticOutput = TIM_AUTO_OUTPUT_DISABLE; + TIM_BDTRInitStruct->Break2 = TIM_BREAK2_IN_DISABLE; + TIM_BDTRInitStruct->Break2Polarity = TIM_BREAK2_POLARITY_LOW; + TIM_BDTRInitStruct->Bidirection2 = TIM_BREAK2_BID_DISABLE; +} + +/** +*\*\name TIM_Enable +*\*\fun Enables or disables the specified TIM peripheral. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_Enable(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the TIM Counter */ + TIMx->CTRL1 |= (uint32_t)TIM_CTRL1_CNTEN; + } + else + { + /* Disable the TIM Counter */ + TIMx->CTRL1 &= (uint32_t)(~TIM_CTRL1_CNTEN); + } +} + +/** +*\*\name TIM_EnableCtrlPwmOutputs +*\*\fun Enables or disables the TIM peripheral Main Outputs. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_EnableCtrlPwmOutputs(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the TIM Main Output */ + TIMx->BKDT |= (uint32_t)TIM_BKDT_MOEN; + } + else + { + /* Disable the TIM Main Output */ + TIMx->BKDT &= (uint32_t)(~TIM_BKDT_MOEN); + } +} + +/** +*\*\name TIM_ConfigInt +*\*\fun Enables or disables the specified TIM interrupts. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param TIM_IT: +*\*\ - TIM_INT_CC1 +*\*\ - TIM_INT_CC2 +*\*\ - TIM_INT_CC3 +*\*\ - TIM_INT_CC4 +*\*\ - TIM_INT_CC5 +*\*\ - TIM_INT_CC6 +*\*\ - TIM_INT_CC7 +*\*\ - TIM_INT_CC8 +*\*\ - TIM_INT_CC9 +*\*\ - TIM_INT_UPDATE +*\*\ - TIM_INT_TRIG +*\*\ - TIM_INT_BREAK +*\*\ - TIM_INT_COM +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_ConfigInt(TIM_Module* TIMx, uint32_t TIM_IT, FunctionalState Cmd) +{ + + if (Cmd != DISABLE) + { + /* Enable the Interrupt sources */ + TIMx->DINTEN |= (uint32_t)TIM_IT; + } + else + { + /* Disable the Interrupt sources */ + TIMx->DINTEN &= (uint32_t)(~(uint32_t)TIM_IT); + } +} + +/** +*\*\name TIM_GenerateEvent +*\*\fun Configures the TIMx event to be generate by software. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param TIM_EventSource: +*\*\ - TIM_EVT_SRC_CC1 +*\*\ - TIM_EVT_SRC_CC2 +*\*\ - TIM_EVT_SRC_CC3 +*\*\ - TIM_EVT_SRC_CC4 +*\*\ - TIM_EVT_SRC_UPDATE +*\*\ - TIM_EVT_SRC_COM +*\*\ - TIM_EVT_SRC_TRIG +*\*\ - TIM_EVT_SRC_BREAK +*\*\ - TIM_EVT_SRC_BREAK2 +*\*\return none +**/ +void TIM_GenerateEvent(TIM_Module* TIMx, uint32_t TIM_EventSource) +{ + /* Set the event sources */ + TIMx->EVTGEN = TIM_EventSource; +} + +/** +*\*\name TIM_ConfigDma +*\*\fun Configures the TIMx's DMA interface. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_DMABase: +*\*\ - TIM_DMABASE_CTRL1 +*\*\ - TIM_DMABASE_CTRL2 +*\*\ - TIM_DMABASE_STS +*\*\ - TIM_DMABASE_EVTGEN +*\*\ - TIM_DMABASE_SMCTRL +*\*\ - TIM_DMABASE_DMAINTEN +*\*\ - TIM_DMABASE_CAPCMPMOD1 +*\*\ - TIM_DMABASE_CAPCMPMOD2 +*\*\ - TIM_DMABASE_CAPCMPMOD3 +*\*\ - TIM_DMABASE_CAPCMPEN +*\*\ - TIM_DMABASE_CAPCMPDAT1 +*\*\ - TIM_DMABASE_CAPCMPDAT2 +*\*\ - TIM_DMABASE_CAPCMPDAT3 +*\*\ - TIM_DMABASE_CAPCMPDAT4 +*\*\ - TIM_DMABASE_CAPCMPDAT5 +*\*\ - TIM_DMABASE_CAPCMPDAT6 +*\*\ - TIM_DMABASE_PSC +*\*\ - TIM_DMABASE_AR +*\*\ - TIM_DMABASE_CNT +*\*\ - TIM_DMABASE_REPCNT +*\*\ - TIM_DMABASE_BKDT +*\*\ - TIM_DMABASE_CAPCMPDAT7 +*\*\ - TIM_DMABASE_CAPCMPDAT8 +*\*\ - TIM_DMABASE_CAPCMPDAT9 +*\*\ - TIM_DMABASE_BKFR +*\*\ - TIM_DMABASE_C1FILT +*\*\ - TIM_DMABASE_C2FILT +*\*\ - TIM_DMABASE_C3FILT +*\*\ - TIM_DMABASE_C4FILT +*\*\ - TIM_DMABASE_FILTO +*\*\ - TIM_DMABASE_INSEL +*\*\ - TIM_DMABASE_AF1 +*\*\ - TIM_DMABASE_AF2 +*\*\ - TIM_DMABASE_BKFR2 +*\*\ - TIM_DMABASE_SLIDFPSC +*\*\param TIM_DMABurstLength: +*\*\ - This parameter can be one value between: +*\*\ TIM_DMABURST_LENGTH_1TRANSFER and TIM_DMABURST_LENGTH_35TRANSFERS. +*\*\return none +**/ +void TIM_ConfigDma(TIM_Module* TIMx, uint32_t TIM_DMABase, uint32_t TIM_DMABurstLength) +{ + /* Set the DMA Base and the DMA Burst Length */ + TIMx->DCTRL = TIM_DMABase | TIM_DMABurstLength; +} + +/** +*\*\name TIM_EnableDma +*\*\fun Enables or disables the TIMx's DMA Requests. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_DMASource: +*\*\ - TIM_DMA_CC1 +*\*\ - TIM_DMA_CC2 +*\*\ - TIM_DMA_CC3 +*\*\ - TIM_DMA_CC4 +*\*\ - TIM_DMA_UPDATE +*\*\ - TIM_DMA_COM +*\*\ - TIM_DMA_TRIG +*\*\param Cmd: +*\*\ - DISABLE +*\*\ - ENABLE +*\*\return none +**/ +void TIM_EnableDma(TIM_Module* TIMx, uint32_t TIM_DMASource, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the DMA sources */ + TIMx->DINTEN |= (uint32_t)TIM_DMASource; + } + else + { + /* Disable the DMA sources */ + TIMx->DINTEN &= (uint32_t)(~((uint32_t)TIM_DMASource)); + } +} + +/** +*\*\name TIM_ConfigInternalClk +*\*\fun Configures the TIMx internal Clock +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\return none +**/ +void TIM_ConfigInternalClk(TIM_Module* TIMx) +{ + /* Disable slave mode to clock the prescaler directly with the internal clock */ + TIMx->SMCTRL &= (uint32_t)(~((uint32_t)TIM_SMCTRL_SMSEL)); +} + +/** +*\*\name TIM_ConfigInternalTrigToExt +*\*\fun Configures the TIMx Internal Trigger as External Clock +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_InputTriggerSource: +*\*\ - TIM_TRIG_SEL_IN_TR0 +*\*\ - TIM_TRIG_SEL_IN_TR1 +*\*\ - TIM_TRIG_SEL_IN_TR2 +*\*\ - TIM_TRIG_SEL_IN_TR3 +*\*\ - TIM_TRIG_SEL_IN_TR4 +*\*\ - TIM_TRIG_SEL_IN_TR5 +*\*\ - TIM_TRIG_SEL_IN_TR6 +*\*\ - TIM_TRIG_SEL_IN_TR7 +*\*\ - TIM_TRIG_SEL_IN_TR8 +*\*\ - TIM_TRIG_SEL_IN_TR9 +*\*\ - TIM_TRIG_SEL_IN_TR10 +*\*\ - TIM_TRIG_SEL_IN_TR11 +*\*\ - TIM_TRIG_SEL_IN_TR12 +*\*\ - TIM_TRIG_SEL_IN_TR13 +*\*\ - TIM_TRIG_SEL_IN_TR14 +*\*\return none +**/ +void TIM_ConfigInternalTrigToExt(TIM_Module* TIMx, uint32_t TIM_InputTriggerSource) +{ + /* Select the Internal Trigger */ + TIM_SelectInputTrig(TIMx, TIM_InputTriggerSource); + /* Select the External clock mode1 */ + TIMx->SMCTRL |= (uint32_t)TIM_SLAVE_MODE_EXT1; +} + +/** +*\*\name TIM_ConfigExtTrigAsClk +*\*\fun Configures the TIMx Trigger as External Clock +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_TIxExternalCLKSource: +*\*\ - TIM_TRIG_SEL_TI1F_ED +*\*\ - TIM_TRIG_SEL_TI1FP1 +*\*\ - TIM_TRIG_SEL_TI2FP2 +*\*\param ICPolarity +*\*\ - TIM_IC_POLARITY_RISING +*\*\ - TIM_IC_POLARITY_FALLING +*\*\param ICFilter +*\*\ - ICFilter can be a number between 0x0 and 0xF +*\*\return none +**/ +void TIM_ConfigExtTrigAsClk(TIM_Module* TIMx, uint32_t TIM_TIxExternalCLKSource, uint32_t IcPolarity, uint32_t ICFilter) +{ + /* Configure the Timer Input Clock Source */ + if (TIM_TIxExternalCLKSource == TIM_TRIG_SEL_TI2FP2) + { + ConfigTI2(TIMx, IcPolarity, TIM_IC_SELECTION_DIRECTTI, ICFilter); + } + else + { + ConfigTI1(TIMx, IcPolarity, TIM_IC_SELECTION_DIRECTTI, ICFilter); + } + + /* Select the Trigger source */ + TIM_SelectInputTrig(TIMx, TIM_TIxExternalCLKSource); + /* Select the External clock mode1 */ + TIMx->SMCTRL |= (uint32_t)TIM_SLAVE_MODE_EXT1; +} + +/** +*\*\name TIM_ConfigExtClkMode1 +*\*\fun Configures the External clock Mode1 +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_ETRInputSource: +*\*\ - TIM_CAPETRSEL_0 +*\*\ - TIM_CAPETRSEL_1 +*\*\ - TIM_CAPETRSEL_2 +*\*\ - TIM_CAPETRSEL_3 +*\*\ - TIM_CAPETRSEL_4 +*\*\ - TIM_CAPETRSEL_5 +*\*\ - TIM_CAPETRSEL_6 +*\*\ - TIM_CAPETRSEL_7 +*\*\ - TIM_CAPETRSEL_8 +*\*\ - TIM_CAPETRSEL_9 +*\*\ - TIM_CAPETRSEL_10 +*\*\ - TIM_CAPETRSEL_11 +*\*\ - TIM_CAPETRSEL_12 +*\*\ - TIM_CAPETRSEL_13 +*\*\param TIM_ExtTRGPrescaler: +*\*\ - TIM_EXT_TRG_PSC_OFF +*\*\ - TIM_EXT_TRG_PSC_DIV2 +*\*\ - TIM_EXT_TRG_PSC_DIV4 +*\*\ - TIM_EXT_TRG_PSC_DIV8 +*\*\param TIM_ExtTRGPolarity +*\*\ - TIM_EXT_TRIG_POLARITY_INVERTED +*\*\ - TIM_EXT_TRIG_POLARITY_NONINVERTED +*\*\param ExtTRGFilter +*\*\ - ExtTRGFilter can be a number between 0x0 and 0xF +*\*\return none +**/ +void TIM_ConfigExtClkMode1(TIM_Module* TIMx, uint32_t TIM_ETRInputSource, uint32_t TIM_ExtTRGPrescaler, uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) +{ + uint32_t tmpsmctrl ; + /* Configure the ETR input source */ + TIM_SelectETRInputSource(TIMx, TIM_ETRInputSource); + /* Configure the ETR Clock source */ + TIM_ConfigExtTrig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + + /* Get the TIMx SMCTRL register value */ + tmpsmctrl = TIMx->SMCTRL; + /* Reset the SMS Bits */ + tmpsmctrl &= (uint32_t)(~((uint32_t)TIM_SMCTRL_SMSEL)); + /* Select the External clock mode1 */ + tmpsmctrl |= (uint32_t)TIM_SLAVE_MODE_EXT1; + /* Select the Trigger selection : ETRF */ + tmpsmctrl &= (uint32_t)(~((uint32_t)TIM_SMCTRL_TSEL)); + tmpsmctrl |= (uint32_t)TIM_TRIG_SEL_ETRF; + /* Write to TIMx SMCTRL */ + TIMx->SMCTRL = tmpsmctrl; +} + +/** +*\*\name TIM_ConfigExtClkMode2 +*\*\fun Configures the External clock Mode2 +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_ETRInputSource: +*\*\ - TIM_CAPETRSEL_0 +*\*\ - TIM_CAPETRSEL_1 +*\*\ - TIM_CAPETRSEL_2 +*\*\ - TIM_CAPETRSEL_3 +*\*\ - TIM_CAPETRSEL_4 +*\*\ - TIM_CAPETRSEL_5 +*\*\ - TIM_CAPETRSEL_6 +*\*\ - TIM_CAPETRSEL_7 +*\*\ - TIM_CAPETRSEL_8 +*\*\ - TIM_CAPETRSEL_9 +*\*\ - TIM_CAPETRSEL_10 +*\*\ - TIM_CAPETRSEL_11 +*\*\ - TIM_CAPETRSEL_12 +*\*\ - TIM_CAPETRSEL_13 +*\*\param TIM_ExtTRGPrescaler: +*\*\ - TIM_EXT_TRG_PSC_OFF +*\*\ - TIM_EXT_TRG_PSC_DIV2 +*\*\ - TIM_EXT_TRG_PSC_DIV4 +*\*\ - TIM_EXT_TRG_PSC_DIV8 +*\*\param TIM_ExtTRGPolarity +*\*\ - TIM_EXT_TRIG_POLARITY_INVERTED +*\*\ - TIM_EXT_TRIG_POLARITY_NONINVERTED +*\*\param ExtTRGFilter +*\*\ - ExtTRGFilter can be a number between 0x0 and 0xF +*\*\return none +**/ +void TIM_ConfigExtClkMode2(TIM_Module* TIMx, uint32_t TIM_ETRInputSource, uint32_t TIM_ExtTRGPrescaler, uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) +{ + /* Configure the ETR input source */ + TIM_SelectETRInputSource(TIMx, TIM_ETRInputSource); + /* Configure the ETR Clock source */ + TIM_ConfigExtTrig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + /* Enable the External clock mode2 */ + TIMx->SMCTRL |= (uint32_t)TIM_SMCTRL_EXCEN; +} + +/** +*\*\name TIM_ConfigPrescaler +*\*\fun Configures the TIMx Prescaler. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param Prescaler: +*\*\ - 0x0000 ~ 0xFFFF +*\*\param TIM_PSCReloadMode +*\*\ - TIM_PSC_RELOAD_MODE_UPDATE +*\*\ - TIM_PSC_RELOAD_MODE_IMMEDIATE +*\*\return none +**/ +void TIM_ConfigPrescaler(TIM_Module* TIMx, uint32_t Prescaler, uint32_t TIM_PSCReloadMode) +{ + /* Set the Prescaler value */ + TIMx->PSC = Prescaler; + /* Set or reset the UG Bit */ + TIMx->EVTGEN = TIM_PSCReloadMode; +} + +/** +*\*\name TIM_ConfigCntMode +*\*\fun Specifies the TIMx Counter Mode to be used. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param CntMode +*\*\ - TIM_CNT_MODE_UP +*\*\ - TIM_CNT_MODE_DOWN +*\*\ - TIM_CNT_MODE_CENTER_ALIGN1 +*\*\ - TIM_CNT_MODE_CENTER_ALIGN2 +*\*\ - TIM_CNT_MODE_CENTER_ALIGN3 +*\*\return none +**/ +void TIM_ConfigCntMode(TIM_Module* TIMx, uint32_t CntMode) +{ + uint32_t tmpctrl1 ; + tmpctrl1 = TIMx->CTRL1; + /* Reset the CMS and DIR Bits */ + tmpctrl1 &= (uint32_t)(~((uint32_t)(TIM_CTRL1_DIR | TIM_CTRL1_CAMSEL))); + /* Set the Counter Mode */ + tmpctrl1 |= (uint32_t)CntMode; + /* Write to TIMx CTRL1 register */ + TIMx->CTRL1 = tmpctrl1; +} + +/** +*\*\name TIM_ConfigEncoderInterface +*\*\fun Configures the TIMx Encoder Interface. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_EncoderMode +*\*\ - TIM_ENCODE_QUA_MODE_TI1 +*\*\ - TIM_ENCODE_QUA_MODE_TI2 +*\*\ - TIM_ENCODE_QUA_MODE_TI12 +*\*\ - TIM_ENCODE_QUA_MODE_SINGLE_TI1 +*\*\ - TIM_ENCODE_QUA_MODE_SINGLE_TI2 +*\*\ - TIM_ENCODE_DUL_CLKPLUS_MODE1 +*\*\ - TIM_ENCODE_DUL_CLKPLUS_MODE2 +*\*\ - TIM_ENCODE_SINGLE_CLKPLUS_MODE1 +*\*\ - TIM_ENCODE_SINGLE_CLKPLUS_MODE2 +*\*\param TIM_IC1Polarity +*\*\ - TIM_IC_POLARITY_FALLING +*\*\ - TIM_IC_POLARITY_RISING +*\*\param TIM_IC2Polarity +*\*\ - TIM_IC_POLARITY_FALLING +*\*\ - TIM_IC_POLARITY_RISING +*\*\return none +**/ +void TIM_ConfigEncoderInterface(TIM_Module* TIMx, uint32_t TIM_EncoderMode, uint32_t TIM_IC1Polarity, uint32_t TIM_IC2Polarity) +{ + uint32_t tmpsmctrl ; + uint32_t tmpccmodx ; + uint32_t tmpccen ; + + /* Get the TIMx SMCTRL register value */ + tmpsmctrl = TIMx->SMCTRL; + + /* Get the TIMx CCMOD1 register value */ + tmpccmodx = TIMx->CCMOD1; + + /* Get the TIMx CCEN register value */ + tmpccen = TIMx->CCEN; + + /* Set the encoder Mode */ + tmpsmctrl &= (uint32_t)(~((uint32_t)TIM_SMCTRL_SMSEL)); + tmpsmctrl |= (uint32_t)TIM_EncoderMode; + + /* Select the Capture Compare 1 and the Capture Compare 2 as input */ + tmpccmodx &= (uint32_t)((~TIM_CCMOD1_CC1SEL) & (~TIM_CCMOD1_CC2SEL)); + tmpccmodx |= (uint32_t)(TIM_CCMOD1_CC1SEL_0 | TIM_CCMOD1_CC2SEL_0); + + /* Set the TI1 and the TI2 Polarities */ + tmpccen &= (uint32_t)(((uint32_t) ~((uint32_t)TIM_CCEN_CC1P)) & ((uint32_t) ~((uint32_t)TIM_CCEN_CC2P))); + tmpccen |= (uint32_t)(TIM_IC1Polarity | (uint32_t)(TIM_IC2Polarity << (uint32_t)4)); + + /* Write to TIMx SMCTRL */ + TIMx->SMCTRL = tmpsmctrl; + /* Write to TIMx CCMOD1 */ + TIMx->CCMOD1 = tmpccmodx; + /* Write to TIMx CCEN */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_ConfigForcedOc1 +*\*\fun Forces the TIMx output 1 waveform to active or inactive level. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_ForcedAction +*\*\ - TIM_FORCED_ACTION_ACTIVE +*\*\ - TIM_FORCED_ACTION_INACTIVE +*\*\return none +**/ +void TIM_ConfigForcedOc1(TIM_Module* TIMx, uint32_t TIM_ForcedAction) +{ + uint32_t tmpccmodx; + tmpccmodx = TIMx->CCMOD1; + /* Reset the OC1M Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC1MD); + /* Configure The Forced output Mode */ + tmpccmodx |= (uint32_t)TIM_ForcedAction; + /* Write to TIMx CCMOD1 register */ + TIMx->CCMOD1 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigForcedOc2 +*\*\fun Forces the TIMx output 2 waveform to active or inactive level. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_ForcedAction +*\*\ - TIM_FORCED_ACTION_ACTIVE +*\*\ - TIM_FORCED_ACTION_INACTIVE +*\*\return none +**/ +void TIM_ConfigForcedOc2(TIM_Module* TIMx, uint32_t TIM_ForcedAction) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD1; + /* Reset the OC2M Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC2MD); + /* Configure The Forced output Mode */ + tmpccmodx |= (uint32_t)(TIM_ForcedAction << 8); + /* Write to TIMx CCMOD1 register */ + TIMx->CCMOD1 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigForcedOc3 +*\*\fun Forces the TIMx output 3 waveform to active or inactive level. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_ForcedAction +*\*\ - TIM_FORCED_ACTION_ACTIVE +*\*\ - TIM_FORCED_ACTION_INACTIVE +*\*\return none +**/ +void TIM_ConfigForcedOc3(TIM_Module* TIMx, uint32_t TIM_ForcedAction) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD2; + /* Reset the OC1M Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC3MD); + /* Configure The Forced output Mode */ + tmpccmodx |= (uint32_t)TIM_ForcedAction; + /* Write to TIMx CCMOD2 register */ + TIMx->CCMOD2 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigForcedOc4 +*\*\fun Forces the TIMx output 4 waveform to active or inactive level. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_ForcedAction +*\*\ - TIM_FORCED_ACTION_ACTIVE +*\*\ - TIM_FORCED_ACTION_INACTIVE +*\*\return none +**/ +void TIM_ConfigForcedOc4(TIM_Module* TIMx, uint32_t TIM_ForcedAction) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD2; + /* Reset the OC2M Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC4MD); + /* Configure The Forced output Mode */ + tmpccmodx |= (uint32_t)(TIM_ForcedAction << 8); + /* Write to TIMx CCMOD2 register */ + TIMx->CCMOD2 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigForcedOc5 +*\*\fun Forces the TIMx output 5 waveform to active or inactive level. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_ForcedAction +*\*\ - TIM_FORCED_ACTION_ACTIVE +*\*\ - TIM_FORCED_ACTION_INACTIVE +*\*\return none +**/ +void TIM_ConfigForcedOc5(TIM_Module* TIMx, uint32_t TIM_ForcedAction) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD3; + /* Reset the OC2M Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC5MD); + /* Configure The Forced output Mode */ + tmpccmodx |= (uint32_t)(TIM_ForcedAction); + /* Write to TIMx CCMOD2 register */ + TIMx->CCMOD3 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigForcedOc6 +*\*\fun Forces the TIMx output 6 waveform to active or inactive level. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_ForcedAction +*\*\ - TIM_FORCED_ACTION_ACTIVE +*\*\ - TIM_FORCED_ACTION_INACTIVE +*\*\return none +**/ +void TIM_ConfigForcedOc6(TIM_Module* TIMx, uint32_t TIM_ForcedAction) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD3; + /* Reset the OC2M Bits */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC6MD); + /* Configure The Forced output Mode */ + tmpccmodx |= (uint32_t)(TIM_ForcedAction << 8); + /* Write to TIMx CCMOD2 register */ + TIMx->CCMOD3 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigArPreload +*\*\fun Enables or disables TIMx peripheral Preload register on AR. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_ConfigArPreload(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Set the AR Preload Bit */ + TIMx->CTRL1 |= (uint32_t)TIM_CTRL1_ARPEN; + } + else + { + /* Reset the AR Preload Bit */ + TIMx->CTRL1 &= (uint32_t)(~((uint32_t)TIM_CTRL1_ARPEN)); + } +} + +/** +*\*\name TIM_SelectComEvt +*\*\fun Selects the TIM peripheral Commutation event. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_SelectComEvt(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Set the CCUSEL Bit */ + TIMx->CTRL2 |= (uint32_t)TIM_CTRL2_CCUSEL; + } + else + { + /* Reset the CCUSEL Bit */ + TIMx->CTRL2 &= (uint32_t)(~((uint32_t)TIM_CTRL2_CCUSEL)); + } +} + +/** +*\*\name TIM_SelectCapCmpDmaSrc +*\*\fun Selects the TIMx peripheral Capture Compare DMA source. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_SelectCapCmpDmaSrc(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Set the CCDSEL Bit */ + TIMx->CTRL2 |= (uint32_t)TIM_CTRL2_CCDSEL; + } + else + { + /* Reset the CCDSEL Bit */ + TIMx->CTRL2 &= (uint32_t)(~((uint32_t)TIM_CTRL2_CCDSEL)); + } +} + +/** +*\*\name TIM_EnableCapCmpPreloadControl +*\*\fun Sets or Resets the TIM peripheral Capture Compare Preload Control bit. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_EnableCapCmpPreloadControl(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Set the CCPC Bit */ + TIMx->CTRL2 |= (uint32_t)TIM_CTRL2_CCPCTL; + } + else + { + /* Reset the CCPC Bit */ + TIMx->CTRL2 &= (uint32_t)(~((uint32_t)TIM_CTRL2_CCPCTL)); + } +} + +/** +*\*\name TIM_ConfigOc1Preload +*\*\fun Enables or disables the TIMx peripheral Preload register on CCDAT1. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_PRE_LOAD_ENABLE +*\*\ - TIM_OC_PRE_LOAD_DISABLE +*\*\return none +**/ +void TIM_ConfigOc1Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD1; + /* Reset the OC1PEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC1PEN); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmodx |= (uint32_t)TIM_OCPreload; + /* Write to TIMx CCMOD1 register */ + TIMx->CCMOD1 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc2Preload +*\*\fun Enables or disables the TIMx peripheral Preload register on CCDAT2. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_PRE_LOAD_ENABLE +*\*\ - TIM_OC_PRE_LOAD_DISABLE +*\*\return none +**/ +void TIM_ConfigOc2Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD1; + /* Reset the OC2PEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC2PEN); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmodx |= (uint32_t)(TIM_OCPreload << 8); + /* Write to TIMx CCMOD1 register */ + TIMx->CCMOD1 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc3Preload +*\*\fun Enables or disables the TIMx peripheral Preload register on CCDAT3. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_PRE_LOAD_ENABLE +*\*\ - TIM_OC_PRE_LOAD_DISABLE +*\*\return none +**/ +void TIM_ConfigOc3Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD2; + /* Reset the OC3PEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC3PEN); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmodx |= (uint32_t)TIM_OCPreload; + /* Write to TIMx CCMOD2 register */ + TIMx->CCMOD2 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc4Preload +*\*\fun Enables or disables the TIMx peripheral Preload register on CCDAT4. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_PRE_LOAD_ENABLE +*\*\ - TIM_OC_PRE_LOAD_DISABLE +*\*\return none +**/ +void TIM_ConfigOc4Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD2; + /* Reset the OC4PEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC4PEN); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmodx |= (uint32_t)(TIM_OCPreload << 8); + /* Write to TIMx CCMOD2 register */ + TIMx->CCMOD2 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc5Preload +*\*\fun Enables or disables the TIMx peripheral Preload register on CCDAT5. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_PRE_LOAD_ENABLE +*\*\ - TIM_OC_PRE_LOAD_DISABLE +*\*\return none +**/ +void TIM_ConfigOc5Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD3; + /* Reset the OC5PEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC5PEN); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmodx |= (uint32_t)(TIM_OCPreload); + /* Write to TIMx CCMOD3 register */ + TIMx->CCMOD3 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc6Preload +*\*\fun Enables or disables the TIMx peripheral Preload register on CCDAT6. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_PRE_LOAD_ENABLE +*\*\ - TIM_OC_PRE_LOAD_DISABLE +*\*\return none +**/ +void TIM_ConfigOc6Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD3; + /* Reset the OC6PEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC6PEN); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmodx |= (uint32_t)(TIM_OCPreload << 8); + /* Write to TIMx CCMOD3 register */ + TIMx->CCMOD3 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc7Preload +*\*\fun Enables or disables the TIMx peripheral Preload register on CCDAT6. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_PRE_LOAD_ENABLE +*\*\ - TIM_OC_PRE_LOAD_DISABLE +*\*\return none +**/ +void TIM_ConfigOc7Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD3; + /* Reset the OC7PEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC7PEN); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmodx |= (uint32_t)(TIM_OCPreload << 14); + /* Write to TIMx CCMOD3 register */ + TIMx->CCMOD3 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc8Preload +*\*\fun Enables or disables the TIMx peripheral Preload register on CCDAT6. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_PRE_LOAD_ENABLE +*\*\ - TIM_OC_PRE_LOAD_DISABLE +*\*\return none +**/ +void TIM_ConfigOc8Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD3; + /* Reset the OC8PEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC8PEN); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmodx |= (uint32_t)(TIM_OCPreload << 18); + /* Write to TIMx CCMOD3 register */ + TIMx->CCMOD3 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc9Preload +*\*\fun Enables or disables the TIMx peripheral Preload register on CCDAT6. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_PRE_LOAD_ENABLE +*\*\ - TIM_OC_PRE_LOAD_DISABLE +*\*\return none +**/ +void TIM_ConfigOc9Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload) +{ + uint32_t tmpccmodx; + tmpccmodx = TIMx->CCMOD3; + /* Reset the OC9PEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC9PEN); + /* Enable or Disable the Output Compare Preload feature */ + tmpccmodx |= (uint32_t)(TIM_OCPreload << 22); + /* Write to TIMx CCMOD3 register */ + TIMx->CCMOD3 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc1Fast +*\*\fun Configures the TIMx Output Compare 1 Fast feature. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_FAST_ENABLE +*\*\ - TIM_OC_FAST_DISABLE +*\*\return none +**/ +void TIM_ConfigOc1Fast(TIM_Module* TIMx, uint32_t TIM_OCFast) +{ + uint32_t tmpccmodx ; + /* Get the TIMx CCMOD1 register value */ + tmpccmodx = TIMx->CCMOD1; + /* Reset the OC1FEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC1FEN); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmodx |= (uint32_t)TIM_OCFast; + /* Write to TIMx CCMOD1 */ + TIMx->CCMOD1 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc2Fast +*\*\fun Configures the TIMx Output Compare 2 Fast feature. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_FAST_ENABLE +*\*\ - TIM_OC_FAST_DISABLE +*\*\return none +**/ +void TIM_ConfigOc2Fast(TIM_Module* TIMx, uint32_t TIM_OCFast) +{ + uint32_t tmpccmodx ; + /* Get the TIMx CCMOD1 register value */ + tmpccmodx = TIMx->CCMOD1; + /* Reset the OC2FEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC2FEN); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmodx |= (uint32_t)(TIM_OCFast << 8); + /* Write to TIMx CCMOD1 */ + TIMx->CCMOD1 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc3Fast +*\*\fun Configures the TIMx Output Compare 3 Fast feature. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_FAST_ENABLE +*\*\ - TIM_OC_FAST_DISABLE +*\*\return none +**/ +void TIM_ConfigOc3Fast(TIM_Module* TIMx, uint32_t TIM_OCFast) +{ + uint32_t tmpccmodx ; + /* Get the TIMx CCMOD2 register value */ + tmpccmodx = TIMx->CCMOD2; + /* Reset the OC3FEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC3FEN); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmodx |= (uint32_t)TIM_OCFast; + /* Write to TIMx CCMOD2 */ + TIMx->CCMOD2 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc4Fast +*\*\fun Configures the TIMx Output Compare 4 Fast feature. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_FAST_ENABLE +*\*\ - TIM_OC_FAST_DISABLE +*\*\return none +**/ +void TIM_ConfigOc4Fast(TIM_Module* TIMx, uint32_t TIM_OCFast) +{ + uint32_t tmpccmodx ; + /* Get the TIMx CCMOD2 register value */ + tmpccmodx = TIMx->CCMOD2; + /* Reset the OC4FEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC4FEN); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmodx |= (uint32_t)(TIM_OCFast << 8); + /* Write to TIMx CCMOD2 */ + TIMx->CCMOD2 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc5Fast +*\*\fun Configures the TIMx Output Compare 5 Fast feature. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_FAST_ENABLE +*\*\ - TIM_OC_FAST_DISABLE +*\*\return none +**/ +void TIM_ConfigOc5Fast(TIM_Module* TIMx, uint32_t TIM_OCFast) +{ + uint32_t tmpccmodx ; + /* Get the TIMx CCMOD2 register value */ + tmpccmodx = TIMx->CCMOD3; + /* Reset the OC4FEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC5FEN); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmodx |= (uint32_t)(TIM_OCFast); + /* Write to TIMx CCMOD3 */ + TIMx->CCMOD3 = tmpccmodx; +} + +/** +*\*\name TIM_ConfigOc6Fast +*\*\fun Configures the TIMx Output Compare 6 Fast feature. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_FAST_ENABLE +*\*\ - TIM_OC_FAST_DISABLE +*\*\return none +**/ +void TIM_ConfigOc6Fast(TIM_Module* TIMx, uint32_t TIM_OCFast) +{ + uint32_t tmpccmodx ; + /* Get the TIMx CCMOD2 register value */ + tmpccmodx = TIMx->CCMOD3; + /* Reset the OC4FEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC6FEN); + /* Enable or Disable the Output Compare Fast Bit */ + tmpccmodx |= (uint32_t)(TIM_OCFast << 8); + /* Write to TIMx CCMOD3 */ + TIMx->CCMOD3 = tmpccmodx; +} + +/** +*\*\name TIM_ClrOc1Ref +*\*\fun Clears or safeguards the OCREF1 signal on an external event +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_CLR_ENABLE +*\*\ - TIM_OC_CLR_DISABLE +*\*\return none +**/ +void TIM_ClrOc1Ref(TIM_Module* TIMx, uint32_t TIM_OCClear) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD1; + /* Reset the OC1CEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC1CEN); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmodx |= (uint32_t)TIM_OCClear; + /* Write to TIMx CCMOD1 register */ + TIMx->CCMOD1 = tmpccmodx; +} + +/** +*\*\name TIM_ClrOc2Ref +*\*\fun Clears or safeguards the OCREF2 signal on an external event +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_CLR_ENABLE +*\*\ - TIM_OC_CLR_DISABLE +*\*\return none +**/ +void TIM_ClrOc2Ref(TIM_Module* TIMx, uint32_t TIM_OCClear) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD1; + /* Reset the OC2CEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD1_OC2CEN); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmodx |= (uint32_t)(TIM_OCClear << 8); + /* Write to TIMx CCMOD1 register */ + TIMx->CCMOD1 = tmpccmodx; +} + +/** +*\*\name TIM_ClrOc3Ref +*\*\fun Clears or safeguards the OCREF3 signal on an external event +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_CLR_ENABLE +*\*\ - TIM_OC_CLR_DISABLE +*\*\return none +**/ +void TIM_ClrOc3Ref(TIM_Module* TIMx, uint32_t TIM_OCClear) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD2; + /* Reset the OC3CEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC3CEN); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmodx |= (uint32_t)TIM_OCClear; + /* Write to TIMx CCMOD2 register */ + TIMx->CCMOD2 = tmpccmodx; +} + +/** +*\*\name TIM_ClrOc4Ref +*\*\fun Clears or safeguards the OCREF4 signal on an external event +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_CLR_ENABLE +*\*\ - TIM_OC_CLR_DISABLE +*\*\return none +**/ +void TIM_ClrOc4Ref(TIM_Module* TIMx, uint32_t TIM_OCClear) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD2; + /* Reset the OC4CEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD2_OC4CEN); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmodx |= (uint32_t)(TIM_OCClear << 8); + /* Write to TIMx CCMOD2 register */ + TIMx->CCMOD2 = tmpccmodx; +} + +/** +*\*\name TIM_ClrOc5Ref +*\*\fun Clears or safeguards the OCREF5 signal on an external event +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_CLR_ENABLE +*\*\ - TIM_OC_CLR_DISABLE +*\*\return none +**/ +void TIM_ClrOc5Ref(TIM_Module* TIMx, uint32_t TIM_OCClear) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD3; + /* Reset the OC4CEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC5CEN); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmodx |= (uint32_t)(TIM_OCClear); + /* Write to TIMx CCMOD3 register */ + TIMx->CCMOD3 = tmpccmodx; +} + +/** +*\*\name TIM_ClrOc6Ref +*\*\fun Clears or safeguards the OCREF6 signal on an external event +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_CLR_ENABLE +*\*\ - TIM_OC_CLR_DISABLE +*\*\return none +**/ +void TIM_ClrOc6Ref(TIM_Module* TIMx, uint32_t TIM_OCClear) +{ + uint32_t tmpccmodx ; + tmpccmodx = TIMx->CCMOD3; + /* Reset the OC4CEN Bit */ + tmpccmodx &= (uint32_t)(~TIM_CCMOD3_OC6CEN); + /* Enable or Disable the Output Compare Clear Bit */ + tmpccmodx |= (uint32_t)(TIM_OCClear << 8); + /* Write to TIMx CCMOD3 register */ + TIMx->CCMOD3 = tmpccmodx; +} + +/** +*\*\name TIM_ClrOcRefInputSource +*\*\fun Set the OCREF clear input source +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param OCRefClearInputSelect +*\*\ - TIM_ETRSEL +*\*\ - TIM_CLRSEL +*\*\param OCRefClearInputSource +*\*\ - TIM_CAPETRSEL_0 +*\*\ - TIM_CAPETRSEL_1 +*\*\ - TIM_CAPETRSEL_2 +*\*\ - TIM_CAPETRSEL_3 +*\*\ - TIM_CAPETRSEL_4 +*\*\ - TIM_CAPETRSEL_5 +*\*\ - TIM_CAPETRSEL_6 +*\*\ - TIM_CAPETRSEL_7 +*\*\ - TIM_CAPETRSEL_8 +*\*\ - TIM_CAPETRSEL_9 +*\*\ - TIM_CAPETRSEL_10 +*\*\ - TIM_CAPETRSEL_11 +*\*\ - TIM_CAPETRSEL_12 +*\*\ - TIM_CAPETRSEL_13 +*\*\ - TIM_OCCLRSEL_0 +*\*\ - TIM_OCCLRSEL_1 +*\*\ - TIM_OCCLRSEL_2 +*\*\ - TIM_OCCLRSEL_3 +*\*\ - TIM_OCCLRSEL_4 +*\*\ - TIM_OCCLRSEL_5 +*\*\ - TIM_OCCLRSEL_6 +*\*\ - TIM_OCCLRSEL_7 +*\*\return none +**/ +void TIM_ClrOcRefInputSource(TIM_Module* TIMx, uint32_t OCRefClearInputSelect, uint32_t OCRefClearInputSource) +{ + uint32_t tmpctrl1 ; + uint32_t tmpinsel ; + /* Get the value of TIMx_CTRL1 and TIMx_INSEL */ + tmpctrl1 = TIMx->CTRL1; + tmpinsel = TIMx->INSEL; + /* Reset the CTRL1_CLRSEL\INSEL_ETRS\INSEL_CLRS bits */ + tmpctrl1 &= (uint32_t)(~TIM_CTRL1_CLRSEL); + tmpinsel &= (uint32_t)(~TIM_INSEL_ETRS); + tmpinsel &= (uint32_t)(~TIM_INSEL_CLRS); + + if (OCRefClearInputSelect) + { + /* CLR select capture in */ + tmpctrl1 |= (uint32_t)TIM_OCCLRSEL_COMP; + tmpinsel |= (uint32_t)OCRefClearInputSource; + } + else + { + /* ETR select capture in */ + tmpinsel |= (uint32_t)OCRefClearInputSource; + } + + TIMx->CTRL1 = tmpctrl1; + TIMx->INSEL = tmpinsel; +} + +/** +*\*\name TIM_ConfigOc1Polarity +*\*\fun Configures the TIMx channel 1 polarity. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_POLARITY_HIGH +*\*\ - TIM_OC_POLARITY_LOW +*\*\return none +**/ +void TIM_ConfigOc1Polarity(TIM_Module* TIMx, uint32_t OcPolarity) +{ + uint32_t tmpccen ; + tmpccen = TIMx->CCEN; + /* Set or Reset the CC1P Bit */ + tmpccen &= (uint32_t)(~((uint32_t)TIM_CCEN_CC1P)); + tmpccen |= (uint32_t)OcPolarity; + /* Write to TIMx CCEN register */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_ConfigOc1NPolarity +*\*\fun Configures the TIMx channel 1N polarity. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OCN_POLARITY_HIGH +*\*\ - TIM_OCN_POLARITY_LOW +*\*\return none +**/ +void TIM_ConfigOc1NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity) +{ + uint32_t tmpccen ; + tmpccen = TIMx->CCEN; + /* Set or Reset the CC1NP Bit */ + tmpccen &= (uint32_t)(~((uint32_t)TIM_CCEN_CC1NP)); + tmpccen |= (uint32_t)OcNPolarity; + /* Write to TIMx CCEN register */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_ConfigOc2Polarity +*\*\fun Configures the TIMx channel 2 polarity. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_POLARITY_HIGH +*\*\ - TIM_OC_POLARITY_LOW +*\*\return none +**/ +void TIM_ConfigOc2Polarity(TIM_Module* TIMx, uint32_t OcPolarity) +{ + uint32_t tmpccen ; + tmpccen = TIMx->CCEN; + /* Set or Reset the CC2P Bit */ + tmpccen &= (uint32_t)(~((uint32_t)TIM_CCEN_CC2P)); + tmpccen |= (uint32_t)(OcPolarity << 4); + /* Write to TIMx CCEN register */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_ConfigOc2NPolarity +*\*\fun Configures the TIMx channel 2N polarity. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_OCPreload +*\*\ - TIM_OCN_POLARITY_HIGH +*\*\ - TIM_OCN_POLARITY_LOW +*\*\return none +**/ +void TIM_ConfigOc2NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity) +{ + uint32_t tmpccen ; + tmpccen = TIMx->CCEN; + /* Set or Reset the CC2NP Bit */ + tmpccen &= (uint32_t)(~((uint32_t)TIM_CCEN_CC2NP)); + tmpccen |= (uint32_t)(OcNPolarity << 4); + /* Write to TIMx CCEN register */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_ConfigOc3Polarity +*\*\fun Configures the TIMx channel 3 polarity. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_POLARITY_HIGH +*\*\ - TIM_OC_POLARITY_LOW +*\*\return none +**/ +void TIM_ConfigOc3Polarity(TIM_Module* TIMx, uint32_t OcPolarity) +{ + uint32_t tmpccen ; + tmpccen = TIMx->CCEN; + /* Set or Reset the CC3P Bit */ + tmpccen &= (uint32_t)(~((uint32_t)TIM_CCEN_CC3P)); + tmpccen |= (uint32_t)(OcPolarity << 8); + /* Write to TIMx CCEN register */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_ConfigOc3NPolarity +*\*\fun Configures the TIMx channel 3N polarity. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_OCPreload +*\*\ - TIM_OCN_POLARITY_HIGH +*\*\ - TIM_OCN_POLARITY_LOW +*\*\return none +**/ +void TIM_ConfigOc3NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity) +{ + uint32_t tmpccen ; + tmpccen = TIMx->CCEN; + /* Set or Reset the CC3NP Bit */ + tmpccen &= (uint32_t)(~((uint32_t)TIM_CCEN_CC3NP)); + tmpccen |= (uint32_t)(OcNPolarity << 8); + /* Write to TIMx CCEN register */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_ConfigOc4Polarity +*\*\fun Configures the TIMx channel 4 polarity. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_POLARITY_HIGH +*\*\ - TIM_OC_POLARITY_LOW +*\*\return none +**/ +void TIM_ConfigOc4Polarity(TIM_Module* TIMx, uint32_t OcPolarity) +{ + uint32_t tmpccen ; + tmpccen = TIMx->CCEN; + /* Set or Reset the CC4P Bit */ + tmpccen &= (uint32_t)(~((uint32_t)TIM_CCEN_CC4P)); + tmpccen |= (uint32_t)(OcPolarity << 12); + /* Write to TIMx CCEN register */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_ConfigOc4NPolarity +*\*\fun Configures the TIMx channel 4N polarity. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_OCPreload +*\*\ - TIM_OCN_POLARITY_HIGH +*\*\ - TIM_OCN_POLARITY_LOW +*\*\return none +**/ +void TIM_ConfigOc4NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity) +{ + uint32_t tmpccen ; + tmpccen = TIMx->CCEN; + /* Set or Reset the CC3NP Bit */ + tmpccen &= (uint32_t)(~((uint32_t)TIM_CCEN_CC4NP)); + tmpccen |= (uint32_t)(OcNPolarity << 12); + /* Write to TIMx CCEN register */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_ConfigOc5Polarity +*\*\fun Configures the TIMx channel 5 polarity. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_POLARITY_HIGH +*\*\ - TIM_OC_POLARITY_LOW +*\*\return none +**/ +void TIM_ConfigOc5Polarity(TIM_Module* TIMx, uint32_t OcPolarity) +{ + uint32_t tmpccen; + tmpccen = TIMx->CCEN; + /* Set or Reset the CC5P Bit */ + tmpccen &= (uint32_t)(~((uint32_t)TIM_CCEN_CC5P)); + tmpccen |= (uint32_t)(OcPolarity << 16); + /* Write to TIMx CCEN register */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_ConfigOc6Polarity +*\*\fun Configures the TIMx channel 6 polarity. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_OCPreload +*\*\ - TIM_OC_POLARITY_HIGH +*\*\ - TIM_OC_POLARITY_LOW +*\*\return none +**/ +void TIM_ConfigOc6Polarity(TIM_Module* TIMx, uint32_t OcPolarity) +{ + uint32_t tmpccen ; + tmpccen = TIMx->CCEN; + /* Set or Reset the CC6P Bit */ + tmpccen &= (uint32_t)(~((uint32_t)TIM_CCEN_CC6P)); + tmpccen |= (uint32_t)(OcPolarity << 20); + /* Write to TIMx CCEN register */ + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_EnableCapCmpCh +*\*\fun Enables or disables the TIM Capture Compare Channel x. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Channel +*\*\ - TIM_CH_1 +*\*\ - TIM_CH_2 +*\*\ - TIM_CH_3 +*\*\ - TIM_CH_4 +*\*\ - TIM_CH_5 +*\*\ - TIM_CH_6 +*\*\param TIM_CCx +*\*\ - TIM_CAP_CMP_ENABLE +*\*\ - TIM_CAP_CMP_DISABLE +*\*\return none +**/ +void TIM_EnableCapCmpCh(TIM_Module* TIMx, uint32_t Channel, uint32_t TIM_CCx) +{ + uint32_t tmp ; + tmp = CAPCMPEN_CCE_SET << Channel; + /* Reset the CCxEN Bit */ + TIMx->CCEN &= (uint32_t)(~tmp); + /* Set or reset the CCxEN Bit */ + TIMx->CCEN |= (uint32_t)(TIM_CCx << Channel); +} + +/** +*\*\name TIM_EnableCapCmpChN +*\*\fun Enables or disables the TIM Capture Compare Channel xN. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Channel +*\*\ - TIM_CH_1 +*\*\ - TIM_CH_2 +*\*\ - TIM_CH_3 +*\*\ - TIM_CH_4 +*\*\param TIM_CCx +*\*\ - TIM_CAP_CMP_N_ENABLE +*\*\ - TIM_CAP_CMP_N_DISABLE +*\*\return none +**/ +void TIM_EnableCapCmpChN(TIM_Module* TIMx, uint32_t Channel, uint32_t TIM_CCxN) +{ + uint32_t tmp ; + tmp = CAPCMPEN_CCNE_SET << Channel; + /* Reset the CCxNEN Bit */ + TIMx->CCEN &= (uint32_t)(~tmp); + /* Set or reset the CCxNEN Bit */ + TIMx->CCEN |= (uint32_t)(TIM_CCxN << Channel); +} + +/** +*\*\name TIM_SelectOcMode +*\*\fun Selects the TIM Output Compare Mode. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Channel +*\*\ - TIM_CH_1 +*\*\ - TIM_CH_2 +*\*\ - TIM_CH_3 +*\*\ - TIM_CH_4 +*\*\ - TIM_CH_5 +*\*\ - TIM_CH_6 +*\*\param OcMode +*\*\ - TIM_OCMODE_TIMING +*\*\ - TIM_OCMODE_ACTIVE +*\*\ - TIM_OCMODE_INACTIVE +*\*\ - TIM_OCMODE_TOGGLE +*\*\ - TIM_OCMODE_PWM1 +*\*\ - TIM_OCMODE_PWM2 +*\*\ - TIM_FORCED_ACTION_ACTIVE +*\*\ - TIM_FORCED_ACTION_INACTIVE +*\*\ - TIM_OCMODE_OPMOD_RETRIG1 +*\*\ - TIM_OCMODE_OPMOD_RETRIG2 +*\*\ - TIM_OCMODE_COMBI_PWM1 +*\*\ - TIM_OCMODE_COMBI_PWM2 +*\*\return none +**/ +void TIM_SelectOcMode(TIM_Module* TIMx, uint32_t Channel, uint32_t OcMode) +{ + uint32_t tmp ; + uint32_t tmp1 ; + + tmp = (uint32_t)TIMx; + tmp += CAPCMPMOD_OFFSET; + + tmp1 = CAPCMPEN_CCE_SET << Channel; + + /* Disable the Channel: Reset the CCxE Bit */ + TIMx->CCEN &= (uint32_t)(~tmp1); + + if ((Channel == TIM_CH_1) || (Channel == TIM_CH_3) || (Channel == TIM_CH_5)) + { + tmp += (uint32_t)(Channel >> 1); + + /* Reset the OCxMD bits in the CCMRx register */ + *(__IO uint32_t*)tmp &= (uint32_t) (~((uint32_t)(TIM_CCMOD1_OC1MD | TIM_CCMOD1_OC1MD_3))); + + /* Configure the OCxMD bits in the CCMRx register */ + *(__IO uint32_t*)tmp |= (uint32_t)OcMode; + } + else + { + tmp += (uint32_t)((Channel - 4) >> 1); + + /* Reset the OCxMD bits in the CCMRx register */ + *(__IO uint32_t*)tmp &= (uint32_t)(~((uint32_t)(TIM_CCMOD1_OC2MD | TIM_CCMOD1_OC2MD_3))); + + /* Configure the OCxMD bits in the CCMRx register */ + *(__IO uint32_t*)tmp |= (uint32_t)(((OcMode << 8) & (0x0000E000)) | ((OcMode << 1) & (0x00040000))); + } +} + +/** +*\*\name TIM_EnableUpdateEvt +*\*\fun Enables or Disables the TIMx Update event. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_EnableUpdateEvt(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Set the Update Disable Bit */ + TIMx->CTRL1 |= (uint32_t)TIM_CTRL1_UPDIS; + } + else + { + /* Reset the Update Disable Bit */ + TIMx->CTRL1 &= (uint32_t)(~((uint32_t)TIM_CTRL1_UPDIS)); + } +} + +/** +*\*\name TIM_ConfigUpdateRequestIntSrc +*\*\fun Configures the TIMx Update Request Interrupt source. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param TIM_UpdateSource +*\*\ - TIM_UPDATE_SRC_GLOBAL +*\*\ - TIM_UPDATE_SRC_REGULAR +*\*\return none +**/ +void TIM_ConfigUpdateRequestIntSrc(TIM_Module* TIMx, uint32_t TIM_UpdateSource) +{ + if (TIM_UpdateSource != TIM_UPDATE_SRC_GLOBAL) + { + /* Set the UPRS Bit */ + TIMx->CTRL1 |= (uint32_t)TIM_CTRL1_UPRS; + } + else + { + /* Reset the UPRS Bit */ + TIMx->CTRL1 &= (uint32_t)(~((uint32_t)TIM_CTRL1_UPRS)); + } +} + +/** +*\*\name TIM_SelectHallSensor +*\*\fun Enables or disables the TIMx's Hall sensor interface. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_SelectHallSensor(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Set the TI1SEL Bit */ + TIMx->CTRL2 |= (uint32_t)TIM_CTRL2_TI1SEL; + } + else + { + /* Reset the TI1SEL Bit */ + TIMx->CTRL2 &= (uint32_t)(~((uint32_t)TIM_CTRL2_TI1SEL)); + } +} + +/** +*\*\name TIM_SelectOnePulseMode +*\*\fun Selects the TIMx's One Pulse Mode. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_OPMode +*\*\ - TIM_OPMODE_SINGLE +*\*\ - TIM_OPMODE_REPET +*\*\return none +**/ +void TIM_SelectOnePulseMode(TIM_Module* TIMx, uint32_t TIM_OPMode) +{ + /* Reset the ONEPM Bit */ + TIMx->CTRL1 &= (uint32_t)(~((uint32_t)TIM_CTRL1_ONEPM)); + /* Configure the ONEPM Mode */ + TIMx->CTRL1 |= (uint32_t)TIM_OPMode; +} + +/** +*\*\name TIM_SelectOutputTrig +*\*\fun Selects the TIMx Trigger Output Mode. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param TIM_TRGOSource +*\*\ - TIM_TRGO_SRC_RESET +*\*\ - TIM_TRGO_SRC_ENABLE +*\*\ - TIM_TRGO_SRC_UPDATE +*\*\ - TIM_TRGO_SRC_OC1 +*\*\ - TIM_TRGO_SRC_OC1REF +*\*\ - TIM_TRGO_SRC_OC2REF +*\*\ - TIM_TRGO_SRC_OC3REF +*\*\ - TIM_TRGO_SRC_OC4REF +*\*\ - TIM_TRGO_SRC_OC4_7_8_9REF +*\*\return none +**/ +void TIM_SelectOutputTrig(TIM_Module* TIMx, uint32_t TIM_TRGOSource) +{ + /* Reset the MMSEL Bits */ + TIMx->CTRL2 &= (uint32_t)(~((uint32_t)TIM_CTRL2_MMSEL)); + /* Select the TRGO source */ + TIMx->CTRL2 |= TIM_TRGOSource; +} + +/** +*\*\name TIM_SelectOutputTrig2 +*\*\fun Selects the TIMx Trigger Output Mode. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_TRGO2Source +*\*\ - TIM_TRGO2_SRC_RESET +*\*\ - TIM_TRGO2_SRC_ENABLE +*\*\ - TIM_TRGO2_SRC_UPDATE +*\*\ - TIM_TRGO2_SRC_OC1 +*\*\ - TIM_TRGO2_SRC_OC1REF +*\*\ - TIM_TRGO2_SRC_OC2REF +*\*\ - TIM_TRGO2_SRC_OC3REF +*\*\ - TIM_TRGO2_SRC_OC4REF +*\*\ - TIM_TRGO2_SRC_OC5REF +*\*\ - TIM_TRGO2_SRC_OC6REF +*\*\ - LL_TIM_TRGO2_OC4_RISINGFALLING +*\*\ - LL_TIM_TRGO2_OC6_RISINGFALLING +*\*\ - LL_TIM_TRGO2_OC4_RISING_OC6_RISING +*\*\ - LL_TIM_TRGO2_OC4_RISING_OC6_FALLING +*\*\ - LL_TIM_TRGO2_OC5_RISING_OC6_RISING +*\*\ - LL_TIM_TRGO2_OC5_RISING_OC6_FALLING +*\*\return none +**/ +void TIM_SelectOutputTrig2(TIM_Module* TIMx, uint32_t TIM_TRGO2Source) +{ + /* Reset the MMSEL2 Bits */ + TIMx->CTRL2 &= (uint32_t)(~((uint32_t)TIM_CTRL2_MMSEL2)); + /* Select the TRGO2 source */ + TIMx->CTRL2 |= TIM_TRGO2Source; +} + +/** +*\*\name TIM_SelectSlaveMode +*\*\fun Selects the TIMx Slave Mode. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_SlaveMode +*\*\ - TIM_SLAVE_MODE_DISABLE +*\*\ - TIM_SLAVE_MODE_RESET +*\*\ - TIM_SLAVE_MODE_GATED +*\*\ - TIM_SLAVE_MODE_TRIG +*\*\ - TIM_SLAVE_MODE_EXT1 +*\*\ - TIM_SLAVE_MODE_GATED_RESET +*\*\ - TIM_SLAVE_MODE_TRIG_RESET +*\*\return none +**/ +void TIM_SelectSlaveMode(TIM_Module* TIMx, uint32_t TIM_SlaveMode) +{ + /* Reset the SMSEL Bits */ + TIMx->SMCTRL &= (uint32_t)(~((uint32_t)TIM_SMCTRL_SMSEL)); + /* Select the Slave Mode */ + TIMx->SMCTRL |= (uint32_t)TIM_SlaveMode; +} + +/** +*\*\name TIM_SelectMasterSlaveMode +*\*\fun Sets or Resets the TIMx Master/Slave Mode. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_SlaveMode +*\*\ - TIM_MASTER_SLAVE_MODE_ENABLE +*\*\ - TIM_MASTER_SLAVE_MODE_DISABLE +*\*\return none +**/ +void TIM_SelectMasterSlaveMode(TIM_Module* TIMx, uint32_t TIM_MasterSlaveMode) +{ + /* Reset the MSMD Bit */ + TIMx->SMCTRL &= (uint32_t)(~((uint32_t)TIM_SMCTRL_MSMD)); + /* Set or Reset the MSMD Bit */ + TIMx->SMCTRL |= (uint32_t)TIM_MasterSlaveMode; +} + +/** +*\*\name TIM_SetCnt +*\*\fun Sets the TIMx Counter Register value +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param Counter +*\*\ - Counter can be a number between 0x00000000 and 0xFFFFFFFF +*\*\return none +**/ +void TIM_SetCnt(TIM_Module* TIMx, uint32_t Counter) +{ + /* Set the Counter Register value */ + TIMx->CNT = (uint32_t)((uint32_t)Counter); +} + +/** +*\*\name TIM_SetAutoReload +*\*\fun Sets the TIMx Autoreload Register value +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param Autoreload +*\*\ - Autoreload can be a number between 0x00000000 and 0xFFFFFFFF +*\*\return none +**/ +void TIM_SetAutoReload(TIM_Module* TIMx, uint32_t Autoreload) +{ + /* Set the Autoreload Register value */ + TIMx->AR = (uint32_t)((uint32_t)Autoreload); +} + +/** +*\*\name TIM_SetCmp1 +*\*\fun Sets the TIMx Capture Compare1 Register value +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Compare1 +*\*\ - Compare1 can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp1(TIM_Module* TIMx, uint16_t Compare1) +{ + uint32_t tmpccdatx ; + tmpccdatx = TIMx->CCDAT1 ; + /* Reset the Capture Compare1 Register value */ + tmpccdatx &= (uint32_t)(~TIM_CCDAT1_CCDAT1); + tmpccdatx |= (uint32_t)Compare1; + /* Set the Capture Compare1 Register value */ + TIMx->CCDAT1 = tmpccdatx; +} + +/** +*\*\name TIM_SetCmp2 +*\*\fun Sets the TIMx Capture Compare2 Register value +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Compare2 +*\*\ - Compare2 can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp2(TIM_Module* TIMx, uint16_t Compare2) +{ + uint32_t tmpccdatx ; + tmpccdatx = TIMx->CCDAT2 ; + /* Reset the Capture Compare2 Register value */ + tmpccdatx &= (uint32_t)(~TIM_CCDAT2_CCDAT2); + tmpccdatx |= (uint32_t)Compare2; + /* Set the Capture Compare2 Register value */ + TIMx->CCDAT2 = tmpccdatx; +} + +/** +*\*\name TIM_SetCmp3 +*\*\fun Sets the TIMx Capture Compare3 Register value +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Compare3 +*\*\ - Compare3 can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp3(TIM_Module* TIMx, uint16_t Compare3) +{ + uint32_t tmpccdatx ; + tmpccdatx = TIMx->CCDAT3 ; + /* Reset the Capture Compare3 Register value */ + tmpccdatx &= (uint32_t)(~TIM_CCDAT3_CCDAT3); + tmpccdatx |= (uint32_t)Compare3; + /* Set the Capture Compare3 Register value */ + TIMx->CCDAT3 = tmpccdatx; +} + +/** +*\*\name TIM_SetCmp4 +*\*\fun Sets the TIMx Capture Compare4 Register value +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Compare4 +*\*\ - Compare4 can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp4(TIM_Module* TIMx, uint16_t Compare4) +{ + uint32_t tmpccdatx ; + tmpccdatx = TIMx->CCDAT4 ; + /* Reset the Capture Compare4 Register value */ + tmpccdatx &= (uint32_t)(~TIM_CCDAT4_CCDAT4); + tmpccdatx |= (uint32_t)Compare4; + /* Set the Capture Compare4 Register value */ + TIMx->CCDAT4 = tmpccdatx; +} + +/** +*\*\name TIM_SetCmp5 +*\*\fun Sets the TIMx Capture Compare5 Register value +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Compare5 +*\*\ - Compare5 can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp5(TIM_Module* TIMx, uint16_t Compare5) +{ + /* Set the Capture Compare5 Register value */ + TIMx->CCDAT5 = (uint32_t)Compare5; +} + +/** +*\*\name TIM_SetCmp6 +*\*\fun Sets the TIMx Capture Compare6 Register value +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param Compare6 +*\*\ - Compare6 can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp6(TIM_Module* TIMx, uint16_t Compare6) +{ + /* Set the Capture Compare6 Register value */ + TIMx->CCDAT6 = (uint32_t)Compare6; +} + +/** +*\*\name TIM_SetCmp7 +*\*\fun Sets the TIMx Capture Compare7 Register value +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param Compare7 +*\*\ - Compare7 can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp7(TIM_Module* TIMx, uint16_t Compare7) +{ + /* Set the Capture Compare7 Register value */ + TIMx->CCDAT7 = (uint32_t)Compare7; +} + +/** +*\*\name TIM_SetCmp8 +*\*\fun Sets the TIMx Capture Compare8 Register value +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param Compare8 +*\*\ - Compare8 can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp8(TIM_Module* TIMx, uint16_t Compare8) +{ + /* Set the Capture Compare8 Register value */ + TIMx->CCDAT8 = (uint32_t)Compare8; +} + +/** +*\*\name TIM_SetCmp9 +*\*\fun Sets the TIMx Capture Compare9 Register value +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param Compare9 +*\*\ - Compare9 can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp9(TIM_Module* TIMx, uint16_t Compare9) +{ + /* Set the Capture Compare9 Register value */ + TIMx->CCDAT9 = (uint32_t)Compare9; +} + +/** +*\*\name TIM_SetCmp1D +*\*\fun Sets the CCDDAT1[16:31] in TIM1_CCDAT1 register +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param compare1D +*\*\ - compare1D can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp1D(TIM_Module* TIMx, uint16_t compare1D) +{ + uint32_t tmpccdatx ; + tmpccdatx = TIMx->CCDAT1 ; + /* Reset the Capture compare1D Register value */ + tmpccdatx &= (uint32_t)(~TIM_CCDAT1_CCDDAT1); + tmpccdatx |= (uint32_t)(((uint32_t)compare1D) << 0x00000010); + /* Set the Capture compare1D Register value */ + TIMx->CCDAT1 = tmpccdatx; +} + +/** +*\*\name TIM_SetCmp2D +*\*\fun Sets the CCDDAT2[16:31] in TIM1_CCDAT2 register +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param compare2D +*\*\ - compare2D can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp2D(TIM_Module* TIMx, uint16_t compare2D) +{ + uint32_t tmpccdatx ; + tmpccdatx = TIMx->CCDAT2 ; + /* Reset the Capture compare2D Register value */ + tmpccdatx &= (uint32_t)(~TIM_CCDAT2_CCDDAT2); + tmpccdatx |= (uint32_t)(((uint32_t)compare2D) << 0x00000010); + /* Set the Capture compare2D Register value */ + TIMx->CCDAT2 = tmpccdatx; +} + +/** +*\*\name TIM_SetCmp3D +*\*\fun Sets the CCDDAT3[16:31] in TIM1_CCDAT3 register +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param compare3D +*\*\ - compare3D can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp3D(TIM_Module* TIMx, uint16_t compare3D) +{ + uint32_t tmpccdatx ; + tmpccdatx = TIMx->CCDAT3 ; + /* Reset the Capture compare3D Register value */ + tmpccdatx &= (uint32_t)(~TIM_CCDAT3_CCDDAT3); + tmpccdatx |= (uint32_t)(((uint32_t)compare3D) << 0x00000010); + /* Set the Capture compare3D Register value */ + TIMx->CCDAT3 = tmpccdatx; +} + +/** +*\*\name TIM_SetCmp4D +*\*\fun Sets the CCDDAT4[16:31] in TIM1_CCDAT4 register +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param compare4D +*\*\ - compare4D can be a number between 0x0000 and 0xFFFF +*\*\return none +**/ +void TIM_SetCmp4D(TIM_Module* TIMx, uint16_t compare4D) +{ + uint32_t tmpccdatx ; + tmpccdatx = TIMx->CCDAT4 ; + /* Reset the Capture compare4D Register value */ + tmpccdatx &= (uint32_t)(~TIM_CCDAT4_CCDDAT4); + tmpccdatx |= (uint32_t)(((uint32_t)compare4D) << 0x00000010); + /* Set the Capture compare4D Register value */ + TIMx->CCDAT4 = tmpccdatx; +} + +/** +*\*\name ConfigTI1 +*\*\fun Configure the TI1 as Input. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param ICPolarity +*\*\ - TIM_IC_POLARITY_RISING +*\*\ - TIM_IC_POLARITY_FALLING +*\*\param ICSelection +*\*\ - TIM_IC_SELECTION_DIRECTTI +*\*\ - TIM_IC_SELECTION_INDIRECTTI +*\*\ - TIM_IC_SELECTION_TRC +*\*\param ICFilter +*\*\ - ICFilter can be a number between 0x0 and 0xF +*\*\return none +**/ +void ConfigTI1(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter) +{ + uint32_t tmpccmodx ; + uint32_t tmpccen ; + + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCEN &= (uint32_t)(~((uint32_t)TIM_CCEN_CC1EN)); + + /* Get the TIMx_CCMOD1 and TIMx_CCEN register value */ + tmpccmodx = TIMx->CCMOD1; + tmpccen = TIMx->CCEN; + + /* Select the Input and set the filter */ + tmpccmodx &= (uint32_t)(((uint32_t) ~((uint32_t)TIM_CCMOD1_CC1SEL)) & ((uint32_t) ~((uint32_t)TIM_CCMOD1_IC1F))); + tmpccmodx |= (uint32_t)(ICSelection | (uint32_t)(ICFilter << (uint32_t)4)); + + if ((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + /* Select the Polarity and set the CC1E Bit */ + tmpccen &= (uint32_t)(~((uint32_t)(TIM_CCEN_CC1P))); + tmpccen |= (uint32_t)(ICPolarity | (uint32_t)TIM_CCEN_CC1EN); + } + + /* Write to TIMx CCMOD1 and CCEN registers */ + TIMx->CCMOD1 = tmpccmodx; + TIMx->CCEN = tmpccen; +} + +/** +*\*\name ConfigTI2 +*\*\fun Configure the TI2 as Input. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param ICPolarity +*\*\ - TIM_IC_POLARITY_RISING +*\*\ - TIM_IC_POLARITY_FALLING +*\*\param ICSelection +*\*\ - TIM_IC_SELECTION_DIRECTTI +*\*\ - TIM_IC_SELECTION_INDIRECTTI +*\*\ - TIM_IC_SELECTION_TRC +*\*\param ICFilter +*\*\ - ICFilter can be a number between 0x0 and 0xF +*\*\return none +**/ +void ConfigTI2(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter) +{ + uint32_t tmpccmodx ; + uint32_t tmpccen, tmp ; + + /* Disable the Channel 2: Reset the CC2E Bit */ + TIMx->CCEN &= (uint32_t)(~((uint32_t)TIM_CCEN_CC2EN)); + + /* Get the TIMx_CCMOD1 and TIMx_CCEN register value */ + tmpccmodx = TIMx->CCMOD1; + tmpccen = TIMx->CCEN; + + tmp = (uint32_t)(ICPolarity << 4); + + /* Select the Input and set the filter */ + tmpccmodx &= (uint32_t)(((uint32_t) ~((uint32_t)TIM_CCMOD1_CC2SEL)) & ((uint32_t) ~((uint32_t)TIM_CCMOD1_IC2F))); + tmpccmodx |= (uint32_t)(ICFilter << 12); + tmpccmodx |= (uint32_t)(ICSelection << 8); + + if ((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + /* Select the Polarity and set the CC2E Bit */ + tmpccen &= (uint32_t)(~((uint32_t)(TIM_CCEN_CC2P))); + tmpccen |= (uint32_t)(tmp | (uint32_t)TIM_CCEN_CC2EN); + } + + /* Write to TIMx CCMOD1 and CCEN registers */ + TIMx->CCMOD1 = tmpccmodx; + TIMx->CCEN = tmpccen; +} + +/** +*\*\name ConfigTI3 +*\*\fun Configure the TI3 as Input. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param ICPolarity +*\*\ - TIM_IC_POLARITY_RISING +*\*\ - TIM_IC_POLARITY_FALLING +*\*\param ICSelection +*\*\ - TIM_IC_SELECTION_DIRECTTI +*\*\ - TIM_IC_SELECTION_INDIRECTTI +*\*\ - TIM_IC_SELECTION_TRC +*\*\param ICFilter +*\*\ - ICFilter can be a number between 0x0 and 0xF +*\*\return none +**/ +void ConfigTI3(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter) +{ + uint32_t tmpccmodx ; + uint32_t tmpccen, tmp ; + + /* Disable the Channel 3: Reset the CC3E Bit */ + TIMx->CCEN &= (uint32_t)(~((uint32_t)TIM_CCEN_CC3EN)); + + /* Get the TIMx_CCMOD2 and TIMx_CCEN register value */ + tmpccmodx = TIMx->CCMOD2; + tmpccen = TIMx->CCEN; + + tmp = (uint32_t)(ICPolarity << 8); + + /* Select the Input and set the filter */ + tmpccmodx &= (uint32_t)(((uint32_t) ~((uint32_t)TIM_CCMOD2_CC3SEL)) & ((uint32_t) ~((uint32_t)TIM_CCMOD2_IC3F))); + tmpccmodx |= (uint32_t)(ICSelection | (uint32_t)(ICFilter << (uint32_t)4)); + + if ((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + /* Select the Polarity and set the CC3E Bit */ + tmpccen &= (uint32_t)(~((uint32_t)(TIM_CCEN_CC3P))); + tmpccen |= (uint32_t)(tmp | (uint32_t)TIM_CCEN_CC3EN); + } + + /* Write to TIMx CCMOD2 and CCEN registers */ + TIMx->CCMOD2 = tmpccmodx; + TIMx->CCEN = tmpccen; +} + +/** +*\*\name ConfigTI4 +*\*\fun Configure the TI4 as Input. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param ICPolarity +*\*\ - TIM_IC_POLARITY_RISING +*\*\ - TIM_IC_POLARITY_FALLING +*\*\param ICSelection +*\*\ - TIM_IC_SELECTION_DIRECTTI +*\*\ - TIM_IC_SELECTION_INDIRECTTI +*\*\ - TIM_IC_SELECTION_TRC +*\*\param ICFilter +*\*\ - ICFilter can be a number between 0x0 and 0xF +*\*\return none +**/ +void ConfigTI4(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter) +{ + uint32_t tmpccmodx ; + uint32_t tmpccen, tmp ; + + /* Disable the Channel 4: Reset the CC4E Bit */ + TIMx->CCEN &= (uint32_t)(~((uint32_t)TIM_CCEN_CC4EN)); + + /* Get the TIMx_CCMOD2 and TIMx_CCEN register value */ + tmpccmodx = TIMx->CCMOD2; + tmpccen = TIMx->CCEN; + + tmp = (uint32_t)(ICPolarity << 12); + + /* Select the Input and set the filter */ + tmpccmodx &= (uint32_t)((uint32_t)(~(uint32_t)TIM_CCMOD2_CC4SEL) & ((uint32_t) ~((uint32_t)TIM_CCMOD2_IC4F))); + tmpccmodx |= (uint32_t)(ICSelection << 8); + tmpccmodx |= (uint32_t)(ICFilter << 12); + + if ((IS_ATIM1_4_DEVICE(TIMx)) || (IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + /* Select the Polarity and set the CC4E Bit */ + tmpccen &= (uint32_t)(~((uint32_t)(TIM_CCEN_CC4P))); + tmpccen |= (uint32_t)(tmp | (uint32_t)TIM_CCEN_CC4EN); + } + else + { + /* Select the Polarity and set the CC4E Bit */ + tmpccen &= (uint32_t)(~((uint32_t)(TIM_CCEN_CC4P))); + tmpccen |= (uint32_t)(ICPolarity | (uint32_t)TIM_CCEN_CC4EN); + } + + /* Write to TIMx CCMOD2 and CCEN registers */ + TIMx->CCMOD2 = tmpccmodx; + TIMx->CCEN = tmpccen; +} + +/** +*\*\name TIM_SetInCap1Prescaler +*\*\fun Sets the TIMx Input Capture 1 prescaler. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param ICPrescaler +*\*\ - TIM_IC_PSC_DIV1 +*\*\ - TIM_IC_PSC_DIV2 +*\*\ - TIM_IC_PSC_DIV4 +*\*\ - TIM_IC_PSC_DIV8 +*\*\return none +**/ +void TIM_SetInCap1Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler) +{ + /* Reset the IC1PSC Bits */ + TIMx->CCMOD1 &= (uint32_t)(~TIM_CCMOD1_IC1PSC); + /* Set the IC1PSC value */ + TIMx->CCMOD1 |= (uint32_t)ICPrescaler; +} + +/** +*\*\name TIM_SetInCap2Prescaler +*\*\fun Sets the TIMx Input Capture 2 prescaler. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param ICPrescaler +*\*\ - TIM_IC_PSC_DIV1 +*\*\ - TIM_IC_PSC_DIV2 +*\*\ - TIM_IC_PSC_DIV4 +*\*\ - TIM_IC_PSC_DIV8 +*\*\return none +**/ +void TIM_SetInCap2Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler) +{ + /* Reset the IC2PSC Bits */ + TIMx->CCMOD1 &= (uint32_t)(~TIM_CCMOD1_IC2PSC); + /* Set the IC2PSC value */ + TIMx->CCMOD1 |= (uint32_t)(ICPrescaler << 8); +} + +/** +*\*\name TIM_SetInCap3Prescaler +*\*\fun Sets the TIMx Input Capture 3 prescaler. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param ICPrescaler +*\*\ - TIM_IC_PSC_DIV1 +*\*\ - TIM_IC_PSC_DIV2 +*\*\ - TIM_IC_PSC_DIV4 +*\*\ - TIM_IC_PSC_DIV8 +*\*\return none +**/ +void TIM_SetInCap3Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler) +{ + /* Reset the IC3PSC Bits */ + TIMx->CCMOD2 &= (uint32_t)(~TIM_CCMOD2_IC3PSC); + /* Set the IC3PSC value */ + TIMx->CCMOD2 |= (uint32_t)ICPrescaler; +} + +/** +*\*\name TIM_SetInCap4Prescaler +*\*\fun Sets the TIMx Input Capture 4 prescaler. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param ICPrescaler +*\*\ - TIM_IC_PSC_DIV1 +*\*\ - TIM_IC_PSC_DIV2 +*\*\ - TIM_IC_PSC_DIV4 +*\*\ - TIM_IC_PSC_DIV8 +*\*\return none +**/ +void TIM_SetInCap4Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler) +{ + /* Reset the IC4PSC Bits */ + TIMx->CCMOD2 &= (uint32_t)(~TIM_CCMOD2_IC4PSC); + /* Set the IC4PSC value */ + TIMx->CCMOD2 |= (uint32_t)(ICPrescaler << 8); +} + +/** +*\*\name TIM_SelectInputTrig +*\*\fun Selects the Input Trigger source +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_InputTriggerSource: +*\*\ - TIM_TRIG_SEL_IN_TR0 +*\*\ - TIM_TRIG_SEL_IN_TR1 +*\*\ - TIM_TRIG_SEL_IN_TR2 +*\*\ - TIM_TRIG_SEL_IN_TR3 +*\*\ - TIM_TRIG_SEL_IN_TR4 +*\*\ - TIM_TRIG_SEL_IN_TR5 +*\*\ - TIM_TRIG_SEL_IN_TR6 +*\*\ - TIM_TRIG_SEL_IN_TR7 +*\*\ - TIM_TRIG_SEL_IN_TR8 +*\*\ - TIM_TRIG_SEL_IN_TR9 +*\*\ - TIM_TRIG_SEL_IN_TR10 +*\*\ - TIM_TRIG_SEL_IN_TR11 +*\*\ - TIM_TRIG_SEL_IN_TR12 +*\*\ - TIM_TRIG_SEL_IN_TR13 +*\*\ - TIM_TRIG_SEL_IN_TR14 +*\*\ - TIM_TRIG_SEL_TI1F_ED +*\*\ - TIM_TRIG_SEL_TI1FP1 +*\*\ - TIM_TRIG_SEL_TI2FP2 +*\*\ - TIM_TRIG_SEL_ETRF +*\*\return none +**/ +void TIM_SelectInputTrig(TIM_Module* TIMx, uint32_t TIM_InputTriggerSource) +{ + uint32_t tmpsmctrl ; + uint32_t tmpinsel ; + /* Get the TIMx SMCTRL and TIMx INSEL register value */ + tmpsmctrl = TIMx->SMCTRL; + tmpinsel = TIMx->INSEL; + + /* Reset the TS Bits */ + tmpsmctrl &= (uint32_t)(~((uint32_t)TIM_SMCTRL_TSEL)); + /* Reset the ITRS Bits */ + tmpinsel &= (uint32_t)(~((uint32_t)TIM_INSEL_ITRS)); + + if (IS_ITR_SEL(TIM_InputTriggerSource)) + { + /* Set the Input Trigger source */ + tmpinsel |= (uint32_t)TIM_InputTriggerSource; + } + else + { + /* Set the Input Trigger source */ + tmpsmctrl |= (uint32_t)TIM_InputTriggerSource; + + } + + /* Write to TIMx SMCTRL and INSEL */ + TIMx->SMCTRL = tmpsmctrl; + TIMx->INSEL = tmpinsel; +} + +/** +*\*\name TIM_ConfigExtTrig +*\*\fun Configures the TIMx External Trigger (ETR). +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_ExtTRGPrescaler: +*\*\ - TIM_EXT_TRG_PSC_OFF +*\*\ - TIM_EXT_TRG_PSC_DIV2 +*\*\ - TIM_EXT_TRG_PSC_DIV4 +*\*\ - TIM_EXT_TRG_PSC_DIV8 +*\*\param TIM_ExtTRGPolarity +*\*\ - TIM_EXT_TRIG_POLARITY_INVERTED +*\*\ - TIM_EXT_TRIG_POLARITY_NONINVERTED +*\*\param ExtTRGFilter +*\*\ - ExtTRGFilter can be a number between 0x0 and 0xF +*\*\return none +**/ +void TIM_ConfigExtTrig(TIM_Module* TIMx, uint32_t TIM_ExtTRGPrescaler, uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) +{ + uint32_t tmpsmctrl ; + tmpsmctrl = TIMx->SMCTRL; + /* Reset the ETR Bits */ + tmpsmctrl &= (uint32_t)(~(TIM_SMCTRL_EXTPS | TIM_SMCTRL_EXTP | TIM_SMCTRL_EXTF)); + /* Set the Prescaler, the Filter value and the Polarity */ + tmpsmctrl |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << (uint32_t)12))); + /* Write to TIMx SMCTRL */ + TIMx->SMCTRL = tmpsmctrl; +} + +/** +*\*\name TIM_SelectETRInputSource +*\*\fun Configures the source of tim_etr_in. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_ETRInputSource: +*\*\ - TIM_CAPETRSEL_0 +*\*\ - TIM_CAPETRSEL_1 +*\*\ - TIM_CAPETRSEL_2 +*\*\ - TIM_CAPETRSEL_3 +*\*\ - TIM_CAPETRSEL_4 +*\*\ - TIM_CAPETRSEL_5 +*\*\ - TIM_CAPETRSEL_6 +*\*\ - TIM_CAPETRSEL_7 +*\*\ - TIM_CAPETRSEL_8 +*\*\ - TIM_CAPETRSEL_10 +*\*\ - TIM_CAPETRSEL_11 +*\*\ - TIM_CAPETRSEL_12 +*\*\ - TIM_CAPETRSEL_13 +*\*\return none +**/ +void TIM_SelectETRInputSource(TIM_Module* TIMx, uint32_t TIM_ETRInputSource) +{ + uint32_t tmpinsel ; + tmpinsel = TIMx->INSEL; + /* Reset the ETRS Bits */ + tmpinsel &= (uint32_t)(~TIM_INSEL_ETRS); + /* Set the ETRS Bits */ + tmpinsel |= (uint32_t)TIM_ETRInputSource; + /* Write to TIMx SMCTRL */ + TIMx->INSEL = tmpinsel; +} + +/** +*\*\name TIM_SetClkDiv +*\*\fun Sets the TIMx Clock Division value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_CKD: +*\*\ - TIM_CLK_DIV1 +*\*\ - TIM_CLK_DIV2 +*\*\ - TIM_CLK_DIV4 +*\*\return none +**/ +void TIM_SetClkDiv(TIM_Module* TIMx, uint32_t TIM_CKD) +{ + /* Reset the CKD Bits */ + TIMx->CTRL1 &= (uint32_t)(~TIM_CTRL1_CLKD); + /* Set the CKD value */ + TIMx->CTRL1 |= (uint32_t)TIM_CKD; +} + +/** +*\*\name TIM_GetCap1 +*\*\fun Gets the TIMx Input Capture 1 value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\return Capture Compare 1 Register value. +**/ +uint16_t TIM_GetCap1(TIM_Module* TIMx) +{ + /* Get the Capture 1 Register value */ + return (uint16_t)(TIMx->CCDAT1); +} + +/** +*\*\name TIM_GetCap2 +*\*\fun Gets the TIMx Input Capture 2 value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\return Capture Compare 2 Register value. +**/ +uint16_t TIM_GetCap2(TIM_Module* TIMx) +{ + /* Get the Capture 2 Register value */ + return (uint16_t)(TIMx->CCDAT2); +} + +/** +*\*\name TIM_GetCap3 +*\*\fun Gets the TIMx Input Capture 3 value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\return Capture Compare 3 Register value. +**/ +uint16_t TIM_GetCap3(TIM_Module* TIMx) +{ + /* Get the Capture 3 Register value */ + return (uint16_t)(TIMx->CCDAT3); +} + +/** +*\*\name TIM_GetCap4 +*\*\fun Gets the TIMx Input Capture 4 value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\return Capture Compare 4 Register value. +**/ +uint16_t TIM_GetCap4(TIM_Module* TIMx) +{ + /* Get the Capture 4 Register value */ + return (uint16_t)(TIMx->CCDAT4); +} + +/** +*\*\name TIM_GetCap5 +*\*\fun Gets the TIMx Input Capture 5 value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\return Capture Compare 5 Register value. +**/ +uint16_t TIM_GetCap5(TIM_Module* TIMx) +{ + /* Get the Capture 5 Register value */ + return (uint16_t)(TIMx->CCDAT5); +} + + +/** +*\*\name TIM_GetCap6 +*\*\fun Gets the TIMx Input Capture 6 value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\return Capture Compare 6 Register value. +**/ +uint16_t TIM_GetCap6(TIM_Module* TIMx) +{ + /* Get the Capture 1 Register value */ + return (uint16_t)(TIMx->CCDAT6); +} + +/** +*\*\name TIM_GetCap7 +*\*\fun Gets the TIMx Input Capture 7 value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\return Capture Compare 7 Register value. +**/ +uint16_t TIM_GetCap7(TIM_Module* TIMx) +{ + /* Get the Capture 7 Register value */ + return (uint16_t)(TIMx->CCDAT7); +} + +/** +*\*\name TIM_GetCap8 +*\*\fun Gets the TIMx Input Capture 8 value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\return Capture Compare 8 Register value. +**/ +uint16_t TIM_GetCap8(TIM_Module* TIMx) +{ + /* Get the Capture 8 Register value */ + return (uint16_t)(TIMx->CCDAT8); +} + +/** +*\*\name TIM_GetCap9 +*\*\fun Gets the TIMx Input Capture 9 value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\return Capture Compare 9 Register value. +**/ +uint16_t TIM_GetCap9(TIM_Module* TIMx) +{ + /* Get the Capture 9 Register value */ + return (uint16_t)(TIMx->CCDAT9); +} + +/** +*\*\name TIM_GetCap1D +*\*\fun Gets the TIMx Input Capture 1D value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\return Capture Compare 1D Register value. +**/ +uint16_t TIM_GetCap1D(TIM_Module* TIMx) +{ + /* Get the Capture 1D Register value */ + return (uint16_t)((TIMx->CCDAT1) >> 0x00000010); +} + +/** +*\*\name TIM_GetCap2D +*\*\fun Gets the TIMx Input Capture 2D value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\return Capture Compare 2D Register value. +**/ +uint16_t TIM_GetCap2D(TIM_Module* TIMx) +{ + /* Get the Capture 2D Register value */ + return (uint16_t)((TIMx->CCDAT2) >> 0x00000010); +} + +/** +*\*\name TIM_GetCap3D +*\*\fun Gets the TIMx Input Capture 3D value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\return Capture Compare 3D Register value. +**/ +uint16_t TIM_GetCap3D(TIM_Module* TIMx) +{ + /* Get the Capture 3D Register value */ + return (uint16_t)((TIMx->CCDAT3) >> 0x00000010); +} + +/** +*\*\name TIM_GetCap4D +*\*\fun Gets the TIMx Input Capture 4D value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\return Capture Compare 4D Register value. +**/ +uint16_t TIM_GetCap4D(TIM_Module* TIMx) +{ + /* Get the Capture 4D Register value */ + return (uint16_t)((TIMx->CCDAT4) >> 0x00000010); +} + +/** +*\*\name TIM_GetCnt +*\*\fun Gets the TIMx Counter value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\return Counter Register value. +**/ +uint32_t TIM_GetCnt(TIM_Module* TIMx) +{ + /* Get the Counter Register value */ + return (uint32_t)(TIMx->CNT); +} + +/** +*\*\name TIM_GetPrescaler +*\*\fun Gets the TIMx Prescaler value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\return Prescaler Register value. +**/ +uint16_t TIM_GetPrescaler(TIM_Module* TIMx) +{ + /* Get the Prescaler Register value */ + return (uint16_t)(TIMx->PSC); +} + +/** +*\*\name TIM_GetAutoReload +*\*\fun Gets the TIMx AR value. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\return AR Register value. +**/ +uint32_t TIM_GetAutoReload(TIM_Module* TIMx) +{ + /* Get the Prescaler Register value */ + return (uint32_t)(TIMx->AR); +} + +/** +*\*\name TIM_GetCCENStatus +*\*\fun Checks whether the specified TIM flag is set or not. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_CCEN : +*\*\ - TIM_CC1EN +*\*\ - TIM_CC1NEN +*\*\ - TIM_CC2EN +*\*\ - TIM_CC2NEN +*\*\ - TIM_CC3EN +*\*\ - TIM_CC3NEN +*\*\ - TIM_CC4EN +*\*\ - TIM_CC4NEN +*\*\ - TIM_CC5EN +*\*\ - TIM_CC6EN +*\*\return The new state of TIM_FLAG (SET or RESET). +**/ +FlagStatus TIM_GetCCENStatus(TIM_Module* TIMx, uint32_t TIM_CCEN) +{ + FlagStatus bitstatus; + + if ((TIMx->CCEN & TIM_CCEN) != (uint32_t)RESET) + { + bitstatus = SET; + } + + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name TIM_GetFlagStatus +*\*\fun Checks whether the specified TIM flag is set or not. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param TIM_FLAG : +*\*\ - TIM_FLAG_UPDATE +*\*\ - TIM_FLAG_CC1 +*\*\ - TIM_FLAG_CC2 +*\*\ - TIM_FLAG_CC3 +*\*\ - TIM_FLAG_CC4 +*\*\ - TIM_FLAG_CC5 +*\*\ - TIM_FLAG_CC6 +*\*\ - TIM_FLAG_CC7 +*\*\ - TIM_FLAG_CC8 +*\*\ - TIM_FLAG_CC9 +*\*\ - TIM_FLAG_COM +*\*\ - TIM_FLAG_TRIG +*\*\ - TIM_FLAG_BREAK +*\*\ - TIM_FLAG_BREAK2 +*\*\ - TIM_FLAG_SYS_BREAK +*\*\ - TIM_FLAG_CC1OF +*\*\ - TIM_FLAG_CC2OF +*\*\ - TIM_FLAG_CC3OF +*\*\ - TIM_FLAG_CC4OF +*\*\return The new state of TIM_FLAG (SET or RESET). +**/ +FlagStatus TIM_GetFlagStatus(TIM_Module* TIMx, uint32_t TIM_FLAG) +{ + FlagStatus bitstatus; + + if ((TIMx->STS & TIM_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name TIM_ClearFlag +*\*\fun Clears the TIMx's pending flags. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param TIM_FLAG : +*\*\ - TIM_FLAG_UPDATE +*\*\ - TIM_FLAG_CC1 +*\*\ - TIM_FLAG_CC2 +*\*\ - TIM_FLAG_CC3 +*\*\ - TIM_FLAG_CC4 +*\*\ - TIM_FLAG_CC5 +*\*\ - TIM_FLAG_CC6 +*\*\ - TIM_FLAG_CC7 +*\*\ - TIM_FLAG_CC8 +*\*\ - TIM_FLAG_CC9 +*\*\ - TIM_FLAG_COM +*\*\ - TIM_FLAG_TRIG +*\*\ - TIM_FLAG_BREAK +*\*\ - TIM_FLAG_BREAK2 +*\*\ - TIM_FLAG_SYS_BREAK +*\*\ - TIM_FLAG_CC1OF +*\*\ - TIM_FLAG_CC2OF +*\*\ - TIM_FLAG_CC3OF +*\*\ - TIM_FLAG_CC4OF +*\*\return none. +**/ +void TIM_ClearFlag(TIM_Module* TIMx, uint32_t TIM_FLAG) +{ + /* Clear the flags */ + TIMx->STS = (uint32_t)(~TIM_FLAG); +} + +/** +*\*\name TIM_GetIntStatus +*\*\fun Checks whether the TIM interrupt has occurred or not. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param TIM_IT : +*\*\ - TIM_INT_UPDATE +*\*\ - TIM_INT_CC1 +*\*\ - TIM_INT_CC2 +*\*\ - TIM_INT_CC3 +*\*\ - TIM_INT_CC4 +*\*\ - TIM_INT_CC5 +*\*\ - TIM_INT_CC6 +*\*\ - TIM_INT_CC7 +*\*\ - TIM_INT_CC8 +*\*\ - TIM_INT_CC9 +*\*\ - TIM_INT_COM +*\*\ - TIM_INT_TRIG +*\*\ - TIM_INT_BREAK +*\*\ - TIM_INT_BREAK2 +*\*\ - TIM_INT_SYS_BREAK +*\*\return The new state of the TIM_IT(SET or RESET). +**/ +INTStatus TIM_GetIntStatus(TIM_Module* TIMx, uint32_t TIM_IT) +{ + INTStatus bitstatus; + uint32_t itstatus = 0x0, itenable; + + if(TIM_IT == TIM_INT_UPDATE) + { + itstatus = TIMx->STS & TIM_FLAG_UPDATE; + } + else if(TIM_IT == TIM_INT_CC1) + { + itstatus = TIMx->STS & TIM_FLAG_CC1; + } + else if(TIM_IT == TIM_INT_CC2) + { + itstatus = TIMx->STS & TIM_FLAG_CC2; + } + else if(TIM_IT == TIM_INT_CC3) + { + itstatus = TIMx->STS & TIM_FLAG_CC3; + } + else if(TIM_IT == TIM_INT_CC4) + { + itstatus = TIMx->STS & TIM_FLAG_CC4; + } + else if(TIM_IT == TIM_INT_CC5) + { + itstatus = TIMx->STS & TIM_FLAG_CC5; + } + else if(TIM_IT == TIM_INT_CC6) + { + itstatus = TIMx->STS & TIM_FLAG_CC6; + } + else if(TIM_IT == TIM_INT_CC7) + { + itstatus = TIMx->STS & TIM_FLAG_CC7; + } + else if(TIM_IT == TIM_INT_CC8) + { + itstatus = TIMx->STS & TIM_FLAG_CC8; + } + else if(TIM_IT == TIM_INT_CC9) + { + itstatus = TIMx->STS & TIM_FLAG_CC9; + } + else if(TIM_IT == TIM_INT_COM) + { + itstatus = TIMx->STS & TIM_FLAG_COM; + } + else if(TIM_IT == TIM_INT_TRIG) + { + itstatus = TIMx->STS & TIM_FLAG_TRIG; + } + else if(TIM_IT == TIM_INT_BREAK) + { + itstatus = TIMx->STS & TIM_FLAG_BREAK; + } + else if(TIM_IT == TIM_INT_BREAK2) + { + itstatus = TIMx->STS & TIM_FLAG_BREAK2; + } + else if(TIM_IT == TIM_INT_SYS_BREAK) + { + itstatus = TIMx->STS & TIM_FLAG_SYS_BREAK; + } + else + { + + } + + if((TIM_IT == TIM_INT_BREAK) || (TIM_IT == TIM_INT_BREAK2) || (TIM_IT == TIM_INT_SYS_BREAK)) + { + itenable = TIMx->DINTEN & TIM_INT_BREAK; + } + else + { + itenable = TIMx->DINTEN & TIM_IT; + } + + if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name TIM_ClrIntPendingBit +*\*\fun Clears the TIMx's interrupt pending bits. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\ - BTIM1 +*\*\ - BTIM2 +*\*\ - BTIM3 +*\*\ - BTIM4 +*\*\param TIM_IT : +*\*\ - TIM_INT_UPDATE +*\*\ - TIM_INT_CC1 +*\*\ - TIM_INT_CC2 +*\*\ - TIM_INT_CC3 +*\*\ - TIM_INT_CC4 +*\*\ - TIM_INT_CC5 +*\*\ - TIM_INT_CC6 +*\*\ - TIM_INT_CC7 +*\*\ - TIM_INT_CC8 +*\*\ - TIM_INT_CC9 +*\*\ - TIM_INT_COM +*\*\ - TIM_INT_TRIG +*\*\ - TIM_INT_BREAK +*\*\ - TIM_INT_BREAK2 +*\*\ - TIM_INT_SYS_BREAK +*\*\return none. +**/ +void TIM_ClrIntPendingBit(TIM_Module* TIMx, uint32_t TIM_IT) +{ + /* Clear the IT pending Bit */ + if(TIM_IT == TIM_INT_UPDATE) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_UPDATE); + } + else if(TIM_IT == TIM_INT_CC1) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_CC1); + } + else if(TIM_IT == TIM_INT_CC2) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_CC2); + } + else if(TIM_IT == TIM_INT_CC3) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_CC3); + } + else if(TIM_IT == TIM_INT_CC4) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_CC4); + } + else if(TIM_IT == TIM_INT_CC5) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_CC5); + } + else if(TIM_IT == TIM_INT_CC6) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_CC6); + } + else if(TIM_IT == TIM_INT_CC7) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_CC7); + } + else if(TIM_IT == TIM_INT_CC8) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_CC8); + } + else if(TIM_IT == TIM_INT_CC9) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_CC9); + } + else if(TIM_IT == TIM_INT_COM) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_COM); + } + else if(TIM_IT == TIM_INT_TRIG) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_TRIG); + } + else if(TIM_IT == TIM_INT_BREAK) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_BREAK); + } + else if(TIM_IT == TIM_INT_BREAK2) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_BREAK2); + } + else if(TIM_IT == TIM_INT_SYS_BREAK) + { + TIMx->STS = (uint32_t)(~TIM_FLAG_SYS_BREAK); + } + else + { + + } +} + +/** +*\*\name TIM_SelectCenterAlignTrig. +*\*\fun Setting the trigger mode in central alignment mode. +*\*\param TIMx: +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param TIM_CenterAlignTriggerSource +*\*\ - TIM_UP_COUNTING +*\*\ - TIM_DOWN_COUNTING +*\*\ - TIM_UP_DOWN_COUNTING +*\*\return none +**/ +void TIM_SelectCenterAlignTrig(TIM_Module* TIMx, uint32_t TIM_CenterAlignTriggerSource) +{ + uint32_t temp_value ; + + temp_value = TIMx->CTRL1; + /* Reset the CMODE Bits */ + temp_value &= (uint32_t)(~((uint32_t)TIM_CTRL1_CMODE)); + /* Set the trigger source */ + temp_value |= (uint32_t)TIM_CenterAlignTriggerSource; + /* Write to TIMx CTRL1 register */ + TIMx->CTRL1 = temp_value; +} + +/** +*\*\name TIM_Asymmetric_Enable. +*\*\fun Enable or disable asymmetric mode in center-aligned. +*\*\param TIMx: +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_AsymmetricEnable(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Set the ASMMETRIC Bit */ + TIMx->CTRL1 |= (uint32_t)TIM_CTRL1_ASMMETRIC; + } + else + { + /* Reset the ASMMETRIC Bit */ + TIMx->CTRL1 &= (uint32_t)(~((uint32_t)TIM_CTRL1_ASMMETRIC)); + } +} + +/** +*\*\name TIM_OCxRefTriggerADC. +*\*\fun Enable or disable OCxREF to trigger ADC(x = 4,7,8 or 9). +*\*\param TIMx: +*\*\ - ATIM1 +*\*\ - ATIM2 +*\*\ - ATIM3 +*\*\ - ATIM4 +*\*\param OCxRef +*\*\ - TIM_CTRL2_TRIG4 +*\*\ - TIM_CTRL2_TRIG7 +*\*\ - TIM_CTRL2_TRIG8 +*\*\ - TIM_CTRL2_TRIG9 +*\*\param Cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_OCxRefTriggerADC(TIM_Module* TIMx, uint32_t OCxRef, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Set the TRIGx Bit */ + TIMx->CTRL2 |= (uint32_t)OCxRef; + } + else + { + /* Reset the TRIGx Bit */ + TIMx->CTRL2 &= (uint32_t)(~((uint32_t)OCxRef)); + } +} + +/** +*\*\name TIM_IC1FiltConfig +*\*\fun Config the filter of channel1. +*\*\param TIMx: +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_FiltInitStruct: +*\*\ - refer to the definition of TIM_FiltInitType +*\*\return none +**/ +void TIM_IC1FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct) +{ + uint32_t temp_chxfilt = 0; + + temp_chxfilt &= (uint32_t)(((uint32_t) ~((uint32_t)TIM_C1FILT_THRESH)) & + ((uint32_t) ~((uint32_t)TIM_C1FILT_WSIZE)) & + ((uint32_t) ~((uint32_t)TIM_C1FILT_SFPSC))); + + temp_chxfilt |= (uint32_t)((TIM_FiltInitStruct->ThreshHold << (uint32_t)(0x18)) | + (TIM_FiltInitStruct->WindowSize << (uint32_t)(0x11)) | + (TIM_FiltInitStruct->Prescaler)); + + if ((IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + TIMx->C1FILT = temp_chxfilt; + } + else + { + /* none */ + } +} + +/** +*\*\name TIM_IC2FiltConfig +*\*\fun Config the filter of channel2. +*\*\param TIMx: +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_FiltInitStruct: +*\*\ - refer to the definition of TIM_FiltInitType +*\*\return none +**/ +void TIM_IC2FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct) +{ + uint32_t temp_chxfilt = 0; + + temp_chxfilt &= (uint32_t)(((uint32_t) ~((uint32_t)TIM_C2FILT_THRESH)) & + ((uint32_t) ~((uint32_t)TIM_C2FILT_WSIZE)) & + ((uint32_t) ~((uint32_t)TIM_C2FILT_SFPSC))); + + temp_chxfilt |= (uint32_t)((TIM_FiltInitStruct->ThreshHold << (uint32_t)(0x18)) | + (TIM_FiltInitStruct->WindowSize << (uint32_t)(0x11)) | + (TIM_FiltInitStruct->Prescaler)); + + if ((IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + TIMx->C2FILT = temp_chxfilt; + } + else + { + /* none */ + } +} + +/** +*\*\name TIM_IC3FiltConfig +*\*\fun Config the filter of channel3. +*\*\param TIMx: +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_FiltInitStruct: +*\*\ - refer to the definition of TIM_FiltInitType +*\*\return none +**/ +void TIM_IC3FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct) +{ + uint32_t temp_chxfilt = 0; + + temp_chxfilt &= (uint32_t)(((uint32_t) ~((uint32_t)TIM_C3FILT_THRESH)) & + ((uint32_t) ~((uint32_t)TIM_C3FILT_WSIZE)) & + ((uint32_t) ~((uint32_t)TIM_C3FILT_SFPSC))); + + temp_chxfilt |= (uint32_t)((TIM_FiltInitStruct->ThreshHold << (uint32_t)(0x18)) | + (TIM_FiltInitStruct->WindowSize << (uint32_t)(0x11)) | + (TIM_FiltInitStruct->Prescaler)); + + if ((IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + TIMx->C3FILT = temp_chxfilt; + } + else + { + /* none */ + } +} + +/** +*\*\name TIM_IC4FiltConfig +*\*\fun Config the filter of channel4. +*\*\param TIMx: +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_FiltInitStruct: +*\*\ - refer to the definition of TIM_FiltInitType +*\*\return none +**/ +void TIM_IC4FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct) +{ + uint32_t temp_chxfilt = 0; + + temp_chxfilt &= (uint32_t)(((uint32_t) ~((uint32_t)TIM_C4FILT_THRESH)) & + ((uint32_t) ~((uint32_t)TIM_C4FILT_WSIZE)) & + ((uint32_t) ~((uint32_t)TIM_C4FILT_SFPSC))); + + temp_chxfilt |= (uint32_t)((TIM_FiltInitStruct->ThreshHold << (uint32_t)(0x18)) | + (TIM_FiltInitStruct->WindowSize << (uint32_t)(0x11)) | + (TIM_FiltInitStruct->Prescaler)); + + if ((IS_GTIMA1_7_DEVICE(TIMx)) || (IS_GTIMB1_3_DEVICE(TIMx))) + { + TIMx->C4FILT = temp_chxfilt; + } + else + { + /* none */ + } +} + +/** +*\*\name TIM_IC1FiltEnable +*\*\fun Enable or disable the filter of channel1. +*\*\param TIMx: +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_IC1FiltEnable(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the filter of CH1 */ + TIMx->C1FILT |= (uint32_t)TIM_C1FILT_FILTEN; + } + else + { + /* Disable the filter of CH1 */ + TIMx->C1FILT &= (uint32_t)(~TIM_C1FILT_FILTEN); + } +} + +/** +*\*\name TIM_IC2FiltEnable +*\*\fun Enable or disable the filter of channel2. +*\*\param TIMx: +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_IC2FiltEnable(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the filter of CH2 */ + TIMx->C2FILT |= (uint32_t)TIM_C2FILT_FILTEN; + } + else + { + /* Disable the filter of CH2 */ + TIMx->C2FILT &= (uint32_t)(~TIM_C2FILT_FILTEN); + } +} + +/** +*\*\name TIM_IC3FiltEnable +*\*\fun Enable or disable the filter of channel3. +*\*\param TIMx: +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_IC3FiltEnable(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the filter of CH3 */ + TIMx->C3FILT |= (uint32_t)TIM_C3FILT_FILTEN; + } + else + { + /* Disable the filter of CH3 */ + TIMx->C3FILT &= (uint32_t)(~TIM_C3FILT_FILTEN); + } +} + +/** +*\*\name TIM_IC4FiltEnable +*\*\fun Enable or disable the filter of channel4. +*\*\param TIMx: +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void TIM_IC4FiltEnable(TIM_Module* TIMx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the filter of CH4 */ + TIMx->C4FILT |= (uint32_t)TIM_C4FILT_FILTEN; + } + else + { + /* Disable the filter of CH4 */ + TIMx->C4FILT &= (uint32_t)(~TIM_C4FILT_FILTEN); + } +} + +/** +*\*\name TIM_GetFiltStatus +*\*\fun Checks the specified filter status. +*\*\param TIMx (The input parameters must be the following values): +*\*\ - GTIMA1 +*\*\ - GTIMA2 +*\*\ - GTIMA3 +*\*\ - GTIMA4 +*\*\ - GTIMA5 +*\*\ - GTIMA6 +*\*\ - GTIMA7 +*\*\ - GTIMB1 +*\*\ - GTIMB2 +*\*\ - GTIMB3 +*\*\param TIM_FiltFlag : +*\*\ - TIM_C1FILTO +*\*\ - TIM_C2FILTO +*\*\ - TIM_C3FILTO +*\*\ - TIM_C4FILTO +*\*\return The new state of TIM_FiltFlag (SET or RESET). +**/ +FlagStatus TIM_GetFiltStatus(TIM_Module* TIMx, uint32_t TIM_FiltFlag) +{ + FlagStatus bitstatus; + + if ((TIMx->FILTO & TIM_FiltFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_usart.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_usart.c new file mode 100644 index 0000000000..6091bc0a8e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_usart.c @@ -0,0 +1,1850 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_usart.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "n32h76x_78x_usart.h" +#include "n32h76x_78x_rcc.h" + + +/** +*\*\name USART_DeInit +*\*\fun Deinitializes the USARTx peripheral registers to their default reset values. +*\*\param U(S)ARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\return none +**/ +void USART_DeInit(USART_Module* USARTx) +{ + if (USARTx == USART1) + { + RCC_EnableAPB1PeriphReset3(RCC_APB1_PERIPHRST_USART1); + } + else if (USARTx == USART2) + { + RCC_EnableAPB1PeriphReset3(RCC_APB1_PERIPHRST_USART2); + } + else if (USARTx == USART3) + { + RCC_EnableAPB1PeriphReset3(RCC_APB1_PERIPHRST_USART3); + } + else if (USARTx == USART4) + { + RCC_EnableAPB1PeriphReset3(RCC_APB1_PERIPHRST_USART4); + } + else if (USARTx == USART5) + { + RCC_EnableAPB2PeriphReset3(RCC_APB2_PERIPHRST_USART5); + } + else if (USARTx == USART6) + { + RCC_EnableAPB2PeriphReset3(RCC_APB2_PERIPHRST_USART6); + } + else if (USARTx == USART7) + { + RCC_EnableAPB2PeriphReset3(RCC_APB2_PERIPHRST_USART7); + } + else if (USARTx == USART8) + { + RCC_EnableAPB2PeriphReset3(RCC_APB2_PERIPHRST_USART8); + } + else if (USARTx == UART9) + { + RCC_EnableAPB1PeriphReset3(RCC_APB1_PERIPHRST_UART9); + } + else if (USARTx == UART10) + { + RCC_EnableAPB1PeriphReset3(RCC_APB1_PERIPHRST_UART10); + } + else if (USARTx == UART11) + { + RCC_EnableAPB1PeriphReset3(RCC_APB1_PERIPHRST_UART11); + } + else if (USARTx == UART12) + { + RCC_EnableAPB1PeriphReset3(RCC_APB1_PERIPHRST_UART12); + } + else if (USARTx == UART13) + { + RCC_EnableAPB2PeriphReset3(RCC_APB2_PERIPHRST_UART13); + } + else if (USARTx == UART14) + { + RCC_EnableAPB2PeriphReset3(RCC_APB2_PERIPHRST_UART14); + } + else + { + if (USARTx == UART15) + { + RCC_EnableAPB2PeriphReset3(RCC_APB2_PERIPHRST_UART15); + } + } +} + + +/** +*\*\name USART_Init +*\*\fun Initializes the USARTx peripheral according to USART_InitStruct. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 + +*\*\param USART_InitStruct (The input parameters must be the following values): +*\*\ - buad_rate : +*\*\ - (((buad_rate) > 0) && ((buad_rate) < 0x00E4E1C0)) +*\*\ - WordLength +*\*\ - USART_WL_8B +*\*\ - USART_WL_9B +*\*\ - StopBits +*\*\ - USART_STPB_1 +*\*\ - USART_STPB_0_5 +*\*\ - USART_STPB_2 +*\*\ - USART_STPB_1_5 +*\*\ - Parity +*\*\ - USART_PE_NO +*\*\ - USART_PE_EVEN +*\*\ - USART_PE_ODD +*\*\ - Mode +*\*\ - USART_MODE_RX +*\*\ - USART_MODE_TX +*\*\ - HardwareFlowControl +*\*\ - USART_HFCTRL_NONE +*\*\ - USART_HFCTRL_RTS +*\*\ - USART_HFCTRL_CTS +*\*\ - USART_HFCTRL_RTS_CTS +*\*\ - OverSampling +*\*\ - USART_8OVER +*\*\ - USART_16OVER +*\*\return none +**/ +void USART_Init(USART_Module* USARTx, USART_InitType* USART_InitStruct) +{ + uint32_t tmpregister; + uint32_t apbclock; + uint32_t integerdivider; + uint32_t fractionaldivider; + uint32_t usartxbase; + RCC_ClocksTypeDef RCC_ClocksStatus; + const uint8_t ApbPresTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + + usartxbase = (uint32_t)USARTx; + + /* USART CTRL2 Configuration */ + tmpregister = USARTx->CTRL2; + /* Clear STOP[1:0] bits */ + tmpregister &= CTRL2_STPB_CLR_MASK; + /* Configure the USART Stop Bits */ + /* Set STOP[1:0] bits according to StopBits value */ + tmpregister |= (uint32_t)USART_InitStruct->StopBits; + /* Write to USART CTRL2 */ + USARTx->CTRL2 = (uint32_t)tmpregister; + + + /* USART CTRL1 Configuration */ + tmpregister = USARTx->CTRL1; + /* Clear RXEN, TXEN, PSEL, PCEN, WL and OSPM bits */ + tmpregister &= USART_CTRL1_CLR_MASK; + /* Configure the USART Word Length, Parity, OverSampling and mode */ + /* Set the WL bits according to WordLength value */ + /* Set PSEL and PCEN bits according to Parity value */ + /* Set RXEN and TXEN bits according to Mode value */ + /* Set OSPM bits according to OverSampling value */ + tmpregister |= (uint32_t)USART_InitStruct->WordLength | USART_InitStruct->Parity \ + | USART_InitStruct->OverSampling | USART_InitStruct->Mode; + /* Write to USART CTRL1 */ + USARTx->CTRL1 = (uint32_t)tmpregister; + + /* USART CTRL3 Configuration */ + tmpregister = USARTx->CTRL3; + /* Clear CTSE and RTSE bits */ + tmpregister &= CTRL3_CLR_MASK; + /* Configure the USART HFC */ + /* Set CTSE and RTSE bits according to HardwareFlowControl value */ + tmpregister |= USART_InitStruct->HardwareFlowControl; + /* Write to USART CTRL3 */ + USARTx->CTRL3 = (uint32_t)tmpregister; + + /* USART PBC Configuration */ + /* Configure the USART Baud Rate */ + RCC_GetClocksFreqValue(&RCC_ClocksStatus); + + if ((usartxbase == USART5_BASE) || (usartxbase == USART6_BASE) \ + || (usartxbase == USART7_BASE) || (usartxbase == USART8_BASE) \ + || (usartxbase == UART13_BASE) || (usartxbase == UART14_BASE) \ + || (usartxbase == UART15_BASE)) + { + apbclock = RCC_ClocksStatus.APB2ClkFreq; + } + else if ((usartxbase == USART1_BASE) || (usartxbase == USART2_BASE)) + { + apbclock = RCC_ClocksStatus.AHB1ClkFreq >> (ApbPresTable[(RCC->APB1DIV1 & RCC_APB1DIV1_APB1USARTDIV) >> 28]); + } + else + { + apbclock = RCC_ClocksStatus.APB1ClkFreq; + } + + /* Determine the integer part */ + if((USARTx->CTRL1 & USART_8OVER) == 0) + { + /* Integer part computing in case Oversampling mode is 16 Samples */ + integerdivider = ((25 * (apbclock / 4)) / (USART_InitStruct->BaudRate)); + } + else + { + /* Integer part computing in case Oversampling mode is 8 Samples */ + integerdivider = ((25 * (apbclock / 2)) / (USART_InitStruct->BaudRate)); + } + + tmpregister = (integerdivider / 100) << 4; + + /* Determine the fractional part */ + fractionaldivider = integerdivider - (100 * (tmpregister >> 4)); + + /*Determine whether the fractional part needs to carried*/ + if((USARTx->CTRL1 & USART_8OVER) != 0) + { + /* Oversampling mode is 8 Samples */ + fractionaldivider = ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x0F); + + if(fractionaldivider == 0x08) + { + tmpregister = tmpregister + 0x10; + } + else + { + tmpregister |= fractionaldivider; + } + } + else + { + /* Oversampling mode is 16 Samples */ + tmpregister += ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x1F); + } + + /* Write to USART PBC */ + USARTx->BRCF = (uint32_t)tmpregister; +} + +/** +*\*\name USART_StructInit. +*\*\fun Fills each USART_InitStruct member with its default value. +*\*\param USART_InitStruct (The input parameters must be the following values): +*\*\ - BaudRate +*\*\ - WordLength +*\*\ - StopBits +*\*\ - Parity +*\*\ - Mode +*\*\ - OverSampling +*\*\return none +**/ +void USART_StructInit(USART_InitType* USART_InitStruct) +{ + /* USART_InitStruct members default value */ + USART_InitStruct->BaudRate = 9600; + USART_InitStruct->WordLength = USART_WL_8B; + USART_InitStruct->StopBits = USART_STPB_1; + USART_InitStruct->Parity = USART_PE_NO; + USART_InitStruct->Mode = USART_MODE_RX | USART_MODE_TX; + USART_InitStruct->HardwareFlowControl = USART_HFCTRL_NONE; + USART_InitStruct->OverSampling = USART_16OVER; +} + + +/** +*\*\name USART_ClockInit +*\*\fun Initializes the USARTx peripheral Clock according to the specified parameters in the USART_ClockInitStruct. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\param USART_ClockInitStruct (The input parameters must be the following values): +*\*\ - Clock : +*\*\ - USART_CLK_DISABLE +*\*\ - USART_CLK_ENABLE +*\*\ - USART_Clock_Polarity +*\*\ - USART_CLKPOL_LOW +*\*\ - USART_CLKPOL_HIGH +*\*\ - USART_Clock_Phase +*\*\ - USART_CLKPHA_1EDGE +*\*\ - USART_CLKPHA_2EDGE +*\*\ - USART_Last_Bit +*\*\ - USART_CLKLB_DISABLE +*\*\ - USART_CLKLB_ENABLE +*\*\return none +*\*\note The Smart Card and Synchronous modes are not available for UART5/UART6/UART7/UART8. +**/ +void USART_ClockInit(USART_Module* USARTx, USART_ClockInitType* USART_ClockInitStruct) +{ + uint32_t tmpregister; + + /* USART CTRL2 Configuration */ + tmpregister = USARTx->CTRL2; + /* Clear CLKEN, CPOL, CPHA and LBCLK bits */ + tmpregister &= CTRL2_CLOCK_CLR_MASK; + /* Configure the USART Clock, CPOL, CPHA and LastBit */ + /* Set CLKEN bit according to Clock value */ + /* Set CLKPOL bit according to Polarity value */ + /* Set CLKPHA bit according to Phase value */ + /* Set LBCLK bit according to LastBit value */ + tmpregister |= (uint32_t)USART_ClockInitStruct->Clock | USART_ClockInitStruct->Polarity + | USART_ClockInitStruct->Phase | USART_ClockInitStruct->LastBit; + /* Write to USART CTRL2 */ + USARTx->CTRL2 = (uint32_t)tmpregister; +} + +/** +*\*\name USART_ClockStructInit +*\*\fun Fills each USART_ClockInitStruct member with its default value. +*\*\param USART_ClockInitStruct (The input parameters must be the following values): +*\*\ - Clock +*\*\ - USART_Clock_Polarity +*\*\ - USART_Clock_Phase +*\*\ - USART_Last_Bit +*\*\return none +**/ +void USART_ClockStructInit(USART_ClockInitType* USART_ClockInitStruct) +{ + /* USART_ClockInitStruct members default value */ + USART_ClockInitStruct->Clock = USART_CLK_DISABLE; + USART_ClockInitStruct->Polarity = USART_CLKPOL_LOW; + USART_ClockInitStruct->Phase = USART_CLKPHA_1EDGE; + USART_ClockInitStruct->LastBit = USART_CLKLB_DISABLE; +} + + +/** +*\*\name USART_Enable +*\*\fun Enables or disables the specified USART peripheral. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_Enable(USART_Module* USARTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the selected USART by setting the UE bit in the CTRL1 register */ + USARTx->CTRL1 |= CTRL1_UEN_SET; + } + else + { + /* Disable the selected USART by clearing the UE bit in the CTRL1 register */ + USARTx->CTRL1 &= CTRL1_UEN_RESET; + } +} + + +/** +*\*\name USART_ConfigInt +*\*\fun Enables or disables the specified USART interrupts. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param USART_INT (The input parameters must be the following values): +*\*\ - USART_INT_PEF Parity Error interrupt +*\*\ - USART_INT_TXC Transmission complete interrupt +*\*\ - USART_INT_TXDE Transmit Data Register empty interrupt +*\*\ - USART_INT_RXDNE Receive Data register not empty interrupt +*\*\ - USART_INT_IDLEF Idle line detection interrupt +*\*\ - USART_INT_RTOE Receiver timeout interrupt +*\*\ - USART_INT_LINBD LIN Break detection interrupt +*\*\ - USART_INT_ERRF Error interrupt(Frame error, noise error, overrun error) +*\*\ - USART_INT_CTSF CTS change interrupt +*\*\ - USART_INT_TXFTE TXFIFO threshold interrupt enable +*\*\ - USART_INT_RXFTE RXFIFO threshold interrupt enable +*\*\ - USART_INT_RXFEE RXFIFO empty interrupt enable +*\*\ - USART_INT_TXFEE TXFIFO empty interrupt enable +*\*\ - USART_INT_RXFFE RXFIFO full interrupt enable +*\*\ - USART_INT_TXFFE TXFIFO full interrupt enable +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_ConfigInt(USART_Module* USARTx, uint32_t USART_INT, FunctionalState Cmd) +{ + uint32_t itmask; + uint32_t usartxbase; + + usartxbase = (uint32_t)USARTx; + + /* Get the interrupt position */ + itmask = USART_INT & USART_INT_MASK; + + if((USART_INT & USART_CTRL1_INTMASK) != (uint32_t)0x00) /* The IT is in CTRL1 register */ + { + usartxbase += 0x00; + } + else if((USART_INT & USART_CTRL2_INTMASK) != (uint32_t)0x00) /* The IT is in CTRL2 register */ + { + usartxbase += 0x04; + } + else if((USART_INT & USART_CTRL3_INTMASK) != (uint32_t)0x00) /* The IT is in CTRL3 register */ + { + usartxbase += 0x08; + } + else /* The IT is in FIFO register */ + { + usartxbase += 0x1C; + } + + if (Cmd != DISABLE) + { + *(__IO uint32_t*)usartxbase |= itmask; + } + else + { + *(__IO uint32_t*)usartxbase &= ~itmask; + } +} + + +/** +*\*\name USART_EnableDMA +*\*\fun Enables or disables the USART's DMA interface. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param USART_DMAReq (The input parameters must be the following values): +*\*\ - USART_DMAREQ_TX USART DMA transmit request +*\*\ - USART_DMAREQ_RX USART DMA receive request +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_EnableDMA(USART_Module* USARTx, uint32_t USART_DMAReq, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the DMA transfer for selected requests by setting the DMAT and/or + DADDR bits in the USART CTRL3 register */ + USARTx->CTRL3 |= USART_DMAReq; + } + else + { + /* Disable the DMA transfer for selected requests by clearing the DMAT and/or + DADDR bits in the USART CTRL3 register */ + USARTx->CTRL3 &= (uint32_t)~USART_DMAReq; + } +} + +/** +*\*\name USART_SetAddr +*\*\fun Sets the address of the USART node. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param USART_Addr (The input parameters must be the following values): +*\*\ - (((USART_Addr)>=0x00)&&((USART_Addr)<0x10)) +*\*\return none +**/ +void USART_SetAddr(USART_Module* USARTx, uint8_t USART_Addr) +{ + /* Clear the USART address */ + USARTx->CTRL2 &= CTRL2_ADDR_MASK; + /* Set the USART address node */ + USARTx->CTRL2 |= USART_Addr; +} + + +/** +*\*\name USART_ConfigWakeUpMode +*\*\fun Selects the USART WakeUp method. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param USART_WakeUpMode (The input parameters must be the following values): +*\*\ - USART_WUM_IDLELINE WakeUp by an idle line detection +*\*\ - USART_WUM_ADDRMASK WakeUp by an address mark +*\*\return none +**/ +void USART_ConfigWakeUpMode(USART_Module* USARTx, uint32_t USART_WakeUpMode) +{ + USARTx->CTRL1 &= CTRL1_WUM_MASK; + USARTx->CTRL1 |= USART_WakeUpMode; +} + + +/** +*\*\name USART_EnableRcvWakeUp +*\*\fun Determines if the USART is in mute mode or not. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_EnableRcvWakeUp(USART_Module* USARTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the USART mute mode by setting the RWU bit in the CTRL1 register */ + USARTx->CTRL1 |= CTRL1_RCVWU_SET; + } + else + { + /* Disable the USART mute mode by clearing the RWU bit in the CTRL1 register */ + USARTx->CTRL1 &= CTRL1_RCVWU_RESET; + } +} + + +/** +*\*\name USART_ConfigLINBreakDetectLength +*\*\fun Sets the USART LIN Break detection length. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param USART_LINBreakDetectLength (The input parameters must be the following values): +*\*\ - USART_LINBDL_10B 10-bit break detection +*\*\ - USART_LINBDL_11B 11-bit break detection +*\*\return none +**/ +void USART_ConfigLINBreakDetectLength(USART_Module* USARTx, uint32_t USART_LINBreakDetectLength) +{ + USARTx->CTRL2 &= CTRL2_LINBDL_MASK; + USARTx->CTRL2 |= USART_LINBreakDetectLength; +} + + +/** +*\*\name USART_EnableLIN +*\*\fun Enables or disables the USART's LIN mode. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_EnableLIN(USART_Module* USARTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the LIN mode by setting the LINEN bit in the CTRL2 register */ + USARTx->CTRL2 |= CTRL2_LINMEN_SET; + } + else + { + /* Disable the LIN mode by clearing the LINEN bit in the CTRL2 register */ + USARTx->CTRL2 &= CTRL2_LINMEN_RESET; + } +} + +/** +*\*\name USART_SendData +*\*\fun Transmits single data through the USARTx peripheral. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Data : +*\*\ - the data to transmit +*\*\return none +**/ +void USART_SendData(USART_Module* USARTx, uint32_t Data) +{ + /* Transmit Data */ + USARTx->DAT = (Data & (uint32_t)0x01FF); +} + +/** +*\*\name USART_ReceiveData +*\*\fun Returns the most recent received data by the USARTx peripheral. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\return none +**/ +uint32_t USART_ReceiveData(USART_Module* USARTx) +{ + /* Receive Data */ + return (uint32_t)(USARTx->DAT & (uint32_t)0x01FF); +} + +/** +*\*\name USART_SendBreak +*\*\fun Transmits break characters. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\return none +**/ +void USART_SendBreak(USART_Module* USARTx) +{ + /* Send break characters */ + USARTx->CTRL1 |= CTRL1_SDBRK_SET; +} + + +/** +*\*\name USART_SetGuardTime +*\*\fun Sets the specifies USART guard time. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\param USART_GuardTime: +*\*\ - specifies the guard time +*\*\return none +**/ +void USART_SetGuardTime(USART_Module* USARTx, uint8_t USART_GuardTime) +{ + /* Clear the USART Guard time */ + USARTx->GTP &= GTP_LSB_MASK; + /* Set the USART guard time */ + USARTx->GTP |= (uint32_t)((uint32_t)USART_GuardTime << 0x08); +} + +/** +*\*\name USART_SetPrescaler +*\*\fun Sets the system clock prescaler. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param USART_Prescaler: +*\*\ - specifies the prescaler clock +*\*\return none +**/ +void USART_SetPrescaler(USART_Module* USARTx, uint8_t USART_Prescaler) +{ + /* Clear the USART prescaler */ + USARTx->GTP &= GTP_MSB_MASK; + /* Set the USART prescaler */ + USARTx->GTP |= USART_Prescaler; +} + +/** +*\*\name USART_EnableSmartCard +*\*\fun Enables or disables the USART's Smart Card mode. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_EnableSmartCard(USART_Module* USARTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the SC mode by setting the SCEN bit in the CTRL3 register */ + USARTx->CTRL3 |= CTRL3_SCMEN_SET; + } + else + { + /* Disable the SC mode by clearing the SCEN bit in the CTRL3 register */ + USARTx->CTRL3 &= CTRL3_SCMEN_RESET; + } +} + +/** +*\*\name USART_SetSmartCardNACK +*\*\fun Enables or disables NACK transmission. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_SetSmartCardNACK(USART_Module* USARTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the NACK transmission by setting the NACK bit in the CTRL3 register */ + USARTx->CTRL3 |= CTRL3_SCNACK_SET; + } + else + { + /* Disable the NACK transmission by clearing the NACK bit in the CTRL3 register */ + USARTx->CTRL3 &= CTRL3_SCNACK_RESET; + } +} + + +/** +*\*\name USART_EnableHalfDuplex +*\*\fun Enables or disables the USART's Half Duplex communication. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_EnableHalfDuplex(USART_Module* USARTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the Half-Duplex mode by setting the HDSEL bit in the CTRL3 register */ + USARTx->CTRL3 |= CTRL3_HDMEN_SET; + } + else + { + /* Disable the Half-Duplex mode by clearing the HDSEL bit in the CTRL3 register */ + USARTx->CTRL3 &= CTRL3_HDMEN_RESET; + } +} + + +/** +*\*\name USART_ConfigIrDAMode +*\*\fun Configures the USART's IrDA interface. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param USART_IrDAMode (The input parameters must be the following values): +*\*\ - USART_IRDAMODE_LOWPPWER +*\*\ - USART_IRDAMODE_NORMAL +*\*\return none +**/ +void USART_ConfigIrDAMode(USART_Module* USARTx, uint32_t USART_IrDAMode) +{ + USARTx->CTRL3 &= CTRL3_IRDALP_MASK; + USARTx->CTRL3 |= USART_IrDAMode; +} + + +/** +*\*\name USART_EnableIrDA +*\*\fun Enables or disables the USART's IrDA interface. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_EnableIrDA(USART_Module* USARTx, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the IrDA mode by setting the IREN bit in the CTRL3 register */ + USARTx->CTRL3 |= CTRL3_IRDAMEN_SET; + } + else + { + /* Disable the IrDA mode by clearing the IREN bit in the CTRL3 register */ + USARTx->CTRL3 &= CTRL3_IRDAMEN_RESET; + } +} + + +/** +*\*\name USART_GetFlagStatus +*\*\fun Checks whether the specified USART flag is set or not. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param USART_FLAG (The input parameters must be the following values): +*\*\ - USART_FLAG_FELOSE Received Data FE Error Discard Flag +*\*\ - USART_FLAG_NELOSE Received Data NE Error Discard Flag +*\*\ - USART_FLAG_PELOSE Received Data PE Error Discard Flag +*\*\ - USART_FLAG_RTO recevier timeout Flag +*\*\ - USART_FLAG_FEF Framing error Flag +*\*\ - USART_FLAG_NEF Noise error flag Flag +*\*\ - USART_FLAG_OREF Overrun error +*\*\ - USART_FLAG_PEF Parity error +*\*\ - USART_FLAG_LINBD LIN break detection flag +*\*\ - USART_FLAG_CTSF CTS Change flag +*\*\ - USART_FLAG_RXDNE Receive data register not empty flag +*\*\ - USART_FLAG_TXC Transmission Complete flag +*\*\ - USART_FLAG_TXDE Transmit data register empty flag +*\*\ - USART_FLAG_IDLEF Idle Line detection flag +*\*\ - USART_FLAG_TXFT TX FIFO threshold flag +*\*\ - USART_FLAG_RXFT RX FIFO threshold flag +*\*\ - USART_FLAG_RXFE RX FIFO empty flag +*\*\ - USART_FLAG_TXFE TX FIFO empty flag +*\*\ - USART_FLAG_RXFF RX FIFO full flag +*\*\ - USART_FLAG_TXFF TX FIFO full flag +*\*\return USART_FLAG +*\*\ - SET +*\*\ - RESET +**/ +FlagStatus USART_GetFlagStatus(USART_Module* USARTx, uint32_t USART_FLAG) +{ + FlagStatus bitstatus; + + if ((USARTx->STS & USART_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name USART_ClrFlag +*\*\fun Clears the USARTx's pending flags. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param USART_FLAG (The input parameters must be the following values): +*\*\ - USART_FLAG_FELOSE Received Data FE Error Discard Flag +*\*\ - USART_FLAG_NELOSE Received Data NE Error Discard Flag +*\*\ - USART_FLAG_PELOSE Received Data PE Error Discard Flag +*\*\ - USART_FLAG_LINBD LIN break detection flag +*\*\ - USART_FLAG_CTSF CTS Change flag +*\*\ - USART_FLAG_RXDNE Receive data register not empty flag +*\*\ - USART_FLAG_TXC Transmission Complete flag +*\*\return none +*\*\note +*\*\ - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun +*\*\ error) and IDLE (Idle line detected) flags are cleared by software +*\*\ sequence: a read operation to USART_STS register (USART_GetFlagStatus()) +*\*\ followed by a read operation to USART_DAT register (USART_ReceiveData()). +*\*\ - RXNE flag can be also cleared by a read to the USART_DAT register +*\*\ (USART_ReceiveData()). +*\*\ - TC flag can be also cleared by software sequence: a read operation to +*\*\ USART_SR register (USART_GetFlagStatus()) followed by a write operation +*\*\ to USART_DAT register (USART_SendData()). +*\*\ - TXE flag is cleared only by a write to the USART_DAT register +*\*\ (USART_SendData()). +*\*\ - RTO flag is cleared only by a write 1 to the USART_CTRL2.RTOCF bit. +*\*\ (USART_ClrRTOFlag()). +**/ +void USART_ClrFlag(USART_Module* USARTx, uint32_t USART_FLAG) +{ + if((USART_FLAG & USART_FLAG_LOSEMASK) != (uint32_t)RESET) + { + USARTx->STS = USART_FLAG; + } + else + { + USARTx->STS = (~(USART_FLAG | USART_FLAG_LOSEMASK)); + } +} + + +/** +*\*\name USART_ClrRTOFlag +*\*\fun Clears the USARTx's RTO pending flag. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\return none +**/ +void USART_ClrRTOFlag(USART_Module* USARTx) +{ + uint32_t time_out; + USARTx->CTRL2 |= USART_FLAG_RTO; + time_out = 0xFFFF; + + while((USART_GetFlagStatus(USARTx, USART_FLAG_RTO) == SET) && (time_out--)); + + USARTx->CTRL2 &= (~USART_FLAG_RTO); +} + +/** +*\*\name USART_GetIntStatus +*\*\fun Checks whether the specified USART interrupt has set or not. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param USART_INT (The input parameters must be the following values): +*\*\ - USART_INT_PEF Parity Error interrupt +*\*\ - USART_INT_TXC Transmission complete interrupt +*\*\ - USART_INT_TXDE Transmit Data Register empty interrupt +*\*\ - USART_INT_RXDNE Receive Data register not empty interrupt +*\*\ - USART_INT_IDLEF Idle line detection interrupt +*\*\ - USART_INT_RTOE Receiver timeout interrupt +*\*\ - USART_INT_LINBD LIN Break detection interrupt +*\*\ - USART_INT_ERRF Error interrupt(Frame error, noise error, overrun error) +*\*\ - USART_INT_CTSF CTS change interrupt +*\*\ - USART_INT_TXFTE TXFIFO threshold interrupt enable +*\*\ - USART_INT_RXFTE RXFIFO threshold interrupt enable +*\*\ - USART_INT_RXFEE RXFIFO empty interrupt enable +*\*\ - USART_INT_TXFEE TXFIFO empty interrupt enable +*\*\ - USART_INT_RXFFE RXFIFO full interrupt enable +*\*\ - USART_INT_TXFFE TXFIFO full interrupt enable +*\*\return bitstatus +*\*\ - SET +*\*\ - RESET +**/ +INTStatus USART_GetIntStatus(USART_Module* USARTx, uint32_t USART_INT) +{ + uint32_t itmask; + INTStatus bitstatus; + + /* Get the interrupt position */ + itmask = USART_INT & USART_INT_MASK; + + if ((USART_INT & USART_CTRL1_INTMASK) != 0x00) /* The IT is in CTRL1 register */ + { + itmask &= USARTx->CTRL1; + } + else if ((USART_INT & USART_CTRL2_INTMASK) != 0x00) /* The IT is in CTRL2 register */ + { + itmask &= USARTx->CTRL2; + } + else if ((USART_INT & USART_CTRL3_INTMASK) != 0x00) /* The IT is in CTRL3 register */ + { + itmask &= USARTx->CTRL3; + } + else + { + itmask &= USARTx->FIFO; + } + + if (itmask != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** +*\*\name USART_IdleFrameSet +*\*\fun Idle frame controllable enable or disable. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_IdleFrameSet(USART_Module* USARTx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + USARTx->CTRL1 |= CTRL1_IFCEN_ENABLE; + } + else + { + USARTx->CTRL1 &= CTRL1_IFCEN_DISABLE; + } +} + + +/** +*\*\name USART_PinSwapSet +*\*\fun Swap TX/RX pins enable or disable. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_PinSwapSet(USART_Module* USARTx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + USARTx->CTRL1 |= CTRL1_SWAP_ENABLE; + } + else + { + USARTx->CTRL1 &= CTRL1_SWAP_DISABLE; + } +} + + +/** +*\*\name USART_CfgDriverAssertTime +*\*\fun Set Driver Enable assertion time. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Time:(The input parameters must be the following values) +*\*\ - 0x01 ~ 0x1F +*\*\return none +**/ +void USART_CfgDriverAssertTime(USART_Module* USARTx, uint32_t Time) +{ + USARTx->CTRL1 &= (~USART_CTRL1_DEAT_MASK); + USARTx->CTRL1 |= (Time << 21); +} + + + + +/** +*\*\name USART_CfgDriverdeassertTime +*\*\fun Set Driver Enable deassertion time. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Time:(The input parameters must be the following values) +*\*\ - 0x01 ~ 0x1F +*\*\return none +**/ +void USART_CfgDriverdeassertTime(USART_Module* USARTx, uint32_t Time) +{ + USARTx->CTRL1 &= (~USART_CTRL1_DEDT_MASK); + USARTx->CTRL1 |= (Time << 16); +} + + +/** +*\*\name USART_DriverPolaritySet +*\*\fun Driver enable polarity selection. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_DriverPolaritySet(USART_Module* USARTx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + USARTx->CTRL1 |= CTRL1_DEP_ENABLE; + } + else + { + USARTx->CTRL1 &= CTRL1_DEP_DISABLE; + } +} + + +/** +*\*\name USART_DriverModeSet +*\*\fun Driver enable mode selection. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_DriverModeSet(USART_Module* USARTx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + USARTx->CTRL1 |= CTRL1_DEM_ENABLE; + } + else + { + USARTx->CTRL1 &= CTRL1_DEM_DISABLE; + } +} + + +/** +*\*\name USART_FEFDiscardSet +*\*\fun FEF Data Discard enable or disable. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_FEFDiscardSet(USART_Module* USARTx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + USARTx->CTRL2 |= CTRL2_FEFLOSE_ENABLE; + } + else + { + USARTx->CTRL2 &= CTRL2_FEFLOSE_DISABLE; + } +} + + +/** +*\*\name USART_NEFDiscardSet +*\*\fun NEF Data Discard enable or disable. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_NEFDiscardSet(USART_Module* USARTx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + USARTx->CTRL2 |= CTRL2_NEFLOSE_ENABLE; + } + else + { + USARTx->CTRL2 &= CTRL2_NEFLOSE_DISABLE; + } +} + + +/** +*\*\name USART_PEFDiscardSet +*\*\fun PEF Data Discard enable or disable. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_PEFDiscardSet(USART_Module* USARTx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + USARTx->CTRL2 |= CTRL2_PEFLOSE_ENABLE; + } + else + { + USARTx->CTRL2 &= CTRL2_PEFLOSE_DISABLE; + } +} + + +/** +*\*\name USART_RTOSet +*\*\fun Receiver timeout enable or disable. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_RTOSet(USART_Module* USARTx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + USARTx->CTRL2 |= CTRL2_RTO_ENABLE; + } + else + { + USARTx->CTRL2 &= CTRL2_RTO_DISABLE; + } +} + + +/** +*\*\name USART_GetTxFIFO_Num +*\*\fun number of TXFIFO valid data. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\return 0x00~0x08 +**/ +uint32_t USART_GetTxFIFO_Num(USART_Module* USARTx) +{ + return ((USARTx->FIFO & USART_FIFO_TXCNT_MASK) >> 18); +} + + +/** +*\*\name USART_GetRxFIFO_Num +*\*\fun number of RXFIFO valid data. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\return 0x00~0x08 +**/ +uint32_t USART_GetRxFIFO_Num(USART_Module* USARTx) +{ + return ((USARTx->FIFO & USART_FIFO_RXCNT_MASK) >> 14); +} + + +/** +*\*\name USART_CfgRxFIFOThreshold +*\*\fun RXFIFO threshold configuration. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param threshold (The input parameters must be the following values): +*\*\ - USART_FIFO_DEEP1 +*\*\ - USART_FIFO_DEEP2 +*\*\ - USART_FIFO_DEEP4 +*\*\ - USART_FIFO_DEEP6 +*\*\ - USART_FIFO_DEEP7 +*\*\ - USART_FIFO_DEEP8 +*\*\return none +**/ +void USART_CfgRxFIFOThreshold(USART_Module* USARTx, uint32_t threshold) +{ + USARTx->FIFO &= (~USART_FIFO_RXFTCFG_MASK); + USARTx->FIFO |= (threshold << 5); +} + + +/** +*\*\name USART_CfgTxFIFOThreshold +*\*\fun TXFIFO threshold configuration. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param threshold (The input parameters must be the following values): +*\*\ - USART_FIFO_DEEP1 +*\*\ - USART_FIFO_DEEP2 +*\*\ - USART_FIFO_DEEP4 +*\*\ - USART_FIFO_DEEP6 +*\*\ - USART_FIFO_DEEP7 +*\*\ - USART_FIFO_DEEP8 +*\*\return none +**/ +void USART_CfgTxFIFOThreshold(USART_Module* USARTx, uint32_t threshold) +{ + USARTx->FIFO &= (~USART_FIFO_TXFTCFG_MASK); + USARTx->FIFO |= (threshold << 2); +} + + +/** +*\*\name USART_ClrFIFO +*\*\fun FIFO clear. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\return none +**/ +void USART_ClrFIFO(USART_Module* USARTx) +{ + USARTx->FIFO |= USART_CLEAR_FIFO; +} + + +/** +*\*\name USART_FIFOModeSet +*\*\fun FIFO mode enable or disable. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Cmd:(The input parameters must be the following values) +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void USART_FIFOModeSet(USART_Module* USARTx, FunctionalState Cmd) +{ + if(Cmd == ENABLE) + { + USARTx->FIFO |= USART_FIFO_ENABLE; + } + else + { + USARTx->FIFO &= USART_FIFO_DISABLE; + } +} + + +/** +*\*\name USART_CfgIdleFrameWidth +*\*\fun configure Idle frame width. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Width:(The input parameters must be the following values) +*\*\ - 0x0000 ~ 0xFFFF +*\*\return none +**/ +void USART_IdleFrameWidthSet(USART_Module* USARTx, uint32_t Width) +{ + USARTx->IFW = Width; +} + + +/** +*\*\name USART_CfgRTOWidth +*\*\fun configure receive timeout width. +*\*\param USARTx (The input parameters must be the following values): +*\*\ - USART1 +*\*\ - USART2 +*\*\ - USART3 +*\*\ - USART4 +*\*\ - USART5 +*\*\ - USART6 +*\*\ - USART7 +*\*\ - USART8 +*\*\ - UART9 +*\*\ - UART10 +*\*\ - UART11 +*\*\ - UART12 +*\*\ - UART13 +*\*\ - UART14 +*\*\ - UART15 +*\*\param Width:(The input parameters must be the following values) +*\*\ - 0x00000000 ~ 0x0FFFFFFF +*\*\return none +**/ +void USART_CfgRTOWidth(USART_Module* USARTx, uint32_t Width) +{ + USARTx->RTO = Width; +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_vrefbuf.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_vrefbuf.c new file mode 100644 index 0000000000..4be47b5d73 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_vrefbuf.c @@ -0,0 +1,191 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_vrefbuf.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_vrefbuf.h" + +/** VREFBUF Driving Functions Declaration **/ + +/** +*\*\name VREFBUF_SetVoltageScale. +*\*\fun Set the Voltage reference scale. +*\*\param Scale +*\*\ - VREFBUF_VOLTAGE_SCALE_2_5V +*\*\ - VREFBUF_VOLTAGE_SCALE_2_0V +*\*\ - VREFBUF_VOLTAGE_SCALE_1_8V +*\*\ - VREFBUF_VOLTAGE_SCALE_1_5V +*\*\return none +**/ +void VREFBUF_SetVoltageScale(uint32_t Scale) +{ + uint32_t tempreg; + /* Get the old register value */ + tempreg = *(uint32_t * )VREFBUF_CTRL2_REG_ADDR; + /* Clear vrefbuf voltage scale select bits */ + tempreg &= (~VREFBUF_VOLTAGE_SCALE_MASK); + /* Set vrefbuf voltage scale select bits */ + tempreg |= Scale; + /* Store the new register value */ + *(uint32_t * )VREFBUF_CTRL2_REG_ADDR = tempreg; +} + +/** +*\*\name VREFBUF_GetVoltageScale. +*\*\fun Get the Voltage reference scale. +*\*\param none +*\*\return the Voltage reference scale; +*\*\ - VREFBUF_VOLTAGE_SCALE_2_5V +*\*\ - VREFBUF_VOLTAGE_SCALE_2_0V +*\*\ - VREFBUF_VOLTAGE_SCALE_1_8V +*\*\ - VREFBUF_VOLTAGE_SCALE_1_5V +**/ +uint32_t VREFBUF_GetVoltageScale(void) +{ + /* Clear vrefbuf voltage scale select bits */ + return ( (*(uint32_t * )VREFBUF_CTRL2_REG_ADDR) &VREFBUF_VOLTAGE_SCALE_MASK); +} +/** +*\*\name VREFBUF_Enable. +*\*\fun Enable or disable internal voltage reference. +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void VREFBUF_Enable(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + *(uint32_t * )VREFBUF_CTRL1_REG_ADDR |= VREFBUF_EN_MASK; + } + else + { + *(uint32_t * )VREFBUF_CTRL1_REG_ADDR &= (~VREFBUF_EN_MASK); + } +} + +/** +*\*\name VREFBUF_EnableHIM. +*\*\fun Enable or disable high impedance (VREF+ pin is high impedance). +*\*\param Cmd : +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void VREFBUF_EnableHIM(FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + *(uint32_t * )VREFBUF_CTRL1_REG_ADDR |= VREFBUF_HIM_EN_MASK; + } + else + { + *(uint32_t * )VREFBUF_CTRL1_REG_ADDR &= (~VREFBUF_HIM_EN_MASK); + } +} + +/** +*\*\name VREFBUF_SetTrimming. +*\*\fun Set the trimming code for VREFBUF calibration. +*\*\param Value :Value Between 0 and 0x3F +*\*\return none +**/ +void VREFBUF_SetTrimming(uint32_t Value) +{ + uint32_t tempreg, tempreg1; + tempreg = ((*(uint32_t * )VREFBUF_CTRL2_REG_ADDR)&VREFBUF_VOLTAGE_SCALE_MASK); + + if(tempreg == VREFBUF_VOLTAGE_SCALE_2_5V) + { + tempreg1 = *(uint32_t * )VREFBUF_TRIM1_REG_ADDR; + tempreg1 &= (~VREFBUF_TRIMING_2_5V_MASK); + tempreg1 |= (Value << VREFBUF_TRIMING_2_5V_POS); + /* Store the new register value */ + *(uint32_t * )VREFBUF_TRIM1_REG_ADDR = tempreg1; + } + else if(tempreg == VREFBUF_VOLTAGE_SCALE_2_048V) + { + tempreg1 = *(uint32_t * )VREFBUF_TRIM1_REG_ADDR; + tempreg1 &= (~VREFBUF_TRIMING_2_0V_MASK); + tempreg1 |= (Value << VREFBUF_TRIMING_2_0V_POS); + /* Store the new register value */ + *(uint32_t * )VREFBUF_TRIM1_REG_ADDR = tempreg1; + } + else if(tempreg == VREFBUF_VOLTAGE_SCALE_1_8V) + { + tempreg1 = *(uint32_t * )VREFBUF_TRIM2_REG_ADDR; + tempreg1 &= (~VREFBUF_TRIMING_1_8V_MASK); + tempreg1 |= (Value << VREFBUF_TRIMING_1_8V_POS); + /* Store the new register value */ + *(uint32_t * )VREFBUF_TRIM2_REG_ADDR = tempreg1; + } + else + { + tempreg1 = *(uint32_t * )VREFBUF_TRIM2_REG_ADDR; + tempreg1 &= (~VREFBUF_TRIMING_1_5V_MASK); + tempreg1 |= (Value << VREFBUF_TRIMING_1_5V_POS); + /* Store the new register value */ + *(uint32_t * )VREFBUF_TRIM2_REG_ADDR = tempreg1; + } +} + +/** +*\*\name VREFBUF_IsVREFReady. +*\*\fun Checks whether VREFBUF ready flag is set or not. +*\*\param none +*\*\return The new state of VREFBUF_READY (SET or RESET). +**/ +FlagStatus VREFBUF_IsVREFReady(void) +{ + return (((*(uint32_t * )VREFBUF_STS_REG_ADDR) & VREFBUF_READY_MASK) != 0U) ? SET : RESET; +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_wwdg.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_wwdg.c new file mode 100644 index 0000000000..a85d008032 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_wwdg.c @@ -0,0 +1,216 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_wwdg.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_wwdg.h" +#include "n32h76x_78x_rcc.h" + +/** +*\*\name WWDG_DeInit. +*\*\fun Resets the WWDG peripheral registers to their default reset values. +*\*\param WWDGx (The input parameters must be the following values): +*\*\ - WWDG1 +*\*\ - WWDG2 +*\*\return none +**/ +void WWDG_DeInit(WWDG_Module* WWDGx) +{ + if (WWDGx == WWDG1) + { + RCC_EnableAXIPeriphReset2(RCC_AXI_PERIPHRST_WWDG1); + } + else + { + if (WWDGx == WWDG2) + { + RCC_EnableAPB1PeriphReset2(RCC_APB1_PERIPHRST_WWDG2); + } + } +} + +/** +*\*\name WWDG_SetPrescalerDiv. +*\*\fun Set the WWDOG Prescaler Division Value. +*\*\param WWDGx (The input parameters must be the following values): +*\*\ - WWDG1 +*\*\ - WWDG2 +*\*\param WWDG_Prescaler : +*\*\ - WWDG_PRESCALER_DIV1 WWDG Counter Clock (PCLK1 / 4096) / 1 +*\*\ - WWDG_PRESCALER_DIV2 WWDG Counter Clock (PCLK1 / 4096) / 2 +*\*\ - WWDG_PRESCALER_DIV4 WWDG Counter Clock (PCLK1 / 4096) / 4 +*\*\ - WWDG_PRESCALER_DIV8 WWDG Counter Clock (PCLK1 / 4096) / 8 +*\*\return none +**/ +void WWDG_SetPrescalerDiv(WWDG_Module* WWDGx, uint32_t WWDG_Prescaler) +{ + uint32_t tmpregister; + + /* Clear TIMERB[1:0] bits */ + tmpregister = WWDGx->CFG & CFG_TIMERB_MASK; + /* Set TIMERB[1:0] bits according to WWDG_Prescaler value */ + tmpregister |= WWDG_Prescaler; + /* Store the new value */ + WWDGx->CFG = tmpregister; +} + +/** +*\*\name WWDG_SetWValue. +*\*\fun Set the WWDOG Window Value. +*\*\param WWDGx (The input parameters must be the following values): +*\*\ - WWDG1 +*\*\ - WWDG2 +*\*\param WindowValue : WWDOG Window Value +*\*\ The value range of this parameter : +*\*\ - 0x0040 ~ 0x3FFF +*\*\return none +**/ +void WWDG_SetWValue(WWDG_Module* WWDGx, uint16_t WindowValue) +{ + __IO uint32_t tmpregister = 0; + + /* Clear W[13:0] bits */ + tmpregister = WWDGx->CFG & CFG_W_MASK; + + /* Set W[13:0] bits according to WindowValue value */ + tmpregister |= WindowValue & (uint32_t)BIT_MASK; + + /* Store the new value */ + WWDGx->CFG = tmpregister; +} + +/** +*\*\name WWDG_EnableInt. +*\*\fun Enable WWDG Early Wakeup interrupt(EWINT). +*\*\param WWDGx (The input parameters must be the following values): +*\*\ - WWDG1 +*\*\ - WWDG2 +*\*\return none +**/ +void WWDG_EnableInt(WWDG_Module* WWDGx) +{ + WWDGx->CFG |= EARLY_WAKEUP_INT; +} + +/** +*\*\name WWDG_SetCnt. +*\*\fun Set the WWDOG Counter Value. +*\*\param WWDGx (The input parameters must be the following values): +*\*\ - WWDG1 +*\*\ - WWDG2 +*\*\param Counter : WWDOG Counter value +*\*\ The value range of this parameter : +*\*\ - 0x40 ~ 0x3FFF +*\*\return none +**/ +void WWDG_SetCnt(WWDG_Module* WWDGx, uint16_t Counter) +{ + /* Write to T[6:0] bits to configure the counter value, no need to do + a read-modify-write; writing a 0 to WDGA bit does nothing */ + WWDGx->CTRL = (uint32_t)Counter & (uint32_t)BIT_MASK; +} + +/** +*\*\name WWDG_Enable. +*\*\fun Set the WWDOG Counter Value and Enable WWDOG . +*\*\param WWDGx (The input parameters must be the following values): +*\*\ - WWDG1 +*\*\ - WWDG2 +*\*\param Counter : WWDOG Counter value +*\*\ The value range of this parameter : +*\*\ - 0x40 ~ 0x3FFF +*\*\return none +**/ +//uint32_t data; +void WWDG_Enable(WWDG_Module* WWDGx, uint16_t Counter) +{ + //data=CTRL_ACTB_SET | Counter; + WWDGx->CTRL = CTRL_ACTB_SET | Counter; +} + +/** +*\*\name WWDG_GetEWINTF. +*\*\fun Get WWDOG Early Wake-up Interrupt Flag. +*\*\param WWDGx (The input parameters must be the following values): +*\*\ - WWDG1 +*\*\ - WWDG2 +*\*\param none +*\*\return SET or RESET +**/ +FlagStatus WWDG_GetEWINTF(WWDG_Module* WWDGx) +{ + FlagStatus bitstatus; + + /* Return the status of the flag */ + if ((WWDGx->STS & EARLY_WAKEUP_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name WWDG_ClrEWINTF. +*\*\fun Clear WWDOG Early Wake-up Interrupt Flag. +*\*\param WWDGx (The input parameters must be the following values): +*\*\ - WWDG1 +*\*\ - WWDG2 +*\*\return none +**/ +void WWDG_ClrEWINTF(WWDG_Module* WWDGx) +{ + WWDGx->STS = (uint32_t)RESET; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_xspi.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_xspi.c new file mode 100644 index 0000000000..a813172dbc --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_std_periph_driver/src/n32h76x_78x_xspi.c @@ -0,0 +1,1272 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file n32h76x_78x_xspi.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "n32h76x_78x_xspi.h" +#include "n32h76x_78x_rcc.h" + +/** N32H76X_78X_StdPeriph_Driver **/ + +/** +*\*\name XSPI_DeInit. +*\*\fun Deinitializes the XSPI peripheral registers to its default reset values. +*\*\return none +**/ +void XSPI_DeInit(XSPI_Module* xSPIx) +{ + if(xSPIx == xSPI1) + { + RCC_EnableAXIPeriphReset4(RCC_AXI_PERIPHRST_XSPI1); + } + else if(xSPIx == xSPI2) + { + RCC_EnableAXIPeriphReset4(RCC_AXI_PERIPHRST_XSPI2); + } +} + +/** +*\*\name XSPIInitConfig. +*\*\fun Merge configuration from the buffer of XSPI para struct, then write it into related registers. +*\*\param XSPI_InitStruct : +*\*\ - FRF +*\*\ - SPIFRF +*\*\ - TMOD +*\*\ - SCPOL +*\*\ - SCPH +*\*\ - DFS +*\*\ - SSTE +*\*\ - SEN +*\*\ - CLKDIV +*\*\ - WAITCYCLES +*\*\ - INST_L +*\*\ - ADDRL +*\*\ - NDF +*\*\ - TXFT +*\*\ - RXFT +*\*\ - ENHANCED_WAITCYCLES +*\*\ - ENHANCED_CLKSTREN +*\*\ - ENHANCED_ADDR_L +*\*\ - ENHANCED_INST_L +*\*\ - ENHANCED_TRANSTYPE +*\*\ - ENHANCED_WRSPIDDREN; +*\*\ - ENHANCED_WRINDDREN; +*\*\ - XIP_FRF +*\*\ - XIP_TRANSTYPE +*\*\ - XIP_ADDRL +*\*\ - XIP_INST_L +*\*\ - XIP_WAITCYCLES +*\*\ - XIPDFSHC +*\*\ - XIPINSTEN +*\*\ - XIPCTEN +*\*\ - XIPINSTEN +*\*\ - XIPMBL +*\*\ - XIP_WRINDDREN +*\*\ - XIP_DDREN +*\*\ - XIPDFSHC +*\*\ - XIPMDBITS +*\*\ - ITOC +*\*\ - WTOC +*\*\ - XTOUT +*\*\ - CFS +*\*\ - MWMOD +*\*\ - MCDIR +*\*\ - MHSEN +*\*\ - TXFN +*\*\ - RXFN +*\*\ - SDCN +*\*\ - SES +*\*\ - TXDE +*\*\return none +**/ +void XSPI_Init(XSPI_Module* xSPIx, XSPI_InitType* XSPI_InitStruct) +{ + uint32_t tmpregister = 0; + + if((XSPI_InitStruct->SPIFRF) == XSPI_CTRL0_SPIFRF_STANDARD_FORMAT) + { + tmpregister |= (uint32_t)(XSPI_InitStruct->MST | XSPI_InitStruct->FRF | XSPI_InitStruct->SPIFRF | XSPI_InitStruct->SSTE + | XSPI_InitStruct->TMOD | XSPI_InitStruct->SCPOL | XSPI_InitStruct->SCPH | XSPI_InitStruct->DFS | XSPI_InitStruct->CFS); + + xSPIx->CTRL0 = tmpregister; + + tmpregister = xSPIx->CTRL1; + tmpregister &= XSPI_NDF_MASK; + tmpregister |= XSPI_InitStruct->NDF; + xSPIx->CTRL1 = tmpregister; + + tmpregister = 0; + tmpregister = (uint32_t)(XSPI_InitStruct->MWMOD | XSPI_InitStruct->MCDIR | XSPI_InitStruct->MHSEN); + xSPIx->MW_CTRL = tmpregister; + + xSPIx->BAUD = XSPI_InitStruct->CLKDIV; + + tmpregister = xSPIx->TXFT; + tmpregister &= XSPI_TXFT_MASK; + tmpregister = tmpregister | ((XSPI_InitStruct->TXFTST << 16) | XSPI_InitStruct->TXFTTEI); + xSPIx->TXFT = tmpregister; + + xSPIx->RXFT = XSPI_InitStruct->RXFT; + + xSPIx->DDR_TXDE = XSPI_InitStruct->TXDE; + + tmpregister = 0; + tmpregister = (uint32_t)(((XSPI_InitStruct->SES << 16) | XSPI_InitStruct->SDCN) & 0x000100ff); + xSPIx->RX_DELAY = tmpregister; + + tmpregister = (uint32_t)(XSPI_InitStruct->ENHANCED_CLKSTREN | XSPI_InitStruct->ENHANCED_INST_L + | XSPI_InitStruct->ENHANCED_ADDR_L | XSPI_InitStruct->ENHANCED_TRANSTYPE | XSPI_InitStruct->ENHANCED_INST_L | XSPI_InitStruct->ENHANCED_WAITCYCLES + | XSPI_InitStruct->ENHANCED_WAITCYCLES | XSPI_InitStruct->ENHANCED_INST_L | XSPI_InitStruct->ENHANCED_ADDR_L); + + + xSPIx->ENH_CTRL0 = tmpregister; + } + else if((XSPI_InitStruct->SPIFRF) == XSPI_CTRL0_SPIFRF_DUAL_FORMAT) + { + tmpregister |= (uint32_t)(XSPI_InitStruct->MST | XSPI_InitStruct->SPIFRF | XSPI_InitStruct->TMOD + | XSPI_InitStruct->SSTE | XSPI_InitStruct->SCPOL | XSPI_InitStruct->SCPH | XSPI_InitStruct->DFS | XSPI_InitStruct->CFS); + + xSPIx->CTRL0 = tmpregister; + + tmpregister = xSPIx->CTRL1; + tmpregister &= XSPI_NDF_MASK; + tmpregister |= XSPI_InitStruct->NDF; + xSPIx->CTRL1 = tmpregister; + + tmpregister = 0; + tmpregister = (uint32_t)(XSPI_InitStruct->MWMOD | XSPI_InitStruct->MCDIR | XSPI_InitStruct->MHSEN); + xSPIx->MW_CTRL = tmpregister; + + xSPIx->BAUD = XSPI_InitStruct->CLKDIV; + + tmpregister = xSPIx->TXFT; + tmpregister &= XSPI_TXFT_MASK; + tmpregister = tmpregister | ((XSPI_InitStruct->TXFTST << 16) | XSPI_InitStruct->TXFTTEI); + xSPIx->TXFT = tmpregister; + + xSPIx->RXFT = XSPI_InitStruct->RXFT; + + xSPIx->DDR_TXDE = XSPI_InitStruct->TXDE; + + tmpregister = 0; + tmpregister = (uint32_t)(((XSPI_InitStruct->SES << 16) | XSPI_InitStruct->SDCN) & 0x000100ff); + xSPIx->RX_DELAY = tmpregister; + + tmpregister = 0; + tmpregister |= (uint32_t)(XSPI_InitStruct->ENHANCED_CLKSTREN | XSPI_InitStruct->ENHANCED_ADDR_L | XSPI_InitStruct->ENHANCED_INST_L + | XSPI_InitStruct->ENHANCED_WAITCYCLES | XSPI_InitStruct->ENHANCED_TRANSTYPE | XSPI_InitStruct->ENHANCED_WRINDDREN + | XSPI_InitStruct->ENHANCED_WRSPIDDREN ); + xSPIx->ENH_CTRL0 = tmpregister; + + tmpregister = 0; + tmpregister = (uint32_t)(XSPI_InitStruct->XIPMBL | XSPI_InitStruct->XIPCTEN | XSPI_InitStruct->XIPINSTEN | XSPI_InitStruct->XIP_WRINDDREN + | XSPI_InitStruct->XIP_DDREN | XSPI_InitStruct->XIPDFSHC | XSPI_InitStruct->XIP_WAITCYCLES | XSPI_InitStruct->XIPMDBITS_EN + | XSPI_InitStruct->XIP_INST_L | XSPI_InitStruct->XIP_ADDRL | XSPI_InitStruct->XIP_TRANSTYPE | XSPI_InitStruct->XIP_FRF | XSPI_InitStruct->XIPPREEN); + xSPIx->XIP_CTRL = tmpregister; + + xSPIx->XIP_MODE = XSPI_InitStruct->XIPMDBITS; + xSPIx->XIP_INCR_TOC = XSPI_InitStruct->ITOC; + xSPIx->XIP_WRAP_TOC = XSPI_InitStruct->WTOC; + xSPIx->XIP_TOUT = XSPI_InitStruct->XTOUT; + } + else if((XSPI_InitStruct->SPIFRF) == XSPI_CTRL0_SPIFRF_QUAD_FORMAT || (XSPI_InitStruct->SPIFRF) == XSPI_CTRL0_SPIFRF_OCTAL_FORMAT) + { + tmpregister |= (uint32_t)(XSPI_InitStruct->MST | XSPI_InitStruct->SPIFRF | XSPI_InitStruct->SSTE | XSPI_InitStruct->TMOD + | XSPI_InitStruct->SCPOL | XSPI_InitStruct->SCPH | XSPI_InitStruct->DFS); + + xSPIx->CTRL0 = tmpregister; + + tmpregister = xSPIx->CTRL1; + tmpregister &= XSPI_NDF_MASK; + tmpregister |= XSPI_InitStruct->NDF; + xSPIx->CTRL1 = tmpregister; + + tmpregister = 0; + tmpregister = (uint32_t)(XSPI_InitStruct->MWMOD | XSPI_InitStruct->MCDIR | XSPI_InitStruct->MHSEN); + xSPIx->MW_CTRL = tmpregister; + + xSPIx->BAUD = XSPI_InitStruct->CLKDIV; + + tmpregister = xSPIx->TXFT; + tmpregister &= XSPI_TXFT_MASK; + tmpregister = tmpregister | ((XSPI_InitStruct->TXFTST << 16) | XSPI_InitStruct->TXFTTEI); + xSPIx->TXFT = tmpregister; + + xSPIx->RXFT = XSPI_InitStruct->RXFT; + + xSPIx->DDR_TXDE = XSPI_InitStruct->TXDE; + + tmpregister = 0; + tmpregister = (uint32_t)(((XSPI_InitStruct->SES << 16) | XSPI_InitStruct->SDCN) & 0x000100ff); + xSPIx->RX_DELAY = tmpregister; + + tmpregister = 0; + tmpregister |= (uint32_t)(XSPI_InitStruct->ENHANCED_CLKSTREN | XSPI_InitStruct->ENHANCED_ADDR_L | XSPI_InitStruct->ENHANCED_INST_L + | XSPI_InitStruct->ENHANCED_WAITCYCLES | XSPI_InitStruct->ENHANCED_TRANSTYPE | XSPI_InitStruct->ENHANCED_WRINDDREN + | XSPI_InitStruct->ENHANCED_WRSPIDDREN ); + xSPIx->ENH_CTRL0 = tmpregister; + + tmpregister = 0; + tmpregister = (uint32_t)(XSPI_InitStruct->XIPMBL | XSPI_InitStruct->XIPCTEN | XSPI_InitStruct->XIPINSTEN | XSPI_InitStruct->XIP_WRINDDREN + | XSPI_InitStruct->XIP_DDREN | XSPI_InitStruct->XIPDFSHC | XSPI_InitStruct->XIP_WAITCYCLES | XSPI_InitStruct->XIPMDBITS_EN + | XSPI_InitStruct->XIP_INST_L | XSPI_InitStruct->XIP_ADDRL | XSPI_InitStruct->XIP_TRANSTYPE | XSPI_InitStruct->XIP_FRF | XSPI_InitStruct->XIPPREEN); + xSPIx->XIP_CTRL = tmpregister; + + xSPIx->XIP_MODE = XSPI_InitStruct->XIPMDBITS; + xSPIx->XIP_INCR_TOC = XSPI_InitStruct->ITOC; + xSPIx->XIP_WRAP_TOC = XSPI_InitStruct->WTOC; + xSPIx->XIP_TOUT = XSPI_InitStruct->XTOUT; + + } + else {} + + xSPIx->SLAVE_EN = XSPI_InitStruct->SEN; +} + +/** +*\*\name XSPI_StructInit. +*\*\fun Fills each XSPI_InitStruct member with its default value. +*\*\param XSPI_InitStruct : +*\*\ - FRF +*\*\ - SPIFRF +*\*\ - TMOD +*\*\ - SCPOL +*\*\ - SCPH +*\*\ - DFS +*\*\ - SSTE +*\*\ - SEN +*\*\ - CLKDIV +*\*\ - WAITCYCLES +*\*\ - INST_L +*\*\ - ADDRL +*\*\ - NDF +*\*\ - TXFT +*\*\ - RXFT +*\*\ - ENHANCED_WAITCYCLES +*\*\ - ENHANCED_CLKSTREN +*\*\ - ENHANCED_ADDR_L +*\*\ - ENHANCED_INST_L +*\*\ - ENHANCED_TRANSTYPE +*\*\ - ENHANCED_WRSPIDDREN; +*\*\ - ENHANCED_WRINDDREN; +*\*\ - XIP_FRF +*\*\ - XIP_TRANSTYPE +*\*\ - XIP_ADDRL +*\*\ - XIP_INST_L +*\*\ - XIP_WAITCYCLES +*\*\ - XIPDFSHC +*\*\ - XIPINSTEN +*\*\ - XIPCTEN +*\*\ - XIPINSTEN +*\*\ - XIPMBL +*\*\ - XIP_WRINDDREN +*\*\ - XIP_DDREN +*\*\ - XIPDFSHC +*\*\ - XIPMDBITS +*\*\ - ITOC +*\*\ - WTOC +*\*\ - XTOUT +*\*\ - CFS +*\*\ - MWMOD +*\*\ - MCDIR +*\*\ - MHSEN +*\*\ - TXFN +*\*\ - RXFN +*\*\ - SDCN +*\*\ - SES +*\*\ - TXDE +*\*\return none +**/ +void XSPI_StructInit(XSPI_InitType* XSPI_InitStruct) +{ + XSPI_InitStruct-> FRF = 0; + XSPI_InitStruct-> SPIFRF = 0; + XSPI_InitStruct-> TMOD = 0; + XSPI_InitStruct-> SCPOL = 0; + XSPI_InitStruct-> SCPH = 0; + XSPI_InitStruct-> DFS = 0; + XSPI_InitStruct-> SSTE = 0; + XSPI_InitStruct-> SEN = 0; + XSPI_InitStruct-> CLKDIV = 0; + XSPI_InitStruct-> WAITCYCLES = 0; + XSPI_InitStruct-> INST_L = 0; + XSPI_InitStruct-> ADDR_L = 0; + XSPI_InitStruct-> NDF = 0; + XSPI_InitStruct-> TXFTST = 0; + XSPI_InitStruct-> TXFTTEI = 0; + XSPI_InitStruct-> RXFT = 0; + XSPI_InitStruct-> ENHANCED_WAITCYCLES = 0; + XSPI_InitStruct-> ENHANCED_CLKSTREN = 0; + XSPI_InitStruct-> ENHANCED_ADDR_L = 0; + XSPI_InitStruct-> ENHANCED_INST_L = 0; + XSPI_InitStruct-> ENHANCED_TRANSTYPE = 0; + XSPI_InitStruct-> ENHANCED_WRSPIDDREN = 0; + XSPI_InitStruct-> ENHANCED_WRINDDREN = 0; + XSPI_InitStruct-> XIP_FRF = 0; + XSPI_InitStruct-> XIP_TRANSTYPE = 0; + XSPI_InitStruct-> XIP_ADDRL = 0; + XSPI_InitStruct-> XIP_INST_L = 0; + XSPI_InitStruct-> XIP_WAITCYCLES = 0; + XSPI_InitStruct-> XIPDFSHC = 0; + XSPI_InitStruct-> XIPMBL = 0; + XSPI_InitStruct-> XIPINSTEN = 0; + XSPI_InitStruct-> XIPPREEN = 0; + XSPI_InitStruct-> XIPCTEN = 0; + XSPI_InitStruct-> XIP_WRINDDREN = 0; + XSPI_InitStruct-> XIP_DDREN = 0; + XSPI_InitStruct-> XIPMDBITS_EN = 0; + XSPI_InitStruct-> XIPMDBITS = 0; + XSPI_InitStruct-> ITOC = 0; + XSPI_InitStruct-> WTOC = 0; + XSPI_InitStruct-> XTOUT = 0; + XSPI_InitStruct-> CFS = 0; + XSPI_InitStruct-> MWMOD = 0; + XSPI_InitStruct-> MCDIR = 0; + XSPI_InitStruct-> MHSEN = 0; + XSPI_InitStruct-> SDCN = 0; + XSPI_InitStruct-> SES = 0; + XSPI_InitStruct-> TXDE = 0; +} + +/** +*\*\name XSPI_Cmd. +*\*\fun Control XSPI function switch. +*\*\param cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void XSPI_Cmd(XSPI_Module* xSPIx, FunctionalState cmd) +{ + if (cmd != DISABLE) + { + xSPIx->SSIENR |= XSPI_EN_XSPIEN; + } + else + { + xSPIx->SSIENR &= ~XSPI_EN_XSPIEN; + } +} + +/** +*\*\name XSPI_XIP_Cmd. +*\*\fun Control XSPI XIP function switch. +*\*\param cmd +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +**/ +void XSPI_XIP_Cmd(XSPI_Module* xSPIx, FunctionalState cmd) +{ + if (cmd != DISABLE) + { + xSPIx->XIP_SLAVE_EN |= XSPI_XIP_SLAVE_EN_SEN; + } + else + { + xSPIx->XIP_SLAVE_EN &= ~XSPI_XIP_SLAVE_EN_SEN; + } +} + + +/** +*\*\name XSPI_Slave_Enable. +*\*\fun XSPI_Slave_Enable register config. +*\*\param cmdData: config data +*\*\ +*\*\return none +**/ +void XSPI_Slave_Enable(XSPI_Module* xSPIx, uint8_t cmdData) +{ + xSPIx->SLAVE_EN = cmdData; +} + +/** +*\*\name XSPI_SetTransType. +*\*\fun Set the format of address and instruction sending (1/2/4/8 wire mode) +*\*\param TransType +*\*\ - XSPI_ENH_CTRL0_TRANSTYPE_STANDARD +*\*\ - XSPI_ENH_CTRL0_TRANSTYPE_ADDRESS_BY_FRF +*\*\ - XSPI_ENH_CTRL0_TRANSTYPE_ALL_BY_FRF +*\*\return none +**/ +void XSPI_SetTransType(XSPI_Module* xSPIx, uint32_t TransType) +{ + xSPIx->ENH_CTRL0 &= XSPI_TRANSTYPE_MASK; + xSPIx->ENH_CTRL0 |= TransType; +} + + +/** +*\*\name XSPI_SetWaitCycles. +*\*\fun Set the number of empty instruction cycles to wait +*\*\param WAITCYCLES: +*\*\ - XSPI_ENH_CTRL0_WAIT_1CYCLES +*\*\ - ... +*\*\ - XSPI_ENH_CTRL0_WAIT_31CYCLES +*\*\return none +**/ +void XSPI_SetWaitCycles(XSPI_Module* xSPIx, uint32_t WAITCYCLES) +{ + xSPIx->ENH_CTRL0 &= XSPI_WAITCYCLES_MASK; + xSPIx->ENH_CTRL0 |= WAITCYCLES; +} + +/** +*\*\name XSPI_SetRXFIFOLevel. +*\*\fun Set Rx fifo transmission threshold, trigger full interrupt threshold +*\*\param fifo_len: +*\*\ - 0x0-0xF +*\*\return none +**/ +void XSPI_SetRXFIFOLevel(XSPI_Module* xSPIx, uint32_t fifo_len) +{ + xSPIx->RXFT &= XSPI_RXFTLR_MASK; + xSPIx->RXFT |= fifo_len; +} + +/** +*\*\name XSPI_SetTXFIFOLevel. +*\*\fun Set the Tx fifo transmission threshold and trigger the interrupt threshold +*\*\param fifo_len: +*\*\ - 0x0-0xF +*\*\return none +**/ +void XSPI_SetTXFIFOLevel(XSPI_Module* xSPIx, uint32_t fifo_len) +{ + xSPIx->TXFT &= XSPI_TXFTLITR_MASK; + xSPIx->TXFT |= fifo_len; +} + +/** +*\*\name XSPI_SetTXFIFOStartLevel. +*\*\fun Set Tx fifo start transmission threshold +*\*\param fifo_len: +*\*\ - 0x0-0xF +*\*\return none +**/ +void XSPI_SetTXFIFOStartLevel(XSPI_Module* xSPIx, uint32_t fifo_len) +{ + xSPIx->TXFT &= XSPI_TXFTLR_MASK; + xSPIx->TXFT |= (fifo_len << 16); +} + + +/** +*\*\name XSPI_GetRXFIFOLevel. +*\*\fun Get the amount of data in the Rx fifo +*\*\return Amount of data in Rx fifo. +**/ +uint8_t XSPI_GetRXFIFOLevel(XSPI_Module* xSPIx) +{ + return xSPIx->RXFT; +} + +/** +*\*\name XSPI_GetTXFIFOLevel. +*\*\fun Get the amount of data in the Tx fifo +*\*\return Amount of data in Tx fifo. +**/ +uint8_t XSPI_GetTXFIFOLevel(XSPI_Module* xSPIx) +{ + return xSPIx->TXFT; +} + +/** +*\*\name XSPIGetDataPointer. +*\*\fun Get Pointer of XSPI DAT0 register. +*\*\return The pointer of XSPI DAT0 register. +**/ +uint32_t XSPI_GetDataPointer(XSPI_Module* xSPIx) +{ + return (uint32_t)&xSPIx->DAT0; +} + +/** +*\*\name XSPI_ReadRxFifoNum. +*\*\fun Read value from XSPI RXFN register which shows the number of the data from receive fifo. +*\*\return The number of the data from receive fifo. +**/ +void XSPI_SetTxFifoStartTransferLevel(XSPI_Module* xSPIx, uint16_t Level) +{ + u32 tmp = xSPIx->TXFT; + tmp &= ~(0XFFFF0000); + tmp |= (Level << 16); + xSPIx->TXFT = tmp; +} +/** +*\*\name XSPI_ReadRxFifoNum. +*\*\fun Read value from XSPI RXFN register which shows the number of the data from receive fifo. +*\*\return The number of the data from receive fifo. +**/ +uint32_t XSPI_ReadRxFifoNum(XSPI_Module* xSPIx) +{ + return xSPIx->RXFN; +} + +/** +*\*\name XSPI_ReadTxFifoNum. +*\*\fun Read value from XSPI TXFN register which shows the number of the data from tx fifo. +*\*\return The number of the data from tx fifo. +**/ +uint32_t XSPI_ReadTxFifoNum(XSPI_Module* xSPIx) +{ + return xSPIx->TXFN; +} + +/** +*\*\name XSPI_SendData. +*\*\fun Write one data direct to XSPI DAT0 register to send. +*\*\param SendData: +*\*\ - data to be send +*\*\return none +**/ +void XSPI_SendData(XSPI_Module* xSPIx, uint32_t SendData) +{ + /* Write in the DAT0 register the data to be sent */ + xSPIx->DAT0 = SendData; +} + + +/** +*\*\name XSPI_ReceiveData. +*\*\fun Read one data from XSPI DAT0 register. +*\*\return The value of XSPI DAT0 register. +**/ +uint32_t XSPI_ReceiveData(XSPI_Module* xSPIx) +{ + /* Return the data in the DAT0 register */ + return xSPIx->DAT0; +} + + +/** +*\*\name XSPI_GetFlagStatus. +*\*\fun Checks whether the specified XSPI flag is set or not. +*\*\param XSPI_FLAG: +*\*\ - XSPI_STS_BUSY +*\*\ - XSPI_STS_TXFNF +*\*\ - XSPI_STS_TXFE +*\*\ - XSPI_STS_RXFNE +*\*\ - XSPI_STS_RXFF +*\*\ - XSPI_STS_TXE +*\*\ - XSPI_STS_DCERR +*\*\return The new state of XSPI_FLAG (SET or RESET). +**/ +FlagStatus XSPI_GetFlagStatus(XSPI_Module* xSPIx, uint32_t XSPI_FLAG) +{ + FlagStatus bitstatus ; + + /* Check the status of the specified XSPI flag */ + if ((xSPIx->STS & XSPI_FLAG) != (uint32_t)RESET) + { + /* XSPI_FLAG is set */ + bitstatus = SET; + } + else + { + /* XSPI_FLAG is reset */ + bitstatus = RESET; + } + + /* Return the XSPI_FLAG status */ + return bitstatus; +} + + +/** +*\*\name XSPI_GetINTStatus. +*\*\fun Checks whether the specified XSPI interrupt has occurred or not. +*\*\param FLAG: +*\*\ - XSPI_ISTS_TXFEIS +*\*\ - XSPI_ISTS_TXFOIS +*\*\ - XSPI_ISTS_RXFUIS +*\*\ - XSPI_ISTS_RXFOIS +*\*\ - XSPI_ISTS_RXFFIS +*\*\ - XSPI_ISTS_MMCIS +*\*\ - XSPI_ISTS_XRXOIS +*\*\ - XSPI_ISTS_TXUIS +*\*\return The new state of XSPI_IT (SET or RESET). +**/ +uint16_t XSPI_GetINTStatus(XSPI_Module* xSPIx, uint16_t FLAG) +{ + uint16_t tmp; + tmp = xSPIx->ISTS & FLAG; + + if (tmp == 1) + return 1; + else + return 0; +} + +/** +*\*\name XSPI_ClearITBit. +*\*\fun Checks whether the specified XSPI interrupt has occurred or not. +*\*\param XSPI_IT: +*\*\ - XSPI_IT_TXUIM +*\*\ - XSPI_IT_XRXOIM +*\*\ - XSPI_IT_MMCIM +*\*\ - XSPI_IT_RXFFIM +*\*\ - XSPI_IT_RXFOIM +*\*\ - XSPI_IT_RXFUIM +*\*\ - XSPI_IT_TXFOIM +*\*\ - XSPI_IT_TXFEIM +*\*\return none. +**/ +void XSPI_ClearITBit(XSPI_Module* xSPIx, uint16_t XSPI_IT) +{ + uint16_t itpos; + + /* Get the SPI IT index */ + itpos = (XSPI_IT & 0x0F); + + /* Clear the selected Error interrupt pending bit */ + if(itpos == 1) + { + (void)xSPIx->TXEICR_CLR; //Clear Transmit FIFO Overflow/Underflow Interrupt + } + else if(itpos == 2) + { + (void)xSPIx->RXFOI_CLR; //Clear Receive FIFO Overflow Interrupt. + } + else if(itpos == 3) + { + (void)xSPIx->RXFUI_CLR; //Clear Receive FIFO Underflow Interrupt. + } + else if(itpos == 4) //Receive FIFO Underflow Interrupt Clear + { + (void)xSPIx->MMCI_CLR; //Clear Multi-Master Contention Interrupt + } + else if(itpos == 6) + { + (void)xSPIx->XIP_RXFOI_CLR; //Clear XIP Receive FIFO Overflow Interrupt. + } + else + { + (void)xSPIx->ICLR; + } +} + +/** +*\*\name XSPI_ConfigInt. +*\*\fun Enables or disables the specified XSPI interrupts. +*\*\param XSPI_IT: +*\*\ - XSPI_IT_TXUIM +*\*\ - XSPI_IT_XRXOIM +*\*\ - XSPI_IT_MMCIM +*\*\ - XSPI_IT_RXFFIM +*\*\ - XSPI_IT_RXFOIM +*\*\ - XSPI_IT_RXFUIM +*\*\ - XSPI_IT_TXFOIM +*\*\ - XSPI_IT_TXFEIM +*\*\param Cmd: +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none. +**/ +void XSPI_ConfigInt(XSPI_Module* xSPIx, uint16_t XSPI_IT, FunctionalState Cmd) +{ + uint16_t itpos, itmask; + + /* Get the XSPI IT index */ + itpos = XSPI_IT >> 4; + + /* Set the IT mask */ + itmask = (uint16_t)1 << (uint16_t)itpos; + + if (Cmd != DISABLE) + { + /* Enable the selected XSPI interrupt */ + xSPIx->IMASK |= itmask; + } + else + { + /* Disable the selected XSPI interrupt */ + xSPIx->IMASK &= (uint16_t)~itmask; + } +} + +/** +*\*\name XSPI_ConfigDMATxLevel. +*\*\fun Configuration of XSPI DMA Tx Level. +*\*\param TxDataLevel(transmit data): +*\*\ - 0~0x1F +*\*\return none. +**/ +void XSPI_ConfigDMATxLevel(XSPI_Module* xSPIx, uint32_t TxDataLevel) +{ + xSPIx->DMATDL_CTRL = TxDataLevel; +} + + +/** +*\*\name XSPI_ConfigDMARxLevel. +*\*\fun Configuration of XSPI DMA Rx Level. +*\*\param RxDataLevel(receive data): +*\*\ - 0~0x1F +*\*\return none. +**/ +void XSPI_ConfigDMARxLevel(XSPI_Module* xSPIx, uint32_t RxDataLevel) +{ + xSPIx->DMARDL_CTRL = RxDataLevel; +} + +/** +*\*\name XSPI_EnableDMA +*\*\fun Enables or disables the XSPI's DMA interface. +*\*\param XSPI_DMAReq (The input parameters must be the following values): +*\*\ - XSPI_DMAREQ_TX XSPI DMA transmit request +*\*\ - XSPI_DMAREQ_RX XSPI DMA receive request +*\*\param Cmd (The input parameters must be the following values): +*\*\ - ENABLE +*\*\ - DISABLE +*\*\return none +*\*\note Configured when xSPI_EN.XSPIEN disabled +**/ +void XSPI_EnableDMA(XSPI_Module* xSPIx, uint32_t XSPI_DMAReq, FunctionalState Cmd) +{ + if (Cmd != DISABLE) + { + /* Enable the DMA transfer for selected requests by setting the DMAT and/or + DADDR bits in the USART CTRL3 register */ + xSPIx->DMA_CTRL |= XSPI_DMAReq; + } + else + { + /* Disable the DMA transfer for selected requests by clearing the DMAT and/or + DADDR bits in the USART CTRL3 register */ + xSPIx->DMA_CTRL &= (uint32_t)~XSPI_DMAReq; + } +} + +/** +*\*\name XSPI_GetBusyStatus. +*\*\fun Get XSPI status,busy or not. +*\*\return SET:XSPI busy; +*\*\ RESET:XSPI idle. +**/ +FlagStatus XSPI_GetBusyStatus(XSPI_Module* xSPIx) +{ + FlagStatus bitstatus; + + if ((xSPIx->STS & XSPI_STS_BUSY) == XSPI_STS_BUSY) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name XSPI_GetTxDataBusyStatus. +*\*\fun Check transmit fifo full or not. +*\*\return SET: Transmit fifo full; +*\*\ RESET: Transmit fifo not full. +**/ +FlagStatus XSPI_GetTxDataBusyStatus(XSPI_Module* xSPIx) +{ + FlagStatus bitstatus; + + if ((xSPIx->STS & XSPI_STS_TXFNF) == 0x00) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** +*\*\name XSPI_GetTxDataEmptyStatus. +*\*\fun Check transmit fifo empty or not. +*\*\return SET: Transmit fifo empty; +*\*\ RESET: Transmit fifo not empty. +**/ +FlagStatus XSPI_GetTxDataEmptyStatus(XSPI_Module* xSPIx) +{ + FlagStatus bitstatus; + + if ((xSPIx->STS & XSPI_STS_TXFE) == XSPI_STS_TXFE) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name XSPI_GetRxHaveDataStatus. +*\*\fun Check receive fifo have data or not. +*\*\return SET:Receive fifo have data; +*\*\ RESET:Receive fifo empty. +**/ +FlagStatus XSPI_GetRxHaveDataStatus(XSPI_Module* xSPIx) +{ + FlagStatus bitstatus; + + if ((xSPIx->STS & XSPI_STS_RXFNE) == XSPI_STS_RXFNE) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name XSPI_GetRxDataFullStatus. +*\*\fun Check receive fifo full or not. +*\*\return SET: Receive fifo full; +*\*\ RESET: Receive fifo not full. +**/ +FlagStatus XSPI_GetRxDataFullStatus(XSPI_Module* xSPIx) +{ + FlagStatus bitstatus; + + if ((xSPIx->STS & XSPI_STS_RXFF) == XSPI_STS_RXFF) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + + +/** +*\*\name XSPI_GetDataConflictErrorStatus. +*\*\fun Check data conflict error or not. +*\*\return SET: Data conflict error; +*\*\ RESET: No data conflict error. +**/ +FlagStatus XSPI_GetDataConflictErrorStatus(XSPI_Module* xSPIx) +{ + FlagStatus bitstatus; + + if ((xSPIx->STS & XSPI_STS_DCERR) == XSPI_STS_DCERR) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/** +*\*\name ClrFifo. +*\*\fun Read DAT0 register to clear fifo. +*\*\return none. +**/ +void XSPI_ClrFifo(XSPI_Module* xSPIx) +{ + uint32_t timeout = 0; + + while (XSPI_GetRxHaveDataStatus(xSPIx)) + { + XSPI_ReceiveData(xSPIx); + + if(++timeout >= 200) + { + break; + } + } +} +/** +*\*\name GetFifoData +*\*\fun Get data from fifo. +*\*\param pData pointer to buffer of getting fifo data. +*\*\param Len length of getting fifo data. +*\*\return XSPI_SUCCESS or XSPI_NULL. +**/ +uint32_t XSPI_GetFifoData(XSPI_Module* xSPIx, uint32_t* pData, uint32_t Len) +{ + uint32_t cnt; + + for (cnt = 0; cnt < Len; cnt++) + { + if (XSPI_GetRxHaveDataStatus(xSPIx)) + { + *pData++ = XSPI_ReceiveData(xSPIx); + } + else + { + return XSPI_NULL; + } + } + + return XSPI_SUCCESS; +} +/** +*\*\name XSPISendAndGetWords. +*\*\fun Send words out from source data buffer and get returned datas into destination data buffer. +*\*\param pSrcData: +*\*\ - pSrcData pointer to buffer of sending datas. +*\*\param pDstData: +*\*\ - pDstData pointer to buffer of getting returned datas. +*\*\param cnt: +*\*\ - cnt number of sending datas. +*\*\return none. +**/ +void XSPI_SendAndGetWords(XSPI_Module* xSPIx, uint32_t* pSrcData, uint32_t* pDstData, uint32_t cnt) +{ + uint32_t num = 0; + uint32_t timeout = 0; + + while (num < cnt) + { + XSPI_SendData(xSPIx, *(pSrcData++)); + num++; + } + + while (!XSPI_GetRxHaveDataStatus(xSPIx)) + { + if(++timeout >= XSPI_TIME_OUT_CNT) + { + break; + } + } + + timeout = 0; + + while (xSPIx->RXFN < cnt) + { + if(++timeout >= XSPI_TIME_OUT_CNT) + { + break; + } + } + + num = 0; + + while (num < cnt) + { + *(pDstData++) = XSPI_ReceiveData(xSPIx); + num++; + } +} + +/** +*\*\name XSPISendWordAndGetWords. +*\*\fun Send one word data and get returned words into destination data buffer. +*\*\param WrData: +*\*\ - WrData one word to be sent. +*\*\param pRdData: +*\*\ - pRdData pointer to buffer of getting returned datas. +*\*\param LastRd: +*\*\ - 1:go on to get returned datas. +*\*\ - 0:end to get returned datas. +*\*\return none. +**/ +uint32_t XSPI_SendWordAndGetWords(XSPI_Module* xSPIx, uint32_t WrData, uint32_t* pRdData, uint8_t LastRd) +{ + uint32_t timeout1 = 0; + + XSPI_SendData(xSPIx, WrData); //trammit + *pRdData = XSPI_ReceiveData(xSPIx); + + if(LastRd != 0) + { + while(!XSPI_GetRxHaveDataStatus(xSPIx)) //wait for data + { + if(++timeout1 >= XSPI_TIME_OUT_CNT) + { + return XSPI_NULL; //time out + } + } + + *pRdData = XSPI_ReceiveData(xSPIx); //read data + return XSPI_SUCCESS; + } + + return XSPI_NULL; +} + +/** +*\*\name xSPI_Wait_Flag. +*\*\fun xspi Waiting for status register flag. +*\*\param xSPIx: +*\*\ - xSPI2. +*\*\param flag: +*\*\ - status register flag to be wait. +*\*\param sta: +*\*\ - SET or RESET. +*\*\param wtime: +*\*\ - timeout. +*\*\return 0:ture 1:false +**/ +uint8_t xSPI_Wait_Flag(XSPI_Module* xSPIx, uint32_t flag, uint8_t sta, uint64_t wtime) +{ + uint8_t flagsta = 0; + + while(wtime) + { + flagsta = (xSPIx->STS & flag) ? 1 : 0; + + if(flagsta == sta)break; + + wtime--; + } + + if(wtime)return 0; + else return 1; +} + +/** +*\*\name xSPI_Wait_TransferComplete. +*\*\fun xspi wait Transfer Complete. +*\*\param xSPIx: +*\*\ - xSPI2. +*\*\param wtime: +*\*\ - timeout. +*\*\return 0:ture 1:false +**/ +uint8_t xSPI_Wait_TransferComplete(XSPI_Module* xSPIx, uint64_t wtime) +{ + uint8_t ret = 0; + ret |= xSPI_Wait_Flag(xSPIx, XSPI_STS_TXFE, SET, wtime); //wait for Transmit FIFO is empty:(0x1 EMPTY) + ret |= xSPI_Wait_Flag(xSPIx, XSPI_STS_BUSY, RESET, wtime); //wait for xSPI is idle or disabled:(0x0 idle) + return ret; +} + +/** +*\*\name xSPI_TXFifoLevel. +*\*\fun xspi set tx fifo level. +*\*\param xSPIx: +*\*\ - xSPI2. +*\*\param FifoLevel: +*\*\ - tx fifo level to be set. +*\*\return 0:none +**/ +void xSPI_TXFifoLevel(XSPI_Module* xSPIx, u16 FifoLevel) +{ + u32 tmp = 0; + + xSPIx->SSIENR = DISABLE; //disable QSPI + + tmp = xSPIx->TXFT; + //[20:16] TXFTHR + tmp &= ~(0x001f0000); + tmp |= (FifoLevel << 16); + xSPIx->TXFT = tmp; + + xSPIx->SSIENR = ENABLE;//enable QSPI +} + +/** +*\*\name xSPI_BaudRateSelect. +*\*\fun xspi set BaudRate. +*\*\param xSPIx: +*\*\ - xSPI2. +*\*\param BAUDR_Value: +*\*\ - Baud Rate to be set. +*\*\return 0:none +**/ +void xSPI_BaudRateSelect(XSPI_Module* xSPIx, uint32_t BAUDR_Value) +{ + xSPIx->SSIENR = DISABLE; //disable QSPI + xSPIx->BAUD = BAUDR_Value; + xSPIx->SSIENR = ENABLE;//enable QSPI +} + +void xSPI_RXSampleDelay(XSPI_Module* xSPIx, uint32_t Sampling_Edge, uint32_t SampleDelay) +{ + xSPIx->SSIENR = DISABLE; //disable QSPI + xSPIx->RX_DELAY = (Sampling_Edge | SampleDelay); + xSPIx->SSIENR = ENABLE;//enable QSPI +} + +/** +*\*\name SetXspi_InstAddrWaitcycle_phase. +*\*\fun Set the data length of xSPIx instruction, address stage, and null instruction in each stage. +*\*\param xSPIx: +*\*\ - xSPI2. +*\*\param inst_l: +*\*\ - instruction length. +*\*\param addr_l: +*\*\ - address stage length. +*\*\param wait_cycle: +*\*\ - wait cycle. +*\*\return 0:none +**/ +void SetXspi_InstAddrWaitcycle_phase(XSPI_Module* xSPIx, u32 inst_l, u32 addr_l, u32 wait_cycle) +{ + xSPIx->SSIENR = DISABLE; //disable QSPI + + xSPIx->ENH_CTRL0 &= XSPI_INST_L_MASK; + xSPIx->ENH_CTRL0 |= inst_l; + + xSPIx->ENH_CTRL0 &= XSPI_ADDRL_MASK; + xSPIx->ENH_CTRL0 |= addr_l; + + xSPIx->ENH_CTRL0 &= XSPI_WAITCYCLES_MASK; + xSPIx->ENH_CTRL0 |= wait_cycle; + + xSPIx->SSIENR = ENABLE;//enable QSPI +} + +/** +*\*\name SetXspi_TransType +*\*\fun Set address and instruction transmission format +*\*\param xSPIx: +*\*\ - xSPI2. +*\*\param type: +*\*\ - address and instruction transmission format +*\*\return 0:none +**/ +void SetXspi_TransType(XSPI_Module* xSPIx, u32 type) +{ + xSPIx->SSIENR = DISABLE; //disable QSPI + + xSPIx->ENH_CTRL0 &= XSPI_TRANSTYPE_MASK; + xSPIx->ENH_CTRL0 |= type; + xSPIx->SSIENR = ENABLE;//enable QSPI +} + +/** +*\*\name Set_xSPI_DDR +*\*\fun Set DDR Enable:This will enable Dual-data rate transfers in Dual/Quad/Octal frame formats of SPI +*\*\ and Instruction DDR Enable bit. +*\*\param xSPIx: +*\*\ - xSPI2. +*\*\param set_type: +*\*\ - DDR enable type +*\*\return 0:none +**/ +void Set_xSPI_DDR(XSPI_Module* xSPIx, u32 set_type) +{ + xSPIx->SSIENR = DISABLE; //disable QSPI + + //Send edge settings + //The maximum value of this register is = (BAUDR/2) -1 + xSPIx->DDR_TXDE = ((xSPIx->BAUD / 2) / 2) > 255 ? 255 : ((xSPIx->BAUD / 2) / 2); + + switch(set_type) + { + case XSPI_INST_DDR_EN://Setting the inst ddd separately will not take effect. You must first set the SPI ddd and then set the inst ddd for it to take effect + { + xSPIx->ENH_CTRL0 |= (1 << 16); //spi ddr + xSPIx->ENH_CTRL0 |= (1 << 17); //inst ddr + } + break; + + case XSPI_SPI_DDR_EN: + { + xSPIx->ENH_CTRL0 |= (1 << 16); //spi ddr + } + break; + + case XIP_READ_INST_DDR_EN: + { + xSPIx->XIP_CTRL |= (1 << 19); //spi ddr + xSPIx->XIP_CTRL |= (1 << 20); //inst ddr + } + break; + + case XIP_READ_IDDR_EN: + { + xSPIx->XIP_CTRL |= (1 << 19); //spi ddr + } + break; + + case XIP_WRITE_INST_DDR_EN: + { + xSPIx->XIP_WRITE_CTRL |= (1 << 10); //spi ddr + xSPIx->XIP_WRITE_CTRL |= (1 << 11); //inst ddr + } + break; + + case XIP_WRITE_IDDR_EN: + { + xSPIx->XIP_WRITE_CTRL |= (1 << 10); //spi ddr + } + break; + + } + + xSPIx->SSIENR = ENABLE;//enable QSPI +} + +/** +*\*\name xSPI_Clear_RXFIFO +*\*\fun clear rx fifo data +*\*\param xSPIx: +*\*\ - xSPI2. +*\*\return 0:none +**/ +void xSPI_Clear_RXFIFO(XSPI_Module* xSPIx) +{ + //clear rx FIFO + while(xSPIx->STS & XSPI_FLAG_RFNE)// RX FIFO Not Empty flag set + { + xSPIx->DAT0; + } +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/inc/usbd_audio_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/inc/usbd_audio_core.h new file mode 100644 index 0000000000..d4716f6fde --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/inc/usbd_audio_core.h @@ -0,0 +1,128 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_audio_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USB_AUDIO_CORE_H_ +#define __USB_AUDIO_CORE_H_ + +#include "usbd_ioreq.h" +#include "usbd_req.h" +#include "usbd_desc.h" + +/* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 2) */ +#define AUDIO_OUT_PACKET (uint32_t)(((USBD_AUDIO_FREQ * 2 * 2) /1000)) + +/* Number of sub-packets in the audio transfer buffer. You can modify this value but always make sure + that it is an even number and higher than 3 */ +#define OUT_PACKET_NUM 4 +/* Total size of the audio transfer buffer */ +#define TOTAL_OUT_BUF_SIZE ((uint32_t)(AUDIO_OUT_PACKET * OUT_PACKET_NUM)) + +#define AUDIO_CONFIG_DESC_SIZE 109 +#define AUDIO_INTERFACE_DESC_SIZE 9 +#define USB_AUDIO_DESC_SIZ 0x09 +#define AUDIO_STANDARD_ENDPOINT_DESC_SIZE 0x09 +#define AUDIO_STREAMING_ENDPOINT_DESC_SIZE 0x07 + +#define AUDIO_DESCRIPTOR_TYPE 0x21 +#define USB_DEVICE_CLASS_AUDIO 0x01 +#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01 +#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02 +#define AUDIO_PROTOCOL_UNDEFINED 0x00 +#define AUDIO_STREAMING_GENERAL 0x01 +#define AUDIO_STREAMING_FORMAT_TYPE 0x02 + +/* Audio Descriptor Types */ +#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24 +#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25 + +/* Audio Control Interface Descriptor Subtypes */ +#define AUDIO_CONTROL_HEADER 0x01 +#define AUDIO_CONTROL_INPUT_TERMINAL 0x02 +#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03 +#define AUDIO_CONTROL_FEATURE_UNIT 0x06 + +#define AUDIO_INPUT_TERMINAL_DESC_SIZE 0x0C +#define AUDIO_OUTPUT_TERMINAL_DESC_SIZE 0x09 +#define AUDIO_STREAMING_INTERFACE_DESC_SIZE 0x07 + +#define AUDIO_CONTROL_MUTE 0x01 + +#define AUDIO_FORMAT_TYPE_I 0x01 +#define AUDIO_FORMAT_TYPE_III 0x03 + +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 +#define AUDIO_ENDPOINT_GENERAL 0x01 + +#define AUDIO_REQ_GET_CUR 0x81 +#define AUDIO_REQ_SET_CUR 0x01 + +#define AUDIO_OUT_STREAMING_CTRL 0x02 + +typedef struct _Audio_Fops +{ + uint8_t (*Init) (uint32_t AudioFreq, uint32_t Volume, uint32_t options); + uint8_t (*DeInit) (uint32_t options); + uint8_t (*AudioCmd) (uint8_t* pbuf, uint32_t size, uint8_t cmd); + uint8_t (*VolumeCtrl) (uint8_t vol); + uint8_t (*MuteCtrl) (uint8_t cmd); + uint8_t (*PeriodicTC) (uint8_t cmd); + uint8_t (*GetState) (void); +}AUDIO_FOPS_TypeDef; + +#define AUDIO_PACKET_SZE(frq) (uint8_t)(((frq * 2 * 2)/1000) & 0xFF), (uint8_t)((((frq * 2 * 2)/1000) >> 8) & 0xFF) +#define SAMPLE_FREQ(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16)) + + +extern USBD_Class_cb_TypeDef USBD_AUDIO_cb; + +#endif /* __USB_AUDIO_CORE_H_ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/inc/usbd_audio_out_if.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/inc/usbd_audio_out_if.h new file mode 100644 index 0000000000..82392d444f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/inc/usbd_audio_out_if.h @@ -0,0 +1,87 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_audio_out_if.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USB_AUDIO_OUT_IF_H__ +#define __USB_AUDIO_OUT_IF_H__ + +#include "usbd_audio_core.h" + +/* Audio Commands enumeration */ +typedef enum +{ + AUDIO_CMD_PLAY = 1, + AUDIO_CMD_PAUSE, + AUDIO_CMD_STOP, +}AUDIO_CMD_TypeDef; + +/* Mute commands */ +#define AUDIO_MUTE 0x01 +#define AUDIO_UNMUTE 0x00 + +/* Functions return value */ +#define AUDIO_OK 0x00 +#define AUDIO_FAIL 0xFF + +/* Audio Machine States */ +#define AUDIO_STATE_INACTIVE 0x00 +#define AUDIO_STATE_ACTIVE 0x01 +#define AUDIO_STATE_PLAYING 0x02 +#define AUDIO_STATE_PAUSED 0x03 +#define AUDIO_STATE_STOPPED 0x04 +#define AUDIO_STATE_ERROR 0x05 + + +extern AUDIO_FOPS_TypeDef AUDIO_OUT_fops; + +#endif /* __USB_AUDIO_OUT_IF_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/src/usbd_audio_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/src/usbd_audio_core.c new file mode 100644 index 0000000000..196f2f0d0a --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/src/usbd_audio_core.c @@ -0,0 +1,548 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_audio_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbd_audio_core.h" +#include "usbd_audio_out_if.h" + +/********************************************* + AUDIO Device library callbacks + *********************************************/ +static uint8_t USBD_AUDIO_Init (void *pdev, uint8_t cfgidx); +static uint8_t USBD_AUDIO_DeInit (void *pdev, uint8_t cfgidx); +static uint8_t USBD_AUDIO_Setup (void *pdev, USB_SETUP_REQ *req); +static uint8_t USBD_AUDIO_EP0_RxReady(void *pdev); +static uint8_t USBD_AUDIO_DataIn (void *pdev, uint8_t epnum); +static uint8_t USBD_AUDIO_DataOut (void *pdev, uint8_t epnum); +static uint8_t USBD_AUDIO_SOF (void *pdev); +static uint8_t USBD_AUDIO_OUT_Incplt (void *pdev); + +static void AUDIO_Req_GetCurrent(void *pdev, USB_SETUP_REQ *req); +static void AUDIO_Req_SetCurrent(void *pdev, USB_SETUP_REQ *req); +static uint8_t *USBD_AUDIO_GetCfgDesc (uint8_t speed, uint16_t *length); + +/* Main Buffer for Audio Data Out transfers and its relative pointers */ +uint8_t IsocOutBuff [TOTAL_OUT_BUF_SIZE * 2]; +uint8_t* IsocOutWrPtr = IsocOutBuff; +uint8_t* IsocOutRdPtr = IsocOutBuff; + +/* Main Buffer for Audio Control Requests transfers and its relative variables */ +uint8_t AudioCtrl[64]; +uint8_t AudioCtrlCmd = 0; +uint32_t AudioCtrlLen = 0; +uint8_t AudioCtrlUnit = 0; + +static uint32_t PlayFlag = 0; + +static __IO uint32_t USBD_AUDIO_AltSet = 0; +static uint8_t USBD_AUDIO_CfgDesc[AUDIO_CONFIG_DESC_SIZE]; + +/* AUDIO interface class callbacks structure */ +USBD_Class_cb_TypeDef USBD_AUDIO_cb = +{ + USBD_AUDIO_Init, + USBD_AUDIO_DeInit, + USBD_AUDIO_Setup, + NULL, /* EP0_TxSent */ + USBD_AUDIO_EP0_RxReady, + USBD_AUDIO_DataIn, + USBD_AUDIO_DataOut, + USBD_AUDIO_SOF, + NULL, + USBD_AUDIO_OUT_Incplt, + USBD_AUDIO_GetCfgDesc, + USBD_AUDIO_GetCfgDesc, +}; + +/* USB AUDIO device Configuration Descriptor */ +static uint8_t USBD_AUDIO_CfgDesc[AUDIO_CONFIG_DESC_SIZE] = +{ + /* Configuration 1 */ + 0x09, /* bLength */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */ + LOBYTE(AUDIO_CONFIG_DESC_SIZE), /* wTotalLength 109 bytes*/ + HIBYTE(AUDIO_CONFIG_DESC_SIZE), + 0x02, /* bNumInterfaces */ + 0x01, /* bConfigurationValue */ + 0x00, /* iConfiguration */ + 0xC0, /* bmAttributes BUS Powred*/ + 0x32, /* bMaxPower = 100 mA*/ + /* 09 byte*/ + + /* USB Speaker Standard interface descriptor */ + AUDIO_INTERFACE_DESC_SIZE, /* bLength */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + 0x00, /* bInterfaceNumber */ + 0x00, /* bAlternateSetting */ + 0x00, /* bNumEndpoints */ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ + AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ + 0x00, /* iInterface */ + /* 09 byte*/ + + /* USB Speaker Class-specific AC Interface Descriptor */ + AUDIO_INTERFACE_DESC_SIZE, /* bLength */ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */ + 0x00, /* 1.00 */ /* bcdADC */ + 0x01, + 0x27, /* wTotalLength = 39*/ + 0x00, + 0x01, /* bInCollection */ + 0x01, /* baInterfaceNr */ + /* 09 byte*/ + + /* USB Speaker Input Terminal Descriptor */ + AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */ + 0x01, /* bTerminalID */ + 0x01, /* wTerminalType AUDIO_TERMINAL_USB_STREAMING 0x0101 */ + 0x01, + 0x00, /* bAssocTerminal */ + 0x01, /* bNrChannels */ + 0x00, /* wChannelConfig 0x0000 Mono */ + 0x00, + 0x00, /* iChannelNames */ + 0x00, /* iTerminal */ + /* 12 byte*/ + + /* USB Speaker Audio Feature Unit Descriptor */ + 0x09, /* bLength */ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */ + AUDIO_OUT_STREAMING_CTRL, /* bUnitID */ + 0x01, /* bSourceID */ + 0x01, /* bControlSize */ + AUDIO_CONTROL_MUTE, /* bmaControls(0) */ + 0x00, /* bmaControls(1) */ + 0x00, /* iTerminal */ + /* 09 byte*/ + + /*USB Speaker Output Terminal Descriptor */ + 0x09, /* bLength */ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */ + 0x03, /* bTerminalID */ + 0x01, /* wTerminalType 0x0301*/ + 0x03, + 0x00, /* bAssocTerminal */ + 0x02, /* bSourceID */ + 0x00, /* iTerminal */ + /* 09 byte*/ + + /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwith */ + /* Interface 1, Alternate Setting 0 */ + AUDIO_INTERFACE_DESC_SIZE, /* bLength */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + 0x01, /* bInterfaceNumber */ + 0x00, /* bAlternateSetting */ + 0x00, /* bNumEndpoints */ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ + 0x00, /* iInterface */ + /* 09 byte*/ + + /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational */ + /* Interface 1, Alternate Setting 1 */ + AUDIO_INTERFACE_DESC_SIZE, /* bLength */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + 0x01, /* bInterfaceNumber */ + 0x01, /* bAlternateSetting */ + 0x01, /* bNumEndpoints */ + USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ + AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ + AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ + 0x00, /* iInterface */ + /* 09 byte*/ + + /* USB Speaker Audio Streaming Interface Descriptor */ + AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ + 0x01, /* bTerminalLink */ + 0x01, /* bDelay */ + 0x01, /* wFormatTag AUDIO_FORMAT_PCM 0x0001*/ + 0x00, + /* 07 byte*/ + + /* USB Speaker Audio Type III Format Interface Descriptor */ + 0x0B, /* bLength */ + AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ + AUDIO_FORMAT_TYPE_III, /* bFormatType */ + 0x02, /* bNrChannels */ + 0x02, /* bSubFrameSize : 2 Bytes per frame (16bits) */ + 16, /* bBitResolution (16-bits per sample) */ + 0x01, /* bSamFreqType only one frequency supported */ + SAMPLE_FREQ(USBD_AUDIO_FREQ), /* Audio sampling frequency coded on 3 bytes */ + /* 11 byte*/ + + /* Endpoint 9 - Standard Descriptor */ + AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ + AUDIO_OUT_EP, /* bEndpointAddress 9 out endpoint*/ + USB_ENDPOINT_TYPE_ISOCHRONOUS, /* bmAttributes */ + AUDIO_PACKET_SZE(USBD_AUDIO_FREQ), /* wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */ + 0x01, /* bInterval */ + 0x00, /* bRefresh */ + 0x00, /* bSynchAddress */ + /* 09 byte*/ + + /* Endpoint - Audio Streaming Descriptor*/ + AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */ + AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ + AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ + 0x00, /* bmAttributes */ + 0x00, /* bLockDelayUnits */ + 0x00, /* wLockDelay */ + 0x00, + /* 07 byte*/ +} ; + +/** +*\*\name USBD_AUDIO_Init. +*\*\fun Initializes the AUDIO interface. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return status. +**/ +static uint8_t USBD_AUDIO_Init (void *pdev, uint8_t cfgidx) +{ + /* Open EP OUT */ + USBDEV_EP_Open(pdev, AUDIO_OUT_EP, AUDIO_OUT_PACKET, USB_EP_ISOC); + + /* Initialize the Audio output Hardware layer */ + if (AUDIO_OUT_fops.Init(USBD_AUDIO_FREQ, DEFAULT_VOLUME, 0) != USBD_OK) + { + return USBD_FAIL; + } + + /* Prepare Out endpoint to receive audio data */ + USBDEV_EP_PrepareRx(pdev, AUDIO_OUT_EP, (uint8_t*)IsocOutBuff, AUDIO_OUT_PACKET); + + return USBD_OK; +} + +/** +*\*\name USBD_AUDIO_DeInit. +*\*\fun DeInitializes the AUDIO layer. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return status. +**/ +static uint8_t USBD_AUDIO_DeInit (void *pdev, uint8_t cfgidx) +{ + USBDEV_EP_Close(pdev , AUDIO_OUT_EP); + + /* DeInitialize the Audio output Hardware layer */ + if (AUDIO_OUT_fops.DeInit(0) != USBD_OK) + { + return USBD_FAIL; + } + + return USBD_OK; +} + +/** +*\*\name USBD_AUDIO_Setup. +*\*\fun Handles the Audio control request parsing. +*\*\param pdev: device instance. +*\*\param req: usb requests +*\*\return status. +**/ +static uint8_t USBD_AUDIO_Setup (void *pdev, USB_SETUP_REQ *req) +{ + uint16_t len=USB_AUDIO_DESC_SIZ; + uint8_t *pbuf=USBD_AUDIO_CfgDesc + 18; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + /* AUDIO Class Requests */ + case USB_REQ_TYPE_CLASS : + switch (req->bRequest) + { + case AUDIO_REQ_GET_CUR: + AUDIO_Req_GetCurrent(pdev, req); + break; + + case AUDIO_REQ_SET_CUR: + AUDIO_Req_SetCurrent(pdev, req); + break; + + default: + USBD_CtrlError (pdev, req); + return USBD_FAIL; + } + break; + + /* Standard Requests */ + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if( (req->wValue >> 8) == AUDIO_DESCRIPTOR_TYPE) + { + pbuf = USBD_AUDIO_CfgDesc + 18; + len = MIN(USB_AUDIO_DESC_SIZ , req->wLength); + } + USBD_CtrlSendData (pdev, pbuf, len); + break; + + case USB_REQ_GET_INTERFACE : + USBD_CtrlSendData (pdev, (uint8_t *)&USBD_AUDIO_AltSet, 1); + break; + + case USB_REQ_SET_INTERFACE : + if ((uint8_t)(req->wValue) < AUDIO_TOTAL_IF_NUM) + { + USBD_AUDIO_AltSet = (uint8_t)(req->wValue); + } + else + { + /* Call the error management function (command will be nacked */ + USBD_CtrlError (pdev, req); + } + break; + } + } + return USBD_OK; +} + +/** +*\*\name USBD_AUDIO_EP0_RxReady. +*\*\fun Handles audio control requests data. +*\*\param pdev: device instance. +*\*\return status. +**/ +static uint8_t USBD_AUDIO_EP0_RxReady (void *pdev) +{ + /* Check if an AudioControl request has been issued */ + if (AudioCtrlCmd == AUDIO_REQ_SET_CUR) + {/* In this driver, to simplify code, only SET_CUR request is managed */ + /* Check for which addressed unit the AudioControl request has been issued */ + if (AudioCtrlUnit == AUDIO_OUT_STREAMING_CTRL) + {/* In this driver, to simplify code, only one unit is manage */ + /* Call the audio interface mute function */ + AUDIO_OUT_fops.MuteCtrl(AudioCtrl[0]); + + /* Reset the AudioCtrlCmd variable to prevent re-entering this function */ + AudioCtrlCmd = 0; + AudioCtrlLen = 0; + } + } + + return USBD_OK; +} + +/** +*\*\name USBD_AUDIO_DataIn. +*\*\fun Handles the audio IN data stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint number +*\*\return status. +**/ +static uint8_t USBD_AUDIO_DataIn (void *pdev, uint8_t epnum) +{ + return USBD_OK; +} + +__IO uint32_t DataOutCounter = 0; +/** +*\*\name USBD_AUDIO_DataOut. +*\*\fun Handles the Audio Out data stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint number +*\*\return status. +**/ +static uint8_t USBD_AUDIO_DataOut (void *pdev, uint8_t epnum) +{ + DataOutCounter++; + if (epnum == AUDIO_OUT_EP) + { + /* Increment the Buffer pointer or roll it back when all buffers are full */ + if (IsocOutWrPtr >= (IsocOutBuff + (AUDIO_OUT_PACKET * OUT_PACKET_NUM))) + {/* All buffers are full: roll back */ + IsocOutWrPtr = IsocOutBuff; + } + else + {/* Increment the buffer pointer */ + IsocOutWrPtr += AUDIO_OUT_PACKET; + } + + /* Toggle the frame index */ + ((USB_CORE_MODULE*)pdev)->dev.out_ep[epnum].even_odd_frame = + (((USB_CORE_MODULE*)pdev)->dev.out_ep[epnum].even_odd_frame)? 0:1; + + /* Prepare Out endpoint to receive next audio packet */ + USBDEV_EP_PrepareRx(pdev, AUDIO_OUT_EP, (uint8_t*)(IsocOutWrPtr), AUDIO_OUT_PACKET); + + /* Trigger the start of streaming only when half buffer is full */ + if ((PlayFlag == 0) && (IsocOutWrPtr >= (IsocOutBuff + ((AUDIO_OUT_PACKET * OUT_PACKET_NUM) / 2)))) + { + /* Enable start of Streaming */ + PlayFlag = 1; + } + } + + return USBD_OK; +} + +/** +*\*\name USBD_AUDIO_SOF. +*\*\fun Handles the SOF event (data buffer update and synchronization). +*\*\param pdev: device instance. +*\*\return status. +**/ +static uint8_t USBD_AUDIO_SOF (void *pdev) +{ + /* Check if there are available data in stream buffer. + In this function, a single variable (PlayFlag) is used to avoid software delays. + The play operation must be executed as soon as possible after the SOF detection. */ + if (PlayFlag) + { + /* Start playing received packet */ + AUDIO_OUT_fops.AudioCmd((uint8_t*)(IsocOutRdPtr), /* Samples buffer pointer */ + AUDIO_OUT_PACKET, /* Number of samples in Bytes */ + AUDIO_CMD_PLAY); /* Command to be processed */ + + /* Increment the Buffer pointer or roll it back when all buffers all full */ + if (IsocOutRdPtr >= (IsocOutBuff + (AUDIO_OUT_PACKET * OUT_PACKET_NUM))) + {/* Roll back to the start of buffer */ + IsocOutRdPtr = IsocOutBuff; + } + else + {/* Increment to the next sub-buffer */ + IsocOutRdPtr += AUDIO_OUT_PACKET; + } + + /* If all available buffers have been consumed, stop playing */ + if (IsocOutRdPtr == IsocOutWrPtr) + { + /* Pause the audio stream */ + AUDIO_OUT_fops.AudioCmd((uint8_t*)(IsocOutBuff), /* Samples buffer pointer */ + AUDIO_OUT_PACKET, /* Number of samples in Bytes */ + AUDIO_CMD_PAUSE); /* Command to be processed */ + + /* Stop entering play loop */ + PlayFlag = 0; + + /* Reset buffer pointers */ + IsocOutRdPtr = IsocOutBuff; + IsocOutWrPtr = IsocOutBuff; + } + } + + return USBD_OK; +} + +/** +*\*\name USBD_AUDIO_OUT_Incplt. +*\*\fun Handles the iso out incomplete event. +*\*\param pdev: device instance. +*\*\return status. +**/ +static uint8_t USBD_AUDIO_OUT_Incplt (void *pdev) +{ + return USBD_OK; +} + +/** +*\*\name AUDIO_Req_GetCurrent. +*\*\fun Handles the GET_CUR Audio control request. +*\*\param pdev: device instance. +*\*\param req: setup class request +*\*\return status. +**/ +static void AUDIO_Req_GetCurrent(void *pdev, USB_SETUP_REQ *req) +{ + /* Send the current mute state */ + USBD_CtrlSendData (pdev, AudioCtrl, req->wLength); +} + +/** +*\*\name AUDIO_Req_SetCurrent. +*\*\fun Handles the SET_CUR Audio control request. +*\*\param pdev: device instance. +*\*\param req: setup class request +*\*\return status. +**/ +static void AUDIO_Req_SetCurrent(void *pdev, USB_SETUP_REQ *req) +{ + if (req->wLength) + { + /* Prepare the reception of the buffer over EP0 */ + USBD_CtrlPrepareRx (pdev, AudioCtrl, req->wLength); + + /* Set the global variables indicating current request and its length + to the function USBD_AUDIO_EP0_RxReady() which will process the request */ + AudioCtrlCmd = AUDIO_REQ_SET_CUR; /* Set the request value */ + AudioCtrlLen = req->wLength; /* Set the request data length */ + AudioCtrlUnit = HIBYTE(req->wIndex); /* Set the request target unit */ + } +} + +/** +*\*\name USBD_AUDIO_GetCfgDesc. +*\*\fun Returns configuration descriptor. +*\*\param speed : current device speed +*\*\param length : pointer data length +*\*\return pointer to descriptor buffer. +**/ +static uint8_t *USBD_AUDIO_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_AUDIO_CfgDesc); + return USBD_AUDIO_CfgDesc; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/src/usbd_audio_out_if.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/src/usbd_audio_out_if.c new file mode 100644 index 0000000000..d64497270f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/audio/src/usbd_audio_out_if.c @@ -0,0 +1,247 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_audio_out_if.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbd_audio_core.h" +#include "usbd_audio_out_if.h" +#include "bsp_wm8978.h" + +static uint8_t Init (uint32_t AudioFreq, uint32_t Volume, uint32_t options); +static uint8_t DeInit (uint32_t options); +static uint8_t AudioCmd (uint8_t* pbuf, uint32_t size, uint8_t cmd); +static uint8_t VolumeCtrl (uint8_t vol); +static uint8_t MuteCtrl (uint8_t cmd); +static uint8_t PeriodicTC (uint8_t cmd); +static uint8_t GetState (void); + +AUDIO_FOPS_TypeDef AUDIO_OUT_fops = +{ + Init, + DeInit, + AudioCmd, + VolumeCtrl, + MuteCtrl, + PeriodicTC, + GetState +}; + +static uint8_t AudioState = AUDIO_STATE_INACTIVE; + +/** +*\*\name Init. +*\*\fun Initialize and configures all required resources for audio play function. +*\*\param AudioFreq: Startup audio frequency. +*\*\param Volume: Startup volume to be set. +*\*\param options: specific options passed to low layer function. +*\*\return AUDIO_OK if all operations succeed, AUDIO_FAIL else. +**/ +static uint8_t Init(uint32_t AudioFreq, uint32_t Volume, uint32_t options) +{ + static uint32_t Initialized = 0; + + /* Check if the low layer has already been initialized */ + if (Initialized == 0) + { + /* Call low layer function */ + if (WM8978_Speaker_Init(Volume, AudioFreq) != 0) + { + AudioState = AUDIO_STATE_ERROR; + return AUDIO_FAIL; + } + /* Set the Initialization flag to prevent reinitializing the interface again */ + Initialized = 1; + } + + /* Update the Audio state machine */ + AudioState = AUDIO_STATE_ACTIVE; + + return AUDIO_OK; +} + +/** +*\*\name DeInit. +*\*\fun Free all resources used by low layer and stops audio-play function. +*\*\param options: specific options passed to low layer function. +*\*\return AUDIO_OK if all operations succeed, AUDIO_FAIL else. +**/ +static uint8_t DeInit (uint32_t options) +{ + /* Update the Audio state machine */ + AudioState = AUDIO_STATE_INACTIVE; + + return AUDIO_OK; +} + +uint8_t txbuff[0xC0] = {0}; +/** +*\*\name AudioCmd. +*\*\fun Play, Stop, Pause or Resume current file. +*\*\param pbuf: address from which file should be played. +*\*\param size: size of the current buffer/file. +*\*\param cmd: command to be executed, can be AUDIO_CMD_PLAY , AUDIO_CMD_PAUSE, AUDIO_CMD_RESUME or AUDIO_CMD_STOP. +*\*\return AUDIO_OK if all operations succeed, AUDIO_FAIL else. +**/ +static uint8_t AudioCmd(uint8_t* pbuf, uint32_t size, uint8_t cmd) +{ + /* Check the current state */ + if ((AudioState == AUDIO_STATE_INACTIVE) || (AudioState == AUDIO_STATE_ERROR)) + { + AudioState = AUDIO_STATE_ERROR; + return AUDIO_FAIL; + } + + switch (cmd) + { + /* Process the PLAY command ----------------------------*/ + case AUDIO_CMD_PLAY: + /* If current state is Active or Stopped */ + if ((AudioState == AUDIO_STATE_ACTIVE) || (AudioState == AUDIO_STATE_STOPPED) || (AudioState == AUDIO_STATE_PLAYING)) + { + I2S_TX_DMA_Add_SIZE_Set(pbuf, (size/2)); + + AudioState = AUDIO_STATE_PLAYING; + return AUDIO_OK; + } + /* If current state is Paused */ + else if (AudioState == AUDIO_STATE_PAUSED) + { + I2S_Play_Start(); + AudioState = AUDIO_STATE_PLAYING; + return AUDIO_OK; + } + else /* Not allowed command */ + { + return AUDIO_FAIL; + } + + /* Process the STOP command ----------------------------*/ + case AUDIO_CMD_STOP: + if (AudioState != AUDIO_STATE_PLAYING) + { + /* Unsupported command */ + return AUDIO_FAIL; + } + else + { + I2S_Play_Stop(); + AudioState = AUDIO_STATE_STOPPED; + return AUDIO_OK; + } + + /* Process the PAUSE command */ + case AUDIO_CMD_PAUSE: + if (AudioState != AUDIO_STATE_PLAYING) + { + /* Unsupported command */ + return AUDIO_FAIL; + } + else + { + I2S_Play_Stop(); + AudioState = AUDIO_STATE_PAUSED; + return AUDIO_OK; + } + + /* Unsupported command ---------------------------------*/ + default: + return AUDIO_FAIL; + } +} + +/** +*\*\name VolumeCtrl. +*\*\fun Set the volume level in % +*\*\param vol: volume level to be set in % (from 0% to 100%) +*\*\return AUDIO_OK if all operations succeed, AUDIO_FAIL else. +**/ +static uint8_t VolumeCtrl(uint8_t vol) +{ + /* Call low layer volume setting function */ + WM8978_SetOUT1Volume(vol); + + return AUDIO_OK; +} + +/** +*\*\name MuteCtrl. +*\*\fun Mute or Unmute the audio current output +*\*\param cmd: can be 0 to unmute, or 1 to mute. +*\*\return AUDIO_OK if all operations succeed, AUDIO_FAIL else. +**/ +static uint8_t MuteCtrl(uint8_t cmd) +{ + /* Call low layer mute setting function */ + WM8978_OutMute(cmd); + return AUDIO_OK; +} + +/** +*\*\name PeriodicTC. +*\*\fun PeriodicTC. +*\*\param none +*\*\return AUDIO_OK if all operations succeed, AUDIO_FAIL else. +**/ +static uint8_t PeriodicTC(uint8_t cmd) +{ + return AUDIO_OK; +} + +/** +*\*\name GetState. +*\*\fun Return the current state of the audio machine +*\*\param none +*\*\return Current State. +**/ +static uint8_t GetState(void) +{ + return AudioState; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/inc/usbd_cdc_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/inc/usbd_cdc_core.h new file mode 100644 index 0000000000..62288096dc --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/inc/usbd_cdc_core.h @@ -0,0 +1,97 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_cdc_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USB_CDC_CORE_H_ +#define __USB_CDC_CORE_H_ + +#include "usbd_ioreq.h" + +#define USB_CDC_CONFIG_DESC_SIZ (67) + +#define DEVICE_CLASS_CDC 0x02 +#define DEVICE_SUBCLASS_CDC 0x00 + + +#define STANDARD_ENDPOINT_DESC_SIZE 0x09 + +#define CDC_DATA_IN_PACKET_SIZE CDC_DATA_MAX_PACKET_SIZE + +#define CDC_DATA_OUT_PACKET_SIZE CDC_DATA_MAX_PACKET_SIZE + +/* CDC Requests */ +#define SEND_ENCAPSULATED_COMMAND 0x00 +#define GET_ENCAPSULATED_RESPONSE 0x01 +#define SET_COMM_FEATURE 0x02 +#define GET_COMM_FEATURE 0x03 +#define CLEAR_COMM_FEATURE 0x04 +#define SET_LINE_CODING 0x20 +#define GET_LINE_CODING 0x21 +#define SET_CONTROL_LINE_STATE 0x22 +#define SEND_BREAK 0x23 +#define NO_CMD 0xFF + +typedef struct _CDC_IF_PROP +{ + uint16_t (*pIf_Init) (void); + uint16_t (*pIf_DeInit) (void); + uint16_t (*pIf_Ctrl) (uint32_t Cmd, uint8_t* Buf, uint32_t Len); + uint16_t (*pIf_DataTx) (void); + uint16_t (*pIf_DataRx) (uint8_t* Buf, uint32_t Len); +}CDC_IF_Prop_TypeDef; + + +extern USBD_Class_cb_TypeDef USBD_CDC_cb; + + +#endif /* __USB_CDC_CORE_H_ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/inc/usbd_cdc_core_loopback.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/inc/usbd_cdc_core_loopback.h new file mode 100644 index 0000000000..264a81fc09 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/inc/usbd_cdc_core_loopback.h @@ -0,0 +1,80 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_cdc_core_loopback.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USB_CDC_CORE_H_ +#define __USB_CDC_CORE_H_ + +#include "usbd_ioreq.h" + +#define USB_CDC_CONFIG_DESC_SIZ (67) +#define USB_CDC_DESC_SIZ (67-9) + +#define DEVICE_CLASS_CDC 0x02 +#define DEVICE_SUBCLASS_CDC 0x00 + +#define CDC_DATA_IN_PACKET_SIZE CDC_DATA_MAX_PACKET_SIZE + +#define CDC_DATA_OUT_PACKET_SIZE CDC_DATA_MAX_PACKET_SIZE + +typedef struct _CDC_IF_PROP +{ + uint16_t (*pIf_DataTx) (void); + uint16_t (*pIf_DataRx) (uint32_t Len); +}CDC_IF_Prop_TypeDef; + + +extern USBD_Class_cb_TypeDef USBD_CDC_cb; + + +#endif /* __USB_CDC_CORE_H_ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/src/usbd_cdc_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/src/usbd_cdc_core.c new file mode 100644 index 0000000000..699869e912 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/src/usbd_cdc_core.c @@ -0,0 +1,695 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_cdc_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbd_cdc_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" +#include "usbhs_bsp.h" + +#define USB_CDC_IDLE 0 +#define USB_CDC_BUSY 1 +#define USB_CDC_ZLP 2 + +/* CDC Device library callbacks */ +uint8_t USBD_CDC_Init (void *pdev, uint8_t cfgidx); +uint8_t USBD_CDC_DeInit (void *pdev, uint8_t cfgidx); +uint8_t USBD_CDC_Setup (void *pdev, USB_SETUP_REQ *req); +uint8_t USBD_CDC_EP0_RxReady (void *pdev); +uint8_t USBD_CDC_DataIn (void *pdev, uint8_t epnum); +uint8_t USBD_CDC_DataOut (void *pdev, uint8_t epnum); +uint8_t USBD_CDC_SOF (void *pdev); + +/* CDC specific management functions */ +static void Handle_USBAsynchXfer (void *pdev); +static uint8_t *USBD_CDC_GetCfgDesc (uint8_t speed, uint16_t *length); +static uint8_t *USBD_CDC_GetOtherCfgDesc (uint8_t speed, uint16_t *length); + + +extern CDC_IF_Prop_TypeDef APP_FOPS; +extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_CDC_CfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_CDC_OtherCfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN static __IO uint32_t USBD_CDC_AltSet __ALIGN_END = 0; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USB_Rx_Buffer [CDC_DATA_MAX_PACKET_SIZE] __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t APP_Rx_Buffer [APP_RX_DATA_SIZE] __ALIGN_END ; + + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t CmdBuff[CDC_CMD_PACKET_SIZE] __ALIGN_END ; + +uint32_t APP_Rx_ptr_in = 0; +uint32_t APP_Rx_ptr_out = 0; +uint32_t APP_Rx_length = 0; + +uint8_t USB_Tx_State = USB_CDC_IDLE; + +static uint32_t cdcCmd = 0xFF; +static uint32_t cdcLen = 0; + +/* CDC interface class callbacks structure */ +USBD_Class_cb_TypeDef USBD_CDC_cb = +{ + USBD_CDC_Init, + USBD_CDC_DeInit, + USBD_CDC_Setup, + NULL, /* EP0_TxSent, */ + USBD_CDC_EP0_RxReady, + USBD_CDC_DataIn, + USBD_CDC_DataOut, + USBD_CDC_SOF, + NULL, + NULL, + USBD_CDC_GetCfgDesc, + USBD_CDC_GetOtherCfgDesc, /* use same cobfig as per FS */ +}; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +/* USB CDC device Configuration Descriptor */ +__ALIGN_BEGIN uint8_t USBD_CDC_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + /* Configuration Descriptor */ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength */ + 0x00, + 0x02, /* bNumInterfaces: 2 interfaces */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor */ + 0xC0, /* bmAttributes: self powered */ + 0x32, /* MaxPower 100 mA */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoint used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize */ + HIBYTE(CDC_CMD_PACKET_SIZE), + 0x10, /* bInterval */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00, /* bInterval */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00 /* bInterval */ +}; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_CDC_OtherCfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, + USB_CDC_CONFIG_DESC_SIZ, + 0x00, + 0x02, /* bNumInterfaces: 2 interfaces */ + 0x01, /* bConfigurationValue: */ + 0x04, /* iConfiguration: */ + 0xC0, /* bmAttributes: */ + 0x32, /* MaxPower 100 mA */ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface: */ + + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface: 1 */ + + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), + 0xFF, /* bInterval: */ + + /*---------------------------------------------------------------------------*/ + + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + 0x40, /* wMaxPacketSize: */ + 0x00, + 0x00, /* bInterval: ignore for Bulk transfer */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + 0x40, /* wMaxPacketSize: */ + 0x00, + 0x00 /* bInterval */ +}; + +/** +*\*\name USBD_CDC_Init. +*\*\fun Initialize the CDC interface. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CDC_Init (void *pdev, uint8_t cfgidx) +{ + /* Open EP IN */ + USBDEV_EP_Open(pdev, CDC_IN_EP, CDC_DATA_IN_PACKET_SIZE, USB_EP_BULK); + + /* Open EP OUT */ + USBDEV_EP_Open(pdev, CDC_OUT_EP, CDC_DATA_OUT_PACKET_SIZE, USB_EP_BULK); + + /* Open Command IN EP */ + USBDEV_EP_Open(pdev, CDC_CMD_EP, CDC_CMD_PACKET_SIZE, USB_EP_INT); + + /* Initialize the Interface physical components */ + APP_FOPS.pIf_Init(); + + /* Prepare Out endpoint to receive next packet */ + USBDEV_EP_PrepareRx(pdev, CDC_OUT_EP, (uint8_t*)(USB_Rx_Buffer), CDC_DATA_OUT_PACKET_SIZE); + + return USBD_OK; +} + +/** +*\*\name USBD_CDC_DeInit. +*\*\fun DeInitialize the CDC layer. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CDC_DeInit (void *pdev, uint8_t cfgidx) +{ + /* Open EP IN */ + USBDEV_EP_Close(pdev, CDC_IN_EP); + + /* Open EP OUT */ + USBDEV_EP_Close(pdev, CDC_OUT_EP); + + /* Open Command IN EP */ + USBDEV_EP_Close(pdev, CDC_CMD_EP); + + /* Restore default state of the Interface physical components */ + APP_FOPS.pIf_DeInit(); + + return USBD_OK; +} + +/** +*\*\name USBD_CDC_Setup +*\*\fun Handle the CDC specific requests. +*\*\param pdev: device instance. +*\*\param req: usb requests +*\*\return USBD_OK. +**/ +uint8_t USBD_CDC_Setup (void *pdev, USB_SETUP_REQ *req) +{ + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + /* CDC Class Requests -------------------------------*/ + case USB_REQ_TYPE_CLASS : + /* Check if the request is a data setup packet */ + if (req->wLength) + { + /* Check if the request is Device-to-Host */ + if (req->bmRequest & 0x80) + { + /* Get the data to be sent to Host from interface layer */ + APP_FOPS.pIf_Ctrl(req->bRequest, CmdBuff, req->wLength); + + /* Send the data to the host */ + USBD_CtrlSendData(pdev, CmdBuff, req->wLength); + } + else /* Host-to-Device request */ + { + /* Set the value of the current command to be processed */ + cdcCmd = req->bRequest; + cdcLen = req->wLength; + + /* Prepare the reception of the buffer over EP0 + Next step: the received data will be managed in usbd_cdc_EP0_TxSent() + function. */ + USBD_CtrlPrepareRx (pdev, CmdBuff, req->wLength); + } + } + else /* No Data request */ + { + /* Transfer the command to the interface layer */ + APP_FOPS.pIf_Ctrl(req->bRequest, NULL, 0); + } + break; + + /* Standard Requests -------------------------------*/ + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + USBD_CtrlError (pdev, req); + return USBD_FAIL; + + case USB_REQ_GET_INTERFACE : + USBD_CtrlSendData (pdev, (uint8_t *)&USBD_CDC_AltSet, 1); + break; + + case USB_REQ_SET_INTERFACE : + if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM) + { + USBD_CDC_AltSet = (uint8_t)(req->wValue); + } + else + { + /* Call the error management function (command will be nacked */ + USBD_CtrlError (pdev, req); + } + break; + + default: + break; + } + break; + + default: + USBD_CtrlError (pdev, req); + return USBD_FAIL; + } + return USBD_OK; +} + +/** +*\*\name USBD_CDC_EP0_RxReady +*\*\fun Data received on control endpoint. +*\*\param pdev: device instance. +*\*\return USBD_OK. +**/ +uint8_t USBD_CDC_EP0_RxReady (void *pdev) +{ + if (cdcCmd != NO_CMD) + { + /* Process the data */ + APP_FOPS.pIf_Ctrl(cdcCmd, CmdBuff, cdcLen); + /* Reset the command variable to default value */ + cdcCmd = NO_CMD; + } + + return USBD_OK; +} + + +/** +*\*\name USBD_CDC_DataIn. +*\*\fun handle data IN Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index. +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CDC_DataIn (void *pdev, uint8_t epnum) +{ + uint16_t USB_Tx_ptr; + uint16_t USB_Tx_length; + + if (USB_Tx_State == USB_CDC_BUSY) + { + if (APP_Rx_length == 0) + { + USB_Tx_State = USB_CDC_IDLE; + } + else + { + if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE) + { + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; + + APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE; + APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE; + } + else + { + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = APP_Rx_length; + + APP_Rx_ptr_out += APP_Rx_length; + APP_Rx_length = 0; + if(USB_Tx_length == CDC_DATA_IN_PACKET_SIZE) + { + USB_Tx_State = USB_CDC_ZLP; + } + } + + /* Prepare the available data buffer to be sent on IN endpoint */ + USBDEV_EP_Tx (pdev, CDC_IN_EP, (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], USB_Tx_length); + return USBD_OK; + } + } + + /* Avoid any asynchronous transfer during ZLP */ + if (USB_Tx_State == USB_CDC_ZLP) + { + /*Send ZLP to indicate the end of the current transfer */ + USBDEV_EP_Tx (pdev, CDC_IN_EP, NULL, 0); + + USB_Tx_State = USB_CDC_IDLE; + } + return USBD_OK; +} + +/** +*\*\name USBD_CDC_DataOut. +*\*\fun handle data OUT Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index. +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CDC_DataOut (void *pdev, uint8_t epnum) +{ + uint16_t USB_Rx_Cnt; + + /* Get the received data buffer and update the counter */ + USB_Rx_Cnt = ((USB_CORE_MODULE*)pdev)->dev.out_ep[epnum].xfer_count; + + /* USB data will be immediately processed, this allow next USB traffic being + NAKed till the end of the application Xfer */ + APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt); + + /* Prepare Out endpoint to receive next packet */ + USBDEV_EP_PrepareRx(pdev, CDC_OUT_EP, (uint8_t*)(USB_Rx_Buffer), CDC_DATA_OUT_PACKET_SIZE); + + return USBD_OK; +} + +/** +*\*\name USBD_CDC_SOF. +*\*\fun Start Of Frame event management. +*\*\param pdev: device instance. +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CDC_SOF (void *pdev) +{ + static uint32_t FrameCount = 0; + + if (FrameCount++ == CDC_IN_FRAME_INTERVAL) + { + /* Reset the frame counter */ + FrameCount = 0; + + /* Check the data to be sent through IN pipe */ + Handle_USBAsynchXfer(pdev); + } + + return USBD_OK; +} + +/** +*\*\name Handle_USBAsynchXfer. +*\*\fun process the data received from usart and send through USB to host. +*\*\param pdev: device instance. +*\*\return USBD_OK. +*\*\ +**/ +static void Handle_USBAsynchXfer (void *pdev) +{ + uint16_t USB_Tx_ptr; + uint16_t USB_Tx_length; + + if(USB_Tx_State == USB_CDC_IDLE) + { + if (APP_Rx_ptr_out == APP_RX_DATA_SIZE) + { + APP_Rx_ptr_out = 0; + } + + if(APP_Rx_ptr_out == APP_Rx_ptr_in) + { + USB_Tx_State = USB_CDC_IDLE; + return; + } + + if(APP_Rx_ptr_out > APP_Rx_ptr_in) /* rollback */ + { + APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out; + } + else + { + APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out; + } + + if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE) + { + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; + + APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE; + APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE; + USB_Tx_State = USB_CDC_BUSY; + } + else + { + USB_Tx_ptr = APP_Rx_ptr_out; + USB_Tx_length = APP_Rx_length; + + APP_Rx_ptr_out += APP_Rx_length; + APP_Rx_length = 0; + if(USB_Tx_length == CDC_DATA_IN_PACKET_SIZE) + { + USB_Tx_State = USB_CDC_ZLP; + } + else + { + USB_Tx_State = USB_CDC_BUSY; + } + } + USBDEV_EP_Tx (pdev, CDC_IN_EP, (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], USB_Tx_length); + } +} + +/** +*\*\name USBD_CDC_GetCfgDesc. +*\*\fun Return configuration descriptor. +*\*\param speed : current device speed +*\*\param length : pointer data length +*\*\return pointer to descriptor buffer. +*\*\ +**/ +static uint8_t *USBD_CDC_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_CDC_CfgDesc); + return USBD_CDC_CfgDesc; +} + +/** +*\*\name USBD_CDC_GetOtherCfgDesc. +*\*\fun Return configuration descriptor. +*\*\param speed : current device speed +*\*\param length : pointer data length +*\*\return pointer to descriptor buffer. +*\*\ +**/ +static uint8_t *USBD_CDC_GetOtherCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_CDC_OtherCfgDesc); + return USBD_CDC_OtherCfgDesc; +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/src/usbd_cdc_core_loopback.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/src/usbd_cdc_core_loopback.c new file mode 100644 index 0000000000..1c34ca15d6 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/cdc/src/usbd_cdc_core_loopback.c @@ -0,0 +1,511 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_cdc_core_loopback.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbd_cdc_core_loopback.h" +#include "usbd_desc.h" +#include "usbd_req.h" + + +#define USB_CDC_IDLE 0 +#define USB_CDC_BUSY 1 +#define USB_CDC_ZLP 2 + +/********************************************* + CDC Device library callbacks + *********************************************/ +uint8_t USBD_CDC_Init (void *pdev, uint8_t cfgidx); +uint8_t USBD_CDC_DeInit (void *pdev, uint8_t cfgidx); +uint8_t USBD_CDC_Setup (void *pdev, USB_SETUP_REQ *req); +uint8_t USBD_CDC_EP0_RxReady (void *pdev); +uint8_t USBD_CDC_DataIn (void *pdev, uint8_t epnum); +uint8_t USBD_CDC_DataOut (void *pdev, uint8_t epnum); + +/********************************************* + CDC specific management functions + *********************************************/ +static uint8_t *USBD_CDC_GetCfgDesc (uint8_t speed, uint16_t *length); +static uint8_t *USBD_CDC_GetOtherCfgDesc (uint8_t speed, uint16_t *length); + +extern CDC_IF_Prop_TypeDef APP_FOPS; +extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; + +extern uint8_t Rxbuffer[CDC_DATA_MAX_PACKET_SIZE]; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_CDC_CfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_CDC_OtherCfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN static __IO uint32_t USBD_CDC_AltSet __ALIGN_END = 0; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t CmdBuff[CDC_CMD_PACKET_SIZE] __ALIGN_END ; + +/* CDC interface class callbacks structure */ +USBD_Class_cb_TypeDef USBD_CDC_cb = +{ + USBD_CDC_Init, + USBD_CDC_DeInit, + USBD_CDC_Setup, + NULL, /* EP0_TxSent, */ + USBD_CDC_EP0_RxReady, + USBD_CDC_DataIn, + USBD_CDC_DataOut, + NULL, + NULL, + NULL, + USBD_CDC_GetCfgDesc, + USBD_CDC_GetOtherCfgDesc, /* use same cobfig as per FS */ +}; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +/* USB CDC device Configuration Descriptor */ +__ALIGN_BEGIN uint8_t USBD_CDC_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + /* Configuration Descriptor */ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength */ + 0x00, + 0x02, /* bNumInterfaces: 2 interfaces */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor */ + 0xC0, /* bmAttributes: self powered */ + 0x32, /* MaxPower 100 mA */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoint used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize */ + HIBYTE(CDC_CMD_PACKET_SIZE), + 0x10, /* bInterval */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00, /* bInterval */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00 /* bInterval */ +}; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_CDC_OtherCfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, + USB_CDC_CONFIG_DESC_SIZ, + 0x00, + 0x02, /* bNumInterfaces: 2 interfaces */ + 0x01, /* bConfigurationValue: */ + 0x04, /* iConfiguration: */ + 0xC0, /* bmAttributes: */ + 0x32, /* MaxPower 100 mA */ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface: */ + + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface: 1 */ + + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), + 0xFF, /* bInterval: */ + + /*---------------------------------------------------------------------------*/ + + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + 0x40, /* wMaxPacketSize: */ + 0x00, + 0x00, /* bInterval: ignore for Bulk transfer */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + 0x40, /* wMaxPacketSize: */ + 0x00, + 0x00 /* bInterval */ +}; + +/** +*\*\name USBD_CDC_Init. +*\*\fun Initialize the CDC interface. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return USBD_OK. +**/ +uint8_t USBD_CDC_Init (void *pdev, uint8_t cfgidx) +{ + /* Open EP IN */ + USBDEV_EP_Open(pdev, CDC_IN_EP, CDC_DATA_IN_PACKET_SIZE, USB_EP_BULK); + + /* Open EP OUT */ + USBDEV_EP_Open(pdev, CDC_OUT_EP, CDC_DATA_OUT_PACKET_SIZE, USB_EP_BULK); + + /* Open Command IN EP */ + USBDEV_EP_Open(pdev, CDC_CMD_EP, CDC_CMD_PACKET_SIZE, USB_EP_INT); + + /* Prepare Out endpoint to receive next packet */ + USBDEV_EP_PrepareRx(pdev, CDC_OUT_EP, (uint8_t*)(Rxbuffer), CDC_DATA_OUT_PACKET_SIZE); + + return USBD_OK; +} + +/** +*\*\name USBD_CDC_DeInit. +*\*\fun DeInitialize the CDC layer. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return USBD_OK. +**/ +uint8_t USBD_CDC_DeInit (void *pdev, uint8_t cfgidx) +{ + /* Open EP IN */ + USBDEV_EP_Close(pdev, CDC_IN_EP); + + /* Open EP OUT */ + USBDEV_EP_Close(pdev, CDC_OUT_EP); + + /* Open Command IN EP */ + USBDEV_EP_Close(pdev, CDC_CMD_EP); + + return USBD_OK; +} + +/** +*\*\name USBD_CDC_Setup +*\*\fun Handle the CDC specific requests. +*\*\param pdev: device instance. +*\*\param req: usb requests +*\*\return USBD_OK. +**/ +uint8_t USBD_CDC_Setup (void *pdev, USB_SETUP_REQ *req) +{ + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + /* CDC Class Requests -------------------------------*/ + case USB_REQ_TYPE_CLASS : + /* Check if the request is a data setup packet */ + if (req->wLength) + { + /* Check if the request is Device-to-Host */ + if (req->bmRequest & 0x80) + { + /* STALL request */ + USBD_CtrlError (pdev, req); + } + else /* Host-to-Device request */ + { + /* Prepare the reception of the buffer over EP0 + Next step: the received data will be managed in USBD_CDC_EP0_TxSent() + function. */ + USBD_CtrlPrepareRx (pdev, CmdBuff, req->wLength); + } + } + else /* No Data request */ + { + /* do nothing */ + } + + return USBD_OK; + + default: + USBD_CtrlError (pdev, req); + return USBD_FAIL; + + /* Standard Requests -------------------------------*/ + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + USBD_CtrlError (pdev, req); + return USBD_FAIL; + + case USB_REQ_GET_INTERFACE : + USBD_CtrlSendData (pdev, (uint8_t *)&USBD_CDC_AltSet, 1); + break; + + case USB_REQ_SET_INTERFACE : + if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM) + { + USBD_CDC_AltSet = (uint8_t)(req->wValue); + } + else + { + /* Call the error management function (command will be nacked */ + USBD_CtrlError (pdev, req); + } + break; + } + } + return USBD_OK; +} + +/** +*\*\name USBD_CDC_EP0_RxReady +*\*\fun Data received on control endpoint. +*\*\param pdev: device instance. +*\*\return USBD_OK. +**/ +uint8_t USBD_CDC_EP0_RxReady (void *pdev) +{ + return USBD_OK; +} + + +/** +*\*\name USBD_CDC_DataIn. +*\*\fun handle data IN Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index. +*\*\return USBD_OK. +**/ +uint8_t USBD_CDC_DataIn (void *pdev, uint8_t epnum) +{ + /* inform application layer that data was sent */ + APP_FOPS.pIf_DataTx(); + return USBD_OK; +} + +/** +*\*\name USBD_CDC_DataOut. +*\*\fun handle data OUT Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index. +*\*\return USBD_OK. +**/ +uint8_t USBD_CDC_DataOut (void *pdev, uint8_t epnum) +{ + uint16_t USB_Rx_Cnt; + + /* Get the received data buffer and update the counter */ + USB_Rx_Cnt = ((USB_CORE_MODULE*)pdev)->dev.out_ep[epnum].xfer_count; + + /* pass received data count to application layer */ + APP_FOPS.pIf_DataRx(USB_Rx_Cnt); + + return USBD_OK; +} + +/** +*\*\name USBD_CDC_GetCfgDesc. +*\*\fun Return configuration descriptor. +*\*\param speed : current device speed +*\*\param length : pointer data length +*\*\return pointer to descriptor buffer. +**/ +static uint8_t *USBD_CDC_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_CDC_CfgDesc); + return USBD_CDC_CfgDesc; +} + +/** +*\*\name USBD_CDC_GetOtherCfgDesc. +*\*\fun Return configuration descriptor. +*\*\param speed : current device speed +*\*\param length : pointer data length +*\*\return pointer to descriptor buffer. +**/ +static uint8_t *USBD_CDC_GetOtherCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_CDC_OtherCfgDesc); + return USBD_CDC_OtherCfgDesc; +} + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/customhid/inc/usbd_customhid_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/customhid/inc/usbd_customhid_core.h new file mode 100644 index 0000000000..645ea268b0 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/customhid/inc/usbd_customhid_core.h @@ -0,0 +1,97 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_customhid_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USB_CUSTOMHID_CORE_H_ +#define __USB_CUSTOMHID_CORE_H_ + +#include "usbd_ioreq.h" + +#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 116+4+3+3 + +#define USB_CUSTOM_HID_CONFIG_DESC_SIZ 41+2 +#define USB_CUSTOM_HID_DESC_SIZ 9 + +#define CUSTOM_HID_DESCRIPTOR_TYPE 0x21 +#define CUSTOM_HID_REPORT_DESC 0x22 + + +#define CUSTOM_HID_REQ_SET_PROTOCOL 0x0B +#define CUSTOM_HID_REQ_GET_PROTOCOL 0x03 + +#define CUSTOM_HID_REQ_SET_IDLE 0x0A +#define CUSTOM_HID_REQ_GET_IDLE 0x02 + +#define CUSTOM_HID_REQ_SET_REPORT 0x09 +#define CUSTOM_HID_REQ_GET_REPORT 0x01 + +#define LED1_REPORT_ID 0x01 +#define LED1_REPORT_COUNT 0x01 + +#define LED2_REPORT_ID 0x02 +#define LED2_REPORT_COUNT 0x01 + +#define LED3_REPORT_ID 0x03 +#define LED3_REPORT_COUNT 0x01 + +#define LED4_REPORT_ID 0x04 +#define LED4_REPORT_COUNT 0x01 + +#define KEY_REPORT_ID 0x05 +#define TAMPER_REPORT_ID 0x06 +#define ADC_REPORT_ID 0x07 + +extern USBD_Class_cb_TypeDef USBD_CUSTOMHID_cb; + +uint8_t USBD_CUSTOM_HID_SendReport (USB_CORE_MODULE *pdev, uint8_t *report, uint16_t len); + +#endif /* __USB_CUSTOMHID_CORE_H_ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/customhid/src/usbd_customhid_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/customhid/src/usbd_customhid_core.c new file mode 100644 index 0000000000..58124c4c9d --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/customhid/src/usbd_customhid_core.c @@ -0,0 +1,584 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_customhid_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbd_customhid_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" +#include "n32h76x_78x_gpio.h" +#include "usbhs_bsp.h" + +uint8_t USBD_CUSTOM_HID_Init (void *pdev, uint8_t cfgidx); +uint8_t USBD_CUSTOM_HID_DeInit (void *pdev, uint8_t cfgidx); +uint8_t USBD_CUSTOM_HID_Setup (void *pdev, USB_SETUP_REQ *req); +uint8_t *USBD_CUSTOM_HID_GetCfgDesc (uint8_t speed, uint16_t *length); +uint8_t USBD_CUSTOM_HID_DataIn (void *pdev, uint8_t epnum); +uint8_t USBD_CUSTOM_HID_DataOut (void *pdev, uint8_t epnum); +uint8_t USBD_CUSTOM_HID_EP0_RxReady (void *pdev); + + +USBD_Class_cb_TypeDef USBD_CUSTOMHID_cb = +{ + USBD_CUSTOM_HID_Init, + USBD_CUSTOM_HID_DeInit, + USBD_CUSTOM_HID_Setup, + NULL, /*EP0_TxSent*/ + USBD_CUSTOM_HID_EP0_RxReady, /*EP0_RxReady*/ /* STATUS STAGE IN */ + USBD_CUSTOM_HID_DataIn, /*DataIn*/ + USBD_CUSTOM_HID_DataOut, + NULL, /*SOF */ + NULL, /*IsoINIncomplete*/ + NULL, /*IsoOUTIncomplete)*/ + USBD_CUSTOM_HID_GetCfgDesc, + USBD_CUSTOM_HID_GetCfgDesc, +}; + +uint8_t Report_buf[4]; +uint8_t USBD_HID_Report_ID=0; +__IO uint32_t IsReportAvailable = 0; +extern uint8_t PrevXferDone; + +#ifdef USB_INTERNAL_DMA_ENABLED +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma data_alignment=4 +#endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t Report_buf[4] __ALIGN_END; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN static uint32_t USBD_HID_AltSet __ALIGN_END = 0; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN static uint32_t USBD_HID_Protocol __ALIGN_END = 0; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN static uint32_t USBD_HID_IdleState __ALIGN_END = 0; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +/* USB HID device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ + USB_CUSTOM_HID_CONFIG_DESC_SIZ, + /* wTotalLength: Bytes returned */ + 0x00, + 0x01, /*bNumInterfaces: 1 interface*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x00, /*iConfiguration: Index of string descriptor describing + the configuration*/ + 0xC0, /*bmAttributes: bus powered and Support Remote Wake-up */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + + /************** Descriptor of Custom HID interface ****************/ + /* 09 */ + 0x09, /*bLength: Interface Descriptor size*/ + USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ + 0x00, /*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x02, /*bNumEndpoints*/ + 0x03, /*bInterfaceClass: HID*/ + 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ + 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ + 0x00, /*iInterface: Index of string descriptor*/ + /******************** Descriptor of Custom HID ********************/ + /* 18 */ + 0x09, /*bLength: HID Descriptor size*/ + CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x10, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ + 0x00, + /******************** Descriptor of Custom HID endpoints ***********/ + /* 27 */ + 0x08, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ + + HID_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */ + 0x03, /* bmAttributes: Interrupt endpoint */ + LOBYTE(HID_IN_PACKET), /* wMaxPacketSize: */ + HIBYTE(HID_IN_PACKET), + 0x00, + 0x01, /* bInterval: Polling Interval (1 ms) */ + /* 34 */ + + 0x08, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ + /* Endpoint descriptor type */ + HID_OUT_EP, /* bEndpointAddress: */ + /* Endpoint Address (OUT) */ + 0x03, /* bmAttributes: Interrupt endpoint */ + LOBYTE(HID_OUT_PACKET), /* wMaxPacketSize: */ + HIBYTE(HID_OUT_PACKET), + 0x00, + 0x10, /* bInterval: Polling Interval (16 ms) */ + /* 41 */ +} ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif + +__ALIGN_BEGIN static uint8_t CustomHID_ReportDesc[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = +{ + 0x06, 0xFF, 0x00, /* USAGE_PAGE (Vendor Page: 0xFF00) */ + 0x09, 0x01, /* USAGE (Demo Kit) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + /* 6 */ + + /* Led 1 */ + 0x85, 0x01, /* REPORT_ID (1) */ + 0x09, 0x01, /* USAGE (LED 1) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0x00, 0x0C, /* REPORT_COUNT (1) */ + 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ + + 0x85, 0x01, /* REPORT_ID (1) */ + 0x09, 0x01, /* USAGE (LED 1) */ + 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ + /* 26 */ + + /* Led 2 */ + 0x85, 0x02, /* REPORT_ID 2 a */ + 0x09, 0x02, /* USAGE (LED 2) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0x00, 0x0C, /* REPORT_COUNT (1) */ + 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ + + 0x85, 0x02, /* REPORT_ID (2) */ + 0x09, 0x02, /* USAGE (LED 2) */ + 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ + /* 46 */ + + /* Led 3 */ + 0x85, 0x03, /* REPORT_ID (3) */ + 0x09, 0x03, /* USAGE (LED 3) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0x00, 0x0C, /* REPORT_COUNT (1) */ + 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ + + 0x85, 0x03, /* REPORT_ID (3) */ + 0x09, 0x03, /* USAGE (LED 3) */ + 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ + /* 66 */ + + /* Led 4 */ + 0x85, 0x04, /* REPORT_ID (4) */ + 0x09, 0x04, /* USAGE (LED 4) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x96, 0x00, 0x0C, /* REPORT_COUNT (1) */ + 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ + + 0x85, 0x04, /* REPORT_ID (4) */ + 0x09, 0x04, /* USAGE (LED 4) */ + 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ + /* 86 */ + + /* key Push Button */ + 0x85, 0x05, /* REPORT_ID (5) */ + 0x09, 0x05, /* USAGE (Push Button) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x75, 0x02, /* REPORT_SIZE (1) */ + 0x96, 0x00, 0x0C, /* REPORT_COUNT (1) */ + 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ + + 0x09, 0x05, /* USAGE (Push Button) */ + 0x75, 0x02, /* REPORT_SIZE (1) */ + 0x96, 0x00, 0x0C, /* REPORT_COUNT (1) */ + 0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ + + 0x75, 0x07, /* REPORT_SIZE (7) */ + 0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol) */ + 0x85, 0x05, /* REPORT_ID (2) */ + + 0x75, 0x07, /* REPORT_SIZE (7) */ + 0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol) */ + /* 114 */ + + 0xc0 /* END_COLLECTION */ +}; + +/** +*\*\name USBD_CUSTOM_HID_Init. +*\*\fun Initialize the HID interface. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CUSTOM_HID_Init (void *pdev, uint8_t cfgidx) +{ + /* Open EP IN */ + USBDEV_EP_Open(pdev, HID_IN_EP, HID_IN_PACKET, USB_EP_INT); + /* Open EP OUT */ + USBDEV_EP_Open(pdev, HID_OUT_EP, HID_OUT_PACKET, USB_EP_INT); + /*Receive Data*/ + USBDEV_EP_PrepareRx(pdev, HID_OUT_EP, Report_buf, 2); + + return USBD_OK; +} + +/** +*\*\name USBD_CUSTOM_HID_DeInit. +*\*\fun DeInitialize the HID layer. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CUSTOM_HID_DeInit (void *pdev, uint8_t cfgidx) +{ + /* Close HID EPs */ + USBDEV_EP_Close (pdev , HID_IN_EP); + USBDEV_EP_Close (pdev , HID_OUT_EP); + return USBD_OK; +} + +/** +*\*\name USBD_CUSTOM_HID_Setup. +*\*\fun Handle the HID specific requests. +*\*\param pdev: device instance. +*\*\param req: usb requests +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CUSTOM_HID_Setup (void *pdev, USB_SETUP_REQ *req) +{ + uint8_t USBD_HID_Report_LENGTH=0; + uint16_t len = 0; + uint8_t *pbuf = NULL; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_CLASS : + switch (req->bRequest) + { + case CUSTOM_HID_REQ_SET_PROTOCOL: + USBD_HID_Protocol = (uint8_t)(req->wValue); + break; + + case CUSTOM_HID_REQ_GET_PROTOCOL: + USBD_CtrlSendData(pdev, (uint8_t *)&USBD_HID_Protocol, 1); + break; + + case CUSTOM_HID_REQ_SET_IDLE: + USBD_HID_IdleState = (uint8_t)(req->wValue >> 8); + break; + + case CUSTOM_HID_REQ_GET_IDLE: + USBD_CtrlSendData(pdev, (uint8_t *)&USBD_HID_IdleState, 1); + break; + + case CUSTOM_HID_REQ_SET_REPORT: + IsReportAvailable = 1; + USBD_HID_Report_ID = (uint8_t)(req->wValue); + USBD_HID_Report_LENGTH = (uint8_t)(req->wLength); + USBD_CtrlPrepareRx (pdev, Report_buf, USBD_HID_Report_LENGTH); + break; + + default: + USBD_CtrlError (pdev, req); + return USBD_FAIL; + } + break; + + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if( req->wValue >> 8 == CUSTOM_HID_REPORT_DESC) + { + len = MIN(USBD_CUSTOM_HID_REPORT_DESC_SIZE , req->wLength); + pbuf = (uint8_t*)CustomHID_ReportDesc; + } + else if( req->wValue >> 8 == CUSTOM_HID_DESCRIPTOR_TYPE) + { + pbuf = (uint8_t*)USBD_CUSTOM_HID_CfgDesc + 0x12; + len = MIN(USB_CUSTOM_HID_DESC_SIZ , req->wLength); + } + + USBD_CtrlSendData (pdev, pbuf, len); + break; + + case USB_REQ_GET_INTERFACE : + USBD_CtrlSendData (pdev, (uint8_t *)&USBD_HID_AltSet, 1); + break; + + case USB_REQ_SET_INTERFACE : + USBD_HID_AltSet = (uint8_t)(req->wValue); + break; + default: + break; + } + } + return USBD_OK; +} + +/** +*\*\name USBD_CUSTOM_HID_SendReport. +*\*\fun Send HID Report. +*\*\param pdev: device instance. +*\*\param report: pointer to report. +*\*\param len: length of report. +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CUSTOM_HID_SendReport (USB_CORE_MODULE *pdev, uint8_t *report, uint16_t len) +{ + if (pdev->dev.device_status == USB_CONFIGURED) + { + USBDEV_EP_Tx(pdev, HID_IN_EP, report, len); + } + return USBD_OK; +} + +/** +*\*\name USBD_CUSTOM_HID_GetCfgDesc. +*\*\fun return configuration descriptor. +*\*\param speed : current device speed. +*\*\param length : pointer data length. +*\*\return pointer to descriptor buffer. +*\*\ +**/ +uint8_t *USBD_CUSTOM_HID_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_CUSTOM_HID_CfgDesc); + return USBD_CUSTOM_HID_CfgDesc; +} + +/** +*\*\name USBD_CUSTOM_HID_DataIn. +*\*\fun handle data IN Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index. +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CUSTOM_HID_DataIn (void *pdev, uint8_t epnum) +{ + /* Ensure that the FIFO is empty before a new transfer, this condition could + be caused by a new transfer before the end of the previous transfer */ + USBDEV_EP_Flush(pdev, HID_IN_EP); + + if (epnum == (HID_IN_EP & 0x0F)) + { + PrevXferDone = 1; + } + + return USBD_OK; +} + +/** +*\*\name USBD_CUSTOM_HID_DataOut. +*\*\fun handle data OUT Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index. +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CUSTOM_HID_DataOut (void *pdev, uint8_t epnum) +{ + Bit_OperateType Led_State; + if (epnum == HID_OUT_EP) + { + if (Report_buf[1] == 0u) + { + Led_State = Bit_RESET; + } + else + { + Led_State = Bit_SET; + } + switch (Report_buf[0]) + { + case 1: /* Led 1 */ + if (Led_State != Bit_RESET) + { + LED_On(LED1_PORT, LED1_PIN); + } + else + { + LED_Off(LED1_PORT, LED1_PIN); + } + break; + + case 2: /* Led 2 */ + if (Led_State != Bit_RESET) + { + LED_On(LED2_PORT, LED2_PIN); + } + else + { + LED_Off(LED2_PORT, LED2_PIN); + } + break; + case 3: /* Led 3 */ + if (Led_State != Bit_RESET) + { + LED_On(LED3_PORT, LED3_PIN); + } + else + { + LED_Off(LED3_PORT, LED3_PIN); + } + break; + default: + LED_Off(LED1_PORT, LED1_PIN); + LED_Off(LED2_PORT, LED2_PIN); + LED_Off(LED3_PORT, LED3_PIN); + break; + } + } + + USBDEV_EP_PrepareRx(pdev, HID_OUT_EP,Report_buf,2); + USBDEV_SetEPStatus(pdev, HID_OUT_EP, USB_EP_RX_VALID); + + return USBD_OK; +} + +/** +*\*\name USBD_CUSTOM_HID_EP0_RxReady. +*\*\fun Handles control request data. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index. +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_CUSTOM_HID_EP0_RxReady(void *pdev) +{ + Bit_OperateType Led_State; + + if (IsReportAvailable == 1) + { + IsReportAvailable = 0; + if (Report_buf[1] == 0) + { + Led_State = Bit_RESET; + } + else + { + Led_State = Bit_SET; + } + + switch (Report_buf[0]) + { + case 1: /* Led 1 */ + if (Led_State != Bit_RESET) + { + LED_On(LED1_PORT, LED1_PIN); + } + else + { + LED_Off(LED1_PORT, LED1_PIN); + } + break; + + case 2: /* Led 2 */ + if (Led_State != Bit_RESET) + { + LED_On(LED2_PORT, LED2_PIN); + } + else + { + LED_Off(LED2_PORT, LED2_PIN); + } + break; + case 3: /* Led 3 */ + if (Led_State != Bit_RESET) + { + LED_On(LED3_PORT, LED3_PIN); + } + else + { + LED_Off(LED3_PORT, LED3_PIN); + } + break; + default: + LED_Off(LED1_PORT, LED1_PIN); + LED_Off(LED2_PORT, LED2_PIN); + LED_Off(LED3_PORT, LED3_PIN); + break; + } + } + return USBD_OK; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_cdc_composite/inc/usbd_hid_cdc_composite.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_cdc_composite/inc/usbd_hid_cdc_composite.h new file mode 100644 index 0000000000..03f1e54886 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_cdc_composite/inc/usbd_hid_cdc_composite.h @@ -0,0 +1,63 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_hid_cdc_composite.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USB_HID_CDC_COMPOSITE_H_ +#define __USB_HID_CDC_COMPOSITE_H_ + +#include "usbd_ioreq.h" + + +extern USBD_Class_cb_TypeDef USBD_HID_CDC_cb; + +#endif /* __USB_HID_CDC_COMPOSITE_H_ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_cdc_composite/src/usbd_hid_cdc_composite.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_cdc_composite/src/usbd_hid_cdc_composite.c new file mode 100644 index 0000000000..9c2a37e760 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_cdc_composite/src/usbd_hid_cdc_composite.c @@ -0,0 +1,402 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_hid_cdc_composite.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbd_customhid_core.h" +#include "usbd_cdc_core.h" +#include "usbd_hid_cdc_composite.h" +#include "usbd_desc.h" +#include "usbd_req.h" + + +/* CDC Device library callbacks */ +extern uint8_t USBD_CDC_Init (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_CDC_DeInit (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_CDC_Setup (void *pdev, USB_SETUP_REQ *req); +extern uint8_t USBD_CDC_EP0_RxReady (void *pdev); +extern uint8_t USBD_CDC_DataIn (void *pdev, uint8_t epnum); +extern uint8_t USBD_CDC_DataOut (void *pdev, uint8_t epnum); +extern uint8_t USBD_CDC_SOF (void *pdev); + +/* HID Device library callbacks */ +extern uint8_t USBD_CUSTOM_HID_Init (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_CUSTOM_HID_DeInit (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_CUSTOM_HID_Setup (void *pdev, USB_SETUP_REQ *req); +extern uint8_t USBD_CUSTOM_HID_DataIn (void *pdev, uint8_t epnum); +extern uint8_t USBD_CUSTOM_HID_DataOut (void *pdev, uint8_t epnum); +extern uint8_t USBD_CUSTOM_HID_EP0_RxReady (void *pdev); + + +static uint8_t USBD_HID_CDC_Init (void *pdev , uint8_t cfgidx); +static uint8_t USBD_HID_CDC_DeInit (void *pdev , uint8_t cfgidx); + +/* Control Endpoints*/ +static uint8_t USBD_HID_CDC_Setup (void *pdev , USB_SETUP_REQ *req); +static uint8_t USBD_HID_CDC_EP0_RxReady (void *pdev ); + +/* Class Specific Endpoints*/ +static uint8_t USBD_HID_CDC_DataIn (void *pdev , uint8_t epnum); +static uint8_t USBD_HID_CDC_DataOut (void *pdev , uint8_t epnum); +static uint8_t USBD_HID_CDC_SOF (void *pdev); +static uint8_t* USBD_HID_CDC_GetConfigDescriptor(uint8_t speed , uint16_t *length); + +#define USB_HID_CDC_CONFIG_DESC_SIZ (USB_CUSTOM_HID_CONFIG_DESC_SIZ -9 + USB_CDC_CONFIG_DESC_SIZ + 8) + +#define HID_INTERFACE 0x00 +#define CDC_COM_INTERFACE 0x01 + + +USBD_Class_cb_TypeDef USBD_HID_CDC_cb = +{ + USBD_HID_CDC_Init, + USBD_HID_CDC_DeInit, + USBD_HID_CDC_Setup, + NULL, + USBD_HID_CDC_EP0_RxReady, + USBD_HID_CDC_DataIn, + USBD_HID_CDC_DataOut, + USBD_HID_CDC_SOF, + NULL, + NULL, + USBD_HID_CDC_GetConfigDescriptor, + USBD_HID_CDC_GetConfigDescriptor, +}; + + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +/* USB MSC/CDC device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_HID_CDC_CfgDesc[USB_HID_CDC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ + USB_HID_CDC_CONFIG_DESC_SIZ, + /* wTotalLength: Bytes returned */ + 0x00, + 0x03, /*bNumInterfaces: 3 interfaces (2 for CDC, 1 for HID)*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x00, /*iConfiguration: Index of string descriptor describing + the configuration*/ + 0xC0, /*bmAttributes: bus powered and Support Remote Wake-up */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + + /************** Descriptor of Custom HID interface ****************/ + /* 09 */ + 0x09, /*bLength: Interface Descriptor size*/ + USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ + HID_INTERFACE,/*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x02, /*bNumEndpoints*/ + 0x03, /*bInterfaceClass: HID*/ + 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ + 0x01, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ + 0x00, /*iInterface: Index of string descriptor*/ + /******************** Descriptor of HID ********************/ + /* 18 */ + 0x09, /*bLength: HID Descriptor size*/ + CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x10, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ + 0x00, + /******************** Descriptor of Custom HID endpoint ********************/ + /* 27 */ + 0x07, /*bLength: Endpoint Descriptor size*/ + USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ + + HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/ + 0x03, /*bmAttributes: Interrupt endpoint*/ + HID_IN_PACKET, /*wMaxPacketSize: 4 Byte max */ + 0x00, + 0x20, /*bInterval: Polling Interval (10 ms)*/ + /* 34 */ + + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ + /* Endpoint descriptor type */ + HID_OUT_EP, /* bEndpointAddress: */ + /* Endpoint Address (OUT) */ + 0x03, /* bmAttributes: Interrupt endpoint */ + HID_OUT_PACKET, /* wMaxPacketSize */ + 0x00, + 0x20, /* bInterval: Polling Interval (10 ms) */ + + /******** /IAD should be positioned just before the CDC interfaces ****** + IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + 0x01, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + CDC_COM_INTERFACE, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x01, /* iInterface: */ + + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x02, /* bDataInterface: 2 */ + + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x01, /* bMasterInterface: Communication class interface */ + 0x02, /* bSlaveInterface0: Data Class Interface */ + + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), + 0xFF, /* bInterval: */ + + /*---------------------------------------------------------------------------*/ + + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x02, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00, /* bInterval: ignore for Bulk transfer */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00, /* bInterval */ +} ; + +/** + * @brief USBD_MSC_CDC_Init + * Initialize the MSC & CDC interfaces + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_HID_CDC_Init (void *pdev, uint8_t cfgidx) +{ + /* HID initialization */ + USBD_CUSTOM_HID_Init(pdev, cfgidx); + + /* CDC initialization */ + USBD_CDC_Init(pdev, cfgidx); + + return USBD_OK; +} + +/** + * @brief USBD_MSC_CDC_Init + * DeInitialize the MSC/CDC interfaces + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_HID_CDC_DeInit(void *pdev, uint8_t cfgidx) +{ + /* HID De-initialization */ + USBD_CUSTOM_HID_DeInit(pdev,cfgidx); + + /* CDC De-initialization */ + USBD_CDC_DeInit(pdev,cfgidx); + + return USBD_OK; +} + +/** + * @brief USBD_MSC_CDC_Setup + * Handle the MSC/CDC specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_HID_CDC_Setup(void *pdev, USB_SETUP_REQ *req) +{ + switch (req->bmRequest & USB_REQ_RECIPIENT_MASK) + { + case USB_REQ_RECIPIENT_INTERFACE: + if (req->wIndex == HID_INTERFACE) + { + return (USBD_CUSTOM_HID_Setup(pdev, req)); + } + else + { + return (USBD_CDC_Setup(pdev, req)); + } + + case USB_REQ_RECIPIENT_ENDPOINT: + if (req->wIndex == HID_IN_EP) + { + return (USBD_CUSTOM_HID_Setup(pdev, req)); + } + else + { + return (USBD_CDC_Setup(pdev, req)); + } + + default: + break; + } + return USBD_OK; +} + +/** + * @brief USBD_MSC_CDC_GetCfgDesc + * return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_HID_CDC_GetConfigDescriptor(uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_HID_CDC_CfgDesc); + return USBD_HID_CDC_CfgDesc; +} + +/** + * @brief USBD_MSC_CDC_DataIn + * handle data IN Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_HID_CDC_DataIn (void *pdev, uint8_t epnum) +{ + /*DataIN can be for CDC or MSC */ + if (epnum == (CDC_IN_EP&0x0F)) + { + return (USBD_CDC_DataIn(pdev, epnum)); + } + else + { + return (USBD_CUSTOM_HID_DataIn(pdev, epnum)); + } +} + + +static uint8_t USBD_HID_CDC_DataOut(void *pdev , uint8_t epnum) +{ + /*DataOut can be for CDC */ + if(epnum == (CDC_OUT_EP&0x0F)) + { + return (USBD_CDC_DataOut(pdev, epnum)); + } + else + { + return (USBD_CUSTOM_HID_DataOut(pdev, epnum)); + } +} + + +static uint8_t USBD_HID_CDC_SOF (void *pdev) +{ + /*SOF processing needed for CDC */ + return (USBD_CDC_SOF(pdev)); +} + + +static uint8_t USBD_HID_CDC_EP0_RxReady(void *pdev) +{ + /*RxReady processing needed for CDC only*/ + return (USBD_CDC_EP0_RxReady(pdev)); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_keyboard/inc/usbd_keyboard_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_keyboard/inc/usbd_keyboard_core.h new file mode 100644 index 0000000000..5cadc59731 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_keyboard/inc/usbd_keyboard_core.h @@ -0,0 +1,79 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_keyboard_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USBD_KEYBOARD_CORE_H__ +#define __USBD_KEYBOARD_CORE_H__ + +#include "usbd_ioreq.h" + +#define KEYBOARD_CFGDESC_SIZE (41u) +#define KEYBOARD_DESC_SIZE (9u) +#define KEYBOARD_REPORT_DESC_SIZE (66u) + +#define KEYBOARD_DESCRIPTOR_TYPE (0x21u) +#define KEYBOARD_REPORT_DESC (0x22u) + + +#define KEYBOARD_REQ_SET_PROTOCOL (0x0Bu) +#define KEYBOARD_REQ_GET_PROTOCOL (0x03u) + +#define KEYBOARD_REQ_SET_IDLE (0x0Au) +#define KEYBOARD_REQ_GET_IDLE (0x02u) + + +extern USBD_Class_cb_TypeDef USBD_HID_Keyboard_cb; + +extern uint8_t usb_dev_mouse_txreport(USB_CORE_MODULE *pdev, uint8_t *report, uint16_t len); + +#endif // __USBD_KEYBOARD_CORE_H__ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_keyboard/src/usbd_keyboard_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_keyboard/src/usbd_keyboard_core.c new file mode 100644 index 0000000000..e0d296164f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_keyboard/src/usbd_keyboard_core.c @@ -0,0 +1,351 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_keyboard_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbd_keyboard_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" +#include "n32h76x_78x_gpio.h" +#include "usbhs_bsp.h" + +static uint8_t USBD_Keyboard_Init(void *pdev, uint8_t cfgidx); +static uint8_t USBD_Keyboard_Deinit(void *pdev, uint8_t cfgidx); +static uint8_t USBD_Keyboard_Setup(void *pdev, USB_SETUP_REQ *req); +static uint8_t *USBD_Keyboard_Getcfgdesc(uint8_t speed,uint16_t *length); +static uint8_t USBD_Keyboard_Datain(void *pdev, uint8_t epnum); +static uint8_t USBD_Keyboard_Dataout(void *pdev, uint8_t epnum); + +USBD_Class_cb_TypeDef USBD_HID_Keyboard_cb= +{ + USBD_Keyboard_Init, + USBD_Keyboard_Deinit, + USBD_Keyboard_Setup, + NULL, /*EP0_TxSent*/ + NULL, + USBD_Keyboard_Datain, + USBD_Keyboard_Dataout, + NULL, + NULL, + NULL, + USBD_Keyboard_Getcfgdesc, + USBD_Keyboard_Getcfgdesc, +}; + +__ALIGN_BEGIN static uint32_t USBD_Keyboard_AltSet __ALIGN_END = 0u; +__ALIGN_BEGIN static uint32_t USBD_Keyboard_Protocol __ALIGN_END = 0u; +__ALIGN_BEGIN static uint32_t USBD_Keyboard_IdleState __ALIGN_END = 0u; + +/* USB HID device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_Keyboard_CfgDesc[KEYBOARD_CFGDESC_SIZE] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE,/* bDescriptorType: Configuration */ + KEYBOARD_CFGDESC_SIZE, /* wTotalLength: Bytes returned */ + 0x00, + 0x01, /*bNumInterfaces: 1 interface*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x00, /*iConfiguration: Index of string descriptor describing the configuration*/ + 0x80, /*bmAttributes: bus powered and Support Remote Wake-up */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + /************** Descriptor of Joystick Mouse interface ****************/ + /* 09 */ + 0x09, /*bLength: Interface Descriptor size*/ + USB_INTERFACE_DESCRIPTOR_TYPE, /*bDescriptorType: Interface descriptor type*/ + 0x00, /*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x02, /*bNumEndpoints*/ + 0x03, /*bInterfaceClass: HID*/ + 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ + 0x01, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ + 0x00, /*iInterface: Index of string descriptor*/ + /******************** Descriptor of Joystick Mouse HID ********************/ + /* 18 */ + 0x09, /*bLength: HID Descriptor size*/ + KEYBOARD_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x10, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x21, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + KEYBOARD_REPORT_DESC_SIZE, /*wItemLength: Total length of Report descriptor*/ + 0x00, + /******************** Descriptor of Mouse endpoint ********************/ + /* 27 */ + 0x07, /*bLength: Endpoint Descriptor size*/ + USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ + HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/ + 0x03, /*bmAttributes: Interrupt endpoint*/ + 0x08, /*wMaxPacketSize: 4 Byte max */ + 0x00, + 0x0A, /*bInterval: Polling Interval (10 ms)*/ + /* 34 */ + 0x07, /*bLength: Endpoint Descriptor size*/ + USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ + HID_OUT_EP, /*bEndpointAddress: Endpoint Address (IN)*/ + 0x03, /*bmAttributes: Interrupt endpoint*/ + HID_OUT_PACKET, /*wMaxPacketSize: 4 Byte max */ + 0x00, + 0x0A, /*bInterval: Polling Interval (10 ms)*/ + /* 41 */ +} ; + +__ALIGN_BEGIN static uint8_t HID_KEYBOARD_ReportDesc[KEYBOARD_REPORT_DESC_SIZE] __ALIGN_END = +{ + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x06, // USAGE (Keyboard) + 0xa1, 0x01, // COLLECTION (Application) + 0x05, 0x07, // USAGE_PAGE (Keyboard) + 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) + 0x29, 0x00, // USAGE_MAXIMUM (Reserved (no event indicated)) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x08, // REPORT_SIZE (8) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x08, // REPORT_SIZE (8) + 0x81, 0x03, // INPUT (Cnst,Var,Abs) + 0x95, 0x06, // REPORT_COUNT (6) + 0x75, 0x08, // REPORT_SIZE (8) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) + 0x05, 0x07, // USAGE_PAGE (Keyboard) + 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) + 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) + 0x81, 0x00, // INPUT (Data,Ary,Abs) + 0x15, 0x01, // LOGICAL_MINIMUM (1) + 0x95, 0x05, // REPORT_COUNT (5) + 0x75, 0x01, // REPORT_SIZE (1) + 0x05, 0x08, // USAGE_PAGE (LEDs) + 0x19, 0x01, // USAGE_MINIMUM (Num Lock) + 0x29, 0x05, // USAGE_MAXIMUM (Kana) + 0x91, 0x02, // OUTPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x03, // REPORT_SIZE (3) + 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) + 0xc0 // END_COLLECTION +}; + +__IO uint8_t Report_buf[64]; + +/** +*\*\name USBD_Keyboard_Init. +*\*\fun Initialize the interface of KEYBOARD HID. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return USBD_OK. +*\*\ +**/ +static uint8_t USBD_Keyboard_Init(void *pdev, uint8_t cfgidx) +{ + USBDEV_EP_Open(pdev, HID_IN_EP, 8, USB_EP_INT); + USBDEV_EP_Open(pdev, HID_OUT_EP, HID_OUT_PACKET, USB_EP_INT); + USBDEV_EP_PrepareRx(pdev, HID_OUT_EP, (uint8_t *)Report_buf, 64); + USBDEV_SetEPStatus(pdev, HID_OUT_EP, USB_EP_RX_VALID); + + return USBD_OK; +} + +/** +*\*\name USBD_Keyboard_Deinit. +*\*\fun DeInitialize the interface of KEYBOARD HID. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return USBD_OK. +*\*\ +**/ +static uint8_t USBD_Keyboard_Deinit(void *pdev, uint8_t cfgidx) +{ + USBDEV_EP_Close(pdev, HID_IN_EP); + USBDEV_EP_Close(pdev, HID_OUT_EP); + + return USBD_OK; +} + +/** +*\*\name USBD_Keyboard_Setup. +*\*\fun Handle the KEYBOARD HID SETUP request. +*\*\param pdev: device instance. +*\*\param req: usb requests +*\*\return status. +*\*\ +**/ +static uint8_t USBD_Keyboard_Setup(void *pdev, USB_SETUP_REQ *req) +{ + uint16_t len = 0u; + uint8_t *pbuf = NULL; + uint8_t status = USBD_OK; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_CLASS : + switch (req->bRequest) + { + case KEYBOARD_REQ_SET_PROTOCOL: + USBD_Keyboard_Protocol = (uint8_t)(req->wValue); + break; + case KEYBOARD_REQ_GET_PROTOCOL: + USBD_CtrlSendData(pdev, (uint8_t *)&USBD_Keyboard_Protocol, 1u); + break; + case KEYBOARD_REQ_SET_IDLE: + USBD_Keyboard_IdleState = (uint8_t)(req->wValue >> 8u); + break; + case KEYBOARD_REQ_GET_IDLE: + USBD_CtrlSendData(pdev, (uint8_t *)&USBD_Keyboard_IdleState, 1u); + break; + default: + USBD_CtrlError(pdev, req); + status = USBD_FAIL; + break; + } + break; + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if((req->wValue >> 8u) == (uint16_t)KEYBOARD_REPORT_DESC) + { + len = (uint16_t)MIN(KEYBOARD_REPORT_DESC_SIZE , req->wLength); + pbuf = HID_KEYBOARD_ReportDesc; + } + else if((req->wValue >> 8u) == (uint16_t)KEYBOARD_DESCRIPTOR_TYPE) + { + pbuf = USBD_Keyboard_CfgDesc + 0x12; + len = (uint16_t)MIN(KEYBOARD_DESC_SIZE , req->wLength); + } + else + { + // + } + USBD_CtrlSendData(pdev, pbuf, len); + break; + case USB_REQ_GET_INTERFACE : + USBD_CtrlSendData(pdev, (uint8_t *)&USBD_Keyboard_AltSet, 1u); + break; + case USB_REQ_SET_INTERFACE : + USBD_Keyboard_AltSet = (uint8_t)(req->wValue); + break; + default: + break; + } + break; + default: + break; + } + return status; +} + +/** +*\*\name USBD_Keyboard_Getcfgdesc. +*\*\fun return configuration descriptor. +*\*\param speed : current device speed. +*\*\param length : pointer data length. +*\*\return pointer to descriptor buffer. +*\*\ +**/ +static uint8_t *USBD_Keyboard_Getcfgdesc(uint8_t speed, uint16_t *length) +{ + *length = (uint16_t)sizeof (USBD_Keyboard_CfgDesc); + return USBD_Keyboard_CfgDesc; +} + +/** +*\*\name USBD_Keyboard_Datain. +*\*\fun handle data IN Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index. +*\*\return USBD_OK. +*\*\ +**/ +static uint8_t USBD_Keyboard_Datain(void *pdev, uint8_t epnum) +{ + USBDEV_EP_Flush(pdev, HID_IN_EP); + + return USBD_OK; +} + +/** +*\*\name USBD_Keyboard_Dataout. +*\*\fun handle the OUT data Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index. +*\*\return USBD_OK. +*\*\ +**/ +static uint8_t USBD_Keyboard_Dataout(void *pdev, uint8_t epnum) +{ + if (epnum == HID_OUT_EP) + { + if(Report_buf[0] & 0x02) + { + LED_On(LED1_PORT, LED1_PIN); + } + else + { + LED_Off(LED1_PORT, LED1_PIN); + } + if(Report_buf[0] & 0x01) + { + LED_On(LED2_PORT, LED2_PIN); + } + else + { + LED_Off(LED2_PORT, LED2_PIN); + } + } + + USBDEV_EP_PrepareRx(pdev, HID_OUT_EP, (uint8_t *)Report_buf, 64); + USBDEV_SetEPStatus(pdev, HID_OUT_EP, USB_EP_RX_VALID); + + return USBD_OK; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_msc_composite/inc/usbd_msc_hid_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_msc_composite/inc/usbd_msc_hid_core.h new file mode 100644 index 0000000000..c01ad12743 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_msc_composite/inc/usbd_msc_hid_core.h @@ -0,0 +1,63 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_hid_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USB_MSC_HID_CORE_H_ +#define __USB_MSC_HID_CORE_H_ + +#include "usbd_ioreq.h" + + +extern USBD_Class_cb_TypeDef USBD_MSC_HID_cb; + +#endif /* __USB_HID_CORE_H_ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_msc_composite/src/usbd_msc_hid_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_msc_composite/src/usbd_msc_hid_core.c new file mode 100644 index 0000000000..f0aa0d972d --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/hid_msc_composite/src/usbd_msc_hid_core.c @@ -0,0 +1,338 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_hid_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbd_msc_hid_core.h" +#include "usbd_msc_core.h" +#include "usbd_customhid_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" + + +static uint8_t USBD_MSC_HID_Init (void *pdev, + uint8_t cfgidx); + +static uint8_t USBD_MSC_HID_DeInit (void *pdev, + uint8_t cfgidx); + +static uint8_t USBD_MSC_HID_Setup (void *pdev, + USB_SETUP_REQ *req); + +static uint8_t *USBD_MSC_HID_GetCfgDesc (uint8_t speed, uint16_t *length); + +static uint8_t USBD_MSC_HID_DataIn (void *pdev, uint8_t epnum); +static uint8_t USBD_MSC_HID_DataOut(void *pdev , uint8_t epnum); + +#define HID_INTERFACE 0x0 +#define MSC_INTERFACE 0x1 + + +#define USB_MSC_HID_CONFIG_DESC_SIZ (USB_CUSTOM_HID_CONFIG_DESC_SIZ -9 + USB_MSC_CONFIG_DESC_SIZ) + +USBD_Class_cb_TypeDef USBD_MSC_HID_cb = +{ + USBD_MSC_HID_Init, + USBD_MSC_HID_DeInit, + USBD_MSC_HID_Setup, + NULL, /*EP0_TxSent*/ + NULL, /*EP0_RxReady*/ + USBD_MSC_HID_DataIn, /*DataIn*/ + USBD_MSC_HID_DataOut, /*DataOut*/ + NULL, /*SOF */ + NULL, + NULL, + USBD_MSC_HID_GetCfgDesc, + USBD_MSC_HID_GetCfgDesc, /* use same config as per FS */ +}; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +/* USB HID device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_MSC_HID_CfgDesc[USB_MSC_HID_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ + USB_MSC_HID_CONFIG_DESC_SIZ, + /* wTotalLength: Bytes returned */ + 0x00, + 0x02, /*bNumInterfaces: 2 interface*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x00, /*iConfiguration: Index of string descriptor describing + the configuration*/ + 0xC0, /*bmAttributes: bus powered and Support Remote Wake-up */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + + /************** Descriptor of HID interface ****************/ + /* 09 */ + 0x09, /*bLength: Interface Descriptor size*/ + USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ + HID_INTERFACE, /*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x02, /*bNumEndpoints*/ + 0x03, /*bInterfaceClass: HID*/ + 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ + 0x01, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ + 0, /*iInterface: Index of string descriptor*/ + /******************** Descriptor of HID ********************/ + /* 18 */ + 0x09, /*bLength: HID Descriptor size*/ + CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x10, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ + 0x00, + /******************** Descriptor of HID endpoint ********************/ + /* 27 */ + 0x07, /*bLength: Endpoint Descriptor size*/ + USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/ + + HID_IN_EP, /*bEndpointAddress: Endpoint Address (IN)*/ + 0x03, /*bmAttributes: Interrupt endpoint*/ + HID_IN_PACKET, /*wMaxPacketSize: 4 Byte max */ + 0x00, + 0x0A, /*bInterval: Polling Interval (10 ms)*/ + /* 34 */ + + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ + /* Endpoint descriptor type */ + HID_OUT_EP, /* bEndpointAddress: */ + /* Endpoint Address (OUT) */ + 0x03, /* bmAttributes: Interrupt endpoint */ + HID_OUT_PACKET, /* wMaxPacketSize */ + 0x00, + 0x20, /* bInterval: Polling Interval (10 ms) */ + /* 41 */ + /******************** Mass Storage interface ********************/ + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + MSC_INTERFACE, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints*/ + 0x08, /* bInterfaceClass: MSC Class */ + 0x06, /* bInterfaceSubClass : SCSI transparent*/ + 0x50, /* nInterfaceProtocol */ + 0x05, /* iInterface: */ + /******************** Mass Storage Endpoints ********************/ + 0x07, /*Endpoint descriptor length = 7*/ + 0x05, /*Endpoint descriptor type */ + MSC_IN_EP, /*Endpoint address (IN, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(MSC_MAX_PACKET), + HIBYTE(MSC_MAX_PACKET), + 0x00, /*Polling interval in milliseconds */ + + 0x07, /*Endpoint descriptor length = 7 */ + 0x05, /*Endpoint descriptor type */ + MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(MSC_MAX_PACKET), + HIBYTE(MSC_MAX_PACKET), + 0x00 /*Polling interval in milliseconds*/ +} ; + +/* Private function prototypes */ + +/********************************************* + MSC Device library callbacks +*********************************************/ +extern uint8_t USBD_MSC_Init (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_MSC_DeInit (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_MSC_Setup (void *pdev, USB_SETUP_REQ *req); +extern uint8_t USBD_MSC_DataIn (void *pdev, uint8_t epnum); +extern uint8_t USBD_MSC_DataOut (void *pdev, uint8_t epnum); +extern uint8_t *USBD_MSC_GetCfgDesc (uint8_t speed, uint16_t *length); +extern uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ]; + +/********************************************* + HID Device library callbacks +*********************************************/ +extern uint8_t USBD_CUSTOM_HID_Init (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_CUSTOM_HID_DeInit (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_CUSTOM_HID_Setup (void *pdev, USB_SETUP_REQ *req); +extern uint8_t *USBD_CUSTOM_HID_GetCfgDesc (uint8_t speed, uint16_t *length); +extern uint8_t USBD_CUSTOM_HID_DataIn (void *pdev, uint8_t epnum); +extern uint8_t USBD_CUSTOM_HID_DataOut (void *pdev, uint8_t epnum); +extern uint8_t USBD_CUSTOM_HID_EP0_RxReady (void *pdev); + +/** + * @brief USBD_MSC_HID_Init + * Initialize the MSC-HID interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_MSC_HID_Init (void *pdev, + uint8_t cfgidx) +{ + /* HID initialization */ + USBD_CUSTOM_HID_Init (pdev,cfgidx); + + /* MSC initialization */ + USBD_MSC_Init (pdev,cfgidx); + + return USBD_OK; +} + +/** + * @brief USBD_MSC_HID_DeInit + * DeInitialize the MSC_HID layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_MSC_HID_DeInit (void *pdev, + uint8_t cfgidx) +{ + /* HID De-initialization */ + USBD_CUSTOM_HID_DeInit (pdev,cfgidx); + + /* MSC De-initialization */ + USBD_MSC_DeInit (pdev,cfgidx); + + return USBD_OK; +} + +/** + * @brief USBD_MSC_HID_Setup + * Handle the MSC_HID specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_MSC_HID_Setup (void *pdev, + USB_SETUP_REQ *req) +{ + switch (req->bmRequest & USB_REQ_RECIPIENT_MASK) + { + case USB_REQ_RECIPIENT_INTERFACE: + if (req->wIndex == HID_INTERFACE) + { + return (USBD_CUSTOM_HID_Setup(pdev, req)); + } + else + { + return (USBD_MSC_Setup(pdev, req)); + } + + case USB_REQ_RECIPIENT_ENDPOINT: + if (req->wIndex == HID_IN_EP) + { + return (USBD_CUSTOM_HID_Setup(pdev, req)); + } + else + { + return (USBD_MSC_Setup(pdev, req)); + } + } + return USBD_OK; +} + +/** + * @brief USBD_MSC_HID_GetCfgDesc + * return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_MSC_HID_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_MSC_HID_CfgDesc); + return USBD_MSC_HID_CfgDesc; +} + +/** + * @brief USBD_MSC_HID_DataIn + * handle data IN Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_MSC_HID_DataIn (void *pdev, + uint8_t epnum) +{ + /*DataIN can be for MSC or HID */ + if (epnum == (MSC_IN_EP&~0x80) ) + { + return (USBD_MSC_DataIn(pdev, epnum)); + } + else + { + return (USBD_CUSTOM_HID_DataIn(pdev, epnum)); + } +} + +/** + * @brief USBD_MSC_HID_DataOut + * handle data OUT Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_MSC_HID_DataOut(void *pdev , uint8_t epnum) +{ + /*DataOut can be for MSC*/ + if (epnum == (MSC_OUT_EP&~0x80) ) + { + return (USBD_MSC_DataOut(pdev, epnum)); + } + else + { + return (USBD_CUSTOM_HID_DataOut(pdev, epnum)); + } +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/mouse/inc/usbd_mouse_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/mouse/inc/usbd_mouse_core.h new file mode 100644 index 0000000000..029eec4a16 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/mouse/inc/usbd_mouse_core.h @@ -0,0 +1,120 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_mouse_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USB_DEV_MOUSE_CLASS_H__ +#define __USB_DEV_MOUSE_CLASS_H__ + +/* C binding of definitions if building with C++ compiler */ +#ifdef __cplusplus +extern "C" +{ +#endif + +/******************************************************************************* + * Include files + ******************************************************************************/ +#include "usbd_ioreq.h" + + +/******************************************************************************* + * Global type definitions ('typedef') + ******************************************************************************/ + +/******************************************************************************* + * Global pre-processor symbols/macros ('#define') + ******************************************************************************/ +#define MOUSE_CFGDESC_SIZE (41U) +#define MOUSE_DESC_SIZE (9U) +#define MOUSE_REPORT_DESC_SIZE (74U) + +#define MOUSE_DESCRIPTOR_TYPE (0x21U) +#define MOUSE_REPORT_DESC (0x22U) + +#define MOUSE_REQ_SET_PROTOCOL (0x0BU) +#define MOUSE_REQ_GET_PROTOCOL (0x03U) + +#define MOUSE_REQ_SET_IDLE (0x0AU) +#define MOUSE_REQ_GET_IDLE (0x02U) + +/******************************************************************************* + * Global variable definitions ('extern') + ******************************************************************************/ +extern USBD_Class_cb_TypeDef USBD_MOUSE_cb; + +/******************************************************************************* + Global function prototypes (definition in C source) + ******************************************************************************/ +extern uint8_t usb_dev_mouse_txreport(USB_CORE_MODULE *pdev, uint8_t *report, uint16_t len); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_DEV_MOUSE_CLASS_H__ */ + +/******************************************************************************* + * EOF (not truncated) + ******************************************************************************/ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/mouse/src/usbd_mouse_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/mouse/src/usbd_mouse_core.c new file mode 100644 index 0000000000..1c08f43aa4 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/mouse/src/usbd_mouse_core.c @@ -0,0 +1,355 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_mouse_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + *//* Includes ------------------------------------------------------------------*/ +#include "usbd_mouse_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" +#include "n32h76x_78x_gpio.h" +#include "usbhs_bsp.h" + +static uint8_t usb_dev_mouse_init(void *pdev, uint8_t cfgidx); +static uint8_t usb_dev_mouse_deinit(void *pdev, uint8_t cfgidx); +static uint8_t usb_dev_mouse_setup(void *pdev, USB_SETUP_REQ *req); +static uint8_t *usb_dev_mouse_getcfgdesc(uint8_t speed, uint16_t *length); +static uint8_t usb_dev_mouse_datain(void *pdev, uint8_t epnum); +static uint8_t usb_dev_mouse_dataout(void *pdev, uint8_t epnum); + +/******************************************************************************* + * Global variable definitions (declared in header file with 'extern') + ******************************************************************************/ +USBD_Class_cb_TypeDef USBD_MOUSE_cb = { + usb_dev_mouse_init, + usb_dev_mouse_deinit, + usb_dev_mouse_setup, + NULL, + NULL, + usb_dev_mouse_datain, + usb_dev_mouse_dataout, + NULL, + NULL, + NULL, + usb_dev_mouse_getcfgdesc, + usb_dev_mouse_getcfgdesc, +}; + +/******************************************************************************* + * Local variable definitions ('static') + ******************************************************************************/ +__ALIGN_BEGIN static uint32_t USB_DEV_MOUSE_AltSet = 0UL; +__ALIGN_BEGIN static uint32_t USB_DEV_MOUSE_Protocol = 0UL; +__ALIGN_BEGIN static uint32_t USB_DEV_MOUSE_IdleState = 0UL; + +/* USB HID device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USB_DEV_MOUSE_CfgDesc[MOUSE_CFGDESC_SIZE] = { + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE,/* bDescriptorType: Configuration */ + MOUSE_CFGDESC_SIZE, /* wTotalLength: Bytes returned */ + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ + 0x80, /* bmAttributes: bus powered and Support Remote Wake-up */ + 0x32, /* MaxPower 100 mA: this current is used for detecting Vbus */ + /************** Descriptor of Joystick Mouse interface ****************/ + /* 09 */ + 0x09, /* bLength: Interface Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints */ + 0x03, /* bInterfaceClass: HID */ + 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ + 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ + 0x00, /* iInterface: Index of string descriptor */ + /******************** Descriptor of Joystick Mouse HID ********************/ + /* 18 */ + 0x09, /* bLength: HID Descriptor size */ + MOUSE_DESCRIPTOR_TYPE, /* bDescriptorType: HID */ + 0x11, /* bcdHID: HID Class Spec release number */ + 0x01, + 0x00, /* bCountryCode: Hardware target country */ + 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ + 0x22, /* bDescriptorType */ + MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ + 0x00, + /******************** Descriptor of Mouse endpoint ********************/ + /* 27 */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ + HID_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */ + 0x03, /* bmAttributes: Interrupt endpoint */ + HID_IN_PACKET, /* wMaxPacketSize: 4 Byte max */ + 0x00, + 0x0A, /* bInterval: Polling Interval (10 ms) */ + /* 34 */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ + HID_OUT_EP, /* bEndpointAddress: Endpoint Address (IN) */ + 0x03, /* bmAttributes: Interrupt endpoint */ + HID_OUT_PACKET, /* wMaxPacketSize: 4 Byte max */ + 0x00, + 0x0A, /* bInterval: Polling Interval (10 ms) */ + /* 41 */ +} ; + +__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[MOUSE_REPORT_DESC_SIZE] = { + 0x05, 0x01, + 0x09, 0x02, + 0xA1, 0x01, + 0x09, 0x01, + + 0xA1, 0x00, + 0x05, 0x09, + 0x19, 0x01, + 0x29, 0x03, + + 0x15, 0x00, + 0x25, 0x01, + 0x95, 0x03, + 0x75, 0x01, + + 0x81, 0x02, + 0x95, 0x01, + 0x75, 0x05, + 0x81, 0x01, + + 0x05, 0x01, + 0x09, 0x30, + 0x09, 0x31, + 0x09, 0x38, + + 0x15, 0x81, + 0x25, 0x7F, + 0x75, 0x08, + 0x95, 0x03, + + 0x81, 0x06, + 0xC0, 0x09, + 0x3C, 0x05, + 0xFF, 0x09, + + 0x01, 0x15, + 0x00, 0x25, + 0x01, 0x75, + 0x01, 0x95, + + 0x02, 0xB1, + 0x22, 0x75, + 0x06, 0x95, + 0x01, 0xB1, + + 0x01, 0xC0 +}; + +static uint8_t u8HidRevBuf[4]; + +/** +*\*\name usb_dev_mouse_init. +*\*\fun Initialize the interface of MOUSE HID. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index. +*\*\return USBD_OK. +*\*\ +**/ +static uint8_t usb_dev_mouse_init(void *pdev, uint8_t cfgidx) +{ + USBDEV_EP_Open(pdev, HID_IN_EP, HID_IN_PACKET, USB_EP_INT); + USBDEV_EP_Open(pdev, HID_OUT_EP, HID_OUT_PACKET, USB_EP_INT); + USBDEV_EP_PrepareRx(pdev, HID_OUT_EP, u8HidRevBuf, (uint16_t)(sizeof(u8HidRevBuf) / sizeof(uint8_t))); + USBDEV_SetEPStatus(pdev, HID_OUT_EP, USB_EP_RX_VALID); + return USBD_OK; +} + +/** +*\*\name usb_dev_mouse_deinit. +*\*\fun DeInitialize the interface of MOUSE HID. +*\*\param pdev�� device instance. +*\*\param cfgidx: cfg instance. +*\*\return USBD_OK. +*\*\ +**/ +static uint8_t usb_dev_mouse_deinit(void *pdev, uint8_t cfgidx) +{ + USBDEV_EP_Close(pdev, HID_IN_EP); + USBDEV_EP_Close(pdev, HID_OUT_EP); + return USBD_OK; +} + +/** +*\*\name usb_dev_mouse_setup. +*\*\fun Handle the MOUSE HID SETUP request. +*\*\param pdev: device instance. +*\*\param req: usb requests. +*\*\return status. +*\*\ +**/ +static uint8_t usb_dev_mouse_setup(void *pdev, USB_SETUP_REQ *req) +{ + uint16_t len = 0U; + uint8_t *pbuf = NULL; + uint8_t u8Res = USBD_OK; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_CLASS : + switch (req->bRequest) { + case MOUSE_REQ_SET_PROTOCOL: + USB_DEV_MOUSE_Protocol = (uint8_t)(req->wValue); + break; + case MOUSE_REQ_GET_PROTOCOL: + USBD_CtrlSendData(pdev, (uint8_t *)&USB_DEV_MOUSE_Protocol, 1U); + break; + case MOUSE_REQ_SET_IDLE: + USB_DEV_MOUSE_IdleState = (uint8_t)(req->wValue >> 8U); + break; + case MOUSE_REQ_GET_IDLE: + USBD_CtrlSendData(pdev, (uint8_t *)&USB_DEV_MOUSE_IdleState, 1U); + break; + default: + USBD_CtrlError(pdev, req); + u8Res = USBD_FAIL; + break; + } + break; + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if ((req->wValue >> 8U) == (uint16_t)MOUSE_REPORT_DESC) { + len = (uint16_t)MIN(MOUSE_REPORT_DESC_SIZE, req->wLength); + pbuf = HID_MOUSE_ReportDesc; + } else if ((req->wValue >> 8U) == (uint16_t)MOUSE_DESCRIPTOR_TYPE) { + pbuf = USB_DEV_MOUSE_CfgDesc + 0x12; + len = (uint16_t)MIN(MOUSE_DESC_SIZE, req->wLength); + } else { + ; + } + USBD_CtrlSendData(pdev, pbuf, len); + break; + case USB_REQ_GET_INTERFACE : + USBD_CtrlSendData(pdev, (uint8_t *)&USB_DEV_MOUSE_AltSet, 1U); + break; + case USB_REQ_SET_INTERFACE : + USB_DEV_MOUSE_AltSet = (uint8_t)(req->wValue); + break; + default: + break; + } + break; + default: + break; + } + return u8Res; +} + +/** +*\*\name usb_dev_mouse_txreport. +*\*\fun Send MOUSE HID report to the host. +*\*\param pdev: device instance. +*\*\param report: pointer to the report buffer +*\*\param length: the length of the report buffer in bytes +*\*\return USBD_OK. +*\*\ +**/ +uint8_t usb_dev_mouse_txreport(USB_CORE_MODULE *pdev, uint8_t *report, uint16_t length) +{ + if (pdev->dev.device_status == USB_CONFIGURED) + { + USBDEV_EP_Tx(pdev, HID_IN_EP, report, (uint32_t)length); + } + return USBD_OK; +} + +/** +*\*\name usb_dev_mouse_getcfgdesc. +*\*\fun get the configuration descriptor. +*\*\param speed: device speed. +*\*\param length:pointer data length of the configuration descriptor in bytes +*\*\return pointer of configuration descriptor buffer. +*\*\ +**/ +static uint8_t *usb_dev_mouse_getcfgdesc(uint8_t speed, uint16_t *length) +{ + *length = (uint16_t)sizeof(USB_DEV_MOUSE_CfgDesc); + return USB_DEV_MOUSE_CfgDesc; +} + +/** +*\*\name usb_dev_mouse_datain. +*\*\fun handle the IN data Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index +*\*\return USBD_OK. +*\*\ +**/ +static uint8_t usb_dev_mouse_datain(void *pdev, uint8_t epnum) +{ + USBDEV_EP_Flush(pdev, HID_IN_EP); + return USBD_OK; +} + +/** +*\*\name usb_dev_mouse_dataout. +*\*\fun handle the OUT data Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index +*\*\return USBD_OK. +*\*\ +**/ +static uint8_t usb_dev_mouse_dataout(void *pdev, uint8_t epnum) +{ + USBDEV_EP_PrepareRx(pdev, HID_OUT_EP, u8HidRevBuf, (uint16_t)(sizeof(u8HidRevBuf) / sizeof(uint8_t))); + USBDEV_SetEPStatus(pdev, HID_OUT_EP, USB_EP_RX_VALID); + return USBD_OK; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_bot.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_bot.h new file mode 100644 index 0000000000..2c054cc76f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_bot.h @@ -0,0 +1,127 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_bot.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbd_core.h" + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_MSC_BOT_H +#define __USBD_MSC_BOT_H + +#define BOT_IDLE 0 /* Idle state */ +#define BOT_DATA_OUT 1 /* Data Out state */ +#define BOT_DATA_IN 2 /* Data In state */ +#define BOT_LAST_DATA_IN 3 /* Last Data In Last */ +#define BOT_SEND_DATA 4 /* Send Immediate data */ + +#define BOT_CBW_SIGNATURE 0x43425355 +#define BOT_CSW_SIGNATURE 0x53425355 +#define BOT_CBW_LENGTH 31 +#define BOT_CSW_LENGTH 13 + +/* CSW Status Definitions */ +#define CSW_CMD_PASSED 0x00 +#define CSW_CMD_FAILED 0x01 +#define CSW_PHASE_ERROR 0x02 + +/* BOT Status */ +#define BOT_STATE_NORMAL 0 +#define BOT_STATE_RECOVERY 1 +#define BOT_STATE_ERROR 2 + + +#define DIR_IN 0 +#define DIR_OUT 1 +#define BOTH_DIR 2 + +typedef struct _MSC_BOT_CBW +{ + uint32_t dSignature; + uint32_t dTag; + uint32_t dDataLength; + uint8_t bmFlags; + uint8_t bLUN; + uint8_t bCBLength; + uint8_t CB[16]; +} +MSC_BOT_CBW_TypeDef; + + +typedef struct _MSC_BOT_CSW +{ + uint32_t dSignature; + uint32_t dTag; + uint32_t dDataResidue; + uint8_t bStatus; +} +MSC_BOT_CSW_TypeDef; + +extern uint8_t MSC_BOT_Data[]; +extern uint16_t MSC_BOT_DataLen; +extern uint8_t MSC_BOT_State; +extern uint8_t MSC_BOT_BurstMode; +extern MSC_BOT_CBW_TypeDef MSC_BOT_cbw; +extern MSC_BOT_CSW_TypeDef MSC_BOT_csw; + +void MSC_BOT_Init (USB_CORE_MODULE *pdev); +void MSC_BOT_Reset (USB_CORE_MODULE *pdev); +void MSC_BOT_DeInit (USB_CORE_MODULE *pdev); +void MSC_BOT_DataIn (USB_CORE_MODULE *pdev, uint8_t epnum); + +void MSC_BOT_DataOut (USB_CORE_MODULE *pdev, uint8_t epnum); + +void MSC_BOT_SendCSW (USB_CORE_MODULE *pdev,uint8_t CSW_Status); + +void MSC_BOT_CplClrFeature (USB_CORE_MODULE *pdev, uint8_t epnum); + +#endif /* __USBD_MSC_BOT_H */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_core.h new file mode 100644 index 0000000000..dd0afbf7da --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_core.h @@ -0,0 +1,70 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef _USB_MSC_CORE_H_ +#define _USB_MSC_CORE_H_ + +#include "usbd_ioreq.h" + +#define BOT_GET_MAX_LUN 0xFE +#define BOT_RESET 0xFF +#define USB_MSC_CONFIG_DESC_SIZ 32 + +#define MSC_EPIN_SIZE MSC_MAX_PACKET +#define MSC_EPOUT_SIZE MSC_MAX_PACKET + + +extern USBD_Class_cb_TypeDef USBD_MSC_cb; + +#endif /* _USB_MSC_CORE_H_ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_data.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_data.h new file mode 100644 index 0000000000..f5a0dc618a --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_data.h @@ -0,0 +1,73 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_data.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ + +#ifndef _USBD_MSC_DATA_H_ +#define _USBD_MSC_DATA_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_conf.h" +#include "n32h76x_78x.h" + +#define MODE_SENSE6_LEN 8 +#define MODE_SENSE10_LEN 8 +#define LENGTH_INQUIRY_PAGE00 7 +#define LENGTH_FORMAT_CAPACITIES 20 + +extern const uint8_t MSC_Page00_Inquiry_Data[]; +extern const uint8_t MSC_Mode_Sense6_data[]; +extern const uint8_t MSC_Mode_Sense10_data[] ; + + +#endif /* _USBD_MSC_DATA_H_ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_scsi.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_scsi.h new file mode 100644 index 0000000000..e36d5d0480 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/inc/usbd_msc_scsi.h @@ -0,0 +1,157 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_scsi.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBD_MSC_SCSI_H +#define __USBD_MSC_SCSI_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" + +#define SENSE_LIST_DEEPTH 4 + +/* SCSI Commands */ +#define SCSI_FORMAT_UNIT 0x04 +#define SCSI_INQUIRY 0x12 +#define SCSI_MODE_SELECT6 0x15 +#define SCSI_MODE_SELECT10 0x55 +#define SCSI_MODE_SENSE6 0x1A +#define SCSI_MODE_SENSE10 0x5A +#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1E +#define SCSI_READ6 0x08 +#define SCSI_READ10 0x28 +#define SCSI_READ12 0xA8 +#define SCSI_READ16 0x88 + +#define SCSI_READ_CAPACITY10 0x25 +#define SCSI_READ_CAPACITY16 0x9E + +#define SCSI_REQUEST_SENSE 0x03 +#define SCSI_START_STOP_UNIT 0x1B +#define SCSI_TEST_UNIT_READY 0x00 +#define SCSI_WRITE6 0x0A +#define SCSI_WRITE10 0x2A +#define SCSI_WRITE12 0xAA +#define SCSI_WRITE16 0x8A + +#define SCSI_VERIFY10 0x2F +#define SCSI_VERIFY12 0xAF +#define SCSI_VERIFY16 0x8F + +#define SCSI_SEND_DIAGNOSTIC 0x1D +#define SCSI_READ_FORMAT_CAPACITIES 0x23 + +#define NO_SENSE 0 +#define RECOVERED_ERROR 1 +#define NOT_READY 2 +#define MEDIUM_ERROR 3 +#define HARDWARE_ERROR 4 +#define ILLEGAL_REQUEST 5 +#define UNIT_ATTENTION 6 +#define DATA_PROTECT 7 +#define BLANK_CHECK 8 +#define VENDOR_SPECIFIC 9 +#define COPY_ABORTED 10 +#define ABORTED_COMMAND 11 +#define VOLUME_OVERFLOW 13 +#define MISCOMPARE 14 + + +#define INVALID_CDB 0x20 +#define INVALID_FIELED_IN_COMMAND 0x24 +#define PARAMETER_LIST_LENGTH_ERROR 0x1A +#define INVALID_FIELD_IN_PARAMETER_LIST 0x26 +#define ADDRESS_OUT_OF_RANGE 0x21 +#define MEDIUM_NOT_PRESENT 0x3A +#define MEDIUM_HAVE_CHANGED 0x28 +#define WRITE_PROTECTED 0x27 +#define UNRECOVERED_READ_ERROR 0x11 +#define WRITE_FAULT 0x03 + +#define READ_FORMAT_CAPACITY_DATA_LEN 0x0C +#define READ_CAPACITY10_DATA_LEN 0x08 +#define MODE_SENSE10_DATA_LEN 0x08 +#define MODE_SENSE6_DATA_LEN 0x04 +#define REQUEST_SENSE_DATA_LEN 0x12 +#define STANDARD_INQUIRY_DATA_LEN 0x24 +#define BLKVFY 0x04 + +extern uint8_t Page00_Inquiry_Data[]; +extern uint8_t Standard_Inquiry_Data[]; +extern uint8_t Standard_Inquiry_Data2[]; +extern uint8_t Mode_Sense6_data[]; +extern uint8_t Mode_Sense10_data[]; +extern uint8_t Scsi_Sense_Data[]; +extern uint8_t ReadCapacity10_Data[]; +extern uint8_t ReadFormatCapacity_Data []; + +typedef struct _SENSE_ITEM { + char Skey; + union { + struct _ASCs { + char ASC; + char ASCQ; + }b; + unsigned int ASC; + char *pData; + } w; +} SCSI_Sense_TypeDef; + +extern SCSI_Sense_TypeDef SCSI_Sense [SENSE_LIST_DEEPTH]; +extern uint8_t SCSI_Sense_Head; +extern uint8_t SCSI_Sense_Tail; + +int8_t SCSI_ProcessCmd(USB_CORE_MODULE *pdev, uint8_t lun, uint8_t *cmd); + +void SCSI_SenseCode(uint8_t lun, uint8_t sKey, uint8_t ASC); + +#endif /* __USBD_MSC_SCSI_H */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_bot.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_bot.c new file mode 100644 index 0000000000..2647cf6acb --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_bot.c @@ -0,0 +1,311 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_bot.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbd_msc_bot.h" +#include "usbd_msc_scsi.h" +#include "usbd_ioreq.h" +#include "usbd_msc_mem.h" + +uint16_t MSC_BOT_DataLen; +uint8_t MSC_BOT_State; +uint8_t MSC_BOT_Status; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t MSC_BOT_Data[MSC_MEDIA_PACKET] __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN MSC_BOT_CBW_TypeDef MSC_BOT_cbw __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN MSC_BOT_CSW_TypeDef MSC_BOT_csw __ALIGN_END ; + +static void MSC_BOT_CBW_Decode (USB_CORE_MODULE *pdev); + +static void MSC_BOT_SendData (USB_CORE_MODULE *pdev, uint8_t* pbuf, uint16_t len); + +static void MSC_BOT_Abort(USB_CORE_MODULE *pdev); + +/** +*\*\name MSC_BOT_Init. +*\*\fun Initialize the BOT Process. +*\*\param pdev : USB device +*\*\return none +**/ +void MSC_BOT_Init (USB_CORE_MODULE *pdev) +{ + MSC_BOT_State = BOT_IDLE; + MSC_BOT_Status = BOT_STATE_NORMAL; + USBD_STORAGE_fops->Init(0); + + USBDEV_EP_Flush(pdev, MSC_OUT_EP); + USBDEV_EP_Flush(pdev, MSC_IN_EP); + /* Prapare EP to Receive First BOT Cmd */ + USBDEV_EP_PrepareRx (pdev, MSC_OUT_EP, (uint8_t *)&MSC_BOT_cbw, BOT_CBW_LENGTH); +} + +/** +*\*\name MSC_BOT_Reset. +*\*\fun Reset the BOT Machine. +*\*\param pdev : USB device +*\*\return none +**/ +void MSC_BOT_Reset (USB_CORE_MODULE *pdev) +{ + MSC_BOT_State = BOT_IDLE; + MSC_BOT_Status = BOT_STATE_RECOVERY; + /* Prapare EP to Receive First BOT Cmd */ + USBDEV_EP_PrepareRx (pdev, MSC_OUT_EP, (uint8_t *)&MSC_BOT_cbw, BOT_CBW_LENGTH); +} + +/** +*\*\name MSC_BOT_DeInit. +*\*\fun Uninitialize the BOT Machine. +*\*\param pdev : USB device +*\*\return none +**/ +void MSC_BOT_DeInit (USB_CORE_MODULE *pdev) +{ + MSC_BOT_State = BOT_IDLE; +} + +/** +*\*\name MSC_BOT_DataIn. +*\*\fun Handle BOT IN data stage. +*\*\param pdev : USB device +*\*\param epnum: endpoint index +*\*\return none +**/ +void MSC_BOT_DataIn (USB_CORE_MODULE *pdev, uint8_t epnum) +{ + switch (MSC_BOT_State) + { + case BOT_DATA_IN: + if(SCSI_ProcessCmd(pdev, MSC_BOT_cbw.bLUN, &MSC_BOT_cbw.CB[0]) < 0) + { + MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED); + } + break; + + case BOT_SEND_DATA: + case BOT_LAST_DATA_IN: + MSC_BOT_SendCSW (pdev, CSW_CMD_PASSED); + break; + + default: + break; + } +} + +/** +*\*\name MSC_BOT_DataOut. +*\*\fun Handle BOT OUT data stage. +*\*\param pdev : USB device +*\*\param epnum: endpoint index +*\*\return none +**/ +void MSC_BOT_DataOut (USB_CORE_MODULE *pdev, uint8_t epnum) +{ + switch (MSC_BOT_State) + { + case BOT_IDLE: + MSC_BOT_CBW_Decode(pdev); + break; + + case BOT_DATA_OUT: + if(SCSI_ProcessCmd(pdev, MSC_BOT_cbw.bLUN, &MSC_BOT_cbw.CB[0]) < 0) + { + MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED); + } + break; + + default: + break; + } +} + +/** +*\*\name MSC_BOT_CBW_Decode. +*\*\fun Decode the CBW command and set the BOT state machine accordingtly. +*\*\param pdev : USB device +*\*\return none +**/ +static void MSC_BOT_CBW_Decode (USB_CORE_MODULE *pdev) +{ + + MSC_BOT_csw.dTag = MSC_BOT_cbw.dTag; + MSC_BOT_csw.dDataResidue = MSC_BOT_cbw.dDataLength; + + if ((USBD_GetRxCount (pdev ,MSC_OUT_EP) != BOT_CBW_LENGTH) || + (MSC_BOT_cbw.dSignature != BOT_CBW_SIGNATURE)|| + (MSC_BOT_cbw.bLUN > 1) || + (MSC_BOT_cbw.bCBLength < 1) || + (MSC_BOT_cbw.bCBLength > 16)) + { + SCSI_SenseCode(MSC_BOT_cbw.bLUN, + ILLEGAL_REQUEST, + INVALID_CDB); + MSC_BOT_Status = BOT_STATE_ERROR; + MSC_BOT_Abort(pdev); + } + else + { + if(SCSI_ProcessCmd(pdev, MSC_BOT_cbw.bLUN, &MSC_BOT_cbw.CB[0]) < 0) + { + MSC_BOT_Abort(pdev); + } + /*Burst xfer handled internally*/ + else if ((MSC_BOT_State != BOT_DATA_IN) && (MSC_BOT_State != BOT_DATA_OUT) && (MSC_BOT_State != BOT_LAST_DATA_IN)) + { + if (MSC_BOT_DataLen > 0) + { + MSC_BOT_SendData(pdev, MSC_BOT_Data, MSC_BOT_DataLen); + } + else if (MSC_BOT_DataLen == 0) + { + MSC_BOT_SendCSW (pdev, CSW_CMD_PASSED); + } + } + } +} + + +/** +*\*\name MSC_BOT_SendData. +*\*\fun Send the requested data. +*\*\param pdev : USB device +*\*\param buf: pointer to data buffer +*\*\param len: Data Length +*\*\return none +**/ +static void MSC_BOT_SendData(USB_CORE_MODULE *pdev, uint8_t* buf, uint16_t len) +{ + len = MIN (MSC_BOT_cbw.dDataLength, len); + MSC_BOT_csw.dDataResidue -= len; + MSC_BOT_csw.bStatus = CSW_CMD_PASSED; + MSC_BOT_State = BOT_SEND_DATA; + + USBDEV_EP_Tx(pdev, MSC_IN_EP, buf, len); +} + +/** +*\*\name MSC_BOT_SendCSW. +*\*\fun Send the Command Status Wrapper. +*\*\param pdev : USB device +*\*\param CSW_Status : CSW status +*\*\return none +**/ +void MSC_BOT_SendCSW (USB_CORE_MODULE *pdev, uint8_t CSW_Status) +{ + MSC_BOT_csw.dSignature = BOT_CSW_SIGNATURE; + MSC_BOT_csw.bStatus = CSW_Status; + MSC_BOT_State = BOT_IDLE; + + USBDEV_EP_Tx (pdev, MSC_IN_EP, (uint8_t *)&MSC_BOT_csw, BOT_CSW_LENGTH); + + /* Prepare EP to Receive next Cmd */ + USBDEV_EP_PrepareRx (pdev, MSC_OUT_EP, (uint8_t *)&MSC_BOT_cbw, BOT_CBW_LENGTH); + +} + +/** +*\*\name MSC_BOT_Abort. +*\*\fun Abort the current transfer. +*\*\param pdev : USB device +*\*\return none +**/ +static void MSC_BOT_Abort (USB_CORE_MODULE *pdev) +{ + if ((MSC_BOT_cbw.bmFlags == 0) && (MSC_BOT_cbw.dDataLength != 0) && (MSC_BOT_Status == BOT_STATE_NORMAL)) + { + USBDEV_EP_Stall(pdev, MSC_OUT_EP); + } + USBDEV_EP_Stall(pdev, MSC_IN_EP); + + if(MSC_BOT_Status == BOT_STATE_ERROR) + { + USBDEV_EP_PrepareRx (pdev, MSC_OUT_EP, (uint8_t *)&MSC_BOT_cbw, BOT_CBW_LENGTH); + } +} + +/** +*\*\name MSC_BOT_CplClrFeature. +*\*\fun Complete the clear feature request. +*\*\param pdev : USB device +*\*\param epnum: endpoint index +*\*\return none +**/ +void MSC_BOT_CplClrFeature (USB_CORE_MODULE *pdev, uint8_t epnum) +{ + if(MSC_BOT_Status == BOT_STATE_ERROR )/* Bad CBW Signature */ + { + USBDEV_EP_Stall(pdev, MSC_IN_EP); + MSC_BOT_Status = BOT_STATE_NORMAL; + } + else if(((epnum & 0x80) == 0x80) && ( MSC_BOT_Status != BOT_STATE_RECOVERY)) + { + MSC_BOT_SendCSW (pdev, CSW_CMD_FAILED); + } +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_core.c new file mode 100644 index 0000000000..ceafd8228c --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_core.c @@ -0,0 +1,389 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbd_msc_mem.h" +#include "usbd_msc_core.h" +#include "usbd_msc_bot.h" +#include "usbd_req.h" + + +uint8_t USBD_MSC_Init (void *pdev, uint8_t cfgidx); + +uint8_t USBD_MSC_DeInit (void *pdev, uint8_t cfgidx); + +uint8_t USBD_MSC_Setup (void *pdev, USB_SETUP_REQ *req); + +uint8_t USBD_MSC_DataIn (void *pdev, uint8_t epnum); + +uint8_t USBD_MSC_DataOut (void *pdev, uint8_t epnum); + +uint8_t *USBD_MSC_GetCfgDesc (uint8_t speed, uint16_t *length); + +uint8_t *USBD_MSC_GetOtherCfgDesc (uint8_t speed, uint16_t *length); + + +uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ]; + + +USBD_Class_cb_TypeDef USBD_MSC_cb = +{ + USBD_MSC_Init, + USBD_MSC_DeInit, + USBD_MSC_Setup, + NULL, /*EP0_TxSent*/ + NULL, /*EP0_RxReady*/ + USBD_MSC_DataIn, + USBD_MSC_DataOut, + NULL, /*SOF */ + NULL, + NULL, + USBD_MSC_GetCfgDesc, + USBD_MSC_GetOtherCfgDesc, +}; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +/* USB Mass storage device Configuration Descriptor */ +/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ +__ALIGN_BEGIN uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuation Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_MSC_CONFIG_DESC_SIZ, + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: */ + 0x04, /* iConfiguration: */ + 0xC0, /* bmAttributes: */ + 0x32, /* MaxPower 100 mA */ + + /******************** Mass Storage interface ********************/ + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints*/ + 0x08, /* bInterfaceClass: MSC Class */ + 0x06, /* bInterfaceSubClass : SCSI transparent*/ + 0x50, /* nInterfaceProtocol */ + 0x05, /* iInterface: */ + /******************** Mass Storage Endpoints ********************/ + 0x07, /*Endpoint descriptor length = 7*/ + 0x05, /*Endpoint descriptor type */ + MSC_IN_EP, /*Endpoint address (IN, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(MSC_MAX_PACKET), + HIBYTE(MSC_MAX_PACKET), + 0x00, /*Polling interval in milliseconds */ + + 0x07, /*Endpoint descriptor length = 7 */ + 0x05, /*Endpoint descriptor type */ + MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(MSC_MAX_PACKET), + HIBYTE(MSC_MAX_PACKET), + 0x00 /*Polling interval in milliseconds*/ +}; + + #ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif + #endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_MSC_OtherCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuation Descriptor size */ + USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, + USB_MSC_CONFIG_DESC_SIZ, + + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: */ + 0x04, /* iConfiguration: */ + 0xC0, /* bmAttributes: */ + 0x32, /* MaxPower 100 mA */ + + /******************** Mass Storage interface ********************/ + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints*/ + 0x08, /* bInterfaceClass: MSC Class */ + 0x06, /* bInterfaceSubClass : SCSI transparent command set*/ + 0x50, /* nInterfaceProtocol */ + 0x05, /* iInterface: */ + /******************** Mass Storage Endpoints ********************/ + 0x07, /*Endpoint descriptor length = 7*/ + 0x05, /*Endpoint descriptor type */ + MSC_IN_EP, /*Endpoint address (IN, address 1) */ + 0x02, /*Bulk endpoint type */ + 0x40, + 0x00, + 0x00, /*Polling interval in milliseconds */ + + 0x07, /*Endpoint descriptor length = 7 */ + 0x05, /*Endpoint descriptor type */ + MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ + 0x02, /*Bulk endpoint type */ + 0x40, + 0x00, + 0x00 /*Polling interval in milliseconds*/ +}; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN static uint8_t USBD_MSC_MaxLun __ALIGN_END = 0; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN static uint8_t USBD_MSC_AltSet __ALIGN_END = 0; + + +/** +*\*\name USBD_MSC_Init. +*\*\fun Initialize the mass storage configuration. +*\*\param pdev : USB device +*\*\param cfgidx: configuration index +*\*\return status +**/ +uint8_t USBD_MSC_Init (void *pdev, uint8_t cfgidx) +{ + USBD_MSC_DeInit(pdev , cfgidx ); + + /* Open EP IN */ + USBDEV_EP_Open(pdev, MSC_IN_EP, MSC_EPIN_SIZE, USB_EP_BULK); + + /* Open EP OUT */ + USBDEV_EP_Open(pdev, MSC_OUT_EP, MSC_EPOUT_SIZE, USB_EP_BULK); + + /* Init the BOT layer */ + MSC_BOT_Init(pdev); + + return USBD_OK; +} + +/** +*\*\name USBD_MSC_DeInit. +*\*\fun DeInitilaize the mass storage configuration. +*\*\param pdev : USB device +*\*\param cfgidx: configuration index +*\*\return status +**/ +uint8_t USBD_MSC_DeInit (void *pdev, uint8_t cfgidx) +{ + /* Close MSC EPs */ + USBDEV_EP_Close (pdev , MSC_IN_EP); + USBDEV_EP_Close (pdev , MSC_OUT_EP); + + /* Un Init the BOT layer */ + MSC_BOT_DeInit(pdev); + return USBD_OK; +} + +/** +*\*\name USBD_MSC_Setup. +*\*\fun Handle the MSC specific requests. +*\*\param pdev : USB device +*\*\param req: USB request +*\*\return status +**/ +uint8_t USBD_MSC_Setup (void *pdev, USB_SETUP_REQ *req) +{ + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + + /* Class request */ + case USB_REQ_TYPE_CLASS : + switch (req->bRequest) + { + case BOT_GET_MAX_LUN : + if((req->wValue == 0) && (req->wLength == 1) && ((req->bmRequest & 0x80) == 0x80)) + { + USBD_MSC_MaxLun = USBD_STORAGE_fops->GetMaxLun(); + if(USBD_MSC_MaxLun > 0) + { + USBD_CtrlSendData (pdev, &USBD_MSC_MaxLun, 1); + } + else + { + USBD_CtrlError(pdev , req); + return USBD_FAIL; + } + } + else + { + USBD_CtrlError(pdev , req); + return USBD_FAIL; + } + break; + + case BOT_RESET : + if((req->wValue == 0) && (req->wLength == 0) && ((req->bmRequest & 0x80) != 0x80)) + { + MSC_BOT_Reset(pdev); + } + else + { + USBD_CtrlError(pdev , req); + return USBD_FAIL; + } + break; + + default: + USBD_CtrlError(pdev , req); + return USBD_FAIL; + } + break; + + /* Interface & Endpoint request */ + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_INTERFACE : + USBD_CtrlSendData (pdev, &USBD_MSC_AltSet, 1); + break; + + case USB_REQ_SET_INTERFACE : + USBD_MSC_AltSet = (uint8_t)(req->wValue); + break; + + case USB_REQ_CLEAR_FEATURE: + + /* Flush the FIFO and Clear the stall status */ + USBDEV_EP_Flush(pdev, (uint8_t)req->wIndex); + + /* Re-activate the EP */ + USBDEV_EP_Close (pdev , (uint8_t)req->wIndex); + if((((uint8_t)req->wIndex) & 0x80) == 0x80) + { + USBDEV_EP_Open(pdev, ((uint8_t)req->wIndex), MSC_EPIN_SIZE, USB_EP_BULK); + } + else + { + USBDEV_EP_Open(pdev, ((uint8_t)req->wIndex), MSC_EPOUT_SIZE, USB_EP_BULK); + } + /* Handle BOT error */ + MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex); + break; + + } + break; + + default: + break; + } + return USBD_OK; +} + +/** +*\*\name USBD_MSC_DataIn. +*\*\fun Handle data IN Stage. +*\*\param pdev : USB device +*\*\param epnum: endpoint index +*\*\return status +**/ +uint8_t USBD_MSC_DataIn (void *pdev, uint8_t epnum) +{ + MSC_BOT_DataIn(pdev , epnum); + return USBD_OK; +} + +/** +*\*\name USBD_MSC_DataOut. +*\*\fun Handle data OUT Stage. +*\*\param pdev : USB device +*\*\param epnum: endpoint index +*\*\return status +**/ +uint8_t USBD_MSC_DataOut (void *pdev, uint8_t epnum) +{ + MSC_BOT_DataOut(pdev , epnum); + return USBD_OK; +} + +/** +*\*\name USBD_MSC_GetCfgDesc. +*\*\fun return configuration descriptor. +*\*\param speed: current device speed +*\*\param length: pointer data length +*\*\return pointer to descriptor buffer +**/ +uint8_t *USBD_MSC_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_MSC_CfgDesc); + return USBD_MSC_CfgDesc; +} + +/** +*\*\name USBD_MSC_GetOtherCfgDesc. +*\*\fun return configuration descriptor. +*\*\param speed: current device speed +*\*\param length: pointer data length +*\*\return pointer to descriptor buffer +**/ +uint8_t *USBD_MSC_GetOtherCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_MSC_OtherCfgDesc); + return USBD_MSC_OtherCfgDesc; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_data.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_data.c new file mode 100644 index 0000000000..c4e43a5390 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_data.c @@ -0,0 +1,90 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_data.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbd_msc_data.h" + +/* USB Mass storage Page 0 Inquiry Data */ +const uint8_t MSC_Page00_Inquiry_Data[] = +{//7 + 0x00, + 0x00, + 0x00, + (LENGTH_INQUIRY_PAGE00 - 4), + 0x00, + 0x80, + 0x83 +}; +/* USB Mass storage sense 6 Data */ +const uint8_t MSC_Mode_Sense6_data[] = +{ + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 +}; +/* USB Mass storage sense 10 Data */ +const uint8_t MSC_Mode_Sense10_data[] = +{ + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 +}; diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_scsi.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_scsi.c new file mode 100644 index 0000000000..5f02612e71 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc/src/usbd_msc_scsi.c @@ -0,0 +1,616 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_scsi.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbd_msc_bot.h" +#include "usbd_msc_scsi.h" +#include "usbd_msc_mem.h" +#include "usbd_msc_data.h" + +SCSI_Sense_TypeDef SCSI_Sense [SENSE_LIST_DEEPTH]; +uint8_t SCSI_Sense_Head; +uint8_t SCSI_Sense_Tail; + +uint32_t SCSI_blk_size; +uint32_t SCSI_blk_nbr; + +uint32_t SCSI_blk_addr; +uint32_t SCSI_blk_len; + +USB_CORE_MODULE *cdev; + +static int8_t SCSI_TestUnitReady(uint8_t lun, uint8_t *params); +static int8_t SCSI_Inquiry(uint8_t lun, uint8_t *params); +static int8_t SCSI_ReadFormatCapacity(uint8_t lun, uint8_t *params); +static int8_t SCSI_ReadCapacity10(uint8_t lun, uint8_t *params); +static int8_t SCSI_RequestSense (uint8_t lun, uint8_t *params); +static int8_t SCSI_StartStopUnit(uint8_t lun, uint8_t *params); +static int8_t SCSI_ModeSense6 (uint8_t lun, uint8_t *params); +static int8_t SCSI_ModeSense10 (uint8_t lun, uint8_t *params); +static int8_t SCSI_Write10(uint8_t lun , uint8_t *params); +static int8_t SCSI_Read10(uint8_t lun , uint8_t *params); +static int8_t SCSI_Verify10(uint8_t lun, uint8_t *params); +static int8_t SCSI_CheckAddressRange (uint8_t lun , + uint32_t blk_offset , + uint16_t blk_nbr); +static int8_t SCSI_ProcessRead (uint8_t lun); + +static int8_t SCSI_ProcessWrite (uint8_t lun); + +/** +*\*\name SCSI_ProcessCmd. +*\*\fun Process SCSI commands. +*\*\param pdev: USB device +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +int8_t SCSI_ProcessCmd(USB_CORE_MODULE *pdev, uint8_t lun, uint8_t *params) +{ + cdev = pdev; + + switch (params[0]) + { + case SCSI_TEST_UNIT_READY: + return SCSI_TestUnitReady(lun, params); + + case SCSI_REQUEST_SENSE: + return SCSI_RequestSense (lun, params); + case SCSI_INQUIRY: + return SCSI_Inquiry(lun, params); + + case SCSI_START_STOP_UNIT: + return SCSI_StartStopUnit(lun, params); + + case SCSI_ALLOW_MEDIUM_REMOVAL: + return SCSI_StartStopUnit(lun, params); + + case SCSI_MODE_SENSE6: + return SCSI_ModeSense6 (lun, params); + + case SCSI_MODE_SENSE10: + return SCSI_ModeSense10 (lun, params); + + case SCSI_READ_FORMAT_CAPACITIES: + return SCSI_ReadFormatCapacity(lun, params); + + case SCSI_READ_CAPACITY10: + return SCSI_ReadCapacity10(lun, params); + + case SCSI_READ10: + return SCSI_Read10(lun, params); + + case SCSI_WRITE10: + return SCSI_Write10(lun, params); + + case SCSI_VERIFY10: + return SCSI_Verify10(lun, params); + + default: + SCSI_SenseCode(lun, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } +} + +/** +*\*\name SCSI_TestUnitReady. +*\*\fun Process SCSI Test Unit Ready Command. +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +static int8_t SCSI_TestUnitReady(uint8_t lun, uint8_t *params) +{ + /* case 9 : Hi > D0 */ + if (MSC_BOT_cbw.dDataLength != 0) + { + SCSI_SenseCode(MSC_BOT_cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + if(USBD_STORAGE_fops->IsReady(lun) !=0 ) + { + SCSI_SenseCode(lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } + MSC_BOT_DataLen = 0; + return 0; +} + +/** +*\*\name SCSI_Inquiry. +*\*\fun Process Inquiry command. +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +static int8_t SCSI_Inquiry(uint8_t lun, uint8_t *params) +{ + uint8_t* pPage; + uint16_t len; + + if (params[1] & 0x01)/*Evpd is set*/ + { + pPage = (uint8_t *)MSC_Page00_Inquiry_Data; + len = LENGTH_INQUIRY_PAGE00; + } + else + { + pPage = (uint8_t *)&USBD_STORAGE_fops->pInquiry[lun * USBD_STD_INQUIRY_LENGTH]; + len = pPage[4] + 5; + if (params[4] <= len) + { + len = params[4]; + } + } + MSC_BOT_DataLen = len; + + while (len) + { + len--; + MSC_BOT_Data[len] = pPage[len]; + } + return 0; +} + +/** +*\*\name SCSI_ReadCapacity10. +*\*\fun Process Read Capacity 10 command. +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +static int8_t SCSI_ReadCapacity10(uint8_t lun, uint8_t *params) +{ + if(USBD_STORAGE_fops->GetCapacity(lun, &SCSI_blk_nbr, &SCSI_blk_size) != 0) + { + SCSI_SenseCode(lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } + else + { + MSC_BOT_Data[0] = (uint8_t)((SCSI_blk_nbr - 1) >> 24); + MSC_BOT_Data[1] = (uint8_t)((SCSI_blk_nbr - 1) >> 16); + MSC_BOT_Data[2] = (uint8_t)((SCSI_blk_nbr - 1) >> 8); + MSC_BOT_Data[3] = (uint8_t)(SCSI_blk_nbr - 1); + + MSC_BOT_Data[4] = (uint8_t)(SCSI_blk_size >> 24); + MSC_BOT_Data[5] = (uint8_t)(SCSI_blk_size >> 16); + MSC_BOT_Data[6] = (uint8_t)(SCSI_blk_size >> 8); + MSC_BOT_Data[7] = (uint8_t)(SCSI_blk_size); + + MSC_BOT_DataLen = 8; + return 0; + } +} + +/** +*\*\name SCSI_ReadFormatCapacity. +*\*\fun Process Read Format Capacity command. +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +static int8_t SCSI_ReadFormatCapacity(uint8_t lun, uint8_t *params) +{ + uint32_t blk_size; + uint32_t blk_nbr; + uint16_t i; + + for(i=0 ; i < 12 ; i++) + { + MSC_BOT_Data[i] = 0; + } + + if(USBD_STORAGE_fops->GetCapacity(lun, &blk_nbr, &blk_size) != 0) + { + SCSI_SenseCode(lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } + else + { + MSC_BOT_Data[3] = 0x08; + MSC_BOT_Data[4] = (uint8_t)((blk_nbr - 1) >> 24); + MSC_BOT_Data[5] = (uint8_t)((blk_nbr - 1) >> 16); + MSC_BOT_Data[6] = (uint8_t)((blk_nbr - 1) >> 8); + MSC_BOT_Data[7] = (uint8_t)(blk_nbr - 1); + + MSC_BOT_Data[8] = 0x02; + MSC_BOT_Data[9] = (uint8_t)(blk_size >> 16); + MSC_BOT_Data[10] = (uint8_t)(blk_size >> 8); + MSC_BOT_Data[11] = (uint8_t)(blk_size); + + MSC_BOT_DataLen = 12; + return 0; + } +} + +/** +*\*\name SCSI_ModeSense6. +*\*\fun Process Mode Sense6 command. +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +static int8_t SCSI_ModeSense6 (uint8_t lun, uint8_t *params) +{ + uint16_t len = 8 ; + MSC_BOT_DataLen = len; + + while (len) + { + len--; + MSC_BOT_Data[len] = MSC_Mode_Sense6_data[len]; + } + return 0; +} + +/** +*\*\name SCSI_ModeSense10. +*\*\fun Process Mode Sense10 command. +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +static int8_t SCSI_ModeSense10 (uint8_t lun, uint8_t *params) +{ + uint16_t len = 8; + + MSC_BOT_DataLen = len; + + while (len) + { + len--; + MSC_BOT_Data[len] = MSC_Mode_Sense10_data[len]; + } + return 0; +} + +/** +*\*\name SCSI_RequestSense. +*\*\fun Process Request Sense command. +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +static int8_t SCSI_RequestSense (uint8_t lun, uint8_t *params) +{ + uint8_t i; + + for(i=0 ; i < REQUEST_SENSE_DATA_LEN ; i++) + { + MSC_BOT_Data[i] = 0; + } + + MSC_BOT_Data[0] = 0x70; + MSC_BOT_Data[7] = REQUEST_SENSE_DATA_LEN - 6; + + if((SCSI_Sense_Head != SCSI_Sense_Tail)) + { + + MSC_BOT_Data[2] = SCSI_Sense[SCSI_Sense_Head].Skey; + MSC_BOT_Data[12] = SCSI_Sense[SCSI_Sense_Head].w.b.ASCQ; + MSC_BOT_Data[13] = SCSI_Sense[SCSI_Sense_Head].w.b.ASC; + SCSI_Sense_Head++; + + if (SCSI_Sense_Head == SENSE_LIST_DEEPTH) + { + SCSI_Sense_Head = 0; + } + } + MSC_BOT_DataLen = REQUEST_SENSE_DATA_LEN; + + if (params[4] <= REQUEST_SENSE_DATA_LEN) + { + MSC_BOT_DataLen = params[4]; + } + return 0; +} + +/** +*\*\name SCSI_SenseCode. +*\*\fun Load the last error code in the error list. +*\*\param lun: Logical unit number +*\*\param sKey: Sense Key +*\*\param ASC: Additional Sense Key +*\*\return none +**/ +void SCSI_SenseCode(uint8_t lun, uint8_t sKey, uint8_t ASC) +{ + SCSI_Sense[SCSI_Sense_Tail].Skey = sKey; + SCSI_Sense[SCSI_Sense_Tail].w.ASC = ASC << 8; + SCSI_Sense_Tail++; + if (SCSI_Sense_Tail == SENSE_LIST_DEEPTH) + { + SCSI_Sense_Tail = 0; + } +} + +/** +*\*\name SCSI_StartStopUnit. +*\*\fun Process Start Stop Unit command. +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +static int8_t SCSI_StartStopUnit(uint8_t lun, uint8_t *params) +{ + MSC_BOT_DataLen = 0; + return 0; +} + +/** +*\*\name SCSI_Read10. +*\*\fun Process Read10 command. +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +static int8_t SCSI_Read10(uint8_t lun , uint8_t *params) +{ + if(MSC_BOT_State == BOT_IDLE) /* Idle */ + { + + /* case 10 : Ho <> Di */ + + if ((MSC_BOT_cbw.bmFlags & 0x80) != 0x80) + { + SCSI_SenseCode(MSC_BOT_cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + if(USBD_STORAGE_fops->IsReady(lun) !=0 ) + { + SCSI_SenseCode(lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } + + SCSI_blk_addr = (params[2] << 24) | (params[3] << 16) | (params[4] << 8) | params[5]; + SCSI_blk_len = (params[7] << 8) | params[8]; + + if( SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0) + { + return -1; /* error */ + } + + MSC_BOT_State = BOT_DATA_IN; + SCSI_blk_addr *= SCSI_blk_size; + SCSI_blk_len *= SCSI_blk_size; + + /* cases 4,5 : Hi <> Dn */ + if (MSC_BOT_cbw.dDataLength != SCSI_blk_len) + { + SCSI_SenseCode(MSC_BOT_cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + } + MSC_BOT_DataLen = MSC_MEDIA_PACKET; + + return SCSI_ProcessRead(lun); +} + +/** +*\*\name SCSI_Write10. +*\*\fun Process Write10 command. +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +static int8_t SCSI_Write10 (uint8_t lun , uint8_t *params) +{ + if (MSC_BOT_State == BOT_IDLE) /* Idle */ + { + /* case 8 : Hi <> Do */ + + if ((MSC_BOT_cbw.bmFlags & 0x80) == 0x80) + { + SCSI_SenseCode(MSC_BOT_cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + + /* Check whether Media is ready */ + if(USBD_STORAGE_fops->IsReady(lun) !=0 ) + { + SCSI_SenseCode(lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } + + /* Check If media is write-protected */ + if(USBD_STORAGE_fops->IsWriteProtected(lun) !=0 ) + { + SCSI_SenseCode(lun, NOT_READY, WRITE_PROTECTED); + return -1; + } + + + SCSI_blk_addr = (params[2] << 24) | (params[3] << 16) | (params[4] << 8) | params[5]; + SCSI_blk_len = (params[7] << 8) | params[8]; + + /* check if LBA address is in the right range */ + if(SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0) + { + return -1; /* error */ + } + + SCSI_blk_addr *= SCSI_blk_size; + SCSI_blk_len *= SCSI_blk_size; + + /* cases 3,11,13 : Hn,Ho <> D0 */ + if (MSC_BOT_cbw.dDataLength != SCSI_blk_len) + { + SCSI_SenseCode(MSC_BOT_cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + + /* Prepare EP to receive first data packet */ + MSC_BOT_State = BOT_DATA_OUT; + USBDEV_EP_PrepareRx (cdev, MSC_OUT_EP, MSC_BOT_Data, MIN (SCSI_blk_len, MSC_MEDIA_PACKET)); + } + else /* Write Process ongoing */ + { + return SCSI_ProcessWrite(lun); + } + return 0; +} + +/** +*\*\name SCSI_Verify10. +*\*\fun Process Verify10 command. +*\*\param lun: Logical unit number +*\*\param params: Command parameters +*\*\return status +**/ +static int8_t SCSI_Verify10(uint8_t lun , uint8_t *params) +{ + if ((params[1]& 0x02) == 0x02) + { + SCSI_SenseCode (lun, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + return -1; /* Error, Verify Mode Not supported*/ + } + + SCSI_blk_addr = (params[2] << 24) | (params[3] << 16) | (params[4] << 8) | params[5]; + SCSI_blk_len = (params[7] << 8) | params[8]; + + if(SCSI_CheckAddressRange(lun, SCSI_blk_addr, SCSI_blk_len) < 0) + { + return -1; /* error */ + } + MSC_BOT_DataLen = 0; + return 0; +} + +/** +*\*\name SCSI_CheckAddressRange. +*\*\fun Check address range. +*\*\param lun: Logical unit number +*\*\param blk_offset: first block address +*\*\param blk_nbr: number of block to be processed +*\*\return status +**/ +static int8_t SCSI_CheckAddressRange (uint8_t lun , uint32_t blk_offset , uint16_t blk_nbr) +{ + if ((blk_offset + blk_nbr) > SCSI_blk_nbr ) + { + SCSI_SenseCode(lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); + return -1; + } + return 0; +} + +/** +*\*\name SCSI_ProcessRead. +*\*\fun Handle Read Process. +*\*\param lun: Logical unit number +*\*\return status +**/ +static int8_t SCSI_ProcessRead (uint8_t lun) +{ + uint32_t len; + + len = MIN(SCSI_blk_len , MSC_MEDIA_PACKET); + + if( USBD_STORAGE_fops->Read(lun , MSC_BOT_Data, SCSI_blk_addr / SCSI_blk_size, len / SCSI_blk_size) < 0) + { + SCSI_SenseCode(lun, HARDWARE_ERROR, UNRECOVERED_READ_ERROR); + return -1; + } + + USBDEV_EP_Tx (cdev, MSC_IN_EP, MSC_BOT_Data, len); + + SCSI_blk_addr += len; + SCSI_blk_len -= len; + + /* case 6 : Hi = Di */ + MSC_BOT_csw.dDataResidue -= len; + + if (SCSI_blk_len == 0) + { + MSC_BOT_State = BOT_LAST_DATA_IN; + } + return 0; +} + +/** +*\*\name SCSI_ProcessWrite. +*\*\fun Handle Write Process. +*\*\param lun: Logical unit number +*\*\return status +**/ +static int8_t SCSI_ProcessWrite (uint8_t lun) +{ + uint32_t len; + + len = MIN(SCSI_blk_len , MSC_MEDIA_PACKET); + + if(USBD_STORAGE_fops->Write(lun , MSC_BOT_Data, SCSI_blk_addr / SCSI_blk_size, len / SCSI_blk_size) < 0) + { + SCSI_SenseCode(lun, HARDWARE_ERROR, WRITE_FAULT); + return -1; + } + + + SCSI_blk_addr += len; + SCSI_blk_len -= len; + + /* case 12 : Ho = Do */ + MSC_BOT_csw.dDataResidue -= len; + + if (SCSI_blk_len == 0) + { + MSC_BOT_SendCSW (cdev, CSW_CMD_PASSED); + } + else + { + /* Prapare EP to Receive next packet */ + USBDEV_EP_PrepareRx (cdev, MSC_OUT_EP, MSC_BOT_Data, MIN (SCSI_blk_len, MSC_MEDIA_PACKET)); + } + + return 0; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc_cdc_composite/inc/usbd_msc_cdc_composite.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc_cdc_composite/inc/usbd_msc_cdc_composite.h new file mode 100644 index 0000000000..99248ad7cd --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc_cdc_composite/inc/usbd_msc_cdc_composite.h @@ -0,0 +1,63 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_cdc_composite.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USB_MSC_CDC_COMPOSITE_H_ +#define __USB_MSC_CDC_COMPOSITE_H_ + +#include "usbd_ioreq.h" + + +extern USBD_Class_cb_TypeDef USBD_MSC_CDC_cb; + +#endif /* __USB_MSC_CDC_COMPOSITE_H_ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc_cdc_composite/src/usbd_msc_cdc_composite.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc_cdc_composite/src/usbd_msc_cdc_composite.c new file mode 100644 index 0000000000..c5bab34261 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/msc_cdc_composite/src/usbd_msc_cdc_composite.c @@ -0,0 +1,385 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_msc_cdc_composite.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbd_msc_core.h" +#include "usbd_cdc_core.h" +#include "usbd_msc_cdc_composite.h" +#include "usbd_desc.h" +#include "usbd_req.h" + + +/* CDC Device library callbacks */ +extern uint8_t USBD_CDC_Init (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_CDC_DeInit (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_CDC_Setup (void *pdev, USB_SETUP_REQ *req); +extern uint8_t USBD_CDC_EP0_RxReady (void *pdev); +extern uint8_t USBD_CDC_DataIn (void *pdev, uint8_t epnum); +extern uint8_t USBD_CDC_DataOut (void *pdev, uint8_t epnum); +extern uint8_t USBD_CDC_SOF (void *pdev); + +/* MSC Device library callbacks */ +extern uint8_t USBD_MSC_Init (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_MSC_DeInit (void *pdev, uint8_t cfgidx); +extern uint8_t USBD_MSC_Setup (void *pdev, USB_SETUP_REQ *req); +extern uint8_t USBD_MSC_DataIn (void *pdev, uint8_t epnum); +extern uint8_t USBD_MSC_DataOut (void *pdev, uint8_t epnum); + + +static uint8_t USBD_MSC_CDC_Init (void *pdev , uint8_t cfgidx); +static uint8_t USBD_MSC_CDC_DeInit (void *pdev , uint8_t cfgidx); + +/* Control Endpoints*/ +static uint8_t USBD_MSC_CDC_Setup (void *pdev , USB_SETUP_REQ *req); +static uint8_t USBD_MSC_CDC_EP0_RxReady (void *pdev ); + +/* Class Specific Endpoints*/ +static uint8_t USBD_MSC_CDC_DataIn (void *pdev , uint8_t epnum); +static uint8_t USBD_MSC_CDC_DataOut (void *pdev , uint8_t epnum); +static uint8_t USBD_MSC_CDC_SOF (void *pdev); +static uint8_t* USBD_MSC_CDC_GetConfigDescriptor(uint8_t speed , uint16_t *length); + +#define USB_MSC_CDC_CONFIG_DESC_SIZ (USB_MSC_CONFIG_DESC_SIZ -9 + USB_CDC_CONFIG_DESC_SIZ + 8) + +#define MSC_INTERFACE 0x00 +#define CDC_COM_INTERFACE 0x01 + + +USBD_Class_cb_TypeDef USBD_MSC_CDC_cb = +{ + USBD_MSC_CDC_Init, + USBD_MSC_CDC_DeInit, + USBD_MSC_CDC_Setup, + NULL, + USBD_MSC_CDC_EP0_RxReady, + USBD_MSC_CDC_DataIn, + USBD_MSC_CDC_DataOut, + USBD_MSC_CDC_SOF, + NULL, + NULL, + USBD_MSC_CDC_GetConfigDescriptor, + USBD_MSC_CDC_GetConfigDescriptor, +}; + + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +/* USB MSC/CDC device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_MSC_CDC_CfgDesc[USB_MSC_CDC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ + USB_MSC_CDC_CONFIG_DESC_SIZ, + /* wTotalLength: Bytes returned */ + 0x00, + 0x03, /*bNumInterfaces: 3 interfaces (2 for CDC, 1 for MSC)*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x00, /*iConfiguration: Index of string descriptor describing + the configuration*/ + 0xC0, /*bmAttributes: bus powered and Support Remote Wake-up */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + + /************** Descriptor of MSC interface ****************/ + /* 09 */ + 0x09, /*bLength: Interface Descriptor size*/ + USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ + MSC_INTERFACE,/*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x02, /*bNumEndpoints*/ + 0x08, /* bInterfaceClass: MSC Class */ + 0x06, /* bInterfaceSubClass : SCSI transparent*/ + 0x50, /* nInterfaceProtocol */ + 0x05, /*iInterface: Index of string descriptor*/ + /******************** Mass Storage Endpoints ********************/ + 0x07, /*Endpoint descriptor length = 7*/ + 0x05, /*Endpoint descriptor type */ + MSC_IN_EP, /*Endpoint address (IN, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(MSC_MAX_PACKET), + HIBYTE(MSC_MAX_PACKET), + 0x00, /*Polling interval in milliseconds */ + + 0x07, /*Endpoint descriptor length = 7 */ + 0x05, /*Endpoint descriptor type */ + MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(MSC_MAX_PACKET), + HIBYTE(MSC_MAX_PACKET), + 0x00, /*Polling interval in milliseconds*/ + + /******** /IAD should be positioned just before the CDC interfaces ****** + IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + 0x01, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + CDC_COM_INTERFACE, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x01, /* iInterface: */ + + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x02, /* bDataInterface: 2 */ + + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x01, /* bMasterInterface: Communication class interface */ + 0x02, /* bSlaveInterface0: Data Class Interface */ + + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), + 0xFF, /* bInterval: */ + + /*---------------------------------------------------------------------------*/ + + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x02, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00, /* bInterval: ignore for Bulk transfer */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_MAX_PACKET_SIZE), + 0x00, /* bInterval */ +} ; + +/** + * @brief USBD_MSC_CDC_Init + * Initialize the MSC & CDC interfaces + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_MSC_CDC_Init (void *pdev, uint8_t cfgidx) +{ + /* MSC initialization */ + USBD_MSC_Init(pdev, cfgidx); + + /* CDC initialization */ + USBD_CDC_Init(pdev, cfgidx); + + return USBD_OK; +} + +/** + * @brief USBD_MSC_CDC_Init + * DeInitialize the MSC/CDC interfaces + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_MSC_CDC_DeInit(void *pdev, uint8_t cfgidx) +{ + /* MSC De-initialization */ + USBD_MSC_DeInit(pdev,cfgidx); + + /* CDC De-initialization */ + USBD_CDC_DeInit(pdev,cfgidx); + + return USBD_OK; +} + +/** + * @brief USBD_MSC_CDC_Setup + * Handle the MSC/CDC specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_MSC_CDC_Setup(void *pdev, USB_SETUP_REQ *req) +{ + switch (req->bmRequest & USB_REQ_RECIPIENT_MASK) + { + case USB_REQ_RECIPIENT_INTERFACE: + if (req->wIndex == MSC_INTERFACE) + { + return (USBD_MSC_Setup(pdev, req)); + } + else + { + return (USBD_CDC_Setup(pdev, req)); + } + + case USB_REQ_RECIPIENT_ENDPOINT: + if (req->wIndex == MSC_IN_EP) + { + return (USBD_MSC_Setup(pdev, req)); + } + else + { + return (USBD_CDC_Setup(pdev, req)); + } + + default: + break; + } + return USBD_OK; +} + +/** + * @brief USBD_MSC_CDC_GetCfgDesc + * return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_MSC_CDC_GetConfigDescriptor(uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_MSC_CDC_CfgDesc); + return USBD_MSC_CDC_CfgDesc; +} + +/** + * @brief USBD_MSC_CDC_DataIn + * handle data IN Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_MSC_CDC_DataIn (void *pdev, uint8_t epnum) +{ + /*DataIN can be for CDC or MSC */ + if (epnum == (CDC_IN_EP&0x0F)) + { + return (USBD_CDC_DataIn(pdev, epnum)); + } + else + { + return (USBD_MSC_DataIn(pdev, epnum)); + } +} + + +static uint8_t USBD_MSC_CDC_DataOut(void *pdev , uint8_t epnum) +{ + /*DataOut can be for CDC */ + if(epnum == (CDC_OUT_EP&0x0F)) + { + return (USBD_CDC_DataOut(pdev, epnum)); + } + else + { + return (USBD_MSC_DataOut(pdev, epnum)); + } +} + + +static uint8_t USBD_MSC_CDC_SOF (void *pdev) +{ + /*SOF processing needed for CDC */ + return (USBD_CDC_SOF(pdev)); +} + + +static uint8_t USBD_MSC_CDC_EP0_RxReady(void *pdev) +{ + /*RxReady processing needed for CDC only*/ + return (USBD_CDC_EP0_RxReady(pdev)); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/printer/inc/usbd_printer.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/printer/inc/usbd_printer.h new file mode 100644 index 0000000000..c006335dc6 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/printer/inc/usbd_printer.h @@ -0,0 +1,90 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_printer.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USB_PRINTER_H_ +#define __USB_PRINTER_H_ + +#include "usbd_ioreq.h" + +#define USB_PRNT_CONFIG_DESC_SIZ (32U) + + +#define USB_PRNT_BIDIRECTIONAL (0x02U) + + +#define PRINTER_DATA_IN_PACKET_SIZE PRINTER_DATA_MAX_PACKET_SIZE +#define PRINTER_DATA_OUT_PACKET_SIZE PRINTER_DATA_MAX_PACKET_SIZE + +#define PRINTER_STATUS_PAPER_EMPTY 0x10U +#define PRINTER_STATUS_SELECTED 0x08U +#define PRINTER_STATUS_NO_ERROR 0x00U + +/* printing device specific-class request */ +#define PRINTER_GET_DEVICE_ID 0x00U /*!< get device id request */ +#define PRINTER_GET_PORT_STATUS 0x01U /*!< get port status request */ +#define PRINTER_SOFT_RESET 0x02U /*!< soft reset request */ + + +typedef struct _USBD_PRNT_Itf +{ + int8_t (* Init)(void); + int8_t (* DeInit)(void); + int8_t (* Control_req)(uint8_t req, uint8_t *pbuf, uint16_t *length); + int8_t (* Receive)(uint8_t *Buf, uint16_t *Len); + +} USBD_PRNT_ItfTypeDef; + +extern USBD_Class_cb_TypeDef USBD_PRINTER_cb; + +#endif /* __USB_PRINTER_H_ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/printer/src/usbd_printer.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/printer/src/usbd_printer.c new file mode 100644 index 0000000000..c83a5ae6b0 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/class/printer/src/usbd_printer.c @@ -0,0 +1,400 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_printer.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbd_printer.h" +#include "usbd_desc.h" +#include "usbd_req.h" +#include "usbhs_bsp.h" + +/* Printer Device library callbacks */ +static uint8_t USBD_PRNTER_Init(void *pdev, uint8_t cfgidx); +static uint8_t USBD_PRNTER_DeInit(void *pdev, uint8_t cfgidx); +static uint8_t USBD_PRNTER_Setup(void *pdev, USB_SETUP_REQ *req); +static uint8_t USBD_PRNTER_DataIn(void *pdev, uint8_t epnum); +static uint8_t USBD_PRNTER_DataOut(void *pdev, uint8_t epnum); + +/* Printer specific management functions */ +static uint8_t *USBD_PRNTER_GetCfgDesc(uint8_t speed, uint16_t *length); +static uint8_t *USBD_PRNTER_GetOtherCfgDesc(uint8_t speed, uint16_t *length); + +extern USBD_PRNT_ItfTypeDef APP_FOPS; +static uint8_t PRNTInEpAdd = PRINTER_IN_EP; +static uint8_t PRNTOutEpAdd = PRINTER_OUT_EP; + +/* Printer interface class callbacks structure */ +USBD_Class_cb_TypeDef USBD_PRINTER_cb = +{ + USBD_PRNTER_Init, + USBD_PRNTER_DeInit, + USBD_PRNTER_Setup, + NULL, + NULL, + USBD_PRNTER_DataIn, + USBD_PRNTER_DataOut, + NULL, + NULL, + NULL, + USBD_PRNTER_GetCfgDesc, + USBD_PRNTER_GetOtherCfgDesc, +}; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_PRNT_CfgDesc [USB_PRNT_CONFIG_DESC_SIZ] __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN static __IO uint32_t USBD_PRINTER_AltSet __ALIGN_END = 0; + + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USB_Rx_Buffer [PRINTER_DATA_MAX_PACKET_SIZE] __ALIGN_END ; + + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t CmdBuff[PRINTER_CMD_PACKET_SIZE] __ALIGN_END ; + + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +/* USB PRNT device Configuration Descriptor */ +__ALIGN_BEGIN uint8_t USBD_PRNT_CfgDesc[] __ALIGN_END = +{ + /*Configuration Descriptor*/ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_PRNT_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ + 0xA0, /* bmAttributes: Self Powered according to user configuration */ + 0x32, /* MaxPower 100 mA */ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: 2 endpoints used */ + 0x07, /* bInterfaceClass: Communication Interface Class */ + 0x01, /* bInterfaceSubClass: Abstract Control Model */ + USB_PRNT_BIDIRECTIONAL, /* bDeviceProtocol */ + 0x00, /* iInterface */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + PRINTER_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(PRINTER_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize */ + HIBYTE(PRINTER_DATA_MAX_PACKET_SIZE), + 0x00, /* bInterval */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + PRINTER_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(PRINTER_DATA_MAX_PACKET_SIZE),/* wMaxPacketSize */ + HIBYTE(PRINTER_DATA_MAX_PACKET_SIZE), + 0x00 /* bInterval */ +}; + + +/** +*\*\name USBD_PRNTER_Init. +*\*\fun Initialize the printer interface. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_PRNTER_Init (void *pdev, uint8_t cfgidx) +{ + /* Open EP IN */ + USBDEV_EP_Open(pdev, PRNTInEpAdd, PRINTER_DATA_IN_PACKET_SIZE, USB_EP_BULK); + + /* Open EP OUT */ + USBDEV_EP_Open(pdev, PRNTOutEpAdd, PRINTER_DATA_OUT_PACKET_SIZE, USB_EP_BULK); + + /* Initialize the Interface physical components */ + APP_FOPS.Init(); + + /* Prepare Out endpoint to receive next packet */ + USBDEV_EP_PrepareRx(pdev, PRNTOutEpAdd, (uint8_t*)(USB_Rx_Buffer), PRINTER_DATA_OUT_PACKET_SIZE); + + return USBD_OK; +} + + +/** +*\*\name USBD_PRNTER_DeInit. +*\*\fun DeInitialize the printer layer. +*\*\param pdev: device instance. +*\*\param cfgidx: Configuration index +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_PRNTER_DeInit (void *pdev, uint8_t cfgidx) +{ + /* Open EP IN */ + USBDEV_EP_Close(pdev, PRNTInEpAdd); + + /* Open EP OUT */ + USBDEV_EP_Close(pdev, PRNTOutEpAdd); + + /* Restore default state of the Interface physical components */ + APP_FOPS.DeInit(); + + return USBD_OK; +} + +/** +*\*\name USBD_PRNTER_Setup +*\*\fun Handle the printer specific requests. +*\*\param pdev: device instance. +*\*\param req: usb requests +*\*\return USBD_OK. +**/ +uint8_t USBD_PRNTER_Setup (void *pdev, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + uint16_t status_info = 0U; + uint16_t data_length; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + /* PRNTER Class Requests -------------------------------*/ + case USB_REQ_TYPE_CLASS : + { + /* Check if the request is a data setup packet */ + if (req->wLength != 0U) + { + data_length = MIN(req->wLength, PRINTER_DATA_MAX_PACKET_SIZE); + + if ((req->bmRequest & 0x80U) != 0U) + { + /* Call the User class interface function to process the command */ + APP_FOPS.Control_req(req->bRequest, CmdBuff, &data_length); + + /* Return the answer to host */ + USBD_CtrlSendData(pdev, (uint8_t *)CmdBuff, data_length); + } + else /* Host-to-Device request */ + { + /* Prepare for control data reception */ + USBD_CtrlPrepareRx(pdev, (uint8_t *)CmdBuff, data_length); + } + } + else /* No Data request */ + { + data_length = 0U; + APP_FOPS.Control_req(req->bRequest, (uint8_t *)req, &data_length); + } + + break; + } + + /* Standard Requests -------------------------------*/ + case USB_REQ_TYPE_STANDARD : + { + switch (req->bRequest) + { + case USB_REQ_GET_STATUS : + { + if (((USB_CORE_MODULE *)pdev)->dev.device_status == USB_CONFIGURED) + { + USBD_CtrlSendData(pdev, (uint8_t *)&status_info, 2U); + } + else + { + USBD_CtrlError (pdev, req); + ret = USBD_FAIL; + } + + break; + } + + case USB_REQ_GET_INTERFACE : + { + if (((USB_CORE_MODULE *)pdev)->dev.device_status == USB_CONFIGURED) + { + USBD_CtrlSendData(pdev, (uint8_t *)&USBD_PRINTER_AltSet, 1U); + } + else + { + USBD_CtrlError (pdev, req); + ret = USBD_FAIL; + } + + break; + } + + case USB_REQ_SET_INTERFACE : + { + if (((USB_CORE_MODULE *)pdev)->dev.device_status != USB_CONFIGURED) + { + USBD_CtrlError (pdev, req); + ret = USBD_FAIL; + } + + break; + } + + case USB_REQ_CLEAR_FEATURE : + break; + + default : + USBD_CtrlError(pdev, req); + ret = USBD_FAIL; + } + + break; + } + + default : + USBD_CtrlError (pdev, req); + ret = USBD_FAIL; + } + + return (uint8_t)ret; +} + +/** +*\*\name USBD_PRNTER_DataIn. +*\*\fun handle data IN Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index. +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_PRNTER_DataIn (void *pdev, uint8_t epnum) +{ + if ((((USB_CORE_MODULE *)pdev)->dev.in_ep[epnum].total_data_len > 0U) && + (((USB_CORE_MODULE *)pdev)->dev.in_ep[epnum].total_data_len % ((USB_CORE_MODULE *)pdev)->dev.in_ep[epnum].maxpacket == 0U)) + { + /* Update the packet total length */ + ((USB_CORE_MODULE *)pdev)->dev.in_ep[epnum].total_data_len = 0U; + + USBDEV_EP_Tx(pdev, epnum, NULL, 0U); + } + + return USBD_OK; +} + + +/** +*\*\name USBD_PRNTER_DataOut. +*\*\fun handle data OUT Stage. +*\*\param pdev: device instance. +*\*\param epnum: endpoint index. +*\*\return USBD_OK. +*\*\ +**/ +uint8_t USBD_PRNTER_DataOut (void *pdev, uint8_t epnum) +{ + uint16_t recv_length; + + /* Get the received data length */ + recv_length = USBD_GetRxCount(pdev, epnum); + + APP_FOPS.Receive(USB_Rx_Buffer, &recv_length); + + return USBD_OK; +} + +/** +*\*\name USBD_PRNTER_GetCfgDesc. +*\*\fun Return configuration descriptor. +*\*\param speed : current device speed +*\*\param length : pointer data length +*\*\return pointer to descriptor buffer. +*\*\ +**/ +static uint8_t *USBD_PRNTER_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_PRNT_CfgDesc); + return USBD_PRNT_CfgDesc; +} + +/** +*\*\name USBD_PRNTER_GetOtherCfgDesc. +*\*\fun Return configuration descriptor. +*\*\param speed : current device speed +*\*\param length : pointer data length +*\*\return pointer to descriptor buffer. +*\*\ +**/ +static uint8_t *USBD_PRNTER_GetOtherCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (USBD_PRNT_CfgDesc); + return USBD_PRNT_CfgDesc; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_core.h new file mode 100644 index 0000000000..8a022dbd28 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_core.h @@ -0,0 +1,78 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USBD_CORE_H__ +#define __USBD_CORE_H__ + +#include "usbhs_dcd.h" +#include "usbd_def.h" +#include "usbd_conf.h" + + +typedef enum +{ + USBD_OK = 0, + USBD_BUSY, + USBD_FAIL, +}USBD_Status; + +void USBD_Init(USB_CORE_MODULE *USBx, USB_CORE_ID_TypeDef coreID, USBD_DEVICE_DESC *pDevice, USBD_Class_cb_TypeDef *class_cb, USBD_User_cb_TypeDef *user_cb); + +USBD_Status USBD_DeInit(USB_CORE_MODULE *USBx); + +USBD_Status USBD_ClrCfg(USB_CORE_MODULE *USBx, uint8_t cfgidx); + +USBD_Status USBD_SetCfg(USB_CORE_MODULE *USBx, uint8_t cfgidx); + +#endif /* __USBD_CORE_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_def.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_def.h new file mode 100644 index 0000000000..ebfbcf36ad --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_def.h @@ -0,0 +1,124 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_def.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBD_DEF_H__ +#define __USBD_DEF_H__ + + +#include "usbd_conf.h" +#include "n32h76x_78x.h" + +#ifndef NULL +#define NULL 0 +#endif + +#define USB_LEN_DEV_QUALIFIER_DESC 0x0A +#define USB_LEN_DEV_DESC 0x12 +#define USB_LEN_CFG_DESC 0x09 +#define USB_LEN_IF_DESC 0x09 +#define USB_LEN_EP_DESC 0x07 + + +#define USBD_IDX_LANGID_STR 0x00 +#define USBD_IDX_MFC_STR 0x01 +#define USBD_IDX_PRODUCT_STR 0x02 +#define USBD_IDX_SERIAL_STR 0x03 +#define USBD_IDX_CONFIG_STR 0x04 +#define USBD_IDX_INTERFACE_STR 0x05 + +#define USB_REQ_TYPE_STANDARD 0x00 +#define USB_REQ_TYPE_CLASS 0x20 +#define USB_REQ_TYPE_VENDOR 0x40 +#define USB_REQ_TYPE_MASK 0x60 + +#define USB_REQ_RECIPIENT_DEVICE 0x00 +#define USB_REQ_RECIPIENT_INTERFACE 0x01 +#define USB_REQ_RECIPIENT_ENDPOINT 0x02 +#define USB_REQ_RECIPIENT_MASK 0x03 + +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +#define USB_DESC_TYPE_DEVICE 1 +#define USB_DESC_TYPE_CONFIGURATION 2 +#define USB_DESC_TYPE_STRING 3 +#define USB_DESC_TYPE_INTERFACE 4 +#define USB_DESC_TYPE_ENDPOINT 5 +#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 +#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 +#define USB_DESC_TYPE_BOS 0x0F + +#define USB_CONFIG_REMOTE_WAKEUP 2 +#define USB_CONFIG_SELF_POWERED 1 + +#define USB_FEATURE_EP_HALT 0 +#define USB_FEATURE_REMOTE_WAKEUP 1 +#define USB_FEATURE_TEST_MODE 2 + + +#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ + (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) + +#define LOBYTE(x) ((uint8_t)((x) & 0x00FF)) +#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00) >>8)) + +#endif /* __USBD_DEF_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_ioreq.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_ioreq.h new file mode 100644 index 0000000000..b88b48adbd --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_ioreq.h @@ -0,0 +1,78 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_ioreq.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USBD_IOREQ_H__ +#define __USBD_IOREQ_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" + + +USBD_Status USBD_CtrlSendData (USB_CORE_MODULE *USBx, uint8_t *buf, uint16_t len); + +USBD_Status USBD_CtrlContinueSendData (USB_CORE_MODULE *USBx, uint8_t *pbuf, uint16_t len); + +USBD_Status USBD_CtrlSendStatus (USB_CORE_MODULE *USBx); + +USBD_Status USBD_CtrlPrepareRx (USB_CORE_MODULE *USBx, uint8_t *pbuf, uint16_t len); + +USBD_Status USBD_CtrlContinueRx (USB_CORE_MODULE *USBx, uint8_t *pbuf, uint16_t len); + +USBD_Status USBD_CtrlReceiveStatus (USB_CORE_MODULE *USBx); + +uint16_t USBD_GetRxCount (USB_CORE_MODULE *USBx , uint8_t epnum); + + +#endif /* __USBD_IOREQ_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_req.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_req.h new file mode 100644 index 0000000000..8d7af54c46 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/inc/usbd_req.h @@ -0,0 +1,73 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_req.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USB_REQUEST_H__ +#define __USB_REQUEST_H__ + +#include "usbd_def.h" +#include "usbd_core.h" +#include "usbd_conf.h" + + +USBD_Status USBD_StdDevReq(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); +USBD_Status USBD_StdItfReq(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); +USBD_Status USBD_StdEPReq(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); +void USBD_ParseSetupRequest(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); + +void USBD_CtrlError(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); + +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); + + +#endif /* __USB_REQUEST_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_core.c new file mode 100644 index 0000000000..af10bdc884 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_core.c @@ -0,0 +1,441 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbd_core.h" +#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usbhs_dcd_int.h" +#include "usbhs_bsp.h" + +static uint8_t USBD_SetupStage(USB_CORE_MODULE *USBx); +static uint8_t USBD_DataOutStage(USB_CORE_MODULE *USBx , uint8_t epnum); +static uint8_t USBD_DataInStage(USB_CORE_MODULE *USBx , uint8_t epnum); +static uint8_t USBD_SOF(USB_CORE_MODULE *USBx); +static uint8_t USBD_Reset(USB_CORE_MODULE *USBx); +static uint8_t USBD_Suspend(USB_CORE_MODULE *USBx); +static uint8_t USBD_Resume(USB_CORE_MODULE *USBx); +static uint8_t USBD_IsoINIncomplete(USB_CORE_MODULE *USBx); +static uint8_t USBD_IsoOUTIncomplete(USB_CORE_MODULE *USBx); +static uint8_t USBD_RunTestMode (USB_CORE_MODULE *USBx) ; + +static uint8_t USBD_DevConnected(USB_CORE_MODULE *pdev); +static uint8_t USBD_DevDisconnected(USB_CORE_MODULE *pdev); + + + +USBD_DEV_INT_cb_TypeDef USBD_DEV_INT_cb = +{ + USBD_DataOutStage, + USBD_DataInStage, + USBD_SetupStage, + USBD_SOF, + USBD_Reset, + USBD_Suspend, + USBD_Resume, + USBD_IsoINIncomplete, + USBD_IsoOUTIncomplete, + USBD_DevConnected, + USBD_DevDisconnected, +}; + +USBD_DEV_INT_cb_TypeDef *USBD_DEV_INT_fops = &USBD_DEV_INT_cb; + +uint32_t SET_TEST_MODE = 0; + +/** +*\*\name USBD_Init. +*\*\fun Initializes the device stack and load the class driver. +*\*\param USBx : USB device +*\*\param pDevice: device instance +*\*\param class_cb: Class callback structure address +*\*\param user_cb: User callback structure address +*\*\return none +**/ +void USBD_Init(USB_CORE_MODULE *USBx, USB_CORE_ID_TypeDef coreID, USBD_DEVICE_DESC *pDevice, USBD_Class_cb_TypeDef *class_cb, USBD_User_cb_TypeDef *user_cb) +{ + /* Hardware Init */ + USB_BSP_Init(); + + /*Register class and user callbacks */ + USBx->dev.class_cb = class_cb; + USBx->dev.user_cb = user_cb; + USBx->dev.user_device = pDevice; + + /* Initializes the USB core*/ + USBDEV_CoreInit(USBx, coreID); + + /* Upon Init call user callback */ + USBx->dev.user_cb->Init(); + + /* Enable Interrupts */ + USB_BSP_EnableInterrupt(USBx, coreID); +} + +/** +*\*\name USBD_DeInit. +*\*\fun Re-Initialize the device library +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +USBD_Status USBD_DeInit(USB_CORE_MODULE *USBx) +{ + /* Software Init */ + return USBD_OK; +} + +/** +*\*\name USBD_SetupStage. +*\*\fun Handle the setup stage +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +static uint8_t USBD_SetupStage(USB_CORE_MODULE *USBx) +{ + USB_SETUP_REQ req; + + USBD_ParseSetupRequest(USBx , &req); + + switch (req.bmRequest & 0x1F) + { + case USB_REQ_RECIPIENT_DEVICE: + USBD_StdDevReq (USBx, &req); + break; + + case USB_REQ_RECIPIENT_INTERFACE: + USBD_StdItfReq(USBx, &req); + break; + + case USB_REQ_RECIPIENT_ENDPOINT: + USBD_StdEPReq(USBx, &req); + break; + + default: + USBDEV_EP_Stall(USBx , req.bmRequest & 0x80U); + break; + } + return USBD_OK; +} + +/** +*\*\name USBD_DataOutStage. +*\*\fun Handle data out stage +*\*\param USBx : USB device +*\*\param epnum: endpoint index +*\*\return USBD_OK +**/ +static uint8_t USBD_DataOutStage(USB_CORE_MODULE *USBx , uint8_t epnum) +{ + USB_EP *ep; + + if(epnum == 0) + { + ep = &USBx->dev.out_ep[0]; + if ( USBx->dev.device_state == USB_EP0_DATA_OUT) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + + if(USBx->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the RxSTSQLvl ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtrlContinueRx (USBx, ep->xfer_buff, MIN(ep->rem_data_len ,ep->maxpacket)); + } + else + { + if((USBx->dev.class_cb->EP0_RxReady != NULL) && (USBx->dev.device_status == USB_CONFIGURED)) + { + USBx->dev.class_cb->EP0_RxReady(USBx); + } + USBD_CtrlSendStatus(USBx); + } + } + } + else if((USBx->dev.class_cb->DataOut != NULL) && (USBx->dev.device_status == USB_CONFIGURED)) + { + USBx->dev.class_cb->DataOut(USBx, epnum); + } + + else + { + /* Do Nothing */ + } + return USBD_OK; +} + +/** +*\*\name USBD_DataInStage. +*\*\fun Handle data in stage +*\*\param USBx : USB device +*\*\param epnum: endpoint index +*\*\return USBD_OK +**/ +static uint8_t USBD_DataInStage(USB_CORE_MODULE *USBx , uint8_t epnum) +{ + USB_EP *ep; + + if(epnum == 0) + { + ep = &USBx->dev.in_ep[0]; + if ( USBx->dev.device_state == USB_EP0_DATA_IN) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + if(USBx->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the TxFifoEmpty ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtrlContinueSendData (USBx, ep->xfer_buff, ep->rem_data_len); + + /* Start the transfer */ + USBDEV_EP_PrepareRx (USBx, 0, ep->xfer_buff, 0); + } + else + { /* last packet is MPS multiple, so send ZLP packet */ + if((ep->total_data_len % ep->maxpacket == 0) &&(ep->total_data_len >= ep->maxpacket) && (ep->total_data_len < ep->ctrl_data_len )) + { + USBD_CtrlContinueSendData(USBx , ep->xfer_buff, 0); + ep->ctrl_data_len = 0; + /* Start the transfer */ + USBDEV_EP_PrepareRx (USBx, 0, ep->xfer_buff, 0); + } + else + { + if((USBx->dev.class_cb->EP0_TxSent != NULL) && (USBx->dev.device_status == USB_CONFIGURED)) + { + USBx->dev.class_cb->EP0_TxSent(USBx); + } + USBD_CtrlReceiveStatus(USBx); + } + } + } + if (USBx->dev.test_mode == 1) + { + USBD_RunTestMode(USBx); + USBx->dev.test_mode = 0; + } + } + else if((USBx->dev.class_cb->DataIn != NULL) && (USBx->dev.device_status == USB_CONFIGURED)) + { + USBx->dev.class_cb->DataIn(USBx, epnum); + } + + else + { + /* Do Nothing */ + } + return USBD_OK; +} + +/** +*\*\name USBD_RunTestMode. +*\*\fun Launch test mode process +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +static uint8_t USBD_RunTestMode (USB_CORE_MODULE *USBx) +{ + USB_WRITE_REG32(&USBx->regs.DCSR->DCTRL, SET_TEST_MODE); + return USBD_OK; +} + +/** +*\*\name USBD_Reset. +*\*\fun Handle Reset event +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +static uint8_t USBD_Reset(USB_CORE_MODULE *USBx) +{ + /* Open EP0 OUT */ + USBDEV_EP_Open(USBx, 0x00, USB_MAX_EP0_SIZE, EP_TYPE_CTRL); + /* Open EP0 IN */ + USBDEV_EP_Open(USBx, 0x80, USB_MAX_EP0_SIZE, EP_TYPE_CTRL); + + /* Upon Reset call user call back */ + USBx->dev.device_status = USB_DEFAULT; + USBx->dev.user_cb->DeviceReset(USBx->cfg.speed); + + return USBD_OK; +} + +/** +*\*\name USBD_Resume. +*\*\fun Handle Resume event +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +static uint8_t USBD_Resume(USB_CORE_MODULE *USBx) +{ + /* Upon Resume call user call back */ + USBx->dev.user_cb->DeviceResumed(); + USBx->dev.device_status = USBx->dev.device_old_status; + USBx->dev.device_status = USB_CONFIGURED; + return USBD_OK; +} + +/** +*\*\name USBD_Suspend. +*\*\fun Handle Suspend event +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +static uint8_t USBD_Suspend(USB_CORE_MODULE *USBx) +{ + USBx->dev.device_old_status = USBx->dev.device_status; + USBx->dev.device_status = USB_SUSPENDED; + /* Upon Resume call user call back */ + USBx->dev.user_cb->DeviceSuspended(); + return USBD_OK; +} + +/** +*\*\name USBD_SOF. +*\*\fun Handle SOF event +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +static uint8_t USBD_SOF(USB_CORE_MODULE *USBx) +{ + if(USBx->dev.class_cb->SOF) + { + USBx->dev.class_cb->SOF(USBx); + } + return USBD_OK; +} + +/** +*\*\name USBD_SetCfg. +*\*\fun Configure device and start the interface +*\*\param USBx : USB device +*\*\param cfgidx: configuration index +*\*\return USBD_OK +**/ +USBD_Status USBD_SetCfg(USB_CORE_MODULE *USBx, uint8_t cfgidx) +{ + USBx->dev.class_cb->Init(USBx, cfgidx); + + /* Upon set config call user call back */ + USBx->dev.user_cb->DeviceConfigured(); + return USBD_OK; +} + +/** +*\*\name USBD_ClrCfg. +*\*\fun Clear current configuration +*\*\param USBx : USB device +*\*\param cfgidx: configuration index +*\*\return USBD_OK +**/ +USBD_Status USBD_ClrCfg(USB_CORE_MODULE *USBx, uint8_t cfgidx) +{ + USBx->dev.class_cb->DeInit(USBx, cfgidx); + return USBD_OK; +} + +/** +*\*\name USBD_IsoINIncomplete. +*\*\fun Handle iso in incomplete event +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +static uint8_t USBD_IsoINIncomplete(USB_CORE_MODULE *USBx) +{ + USBx->dev.class_cb->IsoINIncomplete(USBx); + return USBD_OK; +} + +/** +*\*\name USBD_IsoOUTIncomplete. +*\*\fun Handle iso out incomplete event +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +static uint8_t USBD_IsoOUTIncomplete(USB_CORE_MODULE *USBx) +{ + USBx->dev.class_cb->IsoOUTIncomplete(USBx); + return USBD_OK; +} + +/** +*\*\name USBD_DevConnected. +*\*\fun Handle device connection event +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +static uint8_t USBD_DevConnected(USB_CORE_MODULE *USBx) +{ + USBx->dev.user_cb->DeviceConnected(); + USBx->dev.connection_status = 1; + return USBD_OK; +} + +/** +*\*\name USBD_DevDisconnected. +*\*\fun Handle device disconnection event +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +static uint8_t USBD_DevDisconnected(USB_CORE_MODULE *USBx) +{ + USBx->dev.user_cb->DeviceDisconnected(); + USBx->dev.class_cb->DeInit(USBx, 0); + USBx->dev.connection_status = 0; + return USBD_OK; +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_ioreq.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_ioreq.c new file mode 100644 index 0000000000..3b1e5d393b --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_ioreq.c @@ -0,0 +1,175 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_ioreq.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbd_ioreq.h" + +/** +*\*\name USBD_CtrlSendData. +*\*\fun send data on the ctrl pipe +*\*\param USBx : USB device +*\*\param pbuf: pointer to data buffer +*\*\param len: length of data to be sent +*\*\return USBD_OK +**/ +USBD_Status USBD_CtrlSendData (USB_CORE_MODULE *USBx, uint8_t *pbuf, uint16_t len) +{ + USBD_Status ret = USBD_OK; + + USBx->dev.in_ep[0].total_data_len = len; + USBx->dev.in_ep[0].rem_data_len = len; + USBx->dev.device_state = USB_EP0_DATA_IN; + + USBDEV_EP_Tx (USBx, 0, pbuf, len); + + return ret; +} + +/** +*\*\name USBD_CtrlContinueSendData. +*\*\fun continue sending data on the ctrl pipe +*\*\param USBx : USB device +*\*\param pbuf: pointer to data buffer +*\*\param len: length of data to be sent +*\*\return USBD_OK +**/ +USBD_Status USBD_CtrlContinueSendData (USB_CORE_MODULE *USBx, uint8_t *pbuf, uint16_t len) +{ + USBD_Status ret = USBD_OK; + + USBDEV_EP_Tx (USBx, 0, pbuf, len); + + return ret; +} + +/** +*\*\name USBD_CtrlPrepareRx. +*\*\fun receive data on the ctrl pipe +*\*\param USBx : USB device +*\*\param pbuf: pointer to data buffer +*\*\param len: length of data to be sent +*\*\return USBD_OK +**/ +USBD_Status USBD_CtrlPrepareRx (USB_CORE_MODULE *USBx, uint8_t *pbuf, uint16_t len) +{ + USBD_Status ret = USBD_OK; + + USBx->dev.out_ep[0].total_data_len = len; + USBx->dev.out_ep[0].rem_data_len = len; + USBx->dev.device_state = USB_EP0_DATA_OUT; + + USBDEV_EP_PrepareRx (USBx, 0, pbuf, len); + + return ret; +} + +/** +*\*\name USBD_CtrlContinueRx. +*\*\fun continue receive data on the ctrl pipe +*\*\param USBx : USB device +*\*\param pbuf: pointer to data buffer +*\*\param len: length of data to be sent +*\*\return USBD_OK +**/ +USBD_Status USBD_CtrlContinueRx (USB_CORE_MODULE *USBx, uint8_t *pbuf, uint16_t len) +{ + USBD_Status ret = USBD_OK; + + USBDEV_EP_PrepareRx (USBx, 0, pbuf, len); + return ret; +} + +/** +*\*\name USBD_CtrlSendStatus. +*\*\fun send zero length packet on the ctrl pipe +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +USBD_Status USBD_CtrlSendStatus (USB_CORE_MODULE *USBx) +{ + USBD_Status ret = USBD_OK; + USBx->dev.device_state = USB_EP0_STATUS_IN; + USBDEV_EP_Tx (USBx, 0, USBx->dev.out_ep[0].xfer_buff, 0); + + USB_EP0_OutStart(USBx); + + return ret; +} + +/** +*\*\name USBD_CtrlReceiveStatus. +*\*\fun receive zero length packet on the ctrl pipe +*\*\param USBx : USB device +*\*\return USBD_OK +**/ +USBD_Status USBD_CtrlReceiveStatus (USB_CORE_MODULE *USBx) +{ + USBD_Status ret = USBD_OK; + USBx->dev.device_state = USB_EP0_STATUS_OUT; + USBDEV_EP_PrepareRx ( USBx, 0, USBx->dev.setup_packet, 0); + + USB_EP0_OutStart(USBx); + + return ret; +} + +/** +*\*\name USBD_GetRxCount. +*\*\fun returns the received data length +*\*\param USBx : USB device +*\*\param epnum: endpoint index +*\*\return USBD_OK +**/ +uint16_t USBD_GetRxCount (USB_CORE_MODULE *USBx , uint8_t epnum) +{ + return USBx->dev.out_ep[epnum].xfer_count; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_req.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_req.c new file mode 100644 index 0000000000..03822cc62c --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/device/core/src/usbd_req.c @@ -0,0 +1,758 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbd_req.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usbd_desc.h" + + +#ifdef USB_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_ep_status __ALIGN_END = 0; + +#ifdef USB_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_default_cfg __ALIGN_END = 0; + +#ifdef USB_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_cfg_status __ALIGN_END = 0; + + +static void USBD_GetDescriptor(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); +static void USBD_SetAddress(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); +static void USBD_SetConfig(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); +static void USBD_GetConfig(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); +static void USBD_GetStatus(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); +static void USBD_SetFeature(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); +static void USBD_ClrFeature(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req); +static uint8_t USBD_GetLen(uint8_t *buf); + +extern uint32_t SET_TEST_MODE; + +/** +*\*\name USBD_StdDevReq. +*\*\fun Handle standard usb device requests +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return USBD_OK +**/ +USBD_Status USBD_StdDevReq (USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + USBD_GetDescriptor (USBx, req) ; + break; + + case USB_REQ_SET_ADDRESS: + USBD_SetAddress(USBx, req); + break; + + case USB_REQ_SET_CONFIGURATION: + USBD_SetConfig (USBx , req); + break; + + case USB_REQ_GET_CONFIGURATION: + USBD_GetConfig (USBx , req); + break; + + case USB_REQ_GET_STATUS: + USBD_GetStatus (USBx , req); + break; + + case USB_REQ_SET_FEATURE: + USBD_SetFeature (USBx , req); + break; + + case USB_REQ_CLEAR_FEATURE: + USBD_ClrFeature (USBx , req); + break; + + default: + USBD_CtrlError(USBx , req); + break; + } + return ret; +} + +/** +*\*\name USBD_StdItfReq. +*\*\fun Handle standard usb interface requests +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return USBD_OK +**/ +USBD_Status USBD_StdItfReq(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (USBx->dev.device_status) + { + case USB_CONFIGURED: + if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM) + { + USBx->dev.class_cb->Setup (USBx, req); + if((req->wLength == 0) && (ret == USBD_OK)) + { + USBD_CtrlSendStatus(USBx); + } + } + else + { + USBD_CtrlError(USBx , req); + } + break; + + default: + USBD_CtrlError(USBx , req); + break; + } + return ret; +} + +/** +*\*\name USBD_StdEPReq. +*\*\fun Handle standard usb endpoint requests +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return USBD_OK +**/ +USBD_Status USBD_StdEPReq(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + uint8_t ep_addr; + USBD_Status ret = USBD_OK; + + ep_addr = LOBYTE(req->wIndex); + + /* Check the class specific requests before going to standard request */ + if ((req->bmRequest & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_CLASS) + { + USBx->dev.class_cb->Setup (USBx, req); + return ret; + } + + switch (req->bRequest) + { + case USB_REQ_SET_FEATURE : + switch (USBx->dev.device_status) + { + case USB_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + USBDEV_EP_Stall(USBx , ep_addr); + } + break; + + case USB_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + USBDEV_EP_Stall(USBx , ep_addr); + } + } + USBx->dev.class_cb->Setup(USBx, req); + USBD_CtrlSendStatus(USBx); + break; + + default: + USBD_CtrlError(USBx , req); + break; + } + break; + + case USB_REQ_CLEAR_FEATURE : + + switch (USBx->dev.device_status) + { + case USB_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + USBDEV_EP_Stall(USBx , ep_addr); + } + break; + + case USB_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + USBDEV_EP_ClrStall(USBx , ep_addr); + USBx->dev.class_cb->Setup (USBx, req); + } + USBD_CtrlSendStatus(USBx); + } + break; + + default: + USBD_CtrlError(USBx , req); + break; + } + break; + + case USB_REQ_GET_STATUS: + switch (USBx->dev.device_status) + { + case USB_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + USBDEV_EP_Stall(USBx , ep_addr); + } + break; + + case USB_CONFIGURED: + if ((ep_addr & 0x80)== 0x80) + { + if(USBx->dev.in_ep[ep_addr & 0x7F].is_stall) + { + USBD_ep_status = 0x0001; + } + else + { + USBD_ep_status = 0x0000; + } + } + else if ((ep_addr & 0x80)== 0x00) + { + if(USBx->dev.out_ep[ep_addr].is_stall) + { + USBD_ep_status = 0x0001; + } + else + { + USBD_ep_status = 0x0000; + } + } + else + { + /* Do Nothing */ + } + USBD_CtrlSendData (USBx, (uint8_t *)&USBD_ep_status, 2); + break; + + default: + USBD_CtrlError(USBx , req); + break; + } + break; + + default: + break; + } + return ret; +} + +/** +*\*\name USBD_GetDescriptor. +*\*\fun Handle standard usb Descriptor requests +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return USBD_OK +**/ +static void USBD_GetDescriptor(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + uint16_t len; + uint8_t *pbuf; + len = req->wLength ; + + switch (req->wValue >> 8) + { +#if (USBD_LPM_ENABLED == 1) + case USB_DESC_TYPE_BOS: + pbuf = USBx->pDesc->GetBOSDescriptor(USBx->dev_speed, &len); + break; +#endif + case USB_DESC_TYPE_DEVICE: + pbuf = USBx->dev.user_device->GetDeviceDescriptor(USBx->cfg.speed, &len); + break; + + case USB_DESC_TYPE_CONFIGURATION: + pbuf = (uint8_t *)USBx->dev.class_cb->GetConfigDescriptor(USBx->cfg.speed, &len); + if(USBx->cfg.speed == USB_SPEED_FULL) + { + pbuf = (uint8_t *)USBx->dev.class_cb->GetOtherConfigDescriptor(USBx->cfg.speed, &len); + } + pbuf[1] = USB_DESC_TYPE_CONFIGURATION; + USBx->dev.pConfig_descriptor = pbuf; + break; + + case USB_DESC_TYPE_STRING: + switch ((uint8_t)(req->wValue)) + { + case USBD_IDX_LANGID_STR: + pbuf = USBx->dev.user_device->GetLangIDStrDescriptor(USBx->cfg.speed, &len); + break; + + case USBD_IDX_MFC_STR: + pbuf = USBx->dev.user_device->GetManufacturerStrDescriptor(USBx->cfg.speed, &len); + break; + + case USBD_IDX_PRODUCT_STR: + pbuf = USBx->dev.user_device->GetProductStrDescriptor(USBx->cfg.speed, &len); + break; + + case USBD_IDX_SERIAL_STR: + pbuf = USBx->dev.user_device->GetSerialStrDescriptor(USBx->cfg.speed, &len); + break; + + case USBD_IDX_CONFIG_STR: + pbuf = USBx->dev.user_device->GetConfigurationStrDescriptor(USBx->cfg.speed, &len); + break; + + case USBD_IDX_INTERFACE_STR: + pbuf = USBx->dev.user_device->GetInterfaceStrDescriptor(USBx->cfg.speed, &len); + break; + + default: +#ifdef USB_SUPPORT_USER_STRING_DESC + pbuf = USBx->dev.class_cb->GetUserStrDescriptor(USBx->cfg.speed, (req->wValue) , &len); + break; +#else + USBD_CtrlError(USBx , req); + return; +#endif /* USBD_CtrlError(USBx , req)*/ + } + break; + case USB_DESC_TYPE_DEVICE_QUALIFIER: + if(USBx->cfg.speed == USB_SPEED_HIGH) + { + pbuf = (uint8_t *)USBx->dev.class_cb->GetConfigDescriptor(USBx->cfg.speed, &len); + + USBD_DeviceQualifierDesc[4]= pbuf[14]; + USBD_DeviceQualifierDesc[5]= pbuf[15]; + USBD_DeviceQualifierDesc[6]= pbuf[16]; + + pbuf = USBD_DeviceQualifierDesc; + len = USB_LEN_DEV_QUALIFIER_DESC; + break; + } + else + { + USBD_CtrlError(USBx , req); + return; + } + case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: + if(USBx->cfg.speed == USB_SPEED_HIGH) + { + pbuf = (uint8_t *)USBx->dev.class_cb->GetOtherConfigDescriptor(USBx->cfg.speed, &len); + pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; + break; + } + else + { + USBD_CtrlError(USBx , req); + return; + } + + default: + USBD_CtrlError(USBx , req); + + return; + } + if((len != 0)&& (req->wLength != 0)) + { + len = MIN(len , req->wLength); + USBD_CtrlSendData (USBx, pbuf, len); + } +} + +/** +*\*\name USBD_SetAddress. +*\*\fun Set device address +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return none +**/ +static void USBD_SetAddress(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + uint8_t dev_addr; + + if ((req->wIndex == 0) && (req->wLength == 0)) + { + dev_addr = (uint8_t)(req->wValue) & 0x7F; + + if (USBx->dev.device_status == USB_CONFIGURED) + { + USBD_CtrlError(USBx , req); + } + else + { + USBx->dev.device_address = dev_addr; + USBDEV_EP_SetAddress(USBx, dev_addr); + USBD_CtrlSendStatus(USBx); + + if (dev_addr != 0) + { + USBx->dev.device_status = USB_ADDRESSED; + } + else + { + USBx->dev.device_status = USB_DEFAULT; + } + } + } + else + { + USBD_CtrlError(USBx , req); + } +} + +/** +*\*\name USBD_SetConfig. +*\*\fun Handle Set device configuration request +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return none +**/ +static void USBD_SetConfig(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + static uint8_t cfgidx; + + cfgidx = (uint8_t)(req->wValue); + + if (cfgidx > USBD_CFG_MAX_NUM ) + { + USBD_CtrlError(USBx , req); + } + else + { + switch (USBx->dev.device_status) + { + case USB_ADDRESSED: + if (cfgidx) + { + USBx->dev.device_config = cfgidx; + USBx->dev.device_status = USB_CONFIGURED; + USBD_SetCfg(USBx, cfgidx); + USBD_CtrlSendStatus(USBx); + } + else + { + USBD_CtrlSendStatus(USBx); + } + break; + + case USB_CONFIGURED: + if (cfgidx == 0) + { + USBx->dev.device_status = USB_ADDRESSED; + USBx->dev.device_config = cfgidx; + USBD_ClrCfg(USBx, cfgidx); + USBD_CtrlSendStatus(USBx); + } + else if (cfgidx != USBx->dev.device_config) + { + /* Clear old configuration */ + USBD_ClrCfg(USBx, USBx->dev.device_config); + + /* set new configuration */ + USBx->dev.device_config = cfgidx; + USBD_SetCfg(USBx, cfgidx); + USBD_CtrlSendStatus(USBx); + } + else + { + USBD_CtrlSendStatus(USBx); + } + break; + + default: + USBD_CtrlError(USBx , req); + break; + } + } +} + +/** +*\*\name USBD_GetConfig. +*\*\fun Handle Get device configuration request +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return none +**/ +static void USBD_GetConfig(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + if (req->wLength != 1) + { + USBD_CtrlError(USBx , req); + } + else + { + switch (USBx->dev.device_status ) + { + case USB_ADDRESSED: + USBD_CtrlSendData (USBx, (uint8_t *)&USBD_default_cfg, 1); + break; + + case USB_CONFIGURED: + USBD_CtrlSendData (USBx, &USBx->dev.device_config, 1); + break; + + default: + USBD_CtrlError(USBx , req); + break; + } + } +} + +/** +*\*\name USBD_GetStatus. +*\*\fun Handle Get Status request +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return none +**/ +static void USBD_GetStatus(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + switch (USBx->dev.device_status) + { + case USB_ADDRESSED: + case USB_CONFIGURED: + +#ifdef USBD_SELF_POWERED + USBD_cfg_status = USB_CONFIG_SELF_POWERED; +#else + USBD_cfg_status = 0x00; +#endif + + if (USBx->dev.DevRemoteWakeup) + { + USBD_cfg_status |= USB_CONFIG_REMOTE_WAKEUP; + } + + USBD_CtrlSendData (USBx, (uint8_t *)&USBD_cfg_status, 2); + break; + + default : + USBD_CtrlError(USBx, req); + break; + } +} + +/** +*\*\name USBD_SetFeature. +*\*\fun Handle Set Status request +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return none +**/ +static void USBD_SetFeature(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + uint32_t dctl; + uint8_t test_mode = 0; + + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + USBx->dev.DevRemoteWakeup = 1; + USBx->dev.class_cb->Setup (USBx, req); + USBD_CtrlSendStatus(USBx); + } + + else if ((req->wValue == USB_FEATURE_TEST_MODE) && ((req->wIndex & 0xFF) == 0)) + { + dctl = USB_READ_REG32(&USBx->regs.DCSR->DCTRL); + + test_mode = req->wIndex >> 8; + switch (test_mode) + { + case 1: /* TEST_J */ + dctl |= 1<<4; + break; + + case 2: /* TEST_K */ + dctl |= 2<<4; + break; + + case 3: /* TEST_SE0_NAK */ + dctl |= 3<<4; + break; + + case 4: /* TEST_PACKET */ + dctl |= 4<<4; + break; + + case 5: /* TEST_FORCE_ENABLE */ + dctl |= 5<<4; + break; + + default : + dctl |= 1<<4; + break; + } + USB_WRITE_REG32(&USBx->regs.DCSR->DCTRL, dctl); + SET_TEST_MODE = dctl; + USBx->dev.test_mode = 1; + USBD_CtrlSendStatus(USBx); + } + else + { + /* Do Nothing */ + } +} + +/** +*\*\name USBD_ClrFeature. +*\*\fun Handle clear device feature request +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return none +**/ +static void USBD_ClrFeature(USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + switch (USBx->dev.device_status) + { + case USB_ADDRESSED: + case USB_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + USBx->dev.DevRemoteWakeup = 0; + USBx->dev.class_cb->Setup (USBx, req); + USBD_CtrlSendStatus(USBx); + } + break; + + default : + USBD_CtrlError(USBx , req); + break; + } +} + +/** +*\*\name USBD_ParseSetupRequest. +*\*\fun Copy buffer into setup structure +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return none +**/ +void USBD_ParseSetupRequest( USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + req->bmRequest = *(uint8_t *) (USBx->dev.setup_packet); + req->bRequest = *(uint8_t *) (USBx->dev.setup_packet + 1); + req->wValue = SWAPBYTE (USBx->dev.setup_packet + 2); + req->wIndex = SWAPBYTE (USBx->dev.setup_packet + 4); + req->wLength = SWAPBYTE (USBx->dev.setup_packet + 6); + + USBx->dev.in_ep[0].ctrl_data_len = req->wLength ; + USBx->dev.device_state = USB_EP0_SETUP; +} + +/** +*\*\name USBD_CtrlError. +*\*\fun Handle USB low level Error +*\*\param USBx : USB device +*\*\param req: usb request +*\*\return none +**/ +void USBD_CtrlError( USB_CORE_MODULE *USBx, USB_SETUP_REQ *req) +{ + USBDEV_EP_Stall(USBx , 0x80); + USBDEV_EP_Stall(USBx , 0); + USB_EP0_OutStart(USBx); +} + +/** +*\*\name USBD_GetString. +*\*\fun Convert Ascii string into unicode one +*\*\param desc : descriptor buffer +*\*\param unicode : Formatted string buffer (unicode) +*\*\param len : descriptor length +*\*\return none +**/ +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) +{ + uint8_t idx = 0; + + if (desc != NULL) + { + *len = USBD_GetLen(desc) * 2 + 2; + unicode[idx++] = *len; + unicode[idx++] = USB_DESC_TYPE_STRING; + + while (*desc != '\0') + { + unicode[idx++] = *desc++; + unicode[idx++] = 0x00; + } + } +} + +/** +*\*\name USBD_GetLen. +*\*\fun return the string length +*\*\param buf : pointer to the ascii string buffer +*\*\return string length +**/ +static uint8_t USBD_GetLen(uint8_t *buf) +{ + uint8_t len = 0; + + while (*buf != '\0') + { + len++; + buf++; + } + + return len; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_core.h new file mode 100644 index 0000000000..78d0ea719f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_core.h @@ -0,0 +1,344 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBHS_CORE_H__ +#define __USBHS_CORE_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usbhs_conf.h" +#include "usbhs_regs.h" +#include "usbhs_defines.h" + + +#define USB_EP0_IDLE 0 +#define USB_EP0_SETUP 1 +#define USB_EP0_DATA_IN 2 +#define USB_EP0_DATA_OUT 3 +#define USB_EP0_STATUS_IN 4 +#define USB_EP0_STATUS_OUT 5 +#define USB_EP0_STALL 6 + +#define USB_EP_TX_DIS 0x0000 +#define USB_EP_TX_STALL 0x0010 +#define USB_EP_TX_NAK 0x0020 +#define USB_EP_TX_VALID 0x0030 + +#define USB_EP_RX_DIS 0x0000 +#define USB_EP_RX_STALL 0x1000 +#define USB_EP_RX_NAK 0x2000 +#define USB_EP_RX_VALID 0x3000 + +#define MAX_DATA_LENGTH 0x200 + + +typedef enum +{ + USB_OK = 0, + USB_FAIL +}USB_STS; + +typedef enum +{ + HCH_IDLE = 0, + HCH_XFRC, + HCH_HALTED, + HCH_NAK, + HCH_NYET, + HCH_STALL, + HCH_XACTERR, + HCH_BBLERR, + HCH_DATATGLERR, +}HCH_STATUS; /* USB Host channel status */ + +typedef enum +{ + URB_IDLE = 0, + URB_DONE, + URB_NOTREADY, + URB_ERROR, + URB_STALL +}URB_STATE; /* USB Request Block */ + +typedef enum +{ + CTRL_START = 0, + CTRL_XFRC, + CTRL_HALTED, + CTRL_NAK, + CTRL_STALL, + CTRL_XACTERR, + CTRL_BBLERR, + CTRL_DATATGLERR, + CTRL_FAIL +}CTRL_STATUS; + + +typedef struct +{ + uint8_t dev_addr; + uint8_t ep_num; + uint8_t ep_is_in; + uint8_t speed; + uint8_t do_ping; + uint8_t ep_type; + uint16_t max_packet; + uint8_t data_pid; + uint8_t *xfer_buff; + uint32_t xfer_len; + uint32_t xfer_count; + uint8_t toggle_in; + uint8_t toggle_out; + uint32_t dma_addr; +}USB_HCH; + +typedef struct +{ + uint8_t num; + uint8_t is_in; + uint8_t is_stall; + uint8_t type; + uint8_t data_pid_start; + uint8_t even_odd_frame; + uint16_t tx_fifo_num; + uint32_t maxpacket; + /* transaction level variables*/ + uint8_t *xfer_buff; + uint32_t dma_addr; + uint32_t xfer_len; + uint32_t xfer_count; + /* Transfer level variables*/ + uint32_t rem_data_len; + uint32_t total_data_len; + uint32_t ctrl_data_len; +}USB_EP; + + +typedef struct +{ + uint8_t host_channels_num; + uint8_t dev_endpoints_num; + uint8_t speed; + uint8_t dma_enable; + uint16_t mps; + uint16_t TotalFifoSize; + uint8_t low_power; + uint8_t Reseved[3]; +}USB_CORE_CFGS; + + +typedef struct +{ + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +}USB_SETUP_REQ; + +typedef struct +{ + uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length); +} USBD_DEVICE_DESC; + +typedef struct +{ + uint8_t (*Init) (void *USBx, uint8_t cfgidx); + uint8_t (*DeInit) (void *USBx, uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup) (void *USBx, USB_SETUP_REQ *req); + uint8_t (*EP0_TxSent) (void *USBx); + uint8_t (*EP0_RxReady) (void *USBx); + /* Class Specific Endpoints*/ + uint8_t (*DataIn) (void *USBx, uint8_t epnum); + uint8_t (*DataOut) (void *USBx, uint8_t epnum); + uint8_t (*SOF) (void *USBx); + uint8_t (*IsoINIncomplete) (void *USBx); + uint8_t (*IsoOUTIncomplete) (void *USBx); + uint8_t *(*GetConfigDescriptor)( uint8_t speed, uint16_t *length); + uint8_t *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length); + +#ifdef USB_SUPPORT_USER_STRING_DESC + uint8_t *(*GetUserStrDescriptor)( uint8_t speed,uint8_t index, uint16_t *length); +#endif +} USBD_Class_cb_TypeDef; + + +typedef struct +{ + void (*Init)(void); + void (*DeviceReset)(uint8_t speed); + void (*DeviceConfigured)(void); + void (*DeviceSuspended)(void); + void (*DeviceResumed)(void); + void (*DeviceConnected)(void); + void (*DeviceDisconnected)(void); +}USBD_User_cb_TypeDef; + +typedef struct +{ + uint8_t device_config; + uint8_t device_state; + uint8_t device_status; + uint8_t device_old_status; + uint8_t device_address; + uint8_t connection_status; + uint8_t test_mode; + uint32_t DevRemoteWakeup; + USB_EP in_ep[USB_MAX_TX_FIFOS]; + USB_EP out_ep[USB_MAX_TX_FIFOS]; + uint8_t setup_packet[24]; + USBD_Class_cb_TypeDef *class_cb; + USBD_User_cb_TypeDef *user_cb; + USBD_DEVICE_DESC *user_device; + uint8_t *pConfig_descriptor; +}USB_DEV; + + +typedef struct +{ + uint8_t Rx_Buffer [MAX_DATA_LENGTH]; + __IO uint32_t ConnSts; + __IO uint32_t PortEnabled; + __IO uint32_t ErrCnt[USB_MAX_TX_FIFOS]; + __IO uint32_t XferCnt[USB_MAX_TX_FIFOS]; + __IO HCH_STATUS HCH_Status[USB_MAX_TX_FIFOS]; + __IO URB_STATE URB_State[USB_MAX_TX_FIFOS]; + USB_HCH hch[USB_MAX_TX_FIFOS]; + uint16_t channel[USB_MAX_TX_FIFOS]; +}USB_HOST; + + +typedef struct +{ + USB_CORE_CFGS cfg; + USB_Register regs; + +#ifdef USE_DEVICE_MODE + USB_DEV dev; +#endif +#ifdef USE_HOST_MODE + USB_HOST host; +#endif +}USB_CORE_MODULE; + + +USB_STS USB_BasicInit(USB_CORE_MODULE *USBx, USB_CORE_ID_TypeDef coreID); +USB_STS USB_CoreInit(USB_CORE_MODULE *USBx); + +USB_STS USB_EnableGlobalInt(USB_CORE_MODULE *USBx, FunctionalState cmd); + +void* USB_ReadPacket(USB_CORE_MODULE *USBx , uint8_t *dest, uint16_t len); +USB_STS USB_WritePacket(USB_CORE_MODULE *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len); +USB_STS USB_FlushTxFifo(USB_CORE_MODULE *USBx , uint32_t num); +USB_STS USB_FlushRxFifo(USB_CORE_MODULE *USBx); + +uint32_t USB_ReadCoreItr(USB_CORE_MODULE *USBx); +uint8_t USB_IsHostMode(USB_CORE_MODULE *USBx); +uint8_t USB_IsDeviceMode(USB_CORE_MODULE *USBx); +uint32_t USB_GetMode(USB_CORE_MODULE *USBx); +USB_STS USB_PhyInit(USB_CORE_MODULE *USBx); +USB_STS USB_SetCurrentMode(USB_CORE_MODULE *USBx, uint8_t mode); + +/*********************** HOST APIs ********************************************/ +#ifdef USE_HOST_MODE +USB_STS USB_CoreInitHost(USB_CORE_MODULE *USBx); +USB_STS USB_EnableHostInt(USB_CORE_MODULE *USBx); +USB_STS USB_HCH_Init(USB_CORE_MODULE *USBx, uint8_t hch_num); +USB_STS USB_HCH_Halt(USB_CORE_MODULE *USBx, uint8_t hch_num); +USB_STS USB_HCH_StartXfer(USB_CORE_MODULE *USBx, uint8_t hch_num); +USB_STS USB_HCH_DoPing(USB_CORE_MODULE *USBx , uint8_t hch_num); + +uint32_t USB_ReadHostAllChannels_intr(USB_CORE_MODULE *USBx); +uint32_t USB_ResetPort(USB_CORE_MODULE *USBx); +uint32_t USB_ReadHPCS(USB_CORE_MODULE *USBx); +void USB_DriveVbus(USB_CORE_MODULE *USBx, uint8_t state); +void USB_InitFSLSPClkSel(USB_CORE_MODULE *USBx ,uint8_t freq); +uint8_t USB_IsEvenFrame(USB_CORE_MODULE *USBx) ; +void USB_StopHost(USB_CORE_MODULE *USBx); +#endif + +/********************* DEVICE APIs ********************************************/ +#ifdef USE_DEVICE_MODE +USB_STS USB_CoreInitDev(USB_CORE_MODULE *USBx); +USB_STS USB_EnableDevInt(USB_CORE_MODULE *USBx); +uint32_t USB_ReadDevAllInEPItr(USB_CORE_MODULE *USBx); +enum USB_SPEED USB_GetDeviceSpeed(USB_CORE_MODULE *USBx); +USB_STS USB_EP0Activate (USB_CORE_MODULE *USBx); +USB_STS USB_EPActivate (USB_CORE_MODULE *USBx, USB_EP *ep); +USB_STS USB_EPDeactivate(USB_CORE_MODULE *USBx, USB_EP *ep); +USB_STS USB_EPStartXfer (USB_CORE_MODULE *USBx, USB_EP *ep); +USB_STS USB_EP0StartXfer(USB_CORE_MODULE *USBx, USB_EP *ep); +USB_STS USB_EPSetStall(USB_CORE_MODULE *USBx, USB_EP *ep); +USB_STS USB_EPClearStall(USB_CORE_MODULE *USBx, USB_EP *ep); +uint32_t USB_ReadDevAllOutEp_itr(USB_CORE_MODULE *USBx); +uint32_t USB_ReadDevOutEP_itr(USB_CORE_MODULE *USBx, uint8_t epnum); +uint32_t USB_ReadDevAllInEPItr(USB_CORE_MODULE *USBx); +uint32_t USB_ReadDevEachInEPItr(USB_CORE_MODULE *USBx); +uint32_t USB_ReadDevEachOutEPItr(USB_CORE_MODULE *USBx); +void USB_InitDevSpeed(USB_CORE_MODULE *USBx, uint8_t speed); +uint8_t USBH_IsEvenFrame(USB_CORE_MODULE *USBx); +void USB_EP0_OutStart(USB_CORE_MODULE *USBx); +void USB_ActiveRemoteWakeup(USB_CORE_MODULE *USBx); +void USB_UngateClock(USB_CORE_MODULE *USBx); +void USB_StopDevice(USB_CORE_MODULE *USBx); +void USB_SetEPStatus(USB_CORE_MODULE *USBx, USB_EP *ep, uint32_t Status); +uint32_t USB_GetEPStatus(USB_CORE_MODULE *USBx ,USB_EP *ep); +#endif + +#endif /* __USBHS_CORE_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_dcd.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_dcd.h new file mode 100644 index 0000000000..5e0529431a --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_dcd.h @@ -0,0 +1,100 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_dcd.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBHS_DEV_H__ +#define __USBHS_DEV_H__ + +#include "usbhs_core.h" + +#define USB_EP_CONTROL 0 +#define USB_EP_ISOC 1 +#define USB_EP_BULK 2 +#define USB_EP_INT 3 +#define USB_EP_MASK 3 + +/* Device Status */ +#define USB_DEFAULT 1 +#define USB_ADDRESSED 2 +#define USB_CONFIGURED 3 +#define USB_SUSPENDED 4 + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +}EP_DESCRIPTOR; + +void USBDEV_CoreInit(USB_CORE_MODULE *USBx, USB_CORE_ID_TypeDef coreID); + +void USBDEV_DevConnect(USB_CORE_MODULE *USBx); +void USBDEV_DevDisconnect(USB_CORE_MODULE *USBx); + +void USBDEV_EP_SetAddress(USB_CORE_MODULE *USBx, uint8_t address); +uint32_t USBDEV_EP_Open(USB_CORE_MODULE *USBx , uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type); +uint32_t USBDEV_EP_Close(USB_CORE_MODULE *USBx, uint8_t ep_addr); +uint32_t USBDEV_EP_PrepareRx(USB_CORE_MODULE *USBx, uint8_t ep_addr, uint8_t *pbuf, uint16_t buf_len); +uint32_t USBDEV_EP_Tx (USB_CORE_MODULE *USBx, uint8_t ep_addr, uint8_t *pbuf, uint32_t buf_len); +uint32_t USBDEV_EP_Stall (USB_CORE_MODULE *USBx, uint8_t epnum); +uint32_t USBDEV_EP_ClrStall (USB_CORE_MODULE *USBx, uint8_t epnum); +uint32_t USBDEV_EP_Flush(USB_CORE_MODULE *USBx, uint8_t epnum); + +uint32_t USBDEV_Handle_ISTR(USB_CORE_MODULE *USBx); +uint32_t USBDEV_GetEPStatus(USB_CORE_MODULE *USBx, uint8_t epnum); + +void USBDEV_SetEPStatus(USB_CORE_MODULE *USBx , uint8_t epnum , uint32_t Status); + +#endif /* __USBHS_DEV_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_dcd_int.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_dcd_int.h new file mode 100644 index 0000000000..d3f4d76aea --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_dcd_int.h @@ -0,0 +1,84 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_dcd_int.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBHS_DEV_INT_H__ +#define __USBHS_DEV_INT_H__ + + +#include "usbhs_dcd.h" + +typedef struct _USBD_DEV_INT +{ + uint8_t (* DataOutStage) (USB_CORE_MODULE *USBx , uint8_t epnum); + uint8_t (* DataInStage) (USB_CORE_MODULE *USBx , uint8_t epnum); + uint8_t (* SetupStage) (USB_CORE_MODULE *USBx); + uint8_t (* SOF) (USB_CORE_MODULE *USBx); + uint8_t (* Reset) (USB_CORE_MODULE *USBx); + uint8_t (* Suspend) (USB_CORE_MODULE *USBx); + uint8_t (* Resume) (USB_CORE_MODULE *USBx); + uint8_t (* IsoINIncomplete) (USB_CORE_MODULE *USBx); + uint8_t (* IsoOUTIncomplete) (USB_CORE_MODULE *USBx); + + uint8_t (* DevConnected) (USB_CORE_MODULE *USBx); + uint8_t (* DevDisconnected) (USB_CORE_MODULE *USBx); + +}USBD_DEV_INT_cb_TypeDef; + +extern USBD_DEV_INT_cb_TypeDef *USBD_DEV_INT_fops; + +uint32_t USBD_ISTR_Handler(USB_CORE_MODULE *USBx); +void USBD_ISTR_WKUP_handler(USB_CORE_MODULE *USBx); +void USBD_EP_OUT_ISTR_Handler(USB_CORE_MODULE *USBx); +void USBD_EP_IN_ISTR_Handler(USB_CORE_MODULE *USBx); + +#endif /* __USBHS_DEV_INT_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_defines.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_defines.h new file mode 100644 index 0000000000..abee0df2ae --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_defines.h @@ -0,0 +1,174 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_defines.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBHS_DEF_H__ +#define __USBHS_DEF_H__ + +#include "usbhs_conf.h" + + +#define USB_SPEED_PARAM_HIGH 0 +#define USB_SPEED_PARAM_HIGH_IN_FULL 1 + +#define USB_EMBEDDED_PHY 1 + +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GAHBCFG_GLBINT_ENABLE 1 +#define GAHBCFG_INT_DMA_BURST_SINGLE 0 +#define GAHBCFG_INT_DMA_BURST_INCR 1 +#define GAHBCFG_INT_DMA_BURST_INCR4 3 +#define GAHBCFG_INT_DMA_BURST_INCR8 5 +#define GAHBCFG_INT_DMA_BURST_INCR16 7 +#define GAHBCFG_DMAENABLE 1 +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GRXSTS_PKTSTS_IN 2 +#define GRXSTS_PKTSTS_IN_XFER_COMP 3 +#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5 +#define GRXSTS_PKTSTS_CH_HALTED 7 + + +#define A_HOST 1 +#define A_SUSPEND 2 +#define A_PERIPHERAL 3 +#define B_PERIPHERAL 4 +#define B_HOST 5 +#define DEVICE_MODE 0 +#define HOST_MODE 1 +#define OTG_MODE 2 + +#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0 +#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1 +#define DSTS_ENUMSPD_LS_PHY_6MHZ 2 +#define DSTS_ENUMSPD_FS_PHY_48MHZ 3 + +#define DCFG_FRAME_INTERVAL_80 0 +#define DCFG_FRAME_INTERVAL_85 1 +#define DCFG_FRAME_INTERVAL_90 2 +#define DCFG_FRAME_INTERVAL_95 3 + +#define DEP0CTRL_MPS_64 0 +#define DEP0CTRL_MPS_32 1 +#define DEP0CTRL_MPS_16 2 +#define DEP0CTRL_MPS_8 3 + +#define EP_SPEED_LOW 0 +#define EP_SPEED_FULL 1 +#define EP_SPEED_HIGH 2 + +#define EP_TYPE_CTRL 0 +#define EP_TYPE_ISOC 1 +#define EP_TYPE_BULK 2 +#define EP_TYPE_INTR 3 +#define EP_TYPE_MSK 3 + +#define STS_GOUT_NAK 1 +#define STS_DATA_UPDT 2 +#define STS_XFER_COMP 3 +#define STS_SETUP_COMP 4 +#define STS_SETUP_UPDT 6 + +#define HCH_PID_DATA0 0 +#define HCH_PID_DATA2 1 +#define HCH_PID_DATA1 2 +#define HCH_PID_SETUP 3 + +#define HPCS_PRTSPD_HIGH_SPEED 0 +#define HPCS_PRTSPD_FULL_SPEED 1 +#define HPCS_PRTSPD_LOW_SPEED 2 + +#define HCFG_30_60_MHZ 0 +#define HCFG_48_MHZ 1 +#define HCFG_6_MHZ 2 + +#define HCHCTRL_CTRL 0 +#define HCHCTRL_ISOC 1 +#define HCHCTRL_BULK 2 +#define HCHCTRL_INTR 3 + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +typedef enum +{ + USBHS1_CORE_ID = 0, + USBHS2_CORE_ID = 1 +}USB_CORE_ID_TypeDef; + +typedef enum +{ + USB_ENUM_HS = 0, + USB_ENUM_FS = 1 +}USB_ENUM_CORE; + + +#define USB_READ_REG32(REG) (*(__IO uint32_t *)(REG)) +#define USB_WRITE_REG32(REG, VAL) (*(__IO uint32_t *)(REG) = (VAL)) +#define USB_MODIFY_REG32(REG, clear_mask, set_mask) USB_WRITE_REG32((REG), (((USB_READ_REG32(REG)) & ~(clear_mask)) | (set_mask))) + +#define USB_SET_REG32_BIT(REG, BIT) ((*(__IO uint32_t *)(REG)) |= ((uint32_t)(BIT))) +#define USB_READ_REG32_BIT(REG, BIT) ((*(__IO uint32_t *)(REG)) &= ((uint32_t)(BIT))) +#define USB_CLR_REG32_BIT(REG, BIT) ((*(__IO uint32_t *)(REG)) &= ((uint32_t)(~((uint32_t)(BIT))))) + +#define USB_CLR_REG32(REG) (*(__IO uint32_t *)(REG) = ((uint32_t)(0UL))) + +/** ENUMERATION TYPE **/ +enum USB_SPEED +{ + USB_SPEED_UNKNOWN = 0, + USB_SPEED_LOW, + USB_SPEED_FULL, + USB_SPEED_HIGH +}; + +#endif /* __USB_DEFINES__H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_hcd.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_hcd.h new file mode 100644 index 0000000000..65d5620f6e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_hcd.h @@ -0,0 +1,75 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_hcd.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBHS_HCD__H__ +#define __USBHS_HCD__H__ + +#include "usbhs_regs.h" +#include "usbhs_core.h" + +void USBHOST_CoreInit(USB_CORE_MODULE *USBx, USB_CORE_ID_TypeDef coreID); +uint32_t HOST_HC_Init(USB_CORE_MODULE *USBx , uint8_t ch_num); +uint32_t HOST_SubmitRequest(USB_CORE_MODULE *USBx , uint8_t ch_num) ; +uint32_t HOST_GetCurrentSpeed(USB_CORE_MODULE *USBx); +uint32_t HOST_ResetPort(USB_CORE_MODULE *USBx); +uint32_t HOST_IsDeviceConnected(USB_CORE_MODULE *USBx); +uint32_t HOST_IsPortEnabled(USB_CORE_MODULE *USBx); + +uint32_t HOST_GetCurrentFrame(USB_CORE_MODULE *USBx) ; +URB_STATE HOST_GetURB_State(USB_CORE_MODULE *USBx, uint8_t ch_num); +uint32_t HOST_GetXferCnt(USB_CORE_MODULE *USBx, uint8_t ch_num); +HCH_STATUS HOST_GetHCState(USB_CORE_MODULE *USBx, uint8_t ch_num) ; + +#endif //__USBHS_HCD__H__ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_hcd_int.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_hcd_int.h new file mode 100644 index 0000000000..a6e434bc9f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_hcd_int.h @@ -0,0 +1,78 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_hcd_int.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBHS_HOST_INT_H__ +#define __USBHS_HOST_INT_H__ + +#include "usbhs_hcd.h" + +typedef struct +{ + uint8_t (* SOF)(USB_CORE_MODULE *USBx); + uint8_t (* DevConnected)(USB_CORE_MODULE *USBx); + uint8_t (* DevDisconnected)(USB_CORE_MODULE *USBx); + uint8_t (* DevPortEnabled)(USB_CORE_MODULE *USBx); + uint8_t (* DevPortDisabled)(USB_CORE_MODULE *USBx); +}USBHOST_INT_cb_TypeDef; + +extern USBHOST_INT_cb_TypeDef *USBHOST_INT_fops; + +/* Callbacks handler */ +void ConnectCallback_Handler(USB_CORE_MODULE *USBx); +void Disconnect_Callback_Handler(USB_CORE_MODULE *USBx); +void Overcurrent_Callback_Handler(USB_CORE_MODULE *USBx); +uint32_t USBHOST_ISTR_Handler (USB_CORE_MODULE *USBx); +void USBHOST_ISTR_WKUP_handler(USB_CORE_MODULE *USBx); + + +#endif //__USBHS_HOST_INT_H__ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_regs.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_regs.h new file mode 100644 index 0000000000..ddfbb70673 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/inc/usbhs_regs.h @@ -0,0 +1,107 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_regs.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBHS_REGS_H__ +#define __USBHS_REGS_H__ + +#include "n32h76x_78x.h" +#include "usbhs_conf.h" + + +#define USBHS1_BASE_ADDR (0x40100000) +#define USBHS1_WARP_BASE_ADDR (0x40140000) +#define USBHS2_BASE_ADDR (0x40060000) +#define USBHS2_WARP_BASE_ADDR (0x400A0000) + +#define USB_GLOBAL_REGS_OFFSET (0x000) +#define USB_DEV_GLOBAL_REG_OFFSET (0x800) +#define USB_DEV_IN_EP_REG_OFFSET (0x900) +#define USB_EP_REG_OFFSET (0x20) +#define USB_DEV_OUT_EP_REG_OFFSET (0xB00) +#define USB_HOST_GLOBAL_REG_OFFSET (0x400) +#define USB_HOST_PORT_REGS_OFFSET (0x440) +#define USB_HOST_CHANNEL_REGS_OFFSET (0x500) +#define USB_CHANNEL_REGS_OFFSET (0x20) +#define USB_PWRCTRL_OFFSET (0xE00) +#define USB_PWRCTRL1_OFFSET (0xE04) +#define USB_DATA_FIFO_OFFSET (0x1000) +#define USB_DATA_FIFO_SIZE (0x1000) + +#define USB_MAX_TX_FIFOS (16U) +#define USB_MAX_CH_NUM (USB_MAX_TX_FIFOS) +#define USB_MAX_EP_NUM (16U) +#define USB_MAX_EP0_SIZE (64U) + +#define USB_HS_MAX_PACKET_SIZE (1024U) +#define USB_FS_MAX_PACKET_SIZE (64U) +#define USB_MAX_CHANNEL_NUM (16U) /* USBHS host channel count */ +#define USB_MAX_FIFO_WORDLEN (1280U) /* USBHS max fifo size in words */ + + +typedef struct +{ + USB_Global_Registers *GCSR; + USB_Device_Registers *DCSR; + USB_Host_Registers *HCSR; + USB_INEP_Registers *INEPCSR[USB_MAX_EP_NUM]; + USB_OUTEP_Registers *OUTEPCSR[USB_MAX_EP_NUM]; + USB_HostCH_Registers *HCHCSR[USB_MAX_CH_NUM]; + __IO uint32_t *HPCS; + __IO uint32_t *DFIFO[USB_MAX_TX_FIFOS]; + __IO uint32_t *PWRCTRL; + __IO uint32_t *PWRCTRL1; + + USB_Wrapper_Registers *WRAPCSR; +}USB_Register; + +#endif /* __USBHS_REGS_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_core.c new file mode 100644 index 0000000000..d3eabfb457 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_core.c @@ -0,0 +1,2063 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbhs_core.h" +#include "usbhs_bsp.h" +#include "n32h76x_78x_rcc.h" +#include "usbhs_dcd.h" +#include "usbhs_defines.h" + +/** +*\*\name USB_EnableCommonInt. +*\*\fun Initializes the commmon interrupts, used in both device and modes. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +static void USB_EnableCommonInt(USB_CORE_MODULE *USBx) +{ + /* Clear any pending interrupts */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, 0xFFFFFFFFU); + /* Enable the interrupts in the INTEN */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTEN, (USBHS_GINTEN_WKUPIEN | USBHS_GINTEN_USBSUSPIEN)); +} + +/** +*\*\name USB_CoreReset. +*\*\fun Soft reset of the core. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +static USB_STS USB_CoreReset(USB_CORE_MODULE *USBx) +{ + USB_STS status = USB_OK; + uint32_t u32grstctrl; + uint32_t count = 0; + + /* Wait for AHB master IDLE state. */ + do + { + USB_BSP_uDelay(3); + u32grstctrl = USB_READ_REG32(&USBx->regs.GCSR->GRSTCTRL); + if (++count > 200000UL) + { + return USB_OK; + } + }while((u32grstctrl & USBHS_GRSTCTRL_AHBIDLE) == 0); + + if(status == USB_OK) + { + /* Core Soft Reset */ + count = 0; + u32grstctrl |= USBHS_GRSTCTRL_CSRST; + USB_WRITE_REG32(&USBx->regs.GCSR->GRSTCTRL, u32grstctrl); + do + { + u32grstctrl = USB_READ_REG32(&USBx->regs.GCSR->GRSTCTRL); + if (++count > 200000UL) + { + break; + } + } while ((u32grstctrl & USBHS_GRSTCTRL_SRSTDNE) == 0); + /* clear CSRST bit*/ + u32grstctrl &= (~USBHS_GRSTCTRL_CSRST); + USB_WRITE_REG32(&USBx->regs.GCSR->GRSTCTRL, u32grstctrl); + + USB_BSP_uDelay(3); + } + return status; +} + + +/** +*\*\name USB_WritePacket. +*\*\fun Writes a packet into the Tx FIFO associated with the EP. +*\*\param USBx: selected device. +*\*\param src : source pointer. +*\*\param ch_ep_num : end point number. +*\*\param len : length of bytes. +*\*\return status. +*\*\ +**/ +USB_STS USB_WritePacket(USB_CORE_MODULE *USBx, uint8_t *src,uint8_t ch_ep_num, uint16_t len) +{ + USB_STS status = USB_OK; + uint32_t u32Count32b = 0, i = 0; + __IO uint32_t *fifo; + + if(USBx->cfg.dma_enable == 0) + { + u32Count32b = (len + 3) / 4; + fifo = USBx->regs.DFIFO[ch_ep_num]; + for (i=0; iregs.DFIFO[0]; + u32Count32b = (len + 3) / 4; + + for(i=0; icfg.dma_enable = 0; + + /* Configure startup the core is in FS mode */ + USBx->cfg.speed = USB_SPEED_FULL; + USBx->cfg.mps = USB_FS_MAX_PACKET_SIZE; + /* initialize device cfg following its address */ + USBx->cfg.dev_endpoints_num = USB_MAX_EP_NUM; + USBx->cfg.host_channels_num = USB_MAX_CHANNEL_NUM; + USBx->cfg.TotalFifoSize = USB_MAX_FIFO_WORDLEN; + +#ifdef USB_INTERNAL_DMA_ENABLED + USBx->cfg.dma_enable = 1; +#endif + + USBx->regs.GCSR = (USB_Global_Registers *)(baseAddress + USB_GLOBAL_REGS_OFFSET); + USBx->regs.DCSR = (USB_Device_Registers *)(baseAddress + USB_DEV_GLOBAL_REG_OFFSET); + USBx->regs.HCSR = (USB_Host_Registers *)(baseAddress + USB_HOST_GLOBAL_REG_OFFSET); + USBx->regs.HPCS = (uint32_t *)(baseAddress + USB_HOST_PORT_REGS_OFFSET); + USBx->regs.PWRCTRL = (uint32_t *)(baseAddress + USB_PWRCTRL_OFFSET); + USBx->regs.PWRCTRL1 = (uint32_t *)(baseAddress + USB_PWRCTRL1_OFFSET); + + USBx->regs.WRAPCSR = (USB_Wrapper_Registers *)(wrapperAddress); + + for (i = 0; i < USBx->cfg.dev_endpoints_num; i++) + { + USBx->regs.INEPCSR[i] = (USB_INEP_Registers *) (baseAddress + USB_DEV_IN_EP_REG_OFFSET + (i * USB_EP_REG_OFFSET)); + USBx->regs.OUTEPCSR[i] = (USB_OUTEP_Registers *)(baseAddress + USB_DEV_OUT_EP_REG_OFFSET + (i * USB_EP_REG_OFFSET)); + } + for (i = 0; i < USBx->cfg.host_channels_num; i++) + { + USBx->regs.HCHCSR[i] = (USB_HostCH_Registers *)(baseAddress + USB_HOST_CHANNEL_REGS_OFFSET + (i * USB_CHANNEL_REGS_OFFSET)); + } + for (i = 0; i < USBx->cfg.host_channels_num; i++) + { + USBx->regs.DFIFO[i] = (uint32_t *)(baseAddress + USB_DATA_FIFO_OFFSET + (i * USB_DATA_FIFO_SIZE)); + } + + temp = USBx->regs.WRAPCSR->WRPCFG; + /* Select PHY clock source */ + temp &= ~USBHS_WRPCFG_PHYCLKSEL; + temp |= USBHS_PHYCLKSel(); + /* Enable PHY PLL */ + temp |= USBHS_WRPCFG_PLLEN; + +#ifdef USE_HOST_MODE + /* Set ID internal signal */ + temp &= ~USBHS_WRPCFG_IDSIG; +#endif + + USBx->regs.WRAPCSR->WRPCFG = temp; + + temp = USBx->regs.WRAPCSR->WRPCTRL; + temp |= USBHS_WRPCTRL_PINDETEN; + USBx->regs.WRAPCSR->WRPCTRL = temp; + + return status; +} + +/** +*\*\name USB_CoreInit. +*\*\fun Initializes the USBHS controller registers and prepares the core device mode or host mode operation. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +USB_STS USB_CoreInit(USB_CORE_MODULE *USBx) +{ + USB_STS status = USB_OK; + + /* HS Interface */ + USB_MODIFY_REG32(&USBx->regs.GCSR->GCFG, USBHS_GCFG_PHYSEL, 0); + + /* set phy 8bit */ + USB_MODIFY_REG32(&USBx->regs.GCSR->GCFG, USBHS_GCFG_PHYIF, USBHS_GCFG_PHYIF); + + /* Reset after a PHY select and set Host mode */ + USB_CoreReset(USBx); + + USB_BSP_mDelay(20); + + /* case the HS core is working in FS mode */ + if(USBx->cfg.dma_enable == 1) + { + USB_MODIFY_REG32(&USBx->regs.GCSR->GAHBCFG, USBHS_GAHBCFG_BURSTTYP, 5 << USBHS_GAHBCFG_BURSTTYP_POS); + USB_MODIFY_REG32(&USBx->regs.GCSR->GAHBCFG, 0, USBHS_GAHBCFG_DMAEN); + } + return status; +} + +/** +*\*\name USB_EnableGlobalInt. +*\*\fun Enables or Disables the usb Global Int. +*\*\param USBx: selected device. +*\*\param Cmd : ENABLE or DISABLE +*\*\return status. +*\*\ +**/ +USB_STS USB_EnableGlobalInt(USB_CORE_MODULE *USBx, FunctionalState Cmd) +{ + USB_STS status = USB_OK; + if (Cmd != DISABLE) + { + /* Enable interrupts */ + USB_MODIFY_REG32(&USBx->regs.GCSR->GAHBCFG, 0, USBHS_GAHBCFG_GINTEN); + } + else + { + /* Disable interrupts */ + USB_MODIFY_REG32(&USBx->regs.GCSR->GAHBCFG, USBHS_GAHBCFG_GINTEN, 0); + } + return status; +} + +/** +*\*\name USB_FlushTxFifo. +*\*\fun Flush a Tx FIFO. +*\*\param USBx: selected device. +*\*\param num : FIFO num. +*\*\return status. +*\*\ +**/ +USB_STS USB_FlushTxFifo(USB_CORE_MODULE *USBx , uint32_t num) +{ + USB_STS status = USB_OK; + uint32_t grstctrl = 0; + uint32_t count = 0; + + do + { + grstctrl = USB_READ_REG32(&USBx->regs.GCSR->GRSTCTRL); + if (++count > 200000) + { + break; + } + }while ((grstctrl & USBHS_GRSTCTRL_AHBIDLE) == 0); + + count = 0; + grstctrl = 0; + grstctrl |= USBHS_GRSTCTRL_TXFFLSH; + grstctrl |= ((num & 0x1FU) << USBHS_GRSTCTRL_TXFNUM_POS); + USB_WRITE_REG32(&USBx->regs.GCSR->GRSTCTRL, grstctrl); + do + { + grstctrl = USB_READ_REG32(&USBx->regs.GCSR->GRSTCTRL); + if (++count > 200000) + { + break; + } + }while ((grstctrl & USBHS_GRSTCTRL_TXFFLSH) != 0); + return status; +} + +/** +*\*\name USB_FlushRxFifo. +*\*\fun Flush a Rx FIFO. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +USB_STS USB_FlushRxFifo(USB_CORE_MODULE *USBx) +{ + USB_STS status = USB_OK; + uint32_t grstctrl = 0; + uint32_t count = 0; + + do + { + grstctrl = USB_READ_REG32(&USBx->regs.GCSR->GRSTCTRL); + if (++count > 200000) + { + break; + } + }while ((grstctrl & USBHS_GRSTCTRL_AHBIDLE) == 0); + + count = 0; + + USB_WRITE_REG32(&USBx->regs.GCSR->GRSTCTRL, USBHS_GRSTCTRL_RXFFLSH); + + do + { + grstctrl = USB_READ_REG32(&USBx->regs.GCSR->GRSTCTRL); + if(++count > 200000) + { + break; + } + }while ((grstctrl & USBHS_GRSTCTRL_RXFFLSH) != 0); + return status; +} + + +/** +*\*\name USB_SetCurrentMode. +*\*\fun Set ID line. +*\*\param USBx: selected device. +*\*\param mode: (Host/device). +*\*\return status. +*\*\ +**/ +USB_STS USB_SetCurrentMode(USB_CORE_MODULE *USBx , uint8_t mode) +{ + USB_STS status = USB_OK; + + if(mode == HOST_MODE) + { + USB_MODIFY_REG32(&USBx->regs.GCSR->GCFG, USBHS_GCFG_FHMODE | USBHS_GCFG_FDMODE, USBHS_GCFG_FHMODE); + } + else + { + USB_MODIFY_REG32(&USBx->regs.GCSR->GCFG, USBHS_GCFG_FHMODE | USBHS_GCFG_FDMODE, USBHS_GCFG_FDMODE); + } + USB_BSP_mDelay(50); + return status; +} + + +/** +*\*\name USB_GetMode. +*\*\fun Get current mode. +*\*\param USBx: selected device. +*\*\return current mode. +*\*\ +**/ +uint32_t USB_GetMode(USB_CORE_MODULE *USBx) +{ + return (USB_READ_REG32(&USBx->regs.GCSR->GINTSTS) & 0x1); +} + +/** +*\*\name USB_IsDeviceMode. +*\*\fun Check if it is device mode. +*\*\param USBx: selected device. +*\*\return 1 or 0. +*\*\ +**/ +uint8_t USB_IsDeviceMode(USB_CORE_MODULE *USBx) +{ + if(USB_GetMode(USBx) != HOST_MODE) + { + return 1; + } + else + { + return 0; + } +} + +/** +*\*\name USB_IsHostMode. +*\*\fun Check if it is host mode. +*\*\param USBx: selected device. +*\*\return 1 or 0. +*\*\ +**/ +uint8_t USB_IsHostMode(USB_CORE_MODULE *USBx) +{ + if(USB_GetMode(USBx) != HOST_MODE) + { + return 0; + } + else + { + return 1; + } +} + +/** +*\*\name USB_ReadCoreItr. +*\*\fun returns the Core Interrupt register. +*\*\param USBx: selected device. +*\*\return v. +*\*\ +**/ +uint32_t USB_ReadCoreItr(USB_CORE_MODULE *USBx) +{ + uint32_t v; + v = USB_READ_REG32(&USBx->regs.GCSR->GINTSTS); + v &= USB_READ_REG32(&USBx->regs.GCSR->GINTEN); + return v; +} + +#ifdef USE_HOST_MODE +/** +*\*\name USB_CoreInitHost. +*\*\fun Initializes USBHS controller for host mode. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +USB_STS USB_CoreInitHost(USB_CORE_MODULE *USBx) +{ + USB_STS status = USB_OK; + + uint32_t i = 0; + + /* configure charge pump IO */ + USB_BSP_ConfigVBUS(USBx); + + /* Restart the Phy Clock */ + USB_WRITE_REG32(USBx->regs.PWRCTRL, 0); + + USB_ResetPort(USBx); + + USB_CLR_REG32_BIT(&USBx->regs.HCSR->HCFG, USBHS_HCFG_SPSEL); + + /* Configure data FIFO sizes */ + /* set Rx FIFO size */ + USB_WRITE_REG32(&USBx->regs.GCSR->GRXFSIZ, RX_FIFO_HS_SIZE); + USB_WRITE_REG32(&USBx->regs.GCSR->GNPTXFSIZ_DINEP0TXFSIZ, ( RX_FIFO_HS_SIZE << USBHS_DINEP0TXSIZ_IEP0TXFRSADD_POS | TXH_NP_HS_FIFOSIZE << USBHS_DINEP0TXSIZ_NPTXFDEP_POS)); + + USB_WRITE_REG32(&USBx->regs.GCSR->HPTXFSIZ, ((RX_FIFO_HS_SIZE + TXH_NP_HS_FIFOSIZE) << USBHS_HPTXFSIZ_HPTXFSADD_POS | TXH_P_HS_FIFOSIZE << USBHS_HPTXFSIZ_HPTXFDEP_POS)); + + /* Make sure the FIFOs are flushed. */ + USB_FlushTxFifo(USBx, 0x10); /* all Tx FIFOs */ + USB_FlushRxFifo(USBx); + + /* Clear all pending HC Interrupts */ + for (i = 0; i < USBx->cfg.host_channels_num; i++) + { + USB_WRITE_REG32(&USBx->regs.HCHCSR[i]->HCHINTSTS, 0xFFFFFFFF); + USB_WRITE_REG32(&USBx->regs.HCHCSR[i]->HCHINTEN, 0); + } + + USB_DriveVbus(USBx, 1); + + USB_EnableHostInt(USBx); + return status; +} + +/** +*\*\name USB_IsEvenFrame. +*\*\fun This function returns the frame number for sof packet. +*\*\param USBx: selected device. +*\*\return Frame number. +*\*\ +**/ +uint8_t USB_IsEvenFrame(USB_CORE_MODULE *USBx) +{ + return !(USB_READ_REG32(&USBx->regs.HCSR->HFNUM) & 0x1); +} + +/** +*\*\name USB_DriveVbus. +*\*\fun set/reset vbus. +*\*\param USBx: selected device. +*\*\param state : VBUS state +*\*\return none. +*\*\ +**/ +void USB_DriveVbus(USB_CORE_MODULE *USBx, uint8_t state) +{ + uint32_t hpcs = 0; + + /* enable disable the external charge pump */ + USB_BSP_DriveVBUS(USBx, state); + + /* Turn on the Host port power. */ + hpcs = USB_ReadHPCS(USBx); + if(((hpcs & USBHS_HPCS_PPWR) == 0) && (state == 1)) + { + hpcs |= USBHS_HPCS_PPWR; + USB_WRITE_REG32(USBx->regs.HPCS, hpcs); + } + if(((hpcs & USBHS_HPCS_PPWR) != 0) && (state == 0)) + { + hpcs &= (~USBHS_HPCS_PPWR); + USB_WRITE_REG32(USBx->regs.HPCS, hpcs); + } + USB_BSP_mDelay(200); +} + +/** +*\*\name USB_EnableHostInt. +*\*\fun Enables the Host mode interrupts. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +USB_STS USB_EnableHostInt(USB_CORE_MODULE *USBx) +{ + USB_STS status = USB_OK; + uint32_t ginten = 0; + + /* Disable all interrupts. */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTEN, 0); + + /* Clear any pending interrupts. */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, 0xFFFFFFFF); + + /* Enable the common interrupts */ + USB_EnableCommonInt(USBx); + + if(USBx->cfg.dma_enable == 0) + { + USB_SET_REG32_BIT(&USBx->regs.GCSR->GINTEN, USBHS_GINTEN_RXFNEIEN); + } + ginten |= (USBHS_GINTEN_PTNCIEN_ISOUTNCIEN + | USBHS_GINTEN_HCHIEN + | USBHS_GINTEN_HPIEN + | USBHS_GINTEN_DISCIEN + | USBHS_GINTEN_SOFIEN); + USB_SET_REG32_BIT(&USBx->regs.GCSR->GINTEN, ginten); + + return status; +} + +/** +*\*\name USB_InitFSLSPClkSel. +*\*\fun Initializes the FSLSPClkSel field of the HCFG register on the PHY type. +*\*\param USBx: selected device. +*\*\param freq : clock frequency. +*\*\return none. +*\*\ +**/ +void USB_InitFSLSPClkSel(USB_CORE_MODULE *USBx , uint8_t freq) +{ + uint32_t hcfg = 0; + + hcfg = USB_READ_REG32(&USBx->regs.HCSR->HCFG); + hcfg &= (~(uint32_t)0x03); + hcfg |= freq; + + USB_WRITE_REG32(&USBx->regs.HCSR->HCFG, hcfg); +} + +/** +*\*\name USB_ReadHPCS. +*\*\fun Reads HPCS to modify later. +*\*\param USBx: selected device. +*\*\return HPCS value. +*\*\ +**/ +uint32_t USB_ReadHPCS(USB_CORE_MODULE *USBx) +{ + uint32_t hpcs; + hpcs = USB_READ_REG32(USBx->regs.HPCS); + hpcs &= ~(USBHS_HPCS_PEN | USBHS_HPCS_PCDET | USBHS_HPCS_PENC | USBHS_HPCS_POCC); + return hpcs; +} + +/** +*\*\name USB_ReadHostAllChannels_intr. +*\*\fun Register PCD Callbacks. +*\*\param USBx: selected device. +*\*\return Status. +*\*\ +**/ +uint32_t USB_ReadHostAllChannels_intr(USB_CORE_MODULE *USBx) +{ + return (USB_READ_REG32(&USBx->regs.HCSR->HACHINT)); +} + +/** +*\*\name USB_ResetPort. +*\*\fun Reset Host Port. +*\*\param USBx: selected device. +*\*\return Status. +*\*\ +**/ +uint32_t USB_ResetPort(USB_CORE_MODULE *USBx) +{ + uint32_t hpcs = 0; + + hpcs = USB_ReadHPCS(USBx); + hpcs |= USBHS_HPCS_PRST; + USB_WRITE_REG32(USBx->regs.HPCS, hpcs); + USB_BSP_mDelay(100); + hpcs &= (~USBHS_HPCS_PRST); + USB_WRITE_REG32(USBx->regs.HPCS, hpcs); + USB_BSP_mDelay(20); + return 1; +} + +/** +*\*\name USB_HCH_Init. +*\*\fun Prepares a host channel for transferring packets. +*\*\param USBx: selected device. +*\*\param hch_num: channel number. +*\*\return status. +*\*\ +**/ +USB_STS USB_HCH_Init(USB_CORE_MODULE *USBx , uint8_t hch_num) +{ + USB_STS status = USB_OK; + uint32_t intr_enable = 0; + uint32_t hchinten = 0; + uint32_t hchctrl = 0; + + /* Clear old interrupt conditions for this host channel. */ + USB_WRITE_REG32(&USBx->regs.HCHCSR[hch_num]->HCHINTSTS, 0xFFFFFFFF); + + /* Enable channel interrupts required for this transfer. */ + + if (USBx->cfg.dma_enable == 1) + { + hchinten |= USBHS_HCHINTEN_AHBERRIEN; + } + + switch (USBx->host.hch[hch_num].ep_type) + { + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + hchinten |= USBHS_HCHINTEN_TXCIEN; + hchinten |= USBHS_HCHINTEN_STALLIEN; + hchinten |= USBHS_HCHINTEN_TXERRIEN; + hchinten |= USBHS_HCHINTEN_DTERRIEN; + hchinten |= USBHS_HCHINTEN_NAKIEN; + + if (USBx->host.hch[hch_num].ep_is_in) + { + hchinten |= USBHS_HCHINTEN_BBERRIEN; + } + else + { + hchinten |= USBHS_HCHINTEN_NYETIEN; + if (USBx->host.hch[hch_num].do_ping) + { + hchinten |= USBHS_HCHINTEN_ACKIEN; + } + } + break; + case EP_TYPE_INTR: + hchinten |= USBHS_HCHINTEN_TXCIEN; + hchinten |= USBHS_HCHINTEN_NAKIEN; + hchinten |= USBHS_HCHINTEN_STALLIEN; + hchinten |= USBHS_HCHINTEN_TXERRIEN; + hchinten |= USBHS_HCHINTEN_DTERRIEN; + hchinten |= USBHS_HCHINTEN_FOVRIEN; + + if (USBx->host.hch[hch_num].ep_is_in) + { + hchinten |= USBHS_HCHINTEN_BBERRIEN; + } + + break; + case EP_TYPE_ISOC: + hchinten |= USBHS_HCHINTEN_TXCIEN; + hchinten |= USBHS_HCHINTEN_FOVRIEN; + hchinten |= USBHS_HCHINTEN_ACKIEN; + + if (USBx->host.hch[hch_num].ep_is_in) + { + hchinten |= USBHS_HCHINTEN_TXERRIEN; + hchinten |= USBHS_HCHINTEN_BBERRIEN; + } + break; + } + USB_WRITE_REG32(&USBx->regs.HCHCSR[hch_num]->HCHINTEN, hchinten); + + /* Enable the top level host channel interrupt. */ + intr_enable = (1 << hch_num); + USB_MODIFY_REG32(&USBx->regs.HCSR->HACHINTEN, 0, intr_enable); + + /* Make sure host channel interrupts are enabled. */ + USB_SET_REG32_BIT(&USBx->regs.GCSR->GINTEN, USBHS_GINTEN_HCHIEN); + + /* Program the HCHCTRL register */ + hchctrl |= ((uint32_t)(USBx->host.hch[hch_num].dev_addr) << USBHS_HCHCTRL_DEVADDR_POS); + hchctrl |= ((uint32_t)(USBx->host.hch[hch_num].ep_num) << USBHS_HCHCTRL_EPNUM_POS); + hchctrl |= ((uint32_t)(USBx->host.hch[hch_num].ep_is_in) << USBHS_HCHCTRL_EPDIR_POS); + hchctrl |= ((uint32_t)(USBx->host.hch[hch_num].ep_type) << USBHS_HCHCTRL_EPTYPE_POS); + hchctrl |= ((uint32_t)(USBx->host.hch[hch_num].max_packet) << USBHS_HCHCTRL_MPS_POS); + if(USBx->host.hch[hch_num].speed == HPCS_PRTSPD_LOW_SPEED) + { + hchctrl |= USBHS_HCHCTRL_LSPDDEV; + } + if (USBx->host.hch[hch_num].ep_type == HCHCTRL_INTR) + { + hchctrl |= USBHS_HCHCTRL_ODDFRM; + } + USB_WRITE_REG32(&USBx->regs.HCHCSR[hch_num]->HCHCTRL, hchctrl); + return status; +} + + +/** +*\*\name USB_HCH_StartXfer. +*\*\fun Start transfer. +*\*\param USBx: selected device. +*\*\param hch_num: channel number. +*\*\return status. +*\*\ +**/ +USB_STS USB_HCH_StartXfer(USB_CORE_MODULE *USBx , uint8_t hch_num) +{ + USB_STS status = USB_OK; + + uint16_t len_words = 0; + uint16_t num_packets = 0; + uint16_t max_hch_pkt_count = 0; + + uint32_t hchtxsiz = 0; + uint32_t hchctrl = 0; + uint32_t gnptxfsts = 0; + uint32_t hptxfqsts = 0; + + max_hch_pkt_count = 256; + + + /* Compute the expected number of packets associated to the transfer */ + if(USBx->host.hch[hch_num].xfer_len > 0) + { + num_packets = (USBx->host.hch[hch_num].xfer_len + USBx->host.hch[hch_num].max_packet - 1) / USBx->host.hch[hch_num].max_packet; + + if(num_packets > max_hch_pkt_count) + { + num_packets = max_hch_pkt_count; + USBx->host.hch[hch_num].xfer_len = num_packets * USBx->host.hch[hch_num].max_packet; + } + } + else + { + num_packets = 1; + } + if(USBx->host.hch[hch_num].ep_is_in) + { + USBx->host.hch[hch_num].xfer_len = num_packets * USBx->host.hch[hch_num].max_packet; + } + /* Initialize the HCHTXSIZn register */ + hchtxsiz |= ((uint32_t)(USBx->host.hch[hch_num].xfer_len) << USBHS_HCHTXSIZ_TXSIZ_POS); + hchtxsiz |= ((uint32_t)(num_packets) << USBHS_HCHTXSIZ_PKCNT_POS); + hchtxsiz |= ((uint32_t)(USBx->host.hch[hch_num].data_pid) << USBHS_HCHTXSIZ_PID_POS); + USB_WRITE_REG32(&USBx->regs.HCHCSR[hch_num]->HCHTXSIZ, hchtxsiz); + + if(USBx->cfg.dma_enable == 1) + { + USB_WRITE_REG32(&USBx->regs.HCHCSR[hch_num]->HCHDMADD, (unsigned int)USBx->host.hch[hch_num].xfer_buff); + } + + hchctrl = USB_READ_REG32(&USBx->regs.HCHCSR[hch_num]->HCHCTRL); + hchctrl &= (~USBHS_HCHCTRL_ODDFRM); + hchctrl |= (USB_IsEvenFrame(USBx) << USBHS_HCHCTRL_ODDFRM_POS); + + /* Set host channel enable */ + hchctrl |= USBHS_HCHCTRL_CHEN; + hchctrl &= (~USBHS_HCHCTRL_CHDIS); + + USB_WRITE_REG32(&USBx->regs.HCHCSR[hch_num]->HCHCTRL, hchctrl); + + if (USBx->cfg.dma_enable == 0) /* Slave mode */ + { + if((USBx->host.hch[hch_num].ep_is_in == 0) && + (USBx->host.hch[hch_num].xfer_len > 0)) + { + switch(USBx->host.hch[hch_num].ep_type) + { + /* Non periodic transfer */ + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + gnptxfsts = USB_READ_REG32(&USBx->regs.GCSR->GNPTXFSTS); + len_words = (USBx->host.hch[hch_num].xfer_len + 3) / 4; + + /* check if there is enough space in FIFO space */ + if(len_words > (gnptxfsts & USBHS_GNPTXFSTS_NPTXFSAV) >> USBHS_GNPTXFSTS_NPTXFSAV_POS) + { + /* need to process data in nptxfempty interrupt */ + USB_SET_REG32_BIT(&USBx->regs.GCSR->GINTEN, USBHS_GINTEN_NPTXFEIEN); + } + break; + /* Periodic transfer */ + case EP_TYPE_INTR: + case EP_TYPE_ISOC: + hptxfqsts = USB_READ_REG32(&USBx->regs.HCSR->HPTXFQSTS); + len_words = (USBx->host.hch[hch_num].xfer_len + 3) / 4; + /* check if there is enough space in FIFO space */ + if(len_words > (hptxfqsts & USBHS_HPTXFQSTS_PTXFSAVL) >> USBHS_HPTXFQSTS_PTXFSAVL_POS) /* split the transfer */ + { + /* need to process data in ptxfempty interrupt */ + USB_SET_REG32_BIT(&USBx->regs.GCSR->GINTEN, USBHS_GINTEN_PTXFEIEN); + } + break; + + default: + break; + } + /* Write packet into the Tx FIFO. */ + USB_WritePacket(USBx, USBx->host.hch[hch_num].xfer_buff, hch_num, USBx->host.hch[hch_num].xfer_len); + } + } + return status; +} + + + +/** +*\*\name USB_HCH_Halt. +*\*\fun Halt channel. +*\*\param USBx: selected device. +*\*\param hch_num: channel number. +*\*\return status. +*\*\ +**/ +USB_STS USB_HCH_Halt(USB_CORE_MODULE *USBx , uint8_t hch_num) +{ + USB_STS status = USB_OK; + + uint32_t gnptxfsts = 0; + uint32_t hptxfqsts = 0; + uint32_t hchctrl = 0; + + hchctrl = USB_READ_REG32(&USBx->regs.HCHCSR[hch_num]->HCHCTRL); + + hchctrl |= USBHS_HCHCTRL_CHDIS; + + /* Check for space in the request queue to issue the halt. */ + if(((hchctrl & USBHS_HCHCTRL_EPTYPE) >> USBHS_HCHCTRL_EPTYPE_POS) == HCHCTRL_CTRL + || ((hchctrl & USBHS_HCHCTRL_EPTYPE) >> USBHS_HCHCTRL_EPTYPE_POS) == HCHCTRL_BULK) + { + gnptxfsts = USB_READ_REG32(&USBx->regs.GCSR->GNPTXFSTS); + if(((gnptxfsts & USBHS_GNPTXFSTS_NPTXRQSAV) >> USBHS_GNPTXFSTS_NPTXRQSAV_POS) == 0) + { + hchctrl &= (~USBHS_HCHCTRL_CHEN); + USB_WRITE_REG32(&USBx->regs.HCHCSR[hch_num]->HCHCTRL, hchctrl); + } + } + else + { + hptxfqsts = USB_READ_REG32(&USBx->regs.HCSR->HPTXFQSTS); + if(((hptxfqsts & USBHS_HPTXFQSTS_PTXRQSAV) >> USBHS_HPTXFQSTS_PTXRQSAV_POS) == 0) + { + hchctrl &= (~USBHS_HCHCTRL_CHEN); + USB_WRITE_REG32(&USBx->regs.HCHCSR[hch_num]->HCHCTRL, hchctrl); + } + } + hchctrl |= USBHS_HCHCTRL_CHEN; + USB_WRITE_REG32(&USBx->regs.HCHCSR[hch_num]->HCHCTRL, hchctrl); + return status; +} + + +/** +*\*\name USB_HCH_DoPing. +*\*\fun Issue a ping token. +*\*\param USBx: selected device. +*\*\param hch_num: channel number. +*\*\return status. +*\*\ +**/ +USB_STS USB_HCH_DoPing(USB_CORE_MODULE *USBx , uint8_t hch_num) +{ + USB_STS status = USB_OK; + uint32_t hchctrl = 0; + uint32_t hchtxsiz = 0; + + hchtxsiz |= USBHS_HCHCTRL_DPING; + hchtxsiz |= 1 << USBHS_HCHTXSIZ_PKCNT_POS; + USB_WRITE_REG32(&USBx->regs.HCHCSR[hch_num]->HCHTXSIZ, hchtxsiz); + + hchctrl = USB_READ_REG32(&USBx->regs.HCHCSR[hch_num]->HCHCTRL); + hchctrl |= USBHS_HCHCTRL_CHEN; + hchctrl &= (~USBHS_HCHCTRL_CHDIS); + USB_WRITE_REG32(&USBx->regs.HCHCSR[hch_num]->HCHCTRL, hchctrl); + return status; +} + +/** +*\*\name USB_StopHost. +*\*\fun Stop the device and clean up fifo's. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USB_StopHost(USB_CORE_MODULE *USBx) +{ + uint32_t i = 0; + uint32_t hchctrl = 0; + + USB_WRITE_REG32(&USBx->regs.HCSR->HACHINTEN, 0); + USB_WRITE_REG32(&USBx->regs.HCSR->HACHINT, 0xFFFFFFFF); + /* Flush out any leftover queued requests. */ + for (i = 0; i < USBx->cfg.host_channels_num; i++) + { + hchctrl = USB_READ_REG32(&USBx->regs.HCHCSR[i]->HCHCTRL); + hchctrl &= (~USBHS_HCHCTRL_CHEN); + hchctrl |= USBHS_HCHCTRL_CHDIS; + hchctrl &= (~USBHS_HCHCTRL_EPDIR); + USB_WRITE_REG32(&USBx->regs.HCHCSR[i]->HCHCTRL, hchctrl); + } + /* Flush the FIFO */ + USB_FlushRxFifo(USBx); + USB_FlushTxFifo(USBx, 0x10); +} +#endif +#ifdef USE_DEVICE_MODE + +/** +*\*\name USB_InitDevSpeed. +*\*\fun Initializes the DevSpd field of DCFG register depending the PHY type and the enumeration speed of the device. +*\*\param USBx: selected device. +*\*\param speed: device speed. +*\*\return none. +*\*\ +**/ +void USB_InitDevSpeed(USB_CORE_MODULE *USBx , uint8_t speed) +{ + uint32_t dcfg = 0; + + dcfg = USB_READ_REG32(&USBx->regs.DCSR->DCFG); + dcfg &= (~USBHS_DCFG_DEVSPD); + dcfg |= speed; + USB_WRITE_REG32(&USBx->regs.DCSR->DCFG, dcfg); +} + + +/** +*\*\name USB_DevHSFifoConfig. +*\*\fun Initializes device fifo. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +static void USB_DevHSFifoConfig(USB_CORE_MODULE *USBx) +{ + uint32_t StardAddr = RX_FIFO_HS_SIZE; + /* set Rx FIFO size */ + USB_WRITE_REG32(&USBx->regs.GCSR->GRXFSIZ, RX_FIFO_HS_SIZE); + + /* EP0 TX*/ + USB_WRITE_REG32(&USBx->regs.GCSR->GNPTXFSIZ_DINEP0TXFSIZ, + (RX_FIFO_HS_SIZE << USBHS_DINEP0TXSIZ_IEP0TXFRSADD_POS) | (TX0_FIFO_HS_SIZE << USBHS_DINEP0TXSIZ_NPTXFDEP_POS)); + + /* EP1 TX*/ + StardAddr += TX0_FIFO_HS_SIZE; + USB_WRITE_REG32(&USBx->regs.GCSR->DINEPPTXFSIZ[0], + (StardAddr << USBHS_DINEP0TXSIZ_IEP0TXFRSADD_POS) | (TX1_FIFO_HS_SIZE << USBHS_DINEP0TXSIZ_NPTXFDEP_POS)); + + /* EP2 TX*/ + StardAddr += TX1_FIFO_HS_SIZE; + USB_WRITE_REG32(&USBx->regs.GCSR->DINEPPTXFSIZ[1], + (StardAddr << USBHS_DINEP0TXSIZ_IEP0TXFRSADD_POS) | (TX2_FIFO_HS_SIZE << USBHS_DINEP0TXSIZ_NPTXFDEP_POS)); + + /* EP3 TX*/ + StardAddr += TX2_FIFO_HS_SIZE; + USB_WRITE_REG32(&USBx->regs.GCSR->DINEPPTXFSIZ[2], + (StardAddr << USBHS_DINEP0TXSIZ_IEP0TXFRSADD_POS) | (TX3_FIFO_HS_SIZE << USBHS_DINEP0TXSIZ_NPTXFDEP_POS)); + + /* EP4 TX*/ + StardAddr += TX3_FIFO_HS_SIZE; + USB_WRITE_REG32(&USBx->regs.GCSR->DINEPPTXFSIZ[3], + (StardAddr << USBHS_DINEP0TXSIZ_IEP0TXFRSADD_POS) | (TX4_FIFO_HS_SIZE << USBHS_DINEP0TXSIZ_NPTXFDEP_POS)); + + /* EP5 TX*/ + StardAddr += TX4_FIFO_HS_SIZE; + USB_WRITE_REG32(&USBx->regs.GCSR->DINEPPTXFSIZ[4], + (StardAddr << USBHS_DINEP0TXSIZ_IEP0TXFRSADD_POS) | (TX5_FIFO_HS_SIZE << USBHS_DINEP0TXSIZ_NPTXFDEP_POS)); + + /* EP6 TX*/ + StardAddr += TX5_FIFO_HS_SIZE; + USB_WRITE_REG32(&USBx->regs.GCSR->DINEPPTXFSIZ[5], + (StardAddr << USBHS_DINEP0TXSIZ_IEP0TXFRSADD_POS) | (TX6_FIFO_HS_SIZE << USBHS_DINEP0TXSIZ_NPTXFDEP_POS)); + + /* EP7 TX*/ + StardAddr += TX6_FIFO_HS_SIZE; + USB_WRITE_REG32(&USBx->regs.GCSR->DINEPPTXFSIZ[6], + (StardAddr << USBHS_DINEP0TXSIZ_IEP0TXFRSADD_POS) | (TX7_FIFO_HS_SIZE << USBHS_DINEP0TXSIZ_NPTXFDEP_POS)); + + /* EP8 TX*/ + StardAddr += TX7_FIFO_HS_SIZE; + USB_WRITE_REG32(&USBx->regs.GCSR->DINEPPTXFSIZ[7], + (StardAddr << USBHS_DINEP0TXSIZ_IEP0TXFRSADD_POS) | (TX8_FIFO_HS_SIZE << USBHS_DINEP0TXSIZ_NPTXFDEP_POS)); +} + + +/** +*\*\name USB_CoreInitDev. +*\*\fun Initializes the USBHS controller registers for device mode. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +USB_STS USB_CoreInitDev (USB_CORE_MODULE *USBx) +{ + USB_STS status = USB_OK; + uint32_t i=0; + uint32_t dinepctrl; + uint32_t doutepctrl; + uint32_t dinepinten; + uint32_t dthrctrl; + + /* Restart the Phy Clock */ + USB_WRITE_REG32(USBx->regs.PWRCTRL, 0); + /* Device configuration register */ + USB_MODIFY_REG32(&USBx->regs.DCSR->DCFG, USBHS_DCFG_PFRITVL, DCFG_FRAME_INTERVAL_80 << USBHS_DCFG_PFRITVL_POS); + +#ifdef USE_USB_HS_IN_HS + /* Set High speed phy */ + USB_InitDevSpeed(USBx , USB_SPEED_PARAM_HIGH); +#else + /* set High speed phy in Full speed mode */ + USB_InitDevSpeed(USBx , USB_SPEED_PARAM_HIGH_IN_FULL); +#endif + + USB_DevHSFifoConfig(USBx); + + /* Flush the FIFOs */ + USB_FlushTxFifo(USBx , 0x10); /* all Tx FIFOs */ + USB_FlushRxFifo(USBx); + /* Clear all pending Device Interrupts */ + USB_WRITE_REG32(&USBx->regs.DCSR->DINEPINTEN, 0U); + USB_WRITE_REG32(&USBx->regs.DCSR->DOUTEPINTEN, 0U); + USB_WRITE_REG32(&USBx->regs.DCSR->DAEPINTSTS, 0xFFFFFFFFU); + USB_WRITE_REG32(&USBx->regs.DCSR->DAEPINTEN, 0U); + + for(i=0; icfg.dev_endpoints_num; i++) + { + dinepctrl = USB_READ_REG32_BIT(&USBx->regs.INEPCSR[i]->DINEPCTRL, USBHS_DINEPCTRL_EPEN); + if(dinepctrl) + { + dinepctrl = 0; + dinepctrl |= (USBHS_DINEPCTRL_EPDIS | USBHS_DINEPCTRL_SNAK); + } + else + { + dinepctrl= 0; + } + USB_WRITE_REG32(&USBx->regs.INEPCSR[i]->DINEPCTRL, dinepctrl); + USB_WRITE_REG32(&USBx->regs.INEPCSR[i]->DINEPTXSIZ, 0U); + USB_WRITE_REG32(&USBx->regs.INEPCSR[i]->DINEPINTSTS, 0xFFU); + } + for(i=0; icfg.dev_endpoints_num; i++) + { + doutepctrl = USB_READ_REG32_BIT(&USBx->regs.OUTEPCSR[i]->DOUTEPCTRL, USBHS_DOUTEPCTRL_EPEN); + if(doutepctrl) + { + doutepctrl = 0; + doutepctrl |= (USBHS_DOUTEPCTRL_EPDIS | USBHS_DOUTEPCTRL_SNAK); + } + else + { + doutepctrl = 0; + } + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[i]->DOUTEPCTRL, doutepctrl); + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[i]->DOUTEPTXSIZ, 0U); + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[i]->DOUTEPINTSTS, 0xFFU); + } + dinepinten = 0; + dinepinten |= USBHS_DINEPINTEN_TXFUDIEN; + USB_MODIFY_REG32(&USBx->regs.DCSR->DINEPINTEN, dinepinten, dinepinten); + + if (USBx->cfg.dma_enable == 1) + { + dthrctrl = 0; + dthrctrl |= USBHS_DTHRCTRL_NISOINEPTHREN; + dthrctrl |= USBHS_DTHRCTRL_ISOINEPTHREN; + dthrctrl |= 64 << USBHS_DTHRCTRL_TXTHRLEN_POS; + dthrctrl |= USBHS_DTHRCTRL_RXTHREN; + dthrctrl |= 64 << USBHS_DTHRCTRL_RXTHRLEN_POS; + USB_WRITE_REG32(&USBx->regs.DCSR->DTHRCTRL, dthrctrl); + } + USBDEV_DevConnect(USBx); + USB_EnableDevInt(USBx); + return status; +} + +/** +*\*\name USB_EnableDevInt. +*\*\fun Enables the Device mode interrupts. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +USB_STS USB_EnableDevInt(USB_CORE_MODULE *USBx) +{ + USB_STS status = USB_OK; + uint32_t ginten = 0; + + /* Disable all interrupts. */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTEN, 0U); + /* Clear any pending interrupts */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, 0xBFFFFFFFU); + /* Enable the common interrupts */ + USB_EnableCommonInt(USBx); + + if (USBx->cfg.dma_enable == 0) + { + ginten |= USBHS_GINTEN_RXFNEIEN; + } +#ifdef USB_DEDICATED_EP_ENABLED + /* Enable interrupts matching to the Device mode ONLY */ + ginten |= USBHS_GINTEN_USBSUSPIEN | USBHS_GINTEN_USBRSTIEN | USBHS_GINTEN_ENUMDIEN + | USBHS_GINTEN_SOFIEN + | USBHS_GINTEN_ISOINCIEN | USBHS_GINTEN_PTNCIEN_ISOUTNCIEN; +#else + /* Enable interrupts matching to the Device mode ONLY */ + ginten |= USBHS_GINTEN_USBSUSPIEN | USBHS_GINTEN_USBRSTIEN | USBHS_GINTEN_ENUMDIEN + | USBHS_GINTEN_INEPIEN | USBHS_GINTEN_OUTEPIEN | USBHS_GINTEN_SOFIEN + | USBHS_GINTEN_ISOINCIEN | USBHS_GINTEN_PTNCIEN_ISOUTNCIEN; +#endif + + USB_MODIFY_REG32(&USBx->regs.GCSR->GINTEN, ginten, ginten); + return status; +} + + + +/** +*\*\name USB_GetDeviceSpeed. +*\*\fun Get the device speed from the device status register. +*\*\param USBx: selected device. +*\*\return speed. +*\*\ +**/ +enum USB_SPEED USB_GetDeviceSpeed (USB_CORE_MODULE *USBx) +{ + enum USB_SPEED speed = USB_SPEED_UNKNOWN; + uint32_t dsts = 0; + + dsts = USB_READ_REG32(&USBx->regs.DCSR->DSTS); + + switch ((dsts & USBHS_DSTS_ENUMSPD) >> USBHS_DSTS_ENUMSPD_POS) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + speed = USB_SPEED_HIGH; + break; + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + speed = USB_SPEED_FULL; + break; + case DSTS_ENUMSPD_LS_PHY_6MHZ: + speed = USB_SPEED_LOW; + break; + + default: + speed = USB_SPEED_FULL; + break; + } + return speed; +} + +/** +*\*\name USB_EP0Activate. +*\*\fun enables EP0 OUT to receive SETUP packets and configures EP0 for transmitting packets. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +USB_STS USB_EP0Activate(USB_CORE_MODULE *USBx) +{ + USB_STS status = USB_OK; + uint32_t dsts; + uint32_t dinepctrl; + + /* Read the Device Status and Endpoint 0 Control registers */ + dsts = USB_READ_REG32(&USBx->regs.DCSR->DSTS); + dinepctrl = USB_READ_REG32(&USBx->regs.INEPCSR[0]->DINEPCTRL); + dinepctrl &= (~USBHS_DINEP0CTRL_MPLEN); + /* Set the MPS of the IN EP based on the enumeration speed */ + switch ((dsts & USBHS_DSTS_ENUMSPD) >> USBHS_DSTS_ENUMSPD_POS) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + dinepctrl |= (DEP0CTRL_MPS_64 << USBHS_DINEP0CTRL_MPLEN_POS); + break; + case DSTS_ENUMSPD_LS_PHY_6MHZ: + dinepctrl |= (DEP0CTRL_MPS_8 << USBHS_DINEP0CTRL_MPLEN_POS); + break; + + default: + dinepctrl |= (DEP0CTRL_MPS_64 << USBHS_DINEP0CTRL_MPLEN_POS); + break; + } + USB_WRITE_REG32(&USBx->regs.INEPCSR[0]->DINEPCTRL, dinepctrl); + USB_MODIFY_REG32(&USBx->regs.DCSR->DCTRL, USBHS_DCTRL_CGNPINAK, USBHS_DCTRL_CGNPINAK); + return status; +} + + +/** +*\*\name USB_EPActivate. +*\*\fun Activates an EP. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +USB_STS USB_EPActivate(USB_CORE_MODULE *USBx, USB_EP *ep) +{ + USB_STS status = USB_OK; + __IO uint32_t *addr; + + uint32_t depctrl; + uint32_t depinten; + + /* Read DEPCTRLn register */ + if (ep->is_in == 1) + { + addr = &USBx->regs.INEPCSR[ep->num]->DINEPCTRL; + depinten = (1 << ep->num) << USBHS_DEEPINTEN_INEPIEN_POS; + } + else + { + addr = &USBx->regs.OUTEPCSR[ep->num]->DOUTEPCTRL; + depinten = (1 << ep->num) << USBHS_DEEPINTEN_OUTEPIEN_POS; + } + /* If the EP is already active don't change the EP Control + * register. */ + depctrl = USB_READ_REG32(addr); + if (!(depctrl & USBHS_DINEPCTRL_EPACT)) + { + depctrl |= ep->maxpacket << USBHS_DINEPCTRL_MPLEN_POS; + depctrl |= ep->type << USBHS_DINEPCTRL_EPTYPE_POS; + depctrl |= ep->tx_fifo_num << USBHS_DINEPCTRL_TXFNUM_POS; + depctrl |= USBHS_DINEPCTRL_SD0PID_SEVNFRM; + depctrl |= USBHS_DINEPCTRL_EPACT; + + USB_WRITE_REG32(addr, depctrl); + } +#ifdef USB_DEDICATED_EP_ENABLED + USB_SET_REG32_BIT(&USBx->regs.DCSR->DEEPINTEN, depinten); +#else + /* Enable the Interrupt for this EP */ + USB_SET_REG32_BIT(&USBx->regs.DCSR->DAEPINTEN, depinten); +#endif + return status; +} + + +/** +*\*\name USB_EPDeactivate. +*\*\fun Deactivates an EP. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +USB_STS USB_EPDeactivate(USB_CORE_MODULE *USBx , USB_EP *ep) +{ + USB_STS status = USB_OK; + uint32_t depctrl = 0; + + /* Read DEPCTRLn register and Disable the IN endpoint*/ + if(ep->is_in == 1) + { + depctrl = USB_READ_REG32(&USBx->regs.INEPCSR[ep->num]->DINEPCTRL); + if(depctrl & USBHS_DINEPCTRL_EPEN) + { + depctrl = 0; + depctrl |= USBHS_DINEPCTRL_EPDIS; + depctrl |= USBHS_DINEPCTRL_SNAK; + } + else + { + depctrl = 0; + } + USB_WRITE_REG32(&USBx->regs.INEPCSR[ep->num]->DINEPCTRL, depctrl); + } + else /* Disable the OUT endpoint */ + { + depctrl = USB_READ_REG32(&USBx->regs.OUTEPCSR[ep->num]->DOUTEPCTRL); + if(depctrl & USBHS_DOUTEPCTRL_EPEN) + { + depctrl = 0; + depctrl |= USBHS_DOUTEPCTRL_EPDIS; + depctrl |= USBHS_DOUTEPCTRL_SNAK; + } + else + { + depctrl = 0; + } + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[ep->num]->DOUTEPCTRL, depctrl); + } + return status; +} + + +/** +*\*\name USB_EPStartXfer. +*\*\fun Handle the setup for data xfer for an EP and starts the xfer. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +USB_STS USB_EPStartXfer(USB_CORE_MODULE *USBx, USB_EP *ep) +{ + USB_STS status = USB_OK; + uint32_t fifoemptymsk = 0; + uint32_t dinepctrl, doutepctrl; + uint32_t dineptxsiz, douteptxsiz; + uint32_t dsts = 0; + + /* IN endpoint */ + if(ep->is_in == 1) + { + dinepctrl = USB_READ_REG32(&USBx->regs.INEPCSR[ep->num]->DINEPCTRL); + dineptxsiz = USB_READ_REG32(&USBx->regs.INEPCSR[ep->num]->DINEPTXSIZ); + /* Zero Length Packet */ + if (ep->xfer_len == 0) + { + dineptxsiz = 1 << USBHS_DINEPTXSIZ_PKTCNT_POS; + dineptxsiz |= 1 << USBHS_DINEPTXSIZ_MCNT_POS; + } + else + { + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet + * exist ? 1 : 0) + */ + dineptxsiz &= (~USBHS_DINEPTXSIZ_TLEN) ; + dineptxsiz |= ep->xfer_len << USBHS_DINEPTXSIZ_TLEN_POS; + dineptxsiz &= (~USBHS_DINEPTXSIZ_PKTCNT) ; + dineptxsiz |= ((ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket) << USBHS_DINEPTXSIZ_PKTCNT_POS; + if (ep->type == EP_TYPE_ISOC) + { + dineptxsiz &= (~USBHS_DINEPTXSIZ_MCNT) ; + dineptxsiz |= 1 << USBHS_DINEPTXSIZ_MCNT_POS; + } + else if (ep->type == EP_TYPE_INTR) + { + dineptxsiz &= (~USBHS_DINEPTXSIZ_MCNT) ; + if(((ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket) <=3) + { + dineptxsiz |= ((ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket) << USBHS_DINEPTXSIZ_MCNT_POS; + } + } + } + USB_WRITE_REG32(&USBx->regs.INEPCSR[ep->num]->DINEPTXSIZ, dineptxsiz); + + if (USBx->cfg.dma_enable == 1) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[ep->num]->DINEPDMADD, ep->dma_addr); + } + else + { + if (ep->type != EP_TYPE_ISOC) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + fifoemptymsk = 1 << ep->num; + USB_SET_REG32_BIT(&USBx->regs.DCSR->DINEPFEINTEN, fifoemptymsk); + } + } + } + if (ep->type == EP_TYPE_ISOC) + { + dsts = USB_READ_REG32(&USBx->regs.DCSR->DSTS); + if ((((dsts & USBHS_DSTS_SOFFN)>>USBHS_DSTS_SOFFN_POS) & 0x1) == 0) + { + dinepctrl |= USBHS_DINEPCTRL_SD1PID_SODDFRM; + } + else + { + dinepctrl |= USBHS_DINEPCTRL_SD0PID_SEVNFRM; + } + } + + /* EP enable, IN data in FIFO */ + dinepctrl |= USBHS_DINEPCTRL_CNAK; + dinepctrl |= USBHS_DINEPCTRL_EPEN; + + USB_WRITE_REG32(&USBx->regs.INEPCSR[ep->num]->DINEPCTRL, dinepctrl); + + if (ep->type == EP_TYPE_ISOC) + { + USB_WritePacket(USBx, ep->xfer_buff, ep->num, ep->xfer_len); + } + } + else + { + /* OUT endpoint */ + doutepctrl = USB_READ_REG32((&USBx->regs.OUTEPCSR[ep->num]->DOUTEPCTRL)); + douteptxsiz = USB_READ_REG32((&USBx->regs.OUTEPCSR[ep->num]->DOUTEPTXSIZ)); + /* Program the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + if (ep->xfer_len == 0) + { + douteptxsiz &= (~USBHS_DOUTEPTXSIZ_TLEN); + douteptxsiz |= ep->maxpacket << USBHS_DOUTEPTXSIZ_TLEN_POS; + douteptxsiz &= (~USBHS_DOUTEPTXSIZ_PKTCNT); + douteptxsiz |= 1 << USBHS_DOUTEPTXSIZ_PKTCNT_POS; + } + else + { + douteptxsiz &= (~USBHS_DOUTEPTXSIZ_PKTCNT); + douteptxsiz |= ((ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket) << USBHS_DOUTEPTXSIZ_PKTCNT_POS; + douteptxsiz &= (~USBHS_DOUTEPTXSIZ_TLEN); + douteptxsiz |= (((douteptxsiz & USBHS_DOUTEPTXSIZ_PKTCNT) >> USBHS_DOUTEPTXSIZ_PKTCNT_POS) * ep->maxpacket); + ep->xfer_len = (((douteptxsiz & USBHS_DOUTEPTXSIZ_PKTCNT) >> USBHS_DOUTEPTXSIZ_PKTCNT_POS) * ep->maxpacket); + } + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[ep->num]->DOUTEPTXSIZ, douteptxsiz); + + if (USBx->cfg.dma_enable == 1) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[ep->num]->DOUTEPDMADD, ep->dma_addr); + } + + if (ep->type == EP_TYPE_ISOC) + { + if (ep->even_odd_frame) + { + doutepctrl |= USBHS_DOUTEPCTRL_SD1PID_SODDFRM; + } + else + { + doutepctrl |= USBHS_DOUTEPCTRL_SD0PID_SEVNFRM; + } + } + /* EP enable */ + doutepctrl |= (USBHS_DOUTEPCTRL_CNAK | USBHS_DOUTEPCTRL_EPEN); + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[ep->num]->DOUTEPCTRL, doutepctrl); + } + return status; +} + + +/** +*\*\name USB_EP0StartXfer. +*\*\fun Handle the setup for a data xfer for EP0 and starts the xfer. +*\*\param USBx: selected device. +*\*\return status. +*\*\ +**/ +USB_STS USB_EP0StartXfer(USB_CORE_MODULE *USBx , USB_EP *ep) +{ + USB_STS status = USB_OK; + USB_INEP_Registers *in_regs; + uint32_t fifoemptymsk = 0; + uint32_t dinepctrl = 0, doutepctrl = 0; + uint32_t dineptxsiz = 0, douteptxsiz = 0; + + /* IN endpoint */ + if(ep->is_in == 1) + { + in_regs = USBx->regs.INEPCSR[0]; + dinepctrl = USB_READ_REG32(&in_regs->DINEPCTRL); + dineptxsiz = USB_READ_REG32(&in_regs->DINEPTXSIZ); + /* Zero Length Packet */ + if(ep->xfer_len == 0) + { + dineptxsiz &= (~USBHS_DINEP0TXSIZ_TLEN); + dineptxsiz &= (~USBHS_DINEP0TXSIZ_PKTCNT); + dineptxsiz |= 1 << USBHS_DINEP0TXSIZ_PKTCNT_POS; + } + else + { + if(ep->xfer_len > ep->maxpacket) + { + ep->xfer_len = ep->maxpacket; + dineptxsiz &= (~USBHS_DINEP0TXSIZ_TLEN); + dineptxsiz |= ep->maxpacket << USBHS_DINEP0TXSIZ_TLEN_POS; + } + else + { + dineptxsiz &= (~USBHS_DINEP0TXSIZ_TLEN); + dineptxsiz |= ep->xfer_len << USBHS_DINEP0TXSIZ_TLEN_POS; + } + dineptxsiz &= (~USBHS_DINEP0TXSIZ_PKTCNT); + dineptxsiz |= 1 << USBHS_DINEP0TXSIZ_PKTCNT_POS; + } + USB_WRITE_REG32(&in_regs->DINEPTXSIZ, dineptxsiz); + + if(USBx->cfg.dma_enable == 1) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[ep->num]->DINEPDMADD, ep->dma_addr); + } + + /* EP enable, IN data in FIFO */ + dinepctrl |= ( USBHS_DINEP0CTRL_CNAK | USBHS_DINEP0CTRL_EPEN); + USB_WRITE_REG32(&in_regs->DINEPCTRL, dinepctrl); + + if(USBx->cfg.dma_enable == 0) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + { + fifoemptymsk |= 1 << ep->num; + USB_MODIFY_REG32(&USBx->regs.DCSR->DINEPFEINTEN, 0, fifoemptymsk); + } + } + } + } + else + { + /* OUT endpoint */ + doutepctrl = USB_READ_REG32(&USBx->regs.OUTEPCSR[ep->num]->DOUTEPCTRL); + douteptxsiz = USB_READ_REG32(&USBx->regs.OUTEPCSR[ep->num]->DOUTEPTXSIZ); + /* Program the transfer size and packet count as follows: + * xfersize = N * (maxpacket + 4 - (maxpacket % 4)) + * pktcnt = N */ + if(ep->xfer_len == 0) + { + douteptxsiz &= (~USBHS_DOUTEP0TXSIZ_TLEN); + douteptxsiz |= ep->maxpacket << USBHS_DOUTEP0TXSIZ_TLEN_POS; + douteptxsiz &= (~USBHS_DOUTEP0TXSIZ_PKTCNT); + douteptxsiz |= 1 << USBHS_DOUTEP0TXSIZ_PKTCNT_POS; + } + else + { + ep->xfer_len = ep->maxpacket; + douteptxsiz &= (~USBHS_DOUTEP0TXSIZ_TLEN); + douteptxsiz |= ep->maxpacket << USBHS_DOUTEP0TXSIZ_TLEN_POS; + douteptxsiz &= (~USBHS_DOUTEP0TXSIZ_PKTCNT); + douteptxsiz |= 1 << USBHS_DOUTEP0TXSIZ_PKTCNT_POS; + } + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[ep->num]->DOUTEPTXSIZ, douteptxsiz); + if(USBx->cfg.dma_enable == 1) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[ep->num]->DOUTEPDMADD, ep->dma_addr); + } + /* EP enable */ + doutepctrl |= (USBHS_DOUTEP0CTRL_CNAK | USBHS_DOUTEP0CTRL_EPEN); + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[ep->num]->DOUTEPCTRL, doutepctrl); + } + return status; +} + + + +/** +*\*\name USB_EPSetStall. +*\*\fun Set the EP STALL. +*\*\param USBx: selected device. +*\*\param ep: endpoint instance +*\*\return status. +*\*\ +**/ +USB_STS USB_EPSetStall(USB_CORE_MODULE *USBx , USB_EP *ep) +{ + USB_STS status = USB_OK; + __IO uint32_t *depctrl_addr; + uint32_t depctrl; + + if(ep->is_in == 1) + { + depctrl_addr = &(USBx->regs.INEPCSR[ep->num]->DINEPCTRL); + depctrl = USB_READ_REG32(depctrl_addr); + /* set the disable and stall bits */ + if (depctrl & USBHS_DINEPCTRL_EPEN) + { + depctrl |= USBHS_DINEPCTRL_EPDIS; + } + depctrl |= USBHS_DINEPCTRL_STALL; + USB_WRITE_REG32(depctrl_addr, depctrl); + } + else + { + depctrl_addr = &(USBx->regs.OUTEPCSR[ep->num]->DOUTEPCTRL); + depctrl = USB_READ_REG32(depctrl_addr); + /* set the stall bit */ + depctrl |= USBHS_DOUTEPCTRL_STALL; + USB_WRITE_REG32(depctrl_addr, depctrl); + } + return status; +} + + +/** +*\*\name USB_EPClearStall. +*\*\fun Clear the EP STALL. +*\*\param USBx: selected device. +*\*\param ep: endpoint instance +*\*\return status. +*\*\ +**/ +USB_STS USB_EPClearStall(USB_CORE_MODULE *USBx , USB_EP *ep) +{ + USB_STS status = USB_OK; + __IO uint32_t *depctrl_addr; + uint32_t depctrl; + + + if (ep->is_in == 1) + { + depctrl_addr = &(USBx->regs.INEPCSR[ep->num]->DINEPCTRL); + } + else + { + depctrl_addr = &(USBx->regs.OUTEPCSR[ep->num]->DOUTEPCTRL); + } + depctrl = USB_READ_REG32(depctrl_addr); + /* clear the stall bits */ + depctrl &= (~USBHS_DINEPCTRL_STALL); + if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) + { + depctrl |= USBHS_DINEPCTRL_SD0PID_SEVNFRM; /* DATA0 */ + } + USB_WRITE_REG32(depctrl_addr, depctrl); + return status; +} + +/** +*\*\name USB_ReadDevAllOutEp_itr. +*\*\fun returns OUT endpoint interrupt bits. +*\*\param USBx: selected device. +*\*\return OUT endpoint interrupt bits. +*\*\ +**/ +uint32_t USB_ReadDevAllOutEp_itr(USB_CORE_MODULE *USBx) +{ + uint32_t v; + v = USB_READ_REG32(&USBx->regs.DCSR->DAEPINTSTS); + v &= USB_READ_REG32(&USBx->regs.DCSR->DAEPINTEN); + return ((v & 0xffff0000) >> 16); +} + +/** +*\*\name USB_ReadDevOutEP_itr. +*\*\fun returns Device OUT EP Interrupt register. +*\*\param USBx: selected device. +*\*\param ep : end point number +*\*\return Device OUT EP Interrupt register. +*\*\ +**/ +uint32_t USB_ReadDevOutEP_itr(USB_CORE_MODULE *USBx , uint8_t epnum) +{ + uint32_t v; + v = USB_READ_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS); + v &= USB_READ_REG32(&USBx->regs.DCSR->DOUTEPINTEN); + return v; +} + +/** +*\*\name USB_ReadDevAllInEPItr. +*\*\fun Get int status register. +*\*\param USBx: selected device. +*\*\return int status register. +*\*\ +**/ +uint32_t USB_ReadDevAllInEPItr(USB_CORE_MODULE *USBx) +{ + uint32_t v; + v = USB_READ_REG32(&USBx->regs.DCSR->DAEPINTSTS); + v &= USB_READ_REG32(&USBx->regs.DCSR->DAEPINTEN); + return (v & 0xffff); +} + +/** +*\*\name USB_ReadDevEachInEPItr. +*\*\fun Get int status register. +*\*\param USBx: selected device. +*\*\return int status register. +**/ +uint32_t USB_ReadDevEachInEPItr(USB_CORE_MODULE *USBx) +{ + uint32_t v; + v = USB_READ_REG32(&USBx->regs.DCSR->DEEPINTSTS); + v = USB_READ_REG32(&USBx->regs.DCSR->DEEPINTEN); + return (v & 0xFFFF); +} + +/** +*\*\name USB_ReadDevEachOutEPItr. +*\*\fun Get int status register. +*\*\param USBx: selected device. +*\*\return int status register. +**/ +uint32_t USB_ReadDevEachOutEPItr(USB_CORE_MODULE *USBx) +{ + uint32_t v; + v = USB_READ_REG32(&USBx->regs.DCSR->DEEPINTSTS); + v = USB_READ_REG32(&USBx->regs.DCSR->DEEPINTEN); + return (v & 0xFFFF0000) >> 16; +} + +/** +*\*\name USB_EP0_OutStart. +*\*\fun configures EP0 to receive SETUP packets. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USB_EP0_OutStart(USB_CORE_MODULE *USBx) +{ + uint32_t douteptxsiz = 0; + uint32_t doutepctrl; + + douteptxsiz |= 3 << USBHS_DOUTEP0TXSIZ_STUPPCNT_POS; + douteptxsiz |= 1 << USBHS_DOUTEP0TXSIZ_PKTCNT_POS; + douteptxsiz |= 64 << USBHS_DOUTEP0TXSIZ_TLEN_POS; + + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[0]->DOUTEPTXSIZ, douteptxsiz); + + if(USBx->cfg.dma_enable == 1) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[0]->DOUTEPDMADD, (uint32_t)&USBx->dev.setup_packet); + + /* EP enable */ + doutepctrl = (USBHS_DOUTEP0CTRL_EPEN | USBHS_DOUTEP0CTRL_EPACT); + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[0]->DOUTEPCTRL, doutepctrl); + } +} + + +/** +*\*\name USB_ActiveRemoteWakeup. +*\*\fun active remote wakeup signalling. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USB_ActiveRemoteWakeup(USB_CORE_MODULE *USBx) +{ + uint32_t dsts; + uint32_t pwrctrl; + + if(USBx->dev.DevRemoteWakeup) + { + dsts = USB_READ_REG32(&USBx->regs.DCSR->DSTS); + if(dsts & USBHS_DSTS_SUSPF) + { + if(USBx->cfg.low_power) + { + /* un-gate USB Core clock */ + pwrctrl = USB_READ_REG32(USBx->regs.PWRCTRL); + pwrctrl &= (~USBHS_PWRCTRL_GATEHCLK); + pwrctrl &= (~USBHS_PWRCTRL_PHYSTP); + USB_WRITE_REG32(USBx->regs.PWRCTRL, pwrctrl); + } + /* active Remote wakeup signaling */ + USB_SET_REG32_BIT(&USBx->regs.DCSR->DCTRL, USBHS_DCTRL_RMWKUP); + USB_BSP_mDelay(5); + USB_MODIFY_REG32(&USBx->regs.DCSR->DCTRL, USBHS_DCTRL_RMWKUP, 0); + } + } +} + + +/** +*\*\name USB_UngateClock. +*\*\fun active USB Core clock. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USB_UngateClock(USB_CORE_MODULE *USBx) +{ + uint32_t dsts; + uint32_t pwrctrl; + if(USBx->cfg.low_power) + { + dsts = USB_READ_REG32(&USBx->regs.DCSR->DSTS); + + if(dsts & USBHS_DSTS_SUSPF) + { + /* un-gate USB Core clock */ + pwrctrl = USB_READ_REG32(USBx->regs.PWRCTRL); + pwrctrl &= (~USBHS_PWRCTRL_GATEHCLK); + pwrctrl &= (~USBHS_PWRCTRL_PHYSTP); + USB_WRITE_REG32(USBx->regs.PWRCTRL, pwrctrl); + } + } +} + + +/** +*\*\name USB_StopDevice. +*\*\fun Stop the device and clean up fifo's. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USB_StopDevice(USB_CORE_MODULE *USBx) +{ + uint32_t i; + + USBx->dev.device_status = 1; + + for (i = 0; i < USBx->cfg.dev_endpoints_num ; i++) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[i]->DINEPINTSTS, 0xFF); + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[i]->DOUTEPINTSTS, 0xFF); + } + + USB_WRITE_REG32(&USBx->regs.DCSR->DINEPINTEN, 0); + USB_WRITE_REG32(&USBx->regs.DCSR->DOUTEPINTEN, 0); + USB_WRITE_REG32(&USBx->regs.DCSR->DAEPINTEN, 0); + USB_WRITE_REG32(&USBx->regs.DCSR->DAEPINTSTS, 0xFFFFFFFF ); + + /* Flush the FIFO */ + USB_FlushRxFifo(USBx); + USB_FlushTxFifo(USBx, 0x10); +} + + +/** +*\*\name USB_GetEPStatus. +*\*\fun returns the EP Status. +*\*\param USBx: selected device. +*\*\param ep: endpoint instance. +*\*\return EP status. +*\*\ +**/ +uint32_t USB_GetEPStatus(USB_CORE_MODULE *USBx, USB_EP *ep) +{ + __IO uint32_t *depctrl_addr; + uint32_t Status = 0; + uint32_t depctrl = 0; + + if(ep->is_in == 1) + { + depctrl_addr = &(USBx->regs.INEPCSR[ep->num]->DINEPCTRL); + depctrl = USB_READ_REG32(depctrl_addr); + + if((depctrl & USBHS_DINEPCTRL_STALL) >> USBHS_DINEPCTRL_STALL_POS) + { + Status = USB_EP_TX_STALL; + } + else if((depctrl & USBHS_DINEPCTRL_NAKSTS) >> USBHS_DINEPCTRL_NAKSTS_POS) + { + Status = USB_EP_TX_NAK; + } + else + { + Status = USB_EP_TX_VALID; + } + } + else + { + depctrl_addr = &(USBx->regs.OUTEPCSR[ep->num]->DOUTEPCTRL); + depctrl = USB_READ_REG32(depctrl_addr); + if((depctrl & USBHS_DOUTEPCTRL_STALL) >> USBHS_DOUTEPCTRL_STALL_POS) + { + Status = USB_EP_RX_STALL; + } + else if((depctrl & USBHS_DOUTEPCTRL_NAKSTS) >> USBHS_DOUTEPCTRL_NAKSTS_POS) + { + Status = USB_EP_RX_NAK; + } + else + { + Status = USB_EP_RX_VALID; + } + } + /* Return the current status */ + return Status; +} + + +/** +*\*\name USB_SetEPStatus. +*\*\fun Set the EP Status. +*\*\param USBx: selected device. +*\*\param ep: endpoint instance. +*\*\param Status : new Status +*\*\return none. +*\*\ +**/ +void USB_SetEPStatus(USB_CORE_MODULE *USBx, USB_EP *ep, uint32_t Status) +{ + __IO uint32_t *depctrl_addr; + uint32_t depctrl = 0; + + /* Process for IN endpoint */ + if(ep->is_in == 1) + { + depctrl_addr = &(USBx->regs.INEPCSR[ep->num]->DINEPCTRL); + depctrl = USB_READ_REG32(depctrl_addr); + + if(Status == USB_EP_TX_STALL) + { + USB_EPSetStall(USBx, ep); + return; + } + else if(Status == USB_EP_TX_NAK) + { + depctrl |= USBHS_DINEPCTRL_SNAK; + } + else if(Status == USB_EP_TX_VALID) + { + if ((depctrl & USBHS_DINEPCTRL_STALL) >> USBHS_DINEPCTRL_STALL_POS) + { + ep->even_odd_frame = 0; + USB_EPClearStall(USBx, ep); + return; + } + depctrl |= USBHS_DINEPCTRL_CNAK; + depctrl |= USBHS_DINEPCTRL_EPACT; + depctrl |= USBHS_DINEPCTRL_EPEN; + } + else if (Status == USB_EP_TX_DIS) + { + depctrl &= (~USBHS_DINEPCTRL_EPACT); + } + else + { + /* Do Nothing */ + } + } + else /* Process for OUT endpoint */ + { + depctrl_addr = &(USBx->regs.OUTEPCSR[ep->num]->DOUTEPCTRL); + depctrl = USB_READ_REG32(depctrl_addr); + + if(Status == USB_EP_RX_STALL) + { + depctrl |= USBHS_DOUTEPCTRL_STALL; + } + else if (Status == USB_EP_RX_NAK) + { + depctrl |= USBHS_DOUTEPCTRL_SNAK; + } + else if(Status == USB_EP_RX_VALID) + { + if((depctrl & USBHS_DOUTEPCTRL_STALL) >> USBHS_DOUTEPCTRL_STALL_POS) + { + ep->even_odd_frame = 0; + USB_EPClearStall(USBx, ep); + return; + } + depctrl |= USBHS_DOUTEPCTRL_CNAK; + depctrl |= USBHS_DOUTEPCTRL_EPACT; + depctrl |= USBHS_DOUTEPCTRL_EPEN; + } + else if (Status == USB_EP_RX_DIS) + { + depctrl &= (~USBHS_DOUTEPCTRL_EPACT); + } + else + { + /* Do Nothing */ + } + } + USB_WRITE_REG32(depctrl_addr, depctrl); +} + +#endif diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_dcd.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_dcd.c new file mode 100644 index 0000000000..296a6ba7a9 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_dcd.c @@ -0,0 +1,434 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_dcd.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbhs_dcd.h" +#include "usbhs_bsp.h" + + +/** +*\*\name USBDEV_CoreInit. +*\*\fun Initialize the device core. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USBDEV_CoreInit(USB_CORE_MODULE *USBx, USB_CORE_ID_TypeDef coreID) +{ + uint32_t i; + USB_EP *ep; + + USB_BasicInit(USBx, coreID); + + USBx->dev.device_status = USB_DEFAULT; + USBx->dev.device_address = 0; + + /* Init ep structure */ + for(i=0; icfg.dev_endpoints_num; i++) + { + ep = &USBx->dev.in_ep[i]; + /* Init ep structure */ + ep->is_in = 1; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is activated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + for(i = 0; icfg.dev_endpoints_num; i++) + { + ep = &USBx->dev.out_ep[i]; + /* Init ep structure */ + ep->is_in = 0; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is activated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + USB_EnableGlobalInt(USBx, DISABLE); + + /*Init the Core (common init.) */ + USB_CoreInit(USBx); + + /* Force Device Mode*/ + USB_SetCurrentMode(USBx, DEVICE_MODE); + + /* Init Device */ + USB_CoreInitDev(USBx); + + /* Enable USB Global interrupt */ + USB_EnableGlobalInt(USBx, ENABLE); +} + +/** +*\*\name USBDEV_EP_Open. +*\*\fun Configure an EP. +*\*\param USBx: selected device. +*\*\param ep_addr : Endpoint address. +*\*\param ep_mps: Endpoint max packet size. +*\*\param ep_type: Endpoint type. +*\*\return status. +*\*\ +**/ +uint32_t USBDEV_EP_Open(USB_CORE_MODULE *USBx , uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type) +{ + USB_EP *ep; + __IO uint8_t tmp_1, tmp_2; + + tmp_1 = ep_addr>>7; //EP type, it is IN(=1) or OUT(=0) + tmp_2 = ep_addr & 0x7f; //EP number + + if(tmp_1 == 1) + { + ep = &USBx->dev.in_ep[tmp_2]; + } + else + { + ep = &USBx->dev.out_ep[tmp_2]; + } + ep->num = tmp_2; + + ep->is_in = tmp_1; + ep->maxpacket = ep_mps; + ep->type = ep_type; + if(ep->is_in) + { + /* Assign a Tx FIFO */ + ep->tx_fifo_num = tmp_2; + } + /* Set initial data PID. */ + if(ep_type == USB_EP_BULK ) + { + ep->data_pid_start = 0; + } + USB_EPActivate(USBx , ep); + return 0; +} + +/** +*\*\name USBDEV_EP_Close. +*\*\fun Called when an EP is disabled. +*\*\param USBx: selected device. +*\*\param ep_addr : Endpoint address. +*\*\return status. +*\*\ +**/ +uint32_t USBDEV_EP_Close(USB_CORE_MODULE *USBx , uint8_t ep_addr) +{ + USB_EP *ep; + + if((ep_addr&0x80) == 0x80) + { + ep = &USBx->dev.in_ep[ep_addr & 0x7F]; + } + else + { + ep = &USBx->dev.out_ep[ep_addr & 0x7F]; + } + ep->num = ep_addr & 0x7F; + ep->is_in = (0x80 & ep_addr) != 0; + USB_EPDeactivate(USBx , ep); + return 0; +} + +/** +*\*\name USBDEV_EP_PrepareRx. +*\*\fun Enable endpoint receive. +*\*\param USBx: selected device. +*\*\param ep_addr : Endpoint address. +*\*\param pbuf: pointer to Rx buffer +*\*\param buf_len: data length +*\*\return status. +*\*\ +**/ +uint32_t USBDEV_EP_PrepareRx( USB_CORE_MODULE *USBx, uint8_t ep_addr, uint8_t *pbuf, uint16_t buf_len) +{ + USB_EP *ep; + __IO uint8_t tmp_1; + + tmp_1 = ep_addr & 0x7f; //EP number + + ep = &USBx->dev.out_ep[tmp_1]; + + /*setup and start the Xfer */ + ep->xfer_buff = pbuf; + ep->xfer_len = buf_len; + ep->xfer_count = 0; + ep->is_in = 0; + ep->num = tmp_1; + + if(USBx->cfg.dma_enable == 1) + { + ep->dma_addr = (uint32_t)pbuf; + } + if(tmp_1 == 0) + { + USB_EP0StartXfer(USBx , ep); + } + else + { + USB_EPStartXfer(USBx, ep); + } + return 0; +} + +/** +*\*\name USBDEV_EP_Tx. +*\*\fun Transmit data over USB. +*\*\param USBx: selected device. +*\*\param ep_addr : Endpoint address. +*\*\param pbuf: pointer to Tx buffer +*\*\param buf_len: data length +*\*\return status. +*\*\ +**/ +uint32_t USBDEV_EP_Tx (USB_CORE_MODULE *USBx, uint8_t ep_addr, uint8_t *pbuf, uint32_t buf_len) +{ + USB_EP *ep; + + ep = &USBx->dev.in_ep[ep_addr & 0x7F]; + + /* Setup and start the Transfer */ + ep->is_in = 1; + ep->num = ep_addr & 0x7F; + ep->xfer_buff = pbuf; + ep->xfer_count = 0; + ep->xfer_len = buf_len; + + if(USBx->cfg.dma_enable == 1) + { + ep->dma_addr = (uint32_t)pbuf; + } + if(ep->num == 0) + { + USB_EP0StartXfer(USBx, ep); + } + else + { + USB_EPStartXfer(USBx, ep); + } + return 0; +} + +/** +*\*\name USBDEV_EP_Stall. +*\*\fun Stall an endpoint. +*\*\param USBx: selected device. +*\*\param epnum: endpoint number +*\*\return status. +*\*\ +**/ +uint32_t USBDEV_EP_Stall (USB_CORE_MODULE *USBx, uint8_t epnum) +{ + USB_EP *ep; + if((0x80 & epnum) == 0x80) + { + ep = &USBx->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &USBx->dev.out_ep[epnum]; + } + + ep->is_stall = 1; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_EPSetStall(USBx , ep); + return (0); +} + +/** +*\*\name USBDEV_EP_ClrStall. +*\*\fun Clear stall condition on endpoints. +*\*\param USBx: selected device. +*\*\param epnum: endpoint number +*\*\return status. +*\*\ +**/ +uint32_t USBDEV_EP_ClrStall(USB_CORE_MODULE *USBx, uint8_t epnum) +{ + USB_EP *ep; + if((0x80 & epnum) == 0x80) + { + ep = &USBx->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &USBx->dev.out_ep[epnum]; + } + + ep->is_stall = 0; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_EPClearStall(USBx , ep); + return (0); +} + +/** +*\*\name USBDEV_EP_Flush. +*\*\fun This Function flushes the FIFOs. +*\*\param USBx: selected device. +*\*\param epnum: endpoint number +*\*\return status. +*\*\ +**/ +uint32_t USBDEV_EP_Flush(USB_CORE_MODULE *USBx , uint8_t epnum) +{ + if((epnum & 0x80) == 0x80) + { + USB_FlushTxFifo(USBx, epnum & 0x7F); + } + else + { + USB_FlushRxFifo(USBx); + } + return (0); +} + +/** +*\*\name USBDEV_EP_SetAddress. +*\*\fun This Function set USB device address. +*\*\param USBx: selected device. +*\*\param address: new device address +*\*\return status. +*\*\ +**/ +void USBDEV_EP_SetAddress(USB_CORE_MODULE *USBx, uint8_t address) +{ + uint32_t dcfg = 0; + dcfg |= (address << USBHS_DCFG_DEVARR_POS); + USB_MODIFY_REG32(&USBx->regs.DCSR->DCFG, USBHS_DCFG_DEVARR, dcfg); +} + +/** +*\*\name USBDEV_DevConnect. +*\*\fun Connect device (enable internal pull-up) +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USBDEV_DevConnect(USB_CORE_MODULE *USBx) +{ + USB_CLR_REG32_BIT(&USBx->regs.DCSR->DCTRL, USBHS_DCTRL_SFTDIS); +} + +/** +*\*\name USBDEV_DevDisconnect. +*\*\fun Disconnect device (disable internal pull-up) +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USBDEV_DevDisconnect(USB_CORE_MODULE *USBx) +{ + /* Disconnect device for 3ms */ + USB_MODIFY_REG32(&USBx->regs.DCSR->DCTRL, 0, USBHS_DCTRL_SFTDIS); + USB_BSP_mDelay(3); +} + +/** +*\*\name USBDEV_GetEPStatus. +*\*\fun returns the EP Status. +*\*\param USBx: selected device. +*\*\param epnum : endpoint number +*\*\return EP status. +*\*\ +**/ +uint32_t USBDEV_GetEPStatus(USB_CORE_MODULE *USBx ,uint8_t epnum) +{ + USB_EP *ep; + uint32_t Status = 0; + + if((0x80 & epnum) == 0x80) + { + ep = &USBx->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &USBx->dev.out_ep[epnum]; + } + Status = USB_GetEPStatus(USBx ,ep); + /* Return the current status */ + return Status; +} + +/** +*\*\name USBDEV_SetEPStatus. +*\*\fun Set the EP Status. +*\*\param USBx: selected device. +*\*\param epnum : endpoint number. +*\*\param Status : new Status. +*\*\return none. +*\*\ +**/ +void USBDEV_SetEPStatus(USB_CORE_MODULE *USBx , uint8_t epnum , uint32_t Status) +{ + USB_EP *ep; + + if((0x80 & epnum) == 0x80) + { + ep = &USBx->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &USBx->dev.out_ep[epnum]; + } + USB_SetEPStatus(USBx , ep , Status); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_dcd_int.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_dcd_int.c new file mode 100644 index 0000000000..d2d8feed42 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_dcd_int.c @@ -0,0 +1,1002 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_dcd_int.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbhs_dcd_int.h" +#include "usbhs_regs.h" +#include "n32h76x_78x_rcc.h" +#include "n32h76x_78x_pwr.h" + +/* static functions */ +static uint32_t USBDEV_ReadDevInEP(USB_CORE_MODULE *USBx, uint8_t epnum); + +/* Interrupt Handlers */ +static uint32_t USBDEV_HandleInEP_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBDEV_HandleOutEP_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBDEV_HandleSof_ISTR(USB_CORE_MODULE *USBx); + +static uint32_t USBDEV_HandleRxStatusQueueLevel_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBDEV_WriteEmptyTxFifo(USB_CORE_MODULE *USBx , uint32_t epnum); + +static uint32_t USBDEV_HandleUsbReset_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBDEV_HandleEnumDone_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBDEV_HandleResume_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBDEV_HandleUSBSuspend_ISTR(USB_CORE_MODULE *USBx); + +static uint32_t USBDEV_IsoINIncomplete_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBDEV_IsoOUTIncomplete_ISTR(USB_CORE_MODULE *USBx); + +/** +*\*\name USBD_ISTR_Handler. +*\*\fun Handles all USB Interrupts. +*\*\param USBx: device instance. +*\*\return status. +**/ +uint32_t USBD_ISTR_Handler(USB_CORE_MODULE *USBx) +{ + uint32_t retval = 0; + uint32_t gintsts = 0; + + if(USB_IsDeviceMode(USBx)) /* ensure that we are in device mode */ + { + gintsts = USB_ReadCoreItr(USBx); + if(gintsts == 0U) /* avoid spurious interrupt */ + { + return 0; + } + if(gintsts & USBHS_GINTSTS_OUTEPIF) + { + retval |= USBDEV_HandleOutEP_ISTR(USBx); + } + if(gintsts & USBHS_GINTSTS_INEPIF) + { + retval |= USBDEV_HandleInEP_ISTR(USBx); + } + if(gintsts & USBHS_GINTSTS_MODMISIF) + { + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, USBHS_GINTSTS_MODMISIF); + } + if(gintsts & USBHS_GINTSTS_WKUPIF) + { + retval |= USBDEV_HandleResume_ISTR(USBx); + } + if(gintsts & USBHS_GINTSTS_USBSUSPIF) + { + retval |= USBDEV_HandleUSBSuspend_ISTR(USBx); + } + if(gintsts & USBHS_GINTSTS_SOFIF) + { + retval |= USBDEV_HandleSof_ISTR(USBx); + } + if(gintsts & USBHS_GINTSTS_RXFNEIF) + { + retval |= USBDEV_HandleRxStatusQueueLevel_ISTR(USBx); + } + if(gintsts & USBHS_GINTSTS_USBRSTIF) + { + retval |= USBDEV_HandleUsbReset_ISTR(USBx); + } + if(gintsts & USBHS_GINTSTS_ENUMDIF) + { + retval |= USBDEV_HandleEnumDone_ISTR(USBx); + } + if(gintsts & USBHS_GINTSTS_ISOINCIF) + { + retval |= USBDEV_IsoINIncomplete_ISTR(USBx); + } + if(gintsts & USBHS_GINTSTS_PTNCIF_ISOUTNCIF) + { + retval |= USBDEV_IsoOUTIncomplete_ISTR(USBx); + } + } + return retval; +} + +/** +*\*\name USBDEV_HandleResume_ISTR. +*\*\fun Indicates that the USBHS controller has detected a resume or remote Wake-up sequence. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_HandleResume_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t pwrctrl; + + if(USBx->cfg.low_power) + { + /* un-gate USB Core clock */ + pwrctrl = USB_READ_REG32(USBx->regs.PWRCTRL); + pwrctrl &= (~USBHS_PWRCTRL_PHYSTP); + USB_WRITE_REG32(USBx->regs.PWRCTRL, pwrctrl); + } + + /* Clear the Remote Wake-up Signaling */ + USB_MODIFY_REG32(&USBx->regs.DCSR->DCTRL, USBHS_DCTRL_RMWKUP, 0); + + /* Inform upper layer by the Resume Event */ + USBD_DEV_INT_fops->Resume(USBx); + + /* Clear interrupt */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, USBHS_GINTSTS_WKUPIF); + return 1; +} + +/** +*\*\name USBDEV_HandleUSBSuspend_ISTR. +*\*\fun Indicates that SUSPEND state has been detected on the USB. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_HandleUSBSuspend_ISTR(USB_CORE_MODULE *USBx) +{ + uint8_t prev_status; + uint32_t dsts; + + prev_status = USBx->dev.device_status; + USBD_DEV_INT_fops->Suspend(USBx); + + dsts = USB_READ_REG32(&USBx->regs.DCSR->DSTS); + + /* Clear interrupt */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, USBHS_GINTSTS_USBSUSPIF); + + if((USBx->cfg.low_power) && (dsts & USBHS_DSTS_SUSPF) && (prev_status == USB_CONFIGURED)) + { + /* switch-off the clocks */ + USB_WRITE_REG32(USBx->regs.PWRCTRL, USBHS_PWRCTRL_PHYSTP); + /* Request to enter SLEEP mode*/ + PWR_EnterSLEEPMode(PWR_SLEEP_NOW, PWR_SLEEPENTRY_WFI); + } + return 1; +} + +/** +*\*\name USBDEV_HandleInEP_ISTR. +*\*\fun Indicates that an IN EP has a pending Interrupt. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_HandleInEP_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t ep_intr; + uint32_t epnum = 0; + uint32_t fifoemptymsk; + uint32_t dinepintsts; + + ep_intr = USB_ReadDevAllInEPItr(USBx); + + while(ep_intr) + { + if((ep_intr & 0x1) == 0x01) /* In ITR */ + { + dinepintsts = USBDEV_ReadDevInEP(USBx, epnum); /* Get In ITR status */ + if(dinepintsts & USBHS_DINEPINTSTS_TXCIF) + { + fifoemptymsk = 0x1 << epnum; + USB_MODIFY_REG32(&USBx->regs.DCSR->DINEPFEINTEN, fifoemptymsk, 0); + USB_WRITE_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS, USBHS_DINEPINTSTS_TXCIF); + /* TX COMPLETE */ + USBD_DEV_INT_fops->DataInStage(USBx , epnum); + + if (USBx->cfg.dma_enable == 1 && (epnum == 0)) + { + if(USBx->dev.out_ep[epnum].xfer_len == 0) + { + /* prepare to rx more setup packets */ + USB_EP0_OutStart(USBx); + } + } + } + if(dinepintsts & USBHS_DINEPINTSTS_EPDISIF) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS, USBHS_DINEPINTSTS_EPDISIF); + } + if(dinepintsts & USBHS_DINEPINTSTS_TOUTIF) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS, USBHS_DINEPINTSTS_TOUTIF); + } + if(dinepintsts & USBHS_DINEPINTSTS_TXFERINTIF) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS, USBHS_DINEPINTSTS_TXFERINTIF); + } + if(dinepintsts & USBHS_DINEPINTSTS_INEPNAKEIF) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS, USBHS_DINEPINTSTS_INEPNAKEIF); + } + if(dinepintsts & USBHS_DINEPINTSTS_TXFEIF) + { + USBDEV_WriteEmptyTxFifo(USBx, epnum); + } + } + epnum++; + ep_intr >>= 1; + } + + return 1; +} + +/** +*\*\name USBDEV_HandleOutEP_ISTR. +*\*\fun Indicates that an OUT EP has a pending Interrupt. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_HandleOutEP_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t ep_intr; + uint32_t epnum = 0; + uint32_t doutepintsts; + uint32_t douteptxsiz; + uint32_t doutepintsts_v; + + /* Read in the device interrupt bits */ + ep_intr = USB_ReadDevAllOutEp_itr(USBx); + + while(ep_intr) + { + if(ep_intr&0x1) + { + doutepintsts = USB_ReadDevOutEP_itr(USBx, epnum); + doutepintsts_v = USB_READ_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS); + /* Transfer complete */ + if(doutepintsts & USBHS_DOUTEPINTSTS_TXCIF) + { + /* Clear the bit in DOUTEPINTSTSn for this interrupt */ + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_TXCIF); + if(USBx->cfg.dma_enable == 1) + { + /* Setup Phase Done (control EPs) */ + if(doutepintsts_v & USBHS_DOUTEPINTSTS_STUPPDNEIF) + { + if(doutepintsts_v & USBHS_DOUTEPINTSTS_STUPPRXIF) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_STUPPRXIF); + } + } + else if(doutepintsts_v & USBHS_DOUTEPINTSTS_STSPRXIF) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_STSPRXIF); + } + else if((doutepintsts_v & (USBHS_DOUTEPINTSTS_STUPPDNEIF | USBHS_DOUTEPINTSTS_STSPRXIF)) == 0) + { + if(doutepintsts_v & USBHS_DOUTEPINTSTS_STUPPRXIF) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_STUPPRXIF); + } + } + douteptxsiz = USB_READ_REG32((&USBx->regs.OUTEPCSR[epnum]->DOUTEPTXSIZ)); + /*ToDo : handle more than one single MPS size packet */ + USBx->dev.out_ep[epnum].xfer_count = USBx->dev.out_ep[epnum].maxpacket - (douteptxsiz & USBHS_DOUTEPTXSIZ_TLEN); + + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DEV_INT_fops->DataOutStage(USBx , epnum); + if((epnum == 0) && (USBx->dev.out_ep[epnum].xfer_len == 0)) + { + /* prepare to rx more setup packets */ + USB_EP0_OutStart(USBx); + } + } + else + { + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DEV_INT_fops->DataOutStage(USBx , epnum); + } + } + if(doutepintsts & USBHS_DOUTEPINTSTS_OUTTRXEPDISIF) + { + /* Clear the bit in DOUTEPINTSTSn for this interrupt */ + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_OUTTRXEPDISIF); + } + /* Endpoint disable */ + if(doutepintsts & USBHS_DOUTEPINTSTS_EPDISIF) + { + /* Clear the bit in DOUTEPINTSTSn for this interrupt */ + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_EPDISIF); + + } + /* Setup Phase Done (control EPs) */ + if(doutepintsts & USBHS_DOUTEPINTSTS_STUPPDNEIF) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_STUPPDNEIF); + /* inform the upper layer that a setup packet is available */ + /* SETUP COMPLETE */ + USBD_DEV_INT_fops->SetupStage(USBx); + + if(doutepintsts_v & USBHS_DOUTEPINTSTS_STUPPRXIF) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_STUPPRXIF); + } + if((epnum == 0) && (USBx->cfg.dma_enable == 1) && (USBx->dev.out_ep[epnum].xfer_len == 0)) + { + /* prepare to rx more setup packets */ + USB_EP0_OutStart(USBx); + } + } + + if(doutepintsts & USBHS_DOUTEPINTSTS_OUTTRXEPDISIF) + { + /* Clear the bit in DOUTEPINTSTSn for this interrupt */ + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_OUTTRXEPDISIF); + + } + + /* Endpoint disable */ + if(doutepintsts & USBHS_DOUTEPINTSTS_EPDISIF) + { + /* Clear the bit in DOUTEPINTSTSn for this interrupt */ + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_EPDISIF); + } + } + epnum++; + ep_intr >>= 1; + } + return 1; +} + +/** +*\*\name USBDEV_HandleSof_ISTR. +*\*\fun Handles the SOF Interrupts. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_HandleSof_ISTR(USB_CORE_MODULE *USBx) +{ + USBD_DEV_INT_fops->SOF(USBx); + /* Clear SOF interrupt */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, USBHS_GINTSTS_SOFIF); + + return 1; +} + +/** +*\*\name USBDEV_HandleRxStatusQueueLevel_ISTR. +*\*\fun Handles the Rx Status Queue Level Interrupt. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_HandleRxStatusQueueLevel_ISTR(USB_CORE_MODULE *USBx) +{ + USB_EP *ep; + uint32_t grxstsp; + uint32_t bcnt; + + /* Disable the Rx Status Queue Level interrupt */ + USB_MODIFY_REG32(&USBx->regs.GCSR->GINTEN, USBHS_GINTEN_RXFNEIEN, 0); + + /* Get the Status from the top of the FIFO */ + grxstsp = USB_READ_REG32(&USBx->regs.GCSR->GRXSTSP); + bcnt = (grxstsp & USBHS_GRXSTS_BCNT) >> USBHS_GRXSTS_BCNT_POS; + + ep = &USBx->dev.out_ep[(grxstsp & USBHS_GRXSTS_CHEPNUM) >> USBHS_GRXSTS_CHEPNUM_POS]; + + switch ((grxstsp & USBHS_GRXSTS_PKTSTS) >> USBHS_GRXSTS_PKTSTS_POS) + { + case STS_GOUT_NAK: + break; + case STS_DATA_UPDT: + if(bcnt) + { + USB_ReadPacket(USBx,ep->xfer_buff, bcnt); + ep->xfer_buff += bcnt; + ep->xfer_count += bcnt; + } + break; + case STS_XFER_COMP: + break; + case STS_SETUP_COMP: + break; + case STS_SETUP_UPDT: + /* Copy the setup packet received in FIFO into the setup buffer in RAM */ + USB_ReadPacket(USBx , USBx->dev.setup_packet, 8); + ep->xfer_count += bcnt; + break; + default: + break; + } + /* Enable the Rx Status Queue Level interrupt */ + USB_MODIFY_REG32(&USBx->regs.GCSR->GINTEN, 0, USBHS_GINTEN_RXFNEIEN); + return 1; +} + +/** +*\*\name USBDEV_WriteEmptyTxFifo. +*\*\fun Check FIFO for the next packet to be loaded. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_WriteEmptyTxFifo(USB_CORE_MODULE *USBx, uint32_t epnum) +{ + USB_EP *ep; + uint32_t len; + uint32_t len32; + uint32_t fifoemptymsk; + uint32_t dineptxfsts; + + ep = &USBx->dev.in_ep[epnum]; + + len = ep->xfer_len - ep->xfer_count; + + if(len > ep->maxpacket) + { + len = ep->maxpacket; + } + + len32 = (len + 3) / 4; + dineptxfsts = USB_READ_REG32(&USBx->regs.INEPCSR[epnum]->DINEPTXFSTS); + + while(((dineptxfsts & USBHS_DINEPTXFSTS_TXFSPCAVL) >> USBHS_DINEPTXFSTS_TXFSPCAVL_POS) > len32 && + (ep->xfer_count < ep->xfer_len) && (ep->xfer_len != 0)) + { + /* Write the FIFO */ + len = ep->xfer_len - ep->xfer_count; + if(len > ep->maxpacket) + { + len = ep->maxpacket; + } + len32 = (len + 3) / 4; + + USB_WritePacket(USBx , ep->xfer_buff, epnum, len); + + ep->xfer_buff += len; + ep->xfer_count += len; + + dineptxfsts = USB_READ_REG32(&USBx->regs.INEPCSR[epnum]->DINEPTXFSTS); + + /* Mask the TxFIFOEmpty interrupt */ + if(ep->xfer_len == ep->xfer_count) + { + fifoemptymsk = 0x1 << ep->num; + USB_MODIFY_REG32(&USBx->regs.DCSR->DINEPFEINTEN, fifoemptymsk, 0); + } + } + + return 1; +} + +/** +*\*\name USBDEV_HandleUsbReset_ISTR. +*\*\fun This interrupt occurs when a USB Reset is detected. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_HandleUsbReset_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t i; + uint32_t depinten = 0; + uint32_t doutepinten = 0; + uint32_t dinepinten = 0; + uint32_t dcfg; + + /* Clear the Remote Wake-up Signaling */ + USB_MODIFY_REG32(&USBx->regs.DCSR->DCTRL, USBHS_DCTRL_RMWKUP, 0); + + /* Flush the Tx FIFO */ + USB_FlushTxFifo(USBx , 0x10); + + for (i=0; icfg.dev_endpoints_num; i++) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[i]->DINEPINTSTS, 0xFFFFU); + USB_MODIFY_REG32(&USBx->regs.INEPCSR[i]->DINEPCTRL, USBHS_DINEPCTRL_STALL, 0); + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[i]->DOUTEPINTSTS, 0xFFFFU); + USB_MODIFY_REG32(&USBx->regs.OUTEPCSR[i]->DOUTEPCTRL, USBHS_DOUTEPCTRL_STALL, USBHS_DOUTEPCTRL_SNAK); + } +#ifdef USB_DEDICATED_EP_ENABLED + USB_WRITE_REG32(&USBx->regs.DCSR->DEEPINTSTS, 0xFFFFFFFF); + depinten |= 1 << USBHS_DEEPINTSTS_INEPINT_POS; + depinten |= 1 << USBHS_DEEPINTSTS_OUTEPINT_POS; + USB_WRITE_REG32(&USBx->regs.DCSR->DEEPINTEN, depinten); +#else + USB_WRITE_REG32(&USBx->regs.DCSR->DAEPINTSTS, 0xFFFFFFFF); + depinten |= 1 << USBHS_DAEPINTEN_INEPIEN_POS; + depinten |= 1 << USBHS_DAEPINTEN_OUTEPIEN_POS; + USB_WRITE_REG32(&USBx->regs.DCSR->DAEPINTEN, depinten); +#endif /* USB_DEDICATED_EP_ENABLED */ + + doutepinten |= USBHS_DOUTEPINTEN_STUPDNEIEN; + doutepinten |= USBHS_DOUTEPINTEN_TXCIEN; + doutepinten |= USBHS_DOUTEPINTEN_EPDIEN; + +#ifdef USB_DEDICATED_EP_ENABLED + for (i = 0UL; i < USBx->cfg.dev_endpoints_num ; i++) + { + if(i<=8) + { + USB_WRITE_REG32(&USBx->regs.DCSR->DOUTEPXINTEN[i], doutepinten); + } + } +#else + + USB_WRITE_REG32(&USBx->regs.DCSR->DOUTEPINTEN, doutepinten); +#endif /* USB_DEDICATED_EP_ENABLED */ + + dinepinten |= USBHS_DINEPINTEN_TXCIEN; + dinepinten |= USBHS_DINEPINTEN_TOIEN; + dinepinten |= USBHS_DINEPINTEN_EPDIEN; + +#ifdef USB_DEDICATED_EP_ENABLED + for (i = 0UL; i < USBx->cfg.dev_endpoints_num ; i++) + { + if(i<=8) + { + USB_WRITE_REG32(&USBx->regs.DCSR->DINEPXINTEN[i], dinepinten); + } + } +#else + USB_WRITE_REG32(&USBx->regs.DCSR->DINEPINTEN, dinepinten); +#endif /* USB_DEDICATED_EP_ENABLED */ + + /* Reset Device Address */ + dcfg = USB_READ_REG32(&USBx->regs.DCSR->DCFG); + dcfg &= (~USBHS_DCFG_DEVARR); + USB_WRITE_REG32(&USBx->regs.DCSR->DCFG, dcfg); + + /* setup EP0 to receive SETUP packets */ + USB_EP0_OutStart(USBx); + + /* Clear interrupt */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, USBHS_GINTSTS_USBRSTIF); + + /*Reset internal state machine */ + USBD_DEV_INT_fops->Reset(USBx); + return 1; +} + +/** +*\*\name USBDEV_HandleEnumDone_ISTR. +*\*\fun Read the device status register and set the device speed. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_HandleEnumDone_ISTR(USB_CORE_MODULE *USBx) +{ + RCC_ClocksTypeDef RCC_Clocks; + uint32_t hclk; + uint32_t gcfg; + + USB_EP0Activate(USBx); + + /* Get HCLK frequency */ + RCC_GetClocksFreqValue(&RCC_Clocks); + hclk = RCC_Clocks.AHB2ClkFreq; + + /* Clear default TRDT value and Set USB turn-around time based on device speed and PHY interface. */ + gcfg = USB_READ_REG32(&USBx->regs.GCSR->GCFG); + gcfg &= (~USBHS_GCFG_TRDTIM); + USB_WRITE_REG32(&USBx->regs.GCSR->GCFG, gcfg); + + /* Full or High speed */ + if(USB_GetDeviceSpeed(USBx) == USB_SPEED_HIGH) + { + USBx->cfg.speed = USB_SPEED_HIGH; + USBx->cfg.mps = USB_HS_MAX_PACKET_SIZE ; + /*USBTRD min For HS device*/ + gcfg |= (9 << USBHS_GCFG_TRDTIM_POS); + } + else + { + USBx->cfg.speed = USB_SPEED_FULL; + USBx->cfg.mps = USB_FS_MAX_PACKET_SIZE ; + + /* The USBTRD is configured according to the tables below, depending on AHB frequency + used by application. In the low AHB frequency range it is used to stretch enough the USB response + time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access + latency to the Data FIFO */ + + if((hclk >= 15000000)&&(hclk < 16000000)) + { + /* hclk Clock Range between 15-16 MHz */ + gcfg |= (0xE << USBHS_GCFG_TRDTIM_POS); + } + + else if((hclk >= 16000000)&&(hclk < 17100000)) + { + /* hclk Clock Range between 16-17.1 MHz */ + gcfg |= (0xD << USBHS_GCFG_TRDTIM_POS); + } + + else if((hclk >= 17100000)&&(hclk < 18400000)) + { + /* hclk Clock Range between 17-18.4 MHz */ + gcfg |= (0xC << USBHS_GCFG_TRDTIM_POS); + } + + else if((hclk >= 18400000)&&(hclk < 20000000)) + { + /* hclk Clock Range between 18.4-20 MHz */ + gcfg |= (0xB << USBHS_GCFG_TRDTIM_POS); + } + + else if((hclk >= 20000000)&&(hclk < 21800000)) + { + /* hclk Clock Range between 20-21.8 MHz */ + gcfg |= (0xA << USBHS_GCFG_TRDTIM_POS); + } + + else if((hclk >= 21800000)&&(hclk < 24000000)) + { + /* hclk Clock Range between 21.8-24 MHz */ + gcfg |= (0x9 << USBHS_GCFG_TRDTIM_POS); + } + + else if((hclk >= 24000000)&&(hclk < 26600000)) + { + /* hclk Clock Range between 24-26.6 MHz */ + gcfg |= (0x8 << USBHS_GCFG_TRDTIM_POS); + } + + else if((hclk >= 26600000)&&(hclk < 30000000)) + { + /* hclk Clock Range between 26.6-30 MHz */ + gcfg |= (0x7 << USBHS_GCFG_TRDTIM_POS); + } + + else if((hclk >= 30000000)&&(hclk < 34300000)) + { + /* hclk Clock Range between 30-34.3 MHz */ + gcfg |= (0x6 << USBHS_GCFG_TRDTIM_POS); + } + + else /* if(hclk >= 34300000) */ + { + /* hclk Clock Range between 34.3-240 MHz */ + gcfg |= (0x5 << USBHS_GCFG_TRDTIM_POS); + } + } + USB_MODIFY_REG32(&USBx->regs.GCSR->GCFG, 0, gcfg); + + /* Clear interrupt */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, USBHS_GINTSTS_ENUMDIF); + return 1; +} + +/** +*\*\name USBDEV_IsoINIncomplete_ISTR. +*\*\fun Handle the ISO IN incomplete interrupt. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_IsoINIncomplete_ISTR(USB_CORE_MODULE *USBx) +{ + USBD_DEV_INT_fops->IsoINIncomplete (USBx); + + /* Clear interrupt */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, USBHS_GINTSTS_ISOINCIF); + + return 1; +} + +/** +*\*\name USBDEV_IsoOUTIncomplete_ISTR. +*\*\fun Handle the ISO OUT incomplete interrupt. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_IsoOUTIncomplete_ISTR(USB_CORE_MODULE *USBx) +{ + USBD_DEV_INT_fops->IsoOUTIncomplete(USBx); + + /* Clear interrupt */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, USBHS_GINTSTS_PTNCIF_ISOUTNCIF); + return 1; +} + +/** +*\*\name USBDEV_ReadDevInEP. +*\*\fun Reads IN ep flags. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_ReadDevInEP (USB_CORE_MODULE *USBx, uint8_t epnum) +{ + uint32_t v; + uint32_t dinepinten; + uint32_t dinepfeinten; + + dinepinten = USB_READ_REG32(&USBx->regs.DCSR->DINEPINTEN); + dinepfeinten = USB_READ_REG32(&USBx->regs.DCSR->DINEPFEINTEN); + dinepinten |= ((dinepfeinten >> epnum) & 0x1) << 7; + v = USB_READ_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS) & dinepinten; + return v; +} + +/** +*\*\name USBD_ISTR_WKUP_handler. +*\*\fun Handle Wake up interrupt. +*\*\param USBx: device instance. +*\*\return none. +**/ +void USBD_ISTR_WKUP_handler(USB_CORE_MODULE *USBx) +{ + uint32_t gintsts; + if(USB_IsDeviceMode(USBx)) + { + gintsts= USB_ReadCoreItr(USBx); + if(gintsts & USBHS_GINTSTS_WKUPIF) + { + USBDEV_HandleResume_ISTR(USBx); + } + } +} + +#ifdef USB_DEDICATED_EP_ENABLED + +/** +*\*\name USBDEV_HandleEachInEP_ISTR. +*\*\fun Indicates that Each IN EP has a pending Interrupt. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_HandleEachInEP_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t ep_intr; + uint32_t epnum = 0; + uint32_t fifoemptymsk; + uint32_t dinepintsts, dinepinten; + + ep_intr = USB_ReadDevEachInEPItr(USBx); + + while(ep_intr) + { + if((ep_intr & 0x1) == 0x01) /* In ITR */ + { + dinepinten = USB_READ_REG32(&USBx->regs.DCSR->DINEPXINTEN[epnum]); /* Get In ITR status */ + dinepinten |= (((USB_READ_REG32(&USBx->regs.DCSR->DINEPFEINTEN) >> epnum) & 0x1UL) << 7U); + dinepintsts = (USB_READ_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS) & dinepinten); + if(dinepintsts & USBHS_DINEPINTSTS_TXCIF) + { + fifoemptymsk = 0x1 << epnum; + USB_MODIFY_REG32(&USBx->regs.DCSR->DINEPFEINTEN, fifoemptymsk, 0); + USB_WRITE_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS, USBHS_DINEPINTSTS_TXCIF); + /* TX COMPLETE */ + USBD_DEV_INT_fops->DataInStage(USBx , epnum); + + if (USBx->cfg.dma_enable == 1 && (epnum == 0)) + { + if(USBx->dev.out_ep[epnum].xfer_len == 0) + { + /* prepare to rx more setup packets */ + USB_EP0_OutStart(USBx); + } + } + } + if(dinepintsts & USBHS_DINEPINTSTS_EPDISIF) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS, USBHS_DINEPINTSTS_EPDISIF); + } + if(dinepintsts & USBHS_DINEPINTSTS_TOUTIF) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS, USBHS_DINEPINTSTS_TOUTIF); + } + if(dinepintsts & USBHS_DINEPINTSTS_TXFERINTIF) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS, USBHS_DINEPINTSTS_TXFERINTIF); + } + if(dinepintsts & USBHS_DINEPINTSTS_INEPNAKEIF) + { + USB_WRITE_REG32(&USBx->regs.INEPCSR[epnum]->DINEPINTSTS, USBHS_DINEPINTSTS_INEPNAKEIF); + } + if(dinepintsts & USBHS_DINEPINTSTS_TXFEIF) + { + USBDEV_WriteEmptyTxFifo(USBx, epnum); + } + } + epnum++; + ep_intr >>= 1; + } + + return 1; +} + +/** +*\*\name USBDEV_HandleEachOutEP_ISTR. +*\*\fun Indicates that Each OUT EP has a pending Interrupt. +*\*\param USBx: device instance. +*\*\return status. +**/ +static uint32_t USBDEV_HandleEachOutEP_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t ep_intr; + uint32_t epnum = 0; + uint32_t doutepintsts; + uint32_t douteptxsiz; + uint32_t doutepintsts_v; + + /* Read in the device interrupt bits */ + ep_intr = USB_ReadDevEachOutEPItr(USBx); + + while(ep_intr) + { + if(ep_intr&0x1) + { + doutepintsts = USB_READ_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS); + doutepintsts &= USB_READ_REG32(&USBx->regs.DCSR->DOUTEPXINTEN[epnum]); + doutepintsts_v = USB_READ_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS); + /* Transfer complete */ + if(doutepintsts & USBHS_DOUTEPINTSTS_TXCIF) + { + /* Clear the bit in DOUTEPINTSTSn for this interrupt */ + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_TXCIF); + if(USBx->cfg.dma_enable == 1) + { + /* Setup Phase Done (control EPs) */ + if(doutepintsts_v & USBHS_DOUTEPINTSTS_STUPPDNEIF) + { + if(doutepintsts_v & USBHS_DOUTEPINTSTS_STUPPRXIF) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_STUPPRXIF); + } + } + else if(doutepintsts_v & USBHS_DOUTEPINTSTS_STSPRXIF) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_STSPRXIF); + } + else if((doutepintsts_v & (USBHS_DOUTEPINTSTS_STUPPDNEIF | USBHS_DOUTEPINTSTS_STSPRXIF)) == 0) + { + if(doutepintsts_v & USBHS_DOUTEPINTSTS_STUPPRXIF) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_STUPPRXIF); + } + } + douteptxsiz = USB_READ_REG32((&USBx->regs.OUTEPCSR[epnum]->DOUTEPTXSIZ)); + /*ToDo : handle more than one single MPS size packet */ + USBx->dev.out_ep[epnum].xfer_count = USBx->dev.out_ep[epnum].maxpacket - (douteptxsiz & USBHS_DOUTEPTXSIZ_TLEN); + + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DEV_INT_fops->DataOutStage(USBx , epnum); + if((epnum == 0) && (USBx->dev.out_ep[epnum].xfer_len == 0)) + { + /* prepare to rx more setup packets */ + USB_EP0_OutStart(USBx); + } + } + else + { + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DEV_INT_fops->DataOutStage(USBx , epnum); + } + } + if(doutepintsts & USBHS_DOUTEPINTSTS_OUTTRXEPDISIF) + { + /* Clear the bit in DOUTEPINTSTSn for this interrupt */ + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_OUTTRXEPDISIF); + } + /* Endpoint disable */ + if(doutepintsts & USBHS_DOUTEPINTSTS_EPDISIF) + { + /* Clear the bit in DOUTEPINTSTSn for this interrupt */ + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_EPDISIF); + + } + /* Setup Phase Done (control EPs) */ + if(doutepintsts & USBHS_DOUTEPINTSTS_STUPPDNEIF) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_STUPPDNEIF); + /* inform the upper layer that a setup packet is available */ + /* SETUP COMPLETE */ + USBD_DEV_INT_fops->SetupStage(USBx); + + if(doutepintsts_v & USBHS_DOUTEPINTSTS_STUPPRXIF) + { + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_STUPPRXIF); + } + if((epnum == 0) && (USBx->cfg.dma_enable == 1) && (USBx->dev.out_ep[epnum].xfer_len == 0)) + { + /* prepare to rx more setup packets */ + USB_EP0_OutStart(USBx); + } + } + + if(doutepintsts & USBHS_DOUTEPINTSTS_OUTTRXEPDISIF) + { + /* Clear the bit in DOUTEPINTSTSn for this interrupt */ + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_OUTTRXEPDISIF); + } + + /* Endpoint disable */ + if(doutepintsts & USBHS_DOUTEPINTSTS_EPDISIF) + { + /* Clear the bit in DOUTEPINTSTSn for this interrupt */ + USB_WRITE_REG32(&USBx->regs.OUTEPCSR[epnum]->DOUTEPINTSTS, USBHS_DOUTEPINTSTS_EPDISIF); + } + } + epnum++; + ep_intr >>= 1; + } + return 1; +} + +/** +*\*\name USBD_EP_IN_ISTR_Handler. +*\*\fun Handle IN EP interrupt. +*\*\param USBx: device instance. +*\*\return none. +**/ +void USBD_EP_IN_ISTR_Handler(USB_CORE_MODULE *USBx) +{ + uint32_t ep_intr; + if (USB_IsDeviceMode(USBx)) + { + ep_intr = USB_ReadDevEachInEPItr(USBx); + + if (ep_intr == 0UL) + { + return; + } + USBDEV_HandleEachInEP_ISTR(USBx); + } +} + +/** +*\*\name USBD_EP_OUT_ISTR_Handler. +*\*\fun Handle OUT EP interrupt. +*\*\param USBx: device instance. +*\*\return none. +**/ +void USBD_EP_OUT_ISTR_Handler(USB_CORE_MODULE *USBx) +{ + uint32_t ep_intr; + if (USB_IsDeviceMode(USBx)) + { + ep_intr = USB_ReadDevEachOutEPItr(USBx); + if (ep_intr == 0UL) + { + return; + } + USBDEV_HandleEachOutEP_ISTR(USBx); + } +} + +#endif /* USB_DEDICATED_EP_ENABLED */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_hcd.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_hcd.c new file mode 100644 index 0000000000..2f664ea07e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_hcd.c @@ -0,0 +1,220 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_hcd.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbhs_core.h" +#include "usbhs_hcd.h" +#include "usbhs_conf.h" +#include "usbhs_bsp.h" + +/** +*\*\name USBHOST_CoreInit. +*\*\fun Initialize the HOST portion of the driver. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USBHOST_CoreInit(USB_CORE_MODULE *USBx, USB_CORE_ID_TypeDef coreID) +{ + uint8_t i = 0; + USBx->host.ConnSts = 0; + + for (i= 0; i< USB_MAX_TX_FIFOS; i++) + { + USBx->host.ErrCnt[i] = 0; + USBx->host.XferCnt[i] = 0; + USBx->host.HCH_Status[i] = HCH_IDLE; + } + USBx->host.hch[0].max_packet = 8; + + USB_BasicInit(USBx, coreID); + + USB_EnableGlobalInt(USBx, DISABLE); + USB_CoreInit(USBx); + + /* Force Host Mode*/ + USB_SetCurrentMode(USBx, HOST_MODE); + /* Init Host */ + USB_CoreInitHost(USBx); + /* Enable USB Global interrupt */ + USB_EnableGlobalInt(USBx, ENABLE); +} + +/** +*\*\name HOST_GetCurrentSpeed. +*\*\fun Get Current device Speed. +*\*\param USBx: selected device. +*\*\return speed. +*\*\ +**/ +uint32_t HOST_GetCurrentSpeed(USB_CORE_MODULE *USBx) +{ + uint32_t hpcs = 0; + hpcs = USB_READ_REG32(USBx->regs.HPCS); + return (hpcs & USBHS_HPCS_PSPD) >> USBHS_HPCS_PSPD_POS; +} + +/** +*\*\name HOST_ResetPort. +*\*\fun Issues the reset command to device. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +uint32_t HOST_ResetPort(USB_CORE_MODULE *USBx) +{ + USB_ResetPort(USBx); + return 0; +} + +/** +*\*\name HOST_IsDeviceConnected. +*\*\fun Check if the device is connected. +*\*\param USBx: selected device. +*\*\return Device connection status. 1 -> connected and 0 -> disconnected. +*\*\ +**/ +uint32_t HOST_IsDeviceConnected(USB_CORE_MODULE *USBx) +{ + return (USBx->host.ConnSts); +} + +/** +*\*\name HOST_IsPortEnabled. +*\*\fun This function checks if port is enabled. +*\*\param USBx: selected device. +*\*\return port enable or disable. +*\*\ +**/ +uint32_t HOST_IsPortEnabled(USB_CORE_MODULE *USBx) +{ + return (USBx->host.PortEnabled); +} + +/** +*\*\name HOST_GetCurrentFrame. +*\*\fun This function returns the frame number for sof packet. +*\*\param USBx: selected device. +*\*\return Frame number. +*\*\ +**/ +uint32_t HOST_GetCurrentFrame(USB_CORE_MODULE *USBx) +{ + return (USB_READ_REG32(&USBx->regs.HCSR->HFNUM) & 0xFFFF) ; +} + +/** +*\*\name HOST_GetCurrentFrame. +*\*\fun This function returns the last URBstate. +*\*\param USBx: selected device. +*\*\param ch_num: channel number. +*\*\return URB_STATE. +*\*\ +**/ +URB_STATE HOST_GetURB_State(USB_CORE_MODULE *USBx, uint8_t ch_num) +{ + return USBx->host.URB_State[ch_num] ; +} + +/** +*\*\name HOST_GetXferCnt. +*\*\fun This function returns the last URBstate. +*\*\param USBx: selected device. +*\*\param ch_num: channel number. +*\*\return Number of data bytes transferred. +*\*\ +**/ +uint32_t HOST_GetXferCnt(USB_CORE_MODULE *USBx, uint8_t ch_num) +{ + return USBx->host.XferCnt[ch_num] ; +} + +/** +*\*\name HOST_GetHCState. +*\*\fun This function returns the HC Status. +*\*\param USBx: selected device. +*\*\param ch_num: channel number. +*\*\return HCH_STATUS. +*\*\ +**/ +HCH_STATUS HOST_GetHCState(USB_CORE_MODULE *USBx, uint8_t ch_num) +{ + return USBx->host.HCH_Status[ch_num] ; +} + +/** +*\*\name HOST_HC_Init. +*\*\fun This function prepare a HC and start a transfer. +*\*\param USBx: selected device. +*\*\param ch_num: channel number. +*\*\return status. +*\*\ +**/ +uint32_t HOST_HC_Init(USB_CORE_MODULE *USBx, uint8_t ch_num) +{ + return USB_HCH_Init(USBx, ch_num); +} + +/** +*\*\name HOST_SubmitRequest. +*\*\fun This function prepare a HC and start a transfer. +*\*\param USBx: selected device. +*\*\param ch_num: channel number. +*\*\return status. +*\*\ +**/ +uint32_t HOST_SubmitRequest(USB_CORE_MODULE *USBx, uint8_t ch_num) +{ + USBx->host.URB_State[ch_num] = URB_IDLE; + USBx->host.hch[ch_num].xfer_count = 0 ; + return USB_HCH_StartXfer(USBx, ch_num); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_hcd_int.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_hcd_int.c new file mode 100644 index 0000000000..a7d4c8bf43 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/driver/src/usbhs_hcd_int.c @@ -0,0 +1,787 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbhs_hcd_int.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbhs_core.h" +#include "usbhs_defines.h" +#include "usbhs_hcd_int.h" + +#if defined (__CC_ARM) /*!< ARM Compiler */ +#pragma O0 +#elif defined (__GNUC__) /*!< GNU Compiler */ +#pragma GCC optimize ("O0") + +#endif /* __CC_ARM */ + + +static uint32_t USBHOST_handle_sof_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBHOST_handle_port_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBHOST_handle_hch_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBHOST_handle_hch_n_In_ISTR(USB_CORE_MODULE *USBx, uint32_t num); +static uint32_t USBHOST_handle_hch_n_Out_ISTR(USB_CORE_MODULE *USBx, uint32_t num); +static uint32_t USBHOST_handle_rx_qlvl_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBHOST_handle_nptxfempty_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBHOST_handle_ptxfempty_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBHOST_handle_Disconnect_ISTR(USB_CORE_MODULE *USBx); +static uint32_t USBHOST_handle_IncompletePeriodicXfer_ISTR(USB_CORE_MODULE *USBx); + +/** +*\*\name USBHOST_handle_Wakeup_ISTR. +*\*\fun process the resume/remote wakeup detected interrupt. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +static void USBHOST_handle_Wakeup_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t hpcs; + + hpcs = USB_ReadHPCS(USBx); + hpcs &= ~USBHS_HPCS_PRES; + USB_WRITE_REG32(USBx->regs.HPCS, hpcs); +} + +/** +*\*\name USBHOST_ISTR_WKUP_handler. +*\*\fun process the resume/remote wakeup detected interrupt. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USBHOST_ISTR_WKUP_handler(USB_CORE_MODULE *pdev) +{ + uint32_t gintsts; + if (0U != USB_GetMode(pdev)) + { + gintsts = USB_ReadCoreItr(pdev); + if (gintsts == 0UL) + { + return; + } + if (0UL != (gintsts & USBHS_GINTSTS_WKUPIF)) + { + USBHOST_handle_Wakeup_ISTR(pdev); + } + } +} + +/** +*\*\name USBHOST_ISTR_Handler. +*\*\fun This function handles all USB Host Interrupts. +*\*\param USBx: selected device. +*\*\return retval. +*\*\ +**/ +uint32_t USBHOST_ISTR_Handler(USB_CORE_MODULE *USBx) +{ + uint32_t retval = 0; + uint32_t gintsts = 0; + + /* Check if HOST Mode */ + if(USB_IsHostMode(USBx)) + { + gintsts = USB_ReadCoreItr(USBx); + if(!gintsts) + { + return 0; + } + if(gintsts & USBHS_GINTSTS_SOFIF) + { + retval |= USBHOST_handle_sof_ISTR(USBx); + } + + if(gintsts & USBHS_GINTSTS_RXFNEIF) + { + retval |= USBHOST_handle_rx_qlvl_ISTR(USBx); + } + + if(gintsts & USBHS_GINTSTS_NPTXFEIF) + { + retval |= USBHOST_handle_nptxfempty_ISTR(USBx); + } + + if(gintsts & USBHS_GINTSTS_PTXFEIF) + { + retval |= USBHOST_handle_ptxfempty_ISTR(USBx); + } + + if(gintsts & USBHS_GINTSTS_HCHIF) + { + retval |= USBHOST_handle_hch_ISTR(USBx); + } + + if(gintsts & USBHS_GINTSTS_HPIF) + { + retval |= USBHOST_handle_port_ISTR(USBx); + } + if(gintsts & USBHS_GINTSTS_DISCIF) + { + retval |= USBHOST_handle_Disconnect_ISTR(USBx); + } + if(gintsts & USBHS_GINTSTS_PTNCIF_ISOUTNCIF) + { + retval |= USBHOST_handle_IncompletePeriodicXfer_ISTR(USBx); + } + } + return retval; +} + + +/** +*\*\name USBHOST_handle_hch_ISTR. +*\*\fun This function indicates that one or more host channels has a pending. +*\*\param USBx: selected device. +*\*\return retval. +*\*\ +**/ +static uint32_t USBHOST_handle_hch_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t i = 0; + uint32_t retval = 0; + uint32_t hachint = 0; + uint32_t hchctrl = 0; + + /* Clear appropriate bits in HCHINTSTSn to clear the interrupt bit in GINTSTS */ + hachint = USB_ReadHostAllChannels_intr(USBx); + + for(i=0; icfg.host_channels_num; i++) + { + if(((hachint & USBHS_HACHINT) >> USBHS_HACHINT_POS) & (1 << i)) + { + hchctrl = USB_READ_REG32(&USBx->regs.HCHCSR[i]->HCHCTRL); + if(hchctrl & USBHS_HCHCTRL_EPDIR) + { + retval |= USBHOST_handle_hch_n_In_ISTR(USBx, i); + } + else + { + retval |= USBHOST_handle_hch_n_Out_ISTR(USBx, i); + } + } + } + return retval; +} + + +/** +*\*\name USBHOST_handle_sof_ISTR. +*\*\fun Handles the start-of-frame interrupt in host mode. +*\*\param USBx: selected device. +*\*\return 1. +*\*\ +**/ +static uint32_t USBHOST_handle_sof_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t gintsts = 0; + + USBHOST_INT_fops->SOF(USBx); + + /* Clear interrupt */ + gintsts |= USBHS_GINTSTS_SOFIF; + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, gintsts); + + return 1; +} + + +/** +*\*\name USBHOST_handle_Disconnect_ISTR. +*\*\fun Handles disconnect event. +*\*\param USBx: selected device. +*\*\return 1. +*\*\ +**/ +static uint32_t USBHOST_handle_Disconnect_ISTR(USB_CORE_MODULE *USBx) +{ + USBHOST_INT_fops->DevDisconnected(USBx); + /* Clear interrupt */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, USBHS_GINTSTS_DISCIF); + return 1; +} +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma optimize = none +#endif /* __CC_ARM */ + +/** +*\*\name USBHOST_handle_nptxfempty_ISTR. +*\*\fun Handles non periodic tx fifo empty. +*\*\param USBx: selected device. +*\*\return 1. +*\*\ +**/ +static uint32_t USBHOST_handle_nptxfempty_ISTR(USB_CORE_MODULE *USBx) +{ + uint16_t len_words = 0, len = 0; + uint32_t ginten = 0; + uint32_t gnptxfsts = 0; + uint8_t chnum = 0; + + gnptxfsts = USB_READ_REG32(&USBx->regs.GCSR->GNPTXFSTS); + + chnum = (gnptxfsts & USBHS_GNPTXFSTS_NPTXRQTOP_CHNUM) >> USBHS_GNPTXFSTS_NPTXRQTOP_CHNUM_POS; + len_words = (USBx->host.hch[chnum].xfer_len + 3) / 4; + + while(((gnptxfsts & USBHS_GNPTXFSTS_NPTXFSAV) > len_words) && (USBx->host.hch[chnum].xfer_len != 0)) + { + len = (gnptxfsts & USBHS_GNPTXFSTS_NPTXFSAV) * 4; + + if(len > USBx->host.hch[chnum].xfer_len) + { + /* Last packet */ + len = USBx->host.hch[chnum].xfer_len; + + ginten |= USBHS_GINTEN_NPTXFEIEN; + USB_MODIFY_REG32(&USBx->regs.GCSR->GINTEN, ginten, 0); + } + + len_words = (USBx->host.hch[chnum].xfer_len + 3) / 4; + + USB_WritePacket(USBx , USBx->host.hch[chnum].xfer_buff, chnum, len); + + USBx->host.hch[chnum].xfer_buff += len; + USBx->host.hch[chnum].xfer_len -= len; + USBx->host.hch[chnum].xfer_count += len; + + gnptxfsts = USB_READ_REG32(&USBx->regs.GCSR->GNPTXFSTS); + } + return 1; +} +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma optimize = none +#endif /* __CC_ARM */ + +/** +*\*\name USBHOST_handle_ptxfempty_ISTR. +*\*\fun Handles periodic tx fifo empty. +*\*\param USBx: selected device. +*\*\return 1. +*\*\ +**/ +static uint32_t USBHOST_handle_ptxfempty_ISTR(USB_CORE_MODULE *USBx) +{ + uint16_t len_words = 0, len = 0; + uint32_t ginten = 0; + uint32_t hptxfqsts = 0; + uint8_t chnum = 0; + + hptxfqsts = USB_READ_REG32(&USBx->regs.HCSR->HPTXFQSTS); + chnum = (hptxfqsts & USBHS_HPTXFQSTS_PTXRQTOP_CHNUM) >> USBHS_HPTXFQSTS_PTXRQTOP_CHNUM_POS; + len_words = (USBx->host.hch[chnum].xfer_len + 3) / 4; + + while (((hptxfqsts & USBHS_HPTXFQSTS_PTXFSAVL) > len_words)&& (USBx->host.hch[chnum].xfer_len != 0)) + { + len = (hptxfqsts & USBHS_HPTXFQSTS_PTXFSAVL) * 4; + if(len > USBx->host.hch[chnum].xfer_len) + { + len = USBx->host.hch[chnum].xfer_len; + /* Last packet */ + ginten |= USBHS_GINTEN_PTXFEIEN; + USB_MODIFY_REG32(&USBx->regs.GCSR->GINTEN, ginten, 0); + } + + len_words = (USBx->host.hch[chnum].xfer_len + 3) / 4; + + USB_WritePacket(USBx , USBx->host.hch[chnum].xfer_buff, chnum, len); + + USBx->host.hch[chnum].xfer_buff += len; + USBx->host.hch[chnum].xfer_len -= len; + USBx->host.hch[chnum].xfer_count += len; + + hptxfqsts = USB_READ_REG32(&USBx->regs.HCSR->HPTXFQSTS); + } + return 1; +} + +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma optimize = none +#endif /* __CC_ARM */ + +/** +*\*\name USBHOST_handle_port_ISTR. +*\*\fun This function determines which interrupt conditions have occurred. +*\*\param USBx: selected device. +*\*\return retval. +*\*\ +**/ +static uint32_t USBHOST_handle_port_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t retval = 0; + uint32_t ginten = 0; + uint32_t hpcs = 0, hpcs_dup = 0; + uint8_t portspeed = 0; + + hpcs = USB_READ_REG32(USBx->regs.HPCS); + hpcs_dup = USB_READ_REG32(USBx->regs.HPCS); + + /* Clear the interrupt bits in GINTSTS */ + hpcs_dup &= ~(USBHS_HPCS_PEN | USBHS_HPCS_PCDET | USBHS_HPCS_PENC | USBHS_HPCS_POCC); + + /* Port Connect Detected */ + if(hpcs & USBHS_HPCS_PCDET) + { + hpcs_dup |= USBHS_HPCS_PCDET; + USBHOST_INT_fops->DevConnected(USBx); + retval |= 1; + } + + /* Port Enable Changed */ + if(hpcs & USBHS_HPCS_PENC) + { + hpcs_dup |= USBHS_HPCS_PENC; + if(hpcs & USBHS_HPCS_PEN) + { + portspeed = (hpcs & USBHS_HPCS_PSPD) >> USBHS_HPCS_PSPD_POS; + if((portspeed == HPCS_PRTSPD_LOW_SPEED) || (portspeed == HPCS_PRTSPD_FULL_SPEED)) + { + USB_WRITE_REG32(&USBx->regs.HCSR->HFRI, 60000); + } + USBHOST_INT_fops->DevPortEnabled(USBx); + + /* Enable disconnect interrupt */ + ginten |= USBHS_GINTEN_DISCIEN; + USB_MODIFY_REG32(&USBx->regs.GCSR->GINTEN, ginten, ginten); + } + else + { + USBHOST_INT_fops->DevPortDisabled(USBx); + } + } + + /* Overcurrent Change Interrupt */ + if((hpcs & USBHS_HPCS_POCC) >> USBHS_HPCS_POCC_POS) + { + hpcs_dup |= USBHS_HPCS_POCC; + retval |= 1; + } + /* Clear Port Interrupts */ + USB_WRITE_REG32(USBx->regs.HPCS, hpcs_dup); + return retval; +} +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma optimize = none +#endif /* __CC_ARM */ + +/** +*\*\name USBHOST_handle_hch_n_Out_ISTR. +*\*\fun Handles interrupt for a specific Host Channel. +*\*\param USBx: selected device. +*\*\param num: Channel number. +*\*\return 1. +*\*\ +**/ +uint32_t USBHOST_handle_hch_n_Out_ISTR(USB_CORE_MODULE *USBx , uint32_t num) +{ + USB_HostCH_Registers *hostchreg; + + uint32_t hchintsts = 0; + uint32_t hchinten = 0; + uint32_t hchctrl = 0; + + hostchreg = USBx->regs.HCHCSR[num]; + hchintsts = USB_READ_REG32(&hostchreg->HCHINTSTS); + hchinten = USB_READ_REG32(&hostchreg->HCHINTEN); + hchintsts &= hchinten; + + hchctrl = USB_READ_REG32(&USBx->regs.HCHCSR[num]->HCHCTRL); + + if(hchintsts & USBHS_HCHINTSTS_AHBERRIF) + { + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_AHBERRIF); + + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + } + else if(hchintsts & USBHS_HCHINTSTS_ACKIF) + { + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_ACKIF); + } + else if(hchintsts & USBHS_HCHINTSTS_FOVRIF) + { + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + USB_HCH_Halt(USBx, num); + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_FOVRIF); + } + else if(hchintsts & USBHS_HCHINTSTS_TXCFIF) + { + USBx->host.ErrCnt[num] = 0; + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + USB_HCH_Halt(USBx, num); + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_TXCFIF); + USBx->host.HCH_Status[num] = HCH_XFRC; + } + else if(hchintsts & USBHS_HCHINTSTS_STALLIF) + { + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_STALLIF); + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + USB_HCH_Halt(USBx, num); + USBx->host.HCH_Status[num] = HCH_STALL; + } + else if(hchintsts & USBHS_HCHINTSTS_NAKIF) + { + USBx->host.ErrCnt[num] = 0; + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + if(USBx->cfg.dma_enable == 0) + { + USB_HCH_Halt(USBx, num); + } + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_NAKIF); + USBx->host.HCH_Status[num] = HCH_NAK; + } + + else if(hchintsts & USBHS_HCHINTSTS_TXERRIF) + { + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + USB_HCH_Halt(USBx, num); + USBx->host.HCH_Status[num] = HCH_XACTERR; + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_TXERRIF); + } + else if(hchintsts & USBHS_HCHINTSTS_NYETIF) + { + USBx->host.ErrCnt[num] = 0; + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + if(USBx->cfg.dma_enable == 0) + { + USB_HCH_Halt(USBx, num); + } + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_NYETIF); + USBx->host.HCH_Status[num] = HCH_NYET; + } + else if(hchintsts & USBHS_HCHINTSTS_DTERRIF) + { + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + USB_HCH_Halt(USBx, num); + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_NAKIF); + USBx->host.HCH_Status[num] = HCH_DATATGLERR; + + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_DTERRIF); + } + else if(hchintsts & USBHS_HCHINTSTS_CHHTDIF) + { + USB_MODIFY_REG32(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN, 0); + + if(USBx->host.HCH_Status[num] == HCH_XFRC) + { + USBx->host.URB_State[num] = URB_DONE; + + if((hchctrl & USBHS_HCHCTRL_EPTYPE) >> USBHS_HCHCTRL_EPTYPE_POS == EP_TYPE_BULK) + { + USBx->host.hch[num].toggle_out ^= 1; + } + } + else if(USBx->host.HCH_Status[num] == HCH_NAK) + { + USBx->host.URB_State[num] = URB_NOTREADY; + } + else if(USBx->host.HCH_Status[num] == HCH_NYET) + { + if(USBx->host.hch[num].do_ping == 1) + { + USB_HCH_DoPing(USBx, num); + } + USBx->host.URB_State[num] = URB_NOTREADY; + } + else if(USBx->host.HCH_Status[num] == HCH_STALL) + { + USBx->host.URB_State[num] = URB_STALL; + } + else if(USBx->host.HCH_Status[num] == HCH_XACTERR) + { + USBx->host.URB_State[num] = URB_ERROR; + } + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_CHHTDIF); + } + return 1; +} +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma optimize = none +#endif /* __CC_ARM */ + +/** +*\*\name USBHOST_handle_hch_n_In_ISTR. +*\*\fun Handles interrupt for a specific Host Channel. +*\*\param USBx: selected device. +*\*\param num: Channel number. +*\*\return 1. +*\*\ +**/ +uint32_t USBHOST_handle_hch_n_In_ISTR(USB_CORE_MODULE *USBx, uint32_t num) +{ + USB_HostCH_Registers *hostchreg; + + uint32_t hchintsts = 0; + uint32_t hchinten = 0; + uint32_t hchctrl = 0; + uint32_t hchtxsiz = 0; + uint8_t eptype = 0; + + hostchreg = USBx->regs.HCHCSR[num]; + hchintsts = USB_READ_REG32(&hostchreg->HCHINTSTS); + hchinten = USB_READ_REG32(&hostchreg->HCHINTEN); + hchintsts &= hchinten; + hchctrl = USB_READ_REG32(&USBx->regs.HCHCSR[num]->HCHCTRL); + + + eptype = (hchctrl & USBHS_HCHCTRL_EPTYPE) >> USBHS_HCHCTRL_EPTYPE_POS; + + if(hchintsts & USBHS_HCHINTSTS_AHBERRIF) + { + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_AHBERRIF); + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + } + else if(hchintsts & USBHS_HCHINTSTS_ACKIF) + { + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_ACKIF); + } + else if(hchintsts & USBHS_HCHINTSTS_STALLIF) + { + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + USBx->host.HCH_Status[num] = HCH_STALL; + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_NAKIF); /* Clear the NAK Condition */ + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_STALLIF); /* Clear the STALL Condition */ + hchintsts &= (~USBHS_HCHINTSTS_NAKIF); /* NOTE: When there is a 'stall', reset also nak, + else, the USBx->host.HCH_Status = HCH_STALL + will be overwritten by 'nak' in code below */ + USB_HCH_Halt(USBx, num); + } + else if(hchintsts & USBHS_HCHINTSTS_DTERRIF) + { + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + USB_HCH_Halt(USBx, num); + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_NAKIF); + USBx->host.HCH_Status[num] = HCH_DATATGLERR; + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_DTERRIF); + } + + if(hchintsts & USBHS_HCHINTSTS_FOVRIF) + { + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + USB_HCH_Halt(USBx, num); + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_FOVRIF); + } + else if(hchintsts & USBHS_HCHINTSTS_TXCFIF) + { + if(USBx->cfg.dma_enable == 1) + { + hchtxsiz = USB_READ_REG32(&USBx->regs.HCHCSR[num]->HCHTXSIZ); + USBx->host.XferCnt[num] = USBx->host.hch[num].xfer_len - ((hchtxsiz & USBHS_HCHTXSIZ_TXSIZ) >> USBHS_HCHTXSIZ_TXSIZ_POS); + } + + USBx->host.HCH_Status[num] = HCH_XFRC; + USBx->host.ErrCnt[num] = 0; + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_TXCFIF); + + if((eptype == EP_TYPE_CTRL) || (eptype == EP_TYPE_BULK)) + { + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + USB_HCH_Halt(USBx, num); + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_NAKIF); + USBx->host.hch[num].toggle_in ^= 1; + } + else if(eptype == EP_TYPE_INTR) + { + hchctrl |= USBHS_HCHCTRL_ODDFRM; + USB_WRITE_REG32(&USBx->regs.HCHCSR[num]->HCHCTRL, hchctrl); + USBx->host.URB_State[num] = URB_DONE; + } + } + else if(hchintsts & USBHS_HCHINTSTS_CHHTDIF) + { + USB_MODIFY_REG32(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN, 0); + + if(USBx->host.HCH_Status[num] == HCH_XFRC) + { + USBx->host.URB_State[num] = URB_DONE; + } + else if(USBx->host.HCH_Status[num] == HCH_STALL) + { + USBx->host.URB_State[num] = URB_STALL; + } + + else if((USBx->host.HCH_Status[num] == HCH_XACTERR) || (USBx->host.HCH_Status[num] == HCH_DATATGLERR)) + { + USBx->host.ErrCnt[num] = 0; + USBx->host.URB_State[num] = URB_ERROR; + } + else if(eptype == EP_TYPE_INTR) + { + USBx->host.hch[num].toggle_in ^= 1; + } + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_CHHTDIF); + } + else if(hchintsts & USBHS_HCHINTSTS_TXERRIF) + { + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + USBx->host.HCH_Status[num] = HCH_XACTERR; + USB_HCH_Halt(USBx, num); + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_TXERRIF); + } + else if(hchintsts & USBHS_HCHINTSTS_NAKIF) + { + if(eptype == EP_TYPE_INTR) + { + USB_SET_REG32_BIT(&USBx->regs.HCHCSR[num]->HCHINTEN, USBHS_HCHINTEN_CHHTDIEN); + if(USBx->cfg.dma_enable == 0) + { + USB_HCH_Halt(USBx, num); + } + } + USBx->host.HCH_Status[num] = HCH_NAK; + USB_WRITE_REG32(&hostchreg->HCHINTSTS, USBHS_HCHINTSTS_NAKIF); + if((eptype == EP_TYPE_CTRL)|| (eptype == EP_TYPE_BULK)) + { + /* re-activate the channel */ + hchctrl |= USBHS_HCHCTRL_CHEN; + hchctrl &= (~USBHS_HCHCTRL_CHDIS); + USB_WRITE_REG32(&USBx->regs.HCHCSR[num]->HCHCTRL, hchctrl); + } + } + return 1; +} + + +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma optimize = none +#endif /* __CC_ARM */ + +/** +*\*\name USBHOST_handle_rx_qlvl_ISTR. +*\*\fun Handles the Rx Status Queue Level Interrupt. +*\*\param USBx: selected device. +*\*\return 1. +*\*\ +**/ +static uint32_t USBHOST_handle_rx_qlvl_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t grxstsp = 0; + uint32_t ginten = 0; + uint32_t hchctrl = 0; + uint32_t hchtxsiz = 0; + + __IO uint8_t chnum =0; + uint32_t count = 0; + uint32_t bcnt = 0; + + /* Disable the Rx Status Queue Level interrupt */ + ginten |= USBHS_GINTEN_RXFNEIEN; + USB_MODIFY_REG32(&USBx->regs.GCSR->GINTEN, ginten, 0); + + grxstsp = USB_READ_REG32(&USBx->regs.GCSR->GRXSTSP); + chnum = (grxstsp & USBHS_GRXSTS_CHEPNUM) >> USBHS_GRXSTS_CHEPNUM_POS; + bcnt = (grxstsp & USBHS_GRXSTS_BCNT) >> USBHS_GRXSTS_BCNT_POS; + hchctrl = USB_READ_REG32(&USBx->regs.HCHCSR[chnum]->HCHCTRL); + + switch((grxstsp & USBHS_GRXSTS_PKTSTS) >> USBHS_GRXSTS_PKTSTS_POS) + { + case GRXSTS_PKTSTS_IN: + /* Read the data into the host buffer. */ + if(((bcnt > 0) && (USBx->host.hch[chnum].xfer_buff != (void *)0))) + { + USB_ReadPacket(USBx, USBx->host.hch[chnum].xfer_buff, bcnt); + /*manage multiple Xfer */ + USBx->host.hch[chnum].xfer_buff += bcnt; + USBx->host.hch[chnum].xfer_count += bcnt; + + count = USBx->host.hch[chnum].xfer_count; + USBx->host.XferCnt[chnum] = count; + + hchtxsiz = USB_READ_REG32(&USBx->regs.HCHCSR[chnum]->HCHTXSIZ); + if(((hchtxsiz & USBHS_HCHTXSIZ_PKCNT) >> USBHS_HCHTXSIZ_PKCNT_POS) > 0) + { + /* re-activate the channel when more packets are expected */ + hchctrl |= USBHS_HCHCTRL_CHEN; + hchctrl &= (~USBHS_HCHCTRL_CHDIS); + USB_WRITE_REG32(&USBx->regs.HCHCSR[chnum]->HCHCTRL, hchctrl); + } + } + break; + + case GRXSTS_PKTSTS_IN_XFER_COMP: + + case GRXSTS_PKTSTS_DATA_TOGGLE_ERR: + case GRXSTS_PKTSTS_CH_HALTED: + default: + break; + } + + /* Enable the Rx Status Queue Level interrupt */ + ginten |= USBHS_GINTEN_RXFNEIEN; + USB_MODIFY_REG32(&USBx->regs.GCSR->GINTEN, 0, ginten); + return 1; +} + + +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma optimize = none +#endif /* __CC_ARM */ + +/** +*\*\name USBHOST_handle_IncompletePeriodicXfer_ISTR. +*\*\fun Handles the incomplete Periodic transfer Interrupt. +*\*\param USBx: selected device. +*\*\return 1. +*\*\ +**/ +static uint32_t USBHOST_handle_IncompletePeriodicXfer_ISTR(USB_CORE_MODULE *USBx) +{ + uint32_t gintsts = 0; + uint32_t hchctrl = 0; + + hchctrl = USB_READ_REG32(&USBx->regs.HCHCSR[0]->HCHCTRL); + hchctrl |= USBHS_HCHCTRL_CHEN; + hchctrl |= USBHS_HCHCTRL_CHDIS; + USB_WRITE_REG32(&USBx->regs.HCHCSR[0]->HCHCTRL, hchctrl); + + /* Clear interrupt */ + gintsts |= USBHS_GINTSTS_PTNCIF_ISOUTNCIF; + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, gintsts); + + return 1; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/inc/usbh_cdc_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/inc/usbh_cdc_core.h new file mode 100644 index 0000000000..62a1fcf470 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/inc/usbh_cdc_core.h @@ -0,0 +1,164 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_cdc_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USBH_CDC_CORE_H +#define __USBH_CDC_CORE_H + + +#include "usbh_cdc_funct.h" + + + +/*Comuncation Calss codes*/ +#define COMMUNICATION_DEVICE_CLASS_CODE 0x02 +#define COMMUNICATION_INTERFACE_CLASS_CODE 0x02 + +/*Data Interface Class Codes*/ +#define DATA_INTERFACE_CLASS_CODE 0x0A + +/*Communcation sub class codes*/ +#define RESERVED 0x00 +#define DIRECT_LINE_CONTROL_MODEL 0x01 +#define ABSTRACT_CONTROL_MODEL 0x02 +#define TELEPHONE_CONTROL_MODEL 0x03 +#define MULTICHANNEL_CONTROL_MODEL 0x04 +#define CAPI_CONTROL_MODEL 0x05 +#define ETHERNET_NETWORKING_CONTROL_MODEL 0x06 +#define ATM_NETWORKING_CONTROL_MODEL 0x07 + + +/*Communication Interface Class Control Protocol Codes*/ +#define NO_CLASS_SPECIFIC_PROTOCOL_CODE 0x00 +#define COMMON_AT_COMMAND 0x01 +#define VENDOR_SPECIFIC 0xFF + + +#define CS_INTERFACE 0x24 +#define CDC_PAGE_SIZE_64 0x40 + + +/* States for CDC State Machine */ +typedef enum +{ + CDC_IDLE= 0, + CDC_READ_DATA, + CDC_SEND_DATA, + CDC_DATA_SENT, + CDC_BUSY, + CDC_GET_DATA, + CDC_POLL, + CDC_CTRL_STATE +} +CDC_State; + +/* CDC Transfer State */ +typedef struct _CDCXfer +{ + volatile CDC_State CDCState; + uint8_t* pRxTxBuff; + uint8_t* pFillBuff; + uint8_t* pEmptyBuff; + uint32_t BufferLen; + uint16_t DataLength; +} CDC_Xfer_TypeDef; + +typedef struct CDC_UserCb +{ + void (*Send) (uint8_t *); + void (*Receive) (uint8_t *); + +} CDC_Usercb_TypeDef; + +/* Structure for CDC process */ +typedef struct _CDC_CommInterface +{ + uint8_t hc_num_in; + uint8_t hc_num_out; + uint8_t notificationEp; + CDC_State state; + uint8_t buff[8]; + uint16_t length; + uint8_t ep_addr; +} +CDC_CommInterface_Typedef ; + +typedef struct _CDC_DataInterface +{ + uint8_t hc_num_in; + uint8_t hc_num_out; + uint8_t cdcOutEp; + uint8_t cdcInEp; + CDC_State state; + uint8_t buff[8]; + uint16_t length; + uint8_t ep_addr; +} +CDC_DataInterface_Typedef ; + +/* Structure for CDC process */ +typedef struct _CDC_Process +{ + CDC_CommInterface_Typedef CDC_CommItf; + CDC_DataInterface_Typedef CDC_DataItf; +} +CDC_Machine_TypeDef; + +extern USBH_Class_cb_TypeDef USBH_CDC_cb; + +void CDC_SendData(uint8_t *data, uint16_t length); +void CDC_StartReception( USB_CORE_MODULE *pdev); +void CDC_StopReception( USB_CORE_MODULE *pdev); + + +#endif /* __USBH_CDC_CORE_H */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/inc/usbh_cdc_funct.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/inc/usbh_cdc_funct.h new file mode 100644 index 0000000000..68759b283b --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/inc/usbh_cdc_funct.h @@ -0,0 +1,294 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_cdc_funct.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USBH_CDC_FUNCT_H +#define __USBH_CDC_FUNCT_H + + +#include "usbh_core.h" +#include "usbh_stdreq.h" +#include "usbhs_bsp.h" +#include "usbh_ioreq.h" +#include "usbh_hcs.h" + +/*Class-Specific Request Codes*/ +#define CDC_SEND_ENCAPSULATED_COMMAND 0x00 +#define CDC_GET_ENCAPSULATED_RESPONSE 0x01 +#define CDC_SET_COMM_FEATURE 0x02 +#define CDC_GET_COMM_FEATURE 0x03 +#define CDC_CLEAR_COMM_FEATURE 0x04 + +#define CDC_SET_AUX_LINE_STATE 0x10 +#define CDC_SET_HOOK_STATE 0x11 +#define CDC_PULSE_SETUP 0x12 +#define CDC_SEND_PULSE 0x13 +#define CDC_SET_PULSE_TIME 0x14 +#define CDC_RING_AUX_JACK 0x15 + +#define CDC_SET_LINE_CODING 0x20 +#define CDC_GET_LINE_CODING 0x21 +#define CDC_SET_CONTROL_LINE_STATE 0x22 +#define CDC_SEND_BREAK 0x23 + +#define CDC_SET_RINGER_PARMS 0x30 +#define CDC_GET_RINGER_PARMS 0x31 +#define CDC_SET_OPERATION_PARMS 0x32 +#define CDC_GET_OPERATION_PARMS 0x33 +#define CDC_SET_LINE_PARMS 0x34 +#define CDC_GET_LINE_PARMS 0x35 +#define CDC_DIAL_DIGITS 0x36 +#define CDC_SET_UNIT_PARAMETER 0x37 +#define CDC_GET_UNIT_PARAMETER 0x38 +#define CDC_CLEAR_UNIT_PARAMETER 0x39 +#define CDC_GET_PROFILE 0x3A + +#define CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 +#define CDC_SET_ETHERNET_POWER_MANAGEMENT_PATTERN FILTER 0x41 +#define CDC_GET_ETHERNET_POWER_MANAGEMENT_PATTERN FILTER 0x42 +#define CDC_SET_ETHERNET_PACKET_FILTER 0x43 +#define CDC_GET_ETHERNET_STATISTIC 0x44 + +#define CDC_SET_ATM_DATA_FORMAT 0x50 +#define CDC_GET_ATM_DEVICE_STATISTICS 0x51 +#define CDC_SET_ATM_DEFAULT_VC 0x52 +#define CDC_GET_ATM_VC_STATISTICS 0x53 + + +/* wValue for SetControlLineState*/ +#define CDC_ACTIVATE_CARRIER_SIGNAL_RTS 0x0002 +#define CDC_DEACTIVATE_CARRIER_SIGNAL_RTS 0x0000 +#define CDC_ACTIVATE_SIGNAL_DTR 0x0001 +#define CDC_DEACTIVATE_SIGNAL_DTR 0x0000 + +#define LINE_CODING_STRUCTURE_SIZE 0x07 + +/* States for CDC class State Machine */ +typedef enum +{ + CDC_SET_LINE_CODING_RQUEST = 0, + CDC_GET_LINE_CODING_RQUEST, + CDC_SET_CONTROL_LINE_STATE_REQUEST, + CDC_ERROR_STATE +} +CDC_Requests; + +/*Line coding structure*/ +typedef union _CDC_LineCodingStructure +{ + uint8_t Array[LINE_CODING_STRUCTURE_SIZE]; + + struct + { + uint32_t dwDTERate; /*Data terminal rate, in bits per second*/ + uint8_t bCharFormat; /*Stop bits + 0 - 1 Stop bit + 1 - 1.5 Stop bits + 2 - 2 Stop bits*/ + uint8_t bParityType; /* Parity + 0 - None + 1 - Odd + 2 - Even + 3 - Mark + 4 - Space*/ + uint8_t bDataBits; /* Data bits (5, 6, 7, 8 or 16). */ + }b; +} +CDC_LineCodingTypeDef; + + + +/* Header Functional Descriptor +-------------------------------------------------------------------------------- +Offset| field | Size | Value | Description +------|---------------------|-------|------------|------------------------------ +0 | bFunctionLength | 1 | number | Size of this descriptor. +1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) +2 | bDescriptorSubtype | 1 | Constant | Identifier (ID) of functional + | | | | descriptor. +3 | bcdCDC | 2 | | + | | | Number | USB Class Definitions for + | | | | Communication Devices Specification + | | | | release number in binary-coded + | | | | decimal +------|---------------------|-------|------------|------------------------------ +*/ +typedef struct _FunctionalDescriptorHeader +{ + uint8_t bLength; /*Size of this descriptor.*/ + uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ + uint8_t bDescriptorSubType; /* Header functional descriptor subtype as*/ + uint16_t bcdCDC; /* USB Class Definitions for Communication + Devices Specification release number in + binary-coded decimal. */ +} +CDC_HeaderFuncDesc_TypeDef; +/* Call Management Functional Descriptor +-------------------------------------------------------------------------------- +Offset| field | Size | Value | Description +------|---------------------|-------|------------|------------------------------ +0 | bFunctionLength | 1 | number | Size of this descriptor. +1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) +2 | bDescriptorSubtype | 1 | Constant | Call Management functional + | | | | descriptor subtype. +3 | bmCapabilities | 1 | Bitmap | The capabilities that this configuration + | | | | supports: + | | | | D7..D2: RESERVED (Reset to zero) + | | | | D1: 0 - Device sends/receives call + | | | | management information only over + | | | | the Communication Class + | | | | interface. + | | | | 1 - Device can send/receive call + | \ | | management information over a + | | | | Data Class interface. + | | | | D0: 0 - Device does not handle call + | | | | management itself. + | | | | 1 - Device handles call + | | | | management itself. + | | | | The previous bits, in combination, identify + | | | | which call management scenario is used. If bit + | | | | D0 is reset to 0, then the value of bit D1 is + | | | | ignored. In this case, bit D1 is reset to zero for + | | | | future compatibility. +4 | bDataInterface | 1 | Number | Interface number of Data Class interface + | | | | optionally used for call management. +------|---------------------|-------|------------|------------------------------ +*/ +typedef struct _CallMgmtFunctionalDescriptor +{ + uint8_t bLength; /*Size of this functional descriptor, in bytes.*/ + uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ + uint8_t bDescriptorSubType; /* Call Management functional descriptor subtype*/ + uint8_t bmCapabilities; /* bmCapabilities: D0+D1 */ + uint8_t bDataInterface; /*bDataInterface: 1*/ +} +CDC_CallMgmtFuncDesc_TypeDef; +/* Abstract Control Management Functional Descriptor +-------------------------------------------------------------------------------- +Offset| field | Size | Value | Description +------|---------------------|-------|------------|------------------------------ +0 | bFunctionLength | 1 | number | Size of functional descriptor, in bytes. +1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) +2 | bDescriptorSubtype | 1 | Constant | Abstract Control Management + | | | | functional descriptor subtype. +3 | bmCapabilities | 1 | Bitmap | The capabilities that this configuration + | | | | supports ((A bit value of zero means that the + | | | | request is not supported.) ) + D7..D4: RESERVED (Reset to zero) + | | | | D3: 1 - Device supports the notification + | | | | Network_Connection. + | | | | D2: 1 - Device supports the request + | | | | Send_Break + | | | | D1: 1 - Device supports the request + | \ | | combination of Set_Line_Coding, + | | | | Set_Control_Line_State, Get_Line_Coding, and the + notification Serial_State. + | | | | D0: 1 - Device supports the request + | | | | combination of Set_Comm_Feature, + | | | | Clear_Comm_Feature, and Get_Comm_Feature. + | | | | The previous bits, in combination, identify + | | | | which requests/notifications are supported by + | | | | a Communication Class interface with the + | | | | SubClass code of Abstract Control Model. +------|---------------------|-------|------------|------------------------------ +*/ +typedef struct _AbstractCntrlMgmtFunctionalDescriptor +{ + uint8_t bLength; /*Size of this functional descriptor, in bytes.*/ + uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ + uint8_t bDescriptorSubType; /* Abstract Control Management functional + descriptor subtype*/ + uint8_t bmCapabilities; /* The capabilities that this configuration supports */ +} +CDC_AbstCntrlMgmtFuncDesc_TypeDef; +/* Union Functional Descriptor +-------------------------------------------------------------------------------- +Offset| field | Size | Value | Description +------|---------------------|-------|------------|------------------------------ +0 | bFunctionLength | 1 | number | Size of this descriptor. +1 | bDescriptorType | 1 | Constant | CS_INTERFACE (0x24) +2 | bDescriptorSubtype | 1 | Constant | Union functional + | | | | descriptor subtype. +3 | bMasterInterface | 1 | Constant | The interface number of the + | | | | Communication or Data Class interface +4 | bSlaveInterface0 | 1 | Number | nterface number of first slave or associated + | | | | interface in the union. +------|---------------------|-------|------------|------------------------------ +*/ +typedef struct _UnionFunctionalDescriptor +{ + uint8_t bLength; /*Size of this functional descriptor, in bytes*/ + uint8_t bDescriptorType; /*CS_INTERFACE (0x24)*/ + uint8_t bDescriptorSubType; /* Union functional descriptor SubType*/ + uint8_t bMasterInterface; /* The interface number of the Communication or + Data Class interface,*/ + uint8_t bSlaveInterface0; /*Interface number of first slave*/ +} +CDC_UnionFuncDesc_TypeDef; + +typedef struct _USBH_CDCInterfaceDesc +{ + CDC_HeaderFuncDesc_TypeDef CDC_HeaderFuncDesc; + CDC_CallMgmtFuncDesc_TypeDef CDC_CallMgmtFuncDesc; + CDC_AbstCntrlMgmtFuncDesc_TypeDef CDC_AbstCntrlMgmtFuncDesc; + CDC_UnionFuncDesc_TypeDef CDC_UnionFuncDesc; +} +CDC_InterfaceDesc_Typedef; + +USBH_Status CDC_GETLineCoding(USB_CORE_MODULE *pdev, USBH_HOST *phost); +USBH_Status CDC_SETLineCoding(USB_CORE_MODULE *pdev, USBH_HOST *phost); +USBH_Status CDC_SETControlLineState(USB_CORE_MODULE *pdev, USBH_HOST *phost); +void CDC_ChangeStateToIssueSetConfig(USB_CORE_MODULE *pdev, USBH_HOST *phost); +void CDC_IssueGetConfig(USB_CORE_MODULE *pdev, USBH_HOST *phost); + +#endif /* __USBH_CDC_FUNCT_H */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/src/usbh_cdc_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/src/usbh_cdc_core.c new file mode 100644 index 0000000000..b28f5eb0a6 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/src/usbh_cdc_core.c @@ -0,0 +1,568 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_cdc_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbh_cdc_core.h" + +#define CDC_BUFFER_SIZE 1024 + +#ifdef USB_INTERNAL_DMA_ENABLED +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma data_alignment=4 +#endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN CDC_Machine_TypeDef CDC_Machine __ALIGN_END ; + +CDC_Requests CDC_ReqState; +CDC_Xfer_TypeDef CDC_TxParam; +CDC_Xfer_TypeDef CDC_RxParam; + +#ifdef USB_INTERNAL_DMA_ENABLED +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma data_alignment=4 +#endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t TxBuf [CDC_BUFFER_SIZE] __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma data_alignment=4 +#endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t RxBuf [CDC_BUFFER_SIZE] __ALIGN_END ; + +CDC_Usercb_TypeDef UserCb; +uint8_t RX_Enabled = 0; + +static void CDC_InitTxRxParam(void); + +static void CDC_ReceiveData(CDC_Xfer_TypeDef *cdc_Data); + +static void CDC_ProcessTransmission(USB_CORE_MODULE *pdev, USBH_HOST *phost); + +static void CDC_ProcessReception(USB_CORE_MODULE *pdev, USBH_HOST *phost); + +static USBH_Status CDC_InterfaceInit(USB_CORE_MODULE *pdev , void *phost); + +void CDC_InterfaceDeInit(USB_CORE_MODULE *pdev , void *phost); + +static USBH_Status CDC_Handle(USB_CORE_MODULE *pdev , void *phost); + +static USBH_Status CDC_ClassRequest(USB_CORE_MODULE *pdev , void *phost); + + +USBH_Class_cb_TypeDef USBH_CDC_cb = +{ + CDC_InterfaceInit, + CDC_InterfaceDeInit, + CDC_ClassRequest, + CDC_Handle +}; + +/** +*\*\name CDC_InterfaceInit. +*\*\fun The function init the CDC class. +*\*\param pdev: Selected device +*\*\param phost: Selected device property +*\*\return USBH_Status :Response for USB CDC driver intialization. +*\*\ +**/ +static USBH_Status CDC_InterfaceInit ( USB_CORE_MODULE *pdev, void *phost) +{ + USBH_HOST *pphost = phost; + USBH_Status status = USBH_OK ; + + /* Communication Interface */ + if((pphost->device_prop.Itf_Desc[0].bInterfaceClass == COMMUNICATION_DEVICE_CLASS_CODE)&& \ + (pphost->device_prop.Itf_Desc[0].bInterfaceSubClass == ABSTRACT_CONTROL_MODEL) && \ + (pphost->device_prop.Itf_Desc[0].bInterfaceProtocol == COMMON_AT_COMMAND)) + { + /*Collect the notification endpoint address and length*/ + CDC_Machine.CDC_CommItf.ep_addr = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress; + CDC_Machine.CDC_CommItf.length = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize; + + if(pphost->device_prop.Ep_Desc[0][0].bEndpointAddress & 0x80) + { + CDC_Machine.CDC_CommItf.notificationEp = (pphost->device_prop.Ep_Desc[0][0].bEndpointAddress); + } + /*Allocate the length for host channel number in*/ + CDC_Machine.CDC_CommItf.hc_num_in = USBH_Alloc_Channel(pdev, CDC_Machine.CDC_CommItf.notificationEp ); + /* Open channel for IN endpoint */ + USBH_Open_Channel (pdev, CDC_Machine.CDC_CommItf.hc_num_in,pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_INTR, CDC_Machine.CDC_CommItf.length); + } + else + { + pphost->usr_cb->DeviceNotSupported(); + } + + + /* Data Interface */ + if((pphost->device_prop.Itf_Desc[1].bInterfaceClass == DATA_INTERFACE_CLASS_CODE)&& \ + (pphost->device_prop.Itf_Desc[1].bInterfaceSubClass == RESERVED) && \ + (pphost->device_prop.Itf_Desc[1].bInterfaceProtocol == NO_CLASS_SPECIFIC_PROTOCOL_CODE)) + { + /*Collect the class specific endpoint address and length*/ + CDC_Machine.CDC_DataItf.ep_addr = pphost->device_prop.Ep_Desc[1][0].bEndpointAddress; + CDC_Machine.CDC_DataItf.length = pphost->device_prop.Ep_Desc[1][0].wMaxPacketSize; + + if(pphost->device_prop.Ep_Desc[1][0].bEndpointAddress & 0x80) + { + CDC_Machine.CDC_DataItf.cdcInEp = (pphost->device_prop.Ep_Desc[1][0].bEndpointAddress); + } + else + { + CDC_Machine.CDC_DataItf.cdcOutEp = (pphost->device_prop.Ep_Desc[1][0].bEndpointAddress); + } + + if(pphost->device_prop.Ep_Desc[1][1].bEndpointAddress & 0x80) + { + CDC_Machine.CDC_DataItf.cdcInEp = (pphost->device_prop.Ep_Desc[1][1].bEndpointAddress); + } + else + { + CDC_Machine.CDC_DataItf.cdcOutEp = (pphost->device_prop.Ep_Desc[1][1].bEndpointAddress); + } + + /*Allocate the length for host channel number out*/ + CDC_Machine.CDC_DataItf.hc_num_out = USBH_Alloc_Channel(pdev, CDC_Machine.CDC_DataItf.cdcOutEp); + /*Allocate the length for host channel number in*/ + CDC_Machine.CDC_DataItf.hc_num_in = USBH_Alloc_Channel(pdev, CDC_Machine.CDC_DataItf.cdcInEp); + + /* Open channel for OUT endpoint */ + USBH_Open_Channel(pdev, CDC_Machine.CDC_DataItf.hc_num_out, pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_BULK, CDC_Machine.CDC_DataItf.length); + /* Open channel for IN endpoint */ + USBH_Open_Channel(pdev, CDC_Machine.CDC_DataItf.hc_num_in, pphost->device_prop.address, pphost->device_prop.speed, EP_TYPE_BULK, CDC_Machine.CDC_DataItf.length); + + /*Initilise the Tx/Rx Params*/ + CDC_InitTxRxParam(); + + /*Initialize the class specific request with "GET_LINE_CODING"*/ + CDC_ReqState = CDC_GET_LINE_CODING_RQUEST ; + } + else + { + pphost->usr_cb->DeviceNotSupported(); + } + return status; + +} + +/** +*\*\name CDC_InterfaceDeInit. +*\*\fun The function DeInit the Host Channels used for the CDC class. +*\*\param pdev: Selected device +*\*\param phost: Selected device property +*\*\return none. +*\*\ +**/ +void CDC_InterfaceDeInit ( USB_CORE_MODULE *pdev, void *phost) +{ + if (CDC_Machine.CDC_CommItf.hc_num_in) + { + USB_HCH_Halt(pdev, CDC_Machine.CDC_CommItf.hc_num_in); + USBH_Free_Channel(pdev,CDC_Machine.CDC_CommItf.hc_num_in); + CDC_Machine.CDC_CommItf.hc_num_in = 0; /* Reset the Channel as Free */ + } + + if (CDC_Machine.CDC_DataItf.hc_num_out) + { + USB_HCH_Halt(pdev, CDC_Machine.CDC_DataItf.hc_num_out); + USBH_Free_Channel(pdev,CDC_Machine.CDC_DataItf.hc_num_out); + CDC_Machine.CDC_DataItf.hc_num_out = 0; /* Reset the Channel as Free */ + } + + if (CDC_Machine.CDC_DataItf.hc_num_in) + { + USB_HCH_Halt(pdev, CDC_Machine.CDC_DataItf.hc_num_in); + USBH_Free_Channel (pdev,CDC_Machine.CDC_DataItf.hc_num_in); + CDC_Machine.CDC_DataItf.hc_num_in = 0; /* Reset the Channel as Free */ + } +} + +/** +*\*\name CDC_ClassRequest. +*\*\fun The function is responsible for handling CDC Class requests for CDC class. +*\*\param pdev: Selected device +*\*\param phost: Selected device property +*\*\return USBH_Status :Response for USB Set Protocol request. +*\*\ +**/ +static USBH_Status CDC_ClassRequest(USB_CORE_MODULE *pdev , void *phost) +{ + USBH_HOST *pphost = phost; + + USBH_Status status = USBH_BUSY; + USBH_Status ClassReqStatus = USBH_BUSY; + + switch(CDC_ReqState) + { + + case CDC_GET_LINE_CODING_RQUEST: + /*Issue the get line coding request*/ + ClassReqStatus = CDC_GETLineCoding(pdev, phost); + if( ClassReqStatus == USBH_OK ) + { /*Change the state */ + CDC_ReqState = CDC_SET_CONTROL_LINE_STATE_REQUEST; + } + break; + + case CDC_SET_LINE_CODING_RQUEST: + /*Issue the set line coding request*/ + ClassReqStatus = CDC_SETLineCoding(pdev, phost); + if(ClassReqStatus == USBH_OK ) + { + /*Change the state */ + CDC_ReqState = CDC_GET_LINE_CODING_RQUEST ; + } + if(ClassReqStatus == USBH_NOT_SUPPORTED ) + { + /* a Clear Feature should be issued here */ + CDC_ReqState = CDC_ERROR_STATE; + } + break; + + case CDC_SET_CONTROL_LINE_STATE_REQUEST: + /*Issue the set control line coding */ + ClassReqStatus = CDC_SETControlLineState(pdev, phost); + if( ClassReqStatus == USBH_OK ) + { + /*Change the state */ + CDC_ReqState = CDC_SET_CONTROL_LINE_STATE_REQUEST; + /*Also set the state of receive CDCRxParam to IDLE*/ + CDC_RxParam.CDCState = CDC_IDLE; + status = USBH_OK; /*This return from class specific routinues request*/ + } + break; + + case CDC_ERROR_STATE: + + ClassReqStatus = USBH_ClrFeature(pdev, phost, 0x00, pphost->Control.hch_num_out); + + if(ClassReqStatus == USBH_OK ) + { + /*Change the state to waiting*/ + CDC_ReqState = CDC_GET_LINE_CODING_RQUEST ; + } + break; + } + + return status; +} + + + +/** +*\*\name CDC_Handle. +*\*\fun The function is for managing state machine for CDC data transfers. +*\*\param pdev: Selected device +*\*\param phost: Selected device property +*\*\return status. +*\*\ +**/ +static USBH_Status CDC_Handle(USB_CORE_MODULE *pdev , void *phost) +{ + USBH_Status status = USBH_OK; + USBH_HOST *pphost = phost; + + /* Call Application process */ + pphost->usr_cb->UserApplication(); + + /*Handle the transmission */ + CDC_ProcessTransmission(pdev, pphost); + + /*Always send in packet to device*/ + CDC_ProcessReception(pdev, pphost); + + return status; +} + + + +/** +*\*\name CDC_ProcessTransmission. +*\*\fun The function is responsible for sending data to the device. +*\*\param pdev: Selected device +*\*\param phost: Selected device property +*\*\return none. +*\*\ +**/ +void CDC_ProcessTransmission(USB_CORE_MODULE *pdev, USBH_HOST *phost) +{ + static uint32_t len ; + URB_STATE URB_StatusTx = URB_IDLE; + + URB_StatusTx = HOST_GetURB_State(pdev , CDC_Machine.CDC_DataItf.hc_num_out); + + switch(CDC_TxParam.CDCState) + { + case CDC_IDLE: + break; + + case CDC_SEND_DATA: + if(( URB_StatusTx == URB_DONE ) || (URB_StatusTx == URB_IDLE)) + { + /*Check the data length is more then the CDC_Machine.CDC_DataItf.CDC_DataItf.length */ + if(CDC_TxParam.DataLength > CDC_Machine.CDC_DataItf.length) + { + + len = CDC_Machine.CDC_DataItf.length ; + /*Send the data */ + USBH_BulkSendData (pdev, CDC_TxParam.pRxTxBuff, len , CDC_Machine.CDC_DataItf.hc_num_out); + } + else + { + len = CDC_TxParam.DataLength ; + /*Send the remaining data */ + USBH_BulkSendData (pdev, CDC_TxParam.pRxTxBuff, len, CDC_Machine.CDC_DataItf.hc_num_out); + } + CDC_TxParam.CDCState = CDC_DATA_SENT; + } + break; + + case CDC_DATA_SENT: + /*Check the status done for transmssion*/ + if(URB_StatusTx == URB_DONE ) + { + /*Point to next chunc of data*/ + CDC_TxParam.pRxTxBuff += len ; + + /*decrease the data length*/ + CDC_TxParam.DataLength -= len; + + if(CDC_TxParam.DataLength == 0) + { + CDC_TxParam.CDCState = CDC_IDLE; + } + else + { + CDC_TxParam.CDCState = CDC_SEND_DATA; + } + } + else if( URB_StatusTx == URB_NOTREADY ) + { + /*Send the same data */ + USBH_BulkSendData (pdev, (CDC_TxParam.pRxTxBuff), len, CDC_Machine.CDC_DataItf.hc_num_out); + } + break; + + case CDC_READ_DATA: + break; + + case CDC_BUSY: + break; + + case CDC_GET_DATA: + break; + + case CDC_POLL: + break; + + case CDC_CTRL_STATE: + break; + } +} + +/** +*\*\name CDC_ProcessReception. +*\*\fun This function responsible for reception of data from the device. +*\*\param pdev: Selected device +*\*\param phost: Selected device property +*\*\return none. +*\*\ +**/ +static void CDC_ProcessReception(USB_CORE_MODULE *pdev, USBH_HOST *phost) +{ + if(RX_Enabled == 1) + { + URB_STATE URB_StatusRx = HOST_GetURB_State(pdev , CDC_Machine.CDC_DataItf.hc_num_in); + + switch(CDC_RxParam.CDCState) + { + case CDC_IDLE: + /*check the received length lesser then the remaining space available in the + buffer */ + if(CDC_RxParam.DataLength < (CDC_RxParam.BufferLen - CDC_Machine.CDC_DataItf.length)) + { + /*Receive the data */ + USBH_BulkReceiveData(pdev, CDC_RxParam.pFillBuff, CDC_Machine.CDC_DataItf.length, CDC_Machine.CDC_DataItf.hc_num_in); + + /*change the cdc state to USBH_CDC_GET_DATA*/ + CDC_RxParam.CDCState = CDC_GET_DATA; + } + break; + + case CDC_GET_DATA: + /*Check the last state of the device is URB_DONE */ + if(URB_StatusRx == URB_DONE) + { + /* Move the pointer as well as datalength */ + CDC_RxParam.DataLength += pdev->host.XferCnt[CDC_Machine.CDC_DataItf.hc_num_in]; + CDC_RxParam.pFillBuff += pdev->host.XferCnt[CDC_Machine.CDC_DataItf.hc_num_in]; + + + /* Process the recived data */ + CDC_ReceiveData(&CDC_RxParam); + + /*change the state od the CDC state*/ + CDC_RxParam.CDCState = CDC_IDLE; + } + break; + + case CDC_READ_DATA: + break; + + case CDC_BUSY: + break; + + case CDC_SEND_DATA: + break; + + case CDC_DATA_SENT: + break; + + case CDC_POLL: + break; + + case CDC_CTRL_STATE: + break; + } + } +} + + +/** +*\*\name CDC_InitTxRxParam. +*\*\fun Initialize the transmit and receive buffer and its parameter. +*\*\param none. +*\*\return none. +*\*\ +**/ +static void CDC_InitTxRxParam(void) +{ + /*Initialize the Transmit buffer and its parameter*/ + CDC_TxParam.CDCState = CDC_IDLE; + CDC_TxParam.DataLength = 0; + CDC_TxParam.pRxTxBuff = TxBuf; + + /*Initialize the Receive buffer and its parameter*/ + CDC_RxParam.CDCState = CDC_IDLE; + CDC_RxParam.DataLength = 0; + CDC_RxParam.pFillBuff = RxBuf; + CDC_RxParam.pEmptyBuff = RxBuf; + CDC_RxParam.BufferLen = sizeof(RxBuf); +} + +/** +*\*\name CDC_ReceiveData. +*\*\fun This is a call back function from cdc core layer to redirect the received data on the user out put system. +*\*\param cdc_Data: type of USBH_CDCXfer_TypeDef. +*\*\return none. +*\*\ +**/ +static void CDC_ReceiveData(CDC_Xfer_TypeDef *cdc_Data) +{ + uint8_t *ptr; + + if(cdc_Data->pEmptyBuff < cdc_Data->pFillBuff) + { + ptr = cdc_Data->pFillBuff; + *ptr = 0x00; + + /* redirect the received data on the user out put system */ + UserCb.Receive(cdc_Data->pEmptyBuff); + + cdc_Data->pFillBuff = cdc_Data->pEmptyBuff ; + cdc_Data->DataLength = 0; /*Reset the data length to zero*/ + } +} + + +/** +*\*\name CDC_SendData. +*\*\fun This function send data to the device. +*\*\param data : the pointer of send data +*\*\param length : length of data +*\*\return none. +**/ +void CDC_SendData(uint8_t *data, uint16_t length) +{ + if(CDC_TxParam.CDCState == CDC_IDLE) + { + CDC_TxParam.pRxTxBuff = data; + CDC_TxParam.DataLength = length; + CDC_TxParam.CDCState = CDC_SEND_DATA; + } +} + +/** +*\*\name CDC_StartReception. +*\*\fun CDC start reception. +*\*\param pdev: Selected device +*\*\return none. +**/ +void CDC_StartReception(USB_CORE_MODULE *pdev) +{ + RX_Enabled = 1; +} + +/** +*\*\name CDC_StopReception. +*\*\fun CDC stop reception. +*\*\param pdev: Selected device +*\*\return none. +**/ +void CDC_StopReception(USB_CORE_MODULE *pdev) +{ + RX_Enabled = 0; + USB_HCH_Halt(pdev, CDC_Machine.CDC_DataItf.hc_num_in); + USBH_Free_Channel(pdev,CDC_Machine.CDC_DataItf.hc_num_in); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/src/usbh_cdc_funct.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/src/usbh_cdc_funct.c new file mode 100644 index 0000000000..a8018a4e47 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/CDC/src/usbh_cdc_funct.c @@ -0,0 +1,151 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_cdc_funct.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbh_cdc_funct.h" + +CDC_InterfaceDesc_Typedef CDC_Desc; +CDC_LineCodingTypeDef CDC_GetLineCode; +CDC_LineCodingTypeDef CDC_SetLineCode; + +extern CDC_Requests CDC_ReqState; + +/** +*\*\name CDC_GETLineCoding. +*\*\fun This request allows the host to find out the currently configured line coding. +*\*\param pdev: Selected device +*\*\param phost: Selected device property +*\*\return status. +**/ +USBH_Status CDC_GETLineCoding(USB_CORE_MODULE *pdev , USBH_HOST *phost) +{ + phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_TYPE_CLASS | USB_REQ_RECIPIENT_INTERFACE; + + phost->Control.setup.b.bRequest = CDC_GET_LINE_CODING; + phost->Control.setup.b.wValue.w = 0; + phost->Control.setup.b.wIndex.w = CDC_Desc.CDC_UnionFuncDesc.bMasterInterface; /*At to be checked*/ + phost->Control.setup.b.wLength.w = LINE_CODING_STRUCTURE_SIZE; + + return USBH_CtrlReq(pdev, phost, CDC_GetLineCode.Array, LINE_CODING_STRUCTURE_SIZE); +} + +/** +*\*\name CDC_SETLineCoding. +*\*\fun This request allows the host to specify typical asynchronous line-character formatting properties. +*\*\param pdev: Selected device +*\*\param phost: Selected device property +*\*\return status. +**/ +USBH_Status CDC_SETLineCoding(USB_CORE_MODULE *pdev, USBH_HOST *phost) +{ + phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_CLASS | USB_REQ_RECIPIENT_INTERFACE; + + phost->Control.setup.b.bRequest = CDC_SET_LINE_CODING; + phost->Control.setup.b.wValue.w = 0; + + phost->Control.setup.b.wIndex.w = CDC_Desc.CDC_UnionFuncDesc.bMasterInterface; + + phost->Control.setup.b.wLength.w = LINE_CODING_STRUCTURE_SIZE; + + return USBH_CtrlReq(pdev, phost, CDC_SetLineCode.Array , LINE_CODING_STRUCTURE_SIZE ); +} + +/** +*\*\name CDC_SETControlLineState. +*\*\fun This request generates RS-232/V.24 style control signals. +*\*\param pdev: Selected device +*\*\param phost: Selected device property +*\*\return status. +**/ +USBH_Status CDC_SETControlLineState(USB_CORE_MODULE *pdev, USBH_HOST *phost) +{ + phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_CLASS | USB_REQ_RECIPIENT_INTERFACE; + + phost->Control.setup.b.bRequest = CDC_SET_CONTROL_LINE_STATE; + /*Control Signal Bitmap Values for SetControlLineState*/ + phost->Control.setup.b.wValue.w = CDC_DEACTIVATE_CARRIER_SIGNAL_RTS | CDC_DEACTIVATE_SIGNAL_DTR; + + phost->Control.setup.b.wIndex.w = CDC_Desc.CDC_UnionFuncDesc.bMasterInterface; + + /*Length feild is zero*/ + phost->Control.setup.b.wLength.w = 0; + + return USBH_CtrlReq(pdev, phost, 0 , 0 ); +} + +/** +*\*\name CDC_ChangeStateToIssueSetConfig. +*\*\fun This function prepares the state before issuing the class specific commands. +*\*\param pdev: Selected device +*\*\param phost: Selected device property +*\*\return none. +**/ +void CDC_ChangeStateToIssueSetConfig(USB_CORE_MODULE *pdev, USBH_HOST *phost) +{ + phost->gStateBkp = phost->gState ; + phost->gState = HOST_CLASS_REQUEST; + CDC_ReqState = CDC_SET_LINE_CODING_RQUEST; +} + +/** +*\*\name CDC_ChangeStateToIssueSetConfig. +*\*\fun This function prepares the state before issuing the class specific commands. +*\*\param pdev: Selected device +*\*\param phost: Selected device property +*\*\return none. +**/ +void CDC_IssueGetConfig(USB_CORE_MODULE *pdev, USBH_HOST *phost) +{ + phost->gStateBkp = phost->gState ; + phost->gState = HOST_CLASS_REQUEST; + CDC_ReqState = CDC_GET_LINE_CODING_RQUEST; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_core.h new file mode 100644 index 0000000000..d2ad2564fd --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_core.h @@ -0,0 +1,212 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_hid_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +/* Define to prevent recursive ----------------------------------------------*/ +#ifndef __USBH_HID_CORE_H +#define __USBH_HID_CORE_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbh_core.h" +#include "usbh_stdreq.h" +#include "usbhs_bsp.h" +#include "usbh_ioreq.h" +#include "usbh_hcs.h" + +/** @addtogroup USBH_LIB + * @{ + */ + +/** @addtogroup USBH_CLASS + * @{ + */ + +/** @addtogroup USBH_HID_CLASS + * @{ + */ + +/** @defgroup USBH_HID_CORE + * @brief This file is the Header file for USBH_HID_CORE.c + * @{ + */ + + +/** @defgroup USBH_HID_CORE_Exported_Types + * @{ + */ + +#define HID_MIN_POLL 10 + +/* States for HID State Machine */ +typedef enum +{ + HID_IDLE= 0, + HID_SEND_DATA, + HID_BUSY, + HID_GET_DATA, + HID_SYNC, + HID_POLL, + HID_ERROR, +} +HID_State; + +typedef enum +{ + HID_REQ_IDLE = 0, + HID_REQ_GET_REPORT_DESC, + HID_REQ_GET_HID_DESC, + HID_REQ_SET_IDLE, + HID_REQ_SET_PROTOCOL, + HID_REQ_SET_REPORT, + +} +HID_CtlState; + +typedef struct HID_cb +{ + void (*Init) (void); + void (*Decode) (uint8_t *data); + +} HID_cb_TypeDef; + +typedef struct _HID_Report +{ + uint8_t ReportID; + uint8_t ReportType; + uint16_t UsagePage; + uint32_t Usage[2]; + uint32_t NbrUsage; + uint32_t UsageMin; + uint32_t UsageMax; + int32_t LogMin; + int32_t LogMax; + int32_t PhyMin; + int32_t PhyMax; + int32_t UnitExp; + uint32_t Unit; + uint32_t ReportSize; + uint32_t ReportCnt; + uint32_t Flag; + uint32_t PhyUsage; + uint32_t AppUsage; + uint32_t LogUsage; +} +HID_Report_TypeDef; + +/* Structure for HID process */ +typedef struct _HID_Process +{ + uint8_t buff[64]; + uint8_t hc_num_in; + uint8_t hc_num_out; + HID_State state; + uint8_t HIDIntOutEp; + uint8_t HIDIntInEp; + HID_CtlState ctl_state; + uint16_t length; + uint8_t ep_addr; + uint16_t poll; + __IO uint16_t timer; + HID_cb_TypeDef *cb; +} +HID_Machine_TypeDef; + +/** + * @} + */ + +/** @defgroup USBH_HID_CORE_Exported_Defines + * @{ + */ + +#define USB_HID_REQ_GET_REPORT 0x01 +#define USB_HID_GET_IDLE 0x02 +#define USB_HID_GET_PROTOCOL 0x03 +#define USB_HID_SET_REPORT 0x09 +#define USB_HID_SET_IDLE 0x0A +#define USB_HID_SET_PROTOCOL 0x0B +/** + * @} + */ + +/** @defgroup USBH_HID_CORE_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBH_HID_CORE_Exported_Variables + * @{ + */ +extern USBH_Class_cb_TypeDef USBH_HID_cb; +/** + * @} + */ + +/** @defgroup USBH_HID_CORE_Exported_FunctionsPrototype + * @{ + */ + +USBH_Status USBH_Set_Report (USB_CORE_MODULE *pdev, + USBH_HOST *phost, + uint8_t reportType, + uint8_t reportId, + uint8_t reportLen, + uint8_t* reportBuff); +/** + * @} + */ + + +#endif /* __USBH_HID_CORE_H */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_keyboard.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_keyboard.h new file mode 100644 index 0000000000..fb5eaf1494 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_keyboard.h @@ -0,0 +1,81 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_hid_keyboard.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USBH_HID_KEYBD_H +#define __USBH_HID_KEYBD_H + +#include "usbhs_conf.h" +#include "usbh_hid_core.h" + +#define QWERTY_KEYBOARD +//#define AZERTY_KEYBOARD + +#define KBD_LEFT_CTRL 0x01 +#define KBD_LEFT_SHIFT 0x02 +#define KBD_LEFT_ALT 0x04 +#define KBD_LEFT_GUI 0x08 +#define KBD_RIGHT_CTRL 0x10 +#define KBD_RIGHT_SHIFT 0x20 +#define KBD_RIGHT_ALT 0x40 +#define KBD_RIGHT_GUI 0x80 + +#define KBR_MAX_NBR_PRESSED 6 + +extern HID_cb_TypeDef HID_KEYBRD_cb; + +void USER_KEYBRD_Init (void); +void USER_KEYBRD_ProcessData (uint8_t pbuf); + +#endif /* __USBH_HID_KEYBD_H */ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_mouse.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_mouse.h new file mode 100644 index 0000000000..22dcd955ab --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/inc/usbh_hid_mouse.h @@ -0,0 +1,129 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_hid_mouse.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +/* Define to prevent recursive ----------------------------------------------*/ +#ifndef __USBH_HID_MOUSE_H +#define __USBH_HID_MOUSE_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbh_hid_core.h" + +/** @addtogroup USBH_LIB + * @{ + */ + +/** @addtogroup USBH_CLASS + * @{ + */ + +/** @addtogroup USBH_HID_CLASS + * @{ + */ + +/** @defgroup USBH_HID_MOUSE + * @brief This file is the Header file for USBH_HID_MOUSE.c + * @{ + */ + + +/** @defgroup USBH_HID_MOUSE_Exported_Types + * @{ + */ +typedef struct _HID_MOUSE_Data +{ + uint8_t x; + uint8_t y; + uint8_t z; /* Not Supported */ + uint8_t button; +} +HID_MOUSE_Data_TypeDef; + +/** + * @} + */ + +/** @defgroup USBH_HID_MOUSE_Exported_Defines + * @{ + */ +/** + * @} + */ + +/** @defgroup USBH_HID_MOUSE_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBH_HID_MOUSE_Exported_Variables + * @{ + */ + +extern HID_cb_TypeDef HID_MOUSE_cb; +extern HID_MOUSE_Data_TypeDef HID_MOUSE_Data; +/** + * @} + */ + +/** @defgroup USBH_HID_MOUSE_Exported_FunctionsPrototype + * @{ + */ +void USER_MOUSE_Init (void); +void USER_MOUSE_ProcessData (HID_MOUSE_Data_TypeDef *data); +/** + * @} + */ + +#endif /* __USBH_HID_MOUSE_H */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_core.c new file mode 100644 index 0000000000..6eb145c207 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_core.c @@ -0,0 +1,559 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_hid_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +/* Includes ------------------------------------------------------------------*/ +#include "usbh_hid_core.h" +#include "usbh_hid_mouse.h" +#include "usbh_hid_keyboard.h" +#include "usbhs_conf.h" +#include "n32h76x_78x_gpio.h" +#include "log.h" + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN HID_Machine_TypeDef HID_Machine __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN HID_Report_TypeDef HID_Report __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN USB_Setup_TypeDef HID_Setup __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN USBH_HIDDesc_TypeDef HID_Desc __ALIGN_END ; + +__IO uint8_t start_toggle = 0; + +static USBH_Status USBH_HID_InterfaceInit (USB_CORE_MODULE *pdev , void *phost); + +static void USBH_ParseHIDDesc (USBH_HIDDesc_TypeDef *desc, uint8_t *buf); + +static void USBH_HID_InterfaceDeInit (USB_CORE_MODULE *pdev , void *phost); + +static USBH_Status USBH_HID_Handle(USB_CORE_MODULE *pdev , void *phost); + +static USBH_Status USBH_HID_ClassRequest(USB_CORE_MODULE *pdev , void *phost); + +static USBH_Status USBH_Get_HID_ReportDescriptor (USB_CORE_MODULE *pdev, USBH_HOST *phost, uint16_t length); + +static USBH_Status USBH_Get_HID_Descriptor (USB_CORE_MODULE *pdev, USBH_HOST *phost, uint16_t length); + +static USBH_Status USBH_Set_Idle (USB_CORE_MODULE *pdev, USBH_HOST *phost, uint8_t duration, uint8_t reportId); + +static USBH_Status USBH_Set_Protocol (USB_CORE_MODULE *pdev, USBH_HOST *phost, uint8_t protocol); + + +USBH_Class_cb_TypeDef USBH_HID_cb = +{ + USBH_HID_InterfaceInit, + USBH_HID_InterfaceDeInit, + USBH_HID_ClassRequest, + USBH_HID_Handle +}; + +/** +*\*\name USBH_HID_InterfaceInit. +*\*\fun The function init the HID class. +*\*\param pdev: selected device. +*\*\param phost: Selected device property +*\*\return status. +*\*\ +**/ +static USBH_Status USBH_HID_InterfaceInit(USB_CORE_MODULE *pdev, void *phost) +{ + uint8_t maxEP; + USBH_HOST *pphost = phost; + + uint8_t num =0; + USBH_Status status = USBH_BUSY ; + HID_Machine.state = HID_ERROR; + + + if(pphost->device_prop.Itf_Desc[0].bInterfaceSubClass == HID_BOOT_CODE) + { + /*Decode Bootclass Protocol: Mouse or Keyboard*/ + if(pphost->device_prop.Itf_Desc[0].bInterfaceProtocol == HID_KEYBRD_BOOT_CODE) + { + HID_Machine.cb = &HID_KEYBRD_cb; + } + else if(pphost->device_prop.Itf_Desc[0].bInterfaceProtocol == HID_MOUSE_BOOT_CODE) + { + HID_Machine.cb = &HID_MOUSE_cb; + } + + HID_Machine.state = HID_IDLE; + HID_Machine.ctl_state = HID_REQ_IDLE; + HID_Machine.ep_addr = pphost->device_prop.Ep_Desc[0][0].bEndpointAddress; + HID_Machine.length = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize; + HID_Machine.poll = pphost->device_prop.Ep_Desc[0][0].bInterval ; + + if (HID_Machine.poll < HID_MIN_POLL) + { + HID_Machine.poll = HID_MIN_POLL; + } + + /* Check fo available number of endpoints */ + /* Find the number of EPs in the Interface Descriptor */ + /* Choose the lower number in order not to overrun the buffer allocated */ + maxEP = ( (pphost->device_prop.Itf_Desc[0].bNumEndpoints <= USBH_MAX_NUM_ENDPOINTS) ? + pphost->device_prop.Itf_Desc[0].bNumEndpoints : USBH_MAX_NUM_ENDPOINTS); + + /* Decode endpoint IN and OUT address from interface descriptor */ + for (num=0; num < maxEP; num++) + { + if(pphost->device_prop.Ep_Desc[0][num].bEndpointAddress & 0x80) + { + HID_Machine.HIDIntInEp = (pphost->device_prop.Ep_Desc[0][num].bEndpointAddress); + HID_Machine.hc_num_in = USBH_Alloc_Channel(pdev, pphost->device_prop.Ep_Desc[0][num].bEndpointAddress); + + /* Open channel for IN endpoint */ + USBH_Open_Channel(pdev, + HID_Machine.hc_num_in, + pphost->device_prop.address, + pphost->device_prop.speed, + EP_TYPE_INTR, + HID_Machine.length); + } + else + { + HID_Machine.HIDIntOutEp = (pphost->device_prop.Ep_Desc[0][num].bEndpointAddress); + HID_Machine.hc_num_out = USBH_Alloc_Channel(pdev, pphost->device_prop.Ep_Desc[0][num].bEndpointAddress); + + /* Open channel for OUT endpoint */ + USBH_Open_Channel(pdev, + HID_Machine.hc_num_out, + pphost->device_prop.address, + pphost->device_prop.speed, + EP_TYPE_INTR, + HID_Machine.length); + } + } + + start_toggle =0; + status = USBH_OK; + } + else + { + if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_HUB) + { + log_info("Hub is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_CDCC) + { + log_info("Communications and CDC Control device is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_MSC) + { + log_info("MSC device is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_PRINTER) + { + log_info("Printer device is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_SMARTCARD) + { + log_info("Smart Card device is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_VIDEO) + { + log_info("Video device is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_AVD) + { + log_info("Audio/Video Devices is not supported.\n"); + } + else + { + log_info("The attached device is not supported. \n"); + } + pphost->usr_cb->DeviceNotSupported(); + } + return status; +} + + + + +/** +*\*\name USBH_HID_InterfaceDeInit. +*\*\fun The function DeInit the Host Channels used for the HID class. +*\*\param pdev: selected device. +*\*\param phost: Selected device property +*\*\return none. +*\*\ +**/ +void USBH_HID_InterfaceDeInit ( USB_CORE_MODULE *pdev, void *phost) +{ + if(HID_Machine.hc_num_in != 0x00) + { + USB_HCH_Halt(pdev, HID_Machine.hc_num_in); + USBH_Free_Channel(pdev, HID_Machine.hc_num_in); + HID_Machine.hc_num_in = 0; /* Reset the Channel as Free */ + } + + if(HID_Machine.hc_num_out != 0x00) + { + USB_HCH_Halt(pdev, HID_Machine.hc_num_out); + USBH_Free_Channel(pdev, HID_Machine.hc_num_out); + HID_Machine.hc_num_out = 0; /* Reset the Channel as Free */ + } + + start_toggle = 0; +} + +/** +*\*\name USBH_HID_ClassRequest. +*\*\fun The function is responsible for handling HID Class requests for HID class. +*\*\param pdev: selected device. +*\*\param phost: Selected device property +*\*\return USBH_Status :Response for USB Set Protocol request. +*\*\ +**/ +static USBH_Status USBH_HID_ClassRequest(USB_CORE_MODULE *pdev , void *phost) +{ + USBH_HOST *pphost = phost; + + USBH_Status status = USBH_BUSY; + USBH_Status classReqStatus = USBH_BUSY; + + + /* Switch HID state machine */ + switch (HID_Machine.ctl_state) + { + case HID_IDLE: + case HID_REQ_GET_HID_DESC: + /* Get HID Desc */ + if (USBH_Get_HID_Descriptor (pdev, pphost, USB_HID_DESC_SIZE)== USBH_OK) + { + USBH_ParseHIDDesc(&HID_Desc, pdev->host.Rx_Buffer); + HID_Machine.ctl_state = HID_REQ_GET_REPORT_DESC; + } + break; + case HID_REQ_GET_REPORT_DESC: + /* Get Report Desc */ + if (USBH_Get_HID_ReportDescriptor(pdev , pphost, HID_Desc.wItemLength) == USBH_OK) + { + HID_Machine.ctl_state = HID_REQ_SET_IDLE; + } + + break; + + case HID_REQ_SET_IDLE: + classReqStatus = USBH_Set_Idle (pdev, pphost, 0, 0); + + /* set Idle */ + if (classReqStatus == USBH_OK) + { + HID_Machine.ctl_state = HID_REQ_SET_PROTOCOL; + } + else if(classReqStatus == USBH_NOT_SUPPORTED) + { + HID_Machine.ctl_state = HID_REQ_SET_PROTOCOL; + } + break; + + case HID_REQ_SET_PROTOCOL: + /* set protocol */ + if (USBH_Set_Protocol (pdev ,pphost, 0) == USBH_OK) + { + HID_Machine.ctl_state = HID_REQ_IDLE; + + /* all requests performed*/ + status = USBH_OK; + } + break; + + default: + break; + } + + return status; +} + +/** +*\*\name USBH_HID_Handle. +*\*\fun The function is for managing state machine for HID data transfers . +*\*\param pdev: selected device. +*\*\param phost: Selected device property +*\*\return status. +*\*\ +**/ +static USBH_Status USBH_HID_Handle(USB_CORE_MODULE *pdev , void *phost) +{ + USBH_HOST *pphost = phost; + USBH_Status status = USBH_OK; + + switch (HID_Machine.state) + { + case HID_IDLE: + HID_Machine.cb->Init(); + HID_Machine.state = HID_SYNC; + + case HID_SYNC: + /* Sync with start of Even Frame */ + if(USB_IsEvenFrame(pdev) == TRUE) + { + HID_Machine.state = HID_GET_DATA; + } + break; + + case HID_GET_DATA: + USBH_InterruptReceiveData(pdev, HID_Machine.buff, HID_Machine.length, HID_Machine.hc_num_in); + start_toggle = 1; + HID_Machine.state = HID_POLL; + HID_Machine.timer = HOST_GetCurrentFrame(pdev); + break; + + case HID_POLL: + if(( HOST_GetCurrentFrame(pdev) - HID_Machine.timer) >= HID_Machine.poll) + { + HID_Machine.state = HID_GET_DATA; + } + else if(HOST_GetURB_State(pdev , HID_Machine.hc_num_in) == URB_DONE) + { + if(start_toggle == 1) /* handle data once */ + { + start_toggle = 0; + HID_Machine.cb->Decode(HID_Machine.buff); + } + } + else if(HOST_GetURB_State(pdev, HID_Machine.hc_num_in) == URB_STALL) /* IN Endpoint Stalled */ + { + /* Issue Clear Feature on interrupt IN endpoint */ + if( (USBH_ClrFeature(pdev, pphost, HID_Machine.ep_addr, HID_Machine.hc_num_in)) == USBH_OK) + { + /* Change state to issue next IN token */ + HID_Machine.state = HID_GET_DATA; + } + } + break; + + default: + break; + } + return status; +} + + + +/** +*\*\name USBH_Get_HID_ReportDescriptor. +*\*\fun Issue report Descriptor command to the device. Once the response received, parse the report descriptor and update the status. +*\*\param pdev: selected device. +*\*\param phost: Selected device property +*\*\param Length : HID Report Descriptor Length +*\*\return status. +*\*\ +**/ +static USBH_Status USBH_Get_HID_ReportDescriptor (USB_CORE_MODULE *pdev, USBH_HOST *phost, uint16_t length) +{ + USBH_Status status; + + status = USBH_GetDescriptor(pdev, + phost, + USB_REQ_RECIPIENT_INTERFACE + | USB_REQ_TYPE_STANDARD, + USB_DESC_HID_REPORT, + pdev->host.Rx_Buffer, + length); + + /* HID report descriptor is available in pdev->host.Rx_Buffer. + In case of USB Boot Mode devices for In report handling , + HID report descriptor parsing is not required. + In case, for supporting Non-Boot Protocol devices and output reports, + user may parse the report descriptor*/ + + return status; +} + + +/** +*\*\name USBH_Get_HID_Descriptor. +*\*\fun Issue HID Descriptor command to the device. Once the response received, parse the report descriptor and update the status. +*\*\param pdev: selected device. +*\*\param phost: Selected device property +*\*\param Length : HID Descriptor Length +*\*\return status. +*\*\ +**/ +static USBH_Status USBH_Get_HID_Descriptor (USB_CORE_MODULE *pdev, USBH_HOST *phost, uint16_t length) +{ + USBH_Status status; + + status = USBH_GetDescriptor(pdev, + phost, + USB_REQ_RECIPIENT_INTERFACE + | USB_REQ_TYPE_STANDARD, + USB_DESC_HID, + pdev->host.Rx_Buffer, + length); + + return status; +} + +/** +*\*\name USBH_Set_Idle. +*\*\fun Set Idle State. +*\*\param pdev: selected device. +*\*\param phost: Selected device property +*\*\param duration: Duration for HID Idle request +*\*\param reportID: Targeted report ID for Set Idle request +*\*\return status. +*\*\ +**/ +static USBH_Status USBH_Set_Idle (USB_CORE_MODULE *pdev, USBH_HOST *phost, uint8_t duration, uint8_t reportId) +{ + phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE | USB_REQ_TYPE_CLASS; + + phost->Control.setup.b.bRequest = USB_HID_SET_IDLE; + phost->Control.setup.b.wValue.w = (duration << 8 ) | reportId; + + phost->Control.setup.b.wIndex.w = 0; + phost->Control.setup.b.wLength.w = 0; + + return USBH_CtrlReq(pdev, phost, 0 , 0 ); +} + +/** +*\*\name USBH_Set_Report. +*\*\fun Issues Set Report. +*\*\param pdev: selected device. +*\*\param phost: Selected device property +*\*\param reportType : Report type to be sent +*\*\param reportID : Targeted report ID for Set Report request +*\*\param reportLen : Length of data report to be send +*\*\param reportBuff : Report Buffer +*\*\return status. +*\*\ +**/ +USBH_Status USBH_Set_Report (USB_CORE_MODULE *pdev, USBH_HOST *phost, uint8_t reportType, uint8_t reportId, uint8_t reportLen, uint8_t* reportBuff) +{ + phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE |\ + USB_REQ_TYPE_CLASS; + + phost->Control.setup.b.bRequest = USB_HID_SET_REPORT; + phost->Control.setup.b.wValue.w = (reportType << 8 ) | reportId; + + phost->Control.setup.b.wIndex.w = 0; + phost->Control.setup.b.wLength.w = reportLen; + + return USBH_CtrlReq(pdev, phost, reportBuff , reportLen ); +} + +/** +*\*\name USBH_Set_Protocol. +*\*\fun Set protocol State. +*\*\param pdev: selected device. +*\*\param phost: Selected device property +*\*\param protocol : Set Protocol for HID : boot/report protocol +*\*\return status. +*\*\ +**/ +static USBH_Status USBH_Set_Protocol(USB_CORE_MODULE *pdev, USBH_HOST *phost, uint8_t protocol) +{ + phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE |\ + USB_REQ_TYPE_CLASS; + + phost->Control.setup.b.bRequest = USB_HID_SET_PROTOCOL; + + if(protocol != 0) + { + /* Boot Protocol */ + phost->Control.setup.b.wValue.w = 0; + } + else + { + /*Report Protocol*/ + phost->Control.setup.b.wValue.w = 1; + } + + phost->Control.setup.b.wIndex.w = 0; + phost->Control.setup.b.wLength.w = 0; + + return USBH_CtrlReq(pdev, phost, 0 , 0 ); +} + +/** +*\*\name USBH_ParseHIDDesc. +*\*\fun This function Parse the HID descriptor. +*\*\param desc: used to get the fields parsed from the data buffer. +*\*\param buf: Buffer where the source descriptor is available +*\*\return none. +*\*\ +**/ +static void USBH_ParseHIDDesc (USBH_HIDDesc_TypeDef *desc, uint8_t *buf) +{ + desc->bLength = *(uint8_t *) (buf + 0); + desc->bDescriptorType = *(uint8_t *) (buf + 1); + desc->bcdHID = LE16 (buf + 2); + desc->bCountryCode = *(uint8_t *) (buf + 4); + desc->bNumDescriptors = *(uint8_t *) (buf + 5); + desc->bReportDescriptorType = *(uint8_t *) (buf + 6); + desc->wItemLength = LE16 (buf + 7); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_keyboard.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_keyboard.c new file mode 100644 index 0000000000..07c47d657e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_keyboard.c @@ -0,0 +1,291 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_hid_keyboard.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbh_hid_keyboard.h" + +static void KEYBRD_Init (void); +static void KEYBRD_Decode(uint8_t *data); + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined (__CC_ARM) /*!< ARM Compiler */ + __align(4) + #elif defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #elif defined (__GNUC__) /*!< GNU Compiler */ + #pragma pack(4) + #endif /* __CC_ARM */ +#endif + +HID_cb_TypeDef HID_KEYBRD_cb= +{ + KEYBRD_Init, + KEYBRD_Decode +}; + +static const uint8_t HID_KEYBRD_Codes[] = { + 0, 0, 0, 0, 31, 50, 48, 33, + 19, 34, 35, 36, 24, 37, 38, 39, /* 0x00 - 0x0F */ + 52, 51, 25, 26, 17, 20, 32, 21, + 23, 49, 18, 47, 22, 46, 2, 3, /* 0x10 - 0x1F */ + 4, 5, 6, 7, 8, 9, 10, 11, + 43, 110, 15, 16, 61, 12, 13, 27, /* 0x20 - 0x2F */ + 28, 29, 42, 40, 41, 1, 53, 54, + 55, 30, 112, 113, 114, 115, 116, 117, /* 0x30 - 0x3F */ + 118, 119, 120, 121, 122, 123, 124, 125, + 126, 75, 80, 85, 76, 81, 86, 89, /* 0x40 - 0x4F */ + 79, 84, 83, 90, 95, 100, 105, 106, + 108, 93, 98, 103, 92, 97, 102, 91, /* 0x50 - 0x5F */ + 96, 101, 99, 104, 45, 129, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6F */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7F */ + 0, 0, 0, 0, 0, 107, 0, 56, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8F */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9F */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 - 0xAF */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 - 0xBF */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 - 0xCF */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 - 0xDF */ + 58, 44, 60, 127, 64, 57, 62, 128 /* 0xE0 - 0xE7 */ +}; + +#ifdef QWERTY_KEYBOARD +static const int8_t HID_KEYBRD_Key[] = { + '\0', '`', '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', '-', '=', '\0', '\r', + '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', + 'i', 'o', 'p', '[', ']', '\\', + '\0', 'a', 's', 'd', 'f', 'g', 'h', 'j', + 'k', 'l', ';', '\'', '\0', '\n', + '\0', '\0', 'z', 'x', 'c', 'v', 'b', 'n', + 'm', ',', '.', '/', '\0', '\0', + '\0', '\0', '\0', ' ', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '7', '4', '1', + '\0', '/', '8', '5', '2', + '0', '*', '9', '6', '3', + '.', '-', '+', '\0', '\n', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0' +}; + +static const int8_t HID_KEYBRD_ShiftKey[] = { + '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', + '_', '+', '\0', '\0', '\0', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', + 'I', 'O', 'P', '{', '}', '|', '\0', 'A', 'S', 'D', 'F', 'G', + 'H', 'J', 'K', 'L', ':', '"', '\0', '\n', '\0', '\0', 'Z', 'X', + 'C', 'V', 'B', 'N', 'M', '<', '>', '?', '\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', + '\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', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' +}; + +#else + +static const int8_t HID_KEYBRD_Key[] = { + '\0', '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '-', '=', '\0', '\r', '\t', 'a', 'z', 'e', 'r', 't', 'y', 'u', + 'i', 'o', 'p', '[', ']', '\\', '\0', 'q', 's', 'd', 'f', 'g', + 'h', 'j', 'k', 'l', 'm', '\0', '\0', '\n', '\0', '\0', 'w', 'x', + 'c', 'v', 'b', 'n', ',', ';', ':', '!', '\0', '\0', '\0', '\0', + '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', '4', '1','\0', '/', + '8', '5', '2', '0', '*', '9', '6', '3', '.', '-', '+', '\0', + '\n', '\0', '\0', '\0', '\0', '\0', '\0','\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' +}; + +static const int8_t HID_KEYBRD_ShiftKey[] = { + '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', + '+', '\0', '\0', '\0', 'A', 'Z', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', + 'P', '{', '}', '*', '\0', 'Q', 'S', 'D', 'F', 'G', 'H', 'J', 'K', + 'L', 'M', '%', '\0', '\n', '\0', '\0', 'W', 'X', 'C', 'V', 'B', 'N', + '?', '.', '/', '\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', '\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', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' +}; +#endif + +/** +*\*\name KEYBRD_Init. +*\*\fun Initialize the keyboard function. +*\*\param none. +*\*\return none. +*\*\ +**/ +static void KEYBRD_Init (void) +{ + /* Call User Init*/ + USER_KEYBRD_Init(); +} + +/** +*\*\name KEYBRD_Decode. +*\*\fun The function is to decode the pressed keys. +*\*\param pbuf: Pointer to the HID IN report data buffer. +*\*\return none. +*\*\ +**/ +static void KEYBRD_Decode(uint8_t *pbuf) +{ + static uint8_t shift; + static uint8_t keys[KBR_MAX_NBR_PRESSED]; + static uint8_t keys_new[KBR_MAX_NBR_PRESSED]; + static uint8_t keys_last[KBR_MAX_NBR_PRESSED]; + static uint8_t key_newest; + static uint8_t nbr_keys; + static uint8_t nbr_keys_new; + static uint8_t nbr_keys_last; + uint8_t ix; + uint8_t jx; + uint8_t error; + uint8_t output; + + nbr_keys = 0; + nbr_keys_new = 0; + nbr_keys_last = 0; + key_newest = 0x00; + + + /* Check if Shift key is pressed */ + if ((pbuf[0] == KBD_LEFT_SHIFT) || (pbuf[0] == KBD_RIGHT_SHIFT)) + { + shift = TRUE; + } + else + { + shift = FALSE; + } + + error = FALSE; + + /* Check for the value of pressed key */ + for (ix = 2; ix < 2 + KBR_MAX_NBR_PRESSED; ix++) + { + if ((pbuf[ix] == 0x01) || (pbuf[ix] == 0x02) || (pbuf[ix] == 0x03)) + { + error = TRUE; + } + } + + if (error == TRUE) + { + return; + } + + nbr_keys = 0; + nbr_keys_new = 0; + for (ix = 2; ix < 2 + KBR_MAX_NBR_PRESSED; ix++) + { + if (pbuf[ix] != 0) + { + keys[nbr_keys] = pbuf[ix]; + nbr_keys++; + for (jx = 0; jx < nbr_keys_last; jx++) + { + if (pbuf[ix] == keys_last[jx]) + { + break; + } + } + + if (jx == nbr_keys_last) + { + keys_new[nbr_keys_new] = pbuf[ix]; + nbr_keys_new++; + } + } + } + + if (nbr_keys_new == 1) + { + key_newest = keys_new[0]; + + if (shift == TRUE) + { + output = HID_KEYBRD_ShiftKey[HID_KEYBRD_Codes[key_newest]]; + } + else + { + output = HID_KEYBRD_Key[HID_KEYBRD_Codes[key_newest]]; + } + /* call user process handle */ + USER_KEYBRD_ProcessData(output); + } + else + { + key_newest = 0x00; + } + + nbr_keys_last = nbr_keys; + for (ix = 0; ix < KBR_MAX_NBR_PRESSED; ix++) + { + keys_last[ix] = keys[ix]; + } +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_mouse.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_mouse.c new file mode 100644 index 0000000000..0ba7f61258 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/HID/src/usbh_hid_mouse.c @@ -0,0 +1,106 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_hid_mouse.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbh_hid_mouse.h" + +static void MOUSE_Init (void); +static void MOUSE_Decode(uint8_t *data); + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined (__CC_ARM) /*!< ARM Compiler */ + __align(4) + #elif defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #elif defined (__GNUC__) /*!< GNU Compiler */ + #pragma pack(4) + #endif /* __CC_ARM */ +#endif + + +HID_MOUSE_Data_TypeDef HID_MOUSE_Data; +HID_cb_TypeDef HID_MOUSE_cb = +{ + MOUSE_Init, + MOUSE_Decode, +}; + +/** +*\*\name MOUSE_Init. +*\*\fun Init Mouse State. +*\*\param none. +*\*\return none. +*\*\ +**/ +static void MOUSE_Init(void) +{ + /* Call User Init*/ + USER_MOUSE_Init(); +} + +/** +*\*\name MOUSE_Decode. +*\*\fun Decode Mouse data. +*\*\param data: Pointer to Mouse HID data buffer. +*\*\return none. +*\*\ +**/ +static void MOUSE_Decode(uint8_t *data) +{ + HID_MOUSE_Data.button = data[0]; + + HID_MOUSE_Data.x = data[1]; + HID_MOUSE_Data.y = data[2]; + + USER_MOUSE_ProcessData(&HID_MOUSE_Data); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_bot.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_bot.h new file mode 100644 index 0000000000..c0a9d7bc71 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_bot.h @@ -0,0 +1,236 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_msc_bot.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +/* Define to prevent recursive ----------------------------------------------*/ +#ifndef __USBH_MSC_BOT_H__ +#define __USBH_MSC_BOT_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usbh_stdreq.h" + + +/** @addtogroup USBH_LIB + * @{ + */ + +/** @addtogroup USBH_CLASS + * @{ + */ + +/** @addtogroup USBH_MSC_CLASS + * @{ + */ + +/** @defgroup USBH_MSC_BOT + * @brief This file is the Header file for usbh_msc_core.c + * @{ + */ + + +/** @defgroup USBH_MSC_BOT_Exported_Types + * @{ + */ + +typedef union _USBH_CBW_Block +{ + struct __CBW + { + uint32_t CBWSignature; + uint32_t CBWTag; + uint32_t CBWTransferLength; + uint8_t CBWFlags; + uint8_t CBWLUN; + uint8_t CBWLength; + uint8_t CBWCB[16]; +}field; + uint8_t CBWArray[31]; +}HostCBWPkt_TypeDef; + +typedef enum +{ + USBH_MSC_BOT_INIT_STATE = 0, + USBH_MSC_BOT_RESET, + USBH_MSC_GET_MAX_LUN, + USBH_MSC_TEST_UNIT_READY, + USBH_MSC_READ_CAPACITY10, + USBH_MSC_MODE_SENSE6, + USBH_MSC_REQUEST_SENSE, + USBH_MSC_BOT_USB_TRANSFERS, + USBH_MSC_DEFAULT_APPLI_STATE, + USBH_MSC_CTRL_ERROR_STATE, + USBH_MSC_UNRECOVERED_STATE +} +MSCState; + + +typedef struct _BOTXfer +{ +uint8_t MSCState; +uint8_t MSCStateBkp; +uint8_t MSCStateCurrent; +uint8_t CmdStateMachine; +uint8_t BOTState; +uint8_t BOTStateBkp; +uint8_t* pRxTxBuff; +uint16_t DataLength; +uint8_t BOTXferErrorCount; +uint8_t BOTXferStatus; +} USBH_BOTXfer_TypeDef; + + +typedef union _USBH_CSW_Block +{ + struct __CSW + { + uint32_t CSWSignature; + uint32_t CSWTag; + uint32_t CSWDataResidue; + uint8_t CSWStatus; + }field; + uint8_t CSWArray[13]; +}HostCSWPkt_TypeDef; + +/** + * @} + */ + + + +/** @defgroup USBH_MSC_BOT_Exported_Defines + * @{ + */ +#define USBH_MSC_SEND_CBW 1 +#define USBH_MSC_SENT_CBW 2 +#define USBH_MSC_BOT_DATAIN_STATE 3 +#define USBH_MSC_BOT_DATAOUT_STATE 4 +#define USBH_MSC_RECEIVE_CSW_STATE 5 +#define USBH_MSC_DECODE_CSW 6 +#define USBH_MSC_BOT_ERROR_IN 7 +#define USBH_MSC_BOT_ERROR_OUT 8 + + +#define USBH_MSC_BOT_CBW_SIGNATURE 0x43425355 +#define USBH_MSC_BOT_CBW_TAG 0x20304050 +#define USBH_MSC_BOT_CSW_SIGNATURE 0x53425355 +#define USBH_MSC_CSW_DATA_LENGTH 0x000D +#define USBH_MSC_BOT_CBW_PACKET_LENGTH 31 +#define USBH_MSC_CSW_LENGTH 13 +#define USBH_MSC_CSW_MAX_LENGTH 63 + +/* CSW Status Definitions */ +#define USBH_MSC_CSW_CMD_PASSED 0x00 +#define USBH_MSC_CSW_CMD_FAILED 0x01 +#define USBH_MSC_CSW_PHASE_ERROR 0x02 + +#define USBH_MSC_SEND_CSW_DISABLE 0 +#define USBH_MSC_SEND_CSW_ENABLE 1 + +#define USBH_MSC_DIR_IN 0 +#define USBH_MSC_DIR_OUT 1 +#define USBH_MSC_BOTH_DIR 2 + +//#define USBH_MSC_PAGE_LENGTH 0x40 +#define USBH_MSC_PAGE_LENGTH 512 + + +#define CBW_CB_LENGTH 16 +#define CBW_LENGTH 10 +#define CBW_LENGTH_TEST_UNIT_READY 6 + +#define USB_REQ_BOT_RESET 0xFF +#define USB_REQ_GET_MAX_LUN 0xFE + +#define MAX_BULK_STALL_COUNT_LIMIT 0x04 /* If STALL is seen on Bulk + Endpoint continuously, this means + that device and Host has phase error + Hence a Reset is needed */ + +/** + * @} + */ + +/** @defgroup USBH_MSC_BOT_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBH_MSC_BOT_Exported_Variables + * @{ + */ +extern USBH_BOTXfer_TypeDef USBH_MSC_BOTXferParam; +extern HostCBWPkt_TypeDef USBH_MSC_CBWData; +extern HostCSWPkt_TypeDef USBH_MSC_CSWData; +/** + * @} + */ + +/** @defgroup USBH_MSC_BOT_Exported_FunctionsPrototype + * @{ + */ +void USBH_MSC_HandleBOTXfer(USB_CORE_MODULE *pdev, + USBH_HOST *phost); +uint8_t USBH_MSC_DecodeCSW(USB_CORE_MODULE *pdev, + USBH_HOST *phost); +void USBH_MSC_Init(USB_CORE_MODULE *pdev); +USBH_Status USBH_MSC_BOT_Abort(USB_CORE_MODULE *pdev, + USBH_HOST *phost, + uint8_t direction); +/** + * @} + */ + +#endif //__USBH_MSC_BOT_H__ + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_core.h new file mode 100644 index 0000000000..7b72fdfdf3 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_core.h @@ -0,0 +1,155 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_msc_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +/* Define to prevent recursive ----------------------------------------------*/ +#ifndef __USBH_MSC_CORE_H +#define __USBH_MSC_CORE_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbh_core.h" +#include "usbh_stdreq.h" +#include "usbhs_bsp.h" +#include "usbh_ioreq.h" +#include "usbh_hcs.h" +#include "usbh_msc_core.h" +#include "usbh_msc_scsi.h" +#include "usbh_msc_bot.h" + +/** @addtogroup USBH_LIB + * @{ + */ + +/** @addtogroup USBH_CLASS + * @{ + */ + +/** @addtogroup USBH_MSC_CLASS + * @{ + */ + +/** @defgroup USBH_MSC_CORE + * @brief This file is the Header file for usbh_msc_core.c + * @{ + */ + + +/** @defgroup USBH_MSC_CORE_Exported_Types + * @{ + */ + + +/* Structure for MSC process */ +typedef struct _MSC_Process +{ + uint8_t hc_num_in; + uint8_t hc_num_out; + uint8_t MSBulkOutEp; + uint8_t MSBulkInEp; + uint16_t MSBulkInEpSize; + uint16_t MSBulkOutEpSize; + uint8_t buff[USBH_MSC_MPS_SIZE]; + uint8_t maxLun; +} +MSC_Machine_TypeDef; + + +/** + * @} + */ + + + +/** @defgroup USBH_MSC_CORE_Exported_Defines + * @{ + */ + +#define USB_REQ_BOT_RESET 0xFF +#define USB_REQ_GET_MAX_LUN 0xFE + + +/** + * @} + */ + +/** @defgroup USBH_MSC_CORE_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBH_MSC_CORE_Exported_Variables + * @{ + */ +extern USBH_Class_cb_TypeDef USBH_MSC_cb; +extern MSC_Machine_TypeDef MSC_Machine; +extern uint8_t MSCErrorCount; + +/** + * @} + */ + +/** @defgroup USBH_MSC_CORE_Exported_FunctionsPrototype + * @{ + */ + + + +/** + * @} + */ + +#endif /* __USBH_MSC_CORE_H */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_scsi.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_scsi.h new file mode 100644 index 0000000000..2382890c2f --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/inc/usbh_msc_scsi.h @@ -0,0 +1,174 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_msc_scsi.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +/* Define to prevent recursive ----------------------------------------------*/ +#ifndef __USBH_MSC_SCSI_H__ +#define __USBH_MSC_SCSI_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usbh_stdreq.h" + + +/** @addtogroup USBH_LIB + * @{ + */ + +/** @addtogroup USBH_CLASS + * @{ + */ + +/** @addtogroup USBH_MSC_CLASS + * @{ + */ + +/** @defgroup USBH_MSC_SCSI + * @brief This file is the Header file for usbh_msc_scsi.c + * @{ + */ + + +/** @defgroup USBH_MSC_SCSI_Exported_Types + * @{ + */ +typedef enum { + USBH_MSC_OK = 0, + USBH_MSC_FAIL = 1, + USBH_MSC_PHASE_ERROR = 2, + USBH_MSC_BUSY = 3 +}USBH_MSC_Status_TypeDef; + +typedef enum { + CMD_UNINITIALIZED_STATE =0, + CMD_SEND_STATE, + CMD_WAIT_STATUS +} CMD_STATES_TypeDef; + + + +typedef struct __MassStorageParameter +{ + uint32_t MSCapacity; + uint32_t MSSenseKey; + uint16_t MSPageLength; + uint8_t MSBulkOutEp; + uint8_t MSBulkInEp; + uint8_t MSWriteProtect; +} MassStorageParameter_TypeDef; +/** + * @} + */ + + + +/** @defgroup USBH_MSC_SCSI_Exported_Defines + * @{ + */ + + + +#define OPCODE_TEST_UNIT_READY 0X00 +#define OPCODE_READ_CAPACITY10 0x25 +#define OPCODE_MODE_SENSE6 0x1A +#define OPCODE_READ10 0x28 +#define OPCODE_WRITE10 0x2A +#define OPCODE_REQUEST_SENSE 0x03 + +#define DESC_REQUEST_SENSE 0X00 +#define ALLOCATION_LENGTH_REQUEST_SENSE 63 +#define XFER_LEN_READ_CAPACITY10 8 +#define XFER_LEN_MODE_SENSE6 63 + +#define MASK_MODE_SENSE_WRITE_PROTECT 0x80 +#define MODE_SENSE_PAGE_CONTROL_FIELD 0x00 +#define MODE_SENSE_PAGE_CODE 0x3F +#define DISK_WRITE_PROTECTED 0x01 +/** + * @} + */ + +/** @defgroup USBH_MSC_SCSI_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup _Exported_Variables + * @{ + */ +extern MassStorageParameter_TypeDef USBH_MSC_Param; +/** + * @} + */ + +/** @defgroup USBH_MSC_SCSI_Exported_FunctionsPrototype + * @{ + */ +uint8_t USBH_MSC_TestUnitReady(USB_CORE_MODULE *pdev); +uint8_t USBH_MSC_ReadCapacity10(USB_CORE_MODULE *pdev); +uint8_t USBH_MSC_ModeSense6(USB_CORE_MODULE *pdev); +uint8_t USBH_MSC_RequestSense(USB_CORE_MODULE *pdev); +uint8_t USBH_MSC_Write10(USB_CORE_MODULE *pdev, uint8_t *,uint32_t , + uint32_t ); +uint8_t USBH_MSC_Read10(USB_CORE_MODULE *pdev, + uint8_t *, + uint32_t , + uint32_t ); +void USBH_MSC_StateMachine(USB_CORE_MODULE *pdev); + +/** + * @} + */ + +#endif //__USBH_MSC_SCSI_H__ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_bot.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_bot.c new file mode 100644 index 0000000000..d2c8932baa --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_bot.c @@ -0,0 +1,618 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_msc_bot.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbh_msc_core.h" +#include "usbh_msc_scsi.h" +#include "usbh_msc_bot.h" +#include "usbh_ioreq.h" +#include "usbh_def.h" +#include "usbhs_hcd_int.h" + + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN HostCBWPkt_TypeDef USBH_MSC_CBWData __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN HostCSWPkt_TypeDef USBH_MSC_CSWData __ALIGN_END ; + + +static uint32_t BOTStallErrorCount; /* Keeps count of STALL Error Cases*/ +static uint8_t xfer_error_count; + + +USBH_BOTXfer_TypeDef USBH_MSC_BOTXferParam; + +/** +*\*\name USBH_MSC_Init. +*\*\fun Initializes the mass storage parameters. +*\*\param pdev: selected device. +*\*\return none. +*\*\ +**/ +void USBH_MSC_Init(USB_CORE_MODULE *pdev) +{ + if(HOST_IsDeviceConnected(pdev)) + { + USBH_MSC_CBWData.field.CBWSignature = USBH_MSC_BOT_CBW_SIGNATURE; + USBH_MSC_CBWData.field.CBWTag = USBH_MSC_BOT_CBW_TAG; + USBH_MSC_CBWData.field.CBWLUN = 0; + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + } + + BOTStallErrorCount = 0; + MSCErrorCount = 0; +} + +/** +*\*\name USBH_MSC_HandleBOTXfer. +*\*\fun This function manages the different states of BOT transfer and updates the status to upper layer. +*\*\param pdev: selected device. +*\*\param phost: host state set. +*\*\return none. +*\*\ +**/ +void USBH_MSC_HandleBOTXfer (USB_CORE_MODULE *pdev ,USBH_HOST *phost) +{ + uint8_t xferDirection, index; + static uint32_t remainingDataLength; + static uint8_t *datapointer , *datapointer_prev; + static uint8_t error_direction; + USBH_Status status; + + URB_STATE URB_Status = URB_IDLE; + + if(HOST_IsDeviceConnected(pdev)) + { + + switch (USBH_MSC_BOTXferParam.BOTState) + { + case USBH_MSC_SEND_CBW: + /* send CBW */ + USBH_BulkSendData (pdev, + &USBH_MSC_CBWData.CBWArray[0], + USBH_MSC_BOT_CBW_PACKET_LENGTH , + MSC_Machine.hc_num_out); + + USBH_MSC_BOTXferParam.BOTStateBkp = USBH_MSC_SEND_CBW; + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_SENT_CBW; + xfer_error_count= 0; + break; + + case USBH_MSC_SENT_CBW: + URB_Status = HOST_GetURB_State(pdev , MSC_Machine.hc_num_out); + + if(URB_Status == URB_DONE) + { + BOTStallErrorCount = 0; + USBH_MSC_BOTXferParam.BOTStateBkp = USBH_MSC_SENT_CBW; + + /* If the CBW Pkt is sent successful, then change the state */ + xferDirection = (USBH_MSC_CBWData.field.CBWFlags & USB_REQ_DIR_MASK); + + if ( USBH_MSC_CBWData.field.CBWTransferLength != 0 ) + { + remainingDataLength = USBH_MSC_CBWData.field.CBWTransferLength ; + datapointer = USBH_MSC_BOTXferParam.pRxTxBuff; + datapointer_prev = datapointer; + + /* If there is Data Transfer Stage */ + if (xferDirection == USB_D2H) + { + /* Data Direction is IN */ + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOT_DATAIN_STATE; + } + else + { + /* Data Direction is OUT */ + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOT_DATAOUT_STATE; + } + } + + else + {/* If there is NO Data Transfer Stage */ + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_RECEIVE_CSW_STATE; + } + + } + else if(URB_Status == URB_NOTREADY) + { + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOTXferParam.BOTStateBkp; + } + else if(URB_Status == URB_STALL) + { + error_direction = USBH_MSC_DIR_OUT; + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOT_ERROR_OUT; + } + else if(URB_Status == URB_ERROR) + { + xfer_error_count++; + + if (xfer_error_count < 3) + { + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOTXferParam.BOTStateBkp; + } + else + { + /* unrecoverd error */ + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_PHASE_ERROR; + } + } + break; + + case USBH_MSC_BOT_DATAIN_STATE: + URB_Status = HOST_GetURB_State(pdev , MSC_Machine.hc_num_in); + /* BOT DATA IN stage */ + if((URB_Status == URB_DONE) ||(USBH_MSC_BOTXferParam.BOTStateBkp != USBH_MSC_BOT_DATAIN_STATE)) + { + BOTStallErrorCount = 0; + USBH_MSC_BOTXferParam.BOTStateBkp = USBH_MSC_BOT_DATAIN_STATE; + + if(remainingDataLength > MSC_Machine.MSBulkInEpSize) + { + USBH_BulkReceiveData (pdev, + datapointer, + MSC_Machine.MSBulkInEpSize , + MSC_Machine.hc_num_in); + + remainingDataLength -= MSC_Machine.MSBulkInEpSize; + datapointer = datapointer + MSC_Machine.MSBulkInEpSize; + } + else if ( remainingDataLength == 0) + { + /* If value was 0, and successful transfer, then change the state */ + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_RECEIVE_CSW_STATE; + } + else + { + USBH_BulkReceiveData (pdev, + datapointer, + remainingDataLength , + MSC_Machine.hc_num_in); + + remainingDataLength = 0; /* Reset this value and keep in same state */ + } + } + else if(URB_Status == URB_STALL) + { + /* This is Data Stage STALL Condition */ + error_direction = USBH_MSC_DIR_IN; + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOT_ERROR_IN; + + /* Refer to USB Mass-Storage Class : BOT (www.usb.org) + 6.7.2 Host expects to receive data from the device + 3. On a STALL condition receiving data, then: + The host shall accept the data received. + The host shall clear the Bulk-In pipe. + 4. The host shall attempt to receive a CSW. + + USBH_MSC_BOTXferParam.BOTStateBkp is used to switch to the Original + state after the ClearFeature Command is issued. + */ + USBH_MSC_BOTXferParam.BOTStateBkp = USBH_MSC_RECEIVE_CSW_STATE; + + } + + else if(URB_Status == URB_ERROR) + { + xfer_error_count++; + + if (xfer_error_count < 3) + { + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOTXferParam.BOTStateBkp; + } + else + { + /* unrecoverd error */ + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_PHASE_ERROR; + } + } + break; + + case USBH_MSC_BOT_DATAOUT_STATE: + /* BOT DATA OUT stage */ + URB_Status = HOST_GetURB_State(pdev , MSC_Machine.hc_num_out); + if(URB_Status == URB_DONE) + { + BOTStallErrorCount = 0; + USBH_MSC_BOTXferParam.BOTStateBkp = USBH_MSC_BOT_DATAOUT_STATE; + if(remainingDataLength > MSC_Machine.MSBulkOutEpSize) + { + USBH_BulkSendData (pdev, + datapointer, + MSC_Machine.MSBulkOutEpSize , + MSC_Machine.hc_num_out); + datapointer_prev = datapointer; + datapointer = datapointer + MSC_Machine.MSBulkOutEpSize; + + remainingDataLength = remainingDataLength - MSC_Machine.MSBulkOutEpSize; + xfer_error_count=0; + } + else if ( remainingDataLength == 0) + { + /* If value was 0, and successful transfer, then change the state */ + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_RECEIVE_CSW_STATE; + } + else + { + USBH_BulkSendData (pdev, + datapointer, + remainingDataLength , + MSC_Machine.hc_num_out); + + remainingDataLength = 0; /* Reset this value and keep in same state */ + } + } + + else if(URB_Status == URB_NOTREADY) + { + if(datapointer != datapointer_prev) + { + USBH_BulkSendData (pdev, + (datapointer - MSC_Machine.MSBulkOutEpSize), + MSC_Machine.MSBulkOutEpSize , + MSC_Machine.hc_num_out); + } + else + { + USBH_BulkSendData (pdev, + datapointer, + MSC_Machine.MSBulkOutEpSize , + MSC_Machine.hc_num_out); + } + } + + else if(URB_Status == URB_STALL) + { + error_direction = USBH_MSC_DIR_OUT; + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOT_ERROR_OUT; + + /* Refer to USB Mass-Storage Class : BOT (www.usb.org) + 6.7.3 Ho - Host expects to send data to the device + 3. On a STALL condition sending data, then: + " The host shall clear the Bulk-Out pipe. + 4. The host shall attempt to receive a CSW. + + The Above statement will do the clear the Bulk-Out pipe. + The Below statement will help in Getting the CSW. + + USBH_MSC_BOTXferParam.BOTStateBkp is used to switch to the Original + state after the ClearFeature Command is issued. + */ + + USBH_MSC_BOTXferParam.BOTStateBkp = USBH_MSC_RECEIVE_CSW_STATE; + + } + else if(URB_Status == URB_ERROR) + { + xfer_error_count++; + + if (xfer_error_count < 3) + { + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOTXferParam.BOTStateBkp; + } + else + { + /* unrecoverd error */ + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_PHASE_ERROR; + } + } + break; + + case USBH_MSC_RECEIVE_CSW_STATE: + /* BOT CSW stage */ + /* NOTE: We cannot reset the BOTStallErrorCount here as it may come from + the clearFeature from previous command */ + + USBH_MSC_BOTXferParam.BOTStateBkp = USBH_MSC_RECEIVE_CSW_STATE; + + USBH_MSC_BOTXferParam.pRxTxBuff = USBH_MSC_CSWData.CSWArray; + USBH_MSC_BOTXferParam.DataLength = USBH_MSC_CSW_MAX_LENGTH; + + for(index = USBH_MSC_CSW_LENGTH-1; index != 0; index--) + { + USBH_MSC_CSWData.CSWArray[index] = 0; + } + + USBH_MSC_CSWData.CSWArray[0] = 0; + + USBH_BulkReceiveData (pdev, + USBH_MSC_BOTXferParam.pRxTxBuff, + USBH_MSC_CSW_MAX_LENGTH , + MSC_Machine.hc_num_in); + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_DECODE_CSW; + xfer_error_count=0; + + break; + + case USBH_MSC_DECODE_CSW: + URB_Status = HOST_GetURB_State(pdev , MSC_Machine.hc_num_in); + /* Decode CSW */ + if(URB_Status == URB_DONE) + { + BOTStallErrorCount = 0; + USBH_MSC_BOTXferParam.BOTStateBkp = USBH_MSC_RECEIVE_CSW_STATE; + + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_BOTXferParam.MSCStateCurrent ; + + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_DecodeCSW(pdev , phost); + } + else if(URB_Status == URB_STALL) + { + error_direction = USBH_MSC_DIR_IN; + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOT_ERROR_IN; + } + + else if(URB_Status == URB_ERROR) + { + xfer_error_count++; + + if (xfer_error_count < 3) + { + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOTXferParam.BOTStateBkp; + } + else + { + /* unrecovered error */ + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_PHASE_ERROR; + } + } + break; + + case USBH_MSC_BOT_ERROR_IN: + status = USBH_MSC_BOT_Abort(pdev, phost, USBH_MSC_DIR_IN); + if (status == USBH_OK) + { + /* Check if the error was due in Both the directions */ + if (error_direction == USBH_MSC_BOTH_DIR) + {/* If Both directions are Needed, Switch to OUT Direction */ + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOT_ERROR_OUT; + } + else + { + /* Switch Back to the Original State, In many cases this will be + USBH_MSC_RECEIVE_CSW_STATE state */ + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOTXferParam.BOTStateBkp; + } + } + else if (status == USBH_UNRECOVERED_ERROR) + { + /* This means that there is a STALL Error limit, Do Reset Recovery */ + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_PHASE_ERROR; + } + break; + + case USBH_MSC_BOT_ERROR_OUT: + status = USBH_MSC_BOT_Abort(pdev,phost, USBH_MSC_DIR_OUT); + if ( status == USBH_OK) + { /* Switch Back to the Original State */ + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_BOTXferParam.BOTStateBkp; + } + else if (status == USBH_UNRECOVERED_ERROR) + { + /* This means that there is a STALL Error limit, Do Reset Recovery */ + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_PHASE_ERROR; + } + break; + + default: + break; + } + } +} + + +/** +*\*\name USBH_MSC_BOT_Abort. +*\*\fun This function manages the different Error handling for STALL. +*\*\param pdev: selected device. +*\*\param phost: host state set. +*\*\param direction : USBH_MSC_DIR_IN / USBH_MSC_DIR_OUT. +*\*\return status. +*\*\ +**/ +USBH_Status USBH_MSC_BOT_Abort(USB_CORE_MODULE *pdev, USBH_HOST *phost, uint8_t direction) +{ + USBH_Status status; + + status = USBH_BUSY; + + switch (direction) + { + case USBH_MSC_DIR_IN : + /* send ClrFeture on Bulk IN endpoint */ + status = USBH_ClrFeature(pdev, + phost, + MSC_Machine.MSBulkInEp, + MSC_Machine.hc_num_in); + + break; + + case USBH_MSC_DIR_OUT : + /*send ClrFeature on Bulk OUT endpoint */ + status = USBH_ClrFeature(pdev, + phost, + MSC_Machine.MSBulkOutEp, + MSC_Machine.hc_num_out); + break; + + default: + break; + } + + BOTStallErrorCount++; /* Check Continuous Number of times, STALL has Occurred */ + if (BOTStallErrorCount > MAX_BULK_STALL_COUNT_LIMIT ) + { + status = USBH_UNRECOVERED_ERROR; + } + + return status; +} + + +/** +*\*\name USBH_MSC_DecodeCSW. +*\*\fun This function decodes the CSW received by the device and updates the same to upper layer. +*\*\param pdev: selected device. +*\*\param phost: host state set. +*\*\return On success USBH_MSC_OK, on failure USBH_MSC_FAIL. +*\*\ +**/ +uint8_t USBH_MSC_DecodeCSW(USB_CORE_MODULE *pdev , USBH_HOST *phost) +{ + uint8_t status; + uint32_t dataXferCount = 0; + status = USBH_MSC_FAIL; + + if(HOST_IsDeviceConnected(pdev)) + { + /*Checking if the transfer length is different than 13*/ + dataXferCount = HOST_GetXferCnt(pdev, MSC_Machine.hc_num_in); + + if(dataXferCount != USBH_MSC_CSW_LENGTH) + { + /*(4) Hi > Dn (Host expects to receive data from the device, + Device intends to transfer no data) + (5) Hi > Di (Host expects to receive data from the device, + Device intends to send data to the host) + (9) Ho > Dn (Host expects to send data to the device, + Device intends to transfer no data) + (11) Ho > Do (Host expects to send data to the device, + Device intends to receive data from the host)*/ + + status = USBH_MSC_PHASE_ERROR; + } + else + { /* CSW length is Correct */ + + /* Check validity of the CSW Signature and CSWStatus */ + if(USBH_MSC_CSWData.field.CSWSignature == USBH_MSC_BOT_CSW_SIGNATURE) + {/* Check Condition 1. dCSWSignature is equal to 53425355h */ + + if(USBH_MSC_CSWData.field.CSWTag == USBH_MSC_CBWData.field.CBWTag) + { + /* Check Condition 3. dCSWTag matches the dCBWTag from the + corresponding CBW */ + + if(USBH_MSC_CSWData.field.CSWStatus == USBH_MSC_OK) + { + /* Refer to USB Mass-Storage Class : BOT (www.usb.org) + + Hn Host expects no data transfers + Hi Host expects to receive data from the device + Ho Host expects to send data to the device + + Dn Device intends to transfer no data + Di Device intends to send data to the host + Do Device intends to receive data from the host + + Section 6.7 + (1) Hn = Dn (Host expects no data transfers, + Device intends to transfer no data) + (6) Hi = Di (Host expects to receive data from the device, + Device intends to send data to the host) + (12) Ho = Do (Host expects to send data to the device, + Device intends to receive data from the host) + + */ + + status = USBH_MSC_OK; + } + else if(USBH_MSC_CSWData.field.CSWStatus == USBH_MSC_FAIL) + { + status = USBH_MSC_FAIL; + } + + else if(USBH_MSC_CSWData.field.CSWStatus == USBH_MSC_PHASE_ERROR) + { + /* Refer to USB Mass-Storage Class : BOT (www.usb.org) + Section 6.7 + (2) Hn < Di ( Host expects no data transfers, + Device intends to send data to the host) + (3) Hn < Do ( Host expects no data transfers, + Device intends to receive data from the host) + (7) Hi < Di ( Host expects to receive data from the device, + Device intends to send data to the host) + (8) Hi <> Do ( Host expects to receive data from the device, + Device intends to receive data from the host) + (10) Ho <> Di (Host expects to send data to the device, + Di Device intends to send data to the host) + (13) Ho < Do (Host expects to send data to the device, + Device intends to receive data from the host) + */ + + status = USBH_MSC_PHASE_ERROR; + } + } /* CSW Tag Matching is Checked */ + } /* CSW Signature Correct Checking */ + else + { + /* If the CSW Signature is not valid, We Sall return the Phase Error to + Upper Layers for Reset Recovery */ + + status = USBH_MSC_PHASE_ERROR; + } + } /* CSW Length Check*/ + } + + USBH_MSC_BOTXferParam.BOTXferStatus = status; + return status; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_core.c new file mode 100644 index 0000000000..eb6bdc4fb1 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_core.c @@ -0,0 +1,458 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_msc_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +/* Includes ------------------------------------------------------------------*/ + +#include "usbh_msc_core.h" +#include "usbh_msc_scsi.h" +#include "usbh_msc_bot.h" +#include "usbh_core.h" +#include "log.h" + + +#define USBH_MSC_ERROR_RETRY_LIMIT 10 + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN MSC_Machine_TypeDef MSC_Machine __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN USB_Setup_TypeDef MSC_Setup __ALIGN_END ; +uint8_t MSCErrorCount = 0; + +static USBH_Status USBH_MSC_InterfaceInit(USB_CORE_MODULE *pdev , void *phost); + +static void USBH_MSC_InterfaceDeInit(USB_CORE_MODULE *pdev , void *phost); + +static USBH_Status USBH_MSC_Handle(USB_CORE_MODULE *pdev , void *phost); + +static USBH_Status USBH_MSC_ClassRequest(USB_CORE_MODULE *pdev , void *phost); + +static USBH_Status USBH_MSC_GETMaxLUN(USB_CORE_MODULE *pdev, USBH_HOST *phost); + +USBH_Class_cb_TypeDef USBH_MSC_cb = +{ + USBH_MSC_InterfaceInit, + USBH_MSC_InterfaceDeInit, + USBH_MSC_ClassRequest, + USBH_MSC_Handle, +}; + +void USBH_MSC_ErrorHandle(uint8_t status); + +/** +*\*\name USBH_MSC_InterfaceInit. +*\*\fun Interface initialization for MSC class. +*\*\param pdev: selected device. +*\*\param phost: Selected device property. +*\*\return Status of class request handled. +*\*\ +**/ +static USBH_Status USBH_MSC_InterfaceInit (USB_CORE_MODULE *pdev, void *phost) +{ + USBH_HOST *pphost = phost; + + if((pphost->device_prop.Itf_Desc[0].bInterfaceClass == MSC_CLASS) && \ + (pphost->device_prop.Itf_Desc[0].bInterfaceProtocol == MSC_PROTOCOL)) + { + if(pphost->device_prop.Ep_Desc[0][0].bEndpointAddress & 0x80) + { + MSC_Machine.MSBulkInEp = (pphost->device_prop.Ep_Desc[0][0].bEndpointAddress); + MSC_Machine.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][0].wMaxPacketSize; + } + else + { + MSC_Machine.MSBulkOutEp = (pphost->device_prop.Ep_Desc[0][0].bEndpointAddress); + MSC_Machine.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0] [0].wMaxPacketSize; + } + + if(pphost->device_prop.Ep_Desc[0][1].bEndpointAddress & 0x80) + { + MSC_Machine.MSBulkInEp = (pphost->device_prop.Ep_Desc[0][1].bEndpointAddress); + MSC_Machine.MSBulkInEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize; + } + else + { + MSC_Machine.MSBulkOutEp = (pphost->device_prop.Ep_Desc[0][1].bEndpointAddress); + MSC_Machine.MSBulkOutEpSize = pphost->device_prop.Ep_Desc[0][1].wMaxPacketSize; + } + + MSC_Machine.hc_num_out = USBH_Alloc_Channel(pdev, MSC_Machine.MSBulkOutEp); + MSC_Machine.hc_num_in = USBH_Alloc_Channel(pdev, MSC_Machine.MSBulkInEp); + + /* Open the new channels */ + USBH_Open_Channel (pdev, + MSC_Machine.hc_num_out, + pphost->device_prop.address, + pphost->device_prop.speed, + EP_TYPE_BULK, + MSC_Machine.MSBulkOutEpSize); + + USBH_Open_Channel (pdev, + MSC_Machine.hc_num_in, + pphost->device_prop.address, + pphost->device_prop.speed, + EP_TYPE_BULK, + MSC_Machine.MSBulkInEpSize); + } + + else + { + if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_HUB) + { + printf("Hub is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_CDCC) + { + printf("Communications and CDC Control device is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_HID) + { + printf("HID device is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_PRINTER) + { + printf("Printer device is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_SMARTCARD) + { + printf("Smart Card device is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_VIDEO) + { + printf("Video device is not supported.\n"); + } + else if (pphost->device_prop.Itf_Desc[0].bInterfaceClass == USB_AVD) + { + printf("Audio/Video Devices is not supported.\n"); + } + else + { + printf ("The attached device is not supported. \n"); + } + + pphost->usr_cb->DeviceNotSupported(); + } + + return USBH_OK ; + +} + + + +/** +*\*\name USBH_MSC_InterfaceDeInit. +*\*\fun De-Initialize interface by freeing host channels allocated to interface. +*\*\param pdev: selected device. +*\*\param phost: Selected device property. +*\*\return none. +*\*\ +**/ +void USBH_MSC_InterfaceDeInit ( USB_CORE_MODULE *pdev, void *phost) +{ + if ( MSC_Machine.hc_num_out) + { + USB_HCH_Halt(pdev, MSC_Machine.hc_num_out); + USBH_Free_Channel (pdev, MSC_Machine.hc_num_out); + MSC_Machine.hc_num_out = 0; /* Reset the Channel as Free */ + } + + if ( MSC_Machine.hc_num_in) + { + USB_HCH_Halt(pdev, MSC_Machine.hc_num_in); + USBH_Free_Channel (pdev, MSC_Machine.hc_num_in); + MSC_Machine.hc_num_in = 0; /* Reset the Channel as Free */ + } +} + + +/** +*\*\name USBH_MSC_ClassRequest. +*\*\fun This function will only initialize the MSC state machine. +*\*\param pdev: selected device. +*\*\param phost: Selected device property. +*\*\return Status of class request handled. +*\*\ +**/ +static USBH_Status USBH_MSC_ClassRequest(USB_CORE_MODULE *pdev , void *phost) +{ + USBH_Status status = USBH_OK ; + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_BOT_INIT_STATE; + + return status; +} + +/** +*\*\name USBH_MSC_Handle. +*\*\fun MSC state machine handler. +*\*\param pdev: selected device. +*\*\param phost: Selected device property. +*\*\return status. +*\*\ +**/ +static USBH_Status USBH_MSC_Handle(USB_CORE_MODULE *pdev , void *phost) +{ + USBH_HOST *pphost = phost; + + USBH_Status status = USBH_BUSY; + uint8_t mscStatus = USBH_MSC_BUSY; + uint8_t appliStatus = 0; + + + static uint8_t maxLunExceed = FALSE; + + if(HOST_IsDeviceConnected(pdev)) + { + switch(USBH_MSC_BOTXferParam.MSCState) + { + case USBH_MSC_BOT_INIT_STATE: + USBH_MSC_Init(pdev); + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_GET_MAX_LUN; + break; + case USBH_MSC_GET_MAX_LUN: + /* Issue GetMaxLUN request */ + status = USBH_MSC_GETMaxLUN(pdev, phost); + + if(status == USBH_OK ) + { + MSC_Machine.maxLun = *(MSC_Machine.buff) ; + + /* If device has more that one logical unit then it is not supported */ + if((MSC_Machine.maxLun > 0) && (maxLunExceed == FALSE)) + { + maxLunExceed = TRUE; + pphost->usr_cb->DeviceNotSupported(); + + break; + } + + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_TEST_UNIT_READY; + } + if(status == USBH_NOT_SUPPORTED ) + { + /* If the Command has failed, then we need to move to Next State, after + STALL condition is cleared by Control-Transfer */ + USBH_MSC_BOTXferParam.MSCStateBkp = USBH_MSC_TEST_UNIT_READY; + /* a Clear Feature should be issued here */ + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_CTRL_ERROR_STATE; + } + break; + + case USBH_MSC_CTRL_ERROR_STATE: + /* Issue Clearfeature request */ + status = USBH_ClrFeature(pdev, + phost, + 0x00, + pphost->Control.hch_num_out); + if(status == USBH_OK ) + { + /* If GetMaxLun Request not support, assume Single LUN configuration */ + MSC_Machine.maxLun = 0; + + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_BOTXferParam.MSCStateBkp; + } + break; + + case USBH_MSC_TEST_UNIT_READY: + /* Issue SCSI command TestUnitReady */ + mscStatus = USBH_MSC_TestUnitReady(pdev); + + if(mscStatus == USBH_MSC_OK ) + { + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_READ_CAPACITY10; + MSCErrorCount = 0; + status = USBH_OK; + } + else + { + USBH_MSC_ErrorHandle(mscStatus); + } + break; + + case USBH_MSC_READ_CAPACITY10: + /* Issue READ_CAPACITY10 SCSI command */ + mscStatus = USBH_MSC_ReadCapacity10(pdev); + if(mscStatus == USBH_MSC_OK ) + { + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_MODE_SENSE6; + MSCErrorCount = 0; + status = USBH_OK; + } + else + { + USBH_MSC_ErrorHandle(mscStatus); + } + break; + + case USBH_MSC_MODE_SENSE6: + /* Issue ModeSense6 SCSI command for detecting if device is write-protected */ + mscStatus = USBH_MSC_ModeSense6(pdev); + if(mscStatus == USBH_MSC_OK ) + { + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_DEFAULT_APPLI_STATE; + MSCErrorCount = 0; + status = USBH_OK; + } + else + { + USBH_MSC_ErrorHandle(mscStatus); + } + break; + + case USBH_MSC_BOT_USB_TRANSFERS: + /* Process the BOT state machine */ + USBH_MSC_HandleBOTXfer(pdev,phost); + break; + + case USBH_MSC_DEFAULT_APPLI_STATE: + /* Process Application callback for MSC */ + appliStatus = pphost->usr_cb->UserApplication(); + if(appliStatus == 0) + { + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_DEFAULT_APPLI_STATE; + } + else if (appliStatus == 1) + { + /* De-init requested from application layer */ + status = USBH_APPLY_DEINIT; + } + break; + + case USBH_MSC_UNRECOVERED_STATE: + status = USBH_UNRECOVERED_ERROR; + break; + + case USBH_MSC_REQUEST_SENSE: + /* Issue RequestSense SCSI command for retrieving error code */ + mscStatus = USBH_MSC_RequestSense(pdev); + if(mscStatus == USBH_MSC_OK ) + { + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_BOTXferParam.MSCStateBkp; + status = USBH_OK; + } + else + { + USBH_MSC_ErrorHandle(mscStatus); + } + break; + default: + break; + } + } + return status; +} + + + +/** +*\*\name USBH_MSC_GETMaxLUN. +*\*\fun This request is used to reset the mass storage device and its associated interface. This class-specific request shall ready the device for the next CBW from the host. +*\*\param pdev: selected device. +*\*\param phost: Selected device property. +*\*\return status: USB ctrl xfer status. +*\*\ +**/ +static USBH_Status USBH_MSC_GETMaxLUN(USB_CORE_MODULE *pdev , USBH_HOST *phost) +{ + phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_TYPE_CLASS | USB_REQ_RECIPIENT_INTERFACE; + + phost->Control.setup.b.bRequest = USB_REQ_GET_MAX_LUN; + phost->Control.setup.b.wValue.w = 0; + phost->Control.setup.b.wIndex.w = 0; + phost->Control.setup.b.wLength.w = 1; + + return USBH_CtrlReq(pdev, phost, MSC_Machine.buff , 1 ); +} + +/** +*\*\name USBH_MSC_ErrorHandle. +*\*\fun The function is for handling errors occurring during the MSC state machine. +*\*\param status: selected device. +*\*\return none: USB ctrl xfer status. +*\*\ +**/ +void USBH_MSC_ErrorHandle(uint8_t status) +{ + if(status == USBH_MSC_FAIL) + { + MSCErrorCount++; + if(MSCErrorCount < USBH_MSC_ERROR_RETRY_LIMIT) + { /* Try MSC level error recovery, Issue the request Sense to get + Drive error reason */ + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_REQUEST_SENSE; + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + } + else + { + /* Error trials exceeded the limit, go to unrecovered state */ + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_UNRECOVERED_STATE; + } + } + else if(status == USBH_MSC_PHASE_ERROR) + { + /* Phase error, Go to Unrecovered state */ + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_UNRECOVERED_STATE; + } + else if(status == USBH_MSC_BUSY) + { + /*No change in state*/ + } +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_fatfs.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_fatfs.c new file mode 100644 index 0000000000..ddd4d5a037 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_fatfs.c @@ -0,0 +1,235 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_msc_fatfs.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbhs_conf.h" +#include "usbh_core.h" +#include "diskio.h" +#include "usbh_msc_scsi.h" +#include "usbh_msc_bot.h" + +DWORD get_fattime(void); + +static volatile DSTATUS Stat = STA_NOINIT; /* Disk status */ + +extern USB_CORE_MODULE USBHS_Core; +extern USBH_HOST USB_Host; + +/** +*\*\name disk_initialize. +*\*\fun Initialize Disk Drive. +*\*\param drv: Physical drive number. +*\*\return Stat. +*\*\ +**/ +DSTATUS disk_initialize(BYTE drv)/* Physical drive number (0) */ +{ + if(HOST_IsDeviceConnected(&USBHS_Core)) + { + Stat &= ~STA_NOINIT; + } + + return Stat; +} + +/** +*\*\name disk_status. +*\*\fun Get Disk Status. +*\*\param drv: Physical drive number. +*\*\return Stat. +*\*\ +**/ +DSTATUS disk_status(BYTE drv) /* Physical drive number (0) */ +{ + if (drv) return STA_NOINIT; /* Supports only single drive */ + return Stat; +} + +/** +*\*\name disk_read. +*\*\fun Read Sector(s). +*\*\param pdrv: Physical drive number. +*\*\param buff: Pointer to the data buffer to store read data. +*\*\param sector: Start sector number. +*\*\param count: Sector count. +*\*\return Stat. +*\*\ +**/ +DRESULT disk_read (BYTE pdrv, BYTE *buff, DWORD sector, UINT count) +{ + BYTE status = USBH_MSC_OK; + + if (pdrv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + + if(HOST_IsDeviceConnected(&USBHS_Core)) + { + do + { + status = USBH_MSC_Read10(&USBHS_Core, buff,sector,512 * count); + USBH_MSC_HandleBOTXfer(&USBHS_Core ,&USB_Host); + + if(!HOST_IsDeviceConnected(&USBHS_Core)) + { + return RES_ERROR; + } + } + while(status == USBH_MSC_BUSY ); + } + if(status == USBH_MSC_OK) + return RES_OK; + return RES_ERROR; +} + +#if _READONLY == 0 + +/** +*\*\name disk_write. +*\*\fun Write Sector(s). +*\*\param pdrv: Physical drive number. +*\*\param buff: Pointer to the data buffer to be written. +*\*\param sector: Start sector number. +*\*\param count: Sector count. +*\*\return Stat. +*\*\ +**/ +DRESULT disk_write (BYTE pdrv, const BYTE *buff, DWORD sector, UINT count) +{ + BYTE status = USBH_MSC_OK; + if (pdrv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + if (Stat & STA_PROTECT) return RES_WRPRT; + + + if(HOST_IsDeviceConnected(&USBHS_Core)) + { + do + { + status = USBH_MSC_Write10(&USBHS_Core,(BYTE*)buff,sector,512 * count); + USBH_MSC_HandleBOTXfer(&USBHS_Core, &USB_Host); + + if(!HOST_IsDeviceConnected(&USBHS_Core)) + { + return RES_ERROR; + } + } + while(status == USBH_MSC_BUSY ); + } + + if(status == USBH_MSC_OK) + return RES_OK; + return RES_ERROR; +} +#endif /* _READONLY == 0 */ + +#if _USE_IOCTL != 0 +/** +*\*\name disk_ioctl. +*\*\fun Miscellaneous Functions. +*\*\param pdrv: Physical drive number. +*\*\param ctrl: Control code. +*\*\param buff: Buffer to send/receive control data. +*\*\return res. +*\*\ +**/ +DRESULT disk_ioctl (BYTE drv, BYTE ctrl, void *buff) +{ + DRESULT res = RES_OK; + + if (drv) return RES_PARERR; + + res = RES_ERROR; + + if (Stat & STA_NOINIT) return RES_NOTRDY; + + switch (ctrl) + { + case CTRL_SYNC : /* Make sure that no pending write process */ + res = RES_OK; + break; + + case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */ + + *(DWORD*)buff = (DWORD) USBH_MSC_Param.MSCapacity; + res = RES_OK; + break; + + case GET_SECTOR_SIZE : /* Get R/W sector size (WORD) */ + *(WORD*)buff = 512; + res = RES_OK; + break; + + case GET_BLOCK_SIZE : /* Get erase block size in unit of sector (DWORD) */ + *(DWORD*)buff = 512; + break; + + default: + res = RES_PARERR; + } + return res; +} + +/** +*\*\name get_fattime. +*\*\fun Gets Time from RTC . +*\*\param none. +*\*\return Time in DWORD. +*\*\ +**/ +DWORD get_fattime(void) +{ + return 0; +} + +#endif /* _USE_IOCTL != 0 */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_scsi.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_scsi.c new file mode 100644 index 0000000000..017084c486 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/class/MSC/src/usbh_msc_scsi.c @@ -0,0 +1,593 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_msc_scsi.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +/* Includes ------------------------------------------------------------------*/ +#include "usbh_msc_core.h" +#include "usbh_msc_scsi.h" +#include "usbh_msc_bot.h" +#include "usbh_ioreq.h" +#include "usbh_def.h" + +MassStorageParameter_TypeDef USBH_MSC_Param; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBH_DataInBuffer[512] __ALIGN_END ; + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBH_DataOutBuffer[512] __ALIGN_END ; + +/** +*\*\name USBH_MSC_TestUnitReady. +*\*\fun Issues 'Test unit ready' command to the device. Once the response received, it updates the status to upper layer. +*\*\param pdev: selected device. +*\*\return status. +*\*\ +**/ +uint8_t USBH_MSC_TestUnitReady (USB_CORE_MODULE *pdev) +{ + uint8_t index; + USBH_MSC_Status_TypeDef status = USBH_MSC_BUSY; + + if(HOST_IsDeviceConnected(pdev)) + { + switch(USBH_MSC_BOTXferParam.CmdStateMachine) + { + case CMD_SEND_STATE: + /*Prepare the CBW and relevent field*/ + USBH_MSC_CBWData.field.CBWTransferLength = 0; /* No Data Transfer */ + USBH_MSC_CBWData.field.CBWFlags = USB_EP_DIR_OUT; + USBH_MSC_CBWData.field.CBWLength = CBW_LENGTH_TEST_UNIT_READY; + USBH_MSC_BOTXferParam.pRxTxBuff = USBH_MSC_CSWData.CSWArray; + USBH_MSC_BOTXferParam.DataLength = USBH_MSC_CSW_MAX_LENGTH; + USBH_MSC_BOTXferParam.MSCStateCurrent = USBH_MSC_TEST_UNIT_READY; + + for(index = CBW_CB_LENGTH - 1; index != 0; index--) + { + USBH_MSC_CBWData.field.CBWCB[index] = 0x00; + } + + USBH_MSC_CBWData.field.CBWCB[0] = OPCODE_TEST_UNIT_READY; + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_SEND_CBW; + /* Start the transfer, then let the state + machine magage the other transactions */ + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_BOT_USB_TRANSFERS; + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_BUSY; + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + break; + + case CMD_WAIT_STATUS: + if(USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_OK) + { + /* Commands successfully sent and Response Received */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } + else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_FAIL ) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_FAIL; + } + else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_PHASE_ERROR ) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } + break; + + default: + break; + } + } + return status; +} + + + +/** +*\*\name USBH_MSC_ReadCapacity10. +*\*\fun Issue the read capacity command to the device. Once the response received, it updates the status to upper layer. +*\*\param pdev: selected device. +*\*\return status. +*\*\ +**/ +uint8_t USBH_MSC_ReadCapacity10(USB_CORE_MODULE *pdev) +{ + uint8_t index; + USBH_MSC_Status_TypeDef status = USBH_MSC_BUSY; + + if(HOST_IsDeviceConnected(pdev)) + { + switch(USBH_MSC_BOTXferParam.CmdStateMachine) + { + case CMD_SEND_STATE: + /*Prepare the CBW and relevent field*/ + USBH_MSC_CBWData.field.CBWTransferLength = XFER_LEN_READ_CAPACITY10; + USBH_MSC_CBWData.field.CBWFlags = USB_EP_DIR_IN; + USBH_MSC_CBWData.field.CBWLength = CBW_LENGTH; + + USBH_MSC_BOTXferParam.pRxTxBuff = USBH_DataInBuffer; + USBH_MSC_BOTXferParam.MSCStateCurrent = USBH_MSC_READ_CAPACITY10; + + for(index = CBW_CB_LENGTH -1; index != 0; index--) + { + USBH_MSC_CBWData.field.CBWCB[index] = 0x00; + } + + USBH_MSC_CBWData.field.CBWCB[0] = OPCODE_READ_CAPACITY10; + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_SEND_CBW; + + /* Start the transfer, then let the state machine manage the other + transactions */ + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_BOT_USB_TRANSFERS; + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_BUSY; + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + break; + + case CMD_WAIT_STATUS: + if(USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_OK) + { + /*assign the capacity*/ + (((uint8_t*)&USBH_MSC_Param.MSCapacity )[3]) = USBH_DataInBuffer[0]; + (((uint8_t*)&USBH_MSC_Param.MSCapacity )[2]) = USBH_DataInBuffer[1]; + (((uint8_t*)&USBH_MSC_Param.MSCapacity )[1]) = USBH_DataInBuffer[2]; + (((uint8_t*)&USBH_MSC_Param.MSCapacity )[0]) = USBH_DataInBuffer[3]; + + /*assign the page length*/ + (((uint8_t*)&USBH_MSC_Param.MSPageLength )[1]) = USBH_DataInBuffer[6]; + (((uint8_t*)&USBH_MSC_Param.MSPageLength )[0]) = USBH_DataInBuffer[7]; + + /* Commands successfully sent and Response Received */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } + else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_FAIL ) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_FAIL; + } + else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_PHASE_ERROR ) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } + else + { + /* Wait for the Commands to get Completed */ + /* NO Change in state Machine */ + } + break; + + default: + break; + } + } + return status; +} + + + +/** +*\*\name USBH_MSC_ModeSense6. +*\*\fun Issue the Mode Sense6 Command to the device. This function is used for reading the WriteProtect Status of the Mass-Storage device. +*\*\param pdev: selected device. +*\*\return status. +*\*\ +**/ +uint8_t USBH_MSC_ModeSense6(USB_CORE_MODULE *pdev) +{ + uint8_t index; + USBH_MSC_Status_TypeDef status = USBH_MSC_BUSY; + + if(HOST_IsDeviceConnected(pdev)) + { + switch(USBH_MSC_BOTXferParam.CmdStateMachine) + { + case CMD_SEND_STATE: + /*Prepare the CBW and relevent field*/ + USBH_MSC_CBWData.field.CBWTransferLength = XFER_LEN_MODE_SENSE6; + USBH_MSC_CBWData.field.CBWFlags = USB_EP_DIR_IN; + USBH_MSC_CBWData.field.CBWLength = CBW_LENGTH; + + USBH_MSC_BOTXferParam.pRxTxBuff = USBH_DataInBuffer; + USBH_MSC_BOTXferParam.MSCStateCurrent = USBH_MSC_MODE_SENSE6; + + for(index = CBW_CB_LENGTH - 1; index != 0; index--) + { + USBH_MSC_CBWData.field.CBWCB[index] = 0x00; + } + + USBH_MSC_CBWData.field.CBWCB[0] = OPCODE_MODE_SENSE6; + USBH_MSC_CBWData.field.CBWCB[2] = MODE_SENSE_PAGE_CONTROL_FIELD | MODE_SENSE_PAGE_CODE; + + USBH_MSC_CBWData.field.CBWCB[4] = XFER_LEN_MODE_SENSE6; + + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_SEND_CBW; + + /* Start the transfer, then let the state machine manage the other transactions */ + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_BOT_USB_TRANSFERS; + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_BUSY; + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + break; + + case CMD_WAIT_STATUS: + if(USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_OK) + { + /* Assign the Write Protect status */ + /* If WriteProtect = 0, Writing is allowed + If WriteProtect != 0, Disk is Write Protected */ + if ( USBH_DataInBuffer[2] & MASK_MODE_SENSE_WRITE_PROTECT) + { + USBH_MSC_Param.MSWriteProtect = DISK_WRITE_PROTECTED; + } + else + { + USBH_MSC_Param.MSWriteProtect = 0; + } + + /* Commands successfully sent and Response Received */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } + else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_FAIL ) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_FAIL; + } + else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_PHASE_ERROR ) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } + else + { + /* Wait for the Commands to get Completed */ + /* NO Change in state Machine */ + } + break; + + default: + break; + } + } + return status; +} + +/** +*\*\name USBH_MSC_RequestSense. +*\*\fun Issues the Request Sense command to the device. Once the response received, it updates the status to upper layer. +*\*\param pdev: selected device. +*\*\return status. +*\*\ +**/ +uint8_t USBH_MSC_RequestSense(USB_CORE_MODULE *pdev) +{ + USBH_MSC_Status_TypeDef status = USBH_MSC_BUSY; + + uint8_t index; + + + if(HOST_IsDeviceConnected(pdev)) + { + switch(USBH_MSC_BOTXferParam.CmdStateMachine) + { + case CMD_SEND_STATE: + /*Prepare the CBW and relevant field*/ + USBH_MSC_CBWData.field.CBWTransferLength = \ + ALLOCATION_LENGTH_REQUEST_SENSE; + USBH_MSC_CBWData.field.CBWFlags = USB_EP_DIR_IN; + USBH_MSC_CBWData.field.CBWLength = CBW_LENGTH; + USBH_MSC_BOTXferParam.pRxTxBuff = USBH_DataInBuffer; + USBH_MSC_BOTXferParam.MSCStateBkp = USBH_MSC_BOTXferParam.MSCStateCurrent; + USBH_MSC_BOTXferParam.MSCStateCurrent = USBH_MSC_REQUEST_SENSE; + + for(index = CBW_CB_LENGTH - 1; index != 0; index--) + { + USBH_MSC_CBWData.field.CBWCB[index] = 0x00; + } + + USBH_MSC_CBWData.field.CBWCB[0] = OPCODE_REQUEST_SENSE; + USBH_MSC_CBWData.field.CBWCB[1] = DESC_REQUEST_SENSE; + USBH_MSC_CBWData.field.CBWCB[4] = ALLOCATION_LENGTH_REQUEST_SENSE; + + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_SEND_CBW; + /* Start the transfer, then let the state machine manage + the other transactions */ + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_BOT_USB_TRANSFERS; + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_BUSY; + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + + break; + + case CMD_WAIT_STATUS: + if(USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_OK) + { + /* Get Sense data*/ + (((uint8_t*)&USBH_MSC_Param.MSSenseKey )[3]) = USBH_DataInBuffer[0]; + (((uint8_t*)&USBH_MSC_Param.MSSenseKey )[2]) = USBH_DataInBuffer[1]; + (((uint8_t*)&USBH_MSC_Param.MSSenseKey )[1]) = USBH_DataInBuffer[2]; + (((uint8_t*)&USBH_MSC_Param.MSSenseKey )[0]) = USBH_DataInBuffer[3]; + + /* Commands successfully sent and Response Received */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } + else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_FAIL ) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_FAIL; + } + + else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_PHASE_ERROR ) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } + + else + { + /* Wait for the Commands to get Completed */ + /* NO Change in state Machine */ + } + break; + + default: + break; + } + } + return status; +} + +/** +*\*\name USBH_MSC_Write10. +*\*\fun Issue the write command to the device. Once the response received, it updates the status to upper layer. +*\*\param pdev: selected device. +*\*\param dataBuffer : DataBuffer contains the data to write. +*\*\param address : Address to which the data will be written. +*\*\param nbOfbytes : NbOfbytes to be written. +*\*\return status. +*\*\ +**/ +uint8_t USBH_MSC_Write10(USB_CORE_MODULE *pdev, uint8_t *dataBuffer, uint32_t address, uint32_t nbOfbytes) +{ + uint8_t index; + USBH_MSC_Status_TypeDef status = USBH_MSC_BUSY; + uint16_t nbOfPages; + + if(HOST_IsDeviceConnected(pdev)) + { + switch(USBH_MSC_BOTXferParam.CmdStateMachine) + { + case CMD_SEND_STATE: + USBH_MSC_CBWData.field.CBWTransferLength = nbOfbytes; + USBH_MSC_CBWData.field.CBWFlags = USB_EP_DIR_OUT; + USBH_MSC_CBWData.field.CBWLength = CBW_LENGTH; + USBH_MSC_BOTXferParam.pRxTxBuff = dataBuffer; + + + for(index = CBW_CB_LENGTH - 1; index != 0; index--) + { + USBH_MSC_CBWData.field.CBWCB[index] = 0x00; + } + + USBH_MSC_CBWData.field.CBWCB[0] = OPCODE_WRITE10; + + /*logical block address*/ + USBH_MSC_CBWData.field.CBWCB[2] = (((uint8_t*)&address)[3]) ; + USBH_MSC_CBWData.field.CBWCB[3] = (((uint8_t*)&address)[2]); + USBH_MSC_CBWData.field.CBWCB[4] = (((uint8_t*)&address)[1]); + USBH_MSC_CBWData.field.CBWCB[5] = (((uint8_t*)&address)[0]); + + /*USBH_MSC_PAGE_LENGTH = 512*/ + nbOfPages = nbOfbytes/ USBH_MSC_PAGE_LENGTH; + + /*Transfer length */ + USBH_MSC_CBWData.field.CBWCB[7] = (((uint8_t *)&nbOfPages)[1]) ; + USBH_MSC_CBWData.field.CBWCB[8] = (((uint8_t *)&nbOfPages)[0]) ; + + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_SEND_CBW; + /* Start the transfer, then let the state machine + manage the other transactions */ + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_BOT_USB_TRANSFERS; + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_BUSY; + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + + break; + + case CMD_WAIT_STATUS: + if(USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_OK) + { + /* Commands successfully sent and Response Received */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } + else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_FAIL ) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + } + else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_PHASE_ERROR ) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } + break; + + default: + break; + } + } + return status; +} + + +/** +*\*\name USBH_MSC_Read10. +*\*\fun Issue the read command to the device. Once the response received, it updates the status to upper layer. +*\*\param pdev: selected device. +*\*\param dataBuffer : DataBuffer contains the data to read. +*\*\param address : Address to which the data will be read. +*\*\param nbOfbytes : NbOfbytes to be read. +*\*\return status. +*\*\ +**/ +uint8_t USBH_MSC_Read10(USB_CORE_MODULE *pdev, uint8_t *dataBuffer, uint32_t address, uint32_t nbOfbytes) +{ + uint8_t index; + static USBH_MSC_Status_TypeDef status = USBH_MSC_BUSY; + uint16_t nbOfPages; + status = USBH_MSC_BUSY; + + if(HOST_IsDeviceConnected(pdev)) + { + switch(USBH_MSC_BOTXferParam.CmdStateMachine) + { + case CMD_SEND_STATE: + /*Prepare the CBW and relevant field*/ + USBH_MSC_CBWData.field.CBWTransferLength = nbOfbytes; + USBH_MSC_CBWData.field.CBWFlags = USB_EP_DIR_IN; + USBH_MSC_CBWData.field.CBWLength = CBW_LENGTH; + + USBH_MSC_BOTXferParam.pRxTxBuff = dataBuffer; + + for(index = CBW_CB_LENGTH - 1; index != 0; index--) + { + USBH_MSC_CBWData.field.CBWCB[index] = 0x00; + } + + USBH_MSC_CBWData.field.CBWCB[0] = OPCODE_READ10; + + /*logical block address*/ + + USBH_MSC_CBWData.field.CBWCB[2] = (((uint8_t*)&address)[3]); + USBH_MSC_CBWData.field.CBWCB[3] = (((uint8_t*)&address)[2]); + USBH_MSC_CBWData.field.CBWCB[4] = (((uint8_t*)&address)[1]); + USBH_MSC_CBWData.field.CBWCB[5] = (((uint8_t*)&address)[0]); + + /*USBH_MSC_PAGE_LENGTH = 512*/ + nbOfPages = nbOfbytes/ USBH_MSC_PAGE_LENGTH; + + /*Transfer length */ + USBH_MSC_CBWData.field.CBWCB[7] = (((uint8_t *)&nbOfPages)[1]) ; + USBH_MSC_CBWData.field.CBWCB[8] = (((uint8_t *)&nbOfPages)[0]) ; + + + USBH_MSC_BOTXferParam.BOTState = USBH_MSC_SEND_CBW; + /* Start the transfer, then let the state machine + manage the other transactions */ + USBH_MSC_BOTXferParam.MSCState = USBH_MSC_BOT_USB_TRANSFERS; + USBH_MSC_BOTXferParam.BOTXferStatus = USBH_MSC_BUSY; + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + + break; + + case CMD_WAIT_STATUS: + if((USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_OK) && (HOST_IsDeviceConnected(pdev))) + { + /* Commands successfully sent and Response Received */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } + else if ((USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_FAIL ) && (HOST_IsDeviceConnected(pdev))) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + } + else if ( USBH_MSC_BOTXferParam.BOTXferStatus == USBH_MSC_PHASE_ERROR ) + { + /* Failure Mode */ + USBH_MSC_BOTXferParam.CmdStateMachine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } + else + { + /* Wait for the Commands to get Completed */ + /* NO Change in state Machine */ + } + break; + + default: + break; + } + } + return status; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_core.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_core.h new file mode 100644 index 0000000000..1936898201 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_core.h @@ -0,0 +1,250 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_core.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBH_CORE_H__ +#define __USBH_CORE_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usbhs_hcd.h" +#include "usbh_def.h" +#include "usbh_conf.h" +#include "usbhs_core.h" + + +#define MSC_CLASS 0x08 /* MSC */ +#define HID_CLASS 0x03 /* HID */ + +#define USB_AUDIO 0x01 /* Audio */ +#define USB_CDCC 0x02 /* Communications and CDC Control */ +#define USB_HID 0x03 /* HID (Human Interface Device) */ +#define USB_PRINTER 0x07 /* Printer */ +#define USB_MSC 0x08 /* Mass Storage */ +#define USB_HUB 0x09 /* Hub */ +#define USB_CDCD 0x0A /* CDC-Data */ +#define USB_SMARTCARD 0x0B /* Smart Card */ +#define USB_VIDEO 0x0E /* Video */ +#define USB_AVD 0x10 /* Audio/Video Devices */ + + + +#define MSC_PROTOCOL 0x50 +#define CBI_PROTOCOL 0x01 + + +#define USBH_MAX_ERROR_COUNT 2 +#define USBH_DEVICE_ADDRESS_DEFAULT 0 +#define USBH_DEVICE_ADDRESS 1 +#define CFG_DESC_MAX_SIZE 512 + + +typedef enum +{ + USBH_OK = 0, + USBH_BUSY, + USBH_FAIL, + USBH_NOT_SUPPORTED, + USBH_UNRECOVERED_ERROR, + USBH_ERROR_SPEED_UNKNOWN, + USBH_APPLY_DEINIT +}USBH_Status; + +/* Following states are used for gState */ +typedef enum +{ + HOST_IDLE =0, + HOST_WAIT_PRT_ENABLED, + HOST_DEV_ATTACHED, + HOST_DEV_DISCONNECTED, + HOST_DETECT_DEVICE_SPEED, + HOST_ENUMERATION, + HOST_CLASS_REQUEST, + HOST_CLASS, + HOST_CTRL_XFER, + HOST_USR_INPUT, + HOST_SUSPENDED, + HOST_WAKEUP, + HOST_ERROR_STATE +}HOST_State; + + +/* Following states are used for EnumerationState */ +typedef enum +{ + ENUM_IDLE = 0, + ENUM_GET_FULL_DEV_DESC, + ENUM_SET_ADDR, + ENUM_GET_CFG_DESC, + ENUM_GET_FULL_CFG_DESC, + ENUM_GET_MFC_STRING_DESC, + ENUM_GET_PRODUCT_STRING_DESC, + ENUM_GET_SERIALNUM_STRING_DESC, + ENUM_SET_CONFIGURATION, + ENUM_DEV_CONFIGURED +}ENUM_State; + + + +/* Following states are used for CtrlXferStateMachine */ +typedef enum +{ + CTRL_IDLE =0, + CTRL_SETUP, + CTRL_SETUP_WAIT, + CTRL_DATA_IN, + CTRL_DATA_IN_WAIT, + CTRL_DATA_OUT, + CTRL_DATA_OUT_WAIT, + CTRL_STATUS_IN, + CTRL_STATUS_IN_WAIT, + CTRL_STATUS_OUT, + CTRL_STATUS_OUT_WAIT, + CTRL_ERROR, + CTRL_STALLED, + CTRL_COMPLETE +}CTRL_State; + +typedef enum +{ + USBH_USER_NO_RESP = 0, + USBH_USER_RESP_OK = 1, +}USBH_USER_Status; + +/* Following states are used for RequestState */ +typedef enum +{ + CMD_IDLE =0, + CMD_SEND, + CMD_WAIT +}CMD_State; + +typedef struct +{ + uint8_t hch_num_in; + uint8_t hch_num_out; + uint8_t ep0size; + uint8_t *buff; + uint16_t length; + uint8_t errorcount; + uint16_t timer; + CTRL_STATUS status; + USB_Setup_TypeDef setup; + CTRL_State state; + +}USBH_Ctrl_TypeDef; + +typedef struct +{ + uint8_t address; + uint8_t speed; + USBH_DevDesc_TypeDef Dev_Desc; + USBH_CfgDesc_TypeDef Cfg_Desc; + USBH_InterfaceDesc_TypeDef Itf_Desc[USBH_MAX_NUM_INTERFACES]; + USBH_EpDesc_TypeDef Ep_Desc[USBH_MAX_NUM_INTERFACES][USBH_MAX_NUM_ENDPOINTS]; + USBH_HIDDesc_TypeDef HID_Desc; +}USBH_Device_TypeDef; + +typedef struct +{ + USBH_Status (*Init)(USB_CORE_MODULE *USBx , void *phost); + void (*DeInit)(USB_CORE_MODULE *USBx , void *phost); + USBH_Status (*Requests)(USB_CORE_MODULE *USBx ,void *phost); + USBH_Status (*Machine)(USB_CORE_MODULE *USBx, void *phost); +}USBH_Class_cb_TypeDef; + + +typedef struct +{ + void (*Init)(void); /* HostLibInitialized */ + void (*DeInit)(void); /* HostLibInitialized */ + void (*DeviceAttached)(void); /* DeviceAttached */ + void (*ResetDevice)(void); + void (*DeviceDisconnected)(void); + void (*OverCurrentDetected)(void); + void (*DeviceSpeedDetected)(uint8_t DeviceSpeed); /* DeviceSpeed */ + void (*DeviceDescAvailable)(void *); /* DeviceDescriptor is available */ + void (*DeviceAddressAssigned)(void); /* Address is assigned to USB Device */ + void (*ConfigurationDescAvailable)(USBH_CfgDesc_TypeDef *, + USBH_InterfaceDesc_TypeDef *, + USBH_EpDesc_TypeDef *); + /* Configuration Descriptor available */ + void (*ManufacturerString)(void *); /* ManufacturerString*/ + void (*ProductString)(void *); /* ProductString*/ + void (*SerialNumString)(void *); /* SerialNubString*/ + void (*EnumerationDone)(void); /* Enumeration finished */ + USBH_USER_Status (*UserInput)(void); + int (*UserApplication) (void); + void (*DeviceNotSupported)(void); /* Device is not supported*/ + void (*UnrecoveredError)(void); +}USBH_User_cb_TypeDef; + +typedef struct +{ + HOST_State gState; /* Host State Machine Value */ + HOST_State gStateBkp; /* backup of previous State machine value */ + ENUM_State EnumState; /* Enumeration state Machine */ + CMD_State RequestState; + USBH_Ctrl_TypeDef Control; + + USBH_Device_TypeDef device_prop; + + USBH_Class_cb_TypeDef *class_cb; + USBH_User_cb_TypeDef *usr_cb; +} USBH_HOST; + +void USBH_Init(USB_CORE_MODULE *USBx, USB_CORE_ID_TypeDef coreID, USBH_HOST *host, USBH_Class_cb_TypeDef *class_cb, USBH_User_cb_TypeDef *user_cb); + +USBH_Status USBH_DeInit(USB_CORE_MODULE *USBx, USBH_HOST *phost); +void USBH_Main_Process(USB_CORE_MODULE *USBx, USB_CORE_ID_TypeDef coreID, USBH_HOST *phost); +void USBH_ErrorHandle(USBH_HOST *phost, USBH_Status errType); + +#endif /* __USBH_CORE_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_def.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_def.h new file mode 100644 index 0000000000..dfdad096a9 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_def.h @@ -0,0 +1,285 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_def.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBH_DEF_H__ +#define __USBH_DEF_H__ + +#include "n32h76x_78x.h" + +#ifndef USBH_NULL +#define USBH_NULL ((void *)0) +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + + +#define ValBit(VAR,POS) (VAR & (1 << POS)) +#define SetBit(VAR,POS) (VAR |= (1 << POS)) +#define ClrBit(VAR,POS) (VAR &= ((1 << POS)^255)) + +#define LE16(addr) (((u16)(*((u8 *)(addr)))) + (((u16)(*(((u8 *)(addr)) + 1))) << 8)) + +#define USB_LEN_DESC_HDR 0x02 +#define USB_LEN_DEV_DESC 0x12 +#define USB_LEN_CFG_DESC 0x09 +#define USB_LEN_IF_DESC 0x09 +#define USB_LEN_EP_DESC 0x07 +#define USB_LEN_SETUP_PKT 0x08 + +/* bmRequestType :D7 Data Phase Transfer Direction */ +#define USB_REQ_DIR_MASK 0x80 +#define USB_H2D 0x00 +#define USB_D2H 0x80 + +/* bmRequestType D6..5 Type */ +#define USB_REQ_TYPE_STANDARD 0x00 +#define USB_REQ_TYPE_CLASS 0x20 +#define USB_REQ_TYPE_VENDOR 0x40 +#define USB_REQ_TYPE_RESERVED 0x60 + +/* bmRequestType D4..0 Recipient */ +#define USB_REQ_RECIPIENT_DEVICE 0x00 +#define USB_REQ_RECIPIENT_INTERFACE 0x01 +#define USB_REQ_RECIPIENT_ENDPOINT 0x02 +#define USB_REQ_RECIPIENT_OTHER 0x03 + +/* Table 9-4. Standard Request Codes */ +/* bRequest , Value */ +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +/* Table 9-5. Descriptor Types of USB Specifications */ +#define USB_DESC_TYPE_DEVICE 1 +#define USB_DESC_TYPE_CONFIGURATION 2 +#define USB_DESC_TYPE_STRING 3 +#define USB_DESC_TYPE_INTERFACE 4 +#define USB_DESC_TYPE_ENDPOINT 5 +#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 +#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 +#define USB_DESC_TYPE_INTERFACE_POWER 8 +#define USB_DESC_TYPE_HID 0x21 +#define USB_DESC_TYPE_HID_REPORT 0x22 + + +#define USB_DEVICE_DESC_SIZE 18 +#define USB_CONFIGURATION_DESC_SIZE 9 +#define USB_HID_DESC_SIZE 9 +#define USB_INTERFACE_DESC_SIZE 9 +#define USB_ENDPOINT_DESC_SIZE 7 + +/* Descriptor Type and Descriptor Index */ +/* Use the following values when calling the function USBH_GetDescriptor */ +#define USB_DESC_DEVICE ((USB_DESC_TYPE_DEVICE << 8) & 0xFF00) +#define USB_DESC_CONFIGURATION ((USB_DESC_TYPE_CONFIGURATION << 8) & 0xFF00) +#define USB_DESC_STRING ((USB_DESC_TYPE_STRING << 8) & 0xFF00) +#define USB_DESC_INTERFACE ((USB_DESC_TYPE_INTERFACE << 8) & 0xFF00) +#define USB_DESC_ENDPOINT ((USB_DESC_TYPE_INTERFACE << 8) & 0xFF00) +#define USB_DESC_DEVICE_QUALIFIER ((USB_DESC_TYPE_DEVICE_QUALIFIER << 8) & 0xFF00) +#define USB_DESC_OTHER_SPEED_CONFIGURATION ((USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION << 8) & 0xFF00) +#define USB_DESC_INTERFACE_POWER ((USB_DESC_TYPE_INTERFACE_POWER << 8) & 0xFF00) +#define USB_DESC_HID_REPORT ((USB_DESC_TYPE_HID_REPORT << 8) & 0xFF00) +#define USB_DESC_HID ((USB_DESC_TYPE_HID << 8) & 0xFF00) + + +#define USB_EP_TYPE_CTRL 0x00 +#define USB_EP_TYPE_ISOC 0x01 +#define USB_EP_TYPE_BULK 0x02 +#define USB_EP_TYPE_INTR 0x03 + +#define USB_EP_DIR_OUT 0x00 +#define USB_EP_DIR_IN 0x80 +#define USB_EP_DIR_MSK 0x80 + +/* supported classes */ +#define USB_MSC_CLASS 0x08 +#define USB_HID_CLASS 0x03 + +/* Interface Descriptor field values for HID Boot Protocol */ +#define HID_BOOT_CODE 0x01 +#define HID_KEYBRD_BOOT_CODE 0x01 +#define HID_MOUSE_BOOT_CODE 0x02 + +/* As per USB specs 9.2.6.4 :Standard request with data request timeout: 5sec + Standard request with no data stage timeout : 50ms */ +#define DATA_STAGE_TIMEOUT 5000 +#define NODATA_STAGE_TIMEOUT 50 + +/** + * @} + */ + + +#define USBH_CONFIGURATION_DESCRIPTOR_SIZE (USB_CONFIGURATION_DESC_SIZE + USB_INTERFACE_DESC_SIZE + (USBH_MAX_NUM_ENDPOINTS * USB_ENDPOINT_DESC_SIZE)) + +#define CONFIG_DESC_wTOTAL_LENGTH (ConfigurationDescriptorData.ConfigDescfield.ConfigurationDescriptor.wTotalLength) + +/* This Union is copied from usbhs_core.h */ +typedef union +{ + uint16_t w; + struct BW + { + uint8_t msb; + uint8_t lsb; + } + bw; +}uint16_t_uint8_t; + + +typedef union +{ + uint8_t d8[8]; + + struct _SetupPkt_Struc + { + uint8_t bmRequestType; + uint8_t bRequest; + uint16_t_uint8_t wValue; + uint16_t_uint8_t wIndex; + uint16_t_uint8_t wLength; + } b; +}USB_Setup_TypeDef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; +}USBH_DescHeader_t; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdUSB; /* USB Specification Number which device complies too */ + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + /* If equal to Zero, each interface specifies its own class + code if equal to 0xFF, the class code is vendor specified. + Otherwise field is valid Class Code.*/ + uint8_t bMaxPacketSize; + uint16_t idVendor; /* Vendor ID (Assigned by USB Org) */ + uint16_t idProduct; /* Product ID (Assigned by Manufacturer) */ + uint16_t bcdDevice; /* Device Release Number */ + uint8_t iManufacturer; /* Index of Manufacturer String Descriptor */ + uint8_t iProduct; /* Index of Product String Descriptor */ + uint8_t iSerialNumber; /* Index of Serial Number String Descriptor */ + uint8_t bNumConfigurations; /* Number of Possible Configurations */ +}USBH_DevDesc_TypeDef; + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; /* Total Length of Data Returned */ + uint8_t bNumInterfaces; /* Number of Interfaces */ + uint8_t bConfigurationValue; /* Value to use as an argument to select this configuration*/ + uint8_t iConfiguration; /*Index of String Descriptor Describing this configuration */ + uint8_t bmAttributes; /* D7 Bus Powered , D6 Self Powered, D5 Remote Wakeup , D4..0 Reserved (0)*/ + uint8_t bMaxPower; /*Maximum Power Consumption */ +}USBH_CfgDesc_TypeDef; + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdHID; /* indicates what endpoint this descriptor is describing */ + uint8_t bCountryCode; /* specifies the transfer type. */ + uint8_t bNumDescriptors; /* specifies the transfer type. */ + uint8_t bReportDescriptorType; /* Maximum Packet Size this endpoint is capable of sending or receiving */ + uint16_t wItemLength; /* is used to specify the polling interval of certain transfers. */ +}USBH_HIDDesc_TypeDef; + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; /* Value used to select alternative setting */ + uint8_t bNumEndpoints; /* Number of Endpoints used for this interface */ + uint8_t bInterfaceClass; /* Class Code (Assigned by USB Org) */ + uint8_t bInterfaceSubClass; /* Subclass Code (Assigned by USB Org) */ + uint8_t bInterfaceProtocol; /* Protocol Code */ + uint8_t iInterface; /* Index of String Descriptor Describing this interface */ + +}USBH_InterfaceDesc_TypeDef; + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; /* indicates what endpoint this descriptor is describing */ + uint8_t bmAttributes; /* specifies the transfer type. */ + uint16_t wMaxPacketSize; /* Maximum Packet Size this endpoint is capable of sending or receiving */ + uint8_t bInterval; /* is used to specify the polling interval of certain transfers. */ +}USBH_EpDesc_TypeDef; +#endif diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_hcs.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_hcs.h new file mode 100644 index 0000000000..5537829d48 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_hcs.h @@ -0,0 +1,80 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_hcs.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#ifndef __USBH_HCS_H__ +#define __USBH_HCS_H__ + +#include "usbh_core.h" + + +#define HC_MAX 16 + +#define HC_OK 0x0000 +#define HC_USED 0x8000 +#define HC_ERROR 0xFFFF +#define HC_USED_MASK 0x7FFF + + +uint8_t USBH_Alloc_Channel(USB_CORE_MODULE *USBx, uint8_t ep_addr); + +uint8_t USBH_Free_Channel(USB_CORE_MODULE *USBx, uint8_t idx); + +uint8_t USBH_DeAllocate_AllChannel(USB_CORE_MODULE *USBx); + +uint8_t USBH_Open_Channel(USB_CORE_MODULE *USBx, uint8_t ch_num, uint8_t dev_address, uint8_t speed, uint8_t ep_type, uint16_t mps); + +uint8_t USBH_Modify_Channel(USB_CORE_MODULE *USBx, uint8_t hch_num, uint8_t dev_address, uint8_t speed, uint8_t ep_type, uint16_t mps); + + +#endif /* __USBH_HCS_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_ioreq.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_ioreq.h new file mode 100644 index 0000000000..8620e08655 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_ioreq.h @@ -0,0 +1,85 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_ioreq.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBH_IOREQ_H__ +#define __USBH_IOREQ_H__ + +#include "usbhs_conf.h" +#include "usbh_core.h" +#include "usbh_def.h" + +#define USBH_SETUP_PKT_SIZE 8 +#define USBH_EP0_EP_NUM 0 +#define USBH_MAX_PACKET_SIZE 0x40 + +USBH_Status USBH_CtrlSendSetup(USB_CORE_MODULE *USBx, uint8_t *buff, uint8_t hch_num); + +USBH_Status USBH_CtrlSendData(USB_CORE_MODULE *USBx, uint8_t *buff, uint16_t length, uint8_t hch_num); + +USBH_Status USBH_CtrlReceiveData(USB_CORE_MODULE *USBx, uint8_t *buff, uint16_t length, uint8_t hch_num); + +USBH_Status USBH_BulkReceiveData(USB_CORE_MODULE *USBx, uint8_t *buff, uint16_t length, uint8_t hch_num); + +USBH_Status USBH_BulkSendData(USB_CORE_MODULE *USBx, uint8_t *buff, uint16_t length, uint8_t hch_num); + +USBH_Status USBH_InterruptReceiveData(USB_CORE_MODULE *USBx, uint8_t *buff, uint8_t length, uint8_t hch_num); + +USBH_Status USBH_InterruptSendData(USB_CORE_MODULE *USBx, uint8_t *buff, uint8_t length, uint8_t hch_num); + +USBH_Status USBH_CtrlReq(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t *buff,uint16_t length); + +USBH_Status USBH_IsocReceiveData(USB_CORE_MODULE *USBx, uint8_t *buff, uint32_t length, uint8_t hch_num); + +USBH_Status USBH_IsocSendData(USB_CORE_MODULE *USBx, uint8_t *buff, uint32_t length, uint8_t hch_num); + +#endif /* __USBH_IOREQ_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_stdreq.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_stdreq.h new file mode 100644 index 0000000000..ea5c77a330 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/inc/usbh_stdreq.h @@ -0,0 +1,96 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_stdreq.h + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#ifndef __USBH_STDREQ_H__ +#define __USBH_STDREQ_H__ + +#include "usbhs_conf.h" +#include "usbhs_hcd.h" +#include "usbh_core.h" +#include "usbh_def.h" + +/*Standard Feature Selector for clear feature command*/ +#define FEATURE_SELECTOR_ENDPOINT 0X00 +#define FEATURE_SELECTOR_DEVICE 0X01 + + +#define INTERFACE_DESC_TYPE 0x04 +#define ENDPOINT_DESC_TYPE 0x05 +#define INTERFACE_DESC_SIZE 0x09 + + +#define USBH_HID_CLASS 0x03 + +extern uint8_t USBH_CfgDesc[512]; + +USBH_Status USBH_GetDescriptor(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t req_type,uint16_t value_idx, uint8_t* buff, uint16_t length ); + +USBH_Status USBH_Get_DevDesc(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t length); + +USBH_Status USBH_Get_StringDesc(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t string_index, uint8_t *buff, uint16_t length); + +USBH_Status USBH_SetCfg(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint16_t configuration_value); + +USBH_Status USBH_Get_CfgDesc(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint16_t length); + +USBH_Status USBH_SetAddress(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t DeviceAddress); + +USBH_Status USBH_ClrFeature(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t ep_num, uint8_t hch_num); + +USBH_Status USBH_SetInterface(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t ep_num, uint8_t altSetting); + +USBH_Status USBH_Issue_ClrFeature(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t ep_num); + +USBH_DescHeader_t *USBH_GetNextDesc(uint8_t *pbuf, uint16_t *ptr); + +#endif /* __USBH_STDREQ_H__ */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_core.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_core.c new file mode 100644 index 0000000000..35effc44fb --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_core.c @@ -0,0 +1,825 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_core.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbh_ioreq.h" +#include "usbhs_bsp.h" +#include "usbh_hcs.h" +#include "usbh_stdreq.h" +#include "usbh_core.h" +#include "usbhs_hcd_int.h" +#include "usbhs_hcd.h" +#include "n32h76x_78x_gpio.h" +#include "n32h76x_78x_pwr.h" +#include "n32h76x_78x_dbg.h" + +uint8_t USBH_Disconnected (USB_CORE_MODULE *USBx); +uint8_t USBH_Connected (USB_CORE_MODULE *USBx); +uint8_t USBH_SOF (USB_CORE_MODULE *USBx); +uint8_t USBH_PortEnabled (USB_CORE_MODULE *USBx); +uint8_t USBH_PortDisabled (USB_CORE_MODULE *USBx); + +USBHOST_INT_cb_TypeDef USBHOST_INT_cb = +{ + USBH_SOF, + USBH_Connected, + USBH_Disconnected, + USBH_PortEnabled, + USBH_PortDisabled +}; + +USBHOST_INT_cb_TypeDef *USBHOST_INT_fops = &USBHOST_INT_cb; + +__IO uint32_t suspend_flag = 0; + +static USBH_Status USBH_HandleEnum(USB_CORE_MODULE *USBx, USBH_HOST *host); +USBH_Status USBH_HandleControl(USB_CORE_MODULE *USBx, USBH_HOST *host); + +void USB_BSP_Resume(USB_CORE_MODULE *USBx); +void USB_BSP_Suspend(USB_CORE_MODULE *USBx); + +/** +*\*\name USBH_Connected. +*\*\fun USB Connect callback function from the Interrupt. +*\*\param USBx: selected device. +*\*\return Status. +*\*\ +**/ +uint8_t USBH_Connected(USB_CORE_MODULE *USBx) +{ + USBx->host.ConnSts = 1; + return 0; +} + +/** +*\*\name USBH_Connected. +*\*\fun USB Port Enable function. +*\*\param USBx: selected device. +*\*\return Status. +*\*\ +**/ +uint8_t USBH_PortEnabled(USB_CORE_MODULE *USBx) +{ + USBx->host.PortEnabled = 1; + return 0; +} + +/** +*\*\name USBH_PortDisabled. +*\*\fun USB Port Disable function. +*\*\param USBx: selected device. +*\*\return Status. +*\*\ +**/ +uint8_t USBH_PortDisabled(USB_CORE_MODULE *USBx) +{ + USBx->host.PortEnabled = 0; + return 0; +} + +/** +*\*\name USBH_Disconnected. +*\*\fun USB Disconnect callback function from the Interrupt. +*\*\param USBx: selected device. +*\*\return Status. +*\*\ +**/ +uint8_t USBH_Disconnected (USB_CORE_MODULE *USBx) +{ + USB_BSP_DriveVBUS(USBx,0); + /* Disable all interrupts. */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTEN, 0); + + /* Clear any pending interrupts. */ + USB_WRITE_REG32(&USBx->regs.GCSR->GINTSTS, 0xFFFFFFFF); + USB_EnableGlobalInt(USBx, DISABLE); + USBx->host.ConnSts = 0; + return 0; +} + +/** +*\*\name USBH_SOF. +*\*\fun USB SOF callback function from the Interrupt. +*\*\param USBx: selected device. +*\*\return Status. +*\*\ +**/ +uint8_t USBH_SOF (USB_CORE_MODULE *USBx) +{ + /* This callback could be used to implement a scheduler process */ + return 0; +} + +/** +*\*\name USBH_Init. +*\*\fun Host hardware and stack initializations . +*\*\param USBx: selected device. +*\*\param class_cb: Class callback structure address. +*\*\param user_cb: User callback structure address. +*\*\return none. +*\*\ +**/ +void USBH_Init(USB_CORE_MODULE *USBx, USB_CORE_ID_TypeDef coreID, USBH_HOST *host, USBH_Class_cb_TypeDef *class_cb, USBH_User_cb_TypeDef *user_cb) +{ + /* Hardware Init */ + USB_BSP_Init(); + + /* Host de-initializations */ + USBH_DeInit(USBx, host); + + /*Register class and user callbacks */ + host->class_cb = class_cb; + host->usr_cb = user_cb; + + /* Start the USB core */ + USBHOST_CoreInit(USBx, coreID); + + /* Upon Init call usr call back */ + host->usr_cb->Init(); + + /* Enable Interrupts */ + USB_BSP_EnableInterrupt(USBx, coreID); +} + +/** +*\*\name USBH_DeInit. +*\*\fun Re-Initialize Host. +*\*\param USBx: selected device. +*\*\param host: host state set. +*\*\return status: USBH_Status. +*\*\ +**/ +USBH_Status USBH_DeInit(USB_CORE_MODULE *USBx, USBH_HOST *host) +{ + /* Software Init */ + host->gState = HOST_IDLE; + host->gStateBkp = HOST_IDLE; + host->EnumState = ENUM_IDLE; + host->RequestState = CMD_SEND; + + host->Control.state = CTRL_SETUP; + host->Control.ep0size = USB_MAX_EP0_SIZE; + + host->device_prop.address = USBH_DEVICE_ADDRESS_DEFAULT; + host->device_prop.speed = HPCS_PRTSPD_FULL_SPEED; + + USBH_Free_Channel(USBx, host->Control.hch_num_in); + USBH_Free_Channel(USBx, host->Control.hch_num_out); + return USBH_OK; +} + +/** +*\*\name USBH_Main_Process. +*\*\fun USB Host core main state machine process +*\*\param USBx: selected device. +*\*\param host: host state set. +*\*\return none. +*\*\ +**/ +void USBH_Main_Process(USB_CORE_MODULE *USBx, USB_CORE_ID_TypeDef coreID, USBH_HOST *host) +{ + volatile USBH_Status status = USBH_FAIL; + + /* check for Host port events */ + if(((HOST_IsDeviceConnected(USBx) == 0) || (HOST_IsPortEnabled(USBx) == 0)) && (host->gState != HOST_IDLE)) + { + if(host->gState != HOST_DEV_DISCONNECTED) + { + host->gState = HOST_DEV_DISCONNECTED; + } + } + + switch (host->gState) + { + case HOST_IDLE: + if (HOST_IsDeviceConnected(USBx)) + { + host->gState = HOST_WAIT_PRT_ENABLED; + + /*wait denounce delay */ + USB_BSP_mDelay(100); + + /* Apply a port RESET */ + HOST_ResetPort(USBx); + + /* User RESET callback*/ + host->usr_cb->ResetDevice(); + } + break; + + case HOST_WAIT_PRT_ENABLED: + if (USBx->host.PortEnabled == 1) + { + host->gState = HOST_DEV_ATTACHED; + USB_BSP_mDelay(50); + } + break; + + case HOST_DEV_ATTACHED : + host->usr_cb->DeviceAttached(); + host->Control.hch_num_out = USBH_Alloc_Channel(USBx, 0x00); + host->Control.hch_num_in = USBH_Alloc_Channel(USBx, 0x80); + + /* Reset USB Device */ + if ( HOST_ResetPort(USBx) == 0) + { + host->usr_cb->ResetDevice(); + + /* Host is Now ready to start the Enumeration */ + host->device_prop.speed = HOST_GetCurrentSpeed(USBx); + + host->gState = HOST_ENUMERATION; + host->usr_cb->DeviceSpeedDetected(host->device_prop.speed); + + /* Open Control pipes */ + USBH_Open_Channel (USBx, + host->Control.hch_num_in, + host->device_prop.address, + host->device_prop.speed, + EP_TYPE_CTRL, + host->Control.ep0size); + + /* Open Control pipes */ + USBH_Open_Channel (USBx, + host->Control.hch_num_out, + host->device_prop.address, + host->device_prop.speed, + EP_TYPE_CTRL, + host->Control.ep0size); + } + break; + + case HOST_ENUMERATION: + /* Check for enumeration status */ + if (USBH_HandleEnum(USBx , host) == USBH_OK) + { + /* The function shall return USBH_OK when full enumeration is complete */ + + /* user callback for end of device basic enumeration */ + host->usr_cb->EnumerationDone(); + host->gState = HOST_USR_INPUT; + } + break; + + case HOST_USR_INPUT: + /*The function should return user response true to move to class state */ + if ( host->usr_cb->UserInput() == USBH_USER_RESP_OK) + { + if((host->class_cb->Init(USBx, host)) == USBH_OK) + { + host->gState = HOST_CLASS_REQUEST; + } + } + break; + + case HOST_CLASS_REQUEST: + /* process class standard control requests state machine */ + status = host->class_cb->Requests(USBx, host); + + if(status == USBH_OK) + { + host->gState = HOST_CLASS; + } + else + { + USBH_ErrorHandle(host, status); + } + break; + case HOST_CLASS: + /* process class state machine */ + status = host->class_cb->Machine(USBx, host); + USBH_ErrorHandle(host, status); + break; + + case HOST_CTRL_XFER: + /* process control transfer state machine */ + USBH_HandleControl(USBx, host); + break; + case HOST_ERROR_STATE: + /* Re-Initialize Host for new Enumeration */ + USBH_DeInit(USBx, host); + host->usr_cb->DeInit(); + host->class_cb->DeInit(USBx, &host->device_prop); + break; + + case HOST_DEV_DISCONNECTED : + /* Manage User disconnect operations*/ + host->usr_cb->DeviceDisconnected(); + + /* Re-Initialize Host for new Enumeration */ + USBH_DeInit(USBx, host); + host->usr_cb->DeInit(); + host->class_cb->DeInit(USBx, &host->device_prop); + USBH_DeAllocate_AllChannel(USBx); + host->gState = HOST_IDLE; + + /* Re-Initialize Host for new Enumeration */ + USBHOST_CoreInit(USBx, coreID); + break; + + default : + break; + } + +} + +/** +*\*\name USBH_ErrorHandle. +*\*\fun This function handles the Error on Host side. +*\*\param host: host state set. +*\*\param errType : Type of Error or Busy/OK state +*\*\return none. +*\*\ +**/ +void USBH_ErrorHandle(USBH_HOST *host, USBH_Status errType) +{ + /* Error unrecovered or not supported device speed */ + if ( (errType == USBH_ERROR_SPEED_UNKNOWN) || (errType == USBH_UNRECOVERED_ERROR) ) + { + host->usr_cb->UnrecoveredError(); + host->gState = HOST_ERROR_STATE; + } + /* USB host restart requested from application layer */ + else if(errType == USBH_APPLY_DEINIT) + { + host->gState = HOST_ERROR_STATE; + /* user callback for initialization */ + host->usr_cb->Init(); + } +} + +/** +*\*\name USBH_HandleEnum. +*\*\fun This function includes the complete enumeration process. +*\*\param USBx: selected device. +*\*\param host: host state set. +*\*\return status: USBH_Status. +*\*\ +**/ +static USBH_Status USBH_HandleEnum(USB_CORE_MODULE *USBx, USBH_HOST *host) +{ + USBH_Status Status = USBH_BUSY; + uint8_t Local_Buffer[64]; + + switch (host->EnumState) + { + case ENUM_IDLE: + /* Get Device Desc for only 1st 8 bytes : To get EP0 MaxPacketSize */ + if( USBH_Get_DevDesc(USBx , host, 8) == USBH_OK) + { + host->Control.ep0size = host->device_prop.Dev_Desc.bMaxPacketSize; + + host->EnumState = ENUM_GET_FULL_DEV_DESC; + + /* modify control channels configuration for MaxPacket size */ + USBH_Modify_Channel (USBx, host->Control.hch_num_out, 0, 0, 0, host->Control.ep0size); + USBH_Modify_Channel (USBx, host->Control.hch_num_in, 0, 0, 0, host->Control.ep0size); + } + break; + + case ENUM_GET_FULL_DEV_DESC: + /* Get FULL Device Desc */ + if( USBH_Get_DevDesc(USBx, host, USB_DEVICE_DESC_SIZE) == USBH_OK) + { + /* user callback for device descriptor available */ + host->usr_cb->DeviceDescAvailable(&host->device_prop.Dev_Desc); + host->EnumState = ENUM_SET_ADDR; + } + break; + + case ENUM_SET_ADDR: + /* set address */ + if( USBH_SetAddress(USBx, host, USBH_DEVICE_ADDRESS) == USBH_OK) + { + USB_BSP_mDelay(2); + host->device_prop.address = USBH_DEVICE_ADDRESS; + + /* user callback for device address assigned */ + host->usr_cb->DeviceAddressAssigned(); + host->EnumState = ENUM_GET_CFG_DESC; + + /* modify control channels to update device address */ + USBH_Modify_Channel (USBx, host->Control.hch_num_in, host->device_prop.address, 0, 0, 0); + USBH_Modify_Channel (USBx, host->Control.hch_num_out, host->device_prop.address, 0, 0, 0); + } + break; + + case ENUM_GET_CFG_DESC: + /* get standard configuration descriptor */ + if( USBH_Get_CfgDesc(USBx, host, USB_CONFIGURATION_DESC_SIZE) == USBH_OK) + { + /* before getting full config descriptor, check if it does not exceed + buffer size allocated to config descriptor USBH_MAX_DATA_BUFFER + in the usbh_conf.h*/ + if (host->device_prop.Cfg_Desc.wTotalLength <= USBH_MAX_DATA_BUFFER) + { + host->EnumState = ENUM_GET_FULL_CFG_DESC; + } + } + break; + + case ENUM_GET_FULL_CFG_DESC: + /* get FULL config descriptor (config, interface, endpoints) */ + if(USBH_Get_CfgDesc(USBx, host, host->device_prop.Cfg_Desc.wTotalLength) == USBH_OK) + { + /* User callback for configuration descriptors available */ + host->usr_cb->ConfigurationDescAvailable(&host->device_prop.Cfg_Desc, host->device_prop.Itf_Desc, host->device_prop.Ep_Desc[0]); + + host->EnumState = ENUM_GET_MFC_STRING_DESC; + } + break; + + case ENUM_GET_MFC_STRING_DESC: + if(host->device_prop.Dev_Desc.iManufacturer != 0) + { /* Check that Manufacturer String is available */ + + if ( USBH_Get_StringDesc(USBx, host, host->device_prop.Dev_Desc.iManufacturer, Local_Buffer, 0xff) == USBH_OK) + { + /* User callback for Manufacturing string */ + host->usr_cb->ManufacturerString(Local_Buffer); + host->EnumState = ENUM_GET_PRODUCT_STRING_DESC; + } + } + else + { + host->usr_cb->ManufacturerString("N/A"); + host->EnumState = ENUM_GET_PRODUCT_STRING_DESC; + } + break; + + case ENUM_GET_PRODUCT_STRING_DESC: + if(host->device_prop.Dev_Desc.iProduct != 0) + { /* Check that Product string is available */ + if(USBH_Get_StringDesc(USBx, host, host->device_prop.Dev_Desc.iProduct, Local_Buffer, 0xff) == USBH_OK) + { + /* User callback for Product string */ + host->usr_cb->ProductString(Local_Buffer); + host->EnumState = ENUM_GET_SERIALNUM_STRING_DESC; + } + } + else + { + host->usr_cb->ProductString("N/A"); + host->EnumState = ENUM_GET_SERIALNUM_STRING_DESC; + } + break; + + case ENUM_GET_SERIALNUM_STRING_DESC: + if(host->device_prop.Dev_Desc.iSerialNumber != 0) + { /* Check that Serial number string is available */ + if(USBH_Get_StringDesc(USBx, host, host->device_prop.Dev_Desc.iSerialNumber, Local_Buffer, 0xff) == USBH_OK) + { + /* User callback for Serial number string */ + host->usr_cb->SerialNumString(Local_Buffer); + host->EnumState = ENUM_SET_CONFIGURATION; + } + } + else + { + host->usr_cb->SerialNumString("N/A"); + host->EnumState = ENUM_SET_CONFIGURATION; + } + break; + + case ENUM_SET_CONFIGURATION: + /* set configuration (default config) */ + if(USBH_SetCfg(USBx, host, host->device_prop.Cfg_Desc.bConfigurationValue) == USBH_OK) + { + host->EnumState = ENUM_DEV_CONFIGURED; + } + break; + + + case ENUM_DEV_CONFIGURED: + /* user callback for enumeration done */ + Status = USBH_OK; + break; + + default: + break; + } + return Status; +} + +/** +*\*\name USBH_HandleControl. +*\*\fun Handles the USB control transfer state machine. +*\*\param USBx: selected device. +*\*\param host: host state set. +*\*\return status: USBH_Status. +*\*\ +**/ +USBH_Status USBH_HandleControl(USB_CORE_MODULE *USBx, USBH_HOST *host) +{ + uint8_t direction; + static uint16_t timeout = 0; + USBH_Status status = USBH_OK; + URB_STATE URB_Status = URB_IDLE; + + host->Control.status = CTRL_START; + + switch(host->Control.state) + { + case CTRL_SETUP: + /* send a SETUP packet */ + USBH_CtrlSendSetup(USBx, host->Control.setup.d8, host->Control.hch_num_out); + host->Control.state = CTRL_SETUP_WAIT; + break; + + case CTRL_SETUP_WAIT: + + URB_Status = HOST_GetURB_State(USBx, host->Control.hch_num_out); + /* case SETUP packet sent successfully */ + if(URB_Status == URB_DONE) + { + direction = (host->Control.setup.b.bmRequestType & USB_REQ_DIR_MASK); + + /* check if there is a data stage */ + if(host->Control.setup.b.wLength.w != 0 ) + { + timeout = DATA_STAGE_TIMEOUT; + if(direction == USB_D2H) + { + /* Data Direction is IN */ + host->Control.state = CTRL_DATA_IN; + } + else + { + /* Data Direction is OUT */ + host->Control.state = CTRL_DATA_OUT; + } + } + /* No DATA stage */ + else + { + timeout = NODATA_STAGE_TIMEOUT; + /* If there is No Data Transfer Stage */ + if (direction == USB_D2H) + { + /* Data Direction is IN */ + host->Control.state = CTRL_STATUS_OUT; + } + else + { + /* Data Direction is OUT */ + host->Control.state = CTRL_STATUS_IN; + } + } + /* Set the delay timer to enable timeout for data stage completion */ + host->Control.timer = HOST_GetCurrentFrame(USBx); + } + else if(URB_Status == URB_ERROR) + { + host->Control.state = CTRL_ERROR; + host->Control.status = CTRL_XACTERR; + } + break; + + case CTRL_DATA_IN: + /* Issue an IN token */ + USBH_CtrlReceiveData(USBx, host->Control.buff, host->Control.length, host->Control.hch_num_in); + + host->Control.state = CTRL_DATA_IN_WAIT; + break; + + case CTRL_DATA_IN_WAIT: + + URB_Status = HOST_GetURB_State(USBx , host->Control.hch_num_in); + + /* check is DATA packet transferred successfully */ + if (URB_Status == URB_DONE) + { + host->Control.state = CTRL_STATUS_OUT; + } + + /* manage error cases*/ + if (URB_Status == URB_STALL) + { + /* In stall case, return to previous machine state*/ + host->gState = host->gStateBkp; + host->Control.state = CTRL_STALLED; + } + else if (URB_Status == URB_ERROR) + { + /* Device error */ + host->Control.state = CTRL_ERROR; + } + else if ((HOST_GetCurrentFrame(USBx)- host->Control.timer) > timeout) + { + /* timeout for IN transfer */ + host->Control.state = CTRL_ERROR; + } + break; + + case CTRL_DATA_OUT: + /* Start DATA out transfer (only one DATA packet)*/ + USBx->host.hch[host->Control.hch_num_out].toggle_out = 1; + + USBH_CtrlSendData (USBx, host->Control.buff, host->Control.length, host->Control.hch_num_out); + + host->Control.state = CTRL_DATA_OUT_WAIT; + break; + + case CTRL_DATA_OUT_WAIT: + + URB_Status = HOST_GetURB_State(USBx , host->Control.hch_num_out); + if(URB_Status == URB_DONE) + { /* If the Setup Pkt is sent successful, then change the state */ + host->Control.state = CTRL_STATUS_IN; + } + /* handle error cases */ + else if(URB_Status == URB_STALL) + { + /* In stall case, return to previous machine state*/ + host->gState = host->gStateBkp; + host->Control.state = CTRL_STALLED; + } + else if(URB_Status == URB_NOTREADY) + { + /* Nack received from device */ + host->Control.state = CTRL_DATA_OUT; + } + else if(URB_Status == URB_ERROR) + { + /* device error */ + host->Control.state = CTRL_ERROR; + } + break; + + + case CTRL_STATUS_IN: + /* Send 0 bytes out packet */ + USBH_CtrlReceiveData(USBx, 0, 0,host->Control.hch_num_in); + host->Control.state = CTRL_STATUS_IN_WAIT; + break; + + case CTRL_STATUS_IN_WAIT: + URB_Status = HOST_GetURB_State(USBx , host->Control.hch_num_in); + if(URB_Status == URB_DONE) + { /* Control transfers completed, Exit the State Machine */ + host->gState = host->gStateBkp; + host->Control.state = CTRL_COMPLETE; + } + else if(URB_Status == URB_ERROR) + { + host->Control.state = CTRL_ERROR; + } + else if((HOST_GetCurrentFrame(USBx) - host->Control.timer) > timeout) + { + host->Control.state = CTRL_ERROR; + } + else if(URB_Status == URB_STALL) + { + /* Control transfers completed, Exit the State Machine */ + host->gState = host->gStateBkp; + host->Control.state = CTRL_STALLED; + status = USBH_NOT_SUPPORTED; + } + break; + + case CTRL_STATUS_OUT: + USBx->host.hch[host->Control.hch_num_out].toggle_out ^= 1; + USBH_CtrlSendData(USBx, 0, 0, host->Control.hch_num_out); + + host->Control.state = CTRL_STATUS_OUT_WAIT; + break; + + case CTRL_STATUS_OUT_WAIT: + + URB_Status = HOST_GetURB_State(USBx , host->Control.hch_num_out); + if(URB_Status == URB_DONE) + { + host->gState = host->gStateBkp; + host->Control.state = CTRL_COMPLETE; + } + else if(URB_Status == URB_NOTREADY) + { + host->Control.state = CTRL_STATUS_OUT; + } + else if(URB_Status == URB_ERROR) + { + host->Control.state = CTRL_ERROR; + } + break; + + case CTRL_ERROR: + /* + After a halt condition is encountered or an error is detected by the + host, a control endpoint is allowed to recover by accepting the next Setup + PID; i.e., recovery actions via some other pipe are not required for control + endpoints. For the Default Control Pipe, a device reset will ultimately be + required to clear the halt or error condition if the next Setup PID is not + accepted. + */ + if(++host->Control.errorcount <= USBH_MAX_ERROR_COUNT) + { + /* Do the transmission again, starting from SETUP Packet */ + host->Control.state = CTRL_SETUP; + } + else + { + host->Control.status = CTRL_FAIL; + host->gState = host->gStateBkp; + + status = USBH_FAIL; + } + break; + + default: + break; + } + return status; +} + +/** +*\*\name USB_BSP_Resume. +*\*\fun Handles the USB Resume from Suspend Mode. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USB_BSP_Resume(USB_CORE_MODULE *USBx) +{ + uint32_t hpcs = 0; + + /* switch-off the clocks */ + USB_CLR_REG32_BIT(USBx->regs.PWRCTRL, USBHS_PWRCTRL_PHYSTP); + + hpcs = USB_ReadHPCS(USBx); + hpcs &= (~USBHS_HPCS_PSUSP); + hpcs |= USBHS_HPCS_PRES; + USB_WRITE_REG32(USBx->regs.HPCS, hpcs); + USB_BSP_mDelay (20); + + hpcs &= (~USBHS_HPCS_PRES); + USB_WRITE_REG32(USBx->regs.HPCS, hpcs); +} + +/** +*\*\name USB_BSP_Suspend. +*\*\fun Handles the Enter USB to Suspend Mode. +*\*\param USBx: selected device. +*\*\return none. +*\*\ +**/ +void USB_BSP_Suspend(USB_CORE_MODULE *USBx) +{ + uint32_t hpcs; + + hpcs = USB_ReadHPCS(USBx); + hpcs |= USBHS_HPCS_PSUSP; + USB_WRITE_REG32(USBx->regs.HPCS, hpcs); + + /* switch-off the clocks */ + USB_SET_REG32_BIT(USBx->regs.PWRCTRL, USBHS_PWRCTRL_PHYSTP); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_hcs.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_hcs.c new file mode 100644 index 0000000000..29bf329333 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_hcs.c @@ -0,0 +1,200 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_hcs.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */#include "usbh_hcs.h" +#include "usbhs_core.h" + +static uint16_t USBH_GetFreeChannel(USB_CORE_MODULE *USBx); + +/** +*\*\name USBH_Open_Channel. +*\*\fun Open a pipe. +*\*\param USBx: selected device. +*\*\param hch_num: Host channel Number +*\*\param dev_address: USB Device address allocated to attached device +*\*\param speed : USB device speed (Full/Low) +*\*\param ep_type: end point type (Bulk/int/ctl) +*\*\param mps: max pkt size +*\*\return HC_OK. +*\*\ +**/ +uint8_t USBH_Open_Channel(USB_CORE_MODULE *USBx, uint8_t hch_num, uint8_t dev_address, uint8_t speed, uint8_t ep_type, uint16_t mps) +{ + USBx->host.hch[hch_num].ep_num = USBx->host.channel[hch_num]& 0x7F; + USBx->host.hch[hch_num].ep_is_in = (USBx->host.channel[hch_num] & 0x80) == 0x80; + USBx->host.hch[hch_num].dev_addr = dev_address; + USBx->host.hch[hch_num].ep_type = ep_type; + USBx->host.hch[hch_num].max_packet = mps; + USBx->host.hch[hch_num].speed = speed; + USBx->host.hch[hch_num].toggle_in = 0; + USBx->host.hch[hch_num].toggle_out = 0; + if(speed == HPCS_PRTSPD_HIGH_SPEED) + { + USBx->host.hch[hch_num].do_ping = 1; + } + + USB_HCH_Init(USBx, hch_num) ; + + return HC_OK; +} + +/** +*\*\name USBH_Modify_Channel. +*\*\fun Modify a pipe. +*\*\param USBx: selected device. +*\*\param hch_num: Host channel Number +*\*\param dev_address: USB Device address allocated to attached device +*\*\param speed : USB device speed (Full/Low) +*\*\param ep_type: end point type (Bulk/int/ctl) +*\*\param mps: max pkt size +*\*\return HC_OK. +*\*\ +**/ +uint8_t USBH_Modify_Channel(USB_CORE_MODULE *USBx, uint8_t hch_num, uint8_t dev_address, uint8_t speed, uint8_t ep_type, uint16_t mps) +{ + if(dev_address != 0) + { + USBx->host.hch[hch_num].dev_addr = dev_address; + } + + if((USBx->host.hch[hch_num].max_packet != mps) && (mps != 0)) + { + USBx->host.hch[hch_num].max_packet = mps; + } + + if((USBx->host.hch[hch_num].speed != speed ) && (speed != 0 )) + { + USBx->host.hch[hch_num].speed = speed; + } + + USB_HCH_Init(USBx, hch_num); + return HC_OK; + +} + +/** +*\*\name USBH_Alloc_Channel. +*\*\fun Allocate a new channel for the pipe. +*\*\param USBx: selected device. +*\*\param ep_addr: End point for which the channel to be allocated +*\*\return hch_num: Host channel number. +*\*\ +**/ +uint8_t USBH_Alloc_Channel(USB_CORE_MODULE *USBx, uint8_t ep_addr) +{ + uint16_t hch_num; + + hch_num = USBH_GetFreeChannel(USBx); + + if (hch_num != HC_ERROR) + { + USBx->host.channel[hch_num & (USB_MAX_TX_FIFOS - 1U)] = HC_USED | ep_addr; + } + return hch_num; +} + +/** +*\*\name USBH_Free_Channel. +*\*\fun Free the USB host channel. +*\*\param USBx: selected device. +*\*\param idx: Channel number to be freed. +*\*\return USBH_OK. +*\*\ +**/ +uint8_t USBH_Free_Channel(USB_CORE_MODULE *USBx, uint8_t idx) +{ + if(idx < HC_MAX) + { + USBx->host.channel[idx & (USB_MAX_TX_FIFOS - 1U)] = 0; + } + return USBH_OK; +} + +/** +*\*\name USBH_DeAllocate_AllChannel. +*\*\fun Free all USB host channel. +*\*\param USBx: selected device. +*\*\return USBH_OK. +*\*\ +**/ +uint8_t USBH_DeAllocate_AllChannel(USB_CORE_MODULE *USBx) +{ + uint8_t idx; + + for (idx = 2; idx < HC_MAX ; idx ++) + { + USBx->host.channel[idx] = 0; + } + return USBH_OK; +} + +/** +*\*\name USBH_GetFreeChannel. +*\*\fun Get a free channel number for allocation to a device endpoint. +*\*\param USBx: selected device. +*\*\return idx: Free Channel number. +*\*\ +**/ +static uint16_t USBH_GetFreeChannel(USB_CORE_MODULE *USBx) +{ + uint8_t idx = 0; + + for (idx = 0 ; idx < HC_MAX ; idx++) + { + if ((USBx->host.channel[idx] & HC_USED) == 0) + { + return idx; + } + } + return HC_ERROR; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_ioreq.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_ioreq.c new file mode 100644 index 0000000000..0f4f68c074 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_ioreq.c @@ -0,0 +1,377 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_ioreq.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbh_ioreq.h" + +static USBH_Status USBH_SubmitSetupRequest(USBH_HOST *phost, uint8_t* buff, uint16_t length); + +/** +*\*\name USBH_CtrlReq. +*\*\fun USBH_CtrlReq sends a control request and provide the status after completion of the request +*\*\param USBx: selected device. +*\*\param phost: host state set. +*\*\param buff: data buffer address to store the response +*\*\param length: length of the response +*\*\return status. +*\*\ +**/ +USBH_Status USBH_CtrlReq(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t *buff, uint16_t length) +{ + USBH_Status status; + status = USBH_BUSY; + + switch(phost->RequestState) + { + case CMD_SEND: + /* Start a SETUP transfer */ + USBH_SubmitSetupRequest(phost, buff, length); + phost->RequestState = CMD_WAIT; + status = USBH_BUSY; + break; + + case CMD_WAIT: + if(phost->Control.state == CTRL_COMPLETE) + { + /* Commands successfully sent and Response Received */ + phost->RequestState = CMD_SEND; + phost->Control.state =CTRL_IDLE; + status = USBH_OK; + } + else if(phost->Control.state == CTRL_ERROR) + { + /* Failure Mode */ + phost->RequestState = CMD_SEND; + status = USBH_FAIL; + } + else if(phost->Control.state == CTRL_STALLED) + { + /* Commands successfully sent and Response Received */ + phost->RequestState = CMD_SEND; + status = USBH_NOT_SUPPORTED; + } + break; + + default: + break; + } + return status; +} + +/** +*\*\name USBH_CtrlSendSetup. +*\*\fun Sends the Setup Packet to the Device. +*\*\param USBx: selected device. +*\*\param buff: data buffer address to store the response +*\*\param hch_num: Host channel Number +*\*\return status. +*\*\ +**/ +USBH_Status USBH_CtrlSendSetup(USB_CORE_MODULE *USBx, uint8_t *buff, uint8_t hch_num) +{ + USBx->host.hch[hch_num].ep_is_in = 0; + USBx->host.hch[hch_num].data_pid = HCH_PID_SETUP; + USBx->host.hch[hch_num].xfer_buff = buff; + USBx->host.hch[hch_num].xfer_len = USBH_SETUP_PKT_SIZE; + + return (USBH_Status)HOST_SubmitRequest (USBx , hch_num); +} + +/** +*\*\name USBH_CtrlSendSetup. +*\*\fun Sends the Setup Packet to the Device. +*\*\param USBx: selected device. +*\*\param buff: data buffer address to store the response +*\*\param length: Length of the data to be sent +*\*\param hch_num: Host channel Number +*\*\return status. +*\*\ +**/ +USBH_Status USBH_CtrlSendData(USB_CORE_MODULE *USBx, uint8_t *buff, uint16_t length, uint8_t hch_num) +{ + USBx->host.hch[hch_num].ep_is_in = 0; + USBx->host.hch[hch_num].xfer_buff = buff; + USBx->host.hch[hch_num].xfer_len = length; + + if(length == 0) + { /* For Status OUT stage, Length==0, Status Out PID = 1 */ + USBx->host.hch[hch_num].toggle_out = 1; + } + + /* Set the Data Toggle bit as per the Flag */ + if(USBx->host.hch[hch_num].toggle_out == 0) + { /* Put the PID 0 */ + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA0; + } + else + { /* Put the PID 1 */ + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA1 ; + } + + HOST_SubmitRequest (USBx , hch_num); + + return USBH_OK; +} + +/** +*\*\name USBH_CtrlReceiveData. +*\*\fun Receives the Device Response to the Setup Packet. +*\*\param USBx: selected device. +*\*\param buff: data buffer address to store the response +*\*\param length: Length of the data to be sent +*\*\param hch_num: Host channel Number +*\*\return status. +*\*\ +**/ +USBH_Status USBH_CtrlReceiveData(USB_CORE_MODULE *USBx, uint8_t* buff, uint16_t length, uint8_t hch_num) +{ + USBx->host.hch[hch_num].ep_is_in = 1; + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA1; + USBx->host.hch[hch_num].xfer_buff = buff; + USBx->host.hch[hch_num].xfer_len = length; + + HOST_SubmitRequest (USBx , hch_num); + + return USBH_OK; +} + +/** +*\*\name USBH_BulkSendData. +*\*\fun Sends the Bulk Packet to the device. +*\*\param USBx: selected device. +*\*\param buff: Buffer pointer from which the Data will be sent to Device +*\*\param length: Length of the data to be sent +*\*\param hch_num: Host channel Number +*\*\return status. +*\*\ +**/ +USBH_Status USBH_BulkSendData(USB_CORE_MODULE *USBx, uint8_t *buff, uint16_t length, uint8_t hch_num) +{ + USBx->host.hch[hch_num].ep_is_in = 0; + USBx->host.hch[hch_num].xfer_buff = buff; + USBx->host.hch[hch_num].xfer_len = length; + + /* Set the Data Toggle bit as per the Flag */ + if(USBx->host.hch[hch_num].toggle_out == 0) + { /* Put the PID 0 */ + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA0; + } + else + { /* Put the PID 1 */ + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA1 ; + } + + HOST_SubmitRequest (USBx , hch_num); + return USBH_OK; +} + +/** +*\*\name USBH_BulkReceiveData. +*\*\fun Receives IN bulk packet from device. +*\*\param USBx: selected device. +*\*\param buff: Buffer pointer from which the received data packet to be copied. +*\*\param length: Length of the data to be received. +*\*\param hch_num: Host channel Number +*\*\return status. +*\*\ +**/ +USBH_Status USBH_BulkReceiveData(USB_CORE_MODULE *USBx, uint8_t *buff, uint16_t length, uint8_t hch_num) +{ + USBx->host.hch[hch_num].ep_is_in = 1; + USBx->host.hch[hch_num].xfer_buff = buff; + USBx->host.hch[hch_num].xfer_len = length; + + if( USBx->host.hch[hch_num].toggle_in == 0) + { + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA0; + } + else + { + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA1; + } + + HOST_SubmitRequest (USBx , hch_num); + return USBH_OK; +} + +/** +*\*\name USBH_InterruptReceiveData. +*\*\fun Receives the Device Response to the Interrupt IN token. +*\*\param USBx: selected device. +*\*\param buff: Buffer pointer from which the received data packet to be copied. +*\*\param length: Length of the data to be received. +*\*\param hch_num: Host channel Number +*\*\return status. +*\*\ +**/ +USBH_Status USBH_InterruptReceiveData(USB_CORE_MODULE *USBx, uint8_t *buff, uint8_t length, uint8_t hch_num) +{ + USBx->host.hch[hch_num].ep_is_in = 1; + USBx->host.hch[hch_num].xfer_buff = buff; + USBx->host.hch[hch_num].xfer_len = length; + + if(USBx->host.hch[hch_num].toggle_in == 0) + { + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA0; + } + else + { + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA1; + } + + /* toggle DATA PID */ + USBx->host.hch[hch_num].toggle_in ^= 1; + + HOST_SubmitRequest (USBx , hch_num); + + return USBH_OK; +} + +/** +*\*\name USBH_InterruptSendData. +*\*\fun Sends the data on Interrupt OUT Endpoint. +*\*\param USBx: selected device. +*\*\param buff: Buffer pointer from where the data needs to be copied. +*\*\param length: Length of the data to be sent. +*\*\param hch_num: Host channel Number +*\*\return status. +*\*\ +**/ +USBH_Status USBH_InterruptSendData( USB_CORE_MODULE *USBx, uint8_t *buff, uint8_t length, uint8_t hch_num) +{ + USBx->host.hch[hch_num].ep_is_in = 0; + USBx->host.hch[hch_num].xfer_buff = buff; + USBx->host.hch[hch_num].xfer_len = length; + + if(USBx->host.hch[hch_num].toggle_in == 0) + { + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA0; + } + else + { + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA1; + } + + USBx->host.hch[hch_num].toggle_in ^= 1; + + HOST_SubmitRequest (USBx , hch_num); + + return USBH_OK; +} + +/** +*\*\name USBH_SubmitSetupRequest. +*\*\fun Start a setup transfer by changing the state-machine and initializing the required variables needed for the Control Transfer. +*\*\param USBx: selected device. +*\*\param buff: Buffer used for setup request. +*\*\param length: Length of the data. +*\*\return status. +*\*\ +**/ +static USBH_Status USBH_SubmitSetupRequest(USBH_HOST *phost, uint8_t* buff, uint16_t length) +{ + /* Save Global State */ + phost->gStateBkp = phost->gState; + + /* Prepare the Transactions */ + phost->gState = HOST_CTRL_XFER; + phost->Control.buff = buff; + phost->Control.length = length; + phost->Control.state = CTRL_SETUP; + + return USBH_OK; +} + +/** +*\*\name USBH_IsocReceiveData. +*\*\fun Receives the Device Response to the Isochronous IN token. +*\*\param USBx: selected device. +*\*\param buff: Buffer pointer in which the response needs to be copied. +*\*\param length: Length of the data to be received. +*\*\param hch_num: Host channel Number +*\*\return status. +*\*\ +**/ +USBH_Status USBH_IsocReceiveData( USB_CORE_MODULE *USBx, uint8_t *buff, uint32_t length, uint8_t hch_num) +{ + USBx->host.hch[hch_num].ep_is_in = 1; + USBx->host.hch[hch_num].xfer_buff = buff; + USBx->host.hch[hch_num].xfer_len = length; + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA0; + + HOST_SubmitRequest (USBx , hch_num); + + return USBH_OK; +} + +/** +*\*\name USBH_IsocSendData. +*\*\fun Sends the data on Isochronous OUT Endpoint. +*\*\param USBx: selected device. +*\*\param buff: Buffer pointer from where the data needs to be copied. +*\*\param length: Length of the data to be sent. +*\*\param hch_num: Host channel Number +*\*\return status. +*\*\ +**/ +USBH_Status USBH_IsocSendData( USB_CORE_MODULE *USBx, uint8_t *buff, uint32_t length, uint8_t hch_num) +{ + USBx->host.hch[hch_num].ep_is_in = 0; + USBx->host.hch[hch_num].xfer_buff = buff; + USBx->host.hch[hch_num].xfer_len = length; + USBx->host.hch[hch_num].data_pid = HCH_PID_DATA0; + + HOST_SubmitRequest (USBx , hch_num); + + return USBH_OK; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_stdreq.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_stdreq.c new file mode 100644 index 0000000000..b9290b14d1 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Driver/n32h76x_78x_usbhs_driver/host/core/src/usbh_stdreq.c @@ -0,0 +1,512 @@ +/** +* Copyright (c) 2025, Nations Technologies Inc. +* +* All rights reserved. +* +* This software is the exclusive property of Nations Technologies Inc. (Hereinafter +* referred to as NATIONS). This software, and the product of NATIONS described herein +* (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +* of the People's Republic of China and other applicable jurisdictions worldwide. +* +* NATIONS does not grant any license under its patents, copyrights, trademarks, or other +* intellectual property rights. Names and brands of third party may be mentioned or referred +* thereto (if any) for identification purposes only. +* +* NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +* improvements to this software at any time without notice. Please contact NATIONS and obtain +* the latest version of this software before placing orders. + +* Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +* no responsibility for the accuracy and reliability of this software. +* +* It is the responsibility of the user of this software to properly design, program, and test +* the functionality and safety of any application made of this information and any resulting product. +* In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +* consequential damages arising in any way out of the use of this software or the Product. +* +* NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +* malfunction or failure of which may cause loss of human life, bodily injury or severe property +* damage. Such applications are deemed, "Insecure Usage". +* +* All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +* harmless from and against all claims, costs, damages, and other liabilities, arising from or related +* to any customer's Insecure Usage. + +* Any express or implied warranty with regard to this software or the Product, including,but not +* limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +* are disclaimed to the fullest extent permitted by law. + +* Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +* or otherwise distribute this software for any purposes, in whole or in part. +* +* NATIONS products and technologies shall not be used for or incorporated into any products or systems +* whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +* User shall comply with any applicable export control laws and regulations promulgated and administered by +* the governments of any countries asserting jurisdiction over the parties or transactions. +**/ + +/** + * @file usbh_stdreq.c + * @author Nations + * @version v1.0.0 + * + * @copyright Copyright (c) 2025, Nations Technologies Inc. All rights reserved. + */ +#include "usbh_ioreq.h" +#include "usbh_stdreq.h" + +#ifdef USB_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBH_CfgDesc[CFG_DESC_MAX_SIZE] __ALIGN_END ; + + +static void USBH_ParseDevDesc(USBH_DevDesc_TypeDef* , uint8_t *buf, uint16_t length); + +USBH_Status USBH_ParseCfgDesc(USBH_CfgDesc_TypeDef* cfg_desc, + USBH_InterfaceDesc_TypeDef* itf_desc, + USBH_EpDesc_TypeDef ep_desc[][USBH_MAX_NUM_ENDPOINTS], + uint8_t *buf, + uint16_t length); + + +static void USBH_ParseInterfaceDesc (USBH_InterfaceDesc_TypeDef *if_descriptor, uint8_t *buf); +static void USBH_ParseEPDesc (USBH_EpDesc_TypeDef *ep_descriptor, uint8_t *buf); +static void USBH_ParseStringDesc (uint8_t* psrc, uint8_t* pdest, uint16_t length); + +/** +*\*\name USBH_Get_DevDesc. +*\*\fun Issue Get Device Descriptor command to the device. Once the response received, it parses the device descriptor and updates the status. +*\*\param USBx: selected device. +*\*\param phost: host state set. +*\*\param length: Length of the descriptor +*\*\return status. +*\*\ +**/ +USBH_Status USBH_Get_DevDesc(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t length) +{ + USBH_Status status; + + if((status = USBH_GetDescriptor(USBx, phost, USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, USB_DESC_DEVICE, USBx->host.Rx_Buffer, length)) == USBH_OK) + { + /* Commands successfully sent and Response Received */ + USBH_ParseDevDesc(&phost->device_prop.Dev_Desc, USBx->host.Rx_Buffer, length); + } + return status; +} + +/** +*\*\name USBH_Get_CfgDesc. +*\*\fun Issues Configuration Descriptor to the device. Once the response received, it parses the configuration descriptor and updates the status. +*\*\param USBx: selected device. +*\*\param phost: host state set. +*\*\param length: Length of the descriptor +*\*\return status. +*\*\ +**/ +USBH_Status USBH_Get_CfgDesc(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint16_t length) +{ + USBH_Status status, result; + uint16_t index = 0; + + if((status = USBH_GetDescriptor(USBx, phost, USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, USB_DESC_CONFIGURATION, USBx->host.Rx_Buffer, length)) == USBH_OK) + { + /*save Cfg descriptor for class parsing usage */ + for( ; index < length ; index ++) + { + USBH_CfgDesc[index] = USBx->host.Rx_Buffer[index]; + } + /* Commands successfully sent and Response Received */ + result = USBH_ParseCfgDesc(&phost->device_prop.Cfg_Desc, phost->device_prop.Itf_Desc, phost->device_prop.Ep_Desc, USBx->host.Rx_Buffer, length); + if(result != USBH_OK) + { + status= result; + } + } + return status; +} + +/** +*\*\name USBH_Get_StringDesc. +*\*\fun Issues string Descriptor command to the device. Once the response received, it parses the string descriptor and updates the status. +*\*\param USBx: selected device. +*\*\param phost: host state set. +*\*\param string_index: String index for the descriptor +*\*\param buff: Buffer address for the descriptor +*\*\param length: Length of the descriptor +*\*\return status. +*\*\ +**/ +USBH_Status USBH_Get_StringDesc(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t string_index, uint8_t *buff, uint16_t length) +{ + USBH_Status status; + + if((status = USBH_GetDescriptor(USBx, phost, USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, USB_DESC_STRING | string_index, USBx->host.Rx_Buffer, length)) == USBH_OK) + { + /* Commands successfully sent and Response Received */ + USBH_ParseStringDesc(USBx->host.Rx_Buffer,buff, length); + } + return status; +} + +/** +*\*\name USBH_GetDescriptor. +*\*\fun Issues Descriptor command to the device. Once the response received, it parses the descriptor and updates the status. +*\*\param USBx: selected device. +*\*\param phost: host state set. +*\*\param req_type: Descriptor type. +*\*\param value_idx: wValue for the GetDescriptr request +*\*\param buff: Buffer to store the descriptor +*\*\param length: Length of the descriptor +*\*\return status. +*\*\ +**/ +USBH_Status USBH_GetDescriptor(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t req_type, uint16_t value_idx, uint8_t* buff, uint16_t length) +{ + phost->Control.setup.b.bmRequestType = USB_D2H | req_type; + phost->Control.setup.b.bRequest = USB_REQ_GET_DESCRIPTOR; + phost->Control.setup.b.wValue.w = value_idx; + + if ((value_idx & 0xff00) == USB_DESC_STRING) + { + phost->Control.setup.b.wIndex.w = 0x0409; + } + else + { + phost->Control.setup.b.wIndex.w = 0; + } + phost->Control.setup.b.wLength.w = length; + return USBH_CtrlReq(USBx, phost, buff , length); +} + +/** +*\*\name USBH_SetAddress. +*\*\fun This command sets the address to the connected device. +*\*\param USBx: selected device. +*\*\param phost: host state set. +*\*\param DeviceAddress: Device address to assign. +*\*\return status. +*\*\ +**/ +USBH_Status USBH_SetAddress(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t DeviceAddress) +{ + phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD; + + phost->Control.setup.b.bRequest = USB_REQ_SET_ADDRESS; + + phost->Control.setup.b.wValue.w = (uint16_t)DeviceAddress; + phost->Control.setup.b.wIndex.w = 0; + phost->Control.setup.b.wLength.w = 0; + + return USBH_CtrlReq(USBx, phost, 0 , 0 ); +} + +/** +*\*\name USBH_SetCfg. +*\*\fun The command sets the configuration value to the connected device. +*\*\param USBx: selected device. +*\*\param phost: host state set. +*\*\param cfg_idx: Configuration value. +*\*\return status. +*\*\ +**/ +USBH_Status USBH_SetCfg(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint16_t cfg_idx) +{ + phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD; + phost->Control.setup.b.bRequest = USB_REQ_SET_CONFIGURATION; + phost->Control.setup.b.wValue.w = cfg_idx; + phost->Control.setup.b.wIndex.w = 0; + phost->Control.setup.b.wLength.w = 0; + + return USBH_CtrlReq(USBx, phost, 0 , 0 ); +} + +/** +*\*\name USBH_SetInterface. +*\*\fun The command sets the Interface value to the connected device. +*\*\param USBx: selected device. +*\*\param phost: host state set. +*\*\param ep_num: the index of the endpoint. +*\*\param altSetting: the value for the setup of set interface. +*\*\return status. +*\*\ +**/ +USBH_Status USBH_SetInterface(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t ep_num, uint8_t altSetting) +{ + phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE | USB_REQ_TYPE_STANDARD; + + phost->Control.setup.b.bRequest = USB_REQ_SET_INTERFACE; + phost->Control.setup.b.wValue.w = altSetting; + phost->Control.setup.b.wIndex.w = ep_num; + phost->Control.setup.b.wLength.w = 0; + + return USBH_CtrlReq(USBx, phost, 0 , 0 ); +} + +/** +*\*\name USBH_ClrFeature. +*\*\fun This request is used to clear or disable a specific feature. +*\*\param USBx: selected device. +*\*\param phost: host state set. +*\*\param ep_num: endpoint number. +*\*\param hch_num: Host channel number. +*\*\return status. +*\*\ +**/ +USBH_Status USBH_ClrFeature(USB_CORE_MODULE *USBx, USBH_HOST *phost, uint8_t ep_num, uint8_t hch_num) +{ + phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_ENDPOINT | USB_REQ_TYPE_STANDARD; + phost->Control.setup.b.bRequest = USB_REQ_CLEAR_FEATURE; + phost->Control.setup.b.wValue.w = FEATURE_SELECTOR_ENDPOINT; + phost->Control.setup.b.wIndex.w = ep_num; + phost->Control.setup.b.wLength.w = 0; + + if((ep_num & USB_REQ_DIR_MASK) == USB_D2H) + { /* EP Type is IN */ + USBx->host.hch[hch_num].toggle_in = 0; + } + else + {/* EP Type is OUT */ + USBx->host.hch[hch_num].toggle_out = 0; + } + + return USBH_CtrlReq(USBx, phost, 0 , 0 ); +} + +/** +*\*\name USBH_ParseDevDesc. +*\*\fun This function Parses the device descriptor. +*\*\param dev_desc: device_descriptor destination address. +*\*\param buf: Buffer where the source descriptor is available. +*\*\param length: Length of the descriptor. +*\*\return status. +*\*\ +**/ +static void USBH_ParseDevDesc (USBH_DevDesc_TypeDef* dev_desc, uint8_t *buf, uint16_t length) +{ + dev_desc->bLength = *(uint8_t *) (buf + 0); + dev_desc->bDescriptorType = *(uint8_t *) (buf + 1); + dev_desc->bcdUSB = LE16(buf + 2); + dev_desc->bDeviceClass = *(uint8_t *) (buf + 4); + dev_desc->bDeviceSubClass = *(uint8_t *) (buf + 5); + dev_desc->bDeviceProtocol = *(uint8_t *) (buf + 6); + dev_desc->bMaxPacketSize = *(uint8_t *) (buf + 7); + + if (length > 8) + { /* For 1st time after device connection, Host may issue only 8 bytes for Device Descriptor Length */ + dev_desc->idVendor = LE16(buf + 8); + dev_desc->idProduct = LE16(buf + 10); + dev_desc->bcdDevice = LE16(buf + 12); + dev_desc->iManufacturer = *(uint8_t *) (buf + 14); + dev_desc->iProduct = *(uint8_t *) (buf + 15); + dev_desc->iSerialNumber = *(uint8_t *) (buf + 16); + dev_desc->bNumConfigurations = *(uint8_t *) (buf + 17); + } +} + +/** +*\*\name USBH_ParseCfgDesc. +*\*\fun This function Parses the configuration descriptor. +*\*\param cfg_desc: Configuration Descriptor address. +*\*\param itf_desc: Interface Descriptor address. +*\*\param ep_desc: Endpoint Descriptor address. +*\*\param buf: Buffer where the source descriptor is available. +*\*\param length: Length of the descriptor. +*\*\return status. +*\*\ +**/ +USBH_Status USBH_ParseCfgDesc(USBH_CfgDesc_TypeDef* cfg_desc, + USBH_InterfaceDesc_TypeDef* itf_desc, + USBH_EpDesc_TypeDef ep_desc[][USBH_MAX_NUM_ENDPOINTS], + uint8_t *buf, + uint16_t length) +{ + USBH_InterfaceDesc_TypeDef *pif ; + USBH_InterfaceDesc_TypeDef temp_pif ; + USBH_EpDesc_TypeDef *pep; + USBH_DescHeader_t *pdesc = (USBH_DescHeader_t *)buf; + uint16_t ptr; + int8_t if_ix = 0; + int8_t ep_ix = 0; + static uint16_t prev_ep_size = 0; + static uint8_t prev_itf = 0; + USBH_Status status; + + + pdesc = (USBH_DescHeader_t *)buf; + + /* Parse configuration descriptor */ + cfg_desc->bLength = *(uint8_t *) (buf + 0); + cfg_desc->bDescriptorType = *(uint8_t *) (buf + 1); + cfg_desc->wTotalLength = LE16 (buf + 2); + cfg_desc->bNumInterfaces = *(uint8_t *) (buf + 4); + cfg_desc->bConfigurationValue = *(uint8_t *) (buf + 5); + cfg_desc->iConfiguration = *(uint8_t *) (buf + 6); + cfg_desc->bmAttributes = *(uint8_t *) (buf + 7); + cfg_desc->bMaxPower = *(uint8_t *) (buf + 8); + + + if(length > USB_CONFIGURATION_DESC_SIZE) + { + ptr = USB_LEN_CFG_DESC; + + if(cfg_desc->bNumInterfaces <= USBH_MAX_NUM_INTERFACES) + { + pif = (USBH_InterfaceDesc_TypeDef *)0; + while (ptr < cfg_desc->wTotalLength ) + { + pdesc = USBH_GetNextDesc((uint8_t *)pdesc, &ptr); + if(pdesc->bDescriptorType == USB_DESC_TYPE_INTERFACE) + { + if_ix = *(((uint8_t *)pdesc ) + 2); + pif = &itf_desc[if_ix]; + if((*((uint8_t *)pdesc + 3)) < 3) + { + USBH_ParseInterfaceDesc (&temp_pif, (uint8_t *)pdesc); + ep_ix = 0; + + /* Parse Ep descriptors relative to the current interface */ + if(temp_pif.bNumEndpoints <= USBH_MAX_NUM_ENDPOINTS) + { + while(ep_ix < temp_pif.bNumEndpoints) + { + pdesc = USBH_GetNextDesc((void* )pdesc, &ptr); + if(pdesc->bDescriptorType == USB_DESC_TYPE_ENDPOINT) + { + pep = &ep_desc[if_ix][ep_ix]; + if(prev_itf != if_ix) + { + prev_itf = if_ix; + USBH_ParseInterfaceDesc(pif, (uint8_t *)&temp_pif); + } + else + { + if(prev_ep_size > LE16((uint8_t *)pdesc + 4)) + { + break; + } + else + { + USBH_ParseInterfaceDesc(pif, (uint8_t *)&temp_pif); + } + } + USBH_ParseEPDesc(pep, (uint8_t *)pdesc); + prev_ep_size = LE16((uint8_t *)pdesc + 4); + ep_ix++; + } + } + } + else /*num endpoints exceeded */ + { + status = USBH_NOT_SUPPORTED; + return status; + } + } + } + } + } + else /*num interfaces exceeded */ + { + status = USBH_NOT_SUPPORTED; + return status; + } + prev_ep_size = 0; + prev_itf = 0; + } + return USBH_OK ; +} + +/** +*\*\name USBH_ParseInterfaceDesc. +*\*\fun This function Parses the interface descriptor. +*\*\param if_descriptor : Interface descriptor destination. +*\*\param buf: Buffer where the descriptor data is available. +*\*\return none. +*\*\ +**/ +static void USBH_ParseInterfaceDesc(USBH_InterfaceDesc_TypeDef *if_descriptor, uint8_t *buf) +{ + if_descriptor->bLength = *(uint8_t *)(buf + 0); + if_descriptor->bDescriptorType = *(uint8_t *)(buf + 1); + if_descriptor->bInterfaceNumber = *(uint8_t *)(buf + 2); + if_descriptor->bAlternateSetting = *(uint8_t *)(buf + 3); + if_descriptor->bNumEndpoints = *(uint8_t *)(buf + 4); + if_descriptor->bInterfaceClass = *(uint8_t *)(buf + 5); + if_descriptor->bInterfaceSubClass = *(uint8_t *)(buf + 6); + if_descriptor->bInterfaceProtocol = *(uint8_t *)(buf + 7); + if_descriptor->iInterface = *(uint8_t *)(buf + 8); +} + +/** +*\*\name USBH_ParseEPDesc. +*\*\fun This function Parses the endpoint descriptor. +*\*\param ep_descriptor: Endpoint descriptor destination address. +*\*\param buf: Buffer where the parsed descriptor stored. +*\*\return none. +*\*\ +**/ +static void USBH_ParseEPDesc(USBH_EpDesc_TypeDef *ep_descriptor, uint8_t *buf) +{ + ep_descriptor->bLength = *(uint8_t *) (buf + 0); + ep_descriptor->bDescriptorType = *(uint8_t *) (buf + 1); + ep_descriptor->bEndpointAddress = *(uint8_t *) (buf + 2); + ep_descriptor->bmAttributes = *(uint8_t *) (buf + 3); + ep_descriptor->bInterval = *(uint8_t *) (buf + 6); + ep_descriptor->wMaxPacketSize = LE16 (buf + 4); +} + +/** +*\*\name USBH_ParseStringDesc. +*\*\fun This function Parses the string descriptor. +*\*\param psrc: Source pointer containing the descriptor data. +*\*\param pdest: Destination address pointer. +*\*\param length: Length of the descriptor. +*\*\return none. +*\*\ +**/ +static void USBH_ParseStringDesc (uint8_t* psrc, uint8_t* pdest, uint16_t length) +{ + uint16_t strlength; + uint16_t idx; + + /* The UNICODE string descriptor is not NULL-terminated. The string length is + computed by subtracting two from the value of the first byte of the descriptor. + */ + + /* Check which is lower size, the Size of string or the length of bytes read + from the device */ + + if(psrc[1] == USB_DESC_TYPE_STRING) + { /* Make sure the Descriptor is String Type */ + /* psrc[0] contains Size of Descriptor, subtract 2 to get the length of string */ + strlength = ( ( (psrc[0]-2) <= length) ? (psrc[0]-2) :length); + psrc += 2; /* Adjust the offset ignoring the String Len and Descriptor type */ + + for (idx = 0; idx < strlength; idx+=2 ) + {/* Copy Only the string and ignore the UNICODE ID, hence add the src */ + *pdest = psrc[idx]; + pdest++; + } + *pdest = 0; /* mark end of string */ + } +} + +/** +*\*\name USBH_GetNextDesc. +*\*\fun This function return the next descriptor header. +*\*\param buf: Buffer where the cfg descriptor is available. +*\*\param ptr: data pointer inside the cfg descriptor. +*\*\return next header. +*\*\ +**/ +USBH_DescHeader_t *USBH_GetNextDesc(uint8_t *pbuf, uint16_t *ptr) +{ + USBH_DescHeader_t *pnext; + + *ptr += ((USBH_DescHeader_t *)pbuf)->bLength; + pnext = (USBH_DescHeader_t *)((uint8_t *)pbuf + ((USBH_DescHeader_t *)pbuf)->bLength); + + return(pnext); +} diff --git a/bsp/n32/n32g457qel-stb/project.uvoptx b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config.uvoptx similarity index 91% rename from bsp/n32/n32g457qel-stb/project.uvoptx rename to bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config.uvoptx index f318274860..2fed9f27c2 100644 --- a/bsp/n32/n32g457qel-stb/project.uvoptx +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config.uvoptx @@ -1,4 +1,5 @@ + 1.0 @@ -12,7 +13,7 @@ *.lib *.txt; *.h; *.inc; *.md *.plm - *.cpp + *.cpp; *.cc; *.cxx 0 @@ -22,7 +23,7 @@ - rt-thread + Cube_Config 0x4 ARM-ADS @@ -45,7 +46,7 @@ 79 66 8 - .\build\ + .\Listings\ 1 @@ -73,7 +74,7 @@ 0 - 1 + 0 0 1 @@ -120,7 +121,7 @@ 0 UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G45x -FL080000 -FS08000000 -FP0($$Device:N32G457QEL7$Flash\N32G45x.FLM) + UL2CM3(-S0 -C0 -P0 -FD24000000 -FC8000 -FN1 -FF0N32H76x_2048 -FS015000000 -FL01E0000 -FP0($$Device:N32H760xIx7$Flash/N32H76x_2048.FLM)) @@ -168,13 +169,4 @@ - - - ::CMSIS - 0 - 0 - 0 - 1 - - diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config.uvprojx b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config.uvprojx new file mode 100644 index 0000000000..870839aa56 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config.uvprojx @@ -0,0 +1,482 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + Cube_Config + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + N32H760xIx7 + Nationstech + Nationstech.N32H76x_DFP.1.1.0 + http://www.keil.com/pack/ + IRAM1(0x24000000,0x100000) IROM1(0x15000000,0x1E0000) CPUTYPE(Cortex-M7) FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD24000000 -FC8000 -FN1 -FF0N32H76x_2048 -FS015000000 -FL01E0000 -FP0($$Device:N32H760xIx7$Flash/N32H76x_2048.FLM)) + 0 + $$Device:N32H760xIx7$firmware\CMSIS\device\n32h76x_78x.h + + + + + + + + + + $$Device:N32H760xIx7$s + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + Cube_Config + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin --output=.\bin\Cube_Config.bin .\Objects\Cube_Config.axf + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM4 + SARMCM3.DLL + + TCM.DLL + -pCM4 + + + + 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-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 8 + 1 + 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 + 0x24000000 + 0x100000 + + + 1 + 0x15000000 + 0x1E0000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x15000000 + 0x1E0000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x24000000 + 0x100000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 3 + 3 + 1 + 1 + 0 + 0 + 0 + + + N32H76x, USE_STDPERIPH_DRIVER,CORE_CM7,USING_TCM + + ..\USER\inc;..\Driver\CMSIS\core;..\Driver\CMSIS\device;..\Driver\n32h76x_78x_std_periph_driver\inc;..\Driver\n32h76x_78x_periph_app\inc + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x15000000 + 0x24000000 + + .\Cube_Config_CM7.sct + + + + + + + + + + + + STARTUP + + + startup_N32H76x.s + 2 + ..\Driver\CMSIS\device\startup\startup_N32H76x.s + + + + + + CMSIS + + + system_n32h76x_78x.c + 1 + ..\Driver\CMSIS\device\system_n32h76x_78x.c + + + + + + USER + + + main.c + 1 + ..\USER\src\main.c + + + n32h76x_78x_it.c + 1 + ..\USER\src\n32h76x_78x_it.c + + + n32h76x_78x_cfg.c + 1 + ..\USER\src\n32h76x_78x_cfg.c + + + + + FWLB + + + n32h76x_78x_rcc.c + 1 + ..\Driver\n32h76x_78x_std_periph_driver\src\/n32h76x_78x_rcc.c + + + misc.c + 1 + ..\Driver\n32h76x_78x_std_periph_driver\src\/misc.c + + + n32h76x_78x_dma.c + 1 + ..\Driver\n32h76x_78x_std_periph_driver\src\/n32h76x_78x_dma.c + + + n32h76x_78x_gpio.c + 1 + ..\Driver\n32h76x_78x_std_periph_driver\src\/n32h76x_78x_gpio.c + + + n32h76x_78x_usart.c + 1 + ..\Driver\n32h76x_78x_std_periph_driver\src\/n32h76x_78x_usart.c + + + n32h76x_78x_pwr.c + 1 + ..\Driver\n32h76x_78x_std_periph_driver\src\/n32h76x_78x_pwr.c + + + n32h76x_78x_dmamux.c + 1 + ..\Driver\n32h76x_78x_std_periph_driver\src\/n32h76x_78x_dmamux.c + + + n32h76x_78x_mdma.c + 1 + ..\Driver\n32h76x_78x_std_periph_driver\src\/n32h76x_78x_mdma.c + + + + + + + + + + + + + + +
diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config_CM7.sct b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config_CM7.sct new file mode 100644 index 0000000000..0f429eae37 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/MDK-ARM/Cube_Config_CM7.sct @@ -0,0 +1,26 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +; *** NTFx CODE START *** +LR_IROM1 0x15000000 0x80000 { ; load region size_region + ER_IROM1 0x15000000 0x80000 { ; load address = execution address + *.o (RESET, +First) ; Reset vector table + *(InRoot$$Sections) ; All library sections that must be in a root region, + ;for example, __main.o, __scatter*.o, __dc*.o, and * Region$$Table + startup_n32h7*.o (+RO) + system_n32h76x_78x.o (+RO) + + } + QuickCodes_ITCM 0x400 0x3fc00 { ; offset 0x400 for VECTOR TABLE + .ANY (+RO +XO) + } + RW_SRAM 0x24000000 0x80000 { + *(STACK) + .ANY1 (+RW +ZI) + } + DTCM 0x20000000 0x40000 { + .ANY2 (+RW +ZI) ;ANYx: The larger the x, the higher the priority + } +; *** NTFx CODE END *** +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Nationstech.N32H76x_DFP.1.1.0.pack b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/Nationstech.N32H76x_DFP.1.1.0.pack new file mode 100644 index 0000000000000000000000000000000000000000..dbff0512af87f449ff7a469d03e4e1972ffb5847 GIT binary patch literal 213082 zcmcG#W0Yh;+h|$tvTfV8?dq~^8(p?-+paF#wyiFA*`Dn0zTdrf@MqSn$sZ@5*s-5D z5s@qNWW>o-lmP`p1^V|;mievqU%`J45P)ZK8$)Lc2F3q4kU(0}zqO2A&~P~sfPkvm zfq>Berz6k8EXl#{q0h|7%1JLSD|d;lDa#_}Vb;2NHA_?iJ_Ms)4GG;G;#5Hy(xOOL zvfxy{thE7N*=^Gr{_L|ma?y`Tuv8u~LZYXHLg2$VU(Q6%Z_&lZ?=eJTb@x6!W#?`Q zVAv!@P50Zo9J}5;JUMw$p9Mf8n3gdj-I9YnxWeVTp#D%$_@qj?Xw8JA8M_i;`OiT= z_;0rrFup&o{shDgzHE06X9Udl-a!ZWfV@M*yI3gl8eb#iU0>$-ZsJoW`Ixcwh@Hq;CCn( z6En(oN4$mq+enXB_BYIr@S3&I8nfW3O({rC7m)oZRn&*))3M*0O>+jM$ihY9bEKK9 zAop|C1;MRxp@d6?0Ufqg^28R_2*fOn83tBeYir^0IsRZ47h+u=gp8Y1bJ2SefVB_#$W>A%)v zB}I27Q)O9!Qfb+qwDJ}iR_XNXP3Xo1PUsXBEjVAnln^QW*V5`ft6bs>uWqZ*TyUv$ zJPYOkr<4NQj4DE#xt=l@Y3u?RA?mt_u{O$Sy*$KSp*`gC4YM#?7YjIBX%m=;tfry1 zELT6GaxNyR8g$@!d-=3K>AOuR?yd_hAz3J{WSRa7Vw(YeslCGyX6F1f)Dl!e?qcNn zNQ)~is0EKmcivG_i4L_Z=>h%P=t?y0SRh^YSQNPu;&h=H>M);C(3*uM@-q^{{*VmU zEwg-AHcH*z5DnKYwR~45O5OgDHPJIut>}6NwZdSQo_pVfUN|{n7_C$#aZ@gS8 z$8ph&Cadlk8jL4b9WI?G#xZH2S)-E_wp)jIu{2YTiixGlxo(X~qot+y&@#m^bO^|Fa(EJ941?rj`F+eHyZ?(56?4}Pz+ zT#qGpqmQDK+V8(5Y5YEaYZY=kNNPWS4gWn|QzJ&a6E{aOFzZg9I%0l(4Cd(6qcly9 z$zHs4;nIa7^O@0C6rxXm{lql0Z&bNEn)1?oJcef>P`qEM2!dMUWci_4D32m|v z?Z+YXNhZlPc-{Xo+f@@W_{(!iHI$4hUa%Kp#s~AUd+HcT^^Ca9l#w#2-Nke9EHS~T zFva;>o(+|%hDZ53iTJ0suIUnnl5UPIiOHR)AYqWvW)MkM3X@5c;a9x~>gE@iYaF3A z^gW;dGm5tb;`&6oz(>3!c=8A`GzeRddSUr5Fo(IrcT9d($s4FC0-|;OBgZTT%t!f< zk8-5u*Fo3;O62lC%F?Cr3T8#n)$omc5wBlGe+2>u0tL?FkQ}*}COZ-?MWzrQW_Im_ zx7leh4A)_fS@v3E4o9o^DP$3W7~|&Bf3tV5(>Atq>0QD0%7MWf3sYc+5GInv>R-U> z6C*-xFzlz3%64p~E*7U5dJ4Wl$Myod-ytA6Zb_z&Mz*e2JS}|LpDzjVAH)Z%RVlo; zI)&67i@xmkbSg9=(ENJ-8spJ=&voAny}cE1e4%Vom?59Vb8B}p4Q{so7MW9L9$Sfa z4CZ;2h0YF+{gpME1meTRsQ9EV@U<#9OFABw50^I%oIQ~%wucz7dPfDq1I*8tKskOS zt!C&J*GD5}5;GVYZOnJtrY+~8q%oylGg~PE1%9Sh{ir63iT4}|l}9aWKUUFHD4jta zw)~JSl$;_fPp^V%w1?AG6c7g9ML(zR=0&1hjBa#(W`gWBP<~68-d860=UMnq9f*^( zrWEm};R_##2sY#g@Ax0bw2WKNDcW}sr9tiUd2wcwOKhD(lbzFIBZo$5I6vzV4kMu& zl)H?QRQsP7AXv1WOnpc9kQNksR;F<4ATOO8n%&_lVReCn2=P}pY{kv&J`Bj;Y1g_) ziR!{D&qN|dEWC5=X z85QOCc|vYEriSRO4FnAFv?oITmOT4Ka(v%>S%!O7L*F{MOlRL9T86I0@2q{h=-#oe zyg5NZo2vt=z6=D8&FOa$`yVz0_icU6P{N)5n_v;UO$7Z8?>#nq&uby6?EPEvviFzy zBv9xEE|6jOC&$$DSrG zm@%;&Oly_5#&cggziGys$j3(FG+R5Uc=6?sLEn8 z<6H)#NY&aa7tpti&FNeaALq_>w3y;7-O5Cx5j0JMmN7(Q7PeZsaK~}Pm9{tNhx(xe zL$%4@GnZ!2+p1TI2{cTTCh6PwJaLSEjOGJjwO}MroF_7nJjfAyUB5NQ$kEp96Qq)u zD(*D2?ifVLI0m+(_E84!Ck@9#ZVK-A&(;lsE5-G5fBN0%3`^K*#0? zg?J$e;3Zj+lS7fNqTb4k?_nZt4zgMQLe!8D?_l{E&2$pSz#<^T5N`E?7uvbXp z(FC8qb<&ko=nb)2OKtnCU}InT7sy|sP~{6x{{`d2O`vj$F}3*GTu2O{c?EX_Wm$n_ zM}v8fWMW(Wb9-xqEu(}aOqaJyiRGH(R0v9`6w{B7Pw_!EOsXLYxHjb! zfy)l&Q{V1Z?W0|DaQY7p#X*4;|9b;J=n?gTCZF6ObxC`*tBda4B+4a@=@CQj8c-m& z%C?N+bej+A9oUyH;A_H+A8Y*%nVHVOSBkg3efI1(qxJX-G@}Jj)w5+OwBaH`v8*50 zwBzHn*-44b`b_4P@eDNF65l&KXr3}c@)McF6f|{($$NWMW2Rvw>^y1yGQo0jgV*7l z-mxfn%CY6fO9Cev(4y>NDE!aiBp}uC_EYI{uPv8~h8EN%HR6(8-~k>v|UGCwAN zsI-O7nBAE-kW^0kUfa)LhYfos>%^y2iyC!vQOwK4&;RENAqKWRG-BMy)Tl!-5F9@p$F&wM z=Zu&smx=~u#sf06?N(tVXA1b^fkrL7j~CcVG*NrVlq*FAwH=JPIMrx;p`)79FtCrf zK|YzLU8m8-j>|b$=gM56B%ieD=u5iiXX@f-mXls6%o2nKhl9{vdQfp{T&SNUQB*=` zBHhQM&FTkkKIQnx3#U|CmzHK4#Lor6ek_K1s&n}YL8X~8it~)K-6@O4bZP~YyZA)s zz10yVi4^GJDWwwUNGwZ(o#sPiDNvzIUd*z%ScX(0tXrEAC`}CtzAHL(pBv#35pc>V z&M88CsnQwhQ6hxfvvvzcYy!7fZe2&UmSEYphb;@GUObN|4sqS3riHCZPaX!lvwmL@T zQ11n^I_YWk$E?5qFy_%IiOor1AmAVe?{A3J;Y9#}hEDgEQ_Pk$fiS_Pfqjkm)fx$s zmrL0FHu-eUP7heS)KpI|oYhzL`8C@P;i>=-)AimnwHAxlW+3Q#08jNM9NXTBXwdD<6EbZ-_T}+KF=>L1g zEh?@^?_lC=e5tuUu_%bzqjrNgq7y#cqG_Z0Tb0#Tx9B$RLN(%S31YFByrPD<5aWub zysZ!t8u}`{?VWk$XhQvFN;b1t>LN5SGT__Z?0AZ6H`}>q{ioJ~y|x908{cBXWOh0R zXRz&{W%|<-bE~5WU8}!#qsPbt)}jpF_F94c=opJuTaA5W2dZQl)*=#b{?rrtQ#bSK z-RF#O?)9VB>&{l!q1_3Y5aKJ{1a{2RY(~q;MN0tJ(lh$Tj8=CHA7g;#J@)9FPo=&t zb=}N!H$-cC2Ib{|+n^&x9oc0*C{7LX?0G1%?y44UQ!i+i+K$5pFBY)=L4hZwWzh1l z^@%ji@$AJa4O{b261D~02F@CbPLl}jFkE3i%tF1j5rXOs{bHZwg&TM5g}Kr&TZBx4 z9fx9bT`LdzleD)imPR^yx$jdQxT;Qm>&8tt}CJmdMQ5D7A{^qoq^q zcH*Lz#nZt3*}B^3r=&aRq1JXBw3AuwnBNs8(06z$8iZiri{id8MG!bDu&(?N2?&h7 zpe^yCx-7c0Wz71jSSj6<_&hgPxrgk;=3=fzP)I7VNjPvT>S95Relq0i_^HNY85|P+ z9FHxQm*Qwo+Q;Haks@fR%X5e^HU(|@fE|m9L+<>IAh2@G*r>^DSkS@GZ00;;HX=>k z29gBsNhY`Cc2D6OLDkMhI_Jm^B)zOZ&4nx0zriqN@j7ame0B%8)c(9+hLS2H%Z(3( zE#WGn35k@a<(eCPVGK3U z%(^jENWKY*JN`-toyh}NxlWHmUCj(UwLx~cj{9nlB19?!1dF^Z?Un)8(;OlklncHXm4Ul zsC%*?CnQ+3urI4BJr^R5&?_*R+9l0cnK%-|;q1cJh1OjAJC!Uf)(vPWg9kp z>~g)I-%OCDk`GX&8d^{V(ZY*BBA(Ub;Nf+#al0OG`zQNTti#bD%;kMLoS(OwjAd!8 zad^ESu9lDbrzHsTwlX0#CE=PIRch4hORjTuiw(&~_G>Q1jB&d7tET+EUm$?*54OUb zTLrfG`8^!pK10g#^m7alfsio2U!J68+;QZ(tzRi|dU}5O<~*8x0-e4`A&lWJUV3vr zJ$!zFCQwZrcB$z%$?J71fu|7Y?PBy#befL}^!R?>UK%RiUaj*nACMr36g-#BdbhnE zEVj!K5b(w?$Aq()7$%9eFZ6A8Yzo<^yuO?N5YY9^jD}2zAZ|nzCWdT)rMe|aGG;ZO znL5Ix*zeu%8|eH+v{9X9Gs(y*i&9i;E4Y~t+yWXJ67V-RMrX_;d6Ev_3I-(9i*7N{ z)61^dm4?FbQAs zLvd9D4{3Uhq$EYG30o-9iB)Cp&f)THL#q@X<4nINJHhntuHI13Fc5MXTF23%4^2I7 z)D9odIx*V1oT?}2wC&Hw{jJC6lep*%ERhNey^q>gMcIaH`=V`x>W}gnVi`q-T^(JV zdD1Z!Bw6p~BsE>-)g=!KN4uZ=I>jM*@P4R!anHMbv^5pI_CMnF28xnrnEhhWu;5A0 zmbxwdOpUBPC(jaCi8M1O8eJE#NRxZTU+L!f9-v89RU-omO)^ zVDkKh-i!L1FJ2HUOw{_M~A!E4*eYbx3I>|j033%9hK5? zTHt00w9JHHac`qQ9!z_I_9kAwRTZ8IeazaNtS&M%%w02^v<)%kcheD(QQ z{X_qCHk$a=+V+m=hmF9&@RO?$<*m6aDzBGz2j54Bp1_YjEiX4$Pe4^~_LyLz=cMA! zKF2MY_jTFCYUhYvkI(t`-em>PFA^i}urr*JEB$~$w5K|oLC z7CxyJQ)EcfuOGz^Td(m(X-*Hpyi0!sM|1&*6XlwqY8#kPcANl-J*}rtn9jy2M^~y z{vFnZa_0@qhs|?MW3p*BO3|sB<&DPJJguG^X`(?so*aT;4+jN>4c^kQtQ9NRi)NtiI!b`!?I zcj+mO=cU!e$*O7-ky(v_ig(+raDmsQ4@lBIouxvGcG4k==nnT&`43yk_`+umKk>u5 zTap&Tw~EiURTjSz>#Q%5Ir;Cn(=gaL}hhi0o# zm25y1_9~Si*{b159Q3L{GtfihI2qpli(#Ce#z`QYXanOo>AXOTB8;zviN7>~byW9o z1Z&yAEu;$k9h>f5*22gKeP=3eyx{)^CGD{sOWjoH3C8StEMHO#_E%Q3M``cS`U|<$3GpDa)Y~|R>@mRQsf9^fY$Afn&0aw?iKDL@I%R$szp-pKS z8vCqT=*M|&SJ^GWH#sN^`=?*`Y+OnN&0or;;}x$klgcxdQhW*-t5~~lb*Vuj-;1qy z730+I*uytka8Pql>nqG5iUhla2i&;^TFf~gmum$bm4g?TcNT-GmOrR&i=0ggB=(dpS8r!?-Tf)oEupcKZ*EfHHA_3wa#KJM)gl$X$FB1F- z-m^TJiP8{Cbhq75s6FbGuVxSxU=!Yv*BqqBUV=uH4<3ED%_8z_21d7aVi$Za--%?l z7*>~^h4dhK)gJ0K>vN_l;l*wM2l5B!q+5t{VY`yRgnShTD_-k9=7n^)E{yJ(H$T=U z7Mbb5$EM4^dru2QU8ib`rgnnI_H`4%brE#4U?&An2QEj~mCWTC_@pNzvJ=GwvGom( z57hB45jOv*8_6OXXb6r`uZJpfe-4(UTf`61Oa4y`YW{I&5LPnb54ZTJPJbNig^eDR zUnH)|ELWXUT8#f_mOb?1hphwK`BI@ZU-Qh2z4A}eNmq2+mNIr_m0}xX7mxjs_N!(# zd(LR_KBMl0f~v=88OcX$zBsH$`;Kn4Nv@N1$pZd<_uh*Kxy|+jsj$1N*v?-&YW;UD z6DywD;8UB}Q=Xgj_f76fgJG$y(TMunMzS=l;mm|2U>V7T&cNMI;K!4`pjIX|lk+3q z!n^-KcPzf~vw@xk4 zq$kt9&uL%*Z>-1(?vW3ri_(3&RngGCMmNonernXzI=xB;hQ3NwN~;vO6uXzSD>F7~ zuoNBzAVswBiEMlwkW~Uuy1ku_Ur)Njjn|bt?=xFM%9Tb^FHFz)*w;%@-I4B%KGe15 z8kci6agMV?l3@?vc?@nDrrt6KdRGcAeW|J^R@YCRzEhQ<$B@5#ZTxc+W%C@@-;rvMG674sQ2j542SN;XJeZx)O;b9$!p` z!v#FDc!QNOJtzBStxfajX~=XARuY$;y{>mqygl#*wK9l&z-QG2M`dCDqEKn9c$fk{ z45kjl&5o$6zgm@|S`U?o^9{VE3dzGP{nCC$L71u+l5DEg(|) z7bX5R!0eD}h6Jm*3lLWavTy+pyd(4L4V{+Zs89+h_hzcvhV)M_QFWLy66uDu-zwGu z3q(h(ij)M~)~-RJ>RNxxa&ZvqtT}0S(p8as`*l~IGEap9nI^>-zv%9WGeIrO3wF0`#Pm}?T;poj)Dm1og)5gRXh5@XW^ zA7+@nW)f+0&B2v9YR(D^R$EYZlj!0y`#icD4+JJ(ErKq9ox7|Ao~-+FUHNPtbza>% zpG$cc z4cIm#F+}#SM9Yvl)cbXZUy`AlD=5=RIX2y0MRMPjF^418q;qnu;q6EAIf6l z@vs*_TH0^Myq`^AdX`tji+1o=f12V7wLfnqQl>61EUD^)y2GR56n}BDIc!#UED`)_b4Ohs);gUbxT0378p%pLto1l$}OHqm9&DtqwL&AL06Ry~P zgAy0tpzeCP{8f{zhU-zKB-+bA11E=JH| zOTlCalmrpu83p~e91?8!b4Zkz6a>jp02nDQOptR+fpsW|2odHP7242*6!8ii3n54l zm6j0ls%NLJ{?T{u;#2+NbKlgG=~u5e_UxhUWEIaP?Upf?;JzskSs85p4YPluGK8WB zmf$!QC}kIH{-0!ER6PhqrwJfv22e^aQ=pJE;N)y(|A9#$Y5D*E)4%~|OJ?>D1e{F+ zORyi%$r9N7JwPXaLMS?52}%Jv*#?_m4Ctf|gyK&?C+R^csZ4?XSK7J$Pl&k{?Bx)* zFNz7=tnd53Ujj#Ns?AfqIXz~P^fi`XwmBejKx%YDKMX7dY5Y}T96>d(=MW8+g?WKf zA%25vG$We(mjF)#0~7*)67^4k0w|P%R#bYxg+iAg#i<9FgxE{00MG*fHJ|{14*-Gy zfDckAWD5oWqyQib0KNb~2Mz$#0H6T?I{|ee0@{E80CoUy0DxQou>Ao5 zya3=00ABz=2MGYe^{nYg{gGlGNVG6!67@z>v0zcb8OYTd!3_P41}k7R==<{ZwCO_s z6jXqsTyKOV4?Y=~fd)|Y0ZJ-3K+z&ZpKB8|!rB2h0=|SH{aWS3gtfz9W+I)ya@V^4DLN_v~XUz}muMAnkq=h>*skb6BgOCAz!vZKJ0HqcJ zpx6ME)_|p-f8j)fxN#-vhW`k%md^q}HN0q02Oa?20Kf?V*dPE50s!~`fNubxMFbdx z001e(T8xf`pLHgv!-1)Vpt3xIwLUu zZ;J;6=QA$tmY9(Pb%`ALYLo1Pj3~*9TG&YugHKh;`LrSy>B*)ZziJOC4Ie+FeQ0ju zj(`XzQmz_`58KrGVbWA@2AZMu+NuLFY5}1sT9-pjAO?NaUWhdy)C6bH0fdv(9{XB= zP^~{oFenH^C|l-+xPEU>4AC6D3sREP18Jxoi~$4&UJuNXzCWrj@PAiMkh>sh|1S#6 zD!Io#GvKW3{V>l2;0)|te_=@357_ld=Ffo+se2d;M?qn8dm+!g?=S*FPZ$EZ^FGA# z_g|y(XDIxTEIhu5%kRha!La`y6qpm|34P98a=(3V`B#{e%|8s;vs8dW)P?>!pH+Gx zh7`IxI6atrJ-_p=_vU*EQlRJj2dn|Mu~=(z}RnsGtM8OFJ$yQAPy`yjG~my zZ3-u}8X|^HDx)C|$F2?^_>&O{SvW!kP!a(OQ6xag11K*46mo!)4p1~B017EU5e6vx z;Q%EHppgDkhyY43K*0(JCu=8T!a!&0lHuQ;i?yk1* za6a_M+qUX&o{dYvrp`z`32nSn7xnp5i#$-FC@|KJ%W(&>n91sN3DO- zJV2WK07&@%q#J;=`3{iU{z-oUQim@hJxP_kI&zu8ga15VV+lC7OyIGv8+F?HE>0$=(+BAZi)V*|c$ zj56b3{ACk34qmI5gi?!PJwdnoN7LTrw(C}`XZ%bGgVDpDU85~H1Y&kpIyKj>QXG77 z8%3?^Qx854-uSir-x|}mT6P|k4MLU;iHELRHwH#8e<}0h3u;q5is3rVbz0L>!Wv&UaiK|$NH4oZ0 zTXZ7JlB;2Nxz@C2b6q!0{NBHD(c;5<3yYCJ7J%;02;O&Ah9fS615#JvuG)8A$UG>g z9xZ{VVK%~q&5K*Xd?xrMOv5Z{{j8(nHxLHq<`u4SSskOu$vugiXBwL32m+aD8au<> zsfSLvM(ga6no+ACJIyR%o^b|pJV)y6keE@c2cBaLo@eal%j=L&rPfDfb}|eKmSqT@ zV^}Jq-cPO}M3H{Bp_&h+)(5pRII!Fwq9C3`bh9Tkg6pB^=DeE|7&CIE{pCL86ICDb z-lE+U44Q7Qq;zlFY6b;%yF)yV6ot~@?&tf`SOiDex(UVR4jpc|Y!g6`n!c*>{0?%bW# zI?Tjj&rcGEp2|#rRlL|RuPm#naE)A}o5L1tjpz`q12it5SXK~!LAoLoY+RaG6G^Mp zl2xg9POoJKE?bX7uh?<4lp26*H%2z|7}Zi~jHgzcT~4W;a#1M%Y$7&hvo>$Dg8om` z{@>9?S8(7`^_a%=(_D84R^47nr6+jwsyI~4>gVu!R%~t6B0PqNt2#pI#TTCI?M82% zdO-U=NOr8llVYu0HuxSbP+9XlNcu0J#Vr%ynZ%{C_I~30V!`QYG+;6`E4yk)$_gcC z<&wb2@TKzh0zj4c^fW3k8JpEcaf*8WdV&Vi&7RJRasVfxe0k?-ZssZJ zIr+^}p>XQPhU~UrH3z0OLdoWk7hZ#&MD`2jsesUxhFPtZ&!u68ygE~TDkuU` ztN!X;L+s1F9{RIOTlBPR^S2qeu)qyE64woTt1i$3``+&s9iV&kzTd6dK)*%Vtn8Z+ zsi}TCXNgHlrDST;f=Hh)?dVk$7Ye&t+1DUaS13Dc1FCW|TPO_YE>uK|<$s;Z=Ul3+ zRd5UXTGg0@R_5{5eDCqA3B^W;jl@ROTuKWiauFMk;~Fpij5moL(_kLm>Zli{G$hmb z1)>2(Mhk9j4rE;rJZx}?LcjIB<-5W4PM9@I z-JMpBfxRtdUUfR*(8*ecYAk6{En<~UG+M!IS*Y`I)PiHi)uEii3UY4tMZKtqOa9JA z{;Z_$nf>k&wANJrqZJn;sl^}3WPQJLRj5lXfJ#4uH$HhO2WACwVdgjQm)D6u2HsYE z-%7Su-J?Gg?1^7rWq9ak&?h;96ejzt-0gRKxV3}riNBnB-tONiuDdkp1pH_@{4R2= zJM&h0KM(%id21*TP(1~8cLxQz_J6-zG&`}3U(uy9?2dllG0Tg*qD*dUT#@hg@60w` z&zwv)ah$lfk~p7eeZpiRy?^eu-Cqg2RLv4x^uF4YJlrFO?BaE4(&~@x*?fQGSsl!z zJtosX9SJsk?L+)Y^Lv~@Z!>JDZjjGP9oGs#mqdc67s&B>^IpHhDedeojiU?SMjtLa ze5V*3u`jJ4+tap$?F}$0Ri2?N*+)4oI-gH^FS5F8OK_n8{p}|6a*JIQ@jKNYeCy`@ z!i@VU`sW6pS1f_*;P~%^##A8b&a#;^Nl%_S%DE~}IF1oi!C>=~nNS6ZFfkGXMgLaD zO*-La?-ejiU;WXh%{OlRG!g+D(rPm9;{63oNEdOuc{^R+75)?B2O%8#i1QOz0kh6W z#n0sRFq`j}1rx`tT_s)Xz0C?S>|A~Rn$)P8Sv=IaGdHh?FdS>$nyZ96Hz%cd^`z_P zn~3k4?}})ak<-6kzd19;Rr;&NqL*rQ>n@`OPjkZ(u=)2+v(p!5w4-A`gTzM&fr8y~ zevwjuLmS5vN_QU9kvCw@qRwaqOI~)oU>~H%H!AGZX8eHclcHRv3%vN2MA!7Su{li2dkt#36y~g9vSDyZ&a`ySe?CcP#R&BJ1m4uem7rQ#qLASb<(zK6dUq zi27(z?SvoD$m;8z%w8^#U7%;V8h#$8A<8XU4!AcAONFo0sTK^89A|C_q4jFWg~evH zf{fP~_9G@XE)||vE6_dt^LBorUqa^HMYuuT#p^e&K$e2}@=I|$I|uQnu{r@`&R6?) zPO?9<{PNiDi}}o}2eaz2SA2YioyDK3vSsg5%vY`Cjj=kSSSU*?5{6}tJUljnr)6x1 zjgu!@uDE_#ZgCbVKB4#L3>R652h6xr_orIhc1PmyFX>2vK9-_2dDVRBgq)#%4imai ziV2%+IYLq*jJ$F{I$QDPZk~TF0(Zfju>>f=uN0V!-~rsWzq9x z*~={+P<+twvouqk-$4q?j8ZsoIgx;fswfa zmq&vFjwpEoYSf^FHCTnZ3^%BG0nw-;+Xa>=Em)7b3@-?65izj>hxbSPA#iCq4wtTE zLlo5tB70B7C{sk(TG|WkZSqdqnxyk0HZp>njL1ugo4@faYq0e>L|Z?LxQHy4tH{o#2qd^Xu+G)ajy8=Q27CNE^wnQQoA*aMHlE!d>0e)ZI+c%s z`U=A_!Jk$J&|89pOH#;xAX-Y!e>gFAwY{%G4>x~F^BE?zs=Zp@zTE!oKs=g`AO)^} z+LbJ05O|;T;MA-eN&^KGvn|*7cAb8%(2A@it2nPgg@F=LVk2En6;O?v%fyWW={q`r z9j?YGD@bwwLG3fVTGzQMPE3s#db)(V=^J8XQ|CEGVvdx6lvIxY``-IyC1xw3|@Nf>_&P|2UN%$BaR?gDK6(SzyC@XV;rc`?Cj? zu%qWMAH7ERrp+;@)!|_=S27+sXjdWMJjGy$mp%t(3LQa3GQPdHr@HfF`>)0T*ooVG zhi}R-#CHjY%{H&RQX+?ieLK#Iqu>cOMCuDF6`TwzUnFWKdNP%kE=5g-3g}FI=Whkk zK1bp`>Tv&ilz=^%=0+-le9^uX4B!(Akm)-0FA8FVcVinr;1t&Hjhi!Vo#J_p#JBF~ z+*ok_D4|QM<`&r*GjUBe#VesiPTs`Bb`tj1)^V7=^Oxaec zgDlgcAx$zvxS@qTts|$yK)K{4#!sVE)819sLXAv-?`Sy7tx%{(*zAavzsv zq*Q*JmKsjrhaVkIT5VcU{b^p)Pb{u<>|Tw zS7XmF;%G7j5*O?)QrFOx;+b+WD$1xKq2Oms;bpGPj=$ML+kmH=Y@s8r%@)94fG)W< zp>EGY>Lo%9*5J_??wor(bgHczd!=q~wbn_VM0kJy*xuo+I@y7^)k!aFrZcp4qFPh7e$2G@X<#?K^si^<>VNv(qK@@CyfL>ifV8HCm|dbSLsd~A zGlSkSEw^^}I*e8f6b^#y_QUM&2ftVl<%*&pGb|tPt%n0|M65z&w`0fw@7=-q0lUx4 z)xo*4X4pd|Rrr}TN99%GAwRz?$5oQV87hHHOz7}xWf75M9`+1;)qNI*eoi*ZD*5Ku zw)!s7kKOjsKTpfzSIHha7s)sVNE9~doNS3hij5?epHg1Xocw4Rg{R618U6yi z^!R!B($FsfPpkzOMY}hYf7)j8f>l)Psjv$j4MVa-!m-_V{VdOQi2_ADy{6zw3Sos} zi<{BJAb*ldICdg0;e4^;$OV8L5z70|qy?6%3FCXn=|&(o9{NygFHF=EJoy4$E7TfH zkt9c6?}Tq7DhD{wg36^fA@Z|i7mS64T8DeZ#b-|46x%Qtm6^2q(O)->@=n-M;(O2` zA@2Y28#iQ5!hsDjQ$QLb$(!SYO6r|t!Y7Jlx_|S;vwP(qeIQd9`pGCOTuDUIJ?RX= z$;?oC4pkbBv^P4{3o7Po{%I5lLWo)EMQnu00&9IEgaD;*?;fqn8#FJ>-{8@_5`l+7!x^H%LkX2#fcPa0E%>f{rz~- z@N$eSgzFW6uifgZ(o*3f-;Mz6?RA|I_f*+Z zF_TqF+2+uV2i?kBSXC18G`FGig{f7-g`)<}cSsNk5-fRPnUQ_u=Lb z!uR<%ieD#pd4BY>ao6^K-^VmcME5EF{OawGP(ftF66|4QT@3EBW|e8RM~1I5%eB?Qc(M0*|})3Vw=j7kF=P zcH?#KA^O)7KA%Dvb$*YRR3_bVC_ZjdcW8CX*I!|y`(^K&Wu3S8-+MO~A8Fu4%iOU$ zxHYQCJRLosFPrB$_Uc%2UqhGNdMgpM7N0yxc>H{{{B*rOw_k&Giv(TK(Yzy`O>HsGeS6Ux32*B-}&S6H)bsa5t`=gT$E)Pl$g zzTtoKIjd?EW%ZP^t)Km}y(MY$GXu)6q9UEI`qK@#F&AY!tz?TF!abmajn|coxg>B; za7Bih-5B|Ehe#aSoWP4>HK?y7AH)sq@AfU$7)&}tnQR`jBQOagho>fq=a+=%m z&7<;Q+gL>w=bA}70!xJ=i8Y2gwH?4~_1v*!kxId?CNiUTrY8rCFOz<5Gk-6WYBWHU?DX(Ui|3JrIn9^ zH>4ym#Bu*bXh2IC!etsx6%b=!z{Q5ycCZMK6{ewFhuC55m93sfx<%$HVBe^PJedQN zV9<|-(vSAkkG9m`N_Z>9*B?p(9+=ta(U9m;c@~RmYAR`JqD#neF9r#UwZM{4nFf4R z7u58_K}G86K{hoV{a5X!d~$>DnRt~_Y%geEi_-o@{__KNvBc;ii?>`MD znJ(e$?8^%!bMPBWxo<@nHQ@79nVn9fMuLe6C?sb~w-x4l=%X@TMDzS)#9!Hqp3v;T zci*y0oe7S<8*Pgg82K&GfmeZpV0|NTB&!=Iu!6**_eJ^qR9*!aNaNfowD$r2WA!6B zN5cW>C*l&Cq(@h`*J`U0q*SbMVu`A?J+lnNp`_%Ra3Kw{42<~J{$2^>=%R#Un+~FBT);O#T`Qq$7xU{tCJu#?P;>2=lPDPM8D%Kl1s?IY zzd@mnDuLyyB-Hfbqbh=b!m-&3+hGQj4+DuT288h!AEYHIRM7l>mWB%K)4T}!>8+o= zl$2PiY^6G2Guc9Ieobm#KiNQ-W)qfE&-@>hy#-WUO|v$NOK^9W!GgO(@W7zK-AQnF zcekJe1PSgCG`I(McZcBa|L~r3zH`2F?_K}8t7^}l{gmvg?&@Z-=x**iI`(%Xv~b{s z*gn-{rv=C=TEE&#+;UlEvKW6z?*1y97(9!im*=i%*%^%9izKtv%`p_0G;}y< z@X$w-bvt=f9lPGD(^Xjg!F7S{@}ORmJ|#$3NDmRZNvnMXv!ds^^>D6GKZA%`GW-`= zr|oC9w+l?mSJZ89oE*yH5pJ>e45jwcCVZb@d{PJG8{FK!WXJ~Y0Tl;G{%G=H)-BD3 zSxxf~r*J;v`y@C5k)vPtD$@!f@I&={(%nEK0`lsUA{v(`sPx|fgGbF)m1`4tPk6wL!4LPX7a&egEr*t2l*nlYehP841P zxhxu;wZ@H3zPA?46n!0gJ&j?0dpNk;@O3DFjOLCS2jjx2fYhWTLZLi@^*I9ptCrUI z{;gHXhw?XVH?p5XFwKg!2hTD(584}v&rL*i=E?c0_4)6b-2E7Z&fgd32I}f$2yt@+ z=JmEeT^sW#{pW8K0*@bIjMcEaJxqGWi8B2?wjHdYWpTpqNvIu`EW;@O<|6hNYX)ES zhvx8bLtgc7FTf=-;5u-K-fIcqs_uNg)2!Fb`dBf>Et(~*63``DFHc@tS{Gtui4{x{ zfR7WRl=ZRdT{uvKLj8rDq0A{m>90oC$K0_L4GW?lWB=jq`z)UVQ{iChX^kaQ4N9-3 zFSsp|mf;fn$4fu>aD-3>;NwNO|9AVub9NP%Pg!->7<}hWS%fpT?&L-{DQZNaRuE)h zbjfg+PvB6#kg*1{xH8$YYY$_e90&nnZ^60DX6no5x!h`-f`b5 zGMNO4Hlw37uIfUB5WG^wC#USzk_!Ur`hGqa+>RYpjfj(Xe2-}f&QUq$VR_WZpq~G! zir|);`D0D%q!dEb*^avTNI-#`-t&9|{BU`&p^S!S!OgA`@AQTZK2UkPyl29G@@tc2 zh>(=Uf{3zZlOYYNN}E?zNB0D4jhz3U=MNYB?x@AJ&`x=K6-h*_8l2t*{|fT{FR z%8bVwc->|r>&`zYCPgidK?fWRb<_+JoW}^M#qo@F*Z>SMB7%JT-Ow6HMxN-bqdzFa zC)Ec+QbO=p`D@m^Y=pnIJ7t$+p#fH|#Mb>a+nv8`@$8M3VRh$8;HTs$jIa}}2LiB+ z!I$qqKoa69Z~RBlb#Zxdg7_#{A@&djzdLimfqdn>481#?n z2tSbUA&Flz8;+nit?&lqTg$iX&KgC#iRziVP_&`g7(Q$w{MeR;(Cb9l;Dx(Zg{AZj zkOFZpV{=2k~(iRRuSxh_#}C_&90uI~9w-OF_!Dm3Xa@r6 zEB?NOB4rHM?>`}pb*Z-?eE^WqkHA8nA33!6-@ouH@ZOe90n`2`O#1yhzk*=lV0y88 z0o-*K3<}uInt!`Ly``NPidY%y!KeQiB^JM674zH~w@PWBSzb>SuXj43Z*XU>)JP`6 z;-9#r!Fz|@lBXkD%@DIKR%$#LE)rx>|HG3#)p&P|;Pw<|E77PRQv0QLIvafAmfpU3 zwpLoMMX2*nY3=p4V7$vVlpgx8AQyaoW^EF@it2#_eUsem$f~Q6M1s|H@ z{aep9W2)+v{%WP6&OL}Vg=w_h_lj5)L!Bt0?(vsRXZb6FExLiOY0-B34Z4;5IV4ok zA6PQ-dDS%$>G%=N58ml=*D&*}q}d>C#FsNH?{vcT)z$5jhfnADL{vwz;%(v7G`wsy zGaIL8%49-}%Os~L2ys0n*5a;J->OhsZ*Px8e}|7nXXG^Q!+PqSDiqJ}0!K%euY^KZ zRO8c^+yw@|(&k_lI1QlwRGx)jUWNNp&qL{XAktupBoz1%83n)JIj|P!;8Y0k$3y!t zsHqg4PH57+hNrlUPlPl=cfpcXDJCeyzs5rLi=CSmpItS`yIKI!zzeB=9-7zn!`=ct zRBTqDplj%xx@n!4ZgQr&2oEhHv4S%^M)p{`Fe};t^p(G`Jq#5T9vG7X>M zFFXNr9YBTuklvbFUjPFr1hu9%dqp^1t+Y+p#$w{-d9gvRMj;;PkF2!8Jb0Yy@12?v zu0|QP;9*U)rTL$l!9e#+AL=trw=MXe_Q5%`@USXj9v?P)$$plzH~!P?1@_C!Gro#+ zvPb7Y(Sk=b@vdkFV`A-emk16`e+nF$SB?CgG4wyeXhU`f{?*|ty&92~Ry5t0;mE5S z7L&0>+k2D|RFZXpqwCPvxtpu$6TWRrJKPN`JCco~%~Y&RAEUqRK2CZjpZ-=3Z;|*4 znWvbHFj=sA#SX6;UE#x+*?f{RHIob7KG%@+AX{2B*)g{ZY%8CyP=D~JK!GmN2=WRf z{R(z`jt_Nj&&-N62^%x91MB_QDbf+8)K$#uZ%qlvEN7iC09PyeeV$-W2g|>lM zX?!6inOiXCQbr5_j~VT%u)f>scGs%;p83>QG^WU^9ASMQ-?oJ{{(75-udm$3!>L1I zzjmWm%)j`woQ+Qs&Gbil2WbpaGL_y9W~M=Ll5hv4de}C(?GQgZqq{%bRXHX4pk>EyZJ2y#(G( zlF6p|72)Tk0=~EfYo2YpVFCpwtyqh*x6VV^wJ<0fMT@1zoL}=M8C3Cb8?0)I1#|n5jZuAk0xxwgc|RNBpbRK65-)}^keD5FfExRR zw;!1ubH8BgWGK=Qksu-n6Bk!Gx)Fm?Ir7-YE$Qt}10lY+MOxNoAI$;!JpqZ|g}8GF?3*R^g2LZ&wv6 zO?g?+_sDtRSC}CB2rAW!CE1vG6S=*e`j%vZLTXf{zHb1oZcJ6o{o<`(Ngp=3gQ?~0 z!5B{02X;)CCNLJc0dDy|Uh9W#d{}l&96sxkZTy-Y^hju(IbJCy-r%)^LS%I!acgG| zxX&oLoGpl-4v?j0M)8=~gZrsvQk%4WJ|`dPG^qHwJzN~8_Lboo=)!G3AOv!4$vg5*vYrBc9a?$&XBy)Flb@}dL%qHi>i zJ&?&t6P|_ru#dyE?`Oriu^>)(Z}{?TcUgxBhJSB}A`|2QRJ^8rtEcJ1uBzG^% zJWtxECI?q3DFPx*yJJ6h$Ixt>ovfO#f^<%GwNIZnQUp@}O=Q-51q~Kyoj!M_2xx#s z)w^RBRFLk5!&&16^$=!kIJhN@qU!QrBqKjeV5`a|L_)#zsVl;41blQ8PSS=dD1fH9 zs9SMJw;U%)-FSh?)IW>7EqG)iGFhH;6OqnuEINzD+H5Vu=yeMV&DFw?NW`F)S)|$? zz?YMXr-J@eriuZRm{1`5sZkY!cL;&q%+S)EAuzxcW=Q3hz=JKDL1Lp7`qMNP080`f zy76z|B_%PV_{MMOPs>;UDoKR$#=n!7l*yM+Gkxda^|k)kct1YY28~21$ssA>T9h)W zX!=(UqVlkae`NHZQ2SC)455%f;w~Kg^E#5|A~J<*sVP~%hFX8JR*EQfiZP{^QG3pE zTg9_4(Oq(w&_-9TN)xlnQY$~^^C8aXEu4?v>K!~v(E~KiYI1Lt zlve`inD7MFV`#2Ws@3Dez;amXD1Fys^P&yXuQ_R00lJyFD$L~v?!r;@b8gyU8u6Ho zP{ON;;owjTC=hv(4l@p6D7t;%jBT^7B|cOqBKz;%#9SkL|0HV99{F`vWC+0EUCQUM zj7>EYQr8D1EP2iyqf~URF3nG*t^~?h(eIC#T#)hPKScYXV6Nc@<7yruE+Cgon1n<< z{LeLyV?(J+O^^^d;bnmEk=ws|(+cPD93zy`@;*l&vdkK^l#xB$O)s~Sy=q%LPdcV! zXp;HJtFGg1%1=A`)~JSZfAU8jVh)gj?_&OwPzb|MeHSN0AC`fMkg%e6T@cMlqeR(U zeO-XeMH5fi{QJBBnUiLMa(if-lNx+$=9q{lvBdDdp3Q@u%nJ#_{b+0OvZ5Ycjt1*O zErn{Tq@qxpLIv+gS3;|WlnAYrtd>+xGZY{gSt{F~wU~ajl-Rg3bx`_w%~2q~jM-zjBD%6=$4var z#5pk`Jl2S-?7 zL(d?pDo-QH@BtlLN66zM#Lw+F&5s#OavBo4h}7-u?^E{Uaz~AR-c2trdz(8qnPHi& z8g{;GXL=F=F8kBhRen#IXX)MqlhJK4GNf-XiW|@P`Q9Yp$2b}Fl4tx+LkO5Z1se_q z@MWYD8L3pI00d$!$pfd)`0$Asrt(_5SH^;?G2v_S)Mzmt7(iF7yi}~A4+VIe?mQHp zA_=;eUKp`pPy>6YuO2Tq8Se+PWBQRKT_3Dv)S*PeAE@9y=WH1*$Wmi|h5ABE(P=G8 zSl9zu_#_G5^OO0}@T22(TZX(GJ5v4EDewG;y<4wYqR_8YFD8%nZ^x-QGqm21vRtP- zS$;Z5WOmG5VIps@yT_S_{gN6fZoCA+Vk+~Q>o2dj8p7mDuZ9Mt!73p^76lnbr3VBh zdud-Uqt)mOJ;$2(^VKlo7&{&sJ0%1QpTpVZd$)(;EF&V^nI15*RP!j}^3mMC_MhO| zq}csDf=*xJ9xsR+1krZ{sxrX?3Dk@66hzXy}+u7^dYVn1$a(Z#Tk9ny`%zx&A zMNCBe(MHH+?rL$CdFF&}^y~d#WkxrJI=t3N?Kl1oc?oXI{vXzc_Xt%PMn2yM)+_cB zZ>k*p=b4AcG@=aknA(?NpEwcXmv$FFbYrN%%YLdOR#Hg2cr0ZKapns0CrfrYd#SR5 zWuq*hk~w0M4GVTgkVO%4O^^)cG%j#G>@Y?^v>X&YarFC`0>f$e!*!@bT@LC9zgTas zO2h52uU# z_}n~h9D=Otr9ye;p`_?c zKwpsP#`t~wXh4EEtp&xyU7Fx-mrvN5T~#@5h<9bg!RDEsVosxn7!Ymo|nTXtE2GaJ}=Ja9`^(zLv#A8B7pfE_GE$KA0;ZMGz!iL ze+`kTsSe7L`R3y$Wu+#x`Pd|hWqMIF7$J@ElJuB6N#O%;=A{8%*AHpHTMMmN55?P> zXo!hHJHbWi#Dx0GW#DbDDa`0|Ly}Np_>asEK$2c%4HI%)bHp9b`!v+~&s|6N)ChKk z{0?^AP4fJf#26cqqDN7x)DCssNr9WEjYKRvnfp@JWz;5*CCYkqaMZnV3#qTu<=$&* zsRvo=blj$_(X@jL!JdY|@=>-_Km&g(ZoDzScrjHZKbr&z)sIwa~t1@UKl- z_>fxb-=w;s3^2}2U>*&o7>$$Rj6rb7L0nQ-4EH%Y&KYcfUDy9$nA~~6CrRxg& zJiT4DUf_gA&~H0R_5BL>Fr!^VI$iM>K-_;dy}R+*wX5;S%l?u~NJXdoMTEJnr^p8% zJ@x~7!M`g|C~%N;j!m=LYPAddYP3$QOpvI4tWGRSaQRIk2D}&V&Exh>@X0URCe zzu|H;yYnR7kIorZs-4raDd$up`Pn5T%}%jXn^A^C>5trH9R@y|hDS17(pL@=r68-S zB`7*b3bRU>b@#apqkk{K#jQZ)EW?VzF^a;0jQX|EV=Vc?f`^O5S%m8jBmlm_W~d?w z79khCL5-HcW~+uy`vq8UK(%(Z%fC@%zkXtUsq-oHdn?nF+?#kFCk8@<=4Mbprx`&n zq$-hYDv<;z>78PgN-H62QYyCfW-m>=vLqDg8!OsazNK2evRqvA%)HS|y_u0+`$b&) zEyBMT+@v5QG))ik?-g^E(!}z?40rExC{3K1I;H%i%e!kk3I;j3{{`>--1zf}h_g z>|W3YCrjG!ld9ve>buwpsI-s$3ouFV20T6pCMvRs;-2K=4-7&=ava9HPRW$oClC|L zFBXabYB^WtW6go;%*qY~q1MwAbh0OPYzebI2euUaBgU%8$4ZeH*MYTov)R9F(fvXu z+tGGf6>z@m;;Mk*kXsFs*FU_qeC3p%x!Ej$jmJ<8Nw<}^m>PP=4tcKb_WfU9L zy#=bT0BJ*;aU*n)8$L|`@a5>k+e4$%t@T*Z<~3y24GZTs33AY@PG3b=GC7dP=!9<;pb zwp$HjASp$IG0|^aewB=^ z&r{T+RQ}JVGrocw2zQwM%tHtTG!NZ%p3x+U7zb5}>ZJpNvQj@%mpCHv%U=7 z0x$wzix-JP6T(GVX8yixf$wOtJtrzYzoJYn}Z69 zH4l;~C4C2~zs=nnCtuDSHAAG86$qnz5m@P7m(E8CA4xywj{V6PadCrvFND$`6FZwUQZats0)C($OcWNqs*D)Sm z@kAKCL=4O0=SsGIOIGBmqHz|4Lu}BNR_qC50FfRzt|8^$=eg@ zZf_>1hWDpX$#;a%jc@^zHtx zr^{88c-!bp+hZ!8#3-H4wqHbKRbpz_2Ij+yz0zym0||tO*h~`Yw*nUB3&{g^eBFR{ zvRJ~7hl=*!S{!s@Iq#Sb6bev|*XuKAzfU?{Dyxmw?{$)jf9bxp>h z3G8&7wdIycPU*cAcp+}vbJgmAmf`Ii%V)$}G1B|riDWxuB;J?%a(!h{tK0z{q)*)g^0+d`q0Zuo50QQ&D2332Q6X+w`| z)v89nMK*=+oNRiaeA>Ku`RFq@(o%Gzmh_7pz9Y@kYP8+Ymsn!PtfYM-9HRp*&8xU| z;Yt>rt<~LH7l)gROGl4cxs^h44PcI(V%&awKo^Sn(x{=UC0 zarv2yhzokk!TEfdRxO5M8idyHOP;}q2wqdngqw36Nm7!7nyB0!8h*8tu_<777!C>O znd#VzvO>sXKY{W)km$%f2-bEZoT!P*76EoIRH?W%*Zi|lR~hb=aqe!sq?U1*lA$X? zNDIl)UJ$J7U}VVLCtR}#GTsAt{Vp^vov2(`-;H>(CL!OAA7t*ZA~U1#NY9-VBKBU- z=>5jHlb(Y;N&-6yl1zA0gR)kAS^%U5acna&dJ44KZUjF1kHLb-H)2`H)tyk1TI2+V zA<(>g5S0fI>TJ+yu){co#0e0MQc%Q65E{v%H`rh;;u?s?eyC*tk`*UeqDM6z5^Ycl z26dfbMYr$bGo{53J4!C(9*!98%Bt_0NBO=9B8qvZPE=o_!pKBF?Gh$GC9=2rh9&FwtF zi2Qn6{GAv#jS9P%Pu%D`UsE8TyQEV!;gC_EIN}2F3bT_vtkZeq-akq~J$oDK=_b7V zieXL+A1~=Ptf>?b9m=Ki#cqOm;{b}&Lw_k1dXs9sc@YYxb2Z**0^A^m8Du4$nWs|Y z`j|eCsT?g&c0Qquw$ALSUzOA>Gw)(JW0k5Mv{O7=xVi&Svcy@2p*yT=r@tG(}p~iQP z_-z3(_p)K(QV&~50r;@jzlTdFyAH`*^f<#I~Qw8`5FJuAPDLcNSa|!*Z-yURt z>&=fhE=LfBo{{KHyt z>|+u?G>zCrM}^*-%_iZ&gWmWnTJ-c=X~gMdI8N(;03*l3x_o0trU<*^t1Fn)1D#)m zD?5A^*4u6Uc;0T@#@63SE`Dr%;KmK&NnqmSY_Fr3-$RI~u%O!vS!J2_qpy_Q^WP2u zklMW;PZQlf7WjO2ubkBF2q*t4J7ktR_7WSy3DB>fgF7EZS4SnWoke)M)`%N;=B@4a z%saT;mv7o#n%_S}Th{IzURDEMRwqyFc%Dw4Po872`2CK>1nK?UjQreOo|Z>_1^fj3 zwu8skJ<%2atW*3wQ)=w6Nqcz@9UQ#>Kf!xdcX(yI*mNC>gF3Rn^qoAbBkuT2`0p7w zr`89%eK3J09(2&QWFIm&ms!$JUsBsMA>H8I;06%0x^Bp`Q@UzU(zFUrQPSEoq1?a( z#yj8f&I^(>`8(W^PK7{$Ab}uoARFL7hBxj>jT3p_xsgukdqjy>x&ZD};twm;1T!(hTJ z;JCND9kXq;qC@Den&KfJh`6GXl&SuTf(cb3wxSM8DGHk(CMxD zYgp+&9qlo6VfJw%H-s_6B<+1E>&~Qdjk9ED ztMKmNiAUMB*OTuRj!7$QZ4L;>>5fU{q$Rhc!2&?2~BtGJ(jhL?u39|t2Q5c4Y&VvJdF zKjI881t(CPOFTz5c)UOOJOo=A&jt(MA?%?@g zZ4_t1ZcA|=xFzIG_FP(Mq0s6yrLX|FPxqgT+eFzexrx&2q`FT@@_xl6Zlp%BjK90po%d2Y|ZVi_D>7I@?*nk3PHe}WA!$A zDAqC0f-OR01Q*d?uHe~v2STQVYJ4WPIm7A>^xLfsW*e#~cq)Oiv>9W!3AQGgeDyZ) zk{(IP`lK&H2Y@mq0j=+?naEsUmG!g(-u68ocNRa9*9a#zD}TGGhKkX?L5!2Cpif!I z;EON=UYY|trd8OaM=+d>(^RWR=zphA_c^DeQSJT4cJk~8u?>T2c$`|&0GLj_pj2bv zcp8UMI){TfP$ipcFPyJnP>ij}G+ot`L)s%2Y!puk-v^=}29@wQCGUsx8KcrWDvhMq zjHG+~w?Z%IDzdeF$Ya;bC~4-5G4n^^_{hhc;!O^xR>0TWk(HweLLrVuk33p1oL$_- z;p7GQdOEVQ6hSEPmeeqI6`3h1ROMZythzp+oZz5ozRzk(lCmg(oE~Q8iuUQ&DE*}; zK0wnPp3RgZW$_bodbpV@#wTuLp^Jo`lhugF+u0WNYfm4a=EZdf@23R|)b&II1A~`4 z!2B^9&v9H1aBbCExUG4qyraD8?L0BHsFn>>{cG&YEAcST z*|F0+k4CHX>vE>^GqaC~{pHs>AKzxahX*>pM{_2TvlUzAAg8yYv#-7$N4tu%^0`X7 z3(&T1YEDyLE@}X1@{=Q2z3T;l`?O@7ourN4H7_R_@rYy`5rb1^en!$-R6ajJAx1}^ zo%(jk{i=S!{p!b#<~HR~*|T5DS;({z>svf!7i!P8EGo~ZDeEh9#d`&JQ^mm0-%FQI zHF~1K^A>4}0*PC96uoB_7Q7Pfu7NqPdh7JL%<*fp>$_R%!R?Z1zeE3^FKZeS|N0g` zD*}1_Z7nCyciiX4U2x%DZ~9tR^zg5rJQ6%teA13OvyFJIUwpj6)o#FXe9l<^$%Dyw( z2ce<|A-6rZ+~`Yf+}?6*Sr4#RMYG$oy@UNm7b2DNfMz zNZ4}K=lt-YIAOsvVX3@rVZB=pOYKj2NBFYeBptq3OfOtCXXH$iC?=k!QNc^rXhJ6+ zF202?W4*l9caQX`4lDnjg2luQEJ#TVp=GymlAg>jPomtcMLui7IP9`lZ`6jWs-nG;GQ(KdO8s zs{HlQug0cnso{CIq04jG5pM;K(RNtRk*K`+quZoS^-;r$Sz}iVSg;1iXg93qNmSnU z(e1*f`mteUx3TLHEZA6I5NKR23?N5dr@BD(f&P6=9F9#v^X;!h0re#u`pOS+22lx^ z?>$#_u~vCdH_w?u3lcpz3WX;IXZP!it1Kpx>KjKL^j#Jae~=13tiyXU^-3le>1FFj z;B{UYOa@$a1oFQ!E(yQnqt5+M{pD}rcf9*~OSj^K)q|nJIMSBksKh<5CeZ|DmXP$1 zY$|UrV57#{U%q!T5|qx%rt^$mXh_7{Dn2;}M5TqBTXVFtR%{3q3V7i$p9eXK{;7a0}h0+R~*M)~m z46&o+`{RVX;IiPt{g+?Qi3DF3w>^D_uI+B|KcFnftlCcP{?w55!i&6Rz3rjUl#0eW z>P)SMwLgj0ri-3LpKBw`q_s5@QJ8e>3}m^htlL~@W}9kv8@{Ve|4GqNS3zOavDJ{} zDzk3>LNi-jyUYDuEeR}8Q$bcv)j!V9MlzIt8UFq&Pwv~Sqm7NP2wxY()#r)B5Rjh#5Y54gIPhcV2&S_!#XgRq zwnO?CnSg6&aU^8^^mr#k*6;3Vvf=zs_bxcfJ});*bdT;nPQNOsZmV7|wrcP@IFQ|5 z#jp1Io>o)Ocv??xANRHlde~m=>z*!d8uZCTN;?E!o7^$m%}Fw#hIHTf3cAHsFQjJXK*6yp^ZG zKIK(Bu8Xa2X4*S+i-W2$Q(K~vaJLG+H)Xdr&4}xMrKvn)uC$=2w4kxwV6L>IsI;T8 zJz%yqq_8!lIjw1J$_;7C{oaH@acUT`vnPLpfG%XUmR4eNppgEFu7N9wTA37gt3iZg zsJ6C-wHRszDF_<^7q}i!CPf1c$JYb@&Tv%&LBGkq_ZdsZ)glIlE%xSZ6aQ2#U*=^= zDYZ%~yE{})nV|z*)2$bssqh?@trgwSoLVO9V3xWxySM(hs*Vj(tw9Z|WBYwvAbaLO zNnGntGxd{FvyvYnx7oBwftQMM`kQtMVqkLUa?EruNkM{u%CH+0hpdXjh8a`ikbm`@t;CIaJwntMJdHA=54< zHzsTFrDW`6kOL0#gTMXfcsz{ieh(peyG%#b&iNkI&Sl5zFm%SsG4$s;I^-ex5Kcoqw!?PXNoX=8Gy)1r95_Ucq|NIo|VTUJ1z~Xj&qIa&t)ztL9+Tui|~ce_Rx?! zFIyp^f&mNCk{E8b*t|f73tBBS-{5xMN~~1EmeNrRT3#?_J~5@lJRC?Mzb}7WgrrwW zo7*VXxfG!5nr0F55nJRO;h1PlSjR+}RF(_E zM|O}~>0&8}<+HdM4z&Ea&)rSBS4Bj*&ty)Ps8Y=&Lu96fR@wYI_5SUyxY#wry zn6huQ<={lFH*uREpidO0wBX)Nw%JTdcO1B|{n4KxTo)8`K+&$T4w~R8x>3HQu6A|) z+$BFvp9VRKhnj2o;Wqzo9q&)WLL9b>UzvgF*;tSK@quV$5LR>$K;Q-l)XCTEdzW>t zi_QRP?+CTO12Z;+(sIUS!7+#c05I|L8Fhi5{Wv%PVJC^rG!%nFhyp<1f`envd1ViX z*vYZsF)hhymBI+f9IlcfYyupUqjz$wgi23xN^s)_fgt$!j0WCqZ1E54!}*$Hz6nFc zZl}eg0|4b<=Y2yldF8*-lc;VIhTLm~_jZ08sO;@{e=`M+DV7X_KxYmXKxTiny&a%t zPV;=m;L<>75|%n>g>DKEoR(w)L`@k2fkFg%;GuZ=0-WCCr`?P@*F{TCPr8DjpQK0l zubdR}-kX8k$&pkAeQSrhb4V7Hl*9|*IcdkrMiQri1Om4}pkBUatGl*6YdC_`P`kAD?yV$VWsmAaKdSaVj=RbyF{lk8f|s`i2d#-}0#&q>KKO)2AN<`VNj= z7nU8cPkCm|%ZKRruAJlw0!2D&_kvdXx&Enrnee0}br7h2Yv+>go6X*ijE^aMc6l5h z-&txhAKyA5IC9k^un(`5^duzm?|jWza~7w+Xlrk4z(L^vQl%e*(VZMehPv3(lj`F4 z_e3E80EhSRbxB_l#&1Ny;iAQ3W(EES+zkTVqmjCUTPX}Xn70{wV@Cy)^w|gqJg4Hz zr%(ms~iWmQ<(m2Lvh;1%o?TD1g*JknY!kp`YMP;}d{UX-UgX zdsG{|v51HcjwRqMmh2rn7FttRxQ)pXdNgXKyiGGTxoaDscc9we2=esQ#WWPatAOtB zaFx)Pr+3b=9vjT5QGm=Nc(~h#-n`A52J}E%XDQH1S_L!E_PS+zhgPC*D2q2|_b%hl z;(&vr+rZH3pF9JE%^iD3M|ltkgXIne6SSh|=IFLKw91X|8IeTfpS*>M{U6xskPYiO zCV=M$3=Kd72B6{m&I2-IX2GQhz{-Pnwhi(CrD~b>4dL{>^T#yjbUh0Y=r)B(BRDUK zG5ej5uX6Z#`9PpdG(f7)r@*AlM9w)2UOq;8ATtpYp37Z1^i{61i(YV06gt|VCtAx z8xxLAVoXVTYCpgee}5@47Qmu+SSaAX!f))F_zYTsD8Nqrv9S|*`p(?=?%=$Y0uz(U z0+Y&G-r0nDpI!V5EI`BMog2FZ$A+0|w{}W5-x*iFWu%e=2=w}#!YDpD^kw{=h4w^T z>>YXec*uavPoXdX9vZ9iaeGH~6_74BIglCaj2&1R39R&d=hK>l1_Z#}_X_FFh$JSN zp`kCs?_5D38_;zqJFG{9|V)V`C@dbSLBQ4yu$RGnJZx zy`zGgqk^mB0NfQXOWj~((znp0Z!Jjz|0_|h@gc6^A(DaTB2*wMV1KV?$ZS1+W2cZh z=7s<~!$l?y!}SiCZRzz7aZL{WmvY`RC1^#XfiwgFtR<%b%rgPzi2-iq|Nl~T0<9?H zy@(?K!jh6qwsxZ3n*rb#zvuAYd;eXvy3<);UV(#Vad3o|Q*w0Fvv&j+H<+V$bft=0 zHg;N0-1^+`?CrGdzVlpkLDx{oL$|SD78-!(nGrmzkA)`@)y;yx=(~Ydf{S^ZvG(hp z^;P+vc!8BVz|;Si?wrrkod+lM={=!%72UwVq~n%%UN+pI0osZpegK|sKb;v=jce@X zbmSR7KcyPWzP|YDrV$|@dcWqwdYzN9c#pev`1OAi`;9x0dAGK8V}Y_Y%d4M-Uj=g^ zM_eTz?S{6sy6t`!aS=hC`*eAg+%~3if=e>Aq&C!8c2C@S zYpt27r?)Xr0!0`uzpSWKx4{2K_rj7Y-F>+cP z$R{*L&BO8F@I6gR;2E@WRrq7PaG~nT`X`yI=2|rc-|Wwn<~==9G`m?yy{}x9av@W4 za}N6e9o5Wm>ukTG75SfJx4q%#cmkO8%Q0`~6+%INTNF}~M!2|GqE1!bQ%K8Zc=mB2 z^vu&B&8CZQBnmt-veP7SiG>2BGzxA^G8tfP1+aFZPLT98$_Bl>8%oBhwt369lEbm) zsgLsf3OrzPbC%0E)r{v{B^3OZ0oZ-oDTZZ>H2bs=W~ObWGg1<8S^-QXSzzzD)c^8Y z(UpG)caB}?C72~%xZEcz--wi&Zae(l)@aJA<(=|XrW%ZPDe#3_$M4LjvZ=)-n0PDtRQ7b=3@$mE0tvfJ(cW#iO)97Okw^E%Ft3#l|(21 zm71_tl}g-Dmg00z#z0x?8V+CPh8YTvN*WAD!ux~Jiov;@oIw39BQ=unrx10HsvFcTn6!o}@;z2+ZmT?CS zMQzq`cYg^cW7F$P7qS(CU%l$&ySHPE9d>*%=O*d6Rs-1(t2;Do+V}AxY#*(+{js?w zr)iuV$lu|9bWdK9B11~FX@`sZ*Cp&<#JXB}7bM>pm6T?S$IP+1`eJuw)ncLoZr1#Q z!&qr>k0T}i)5Gt5@!rhP?jNRCnPf#Eu& z?{x@8qn6b~PSX}WP_J{Vefr_4!%v+w=L}mgogO4}uGWxS{nK;*St2~|QQ69RLb;#P zA~&um)DJp1rR$_Q@Y{k3Y~Z|7Lw?xA<^Hdd1sm9}*a{IktT4-OH0go$@0$BRj_{K3 zfC*fH{NMuom-4^rdvhB=T6aRpnsWkW6xH??wM6>m6ZQ$2#chenb-`SSf3r)1r6XC5 zAEtTw3)U0hR&kPkQKT=>^sS)F(4bq?BF0{|qEvOq+S}gYP5w}sgU(kC zjK`fNK`U2_ZO^?SJFGynrU(fq!G$-{uj;cE1g_)9SDCk?0(@CnYTI~Kf_!WJ0TFA# z+l#NC&kpq68{U=#T2eW;d+=rthYqZ_WbbK_hwo?!74EiY4w)lszeP{}ZeGuBuvmtb zka69*Yy*y{GA%1gF8Y43@Ji!d=5{mS_QTFTncueZxy<{8qBj8Hb6_y|aJp|6{PeKA zLgABPkY&&WpMrKm%J;a@{=)Tke*g92rb{SQ+-V$EPej?3^fe`ztj$38wMko7ccd!T zmhI|PMBq)>uU@WtSSrCx(qaMO_}9RELJkYbP-uLoZT@9-F~5PaUs z^H365g-Kj(ejHwu+bP+~>*{i?)AKhE@ts)9ht)lrl~+tu3mAJT7>jHBW(a1yu3b-F zM*liW-m)-882b=}%88!uP)#Z@8b_P_P))H2mHA=EA2wPjn@;uYl}l?R%WC>c9eA+R zO&E*&xvL59#IL@=&Mv^IZ?}_<8N}FVay4}En}dWw}_RNXC zuUZ$x`uU2y@%lB{;KZKspjjIf9>X_N#k9`DehH@KmdCJ8+v0(jz{!n3QH5Ea?b(Im zO{WaDvT_nt!^l_=l|-1H+Vd}_6V|Ct0*c)kkLRYf*A4hF;dv<3^YEoiI6<|mr$Dl_9%g{t3Fc?v@8%gjhOH3eA zVSJ!ciKGlv!H-bGPf$Zt{_OpS%Cdu@TeRt2vLecEIr}vgl)*gQpE+_XEE|a}>Aql$G=oCxD{Sk}^ zlZ(LTnFq4MveV-rpp(n{$*a6vs2U%csFb3S3#Z+tB`=xCturFZo6uxEaD~L7;}6R5 zpM5KjLr)u$<3Il9NJhb$^4)oC-W|R!eyBW|--I2EfWAAoH=c1M__il+Os}kIkx8uzg`sY)F|Jj{Bgi1hoBYo}W!?%}G;Tx94|HIsSKt-{9@1o?KbCR5M zlAvTHXB3bO0s;yWRFDi31VnNW5Xp#S$skFP3^IU7k|<$7G9zJN;MH)BzvH?0uK)VI zyVhIlt!8kls_Uy=-Cuuu?`rIpFxbm;C65uDT{{ax1P|7?Pv88wT4c+Nw;{CTxvFcts|RjmDr#w@pz@#!#cC+8{N_&vNd(Cm~Z;pXlJF& zXTQzVtMHV&n#Ypeji@r}o2ma+FQ6X9FHcjrwu#O!H#KADIxG3Dewe+$p>w7_J*-yd z?yLm*$V|QTGf?|!)}`FlPui-ru6}#<*@V}&tGTa{bgYO+)1>u{6|YM9mAzk96LU8* z8qE2MALH)U8|$x=RhyD(yv*H}n$uLA3&p(d9=`-$p4T?Hx z{5c`z;naCLby!?O@O;AjDQC2Pb{x)jL8$vL<6IxeCdyJGQP+fd3J$u@efqt0OQnju zLX49ZxM@_7J>r~cPp@2Z#xHGr|lkTI?QBNc1yMsmvyWM zIbIUi$&WtuKQCphAqX6|GyWmu`&}qV=Y~JMocL(=Yws3o`#!(<==Xv0{-`!ww0Nay z&`d@JS6_-dLf!H^vI?5K6i-RTvSpJp9QG2vmi6cr?4$*;Ue|FBdVuiuS{~t*+uAz5 z7W~-p-tu8t5}tj4zH$IeXCz;jm!xh$O=q}hvhsvhMQzlhx3aK?z)H*UdP{0E<@dnW zhqLi9H*mkXa~)97$OU~7l?wXuKq{#D!RhItSKi#c#~&$&w~a*`(%MCu-#fAWF4iGp z1!mg28nNkW3OZ-2*&{NmA7M^@4}yEDt7ZhgWrCW?LxyQ&l6$yv*%S19Wm2qH<$O#W zRnAwM^ky{B0>&zy&FRtiDl-H=;rT*MYEwI6Wnb0wT0A0xi-T0N*?`Tp_c2*wAkm(* zV5#*GHEmnuo^0__UDrF#el@hktSY}cX>#cf9Mnf&QD&93i5F3<&+$s$vPTKEpJ; z7gb2|-h(T*U?2#*U;`BN8Y9K@G#&e`@b042wZuW_3-4Dw+dgTP0r;y&}g8F@b27m;(NNOgm<8URvR#Nt#dWG z_SG`C2AaX6ugtSufeg1}^zaxHN}q&O47B$osKn6RONqP7tf$mnu~?hAlKA71iS<(B z{Y(8O#Hvps=WfElXJygNcJLIVX}%z#Yz6UfRAa+WW!?|Ubb|1@MA8%AURTh)hu_dZ z{n*g{EKurNI@yUSCWQwkZ$Z!tCIt@4Xt*(9UEGI5S8cgsA=X9dIq37T`28Fal#jJH zuR}b}<0IHnQSPpKql!&(?1I0~)4idA(DhVA1il)NY=O5z4A|0MZTiVAUNXb9O(2!| zeCotRceoOC4Y?95^tlAuIqpJz%IYr>Q2OT0xF?CF7wUpdnFlLe8iJPd}q)a-&4M*M7Iz?GdtI))s0Bwmfs^P{{9$!;r2!ZM&KAOntcCKhfw=s zWGnId%9Ef(lp0GnYZ20_NSU1Zz~^uA0x8(Uqka9NqJmXcP#>x&1d`;6JjsY8U>1Jv z;d*tH;k;}^a=zqFYrg<>^8;OPCu)r+7x`AOhN>z}z)rYa=% zWRrS(#jyvXax}OnSg|zd9zDD>yLTGdLL-llx!W`1d-Cgq(gLRnA9l>1FUJ#%wWzv{ z@xc2&=?Dopcdt(^IvXgDQee%UZDjK%P{!K9y7SrgjKE$78MJczZg1+$HiwhoG%Jb) zGZ%Q@9_qO2gqBowFwRmaYpxrO5;4Q%2O)9`U78mgu|*U=k}$a0DG_?klJ4gN`nqIc zhHh=z=o3%QZ6vOByoUzUy%2sI$FN?YDD~?;@v8}%ySifvZ!#ViuQHp5?O7%4RWV7c zCNd|}%WBFO&}syeY(B+2moCCZeyhXuU&KMbRh%}6Xj<(d$q?}M`Hmec%pB&6+ft~R zg@BRc*4*16A`Df>!!QtX9jB?=;${so9-7T{o;Cn)1(_KZSG8;I$)Zq5C~d3=i%?|8 zd|up81>yA9cEjSrth)AfaMtfK0a<;Q*@N1-pu?5InH=*`E`R$cM}cGuxq9VKho<=5 zX56RA-;{U;oCT7r-?)MnG*Im4s-@DD%dOL|CM^#)L>o2Z<{&|S+3zvqjwiOX)_4Vl zYeH|W&(D73cK=?Ukk{Rd#v10k8g|_f&%lhWko(zl6@(3-uWa5-v-1(cuj$v} z@Oca9aJZZsj$3c|e25@ScTH)R{R))&{m0?(Hj2U~2)@9)+x-99nx(L&mfC`Uw>b24aF)Fgs)IyNa=k@C7Z2odu%daa6`RTc{x3&weFC~7 ziHhAlNkUrD{`1?39GOO&86l}BwEj+ynp(_k7>U(b+)muTQoy?mp~T9$LKN^;>!dLUSyMf4LSLOx)MvfsdQCdR7257=1}nI$m&E?s z+~aM%;mb{NxZ$`CR{ddQ+xANRURILinmLJ}qAyHT$X0N}D_CbD9o! z#vj&X-&7tbY3o%ebf5c)p{!Y)$igwxAD_70@+cx%fkSzqC7uP~#Ea_Mt81`}7O<1i z8j?lr(iyUcUkFnoXN@0jCGWwRY!na|qPf&ejmw#=&q1zPn}o|T>ocd#9iqvZ?88D1 zaBv;o^o1p=+baPaV2`|m(kKRe3f{J% z0gtU=DCEwPwL(MFyMDM&|3RHwp-;08RQ7*kUbq#2TE zvS^51d4@lBeD_SuBF}RJLtUB3g%ZMYnNv- z75oRr_i)HZ>cD+viF<{RDKIaS_m>niu6cbEvGF#2U zw60`VM4#u}>~3F*QG#YgS+tj@gHioqb5k|1et(M5p;ARz2DPWdgj51wDOr?-X^Q&F zK*_D;cNV4`#5@Nv%dy-CVF#Dka-7M|3qO?hzxRf9hKW|%D@A#U=Gxz^%*5r;@4uo~ zI<;tS4Ef*my2Y7%Yk8290-QSY9HHCb(D@?1(;6E8lEvZ;|7pcVW2lruz%!~Fkqp=_ zR)E1vYq%Cpz;mb+k?g^$tjU_d!jaGypQ!FX8PAFfbHIZ+;KE)hRAx(&|7Ph+406Cy zT)@&WBuhB~OaEdQlI^;`*@ZMGTQt`RE#M(qfH_(KJsKiPp?&vY?HdNX9s@3c0VfX$ z{Nem(<8f`uNIeInfd!I{1Ebe7CxgzCLd~h6dKhp^>fHujNCOX~fdkpNGboML+VuLO zl_DfC`GtZ!;jNss12XIIftwY-cbR|B20?Bk7h$^qg#tQDj)VhPeSVT?0VQN1^DA@K zLXZY-NCOw7fei^eN=$-ek{vHv>$PZw-Ll}WT@HgBH@zG;wH$d;C@C~(>SJhTWC(L) zo}x}ecSwF#kmehykI{m0cYiwWbq7y=)jSLg^0*Ze=!1sv#DFX1ESyY$0RV{sy{&Oz zv+X$4nDA9x7~mm3l85bo>?a6wdFtTEMB_s=n@YD5skRpd%IedG_dwR z)-;I~$V_IRc)jTM>ZGA0sF< zkke`B4{0NT{vvl&@+sMs(C6{rQF)Hbap$+_zNP*jL{~3EKbfUaJhY8Jw2dINO$2&u zxnPl@Xq~EP9ig~DgQS}nbWjvJC=8_!4cv9+3!43-3Dk=~wIq>ElM`o!bT9|-LkoMQ zxZC#D4w9L3 zS19(MGNPxlO(nEVCbW$KIkSc!Qb9V{DlKf423Xj>@aLGmhsxLPpMJXJut{Z$TF4&Z z|6|lvpEV@I4%{gYB8b(7bA$$Sgu0M+0*Cs~jI&R$Hf6B_Hn0Mwu>#VO6Z|>CCRpx! zbwNa?Wl9zKGB1`hQ(B*?tK&O1MV<71fhCDICvkN+1Q1~L3W=uqHvu>yRs0;G|=U;<8896AUtD-m$vT(l@! z|1laMU-<8MSo3clV*a0aI5TlfQ%n&kLFMUeQ~-#Vmt|p=0=$%9Io=&l z=ZO|T&nqtK0xsVA4;N2#(u_5fqh<0N*`j4~&k-SUxDGSNjruajBDuo3LwxD_d0E=r z(_enxSHivXm&~n&YjgkjEprLD90@1YxGG?-63{_$FkLHo?}%i}tB|a15;p>bWXd2U zV?l;w1Uw;{5g;V{E3|uqbhf`kyM^lo>Q`5l>D7hB^(Cyj6d6Q(KW63lSoK*Ib2lp>2erfwmAP8Q1(Io33= zcNOz)6FF|sm-(NpVU!@|1A6;E#;fii=rHR#$9yPpWsmnkNIx7mD z6^2q{A*Rty2;mZh@OlDxxMKFn6~}&J1x~p???!pf^q|T9sbf>kz zoz4N(D+X0QENMu0S_|AMkhoid<-naf19zG!Se_X1A9s58mpk>yeYW#&cRD%zKf6vywqXav?1Yc+50gNYE9@ zTEs&GO|cN71aM+3#HaCZ1aROYfj^a}fjR1#pSqa;({|B2f9<;}5rzl_Vd+!{qvL^| zvz{MSlL~JAp4f@|EL}P}tcC!tK>*(;^tFY^KmB#lh=mBlLfpb?6^4#aJ|=*>iy%q6BGg6w!Vr$k(;-C=P?b;jt-VY3rnJbb>>vIcmrbc zia?bY5x=kyudxvJSO|6`YH5%HQb5z*)4)8qu>z{m1m)ATLjy%a1Ia?IkS&*i9)FaH z1Al=-_!~Cp{H6PNPWDhv_U9ZxqQie7cM(5*y-I(X7HnFZLlD&gi~=M^1i(-R7%TuI9$=^gi~@0x!qOpASbiix zAnO%IlvwU>44`!Y08Chz8n)92onJuTW?kjN=XaD zBY=l0UT!(x44O?)tnA1Elms&90O1pXuF}J>LoeQ!9f{ zHq`3({6`oYA42%Vkw*s@y-)bnkHGg7tMy)}RW8yR#5!r3@!Zu(-Rw~kEH44x)2J>< ztF$>QTPV$#k{1xm8W8IYw3%@siIt#LN*85eHlcnFoT;gDv}}F>TeNKM`8m>=&U!cL zTUlp>B*(-BX(2IIYtRk> zkM}Q2tQ+CSt-8Vm$slPh$s*uEVz2;=cz~e}Fbc{*-arTPhF2hOP(|hqgE=Nn5I)f> zjAd=^-x%t`xyii$n;qwa^Ve1+h|m=&S`Ci{3GJ0T+b&b?U!N}FonyVXw6MsgZC^;R zCz1;TS9%RZ1G%fWliU+h@TeeC*-{Y9{*W8>H2 z?qBKFZ>K9t2(L!&B@eg=1bz$@3E`kJToJioSG!r!HmFdz_Y+A*y7xfeMuFUAZ2PwY zA|f*kILI(2kQs&-i0X8J)J-76J014Gu|lJ-;VbqTo65_^UR9< zwSENPqbkU!@87g`<4i^_+6A(Z10dYOEU>JS@cVP3K^_efW+$A0h(d@X4FMt|SKd4H zal{(L@h(X~1k0!!J3I-y!T?5_s*-JM1EY_**bC7LTB1_RwtWVpj{{Gy(P9pWU>kFU zvLhl2neT(#~cXfYCDQWG_v@=raRXw!yCwvdsCg1tzy~$4IGwh{;g*Mf4HT-WHPq*?1JDsi9xk9Mly zA!KSxEb16(5fHIH;V5N;z$%lB%UWj}QF|MwWOaO69QBKq$~4>d^)LFGi@o$xr+|p} z-yH9{AR@}MPwsC@y97k+d~=*~4~XEIbX)O7y#H)uf|L&4aBE2_&xr}JhGO~33w&`| z|2b@Af}UdW6i~0EG?2x_vW~oI^8sr@X$2=4^2>fwMe|raMS#W!Zweok(=#z9KFx+* z&w|DsI~7}%4U_7;7_aKQA+NUiGH&#gGH!&DF*xyjnl}?D9aw*V_MQ2nizXeX`~xC3 zCf&|`5zuMFoz0H~ckp)o@@=$eOYF61x9zpk!PPKrh{Zc?2oHDRK`7NH2W`!X7_KOg z+#2OGaIm#;J^p^F`E!XkN%MNl^1>oEAzcFbsN0*qRFHvaX|PupvXe2@7peyb1iXG8 z5O6mPA&=vSfS4Nm9xKg81=pxL@77IIgX*la?r5;=qmoVy%*Qu1=!q%=%Ra_n*@q7- z`(znYIBS7-n+U~K358Z!lN@31dJFzhbGM})T7C1F*P0VnI^|7w9tV%QSf2BqWK zy1h`Ey7_n!maoCFH3&>(0rts;A&%W*HK)=vrqYzb5NAmXFG|A#(!&Cz!w}D_p3nGtzWP*}+Ekh%62Hq) zko;&BSWb#Gdw=+AD9)KE&e;L(nJDfVrfsEsO5^6=dU)8QRM8xL$8*A{HmS4%c~*=} zLNqIy!OHRk$aYIBdZH|zf|ccx(p#)1mKlfh?7hW46h<4BR*X6)b$<#sMX`aS#nSq5?RQ$4-`ApBEVxaEd$vVEU7B zZv|HW5@+yk(|VBUnga|0B!&yfbn5|zIlvGA82{#(Q&>P#Sb*sj25}bUZwzl-V}SAB z*s9WL+Cr()-3auWEi3! zeG=!a9_Q>EF0$WN;zcU%nHMgyhR}Amtx9<+lW%iGi)BmAhvaBn0mqL==)jq~b*nin zz&s2QQ3W)x6S)N*vH6qOF7VneaM~^q*|xK6vAHdf9KF}X@f&{;B=@hD{2*nLBa)-E z_asMN++nR^*t+r=cRJg2I@_)x?Ngot?>Q?D3&;!$xQQG>{xks4szGC_L3zpz=j?DH z7I5x&<0WQio6$dgGnw{Ch9xf^qK-0Xocp4Te*eRuVY~IyzQcs|{CLR#x#+L}zpw!M zD}4VoQQHMU+XX75+2jk_vXND8p;d0#Rc=XDU=HxxQKc1sUHS5E{D446)dQ*SCNDU% z7EeK{TT%*Ejx9l|y9rWVBNMQ4+ze9P36Sb${coZNR*rv*UOEuH|4~9Nk*c*V3{*>2 zgq(!LZ00gCP<8WBk$_yq$53;ebM1ECtiNQ&l`mR-D(EB(@j_z?r~`borttUjvg)T) zuwbGUZkBYX0lT2(lNKW*3(w#98BbTVnqgAJZ8UcvP6-aJP-fs}W zPtgEG1%TusLH-B96DsE(OEqM*wPv)n#j;Kyi-R3&-!V3c`mc46M3z2GZf!3azTh5f-Ld{?^3# zPe}48PmKhI39;((Vo%2NDRo-hI8)`}aXqX?) z+3o^EN|jJjmCy^M>~ggen_P*HCl1h`po>|LKN{N=rqcfCdx*}Mcls$vfH{LL%36py z<4-a4*+R6U1?ScvP)$}Kw*kwU@2N?T97v8<$&uoX-)R-Z>oGBL zJD>qXTaMSbH*+f-F73`z)Li#9F&^;CmDfDgSV@#%q*(i_5 zdAIh998>RgbAi8&@e;$k&!d?DFirL04EjT@B^HYY6@+D zV>CsaPjQ8#>KOeu&STsnZq5JFo_)?jZvE6{#qid++f#lPw!5OdTMdovHQ1C#a=Ny= z9^tKn#Z?RULqqZWnBG+#H+IfD+?jG~`jpEj^JlXiXfCWeuKKIlH7SsoZ!4gzbH0~* z%ThHwU@I&O@2rpF7rfxk6xWi0Z8n~IxNO)vQ97lhxw~L!gQ<@(cxR0f?>gV&`SEUz z6D=|FY{`~X9VY8p2K$4Z!mj3V zi5=dm29ATF?JgU|kzjtOoM-U6ylHo5MU@)7WhY{aVMe2=Gj(9U{+0cG_Z=_$E)o!I z!D%z{&;NbEhHb%aU~ihM13K9#R;P9~wd4J({g5+!R{6QSqU_|BLfGD07M6x)!`u~P zlae>zH#O60xSJ+Y&^Q{JHMv0DM%edFUfKk6OJ`=!Qa-|4kDeBWJWHx??yRPe(TMtD zut?!>Y$sR5{oencI?JJmifweFZa;-eN)k`Bpre7Pib0M&sOh8N$cpFD6lJ|lL3pc( zn=Vq@K%C@QKm`@d*vfYI$JLA(-F)x!82hs_D>+H#+oa~*>gNYIrdK#x04EjT@BEf%uUhJ0IA50^fgjsHN%+4|+5o z`1IiPNsF$|Or+gwhoq%VEy=XX%BZu?tDmO3e-g{fuXT@{6e6NtUYsBjn+R$al+#8h zN4VVdc8}HUo;d#M9La|rUyAq!&3_Ak!#`XOBT#)zhqK=vtF4aoSf>!ozqM?+Ax#f! zU$N%ug3j{xdt?o@o;}nXzf6uXWV$Zo_>_a?m%w$WAe%kJO4r6@T$+1m(xGJNQN#Jc zK$^F!Uu%FQx3&1h;uhj`V{v|N(Q&WS5gK=Hv~P8pYsL8L(71q1{YdcTivDgj)!^Yw z5(NIf80Pl+)q35cz(YO~w{+X01{(b3$Znbh)yQ-TW`{=JBr_RYRIgohf3NZCl0cf} zpYzx!5%+s{ZChWjI^cL%q74n)n*8!BZh3jp-$ji6O}2&_QuN8bh*aQJqH7H zlW^!xv)o((!4DnHFgK?j69(K;ncy#vzP=9MxQ~-H7iq9|*j<1_TA>wRI{D~3cjtI1 z+G|VN`SDb?7tiGpLcrM8qT*~*DphyBkEqTTf1V}gzv`h^EeE9hTj!(*jgsZLs+P01v@ z3n>+S#@JXA!S(#3n`$K{y7jA*>Kmo=g1lIIfFJ7nd%^z-cEc~DjNo1_=FTB1GX zSuvPQ&C;0l1g0Hw9X`CloU|&%v-$PZ-KnS1rAST5Ulfz`({fhmPx90b2Xw3J5#B_a z`+1)#XdS(VDfCjsmP)BDaS!J3yQC`L2&Hx=30dO8U@t8>jp{L2dMZ#FLv5bDbDF+0 z_Vm^F8u6CfcO(Y?I_^_q5#}_`*88H;$s1(rj&lTbjcTwzR~oYXQ>mqY@|RO4)6PX$%e9}pxx<;7j~;h@5>AUqXQ02og{9>D z9AC#x;Dw^?NE%1=>Px9Uiy%YJ@_RWPG0)I4j&D$Y-@fw!p-VZtzZHn}Id&b}&!pi; z8R0E!Tr_JhlNoy9_yYXTb;F$7It!Nq4_>gB-|2oFlg?j!3Y*(jypc|uO?&z32W?x} zI){w$wV@_wz0TrPHdo@;U1MQloC)`#d9iL@T5H3 zr;Qw+P#=i(hNF8%)7-$Ly&=z-w8GbK!T?u2pkzEy@=Qz~B<`-b!9YAuc}9v>HZ5kH zu<25+3u&=oek)C{hrTB+tk>4%DXtO2vf$HHQ8N$}k1@=Lw>HUHVpWPF;reEa38o*4}Kw`5J1cAdzb2YiLE%wN)j!G6k3-S3P{G4&GK;s_4 zsU{)U#C4uE6g4Z6N(~Wg?t||9q|FS9$HB`4xinmBn=W4<-$zlEIpc_!MExu-JW!vC z2Ik73mInKqS!H*B_(k>v#|Hg{n|%XC7Zq!tWW~?NMv_($MEm(B?PdnttA$V!g(Su{ zhVdi{zZlj9{%_~^&wb#MHvA*PKCj5#GO_3Gi4-iDxI~6o%j4>Md^o?Z@D%=lsNCRU zEzO%|3_WSzqOFkSRo-h&bOO!;1{h3EC|2oq5`RM7lOD=kOY{0rZk%3ggUE$bgAv$ShxQEz>`rkPv`bMJvyYY`Nvv=fYJzYy~Ax*6=$pd59ektFke zbEQyP2_;c1=Ctuvi7xs#<6gAT8$a**t3ST>;XJ&2JPn~z^6=brgGgEQ_QC16B%QfW zFh0*qLV~V07u;;(O{w-dY7u>W`oS17Yo;`b_d{T*_A>q({7(gOQmN1w z5^QCHdCc$Oqc`pJJZtUCDBj^=Q*utKv^PveGYGxWH$s&Y!Rf4!=+9?0AbqH9RxLNq ze){bp#kC|n0?oF(aY(9o4##QO_p5&$A^XthT?{w2XqF-gZ>UKHl6l5g-K&(Tfy-7e zGGn|~`5H-e6n2EjN0B9sj&dQ1&&7RH6B|1`b8heqAs4ZCnq0` zYcB?%&+r!WMrjbX{fKmN`R1X1MWn znP$$?9i!#pq7pJ!@sx_3?$^#?67&71IO%qQM9>ko)M`%C0XjPkD$gX-5>?2zTIR2B zUDoc@N>e(0VV}?N_~94yAf7St9cNC+%6r9+YDGMN)$9}I-&%B-mcxaQ?xa_=syXd& zFES8Lm%74JZdt}ip0s}QQA6GDpZYNDIF?qoQbWDk0OXOCoa(gZ1=_n&+`f;`abW_S3QVHxk$< zaM}9bsW$WBBod(|oOi1pe0+NC*q^_k{tU00Et_DwxhsTqLm0dW`xR#g z8AnstG{YF}#aE2laQW*_dM8i1S|eWz?QYYNTEZvDiz8g>%abB za>8=S&Zql)>l06Y+~-lumkPRq@sImA80x+!5x?4DiFI>f;4>g&5I|e*Gcl)1G56a~ zXi-8*_184Lvv5D?M#+F0EEes{j@Xx{g}JJ6;#1HiK2cZQ{l~R9Tc72!^D-Ylc8Z1X zIc{_KzCcyG*WjXMZpOQuqVQ5-9(N@(hiB+5Z^v7W7TJ8hW5PR4Zc4nzgcePY-Rjny z-}boHQFWOfhZj6J<|8PbUzql~SMas>6N!B#cg({tJrj4HzjnBbA>K7rwW{;+Rx5Su z{)d)(!O~c!!#de@JY%VNH5{fqIt_(rF7Iv3A5FP9e`&`bTWwe7Z*XC!)G-WUPkNR( zs=*zas85v`CMtz1yFRqR$%*T{F(O9?E!8Z_+EAWNhF#o=a@9}JG9SlpR82Gwc=fp+ zPLutxv`+dOFVi3?n)X;<;p+{?28t3hL;g~_NG(rPTi+;Kp1a|+Ip@}PZSs8BY#(qno&={J<&1`VE9xpC{^`pNb!nCQ&%qo!xwak4_ zr%%PXPgeZpCy7x{iHuhGBY%c#C{Cg&pG)m6(${X>r82^_plW2@r$?V8hCD>i4D;(1 zx`?d*dTUStns-ibekZjEw*NQ?`(&R(Wf>QDX|c@s{~Pwsg0lpH>V2aZ^g0#xkt&c>Cq6*#o-kH zL`bigaCtCLgN_1!Q%(9kCGZS&`OW8~mqIipofLOJEygQihMu7a(lkoaE#qUU*e6Sq z;dy4A8z>lG1Y@MK^#x;0b*tFtvKxOgv(ZO=xX<$I=k1Etp74Bx$}Qacr0SHZ{ufW$ zg>qA{nD#v(RcbBYsafKlxmK^9SxtT&&7qT?-MgU83TAXJl=2yGKu6iQ8O23IojwLr zAinXk^W%uA@QnAPBq4cj2Kmd zu5~TZMyGW=I{62FTf51W&g>d3o2GP`2RP6lmnz-2^}EM~DfK)k*LQLb4EHak0?@$~ ztKBVG6)o>D%{#UsM43IbQ@E^WyiZuXoGDDX(82pJk=)eqe99cgMK z#_&09yh;f-tUNr#{xq@ehPOJ!6B~-X!holOqfxD9IWu^_pHq*;iksyR5>4>KJy;nqbnA8|0glM5WfK^&`dBH_HN5roQAP@qKzS7%ZxZQ!4wGb}dj_-a^dELJBkrUyfKelqdC2bA*{jGuqbMYrr2vju;bL)%}GTVC3__z=+w8|-|gWb7UM<*wFV zK!{Hp4tV+B;;&W5BM*-RuaC;*J-g^dFy;6$;>NL;*JF-Q4dAxdHRUUAB)rmoq)?mI zPZ(D(=2MzxJv&DQ%`s}3IGHcb!*1QpvAyuN&LM^Hw}1I~!O4skW2S<^{RCFpFhl(U0Q(DA-kk@!Z zHa+Go<*t|Qe}OtRxPQRm{Z^Hx@$j>^n^M-R;FyOPF6M2r>T2jB<)p<9lCQ%!5lqZS7C%bA|XlV_aervRLk|_uD-q!~bIA4mVS# z{qcmcNqxzEQ7785KqyS`+1@ekhSoSODtLq}9IfwpYL+5_3@vK)mVR#Ps-889$xxM^ zx-~p$2**5Ti+qe)L87&PCO6?tUkj zOg&v+{;~Hw)P|l8!(0Yuis|Sr4^F)eiHivZh6Iz1h)swhi_QKsjIzb_&_N+3w2sbi zt3fV@b7-OU3j&Pu!9gS6a!}Gl^%PNUJW8Wb*c32@S+!APa14U4581s6rs#;g&J#?U zgGNJIgrXY8-Eq+HV@{|OR2%UGTlS)Gbg*`bcLb6!qwzhvw|0=kOj*@7lNWou{?Qabuvsn#@85_hb6FM`m?;@KH{PQX$xo|ofn3#)`A1IEmh zP0L3pH-w!u7MD#;$J|gkRr}P~OaOB%k?w>2K*Q&mwdx(*STdiKxIp$NH+o&HQ^HuT zVSuJ1iTc7E=Tth|CI@y?O6+KRBW93@aLkG1NTX3WHin(Y=M`-iv)nvz)ic8?xOV-X zTAOUY1luZC=!#>61-U87st#*h^!JT+w$ZGMGi<2tWiK9hB_rAMG7+cBaSd#ziJks= z`-38$#1LHJn3$n54MDdJ)Lfs?-_COnhfMcIEF)Wh!jL^s+`j_}AI z&o2l5E=%}&N4;GjH(*ss;;leImE-bCfC&Z)6M@%aikT}pd z%^b?r@Y0EjtAtZD4xOl9{=PritN90owVwAq{YVmr_8q#-qV6BBxk*l=6G3tMxdY#G zI{z9pjvCN7MnRv?*1pfKKqGadxo*r*JnH2ZDrQSZ_Mrf==68vVwFd??Cc2e%lJ?FO zRN)@0Nl$K2nUGBK#qed<+nF+Ji@X(K8!=~b6uX4{@U=Q^1WpBIIonCRX`ce+i+ zE`Y(@Pb*!6Ml)E}p_(N2WXzTvFP-hykZpg`OhL~UZIxA7uN+Pw2GOGcrT?XlLW6 zZFWM_L_~{p3w9p$i{odod3QPmT)3nCK9+>fkB5gnz0h&%?j#wL%&*SJj7pgoiH}1y z&emwY;0iOWy|H|*>USSIbgo*tOOCcvmo4E=2EG$rL0vXGMfpz0aL?u!w}ubRp$+t? zcRoL?Yi5giM8bAAs~w`s$DIio-~u1E%-1?WH3?1=jmpg`C?Wwz&&xF>K7?A`W>1mZ zbv9Sa%{4`PmuAl?C!g-%Eo{mQ-y_>F81%hYxN3;c!^Sm%PQZ=wwq#1HbRAAYr6zYG?iTl;(a9i~z z7O4)|l*k88W))Qr{@~CKC#mjFAvm)Fv^kSj{fhx!ny3^5-V4QM<56lfXT-{sGXXSj zM&`RZWW5+s@AP|HI~k4LC$?M9HEPoSs+BWu_u@0YoELEiC6iE5`{`XiOU^Iq3(BfE zzw~Ttf6cvst?NfzvNF1bnZVWRY9@UbZ%mOD71p-{uR14 z>-+E;6z>Hl{QFYXvp6k=mm7l;61qk7zY=4Ms4(wl*W@Yk@oqj0|LixWj2as%TkBFA zEb|pDK<4YREpb-h@^lcJC!qj+0dGw0`R&g|AIZ4)cHN(a2VuX^I;S2V*?u@VscVRiX$=zIL0{QY#5soyk1mdN%fFU!l=hH0H%GY57cU z-p|YJrL-MrxOUwjjoFz5ryJ157C$M`)O<~0c7ZWc60yDSG`Jw18Q4}ZGuFiRA(&Z$ zt<^a=qFt86?RfUb=>2wQ2?W9C*WyJkL=+*q-D?V^$Zl}ZEfd)dZmWGG-vvCZLTz%r z?V(wD+I7zBcMH2f=7}+&(4NN>x8-EN-YZWlf>@o zcVb)EQ8Spw+)ivVof;5>5=rq9`pA_xaVwUpi7kW7iTJjt@VR#xgGA~q)Gpk3_Qz?_*ZGV#MpShrwu^V(8r;c3pvTR`WHIyZ6bznZKU5jKrwo}zft}Q=C6c^kXQfi< zl2i?4)0?Y!S;itHA=jDbP0u9z+{$eT-D%A@4G$tmfJZ5RpN)cnaeXGRlIK^xn&JU= z>$X(Z7MzMS=+@$~su?N!b9-o1T?h_cI4lSRP#{G2+B%b}J=)njP~uH6;!)3G zA})n~A*h>PebgAl(nQQB8v>t&@7K7$ZImT>R>Q$0tc(w)-NefR`- zm?88qT^egg>~T?$c&WKcEv_@AyINe#5A+qX=-e#uPR$VX z{UUr>Mz>~?Uerj^rjqX-hAbbmG0o|wiYDaosk<0a-B-+AAE=bQuxkmYB7J~8Liei0 z(-HgEvyCr1xN(y^pFL1a(;&C#U2+p7rV8S{n;kcUX1>a{3!tSheceLcsbzHI-@ac= z!V>33Fc~eydkc^MWXxpw5xr;mD*{>ZrcViK%L!_}YK$AyK1JDF1NF@HiNSiJUfbk} z(J==@2?mJ?25)6W2ks!MJi*dj2AgTl6FAFr2mJ(w1P}Y0>-u42jL%8tU9%5(L(uGB zz@p;j(4C&eylWR3Z_-aWd{XoRg-d+&mnnVY);FOk*w`d&Y!Eg+8N%-BOPjbc{PnAV zJ)CI64!(o>6^8o#-DK0FDCx?O2lE=QEj#b0wcSs%x=(B)q@8XVVdo{r;lM%Hw|BEF zZo@mSqbEDCak8l_Qd%fvn9Jc@$`|d&vFRp(XkZ*>W}R#x#?~ZNFY5PE4SUTuCVdq8 zR{aD-PLfagB@A|Wy1*ZOjM~_Xs<$`VGj`+~qNIW4ru%lG$VX)LY2XCnevZ={AM#vc zcS6NcHawO}w@n};cu8@ukINlbgT_?7Z$N}eSx4k6iL&U8w?q2#&Roj)C^QF@v|1{A z%3pM;{9$8+pM>U6Fisz&7fYk*B=AZ2X3)tKzGAYDA2nAY`OeDNM{QS3g0AwK6m4j6 zF712jtG02-MQQJIY9}UnG^?CfKTrfA>5!J(d&d#=vgr&c)g2xY7@tVLJPP^lP~~<% zYJM%=(Tsh{c=-pqjd_&RTRnNPK8dlnGVJA?bnA@nY;SaBqn@O2ka?kP{KOdR!YvXq zqy3=?!L@hN&1v9)Vqk5oW2~Wm#kC3}#U0ZLkqYU?T*dg$-kp&cIplp+Z%~?RZQSM3 zs0bL^Ye}qitUFSlH#Tqu4_dBVTN{5_dHs`~@_EJ7$@R}1*;q}>T_rVS>*OTz##t%x zrXgFeO&mCG8HX`tpR+_x_Ta2!iL~IAW@f9NsJNV~_6N5w#=wYclM&w0-Ie}1nkyP4egJ=w{Z>?HYRW(NUXBkmWwxC&l}%!F>MqKGlT`-UD?GD+eOreAN`VI__i!$i&vGElo-cZ?qnpG9&+?h|9Fj6Ysd zE|A|R`d*@xlRfpjpLhR;xqE-KzFR%)ZsWYUd>l&5W-Kq65=-4^e@`6B(cSBnnq9Q_ zfA{_1+B|<75Hx!C!|e%59549r8o3J-xiAp&@y7jeTK$abR&e{_zx&+G1M@Hx<{q}` zgBwR8?|E~;N}uEOwmeV{-bo=466s)44 zBIa=*j{oMz`{nk!j1$g-yhKapP$1OHLmHf;QJ8p7(p8Ae=n{CvS;c*6tA&03sgtcWRy6p7{nE=0*zIPC% ztJ)(;RjE%snmZ++|2Br%3p4eeoO@c|SMqZ25pa^#esOWzY+d#ZtJ#fW+l1#4Fg#C4 zcsV|UGlHC@dQ9jMZ#l+>+~)bd`*ZP}5Ze-N4Cf~UPdkFq5Kf{Lwfc5us}NLLr%yZ| zjVXrV$8Xw}kFkyUzr5DK8BNH9x6<2nP(Uy<+9EN=N=Da*?jMwP)gt=rUEV~hlk>X> zmj#oYrz_T~J{fo&s5KuZb1>DNEDOw)5XrOB4Y6 zj@F=&YEKhpY`Yr0RLuULl%W&DPQjcqN_aE`N+C3eroYc#2Uef7t18U$%2EuwzA_Z> zZhptwdWWi~HgGX2XBU*X2M;tF?xIt^n(YDMPJ1bC1rfxfy37%M$vu9FXLuQH2;V}S zR&9KO{zNZb(=dPBWMoyrgmwn^sW}GA{0IOiA=bLgu?z7q>>=9A`6tE5uL67uHY_lkDE>p)SHwsIp;1G!_aLkCvF%x_8V? zm!XaEZNzS9;Mx=XCn`bMY^t94zY0LNL#~)X)m&CNRI%s4J*zxL-?P5fpE7`D%`5uB zE7_L-x}38B($r4AmMkM6A;IMzxD7(iv%KC(1!gz%lOO?91!{h=ko zCpV30Jo?EA+VP2DK5^!rkl(s;JWC9rBxvU~N(cA3(PPHBSfT5nowB*!y19W9B^(C9 z(`tw}IA#7mlI4HA?PKIoyIx`Vt8i8UzSp3rB-v=3Y^b2cRK2C`p4|Dj=g{%o)yoRoOAs{TRSG; zvB&x&r|eI0aw3kar1jj|W~$>j#%I`uXP)kbmVfl4zUVnz)=WX8puUXPS-t5x{%Qwu zpw3F<#>Y9S7N#+2haTVouht^3C_yy6g8S+F9tpS-t$wXW4x^ivp$9YwJM<-~G0+o& zU((64-Qy;E(jf(r`@b+3xng-Fz)A55owyFExWEPHuesI|hvyxkfwjgzFCuu6C;=)R zK`PWT1ZNDvD4(vN@+4$BL{iP>pT~R;dGog=kV!kRP`U6)|A=~w5)ngsV2t0O&>SHs zXHyQUF#ow!Tdy%jaY(|x3B`5><*)hO{zp*h=+jWZbmo{t+K(Z|O%(LkQunciY!n*5`OYhsnIe5eh@UZQVqce={i!wo`6mEm zt1}Lq#;P{xj&2RMvCKNlt;nh>6(KF8!e&6og(#tV;21iDTn_ zk^3k@Rbej>w4N@S<9fYebEMqtpIg}~YT|Zqjp$)g^Hl;I8L}zV@e1j8H@*DMMltw}r+GD-|HHmCUM{TL@If~0;u4blLCDd><3#|?#xo4s zHe19rS~I&7t9jL@?gt;YQ4kAm&x)SM>mHmW*XhLE6uC19;L&s$;;GB;?80azMN+jO{*eu z4g1&7{tnLHRC?aAGMA(m63kLuA&knO$=x>Avze`L+RTQ(IpA(qE{!q^azhWge=+n~ zW;{0UGSg@I%KICKv_I8$OX;X1bw1B%iJ3IIH1i8pFx|GozMJh_jbH|hDP6PXKQzN= za2|23^)*v(Wd!FN2cwL_+tu(L^++=(gE^Gd-!#HrtGh!KX4KK zt!C0LJ<0SX$8T)fpO{uRvM25`{8nSWID9+BflFN;J&@@UK+{ak9`e)Zd}ENk3xsU3 z8(^pOO+^{!$_pdq2?_KJrHdVxdq6uXMC4YwqEwA>k1Hs@(EA%|P8-CCGycG>6feYD ziHH*5!d%n3_m{A8qyAr*!I;omosEzPa)%a2H>I(<6H1O54OEn=mU0(=UlLS`myd{W zw2m|G%H>!hgX!kA7dRe76}sDNO!VRuspP!c2)p_=4;AsvP*nb`T+4FI>I+IVA>Lk= zXe-o&;i)D00*Ac8)ZTC>i2Q+^+KFXrSpT`qHN*a*G#{I?(5SSGyyJ{W?D_3TDGHzwq!6q`bq7ae>< zCghHkkR_ej*Dzznci8@G_2|NFIs7=&6ead$cw17Mh6qP-f+cvN;==}6M{$j?&RFP! zvO2rN`vOI5e-U*foUb;Pr}u!W`7?Ec^4fCY-oq7q`4Z;T5+*cKITLxdX5BT_Um07) zdZayFrigIOVYo4nCXT29jFbF>t4tfuO_ii_v49oxrNUP?ZvhzWv08E7g9Ji6Yi~I7 zzY60kZP{AsC_z_A%t^0RvoNTCE5aCm*RHZ{3uFm_DJn}>iD=x`4$UTgVhNhrT2w|Y&$ig-f4s4 zD`5eSm60!&A+iNpy=Yk%zi+VTwPDM$aK827!zO7bDuVM+O{m@!W`Rr zd?cTNsw|86q1T&X0p|kpG^tG-Tt9k{_``meO!2YuyH_n$`7@xT2kOoML6xb#?QoXq zF33nLyt|il1mAi2jSH5lM39{BGkJrQrwkoPP))rzwh&RcA0c6pyUSxkkEEcJe zzCb;e_K!x{&qdjH39rJFGBxLQh<{iiQ`EBt%v?Su1-CF#{cW9xf|Fp#AXr2X4(1L0aDlV z`LiAy`7v}vpfbSYNZ-|~{z~%+JPA4p_J`_~e-0RA_&?P@Hxd=0^)unuex{vVa%Qy6 ze(SblsaLuAXaqi}dzj1!z$1f25r#8{iQRp`k5G^b`uE@8i|Ej8QAhk16MF*T;!ID1YO@ zh=e&v_bHQgL~O+S60)>$=&fG-iQW^W*>Tq?NmYDKS9zR6&?-gq-5p*mpOsVJ zza;&$h~!Hq7JmdEi&RQ{z|Z;XguTyo%#rjv-I0cu>MhAA`Jo7TKjPrJy*l$r6)hXv zFiqa0)TI||9QHWXkaQUOk{L}rKSMC;&W8MQS#Iku0FuCY;j)vZ!rrVrZ=yr46nO3NYQ5To?z|A;LJ|tce*^hgHJOAW*i&)L=V7 zVV%O!&Y}wzs!~p%qaDCm5XFF4WkgRMpyVw^|7qMYaAy%B3JfvCh8w^#f+2uX3yvTaVXN9a#*2}JT56weJ(ob zM`3@0%&%AIx;)}dY&L(ZUDpgiDcceH@pmMN!onBzM}7APbQ^HxZpbs|1G5G=EI5F| zdUVVaU$WVs^?r|+M8f-a5TVrFtK1zS{6_tJD`tJOz3+D{bBdSr ztcav^mh~7Mq1qh2k%-JL73!Dl!?1OBX`Atit1TD!g#qN)vv01v;c)?vG^)LgRW|C!KEux2gbcUUZ4S(csxV+{~Zlv}hfAY>dU`Z&%;BbeQ3Fu8F*fvX|G6R>A}5m>i!BV1u2U#!;72%<)iI?UbHT9w$X|`${uQtJ^e7{K zao8eMmX0TjDh5u035Wti&y-I_t@5&J>f`-aXr?=bUuK1X*%YFV0rJB7Oq?;t zF*HO#H$o=%nBz&x7bXI~CY48R!^*T)GN%`8U-mP(4;&1kP_ngh6 z{3Z%zx=g6ft3HZHIo?$Pw5>3;MjUy}B-FztlGkGI=NG{L9p=#Et%*KAu412@LxQdUWx7?7Zb4DSIiqk4z&>1Mw3P-T&YV&6Le?o!wNe zMY7jmd|~q+d;xq6S_uqA|JI?^eM#8^&qVKaaIdlhmQwaU$5Z|kW1E-&dZC<5~qR(G;3p z?=5b$Wr8tC^Ww$$i-wyadn^lKg1^nI9H$GJ^@ub_t1=i~C>o0#Y1+Npzu;YFA)H2M z&wDf*`aEZ_(&U?Tj)UYOk~Sd=Vs&tKft4>ND#u-B!MX(bk7^Rzya;1V%@?p%(RD6t z#_hLyVGVL+6>`)riRroHF1oD5d=Fq9@JNC8>}ode?eu4!p`e!Q^gC%C&SwsWuK#Dr^=YRE zX(5<4&h*Rc%jph$CAnK%+0P0kgo&O-+l6ZuQl;-8;L&^f8GY44g<$zz{r>W4;mgp6 z5N+sLtV*^ETeqI6TOoPj!sss4fCh1lrtV)3xGyQ=@s*vdGCitMCHAMCuDJ|^#I&t_ z+gE||gfDkv+`>u=-(PS@6on9K{6-^T>h%85MD=?wfZ2t5p$3A|5Wzn{D&mu?ny@O7 zE2QpleTjDTQUnvGkMO1283^ciOqA-&oGpil55G4){YNnuQ{)TPG)8$B$a-r2kveLA zxw>L=snvLcwVV%k0Cu&OhG^rppI^35MvjIwn=6Po@GAs!9JAEmOpRc2uSea~w^Tq)WRaSiBH`Jmxk*GP>^z6VEqP}teriZNg^eM3Uab&Kx=KhPrK(W2jV7oq;lVF(5nyqOu-73-VFWpxa3 zqn-+QzeB3}&-O*kTSFoxTSMZjTc?LLe9q>vPmfO*K8b^Xd^Bm3PK*iQPQgtf26GFm zGzFzc#u0K$LQt|xII?~RirIFQx%0ijecnV04js#4iDLCZ&E(88ya4iPtf?j*{f!=v zG7#uh!9Y&-(;7lUwwE}d#}PdkVy>-dcA0ST$-ZFp0S-&!xCG5 z1@$qf2PjG6j14Hn2JBG3(4N0J>d#T(^9cdqvTSP4-jMo89ox4+f!x0lGojWCp9gPz zf@Hf2DV}C(C`ItYP20XnnR+C^P-s Jw_8nO|NOf7IDVi9f}lzmVty}{ASzHc=XJtPWsQsmDb`y!VmynF-%xYD{9 zMu{B6o}Os|jz3EmGvLKnHRyL&6(W}`rb^wWW3>Emw|3l7N2`xRfMir{mc51y@@(rd z^e7z!sUZvWc_wgBx8T$NgmG|{fq-5hga$(kUq9hx0@78ba7a)A3t1D?X(AXyajc*T(LxOTk<<2XvN(ARgzT70zPyVjo3s;M>ZCN$ zRQFB#rVgQ~vn1*v(k^dDvcg@z8^#X(NaP}@{Rk@YLG^Trn1u%$$r%HO=~ zU0I=i$Dh#!RtTX5R_wG@F3eRYnidDVnWhK4Ev5$*9~LPMW-GxKh-)(@yN^h%!6p`@ zp)aOT*IsG)#3b%QW&p*Y%I~ST-a$ zkV)ITdCj<2OFu(HxQc-H0^0T7BsRT=%i(j#)^b+eIO(ZXgk{h=#w<(*_VxLL!n5Y$ z)ze?}VWdNIRELr~Ha&9Fd80#Yh1x=T*p1O zy5ahF!I>jqeKM2}yU}9TfrkLshNte@@@G)xB>&W?d_?Vye zz9Mxa?EF-kv-wIubp*y0G#*+qw)4z!iLJto_yfwhqT_Xe+N}yhmm>F7wym}V;qM3} zt6@rV1CHx>%HKU8zyN0rrFyF}k#xQ-SKTi)we{Q6c2c_K2#Ryatu`kbPq`h@8SO1Y zcgIgZu_RIx(DFA_35*04bBI0DjgwRukoS8Q}m_!M>C`O#lxHGSp;;>uMfSCu>i&I_W??GQ|=jO+#lQ1wm&x)L@e5Fp4|0_)0>o9 zS2{L@cr1J|9;PF&iK}4s4Y_;`*RhJ!eOGFCU;wtG`k7rW+b{u#O*sCi+=b69DROs@ z+%5Bch$>-r*Bp~U#bf~p-k*@_C%l35nSOTDF7VRO%LiO4Vw1PTqd*HOPll(P_uP`t zfpaX)A0lrM|JG1`3xL2@62W=Nc>;>OqN5^ChofPn!)@V|XAJzU8s9@@l7ehui6h`O zhx#>+RiFXMY3l&VnynTqg&VbpAhyy#ZX~scx}vo%#~YZr1g1Q1) zP=sSKyUUcX`m4D?sWb~Qo99aL*`IwQV6T0oM{!{IqZ0Wv(HyGb(B=)lH~6Z02XMUX z%kg>hTJCiO*Y&GOLPncm&{1na&PxHObm>Y1MQw6*@evFJRG&tnD<)x~t>1i><=zmc zsD-5L`-$Gg?r=5!qk$pSBh{rp{40!BH`F^zz=!$Y9z-wjVlmXa#pBaq#;_93^TkJ3OZolN-X)tlOlH?~&Y&Ymg_L^F{eugZ+~>DU z@Dp+J(-|{^{oTRKvGtQBAz9FR@BHUA6QLhhz1f4oGuh%l$HcO+{rC4_v&bF{#AIc@ z#e8n};EVJg-i^bUkx-MJvd?9>xb18E!2j(PK5%!*1?855wdAW~=#GguWoi zx9d5fiFz9`FO=eObdf|d{Hr?blQx@i45jx+#?_}fOn1&&_ zEP0^{yPK4?cXtN1lMkKh$>-ygkgNxdI4o6BkA8w8o9TL;Qc7De5sXpAk2ZlsG#!hT zex1_qS}u!uJsx`em>H&d9L7|__UFHr>sqf=A9}kj==gAM_d`Oa{mo_)VNLjCvPW5F zBhD9%@PO@{%=22hK zM>%}dIAe-)_Q&F7*Ba+ZQ_DV!v5(m zPq60T&&I132JssbaZ|zP>CAAQcb@*NK0eoR!@PVa{aY1Ebpm{*?dChN;w z@jiU6b_3n+eeDPnDNKIfioUCGI9Ir6MU3 zRaWsgMox0Q0fQIq+H{t>Wc4ynEsA~MLk-SmR=1G%ob#hAgM3+CB?4i8YVyz>ZVu9 zm67iaK^}0MlJM(Id^Qw6QzI#*^vOBNzrI=jOfA!dBrL#&oxj1eWWREKX${l!652Wm z+}d|JNA3FpAWxfflfZ|ND8AP{9>2iR1w&fPds6|2%_PypSOY89b<5tTU8$I}aU4J1 zFPugP<^WlaS4j@*?n2w9QU_$KljjEme}&PhCIt!vZ>0{_IUgJKZETQAigR)B5#uHg zHaIUW2glPn?E4!=7Ff&V#b3He3Zg@$gJ+!zzCFDl{=|ZR6EBhqN}m6f)3Axa69@&l zqBX!@5+kyU?Re}O{2lzRn&fg!K7egwoIxD5wapd9JEm^{LyK|I>PG)A16Egi@4ZOZ z$^M2(E&sIqUM;7>8=E8b)6RwVx3}T8K(0eId<;hJ<#sAFBrh8ng|I%2*GvC{8b=EX z21JK)`KRoLo}F?t#aYu?1P{pTC$ZgxPC;!ZxG3~NM3B%K1c&`hg;8P{bU$X?FN=mP z0bX2~U5(-CEk|W|ybEZ8Z>?*V1G<%tp>Z||y(fFGoHY>n-aK}_PVTEa#9kgSQT5b~ zn>Mm27n#Tc)WJdap?0BonqRBDWIta#1?J_DDk}}|{7SYl;#0GapzuKG@;IVl#;z3b z?xrVBd3sHm?)KT9Qq(C3dv#|B{lUTv~|Tk!+B_UrZD27AV!)ypFjPtUp&O< zkdhtMvn-TaCF_HdfvWObcuRfmahwtjLtcdwl6wN0qrIW-cm*{B{ zsz2K5C^=pHS=7Sui0U#bsZsI0+X84SNVlmw%Y#1Qad zyDh1^!J_(jA?Px-J6%XM2|{Tm=OZz8viQx)jXL4WiIsg%p%UC#c2I``8qQtQK=Z1f zzG;x%dtW)y%v(pXwkRl9 z>}ScCD(FhcOcMH@Cj&kyb|c2lAtN-k*MYS%OAi)?o+KThNu|*JPN6Vj9WAU(Gy%TgPI^Gc<$@H(Rf%zJlKmFk>EKY9?*cPs_`^NIT@OPoMrO^}A`w^xY z%9I6!w8(G_1)RAoKbn*iK%U7^<0q7&G70>r($8XyIXaM1CHxsmnYo=^| zTjxUBR2e-hX$nWX@$y;SAs1Ua)8@0r6}4u@%)84HoKqI{>kVI1mpo6oRBzlvg_%Z) zy4jbS%T-9mEDU8&!t3Q- z&qxdx_oPvjovLRnkYv4-IA1|)B-b_ppUiseOMuxgj9yy}S~Tw?AU#CSV7h0WF$|g} zBqyPix*1?hT&3Rau5@?!P9yc^@)&5qPn>wdGhoxiAphCDAQs^`h-lDG_Qc-vQ}qb< zZ=2e+WT?&U%YjzTH1M=M7s?*A^{yI$^h(DTU9vwT9j0R*FLcfue*5t@>DxCM56f$sR?K)5eNxEKJ%pRpcqPGKMkbx8qzS@7D6;gA|f zI?77lXi1AU&ZXnnT|6uk?PT*=*Gj^i@}cf~xptS{x#n{DKEs6;AO-{YD8-AP%)8Lw zR7xa&;oGILKtZ0Pqd(C5=ia2Uzzyap?$%Zgn{-XX##stBMF<`sdH|9KO?1PCe6~>? z<~(e4DX@v%(XPh(O#`Av#Pt=bl)>-pn?=#m6a1z0q*K+lC>z}?@a@=PccmENa82{$ zj@LBN;M$59uCRhNIDycqSHa3Su6de8vuDJT{7!V{QyQL%0F9>uD`22TPA(SbogtLZ zKmC+|sZvI_^q}TCBRkJ8eObhmtG~NwEr?m|YO^J8B)I*>_EM4Yh_r~W${sOcYlYsy zda1wM1M%w*-=vPl&|qy~$&U!E-qW@5wo*w4B9Vde$X(!71Y;E!uFs72$=>DY^(yH=Qih)eM(Nli& z%YiFStY6r7e*nGuhyn($N^dIDQfG%49n>X{zdcXNm%c|1(26Eb;DVr7D3RdoM>G^gJe@1M zEX6&eo{vd-9ZcLsE2xulzG9jVp?UP`%Hz_0zKU&xqW9_Qpuwo3e?6;B$Tf#H*x>+A z*EP@o8w8WivVAoO9H0-xaOirKR)F=Qf+Bb7s*sih2Eu(*fJCWy4X7z#Oc1V>$6!yu zofwYnRHX3VFNr$=ZO}fR(KJ3~&|SjsC{C%nAwdvwg~gvxEIwVOAjAC9d26uAJ&R6_ zf@!$&(BM>gQ0$-r`k)EZ;r*IIJO~UppY(DSc-(QK7catubQ&p-$zkCiGY&v_SJvpn zpG;}}nrl3s_chlJ%3xecB4FiGi&n+G%BPn9t}h_4;=Mv4cYwNUI_sH!;j0v6)?N^c znt@bbfNBKD9AMCp0u8wmb3_9TnFZ*@`DNw_vI^9&*+QJD;}s3DBmVR#-oS{g@)s1I zD}?$O=t8*C?`fDZ0qmMaqDDImsN_L?gk%?`nFO{6dG_FB_oD0w*8DgSgGFDiArGq9yiJCxw%oq7gH2PzKgeEg32s1Et7NemOVr5Y5W0CQlt>3=$ zgN@R_%fFp*!%W`uBI!8!0jGNFy+}1RcYtZ@cbS&2GfO#^T6ZU1-kUVSQMsoEMvPBZ z?RqMB+?E1inae|e`OAuL& z!BSp;FUO_${im|v_>FMWg+|Grdux0>FAE7mr=fZAY#6P{1=}qoL(46~?LC5|_lWG> zbG`)J5t}}4(0X8!n6f%KY?I2Bq5x@tCPr*$u!~r^h`AS=yt9ZmS9Wkmt?9PelTzdbUWM8B)o`tt^xggnF3v3v z#W&pZ4J8a-IH9DZ?YgZR^nTCnNIsrbWpIHE2~5!7Mn}jJHWe>HT^A3@LD9`~rgcFH zo=g@e5zRvdspyBzA!Lc=age$cW9f+IL8FyPbYrJWQ`YSjBrAmV)%i)YdGT+VE)l6!I~)`EqHTUC+}Y=zT#gg)2xE_ zUnw=|f1Y;vf8#k7|0k9GS2D=^pX7VoixCL#AQwR;O9h~!N+eAH#3zXc3PSR#&BFbL ztC5W$mn8>~Q-zU+0z#6|0+Ar$5-`F`DPPgcf^Q)%<$AJ@>aMYplS{VE_URZIVm~lH zw|Dd{3scPL^GSbq_&wDV{WB%`yTjyEPvL(GD^ook-~!?iKcb;Pk=Z^Z{uCsyvZZz_ zXrmr*@I^<1Irohb^pOOPoQMWMCxh1(;)q+~|3ni?0j3FHLADq&P7a(TO+yf+{->%b zJs_>nY@aZJ4)&jbvurWpKY>ZIG^c+8d|{@e5dZ%HwLrQs!%>LTB)w76pX@zUR4MG? zMM#Enaz#jLbil7_;&eeOqkyC&g;CN(_8v;A1orSkBvLuKLL>}23Q4t-V9`-P9L6PW z*`KwJ3YznE-SsaX4+|G_NbegB``%nz;++#zU6*>wC@;;euRf?aIc_4Gy+cupTa>Uy z@NLs?2mji@?`UA5US{7ft%EoJKyI&c>errNi2MO-KyS}1+s zAek0ln})8vHLjIF(U(BM5x6(pf)im~>D?-uyEp7XBSX!|=Oy^OXVH30(mJ+YUf%4V z6Alp?c;nr2X@Z!(!pdVKoiu@$GLeRE>I`GQt7G=4DdXYM?og8N`~YO+>cpSsDD?;>KD8MPU&v6wyW;`0kxvI zX!WxdcBC?Bwes1^;iY`iwTwpPuHWE}@|)|QU>iBlqC48^2Dwp&{l}Z5Cch@K=GnCm zpT_o;8AdPidMAyGl(h{fPYEuNf9tXyJ&z!511JCFN0*3g%%6qgsWvo$q z>70AX#qUOCTz>noN;^-S^LyWzHOnU>2M#bfrIA*3-#Nb7dMz5ni1676EXHcp{Zwk; zgAD2y-WQSWIy)o$@bbKvJAZBL#Q*JXD!Cuz4w-Zi?$J)dbMyAXj)8=%(*1*oASyKa zht#eJ_ZiE}X|hL5)c#|AlGHBmlIs=CbKaC&qYjN8!xALfc=4x+Te1cIOZaMy(@bk< zU9#ZztI7pfu!%yp7H8i$*`iTHCEh}_X~hICF^Mmc)ay7`CENTMPS)Y5!nTP;vzu(z zDFNrn$<}i08=dTseXh&rM_airx2vND9l)FK|8An!XfPZu^py1IRA%Y|NuaF%ll@fj zpRD7*Ce81EO@x0<=6}tZny63{L=|~>rb$K+BULSL4WK%yWv2nMMy)Qg03q%(JpCjc zh>og=w-8W}6uuJ-2}-zzN2GGWK-jl|wD>GqyoBHuLBC`s3jK1s_v+&Ac3*Ietuq>P zlC~*F*Y1*BH%3rx#K>jK;DteoA8lde*xoQ;>puh3Y^^-<1X*nL2JhQ3Jd1%#L&2{0 z3|^l|@jW<kUkAp%w4WPd>!0bn6ulCh9Lq=vZ|0T577fUnmq0Dq9* z=SS!o)LiAy!u|un-r@rge}L2SJsnGG{@${m-~Q(LmwsFyguUXFlxP}soqc;*crM^> zTN`l;mFUXYUX%|f!F8|wkykM?Ol$oSf2E0eH1TrtV6gcV8$Dz1LTBA&uGbBo83ONb z8##EmkpmI#cO9;c99?vSDq;PN)vTNj{u?2QBK(hHoR=7O;KPX7!MD{Lx1K>hqlX$q zQ*mILBrLls47)EJFikibS#rtj3^Hv_^k637$Z3o@4wf?x7F<-DWRAl_HvL2t&W!mN zlFouu%7wHIsu7X0Bw!D0UoSAnMZ+XW!RE_Zbmo_|0{j} z17l3PtjM_>vOdd<_Sp>+?7}vJ-F3-C{U!Ckka?y&Gp0ChI_;wWjV=B!Ce!r4SkeE* z?EWvd_P|krs0oK6`CNma7ec4-xd-YN)702K%0c!%ujFeedOxE4P>UD80%q{mWDKkf>oHfIrM- zQ0$c8m#yp}enWA9SEx&h*eUKWBiTco2DgB=5EpZ?Q|w>rvWHj=(gDxGF5F^g7>0uI zLV=vbCup;H!BFp{b-tSOM>>rwhdNx|MQcxYM7gTXrSrR+)Ee_cZ#*p;{@(_!B7VH? zj{HPDH`=b)3Ov2HQ|~AWTrRSotPuWu3K_ND?yX#&zUHknFZ_`Gp5|%vkiDQ3n-2T+ z0Q|p8ygsMHGF{gMr@Nq}B$8?1Be2@(clxrdOyp`lK(rhIO+3i+4T@+o@o}4whj+yd zxK`|o&@yq8=zQOvG4kkZ+Ftsc*HpSDQtj;PyY=pCKY!?8ybiPr>1(fQ5~HY*6ND_V zna_&uF?arxgX@CY;%~GK8_cq5RxSGCo@-A&w^;FV$7P*6MP>gyUCH7UN|*o)U6F9= zi5o&{1@dOJ;Hh<5yx0$)6FYqT{%wC$R(FP@l_HwM3air?LpdxAz&c^i8F1`oX!dtM zb$0R~uBa~iEb~-M-%HQ*YGbs{tMu)Z*nuH)tYUm_-);GW!d)4ZvwVkAZy51+aJzAB z$K{KuI?-)ey}$d|+?_Vc%jP z4e<7IQKrfw-mU&E$dq%7D*6Jz3ml-BhbnC{>;9-m1psMZDIW|wPp~aMP;U9;lY5_6 zCPs}eB81m5w5q+v2=6a)N6B8VUH4@JG%0}#zQZd`)-p`p`a#C;dNdAS_y~TfJ;om&r7%Z10JeLdn+Ln1PpH=5H)N4o}kSFkb!5AG$vY|~^emX%=-FB=m zgtdtkr2|x}ZTAY(J@hlK=zcKYtNLdH*Eoc^Am6ofXW1G(gY&+-zDDpNp(oE!tRGnb1YLl7 zU=?+3eGzfHMm#j!UkjD7`IL|$8{1E|Yzkx7Dh)s6hNl<;1ka<>_!GK~Y zQ6X#ccr?i2B}^e_@>(>c6gZIAy<{MnRv@eYx_}Fi3?C&wUrJkv9g7_uaEBDxFNp`2 zo~l^@4&~<~1uG^k=E6Dz17dJNOj?P>@n4i0Fwp7plVwAej)hvzrxaq0Y4QyDe1~X~3|E>K3-Xpm2XTbn=RGGVqh+t_rQWNFdad2Uav>G?^?kplI+6h+x z9Sz*t05oJ+)tP)o8otOZ@PWZdfq!m534GArgiZc?I}K< zSWeqYs}Yq7+C}ZuhYx=^5^dnOG*;}28a9Mov>7kY$wt!7ORqpvsxRb}gnOtpD@>C4 zuokrO1NR)G6zsUWasGY&b|aJeMC(4;=>?&E+d;BeRs0xlb1A_=(Jf}aEr>fLYA57i zJK@;{Qb*{%5RN)imi+Y5%5V)|pjXx==6P(S^4ZDNL6rBLextFEGT1alQSth?u~9_@ z5~G>MQOQ{>$D6+jjBp>Sr{3Q^A(3m*{1Wef!kU3v;hcU!tuu-TCiJvsoPog0XnEj9 z)N{%17(}q)QTz0WHIQ=NRQ8O#(Xr&eTURC$>rD=ev+f1kqk%9)#EA#mo%?cP+WJL1 z*UeZ{!OnQz;cKv9`_*teNo1<`#iwQbi{{ZPhr8kb@^SkA{8`Ep929BjtrEMpJmrT6fsoX$z+sEv_9$|Rl`^ASa@23H>tSXx9aR7=lpY7*Jgl8T)ivlyTh_{n2+D<_@?pC8uyKk z-(wlSCZ(ProUzQAq@Jkg8zXl7U;*j>^*b#MsBb(Mn+5KC+*i+7J}NDxn#DsfV}X;! z1D3@jDHV$q@E;&8q`E=zuz-%wbFzp8r|Gd7V=t!>^^I3!vrL?iJ0Ke?+y-9cOdDSs z2snT7C6vxGJMnOJakcPt(e-$Hc;4#l9AwmGoV5|4KM{N$CfvsGccfZzc|E-Z#YMc} zD{sFNff0S}z7oN^WxE`M`N;9Mw>ThuV#Fv6WXP>!;HzA|JYCzLpr4+dGiso&l{zvX z{FtEN=Hp$gk0V1i_yPZtvc!Q4Z-|7CF_lvjZ}aB#JC*mIv>e~awo_WPX`J;c&@kQn zsV;GE7qWd473$EbNdIMPSuirV58$2s8j{csynVtXphYC9?O3awAqPt1jnf_EqCyWF zXrcNcNgydz^`6?wwTUizh*!aP2r?Ab|$sSLiSi3M#U2WP^o9X+I- zDC?hES^6x=`~dO`%2A}D#dNnFI7FBfGer1G6Jrll5ETkMf3v1>z@9+Ykr-C8gQX+1 z3lvk#-><|qQ?VXrFL5=>Jv;3`>m|2SPS}qIp)kdeAvO$=BbJD;>2IK1N4Zbr86Aqq zV~(mXVHn!+=0q3)IRIC-;s*$eqXD z*fxG?3Da82cE+Dr`L{r=N1{O=&M0B9q<(TSR?QSGA0@}JYsBnezL+?{MtmszGBTLY zjLFEL;(R#xB9TmC3R9sONn3##XnNgfJY}kC#0-K+gydy{zChy3-9w0xlo1TXhR9#9 zDP@x#G1E|G%IVYswWd8?p>v2vGIOzZG-yuEgsBXQs0X32bFqJJ?jgZ_<5DewcS>`z zAan3$d3?N`^Z%KcJQ0NTn}JTr-k+LKq-#_~D2F3zugX{8t0Ddf93Rd2t@D;F&hrJw_HsxJlpRP5i*pUJ6DR@q4VE)?Yx`FG4 zL!xjUAJDVYpzRHiI=WvMaUH?2#?zf!?zky_l8W+DVXT-G77nQte5a1b#N$U4%pdYBoB^Cu{v_MniE=AaU2RNBZ^22{L z7egU#lbGv2(1y1ecN{WN5@JAZQ$F0h9b!2$r%&D?Xt750$8KVYYsELd3(3%)#{)U$gXRlm`4U z138yne}k4dkY9&5eCehFMit{o-rjKDJkP~0CUGKhZ=U7Ow8y$c&ksIH=;BJ0wEg9n zzq+R_@sl%1kkeTCy8l{5APYm~36-?+Nkg=ez-qw?SGtYK$%W7rMI}9`;+3on@9{P9 zGC)flhgU~Q-- zHZ|AjAU8GFQ<|Q?6x2dgz`9>;5K@FG3n+T@DnY=W8XW5B7d#B*5`R{!MIMDL#pX~*+9iSfz7NOPX@UZ1_muD z#Zr*6vZ;+2z}y@8BXlIUi$OYg;Y{H~rkP|aOKrw^-5A+HH@)>Ww`v7~gXRtFpCoT* zb(0GZFLGy-O-C3_XQLR5t9`-j9&F+1=Sp^myLOG&mx~a2OB+=LuMV+yhZB)p`FMicyCnInfOQP?*AmNqq)*}J+s4Ly5r7dsDrot$g}m-xL5 z#V=Oarx{y(aRJzXj%~iwkeU}WUIUrYuB%KfO&wMVdfUmkuzzNqvBLOWL0|734PvCmYC zVkR5IkV-grel8ik@-LYR^K74LyU2&z7So3t2-_OonoEQs__-`q|1y5Zo|kEx7K0>( zFA(*nCiYqJD&mI>E5ZXWc(IWzs@!STQK`>MQUB=)-o7e2gp*z75Z%39IRaBg4E+1g zW71G1*mM!g(`+ZKr}DLNzBBvFG;ceJ<%+9JJX8Zq2(eJsAi9zq@%bwP@JdIBS_XT~ zuoxSV`)0V@&3`V-C9o4>i;rjX9=8O6p?xuU?D-;f7^jv@G?3NA;?FqpDoCa{m&>v1 zHF|e=Ye&xI?gg4FH41ZhXT+hQ%Mh~BHD#x7&ZD?YgFjdN_;BJp*v&glAojBtCjCV( z&R4tz&w*!GPp{N~kRQ0Z6$n5!{j%1`T&$a3CO1f2Dmz1#MqAmI-kRH7c#n=4%!)--O|S|6mG74~MCKTQhjTs9p@e`PC> zLyEmSf0ujRf_YOiO;*J7$nj#G0ysAN*mE|_X7ZB0kT^U$_@DL8X$FTHc&r9FJzbpk z337^P170RvPQm+_A#YE6ihZhU6VS%b*|xG;zD|Q9JMzocQx?99A9X-qC6@s-Z@xt> z-aA9AcrP+JkcdSHoArwXwMHg7FC7p_gzX{Q6J--A%>uZWOqFSY&!|?QX~-=QGA$l= zcxO47PYG{IMQQbn(egSb=+>1a%joWJ8IftAUifGQ*^PNXO|iQYUv~ ztvJOxQuNor^M${*DQXG^DvDAjx&!%OW7sCjXv)u7x|B4JVsBk~co$ zE-8f>CDG+FPw)^iUpTE25C(SiOlvq?`m2;#*wbCml~eTQ1sl>BR$kUx%UY`AR#YJ^ z8!l&VPHkxf8f*-en{)zZ&JPTUhl+x&lDew}ovRzIrkXyqG{B;yFn3C#-P>vdxRt~K zO!69H8I_M8m|38HHw=%Hwk=k~;k{L}J7Cq$2b^h8&EI|VGxW^b59WGNFS{0xws+M}t{idlk=$-@9%Y%}q?2ihde{ES4C2(uZO6|>Me412RpB1~YG zUWk0iamKT=m_}xrKeFQGayK$j_s|1w+g7_yPIcZbz!er{M6D`h9CWQ_Eq=M$qVdsS zQdsiIij(O_OG`4w+K=SV%A$tN@nt9Y`i;YfaH0>?MU7)|EUE7B)E<{pN zn(D%q96gKYwz4S{Y6(6e_9GUI#kwBKRds56N74MVS>a}W`{kJ}+N{GPZg58Xpc-r$ z2U|q4RXdyq#ziNsjUP!PG@<`M<*4u{O(WjHvplY`Pq+I93YYap^;;_6h_d{Ty}{~= ztGin;lB+N5%?!eg;eX)h#~$1k(xyL@o4PM4HxcW*DNPQeDFxdPN|hwe=of1gp*KgB z7PbekE0T(5;9GJ@urk1K`tZPUct|jc?rhN430)cXKk{x}z`F)4zDi+Mm`>kT2qM{`bo1@^8dqci_&UhR3Q2 z6AH}Z<`uUuJ4_~)PCQI1O7IN)9QvXORE1EJAC+EK%HqcRC;rO?ACthmM7q-ykp z#dEQl_DQvj4St!jeRiX0qxpV`a6_1Rviv@nyXXq;a067$t>&8R2Z-|#oWEQC8HOIS zS~@~kR$yah1xLu5h9Q_ZT7mdGB1iwO?0lQReJa@wmQ!TTw14obiwhCT3ME?5|9e3d zk4(TyL|e2S&fVUY+18|4joPC1<}FCk?d#7*IjO+g0=$o~x-d}2KUe{nz@$v*vKrm3 zshDaHHtc4X$Sf;N7NvP%clGI=;>U5W0rwE!foW{;`o^-`9GrRQGy%)YD*i*fy2Eb_ zr2hf4F4e`r^n`<0I0a0)ox1yP(0b+)`#YI7iZ0~=wDa0!imRA!9%}hg=L*A(`wtN+ z6{t1kuKqG0*g{PyTI~L1`9LId{i)x+BEB?0poP!Ef>PxmjG6XM!`mgShJQxsfq#fo zQ-h`aSRHgz?#*sUW6HE|uwUaa_+6#1dO&L()pjPtx>SwHq|yLc)O?oxb6E!^)c@t; z)#MqK&W|#6TkB0z8<~$Ci27*76J)}-l1skj_x?HEFZ|-2S&2$$t8~+UbL4^t(h3IB z(-tVM_LH+uvt;LuQ2mgL%+(u>zq+gn*w<$nOoG_glaHIzfay2vHS&*&I1iwkuS$rD z=WH|mAKEkpWs8Zp4o>s0{{0tZ4_0eRXw=6fUJ~my!O>{mgj($SW|j7tL7Y@39ULm# zCthp`W37iE%LMIy-`LaG++<~pTB>=m&b|y&x3>IWa0)kSc@QQ8Ch3AoO|9DxtTG+M%46EXwb z_fUVeAXyTrC~9b7c*SM~x(4Al@`h}QY-9K%2Vq1Yi}A{ENt__9*Zw$kBnJL7`Q;kS zJd|l9t2ADK4raLamv^IfcoGpluNGFjAVc*+~ zPnqPcCoeNO88Ji2wGOTJ+Z{-V zQf1l-Ze0DtZ6f{4(Lx{>1u@W`%oDoPVuV+qXY~R<#^1vongv>Yq;^#017U_H^oX(< zLE+#|yO)}xa?n@&={h~NP358L6_N+cm=~kXGT-h;8Gpa59}>y)wJu0pH8^pYC1Jk~ zovjZQUm7T8=mD)nMc$HpN8Yv&@Q|RceWE?e{lAu4F+ThUJ8Q9iE#~|+-HCEwjC)7o z)97r68X9-#XI_{~z0ovij`R`A3!`&V%-@q5+s&i__NdXA%F|W`RiPpl+UR%7tE#Oy zu&PK?+Z41cmpIA(XuN$nbYxv>)GA#&_E=5I+kV3Pofs5zw5Gy?9st6FFgjFN)W?qd&OL$J-0)GEYGw|Sh1O&fm z*eo<7h`W2dgof>8IT&JOdl*lCG9hhF*;{aql|ZdZNNV zqY*t7`1g=4=8C5PR&do{q$1@UnmaLdO|ao#kJNsREYsUG)7>4&?Bm_BoUp~Sp4VA; zs|<9~cY~Q`g|77aXZ1iLI57acTnk853KDcP2_#bykc72xwN25@Fs_6~HhxAWQ{7i3 zeKFXkC8oCS-5o9?=CGAN1j44&%&bcL(}|DVQh%p$V?uk#Igs{6=KM;SAj$_ZT_J(~ zjr>@M1NpOBT}qk2jg`A^y`uokid6{8)aLU1A~N5#yW(wzByl2(%_L7Td&xp7*`v(U zFvcH$MSJOUf%ds{wZ;8cXUp65Zt_F?P2;KSZr9`~=BxeV<+N{uV9Rp>&gwR4&I=g} zK_+U?>uzbS9H)4aE2<6H_Ummt=Ys5M2y6V~pg1Om>6yvn=5Q)U=l%ZjvUp49-SO#Y zi{NsT@1dQ+=f(Ev=0pFftNp9+?I~tu=!oQl_07xm@N;UN@1xE6x>dE+gIRKJ2C&o8 zO%+F1`-d|JeTt4tR}Ee_#b@T&)~Dkr0>PHc*OLkUT)~myc!bX8#>erX)6kZ=hgFU|-z8Ay0-is@#=O4hl)0<}Z$n1akQ^^Rm-k#6mO8s8cbDv+_)3NfNEwuXm*w?YfR@N z10q-%3f$1b6J1WjXbf?2P;FC7?iIrF33725a97C3B9b2P;<>E&fs;_G1VD0Ynftqt z9aRDz^8W;L=JsJaw!CeP=|JLhI3LRTIgO_^tfm@>4IlCl=S zFh46IvAlfT>UC?JC>5h!rBV8P;fNdQtt<^Z+?t5}(N#dr^^Xg+P^vA0+0cx#R%_|U z^MQ;liwn+E%W({9qh#6Ca1I$q!AJ|UsbE(K|iVh<>w zkZ#AgN5?}QzXCT@Xf!KR0A&6bx#SE(h`zC!2S zxI*`0iPFr5*nc{UUds(P1Z`o7Xf76LIS^cK>HN}RK71;MYngc;&Wg3&5m~`}X)W%a zS?C9u(8DYc5O5{7zP%SF$WpK+!eeYYgiA+Xkyjs{r-VyKtD0901(IP~T@5W?t*6wz zg{q>3K~@69qqPogn<*A~4ZZDi`>F60PAMXbX9SINXPHj%3uW8sM#FcHb$Q1?n_baJ zM~`LUL{cQENuxCFOD*H~pQOAJjRX93+sXXqf_}Pt8f}b?3Q~-r8k!v%5j8zl6ku%$ zh#!qW^REMU*#h!zmv|0Wsl@ z+_&YB+AewLLSOgSwdF()vLkkTY;dEak4mgf^U$Rn+|gLdA-NJ4Flb@rriPqQA;c7< z_QE7XP{-H)%Je1f%Jjr3b$hA7*Y?UXtBD~PK~|3IMtZ#rH-D%`GB5jJN!TOZ?%of7 zN_HszUY~`KQ%vXCh{0LhVZ0m}J>(Q_505|~dxI8E`rS@71yg*;sQtB{T5`?JP5$=` z{5t_!Esk*NGUcXg`qPTo_E_~+^XmB%?fF?Y0}zqGVP$FYuVuIvzL6bZLClx_ zHR)aHNLk6PaH2P4?WEdo@bqzrf(-!?5}5`S4%uuSiCp%j6g{7u^O@i^*jz=d#}I2= zHkI0`BZK)#i#>>l=*V}n_l_e0#czH;r&6=Yb#^#cAX_-O#F_MR=e%-b6eMoZP>6A; zaEON}$#7j;30yPHkqx54R@135>|BZlDe59V8JtYwFGOKQX6S@EnC-K>7<)y=4TKL zG@v!`-l)gv8e@wL(DUh0h-%4V7asBo5cf=_&2dkGk-iaHM9QgStReGVfspE1QwpYI zf@OCtL13!G3{i!S9pT}e3h1B6Fu=S~0m)@1NsF##DL z)YxRN$d*ZW&N$z0OSI4pRYZFikD(H%{XyfclBbvqUE-|bHlQcn56wTlehFN)5i}lS zEc+1G3!92B3(q1Ov#{#7$ZV1$znOX4y7yq2~^z)a#YD_Lu)TOj^}Fj04mSxJFie3JY|)Q2BB zxBdC;Kiv`u>|&7OHR3h37?g35PqZXSI@;?*OX>mC<_SmUM(2w8@hHNhZa`;{|6gcs46?^OFtSZKu|Lkwj8W8R z3gEYX-7gXb-{`W4$}6`AJDQ_~IjDK4xiDp@T|Om2eHOZWy0jBCerIBWaC^vh8)LRXhYNe2Ld!~!rG0{J>92H!-Vvn+N7d=C?H~x+t?>M= zr5rIF#cr>mxmqLD507@>IurJIAJ)ppkw~}hCXw0b9njh6eAb1Av_2;ew~{6cI~3dl z(a-G$2oc#XVJ2b&*3H$tLWdNS>n1rLQ7c}kweTwTZ-@{G#X{)2($*yAb)7hVmE4iI zk2y0LC0~NU%3epxc-U;hm&m-k-UVmeKJH)5NsS3MIebjMMg8Q2@Px7s-RlsOc&qfg z+BR+bP`egi6rnnng-Z5Zi@`Q7G$qa>B*3w?Bq^{DmY%2@3QPLz&F~r+^mtc~ znK{==I4b2}ug*ffZia0OU``who?nLtC;>=`eqorj3|OSGA$iOivQUYBL6GE` zz-i|FJ&MHD-}9%csxi>o11F|)HJ*R?U4hf+`pTmNCWU8bivGTocpif~Xhdt^q0qoR zQwE=Hn=tKzP{gh% zMKV$jb3}S^x*E_PqK28fpbaOg!Q8}@z=l5wV?skvq~tP?kBZeT`<9b?FHz7u?w@96 z{#+ex=~x~_ujog;U0>-q9#5sXJpX@&t>D|R?Q40DTX9_?rL8+cmSW%;;Kz*u0gOq^ z@Ietsb&QzQg@Gt@NHg6KA87_p@O(rx6N1!{J^+9)aunUok51MQLsS!I`&}}Et0f1` zeq}Toy#p;Dfca6uLx6#z(khEaue^;GFl>aakp{6|7W(g<3^4X%tj ztKmpwMK{Xx@n0=+K3}YzSXtuH8!YBIW5X_UR<9cTLDt8h|LY9+kGje{?e#7mQ>nl! z;dAj7mxiH%72JaBwaUm(WXN8MeeSb{cm;M;1tr2S;>Uf&?^8o7_IkB2T4CMzm7-Z6(rw`f50%|E^;vt5E-+ zL@tSLnD{9H*~rsg;eKa>5EikY+DvuARMQ?12r$!hF@R0FjUYD+BUSOSkN|z;fT^+j^h+IJZ za&Qe@&;|wdVocoAJ5rV1CV%oPfElz>|Ml@< zI^BYQch$*t=%4F;0E|!E(=!00?KG(@DY;a5YC0vhxfU{>tfy>ZakPO;ai=u!+s#dm z;0F6h>BuZ7@b9&f1d6L00|B!}uo}VBA*Wvzb#mvJ$MZK!@o!F$T2*nU*N=HTefRd) zW{#m3W2G8T#mxqZ_CYs@ex7&>WxNTt13V8vs~qy%RY?rAo1oowS`56~^ITE9j-}d7 z&NmEH(X$Q)g(9P5;^Y_OpsI8?AK2td(C!nOHNeLNvra|JNE)sP+cr<36&W+ zX;l$Z(?RnBR`6VZ-GR)I@z{Y98=zqwa$reRO_)_S6J0AkB`rzUllSnE3HDZQiwx=x zZmDqq1#y$qBy~8DkvbYZSYSVF#BE~dZ_GUYY~IxN0cV(JknXLBis>>ddg0rr|4){! z>pSb%JF9qDivq8Dimqx}v}wZhU-F1q(m0dFhSk30)4l}S-1k*^^HtHv_`#0Zz6#O4 z>Sf>kpjEW?;m1Fx;ONygcVka;<+?x-vv&omg7z+7-RvVTwQEzYjP?#$)=XbcdZVIR z2JIcJlzF9sEYd#cI^dQmkcx#RpV% z#~SbIzg$$%w{XH@RjFxnN?i78f#qiWmN-Eiu*SRl>6b#Z4YvRJx2vbD4Pqf(-T*Fqu8c!%!)-q z=%KLgY)nf64b>B?t&Y{KNu51|xuP==T%a@O#4%+UnuQvhi>!+d5#o@27 zr~LPYwzo6HmJv)l(`rc9j-E{&A3<;p$1FH!8n0IK(50aUT0zTd8HmqMPS*=S42Hv| zl)IN3JUtF7k{BBY;@gMhw^tJ8^(BJ0)r+zU)ZGUy$!oC_z{;?M0f%BHA`=zdP zk9LyZw-uYbRrozX;k{P45BJX8I{QgP=?zdscQXbt3;+bVXuM~2GkhEibFv@nIhg`r zNA(MiL%F6oH~2h&$ya`Z`!H`i5Gx-W-vi z2mXVDCqd(|yHD}QOIbxG%u5sO(+zF;*fM2#d!R8uM`fO%aA9LzElCO810&YLMpP$) zrR%8%@9?d9M=X!|-~7>&0Aene4WNN`o0|=~SNQot$qj%ta8p%woDDr8y3a5fHyrtX z+o`vxLEv!%1>rY&9)w6MD$53lQpTob;q+*=&{Z$NZ^FFB z3|b^y31ik>DeITwe?I%kXm7Z3%5AHYsIK95GRPGQ-V(<8u~bn0+2`M0W9mzF+5wfz zf6$xFC;}}i2|LfPu1X&SPeW&UmrZMqaB)6RL=B68i4AAPIR5n9!{tsUI+xpKK{@kT zKa)|IV8xn5A%uDnsq>&@;E8sczLE&XfW+%7WnW%m@w*@XLcfE3a#=tPrn!~jXi9fg3x@HTzwFW~QG-4lx$Oo*5!OJGhwB4qL7R780hkn&3 zMFg=}lJdh~hiz^AB(ZzD+VbYho^4#;5?)NrXhQBHMY_g)ASv|TpFbhhknvjIms!(- z$Y^xPP@QP+%I+jOCJ&r1RVy#zw?+rO;2tbTIN<~j$Q2o>9_qh;)r@rCpYq3lae100 z*(#cv+lgn-*m5kN(`-NPsA(^pw!v!PEPKi1V4jr;kx>J#4lpI4q(`VpDz6T7$AmVr+sR-W;WzI6lS+t)ur(Y0Aa1V$Q{2W{PEYmZki zE7h?zeR_bCGcjw>Lg)6YqdCE2GT~r|_;HJ@Z*%9B^JU=-@tkmkZ3W9mwt<*lM6@H9 zq5Dt7&G77ScpW**p>B2i-@oW{N0 zC0oy=Gq2{YLt82aD<1oEN9MGbYT7BT(t^j80liVLI<|f(iS=sa4M0Z=%?q2DtS>C{ zS`Y;J$~+{7jnH?fI;3(6E@a-3?%^EB)@62OA2+W%{*PKRp)T6DEI^5?((~pvj+o6) z=Ci$*KdoYM*Uh)hQyj7DVJw8(5fn8@gBqdhR|&GfF8k8!t5Fm)NFkcApD~MZ6==kC zl*9=%v@Z+kPU|14j9QXd(e9Ak3Q@nw`z<>G@ye9j9QT%*3ZO>a>P04*OH`45GEr45 zvG!iOd5i<{E{cqVjIcId5TGRZdzMq>WRpX@U2JG$Hn**myKIv*TX$J8q)lvilUC+a z0sj>@yKeubqEyv8VM*xQjcC~7f*P@sk#NXp|Ab1b=q-Qj_;^U%dSCo=e#qgrf%2aw zSqZToTj|l8Z{$@j!hnh`^SWwQyDhUzhu(}Vc;x-|CNErMg)95bxZO#jS8oYx(P9@W zk0`5tZ_5*DHtY~-_BESVSr8Hu3PXShTe%>vKo6S_IV8T%b`nJMVxR9yl_O}GvXR_wV|CHTya$Z?B$x89yf_7OQTx)NUa>T2Ha)ZNX)(CR@)la_n zt302kRBhPeCUwnx{WM8^dVg@nX_|X}jBVHw&G;dmPBqlak&F$|%?jT^BTA#g9VXpM z+G~!<_yHLnkcL`E^cgK7zqK?rfnqzrRgUrq7r6X=ngP!=X7L!iLOrhNX$P^pR}^?d zRJCCMX#TN}89n@4{_V;DuWoxAzKr@$`S6mM7Qlkss{c=ixbqJx4{MFD4BKz`J#NKj z-Eamb(@B5I-AEt5Bu!MOl)BJ~L2IZmpX8`OT9u>^&^^Yk)3E)n)nKWowZL5f^1Hn^ zVZdQZxtz%=xnys|d#%_msXkMe@Bpgg6}uWtTB03NbxN8?YlT@v|4;R3oW*#_IDWWy z;&%E*+*t$MtA`;0R+|)x;fw#|TqfSl!6A)|CLTC^o4vh?iM0)pYgd~aSBp8RkejPq;Lt7}sW3|~C(m`C`S$5giMS85b@m2+BG6-yt6r;x_7+gpg}bm&f7(nWmb!kmM*SL+yvD(N zKiduZdBkbiYmaY7IJk)31lYO!;@8xMKVd{*kYlOSVT;0jU&Bn{>G~ATTX9f3BWHm} zo;c|8*~CrqJaBikchq#^azQUb&~N~k`fW*9Uz~7wr}?IXs@()PJ*7%3L@OR5_yezg zAJQB2uU7R?81yR>;wN||FoDO-1hF#L%aBnN0L=1YCHX5NJ(WWWlm5liV*-;t4Wh-9 zZBq}(e<?s}LL=$_#xeClK>g3-x5Sn)%o|vO@vsU(-ae46fZ=0dOe_}5SV0Xi_h1zM zqG7FIUz1c_cuQQ@;4eP^YQST37TW)L4C5^s*9HqT#n_Fz%y|ua_4cDTA4X4gyjlR* z3hkH)o-^M&=ZUt}^4`HF#EmYZ4d~&`;C0Uh>-D5~{_0zyn6O2|$R5-)Va|b~`K$j_ zDqrR=8V69i3GIsgx5}z@UZDR|V%k;6Z=K6mv;V6)mSig~0Hc|duVo7wIub=iV)09s z04n#fx34zyb}dGDkX|5u=?V*gS-@YGAFhxf`kR73a`yDiBccr8G5f%kx2H=+5lzG=uE;`Z_5#z7jFI*^7PUZgqLZowl49GIBc zk&$rT7$UC1mv``HaVcWPh_VvL8*6k&dlFi_&U*EnfO_$ap%PM@g?!fw!mZ(@F^)FW z#joAqaM7XNqrc6heHTxIb&PNmWPgEM)KP?R^C?nAU;`iNlB928su2P538W8?WhEFB z>-CoFy)pUe$v%~-Q#~)|bJ+V8O8gP&#yhb6we%s-HHYvjwdH|fQ(0+zs*xRyca@r* zxoV-XzS6H;9YurwCEmED8!XB>y&=oRTerD%+fDC+*21Gau`vwuJe8_(wsZ1I`yyuR z&P#PEY9pj0$M)7a)T`mEQ)}m#B=-H;Cy4NeJ&K1E@iy1#p0Ut$Wx)6es>X!p^UFhM zZU*A-Vh1>dsvL`@J_^<)O%B(}iL-bOjwN2?Cb^IZ1VML>MHvZipNn4($#{mFc7T(( z9FjR=U*JseS*Eh}yj_9v2()!iJ#RuwmP{b*K?dF4;V`d?=S2W3Jp0Vf4xwK~(qSJ% zhIvfC8-I?gF}fKJ{}j$lcpZoMD!1_4#J@evEYjcLy8Tr9W?_xhusD(pE*Xh6hy9MaZ}u`r zXwQyui?^Uo-s}GerU1N_x-Gc%N=e#VaHp@$YsG_qbHF6VWPDfj#-DR5OE((|fZxDF zBp1t3lM&q+TA@uTVn{<+rZN(J%MAvP)~m!2hXi=fczA90^Yw+qgAIjpmWTy(o1UB7 z5UY%EJ`0|nb9(^aqj*O18m&3r6Rklh{|6Yn5T9qd^G>~c&iH|^{p&PjrGmlGJ%~F; zM`qwKr9CptHR>)JYQbbEWxTSepzf!3Z{WAX!Z49Z=CjmVx?Hw+drJn;txP+U3(9S* z_2l^H;_WQiw`=6?w#e^L)Ssu{e)@p*A0(Fz84)F~fQhN+4iZ3w6wjM|5vVO=h&AuS z0wj&VH=t7Y?2tqihce6knwu?G^CfVj&!Lw=&GSAaL$ zYii-3Q?N2Uv$;L9NZzfxQ_w*b`Iw5^+=&$~h5Wpe@4 zBEO?KiF-JsX{E2=S}s0mY|Iqzm%3DfM>4Fp@~KGWrm6FSs#pKYR~4@bvlKa(({cV6 zTbki(6OF_3tD6PoRHfSm<=BN!^Rg2c?hAR|r%yA@bHzuYe)tuOHsDPpRSCU@wIoi{ zeM_&{nSuu=b&RSQdceUt%fCP%n|a}KwSP`8Ts7Rs%vxY!yqU+_`Kctd2f1~@|GjR5 ze;Dh0iqU`naPeV^=%myq%jtL%srn8qj|TkBF24PF<={CGr8?;Fd^j z)ESsP(l#-KkMX-y`=eiwvvb(@Sv_{)v0<;^ ze&hG6z*JLpMlFjlYQ9y)lzY-dU0NTx8w3wp_lpYz{c!;KgF+#k$;nftw5hT*kS% ze^d(w*{7OG)ecDLha}AGi!KD5&?K~sVzAfrRP2_O9!qNQT+oL83$RnMTmOFpH0;)u zzY&jUAzpweZ3QdU1uM1yp>L(S?>}L0rF!rGPk{pToZyqrPbn5 z8#UN%Wf}%K_@`ehAWlhr8um#b&Pjb4fSXHF-`f9k``^It8vqi}0?nD`iT5w(r#1co zXTFcR$wK6c%n-1$HwuoSGuOCrb25|79>nB_wY2NK$~wUvyh9tWwUzRk_zY{D%n+{V zI@TRLa~rO4-IT&$dlW%vjEvNt$QsiB;sj`;iQQ!=j;|fKZ!=a2>&EmJ7eDRZw=KAZ z((W=R={F^tweX+lKTWOc^Wg=`NV=Nf0Er!HdB*YXA|_%@oep1F_pQ^%cwqR{6F5q8 zKmYBc-!x_UA4vOYY~sBZgq_Ve&-le{^TQ`*jMG|1wal=y-fm~AOX8}L!dVAXZ>-ER zd0`u4htO}^6o^Wf5lI7^0d}Ibh!eVap*CF84gqoWTBNnVjub^4QqY&T-DjLeZhNS> zu4SK|Vt14|iO(|CYcT^c)wY>8JHJI{jb#TDcILWt)_+_y`x0-bRLUMTf#Ilf;<=NO6wZTA z6Yd3cOdX)&8~&7E+DiNrFg8{d89G9R7q#bm22@Nglo+AqITyQN>b(+0G-uu>!eWTo z&ys%STdvBT)$m%ZCj7gtzp|Unw<8$*{Ae*)ITTkgeiyo+y3JdGpoF&OyL-wci|Xvw}K1d3$J0P194VX(#*~ zYD4hh0otbQ>t8)zYl>{1AYA;M^THmNnKIMWz_%0Fxqo1O#gDW`-n~Kd7;rV17fKbW zaE@e}XDQMVMY4mbPy>bklOI(tI>$Yz?gq4a=BvA)5pmItK|I?t0gZ`f__J!^R|x$8lq{MG~9X zoVFL^T7E{Qy@BI;1;M5drFkU$p69!R&!UP{l-kvFW0B>mL5xQW-D0^-ZEM2jrHf|~ zP5ONq0$530k}}+g^e(^a`r}Hy0+`!E+Y0(kW2Va4rG^k5BKy`chFGZxo^L{c#Oa&%*K7K@@s)=l5{kvRj1ZYS|>qy{Dd^ z++KAtwUxE2CTeRTTw|?`jKw!|JZ&>vQM!i@NBqQLD+j7dq`wCs1~}sJZ{pjW`;Y!) z&ph*+L{=?&$?3}l zzA(@!0LI2-7oNo#;>OyG{F2eY1@UU(e*y~bk7lQGE-3Y>z3 zvI09%lYEYhElKdVIG>qlij6P7)sXDNf1;XSE*SFucz@tsv6`V2Df_7z_90S(Q=kx> zoYIW_7NY+oUI1IcU?+wyua1sJ7ah(`wS&(T5soeq)W{q`NlUGci?(`7%YLQy$B~n| zenCxCPhn=JWLnuIE)YyiB0xAJO7RF^R1A5xdAg{n9~hVf%FNWXtiB)EA0WA!&e<=k zrN<$$(o)v1(CMb$AhOb;)<<>v>WK?YSN|wU@PqmJaA)#Hd-CFN5b$?{UhMToRrBxH zo3}3Dd_lo;#Q;jO6v1T~ZHb~Ue7C-l3|RX%P#(@)y$^h*4G0ad#gJyPg2hW$T$y<>1L&l4~j z6bixaAEm{zyjK{feGxR{e^!$b(-WJbOY?G_aMrW~CL@trx_H zxZ2vkn4g*;ZIdZ=UdcDnq7dW?qYgVtbInD<%T_m;;me>#17#SeUw%X z4}{;NfbXV)tDW$(aofKc)Eml{sY11rSTGU%%bnuK0oyw&og2=MDN>FuRFgvm{@e8V zs>nM_g-VYwcf1oens??MmqS5~YHn;4ONroV`Y_F_hzc_cX1gD^zN_f?rDOWCZ@Pw{ zv$ZrPfu+ds8a<5mRk+cv7muJCRun=D60^Zr!15P{l%!6zFgCg+O7T2Bq}EmNt{ujM zQmX0*zKK#6;h+nq`jsCNnCNh25O6`OK=>td{6)KdNGrvwzTt=3s~vdTRK)|e&D?;m z6lM6Hw(xx_MS)9tt9<+po_2k8A#5$RM^)0#pGts>A^VFf3~#swsLlsvyIb&zp_Ypj z`%Cc^o^ktGP3;(F!xW(!hS8n%!;vxZe~(Z*{-2ekmSz$G4mMW$bE4Xn_dnz2Xy@et zU?)%%dBy(}<2iW2S-0^50=@1oj<@Z0p7jvDe#BVC$JiKe-1f_&HHqVd>c2(xG7L7H zuuZwQrm$Oba!iw|eID^Q`sTq>y{(gKAt2Tp^KiQry0iVh_9;;HF2G0fF1?&OR+Zec>9{{0q?(rjDN)E7 z^>9iB`i7Eu8mR6V98L4p3=N*T>Jbj!HvBG;pJd;k*3YZ7wMgbb;RJbxym-LBi!=an?d#>R_mQZX2ifWx#~32&f^T^kbOwk zyP5|##GtggIv4jV)%{y)ZX0S;x$1`^#(^}xN?$7=gtoMcI4<8XL>gt6U)xByYwk3N zs6hg&!h=WB2pY5;6Wj+94`Kri3v>k<_J@PNqZUW!N_w9u3godDcWV#@fIttWtae;g`0_E^jf~I|f*$dRjp# zS@D>mZnO(pd7Z++FbcPpo?UM zR#_W`c*|wn-%lhOBicdSzhPB&xpQDtH4NkML~HUmBf`R1#|UcazHI8p4BtPSVm8?B ztQ1eFE)ox~z>BWrxIB;I#jnBGX*&C#Nk&!Y;j+6oqHOt%8BpzTZ}F+51IW(-EYHfeQROFgyks)kut z=4_DuP}tB<4>>;iptZ*-XlTV9gYwQYZj(YDk=73k**F->Vcr+Cknmf|A(Tm5CR}@c z+m*Fn%-8sd+xGrK(jZ4g$84KXX?8NvuP;8j{{<$6!x0M1LqBeM{^hCpWgV`tF5qby zuD@j9kq!Qh`n@f~N7L7Ll*JB~$?}uWHGYFriRS&VCb%DJJu|RK)UOVYoFn#d(!nG& zXFh`qcYeWl_a|Z(et3fkkuQ_Qi7TVXR}ucd*KP97K2%qMd5D2RNq{u$=WW|ZWJ2;d za5{D*k_wLx7sSChMMO&Ii#86`7egjSyzhsAgh%?0zmPDcPm2qN3V>>M2!KZdhl|?E z66z-cAw;mY-$QJe0~#vi0Q(6wyAAu%U@m}UZ(otLok@Z-_wG10py$PCs!_qBd8bdS zAilRc`2a2w_i6w{9?b zFEeKjWtFl#^Cq^m14d*Lv`VNPDMhzj{c1SBX-E=)<~A=#2^VgS8~-`oJP;7&)8%i? z+oxrZyBCre@+pO}p5KqgaAIUYGMZV?#W-o!1x+>>PLiIES1uAkfq4f;rshkLs91`5 zhf2PpTa7ZwB<>B1(p2Dvd8Zl+q<_R%ca6+k%c!9AH&@t0fa(8Y3QV>29_n1vJSMwp zh7YxaCpq`N#2x+|P)r#E!Tub7~2LqT=*UuCz4bkIyeT+ zU0}+=98;GO8P^M@FD;D-okD@kC~IsFNe~tPP74`suc;FowGWTg+iuYeFzIl|7#@wU zzG^LX%qZ@b;!6wq!SWm+GJ%PZi=b+8_!mog0K>sqg(JXia{@F8OKON}n{5dTXlsJi z$c!NwWSom4!~#;ujKk_=mJ$Yji9@F`I+Of@Q~oMO#lo9cqN-Gu50E}yvLkas-)kOF zN{)skNUYopMrLgF-_A08vhp>$z&v|SducCQ=jxI%n8}wa(E+7~6Su|5m+2t8 zGAxm&ke{X(>f*V6C|Q=2AzT*Lb@TUI{=0WEZB17HC*c$4@Y~ZVWu_=-pXh7f%9*MX zYg8+zk>}^nbZw9@CkyqqH`m>gFzju+YldfhescWDb4=6gT*0tpq}~WMS z2jG5oXDi6vUCC&kl+Ui7^-J0!Kw54U(u62L>zM`pomHyD5sZ6K;45?pNE4W#_(lEJ zA_1!&KK-1?i9bl%v3Hyy9fGUZEB0N!BFL$Ji4!ymXo?2ln`jUZA^Fd?iQ zI5v= z?eYsS@{)Wq*yyNfe##hqe~JiPUPrNGwQvwrXiL2KjhrrSmzP|>-ly>Yl-CYo{r-$o za$PjHLr*;?%O zaCf}zAeWv)^K0*T4;Rod`#L~D+eVoY?>In_GnbhAHSbHY00l70`+kPmy-hn$Tm? znb70WQ6OtRGipuh{MWd(MiWHS_+ZnHq#1QmY0m7i2xOeshuk%5!46D15@XXO4_%6G zJBL-zYGK$C&xtc7j1W5K%enynhKTJH|D=xE9H+LdqZc;Mu#0-`N$r^GY44!N#Eo8i zZ1TKibi-t~l{ECXlr}82MDmW~^IBoU{4^Q9DoVS}AR{`mfOb^K{h*0WQipcbF+g^uo&$^Xl6tSQVrS*@r(}nj1KKg7HER$ zwsf*)8^Cb1(AgAWvN=XHqcwqsg&)ym+~g41#+s*tJ51T1sE+8j8NXnT$VBjJjbye9 zk6;#%R6T~xhIp~uChR=9AjG9Z0AkreNtfW#FHf!sZLB#t0)|Oe3}ll`m=5N!M2xwE zrb%6_P3g+%g5nV=oodl1+D%2hIcx%H+wMv=5Qp-V-&mRs-UO36&4mFXSBD4W$VX#d zYYlR0iHy0`!%Dor5R)N0mJ2Qas0{LUoo$b_`u zMqrpPwW2_yki0(@%I@qymlUZf9t102^gtSY?iIw^l%$3wrbyB3#48}Ew(9N@`NO2e|pn=`_H7_eSj&9zOUjibe; z`)sD^HdZHt3@)8Wl!jRmDNuL=H0i75LJzMsqh2($ zW&idAZK=eo+bXwQkHJxeyE+!=fqPHcPGv$c#Mvn+&Q{L>#&*ldLDeiHn9x-1!b#$C*k@2iZF;jCin5lSyuC{aJ3Aa1P z#%ZYbw!PKDQD4X3m2#OpTE{NtHpa>s+N5=;jU~EqCKnke*sOW-9|Xoxc6%Q;XoU&d zar&r49FnGs)3=^k0*ez^&S&zUHO2|LcuU3zhAgKS)xc%RVN)9OAy2d^gRS9lm?=XZ zt5?HBAhlCrtWp!kj9x8-CXi%ikNGn|Rs6qxFQ)UtrC1Y274!dy$^RoxH>JrqwZiFj z0tWxtoD;8=sOcKa zhwd`b(s-y*OvFkfw3@!>-=M-IL$1r5T_GrXe1N2kDJXWRS{HA*F+s~S|8sLB3ilhs z2xK%s&Nikz=LXFvMktyvo`G3f!BJpt&do70_fa(Ck|uej<{j`_vVCSHR#40}sHbJ_ zHTK4GPUs+U8Y`UgGrFE`u&k=7YQ?VII7fUPt7=V&MtkRy;(w{Ep%(f17yE&ng7a zZQ&0eRz|K8jIz-9K=CyGk!VDrd8L-E72TwuW<)4I=|{zuUYR1fZISx=HgE)4h}CYI7YRR8=l^Rf!-&qmm>ol_>7wk>v?KTqag*l*(>3RuEvdGIW!IE}BK7V7kyK1?xucYrfck*;??lGw(coii zEX0OG_Gzt7GqUaF85TB@KUxd5iBn57Tm_hWM;rIb(+n$Nt%P$G4Y4pPkeRe=;9z%k z@%|`#{g)*{0JS9srgO+-c`<(tfaY=aFNc#9*$LG#pIpM&8ZWZ=WHFKE%eRZ^Z(K35 z)7WGt>Zk`dc|v$c`A^cX+I8)B_gp{VV#x%z}WCW`O; z6|rX8AoQ-RJVPD1c-KAgFj_|Fvzmux+=otrum!A2vkzw!Pb$z1y_?|7G(%zXB^E{7-S)GG6O4 zUehwo6CnsG8ezw_)LcVSE(=AE^8ewx{c*Z1KAD!PTl&#V>AyB#?{&)cJnwW|pnlFD zERM=r-BQGtQ&qQX9lT|PNc=L7cqI|NRHdPB({?@gsDM1`wMwK5988Gj4G4u zq~b$y{^;-<|4~Dm*kk8{fb!}wfc0VeF8KXeB`>3l)`Z=dZjrriRLwmcuzia-jlHi0 zcZce{<_J+|GC#RHDobj(ag3u>Y7>ZlT!AkeLp-CUK9F$u`YMi(cRhGoHB_#=S-fsd z+zLg(Xmwh6+6>I6kFSv1&%OO=Uc)|n97@TaixapWT)Pr%`-_A2Y(Kh6t43?)P^m_( z#`M0rR}Cj_15W9(c^h#WehaTf)#CqKNZ}J+>2mJ|aeDR(U;XcSm72r>c_L%wa^J?F2NMlK^wikGTSu_6r^t2{_#Ts7((XB(1(~n%awiV?t8K(POoxzp`Qf1?cay@LwVRQj~@%Z zPv5Ike$=HO|2{s44iwxFPO|LmsmFDm-H;9?JpHM^8)exs);U@MovD}BQ&u(KcQp+n z1MnS9F-IG~TxQg{Tx1?GF6((*q15(?1n6g+l<&P`%$mcs64>BH28>WUSDvI%%|0W& z&2?8(a(E`nSHEKyD@zT(x1_G@)8G9IY#)QC^il{K>rM?474$2KHruV)tw0}xTs{~ zg6vL*&O0Vb+LT9VYoh#KZ0JcZ!cE3%2D@ZBQ|jlkep;xBppZlET^_AdpN=(3q_2)9 zAt0xdza|F}KPd_siNr+=lVh?{tdW)$uWNjr#!;h#ji!LWh^G$80+T}{ zYR*2*K{XCRRS(&FMsTf{ z6=)se^tF_bQ;|cBphMh<+k&JQmj1(K3!$j^gg43fP$Nz$PLmASbZDOurMBPzzOyb6 z^Sl(LmJ$f4KV(BqWJLuMGZi7S5CM)iW<}LJJTXUv5>pdla^UQ&fDR@tD@mWWNQ__m z30!R~mJ;3$T~v!_tLV=>#F>)A4<%e6pce&qTPQ$-AJm1~&;^<> zadjgCatpY%E>L>g3d!FF?@wISh5DllgzB*!0(2Q7I7+DIM`RuZoN(xZ83-SZ5>8$> z24oIMeCUMrKSnN`xL^Up8*11%#957r0Wv2?oIwwLBG(%t)h2epnHeVYn3{$`cE;O; z5xj87Uv?YzbWc=IAZ$`cLJZx}cmW&-jq3r?l{i!kVSeIYL7F8_lk?ja^YO71S-NV* z!$!2+vs>371cdyuW~o>M2MV|e93bo>cvS`k$){4xw8OCYY9JCCVbQODML><_sH-hU zbfoVTFr%DuzDC;xWJVzb=Vb2p{R0+?>I)d$x2r8D_kA%#G|8a65`)EMcpUvx#>5vA z{ufIWR-TZ)odOZ%bCDnvj#U1@93REukD$Mxl++evpa)7!9SYH+hi_Km<}HV$Gt1X8 zh`r1g_=`>pY3+L7`y+q z4DCvr12fL9PGZCkGNkk;$k<`7v%YPH*7=Lqhh()nXy>CV~>=FRWs4B9(F9{uS2MGXPPzk+%$@Yb3*N zL1w0?>ru-w8Cd;s50N&qco}%HtY3Z-Bn0^KDY$mbc`t?;v`3&*wh-^D?c746c%*G% zLZJJ7NepWkYZ{PB%wT)t^Se87*;jBCIIz@eeBJH^dU+R&hn`kIpu8N6gtd-3@ytOw z=0Cb$*smhJ@3`v1t60KnLyD~;{H+JS#W)tGZywnh$8SSsSXjLUD7mQLMi2gjZEIQyuW#pMf2$?^xsnsQ8T1nZV4>O^mFAF?+`31$*~4af}?l&P-gksZNlHzhGL0LESsRtiXugL4z~f0+-ZQzD{e8{VlEopJ|x% z@;7j-#ja+^RGS4PEz1&~X{6tm7tG^mVXSmg*bL$7>Irf01!fG2NASUV-aPY=joD^S z%;E_bm%(`tWsA6PVt#tyrQ8JwYvOKN1|G_`JLb1`%65I@teOjG0n6QXFm7xRQkUffiPAA#WIlRzm1JOC^I3_?t)D9RD;q$Htc(yWNxqXv# z1;vS2@|NO98QGsdDb(P6vrZ;)CtlpBAS>I$2EJVUwZpGkH`6U0Ib8WgMs(%IQ1J)W zwN6xf80iw8Lre?03@# zbbJIRsOJUmv@~Z1X4p}~Az%`y{15GnUw@HxL>;c#)KtGD&v`GEdQ^yjRl5eO9T=VU z7Wb;aSC4iBZJVZ$trbiipsiJ1^-jBJsQuHjekN7MAPH}j^h-cR~Y1-^T~P3|B6jk)P(I1vuk z^{(!g)cN_`i`r=;g+6STy*sQQPuu=wgdGH=yFc}c`TkRB^6>mJm+8L2*sj z_xtm~zPqGt2l4MT{ZHx}3<+Oyqz#MRpyjLmM_ zjeuXLm*4kiX^M`oO0S{S%qu~yuPt21eTD)}1;=e=Tg-f3H__(DE?^J#1z}DbmXF*n ze@)Oko(JzDZb024J2IM+W}qjF%*`_2yfo2QLqruK!5`~ zJy{2xqHq=nmf4;%IZGe_M79U>WLtT5LTgydsDG3RSt+-=he|#Q_&#g5aUpta@*7q+ zND#k}2T;VBr0yFD5ukXuDV6e*T0W?AIzGmL_1%F9@10T$N-mLM2@~Q0OUe;`iBvzi z1NlpGZE)eZ-y)d}g^Gc_60*G!|9a9hpN41n64Tz~T|pGh1KI4LDr-c;)9%{~PSh6Y z@PY+^clPdq#+AWAd0MJ39%MSGn>tBK5d=sT=746xW_!3yCR1*}4qc(mGg)LUMG3!h z4s1MXvXfqvG;almHNmNG$SF?pV10;vLkETZ^cJ60lypoaQ_k>Klb_Tk9>jq{{rftt zLkzaf$p&Se>0K&+D9C`!wGs9&Fd4+1I+@(cyU++lIDvtd>g}H~cy8`AW{i0v24-c#s`pB%Nq3gsmR6l)J|%Q#u5c0BDk*odssFf84HBXmWJ7Ob!{C#?@hqb;Wb6 zUM4!|?coK*ue}O`TsmiTeII!WXCL_hS)@EU74VSY+FABoOr<(^c1Qjw_P%G9C7@u!JT{gKnL(L`U?5VDm<+^X77@vN&8Di7$69_Yp!$Eq zm=5>B=~O^H8BFttLBxW!A*X-(BS(zpVu7N7*nyG-Z+*XmtRbuIMzX0LR#N>(7?f3e zv)-e?+QL!kYJ>*vu^DOagj_$D)7oiaI%X?kMJ<7)=qe@Y>??R01snA(fhFmFXgQ|c z1tlw#dyn6An7r=-#(5%;LP1@k+vg6GI)M0hiye*gW(vEa353A;jX{67t-ATsl`Gq@ zGqGe~t6Xew2KW2*VRSoWgK6>8&P0x{F#1%?!;UEL^>B0UBIX^H(?|VYSy5g!c!^ap zVbZV}j{3{Zo2?{I#@mEu#LPqgq~hO9V#?He1$BJ#iR;;<88g6%-bV4J@rtNC0=jHJ zsa+E}dmuoJpoc|_BE|xZZh%m-A#jpe@Z`%=T!I2pSFk`2cw>{S1m=)Ie@si8>#iIX z4p;^$(0r^!FwjiHpq-+;M-$sJ!p>MR!_U#c0r|zN3P8gjutq3U@{ba3)?HkZ^OETOl+l5*f^{sa*Cgd*6%)HvFzISb1 z+?qPO#yk~GnmYaJJdbM5G0@s7)#-h9_1_39wBCB#9zUf^2prRV_jt+;P{DenA<@zq z9#ef4D;{s!W&DIvdMlqXcK+!9rv41?dK9UAEQ%~4@RSj#{{3cGmHhSNzBgXA!2C62 zwG+sZ?~vWB4p{62CzjMEGu$F1CknM*Jqw@7#{QFp3ImvVN_-c|$J3;W{-pVgxeEJK4C-!fPA&(#98t{4kIW<KLm*EdqW_}qmPwzQH4E^9_t;0@bfT0r@`^3M`~hFl4SZvY z;SGEee*J5?MwH`gxg@P8;a6O-fS4<;;N}LtuyFR)6HIvKAArpI1JGH10K`xCG<=OD zEAEQxN2yCA1ecK)JobOA|0GWlFgKlG!Lc@-9*3g-lZZX2uB7Mv(fEV@Z-)NT*efn^ z^YgXb13FuBp=^)QXIx$r>p3P=zz-la{sG|%KQx5@4LIPO{lEA1)905$R3gIJbQ*rf z{kd<1d3@iWi4bdlzz^kH#VdAj$xm11#ZTml3q7Z{A`HR0=gInK6>{wO+&b(0qOle8 zVrg|tN6FRZumLB zs=2R0zu#2?U@&4;B_q+8I}+V~kM{`>aOx4IDvfs+36Hud-%g3lWfk&n9l3w~8wyH` z%jNC;cfB4(VW$-f^_(Y~gCr~NDPI2)y36Y1r=%-j-kUQ%62^bzBdEY8xt1hS7T&v|9i3EdD)Kzt3@L)5>w!@C1Nw1wobE2lY-0S^HG)ik2EMavm4(_=J zfm8`oTVG|QYkPuLq{1+IzBF#$7ImR5h%HJfz3q4mQQAGAEN`6r@JrAWI#Q`Er%|)6 z)r1BRPbdxSvPtD@XC1*l7v9ohOLKJWs<~7XEEKpFv=o!f(S}A`4JAke>g=>OyEW4h zdMs{wYNFI~bB;F5ly9r(Tu(jdz=i}G9WIgU8BB_%CJ0W{3PwF1TMJRCzoH$=$Y|rb z6J;QRv)R}AVo>7Y@Kg=wNFl^{&fFx(7!=JCxFCsD7VjX3&R6PH9~bFDGci9^Sf@zGEiXxv)yw6Fx&8*YR{FdvtnMgwG+a8U6a`B(TjFm)0%Oo};{ z=ouIkk_vuvUkj_0$q zH>OHWeJiGtZSj>zjFiW|uWXFzC>J2pz-+g_6mw*vOTWn&1f;Y?xmBmJZJ}V-1C+Ei zSbXB{<>gODY+PN9L!s`rWeJB^k;Vg~l9ykMU70`$pEGezZ>2$^zy?o<7)@9U)`CjX5cy0QHbXhS6Za27;Q#iFisJw5S@fb=z^QN)$W{WeqG9wPz@8S*h*& z)zT!kZWxnty2=deEV~0_Om1it?hHmpWLz$2G_KCeL6p6Isq%iQlz2{CWNKSyk$9)u zKjltaB@0sD^=Etz2Qp7Wk-e$}!4puubXF#JPDXKyB%vrFmiQrX+ACArE0dANW+g}B zY$G1(L=KUc44VECu=Z5gqGEGEsq6fplI^{|=iN!#wfe(9H0wUfRm5CtmhL#JBp;lt zBFj}m84@OolQz^rZgz}qk(qihL0(3V^B=NKUS|3qVpKQHRrh;T9-@cYs9QM$*kp~0 zWs)j|#3a;*xyYMYRTz*qO__#E*!fO|(Y`Uo)wwdo)%s^DTew8MSIjI&)TN?va_Z>z zH&t1;JrD=4H*QpOI+7OZ3b_YR`AGCaVLkT*S5&h(7M-cIaJiU_g%U@Hdm!8IgUp2@ z=F%%{8b>(`Wvpc?W#h?Hr8IU=pz_h=KZW!bk6`lzDx(A`K}M0=OeI@NT-?~j;v(is zn%gG%$Z$m>+l?Ebg8Hn{4AfAzV8>yan)_va+&RZv)jjBtq5V&sXexjD`7 z>QYRK#_S+32xHl$i89s3bY}{2#C>p9I5(jGkdi`Lx~aMf*#UxRA8%oh8XsZ6KQX(r z>3qb+9`%x}yvV??j7Xs#Jbc=Ndxw%M^ER~Wx>m==Xe$aax%K-q7Bo4l(^d{A2q=N` zS5*wJU;q?MprRXkcRT!0NF@4SNnbp07!;aLChuO0)qD&C)^eOq888iH|4t^ah|X1p zisz>!zbrQ2O}+ahhz1D`GM2F%#tfd^G2%Y`>vk{PZV8EQYcI#wU3$nqhgnLaxlT+k zaqM?6wa;CANSrM9_jk%@AMu})@KFtOl16cUSAAZ%)|X9pI9?8)zqSgVm@n~bFv#32 z9_|>vvaFUXdsj@4d!X1^y5VHgUxALUI@{YUgSMm$#M{AmbMI)p%(@oakwX6N_P{iA zD9%X`(kw{Na%yUhIH2;VzE>6MidJ3Ihll9-nI$5+rj6cQL?dukzJmW1%+1btnZEPR z(ezacs-{h6^vKvVGH^*SW2rxHWa5r2N%Pi|Gh|9M7+xWUZZ)P#Y$CyIU`SO}k%0s) zlm-6%{8tR<9vktPO)NbeNgnBMGI4Mwe|G(>4T&M60aOcNflzQLAubGvC0IGMAXm;( zhp>Mn(4`SiBv(LHKrb>;B3FMhAo0;-g9v@fw6j3nPnFY(# z=ikX{4$YAzDLjp6jL5ON##cFbj*gnYbV|8`k4{1O?nORi35ar{D@7r#OKtiVA&ENvcJvr(ACO4zzm zkE15lQ1ylG`&a6rtoiQ7q7*n>PTf1xty;YGzmxXOp(QDJb*vIqnpz#eGzOHhY7NbJ z(OU0e>eJ^jlFF}JswkRKCZK`VyauC91`=^*jlcm|vw?U5*%AB9MVj?R5-c6@dru<$ zo;2t!LGFl2BcUah>0=Ni>`8E~*7Td-+cHD@ZtBrP`!6)KzGk(0gCjQv!}Pw8+KzYc zHs8xRa(`&8w&Z%5h@O+;MuL;%=>2WG!AY`6@tGq;)O#g`KrW6>s+<>fE=10y*c%4g^t*doJ}#2N+P&I)z8AimLww%K`d&$` ze~Pd_os1qHy6q18voH_heTOZm?O`t{lnO9T;A6))8dm~!zcg8G1WlJ#46VH>(I&6MHPXY$JXmh7Dg+) z*BAbY{%ie!h<=Cp`+L#_0!N>|FJYE_8sX)_5qzfmIn-R0y@Vkn-~|;z+fm){&v%Pf zAtJdtq{=NiNZ~o5y0hXf1V|w=r#ckwY`+-ee&dwRvdO?Jhg(B%JcdlHvTX#JF8%!7 z4Vh|%v^?vPcPAw_QV_Um1x)K!fJU21qd zmnUEZNLNcxs0^IUoNi@a6P`T42>_vCJF_seFd31h0z)Ci3z&wrm(1DIGGYX*Vh7Q6 ztfW8su@%n#1=2k^grei9=S%~hG#FHxJmLnA<_5=b-qWM}`=F?*3p@gbqRg<9_*>?C zRpz`qmyO+?k#IwuzE9HxXhGXPx(pCKyZ(nw*j5%(dH{GHOV)yO5`MJ5CmCDCGE$k@ zn+CRmQj+V4(=5O_5V{1fBTVoFHk1{$7(I9iQ&}ZG@m>v6St%Z`oX4~|_e-a5Xe2M_ z=L^k+*#w@S^hIDK-qx#>)(Z`Br@8`r3Wq7Yum%Oy10F<)jYU*wh$wbIEV=|+X#P7m zJW}XVkd}$5fjV6-Ty+6}0Z_f&L{$C8FqCe~p4}R0bb#8@L@LVP)8&Xmg^5hzG$rO# zRr)Qq5{&heBFA)KtnQ3q#v_iypfQ)8oaz~c9+7Bq($T^3Eh=jkxX{Q{0=y}5ulQGI zLV7tt)J%Z7{b=>R>2$S*el?Pz9B`p2J0_zk@ASP#Ode7o+GjLk^tu_C3mD2@EJWuV zCQo!))&}8Vnn*?a%PObCp={#htU~>x@i5$it<%eF@GD%|_SDp$VyypLJ<)h&BWXFM z$%s*|5F#{iF7)8$AAd`-t7sVzV{rjt3t{nSd}d&Ba@$~hWZ!9b#l47SZN<21a{jUHxzkc7un9i<38_tzX~v`I!sNwP2@L~jONxTa zdEEg#g01V7hP4B$Gt}f*KrsvQ@7TdfrDVry4I?iQT3j*cF-c*-Hl;L&Bhfh0d(8yg zs#LdiA*5}$1B1o_&r2Xvhl|3KpK6mcx;VjkVuX1n3BLtFGp0D1fZGm-9$OG>L`u|P3tNKIfp{1WYIYdW zM5@Q`0Lr0fZXc^>Y9Fg>JpZY0Y(Gn{Xl{(oE)n=SKNvwUB?+!}5M#(X9u<05xTSan zoR0x_G$IVV+Fuo z)xKM7-$~CNUH;4)-S)-Rz*PC$8pi!XsUJAQauYah}W zoAOb18|+Q{7@M~~6{iOWd!sB83u_s+R-47ORO?G4cVQ?3NRHMkKO+WeNGOw-4Jv*vg4&s zsm7c5LZN(h13s8|I>|IUos;_Ru{fL>3pTjX6Q=w=(9mOS5BBfA>d|8^?_ba^pI^|X zJ}wbf()*n;!!9rpF9L}O$TyJ=@&7I)w-k{%Y)EajB)h*^jDv=|0Jx-I+{kUo!!|e( z+IstDpLya~q&sK_gm>x*?za}usJ%?Y;JvM6Put&+cXI92INDxTL7Q6k5!;CAp~II3 z89oH1No!60MlOmDL%%cwg-DA8*)=7Dq`pfj4^d4oea=eK`cw#Mx* z`9H41x*>u+E#W^dnjd2?s&J32~x>EkP-w_&ah#bBGSn z6f+q>GDkqKifsQWu%+6@fF3UI_8v$A zN}-@}BEC$(I5Z_9mxVf^a!e>l0z=A9jZ89anOJ9kifka3!|<t7v#W5Z-1_rW_iy2*md^3SZ?38b!|))0pzb_@=TaQUu^?rH>z9tbW< zmO%^EI^9-+Z<*%_;*HcgB_Yf)5Vnw@SH=C+>ITV$YHbINmBbGZzNv)I1uRxhAq#Ce za94i=ev}hLc9e4vIXM**jF|RI0{QEvh4L8_M7ar;QTXS+o{}> zVP!{T`P~-tN9fMSq1^NPyWI0;5(NE?4yJOxZUvBe?PueAQw;l_P$WA{sUGeihV<(g z31ta~;}ar%F{I#;h2SSE97!|Nhzkc#i0T2-F%CL$fXMLTO=!;Od6BUwsLV}^`}pQyPY`l$pd0bb%Y z#9rb&*U|c)u3tvhQ_dRgp{EQmp7dw6vmS7*ATtwHDA&p8*Ypv&r{tn})sOeq?=EDd zuM>IZi4qE!aPCx$V-gG5k-|hGXNo8lZcYS+xwPg;ty^!&Y z%ji)kF#x7WF(gB!joDn*D5@!8$=Q~!o+2I&NYq=D@#qYyFq$4C1d$u3aFN75@?Qn= z9$aA@F(SbOm@isP{Z1?7wSi;BmpHb}$km2Aa|Ye!qc{^HbUK3&0~V7yZT@$-5&;xE z^uPPfu$M=dqk**L^HZAP!M z&@mym24IFwr%i%~+limn0YEY45FJXq-zarY^*(Pr!6hM*^uzW?b8ZLY)SP2xil1DR z6i3F6Es%)ct7k^mXc8hJo~bxGheyeq0|dwn5%KftV}2LUeQq;ZTj5X7fcKwP+R$}{ z*`tGZ#zG*6D8k$|SN9?T`ICgy!ja838P2v8>g#ohs2g)IzhAp+!3dgyWO5anBve_d zFnaPjJBXkWHzAwTL;9t5jNCrB@QlWH;{aXXPjt+ zZ8B^l5U5rq6yGra_}*U&mSA#-U*n*9MX%}ST9#0Y=Gkkza;g)UO_+=@eSe^=Bg;QZd2QCRNNW!)4WL=Qs=d&-Yah; zA@ccItb$#|U|-%C&V0kuWLD68&!jfpGDDT69CB4e!JNlakpI-LNiM~ov0OiGIRJb_ zAFl2^Kf>CzOz}i*(%HgSpcps&G;ScP#0^*5@eV8ml2_7%H{_$(IB;wNuKmp^IHY}a zYA`+WMFc56ghF&+Kmb~T0ldyfD3HH?QTJ^I$S`Ocu3{P=HW#zNJJ#gqJCmbZB47wo zE4U@B7uW~P7cj4D{ZY9c3AHahYi-FaQ^7DKbd%BPSUdZJ;IfNpwnzb?G=vLE*u_;M z4?f4hsoSKPQkY|Layx$|d;dgCuGC}0%XK*nnSZc$AuRmzM&KklF=foQV?bqa*2zlp z7-vv0a8BX-xRt3>-4^?Zg17Sd%XLb_SN8z-y6ENdp2T}M!Wb^B({mqiw5J22-^Q=s z_-)2>y?f2v*F3-V`#JlsbX{SzaT{QoX%}3kyrnzUc2sbn+6D&67Xsn9x&!p0gKS_? z??{_^-B$bX(vn|AkT6h1v8Eq``$W=iu%t)Am1CPeADBEu_)htTh^u?q4OaQ`aAEJ_YJ z8+JR_a6a%k1YJvfiYI|MbXL{|{%qW`Ohk1EPs}?H&3Q-o5@fH7%m2Gd>9u9V-&XST zFM`CRIe{@7dLaP1HZDb8YztM{*6{>8D(w@cO4$?rLwlf>YIk{HY zo4{enclQKo$ci_eVwbw56{3ulNk{DHeR)$MeOw+G%w2JNoSsR5_#XaUAK!U~J=`EkeGpw2t9E8y`0GmJ%D=96g=Bp3xD%oCP}SG=eBPiCfSvmi3p`WT&nEG;+xA z$BEZ|tDKkVoghPU{!OkJloyoQb!!T^NboeC(}W!Y0bvhqGqU*kAIw zwm=f1!vs}?CDVfl?0GQe5=nr#QXDaIWB zk3UT3gQ-boUe@iLa@zfxpU1t@b(u;O6ubdDLiSIVq6P(z(ur&pG|5g2ZKQ4BXem4f zY(#*Qg@K`uUpUl%{GdZe5!f87MsQdqFZNt<8Jcc!vF=%WZRT+}^v&8s~ z5gSWNLWUv(JM}n4s;)Y??erk=w@5+kMEwv}LFBj66gJnh7-KUf^%^3T(4Qt+`#UN{ z@&+B(a`;b!(JI+}U#N50sDzJ7c@u7jM9m~ehs5T}D^#?#KYCHHs+C^6=M;VsiNKyC z{Af|O?tOj0s4T0bqpdu<24!idJexzi#p9qnt0yEN&3SX6+Ni2lYN{66+`(GoeSMtL zI6Rq_)R-z|+JUKwPjLj(D9U@1GCVvPQCvr@tesn=9y*>?)F_L2lDwWOT`1`=LUrwz zeOPyHH^q^*L6Nar=lSOK^iyB9&m$6_xy`hBJFl>{-ZW8qTo$IyowC$JIs$7yv0ttsy=@9EUaJ3xwPUa(xNiAlpQ0uQ0~Js+2D@QgImWo#+QTJ zIwWIdsd;=)?D8(`gv?36m7PgKcYTG_?;~?I$79G-g@mtXtBlQ=+p2ST;`LmNEIj3ktqh@|(2x#Z5P=Wm0Sbi3UaKQ&Ui2B(%!D zB=1REQ}IJ#Y)vYT=mKpKCbLm&+%n?1A{| zyVZl$CDD2PQ@fA7;agJq6-wgMY!*zuGC6mP(irV=;uTEqiV&F+tR%g5HBA%_OAesh z^^If4YvN0zDgijq^+T}GAeDZnlzzzS4;pVDUW0*?VnhoI8Gm_9AGn>KZVzB;Y=<$Y zx|2jyxy6jzm@$h+&xBn>#OzyObEU{&|9ZtYPtg^Y7jfa0G#_GeEyepJSU0hnvhB|- zH?#WPIOKac!YJacHCx;G0|SvpnzQT=Oo=(&o_p~VBRCtAteniK3kR^-Ms#~PT4uZ3 z7!ser|DH}U3V&2eMC;FS%V-kNRySP1RYTP`bDOr+_X{`Do8#WNCM9U{%lIj4A}3xa zvRAS@?=w>GSJq`DeQ!?f&XV<9(p&680ew6?3y?y{-{&5fK*N;ok-zuy3r{@`0I6R= zyD%R9$~qzZ^NUF5>K75pQ>~HDPwDwEJzY|+qBz`2w9+q6j)p$9iMLzW3t`YlJ6M%* z=C^;QL~o}UR|LNG-%g4CnG!~OV5`wKJE1InmA*{M&9df74_7+0BuzCObKuS?eM#UM zy0T^JlzXo8b_oBr~F*pUBe-8nLQbiZyW4}^S%1e$!B@9`F_uWRWnu@b@31 zEP{*h%7h}z(~+~n@!A08>|$S%M~otxP*nrA^rAu%;^Mr!sV778BRcFNva;5Cb+m9L zbj3BV3JJn;Xvn$j7AQeG@K2MkYFLY&hYO>+!}C!X4Qe*nKNT4LalghE0CmJL8~hY> z%E_1Y)3UpVzki*spDHEhJOT%gJg~AQUOca+?M1xHWCOO+UuH-vU@;kA0GAW0cn)b2 zzEw{nAG*VkY5^u#kO|p8?z<$>rg36`Ax4LIMR~LCEV5}-n%JlyD=xhDVWrp_y7uxJ z*-+(5IDJuK;{0WNN2~)bXDERx3!CvFa<^TYAtr4&3Q+~@N^r3)mby@8tvsuI*-CK8 zVz3%zX01_XZHiqFvo#hcfCGj#TyBxG4gszaL1Kv}tAOi@^s7bF4hJ&qmc|jK?R1?U zc<6EfwhxM&tIOjhnG^w1*q}~C@3ITy;T!H3J6w*bP zxRVghaIx@p=ja}&qQGdJ0lLc1$fg`bh1Gv9Z3dh70a&UeeulPL4(Cv#uVj&`i-f-) zEGF;pd&YrXkjX~il~-*V>UVWm2lk{rFRbBYdV}tNK8X&+r-GO0P|Ce(>NT+xgSW7* zWIK;)!kx%yna|&D9oPMKY^|c}Dv9eJsX2OIw)wJAH*w^{clpW3 z59Pg_@ej)>-1T?Y?;p?(d*P37`P&VnEmqg;pkX>8 zT#8x?IRpg{f`OqN@^ofd+9Mq&$kkq!t#|(go%7V2T zvfMB8a3_3Tk|gqtI%bhhVoUa)U6f4;s3ImSRqr|7ie=#_bQ$=)7+(Fh)mwoXTeEhm zdQ8!*pfvoo&wGqTuBk<{b}D+r(I!$_TV)Jp0GUW-UD`~WT3H&hel@n>B8u{=1Qf;u z1W~6DTgL!d!N?O67nIZin4m8C4roH7Uw0R;3-HekeixnM={3YL_um{qH=G-& z&IZpN6z8%Fzgw#0-iNf*!WR8|((AMXyLQ3`!$eY?%p%M`MyfvW`9i_`Swb}7$z)n2 z;LDlO8a-khDQ6H9uFNCU1oUPEq_lqN`^QPoC}qumQDT0erpbe%_1!|d>MTBEZ=>X;N+7PctpAL$OAhvK!(wy9Z~0#R1uC#k};+itJ>u8 z0p9Wv?{|ExU+dbxMYb)6XbM^M07KbnR4XEQa)?SDlWMMhW`4_Z-y$*CvHbQey2L(; zcGUU3LxXuoKxSnEG0L;Y#~o_FKKlL?rqTlcUqPt*nSR_A9 zmSj$*2O*E_jjB-**S2IT_*{}c-6 zLj ziB+y1zmtJ29)`gkrzZ{h-FV3iN<=jA=fTf(6d8wfHrbyoH`cZH!grD9X|ICO=86{VV1^4MM#AFFCAKUZHf zg4RH4(sVsQ*8R9DJw?pwnC&e2d3t%nJ7ty{U&5@I2nu5AN9(60hse3qE*oc!UH z5l!V!oMF4BP?J+u-byn@;Q7EAK*|GSjz5uljq!-ad^FLX;5Xw@iP69Co84TBo7F7U zbw&vc#QyX zvUS{)lV_erAh%M_a+^F-c0GSXS`c}#h)mZi!hw^yM(#>K8e459MhvF1Dk$EdT@{@L} z@Iv=H?#V@bJ{kq!8WsG1tM*SF*@nSMh2SLK{{ZtZn1DST#@W zxPH&bgD*fniSEqf9m~8E(;OEwOh{B)M9jv?KTW7Z*UJUE_dFD%xiu)SR}&bZrx+08 z+(QwY9CZ>HU7@Ic2;7&|Jic8=iBQs>oSePo? zFoag1g-`1H2#Trevg+m*U_oNaOYzcAXQd3O;@)8r#BJl zBoVpdr!kL3!IyC{aF#3=rBAelPZtcKDJ?sM120btrfesB9Zj>hhM_pQXgk^(I zD5XQ~Fq@jP2AOQ#Zg6t0A~T(g>N9IDqcwJ; zPvof#w(x5P@w*BNIXr)(fOc95HVFB5LbI+~QtN&tk4B#yD|G#4@1(KN^}MURimn;L z$IJO-!@px=|9h*$h2N~l-R;bWU9PRQ_KZmjY>)o2d;i!iu;o?#ybVbDSz&V<%W-zx zW8P%?pKT4I(K0AJPnMdWFXJ;!bmKf8PdC+zX{Dr5(kMLl4zLN)`PkYETSA@|(wam) z#ICfKzs>EK@_^DLi<$K?0nx$6ezgk0$AjBGuXSZSr_1+!OXOk2LFY#lRax`v{vyjkk-@R`gl|6=x8uOhc%;#s8kvGqh)_pQ!twX`u;$Tt{SryHkU@4` zV?h?ByjJa9{1W8DWT?3m$_b#6AT4%THHBAbG~^haqMp(p$$-kLs zCgOp42(aHPCv;)r|?ciGzP6cI+hN(9h($Wy$L2tO!tXI|oi0zjFHAXlMnHfJbh zF3R4+eYDS{v_KQA@C+^^S{@^;_}1mqX(y;_&YcLzrfyU!>m&_1&MzR=qayOZG6G&f`4TJ(=)KyDS_-CRMNij_oV+K zVo%?0fey%EOJ7Eph93>?CPEn?`gZ=R&UXCW(_!&7=b=})O77y3KozJ zJCHsMun>zS%SMm@B`WcHVJq=sMPAn-V`3R{{cLqO_S=4-Ka2h;xSV**m6bSH{n#6>{c|ynjp=?`)J_4A2^E zr;K<@i4saztDF)trH}T8&Q^pjUFt+>18r7R<7eTkIn4t^JQ7* z!JtcFK~BG7<&5$Oxh!GSlyWH< z{s%oseC=99Meui^$t-7y94fv`tkOap7yBSjAt0nJ)%xTQ(7%OyTax8OQf5X_(W2Ms z*x8I-B6%#!Bx@KDbv?V`zW({0AAoVAkk8W@CW$|tOfF|ubhpmdB)9f6kt90YSHv@C zKuGXtcFA#=KKbU^Wu62|m$!?%z&>YzdaC~@TV4GA8E}y}${u5N!Hh7al@>V}$k;%@ zm#{S__jN&sTXZ0E=<*t8()0$0a`5=e&`atMFTVVyU*UyYD__E_oubT42uEal?o+c% zw{kfHksQ`@I@UUmct}Z$2JG~6{1g=iG>)WvPuy*|co)&>r52lOFaz0*KoY#;KQ#d> zi|&&_7&JKY?CJ<2-@wAu>UWRecnCQ?%MhK5Y({-@>#}}2_;8=K4p^m)Eto=q9eeu| zvP+nB%DEI}xCG2R`hkpL9=iyT-H`KfT{~fgX}|#c7LS|OdTRPiDpe_S|G@{pvlj9$ zcRk+;6q2#k_`-6TOMCGsy1y^Tkqdo$7kI_QLZF)qPglnb)#zUiup&rA$kCIq=Z_-G|Jo{()e0J?sz*&jrkSg_FZ zSib#~-l$Xc#^hqUfN@Y}Mzf3QHIQY{i^ASpE~6St-k(k{Rz9NA7@XWlMek-ceBbTK zh!x2unEJG*DJ-qyoV@)R)b(M-6iRuOT13*Cs^OC}s*Wj?(kl5uvk+L%zB>7$G=imT z_3^_vo`^YeQT6UaC!R-^j2X9)lyiIX|7+y(k(~dP>88?_tr-6QYGdFK;Y-6o=*w~l2z(;pC<^FX zEA|DB$SR#ueCtbR60*!Htx|dq&H9NGHDeln2)NZdp(%g^*d@#zd@w`@DO=mRX=}t# zu{XnxP9$V4XesB{)EKII=>2;PDdsj*&aNi&X27|k z$7L9Au!#3KhQ-0ecxw*4Ok9@+d@_CBH}Rs#_x>FRQc5LH2!1cBgV)qM6ay{4!3ZW4!o98KpMZ`$3NFs8b2cb9Z(eengtb<{UfI_&pUf zhZ!QsjyMTxoQ+u_xu&)ojuRkq|D&4C3mKpvtY5?yX797;B!1Am{Mdg{YQ`wDj2?re zb`!x~MHJS>xIIZPR~kiUIXLF}tD7A-_>Du=C3KwYQFQLo?V8``(=^5~>-b6Dld;y~ zCG}$I7^C01Lrh^dOeMu(_9UgfV1@O&qkB{cb2iyb+hu{rcV1qBGVxcK-DNAgdk7_e zH;>8}M`I20kOSP9LTLxdOvHi5%SZ~q(C9v$$etPe9I}w;J{S#8u3jvv_yqK*;CrrC zgiK-W)o?OIHZYKFd0cxBq1q)sU$sdaIeROk}nvcgsKjdHIG^}3Zzb$ z2$=z^W`GJNz8+8c8hH^o*HKRr6JIcl3Z|BxXLa%QiCIvm4^yjm8boqbi=T2-qtbYTb*u3mOPevepWb>Ab4r+Q$cs>gpRZc&J7 z7#n6e8WmJ91ErhErf_hvsMi9*-y@4`WX_9Hn7(HHd=j6OlM?cnq_3bm6c^$Knqa&3 z0>Oa%FL>~P0a^v@AuDx%`w?W3jB=?rcor8(p-ZS|GJ`mq?*_Zj$~T1A)gcNHGXv#tw7eW z98G)b$+Y?^@npMbu$-ErHTxR9?n2nt*vrp%RXLE#`*wCZ<<>ZCG;}3wJ+Lg@Nq*I3Nk=pvlt5D%Z!7uR*BL(A&HPuof<)PoHRhpHEk@k^Qcgrua27 ze9BtXiZjugbNeSjg7&8z?6BpQ^&yhluf&Y~_$2SeDs5|q!+CJYVjj`}fckU^T#=Fu zd+3Y|yQP68!!^e23ht7sx8qtl_w zaEsOOUblm-WXP4dhLbTMSV=cF8G>!eKQ{Fr8~WGQUQflaO18B&u49zw=`Eh(R{m%4 zECX*jj|*gL8^!hF5$5O0qFB3I3EaqO6g3K&JAbwG$l>TY2AB_Op15!DsOW_S#-JLn2$%y`+`Ca+k_kCt03rQRIB?4Hf7 z_3perQSo}UwfHn|tb+G|4{UrQsC}tfmqt)|OS3N)RkMRE#vAC>{8@odWr8*!X(B$@$z)adSw4eV&eo00Bas4qAFf2 ze{Vb_v2tE(_%6Qk2aaMvH=!YRDr8IHfaC2%i*WqObf~!ynhA8)JPg?HQSxae5b65C zfwLjSPkg@)sp$G3uIL0oAbTbGSiY2`9q5sv!X1I~g|xrI*|m!WER22rYUIX|POx0Q z`$su5KZ8Z|QrcfV-F7+xmevM;rSn-G3#|({vzFL0_~syR*2z5ZtsIu%R0Oa~hr*qa zR-lSGV?;Mgb0t$ZN1iJV%_9!Yj$vTHuT+MWVSg;5BaQ6(ixDxEUr_9yb|ZC?9)dxR z%oTG{mTq8y7B=bVVd#%aLUIoZnBv+-L-k)oW060^w<2G?Q`KUE_5I0a#jble6f8w1 zQB2{C5mlHW4O;qwd9fH7p?)Ig*>i4va)$BYQrer8!#qf!+^oxBi?)B=e075P#1)Wk zP3#^_%mrBpgL5|;Wmm^v8R9PxavdR7Y=6&lq!~2#0EvP^r@8-pZCoT)Q z5z^=&zygpWGYB#!YO7Y?#0Z7ikMEW(PN)B?m3bF-F)*Rnjez|&a8T^#zy=jM3LxbN zmr3IKinjYI(^<7E{o2=0SI_G8^A}lh`rS)=$J=Ax%ck&OF>K)+TVwz|U5fgeo)+UF zd(2}P%rq>Ft99+QyQ#%ME#`{30))R2Axi3OAH5*~*)Riu5kNf!T)cj8A<-b6o)@;_ z7mP?}iXhQo>~+b|gX5=)i`1C#ulP{xDRQUVb%V~6F|}9)PZ-8bmUc2hQrXxlo6`lU zGRRNTn8mLuAcQ0apJcmiW}j`X?0Gzfn7A&5jT5kP&IT*zQLbHGiA62~U`7~9xdzJ2 zc@r+Dp?ZU!pggT;vsU)~GMbf|3Z+7ecJ}+SO0rDoZOTKfw^68=c*?zd!5M?M19#WD zUWRiEnU-s>>qGK>lgLHmr z9Q6gdIY@{#f<|A9W#j7*9ujZYQv2&(;Ri0#v7y(9u_$|kO7Ob2x#)2c0o@KAzuU^P zdKPzsQ=Eqhzn#;k`Jpv|b-Q=-vU-KFl&Z<0w#>0O=1H(<&SlG}-)K}PD6XDA_VeC< zBJ5jY7dZJVnib%PI7U(V^*vv-qIAl1O>5(h0yADOE0?yG{4;{$&Guz~V&$oV zXS1Mp`_TbpUm;rSfWg?NSJN<&U=pusJHr{pc!G@i?h|3Liy~+}@7%!j9?QJb>g$Rmq zNGZLQGizhZ4c-wiy=PX8!T_wARS;G1LWzWh4Qasg3K0Zz8jBn1BGF2=i(bp84Hzee z4Htr(AAD@5SQwPA+aq{9Qn1-=;y$Tp%ythWkzF}g_e z9uuWZgs_^+DjmP5{_T6fs@Z<{pj$HyLk$0y%xeWRxtShVHS>c6f~?pe>BkevsfwlS zVzYX&GX$|M20`-i2$D{|S-IVR(*0+}h;tu}2a^M4Lx^(kjR%7RX2pmkAc!Y>6j3Gd z9El)Z1(8HRc@S46F6z3;G9PK(or&4DjT5r7DjjNk+qIfTqvGCA?Trv!Ifk%hbz&|d zL+$2ul12X&&9t2`mZMI`*YT}=S#IDV31y7j7hKI;jDhkIiDOKcdFl~*St(?a`_JHmqDkJZk%^T^={zb=q&?Gb4&wJ$fFwHkerm1LZf@ zv5*sYAzS8c&I>+9m$n7~`$n7lHKS^dLV#P2iv~HP(O{)IQTe#X6Mr~F3`jovzEWmX zD~++#-l~ZS+t^2(sC0Z};cv4isvPd3kld}t_cH&v`nQFd*ENux3PgpDU!EIHHMjXA zda!A(I!QEo95a;DdEd|3$)MQtfo|t(jCwADSN z5fNs6&vrXMEm_x>f$Ez%YW`Hmp)48yosHLFSWAeKj{s;#<0_P22K%*-N~{<$j{+#{J8Wm^sP7us^ryK|e6ekmSz|MJzKPX|k`sO@L>bwPtbo z19rvIY2yv8MO3>9BCl&H;t=Bc*d16nztF22m2Q?Zvs@c=&F-OFL)Gu|6-YT+F+dUa?0 zH_`m1a0b;IhvYDl;6SpxKeBcpvR=Z7Qqf2*8(R7}ly31K#eCsXBJ2_hUWUB@6Zk;a zE_9DS!^t~O-Lzab0JWPFNZAP z{}#+(=?wLcU>1!}puE8`6bUji(1OmMoRs()w zKXCLF*&<-NIY zhmr-=X+JO2Io_K!#E(NoNbB!uh3DGp`y1Hq&k;+YM@0*YUPq1#zm)uedM@Iq*=8)- znuq0B8)o3zw(sUbsu>U0fnA|*$D};Rvdz5w9@Q*UE7!xoxI6&CQ&T|Hg-_w9CMv#* zlYAX;>5~fgd0)b`y)n>U$r${}AwTR~%Aq`>sS1?{EFz@Rn}`;gzU>82=?VM`Yj=M^ z7N1JbFBuFH|3M!(4@hDXIj(K}<#BYgT5Wa@1MBwZ?nZ=~*6=o%6{_~0f}o-m z%qzbH*Ab$x)89uYJg1NOgt$MzuBj_%!Ga}pYYu);-bolMe5)_uUpV{g$zX$TeWL?I z+zBPyMRAI;$qG8ZU*Ofvi+1g1LR0J+e@^4}P2gI;R{w=HsT-d)5@)y8)RtS{fq?$Ml z<6T#vK1eme>c_hpwKpbK^I^;HFIM1vTw&Mms(m$t)OT>tK6^ep@yIS^alcz&(HF3J z6AvBn8>)7h4qB=kJ=ivCXG`iWO1aZ{l{P?cvNl|t)TgJzBIt4ya z8V4#Yfh<;zY#`EEcsdsQ#s=ysg^qzInq+%{WPgEVuIAHd&8OL#_MQ`kmVdNwe_F7ucti6;@p%-wxqd=`%oR zxItLDK?`v&y2}Z=D?@_`fJ~p*P=C)I8G5t=da}Z=%S6%IDiZVYMc-`c50>}$Z*I`f z0V96qOR}P3^Rhs>#*|rd#r=Y7duQ3Nw6QH2x_4%=kBK~o=FUpnTp$`}EQvK)ni|j0 zDjuiBG1Kcvi_OTJkBLLOI1|5cE^g=st|Q~RaSm=D%o%GQ0J>KsX>5t~31CMqO^OCT ztVWjRS7on$703RF23oMAUtO2qBS+!LNjLlJ`XBacd7`g3Twwdh6t=KBVqWTsN z9xL(>x?MF~mbi%P$jFTFwm#WfyY2k%KUF;i%J>*i4%;N!LXXeG#*+@7Pi&s+Cy?_d zzdkCkrO_}&`zjK`&=P_WLx0L3q~KJ671xZu97`W?9eVx9Xe> z4f?k)7W-<$qOl_gfV944_Jkd0sNd8-?jG8f^yZ8Mdw?jJ zZMVpQD9P=R$cZRP<1?wfX4&p$s`(t%*b(e#8U3?zd)pLTT9P<*c!nA%P-G_jv0QYr zMhH8!P$9L zT0V9nISDQeJm(yrJ$pfIwkxMu)u(Vp))*0s&2Du#ynqnl&SmK^)Ad~ArQ|EO^oNd*>-b!L3NKc( zl~*3)aPPnBNBaMadn@C?(_(>8`*xVo;k)v)2(Ge0DnT6_VV>z=9(K0=#UNu`pM_T; zMr>*Z38eXH@74ad8Gi$205h`S=K!YgbegV;|Dz%=R`_+~2YL))PiTU5ZHo%H5$(Pt z6#tA#F89W9WolVURq;uF;Zay7xoR_In-F+i-C1w?pf}2x=_3`;ry`9f+m&X$r+y1J zf-X%f&qtT1aRF=k4c+h5wJSxtyzwT5AFv*4$^WSJ7QO03Sp%b{8Aau7V2ZT#?|7N4 zl!O`3inaCMc$Ic#f^SKOjI8sYwGfBCrdYXzTnxR<-TwY;HtX=Mf%!eQ*;&f&G{@He z7fvChq>eC;_iIDFV^`<8cG1BKcc$Jg;l}Gzm}3OV5@}~=!Bwf5K(of%C%>!Hmgm+H zUk}GF9kK4J*yqeH$L_9z zm)C8n4dW%{JOdnJ?p+U+OOI>*IY`tp6A9L0-s6licA8@)4e_*u{`Crc?acFmw0Jgy zNeE*}G->E^v8>nCq|uo8IKKx^ZbvmuiACZ+c?ZQRq1=rr`-7;3 z{>MaS)BKgi&nPv(nWsy3!GX-l%US73(>X*8Q?HJq)(ROlg+oTuKKth%>y6s0wpP+A z6k(Ucbyut}QR0(c&-ORxmyKIq?I|QpejVV|k+C(~KU&+W$HZv~$*3{V@G9UpqZP-Q z_XLq81E@n294b)>CYdV(`c^|A*^t{s%7}$_g*YoP;W~UiRxS zhw(uL_Z7JrsWulAMuyv6gE8_y=YMLdJI`nKFfzNYmuBQnJIl(*n9Gl#e~DRr{eDk)v` zIQU^PVMR5j;|bdJJqnUV7tDzO2wxjD0dL|7PnrRfHg`_TiX#c29cK?509DOl4Sh@% zyZjO(RPg~b4>V9-A=3K6#U16J71vifCST2oN~=kZ2u7DU8B1%aoIKYV2FBZJKRPYu zq?nw6*IQTXq5yl*W0f^Bf|Z-?9iwOm%5@Gz@*{Y90g)=rCnVN#f%Tg_ZWZ1W{)Ijl z&6XPHtrx_xcO5$gdTke|HvboGZygm!*M)lqcZUGMgS!Q7G$gnMCpZKM?(R+q?hXkM zG-$9UxN8XR?hcIxn`+)S-+XuG-aE6_toegeyUspc3f=5}p5Lj0Ui>`UO(CXW4EeM} zTB#BpkObKq|1Hu&+lzyLc6u~^M2T+T)!W@@>vD`^ zpLtA1xQ+PPtISzb&pw4+H?q-v^uM)72`w zgs`DC;UG3vxDHI9xSx*1gMST zJzCgxi{#I{lZVYwJfoX)D}=lx*b<8_mDAR1d#sEEHqy`@cYBcuBR?qzyzR<%nqbg| zUjhjKCkUVONEzKFY*$kd+KCTzCjJB^0-cyHVXa?R7*X699?9M8Me@AAQ1H#+gle?B zRnvoj=B_LDMuO;LJFvGAOXcJ2N#cI1CIFegd)4a; zEx9koNw1+LH~!s^Z(LTwLd7jddfy&BK5m?vh#^UZbYt1-W8e)&Az8ZsGj{n7d2Oh||amANxPqO6Rjl;nVe;ti0w8 zvg7)|9q33`pexbG1Fg7`;hFmyUJ|+Z=m!|05T`&ZZf0y2%Jo1)U1{R&SO-OpJ=sVx z<<~v&h7(DI0lEJFR@?!UVUb-($0e2!wNCbGsnVL7#NiL~EnrkqyI4`IFl$q2T)B4Nsn z)OfA&5PBU>0i zQhA@^a9IS*dgW5T7mpG7oK4Hw12GhpkP(azw;qg!r{@~*t^?r{TNVFjK%|xw`1!9$ z9XuwCbX+4;zeCaPUKMCN?*RNnVLRJZ^h$$G)gaRG&I$QeL#Z@+Bt0~{a~yOs)1jO) z;L}K%F`jSo@#SQu@y>?~z!0f48a--YNIE4Q)YmPEM#usdf|CgOjIS3F;Ls8BiLI%P zVKwkgik5D?Gd0d5flR$sLxP4L_gem>QlPCOD)?PtS$u8=yq-x9%?_|5abQO%VBScX z(I|8Iz;aGgT8gANJik^#E{L!u;|fd)}N-j>A>IERz?e7W^*S@3F}z1xUhvpp$j?N7*l82QTj zAeQ-bPKD@FRZsb0M9J$wt1oyQ}miJ^ykbH@r9t}aIN8Bd1pVW@U|W;RvM zX6?>xr5QFLMVcqm1lBmNw9q8vZAz;xMax(mnwxa_)KgaRF2!_c?uCm?Pg&`^6q6x9 zS!V1h0zw1BGW#!I<=93s1lT7`pC_1n1?R81ame09qu~XW;TE5WsKv06eK{uY!BBIf z7}0OOb#@wmJdX;%_bdd2Wk|+U(>8t9%0AHng52!4H?)7a@o)5i5betAJ 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 z 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 GAP)euFlKE4 literal 0 HcmV?d00001 diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/SaveProjects.dat b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/SaveProjects.dat new file mode 100644 index 0000000000..cebf93edb9 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/SaveProjects.dat @@ -0,0 +1 @@ +{"isCheckUpdate":true,"isNationstech":true,"isShowFirstStart":true,"myLanguage":1,"projectList":[{"AXIsRAM2_3_max":512,"DTCM_max":256,"ITCM_max":256,"TcmSizeValue":32,"dateTime":"2026\/01\/23_10:38:54","info":"N32H760ZIL7_LQFP144; USART1;USART3;USART2;","m4Linker":{"QuickCodeSRAM":{"Size":131072,"StartAddress":805306368},"RW_SRAM":{"Size":131072,"StartAddress":805437440},"heapSize":1280,"stackSize":1280,"startupROM":{"Size":1441792,"StartAddress":352845824}},"m7Linker":{"DTCM":{"Size":262144,"StartAddress":536870912},"ITCM":{"Size":262144,"StartAddress":0},"RO_SRAM":{"Size":131072,"StartAddress":603979776},"RW_SRAM":{"Size":524288,"StartAddress":603979776},"heapSize":512,"stackSize":512,"startupROM":{"Size":524288,"StartAddress":352321536}},"mcuName_packg":"N32H760ZIL7_LQFP144","projectIDE":0,"projectName":"Cube_Config","projectPath":"D:\\RT-Thread\\rt-thread-latest\\bsp\\n32h7xx\\n32h76x\\board\\Cube_Config"},{"AXIsRAM2_3_max":512,"DTCM_max":256,"ITCM_max":256,"TcmSizeValue":32,"dateTime":"2026\/01\/27_17:19:53","info":"N32H760ZIL7_LQFP144; USART1;","m4Linker":{"QuickCodeSRAM":{"Size":131072,"StartAddress":805306368},"RW_SRAM":{"Size":131072,"StartAddress":805437440},"heapSize":1280,"stackSize":1280,"startupROM":{"Size":1441792,"StartAddress":352845824}},"m7Linker":{"DTCM":{"Size":262144,"StartAddress":536870912},"ITCM":{"Size":262144,"StartAddress":0},"RO_SRAM":{"Size":131072,"StartAddress":603979776},"RW_SRAM":{"Size":524288,"StartAddress":603979776},"heapSize":512,"stackSize":512,"startupROM":{"Size":524288,"StartAddress":352321536}},"mcuName_packg":"N32H760ZIL7_LQFP144","projectIDE":0,"projectName":"Cube_Config","projectPath":"D:\\RT-Thread\\rt-thread-latest\\bsp\\n32hxxx\\n32h76x\\board\\Cube_Config"},{"AXIsRAM2_3_max":512,"DTCM_max":256,"ITCM_max":256,"TcmSizeValue":32,"dateTime":"2026\/01\/28_09:58:33","info":"N32H760ZIL7_LQFP144; USART1;","m4Linker":{"QuickCodeSRAM":{"Size":131072,"StartAddress":805306368},"RW_SRAM":{"Size":131072,"StartAddress":805437440},"heapSize":1280,"stackSize":1280,"startupROM":{"Size":1441792,"StartAddress":352845824}},"m7Linker":{"DTCM":{"Size":262144,"StartAddress":536870912},"ITCM":{"Size":262144,"StartAddress":0},"RO_SRAM":{"Size":131072,"StartAddress":603979776},"RW_SRAM":{"Size":524288,"StartAddress":603979776},"heapSize":512,"stackSize":512,"startupROM":{"Size":524288,"StartAddress":352321536}},"mcuName_packg":"N32H760ZIL7_LQFP144","projectIDE":0,"projectName":"Cube_Config","projectPath":"D:\\RT-Thread\\rtthread-latest\\bsp\\n32\\n32hxxx\\n32h760zil7-stb\\board\\Cube_Config"}]} \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/main.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/main.h new file mode 100644 index 0000000000..86c19917b0 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/main.h @@ -0,0 +1,26 @@ +/** + * @file main.h + * @author N32cube + */ +#ifndef __MAIN_H__ +#define __MAIN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* NTFx CODE START Include*/ +#include "n32h76x_78x.h" +#include "n32h76x_78x_cfg.h" +/* NTFx CODE END Include*/ + +#ifdef __cplusplus + } +#endif + +#endif /* __MAIN_H__ */ +/** + * @} + */ + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/n32h76x_78x_cfg.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/n32h76x_78x_cfg.h new file mode 100644 index 0000000000..4ee2d781fd --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/n32h76x_78x_cfg.h @@ -0,0 +1,40 @@ + +/** + * @file n32h76x_78x_cfg.h + * @author N32cube + */ +#ifndef __N32H76X_78X_CFG_H__ +#define __N32H76X_78X_CFG_H__ + +#ifdef __cplusplus +extern "C" { +#endif +/* NTFx CODE START INCLUDE*/ +#include "n32h76x_78x.h" +#include "n32h76x_78x_rcc.h" +#include "misc.h" +#include "n32h76x_78x_dma.h" +#include "n32h76x_78x_gpio.h" +#include "n32h76x_78x_usart.h" +#include "n32h76x_78x_pwr.h" +#include "n32h76x_78x_dmamux.h" +#include "n32h76x_78x_mdma.h" +/* NTFx CODE END INCLUDE*/ +/* NTFx CODE START Extern*/ +extern void SysTick_Delayms(uint32_t Delayms); +extern void DMA_SetPerMemAddr(DMA_ChannelType* DMAChx, uint32_t periphAddr,uint32_t memAddr,uint32_t bufSize ); +extern bool RCC_Configuration(void); +extern bool NVIC_Configuration(void); +extern bool DMA_Configuration(void); +extern bool GPIO_Configuration(void); +extern bool USART_Configuration(void); +/* NTFx CODE END Extern*/ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H__ */ +/** + * @} + */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/n32h76x_78x_it.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/n32h76x_78x_it.h new file mode 100644 index 0000000000..edcf7b9fe3 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/inc/n32h76x_78x_it.h @@ -0,0 +1,22 @@ +/** + * @file n32h76x_78x_it.h + * @author N32cube + */ +#ifndef __N32H76X_78X_IT_H__ +#define __N32H76X_78X_IT_H__ +#ifdef __cplusplus +extern "C" { +#endif + +/* NTFx CODE START Include*/ +#include "n32h76x_78x.h" +#include "n32h76x_78x_cfg.h" +/* NTFx CODE END Include*/ +#ifdef __cplusplus +} +#endif + +#endif /* __N32h76x_78x_IT_H__ */ +/** + * @} + */ diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/main.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/main.c new file mode 100644 index 0000000000..35b2f44fb1 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/main.c @@ -0,0 +1,35 @@ +/** + * @file main.c + * @author N32cube + */ + + //!!!!!!!!!!!!!!!!NOTE!!!!!!!!!!!!!!! + // Code cannot be added between /* NTFx CODE START xxxxx*/ and /* NTFx CODE END xxxxx*/ + + /* NTFx CODE START Include*/ +#include "main.h" +#include +#include +/* NTFx CODE END Include*/ +/** + * @brief Main program. + */ +int main(void) +{ + /* NTFx CODE START Config*/ + CopyVectTable(0x15000000,0x0,VECT_SIZE); + RCC_Configuration(); + GPIO_Configuration(); + DMA_Configuration(); + NVIC_Configuration(); + USART_Configuration(); + /* Configure the SysTick to have interrupt in 1ms time basis,then call SysTick_Delayms(ms)*/ + SysTick_Config(600000); + /* NTFx CODE END Config*/ + while(1) + { + + } +} + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/n32h76x_78x_cfg.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/n32h76x_78x_cfg.c new file mode 100644 index 0000000000..b35cf485cc --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/n32h76x_78x_cfg.c @@ -0,0 +1,233 @@ +/** + * @file n32h76x_78x_cfg.c + * @author N32cube + */ + +#include "n32h76x_78x_cfg.h" +/* NTFx CODE START */ +__IO uint32_t mwTick; +void SysTick_Delayms(uint32_t Delayms) +{ + uint32_t tickstart = mwTick; + uint32_t wait=Delayms; + /* Add 1 to guarantee minimum wait */ + if (wait < 0xFFFFFFFFU) + { + wait +=1; + } + while ((mwTick - tickstart) < wait) + { + } +} + /** + *@name DMA_SetSrcDstAddr. + *@brief Set peripher address and memory address of DMA + *param DMAy (The input parameters must be the following values): + * - DMA1 + * - DMA2 + * - DMA3 + *param ChNum (The input parameters must be the following values): + * - DMA_CHANNEL_0 + * - DMA_CHANNEL_1 + * - DMA_CHANNEL_2 + * - DMA_CHANNEL_3 + * - DMA_CHANNEL_4 + * - DMA_CHANNEL_5 + * - DMA_CHANNEL_6 + * - DMA_CHANNEL_7 + *@param SrcAddr Source address + *@param DstAddr Destination address + *@return status + */ + void DMA_SetSrcDstAddr(DMA_Module *const DMAy,DMA_ChNumType ChNum, uint32_t SrcAddr,uint32_t DstAddr ) + { + /* Sets channel n source address register */ + WRITE_REG(DMAy->CH[ChNum].SA, SrcAddr); + /* Sets channel n destination address register */ + WRITE_REG(DMAy->CH[ChNum].DA, DstAddr); + } + /** + *@name MDMA_SetSrcDstAddr. + *@brief Set peripher address and memory address of MDMA + *param MDMAy (The input parameters must be the following values): + * - MDMA + *param ChNum (The input parameters must be the following values): + * - MDMA_CHANNEL_0 + * - MDMA_CHANNEL_1 + * - MDMA_CHANNEL_2 + * - MDMA_CHANNEL_3 + * - MDMA_CHANNEL_4 + * - MDMA_CHANNEL_5 + * - MDMA_CHANNEL_6 + * - MDMA_CHANNEL_7 + * - MDMA_CHANNEL_8 + * - MDMA_CHANNEL_9 + * - MDMA_CHANNEL_10 + * - MDMA_CHANNEL_11 + * - MDMA_CHANNEL_12 + * - MDMA_CHANNEL_13 + * - MDMA_CHANNEL_14 + * - MDMA_CHANNEL_15 + *@param SrcAddr Source address + *@param DstAddr Destination address + *@return status + */ + void MDMA_SetSrcDstAddr(MDMA_Module *const MDMAy,MDMA_ChNumType ChNum, uint32_t SrcAddr,uint32_t DstAddr ) + { + /* Sets channel n source address register */ + WRITE_REG(MDMAy->CH[ChNum].SA, SrcAddr); + /* Sets channel n destination address register */ + WRITE_REG(MDMAy->CH[ChNum].DA, DstAddr); + } +/* NTFx CODE END */ + /* NTFx CODE START */ +/** + *@brief Initializes the clock tree + *@param null + *@return status + */ +bool RCC_Configuration(void) +{ + ErrorStatus ClockStatus; + + RCC_ConfigHSIclkDivider(RCC_HSICLK_DIV1); + RCC_EnableHsi(ENABLE); + /* Wait till HSI is ready */ + ClockStatus = RCC_WaitHsiStable(); + if (ClockStatus != SUCCESS) return false; + RCC_ConfigSysclkDivider(RCC_SYSCLK_DIV1); + RCC_ConfigSysbusDivider(RCC_BUSCLK_DIV2); + /*Configures the Periph clock source as HSI*/ + RCC_ConfigPeriphClk(RCC_PERIPHCLK_SRC_HSI); + + /* Configure APB1 clock is AHB1/2 = 150.000M */ + /* Configure APB2 clock is AHB2/2 = 150.000M */ + /* Configure APB5 clock is AHB5/2 = 150.000M */ + /* Configure APB6 clock is AHB6/2 = 150.000M */ + RCC_ConfigAPBclkDivider(RCC_APB1CLK_DIV2, RCC_APB2CLK_DIV2, RCC_APB5CLK_DIV2, RCC_APB6CLK_DIV2); + /*Configures the PLL1 clock source and multiplication factor,Fin=64M,Fout=600M*/ + //RCC_ConfigPll1(RCC_PLL_SRC_HSI,64000000,600000000,ENABLE); + RCC_ConfigPll1_NoCalculate(RCC_PLL_SRC_HSI,0,153600,3,ENABLE); + /*Configure PLL1 divider value to Pll1A*/ + RCC_ConfigPLL1ADivider(RCC_PLLA_DIV1); + /*Configure PLL1 divider value to Pll1B*/ + RCC_ConfigPLL1BDivider(RCC_PLLB_DIV2); + /*Configure PLL1 divider value to Pll1C*/ + RCC_ConfigPLL1CDivider(RCC_PLLC_DIV2); + /*Configure AXI clock source and divider*/ + RCC_ConfigAXIClk(RCC_AXIHYPERCLK_SRC_PLL1A); + RCC_ConfigAXIclkDivider(RCC_AXICLK_DIV2); + /*Configure M7 clock source and divider*/ + RCC_ConfigM7SystickClkDivider(RCC_STCLK_DIV1); + RCC_ConfigM7Clk(RCC_M7HYPERCLK_SRC_PLL1A); + /* configure sys_clk source is PLL1A */ + RCC_ConfigSysclk(RCC_SYSCLK_SRC_PLL1A); + /* Check if sys_clk source is PLL1A */ + while(RCC_GetSysclkSrc() != RCC_SYSCLK_STS_PLL1A); + + /*Config the USART1/2 PCLK divider from ahb1*/ + RCC_ConfigUSARTPClk(RCC_USARTPCLK_AHB1_DIV1); + + /*Config the TRNG clock*/ + RCC_ConfigTRNGClk(RCC_TRNGCLK_SRC_SYSBUSDIV,RCC_TRNGCLK_SYSBUSDIV2); + + + /*Enables the APB1 peripheral clock 3 .*/ + RCC_EnableAPB1PeriphClk3(RCC_APB1_PERIPHEN_M7_USART1 ,ENABLE); +/* NTFx CODE END */ + + return true; +} +/* NTFx CODE START */ +/** + *@brief Initializes the NVIC + *@param null + *@return status + */ +bool NVIC_Configuration(void) +{ + +/* NTFx CODE END */ + + return true; +} +/* NTFx CODE START */ +/** + *@brief Initializes the DMA + *@param null + *@return status + */ +bool DMA_Configuration(void) +{ + +/* NTFx CODE END */ + + return true; +} +/* NTFx CODE START */ +/** + *@brief Initializes the GPIO + *@param null + *@return status + */ +bool GPIO_Configuration(void) +{ + + GPIO_InitType GPIO_InitStructure; + GPIO_InitStruct(&GPIO_InitStructure); + /* Enable the GPIO clock*/ + RCC_EnableAHB5PeriphClk1(RCC_AHB5_PERIPHEN_M7_GPIOA | RCC_AHB5_PERIPHEN_M4_GPIOA, ENABLE); + RCC_EnableAHB5PeriphClk2(RCC_AHB5_PERIPHEN_M7_AFIO|RCC_AHB5_PERIPHEN_M4_AFIO,ENABLE); + + + /*Initialize AF_PP GPIO */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.GPIO_Pull = GPIO_PULL_UP; + GPIO_InitStructure.GPIO_Slew_Rate = GPIO_SLEW_RATE_SLOW; + GPIO_InitStructure.GPIO_Current = GPIO_DS_2mA; + GPIO_InitStructure.GPIO_Alternate = GPIO_AF7; + GPIO_InitStructure.Pin = GPIO_PIN_9; + GPIO_InitPeripheral(GPIOA,&GPIO_InitStructure); + + /*Initialize input GPIO */ + GPIO_InitStructure.GPIO_Mode = GPIO_MODE_INPUT; + GPIO_InitStructure.GPIO_Pull = GPIO_PULL_UP; + GPIO_InitStructure.GPIO_Alternate = GPIO_AF5; + GPIO_InitStructure.Pin = GPIO_PIN_10; + GPIO_InitPeripheral(GPIOA,&GPIO_InitStructure); + +/* NTFx CODE END */ + + return true; +} +/* NTFx CODE START */ +/** + *@brief Initializes the USART + *@param null + *@return status + */ +bool USART_Configuration(void) +{ + USART_InitType USART_InitStructure; + USART_StructInit(&USART_InitStructure); + + + /*********initialize the USART1************/ + USART_DeInit(USART1); + USART_InitStructure.BaudRate = 115200; + USART_InitStructure.WordLength = USART_WL_8B; + USART_InitStructure.StopBits = USART_STPB_1; + USART_InitStructure.Parity = USART_PE_NO; + USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE; + USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX; + USART_InitStructure.OverSampling = USART_16OVER ; + /* Configure USART1 */ + USART_Init(USART1, &USART_InitStructure); + + + /* Enable the USART1 */ + USART_Enable(USART1, ENABLE); +/* NTFx CODE END */ + + return true; +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/n32h76x_78x_it.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/n32h76x_78x_it.c new file mode 100644 index 0000000000..a2ca2d4c23 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/USER/src/n32h76x_78x_it.c @@ -0,0 +1,100 @@ +/** + * @file n32h76x_78x_it.c + * @author N32cube + */ + + /* NTFx CODE START */ +#include "n32h76x_78x_it.h" +#include "n32h76x_78x.h" +/* NTFx CODE END */ + +/* NTFx CODE START */ +extern __IO uint32_t mwTick; +/** + * @brief This function handles NMI exception. + */ +void NMI_Handler(void) +{ +/* NTFx CODE END */ + +} +/* NTFx CODE START */ +/** + * @brief This function handles Hard Fault exception. + */ +void HardFault_Handler(void) +{ + /* Go to infinite loop when Hard Fault exception occurs */ + while (1) + { + /* NTFx CODE END */ + + } +} +/* NTFx CODE START */ +/** + * @brief This function handles Memory Manage exception. + */ +void MemManage_Handler(void) +{ + /* Go to infinite loop when Memory Manage exception occurs */ + while (1) + { +/* NTFx CODE END */ + + } +} +/* NTFx CODE START */ +/** + * @brief This function handles Bus Fault exception. + */ +void BusFault_Handler(void) +{ + /* Go to infinite loop when Bus Fault exception occurs */ + while (1) + { +/* NTFx CODE END */ + + } +} +/* NTFx CODE START */ +/** + * @brief This function handles Usage Fault exception. + */ +void UsageFault_Handler(void) +{ + /* Go to infinite loop when Usage Fault exception occurs */ + while (1) + { +/* NTFx CODE END */ + + } +} +/* NTFx CODE START */ +/** + * @brief This function handles SVCall exception. + */ +void SVC_Handler(void) +{ +/* NTFx CODE END */ + +} +/* NTFx CODE START */ +/** + * @brief This function handles Debug Monitor exception. + */ +void DebugMon_Handler(void) +{ +/* NTFx CODE END */ + +} +/* NTFx CODE START */ +/** + * @brief This function handles SysTick Handler. + */ +void SysTick_Handler(void) +{ + mwTick++; +/* NTFx CODE END */ + +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/Clock.dat b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/Clock.dat new file mode 100644 index 0000000000..850c2e0a4e --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/Clock.dat @@ -0,0 +1 @@ +{"ADCPLLSEL":[0,0,0],"ADCSYSDIV":[30,30,30],"ADC_CKMOD":[0,0,0],"ADC_MUX":[10,10,10],"ADC_PLL":[600,600,600],"ADC_SYS":[10,10,10],"AHB1":300,"AHB2":300,"AHB5":300,"AHB6":300,"AHB9":300,"APB1":150,"APB1BTIMDIV":1,"APB1DIV":2,"APB1FDCANDIV":4,"APB1GTIMDIV":1,"APB1I2CDIV":16,"APB1I2SDIV":8,"APB1USARTDIV":1,"APB2":150,"APB2ATIMDIV":1,"APB2DIV":2,"APB2DSMUDIV":2,"APB2FDCANDIV":4,"APB2GTIMDIV":1,"APB2I2CDIV":8,"APB2I2SDIV":8,"APB5":150,"APB5ATIMDIV":1,"APB5DIV":2,"APB5I2CDIV":8,"APB6":150,"APB6DIV":2,"ATIM1_2_Ker":300,"ATIM1_2_PCLK":150,"ATIM3_4_Ker":300,"ATIM3_4_PCLK":150,"AXI":300,"AXIDIV":2,"AXIHYPDIV":2,"AXIHYPSEL":0,"BTIM1_2_3_4_Ker":300,"BTIM1_2_3_4_PCLK":150,"BUSDIV":2,"COMPDIV":1,"COMPSEL":0,"COMP_Ker":300,"COMP_LSX":0.032,"COMP_PCLK":150,"CoreM4":300,"CoreM7":600,"DAC1_2_PCLK":150,"DAC3_4_5_6_PCLK":300,"DSIAXIPPIDIV":1,"DSIHSEDIV":1,"DSIKERSEL":0,"DSIPPITXSEL":0,"DSIREFDIV":1,"DSIREFULPSDIV":1,"DSIULPSSEL":0,"DSI_Kernel":0,"DSI_PPI":0,"DSI_ULPS":0,"DSMUKERASEL":4,"DSMUKERSEL":1,"DSMU_Ker":150,"DSMU_KerA":12.288,"DVPMAXDIV":16,"DVPMSEL":[3,3],"DVP_HCLK":[300,300],"DVP_MCLK":[18.75,18.75],"DVP_PCLK":[150,150],"ECATKERSEL":0,"ECATSYSDIV":8,"ETH1GMIITXSEL":3,"ETH2_GMII_TX":300,"ETHPTP":[150,150],"ETHPTPSEL":[0,0],"ETHSYSDIV":[2,2],"Ethercat_Kernel":37.5,"Ethercat_PHY":9.375,"FDCANKERSEL":[0,0,0,0,0,0,0,0],"FDCAN_Kernel":[75,75,75,75,75,75,75,75],"FEMCM0AXIDIV":6,"FEMCM0SEL":0,"FEMCM1AXIDIV":6,"FEMCM1SEL":0,"FEMC_M0_Kernel":50,"FEMC_M1_Kernel":50,"GTIMA1_2_3_Ker":300,"GTIMA1_2_3_PCLK":150,"GTIMA4_5_6_7_GTIMB1_2_3_Ker":300,"GTIMA4_5_6_7_GTIMB1_2_3_PCLK":150,"HSECLK":0,"HSEtype":0,"HSIDIV":1,"I2CnKERSEL":[2,0,0,0,0,0,0,0,0,0],"I2CnKernel":[64,18.75,18.75,37.5,37.5,37.5,37.5,37.5,37.5,37.5],"I2SKERSEL":[0,0,0,0],"I2SSEL":0,"I2SnCKIN":[12.288,12.288,12.288,12.288],"I2SnKernel":[37.5,37.5,37.5,37.5],"LCDCAXIDIV":1,"LCDCKERSEL":0,"LCDC_Kernel":300,"LPTIMnCOMPmEN":[0,0,0,0,0],"LPTIMnFLTDEC":[1,1,1,1,1],"LPTIMnFLTEN":[0,0,0,0,0],"LPTIMnFLTSEL":[0,0,0,0,0],"LPTIMnSEL":[1,1,1,1,1],"LPTIMn_Ker":[0.032,0.032,0.032,0.032,0.032],"LPUARTDIV":2,"LPUARTnSEL":[0,0],"LPUARTn_Ker":[150,150],"LPUARTn_PCLK":[150,150],"LSECLK":0,"LSEtype":0,"LSICLK":0.032,"M4STCLKDIV":2,"M4SysTick":150,"M7HYPDIV":1,"M7HYPSEL":0,"M7STCLKDIV":1,"M7SysTick":600,"MCO1":0.032,"MCO1DIV":1,"MCO1Enable":false,"MCO1SEL":0,"MCO2":600,"MCO2DIV":1,"MCO2Enable":false,"MCO2SEL":0,"MSIDIV":1,"PERSW":0,"PLL1":600,"PLL1A":600,"PLL1ADIV":1,"PLL1B":300,"PLL1BDIV":2,"PLL1C":300,"PLL1CDIV":2,"PLL1CLKF":153600,"PLL1CLKR":0,"PLL1SRC":0,"PLL2":600,"PLL2A":600,"PLL2ADIV":1,"PLL2B":600,"PLL2BDIV":1,"PLL2C":600,"PLL2CDIV":1,"PLL2CLKF":153600,"PLL2CLKR":0,"PLL2SRC":0,"PLL3":600,"PLL3A":600,"PLL3ADIV":1,"PLL3B":600,"PLL3BDIV":1,"PLL3C":600,"PLL3CDIV":1,"PLL3CLKF":153600,"PLL3CLKR":0,"PLL3SRC":0,"PeriphCLK":64,"RTC":0.032,"RTCHSEDIV":1,"RTCHSIDIV":1,"RTCSEL":2,"SCLKDIV":1,"SCLKSW":3,"SDMMCKERSEL":[0,0],"SDMMCSYSDIV":[8,8],"SDMMC_Kernel":[37.5,37.5],"SDRAMMEMDIV":4,"SDRAMMEMSEL":0,"SDRAM_MEM":75,"SHRPLL":600,"SHRPLLCLKF":153600,"SHRPLLCLKR":0,"SHRPLLSRC":0,"SHRTIM":150,"SPI1_2_PCLK":150,"SPI3_PCLK":150,"SPI4_5_6_7_PCLK":150,"SYSCLK":600,"TRNG":150,"TRNGDIV":2,"TRNGSEL":0,"USART1_2_PCLK":300,"USART3_4_9_10_11_12_PCLK":150,"USART5_6_7_8_13_14_15_PCLK":150,"USB1_2_REF_CLK":0,"USBHSEDIV":2,"WWDG1_PCLK":150,"WWDG2_PCLK":150,"XSPISSISEL":[2,2],"XSPI_SSI":[300,300],"hsi_rdy":64,"msi_rdy":16} \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/ConfigModList.dat b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/ConfigModList.dat new file mode 100644 index 0000000000..6965db9360 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/ConfigModList.dat @@ -0,0 +1 @@ +{"configModDic":[{"Key":"Clock","Value":{"initByCoreX":0,"runOnCoreX":0}},{"Key":"SYS","Value":{"initByCoreX":0,"runOnCoreX":0}},{"Key":"NVIC_M7","Value":{"initByCoreX":0,"runOnCoreX":0}},{"Key":"DMA","Value":{"initByCoreX":0,"runOnCoreX":0}},{"Key":"GPIO","Value":{"initByCoreX":0,"runOnCoreX":0}},{"Key":"USART1","Value":{"initByCoreX":0,"runOnCoreX":0}}]} \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/DMAStates.dat b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/DMAStates.dat new file mode 100644 index 0000000000..c9da3f5c67 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/DMAStates.dat @@ -0,0 +1 @@ +{"DMAs":[],"MDMAs":[]} \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/LastLoadProject.dat b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/LastLoadProject.dat new file mode 100644 index 0000000000..a302eebbf3 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/LastLoadProject.dat @@ -0,0 +1 @@ +{"AXIsRAM2_3_max":512,"DTCM_max":256,"ITCM_max":256,"TcmSizeValue":32,"dateTime":"2026\/01\/28_09:58:33","info":"N32H760ZIL7_LQFP144; USART1;","m4Linker":{"QuickCodeSRAM":{"Size":131072,"StartAddress":805306368},"RW_SRAM":{"Size":131072,"StartAddress":805437440},"heapSize":1280,"stackSize":1280,"startupROM":{"Size":1441792,"StartAddress":352845824}},"m7Linker":{"DTCM":{"Size":262144,"StartAddress":536870912},"ITCM":{"Size":262144,"StartAddress":0},"RO_SRAM":{"Size":131072,"StartAddress":603979776},"RW_SRAM":{"Size":524288,"StartAddress":603979776},"heapSize":512,"stackSize":512,"startupROM":{"Size":524288,"StartAddress":352321536}},"mcuName_packg":"N32H760ZIL7_LQFP144","projectIDE":0,"projectName":"Cube_Config","projectPath":"D:\\RT-Thread\\rtthread-latest\\bsp\\n32\\n32hxxx\\n32h760zil7-stb\\board\\Cube_Config"} \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/NVIC_M4.dat b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/NVIC_M4.dat new file mode 100644 index 0000000000..ca740a251a --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/NVIC_M4.dat @@ -0,0 +1 @@ +{"numToNVIC":[{"Key":-3,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":-2,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":-1,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":0,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":1,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":2,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":3,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":4,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":5,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":6,"Value":{"PreemptionPriority":15,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":7,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":8,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":9,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":10,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":11,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":12,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":13,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":14,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":15,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":16,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":17,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":18,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":19,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":20,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":21,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":22,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":23,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":24,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":25,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":26,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":27,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":28,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":29,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":30,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":31,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":32,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":33,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":34,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":35,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":36,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":37,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":38,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":39,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":40,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":41,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":42,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":43,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":44,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":45,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":46,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":47,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":48,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":49,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":50,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":51,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":52,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":53,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":54,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":55,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":56,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":57,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":58,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":59,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":60,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":61,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":62,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":63,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":64,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":65,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":66,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":67,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":68,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":69,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":70,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":71,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":72,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":73,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":74,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":75,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":76,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":77,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":78,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":79,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":80,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":81,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":82,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":83,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":84,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":85,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":86,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":87,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":88,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":89,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":90,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":91,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":92,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":93,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":94,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":95,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":96,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":97,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":98,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":99,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":100,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":101,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":102,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":103,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":104,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":105,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":106,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":107,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":108,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":109,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":110,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":111,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":112,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":113,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":114,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":115,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":116,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":117,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":118,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":119,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":120,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":121,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":122,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":123,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":124,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":125,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":126,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":127,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":128,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":129,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":130,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":131,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":132,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":133,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":134,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":135,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":136,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":137,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":138,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":139,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":140,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":141,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":142,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":143,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":144,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":145,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":146,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":147,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":148,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":149,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":150,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":151,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":152,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":153,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":154,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":155,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":156,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":157,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":158,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":159,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":160,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":161,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":162,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":163,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":164,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":165,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":166,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":167,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":168,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":169,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":170,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":171,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":172,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":173,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":174,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":175,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":176,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":177,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":178,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":179,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":180,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":181,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":182,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":183,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":184,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":185,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":186,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":187,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":188,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":189,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":190,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":191,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":192,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":193,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":194,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":195,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":196,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":197,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":198,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":199,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":200,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":201,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":202,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":203,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":204,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":205,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":206,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":207,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":208,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":209,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":210,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":211,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":212,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":213,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":214,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":215,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":216,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":217,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":218,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":219,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":220,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":221,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":222,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":223,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":224,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":225,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":226,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":227,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":228,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":229,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":230,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":231,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":232,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":233,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":234,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":235,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":236,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":237,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":238,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":239,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":240,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}}],"priorityGroup":4} \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/NVIC_M7.dat b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/NVIC_M7.dat new file mode 100644 index 0000000000..ca740a251a --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/NVIC_M7.dat @@ -0,0 +1 @@ +{"numToNVIC":[{"Key":-3,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":-2,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":-1,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":0,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":1,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":2,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":3,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":4,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":5,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":6,"Value":{"PreemptionPriority":15,"SubPriority":0,"isEnable":true,"lockPinOrPeriphName":["SYS"]}},{"Key":7,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":8,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":9,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":10,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":11,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":12,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":13,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":14,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":15,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":16,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":17,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":18,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":19,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":20,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":21,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":22,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":23,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":24,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":25,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":26,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":27,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":28,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":29,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":30,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":31,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":32,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":33,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":34,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":35,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":36,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":37,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":38,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":39,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":40,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":41,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":42,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":43,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":44,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":45,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":46,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":47,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":48,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":49,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":50,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":51,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":52,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":53,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":54,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":55,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":56,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":57,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":58,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":59,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":60,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":61,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":62,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":63,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":64,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":65,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":66,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":67,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":68,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":69,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":70,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":71,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":72,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":73,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":74,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":75,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":76,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":77,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":78,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":79,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":80,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":81,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":82,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":83,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":84,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":85,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":86,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":87,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":88,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":89,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":90,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":91,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":92,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":93,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":94,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":95,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":96,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":97,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":98,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":99,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":100,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":101,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":102,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":103,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":104,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":105,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":106,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":107,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":108,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":109,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":110,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":111,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":112,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":113,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":114,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":115,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":116,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":117,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":118,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":119,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":120,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":121,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":122,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":123,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":124,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":125,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":126,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":127,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":128,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":129,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":130,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":131,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":132,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":133,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":134,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":135,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":136,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":137,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":138,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":139,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":140,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":141,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":142,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":143,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":144,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":145,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":146,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":147,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":148,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":149,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":150,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":151,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":152,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":153,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":154,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":155,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":156,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":157,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":158,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":159,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":160,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":161,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":162,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":163,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":164,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":165,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":166,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":167,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":168,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":169,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":170,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":171,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":172,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":173,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":174,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":175,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":176,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":177,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":178,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":179,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":180,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":181,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":182,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":183,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":184,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":185,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":186,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":187,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":188,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":189,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":190,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":191,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":192,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":193,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":194,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":195,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":196,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":197,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":198,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":199,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":200,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":201,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":202,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":203,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":204,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":205,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":206,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":207,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":208,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":209,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":210,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":211,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":212,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":213,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":214,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":215,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":216,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":217,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":218,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":219,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":220,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":221,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":222,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":223,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":224,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":225,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":226,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":227,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":228,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":229,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":230,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":231,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":232,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":233,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":234,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":235,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":236,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":237,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":238,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":239,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}},{"Key":240,"Value":{"PreemptionPriority":0,"SubPriority":0,"isEnable":false,"lockPinOrPeriphName":[]}}],"priorityGroup":4} \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/PinStates.dat b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/PinStates.dat new file mode 100644 index 0000000000..f2251d72ab --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/PinStates.dat @@ -0,0 +1 @@ +{"list":[{"Key":"PA13","Value":{"driveStrength":6,"extiTrigger":0,"fuctionOnPin":"SYS.SWDIO","mode":7,"outLevel":2,"pullUpDown":3,"runOn":2,"toggleRate":2}},{"Key":"PA14","Value":{"driveStrength":6,"extiTrigger":0,"fuctionOnPin":"SYS.SWCLK","mode":7,"outLevel":2,"pullUpDown":3,"runOn":2,"toggleRate":2}},{"Key":"PA9","Value":{"driveStrength":0,"extiTrigger":0,"fuctionOnPin":"USART1.TX","mode":2,"outLevel":2,"pullUpDown":1,"runOn":2,"toggleRate":1}},{"Key":"PA10","Value":{"driveStrength":6,"extiTrigger":0,"fuctionOnPin":"USART1.RX","mode":1,"outLevel":2,"pullUpDown":1,"runOn":2,"toggleRate":2}}]} \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/SYS.dat b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/SYS.dat new file mode 100644 index 0000000000..268488083a --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/SYS.dat @@ -0,0 +1 @@ +{"debug":1,"isEnSysTickM4":true,"isEnSysTickM7":true,"wakeUPn":[0,0,0,0,0,0]} \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/USART1.dat b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/USART1.dat new file mode 100644 index 0000000000..153ab3d4d1 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/data/USART1.dat @@ -0,0 +1 @@ +{"CTSIEN":false,"DEassertionTime":0,"DEdeassertionTIme":0,"DEpolarity":0,"ERRIEN":false,"IDLEIEN":false,"LINBDFIEN":false,"PEFIEN":false,"RTOITE":false,"RXDNEIEN":false,"RXFEITE":false,"RXFFITE":false,"RXFTITE":false,"RxFiFoThreshold":0,"TXCIEN":false,"TXDEIEN":false,"TXFEITE":false,"TXFFITE":false,"TXFTITE":false,"TxFiFoThreshold":0,"baud":115200,"clockPhase":0,"clockPolarity":0,"clockPrescaler":1,"dataDirection":0,"flowCtrl":0,"guardTime":0,"idleFrameLength":0,"irDaMode":0,"isFiFoEnable":false,"isIdleFrameCtrlEnable":false,"isLastBitClockEnable":false,"isNACKenable":false,"isReceiverTimeoutEnable":false,"isSwapTX_RX":false,"linBreakDetectLength":0,"overSample":0,"parity":0,"receiverTimeoutLength":0,"stopBits":0,"uartMode":1,"wakeUpAddr":0,"wakeUpMethod":0,"wordLength":1} \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x.s new file mode 100644 index 0000000000..0482eea3ed --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x.s @@ -0,0 +1,892 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + + +Stack_Size EQU 0x00002000 + + 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 0x00002000 + + 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 N32SysTick_Handler ; N32SysTick Handler + + ; External Interrupts + DCD WWDG1_IRQHandler ; Window1 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD FPU_CPU1_IRQHandler ; FPU_CM7 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD SEMA4_INT1_IRQHandler ; SEMA4 interrupt1 + DCD 0 ; Reserved + DCD WWDG2_RST_IRQHandler ; WWDG2 reset interrupt through EXTI line 82 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUB_IRQHandler ; DCMUB interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_IRQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; Reserved + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt + DCD SysTick_Handler ; SysTick Handler + +__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 +N32SysTick_Handler PROC + EXPORT N32SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG1_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT RTC_TAMPER_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT DMA1_Channel0_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 DMA2_Channel0_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT DMA2_Channel6_IRQHandler [WEAK] + EXPORT DMA2_Channel7_IRQHandler [WEAK] + EXPORT DMA3_Channel0_IRQHandler [WEAK] + EXPORT DMA3_Channel1_IRQHandler [WEAK] + EXPORT DMA3_Channel2_IRQHandler [WEAK] + EXPORT DMA3_Channel3_IRQHandler [WEAK] + EXPORT DMA3_Channel4_IRQHandler [WEAK] + EXPORT DMA3_Channel5_IRQHandler [WEAK] + EXPORT DMA3_Channel6_IRQHandler [WEAK] + EXPORT DMA3_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel0_IRQHandler [WEAK] + EXPORT MDMA_Channel1_IRQHandler [WEAK] + EXPORT MDMA_Channel2_IRQHandler [WEAK] + EXPORT MDMA_Channel3_IRQHandler [WEAK] + EXPORT MDMA_Channel4_IRQHandler [WEAK] + EXPORT MDMA_Channel5_IRQHandler [WEAK] + EXPORT MDMA_Channel6_IRQHandler [WEAK] + EXPORT MDMA_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel8_IRQHandler [WEAK] + EXPORT MDMA_Channel9_IRQHandler [WEAK] + EXPORT MDMA_Channel10_IRQHandler [WEAK] + EXPORT MDMA_Channel11_IRQHandler [WEAK] + EXPORT MDMA_Channel12_IRQHandler [WEAK] + EXPORT MDMA_Channel13_IRQHandler [WEAK] + EXPORT MDMA_Channel14_IRQHandler [WEAK] + EXPORT MDMA_Channel15_IRQHandler [WEAK] + EXPORT SDPU_IRQHandler [WEAK] + EXPORT FPU_CPU1_IRQHandler [WEAK] + EXPORT ECCMON_IRQHandler [WEAK] + EXPORT RTC_ALARM_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT I2C3_EV_IRQHandler [WEAK] + EXPORT I2C3_ER_IRQHandler [WEAK] + EXPORT I2C4_EV_IRQHandler [WEAK] + EXPORT I2C4_ER_IRQHandler [WEAK] + EXPORT I2C5_EV_IRQHandler [WEAK] + EXPORT I2C5_ER_IRQHandler [WEAK] + EXPORT I2C6_EV_IRQHandler [WEAK] + EXPORT I2C6_ER_IRQHandler [WEAK] + EXPORT I2C7_EV_IRQHandler [WEAK] + EXPORT I2C7_ER_IRQHandler [WEAK] + EXPORT I2C8_EV_IRQHandler [WEAK] + EXPORT I2C8_ER_IRQHandler [WEAK] + EXPORT I2C9_EV_IRQHandler [WEAK] + EXPORT I2C9_ER_IRQHandler [WEAK] + EXPORT I2C10_EV_IRQHandler [WEAK] + EXPORT I2C10_ER_IRQHandler [WEAK] + EXPORT I2S1_IRQHandler [WEAK] + EXPORT I2S2_IRQHandler [WEAK] + EXPORT I2S3_IRQHandler [WEAK] + EXPORT I2S4_IRQHandler [WEAK] + EXPORT xSPI1_IRQHandler [WEAK] + EXPORT xSPI2_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT SPI4_IRQHandler [WEAK] + EXPORT SPI5_IRQHandler [WEAK] + EXPORT SPI6_IRQHandler [WEAK] + EXPORT SPI7_IRQHandler [WEAK] + EXPORT LCD_EV_IRQHandler [WEAK] + EXPORT LCD_ER_IRQHandler [WEAK] + EXPORT DVP1_IRQHandler [WEAK] + EXPORT DVP2_IRQHandler [WEAK] + EXPORT DMAMUX2_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB1_HS_WKUP_IRQHandler [WEAK] + EXPORT USB1_HS_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB2_HS_WKUP_IRQHandler [WEAK] + EXPORT USB2_HS_IRQHandler [WEAK] + EXPORT ETH1_IRQHandler [WEAK] + EXPORT ETH1_PMT_LPI_IRQHandler [WEAK] + EXPORT ETH2_IRQHandler [WEAK] + EXPORT ETH2_PMT_LPI_IRQHandler [WEAK] + EXPORT FDCAN1_INT0_IRQHandler [WEAK] + EXPORT FDCAN2_INT0_IRQHandler [WEAK] + EXPORT FDCAN3_INT0_IRQHandler [WEAK] + EXPORT FDCAN4_INT0_IRQHandler [WEAK] + EXPORT FDCAN1_INT1_IRQHandler [WEAK] + EXPORT FDCAN2_INT1_IRQHandler [WEAK] + EXPORT FDCAN3_INT1_IRQHandler [WEAK] + EXPORT FDCAN4_INT1_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT USART4_IRQHandler [WEAK] + EXPORT USART5_IRQHandler [WEAK] + EXPORT USART6_IRQHandler [WEAK] + EXPORT USART7_IRQHandler [WEAK] + EXPORT USART8_IRQHandler [WEAK] + EXPORT UART9_IRQHandler [WEAK] + EXPORT UART10_IRQHandler [WEAK] + EXPORT UART11_IRQHandler [WEAK] + EXPORT UART12_IRQHandler [WEAK] + EXPORT UART13_IRQHandler [WEAK] + EXPORT UART14_IRQHandler [WEAK] + EXPORT UART15_IRQHandler [WEAK] + EXPORT LPUART1_IRQHandler [WEAK] + EXPORT LPUART2_IRQHandler [WEAK] + EXPORT GPU_IRQHandler [WEAK] + EXPORT SDMMC1_IRQHandler [WEAK] + EXPORT SDMMC2_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT ADC2_IRQHandler [WEAK] + EXPORT ADC3_IRQHandler [WEAK] + EXPORT COMP1_2_IRQHandler [WEAK] + EXPORT COMP3_4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT1_IRQHandler [WEAK] + EXPORT SHRTIM1_INT2_IRQHandler [WEAK] + EXPORT SHRTIM1_INT3_IRQHandler [WEAK] + EXPORT SHRTIM1_INT4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT5_IRQHandler [WEAK] + EXPORT SHRTIM1_INT6_IRQHandler [WEAK] + EXPORT SHRTIM1_INT7_IRQHandler [WEAK] + EXPORT SHRTIM1_INT8_IRQHandler [WEAK] + EXPORT SHRTIM2_INT1_IRQHandler [WEAK] + EXPORT SHRTIM2_INT2_IRQHandler [WEAK] + EXPORT SHRTIM2_INT3_IRQHandler [WEAK] + EXPORT SHRTIM2_INT4_IRQHandler [WEAK] + EXPORT SHRTIM2_INT5_IRQHandler [WEAK] + EXPORT SHRTIM2_INT6_IRQHandler [WEAK] + EXPORT SHRTIM2_INT7_IRQHandler [WEAK] + EXPORT SHRTIM2_INT8_IRQHandler [WEAK] + EXPORT FDCAN5_INT0_IRQHandler [WEAK] + EXPORT FDCAN6_INT0_IRQHandler [WEAK] + EXPORT FDCAN7_INT0_IRQHandler [WEAK] + EXPORT FDCAN8_INT0_IRQHandler [WEAK] + EXPORT FDCAN5_INT1_IRQHandler [WEAK] + EXPORT FDCAN6_INT1_IRQHandler [WEAK] + EXPORT FDCAN7_INT1_IRQHandler [WEAK] + EXPORT FDCAN8_INT1_IRQHandler [WEAK] + EXPORT LPTIM5_WKUP_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_H2P_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_P2H_IRQHandler [WEAK] + EXPORT WAKEUP_IO_IRQHandler [WEAK] + EXPORT SEMA4_INT1_IRQHandler [WEAK] + EXPORT WWDG2_RST_IRQHandler [WEAK] + EXPORT OTPC_IRQHandler [WEAK] + EXPORT FEMC_IRQHandler [WEAK] + EXPORT DCMUB_IRQHandler [WEAK] + EXPORT DAC1_IRQHandler [WEAK] + EXPORT DAC2_IRQHandler [WEAK] + EXPORT MDMA_AHBS_ER_IRQHandler [WEAK] + EXPORT CM7_CATCH_READ_ER_IRQHandler [WEAK] + EXPORT DAC3_IRQHandler [WEAK] + EXPORT DAC4_IRQHandler [WEAK] + EXPORT EMC_IRQHandler [WEAK] + EXPORT DAC5_IRQHandler [WEAK] + EXPORT DAC6_IRQHandler [WEAK] + EXPORT ESC_OPB_IRQHandler [WEAK] + EXPORT ESC_SYNC0_IRQHandler [WEAK] + EXPORT ESC_SYNC1_IRQHandler [WEAK] + EXPORT ESC_WRP_IRQHandler [WEAK] + EXPORT ATIM1_BRK_IRQHandler [WEAK] + EXPORT ATIM1_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM1_CC_IRQHandler [WEAK] + EXPORT ATIM1_UP_IRQHandler [WEAK] + EXPORT ATIM2_BRK_IRQHandler [WEAK] + EXPORT ATIM2_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM2_CC_IRQHandler [WEAK] + EXPORT ATIM2_UP_IRQHandler [WEAK] + EXPORT ATIM3_BRK_IRQHandler [WEAK] + EXPORT ATIM3_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM3_CC_IRQHandler [WEAK] + EXPORT ATIM3_UP_IRQHandler [WEAK] + EXPORT ATIM4_BRK_IRQHandler [WEAK] + EXPORT ATIM4_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM4_CC_IRQHandler [WEAK] + EXPORT ATIM4_UP_IRQHandler [WEAK] + EXPORT GTIMA1_IRQHandler [WEAK] + EXPORT GTIMA2_IRQHandler [WEAK] + EXPORT GTIMA3_IRQHandler [WEAK] + EXPORT GTIMA4_IRQHandler [WEAK] + EXPORT GTIMA5_IRQHandler [WEAK] + EXPORT GTIMA6_IRQHandler [WEAK] + EXPORT GTIMA7_IRQHandler [WEAK] + EXPORT GTIMB1_IRQHandler [WEAK] + EXPORT GTIMB2_IRQHandler [WEAK] + EXPORT GTIMB3_IRQHandler [WEAK] + EXPORT BTIM1_IRQHandler [WEAK] + EXPORT BTIM2_IRQHandler [WEAK] + EXPORT BTIM3_IRQHandler [WEAK] + EXPORT BTIM4_IRQHandler [WEAK] + EXPORT LPTIM1_WKUP_IRQHandler [WEAK] + EXPORT LPTIM2_WKUP_IRQHandler [WEAK] + EXPORT LPTIM3_WKUP_IRQHandler [WEAK] + EXPORT LPTIM4_WKUP_IRQHandler [WEAK] + EXPORT DSMU_FLT0_IRQHandler [WEAK] + EXPORT DSMU_FLT1_IRQHandler [WEAK] + EXPORT DSMU_FLT2_IRQHandler [WEAK] + EXPORT DSMU_FLT3_IRQHandler [WEAK] + EXPORT FMAC_IRQHandler [WEAK] + EXPORT CORDIC_IRQHandler [WEAK] + EXPORT DMAMUX1_IRQHandler [WEAK] + EXPORT MMU_IRQHandler [WEAK] + EXPORT SysTick_Handler [WEAK] + +WWDG1_IRQHandler +PVD_IRQHandler +RTC_TAMPER_IRQHandler +RTC_WKUP_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +EXTI9_5_IRQHandler +EXTI15_10_IRQHandler +DMA1_Channel0_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +DMA2_Channel0_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +DMA2_Channel6_IRQHandler +DMA2_Channel7_IRQHandler +DMA3_Channel0_IRQHandler +DMA3_Channel1_IRQHandler +DMA3_Channel2_IRQHandler +DMA3_Channel3_IRQHandler +DMA3_Channel4_IRQHandler +DMA3_Channel5_IRQHandler +DMA3_Channel6_IRQHandler +DMA3_Channel7_IRQHandler +MDMA_Channel0_IRQHandler +MDMA_Channel1_IRQHandler +MDMA_Channel2_IRQHandler +MDMA_Channel3_IRQHandler +MDMA_Channel4_IRQHandler +MDMA_Channel5_IRQHandler +MDMA_Channel6_IRQHandler +MDMA_Channel7_IRQHandler +MDMA_Channel8_IRQHandler +MDMA_Channel9_IRQHandler +MDMA_Channel10_IRQHandler +MDMA_Channel11_IRQHandler +MDMA_Channel12_IRQHandler +MDMA_Channel13_IRQHandler +MDMA_Channel14_IRQHandler +MDMA_Channel15_IRQHandler +SDPU_IRQHandler +FPU_CPU1_IRQHandler +ECCMON_IRQHandler +RTC_ALARM_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +I2C3_EV_IRQHandler +I2C3_ER_IRQHandler +I2C4_EV_IRQHandler +I2C4_ER_IRQHandler +I2C5_EV_IRQHandler +I2C5_ER_IRQHandler +I2C6_EV_IRQHandler +I2C6_ER_IRQHandler +I2C7_EV_IRQHandler +I2C7_ER_IRQHandler +I2C8_EV_IRQHandler +I2C8_ER_IRQHandler +I2C9_EV_IRQHandler +I2C9_ER_IRQHandler +I2C10_EV_IRQHandler +I2C10_ER_IRQHandler +I2S1_IRQHandler +I2S2_IRQHandler +I2S3_IRQHandler +I2S4_IRQHandler +xSPI1_IRQHandler +xSPI2_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +SPI3_IRQHandler +SPI4_IRQHandler +SPI5_IRQHandler +SPI6_IRQHandler +SPI7_IRQHandler +LCD_EV_IRQHandler +LCD_ER_IRQHandler +DVP1_IRQHandler +DVP2_IRQHandler +DMAMUX2_IRQHandler +USB1_HS_EPx_OUT_IRQHandler +USB1_HS_EPx_IN_IRQHandler +USB1_HS_WKUP_IRQHandler +USB1_HS_IRQHandler +USB2_HS_EPx_OUT_IRQHandler +USB2_HS_EPx_IN_IRQHandler +USB2_HS_WKUP_IRQHandler +USB2_HS_IRQHandler +ETH1_IRQHandler +ETH1_PMT_LPI_IRQHandler +ETH2_IRQHandler +ETH2_PMT_LPI_IRQHandler +FDCAN1_INT0_IRQHandler +FDCAN2_INT0_IRQHandler +FDCAN3_INT0_IRQHandler +FDCAN4_INT0_IRQHandler +FDCAN1_INT1_IRQHandler +FDCAN2_INT1_IRQHandler +FDCAN3_INT1_IRQHandler +FDCAN4_INT1_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +USART4_IRQHandler +USART5_IRQHandler +USART6_IRQHandler +USART7_IRQHandler +USART8_IRQHandler +UART9_IRQHandler +UART10_IRQHandler +UART11_IRQHandler +UART12_IRQHandler +UART13_IRQHandler +UART14_IRQHandler +UART15_IRQHandler +LPUART1_IRQHandler +LPUART2_IRQHandler +GPU_IRQHandler +SDMMC1_IRQHandler +SDMMC2_IRQHandler +ADC1_IRQHandler +ADC2_IRQHandler +ADC3_IRQHandler +COMP1_2_IRQHandler +COMP3_4_IRQHandler +SHRTIM1_INT1_IRQHandler +SHRTIM1_INT2_IRQHandler +SHRTIM1_INT3_IRQHandler +SHRTIM1_INT4_IRQHandler +SHRTIM1_INT5_IRQHandler +SHRTIM1_INT6_IRQHandler +SHRTIM1_INT7_IRQHandler +SHRTIM1_INT8_IRQHandler +SHRTIM2_INT1_IRQHandler +SHRTIM2_INT2_IRQHandler +SHRTIM2_INT3_IRQHandler +SHRTIM2_INT4_IRQHandler +SHRTIM2_INT5_IRQHandler +SHRTIM2_INT6_IRQHandler +SHRTIM2_INT7_IRQHandler +SHRTIM2_INT8_IRQHandler +FDCAN5_INT0_IRQHandler +FDCAN6_INT0_IRQHandler +FDCAN7_INT0_IRQHandler +FDCAN8_INT0_IRQHandler +FDCAN5_INT1_IRQHandler +FDCAN6_INT1_IRQHandler +FDCAN7_INT1_IRQHandler +FDCAN8_INT1_IRQHandler +LPTIM5_WKUP_IRQHandler +JPEG_SGDMA_H2P_IRQHandler +JPEG_SGDMA_P2H_IRQHandler +WAKEUP_IO_IRQHandler +SEMA4_INT1_IRQHandler +WWDG2_RST_IRQHandler +OTPC_IRQHandler +FEMC_IRQHandler +DCMUB_IRQHandler +DAC1_IRQHandler +DAC2_IRQHandler +MDMA_AHBS_ER_IRQHandler +CM7_CATCH_READ_ER_IRQHandler +DAC3_IRQHandler +DAC4_IRQHandler +EMC_IRQHandler +DAC5_IRQHandler +DAC6_IRQHandler +ESC_OPB_IRQHandler +ESC_SYNC0_IRQHandler +ESC_SYNC1_IRQHandler +ESC_WRP_IRQHandler +ATIM1_BRK_IRQHandler +ATIM1_TRG_COM_IRQHandler +ATIM1_CC_IRQHandler +ATIM1_UP_IRQHandler +ATIM2_BRK_IRQHandler +ATIM2_TRG_COM_IRQHandler +ATIM2_CC_IRQHandler +ATIM2_UP_IRQHandler +ATIM3_BRK_IRQHandler +ATIM3_TRG_COM_IRQHandler +ATIM3_CC_IRQHandler +ATIM3_UP_IRQHandler +ATIM4_BRK_IRQHandler +ATIM4_TRG_COM_IRQHandler +ATIM4_CC_IRQHandler +ATIM4_UP_IRQHandler +GTIMA1_IRQHandler +GTIMA2_IRQHandler +GTIMA3_IRQHandler +GTIMA4_IRQHandler +GTIMA5_IRQHandler +GTIMA6_IRQHandler +GTIMA7_IRQHandler +GTIMB1_IRQHandler +GTIMB2_IRQHandler +GTIMB3_IRQHandler +BTIM1_IRQHandler +BTIM2_IRQHandler +BTIM3_IRQHandler +BTIM4_IRQHandler +LPTIM1_WKUP_IRQHandler +LPTIM2_WKUP_IRQHandler +LPTIM3_WKUP_IRQHandler +LPTIM4_WKUP_IRQHandler +DSMU_FLT0_IRQHandler +DSMU_FLT1_IRQHandler +DSMU_FLT2_IRQHandler +DSMU_FLT3_IRQHandler +FMAC_IRQHandler +CORDIC_IRQHandler +DMAMUX1_IRQHandler +MMU_IRQHandler +SysTick_Handler + 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 + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x_EWARM.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x_EWARM.s new file mode 100644 index 0000000000..af54dada4b --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x_EWARM.s @@ -0,0 +1,1529 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + + 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 + + __iar_init$$done: ; The vector table is not needed + ; until after copy initialization is done + +__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 N32SysTick_Handler ; N32SysTick Handler + + + + ; External Interrupts + DCD WWDG1_IRQHandler ; Window1 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD FPU_CPU1_IRQHandler ; FPU_CM7 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD SEMA4_INT1_IRQHandler ; SEMA4 interrupt1 + DCD 0 ; Reserved + DCD WWDG2_RST_IRQHandler ; WWDG2 reset interrupt through EXTI line 82 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUB_IRQHandler ; DCMUB interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_RQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; Reserved + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt + DCD SysTick_Handler ; SysTick Handler + ;need check to user manual of exti chapter + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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 N32SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +N32SysTick_Handler + B N32SysTick_Handler + + PUBWEAK WWDG1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG1_IRQHandler + B WWDG1_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK RTC_TAMPER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_TAMPER_IRQHandler + B RTC_TAMPER_IRQHandler + + PUBWEAK RTC_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_WKUP_IRQHandler + B RTC_WKUP_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK DMA1_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel0_IRQHandler + B DMA1_Channel0_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 DMA2_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel0_IRQHandler + B DMA2_Channel0_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_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel4_IRQHandler + B DMA2_Channel4_IRQHandler + + PUBWEAK DMA2_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel5_IRQHandler + B DMA2_Channel5_IRQHandler + + PUBWEAK DMA2_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel6_IRQHandler + B DMA2_Channel6_IRQHandler + + PUBWEAK DMA2_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel7_IRQHandler + B DMA2_Channel7_IRQHandler + + PUBWEAK DMA3_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel0_IRQHandler + B DMA3_Channel0_IRQHandler + + PUBWEAK DMA3_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel1_IRQHandler + B DMA3_Channel1_IRQHandler + + PUBWEAK DMA3_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel2_IRQHandler + B DMA3_Channel2_IRQHandler + + PUBWEAK DMA3_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel3_IRQHandler + B DMA3_Channel3_IRQHandler + + PUBWEAK DMA3_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel4_IRQHandler + B DMA3_Channel4_IRQHandler + + PUBWEAK DMA3_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel5_IRQHandler + B DMA3_Channel5_IRQHandler + + PUBWEAK DMA3_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel6_IRQHandler + B DMA3_Channel6_IRQHandler + + PUBWEAK DMA3_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel7_IRQHandler + B DMA3_Channel7_IRQHandler + + PUBWEAK MDMA_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel0_IRQHandler + B MDMA_Channel0_IRQHandler + + PUBWEAK MDMA_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel1_IRQHandler + B MDMA_Channel1_IRQHandler + + PUBWEAK MDMA_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel2_IRQHandler + B MDMA_Channel2_IRQHandler + + PUBWEAK MDMA_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel3_IRQHandler + B MDMA_Channel3_IRQHandler + + PUBWEAK MDMA_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel4_IRQHandler + B MDMA_Channel4_IRQHandler + + PUBWEAK MDMA_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel5_IRQHandler + B MDMA_Channel5_IRQHandler + + PUBWEAK MDMA_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel6_IRQHandler + B MDMA_Channel6_IRQHandler + + PUBWEAK MDMA_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel7_IRQHandler + B MDMA_Channel7_IRQHandler + + PUBWEAK MDMA_Channel8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel8_IRQHandler + B MDMA_Channel8_IRQHandler + + PUBWEAK MDMA_Channel9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel9_IRQHandler + B MDMA_Channel9_IRQHandler + + PUBWEAK MDMA_Channel10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel10_IRQHandler + B MDMA_Channel10_IRQHandler + + PUBWEAK MDMA_Channel11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel11_IRQHandler + B MDMA_Channel11_IRQHandler + + PUBWEAK MDMA_Channel12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel12_IRQHandler + B MDMA_Channel12_IRQHandler + + PUBWEAK MDMA_Channel13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel13_IRQHandler + B MDMA_Channel13_IRQHandler + + PUBWEAK MDMA_Channel14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel14_IRQHandler + B MDMA_Channel14_IRQHandler + + PUBWEAK MDMA_Channel15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel15_IRQHandler + B MDMA_Channel15_IRQHandler + + PUBWEAK SDPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDPU_IRQHandler + B SDPU_IRQHandler + + PUBWEAK FPU_CPU1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FPU_CPU1_IRQHandler + B FPU_CPU1_IRQHandler + + PUBWEAK ECCMON_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ECCMON_IRQHandler + B ECCMON_IRQHandler + + PUBWEAK RTC_ALARM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_ALARM_IRQHandler + B RTC_ALARM_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 I2C3_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_EV_IRQHandler + B I2C3_EV_IRQHandler + + PUBWEAK I2C3_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_ER_IRQHandler + B I2C3_ER_IRQHandler + + PUBWEAK I2C4_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_EV_IRQHandler + B I2C4_EV_IRQHandler + + PUBWEAK I2C4_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_ER_IRQHandler + B I2C4_ER_IRQHandler + + PUBWEAK I2C5_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_EV_IRQHandler + B I2C5_EV_IRQHandler + + PUBWEAK I2C5_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_ER_IRQHandler + B I2C5_ER_IRQHandler + + PUBWEAK I2C6_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_EV_IRQHandler + B I2C6_EV_IRQHandler + + PUBWEAK I2C6_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_ER_IRQHandler + B I2C6_ER_IRQHandler + + PUBWEAK I2C7_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_EV_IRQHandler + B I2C7_EV_IRQHandler + + PUBWEAK I2C7_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_ER_IRQHandler + B I2C7_ER_IRQHandler + + PUBWEAK I2C8_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_EV_IRQHandler + B I2C8_EV_IRQHandler + + PUBWEAK I2C8_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_ER_IRQHandler + B I2C8_ER_IRQHandler + + PUBWEAK I2C9_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_EV_IRQHandler + B I2C9_EV_IRQHandler + + PUBWEAK I2C9_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_ER_IRQHandler + B I2C9_ER_IRQHandler + + PUBWEAK I2C10_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_EV_IRQHandler + B I2C10_EV_IRQHandler + + PUBWEAK I2C10_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_ER_IRQHandler + B I2C10_ER_IRQHandler + + PUBWEAK I2S1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S1_IRQHandler + B I2S1_IRQHandler + + PUBWEAK I2S2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S2_IRQHandler + B I2S2_IRQHandler + + PUBWEAK I2S3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S3_IRQHandler + B I2S3_IRQHandler + + PUBWEAK I2S4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S4_IRQHandler + B I2S4_IRQHandler + + PUBWEAK xSPI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI1_IRQHandler + B xSPI1_IRQHandler + + PUBWEAK xSPI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI2_IRQHandler + B xSPI2_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 SPI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK SPI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI4_IRQHandler + B SPI4_IRQHandler + + PUBWEAK SPI5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI5_IRQHandler + B SPI5_IRQHandler + + PUBWEAK SPI6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI6_IRQHandler + B SPI6_IRQHandler + + PUBWEAK SPI7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI7_IRQHandler + B SPI7_IRQHandler + + PUBWEAK LCD_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_EV_IRQHandler + B LCD_EV_IRQHandler + + PUBWEAK LCD_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_ER_IRQHandler + B LCD_ER_IRQHandler + + PUBWEAK DVP1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP1_IRQHandler + B DVP1_IRQHandler + + PUBWEAK DVP2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP2_IRQHandler + B DVP2_IRQHandler + + PUBWEAK DMAMUX2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX2_IRQHandler + B DMAMUX2_IRQHandler + + PUBWEAK USB1_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_OUT_IRQHandler + B USB1_HS_EPx_OUT_IRQHandler + + PUBWEAK USB1_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_IN_IRQHandler + B USB1_HS_EPx_IN_IRQHandler + + PUBWEAK USB1_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_WKUP_IRQHandler + B USB1_HS_WKUP_IRQHandler + + PUBWEAK USB1_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_IRQHandler + B USB1_HS_IRQHandler + + PUBWEAK USB2_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_OUT_IRQHandler + B USB2_HS_EPx_OUT_IRQHandler + + PUBWEAK USB2_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_IN_IRQHandler + B USB2_HS_EPx_IN_IRQHandler + + PUBWEAK USB2_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_WKUP_IRQHandler + B USB2_HS_WKUP_IRQHandler + + PUBWEAK USB2_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_IRQHandler + B USB2_HS_IRQHandler + + PUBWEAK ETH1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_IRQHandler + B ETH1_IRQHandler + + PUBWEAK ETH1_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_PMT_LPI_IRQHandler + B ETH1_PMT_LPI_IRQHandler + + PUBWEAK ETH2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_IRQHandler + B ETH2_IRQHandler + + PUBWEAK ETH2_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_PMT_LPI_IRQHandler + B ETH2_PMT_LPI_IRQHandler + + PUBWEAK FDCAN1_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT0_IRQHandler + B FDCAN1_INT0_IRQHandler + + PUBWEAK FDCAN2_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT0_IRQHandler + B FDCAN2_INT0_IRQHandler + + PUBWEAK FDCAN3_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT0_IRQHandler + B FDCAN3_INT0_IRQHandler + + PUBWEAK FDCAN4_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT0_IRQHandler + B FDCAN4_INT0_IRQHandler + + PUBWEAK FDCAN1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT1_IRQHandler + B FDCAN1_INT1_IRQHandler + + PUBWEAK FDCAN2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT1_IRQHandler + B FDCAN2_INT1_IRQHandler + + PUBWEAK FDCAN3_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT1_IRQHandler + B FDCAN3_INT1_IRQHandler + + PUBWEAK FDCAN4_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT1_IRQHandler + B FDCAN4_INT1_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 USART4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART4_IRQHandler + B USART4_IRQHandler + + PUBWEAK USART5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART5_IRQHandler + B USART5_IRQHandler + + PUBWEAK USART6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART6_IRQHandler + B USART6_IRQHandler + + PUBWEAK USART7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART7_IRQHandler + B USART7_IRQHandler + + PUBWEAK USART8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART8_IRQHandler + B USART8_IRQHandler + + PUBWEAK UART9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART9_IRQHandler + B UART9_IRQHandler + + PUBWEAK UART10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART10_IRQHandler + B UART10_IRQHandler + + PUBWEAK UART11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART11_IRQHandler + B UART11_IRQHandler + + PUBWEAK UART12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART12_IRQHandler + B UART12_IRQHandler + + PUBWEAK UART13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART13_IRQHandler + B UART13_IRQHandler + + PUBWEAK UART14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART14_IRQHandler + B UART14_IRQHandler + + PUBWEAK UART15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART15_IRQHandler + B UART15_IRQHandler + + PUBWEAK LPUART1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART1_IRQHandler + B LPUART1_IRQHandler + + PUBWEAK LPUART2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART2_IRQHandler + B LPUART2_IRQHandler + + PUBWEAK GPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GPU_IRQHandler + B GPU_IRQHandler + + PUBWEAK SDMMC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC1_IRQHandler + B SDMMC1_IRQHandler + + PUBWEAK SDMMC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC2_IRQHandler + B SDMMC2_IRQHandler + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + PUBWEAK ADC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC2_IRQHandler + B ADC2_IRQHandler + + PUBWEAK ADC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC3_IRQHandler + B ADC3_IRQHandler + + PUBWEAK COMP1_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP1_2_IRQHandler + B COMP1_2_IRQHandler + + PUBWEAK COMP3_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP3_4_IRQHandler + B COMP3_4_IRQHandler + + PUBWEAK SHRTIM1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT1_IRQHandler + B SHRTIM1_INT1_IRQHandler + + PUBWEAK SHRTIM1_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT2_IRQHandler + B SHRTIM1_INT2_IRQHandler + + PUBWEAK SHRTIM1_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT3_IRQHandler + B SHRTIM1_INT3_IRQHandler + + PUBWEAK SHRTIM1_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT4_IRQHandler + B SHRTIM1_INT4_IRQHandler + + PUBWEAK SHRTIM1_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT5_IRQHandler + B SHRTIM1_INT5_IRQHandler + + PUBWEAK SHRTIM1_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT6_IRQHandler + B SHRTIM1_INT6_IRQHandler + + PUBWEAK SHRTIM1_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT7_IRQHandler + B SHRTIM1_INT7_IRQHandler + + PUBWEAK SHRTIM1_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT8_IRQHandler + B SHRTIM1_INT8_IRQHandler + + PUBWEAK SHRTIM2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT1_IRQHandler + B SHRTIM2_INT1_IRQHandler + + PUBWEAK SHRTIM2_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT2_IRQHandler + B SHRTIM2_INT2_IRQHandler + + PUBWEAK SHRTIM2_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT3_IRQHandler + B SHRTIM2_INT3_IRQHandler + + PUBWEAK SHRTIM2_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT4_IRQHandler + B SHRTIM2_INT4_IRQHandler + + PUBWEAK SHRTIM2_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT5_IRQHandler + B SHRTIM2_INT5_IRQHandler + + PUBWEAK SHRTIM2_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT6_IRQHandler + B SHRTIM2_INT6_IRQHandler + + PUBWEAK SHRTIM2_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT7_IRQHandler + B SHRTIM2_INT7_IRQHandler + + PUBWEAK SHRTIM2_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT8_IRQHandler + B SHRTIM2_INT8_IRQHandler + + PUBWEAK FDCAN5_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT0_IRQHandler + B FDCAN5_INT0_IRQHandler + + PUBWEAK FDCAN6_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT0_IRQHandler + B FDCAN6_INT0_IRQHandler + + PUBWEAK FDCAN7_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT0_IRQHandler + B FDCAN7_INT0_IRQHandler + + PUBWEAK FDCAN8_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT0_IRQHandler + B FDCAN8_INT0_IRQHandler + + PUBWEAK FDCAN5_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT1_IRQHandler + B FDCAN5_INT1_IRQHandler + + PUBWEAK FDCAN6_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT1_IRQHandler + B FDCAN6_INT1_IRQHandler + + PUBWEAK FDCAN7_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT1_IRQHandler + B FDCAN7_INT1_IRQHandler + + PUBWEAK FDCAN8_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT1_IRQHandler + B FDCAN8_INT1_IRQHandler + + PUBWEAK LPTIM5_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM5_WKUP_IRQHandler + B LPTIM5_WKUP_IRQHandler + + PUBWEAK JPEG_SGDMA_H2P_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_H2P_IRQHandler + B JPEG_SGDMA_H2P_IRQHandler + + PUBWEAK JPEG_SGDMA_P2H_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_P2H_IRQHandler + B JPEG_SGDMA_P2H_IRQHandler + + PUBWEAK WAKEUP_IO_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WAKEUP_IO_IRQHandler + B WAKEUP_IO_IRQHandler + + PUBWEAK SEMA4_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SEMA4_INT1_IRQHandler + B SEMA4_INT1_IRQHandler + + PUBWEAK WWDG2_RST_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG2_RST_IRQHandler + B WWDG2_RST_IRQHandler + + PUBWEAK OTPC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +OTPC_IRQHandler + B OTPC_IRQHandler + + PUBWEAK FEMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FEMC_IRQHandler + B FEMC_IRQHandler + + PUBWEAK DCMUB_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DCMUB_IRQHandler + B DCMUB_IRQHandler + + PUBWEAK DAC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC1_IRQHandler + B DAC1_IRQHandler + + PUBWEAK DAC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC2_IRQHandler + B DAC2_IRQHandler + + PUBWEAK MDMA_AHBS_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_AHBS_ER_IRQHandler + B MDMA_AHBS_ER_IRQHandler + + PUBWEAK CM7_CATCH_READ_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CM7_CATCH_READ_ER_IRQHandler + B CM7_CATCH_READ_ER_IRQHandler + + PUBWEAK DAC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC3_IRQHandler + B DAC3_IRQHandler + + PUBWEAK DAC4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC4_IRQHandler + B DAC4_IRQHandler + + PUBWEAK EMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EMC_IRQHandler + B EMC_IRQHandler + + PUBWEAK DAC5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC5_IRQHandler + B DAC5_IRQHandler + + PUBWEAK DAC6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC6_IRQHandler + B DAC6_IRQHandler + + PUBWEAK ESC_OPB_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_OPB_IRQHandler + B ESC_OPB_IRQHandler + + PUBWEAK ESC_SYNC0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC0_IRQHandler + B ESC_SYNC0_IRQHandler + + PUBWEAK ESC_SYNC1_RQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC1_RQHandler + B ESC_SYNC1_RQHandler + + PUBWEAK ESC_WRP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_WRP_IRQHandler + B ESC_WRP_IRQHandler + + PUBWEAK ATIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_BRK_IRQHandler + B ATIM1_BRK_IRQHandler + + PUBWEAK ATIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_TRG_COM_IRQHandler + B ATIM1_TRG_COM_IRQHandler + + PUBWEAK ATIM1_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_CC_IRQHandler + B ATIM1_CC_IRQHandler + + PUBWEAK ATIM1_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_UP_IRQHandler + B ATIM1_UP_IRQHandler + + PUBWEAK ATIM2_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_BRK_IRQHandler + B ATIM2_BRK_IRQHandler + + PUBWEAK ATIM2_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_TRG_COM_IRQHandler + B ATIM2_TRG_COM_IRQHandler + + PUBWEAK ATIM2_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_CC_IRQHandler + B ATIM2_CC_IRQHandler + + PUBWEAK ATIM2_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_UP_IRQHandler + B ATIM2_UP_IRQHandler + + PUBWEAK ATIM3_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_BRK_IRQHandler + B ATIM3_BRK_IRQHandler + + PUBWEAK ATIM3_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_TRG_COM_IRQHandler + B ATIM3_TRG_COM_IRQHandler + + PUBWEAK ATIM3_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_CC_IRQHandler + B ATIM3_CC_IRQHandler + + PUBWEAK ATIM3_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_UP_IRQHandler + B ATIM3_UP_IRQHandler + + PUBWEAK ATIM4_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_BRK_IRQHandler + B ATIM4_BRK_IRQHandler + + PUBWEAK ATIM4_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_TRG_COM_IRQHandler + B ATIM4_TRG_COM_IRQHandler + + PUBWEAK ATIM4_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_CC_IRQHandler + B ATIM4_CC_IRQHandler + + PUBWEAK ATIM4_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_UP_IRQHandler + B ATIM4_UP_IRQHandler + + PUBWEAK GTIMA1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA1_IRQHandler + B GTIMA1_IRQHandler + + PUBWEAK GTIMA2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA2_IRQHandler + B GTIMA2_IRQHandler + + PUBWEAK GTIMA3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA3_IRQHandler + B GTIMA3_IRQHandler + + PUBWEAK GTIMA4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA4_IRQHandler + B GTIMA4_IRQHandler + + PUBWEAK GTIMA5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA5_IRQHandler + B GTIMA5_IRQHandler + + PUBWEAK GTIMA6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA6_IRQHandler + B GTIMA6_IRQHandler + + PUBWEAK GTIMA7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA7_IRQHandler + B GTIMA7_IRQHandler + + PUBWEAK GTIMB1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB1_IRQHandler + B GTIMB1_IRQHandler + + PUBWEAK GTIMB2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB2_IRQHandler + B GTIMB2_IRQHandler + + PUBWEAK GTIMB3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB3_IRQHandler + B GTIMB3_IRQHandler + + PUBWEAK BTIM1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM1_IRQHandler + B BTIM1_IRQHandler + + PUBWEAK BTIM2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM2_IRQHandler + B BTIM2_IRQHandler + + PUBWEAK BTIM3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM3_IRQHandler + B BTIM3_IRQHandler + + PUBWEAK BTIM4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM4_IRQHandler + B BTIM4_IRQHandler + + PUBWEAK LPTIM1_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM1_WKUP_IRQHandler + B LPTIM1_WKUP_IRQHandler + + PUBWEAK LPTIM2_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM2_WKUP_IRQHandler + B LPTIM2_WKUP_IRQHandler + + PUBWEAK LPTIM3_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM3_WKUP_IRQHandler + B LPTIM3_WKUP_IRQHandler + + PUBWEAK LPTIM4_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM4_WKUP_IRQHandler + B LPTIM4_WKUP_IRQHandler + + PUBWEAK DSMU_FLT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT0_IRQHandler + B DSMU_FLT0_IRQHandler + + PUBWEAK DSMU_FLT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT1_IRQHandler + B DSMU_FLT1_IRQHandler + + PUBWEAK DSMU_FLT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT2_IRQHandler + B DSMU_FLT2_IRQHandler + + PUBWEAK DSMU_FLT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT3_IRQHandler + B DSMU_FLT3_IRQHandler + + PUBWEAK FMAC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FMAC_IRQHandler + B FMAC_IRQHandler + + PUBWEAK CORDIC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CORDIC_IRQHandler + B CORDIC_IRQHandler + + PUBWEAK DMAMUX1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX1_IRQHandler + B DMAMUX1_IRQHandler + + PUBWEAK MMU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MMU_IRQHandler + B MMU_IRQHandler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + END + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x_gcc.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x_gcc.s new file mode 100644 index 0000000000..cc03a036ab --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h73x_76x_gcc.s @@ -0,0 +1,1099 @@ +/********************************************************************************************************* + Copyright (c) 2024, Nations Technologies Inc. + + All rights reserved. + + This software is the exclusive property of Nations Technologies Inc. (Hereinafter + referred to as NATIONS). This software, and the product of NATIONS described herein + (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties + of the People's Republic of China and other applicable jurisdictions worldwide. + + NATIONS does not grant any license under its patents, copyrights, trademarks, or other + intellectual property rights. Names and brands of third party may be mentioned or referred + thereto (if any) for identification purposes only. + + NATIONS reserves the right to make changes, corrections, enhancements, modifications, and + improvements to this software at any time without notice. Please contact NATIONS and obtain + the latest version of this software before placing orders. + + Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes + no responsibility for the accuracy and reliability of this software. + + It is the responsibility of the user of this software to properly design, program, and test + the functionality and safety of any application made of this information and any resulting product. + In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or + consequential damages arising in any way out of the use of this software or the Product. + + NATIONS Products are neither intended nor warranted for usage in systems or equipment, any + malfunction or failure of which may cause loss of human life, bodily injury or severe property + damage. Such applications are deemed, "Insecure Usage". + + All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS + harmless from and against all claims, costs, damages, and other liabilities, arising from or related + to any customer's Insecure Usage. + + Any express or implied warranty with regard to this software or the Product, including,but not + limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement + are disclaimed to the fullest extent permitted by law. + + Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe + or otherwise distribute this software for any purposes, in whole or in part. + + NATIONS products and technologies shall not be used for or incorporated into any products or systems + whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. + User shall comply with any applicable export control laws and regulations promulgated and administered by + the governments of any countries asserting jurisdiction over the parties or transactions. + ************************************************************************************************************/ + + + .syntax unified + .cpu cortex-m7 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr r0, =_estack + mov sp, r0 /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + ldr r1, =_edata + ldr r2, =_sidata + movs r3, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +LoopCopyDataInit: + adds r4, r0, r3 + cmp r4, r1 + bcc CopyDataInit + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + ldr r4, =_ebss + movs r3, #0 + b LoopFillZerobss + +FillZerobss: + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + cmp r2, r4 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + +LoopForever: + b LoopForever + + +.size Reset_Handler, .-Reset_Handler + +/** +\*fun This is the code that gets called when the processor receives an +\* unexpected interrupt. This simply enters an infinite loop, preserving +\* the system state for examination by a debugger. +**/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/** +\* The minimal vector table for a Cortex M0. Note that the proper constructs +\* must be placed on this to ensure that it ends up at physical address 0x00000000. +**/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word N32SysTick_Handler + /* External Interrupts */ + .word WWDG1_IRQHandler /* Window1 Watchdog interrupt */ + .word PVD_IRQHandler /* PVD through EXTI Line16 detection interrupt */ + .word RTC_TAMPER_IRQHandler /* RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup timer through EXTI line 19 interrupt */ + .word RCC_IRQHandler /* RCC interrupt */ + .word EXTI0_IRQHandler /* EXTI Line 0 interrupt */ + .word EXTI1_IRQHandler /* EXTI Line 1 interrupt */ + .word EXTI2_IRQHandler /* EXTI Line 2 interrupt */ + .word EXTI3_IRQHandler /* EXTI Line 3 interrupt */ + .word EXTI4_IRQHandler /* EXTI Line 4 interrupt */ + .word EXTI9_5_IRQHandler /* EXTI Line[9:5] interrupt */ + .word EXTI15_10_IRQHandler /* EXTI Line[15:10] interrupt */ + .word DMA1_Channel0_IRQHandler /* DMA1 Channel 0 */ + .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 DMA2_Channel0_IRQHandler /* DMA2 Channel 0 */ + .word DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */ + .word DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */ + .word DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */ + .word DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */ + .word DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */ + .word DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */ + .word DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */ + .word DMA3_Channel0_IRQHandler /* DMA3 Channel 0 */ + .word DMA3_Channel1_IRQHandler /* DMA3 Channel 1 */ + .word DMA3_Channel2_IRQHandler /* DMA3 Channel 2 */ + .word DMA3_Channel3_IRQHandler /* DMA3 Channel 3 */ + .word DMA3_Channel4_IRQHandler /* DMA3 Channel 4 */ + .word DMA3_Channel5_IRQHandler /* DMA3 Channel 5 */ + .word DMA3_Channel6_IRQHandler /* DMA3 Channel 6 */ + .word DMA3_Channel7_IRQHandler /* DMA3 Channel 7 */ + .word MDMA_Channel0_IRQHandler /* MDMA Channel 0 */ + .word MDMA_Channel1_IRQHandler /* MDMA Channel 1 */ + .word MDMA_Channel2_IRQHandler /* MDMA Channel 2 */ + .word MDMA_Channel3_IRQHandler /* MDMA Channel 3 */ + .word MDMA_Channel4_IRQHandler /* MDMA Channel 4 */ + .word MDMA_Channel5_IRQHandler /* MDMA Channel 5 */ + .word MDMA_Channel6_IRQHandler /* MDMA Channel 6 */ + .word MDMA_Channel7_IRQHandler /* MDMA Channel 7 */ + .word MDMA_Channel8_IRQHandler /* MDMA Channel 8 */ + .word MDMA_Channel9_IRQHandler /* MDMA Channel 9 */ + .word MDMA_Channel10_IRQHandler /* MDMA Channel 10 */ + .word MDMA_Channel11_IRQHandler /* MDMA Channel 11 */ + .word MDMA_Channel12_IRQHandler /* MDMA Channel 12 */ + .word MDMA_Channel13_IRQHandler /* MDMA Channel 13 */ + .word MDMA_Channel14_IRQHandler /* MDMA Channel 14 */ + .word MDMA_Channel15_IRQHandler /* MDMA Channel 15 */ + .word SDPU_IRQHandler /* SDPU global interrupt */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word FPU_CPU1_IRQHandler /* FPU_CM7 global interrupt */ + .word ECCMON_IRQHandler /* ECCMON global interrupt */ + .word RTC_ALARM_IRQHandler /* RTC Alarm via EXTI17 interrupt */ + .word I2C1_EV_IRQHandler /* I2C1 event interrupt */ + .word I2C1_ER_IRQHandler /* I2C1 error interrupt */ + .word I2C2_EV_IRQHandler /* I2C2 event interrupt */ + .word I2C2_ER_IRQHandler /* I2C2 error interrupt */ + .word I2C3_EV_IRQHandler /* I2C3 event interrupt */ + .word I2C3_ER_IRQHandler /* I2C3 error interrupt */ + .word I2C4_EV_IRQHandler /* I2C4 event interrupt */ + .word I2C4_ER_IRQHandler /* I2C4 error interrupt */ + .word I2C5_EV_IRQHandler /* I2C5 event interrupt */ + .word I2C5_ER_IRQHandler /* I2C5 error interrupt */ + .word I2C6_EV_IRQHandler /* I2C6 event interrupt */ + .word I2C6_ER_IRQHandler /* I2C6 error interrupt */ + .word I2C7_EV_IRQHandler /* I2C7 event interrupt */ + .word I2C7_ER_IRQHandler /* I2C7 error interrupt */ + .word I2C8_EV_IRQHandler /* I2C8 event interrupt */ + .word I2C8_ER_IRQHandler /* I2C8 error interrupt */ + .word I2C9_EV_IRQHandler /* I2C9 event interrupt */ + .word I2C9_ER_IRQHandler /* I2C9 error interrupt */ + .word I2C10_EV_IRQHandler /* I2C10 event interrupt */ + .word I2C10_ER_IRQHandler /* I2C10 error interrupt */ + .word I2S1_IRQHandler /* I2S1 global interrupt */ + .word I2S2_IRQHandler /* I2S1 global interrupt */ + .word I2S3_IRQHandler /* I2S1 global interrupt */ + .word I2S4_IRQHandler /* I2S1 global interrupt */ + .word xSPI1_IRQHandler /* xSPI1 global interrupt */ + .word xSPI2_IRQHandler /* xSPI1 global interrupt */ + .word SPI1_IRQHandler /* SPI1 global interrupt */ + .word SPI2_IRQHandler /* SPI2 global interrupt */ + .word SPI3_IRQHandler /* SPI3 global interrupt */ + .word SPI4_IRQHandler /* SPI4 global interrupt */ + .word SPI5_IRQHandler /* SPI5 global interrupt */ + .word SPI6_IRQHandler /* SPI6 global interrupt */ + .word SPI7_IRQHandler /* SPI7 global interrupt */ + .word LCD_EV_IRQHandler /* TFT LCD Controller event interrupt */ + .word LCD_ER_IRQHandler /* TFT LCD Controller error interrupt */ + .word DVP1_IRQHandler /* DVP1 global interrupt */ + .word DVP2_IRQHandler /* DVP2 global interrupt */ + .word DMAMUX2_IRQHandler /* DMAMUX2 (MDMA MUX) global interrupt */ + .word USB1_HS_EPx_OUT_IRQHandler /* USB1_HS endpoint out global interrupt */ + .word USB1_HS_EPx_IN_IRQHandler /* USB1_HS endpoint in global interrupt */ + .word USB1_HS_WKUP_IRQHandler /* USB1_HS WKUP interrupt through EXTI line 62 */ + .word USB1_HS_IRQHandler /* USB1_HS global interrupt */ + .word USB2_HS_EPx_OUT_IRQHandler /* USB2_HS endpoint out global interrupt */ + .word USB2_HS_EPx_IN_IRQHandler /* USB2_HS endpoint in global interrupt */ + .word USB2_HS_WKUP_IRQHandler /* USB2_HS WKUP interrupt through EXTI line 63 */ + .word USB2_HS_IRQHandler /* USB2_HS global interrupt */ + .word ETH1_IRQHandler /* Ethernet 1 global interrupt */ + .word ETH1_PMT_LPI_IRQHandler /* Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 */ + .word ETH2_IRQHandler /* Ethernet 2 global interrupt */ + .word ETH2_PMT_LPI_IRQHandler /* Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 */ + .word FDCAN1_INT0_IRQHandler /* FDCAN1 global interrupt line 0 */ + .word FDCAN2_INT0_IRQHandler /* FDCAN2 global interrupt line 0 */ + .word FDCAN3_INT0_IRQHandler /* FDCAN3 global interrupt line 0 */ + .word FDCAN4_INT0_IRQHandler /* FDCAN4 global interrupt line 0 */ + .word FDCAN1_INT1_IRQHandler /* FDCAN1 global interrupt line 1 */ + .word FDCAN2_INT1_IRQHandler /* FDCAN2 global interrupt line 1 */ + .word FDCAN3_INT1_IRQHandler /* FDCAN3 global interrupt line 1 */ + .word FDCAN4_INT1_IRQHandler /* FDCAN4 global interrupt line 1 */ + .word USART1_IRQHandler /* USART1 global interrupt */ + .word USART2_IRQHandler /* USART2 global interrupt */ + .word USART3_IRQHandler /* USART3 global interrupt */ + .word USART4_IRQHandler /* USART4 global interrupt */ + .word USART5_IRQHandler /* USART5 global interrupt */ + .word USART6_IRQHandler /* USART6 global interrupt */ + .word USART7_IRQHandler /* USART7 global interrupt */ + .word USART8_IRQHandler /* USART8 global interrupt */ + .word UART9_IRQHandler /* UART9 global interrupt */ + .word UART10_IRQHandler /* UART10 global interrupt */ + .word UART11_IRQHandler /* UART11 global interrupt */ + .word UART12_IRQHandler /* UART12 global interrupt */ + .word UART13_IRQHandler /* UART13 global interrupt */ + .word UART14_IRQHandler /* UART14 global interrupt */ + .word UART15_IRQHandler /* UART15 global interrupt */ + .word LPUART1_IRQHandler /* LPUART1 global interrupt + wakeup through EXTI line 49 */ + .word LPUART2_IRQHandler /* LPUART2 global interrupt + wakeup through EXTI line 52 */ + .word GPU_IRQHandler /* GPU global interrupt */ + .word 0 /* Reserved */ + .word SDMMC1_IRQHandler /* SDMMC1_IRQ + WKUP through EXTI line 24 */ + .word SDMMC2_IRQHandler /* SDMMC2_IRQ + WKUP through EXTI line 25 */ + .word ADC1_IRQHandler /* ADC1 global interrupt */ + .word ADC2_IRQHandler /* ADC2 global interrupt */ + .word ADC3_IRQHandler /* ADC3 global interrupt */ + .word COMP1_2_IRQHandler /* COMP1 and COMP2 through EXTI line 20 and 21 */ + .word COMP3_4_IRQHandler /* COMP3 and COMP4 through EXTI line 22 and 23 */ + .word SHRTIM1_INT1_IRQHandler /* High Resolution timer 1 interrupt 1 */ + .word SHRTIM1_INT2_IRQHandler /* High Resolution timer 1 interrupt 2 */ + .word SHRTIM1_INT3_IRQHandler /* High Resolution timer 1 interrupt 3 */ + .word SHRTIM1_INT4_IRQHandler /* High Resolution timer 1 interrupt 4 */ + .word SHRTIM1_INT5_IRQHandler /* High Resolution timer 1 interrupt 5 */ + .word SHRTIM1_INT6_IRQHandler /* High Resolution timer 1 interrupt 6 */ + .word SHRTIM1_INT7_IRQHandler /* High Resolution timer 1 interrupt 7 */ + .word SHRTIM1_INT8_IRQHandler /* High Resolution timer 1 interrupt 8 */ + .word SHRTIM2_INT1_IRQHandler /* High Resolution timer 2 interrupt 1 */ + .word SHRTIM2_INT2_IRQHandler /* High Resolution timer 2 interrupt 2 */ + .word SHRTIM2_INT3_IRQHandler /* High Resolution timer 2 interrupt 3 */ + .word SHRTIM2_INT4_IRQHandler /* High Resolution timer 2 interrupt 4 */ + .word SHRTIM2_INT5_IRQHandler /* High Resolution timer 2 interrupt 5 */ + .word SHRTIM2_INT6_IRQHandler /* High Resolution timer 2 interrupt 6 */ + .word SHRTIM2_INT7_IRQHandler /* High Resolution timer 2 interrupt 7 */ + .word SHRTIM2_INT8_IRQHandler /* High Resolution timer 2 interrupt 8 */ + .word FDCAN5_INT0_IRQHandler /* FDCAN5 global interrupt line 0 */ + .word FDCAN6_INT0_IRQHandler /* FDCAN6 global interrupt line 0 */ + .word FDCAN7_INT0_IRQHandler /* FDCAN7 global interrupt line 0 */ + .word FDCAN8_INT0_IRQHandler /* FDCAN8 global interrupt line 0 */ + .word FDCAN5_INT1_IRQHandler /* FDCAN5 global interrupt line 1 */ + .word FDCAN6_INT1_IRQHandler /* FDCAN6 global interrupt line 1 */ + .word FDCAN7_INT1_IRQHandler /* FDCAN7 global interrupt line 1 */ + .word FDCAN8_INT1_IRQHandler /* FDCAN8 global interrupt line 1 */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word LPTIM5_WKUP_IRQHandler /* LPTIM5 wakeup through EXTI 86 */ + .word JPEG_SGDMA_H2P_IRQHandler /* JPEG SGDMA Host to Peripheral Interrupt */ + .word JPEG_SGDMA_P2H_IRQHandler /* JPEG SGDMA Peripheral to Host Interrupt */ + .word WAKEUP_IO_IRQHandler /* 6 WAKEUP IOs through EXTI line 70-75 */ + .word SEMA4_INT1_IRQHandler /* SEMA4 interrupt1 */ + .word 0 /* Reserved */ + .word WWDG2_RST_IRQHandler /* WWDG2 reset interrupt through EXTI line 82 */ + .word OTPC_IRQHandler /* OTPC interrupt */ + .word FEMC_IRQHandler /* FEMC interrupt */ + .word DCMUB_IRQHandler /* DCMUB interrupt */ + .word DAC1_IRQHandler /* DAC1 interrupt */ + .word DAC2_IRQHandler /* DAC2 interrupt */ + .word MDMA_AHBS_ER_IRQHandler /* MDMA HABS ERROR through EXTI line55-56 */ + .word CM7_CATCH_READ_ER_IRQHandler /* CM7 Error on Cache Read through EXTI line 64-65 */ + .word DAC3_IRQHandler /* DAC3 interrupt */ + .word DAC4_IRQHandler /* DAC4 interrupt */ + .word EMC_IRQHandler /* EMC event interrupt through EXTI line 88-89 */ + .word DAC5_IRQHandler /* DAC5 interrupt */ + .word DAC6_IRQHandler /* DAC6 interrupt */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word ATIM1_BRK_IRQHandler /* Advanced timer 1 break interrupt */ + .word ATIM1_TRG_COM_IRQHandler /* Advanced timer 1 trigger and commutation interrupts */ + .word ATIM1_CC_IRQHandler /* Advanced timer 1 capture/compare interrupt */ + .word ATIM1_UP_IRQHandler /* Advanced timer 1 update interrupt */ + .word ATIM2_BRK_IRQHandler /* Advanced timer 2 break interrupt */ + .word ATIM2_TRG_COM_IRQHandler /* advanced timer 2 trigger and commutation interrupts */ + .word ATIM2_CC_IRQHandler /* Advanced timer 2 capture/compare interrupt */ + .word ATIM2_UP_IRQHandler /* Advanced timer 2 update interrupt */ + .word ATIM3_BRK_IRQHandler /* Advanced timer 3 break interrupt */ + .word ATIM3_TRG_COM_IRQHandler /* Advanced timer 3 trigger and commutation interrupts */ + .word ATIM3_CC_IRQHandler /* Advanced timer 3 capture/compare interrupt */ + .word ATIM3_UP_IRQHandler /* Advanced timer 3 update interrupt */ + .word ATIM4_BRK_IRQHandler /* Advanced timer 4 break interrupt */ + .word ATIM4_TRG_COM_IRQHandler /* Advanced timer 4 trigger and commutation interrupts */ + .word ATIM4_CC_IRQHandler /* Advanced timer 4 capture/compare interrupt */ + .word ATIM4_UP_IRQHandler /* Advanced timer 4 update interrupt */ + .word GTIMA1_IRQHandler /* General timer A1 global interrupt */ + .word GTIMA2_IRQHandler /* General timer A2 global interrupt */ + .word GTIMA3_IRQHandler /* General timer A3 global interrupt */ + .word GTIMA4_IRQHandler /* General timer A4 global interrupt */ + .word GTIMA5_IRQHandler /* General timer A5 global interrupt */ + .word GTIMA6_IRQHandler /* General timer A6 global interrupt */ + .word GTIMA7_IRQHandler /* General timer A7 global interrupt */ + .word GTIMB1_IRQHandler /* General timer B1 global interrupt */ + .word GTIMB2_IRQHandler /* General timer B2 global interrupt */ + .word GTIMB3_IRQHandler /* General timer B3 global interrupt */ + .word BTIM1_IRQHandler /* Base timer 1 global interrupt */ + .word BTIM2_IRQHandler /* Base timer 2 global interrupt */ + .word BTIM3_IRQHandler /* Base timer 3 global interrupt */ + .word BTIM4_IRQHandler /* Base timer 4 global interrupt */ + .word LPTIM1_WKUP_IRQHandler /* LPTIM1 wakeup interrupt */ + .word LPTIM2_WKUP_IRQHandler /* LPTIM2 wakeup interrupt */ + .word LPTIM3_WKUP_IRQHandler /* LPTIM3 wakeup interrupt */ + .word LPTIM4_WKUP_IRQHandler /* LPTIM4 wakeup interrupt */ + .word DSMU_FLT0_IRQHandler /* DSMU Filter interrupt 0 */ + .word DSMU_FLT1_IRQHandler /* DSMU Filter interrupt 1 */ + .word DSMU_FLT2_IRQHandler /* DSMU Filter interrupt 2 */ + .word DSMU_FLT3_IRQHandler /* DSMU Filter interrupt 3 */ + .word FMAC_IRQHandler /* FMAC global interrupt */ + .word CORDIC_IRQHandler /* Cordic global interrupt */ + .word DMAMUX1_IRQHandler /* DMAMUX1 interrupt */ + .word MMU_IRQHandler /* MMU interrupt */ + .word SysTick_Handler + /* need check to user manual of exti chapter */ + +/** +\* Provide weak aliases for each Exception handler to the Default_Handler. +\* As they are weak aliases, any function with the same name will override +\* this definition. +**/ + + .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 N32SysTick_Handler + .thumb_set N32SysTick_Handler,Default_Handler + + .weak WWDG1_IRQHandler + .thumb_set WWDG1_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak RTC_TAMPER_IRQHandler + .thumb_set RTC_TAMPER_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak DMA1_Channel0_IRQHandler + .thumb_set DMA1_Channel0_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 DMA2_Channel0_IRQHandler + .thumb_set DMA2_Channel0_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_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak DMA2_Channel6_IRQHandler + .thumb_set DMA2_Channel6_IRQHandler,Default_Handler + + .weak DMA2_Channel7_IRQHandler + .thumb_set DMA2_Channel7_IRQHandler,Default_Handler + + .weak DMA3_Channel0_IRQHandler + .thumb_set DMA3_Channel0_IRQHandler,Default_Handler + + .weak DMA3_Channel1_IRQHandler + .thumb_set DMA3_Channel1_IRQHandler,Default_Handler + + .weak DMA3_Channel2_IRQHandler + .thumb_set DMA3_Channel2_IRQHandler,Default_Handler + + .weak DMA3_Channel3_IRQHandler + .thumb_set DMA3_Channel3_IRQHandler,Default_Handler + + .weak DMA3_Channel4_IRQHandler + .thumb_set DMA3_Channel4_IRQHandler,Default_Handler + + .weak DMA3_Channel5_IRQHandler + .thumb_set DMA3_Channel5_IRQHandler,Default_Handler + + .weak DMA3_Channel6_IRQHandler + .thumb_set DMA3_Channel6_IRQHandler,Default_Handler + + .weak DMA3_Channel7_IRQHandler + .thumb_set DMA3_Channel7_IRQHandler,Default_Handler + + .weak MDMA_Channel0_IRQHandler + .thumb_set MDMA_Channel0_IRQHandler,Default_Handler + + .weak MDMA_Channel1_IRQHandler + .thumb_set MDMA_Channel1_IRQHandler,Default_Handler + + .weak MDMA_Channel2_IRQHandler + .thumb_set MDMA_Channel2_IRQHandler,Default_Handler + + .weak MDMA_Channel3_IRQHandler + .thumb_set MDMA_Channel3_IRQHandler,Default_Handler + + .weak MDMA_Channel4_IRQHandler + .thumb_set MDMA_Channel4_IRQHandler,Default_Handler + + .weak MDMA_Channel5_IRQHandler + .thumb_set MDMA_Channel5_IRQHandler,Default_Handler + + .weak MDMA_Channel6_IRQHandler + .thumb_set MDMA_Channel6_IRQHandler,Default_Handler + + .weak MDMA_Channel7_IRQHandler + .thumb_set MDMA_Channel7_IRQHandler,Default_Handler + + .weak MDMA_Channel8_IRQHandler + .thumb_set MDMA_Channel8_IRQHandler,Default_Handler + + .weak MDMA_Channel9_IRQHandler + .thumb_set MDMA_Channel9_IRQHandler,Default_Handler + + .weak MDMA_Channel10_IRQHandler + .thumb_set MDMA_Channel10_IRQHandler,Default_Handler + + .weak MDMA_Channel11_IRQHandler + .thumb_set MDMA_Channel11_IRQHandler,Default_Handler + + .weak MDMA_Channel12_IRQHandler + .thumb_set MDMA_Channel12_IRQHandler,Default_Handler + + .weak MDMA_Channel13_IRQHandler + .thumb_set MDMA_Channel13_IRQHandler,Default_Handler + + .weak MDMA_Channel14_IRQHandler + .thumb_set MDMA_Channel14_IRQHandler,Default_Handler + + .weak MDMA_Channel15_IRQHandler + .thumb_set MDMA_Channel15_IRQHandler,Default_Handler + + .weak SDPU_IRQHandler + .thumb_set SDPU_IRQHandler,Default_Handler + + .weak FPU_CPU1_IRQHandler + .thumb_set FPU_CPU1_IRQHandler,Default_Handler + + .weak ECCMON_IRQHandler + .thumb_set ECCMON_IRQHandler,Default_Handler + + .weak RTC_ALARM_IRQHandler + .thumb_set RTC_ALARM_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 I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak I2C4_EV_IRQHandler + .thumb_set I2C4_EV_IRQHandler,Default_Handler + + .weak I2C4_ER_IRQHandler + .thumb_set I2C4_ER_IRQHandler,Default_Handler + + .weak I2C5_EV_IRQHandler + .thumb_set I2C5_EV_IRQHandler,Default_Handler + + .weak I2C5_ER_IRQHandler + .thumb_set I2C5_ER_IRQHandler,Default_Handler + + .weak I2C6_EV_IRQHandler + .thumb_set I2C6_EV_IRQHandler,Default_Handler + + .weak I2C6_ER_IRQHandler + .thumb_set I2C6_ER_IRQHandler,Default_Handler + + .weak I2C7_EV_IRQHandler + .thumb_set I2C7_EV_IRQHandler,Default_Handler + + .weak I2C7_ER_IRQHandler + .thumb_set I2C7_ER_IRQHandler,Default_Handler + + .weak I2C8_EV_IRQHandler + .thumb_set I2C8_EV_IRQHandler,Default_Handler + + .weak I2C8_ER_IRQHandler + .thumb_set I2C8_ER_IRQHandler,Default_Handler + + .weak I2C9_EV_IRQHandler + .thumb_set I2C9_EV_IRQHandler,Default_Handler + + .weak I2C9_ER_IRQHandler + .thumb_set I2C9_ER_IRQHandler,Default_Handler + + .weak I2C10_EV_IRQHandler + .thumb_set I2C10_EV_IRQHandler,Default_Handler + + .weak I2C10_ER_IRQHandler + .thumb_set I2C10_ER_IRQHandler,Default_Handler + + .weak I2S1_IRQHandler + .thumb_set I2S1_IRQHandler,Default_Handler + + .weak I2S2_IRQHandler + .thumb_set I2S2_IRQHandler,Default_Handler + + .weak I2S3_IRQHandler + .thumb_set I2S3_IRQHandler,Default_Handler + + .weak I2S4_IRQHandler + .thumb_set I2S4_IRQHandler,Default_Handler + + .weak xSPI1_IRQHandler + .thumb_set xSPI1_IRQHandler,Default_Handler + + .weak xSPI2_IRQHandler + .thumb_set xSPI2_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak SPI4_IRQHandler + .thumb_set SPI4_IRQHandler,Default_Handler + + .weak SPI5_IRQHandler + .thumb_set SPI5_IRQHandler,Default_Handler + + .weak SPI6_IRQHandler + .thumb_set SPI6_IRQHandler,Default_Handler + + .weak SPI7_IRQHandler + .thumb_set SPI7_IRQHandler,Default_Handler + + .weak LCD_EV_IRQHandler + .thumb_set LCD_EV_IRQHandler,Default_Handler + + .weak LCD_ER_IRQHandler + .thumb_set LCD_ER_IRQHandler,Default_Handler + + .weak DVP1_IRQHandler + .thumb_set DVP1_IRQHandler,Default_Handler + + .weak DVP2_IRQHandler + .thumb_set DVP2_IRQHandler,Default_Handler + + .weak DMAMUX2_IRQHandler + .thumb_set DMAMUX2_IRQHandler,Default_Handler + + .weak USB1_HS_EPx_OUT_IRQHandler + .thumb_set USB1_HS_EPx_OUT_IRQHandler,Default_Handler + + .weak USB1_HS_EPx_IN_IRQHandler + .thumb_set USB1_HS_EPx_IN_IRQHandler,Default_Handler + + .weak USB1_HS_WKUP_IRQHandler + .thumb_set USB1_HS_WKUP_IRQHandler,Default_Handler + + .weak USB1_HS_IRQHandler + .thumb_set USB1_HS_IRQHandler,Default_Handler + + .weak USB2_HS_EPx_OUT_IRQHandler + .thumb_set USB2_HS_EPx_OUT_IRQHandler,Default_Handler + + .weak USB2_HS_EPx_IN_IRQHandler + .thumb_set USB2_HS_EPx_IN_IRQHandler,Default_Handler + + .weak USB2_HS_WKUP_IRQHandler + .thumb_set USB2_HS_WKUP_IRQHandler,Default_Handler + + .weak USB2_HS_IRQHandler + .thumb_set USB2_HS_IRQHandler,Default_Handler + + .weak ETH1_IRQHandler + .thumb_set ETH1_IRQHandler,Default_Handler + + .weak ETH1_PMT_LPI_IRQHandler + .thumb_set ETH1_PMT_LPI_IRQHandler,Default_Handler + + .weak ETH2_IRQHandler + .thumb_set ETH2_IRQHandler,Default_Handler + + .weak ETH2_PMT_LPI_IRQHandler + .thumb_set ETH2_PMT_LPI_IRQHandler,Default_Handler + + .weak FDCAN1_INT0_IRQHandler + .thumb_set FDCAN1_INT0_IRQHandler,Default_Handler + + .weak FDCAN2_INT0_IRQHandler + .thumb_set FDCAN2_INT0_IRQHandler,Default_Handler + + .weak FDCAN3_INT0_IRQHandler + .thumb_set FDCAN3_INT0_IRQHandler,Default_Handler + + .weak FDCAN4_INT0_IRQHandler + .thumb_set FDCAN4_INT0_IRQHandler,Default_Handler + + .weak FDCAN1_INT1_IRQHandler + .thumb_set FDCAN1_INT1_IRQHandler,Default_Handler + + .weak FDCAN2_INT1_IRQHandler + .thumb_set FDCAN2_INT1_IRQHandler,Default_Handler + + .weak FDCAN3_INT1_IRQHandler + .thumb_set FDCAN3_INT1_IRQHandler,Default_Handler + + .weak FDCAN4_INT1_IRQHandler + .thumb_set FDCAN4_INT1_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 USART4_IRQHandler + .thumb_set USART4_IRQHandler,Default_Handler + + .weak USART5_IRQHandler + .thumb_set USART5_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak USART7_IRQHandler + .thumb_set USART7_IRQHandler,Default_Handler + + .weak USART8_IRQHandler + .thumb_set USART8_IRQHandler,Default_Handler + + .weak UART9_IRQHandler + .thumb_set UART9_IRQHandler,Default_Handler + + .weak UART10_IRQHandler + .thumb_set UART10_IRQHandler,Default_Handler + + .weak UART11_IRQHandler + .thumb_set UART11_IRQHandler,Default_Handler + + .weak UART12_IRQHandler + .thumb_set UART12_IRQHandler,Default_Handler + + .weak UART13_IRQHandler + .thumb_set UART13_IRQHandler,Default_Handler + + .weak UART14_IRQHandler + .thumb_set UART14_IRQHandler,Default_Handler + + .weak UART15_IRQHandler + .thumb_set UART15_IRQHandler,Default_Handler + + .weak LPUART1_IRQHandler + .thumb_set LPUART1_IRQHandler,Default_Handler + + .weak LPUART2_IRQHandler + .thumb_set LPUART2_IRQHandler,Default_Handler + + .weak GPU_IRQHandler + .thumb_set GPU_IRQHandler,Default_Handler + + .weak SDMMC1_IRQHandler + .thumb_set SDMMC1_IRQHandler,Default_Handler + + .weak SDMMC2_IRQHandler + .thumb_set SDMMC2_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak ADC2_IRQHandler + .thumb_set ADC2_IRQHandler,Default_Handler + + .weak ADC3_IRQHandler + .thumb_set ADC3_IRQHandler,Default_Handler + + .weak COMP1_2_IRQHandler + .thumb_set COMP1_2_IRQHandler,Default_Handler + + .weak COMP3_4_IRQHandler + .thumb_set COMP3_4_IRQHandler,Default_Handler + + .weak SHRTIM1_INT1_IRQHandler + .thumb_set SHRTIM1_INT1_IRQHandler,Default_Handler + + .weak SHRTIM1_INT2_IRQHandler + .thumb_set SHRTIM1_INT2_IRQHandler,Default_Handler + + .weak SHRTIM1_INT3_IRQHandler + .thumb_set SHRTIM1_INT3_IRQHandler,Default_Handler + + .weak SHRTIM1_INT4_IRQHandler + .thumb_set SHRTIM1_INT4_IRQHandler,Default_Handler + + .weak SHRTIM1_INT5_IRQHandler + .thumb_set SHRTIM1_INT5_IRQHandler,Default_Handler + + .weak SHRTIM1_INT6_IRQHandler + .thumb_set SHRTIM1_INT6_IRQHandler,Default_Handler + + .weak SHRTIM1_INT7_IRQHandler + .thumb_set SHRTIM1_INT7_IRQHandler,Default_Handler + + .weak SHRTIM1_INT8_IRQHandler + .thumb_set SHRTIM1_INT8_IRQHandler,Default_Handler + + .weak SHRTIM2_INT1_IRQHandler + .thumb_set SHRTIM2_INT1_IRQHandler,Default_Handler + + .weak SHRTIM2_INT2_IRQHandler + .thumb_set SHRTIM2_INT2_IRQHandler,Default_Handler + + .weak SHRTIM2_INT3_IRQHandler + .thumb_set SHRTIM2_INT3_IRQHandler,Default_Handler + + .weak SHRTIM2_INT4_IRQHandler + .thumb_set SHRTIM2_INT4_IRQHandler,Default_Handler + + .weak SHRTIM2_INT5_IRQHandler + .thumb_set SHRTIM2_INT5_IRQHandler,Default_Handler + + .weak SHRTIM2_INT6_IRQHandler + .thumb_set SHRTIM2_INT6_IRQHandler,Default_Handler + + .weak SHRTIM2_INT7_IRQHandler + .thumb_set SHRTIM2_INT7_IRQHandler,Default_Handler + + .weak SHRTIM2_INT8_IRQHandler + .thumb_set SHRTIM2_INT8_IRQHandler,Default_Handler + + .weak FDCAN5_INT0_IRQHandler + .thumb_set FDCAN5_INT0_IRQHandler,Default_Handler + + .weak FDCAN6_INT0_IRQHandler + .thumb_set FDCAN6_INT0_IRQHandler,Default_Handler + + .weak FDCAN7_INT0_IRQHandler + .thumb_set FDCAN7_INT0_IRQHandler,Default_Handler + + .weak FDCAN8_INT0_IRQHandler + .thumb_set FDCAN8_INT0_IRQHandler,Default_Handler + + .weak FDCAN5_INT1_IRQHandler + .thumb_set FDCAN5_INT1_IRQHandler,Default_Handler + + .weak FDCAN6_INT1_IRQHandler + .thumb_set FDCAN6_INT1_IRQHandler,Default_Handler + + .weak FDCAN7_INT1_IRQHandler + .thumb_set FDCAN7_INT1_IRQHandler,Default_Handler + + .weak FDCAN8_INT1_IRQHandler + .thumb_set FDCAN8_INT1_IRQHandler,Default_Handler + + .weak LPTIM5_WKUP_IRQHandler + .thumb_set LPTIM5_WKUP_IRQHandler,Default_Handler + + .weak JPEG_SGDMA_H2P_IRQHandler + .thumb_set JPEG_SGDMA_H2P_IRQHandler,Default_Handler + + .weak JPEG_SGDMA_P2H_IRQHandler + .thumb_set JPEG_SGDMA_P2H_IRQHandler,Default_Handler + + .weak WAKEUP_IO_IRQHandler + .thumb_set WAKEUP_IO_IRQHandler,Default_Handler + + .weak SEMA4_INT1_IRQHandler + .thumb_set SEMA4_INT1_IRQHandler,Default_Handler + + .weak WWDG2_RST_IRQHandler + .thumb_set WWDG2_RST_IRQHandler,Default_Handler + + .weak OTPC_IRQHandler + .thumb_set OTPC_IRQHandler,Default_Handler + + .weak FEMC_IRQHandler + .thumb_set FEMC_IRQHandler,Default_Handler + + .weak DCMUB_IRQHandler + .thumb_set DCMUB_IRQHandler,Default_Handler + + .weak DAC1_IRQHandler + .thumb_set DAC1_IRQHandler,Default_Handler + + .weak DAC2_IRQHandler + .thumb_set DAC2_IRQHandler,Default_Handler + + .weak MDMA_AHBS_ER_IRQHandler + .thumb_set MDMA_AHBS_ER_IRQHandler,Default_Handler + + .weak CM7_CATCH_READ_ER_IRQHandler + .thumb_set CM7_CATCH_READ_ER_IRQHandler,Default_Handler + + .weak DAC3_IRQHandler + .thumb_set DAC3_IRQHandler,Default_Handler + + .weak DAC4_IRQHandler + .thumb_set DAC4_IRQHandler,Default_Handler + + .weak EMC_IRQHandler + .thumb_set EMC_IRQHandler,Default_Handler + + .weak DAC5_IRQHandler + .thumb_set DAC5_IRQHandler,Default_Handler + + .weak DAC6_IRQHandler + .thumb_set DAC6_IRQHandler,Default_Handler + + .weak ATIM1_BRK_IRQHandler + .thumb_set ATIM1_BRK_IRQHandler,Default_Handler + + .weak ATIM1_TRG_COM_IRQHandler + .thumb_set ATIM1_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM1_CC_IRQHandler + .thumb_set ATIM1_CC_IRQHandler,Default_Handler + + .weak ATIM1_UP_IRQHandler + .thumb_set ATIM1_UP_IRQHandler,Default_Handler + + .weak ATIM2_BRK_IRQHandler + .thumb_set ATIM2_BRK_IRQHandler,Default_Handler + + .weak ATIM2_TRG_COM_IRQHandler + .thumb_set ATIM2_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM2_CC_IRQHandler + .thumb_set ATIM2_CC_IRQHandler,Default_Handler + + .weak ATIM2_UP_IRQHandler + .thumb_set ATIM2_UP_IRQHandler,Default_Handler + + .weak ATIM3_BRK_IRQHandler + .thumb_set ATIM3_BRK_IRQHandler,Default_Handler + + .weak ATIM3_TRG_COM_IRQHandler + .thumb_set ATIM3_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM3_CC_IRQHandler + .thumb_set ATIM3_CC_IRQHandler,Default_Handler + + .weak ATIM3_UP_IRQHandler + .thumb_set ATIM3_UP_IRQHandler,Default_Handler + + .weak ATIM4_BRK_IRQHandler + .thumb_set ATIM4_BRK_IRQHandler,Default_Handler + + .weak ATIM4_TRG_COM_IRQHandler + .thumb_set ATIM4_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM4_CC_IRQHandler + .thumb_set ATIM4_CC_IRQHandler,Default_Handler + + .weak ATIM4_UP_IRQHandler + .thumb_set ATIM4_UP_IRQHandler,Default_Handler + + .weak GTIMA1_IRQHandler + .thumb_set GTIMA1_IRQHandler,Default_Handler + + .weak GTIMA2_IRQHandler + .thumb_set GTIMA2_IRQHandler,Default_Handler + + .weak GTIMA3_IRQHandler + .thumb_set GTIMA3_IRQHandler,Default_Handler + + .weak GTIMA4_IRQHandler + .thumb_set GTIMA4_IRQHandler,Default_Handler + + .weak GTIMA5_IRQHandler + .thumb_set GTIMA5_IRQHandler,Default_Handler + + .weak GTIMA6_IRQHandler + .thumb_set GTIMA6_IRQHandler,Default_Handler + + .weak GTIMA7_IRQHandler + .thumb_set GTIMA7_IRQHandler,Default_Handler + + .weak GTIMB1_IRQHandler + .thumb_set GTIMB1_IRQHandler,Default_Handler + + .weak GTIMB2_IRQHandler + .thumb_set GTIMB2_IRQHandler,Default_Handler + + .weak GTIMB3_IRQHandler + .thumb_set GTIMB3_IRQHandler,Default_Handler + + .weak BTIM1_IRQHandler + .thumb_set BTIM1_IRQHandler,Default_Handler + + .weak BTIM2_IRQHandler + .thumb_set BTIM2_IRQHandler,Default_Handler + + .weak BTIM3_IRQHandler + .thumb_set BTIM3_IRQHandler,Default_Handler + + .weak BTIM4_IRQHandler + .thumb_set BTIM4_IRQHandler,Default_Handler + + .weak LPTIM1_WKUP_IRQHandler + .thumb_set LPTIM1_WKUP_IRQHandler,Default_Handler + + .weak LPTIM2_WKUP_IRQHandler + .thumb_set LPTIM2_WKUP_IRQHandler,Default_Handler + + .weak LPTIM3_WKUP_IRQHandler + .thumb_set LPTIM3_WKUP_IRQHandler,Default_Handler + + .weak LPTIM4_WKUP_IRQHandler + .thumb_set LPTIM4_WKUP_IRQHandler,Default_Handler + + .weak DSMU_FLT0_IRQHandler + .thumb_set DSMU_FLT0_IRQHandler,Default_Handler + + .weak DSMU_FLT1_IRQHandler + .thumb_set DSMU_FLT1_IRQHandler,Default_Handler + + .weak DSMU_FLT2_IRQHandler + .thumb_set DSMU_FLT2_IRQHandler,Default_Handler + + .weak DSMU_FLT3_IRQHandler + .thumb_set DSMU_FLT3_IRQHandler,Default_Handler + + .weak FMAC_IRQHandler + .thumb_set FMAC_IRQHandler,Default_Handler + + .weak CORDIC_IRQHandler + .thumb_set CORDIC_IRQHandler,Default_Handler + + .weak DMAMUX1_IRQHandler + .thumb_set DMAMUX1_IRQHandler,Default_Handler + + .weak MMU_IRQHandler + .thumb_set MMU_IRQHandler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h76x_ITCM_gcc.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h76x_ITCM_gcc.s new file mode 100644 index 0000000000..9283bf1383 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h76x_ITCM_gcc.s @@ -0,0 +1,1126 @@ +/********************************************************************************************************* + Copyright (c) 2024, Nations Technologies Inc. + + All rights reserved. + + This software is the exclusive property of Nations Technologies Inc. (Hereinafter + referred to as NATIONS). This software, and the product of NATIONS described herein + (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties + of the People's Republic of China and other applicable jurisdictions worldwide. + + NATIONS does not grant any license under its patents, copyrights, trademarks, or other + intellectual property rights. Names and brands of third party may be mentioned or referred + thereto (if any) for identification purposes only. + + NATIONS reserves the right to make changes, corrections, enhancements, modifications, and + improvements to this software at any time without notice. Please contact NATIONS and obtain + the latest version of this software before placing orders. + + Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes + no responsibility for the accuracy and reliability of this software. + + It is the responsibility of the user of this software to properly design, program, and test + the functionality and safety of any application made of this information and any resulting product. + In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or + consequential damages arising in any way out of the use of this software or the Product. + + NATIONS Products are neither intended nor warranted for usage in systems or equipment, any + malfunction or failure of which may cause loss of human life, bodily injury or severe property + damage. Such applications are deemed, "Insecure Usage". + + All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS + harmless from and against all claims, costs, damages, and other liabilities, arising from or related + to any customer's Insecure Usage. + + Any express or implied warranty with regard to this software or the Product, including,but not + limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement + are disclaimed to the fullest extent permitted by law. + + Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe + or otherwise distribute this software for any purposes, in whole or in part. + + NATIONS products and technologies shall not be used for or incorporated into any products or systems + whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. + User shall comply with any applicable export control laws and regulations promulgated and administered by + the governments of any countries asserting jurisdiction over the parties or transactions. + ************************************************************************************************************/ + + + .syntax unified + .cpu cortex-m7 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/*some param defined in linker script*/ +.word _siram_code +.word _s_ram_code +.word _e_ram_code +.word _fp_flash_rodata +.word _fp_s_rodata +.word _fp_e_rodata +.word __exidx_start +.word __exidx_end +.word _fp_exidx +.word __preinit_array_start +.word __preinit_array_end +.word _sipreinit_array +.word __init_array_start +.word __init_array_end +.word _siinit_array +.word __fini_array_start +.word __fini_array_end +.word _sifini_array + +/* 宏定义:统一复制过程 */ +.macro COPY_SECTION section_start, section_end, load_address + ldr r0, =\section_start /* RAM目标地址 */ + ldr r2, =\load_address /* Flash源地址 */ + ldr r1, =\section_end /* RAM结束地址 */ + subs r3, r1, r0 /* 计算长度 */ + ble 1f /* 如果长度为0则跳过 */ +/* 复制循环(每次4字节) */ +0: ldr r4, [r2], #4 + str r4, [r0], #4 + subs r3, r3, #4 + bgt 0b +1: +.endm + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr r0, =_estack + mov sp, r0 /* set stack pointer */ + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + ldr r4, =_ebss + movs r3, #0 + b LoopFillZerobss + +FillZerobss: + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + cmp r2, r4 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit + + /* 复制所有需要初始化的段 */ + COPY_SECTION _s_ram_code, _e_ram_code, _siram_code /* 代码段 */ + COPY_SECTION _fp_s_rodata, _fp_e_rodata, _fp_flash_rodata /* 只读数据 */ + COPY_SECTION _sdata, _edata, _sidata /* 数据段 */ +/* COPY_SECTION __exidx_start, __exidx_end, _fp_exidx ARM异常索引 */ +/* COPY_SECTION __preinit_array_start, __preinit_array_end, _sipreinit_array + COPY_SECTION __init_array_start, __init_array_end, _siinit_array + COPY_SECTION __fini_array_start, __fini_array_end, _sifini_array + COPY_SECTION _sisr_vector_ram, _eisr_vector_ram, _sivector 中断向量表 */ +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + +LoopForever: + b LoopForever + + +.size Reset_Handler, .-Reset_Handler + +/** +\*fun This is the code that gets called when the processor receives an +\* unexpected interrupt. This simply enters an infinite loop, preserving +\* the system state for examination by a debugger. +**/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/** +\* The minimal vector table for a Cortex M0. Note that the proper constructs +\* must be placed on this to ensure that it ends up at physical address 0x00000000. +**/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word N32SysTick_Handler + /* External Interrupts */ + .word WWDG1_IRQHandler /* Window1 Watchdog interrupt */ + .word PVD_IRQHandler /* PVD through EXTI Line16 detection interrupt */ + .word RTC_TAMPER_IRQHandler /* RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup timer through EXTI line 19 interrupt */ + .word RCC_IRQHandler /* RCC interrupt */ + .word EXTI0_IRQHandler /* EXTI Line 0 interrupt */ + .word EXTI1_IRQHandler /* EXTI Line 1 interrupt */ + .word EXTI2_IRQHandler /* EXTI Line 2 interrupt */ + .word EXTI3_IRQHandler /* EXTI Line 3 interrupt */ + .word EXTI4_IRQHandler /* EXTI Line 4 interrupt */ + .word EXTI9_5_IRQHandler /* EXTI Line[9:5] interrupt */ + .word EXTI15_10_IRQHandler /* EXTI Line[15:10] interrupt */ + .word DMA1_Channel0_IRQHandler /* DMA1 Channel 0 */ + .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 DMA2_Channel0_IRQHandler /* DMA2 Channel 0 */ + .word DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */ + .word DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */ + .word DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */ + .word DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */ + .word DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */ + .word DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */ + .word DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */ + .word DMA3_Channel0_IRQHandler /* DMA3 Channel 0 */ + .word DMA3_Channel1_IRQHandler /* DMA3 Channel 1 */ + .word DMA3_Channel2_IRQHandler /* DMA3 Channel 2 */ + .word DMA3_Channel3_IRQHandler /* DMA3 Channel 3 */ + .word DMA3_Channel4_IRQHandler /* DMA3 Channel 4 */ + .word DMA3_Channel5_IRQHandler /* DMA3 Channel 5 */ + .word DMA3_Channel6_IRQHandler /* DMA3 Channel 6 */ + .word DMA3_Channel7_IRQHandler /* DMA3 Channel 7 */ + .word MDMA_Channel0_IRQHandler /* MDMA Channel 0 */ + .word MDMA_Channel1_IRQHandler /* MDMA Channel 1 */ + .word MDMA_Channel2_IRQHandler /* MDMA Channel 2 */ + .word MDMA_Channel3_IRQHandler /* MDMA Channel 3 */ + .word MDMA_Channel4_IRQHandler /* MDMA Channel 4 */ + .word MDMA_Channel5_IRQHandler /* MDMA Channel 5 */ + .word MDMA_Channel6_IRQHandler /* MDMA Channel 6 */ + .word MDMA_Channel7_IRQHandler /* MDMA Channel 7 */ + .word MDMA_Channel8_IRQHandler /* MDMA Channel 8 */ + .word MDMA_Channel9_IRQHandler /* MDMA Channel 9 */ + .word MDMA_Channel10_IRQHandler /* MDMA Channel 10 */ + .word MDMA_Channel11_IRQHandler /* MDMA Channel 11 */ + .word MDMA_Channel12_IRQHandler /* MDMA Channel 12 */ + .word MDMA_Channel13_IRQHandler /* MDMA Channel 13 */ + .word MDMA_Channel14_IRQHandler /* MDMA Channel 14 */ + .word MDMA_Channel15_IRQHandler /* MDMA Channel 15 */ + .word SDPU_IRQHandler /* SDPU global interrupt */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word FPU_CPU1_IRQHandler /* FPU_CM7 global interrupt */ + .word ECCMON_IRQHandler /* ECCMON global interrupt */ + .word RTC_ALARM_IRQHandler /* RTC Alarm via EXTI17 interrupt */ + .word I2C1_EV_IRQHandler /* I2C1 event interrupt */ + .word I2C1_ER_IRQHandler /* I2C1 error interrupt */ + .word I2C2_EV_IRQHandler /* I2C2 event interrupt */ + .word I2C2_ER_IRQHandler /* I2C2 error interrupt */ + .word I2C3_EV_IRQHandler /* I2C3 event interrupt */ + .word I2C3_ER_IRQHandler /* I2C3 error interrupt */ + .word I2C4_EV_IRQHandler /* I2C4 event interrupt */ + .word I2C4_ER_IRQHandler /* I2C4 error interrupt */ + .word I2C5_EV_IRQHandler /* I2C5 event interrupt */ + .word I2C5_ER_IRQHandler /* I2C5 error interrupt */ + .word I2C6_EV_IRQHandler /* I2C6 event interrupt */ + .word I2C6_ER_IRQHandler /* I2C6 error interrupt */ + .word I2C7_EV_IRQHandler /* I2C7 event interrupt */ + .word I2C7_ER_IRQHandler /* I2C7 error interrupt */ + .word I2C8_EV_IRQHandler /* I2C8 event interrupt */ + .word I2C8_ER_IRQHandler /* I2C8 error interrupt */ + .word I2C9_EV_IRQHandler /* I2C9 event interrupt */ + .word I2C9_ER_IRQHandler /* I2C9 error interrupt */ + .word I2C10_EV_IRQHandler /* I2C10 event interrupt */ + .word I2C10_ER_IRQHandler /* I2C10 error interrupt */ + .word I2S1_IRQHandler /* I2S1 global interrupt */ + .word I2S2_IRQHandler /* I2S1 global interrupt */ + .word I2S3_IRQHandler /* I2S1 global interrupt */ + .word I2S4_IRQHandler /* I2S1 global interrupt */ + .word xSPI1_IRQHandler /* xSPI1 global interrupt */ + .word xSPI2_IRQHandler /* xSPI1 global interrupt */ + .word SPI1_IRQHandler /* SPI1 global interrupt */ + .word SPI2_IRQHandler /* SPI2 global interrupt */ + .word SPI3_IRQHandler /* SPI3 global interrupt */ + .word SPI4_IRQHandler /* SPI4 global interrupt */ + .word SPI5_IRQHandler /* SPI5 global interrupt */ + .word SPI6_IRQHandler /* SPI6 global interrupt */ + .word SPI7_IRQHandler /* SPI7 global interrupt */ + .word LCD_EV_IRQHandler /* TFT LCD Controller event interrupt */ + .word LCD_ER_IRQHandler /* TFT LCD Controller error interrupt */ + .word DVP1_IRQHandler /* DVP1 global interrupt */ + .word DVP2_IRQHandler /* DVP2 global interrupt */ + .word DMAMUX2_IRQHandler /* DMAMUX2 (MDMA MUX) global interrupt */ + .word USB1_HS_EPx_OUT_IRQHandler /* USB1_HS endpoint out global interrupt */ + .word USB1_HS_EPx_IN_IRQHandler /* USB1_HS endpoint in global interrupt */ + .word USB1_HS_WKUP_IRQHandler /* USB1_HS WKUP interrupt through EXTI line 62 */ + .word USB1_HS_IRQHandler /* USB1_HS global interrupt */ + .word USB2_HS_EPx_OUT_IRQHandler /* USB2_HS endpoint out global interrupt */ + .word USB2_HS_EPx_IN_IRQHandler /* USB2_HS endpoint in global interrupt */ + .word USB2_HS_WKUP_IRQHandler /* USB2_HS WKUP interrupt through EXTI line 63 */ + .word USB2_HS_IRQHandler /* USB2_HS global interrupt */ + .word ETH1_IRQHandler /* Ethernet 1 global interrupt */ + .word ETH1_PMT_LPI_IRQHandler /* Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 */ + .word ETH2_IRQHandler /* Ethernet 2 global interrupt */ + .word ETH2_PMT_LPI_IRQHandler /* Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 */ + .word FDCAN1_INT0_IRQHandler /* FDCAN1 global interrupt line 0 */ + .word FDCAN2_INT0_IRQHandler /* FDCAN2 global interrupt line 0 */ + .word FDCAN3_INT0_IRQHandler /* FDCAN3 global interrupt line 0 */ + .word FDCAN4_INT0_IRQHandler /* FDCAN4 global interrupt line 0 */ + .word FDCAN1_INT1_IRQHandler /* FDCAN1 global interrupt line 1 */ + .word FDCAN2_INT1_IRQHandler /* FDCAN2 global interrupt line 1 */ + .word FDCAN3_INT1_IRQHandler /* FDCAN3 global interrupt line 1 */ + .word FDCAN4_INT1_IRQHandler /* FDCAN4 global interrupt line 1 */ + .word USART1_IRQHandler /* USART1 global interrupt */ + .word USART2_IRQHandler /* USART2 global interrupt */ + .word USART3_IRQHandler /* USART3 global interrupt */ + .word USART4_IRQHandler /* USART4 global interrupt */ + .word USART5_IRQHandler /* USART5 global interrupt */ + .word USART6_IRQHandler /* USART6 global interrupt */ + .word USART7_IRQHandler /* USART7 global interrupt */ + .word USART8_IRQHandler /* USART8 global interrupt */ + .word UART9_IRQHandler /* UART9 global interrupt */ + .word UART10_IRQHandler /* UART10 global interrupt */ + .word UART11_IRQHandler /* UART11 global interrupt */ + .word UART12_IRQHandler /* UART12 global interrupt */ + .word UART13_IRQHandler /* UART13 global interrupt */ + .word UART14_IRQHandler /* UART14 global interrupt */ + .word UART15_IRQHandler /* UART15 global interrupt */ + .word LPUART1_IRQHandler /* LPUART1 global interrupt + wakeup through EXTI line 49 */ + .word LPUART2_IRQHandler /* LPUART2 global interrupt + wakeup through EXTI line 52 */ + .word GPU_IRQHandler /* GPU global interrupt */ + .word 0 /* Reserved */ + .word SDMMC1_IRQHandler /* SDMMC1_IRQ + WKUP through EXTI line 24 */ + .word SDMMC2_IRQHandler /* SDMMC2_IRQ + WKUP through EXTI line 25 */ + .word ADC1_IRQHandler /* ADC1 global interrupt */ + .word ADC2_IRQHandler /* ADC2 global interrupt */ + .word ADC3_IRQHandler /* ADC3 global interrupt */ + .word COMP1_2_IRQHandler /* COMP1 and COMP2 through EXTI line 20 and 21 */ + .word COMP3_4_IRQHandler /* COMP3 and COMP4 through EXTI line 22 and 23 */ + .word SHRTIM1_INT1_IRQHandler /* High Resolution timer 1 interrupt 1 */ + .word SHRTIM1_INT2_IRQHandler /* High Resolution timer 1 interrupt 2 */ + .word SHRTIM1_INT3_IRQHandler /* High Resolution timer 1 interrupt 3 */ + .word SHRTIM1_INT4_IRQHandler /* High Resolution timer 1 interrupt 4 */ + .word SHRTIM1_INT5_IRQHandler /* High Resolution timer 1 interrupt 5 */ + .word SHRTIM1_INT6_IRQHandler /* High Resolution timer 1 interrupt 6 */ + .word SHRTIM1_INT7_IRQHandler /* High Resolution timer 1 interrupt 7 */ + .word SHRTIM1_INT8_IRQHandler /* High Resolution timer 1 interrupt 8 */ + .word SHRTIM2_INT1_IRQHandler /* High Resolution timer 2 interrupt 1 */ + .word SHRTIM2_INT2_IRQHandler /* High Resolution timer 2 interrupt 2 */ + .word SHRTIM2_INT3_IRQHandler /* High Resolution timer 2 interrupt 3 */ + .word SHRTIM2_INT4_IRQHandler /* High Resolution timer 2 interrupt 4 */ + .word SHRTIM2_INT5_IRQHandler /* High Resolution timer 2 interrupt 5 */ + .word SHRTIM2_INT6_IRQHandler /* High Resolution timer 2 interrupt 6 */ + .word SHRTIM2_INT7_IRQHandler /* High Resolution timer 2 interrupt 7 */ + .word SHRTIM2_INT8_IRQHandler /* High Resolution timer 2 interrupt 8 */ + .word FDCAN5_INT0_IRQHandler /* FDCAN5 global interrupt line 0 */ + .word FDCAN6_INT0_IRQHandler /* FDCAN6 global interrupt line 0 */ + .word FDCAN7_INT0_IRQHandler /* FDCAN7 global interrupt line 0 */ + .word FDCAN8_INT0_IRQHandler /* FDCAN8 global interrupt line 0 */ + .word FDCAN5_INT1_IRQHandler /* FDCAN5 global interrupt line 1 */ + .word FDCAN6_INT1_IRQHandler /* FDCAN6 global interrupt line 1 */ + .word FDCAN7_INT1_IRQHandler /* FDCAN7 global interrupt line 1 */ + .word FDCAN8_INT1_IRQHandler /* FDCAN8 global interrupt line 1 */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word LPTIM5_WKUP_IRQHandler /* LPTIM5 wakeup through EXTI 86 */ + .word JPEG_SGDMA_H2P_IRQHandler /* JPEG SGDMA Host to Peripheral Interrupt */ + .word JPEG_SGDMA_P2H_IRQHandler /* JPEG SGDMA Peripheral to Host Interrupt */ + .word WAKEUP_IO_IRQHandler /* 6 WAKEUP IOs through EXTI line 70-75 */ + .word SEMA4_INT1_IRQHandler /* SEMA4 interrupt1 */ + .word 0 /* Reserved */ + .word WWDG2_RST_IRQHandler /* WWDG2 reset interrupt through EXTI line 82 */ + .word OTPC_IRQHandler /* OTPC interrupt */ + .word FEMC_IRQHandler /* FEMC interrupt */ + .word DCMUB_IRQHandler /* DCMUB interrupt */ + .word DAC1_IRQHandler /* DAC1 interrupt */ + .word DAC2_IRQHandler /* DAC2 interrupt */ + .word MDMA_AHBS_ER_IRQHandler /* MDMA HABS ERROR through EXTI line55-56 */ + .word CM7_CATCH_READ_ER_IRQHandler /* CM7 Error on Cache Read through EXTI line 64-65 */ + .word DAC3_IRQHandler /* DAC3 interrupt */ + .word DAC4_IRQHandler /* DAC4 interrupt */ + .word EMC_IRQHandler /* EMC event interrupt through EXTI line 88-89 */ + .word DAC5_IRQHandler /* DAC5 interrupt */ + .word DAC6_IRQHandler /* DAC6 interrupt */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word ATIM1_BRK_IRQHandler /* Advanced timer 1 break interrupt */ + .word ATIM1_TRG_COM_IRQHandler /* Advanced timer 1 trigger and commutation interrupts */ + .word ATIM1_CC_IRQHandler /* Advanced timer 1 capture/compare interrupt */ + .word ATIM1_UP_IRQHandler /* Advanced timer 1 update interrupt */ + .word ATIM2_BRK_IRQHandler /* Advanced timer 2 break interrupt */ + .word ATIM2_TRG_COM_IRQHandler /* advanced timer 2 trigger and commutation interrupts */ + .word ATIM2_CC_IRQHandler /* Advanced timer 2 capture/compare interrupt */ + .word ATIM2_UP_IRQHandler /* Advanced timer 2 update interrupt */ + .word ATIM3_BRK_IRQHandler /* Advanced timer 3 break interrupt */ + .word ATIM3_TRG_COM_IRQHandler /* Advanced timer 3 trigger and commutation interrupts */ + .word ATIM3_CC_IRQHandler /* Advanced timer 3 capture/compare interrupt */ + .word ATIM3_UP_IRQHandler /* Advanced timer 3 update interrupt */ + .word ATIM4_BRK_IRQHandler /* Advanced timer 4 break interrupt */ + .word ATIM4_TRG_COM_IRQHandler /* Advanced timer 4 trigger and commutation interrupts */ + .word ATIM4_CC_IRQHandler /* Advanced timer 4 capture/compare interrupt */ + .word ATIM4_UP_IRQHandler /* Advanced timer 4 update interrupt */ + .word GTIMA1_IRQHandler /* General timer A1 global interrupt */ + .word GTIMA2_IRQHandler /* General timer A2 global interrupt */ + .word GTIMA3_IRQHandler /* General timer A3 global interrupt */ + .word GTIMA4_IRQHandler /* General timer A4 global interrupt */ + .word GTIMA5_IRQHandler /* General timer A5 global interrupt */ + .word GTIMA6_IRQHandler /* General timer A6 global interrupt */ + .word GTIMA7_IRQHandler /* General timer A7 global interrupt */ + .word GTIMB1_IRQHandler /* General timer B1 global interrupt */ + .word GTIMB2_IRQHandler /* General timer B2 global interrupt */ + .word GTIMB3_IRQHandler /* General timer B3 global interrupt */ + .word BTIM1_IRQHandler /* Base timer 1 global interrupt */ + .word BTIM2_IRQHandler /* Base timer 2 global interrupt */ + .word BTIM3_IRQHandler /* Base timer 3 global interrupt */ + .word BTIM4_IRQHandler /* Base timer 4 global interrupt */ + .word LPTIM1_WKUP_IRQHandler /* LPTIM1 wakeup interrupt */ + .word LPTIM2_WKUP_IRQHandler /* LPTIM2 wakeup interrupt */ + .word LPTIM3_WKUP_IRQHandler /* LPTIM3 wakeup interrupt */ + .word LPTIM4_WKUP_IRQHandler /* LPTIM4 wakeup interrupt */ + .word DSMU_FLT0_IRQHandler /* DSMU Filter interrupt 0 */ + .word DSMU_FLT1_IRQHandler /* DSMU Filter interrupt 1 */ + .word DSMU_FLT2_IRQHandler /* DSMU Filter interrupt 2 */ + .word DSMU_FLT3_IRQHandler /* DSMU Filter interrupt 3 */ + .word FMAC_IRQHandler /* FMAC global interrupt */ + .word CORDIC_IRQHandler /* Cordic global interrupt */ + .word DMAMUX1_IRQHandler /* DMAMUX1 interrupt */ + .word MMU_IRQHandler /* MMU interrupt */ + .word SysTick_Handler + /* need check to user manual of exti chapter */ + +/** +\* Provide weak aliases for each Exception handler to the Default_Handler. +\* As they are weak aliases, any function with the same name will override +\* this definition. +**/ + + .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 N32SysTick_Handler + .thumb_set N32SysTick_Handler,Default_Handler + + .weak WWDG1_IRQHandler + .thumb_set WWDG1_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak RTC_TAMPER_IRQHandler + .thumb_set RTC_TAMPER_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak DMA1_Channel0_IRQHandler + .thumb_set DMA1_Channel0_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 DMA2_Channel0_IRQHandler + .thumb_set DMA2_Channel0_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_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak DMA2_Channel6_IRQHandler + .thumb_set DMA2_Channel6_IRQHandler,Default_Handler + + .weak DMA2_Channel7_IRQHandler + .thumb_set DMA2_Channel7_IRQHandler,Default_Handler + + .weak DMA3_Channel0_IRQHandler + .thumb_set DMA3_Channel0_IRQHandler,Default_Handler + + .weak DMA3_Channel1_IRQHandler + .thumb_set DMA3_Channel1_IRQHandler,Default_Handler + + .weak DMA3_Channel2_IRQHandler + .thumb_set DMA3_Channel2_IRQHandler,Default_Handler + + .weak DMA3_Channel3_IRQHandler + .thumb_set DMA3_Channel3_IRQHandler,Default_Handler + + .weak DMA3_Channel4_IRQHandler + .thumb_set DMA3_Channel4_IRQHandler,Default_Handler + + .weak DMA3_Channel5_IRQHandler + .thumb_set DMA3_Channel5_IRQHandler,Default_Handler + + .weak DMA3_Channel6_IRQHandler + .thumb_set DMA3_Channel6_IRQHandler,Default_Handler + + .weak DMA3_Channel7_IRQHandler + .thumb_set DMA3_Channel7_IRQHandler,Default_Handler + + .weak MDMA_Channel0_IRQHandler + .thumb_set MDMA_Channel0_IRQHandler,Default_Handler + + .weak MDMA_Channel1_IRQHandler + .thumb_set MDMA_Channel1_IRQHandler,Default_Handler + + .weak MDMA_Channel2_IRQHandler + .thumb_set MDMA_Channel2_IRQHandler,Default_Handler + + .weak MDMA_Channel3_IRQHandler + .thumb_set MDMA_Channel3_IRQHandler,Default_Handler + + .weak MDMA_Channel4_IRQHandler + .thumb_set MDMA_Channel4_IRQHandler,Default_Handler + + .weak MDMA_Channel5_IRQHandler + .thumb_set MDMA_Channel5_IRQHandler,Default_Handler + + .weak MDMA_Channel6_IRQHandler + .thumb_set MDMA_Channel6_IRQHandler,Default_Handler + + .weak MDMA_Channel7_IRQHandler + .thumb_set MDMA_Channel7_IRQHandler,Default_Handler + + .weak MDMA_Channel8_IRQHandler + .thumb_set MDMA_Channel8_IRQHandler,Default_Handler + + .weak MDMA_Channel9_IRQHandler + .thumb_set MDMA_Channel9_IRQHandler,Default_Handler + + .weak MDMA_Channel10_IRQHandler + .thumb_set MDMA_Channel10_IRQHandler,Default_Handler + + .weak MDMA_Channel11_IRQHandler + .thumb_set MDMA_Channel11_IRQHandler,Default_Handler + + .weak MDMA_Channel12_IRQHandler + .thumb_set MDMA_Channel12_IRQHandler,Default_Handler + + .weak MDMA_Channel13_IRQHandler + .thumb_set MDMA_Channel13_IRQHandler,Default_Handler + + .weak MDMA_Channel14_IRQHandler + .thumb_set MDMA_Channel14_IRQHandler,Default_Handler + + .weak MDMA_Channel15_IRQHandler + .thumb_set MDMA_Channel15_IRQHandler,Default_Handler + + .weak SDPU_IRQHandler + .thumb_set SDPU_IRQHandler,Default_Handler + + .weak FPU_CPU1_IRQHandler + .thumb_set FPU_CPU1_IRQHandler,Default_Handler + + .weak ECCMON_IRQHandler + .thumb_set ECCMON_IRQHandler,Default_Handler + + .weak RTC_ALARM_IRQHandler + .thumb_set RTC_ALARM_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 I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak I2C4_EV_IRQHandler + .thumb_set I2C4_EV_IRQHandler,Default_Handler + + .weak I2C4_ER_IRQHandler + .thumb_set I2C4_ER_IRQHandler,Default_Handler + + .weak I2C5_EV_IRQHandler + .thumb_set I2C5_EV_IRQHandler,Default_Handler + + .weak I2C5_ER_IRQHandler + .thumb_set I2C5_ER_IRQHandler,Default_Handler + + .weak I2C6_EV_IRQHandler + .thumb_set I2C6_EV_IRQHandler,Default_Handler + + .weak I2C6_ER_IRQHandler + .thumb_set I2C6_ER_IRQHandler,Default_Handler + + .weak I2C7_EV_IRQHandler + .thumb_set I2C7_EV_IRQHandler,Default_Handler + + .weak I2C7_ER_IRQHandler + .thumb_set I2C7_ER_IRQHandler,Default_Handler + + .weak I2C8_EV_IRQHandler + .thumb_set I2C8_EV_IRQHandler,Default_Handler + + .weak I2C8_ER_IRQHandler + .thumb_set I2C8_ER_IRQHandler,Default_Handler + + .weak I2C9_EV_IRQHandler + .thumb_set I2C9_EV_IRQHandler,Default_Handler + + .weak I2C9_ER_IRQHandler + .thumb_set I2C9_ER_IRQHandler,Default_Handler + + .weak I2C10_EV_IRQHandler + .thumb_set I2C10_EV_IRQHandler,Default_Handler + + .weak I2C10_ER_IRQHandler + .thumb_set I2C10_ER_IRQHandler,Default_Handler + + .weak I2S1_IRQHandler + .thumb_set I2S1_IRQHandler,Default_Handler + + .weak I2S2_IRQHandler + .thumb_set I2S2_IRQHandler,Default_Handler + + .weak I2S3_IRQHandler + .thumb_set I2S3_IRQHandler,Default_Handler + + .weak I2S4_IRQHandler + .thumb_set I2S4_IRQHandler,Default_Handler + + .weak xSPI1_IRQHandler + .thumb_set xSPI1_IRQHandler,Default_Handler + + .weak xSPI2_IRQHandler + .thumb_set xSPI2_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak SPI4_IRQHandler + .thumb_set SPI4_IRQHandler,Default_Handler + + .weak SPI5_IRQHandler + .thumb_set SPI5_IRQHandler,Default_Handler + + .weak SPI6_IRQHandler + .thumb_set SPI6_IRQHandler,Default_Handler + + .weak SPI7_IRQHandler + .thumb_set SPI7_IRQHandler,Default_Handler + + .weak LCD_EV_IRQHandler + .thumb_set LCD_EV_IRQHandler,Default_Handler + + .weak LCD_ER_IRQHandler + .thumb_set LCD_ER_IRQHandler,Default_Handler + + .weak DVP1_IRQHandler + .thumb_set DVP1_IRQHandler,Default_Handler + + .weak DVP2_IRQHandler + .thumb_set DVP2_IRQHandler,Default_Handler + + .weak DMAMUX2_IRQHandler + .thumb_set DMAMUX2_IRQHandler,Default_Handler + + .weak USB1_HS_EPx_OUT_IRQHandler + .thumb_set USB1_HS_EPx_OUT_IRQHandler,Default_Handler + + .weak USB1_HS_EPx_IN_IRQHandler + .thumb_set USB1_HS_EPx_IN_IRQHandler,Default_Handler + + .weak USB1_HS_WKUP_IRQHandler + .thumb_set USB1_HS_WKUP_IRQHandler,Default_Handler + + .weak USB1_HS_IRQHandler + .thumb_set USB1_HS_IRQHandler,Default_Handler + + .weak USB2_HS_EPx_OUT_IRQHandler + .thumb_set USB2_HS_EPx_OUT_IRQHandler,Default_Handler + + .weak USB2_HS_EPx_IN_IRQHandler + .thumb_set USB2_HS_EPx_IN_IRQHandler,Default_Handler + + .weak USB2_HS_WKUP_IRQHandler + .thumb_set USB2_HS_WKUP_IRQHandler,Default_Handler + + .weak USB2_HS_IRQHandler + .thumb_set USB2_HS_IRQHandler,Default_Handler + + .weak ETH1_IRQHandler + .thumb_set ETH1_IRQHandler,Default_Handler + + .weak ETH1_PMT_LPI_IRQHandler + .thumb_set ETH1_PMT_LPI_IRQHandler,Default_Handler + + .weak ETH2_IRQHandler + .thumb_set ETH2_IRQHandler,Default_Handler + + .weak ETH2_PMT_LPI_IRQHandler + .thumb_set ETH2_PMT_LPI_IRQHandler,Default_Handler + + .weak FDCAN1_INT0_IRQHandler + .thumb_set FDCAN1_INT0_IRQHandler,Default_Handler + + .weak FDCAN2_INT0_IRQHandler + .thumb_set FDCAN2_INT0_IRQHandler,Default_Handler + + .weak FDCAN3_INT0_IRQHandler + .thumb_set FDCAN3_INT0_IRQHandler,Default_Handler + + .weak FDCAN4_INT0_IRQHandler + .thumb_set FDCAN4_INT0_IRQHandler,Default_Handler + + .weak FDCAN1_INT1_IRQHandler + .thumb_set FDCAN1_INT1_IRQHandler,Default_Handler + + .weak FDCAN2_INT1_IRQHandler + .thumb_set FDCAN2_INT1_IRQHandler,Default_Handler + + .weak FDCAN3_INT1_IRQHandler + .thumb_set FDCAN3_INT1_IRQHandler,Default_Handler + + .weak FDCAN4_INT1_IRQHandler + .thumb_set FDCAN4_INT1_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 USART4_IRQHandler + .thumb_set USART4_IRQHandler,Default_Handler + + .weak USART5_IRQHandler + .thumb_set USART5_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak USART7_IRQHandler + .thumb_set USART7_IRQHandler,Default_Handler + + .weak USART8_IRQHandler + .thumb_set USART8_IRQHandler,Default_Handler + + .weak UART9_IRQHandler + .thumb_set UART9_IRQHandler,Default_Handler + + .weak UART10_IRQHandler + .thumb_set UART10_IRQHandler,Default_Handler + + .weak UART11_IRQHandler + .thumb_set UART11_IRQHandler,Default_Handler + + .weak UART12_IRQHandler + .thumb_set UART12_IRQHandler,Default_Handler + + .weak UART13_IRQHandler + .thumb_set UART13_IRQHandler,Default_Handler + + .weak UART14_IRQHandler + .thumb_set UART14_IRQHandler,Default_Handler + + .weak UART15_IRQHandler + .thumb_set UART15_IRQHandler,Default_Handler + + .weak LPUART1_IRQHandler + .thumb_set LPUART1_IRQHandler,Default_Handler + + .weak LPUART2_IRQHandler + .thumb_set LPUART2_IRQHandler,Default_Handler + + .weak GPU_IRQHandler + .thumb_set GPU_IRQHandler,Default_Handler + + .weak SDMMC1_IRQHandler + .thumb_set SDMMC1_IRQHandler,Default_Handler + + .weak SDMMC2_IRQHandler + .thumb_set SDMMC2_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak ADC2_IRQHandler + .thumb_set ADC2_IRQHandler,Default_Handler + + .weak ADC3_IRQHandler + .thumb_set ADC3_IRQHandler,Default_Handler + + .weak COMP1_2_IRQHandler + .thumb_set COMP1_2_IRQHandler,Default_Handler + + .weak COMP3_4_IRQHandler + .thumb_set COMP3_4_IRQHandler,Default_Handler + + .weak SHRTIM1_INT1_IRQHandler + .thumb_set SHRTIM1_INT1_IRQHandler,Default_Handler + + .weak SHRTIM1_INT2_IRQHandler + .thumb_set SHRTIM1_INT2_IRQHandler,Default_Handler + + .weak SHRTIM1_INT3_IRQHandler + .thumb_set SHRTIM1_INT3_IRQHandler,Default_Handler + + .weak SHRTIM1_INT4_IRQHandler + .thumb_set SHRTIM1_INT4_IRQHandler,Default_Handler + + .weak SHRTIM1_INT5_IRQHandler + .thumb_set SHRTIM1_INT5_IRQHandler,Default_Handler + + .weak SHRTIM1_INT6_IRQHandler + .thumb_set SHRTIM1_INT6_IRQHandler,Default_Handler + + .weak SHRTIM1_INT7_IRQHandler + .thumb_set SHRTIM1_INT7_IRQHandler,Default_Handler + + .weak SHRTIM1_INT8_IRQHandler + .thumb_set SHRTIM1_INT8_IRQHandler,Default_Handler + + .weak SHRTIM2_INT1_IRQHandler + .thumb_set SHRTIM2_INT1_IRQHandler,Default_Handler + + .weak SHRTIM2_INT2_IRQHandler + .thumb_set SHRTIM2_INT2_IRQHandler,Default_Handler + + .weak SHRTIM2_INT3_IRQHandler + .thumb_set SHRTIM2_INT3_IRQHandler,Default_Handler + + .weak SHRTIM2_INT4_IRQHandler + .thumb_set SHRTIM2_INT4_IRQHandler,Default_Handler + + .weak SHRTIM2_INT5_IRQHandler + .thumb_set SHRTIM2_INT5_IRQHandler,Default_Handler + + .weak SHRTIM2_INT6_IRQHandler + .thumb_set SHRTIM2_INT6_IRQHandler,Default_Handler + + .weak SHRTIM2_INT7_IRQHandler + .thumb_set SHRTIM2_INT7_IRQHandler,Default_Handler + + .weak SHRTIM2_INT8_IRQHandler + .thumb_set SHRTIM2_INT8_IRQHandler,Default_Handler + + .weak FDCAN5_INT0_IRQHandler + .thumb_set FDCAN5_INT0_IRQHandler,Default_Handler + + .weak FDCAN6_INT0_IRQHandler + .thumb_set FDCAN6_INT0_IRQHandler,Default_Handler + + .weak FDCAN7_INT0_IRQHandler + .thumb_set FDCAN7_INT0_IRQHandler,Default_Handler + + .weak FDCAN8_INT0_IRQHandler + .thumb_set FDCAN8_INT0_IRQHandler,Default_Handler + + .weak FDCAN5_INT1_IRQHandler + .thumb_set FDCAN5_INT1_IRQHandler,Default_Handler + + .weak FDCAN6_INT1_IRQHandler + .thumb_set FDCAN6_INT1_IRQHandler,Default_Handler + + .weak FDCAN7_INT1_IRQHandler + .thumb_set FDCAN7_INT1_IRQHandler,Default_Handler + + .weak FDCAN8_INT1_IRQHandler + .thumb_set FDCAN8_INT1_IRQHandler,Default_Handler + + .weak LPTIM5_WKUP_IRQHandler + .thumb_set LPTIM5_WKUP_IRQHandler,Default_Handler + + .weak JPEG_SGDMA_H2P_IRQHandler + .thumb_set JPEG_SGDMA_H2P_IRQHandler,Default_Handler + + .weak JPEG_SGDMA_P2H_IRQHandler + .thumb_set JPEG_SGDMA_P2H_IRQHandler,Default_Handler + + .weak WAKEUP_IO_IRQHandler + .thumb_set WAKEUP_IO_IRQHandler,Default_Handler + + .weak SEMA4_INT1_IRQHandler + .thumb_set SEMA4_INT1_IRQHandler,Default_Handler + + .weak WWDG2_RST_IRQHandler + .thumb_set WWDG2_RST_IRQHandler,Default_Handler + + .weak OTPC_IRQHandler + .thumb_set OTPC_IRQHandler,Default_Handler + + .weak FEMC_IRQHandler + .thumb_set FEMC_IRQHandler,Default_Handler + + .weak DCMUB_IRQHandler + .thumb_set DCMUB_IRQHandler,Default_Handler + + .weak DAC1_IRQHandler + .thumb_set DAC1_IRQHandler,Default_Handler + + .weak DAC2_IRQHandler + .thumb_set DAC2_IRQHandler,Default_Handler + + .weak MDMA_AHBS_ER_IRQHandler + .thumb_set MDMA_AHBS_ER_IRQHandler,Default_Handler + + .weak CM7_CATCH_READ_ER_IRQHandler + .thumb_set CM7_CATCH_READ_ER_IRQHandler,Default_Handler + + .weak DAC3_IRQHandler + .thumb_set DAC3_IRQHandler,Default_Handler + + .weak DAC4_IRQHandler + .thumb_set DAC4_IRQHandler,Default_Handler + + .weak EMC_IRQHandler + .thumb_set EMC_IRQHandler,Default_Handler + + .weak DAC5_IRQHandler + .thumb_set DAC5_IRQHandler,Default_Handler + + .weak DAC6_IRQHandler + .thumb_set DAC6_IRQHandler,Default_Handler + + .weak ATIM1_BRK_IRQHandler + .thumb_set ATIM1_BRK_IRQHandler,Default_Handler + + .weak ATIM1_TRG_COM_IRQHandler + .thumb_set ATIM1_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM1_CC_IRQHandler + .thumb_set ATIM1_CC_IRQHandler,Default_Handler + + .weak ATIM1_UP_IRQHandler + .thumb_set ATIM1_UP_IRQHandler,Default_Handler + + .weak ATIM2_BRK_IRQHandler + .thumb_set ATIM2_BRK_IRQHandler,Default_Handler + + .weak ATIM2_TRG_COM_IRQHandler + .thumb_set ATIM2_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM2_CC_IRQHandler + .thumb_set ATIM2_CC_IRQHandler,Default_Handler + + .weak ATIM2_UP_IRQHandler + .thumb_set ATIM2_UP_IRQHandler,Default_Handler + + .weak ATIM3_BRK_IRQHandler + .thumb_set ATIM3_BRK_IRQHandler,Default_Handler + + .weak ATIM3_TRG_COM_IRQHandler + .thumb_set ATIM3_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM3_CC_IRQHandler + .thumb_set ATIM3_CC_IRQHandler,Default_Handler + + .weak ATIM3_UP_IRQHandler + .thumb_set ATIM3_UP_IRQHandler,Default_Handler + + .weak ATIM4_BRK_IRQHandler + .thumb_set ATIM4_BRK_IRQHandler,Default_Handler + + .weak ATIM4_TRG_COM_IRQHandler + .thumb_set ATIM4_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM4_CC_IRQHandler + .thumb_set ATIM4_CC_IRQHandler,Default_Handler + + .weak ATIM4_UP_IRQHandler + .thumb_set ATIM4_UP_IRQHandler,Default_Handler + + .weak GTIMA1_IRQHandler + .thumb_set GTIMA1_IRQHandler,Default_Handler + + .weak GTIMA2_IRQHandler + .thumb_set GTIMA2_IRQHandler,Default_Handler + + .weak GTIMA3_IRQHandler + .thumb_set GTIMA3_IRQHandler,Default_Handler + + .weak GTIMA4_IRQHandler + .thumb_set GTIMA4_IRQHandler,Default_Handler + + .weak GTIMA5_IRQHandler + .thumb_set GTIMA5_IRQHandler,Default_Handler + + .weak GTIMA6_IRQHandler + .thumb_set GTIMA6_IRQHandler,Default_Handler + + .weak GTIMA7_IRQHandler + .thumb_set GTIMA7_IRQHandler,Default_Handler + + .weak GTIMB1_IRQHandler + .thumb_set GTIMB1_IRQHandler,Default_Handler + + .weak GTIMB2_IRQHandler + .thumb_set GTIMB2_IRQHandler,Default_Handler + + .weak GTIMB3_IRQHandler + .thumb_set GTIMB3_IRQHandler,Default_Handler + + .weak BTIM1_IRQHandler + .thumb_set BTIM1_IRQHandler,Default_Handler + + .weak BTIM2_IRQHandler + .thumb_set BTIM2_IRQHandler,Default_Handler + + .weak BTIM3_IRQHandler + .thumb_set BTIM3_IRQHandler,Default_Handler + + .weak BTIM4_IRQHandler + .thumb_set BTIM4_IRQHandler,Default_Handler + + .weak LPTIM1_WKUP_IRQHandler + .thumb_set LPTIM1_WKUP_IRQHandler,Default_Handler + + .weak LPTIM2_WKUP_IRQHandler + .thumb_set LPTIM2_WKUP_IRQHandler,Default_Handler + + .weak LPTIM3_WKUP_IRQHandler + .thumb_set LPTIM3_WKUP_IRQHandler,Default_Handler + + .weak LPTIM4_WKUP_IRQHandler + .thumb_set LPTIM4_WKUP_IRQHandler,Default_Handler + + .weak DSMU_FLT0_IRQHandler + .thumb_set DSMU_FLT0_IRQHandler,Default_Handler + + .weak DSMU_FLT1_IRQHandler + .thumb_set DSMU_FLT1_IRQHandler,Default_Handler + + .weak DSMU_FLT2_IRQHandler + .thumb_set DSMU_FLT2_IRQHandler,Default_Handler + + .weak DSMU_FLT3_IRQHandler + .thumb_set DSMU_FLT3_IRQHandler,Default_Handler + + .weak FMAC_IRQHandler + .thumb_set FMAC_IRQHandler,Default_Handler + + .weak CORDIC_IRQHandler + .thumb_set CORDIC_IRQHandler,Default_Handler + + .weak DMAMUX1_IRQHandler + .thumb_set DMAMUX1_IRQHandler,Default_Handler + + .weak MMU_IRQHandler + .thumb_set MMU_IRQHandler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4.s new file mode 100644 index 0000000000..d651a057ca --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4.s @@ -0,0 +1,897 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00002000 + + 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 0x00000400 + + 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 WWDG2_IRQHandler ; Window2 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD AHB_ICACHE_IRQHandler ; CM4 AHB iCache interrupt + DCD AHB_DCACHE_IRQHandler ; CM4 AHB dCache interrupt + DCD FPU_CPU2_IRQHandler ; FPU_CM4 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD DSI_IRQHandler ; MIPI DSI Interrupt through EXTI line 87 + DCD AHB_CACHE_PARMON_IRQHandler ; AHB i/dCACHE parity error intertupt + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD 0 ; + DCD SEMA4_INT2_IRQHandler ; SEMA4 interrupt2 + DCD WWDG1_RST_IRQHandler ; WWDG1 reset interrupt through EXTI line 81 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUA_IRQHandler ; DCMUA interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_IRQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt +__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 WWDG2_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT RTC_TAMPER_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT DMA1_Channel0_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 DMA2_Channel0_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT DMA2_Channel6_IRQHandler [WEAK] + EXPORT DMA2_Channel7_IRQHandler [WEAK] + EXPORT DMA3_Channel0_IRQHandler [WEAK] + EXPORT DMA3_Channel1_IRQHandler [WEAK] + EXPORT DMA3_Channel2_IRQHandler [WEAK] + EXPORT DMA3_Channel3_IRQHandler [WEAK] + EXPORT DMA3_Channel4_IRQHandler [WEAK] + EXPORT DMA3_Channel5_IRQHandler [WEAK] + EXPORT DMA3_Channel6_IRQHandler [WEAK] + EXPORT DMA3_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel0_IRQHandler [WEAK] + EXPORT MDMA_Channel1_IRQHandler [WEAK] + EXPORT MDMA_Channel2_IRQHandler [WEAK] + EXPORT MDMA_Channel3_IRQHandler [WEAK] + EXPORT MDMA_Channel4_IRQHandler [WEAK] + EXPORT MDMA_Channel5_IRQHandler [WEAK] + EXPORT MDMA_Channel6_IRQHandler [WEAK] + EXPORT MDMA_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel8_IRQHandler [WEAK] + EXPORT MDMA_Channel9_IRQHandler [WEAK] + EXPORT MDMA_Channel10_IRQHandler [WEAK] + EXPORT MDMA_Channel11_IRQHandler [WEAK] + EXPORT MDMA_Channel12_IRQHandler [WEAK] + EXPORT MDMA_Channel13_IRQHandler [WEAK] + EXPORT MDMA_Channel14_IRQHandler [WEAK] + EXPORT MDMA_Channel15_IRQHandler [WEAK] + EXPORT SDPU_IRQHandler [WEAK] + EXPORT AHB_ICACHE_IRQHandler [WEAK] + EXPORT AHB_DCACHE_IRQHandler [WEAK] + EXPORT FPU_CPU2_IRQHandler [WEAK] + EXPORT ECCMON_IRQHandler [WEAK] + EXPORT RTC_ALARM_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT I2C3_EV_IRQHandler [WEAK] + EXPORT I2C3_ER_IRQHandler [WEAK] + EXPORT I2C4_EV_IRQHandler [WEAK] + EXPORT I2C4_ER_IRQHandler [WEAK] + EXPORT I2C5_EV_IRQHandler [WEAK] + EXPORT I2C5_ER_IRQHandler [WEAK] + EXPORT I2C6_EV_IRQHandler [WEAK] + EXPORT I2C6_ER_IRQHandler [WEAK] + EXPORT I2C7_EV_IRQHandler [WEAK] + EXPORT I2C7_ER_IRQHandler [WEAK] + EXPORT I2C8_EV_IRQHandler [WEAK] + EXPORT I2C8_ER_IRQHandler [WEAK] + EXPORT I2C9_EV_IRQHandler [WEAK] + EXPORT I2C9_ER_IRQHandler [WEAK] + EXPORT I2C10_EV_IRQHandler [WEAK] + EXPORT I2C10_ER_IRQHandler [WEAK] + EXPORT I2S1_IRQHandler [WEAK] + EXPORT I2S2_IRQHandler [WEAK] + EXPORT I2S3_IRQHandler [WEAK] + EXPORT I2S4_IRQHandler [WEAK] + EXPORT xSPI1_IRQHandler [WEAK] + EXPORT xSPI2_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT SPI4_IRQHandler [WEAK] + EXPORT SPI5_IRQHandler [WEAK] + EXPORT SPI6_IRQHandler [WEAK] + EXPORT SPI7_IRQHandler [WEAK] + EXPORT LCD_EV_IRQHandler [WEAK] + EXPORT LCD_ER_IRQHandler [WEAK] + EXPORT DVP1_IRQHandler [WEAK] + EXPORT DVP2_IRQHandler [WEAK] + EXPORT DMAMUX2_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB1_HS_WKUP_IRQHandler [WEAK] + EXPORT USB1_HS_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB2_HS_WKUP_IRQHandler [WEAK] + EXPORT USB2_HS_IRQHandler [WEAK] + EXPORT ETH1_IRQHandler [WEAK] + EXPORT ETH1_PMT_LPI_IRQHandler [WEAK] + EXPORT ETH2_IRQHandler [WEAK] + EXPORT ETH2_PMT_LPI_IRQHandler [WEAK] + EXPORT FDCAN1_INT0_IRQHandler [WEAK] + EXPORT FDCAN2_INT0_IRQHandler [WEAK] + EXPORT FDCAN3_INT0_IRQHandler [WEAK] + EXPORT FDCAN4_INT0_IRQHandler [WEAK] + EXPORT FDCAN1_INT1_IRQHandler [WEAK] + EXPORT FDCAN2_INT1_IRQHandler [WEAK] + EXPORT FDCAN3_INT1_IRQHandler [WEAK] + EXPORT FDCAN4_INT1_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT USART4_IRQHandler [WEAK] + EXPORT USART5_IRQHandler [WEAK] + EXPORT USART6_IRQHandler [WEAK] + EXPORT USART7_IRQHandler [WEAK] + EXPORT USART8_IRQHandler [WEAK] + EXPORT UART9_IRQHandler [WEAK] + EXPORT UART10_IRQHandler [WEAK] + EXPORT UART11_IRQHandler [WEAK] + EXPORT UART12_IRQHandler [WEAK] + EXPORT UART13_IRQHandler [WEAK] + EXPORT UART14_IRQHandler [WEAK] + EXPORT UART15_IRQHandler [WEAK] + EXPORT LPUART1_IRQHandler [WEAK] + EXPORT LPUART2_IRQHandler [WEAK] + EXPORT GPU_IRQHandler [WEAK] + EXPORT SDMMC1_IRQHandler [WEAK] + EXPORT SDMMC2_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT ADC2_IRQHandler [WEAK] + EXPORT ADC3_IRQHandler [WEAK] + EXPORT COMP1_2_IRQHandler [WEAK] + EXPORT COMP3_4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT1_IRQHandler [WEAK] + EXPORT SHRTIM1_INT2_IRQHandler [WEAK] + EXPORT SHRTIM1_INT3_IRQHandler [WEAK] + EXPORT SHRTIM1_INT4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT5_IRQHandler [WEAK] + EXPORT SHRTIM1_INT6_IRQHandler [WEAK] + EXPORT SHRTIM1_INT7_IRQHandler [WEAK] + EXPORT SHRTIM1_INT8_IRQHandler [WEAK] + EXPORT SHRTIM2_INT1_IRQHandler [WEAK] + EXPORT SHRTIM2_INT2_IRQHandler [WEAK] + EXPORT SHRTIM2_INT3_IRQHandler [WEAK] + EXPORT SHRTIM2_INT4_IRQHandler [WEAK] + EXPORT SHRTIM2_INT5_IRQHandler [WEAK] + EXPORT SHRTIM2_INT6_IRQHandler [WEAK] + EXPORT SHRTIM2_INT7_IRQHandler [WEAK] + EXPORT SHRTIM2_INT8_IRQHandler [WEAK] + EXPORT FDCAN5_INT0_IRQHandler [WEAK] + EXPORT FDCAN6_INT0_IRQHandler [WEAK] + EXPORT FDCAN7_INT0_IRQHandler [WEAK] + EXPORT FDCAN8_INT0_IRQHandler [WEAK] + EXPORT FDCAN5_INT1_IRQHandler [WEAK] + EXPORT FDCAN6_INT1_IRQHandler [WEAK] + EXPORT FDCAN7_INT1_IRQHandler [WEAK] + EXPORT FDCAN8_INT1_IRQHandler [WEAK] + EXPORT DSI_IRQHandler [WEAK] + EXPORT AHB_CACHE_PARMON_IRQHandler [WEAK] + EXPORT LPTIM5_WKUP_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_H2P_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_P2H_IRQHandler [WEAK] + EXPORT WAKEUP_IO_IRQHandler [WEAK] + EXPORT SEMA4_INT2_IRQHandler [WEAK] + EXPORT WWDG1_RST_IRQHandler [WEAK] + EXPORT OTPC_IRQHandler [WEAK] + EXPORT FEMC_IRQHandler [WEAK] + EXPORT DCMUA_IRQHandler [WEAK] + EXPORT DAC1_IRQHandler [WEAK] + EXPORT DAC2_IRQHandler [WEAK] + EXPORT MDMA_AHBS_ER_IRQHandler [WEAK] + EXPORT CM7_CATCH_READ_ER_IRQHandler [WEAK] + EXPORT DAC3_IRQHandler [WEAK] + EXPORT DAC4_IRQHandler [WEAK] + EXPORT EMC_IRQHandler [WEAK] + EXPORT DAC5_IRQHandler [WEAK] + EXPORT DAC6_IRQHandler [WEAK] + EXPORT ESC_OPB_IRQHandler [WEAK] + EXPORT ESC_SYNC0_IRQHandler [WEAK] + EXPORT ESC_SYNC1_IRQHandler [WEAK] + EXPORT ESC_WRP_IRQHandler [WEAK] + EXPORT ATIM1_BRK_IRQHandler [WEAK] + EXPORT ATIM1_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM1_CC_IRQHandler [WEAK] + EXPORT ATIM1_UP_IRQHandler [WEAK] + EXPORT ATIM2_BRK_IRQHandler [WEAK] + EXPORT ATIM2_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM2_CC_IRQHandler [WEAK] + EXPORT ATIM2_UP_IRQHandler [WEAK] + EXPORT ATIM3_BRK_IRQHandler [WEAK] + EXPORT ATIM3_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM3_CC_IRQHandler [WEAK] + EXPORT ATIM3_UP_IRQHandler [WEAK] + EXPORT ATIM4_BRK_IRQHandler [WEAK] + EXPORT ATIM4_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM4_CC_IRQHandler [WEAK] + EXPORT ATIM4_UP_IRQHandler [WEAK] + EXPORT GTIMA1_IRQHandler [WEAK] + EXPORT GTIMA2_IRQHandler [WEAK] + EXPORT GTIMA3_IRQHandler [WEAK] + EXPORT GTIMA4_IRQHandler [WEAK] + EXPORT GTIMA5_IRQHandler [WEAK] + EXPORT GTIMA6_IRQHandler [WEAK] + EXPORT GTIMA7_IRQHandler [WEAK] + EXPORT GTIMB1_IRQHandler [WEAK] + EXPORT GTIMB2_IRQHandler [WEAK] + EXPORT GTIMB3_IRQHandler [WEAK] + EXPORT BTIM1_IRQHandler [WEAK] + EXPORT BTIM2_IRQHandler [WEAK] + EXPORT BTIM3_IRQHandler [WEAK] + EXPORT BTIM4_IRQHandler [WEAK] + EXPORT LPTIM1_WKUP_IRQHandler [WEAK] + EXPORT LPTIM2_WKUP_IRQHandler [WEAK] + EXPORT LPTIM3_WKUP_IRQHandler [WEAK] + EXPORT LPTIM4_WKUP_IRQHandler [WEAK] + EXPORT DSMU_FLT0_IRQHandler [WEAK] + EXPORT DSMU_FLT1_IRQHandler [WEAK] + EXPORT DSMU_FLT2_IRQHandler [WEAK] + EXPORT DSMU_FLT3_IRQHandler [WEAK] + EXPORT FMAC_IRQHandler [WEAK] + EXPORT CORDIC_IRQHandler [WEAK] + EXPORT DMAMUX1_IRQHandler [WEAK] + EXPORT MMU_IRQHandler [WEAK] + + +WWDG2_IRQHandler +PVD_IRQHandler +RTC_TAMPER_IRQHandler +RTC_WKUP_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +EXTI9_5_IRQHandler +EXTI15_10_IRQHandler +DMA1_Channel0_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +DMA2_Channel0_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +DMA2_Channel6_IRQHandler +DMA2_Channel7_IRQHandler +DMA3_Channel0_IRQHandler +DMA3_Channel1_IRQHandler +DMA3_Channel2_IRQHandler +DMA3_Channel3_IRQHandler +DMA3_Channel4_IRQHandler +DMA3_Channel5_IRQHandler +DMA3_Channel6_IRQHandler +DMA3_Channel7_IRQHandler +MDMA_Channel0_IRQHandler +MDMA_Channel1_IRQHandler +MDMA_Channel2_IRQHandler +MDMA_Channel3_IRQHandler +MDMA_Channel4_IRQHandler +MDMA_Channel5_IRQHandler +MDMA_Channel6_IRQHandler +MDMA_Channel7_IRQHandler +MDMA_Channel8_IRQHandler +MDMA_Channel9_IRQHandler +MDMA_Channel10_IRQHandler +MDMA_Channel11_IRQHandler +MDMA_Channel12_IRQHandler +MDMA_Channel13_IRQHandler +MDMA_Channel14_IRQHandler +MDMA_Channel15_IRQHandler +SDPU_IRQHandler +AHB_ICACHE_IRQHandler +AHB_DCACHE_IRQHandler +FPU_CPU2_IRQHandler +ECCMON_IRQHandler +RTC_ALARM_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +I2C3_EV_IRQHandler +I2C3_ER_IRQHandler +I2C4_EV_IRQHandler +I2C4_ER_IRQHandler +I2C5_EV_IRQHandler +I2C5_ER_IRQHandler +I2C6_EV_IRQHandler +I2C6_ER_IRQHandler +I2C7_EV_IRQHandler +I2C7_ER_IRQHandler +I2C8_EV_IRQHandler +I2C8_ER_IRQHandler +I2C9_EV_IRQHandler +I2C9_ER_IRQHandler +I2C10_EV_IRQHandler +I2C10_ER_IRQHandler +I2S1_IRQHandler +I2S2_IRQHandler +I2S3_IRQHandler +I2S4_IRQHandler +xSPI1_IRQHandler +xSPI2_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +SPI3_IRQHandler +SPI4_IRQHandler +SPI5_IRQHandler +SPI6_IRQHandler +SPI7_IRQHandler +LCD_EV_IRQHandler +LCD_ER_IRQHandler +DVP1_IRQHandler +DVP2_IRQHandler +DMAMUX2_IRQHandler +USB1_HS_EPx_OUT_IRQHandler +USB1_HS_EPx_IN_IRQHandler +USB1_HS_WKUP_IRQHandler +USB1_HS_IRQHandler +USB2_HS_EPx_OUT_IRQHandler +USB2_HS_EPx_IN_IRQHandler +USB2_HS_WKUP_IRQHandler +USB2_HS_IRQHandler +ETH1_IRQHandler +ETH1_PMT_LPI_IRQHandler +ETH2_IRQHandler +ETH2_PMT_LPI_IRQHandler +FDCAN1_INT0_IRQHandler +FDCAN2_INT0_IRQHandler +FDCAN3_INT0_IRQHandler +FDCAN4_INT0_IRQHandler +FDCAN1_INT1_IRQHandler +FDCAN2_INT1_IRQHandler +FDCAN3_INT1_IRQHandler +FDCAN4_INT1_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +USART4_IRQHandler +USART5_IRQHandler +USART6_IRQHandler +USART7_IRQHandler +USART8_IRQHandler +UART9_IRQHandler +UART10_IRQHandler +UART11_IRQHandler +UART12_IRQHandler +UART13_IRQHandler +UART14_IRQHandler +UART15_IRQHandler +LPUART1_IRQHandler +LPUART2_IRQHandler +GPU_IRQHandler +SDMMC1_IRQHandler +SDMMC2_IRQHandler +ADC1_IRQHandler +ADC2_IRQHandler +ADC3_IRQHandler +COMP1_2_IRQHandler +COMP3_4_IRQHandler +SHRTIM1_INT1_IRQHandler +SHRTIM1_INT2_IRQHandler +SHRTIM1_INT3_IRQHandler +SHRTIM1_INT4_IRQHandler +SHRTIM1_INT5_IRQHandler +SHRTIM1_INT6_IRQHandler +SHRTIM1_INT7_IRQHandler +SHRTIM1_INT8_IRQHandler +SHRTIM2_INT1_IRQHandler +SHRTIM2_INT2_IRQHandler +SHRTIM2_INT3_IRQHandler +SHRTIM2_INT4_IRQHandler +SHRTIM2_INT5_IRQHandler +SHRTIM2_INT6_IRQHandler +SHRTIM2_INT7_IRQHandler +SHRTIM2_INT8_IRQHandler +FDCAN5_INT0_IRQHandler +FDCAN6_INT0_IRQHandler +FDCAN7_INT0_IRQHandler +FDCAN8_INT0_IRQHandler +FDCAN5_INT1_IRQHandler +FDCAN6_INT1_IRQHandler +FDCAN7_INT1_IRQHandler +FDCAN8_INT1_IRQHandler +DSI_IRQHandler +AHB_CACHE_PARMON_IRQHandler +LPTIM5_WKUP_IRQHandler +JPEG_SGDMA_H2P_IRQHandler +JPEG_SGDMA_P2H_IRQHandler +WAKEUP_IO_IRQHandler +SEMA4_INT2_IRQHandler +WWDG1_RST_IRQHandler +OTPC_IRQHandler +FEMC_IRQHandler +DCMUA_IRQHandler +DAC1_IRQHandler +DAC2_IRQHandler +MDMA_AHBS_ER_IRQHandler +CM7_CATCH_READ_ER_IRQHandler +DAC3_IRQHandler +DAC4_IRQHandler +EMC_IRQHandler +DAC5_IRQHandler +DAC6_IRQHandler +ESC_OPB_IRQHandler +ESC_SYNC0_IRQHandler +ESC_SYNC1_IRQHandler +ESC_WRP_IRQHandler +ATIM1_BRK_IRQHandler +ATIM1_TRG_COM_IRQHandler +ATIM1_CC_IRQHandler +ATIM1_UP_IRQHandler +ATIM2_BRK_IRQHandler +ATIM2_TRG_COM_IRQHandler +ATIM2_CC_IRQHandler +ATIM2_UP_IRQHandler +ATIM3_BRK_IRQHandler +ATIM3_TRG_COM_IRQHandler +ATIM3_CC_IRQHandler +ATIM3_UP_IRQHandler +ATIM4_BRK_IRQHandler +ATIM4_TRG_COM_IRQHandler +ATIM4_CC_IRQHandler +ATIM4_UP_IRQHandler +GTIMA1_IRQHandler +GTIMA2_IRQHandler +GTIMA3_IRQHandler +GTIMA4_IRQHandler +GTIMA5_IRQHandler +GTIMA6_IRQHandler +GTIMA7_IRQHandler +GTIMB1_IRQHandler +GTIMB2_IRQHandler +GTIMB3_IRQHandler +BTIM1_IRQHandler +BTIM2_IRQHandler +BTIM3_IRQHandler +BTIM4_IRQHandler +LPTIM1_WKUP_IRQHandler +LPTIM2_WKUP_IRQHandler +LPTIM3_WKUP_IRQHandler +LPTIM4_WKUP_IRQHandler +DSMU_FLT0_IRQHandler +DSMU_FLT1_IRQHandler +DSMU_FLT2_IRQHandler +DSMU_FLT3_IRQHandler +FMAC_IRQHandler +CORDIC_IRQHandler +DMAMUX1_IRQHandler +MMU_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 + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4_EWARM.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4_EWARM.s new file mode 100644 index 0000000000..052c5d55d3 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4_EWARM.s @@ -0,0 +1,1543 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + + 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 + + __iar_init$$done: ; The vector table is not needed + ; until after copy initialization is done + +__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 WWDG2_IRQHandler ; Window2 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD AHB_ICACHE_IRQHandler ; CM4 AHB iCache interrupt + DCD AHB_DCACHE_IRQHandler ; CM4 AHB dCache interrupt + DCD FPU_CPU2_IRQHandler ; FPU_CM4 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD DSI_IRQHandler ; MIPI DSI Interrupt through EXTI line 87 + DCD CACHE_PARITY_ER_IRQHandler ; AHB i/dCACHE parity error intertupt + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD 0 ; Reserved + DCD SEMA4_INT2_IRQHandler ; SEMA4 interrupt2 + DCD WWDG2_RST_IRQHandler ; WWDG2 reset interrupt through EXTI line 82 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUA_IRQHandler ; DCMUA interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_RQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; Reserved + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt + ;need check to user manual of exti chapter + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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 WWDG2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG2_IRQHandler + B WWDG2_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK RTC_TAMPER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_TAMPER_IRQHandler + B RTC_TAMPER_IRQHandler + + PUBWEAK RTC_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_WKUP_IRQHandler + B RTC_WKUP_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK DMA1_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel0_IRQHandler + B DMA1_Channel0_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 DMA2_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel0_IRQHandler + B DMA2_Channel0_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_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel4_IRQHandler + B DMA2_Channel4_IRQHandler + + PUBWEAK DMA2_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel5_IRQHandler + B DMA2_Channel5_IRQHandler + + PUBWEAK DMA2_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel6_IRQHandler + B DMA2_Channel6_IRQHandler + + PUBWEAK DMA2_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel7_IRQHandler + B DMA2_Channel7_IRQHandler + + PUBWEAK DMA3_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel0_IRQHandler + B DMA3_Channel0_IRQHandler + + PUBWEAK DMA3_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel1_IRQHandler + B DMA3_Channel1_IRQHandler + + PUBWEAK DMA3_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel2_IRQHandler + B DMA3_Channel2_IRQHandler + + PUBWEAK DMA3_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel3_IRQHandler + B DMA3_Channel3_IRQHandler + + PUBWEAK DMA3_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel4_IRQHandler + B DMA3_Channel4_IRQHandler + + PUBWEAK DMA3_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel5_IRQHandler + B DMA3_Channel5_IRQHandler + + PUBWEAK DMA3_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel6_IRQHandler + B DMA3_Channel6_IRQHandler + + PUBWEAK DMA3_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel7_IRQHandler + B DMA3_Channel7_IRQHandler + + PUBWEAK MDMA_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel0_IRQHandler + B MDMA_Channel0_IRQHandler + + PUBWEAK MDMA_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel1_IRQHandler + B MDMA_Channel1_IRQHandler + + PUBWEAK MDMA_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel2_IRQHandler + B MDMA_Channel2_IRQHandler + + PUBWEAK MDMA_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel3_IRQHandler + B MDMA_Channel3_IRQHandler + + PUBWEAK MDMA_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel4_IRQHandler + B MDMA_Channel4_IRQHandler + + PUBWEAK MDMA_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel5_IRQHandler + B MDMA_Channel5_IRQHandler + + PUBWEAK MDMA_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel6_IRQHandler + B MDMA_Channel6_IRQHandler + + PUBWEAK MDMA_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel7_IRQHandler + B MDMA_Channel7_IRQHandler + + PUBWEAK MDMA_Channel8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel8_IRQHandler + B MDMA_Channel8_IRQHandler + + PUBWEAK MDMA_Channel9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel9_IRQHandler + B MDMA_Channel9_IRQHandler + + PUBWEAK MDMA_Channel10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel10_IRQHandler + B MDMA_Channel10_IRQHandler + + PUBWEAK MDMA_Channel11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel11_IRQHandler + B MDMA_Channel11_IRQHandler + + PUBWEAK MDMA_Channel12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel12_IRQHandler + B MDMA_Channel12_IRQHandler + + PUBWEAK MDMA_Channel13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel13_IRQHandler + B MDMA_Channel13_IRQHandler + + PUBWEAK MDMA_Channel14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel14_IRQHandler + B MDMA_Channel14_IRQHandler + + PUBWEAK MDMA_Channel15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel15_IRQHandler + B MDMA_Channel15_IRQHandler + + PUBWEAK SDPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDPU_IRQHandler + B SDPU_IRQHandler + + PUBWEAK AHB_ICACHE_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +AHB_ICACHE_IRQHandler + B AHB_ICACHE_IRQHandler + + PUBWEAK AHB_DCACHE_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +AHB_DCACHE_IRQHandler + B AHB_DCACHE_IRQHandler + + PUBWEAK FPU_CPU2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FPU_CPU2_IRQHandler + B FPU_CPU2_IRQHandler + + PUBWEAK ECCMON_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ECCMON_IRQHandler + B ECCMON_IRQHandler + + PUBWEAK RTC_ALARM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_ALARM_IRQHandler + B RTC_ALARM_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 I2C3_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_EV_IRQHandler + B I2C3_EV_IRQHandler + + PUBWEAK I2C3_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_ER_IRQHandler + B I2C3_ER_IRQHandler + + PUBWEAK I2C4_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_EV_IRQHandler + B I2C4_EV_IRQHandler + + PUBWEAK I2C4_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_ER_IRQHandler + B I2C4_ER_IRQHandler + + PUBWEAK I2C5_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_EV_IRQHandler + B I2C5_EV_IRQHandler + + PUBWEAK I2C5_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_ER_IRQHandler + B I2C5_ER_IRQHandler + + PUBWEAK I2C6_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_EV_IRQHandler + B I2C6_EV_IRQHandler + + PUBWEAK I2C6_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_ER_IRQHandler + B I2C6_ER_IRQHandler + + PUBWEAK I2C7_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_EV_IRQHandler + B I2C7_EV_IRQHandler + + PUBWEAK I2C7_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_ER_IRQHandler + B I2C7_ER_IRQHandler + + PUBWEAK I2C8_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_EV_IRQHandler + B I2C8_EV_IRQHandler + + PUBWEAK I2C8_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_ER_IRQHandler + B I2C8_ER_IRQHandler + + PUBWEAK I2C9_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_EV_IRQHandler + B I2C9_EV_IRQHandler + + PUBWEAK I2C9_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_ER_IRQHandler + B I2C9_ER_IRQHandler + + PUBWEAK I2C10_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_EV_IRQHandler + B I2C10_EV_IRQHandler + + PUBWEAK I2C10_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_ER_IRQHandler + B I2C10_ER_IRQHandler + + PUBWEAK I2S1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S1_IRQHandler + B I2S1_IRQHandler + + PUBWEAK I2S2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S2_IRQHandler + B I2S2_IRQHandler + + PUBWEAK I2S3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S3_IRQHandler + B I2S3_IRQHandler + + PUBWEAK I2S4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S4_IRQHandler + B I2S4_IRQHandler + + PUBWEAK xSPI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI1_IRQHandler + B xSPI1_IRQHandler + + PUBWEAK xSPI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI2_IRQHandler + B xSPI2_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 SPI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK SPI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI4_IRQHandler + B SPI4_IRQHandler + + PUBWEAK SPI5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI5_IRQHandler + B SPI5_IRQHandler + + PUBWEAK SPI6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI6_IRQHandler + B SPI6_IRQHandler + + PUBWEAK SPI7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI7_IRQHandler + B SPI7_IRQHandler + + PUBWEAK LCD_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_EV_IRQHandler + B LCD_EV_IRQHandler + + PUBWEAK LCD_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_ER_IRQHandler + B LCD_ER_IRQHandler + + PUBWEAK DVP1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP1_IRQHandler + B DVP1_IRQHandler + + PUBWEAK DVP2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP2_IRQHandler + B DVP2_IRQHandler + + PUBWEAK DMAMUX2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX2_IRQHandler + B DMAMUX2_IRQHandler + + PUBWEAK USB1_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_OUT_IRQHandler + B USB1_HS_EPx_OUT_IRQHandler + + PUBWEAK USB1_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_IN_IRQHandler + B USB1_HS_EPx_IN_IRQHandler + + PUBWEAK USB1_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_WKUP_IRQHandler + B USB1_HS_WKUP_IRQHandler + + PUBWEAK USB1_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_IRQHandler + B USB1_HS_IRQHandler + + PUBWEAK USB2_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_OUT_IRQHandler + B USB2_HS_EPx_OUT_IRQHandler + + PUBWEAK USB2_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_IN_IRQHandler + B USB2_HS_EPx_IN_IRQHandler + + PUBWEAK USB2_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_WKUP_IRQHandler + B USB2_HS_WKUP_IRQHandler + + PUBWEAK USB2_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_IRQHandler + B USB2_HS_IRQHandler + + PUBWEAK ETH1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_IRQHandler + B ETH1_IRQHandler + + PUBWEAK ETH1_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_PMT_LPI_IRQHandler + B ETH1_PMT_LPI_IRQHandler + + PUBWEAK ETH2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_IRQHandler + B ETH2_IRQHandler + + PUBWEAK ETH2_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_PMT_LPI_IRQHandler + B ETH2_PMT_LPI_IRQHandler + + PUBWEAK FDCAN1_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT0_IRQHandler + B FDCAN1_INT0_IRQHandler + + PUBWEAK FDCAN2_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT0_IRQHandler + B FDCAN2_INT0_IRQHandler + + PUBWEAK FDCAN3_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT0_IRQHandler + B FDCAN3_INT0_IRQHandler + + PUBWEAK FDCAN4_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT0_IRQHandler + B FDCAN4_INT0_IRQHandler + + PUBWEAK FDCAN1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT1_IRQHandler + B FDCAN1_INT1_IRQHandler + + PUBWEAK FDCAN2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT1_IRQHandler + B FDCAN2_INT1_IRQHandler + + PUBWEAK FDCAN3_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT1_IRQHandler + B FDCAN3_INT1_IRQHandler + + PUBWEAK FDCAN4_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT1_IRQHandler + B FDCAN4_INT1_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 USART4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART4_IRQHandler + B USART4_IRQHandler + + PUBWEAK USART5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART5_IRQHandler + B USART5_IRQHandler + + PUBWEAK USART6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART6_IRQHandler + B USART6_IRQHandler + + PUBWEAK USART7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART7_IRQHandler + B USART7_IRQHandler + + PUBWEAK USART8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART8_IRQHandler + B USART8_IRQHandler + + PUBWEAK UART9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART9_IRQHandler + B UART9_IRQHandler + + PUBWEAK UART10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART10_IRQHandler + B UART10_IRQHandler + + PUBWEAK UART11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART11_IRQHandler + B UART11_IRQHandler + + PUBWEAK UART12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART12_IRQHandler + B UART12_IRQHandler + + PUBWEAK UART13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART13_IRQHandler + B UART13_IRQHandler + + PUBWEAK UART14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART14_IRQHandler + B UART14_IRQHandler + + PUBWEAK UART15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART15_IRQHandler + B UART15_IRQHandler + + PUBWEAK LPUART1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART1_IRQHandler + B LPUART1_IRQHandler + + PUBWEAK LPUART2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART2_IRQHandler + B LPUART2_IRQHandler + + PUBWEAK GPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GPU_IRQHandler + B GPU_IRQHandler + + PUBWEAK SDMMC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC1_IRQHandler + B SDMMC1_IRQHandler + + PUBWEAK SDMMC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC2_IRQHandler + B SDMMC2_IRQHandler + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + PUBWEAK ADC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC2_IRQHandler + B ADC2_IRQHandler + + PUBWEAK ADC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC3_IRQHandler + B ADC3_IRQHandler + + PUBWEAK COMP1_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP1_2_IRQHandler + B COMP1_2_IRQHandler + + PUBWEAK COMP3_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP3_4_IRQHandler + B COMP3_4_IRQHandler + + PUBWEAK SHRTIM1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT1_IRQHandler + B SHRTIM1_INT1_IRQHandler + + PUBWEAK SHRTIM1_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT2_IRQHandler + B SHRTIM1_INT2_IRQHandler + + PUBWEAK SHRTIM1_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT3_IRQHandler + B SHRTIM1_INT3_IRQHandler + + PUBWEAK SHRTIM1_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT4_IRQHandler + B SHRTIM1_INT4_IRQHandler + + PUBWEAK SHRTIM1_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT5_IRQHandler + B SHRTIM1_INT5_IRQHandler + + PUBWEAK SHRTIM1_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT6_IRQHandler + B SHRTIM1_INT6_IRQHandler + + PUBWEAK SHRTIM1_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT7_IRQHandler + B SHRTIM1_INT7_IRQHandler + + PUBWEAK SHRTIM1_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT8_IRQHandler + B SHRTIM1_INT8_IRQHandler + + PUBWEAK SHRTIM2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT1_IRQHandler + B SHRTIM2_INT1_IRQHandler + + PUBWEAK SHRTIM2_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT2_IRQHandler + B SHRTIM2_INT2_IRQHandler + + PUBWEAK SHRTIM2_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT3_IRQHandler + B SHRTIM2_INT3_IRQHandler + + PUBWEAK SHRTIM2_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT4_IRQHandler + B SHRTIM2_INT4_IRQHandler + + PUBWEAK SHRTIM2_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT5_IRQHandler + B SHRTIM2_INT5_IRQHandler + + PUBWEAK SHRTIM2_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT6_IRQHandler + B SHRTIM2_INT6_IRQHandler + + PUBWEAK SHRTIM2_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT7_IRQHandler + B SHRTIM2_INT7_IRQHandler + + PUBWEAK SHRTIM2_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT8_IRQHandler + B SHRTIM2_INT8_IRQHandler + + PUBWEAK FDCAN5_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT0_IRQHandler + B FDCAN5_INT0_IRQHandler + + PUBWEAK FDCAN6_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT0_IRQHandler + B FDCAN6_INT0_IRQHandler + + PUBWEAK FDCAN7_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT0_IRQHandler + B FDCAN7_INT0_IRQHandler + + PUBWEAK FDCAN8_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT0_IRQHandler + B FDCAN8_INT0_IRQHandler + + PUBWEAK FDCAN5_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT1_IRQHandler + B FDCAN5_INT1_IRQHandler + + PUBWEAK FDCAN6_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT1_IRQHandler + B FDCAN6_INT1_IRQHandler + + PUBWEAK FDCAN7_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT1_IRQHandler + B FDCAN7_INT1_IRQHandler + + PUBWEAK FDCAN8_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT1_IRQHandler + B FDCAN8_INT1_IRQHandler + + PUBWEAK DSI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSI_IRQHandler + B DSI_IRQHandler + + PUBWEAK CACHE_PARITY_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CACHE_PARITY_ER_IRQHandler + B CACHE_PARITY_ER_IRQHandler + + PUBWEAK LPTIM5_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM5_WKUP_IRQHandler + B LPTIM5_WKUP_IRQHandler + + PUBWEAK JPEG_SGDMA_H2P_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_H2P_IRQHandler + B JPEG_SGDMA_H2P_IRQHandler + + PUBWEAK JPEG_SGDMA_P2H_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_P2H_IRQHandler + B JPEG_SGDMA_P2H_IRQHandler + + PUBWEAK WAKEUP_IO_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WAKEUP_IO_IRQHandler + B WAKEUP_IO_IRQHandler + + PUBWEAK SEMA4_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SEMA4_INT2_IRQHandler + B SEMA4_INT2_IRQHandler + + PUBWEAK WWDG2_RST_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG2_RST_IRQHandler + B WWDG2_RST_IRQHandler + + PUBWEAK OTPC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +OTPC_IRQHandler + B OTPC_IRQHandler + + PUBWEAK FEMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FEMC_IRQHandler + B FEMC_IRQHandler + + PUBWEAK DCMUA_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DCMUA_IRQHandler + B DCMUA_IRQHandler + + PUBWEAK DAC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC1_IRQHandler + B DAC1_IRQHandler + + PUBWEAK DAC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC2_IRQHandler + B DAC2_IRQHandler + + PUBWEAK MDMA_AHBS_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_AHBS_ER_IRQHandler + B MDMA_AHBS_ER_IRQHandler + + PUBWEAK CM7_CATCH_READ_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CM7_CATCH_READ_ER_IRQHandler + B CM7_CATCH_READ_ER_IRQHandler + + PUBWEAK DAC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC3_IRQHandler + B DAC3_IRQHandler + + PUBWEAK DAC4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC4_IRQHandler + B DAC4_IRQHandler + + PUBWEAK EMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EMC_IRQHandler + B EMC_IRQHandler + + PUBWEAK DAC5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC5_IRQHandler + B DAC5_IRQHandler + + PUBWEAK DAC6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC6_IRQHandler + B DAC6_IRQHandler + + PUBWEAK ESC_OPB_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_OPB_IRQHandler + B ESC_OPB_IRQHandler + + PUBWEAK ESC_SYNC0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC0_IRQHandler + B ESC_SYNC0_IRQHandler + + PUBWEAK ESC_SYNC1_RQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC1_RQHandler + B ESC_SYNC1_RQHandler + + PUBWEAK ESC_WRP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_WRP_IRQHandler + B ESC_WRP_IRQHandler + + PUBWEAK ATIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_BRK_IRQHandler + B ATIM1_BRK_IRQHandler + + PUBWEAK ATIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_TRG_COM_IRQHandler + B ATIM1_TRG_COM_IRQHandler + + PUBWEAK ATIM1_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_CC_IRQHandler + B ATIM1_CC_IRQHandler + + PUBWEAK ATIM1_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_UP_IRQHandler + B ATIM1_UP_IRQHandler + + PUBWEAK ATIM2_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_BRK_IRQHandler + B ATIM2_BRK_IRQHandler + + PUBWEAK ATIM2_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_TRG_COM_IRQHandler + B ATIM2_TRG_COM_IRQHandler + + PUBWEAK ATIM2_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_CC_IRQHandler + B ATIM2_CC_IRQHandler + + PUBWEAK ATIM2_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_UP_IRQHandler + B ATIM2_UP_IRQHandler + + PUBWEAK ATIM3_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_BRK_IRQHandler + B ATIM3_BRK_IRQHandler + + PUBWEAK ATIM3_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_TRG_COM_IRQHandler + B ATIM3_TRG_COM_IRQHandler + + PUBWEAK ATIM3_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_CC_IRQHandler + B ATIM3_CC_IRQHandler + + PUBWEAK ATIM3_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_UP_IRQHandler + B ATIM3_UP_IRQHandler + + PUBWEAK ATIM4_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_BRK_IRQHandler + B ATIM4_BRK_IRQHandler + + PUBWEAK ATIM4_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_TRG_COM_IRQHandler + B ATIM4_TRG_COM_IRQHandler + + PUBWEAK ATIM4_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_CC_IRQHandler + B ATIM4_CC_IRQHandler + + PUBWEAK ATIM4_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_UP_IRQHandler + B ATIM4_UP_IRQHandler + + PUBWEAK GTIMA1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA1_IRQHandler + B GTIMA1_IRQHandler + + PUBWEAK GTIMA2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA2_IRQHandler + B GTIMA2_IRQHandler + + PUBWEAK GTIMA3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA3_IRQHandler + B GTIMA3_IRQHandler + + PUBWEAK GTIMA4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA4_IRQHandler + B GTIMA4_IRQHandler + + PUBWEAK GTIMA5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA5_IRQHandler + B GTIMA5_IRQHandler + + PUBWEAK GTIMA6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA6_IRQHandler + B GTIMA6_IRQHandler + + PUBWEAK GTIMA7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA7_IRQHandler + B GTIMA7_IRQHandler + + PUBWEAK GTIMB1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB1_IRQHandler + B GTIMB1_IRQHandler + + PUBWEAK GTIMB2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB2_IRQHandler + B GTIMB2_IRQHandler + + PUBWEAK GTIMB3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB3_IRQHandler + B GTIMB3_IRQHandler + + PUBWEAK BTIM1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM1_IRQHandler + B BTIM1_IRQHandler + + PUBWEAK BTIM2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM2_IRQHandler + B BTIM2_IRQHandler + + PUBWEAK BTIM3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM3_IRQHandler + B BTIM3_IRQHandler + + PUBWEAK BTIM4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM4_IRQHandler + B BTIM4_IRQHandler + + PUBWEAK LPTIM1_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM1_WKUP_IRQHandler + B LPTIM1_WKUP_IRQHandler + + PUBWEAK LPTIM2_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM2_WKUP_IRQHandler + B LPTIM2_WKUP_IRQHandler + + PUBWEAK LPTIM3_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM3_WKUP_IRQHandler + B LPTIM3_WKUP_IRQHandler + + PUBWEAK LPTIM4_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM4_WKUP_IRQHandler + B LPTIM4_WKUP_IRQHandler + + PUBWEAK DSMU_FLT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT0_IRQHandler + B DSMU_FLT0_IRQHandler + + PUBWEAK DSMU_FLT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT1_IRQHandler + B DSMU_FLT1_IRQHandler + + PUBWEAK DSMU_FLT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT2_IRQHandler + B DSMU_FLT2_IRQHandler + + PUBWEAK DSMU_FLT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT3_IRQHandler + B DSMU_FLT3_IRQHandler + + PUBWEAK FMAC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FMAC_IRQHandler + B FMAC_IRQHandler + + PUBWEAK CORDIC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CORDIC_IRQHandler + B CORDIC_IRQHandler + + PUBWEAK DMAMUX1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX1_IRQHandler + B DMAMUX1_IRQHandler + + PUBWEAK MMU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MMU_IRQHandler + B MMU_IRQHandler + + END + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4_gcc.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4_gcc.s new file mode 100644 index 0000000000..37ed8e9dc2 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm4_gcc.s @@ -0,0 +1,1117 @@ +/********************************************************************************************************* + Copyright (c) 2024, Nations Technologies Inc. + + All rights reserved. + + This software is the exclusive property of Nations Technologies Inc. (Hereinafter + referred to as NATIONS). This software, and the product of NATIONS described herein + (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties + of the People's Republic of China and other applicable jurisdictions worldwide. + + NATIONS does not grant any license under its patents, copyrights, trademarks, or other + intellectual property rights. Names and brands of third party may be mentioned or referred + thereto (if any) for identification purposes only. + + NATIONS reserves the right to make changes, corrections, enhancements, modifications, and + improvements to this software at any time without notice. Please contact NATIONS and obtain + the latest version of this software before placing orders. + + Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes + no responsibility for the accuracy and reliability of this software. + + It is the responsibility of the user of this software to properly design, program, and test + the functionality and safety of any application made of this information and any resulting product. + In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or + consequential damages arising in any way out of the use of this software or the Product. + + NATIONS Products are neither intended nor warranted for usage in systems or equipment, any + malfunction or failure of which may cause loss of human life, bodily injury or severe property + damage. Such applications are deemed, "Insecure Usage". + + All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS + harmless from and against all claims, costs, damages, and other liabilities, arising from or related + to any customer's Insecure Usage. + + Any express or implied warranty with regard to this software or the Product, including,but not + limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement + are disclaimed to the fullest extent permitted by law. + + Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe + or otherwise distribute this software for any purposes, in whole or in part. + + NATIONS products and technologies shall not be used for or incorporated into any products or systems + whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. + User shall comply with any applicable export control laws and regulations promulgated and administered by + the governments of any countries asserting jurisdiction over the parties or transactions. + ************************************************************************************************************/ + + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr r0, =_estack + mov sp, r0 /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + ldr r1, =_edata + ldr r2, =_sidata + movs r3, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +LoopCopyDataInit: + adds r4, r0, r3 + cmp r4, r1 + bcc CopyDataInit + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + ldr r4, =_ebss + movs r3, #0 + b LoopFillZerobss + +FillZerobss: + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + cmp r2, r4 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + +LoopForever: + b LoopForever + + +.size Reset_Handler, .-Reset_Handler + +/** +\*fun This is the code that gets called when the processor receives an +\* unexpected interrupt. This simply enters an infinite loop, preserving +\* the system state for examination by a debugger. +**/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/** +\* The minimal vector table for a Cortex M0. Note that the proper constructs +\* must be placed on this to ensure that it ends up at physical address 0x00000000. +**/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + /* External Interrupts */ + .word WWDG2_IRQHandler /* Window1 Watchdog interrupt */ + .word PVD_IRQHandler /* PVD through EXTI Line16 detection interrupt */ + .word RTC_TAMPER_IRQHandler /* RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup timer through EXTI line 19 interrupt */ + .word RCC_IRQHandler /* RCC interrupt */ + .word EXTI0_IRQHandler /* EXTI Line 0 interrupt */ + .word EXTI1_IRQHandler /* EXTI Line 1 interrupt */ + .word EXTI2_IRQHandler /* EXTI Line 2 interrupt */ + .word EXTI3_IRQHandler /* EXTI Line 3 interrupt */ + .word EXTI4_IRQHandler /* EXTI Line 4 interrupt */ + .word EXTI9_5_IRQHandler /* EXTI Line[9:5] interrupt */ + .word EXTI15_10_IRQHandler /* EXTI Line[15:10] interrupt */ + .word DMA1_Channel0_IRQHandler /* DMA1 Channel 0 */ + .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 DMA2_Channel0_IRQHandler /* DMA2 Channel 0 */ + .word DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */ + .word DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */ + .word DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */ + .word DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */ + .word DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */ + .word DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */ + .word DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */ + .word DMA3_Channel0_IRQHandler /* DMA3 Channel 0 */ + .word DMA3_Channel1_IRQHandler /* DMA3 Channel 1 */ + .word DMA3_Channel2_IRQHandler /* DMA3 Channel 2 */ + .word DMA3_Channel3_IRQHandler /* DMA3 Channel 3 */ + .word DMA3_Channel4_IRQHandler /* DMA3 Channel 4 */ + .word DMA3_Channel5_IRQHandler /* DMA3 Channel 5 */ + .word DMA3_Channel6_IRQHandler /* DMA3 Channel 6 */ + .word DMA3_Channel7_IRQHandler /* DMA3 Channel 7 */ + .word MDMA_Channel0_IRQHandler /* MDMA Channel 0 */ + .word MDMA_Channel1_IRQHandler /* MDMA Channel 1 */ + .word MDMA_Channel2_IRQHandler /* MDMA Channel 2 */ + .word MDMA_Channel3_IRQHandler /* MDMA Channel 3 */ + .word MDMA_Channel4_IRQHandler /* MDMA Channel 4 */ + .word MDMA_Channel5_IRQHandler /* MDMA Channel 5 */ + .word MDMA_Channel6_IRQHandler /* MDMA Channel 6 */ + .word MDMA_Channel7_IRQHandler /* MDMA Channel 7 */ + .word MDMA_Channel8_IRQHandler /* MDMA Channel 8 */ + .word MDMA_Channel9_IRQHandler /* MDMA Channel 9 */ + .word MDMA_Channel10_IRQHandler /* MDMA Channel 10 */ + .word MDMA_Channel11_IRQHandler /* MDMA Channel 11 */ + .word MDMA_Channel12_IRQHandler /* MDMA Channel 12 */ + .word MDMA_Channel13_IRQHandler /* MDMA Channel 13 */ + .word MDMA_Channel14_IRQHandler /* MDMA Channel 14 */ + .word MDMA_Channel15_IRQHandler /* MDMA Channel 15 */ + .word SDPU_IRQHandler /* SDPU global interrupt */ + .word AHB_ICACHE_IRQHandler /* CM4 AHB iCache interrupt */ + .word AHB_DCACHE_IRQHandler /* CM4 AHB dCache interrupt */ + .word FPU_CPU2_IRQHandler /* FPU_CM4 global interrupt */ + .word ECCMON_IRQHandler /* ECCMON global interrupt */ + .word RTC_ALARM_IRQHandler /* RTC Alarm via EXTI17 interrupt */ + .word I2C1_EV_IRQHandler /* I2C1 event interrupt */ + .word I2C1_ER_IRQHandler /* I2C1 error interrupt */ + .word I2C2_EV_IRQHandler /* I2C2 event interrupt */ + .word I2C2_ER_IRQHandler /* I2C2 error interrupt */ + .word I2C3_EV_IRQHandler /* I2C3 event interrupt */ + .word I2C3_ER_IRQHandler /* I2C3 error interrupt */ + .word I2C4_EV_IRQHandler /* I2C4 event interrupt */ + .word I2C4_ER_IRQHandler /* I2C4 error interrupt */ + .word I2C5_EV_IRQHandler /* I2C5 event interrupt */ + .word I2C5_ER_IRQHandler /* I2C5 error interrupt */ + .word I2C6_EV_IRQHandler /* I2C6 event interrupt */ + .word I2C6_ER_IRQHandler /* I2C6 error interrupt */ + .word I2C7_EV_IRQHandler /* I2C7 event interrupt */ + .word I2C7_ER_IRQHandler /* I2C7 error interrupt */ + .word I2C8_EV_IRQHandler /* I2C8 event interrupt */ + .word I2C8_ER_IRQHandler /* I2C8 error interrupt */ + .word I2C9_EV_IRQHandler /* I2C9 event interrupt */ + .word I2C9_ER_IRQHandler /* I2C9 error interrupt */ + .word I2C10_EV_IRQHandler /* I2C10 event interrupt */ + .word I2C10_ER_IRQHandler /* I2C10 error interrupt */ + .word I2S1_IRQHandler /* I2S1 global interrupt */ + .word I2S2_IRQHandler /* I2S1 global interrupt */ + .word I2S3_IRQHandler /* I2S1 global interrupt */ + .word I2S4_IRQHandler /* I2S1 global interrupt */ + .word xSPI1_IRQHandler /* xSPI1 global interrupt */ + .word xSPI2_IRQHandler /* xSPI1 global interrupt */ + .word SPI1_IRQHandler /* SPI1 global interrupt */ + .word SPI2_IRQHandler /* SPI2 global interrupt */ + .word SPI3_IRQHandler /* SPI3 global interrupt */ + .word SPI4_IRQHandler /* SPI4 global interrupt */ + .word SPI5_IRQHandler /* SPI5 global interrupt */ + .word SPI6_IRQHandler /* SPI6 global interrupt */ + .word SPI7_IRQHandler /* SPI7 global interrupt */ + .word LCD_EV_IRQHandler /* TFT LCD Controller event interrupt */ + .word LCD_ER_IRQHandler /* TFT LCD Controller error interrupt */ + .word DVP1_IRQHandler /* DVP1 global interrupt */ + .word DVP2_IRQHandler /* DVP2 global interrupt */ + .word DMAMUX2_IRQHandler /* DMAMUX2 (MDMA MUX) global interrupt */ + .word USB1_HS_EPx_OUT_IRQHandler /* USB1_HS endpoint out global interrupt */ + .word USB1_HS_EPx_IN_IRQHandler /* USB1_HS endpoint in global interrupt */ + .word USB1_HS_WKUP_IRQHandler /* USB1_HS WKUP interrupt through EXTI line 62 */ + .word USB1_HS_IRQHandler /* USB1_HS global interrupt */ + .word USB2_HS_EPx_OUT_IRQHandler /* USB2_HS endpoint out global interrupt */ + .word USB2_HS_EPx_IN_IRQHandler /* USB2_HS endpoint in global interrupt */ + .word USB2_HS_WKUP_IRQHandler /* USB2_HS WKUP interrupt through EXTI line 63 */ + .word USB2_HS_IRQHandler /* USB2_HS global interrupt */ + .word ETH1_IRQHandler /* Ethernet 1 global interrupt */ + .word ETH1_PMT_LPI_IRQHandler /* Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 */ + .word ETH2_IRQHandler /* Ethernet 2 global interrupt */ + .word ETH2_PMT_LPI_IRQHandler /* Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 */ + .word FDCAN1_INT0_IRQHandler /* FDCAN1 global interrupt line 0 */ + .word FDCAN2_INT0_IRQHandler /* FDCAN2 global interrupt line 0 */ + .word FDCAN3_INT0_IRQHandler /* FDCAN3 global interrupt line 0 */ + .word FDCAN4_INT0_IRQHandler /* FDCAN4 global interrupt line 0 */ + .word FDCAN1_INT1_IRQHandler /* FDCAN1 global interrupt line 1 */ + .word FDCAN2_INT1_IRQHandler /* FDCAN2 global interrupt line 1 */ + .word FDCAN3_INT1_IRQHandler /* FDCAN3 global interrupt line 1 */ + .word FDCAN4_INT1_IRQHandler /* FDCAN4 global interrupt line 1 */ + .word USART1_IRQHandler /* USART1 global interrupt */ + .word USART2_IRQHandler /* USART2 global interrupt */ + .word USART3_IRQHandler /* USART3 global interrupt */ + .word USART4_IRQHandler /* USART4 global interrupt */ + .word USART5_IRQHandler /* USART5 global interrupt */ + .word USART6_IRQHandler /* USART6 global interrupt */ + .word USART7_IRQHandler /* USART7 global interrupt */ + .word USART8_IRQHandler /* USART8 global interrupt */ + .word UART9_IRQHandler /* UART9 global interrupt */ + .word UART10_IRQHandler /* UART10 global interrupt */ + .word UART11_IRQHandler /* UART11 global interrupt */ + .word UART12_IRQHandler /* UART12 global interrupt */ + .word UART13_IRQHandler /* UART13 global interrupt */ + .word UART14_IRQHandler /* UART14 global interrupt */ + .word UART15_IRQHandler /* UART15 global interrupt */ + .word LPUART1_IRQHandler /* LPUART1 global interrupt + wakeup through EXTI line 49 */ + .word LPUART2_IRQHandler /* LPUART2 global interrupt + wakeup through EXTI line 52 */ + .word GPU_IRQHandler /* GPU global interrupt */ + .word 0 /* Reserved */ + .word SDMMC1_IRQHandler /* SDMMC1_IRQ + WKUP through EXTI line 24 */ + .word SDMMC2_IRQHandler /* SDMMC2_IRQ + WKUP through EXTI line 25 */ + .word ADC1_IRQHandler /* ADC1 global interrupt */ + .word ADC2_IRQHandler /* ADC2 global interrupt */ + .word ADC3_IRQHandler /* ADC3 global interrupt */ + .word COMP1_2_IRQHandler /* COMP1 and COMP2 through EXTI line 20 and 21 */ + .word COMP3_4_IRQHandler /* COMP3 and COMP4 through EXTI line 22 and 23 */ + .word SHRTIM1_INT1_IRQHandler /* High Resolution timer 1 interrupt 1 */ + .word SHRTIM1_INT2_IRQHandler /* High Resolution timer 1 interrupt 2 */ + .word SHRTIM1_INT3_IRQHandler /* High Resolution timer 1 interrupt 3 */ + .word SHRTIM1_INT4_IRQHandler /* High Resolution timer 1 interrupt 4 */ + .word SHRTIM1_INT5_IRQHandler /* High Resolution timer 1 interrupt 5 */ + .word SHRTIM1_INT6_IRQHandler /* High Resolution timer 1 interrupt 6 */ + .word SHRTIM1_INT7_IRQHandler /* High Resolution timer 1 interrupt 7 */ + .word SHRTIM1_INT8_IRQHandler /* High Resolution timer 1 interrupt 8 */ + .word SHRTIM2_INT1_IRQHandler /* High Resolution timer 2 interrupt 1 */ + .word SHRTIM2_INT2_IRQHandler /* High Resolution timer 2 interrupt 2 */ + .word SHRTIM2_INT3_IRQHandler /* High Resolution timer 2 interrupt 3 */ + .word SHRTIM2_INT4_IRQHandler /* High Resolution timer 2 interrupt 4 */ + .word SHRTIM2_INT5_IRQHandler /* High Resolution timer 2 interrupt 5 */ + .word SHRTIM2_INT6_IRQHandler /* High Resolution timer 2 interrupt 6 */ + .word SHRTIM2_INT7_IRQHandler /* High Resolution timer 2 interrupt 7 */ + .word SHRTIM2_INT8_IRQHandler /* High Resolution timer 2 interrupt 8 */ + .word FDCAN5_INT0_IRQHandler /* FDCAN5 global interrupt line 0 */ + .word FDCAN6_INT0_IRQHandler /* FDCAN6 global interrupt line 0 */ + .word FDCAN7_INT0_IRQHandler /* FDCAN7 global interrupt line 0 */ + .word FDCAN8_INT0_IRQHandler /* FDCAN8 global interrupt line 0 */ + .word FDCAN5_INT1_IRQHandler /* FDCAN5 global interrupt line 1 */ + .word FDCAN6_INT1_IRQHandler /* FDCAN6 global interrupt line 1 */ + .word FDCAN7_INT1_IRQHandler /* FDCAN7 global interrupt line 1 */ + .word FDCAN8_INT1_IRQHandler /* FDCAN8 global interrupt line 1 */ + .word DSI_IRQHandler /* MIPI DSI Interrupt through EXTI line 87 */ + .word AHB_CACHE_PARMON_IRQHandler /* AHB i/dCACHE parity error intertupt */ + .word LPTIM5_WKUP_IRQHandler /* LPTIM5 wakeup through EXTI 86 */ + .word JPEG_SGDMA_H2P_IRQHandler /* JPEG SGDMA Host to Peripheral Interrupt */ + .word JPEG_SGDMA_P2H_IRQHandler /* JPEG SGDMA Peripheral to Host Interrupt */ + .word WAKEUP_IO_IRQHandler /* 6 WAKEUP IOs through EXTI line 70-75 */ + .word 0 /* Reserved */ + .word SEMA4_INT2_IRQHandler /* SEMA4 interrupt2 */ + .word WWDG1_RST_IRQHandler /* WWDG1 reset interrupt through EXTI line 81 */ + .word OTPC_IRQHandler /* OTPC interrupt */ + .word FEMC_IRQHandler /* FEMC interrupt */ + .word DCMUB_IRQHandler /* DCMUB interrupt */ + .word DAC1_IRQHandler /* DAC1 interrupt */ + .word DAC2_IRQHandler /* DAC2 interrupt */ + .word MDMA_AHBS_ER_IRQHandler /* MDMA HABS ERROR through EXTI line55-56 */ + .word CM7_CATCH_READ_ER_IRQHandler /* CM7 Error on Cache Read through EXTI line 64-65 */ + .word DAC3_IRQHandler /* DAC3 interrupt */ + .word DAC4_IRQHandler /* DAC4 interrupt */ + .word EMC_IRQHandler /* EMC event interrupt through EXTI line 88-89 */ + .word DAC5_IRQHandler /* DAC5 interrupt */ + .word DAC6_IRQHandler /* DAC6 interrupt */ + .word ESC_OPB_IRQHandler /* ETHERCAT OPB Interrupt */ + .word ESC_SYNC0_IRQHandler /* ETHERCAT SYNC0 Interrupt */ + .word ESC_SYNC1_IRQHandler /* ETHERCAT SYNC1 Interrupt */ + .word ESC_WRP_IRQHandler /* ETHERCAT WRAPPER Interrupt */ + .word 0 /* Reserved */ + .word ATIM1_BRK_IRQHandler /* Advanced timer 1 break interrupt */ + .word ATIM1_TRG_COM_IRQHandler /* Advanced timer 1 trigger and commutation interrupts */ + .word ATIM1_CC_IRQHandler /* Advanced timer 1 capture/compare interrupt */ + .word ATIM1_UP_IRQHandler /* Advanced timer 1 update interrupt */ + .word ATIM2_BRK_IRQHandler /* Advanced timer 2 break interrupt */ + .word ATIM2_TRG_COM_IRQHandler /* advanced timer 2 trigger and commutation interrupts */ + .word ATIM2_CC_IRQHandler /* Advanced timer 2 capture/compare interrupt */ + .word ATIM2_UP_IRQHandler /* Advanced timer 2 update interrupt */ + .word ATIM3_BRK_IRQHandler /* Advanced timer 3 break interrupt */ + .word ATIM3_TRG_COM_IRQHandler /* Advanced timer 3 trigger and commutation interrupts */ + .word ATIM3_CC_IRQHandler /* Advanced timer 3 capture/compare interrupt */ + .word ATIM3_UP_IRQHandler /* Advanced timer 3 update interrupt */ + .word ATIM4_BRK_IRQHandler /* Advanced timer 4 break interrupt */ + .word ATIM4_TRG_COM_IRQHandler /* Advanced timer 4 trigger and commutation interrupts */ + .word ATIM4_CC_IRQHandler /* Advanced timer 4 capture/compare interrupt */ + .word ATIM4_UP_IRQHandler /* Advanced timer 4 update interrupt */ + .word GTIMA1_IRQHandler /* General timer A1 global interrupt */ + .word GTIMA2_IRQHandler /* General timer A2 global interrupt */ + .word GTIMA3_IRQHandler /* General timer A3 global interrupt */ + .word GTIMA4_IRQHandler /* General timer A4 global interrupt */ + .word GTIMA5_IRQHandler /* General timer A5 global interrupt */ + .word GTIMA6_IRQHandler /* General timer A6 global interrupt */ + .word GTIMA7_IRQHandler /* General timer A7 global interrupt */ + .word GTIMB1_IRQHandler /* General timer B1 global interrupt */ + .word GTIMB2_IRQHandler /* General timer B2 global interrupt */ + .word GTIMB3_IRQHandler /* General timer B3 global interrupt */ + .word BTIM1_IRQHandler /* Base timer 1 global interrupt */ + .word BTIM2_IRQHandler /* Base timer 2 global interrupt */ + .word BTIM3_IRQHandler /* Base timer 3 global interrupt */ + .word BTIM4_IRQHandler /* Base timer 4 global interrupt */ + .word LPTIM1_WKUP_IRQHandler /* LPTIM1 wakeup interrupt */ + .word LPTIM2_WKUP_IRQHandler /* LPTIM2 wakeup interrupt */ + .word LPTIM3_WKUP_IRQHandler /* LPTIM3 wakeup interrupt */ + .word LPTIM4_WKUP_IRQHandler /* LPTIM4 wakeup interrupt */ + .word DSMU_FLT0_IRQHandler /* DSMU Filter interrupt 0 */ + .word DSMU_FLT1_IRQHandler /* DSMU Filter interrupt 1 */ + .word DSMU_FLT2_IRQHandler /* DSMU Filter interrupt 2 */ + .word DSMU_FLT3_IRQHandler /* DSMU Filter interrupt 3 */ + .word FMAC_IRQHandler /* FMAC global interrupt */ + .word CORDIC_IRQHandler /* Cordic global interrupt */ + .word DMAMUX1_IRQHandler /* DMAMUX1 interrupt */ + .word MMU_IRQHandler /* MMU interrupt */ + /* need check to user manual of exti chapter */ + +/** +\* Provide weak aliases for each Exception handler to the Default_Handler. +\* As they are weak aliases, any function with the same name will override +\* this definition. +**/ + + .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 WWDG2_IRQHandler + .thumb_set WWDG2_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak RTC_TAMPER_IRQHandler + .thumb_set RTC_TAMPER_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak DMA1_Channel0_IRQHandler + .thumb_set DMA1_Channel0_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 DMA2_Channel0_IRQHandler + .thumb_set DMA2_Channel0_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_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak DMA2_Channel6_IRQHandler + .thumb_set DMA2_Channel6_IRQHandler,Default_Handler + + .weak DMA2_Channel7_IRQHandler + .thumb_set DMA2_Channel7_IRQHandler,Default_Handler + + .weak DMA3_Channel0_IRQHandler + .thumb_set DMA3_Channel0_IRQHandler,Default_Handler + + .weak DMA3_Channel1_IRQHandler + .thumb_set DMA3_Channel1_IRQHandler,Default_Handler + + .weak DMA3_Channel2_IRQHandler + .thumb_set DMA3_Channel2_IRQHandler,Default_Handler + + .weak DMA3_Channel3_IRQHandler + .thumb_set DMA3_Channel3_IRQHandler,Default_Handler + + .weak DMA3_Channel4_IRQHandler + .thumb_set DMA3_Channel4_IRQHandler,Default_Handler + + .weak DMA3_Channel5_IRQHandler + .thumb_set DMA3_Channel5_IRQHandler,Default_Handler + + .weak DMA3_Channel6_IRQHandler + .thumb_set DMA3_Channel6_IRQHandler,Default_Handler + + .weak DMA3_Channel7_IRQHandler + .thumb_set DMA3_Channel7_IRQHandler,Default_Handler + + .weak MDMA_Channel0_IRQHandler + .thumb_set MDMA_Channel0_IRQHandler,Default_Handler + + .weak MDMA_Channel1_IRQHandler + .thumb_set MDMA_Channel1_IRQHandler,Default_Handler + + .weak MDMA_Channel2_IRQHandler + .thumb_set MDMA_Channel2_IRQHandler,Default_Handler + + .weak MDMA_Channel3_IRQHandler + .thumb_set MDMA_Channel3_IRQHandler,Default_Handler + + .weak MDMA_Channel4_IRQHandler + .thumb_set MDMA_Channel4_IRQHandler,Default_Handler + + .weak MDMA_Channel5_IRQHandler + .thumb_set MDMA_Channel5_IRQHandler,Default_Handler + + .weak MDMA_Channel6_IRQHandler + .thumb_set MDMA_Channel6_IRQHandler,Default_Handler + + .weak MDMA_Channel7_IRQHandler + .thumb_set MDMA_Channel7_IRQHandler,Default_Handler + + .weak MDMA_Channel8_IRQHandler + .thumb_set MDMA_Channel8_IRQHandler,Default_Handler + + .weak MDMA_Channel9_IRQHandler + .thumb_set MDMA_Channel9_IRQHandler,Default_Handler + + .weak MDMA_Channel10_IRQHandler + .thumb_set MDMA_Channel10_IRQHandler,Default_Handler + + .weak MDMA_Channel11_IRQHandler + .thumb_set MDMA_Channel11_IRQHandler,Default_Handler + + .weak MDMA_Channel12_IRQHandler + .thumb_set MDMA_Channel12_IRQHandler,Default_Handler + + .weak MDMA_Channel13_IRQHandler + .thumb_set MDMA_Channel13_IRQHandler,Default_Handler + + .weak MDMA_Channel14_IRQHandler + .thumb_set MDMA_Channel14_IRQHandler,Default_Handler + + .weak MDMA_Channel15_IRQHandler + .thumb_set MDMA_Channel15_IRQHandler,Default_Handler + + .weak SDPU_IRQHandler + .thumb_set SDPU_IRQHandler,Default_Handler + + .weak AHB_ICACHE_IRQHandler + .thumb_set AHB_ICACHE_IRQHandler,Default_Handler + + .weak AHB_DCACHE_IRQHandler + .thumb_set AHB_DCACHE_IRQHandler,Default_Handler + + .weak FPU_CPU2_IRQHandler + .thumb_set FPU_CPU2_IRQHandler,Default_Handler + + .weak ECCMON_IRQHandler + .thumb_set ECCMON_IRQHandler,Default_Handler + + .weak RTC_ALARM_IRQHandler + .thumb_set RTC_ALARM_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 I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak I2C4_EV_IRQHandler + .thumb_set I2C4_EV_IRQHandler,Default_Handler + + .weak I2C4_ER_IRQHandler + .thumb_set I2C4_ER_IRQHandler,Default_Handler + + .weak I2C5_EV_IRQHandler + .thumb_set I2C5_EV_IRQHandler,Default_Handler + + .weak I2C5_ER_IRQHandler + .thumb_set I2C5_ER_IRQHandler,Default_Handler + + .weak I2C6_EV_IRQHandler + .thumb_set I2C6_EV_IRQHandler,Default_Handler + + .weak I2C6_ER_IRQHandler + .thumb_set I2C6_ER_IRQHandler,Default_Handler + + .weak I2C7_EV_IRQHandler + .thumb_set I2C7_EV_IRQHandler,Default_Handler + + .weak I2C7_ER_IRQHandler + .thumb_set I2C7_ER_IRQHandler,Default_Handler + + .weak I2C8_EV_IRQHandler + .thumb_set I2C8_EV_IRQHandler,Default_Handler + + .weak I2C8_ER_IRQHandler + .thumb_set I2C8_ER_IRQHandler,Default_Handler + + .weak I2C9_EV_IRQHandler + .thumb_set I2C9_EV_IRQHandler,Default_Handler + + .weak I2C9_ER_IRQHandler + .thumb_set I2C9_ER_IRQHandler,Default_Handler + + .weak I2C10_EV_IRQHandler + .thumb_set I2C10_EV_IRQHandler,Default_Handler + + .weak I2C10_ER_IRQHandler + .thumb_set I2C10_ER_IRQHandler,Default_Handler + + .weak I2S1_IRQHandler + .thumb_set I2S1_IRQHandler,Default_Handler + + .weak I2S2_IRQHandler + .thumb_set I2S2_IRQHandler,Default_Handler + + .weak I2S3_IRQHandler + .thumb_set I2S3_IRQHandler,Default_Handler + + .weak I2S4_IRQHandler + .thumb_set I2S4_IRQHandler,Default_Handler + + .weak xSPI1_IRQHandler + .thumb_set xSPI1_IRQHandler,Default_Handler + + .weak xSPI2_IRQHandler + .thumb_set xSPI2_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak SPI4_IRQHandler + .thumb_set SPI4_IRQHandler,Default_Handler + + .weak SPI5_IRQHandler + .thumb_set SPI5_IRQHandler,Default_Handler + + .weak SPI6_IRQHandler + .thumb_set SPI6_IRQHandler,Default_Handler + + .weak SPI7_IRQHandler + .thumb_set SPI7_IRQHandler,Default_Handler + + .weak LCD_EV_IRQHandler + .thumb_set LCD_EV_IRQHandler,Default_Handler + + .weak LCD_ER_IRQHandler + .thumb_set LCD_ER_IRQHandler,Default_Handler + + .weak DVP1_IRQHandler + .thumb_set DVP1_IRQHandler,Default_Handler + + .weak DVP2_IRQHandler + .thumb_set DVP2_IRQHandler,Default_Handler + + .weak DMAMUX2_IRQHandler + .thumb_set DMAMUX2_IRQHandler,Default_Handler + + .weak USB1_HS_EPx_OUT_IRQHandler + .thumb_set USB1_HS_EPx_OUT_IRQHandler,Default_Handler + + .weak USB1_HS_EPx_IN_IRQHandler + .thumb_set USB1_HS_EPx_IN_IRQHandler,Default_Handler + + .weak USB1_HS_WKUP_IRQHandler + .thumb_set USB1_HS_WKUP_IRQHandler,Default_Handler + + .weak USB1_HS_IRQHandler + .thumb_set USB1_HS_IRQHandler,Default_Handler + + .weak USB2_HS_EPx_OUT_IRQHandler + .thumb_set USB2_HS_EPx_OUT_IRQHandler,Default_Handler + + .weak USB2_HS_EPx_IN_IRQHandler + .thumb_set USB2_HS_EPx_IN_IRQHandler,Default_Handler + + .weak USB2_HS_WKUP_IRQHandler + .thumb_set USB2_HS_WKUP_IRQHandler,Default_Handler + + .weak USB2_HS_IRQHandler + .thumb_set USB2_HS_IRQHandler,Default_Handler + + .weak ETH1_IRQHandler + .thumb_set ETH1_IRQHandler,Default_Handler + + .weak ETH1_PMT_LPI_IRQHandler + .thumb_set ETH1_PMT_LPI_IRQHandler,Default_Handler + + .weak ETH2_IRQHandler + .thumb_set ETH2_IRQHandler,Default_Handler + + .weak ETH2_PMT_LPI_IRQHandler + .thumb_set ETH2_PMT_LPI_IRQHandler,Default_Handler + + .weak FDCAN1_INT0_IRQHandler + .thumb_set FDCAN1_INT0_IRQHandler,Default_Handler + + .weak FDCAN2_INT0_IRQHandler + .thumb_set FDCAN2_INT0_IRQHandler,Default_Handler + + .weak FDCAN3_INT0_IRQHandler + .thumb_set FDCAN3_INT0_IRQHandler,Default_Handler + + .weak FDCAN4_INT0_IRQHandler + .thumb_set FDCAN4_INT0_IRQHandler,Default_Handler + + .weak FDCAN1_INT1_IRQHandler + .thumb_set FDCAN1_INT1_IRQHandler,Default_Handler + + .weak FDCAN2_INT1_IRQHandler + .thumb_set FDCAN2_INT1_IRQHandler,Default_Handler + + .weak FDCAN3_INT1_IRQHandler + .thumb_set FDCAN3_INT1_IRQHandler,Default_Handler + + .weak FDCAN4_INT1_IRQHandler + .thumb_set FDCAN4_INT1_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 USART4_IRQHandler + .thumb_set USART4_IRQHandler,Default_Handler + + .weak USART5_IRQHandler + .thumb_set USART5_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak USART7_IRQHandler + .thumb_set USART7_IRQHandler,Default_Handler + + .weak USART8_IRQHandler + .thumb_set USART8_IRQHandler,Default_Handler + + .weak UART9_IRQHandler + .thumb_set UART9_IRQHandler,Default_Handler + + .weak UART10_IRQHandler + .thumb_set UART10_IRQHandler,Default_Handler + + .weak UART11_IRQHandler + .thumb_set UART11_IRQHandler,Default_Handler + + .weak UART12_IRQHandler + .thumb_set UART12_IRQHandler,Default_Handler + + .weak UART13_IRQHandler + .thumb_set UART13_IRQHandler,Default_Handler + + .weak UART14_IRQHandler + .thumb_set UART14_IRQHandler,Default_Handler + + .weak UART15_IRQHandler + .thumb_set UART15_IRQHandler,Default_Handler + + .weak LPUART1_IRQHandler + .thumb_set LPUART1_IRQHandler,Default_Handler + + .weak LPUART2_IRQHandler + .thumb_set LPUART2_IRQHandler,Default_Handler + + .weak GPU_IRQHandler + .thumb_set GPU_IRQHandler,Default_Handler + + .weak SDMMC1_IRQHandler + .thumb_set SDMMC1_IRQHandler,Default_Handler + + .weak SDMMC2_IRQHandler + .thumb_set SDMMC2_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak ADC2_IRQHandler + .thumb_set ADC2_IRQHandler,Default_Handler + + .weak ADC3_IRQHandler + .thumb_set ADC3_IRQHandler,Default_Handler + + .weak COMP1_2_IRQHandler + .thumb_set COMP1_2_IRQHandler,Default_Handler + + .weak COMP3_4_IRQHandler + .thumb_set COMP3_4_IRQHandler,Default_Handler + + .weak SHRTIM1_INT1_IRQHandler + .thumb_set SHRTIM1_INT1_IRQHandler,Default_Handler + + .weak SHRTIM1_INT2_IRQHandler + .thumb_set SHRTIM1_INT2_IRQHandler,Default_Handler + + .weak SHRTIM1_INT3_IRQHandler + .thumb_set SHRTIM1_INT3_IRQHandler,Default_Handler + + .weak SHRTIM1_INT4_IRQHandler + .thumb_set SHRTIM1_INT4_IRQHandler,Default_Handler + + .weak SHRTIM1_INT5_IRQHandler + .thumb_set SHRTIM1_INT5_IRQHandler,Default_Handler + + .weak SHRTIM1_INT6_IRQHandler + .thumb_set SHRTIM1_INT6_IRQHandler,Default_Handler + + .weak SHRTIM1_INT7_IRQHandler + .thumb_set SHRTIM1_INT7_IRQHandler,Default_Handler + + .weak SHRTIM1_INT8_IRQHandler + .thumb_set SHRTIM1_INT8_IRQHandler,Default_Handler + + .weak SHRTIM2_INT1_IRQHandler + .thumb_set SHRTIM2_INT1_IRQHandler,Default_Handler + + .weak SHRTIM2_INT2_IRQHandler + .thumb_set SHRTIM2_INT2_IRQHandler,Default_Handler + + .weak SHRTIM2_INT3_IRQHandler + .thumb_set SHRTIM2_INT3_IRQHandler,Default_Handler + + .weak SHRTIM2_INT4_IRQHandler + .thumb_set SHRTIM2_INT4_IRQHandler,Default_Handler + + .weak SHRTIM2_INT5_IRQHandler + .thumb_set SHRTIM2_INT5_IRQHandler,Default_Handler + + .weak SHRTIM2_INT6_IRQHandler + .thumb_set SHRTIM2_INT6_IRQHandler,Default_Handler + + .weak SHRTIM2_INT7_IRQHandler + .thumb_set SHRTIM2_INT7_IRQHandler,Default_Handler + + .weak SHRTIM2_INT8_IRQHandler + .thumb_set SHRTIM2_INT8_IRQHandler,Default_Handler + + .weak FDCAN5_INT0_IRQHandler + .thumb_set FDCAN5_INT0_IRQHandler,Default_Handler + + .weak FDCAN6_INT0_IRQHandler + .thumb_set FDCAN6_INT0_IRQHandler,Default_Handler + + .weak FDCAN7_INT0_IRQHandler + .thumb_set FDCAN7_INT0_IRQHandler,Default_Handler + + .weak FDCAN8_INT0_IRQHandler + .thumb_set FDCAN8_INT0_IRQHandler,Default_Handler + + .weak FDCAN5_INT1_IRQHandler + .thumb_set FDCAN5_INT1_IRQHandler,Default_Handler + + .weak FDCAN6_INT1_IRQHandler + .thumb_set FDCAN6_INT1_IRQHandler,Default_Handler + + .weak FDCAN7_INT1_IRQHandler + .thumb_set FDCAN7_INT1_IRQHandler,Default_Handler + + .weak FDCAN8_INT1_IRQHandler + .thumb_set FDCAN8_INT1_IRQHandler,Default_Handler + + .weak DSI_IRQHandler + .thumb_set DSI_IRQHandler,Default_Handler + + .weak AHB_CACHE_PARMON_IRQHandler + .thumb_set AHB_CACHE_PARMON_IRQHandler,Default_Handler + + .weak LPTIM5_WKUP_IRQHandler + .thumb_set LPTIM5_WKUP_IRQHandler,Default_Handler + + .weak JPEG_SGDMA_H2P_IRQHandler + .thumb_set JPEG_SGDMA_H2P_IRQHandler,Default_Handler + + .weak JPEG_SGDMA_P2H_IRQHandler + .thumb_set JPEG_SGDMA_P2H_IRQHandler,Default_Handler + + .weak WAKEUP_IO_IRQHandler + .thumb_set WAKEUP_IO_IRQHandler,Default_Handler + + .weak SEMA4_INT2_IRQHandler + .thumb_set SEMA4_INT2_IRQHandler,Default_Handler + + .weak WWDG1_RST_IRQHandler + .thumb_set WWDG1_RST_IRQHandler,Default_Handler + + .weak OTPC_IRQHandler + .thumb_set OTPC_IRQHandler,Default_Handler + + .weak FEMC_IRQHandler + .thumb_set FEMC_IRQHandler,Default_Handler + + .weak DCMUB_IRQHandler + .thumb_set DCMUB_IRQHandler,Default_Handler + + .weak DAC1_IRQHandler + .thumb_set DAC1_IRQHandler,Default_Handler + + .weak DAC2_IRQHandler + .thumb_set DAC2_IRQHandler,Default_Handler + + .weak MDMA_AHBS_ER_IRQHandler + .thumb_set MDMA_AHBS_ER_IRQHandler,Default_Handler + + .weak CM7_CATCH_READ_ER_IRQHandler + .thumb_set CM7_CATCH_READ_ER_IRQHandler,Default_Handler + + .weak DAC3_IRQHandler + .thumb_set DAC3_IRQHandler,Default_Handler + + .weak DAC4_IRQHandler + .thumb_set DAC4_IRQHandler,Default_Handler + + .weak EMC_IRQHandler + .thumb_set EMC_IRQHandler,Default_Handler + + .weak DAC5_IRQHandler + .thumb_set DAC5_IRQHandler,Default_Handler + + .weak DAC6_IRQHandler + .thumb_set DAC6_IRQHandler,Default_Handler + + .weak ESC_OPB_IRQHandler + .thumb_set ESC_OPB_IRQHandler,Default_Handler + + .weak ESC_SYNC0_IRQHandler + .thumb_set ESC_SYNC0_IRQHandler,Default_Handler + + .weak ESC_SYNC1_IRQHandler + .thumb_set ESC_SYNC1_IRQHandler,Default_Handler + + .weak ESC_WRP_IRQHandler + .thumb_set ESC_WRP_IRQHandler,Default_Handler + + .weak ATIM1_BRK_IRQHandler + .thumb_set ATIM1_BRK_IRQHandler,Default_Handler + + .weak ATIM1_TRG_COM_IRQHandler + .thumb_set ATIM1_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM1_CC_IRQHandler + .thumb_set ATIM1_CC_IRQHandler,Default_Handler + + .weak ATIM1_UP_IRQHandler + .thumb_set ATIM1_UP_IRQHandler,Default_Handler + + .weak ATIM2_BRK_IRQHandler + .thumb_set ATIM2_BRK_IRQHandler,Default_Handler + + .weak ATIM2_TRG_COM_IRQHandler + .thumb_set ATIM2_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM2_CC_IRQHandler + .thumb_set ATIM2_CC_IRQHandler,Default_Handler + + .weak ATIM2_UP_IRQHandler + .thumb_set ATIM2_UP_IRQHandler,Default_Handler + + .weak ATIM3_BRK_IRQHandler + .thumb_set ATIM3_BRK_IRQHandler,Default_Handler + + .weak ATIM3_TRG_COM_IRQHandler + .thumb_set ATIM3_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM3_CC_IRQHandler + .thumb_set ATIM3_CC_IRQHandler,Default_Handler + + .weak ATIM3_UP_IRQHandler + .thumb_set ATIM3_UP_IRQHandler,Default_Handler + + .weak ATIM4_BRK_IRQHandler + .thumb_set ATIM4_BRK_IRQHandler,Default_Handler + + .weak ATIM4_TRG_COM_IRQHandler + .thumb_set ATIM4_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM4_CC_IRQHandler + .thumb_set ATIM4_CC_IRQHandler,Default_Handler + + .weak ATIM4_UP_IRQHandler + .thumb_set ATIM4_UP_IRQHandler,Default_Handler + + .weak GTIMA1_IRQHandler + .thumb_set GTIMA1_IRQHandler,Default_Handler + + .weak GTIMA2_IRQHandler + .thumb_set GTIMA2_IRQHandler,Default_Handler + + .weak GTIMA3_IRQHandler + .thumb_set GTIMA3_IRQHandler,Default_Handler + + .weak GTIMA4_IRQHandler + .thumb_set GTIMA4_IRQHandler,Default_Handler + + .weak GTIMA5_IRQHandler + .thumb_set GTIMA5_IRQHandler,Default_Handler + + .weak GTIMA6_IRQHandler + .thumb_set GTIMA6_IRQHandler,Default_Handler + + .weak GTIMA7_IRQHandler + .thumb_set GTIMA7_IRQHandler,Default_Handler + + .weak GTIMB1_IRQHandler + .thumb_set GTIMB1_IRQHandler,Default_Handler + + .weak GTIMB2_IRQHandler + .thumb_set GTIMB2_IRQHandler,Default_Handler + + .weak GTIMB3_IRQHandler + .thumb_set GTIMB3_IRQHandler,Default_Handler + + .weak BTIM1_IRQHandler + .thumb_set BTIM1_IRQHandler,Default_Handler + + .weak BTIM2_IRQHandler + .thumb_set BTIM2_IRQHandler,Default_Handler + + .weak BTIM3_IRQHandler + .thumb_set BTIM3_IRQHandler,Default_Handler + + .weak BTIM4_IRQHandler + .thumb_set BTIM4_IRQHandler,Default_Handler + + .weak LPTIM1_WKUP_IRQHandler + .thumb_set LPTIM1_WKUP_IRQHandler,Default_Handler + + .weak LPTIM2_WKUP_IRQHandler + .thumb_set LPTIM2_WKUP_IRQHandler,Default_Handler + + .weak LPTIM3_WKUP_IRQHandler + .thumb_set LPTIM3_WKUP_IRQHandler,Default_Handler + + .weak LPTIM4_WKUP_IRQHandler + .thumb_set LPTIM4_WKUP_IRQHandler,Default_Handler + + .weak DSMU_FLT0_IRQHandler + .thumb_set DSMU_FLT0_IRQHandler,Default_Handler + + .weak DSMU_FLT1_IRQHandler + .thumb_set DSMU_FLT1_IRQHandler,Default_Handler + + .weak DSMU_FLT2_IRQHandler + .thumb_set DSMU_FLT2_IRQHandler,Default_Handler + + .weak DSMU_FLT3_IRQHandler + .thumb_set DSMU_FLT3_IRQHandler,Default_Handler + + .weak FMAC_IRQHandler + .thumb_set FMAC_IRQHandler,Default_Handler + + .weak CORDIC_IRQHandler + .thumb_set CORDIC_IRQHandler,Default_Handler + + .weak DMAMUX1_IRQHandler + .thumb_set DMAMUX1_IRQHandler,Default_Handler + + .weak MMU_IRQHandler + .thumb_set MMU_IRQHandler,Default_Handler diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7.s new file mode 100644 index 0000000000..fc64b849b0 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7.s @@ -0,0 +1,892 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +Stack_Size EQU 0x00002000 + + 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 0x00002000 + + 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 N32SysTick_Handler ; N32SysTick Handler + + ; External Interrupts + DCD WWDG1_IRQHandler ; Window1 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD FPU_CPU1_IRQHandler ; FPU_CM7 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD DSI_IRQHandler ; MIPI DSI Interrupt through EXTI line 87 + DCD 0 ; + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD SEMA4_INT1_IRQHandler ; SEMA4 interrupt1 + DCD 0 ; + DCD WWDG2_RST_IRQHandler ; WWDG2 reset interrupt through EXTI line 82 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUB_IRQHandler ; DCMUB interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_IRQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt + DCD SysTick_Handler ; SysTick Handler + +__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 +N32SysTick_Handler PROC + EXPORT N32SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG1_IRQHandler [WEAK] + EXPORT PVD_IRQHandler [WEAK] + EXPORT RTC_TAMPER_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT DMA1_Channel0_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 DMA2_Channel0_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT DMA2_Channel6_IRQHandler [WEAK] + EXPORT DMA2_Channel7_IRQHandler [WEAK] + EXPORT DMA3_Channel0_IRQHandler [WEAK] + EXPORT DMA3_Channel1_IRQHandler [WEAK] + EXPORT DMA3_Channel2_IRQHandler [WEAK] + EXPORT DMA3_Channel3_IRQHandler [WEAK] + EXPORT DMA3_Channel4_IRQHandler [WEAK] + EXPORT DMA3_Channel5_IRQHandler [WEAK] + EXPORT DMA3_Channel6_IRQHandler [WEAK] + EXPORT DMA3_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel0_IRQHandler [WEAK] + EXPORT MDMA_Channel1_IRQHandler [WEAK] + EXPORT MDMA_Channel2_IRQHandler [WEAK] + EXPORT MDMA_Channel3_IRQHandler [WEAK] + EXPORT MDMA_Channel4_IRQHandler [WEAK] + EXPORT MDMA_Channel5_IRQHandler [WEAK] + EXPORT MDMA_Channel6_IRQHandler [WEAK] + EXPORT MDMA_Channel7_IRQHandler [WEAK] + EXPORT MDMA_Channel8_IRQHandler [WEAK] + EXPORT MDMA_Channel9_IRQHandler [WEAK] + EXPORT MDMA_Channel10_IRQHandler [WEAK] + EXPORT MDMA_Channel11_IRQHandler [WEAK] + EXPORT MDMA_Channel12_IRQHandler [WEAK] + EXPORT MDMA_Channel13_IRQHandler [WEAK] + EXPORT MDMA_Channel14_IRQHandler [WEAK] + EXPORT MDMA_Channel15_IRQHandler [WEAK] + EXPORT SDPU_IRQHandler [WEAK] + EXPORT FPU_CPU1_IRQHandler [WEAK] + EXPORT ECCMON_IRQHandler [WEAK] + EXPORT RTC_ALARM_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT I2C3_EV_IRQHandler [WEAK] + EXPORT I2C3_ER_IRQHandler [WEAK] + EXPORT I2C4_EV_IRQHandler [WEAK] + EXPORT I2C4_ER_IRQHandler [WEAK] + EXPORT I2C5_EV_IRQHandler [WEAK] + EXPORT I2C5_ER_IRQHandler [WEAK] + EXPORT I2C6_EV_IRQHandler [WEAK] + EXPORT I2C6_ER_IRQHandler [WEAK] + EXPORT I2C7_EV_IRQHandler [WEAK] + EXPORT I2C7_ER_IRQHandler [WEAK] + EXPORT I2C8_EV_IRQHandler [WEAK] + EXPORT I2C8_ER_IRQHandler [WEAK] + EXPORT I2C9_EV_IRQHandler [WEAK] + EXPORT I2C9_ER_IRQHandler [WEAK] + EXPORT I2C10_EV_IRQHandler [WEAK] + EXPORT I2C10_ER_IRQHandler [WEAK] + EXPORT I2S1_IRQHandler [WEAK] + EXPORT I2S2_IRQHandler [WEAK] + EXPORT I2S3_IRQHandler [WEAK] + EXPORT I2S4_IRQHandler [WEAK] + EXPORT xSPI1_IRQHandler [WEAK] + EXPORT xSPI2_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT SPI4_IRQHandler [WEAK] + EXPORT SPI5_IRQHandler [WEAK] + EXPORT SPI6_IRQHandler [WEAK] + EXPORT SPI7_IRQHandler [WEAK] + EXPORT LCD_EV_IRQHandler [WEAK] + EXPORT LCD_ER_IRQHandler [WEAK] + EXPORT DVP1_IRQHandler [WEAK] + EXPORT DVP2_IRQHandler [WEAK] + EXPORT DMAMUX2_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB1_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB1_HS_WKUP_IRQHandler [WEAK] + EXPORT USB1_HS_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_OUT_IRQHandler [WEAK] + EXPORT USB2_HS_EPx_IN_IRQHandler [WEAK] + EXPORT USB2_HS_WKUP_IRQHandler [WEAK] + EXPORT USB2_HS_IRQHandler [WEAK] + EXPORT ETH1_IRQHandler [WEAK] + EXPORT ETH1_PMT_LPI_IRQHandler [WEAK] + EXPORT ETH2_IRQHandler [WEAK] + EXPORT ETH2_PMT_LPI_IRQHandler [WEAK] + EXPORT FDCAN1_INT0_IRQHandler [WEAK] + EXPORT FDCAN2_INT0_IRQHandler [WEAK] + EXPORT FDCAN3_INT0_IRQHandler [WEAK] + EXPORT FDCAN4_INT0_IRQHandler [WEAK] + EXPORT FDCAN1_INT1_IRQHandler [WEAK] + EXPORT FDCAN2_INT1_IRQHandler [WEAK] + EXPORT FDCAN3_INT1_IRQHandler [WEAK] + EXPORT FDCAN4_INT1_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT USART4_IRQHandler [WEAK] + EXPORT USART5_IRQHandler [WEAK] + EXPORT USART6_IRQHandler [WEAK] + EXPORT USART7_IRQHandler [WEAK] + EXPORT USART8_IRQHandler [WEAK] + EXPORT UART9_IRQHandler [WEAK] + EXPORT UART10_IRQHandler [WEAK] + EXPORT UART11_IRQHandler [WEAK] + EXPORT UART12_IRQHandler [WEAK] + EXPORT UART13_IRQHandler [WEAK] + EXPORT UART14_IRQHandler [WEAK] + EXPORT UART15_IRQHandler [WEAK] + EXPORT LPUART1_IRQHandler [WEAK] + EXPORT LPUART2_IRQHandler [WEAK] + EXPORT GPU_IRQHandler [WEAK] + EXPORT SDMMC1_IRQHandler [WEAK] + EXPORT SDMMC2_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT ADC2_IRQHandler [WEAK] + EXPORT ADC3_IRQHandler [WEAK] + EXPORT COMP1_2_IRQHandler [WEAK] + EXPORT COMP3_4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT1_IRQHandler [WEAK] + EXPORT SHRTIM1_INT2_IRQHandler [WEAK] + EXPORT SHRTIM1_INT3_IRQHandler [WEAK] + EXPORT SHRTIM1_INT4_IRQHandler [WEAK] + EXPORT SHRTIM1_INT5_IRQHandler [WEAK] + EXPORT SHRTIM1_INT6_IRQHandler [WEAK] + EXPORT SHRTIM1_INT7_IRQHandler [WEAK] + EXPORT SHRTIM1_INT8_IRQHandler [WEAK] + EXPORT SHRTIM2_INT1_IRQHandler [WEAK] + EXPORT SHRTIM2_INT2_IRQHandler [WEAK] + EXPORT SHRTIM2_INT3_IRQHandler [WEAK] + EXPORT SHRTIM2_INT4_IRQHandler [WEAK] + EXPORT SHRTIM2_INT5_IRQHandler [WEAK] + EXPORT SHRTIM2_INT6_IRQHandler [WEAK] + EXPORT SHRTIM2_INT7_IRQHandler [WEAK] + EXPORT SHRTIM2_INT8_IRQHandler [WEAK] + EXPORT FDCAN5_INT0_IRQHandler [WEAK] + EXPORT FDCAN6_INT0_IRQHandler [WEAK] + EXPORT FDCAN7_INT0_IRQHandler [WEAK] + EXPORT FDCAN8_INT0_IRQHandler [WEAK] + EXPORT FDCAN5_INT1_IRQHandler [WEAK] + EXPORT FDCAN6_INT1_IRQHandler [WEAK] + EXPORT FDCAN7_INT1_IRQHandler [WEAK] + EXPORT FDCAN8_INT1_IRQHandler [WEAK] + EXPORT DSI_IRQHandler [WEAK] + EXPORT LPTIM5_WKUP_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_H2P_IRQHandler [WEAK] + EXPORT JPEG_SGDMA_P2H_IRQHandler [WEAK] + EXPORT WAKEUP_IO_IRQHandler [WEAK] + EXPORT SEMA4_INT1_IRQHandler [WEAK] + EXPORT WWDG2_RST_IRQHandler [WEAK] + EXPORT OTPC_IRQHandler [WEAK] + EXPORT FEMC_IRQHandler [WEAK] + EXPORT DCMUB_IRQHandler [WEAK] + EXPORT DAC1_IRQHandler [WEAK] + EXPORT DAC2_IRQHandler [WEAK] + EXPORT MDMA_AHBS_ER_IRQHandler [WEAK] + EXPORT CM7_CATCH_READ_ER_IRQHandler [WEAK] + EXPORT DAC3_IRQHandler [WEAK] + EXPORT DAC4_IRQHandler [WEAK] + EXPORT EMC_IRQHandler [WEAK] + EXPORT DAC5_IRQHandler [WEAK] + EXPORT DAC6_IRQHandler [WEAK] + EXPORT ESC_OPB_IRQHandler [WEAK] + EXPORT ESC_SYNC0_IRQHandler [WEAK] + EXPORT ESC_SYNC1_IRQHandler [WEAK] + EXPORT ESC_WRP_IRQHandler [WEAK] + EXPORT ATIM1_BRK_IRQHandler [WEAK] + EXPORT ATIM1_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM1_CC_IRQHandler [WEAK] + EXPORT ATIM1_UP_IRQHandler [WEAK] + EXPORT ATIM2_BRK_IRQHandler [WEAK] + EXPORT ATIM2_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM2_CC_IRQHandler [WEAK] + EXPORT ATIM2_UP_IRQHandler [WEAK] + EXPORT ATIM3_BRK_IRQHandler [WEAK] + EXPORT ATIM3_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM3_CC_IRQHandler [WEAK] + EXPORT ATIM3_UP_IRQHandler [WEAK] + EXPORT ATIM4_BRK_IRQHandler [WEAK] + EXPORT ATIM4_TRG_COM_IRQHandler [WEAK] + EXPORT ATIM4_CC_IRQHandler [WEAK] + EXPORT ATIM4_UP_IRQHandler [WEAK] + EXPORT GTIMA1_IRQHandler [WEAK] + EXPORT GTIMA2_IRQHandler [WEAK] + EXPORT GTIMA3_IRQHandler [WEAK] + EXPORT GTIMA4_IRQHandler [WEAK] + EXPORT GTIMA5_IRQHandler [WEAK] + EXPORT GTIMA6_IRQHandler [WEAK] + EXPORT GTIMA7_IRQHandler [WEAK] + EXPORT GTIMB1_IRQHandler [WEAK] + EXPORT GTIMB2_IRQHandler [WEAK] + EXPORT GTIMB3_IRQHandler [WEAK] + EXPORT BTIM1_IRQHandler [WEAK] + EXPORT BTIM2_IRQHandler [WEAK] + EXPORT BTIM3_IRQHandler [WEAK] + EXPORT BTIM4_IRQHandler [WEAK] + EXPORT LPTIM1_WKUP_IRQHandler [WEAK] + EXPORT LPTIM2_WKUP_IRQHandler [WEAK] + EXPORT LPTIM3_WKUP_IRQHandler [WEAK] + EXPORT LPTIM4_WKUP_IRQHandler [WEAK] + EXPORT DSMU_FLT0_IRQHandler [WEAK] + EXPORT DSMU_FLT1_IRQHandler [WEAK] + EXPORT DSMU_FLT2_IRQHandler [WEAK] + EXPORT DSMU_FLT3_IRQHandler [WEAK] + EXPORT FMAC_IRQHandler [WEAK] + EXPORT CORDIC_IRQHandler [WEAK] + EXPORT DMAMUX1_IRQHandler [WEAK] + EXPORT MMU_IRQHandler [WEAK] + EXPORT SysTick_Handler [WEAK] + +WWDG1_IRQHandler +PVD_IRQHandler +RTC_TAMPER_IRQHandler +RTC_WKUP_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +EXTI9_5_IRQHandler +EXTI15_10_IRQHandler +DMA1_Channel0_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +DMA2_Channel0_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +DMA2_Channel6_IRQHandler +DMA2_Channel7_IRQHandler +DMA3_Channel0_IRQHandler +DMA3_Channel1_IRQHandler +DMA3_Channel2_IRQHandler +DMA3_Channel3_IRQHandler +DMA3_Channel4_IRQHandler +DMA3_Channel5_IRQHandler +DMA3_Channel6_IRQHandler +DMA3_Channel7_IRQHandler +MDMA_Channel0_IRQHandler +MDMA_Channel1_IRQHandler +MDMA_Channel2_IRQHandler +MDMA_Channel3_IRQHandler +MDMA_Channel4_IRQHandler +MDMA_Channel5_IRQHandler +MDMA_Channel6_IRQHandler +MDMA_Channel7_IRQHandler +MDMA_Channel8_IRQHandler +MDMA_Channel9_IRQHandler +MDMA_Channel10_IRQHandler +MDMA_Channel11_IRQHandler +MDMA_Channel12_IRQHandler +MDMA_Channel13_IRQHandler +MDMA_Channel14_IRQHandler +MDMA_Channel15_IRQHandler +SDPU_IRQHandler +FPU_CPU1_IRQHandler +ECCMON_IRQHandler +RTC_ALARM_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +I2C3_EV_IRQHandler +I2C3_ER_IRQHandler +I2C4_EV_IRQHandler +I2C4_ER_IRQHandler +I2C5_EV_IRQHandler +I2C5_ER_IRQHandler +I2C6_EV_IRQHandler +I2C6_ER_IRQHandler +I2C7_EV_IRQHandler +I2C7_ER_IRQHandler +I2C8_EV_IRQHandler +I2C8_ER_IRQHandler +I2C9_EV_IRQHandler +I2C9_ER_IRQHandler +I2C10_EV_IRQHandler +I2C10_ER_IRQHandler +I2S1_IRQHandler +I2S2_IRQHandler +I2S3_IRQHandler +I2S4_IRQHandler +xSPI1_IRQHandler +xSPI2_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +SPI3_IRQHandler +SPI4_IRQHandler +SPI5_IRQHandler +SPI6_IRQHandler +SPI7_IRQHandler +LCD_EV_IRQHandler +LCD_ER_IRQHandler +DVP1_IRQHandler +DVP2_IRQHandler +DMAMUX2_IRQHandler +USB1_HS_EPx_OUT_IRQHandler +USB1_HS_EPx_IN_IRQHandler +USB1_HS_WKUP_IRQHandler +USB1_HS_IRQHandler +USB2_HS_EPx_OUT_IRQHandler +USB2_HS_EPx_IN_IRQHandler +USB2_HS_WKUP_IRQHandler +USB2_HS_IRQHandler +ETH1_IRQHandler +ETH1_PMT_LPI_IRQHandler +ETH2_IRQHandler +ETH2_PMT_LPI_IRQHandler +FDCAN1_INT0_IRQHandler +FDCAN2_INT0_IRQHandler +FDCAN3_INT0_IRQHandler +FDCAN4_INT0_IRQHandler +FDCAN1_INT1_IRQHandler +FDCAN2_INT1_IRQHandler +FDCAN3_INT1_IRQHandler +FDCAN4_INT1_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +USART4_IRQHandler +USART5_IRQHandler +USART6_IRQHandler +USART7_IRQHandler +USART8_IRQHandler +UART9_IRQHandler +UART10_IRQHandler +UART11_IRQHandler +UART12_IRQHandler +UART13_IRQHandler +UART14_IRQHandler +UART15_IRQHandler +LPUART1_IRQHandler +LPUART2_IRQHandler +GPU_IRQHandler +SDMMC1_IRQHandler +SDMMC2_IRQHandler +ADC1_IRQHandler +ADC2_IRQHandler +ADC3_IRQHandler +COMP1_2_IRQHandler +COMP3_4_IRQHandler +SHRTIM1_INT1_IRQHandler +SHRTIM1_INT2_IRQHandler +SHRTIM1_INT3_IRQHandler +SHRTIM1_INT4_IRQHandler +SHRTIM1_INT5_IRQHandler +SHRTIM1_INT6_IRQHandler +SHRTIM1_INT7_IRQHandler +SHRTIM1_INT8_IRQHandler +SHRTIM2_INT1_IRQHandler +SHRTIM2_INT2_IRQHandler +SHRTIM2_INT3_IRQHandler +SHRTIM2_INT4_IRQHandler +SHRTIM2_INT5_IRQHandler +SHRTIM2_INT6_IRQHandler +SHRTIM2_INT7_IRQHandler +SHRTIM2_INT8_IRQHandler +FDCAN5_INT0_IRQHandler +FDCAN6_INT0_IRQHandler +FDCAN7_INT0_IRQHandler +FDCAN8_INT0_IRQHandler +FDCAN5_INT1_IRQHandler +FDCAN6_INT1_IRQHandler +FDCAN7_INT1_IRQHandler +FDCAN8_INT1_IRQHandler +DSI_IRQHandler +LPTIM5_WKUP_IRQHandler +JPEG_SGDMA_H2P_IRQHandler +JPEG_SGDMA_P2H_IRQHandler +WAKEUP_IO_IRQHandler +SEMA4_INT1_IRQHandler +WWDG2_RST_IRQHandler +OTPC_IRQHandler +FEMC_IRQHandler +DCMUB_IRQHandler +DAC1_IRQHandler +DAC2_IRQHandler +MDMA_AHBS_ER_IRQHandler +CM7_CATCH_READ_ER_IRQHandler +DAC3_IRQHandler +DAC4_IRQHandler +EMC_IRQHandler +DAC5_IRQHandler +DAC6_IRQHandler +ESC_OPB_IRQHandler +ESC_SYNC0_IRQHandler +ESC_SYNC1_IRQHandler +ESC_WRP_IRQHandler +ATIM1_BRK_IRQHandler +ATIM1_TRG_COM_IRQHandler +ATIM1_CC_IRQHandler +ATIM1_UP_IRQHandler +ATIM2_BRK_IRQHandler +ATIM2_TRG_COM_IRQHandler +ATIM2_CC_IRQHandler +ATIM2_UP_IRQHandler +ATIM3_BRK_IRQHandler +ATIM3_TRG_COM_IRQHandler +ATIM3_CC_IRQHandler +ATIM3_UP_IRQHandler +ATIM4_BRK_IRQHandler +ATIM4_TRG_COM_IRQHandler +ATIM4_CC_IRQHandler +ATIM4_UP_IRQHandler +GTIMA1_IRQHandler +GTIMA2_IRQHandler +GTIMA3_IRQHandler +GTIMA4_IRQHandler +GTIMA5_IRQHandler +GTIMA6_IRQHandler +GTIMA7_IRQHandler +GTIMB1_IRQHandler +GTIMB2_IRQHandler +GTIMB3_IRQHandler +BTIM1_IRQHandler +BTIM2_IRQHandler +BTIM3_IRQHandler +BTIM4_IRQHandler +LPTIM1_WKUP_IRQHandler +LPTIM2_WKUP_IRQHandler +LPTIM3_WKUP_IRQHandler +LPTIM4_WKUP_IRQHandler +DSMU_FLT0_IRQHandler +DSMU_FLT1_IRQHandler +DSMU_FLT2_IRQHandler +DSMU_FLT3_IRQHandler +FMAC_IRQHandler +CORDIC_IRQHandler +DMAMUX1_IRQHandler +MMU_IRQHandler +SysTick_Handler + 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 + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7_EWARM.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7_EWARM.s new file mode 100644 index 0000000000..38a38fa117 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7_EWARM.s @@ -0,0 +1,1535 @@ +; ********************************************************************************************************* +; Copyright (c) 2024, Nations Technologies Inc. +; +; All rights reserved. +; +; This software is the exclusive property of Nations Technologies Inc. (Hereinafter +; referred to as NATIONS). This software, and the product of NATIONS described herein +; (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties +; of the People's Republic of China and other applicable jurisdictions worldwide. +; +; NATIONS does not grant any license under its patents, copyrights, trademarks, or other +; intellectual property rights. Names and brands of third party may be mentioned or referred +; thereto (if any) for identification purposes only. +; +; NATIONS reserves the right to make changes, corrections, enhancements, modifications, and +; improvements to this software at any time without notice. Please contact NATIONS and obtain +; the latest version of this software before placing orders. + +; Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes +; no responsibility for the accuracy and reliability of this software. +; +; It is the responsibility of the user of this software to properly design, program, and test +; the functionality and safety of any application made of this information and any resulting product. +; In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or +; consequential damages arising in any way out of the use of this software or the Product. +; +; NATIONS Products are neither intended nor warranted for usage in systems or equipment, any +; malfunction or failure of which may cause loss of human life, bodily injury or severe property +; damage. Such applications are deemed, "Insecure Usage". +; +; All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS +; harmless from and against all claims, costs, damages, and other liabilities, arising from or related +; to any customer's Insecure Usage. + +; Any express or implied warranty with regard to this software or the Product, including,but not +; limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement +; are disclaimed to the fullest extent permitted by law. + +; Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe +; or otherwise distribute this software for any purposes, in whole or in part. +; +; NATIONS products and technologies shall not be used for or incorporated into any products or systems +; whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. +; User shall comply with any applicable export control laws and regulations promulgated and administered by +; the governments of any countries asserting jurisdiction over the parties or transactions. +; ************************************************************************************************************ + +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + + 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 + + __iar_init$$done: ; The vector table is not needed + ; until after copy initialization is done + + +__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 N32SysTick_Handler ; N32SysTick Handler + + + + ; External Interrupts + DCD WWDG1_IRQHandler ; Window1 Watchdog interrupt + DCD PVD_IRQHandler ; PVD through EXTI Line16 detection interrupt + DCD RTC_TAMPER_IRQHandler ; RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt + DCD RTC_WKUP_IRQHandler ; RTC Wakeup timer through EXTI line 19 interrupt + DCD RCC_IRQHandler ; RCC interrupt + DCD EXTI0_IRQHandler ; EXTI Line 0 interrupt + DCD EXTI1_IRQHandler ; EXTI Line 1 interrupt + DCD EXTI2_IRQHandler ; EXTI Line 2 interrupt + DCD EXTI3_IRQHandler ; EXTI Line 3 interrupt + DCD EXTI4_IRQHandler ; EXTI Line 4 interrupt + DCD EXTI9_5_IRQHandler ; EXTI Line[9:5] interrupt + DCD EXTI15_10_IRQHandler ; EXTI Line[15:10] interrupt + DCD DMA1_Channel0_IRQHandler ; DMA1 Channel 0 + 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 DMA2_Channel0_IRQHandler ; DMA2 Channel 0 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD DMA3_Channel0_IRQHandler ; DMA3 Channel 0 + DCD DMA3_Channel1_IRQHandler ; DMA3 Channel 1 + DCD DMA3_Channel2_IRQHandler ; DMA3 Channel 2 + DCD DMA3_Channel3_IRQHandler ; DMA3 Channel 3 + DCD DMA3_Channel4_IRQHandler ; DMA3 Channel 4 + DCD DMA3_Channel5_IRQHandler ; DMA3 Channel 5 + DCD DMA3_Channel6_IRQHandler ; DMA3 Channel 6 + DCD DMA3_Channel7_IRQHandler ; DMA3 Channel 7 + DCD MDMA_Channel0_IRQHandler ; MDMA Channel 0 + DCD MDMA_Channel1_IRQHandler ; MDMA Channel 1 + DCD MDMA_Channel2_IRQHandler ; MDMA Channel 2 + DCD MDMA_Channel3_IRQHandler ; MDMA Channel 3 + DCD MDMA_Channel4_IRQHandler ; MDMA Channel 4 + DCD MDMA_Channel5_IRQHandler ; MDMA Channel 5 + DCD MDMA_Channel6_IRQHandler ; MDMA Channel 6 + DCD MDMA_Channel7_IRQHandler ; MDMA Channel 7 + DCD MDMA_Channel8_IRQHandler ; MDMA Channel 8 + DCD MDMA_Channel9_IRQHandler ; MDMA Channel 9 + DCD MDMA_Channel10_IRQHandler ; MDMA Channel 10 + DCD MDMA_Channel11_IRQHandler ; MDMA Channel 11 + DCD MDMA_Channel12_IRQHandler ; MDMA Channel 12 + DCD MDMA_Channel13_IRQHandler ; MDMA Channel 13 + DCD MDMA_Channel14_IRQHandler ; MDMA Channel 14 + DCD MDMA_Channel15_IRQHandler ; MDMA Channel 15 + DCD SDPU_IRQHandler ; SDPU global interrupt + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD FPU_CPU1_IRQHandler ; FPU_CM7 global interrupt + DCD ECCMON_IRQHandler ; ECCMON global interrupt + DCD RTC_ALARM_IRQHandler ; RTC Alarm via EXTI17 interrupt + DCD I2C1_EV_IRQHandler ; I2C1 event interrupt + DCD I2C1_ER_IRQHandler ; I2C1 error interrupt + DCD I2C2_EV_IRQHandler ; I2C2 event interrupt + DCD I2C2_ER_IRQHandler ; I2C2 error interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event interrupt + DCD I2C3_ER_IRQHandler ; I2C3 error interrupt + DCD I2C4_EV_IRQHandler ; I2C4 event interrupt + DCD I2C4_ER_IRQHandler ; I2C4 error interrupt + DCD I2C5_EV_IRQHandler ; I2C5 event interrupt + DCD I2C5_ER_IRQHandler ; I2C5 error interrupt + DCD I2C6_EV_IRQHandler ; I2C6 event interrupt + DCD I2C6_ER_IRQHandler ; I2C6 error interrupt + DCD I2C7_EV_IRQHandler ; I2C7 event interrupt + DCD I2C7_ER_IRQHandler ; I2C7 error interrupt + DCD I2C8_EV_IRQHandler ; I2C8 event interrupt + DCD I2C8_ER_IRQHandler ; I2C8 error interrupt + DCD I2C9_EV_IRQHandler ; I2C9 event interrupt + DCD I2C9_ER_IRQHandler ; I2C9 error interrupt + DCD I2C10_EV_IRQHandler ; I2C10 event interrupt + DCD I2C10_ER_IRQHandler ; I2C10 error interrupt + DCD I2S1_IRQHandler ; I2S1 global interrupt + DCD I2S2_IRQHandler ; I2S1 global interrupt + DCD I2S3_IRQHandler ; I2S1 global interrupt + DCD I2S4_IRQHandler ; I2S1 global interrupt + DCD 0 ; Reserved + DCD xSPI2_IRQHandler ; xSPI2 global interrupt + DCD SPI1_IRQHandler ; SPI1 global interrupt + DCD SPI2_IRQHandler ; SPI2 global interrupt + DCD SPI3_IRQHandler ; SPI3 global interrupt + DCD SPI4_IRQHandler ; SPI4 global interrupt + DCD SPI5_IRQHandler ; SPI5 global interrupt + DCD SPI6_IRQHandler ; SPI6 global interrupt + DCD SPI7_IRQHandler ; SPI7 global interrupt + DCD LCD_EV_IRQHandler ; TFT LCD Controller event interrupt + DCD LCD_ER_IRQHandler ; TFT LCD Controller error interrupt + DCD DVP1_IRQHandler ; DVP1 global interrupt + DCD DVP2_IRQHandler ; DVP2 global interrupt + DCD DMAMUX2_IRQHandler ; DMAMUX2 (MDMA MUX) global interrupt + DCD USB1_HS_EPx_OUT_IRQHandler ; USB1_HS endpoint out global interrupt + DCD USB1_HS_EPx_IN_IRQHandler ; USB1_HS endpoint in global interrupt + DCD USB1_HS_WKUP_IRQHandler ; USB1_HS WKUP interrupt through EXTI line 62 + DCD USB1_HS_IRQHandler ; USB1_HS global interrupt + DCD USB2_HS_EPx_OUT_IRQHandler ; USB2_HS endpoint out global interrupt + DCD USB2_HS_EPx_IN_IRQHandler ; USB2_HS endpoint in global interrupt + DCD USB2_HS_WKUP_IRQHandler ; USB2_HS WKUP interrupt through EXTI line 63 + DCD USB2_HS_IRQHandler ; USB2_HS global interrupt + DCD ETH1_IRQHandler ; Ethernet 1 global interrupt + DCD ETH1_PMT_LPI_IRQHandler ; Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 + DCD ETH2_IRQHandler ; Ethernet 2 global interrupt + DCD ETH2_PMT_LPI_IRQHandler ; Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 + DCD FDCAN1_INT0_IRQHandler ; FDCAN1 global interrupt line 0 + DCD FDCAN2_INT0_IRQHandler ; FDCAN2 global interrupt line 0 + DCD FDCAN3_INT0_IRQHandler ; FDCAN3 global interrupt line 0 + DCD FDCAN4_INT0_IRQHandler ; FDCAN4 global interrupt line 0 + DCD FDCAN1_INT1_IRQHandler ; FDCAN1 global interrupt line 1 + DCD FDCAN2_INT1_IRQHandler ; FDCAN2 global interrupt line 1 + DCD FDCAN3_INT1_IRQHandler ; FDCAN3 global interrupt line 1 + DCD FDCAN4_INT1_IRQHandler ; FDCAN4 global interrupt line 1 + DCD USART1_IRQHandler ; USART1 global interrupt + DCD USART2_IRQHandler ; USART2 global interrupt + DCD USART3_IRQHandler ; USART3 global interrupt + DCD USART4_IRQHandler ; USART4 global interrupt + DCD USART5_IRQHandler ; USART5 global interrupt + DCD USART6_IRQHandler ; USART6 global interrupt + DCD USART7_IRQHandler ; USART7 global interrupt + DCD USART8_IRQHandler ; USART8 global interrupt + DCD UART9_IRQHandler ; UART9 global interrupt + DCD UART10_IRQHandler ; UART10 global interrupt + DCD UART11_IRQHandler ; UART11 global interrupt + DCD UART12_IRQHandler ; UART12 global interrupt + DCD UART13_IRQHandler ; UART13 global interrupt + DCD UART14_IRQHandler ; UART14 global interrupt + DCD UART15_IRQHandler ; UART15 global interrupt + DCD LPUART1_IRQHandler ; LPUART1 global interrupt + wakeup through EXTI line 49 + DCD LPUART2_IRQHandler ; LPUART2 global interrupt + wakeup through EXTI line 52 + DCD GPU_IRQHandler ; GPU global interrupt + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1_IRQ + WKUP through EXTI line 24 + DCD SDMMC2_IRQHandler ; SDMMC2_IRQ + WKUP through EXTI line 25 + DCD ADC1_IRQHandler ; ADC1 global interrupt + DCD ADC2_IRQHandler ; ADC2 global interrupt + DCD ADC3_IRQHandler ; ADC3 global interrupt + DCD COMP1_2_IRQHandler ; COMP1 and COMP2 through EXTI line 20 and 21 + DCD COMP3_4_IRQHandler ; COMP3 and COMP4 through EXTI line 22 and 23 + DCD SHRTIM1_INT1_IRQHandler ; High Resolution timer 1 interrupt 1 + DCD SHRTIM1_INT2_IRQHandler ; High Resolution timer 1 interrupt 2 + DCD SHRTIM1_INT3_IRQHandler ; High Resolution timer 1 interrupt 3 + DCD SHRTIM1_INT4_IRQHandler ; High Resolution timer 1 interrupt 4 + DCD SHRTIM1_INT5_IRQHandler ; High Resolution timer 1 interrupt 5 + DCD SHRTIM1_INT6_IRQHandler ; High Resolution timer 1 interrupt 6 + DCD SHRTIM1_INT7_IRQHandler ; High Resolution timer 1 interrupt 7 + DCD SHRTIM1_INT8_IRQHandler ; High Resolution timer 1 interrupt 8 + DCD SHRTIM2_INT1_IRQHandler ; High Resolution timer 2 interrupt 1 + DCD SHRTIM2_INT2_IRQHandler ; High Resolution timer 2 interrupt 2 + DCD SHRTIM2_INT3_IRQHandler ; High Resolution timer 2 interrupt 3 + DCD SHRTIM2_INT4_IRQHandler ; High Resolution timer 2 interrupt 4 + DCD SHRTIM2_INT5_IRQHandler ; High Resolution timer 2 interrupt 5 + DCD SHRTIM2_INT6_IRQHandler ; High Resolution timer 2 interrupt 6 + DCD SHRTIM2_INT7_IRQHandler ; High Resolution timer 2 interrupt 7 + DCD SHRTIM2_INT8_IRQHandler ; High Resolution timer 2 interrupt 8 + DCD FDCAN5_INT0_IRQHandler ; FDCAN5 global interrupt line 0 + DCD FDCAN6_INT0_IRQHandler ; FDCAN6 global interrupt line 0 + DCD FDCAN7_INT0_IRQHandler ; FDCAN7 global interrupt line 0 + DCD FDCAN8_INT0_IRQHandler ; FDCAN8 global interrupt line 0 + DCD FDCAN5_INT1_IRQHandler ; FDCAN5 global interrupt line 1 + DCD FDCAN6_INT1_IRQHandler ; FDCAN6 global interrupt line 1 + DCD FDCAN7_INT1_IRQHandler ; FDCAN7 global interrupt line 1 + DCD FDCAN8_INT1_IRQHandler ; FDCAN8 global interrupt line 1 + DCD DSI_IRQHandler ; MIPI DSI Interrupt through EXTI line 87 + DCD 0 ; Reserved + DCD LPTIM5_WKUP_IRQHandler ; LPTIM5 wakeup through EXTI 86 + DCD JPEG_SGDMA_H2P_IRQHandler ; JPEG SGDMA Host to Peripheral Interrupt + DCD JPEG_SGDMA_P2H_IRQHandler ; JPEG SGDMA Peripheral to Host Interrupt + DCD WAKEUP_IO_IRQHandler ; 6 WAKEUP IOs through EXTI line 70-75 + DCD SEMA4_INT1_IRQHandler ; SEMA4 interrupt1 + DCD 0 ; Reserved + DCD WWDG2_RST_IRQHandler ; WWDG2 reset interrupt through EXTI line 82 + DCD OTPC_IRQHandler ; OTPC interrupt + DCD FEMC_IRQHandler ; FEMC interrupt + DCD DCMUB_IRQHandler ; DCMUB interrupt + DCD DAC1_IRQHandler ; DAC1 interrupt + DCD DAC2_IRQHandler ; DAC2 interrupt + DCD MDMA_AHBS_ER_IRQHandler ; MDMA HABS ERROR through EXTI line55-56 + DCD CM7_CATCH_READ_ER_IRQHandler ; CM7 Error on Cache Read through EXTI line 64-65 + DCD DAC3_IRQHandler ; DAC3 interrupt + DCD DAC4_IRQHandler ; DAC4 interrupt + DCD EMC_IRQHandler ; EMC event interrupt through EXTI line 88-89 + DCD DAC5_IRQHandler ; DAC5 interrupt + DCD DAC6_IRQHandler ; DAC6 interrupt + DCD ESC_OPB_IRQHandler ; ETHERCAT OPB Interrupt + DCD ESC_SYNC0_IRQHandler ; ETHERCAT SYNC0 Interrupt + DCD ESC_SYNC1_RQHandler ; ETHERCAT SYNC1 Interrupt + DCD ESC_WRP_IRQHandler ; ETHERCAT WRAPPER Interrupt + DCD 0 ; Reserved + DCD ATIM1_BRK_IRQHandler ; Advanced timer 1 break interrupt + DCD ATIM1_TRG_COM_IRQHandler ; Advanced timer 1 trigger and commutation interrupts + DCD ATIM1_CC_IRQHandler ; Advanced timer 1 capture/compare interrupt + DCD ATIM1_UP_IRQHandler ; Advanced timer 1 update interrupt + DCD ATIM2_BRK_IRQHandler ; Advanced timer 2 break interrupt + DCD ATIM2_TRG_COM_IRQHandler ; advanced timer 2 trigger and commutation interrupts + DCD ATIM2_CC_IRQHandler ; Advanced timer 2 capture/compare interrupt + DCD ATIM2_UP_IRQHandler ; Advanced timer 2 update interrupt + DCD ATIM3_BRK_IRQHandler ; Advanced timer 3 break interrupt + DCD ATIM3_TRG_COM_IRQHandler ; Advanced timer 3 trigger and commutation interrupts + DCD ATIM3_CC_IRQHandler ; Advanced timer 3 capture/compare interrupt + DCD ATIM3_UP_IRQHandler ; Advanced timer 3 update interrupt + DCD ATIM4_BRK_IRQHandler ; Advanced timer 4 break interrupt + DCD ATIM4_TRG_COM_IRQHandler ; Advanced timer 4 trigger and commutation interrupts + DCD ATIM4_CC_IRQHandler ; Advanced timer 4 capture/compare interrupt + DCD ATIM4_UP_IRQHandler ; Advanced timer 4 update interrupt + DCD GTIMA1_IRQHandler ; General timer A1 global interrupt + DCD GTIMA2_IRQHandler ; General timer A2 global interrupt + DCD GTIMA3_IRQHandler ; General timer A3 global interrupt + DCD GTIMA4_IRQHandler ; General timer A4 global interrupt + DCD GTIMA5_IRQHandler ; General timer A5 global interrupt + DCD GTIMA6_IRQHandler ; General timer A6 global interrupt + DCD GTIMA7_IRQHandler ; General timer A7 global interrupt + DCD GTIMB1_IRQHandler ; General timer B1 global interrupt + DCD GTIMB2_IRQHandler ; General timer B2 global interrupt + DCD GTIMB3_IRQHandler ; General timer B3 global interrupt + DCD BTIM1_IRQHandler ; Base timer 1 global interrupt + DCD BTIM2_IRQHandler ; Base timer 2 global interrupt + DCD BTIM3_IRQHandler ; Base timer 3 global interrupt + DCD BTIM4_IRQHandler ; Base timer 4 global interrupt + DCD LPTIM1_WKUP_IRQHandler ; LPTIM1 wakeup interrupt + DCD LPTIM2_WKUP_IRQHandler ; LPTIM2 wakeup interrupt + DCD LPTIM3_WKUP_IRQHandler ; LPTIM3 wakeup interrupt + DCD LPTIM4_WKUP_IRQHandler ; LPTIM4 wakeup interrupt + DCD DSMU_FLT0_IRQHandler ; DSMU Filter interrupt 0 + DCD DSMU_FLT1_IRQHandler ; DSMU Filter interrupt 1 + DCD DSMU_FLT2_IRQHandler ; DSMU Filter interrupt 2 + DCD DSMU_FLT3_IRQHandler ; DSMU Filter interrupt 3 + DCD FMAC_IRQHandler ; FMAC global interrupt + DCD CORDIC_IRQHandler ; Cordic global interrupt + DCD DMAMUX1_IRQHandler ; DMAMUX1 interrupt + DCD MMU_IRQHandler ; MMU interrupt + DCD SysTick_Handler ; SysTick Handler + ;need check to user manual of exti chapter + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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 N32SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +N32SysTick_Handler + B N32SysTick_Handler + + PUBWEAK WWDG1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG1_IRQHandler + B WWDG1_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK RTC_TAMPER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_TAMPER_IRQHandler + B RTC_TAMPER_IRQHandler + + PUBWEAK RTC_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_WKUP_IRQHandler + B RTC_WKUP_IRQHandler + + PUBWEAK RCC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RCC_IRQHandler + B RCC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK EXTI9_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI9_5_IRQHandler + B EXTI9_5_IRQHandler + + PUBWEAK EXTI15_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EXTI15_10_IRQHandler + B EXTI15_10_IRQHandler + + PUBWEAK DMA1_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA1_Channel0_IRQHandler + B DMA1_Channel0_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 DMA2_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel0_IRQHandler + B DMA2_Channel0_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_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel4_IRQHandler + B DMA2_Channel4_IRQHandler + + PUBWEAK DMA2_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel5_IRQHandler + B DMA2_Channel5_IRQHandler + + PUBWEAK DMA2_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel6_IRQHandler + B DMA2_Channel6_IRQHandler + + PUBWEAK DMA2_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA2_Channel7_IRQHandler + B DMA2_Channel7_IRQHandler + + PUBWEAK DMA3_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel0_IRQHandler + B DMA3_Channel0_IRQHandler + + PUBWEAK DMA3_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel1_IRQHandler + B DMA3_Channel1_IRQHandler + + PUBWEAK DMA3_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel2_IRQHandler + B DMA3_Channel2_IRQHandler + + PUBWEAK DMA3_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel3_IRQHandler + B DMA3_Channel3_IRQHandler + + PUBWEAK DMA3_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel4_IRQHandler + B DMA3_Channel4_IRQHandler + + PUBWEAK DMA3_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel5_IRQHandler + B DMA3_Channel5_IRQHandler + + PUBWEAK DMA3_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel6_IRQHandler + B DMA3_Channel6_IRQHandler + + PUBWEAK DMA3_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMA3_Channel7_IRQHandler + B DMA3_Channel7_IRQHandler + + PUBWEAK MDMA_Channel0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel0_IRQHandler + B MDMA_Channel0_IRQHandler + + PUBWEAK MDMA_Channel1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel1_IRQHandler + B MDMA_Channel1_IRQHandler + + PUBWEAK MDMA_Channel2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel2_IRQHandler + B MDMA_Channel2_IRQHandler + + PUBWEAK MDMA_Channel3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel3_IRQHandler + B MDMA_Channel3_IRQHandler + + PUBWEAK MDMA_Channel4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel4_IRQHandler + B MDMA_Channel4_IRQHandler + + PUBWEAK MDMA_Channel5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel5_IRQHandler + B MDMA_Channel5_IRQHandler + + PUBWEAK MDMA_Channel6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel6_IRQHandler + B MDMA_Channel6_IRQHandler + + PUBWEAK MDMA_Channel7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel7_IRQHandler + B MDMA_Channel7_IRQHandler + + PUBWEAK MDMA_Channel8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel8_IRQHandler + B MDMA_Channel8_IRQHandler + + PUBWEAK MDMA_Channel9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel9_IRQHandler + B MDMA_Channel9_IRQHandler + + PUBWEAK MDMA_Channel10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel10_IRQHandler + B MDMA_Channel10_IRQHandler + + PUBWEAK MDMA_Channel11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel11_IRQHandler + B MDMA_Channel11_IRQHandler + + PUBWEAK MDMA_Channel12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel12_IRQHandler + B MDMA_Channel12_IRQHandler + + PUBWEAK MDMA_Channel13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel13_IRQHandler + B MDMA_Channel13_IRQHandler + + PUBWEAK MDMA_Channel14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel14_IRQHandler + B MDMA_Channel14_IRQHandler + + PUBWEAK MDMA_Channel15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_Channel15_IRQHandler + B MDMA_Channel15_IRQHandler + + PUBWEAK SDPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDPU_IRQHandler + B SDPU_IRQHandler + + PUBWEAK FPU_CPU1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FPU_CPU1_IRQHandler + B FPU_CPU1_IRQHandler + + PUBWEAK ECCMON_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ECCMON_IRQHandler + B ECCMON_IRQHandler + + PUBWEAK RTC_ALARM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +RTC_ALARM_IRQHandler + B RTC_ALARM_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 I2C3_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_EV_IRQHandler + B I2C3_EV_IRQHandler + + PUBWEAK I2C3_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C3_ER_IRQHandler + B I2C3_ER_IRQHandler + + PUBWEAK I2C4_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_EV_IRQHandler + B I2C4_EV_IRQHandler + + PUBWEAK I2C4_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C4_ER_IRQHandler + B I2C4_ER_IRQHandler + + PUBWEAK I2C5_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_EV_IRQHandler + B I2C5_EV_IRQHandler + + PUBWEAK I2C5_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C5_ER_IRQHandler + B I2C5_ER_IRQHandler + + PUBWEAK I2C6_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_EV_IRQHandler + B I2C6_EV_IRQHandler + + PUBWEAK I2C6_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C6_ER_IRQHandler + B I2C6_ER_IRQHandler + + PUBWEAK I2C7_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_EV_IRQHandler + B I2C7_EV_IRQHandler + + PUBWEAK I2C7_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C7_ER_IRQHandler + B I2C7_ER_IRQHandler + + PUBWEAK I2C8_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_EV_IRQHandler + B I2C8_EV_IRQHandler + + PUBWEAK I2C8_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C8_ER_IRQHandler + B I2C8_ER_IRQHandler + + PUBWEAK I2C9_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_EV_IRQHandler + B I2C9_EV_IRQHandler + + PUBWEAK I2C9_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C9_ER_IRQHandler + B I2C9_ER_IRQHandler + + PUBWEAK I2C10_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_EV_IRQHandler + B I2C10_EV_IRQHandler + + PUBWEAK I2C10_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2C10_ER_IRQHandler + B I2C10_ER_IRQHandler + + PUBWEAK I2S1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S1_IRQHandler + B I2S1_IRQHandler + + PUBWEAK I2S2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S2_IRQHandler + B I2S2_IRQHandler + + PUBWEAK I2S3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S3_IRQHandler + B I2S3_IRQHandler + + PUBWEAK I2S4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +I2S4_IRQHandler + B I2S4_IRQHandler + + PUBWEAK xSPI1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI1_IRQHandler + B xSPI1_IRQHandler + + PUBWEAK xSPI2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +xSPI2_IRQHandler + B xSPI2_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 SPI3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK SPI4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI4_IRQHandler + B SPI4_IRQHandler + + PUBWEAK SPI5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI5_IRQHandler + B SPI5_IRQHandler + + PUBWEAK SPI6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI6_IRQHandler + B SPI6_IRQHandler + + PUBWEAK SPI7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SPI7_IRQHandler + B SPI7_IRQHandler + + PUBWEAK LCD_EV_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_EV_IRQHandler + B LCD_EV_IRQHandler + + PUBWEAK LCD_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LCD_ER_IRQHandler + B LCD_ER_IRQHandler + + PUBWEAK DVP1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP1_IRQHandler + B DVP1_IRQHandler + + PUBWEAK DVP2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DVP2_IRQHandler + B DVP2_IRQHandler + + PUBWEAK DMAMUX2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX2_IRQHandler + B DMAMUX2_IRQHandler + + PUBWEAK USB1_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_OUT_IRQHandler + B USB1_HS_EPx_OUT_IRQHandler + + PUBWEAK USB1_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_EPx_IN_IRQHandler + B USB1_HS_EPx_IN_IRQHandler + + PUBWEAK USB1_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_WKUP_IRQHandler + B USB1_HS_WKUP_IRQHandler + + PUBWEAK USB1_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB1_HS_IRQHandler + B USB1_HS_IRQHandler + + PUBWEAK USB2_HS_EPx_OUT_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_OUT_IRQHandler + B USB2_HS_EPx_OUT_IRQHandler + + PUBWEAK USB2_HS_EPx_IN_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_EPx_IN_IRQHandler + B USB2_HS_EPx_IN_IRQHandler + + PUBWEAK USB2_HS_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_WKUP_IRQHandler + B USB2_HS_WKUP_IRQHandler + + PUBWEAK USB2_HS_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USB2_HS_IRQHandler + B USB2_HS_IRQHandler + + PUBWEAK ETH1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_IRQHandler + B ETH1_IRQHandler + + PUBWEAK ETH1_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH1_PMT_LPI_IRQHandler + B ETH1_PMT_LPI_IRQHandler + + PUBWEAK ETH2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_IRQHandler + B ETH2_IRQHandler + + PUBWEAK ETH2_PMT_LPI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ETH2_PMT_LPI_IRQHandler + B ETH2_PMT_LPI_IRQHandler + + PUBWEAK FDCAN1_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT0_IRQHandler + B FDCAN1_INT0_IRQHandler + + PUBWEAK FDCAN2_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT0_IRQHandler + B FDCAN2_INT0_IRQHandler + + PUBWEAK FDCAN3_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT0_IRQHandler + B FDCAN3_INT0_IRQHandler + + PUBWEAK FDCAN4_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT0_IRQHandler + B FDCAN4_INT0_IRQHandler + + PUBWEAK FDCAN1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN1_INT1_IRQHandler + B FDCAN1_INT1_IRQHandler + + PUBWEAK FDCAN2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN2_INT1_IRQHandler + B FDCAN2_INT1_IRQHandler + + PUBWEAK FDCAN3_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN3_INT1_IRQHandler + B FDCAN3_INT1_IRQHandler + + PUBWEAK FDCAN4_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN4_INT1_IRQHandler + B FDCAN4_INT1_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 USART4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART4_IRQHandler + B USART4_IRQHandler + + PUBWEAK USART5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART5_IRQHandler + B USART5_IRQHandler + + PUBWEAK USART6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART6_IRQHandler + B USART6_IRQHandler + + PUBWEAK USART7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART7_IRQHandler + B USART7_IRQHandler + + PUBWEAK USART8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +USART8_IRQHandler + B USART8_IRQHandler + + PUBWEAK UART9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART9_IRQHandler + B UART9_IRQHandler + + PUBWEAK UART10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART10_IRQHandler + B UART10_IRQHandler + + PUBWEAK UART11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART11_IRQHandler + B UART11_IRQHandler + + PUBWEAK UART12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART12_IRQHandler + B UART12_IRQHandler + + PUBWEAK UART13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART13_IRQHandler + B UART13_IRQHandler + + PUBWEAK UART14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART14_IRQHandler + B UART14_IRQHandler + + PUBWEAK UART15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +UART15_IRQHandler + B UART15_IRQHandler + + PUBWEAK LPUART1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART1_IRQHandler + B LPUART1_IRQHandler + + PUBWEAK LPUART2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPUART2_IRQHandler + B LPUART2_IRQHandler + + PUBWEAK GPU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GPU_IRQHandler + B GPU_IRQHandler + + PUBWEAK SDMMC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC1_IRQHandler + B SDMMC1_IRQHandler + + PUBWEAK SDMMC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SDMMC2_IRQHandler + B SDMMC2_IRQHandler + + PUBWEAK ADC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC1_IRQHandler + B ADC1_IRQHandler + + PUBWEAK ADC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC2_IRQHandler + B ADC2_IRQHandler + + PUBWEAK ADC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ADC3_IRQHandler + B ADC3_IRQHandler + + PUBWEAK COMP1_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP1_2_IRQHandler + B COMP1_2_IRQHandler + + PUBWEAK COMP3_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +COMP3_4_IRQHandler + B COMP3_4_IRQHandler + + PUBWEAK SHRTIM1_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT1_IRQHandler + B SHRTIM1_INT1_IRQHandler + + PUBWEAK SHRTIM1_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT2_IRQHandler + B SHRTIM1_INT2_IRQHandler + + PUBWEAK SHRTIM1_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT3_IRQHandler + B SHRTIM1_INT3_IRQHandler + + PUBWEAK SHRTIM1_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT4_IRQHandler + B SHRTIM1_INT4_IRQHandler + + PUBWEAK SHRTIM1_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT5_IRQHandler + B SHRTIM1_INT5_IRQHandler + + PUBWEAK SHRTIM1_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT6_IRQHandler + B SHRTIM1_INT6_IRQHandler + + PUBWEAK SHRTIM1_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT7_IRQHandler + B SHRTIM1_INT7_IRQHandler + + PUBWEAK SHRTIM1_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM1_INT8_IRQHandler + B SHRTIM1_INT8_IRQHandler + + PUBWEAK SHRTIM2_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT1_IRQHandler + B SHRTIM2_INT1_IRQHandler + + PUBWEAK SHRTIM2_INT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT2_IRQHandler + B SHRTIM2_INT2_IRQHandler + + PUBWEAK SHRTIM2_INT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT3_IRQHandler + B SHRTIM2_INT3_IRQHandler + + PUBWEAK SHRTIM2_INT4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT4_IRQHandler + B SHRTIM2_INT4_IRQHandler + + PUBWEAK SHRTIM2_INT5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT5_IRQHandler + B SHRTIM2_INT5_IRQHandler + + PUBWEAK SHRTIM2_INT6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT6_IRQHandler + B SHRTIM2_INT6_IRQHandler + + PUBWEAK SHRTIM2_INT7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT7_IRQHandler + B SHRTIM2_INT7_IRQHandler + + PUBWEAK SHRTIM2_INT8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SHRTIM2_INT8_IRQHandler + B SHRTIM2_INT8_IRQHandler + + PUBWEAK FDCAN5_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT0_IRQHandler + B FDCAN5_INT0_IRQHandler + + PUBWEAK FDCAN6_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT0_IRQHandler + B FDCAN6_INT0_IRQHandler + + PUBWEAK FDCAN7_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT0_IRQHandler + B FDCAN7_INT0_IRQHandler + + PUBWEAK FDCAN8_INT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT0_IRQHandler + B FDCAN8_INT0_IRQHandler + + PUBWEAK FDCAN5_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN5_INT1_IRQHandler + B FDCAN5_INT1_IRQHandler + + PUBWEAK FDCAN6_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN6_INT1_IRQHandler + B FDCAN6_INT1_IRQHandler + + PUBWEAK FDCAN7_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN7_INT1_IRQHandler + B FDCAN7_INT1_IRQHandler + + PUBWEAK FDCAN8_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FDCAN8_INT1_IRQHandler + B FDCAN8_INT1_IRQHandler + + PUBWEAK DSI_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSI_IRQHandler + B DSI_IRQHandler + + PUBWEAK LPTIM5_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM5_WKUP_IRQHandler + B LPTIM5_WKUP_IRQHandler + + PUBWEAK JPEG_SGDMA_H2P_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_H2P_IRQHandler + B JPEG_SGDMA_H2P_IRQHandler + + PUBWEAK JPEG_SGDMA_P2H_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +JPEG_SGDMA_P2H_IRQHandler + B JPEG_SGDMA_P2H_IRQHandler + + PUBWEAK WAKEUP_IO_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WAKEUP_IO_IRQHandler + B WAKEUP_IO_IRQHandler + + PUBWEAK SEMA4_INT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +SEMA4_INT1_IRQHandler + B SEMA4_INT1_IRQHandler + + PUBWEAK WWDG2_RST_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +WWDG2_RST_IRQHandler + B WWDG2_RST_IRQHandler + + PUBWEAK OTPC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +OTPC_IRQHandler + B OTPC_IRQHandler + + PUBWEAK FEMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FEMC_IRQHandler + B FEMC_IRQHandler + + PUBWEAK DCMUB_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DCMUB_IRQHandler + B DCMUB_IRQHandler + + PUBWEAK DAC1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC1_IRQHandler + B DAC1_IRQHandler + + PUBWEAK DAC2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC2_IRQHandler + B DAC2_IRQHandler + + PUBWEAK MDMA_AHBS_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MDMA_AHBS_ER_IRQHandler + B MDMA_AHBS_ER_IRQHandler + + PUBWEAK CM7_CATCH_READ_ER_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CM7_CATCH_READ_ER_IRQHandler + B CM7_CATCH_READ_ER_IRQHandler + + PUBWEAK DAC3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC3_IRQHandler + B DAC3_IRQHandler + + PUBWEAK DAC4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC4_IRQHandler + B DAC4_IRQHandler + + PUBWEAK EMC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +EMC_IRQHandler + B EMC_IRQHandler + + PUBWEAK DAC5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC5_IRQHandler + B DAC5_IRQHandler + + PUBWEAK DAC6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DAC6_IRQHandler + B DAC6_IRQHandler + + PUBWEAK ESC_OPB_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_OPB_IRQHandler + B ESC_OPB_IRQHandler + + PUBWEAK ESC_SYNC0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC0_IRQHandler + B ESC_SYNC0_IRQHandler + + PUBWEAK ESC_SYNC1_RQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_SYNC1_RQHandler + B ESC_SYNC1_RQHandler + + PUBWEAK ESC_WRP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ESC_WRP_IRQHandler + B ESC_WRP_IRQHandler + + PUBWEAK ATIM1_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_BRK_IRQHandler + B ATIM1_BRK_IRQHandler + + PUBWEAK ATIM1_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_TRG_COM_IRQHandler + B ATIM1_TRG_COM_IRQHandler + + PUBWEAK ATIM1_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_CC_IRQHandler + B ATIM1_CC_IRQHandler + + PUBWEAK ATIM1_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM1_UP_IRQHandler + B ATIM1_UP_IRQHandler + + PUBWEAK ATIM2_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_BRK_IRQHandler + B ATIM2_BRK_IRQHandler + + PUBWEAK ATIM2_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_TRG_COM_IRQHandler + B ATIM2_TRG_COM_IRQHandler + + PUBWEAK ATIM2_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_CC_IRQHandler + B ATIM2_CC_IRQHandler + + PUBWEAK ATIM2_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM2_UP_IRQHandler + B ATIM2_UP_IRQHandler + + PUBWEAK ATIM3_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_BRK_IRQHandler + B ATIM3_BRK_IRQHandler + + PUBWEAK ATIM3_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_TRG_COM_IRQHandler + B ATIM3_TRG_COM_IRQHandler + + PUBWEAK ATIM3_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_CC_IRQHandler + B ATIM3_CC_IRQHandler + + PUBWEAK ATIM3_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM3_UP_IRQHandler + B ATIM3_UP_IRQHandler + + PUBWEAK ATIM4_BRK_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_BRK_IRQHandler + B ATIM4_BRK_IRQHandler + + PUBWEAK ATIM4_TRG_COM_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_TRG_COM_IRQHandler + B ATIM4_TRG_COM_IRQHandler + + PUBWEAK ATIM4_CC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_CC_IRQHandler + B ATIM4_CC_IRQHandler + + PUBWEAK ATIM4_UP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ATIM4_UP_IRQHandler + B ATIM4_UP_IRQHandler + + PUBWEAK GTIMA1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA1_IRQHandler + B GTIMA1_IRQHandler + + PUBWEAK GTIMA2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA2_IRQHandler + B GTIMA2_IRQHandler + + PUBWEAK GTIMA3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA3_IRQHandler + B GTIMA3_IRQHandler + + PUBWEAK GTIMA4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA4_IRQHandler + B GTIMA4_IRQHandler + + PUBWEAK GTIMA5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA5_IRQHandler + B GTIMA5_IRQHandler + + PUBWEAK GTIMA6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA6_IRQHandler + B GTIMA6_IRQHandler + + PUBWEAK GTIMA7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMA7_IRQHandler + B GTIMA7_IRQHandler + + PUBWEAK GTIMB1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB1_IRQHandler + B GTIMB1_IRQHandler + + PUBWEAK GTIMB2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB2_IRQHandler + B GTIMB2_IRQHandler + + PUBWEAK GTIMB3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +GTIMB3_IRQHandler + B GTIMB3_IRQHandler + + PUBWEAK BTIM1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM1_IRQHandler + B BTIM1_IRQHandler + + PUBWEAK BTIM2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM2_IRQHandler + B BTIM2_IRQHandler + + PUBWEAK BTIM3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM3_IRQHandler + B BTIM3_IRQHandler + + PUBWEAK BTIM4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +BTIM4_IRQHandler + B BTIM4_IRQHandler + + PUBWEAK LPTIM1_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM1_WKUP_IRQHandler + B LPTIM1_WKUP_IRQHandler + + PUBWEAK LPTIM2_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM2_WKUP_IRQHandler + B LPTIM2_WKUP_IRQHandler + + PUBWEAK LPTIM3_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM3_WKUP_IRQHandler + B LPTIM3_WKUP_IRQHandler + + PUBWEAK LPTIM4_WKUP_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +LPTIM4_WKUP_IRQHandler + B LPTIM4_WKUP_IRQHandler + + PUBWEAK DSMU_FLT0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT0_IRQHandler + B DSMU_FLT0_IRQHandler + + PUBWEAK DSMU_FLT1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT1_IRQHandler + B DSMU_FLT1_IRQHandler + + PUBWEAK DSMU_FLT2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT2_IRQHandler + B DSMU_FLT2_IRQHandler + + PUBWEAK DSMU_FLT3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DSMU_FLT3_IRQHandler + B DSMU_FLT3_IRQHandler + + PUBWEAK FMAC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +FMAC_IRQHandler + B FMAC_IRQHandler + + PUBWEAK CORDIC_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +CORDIC_IRQHandler + B CORDIC_IRQHandler + + PUBWEAK DMAMUX1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +DMAMUX1_IRQHandler + B DMAMUX1_IRQHandler + + PUBWEAK MMU_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +MMU_IRQHandler + B MMU_IRQHandler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + END + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7_gcc.s b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7_gcc.s new file mode 100644 index 0000000000..6ecb108e55 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/startup/startup_n32h78x_cm7_gcc.s @@ -0,0 +1,1108 @@ +/********************************************************************************************************* + Copyright (c) 2024, Nations Technologies Inc. + + All rights reserved. + + This software is the exclusive property of Nations Technologies Inc. (Hereinafter + referred to as NATIONS). This software, and the product of NATIONS described herein + (Hereinafter referred to as the Product) are owned by NATIONS under the laws and treaties + of the People's Republic of China and other applicable jurisdictions worldwide. + + NATIONS does not grant any license under its patents, copyrights, trademarks, or other + intellectual property rights. Names and brands of third party may be mentioned or referred + thereto (if any) for identification purposes only. + + NATIONS reserves the right to make changes, corrections, enhancements, modifications, and + improvements to this software at any time without notice. Please contact NATIONS and obtain + the latest version of this software before placing orders. + + Although NATIONS has attempted to provide accurate and reliable information, NATIONS assumes + no responsibility for the accuracy and reliability of this software. + + It is the responsibility of the user of this software to properly design, program, and test + the functionality and safety of any application made of this information and any resulting product. + In no event shall NATIONS be liable for any direct, indirect, incidental, special,exemplary, or + consequential damages arising in any way out of the use of this software or the Product. + + NATIONS Products are neither intended nor warranted for usage in systems or equipment, any + malfunction or failure of which may cause loss of human life, bodily injury or severe property + damage. Such applications are deemed, "Insecure Usage". + + All Insecure Usage shall be made at user's risk. User shall indemnify NATIONS and hold NATIONS + harmless from and against all claims, costs, damages, and other liabilities, arising from or related + to any customer's Insecure Usage. + + Any express or implied warranty with regard to this software or the Product, including,but not + limited to, the warranties of merchantability, fitness for a particular purpose and non-infringement + are disclaimed to the fullest extent permitted by law. + + Unless otherwise explicitly permitted by NATIONS, anyone may not duplicate, modify, transcribe + or otherwise distribute this software for any purposes, in whole or in part. + + NATIONS products and technologies shall not be used for or incorporated into any products or systems + whose manufacture, use, or sale is prohibited under any applicable domestic or foreign laws or regulations. + User shall comply with any applicable export control laws and regulations promulgated and administered by + the governments of any countries asserting jurisdiction over the parties or transactions. + ************************************************************************************************************/ + + + .syntax unified + .cpu cortex-m7 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr r0, =_estack + mov sp, r0 /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + ldr r1, =_edata + ldr r2, =_sidata + movs r3, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +LoopCopyDataInit: + adds r4, r0, r3 + cmp r4, r1 + bcc CopyDataInit + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + ldr r4, =_ebss + movs r3, #0 + b LoopFillZerobss + +FillZerobss: + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + cmp r2, r4 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + +LoopForever: + b LoopForever + + +.size Reset_Handler, .-Reset_Handler + +/** +\*fun This is the code that gets called when the processor receives an +\* unexpected interrupt. This simply enters an infinite loop, preserving +\* the system state for examination by a debugger. +**/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/** +\* The minimal vector table for a Cortex M0. Note that the proper constructs +\* must be placed on this to ensure that it ends up at physical address 0x00000000. +**/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + /* External Interrupts */ + .word WWDG1_IRQHandler /* Window1 Watchdog interrupt */ + .word PVD_IRQHandler /* PVD through EXTI Line16 detection interrupt */ + .word RTC_TAMPER_IRQHandler /* RTC Tamper_Timestamp_Overflow or LSE-CSS through EXTI Line18 interrupt */ + .word RTC_WKUP_IRQHandler /* RTC Wakeup timer through EXTI line 19 interrupt */ + .word RCC_IRQHandler /* RCC interrupt */ + .word EXTI0_IRQHandler /* EXTI Line 0 interrupt */ + .word EXTI1_IRQHandler /* EXTI Line 1 interrupt */ + .word EXTI2_IRQHandler /* EXTI Line 2 interrupt */ + .word EXTI3_IRQHandler /* EXTI Line 3 interrupt */ + .word EXTI4_IRQHandler /* EXTI Line 4 interrupt */ + .word EXTI9_5_IRQHandler /* EXTI Line[9:5] interrupt */ + .word EXTI15_10_IRQHandler /* EXTI Line[15:10] interrupt */ + .word DMA1_Channel0_IRQHandler /* DMA1 Channel 0 */ + .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 DMA2_Channel0_IRQHandler /* DMA2 Channel 0 */ + .word DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */ + .word DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */ + .word DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */ + .word DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */ + .word DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */ + .word DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */ + .word DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */ + .word DMA3_Channel0_IRQHandler /* DMA3 Channel 0 */ + .word DMA3_Channel1_IRQHandler /* DMA3 Channel 1 */ + .word DMA3_Channel2_IRQHandler /* DMA3 Channel 2 */ + .word DMA3_Channel3_IRQHandler /* DMA3 Channel 3 */ + .word DMA3_Channel4_IRQHandler /* DMA3 Channel 4 */ + .word DMA3_Channel5_IRQHandler /* DMA3 Channel 5 */ + .word DMA3_Channel6_IRQHandler /* DMA3 Channel 6 */ + .word DMA3_Channel7_IRQHandler /* DMA3 Channel 7 */ + .word MDMA_Channel0_IRQHandler /* MDMA Channel 0 */ + .word MDMA_Channel1_IRQHandler /* MDMA Channel 1 */ + .word MDMA_Channel2_IRQHandler /* MDMA Channel 2 */ + .word MDMA_Channel3_IRQHandler /* MDMA Channel 3 */ + .word MDMA_Channel4_IRQHandler /* MDMA Channel 4 */ + .word MDMA_Channel5_IRQHandler /* MDMA Channel 5 */ + .word MDMA_Channel6_IRQHandler /* MDMA Channel 6 */ + .word MDMA_Channel7_IRQHandler /* MDMA Channel 7 */ + .word MDMA_Channel8_IRQHandler /* MDMA Channel 8 */ + .word MDMA_Channel9_IRQHandler /* MDMA Channel 9 */ + .word MDMA_Channel10_IRQHandler /* MDMA Channel 10 */ + .word MDMA_Channel11_IRQHandler /* MDMA Channel 11 */ + .word MDMA_Channel12_IRQHandler /* MDMA Channel 12 */ + .word MDMA_Channel13_IRQHandler /* MDMA Channel 13 */ + .word MDMA_Channel14_IRQHandler /* MDMA Channel 14 */ + .word MDMA_Channel15_IRQHandler /* MDMA Channel 15 */ + .word SDPU_IRQHandler /* SDPU global interrupt */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word FPU_CPU1_IRQHandler /* FPU_CM7 global interrupt */ + .word ECCMON_IRQHandler /* ECCMON global interrupt */ + .word RTC_ALARM_IRQHandler /* RTC Alarm via EXTI17 interrupt */ + .word I2C1_EV_IRQHandler /* I2C1 event interrupt */ + .word I2C1_ER_IRQHandler /* I2C1 error interrupt */ + .word I2C2_EV_IRQHandler /* I2C2 event interrupt */ + .word I2C2_ER_IRQHandler /* I2C2 error interrupt */ + .word I2C3_EV_IRQHandler /* I2C3 event interrupt */ + .word I2C3_ER_IRQHandler /* I2C3 error interrupt */ + .word I2C4_EV_IRQHandler /* I2C4 event interrupt */ + .word I2C4_ER_IRQHandler /* I2C4 error interrupt */ + .word I2C5_EV_IRQHandler /* I2C5 event interrupt */ + .word I2C5_ER_IRQHandler /* I2C5 error interrupt */ + .word I2C6_EV_IRQHandler /* I2C6 event interrupt */ + .word I2C6_ER_IRQHandler /* I2C6 error interrupt */ + .word I2C7_EV_IRQHandler /* I2C7 event interrupt */ + .word I2C7_ER_IRQHandler /* I2C7 error interrupt */ + .word I2C8_EV_IRQHandler /* I2C8 event interrupt */ + .word I2C8_ER_IRQHandler /* I2C8 error interrupt */ + .word I2C9_EV_IRQHandler /* I2C9 event interrupt */ + .word I2C9_ER_IRQHandler /* I2C9 error interrupt */ + .word I2C10_EV_IRQHandler /* I2C10 event interrupt */ + .word I2C10_ER_IRQHandler /* I2C10 error interrupt */ + .word I2S1_IRQHandler /* I2S1 global interrupt */ + .word I2S2_IRQHandler /* I2S1 global interrupt */ + .word I2S3_IRQHandler /* I2S1 global interrupt */ + .word I2S4_IRQHandler /* I2S1 global interrupt */ + .word xSPI1_IRQHandler /* xSPI1 global interrupt */ + .word xSPI2_IRQHandler /* xSPI1 global interrupt */ + .word SPI1_IRQHandler /* SPI1 global interrupt */ + .word SPI2_IRQHandler /* SPI2 global interrupt */ + .word SPI3_IRQHandler /* SPI3 global interrupt */ + .word SPI4_IRQHandler /* SPI4 global interrupt */ + .word SPI5_IRQHandler /* SPI5 global interrupt */ + .word SPI6_IRQHandler /* SPI6 global interrupt */ + .word SPI7_IRQHandler /* SPI7 global interrupt */ + .word LCD_EV_IRQHandler /* TFT LCD Controller event interrupt */ + .word LCD_ER_IRQHandler /* TFT LCD Controller error interrupt */ + .word DVP1_IRQHandler /* DVP1 global interrupt */ + .word DVP2_IRQHandler /* DVP2 global interrupt */ + .word DMAMUX2_IRQHandler /* DMAMUX2 (MDMA MUX) global interrupt */ + .word USB1_HS_EPx_OUT_IRQHandler /* USB1_HS endpoint out global interrupt */ + .word USB1_HS_EPx_IN_IRQHandler /* USB1_HS endpoint in global interrupt */ + .word USB1_HS_WKUP_IRQHandler /* USB1_HS WKUP interrupt through EXTI line 62 */ + .word USB1_HS_IRQHandler /* USB1_HS global interrupt */ + .word USB2_HS_EPx_OUT_IRQHandler /* USB2_HS endpoint out global interrupt */ + .word USB2_HS_EPx_IN_IRQHandler /* USB2_HS endpoint in global interrupt */ + .word USB2_HS_WKUP_IRQHandler /* USB2_HS WKUP interrupt through EXTI line 63 */ + .word USB2_HS_IRQHandler /* USB2_HS global interrupt */ + .word ETH1_IRQHandler /* Ethernet 1 global interrupt */ + .word ETH1_PMT_LPI_IRQHandler /* Ethernet 1 PMT wakeup interrupt and LPI interrupt through EXTI line 83 */ + .word ETH2_IRQHandler /* Ethernet 2 global interrupt */ + .word ETH2_PMT_LPI_IRQHandler /* Ethernet 2 PMT wakeup interrupt and LPI interrupt through EXTI line 84 */ + .word FDCAN1_INT0_IRQHandler /* FDCAN1 global interrupt line 0 */ + .word FDCAN2_INT0_IRQHandler /* FDCAN2 global interrupt line 0 */ + .word FDCAN3_INT0_IRQHandler /* FDCAN3 global interrupt line 0 */ + .word FDCAN4_INT0_IRQHandler /* FDCAN4 global interrupt line 0 */ + .word FDCAN1_INT1_IRQHandler /* FDCAN1 global interrupt line 1 */ + .word FDCAN2_INT1_IRQHandler /* FDCAN2 global interrupt line 1 */ + .word FDCAN3_INT1_IRQHandler /* FDCAN3 global interrupt line 1 */ + .word FDCAN4_INT1_IRQHandler /* FDCAN4 global interrupt line 1 */ + .word USART1_IRQHandler /* USART1 global interrupt */ + .word USART2_IRQHandler /* USART2 global interrupt */ + .word USART3_IRQHandler /* USART3 global interrupt */ + .word USART4_IRQHandler /* USART4 global interrupt */ + .word USART5_IRQHandler /* USART5 global interrupt */ + .word USART6_IRQHandler /* USART6 global interrupt */ + .word USART7_IRQHandler /* USART7 global interrupt */ + .word USART8_IRQHandler /* USART8 global interrupt */ + .word UART9_IRQHandler /* UART9 global interrupt */ + .word UART10_IRQHandler /* UART10 global interrupt */ + .word UART11_IRQHandler /* UART11 global interrupt */ + .word UART12_IRQHandler /* UART12 global interrupt */ + .word UART13_IRQHandler /* UART13 global interrupt */ + .word UART14_IRQHandler /* UART14 global interrupt */ + .word UART15_IRQHandler /* UART15 global interrupt */ + .word LPUART1_IRQHandler /* LPUART1 global interrupt + wakeup through EXTI line 49 */ + .word LPUART2_IRQHandler /* LPUART2 global interrupt + wakeup through EXTI line 52 */ + .word GPU_IRQHandler /* GPU global interrupt */ + .word 0 /* Reserved */ + .word SDMMC1_IRQHandler /* SDMMC1_IRQ + WKUP through EXTI line 24 */ + .word SDMMC2_IRQHandler /* SDMMC2_IRQ + WKUP through EXTI line 25 */ + .word ADC1_IRQHandler /* ADC1 global interrupt */ + .word ADC2_IRQHandler /* ADC2 global interrupt */ + .word ADC3_IRQHandler /* ADC3 global interrupt */ + .word COMP1_2_IRQHandler /* COMP1 and COMP2 through EXTI line 20 and 21 */ + .word COMP3_4_IRQHandler /* COMP3 and COMP4 through EXTI line 22 and 23 */ + .word SHRTIM1_INT1_IRQHandler /* High Resolution timer 1 interrupt 1 */ + .word SHRTIM1_INT2_IRQHandler /* High Resolution timer 1 interrupt 2 */ + .word SHRTIM1_INT3_IRQHandler /* High Resolution timer 1 interrupt 3 */ + .word SHRTIM1_INT4_IRQHandler /* High Resolution timer 1 interrupt 4 */ + .word SHRTIM1_INT5_IRQHandler /* High Resolution timer 1 interrupt 5 */ + .word SHRTIM1_INT6_IRQHandler /* High Resolution timer 1 interrupt 6 */ + .word SHRTIM1_INT7_IRQHandler /* High Resolution timer 1 interrupt 7 */ + .word SHRTIM1_INT8_IRQHandler /* High Resolution timer 1 interrupt 8 */ + .word SHRTIM2_INT1_IRQHandler /* High Resolution timer 2 interrupt 1 */ + .word SHRTIM2_INT2_IRQHandler /* High Resolution timer 2 interrupt 2 */ + .word SHRTIM2_INT3_IRQHandler /* High Resolution timer 2 interrupt 3 */ + .word SHRTIM2_INT4_IRQHandler /* High Resolution timer 2 interrupt 4 */ + .word SHRTIM2_INT5_IRQHandler /* High Resolution timer 2 interrupt 5 */ + .word SHRTIM2_INT6_IRQHandler /* High Resolution timer 2 interrupt 6 */ + .word SHRTIM2_INT7_IRQHandler /* High Resolution timer 2 interrupt 7 */ + .word SHRTIM2_INT8_IRQHandler /* High Resolution timer 2 interrupt 8 */ + .word FDCAN5_INT0_IRQHandler /* FDCAN5 global interrupt line 0 */ + .word FDCAN6_INT0_IRQHandler /* FDCAN6 global interrupt line 0 */ + .word FDCAN7_INT0_IRQHandler /* FDCAN7 global interrupt line 0 */ + .word FDCAN8_INT0_IRQHandler /* FDCAN8 global interrupt line 0 */ + .word FDCAN5_INT1_IRQHandler /* FDCAN5 global interrupt line 1 */ + .word FDCAN6_INT1_IRQHandler /* FDCAN6 global interrupt line 1 */ + .word FDCAN7_INT1_IRQHandler /* FDCAN7 global interrupt line 1 */ + .word FDCAN8_INT1_IRQHandler /* FDCAN8 global interrupt line 1 */ + .word DSI_IRQHandler /* MIPI DSI Interrupt through EXTI line 87 */ + .word 0 /* Reserved */ + .word LPTIM5_WKUP_IRQHandler /* LPTIM5 wakeup through EXTI 86 */ + .word JPEG_SGDMA_H2P_IRQHandler /* JPEG SGDMA Host to Peripheral Interrupt */ + .word JPEG_SGDMA_P2H_IRQHandler /* JPEG SGDMA Peripheral to Host Interrupt */ + .word WAKEUP_IO_IRQHandler /* 6 WAKEUP IOs through EXTI line 70-75 */ + .word SEMA4_INT1_IRQHandler /* SEMA4 interrupt1 */ + .word 0 /* Reserved */ + .word WWDG2_RST_IRQHandler /* WWDG2 reset interrupt through EXTI line 82 */ + .word OTPC_IRQHandler /* OTPC interrupt */ + .word FEMC_IRQHandler /* FEMC interrupt */ + .word DCMUB_IRQHandler /* DCMUB interrupt */ + .word DAC1_IRQHandler /* DAC1 interrupt */ + .word DAC2_IRQHandler /* DAC2 interrupt */ + .word MDMA_AHBS_ER_IRQHandler /* MDMA HABS ERROR through EXTI line55-56 */ + .word CM7_CATCH_READ_ER_IRQHandler /* CM7 Error on Cache Read through EXTI line 64-65 */ + .word DAC3_IRQHandler /* DAC3 interrupt */ + .word DAC4_IRQHandler /* DAC4 interrupt */ + .word EMC_IRQHandler /* EMC event interrupt through EXTI line 88-89 */ + .word DAC5_IRQHandler /* DAC5 interrupt */ + .word DAC6_IRQHandler /* DAC6 interrupt */ + .word ESC_OPB_IRQHandler /* ETHERCAT OPB Interrupt */ + .word ESC_SYNC0_IRQHandler /* ETHERCAT SYNC0 Interrupt */ + .word ESC_SYNC1_IRQHandler /* ETHERCAT SYNC1 Interrupt */ + .word ESC_WRP_IRQHandler /* ETHERCAT WRAPPER Interrupt */ + .word 0 /* Reserved */ + .word ATIM1_BRK_IRQHandler /* Advanced timer 1 break interrupt */ + .word ATIM1_TRG_COM_IRQHandler /* Advanced timer 1 trigger and commutation interrupts */ + .word ATIM1_CC_IRQHandler /* Advanced timer 1 capture/compare interrupt */ + .word ATIM1_UP_IRQHandler /* Advanced timer 1 update interrupt */ + .word ATIM2_BRK_IRQHandler /* Advanced timer 2 break interrupt */ + .word ATIM2_TRG_COM_IRQHandler /* advanced timer 2 trigger and commutation interrupts */ + .word ATIM2_CC_IRQHandler /* Advanced timer 2 capture/compare interrupt */ + .word ATIM2_UP_IRQHandler /* Advanced timer 2 update interrupt */ + .word ATIM3_BRK_IRQHandler /* Advanced timer 3 break interrupt */ + .word ATIM3_TRG_COM_IRQHandler /* Advanced timer 3 trigger and commutation interrupts */ + .word ATIM3_CC_IRQHandler /* Advanced timer 3 capture/compare interrupt */ + .word ATIM3_UP_IRQHandler /* Advanced timer 3 update interrupt */ + .word ATIM4_BRK_IRQHandler /* Advanced timer 4 break interrupt */ + .word ATIM4_TRG_COM_IRQHandler /* Advanced timer 4 trigger and commutation interrupts */ + .word ATIM4_CC_IRQHandler /* Advanced timer 4 capture/compare interrupt */ + .word ATIM4_UP_IRQHandler /* Advanced timer 4 update interrupt */ + .word GTIMA1_IRQHandler /* General timer A1 global interrupt */ + .word GTIMA2_IRQHandler /* General timer A2 global interrupt */ + .word GTIMA3_IRQHandler /* General timer A3 global interrupt */ + .word GTIMA4_IRQHandler /* General timer A4 global interrupt */ + .word GTIMA5_IRQHandler /* General timer A5 global interrupt */ + .word GTIMA6_IRQHandler /* General timer A6 global interrupt */ + .word GTIMA7_IRQHandler /* General timer A7 global interrupt */ + .word GTIMB1_IRQHandler /* General timer B1 global interrupt */ + .word GTIMB2_IRQHandler /* General timer B2 global interrupt */ + .word GTIMB3_IRQHandler /* General timer B3 global interrupt */ + .word BTIM1_IRQHandler /* Base timer 1 global interrupt */ + .word BTIM2_IRQHandler /* Base timer 2 global interrupt */ + .word BTIM3_IRQHandler /* Base timer 3 global interrupt */ + .word BTIM4_IRQHandler /* Base timer 4 global interrupt */ + .word LPTIM1_WKUP_IRQHandler /* LPTIM1 wakeup interrupt */ + .word LPTIM2_WKUP_IRQHandler /* LPTIM2 wakeup interrupt */ + .word LPTIM3_WKUP_IRQHandler /* LPTIM3 wakeup interrupt */ + .word LPTIM4_WKUP_IRQHandler /* LPTIM4 wakeup interrupt */ + .word DSMU_FLT0_IRQHandler /* DSMU Filter interrupt 0 */ + .word DSMU_FLT1_IRQHandler /* DSMU Filter interrupt 1 */ + .word DSMU_FLT2_IRQHandler /* DSMU Filter interrupt 2 */ + .word DSMU_FLT3_IRQHandler /* DSMU Filter interrupt 3 */ + .word FMAC_IRQHandler /* FMAC global interrupt */ + .word CORDIC_IRQHandler /* Cordic global interrupt */ + .word DMAMUX1_IRQHandler /* DMAMUX1 interrupt */ + .word MMU_IRQHandler /* MMU interrupt */ + /* need check to user manual of exti chapter */ + +/** +\* Provide weak aliases for each Exception handler to the Default_Handler. +\* As they are weak aliases, any function with the same name will override +\* this definition. +**/ + + .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 WWDG1_IRQHandler + .thumb_set WWDG1_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak RTC_TAMPER_IRQHandler + .thumb_set RTC_TAMPER_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak DMA1_Channel0_IRQHandler + .thumb_set DMA1_Channel0_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 DMA2_Channel0_IRQHandler + .thumb_set DMA2_Channel0_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_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak DMA2_Channel6_IRQHandler + .thumb_set DMA2_Channel6_IRQHandler,Default_Handler + + .weak DMA2_Channel7_IRQHandler + .thumb_set DMA2_Channel7_IRQHandler,Default_Handler + + .weak DMA3_Channel0_IRQHandler + .thumb_set DMA3_Channel0_IRQHandler,Default_Handler + + .weak DMA3_Channel1_IRQHandler + .thumb_set DMA3_Channel1_IRQHandler,Default_Handler + + .weak DMA3_Channel2_IRQHandler + .thumb_set DMA3_Channel2_IRQHandler,Default_Handler + + .weak DMA3_Channel3_IRQHandler + .thumb_set DMA3_Channel3_IRQHandler,Default_Handler + + .weak DMA3_Channel4_IRQHandler + .thumb_set DMA3_Channel4_IRQHandler,Default_Handler + + .weak DMA3_Channel5_IRQHandler + .thumb_set DMA3_Channel5_IRQHandler,Default_Handler + + .weak DMA3_Channel6_IRQHandler + .thumb_set DMA3_Channel6_IRQHandler,Default_Handler + + .weak DMA3_Channel7_IRQHandler + .thumb_set DMA3_Channel7_IRQHandler,Default_Handler + + .weak MDMA_Channel0_IRQHandler + .thumb_set MDMA_Channel0_IRQHandler,Default_Handler + + .weak MDMA_Channel1_IRQHandler + .thumb_set MDMA_Channel1_IRQHandler,Default_Handler + + .weak MDMA_Channel2_IRQHandler + .thumb_set MDMA_Channel2_IRQHandler,Default_Handler + + .weak MDMA_Channel3_IRQHandler + .thumb_set MDMA_Channel3_IRQHandler,Default_Handler + + .weak MDMA_Channel4_IRQHandler + .thumb_set MDMA_Channel4_IRQHandler,Default_Handler + + .weak MDMA_Channel5_IRQHandler + .thumb_set MDMA_Channel5_IRQHandler,Default_Handler + + .weak MDMA_Channel6_IRQHandler + .thumb_set MDMA_Channel6_IRQHandler,Default_Handler + + .weak MDMA_Channel7_IRQHandler + .thumb_set MDMA_Channel7_IRQHandler,Default_Handler + + .weak MDMA_Channel8_IRQHandler + .thumb_set MDMA_Channel8_IRQHandler,Default_Handler + + .weak MDMA_Channel9_IRQHandler + .thumb_set MDMA_Channel9_IRQHandler,Default_Handler + + .weak MDMA_Channel10_IRQHandler + .thumb_set MDMA_Channel10_IRQHandler,Default_Handler + + .weak MDMA_Channel11_IRQHandler + .thumb_set MDMA_Channel11_IRQHandler,Default_Handler + + .weak MDMA_Channel12_IRQHandler + .thumb_set MDMA_Channel12_IRQHandler,Default_Handler + + .weak MDMA_Channel13_IRQHandler + .thumb_set MDMA_Channel13_IRQHandler,Default_Handler + + .weak MDMA_Channel14_IRQHandler + .thumb_set MDMA_Channel14_IRQHandler,Default_Handler + + .weak MDMA_Channel15_IRQHandler + .thumb_set MDMA_Channel15_IRQHandler,Default_Handler + + .weak SDPU_IRQHandler + .thumb_set SDPU_IRQHandler,Default_Handler + + .weak FPU_CPU1_IRQHandler + .thumb_set FPU_CPU1_IRQHandler,Default_Handler + + .weak ECCMON_IRQHandler + .thumb_set ECCMON_IRQHandler,Default_Handler + + .weak RTC_ALARM_IRQHandler + .thumb_set RTC_ALARM_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 I2C3_EV_IRQHandler + .thumb_set I2C3_EV_IRQHandler,Default_Handler + + .weak I2C3_ER_IRQHandler + .thumb_set I2C3_ER_IRQHandler,Default_Handler + + .weak I2C4_EV_IRQHandler + .thumb_set I2C4_EV_IRQHandler,Default_Handler + + .weak I2C4_ER_IRQHandler + .thumb_set I2C4_ER_IRQHandler,Default_Handler + + .weak I2C5_EV_IRQHandler + .thumb_set I2C5_EV_IRQHandler,Default_Handler + + .weak I2C5_ER_IRQHandler + .thumb_set I2C5_ER_IRQHandler,Default_Handler + + .weak I2C6_EV_IRQHandler + .thumb_set I2C6_EV_IRQHandler,Default_Handler + + .weak I2C6_ER_IRQHandler + .thumb_set I2C6_ER_IRQHandler,Default_Handler + + .weak I2C7_EV_IRQHandler + .thumb_set I2C7_EV_IRQHandler,Default_Handler + + .weak I2C7_ER_IRQHandler + .thumb_set I2C7_ER_IRQHandler,Default_Handler + + .weak I2C8_EV_IRQHandler + .thumb_set I2C8_EV_IRQHandler,Default_Handler + + .weak I2C8_ER_IRQHandler + .thumb_set I2C8_ER_IRQHandler,Default_Handler + + .weak I2C9_EV_IRQHandler + .thumb_set I2C9_EV_IRQHandler,Default_Handler + + .weak I2C9_ER_IRQHandler + .thumb_set I2C9_ER_IRQHandler,Default_Handler + + .weak I2C10_EV_IRQHandler + .thumb_set I2C10_EV_IRQHandler,Default_Handler + + .weak I2C10_ER_IRQHandler + .thumb_set I2C10_ER_IRQHandler,Default_Handler + + .weak I2S1_IRQHandler + .thumb_set I2S1_IRQHandler,Default_Handler + + .weak I2S2_IRQHandler + .thumb_set I2S2_IRQHandler,Default_Handler + + .weak I2S3_IRQHandler + .thumb_set I2S3_IRQHandler,Default_Handler + + .weak I2S4_IRQHandler + .thumb_set I2S4_IRQHandler,Default_Handler + + .weak xSPI1_IRQHandler + .thumb_set xSPI1_IRQHandler,Default_Handler + + .weak xSPI2_IRQHandler + .thumb_set xSPI2_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak SPI4_IRQHandler + .thumb_set SPI4_IRQHandler,Default_Handler + + .weak SPI5_IRQHandler + .thumb_set SPI5_IRQHandler,Default_Handler + + .weak SPI6_IRQHandler + .thumb_set SPI6_IRQHandler,Default_Handler + + .weak SPI7_IRQHandler + .thumb_set SPI7_IRQHandler,Default_Handler + + .weak LCD_EV_IRQHandler + .thumb_set LCD_EV_IRQHandler,Default_Handler + + .weak LCD_ER_IRQHandler + .thumb_set LCD_ER_IRQHandler,Default_Handler + + .weak DVP1_IRQHandler + .thumb_set DVP1_IRQHandler,Default_Handler + + .weak DVP2_IRQHandler + .thumb_set DVP2_IRQHandler,Default_Handler + + .weak DMAMUX2_IRQHandler + .thumb_set DMAMUX2_IRQHandler,Default_Handler + + .weak USB1_HS_EPx_OUT_IRQHandler + .thumb_set USB1_HS_EPx_OUT_IRQHandler,Default_Handler + + .weak USB1_HS_EPx_IN_IRQHandler + .thumb_set USB1_HS_EPx_IN_IRQHandler,Default_Handler + + .weak USB1_HS_WKUP_IRQHandler + .thumb_set USB1_HS_WKUP_IRQHandler,Default_Handler + + .weak USB1_HS_IRQHandler + .thumb_set USB1_HS_IRQHandler,Default_Handler + + .weak USB2_HS_EPx_OUT_IRQHandler + .thumb_set USB2_HS_EPx_OUT_IRQHandler,Default_Handler + + .weak USB2_HS_EPx_IN_IRQHandler + .thumb_set USB2_HS_EPx_IN_IRQHandler,Default_Handler + + .weak USB2_HS_WKUP_IRQHandler + .thumb_set USB2_HS_WKUP_IRQHandler,Default_Handler + + .weak USB2_HS_IRQHandler + .thumb_set USB2_HS_IRQHandler,Default_Handler + + .weak ETH1_IRQHandler + .thumb_set ETH1_IRQHandler,Default_Handler + + .weak ETH1_PMT_LPI_IRQHandler + .thumb_set ETH1_PMT_LPI_IRQHandler,Default_Handler + + .weak ETH2_IRQHandler + .thumb_set ETH2_IRQHandler,Default_Handler + + .weak ETH2_PMT_LPI_IRQHandler + .thumb_set ETH2_PMT_LPI_IRQHandler,Default_Handler + + .weak FDCAN1_INT0_IRQHandler + .thumb_set FDCAN1_INT0_IRQHandler,Default_Handler + + .weak FDCAN2_INT0_IRQHandler + .thumb_set FDCAN2_INT0_IRQHandler,Default_Handler + + .weak FDCAN3_INT0_IRQHandler + .thumb_set FDCAN3_INT0_IRQHandler,Default_Handler + + .weak FDCAN4_INT0_IRQHandler + .thumb_set FDCAN4_INT0_IRQHandler,Default_Handler + + .weak FDCAN1_INT1_IRQHandler + .thumb_set FDCAN1_INT1_IRQHandler,Default_Handler + + .weak FDCAN2_INT1_IRQHandler + .thumb_set FDCAN2_INT1_IRQHandler,Default_Handler + + .weak FDCAN3_INT1_IRQHandler + .thumb_set FDCAN3_INT1_IRQHandler,Default_Handler + + .weak FDCAN4_INT1_IRQHandler + .thumb_set FDCAN4_INT1_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 USART4_IRQHandler + .thumb_set USART4_IRQHandler,Default_Handler + + .weak USART5_IRQHandler + .thumb_set USART5_IRQHandler,Default_Handler + + .weak USART6_IRQHandler + .thumb_set USART6_IRQHandler,Default_Handler + + .weak USART7_IRQHandler + .thumb_set USART7_IRQHandler,Default_Handler + + .weak USART8_IRQHandler + .thumb_set USART8_IRQHandler,Default_Handler + + .weak UART9_IRQHandler + .thumb_set UART9_IRQHandler,Default_Handler + + .weak UART10_IRQHandler + .thumb_set UART10_IRQHandler,Default_Handler + + .weak UART11_IRQHandler + .thumb_set UART11_IRQHandler,Default_Handler + + .weak UART12_IRQHandler + .thumb_set UART12_IRQHandler,Default_Handler + + .weak UART13_IRQHandler + .thumb_set UART13_IRQHandler,Default_Handler + + .weak UART14_IRQHandler + .thumb_set UART14_IRQHandler,Default_Handler + + .weak UART15_IRQHandler + .thumb_set UART15_IRQHandler,Default_Handler + + .weak LPUART1_IRQHandler + .thumb_set LPUART1_IRQHandler,Default_Handler + + .weak LPUART2_IRQHandler + .thumb_set LPUART2_IRQHandler,Default_Handler + + .weak GPU_IRQHandler + .thumb_set GPU_IRQHandler,Default_Handler + + .weak SDMMC1_IRQHandler + .thumb_set SDMMC1_IRQHandler,Default_Handler + + .weak SDMMC2_IRQHandler + .thumb_set SDMMC2_IRQHandler,Default_Handler + + .weak ADC1_IRQHandler + .thumb_set ADC1_IRQHandler,Default_Handler + + .weak ADC2_IRQHandler + .thumb_set ADC2_IRQHandler,Default_Handler + + .weak ADC3_IRQHandler + .thumb_set ADC3_IRQHandler,Default_Handler + + .weak COMP1_2_IRQHandler + .thumb_set COMP1_2_IRQHandler,Default_Handler + + .weak COMP3_4_IRQHandler + .thumb_set COMP3_4_IRQHandler,Default_Handler + + .weak SHRTIM1_INT1_IRQHandler + .thumb_set SHRTIM1_INT1_IRQHandler,Default_Handler + + .weak SHRTIM1_INT2_IRQHandler + .thumb_set SHRTIM1_INT2_IRQHandler,Default_Handler + + .weak SHRTIM1_INT3_IRQHandler + .thumb_set SHRTIM1_INT3_IRQHandler,Default_Handler + + .weak SHRTIM1_INT4_IRQHandler + .thumb_set SHRTIM1_INT4_IRQHandler,Default_Handler + + .weak SHRTIM1_INT5_IRQHandler + .thumb_set SHRTIM1_INT5_IRQHandler,Default_Handler + + .weak SHRTIM1_INT6_IRQHandler + .thumb_set SHRTIM1_INT6_IRQHandler,Default_Handler + + .weak SHRTIM1_INT7_IRQHandler + .thumb_set SHRTIM1_INT7_IRQHandler,Default_Handler + + .weak SHRTIM1_INT8_IRQHandler + .thumb_set SHRTIM1_INT8_IRQHandler,Default_Handler + + .weak SHRTIM2_INT1_IRQHandler + .thumb_set SHRTIM2_INT1_IRQHandler,Default_Handler + + .weak SHRTIM2_INT2_IRQHandler + .thumb_set SHRTIM2_INT2_IRQHandler,Default_Handler + + .weak SHRTIM2_INT3_IRQHandler + .thumb_set SHRTIM2_INT3_IRQHandler,Default_Handler + + .weak SHRTIM2_INT4_IRQHandler + .thumb_set SHRTIM2_INT4_IRQHandler,Default_Handler + + .weak SHRTIM2_INT5_IRQHandler + .thumb_set SHRTIM2_INT5_IRQHandler,Default_Handler + + .weak SHRTIM2_INT6_IRQHandler + .thumb_set SHRTIM2_INT6_IRQHandler,Default_Handler + + .weak SHRTIM2_INT7_IRQHandler + .thumb_set SHRTIM2_INT7_IRQHandler,Default_Handler + + .weak SHRTIM2_INT8_IRQHandler + .thumb_set SHRTIM2_INT8_IRQHandler,Default_Handler + + .weak FDCAN5_INT0_IRQHandler + .thumb_set FDCAN5_INT0_IRQHandler,Default_Handler + + .weak FDCAN6_INT0_IRQHandler + .thumb_set FDCAN6_INT0_IRQHandler,Default_Handler + + .weak FDCAN7_INT0_IRQHandler + .thumb_set FDCAN7_INT0_IRQHandler,Default_Handler + + .weak FDCAN8_INT0_IRQHandler + .thumb_set FDCAN8_INT0_IRQHandler,Default_Handler + + .weak FDCAN5_INT1_IRQHandler + .thumb_set FDCAN5_INT1_IRQHandler,Default_Handler + + .weak FDCAN6_INT1_IRQHandler + .thumb_set FDCAN6_INT1_IRQHandler,Default_Handler + + .weak FDCAN7_INT1_IRQHandler + .thumb_set FDCAN7_INT1_IRQHandler,Default_Handler + + .weak FDCAN8_INT1_IRQHandler + .thumb_set FDCAN8_INT1_IRQHandler,Default_Handler + + .weak DSI_IRQHandler + .thumb_set DSI_IRQHandler,Default_Handler + + .weak LPTIM5_WKUP_IRQHandler + .thumb_set LPTIM5_WKUP_IRQHandler,Default_Handler + + .weak JPEG_SGDMA_H2P_IRQHandler + .thumb_set JPEG_SGDMA_H2P_IRQHandler,Default_Handler + + .weak JPEG_SGDMA_P2H_IRQHandler + .thumb_set JPEG_SGDMA_P2H_IRQHandler,Default_Handler + + .weak WAKEUP_IO_IRQHandler + .thumb_set WAKEUP_IO_IRQHandler,Default_Handler + + .weak SEMA4_INT1_IRQHandler + .thumb_set SEMA4_INT1_IRQHandler,Default_Handler + + .weak WWDG2_RST_IRQHandler + .thumb_set WWDG2_RST_IRQHandler,Default_Handler + + .weak OTPC_IRQHandler + .thumb_set OTPC_IRQHandler,Default_Handler + + .weak FEMC_IRQHandler + .thumb_set FEMC_IRQHandler,Default_Handler + + .weak DCMUB_IRQHandler + .thumb_set DCMUB_IRQHandler,Default_Handler + + .weak DAC1_IRQHandler + .thumb_set DAC1_IRQHandler,Default_Handler + + .weak DAC2_IRQHandler + .thumb_set DAC2_IRQHandler,Default_Handler + + .weak MDMA_AHBS_ER_IRQHandler + .thumb_set MDMA_AHBS_ER_IRQHandler,Default_Handler + + .weak CM7_CATCH_READ_ER_IRQHandler + .thumb_set CM7_CATCH_READ_ER_IRQHandler,Default_Handler + + .weak DAC3_IRQHandler + .thumb_set DAC3_IRQHandler,Default_Handler + + .weak DAC4_IRQHandler + .thumb_set DAC4_IRQHandler,Default_Handler + + .weak EMC_IRQHandler + .thumb_set EMC_IRQHandler,Default_Handler + + .weak DAC5_IRQHandler + .thumb_set DAC5_IRQHandler,Default_Handler + + .weak DAC6_IRQHandler + .thumb_set DAC6_IRQHandler,Default_Handler + + .weak ESC_OPB_IRQHandler + .thumb_set ESC_OPB_IRQHandler,Default_Handler + + .weak ESC_SYNC0_IRQHandler + .thumb_set ESC_SYNC0_IRQHandler,Default_Handler + + .weak ESC_SYNC1_IRQHandler + .thumb_set ESC_SYNC1_IRQHandler,Default_Handler + + .weak ESC_WRP_IRQHandler + .thumb_set ESC_WRP_IRQHandler,Default_Handler + + .weak ATIM1_BRK_IRQHandler + .thumb_set ATIM1_BRK_IRQHandler,Default_Handler + + .weak ATIM1_TRG_COM_IRQHandler + .thumb_set ATIM1_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM1_CC_IRQHandler + .thumb_set ATIM1_CC_IRQHandler,Default_Handler + + .weak ATIM1_UP_IRQHandler + .thumb_set ATIM1_UP_IRQHandler,Default_Handler + + .weak ATIM2_BRK_IRQHandler + .thumb_set ATIM2_BRK_IRQHandler,Default_Handler + + .weak ATIM2_TRG_COM_IRQHandler + .thumb_set ATIM2_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM2_CC_IRQHandler + .thumb_set ATIM2_CC_IRQHandler,Default_Handler + + .weak ATIM2_UP_IRQHandler + .thumb_set ATIM2_UP_IRQHandler,Default_Handler + + .weak ATIM3_BRK_IRQHandler + .thumb_set ATIM3_BRK_IRQHandler,Default_Handler + + .weak ATIM3_TRG_COM_IRQHandler + .thumb_set ATIM3_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM3_CC_IRQHandler + .thumb_set ATIM3_CC_IRQHandler,Default_Handler + + .weak ATIM3_UP_IRQHandler + .thumb_set ATIM3_UP_IRQHandler,Default_Handler + + .weak ATIM4_BRK_IRQHandler + .thumb_set ATIM4_BRK_IRQHandler,Default_Handler + + .weak ATIM4_TRG_COM_IRQHandler + .thumb_set ATIM4_TRG_COM_IRQHandler,Default_Handler + + .weak ATIM4_CC_IRQHandler + .thumb_set ATIM4_CC_IRQHandler,Default_Handler + + .weak ATIM4_UP_IRQHandler + .thumb_set ATIM4_UP_IRQHandler,Default_Handler + + .weak GTIMA1_IRQHandler + .thumb_set GTIMA1_IRQHandler,Default_Handler + + .weak GTIMA2_IRQHandler + .thumb_set GTIMA2_IRQHandler,Default_Handler + + .weak GTIMA3_IRQHandler + .thumb_set GTIMA3_IRQHandler,Default_Handler + + .weak GTIMA4_IRQHandler + .thumb_set GTIMA4_IRQHandler,Default_Handler + + .weak GTIMA5_IRQHandler + .thumb_set GTIMA5_IRQHandler,Default_Handler + + .weak GTIMA6_IRQHandler + .thumb_set GTIMA6_IRQHandler,Default_Handler + + .weak GTIMA7_IRQHandler + .thumb_set GTIMA7_IRQHandler,Default_Handler + + .weak GTIMB1_IRQHandler + .thumb_set GTIMB1_IRQHandler,Default_Handler + + .weak GTIMB2_IRQHandler + .thumb_set GTIMB2_IRQHandler,Default_Handler + + .weak GTIMB3_IRQHandler + .thumb_set GTIMB3_IRQHandler,Default_Handler + + .weak BTIM1_IRQHandler + .thumb_set BTIM1_IRQHandler,Default_Handler + + .weak BTIM2_IRQHandler + .thumb_set BTIM2_IRQHandler,Default_Handler + + .weak BTIM3_IRQHandler + .thumb_set BTIM3_IRQHandler,Default_Handler + + .weak BTIM4_IRQHandler + .thumb_set BTIM4_IRQHandler,Default_Handler + + .weak LPTIM1_WKUP_IRQHandler + .thumb_set LPTIM1_WKUP_IRQHandler,Default_Handler + + .weak LPTIM2_WKUP_IRQHandler + .thumb_set LPTIM2_WKUP_IRQHandler,Default_Handler + + .weak LPTIM3_WKUP_IRQHandler + .thumb_set LPTIM3_WKUP_IRQHandler,Default_Handler + + .weak LPTIM4_WKUP_IRQHandler + .thumb_set LPTIM4_WKUP_IRQHandler,Default_Handler + + .weak DSMU_FLT0_IRQHandler + .thumb_set DSMU_FLT0_IRQHandler,Default_Handler + + .weak DSMU_FLT1_IRQHandler + .thumb_set DSMU_FLT1_IRQHandler,Default_Handler + + .weak DSMU_FLT2_IRQHandler + .thumb_set DSMU_FLT2_IRQHandler,Default_Handler + + .weak DSMU_FLT3_IRQHandler + .thumb_set DSMU_FLT3_IRQHandler,Default_Handler + + .weak FMAC_IRQHandler + .thumb_set FMAC_IRQHandler,Default_Handler + + .weak CORDIC_IRQHandler + .thumb_set CORDIC_IRQHandler,Default_Handler + + .weak DMAMUX1_IRQHandler + .thumb_set DMAMUX1_IRQHandler,Default_Handler + + .weak MMU_IRQHandler + .thumb_set MMU_IRQHandler,Default_Handler diff --git "a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/\346\226\260\347\211\210keil_pack\345\214\205\350\243\205\344\270\215\344\270\212\347\232\204\347\202\271\346\210\221.txt" "b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/\346\226\260\347\211\210keil_pack\345\214\205\350\243\205\344\270\215\344\270\212\347\232\204\347\202\271\346\210\221.txt" new file mode 100644 index 0000000000..0e68390e48 --- /dev/null +++ "b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Cube_Config/\346\226\260\347\211\210keil_pack\345\214\205\350\243\205\344\270\215\344\270\212\347\232\204\347\202\271\346\210\221.txt" @@ -0,0 +1,4 @@ +由于keil更改了pack包的安装方式。导致pack安装失败。 +参考解决方法: +鼠标右键,打开方式中,更改一下安装包的执行文件,以此执行: +*/Keil_v5/UV4/PackUnzip.exe \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/Kconfig b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Kconfig new file mode 100644 index 0000000000..0ac364d0bf --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/Kconfig @@ -0,0 +1,165 @@ +menu "Hardware Drivers Config" + +menu "Onboard Peripheral Drivers" + +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_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + + config BSP_UART1_TX_USING_DMA + bool "Enable UART1 TX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + config BSP_UART2_TX_USING_DMA + bool "Enable UART2 TX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA + default n + + config BSP_UART3_TX_USING_DMA + bool "Enable UART3 TX DMA" + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA + default n + + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif + + menuconfig BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 0 64 + default 22 + + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 0 64 + default 23 + endif + + menuconfig BSP_USING_HARD_I2C + bool "Enable Hard I2C BUS" + default n + select RT_USING_I2C + if BSP_USING_HARD_I2C + config BSP_USING_HARD_I2C1 + bool "Enable I2C1 BUS" + default n + + config BSP_I2C1_RX_USING_DMA + bool "Enable I2C1 RX DMA" + depends on BSP_USING_HARD_I2C1 + default n + + config BSP_I2C1_TX_USING_DMA + bool "Enable i2c1 TX DMA" + depends on BSP_USING_HARD_I2C1 + 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_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 + + source "$BSP_DIR/../libraries/N32_Drivers/drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/SConscript b/bsp/n32/n32hxxx/n32h760zil7-stb/board/SConscript new file mode 100644 index 0000000000..5b2e3b94e6 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/SConscript @@ -0,0 +1,93 @@ +from building import * +import os + +# Import environment variables +Import('env') + +# Defined groups +groups = [] +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +''') +path = [cwd] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path) +# Append Drivers group to groups +groups.append(group) + +# add std-library file +path = [os.path.join(cwd, 'Cube_Config/Driver/CMSIS/core')] +path += [os.path.join(cwd, 'Cube_Config/Driver/CMSIS/device')] +path += [os.path.join(cwd, 'Cube_Config/Driver/n32h76x_78x_std_periph_driver/inc')] + +# You can select chips from the list above +CPPDEFINES = ['N32H76x', 'CORE_CM7', 'USING_TCM', 'USE_STDPERIPH_DRIVER'] + +# You can select chip's startup file +if rtconfig.PLATFORM in ['gcc', 'llvm-arm']: + src = [os.path.join(cwd, 'Cube_Config', 'startup', 'startup_n32h73x_76x_gcc.s')] +elif rtconfig.PLATFORM in ['armcc', 'armclang']: + src = [os.path.join(cwd, 'Cube_Config', 'startup', 'startup_n32h73x_76x.s')] +elif rtconfig.PLATFORM in ['iccarm']: + src = [os.path.join(cwd, 'Cube_Config', 'startup', 'startup_n32h73x_76x_EWARM.s')] + +src_path = os.path.join(cwd, 'Cube_Config/Driver') + +# You can select library file +src += [ +os.path.join(src_path, 'CMSIS/device/system_n32h76x_78x.c'), +os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/misc.c'), +os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_gpio.c'), +os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_mmu.c'), +os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_dma.c'), +os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_dmamux.c'), +os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_pwr.c'), +os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_rcc.c'), +os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_dbg.c'), +os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_exti.c'), +] + +if GetDepend(['RT_USING_SERIAL']) or GetDepend(['RT_USING_NANO', 'RT_USING_CONSOLE']): + src += [os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_usart.c')] + +if GetDepend(['RT_USING_I2C']): + src += [os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_i2c.c')] + +if GetDepend(['RT_USING_SPI']): + src += [os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_spi.c')] + +if GetDepend(['RT_USING_ADC']): + src += [os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_adc.c')] + +if GetDepend(['RT_USING_RTC']): + src += [os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_rtc.c')] + +if GetDepend(['RT_USING_WDT']): + src += [os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_iwdg.c')] + src += [os.path.join(src_path, 'n32h76x_78x_std_periph_driver/src/n32h76x_78x_wwdg.c')] + +# Defined Libraries group +group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) +# Append Libraries group to groups +groups.append(group) + +# Defined Drivers group sorece file +src = [os.path.join(cwd, 'Cube_Config', 'USER', 'src', 'n32h76x_78x_cfg.c')] +# Defined Drivers group header file path +path = [os.path.join(cwd, 'Cube_Config/USER/inc')] +# Defined Drivers group +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path) +# Append Drivers group to groups +groups.append(group) + +# if os.path.isfile(os.path.join(cwd, "ports", 'SConscript')): +# group = group + SConscript(os.path.join("ports", 'SConscript')) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('groups') diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/board.c b/bsp/n32/n32hxxx/n32h760zil7-stb/board/board.c new file mode 100644 index 0000000000..ccf54527af --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/board.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#include "board.h" + + +/** + * @brief System_Initialize + * @param None + * @retval None + */ +void System_Initialize(void) +{ + /* Copy Vert Table to ITCM */ + CopyVectTable(FLASH_BASE, ITCM_BASE, VECT_SIZE); + + /* Initialize system clock and enable Peripheral clock */ + RCC_Configuration(); + +#ifdef N32H78x + /* Enable Cortex-M4 boot*/ + RCC_EnableCM4(0x15080000); +#endif + + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); + + /* Config Peripheral GPIO */ + GPIO_Configuration(); +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/board.h b/bsp/n32/n32hxxx/n32h760zil7-stb/board/board.h new file mode 100644 index 0000000000..beff185963 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/board.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-24 ox-horse first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include "n32h76x_78x.h" +#include "n32h76x_78x_gpio.h" +#include "n32h76x_78x_exti.h" +#include "n32h76x_78x_usart.h" +#include "n32h76x_78x_dbg.h" +#include "n32h76x_78x_pwr.h" +#include "n32h76x_78x_cfg.h" +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define N32_FLASH_START_ADRESS ((uint32_t)0x15000000) +#define N32_FLASH_SIZE ((2 *1024 * 1024) - (128 * 1024)) +#define N32_FLASH_END_ADDRESS ((uint32_t)(N32_FLASH_START_ADRESS + N32_FLASH_SIZE)) + +#define N32_SRAM_SIZE (128) +#define N32_SRAM_END (0x24000000 + N32_SRAM_SIZE * 1024) + +#if defined(__ARMCC_VERSION) +extern int Image$$RW_AXI_SRAM$$ZI$$Limit; +#define HEAP_BEGIN (&Image$$RW_AXI_SRAM$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN (&__bss_end) +#endif + +#define HEAP_END N32_SRAM_END + +void System_Initialize(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.icf b/bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.icf new file mode 100644 index 0000000000..00962f0740 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.icf @@ -0,0 +1,63 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_1.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x15000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_IROM1_start__ = 0x15000000; +define symbol __ICFEDIT_region_IROM1_end__ = 0x151DFFFF; +define symbol __ICFEDIT_region_IROM2_start__ = 0x0; +define symbol __ICFEDIT_region_IROM2_end__ = 0x0; +define symbol __ICFEDIT_region_EROM1_start__ = 0x0; +define symbol __ICFEDIT_region_EROM1_end__ = 0x0; +define symbol __ICFEDIT_region_EROM2_start__ = 0x0; +define symbol __ICFEDIT_region_EROM2_end__ = 0x0; +define symbol __ICFEDIT_region_EROM3_start__ = 0x0; +define symbol __ICFEDIT_region_EROM3_end__ = 0x0; +define symbol __ICFEDIT_region_IRAM1_start__ = 0x24000000; +define symbol __ICFEDIT_region_IRAM1_end__ = 0x2401FFFF; +define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; +define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +define symbol __ICFEDIT_size_heap__ = 0x000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region IROM_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__] + | mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; +define region EROM_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__] + | mem:[from __ICFEDIT_region_EROM2_start__ to __ICFEDIT_region_EROM2_end__] + | mem:[from __ICFEDIT_region_EROM3_start__ to __ICFEDIT_region_EROM3_end__]; +define region IRAM_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__] + | mem:[from __ICFEDIT_region_IRAM2_start__ to __ICFEDIT_region_IRAM2_end__]; +define region ERAM_region = mem:[from __ICFEDIT_region_ERAM1_start__ to __ICFEDIT_region_ERAM1_end__] + | mem:[from __ICFEDIT_region_ERAM2_start__ to __ICFEDIT_region_ERAM2_end__] + | mem:[from __ICFEDIT_region_ERAM3_start__ to __ICFEDIT_region_ERAM3_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +do not initialize { section .noinit }; +initialize by copy { readwrite }; +if (isdefinedsymbol(__USE_DLIB_PERTHREAD)) +{ + // Required in a multi-threaded application + initialize by copy with packing = none { section __DLIB_PERTHREAD }; +} + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in IROM_region { readonly }; +place in EROM_region { readonly section application_specific_ro }; +place in IRAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP }; +place in ERAM_region { readwrite section application_specific_rw }; \ No newline at end of file diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.lds b/bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.lds new file mode 100644 index 0000000000..ce67ebfbf8 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.lds @@ -0,0 +1,157 @@ +/* + * linker script for N32H76x with GNU ld + * SummerGift 2026.1.24 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x15000000, LENGTH = 1920k /* 1920KB flash */ + RAM (rw) : ORIGIN = 0x24000000, LENGTH = 128k /* 128K AXI_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 = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.sct b/bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.sct new file mode 100644 index 0000000000..73bdb11713 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/board/linker_scripts/link.sct @@ -0,0 +1,25 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x15000000 0x001E0000 { ; load region size_region + ER_IROM1 0x15000000 0x001E0000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + startup_n32h7*.o (+RO) + system_n32h7*.o (+RO) + } + + ;ITCM + RW_ITCM 0x00000400 0x0003FC00 { ;256K ITCM offset 0x400 for VECTOR TABLE + .ANY (+RO) + .ANY (+XO) + } + + ;AXI SRAM + RW_AXI_SRAM 0x24000000 0x00020000 { ; 128K AXI-SRAM stack + *(STACK) + .ANY (+RW +ZI) + } +} + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/figures/board.jpg b/bsp/n32/n32hxxx/n32h760zil7-stb/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..151a8074f8c6a687bd23e3f98223689a1b4d81df GIT binary patch literal 3188413 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 z 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
0g(N79Pb7Nh)7qbBrrkD~9-#3s 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°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 z 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�CZa2_LnZ8!%B&g5C`7%rd{hgg~*1&Nl1d-ennHXXW!PkZ8N~JTgNru ziSI?FxC3ZLUB~et{#dRrQI}4aQ6o$&){(9hzuqI)Gy$!p_?J}EW4L=#7~qD_Bm9cs z^;_Gkku=j0zF9Xp>@(2Uq(iOQFNIEtV{f+d;h0M!D9BQCoY4LclUnescKS($wFjI_ zA(64R6yqO_0CWBs)&aDR%KAr^(g_QBLx4>eDL$cm7%4d2DGb zC2l#vt2zd^qS$HjTU}atk~Vge-hepErTbGxulJ+C7_Eu)o7i+O?O5X`FEe2|=uJBN zRIrxSE$!`ADT8wPq)kfW>|fbR+o5;fM{J7B4t)U2gVnjurYl<8Qd?VgiZtBBm|~!Bhz=QyhG+?>6!rBk6N@_LoL*0<#oW@&{kdkkn`#3 zslm7B;gog7V+r0!ytlv#axqse?k8ACJG`)SgIWO{m9)1Gu||c6LEXN z?o;baEyUV&qTHr;%lAj9qe<}v%rT|B=w2=Rh&`wQ@@jWiCOB@&nB&00_N~wC>lt*{ zSXjw)@&co>ipAD7OI!U)Ynv-iv)iiSSNq=ecf&G$s#!kQbe55Y$Su^G0HtrHU71Q+ zA(4US1E8w+8osLpGT6Ptg=4g?dR3IyH61eUV`C;z{H2JjnPPoH=sOXF7tGlQa0Np?PLO2rM(cC4$#xvB{bD;RD<3+zsGU3nyb~f+f0=)kKNxh!N z`WXQ8HaNgz>rv`^Z!f33W3}XRN{-o}4^7v#eLr2jdwWM|5wVZ%*PC3%_H!5)1cE^x zf~Ah*>`fH0=O_kGt#-Orqv51!wJZBJp5fGhr|y$L8G5&g@AaJ~+ev$LiDDoJQ`vh~ zJ;ZhvRxt@n2Dqz=FvzaDyBR>U+B$9p2Xi4H7 zHsZzYq|-rWUL*(js}|aJk-Vq*LFtcL0Ew+GE-v0XDBf*@u;#k$FT_{c4xe?U7{eQZ zgS+o3J!+PltX%0&FWDR^f0Xf_l~Yr+cQD>XAY(Yovvth?M;?Q9c_9{yy+Rixc3$

%1Z^E+mj}7Wx7u1?RwRs`e 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%0A+X^ zQf!4}hD>MNSLUO=#FDg~L%T31)sAcI?}+-4)4UIT6m5?>BO3lS@(rpk#UNxL#(xU> z&KSep%4dn3Ph>I`xNnpaG4EHB8=yCCC-JKgMZQ7JX&6}!zGg>3S27twtiaex#gx*Haa=lJEvaS^EHpWOX&QiLyBFvCKy7o_*>_>}MyJKb>?9 z69cnmDW)b~aYc;zk%(<3Q@3~PN7?7WP~WX@d0>E8QCGqetAS_uMz*rLI6nl|?=Nn&&Lsglm;0OXIxx)E+TYzmQKE>1=OqQW`j zYc4Uk{&WjT_kH8}*7L@pfC?#geEcmI1D$(W$irto)f!ve50GSiYod}cAD*7o9HKOj zBl9(#$EnY>Gp8hzK8TG8?j${6;{xohUbJ5aBm*k0ouTtFlJo*qz=S;*WaH3 ze`#+MuBiuyW+M91QUpR%`^cDo4o^^hE8%l~8kIZLr>XThW_G1$O`m<~ap^Ym-%GA3 zn&Ktd8V+#7t!3DKuE$dQW&)`h8TaX1%ILE_^l^c4Fw3KMC#`cb&E}G`lIl-E>N;1) zHEkL6>EC0}-tu1;cz$ac8DeWe<~Grd#d`|!7qGdrx={}zPF1?#``4=Inw5dKOIr(U zC>vxaf^%I>{*U44JUaJNv9@VfA1MWc`%{R|2h_i`1Wg3)0Sm(lzv1?nOS#Zv zi|tzz?NIrHZb>8FnV7JdBe;qpNQPAN4o__4n(RDd;oU!6(-&RPl(eXU9Ta~KI@dp- zi8cGXX=lR~A~1shZRjfJk1npPHN&E55}SA)Bn4vb$BY^P<2*liZ*3z_EIb7Oj?6`N z-YeH&*KDG{@{AVtA1E2_;|9F)0B!9gu^{=1{{S$@Cp`sCtm-d!V;_g?<1r*^9&kA< z;n|M z*7g~QV5kH8t?OF96toCzuA!4hMYoDLm5MJ;4QKdze-GYT%X6zUE!54oBNzZs2Rp0y zk6XIXq0w!&LkhWLw}O7P>Ruc0hLx@OY8!j2g^vFK2LV`dk7}tuf~_@+6MLmdtp%b; zSe^?o=N06Z_t(ic{7Z`&8zFqMbDoBQ8hXy1J&p95d})~?J0EGn=e8>5rQpqPM1?OV zwl4&zjpixH1-n&i`>A2OjtiyRGd2$6$UgPbw~23-#vLZ^g3>5qCM{`&At?#CMt=k#lEY zi#bJaoXKpMU%w9;Dj?d%-M4YHI2(4L?g^Qb=2r(Cl`xmq$xp13Ee&2D&h{up&A zKeU0C7iHe3)7*V)rtxk5ooTKJbU2g;K++s%E`7d~0m5q6I)rg74RIkif4*TMB!4>U z^zRdDdUuAdbd59xmS$)3kKR#$8w1yYgP+2(E|M$lK{Xr2EpHi6RX8LMO7t7OL%~|c zmHnS(ViAQlRp{WPCkjMbZV_hA-sckYfln{uNADO*rTTTAX zzVc)NnOmH96^`i}>JrBaozgcRf`C0{@8QeIqyGSDMW{ws%Mxv5z{mUf{*~j`Q8Pxi z5goC!hi>`6#d>|0hxI$zt+atL^5i9+J?Cm*XCwjzaoUZH`aZh$_ec-fWD3|h1RwDS zGyv;a&4R+voCNee>$1G@T-v9Hp2eXH=rr zAm_hY?!0H>y+2#F(;~8gyz3=k?%3!+7$00_fD={lwZ4&|+h6^;C7wl4%AAjS;O5!q zKH<0lfq~aOtFN`Yvb@st`zv#{`A=5fH22K#(1C)EqLxE ziB|=4^A5)q$_AF(P;L8;?m6rQbee_bu%4irzq2V~j8(@yA-d=n-sjdPRTU+0?#&0u(gTa0cZV*rU+(?9sAO)KbQx? zd2jYpGjMac93MkoziaU0PSq^#OEi;87bTH`sLx^QYs)(fi{A<_jRcylmZV~{3KXJ@ z9lh(Nu+}uK6Ux)H6k7-4G_>ri`bvN3XCrOuT zL^#Rq`Bo=_{0$ZUnW$?Twr!1|A){f8x4m@Gcu&G}=@4q7;jL#-cd1VZOLO9FXI7L=1AVFAjDk)xUe}|=qj={*Z3_8|8%`1W55qSxx4XdB-fWIh@#t<8SnYmIpO$zCu?)> z(Na5mJ3?M2akPQhS3?G~q4>YV>u-5uvMWr2?0)ba>gJ{5Tdf`mpGTGL&^8rOeo~{{ z&;=juO>Xm3g6m#Wb#ZI*GLMl{o=L8gNBEK9L#keAmsWuxT$W>rGJP>#Ji4Z(t=!LN zVdl$oIo-8-w(nC~k$4AN(WU;{p2r7o?-zDTk5fP%o8k)}2l&!9d7=9-gklHIz(^cr zMQ40D@YS7-?aVT2yWI$VrAE_^*>2Ux>0T{IWRiA`ZPBnxkTM5aX057f9yZig&%%h2 z+oufc)aTTW)B)(;E%8>Bs7{G_s78?6$Uud9$?uxTyw`P2b5*v|Gz)(&$Vbo)Up>w% zFH-nFr$J-=zZSFhyVw_SMk-@${{RTbda0v$U*gw?_v#u&q+h;36nTrdD|;FPLr+@J zz8+~>u!B>*cfAR@qa6XqLyvmvJU!t500&*^zuI<+CcQ#iD#vgghAY6eT?fUQ4g8)V z)@|LM(l=R;)*fY|PP4Hl)N1sqe*iacEu>@kQRHuQSAwT%GA2cJ0Sc&VV>AQ^mT5 zqX+hMO0e4_x0Z;ce5CMAdiRGke-~c(F6JAnoU0QI<)kI8(clqoM1? zeI?+1SHsuV32mgR8<>=Nz^D(qx%aFO6#oFi5v|w@(L5`88mysEfg^viMR6Na*Hw!5 z!z=b{x#PruwihS46d4{z`(^xGz3`@kY2iH8M@%P2LkBmMk>pGUDaAr2LeVH=BfLOgSanzpG;&*zTwY(BaPs+Z7IW_nB z4qBm4neKe1XNu;RDI}MX+e5lW3Ozk*hSq#WWCl3jYWfcU09xnu4NB(ncIq?yJ;iJ2 zUKhI5NCqP-vEUEuUrO4FyF9D6qB-#$?ehT&=Xd2>dT)nsuO$#i3pB@oplAO8tzQ2C z;m?JTtZO!;%&d9x(}9n6uV1j!G_5Qwb~ecn9DJiBpL1S)Y{@MmbyL8}>m%nKBjGNm zG-hj+@;yQ8T|SxcdL@(2xxOT4g(IbV&@a4|81&6Y98<|5EI|j_yvgILKBs(ea7UXr z!W}k1H(yE5psZ`(fY$6p*7})TpW+#>b&5HI2-!&$B)LQiE0yD_cQ;sQc0Omj_!+H0 z43=7i7ajJtL9Pd0_z8d&jS$3UmmJ5UYNyT`liM}3P=yLg@ zGbCM|M<0!S1|L1AJtd<&s@Ypx9wOF~InLUaD`^mLxHZ@fIz*I`wJKSLZ=EnJ(O9TR z^W7GXPwdi4yGW`s>GBuA72caw zhN%OWOD8#F+NF*XREpX17=ATs3l&t!9cTlX5U_uitc!QXMRdt&5CN< zX9AmMnX%Vx2z z>~mXjI+%b16t6!;0wE9fPOoPaqY+9Q`N}%ztLIodzk5 zVA1fxx|N8Lo<=DeHFJin%??%U2Eakw!qQz!j4+5IeZB3y`#b^d3cFN7S z6(U<0+nUgf5Z^HCR?^dd&N(%h8R==i9A>`d{fg7e@y@jlcKNz^KljTT_{tb0jlg~@ z?%&v^$9Ic0%as9~+3XzqoZ`5%ReBOS@JsiI^AFnU-6Z&%X)qaQ)A{Z9Nw1Y-vrVla z9E$qK_P@81KZrV1#C-P_E=uRpQoL8nR^-Hi2s@jxuQx23jU<`diGy-0`2e0pd#{G1 zX82XCSVn$!zOZ5JyRc8|UPBT*o4!i)uM14kXc~pH{GsQ!{M6)ECV3?)Ryy*?HBnsq zr@)iTW$Co|->&$R`kw#SObGsk6{{R?%8u$z0x9qp^KSl8Nr48NYuL9mqeB|8C8%41Z z0XP65+B>m6wfS4%9X)5X8k=qklSUBqKXU~BweyB;EhUyji4o^Qu0n;%XFQRN^Zpg| zZ-eLiW{IWSME+Dqc5#vO4!OoXtIMSg4%qv*KWIN;=Xd>^{5)J^{VP)g>GtWX^0)p9 zNu*C_@!Bb8e>OYqIhb*b0Kop6vG`Z&{{ZY&5s&t6@Tu(YeB=HFc`^QV@K5{|H^T32 zulOs*9Qik}+}OGFbp7D`#dF6>h{B)7$Uoqk{vrD>iR|rXlx^4aYnyy_GU>A^QSN-U zZ_2+yyjygdZoh97>Y1~+3%!p%TOI~JhQA?yV*O>jIq?JGH0M55#;d4l@{Y&tP&`O~ z6CkhM4;*M>S4~z6Xy$Q%`-Vv?%AdoZ(ytXBrn1sjJWo)z)jT~Vvs%xX?wWS;cVsCC zggLD%>w7;GTH47y!^W{?3{jln@$FS(Kibo@I<$!tu35fbpmfLw*18P~!*6M)YD=d( zOL++eqh-e_&jfmkaNpOEc<4{He>=amHmR@p%l3u%gRl6gV^CdA zOLBnaB97DdD;oPCKt8qoPU!l6kr7=^!W0w5ZbtF`*CaRPU&@b-B)!+-*8EF%BTsj! z>a)o_?s89?BObo>tsjXp>3humRQ~{iPQ_!Vd_M920Eli5)|Xa-+_~UwNDzVl0FQpP zm;V3-W_Q#tJ{;*$xZ1I5QjzFb!l3>=E7m{YmAWLhp8<8d%a~Q+)Oy0~q>XSD}fYG!qFz z=jea!1@MUJ-?4who6T^?Z?Cqq{l9SpZV#6vQmjn41oP#y5IgZ-A^ycT8g8ZFjbFn$ zo%A*yZTH#~%;5_v_1Zd>Cx~wr z_B%-BXszM-b|Jty>$}#t=~24Wr7Iu2zYpz5{g;1fi&;;d_IrD>u5d$$tT%!VI%H&h zYlHa9V9@@|{{XX`(mq-A$D1eqo^0Wm4}K3?x%(%r#pmoV@!D1fZ?tJzkp!HQ<4tk2 zpJfVv8r1l(ia%yA+1NMC@Mv0c6WIaLEQueFU&guW#>0d6ta$$b!g+D2!zTT^>@Gw4 zf-{fhn*93ltfonB?j$>(&A2@EU`Zd+zd(Ky!@enR9r5;cnHTW}zdt-ik9}vUvi!me znTYi&%y|4O(aGJaT;;|uai2X}s0yPwIp($?QpwC&KJmpIQ_{Q{kJ z%6yEWE@M|uPv3vLitg;xnKB1zl$cvJ>$E7tiL!!@8_*#*tkNh<9{IRY4KYrvBR^+2RmDAGAmsP0mx(dC`ihL~ag1bE z=Q)(tN%^xtSf}MO3;~?fs}6WIb6^A&=AW3thCS$43ltXII3RYRt@#QM z6{LVK7~s>6&BxlQTr6iBagCyw(1bVxHGN4hfGTEOFvzE=CTEcBy)jY?bpw%FELWx| zU5;^@dVxpE+ku`9SC%8cj+Ljd6Vs7VNf{@l7XpEds`RI=x!IQQS22--DXN_F+MU48 zYj!69@jyeI1JbmaFfc!gqVj;?9(&Y*NWjIw>J1-f0!|KU=|;xU-lY3DRo(nl0aXRI`4|AvVB{&h z0!)L{REr2*r|)8>jUQoP4n66tN;VskX)NMiRZ>j-(4>#8 zT7)Q&4)~cvNFhvTS zBzeYLfHFzzlg4Z4zlp!J-@*@!pR;=SQ^t{8j~+Y-s}X}K4g7qWM8hB>bA`@uNItdH zd{O;~{3+wMlgB@^_OokdnzOyf*jc>mH+hL-@JPAx%N(`|AZHw6zdgKb;6D<4IM(Ix zpNsV8)3u909zowmZ;MDgU)uxV~D zY~uuu(ZpB}%$oU&;;-!o@lRj)o#IQaKVG}itn|CdEo?2Ll&T^?c9K9iB#;gW^-D~1pZQ`dH^yJEkB$6OwUdmRC+Cb;)@YGewBPyf&Tz!f7ts`@Fm=X zRh-#HUn_<5Bo;@rO^H0f{t` zCUg9FY;?z=uZOQK+HicqwNFa@1pSdC{>b=c@iq&Kca84sRoIo=nD(|h{bU^w8zgZj~FVRNbYfLKCE`$fVi$0wX-u0VY4ZpG#~MYc$> z*MNexbnRx_Lh*!mj=wFu;rJNfU{~hY?a#Qwd?)GG!C&nE014i9B23&9J*$3#C^^BMdNd59wbmcnedu*CKn_icRNQq{|o>PyqYCTKaWAm%_ho5(dVb2`|{qjGk+$=_&w8=hWAzc%sE@CHpR+VGI4Soo;40EAsyU9)Fd5>EV9`THpAK zSzoj@wwNS^&?ZAlpplG@!}``W8PJb+@olB2h;DT4b;xMOS8^T-o|&#j8@me~ZBhu; z;N?^va`@|A_2s+~=#c1kGAv;mXg}=Yyprh#jXWA;@fVs`J6v|G0Ht%`+e=+~=UVc? zp74CD{oD?syPYW8OQ%adt2v2c!Y=F#=lRxVwPksw-9f0{ZFHJ5wmkG8ahm4!FAeHf zTE>&9&g5ChyNqO{r`$)%^BwkCtI-2tD5a_Z)Wj>p@x_qQ49SN^P z77uaZZBhtFmpoF9oc-L<;VXEqY#v=ii;JQPoS))elw1yS4PNHYN3qhRz_%*Eu^l$_ ztNg6u81oT!pHu8>i;GQ+__aKSd9Flm9aMDycluXVr^Bb{cYah75pj0g zi9LZGslN^_KG)(e6>8Ek4W>usM}yS5o@!zTp7y2W>2;f-@6kZ7Srdl#;H)_+uQc0XP4@?u@xv2FmSUd)|{u4#qsJyx0nxko~L856=Y8R8UN^`UxywwPrpzYl!Y%2^B82CsHMlZf-pdc<;q)eK$qZBZlFld&NeGk~ss^Rm)&L zJ6j!+w*GU;6kM;8xL!c*NY^E#${tw$l`Zzs0e0XHN%pKE@gqijQR6$qbK;xkJb^9% zJmYA^Lu+jrj4>I_ORwpd`i1VbtXo@1_SVybD=HEr3`hlt>6{!@O9@I1k{$(qpOsB} zB#(^DV)^b~F{(%~yjIi^0yeK|ryL?@1#40!NJ&k+wR<$rE@k+T1;#lwI@*xOa^wna zxe_-$t5irak4p3@oU$^$%Nfb?@li=@Cq=E5i84v!cOX>H%9TGUVS!x)7}oY%z-H}J zwV-Ji1LgFsyL)K%fH@eh;N?OZbF z7q>fq2WtH={f>O)_;IcMoM0V7Kz|tP^M_Ogwf$M2lDC&XtgI`^!+#!UeP7|D^iRQ) ziyzol^-Jt%^vl423}DGAKi0ex_8$0krfXjlqVZO#0G>Yz+AQ#+457K06h>7*B6GVU;f! z`-FEj@K3}af&M=DW<*{q)0QhYIEv*MO9PNI^0@n_)KjGjGKyO?Xw><&J(u=1(d=9H zfxgr&)P0`H*HCCPkGk@Jt;bBKPpxkL(7&{w#aj=HTHl6zEv)|lX6c$liEfd`fR;N$ z62#{xpGwaCilmlLi#mm}jn4XHtfYDZGn(~3ir=xvk341LolnLd9KW<5+OjOpla@lQ zfW1ID&O21p<@Ubu4l+>pPP6t#__5;OirQz2bRQkax{Uf$Mp9N#3&kj5w2x3%t$ui2 z{5gYB_}h8lNu)OL-s|6G-nbiKnaMa9``dT}*8;y$J`4O6z5Sp3H{vaGTD(i^+nD^< z7V5${(iJ#Sy9JI(>?`tX#6BRt*1S)5;`!xhZm#Z)&hc!C zs-Lun#Z6Q8W%zO7e+GOdg5OP-P%m$8#xQ)iAz$7$*1#@UkC>jPy>tHnvWLX45PW9v zUyHmY@e)t%Ic$P{`LIlo&ZhyfjzbPTtMiw}{{Rs@Vev5Ozwnjn5^4uajKvE}$q2_M zr*nam?O&vyv8RJ!_+Rjg#eW#QRD#OeQH;%QB{%}w(N5MQ{+d7CrHjL=RPO#Oij=wC zkIX-cJ`J0|zCG6bAwF@ZT{o7_HnT$DG8}#;yu(wq+h}~c_0Jvnms$9o;=Au3YwlL_ zRFKF~MiMx|!YCfYt$899Lk_CEq>viVmRNZVRGGYoZKuWZ-qPr`WZ4x3}BJ)0zxK&j@lZVJP&&rH|m zzr$@tS+C*IY!I~9QVg7K$WhS!EA+dM7-QdT8X^D*vm+P>M6;jKQ) zVSTn^DljJ2OJlRqwP0-pt<(Us z{L#WW3%i_tbeheFi7ggi5ZFQ#Du7@;HuW{mXx7@^jcq2iu0|3|*%{(d&y=mokIKDs zOPJnUqD^oyDuPt?IXu@fsez*E>er}l8Z>LT!xYa#DVpAybv)4D*@aItD%(9P1I6AO zn@zl%ShP{L2!Y8x4PWp#iH-HTNqRilLN;UVKpd@>h2a<`H{K#Xe6T+Oj|^+rv`c+B zq_^%ot4NnBgP;}6OQmUkE5Dl77*-((-tFi`CyC^|vC)#!!zHp8j*L1|kPg4`EK`#` zgAs2Fk+ato(OYV|Uah1{=3%z3OnvLiwDg9?{y23cAV|BJN3JV(M$_YyQJ+w@VxeMS zBgbk@0o!e%He` z{{Ux1#nsClr21l}zlPfO5qozKH!RA^PinMgKUjj(TfdI{pfUu(�~%=Rs(^L1BMt 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 z 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 r$2vqF z2-56s{3$ua!(k-u!sDs0Ec6Wf&3DF=un=5Je|~Z!`9i9XTvipvwec3tVP|+8+!2y? z0)76K(r6ww(T<+CD|s4fU&Wq(D%!X49mVFQ_MZ zgupw8w-uYD{3E&4v`Dp9)Kb-^{pR)=;P)if)rZ1+xUSafYsJ)U#t1RuJQeSr^n&I+ z_k;Y85=#1Q<6g;kiKpDS19v#haQd~Ty?3Zhsp(M366uY#wvEbh-nIO1tLhNlHkE9$ zEYe62IBmRs9c!q(*P!snf*{b~onyPY%Unr~#Cs7`n3_1vL&IJ^@n8H*ZglCR4(o!P z4WCN&?+@E)-Uaa7t>tG^a!`^tGK1?}ZkzE+{@uRHx}TW>s8wkq$3B46TCcFpt!=3*J;bt9i@qD9euAm2f$Hj5nZbrdbRm6R2I$B~2SU3ZJ^d_XOw@fX8;sI6Jk z7f`s`eyjAaJ<#+k9am4AT(-I~wW|<*Ty7rK*!Wjdyj@x`Z*2Eg0e^jwkg9u}&w``58}V^Y8H1TtxQg``$e&Vk8h%V)KA6RbA3mu;gMY%P#( zM^VXP*NWw}pABjM02K7Ln$GXZ*6l_Mob7e?9`%?q?}$7LZ}B?98<@3cit-=5pPK~# z0CaY)Dqn-zwt-_j`gW}q{>*u>lZGI5YMvIp5#AQTjz%Rh^ggr!&-i0X*1SjI`|UdP$d-(GNV@J`#<(jjBUI8a+ekLf zj$1K_K2k@iYWB|%_}cqKvePt;H_EcqZx|biFfgOod)GtaXm0#N;McvJ#U1Ui-yE_0 z&6V^X^`MSZ!@mwR8^X`2PqR^E{npk48@e2KuRWW?+V-8|X*8WkkrFAyh@|gt;W_MU zf5M(BhD$`c@gfNBtWM!09i)T&tJD7g;brKW)sc@zl@nBug-GTD<;U^oxTZ77rO~`) z;tR;(@pa6Q>9OR+BY*>**{+0qHTY?y+uLeyerLVpqX!MSy$X)N*3PBk2mZ*v)4XAG z49x~4h_4y+9CKV(g6w3y)sgM(qg0((La+B!_ad?bqPo`nU2k}GxGq{qE#nBW#<@X` znNj^~Kg50v*L+uTX{l;c{g!DEN`6p)gZ*l>UN+Z!C9K@&8oiV;$2)~3m<3~=2(GVK z@q`{IjkL=-BO)lyRyNCS?axe51>0CO{TIV_uxijkmXSV5&&?qR+NSZ&kK#`k=~ma? z2)~LIjX8m^11^8OI#-Oxd*a;#Mr|*|T5?Zma#+UlHW@~HS5M&BTSV~x0GWNL{fY0l z7>44+F7C=|DgpV&`&`GaTl_-P;_(0?SS*!e$^IPi_4?PzdO*zbhwjz(5AB&F%kdvh zjqX0uR>%PV0PKP=KBK*Sfufz)WO|zY2O$0mK1VbDBR-+g5GRG~QBMp>HSK>4H3M#! zF(CWLHR1jpXPd*2Fc=8L3iR&rLw_WaFCO z@jPT*z1BExYn`)WGiRnN$fo_%sUy;~+ck9LX0(#ib8Q`sWa(G!97?#!70^K_GAkeA zuQIbcX{`qs%v@uoTS=5A=HnFk+C8Pa*A1*{QoyZ_0@n_1X zy=`t(2Vv5##2%d;;<0Hn!4*3Y*q8}f-01wcQ~wDDI%y$0DD$zxm(D% zz|L!OG<~2RhOxDM&^VY56odFw+@s*{+G|Z79r(5VuWq{&T!uORtr_{M=7Vz``~jQp zu-q%Q{jc=3y3%|Z;yu4SGS6;t)P@{pym!FYW$i80o=DqYag$fQ6px(Dqwn1HD2jgv zL01t&FEtIkF=UrG6?zm$f0yp9eH|&>@v09fqAVV@oY1p3Ju1!B^|S*7<-IEf@8oGR zIvVLRW#{tX{{UEPB5Q_~%Ei)^o6eJ#$*cC(imkd%1q2JHXvXbKlbk5+>sMbyU92NO zpnBI&r^ZY;004RllID9$D2TW@bJ1uUM+VwW!8=DPJJys|_BK(2C=Dm2Tb}jiUn&H_ zJt^^NHrDC(olW;S=!2~Uv^L3PzLE9}DtE79_$A{101WsW$8qbPC`l%@w~f(SF`cg6 z4nCFR_Zo}C583Sh0Cg9j>VCDA2)JjR z#;6O;^B;Qi7Ewt`?CN-_TSD)J@1nQy7L@l9=Gr^Bo=^8x!9S&bfcS^@uJ}Ks%(gc$ zO{qo+4U16fp5H(8ug&48MH4ZIg+9WuHCvRqjfVZsd)G~Dx)m*PQ^ZOq=zIRt-vV_u z^4Ch(m^?Lvf0qOLSIbsk75qD)d|0>fuZFaiO)AFhym5T0!GyKiAL14!l>vvEm>UAG=krCoRJEh4Yi^D(J(p~sJNH$v4z&M%XMFV&DusO%p zz7p59{a;_zZZ)lD>F)2Yn=;8KB$2=Xb{>FLc6Z)E$rVO#mP7AY;qvNq-!j~~xT(u? z*8UTGVewbOjd*JQ9hY=6kS;A`&y_NFF$iE|Q^*PU4 z{O4_`L!O!GT?}3zDP}FU^gJ5p#b9aGcal12R+JT!Jx}9L#xE57OS@Y;iI&?*w#Qy*h9<}6N8u2Et;eApaUqrf+%KF%Y9I+jwdt;#oxHUrJ^UWoXddHe=$7+1J z>rR#u5sx8LtlPQz5260qSF5L6TKJDh`&`kk8c1D0bL-C{xG#%ewD*WSW1!slcR-Bk zHrH#mNfZW`V}0b_Is!O6SI9QuN@N;wEJ^pSZ|tg9xv$q}YaWg8OT~8o01do#W#YTb zZ?>(VU?U6x%M52HJuCDdRQ;*^FL$TMscN1Pg6a@34E{^HkN6NZ`Br6kiN|`CwF`-n zU}s{B*prXSuD)Fgmboy*w0*bn7xur_HO&U&K=5Xf9)T2~#3l?HL_^ohQGmRDRq;mo zu4Xb^NMw=uXKa$*SEsvakYn>KdXW(YO7X7sNto)hglLeE?NfbGd zFC`EiJBM-o~E8CAlT=nCir2Xb$#ILXh ztH?s84Ocl=Bhrw$$ra_D1GoIuXaK|OR6r!v!~_BDKumX*zl}2HHj>s@GlJ;KKM_;Z z_yka7+5Fl60Kq}LHkudhFRD*(7>PBT8(Xpfz%D^XKZ#oW?D3?CZ0%*n(;Kqa>(~4h zGe}z>i=GhG7dgGtC01|x;~?Yz03NT%ZyrWJvaO2sXKdH6g?{O?m67aUv){%~ho21| z`ag&s5Kj}@-m;kA2xhlok@9aKVX`yG=quDbd#3m=P`=YXBj{RX)P5eiRJpm+%K<2Y zHv!dIcpHJh$4dAD*<>ikxE15}_;15HXduI=cvgN7{Pa>-pRWR{y(INxgR#x{ z_r$;OPmOc?IlLbSinJ?<2scQKBt_5tb!X%r>VFFP$Ks~3@WR^uEid6%zPZ!(26^wu z-dObj1zP#RSbe7lkcS_UuR_!G$GvEzAnkqt9qTC5v2I6k;K&y4(p4lbGo1Py*Xi&4 z61z!~Z;$>ZzG(jdcVnQOA44SQynS$M^RL6&Wxkhe=_tVmlV7c$@Jc;6pA>vb)wcc1 zZ9WBWW_e#9rCg(Ba%#4se$q(0l!NJ5qTVEz%?JbZ&wAT#nDwmIQ=V(Y#Z5UGPNA?^^NvL#+#z7BF+xITj`+IHHu$CR?RRZxpHhq|vt0HW zZn>{T@ziYJ7JeK{17NAu_j|9|IQ)()&%bTx4BxZvr0UpcuWTHC6QDn)Yic{0&vbqx z_=ee=!#bElfy-cypbUS7dbjMCspwuD@b0JL&078o6@yf>g?!0GVbPpJG*E037k0diJkk5xg2Iq556>ZG2StY2xn& zY0Ken7-^S6%HXt+EWpSzt-1K<0PXKzI{wMtKk#j@jJz9ls_T}TLg{+oyOK%e5#k4d z<7Ma7h#!r9dtCT8TGeiz8%suK1PnJ~eSOUr{{RZSWux8Art2DPx_#tm9acer$&8bd zIUO)X5umMOCsO(!)PIP4QSe9O4VQ>KKcsl;N@>iH`Q&<^R+E;@0)VkWql202+;GcX~ss8|M{9e(t zL*d(9V_1_!m#w5XQ+XWr+mfU5tkwysT+*DZx3Tqi#vcxN7vN9r4-bXD9qZ#;v69gy zm&=i5SY&d+k(mzN!)PRS1Xt)E?3tyX71*w$XQ_xFa@&DCFe_C~ z+7nWDKBWDjVNECYaq*q9%Y=tXnK!Y=QHuO%)4WD>{{V%T8agPK?Tiq5(O`^sj#;R=MNj zc057mb9E^yHkKfB+KDaQ`C5}#bc<5EOJVXPg>#NDJt|vfF1-2*{R<87qvPxROolia zMjy320k=KsX#$cq_NWhBj+NMQk&(FWYJn5?oOG)Xj?{_>`G;BnmCz7ZH4EV*!S7Ni zC+~HpNSGr$)kMsPVzTqzn+U^Tjs;jKbI%mh_o|6#QmlJskx(~YYUq^}N}jD$*o8b* zqDHa+-7371g>S7{3`>mnrIA2v^`-?sCo9c0vyG#*TFA&In$Z^dm!$->LmGp}<3xoI z0;L5x$5BiIC;TWIAa&j{4k>{daBAF7# z#7d!#dr~*ZdFfX0vBpWN_}|oVK#JTJtd9}u6KUFZ`*zyI;2!n5su8lofm~OMWmznW z4x5MTUUp$7sWzG0m(x=DH6I z*dU5W1MmL;D(a_-*rAN39~^rc{Q9OUUC+0tNp?Kk$F308%`A+)FlJ&g`PFNUCsogz z3}ugEq~|s2aA|Q#9{CjR;}lC2aLC&iBaWS`53NYw*(1$Avvsz0cZs(i?8K2%jVo4^ zvb;<^Np1~##Bs&shHMXPR7Dn73KV0tFKolvBg{p@B zYZ^vXMhQKRY2I94dv4&Or`rd!Jmgt;qGwc&;OE`Asjf6X62$1Oc!is&-CmDsV#e$R zQPGL4tYJ=-p&9i>h z8Kc_=vPS@P&0ZtS{$79DCak89t6fKdId7|CyV&fac?R$f1z(CNA^-rXliQk?Sbog& zQQ<8@P7LR2{VC(Z_Y1?^K7FxXscFe+XJOC zKMdIrTkPOx-nzs^*jqTqr!${i>+MIh38ZAbcPg^U6b$jJW0EpC9qalI(*FQr z&)L2U==DbMbS}tpA$M~I?#E_uaqpV`b$?_7eIM;d@TK(Qn}M%ImHz;yep~Mc+iq+6 zp0w3o2t~EB$@Z4IXq8-&qjMfkdjUm!OrX+0=*6S?{QanOj}K`-vl2-_TNEg>?61A+V9=kc$;?c~?I5Bml|f8m?2D)!sL{%Xh$2sb7C%zKUGk4`J| z8^;mqOYuX;QR|Z%jY4g1{iczQb0L+1KTkp0zd`;VHns5^_88RsF{b8Q-8#zl$IBmi zg{y80^(c6+pmiLn!sn4XYBG~Yh?+ z0N1gb$vQE9hnI#;O`nmTHPRx|d|To@Dj58@taU5M5r4X(Qb7DG^jG!;M?M7c?8S*E zR<%K%xJzvR09yR-@n4Bw$38FCJYgbznRUy_Zp334Q6m$K`f2@VvesGGG?f zv63^7+`doO(x`sY^7-Gi7mlQWf(_I_AEXiU`PWPPDXyJA$KL_2qc@ctce0*;ieDwd z55(4ycEbFO8vXCg^$*+FT(`#E4$4PkZ5E1-i<5w4k++fVO7rXme2Js@FUDHklV0e$ z2BWFjg4npXwUy%I{+eyUue`tDp&Ash{7>+vkbl*@UQIw;SEp3*Gigf(@SnzW419Y zh*mK9$iZs*Bles9r@kNR_EsJm@B$fi9}nv{_OBx@*i13*iP|pPWITcoKo5HS;npLZ zKuZF{s5#^j-nG01@TZWan`qdWp8Vx==xQqq92+y-U-S1 zx>Gz2AWd%3Wp6EIV7bTL$pXG39=U!K>M*SP{{Z$@_+@=LajE4|dz{y;e$rQw{{U>oXLgbaEg|yEpkZV=;DxUj@Z6DwF|=gd z%-eU7oB%rt#hRnhEN+rZOT^pql0Hm-5%;g4v>hVqO+6ZU6*C&)2X)1G_l4q$;w!6S zs~Uy}<{y6*_4mWQ7SB}BZSU?-6%0bJvhh<2PFopDb{XMs2hKG05io^L;#iNqTiei9 zmUQGU8 z#Fb>)-i}v0e;VqXDaS_4<2k*It$Rmit(=zYC2_~ie7CQ8e2$D&IsJBan3Vbl@-1d zRQsMe;2mP;#QrGpW%i(~3Od`w5AY&#Fe}kCy%gPCN32dfxT10fe~6BxSDt7(oRj|m zY`2D?{q~`7%I&uWPI^~Ct;?=O4w-EZVUEylY@P}JB5Rw})av!LTj?I=>f}cPNCK~} z(SQd${cE@IuZVmp;Y}{?{^lcdde4~ER5NV@fC=DpoSy#xg?Yu@rM>T!s9rgFm}WTF zoM*ZE)928VNF^S5*xO5OTDys(z1O}jc#PT$Jv!1GTdTu}or5uragx~RNbTD-jcaA8 z==yAs$#dpk-vCUEcRoFGJ$u$_Ev4s|CZ z2Av(E+D#akC?7Kpaz2%*b9HZJ1Kiz6u*DLVXLbszqp2kH7397%`1SCYz!uTm_?N`C zkcqzH#~_uP=o2UNuIp1s=H`^PH?BN0dYf(y+!J1C8iHNIq$@l}fPS^i`F_i}Y0K>#J-wZ* zx+~aDrNai>#a-|xhNRIA&BT%K-Sd0Z6}^f*QWzcCBOt1i(ARYartnRRWZn-P_oPt{ zrF9*RvuYP3YO%)y<~8{n`$Jvb-T2BoWAa0ZSzU)_HTvnT+$vn|)L4FVbeZxj#Lg+dBLo0X5hl+RXE2rV^5i0RXupDUljn5xhEWE zq8}12Tb^%g@w3GK74RpGz8Lsf403q(?g(!#ce*?gi&`KrW0WNuC|Qy9tR zdR0h*tTAl|-kP?LEb6E_){+R~&i-oEyz#8)$Dpcv0s1N6og@1v_Dq_}-ffF@r(Dk= zQ`Mwm#=j|~iO-Uux)EQj-?O#Gm*anecisq|MUvtHb8hNS%)7~G$I}OaUz!@mg8Ck% zHk)#GNpB-Y`RWQB8t|}k<*O^6wM}A~_uuSmX(hjbb?fN~Snf4KpdR5NRd3Ydz7qI= zv8Rr8*lfSmi|Mxe4b}P``#*Sg`@w&+o~Prx@MDhcuC)lz@%y9!5c_V%N7Ps5b;azL zSC4l;%`EQD%sLXsHCPpT(~>5%tpt6m`xwWM7Wk!lAME>Je;Em{0{x+xPsT461R2fR zVErM8SJB_Gm6QJfZ}_V6LxuY-njgiUzHRvOqA!acDFo*?#|P+%RS)-uXMf$C@55i0 z#~vL<8CTS-!T$iit6y7w-2zFxXW^SPB>6UzxC6fF7bdw0dOD@kVEyB$AYErIj|GGsh%*cdj$XpAI}l;2m9jKjM2;wbT)J zZB`Bn=NSZ7(I2v}#s2^t=srBq{v24z_WuA6>X%YRZKP0I7L;YALVFBkj+H0vjeQmO z#zufdU~5YVhd;ziWSYXBE~nNx9>$ZVxh{Nq&`1|@bQ#S?Z_IGXX(7Z?sRSPTt5@WT zA_>mnjD2f`);!5s7ow4z{VUv@lU8S*w?6UxlK%i}O&j69nR}#sQ<_M$`#9mYx48hw z!9x)mKYgk=9+@J)HGgQ|j#r*K)-?YB2x(Im@TZ03y^l?dZb2Zrxt4aGMcjUN5^V>A zv<@(9(kIb1KN4GbbKu8?6(!gFYpWyN$T5DN(bS^dPjyX z7E8$C{^%h6YlHA|TgBk5IzjiuY^UlNiu4}_+b`M;+xEyGTKUY`a@_UsO!}+9kZBs_ z<+huz%CSR@ym6DBSbaNJ>mP=#^sOUHw9vG+%vR8;2amgtyneO$q41Z&nr-w+tm}We zj?s50E%M2O#(tIc-@^MXW5jxsc)Ly1gm6K2&^5LRUnCC4-?e<^8{$0*%R|{bc?h}C z&9s&<-a_oV{?IcT0nX#@E8{POz7`tijc;X=;z;f7E+lw-k+d9i+wEUt{6&uEQ1E`Y zr|D9Ge73IPNykOcKZSg^@LycAznb4lv4N6Th5Y-4JfjXUKN{%86Gz}arE4o_uOhX- zxRz<1Hx2E;0QyvytoPS(X!d`(feu}>%K_*qnr()eYpF*S%e~Ftm4uQ`g-<*h*VMF$ zZmwgwwvGQ;dv z;bn6yrmd5YI8jZf40RB6PQXp~ZxQy1&idwQICiXW72B2;T1vvGu zJMf>zABJ8x6aN6hGvX^N!))d^Q8I=EcL1J8xUWOEyS2OyEoMn}aN8I*556l|^1X>y zTb$OXu1BO#8qRSPj2AxUrPXxXeO>__qsQmQLj(1xHSZ2tYif%*Wn|=Ipdz?!UO2og ztfJxNxRNs9j-wTct?osncp~>fxxLrl%Y9Pxg~w*{+BRx$7@}D=Zp=)vCC^gR(O4k<9%jU;v8*X3|pd-?~9t*7};{5ir z>m_2hu#~hmN_qwRrGT!S_zy+Xmr&NNt&#cXceXD7!CB(Nf zl}3ItGupIBlif5O0^CZnvZGocU{kX5!LEucXOmH1?C3;R@ithF0X2U_wrKSK0JGfy zWI5hGy{ljMP)1HdBJ-Y@9`&NInOUSn5oucT_-|41R-X;? z90fNCjQSIt174Y@>v~435SvT9hVDP_Ln6q(nvy8?k$p+!k|epcf@q9)NFFiI%qzvU z4Hr=HXNY7=XiPdhTNJPxcLY4+IO|^PBKeV(2M4#-yxQZ$mwI-tmMmjfV`IM`#7}C* zNh3(g=azh1hx;!{wX%%`o|zn*Tb#3c^Is8o-&?uyr-J5@dMeQVrN)9w*<_OC)q&fdi@J$yT{L_- z;#o|(waXyDFIIGY!5=k8T4p!0GY+jDV_ zM<%|;iSyM=jjTRenmA5ZHr>wxqn0vH%4=)O%HZ{?;xG;k zT3|sGXKs4Z?s9NC3cK>4a}{S$4KtrfbjUV;#{fagJ-S zzPpJeea9=D=C~bRs)2h{iahZlFWPdu4=UoifHF`3-_8~7|+dDtz`CJc2Ii^!~25>XRMOeMJDF*33gw?2Y*|HvSg>FS>>(@$Qc!9vk6=q`> zA7aXm)yZ7M;iQrI-Cb(@mH|2wT#f9mW!QKX*Ffj0bG{(w!up^+Ob$Ov{H4`5L97IC z;Boqz{af)t7QPqM=5OJ*Z{=T<`iz3(T#iH0rC;Y?LzSLpEc9zQ%D_S8c9CDuXTVKn zT~FY5f#SabqB;P%Kt{iGXh#{!U<&?!?cH7s0fGYq`I`OY_!VdN583|!z|qMlig`5X zV-64$Ja=7P{(!5VxF;A-7SXe|-8)Ctm z`^-A=UcaOGi%_-Gh0Wv&ZZ>UJFOiUuhPwYSNW>XJT+p(gEp_Owp{hD|BsM z!Tgyc83j)udRL&|_S^!+|)f~-u;WB}!ud(?VAil)=FsWfRKS6QUxiRT`b=^6z3UbCf*1jZes+{-Dz zIqSi%Dc5vyr|J)Pe?M@h3=1WP+%D!Twi7CJ)S~etP;<{UJ6>8g>#ia%m1Yq(G zC;{3wx2^bfMbje0&W8c}f!~_vw7VT+UDYnUODFFPZe(^nIUNOhpN^!`yg_+qVQq;X zOMS`{r_6X2$?9Gj*SsTSizI^gB=q*o(U@ig~#af^Ft z8KhJL18DZEGwS-Kg{jl8itK?(gde3t;Oi;xHA{IJ9n6a$!i)ooX@SuAj_*xh3_}i; z19`j2oCV7>cO=&vqepHPt}ezhgaEz$tEs;6CFPTUXW2xkP?V4`1d=+{%@0bnztrqu z0dXPR;GQ$r0;~)jN5p!jt)MQGGe#n}!CZarIs^DtPK&GRHu^2jn6H>*aN$p{wR$Ix zJTncI(_Gmq#-uAK94H+dHNfbw4?gLnPc^^AIAv9-MqQ1I5QnpV)xR7r(B zGC9p=2d#Lw!@7OPhpqL?1@mQy0Our@2e0K`O*QrGa4wA#GQ#J4ia5`)uKPjOE_Em@ z^h=j13}t>&a0$+HpGxOEZD%cqiR6yg=1CB+E6-8=CDa#%P2S9zzT+nJ3jVrQ|R{J4W72#O%jHMQ!WTo5^6F8+3t0 zTTVTyth)B49-F6WZ?)pKa>I^!pb0dcP4w%houfw^K*JJ2uDeq4OxnG)JH%z;QWXH; zVxiLPG;6O3>Q^%WZ={n8p4mOCgSn0D?nr#Be0291pbf7TSy*ZMZl5`oWuH)8#x?9c zYt(!PsoTDd{fNeV8)B&BQ-9w^l5l?j%;S&JpdWz{hNvPRs+8(Q{6jUp78b%LYxc00qF3#t~y0o!7 z12x|HH#bk0p4EjeR?hcLmO=Noe7!d<09nv9okzq{PSz10D#jr0$EGlF2f4w(t1YR= zXJO>Q7-{BGc^sm*YS_^4wVe;c+KuImVPm^Rh`AqhfIwmHGHcJR7HFi|Dv%11mhL^M z0?v&E&C#Cml=)BtgV?vVb$Ta?bqy{H*kg=LlSj5dM^AcnrmnGQQP~(q$O|zm)Uoxd z+D4}o7FxU9Mts@f^5f&7J?I0Nf?pp&OmrL}_A+}*}ZXbEg& zXBCen$u*w{nim^JI0ppvr%iZSza_VunG#S&Yty?W3_RTfjTaq10W!s&J7 z2`1a*94eF0pFuz$|JD6=Zw+Z)Jb>%5-T5~#j45IO0ex#fM7-0kqPf$rwoJCXIZ{f# zIO|_O*?+=EYpKm?D{r?bNL6C0e;)Pg@oRn^&@64^v>2G8yvREH{cFoT0?oI>KL_}R z8@)>2(X3h^SjmC`AbJ||zYaxp9-!9RR7VW^1lhuX4_faB#7_`k#VwOts_BK0maHPU2*DG`n<%s^1wz94-*>@*Fh z=gpCiZ*Q$%m*MUG)x+IdNYlX)DC(ngW8S@9=Hk-+V?KxltZ5hy>Oz*|l6`8tt-Pa(w`x4l3Wlx*|2Ul+ZQY&GQhSAs<{;pNRYk;oIBWSZ0Ydxpoj0 zj^gEdaawwf?3z{Vy4;>@R}vC&v(R=PmB{J(e~El+sy4rKZ!E&ueq8?V@}SJ?m*LUV zJUH;hc%t@o!lpuvr_fU^HF&%~;WzO7@_E;{Ok?>D8A1213s3P5rKanTs%pAr#Iakm zZhx7S1>=s@e?bs<%UYYnGF$zROpKfp!D4@{0B7kw71s3)Lib0#oUBMPrOt2(^{&6g zT5YF;^ti6P9dWwqHQ6*sa#&-na(*@OJ;Ya6cG@s&bAgsQQ6Mx5B>=&3S!k=QQk0WO9-#9>=k(o+S92WcJ>Eodd&tDf1Yg;XafHp+jBpABe9k zZ#+oXLsGi7AeCTOX#W6b=~w<1_^ZVlp096Ukt1pG5|S5e9QWY$t>1_L026h+O~tL` zG2O=CXJ`Pgu19+4JZq}ydJNIsXxco6>DzRrW7@la3d{z0r{TwgwL94jzP0_CaVaH{ zSTN6i4@}pec+~hw-V`EycZYIWxTglUHI$> zJ!@M9&fflC4EVQA{>t%bS$yM&+koKvcc?TU2l!Xv)xE{;n+n|BHa2bmzCBMh$Kr?dj`T z8l>M5G+z_kU+6v;hWgG{Z{ALJyAM!LO3V+>pW7owI!DAk5SLQ3*t-Fam~3Oh~_WuyHgz@=ZBSlf28x=D8gP&|Yd62toOJeJj>)tfY+?0hJ>H zsQ5<86xF2MpcMy?TGB8?a~N}2LvA?Fy*3Ln$9GZGS81(_VK9a@89i#eUR|BBk(3jP zriaXBTib~xNWD%gw~!~4khev}a~eEPJT_H3sa(i?>d7@l#l4M_$Z@!g3ghIt zXWh>|YAe~LeX0*0l}(8%7L#L0pUez7s0@pqdQ?Eul|+rlYQ>gl+M`Nxcm}ie=oVO( zB^;4kdTNZi;}{i{twz3Ll_#b@8p(n4C+%5i8{pQLdPmP~t3m3jF)~9AQ(bt<^&&bM|&$I-afHit1LyK@v^!DC~RI!(CWf$Nq^JX9E?L92Yu_ zh3<(|2d7H3*#vEP@-c$NbM6Q7sqMTwG>7dMq=0=*Z9{jb*rv;9{$t$LX|EpUOh3pE z9csXu8!KpmirEI?)ShcP=E2i0=LmiIt@~;1ETbR~F!%MW+li9ov1L1Z3IM}PSR~qbsQeE6!>Tj_# zx6-Dx&}9dFyb1ubVWQmKp^%WYqr>v6ku&DHiy$LUC3=dyste`7;je0G*h>&Wyf*9uQUMxQu1sRlG(G0y$UYlC0IU{9Lx-~vT+_oIy+{M=gny~ z#Auspl$VH#b49?;ncYdpYGIA!8~asRZuhZe>FHWpcbPJh%fX`HG7EMs^K`2+AzW=7 z3fM%9Ceh7TF{^y9(u;wQBt?f6S)-ILdsjgs#GHFpe5A6KUX&(F+{wV(%~x%z*{cK; z1e&hw4>+n!9>gL<%GZi2qb{h2-?OK;;9@P4Nn-f36r(g>Xc?Ug|Jly>fT?_Pdk zPuy}luyVAlduQxHtflwG4;!n<7HRbBDHbw*W)aIGvkzr10ps|Eev;T}_WE*2mi;A> zq&Yp<=D!nuHfxuj1NhB*f8i;g!}8Aj)Qt1w?DIF zrf-2>3v>SfJ_rZU76a+WYWCLeUP1dlrLue!@N(K5$NilbKIbLBT-UFjmEvL@k=Wha zW_*L@HC2}fHKImpBBH#rr81IA1~}QUU=G-*nr1e!_{aYM1w^uY*YF;tbsv{>i+dXn_E@ezm3}OE z_S_q5IM*Rgmcf=Y#pQGu%AHTX5x3*EIl+JJgKuZJl z72P(ZtcrwB#ZMG?TJyqQE7klps4x0PpLHw^=t{8}74%2!?V(ustKt@qp=v|-D;%!g zt2bKo6ZOTA2}>=r2aft+duG1-8HRrpNQ8i zIX9M3XZ_TWkLO-V;|~z%-YNKfaic`v>C&qaxbUob=dFF&`v-hEzVJW6xiy_y69wmr zZrb~63^$MzBt-o{EIo~9R$l8duKm;PbIn5Ok)KMJGf#Q4!vzlx5C4 zRaTQNvaz|`hLU%Dy*(a| zRJof~w{APVn==0Z=rv3B!O?E@&w)CEw#fEa0GEmtmOU`wecbeZoVb_Fp4|` zk5ayo$^QUi##4dy=CglnIj&&+oIGaM&#{fPYmw;FAS3dvsqD#025CSg=Eqsk)G0NT0<7^k(ovTVbJmIUj7yw$c#-+Q}jpRPwcm(M=biE zj>VLA5|xzPNqmMzkq^qDLlCMu z<-Tpb{qbK1UqxUp;gPM76Z_2V7$6Mx12ywTn{qV|8(hpH3%S{VL4Y>>E7qZab3EF( zzEk#B$NvDb?z5|~)%+8v=ok7$wis->NM%IG$T{GTeAi9jkJ;wOL)CQ~&lBAEa`#EQ zQRQ2mLNyV%9b0k08TYTtOKGjp@0B+@bR_5LpIjRD7(8j9+i6JxXm(Q0V<5Xk3o-hd zr<6~*lyfM(&(pmh_G|FX$A_%1msGXz=BZ;bW|GcO@XUng?=~_B^yy!9>9hEMMey=0 z7gn*Gdv)C+I<9t(Nybkmznq;@#Fm~dff1}A({63>g{@c0-o3I19D3F|r_CB2l# zAMp9DkIOZra#_Bjd5m7i?|;QViXRX4zlFXg(#rJttMUFB8Vm#wBh6K8Cx`iGB%RTLU1}7NH&e#h{x+l$6>>F zud<-5kC?3P#B%Q0QGrs3{#=?wY>t%mC9(;{bfcV%L>Ok3lcvtJ@HpE_6KKs?4f4PP zJ!(Cfe43ew$30C*#Q@@}CS)vyhs#x6NFjTgxTg$A=~2o)ZPh?mF|Z)hoeOc&tSAlE zlo7ujXcI+6jg`3OoMX?-YU>rxN~-&a+M=3772Y$Q%6Rmnb7R`2+H;5EpNtFqPkv*XC>{+ zg5F$XBr1%SK7dhlw<#-}x%4zg^F2+hS={MboyM7{BSCX)t?sTwK-r%4xOD(bt9n_ z&hb>-xl`1qhLTrjGdrn>h37r%&-_BJu?ZiLUjSEnpfqK>ft*(j;w+nG$6qrw#hO3e zGovp4DmHu=-)Ms5+;GY>LeD4K-bWdXk`|=!bTeGcZ0*-CC-SX5S`R7A2)jfC?)ul~ zbv`5Q(V_OpnmFL-%ro_=9@lORqhZEzSpE|G9G6#@+MJwQC&&+TTUWQgZ*d}w0szOg zWHPFq(i8*b#cA6hiO59cbTyu;vEh#grCf;a1QYWLOb1GG#7W4gBuLS44_`{ONW-@o?NF>_NEqiGs{128Bs``+Dh!dvq&LiaP-q-^Y@?SxwFRsw z3$f&mwHw?Okh6}RDPf&m9myjnpr8v1pE+=LuyPj!04gUSLZt=({b|zU%-Nm*>q7IC@7PcR zM;`IH#uQcSX&OAnKH)uTh-Oex#aV=^ouuJUGyyfjpikZ$4^deWO&DiGoSuMGw=x-6 zgyD0|QdPqq#LxzsxL^?m0jp7{EZa^o`qprLzc*phu3NJG{{4Rn0F9DXW4ndTLpvPo zPSttm9IA4CYLt4*aYsVk!AU(5Q$sqGV$4c^l9>N50uVHJOC-LP&9Jk`QDNvK~Y7RCdo^m8tts{?I=Rdn+b)gMt==T~(`5F~1< zc_WPO=D#ka3aqV;yj9y<$>3%-(@SpbrFTUmMsRwJsT^@$#xD=;De@e2s`5LY+51$- zq*{K^J}84ix?9U;Xr5O_42v^HH=tqH7!~2#R;PWY-&$%~RILT=gz?K88Ai(1l?zi)WJ+zznEjc1j{*MHp98d8e-hq9YptrQ zxQ=C6?Jr{+WRM{_D*TW!j1kU975)r-7x;hsG{LI;M)41dQu|bj)#Ea|A|zJoca>Pz zEb_K7&N;xZ$2L$V5+Ew$_?5P>`Vm)B;ir*))?}T*`B~&=$L4FxsgugiDq1stt=n5_ zdN0PWiTcmS4;@|j>snT}h=C1-sXy`WY`u;++~?+EJD&CBvBo2a`qrfJC=DR*&1Oj( zY*)>CbZDw@P)8G;<#uLIE`CWmSLm1QwRxo{?ET{VOISd?wY`<+AZ4G;P!#jd0t|Jp z&b#=-E+hNmzU%#y;FJCp7sNQ7TuE~1cQ0i~`20?5%FVt5(!xJ@@LwHSPRkFI9wOeW zyFD>jJ{{F#veh7YatwU0ra`Nk?!O$iQ+dmVeY+2es2I zUf#MJc-BREBm3Kwh5?6OgFh4b5A6(s*o^3mIF2Q$Hu4y--f2vBb8>h z`$Ucp-Yd9a6pqJt%U>bs*P7L~n$tj^W_kE#0|#k8bbdX3aa^-EhR5AL9bXFR{w59an6H_hr2A&8e$t;4HH`v`#Ad~kSXd4u*T&c!m*8O6YTDMeer+eAI8s* z8rH9-d_J1`+rxHj>Gpd~(Jz)bR+?ega2dvN)K|?=e$L+(73{T3J2$@b0dkNtNXxg> zbw7oBufku67oHydn0#5GX%~pTBk?8Ft8RdP`D5A;$?Jdz74%2P4S4tu!~XycZ$299 z4`%vZr=4^yE2Q|kzYIUV!(Ek8qpMiSMhb*o6Cz`LmD*t#+q+b~&XN z&2taK5ZZWd()!8(1=Y>WtfZW<+;UA`@%M=>EOe^|MBK5mw9cck`_zr28?AHubo`dF zv-BN!=BfCbMUPa2>~^dEk31uCH&r0=Ya-5{!y>}>PhCvM=R)K%=Zq++t+fc2S!Ui9 zor#TmZ55Wbw{}`Yb`}ZtYZw6BC@W_h+|o1kPy7^1w#W;+rlfaXfkT) zdJ^^~VjwseLFt}(suIMSW}0l^+aB?{M(#(YXY0CbnwF_=s98v3megUwu?l^-;;3Hg zg6$==kc_dw0Otp#ARD7wLh(MkBk+zwsXUX?y^q2+`h5Dr>J1w0wT!m&*{jGUv5!iy zipJsgvH7u%q@3clt{+~w)BKx5$-)$ziE5p8&vTIhGUWJ)+d<+a>gB5!Jn zh(06>kFxH3H{4`YLQZz5Vfj?*_c~&djgi6p0sV@+U#)niX}o=@!4HS@#*LY@`9#9> zvhLX&sBi%2$C3{MzgD#kCrR*Mga()4YgqKVc=kscK%qu6kEtYeCnWuA@}pSz%c%S+ z_*LQWhJFaw(mxVtv%TH*)uf@KlY5-R3C`p50nm;Jucmwl@rT9#02XxJ4$k`D7WSje zy1Ce6^QQ+3#xcO_jAWeGMK+@rt*OaYF84lww6R&_T|!p#RWr0#Sak)r(;3IhAUOmM zm7Q-5wWXACyqkH&bkOLc=?9YP$OcF~>Pb2MXIax^(k%1_$8Eg#|p zDQxCQ1*mA-*_yvrd`YkPH%BR9;suTJzbtAuV1r+i{{Xd4sif*366TLe`Cx|G0)xgm z&q}wj>7O|1Dt^)iIK@);rnCI`A0!Blz4;1Z= z%faTSDud?5S&0K<73|VHnGxGU7v^)#Tpn0$-D!p)yMx78ir8m$dJx#bkZd1$Mk+-` z9JgA~Xo9G~%~mmnde$aoJ|k`iTDJjX$74$N?U9a@_D0)<9Md6)`&jKYRGp2Qu!zgc z9%|A-6rVZiR)l&V!q15s-@}g*rn98EFiVBHfc@EH2cM&Q9@X~g@z?CN5n(Z0rDbUF>F-AUuxbYYmRCn0wg=VxqvHhZdX!P-&lKeaP zeHqidB@!yi;WitBhvh|1Hb%G~E;4;<<5oz)2c>RLZ{`K6t!jJoTH)~VrmYfcRC0G` z)jzWT0L1SPcpFgHE&NXHZ)tT5a;(7%{Lq{QAaZgEuL$_Fs@nL!$6D6Crh>M&mn|ea zx|o0gNgavCaa``73*?OLP%Bnzbd(H^K*dX1zmM~C{m4*#{_xnEn(H<1i zye_{FekbJG#!5vzk(r=)h`@?aGDbalA4>RsOIX9O98{LE>~E0$+IWgFsI@8;9CklT zm*SV~yYN+Syg~5#$_u@D;dOy+QRQSZWaG?mQZ*;34b!o&&(9lp-&**Q;!B?u_>H#S z+!73GepFt{J%FrNi+bRErlO9|a{|YT=AnRuCC$4usa>^Vp@{i=x{TK+s!1KWXX;}; zE4Q8Q1*@uN2hW2K;$NE$&3N~Q@0s){Y=a%9MmYDt zHQ#t?L)~n1k1&8M0pkG2ZLhO@4d)E3t=2wf@KsCYJ6WGkT6!(;nu(O8y+_Eu{EIPl7<+e36HczuqOi ze+v1GD*fT=R(|P6;&ry4YvBEJRGcz5*^cHzh5&K-SIr*=?X4e3eLui?Y22`RWL)hB zlY)I~=%0;OF-7qARkof{3f;tFC%Ff(`qz_u6PHNvy@YnwF_|a0P0}3XDvq4`*7&c8 zRK5eNy72FgG<)k!PX76CU{+Lpq^SU(@vffo+h3CXWcw`10&S6;%t^pM;axVX<82Df zg{-CLb_zYc4&t3r;uG99=gTx*ru+uzIe-l|)!7{Wq{%6hQw+zj;v%C-cMtD2^ z7MFy)S*l*O#h->P9@Z;Xe2CP-VkR)y8^(Ca1lBW^+0hzSMBXd?k98jnd_`XYd@I!7 zSdp#alJ)KwA+nBV+N|YARv$1OPip-W_$m7^_%GnAE~TaF8iu2*$sWn>C%Ao&p1Wes z)d%sfiEY1WF9_(r8N7G#2IA&r(0of_YO!r%86=7niv%t}`=pPqYRAB@+LPi>h;4NZ z3&eN7YgWj%l6A!RWyoFK{WjPKwJMRV>2WK5bAI;550KIz6;Vc&l5L{d_jLL_55kJAW0F%2OJ7QvFk6VXp16T zrKEO?7dVfAeKSy7c(`d+_uuG_V=a|%c=}dVilyC=y9do%f<9CFVzwplj9Q3Gb9mNK za9IaDng(y^x?R?<;W=J*Y3=Vp{n`McJ%6Y~+*LM(yPt&8* z^!4)$C=mxw#<(f8Jwr;reOmfuHtn6mcO;(Gp_yOD9~Cq&ht`+(H;VpZCg5A{vtZ*K zOi6cx5VF=0S26?Znem-iKI@XhW zr(as1F2P7bxbqp9Z~@0k{NeBikMBMn==$e}CDm?p$vi{43)^^`V~ECf65hWt2iTF` zvz^+x(?SWO-gST2tHKB1On($~{eJ6K*V;6=!j=0wW&E~^HO5H?KQ=))$8sy!zhWG3>Grai9T5%{r6WAHGqet!&TD((hr}NN{{X{0ct66P71rUk zSC+&`(MqiFLu^5nm;;=X+uppt$G^7C{{V!%XD|FKZARNy&|M=*7UUOEGALFkSCP2& z>Ce)#RW9vfo$Ty>uUWhhpX||aW}ev>cJrAqdNX?01FTxvM!#gb+U+FUpC5RP`&Z0A z3BDxje-rO6b=^)?xBFCa?sWayqNnh$t$i(_>RuSQzM2!WeYnnCoRWRbZr#p%a-46E zJSw-kY`V{gFN$eaQ3i_2EF!QTr?{_!J|f-U>pEnXqR!h)(>Zv;N41y__WPRp@8VV5 z-XXBnCDG(8gse%pkP3Ieuao{DTk5xZ0$CWDE$r879CbbZYPGR+&w{liDRUrg#Y23i zx3o1aZb;^_^~-5tzcI*I0Ne`J(B%1D7lEFYgmyQX=e|8$U)iYV=BxU0n4=l)1yu38 zfAKN1IsPx{R_(mk0aSDXzRQRH1Lre;jMZd9Gf~E+-*0NM6}z(IHD)L_oLAV=K6>$Y`x3 zOh7$xRBk-TP`Nm+qEtYE6mwWQmAkgxoaV0Ov!?h_3|Brs(Uw)tWOh;NLN$F);e9&d z<5Qj5A_to$J<$=cXI0NfjTAzTm$aH%h zYIqtrFG~pWdWGsh^y0F#VY2yI&Lb?PkG4i@+CD7&NB-G@&%?eRQ5Ku0C(SP0G_n!5 z<@5s|kF_StrhKn+A1`4=iztuFvK^4?$a*wp)(kOV%kb z3O^vemBJD=ZBxj%1>%YDKic=Jo*~wwNKTcdoXbBBigmw=pCJu>b2agu7~&LcxBHsZ%MS_L!QA%?E$Xi-a)v52&zu3k(Z&;j|^#5ZaG029QT zPnohmQ(r}v!KHS2SgM-X^cdI+N0C7oRwwnZ-%o;2{{U`$8t`t%3V*X9#(h-{eg~;P zVVGnAwEqBF{rC7QrC-?mBJfScj7C(0O@W9V_aQap@nikmPg5h_M`v_AMJ2!3m6X6S zf(Fh9tx>s(<4F?BZ7NB0%eNpFD5ucXW8y`Q_Cs|GDI_bVag6n@&P`}|mMHXHCek}A zelshPzXPczz8xOvmEox!?9=S;B=b&KI42ncs5NiLlF2rwYiA;Tl0~;lVF3grAW z*GsF-6g!=5!32&5dz#bn?a>;NURt;kG%AEQCph5H2HZO8*{!6LTt_UZn_XY#$R4#v z#WL7DEvjjA5j49*ilYH@=~%ixfv4SRFMp_OXt%6BSWYs#x@NQWzc$wT8wZzq!mH*5 z8QgnfsUng)F9=%wxX&Hs=h^Lw10XH;g7&UL^`N`)9MM4+muLwHI~)$RcS3txi|Bmt zW42a(?06U*s?5F|z3~O)x85F%NotZExNHzAiaL)CYFc)crZv3CWu9=sar`;yS$;UV z`zD=dq$P-kSyRksZ{n?*Zb_p3?eyntQS<I81t!?ICG*FzgRtJu9&A<*tz~ooRgk0O=C~ zQK2WlW9wQseg(eO?f(F@Qr#g8SgXE_S=Rl?;;rP8U5#y=G~8 z1ot<}?g~VN7c4qwu4|zw4~OK2Sguw^^3L=Jb^+^LmB)y6pAg?mrdt6Gs$hUJyR+Sm z12%O#T}w&Sq_~I^5OL+W><4_;Q+#zl5a>r%ySNi79g3WF{{R}hq06K~qAwA-Xi_jh zZb5AGTn@FXM|G%4r+9Q5dqFnjRULWjS^;9hYuhVpn;Vs38}qRCD^()ZFK4z$p+#8{ z$qk-y=soM9@a4^<9wArp9HEs<2HnrhM;XUzZPnhHCyeBeLxwlBByGptFOEo{32t@m zTSM@Kntjw^zTU@Sa7hCnF|JeX^GSIn?6Qy&F_Dv;5zu12H{xx?bFP>bBf5cZ=E+6>0AwDSuHRn2pHc9> zl{AqmrL=`vvyuql3IJaiT|s|m1Qu7Vb0?M>LdT&!tBH!@wt<%+wb_;T(` zJC6~u0@eoPXYXRU#J(4I@?1*>AO!7Fdr$_Jg3#&nS?Y4_65B{Q>QAj$@jr_0{7{X`$(N_5fSF;Yk4Jc13wLo~L)E>brp|=r)6lfTz6zI?WSC zy13MBV!OFpc?)6r+(?H5Yj8QuX?S-`vbmM-^%=^d5Z@@}o2afs zThrY&Tbrq4A!lrKZmIaNWr{uV(PRpJjdFS#Hg`B9GnV^~mD5ja$N# z*lQ5l81{{xX8za}m>!eh1{a!r)trnPIa2{i8fYteL6vHM&XSFvxmX68RyAHrLV!D+KS=v>HudM2n!6sYseDL-hD+ZESK#v zxKY;&ob{j&|JMC^()9lT33$fj*&8`6&AOe>orGez9dkqYYo}{N>^^1jPrjwkmI&>h z=DX{k7Wh}e))&yAOS`EMmyRR4OrFerE6qF^2ZnrLFD>sk+g`&(Dk zZD+zW?by+-dXe6#>3$jUzl^PhrK3o6`%Gd#G?m@>P-c1zW`7E*slJLmtCH?APrfL# zp4-Ki*Y~qX7ArBi*)g@gzgqEYj|lko&s4aJQ;pe*k^95F8GpPDb~ZXsiS%C$UFjMa zTbI<=01?POlmS3$+D4dTw!DnYg?9^eTm|}?=xtd! zF3K<@h?Z9Tdslm0{LmmxeUhZS?DM1IoYxNa{Y7TgAT*Tg7+qYkm}Ex0dZk+Au*( z_acG|z8vw*o5d!cB}>a`cyLBO_XO4Z_JaJ$N}-V>3(AkJbN(9fP2Yn=DXx<6NuRo><_F$@^fvrg;Voalmj_bt z^l5RXt_q0QEQ&|>hkCW(?-cl-#y2NSyo9u5{ojyY`=_7=h32p@)P zM^N!yrj#x1^lMXQw}c0|VS)u_GpF%Yu<*BqKeKEhSDx{(@|*<+)SB`{@cquad1GmP zvL%O+BK_UH`R`rdiL^1QXjc{%dV*cO!ew{4CwH(ND}?Y5if{ZO8u)+4F-0Y~$PNZt zKk=YeH}!uS$8B*hhSuGzEn+wfcrpRkkSmh3@fU+Ebw$`*$0_-nBoKYGT}(Q!hIMU3 zTIv#Rw|NT0&DWmX^IDpZ!A&R$H4&+Ooc-uj;Kk2D&#h=Ptg(wte+gVejHv;47yWJ@?}>9>>iEy*LQDm zpiieii2O}%w>P(kDvCJ=>+L`s{ojwZi}|9~wH>;6wN%pR%P?pbL(XDjv71^b%QnDDF5O4?G0=Qolcv9XyN;~Z`NUo;0h?t@u zD9H69vtW;f{{U?LfBRd;{u!}rc7d#|Ct_QxZ)C^*gI@=QEq@^#WsQA@`%>O&+K-R4 zsCA%=c@>U6L;O3q$o%W%dw9vzn18lw?)ZQBN6Tiv#Akcq8<{k{LL0Q;s|@`s=nYCV zm7~9a{_b!H$E|$nYcPTG!x-c6uXpgyrEhzpn+aPoCn;WrXGZbnM?MOrosIn}^-+S8 zT}|9^T*22h=ITrm=DNEbKuDolzEcqc+=DYCiftbwdopmrxnx!J=kTeMo1-# zXW{%xT=b*>p$*(0aBg-J4;WL0ZtY!RNd%v|d?aRD2l`Fhi0*9c%(U{-D= zo!cmuExkrLu03ED8mx@3fLAp6{8bDwffDB@lU#Mivva84JgFWJK}s-W^BpD4+Orps z@@pbnyNyCsg4`W|;-IszzP@wj3<1`=tv^nOPes54_02Y{4rY#@ZY(WTPv3q`QNEut zZS7CJz1$8BVi`-Gd83%2?sp8d`q;PfQBPqs+f+pAiig z!JZ%R@*GOyYmHh$=*N#8oBlx?h=rBmFYoS}iW&k+_ z@E!jEQ(X7M3ozEtGYlQLIQ2b0D*J4bmn}7Zr_bhd=8@iMwrqsSDd6@s(^*@gc6a-| zsUwOUDvz5re$viqe|Hzkr@61HrLpt#B$nhM&8C`b56Hg<)N4S9d4MgkT=SrFK?64r`6F z-${l3=;~_4)uo-Ac^1eM9@#Z&WE}RNYLO|P`|oxY9Gk9Z-x}>&v3Q`iLu880lJPC0 zEDjH)YG!W6u<)75_N?tq(#dx2>+e`r_m@-5HWJKwD%Pdfg>_rB5?(iwkI4*q#RIXB z+Jv_dnC*cr?Nw~_D~Tub@4qVVbZsKnO@zk?41c_8OO#Q&VEL)G7BO1hH~%72QX>)S0pwTf4~_M`0sa^2kn7g% z8jAwtoE@#@WDrMgEAm1JT+gs~aHH#yU!;E%P%pw=VmS_c%`pf4@SxX)ocvKor-Rv} z;6H=D7P0Z~#7!r|T7}A5TilsiNnGP(9f_1AHpc9lRN#YAHPH2Jskl zGA`e|&9|w^&o%goreesfh<6UczO((BH7nHkp=8#K(T0M3;PhY@IQ;0xVWld3$?Ozr zT2?Fm*rwC|7EQgax@`L;s7Gvl;#-ROTv{=QrUiXn`&!zVyj`Wok8CyfVwzbi@Au945K(i}x}*Xnbh&@7o^EFYW&T0M9@$ zzY6MV0=wJXK=>S!6DeQQHS%q!$r5_{SJ%I`bb(XC%sPqZ2k{m0t(5PV3(~x-ulPq^ zH{&i`Wo1&nyw!b3X5K)4=uuYy-gh3|YQD5QyGAR}1E0#CJ$sFph4_*C{{Zk3-YZ{& z9t?&Pl>W-KV10Kc?Ebau1mI@8-{8H2X`czaA!6hc7L{l?^zxLC#{_1*66v-?#=kGd zbv~&PhE_aM;W_!2M#@-EOR|lI8^pE+d?zhaS9RpQU{?(Rr&<+p~e?$=jt@*X7u4K8*P`AJ}u? zJZQ-zI+WqM@4P>s3Mvb4*q7i^TzMv4R(FjEReR!gDe4r31Pc2B-^)_om5Zm^M=j&( zgnaGt;B>0~(U)Q_`<^G@{{Y!b;Aewm^X+s6)Gid{Nq-|;ob~9(Z|Pq`q)|a`me#1T zM;HpKqYA1z00#h8Yg@cpgWm=$uAz31YSdC#XBe!iV;s_6?{I_kY-5r zmxmwh+*w?y{*}#s)*5Zjv->{y&dxkW1)y+A`@tPs1b!9Pd{Gi4z7D;JW$pYyW&Z$t z%pMl~BsI%^(s!?W@E^z4uw^BOOEPoZHV^b7y6J2ud!~L3UJ#xg)x&+`X@gz?;cMR~ zNDdzxcb~)x_g!_`4-DUk`FSmd>iO@&@rKf5UAe@I`8O5x*>6*yAJFP&@g3H?3fxMj zG>$e+z+fDKUVo+O*06ZCa}f*-W<$?4?S3n;vC|hz(d`f*blo6dQlh*YK+AaE`8RIF zY@lPdYw0k0o+c$|da-<>72x8l!6UH;J?hNysw`@}mZi70;FG}>=^lDT+iRVYb?aNJ zINC`)YXTck#J8nu!5;8Atu8^`_%iK3;UUvQFWsF6ezo>L?KHXgde0c*PqT#{;j80M z3&1V)D?5?*jPU{a*V#X`no2$$!{wj3ECU}?S=RWXY_?~?F%5zDb)<0ZAYwQ*YABVr zG3skV-qD@1!+~E#PvJa@hH}PxRO<)#k2SC?(>d)-mfQvbYjkqhhAVIv=H{!kN~G4f zk7)xm*M%D*tVStQ(wvZ)4gl#|GD5h*j+BvxjGT@!RS|NOL}5NsDZWz3zz%}1HXL;8 zOi1=}Dua}!V8h@FM~J62s-v8dOq~>uT9n8#$OUqG(4Y=YOwp)3912DN{GzVnXs+$Q zfH98sS&IhsBChiv%i56@cXZ~9kU$ubjCH1)LPl#x%UlY|ykZ*gDMpHf}#Id-ct7 z<`Qa?Xzs$L%#Ksz4}`ScGxnE6zreNC?)1x-Q^Nerp@Hz43#=KM1@t;r{@J-v+PYyuQ<#FEh(v z=#WOh$Yp-=OvLe?06cNdH|@pYoet+i@XwBuY^~rDsr{`!CE0lA;yivD(!myf5ibi7!bx!;8_JJG z#^1t~I##b0ADE>--L%p2iYJwr`ixgOcV`oc0UNsG>s>=56(EjA1z_B!)@{dV8c_O>iZY5ELx3_HP zzDn~|?k*t;cAf4|=nZ~-U*bO5d?zy%x+(I2z&ux1!j%#j9oWLZI z5_$^A2gKq)8J8tbLrPtiV4!vDimz+S?~vn+)blE#P@v_xq`;C%e8$)ZE7qy6nY@rN zf~{JBvj!)I1RT&*mnwsbfGmBWh|GE6g;QkOgpy8Zog^nGfCoxxeX#}oXfz{sVxx{K z#CVDjo)SJkNC>ifr=)}rY zaaMPjl;gj84GOQG81TN8E^~qpH5`och26+sN-%blkESRBn_Fnq<)l-aD2>n$0nzZguG`afEb}wa!*RA(wSQah3QtMj3HqoeBPB5X&EFF z+cW`6Swdw!0RC0w{{Rpq0@~HT+BN9cD0lAl2E5D1C}gpPv-et>G=cUH{1aElHoh7C zsI;pq*+g-8j>6|oUcse5y^VhoroW{PKIR*!cR;L)2^evMkbNuo_x+yyLvi6>j^7Qn z>tlwp@fMy>`;R8Z{TSEu&w2Y&cw@sq7w&!$c;#c!_%HDy(k(mVZ^SzY8_a^=T-23Mt}Yutu4|B;ODk>|ImoW#;*N^G z82HoUogeLEP!VePulA7H5{V`+yT3R*@@t;fAw=?8K0~N(Jq><^lfQ8vFPMBy8CIon zk}y`aVszdzbGovjh$t@ET>iCvA#}Hr?fzAbOJljkeH0{kQ3*w8OLb@iyx06U$r?_Wy%9{3e=@sj*$nsxBBx3(Z$$cS1%8`H4-tL=aI zVb6gYZM1fJ)}?-KrTJD@x)HH&_7fQE^{!f(y*R#BXs}Xh==_hKUE5g(K;V&5!tsm~ z_p9pf+5`4m)_xKn?R_5Q^?eAi4J)dNqTG1SF_Fma#eAaH{#%`=a2#i`uG}^*HC5ts zSHrlyOA|`6CzhuMsK})N5*&eA0@M`}Fu|xUBW1=$MRYTi!YwzFL67E~y zgC0D#A1fu-2iNyi`TKr+sQkAWUcZKG?@!p;YjyZ*<44Zn9pE8-e{)_oZ~PO{!hA=< zK0nmWrlf6SZNX8nqo5$ytb8An?JE?EAH3RLENs8pGfL5s*#WOy z_#u6=&efgxBZ1tIYxC@W=hKgjxrjm9e{a6G50q>Q;&3#E> zV;zmLfpYuFW-ZAjy4TNtv;6Stz82H262lQiZ5)1oaV&p({`$>*DPCO@qN6?&_`tW; zJ|omEESXnJl0`28I0b+iBDh}<>Y6N?sfSvMIP79!wOIUs1Jm)ZYWVc`*LU{ti)4)= z-d1KA-GR{kE9Sf31nRo&m93?v=!P4Mfx1N-dLB)3PjjXl9+BdmTUzm3Lu=v5eE4jm zb8QSnuYw=GAm%YB%P=`3j5>6nnLPRN#cE2Y_pMfB4=?c*b4Kj^tjbD zsI>uV-(*(+AOK-k*A+?#-5z7%9{^3RT0vrWK-YvcZvOzpqq`4U`k_1#<2^iR_F7fJ zlTKNa&bU#uC|^qA^qYIuw2xJSF%)XwyFJiXw)`(o6rDM)@8xN1W|@M<-!|X&fUR_} zq>h<%r_-10Uu%1k?VZHcX)h#>_U<%h-44(gjw>!5URX6tsb@nfhuWt!`bI3+ph35GIV5$eUL|{r%f^}h zMcM-n=DST7OH0i**4olAQB*X9^Z=flG~#CA<>WpOS=<1=%dkF8w)07s5UL@FGX z&T;8g{7Isj@8uR_%$yCWj)Uo42Zww#_LlL~5f%0Hv&@?yr4sB&y1&a0V*J ziEj0c7feZX*#6lu8xb+mySdCq{Uaclh5+|9nKMfjynkunu1`*Rtr7#~Zxs9~(mZiE z*F0lyzUEwFA;PG~Q}16ec-P=JhcvZC(BzrrGL?!z{EgkdmHHjx7ilbrL}v2=`H06+ zUO(aA0ZBZ++IpZS+i@s_@<=sYsD9U!`M+`?j7sx&k1-= zO&ZSP=HBh(<9eYO2nTAwhVxFcX>IM*VpZS)$6D+((|awd!x1H$f}rOjtCXob>S^gZ z#pV6jVoqZxIrJ6PcpJuApNaMB`)f?aXJ->56&pb*-#)eGFk5Q~Ws)#sc>01djy-GH zJ`RYj^tVVN-ttJsX2woiztWn4%PAaIyW))m+TPvXS&607Adm(tlFY-XugkBGH`;!y z;{mGaDE8@dY=xDFC4lD@`h)S~P1RoV+RMYX@WCAMu$jo)l|OqP_^-~djXoXHET^e|3|gHwxgP?1{1%+7GCn|qo_qT`yhwyz^)hXS1}Ya0BWX^_g_XNVod z=Br7vETHE#XhwGY)e40zlg=v8ii{s`PHJ?wI|H}gHGAyRNC^U!BanQoIjWEl7zvNA zDI&I!fh)*bxMG!o0Z9X}ud=m&fZiDJpTQgd02bVN*E+)5MQ~(i#A?!jcB11LT-P0X z>K3`t3T|5;6AApc#wx;3Gvun41Fi*T>>Il!>uP68?s7s>SMWyRj zL44SQ#_GF|PX5NazmI+;)pT7N4LeNTANG)vCy^GU zgJqW-klvK>Ul>7qhh?hj`fa8BchcLC(o71LUUrI;#M-urso1=?vZ_LZAzvA-omgqQ z=B;lHys^n7B$5v!aIOc%KL_<)erCE$_|UrpQ|O=U}e5Y!1<4+E9^~Q;D3m%Et&M|m6(8X0p$J$xp{ma z;;kyxW4zPlm?m)H4?mSmsL6CTjdk4ke$U{CgEZB;f_*Sa9pT)lPC&uWL%^?~z8?4| zMO{kL%SyFdQ4q>tWCA_UHNQ87d`YNkQEt*^3g2`DU_ZvaD@yQ>j&yOIH^cIYl<-MW z+w!RP45?N}tXp3H0ApN#XS~JbE0V()#dba(@fL-5FZOk%Nfb}a5IV>86%eWI~(gqv%6;sCXz-QwhqR$yh-67 z4eJ^@#j3B_*Bgn>3HsGbJDF{!mLD}%5OP_EAo^yxJyPxU`-xh6-LS@Rm^>VHqy}!M zb*1=z!We8Jc|=4ii1Jq*iLQ$4#CBROji#x28_2Vdn*)U>r4dP?TWOKSH}52r?FxUL zbAJ^l=c9euyV4KGrb7J-Tq+zs6aO4#u=)N)AH(%dfARbV$~ zIOe>^;g^T(uI(CqQZ-wNm=#s%0p_~RXTnpyr!B#dkr*X*`cMZk;_VktT@qbl<(KU@ zL-$dxJ8|>Z!9F$kJ>mErE^p-%UfoDoLxnq2ui;;1c-njEA}MJMxw0EmDA@PSeEV^w zYWkd$-py$=(>TKwjfqj;w-rlOVyRBY%o=CGFAw;eRJ*hJqP4eB2lR;ZdvN2gi6ou;h@ouf#J5Qk}oK7eDV72oNe6Y(Y1tsTy)7Rt%8sEf-!M^Xu| zDbRiv{6Mn0TiJALlQ1|KAZ_D}n)bxf{9$S2U-+ic)nEi~R}L2gjs<5VVsV~7vQGtC zEyC=Q$i7`me8ZmNypPBJER$65#Md_xqFEJCh!+7zu0?yNiFADv#nuwdeR$(=%Bviw z{0hEj_?lw1&~G%&F=CDcMH$D+=i4;;4w?D+;+wa**KTHUkY6IL=wVNq!-7R+>sJuT zd$l<#aBFizh&sCwfCg(NvAmBo@#p-7EKYdcTN-l&Oq0$9XL#Z?I<201hO5vj1RVV2 z3j0it_-Ogu-{Ur-buCxX0XeMeJ7-~&S}7Z=V!pDG^VLZK*a;%4$YgV#)pfJC1azPy z$-o#D*%KCuYRp#{sPa_xt1het#in^myf-Gbi3G~)jFZ}$Q9(B504hF);k84d0ZN8w*Rp3?VJk7F#CLv}Bk z67q6dve|b&?|Q#&AZYgg0Cu64J~P_BQ2GI=*gH>3n4O}b2aamo5s6RD&`?E-b}~q< zlhV2siWwI!Gn&Ae1ONmy)VguBcEX0>kbwaU#tLDs*0W5OaehRo zcOb~BmpAtohsr~=^{&2qSz%D1eQT7|tfZcB#dmvFkw$D~rm1m~WMXqtUF#QekF(mG z1NV=uXEl|?C+1Vn0D4y5k!4^QzM{nuIV0A(AZ2rF!+I1}%QuO2LA=I)a;^7wdY`9i zi&4C3^CKPyT6VFoeXq-cG38o9F&Yjtj^??E?wV1xcpuKRf+9?Lo6H#PTK0zDOtHGv z@6O0AVrgBy6$VXZ>DIDc%n~&uXPWU}kN!9j*)M@KX*etz^_2HtyC3yGg>=z_l&p-Z zO+{UwF8ISRU#&@{D1S3iKO@OGS~?bgl;N3v0|z zP3!&@^%N=c*&ZE9UsJNi>nYrf4=s=7U(g4_ZxP&Bd^+%bv=8MXX?Dbu?5b<6c3`x2S!R-54^d=Y9uFd(?jtHCQ!!s3owr7M7t~YjkOMcc2I9T6NKd zZt_HA;1ku`)~|TB3GC&FPNF%Q9)tPU8)bVbvbKh2VzBZs-Emt!E!3{HS?y<*KP<-% z)ysY1>p&90pzFE~jfT9<4wM~3!mdYp0&m3+GXd7 z^yB@btGD_ZfdmBSf!qq`HCQe@I>QnbVi|`WanROaF28Kna2xNslc&nZzo^Z0J{<7I zv8s4*>sn%?I2(3n=6rR*?O3u$srZjZg4cigJ+g1ydJ^WhE+W_bC8H4oG;rP^2tmhQ zrxXF7Xd;MQ!K%%&NfZTAcQUc6r^8qJHqA}G<;GPX`tw+NWwf$fh$js4vE9k!fIVwl z#GWVAHF>Rc`3lD!q6Ji5*yAVOv;(8kv@I%VQs+?BQYX3KFH^Yj^H(9PSV`giL9O?I z==+h^qap6Kasdt87V(Bvnlpe089w!M#W!(WeTPhw6JJ^;9hZ;;cAyG&o+G#!mGI8w zo_Rd~09w${^=$?g?^DfH9o+tibL(C8k{7c!b>fi)^!GjPgM|{&lV6{{RZy={MyE)t&O#j zlNOc$d2xY^pHu5j!#X`GScitLW4OF!OPAUr9=^54%8^;$i+JQ&Pz}HjL)xre>QJVc zZ>8BL<&Q5cpTu1D6_`Rm5$6RMjxs-)qQG>1BGskUX0nOOq*hUgln#TBN{_^|TismR z8z{CLcoI1r4yWFFNR|A1*OwVA&?;$;2PBMZjUazZFy)8#@GpV8RSz)4rbq1 zyt1=+5d&@^gJ+@WDc&gYh3>B&o1!d2Cbz>#M^09~_ ziX)0!b36f-7Q-&w@!qj~PkU*oYm(epKw-ByWCws-zZ3y)P4NBI<*nAE0_?MaNqL*@ zI9NX27+E&;MT~&M>cn-ff8p-6 zrucR49_G;uM9R7)YCY5m4upG-CLY5sX(B+>=w(xoJ9;FexyttcUbB~_5 zwbWC@y4BDyt+q*Rs6U6+qCakZHLdXNZ4(y?!+>+tP%|nQy1CXq*COmvcYqHH4{GTA zR{C}1wzqn6Y*vIUryMh_V72A#sPf9;T<05k#cgU@_LUx)r)e--Z=Fj#%y=C7Pz60Z zT)MH-TF^+#0F`9hyXEqO4CBqU@$=JOr@|%3NxNM4{G!6TSSd?%Y9ni z)I%{U(fQCWbd*a(&Cf`)l0=SY% zE??-Oy3jI?fpPXbt4XeYc*BMu_W;(fh-R?5*Y7Uuqxl`T1Nd~U4-t5CPth&3{X#3R zG8?!vkM_rKY;PYSHIOw*N!LGT{9V-S~O#mu>}B0 z;(a$&@Wel7ay;vsae$}h0QIb23+>Y_2CX($bpc~s9!+{jj;%F2@onPU^o|>OR7A0Y zcPMUz*9C8>-JxqJRYD99+#Ch(Kp+3t{eaNCCGgTMCB~bktj{(=w7)x&-Lu-fYs6j$ zz4&>nCb1q?+VGPaqwtOBMQv%GJ@E&JEuTudv;yWFuz43}PUKf-b)fjS;!lU5zPq`F zm}Q|%ZCsxD?_OEl+0tmN=X|^}hos@TIp5oC?G|0i4030T_Q3S3TJX8iJTotYbb;neA?1{0_0HUT*DIxHTK@ovVu5@^c$zh} zvBn&L=gi##jgE1_wqSsC?t4kJ_>iO;`E32gHHf8poqh93B@Pmfam&$AYA7mH5Q;@ZxPK_?so>0X8wZD3q#7q<#!w~d%v$JAhU zuO7GYln_|mTFYpBmvGV}j#~%4Xh}DK{8eSAYBIDiv=Uuqe92#MIp|G#T6n)r@ZpZp zCW`7ym&>p?11FmBj}czI&F#LaX%gGo&YL#II8)fyN#P%c<5ttxQ}H$7T{>Oc84o$n z8T6nD{8!=qZ&uggpTgRLTt{+nu&LUKk=WG!9q~2ZhpvBMYtTmo&}C$191uE?O?pm= zac2_8VW3-!Jvz(fS)7gT2Yz|0ULw%+9~wwc*&?`^P@+iZYh?Gx>sf(^7sQAyH6*q& zB>H=hr`1Dut&bM?ipo2{7!EW%?Xm@>=u1n2OlqSpIQWOcz5B3jU4RWCA*GWi&MR!iNFX) zIcnu~EmuarxSv^j=`Zdrg)ZM&MfXm+nF+RmKYsrkbEi7 zbo=Qwm^?rrw!zG7qajb~Xahq*n^^I3eYWmI)2uDHV)zQf>T5?=(~`o-YKe53m4fGg zls2;C(;aJ{@ut6_C8T;>M|PiW7%}0tZ)|c%?@#z`<1Y#8Q~v;A%WNQaQ?R+*ua93! zw8llG>N-b?RjsaW8p7f{wYs^^;0I&aRyuf-OVXlC7&l#9xM1=x@V0S*>s?=nJ{4K& zSF>ICdhpxJ1Aq_=fC#}Etk=F+o4X9Xk1! z_pf3QFd5(yO?+Vrgw-96a;$JZwfB$hRc{uR;x7+f&Y?`vNH(V<0|ZyXkwj+K9%kWL z*!%50EAM!B_y@~o-^4eVhG219+D5M>wBj^uW2I*`yO3E$RJ65`?wGeq_oWoondU_` zsy*h~_TN*rR$K{_h9B0Yjh-0*N5Jo1Z=~u6PrXKC$A58NwRxwPw2xA>T-(Y&BVRk1 z;S_b~de~e?Hion}>Z%5Lt*cwoc|9x7Rz_Z@rD@w;$VNL?g6W=$k=#lx=J}Ze6Il1Y zA4}d~{oN2dQ)6`gUY zusAJ|MZ(6hk{f&k1D?357gx-FRX7!r*F@#I=cQM7!tP_5LnNN$o_AGYG>$%2!L0eF z-Oz9;BaoB0oK|dT-hrQJQgUi`bW?`rv7?>A7^{1M`GLu-nPtq5F?YQA zSZ(7O4sl;1{@K1YNaoVM59t%-ECIUI{I(lbRv3mej^Gl+b~|faJuZ2uqH1Xt&xCHZ zTkjHUclzb_TI*AuNu(#JC5aiYt9~Epl7C}D%D66|k~(zFeD~n}A@wW7jTey0B*!Nt z;=b9?G~r{WTib;LYGcrFG0lF3gQlXAK2sSjN;cMFIf60yMQj;%w#dgyRkkKf^#Zi5 z?KVG}MpRd)3WuD^QHfam>w)iDmiHFXke~qF&MIl7fFV^FCb5>@UB%8qj+|9{LJfP3 zZGblM5BL>x65L9yxSXF_v{_aCYCC;1Qr9nqmXmJR67?W(symh^fGclHXS zq|kINXT?{>(@KG-WEp1u6&|GauWPXI9*?2gnfy%y>KD#3vBq}W#(fKQbDyOeb?=C+ zVYsu>-a9zwATmP|uLF!{8R=0RTxGFu4&%8Ni{Y&+!$qG^l_j{x-sxEyrmtf64dl2Z z*EOWx5Eo<3)oxx%Ju`~NzVO5l4YrZte=|?oA#x%Z^$P?;^MYuCTUN}Z@lo1%dfa5V z=C@(etyV3&DxFkk$YaTWXo_|KNvx*2gvq$3E2V8V+{iXZP+nTW_f{Y%RZwyiBbi_3 zL03~ybU53ZEv@54#yZq8!rStTkyY(VP-U5~LoW8?+Nec1XFboQOD(Z=9)^f4nlN1T zH10)-$}4=;lYI*^lM%&e$G;^{G_7kahXi06pJ=<4%6Pr)*NOFC5GH}AM%LCbl{XTO zK2D?tuUCu9fp#Fmb{*=<+cZquxTx9(X8?Dh)IrKqmLoKqleJnUlvBW3z&8s_>$4vhKN^Y`}y_}@*QAzwoNoH`ni2ndM zt9rtjES_$G0VI0nqcMNGX4o%@AJ8|!$mNUSM}#7r=0(zMvVZN8*P}{;NXnY>&w*3i z-25EyWyR9%chap6J-o4l^dkgUsvfoZjwg0~LC*u_Nwk{Mg}APFP`Ol}gWk98u*e*G zSCn-xguJ~gF8)y)j19#0tx=u4b*dX;dyaW;N+;NeJ#J5KienFq78O1~JW`Mcu&S}h z8RS*xX{8}AV}n_f)M1h~Qm@joBDq_8zq3XT8n%pJjEb%yUpO-_%qm+NYf|3j0F%&lri+-Q zZK&BJtwr_7*S~Kul#!xZbMvZh&{rWgRopey@E9#Hun^2ukgY|2Ph8$Zi2iCkR!LWwX zE?YRkQ~4a%y5Cx~-VfCTjq?jYe_HV$1ZA{~$n($&`i!gX9QlDXS63IeQA}hdoroWW zdAEmOcf>2;+!44R#=T!kfcf_5pl(uY&9o~9m*Q5T2T1^8Yw2)Xv&F>xC#vmq!m+Ij zBxy@zWCP7IYgfyWj7QYd^r=iP%y2{V`B$KiJl8Q8P~~x+m1fR0ED7T@shcg&fz> zQhw><&*B^dY+%BcB_xf*BCM7v6CoKj6kEn~*0(0bY1~G~Xyj8%Zj3teO%el=8>y(+ znB&6rtqjKQVsVPGw{{hVD!L?$Hwv)G?4zDV24sFvPBGr2nVAR*y=u@y{B;zYnBWZJ ztC$G$^7GcC1G`hooaeO;Mg>q16;g4Ef<*xCQCF5T)YNSeQ;GxGnavx?*NR1qAoP1~@dM40iOz3>&RCpsXfIYSRX83(sF#@;};N<6evLCgVu>QQ&K} zk_Wy)sNFt93Pu%GPw@b9SoE)r8cX|NQr>AHM#yxIMo`_k!K`)64qbY;QR`kjGKChK zXQc7kXph<-g&z#OH}HeP*Sc4Q^%(DUE8xu~)Qq{3O_)-k9uayETKw$zt@}85hvCka z{x{Y&>s?4{7cSFB5IfdM4stR{Z0DXU!0fNCEoT$OJn*`V21%q+0qysxZuKk6#@%;u zJl(;PLi~=MYAEHkAyw2;CZ;h;HnE9vb~zt~aeC#+jtLvSKo#1~JkOZ_01a^(>^@{A zee+x9KLaws{{RvtzXV>Dy1OgKnGssD(M24giO${+<5_+dRf_W`fFn7rdzgSN8lGF4 z{Q9@VeX1Oh2XiMx9sO!X-E!)ne5+FB3_>OQsruF1VH6=*$H+OXfUB_)!R)#GYHMba z<1)-K*+mmLn`*DhgCtb3Be-8IXE@@sG%g!RgbNfyGLmvfT8vs7bl%~(Jm;aSYp6@7 zTgo9tFDL_f>JPO%&*nuN+!6@;!?F5Q^8t%=T%EvR9`#yC%OZps$6CEByS%tvtJoSM zwva?OFJ7jOU?D#=Xa~xDD#w^`vFzFEeQE0(B4iA&tydY6c=xwC>Fq}_5~wF}V~_{y zQb!>QWCL+goK!MMpuRamX{jk_NGAt9DCPq?;^tQedt|pzDmY;zfH(uGr`%e$@Lc16 zOx38MAqXFKoxr9W=J`i7*Dg-eR{sFijDebF$0L3@rUA7ggbt+hO^#Am4Z$Lo7+mi2 zKBA_!wPut%46PRex0V=+e37V+1GjpyG+tAc_2?-)hi4t}MZkjI-Ci=-$rUV6dD85U zf-6~LmMdmdTyE-WZ6?*EM==bQ>T5o5F=jC|?~w;;EwUI6uM3tuh>q?l2qls!E4(SjKXGVrsx^f>_3!k-;6RN^wwjCIKmEDJWmEqEeF0z6mx(+{;%ol^i(Vi2 ze`RcKG*-8`zP-6}GjbxrBrzyCz-G%6?Z+JRV&i$ERVyFNzPDqj_q{DEHi`dJJ+k~_S$d4KiW&gI(DyO zm+#^2Zup|h^C0v0O9Z<}!TDrTKDFciA-K5Lwargo$&yQ{8PC5xO?}o-{m7p!n0#!@ zON^iZWaB@jM{#iC(&0(_$%=|IB1z^EfJOkR?(O80PPv#2ZH$`wB=Koe(;|RoumHU*1svgW?zQdKgDl|-W~8Jzp1{PZ+UMtzGOjs$9PjA7j{4_IpiAs zI{1wVkM?xd?Pfd=3yl8&ye-t%;>U$`y-P!%OV)IYx6}0vInr1rh?RKVc?1z&CS4aO z)KPk!xT*5EC$anc;OzrX{ht0D>v}Jel3QpNv))HKph<3q(*FRxDh69480NnTFFa%7 zZxr~3e;jK!^FFtKH`+vnh%p8^R9{6=fB?W4HT9OC`)zz`lf#qfdeUjy!`wpfHRQ1Q za};$dGOBhGI-CKT`3@T}9a}g6n6J{i^Ua;(T!ZnRIs5&g;ET zO`6tLJfAu+$Q+-j2k@`O*VFFw`>C|6+==x09tm^Zp>4VRabLE7vaXjOfWKy4J6`c~ z3u|Z+>ilox7VgE9KT-Va@z=&Wy{C!1Q>=K4O@!OqYL{|Oh;jE=+76X-9NI2iu5ms9t`od z$BX1K#tD)n9b}k9R|7qG_OA;!s~=};o~{y`<~~vVqOPHj!(I&gK7P>9-YkxO=npnP z6`SzDT*ahY-P)$+PMGciqvQ3*{9Atq-yC_f&o9f_LpDgQ--H&j4I@srN8K#QS(N%S zbC0Eb20h#*MnKXbojzY^bn!V#ibu~xI03K5T-OVphDV~YD8zEAy`%gLgxidqOQ zw3~RNjzj+dEgi;772_GNtH|V6mxp_sRX%U{*&D~Awe_6At|H#I2)S>Sxl#puc%CZ1 z{?f9s`Bv7|cLc%t-M_p&&3(1;Qufos`ev`G>URRwFJcKBU>tN)n)uq^N73f-E{3{I z-`f`Q`p!8dBy;=V3aGAm?sP+A>!|c!1^5@hw;nV2w{-=rx}wW;_iyFH0DJ)+GBU)F zJCbk(e207cSboGFFT0k@#9F%9==MY`Q5BjvrDgsiu#EBUYv&L6Dc{8XV_f)$r+g@} zxp?%S4_YPN%pu5*Tf3pT8L^D)j{pwan;6Nj%F7Q1S?bdZi>$73oMA`kD%AxcMpoSY z`-k?g{ebn05BNv!HH$cGkZoTvCshO4`qti^`$vAjx?QUHb`Kb7#>?+6_no5|{{U+l zufUmp6=<8pmhT{tj&gE8Dz7iY9W=CLu_SfqD}Si2^ZJH9v{&BO%=SdVIxV>;u1;ehHwUd8vcB4z8=`hf6>7K zGt}cEv!n2Yc9W#myS%`9o^g((bf}&UC3}>bKcqj29t4KpP_VzTxRd@7`=8&%Djpo; zcv5}&Ak|GH#aA~(*h1lKp}f>zTvp}urHM& z{c@xlxu|RUHod9CcMXb*Siwgun@Cp2LE60eD>9Qf`R$j)H-BK$m`NPxX>-6|$I`tr zZ6*yLM2AVVxM^8YaC@UE$)MQDgv$01S~ zHsddzYt-#+?O<5$6;~2xVxBSURs~%%!go5v&m7X2tm7a#0A;;ZeGWVJuRQp_@$2?s z_%$MEzY}~%XQ$pmgBGC6HNY6i+>r)ho-w=Dy;I_cj4r+#d@N6#@6JR~`qnj<{1jXE9=eFY+Kli6jluNk{{WZ=HTWO@00@Sh zh^pf|&q0HV)`P-+9F8&?-!IscU9rKZ)P{cZr|swa1zVrAF0&R-_q6MS`Z87Mf8e9P zu|Au==SkKic~Eq>(`8maOsb0f0bd5_(oO`)@*MQ$rXCK_;+t)(Ocjqz(^PCjcR!{- zgP*n6!2bZ+4^)%GJ`kSd-pLa=x4yRWOQ7qFk`El$(t1XTr1)yZtu)Amy}nD4l6gMo zn*MVC0Al-t;Xm4cz(Nn*MW{KPe<|57MQ|&cw8N z=Z){5#9AfHnp!UHHe9iDgSVl_*1s+P0BHz}J|wugXUfL{1x)qaIj_*)2I^P$o+;FH zpA!UY9Z)huA{-6Kf31FYe$|2-e;Z%LYC}P77>!6haa?sxVeua|_;eg9WB7&*Q~1kp z>EZiJWc$VWs~#DYHpTows{a5NnFgDtyN{KoV1Fuzd`Re)%=!1hw-7>-3#JjtEX}kN z!OyAfUabY1GHxg4Cb;hc{0{N2#Saf_y1#{BOW*8A`K|ZjX~9y>xT?^jO4$`Wmd=BomFPvI2@{Ez8-U{! z=%y`^ih)=vfO}P#Bisvgts=>2b4io2Ml)39Wdm<U~^xNZg#2@g?w`{yf_7;Hp;ezJBFy3MbZlrPT)K}>*#o1Eh_IuPM zf8o=uPCE<*uOl*k^bX7__gVRRmms>B2GtdPrCXK#Q{?kkVIT2V8FJI4TL z73!-v>T_RH*ZvLoFH`u1Wv@t|-&!2O^^{>0XYVVAeUIFlj{3{&> zlmGQ|zNw-RI`0>tCfx21Pt*rDGo zeE$IPLr}QXuNT8wT$yOWlHj4}J1@DXErJ`KpZg+f@=x*Z8=H8({e{eb_wb6-{j#F+ zzBs#o5Yyow@FkJk{{UvJzknJo@53$M74<01wwnZI5hHOW!x4~>spRB?ll?MBhkQ%; zi>~}s_=kJqTiAS)ba50b$ci!1OLr%|eD*G?l=MA}JS>l(JPWPbC&1qoSU$(NzSQ*g z0f*g%cKpZdwScaF!4~r0YiO_yy9*K+^MTygH{q*^q3}+pq|Jal>uCWa(>eZCq2P;& z?XRwH5%3!;`Jeu^eD+|jnd@P;KT&=FYg#pq_rA9i?>kWc0M9&s4&LON{Uq@9wAT7` zV&%&`fH55c=bQ@s%l(`5T_4S|)U{bmvLmdiANMiNPpCEel>>=mNfhwl5%|~5VdH6@ zoo|I6E%E7YKj91#+Sx7Skjy0c#!+^HIr`?j6ZUG>F0U-LJFB>s6*H3~pOr>GgncXM z&yAWr=BeO|xvcLR+3eM&*fF+VF|_9&g?w}28+&+ljX%Kped?mX006B=Dl^u zu(B#%CI0lxauYwo2+17qFi)!ZH&+_ z5O}{=c9MNtP`H#9IV2Y#ewd<+osvYjrzY9^FJu1z1zi1~<`Knzq-&O!4fmt_JZ=~M z1SA0d71uBP6#MpGaue-Zu$Q|1fbsb6!Tjs+M$bpFlqJNGg2~S{4ElAO$nP2j$EQl{ zQkQc+NcKOVTQB%2SM15CUHy&=-BW*j*pLUW@pi3kTmA|s`!#7ct#taG{KZB>rHq*; z(=CDe*Ymli=#TcbyS9@aLvLceNc85rtwu)GAyFv=Z6pO8jAM*@P~`iS8gXaz1@NEt z?)VY$d&D-r7SQgmEHz8#5kVd79$1miND9EP>0edqT0MlbwySVobV^A9u%{m1;a|(& z!L2&$!XFhp8{(<+BoOMB(<-muD6NCXZVyWSocuu^q2gZ)I%sTd-tkm}AlSw>$rVuBElUS#YXcSaRZ;9mv3spmfC1;?YutMQcMO! znK&DTQSkH1c#bqlW% z+$&2X0P{c$zpCJ{13uNkeXm=;((U{=pq4U69%hgna@|E^=o($_fiQ<&iQe6u?O;hc z9Z90#d$6z?1T(?m8)0*FIgOhb_s2}vU1@zEhkQRjh*Sm8zWZk!L! zypKZhg!;y-Z5^RoSj50=86}6lYvzCWC~mvrt8WC__j?43gbMKC8Xwq+} ztdHCu_v|GzfdT|TFo02sc%MRdoucZDV z&i1}Cx4)MGEn`xg;QZZlUMKM~<3+xbOZixIg173UaUTGw_jwsF!TlB7*z*lH&BS|@Zt6y`G{{RgiHJbcqsX{RrUWTo~7W0-p zD>^6nw=YVV+yv`iQAqG=ni~~co@jNGckcRAVdMuDVc3I!I@fe!WLFl<&ADk7*+YEo z&0O5*Frzu4VKU(E=B_JKGB$=1pbX}n1ZfaB87J0<3lQ4)Bzjb_Pa3EpGJWcR^S_98 zg7Zd`2WucaSE_!>9y^9#4Qjp(*3RGT?bAYfovboI9-Mx)&gzy?-rKV>=Zf$@2Ka{O z;g`f%^|xO(-r8T@AQ{~Y@Z5LBaN{VdkmYAq4y}*9biWj8I+mc)`C=PEDUAn0K<;bO z+bk=Y@nN&oG}|8+cz7%6*T|BiM~r;fIpf#*RjnTMT|hU#&F^0aS~hk*nw*nYFFO)( z(-k}y4V-oqjUGwIQB~LFBvvMdl#??Kd8)=axRW>((A*Nd)VuONWB5>87_9rtXNu8+ z_DH!?il8yZ-t{irk4gwS+iiB~BMR-fd)G&8ty;{XXFxsc&eu5kjYTxd4iwU`9)ojx zqHdR5C^I(gku1{C!@g;Vh_jWnMJ zS+p8%+nqp;Pf#lCNms{yEr-DRIIz>$Hm`QL3;zH-l=UaxzCyjXOV*M}+{rABxUuS3 z^{bvE@eS6eeJ$nVnWvG7XZ7?0+PR^3ESX|$E}6P)HT#{U__pHr!d@S@)2{x>4W^%NLUWdF zgOiRsd)LZwRBWPs20-t2aTd2%`VH&Z3t_QKADKUq_O6ph)>}ien^KP968Ri?VEn{} z@Ay}JrRe%*zv0`9-9+rUw}s?JAI4X=<6ckUoj**}_1G=-%YkQXcM_!SeD+%S(>dQJ<}suLe5fCgh%gz??BH{@ZJ6VJ_ftA)Bga{bv;eCXUqcw zq5MFs-7EeP_;meKMezV;)EESaee7)=Lkja7tpmhf9u~ja0K~H9NSPlw!Nx`_bHWR9 zH7PI8?@CSpFV1&*=71_gYKf`F^UdX;82PvzItuGq}aePl%o(5$TW}!aN1+0PbtgJV|$?*j=Wbqh@!T z8>KxIp2EA|2x}UgFs75Bh~S=P+bqO<`$xS1bB`tdfjih-pPDnUjO2b*x2^bsEk?r9 zOS`wZxZAKMFcC#^{vc_k)+Vwi%$_#exN=#IMX6|-o{@9*Yp_X?6_tl!+)xL5VWUl^ zXlt*svc1SL!=8Hg#d11zlxFc(^@<#TSmOh6>T5QaX++io9Ji=TN!6 zg5$}C91vK2{{UPH$g;fwA1jzb{K`4UJe+o``nA4=b``WWm&z(U)_#6|_@ED8@DGZv zrwL-P=S(>Sw^CZX^8Wx(@Wz?rd2RKGKhffqw;&nHo|R+57f@U3wwisc%#pDGlhUmG zTF@>ZTaR2=0Jo3?F1!{i>p)nsUEd!Sg_H@f}Zv%RO&HL&JXaO*s2}@)ok=_N-axL-Q`2(1p}T~ zcC5hU;M8xdH5H0ARg&G#dyJ{Bt6PHeT$VfQ_DJ2-0;oEQr=KMP!90RJYPW&4nI*c9 zO0t!qdF1`;0sJGb4SDXJ{i�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 z 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 z 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ʙ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

X)&m_f4>+%c{6npHQp?7At^WY* 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

    V+?n-u2}vc(n$VJwoj8zgUqMdD_rwbx}tS;{Z( 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

    b)BEqRnxqAIBoK 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�&P>FZo~x5dA()w~uRh-_)^X4-+f@EP*8n@x7lv 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

    SGzTV=kF>uaa9L{nZ3!Yooc)s> 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%0A(RZU*%(qiapp}X! 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%0Dn#9q(9pfJmN&T;LZRV}hd5>{4fNuki6y)Rb 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

    &uD5qgq1s8w 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

    Ji-Ya5~05HW6)$~wx;k*g;#Cbk&fe< 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%0DGYH*N~(~1CZ%BKy$2d}B6Y#*2& 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


    Sv;1( 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 z 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 z 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

    p#;axu3 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 IwDAU!sc~g{Z8`q{VpKn-Yk4k6RaIffp$GX_ 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�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%0ANg%JWG()2=n!q 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%0AhB3-$TIEJ&;TbG;B}zTMLigkx~;`{ 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%0D6f`^IwN61I%% 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

    KrjP@1g8cmyBU&k3=mv?bq$*9{!ad7D> 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%0D^^h&sgym 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 z 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

  1. 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 z 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%0DQeW)`Yf181ximp$$(`6{*`yoYJu*K%Lu< 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

    %&;obHt1kx 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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\ + + + 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 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD24000000 -FC8000 -FN1 -FF0N32H76x_2048.FLM -FS015000000 -FL01E0000 -FP0($$Device:N32H760xIx7$Flash\N32H76x_2048.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC8000 -FD24000000 -FF0N32H76x_2048 -FL01E0000 -FS015000000 -FP0($$Device:N32H760xIx7$Flash\N32H76x_2048.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 + + + + + CPU + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 2 + 5 + 2 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m7\context_rvds.S + context_rvds.S + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m7\cpu_cache.c + cpu_cache.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\..\libcpu\arm\cortex-m7\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 4 + 20 + 1 + 0 + 0 + 0 + ..\libraries\N32_Drivers\drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\libraries\N32_Drivers\drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\libraries\N32_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + board\Cube_Config\USER\src\n32h76x_78x_cfg.c + n32h76x_78x_cfg.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 5 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 5 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 6 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\src\clock.c + clock.c + 0 + 0 + + + 6 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\src\components.c + components.c + 0 + 0 + + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 6 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\src\idle.c + idle.c + 0 + 0 + + + 6 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 6 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\src\irq.c + irq.c + 0 + 0 + + + 6 + 36 + 1 + 0 + 0 + 0 + ..\..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mem.c + mem.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\..\src\object.c + object.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\src\thread.c + thread.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libc + 0 + 0 + 0 + 0 + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 57 + 2 + 0 + 0 + 0 + board\Cube_Config\startup\startup_n32h73x_76x.s + startup_n32h73x_76x.s + 0 + 0 + + + 8 + 58 + 1 + 0 + 0 + 0 + board\Cube_Config\Driver\CMSIS\device\system_n32h76x_78x.c + system_n32h76x_78x.c + 0 + 0 + + + 8 + 59 + 1 + 0 + 0 + 0 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\misc.c + misc.c + 0 + 0 + + + 8 + 60 + 1 + 0 + 0 + 0 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_gpio.c + n32h76x_78x_gpio.c + 0 + 0 + + + 8 + 61 + 1 + 0 + 0 + 0 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_mmu.c + n32h76x_78x_mmu.c + 0 + 0 + + + 8 + 62 + 1 + 0 + 0 + 0 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_dma.c + n32h76x_78x_dma.c + 0 + 0 + + + 8 + 63 + 1 + 0 + 0 + 0 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_dmamux.c + n32h76x_78x_dmamux.c + 0 + 0 + + + 8 + 64 + 1 + 0 + 0 + 0 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_pwr.c + n32h76x_78x_pwr.c + 0 + 0 + + + 8 + 65 + 1 + 0 + 0 + 0 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_rcc.c + n32h76x_78x_rcc.c + 0 + 0 + + + 8 + 66 + 1 + 0 + 0 + 0 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_dbg.c + n32h76x_78x_dbg.c + 0 + 0 + + + 8 + 67 + 1 + 0 + 0 + 0 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_exti.c + n32h76x_78x_exti.c + 0 + 0 + + + 8 + 68 + 1 + 0 + 0 + 0 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_usart.c + n32h76x_78x_usart.c + 0 + 0 + + + + diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/project.uvprojx b/bsp/n32/n32hxxx/n32h760zil7-stb/project.uvprojx new file mode 100644 index 0000000000..6c5944875d --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/project.uvprojx @@ -0,0 +1,2150 @@ + + + + 2.1 + +
    ### uVision Project, (C) Keil Software
    + + + + rt-thread + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + N32H760xIx7 + Nationstech + Nationstech.N32H76x_DFP.1.1.0 + http://www.keil.com/pack/ + IRAM(0x24000000,0x20000) IROM(0x15000000,0x1E0000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD24000000 -FC8000 -FN1 -FF0N32H76x_2048 -FS015000000 -FL01E0000 -FP0($$Device:N32H760xIx7$Flash\N32H76x_2048.FLM)) + 0 + $$Device:N32H760xIx7$firmware\CMSIS\device\N32H76x.h + + + + + + + + + + $$Device:N32H760xIx7$svd\N32H76x.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rt-thread + 1 + 0 + 1 + 1 + 1 + .\build\ + 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 -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 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-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 3 + 0 + 0 + 0 + 0 + 8 + 1 + 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 + 0x24000000 + 0x20000 + + + 1 + 0x15000000 + 0x1e0000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x15000000 + 0x1e0000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x24000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + + + CORE_CM7, RT_USING_ARMLIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, USING_TCM, __STDC_LIMIT_MACROS, RT_USING_LIBC, N32H76x, USE_STDPERIPH_DRIVER + + ..\..\..\..\components\finsh;..\..\..\..\components\drivers\include;applications;..\..\..\..\libcpu\arm\common;..\libraries\N32_Drivers;..\..\..\..\components\libc\posix\ipc;..\libraries\N32_Drivers\drivers;..\libraries\N32_Drivers\drivers\config;.;board;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\smp_call;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\net\utest;..\..\..\..\components\libc\posix\io\eventfd;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\inc;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\libcpu\arm\cortex-m7;..\..\..\..\components\libc\posix\io\epoll;board\Cube_Config\Driver\CMSIS\core;board\Cube_Config\USER\inc;..\..\..\..\components\drivers\include;board\Cube_Config\Driver\CMSIS\device;..\..\..\..\components\drivers\phy;..\..\..\..\components\drivers\include + + + + 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 + + + + + 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-m7\context_rvds.S + + + cpu_cache.c + 1 + ..\..\..\..\libcpu\arm\cortex-m7\cpu_cache.c + + + cpuport.c + 1 + ..\..\..\..\libcpu\arm\cortex-m7\cpuport.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\..\components\drivers\core\device.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_comm.c + 1 + ..\..\..\..\components\drivers\ipc\completion_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + completion_up.c + 1 + ..\..\..\..\components\drivers\ipc\completion_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + condvar.c + 1 + ..\..\..\..\components\drivers\ipc\condvar.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dataqueue.c + 1 + ..\..\..\..\components\drivers\ipc\dataqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + pipe.c + 1 + ..\..\..\..\components\drivers\ipc\pipe.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringblk_buf.c + 1 + ..\..\..\..\components\drivers\ipc\ringblk_buf.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + ringbuffer.c + 1 + ..\..\..\..\components\drivers\ipc\ringbuffer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + waitqueue.c + 1 + ..\..\..\..\components\drivers\ipc\waitqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + workqueue.c + 1 + ..\..\..\..\components\drivers\ipc\workqueue.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_pin.c + 1 + ..\..\..\..\components\drivers\pin\dev_pin.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + dev_serial.c + 1 + ..\..\..\..\components\drivers\serial\dev_serial.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_IPC_SOURCE__ + + + + + + + + + + + Drivers + + + drv_gpio.c + 1 + ..\libraries\N32_Drivers\drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\N32_Drivers\drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\N32_Drivers\drv_common.c + + + n32h76x_78x_cfg.c + 1 + board\Cube_Config\USER\src\n32h76x_78x_cfg.c + + + board.c + 1 + board\board.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 + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + components.c + 1 + ..\..\..\..\src\components.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + cpu_up.c + 1 + ..\..\..\..\src\cpu_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + defunct.c + 1 + ..\..\..\..\src\defunct.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + idle.c + 1 + ..\..\..\..\src\idle.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + ipc.c + 1 + ..\..\..\..\src\ipc.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + irq.c + 1 + ..\..\..\..\src\irq.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + kservice.c + 1 + ..\..\..\..\src\kservice.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mem.c + 1 + ..\..\..\..\src\mem.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + mempool.c + 1 + ..\..\..\..\src\mempool.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + object.c + 1 + ..\..\..\..\src\object.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_comm.c + 1 + ..\..\..\..\src\scheduler_comm.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + scheduler_up.c + 1 + ..\..\..\..\src\scheduler_up.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + thread.c + 1 + ..\..\..\..\src\thread.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + timer.c + 1 + ..\..\..\..\src\timer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + __RT_KERNEL_SOURCE__ + + + + + + + + + + + Libc + + + syscall_mem.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + syscalls.c + 1 + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + + + cctype.c + 1 + ..\..\..\..\components\libc\compilers\common\cctype.c + + + cstdlib.c + 1 + ..\..\..\..\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\..\..\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\..\..\components\libc\compilers\common\ctime.c + + + cunistd.c + 1 + ..\..\..\..\components\libc\compilers\common\cunistd.c + + + cwchar.c + 1 + ..\..\..\..\components\libc\compilers\common\cwchar.c + + + kerrno.c + 1 + ..\..\..\..\src\klibc\kerrno.c + + + kstdio.c + 1 + ..\..\..\..\src\klibc\kstdio.c + + + kstring.c + 1 + ..\..\..\..\src\klibc\kstring.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + rt_vsscanf.c + 1 + ..\..\..\..\src\klibc\rt_vsscanf.c + + + + + Libraries + + + startup_n32h73x_76x.s + 2 + board\Cube_Config\startup\startup_n32h73x_76x.s + + + system_n32h76x_78x.c + 1 + board\Cube_Config\Driver\CMSIS\device\system_n32h76x_78x.c + + + misc.c + 1 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\misc.c + + + n32h76x_78x_gpio.c + 1 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_gpio.c + + + n32h76x_78x_mmu.c + 1 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_mmu.c + + + n32h76x_78x_dma.c + 1 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_dma.c + + + n32h76x_78x_dmamux.c + 1 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_dmamux.c + + + n32h76x_78x_pwr.c + 1 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_pwr.c + + + n32h76x_78x_rcc.c + 1 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_rcc.c + + + n32h76x_78x_dbg.c + 1 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_dbg.c + + + n32h76x_78x_exti.c + 1 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_exti.c + + + n32h76x_78x_usart.c + 1 + board\Cube_Config\Driver\n32h76x_78x_std_periph_driver\src\n32h76x_78x_usart.c + + + + + + + + + + + + + +
    diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/rtconfig.h b/bsp/n32/n32hxxx/n32h760zil7-stb/rtconfig.h new file mode 100644 index 0000000000..ffa1cb5879 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/rtconfig.h @@ -0,0 +1,424 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +#define SOC_N32H760ZIL7 + +/* RT-Thread Kernel */ + +/* klibc options */ + +/* rt_vsnprintf options */ + +/* end of rt_vsnprintf options */ + +/* rt_vsscanf options */ + +/* end of rt_vsscanf options */ + +/* rt_memset options */ + +/* end of rt_memset options */ + +/* rt_memcpy options */ + +/* end of rt_memcpy options */ + +/* rt_memmove options */ + +/* end of rt_memmove options */ + +/* rt_memcmp options */ + +/* end of rt_memcmp options */ + +/* rt_strstr options */ + +/* end of rt_strstr options */ + +/* rt_strcasecmp options */ + +/* end of rt_strcasecmp options */ + +/* rt_strncpy options */ + +/* end of rt_strncpy options */ + +/* rt_strcpy options */ + +/* end of rt_strcpy options */ + +/* rt_strncmp options */ + +/* end of rt_strncmp options */ + +/* rt_strcmp options */ + +/* end of rt_strcmp options */ + +/* rt_strlen options */ + +/* end of rt_strlen options */ + +/* rt_strnlen options */ + +/* end of rt_strnlen options */ +/* end of klibc options */ +#define RT_NAME_MAX 32 +#define RT_CPUS_NR 1 +#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 + +/* kservice options */ + +/* end of kservice options */ +#define RT_USING_DEBUG +#define RT_DEBUGING_ASSERT +#define RT_DEBUGING_COLOR +#define RT_DEBUGING_CONTEXT + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE +/* end of Inter-Thread communication */ + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP +/* end of Memory Management */ +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 512 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x50300 +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +/* end of RT-Thread Kernel */ +#define RT_USING_CACHE +#define RT_USING_HW_ATOMIC +#define RT_USING_CPU_FFS +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M7 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 4096 +#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 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + +/* end of DFS: device virtual file system */ + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V1 +#define RT_SERIAL_RB_BUFSZ 512 +#define RT_USING_PIN +/* end of Device Drivers */ + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define RT_LIBC_TZ_DEFAULT_SEC 0 +/* end of Timezone and Daylight Saving Time */ +/* end of ISO-ANSI C layer */ + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + +/* end of Interprocess Communication (IPC) */ +/* end of POSIX (Portable Operating System Interface) layer */ +/* end of C/C++ and POSIX layer */ + +/* Network */ + +/* end of Network */ + +/* Memory protection */ + +/* end of Memory protection */ + +/* Utilities */ + +/* end of Utilities */ + +/* Using USB legacy version */ + +/* end of Using USB legacy version */ +/* end of RT-Thread Components */ + +/* RT-Thread Utestcases */ + +/* end of RT-Thread Utestcases */ + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + +/* end of Marvell WiFi */ + +/* Wiced WiFi */ + +/* end of Wiced WiFi */ + +/* CYW43012 WiFi */ + +/* end of CYW43012 WiFi */ + +/* BL808 WiFi */ + +/* end of BL808 WiFi */ + +/* CYW43439 WiFi */ + +/* end of CYW43439 WiFi */ +/* end of Wi-Fi */ + +/* IoT Cloud */ + +/* end of IoT Cloud */ +/* end of IoT - internet of things */ + +/* security packages */ + +/* end of security packages */ + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */ + +/* XML: Extensible Markup Language */ + +/* end of XML: Extensible Markup Language */ +/* end of language packages */ + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + +/* end of LVGL: powerful and easy-to-use embedded GUI library */ + +/* u8g2: a monochrome graphic library */ + +/* end of u8g2: a monochrome graphic library */ +/* end of multimedia packages */ + +/* tools packages */ + +/* end of tools packages */ + +/* system packages */ + +/* enhanced kernel services */ + +/* end of enhanced kernel services */ + +/* acceleration: Assembly language or algorithmic acceleration packages */ + +/* end of acceleration: Assembly language or algorithmic acceleration packages */ + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + +/* Micrium: Micrium software products porting for RT-Thread */ + +/* end of Micrium: Micrium software products porting for RT-Thread */ +/* end of system packages */ + +/* peripheral libraries and drivers */ + +/* HAL & SDK Drivers */ + +/* STM32 HAL & SDK Drivers */ + +/* end of STM32 HAL & SDK Drivers */ + +/* Infineon HAL Packages */ + +/* end of Infineon HAL Packages */ + +/* Kendryte SDK */ + +/* end of Kendryte SDK */ + +/* WCH HAL & SDK Drivers */ + +/* end of WCH HAL & SDK Drivers */ + +/* AT32 HAL & SDK Drivers */ + +/* end of AT32 HAL & SDK Drivers */ + +/* HC32 DDL Drivers */ + +/* end of HC32 DDL Drivers */ + +/* NXP HAL & SDK Drivers */ + +/* end of NXP HAL & SDK Drivers */ + +/* NUVOTON Drivers */ + +/* end of NUVOTON Drivers */ + +/* GD32 Drivers */ + +/* end of GD32 Drivers */ + +/* HPMicro SDK */ + +/* end of HPMicro SDK */ + +/* FT32 HAL & SDK Drivers */ + +/* end of FT32 HAL & SDK Drivers */ +/* end of HAL & SDK Drivers */ + +/* sensors drivers */ + +/* end of sensors drivers */ + +/* touch drivers */ + +/* end of touch drivers */ +/* end of peripheral libraries and drivers */ + +/* AI packages */ + +/* end of AI packages */ + +/* Signal Processing and Control Algorithm Packages */ + +/* end of Signal Processing and Control Algorithm Packages */ + +/* miscellaneous packages */ + +/* project laboratory */ + +/* end of project laboratory */ + +/* samples: kernel and components samples */ + +/* end of samples: kernel and components samples */ + +/* entertainment: terminal games and other interesting software packages */ + +/* end of entertainment: terminal games and other interesting software packages */ +/* end of miscellaneous packages */ + +/* Arduino libraries */ + + +/* Projects and Demos */ + +/* end of Projects and Demos */ + +/* Sensors */ + +/* end of Sensors */ + +/* Display */ + +/* end of Display */ + +/* Timing */ + +/* end of Timing */ + +/* Data Processing */ + +/* end of Data Processing */ + +/* Data Storage */ + +/* Communication */ + +/* end of Communication */ + +/* Device Control */ + +/* end of Device Control */ + +/* Other */ + +/* end of Other */ + +/* Signal IO */ + +/* end of Signal IO */ + +/* Uncategorized */ + +/* end of Arduino libraries */ +/* end of RT-Thread online packages */ +#define SOC_FAMILY_N32 +#define SOC_SERIES_N32H7xx + +/* Hardware Drivers Config */ + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART1 +/* end of On-chip Peripheral Drivers */ + +/* Board extended module Drivers */ + +/* end of Hardware Drivers Config */ + +#endif diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/rtconfig.py b/bsp/n32/n32hxxx/n32h760zil7-stb/rtconfig.py new file mode 100644 index 0000000000..15ddd3158a --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/rtconfig.py @@ -0,0 +1,185 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m7' +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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +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-m7 -mthumb -mfpu=fpv5-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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 + CFLAGS += ' -std=c99' + + 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-M7.fp.sp' + 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 rtthread.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-M7.fp.sp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-M7 ' + CFLAGS += ' -mcpu=cortex-M7 -mfpu=fpv4-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -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-M7' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv5_sp' + 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-M7' + AFLAGS += ' --fpu VFPv5_sp' + 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/n32/n32g4frml-stb/project.uvoptx b/bsp/n32/n32hxxx/n32h760zil7-stb/template.uvoptx similarity index 89% rename from bsp/n32/n32g4frml-stb/project.uvoptx rename to bsp/n32/n32hxxx/n32h760zil7-stb/template.uvoptx index 19f6087d18..d4cb02535c 100644 --- a/bsp/n32/n32g4frml-stb/project.uvoptx +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/template.uvoptx @@ -73,7 +73,7 @@ 0 - 1 + 0 0 1 @@ -120,12 +120,12 @@ 0 CMSIS_AGDI - -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0N32G4FR.FLM -FS08000000 -FL080000 -FP0($$Device:N32G4FRMEL7$Flash\N32G4FR.FLM) + -X"Any" -UAny -O206 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD24000000 -FC8000 -FN1 -FF0N32H76x_2048.FLM -FS015000000 -FL01E0000 -FP0($$Device:N32H760xIx7$Flash\N32H76x_2048.FLM) 0 UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32G4FR -FL080000 -FS08000000 -FP0($$Device:N32G4FRMEL7$Flash\N32G4FR.FLM) + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC8000 -FD24000000 -FF0N32H76x_2048 -FL01E0000 -FS015000000 -FP0($$Device:N32H760xIx7$Flash\N32H76x_2048.FLM) @@ -171,15 +171,14 @@ + + 1 + 1 + 0 + 2 + 10000000 + - - ::CMSIS - 0 - 0 - 0 - 1 - - diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/template.uvprojx b/bsp/n32/n32hxxx/n32h760zil7-stb/template.uvprojx new file mode 100644 index 0000000000..6fdc74b753 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/template.uvprojx @@ -0,0 +1,391 @@ + + + + 2.1 + +
    ### uVision Project, (C) Keil Software
    + + + + rt-thread + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + N32H760xIx7 + Nationstech + Nationstech.N32H76x_DFP.1.1.0 + http://www.keil.com/pack/ + IRAM(0x24000000,0x20000) IROM(0x15000000,0x1E0000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD24000000 -FC8000 -FN1 -FF0N32H76x_2048 -FS015000000 -FL01E0000 -FP0($$Device:N32H760xIx7$Flash\N32H76x_2048.FLM)) + 0 + $$Device:N32H760xIx7$firmware\CMSIS\device\N32H76x.h + + + + + + + + + + $$Device:N32H760xIx7$svd\N32H76x.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + rt-thread + 1 + 0 + 1 + 1 + 1 + .\build\ + 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 -MPU + DCM.DLL + -pCM7 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM7 + + + + 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-M7" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 3 + 0 + 0 + 0 + 0 + 8 + 1 + 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 + 0x24000000 + 0x20000 + + + 1 + 0x15000000 + 0x1e0000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x15000000 + 0x1e0000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x24000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 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 + + + + + + + + + + + + + + + + + +
    diff --git a/bsp/n32/n32hxxx/tools/sdk_dist.py b/bsp/n32/n32hxxx/tools/sdk_dist.py new file mode 100644 index 0000000000..a45e959c93 --- /dev/null +++ b/bsp/n32/n32hxxx/tools/sdk_dist.py @@ -0,0 +1,23 @@ +import os +import sys +import shutil + +cwd_path = os.getcwd() +sys.path.append(os.path.join(os.path.dirname(cwd_path), 'rt-thread', 'tools')) + + +# BSP dist function +def dist_do_building(BSP_ROOT, dist_dir): + from mkdist import bsp_copy_files + import rtconfig + + print("=> copy n32 bsp library") + library_dir = os.path.join(dist_dir, 'libraries') + library_path = os.path.join(os.path.dirname(BSP_ROOT), 'libraries') + if rtconfig.BSP_LIBRARY_TYPE is not None: + bsp_copy_files(os.path.join(library_path, rtconfig.BSP_LIBRARY_TYPE), + os.path.join(library_dir, rtconfig.BSP_LIBRARY_TYPE)) + + print("=> copy bsp drivers") + bsp_copy_files(os.path.join(library_path, 'N32_Drivers'), os.path.join(library_dir, 'N32_Drivers')) + shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) diff --git a/bsp/n32/n32l40xcl-stb/Kconfig b/bsp/n32/n32l40xcl-stb/Kconfig deleted file mode 100644 index 73238d3a13..0000000000 --- a/bsp/n32/n32l40xcl-stb/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -mainmenu "RT-Thread Configuration" - -BSP_DIR := . - -RTT_DIR := ../../.. - -PKGS_DIR := packages - -source "$(RTT_DIR)/Kconfig" -osource "$PKGS_DIR/Kconfig" -rsource "../libraries/Kconfig" -rsource "board/Kconfig" diff --git a/bsp/n32/n32l40xcl-stb/project.uvoptx b/bsp/n32/n32l40xcl-stb/project.uvoptx deleted file mode 100644 index 12d7f7bb31..0000000000 --- a/bsp/n32/n32l40xcl-stb/project.uvoptx +++ /dev/null @@ -1,185 +0,0 @@ - - - - 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\ - - - 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 - 3 - - - - - - - - - - - BIN\CMSIS_AGDI.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L40x -FL020000 -FS08000000 -FP0($$Device:N32L406CB$Flash\N32L40x.FLM) - - - 0 - CMSIS_AGDI - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L40x -FL020000 -FS08000000 -FP0($$Device:N32L406CB$Flash\N32L40x.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 - - - - - - - - - - - - - ::CMSIS - 0 - 0 - 0 - 1 - - -
    diff --git a/bsp/n32/n32l40xcl-stb/rtconfig.py b/bsp/n32/n32l40xcl-stb/rtconfig.py deleted file mode 100644 index 2a0371110c..0000000000 --- a/bsp/n32/n32l40xcl-stb/rtconfig.py +++ /dev/null @@ -1,184 +0,0 @@ -import os - -# toolchains options -ARCH='arm' -CPU='cortex-m4' -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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' - -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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' - CFLAGS = DEVICE + ' -Dgcc' - AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' - LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' - CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' - AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.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-M4.fp ' - CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' - CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' - CFLAGS += ' -mfloat-abi=hard -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-M4' - CFLAGS += ' -e' - CFLAGS += ' --fpu=VFPv4_sp' - 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-M4' - AFLAGS += ' --fpu VFPv4_sp' - 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/n32/n32l436-evb/Kconfig b/bsp/n32/n32l436-evb/Kconfig deleted file mode 100644 index 73238d3a13..0000000000 --- a/bsp/n32/n32l436-evb/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -mainmenu "RT-Thread Configuration" - -BSP_DIR := . - -RTT_DIR := ../../.. - -PKGS_DIR := packages - -source "$(RTT_DIR)/Kconfig" -osource "$PKGS_DIR/Kconfig" -rsource "../libraries/Kconfig" -rsource "board/Kconfig" diff --git a/bsp/n32/n32l436-evb/project.uvoptx b/bsp/n32/n32l436-evb/project.uvoptx deleted file mode 100644 index ea197b3c15..0000000000 --- a/bsp/n32/n32l436-evb/project.uvoptx +++ /dev/null @@ -1,185 +0,0 @@ - - - - 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\ - - - 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 - 3 - - - - - - - - - - - BIN\CMSIS_AGDI.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L43x -FL020000 -FS08000000 -FP0($$Device:N32L436MB$Flash\N32L43x.FLM) - - - 0 - CMSIS_AGDI - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L43x -FL020000 -FS08000000 -FP0($$Device:N32L436MB$Flash\N32L43x.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 - - - - - - - - - - - - - ::CMSIS - 0 - 0 - 0 - 1 - - -
    diff --git a/bsp/n32/n32l436-evb/rtconfig.py b/bsp/n32/n32l436-evb/rtconfig.py deleted file mode 100644 index 2a0371110c..0000000000 --- a/bsp/n32/n32l436-evb/rtconfig.py +++ /dev/null @@ -1,184 +0,0 @@ -import os - -# toolchains options -ARCH='arm' -CPU='cortex-m4' -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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' - -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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' - CFLAGS = DEVICE + ' -Dgcc' - AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' - LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' - CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' - AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.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-M4.fp ' - CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' - CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' - CFLAGS += ' -mfloat-abi=hard -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-M4' - CFLAGS += ' -e' - CFLAGS += ' --fpu=VFPv4_sp' - 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-M4' - AFLAGS += ' --fpu VFPv4_sp' - 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/n32/n32l43xml-stb/Kconfig b/bsp/n32/n32l43xml-stb/Kconfig deleted file mode 100644 index 73238d3a13..0000000000 --- a/bsp/n32/n32l43xml-stb/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -mainmenu "RT-Thread Configuration" - -BSP_DIR := . - -RTT_DIR := ../../.. - -PKGS_DIR := packages - -source "$(RTT_DIR)/Kconfig" -osource "$PKGS_DIR/Kconfig" -rsource "../libraries/Kconfig" -rsource "board/Kconfig" diff --git a/bsp/n32/n32l43xml-stb/project.uvoptx b/bsp/n32/n32l43xml-stb/project.uvoptx deleted file mode 100644 index ea197b3c15..0000000000 --- a/bsp/n32/n32l43xml-stb/project.uvoptx +++ /dev/null @@ -1,185 +0,0 @@ - - - - 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\ - - - 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 - 3 - - - - - - - - - - - BIN\CMSIS_AGDI.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L43x -FL020000 -FS08000000 -FP0($$Device:N32L436MB$Flash\N32L43x.FLM) - - - 0 - CMSIS_AGDI - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32L43x -FL020000 -FS08000000 -FP0($$Device:N32L436MB$Flash\N32L43x.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 - - - - - - - - - - - - - ::CMSIS - 0 - 0 - 0 - 1 - - -
    diff --git a/bsp/n32/n32l43xml-stb/rtconfig.py b/bsp/n32/n32l43xml-stb/rtconfig.py deleted file mode 100644 index 2a0371110c..0000000000 --- a/bsp/n32/n32l43xml-stb/rtconfig.py +++ /dev/null @@ -1,184 +0,0 @@ -import os - -# toolchains options -ARCH='arm' -CPU='cortex-m4' -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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' - -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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' - CFLAGS = DEVICE + ' -Dgcc' - AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' - LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' - CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' - AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.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-M4.fp ' - CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' - CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' - CFLAGS += ' -mfloat-abi=hard -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-M4' - CFLAGS += ' -e' - CFLAGS += ' --fpu=VFPv4_sp' - 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-M4' - AFLAGS += ' --fpu VFPv4_sp' - 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/n32/n32l43xrl-stb/Kconfig b/bsp/n32/n32l43xrl-stb/Kconfig deleted file mode 100644 index 73238d3a13..0000000000 --- a/bsp/n32/n32l43xrl-stb/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -mainmenu "RT-Thread Configuration" - -BSP_DIR := . - -RTT_DIR := ../../.. - -PKGS_DIR := packages - -source "$(RTT_DIR)/Kconfig" -osource "$PKGS_DIR/Kconfig" -rsource "../libraries/Kconfig" -rsource "board/Kconfig" diff --git a/bsp/n32/n32l43xrl-stb/rtconfig.py b/bsp/n32/n32l43xrl-stb/rtconfig.py deleted file mode 100644 index 2a0371110c..0000000000 --- a/bsp/n32/n32l43xrl-stb/rtconfig.py +++ /dev/null @@ -1,184 +0,0 @@ -import os - -# toolchains options -ARCH='arm' -CPU='cortex-m4' -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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' - -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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' - CFLAGS = DEVICE + ' -Dgcc' - AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' - LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' - CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' - AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.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-M4.fp ' - CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' - CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' - CFLAGS += ' -mfloat-abi=hard -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-M4' - CFLAGS += ' -e' - CFLAGS += ' --fpu=VFPv4_sp' - 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-M4' - AFLAGS += ' --fpu VFPv4_sp' - 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/n32/n32wb45xl-evb/Kconfig b/bsp/n32/n32wb45xl-evb/Kconfig deleted file mode 100644 index 73238d3a13..0000000000 --- a/bsp/n32/n32wb45xl-evb/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -mainmenu "RT-Thread Configuration" - -BSP_DIR := . - -RTT_DIR := ../../.. - -PKGS_DIR := packages - -source "$(RTT_DIR)/Kconfig" -osource "$PKGS_DIR/Kconfig" -rsource "../libraries/Kconfig" -rsource "board/Kconfig" diff --git a/bsp/n32/n32wb45xl-evb/project.uvoptx b/bsp/n32/n32wb45xl-evb/project.uvoptx deleted file mode 100644 index 74548decd6..0000000000 --- a/bsp/n32/n32wb45xl-evb/project.uvoptx +++ /dev/null @@ -1,180 +0,0 @@ - - - - 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\ - - - 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 - 3 - - - - - - - - - - - BIN\CMSIS_AGDI.dll - - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0N32WB452 -FL080000 -FS08000000 -FP0($$Device:N32WB452LEQ6$Flash\N32WB452.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 - - - - - - - - - - - - - ::CMSIS - 0 - 0 - 0 - 1 - - -
    diff --git a/bsp/n32/n32wb45xl-evb/rtconfig.py b/bsp/n32/n32wb45xl-evb/rtconfig.py deleted file mode 100644 index 2a0371110c..0000000000 --- a/bsp/n32/n32wb45xl-evb/rtconfig.py +++ /dev/null @@ -1,184 +0,0 @@ -import os - -# toolchains options -ARCH='arm' -CPU='cortex-m4' -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'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' - -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-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' - CFLAGS = DEVICE + ' -Dgcc' - AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' - LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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-M4.fp ' - CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' - AFLAGS = DEVICE + ' --apcs=interwork ' - LFLAGS = DEVICE + r' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.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-M4.fp ' - CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' - CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' - CFLAGS += ' -mfloat-abi=hard -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-M4' - CFLAGS += ' -e' - CFLAGS += ' --fpu=VFPv4_sp' - 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-M4' - AFLAGS += ' --fpu VFPv4_sp' - 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) -- Gitee From 5e04105723f6de5ffcd5e6b843b489f52cdc679b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Feb 2026 09:45:19 +0000 Subject: [PATCH 27/45] rename i2c mutex Co-authored-by: BernardXiong <1241087+BernardXiong@users.noreply.github.com> --- components/drivers/i2c/dev_i2c_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/drivers/i2c/dev_i2c_core.c b/components/drivers/i2c/dev_i2c_core.c index 9d9bf6b23d..97c860f829 100644 --- a/components/drivers/i2c/dev_i2c_core.c +++ b/components/drivers/i2c/dev_i2c_core.c @@ -24,7 +24,7 @@ rt_err_t rt_i2c_bus_device_register(struct rt_i2c_bus_device *bus, { rt_err_t res = RT_EOK; - rt_mutex_init(&bus->lock, "i2c_bus_lock", RT_IPC_FLAG_PRIO); + rt_mutex_init(&bus->lock, "i2c_lock", RT_IPC_FLAG_PRIO); if (bus->timeout == 0) bus->timeout = RT_TICK_PER_SECOND; -- Gitee From 68da10625347cfe34fad8b73a78feffbe311d561 Mon Sep 17 00:00:00 2001 From: CYFS <2805686936@qq.com> Date: Wed, 4 Feb 2026 16:45:30 +0800 Subject: [PATCH 28/45] [components][drivers]:fix wlan err --- components/drivers/wlan/dev_wlan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/drivers/wlan/dev_wlan.c b/components/drivers/wlan/dev_wlan.c index a3ed0347a9..f9c7f33c2b 100644 --- a/components/drivers/wlan/dev_wlan.c +++ b/components/drivers/wlan/dev_wlan.c @@ -944,7 +944,7 @@ static rt_err_t _rt_wlan_dev_control(rt_device_t dev, int cmd, void *args) case RT_WLAN_CMD_GET_FAST_CONNECT_INFO: { - LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_FAST_INFO, "RT_WLAN_CMD_GET_FAST_INFO"); + LOG_D("%s %d cmd[%d]:%s run......", __FUNCTION__, __LINE__, RT_WLAN_CMD_GET_FAST_CONNECT_INFO, "RT_WLAN_CMD_GET_FAST_CONNECT_INFO"); if (wlan->ops->wlan_get_fast_info) { err = wlan->ops->wlan_get_fast_info(args); -- Gitee From 25b6953501e7ec8eeb7e8c72d2b11e8e49dbecf7 Mon Sep 17 00:00:00 2001 From: CYFS <2805686936@qq.com> Date: Thu, 5 Feb 2026 14:30:11 +0800 Subject: [PATCH 29/45] [components][lwip]: fix ping timeout handling and support LWIP_SO_SNDRCVTIMEO_NONSTANDARD --- components/net/lwip/lwip-1.4.1/src/apps/ping/ping.c | 9 +++++---- components/net/lwip/lwip-2.0.3/src/apps/ping/ping.c | 9 +++++---- components/net/lwip/lwip-2.1.2/src/apps/ping/ping.c | 9 +++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/components/net/lwip/lwip-1.4.1/src/apps/ping/ping.c b/components/net/lwip/lwip-1.4.1/src/apps/ping/ping.c index 6251504f59..d2b1f805f7 100644 --- a/components/net/lwip/lwip-1.4.1/src/apps/ping/ping.c +++ b/components/net/lwip/lwip-1.4.1/src/apps/ping/ping.c @@ -135,11 +135,12 @@ int lwip_ping_recv(int s, int *ttl) /* using the lwIP custom ping */ rt_err_t ping(char* target_name, rt_uint32_t times, rt_size_t size) { -#if LWIP_VERSION_MAJOR >= 2U - struct timeval timeout = { PING_RCV_TIMEO / RT_TICK_PER_SECOND, PING_RCV_TIMEO % RT_TICK_PER_SECOND }; + +#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD + int timeout = (int)PING_RCV_TIMEO; #else - int timeout = PING_RCV_TIMEO * 1000UL / RT_TICK_PER_SECOND; -#endif + struct timeval timeout = { PING_RCV_TIMEO / RT_TICK_PER_SECOND, PING_RCV_TIMEO % RT_TICK_PER_SECOND }; +#endif / * LWIP_SO_SNDRCVTIMEO_NONSTANDARD */ int s, ttl, recv_len; ip_addr_t target_addr; diff --git a/components/net/lwip/lwip-2.0.3/src/apps/ping/ping.c b/components/net/lwip/lwip-2.0.3/src/apps/ping/ping.c index 989fb0507a..3039ecf14d 100644 --- a/components/net/lwip/lwip-2.0.3/src/apps/ping/ping.c +++ b/components/net/lwip/lwip-2.0.3/src/apps/ping/ping.c @@ -135,11 +135,12 @@ int lwip_ping_recv(int s, int *ttl) /* using the lwIP custom ping */ rt_err_t ping(char* target_name, rt_uint32_t times, rt_size_t size) { -#if LWIP_VERSION_MAJOR >= 2U - struct timeval timeout = { PING_RCV_TIMEO / RT_TICK_PER_SECOND, PING_RCV_TIMEO % RT_TICK_PER_SECOND }; + +#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD + int timeout = (int)PING_RCV_TIMEO; #else - int timeout = PING_RCV_TIMEO * 1000UL / RT_TICK_PER_SECOND; -#endif + struct timeval timeout = { PING_RCV_TIMEO / RT_TICK_PER_SECOND, PING_RCV_TIMEO % RT_TICK_PER_SECOND }; +#endif / * LWIP_SO_SNDRCVTIMEO_NONSTANDARD */ int s, ttl, recv_len; ip_addr_t target_addr; diff --git a/components/net/lwip/lwip-2.1.2/src/apps/ping/ping.c b/components/net/lwip/lwip-2.1.2/src/apps/ping/ping.c index 6251504f59..d2b1f805f7 100644 --- a/components/net/lwip/lwip-2.1.2/src/apps/ping/ping.c +++ b/components/net/lwip/lwip-2.1.2/src/apps/ping/ping.c @@ -135,11 +135,12 @@ int lwip_ping_recv(int s, int *ttl) /* using the lwIP custom ping */ rt_err_t ping(char* target_name, rt_uint32_t times, rt_size_t size) { -#if LWIP_VERSION_MAJOR >= 2U - struct timeval timeout = { PING_RCV_TIMEO / RT_TICK_PER_SECOND, PING_RCV_TIMEO % RT_TICK_PER_SECOND }; + +#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD + int timeout = (int)PING_RCV_TIMEO; #else - int timeout = PING_RCV_TIMEO * 1000UL / RT_TICK_PER_SECOND; -#endif + struct timeval timeout = { PING_RCV_TIMEO / RT_TICK_PER_SECOND, PING_RCV_TIMEO % RT_TICK_PER_SECOND }; +#endif / * LWIP_SO_SNDRCVTIMEO_NONSTANDARD */ int s, ttl, recv_len; ip_addr_t target_addr; -- Gitee From 1254af44f253a11e2fe7351bb0242a6dbd219544 Mon Sep 17 00:00:00 2001 From: haitaoZhang <49626779+zhang-haitao-repo@users.noreply.github.com> Date: Thu, 5 Feb 2026 22:14:48 +0800 Subject: [PATCH 30/45] [gd32][uart] Add GD32VW553 series UART driver support (#11147) * feat(gd32): add GD32VW55x series USART driver support - Add support for GD32VW55x series UART/USART peripherals - Implement proper GPIO alternate function configuration for GD32VW55x - Add conditional compilation for different GD32 series (GD32VF103V vs GD32VW55x) - Remove unused UART3/UART4 configurations from Kconfig * Update drv_usart.c * Update drv_usart.h follow AI Review. * Update bsp/gd32/risc-v/libraries/gd32_drivers/drv_usart.c Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: optimize gd32 uart driver error messages --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig | 20 ------ .../risc-v/libraries/gd32_drivers/drv_usart.c | 68 +++++++++++++++++-- .../risc-v/libraries/gd32_drivers/drv_usart.h | 4 ++ 3 files changed, 67 insertions(+), 25 deletions(-) diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig b/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig index 8d0f34949a..433c305712 100644 --- a/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig +++ b/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig @@ -56,26 +56,6 @@ menu "On-chip Peripheral Drivers" depends on BSP_USING_UART2 select RT_SERIAL_USING_DMA default n - - config BSP_USING_UART3 - bool "Enable UART3" - default n - - config BSP_UART3_RX_USING_DMA - bool "Enable UART3 RX DMA" - depends on BSP_USING_UART3 - select RT_SERIAL_USING_DMA - default n - - config BSP_USING_UART4 - bool "Enable UART4" - default n - - config BSP_UART4_RX_USING_DMA - bool "Enable UART4 RX DMA" - depends on BSP_USING_UART4 - select RT_SERIAL_USING_DMA - default n endif menuconfig BSP_USING_PWM diff --git a/bsp/gd32/risc-v/libraries/gd32_drivers/drv_usart.c b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_usart.c index 2b3f8881d1..feba6f0004 100644 --- a/bsp/gd32/risc-v/libraries/gd32_drivers/drv_usart.c +++ b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_usart.c @@ -7,6 +7,7 @@ * Date Author Notes * 2021-08-20 BruceOu first implementation * 2025-07-11 Wangshun adapt to GD32VV553H + * 2026-01-22 HaitaoZhang adapt to GD32VW553H UART1/2 */ #include "drv_usart.h" @@ -45,6 +46,7 @@ void USART0_IRQHandler(void) #if defined(BSP_USING_UART1) struct rt_serial_device serial1; +#if defined (SOC_SERIES_GD32VF103V) void USART1_IRQHandler(void) { /* enter interrupt */ @@ -55,12 +57,27 @@ void USART1_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } +#elif defined (SOC_SERIES_GD32VW55x) +void UART1_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + GD32_UART_IRQHandler(&serial1); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#else +#error "Uart1 ISR name not compatible with current MCU series" +#endif #endif /* BSP_USING_UART1 */ #if defined(BSP_USING_UART2) struct rt_serial_device serial2; +#if defined (SOC_SERIES_GD32VF103V) void USART2_IRQHandler(void) { /* enter interrupt */ @@ -71,6 +88,20 @@ void USART2_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } +#elif defined (SOC_SERIES_GD32VW55x) +void UART2_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + GD32_UART_IRQHandler(&serial2); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#else +#error "Uart2 ISR name not compatible with current MCU series" +#endif #endif /* BSP_USING_UART2 */ @@ -161,6 +192,9 @@ static const struct gd32_uart uart_obj[] = { RCU_USART0, RCU_GPIOB, RCU_GPIOA, /* periph clock, tx gpio clock, rt gpio clock */ GPIOB, GPIO_PIN_15, /* tx port, tx pin */ GPIOA, GPIO_PIN_8, /* rx port, rx pin */ +#if defined (SOC_SERIES_GD32VW55x) + GPIO_AF_8, GPIO_AF_2, +#endif &serial0, "uart0", }, @@ -168,11 +202,22 @@ static const struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART1 { +#if defined (SOC_SERIES_GD32VF103V) USART1, /* uart peripheral index */ USART1_IRQn, /* uart iqrn */ RCU_USART1, RCU_GPIOA, RCU_GPIOA, /* periph clock, tx gpio clock, rt gpio clock */ GPIOA, GPIO_PIN_2, /* tx port, tx pin */ GPIOA, GPIO_PIN_3, /* rx port, rx pin */ +#elif defined (SOC_SERIES_GD32VW55x) + UART1, /* uart peripheral index */ + UART1_IRQn, /* uart iqrn */ + RCU_UART1, RCU_GPIOA, RCU_GPIOA, /* periph clock, tx gpio clock, rt gpio clock */ + GPIOA, GPIO_PIN_2, /* tx port, tx pin */ + GPIOA, GPIO_PIN_3, /* rx port, rx pin */ + GPIO_AF_7, GPIO_AF_7, +#else +#error "UART1 peripheral config incompatible with current MCU series" +#endif &serial1, "uart1", }, @@ -180,11 +225,22 @@ static const struct gd32_uart uart_obj[] = { #ifdef BSP_USING_UART2 { +#if defined (SOC_SERIES_GD32VF103V) USART2, /* uart peripheral index */ USART2_IRQn, /* uart iqrn */ RCU_USART2, RCU_GPIOB, RCU_GPIOB, /* periph clock, tx gpio clock, rt gpio clock */ GPIOB, GPIO_PIN_10, /* tx port, tx pin */ GPIOB, GPIO_PIN_11, /* rx port, rx pin */ +#elif defined (SOC_SERIES_GD32VW55x) + UART2, /* uart peripheral index */ + UART2_IRQn, /* uart iqrn */ + RCU_UART2, RCU_GPIOA, RCU_GPIOA, /* periph clock, tx gpio clock, rt gpio clock */ + GPIOA, GPIO_PIN_6, /* tx port, tx pin */ + GPIOA, GPIO_PIN_7, /* rx port, rx pin */ + GPIO_AF_10, GPIO_AF_8, +#else +#error "UART2 peripheral config incompatible with current MCU series" +#endif &serial2, "uart2", }, @@ -233,17 +289,19 @@ void gd32_uart_gpio_init(struct gd32_uart *uart) rcu_periph_clock_enable(uart->per_clk); /* connect port */ -#if defined SOC_SERIES_GD32VF103V +#if defined (SOC_SERIES_GD32VF103V) gpio_init(uart->tx_port, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, uart->tx_pin); gpio_init(uart->rx_port, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, uart->rx_pin); -#else - gpio_af_set(uart->tx_port, GPIO_AF_8, uart->tx_pin); +#elif defined (SOC_SERIES_GD32VW55x) + gpio_af_set(uart->tx_port, uart->tx_alt, uart->tx_pin); gpio_mode_set(uart->tx_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, uart->tx_pin); gpio_output_options_set(uart->tx_port, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, uart->tx_pin); - gpio_af_set(uart->rx_port, GPIO_AF_2, uart->rx_pin); + gpio_af_set(uart->rx_port, uart->rx_alt, uart->rx_pin); gpio_mode_set(uart->rx_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, uart->rx_pin); gpio_output_options_set(uart->rx_port, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, uart->rx_pin); +#else +#error "Uart GPIO config incompatible with current MCU series" #endif } @@ -328,7 +386,7 @@ static rt_err_t gd32_uart_control(struct rt_serial_device *serial, int cmd, void break; case RT_DEVICE_CTRL_SET_INT: -#ifdef SOC_SERIES_GD32VF103V +#if defined (SOC_SERIES_GD32VF103V) eclic_set_nlbits(ECLIC_GROUP_LEVEL3_PRIO1); #endif /* SOC_SERIES_GD32VF103V */ /* enable rx irq */ diff --git a/bsp/gd32/risc-v/libraries/gd32_drivers/drv_usart.h b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_usart.h index 6a6f75697e..bff4604876 100644 --- a/bsp/gd32/risc-v/libraries/gd32_drivers/drv_usart.h +++ b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_usart.h @@ -32,6 +32,10 @@ struct gd32_uart uint16_t tx_pin; /* Todo: 4bits */ uint32_t rx_port; /* Todo: 4bits */ uint16_t rx_pin; /* Todo: 4bits */ +#if defined (SOC_SERIES_GD32VW55x) + uint32_t tx_alt; /* GPIO alternate function for TX */ + uint32_t rx_alt; /* GPIO alternate function for RX */ +#endif struct rt_serial_device * serial; char *device_name; }; -- Gitee From a69d381828805e8a13e50422471a157dc64692f4 Mon Sep 17 00:00:00 2001 From: Onlyou_tzZ <17393117531@163.com> Date: Wed, 28 Jan 2026 14:58:58 +0800 Subject: [PATCH 31/45] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9B=BD=E6=B0=91?= =?UTF-8?q?=E6=8A=80=E6=9C=AFBSP=E6=9E=B6=E6=9E=84=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0N32H7xx=E7=B3=BB=E5=88=97BSP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改clang_format-ignore文件,根据反馈修改n32h7xxx/libraries/N32_Drivers/nano/*下的文件格式,修改n32h7xxx/n32/n32hxxx/n32h760zil7-stb/applications/main.c文件,区别处理Nano下头文件包含 将N32 BSP的.clang-format-ignore文件放入libraries同级目录 忽略库文件格式检查 fix(cherryusb): fix dwc2 host size check Signed-off-by: sakumisu <1203593632@qq.com> [components][clock_time] Refactor time subsystem around clock_time (#11111) * [components][clock_time] Refactor time subsystem around clock_time Introduce the clock_time core with clock source/event separation, high-resolution scheduling, and boot-time helpers, plus clock_timer adapters for timer peripherals. Remove legacy ktime/cputime/hwtimer implementations and migrate arch and BSP time paths to the new subsystem while keeping POSIX time integration functional. Update drivers, Kconfig/SConscript wiring, documentation, and tests; add clock_time overview docs and align naming to clock_boottime/clock_hrtimer/clock_timer. * [components][clock_time] Use BSP-provided clock timer frequency on riscv64 * [risc-v] Use runtime clock timer frequency for tick and delays * [bsp] Add clock timer frequency hooks for riscv64 boards * [bsp] Update Renesas RA driver doc clock_timer link * [bsp] Sync zynqmp-r5-axu4ev rtconfig after config refresh * [bsp][rk3500] Update rk3500 clock configuration * [bsp][hpmicro] Add rt_hw_us_delay hook and update board delays * [bsp][stm32l496-st-nucleo] enable clock_time for hwtimer sample in ci * [bsp][hpmicro] Fix rtconfig include scope for hpm6750evk Move rtconfig.h include outside the ENET_MULTIPLE_PORT guard for hpm6750evk and hpm6750evk2 so configuration macros are available regardless of ENET settings. * [bsp][raspi3] select clock time for systimer * [bsp][hpm5300evk] Trim trailing blank line * [bsp][hpm5301evklite] Trim trailing blank line * [bsp][hpm5e00evk] Trim trailing blank line * [bsp][hpm6200evk] Trim trailing blank line * [bsp][hpm6300evk] Trim trailing blank line * [bsp][hpm6750evk] Trim trailing blank line * [bsp][hpm6750evk2] Trim trailing blank line * [bsp][hpm6750evkmini] Trim trailing blank line * [bsp][hpm6800evk] Trim trailing blank line * [bsp][hpm6e00evk] Trim trailing blank line * [bsp][nxp] switch lpc178x to gcc and remove mcx timer source * [bsp][stm32] fix the CONFIG_RT_USING_CLOCK_TIME issue. * [docs][clock_time] add clock time documentation * [docs][clock_time] Update clock time subsystem documentation - Update device driver index to use correct page reference - Clarify upper layer responsibilities in architecture overview - Update README to describe POSIX/libc, Soft RTC, and device driver usage - Refine architecture diagram with improved layout and color scheme - Remove obsolete clock_timer.md file * [kernel][utest] Trim trailing space * [clock_time] Fix hrtimer wrap handling * [clock_time] fix the static rt_inline issue * [clock_time] fix the rt_clock_hrtimer_control result issue 解决N32 BSP project.ewp和project.uvprojx冲突 更新RTT最新同步 sdio: fix missing card status polling after CMD6 in eMMC DDR mode switch fix[dfs_v1]: prevent vnode ref underflow and double release on close/fd release feat[STM32][CAN]: drain RX FIFO frames in ISR with a bounded limit to reduce overruns - Add CAN_ISR_DRAIN_LIMIT (default 3) to cap ISR work - Drain multiple frames per RX0/RX1 interrupt to reduce FIFO FULL/OVERRUN docs(can): improve dev_can.h docs for batched RX example fix[STM32][RTC]: Compute tv_usec from SecondFraction/SubSeconds and skip during shift pending Use the generic SecondFraction/SubSeconds formula when SSR/PRER are available. If SHPF is present and a shift is pending, keep tv_usec at 0. Platforms without SSR/PRER (e.g. F1) default to 0. [bsp][gd32]:add gd32vw533xx pwm support Update Nsing's BSP architecture and add N32H7xx series BSPs. (#11159) * 更新国民技术BSP架构,添加N32H7xx系列BSP * 修改clang_format-ignore文件,根据反馈修改n32h7xxx/libraries/N32_Drivers/nano/*下的文件格式,修改n32h7xxx/n32/n32hxxx/n32h760zil7-stb/applications/main.c文件,区别处理Nano下头文件包含 * 将N32 BSP的.clang-format-ignore文件放入libraries同级目录 * 忽略库文件格式检查 * 解决N32 BSP project.ewp和project.uvprojx冲突 * 更新RTT最新同步 rename i2c mutex Co-authored-by: BernardXiong <1241087+BernardXiong@users.noreply.github.com> Squashed commit of the following: commit cadd095cd34bb2eaab5e39466f56674a9fe3f19b Merge: 5ad4edcf39 68da106253 Author: Onlyou_tzZ <97173915+OnlyoutzZ@users.noreply.github.com> Date: Wed Feb 4 22:50:54 2026 +0800 Merge branch 'RT-Thread:master' into master commit 68da10625347cfe34fad8b73a78feffbe311d561 Author: CYFS <2805686936@qq.com> Date: Wed Feb 4 16:45:30 2026 +0800 [components][drivers]:fix wlan err commit 5ad4edcf39330f01f698d95c322c3d0f8aae2feb Author: Onlyou_tzZ <17393117531@163.com> Date: Wed Feb 4 20:22:40 2026 +0800 更新BSP下README.md中N32相关的描述 更新BSP下README.md中N32相关的描述 [components][drivers]:fix wlan err [components][lwip]: fix ping timeout handling and support LWIP_SO_SNDRCVTIMEO_NONSTANDARD [gd32][uart] Add GD32VW553 series UART driver support (#11147) * feat(gd32): add GD32VW55x series USART driver support - Add support for GD32VW55x series UART/USART peripherals - Implement proper GPIO alternate function configuration for GD32VW55x - Add conditional compilation for different GD32 series (GD32VF103V vs GD32VW55x) - Remove unused UART3/UART4 configurations from Kconfig * Update drv_usart.c * Update drv_usart.h follow AI Review. * Update bsp/gd32/risc-v/libraries/gd32_drivers/drv_usart.c Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * feat: optimize gd32 uart driver error messages --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- bsp/README.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/bsp/README.md b/bsp/README.md index 1b77f59626..6bb02cceab 100644 --- a/bsp/README.md +++ b/bsp/README.md @@ -317,18 +317,19 @@ This document is based on the RT-Thread mainline repository and categorizes the | BSP Name | GPIO | UART | ADC | CAN | DAC | HWTimer | I2C | RTC | SPI | WDT | |----------|------|------|-----|-----|-----|---------|-----|-----|-----|-----| -| [n32g43xcl-stb](n32/n32g43xcl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [n32g457gel-stb](n32) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [n32g45xcl-stb](n32/n32g45xcl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [n32g45xml-stb](n32/n32g45xml-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [n32g45xrl-stb](n32/n32g45xrl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [n32g45xvl-stb](n32/n32g45xvl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [n32g47rml-stb](n32/n32g47rml-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [n32l40xcl-stb](n32/n32l40xcl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [n32l436-evb](n32/n32l436-evb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [n32l43xml-stb](n32/n32l43xml-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [n32l43xrl-stb](n32/n32l43xrl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| [n32wb45xl-evb](n32/n32wb45xl-evb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32g43xcl-stb](n32/n32gxx_lxx/n32g43xcl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32g457gel-stb](n32/n32gxx_lxx/n32g457gel-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32g45xcl-stb](n32/n32gxx_lxx/n32g45xcl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32g45xml-stb](n32/n32gxx_lxx/n32g45xml-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32g45xrl-stb](n32/n32gxx_lxx/n32g45xrl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32g45xvl-stb](n32/n32gxx_lxx/n32g45xvl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32g47rml-stb](n32/n32gxx_lxx/n32g47rml-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32l40xcl-stb](n32/n32gxx_lxx/n32l40xcl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32l436-evb](n32/n32gxx_lxx/n32l436-evb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32l43xml-stb](n32/n32gxx_lxx/n32l43xml-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32l43xrl-stb](n32/n32gxx_lxx/n32l43xrl-stb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32wb45xl-evb](n32/n32gxx_lxx/n32wb45xl-evb) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| [n32h760zil7-stb](n32/n32hxxx/n32h760zil7-stb) | ✅ | ✅ | ✅ | - | - | - | ✅ | ✅ | ✅ | - | #### 🟡 NRF5x -- Gitee From 4e5c1cfb44d905f87309b3cb7c3c0bde6d7d4f2c Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Mon, 9 Feb 2026 21:53:17 +0800 Subject: [PATCH 32/45] [bsp][rockchip] fixup rk3500 build and run Linker: https://github.com/RT-Thread/rt-thread/issues/11150 Signed-off-by: GuEe-GUI <2991707448@qq.com> --- bsp/rockchip/dm/Kconfig | 2 +- bsp/rockchip/rk3500/.config | 210 +++++++++++++++++++++----- bsp/rockchip/rk3500/rtconfig.h | 132 ++++++++++++++-- components/drivers/Kconfig | 6 + components/drivers/clk/clk-scmi.c | 4 +- components/drivers/clock_time/Kconfig | 4 + 6 files changed, 305 insertions(+), 53 deletions(-) diff --git a/bsp/rockchip/dm/Kconfig b/bsp/rockchip/dm/Kconfig index 53eca977c9..976548e8eb 100755 --- a/bsp/rockchip/dm/Kconfig +++ b/bsp/rockchip/dm/Kconfig @@ -3,7 +3,7 @@ SOC_DM_CAN_DIR = $(SOC_DM_DIR)/can SOC_DM_CLK_DIR = $(SOC_DM_DIR)/clk SOC_DM_HWCRYPTO_DIR = $(SOC_DM_DIR)/hwcrypto SOC_DM_HWSPINLOCK_DIR = $(SOC_DM_DIR)/hwspinlock -SOC_DM_HWTIMER_DIR = $(SOC_DM_DIR)/hwtimer +SOC_DM_CLOCK_TIME_DIR = $(SOC_DM_DIR)/hwtimer SOC_DM_I2C_DIR = $(SOC_DM_DIR)/i2c SOC_DM_INPUT_MISC_DIR = $(SOC_DM_DIR)/input/misc SOC_DM_MBOX_DIR = $(SOC_DM_DIR)/mailbox diff --git a/bsp/rockchip/rk3500/.config b/bsp/rockchip/rk3500/.config index fc4a8cde21..2a186892fa 100644 --- a/bsp/rockchip/rk3500/.config +++ b/bsp/rockchip/rk3500/.config @@ -116,7 +116,7 @@ CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4 # end of rt_strnlen options # end of klibc options -CONFIG_RT_NAME_MAX=12 +CONFIG_RT_NAME_MAX=24 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set # CONFIG_RT_USING_NANO is not set CONFIG_RT_USING_SMART=y @@ -266,7 +266,7 @@ CONFIG_RT_USING_DFS_DEVFS=y # CONFIG_RT_USING_DFS_ROMFS is not set CONFIG_RT_USING_DFS_PTYFS=y CONFIG_RT_USING_DFS_PROCFS=y -CONFIG_RT_USING_DFS_CROMFS=y +# CONFIG_RT_USING_DFS_CROMFS is not set CONFIG_RT_USING_DFS_TMPFS=y CONFIG_RT_USING_DFS_MQUEUE=y CONFIG_RT_USING_PAGECACHE=y @@ -304,28 +304,59 @@ CONFIG_RT_USING_SERIAL_BYPASS=y # CONFIG_RT_SERIAL_EARLY_HVC is not set # CONFIG_RT_SERIAL_PL011 is not set CONFIG_RT_SERIAL_8250=y -# CONFIG_RT_SERIAL_8250_DW is not set -# CONFIG_RT_USING_CAN is not set -# CONFIG_RT_USING_CPUTIME is not set -# CONFIG_RT_USING_I2C is not set +CONFIG_RT_SERIAL_8250_DW=y +# CONFIG_RT_SERIAL_8250_PCI is not set +CONFIG_RT_USING_CAN=y +# CONFIG_RT_CAN_USING_HDR is not set +CONFIG_RT_CAN_USING_CANFD=y +CONFIG_RT_CANMSG_BOX_SZ=16 +CONFIG_RT_CANSND_BOX_NUM=1 +CONFIG_RT_CANSND_MSG_TIMEOUT=100 +CONFIG_RT_CAN_NB_TX_FIFO_SIZE=256 +# CONFIG_RT_CAN_MALLOC_NB_TX_BUFFER is not set +CONFIG_RT_CAN_CANFD_ROCKCHIP=y +CONFIG_RT_USING_CLOCK_TIME=y +CONFIG_RT_CLOCK_TIME_ARM_ARCH=y +CONFIG_RT_CLOCK_TIMER_ROCKCHIP=y +CONFIG_RT_USING_I2C=y +# CONFIG_RT_I2C_DEBUG is not set +CONFIG_RT_USING_I2C_BITOPS=y +# CONFIG_RT_I2C_BITOPS_DEBUG is not set +# CONFIG_RT_USING_SOFT_I2C is not set +CONFIG_RT_I2C_RK3X=y # CONFIG_RT_USING_PHY is not set # CONFIG_RT_USING_PHY_V2 is not set -# CONFIG_RT_USING_ADC is not set +CONFIG_RT_USING_ADC=y +CONFIG_RT_ADC_ROCKCHIP_SARADC=y # CONFIG_RT_USING_DAC is not set CONFIG_RT_USING_NULL=y CONFIG_RT_USING_ZERO=y CONFIG_RT_USING_RANDOM=y -# CONFIG_RT_USING_PWM is not set +CONFIG_RT_USING_PWM=y +CONFIG_RT_PWM_ROCKCHIP=y # CONFIG_RT_USING_PULSE_ENCODER is not set # CONFIG_RT_USING_INPUT_CAPTURE is not set -# CONFIG_RT_USING_MTD_NOR is not set +CONFIG_RT_USING_MTD_NOR=y +# CONFIG_RT_USING_MTD_NOR_CFI is not set +CONFIG_RT_USING_MTD_NOR_SPI=y # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set CONFIG_RT_USING_RTC=y -# CONFIG_RT_USING_ALARM is not set +CONFIG_RT_USING_ALARM=y +CONFIG_RT_ALARM_STACK_SIZE=16384 +CONFIG_RT_ALARM_TIMESLICE=5 +CONFIG_RT_ALARM_PRIORITY=10 +# CONFIG_RT_ALARM_USING_LOCAL_TIME is not set CONFIG_RT_USING_SOFT_RTC=y +# CONFIG_RT_RTC_DS1302 is not set +# CONFIG_RT_RTC_DS1307 is not set # CONFIG_RT_RTC_GOLDFISH is not set +CONFIG_RT_RTC_HYM8563=y +CONFIG_RT_RTC_PCF8523=y +CONFIG_RT_RTC_PCF8563=y # CONFIG_RT_RTC_PL031 is not set +CONFIG_RT_RTC_RX8010=y +CONFIG_RT_RTC_RK8XX=y # CONFIG_RT_RTC_RK_TIMER is not set CONFIG_RT_USING_SDIO=y CONFIG_RT_SDIO_STACK_SIZE=16384 @@ -335,19 +366,77 @@ CONFIG_RT_MMCSD_THREAD_PRIORITY=22 CONFIG_RT_MMCSD_MAX_PARTITION=16 # CONFIG_RT_SDIO_DEBUG is not set # CONFIG_RT_USING_SDHCI is not set -# CONFIG_RT_USING_SPI is not set -# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_SDIO_SDHCI_PCI is not set +CONFIG_RT_SDIO_DW_MMC=y +# CONFIG_RT_SDIO_DW_MMC_PCI is not set +CONFIG_RT_SDIO_DW_MMC_ROCKCHIP=y +CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_SPI_ISR=y +# CONFIG_RT_USING_SPI_BITOPS is not set +# CONFIG_RT_USING_SOFT_SPI is not set +CONFIG_RT_USING_QSPI=y +# CONFIG_RT_USING_SPI_MSD is not set +CONFIG_RT_USING_SFUD=y +CONFIG_RT_SFUD_USING_SFDP=y +CONFIG_RT_SFUD_USING_FLASH_INFO_TABLE=y +# CONFIG_RT_SFUD_USING_QSPI is not set +CONFIG_RT_SFUD_SPI_MAX_HZ=50000000 +# CONFIG_RT_DEBUG_SFUD is not set +# CONFIG_RT_USING_ENC28J60 is not set +# CONFIG_RT_USING_SPI_WIFI is not set +# CONFIG_RT_SPI_ROCKCHIP_SFC is not set +CONFIG_RT_SPI_ROCKCHIP=y +CONFIG_RT_USING_WDT=y +CONFIG_RT_WDT_DW=y +# CONFIG_RT_WDT_I6300ESB is not set +CONFIG_RT_WDT_RK8XX=y # CONFIG_RT_USING_AUDIO is not set # CONFIG_RT_USING_SENSOR is not set # CONFIG_RT_USING_TOUCH is not set # CONFIG_RT_USING_GRAPHIC is not set -# CONFIG_RT_USING_HWCRYPTO is not set +CONFIG_RT_USING_HWCRYPTO=y +CONFIG_RT_HWCRYPTO_DEFAULT_NAME="hwcryto" +CONFIG_RT_HWCRYPTO_IV_MAX_SIZE=16 +CONFIG_RT_HWCRYPTO_KEYBIT_MAX_SIZE=256 +# CONFIG_RT_HWCRYPTO_USING_GCM is not set +# CONFIG_RT_HWCRYPTO_USING_AES is not set +# CONFIG_RT_HWCRYPTO_USING_DES is not set +# CONFIG_RT_HWCRYPTO_USING_3DES is not set +# CONFIG_RT_HWCRYPTO_USING_RC4 is not set +# CONFIG_RT_HWCRYPTO_USING_MD5 is not set +# CONFIG_RT_HWCRYPTO_USING_SHA1 is not set +# CONFIG_RT_HWCRYPTO_USING_SHA2 is not set +CONFIG_RT_HWCRYPTO_USING_RNG=y +# CONFIG_RT_HWCRYPTO_USING_CRC is not set +# CONFIG_RT_HWCRYPTO_USING_BIGNUM is not set +CONFIG_RT_HWCRYPTO_RNG_ROCKCHIP=y # CONFIG_RT_USING_WIFI is not set -# CONFIG_RT_USING_LED is not set -# CONFIG_RT_USING_INPUT is not set -# CONFIG_RT_USING_MBOX is not set -# CONFIG_RT_USING_HWSPINLOCK is not set -# CONFIG_RT_USING_PHYE is not set +CONFIG_RT_USING_LED=y +CONFIG_RT_LED_GPIO=y +# CONFIG_RT_LED_PWM is not set +# CONFIG_RT_LED_SYSCON is not set +CONFIG_RT_USING_INPUT=y +CONFIG_RT_INPUT_POWER=y +# CONFIG_RT_INPUT_UAPI is not set +# CONFIG_RT_INPUT_JOYSTICK is not set +# CONFIG_RT_INPUT_KEYBOARD is not set +CONFIG_RT_INPUT_MISC=y +# CONFIG_RT_INPUT_MISC_BUTTON_E3X0 is not set +CONFIG_RT_INPUT_MISC_PWRKEY_RK8XX=y +# CONFIG_RT_INPUT_TOUCHSCREEN is not set +CONFIG_RT_USING_MBOX=y +CONFIG_RT_MBOX_PIC=y +CONFIG_RT_MBOX_ROCKCHIP=y +CONFIG_RT_USING_HWSPINLOCK=y +CONFIG_RT_HWSPINLOCK_ROCKCHIP=y +CONFIG_RT_USING_PHYE=y +# CONFIG_RT_PHYE_GENERIC_USB is not set +CONFIG_RT_PHYE_ROCKCHIP_NANENG_COMBO=y +CONFIG_RT_PHYE_ROCKCHIP_SNPS_PCIE3=y +# CONFIG_RT_USING_ATA is not set +CONFIG_RT_USING_NVME=y +CONFIG_RT_USING_NVME_IO_QUEUE=4 +CONFIG_RT_NVME_PCI=y CONFIG_RT_USING_BLK=y # @@ -358,51 +447,104 @@ CONFIG_RT_BLK_PARTITION_EFI=y # end of Partition Types # CONFIG_RT_USING_SCSI is not set -# CONFIG_RT_USING_FIRMWARE is not set +CONFIG_RT_USING_FIRMWARE=y +CONFIG_RT_FIRMWARE_ARM_SCMI=y +CONFIG_RT_FIRMWARE_ARM_SCMI_TRANSPORT_MAILBOX=y +CONFIG_RT_FIRMWARE_ARM_SCMI_TRANSPORT_SMC=y # CONFIG_RT_USING_HWCACHE is not set -# CONFIG_RT_USING_REGULATOR is not set +CONFIG_RT_USING_REGULATOR=y +CONFIG_RT_REGULATOR_FIXED=y +CONFIG_RT_REGULATOR_GPIO=y +CONFIG_RT_REGULATOR_SCMI=y +CONFIG_RT_REGULATOR_RK8XX=y CONFIG_RT_USING_RESET=y +CONFIG_RT_RESET_SCMI=y # CONFIG_RT_RESET_SIMPLE is not set # # Power Management (PM) Domains device drivers # +CONFIG_RT_PMDOMAIN_SCMI=y +CONFIG_RT_PMDOMAIN_ROCKCHIP=y # end of Power Management (PM) Domains device drivers # CONFIG_RT_USING_POWER_RESET is not set # CONFIG_RT_USING_POWER_SUPPLY is not set -# CONFIG_RT_USING_THERMAL is not set +CONFIG_RT_USING_THERMAL=y + +# +# Thermal Sensors Drivers +# +# CONFIG_RT_THERMAL_SCMI is not set +CONFIG_RT_THERMAL_ROCKCHIP_TSADC=y + +# +# Thermal Cool Drivers +# +CONFIG_RT_THERMAL_COOL_PWM_FAN=y # CONFIG_RT_USING_VIRTIO is not set -# CONFIG_RT_USING_NVMEM is not set -# CONFIG_RT_USING_DMA is not set +CONFIG_RT_USING_NVMEM=y +CONFIG_RT_NVMEM_ROCKCHIP_OTP=y +CONFIG_RT_USING_DMA=y +CONFIG_RT_DMA_PL330=y CONFIG_RT_USING_MFD=y +# CONFIG_RT_MFD_EDU is not set CONFIG_RT_MFD_SYSCON=y +CONFIG_RT_MFD_RK8XX=y +CONFIG_RT_MFD_RK8XX_I2C=y +CONFIG_RT_MFD_RK8XX_SPI=y CONFIG_RT_USING_OFW=y # CONFIG_RT_USING_BUILTIN_FDT is not set CONFIG_RT_FDT_EARLYCON_MSG_SIZE=128 CONFIG_RT_USING_OFW_BUS_RANGES_NUMBER=8 -# CONFIG_RT_USING_PCI is not set +CONFIG_RT_USING_PCI=y +CONFIG_RT_PCI_MSI=y +CONFIG_RT_PCI_ENDPOINT=y +CONFIG_RT_PCI_SYS_64BIT=y +CONFIG_RT_PCI_CACHE_LINE_SIZE=8 +# CONFIG_RT_PCI_LOCKLESS is not set + +# +# PCI Device Drivers +# +# CONFIG_RT_PCI_ECAM is not set +CONFIG_RT_PCI_DW=y +CONFIG_RT_PCI_DW_HOST=y +CONFIG_RT_PCI_DW_EP=y +CONFIG_RT_PCI_DW_ROCKCHIP=y CONFIG_RT_USING_PIC=y -CONFIG_MAX_HANDLERS=1024 +CONFIG_MAX_HANDLERS=2048 # CONFIG_RT_PIC_ARM_GIC is not set CONFIG_RT_PIC_ARM_GIC_V3=y +CONFIG_RT_PIC_ARM_GIC_V3_ITS=y +CONFIG_RT_PIC_ARM_GIC_V3_ITS_IRQ_MAX=256 CONFIG_RT_USING_PIN=y # CONFIG_RT_PIN_PL061 is not set CONFIG_RT_PIN_ROCKCHIP=y CONFIG_RT_USING_PINCTRL=y +# CONFIG_RT_PINCTRL_SCMI is not set # CONFIG_RT_PINCTRL_SINGLE is not set +CONFIG_RT_PINCTRL_ROCKCHIP_RK8XX=y CONFIG_RT_PINCTRL_ROCKCHIP=y -CONFIG_RT_USING_CLOCK_TIME=y -CONFIG_RT_CLOCK_TIME_ARM_ARCH=y CONFIG_RT_USING_CLK=y +CONFIG_RT_CLK_SCMI=y +CONFIG_RT_CLK_ROCKCHIP_RK8XX_CLKOUT=y CONFIG_RT_CLK_ROCKCHIP_LINK=y CONFIG_RT_CLK_ROCKCHIP=y # CONFIG_RT_CLK_ROCKCHIP_RK3308 is not set CONFIG_RT_CLK_ROCKCHIP_RK3568=y -# CONFIG_RT_CLK_ROCKCHIP_RK3576 is not set +CONFIG_RT_CLK_ROCKCHIP_RK3576=y CONFIG_RT_CLK_ROCKCHIP_RK3588=y -CONFIG_RT_CLOCK_TIMER_ROCKCHIP=y # CONFIG_RT_USING_CHERRYUSB is not set + +# +# SoC (System on Chip) Drivers +# +CONFIG_RT_SOC_ROCKCHIP_FIQ_DEBUGGER=y +CONFIG_RT_SOC_ROCKCHIP_GRF=y +CONFIG_RT_SOC_ROCKCHIP_HW_DECOMPRESS=y +CONFIG_RT_SOC_ROCKCHIP_IODOMAIN=y +# end of SoC (System on Chip) Drivers # end of Device Drivers # @@ -999,7 +1141,6 @@ CONFIG_RT_UTEST_SMP_CALL_FUNC=y # CONFIG_PKG_USING_RVBACKTRACE is not set # CONFIG_PKG_USING_HPATCHLITE is not set # CONFIG_PKG_USING_THREAD_METRIC is not set -# CONFIG_PKG_USING_UORB is not set # end of tools packages # @@ -1094,7 +1235,6 @@ CONFIG_RT_UTEST_SMP_CALL_FUNC=y # CONFIG_PKG_USING_R_RHEALSTONE is not set # CONFIG_PKG_USING_HEARTBEAT is not set # CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set -# CONFIG_PKG_USING_CHERRYECAT is not set # end of system packages # @@ -1251,12 +1391,6 @@ CONFIG_RT_UTEST_SMP_CALL_FUNC=y # CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set # CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set # end of GD32 Drivers - -# -# HPMicro SDK -# -# CONFIG_PKG_USING_HPM_SDK is not set -# end of HPMicro SDK # end of HAL & SDK Drivers # @@ -1305,7 +1439,6 @@ CONFIG_RT_UTEST_SMP_CALL_FUNC=y # CONFIG_PKG_USING_MLX90393 is not set # CONFIG_PKG_USING_MLX90392 is not set # CONFIG_PKG_USING_MLX90394 is not set -# CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set @@ -1776,4 +1909,3 @@ CONFIG_PKG_ZLIB_VER="latest" # end of RT-Thread online packages CONFIG_SOC_RK3500=y -CONFIG_SOC_RK3568=y diff --git a/bsp/rockchip/rk3500/rtconfig.h b/bsp/rockchip/rk3500/rtconfig.h index 0518bc0e16..54ff974a0c 100644 --- a/bsp/rockchip/rk3500/rtconfig.h +++ b/bsp/rockchip/rk3500/rtconfig.h @@ -72,7 +72,7 @@ /* end of rt_strnlen options */ /* end of klibc options */ -#define RT_NAME_MAX 12 +#define RT_NAME_MAX 24 #define RT_USING_SMART #define RT_USING_SMP #define RT_CPUS_NR 4 @@ -182,7 +182,6 @@ #define RT_USING_DFS_DEVFS #define RT_USING_DFS_PTYFS #define RT_USING_DFS_PROCFS -#define RT_USING_DFS_CROMFS #define RT_USING_DFS_TMPFS #define RT_USING_DFS_MQUEUE #define RT_USING_PAGECACHE @@ -212,17 +211,82 @@ #define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_SERIAL_BYPASS #define RT_SERIAL_8250 +#define RT_SERIAL_8250_DW +#define RT_USING_CAN +#define RT_CAN_USING_CANFD +#define RT_CANMSG_BOX_SZ 16 +#define RT_CANSND_BOX_NUM 1 +#define RT_CANSND_MSG_TIMEOUT 100 +#define RT_CAN_NB_TX_FIFO_SIZE 256 +#define RT_CAN_CANFD_ROCKCHIP +#define RT_USING_CLOCK_TIME +#define RT_CLOCK_TIME_ARM_ARCH +#define RT_CLOCK_TIMER_ROCKCHIP +#define RT_USING_I2C +#define RT_USING_I2C_BITOPS +#define RT_I2C_RK3X +#define RT_USING_ADC +#define RT_ADC_ROCKCHIP_SARADC #define RT_USING_NULL #define RT_USING_ZERO #define RT_USING_RANDOM +#define RT_USING_PWM +#define RT_PWM_ROCKCHIP +#define RT_USING_MTD_NOR +#define RT_USING_MTD_NOR_SPI #define RT_USING_RTC +#define RT_USING_ALARM +#define RT_ALARM_STACK_SIZE 16384 +#define RT_ALARM_TIMESLICE 5 +#define RT_ALARM_PRIORITY 10 #define RT_USING_SOFT_RTC +#define RT_RTC_HYM8563 +#define RT_RTC_PCF8523 +#define RT_RTC_PCF8563 +#define RT_RTC_RX8010 +#define RT_RTC_RK8XX #define RT_USING_SDIO #define RT_SDIO_STACK_SIZE 16384 #define RT_SDIO_THREAD_PRIORITY 15 #define RT_MMCSD_STACK_SIZE 16384 #define RT_MMCSD_THREAD_PRIORITY 22 #define RT_MMCSD_MAX_PARTITION 16 +#define RT_SDIO_DW_MMC +#define RT_SDIO_DW_MMC_ROCKCHIP +#define RT_USING_SPI +#define RT_USING_SPI_ISR +#define RT_USING_QSPI +#define RT_USING_SFUD +#define RT_SFUD_USING_SFDP +#define RT_SFUD_USING_FLASH_INFO_TABLE +#define RT_SFUD_SPI_MAX_HZ 50000000 +#define RT_SPI_ROCKCHIP +#define RT_USING_WDT +#define RT_WDT_DW +#define RT_WDT_RK8XX +#define RT_USING_HWCRYPTO +#define RT_HWCRYPTO_DEFAULT_NAME "hwcryto" +#define RT_HWCRYPTO_IV_MAX_SIZE 16 +#define RT_HWCRYPTO_KEYBIT_MAX_SIZE 256 +#define RT_HWCRYPTO_USING_RNG +#define RT_HWCRYPTO_RNG_ROCKCHIP +#define RT_USING_LED +#define RT_LED_GPIO +#define RT_USING_INPUT +#define RT_INPUT_POWER +#define RT_INPUT_MISC +#define RT_INPUT_MISC_PWRKEY_RK8XX +#define RT_USING_MBOX +#define RT_MBOX_PIC +#define RT_MBOX_ROCKCHIP +#define RT_USING_HWSPINLOCK +#define RT_HWSPINLOCK_ROCKCHIP +#define RT_USING_PHYE +#define RT_PHYE_ROCKCHIP_NANENG_COMBO +#define RT_PHYE_ROCKCHIP_SNPS_PCIE3 +#define RT_USING_NVME +#define RT_USING_NVME_IO_QUEUE 4 +#define RT_NVME_PCI #define RT_USING_BLK /* Partition Types */ @@ -230,31 +294,82 @@ #define RT_BLK_PARTITION_DFS #define RT_BLK_PARTITION_EFI /* end of Partition Types */ +#define RT_USING_FIRMWARE +#define RT_FIRMWARE_ARM_SCMI +#define RT_FIRMWARE_ARM_SCMI_TRANSPORT_MAILBOX +#define RT_FIRMWARE_ARM_SCMI_TRANSPORT_SMC +#define RT_USING_REGULATOR +#define RT_REGULATOR_FIXED +#define RT_REGULATOR_GPIO +#define RT_REGULATOR_SCMI +#define RT_REGULATOR_RK8XX #define RT_USING_RESET +#define RT_RESET_SCMI /* Power Management (PM) Domains device drivers */ +#define RT_PMDOMAIN_SCMI +#define RT_PMDOMAIN_ROCKCHIP /* end of Power Management (PM) Domains device drivers */ +#define RT_USING_THERMAL + +/* Thermal Sensors Drivers */ + +#define RT_THERMAL_ROCKCHIP_TSADC + +/* Thermal Cool Drivers */ + +#define RT_THERMAL_COOL_PWM_FAN +#define RT_USING_NVMEM +#define RT_NVMEM_ROCKCHIP_OTP +#define RT_USING_DMA +#define RT_DMA_PL330 #define RT_USING_MFD #define RT_MFD_SYSCON +#define RT_MFD_RK8XX +#define RT_MFD_RK8XX_I2C +#define RT_MFD_RK8XX_SPI #define RT_USING_OFW #define RT_FDT_EARLYCON_MSG_SIZE 128 #define RT_USING_OFW_BUS_RANGES_NUMBER 8 +#define RT_USING_PCI +#define RT_PCI_MSI +#define RT_PCI_ENDPOINT +#define RT_PCI_SYS_64BIT +#define RT_PCI_CACHE_LINE_SIZE 8 + +/* PCI Device Drivers */ + +#define RT_PCI_DW +#define RT_PCI_DW_HOST +#define RT_PCI_DW_EP +#define RT_PCI_DW_ROCKCHIP #define RT_USING_PIC -#define MAX_HANDLERS 1024 +#define MAX_HANDLERS 2048 #define RT_PIC_ARM_GIC_V3 +#define RT_PIC_ARM_GIC_V3_ITS +#define RT_PIC_ARM_GIC_V3_ITS_IRQ_MAX 256 #define RT_USING_PIN #define RT_PIN_ROCKCHIP #define RT_USING_PINCTRL +#define RT_PINCTRL_ROCKCHIP_RK8XX #define RT_PINCTRL_ROCKCHIP -#define RT_USING_CLOCK_TIME #define RT_USING_CLK +#define RT_CLK_SCMI +#define RT_CLK_ROCKCHIP_RK8XX_CLKOUT #define RT_CLK_ROCKCHIP_LINK #define RT_CLK_ROCKCHIP #define RT_CLK_ROCKCHIP_RK3568 +#define RT_CLK_ROCKCHIP_RK3576 #define RT_CLK_ROCKCHIP_RK3588 -#define RT_CLOCK_TIME_ARM_ARCH -#define RT_CLOCK_TIMER_ROCKCHIP + +/* SoC (System on Chip) Drivers */ + +#define RT_SOC_ROCKCHIP_FIQ_DEBUGGER +#define RT_SOC_ROCKCHIP_GRF +#define RT_SOC_ROCKCHIP_HW_DECOMPRESS +#define RT_SOC_ROCKCHIP_IODOMAIN +/* end of SoC (System on Chip) Drivers */ /* end of Device Drivers */ /* C/C++ and POSIX layer */ @@ -594,10 +709,6 @@ /* GD32 Drivers */ /* end of GD32 Drivers */ - -/* HPMicro SDK */ - -/* end of HPMicro SDK */ /* end of HAL & SDK Drivers */ /* sensors drivers */ @@ -680,6 +791,5 @@ /* end of Arduino libraries */ /* end of RT-Thread online packages */ #define SOC_RK3500 -#define SOC_RK3568 #endif diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig index 01539009a2..f04d3c7f48 100755 --- a/components/drivers/Kconfig +++ b/components/drivers/Kconfig @@ -49,4 +49,10 @@ rsource "pinctrl/Kconfig" rsource "clk/Kconfig" rsource "usb/Kconfig" +if RT_USING_DM + menu "SoC (System on Chip) Drivers" + osource "$(SOC_DM_SOC_DIR)/Kconfig" + endmenu +endif + endmenu diff --git a/components/drivers/clk/clk-scmi.c b/components/drivers/clk/clk-scmi.c index ca51ee1ddc..d6240fa406 100755 --- a/components/drivers/clk/clk-scmi.c +++ b/components/drivers/clk/clk-scmi.c @@ -47,7 +47,7 @@ struct scmi_clk_data } info; }; -#define cell_to_scmi_clk_data(cell) rt_container_of(cell, struct scmi_clk_data, cell) +#define cell_to_scmi_clk_data(cell_ptr) rt_container_of(cell_ptr, struct scmi_clk_data, cell) static rt_err_t scmi_clk_op_gate(struct scmi_clk *sclk, int clk_id, rt_bool_t enable) { @@ -128,7 +128,7 @@ static rt_base_t scmi_clk_round_rate(struct rt_clk_cell *cell, rt_ubase_t drate, if (clk_data->rate_discrete) { - return rate; + return drate; } fmin = clk_data->info.range.min_rate; diff --git a/components/drivers/clock_time/Kconfig b/components/drivers/clock_time/Kconfig index 7da12ac849..d6259617aa 100644 --- a/components/drivers/clock_time/Kconfig +++ b/components/drivers/clock_time/Kconfig @@ -15,4 +15,8 @@ if RT_USING_CLOCK_TIME depends on RT_USING_DM depends on ARCH_ARM_CORTEX_A || ARCH_ARMV8 default n + +if RT_USING_DM + osource "$(SOC_DM_CLOCK_TIME_DIR)/Kconfig" +endif endif -- Gitee From 1bcd5c8f163baf1d86c42dfa29cfa170ef5592cf Mon Sep 17 00:00:00 2001 From: vandoul Date: Tue, 10 Feb 2026 10:18:45 +0800 Subject: [PATCH 33/45] =?UTF-8?q?=E4=BF=AE=E5=A4=8DMCXN947=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=9D=BFarduino=E6=8E=A5=E5=8F=A3=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E4=B8=B2=E5=8F=A3=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E4=B8=B2=E5=8F=A3=E5=86=8D=E9=85=8D=E7=BD=AE=E5=90=8E?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=94=B6=E5=88=B0=E6=95=B0=E6=8D=AE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/nxp/mcx/mcxn/Libraries/drivers/drv_uart.c | 9 +++- .../mcx/mcxn/frdm-mcxn947/board/SConscript | 2 +- bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.c | 51 +++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_uart.c b/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_uart.c index 31b457d9fe..e1790359d5 100644 --- a/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_uart.c +++ b/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_uart.c @@ -133,6 +133,7 @@ static rt_err_t mcx_configure(struct rt_serial_device *serial, struct serial_con { struct mcx_uart *uart; /* Serial port hardware structure, calling the structure initialized above */ lpuart_config_t config;/* It contains basic configuration parameters of the serial port, such as baud rate, data bit, stop bit, and parity check */ + rt_uint32_t irq_regval; RT_ASSERT(serial != RT_NULL); /* assert */ RT_ASSERT(cfg != RT_NULL); @@ -159,8 +160,14 @@ static rt_err_t mcx_configure(struct rt_serial_device *serial, struct serial_con config.enableTx = true; config.enableRx = true; - + + irq_regval = LPUART_GetEnabledInterrupts(uart->uart_base); LPUART_Init(uart->uart_base, &config, CLOCK_GetFreq(uart->clock_src)); + if(irq_regval & kLPUART_RxDataRegFullInterruptEnable) + { + LPUART_EnableInterrupts(uart->uart_base, kLPUART_RxDataRegFullInterruptEnable); + EnableIRQ(uart->irqn); + } return RT_EOK; } diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/SConscript b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/SConscript index 277739d361..70958fbab0 100644 --- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/SConscript +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/SConscript @@ -24,7 +24,7 @@ if GetDepend(['PKG_USING_CJSON']) and GetDepend(['PKG_USING_WEBCLIENT']): CPPPATH = [cwd, cwd + '/MCUX_Config/board'] -CPPDEFINES = ['DEBUG', 'CPU_MCXN947VDF_cm33_core0'] +CPPDEFINES = ['DEBUG', 'CPU_MCXN947VDF_cm33_core0', 'LPFLEXCOMM_INIT_NOT_USED_IN_DRIVER=1'] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES=CPPDEFINES) diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.c b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.c index c7fd47bac4..871ed972e6 100644 --- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.c +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.c @@ -34,6 +34,57 @@ void SysTick_Handler(void) rt_interrupt_leave(); } +/** + * This function will initial the FlexComm mode. + * +--------+----------------+--------+--------+--------------+ + * | Signal | LPSPI | LPUART | LPI2C | LPUART+LPI2C | + * +--------+----------------+--------+--------+--------------+ + * | FC_P0 | SDO/DATA[0] | RXD | SDA | SDA | + * | FC_P1 | SCK | TXD | SCL | SCL | + * | FC_P2 | SDI/DATA[1] | RTS_b | SCLS | TXD | + * | FC_P3 | PCS[0] | CTS_b | SDAS | RXD | + * | FC_P4 | PCS[3]/DATA[3] | DSR_b | HREQ_b | CTS_b | + * | FC_P5 | PCS[2]/DATA[2] | DTR_b | — | RTS_b | + * | FC_P6 | PCS[1]/HREQ | DCD_b | — | HREQ_b | + * +--------+----------------+--------+--------+--------------+ + */ +void rt_hw_flexcomm_mode_init(void) +{ +#ifdef BSP_USING_UART2 + LP_FLEXCOMM_Init(2, LP_FLEXCOMM_PERIPH_LPI2CAndLPUART); /* FLEXCOMM2 used for LPI2C and LPUART */ +#endif +#ifdef BSP_USING_UART4 + LP_FLEXCOMM_Init(4, LP_FLEXCOMM_PERIPH_LPUART); /* FLEXCOMM4 used for LPUART */ +#endif +#ifdef BSP_USING_UART5 + LP_FLEXCOMM_Init(5, LP_FLEXCOMM_PERIPH_LPUART); /* FLEXCOMM5 used for LPUART */ +#endif +#ifdef BSP_USING_UART6 + LP_FLEXCOMM_Init(6, LP_FLEXCOMM_PERIPH_LPUART); /* FLEXCOMM6 used for LPUART */ + #endif +#ifdef BSP_USING_SPI1 + LP_FLEXCOMM_Init(2, LP_FLEXCOMM_PERIPH_LPSPI); /* FLEXCOMM2 used for LPI2C and LPUART */ +#endif +#ifdef BSP_USING_SPI3 + LP_FLEXCOMM_Init(3, LP_FLEXCOMM_PERIPH_LPSPI); /* FLEXCOMM3 used for LPSPI */ +#endif +#ifdef BSP_USING_SPI6 + LP_FLEXCOMM_Init(6, LP_FLEXCOMM_PERIPH_LPSPI); /* FLEXCOMM6 used for LPSPI */ +#endif +#ifdef BSP_USING_SPI7 + LP_FLEXCOMM_Init(7, LP_FLEXCOMM_PERIPH_LPSPI); /* FLEXCOMM7 used for LPSPI */ +#endif +#ifdef BSP_USING_I2C0 + LP_FLEXCOMM_Init(0, LP_FLEXCOMM_PERIPH_LPI2C); /* FLEXCOMM0 used for LPI2C */ +#endif +#ifdef BSP_USING_I2C1 + LP_FLEXCOMM_Init(1, LP_FLEXCOMM_PERIPH_LPI2C); /* FLEXCOMM1 used for LPI2C */ +#endif +#ifdef BSP_USING_I2C2 + LP_FLEXCOMM_Init(2, LP_FLEXCOMM_PERIPH_LPI2C); /* FLEXCOMM2 used for LPI2C */ +#endif +} + /** * This function will initial board. */ -- Gitee From c2103a5cc9e7771d07bf202ed4a20de0556445b5 Mon Sep 17 00:00:00 2001 From: Rbb666 <64397326+Rbb666@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:16:11 +0800 Subject: [PATCH 34/45] =?UTF-8?q?Revert=20"=E4=BF=AE=E5=A4=8DMCXN947?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=9D=BFarduino=E6=8E=A5=E5=8F=A3=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E4=B8=B2=E5=8F=A3=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E4=B8=B2=E5=8F=A3=E5=86=8D=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=90=8E=E6=97=A0=E6=B3=95=E6=94=B6=E5=88=B0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98."?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 1bcd5c8f163baf1d86c42dfa29cfa170ef5592cf. --- bsp/nxp/mcx/mcxn/Libraries/drivers/drv_uart.c | 9 +--- .../mcx/mcxn/frdm-mcxn947/board/SConscript | 2 +- bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.c | 51 ------------------- 3 files changed, 2 insertions(+), 60 deletions(-) diff --git a/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_uart.c b/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_uart.c index e1790359d5..31b457d9fe 100644 --- a/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_uart.c +++ b/bsp/nxp/mcx/mcxn/Libraries/drivers/drv_uart.c @@ -133,7 +133,6 @@ static rt_err_t mcx_configure(struct rt_serial_device *serial, struct serial_con { struct mcx_uart *uart; /* Serial port hardware structure, calling the structure initialized above */ lpuart_config_t config;/* It contains basic configuration parameters of the serial port, such as baud rate, data bit, stop bit, and parity check */ - rt_uint32_t irq_regval; RT_ASSERT(serial != RT_NULL); /* assert */ RT_ASSERT(cfg != RT_NULL); @@ -160,14 +159,8 @@ static rt_err_t mcx_configure(struct rt_serial_device *serial, struct serial_con config.enableTx = true; config.enableRx = true; - - irq_regval = LPUART_GetEnabledInterrupts(uart->uart_base); + LPUART_Init(uart->uart_base, &config, CLOCK_GetFreq(uart->clock_src)); - if(irq_regval & kLPUART_RxDataRegFullInterruptEnable) - { - LPUART_EnableInterrupts(uart->uart_base, kLPUART_RxDataRegFullInterruptEnable); - EnableIRQ(uart->irqn); - } return RT_EOK; } diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/SConscript b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/SConscript index 70958fbab0..277739d361 100644 --- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/SConscript +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/SConscript @@ -24,7 +24,7 @@ if GetDepend(['PKG_USING_CJSON']) and GetDepend(['PKG_USING_WEBCLIENT']): CPPPATH = [cwd, cwd + '/MCUX_Config/board'] -CPPDEFINES = ['DEBUG', 'CPU_MCXN947VDF_cm33_core0', 'LPFLEXCOMM_INIT_NOT_USED_IN_DRIVER=1'] +CPPDEFINES = ['DEBUG', 'CPU_MCXN947VDF_cm33_core0'] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES=CPPDEFINES) diff --git a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.c b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.c index 871ed972e6..c7fd47bac4 100644 --- a/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.c +++ b/bsp/nxp/mcx/mcxn/frdm-mcxn947/board/board.c @@ -34,57 +34,6 @@ void SysTick_Handler(void) rt_interrupt_leave(); } -/** - * This function will initial the FlexComm mode. - * +--------+----------------+--------+--------+--------------+ - * | Signal | LPSPI | LPUART | LPI2C | LPUART+LPI2C | - * +--------+----------------+--------+--------+--------------+ - * | FC_P0 | SDO/DATA[0] | RXD | SDA | SDA | - * | FC_P1 | SCK | TXD | SCL | SCL | - * | FC_P2 | SDI/DATA[1] | RTS_b | SCLS | TXD | - * | FC_P3 | PCS[0] | CTS_b | SDAS | RXD | - * | FC_P4 | PCS[3]/DATA[3] | DSR_b | HREQ_b | CTS_b | - * | FC_P5 | PCS[2]/DATA[2] | DTR_b | — | RTS_b | - * | FC_P6 | PCS[1]/HREQ | DCD_b | — | HREQ_b | - * +--------+----------------+--------+--------+--------------+ - */ -void rt_hw_flexcomm_mode_init(void) -{ -#ifdef BSP_USING_UART2 - LP_FLEXCOMM_Init(2, LP_FLEXCOMM_PERIPH_LPI2CAndLPUART); /* FLEXCOMM2 used for LPI2C and LPUART */ -#endif -#ifdef BSP_USING_UART4 - LP_FLEXCOMM_Init(4, LP_FLEXCOMM_PERIPH_LPUART); /* FLEXCOMM4 used for LPUART */ -#endif -#ifdef BSP_USING_UART5 - LP_FLEXCOMM_Init(5, LP_FLEXCOMM_PERIPH_LPUART); /* FLEXCOMM5 used for LPUART */ -#endif -#ifdef BSP_USING_UART6 - LP_FLEXCOMM_Init(6, LP_FLEXCOMM_PERIPH_LPUART); /* FLEXCOMM6 used for LPUART */ - #endif -#ifdef BSP_USING_SPI1 - LP_FLEXCOMM_Init(2, LP_FLEXCOMM_PERIPH_LPSPI); /* FLEXCOMM2 used for LPI2C and LPUART */ -#endif -#ifdef BSP_USING_SPI3 - LP_FLEXCOMM_Init(3, LP_FLEXCOMM_PERIPH_LPSPI); /* FLEXCOMM3 used for LPSPI */ -#endif -#ifdef BSP_USING_SPI6 - LP_FLEXCOMM_Init(6, LP_FLEXCOMM_PERIPH_LPSPI); /* FLEXCOMM6 used for LPSPI */ -#endif -#ifdef BSP_USING_SPI7 - LP_FLEXCOMM_Init(7, LP_FLEXCOMM_PERIPH_LPSPI); /* FLEXCOMM7 used for LPSPI */ -#endif -#ifdef BSP_USING_I2C0 - LP_FLEXCOMM_Init(0, LP_FLEXCOMM_PERIPH_LPI2C); /* FLEXCOMM0 used for LPI2C */ -#endif -#ifdef BSP_USING_I2C1 - LP_FLEXCOMM_Init(1, LP_FLEXCOMM_PERIPH_LPI2C); /* FLEXCOMM1 used for LPI2C */ -#endif -#ifdef BSP_USING_I2C2 - LP_FLEXCOMM_Init(2, LP_FLEXCOMM_PERIPH_LPI2C); /* FLEXCOMM2 used for LPI2C */ -#endif -} - /** * This function will initial board. */ -- Gitee From 27b2ba5556cf137a346cef4d1ad575e2d1183b48 Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Sat, 7 Feb 2026 15:28:02 +0800 Subject: [PATCH 35/45] fix(CAN): Avoid double counting RX overflow drops --- components/drivers/can/dev_can.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/components/drivers/can/dev_can.c b/components/drivers/can/dev_can.c index e0cf0db9b2..04f12620f3 100644 --- a/components/drivers/can/dev_can.c +++ b/components/drivers/can/dev_can.c @@ -968,15 +968,19 @@ rt_err_t rt_hw_can_register(struct rt_can_device *can, */ void rt_hw_can_isr(struct rt_can_device *can, int event) { + rt_bool_t is_rxof_event = RT_FALSE; + switch (event & 0xff) { case RT_CAN_EVENT_RXOF_IND: { rt_base_t level; + is_rxof_event = RT_TRUE; level = rt_hw_local_irq_disable(); can->status.dropedrcvpkg++; rt_hw_local_irq_enable(level); } + /* FALLTHROUGH: RX overflow still tries to fetch one pending frame into software FIFO. */ case RT_CAN_EVENT_RX_IND: { struct rt_can_msg tmpmsg; @@ -1020,7 +1024,10 @@ void rt_hw_can_isr(struct rt_can_device *can, int event) else if (!rt_list_isempty(&rx_fifo->uselist)) { listmsg = rt_list_entry(rx_fifo->uselist.next, struct rt_can_msg_list, list); - can->status.dropedrcvpkg++; + if (!is_rxof_event) + { + can->status.dropedrcvpkg++; + } rt_list_remove(&listmsg->list); #ifdef RT_CAN_USING_HDR rt_list_remove(&listmsg->hdrlist); -- Gitee From ec5f5e678faa97a2f291c78b87ff862a67310b95 Mon Sep 17 00:00:00 2001 From: Just Chen <111217154+moment-NEW@users.noreply.github.com> Date: Tue, 10 Feb 2026 17:33:59 +0800 Subject: [PATCH 36/45] =?UTF-8?q?[docs]=20=E4=BF=AE=E5=A4=8D=20STM32=20BSP?= =?UTF-8?q?=20=E5=88=B6=E4=BD=9C=E6=95=99=E7=A8=8B=E4=B8=AD=E7=9A=84Sconsc?= =?UTF-8?q?rip=E6=96=87=E4=BB=B6=E6=95=99=E7=A8=8B=E9=94=99=E8=AF=AF=20(#1?= =?UTF-8?q?1189)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../How to make a STM32 BSP for RT-Thread.md | 34 +++++++++++++++--- ...66\344\275\234\346\225\231\347\250\213.md" | 35 ++++++++++++++++--- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/bsp/stm32/docs/How to make a STM32 BSP for RT-Thread.md b/bsp/stm32/docs/How to make a STM32 BSP for RT-Thread.md index d8afb41733..95a798b17a 100644 --- a/bsp/stm32/docs/How to make a STM32 BSP for RT-Thread.md +++ b/bsp/stm32/docs/How to make a STM32 BSP for RT-Thread.md @@ -166,11 +166,32 @@ The other two link script files are link.icf used by IAR and link.lds used by th The **SConscript** script determines the files to be added during the generation and compilation of the MDK/IAR project. -In this step, you need to modify the chip model and the address of the chip startup file. The modification content is shown in the figure below: +In this step, you need to modify the chip model and the address of the chip startup file. There are two SConscript files in the BSP directory, and only the one in the root directory needs to be modified, as shown below: -![Modify the startup file and chip model](./figures_en/SConscript.png) +```diff +# for module compiling +import os +Import('RTT_ROOT') +Import('env') +from building import * -Note: If you cannot find the .s file of the corresponding series in the folder, it may be that multiple series of chips reuse the same startup file. At this time, you can generate the target chip project in CubeMX to see which startup file is used. Then modify the startup file name. +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +- # The following macro definition statement exists in the template before modification: +- env.Append(CPPDEFINES = ['STM32H723xx'])# Target chip macro definition, hal library will use this macro definition for judgment ++ # Modify the macro definition to the corresponding chip model. For example, for STM32F103xB, the modified content is as follows: ++ env.Append(CPPDEFINES = ['STM32F103xB']) +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') +``` + +Note: Due to the BSP weight loss plan, the templates in the template directory are outdated, and the SConscript file may be different from the example. Please refer to the actual BSP or wait for an update. #### 3.4.3 Modify the project template @@ -190,6 +211,10 @@ Modify the program download method: Env tool is required to regenerate the project. +Before regenerating the project, you must execute the `pkgs --update` command in the Env tool. + +This command will automatically pull the corresponding HAL library package according to the Kconfig configuration, which is the key to subsequent compilation success. + #### 3.5.1 Regenerate the rtconfig.h file Enter the command menuconfig in the Env interface to configure the project and generate a new rtconfig.h file. As shown below: @@ -255,5 +280,4 @@ The specifications of making STM32 BSP are mainly divided into three aspects: en - Only submit documents necessary for the BSP and delete irrelevant intermediate documents. Please check other BSPs for documents that can be submitted. - When submitting libraries of different series of STM32, please refer to the HAL libraries of f1/f4 series and delete redundant library files. - Compile and test the BSP before submission to ensure that it compiles properly under different compilers. -- Perform functional tests on the BSP before submission to ensure that the BSP meets the requirements in the engineering configuration chapter before submission. - +- Perform functional tests on the BSP before submission to ensure that the BSP meets the requirements in the engineering configuration chapter before submission. diff --git "a/bsp/stm32/docs/STM32\347\263\273\345\210\227BSP\345\210\266\344\275\234\346\225\231\347\250\213.md" "b/bsp/stm32/docs/STM32\347\263\273\345\210\227BSP\345\210\266\344\275\234\346\225\231\347\250\213.md" index 4fb48c6757..a0dce17137 100644 --- "a/bsp/stm32/docs/STM32\347\263\273\345\210\227BSP\345\210\266\344\275\234\346\225\231\347\250\213.md" +++ "b/bsp/stm32/docs/STM32\347\263\273\345\210\227BSP\345\210\266\344\275\234\346\225\231\347\250\213.md" @@ -210,13 +210,35 @@ BSP 的制作过程分为如下五个步骤: #### 3.4.2 修改构建脚本 -**SConscript** 脚本决定 MDK/IAR 工程的生成以及编译过程中要添加文件。 +**SConscript** 脚本决定 MDK/IAR 工程的生成以及编译过程中要添加的文件。 -在这一步中需要修改芯片型号以及芯片启动文件的地址,修改内容如下图所示: +在这一步中需要修改芯片型号以及芯片启动文件的地址,在BSP目录中存在两个SConscript文件,其中只有根目录下的需要修改,修改内容如下所示: -![修改启动文件和芯片型号](./figures/SConscript.png) +```diff +# for module compiling +import os +Import('RTT_ROOT') +Import('env') +from building import * -注意:如果在文件夹中找不到相应系列的 .s 文件,可能是多个系列的芯片重用了相同的启动文件,此时可以在 CubeMX 中生成目标芯片的工程,查看使用了哪个启动文件,然后再修改启动文件名。 +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +- # 修改前模板中的存在如下宏定义语句: +- env.Append(CPPDEFINES = ['STM32H723xx'])# 目标芯片宏定义,hal库将使用这个宏定义作判断 ++ # 修改宏定义为对应的芯片型号,例如对于STM32F103xB,修改后的内容如下: ++ env.Append(CPPDEFINES = ['STM32F103xB']) +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') + + +``` +注意:由于BSP瘦身计划,template目录下的模板已经过时,SConscript文件可能与示例有所差异,请参考实际BSP或等待更新。 #### 3.4.3 修改工程模板 @@ -233,8 +255,11 @@ BSP 的制作过程分为如下五个步骤: ![配置下载方式](./figures/template_3.png) ### 3.5 重新生成工程 +工程生成需要使用 Env 工具。 + +在进行工程生成前,必须在 Env 工具中执行 `pkgs --update` 命令。 -重新生成工程需要使用 Env 工具。 +该命令会根据 Kconfig 配置自动拉取对应的 HAL 库软件包,这是后续编译成功的关键。 #### 3.5.1 重新生成 rtconfig.h 文件 -- Gitee From 9aff6f86469064f9a488ed62620a8d181eedc25e Mon Sep 17 00:00:00 2001 From: yefeng Date: Sun, 8 Feb 2026 02:01:11 +0800 Subject: [PATCH 37/45] [gd32][i2c] Add GD32VW553xx hardware I2C driver --- .../.ci/attachconfig/ci.attachconfig.yml | 13 +- bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig | 55 ++ .../risc-v/libraries/gd32_drivers/SConscript | 3 + .../risc-v/libraries/gd32_drivers/drv_i2c.c | 744 ++++++++++++++++++ .../risc-v/libraries/gd32_drivers/drv_i2c.h | 33 + 5 files changed, 847 insertions(+), 1 deletion(-) create mode 100644 bsp/gd32/risc-v/libraries/gd32_drivers/drv_i2c.c create mode 100644 bsp/gd32/risc-v/libraries/gd32_drivers/drv_i2c.h diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml b/bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml index 24dc154586..e8bbc5bc5f 100644 --- a/bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml @@ -6,4 +6,15 @@ scons.args: &scons component.pwm: kconfig: - CONFIG_BSP_USING_PWM=y - - CONFIG_BSP_USING_PWM0=y \ No newline at end of file + - CONFIG_BSP_USING_PWM0=y + +# ------ devices ------ +devices.i2c: + kconfig: + - CONFIG_BSP_USING_HW_I2C=y + - CONFIG_BSP_USING_HW_I2C0=y + - CONFIG_BSP_HW_I2C0_PIN_PA2_PA3=y + - CONFIG_BSP_HW_I2C0_CLK=100 + - CONFIG_BSP_USING_HW_I2C1=y + - CONFIG_BSP_HW_I2C1_PIN_PB12_PB13=y + - CONFIG_BSP_HW_I2C1_CLK=100 \ No newline at end of file diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig b/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig index 433c305712..e0668401c9 100644 --- a/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig +++ b/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig @@ -79,8 +79,63 @@ menu "On-chip Peripheral Drivers" bool "Enable PWM16" default n endif + menuconfig BSP_USING_HW_I2C + bool "Enable Hardware I2C" + default n + select RT_USING_I2C + if BSP_USING_HW_I2C + config BSP_USING_HW_I2C0 + bool "Enable Hardware I2C0" + default n + # config i2c0 pins + choice + prompt "Select I2C0 pins" + depends on BSP_USING_HW_I2C0 + config BSP_HW_I2C0_PIN_PA2_PA3 + bool "SCL=PA2, SDA=PA3" + config BSP_HW_I2C0_PIN_PA15_PC8 + bool "SCL=PA15, SDA=PC8" + config BSP_HW_I2C0_PIN_PB0_PB1 + bool "SCL=PB0, SDA=PB1" + config BSP_HW_I2C0_PIN_PB15_PA8 + bool "SCL=PB15, SDA=PA8" + endchoice + + # config i2c0 clock + config BSP_HW_I2C0_CLK + int "I2C0 clock frequency(KHz)" + default 100 + depends on BSP_USING_HW_I2C0 + range 10 1000 + + config BSP_USING_HW_I2C1 + bool "Enable Hardware I2C1" + default n + # config i2c1 pins + choice + prompt "Select I2C1 pins" + depends on BSP_USING_HW_I2C1 + config BSP_HW_I2C1_PIN_PA6_PA7 + bool "SCL=PA6, SDA=PA7" + config BSP_HW_I2C1_PIN_PA13_PA14 + bool "SCL=PA13, SDA=PA14" + config BSP_HW_I2C1_PIN_PA15_PC8 + bool "SCL=PA15, SDA=PC8" + config BSP_HW_I2C1_PIN_PB12_PB13 + bool "SCL=PB12, SDA=PB13" + config BSP_HW_I2C1_PIN_PB15_PA8 + bool "SCL=PB15, SDA=PA8" + endchoice + + # config i2c1 clock + config BSP_HW_I2C1_CLK + int "I2C1 clock frequency(KHz)" + default 100 + depends on BSP_USING_HW_I2C1 + range 10 1000 + endif source "$(BSP_DIR)/../libraries/gd32_drivers/Kconfig" diff --git a/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript b/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript index 4dedb95150..daae3a9fd9 100644 --- a/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript +++ b/bsp/gd32/risc-v/libraries/gd32_drivers/SConscript @@ -20,6 +20,9 @@ if GetDepend(['RT_USING_SERIAL']): if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']): if GetDepend('BSP_USING_I2C0') or GetDepend('BSP_USING_I2C1') or GetDepend('BSP_USING_I2C2') or GetDepend('BSP_USING_I2C3'): src += ['drv_soft_i2c.c'] +if GetDepend(['RT_USING_I2C', 'BSP_USING_HW_I2C']): + if GetDepend('BSP_USING_HW_I2C0') or GetDepend('BSP_USING_HW_I2C1'): + src += ['drv_i2c.c'] # add spi drivers. if GetDepend('RT_USING_SPI'): diff --git a/bsp/gd32/risc-v/libraries/gd32_drivers/drv_i2c.c b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_i2c.c new file mode 100644 index 0000000000..2a4de1b6d5 --- /dev/null +++ b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_i2c.c @@ -0,0 +1,744 @@ +/* + * Copyright (c) 2006-2026, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-13 yefeng first implementation for GD32VW55x + */ + +#include "drv_i2c.h" + +#if defined(RT_USING_I2C) && defined(BSP_USING_HW_I2C) + +#if !defined(BSP_USING_HW_I2C0) && !defined(BSP_USING_HW_I2C1) +#error "Please define at least one BSP_USING_HW_I2Cx" + /* This driver can be enabled in menuconfig: + * Hardware Drivers Config -> + * On-chip Peripheral Drivers -> + * Enable Hardware I2C + */ +#endif + +#if defined(SOC_SERIES_GD32VF103V) +#error "not implement GD32VF103V i2c support!" +#endif + +#define DBG_TAG "drv.i2c" +#ifdef RT_I2C_DEBUG +#define DBG_LVL DBG_LOG +#else +#define DBG_LVL DBG_ERROR +#endif +#include + +#define I2C_TIME_OUT (uint32_t)(20000) +#define MAX_RELOAD_SIZE 255 + +typedef enum +{ + I2C_PROC_START = 0, + I2C_PROC_READ_INIT, + I2C_PROC_TRANSMIT_DATA, + I2C_PROC_RELOAD, + I2C_PROC_STOP, + I2C_PROC_END +} i2c_process_enum; + +struct gd32_pin_cfg_param +{ + uint32_t rcu[2]; + uint32_t af[2]; + uint32_t port[2]; + uint32_t pin[2]; +}; + +/** + * @brief i2c configuration params + * + */ +static struct gd32_i2c_config i2c_config[] = { +#ifdef BSP_USING_HW_I2C0 + { + "i2c0", + I2C0, + RCU_I2C0, + BSP_HW_I2C0_CLK, + }, +#endif +#ifdef BSP_USING_HW_I2C1 + { + "i2c1", + I2C1, + RCU_I2C1, + BSP_HW_I2C1_CLK, + }, +#endif +}; + +/** + * @brief i2c pin configuration param array + * + */ +static const struct gd32_pin_cfg_param pin_param[] = { +#if defined(BSP_USING_HW_I2C0) + { +#if defined(BSP_HW_I2C0_PIN_PA2_PA3) + .rcu = { RCU_GPIOA, RCU_GPIOA }, + .af = { GPIO_AF_4, GPIO_AF_4 }, + .port = { GPIOA, GPIOA }, + .pin = { GPIO_PIN_2, GPIO_PIN_3 } +#elif defined(BSP_HW_I2C0_PIN_PA15_PC8) + .rcu = { RCU_GPIOA, RCU_GPIOC }, + .af = { GPIO_AF_4, GPIO_AF_4 }, + .port = { GPIOA, GPIOC }, + .pin = { GPIO_PIN_15, GPIO_PIN_8 } +#elif defined(BSP_HW_I2C0_PIN_PB0_PB1) + .rcu = { RCU_GPIOB, RCU_GPIOB }, + .af = { GPIO_AF_6, GPIO_AF_6 }, + .port = { GPIOB, GPIOB }, + .pin = { GPIO_PIN_0, GPIO_PIN_1 } +#elif defined(BSP_HW_I2C0_PIN_PB15_PA8) + .rcu = { RCU_GPIOB, RCU_GPIOA }, + .af = { GPIO_AF_4, GPIO_AF_5 }, + .port = { GPIOB, GPIOA }, + .pin = { GPIO_PIN_15, GPIO_PIN_8 } +#else +#error "i2c0 not support pin" +#endif + }, +#endif + +#if defined(BSP_USING_HW_I2C1) + { +#if defined(BSP_HW_I2C1_PIN_PA6_PA7) + .rcu = { RCU_GPIOA, RCU_GPIOA }, + .af = { GPIO_AF_4, GPIO_AF_0 }, + .port = { GPIOA, GPIOA }, + .pin = { GPIO_PIN_6, GPIO_PIN_7 } +#elif defined(BSP_HW_I2C1_PIN_PA13_PA14) + .rcu = { RCU_GPIOA, RCU_GPIOA }, + .af = { GPIO_AF_6, GPIO_AF_6 }, + .port = { GPIOA, GPIOA }, + .pin = { GPIO_PIN_13, GPIO_PIN_14 } +#elif defined(BSP_HW_I2C1_PIN_PA15_PC8) + .rcu = { RCU_GPIOA, RCU_GPIOC }, + .af = { GPIO_AF_6, GPIO_AF_6 }, + .port = { GPIOA, GPIOC }, + .pin = { GPIO_PIN_15, GPIO_PIN_8 } +#elif defined(BSP_HW_I2C1_PIN_PB12_PB13) + .rcu = { RCU_GPIOB, RCU_GPIOB }, + .af = { GPIO_AF_6, GPIO_AF_6 }, + .port = { GPIOB, GPIOB }, + .pin = { GPIO_PIN_12, GPIO_PIN_13 } +#elif defined(BSP_HW_I2C1_PIN_PB15_PA8) + .rcu = { RCU_GPIOB, RCU_GPIOA }, + .af = { GPIO_AF_6, GPIO_AF_6 }, + .port = { GPIOB, GPIOA }, + .pin = { GPIO_PIN_15, GPIO_PIN_8 } +#else +#error "i2c1 not support pin" +#endif + }, +#endif +}; + +/** + * @brief Device object + * + */ +static struct gd32_i2c_device i2c_obj[sizeof(i2c_config) / sizeof(i2c_config[0])] = { 0 }; + +/** + * @brief i2c read + * + * @param device operate device + * @param msg deal i2c message pointer + * @return rt_err_t return RT_OK if success, other value failed. + */ +static rt_err_t gd32_i2c_read(struct gd32_i2c_device *device, struct rt_i2c_msg *msg) +{ + rt_err_t ret = RT_EOK; + i2c_process_enum state = I2C_PROC_READ_INIT; + rt_uint32_t timeout = 0; + rt_uint8_t end_flag = 0; + rt_uint8_t first_reload_flag = 1; + rt_uint8_t reload_mode_flag = 0; + + RT_ASSERT(device != RT_NULL); + RT_ASSERT(msg != RT_NULL); + + rt_uint32_t i2c_periph = device->config->i2c_periph; + rt_uint16_t nbytes_reload = 0; + rt_uint16_t number_of_byte = msg->len; + rt_uint8_t *p_buffer = msg->buf; + + while (!end_flag) + { + switch (state) + { + case I2C_PROC_START: + /* start */ + i2c_start_on_bus(i2c_periph); + state = I2C_PROC_TRANSMIT_DATA; + break; + case I2C_PROC_READ_INIT: + /* configure the device address */ + i2c_master_addressing(i2c_periph, msg->addr << 1, I2C_MASTER_RECEIVE); + /* disable I2C automatic end mode in master mode */ + i2c_automatic_end_disable(i2c_periph); + state = I2C_PROC_RELOAD; + break; + case I2C_PROC_RELOAD: + if (number_of_byte > MAX_RELOAD_SIZE) + { + number_of_byte = number_of_byte - MAX_RELOAD_SIZE; + nbytes_reload = MAX_RELOAD_SIZE; + reload_mode_flag = 1; + } + else + { + nbytes_reload = number_of_byte; + reload_mode_flag = 0; + } + + LOG_D("configure number of bytes: %d", nbytes_reload); + /* configure number of bytes to be transferred */ + i2c_transfer_byte_number_config(i2c_periph, nbytes_reload); + + if (reload_mode_flag) + { + LOG_D("enable I2C reload mode"); + /* enable I2C reload mode */ + i2c_reload_enable(i2c_periph); + } + else + { + LOG_D("disable I2C reload mode"); + /* disable I2C reload mode */ + i2c_reload_disable(i2c_periph); + } + + if (first_reload_flag) + { + LOG_D("first reload"); + first_reload_flag = 0; + state = I2C_PROC_START; + } + else + { + state = I2C_PROC_TRANSMIT_DATA; + } + break; + case I2C_PROC_TRANSMIT_DATA: + LOG_D("read: transmit data: %d", nbytes_reload); + timeout = 0; + while (nbytes_reload) + { + /* wait until the RBNE bit is set and clear it */ + if (i2c_flag_get(i2c_periph, I2C_FLAG_RBNE)) + { + /* read a byte from the device */ + *p_buffer = i2c_data_receive(i2c_periph); + /* point to the next location where the byte read will be saved */ + p_buffer++; + /* decrement the read bytes counter */ + nbytes_reload--; + + /* reset timeout counter */ + timeout = 0; + } + else + { + timeout++; + if (timeout >= I2C_TIME_OUT) + { + LOG_E("receive data timeout, end"); + ret = -RT_ETIMEOUT; + return ret; + } + } + } + + LOG_D("read: transmit data end"); + timeout = 0; + + /* check if the reload mode is enabled or not */ + if (I2C_CTL1(i2c_periph) & I2C_CTL1_RELOAD) + { + /* wait for TCR flag */ + while ((!i2c_flag_get(i2c_periph, I2C_FLAG_TCR)) && (timeout < I2C_TIME_OUT)) + { + timeout++; + } + + if (timeout < I2C_TIME_OUT) + { + LOG_D("reload read complete"); + state = I2C_PROC_RELOAD; + } + else + { + LOG_E("reload read timeout, end"); + ret = -RT_ETIMEOUT; + state = I2C_PROC_END; + } + } + else + { + LOG_D("read complete"); + + /* wait for TCR flag */ + while ((!i2c_flag_get(i2c_periph, I2C_FLAG_TC)) && (timeout < I2C_TIME_OUT)) + { + timeout++; + } + + if (timeout < I2C_TIME_OUT) + { + if (msg->flags & RT_I2C_NO_STOP) + { + LOG_D("no stop end"); + state = I2C_PROC_END; + } + else + { + LOG_D("generate a STOP"); + i2c_stop_on_bus(i2c_periph); + state = I2C_PROC_STOP; + } + } + else + { + LOG_E("read timeout, end"); + ret = -RT_ETIMEOUT; + state = I2C_PROC_END; + } + } + break; + case I2C_PROC_STOP: + /* wait until the stop condition is finished */ + while ((!i2c_flag_get(i2c_periph, I2C_FLAG_STPDET)) && (timeout < I2C_TIME_OUT)) + { + timeout++; + } + + if (timeout < I2C_TIME_OUT) + { + /* clear STPDET flag */ + i2c_flag_clear(i2c_periph, I2C_FLAG_STPDET); + timeout = 0; + state = I2C_PROC_END; + } + else + { + timeout = 0; + state = I2C_PROC_END; + ret = -RT_ETIMEOUT; + LOG_E("i2c master sends stop signal timeout in read!\n"); + } + break; + case I2C_PROC_END: + end_flag = 1; + timeout = 0; + break; + default: + /* default status */ + end_flag = 1; + timeout = 0; + LOG_E("i2c state unknown, end!\n"); + } + } + + return ret; +} + +/** + * @brief i2c write + * + * @param device operate device + * @param msg deal i2c message pointer + * @return rt_err_t return RT_OK if success, other value failed. + */ +static rt_err_t gd32_i2c_write(struct gd32_i2c_device *device, struct rt_i2c_msg *msg) +{ + rt_err_t ret = RT_EOK; + i2c_process_enum state = I2C_PROC_RELOAD; + rt_uint16_t timeout = 0; + rt_uint8_t start_flag = 0; + rt_uint8_t end_flag = 0; + rt_uint8_t reload_mode_flag = 0; + + RT_ASSERT(device != RT_NULL); + RT_ASSERT(msg != RT_NULL); + + rt_uint32_t i2c_periph = device->config->i2c_periph; + rt_uint16_t number_of_byte = msg->len; + rt_uint16_t nbytes_reload = 0; + rt_uint8_t *p_buffer = msg->buf; + + if (msg->flags & RT_I2C_NO_START) + { + start_flag = 0; + } + else + { + start_flag = 1; + } + + /* configure the device address */ + i2c_master_addressing(i2c_periph, msg->addr << 1, I2C_MASTER_TRANSMIT); + /* disable I2C automatic end mode in master mode */ + i2c_automatic_end_disable(i2c_periph); + + while (!end_flag) + { + switch (state) + { + case I2C_PROC_START: + /* start */ + LOG_D("generate a START"); + timeout = 0; + i2c_start_on_bus(i2c_periph); + state = I2C_PROC_TRANSMIT_DATA; + break; + case I2C_PROC_RELOAD: + if (number_of_byte > MAX_RELOAD_SIZE) + { + number_of_byte = number_of_byte - MAX_RELOAD_SIZE; + nbytes_reload = MAX_RELOAD_SIZE; + reload_mode_flag = 1; + } + else + { + nbytes_reload = number_of_byte; + reload_mode_flag = 0; + } + + LOG_D("configure number of bytes: %d", nbytes_reload); + + /* configure number of bytes to be transferred */ + i2c_transfer_byte_number_config(i2c_periph, nbytes_reload); + + if (reload_mode_flag) + { + LOG_D("enable I2C reload mode"); + /* enable I2C reload mode */ + i2c_reload_enable(i2c_periph); + } + else + { + LOG_D("disable I2C reload mode"); + /* disable I2C reload mode */ + i2c_reload_disable(i2c_periph); + } + + if (start_flag) + { + start_flag = 0; + state = I2C_PROC_START; + } + else + { + state = I2C_PROC_TRANSMIT_DATA; + } + break; + case I2C_PROC_TRANSMIT_DATA: + timeout = 0; + LOG_D("master transmit bytes: %d", nbytes_reload); + while (nbytes_reload--) + { + /* wait until TI bit is set */ + while ((!i2c_flag_get(i2c_periph, I2C_FLAG_TI)) && (timeout < I2C_TIME_OUT)) + { + timeout++; + } + + if (timeout < I2C_TIME_OUT) + { + /* while there is data to be written */ + i2c_data_transmit(i2c_periph, *p_buffer); + /* point to the next byte to be written */ + p_buffer++; + timeout = 0; + } + else + { + /* wait TI timeout */ + LOG_E("i2c master sends data timeout when write!"); + ret = -RT_ETIMEOUT; + return ret; + } + } + + if (timeout < I2C_TIME_OUT) + { + rt_uint32_t wait_flag; + + /* check if the reload mode is enabled or not */ + if (I2C_CTL1(i2c_periph) & I2C_CTL1_RELOAD) + { + wait_flag = I2C_FLAG_TCR; + } + else + { + wait_flag = I2C_FLAG_TC; + } + + timeout = 0; + + /* wait TCR/TC bit is set */ + while ((!i2c_flag_get(i2c_periph, wait_flag)) && (timeout < I2C_TIME_OUT)) + { + timeout++; + } + + if (timeout < I2C_TIME_OUT) + { + if (reload_mode_flag) + { + state = I2C_PROC_RELOAD; + } + else + { + if (msg->flags & RT_I2C_NO_STOP) + { + state = I2C_PROC_END; + } + else + { + LOG_D("generate a STOP"); + i2c_stop_on_bus(i2c_periph); + state = I2C_PROC_STOP; + } + } + } + else + { + LOG_E("i2c master wait %s timeout, end!", (wait_flag == I2C_FLAG_TCR) ? "TCR" : "TC"); + state = I2C_PROC_END; + ret = -RT_ETIMEOUT; + } + } + else + { + LOG_E("i2c master send data timeout when write!"); + state = I2C_PROC_END; + ret = -RT_ETIMEOUT; + } + break; + case I2C_PROC_STOP: + timeout = 0; + /* wait until the stop condition is finished */ + while ((!i2c_flag_get(i2c_periph, I2C_FLAG_STPDET)) && (timeout < I2C_TIME_OUT)) + { + timeout++; + } + + if (timeout < I2C_TIME_OUT) + { + /* clear STPDET flag */ + i2c_flag_clear(i2c_periph, I2C_FLAG_STPDET); + } + else + { + /* stop detect timeout */ + LOG_E("i2c master sends stop signal timeout when write!"); + ret = -RT_ETIMEOUT; + } + + state = I2C_PROC_END; + break; + case I2C_PROC_END: + LOG_D("END"); + end_flag = 1; + break; + default: + /* default status */ + state = I2C_PROC_START; + end_flag = 1; + timeout = 0; + LOG_E("i2c master unknown state, end!\n"); + } + } + + return ret; +} + +/** + * @brief configure i2c alternate pin + * + * @param param configure param + */ +static void gd32_i2c_pin_configure(const struct gd32_pin_cfg_param *param) +{ + for (rt_uint8_t i = 0; i < 2; i++) + { + /* enable GPIO clock */ + rcu_periph_clock_enable(param->rcu[i]); + + /* connect I2C_SCL_PIN to I2C_SCL */ + gpio_af_set(param->port[i], param->af[i], param->pin[i]); + + /* configure GPIO pins of I2C */ + gpio_mode_set(param->port[i], GPIO_MODE_AF, GPIO_PUPD_PULLUP, param->pin[i]); + gpio_output_options_set(param->port[i], GPIO_OTYPE_OD, GPIO_OSPEED_25MHZ, param->pin[i]); + } +} + +/** + * @brief configure i2c timing + * + * @param i2c_cfg param pointer + * + * @note tSCL=tSYNC1+tSYNC2+{[(SCLH[7:0]+1)+(SLLL[7:0]+1)]*(PSC+1)*tI2CCLK} + */ +static void gd32_i2c_timing_configure(struct gd32_i2c_config *i2c_cfg) +{ +#define I2C_CLK_PSC_LOW 15 +#define I2C_CLK_PSC_STAND 7 +#define I2C_CLK_PSC_FAST 1 +#define I2C_SCLDELY_LOW 9 +#define I2C_SCLDELY_FAST 3 +#define I2C_SDADELY 0 + + rt_uint32_t i2c_freq; + rt_uint32_t sclh_scll; + rt_uint8_t clk_psc; + rt_uint8_t scldely; + + if (i2c_cfg->i2c_periph == I2C0) + { + i2c_freq = rcu_clock_freq_get(CK_I2C0); + } + else if (i2c_cfg->i2c_periph == I2C1) + { + /* I2C1 use APB1 clock */ + i2c_freq = rcu_clock_freq_get(CK_APB1); + } + else + { + i2c_freq = rcu_clock_freq_get(CK_APB1); + } + + if (i2c_cfg->speed < 100) + { + clk_psc = I2C_CLK_PSC_LOW; + scldely = I2C_SCLDELY_LOW; + } + else if (i2c_cfg->speed <= 400) + { + clk_psc = I2C_CLK_PSC_STAND; + scldely = I2C_SCLDELY_LOW; + } + else + { + clk_psc = I2C_CLK_PSC_STAND; + scldely = I2C_SCLDELY_FAST; + } + + /* configure I2C timing */ + i2c_timing_config(i2c_cfg->i2c_periph, clk_psc, scldely, I2C_SDADELY); + + sclh_scll = (i2c_freq / (1000 * i2c_cfg->speed) - (I2C_SDADELY * (clk_psc + 1) + 1) - (scldely + 1) * (clk_psc + 1)) / (clk_psc + 1) - 2; + + i2c_master_clock_config(i2c_cfg->i2c_periph, sclh_scll / 2, sclh_scll / 2); +} + +/** + * @brief configure i2c clock, timing, enable i2c + * + * @param i2c_cfg + */ +static void gd32_i2c_configure(struct gd32_i2c_config *i2c_cfg) +{ + RT_ASSERT(i2c_cfg != RT_NULL); + + /* enable i2c clock */ + rcu_periph_clock_enable(i2c_cfg->rcu_clk); + + /* reset I2C */ + i2c_disable(i2c_cfg->i2c_periph); + + /* i2c timing config MUST at I2CEN = 0 */ + gd32_i2c_timing_configure(i2c_cfg); + + /* enable I2C */ + i2c_enable(i2c_cfg->i2c_periph); +} + +static rt_ssize_t gd32_i2c_xfer(struct rt_i2c_bus_device *device, struct rt_i2c_msg msgs[], rt_uint32_t num) +{ + struct rt_i2c_msg *msg; + rt_uint32_t i; + rt_uint16_t last_flags; + + RT_ASSERT(device != RT_NULL); + + struct gd32_i2c_device *i2c_obj = (struct gd32_i2c_device *)(device); + struct gd32_i2c_config *i2c_cfg = (struct gd32_i2c_config *)(i2c_obj->config); + + RT_ASSERT(i2c_cfg != RT_NULL); + + for (i = 0; i < num; i++) + { + rt_err_t ret; + msg = &msgs[i]; + + if (msg->flags & RT_I2C_ADDR_10BIT) + { + LOG_E("not implement 10bit address mode"); + return -RT_ENOSYS; + } + + if (msg->flags & RT_I2C_RD) + { + ret = gd32_i2c_read(i2c_obj, msg); + } + else + { + ret = gd32_i2c_write(i2c_obj, msg); + } + + if (ret != RT_EOK) + { + break; + } + } + + return i; +} + +static const struct rt_i2c_bus_device_ops i2c_ops = { gd32_i2c_xfer, RT_NULL, RT_NULL }; + +static int rt_hw_i2c_init(void) +{ + rt_uint8_t index; + rt_size_t obj_num; + rt_err_t result = 0; + + obj_num = sizeof(i2c_obj) / sizeof(struct gd32_i2c_device); + + for (index = 0; index < obj_num; index++) + { + /* init i2c object */ + i2c_obj[index].config = &i2c_config[index]; + i2c_obj[index].parent.ops = &i2c_ops; + + /* init i2c pin */ + gd32_i2c_pin_configure(&pin_param[index]); + + /* init i2c device */ + gd32_i2c_configure(&i2c_config[index]); + + /* register i2c device */ + result = rt_i2c_bus_device_register(&i2c_obj[index].parent, i2c_obj[index].config->name); + RT_ASSERT(result == RT_EOK); + } + + return 0; +} +INIT_DEVICE_EXPORT(rt_hw_i2c_init); + +#endif /* defined(RT_USING_I2C) && defined(BSP_USING_HW_I2C) */ diff --git a/bsp/gd32/risc-v/libraries/gd32_drivers/drv_i2c.h b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_i2c.h new file mode 100644 index 0000000000..e4f60f5ef6 --- /dev/null +++ b/bsp/gd32/risc-v/libraries/gd32_drivers/drv_i2c.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2026, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2026-01-13 yefeng first implementation. + */ + +#ifndef __DRV_I2C_H__ +#define __DRV_I2C_H__ + +#include +#include +#include +#include + +struct gd32_i2c_config +{ + const char *name; + rt_uint32_t i2c_periph; + rcu_periph_enum rcu_clk; + rt_uint32_t speed; +}; + +struct gd32_i2c_device +{ + struct rt_i2c_bus_device parent; + struct gd32_i2c_config *config; +}; + +#endif -- Gitee From 9412a2899d08c3ef806accf0335bda2397c326de Mon Sep 17 00:00:00 2001 From: O-O-BOOK Date: Fri, 6 Feb 2026 16:51:55 +0800 Subject: [PATCH 38/45] [style][components/fal_rtt] misrac style --- components/fal/src/fal_rtt.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/components/fal/src/fal_rtt.c b/components/fal/src/fal_rtt.c index 077191e102..5f4492cf57 100644 --- a/components/fal/src/fal_rtt.c +++ b/components/fal/src/fal_rtt.c @@ -167,7 +167,8 @@ struct rt_device *fal_blk_device_create(const char *parition_name) return NULL; } - if ((fal_flash = fal_flash_device_find(fal_part->flash_name)) == NULL) + fal_flash = fal_flash_device_find(fal_part->flash_name); + if (fal_flash == NULL) { LOG_E("Error: the flash device name (%s) is not found.", fal_part->flash_name); return NULL; @@ -309,7 +310,8 @@ struct rt_device *fal_mtd_nor_device_create(const char *parition_name) return NULL; } - if ((fal_flash = fal_flash_device_find(fal_part->flash_name)) == NULL) + fal_flash = fal_flash_device_find(fal_part->flash_name); + if (fal_flash == NULL) { LOG_E("Error: the flash device name (%s) is not found.", fal_part->flash_name); return NULL; @@ -620,19 +622,24 @@ static void fal(rt_uint8_t argc, char **argv) { if (argc >= 3) { char *dev_name = argv[2]; - if ((flash_dev = fal_flash_device_find(dev_name)) != NULL) + flash_dev = fal_flash_device_find(dev_name); + if (flash_dev != NULL) { part_dev = NULL; } - else if ((part_dev = fal_partition_find(dev_name)) != NULL) - { - flash_dev = NULL; - } else { - rt_kprintf("Device %s NOT found. Probe failed.\n", dev_name); - flash_dev = NULL; - part_dev = NULL; + part_dev = fal_partition_find(dev_name); + if (part_dev != NULL) + { + flash_dev = NULL; + } + else + { + rt_kprintf("Device %s NOT found. Probe failed.\n", dev_name); + flash_dev = NULL; + part_dev = NULL; + } } } -- Gitee From db6c0ddbf333be65f5ddc990ee63a200f768a9f7 Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Thu, 12 Feb 2026 08:57:46 +0800 Subject: [PATCH 39/45] feat(console): Add console output enable switch - rt_console_output_enabled()/rt_console_output_is_enabled() gate rt_kprintf/rt_kputs output with the switch --- include/rtthread.h | 7 +++++++ src/Kconfig | 12 ++++++++++++ src/kservice.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/include/rtthread.h b/include/rtthread.h index 7f97c068cd..a87515907e 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -783,6 +783,13 @@ void rt_components_board_init(void); #else int rt_kprintf(const char *fmt, ...); void rt_kputs(const char *str); +#ifdef RT_USING_CONSOLE_OUTPUT_CTL +void rt_console_output_set_enabled(rt_bool_t enabled); +rt_bool_t rt_console_output_get_enabled(void); +#else +#define rt_console_output_set_enabled(enabled) ((void)0) +#define rt_console_output_get_enabled() (RT_TRUE) +#endif /* RT_USING_CONSOLE_OUTPUT_CTL */ #endif /* RT_USING_CONSOLE */ rt_err_t rt_backtrace(void); diff --git a/src/Kconfig b/src/Kconfig index f57b305ca2..d278169da0 100644 --- a/src/Kconfig +++ b/src/Kconfig @@ -430,6 +430,18 @@ if RT_USING_CONSOLE string "the device name for console" default "uart1" + config RT_USING_CONSOLE_OUTPUT_CTL + bool "Enable runtime console output control" + default y + help + Enable runtime control for console output. + When enabled, rt_console_output_set_enabled() and + rt_console_output_get_enabled() can be used to switch + rt_kputs()/rt_kprintf() output on or off dynamically. + + When disabled, these APIs are not compiled as real symbols and + output path has no runtime check, so console output stays enabled. + endif config RT_VER_NUM diff --git a/src/kservice.c b/src/kservice.c index 259eac9a70..29c9022c89 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -208,6 +208,32 @@ rt_device_t rt_console_set_device(const char *name) RTM_EXPORT(rt_console_set_device); #endif /* RT_USING_DEVICE */ +#ifdef RT_USING_CONSOLE_OUTPUT_CTL +static volatile rt_bool_t _console_output_enabled = RT_TRUE; + +/** + * @brief Enable or disable console log output. + * + * @param enabled RT_TRUE to enable output, RT_FALSE to disable output. + */ +void rt_console_output_set_enabled(rt_bool_t enabled) +{ + _console_output_enabled = enabled; +} +RTM_EXPORT(rt_console_output_set_enabled); + +/** + * @brief Get current console log output enable state. + * + * @return RT_TRUE if output is enabled, RT_FALSE otherwise. + */ +rt_bool_t rt_console_output_get_enabled(void) +{ + return _console_output_enabled; +} +RTM_EXPORT(rt_console_output_get_enabled); +#endif /* RT_USING_CONSOLE_OUTPUT_CTL */ + rt_weak void rt_hw_console_output(const char *str) { /* empty console output */ @@ -346,6 +372,11 @@ void rt_kputs(const char *str) return; } + if (!rt_console_output_get_enabled()) + { + return; + } + _kputs(str, rt_strlen(str)); } @@ -362,6 +393,11 @@ rt_weak int rt_kprintf(const char *fmt, ...) rt_size_t length = 0; static char rt_log_buf[RT_CONSOLEBUF_SIZE]; + if (!rt_console_output_get_enabled()) + { + return 0; + } + va_start(args, fmt); PRINTF_BUFFER_TAKE; -- Gitee From aa79cd8ac547caf01f281d81e9c1d12a8405f6ca Mon Sep 17 00:00:00 2001 From: theqengineer Date: Wed, 11 Feb 2026 16:52:34 +0800 Subject: [PATCH 40/45] [bsp][stm32]: correct the errors in README of U series --- bsp/stm32/stm32u575-st-nucleo/README.md | 2 +- bsp/stm32/stm32u585-iot02a/README.md | 335 +++++------------------- bsp/stm32/stm32u585-iot02a/README_zh.md | 2 +- 3 files changed, 64 insertions(+), 275 deletions(-) diff --git a/bsp/stm32/stm32u575-st-nucleo/README.md b/bsp/stm32/stm32u575-st-nucleo/README.md index 4d949ae251..5374cca90b 100644 --- a/bsp/stm32/stm32u575-st-nucleo/README.md +++ b/bsp/stm32/stm32u575-st-nucleo/README.md @@ -2,7 +2,7 @@ **English** | [中文](README_zh.md) -## MCU: STM32U575ZI @110MHz, 2048 KB FLASH, 786 KB RAM +## MCU: STM32U575ZI @160MHz, 2048 KB FLASH, 786 KB RAM The STM32U575xx devices belong to an ultra-low-power microcontrollers family (STM32U5 Series) based on the high-performance Arm® Cortex®-M33 32-bit RISC core. They operate at a frequency of up to 160 MHz. diff --git a/bsp/stm32/stm32u585-iot02a/README.md b/bsp/stm32/stm32u585-iot02a/README.md index 4d949ae251..db527711c6 100644 --- a/bsp/stm32/stm32u585-iot02a/README.md +++ b/bsp/stm32/stm32u585-iot02a/README.md @@ -1,317 +1,106 @@ -# Part I : NUCLEO-STM32U575ZI-Q- BSP Introduction +# Part 1: STM32 B-U585I-IOT02A Development Board BSP Description **English** | [中文](README_zh.md) -## MCU: STM32U575ZI @110MHz, 2048 KB FLASH, 786 KB RAM +## Introduction -The STM32U575xx devices belong to an ultra-low-power microcontrollers family (STM32U5 Series) based on the high-performance Arm® Cortex®-M33 32-bit RISC core. They operate at a frequency of up to 160 MHz. +This document provides the BSP (Board Support Package) description for the STM32 B-U585I-IOT02A development board, contributed by Zheng-Bicheng. -The Cortex®-M33 core features a single-precision FPU (floating-point unit), that supports all the Arm® single-precision data-processing instructions and all the data types. +Main contents include: -The Cortex®-M33 core also implements a full set of DSP (digital signal processing) instructions and a MPU (memory protection unit) that enhances the application security. +- Development board resource introduction +- BSP quick start guide +- Advanced usage -The devices embed high-speed memories (up to 2 Mbytes of Flash memory and 786 Kbytes of SRAM), a FSMC (flexible external memory controller) for static memories (for devices with packages of 90 pins and more), two Octo-SPI Flash memory interfaces (at least one Quad-SPI available on all packages) and an extensive range of enhanced I/Os and peripherals connected to three APB buses, three AHB buses and a 32-bit multi-AHB bus matrix. +By reading the quick start guide, developers can quickly get started with this BSP and run RT-Thread on the development board. The advanced usage guide will introduce more advanced features to help developers utilize RT-Thread to drive more onboard resources. -The devices offer security foundation compliant with the TBSA (trusted-based security architecture) requirements from Arm®. It embeds the necessary security features to implement a secure boot, secure data storage and secure firmware update. Besides these capabilities, the devices incorporate a secure firmware installation feature, that allows the customer to secure the provisioning of the code during its production. A flexible lifecycle is managed thanks to multiple levels of readout protection and debug unlock with password. Firmware hardware isolation is supported thanks to securable peripherals, memories and I/Os, and privilege configuration of peripherals and memories. +## Development Board Introduction -The devices feature several protection mechanisms for embedded Flash memory and SRAM: readout protection, write protection, secure and hide protection areas. +STM32 B-U585I-IOT02A is a development board launched by ST based on the ARM Cortex-M33 core, with a maximum frequency of 160 MHz. This development board has rich onboard resources and can fully utilize the performance of the STM32U575 chip. -The devices embed several peripherals reinforcing security: with DPA resistancea HASH hardware accelerator, and a true random number generator. +The development board appearance is shown below: -The devices offer active tamper detection and protection against transient and environmental perturbation attacks, thanks to several internal monitoring generating secret data erase in case of attack. This helps to fit the PCI requirements for point of sales applications. +![board](https://www.st.com/bin/ecommerce/api/image.PF271412.en.feature-description-include-personalized-no-cpn-large.jpg) -The devices offer one fast 14-bit ADC (2.5 Msps), one 12-bit ADC (2.5 Msps), two comparators, two operational amplifiers, two DAC channels, an internal voltage reference buffer, a low-power RTC, four 32-bit general-purpose timers, two 16-bit PWM timers dedicated to motor control, three 16-bit general-purpose timers, two 16-bit basic timers and four 16-bit low-power timers. +Common **onboard resources** of this development board include: -The devices support a MDF (multi-function digital filter) with six filters dedicated to the connection of external sigma-delta modulators. Another low-power digital filter dedicated to audio signals is embedded (ADF), with one filter supporting sound-activity detection. The devices embed also a Chrom-ART Accelerator dedicated to graphic applications, and mathematical accelerators (a trigonometric functions accelerator plus a filter mathematical accelerator). In addition, up to 24 capacitive sensing channels are available. +- MCU: STM32U585AIIxQ, 160 MHz main frequency, 2048KB FLASH, 786KB RAM +- Common interfaces: USB to serial, USB interface, Arduino interface, etc. +- Debug interface: standard ST-Link -The devices also feature standard and advanced communication interfaces such as: four I2Cs, three SPIs, three USARTs, two UARTs, one low-power UART, two SAIs, one digital camera interface (DCMI), two SDMMCs, one FDCAN, one USB OTG full-speed, one USB Type-C /USB Power Delivery controller, and one generic synchronous 8-/16-bit PSSI (parallel data input/output slave interface). +For more detailed information about the development board, please refer to [STM32 B-U585I-IOT02A](https://www.st.com/zh/evaluation-tools/b-u585i-iot02a.html). -The devices operate in the –40 to +85 °C (+105 °C junction) and –40 to +125 °C (+130 °C junction) temperature ranges from a 1.71 to 3.6 V power supply. +## Peripheral Support -A comprehensive set of power-saving modes allow the design of low-power applications. Many peripherals (including communication, analog, timers and audio peripherals) can be functional and autonomous down to Stop mode with direct memory access, thanks to LPBAM support (low-power background autonomous mode). +Current peripheral support status of this BSP: -Some independent power supplies are supported like an analog independent supply input for ADC, DACs, OPAMPs and comparators, a 3.3 V dedicated supply input for USB and up to 14 I/Os, that can be supplied independently down to 1.08 V. A VBAT input is available for connecting a backup battery in order to preserve the RTC functionality and to backup 3232-bit registers and 2-Kbyte SRAM. +| **Onboard Peripherals** | **Support Status** | **Notes** | +|:---------|:--------:|:-------| +| USB Virtual Serial Port | Supported | | +| **On-chip Peripherals** | **Support Status** | **Notes** | +| GPIO | Supported | | +| UART | Supported | UART1 | -The devices offer eight packages from 48 to 169 pins. -#### KEY FEATURES +## Usage Instructions -- Includes ST state-of-the-art patented technology +The usage instructions are divided into the following two sections: -- Ultra-low-power with FlexPowerControl - - 1.71 V to 3.6 V power supply - - –40 °C to +85/125 °C temperature range - - Low-power background autonomous mode (LPBAM): autonomous peripherals with DMA, functional down to Stop 2 mode - - VBAT mode: supply for RTC, 32 x 32-bit backup registers and 2-Kbyte backup SRAM - - 160 nA Shutdown mode (24 wakeup pins) - - 210 nA Standby mode (24 wakeup pins) - - 440 nA Standby mode with RTC - - 1.9 μA Stop 3 mode with 16-Kbyte SRAM4.3 µA Stop 3 mode with full SRAM - - 4.0 µA Stop 2 mode with 16-Kbyte SRAM - - 8.95 µA Stop 2 mode with full SRAM - - 19.5 μA/MHz Run mode @ 3.3 V +- Quick Start Guide -- Core - - Arm® 32-bit Cortex®-M33 CPU with TrustZone®, MPU, DSP, and FPU + This section is a usage guide for newcomers to RT-Thread. By following simple steps, you can run the RT-Thread operating system on this development board and see the experimental results. -- ART Accelerator - - 8-Kbyte instruction cache allowing 0-wait-state execution from Flash and external memories: up to 160 MHz, 240 DMIPS - - 4-Kbyte data cache for external memories +- Advanced Usage -- Power management - - Embedded regulator (LDO) and SMPSstep-down converter supporting switchon-the-fly and voltage scaling + This section is prepared for developers who need to use more development board resources on the RT-Thread operating system. By using the ENV tool to configure the BSP, you can enable more onboard resources and achieve more advanced functions. -- Benchmarks - - 1.5 DMIPS/MHz (Drystone 2.1) - - 651 CoreMark® (4.07 CoreMark®/MHz) - - 535 ULPMark™-CP - - 149 ULPMark™-PP - - 58.2 ULPMark™-CM - - 133000 SecureMark™-TLS -- Memories - ​- 2-Mbyte Flash memory with ECC, 2 banks read-while-write, including 512 Kbytes with 100 kcycles - - 86-Kbyte SRAM with ECC OFF or 722-Kbyte SRAM including up to 322-Kbyte SRAM with ECC ON - - External memory interface supporting SRAM, PSRAM, NOR, NAND and FRAM memories - - 2 Octo-SPI memory interfaces +### Quick Start Guide -- Security +This BSP provides MDK5 and IAR projects for developers and supports GCC development environment. The following uses the MDK5 development environment as an example to introduce how to get the system running. - - Arm® TrustZone® and securable I/Os, memories and peripherals - - Flexible life cycle scheme with RDP and password protected debug - - Root of trust thanks to unique boot entry and secure hide protection area (HDP) - - Secure firmware installation (SFI) thanks to embedded root secure services (RSS) - - Secure firmware upgrade support with TF-M - - HASH hardware accelerator - - True random number generator, NIST SP800-90B compliant - - 96-bit unique ID - - 512-byte OTP (one-time programmable) - - Active tampers +**Please Note!!!** -- Clock management - - 4 to 50 MHz crystal oscillator - - 32 kHz crystal oscillator for RTC (LSE) - - Internal 16 MHz factory-trimmed RC (±1%) - - Internal low-power 32 kHz RC (±5%) - - 2 internal multispeed 100 kHz to 48 MHz oscillators, including one auto-trimmed by LSE (better than ±0.25% accuracy) - - Internal 48 MHz with clock recovery - - 3 PLLs for system clock, USB, audio, ADC +Before performing the compilation work, please open ENV and execute the following command (this command is used to pull the necessary HAL library and CMSIS library, otherwise compilation will fail): -- General-purpose input/outputs - - Up to 136 fast I/Os with interrupt capability most 5V-tolerant and up to 14 I/Os with independent supply down to 1.08 V +```bash +pkgs --update +``` -- Up to 17 timers and 2 watchdogs - - 19 timers/watchdogs: 2 16-bit advanced motor-control, 4 32-bit, 5 16-bit, 4 low-power 16-bit (available in Stop mode), 2 SysTick timers and 2 watchdogs - - RTC with hardware calendar and calibration +#### Hardware Connection -- Up to 22 communication peripherals - - 1 USB Type-C®/USB power delivery controller - - 1 USB OTG 2.0 full-speed controller - - 2 SAIs (serial-audio interface) - - 4 I2C FM+(1 Mbit/s), SMBus/PMBus™ - - 6 USARTs (ISO 7816, LIN, IrDA, modem) - - 3 SPIs (5x SPIs with the dual OCTOSPI) - - 1 CAN FD controller - - 2 SDMMC interfaces - - 1 multi-function digital filter (6 filters)+ 1 audio digital filter with sound-activity detection - - Parallel synchronous slave interface +Use a data cable to connect the development board to the PC and turn on the power switch. -- 16- and 4-channel DMA controllers, functional in Stop mode +#### Compilation and Download -- Graphic features - - Chrom-ART Accelerator (DMA2D) for enhanced graphic content creation - - 1 digital camera interface +Double-click the project.uvprojx file to open the MDK5 project, compile and download the program to the development board. -- Mathematical co-processor - - CORDIC for trigonometric functions acceleration - - Filter mathematical accelerator (FMAC) +> The project is configured by default to use the ST_LINK debugger to download the program. After connecting the development board via ST_LINK, click the download button to download the program to the development board. -- Up to 24 capacitive sensing channels - - Support touch key, linear and rotary touch sensors +#### Running Results -- Rich analog peripherals (independent supply) - - - 14-bit ADC 2.5-Msps with hardware oversampling - - 12-bit ADC 2.5-Msps, with hardware oversampling, autonomous in Stop 2 mode - - 2 12-bit DAC, low-power sample and hold - - 2 operational amplifiers with built-in PGA - - 2 ultra-low-power comparators - - Development support: serial-wire debug (SWD), JTAG, Embedded Trace Macrocell™ (ETM) - -- ECOPACK2 compliant packages - -## Read more - -| Documents | Description | -| :----------------------------------------------------------: | :----------------------------------------------------------: | -| [STM32_Nucleo-144_BSP_Introduction](../docs/STM32_Nucleo-144_BSP_Introduction.md) | How to run RT-Thread on STM32 Nucleo-144 boards (**Must-Read**) | -| [STM32U575ZI ST Official Website](https://www.st.com/en/evaluation-tools/nucleo-u575zi-q.html) | STM32U575ZI datasheet and other resources | +After successfully downloading the program, the system will run automatically and the LED will blink. -## Maintained By +Connect the corresponding serial port of the development board to the PC, open the corresponding serial port in the terminal tool (115200-8-1-N), and after resetting the device, you can see the output information of RT-Thread: -[liukang](https://github.com/liukangcc) +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.4 build Nov 14 2021 21:15:06 + 2006 - 2021 Copyright by rt-thread team +msh > +``` +### Advanced Usage +This BSP currently only supports GPIO and UART1 functions. New features will be added in the future. -# Part II : NUCLEO-STM32U575ZI-Q Getting Started Guide +## Notes -NUCLEO-U575ZI-Q Getting Started Guide is introduced by using the example of SPI1 driving RW007 module to realize the introduction of NUCLEO-U575ZI-Q. - -## Preparatory Work - -Before NUCLEO-U575ZI-Q driver RW007 runs, the following preparations are essential, and you will need: - -> 1.NUCLEO-U575ZI-Q -> 2.RW007 WiFi module -> 3.Mini-USB Connecting cable (connecting the development board with the computer) -> 4.ENV Compile build environment([Installation instructions](https://www.rt-thread.org/document/site/#/development-tools/env/env)) -> 5.common software(git,Keil5,STM32CubeMX,Serial debugging, etc) - -## Start on the Road - -RT-Thread contains RW007 software package, so users don't need to write their own drivers. Taking SPI mode as an example, this paper introduces how to drive RW007 module on NUCLEO-U575ZI-Q, and complete basic WiFi functions such as AP scanning and connection. - -## Hardware connection - -Thanks to the Arduino interface on Nucleo, just plug RW007 into the development board, and the hardware connection between them can be completed. - -![](figures/board1.png) - -According to the following schematic diagram, the corresponding table between IO interfaces and functions can be found as follows: - -![](figures/Schematic_diagram.png) - - |STM32 pin name | pin serial number |Arduino Interface serial number|function | - |PA5 | 5 |D13 |BOOT0/CLK | - |PA6 | 6 |D12 |MISO | - |PA7 | 7 |D11 |MOSI | - |PD14 | 62 |D10 |BOOT1/CS | - |PD15 | 63 |D9 |INT/BUSY | - |PF12 | 92 |D8 |RESET | - -## STM32 BSP Deploy(Menuconfig) -### 1.Download RT-Thread Source Code - -GitHub link:[https://github.com/RT-Thread/rt-thread](https://github.com/RT-Thread/rt-thread) -Open the 'rt-thread\bsp\stm32' directory and you will see the development board model supported by rt-thread. It is not difficult to get RT-Thread running on STM32, but bsp needs to be configured briefly before compiling the kernel components.The bsp used in this experiment was stm32u575-st-nucleo. - -### 2.The SPI Initializer is Configured Through CubeMX - -In general, the pin assignment of STM32 series can open the CubeMX project corresponding to the CubeMX_Config.ioc in the board\ CubeMX_Config directory in BSP, configure SPI1, generate code, and save and exit. - -![](figures/CubeMX.png) - -### 3. Configure the RW007 Package Through Menuconfig - -Go to the rt-thread\ bsp\ stm32\ stm32u575-st-nucleo folder, right-click to open the ENV window (provided that the ENV environment has been built under Windows), and type menuconfig to configure the system: - -#### 3.1 Turn on the SPI Device -The communication between the development board and the module depends on the SPI device. The SPI driver has been implemented in bsp and can be used as long as it is opened in the setting. Go to `On-chip Peripheral Drivers` under `On-chip Peripheral-> `, check the `Enable SPI BUS-- >` option, press enter to enter, and further select `Enable SPI1 BUS` to complete the configuration: - -![](figures/menuconfig1.png) -![](figures/menuconfig2.png) -![](figures/menuconfig3.png) -![](figures/menuconfig4.png) - -If there is no configuration for the corresponding spi in the menuconfig in the bsp, you can increase the configuration of the corresponding spi by modifying the Kconfig file. Add the configuration of SPI1 to the path of Kconfig under board/Kconfig, `menu "On-chip Peripheral Drivers" `. - - menuconfig BSP_USING_SPI - bool "Enable SPI BUS" - default n - select RT_USING_SPI - if BSP_USING_SPI - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" - default n - - config BSP_SPI1_TX_USING_DMA - bool "Enable SPI1 TX DMA" - depends on BSP_USING_SPI1 - default n - - config BSP_SPI1_RX_USING_DMA - bool "Enable SPI1 RX DMA" - depends on BSP_USING_SPI1 - select BSP_SPI1_TX_USING_DMA - default n - - endif - -#### 3.2 Configure the RW007 Package. - -RT-Thread provides supporting driver support for RW007 modules in the form of software packages. The default options of the system do not include software packages. Users need to enable them manually: return to the Menuconfig main interface through the Esc key, enter `RT-Thread online packages-- > `, `IoT-internet of things->`, `Wi-Fi-- > `, and check the `rw007: SPI WIFI rw007 driver-- >` option: -![](figures/menuconfig5.png) -RW007 package Github repository link:[RT-Thread-packages/rw007: RW007 (SPI Wi-Fi module) driver for RT-Thread](https://github.com/RT-Thread-packages/rw007) - -Then press Enter key to further set the parameters of the software package, complete the configuration of SPI bus and IO, change the bus device name `RW007 BUS NAME` to spi1, then configure SPI to control IO, and fill in each pin number according to the serial number of the following figure: -![](figures/menuconfig6.png) - -#### 3.3 Open the WiFi framework. - -The RW007 driver uses WLAN-related APIs. Click the following options to open the WiFi framework: `RT-Thread Components-- > `, `Device Drivers-- >`, `Using WiFi-- > `, and check `Using Wi-Fi framework`: - -![](figures/menuconfig7.png) - -#### 3.4 Save Menuconfig configuration. - -After completing the above three steps, the bsp configuration is complete, but the most important step is not to be omitted. Save the Menuconfig configuration: press the Esc key all the way to exit, and select Yes in the Save prompt window to confirm. - -### 4. Modify part of the project code. - -Open the project and replace the content of the `wifi_spi_device_init (void) `function in the `wifi_spi_device_init port.c` file with the following code: - - int wifi_spi_device_init(void) - { - char sn_version[32]; - - rw007_gpio_init(); - rt_hw_spi_device_attach(RW007_SPI_BUS_NAME, "wspi", RW007_CS_PIN); - rt_hw_wifi_init("wspi"); - - rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION); - rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP); - - rw007_sn_get(sn_version); - rt_kprintf("\nrw007 sn: [%s]\n", sn_version); - rw007_version_get(sn_version); - rt_kprintf("rw007 ver: [%s]\n\n", sn_version); - - return 0; - } - -### 5. Compile and Download the Project. - -Use the Build button of the toolbar to compile the project. 0Error (s) indicates that the compilation is successful. Connect the development board to the computer, and then click the Download button to download the firmware to the development board. - -## Running and Testing Module Functions. - -After downloading the program, it can automatically reset and run, open the serial port tool (recommended to use XShell and other interactive terminals), and set the parameter to 1152008-1mi N. If the system starts normally and there is no problem with the communication between the development board and the module, you will see the following initialization print message: - -![](figures/result1.png) -When rw007 sn and rw007 ver can output normally without garbled code, the RW007 driver is successful! - -Wifi networking test. - -Enter the wifi scan command in shell to search for wifi: - -![](figures/result2.png) - -Connection Target wifi Test: - -![](figures/result3.png) -The figure above shows that wifi successfully connects to the hotspot Meet. -At this point, the basic environment of `STM32U575- NUCLEO` is built and tested! - - -## References: - -1. [STM32F401 Nucleo-64 uses SPI to drive RW007](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/application-note/packages/rw007_module_using/an0034-rw007-module-using?id=rw007) -2. [STM32U575-NUCLEO Schematic Download](https://www.st.com/resource/en/schematic_pack/mb1549-u575ziq-c03_schematic.pdf) - -## Matters Needing Attention: - -1. It is best to use a newer version of MDK, and this experiment was carried out under the MDK5.36 version. -2. Please choose the latest version of the RW007 software package, otherwise the version will not be compatible and the project will report an error. If you have not selected the latest version of the RW007 package, download the RW007 package in the link below and replace the file in `bsp\ stm32\ stm32u575-st-nucleo\ packages\ rw007- xxx`! (however, the above step of modifying part of the project code is also necessary. If the content of the `wifi_spi_device_init (void) `function in the project `wifi_spi_device_init port.c` file is the same as that given, it can be ignored! ). -RW007 package Github repository link: [RT-Thread-packages/rw007: RW007 (SPI Wi-Fi module) driver for RT-Thread](https://github.com/RT-Thread-packages/rw007) -3. At present, in this experimental test, it is found that RW007 will time out, and a suitable solution has not been found, but it does not affect the normal use of RW007 module. +- Debug serial port is UART1, pin mapping description: + ```c + PA9 ------> USART1_TX + PA10 ------> USART1_RX + ``` +- It is recommended to use a newer version of MDK. This experiment was conducted using MDK5.36. \ No newline at end of file diff --git a/bsp/stm32/stm32u585-iot02a/README_zh.md b/bsp/stm32/stm32u585-iot02a/README_zh.md index 88bf688801..b2896a8e7b 100644 --- a/bsp/stm32/stm32u585-iot02a/README_zh.md +++ b/bsp/stm32/stm32u585-iot02a/README_zh.md @@ -1,4 +1,4 @@ -# 第一部分:NUCLEO-U575ZI-Q 开发板 BSP 说明 +# 第一部分:STM32 B-U585I-IOT02A 开发板 BSP 说明 [English](README.md) | **中文** -- Gitee From cbc759d6a51dd2cdce5188068a9c1a5bf1ff23d8 Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Sat, 7 Feb 2026 11:45:35 +0800 Subject: [PATCH 41/45] refactor(ulog): Unify ulog warning output with ulog_warn_once --- components/utilities/ulog/ulog.c | 70 ++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 16 deletions(-) diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index 697aa248bc..e10f11a390 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -421,17 +421,47 @@ rt_weak rt_size_t ulog_tail_formater(char *log_buf, rt_size_t log_len, rt_bool_t return log_len; } -static void ulog_no_enough_buffer_printf(void) +/** + * @brief Print a warning message once (best-effort). + * + * @param[in,out] printed Pointer to a per-call-site flag used to suppress + * repeated prints. + * @param[in] msg Warning message to print. + * + * @details This helper provides a lightweight, best-effort "print-once" + * mechanism for diagnostic warnings. + * + * ulog output may be executed in different contexts (thread or ISR) + * and on single-core or SMP targets. To avoid unsafe blocking, + * excessive latency, or re-entrancy risks in these contexts, this + * function intentionally avoids locks, spinlocks, and atomic CAS. + * + * Under extreme multi-thread or SMP contention, it is therefore + * possible that the warning is printed more than once. This behavior + * is acceptable because the message is diagnostic-only and the + * critical logging path must remain lightweight. + */ +static void ulog_warn_once(rt_bool_t *printed, const char *msg) { - static rt_bool_t already_output = RT_FALSE; - if (already_output == RT_FALSE) + if (*printed == RT_FALSE) { - rt_kprintf("Warning: There is not enough buffer to output the log," - " please increase the ULOG_LINE_BUF_SIZE option.\n"); - already_output = RT_TRUE; + /* Set first to reduce re-entrancy and recursive logging. */ + *printed = RT_TRUE; + rt_kprintf("%s", msg); } } +/** + * @brief Print a "line buffer too small" warning once (best-effort). + */ +static void ulog_no_enough_buffer_printf(void) +{ + static rt_bool_t warned_line_buf = RT_FALSE; + ulog_warn_once(&warned_line_buf, + "Warning: There is not enough buffer to output the log," + " please increase the ULOG_LINE_BUF_SIZE option.\n"); +} + rt_weak rt_size_t ulog_formater(char *log_buf, rt_uint32_t level, const char *tag, rt_bool_t newline, const char *format, va_list args) { @@ -603,21 +633,29 @@ static void do_output(rt_uint32_t level, const char *tag, rt_bool_t is_raw, cons } else { - static rt_bool_t already_output = RT_FALSE; - if (already_output == RT_FALSE) - { - rt_kprintf("Warning: There is no enough buffer for saving async log," - " please increase the ULOG_ASYNC_OUTPUT_BUF_SIZE option.\n"); - already_output = RT_TRUE; - } + static rt_bool_t warned_async_log_buf = RT_FALSE; + ulog_warn_once(&warned_async_log_buf, + "Warning: There is no enough buffer for saving async log," + " please increase the ULOG_ASYNC_OUTPUT_BUF_SIZE option.\n"); } } else if (ulog.async_rb) { /* log_buf_size contain the tail \0, which will lead discard follow char, so only put log_buf_size -1 */ - rt_ringbuffer_put(ulog.async_rb, (const rt_uint8_t *)log_buf, (rt_uint16_t)log_buf_size - 1); - /* send a notice */ - rt_sem_release(&ulog.async_notice); + rt_size_t req_len = (rt_size_t)log_buf_size - 1; + rt_size_t put_len = rt_ringbuffer_put(ulog.async_rb, (const rt_uint8_t *)log_buf, (rt_uint32_t)req_len); + /* send a notice after writing data */ + if (put_len > 0) + { + rt_sem_release(&ulog.async_notice); + } + if (put_len < req_len) + { + static rt_bool_t warned_async_raw_partial = RT_FALSE; + ulog_warn_once(&warned_async_raw_partial, + "Warning: There is no enough buffer for saving async raw log," + " please increase the ULOG_ASYNC_OUTPUT_BUF_SIZE option.\n"); + } } return; -- Gitee From e5e29350b8218f19c7dacafead7a62ddce3b5741 Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Thu, 12 Feb 2026 09:01:15 +0800 Subject: [PATCH 42/45] fix(ulog): Avoid async ulog empty wakeups and missed notifications --- components/utilities/ulog/ulog.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index e10f11a390..4918a68339 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -635,7 +635,7 @@ static void do_output(rt_uint32_t level, const char *tag, rt_bool_t is_raw, cons { static rt_bool_t warned_async_log_buf = RT_FALSE; ulog_warn_once(&warned_async_log_buf, - "Warning: There is no enough buffer for saving async log," + "Warning: There is not enough buffer for saving async log," " please increase the ULOG_ASYNC_OUTPUT_BUF_SIZE option.\n"); } } @@ -653,7 +653,7 @@ static void do_output(rt_uint32_t level, const char *tag, rt_bool_t is_raw, cons { static rt_bool_t warned_async_raw_partial = RT_FALSE; ulog_warn_once(&warned_async_raw_partial, - "Warning: There is no enough buffer for saving async raw log," + "Warning: There is not enough buffer for saving async raw log," " please increase the ULOG_ASYNC_OUTPUT_BUF_SIZE option.\n"); } } @@ -1479,7 +1479,6 @@ void ulog_async_output_enabled(rt_bool_t enabled) */ rt_err_t ulog_async_waiting_log(rt_int32_t time) { - rt_sem_control(&ulog.async_notice, RT_IPC_CMD_RESET, RT_NULL); return rt_sem_take(&ulog.async_notice, time); } @@ -1569,6 +1568,12 @@ int ulog_init(void) return -RT_ENOMEM; } rt_sem_init(&ulog.async_notice, "ulog", 0, RT_IPC_FLAG_FIFO); + /* + * Use binary-semaphore semantics for async_notice. + * This relies on ulog_async_output() draining all pending logs in one wakeup, + * so coalescing multiple notices will not lose log data. + */ + rt_sem_control(&ulog.async_notice, RT_IPC_CMD_SET_VLIMIT, (void *)1); #endif /* ULOG_USING_ASYNC_OUTPUT */ #ifdef ULOG_USING_FILTER -- Gitee From b0c55f5bf57bd713108664fc789845dfa2a7f635 Mon Sep 17 00:00:00 2001 From: CXSforHPU <19511928573@163.com> Date: Thu, 12 Feb 2026 22:54:40 +0800 Subject: [PATCH 43/45] [gd32][i2c]Add an example for measuring the onboard peripherals of the I2C board --- .../.ci/attachconfig/ci.attachconfig.yml | 37 +++++++- bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig | 23 +++++ .../risc-v/gd32vw553h-eval/board/SConscript | 5 ++ .../board/linker_scripts/link.lds | 6 ++ .../gd32vw553h-eval/board/port/SConscript | 28 ++++++ .../board/port/at24c02/at24c02.c | 35 ++++++++ .../board/port/at24c02/at24c02.h | 14 +++ .../board/port/at24c02/test_at24c02.c | 89 +++++++++++++++++++ 8 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 bsp/gd32/risc-v/gd32vw553h-eval/board/port/SConscript create mode 100644 bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/at24c02.c create mode 100644 bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/at24c02.h create mode 100644 bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/test_at24c02.c diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml b/bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml index e8bbc5bc5f..91f67c427b 100644 --- a/bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/gd32/risc-v/gd32vw553h-eval/.ci/attachconfig/ci.attachconfig.yml @@ -17,4 +17,39 @@ devices.i2c: - CONFIG_BSP_HW_I2C0_CLK=100 - CONFIG_BSP_USING_HW_I2C1=y - CONFIG_BSP_HW_I2C1_PIN_PB12_PB13=y - - CONFIG_BSP_HW_I2C1_CLK=100 \ No newline at end of file + - CONFIG_BSP_HW_I2C1_CLK=100 + +# ------ peripheral CI ------ +peripheral.at24c02: + kconfig: + - CONFIG_RT_CONSOLEBUF_SIZE=256 + - CONFIG_RT_NAME_MAX=32 + - CONFIG_RT_USING_ULOG=y + - CONFIG_ULOG_OUTPUT_LVL_D=y + - CONFIG_ULOG_OUTPUT_LVL=7 + - CONFIG_ULOG_USING_ISR_LOG=y + - CONFIG_ULOG_ASSERT_ENABLE=y + - CONFIG_ULOG_LINE_BUF_SIZE=128 + - CONFIG_ULOG_USING_COLOR=y + - CONFIG_ULOG_OUTPUT_TIME=y + - CONFIG_ULOG_OUTPUT_LEVEL=y + - CONFIG_ULOG_OUTPUT_TAG=y + - CONFIG_ULOG_BACKEND_USING_CONSOLE=y + - CONFIG_RT_USING_UTEST=y + - CONFIG_UTEST_THR_STACK_SIZE=4096 + - CONFIG_UTEST_THR_PRIORITY=20 + - CONFIG_RT_UTEST_MAX_OPTIONS=64 + - CONFIG_PKG_USING_AT24CXX=y + - CONFIG_PKG_AT24CXX_PATH="/packages/peripherals/at24cxx" + - CONFIG_PKG_AT24CXX_EE_TYPE_AT24C02=y + - CONFIG_PKG_AT24CXX_EE_TYPE=1 + - CONFIG_PKG_USING_AT24CXX_LATEST_VERSION=y + - CONFIG_PKG_AT24CXX_VER="latest" + - CONFIG_BSP_USING_AT24C02=y + - CONFIG_BSP_USING_AT24C02_UTEST=y + - CONFIG_RT_USING_I2C=y + - CONFIG_RT_USING_I2C_BITOPS=y + - CONFIG_BSP_USING_HW_I2C=y + - CONFIG_BSP_USING_HW_I2C0=y + - CONFIG_BSP_HW_I2C0_PIN_PA2_PA3=y + - CONFIG_BSP_HW_I2C0_CLK=100 \ No newline at end of file diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig b/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig index e0668401c9..d3a3bf50b5 100644 --- a/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig +++ b/bsp/gd32/risc-v/gd32vw553h-eval/board/Kconfig @@ -143,6 +143,29 @@ endmenu menu "Board extended module Drivers" + menuconfig BSP_USING_AT24C02 + bool "Enable AT24C02 I2C0( SCL[PA2 : 2] SDA[PA3 : 3] )" + default n + select BSP_USING_HW_I2C + select BSP_USING_HW_I2C0 + select PKG_USING_AT24CXX + select PKG_AT24CXX_EE_TYPE_AT24C02 + + if BSP_USING_AT24C02 + + config BSP_USING_AT24C02_UTEST + bool "Enable the utest of AT24C02" + default n + select RT_USING_UTEST + select RT_USING_ULOG + select ULOG_USING_ISR_LOG + + config BSP_USING_AT24C02_INIT + bool "Init the model and check it" + default y + + endif + endmenu endmenu diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/board/SConscript b/bsp/gd32/risc-v/gd32vw553h-eval/board/SConscript index 71fadebe66..fbc2bb9336 100644 --- a/bsp/gd32/risc-v/gd32vw553h-eval/board/SConscript +++ b/bsp/gd32/risc-v/gd32vw553h-eval/board/SConscript @@ -24,4 +24,9 @@ if rtconfig.PLATFORM in ['gcc']: CPPDEFINES = ['GD32VW553H_EVAL'] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + Return('group') diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/board/linker_scripts/link.lds b/bsp/gd32/risc-v/gd32vw553h-eval/board/linker_scripts/link.lds index 82516919c2..5667f71c97 100644 --- a/bsp/gd32/risc-v/gd32vw553h-eval/board/linker_scripts/link.lds +++ b/bsp/gd32/risc-v/gd32vw553h-eval/board/linker_scripts/link.lds @@ -62,6 +62,12 @@ SECTIONS __rt_init_end = .; . = ALIGN(4); + /* section information for utest */ + . = ALIGN(4); + __rt_utest_tc_tab_start = .; + KEEP(*(UtestTcTab)) + __rt_utest_tc_tab_end = .; + /* section information for modules */ . = ALIGN(4); __rtmsymtab_start = .; diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/board/port/SConscript b/bsp/gd32/risc-v/gd32vw553h-eval/board/port/SConscript new file mode 100644 index 0000000000..ecdbf2c6b3 --- /dev/null +++ b/bsp/gd32/risc-v/gd32vw553h-eval/board/port/SConscript @@ -0,0 +1,28 @@ +import os +from building import * + +objs = [] +cwd = GetCurrentDir() + +# add general drivers +src = [] +path = [cwd] + +if GetDepend(['BSP_USING_AT24C02']): + path += [cwd + "/at24c02"] + + if GetDepend(['BSP_USING_AT24C02_UTEST']): + src += ["./at24c02/test_at24c02.c"] + + if GetDepend(['BSP_USING_AT24C02_INIT']): + src += ['./at24c02/at24c02.c'] + +CPPDEFINES = ['GD32VW553H_EVAL'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') \ No newline at end of file diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/at24c02.c b/bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/at24c02.c new file mode 100644 index 0000000000..49f5d65ef9 --- /dev/null +++ b/bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/at24c02.c @@ -0,0 +1,35 @@ +#include "rtconfig.h" + +#ifdef BSP_USING_AT24C02_INIT + +#include "at24c02.h" + +at24cxx_device_t gd32_at24c02 = RT_NULL; + +static int init_gd32_at24c02(void) +{ + rt_err_t result = RT_EOK; + + gd32_at24c02 = at24cxx_init(AT24C02_I2C_NAME, AT24C02_ADDR_INPUT); + + if (gd32_at24c02 == RT_NULL) + { + rt_kprintf("AT24C02 initialization failed\n"); + return -RT_ERROR; + } + + result = at24cxx_check(gd32_at24c02); + + if (result == -RT_ERROR) + { + rt_kprintf("AT24C02 check failed\n"); + return -RT_ERROR; + } + + return RT_EOK; +} + + +INIT_DEVICE_EXPORT(init_gd32_at24c02); + +#endif \ No newline at end of file diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/at24c02.h b/bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/at24c02.h new file mode 100644 index 0000000000..49d173e8b7 --- /dev/null +++ b/bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/at24c02.h @@ -0,0 +1,14 @@ +#ifndef AT24C02_H +#define AT24C02_H + +#include +#include "at24cxx.h" + +#define AT24C02_I2C_NAME "i2c0" +#define AT24C02_ADDR_INPUT 0x0 + +#ifdef BSP_USING_AT24C02_INIT +extern at24cxx_device_t gd32_at24c02; +#endif // BSP_USING_AT24C02_INIT + +#endif // AT24C02_H \ No newline at end of file diff --git a/bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/test_at24c02.c b/bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/test_at24c02.c new file mode 100644 index 0000000000..d0dc3386b8 --- /dev/null +++ b/bsp/gd32/risc-v/gd32vw553h-eval/board/port/at24c02/test_at24c02.c @@ -0,0 +1,89 @@ +#include "rtconfig.h" + +#ifdef BSP_USING_AT24C02 + +#include "utest.h" +#include "at24c02.h" + +#define TEST_DATA "WELCOME TO RTT" + +static at24cxx_device_t dev = RT_NULL; + +static rt_err_t test_at24c02_init(void) +{ + rt_err_t result = RT_EOK; + uint8_t AddrInput = 0x0; + + dev = at24cxx_init(AT24C02_I2C_NAME, AddrInput); + if (dev == RT_NULL) + { + LOG_E("AT24C02 initialization failed\n"); + result = -RT_ERROR; + } + + return result; +} + +static void test_at24c02_example(void) +{ + uint8_t write_buffer[] = TEST_DATA; + int data_size = sizeof(write_buffer); + rt_err_t result = RT_EOK; + + uint8_t read_buffer[50] = {0}; + + /* 写入数据 */ + result = at24cxx_write(dev, 0, write_buffer, data_size); + + if (result != RT_EOK) + { + LOG_E("Failed to write data to AT24C02\n"); + uassert_true(RT_FALSE); + return; + } + + LOG_I("Successfully wrote to AT24C02: %s\n", write_buffer); + + /* 读取数据 */ + result = at24cxx_read(dev, 0, read_buffer, data_size); + + if (result != RT_EOK) + { + LOG_E("Failed to read data from AT24C02\n"); + uassert_true(RT_FALSE); + return; + } + + LOG_I("Successfully read from AT24C02: %s\n", read_buffer); + + uassert_str_equal(write_buffer, read_buffer); + + /* 检查数据 */ + result = at24cxx_check(dev); + + uassert_true(result == RT_EOK); + + return; +} + +static rt_err_t test_at24c02_deinit(void) +{ + + if (dev != RT_NULL) + { + at24cxx_deinit(dev); + dev = RT_NULL; + return RT_EOK; + } + + return -RT_ERROR; +} + +static void test_case(void) +{ + UTEST_UNIT_RUN(test_at24c02_example); +} + +UTEST_TC_EXPORT(test_case, "bsp.gd32.port.at24c02" , test_at24c02_init, test_at24c02_deinit, 100); + +#endif \ No newline at end of file -- Gitee From 85b656b14dcfe8a3ab27c819e168dde082ab39ef Mon Sep 17 00:00:00 2001 From: theqengineer Date: Fri, 13 Feb 2026 15:04:27 +0800 Subject: [PATCH 44/45] chore: fix typo in components and libcpu --- components/drivers/i2c/dev_i2c_bit_ops.c | 2 +- components/drivers/spi/dev_spi_msd.c | 2 +- components/finsh/msh.c | 2 +- components/lwp/lwp_args.c | 10 +++++----- include/rtdef.h | 4 ++-- libcpu/arm/AT91SAM7S/interrupt.c | 2 +- libcpu/arm/AT91SAM7X/interrupt.c | 2 +- libcpu/arm/AT91SAM7X/trap.c | 2 +- libcpu/arm/cortex-r4/interrupt.c | 2 +- libcpu/arm/lpc214x/cpuport.c | 2 +- libcpu/arm/lpc24xx/interrupt.c | 2 +- libcpu/arm/s3c24x0/interrupt.c | 2 +- libcpu/arm/s3c44b0/interrupt.c | 2 +- libcpu/arm/sep4020/interrupt.c | 2 +- libcpu/ia32/interrupt.c | 2 +- libcpu/mips/gs232/interrupt.c | 2 +- libcpu/ppc/ppc405/interrupt.c | 2 +- libcpu/risc-v/t-head/c906/interrupt.c | 2 +- libcpu/risc-v/t-head/c908/interrupt.c | 2 +- libcpu/sim/posix/cpu_port.c | 2 +- libcpu/unicore32/sep6200/interrupt.c | 2 +- libcpu/xilinx/microblaze/trap.c | 2 +- tools/building.py | 4 ++-- 23 files changed, 29 insertions(+), 29 deletions(-) diff --git a/components/drivers/i2c/dev_i2c_bit_ops.c b/components/drivers/i2c/dev_i2c_bit_ops.c index 005cf9035e..0b055f1c87 100644 --- a/components/drivers/i2c/dev_i2c_bit_ops.c +++ b/components/drivers/i2c/dev_i2c_bit_ops.c @@ -265,7 +265,7 @@ static rt_ssize_t i2c_recv_bytes(struct rt_i2c_bus_device *bus, ptr ++; count --; - LOG_D("recieve bytes: 0x%02x, %s", + LOG_D("receive bytes: 0x%02x, %s", val, (flags & RT_I2C_NO_READ_ACK) ? "(No ACK/NACK)" : (count ? "ACK" : "NACK")); diff --git a/components/drivers/spi/dev_spi_msd.c b/components/drivers/spi/dev_spi_msd.c index 8d81e348af..441e1ea5c5 100644 --- a/components/drivers/spi/dev_spi_msd.c +++ b/components/drivers/spi/dev_spi_msd.c @@ -199,7 +199,7 @@ static rt_err_t _send_cmd( return -RT_ERROR;//fail } - //recieve other byte + //receive other byte if (type == response_r1) { return RT_EOK; diff --git a/components/finsh/msh.c b/components/finsh/msh.c index 7cf93855af..56ef8a1cb0 100644 --- a/components/finsh/msh.c +++ b/components/finsh/msh.c @@ -451,7 +451,7 @@ static char *_msh_exec_search_env(const char *pg_name) or hitting its end */ while (1) { - /* env paths are seperated by ':' */ + /* env paths are separated by ':' */ if (*pos == ':' || *pos == '\0') { tmp_ch = *pos; diff --git a/components/lwp/lwp_args.c b/components/lwp/lwp_args.c index 31ea659da5..f1c723b120 100644 --- a/components/lwp/lwp_args.c +++ b/components/lwp/lwp_args.c @@ -671,21 +671,21 @@ static char *_find_word(char *cp) } /** - * @brief Seperate words in a string and get the next word + * @brief Separate words in a string and get the next word * * @param[in] cp Pointer to the string to process * * @return char* Pointer to the next word in the string * - * @note Finds the next whitespace character, seperates words, and returns a + * @note Finds the next whitespace character, separates words, and returns a * pointer to the next word. */ -static char *_seperate_and_get_nextword(char *cp) +static char *_separate_and_get_nextword(char *cp) { /* find next whitespace */ for (; *cp && (*cp != ' ') && (*cp != '\t'); cp++) ; - /* seperate words */ + /* separate words */ while ((*cp == ' ') || (*cp == '\t')) { *cp++ = '\0'; @@ -762,7 +762,7 @@ rt_err_t lwp_args_load_script(struct lwp_args_info *ai, const char *filename) do { - nextword = _seperate_and_get_nextword(cp); + nextword = _separate_and_get_nextword(cp); args_append(&ow_ai, cp, strlen(cp), LWP_ARGS_TYPE_KARG); cp = nextword; } diff --git a/include/rtdef.h b/include/rtdef.h index f3e10fe51f..0dc919e77e 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -57,8 +57,8 @@ * 2023-12-01 Shell Support of dynamic device * 2023-12-18 xqyjlj add rt_always_inline * 2023-12-22 Shell Support hook list - * 2024-01-18 Shell Seperate basical types to a rttypes.h - * Seperate the compiler portings to rtcompiler.h + * 2024-01-18 Shell Separate basical types to a rttypes.h + * Separate the compiler portings to rtcompiler.h * 2024-03-30 Meco Man update version number to v5.2.0 * 2025-11-10 Rbb666 update version number to v5.3.0 */ diff --git a/libcpu/arm/AT91SAM7S/interrupt.c b/libcpu/arm/AT91SAM7S/interrupt.c index 8468d36413..a34fa50994 100644 --- a/libcpu/arm/AT91SAM7S/interrupt.c +++ b/libcpu/arm/AT91SAM7S/interrupt.c @@ -25,7 +25,7 @@ rt_uint32_t rt_thread_switch_interrupt_flag; void rt_hw_interrupt_handler(int vector) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } /** diff --git a/libcpu/arm/AT91SAM7X/interrupt.c b/libcpu/arm/AT91SAM7X/interrupt.c index 1d473654e2..143d8b661b 100644 --- a/libcpu/arm/AT91SAM7X/interrupt.c +++ b/libcpu/arm/AT91SAM7X/interrupt.c @@ -30,7 +30,7 @@ rt_uint32_t rt_thread_switch_interrupt_flag; static void rt_hw_interrupt_handler(int vector, void *param) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } /** diff --git a/libcpu/arm/AT91SAM7X/trap.c b/libcpu/arm/AT91SAM7X/trap.c index b2dfdb4949..c8070fac96 100644 --- a/libcpu/arm/AT91SAM7X/trap.c +++ b/libcpu/arm/AT91SAM7X/trap.c @@ -41,7 +41,7 @@ void rt_hw_trap_fiq(void) extern struct rt_thread* rt_current_thread; void rt_hw_trap_abort(void) { - rt_kprintf("Abort occured!!! Thread [%s] suspended.\n",rt_current_thread->parent.name); + rt_kprintf("Abort occurred!!! Thread [%s] suspended.\n",rt_current_thread->parent.name); rt_thread_suspend(rt_current_thread); rt_schedule(); diff --git a/libcpu/arm/cortex-r4/interrupt.c b/libcpu/arm/cortex-r4/interrupt.c index 345ca30e43..cd74e5244e 100644 --- a/libcpu/arm/cortex-r4/interrupt.c +++ b/libcpu/arm/cortex-r4/interrupt.c @@ -36,7 +36,7 @@ rt_uint32_t rt_thread_switch_interrupt_flag; static void rt_hw_int_not_handle(int vector, void *param) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } #define vimRAM (0xFFF82000U) diff --git a/libcpu/arm/lpc214x/cpuport.c b/libcpu/arm/lpc214x/cpuport.c index 927ae93b4e..cbaa761b63 100644 --- a/libcpu/arm/lpc214x/cpuport.c +++ b/libcpu/arm/lpc214x/cpuport.c @@ -74,7 +74,7 @@ rt_uint32_t rt_thread_switch_interrupt_flag; void rt_hw_interrupt_handler(int vector, void *param) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } /** diff --git a/libcpu/arm/lpc24xx/interrupt.c b/libcpu/arm/lpc24xx/interrupt.c index ec1b29e09e..a8b8199ee6 100644 --- a/libcpu/arm/lpc24xx/interrupt.c +++ b/libcpu/arm/lpc24xx/interrupt.c @@ -30,7 +30,7 @@ rt_uint32_t rt_thread_switch_interrupt_flag; /*@{*/ void rt_hw_interrupt_handler(int vector, void *param) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } void rt_hw_interrupt_init(void) diff --git a/libcpu/arm/s3c24x0/interrupt.c b/libcpu/arm/s3c24x0/interrupt.c index 79ef42df1a..530b984809 100644 --- a/libcpu/arm/s3c24x0/interrupt.c +++ b/libcpu/arm/s3c24x0/interrupt.c @@ -29,7 +29,7 @@ rt_uint32_t rt_thread_switch_interrupt_flag; static void rt_hw_interrupt_handle(int vector, void *param) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } /** diff --git a/libcpu/arm/s3c44b0/interrupt.c b/libcpu/arm/s3c44b0/interrupt.c index b69e675741..44cef7f9c0 100644 --- a/libcpu/arm/s3c44b0/interrupt.c +++ b/libcpu/arm/s3c44b0/interrupt.c @@ -34,7 +34,7 @@ unsigned char interrupt_bank3[256]; void rt_hw_interrupt_handle(int vector) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } /** diff --git a/libcpu/arm/sep4020/interrupt.c b/libcpu/arm/sep4020/interrupt.c index 641472d19f..b32bccf4ee 100644 --- a/libcpu/arm/sep4020/interrupt.c +++ b/libcpu/arm/sep4020/interrupt.c @@ -29,7 +29,7 @@ rt_uint32_t rt_thread_switch_interrupt_flag; static void rt_hw_interrupt_handle(int vector, void *param) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } /** diff --git a/libcpu/ia32/interrupt.c b/libcpu/ia32/interrupt.c index 473bf7714a..b73c146c29 100644 --- a/libcpu/ia32/interrupt.c +++ b/libcpu/ia32/interrupt.c @@ -56,7 +56,7 @@ void rt_hw_pic_init() void rt_hw_interrupt_handle(int vector, void* param) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } void rt_hw_isr(int vector) diff --git a/libcpu/mips/gs232/interrupt.c b/libcpu/mips/gs232/interrupt.c index fb80a8c1ec..1fe9b8a627 100644 --- a/libcpu/mips/gs232/interrupt.c +++ b/libcpu/mips/gs232/interrupt.c @@ -35,7 +35,7 @@ static struct gs232_intc_regs volatile *gs232_hw0_icregs static void rt_hw_interrupt_handler(int vector, void *param) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } /** diff --git a/libcpu/ppc/ppc405/interrupt.c b/libcpu/ppc/ppc405/interrupt.c index 571bd6ff06..b2aa5f5603 100644 --- a/libcpu/ppc/ppc405/interrupt.c +++ b/libcpu/ppc/ppc405/interrupt.c @@ -24,7 +24,7 @@ rt_uint32_t rt_thread_switch_interrput_flag; rt_isr_handler_t rt_hw_interrupt_handler(rt_uint32_t vector, void* param) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); return RT_NULL; } diff --git a/libcpu/risc-v/t-head/c906/interrupt.c b/libcpu/risc-v/t-head/c906/interrupt.c index 2f7a86e680..339dde808f 100644 --- a/libcpu/risc-v/t-head/c906/interrupt.c +++ b/libcpu/risc-v/t-head/c906/interrupt.c @@ -23,7 +23,7 @@ struct rt_irq_desc isr_table[INTERRUPTS_MAX]; static void rt_hw_interrupt_handler(int vector, void *param) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } /** diff --git a/libcpu/risc-v/t-head/c908/interrupt.c b/libcpu/risc-v/t-head/c908/interrupt.c index 2f7a86e680..339dde808f 100644 --- a/libcpu/risc-v/t-head/c908/interrupt.c +++ b/libcpu/risc-v/t-head/c908/interrupt.c @@ -23,7 +23,7 @@ struct rt_irq_desc isr_table[INTERRUPTS_MAX]; static void rt_hw_interrupt_handler(int vector, void *param) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } /** diff --git a/libcpu/sim/posix/cpu_port.c b/libcpu/sim/posix/cpu_port.c index 8b578977e3..0e432482f0 100644 --- a/libcpu/sim/posix/cpu_port.c +++ b/libcpu/sim/posix/cpu_port.c @@ -54,7 +54,7 @@ rt_ubase_t rt_thread_switch_interrupt_flag; /* interrupt event mutex */ static pthread_mutex_t *ptr_int_mutex; -static pthread_cond_t cond_int_hit; /* interrupt occured! */ +static pthread_cond_t cond_int_hit; /* interrupt occurred! */ static volatile unsigned int cpu_pending_interrupts; static int (* cpu_isr_table[MAX_INTERRUPT_NUM])(void) = {0}; diff --git a/libcpu/unicore32/sep6200/interrupt.c b/libcpu/unicore32/sep6200/interrupt.c index ca0be86ad7..44f8b193ce 100644 --- a/libcpu/unicore32/sep6200/interrupt.c +++ b/libcpu/unicore32/sep6200/interrupt.c @@ -118,7 +118,7 @@ rt_inline void sep6200_irq_mask(rt_uint32_t irq) } rt_isr_handler_t rt_hw_interrupt_handle(rt_uint32_t vector) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); return RT_NULL; } diff --git a/libcpu/xilinx/microblaze/trap.c b/libcpu/xilinx/microblaze/trap.c index 86b99a06a7..1c2ac301ae 100755 --- a/libcpu/xilinx/microblaze/trap.c +++ b/libcpu/xilinx/microblaze/trap.c @@ -33,7 +33,7 @@ rt_uint32_t rt_thread_switch_interrupt_flag; void rt_hw_interrupt_handler(int vector) { - rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); + rt_kprintf("Unhandled interrupt %d occurred!!!\n", vector); } /** diff --git a/tools/building.py b/tools/building.py index 26e13b3f84..b0b4c144c6 100644 --- a/tools/building.py +++ b/tools/building.py @@ -318,7 +318,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ if env['LINK'].find('gcc') != -1: env['LINK'] = env['LINK'].replace('gcc', 'g++') - # we need to seperate the variant_dir for BSPs and the kernels. BSPs could + # we need to separate the variant_dir for BSPs and the kernels. BSPs could # have their own components etc. If they point to the same folder, SCons # would find the wrong source code to compile. bsp_vdir = 'build' @@ -792,7 +792,7 @@ def DoBuilding(target, objects): for group in Projects: local_group(group, objects_in_group) - # sort seperately, because the data type of + # sort separately, because the data type of # the members of the two lists are different objects_in_group = sorted(objects_in_group) objects = sorted(objects) -- Gitee From 0fe17203874973b2565e39d50da3a74639d55bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E9=B8=BF=E8=B6=85?= <13010364+shi-hongchao@user.noreply.gitee.com> Date: Tue, 17 Feb 2026 18:03:19 +0800 Subject: [PATCH 45/45] =?UTF-8?q?fix(bsp/gd32):=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=86=B2=E7=AA=81=E5=B8=A6=E6=9D=A5=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/gd32/arm/gd32405rg/.config | 50 ++- .../gd32405rg/RTE/_rt-thread/RTE_Components.h | 2 +- bsp/gd32/arm/gd32405rg/applications/main.c | 66 +++ bsp/gd32/arm/gd32405rg/board/Kconfig | 409 ++++++++--------- bsp/gd32/arm/gd32405rg/board/SConscript | 1 + bsp/gd32/arm/gd32405rg/board/board_ms5611.c | 31 ++ bsp/gd32/arm/gd32405rg/project.uvoptx | 396 ++++++++++------ bsp/gd32/arm/gd32405rg/project.uvprojx | 423 ++++++++++++++---- bsp/gd32/arm/gd32405rg/rtconfig.h | 18 +- .../arm/libraries/gd32_drivers/drv_timer.c | 54 --- 10 files changed, 930 insertions(+), 520 deletions(-) create mode 100644 bsp/gd32/arm/gd32405rg/board/board_ms5611.c diff --git a/bsp/gd32/arm/gd32405rg/.config b/bsp/gd32/arm/gd32405rg/.config index 8dcdda7301..b725106e65 100644 --- a/bsp/gd32/arm/gd32405rg/.config +++ b/bsp/gd32/arm/gd32405rg/.config @@ -178,7 +178,8 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" -CONFIG_RT_VER_NUM=0x50201 +CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y +CONFIG_RT_VER_NUM=0x50300 # CONFIG_RT_USING_STDC_ATOMIC is not set CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 # end of RT-Thread Kernel @@ -241,7 +242,7 @@ CONFIG_RT_SERIAL_USING_DMA=y CONFIG_RT_SERIAL_RB_BUFSZ=64 # CONFIG_RT_USING_SERIAL_BYPASS is not set # CONFIG_RT_USING_CAN is not set -# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_CLOCK_TIME=y CONFIG_RT_USING_I2C=y # CONFIG_RT_I2C_DEBUG is not set CONFIG_RT_USING_I2C_BITOPS=y @@ -254,7 +255,7 @@ CONFIG_RT_USING_I2C_BITOPS=y # 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=y +# CONFIG_RT_USING_PWM is not set # CONFIG_RT_USING_PULSE_ENCODER is not set # CONFIG_RT_USING_INPUT_CAPTURE is not set # CONFIG_RT_USING_MTD_NOR is not set @@ -265,7 +266,9 @@ CONFIG_RT_USING_PWM=y # CONFIG_RT_USING_SPI is not set # CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set -# CONFIG_RT_USING_SENSOR is not set +CONFIG_RT_USING_SENSOR=y +# CONFIG_RT_USING_SENSOR_V2 is not set +CONFIG_RT_USING_SENSOR_CMD=y # CONFIG_RT_USING_TOUCH is not set # CONFIG_RT_USING_LCD is not set # CONFIG_RT_USING_HWCRYPTO is not set @@ -273,8 +276,6 @@ CONFIG_RT_USING_PWM=y # CONFIG_RT_USING_BLK is not set # CONFIG_RT_USING_VIRTIO is not set CONFIG_RT_USING_PIN=y -# CONFIG_RT_USING_KTIME is not set -CONFIG_RT_USING_HWTIMER=y # CONFIG_RT_USING_CHERRYUSB is not set # end of Device Drivers @@ -351,8 +352,6 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # CONFIG_RT_USING_RT_LINK is not set # end of Utilities -# CONFIG_RT_USING_VBUS is not set - # # Using USB legacy version # @@ -361,6 +360,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 # end of Using USB legacy version # CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RUST is not set # end of RT-Thread Components # @@ -952,7 +952,14 @@ CONFIG_PKG_GD32_ARM_SERIES_DRIVER_VER="latest" # CONFIG_PKG_USING_MLX90394 is not set # CONFIG_PKG_USING_MLX90396 is not set # CONFIG_PKG_USING_MLX90397 is not set -# CONFIG_PKG_USING_MS5611 is not set +CONFIG_PKG_USING_MS5611=y +CONFIG_PKG_MS5611_PATH="/packages/peripherals/sensors/ms5611" +CONFIG_PKG_MS5611_USING_SENSOR_V1=y +# CONFIG_PKG_MS5611_USING_TEMP is not set +CONFIG_PKG_MS5611_USING_BARO=y +# CONFIG_PKG_USING_MS5611_V100 is not set +CONFIG_PKG_USING_MS5611_LATEST_VERSION=y +CONFIG_PKG_MS5611_VER="latest" # CONFIG_PKG_USING_MAX31865 is not set # CONFIG_PKG_USING_VL53L0X is not set # CONFIG_PKG_USING_INA260 is not set @@ -1432,14 +1439,15 @@ CONFIG_SOC_GD32405RG=y # CONFIG_BSP_USING_GPIO=y CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_SERIAL_V1=y +# CONFIG_BSP_USING_SERIAL_V2 is not set CONFIG_BSP_USING_UART0=y -# CONFIG_BSP_UART0_RX_USING_DMA is not set -# CONFIG_BSP_UART0_TX_USING_DMA is not set +CONFIG_BSP_UART0_TX_PIN="PA9" +CONFIG_BSP_UART0_RX_PIN="PA10" +CONFIG_BSP_UART0_AFIO="AF7" # CONFIG_BSP_USING_UART1 is not set # CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_UART3 is not set -# CONFIG_BSP_USING_UART4 is not set -# CONFIG_BSP_USING_UART5 is not set CONFIG_BSP_USING_HARD_I2C=y CONFIG_BSP_USING_RECEIVING_A=y # CONFIG_BSP_USING_RECEIVING_B is not set @@ -1448,7 +1456,21 @@ CONFIG_BSP_USING_HARD_I2C0=y # CONFIG_BSP_USING_HARD_I2C2 is not set # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_ADC is not set -# CONFIG_BSP_USING_HWTIMER is not set +CONFIG_BSP_USING_CLOCK_TIMER=y +# CONFIG_BSP_USING_CLOCK_TIMER0 is not set +# CONFIG_BSP_USING_CLOCK_TIMER1 is not set +# CONFIG_BSP_USING_CLOCK_TIMER2 is not set +# CONFIG_BSP_USING_CLOCK_TIMER3 is not set +# CONFIG_BSP_USING_CLOCK_TIMER4 is not set +# CONFIG_BSP_USING_CLOCK_TIMER5 is not set +CONFIG_BSP_USING_CLOCK_TIMER6=y +# CONFIG_BSP_USING_CLOCK_TIMER7 is not set +# CONFIG_BSP_USING_CLOCK_TIMER8 is not set +# CONFIG_BSP_USING_CLOCK_TIMER9 is not set +# CONFIG_BSP_USING_CLOCK_TIMER10 is not set +# CONFIG_BSP_USING_CLOCK_TIMER11 is not set +# CONFIG_BSP_USING_CLOCK_TIMER12 is not set +# CONFIG_BSP_USING_CLOCK_TIMER13 is not set # CONFIG_BSP_USING_PWM is not set # CONFIG_BSP_USING_ONCHIP_RTC is not set # CONFIG_BSP_USING_WDT is not set diff --git a/bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h b/bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h index 29cf3e0e73..722c192a60 100644 --- a/bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h +++ b/bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h @@ -2,7 +2,7 @@ * UVISION generated file: DO NOT EDIT! * Generated by: uVision version 5.42.0.0 * - * Project: 'template' + * Project: 'project' * Target: 'rt-thread' */ diff --git a/bsp/gd32/arm/gd32405rg/applications/main.c b/bsp/gd32/arm/gd32405rg/applications/main.c index fa263c7cca..4e8a7984a0 100644 --- a/bsp/gd32/arm/gd32405rg/applications/main.c +++ b/bsp/gd32/arm/gd32405rg/applications/main.c @@ -135,3 +135,69 @@ static void pwm_test(void) } MSH_CMD_EXPORT(pwm_test, pwm test); #endif // BSP_USING_PWM + +void ms5611_test(void) +{ + rt_device_t i2c_dev = RT_NULL; + rt_err_t result = RT_EOK; + + // 查找气压计 + i2c_dev = rt_device_find("baro_ms5611"); + if(i2c_dev == RT_NULL) + { + rt_kprintf("i2c0 not found\r\n"); + return; + } + + // 打开气压计 + result = rt_device_open(i2c_dev, RT_DEVICE_FLAG_RDWR); + if(result != RT_EOK) + { + rt_kprintf("open i2c0 failed\r\n"); + return; + } + + // 读取气压计数据 + struct rt_sensor_data data = {0}; + if(rt_device_read(i2c_dev, 0, &data, 1) == 1) + { + rt_kprintf("read ms5611: %d\n", data.data.baro); + } + else + { + rt_kprintf("read ms5611 failed\n"); + } + + // 关闭气压计 + rt_device_close(i2c_dev); + + // 查找气压计 + i2c_dev = rt_device_find("temp_ms5611"); + if(i2c_dev == RT_NULL) + { + rt_kprintf("i2c0 not found\r\n"); + return; + } + + // 打开气压计 + result = rt_device_open(i2c_dev, RT_DEVICE_FLAG_RDWR); + if(result != RT_EOK) + { + rt_kprintf("open i2c0 failed\r\n"); + return; + } + + // 读取气压计温度 + if(rt_device_read(i2c_dev, 0, &data, 1) == 1) + { + rt_kprintf("read ms5611: %d\n", data.data.temp); + } + else + { + rt_kprintf("read ms5611 failed\n"); + } + + // 关闭气压计 + rt_device_close(i2c_dev); +} +MSH_CMD_EXPORT(ms5611_test, i2c test); diff --git a/bsp/gd32/arm/gd32405rg/board/Kconfig b/bsp/gd32/arm/gd32405rg/board/Kconfig index 36805b18fb..af223d5b2b 100644 --- a/bsp/gd32/arm/gd32405rg/board/Kconfig +++ b/bsp/gd32/arm/gd32405rg/board/Kconfig @@ -27,209 +27,198 @@ menu "On-chip Peripheral Drivers" default y select RT_USING_SERIAL if BSP_USING_UART - config BSP_USING_UART0 - bool "Enable UART0" - default n - - config BSP_UART0_RX_USING_DMA - bool "Enable UART0 RX DMA" - depends on BSP_USING_UART0 - select RT_SERIAL_USING_DMA - default n - - config BSP_UART0_TX_USING_DMA - bool "Enable UART0 TX DMA" - depends on BSP_USING_UART0 - select RT_SERIAL_USING_DMA - default n - - config BSP_UART0_RX_BUFSIZE - int "Set UART0 RX buffer size" - range 64 65535 - depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 - default 64 - - config BSP_UART0_TX_BUFSIZE - int "Set UART0 TX buffer size" - range 0 65535 - depends on BSP_USING_UART0 && RT_USING_SERIAL_V2 - default 0 - - config BSP_UART0_DMA_PING_BUFSIZE - int "Set UART0 RX DMA ping-pong buffer size" - range 32 65535 - depends on RT_USING_SERIAL_V2 && BSP_UART0_RX_USING_DMA - default 32 + choice + prompt "Select UART framework version" + default BSP_USING_SERIAL_V1 + + config BSP_USING_SERIAL_V1 + bool "Use Serial V1 framework" + select RT_USING_SERIAL + + config BSP_USING_SERIAL_V2 + bool "Use Serial V2 framework" + select RT_USING_SERIAL_V2 + endchoice - config BSP_USING_UART1 - bool "Enable UART1" + menuconfig BSP_USING_UART0 + bool "Enable UART0" default y + if BSP_USING_UART0 + config BSP_UART0_TX_PIN + string "UART0 TX name, such as PA8" + default "PA9" + + config BSP_UART0_RX_PIN + string "UART0 RX name, such as PA9" + default "PA10" + + config BSP_UART0_AFIO + string "UART0 alternate function, such as AF7" + default "AF7" + + if BSP_USING_SERIAL_V2 + config BSP_UART0_RX_USING_DMA + bool "Enable UART0 RX DMA" + depends on RT_SERIAL_USING_DMA + default n + + config BSP_UART0_TX_USING_DMA + bool "Enable UART0 TX DMA" + depends on RT_SERIAL_USING_DMA + default n + + config BSP_UART0_DMA_PING_BUFSIZE + int "Set UART0 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_UART0_RX_USING_DMA + default 64 + + config BSP_UART0_RX_BUFSIZE + int "Set UART0 RX buffer size" + range 64 65535 + default 128 + + config BSP_UART0_TX_BUFSIZE + int "Set UART0 TX buffer size" + range 0 65535 + default 128 + endif + endif - config BSP_UART1_RX_USING_DMA - bool "Enable UART1 RX DMA" - depends on BSP_USING_UART1 - select RT_SERIAL_USING_DMA - default n - - config BSP_UART1_TX_USING_DMA - bool "Enable UART1 TX DMA" - depends on BSP_USING_UART1 - select RT_SERIAL_USING_DMA + menuconfig BSP_USING_UART1 + bool "Enable UART1" default n + if BSP_USING_UART1 + config BSP_UART1_TX_PIN + string "UART1 TX name, such as PA8" + default "PA2" + + config BSP_UART1_RX_PIN + string "UART1 RX name, such as PA9" + default "PA3" + + config BSP_UART1_AFIO + string "UART1 alternate function, such as AF7" + default "AF7" + + if BSP_USING_SERIAL_V2 + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on RT_SERIAL_USING_DMA + default n + + config BSP_UART1_TX_USING_DMA + bool "Enable UART1 TX DMA" + depends on RT_SERIAL_USING_DMA + default n + + config BSP_UART1_DMA_PING_BUFSIZE + int "Set UART1 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_UART1_RX_USING_DMA + default 64 + + config BSP_UART1_RX_BUFSIZE + int "Set UART1 RX buffer size" + range 64 65535 + default 128 + + config BSP_UART1_TX_BUFSIZE + int "Set UART1 TX buffer size" + range 0 65535 + default 128 + endif + endif - config BSP_UART1_RX_BUFSIZE - int "Set UART1 RX buffer size" - range 64 65535 - depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 - default 64 - - config BSP_UART1_TX_BUFSIZE - int "Set UART1 TX buffer size" - range 0 65535 - depends on BSP_USING_UART1 && RT_USING_SERIAL_V2 - default 0 - - config BSP_UART1_DMA_PING_BUFSIZE - int "Set UART1 RX DMA ping-pong buffer size" - range 32 65535 - depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA - default 32 - - config BSP_USING_UART2 + menuconfig BSP_USING_UART2 bool "Enable UART2" default n + if BSP_USING_UART2 + config BSP_UART2_TX_PIN + string "UART2 TX name, such as PA8" + default "PB10" + + config BSP_UART2_RX_PIN + string "UART2 RX name, such as PA9" + default "PB11" + + config BSP_UART2_AFIO + string "UART2 alternate function, such as AF7" + default "AF7" + + if BSP_USING_SERIAL_V2 + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on RT_SERIAL_USING_DMA + default n + + config BSP_UART2_TX_USING_DMA + bool "Enable UART2 TX DMA" + depends on RT_SERIAL_USING_DMA + default n + + config BSP_UART2_DMA_PING_BUFSIZE + int "Set UART2 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_UART2_RX_USING_DMA + default 64 + + config BSP_UART2_RX_BUFSIZE + int "Set UART2 RX buffer size" + range 64 65535 + default 128 + + config BSP_UART2_TX_BUFSIZE + int "Set UART2 TX buffer size" + range 0 65535 + default 128 + endif + endif - config BSP_UART2_RX_USING_DMA - bool "Enable UART2 RX DMA" - depends on BSP_USING_UART2 - select RT_SERIAL_USING_DMA - default n - - config BSP_UART2_TX_USING_DMA - bool "Enable UART2 TX DMA" - depends on BSP_USING_UART2 - select RT_SERIAL_USING_DMA - default n - - config BSP_UART2_RX_BUFSIZE - int "Set UART2 RX buffer size" - range 64 65535 - depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 - default 64 - - config BSP_UART2_TX_BUFSIZE - int "Set UART2 TX buffer size" - range 0 65535 - depends on BSP_USING_UART2 && RT_USING_SERIAL_V2 - default 0 - - config BSP_UART2_DMA_PING_BUFSIZE - int "Set UART2 RX DMA ping-pong buffer size" - range 32 65535 - depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA - default 32 - - config BSP_USING_UART3 + menuconfig BSP_USING_UART3 bool "Enable UART3" default n - - config BSP_UART3_RX_USING_DMA - bool "Enable UART3 RX DMA" - depends on BSP_USING_UART3 - select RT_SERIAL_USING_DMA - default n - - config BSP_UART3_TX_USING_DMA - bool "Enable UART3 TX DMA" - depends on BSP_USING_UART3 - select RT_SERIAL_USING_DMA - default n - - config BSP_UART3_RX_BUFSIZE - int "Set UART3 RX buffer size" - range 64 65535 - depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 - default 64 - - config BSP_UART3_TX_BUFSIZE - int "Set UART3 TX buffer size" - range 0 65535 - depends on BSP_USING_UART3 && RT_USING_SERIAL_V2 - default 0 - - config BSP_UART3_DMA_PING_BUFSIZE - int "Set UART3 RX DMA ping-pong buffer size" - range 32 65535 - depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA - default 32 - - config BSP_USING_UART4 - bool "Enable UART4" - default n - - config BSP_UART4_RX_USING_DMA - bool "Enable UART4 RX DMA" - depends on BSP_USING_UART4 - select RT_SERIAL_USING_DMA - default n - - config BSP_UART4_TX_USING_DMA - bool "Enable UART4 TX DMA" - depends on BSP_USING_UART4 - select RT_SERIAL_USING_DMA - default n - - config BSP_UART4_RX_BUFSIZE - int "Set UART4 RX buffer size" - range 64 65535 - depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 - default 64 - - config BSP_UART4_TX_BUFSIZE - int "Set UART4 TX buffer size" - range 0 65535 - depends on BSP_USING_UART4 && RT_USING_SERIAL_V2 - default 0 - - config BSP_UART4_DMA_PING_BUFSIZE - int "Set UART4 RX DMA ping-pong buffer size" - range 32 65535 - depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA - default 32 - - config BSP_USING_UART5 - bool "Enable UART5" - default n - - config BSP_UART5_RX_USING_DMA - bool "Enable UART5 RX DMA" - depends on BSP_USING_UART5 - select RT_SERIAL_USING_DMA - default n - - config BSP_UART5_TX_USING_DMA - bool "Enable UART5 TX DMA" - depends on BSP_USING_UART5 - select RT_SERIAL_USING_DMA - default n - - config BSP_UART5_RX_BUFSIZE - int "Set UART5 RX buffer size" - range 64 65535 - depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 - default 64 - - config BSP_UART5_TX_BUFSIZE - int "Set UART5 TX buffer size" - range 0 65535 - depends on BSP_USING_UART5 && RT_USING_SERIAL_V2 - default 0 - - config BSP_UART5_DMA_PING_BUFSIZE - int "Set UART5 RX DMA ping-pong buffer size" - range 32 65535 - depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA - default 32 + if BSP_USING_UART3 + config BSP_UART3_TX_PIN + string "UART3 TX name, such as PA8" + default "PC10" + + config BSP_UART3_RX_PIN + string "UART3 RX name, such as PA9" + default "PC11" + + config BSP_UART3_AFIO + string "UART3 alternate function, such as AF7" + default "AF8" + + if BSP_USING_SERIAL_V2 + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on RT_SERIAL_USING_DMA + default n + + config BSP_UART3_TX_USING_DMA + bool "Enable UART3 TX DMA" + depends on RT_SERIAL_USING_DMA + default n + + config BSP_UART3_DMA_PING_BUFSIZE + int "Set UART3 RX DMA ping-pong buffer size" + range 16 65535 + depends on BSP_UART3_RX_USING_DMA + default 64 + + config BSP_UART3_RX_BUFSIZE + int "Set UART3 RX buffer size" + range 64 65535 + default 128 + + config BSP_UART3_TX_BUFSIZE + int "Set UART3 TX buffer size" + range 0 65535 + default 128 + endif + endif endif menuconfig BSP_USING_HARD_I2C @@ -300,64 +289,64 @@ menu "On-chip Peripheral Drivers" default n endif - menuconfig BSP_USING_HWTIMER + menuconfig BSP_USING_CLOCK_TIMER bool "Enable timer" default n - select RT_USING_HWTIMER - if BSP_USING_HWTIMER - config BSP_USING_HWTIMER0 + select RT_USING_CLOCK_TIME + if BSP_USING_CLOCK_TIMER + config BSP_USING_CLOCK_TIMER0 bool "Enable TIM0" default n - config BSP_USING_HWTIMER1 + config BSP_USING_CLOCK_TIMER1 bool "Enable TIM1" default n - config BSP_USING_HWTIMER2 + config BSP_USING_CLOCK_TIMER2 bool "Enable TIM2" default n - config BSP_USING_HWTIMER3 + config BSP_USING_CLOCK_TIMER3 bool "Enable TIM3" default n - config BSP_USING_HWTIMER4 + config BSP_USING_CLOCK_TIMER4 bool "Enable TIM4" default n - config BSP_USING_HWTIMER5 + config BSP_USING_CLOCK_TIMER5 bool "Enable TIM5" default n - config BSP_USING_HWTIMER6 + config BSP_USING_CLOCK_TIMER6 bool "Enable TIM6" default y - config BSP_USING_HWTIMER7 + config BSP_USING_CLOCK_TIMER7 bool "Enable TIM7" default n - config BSP_USING_HWTIMER8 + config BSP_USING_CLOCK_TIMER8 bool "Enable TIM8" default n - config BSP_USING_HWTIMER9 + config BSP_USING_CLOCK_TIMER9 bool "Enable TIM9" default n - config BSP_USING_HWTIMER10 + config BSP_USING_CLOCK_TIMER10 bool "Enable TIM10" default n - config BSP_USING_HWTIMER11 + config BSP_USING_CLOCK_TIMER11 bool "Enable TIM11" default n - config BSP_USING_HWTIMER12 + config BSP_USING_CLOCK_TIMER12 bool "Enable TIM12" default n - config BSP_USING_HWTIMER13 + config BSP_USING_CLOCK_TIMER13 bool "Enable TIM13" default n endif diff --git a/bsp/gd32/arm/gd32405rg/board/SConscript b/bsp/gd32/arm/gd32405rg/board/SConscript index 409d6be0ae..c2ae6e3cf5 100644 --- a/bsp/gd32/arm/gd32405rg/board/SConscript +++ b/bsp/gd32/arm/gd32405rg/board/SConscript @@ -7,6 +7,7 @@ cwd = GetCurrentDir() # add general drivers src = Split(''' board.c +board_ms5611.c ''') path = [cwd] diff --git a/bsp/gd32/arm/gd32405rg/board/board_ms5611.c b/bsp/gd32/arm/gd32405rg/board/board_ms5611.c new file mode 100644 index 0000000000..4aba0b965a --- /dev/null +++ b/bsp/gd32/arm/gd32405rg/board/board_ms5611.c @@ -0,0 +1,31 @@ +/******************************************************************************* + * @file board_ms5611.c + * @author ShiHongchao + * @date 2025-12-14 + * @version V0.1 + * @brief 使用ms5611软件包向传感器框架注册ms5611气压传感器 + ******************************************************************************* +*/ + +#include + +#define LOG_TAR "board.ms5611" +#include + +#include "board.h" +#include "sensor_meas_ms5611.h" + +int board_ms5611_init(void) +{ + int rsult = rt_hw_ms5611_init("ms5611", &(struct rt_sensor_config){ + .intf.dev_name = "hwi2c0", + }); + if(rsult != RT_EOK) + { + LOG_E("ms5611 init failed"); + return rsult; + } + + return rsult; +} +INIT_DEVICE_EXPORT(board_ms5611_init); diff --git a/bsp/gd32/arm/gd32405rg/project.uvoptx b/bsp/gd32/arm/gd32405rg/project.uvoptx index 7fd705460a..4d71ca8e9e 100644 --- a/bsp/gd32/arm/gd32405rg/project.uvoptx +++ b/bsp/gd32/arm/gd32405rg/project.uvoptx @@ -117,6 +117,26 @@ BIN\CMSIS_AGDI.dll + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + + 0 CMSIS_AGDI @@ -135,12 +155,12 @@ 0 0 - 0 + 1 0 0 0 0 - 0 + 1 0 0 0 @@ -195,7 +215,7 @@ - Compiler + CPU 0 0 0 @@ -207,8 +227,8 @@ 0 0 0 - ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c - syscall_mem.c + ..\..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c 0 0 @@ -219,8 +239,8 @@ 0 0 0 - ..\..\..\..\components\libc\compilers\armlibc\syscalls.c - syscalls.c + ..\..\..\..\libcpu\arm\common\div0.c + div0.c 0 0 @@ -231,20 +251,20 @@ 0 0 0 - ..\..\..\..\components\libc\compilers\common\cctype.c - cctype.c + ..\..\..\..\libcpu\arm\common\showmem.c + showmem.c 0 0 2 5 - 1 + 2 0 0 0 - ..\..\..\..\components\libc\compilers\common\cstdlib.c - cstdlib.c + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S 0 0 @@ -255,55 +275,55 @@ 0 0 0 - ..\..\..\..\components\libc\compilers\common\cstring.c - cstring.c + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c 0 0 + + + + DeviceDrivers + 0 + 0 + 0 + 0 - 2 + 3 7 1 0 0 0 - ..\..\..\..\components\libc\compilers\common\ctime.c - ctime.c + ..\..\..\..\components\drivers\clock_time\clock_boottime.c + clock_boottime.c 0 0 - 2 + 3 8 1 0 0 0 - ..\..\..\..\components\libc\compilers\common\cunistd.c - cunistd.c + ..\..\..\..\components\drivers\clock_time\clock_hrtimer.c + clock_hrtimer.c 0 0 - 2 + 3 9 1 0 0 0 - ..\..\..\..\components\libc\compilers\common\cwchar.c - cwchar.c + ..\..\..\..\components\drivers\clock_time\clock_time_core.c + clock_time_core.c 0 0 - - - - DeviceDrivers - 0 - 0 - 0 - 0 3 10 @@ -311,8 +331,8 @@ 0 0 0 - ..\..\..\..\components\drivers\core\device.c - device.c + ..\..\..\..\components\drivers\clock_time\clock_timer.c + clock_timer.c 0 0 @@ -323,8 +343,8 @@ 0 0 0 - ..\..\..\..\components\drivers\hwtimer\hwtimer.c - hwtimer.c + ..\..\..\..\components\drivers\core\device.c + device.c 0 0 @@ -479,8 +499,8 @@ 0 0 0 - ..\..\..\..\components\drivers\misc\rt_drv_pwm.c - rt_drv_pwm.c + ..\..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c 0 0 @@ -491,8 +511,8 @@ 0 0 0 - ..\..\..\..\components\drivers\pin\dev_pin.c - dev_pin.c + ..\..\..\..\components\drivers\sensor\v1\sensor.c + sensor.c 0 0 @@ -503,6 +523,18 @@ 0 0 0 + ..\..\..\..\components\drivers\sensor\v1\sensor_cmd.c + sensor_cmd.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 ..\..\..\..\components\drivers\serial\dev_serial.c dev_serial.c 0 @@ -512,13 +544,13 @@ Drivers - 0 + 1 0 0 0 4 - 27 + 28 1 0 0 @@ -530,55 +562,55 @@ 4 - 28 + 29 1 0 0 0 - ..\libraries\gd32_drivers\drv_gpio.c - drv_gpio.c + board\board_ms5611.c + board_ms5611.c 0 0 4 - 29 + 30 1 0 0 0 - ..\libraries\gd32_drivers\drv_hard_i2c.c - drv_hard_i2c.c + ..\libraries\gd32_drivers\drv_gpio.c + drv_gpio.c 0 0 4 - 30 + 31 1 0 0 0 - ..\libraries\gd32_drivers\drv_hwtimer.c - drv_hwtimer.c + ..\libraries\gd32_drivers\drv_hard_i2c.c + drv_hard_i2c.c 0 0 4 - 31 + 32 1 0 0 0 - ..\libraries\gd32_drivers\drv_pwm.c - drv_pwm.c + ..\libraries\gd32_drivers\drv_timer.c + drv_timer.c 0 0 4 - 32 + 33 1 0 0 @@ -598,49 +630,49 @@ 0 5 - 33 + 34 1 0 0 0 - ..\..\..\..\components\finsh\msh.c - msh.c + ..\..\..\..\components\finsh\shell.c + shell.c 0 0 5 - 34 + 35 1 0 0 0 - ..\..\..\..\components\finsh\cmd.c - cmd.c + ..\..\..\..\components\finsh\msh.c + msh.c 0 0 5 - 35 + 36 1 0 0 0 - ..\..\..\..\components\finsh\shell.c - shell.c + ..\..\..\..\components\finsh\msh_parse.c + msh_parse.c 0 0 5 - 36 + 37 1 0 0 0 - ..\..\..\..\components\finsh\msh_parse.c - msh_parse.c + ..\..\..\..\components\finsh\cmd.c + cmd.c 0 0 @@ -654,7 +686,7 @@ 0 6 - 37 + 38 1 0 0 @@ -666,7 +698,7 @@ 6 - 38 + 39 1 0 0 @@ -678,7 +710,7 @@ 6 - 39 + 40 1 0 0 @@ -690,7 +722,7 @@ 6 - 40 + 41 1 0 0 @@ -702,7 +734,7 @@ 6 - 41 + 42 1 0 0 @@ -714,7 +746,7 @@ 6 - 42 + 43 1 0 0 @@ -726,7 +758,7 @@ 6 - 43 + 44 1 0 0 @@ -738,7 +770,7 @@ 6 - 44 + 45 1 0 0 @@ -750,7 +782,7 @@ 6 - 45 + 46 1 0 0 @@ -762,7 +794,7 @@ 6 - 46 + 47 1 0 0 @@ -774,7 +806,7 @@ 6 - 47 + 48 1 0 0 @@ -786,7 +818,7 @@ 6 - 48 + 49 1 0 0 @@ -798,7 +830,7 @@ 6 - 49 + 50 1 0 0 @@ -810,7 +842,7 @@ 6 - 50 + 51 1 0 0 @@ -822,7 +854,7 @@ 6 - 51 + 52 1 0 0 @@ -835,23 +867,11 @@ - klibc + Libc 0 0 0 0 - - 7 - 52 - 1 - 0 - 0 - 0 - ..\..\..\..\src\klibc\kerrno.c - kerrno.c - 0 - 0 - 7 53 @@ -859,8 +879,8 @@ 0 0 0 - ..\..\..\..\src\klibc\rt_vsscanf.c - rt_vsscanf.c + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c 0 0 @@ -871,8 +891,8 @@ 0 0 0 - ..\..\..\..\src\klibc\kstring.c - kstring.c + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c 0 0 @@ -883,8 +903,8 @@ 0 0 0 - ..\..\..\..\src\klibc\kstdio.c - kstdio.c + ..\..\..\..\components\libc\compilers\common\cctype.c + cctype.c 0 0 @@ -895,76 +915,116 @@ 0 0 0 - ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c - rt_vsnprintf_tiny.c + ..\..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c 0 0 - - - - libcpu - 0 - 0 - 0 - 0 - 8 + 7 57 1 0 0 0 - ..\..\..\..\libcpu\arm\common\atomic_arm.c - atomic_arm.c + ..\..\..\..\components\libc\compilers\common\cstring.c + cstring.c 0 0 - 8 + 7 58 1 0 0 0 - ..\..\..\..\libcpu\arm\common\div0.c - div0.c + ..\..\..\..\components\libc\compilers\common\ctime.c + ctime.c 0 0 - 8 + 7 59 1 0 0 0 - ..\..\..\..\libcpu\arm\common\showmem.c - showmem.c + ..\..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c 0 0 - 8 + 7 60 - 2 + 1 0 0 0 - ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S - context_rvds.S + ..\..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c 0 0 - 8 + 7 61 1 0 0 0 - ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c - cpuport.c + ..\..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c 0 0 @@ -977,8 +1037,8 @@ 0 0 - 9 - 62 + 8 + 66 2 0 0 @@ -989,8 +1049,8 @@ 0 - 9 - 63 + 8 + 67 1 0 0 @@ -1001,8 +1061,8 @@ 0 - 9 - 64 + 8 + 68 1 0 0 @@ -1013,8 +1073,8 @@ 0 - 9 - 65 + 8 + 69 1 0 0 @@ -1025,8 +1085,8 @@ 0 - 9 - 66 + 8 + 70 1 0 0 @@ -1037,8 +1097,8 @@ 0 - 9 - 67 + 8 + 71 1 0 0 @@ -1049,8 +1109,8 @@ 0 - 9 - 68 + 8 + 72 1 0 0 @@ -1061,8 +1121,8 @@ 0 - 9 - 69 + 8 + 73 1 0 0 @@ -1073,8 +1133,8 @@ 0 - 9 - 70 + 8 + 74 1 0 0 @@ -1085,8 +1145,8 @@ 0 - 9 - 71 + 8 + 75 1 0 0 @@ -1096,6 +1156,50 @@ 0 0 + + 8 + 76 + 1 + 0 + 0 + 0 + .\packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c + gd32f4xx_timer.c + 0 + 0 + + + + + ms5611 + 1 + 0 + 0 + 0 + + 9 + 77 + 1 + 0 + 0 + 0 + packages\ms5611-latest\ms5611.c + ms5611.c + 0 + 0 + + + 9 + 78 + 1 + 0 + 0 + 0 + packages\ms5611-latest\sensor_meas_ms5611.c + sensor_meas_ms5611.c + 0 + 0 + diff --git a/bsp/gd32/arm/gd32405rg/project.uvprojx b/bsp/gd32/arm/gd32405rg/project.uvprojx index 69f501cf6d..8605b02cb0 100644 --- a/bsp/gd32/arm/gd32405rg/project.uvprojx +++ b/bsp/gd32/arm/gd32405rg/project.uvprojx @@ -338,9 +338,9 @@ 0 - RT_USING_LIBC, GD32F405, __RTTHREAD__, USE_STDPERIPH_DRIVER, __CLK_TCK=RT_TICK_PER_SECOND, RT_USING_ARMLIBC, __STDC_LIMIT_MACROS, HXTAL_VALUE=8000000U + __STDC_LIMIT_MACROS, HXTAL_VALUE=8000000U, GD32F405, __CLK_TCK=RT_TICK_PER_SECOND, USE_STDPERIPH_DRIVER, __RTTHREAD__, RT_USING_ARMLIBC, RT_USING_LIBC - applications;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\libc\posix\io\eventfd;board;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\smp_call;..\..\..\..\libcpu\arm\common;..\..\..\..\components\drivers\include;..\..\..\..\libcpu\arm\cortex-m4;packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;..\..\..\..\components\libc\posix\io\epoll;..\libraries\gd32_drivers;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\net\utest;..\..\..\..\components\drivers\phy;..\..\..\..\include;packages\gd32-arm-cmsis-latest\GD32F4xx;.;..\..\..\..\components\drivers\include;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\finsh;..\..\..\..\components\drivers\include + ..\..\..\..\components\drivers\smp_call;..\..\..\..\components\drivers\phy;.;..\..\..\..\components\libc\posix\io\epoll;..\libraries\gd32_drivers\config;..\..\..\..\libcpu\arm\common;packages\ms5611-latest;..\..\..\..\components\libc\posix\ipc;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\net\utest;packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Include;..\..\..\..\include;..\..\..\..\components\drivers\include;..\..\..\..\components\drivers\include;..\..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\libraries\gd32_drivers;..\..\..\..\components\libc\compilers\common\include;..\..\..\..\components\libc\posix\io\poll;..\..\..\..\components\libc\posix\io\eventfd;applications;..\..\..\..\components\drivers\include;..\..\..\..\components\finsh;..\..\..\..\libcpu\arm\cortex-m4;..\..\..\..\components\libc\compilers\common\extension;..\..\..\..\components\drivers\include;packages\gd32-arm-cmsis-latest\GD32F4xx;..\..\..\..\components\drivers\clock_time;..\..\..\..\components\drivers\include;board;packages\gd32-arm-cmsis-latest\GD32F4xx\GD\GD32F4xx\Include;..\..\..\..\components\drivers\include @@ -392,57 +392,210 @@ - Compiler + CPU - syscall_mem.c + atomic_arm.c 1 - ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c + ..\..\..\..\libcpu\arm\common\atomic_arm.c - syscalls.c + div0.c 1 - ..\..\..\..\components\libc\compilers\armlibc\syscalls.c + ..\..\..\..\libcpu\arm\common\div0.c - cctype.c + showmem.c 1 - ..\..\..\..\components\libc\compilers\common\cctype.c + ..\..\..\..\libcpu\arm\common\showmem.c - cstdlib.c - 1 - ..\..\..\..\components\libc\compilers\common\cstdlib.c + context_rvds.S + 2 + ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S - cstring.c + cpuport.c 1 - ..\..\..\..\components\libc\compilers\common\cstring.c + ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + DeviceDrivers + - ctime.c + clock_boottime.c 1 - ..\..\..\..\components\libc\compilers\common\ctime.c + ..\..\..\..\components\drivers\clock_time\clock_boottime.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + --c99 --gnu + __RT_IPC_SOURCE__ + + + + + + - cunistd.c + clock_hrtimer.c 1 - ..\..\..\..\components\libc\compilers\common\cunistd.c + ..\..\..\..\components\drivers\clock_time\clock_hrtimer.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + --c99 --gnu + __RT_IPC_SOURCE__ + + + + + + - cwchar.c + clock_time_core.c 1 - ..\..\..\..\components\libc\compilers\common\cwchar.c + ..\..\..\..\components\drivers\clock_time\clock_time_core.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + --c99 --gnu + __RT_IPC_SOURCE__ + + + + + + - - - - DeviceDrivers - - device.c + clock_timer.c 1 - ..\..\..\..\components\drivers\core\device.c + ..\..\..\..\components\drivers\clock_time\clock_timer.c 2 @@ -486,7 +639,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -496,9 +649,9 @@ - hwtimer.c + device.c 1 - ..\..\..\..\components\drivers\hwtimer\hwtimer.c + ..\..\..\..\components\drivers\core\device.c 2 @@ -542,7 +695,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -598,7 +751,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -654,7 +807,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -710,7 +863,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -766,7 +919,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -822,7 +975,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -878,7 +1031,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -934,7 +1087,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -990,7 +1143,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -1046,7 +1199,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -1102,7 +1255,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -1158,7 +1311,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -1214,7 +1367,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -1224,9 +1377,9 @@ - rt_drv_pwm.c + dev_pin.c 1 - ..\..\..\..\components\drivers\misc\rt_drv_pwm.c + ..\..\..\..\components\drivers\pin\dev_pin.c 2 @@ -1270,7 +1423,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -1280,9 +1433,9 @@ - dev_pin.c + sensor.c 1 - ..\..\..\..\components\drivers\pin\dev_pin.c + ..\..\..\..\components\drivers\sensor\v1\sensor.c 2 @@ -1326,7 +1479,63 @@ 2 2 - + --c99 --gnu + __RT_IPC_SOURCE__ + + + + + + + + + sensor_cmd.c + 1 + ..\..\..\..\components\drivers\sensor\v1\sensor_cmd.c + + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + --c99 --gnu __RT_IPC_SOURCE__ @@ -1382,7 +1591,7 @@ 2 2 - + --c99 --gnu __RT_IPC_SOURCE__ @@ -1401,6 +1610,11 @@ 1 board\board.c + + board_ms5611.c + 1 + board\board_ms5611.c + drv_gpio.c 1 @@ -1412,14 +1626,9 @@ ..\libraries\gd32_drivers\drv_hard_i2c.c - drv_hwtimer.c - 1 - ..\libraries\gd32_drivers\drv_hwtimer.c - - - drv_pwm.c + drv_timer.c 1 - ..\libraries\gd32_drivers\drv_pwm.c + ..\libraries\gd32_drivers\drv_timer.c drv_usart.c @@ -1432,24 +1641,24 @@ Finsh - msh.c + shell.c 1 - ..\..\..\..\components\finsh\msh.c + ..\..\..\..\components\finsh\shell.c - cmd.c + msh.c 1 - ..\..\..\..\components\finsh\cmd.c + ..\..\..\..\components\finsh\msh.c - shell.c + msh_parse.c 1 - ..\..\..\..\components\finsh\shell.c + ..\..\..\..\components\finsh\msh_parse.c - msh_parse.c + cmd.c 1 - ..\..\..\..\components\finsh\msh_parse.c + ..\..\..\..\components\finsh\cmd.c @@ -2299,62 +2508,72 @@ - klibc + Libc - kerrno.c + syscall_mem.c 1 - ..\..\..\..\src\klibc\kerrno.c + ..\..\..\..\components\libc\compilers\armlibc\syscall_mem.c - rt_vsscanf.c + syscalls.c 1 - ..\..\..\..\src\klibc\rt_vsscanf.c + ..\..\..\..\components\libc\compilers\armlibc\syscalls.c - kstring.c + cctype.c 1 - ..\..\..\..\src\klibc\kstring.c + ..\..\..\..\components\libc\compilers\common\cctype.c - kstdio.c + cstdlib.c 1 - ..\..\..\..\src\klibc\kstdio.c + ..\..\..\..\components\libc\compilers\common\cstdlib.c - rt_vsnprintf_tiny.c + cstring.c 1 - ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + ..\..\..\..\components\libc\compilers\common\cstring.c - - - - libcpu - - atomic_arm.c + ctime.c 1 - ..\..\..\..\libcpu\arm\common\atomic_arm.c + ..\..\..\..\components\libc\compilers\common\ctime.c - div0.c + cunistd.c 1 - ..\..\..\..\libcpu\arm\common\div0.c + ..\..\..\..\components\libc\compilers\common\cunistd.c - showmem.c + cwchar.c 1 - ..\..\..\..\libcpu\arm\common\showmem.c + ..\..\..\..\components\libc\compilers\common\cwchar.c - context_rvds.S - 2 - ..\..\..\..\libcpu\arm\cortex-m4\context_rvds.S + kerrno.c + 1 + ..\..\..\..\src\klibc\kerrno.c - cpuport.c + kstdio.c 1 - ..\..\..\..\libcpu\arm\cortex-m4\cpuport.c + ..\..\..\..\src\klibc\kstdio.c + + + kstring.c + 1 + ..\..\..\..\src\klibc\kstring.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + rt_vsscanf.c + 1 + ..\..\..\..\src\klibc\rt_vsscanf.c @@ -2411,6 +2630,26 @@ 1 packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_usart.c + + gd32f4xx_timer.c + 1 + .\packages\gd32-arm-series-latest\GD32F4xx\GD32F4xx_standard_peripheral\Source\gd32f4xx_timer.c + + + + + ms5611 + + + ms5611.c + 1 + packages\ms5611-latest\ms5611.c + + + sensor_meas_ms5611.c + 1 + packages\ms5611-latest\sensor_meas_ms5611.c + diff --git a/bsp/gd32/arm/gd32405rg/rtconfig.h b/bsp/gd32/arm/gd32405rg/rtconfig.h index ad67872218..509929f1ab 100644 --- a/bsp/gd32/arm/gd32405rg/rtconfig.h +++ b/bsp/gd32/arm/gd32405rg/rtconfig.h @@ -102,7 +102,8 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x50201 +#define RT_USING_CONSOLE_OUTPUT_CTL +#define RT_VER_NUM 0x50300 #define RT_BACKTRACE_LEVEL_MAX_NR 32 /* end of RT-Thread Kernel */ #define RT_USING_HW_ATOMIC @@ -147,11 +148,12 @@ #define RT_USING_SERIAL_V1 #define RT_SERIAL_USING_DMA #define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_CLOCK_TIME #define RT_USING_I2C #define RT_USING_I2C_BITOPS -#define RT_USING_PWM +#define RT_USING_SENSOR +#define RT_USING_SENSOR_CMD #define RT_USING_PIN -#define RT_USING_HWTIMER /* end of Device Drivers */ /* C/C++ and POSIX layer */ @@ -333,6 +335,10 @@ /* sensors drivers */ +#define PKG_USING_MS5611 +#define PKG_MS5611_USING_SENSOR_V1 +#define PKG_MS5611_USING_BARO +#define PKG_USING_MS5611_LATEST_VERSION /* end of sensors drivers */ /* touch drivers */ @@ -421,10 +427,16 @@ #define BSP_USING_GPIO #define BSP_USING_UART +#define BSP_USING_SERIAL_V1 #define BSP_USING_UART0 +#define BSP_UART0_TX_PIN "PA9" +#define BSP_UART0_RX_PIN "PA10" +#define BSP_UART0_AFIO "AF7" #define BSP_USING_HARD_I2C #define BSP_USING_RECEIVING_A #define BSP_USING_HARD_I2C0 +#define BSP_USING_CLOCK_TIMER +#define BSP_USING_CLOCK_TIMER6 #define BSP_USING_GD_DBG /* end of On-chip Peripheral Drivers */ diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_timer.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_timer.c index fe35d21094..be459ffcf6 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_timer.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_timer.c @@ -6,10 +6,6 @@ * Change Logs: * Date Author Notes * 2021-02-25 iysheng first version - * 2025-12-26 shihongchao Configure GD32F4xx chips interrupt handlers, - * relocate clock and interrupt initialization - * to the _init function, and implement deinit - * functionality */ #include @@ -118,30 +114,16 @@ static void __set_timerx_freq(uint32_t timerx, uint32_t freq) static void gd32_clock_timer_init(struct rt_clock_timer_device *timer, rt_uint32_t state) { uint32_t timer_base = (uint32_t)timer->parent.user_data; - gd32_hwtimer_device *hwtimer = rt_container_of(timer, gd32_hwtimer_device, hwtimer_dev); timer_parameter_struct initpara; if (state) { - rcu_periph_clock_enable(hwtimer->hw_data.rcu); - NVIC_SetPriority(hwtimer->hw_data.irqn, 0); - NVIC_EnableIRQ(hwtimer->hw_data.irqn); - timer_interrupt_enable(timer_base, TIMER_INT_UP); - timer_internal_clock_config(timer_base); timer_struct_para_init(&initpara); initpara.period = timer->info->maxcnt; timer_init(timer_base, &initpara); __set_timerx_freq(timer_base, timer->info->maxfreq); } - else - { - rcu_periph_clock_disable(hwtimer->hw_data.rcu); - NVIC_DisableIRQ(hwtimer->hw_data.irqn); - timer_interrupt_disable(timer_base, TIMER_INT_UP); - - timer_disable(timer_base); - } } static rt_err_t gd32_clock_timer_start(struct rt_clock_timer_device *timer, \ @@ -218,11 +200,7 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer0", { TIMER0, -#ifdef SOC_SERIES_GD32F4xx - TIMER0_UP_TIMER9_IRQn, -#else TIMER0_UP_IRQn, -#endif RCU_TIMER0, }, {0}, @@ -307,11 +285,7 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer5", { TIMER5, -#ifdef SOC_SERIES_GD32F4xx - TIMER5_DAC_IRQn, -#else TIMER5_IRQn, -#endif RCU_TIMER5, }, {0}, @@ -345,11 +319,7 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer7", { TIMER7, -#ifdef SOC_SERIES_GD32F4xx - TIMER7_UP_TIMER12_IRQn, -#else TIMER7_UP_IRQn, -#endif RCU_TIMER7, }, {0}, @@ -366,11 +336,7 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer8", { TIMER8, -#ifdef SOC_SERIES_GD32F4xx - TIMER0_BRK_TIMER8_IRQn, -#else TIMER8_IRQn, -#endif RCU_TIMER8, }, {0}, @@ -387,11 +353,7 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer9", { TIMER9, -#ifdef SOC_SERIES_GD32F4xx - TIMER0_UP_TIMER9_IRQn, -#else TIMER9_IRQn, -#endif RCU_TIMER9, }, {0}, @@ -408,11 +370,7 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer10", { TIMER10, -#ifdef SOC_SERIES_GD32F4xx - TIMER0_TRG_CMT_TIMER10_IRQn, -#else TIMER10_IRQn, -#endif RCU_TIMER10, }, {0}, @@ -429,11 +387,7 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer11", { TIMER11, -#ifdef SOC_SERIES_GD32F4xx - TIMER7_BRK_TIMER11_IRQn, -#else TIMER11_IRQn, -#endif RCU_TIMER11, }, {0}, @@ -450,11 +404,7 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer12", { TIMER12, -#ifdef SOC_SERIES_GD32F4xx - TIMER7_UP_TIMER12_IRQn, -#else TIMER12_IRQn, -#endif RCU_TIMER12, }, {0}, @@ -471,11 +421,7 @@ static gd32_clock_timer_device g_gd32_clock_timer[] = { "timer13", { TIMER13, -#ifdef SOC_SERIES_GD32F4xx - TIMER7_TRG_CMT_TIMER13_IRQn, -#else TIMER13_IRQn, -#endif RCU_TIMER13, }, {0}, -- Gitee

    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%0Axv%0&Cfq=UVW~}ahftnKH&=>sjs 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 literal 0 HcmV?d00001 diff --git a/bsp/n32/n32hxxx/n32h760zil7-stb/project.uvoptx b/bsp/n32/n32hxxx/n32h760zil7-stb/project.uvoptx new file mode 100644 index 0000000000..a533a5f8e3 --- /dev/null +++ b/bsp/n32/n32hxxx/n32h760zil7-stb/project.uvoptx @@ -0,0 +1,1064 @@ + + + + 1.0 + +

sY!*w{xK0rNjfyP^Dc@Mh3C2^;s@8DK8_4KpnCbcnT;2 z-QbeW?ci1fz}O@n4m~P;QvOX^Wu8dZJ*pQA{OU_vOMO!A8+m0|JjU8xx-Yq|w^;DD zm1i&fO0`JmPcJO2!I%;5zO(`7Y#Bxe-Kvl*M(s_>{nl&Tb+e32i zzvT;_qOhLb;{>iCYfJSg?+%QXVJW#xb zKQYGUJqCKv2Bfz)_wWIEGfD|Bmpi#W^tSqrp`l&*_9f!a%blkLW7e-<+j$eT7Omz- z4;z6PK9#q7uWCLc((QCbfJP!4o<+t^$^i4ZFXdMqhD^ly6M=2LRh+!=rccX!9oVt_hrV$FO&Z#CUM zEwKqVV2*L?T(*&@8y!h56l5khbJPmc@aKu;)8M+YOgwinl*4xSsLh?Nydr0iA!Hzq z=72kWOU629i0*Bz{Es9?7&D*g?O7fr(QWjB44Pb~SguerG3XDqdHgZ?*Ql1uwR6iK zO5baX>y{SE?IOf55Oe~7D_BPyx4Ui}BT2z}?T)a$#TuCnHXKwzr9i%qa@))Nq4sh5UgYQ5cUFVB+>Fid< zOOhc_0NMh!2dNd3`bMR5q}^-MZD^6kOE@gvzO`Rbdl=z1_OItN{{R>FYc##dwtFb$ zWrjivAUqN}Py$C9xfyNF_3-e1D8pp zl6{AabI+}IdR^of5H_87%7Bc5M|!}G(IPG*+;i5MxXU&V80p0ZgS9A{#x3!-cXY*V zY4)(oWdlzr5==n<0CzQ+acK7e6r6$1Dr-`($OX#$pUV^hf5v)Ewu!07Wn*#ng)!$N z2Mt*^_qQw|^MPc9j4y1{9b~<@Fohkqh*m+gs*DU*D|KaaXL!+temPdgIH_Zi zt@R%#05k-K&mfUqwyol8En%(J`qZqDN3fOP8VPK#Z>>UYt?ji)_rf-|dzz!ETP@wh zvRYd)wL|jl85lLqT}skU3h=5nf!h_(*!Y)L(`;qat-|b+?=uXXP)W_)S(vUi^izyy zu&cLL?6Sm>_)nRUCXybt8NC2Ldmm)hL=OlWb!nd@|4^_QrWw*1Ec!qLUr2>(a zBup+E0PD2iXWG3MFAm&ZTH8Tkw(3Vhep8LVTJybf%2==0WL`;Z0s+l*+9toL_<9)) zqmA+*Op%hNf{e{mPJJM?y~?UwhT7`A20K%<`Q^8^7pahm)c5DLL{?jpbF=E=9%d(Z{_8(!0rD~o%Ze>2WP19!=+18?RWqLH)mr^8`yXQ-qm zUob{S<5SP6gfc+_0UNo=?}0!P+Fh-Ta|eh@(k=l%!YeX%R$YJ(E>3x_J0!!)^{4c)x+3A&Z)@2=mkk@=V_Bec0pN{xCCHktoU2R zcRDrjAwxvpdp?!vULwEHJWn-_m!^4ZERGr6j0GN)2;e+h;v=nG!E()sRvoSfKx;BD z5YH1pu)=|1Kn@2j?^`$i3}u4$`rh#*x3X=l-lx*Jdrz_iJ=+*3?M^U~*$NRMor(o7{?qQWf+n~);xxbd>)Z@!l0aaJFD(YRyExST;+m3nX zr2t|_yUfAm$*oAOrJOQI*eEm4t!B?~w#8jW=@j$FO4qQ}(i_2W=p<8u%6rfSIgP`j zLir*i)4fh_zRPA|w_TD;^0OYGS8XNVg)U&bzbMh&vi|J{-OX|LHjv%geDVZ#AeNvE zYg`YXb}`4))|RWOwaf`_2wbkyj`gLaczLx8!wO8R8Vr^_E1uLKjV@%3PEsc$aPL4G zcAg!0^q4hwnInkFu&F%askW3g8|}84W!?gT)YJ(b)y%QkWVCA8$5HjGR(H~A8iZ0I z!$jcmKo{>Uq*jeN5$u|UgRZDo^4?8~MoO3_~ zZqnQ=Do0+w&bvK3Tg|&^cb_zIxMHEmiu9WFin zcM<41&;^_Cv&nw)N66ig?^xQa$k$CL-Qyfq?e)BN_YVR2Of9jGp%tgCTIg1`w)1Jy zeW=eL?=$=?CG_w07DQtDaB-}NXKYQ?(OMa){m}R=;k181jSd9 zdr${IWgM2u^2_p+{$jl+N59hL(;CZNkIO6?Xy3kZ#d+=Q$s^4%8$7~J-qo)bm3^#O z{{U!4yVBfkJoFR+&BHmlye%7KDLBdPn&|AWH5dfe)^D+H3h!+60=Sp7l`gXg&RcD6 ziz)Qt(an{SmpCWZvjhLo{a=H^z8dj^2)sYyEs`KOhDgD0$dGG~*8B;s={Lg1%#Q7_ z8!(=6{?I&wUTl$H+T0jrhFB*~K2k#uQIT8vL->Z)j%IB7#l$E}qAJ!;hA$YF;nbH9b1hPt+z?g4-b!CC=E4>#- z)U-i$V{q@PhsTfx;A8axMt>T_(L7VGcw_BwX|dbM6~OZ37ZH=d&rV0LLy_%37&a2m z8;O+siPV3!QcE;XD+%N(3FVJC_pYx)5P8wwUqT)TNNEvA2folf={!~aov!LXZ_@PC zu!=Pb6>tM%ox~0W04}te9*&URXxgB^X_QH`7%0Pn2_E&OFT}qS-Dz;a7089QnBQtH zN{%~%bB^`RKZW&aG=J?_R5C_J<^CWKdXvMGL#AKHcXe*JP^)e+w?jY_;kCD!V@5t( zy9LSjJd<6Xso;My@vXEM`%*^^<{l`pU#Dr;T8x6;(%tSPegdG$=fBd6t9!jB=4&haceb7!21o1jbRhI2+*XB+_O0RT z@YYj#Q(Lw&IRuWN`j1gvcCo5x{wue-zt?0o_o#tmScX#ybJsb^%?SaE;a>}BdizNp zp{Wa3+BPWzl08YRO>@FO@Q+^@t#6~h5-UgyXYPU6o|TOmCRo-loxOp`A6o5vFFt`i z{{Y$iNjH&fs@Ug(-kGKaT?1aR(zJ`KT~5s1TwIW2U`8Vq=xgyWMmEstucQg>Q9xy4 zr=I5qxt&wN_PUMouZ3@8yS12(0Ux{eYUTVvqJP3Os7+;caF+~F9noWtYRp61Oovvw zf3RB%M0s+kq>zYC4PVqEpTkCX6<6Ruy7@t8)4R%Q)yt24J z{{Sms?(2*iwSA;%`pnHAhTxV#XC7oEAD9EluReKaw!}G;WK7tN+l4;B&;{*7TGS)H zmr=2u>?U08F)>}M=rR3ytl01GE(6`%$kNRr$#x}+AE~S94AY^xVZDO=-&U^E#l9oH{t`wxpbY;233#5{!`H^@OLe*~g$W;dbA!iP z=zKfjT?fUM_p&|tx420T*yGv)Ex#IZ74a0->2(H~EReq;ljg`C)Bzr^CXF_wa@s;{ zwP(y~I%2V+knU$r2;dI+tM}Sor=|fd?Y!3LPYlb2t)C0{V(VCfeO##fBoFiC;f(-u z@xb%#jyTDf^x8Sku@#{Wz0JG47emRAk&^tA_04wBc#B4|L|E+?&540WV}trrHSKM$ zVUjD`WsRQP(9y3-pZizOjK){WBly3)K&*E%c(Yj=A}fs<-J z6Y&kp8>^dn8_iJQpW-H}*?1FPzM5NjVGtNlvGX{^NS-tC8^$8JxONd^%g-3aO|5wQ zRn(p!#M^9)$01MS%>Z!F+sMW=Vb->!(=KGwiX|WlR(pL;PUQ6Mp?2*SL^AM+ob?;o*K|Eb*tsm?Hyq<4DKM1 zE7mmM1$bp6ywbJn;L<=q$#D_sox|6yc(vHN(e*d5nVKn~V7XF9%Z!edZSUUea68L? zv`Hp`Gapm4i%rxX*3N&nM+qvDe|<;sS4fr@8e}#XTCJzabUeuU&OrXPR>w<|QoN4R z(N}vMAV1zcsdb%4Skan28(ID1SwG4N&fNAM)C}qTOL5_SO2Px7>5XZ585xl9Hundf zb6$B1JXZoW`AVD|dRKR&>beNCdG76A=5=K%q=0|}&V6e4h_zn^>WKu}cAq7r_Uc0f zRaGOlNaW+x&;|H>EoUc&W7d-K2r`VJ#!gN)=erL|#MeA0eWpm45rKDYbB2OM$y1-h zgUxYLtK2^8f00wFbAF*3?sYQ8pI1eI`&gSHUCQr;g2%s*O=Ply>V#CB2 zv0m9*7@eZTlb_VWRv8EJTTqwUVn7* zOQ^lehCXX&kU$?mC<6VyudCZzNv1_{C)p$iF_tBL#t%XCuGdr1^qmhtwvu^TT~kp+ znmxQMah`g9IQOnCU}}4ShdqEG>48&aDAdhC4_OX$@I-{O!`m62@_6uzQKQQ z69`V=%Oa`3OmTz%0N19F9!I8WSGtjo*H4Y7o?+2PBOT3kT7QB3M|BP4kwO+*E*V|6 z?qStOsqfAQy=2(Ws`zVEl3Q6m&v9!b#Keq@jBXtWHMrg|){UI@cDE)Jx@KuG0W4T^ z$sA|BAUS(YR{F-|O>Xi-DdWsWAc5R*TK6{E*0je_D=ho4uQAESJxyiBqTNZhSQNO% zP6rt8Q%B-GZ%ne2N41=#tk0JLc_+9O0V;i>)^qk}D$CTVDt|FlK$dHQ327XhlhmKa ztNp2(BEWM}T)}f_Bi|du_Y1iRQoEPiHJ}MCs=ST75W^nWs``PJ#^vnbkxN2w%sqP6 zjh()$r$uS2No?s9t{yogA1gARKU(U%QK)EMC9#KBOJ%gx1NlH?-Dti+l5^vKJ(@Xcd4UkO4W*xvoD*@WrcZnx2)d zU-=JWvTSAHS&;B~&N$~3>?@Wv{{Rh74vlN9+emIps1kwCmVN6w)57|WqoiElKo>TD zGwwL!+MN3Csc)v-X|^&CD&P+_o1NcE!%bTGple?>kz8$LQ;ouq%-EQ-sXr)QM;uqL z-0E@bo)3>zmf&7 zv{pz2Zcj{(^Z~<4X1Ql)bC$+y&{x9REuE&DHobny4dg`mXfw~fU-1uu^+%2^O3vOl zwpbO|BVdj)ezoVe)|b~;P(}+Ceh|6HQSCq#^$6qAuOIs=;z<$-H^Te|Tz3R_s9NUc z{&R6Kd7g3$v*ecduT9i^1!?=2hgOZ5(B%#Q59`HwiHhdNM{_953|9j?SdQX=Jr7TB z1WBfUW$O`36~~xl6Dss?LG503B$2~)DY(0{XBTi9F(9$1FtToaDRzAK^d z*|5927MhjU*{wp7SoPzuHP&ewpM`XV)KcyycMK0xgHr%FLC3z`=-O?^hGN#Om@U_vvRIVlMy>Zj z_2@r3;h>Q%ro(>?W(9l5r?t6~62O>7GN*zosPMjqd_iw5ytip?VO`2(I0mWe-)FtG z4+4d7GD40`a}m2FE)bAacpQRg1JUjLDLnc*Rq=iG}h&zDl0Im~HkIK7QrhTwC zBo0nH;;xmx7Iw4C6UT2jE4X9=!?t_Yj20S9-WoU2>I)vJ1mJlj;Oz9p0B>vl54Ew= zt@VvRR9o9?hX`oZI_|0_ zIc|wnEhLT6M=XAWwE%UOTHco}oRHhtExXG%nY?uX_7x_TqQsZh)9P$3?e0$150AJ{ zCb9JG6I8#{qtar4q~xELPQiI5lIiE3Ml;M^;U+LYhvnmn0O> zVg{8RNB}ohJq<%9ohwKrw}pgkNgQW^Kp8jST+H*h3R#PVQ@|#=+j}cmbo*8^D@^D~ z8R=E0@b&zw9FG$rm<@qNQB z?osyV1dpu%b=rQlEvz%ypoyZHHaH{h)roC%?H^8ChlV@5i=`^7*(-uefM#zm255pi_HUWS6;+b%}ZOc zd2XW8Exd@N`B!&bRvw(CWH2wxO6PB>pbM8*GhE%tf2l}bdHLLG$IvfmIsWE=72V}ZDB6&ZZ8%;C|t2B zqp+{{ZdZ(-O3(5pg5YJoPw!WxN8%3*-}ricFHy2EHMsL&c!>qfgYYEKcYqcuE|V`hhA%%vecT!@g=r@E>%5EZ)mz?dY+|iVcpV<=pfsd9~C9~~YHunz$T3+!H zfpYooMP^T_T;5Fg3_e*H{zjM^1W%yDcV%&GvNh7K-NQIiG7mWQsyY^!_l-8K4F6C56t1s7Y;dpiD4GUV}dMUTcNBwSyAoc;{Iu+SpbreMXS+7)_*>}Ug`@UM$x)3le;niOT1AhGH* z#c~>@uah}8?U>vgk?&b@B-XQqlRrPq2eGdI08PB`@>xwbq71XVMl?kk0Q%4e3#LKm z$kveoxP!^>ir$YzzLFQZh6a^lUz=|=Q~M@kY?qL>&_T{R=hC&bKN9M`8@X1D86lGa z<9?Nx7-vtrn%d_2-Xr8&<8vOz(xaDLy1XfC7%3W{jY9gK^>0+x?{y!v#u&jB%%#j} z_eiXZ5bJnUhfN(Kd0j+!Ck$CbQDnW7q1x`6R^sZLpPP?$Z zYdI9Gia;aW)Rq^zg_Yz|TF6w!cmVN{T333t<<0l@#n&@#;A4%#fFLtpX&13Oqd_X1 zp*$MtJV#@Fsl0w8xx+_u8k`~LE5&Cfr*GnE?q}Doe7PcwnD*nU_O5>0Rl3-g&nqk( zfTy>m05@CGwJkp88E>NUQs8b(_ZY3cD@P|xT}|K1hj7k%6`+Ag&6VW#%YPhYp;NT5^r}|QRykuwWQ%r4&+!jx%np+6blp1L;I}23L6Uvx zwmu?`%TG3NqRA_qD-qJMEg=5W^O)`iED~zUXtNzo-qIBFC7h2hJWvF3+q|jdFk`rI zJ$-6@I_b1g7xrDrkTuT##YyZ5u76n2FZ4Z0zyK`3IuZOq zt3xr8_>S`7X0T`38#d<)-n%I@%>{fcw-!yh@NFb}cds;`O1!aWV4J!YWBfU-yA4)b zDTsVF6oJPW^`HfN4K_Gox=Wq25_c#Sdsp!km;N8J(x%Lp5lTpN{m#`!>rK73`#hHj zQEn5>Qb%J~n?t^nNRL@!1Y5!kbrqSRgz|$5EF%(fNv@|)v6Ekg{I>IE@{}MapQkkq zw})O*lfBY_LpD7HaPxRvLZea9ru`H_MVxkGchD2G)nIrlD^Ro2!Ko z6UKUh+PMj>(eExHwi}eY1S8v}Ph+LL@V)%gstA8yYE3UyZ7Oqc@T8Iqg$JO|dH~&u z+gpwhtgKAHsb08BT`C+8!~gp ztw*hRcJ{^)WRLxD44_a4O``aKzNE4~BaUy~uo07_gnR)Vx^F-tXR-WvI<;vqc~vjz&8g>9vm&jYeyD zZJ-d_TBuNfa!Bi%$t1N^$!l;>f*6d@2U919bvuz~B1DLnO|>$5=e=rO=oXq? z^p;mwgUo?L61_R?Txh-2r%^AO`)#;PAG#^F*DfS^W@7C(Qrw!*4v)k7FYaOU zhz*bSNfnS?9DWENdX?9{b&PoPSA9iygPM&sZWcGp}N-f2C-c~%qBJDfP0z@%Mst*D@4u?cZWQYU)^ojU=^HLv0gA4Jl$%NuB=dyQH_y|8{nR^+Q=@~&Rb%==fAnGAT_@7lNZO)B?H z5zTuMMwK@%PEI{5LqjSkAwqK@+{2pR*Yxc$NoX{g48C+g$Vuq*>wgU0&!fezJc^LX zCeXjcYB$sFUPJa&-Hw>*aX=kq&Hjnt%LUQlfiJG*K+{NYLKYk-;<*=++f}!MIAaJ< zk;i=2HRMwHrYoc|u<8$5?sQA-148iQU5LfTr#lpl5AfrR`vKh0Bb2<;wFqI7NTMZR z3Rr=_2dFf@8aws90wp!Z&s~UaWfz;Kxb?fl5+O+u>OY?;s4{DUdrC4}cNu|Ty z&mh{lzyNokVt98!yVq{Yq=pDkWu3SHR-UT*RgSA3kz;e_+eQbSFZ)N{xto1v_IoF^ z+)*3vD)30F7P>RGz{hJ$!wKBb11>coq-the4ai7|!yczSYbm!~H`*s{#n`hk>T_4M zZ6@y0;#G}V_8bl?G2)&JXx>C*N6%US>vbJsO?EqNHr@dRy`aJ>{o{{%>8x}uA4k## zp{-6*=HwF+=aKal&1h{DS{3f05gv8918M3*cLuYxn@jC}_{3Pq;1Ua-p1@E6uG&Fm zGCi%r+$53j45Jv&Vky2JyoSp0Zl)Ptgbzd3nH9aGYS7v0jj}H_QeR~LFVeI;Q>l1v z?^HJ*B-P0YZ@@MyqGL40x&YB{)8V&=d34aq)Vg$jBS7z@LIhl z2=9DfrYd>rE^H&mxmxDiMG)Jv-$}P&Ct{9s>p&YZc=KJijz;~~`2ZV&{oXjLz8Tdu z2ECukCgOXsv5OpnThgMM!%4PlD~V5u5rf|$y?vaX>j)%TeLw~>>zS6(ttX6 zd@XTvtEQN8vooJCpWz+NQr9hPG>u;3#>QW@q$s~I9ER>IdrsDDA<=HHZYOE=d(u#P zqMr4~CA#e_GG91jp0$`1uUbgrjdrkUGI9l4vbeO4Yj(bjyj)}h&*NP^?}%(KqO{Xy zvk}`{e5~qzX8daftWEXW#izpCC4Hzf$)F8u``tR?2_;xCiW)8aS=O!z&Pk@X4h7R$yVi)&vGyasiOB#n(`4Gs;JC!@{VcP3p!MftXsT#z0i!s z8x#a`&Dd8eVVR~8pe5Yk4(7W%Ukz%X*{Q261=aWiqhRznu6A>AZ+NagSt4)LP>>E5 zEnpcg(4?5?YP7m^u|h87kzdR_4@%V3uG>+DGQ%_f01-8YR^b>&At4u>Re{vcq8mGC zU0cjEMjIZ6xx2-fb1{W8l5#sXRx@kofNc~3iJV` z;mh4B&&`_Q@TNRtsV1>JL4R$iGPa)=kTzid0JU7%No}QHF>(Rtj@7kkeQjxT71Yu1 zjZX@D&;@NbP`I-}xro|5`c{^!s95SN7`BVcV!u0j*3O|Wfv%K$2>!}Mc`H~gX(pc$ zl32H?Uzgs1Dcb3x=F)4%m19^q!Rpl|pOdmfmL*0&sup&aSFw>CY{YdHHK8{06_qz* zf-^u98!O9@Zf&8J;$OVVrvvLt`{yx2nfXn2>*DlH0BD+Zp@TnuT=K;AAY-ZZ%}=9v zk4nhdc)YacN&5dnO2;8seO);j(Dy2A@f-duV48=$K? z^2cn}*N|K+hUH7JUZB@FizU(vhB=pU-Hz0k7S}G2yGC5LRZRd|CTqA=1irGH zOq`J0qd5w3!&SX9JNuYC`&4(?_lo*@RvfyO_0^m<)62Ob$Q*N9-W>5Bq2c1|YKrSJ z;D+cZ0`y)Ll*b*aT7z?N!)PavJxy~L`gHncr7e_;k14QzwXrt0s!wtKr7YWJEyg(8 zRnu5|*yc;Z9i?OQW1NqA0J9y%wa%1bkm0uw2?@`Ms8TvsV~Wpf?T^Kujnfj}J=t>N1NIzyt|{k4ka_Vff-F`JlX5S7CLS~^ax zJ&dH=5SavH9P?Lnty4|Y?w<2hfv$3-FZLzMjrYIWFbfBW`6b#Yy$Xdex0fN^LsM*63YF zFWLb+7w;}TYd|(NiARVpE!NIB?BRwbhB3HfB!QDxb?*yU=vLN|L4IzpXE|Uov=2}R zPI_lG!zJ5fFI-jj)K)na;v2S#0O@=&qUcvw6Rx>-ZPpwRrGjoe_c`h5SbEi#n{B8_ znpMZ2Y7fcR<@V>TP`uP-y}5gt)5|P+D&T)Qv14xc#k{pUQ z8J0;H0E^Vt_N$=k8cfA+qEvQL%eAsUA4;0XQjCzoV(OaJ?x$sGYjmoqYB0M73Hs0mbhk@!bQu?9V}L5u zw)00EbKOLIsYl9Ny;WYjm2m1SQtwf|)GckTZkQPDmkI>{Zg_s*!chmj*Q6|~kdX}X zeRws`>bCapG?Q87pw3Vpp?d>Yw9gM}I+FSD$A}b>xQ;5kHuFn(EMi8H*|vbAIiL(! z736;@S0MiYI_SJXplUh_TS<0-W4cmC)02=gK^?l+K`7BQ$(qP+j%#%SQp5PY2l&+u zTUXTlM|WdnaOFRD3S+Cb23YqdfHHPrtA!da}{v?(mx;!nF69mO|Pv(~liNw1=Sym0l{Fen3@iq=VYy7H;&Gge}@ zbdBa5DI0h=qeKu3$fMLHD{k$XFmYa~r0bp%w^=mltn&$Mqm|u}KpsNNv>}k^CxME* z*VmC+t(TZYTeoAdHPu{Q_)YcCCT-Da?0#Hz7^*%i(yS~57n(ag#g*VJtlb7E0!y{< z%W11`Bg)g`dpi31R#vk~33 zah6+miBZ3W`}$UbC9wH#^8G3)x8^C zwzamqgHeP{_J!Jvc_5DU(`x$Fmb;?Z+Rp0$vO+;ooSxiJ21kT^F&?l?dk4M9!v2e*un?4ubSi2ilR*v`@1piWSA72f{TL;9u?K+(r+%*ZI0DRB%kG1ygh5AE}wOEd3aV> zllO6s^l5$}n$OOLT(z~x!yz;Q$ykN7ecJ;SInQ1z&`zzOHjjNJ>^twKU6BAd108ES zQ?>BV*_M4icUj~EbY`(M#fB@<_QfprnIl*PZnD=wy7Pr*w<`vjteipy?ON3(%ZM$?iGnwBWdSt0B*O4E-rMR z?8i;+^6o5p^Uzg&O2+2G6AjWB+<-v()k~XsbnC#6#DE6D_N!X{uXC(ji_4}NR0;s; z#Q<;VUK5*9(r+)Ml~GnN-GX|st~XE7@2@Xox3-AL>^cu>y#@8ewu=(GDk5Y9f*B-+t`v)I=`VdE`A zSZC92rUfQf1QF4VV0e>8y3?e$^N1qiC6EEsVt^z60ECZKj?N1!DLjav&nj?OvF9ea zx0XoUGqG~yl25%({{ZplpS$x_bW=XiI*zmfYA9MoH!H&D6|be)o9oDJ6_p-mR0Yly zXVlW^+AY=gVv0qLQA?7?1B%8he$W+PDxY?MI&Eu1zS1w6()(y-0f9!yV0s@>_|%$6 zvRlaB@e9Us4iD>4$!~k9$tBoXWY|7tAd$ztL2q=HcW}uxOFG6?$}r)Sbrb;G!)#)B zE&g585~TJOso~ELTWV5YPkAoXwSdR~INZXM#Jc64xn~p>dTLmh+_59Sks83vGKfwyv~!x`t*pH3 zsBDa(QG%{dVtRC_ZxZ`M)TFnDR*vE(WG;sp9Zo0#z8BRmG`|o#1Xh+k@eJ}ZM{2LA z>5#`K@0dw7$!0h`7@C673^Oc&z-3}{o=X~8p^{6?FfAr{=e+=L_-{|Kjm$TgSy_Ng z^cn9^YySYc)PBhvivCVlDl!dGx{B~lprPD)0oOH7*fdv(CERD_Zb9lz03x%PS($-U zKdp9N6SLR#w4TPs?VyS^B#hu1s~(ze=aSw;+Gacj9qKc_tkg zS39Qor&`tEHgL}3*#QPI_e}(yw}<}#urH;O+gX1l3Ve<|Yi7s7FwbjyBsWVUq-@Gq z^T$f_>v$x5`ANL(;2zZ*YFC!3cRLLHm{Y-^4cW9i`^#f>0xrZ=-rq{jx3!Q??!)Db zQ|Q6wP(dp=$E>(r-z{e00QAb0J%KlHHWEb)9IJ5VRE}#0te}u3m~++n$C2U zSg8Px4m#Ajt8KQn!)|@NpM2HLGfleIF2${kMnVSWBciTxlSzH1N%py|;te2!&}8G- z0YJ(YvtK=ww#v>zeC!7!6|rXeEw+;L>Kmk+aPrgG)vXU!O(AZHfKL^~EfL+=*Bv7} z?a9tK$Dp80y{X4*vOCBI6lWvTHLarf!(Xz~1%<5sR3(luImgzzJp;ke>v}fF)KWRz zmss)62d#1UR_54wF_jA*;h%756pujB_00-`M6%%dZh1V{FR$n+r)cnNo^Dd= zLL**;VzqSN4MC~saop+GYc0^pXu4nu*6dD<8 ze>85$zi^yXQ(J&M<=`IG)$95MeivIZWuHHZEa$X z)me%2WEt8ERv2e1q<8vrI1!4G_(tR&ime8iu1LPp` zMO(CsRn#oS{OI#q+l{;1qMu3tk{>?87%q3J$o!6dE1=ai9Z$tqcKL^VvBj|xK1+L= z;$*YEj#g=ta+TbNJON!lguF*Sl5QopL}}%ZYLnGX0CV@Yb68xhrN{zdl2m^Q6>=?D z#cpASC01{|*vYIr`R^vXeL~@jG>3B&>T9Ubb+yy9`@3Uiml9pB)Mgy1Gy%-a364f! zcIO<5ZL&uoR0m@BKD8ah_Y+U{M{Je+t7#3OvK~}pcy15#pbIuSYhA|d4%pKC6JIE{{SIC9>=C@-Wj#hCJA81<&yz`&QJ8OE4pDN z*+Cw_#9(!;%{t=B(k6R}h{CW{9;4Q>Qtn687USgv4c$2Qpb3tg$-X(2m7O=KBL|Ak z({*LFnIV(sQgT7*kzKX+vwy8xLS&5xl^ZTpb6hNXV+nV+L+d~tg!cCG=<(l5N0~H- zX!fk=w3+6$o>+zz2I74MM{#p2+Qk@dAQ%+eU0P_Nn$SK~_#@VUAd2c#nkBVjBt_WsTuTrq%M8FAb3ha>Vq{V~yeOKoMQ+*!4f&olkmiTS>{G=s+eFtA3J%Kd_jZb1-qA6`GLaI)ImT1;X; zFc|@dO7tHG_|skR*=TKiscl_@NRFpD_8^Q`j(QBgY4K~tF(>*&R=0b^xU6Fe3H0`@O=jXPXIH$`W&$6yNMB<8)E$Rxlib%s;rlO#KVx^-FXW2< z0C&h&a8(_L1DyMs0OIt0QvU!)zgx>W3{yn;LRaP8=zT%1uf%>SpTyTOUS3r)3wB0}t`0y`-n!jG zOw+tSr&(&+Ua99!9}I{`4NtQ1JbI1W+xUUm z9~Agj>qXV>H0y>AkpRV`?~&5IBT|FI`ep3b8XT;+Tp``-SoU_BaS`9^mo8$R@W*yo z&WL9-qn@g<_%Tjc$o zK)*b0$NSkB6*jB!8he@6>Kz{1-et~Ybq?o0QC@j{s5Yf>E~3B*WNeUw1Mr~C>NP(G zww-XVeR&*Fu=F_~{VOc$?WI8{_E{*-r9_BGBv(HsrE_!>&t_&`21z|WwPhoF$snj77>wi&^+xK>TX*{+ z#ULY`6)TZlG+rIof3wB;u$%0-`}pG?v;lL$nvR{MY6AZNRkbrh;Kmd#cIT<3@m`(b zm@|Lj>&2EUvR}z=u`#Px5%^8KDJo4m+iLJi8A}!M?c&?mTbY>?a~;3{zPTiI>0O?Ks%RFLr%v$}n#1>uvM?VsZST69;%i?yBu$5B z3^~qnXaj@3)HSQ?c&+ZQo_lD{RUDEAD!rxDkd`~LJBsx08EXC&)C@NoRhhS*Kum-H zyc~5^IQ(mzhs1h(dR69>+G@;hl|W(vDn@zF<3JmlUaz9*f(y|TOK}?=+2~DfYd$|| z=d`=hB3PtFJAobR$>xyAh?v@|>C~FHrNwP=dG=|G40Il*fI9tm#kN|i!z6lITHmvf z@+Se*k4m6CMX%}6t)v&S!))gpI^l89R%BNrMAl=LOJO40NE>6EgO5UL+>L$W?R{1= z95P)?gvZK>`E{TQI)TpMGcX1`fynLu*oK{V&li*v$BO;6YbOy?_7qdW2I{kYafQ}4Y5SqBNOvG z`t>vcOHb2nE}*$VDKl^p6?tRrT>aI7hT)=>WQC(75sjzuuC(bo*Ml!@E^d)Tjfqi1 zWSn}^YL}OuGSnoyx!DZ3`4KqIJ$+~a>EP{dZ3#6UKHV-Y%N8Xc=Kyskxl34OH%y8d zqa8*vGCNl7t=;~YaP}*AG*-ockR$w_`L2^z@m`5(X4*%E?Z4NN=G;g=X7$@Z8WuKR z4(_z%v(+x%%KlH|EODPe22&qVpL*j*hd$D>oh8lc#m40r9e6&~hpD&A9>p7o;}v5` zzPPZkxq!@JTZ{+Ca5Km2Kph{8`~|7#Ru=S*0 zMZw#*sjpJ-w~g-fiBnIVMb4KgA<>5KmAaMp_U~1^OW_37X1djUHEd+lPzJ~wLf~?| z^~YKSMEZI0I<~M-D#jIBRye@*HPG4VJ_yp{7rK_Dbp=Hwk|CV8rFqqa8kV4mqFDwh za6s4&12<|fw7cCNNi4Mp3{%FyU~`{LVu788sG44xEtb9EDP1F-i3uso#KX6K57gHi zd1tElruOdgK-136y^4-8>5kPLd)bi)J4fl7*3vvpsc2eH&w zfJ7n-i&Cx#IU;~PYs0s?XM?U@(^iaqp6~Zku^WJ8>6JX~KTk^H*GSW~9~Lg1rk}Ie z&vA(GIaM`4-|Nk?@-a~bldw-x{bL7=WG`tcxC6YxSYV%Aam{l=Ekf$!&dW&b0cLvabe|pTS_QY*?8GRfj-xaPmqGAu zzo}}TUCc%Ve6eY>)P5PP?-5w)+D@eURr`#^g1bKJDdgKPKHl*HjoPm^l9ccLR)mHN?KFdt?oz ztj`iT%kAJ3>0JoZmrK*4zWY&SKGy!u`@jd?lisP}8^;S7;qbONVENfwWAR^Nu)nmVnyu~G=C*~Ng z15cH#W%H#1Kmkw)$Kzesg!L^0?b1HH#6}|}S3GVs0YgFY4flp`&CQ`#jns)1xyY$C zuNq%!(0!NeP{NMo%f`4gYQo0uyKL4(bK{<&f0#p6I>&v1d4f6_+o%O z{t08)Qyd!Zwciv=uIV~$q_L_`WKQQ(fWsR`2h*)_x`JB8EQ??p?CBv`_Yat$=uf$; zwpPU`FBSGe8-)`lhjSXf(O*nXMvVQZvvWYF#eT^$X>Nq*&B#W0S{P z^y|$}!8f{Lv^FwZ-?D`BLV^MH&UyT+f$@ih+d4;?x5^`J$q zQdG9Txwg|C!o+r#R@;y};;|sRcw~^fb0$8#)S7mkb2drk+llMgaaov1A$l09nldT8mHA z?X6Vpm?iU(=TJYd0JRt!Zc;h(w=~H;-c{muyvh6 zeMZ99?9mj!RU;(&`cAEmz?(}7GVS1#pANgY-{v36y9v;>FJ#Qo0YSx}@tmDdJ zp!|e&Z(0E0EoGN;Zfx!xb6p+Qm3acRa$B;1p~m1>a-QQg7O4iBm(%|MVL3L)aS>p8 z53VcIH2(k_+G>q!rFfDE(%wW7JelCOINW-LCV)9l2za_54cc5ztS(03UMtc)Z z)U7-@uEz^QC)lp$`J6U3mOSuk?S_}&$hF(}H3?Vjkp}Wywm~0XTFlaPJ8uzPO9r2K zs26vWzaKaq0H6*k_RK`-3=Sm`u?>U#t6NmjwH+=SYl-8;7c043;QjzrjbB96beTTS zdv4J3a83?!=xZ9{>hkU4hVEyUI5>@6x(`4o1GDgErKiPwwmP|3?50I2}wuFgyZyZf<=0dPZ#&!e2KZRNT&V5y0Jr*XGNaHfHA4TiWwribO;Xi&ot?OBV z*!X1W6Wu&o%lUTVB1s+i=~ZLD(8i#FAlqP#g5AoBjtQ(S^jYEZx7|AoG3>R@$ceCR z87DnD0YDz0-Yn5IUkgj4YId?Aw;`>(zH(IMa(ear>&w8+#sYlj?^cDnNb$yzE?tIk z?NY&gZ>PMI$q;!601|Kk^`H$84)}6=jb#>cA&JsM&mF6rwwqMZbtJg6ky2Y(ayNI{ zYhksAxMiDmWK}r9#Y-lQsow;;h63p)aX=5$b^TLOyt&p3?YfkCW6SKOm%`cw&apVK zM%y6_yjIIC#D^@*KILOs_=5V@{cqr#%a!sAuN)cx=yi)-A4_|5 zw?1{l1Lo(TVO-%>a{G#@kY=^5t>D!sXl^bBNiUY*=j&6W>H1j)NQCdZpywb^2NJ?X zlx}bc>Fz6b-^E(9TgPIg2qF8R4s%-i-m7P*!*3m~ogJu;g2V3@+THV22lmg2W_g_?yOA;T0h9UEHufGJT})4PJfC8T%Ypn& z?OXbfjqaK`to$)={h4S$`IKePzGwrGiVK@d-IMNySlhYiYE4SPq6X?0F7lj`Mow!A zOS`#cc9o2ddE9#DwXL-~t2B;Zyi=X5GBa8MYfiSdv9ym+zCvV?u&Iu5{qOLu>s7Y! zo}mSsczm$9bGAs%cYRnM0Y25|{{U_N(wWV|0Ppj0!i;-VYV+H>c`dhhzA^MQm>0Z3 z;muD#k$%?+Q7&0datI$!)KwijSB}CdR!eU&q!=s?2>g22plMz;msVKxe-lQMSs?(v zK7VG72PD-= z;&`Mihvv>Xpl3;;_tF3#OUTSIAKoLKr9kRE>x{UzwYk;4#iPV- z7FPK-jobmx&{h`t{Hz1=o}e6#dB?qaPK|jFgbkjdZ7f$3UBSGsO{<=s#(+HDXeLQk z*ds>4uvD)(J*%eEbXct~U>d~D0B^hk_BFG6sA(~3kn1wYmor?GaOgTIJ*%3U?tNPB zOQ~`}C70M50EYg`%Fj@q3t5EL;F67=aa;Z#*FUgj^Kb2i#hjxoj5D8cnr)Ya^?R## zyjWC68W~RG&Ih$&+-mE8cW?IOA7+dy0T|;M=QIHhtPG>s1U|h-+A~WQb1JfqC<%xqTGM%f8^V_{? z++OHnRBbBSPzsekY5pPJfF?0q-&;ud{{UBmz~Zx)w09pMt=KitwyS02<7dp@?N#p@ zYStbjxwgO4qi6y{<+`u~<^-PIdi9_T+Y5HpH3+obIxLCXZ_Ix)^aGPp>Y6R?g{Zx? z<`lvMD=v1jb}CLQnzWko(qx(zF)|Rqrvwquiq*KizttyayqWH0lz>@|PCE(!zaNM- z0d?l@#@?9jE1=Q*Q9b31{4i0Ia7SudDZ=`CmYY_*S!~3nvyCegE zyc{-2=CgEroj&9ynX9uZV_<*z=Cw~y8eNs#wwi3_;s}oqj<}!-S68<|yvZ<(>Bt?A zrC+ktrBz5}Z!#4i?9T$M=~||YHK=Yi3tjf82x00^O3J*BB$|0`6J$=z$UE)ypbodh zdemMg)okOmu<}K?^3eBf)o#=I)*p^cBJs+mKrUa_=ZPW?=V&vPhxr+ z=4RLRdzZMHOP3PJa>Y&u(xTuxJB?dG)EWs2nJpg-rYC>e>*>tQmuHGg=-b(Cuumgt}eA-9d7p*Bq7g6_VN}qjP61@<*6$ zh!P%{&w2pw+SkHb&DFzQ%Fs!0K|sEyxZ4{&D$m3*M|exyLgY4oixrAwG2O=^aIxU$ z=})+d>M<6jA|ER7vmy1zTF?tme+8bgHO-2KiaCoYZtLk?C7N9Ly7oxIMH`X1Kp+4s zk7HwX8%gEuWEuYe>r=;{r%MxsXiSJ1MsRUJ7d1Z#>bgX5UtOw%x_^`dl76+*S$IHd z+C}48uorOQfIWERisyA75#7(HSlUe9VYG7p09vfN#q5){%rd$(gC8dVgW9tJJUyr` zm#ie0uy2HxS5wcisIET6E!^{3#AAp)WB&kUYIwA}sOBbBD(}LB*Cv)P^c%UB?KkWg zVd!WBYRkkjTIjOruMm<6TX$N~@crk9ZXwjIbr?}h@qC1er>tD)`i_rdX`{f=%^rNi zjAT~<7`P9&2P#PGjEc|=3mcg&_iO;}Ly&vc&-^4;?Ryo|VmG%WMS%V?Md zdYsg|HCZ(CWf7D>>S+w}AL*8U5X6;#{UA>P`wYk7Bz`=q8!S&5% zW@X#n+-aJ^eW^=%Yy*Sa9jkLtyoXxU@>Ol&f4T?rtPO7AukWs}EYQZYKK2K-R!Lr1 z;Vejz1~~Mf4Xt-Uy3v^-ka>~Hf#c_>HPT7p=d#o7ZXS5s&tJL^Do;wslkIxUFvfRE z@TS$l&H%1%`YlgRjhgXYWa^ncK=iEu=r#R5(#C6hYgzol(T0~DkELSXTPqT6mxTk0 zyWy)DHG8&sBnUB*&Dd8_XC1DI_T57IF><90aR7R?0C9SCh18NUWgvmNv_8o!mZss9 zsyW&i^xal1yhu{jk>Lu=rE}k!>NJgZ+FuR-0AWpTBqfg4J#tT4%+T|@TS+vv#_!%c zWNqzTOKUessd0Er$r4}&>}w|C&Emggxc%5y0f%rasBK3=ihHYQZT`@bL*;_s-u0jc z3tMew+wIYSjS;~F@ruG-I%}KOw6~1AX9FE87AfV9+@X-7_fUF~T_u*ib7g0XAQk2~ z-P}-SXKI>U+C|8+xWcmx*HP!_Iu)D}S`V~cy7QikSd&L_si4&7CBz_&$Gu_QLoKBH zEr_aslTxF1deUHkkrj+ZgU*;oScK7d3v{Plr*`)%5k- zI-HPCHG2C^()4><1k^v$B$>Cm1IQkgas!vs^)U{ObEb#`HN%GUJBr)Y^bI=KMYGjx zZam_|30L@mu76b2Ebes~Cb75sHNJ4E^sBZPD{~VGE0<(3_uJaDbzN&y@g4EG)Ep28%7gAN;YsDR7D^{g&gUSWpM?NeyVve+w3s|U zWf`}E9nT>L=8=icPoN%^o2OXKG}wQ;)RR^0q*SK{4+gcbL#4GcT$%hg2RGYF9GMLzY@Y1+lzlO@ClGBWTzD+1;Qz6fE9ZzL!^ zKsBwV>GumK+Aa}+*#dQOXRWJ-;VXCr|OXD_ep&5 z34Ei%9_F+p)@^QNxV)Y%uPMl1Ls^-erN+-WBaI1}`j1MQTN}bcy7V3D84Qnf(}D9J zO6YV=H&E7ZnhgA^zcUlSA6fv#w6%Cxwt3BHBiyUC$dKkfN40t#uZTP)pjdfJZf~xK z4f2D})bIsyZLizh-A_2PScK>94nqAntql%q`&RyG^CabqlahO8x|yxhRL~i41h!;+ z=c&zeT8wtha3r--3uNu|#VxL*BrPOtbG#3iw-f?I+}~TE+?Zx#)RwGBB$6VR1p*X2Wq7D%x|TNkJCn7D$Q*R8${F<3v`8;t z^B5fPalxPrT`yL=j_PSG=V;l-%vYhSx5reth+W(X3NZOe{wmVdw5hbmh2>R=CQ&3{ ze-QMhYyK*^)nc}^h9L|#%Y{+Ynheff@63zHcL!q(S5u`6FG-t9H`=x6fV%`m z9Fy;gsb`^H>KhW)+DDC7JBL6$O>@k$#dJPXu^pH36+EVfh0TO7apb`#%E#|}S6_dl zTKHd0)9>E#j;72WIEFTyj=1ZA>s;*c#;Fvdb@OEY58|w;W18-EySpWu7+mv(9S5~E ziII5g`kAhudb(eQtN@==xLMgF-XlZ& zRp(al%d1UsERvR)ftA>f4n6BJCt~b359?gs zse0OmwJr6iD3UQ?r>1dM(OTj^Eh8*(leBO#Qt0=#x^2|bO>5`2!oN3c_r+15{U++# z+GdjZHN{5}s?L&1mkSU81VQ`0L}kt@osH0G1WIxU z!96jG0M&hOQjblSNl600&7GpJXtp+2*J}=;Ka#l4YNn}W8p^+AP8+E;4Zex0&VuR` z$^(LHFf?xNEWE*Q8U`qKjMbFzcA=}=vstKBMJzXZt!c-k*=R`}?yPr6c@g{8L-@;8 zhD_U$5@CQ<^lAX-B7^M6B@7F{1xIS^G&|^Zcz?2W2^K#naK^c99%O>>q|u2Csz4{! zvf4YFTZY~?vXV$1m7pC8-dt(da>HdI!;&+O#;Ya1pEMV9UR;!wNFaKex1>#NdvhJN z$O;{oEZ&{!KNUk|4zqC%o&mQQ!5z&2MP#!qO)^KiGsa1(m$J!jqDTQN>OE^~!uR%G zdTIKFvs^^oaC!>Q@dd?`YIhN75frq5a1X5jXj$qL&1WL-2-3#MxC~c0Wosw=dqQvs z`Iww@QdxY~-h8TdvlYM?!LG{7O18T2-No&UyRRc~8ZvNkKoMMcGg`LOE-xgGF%rkU zWG{@9+ZD%Y5-c<3;WH2!ZMZ#p)vaFVQ%HuLb#XV9kbJgo03OwUO8X1JaRu4=od`j< z1QFAk0N!5_cvUUMo|mRbE&=98z~;5IFA~_=Tp#TiOy&`ofEmMAlSK{8H=)WFKn8F+ zS9yJ-v=Lk1*f*MQla=aKzLWt|RPh$Ct4!CETrglx#Z$B@p1=y`;GInVcB2`UIpaL@ z?_Fkx;B8-1jo#{2v5F@eq_kU!4wl41r{yNHC!XT&M!1?rnZn=`*iZ+j*!XhF+ewdG z@f7A5G77}FEZ)__>Th8+>s@KlG*+(PF7Bh=t4Vn81W`>RO5H-7kSgpmM|m7JcF3(O z{q8xS36oGTw0=tx6P$J;q1AO;y=v|v5Jak*KvA61-)VAMNFtf|Wyk~4x@`}|R$5J* zI(PPBODaBm=EvQj4k}dp1@Vq`#ELM=dskPlY1%UAmJe$%dx!a?0Q9U66>8CH`rOyC z!edwYN4_eJq!%|NBr)!CI3CrQ9S)P>T|-gRCA@@UIGefZDoMOGs7q&Yc@l+!0fwx| zrqu1f(4vw=55~}NGgHNTdjU2RO5tQUWzPnHIc#ivS7YJ-00!#X{Bn7ChB$}beDY7F zX-lDLT0M{Uj;kqKnZRfw9dLh$ipWi7`C@BmZls1ONZhK#WLAJu*EDD}yT7r;D4Jzo zoz&z5=qh-0?KLzO)Fqso)sQY|$LNIpi8Np7uKJ~yxWQDTH z_l8DCulUdf+jaBj5&31^#~>Wlh;@xeOBWh_g9V0D^MW&)mqXXZo!-=e726=W9V?~O z^nEtk!VPL$rCDy6;yM7}{?#+(%K?CL1$6!#@l?7rQrws$mB~Mw_VISP3nmDh#|aBQycO z;q6uxypUc<&kTslK|T9cT$2F|sF9DDki2&7OD(Ldzi3xbTd4ya*5;Y1X?9Vlys|eE zhgRL5!hka^JUy!1;ca4RUGPBmHMf7^T}Mr_YpLScQG(+my;HvNMa9OgHl?SAw2$tp ztw9#Ka>&Ve(oQ9AcOLWsTF+9|qT6e4Gpr!*DyIWA+sEU}ohL?H8(1UzL1Gcfz{gTb z^(Q{{$wF;~#A$UKG#~QNecX=Y@~y8DYCaafvP&HoN%CZjg0q!WE9=NC&5_4637nn8 z_nOSccLr(h922o}NvhXz>RNT;s{?N&L=p+ZRsAPjy71M}xU*GuW5{lCTAKc=qiVJb zd;^_YcFVaRC=?8-4YiK9_M6RG{f*0!joo411F$&V*P83B zHCeAL?XtO%yJZV0-qFDcSOZ(q`HmAZ)yP3@g|RdrK(RZ z)Q)fpY&kWLY}abOXm(Ac0CT{r4(%?;ZrPZrz}$0;dRL|Cad;Xn5VoL?GtB&`Cm@eX z0OxG}Ao!vv#0`5HE z)-J1KE}5%KYGn@4kQfd?GzE^|PMg739w0L6HiTQqxC@Mc$GZXAuzXD?hvd6w@YS-je5d=%M0zf% zd7w?KT3i1Bqrtzb=}v+61(yO6st$}>P2))SAj zW6`UyI*Mvy*2!X9dw5q2N8Tj&%|m10jZ$p@>aZYoXKW`zBV6T){5n6vmrTxtUGlw7W(DW1I@~y*<1e9n^AOyt77BZ(=bRe|&TL)xCGa z+C|*!d*S&*MIsW)GF4A(AL&3GbLh~|pvQQVubCXCGar0<)^O5oEs<6`fbtHapQz~C zrkiM&b41H;BXHT^n#Ht@jnKwUSRBv>sFLY7#{pniZ8-EjYLr@Z*6^FgiHs`yH{k8h z*P6GfYH~iL?{1+J{hI67#LAu*xzQTe%z2wTvM>Q4{(NG9Ahq$9p=GC?GS)D$IAFwp zNyx=>cktV^P)l#Se%-Qes13Ejwz$1^{oEh|ea(6|g0)W%zL#;OYihBy#fr0xc+PfjT`YbVxqwXj(hBJMyZu&D3vZ7oa11dL!-DvUn!RtAxF z&v>(fR}6U^9MCg=#I};@7q6#V$Rv^m0LVHT)3Lj^ztX{{VWbUh7C5rm>4; z(l+3KxI0#DqS@VQasL2mF-vBB%vaX5@AU05Nvx))jIcS|*pXRKW^1BRK2E=dYw7Swbt8*#N$3VUPzHtOtRtOntzEv-!A~6{ zKGoPSi|w_$7t?%0A`sL*mIqNN&Kz(LtpGDq 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%0DeMUQr2>i#4v`VM@ozJ}hbFg^w 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�geJc~}$Ew|f1vIJp=E7NONd#Lzo&f3l! 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%0DAl=D0 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